[
  {
    "path": ".gitignore",
    "content": "build\n*.spv\n*.exe\n*.ilk\n*.pdb"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.0)\nset(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} \"${CMAKE_SOURCE_DIR}/cmake\")\n\nproject(cis565_vulkan_cloud_rendering)\n\nOPTION(USE_D2D_WSI \"Build the project using Direct to Display swapchain\" OFF)\n\nfind_package(Vulkan REQUIRED)\n\nset(GLM_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/glm)\n# set(GLFW_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/GLFW/include)\n\nIF(WIN32)\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_WIN32_KHR\")\nELSE(WIN32)\n  find_package(Threads REQUIRED)\nIF(USE_D2D_WSI)\n  MESSAGE(\"Using direct to display extension...\")\n  add_definitions(-D_DIRECT2DISPLAY)\nELSE(USE_D2D_WSI)\n    find_package(XCB REQUIRED)\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_XCB_KHR\")\nENDIF(USE_D2D_WSI)\n  # Todo : android?\nENDIF(WIN32)\n\n# Set preprocessor defines\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -DNOMINMAX -D_USE_MATH_DEFINES\")\n\nadd_definitions(-D_CRT_SECURE_NO_WARNINGS)\nadd_definitions(-std=c++11)\n\n# Enable the creation of folders for Visual Studio projects\nset_property(GLOBAL PROPERTY USE_FOLDERS ON)\n\nfunction(ExternalTarget folder target)\n  set_property(TARGET ${target} PROPERTY FOLDER ${folder})\nendfunction(ExternalTarget)\n\nfunction(InternalTarget folder target)\n  ExternalTarget(\"${folder}\" ${target})\n  if (MSVC)\n    get_target_property(targetSources ${target} SOURCES)\n    foreach(sourceFile IN ITEMS ${targetSources})\n        if (IS_ABSOLUTE \"${sourceFile}\")\n          file(RELATIVE_PATH sourceFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${sourceFile}\")\n        endif()\n        get_filename_component(sourceDir \"${sourceFile}\" PATH)\n        string(REPLACE \"/\" \"\\\\\" sourceDir \"${sourceDir}\")\n        source_group(\"${sourceDir}\" FILES \"${sourceFile}\")\n    endforeach()\n  endif()\nendfunction(InternalTarget)\n\n# Compiler specific stuff\nIF(MSVC)\n  SET(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /EHsc\")\nENDIF(MSVC)\n\nIF(WIN32)\n  # Nothing here (yet)\nELSE(WIN32)\n  link_libraries(${XCB_LIBRARIES} ${VULKAN_LIB})\nENDIF(WIN32)\n\nset(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_SOURCE_DIR}/bin/\")\n\nadd_subdirectory(external)\nadd_subdirectory(src)"
  },
  {
    "path": "INSTRUCTION.md",
    "content": "# Meteoros Getting Started: Instructions\n\n**The following will be required for the operation and/or development of the program:**\n\n- An NVIDIA graphics card. Any card with Compute Capability 2.0 (sm_20) or greater will work. Check your GPU in this [compatibility table](https://developer.nvidia.com/cuda-gpus). \n- Vulkan 1.0.61\n- Visual Studio 2015\n- CMake\n- Git (optional)\n\n\n## Step 1: Setting up your development environment\n\n### Windows\n\n1. Make sure you are running Windows 7/8/10 and that your NVIDIA drivers are up-to-date\n2. Install Visual Studio 2015\n\t* 2012/2013 will also work, if you already have one installed. \n\t* 2010 doesn't work because glfw only supports 32-bit binaries for vc2010. **We don't provide libraries for Win32**\n\t* You need C++ support. None of the optional components are necessary.\n3. Install Vulkan 1.0.61 or higher\n\t* Download Vulkan [here](https://www.khronos.org/vulkan/). Please note that Vulkan runs on Windows and Linux machines **only**. \n\t* Make sure to run the downloaded installed as administrator so that the installer can set the appropriate environment variables for you.\n\t* To check that Vulkan is ready for use, go to your Vulkan SDK directory (C:/VulkanSDK/ unless otherwise specified) and run the cube.exe example within the Bin directory. IF you see a rotating gray cube with the LunarG logo, then you are all set!\n\t* If not, you may need to make sure your GPU driver supports Vulkan. If need be, download and install a [Vulkan driver](https://developer.nvidia.com/vulkan-driver) from NVIDIA's website.\n4. Install [CMake]()\n\t* Windows binaries are under \"Binary distributions\"\n5. Install [Git]()\n\t* Only necessary if you are forking this repository, **not** if you're downloading the project\n\n\n### Linux\n\n1. Install Vulkan 1.0.61\n\t* Download Vulkan [here](https://www.khronos.org/vulkan/). Please note that Vulkan runs on Windows and Linux machines **only**. \n\t* Make sure to run the downloaded installed as administrator so that the installer can set the appropriate environment variables for you.\n\t* To check that Vulkan is ready for use, go to your Vulkan SDK directory (C:/VulkanSDK/ unless otherwise specified) and run the cube.exe example within the Bin directory. IF you see a rotating gray cube with the LunarG logo, then you are all set!\n\t* If not, you may need to make sure your GPU driver supports Vulkan. If need be, download and install a [Vulkan driver](https://developer.nvidia.com/vulkan-driver) from NVIDIA's website.\n2. Install Git (`apt-get install git` on Debian/Ubuntu)\n3. Install CMake (`apt-get install cmake` on Debian/Ubuntu)\n\n\n\n## Step 2: Fork or download the code\n\n1. Use GitHub to fork this repository into your own GitHub account.\n2. If you haven't used Git, you'll need to set up a few things.\n   * On Windows: In order to use Git commands, you can use Git Bash. You can right-click in a folder and open Git Bash there.\n   * On Linux: Open a terminal.\n   * Configure git with some basic options by running these commands:\n     * `git config --global push.default simple`\n     * `git config --global user.name \"YOUR NAME\"`\n     * `git config --global user.email \"GITHUB_USER@users.noreply.github.com\"`\n     * (Or, you can use your own address, but remember that it will be public!)\n3. Clone from GitHub onto your machine:\n   * Navigate to the directory where you want to keep your files, then clone your fork.\n     * `git clone` the clone URL from your GitHub fork homepage.\n\n* [How to use GitHub](https://guides.github.com/activities/hello-world/)\n* [How to use Git](http://git-scm.com/docs/gittutorial)\n\n\n## Step 3: Build and run\n\n* `src/` contains the source code.\n* `external/` contains the binaries and headers for GLFW, glm, tiny_obj, and stb_image.\n\n**CMake note:** Do not change any build settings or add any files to your project directly in Visual Studio. Instead, edit the `src/CMakeLists.txt` file. Any files you add that is outside the `src/Cloudscapes` directory must be added here. If you edit it, just rebuild your VS project to make it update itself.\n\n\n### Windows [EDIT]\n\n1. In Git Bash, navigate to your cloned project directory.\n2. Create a `build` directory: `mkdir build`\n   \t* (This \"out-of-source\" build makes it easy to delete the `build` directory and try again if something goes wrong with the configuration.)\n3. Navigate into that directory: `cd build`\n4. Open the CMake GUI to configure the project:\n   \t* `cmake-gui ..` or `\"C:\\Program Files (x86)\\cmake\\bin\\cmake-gui.exe\" ..`\n   \t\t* Don't forget the `..` part!\n   \t* Make sure that the \"Source\" directory is like `.../Meteoros`.\n   \t* Click *Configure*.  Select your version of Visual Studio, Win64. (**NOTE:** you must use Win64, as we don't provide libraries for Win32.)\n   \t* If you see an error like .................., \n   * Click *Generate*.\n5. If generation was successful, there should now be a Visual Studio solution (`.sln`) file in the `build` directory that you just created. Open this (from the command line: `explorer *.sln`)\n6. Build. (Note that there are Debug and Release configuration options.)\n7. Run. Make sure you run the `Cloudscapes` target (not `ALL_BUILD`) by right-clicking it and selecting \"Set as StartUp Project\".\n\t* If you have switchable graphics (NVIDIA Optimus), you may need to force your program to run with only the NVIDIA card. In NVIDIA Control Panel, under \"Manage 3D Settings,\" set \"Multi-display/Mixed GPU acceleration\" to \"Single display performance mode\".\n\n### Linux [EDIT]\n\n1. *File->Import...->General->Existing Projects Into Workspace*.\n   * Select the Project 0 repository as the *root directory*.\n3. Select the *Meteoros* project in the Project Explorer. Right click the project. Select *Build Project*.\n   * For later use, note that you can select various Debug and Release build\n     configurations under *Project->Build Configurations->Set Active...*.\n4. If you see an error like ........................,\n   * Click *Configure*, then *Generate*.\n5. Right click and *Refresh* the project.\n6. From the *Run* menu, *Run*. Select \"Local C/C++ Application\" and the `Meteoros` binary.\n\n\n\n**Note:** \n\nWhile developing, you will want to keep validation layers enabled so that error checking is turned on. The project is set up such that when you are in debug mode, validation layers are enabled, and when you are in release mode, validation layers are disabled. After building the code, you should be able to run the project without any errors. Two windows will open -  one will either be blank or show errors if any (if you're running in debug mode), the other (pending no errors) will show the clouds with a sun and sky background above an ocean-like gradient.\n\n\n\n\n## Other Notes\n\n* Compile GLSL shaders into SPIR-V bytecode:\n* **Windows ONLY** Create a compile.bat file with the following contents:\n\n```\nC:/VulkanSDK/1.0.17.0/Bin32/glslangValidator.exe -V shader.vert\nC:/VulkanSDK/1.0.17.0/Bin32/glslangValidator.exe -V shader.frag\npause\n```\nNote: Replace the path to glslangValidator.exe with the path to where you installed the Vulkan SDK. Double click the file to run it.\n\n\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Aman Sachan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Meteoros\n\n![](/images/READMEImages/finalRender.PNG)\n\n*Runs at < 3ms/Frame at a Full HD Resolution on a notebook GTX 1070. Update to readme about how it got to 3ms/frame coming soon*\n\n## Overview\n\nThis project is a real-time cloudscape renderer in Vulkan that was made as the final project for the course, CIS 565: GPU Programming and Architecture, at the University of Pennsylvania. It is based on the cloud system 'NUBIS' that was implemented for the Decima Engine by Guerrilla Games. The clouds were originally made for the game 'Horizon Zero Dawn' and were described in the following SIGGRAPH 2015 and 2017 presentations: \n\n* 2015 [The Real-time Volumetric Cloudscapes of Horizon Zero Dawn](https://www.guerrilla-games.com/read/the-real-time-volumetric-cloudscapes-of-horizon-zero-dawn)\n\n* 2017 [Nubis: Authoring Realtime Volumetric Cloudscapes with the Decima Engine](https://www.guerrilla-games.com/read/nubis-authoring-real-time-volumetric-cloudscapes-with-the-decima-engine)\n\nContributors:\n1. Aman Sachan - M.S.E. Computer Graphics and Game Technology, UPenn\n2. Meghana Seshadri - M.S.E. Computer Graphics and Game Technology, UPenn\n\nSkip Forward to:\n1. [Instructions](#Instructions)\n2. [Features](#Features)\n\t- [Current](#Current)\n\t- [Upcoming](#Upcoming)\n3. [Pipeline Overview](#Pipeline)\n4. [Implementation Overview](#Implementation)\n\t- [Rendering](#Rendering)\n\t- [Modelling](#Modeling)\n\t- [Remap](#remap)\n\t- [Lighting](#Lighting)\n\t- [Post-Processing](#Post)\n5. [Performance Analysis and Optimizations](#Performance)\n6. [Notes](#Notes)\n7. [Resources](#Resources)\n8. [Bloopers](#Bloopers)\n\n## Instructions <a name=\"Instructions\"></a>\n\nIf you wish to run or develop on top of this program, please refer to the [INSTRUCTION.md](https://github.com/Aman-Sachan-asach/Meteoros/blob/master/INSTRUCTION.md) file.\n\n## Features <a name=\"Features\"></a>\n\n### Current <a name=\"Current\"></a>\n- Vulkan Framework that is easy to extend, heavily commented, and easy to read and understand\n- Multiple Compute and Graphics pipelines working in sync\n- Cloud Modelling, Lighting, and Rendering Models as defined by the papers\n- HDR color space\n- God-Rays and Tone Mapping Post processes\n- Raymarching and Cloud rendering Optimizations\n- Fully functional Reprojection Optimization\n- Temporal Anti-Aliasing (TXAA)\n\n### Upcoming <a name=\"Upcoming\"></a>\n- More refined cloud shapes and lighting\n\n## Pipeline Overview <a name=\"Pipeline\"></a>\n\n![](/images/READMEImages/pipelinelayout.png)\n\nWe have 3 distinct stages in our pipeline: compute stage, rasterization or the regular graphics pipeline stage, and a post-process stage.\n\n#### Compute Stage:\nThis stage is responsible for the bulk of this project. It handles: \n- Reprojection Compute Shader: Reprojection calculations in a separate compute shader\n- Cloud Compute Shader: Cloud raymarching, modeling, lighting, and rendering calculations and stores the result in a HDR color space, i.e. 32bit RGBA channels, texture. This shader also generates a \"god-ray creation\" texture, which is a grray-scale image used by the god-rays post process shder to create god rays.\n\n#### Synchronization:\nThe synchronization is in place to ensure that the graphics pipeline doesn't use an image that is half complete and still being written to by the compute pipeline. This is necessary because we are following a compositing model in which we generate the clouds and then paint over them with the rasterized geometry in the world. After this the god rays shader also uses and adds on top of the same texture generated by the compute stage. \n\nThe synchronization point is implemented as a Image Barrier which you can learn more about [here](https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch06s05.html#synchronization-memory-barriers).\n\nWe don't need a synchronization point between the graphics pipeline stage and the subsequent post-process stage because the commands for these stages are stored in the same Queue which stores the command buffer. All commands in the command buffer attached to a queue is executed in order after the previous command has completely finished executing thus if we store the commands in the command buffer in the correct order, we will not need additional synchronization points.\n\n#### Graphics Pipeline Stage:\n\nThis stage is responsible for the rendering of 3D models, which is done via rasterization. The implementation closely follows [this vulkan tutorial](https://vulkan-tutorial.com/) except for the fact that it has been refactored into very readable classes instead of a single file.\nThis commands for this stage have been commented outis and thus are not being dispatched because they weren't adding anything to our scene.\n\n#### Post Process Stage:\n\nThis stage is responsible for adding the god-rays, and tone mapping post-process effects.\n\n## Implementation Overview <a name=\"Implementation\"></a>\n\n### Rendering <a name=\"Rendering\"></a>\n\nWe render clouds to a texture using the ray marching technique, which is an image based volumetric rendering technique that is used to evalute volumes as opposed to surfaces. This means that the assumption that a objects properties can be defined at or by its surface are thrown out the window. Ray marching involves sampling a ray at various points along its length because the volume is defined at every point inside itself. \n\nRay marching is a widely discussed subject and you can find many great resources to dive into it such as this presentation (https://cis700-procedural-graphics.github.io/files/implicit_surfaces_2_21_17.pdf) from a course on Procedural Graphics at UPenn and [iq's blog](http://www.iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm)\n\nAt every step of our ray march we determine how dense the atmosphere is and if it is dense enough to be quantified as a cloud we light that point. Our lighting model is described later in this readme, however it will make a lot more intuitive sense if one is familiar with volumetic lighting. You can learn more about volumetric lighting in the book [Physically Based Rendering from Theory to Implementation](http://www.pbrt.org/). That is a bit dense and so if you simply want a simple overview go [here](https://www.scratchapixel.com/lessons/advanced-rendering/volume-rendering-for-artists).\n\nTo render the sky as a skybox type dome we create 3 spheres, representing the earth, the inner layer of the atmosphere, and the outer layer of the atmosphere.\n\n<img src=\"/images/READMEImages/layerLayout.png\" width=\"642\" height=\"362\"> \n\nWe don't want to render any thing beyond the horizon because we can't see anything beyond the horizon anyway.\n\n<img src=\"/images/READMEImages/horizonLine.png\" width=\"642\" height=\"362\"> \n\nPlacing a camera atop this virtual earth, we can start our actual rendering process. Start raycasting from your camera, for every ray evaluate it at a fixed stepsize when it is inside the the 2 atmosphere layers we just created.\n\n<img src=\"/images/READMEImages/raymarching.png\" width=\"642\" height=\"362\"> \n\nWhen we evaluate a point along the ray and determine it has a non-zero density value we know we are inside a cloud.\n\n<img src=\"/images/READMEImages/InOutOfCloud.png\" width=\"642\" height=\"362\">\n\nNow, to actually give this point in the cloud some coloration we can light it by shooting a ray towards our single light source, the sun, and use the resulting energy information to color that point.\n\n<img src=\"/images/READMEImages/LightCalculationsNaive.png\" width=\"642\" height=\"362\">\n\nCone Sampling is a more efficient way of determining the light energy that will be recieved by that point. Cone sampling involves taking some number of samples from inside the volume of a cone that is aligned with our light source. We take 6 samples using cone sampling and make sure to have the last one be placed relatively far. This far-away sample is a way of taking into account if the cloud and hence point we are trying to light is occluded by another cloud in the distance. Using these 6 samples from within the cone we get a density value which is used to attenuate the light energy reaching the point we are trying to color.\n\n<img src=\"/images/READMEImages/ConeSampling.png\" width=\"642\" height=\"362\"> \n\n### Modeling <a name=\"Modeling\"></a>\n\nGenerating noise on the fly to determine our cloud shape is a very expensive process. This is why we use tiling 3D noise textures with precomputed density values to determine our cloud shape.\n\nThere are 3 textures that are used to define the shape of a cloud in this project: \n\n\t3D cloudBaseShapeTexture\n\t4 channels…\n\t128^3 resolution…\n\tThe first channel is the Perlin-Worley noise.\n\tThe other 3 channels are Worley noise at increasing frequencies. \n\tThis 3d texture is used to define the base shape for our clouds.\n\n![](/images/READMEImages/LowFrequencyNoiseChannels.png)\n\n\t3D cloudDetailsTexture\n\t3 channels…\n\t32^3 resolution…\n\tUses Worley noise at increasing frequencies. \n\tThis texture is used to add detail to the base cloud shape defined by the first 3d noise.\n\n![](/images/READMEImages/highFrequencyDetail.png)\n\n\t2D cloudMotionTexture\n\t3 channels…\n\t128^2 resolution…\n\tUses curl noise. Which is non divergent and is used to fake fluid motion. \n\tWe use this noise to distort our cloud shapes and add a sense of turbulence.\t\n\n![](/images/READMEImages/curlNoise.png)\n\nTo define the shape of a cloud we first determine its base shape using the low frequency noise in the '3D cloudBaseShapeTexture', next we errode away the cloud at the edges using the '3D cloudDetailsTexture', and finally we give our cloud a sense of turbulence and fake the look of a moving cloud using the '2D cloudMotionTexture.'\n\n![](/images/READMEImages/CloudErosion.png)\n\n### Remap Function <a name=\"Remap\"></a>\n\nOne function is used ubiquitously in modelling and lighting these clouds. The remap finction:\n\n\tfloat remap(in float value, in float original_min, in float original_max, in float new_min, in float new_max)\n\t{\n\t\treturn new_min + ( ((value - original_min) / (original_max - original_min)) * (new_max - new_min) );\n\t}\n\nThis remap function simply takes a value, that lies inside one range and maps it to another range that you provide. It seems like a simple function and it is in concept but it is can be used in very clever maners to do all sorts of things.\n\nFor example, towards the end of the modelling section of this readme, we talked about erroding the edges of a cloud. How do you possibly determine that the point you're evaluatiing is at the edge of a cloud? Well we could use the remap function to do just that.\n\nIf we use the below graph as an example, where the red line represents the base density of the cloud and the green line represents the high frequency noise used to erode our cloud at the egdes. If we performed a remap operations on the base density using the high frequency noise as the new minimum value then we would not lose any density in the center of the cloud, which is exactly what we want.\n\n![](/images/READMEImages/remapFunctionDemonstration.png)\n\n### Lighting <a name=\"Lighting\"></a>\n\nThe lighting model as described in the 2017 presentation is an attenuation based lighting model. This means that you start with full intensity, and then reduce it as combination of the following 3 probabilities: \n\n1. Directional Scattering\n2. Absorption / Out-scattering \n3. In-scattering\n\n![](/images/READMEImages/lightingProbs.PNG)\n\n#### Directional Scattering\n\nThis retains baseline forward scattering and produces silver lining effects. It is calculated using Henyey-Greenstein equation.\n\nThe eccentricity value that generally works well for mid-day sunlight doesn't provide enough bright highlights around the sun during sunset. \n\n![](/images/READMEImages/hg01.PNG)\n\nChange the eccentricity to have more forward scattering, hence bringing the highlights around the sun. Clouds 90 degrees away from the sun, however, become too dark.\n\n![](/images/READMEImages/hg02.PNG)\n\nTo retain baseline forward scattering behavior and get the silver lining highlights, combine 2 HG functions, and factors to control the intensity of this effect as well as its spread away from the sun.\n\n![](/images/READMEImages/hg03.PNG)\n\n![](/images/READMEImages/hg04.PNG)\n\n#### Absorption / Out-scattering\n\nThis is the transmittance produced as a result of the Beer-Lambert equation. \n\nBeer's Law only accounts for attenuation of light and not the emission of light that has in-scattered to the sample point, hence making clouds too dark. \n\n![](/images/beerslaw.png)\n\n![](/images/READMEImages/beer01.PNG)\n\nBy combining 2 Beer-Lambert equations, the attenuation for the second one is reduced to push light further into the cloud.\n\n![](/images/READMEImages/beer02.PNG)\n\n#### In-scattering\nThis produces the dark edges and bases to the clouds. \n\nIn-scattering is when a light ray that has scattered in a cloud is combined with others on its way to the eye, essentially brightening the region of the cloud you are looking at. In order for this to occur, an area must have a lot of rays scattering into it, which only occurs where there is cloud material. This means that the deeper in the cloud, the more scattering contributors there are, and the amount of in-scattering on the edges of the clouds is lower, which makes them appear dark. Also, since there are no strong scattering sources below clouds, the bottoms of them will have less occurences of in-scattering as well. \n\nOnly attenuation and HG phase: \n\n![](/images/READMEImages/in01.PNG)\n\nSampling cloud at low level of density, and accounting for attenuation along in-scatter path. This appears dark because there is little to no in-scattering on the edges.\n\n![](/images/READMEImages/in02.PNG)\n\nRelax the effect over altitude and apply a bias to compensate. \n\n![](/images/READMEImages/in03.PNG)\n\nSecond component accounts for decrease in-scattering over height. \n\n![](/images/READMEImages/in04.PNG)\n\n### Post Processing <a name=\"Post\"></a>\n\n#### GodRays\n\nGod Rays are the streaks of light that poke out from behind clouds. These streaks, which stream through gaps in clouds or between other objects, are columns of sunlit air separated by darker cloud-shadowed regions. Despite seeming to converge at a point, the rays are in fact near-parallel shafts of sunlight. Their apparent convergence is a perspective effect.\n\nWe faked the effect of god rays in screen space by radially blurring light from the location of the sun in screen space and using a grey scale godray mask that was generated in the cloudcompte shader to determine where the clouds lie and hence where streaks of light shouldn't appear.\n\nIf the sun was not present in the camera frustum that meant that its screen space location was outside the range [0,1] meaning we couldn't generate a mask for points outside screen space or even sample pixels for radial blurring. To overcome the pixel sampling issue we simply used a gradient to represent the energy value. The gradient moved from white to grey as we moved radially away from the sun. There isn't a good way to incorporate the mask back in so we assume that the gradient values outside the screen bounds are unoccluded.\n\nThere also isnt a great but also cheap way to do god-rays when the sun is behind the camerabecause we have no data whatsoever. We simply, blend out the god rays as the sun moves to points no longer in the same hemisphere as the camera lookAt vector.\n\n| Only GodRays | GodRay Mask |\n| ------------ |:-----------:|\n| ![](/images/READMEImages/godRayMask.PNG)                    | ![](/images/READMEImages/onlyGodRays.png) |\n| GodRays Composite on Cloud Density                          | Final Composite |\n| ![](/images/READMEImages/godraycompositeOnCloudDensity.PNG) | ![](/images/READMEImages/godraysComposited.png) |\n\nGod Rays use a radial blurring technique which relies on sampling pixels from the god ray mask. The more samples you take the higher the performance toll. The FPS dropped by 3 FPS due to the god ray post-process at a 100 sample/pixel .\n![](/images/READMEImages/godRayChart.PNG)\n\n#### Tone Mapping\n\nTone Mapping is a technique used to map one color space into another to approximate the appearance of high dynamic range images because displays and monitors have more limited dynamic ranges. We implemented the uncharted 2 tone mapping technique that is really good and has become quite popular.\n\nA great visual example of the different [types of tone mapping techniques](https://www.shadertoy.com/view/lslGzl).\n\nOur project is working in the HDR color space and so requires tone mapping to avoid ridiculously blown out images. (a perfect example is in the [bloopers](#Bloopers))\n\n| Without                                             | With                                             |\n| --------------------------------------------------- |:------------------------------------------------:|\n| ![](/images/READMEImages/lightingNotToneMapped.png) | ![](/images/READMEImages/lightingToneMapped.png) |\n\n## Performance Analysis and Optimizations <a name=\"Performance\"></a>\n\nPerformance analysis conducted on: Windows 10, i7-7700HQ @ 2.8GHz 32GB, GTX 1070(laptop GPU) 8074MB (Personal Machine: Customized MSI GT62VR 7RE)\n\n### Early termination based on accumulated Density\n\nIf during our ray march we accumulate a density value of over 1 then we terminate the ray march early.\n\n### Cheap Sampling\n\nWe determine we are inside a cloud by getting our base density for the cloud and ensuring its greater than 0. We will not do the high requency errosion and further cloud shaping nor will we do any expensive lighting calculations unless we have determined we are inside a cloud.\n\n![](/images/READMEImages/cheapSamplingChart.PNG)\n\n### Reprojection\n\nReprojection is a technique that uses pixels from the previous frame to color the pixels in the current frame. This is done by projecting the old frame onto the current frame. We calculate how much the camera has moved between 2 frames an\n\nMore technically this is implemented as follows:\n1. We store our previous frame in a texture.\n2. Store the old camera information\n3. For a given pixel in the current frame, ray cast using the ray created by the current camera and the current pixels uv co-ordinates.\n4. The ray cast will intersect with the sphere representing the inner layer of the atmosphere. The point of intersection gives ud a world space position.\n5. This world space position is then converted all the way back into uv co-ordinates using the old camera's view and projection matrices.\n6. This uv co-ordinate if in the range from [0,1] can be used to sample the pixel in the old frame that will be used to fill in the pixel in the current frame.\n\nUsing this reprojection technique we can get away with actuall only ray marching for 1/16th of the pixels in the current frame. The other 15 of the 16 pixels are filled in using reprojection.\n\nThis technique has been implemented in a test branch but is slightly buggy, but preliminary tests show it giving us a 5.97 times speed boost for a version with an inexpensive lighting model. This further implies that the way more complex lighting model in the master branch will gain even better performance boosts.\n\n![](/images/READMEImages/reprojectionPerformance.PNG)\n\n## Notes <a name=\"Notes\"></a>\n- We did not add checks (which is highly recommended when developing Vulkan code for other users) to make sure some features are supported by the GPU before using them, such as anisotropic filtering and the image formats that the GPU supports.\n\n## Resources <a name=\"Resources\"></a>\n\n#### Texture Resources:\n- [Low and High Frequency Noise Textures](https://www.guerrilla-games.com/read/nubis-authoring-real-time-volumetric-cloudscapes-with-the-decima-engine) were made using the 'Nubis Noise Generator' houdini tool that was released along with the 2015 paper. \n- [Curl Noise Textures](http://bitsquid.blogspot.com/2016/07/volumetric-clouds.html)\n- Weather Map Texture by Dan Mccan\n\n#### Libraries:\n- [Image Loading Library](https://github.com/nothings/stb)\n- [Obj Loading Library](https://github.com/syoyo/tinyobjloader)\n- [Why to include stb in .cpp file](https://stackoverflow.com/questions/43348798/double-inclusion-and-headers-only-library-stbi-image)\n- [Imgui](https://github.com/ocornut/imgui) for our partially wriiten gui\n- [GLFW](http://www.glfw.org/) utilities for Windows\n- [GLM](https://glm.g-truc.net/0.9.8/index.html) \n\n#### Vulkan\n- [Vulkan Tutorial](https://vulkan-tutorial.com/)\n- [RenderDoc](https://renderdoc.org/)\n- [Setting Up Compute Shader that writes to a texture](https://github.com/SaschaWillems/Vulkan/tree/master/examples/raytracing)\n- [3D Textures](https://github.com/SaschaWillems/Vulkan/tree/master/examples/texture3d)\n- [Pipeline Caching](https://github.com/SaschaWillems/Vulkan/tree/master/examples/radialblur) was used for post-processing and so it made more sense to see how it is done for post processing\n- [Radial Blur](https://github.com/SaschaWillems/Vulkan/tree/master/examples/radialblur)\n\n#### Post-Processing:\n- [Uncharted 2 Tone Mapping](http://filmicworlds.com/blog/filmic-tonemapping-operators/)\n- [God Rays](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html)\n\n#### Upcoming Feature Set:\n- [Off-screen Rendering](https://github.com/SaschaWillems/Vulkan/tree/master/examples/offscreen)\n- [Push Constants](https://github.com/SaschaWillems/Vulkan/tree/master/examples/pushconstants)\n\n#### Other Resources\n- FBM Procedural Noise Joe Klinger\n- Preetham Sun/Sky model from Project Marshmallow \n\n## Bloopers <a name=\"Bloopers\"></a>\n\n* Tone Mapping Madness\n\n![](/images/READMEImages/meg01.gif)\n\n* Sobel's \"edgy\" clouds\n\n![](/images/READMEImages/sobeltest.PNG)\n"
  },
  {
    "path": "TXAA.md",
    "content": "## TXAA\n\n### Halton Sequence: //https://en.wikipedia.org/wiki/Halton_sequence\n\n### Why not MSAA or FXAA?\n\t\n\tFXAA isnt good enough to deal with high variance boundaries (corners and specular surfaces or in this case volume that is sampled very few times)\n\tMSAA does not affect shading aliasing\n\tUnreal Engine talk on more of this: https://de45xmedrsdbp.cloudfront.net/Resources/files/TemporalAA_small-59732822.pdf\n\n### Resources\n\nhttps://de45xmedrsdbp.cloudfront.net/Resources/files/TemporalAA_small-59732822.pdf\nhttps://www.gdcvault.com/play/1022970/Temporal-Reprojection-Anti-Aliasing-in\nhttps://www.youtube.com/watch?v=FMfC47xsImU&index=2&list=LLgt_lAI0-x_RhlGyv6DEBAw&t=1106s"
  },
  {
    "path": "cmake/FindVulkan.cmake",
    "content": "# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying\n# file Copyright.txt or https://cmake.org/licensing for details.\n\n#.rst:\n# FindVulkan\n# ----------\n#\n# Try to find Vulkan\n#\n# IMPORTED Targets\n# ^^^^^^^^^^^^^^^^\n#\n# This module defines :prop_tgt:`IMPORTED` target ``Vulkan::Vulkan``, if\n# Vulkan has been found.\n#\n# Result Variables\n# ^^^^^^^^^^^^^^^^\n#\n# This module defines the following variables::\n#\n#   Vulkan_FOUND          - True if Vulkan was found\n#   Vulkan_INCLUDE_DIRS   - include directories for Vulkan\n#   Vulkan_LIBRARIES      - link against this library to use Vulkan\n#\n# The module will also define two cache variables::\n#\n#   Vulkan_INCLUDE_DIR    - the Vulkan include directory\n#   Vulkan_LIBRARY        - the path to the Vulkan library\n#\n\nif(WIN32)\nfind_path(Vulkan_INCLUDE_DIR\n  NAMES vulkan/vulkan.h\n  PATHS\n    \"$ENV{VULKAN_SDK}/Include\"\n  )\n\nif(CMAKE_SIZEOF_VOID_P EQUAL 8)\n  find_library(Vulkan_LIBRARY\n    NAMES vulkan-1\n    PATHS\n      \"$ENV{VULKAN_SDK}/Lib\"\n      \"$ENV{VULKAN_SDK}/Bin\"\n      )\nelseif(CMAKE_SIZEOF_VOID_P EQUAL 4)\n  find_library(Vulkan_LIBRARY\n    NAMES vulkan-1\n    PATHS\n      \"$ENV{VULKAN_SDK}/Lib32\"\n      \"$ENV{VULKAN_SDK}/Bin32\"\n      NO_SYSTEM_ENVIRONMENT_PATH\n      )\nendif()\nelse()\n  find_path(Vulkan_INCLUDE_DIR\n    NAMES vulkan/vulkan.h\n    PATHS\n      \"$ENV{VULKAN_SDK}/include\")\n  find_library(Vulkan_LIBRARY\n    NAMES vulkan\n    PATHS\n      \"$ENV{VULKAN_SDK}/lib\")\nendif()\n\nset(Vulkan_LIBRARIES ${Vulkan_LIBRARY})\nset(Vulkan_INCLUDE_DIRS ${Vulkan_INCLUDE_DIR})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Vulkan\nDEFAULT_MSG\nVulkan_LIBRARY Vulkan_INCLUDE_DIR)\n\nmark_as_advanced(Vulkan_INCLUDE_DIR Vulkan_LIBRARY)\n\nif(Vulkan_FOUND AND NOT TARGET Vulkan::Vulkan)\nadd_library(Vulkan::Vulkan UNKNOWN IMPORTED)\nset_target_properties(Vulkan::Vulkan PROPERTIES\n  IMPORTED_LOCATION \"${Vulkan_LIBRARIES}\"\n  INTERFACE_INCLUDE_DIRECTORIES \"${Vulkan_INCLUDE_DIRS}\")\nendif()"
  },
  {
    "path": "cmake/FindXCB.cmake",
    "content": "# - FindXCB\n#\n# Copyright 2015 Valve Coporation\n\nfind_package(PkgConfig)\n\nif(NOT XCB_FIND_COMPONENTS)\n    set(XCB_FIND_COMPONENTS xcb)\nendif()\n\ninclude(FindPackageHandleStandardArgs)\nset(XCB_FOUND true)\nset(XCB_INCLUDE_DIRS \"\")\nset(XCB_LIBRARIES \"\")\nforeach(comp ${XCB_FIND_COMPONENTS})\n    # component name\n    string(TOUPPER ${comp} compname)\n    string(REPLACE \"-\" \"_\" compname ${compname})\n    # header name\n    string(REPLACE \"xcb-\" \"\" headername xcb/${comp}.h)\n    # library name\n    set(libname ${comp})\n\n    pkg_check_modules(PC_${comp} QUIET ${comp})\n\n    find_path(${compname}_INCLUDE_DIR NAMES ${headername}\n        HINTS\n        ${PC_${comp}_INCLUDEDIR}\n        ${PC_${comp}_INCLUDE_DIRS}\n        )\n\n    find_library(${compname}_LIBRARY NAMES ${libname}\n        HINTS\n        ${PC_${comp}_LIBDIR}\n        ${PC_${comp}_LIBRARY_DIRS}\n        )\n\n    find_package_handle_standard_args(${comp}\n        FOUND_VAR ${comp}_FOUND\n        REQUIRED_VARS ${compname}_INCLUDE_DIR ${compname}_LIBRARY)\n    mark_as_advanced(${compname}_INCLUDE_DIR ${compname}_LIBRARY)\n\n    list(APPEND XCB_INCLUDE_DIRS ${${compname}_INCLUDE_DIR})\n    list(APPEND XCB_LIBRARIES ${${compname}_LIBRARY})\n\n    if(NOT ${comp}_FOUND)\n        set(XCB_FOUND false)\n    endif()\nendforeach()\n\nlist(REMOVE_DUPLICATES XCB_INCLUDE_DIRS)"
  },
  {
    "path": "dithering.md",
    "content": "The basic idea is to add a small value to every pixel right before it is quantized (i.e. converted from the floating point representation used in the shader to 8 bits per channel in the framebuffer). \n\nDithering is used to prevent banding\nThe idea is that the least significant bits of the color that would ordinarily get thrown out are combined with this added value and cause the pixel to have a chance of rounding differently than nearby pixels.\n\nhttp://www.anisopteragames.com/how-to-fix-color-banding-with-dithering/\n\nhttps://en.wikipedia.org/wiki/Dither\t\n\nWangHashNoise is a replacement for dithering noise function\nReference: https://youtu.be/4D5uX8wL1V8?t=11m22s\nSuper fast because of all the binary operations\nQuality noise without repeating patterns\n\nfloat WangHashNoise(uint u, uint v, uint s)"
  },
  {
    "path": "external/CMakeLists.txt",
    "content": "set(GLFW_BUILD_EXAMPLES OFF)\nset(GLFW_BUILD_TESTS OFF)\nset(GLFW_BUILD_DOCS OFF)\nadd_subdirectory(GLFW)"
  },
  {
    "path": "external/GLFW/.appveyor.yml",
    "content": "branches:\n    only:\n        - ci\n        - master\nskip_tags: true\nenvironment:\n    CFLAGS: /WX\n    matrix:\n        - BUILD_SHARED_LIBS: ON\n        - BUILD_SHARED_LIBS: OFF\nmatrix:\n    fast_finish: true\nbuild_script:\n    - mkdir build\n    - cd build\n    - cmake -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% ..\n    - cmake --build .\nnotifications:\n    - provider: Email\n      to:\n        - ci@glfw.org\n      on_build_failure: true\n      on_build_success: false\n"
  },
  {
    "path": "external/GLFW/.gitattributes",
    "content": "*.m linguist-language=Objective-C\n"
  },
  {
    "path": "external/GLFW/.github/CONTRIBUTING.md",
    "content": "# Contribution Guide\n\n## Contents\n\n- [Asking a question](#asking-a-question)\n- [Reporting a bug](#reporting-a-bug)\n    - [Reporting a compile or link bug](#reporting-a-compile-or-link-bug)\n    - [Reporting a segfault or other crash bug](#reporting-a-segfault-or-other-crash-bug)\n    - [Reporting a context creation bug](#reporting-a-context-creation-bug)\n    - [Reporting a monitor or video mode bug](#reporting-a-monitor-or-video-mode-bug)\n    - [Reporting a window, input or event bug](#reporting-a-window-input-or-event-bug)\n    - [Reporting some other library bug](#reporting-some-other-library-bug)\n    - [Reporting a documentation bug](#reporting-a-documentation-bug)\n    - [Reporting a website bug](#reporting-a-website-bug)\n- [Requesting a feature](#requesting-a-feature)\n- [Contributing a bug fix](#contributing-a-bug-fix)\n- [Contributing a feature](#contributing-a-feature)\n\n\n## Asking a question\n\nQuestions about how to use GLFW should be asked either in the [support\nsection](http://discourse.glfw.org/c/support) of the forum, under the [Stack\nOverflow tag](https://stackoverflow.com/questions/tagged/glfw) or [Game\nDevelopment tag](https://gamedev.stackexchange.com/questions/tagged/glfw) on\nStack Exchange or in the IRC channel `#glfw` on\n[Freenode](http://freenode.net/).\n\nQuestions about the design or implementation of GLFW or about future plans\nshould be asked in the [dev section](http://discourse.glfw.org/c/dev) of the\nforum or in the IRC channel.  Please don't open a GitHub issue to discuss design\nquestions without first checking with a maintainer.\n\n\n## Reporting a bug\n\nIf GLFW is behaving unexpectedly at run-time, start by setting an [error\ncallback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling).\nGLFW will often tell you the cause of an error via this callback.  If it\ndoesn't, that might be a separate bug.\n\nIf GLFW is crashing or triggering asserts, make sure that all your object\nhandles and other pointers are valid.\n\nFor bugs where it makes sense, a short, self contained example is absolutely\ninvaluable.  Just put it inline in the body text.  Note that if the bug is\nreproducible with one of the test programs that come with GLFW, just mention\nthat instead.\n\n__Don't worry about adding too much information__.  Unimportant information can\nbe abbreviated or removed later, but missing information can stall bug fixing,\nespecially when your schedule doesn't align with that of the maintainer.\n\n__Please provide text as text, not as images__.  This includes code, error\nmessages and any other text.  Text in images cannot be found by other users\nsearching for the same problem and may have to be re-typed by maintainers when\ndebugging.\n\nYou don't need to manually indent your code or other text to quote it with\nGitHub Markdown; just surround it with triple backticks:\n\n    ```\n    Some quoted text.\n    ```\n\nYou can also add syntax highlighting by appending the common file extension:\n\n    ```c\n    int five(void)\n    {\n        return 5;\n    }\n    ```\n\nThere are issue labels for both platforms and GPU manufacturers, so there is no\nneed to mention these in the subject line.  If you do, it will be removed when\nthe issue is labeled.\n\nIf your bug is already reported, please add any new information you have, or if\nit already has everything, give it a :+1:.\n\n\n### Reporting a compile or link bug\n\n__Note:__ GLFW needs many system APIs to do its job, which on some platforms\nmeans linking to many system libraries.  If you are using GLFW as a static\nlibrary, that means your application needs to link to these in addition to GLFW.\n\n__Note:__ Check the [Compiling\nGLFW](http://www.glfw.org/docs/latest/compile.html) guide and or [Building\napplications](http://www.glfw.org/docs/latest/build.html) guide for before\nopening an issue of this kind.  Most issues are caused by a missing package or\nlinker flag.\n\nAlways include the __operating system name and version__ (e.g. `Windows\n7 64-bit` or `Ubuntu 15.10`) and the __compiler name and version__ (e.g. `Visual\nC++ 2015 Update 2`).  If you are using an official release of GLFW,\ninclude the __GLFW release version__ (e.g. `3.1.2`), otherwise include the\n__GLFW commit ID__ (e.g.  `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.\n\nPlease also include the __complete build log__ from your compiler and linker,\neven if it's long.  It can always be shortened later, if necessary.\n\n\n#### Quick template\n\n```\nOS and version:\nCompiler version:\nRelease or commit:\nBuild log:\n```\n\n\n### Reporting a segfault or other crash bug\n\nAlways include the __operating system name and version__ (e.g. `Windows\n7 64-bit` or `Ubuntu 15.10`).  If you are using an official release of GLFW,\ninclude the __GLFW release version__ (e.g. `3.1.2`), otherwise include the\n__GLFW commit ID__ (e.g.  `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.\n\nPlease also include any __error messages__ provided to your application via the\n[error\ncallback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling) and\nthe __full call stack__ of the crash, or if the crash does not occur in debug\nmode, mention that instead.\n\n\n#### Quick template\n\n```\nOS and version:\nRelease or commit:\nError messages:\nCall stack:\n```\n\n\n### Reporting a context creation bug\n\n__Note:__ Windows ships with graphics drivers that do not support OpenGL.  If\nGLFW says that your machine lacks support for OpenGL, it very likely does.\nInstall drivers from the computer manufacturer or graphics card manufacturer\n([Nvidia](http://www.geforce.com/drivers),\n[AMD](http://support.amd.com/en-us/download),\n[Intel](https://www-ssl.intel.com/content/www/us/en/support/detect.html)) to\nfix this.\n\n__Note:__ AMD only supports OpenGL ES on Windows via EGL.  See the\n[GLFW\\_CONTEXT\\_CREATION\\_API](http://www.glfw.org/docs/latest/window_guide.html#window_hints_ctx)\nhint for how to select EGL.\n\nPlease verify that context creation also fails with the `glfwinfo` tool before\nreporting it as a bug.  This tool is included in the GLFW source tree as\n`tests/glfwinfo.c` and is built along with the library.  It has switches for all\nGLFW context and framebuffer hints.  Run `glfwinfo -h` for a complete list.\n\nAlways include the __operating system name and version__ (e.g. `Windows\n7 64-bit` or `Ubuntu 15.10`).  If you are using an official release of GLFW,\ninclude the __GLFW release version__ (e.g. `3.1.2`), otherwise include the\n__GLFW commit ID__ (e.g.  `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.\n\nIf you are running your program in a virtual machine, please mention this and\ninclude the __VM name and version__ (e.g. `VirtualBox 5.1`).\n\nPlease also include the __GLFW version string__ (`3.2.0 X11 EGL clock_gettime\n/dev/js`), as described\n[here](http://www.glfw.org/docs/latest/intro.html#intro_version_string), the\n__GPU model and driver version__ (e.g. `GeForce GTX660 with 352.79`), and the\n__output of `glfwinfo`__ (with switches matching any hints you set in your\ncode) when reporting this kind of bug.  If this tool doesn't run on the machine,\nmention that instead.\n\n\n#### Quick template\n\n```\nOS and version:\nGPU and driver:\nRelease or commit:\nVersion string:\nglfwinfo output:\n```\n\n\n### Reporting a monitor or video mode bug\n\n__Note:__ On headless systems on some platforms, no monitors are reported.  This\ncauses glfwGetPrimaryMonitor to return `NULL`, which not all applications are\nprepared for.\n\n__Note:__ Some third-party tools report more video modes than are approved of\nby the OS.  For safety and compatibility, GLFW only reports video modes the OS\nwants programs to use.  This is not a bug.\n\nThe `monitors` tool is included in the GLFW source tree as `tests/monitors.c`\nand is built along with the library.  It lists all information GLFW provides\nabout monitors it detects.\n\nAlways include the __operating system name and version__ (e.g. `Windows\n7 64-bit` or `Ubuntu 15.10`).  If you are using an official release of GLFW,\ninclude the __GLFW release version__ (e.g. `3.1.2`), otherwise include the\n__GLFW commit ID__ (e.g.  `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.\n\nIf you are running your program in a virtual machine, please mention this and\ninclude the __VM name and version__ (e.g. `VirtualBox 5.1`).\n\nPlease also include any __error messages__ provided to your application via the\n[error\ncallback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling) and\nthe __output of `monitors`__ when reporting this kind of bug.  If this tool\ndoesn't run on the machine, mention this instead.\n\n\n#### Quick template\n\n```\nOS and version:\nRelease or commit:\nError messages:\nmonitors output:\n```\n\n\n### Reporting a window, input or event bug\n\n__Note:__ The exact ordering of related window events will sometimes differ.\n\n__Note:__ Window moving and resizing (by the user) will block the main thread on\nsome platforms.  This is not a bug.  Set a [refresh\ncallback](http://www.glfw.org/docs/latest/window.html#window_refresh) if you\nwant to keep the window contents updated during a move or size operation.\n\nThe `events` tool is included in the GLFW source tree as `tests/events.c` and is\nbuilt along with the library.  It prints all information provided to every\ncallback supported by GLFW as events occur.  Each event is listed with the time\nand a unique number to make discussions about event logs easier.  The tool has\ncommand-line options for creating multiple windows and full screen windows.\n\nAlways include the __operating system name and version__ (e.g. `Windows\n7 64-bit` or `Ubuntu 15.10`).  If you are using an official release of GLFW,\ninclude the __GLFW release version__ (e.g. `3.1.2`), otherwise include the\n__GLFW commit ID__ (e.g.  `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.\n\nIf you are running your program in a virtual machine, please mention this and\ninclude the __VM name and version__ (e.g. `VirtualBox 5.1`).\n\nPlease also include any __error messages__ provided to your application via the\n[error\ncallback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling) and\nif relevant, the __output of `events`__ when reporting this kind of bug.  If\nthis tool doesn't run on the machine, mention this instead.\n\n__X11:__ If possible, please include what desktop environment (e.g. GNOME,\nUnity, KDE) and/or window manager (e.g. Openbox, dwm, Window Maker) you are\nrunning.  If the bug is related to keyboard input, please include any input\nmethod (e.g. ibus, SCIM) you are using.\n\n\n#### Quick template\n\n```\nOS and version:\nRelease or commit:\nError messages:\nevents output:\n```\n\n\n### Reporting some other library bug\n\nAlways include the __operating system name and version__ (e.g. `Windows\n7 64-bit` or `Ubuntu 15.10`).  If you are using an official release of GLFW,\ninclude the __GLFW release version__ (e.g. `3.1.2`), otherwise include the\n__GLFW commit ID__ (e.g.  `3795d78b14ef06008889cc422a1fb8d642597751`) from Git.\n\nPlease also include any __error messages__ provided to your application via the\n[error\ncallback](http://www.glfw.org/docs/latest/intro_guide.html#error_handling), if\nrelevant.\n\n\n#### Quick template\n\n```\nOS and version:\nRelease or commit:\nError messages:\n```\n\n\n### Reporting a documentation bug\n\nIf you found a bug in the documentation, including this file, then it's fine to\njust link to that web page or mention that source file.  You don't need to match\nthe source to the output or vice versa.\n\n\n### Reporting a website bug\n\nIf the bug is in the documentation (anything under `/docs/`) then please see the\nsection above.  Bugs in the rest of the site are reported to to the [website\nsource repository](https://github.com/glfw/website/issues).\n\n\n## Requesting a feature\n\nPlease explain why you need the feature and how you intend to use it.  If you\nhave a specific API design in mind, please add that as well.  If you have or are\nplanning to write code for the feature, see the section below.\n\nIf there already is a request for the feature you need, add your specific use\ncase unless it is already mentioned.  If it is, give it a :+1:.\n\n\n## Contributing a bug fix\n\n__Note:__ You must have all necessary [intellectual\nproperty rights](https://en.wikipedia.org/wiki/Intellectual_property) to any\ncode you contribute.  If you did not write the code yourself, you must explain\nwhere it came from and under what license you received it.  Even code using the\nsame license as GLFW may not be copied without attribution.\n\n__There is no preferred patch size__.  A one character fix is just as welcome as\na thousand line one, if that is the appropriate size for the fix.\n\nIn addition to the code, a complete bug fix includes:\n\n- Change log entry in `README.md`, describing the incorrect behavior\n- Credits entries for all authors of the bug fix\n\nBug fixes will not be rejected because they don't include all the above parts,\nbut please keep in mind that maintainer time is finite and that there are many\nother bugs and features to work on.\n\nIf the patch fixes a bug introduced after the last release, it should not get\na change log entry.\n\nIf you haven't already, read the excellent article [How to Write a Git Commit\nMessage](https://chris.beams.io/posts/git-commit/).\n\n\n## Contributing a feature\n\n__Note:__ You must have all necessary rights to any code you contribute.  If you\ndid not write the code yourself, you must explain where it came from and under\nwhat license.  Even code using the same license as GLFW may not be copied\nwithout attribution.\n\n__Note:__ If you haven't already implemented the feature, check first if there\nalready is an open issue for it and if it's already being developed in an\n[experimental branch](https://github.com/glfw/glfw/branches/all).\n\n__There is no preferred patch size__.  A one character change is just as welcome\nas one adding a thousand line one, if that is the appropriate size for the\nfeature.\n\nIn addition to the code, a complete feature includes:\n\n- Change log entry in `README.md`, listing all new symbols\n- News page entry, briefly describing the feature\n- Guide documentation, with minimal examples, in the relevant guide\n- Reference documentation, with all applicable tags\n- Cross-references and mentions in appropriate places\n- Credits entries for all authors of the feature\n\nIf the feature requires platform-specific code, at minimum stubs must be added\nfor the new platform function to all supported and experimental platforms.\n\nIf it adds a new callback, support for it must be added to `tests/event.c`.\n\nIf it adds a new monitor property, support for it must be added to\n`tests/monitor.c`.\n\nIf it adds a new OpenGL, OpenGL ES or Vulkan option or extension, support\nfor it must be added to `tests/glfwinfo.c` and the behavior of the library when\nthe extension is missing documented in `docs/compat.dox`.\n\nIf you haven't already, read the excellent article [How to Write a Git Commit\nMessage](https://chris.beams.io/posts/git-commit/).\n\nFeatures will not be rejected because they don't include all the above parts,\nbut please keep in mind that maintainer time is finite and that there are many\nother features and bugs to work on.\n\nPlease also keep in mind that any part of the public API that has been included\nin a release cannot be changed until the next _major_ version.  Features can be\nadded and existing parts can sometimes be overloaded (in the general sense of\ndoing more things, not in the C++ sense), but code written to the API of one\nminor release should both compile and run on subsequent minor releases.\n\n"
  },
  {
    "path": "external/GLFW/.gitignore",
    "content": "# External junk\n.DS_Store\n_ReSharper*\n*.opensdf\n*.sdf\n*.suo\n*.dir\n*.vcxproj*\n*.sln\nWin32\nx64\nDebug\nRelease\nMinSizeRel\nRelWithDebInfo\n*.xcodeproj\n\n# CMake files\nMakefile\nCMakeCache.txt\nCMakeFiles\nCMakeScripts\ncmake_install.cmake\ncmake_uninstall.cmake\n\n# Generated files\ndocs/Doxyfile\ndocs/html\ndocs/warnings.txt\ndocs/doxygen_sqlite3.db\nsrc/glfw_config.h\nsrc/glfw3.pc\nsrc/glfw3Config.cmake\nsrc/glfw3ConfigVersion.cmake\nsrc/wayland-pointer-constraints-unstable-v1-client-protocol.h\nsrc/wayland-pointer-constraints-unstable-v1-protocol.c\nsrc/wayland-relative-pointer-unstable-v1-client-protocol.h\nsrc/wayland-relative-pointer-unstable-v1-protocol.c\n\n# Compiled binaries\nsrc/libglfw.so\nsrc/libglfw.so.3\nsrc/libglfw.so.3.3\nsrc/libglfw.dylib\nsrc/libglfw.dylib\nsrc/libglfw.3.dylib\nsrc/libglfw.3.3.dylib\nsrc/libglfw3.a\nsrc/glfw3.lib\nsrc/glfw3.dll\nsrc/glfw3dll.lib\nsrc/libglfw3dll.a\nexamples/*.app\nexamples/*.exe\nexamples/boing\nexamples/gears\nexamples/heightmap\nexamples/offscreen\nexamples/particles\nexamples/splitview\nexamples/simple\nexamples/wave\ntests/*.app\ntests/*.exe\ntests/clipboard\ntests/cursor\ntests/empty\ntests/events\ntests/gamma\ntests/glfwinfo\ntests/icon\ntests/iconify\ntests/joysticks\ntests/monitors\ntests/msaa\ntests/reopen\ntests/sharing\ntests/tearing\ntests/threads\ntests/timeout\ntests/title\ntests/vulkan\ntests/windows\n\n"
  },
  {
    "path": "external/GLFW/.travis.yml",
    "content": "language: c\ncompiler: clang\nbranches:\n    only:\n        - ci\n        - master\nos:\n    - linux\n    - osx\nsudo: false\ndist: trusty\naddons:\n    apt:\n        sources:\n            - kubuntu-backports\n        packages:\n            - cmake\n            - libxrandr-dev\n            - libxinerama-dev\n            - libxcursor-dev\n            - libxi-dev\nenv:\n    global:\n        - CFLAGS=-Werror\n    matrix:\n        - BUILD_SHARED_LIBS=ON\n        - BUILD_SHARED_LIBS=OFF\nscript:\n    - mkdir build\n    - cd build\n    - cmake -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} ..\n    - cmake --build .\nnotifications:\n    email:\n        recipients:\n            - ci@glfw.org\n    on_success: never\n    on_failure: always\n"
  },
  {
    "path": "external/GLFW/CMake/GenerateMappings.cmake",
    "content": "# Usage:\n# cmake -P GenerateMappings.cmake <path/to/mappings.h.in> <path/to/mappings.h>\n\nset(source_url \"https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt\")\nset(source_path \"${CMAKE_CURRENT_BINARY_DIR}/gamecontrollerdb.txt\")\nset(template_path \"${CMAKE_ARGV3}\")\nset(target_path \"${CMAKE_ARGV4}\")\n\nif (NOT EXISTS \"${template_path}\")\n    message(FATAL_ERROR \"Failed to find template file ${template_path}\")\nendif()\n\nfile(DOWNLOAD \"${source_url}\" \"${source_path}\"\n     STATUS download_status\n     TLS_VERIFY on)\n\nlist(GET download_status 0 status_code)\nlist(GET download_status 1 status_message)\n\nif (status_code)\n    message(FATAL_ERROR \"Failed to download ${source_url}: ${status_message}\")\nendif()\n\nfile(STRINGS \"${source_path}\" lines)\nforeach(line ${lines})\n    if (\"${line}\" MATCHES \"^[0-9a-fA-F].*$\")\n        set(GLFW_GAMEPAD_MAPPINGS \"${GLFW_GAMEPAD_MAPPINGS}\\\"${line}\\\\n\\\"\\n\")\n    endif()\nendforeach()\n\nconfigure_file(\"${template_path}\" \"${target_path}\" @ONLY NEWLINE_STYLE UNIX)\nfile(REMOVE \"${source_path}\")\n\n"
  },
  {
    "path": "external/GLFW/CMake/MacOSXBundleInfo.plist.in",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>\n\t<key>CFBundleGetInfoString</key>\n\t<string>${MACOSX_BUNDLE_INFO_STRING}</string>\n\t<key>CFBundleIconFile</key>\n\t<string>${MACOSX_BUNDLE_ICON_FILE}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleLongVersionString</key>\n\t<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>\n\t<key>CFBundleName</key>\n\t<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>\n\t<key>CSResourcesFileMapped</key>\n\t<true/>\n\t<key>LSRequiresCarbon</key>\n\t<true/>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>${MACOSX_BUNDLE_COPYRIGHT}</string>\n\t<key>NSHighResolutionCapable</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "external/GLFW/CMake/amd64-mingw32msvc.cmake",
    "content": "# Define the environment for cross compiling from Linux to Win64\nSET(CMAKE_SYSTEM_NAME    Windows)\nSET(CMAKE_SYSTEM_VERSION 1)\nSET(CMAKE_C_COMPILER     \"amd64-mingw32msvc-gcc\")\nSET(CMAKE_CXX_COMPILER   \"amd64-mingw32msvc-g++\")\nSET(CMAKE_RC_COMPILER    \"amd64-mingw32msvc-windres\")\nSET(CMAKE_RANLIB         \"amd64-mingw32msvc-ranlib\")\n\n# Configure the behaviour of the find commands \nSET(CMAKE_FIND_ROOT_PATH \"/usr/amd64-mingw32msvc\")\nSET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\nSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nSET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\n"
  },
  {
    "path": "external/GLFW/CMake/i586-mingw32msvc.cmake",
    "content": "# Define the environment for cross compiling from Linux to Win32\nSET(CMAKE_SYSTEM_NAME    Windows)\nSET(CMAKE_SYSTEM_VERSION 1)\nSET(CMAKE_C_COMPILER     \"i586-mingw32msvc-gcc\")\nSET(CMAKE_CXX_COMPILER   \"i586-mingw32msvc-g++\")\nSET(CMAKE_RC_COMPILER    \"i586-mingw32msvc-windres\")\nSET(CMAKE_RANLIB         \"i586-mingw32msvc-ranlib\")\n\n# Configure the behaviour of the find commands \nSET(CMAKE_FIND_ROOT_PATH \"/usr/i586-mingw32msvc\")\nSET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\nSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nSET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\n"
  },
  {
    "path": "external/GLFW/CMake/i686-pc-mingw32.cmake",
    "content": "# Define the environment for cross compiling from Linux to Win32\nSET(CMAKE_SYSTEM_NAME    Windows) # Target system name\nSET(CMAKE_SYSTEM_VERSION 1)\nSET(CMAKE_C_COMPILER     \"i686-pc-mingw32-gcc\")\nSET(CMAKE_CXX_COMPILER   \"i686-pc-mingw32-g++\")\nSET(CMAKE_RC_COMPILER    \"i686-pc-mingw32-windres\")\nSET(CMAKE_RANLIB         \"i686-pc-mingw32-ranlib\")\n\n#Configure the behaviour of the find commands \nSET(CMAKE_FIND_ROOT_PATH \"/opt/mingw/usr/i686-pc-mingw32\")\nSET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\nSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nSET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\n"
  },
  {
    "path": "external/GLFW/CMake/i686-w64-mingw32.cmake",
    "content": "# Define the environment for cross compiling from Linux to Win32\nSET(CMAKE_SYSTEM_NAME    Windows) # Target system name\nSET(CMAKE_SYSTEM_VERSION 1)\nSET(CMAKE_C_COMPILER     \"i686-w64-mingw32-gcc\")\nSET(CMAKE_CXX_COMPILER   \"i686-w64-mingw32-g++\")\nSET(CMAKE_RC_COMPILER    \"i686-w64-mingw32-windres\")\nSET(CMAKE_RANLIB         \"i686-w64-mingw32-ranlib\")\n\n# Configure the behaviour of the find commands \nSET(CMAKE_FIND_ROOT_PATH \"/usr/i686-w64-mingw32\")\nSET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\nSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nSET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\n"
  },
  {
    "path": "external/GLFW/CMake/modules/FindMir.cmake",
    "content": "# FindMir\n# -------\n# Finds the Mir library\n#\n# This will will define the following variables::\n#\n# MIR_FOUND        - the system has Mir\n# MIR_INCLUDE_DIRS - the Mir include directory\n# MIR_LIBRARIES    - the Mir libraries\n# MIR_DEFINITIONS  - the Mir definitions\n\n\nfind_package (PkgConfig)\nif(PKG_CONFIG_FOUND)\n  pkg_check_modules (PC_MIR mirclient>=0.26.2 QUIET)\n\n  find_path(MIR_INCLUDE_DIR NAMES mir_toolkit/mir_client_library.h\n                            PATHS ${PC_MIR_INCLUDE_DIRS})\n\n  find_library(MIR_LIBRARY NAMES mirclient\n                           PATHS ${PC_MIR_LIBRARIES} ${PC_MIR_LIBRARY_DIRS})\n\n  include (FindPackageHandleStandardArgs)\n  find_package_handle_standard_args (MIR\n                                     REQUIRED_VARS MIR_LIBRARY MIR_INCLUDE_DIR)\n\n  if (MIR_FOUND)\n    set(MIR_LIBRARIES ${MIR_LIBRARY})\n    set(MIR_INCLUDE_DIRS ${PC_MIR_INCLUDE_DIRS})\n    set(MIR_DEFINITIONS -DHAVE_MIR=1)\n  endif()\n\n  mark_as_advanced (MIR_LIBRARY MIR_INCLUDE_DIR)\nendif()\n"
  },
  {
    "path": "external/GLFW/CMake/modules/FindOSMesa.cmake",
    "content": "# Try to find OSMesa on a Unix system\n#\n# This will define:\n#\n#   OSMESA_LIBRARIES   - Link these to use OSMesa\n#   OSMESA_INCLUDE_DIR - Include directory for OSMesa\n#\n# Copyright (c) 2014 Brandon Schaefer <brandon.schaefer@canonical.com>\n\nif (NOT WIN32)\n\n  find_package (PkgConfig)\n  pkg_check_modules (PKG_OSMESA QUIET osmesa)\n\n  set (OSMESA_INCLUDE_DIR ${PKG_OSMESA_INCLUDE_DIRS})\n  set (OSMESA_LIBRARIES   ${PKG_OSMESA_LIBRARIES})\n\nendif ()\n"
  },
  {
    "path": "external/GLFW/CMake/modules/FindVulkan.cmake",
    "content": "# Find Vulkan\n#\n# VULKAN_INCLUDE_DIR\n# VULKAN_LIBRARY\n# VULKAN_FOUND\n\nif (WIN32)\n    find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS\n        \"$ENV{VULKAN_SDK}/Include\"\n        \"$ENV{VK_SDK_PATH}/Include\")\n    if (CMAKE_SIZEOF_VOID_P EQUAL 8)\n        find_library(VULKAN_LIBRARY NAMES vulkan-1 HINTS\n            \"$ENV{VULKAN_SDK}/Lib\"\n            \"$ENV{VULKAN_SDK}/Bin\"\n            \"$ENV{VK_SDK_PATH}/Bin\")\n        find_library(VULKAN_STATIC_LIBRARY NAMES vkstatic.1 HINTS\n            \"$ENV{VULKAN_SDK}/Lib\"\n            \"$ENV{VULKAN_SDK}/Bin\"\n            \"$ENV{VK_SDK_PATH}/Bin\")\n    else()\n        find_library(VULKAN_LIBRARY NAMES vulkan-1 HINTS\n            \"$ENV{VULKAN_SDK}/Lib32\"\n            \"$ENV{VULKAN_SDK}/Bin32\"\n            \"$ENV{VK_SDK_PATH}/Bin32\")\n        find_library(VULKAN_STATIC_LIBRARY NAMES vkstatic.1 HINTS\n            \"$ENV{VULKAN_SDK}/Lib32\"\n            \"$ENV{VULKAN_SDK}/Bin32\"\n            \"$ENV{VK_SDK_PATH}/Bin32\")\n    endif()\nelseif (APPLE)\n    set(CMAKE_FIND_FRAMEWORK NEVER)\n    find_library(VULKAN_LIBRARY MoltenVK)\n    set(CMAKE_FIND_FRAMEWORK ONLY)\n    find_library(VULKAN_STATIC_LIBRARY MoltenVK)\n    find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS\n        \"${VULKAN_LIBRARY}/Headers\")\nelse()\n    find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS\n        \"$ENV{VULKAN_SDK}/include\")\n    find_library(VULKAN_LIBRARY NAMES vulkan HINTS\n        \"$ENV{VULKAN_SDK}/lib\")\nendif()\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Vulkan DEFAULT_MSG VULKAN_LIBRARY VULKAN_INCLUDE_DIR)\n\nmark_as_advanced(VULKAN_INCLUDE_DIR VULKAN_LIBRARY VULKAN_STATIC_LIBRARY)\n\n"
  },
  {
    "path": "external/GLFW/CMake/modules/FindWaylandProtocols.cmake",
    "content": "find_package(PkgConfig)\n\npkg_check_modules(WaylandProtocols QUIET wayland-protocols>=${WaylandProtocols_FIND_VERSION})\n\nexecute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=pkgdatadir wayland-protocols\n                OUTPUT_VARIABLE WaylandProtocols_PKGDATADIR\n                RESULT_VARIABLE _pkgconfig_failed)\nif (_pkgconfig_failed)\n    message(FATAL_ERROR \"Missing wayland-protocols pkgdatadir\")\nendif()\n\nstring(REGEX REPLACE \"[\\r\\n]\" \"\" WaylandProtocols_PKGDATADIR \"${WaylandProtocols_PKGDATADIR}\")\n\nfind_package_handle_standard_args(WaylandProtocols\n    FOUND_VAR\n        WaylandProtocols_FOUND\n    REQUIRED_VARS\n        WaylandProtocols_PKGDATADIR\n    VERSION_VAR\n        WaylandProtocols_VERSION\n    HANDLE_COMPONENTS\n)\n\nset(WAYLAND_PROTOCOLS_FOUND ${WaylandProtocols_FOUND})\nset(WAYLAND_PROTOCOLS_PKGDATADIR ${WaylandProtocols_PKGDATADIR})\nset(WAYLAND_PROTOCOLS_VERSION ${WaylandProtocols_VERSION})\n"
  },
  {
    "path": "external/GLFW/CMake/modules/FindXKBCommon.cmake",
    "content": "# - Try to find XKBCommon\n# Once done, this will define\n#\n#   XKBCOMMON_FOUND - System has XKBCommon\n#   XKBCOMMON_INCLUDE_DIRS - The XKBCommon include directories\n#   XKBCOMMON_LIBRARIES - The libraries needed to use XKBCommon\n#   XKBCOMMON_DEFINITIONS - Compiler switches required for using XKBCommon\n\nfind_package(PkgConfig)\npkg_check_modules(PC_XKBCOMMON QUIET xkbcommon)\nset(XKBCOMMON_DEFINITIONS ${PC_XKBCOMMON_CFLAGS_OTHER})\n\nfind_path(XKBCOMMON_INCLUDE_DIR\n    NAMES xkbcommon/xkbcommon.h\n    HINTS ${PC_XKBCOMMON_INCLUDE_DIR} ${PC_XKBCOMMON_INCLUDE_DIRS}\n)\n\nfind_library(XKBCOMMON_LIBRARY\n    NAMES xkbcommon\n    HINTS ${PC_XKBCOMMON_LIBRARY} ${PC_XKBCOMMON_LIBRARY_DIRS}\n)\n\nset(XKBCOMMON_LIBRARIES ${XKBCOMMON_LIBRARY})\nset(XKBCOMMON_LIBRARY_DIRS ${XKBCOMMON_LIBRARY_DIRS})\nset(XKBCOMMON_INCLUDE_DIRS ${XKBCOMMON_INCLUDE_DIR})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(XKBCommon DEFAULT_MSG\n    XKBCOMMON_LIBRARY\n    XKBCOMMON_INCLUDE_DIR\n)\n\nmark_as_advanced(XKBCOMMON_LIBRARY XKBCOMMON_INCLUDE_DIR)\n\n"
  },
  {
    "path": "external/GLFW/CMake/x86_64-w64-mingw32.cmake",
    "content": "# Define the environment for cross compiling from Linux to Win32\nSET(CMAKE_SYSTEM_NAME    Windows) # Target system name\nSET(CMAKE_SYSTEM_VERSION 1)\nSET(CMAKE_C_COMPILER     \"x86_64-w64-mingw32-gcc\")\nSET(CMAKE_CXX_COMPILER   \"x86_64-w64-mingw32-g++\")\nSET(CMAKE_RC_COMPILER    \"x86_64-w64-mingw32-windres\")\nSET(CMAKE_RANLIB         \"x86_64-w64-mingw32-ranlib\")\n\n# Configure the behaviour of the find commands \nSET(CMAKE_FIND_ROOT_PATH \"/usr/x86_64-w64-mingw32\")\nSET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\nSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nSET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\n"
  },
  {
    "path": "external/GLFW/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8.12)\n\nproject(GLFW C)\n\nset(CMAKE_LEGACY_CYGWIN_WIN32 OFF)\n\nif (NOT CMAKE_VERSION VERSION_LESS \"3.0\")\n    # Until all major package systems have moved to CMake 3,\n    # we stick with the older INSTALL_NAME_DIR mechanism\n    cmake_policy(SET CMP0042 OLD)\nendif()\n\nif (NOT CMAKE_VERSION VERSION_LESS \"3.1\")\n    cmake_policy(SET CMP0054 NEW)\nendif()\n\nset(GLFW_VERSION_MAJOR \"3\")\nset(GLFW_VERSION_MINOR \"3\")\nset(GLFW_VERSION_PATCH \"0\")\nset(GLFW_VERSION_EXTRA \"\")\nset(GLFW_VERSION \"${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}\")\nset(GLFW_VERSION_FULL \"${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}\")\nset(LIB_SUFFIX \"\" CACHE STRING \"Takes an empty string or 64. Directory where lib will be installed: lib or lib64\")\n\nset_property(GLOBAL PROPERTY USE_FOLDERS ON)\n\noption(BUILD_SHARED_LIBS \"Build shared libraries\" OFF)\noption(GLFW_BUILD_EXAMPLES \"Build the GLFW example programs\" ON)\noption(GLFW_BUILD_TESTS \"Build the GLFW test programs\" ON)\noption(GLFW_BUILD_DOCS \"Build the GLFW documentation\" ON)\noption(GLFW_INSTALL \"Generate installation target\" ON)\noption(GLFW_VULKAN_STATIC \"Use the Vulkan loader statically linked into application\" OFF)\noption(GLFW_DOCUMENT_INTERNALS \"Include internals in documentation\" OFF)\n\nif (UNIX)\n    option(GLFW_USE_OSMESA \"Use OSMesa for offscreen context creation\" OFF)\nendif()\n\nif (WIN32)\n    option(GLFW_USE_HYBRID_HPG \"Force use of high-performance GPU on hybrid systems\" OFF)\nendif()\n\nif (UNIX AND NOT APPLE)\n    option(GLFW_USE_WAYLAND \"Use Wayland for window creation\" OFF)\n    option(GLFW_USE_MIR     \"Use Mir for window creation\" OFF)\nendif()\n\nif (MSVC)\n    option(USE_MSVC_RUNTIME_LIBRARY_DLL \"Use MSVC runtime library DLL\" ON)\nendif()\n\nif (BUILD_SHARED_LIBS)\n    set(_GLFW_BUILD_DLL 1)\nendif()\n\nif (BUILD_SHARED_LIBS AND UNIX)\n    # On Unix-like systems, shared libraries can use the soname system.\n    set(GLFW_LIB_NAME glfw)\nelse()\n    set(GLFW_LIB_NAME glfw3)\nendif()\n\nif (GLFW_VULKAN_STATIC)\n    set(_GLFW_VULKAN_STATIC 1)\nendif()\n\nlist(APPEND CMAKE_MODULE_PATH \"${GLFW_SOURCE_DIR}/CMake/modules\")\n\nfind_package(Threads REQUIRED)\nfind_package(Vulkan)\n\nif (GLFW_BUILD_DOCS)\n    set(DOXYGEN_SKIP_DOT TRUE)\n    find_package(Doxygen)\nendif()\n\n#--------------------------------------------------------------------\n# Set compiler specific flags\n#--------------------------------------------------------------------\nif (MSVC)\n    if (MSVC90)\n        # Workaround for VS 2008 not shipping with the DirectX 9 SDK\n        include(CheckIncludeFile)\n        check_include_file(dinput.h DINPUT_H_FOUND)\n        if (NOT DINPUT_H_FOUND)\n            message(FATAL_ERROR \"DirectX 9 SDK not found\")\n        endif()\n        # Workaround for VS 2008 not shipping with stdint.h\n        list(APPEND glfw_INCLUDE_DIRS \"${GLFW_SOURCE_DIR}/deps/vs2008\")\n    endif()\n\n    if (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)\n        foreach (flag CMAKE_C_FLAGS\n                      CMAKE_C_FLAGS_DEBUG\n                      CMAKE_C_FLAGS_RELEASE\n                      CMAKE_C_FLAGS_MINSIZEREL\n                      CMAKE_C_FLAGS_RELWITHDEBINFO)\n\n            if (${flag} MATCHES \"/MD\")\n                string(REGEX REPLACE \"/MD\" \"/MT\" ${flag} \"${${flag}}\")\n            endif()\n            if (${flag} MATCHES \"/MDd\")\n                string(REGEX REPLACE \"/MDd\" \"/MTd\" ${flag} \"${${flag}}\")\n            endif()\n\n        endforeach()\n    endif()\nendif()\n\nif (MINGW)\n    # Workaround for legacy MinGW not providing XInput and DirectInput\n    include(CheckIncludeFile)\n\n    check_include_file(dinput.h DINPUT_H_FOUND)\n    check_include_file(xinput.h XINPUT_H_FOUND)\n    if (NOT DINPUT_H_FOUND OR NOT XINPUT_H_FOUND)\n        list(APPEND glfw_INCLUDE_DIRS \"${GLFW_SOURCE_DIR}/deps/mingw\")\n    endif()\n\n    # Enable link-time exploit mitigation features enabled by default on MSVC\n    include(CheckCCompilerFlag)\n\n    # Compatibility with data execution prevention (DEP)\n    set(CMAKE_REQUIRED_FLAGS \"-Wl,--nxcompat\")\n    check_c_compiler_flag(\"\" _GLFW_HAS_DEP)\n    if (_GLFW_HAS_DEP)\n        set(CMAKE_SHARED_LINKER_FLAGS \"-Wl,--nxcompat ${CMAKE_SHARED_LINKER_FLAGS}\")\n    endif()\n\n    # Compatibility with address space layout randomization (ASLR)\n    set(CMAKE_REQUIRED_FLAGS \"-Wl,--dynamicbase\")\n    check_c_compiler_flag(\"\" _GLFW_HAS_ASLR)\n    if (_GLFW_HAS_ASLR)\n        set(CMAKE_SHARED_LINKER_FLAGS \"-Wl,--dynamicbase ${CMAKE_SHARED_LINKER_FLAGS}\")\n    endif()\n\n    # Compatibility with 64-bit address space layout randomization (ASLR)\n    set(CMAKE_REQUIRED_FLAGS \"-Wl,--high-entropy-va\")\n    check_c_compiler_flag(\"\" _GLFW_HAS_64ASLR)\n    if (_GLFW_HAS_64ASLR)\n        set(CMAKE_SHARED_LINKER_FLAGS \"-Wl,--high-entropy-va ${CMAKE_SHARED_LINKER_FLAGS}\")\n    endif()\nendif()\n\nif (APPLE)\n    # Dependencies required by the MoltenVK static library\n    set(GLFW_VULKAN_DEPS\n        \"-lc++\"\n        \"-framework Cocoa\"\n        \"-framework Metal\"\n        \"-framework QuartzCore\")\nendif()\n\n#--------------------------------------------------------------------\n# Detect and select backend APIs\n#--------------------------------------------------------------------\nif (GLFW_USE_WAYLAND)\n    set(_GLFW_WAYLAND 1)\n    message(STATUS \"Using Wayland for window creation\")\nelseif (GLFW_USE_MIR)\n    set(_GLFW_MIR 1)\n    message(STATUS \"Using Mir for window creation\")\nelseif (GLFW_USE_OSMESA)\n    set(_GLFW_OSMESA 1)\n    message(STATUS \"Using OSMesa for headless context creation\")\nelseif (WIN32)\n    set(_GLFW_WIN32 1)\n    message(STATUS \"Using Win32 for window creation\")\nelseif (APPLE)\n    set(_GLFW_COCOA 1)\n    message(STATUS \"Using Cocoa for window creation\")\nelseif (UNIX)\n    set(_GLFW_X11 1)\n    message(STATUS \"Using X11 for window creation\")\nelse()\n    message(FATAL_ERROR \"No supported platform was detected\")\nendif()\n\n#--------------------------------------------------------------------\n# Add Vulkan static library if requested\n#--------------------------------------------------------------------\nif (GLFW_VULKAN_STATIC)\n    if (VULKAN_FOUND AND VULKAN_STATIC_LIBRARY)\n        list(APPEND glfw_LIBRARIES \"${VULKAN_STATIC_LIBRARY}\" ${GLFW_VULKAN_DEPS})\n        if (BUILD_SHARED_LIBS)\n            message(WARNING \"Linking Vulkan loader static library into GLFW\")\n        endif()\n    else()\n        if (BUILD_SHARED_LIBS OR GLFW_BUILD_EXAMPLES OR GLFW_BUILD_TESTS)\n            message(FATAL_ERROR \"Vulkan loader static library not found\")\n        else()\n            message(WARNING \"Vulkan loader static library not found\")\n        endif()\n    endif()\nendif()\n\n#--------------------------------------------------------------------\n# Find and add Unix math and time libraries\n#--------------------------------------------------------------------\nif (UNIX AND NOT APPLE)\n    find_library(RT_LIBRARY rt)\n    mark_as_advanced(RT_LIBRARY)\n    if (RT_LIBRARY)\n        list(APPEND glfw_LIBRARIES \"${RT_LIBRARY}\")\n        list(APPEND glfw_PKG_LIBS \"-lrt\")\n    endif()\n\n    find_library(MATH_LIBRARY m)\n    mark_as_advanced(MATH_LIBRARY)\n    if (MATH_LIBRARY)\n        list(APPEND glfw_LIBRARIES \"${MATH_LIBRARY}\")\n        list(APPEND glfw_PKG_LIBS \"-lm\")\n    endif()\n\n    if (CMAKE_DL_LIBS)\n        list(APPEND glfw_LIBRARIES \"${CMAKE_DL_LIBS}\")\n        list(APPEND glfw_PKG_LIBS \"-l${CMAKE_DL_LIBS}\")\n    endif()\nendif()\n\n#--------------------------------------------------------------------\n# Use Win32 for window creation\n#--------------------------------------------------------------------\nif (_GLFW_WIN32)\n\n    list(APPEND glfw_PKG_LIBS \"-lgdi32\")\n\n    if (GLFW_USE_HYBRID_HPG)\n        set(_GLFW_USE_HYBRID_HPG 1)\n    endif()\nendif()\n\n#--------------------------------------------------------------------\n# Use X11 for window creation\n#--------------------------------------------------------------------\nif (_GLFW_X11)\n\n    find_package(X11 REQUIRED)\n\n    list(APPEND glfw_PKG_DEPS \"x11\")\n\n    # Set up library and include paths\n    list(APPEND glfw_INCLUDE_DIRS \"${X11_X11_INCLUDE_PATH}\")\n    list(APPEND glfw_LIBRARIES \"${X11_X11_LIB}\" \"${CMAKE_THREAD_LIBS_INIT}\")\n\n    # Check for XRandR (modern resolution switching and gamma control)\n    if (NOT X11_Xrandr_FOUND)\n        message(FATAL_ERROR \"The RandR headers were not found\")\n    endif()\n\n    # Check for Xinerama (legacy multi-monitor support)\n    if (NOT X11_Xinerama_FOUND)\n        message(FATAL_ERROR \"The Xinerama headers were not found\")\n    endif()\n\n    # Check for Xkb (X keyboard extension)\n    if (NOT X11_Xkb_FOUND)\n        message(FATAL_ERROR \"The X keyboard extension headers were not found\")\n    endif()\n\n    # Check for Xcursor (cursor creation from RGBA images)\n    if (NOT X11_Xcursor_FOUND)\n        message(FATAL_ERROR \"The Xcursor headers were not found\")\n    endif()\n\n    list(APPEND glfw_INCLUDE_DIRS \"${X11_Xrandr_INCLUDE_PATH}\"\n                                  \"${X11_Xinerama_INCLUDE_PATH}\"\n                                  \"${X11_Xkb_INCLUDE_PATH}\"\n                                  \"${X11_Xcursor_INCLUDE_PATH}\")\nendif()\n\n#--------------------------------------------------------------------\n# Use Wayland for window creation\n#--------------------------------------------------------------------\nif (_GLFW_WAYLAND)\n    find_package(ECM REQUIRED NO_MODULE)\n    list(APPEND CMAKE_MODULE_PATH \"${ECM_MODULE_PATH}\")\n\n    find_package(Wayland REQUIRED)\n    find_package(WaylandScanner REQUIRED)\n    find_package(WaylandProtocols 1.1 REQUIRED)\n\n    list(APPEND glfw_PKG_DEPS \"wayland-egl\")\n\n    list(APPEND glfw_INCLUDE_DIRS \"${Wayland_INCLUDE_DIR}\")\n    list(APPEND glfw_LIBRARIES \"${Wayland_LIBRARIES}\" \"${CMAKE_THREAD_LIBS_INIT}\")\n\n    find_package(XKBCommon REQUIRED)\n    list(APPEND glfw_PKG_DEPS \"xkbcommon\")\n    list(APPEND glfw_INCLUDE_DIRS \"${XKBCOMMON_INCLUDE_DIRS}\")\n    list(APPEND glfw_LIBRARIES \"${XKBCOMMON_LIBRARY}\")\nendif()\n\n#--------------------------------------------------------------------\n# Use Mir for window creation\n#--------------------------------------------------------------------\nif (_GLFW_MIR)\n    find_package(Mir REQUIRED)\n    list(APPEND glfw_PKG_DEPS \"mirclient\")\n\n    list(APPEND glfw_INCLUDE_DIRS \"${MIR_INCLUDE_DIRS}\")\n    list(APPEND glfw_LIBRARIES \"${MIR_LIBRARIES}\" \"${CMAKE_THREAD_LIBS_INIT}\")\n\n    find_package(XKBCommon REQUIRED)\n    list(APPEND glfw_PKG_DEPS \"xkbcommon\")\n    list(APPEND glfw_INCLUDE_DIRS \"${XKBCOMMON_INCLUDE_DIRS}\")\n    list(APPEND glfw_LIBRARIES \"${XKBCOMMON_LIBRARY}\")\nendif()\n\n#--------------------------------------------------------------------\n# Use OSMesa for offscreen context creation\n#--------------------------------------------------------------------\nif (_GLFW_OSMESA)\n    find_package(OSMesa REQUIRED)\n    list(APPEND glfw_LIBRARIES \"${CMAKE_THREAD_LIBS_INIT}\")\nendif()\n\n#--------------------------------------------------------------------\n# Use Cocoa for window creation and NSOpenGL for context creation\n#--------------------------------------------------------------------\nif (_GLFW_COCOA)\n\n    list(APPEND glfw_LIBRARIES\n        \"-framework Cocoa\"\n        \"-framework IOKit\"\n        \"-framework CoreFoundation\"\n        \"-framework CoreVideo\")\n\n    set(glfw_PKG_DEPS \"\")\n    set(glfw_PKG_LIBS \"-framework Cocoa -framework IOKit -framework CoreFoundation -framework CoreVideo\")\nendif()\n\n#--------------------------------------------------------------------\n# Export GLFW library dependencies\n#--------------------------------------------------------------------\nforeach(arg ${glfw_PKG_DEPS})\n    set(GLFW_PKG_DEPS \"${GLFW_PKG_DEPS} ${arg}\")\nendforeach()\nforeach(arg ${glfw_PKG_LIBS})\n    set(GLFW_PKG_LIBS \"${GLFW_PKG_LIBS} ${arg}\")\nendforeach()\n\n#--------------------------------------------------------------------\n# Create generated files\n#--------------------------------------------------------------------\ninclude(CMakePackageConfigHelpers)\n\nset(GLFW_CONFIG_PATH \"lib${LIB_SUFFIX}/cmake/glfw3\")\n\nconfigure_package_config_file(src/glfw3Config.cmake.in\n                              src/glfw3Config.cmake\n                              INSTALL_DESTINATION \"${GLFW_CONFIG_PATH}\"\n                              NO_CHECK_REQUIRED_COMPONENTS_MACRO)\n\nwrite_basic_package_version_file(src/glfw3ConfigVersion.cmake\n                                 VERSION ${GLFW_VERSION_FULL}\n                                 COMPATIBILITY SameMajorVersion)\n\nconfigure_file(src/glfw_config.h.in src/glfw_config.h @ONLY)\n\nconfigure_file(src/glfw3.pc.in src/glfw3.pc @ONLY)\n\n#--------------------------------------------------------------------\n# Add subdirectories\n#--------------------------------------------------------------------\nadd_subdirectory(src)\n\nif (GLFW_BUILD_EXAMPLES)\n    add_subdirectory(examples)\nendif()\n\nif (GLFW_BUILD_TESTS)\n    add_subdirectory(tests)\nendif()\n\nif (DOXYGEN_FOUND AND GLFW_BUILD_DOCS)\n    add_subdirectory(docs)\nendif()\n\n#--------------------------------------------------------------------\n# Install files other than the library\n# The library is installed by src/CMakeLists.txt\n#--------------------------------------------------------------------\nif (GLFW_INSTALL)\n    install(DIRECTORY include/GLFW DESTINATION include\n            FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h)\n\n    install(FILES \"${GLFW_BINARY_DIR}/src/glfw3Config.cmake\"\n                  \"${GLFW_BINARY_DIR}/src/glfw3ConfigVersion.cmake\"\n            DESTINATION \"${GLFW_CONFIG_PATH}\")\n\n    install(EXPORT glfwTargets FILE glfw3Targets.cmake\n            EXPORT_LINK_INTERFACE_LIBRARIES\n            DESTINATION \"${GLFW_CONFIG_PATH}\")\n    install(FILES \"${GLFW_BINARY_DIR}/src/glfw3.pc\"\n            DESTINATION \"lib${LIB_SUFFIX}/pkgconfig\")\n\n    # Only generate this target if no higher-level project already has\n    if (NOT TARGET uninstall)\n        configure_file(cmake_uninstall.cmake.in\n                       cmake_uninstall.cmake IMMEDIATE @ONLY)\n\n        add_custom_target(uninstall\n                          \"${CMAKE_COMMAND}\" -P\n                          \"${GLFW_BINARY_DIR}/cmake_uninstall.cmake\")\n    endif()\nendif()\n\n"
  },
  {
    "path": "external/GLFW/LICENSE.md",
    "content": "Copyright (c) 2002-2006 Marcus Geelnard  \nCopyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would\n   be appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not\n   be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\n   distribution.\n\n"
  },
  {
    "path": "external/GLFW/README.md",
    "content": "# GLFW\n\n[![Build status](https://travis-ci.org/glfw/glfw.svg?branch=master)](https://travis-ci.org/glfw/glfw)\n[![Build status](https://ci.appveyor.com/api/projects/status/0kf0ct9831i5l6sp/branch/master?svg=true)](https://ci.appveyor.com/project/elmindreda/glfw)\n[![Coverity Scan](https://scan.coverity.com/projects/4884/badge.svg)](https://scan.coverity.com/projects/glfw-glfw)\n\n## Introduction\n\nGLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan\napplication development.  It provides a simple, platform-independent API for\ncreating windows, contexts and surfaces, reading input, handling events, etc.\n\nGLFW natively supports Windows, macOS and Linux and other Unix-like systems.\nExperimental implementations for the Wayland protocol and the Mir display server\nare available but not yet officially supported.                             \n\nGLFW is licensed under the [zlib/libpng\nlicense](http://www.glfw.org/license.html).\n\nThe latest stable release is version 3.2.1.\n\nSee the [downloads](http://www.glfw.org/download.html) page for details and\nfiles, or fetch the `latest` branch, which always points to the latest stable\nrelease.  Each release starting with 3.0 also has a corresponding [annotated\ntag](https://github.com/glfw/glfw/releases) with source and binary archives.\nThe [version history](http://www.glfw.org/changelog.html) lists all user-visible\nchanges for every release.\n\nThis is a development branch for version 3.3, which is _not yet described_.\nPre-release documentation is available [here](http://www.glfw.org/docs/3.3/).\n\nThe `master` branch is the stable integration branch and _should_ always compile\nand run on all supported platforms, although details of newly added features may\nchange until they have been included in a release.  New features and many bug\nfixes live in [other branches](https://github.com/glfw/glfw/branches/all) until\nthey are stable enough to merge.\n\nIf you are new to GLFW, you may find the\n[tutorial](http://www.glfw.org/docs/latest/quick.html) for GLFW 3 useful.  If\nyou have used GLFW 2 in the past, there is a [transition\nguide](http://www.glfw.org/docs/latest/moving.html) for moving to the GLFW\n3 API.\n\n\n## Compiling GLFW\n\nGLFW itself requires only the headers and libraries for your window system.  It\ndoes not need the headers for any context creation API (WGL, GLX, EGL, NSGL,\nOSMesa) or rendering API (OpenGL, OpenGL ES, Vulkan) to enable support for them.\n\nGLFW supports compilation on Windows with Visual C++ 2010 and later, MinGW and\nMinGW-w64, on macOS with Clang and on Linux and other Unix-like systems with GCC\nand Clang.  It will likely compile in other environments as well, but this is\nnot regularly tested.\n\nThere are [pre-compiled Windows binaries](http://www.glfw.org/download.html)\navailable for all supported compilers.\n\nSee the [compilation guide](http://www.glfw.org/docs/latest/compile.html) for\nmore information about how to compile GLFW yourself.\n\n\n## Using GLFW\n\nSee the [documentation](http://www.glfw.org/docs/latest/) for tutorials, guides\nand the API reference.\n\n\n## Contributing to GLFW\n\nSee the [contribution\nguide](https://github.com/glfw/glfw/blob/master/.github/CONTRIBUTING.md) for\nmore information.\n\n\n## System requirements\n\nGLFW supports Windows XP and later and macOS 10.7 and later.  Linux and other\nUnix-like systems running the X Window System are supported even without\na desktop environment or modern extensions, although some features require\na running window or clipboard manager.  The OSMesa backend requires Mesa 6.3.\n\nSee the [compatibility guide](http://www.glfw.org/docs/latest/compat.html)\nin the documentation for more information.\n\n\n## Dependencies\n\nGLFW itself depends only on the headers and libraries for your window system.\n\nThe (experimental) Wayland backend also depends on the `extra-cmake-modules`\npackage, which is used to generated Wayland protocol headers.\n\nThe examples and test programs depend on a number of tiny libraries.  These are\nlocated in the `deps/` directory.\n\n - [getopt\\_port](https://github.com/kimgr/getopt_port/) for examples\n   with command-line options\n - [TinyCThread](https://github.com/tinycthread/tinycthread) for threaded\n   examples\n - An OpenGL 3.2 core loader generated by\n   [glad](https://github.com/Dav1dde/glad) for examples using modern OpenGL\n - [linmath.h](https://github.com/datenwolf/linmath.h) for linear algebra in\n   examples\n - [Nuklear](https://github.com/vurtun/nuklear) for test and example UI\n - [stb\\_image\\_write](https://github.com/nothings/stb) for writing images to disk\n - [Vulkan headers](https://www.khronos.org/registry/vulkan/) for Vulkan tests\n\nThe Vulkan example additionally requires the Vulkan SDK to be installed, or it\nwill not be included in the build.  On macOS you need to provide the path to the\nMoltenVK SDK manually as it has no standard installation location.\n\nThe documentation is generated with [Doxygen](http://doxygen.org/) if CMake can\nfind that tool.\n\n\n## Reporting bugs\n\nBugs are reported to our [issue tracker](https://github.com/glfw/glfw/issues).\nPlease check the [contribution\nguide](https://github.com/glfw/glfw/blob/master/.github/CONTRIBUTING.md) for\ninformation on what to include when reporting a bug.\n\n\n## Changelog\n\n- Added `glfwGetError` function for querying the last error code and its\n  description (#970)\n- Added `glfwUpdateGamepadMappings` function for importing gamepad mappings in\n  SDL\\_GameControllerDB format (#900)\n- Added `glfwJoystickIsGamepad` function for querying whether a joystick has\n  a gamepad mapping (#900)\n- Added `glfwGetJoystickGUID` function for querying the SDL compatible GUID of\n  a joystick (#900)\n- Added `glfwGetGamepadName` function for querying the name provided by the\n  gamepad mapping (#900)\n- Added `glfwGetGamepadState` function, `GLFW_GAMEPAD_*` and `GLFWgamepadstate`\n  for retrieving gamepad input state (#900)\n- Added `glfwRequestWindowAttention` function for requesting attention from the\n  user (#732,#988)\n- Added `glfwGetKeyScancode` function that allows retrieving platform dependent\n  scancodes for keys (#830)\n- Added `glfwSetWindowMaximizeCallback` and `GLFWwindowmaximizefun` for\n  receiving window maximization events (#778)\n- Added `glfwSetWindowAttrib` function for changing window attributes (#537)\n- Added `glfwGetJoystickHats` function for querying joystick hats\n  (#889,#906,#934)\n- Added `glfwInitHint` and `glfwInitHintString` for setting initialization hints\n- Added `glfwGetX11SelectionString` and `glfwSetX11SelectionString`\n  functions for accessing X11 primary selection (#894,#1056)\n- Added headless [OSMesa](http://mesa3d.org/osmesa.html) backend (#850)\n- Added definition of `GLAPIENTRY` to public header\n- Added `GLFW_TRANSPARENT` window hint for enabling window framebuffer\n  transparency (#197,#663,#715,#723,#1078)\n- Added `GLFW_CENTER_CURSOR` window hint for controlling cursor centering\n  (#749,#842)\n- Added `GLFW_JOYSTICK_HAT_BUTTONS` init hint (#889)\n- Added macOS specific `GLFW_COCOA_RETINA_FRAMEBUFFER` window hint\n- Added macOS specific `GLFW_COCOA_FRAME_AUTOSAVE` window hint (#195)\n- Added macOS specific `GLFW_COCOA_GRAPHICS_SWITCHING` window hint (#377,#935)\n- Added macOS specific `GLFW_COCOA_CHDIR_RESOURCES` init hint\n- Added macOS specific `GLFW_COCOA_MENUBAR` init hint\n- Added X11 specific `GLFW_X11_WM_CLASS_NAME` and `GLFW_X11_WM_CLASS_CLASS` init\n  hints (#893)\n- Added `GLFW_INCLUDE_ES32` for including the OpenGL ES 3.2 header\n- Added `GLFW_OSMESA_CONTEXT_API` for creating OpenGL contexts with\n  [OSMesa](https://www.mesa3d.org/osmesa.html) (#281)\n- Added `GenerateMappings.cmake` script for updating gamepad mappings\n- Removed `GLFW_USE_RETINA` compile-time option\n- Removed `GLFW_USE_CHDIR` compile-time option\n- Removed `GLFW_USE_MENUBAR` compile-time option\n- Bugfix: Calling `glfwMaximizeWindow` on a full screen window was not ignored\n- Bugfix: `GLFW_INCLUDE_VULKAN` could not be combined with the corresponding\n          OpenGL and OpenGL ES header macros\n- Bugfix: `glfwGetInstanceProcAddress` returned `NULL` for\n          `vkGetInstanceProcAddr` when `_GLFW_VULKAN_STATIC` was enabled\n- Bugfix: Invalid library paths were used in test and example CMake files (#930)\n- Bugfix: The scancode for synthetic key release events was always zero\n- Bugfix: The generated Doxyfile did not handle paths with spaces (#1081)\n- [Win32] Added system error strings to relevant GLFW error descriptions (#733)\n- [Win32] Moved to `WM_INPUT` for disabled cursor mode motion input (#125)\n- [Win32] Removed XInput circular deadzone from joystick axis data (#1045)\n- [Win32] Bugfix: Undecorated windows could not be iconified by the user (#861)\n- [Win32] Bugfix: Deadzone logic could underflow with some controllers (#910)\n- [Win32] Bugfix: Bitness test in `FindVulkan.cmake` was VS specific (#928)\n- [Win32] Bugfix: `glfwVulkanSupported` emitted an error on systems with\n                  a loader but no ICD (#916)\n- [Win32] Bugfix: Non-iconified full sreeen windows did not prevent screen\n                  blanking or password enabled screensavers (#851)\n- [Win32] Bugfix: Mouse capture logic lost secondary release messages (#954)\n- [Win32] Bugfix: The 32-bit Vulkan loader library static was not searched for\n- [Win32] Bugfix: Vulkan libraries have a new path as of SDK 1.0.42.0 (#956)\n- [Win32] Bugfix: Monitors with no display devices were not enumerated (#960)\n- [Win32] Bugfix: Monitor events were not emitted (#784)\n- [Win32] Bugfix: The Cygwin DLL was installed to the wrong directory (#1035)\n- [Win32] Bugfix: Normalization of axis data via XInput was incorrect (#1045)\n- [Win32] Bugfix: `glfw3native.h` would undefine a foreign `APIENTRY` (#1062)\n- [Win32] Bugfix: Disabled cursor mode prevented use of caption buttons\n                  (#650,#1071)\n- [Win32] Bugfix: Returned key names did not match other platforms (#943)\n- [X11] Moved to XI2 `XI_RawMotion` for disable cursor mode motion input (#125)\n- [X11] Replaced `_GLFW_HAS_XF86VM` compile-time option with dynamic loading\n- [X11] Bugfix: `glfwGetVideoMode` would segfault on Cygwin/X\n- [X11] Bugfix: Dynamic X11 library loading did not use full sonames (#941)\n- [X11] Bugfix: Window creation on 64-bit would read past top of stack (#951)\n- [X11] Bugfix: XDND support had multiple non-conformance issues (#968)\n- [X11] Bugfix: The RandR monitor path was disabled despite working RandR (#972)\n- [X11] Bugfix: IM-duplicated key events would leak at low polling rates (#747)\n- [X11] Bugfix: Gamma ramp setting via RandR did not validate ramp size\n- [X11] Bugfix: Key name string encoding depended on current locale (#981,#983)\n- [X11] Bugfix: Incremental reading of selections was not supported (#275)\n- [X11] Bugfix: Selection I/O reported but did not support `COMPOUND_TEXT`\n- [X11] Bugfix: Latin-1 text read from selections was not converted to UTF-8\n- [Linux] Moved to evdev for joystick input (#906,#1005)\n- [Linux] Bugfix: Event processing did not detect joystick disconnection (#932)\n- [Linux] Bugfix: The joystick device path could be truncated (#1025)\n- [Linux] Bugfix: `glfwInit` would fail if inotify creation failed (#833)\n- [Linux] Bugfix: `strdup` was used without any required feature macro (#1055)\n- [Cocoa] Added support for Vulkan window surface creation via\n          [MoltenVK](https://moltengl.com/moltenvk/) (#870)\n- [Cocoa] Added support for loading a `MainMenu.nib` when available\n- [Cocoa] Bugfix: Disabling window aspect ratio would assert (#852)\n- [Cocoa] Bugfix: Window creation failed to set first responder (#876,#883)\n- [Cocoa] Bugfix: Removed use of deprecated `CGDisplayIOServicePort` function\n                  (#165,#192,#508,#511)\n- [Cocoa] Bugfix: Disabled use of deprecated `CGDisplayModeCopyPixelEncoding`\n                  function on macOS 10.12+\n- [Cocoa] Bugfix: Running in AppSandbox would emit warnings (#816,#882)\n- [Cocoa] Bugfix: Windows created after the first were not cascaded (#195)\n- [Cocoa] Bugfix: Leaving video mode with `glfwSetWindowMonitor` would set\n                  incorrect position and size (#748)\n- [Cocoa] Bugfix: Iconified full screen windows could not be restored (#848)\n- [Cocoa] Bugfix: Value range was ignored for joystick hats and buttons (#888)\n- [Cocoa] Bugfix: Full screen framebuffer was incorrectly sized for some video\n                  modes (#682)\n- [Cocoa] Bugfix: A string object for IME was updated non-idiomatically (#1050)\n- [Cocoa] Bugfix: A hidden or disabled cursor would become visible when a user\n                  notification was shown (#971,#1028)\n- [Cocoa] Bugfix: Some characters did not repeat due to Press and Hold (#1010)\n- [Cocoa] Bugfix: Window title was lost when full screen or undecorated (#1082)\n- [WGL] Added support for `WGL_EXT_colorspace` for OpenGL ES contexts\n- [WGL] Added support for `WGL_ARB_create_context_no_error`\n- [GLX] Added support for `GLX_ARB_create_context_no_error`\n- [GLX] Bugfix: Context creation could segfault if no GLXFBConfigs were\n                available (#1040)\n- [EGL] Added support for `EGL_KHR_get_all_proc_addresses` (#871)\n- [EGL] Added support for `EGL_KHR_context_flush_control`\n- [EGL] Bugfix: The test for `EGL_RGB_BUFFER` was invalid\n\n\n## Contact\n\nOn [glfw.org](http://www.glfw.org/) you can find the latest version of GLFW, as\nwell as news, documentation and other information about the project.\n\nIf you have questions related to the use of GLFW, we have a\n[forum](http://discourse.glfw.org/), and the `#glfw` IRC channel on\n[Freenode](http://freenode.net/).\n\nIf you have a bug to report, a patch to submit or a feature you'd like to\nrequest, please file it in the\n[issue tracker](https://github.com/glfw/glfw/issues) on GitHub.\n\nFinally, if you're interested in helping out with the development of GLFW or\nporting it to your favorite platform, join us on the forum, GitHub or IRC.\n\n\n## Acknowledgements\n\nGLFW exists because people around the world donated their time and lent their\nskills.\n\n - Bobyshev Alexander\n - Matt Arsenault\n - David Avedissian\n - Keith Bauer\n - John Bartholomew\n - Niklas Behrens\n - Niklas Bergström\n - Denis Bernard\n - Doug Binks\n - blanco\n - Kyle Brenneman\n - Rok Breulj\n - Martin Capitanio\n - David Carlier\n - Arturo Castro\n - Chi-kwan Chan\n - Ian Clarkson\n - Michał Cichoń\n - Lambert Clara\n - Yaron Cohen-Tal\n - Omar Cornut\n - Andrew Corrigan\n - Bailey Cosier\n - Noel Cower\n - Jason Daly\n - Jarrod Davis\n - Olivier Delannoy\n - Paul R. Deppe\n - Michael Dickens\n - Роман Донченко\n - Mario Dorn\n - Wolfgang Draxinger\n - Jonathan Dummer\n - Ralph Eastwood\n - Fredrik Ehnbom\n - Robin Eklind\n - Siavash Eliasi\n - Felipe Ferreira\n - Michael Fogleman\n - Gerald Franz\n - Mário Freitas\n - GeO4d\n - Marcus Geelnard\n - Eloi Marín Gratacós\n - Stefan Gustavson\n - Jonathan Hale\n - Sylvain Hellegouarch\n - Matthew Henry\n - heromyth\n - Lucas Hinderberger\n - Paul Holden\n - Warren Hu\n - IntellectualKitty\n - Aaron Jacobs\n - Erik S. V. Jansson\n - Toni Jovanoski\n - Arseny Kapoulkine\n - Cem Karan\n - Osman Keskin\n - Josh Kilmer\n - Cameron King\n - Peter Knut\n - Christoph Kubisch\n - Yuri Kunde Schlesner\n - Konstantin Käfer\n - Eric Larson\n - Robin Leffmann\n - Glenn Lewis\n - Shane Liesegang\n - Eyal Lotem\n - Tristam MacDonald\n - Hans Mackowiak\n - Дмитри Малышев\n - Zbigniew Mandziejewicz\n - Célestin Marot\n - Kyle McDonald\n - David Medlock\n - Bryce Mehring\n - Jonathan Mercier\n - Marcel Metz\n - Liam Middlebrook\n - Jonathan Miller\n - Kenneth Miller\n - Bruce Mitchener\n - Jack Moffitt\n - Jeff Molofee\n - Pierre Morel\n - Jon Morton\n - Pierre Moulon\n - Martins Mozeiko\n - Julian Møller\n - ndogxj\n - Kristian Nielsen\n - Kamil Nowakowski\n - Denis Ovod\n - Ozzy\n - Andri Pálsson\n - Peoro\n - Braden Pellett\n - Christopher Pelloux\n - Arturo J. Pérez\n - Anthony Pesch\n - Orson Peters\n - Emmanuel Gil Peyrot\n - Cyril Pichard\n - Keith Pitt\n - Stanislav Podgorskiy\n - Alexandre Pretyman\n - Philip Rideout\n - Eddie Ringle\n - Jorge Rodriguez\n - Ed Ropple\n - Aleksey Rybalkin\n - Riku Salminen\n - Brandon Schaefer\n - Sebastian Schuberth\n - Christian Sdunek\n - Matt Sealey\n - Steve Sexton\n - Arkady Shapkin\n - Yoshiki Shibukawa\n - Dmitri Shuralyov\n - Daniel Skorupski\n - Bradley Smith\n - Patrick Snape\n - Erlend Sogge Heggen\n - Julian Squires\n - Johannes Stein\n - Pontus Stenetorp\n - Michael Stocker\n - Justin Stoecker\n - Elviss Strazdins\n - Paul Sultana\n - Nathan Sweet\n - TTK-Bandit\n - Sergey Tikhomirov\n - Arthur Tombs\n - Ioannis Tsakpinis\n - Samuli Tuomola\n - Matthew Turner\n - urraka\n - Elias Vanderstuyft\n - Stef Velzel\n - Jari Vetoniemi\n - Ricardo Vieira\n - Nicholas Vitovitch\n - Simon Voordouw\n - Torsten Walluhn\n - Patrick Walton\n - Xo Wang\n - Jay Weisskopf\n - Frank Wille\n - Ryogo Yoshimura\n - Andrey Zholos\n - Santi Zupancic\n - Jonas Ådahl\n - Lasse Öörni\n - All the unmentioned and anonymous contributors in the GLFW community, for bug\n   reports, patches, feedback, testing and encouragement\n\n"
  },
  {
    "path": "external/GLFW/cmake_uninstall.cmake.in",
    "content": "\nif (NOT EXISTS \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\")\n  message(FATAL_ERROR \"Cannot find install manifest: \\\"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\\\"\")\nendif()\n\nfile(READ \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\" files)\nstring(REGEX REPLACE \"\\n\" \";\" files \"${files}\")\n\nforeach (file ${files})\n  message(STATUS \"Uninstalling \\\"$ENV{DESTDIR}${file}\\\"\")\n  if (EXISTS \"$ENV{DESTDIR}${file}\")\n    exec_program(\"@CMAKE_COMMAND@\" ARGS \"-E remove \\\"$ENV{DESTDIR}${file}\\\"\"\n                 OUTPUT_VARIABLE rm_out\n                 RETURN_VALUE rm_retval)\n    if (NOT \"${rm_retval}\" STREQUAL 0)\n      MESSAGE(FATAL_ERROR \"Problem when removing \\\"$ENV{DESTDIR}${file}\\\"\")\n    endif()\n  elseif (IS_SYMLINK \"$ENV{DESTDIR}${file}\")\n    EXEC_PROGRAM(\"@CMAKE_COMMAND@\" ARGS \"-E remove \\\"$ENV{DESTDIR}${file}\\\"\"\n                 OUTPUT_VARIABLE rm_out\n                 RETURN_VALUE rm_retval)\n    if (NOT \"${rm_retval}\" STREQUAL 0)\n      message(FATAL_ERROR \"Problem when removing symlink \\\"$ENV{DESTDIR}${file}\\\"\")\n    endif()\n  else()\n    message(STATUS \"File \\\"$ENV{DESTDIR}${file}\\\" does not exist.\")\n  endif()\nendforeach()\n\n"
  },
  {
    "path": "external/GLFW/deps/KHR/khrplatform.h",
    "content": "#ifndef __khrplatform_h_\n#define __khrplatform_h_\n\n/*\n** Copyright (c) 2008-2009 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n/* Khronos platform-specific types and definitions.\n *\n * $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $\n *\n * Adopters may modify this file to suit their platform. Adopters are\n * encouraged to submit platform specific modifications to the Khronos\n * group so that they can be included in future versions of this file.\n * Please submit changes by sending them to the public Khronos Bugzilla\n * (http://khronos.org/bugzilla) by filing a bug against product\n * \"Khronos (general)\" component \"Registry\".\n *\n * A predefined template which fills in some of the bug fields can be\n * reached using http://tinyurl.com/khrplatform-h-bugreport, but you\n * must create a Bugzilla login first.\n *\n *\n * See the Implementer's Guidelines for information about where this file\n * should be located on your system and for more details of its use:\n *    http://www.khronos.org/registry/implementers_guide.pdf\n *\n * This file should be included as\n *        #include <KHR/khrplatform.h>\n * by Khronos client API header files that use its types and defines.\n *\n * The types in khrplatform.h should only be used to define API-specific types.\n *\n * Types defined in khrplatform.h:\n *    khronos_int8_t              signed   8  bit\n *    khronos_uint8_t             unsigned 8  bit\n *    khronos_int16_t             signed   16 bit\n *    khronos_uint16_t            unsigned 16 bit\n *    khronos_int32_t             signed   32 bit\n *    khronos_uint32_t            unsigned 32 bit\n *    khronos_int64_t             signed   64 bit\n *    khronos_uint64_t            unsigned 64 bit\n *    khronos_intptr_t            signed   same number of bits as a pointer\n *    khronos_uintptr_t           unsigned same number of bits as a pointer\n *    khronos_ssize_t             signed   size\n *    khronos_usize_t             unsigned size\n *    khronos_float_t             signed   32 bit floating point\n *    khronos_time_ns_t           unsigned 64 bit time in nanoseconds\n *    khronos_utime_nanoseconds_t unsigned time interval or absolute time in\n *                                         nanoseconds\n *    khronos_stime_nanoseconds_t signed time interval in nanoseconds\n *    khronos_boolean_enum_t      enumerated boolean type. This should\n *      only be used as a base type when a client API's boolean type is\n *      an enum. Client APIs which use an integer or other type for\n *      booleans cannot use this as the base type for their boolean.\n *\n * Tokens defined in khrplatform.h:\n *\n *    KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.\n *\n *    KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.\n *    KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.\n *\n * Calling convention macros defined in this file:\n *    KHRONOS_APICALL\n *    KHRONOS_APIENTRY\n *    KHRONOS_APIATTRIBUTES\n *\n * These may be used in function prototypes as:\n *\n *      KHRONOS_APICALL void KHRONOS_APIENTRY funcname(\n *                                  int arg1,\n *                                  int arg2) KHRONOS_APIATTRIBUTES;\n */\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APICALL\n *-------------------------------------------------------------------------\n * This precedes the return type of the function in the function prototype.\n */\n#if defined(_WIN32) && !defined(__SCITECH_SNAP__)\n#   define KHRONOS_APICALL __declspec(dllimport)\n#elif defined (__SYMBIAN32__)\n#   define KHRONOS_APICALL IMPORT_C\n#else\n#   define KHRONOS_APICALL\n#endif\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APIENTRY\n *-------------------------------------------------------------------------\n * This follows the return type of the function  and precedes the function\n * name in the function prototype.\n */\n#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)\n    /* Win32 but not WinCE */\n#   define KHRONOS_APIENTRY __stdcall\n#else\n#   define KHRONOS_APIENTRY\n#endif\n\n/*-------------------------------------------------------------------------\n * Definition of KHRONOS_APIATTRIBUTES\n *-------------------------------------------------------------------------\n * This follows the closing parenthesis of the function prototype arguments.\n */\n#if defined (__ARMCC_2__)\n#define KHRONOS_APIATTRIBUTES __softfp\n#else\n#define KHRONOS_APIATTRIBUTES\n#endif\n\n/*-------------------------------------------------------------------------\n * basic type definitions\n *-----------------------------------------------------------------------*/\n#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)\n\n\n/*\n * Using <stdint.h>\n */\n#include <stdint.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(__VMS ) || defined(__sgi)\n\n/*\n * Using <inttypes.h>\n */\n#include <inttypes.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)\n\n/*\n * Win32\n */\ntypedef __int32                 khronos_int32_t;\ntypedef unsigned __int32        khronos_uint32_t;\ntypedef __int64                 khronos_int64_t;\ntypedef unsigned __int64        khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif defined(__sun__) || defined(__digital__)\n\n/*\n * Sun or Digital\n */\ntypedef int                     khronos_int32_t;\ntypedef unsigned int            khronos_uint32_t;\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int                khronos_int64_t;\ntypedef unsigned long int       khronos_uint64_t;\n#else\ntypedef long long int           khronos_int64_t;\ntypedef unsigned long long int  khronos_uint64_t;\n#endif /* __arch64__ */\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#elif 0\n\n/*\n * Hypothetical platform with no float or int64 support\n */\ntypedef int                     khronos_int32_t;\ntypedef unsigned int            khronos_uint32_t;\n#define KHRONOS_SUPPORT_INT64   0\n#define KHRONOS_SUPPORT_FLOAT   0\n\n#else\n\n/*\n * Generic fallback\n */\n#include <stdint.h>\ntypedef int32_t                 khronos_int32_t;\ntypedef uint32_t                khronos_uint32_t;\ntypedef int64_t                 khronos_int64_t;\ntypedef uint64_t                khronos_uint64_t;\n#define KHRONOS_SUPPORT_INT64   1\n#define KHRONOS_SUPPORT_FLOAT   1\n\n#endif\n\n\n/*\n * Types that are (so far) the same on all platforms\n */\ntypedef signed   char          khronos_int8_t;\ntypedef unsigned char          khronos_uint8_t;\ntypedef signed   short int     khronos_int16_t;\ntypedef unsigned short int     khronos_uint16_t;\n\n/*\n * Types that differ between LLP64 and LP64 architectures - in LLP64, \n * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears\n * to be the only LLP64 architecture in current use.\n */\n#ifdef _WIN64\ntypedef signed   long long int khronos_intptr_t;\ntypedef unsigned long long int khronos_uintptr_t;\ntypedef signed   long long int khronos_ssize_t;\ntypedef unsigned long long int khronos_usize_t;\n#else\ntypedef signed   long  int     khronos_intptr_t;\ntypedef unsigned long  int     khronos_uintptr_t;\ntypedef signed   long  int     khronos_ssize_t;\ntypedef unsigned long  int     khronos_usize_t;\n#endif\n\n#if KHRONOS_SUPPORT_FLOAT\n/*\n * Float type\n */\ntypedef          float         khronos_float_t;\n#endif\n\n#if KHRONOS_SUPPORT_INT64\n/* Time types\n *\n * These types can be used to represent a time interval in nanoseconds or\n * an absolute Unadjusted System Time.  Unadjusted System Time is the number\n * of nanoseconds since some arbitrary system event (e.g. since the last\n * time the system booted).  The Unadjusted System Time is an unsigned\n * 64 bit value that wraps back to 0 every 584 years.  Time intervals\n * may be either signed or unsigned.\n */\ntypedef khronos_uint64_t       khronos_utime_nanoseconds_t;\ntypedef khronos_int64_t        khronos_stime_nanoseconds_t;\n#endif\n\n/*\n * Dummy value used to pad enum types to 32 bits.\n */\n#ifndef KHRONOS_MAX_ENUM\n#define KHRONOS_MAX_ENUM 0x7FFFFFFF\n#endif\n\n/*\n * Enumerated boolean type\n *\n * Values other than zero should be considered to be true.  Therefore\n * comparisons should not be made against KHRONOS_TRUE.\n */\ntypedef enum {\n    KHRONOS_FALSE = 0,\n    KHRONOS_TRUE  = 1,\n    KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM\n} khronos_boolean_enum_t;\n\n#endif /* __khrplatform_h_ */\n"
  },
  {
    "path": "external/GLFW/deps/getopt.c",
    "content": "/* Copyright (c) 2012, Kim Gräsman\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *  * Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n *  * Neither the name of Kim Gräsman nor the names of contributors may be used\n *    to endorse or promote products derived from this software without specific\n *    prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL KIM GRÄSMAN BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"getopt.h\"\n\n#include <stddef.h>\n#include <string.h>\n\nconst int no_argument = 0;\nconst int required_argument = 1;\nconst int optional_argument = 2;\n\nchar* optarg;\nint optopt;\n/* The variable optind [...] shall be initialized to 1 by the system. */\nint optind = 1;\nint opterr;\n\nstatic char* optcursor = NULL;\n\n/* Implemented based on [1] and [2] for optional arguments.\n   optopt is handled FreeBSD-style, per [3].\n   Other GNU and FreeBSD extensions are purely accidental.\n\n[1] http://pubs.opengroup.org/onlinepubs/000095399/functions/getopt.html\n[2] http://www.kernel.org/doc/man-pages/online/pages/man3/getopt.3.html\n[3] http://www.freebsd.org/cgi/man.cgi?query=getopt&sektion=3&manpath=FreeBSD+9.0-RELEASE\n*/\nint getopt(int argc, char* const argv[], const char* optstring) {\n  int optchar = -1;\n  const char* optdecl = NULL;\n\n  optarg = NULL;\n  opterr = 0;\n  optopt = 0;\n\n  /* Unspecified, but we need it to avoid overrunning the argv bounds. */\n  if (optind >= argc)\n    goto no_more_optchars;\n\n  /* If, when getopt() is called argv[optind] is a null pointer, getopt()\n     shall return -1 without changing optind. */\n  if (argv[optind] == NULL)\n    goto no_more_optchars;\n\n  /* If, when getopt() is called *argv[optind]  is not the character '-',\n     getopt() shall return -1 without changing optind. */\n  if (*argv[optind] != '-')\n    goto no_more_optchars;\n\n  /* If, when getopt() is called argv[optind] points to the string \"-\",\n     getopt() shall return -1 without changing optind. */\n  if (strcmp(argv[optind], \"-\") == 0)\n    goto no_more_optchars;\n\n  /* If, when getopt() is called argv[optind] points to the string \"--\",\n     getopt() shall return -1 after incrementing optind. */\n  if (strcmp(argv[optind], \"--\") == 0) {\n    ++optind;\n    goto no_more_optchars;\n  }\n\n  if (optcursor == NULL || *optcursor == '\\0')\n    optcursor = argv[optind] + 1;\n\n  optchar = *optcursor;\n\n  /* FreeBSD: The variable optopt saves the last known option character\n     returned by getopt(). */\n  optopt = optchar;\n\n  /* The getopt() function shall return the next option character (if one is\n     found) from argv that matches a character in optstring, if there is\n     one that matches. */\n  optdecl = strchr(optstring, optchar);\n  if (optdecl) {\n    /* [I]f a character is followed by a colon, the option takes an\n       argument. */\n    if (optdecl[1] == ':') {\n      optarg = ++optcursor;\n      if (*optarg == '\\0') {\n        /* GNU extension: Two colons mean an option takes an\n           optional arg; if there is text in the current argv-element\n           (i.e., in the same word as the option name itself, for example,\n           \"-oarg\"), then it is returned in optarg, otherwise optarg is set\n           to zero. */\n        if (optdecl[2] != ':') {\n          /* If the option was the last character in the string pointed to by\n             an element of argv, then optarg shall contain the next element\n             of argv, and optind shall be incremented by 2. If the resulting\n             value of optind is greater than argc, this indicates a missing\n             option-argument, and getopt() shall return an error indication.\n\n             Otherwise, optarg shall point to the string following the\n             option character in that element of argv, and optind shall be\n             incremented by 1.\n          */\n          if (++optind < argc) {\n            optarg = argv[optind];\n          } else {\n            /* If it detects a missing option-argument, it shall return the\n               colon character ( ':' ) if the first character of optstring\n               was a colon, or a question-mark character ( '?' ) otherwise.\n            */\n            optarg = NULL;\n            optchar = (optstring[0] == ':') ? ':' : '?';\n          }\n        } else {\n          optarg = NULL;\n        }\n      }\n\n      optcursor = NULL;\n    }\n  } else {\n    /* If getopt() encounters an option character that is not contained in\n       optstring, it shall return the question-mark ( '?' ) character. */\n    optchar = '?';\n  }\n\n  if (optcursor == NULL || *++optcursor == '\\0')\n    ++optind;\n\n  return optchar;\n\nno_more_optchars:\n  optcursor = NULL;\n  return -1;\n}\n\n/* Implementation based on [1].\n\n[1] http://www.kernel.org/doc/man-pages/online/pages/man3/getopt.3.html\n*/\nint getopt_long(int argc, char* const argv[], const char* optstring,\n  const struct option* longopts, int* longindex) {\n  const struct option* o = longopts;\n  const struct option* match = NULL;\n  int num_matches = 0;\n  size_t argument_name_length = 0;\n  const char* current_argument = NULL;\n  int retval = -1;\n\n  optarg = NULL;\n  optopt = 0;\n\n  if (optind >= argc)\n    return -1;\n\n  if (strlen(argv[optind]) < 3 || strncmp(argv[optind], \"--\", 2) != 0)\n    return getopt(argc, argv, optstring);\n\n  /* It's an option; starts with -- and is longer than two chars. */\n  current_argument = argv[optind] + 2;\n  argument_name_length = strcspn(current_argument, \"=\");\n  for (; o->name; ++o) {\n    if (strncmp(o->name, current_argument, argument_name_length) == 0) {\n      match = o;\n      ++num_matches;\n    }\n  }\n\n  if (num_matches == 1) {\n    /* If longindex is not NULL, it points to a variable which is set to the\n       index of the long option relative to longopts. */\n    if (longindex)\n      *longindex = (int) (match - longopts);\n\n    /* If flag is NULL, then getopt_long() shall return val.\n       Otherwise, getopt_long() returns 0, and flag shall point to a variable\n       which shall be set to val if the option is found, but left unchanged if\n       the option is not found. */\n    if (match->flag)\n      *(match->flag) = match->val;\n\n    retval = match->flag ? 0 : match->val;\n\n    if (match->has_arg != no_argument) {\n      optarg = strchr(argv[optind], '=');\n      if (optarg != NULL)\n        ++optarg;\n\n      if (match->has_arg == required_argument) {\n        /* Only scan the next argv for required arguments. Behavior is not\n           specified, but has been observed with Ubuntu and Mac OSX. */\n        if (optarg == NULL && ++optind < argc) {\n          optarg = argv[optind];\n        }\n\n        if (optarg == NULL)\n          retval = ':';\n      }\n    } else if (strchr(argv[optind], '=')) {\n      /* An argument was provided to a non-argument option.\n         I haven't seen this specified explicitly, but both GNU and BSD-based\n         implementations show this behavior.\n      */\n      retval = '?';\n    }\n  } else {\n    /* Unknown option or ambiguous match. */\n    retval = '?';\n  }\n\n  ++optind;\n  return retval;\n}\n"
  },
  {
    "path": "external/GLFW/deps/getopt.h",
    "content": "/* Copyright (c) 2012, Kim Gräsman\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *  * Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n *  * Neither the name of Kim Gräsman nor the names of contributors may be used\n *    to endorse or promote products derived from this software without specific\n *    prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL KIM GRÄSMAN BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef INCLUDED_GETOPT_PORT_H\n#define INCLUDED_GETOPT_PORT_H\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\nextern const int no_argument;\nextern const int required_argument;\nextern const int optional_argument;\n\nextern char* optarg;\nextern int optind, opterr, optopt;\n\nstruct option {\n  const char* name;\n  int has_arg;\n  int* flag;\n  int val;\n};\n\nint getopt(int argc, char* const argv[], const char* optstring);\n\nint getopt_long(int argc, char* const argv[],\n  const char* optstring, const struct option* longopts, int* longindex);\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif // INCLUDED_GETOPT_PORT_H\n"
  },
  {
    "path": "external/GLFW/deps/glad/glad.h",
    "content": "/*\n\n    OpenGL loader generated by glad 0.1.12a0 on Fri Sep 23 13:36:15 2016.\n\n    Language/Generator: C/C++\n    Specification: gl\n    APIs: gl=3.2\n    Profile: compatibility\n    Extensions:\n        GL_ARB_multisample,\n        GL_ARB_robustness,\n        GL_KHR_debug\n    Loader: False\n    Local files: False\n    Omit khrplatform: False\n\n    Commandline:\n        --profile=\"compatibility\" --api=\"gl=3.2\" --generator=\"c\" --spec=\"gl\" --no-loader --extensions=\"GL_ARB_multisample,GL_ARB_robustness,GL_KHR_debug\"\n    Online:\n        http://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&api=gl%3D3.2&extensions=GL_ARB_multisample&extensions=GL_ARB_robustness&extensions=GL_KHR_debug\n*/\n\n\n#ifndef __glad_h_\n#define __glad_h_\n\n#ifdef __gl_h_\n#error OpenGL header already included, remove this include, glad already provides it\n#endif\n#define __gl_h_\n\n#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN 1\n#endif\n#include <windows.h>\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY\n#endif\n#ifndef APIENTRYP\n#define APIENTRYP APIENTRY *\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct gladGLversionStruct {\n    int major;\n    int minor;\n};\n\ntypedef void* (* GLADloadproc)(const char *name);\n\n#ifndef GLAPI\n# if defined(GLAD_GLAPI_EXPORT)\n#  if defined(WIN32) || defined(__CYGWIN__)\n#   if defined(GLAD_GLAPI_EXPORT_BUILD)\n#    if defined(__GNUC__)\n#     define GLAPI __attribute__ ((dllexport)) extern\n#    else\n#     define GLAPI __declspec(dllexport) extern\n#    endif\n#   else\n#    if defined(__GNUC__)\n#     define GLAPI __attribute__ ((dllimport)) extern\n#    else\n#     define GLAPI __declspec(dllimport) extern\n#    endif\n#   endif\n#  elif defined(__GNUC__) && defined(GLAD_GLAPI_EXPORT_BUILD)\n#   define GLAPI __attribute__ ((visibility (\"default\"))) extern\n#  else\n#   define GLAPI extern\n#  endif\n# else\n#  define GLAPI extern\n# endif\n#endif\n\nGLAPI struct gladGLversionStruct GLVersion;\nGLAPI int gladLoadGLLoader(GLADloadproc);\n\n#include <stddef.h>\n#include <KHR/khrplatform.h>\n#ifndef GLEXT_64_TYPES_DEFINED\n/* This code block is duplicated in glxext.h, so must be protected */\n#define GLEXT_64_TYPES_DEFINED\n/* Define int32_t, int64_t, and uint64_t types for UST/MSC */\n/* (as used in the GL_EXT_timer_query extension). */\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n#include <inttypes.h>\n#elif defined(__sun__) || defined(__digital__)\n#include <inttypes.h>\n#if defined(__STDC__)\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int int64_t;\ntypedef unsigned long int uint64_t;\n#else\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#endif /* __arch64__ */\n#endif /* __STDC__ */\n#elif defined( __VMS ) || defined(__sgi)\n#include <inttypes.h>\n#elif defined(__SCO__) || defined(__USLC__)\n#include <stdint.h>\n#elif defined(__UNIXOS2__) || defined(__SOL64__)\ntypedef long int int32_t;\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#elif defined(_WIN32) && defined(__GNUC__)\n#include <stdint.h>\n#elif defined(_WIN32)\ntypedef __int32 int32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#else\n/* Fallback if nothing above works */\n#include <inttypes.h>\n#endif\n#endif\ntypedef unsigned int GLenum;\ntypedef unsigned char GLboolean;\ntypedef unsigned int GLbitfield;\ntypedef void GLvoid;\ntypedef signed char GLbyte;\ntypedef short GLshort;\ntypedef int GLint;\ntypedef int GLclampx;\ntypedef unsigned char GLubyte;\ntypedef unsigned short GLushort;\ntypedef unsigned int GLuint;\ntypedef int GLsizei;\ntypedef float GLfloat;\ntypedef float GLclampf;\ntypedef double GLdouble;\ntypedef double GLclampd;\ntypedef void *GLeglImageOES;\ntypedef char GLchar;\ntypedef char GLcharARB;\n#ifdef __APPLE__\ntypedef void *GLhandleARB;\n#else\ntypedef unsigned int GLhandleARB;\n#endif\ntypedef unsigned short GLhalfARB;\ntypedef unsigned short GLhalf;\ntypedef GLint GLfixed;\ntypedef ptrdiff_t GLintptr;\ntypedef ptrdiff_t GLsizeiptr;\ntypedef int64_t GLint64;\ntypedef uint64_t GLuint64;\ntypedef ptrdiff_t GLintptrARB;\ntypedef ptrdiff_t GLsizeiptrARB;\ntypedef int64_t GLint64EXT;\ntypedef uint64_t GLuint64EXT;\ntypedef struct __GLsync *GLsync;\nstruct _cl_context;\nstruct _cl_event;\ntypedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);\ntypedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);\ntypedef unsigned short GLhalfNV;\ntypedef GLintptr GLvdpauSurfaceNV;\n#define GL_DEPTH_BUFFER_BIT 0x00000100\n#define GL_STENCIL_BUFFER_BIT 0x00000400\n#define GL_COLOR_BUFFER_BIT 0x00004000\n#define GL_FALSE 0\n#define GL_TRUE 1\n#define GL_POINTS 0x0000\n#define GL_LINES 0x0001\n#define GL_LINE_LOOP 0x0002\n#define GL_LINE_STRIP 0x0003\n#define GL_TRIANGLES 0x0004\n#define GL_TRIANGLE_STRIP 0x0005\n#define GL_TRIANGLE_FAN 0x0006\n#define GL_QUADS 0x0007\n#define GL_NEVER 0x0200\n#define GL_LESS 0x0201\n#define GL_EQUAL 0x0202\n#define GL_LEQUAL 0x0203\n#define GL_GREATER 0x0204\n#define GL_NOTEQUAL 0x0205\n#define GL_GEQUAL 0x0206\n#define GL_ALWAYS 0x0207\n#define GL_ZERO 0\n#define GL_ONE 1\n#define GL_SRC_COLOR 0x0300\n#define GL_ONE_MINUS_SRC_COLOR 0x0301\n#define GL_SRC_ALPHA 0x0302\n#define GL_ONE_MINUS_SRC_ALPHA 0x0303\n#define GL_DST_ALPHA 0x0304\n#define GL_ONE_MINUS_DST_ALPHA 0x0305\n#define GL_DST_COLOR 0x0306\n#define GL_ONE_MINUS_DST_COLOR 0x0307\n#define GL_SRC_ALPHA_SATURATE 0x0308\n#define GL_NONE 0\n#define GL_FRONT_LEFT 0x0400\n#define GL_FRONT_RIGHT 0x0401\n#define GL_BACK_LEFT 0x0402\n#define GL_BACK_RIGHT 0x0403\n#define GL_FRONT 0x0404\n#define GL_BACK 0x0405\n#define GL_LEFT 0x0406\n#define GL_RIGHT 0x0407\n#define GL_FRONT_AND_BACK 0x0408\n#define GL_NO_ERROR 0\n#define GL_INVALID_ENUM 0x0500\n#define GL_INVALID_VALUE 0x0501\n#define GL_INVALID_OPERATION 0x0502\n#define GL_OUT_OF_MEMORY 0x0505\n#define GL_CW 0x0900\n#define GL_CCW 0x0901\n#define GL_POINT_SIZE 0x0B11\n#define GL_POINT_SIZE_RANGE 0x0B12\n#define GL_POINT_SIZE_GRANULARITY 0x0B13\n#define GL_LINE_SMOOTH 0x0B20\n#define GL_LINE_WIDTH 0x0B21\n#define GL_LINE_WIDTH_RANGE 0x0B22\n#define GL_LINE_WIDTH_GRANULARITY 0x0B23\n#define GL_POLYGON_MODE 0x0B40\n#define GL_POLYGON_SMOOTH 0x0B41\n#define GL_CULL_FACE 0x0B44\n#define GL_CULL_FACE_MODE 0x0B45\n#define GL_FRONT_FACE 0x0B46\n#define GL_DEPTH_RANGE 0x0B70\n#define GL_DEPTH_TEST 0x0B71\n#define GL_DEPTH_WRITEMASK 0x0B72\n#define GL_DEPTH_CLEAR_VALUE 0x0B73\n#define GL_DEPTH_FUNC 0x0B74\n#define GL_STENCIL_TEST 0x0B90\n#define GL_STENCIL_CLEAR_VALUE 0x0B91\n#define GL_STENCIL_FUNC 0x0B92\n#define GL_STENCIL_VALUE_MASK 0x0B93\n#define GL_STENCIL_FAIL 0x0B94\n#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95\n#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96\n#define GL_STENCIL_REF 0x0B97\n#define GL_STENCIL_WRITEMASK 0x0B98\n#define GL_VIEWPORT 0x0BA2\n#define GL_DITHER 0x0BD0\n#define GL_BLEND_DST 0x0BE0\n#define GL_BLEND_SRC 0x0BE1\n#define GL_BLEND 0x0BE2\n#define GL_LOGIC_OP_MODE 0x0BF0\n#define GL_COLOR_LOGIC_OP 0x0BF2\n#define GL_DRAW_BUFFER 0x0C01\n#define GL_READ_BUFFER 0x0C02\n#define GL_SCISSOR_BOX 0x0C10\n#define GL_SCISSOR_TEST 0x0C11\n#define GL_COLOR_CLEAR_VALUE 0x0C22\n#define GL_COLOR_WRITEMASK 0x0C23\n#define GL_DOUBLEBUFFER 0x0C32\n#define GL_STEREO 0x0C33\n#define GL_LINE_SMOOTH_HINT 0x0C52\n#define GL_POLYGON_SMOOTH_HINT 0x0C53\n#define GL_UNPACK_SWAP_BYTES 0x0CF0\n#define GL_UNPACK_LSB_FIRST 0x0CF1\n#define GL_UNPACK_ROW_LENGTH 0x0CF2\n#define GL_UNPACK_SKIP_ROWS 0x0CF3\n#define GL_UNPACK_SKIP_PIXELS 0x0CF4\n#define GL_UNPACK_ALIGNMENT 0x0CF5\n#define GL_PACK_SWAP_BYTES 0x0D00\n#define GL_PACK_LSB_FIRST 0x0D01\n#define GL_PACK_ROW_LENGTH 0x0D02\n#define GL_PACK_SKIP_ROWS 0x0D03\n#define GL_PACK_SKIP_PIXELS 0x0D04\n#define GL_PACK_ALIGNMENT 0x0D05\n#define GL_MAX_TEXTURE_SIZE 0x0D33\n#define GL_MAX_VIEWPORT_DIMS 0x0D3A\n#define GL_SUBPIXEL_BITS 0x0D50\n#define GL_TEXTURE_1D 0x0DE0\n#define GL_TEXTURE_2D 0x0DE1\n#define GL_POLYGON_OFFSET_UNITS 0x2A00\n#define GL_POLYGON_OFFSET_POINT 0x2A01\n#define GL_POLYGON_OFFSET_LINE 0x2A02\n#define GL_POLYGON_OFFSET_FILL 0x8037\n#define GL_POLYGON_OFFSET_FACTOR 0x8038\n#define GL_TEXTURE_BINDING_1D 0x8068\n#define GL_TEXTURE_BINDING_2D 0x8069\n#define GL_TEXTURE_WIDTH 0x1000\n#define GL_TEXTURE_HEIGHT 0x1001\n#define GL_TEXTURE_INTERNAL_FORMAT 0x1003\n#define GL_TEXTURE_BORDER_COLOR 0x1004\n#define GL_TEXTURE_RED_SIZE 0x805C\n#define GL_TEXTURE_GREEN_SIZE 0x805D\n#define GL_TEXTURE_BLUE_SIZE 0x805E\n#define GL_TEXTURE_ALPHA_SIZE 0x805F\n#define GL_DONT_CARE 0x1100\n#define GL_FASTEST 0x1101\n#define GL_NICEST 0x1102\n#define GL_BYTE 0x1400\n#define GL_UNSIGNED_BYTE 0x1401\n#define GL_SHORT 0x1402\n#define GL_UNSIGNED_SHORT 0x1403\n#define GL_INT 0x1404\n#define GL_UNSIGNED_INT 0x1405\n#define GL_FLOAT 0x1406\n#define GL_DOUBLE 0x140A\n#define GL_STACK_OVERFLOW 0x0503\n#define GL_STACK_UNDERFLOW 0x0504\n#define GL_CLEAR 0x1500\n#define GL_AND 0x1501\n#define GL_AND_REVERSE 0x1502\n#define GL_COPY 0x1503\n#define GL_AND_INVERTED 0x1504\n#define GL_NOOP 0x1505\n#define GL_XOR 0x1506\n#define GL_OR 0x1507\n#define GL_NOR 0x1508\n#define GL_EQUIV 0x1509\n#define GL_INVERT 0x150A\n#define GL_OR_REVERSE 0x150B\n#define GL_COPY_INVERTED 0x150C\n#define GL_OR_INVERTED 0x150D\n#define GL_NAND 0x150E\n#define GL_SET 0x150F\n#define GL_TEXTURE 0x1702\n#define GL_COLOR 0x1800\n#define GL_DEPTH 0x1801\n#define GL_STENCIL 0x1802\n#define GL_STENCIL_INDEX 0x1901\n#define GL_DEPTH_COMPONENT 0x1902\n#define GL_RED 0x1903\n#define GL_GREEN 0x1904\n#define GL_BLUE 0x1905\n#define GL_ALPHA 0x1906\n#define GL_RGB 0x1907\n#define GL_RGBA 0x1908\n#define GL_POINT 0x1B00\n#define GL_LINE 0x1B01\n#define GL_FILL 0x1B02\n#define GL_KEEP 0x1E00\n#define GL_REPLACE 0x1E01\n#define GL_INCR 0x1E02\n#define GL_DECR 0x1E03\n#define GL_VENDOR 0x1F00\n#define GL_RENDERER 0x1F01\n#define GL_VERSION 0x1F02\n#define GL_EXTENSIONS 0x1F03\n#define GL_NEAREST 0x2600\n#define GL_LINEAR 0x2601\n#define GL_NEAREST_MIPMAP_NEAREST 0x2700\n#define GL_LINEAR_MIPMAP_NEAREST 0x2701\n#define GL_NEAREST_MIPMAP_LINEAR 0x2702\n#define GL_LINEAR_MIPMAP_LINEAR 0x2703\n#define GL_TEXTURE_MAG_FILTER 0x2800\n#define GL_TEXTURE_MIN_FILTER 0x2801\n#define GL_TEXTURE_WRAP_S 0x2802\n#define GL_TEXTURE_WRAP_T 0x2803\n#define GL_PROXY_TEXTURE_1D 0x8063\n#define GL_PROXY_TEXTURE_2D 0x8064\n#define GL_REPEAT 0x2901\n#define GL_R3_G3_B2 0x2A10\n#define GL_RGB4 0x804F\n#define GL_RGB5 0x8050\n#define GL_RGB8 0x8051\n#define GL_RGB10 0x8052\n#define GL_RGB12 0x8053\n#define GL_RGB16 0x8054\n#define GL_RGBA2 0x8055\n#define GL_RGBA4 0x8056\n#define GL_RGB5_A1 0x8057\n#define GL_RGBA8 0x8058\n#define GL_RGB10_A2 0x8059\n#define GL_RGBA12 0x805A\n#define GL_RGBA16 0x805B\n#define GL_CURRENT_BIT 0x00000001\n#define GL_POINT_BIT 0x00000002\n#define GL_LINE_BIT 0x00000004\n#define GL_POLYGON_BIT 0x00000008\n#define GL_POLYGON_STIPPLE_BIT 0x00000010\n#define GL_PIXEL_MODE_BIT 0x00000020\n#define GL_LIGHTING_BIT 0x00000040\n#define GL_FOG_BIT 0x00000080\n#define GL_ACCUM_BUFFER_BIT 0x00000200\n#define GL_VIEWPORT_BIT 0x00000800\n#define GL_TRANSFORM_BIT 0x00001000\n#define GL_ENABLE_BIT 0x00002000\n#define GL_HINT_BIT 0x00008000\n#define GL_EVAL_BIT 0x00010000\n#define GL_LIST_BIT 0x00020000\n#define GL_TEXTURE_BIT 0x00040000\n#define GL_SCISSOR_BIT 0x00080000\n#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF\n#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001\n#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002\n#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF\n#define GL_QUAD_STRIP 0x0008\n#define GL_POLYGON 0x0009\n#define GL_ACCUM 0x0100\n#define GL_LOAD 0x0101\n#define GL_RETURN 0x0102\n#define GL_MULT 0x0103\n#define GL_ADD 0x0104\n#define GL_AUX0 0x0409\n#define GL_AUX1 0x040A\n#define GL_AUX2 0x040B\n#define GL_AUX3 0x040C\n#define GL_2D 0x0600\n#define GL_3D 0x0601\n#define GL_3D_COLOR 0x0602\n#define GL_3D_COLOR_TEXTURE 0x0603\n#define GL_4D_COLOR_TEXTURE 0x0604\n#define GL_PASS_THROUGH_TOKEN 0x0700\n#define GL_POINT_TOKEN 0x0701\n#define GL_LINE_TOKEN 0x0702\n#define GL_POLYGON_TOKEN 0x0703\n#define GL_BITMAP_TOKEN 0x0704\n#define GL_DRAW_PIXEL_TOKEN 0x0705\n#define GL_COPY_PIXEL_TOKEN 0x0706\n#define GL_LINE_RESET_TOKEN 0x0707\n#define GL_EXP 0x0800\n#define GL_EXP2 0x0801\n#define GL_COEFF 0x0A00\n#define GL_ORDER 0x0A01\n#define GL_DOMAIN 0x0A02\n#define GL_PIXEL_MAP_I_TO_I 0x0C70\n#define GL_PIXEL_MAP_S_TO_S 0x0C71\n#define GL_PIXEL_MAP_I_TO_R 0x0C72\n#define GL_PIXEL_MAP_I_TO_G 0x0C73\n#define GL_PIXEL_MAP_I_TO_B 0x0C74\n#define GL_PIXEL_MAP_I_TO_A 0x0C75\n#define GL_PIXEL_MAP_R_TO_R 0x0C76\n#define GL_PIXEL_MAP_G_TO_G 0x0C77\n#define GL_PIXEL_MAP_B_TO_B 0x0C78\n#define GL_PIXEL_MAP_A_TO_A 0x0C79\n#define GL_VERTEX_ARRAY_POINTER 0x808E\n#define GL_NORMAL_ARRAY_POINTER 0x808F\n#define GL_COLOR_ARRAY_POINTER 0x8090\n#define GL_INDEX_ARRAY_POINTER 0x8091\n#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092\n#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093\n#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0\n#define GL_SELECTION_BUFFER_POINTER 0x0DF3\n#define GL_CURRENT_COLOR 0x0B00\n#define GL_CURRENT_INDEX 0x0B01\n#define GL_CURRENT_NORMAL 0x0B02\n#define GL_CURRENT_TEXTURE_COORDS 0x0B03\n#define GL_CURRENT_RASTER_COLOR 0x0B04\n#define GL_CURRENT_RASTER_INDEX 0x0B05\n#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06\n#define GL_CURRENT_RASTER_POSITION 0x0B07\n#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08\n#define GL_CURRENT_RASTER_DISTANCE 0x0B09\n#define GL_POINT_SMOOTH 0x0B10\n#define GL_LINE_STIPPLE 0x0B24\n#define GL_LINE_STIPPLE_PATTERN 0x0B25\n#define GL_LINE_STIPPLE_REPEAT 0x0B26\n#define GL_LIST_MODE 0x0B30\n#define GL_MAX_LIST_NESTING 0x0B31\n#define GL_LIST_BASE 0x0B32\n#define GL_LIST_INDEX 0x0B33\n#define GL_POLYGON_STIPPLE 0x0B42\n#define GL_EDGE_FLAG 0x0B43\n#define GL_LIGHTING 0x0B50\n#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51\n#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52\n#define GL_LIGHT_MODEL_AMBIENT 0x0B53\n#define GL_SHADE_MODEL 0x0B54\n#define GL_COLOR_MATERIAL_FACE 0x0B55\n#define GL_COLOR_MATERIAL_PARAMETER 0x0B56\n#define GL_COLOR_MATERIAL 0x0B57\n#define GL_FOG 0x0B60\n#define GL_FOG_INDEX 0x0B61\n#define GL_FOG_DENSITY 0x0B62\n#define GL_FOG_START 0x0B63\n#define GL_FOG_END 0x0B64\n#define GL_FOG_MODE 0x0B65\n#define GL_FOG_COLOR 0x0B66\n#define GL_ACCUM_CLEAR_VALUE 0x0B80\n#define GL_MATRIX_MODE 0x0BA0\n#define GL_NORMALIZE 0x0BA1\n#define GL_MODELVIEW_STACK_DEPTH 0x0BA3\n#define GL_PROJECTION_STACK_DEPTH 0x0BA4\n#define GL_TEXTURE_STACK_DEPTH 0x0BA5\n#define GL_MODELVIEW_MATRIX 0x0BA6\n#define GL_PROJECTION_MATRIX 0x0BA7\n#define GL_TEXTURE_MATRIX 0x0BA8\n#define GL_ATTRIB_STACK_DEPTH 0x0BB0\n#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1\n#define GL_ALPHA_TEST 0x0BC0\n#define GL_ALPHA_TEST_FUNC 0x0BC1\n#define GL_ALPHA_TEST_REF 0x0BC2\n#define GL_INDEX_LOGIC_OP 0x0BF1\n#define GL_LOGIC_OP 0x0BF1\n#define GL_AUX_BUFFERS 0x0C00\n#define GL_INDEX_CLEAR_VALUE 0x0C20\n#define GL_INDEX_WRITEMASK 0x0C21\n#define GL_INDEX_MODE 0x0C30\n#define GL_RGBA_MODE 0x0C31\n#define GL_RENDER_MODE 0x0C40\n#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50\n#define GL_POINT_SMOOTH_HINT 0x0C51\n#define GL_FOG_HINT 0x0C54\n#define GL_TEXTURE_GEN_S 0x0C60\n#define GL_TEXTURE_GEN_T 0x0C61\n#define GL_TEXTURE_GEN_R 0x0C62\n#define GL_TEXTURE_GEN_Q 0x0C63\n#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0\n#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1\n#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2\n#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3\n#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4\n#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5\n#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6\n#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7\n#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8\n#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9\n#define GL_MAP_COLOR 0x0D10\n#define GL_MAP_STENCIL 0x0D11\n#define GL_INDEX_SHIFT 0x0D12\n#define GL_INDEX_OFFSET 0x0D13\n#define GL_RED_SCALE 0x0D14\n#define GL_RED_BIAS 0x0D15\n#define GL_ZOOM_X 0x0D16\n#define GL_ZOOM_Y 0x0D17\n#define GL_GREEN_SCALE 0x0D18\n#define GL_GREEN_BIAS 0x0D19\n#define GL_BLUE_SCALE 0x0D1A\n#define GL_BLUE_BIAS 0x0D1B\n#define GL_ALPHA_SCALE 0x0D1C\n#define GL_ALPHA_BIAS 0x0D1D\n#define GL_DEPTH_SCALE 0x0D1E\n#define GL_DEPTH_BIAS 0x0D1F\n#define GL_MAX_EVAL_ORDER 0x0D30\n#define GL_MAX_LIGHTS 0x0D31\n#define GL_MAX_CLIP_PLANES 0x0D32\n#define GL_MAX_PIXEL_MAP_TABLE 0x0D34\n#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35\n#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36\n#define GL_MAX_NAME_STACK_DEPTH 0x0D37\n#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38\n#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39\n#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B\n#define GL_INDEX_BITS 0x0D51\n#define GL_RED_BITS 0x0D52\n#define GL_GREEN_BITS 0x0D53\n#define GL_BLUE_BITS 0x0D54\n#define GL_ALPHA_BITS 0x0D55\n#define GL_DEPTH_BITS 0x0D56\n#define GL_STENCIL_BITS 0x0D57\n#define GL_ACCUM_RED_BITS 0x0D58\n#define GL_ACCUM_GREEN_BITS 0x0D59\n#define GL_ACCUM_BLUE_BITS 0x0D5A\n#define GL_ACCUM_ALPHA_BITS 0x0D5B\n#define GL_NAME_STACK_DEPTH 0x0D70\n#define GL_AUTO_NORMAL 0x0D80\n#define GL_MAP1_COLOR_4 0x0D90\n#define GL_MAP1_INDEX 0x0D91\n#define GL_MAP1_NORMAL 0x0D92\n#define GL_MAP1_TEXTURE_COORD_1 0x0D93\n#define GL_MAP1_TEXTURE_COORD_2 0x0D94\n#define GL_MAP1_TEXTURE_COORD_3 0x0D95\n#define GL_MAP1_TEXTURE_COORD_4 0x0D96\n#define GL_MAP1_VERTEX_3 0x0D97\n#define GL_MAP1_VERTEX_4 0x0D98\n#define GL_MAP2_COLOR_4 0x0DB0\n#define GL_MAP2_INDEX 0x0DB1\n#define GL_MAP2_NORMAL 0x0DB2\n#define GL_MAP2_TEXTURE_COORD_1 0x0DB3\n#define GL_MAP2_TEXTURE_COORD_2 0x0DB4\n#define GL_MAP2_TEXTURE_COORD_3 0x0DB5\n#define GL_MAP2_TEXTURE_COORD_4 0x0DB6\n#define GL_MAP2_VERTEX_3 0x0DB7\n#define GL_MAP2_VERTEX_4 0x0DB8\n#define GL_MAP1_GRID_DOMAIN 0x0DD0\n#define GL_MAP1_GRID_SEGMENTS 0x0DD1\n#define GL_MAP2_GRID_DOMAIN 0x0DD2\n#define GL_MAP2_GRID_SEGMENTS 0x0DD3\n#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1\n#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2\n#define GL_SELECTION_BUFFER_SIZE 0x0DF4\n#define GL_VERTEX_ARRAY 0x8074\n#define GL_NORMAL_ARRAY 0x8075\n#define GL_COLOR_ARRAY 0x8076\n#define GL_INDEX_ARRAY 0x8077\n#define GL_TEXTURE_COORD_ARRAY 0x8078\n#define GL_EDGE_FLAG_ARRAY 0x8079\n#define GL_VERTEX_ARRAY_SIZE 0x807A\n#define GL_VERTEX_ARRAY_TYPE 0x807B\n#define GL_VERTEX_ARRAY_STRIDE 0x807C\n#define GL_NORMAL_ARRAY_TYPE 0x807E\n#define GL_NORMAL_ARRAY_STRIDE 0x807F\n#define GL_COLOR_ARRAY_SIZE 0x8081\n#define GL_COLOR_ARRAY_TYPE 0x8082\n#define GL_COLOR_ARRAY_STRIDE 0x8083\n#define GL_INDEX_ARRAY_TYPE 0x8085\n#define GL_INDEX_ARRAY_STRIDE 0x8086\n#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088\n#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089\n#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A\n#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C\n#define GL_TEXTURE_COMPONENTS 0x1003\n#define GL_TEXTURE_BORDER 0x1005\n#define GL_TEXTURE_LUMINANCE_SIZE 0x8060\n#define GL_TEXTURE_INTENSITY_SIZE 0x8061\n#define GL_TEXTURE_PRIORITY 0x8066\n#define GL_TEXTURE_RESIDENT 0x8067\n#define GL_AMBIENT 0x1200\n#define GL_DIFFUSE 0x1201\n#define GL_SPECULAR 0x1202\n#define GL_POSITION 0x1203\n#define GL_SPOT_DIRECTION 0x1204\n#define GL_SPOT_EXPONENT 0x1205\n#define GL_SPOT_CUTOFF 0x1206\n#define GL_CONSTANT_ATTENUATION 0x1207\n#define GL_LINEAR_ATTENUATION 0x1208\n#define GL_QUADRATIC_ATTENUATION 0x1209\n#define GL_COMPILE 0x1300\n#define GL_COMPILE_AND_EXECUTE 0x1301\n#define GL_2_BYTES 0x1407\n#define GL_3_BYTES 0x1408\n#define GL_4_BYTES 0x1409\n#define GL_EMISSION 0x1600\n#define GL_SHININESS 0x1601\n#define GL_AMBIENT_AND_DIFFUSE 0x1602\n#define GL_COLOR_INDEXES 0x1603\n#define GL_MODELVIEW 0x1700\n#define GL_PROJECTION 0x1701\n#define GL_COLOR_INDEX 0x1900\n#define GL_LUMINANCE 0x1909\n#define GL_LUMINANCE_ALPHA 0x190A\n#define GL_BITMAP 0x1A00\n#define GL_RENDER 0x1C00\n#define GL_FEEDBACK 0x1C01\n#define GL_SELECT 0x1C02\n#define GL_FLAT 0x1D00\n#define GL_SMOOTH 0x1D01\n#define GL_S 0x2000\n#define GL_T 0x2001\n#define GL_R 0x2002\n#define GL_Q 0x2003\n#define GL_MODULATE 0x2100\n#define GL_DECAL 0x2101\n#define GL_TEXTURE_ENV_MODE 0x2200\n#define GL_TEXTURE_ENV_COLOR 0x2201\n#define GL_TEXTURE_ENV 0x2300\n#define GL_EYE_LINEAR 0x2400\n#define GL_OBJECT_LINEAR 0x2401\n#define GL_SPHERE_MAP 0x2402\n#define GL_TEXTURE_GEN_MODE 0x2500\n#define GL_OBJECT_PLANE 0x2501\n#define GL_EYE_PLANE 0x2502\n#define GL_CLAMP 0x2900\n#define GL_ALPHA4 0x803B\n#define GL_ALPHA8 0x803C\n#define GL_ALPHA12 0x803D\n#define GL_ALPHA16 0x803E\n#define GL_LUMINANCE4 0x803F\n#define GL_LUMINANCE8 0x8040\n#define GL_LUMINANCE12 0x8041\n#define GL_LUMINANCE16 0x8042\n#define GL_LUMINANCE4_ALPHA4 0x8043\n#define GL_LUMINANCE6_ALPHA2 0x8044\n#define GL_LUMINANCE8_ALPHA8 0x8045\n#define GL_LUMINANCE12_ALPHA4 0x8046\n#define GL_LUMINANCE12_ALPHA12 0x8047\n#define GL_LUMINANCE16_ALPHA16 0x8048\n#define GL_INTENSITY 0x8049\n#define GL_INTENSITY4 0x804A\n#define GL_INTENSITY8 0x804B\n#define GL_INTENSITY12 0x804C\n#define GL_INTENSITY16 0x804D\n#define GL_V2F 0x2A20\n#define GL_V3F 0x2A21\n#define GL_C4UB_V2F 0x2A22\n#define GL_C4UB_V3F 0x2A23\n#define GL_C3F_V3F 0x2A24\n#define GL_N3F_V3F 0x2A25\n#define GL_C4F_N3F_V3F 0x2A26\n#define GL_T2F_V3F 0x2A27\n#define GL_T4F_V4F 0x2A28\n#define GL_T2F_C4UB_V3F 0x2A29\n#define GL_T2F_C3F_V3F 0x2A2A\n#define GL_T2F_N3F_V3F 0x2A2B\n#define GL_T2F_C4F_N3F_V3F 0x2A2C\n#define GL_T4F_C4F_N3F_V4F 0x2A2D\n#define GL_CLIP_PLANE0 0x3000\n#define GL_CLIP_PLANE1 0x3001\n#define GL_CLIP_PLANE2 0x3002\n#define GL_CLIP_PLANE3 0x3003\n#define GL_CLIP_PLANE4 0x3004\n#define GL_CLIP_PLANE5 0x3005\n#define GL_LIGHT0 0x4000\n#define GL_LIGHT1 0x4001\n#define GL_LIGHT2 0x4002\n#define GL_LIGHT3 0x4003\n#define GL_LIGHT4 0x4004\n#define GL_LIGHT5 0x4005\n#define GL_LIGHT6 0x4006\n#define GL_LIGHT7 0x4007\n#define GL_UNSIGNED_BYTE_3_3_2 0x8032\n#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033\n#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034\n#define GL_UNSIGNED_INT_8_8_8_8 0x8035\n#define GL_UNSIGNED_INT_10_10_10_2 0x8036\n#define GL_TEXTURE_BINDING_3D 0x806A\n#define GL_PACK_SKIP_IMAGES 0x806B\n#define GL_PACK_IMAGE_HEIGHT 0x806C\n#define GL_UNPACK_SKIP_IMAGES 0x806D\n#define GL_UNPACK_IMAGE_HEIGHT 0x806E\n#define GL_TEXTURE_3D 0x806F\n#define GL_PROXY_TEXTURE_3D 0x8070\n#define GL_TEXTURE_DEPTH 0x8071\n#define GL_TEXTURE_WRAP_R 0x8072\n#define GL_MAX_3D_TEXTURE_SIZE 0x8073\n#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362\n#define GL_UNSIGNED_SHORT_5_6_5 0x8363\n#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366\n#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367\n#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368\n#define GL_BGR 0x80E0\n#define GL_BGRA 0x80E1\n#define GL_MAX_ELEMENTS_VERTICES 0x80E8\n#define GL_MAX_ELEMENTS_INDICES 0x80E9\n#define GL_CLAMP_TO_EDGE 0x812F\n#define GL_TEXTURE_MIN_LOD 0x813A\n#define GL_TEXTURE_MAX_LOD 0x813B\n#define GL_TEXTURE_BASE_LEVEL 0x813C\n#define GL_TEXTURE_MAX_LEVEL 0x813D\n#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12\n#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13\n#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22\n#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23\n#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E\n#define GL_RESCALE_NORMAL 0x803A\n#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8\n#define GL_SINGLE_COLOR 0x81F9\n#define GL_SEPARATE_SPECULAR_COLOR 0x81FA\n#define GL_ALIASED_POINT_SIZE_RANGE 0x846D\n#define GL_TEXTURE0 0x84C0\n#define GL_TEXTURE1 0x84C1\n#define GL_TEXTURE2 0x84C2\n#define GL_TEXTURE3 0x84C3\n#define GL_TEXTURE4 0x84C4\n#define GL_TEXTURE5 0x84C5\n#define GL_TEXTURE6 0x84C6\n#define GL_TEXTURE7 0x84C7\n#define GL_TEXTURE8 0x84C8\n#define GL_TEXTURE9 0x84C9\n#define GL_TEXTURE10 0x84CA\n#define GL_TEXTURE11 0x84CB\n#define GL_TEXTURE12 0x84CC\n#define GL_TEXTURE13 0x84CD\n#define GL_TEXTURE14 0x84CE\n#define GL_TEXTURE15 0x84CF\n#define GL_TEXTURE16 0x84D0\n#define GL_TEXTURE17 0x84D1\n#define GL_TEXTURE18 0x84D2\n#define GL_TEXTURE19 0x84D3\n#define GL_TEXTURE20 0x84D4\n#define GL_TEXTURE21 0x84D5\n#define GL_TEXTURE22 0x84D6\n#define GL_TEXTURE23 0x84D7\n#define GL_TEXTURE24 0x84D8\n#define GL_TEXTURE25 0x84D9\n#define GL_TEXTURE26 0x84DA\n#define GL_TEXTURE27 0x84DB\n#define GL_TEXTURE28 0x84DC\n#define GL_TEXTURE29 0x84DD\n#define GL_TEXTURE30 0x84DE\n#define GL_TEXTURE31 0x84DF\n#define GL_ACTIVE_TEXTURE 0x84E0\n#define GL_MULTISAMPLE 0x809D\n#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE 0x809F\n#define GL_SAMPLE_COVERAGE 0x80A0\n#define GL_SAMPLE_BUFFERS 0x80A8\n#define GL_SAMPLES 0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE 0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT 0x80AB\n#define GL_TEXTURE_CUBE_MAP 0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C\n#define GL_COMPRESSED_RGB 0x84ED\n#define GL_COMPRESSED_RGBA 0x84EE\n#define GL_TEXTURE_COMPRESSION_HINT 0x84EF\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0\n#define GL_TEXTURE_COMPRESSED 0x86A1\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\n#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3\n#define GL_CLAMP_TO_BORDER 0x812D\n#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1\n#define GL_MAX_TEXTURE_UNITS 0x84E2\n#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3\n#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4\n#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5\n#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6\n#define GL_MULTISAMPLE_BIT 0x20000000\n#define GL_NORMAL_MAP 0x8511\n#define GL_REFLECTION_MAP 0x8512\n#define GL_COMPRESSED_ALPHA 0x84E9\n#define GL_COMPRESSED_LUMINANCE 0x84EA\n#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB\n#define GL_COMPRESSED_INTENSITY 0x84EC\n#define GL_COMBINE 0x8570\n#define GL_COMBINE_RGB 0x8571\n#define GL_COMBINE_ALPHA 0x8572\n#define GL_SOURCE0_RGB 0x8580\n#define GL_SOURCE1_RGB 0x8581\n#define GL_SOURCE2_RGB 0x8582\n#define GL_SOURCE0_ALPHA 0x8588\n#define GL_SOURCE1_ALPHA 0x8589\n#define GL_SOURCE2_ALPHA 0x858A\n#define GL_OPERAND0_RGB 0x8590\n#define GL_OPERAND1_RGB 0x8591\n#define GL_OPERAND2_RGB 0x8592\n#define GL_OPERAND0_ALPHA 0x8598\n#define GL_OPERAND1_ALPHA 0x8599\n#define GL_OPERAND2_ALPHA 0x859A\n#define GL_RGB_SCALE 0x8573\n#define GL_ADD_SIGNED 0x8574\n#define GL_INTERPOLATE 0x8575\n#define GL_SUBTRACT 0x84E7\n#define GL_CONSTANT 0x8576\n#define GL_PRIMARY_COLOR 0x8577\n#define GL_PREVIOUS 0x8578\n#define GL_DOT3_RGB 0x86AE\n#define GL_DOT3_RGBA 0x86AF\n#define GL_BLEND_DST_RGB 0x80C8\n#define GL_BLEND_SRC_RGB 0x80C9\n#define GL_BLEND_DST_ALPHA 0x80CA\n#define GL_BLEND_SRC_ALPHA 0x80CB\n#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128\n#define GL_DEPTH_COMPONENT16 0x81A5\n#define GL_DEPTH_COMPONENT24 0x81A6\n#define GL_DEPTH_COMPONENT32 0x81A7\n#define GL_MIRRORED_REPEAT 0x8370\n#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD\n#define GL_TEXTURE_LOD_BIAS 0x8501\n#define GL_INCR_WRAP 0x8507\n#define GL_DECR_WRAP 0x8508\n#define GL_TEXTURE_DEPTH_SIZE 0x884A\n#define GL_TEXTURE_COMPARE_MODE 0x884C\n#define GL_TEXTURE_COMPARE_FUNC 0x884D\n#define GL_POINT_SIZE_MIN 0x8126\n#define GL_POINT_SIZE_MAX 0x8127\n#define GL_POINT_DISTANCE_ATTENUATION 0x8129\n#define GL_GENERATE_MIPMAP 0x8191\n#define GL_GENERATE_MIPMAP_HINT 0x8192\n#define GL_FOG_COORDINATE_SOURCE 0x8450\n#define GL_FOG_COORDINATE 0x8451\n#define GL_FRAGMENT_DEPTH 0x8452\n#define GL_CURRENT_FOG_COORDINATE 0x8453\n#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454\n#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455\n#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456\n#define GL_FOG_COORDINATE_ARRAY 0x8457\n#define GL_COLOR_SUM 0x8458\n#define GL_CURRENT_SECONDARY_COLOR 0x8459\n#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A\n#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B\n#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C\n#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D\n#define GL_SECONDARY_COLOR_ARRAY 0x845E\n#define GL_TEXTURE_FILTER_CONTROL 0x8500\n#define GL_DEPTH_TEXTURE_MODE 0x884B\n#define GL_COMPARE_R_TO_TEXTURE 0x884E\n#define GL_FUNC_ADD 0x8006\n#define GL_FUNC_SUBTRACT 0x800A\n#define GL_FUNC_REVERSE_SUBTRACT 0x800B\n#define GL_MIN 0x8007\n#define GL_MAX 0x8008\n#define GL_CONSTANT_COLOR 0x8001\n#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002\n#define GL_CONSTANT_ALPHA 0x8003\n#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004\n#define GL_BUFFER_SIZE 0x8764\n#define GL_BUFFER_USAGE 0x8765\n#define GL_QUERY_COUNTER_BITS 0x8864\n#define GL_CURRENT_QUERY 0x8865\n#define GL_QUERY_RESULT 0x8866\n#define GL_QUERY_RESULT_AVAILABLE 0x8867\n#define GL_ARRAY_BUFFER 0x8892\n#define GL_ELEMENT_ARRAY_BUFFER 0x8893\n#define GL_ARRAY_BUFFER_BINDING 0x8894\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\n#define GL_READ_ONLY 0x88B8\n#define GL_WRITE_ONLY 0x88B9\n#define GL_READ_WRITE 0x88BA\n#define GL_BUFFER_ACCESS 0x88BB\n#define GL_BUFFER_MAPPED 0x88BC\n#define GL_BUFFER_MAP_POINTER 0x88BD\n#define GL_STREAM_DRAW 0x88E0\n#define GL_STREAM_READ 0x88E1\n#define GL_STREAM_COPY 0x88E2\n#define GL_STATIC_DRAW 0x88E4\n#define GL_STATIC_READ 0x88E5\n#define GL_STATIC_COPY 0x88E6\n#define GL_DYNAMIC_DRAW 0x88E8\n#define GL_DYNAMIC_READ 0x88E9\n#define GL_DYNAMIC_COPY 0x88EA\n#define GL_SAMPLES_PASSED 0x8914\n#define GL_SRC1_ALPHA 0x8589\n#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896\n#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897\n#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898\n#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899\n#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A\n#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B\n#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C\n#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D\n#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E\n#define GL_FOG_COORD_SRC 0x8450\n#define GL_FOG_COORD 0x8451\n#define GL_CURRENT_FOG_COORD 0x8453\n#define GL_FOG_COORD_ARRAY_TYPE 0x8454\n#define GL_FOG_COORD_ARRAY_STRIDE 0x8455\n#define GL_FOG_COORD_ARRAY_POINTER 0x8456\n#define GL_FOG_COORD_ARRAY 0x8457\n#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D\n#define GL_SRC0_RGB 0x8580\n#define GL_SRC1_RGB 0x8581\n#define GL_SRC2_RGB 0x8582\n#define GL_SRC0_ALPHA 0x8588\n#define GL_SRC2_ALPHA 0x858A\n#define GL_BLEND_EQUATION_RGB 0x8009\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625\n#define GL_CURRENT_VERTEX_ATTRIB 0x8626\n#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645\n#define GL_STENCIL_BACK_FUNC 0x8800\n#define GL_STENCIL_BACK_FAIL 0x8801\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803\n#define GL_MAX_DRAW_BUFFERS 0x8824\n#define GL_DRAW_BUFFER0 0x8825\n#define GL_DRAW_BUFFER1 0x8826\n#define GL_DRAW_BUFFER2 0x8827\n#define GL_DRAW_BUFFER3 0x8828\n#define GL_DRAW_BUFFER4 0x8829\n#define GL_DRAW_BUFFER5 0x882A\n#define GL_DRAW_BUFFER6 0x882B\n#define GL_DRAW_BUFFER7 0x882C\n#define GL_DRAW_BUFFER8 0x882D\n#define GL_DRAW_BUFFER9 0x882E\n#define GL_DRAW_BUFFER10 0x882F\n#define GL_DRAW_BUFFER11 0x8830\n#define GL_DRAW_BUFFER12 0x8831\n#define GL_DRAW_BUFFER13 0x8832\n#define GL_DRAW_BUFFER14 0x8833\n#define GL_DRAW_BUFFER15 0x8834\n#define GL_BLEND_EQUATION_ALPHA 0x883D\n#define GL_MAX_VERTEX_ATTRIBS 0x8869\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A\n#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872\n#define GL_FRAGMENT_SHADER 0x8B30\n#define GL_VERTEX_SHADER 0x8B31\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A\n#define GL_MAX_VARYING_FLOATS 0x8B4B\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\n#define GL_SHADER_TYPE 0x8B4F\n#define GL_FLOAT_VEC2 0x8B50\n#define GL_FLOAT_VEC3 0x8B51\n#define GL_FLOAT_VEC4 0x8B52\n#define GL_INT_VEC2 0x8B53\n#define GL_INT_VEC3 0x8B54\n#define GL_INT_VEC4 0x8B55\n#define GL_BOOL 0x8B56\n#define GL_BOOL_VEC2 0x8B57\n#define GL_BOOL_VEC3 0x8B58\n#define GL_BOOL_VEC4 0x8B59\n#define GL_FLOAT_MAT2 0x8B5A\n#define GL_FLOAT_MAT3 0x8B5B\n#define GL_FLOAT_MAT4 0x8B5C\n#define GL_SAMPLER_1D 0x8B5D\n#define GL_SAMPLER_2D 0x8B5E\n#define GL_SAMPLER_3D 0x8B5F\n#define GL_SAMPLER_CUBE 0x8B60\n#define GL_SAMPLER_1D_SHADOW 0x8B61\n#define GL_SAMPLER_2D_SHADOW 0x8B62\n#define GL_DELETE_STATUS 0x8B80\n#define GL_COMPILE_STATUS 0x8B81\n#define GL_LINK_STATUS 0x8B82\n#define GL_VALIDATE_STATUS 0x8B83\n#define GL_INFO_LOG_LENGTH 0x8B84\n#define GL_ATTACHED_SHADERS 0x8B85\n#define GL_ACTIVE_UNIFORMS 0x8B86\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87\n#define GL_SHADER_SOURCE_LENGTH 0x8B88\n#define GL_ACTIVE_ATTRIBUTES 0x8B89\n#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\n#define GL_SHADING_LANGUAGE_VERSION 0x8B8C\n#define GL_CURRENT_PROGRAM 0x8B8D\n#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0\n#define GL_LOWER_LEFT 0x8CA1\n#define GL_UPPER_LEFT 0x8CA2\n#define GL_STENCIL_BACK_REF 0x8CA3\n#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4\n#define GL_STENCIL_BACK_WRITEMASK 0x8CA5\n#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643\n#define GL_POINT_SPRITE 0x8861\n#define GL_COORD_REPLACE 0x8862\n#define GL_MAX_TEXTURE_COORDS 0x8871\n#define GL_PIXEL_PACK_BUFFER 0x88EB\n#define GL_PIXEL_UNPACK_BUFFER 0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF\n#define GL_FLOAT_MAT2x3 0x8B65\n#define GL_FLOAT_MAT2x4 0x8B66\n#define GL_FLOAT_MAT3x2 0x8B67\n#define GL_FLOAT_MAT3x4 0x8B68\n#define GL_FLOAT_MAT4x2 0x8B69\n#define GL_FLOAT_MAT4x3 0x8B6A\n#define GL_SRGB 0x8C40\n#define GL_SRGB8 0x8C41\n#define GL_SRGB_ALPHA 0x8C42\n#define GL_SRGB8_ALPHA8 0x8C43\n#define GL_COMPRESSED_SRGB 0x8C48\n#define GL_COMPRESSED_SRGB_ALPHA 0x8C49\n#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F\n#define GL_SLUMINANCE_ALPHA 0x8C44\n#define GL_SLUMINANCE8_ALPHA8 0x8C45\n#define GL_SLUMINANCE 0x8C46\n#define GL_SLUMINANCE8 0x8C47\n#define GL_COMPRESSED_SLUMINANCE 0x8C4A\n#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B\n#define GL_COMPARE_REF_TO_TEXTURE 0x884E\n#define GL_CLIP_DISTANCE0 0x3000\n#define GL_CLIP_DISTANCE1 0x3001\n#define GL_CLIP_DISTANCE2 0x3002\n#define GL_CLIP_DISTANCE3 0x3003\n#define GL_CLIP_DISTANCE4 0x3004\n#define GL_CLIP_DISTANCE5 0x3005\n#define GL_CLIP_DISTANCE6 0x3006\n#define GL_CLIP_DISTANCE7 0x3007\n#define GL_MAX_CLIP_DISTANCES 0x0D32\n#define GL_MAJOR_VERSION 0x821B\n#define GL_MINOR_VERSION 0x821C\n#define GL_NUM_EXTENSIONS 0x821D\n#define GL_CONTEXT_FLAGS 0x821E\n#define GL_COMPRESSED_RED 0x8225\n#define GL_COMPRESSED_RG 0x8226\n#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001\n#define GL_RGBA32F 0x8814\n#define GL_RGB32F 0x8815\n#define GL_RGBA16F 0x881A\n#define GL_RGB16F 0x881B\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD\n#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF\n#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905\n#define GL_CLAMP_READ_COLOR 0x891C\n#define GL_FIXED_ONLY 0x891D\n#define GL_MAX_VARYING_COMPONENTS 0x8B4B\n#define GL_TEXTURE_1D_ARRAY 0x8C18\n#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19\n#define GL_TEXTURE_2D_ARRAY 0x8C1A\n#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B\n#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C\n#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D\n#define GL_R11F_G11F_B10F 0x8C3A\n#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B\n#define GL_RGB9_E5 0x8C3D\n#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E\n#define GL_TEXTURE_SHARED_SIZE 0x8C3F\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\n#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\n#define GL_PRIMITIVES_GENERATED 0x8C87\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\n#define GL_RASTERIZER_DISCARD 0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\n#define GL_INTERLEAVED_ATTRIBS 0x8C8C\n#define GL_SEPARATE_ATTRIBS 0x8C8D\n#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\n#define GL_RGBA32UI 0x8D70\n#define GL_RGB32UI 0x8D71\n#define GL_RGBA16UI 0x8D76\n#define GL_RGB16UI 0x8D77\n#define GL_RGBA8UI 0x8D7C\n#define GL_RGB8UI 0x8D7D\n#define GL_RGBA32I 0x8D82\n#define GL_RGB32I 0x8D83\n#define GL_RGBA16I 0x8D88\n#define GL_RGB16I 0x8D89\n#define GL_RGBA8I 0x8D8E\n#define GL_RGB8I 0x8D8F\n#define GL_RED_INTEGER 0x8D94\n#define GL_GREEN_INTEGER 0x8D95\n#define GL_BLUE_INTEGER 0x8D96\n#define GL_RGB_INTEGER 0x8D98\n#define GL_RGBA_INTEGER 0x8D99\n#define GL_BGR_INTEGER 0x8D9A\n#define GL_BGRA_INTEGER 0x8D9B\n#define GL_SAMPLER_1D_ARRAY 0x8DC0\n#define GL_SAMPLER_2D_ARRAY 0x8DC1\n#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3\n#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW 0x8DC5\n#define GL_UNSIGNED_INT_VEC2 0x8DC6\n#define GL_UNSIGNED_INT_VEC3 0x8DC7\n#define GL_UNSIGNED_INT_VEC4 0x8DC8\n#define GL_INT_SAMPLER_1D 0x8DC9\n#define GL_INT_SAMPLER_2D 0x8DCA\n#define GL_INT_SAMPLER_3D 0x8DCB\n#define GL_INT_SAMPLER_CUBE 0x8DCC\n#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE\n#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF\n#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1\n#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7\n#define GL_QUERY_WAIT 0x8E13\n#define GL_QUERY_NO_WAIT 0x8E14\n#define GL_QUERY_BY_REGION_WAIT 0x8E15\n#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16\n#define GL_BUFFER_ACCESS_FLAGS 0x911F\n#define GL_BUFFER_MAP_LENGTH 0x9120\n#define GL_BUFFER_MAP_OFFSET 0x9121\n#define GL_DEPTH_COMPONENT32F 0x8CAC\n#define GL_DEPTH32F_STENCIL8 0x8CAD\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\n#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\n#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\n#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\n#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\n#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\n#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\n#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\n#define GL_FRAMEBUFFER_DEFAULT 0x8218\n#define GL_FRAMEBUFFER_UNDEFINED 0x8219\n#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A\n#define GL_MAX_RENDERBUFFER_SIZE 0x84E8\n#define GL_DEPTH_STENCIL 0x84F9\n#define GL_UNSIGNED_INT_24_8 0x84FA\n#define GL_DEPTH24_STENCIL8 0x88F0\n#define GL_TEXTURE_STENCIL_SIZE 0x88F1\n#define GL_TEXTURE_RED_TYPE 0x8C10\n#define GL_TEXTURE_GREEN_TYPE 0x8C11\n#define GL_TEXTURE_BLUE_TYPE 0x8C12\n#define GL_TEXTURE_ALPHA_TYPE 0x8C13\n#define GL_TEXTURE_DEPTH_TYPE 0x8C16\n#define GL_UNSIGNED_NORMALIZED 0x8C17\n#define GL_FRAMEBUFFER_BINDING 0x8CA6\n#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6\n#define GL_RENDERBUFFER_BINDING 0x8CA7\n#define GL_READ_FRAMEBUFFER 0x8CA8\n#define GL_DRAW_FRAMEBUFFER 0x8CA9\n#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA\n#define GL_RENDERBUFFER_SAMPLES 0x8CAB\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\n#define GL_FRAMEBUFFER_COMPLETE 0x8CD5\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC\n#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD\n#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF\n#define GL_COLOR_ATTACHMENT0 0x8CE0\n#define GL_COLOR_ATTACHMENT1 0x8CE1\n#define GL_COLOR_ATTACHMENT2 0x8CE2\n#define GL_COLOR_ATTACHMENT3 0x8CE3\n#define GL_COLOR_ATTACHMENT4 0x8CE4\n#define GL_COLOR_ATTACHMENT5 0x8CE5\n#define GL_COLOR_ATTACHMENT6 0x8CE6\n#define GL_COLOR_ATTACHMENT7 0x8CE7\n#define GL_COLOR_ATTACHMENT8 0x8CE8\n#define GL_COLOR_ATTACHMENT9 0x8CE9\n#define GL_COLOR_ATTACHMENT10 0x8CEA\n#define GL_COLOR_ATTACHMENT11 0x8CEB\n#define GL_COLOR_ATTACHMENT12 0x8CEC\n#define GL_COLOR_ATTACHMENT13 0x8CED\n#define GL_COLOR_ATTACHMENT14 0x8CEE\n#define GL_COLOR_ATTACHMENT15 0x8CEF\n#define GL_COLOR_ATTACHMENT16 0x8CF0\n#define GL_COLOR_ATTACHMENT17 0x8CF1\n#define GL_COLOR_ATTACHMENT18 0x8CF2\n#define GL_COLOR_ATTACHMENT19 0x8CF3\n#define GL_COLOR_ATTACHMENT20 0x8CF4\n#define GL_COLOR_ATTACHMENT21 0x8CF5\n#define GL_COLOR_ATTACHMENT22 0x8CF6\n#define GL_COLOR_ATTACHMENT23 0x8CF7\n#define GL_COLOR_ATTACHMENT24 0x8CF8\n#define GL_COLOR_ATTACHMENT25 0x8CF9\n#define GL_COLOR_ATTACHMENT26 0x8CFA\n#define GL_COLOR_ATTACHMENT27 0x8CFB\n#define GL_COLOR_ATTACHMENT28 0x8CFC\n#define GL_COLOR_ATTACHMENT29 0x8CFD\n#define GL_COLOR_ATTACHMENT30 0x8CFE\n#define GL_COLOR_ATTACHMENT31 0x8CFF\n#define GL_DEPTH_ATTACHMENT 0x8D00\n#define GL_STENCIL_ATTACHMENT 0x8D20\n#define GL_FRAMEBUFFER 0x8D40\n#define GL_RENDERBUFFER 0x8D41\n#define GL_RENDERBUFFER_WIDTH 0x8D42\n#define GL_RENDERBUFFER_HEIGHT 0x8D43\n#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44\n#define GL_STENCIL_INDEX1 0x8D46\n#define GL_STENCIL_INDEX4 0x8D47\n#define GL_STENCIL_INDEX8 0x8D48\n#define GL_STENCIL_INDEX16 0x8D49\n#define GL_RENDERBUFFER_RED_SIZE 0x8D50\n#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51\n#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52\n#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53\n#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54\n#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\n#define GL_MAX_SAMPLES 0x8D57\n#define GL_INDEX 0x8222\n#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14\n#define GL_TEXTURE_INTENSITY_TYPE 0x8C15\n#define GL_FRAMEBUFFER_SRGB 0x8DB9\n#define GL_HALF_FLOAT 0x140B\n#define GL_MAP_READ_BIT 0x0001\n#define GL_MAP_WRITE_BIT 0x0002\n#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004\n#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008\n#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010\n#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020\n#define GL_COMPRESSED_RED_RGTC1 0x8DBB\n#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC\n#define GL_COMPRESSED_RG_RGTC2 0x8DBD\n#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE\n#define GL_RG 0x8227\n#define GL_RG_INTEGER 0x8228\n#define GL_R8 0x8229\n#define GL_R16 0x822A\n#define GL_RG8 0x822B\n#define GL_RG16 0x822C\n#define GL_R16F 0x822D\n#define GL_R32F 0x822E\n#define GL_RG16F 0x822F\n#define GL_RG32F 0x8230\n#define GL_R8I 0x8231\n#define GL_R8UI 0x8232\n#define GL_R16I 0x8233\n#define GL_R16UI 0x8234\n#define GL_R32I 0x8235\n#define GL_R32UI 0x8236\n#define GL_RG8I 0x8237\n#define GL_RG8UI 0x8238\n#define GL_RG16I 0x8239\n#define GL_RG16UI 0x823A\n#define GL_RG32I 0x823B\n#define GL_RG32UI 0x823C\n#define GL_VERTEX_ARRAY_BINDING 0x85B5\n#define GL_CLAMP_VERTEX_COLOR 0x891A\n#define GL_CLAMP_FRAGMENT_COLOR 0x891B\n#define GL_ALPHA_INTEGER 0x8D97\n#define GL_SAMPLER_2D_RECT 0x8B63\n#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64\n#define GL_SAMPLER_BUFFER 0x8DC2\n#define GL_INT_SAMPLER_2D_RECT 0x8DCD\n#define GL_INT_SAMPLER_BUFFER 0x8DD0\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8\n#define GL_TEXTURE_BUFFER 0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER 0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D\n#define GL_TEXTURE_RECTANGLE 0x84F5\n#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6\n#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8\n#define GL_R8_SNORM 0x8F94\n#define GL_RG8_SNORM 0x8F95\n#define GL_RGB8_SNORM 0x8F96\n#define GL_RGBA8_SNORM 0x8F97\n#define GL_R16_SNORM 0x8F98\n#define GL_RG16_SNORM 0x8F99\n#define GL_RGB16_SNORM 0x8F9A\n#define GL_RGBA16_SNORM 0x8F9B\n#define GL_SIGNED_NORMALIZED 0x8F9C\n#define GL_PRIMITIVE_RESTART 0x8F9D\n#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E\n#define GL_COPY_READ_BUFFER 0x8F36\n#define GL_COPY_WRITE_BUFFER 0x8F37\n#define GL_UNIFORM_BUFFER 0x8A11\n#define GL_UNIFORM_BUFFER_BINDING 0x8A28\n#define GL_UNIFORM_BUFFER_START 0x8A29\n#define GL_UNIFORM_BUFFER_SIZE 0x8A2A\n#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C\n#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D\n#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E\n#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F\n#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30\n#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32\n#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33\n#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34\n#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35\n#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36\n#define GL_UNIFORM_TYPE 0x8A37\n#define GL_UNIFORM_SIZE 0x8A38\n#define GL_UNIFORM_NAME_LENGTH 0x8A39\n#define GL_UNIFORM_BLOCK_INDEX 0x8A3A\n#define GL_UNIFORM_OFFSET 0x8A3B\n#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C\n#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D\n#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E\n#define GL_UNIFORM_BLOCK_BINDING 0x8A3F\n#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40\n#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46\n#define GL_INVALID_INDEX 0xFFFFFFFF\n#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001\n#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\n#define GL_LINES_ADJACENCY 0x000A\n#define GL_LINE_STRIP_ADJACENCY 0x000B\n#define GL_TRIANGLES_ADJACENCY 0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D\n#define GL_PROGRAM_POINT_SIZE 0x8642\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8\n#define GL_GEOMETRY_SHADER 0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT 0x8916\n#define GL_GEOMETRY_INPUT_TYPE 0x8917\n#define GL_GEOMETRY_OUTPUT_TYPE 0x8918\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1\n#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124\n#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125\n#define GL_CONTEXT_PROFILE_MASK 0x9126\n#define GL_DEPTH_CLAMP 0x864F\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C\n#define GL_FIRST_VERTEX_CONVENTION 0x8E4D\n#define GL_LAST_VERTEX_CONVENTION 0x8E4E\n#define GL_PROVOKING_VERTEX 0x8E4F\n#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F\n#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111\n#define GL_OBJECT_TYPE 0x9112\n#define GL_SYNC_CONDITION 0x9113\n#define GL_SYNC_STATUS 0x9114\n#define GL_SYNC_FLAGS 0x9115\n#define GL_SYNC_FENCE 0x9116\n#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117\n#define GL_UNSIGNALED 0x9118\n#define GL_SIGNALED 0x9119\n#define GL_ALREADY_SIGNALED 0x911A\n#define GL_TIMEOUT_EXPIRED 0x911B\n#define GL_CONDITION_SATISFIED 0x911C\n#define GL_WAIT_FAILED 0x911D\n#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF\n#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001\n#define GL_SAMPLE_POSITION 0x8E50\n#define GL_SAMPLE_MASK 0x8E51\n#define GL_SAMPLE_MASK_VALUE 0x8E52\n#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59\n#define GL_TEXTURE_2D_MULTISAMPLE 0x9100\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101\n#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105\n#define GL_TEXTURE_SAMPLES 0x9106\n#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107\n#define GL_SAMPLER_2D_MULTISAMPLE 0x9108\n#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\n#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E\n#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F\n#define GL_MAX_INTEGER_SAMPLES 0x9110\n#ifndef GL_VERSION_1_0\n#define GL_VERSION_1_0 1\nGLAPI int GLAD_GL_VERSION_1_0;\ntypedef void (APIENTRYP PFNGLCULLFACEPROC)(GLenum mode);\nGLAPI PFNGLCULLFACEPROC glad_glCullFace;\n#define glCullFace glad_glCullFace\ntypedef void (APIENTRYP PFNGLFRONTFACEPROC)(GLenum mode);\nGLAPI PFNGLFRONTFACEPROC glad_glFrontFace;\n#define glFrontFace glad_glFrontFace\ntypedef void (APIENTRYP PFNGLHINTPROC)(GLenum target, GLenum mode);\nGLAPI PFNGLHINTPROC glad_glHint;\n#define glHint glad_glHint\ntypedef void (APIENTRYP PFNGLLINEWIDTHPROC)(GLfloat width);\nGLAPI PFNGLLINEWIDTHPROC glad_glLineWidth;\n#define glLineWidth glad_glLineWidth\ntypedef void (APIENTRYP PFNGLPOINTSIZEPROC)(GLfloat size);\nGLAPI PFNGLPOINTSIZEPROC glad_glPointSize;\n#define glPointSize glad_glPointSize\ntypedef void (APIENTRYP PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode);\nGLAPI PFNGLPOLYGONMODEPROC glad_glPolygonMode;\n#define glPolygonMode glad_glPolygonMode\ntypedef void (APIENTRYP PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI PFNGLSCISSORPROC glad_glScissor;\n#define glScissor glad_glScissor\ntypedef void (APIENTRYP PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param);\nGLAPI PFNGLTEXPARAMETERFPROC glad_glTexParameterf;\n#define glTexParameterf glad_glTexParameterf\ntypedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat *params);\nGLAPI PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv;\n#define glTexParameterfv glad_glTexParameterfv\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param);\nGLAPI PFNGLTEXPARAMETERIPROC glad_glTexParameteri;\n#define glTexParameteri glad_glTexParameteri\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint *params);\nGLAPI PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv;\n#define glTexParameteriv glad_glTexParameteriv\ntypedef void (APIENTRYP PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI PFNGLTEXIMAGE1DPROC glad_glTexImage1D;\n#define glTexImage1D glad_glTexImage1D\ntypedef void (APIENTRYP PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI PFNGLTEXIMAGE2DPROC glad_glTexImage2D;\n#define glTexImage2D glad_glTexImage2D\ntypedef void (APIENTRYP PFNGLDRAWBUFFERPROC)(GLenum buf);\nGLAPI PFNGLDRAWBUFFERPROC glad_glDrawBuffer;\n#define glDrawBuffer glad_glDrawBuffer\ntypedef void (APIENTRYP PFNGLCLEARPROC)(GLbitfield mask);\nGLAPI PFNGLCLEARPROC glad_glClear;\n#define glClear glad_glClear\ntypedef void (APIENTRYP PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI PFNGLCLEARCOLORPROC glad_glClearColor;\n#define glClearColor glad_glClearColor\ntypedef void (APIENTRYP PFNGLCLEARSTENCILPROC)(GLint s);\nGLAPI PFNGLCLEARSTENCILPROC glad_glClearStencil;\n#define glClearStencil glad_glClearStencil\ntypedef void (APIENTRYP PFNGLCLEARDEPTHPROC)(GLdouble depth);\nGLAPI PFNGLCLEARDEPTHPROC glad_glClearDepth;\n#define glClearDepth glad_glClearDepth\ntypedef void (APIENTRYP PFNGLSTENCILMASKPROC)(GLuint mask);\nGLAPI PFNGLSTENCILMASKPROC glad_glStencilMask;\n#define glStencilMask glad_glStencilMask\ntypedef void (APIENTRYP PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\nGLAPI PFNGLCOLORMASKPROC glad_glColorMask;\n#define glColorMask glad_glColorMask\ntypedef void (APIENTRYP PFNGLDEPTHMASKPROC)(GLboolean flag);\nGLAPI PFNGLDEPTHMASKPROC glad_glDepthMask;\n#define glDepthMask glad_glDepthMask\ntypedef void (APIENTRYP PFNGLDISABLEPROC)(GLenum cap);\nGLAPI PFNGLDISABLEPROC glad_glDisable;\n#define glDisable glad_glDisable\ntypedef void (APIENTRYP PFNGLENABLEPROC)(GLenum cap);\nGLAPI PFNGLENABLEPROC glad_glEnable;\n#define glEnable glad_glEnable\ntypedef void (APIENTRYP PFNGLFINISHPROC)();\nGLAPI PFNGLFINISHPROC glad_glFinish;\n#define glFinish glad_glFinish\ntypedef void (APIENTRYP PFNGLFLUSHPROC)();\nGLAPI PFNGLFLUSHPROC glad_glFlush;\n#define glFlush glad_glFlush\ntypedef void (APIENTRYP PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor);\nGLAPI PFNGLBLENDFUNCPROC glad_glBlendFunc;\n#define glBlendFunc glad_glBlendFunc\ntypedef void (APIENTRYP PFNGLLOGICOPPROC)(GLenum opcode);\nGLAPI PFNGLLOGICOPPROC glad_glLogicOp;\n#define glLogicOp glad_glLogicOp\ntypedef void (APIENTRYP PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask);\nGLAPI PFNGLSTENCILFUNCPROC glad_glStencilFunc;\n#define glStencilFunc glad_glStencilFunc\ntypedef void (APIENTRYP PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass);\nGLAPI PFNGLSTENCILOPPROC glad_glStencilOp;\n#define glStencilOp glad_glStencilOp\ntypedef void (APIENTRYP PFNGLDEPTHFUNCPROC)(GLenum func);\nGLAPI PFNGLDEPTHFUNCPROC glad_glDepthFunc;\n#define glDepthFunc glad_glDepthFunc\ntypedef void (APIENTRYP PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param);\nGLAPI PFNGLPIXELSTOREFPROC glad_glPixelStoref;\n#define glPixelStoref glad_glPixelStoref\ntypedef void (APIENTRYP PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param);\nGLAPI PFNGLPIXELSTOREIPROC glad_glPixelStorei;\n#define glPixelStorei glad_glPixelStorei\ntypedef void (APIENTRYP PFNGLREADBUFFERPROC)(GLenum src);\nGLAPI PFNGLREADBUFFERPROC glad_glReadBuffer;\n#define glReadBuffer glad_glReadBuffer\ntypedef void (APIENTRYP PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);\nGLAPI PFNGLREADPIXELSPROC glad_glReadPixels;\n#define glReadPixels glad_glReadPixels\ntypedef void (APIENTRYP PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean *data);\nGLAPI PFNGLGETBOOLEANVPROC glad_glGetBooleanv;\n#define glGetBooleanv glad_glGetBooleanv\ntypedef void (APIENTRYP PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble *data);\nGLAPI PFNGLGETDOUBLEVPROC glad_glGetDoublev;\n#define glGetDoublev glad_glGetDoublev\ntypedef GLenum (APIENTRYP PFNGLGETERRORPROC)();\nGLAPI PFNGLGETERRORPROC glad_glGetError;\n#define glGetError glad_glGetError\ntypedef void (APIENTRYP PFNGLGETFLOATVPROC)(GLenum pname, GLfloat *data);\nGLAPI PFNGLGETFLOATVPROC glad_glGetFloatv;\n#define glGetFloatv glad_glGetFloatv\ntypedef void (APIENTRYP PFNGLGETINTEGERVPROC)(GLenum pname, GLint *data);\nGLAPI PFNGLGETINTEGERVPROC glad_glGetIntegerv;\n#define glGetIntegerv glad_glGetIntegerv\ntypedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC)(GLenum name);\nGLAPI PFNGLGETSTRINGPROC glad_glGetString;\n#define glGetString glad_glGetString\ntypedef void (APIENTRYP PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);\nGLAPI PFNGLGETTEXIMAGEPROC glad_glGetTexImage;\n#define glGetTexImage glad_glGetTexImage\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat *params);\nGLAPI PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv;\n#define glGetTexParameterfv glad_glGetTexParameterfv\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);\nGLAPI PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv;\n#define glGetTexParameteriv glad_glGetTexParameteriv\ntypedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat *params);\nGLAPI PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv;\n#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv\ntypedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint *params);\nGLAPI PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv;\n#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv\ntypedef GLboolean (APIENTRYP PFNGLISENABLEDPROC)(GLenum cap);\nGLAPI PFNGLISENABLEDPROC glad_glIsEnabled;\n#define glIsEnabled glad_glIsEnabled\ntypedef void (APIENTRYP PFNGLDEPTHRANGEPROC)(GLdouble near, GLdouble far);\nGLAPI PFNGLDEPTHRANGEPROC glad_glDepthRange;\n#define glDepthRange glad_glDepthRange\ntypedef void (APIENTRYP PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI PFNGLVIEWPORTPROC glad_glViewport;\n#define glViewport glad_glViewport\ntypedef void (APIENTRYP PFNGLNEWLISTPROC)(GLuint list, GLenum mode);\nGLAPI PFNGLNEWLISTPROC glad_glNewList;\n#define glNewList glad_glNewList\ntypedef void (APIENTRYP PFNGLENDLISTPROC)();\nGLAPI PFNGLENDLISTPROC glad_glEndList;\n#define glEndList glad_glEndList\ntypedef void (APIENTRYP PFNGLCALLLISTPROC)(GLuint list);\nGLAPI PFNGLCALLLISTPROC glad_glCallList;\n#define glCallList glad_glCallList\ntypedef void (APIENTRYP PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void *lists);\nGLAPI PFNGLCALLLISTSPROC glad_glCallLists;\n#define glCallLists glad_glCallLists\ntypedef void (APIENTRYP PFNGLDELETELISTSPROC)(GLuint list, GLsizei range);\nGLAPI PFNGLDELETELISTSPROC glad_glDeleteLists;\n#define glDeleteLists glad_glDeleteLists\ntypedef GLuint (APIENTRYP PFNGLGENLISTSPROC)(GLsizei range);\nGLAPI PFNGLGENLISTSPROC glad_glGenLists;\n#define glGenLists glad_glGenLists\ntypedef void (APIENTRYP PFNGLLISTBASEPROC)(GLuint base);\nGLAPI PFNGLLISTBASEPROC glad_glListBase;\n#define glListBase glad_glListBase\ntypedef void (APIENTRYP PFNGLBEGINPROC)(GLenum mode);\nGLAPI PFNGLBEGINPROC glad_glBegin;\n#define glBegin glad_glBegin\ntypedef void (APIENTRYP PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);\nGLAPI PFNGLBITMAPPROC glad_glBitmap;\n#define glBitmap glad_glBitmap\ntypedef void (APIENTRYP PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue);\nGLAPI PFNGLCOLOR3BPROC glad_glColor3b;\n#define glColor3b glad_glColor3b\ntypedef void (APIENTRYP PFNGLCOLOR3BVPROC)(const GLbyte *v);\nGLAPI PFNGLCOLOR3BVPROC glad_glColor3bv;\n#define glColor3bv glad_glColor3bv\ntypedef void (APIENTRYP PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue);\nGLAPI PFNGLCOLOR3DPROC glad_glColor3d;\n#define glColor3d glad_glColor3d\ntypedef void (APIENTRYP PFNGLCOLOR3DVPROC)(const GLdouble *v);\nGLAPI PFNGLCOLOR3DVPROC glad_glColor3dv;\n#define glColor3dv glad_glColor3dv\ntypedef void (APIENTRYP PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue);\nGLAPI PFNGLCOLOR3FPROC glad_glColor3f;\n#define glColor3f glad_glColor3f\ntypedef void (APIENTRYP PFNGLCOLOR3FVPROC)(const GLfloat *v);\nGLAPI PFNGLCOLOR3FVPROC glad_glColor3fv;\n#define glColor3fv glad_glColor3fv\ntypedef void (APIENTRYP PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue);\nGLAPI PFNGLCOLOR3IPROC glad_glColor3i;\n#define glColor3i glad_glColor3i\ntypedef void (APIENTRYP PFNGLCOLOR3IVPROC)(const GLint *v);\nGLAPI PFNGLCOLOR3IVPROC glad_glColor3iv;\n#define glColor3iv glad_glColor3iv\ntypedef void (APIENTRYP PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue);\nGLAPI PFNGLCOLOR3SPROC glad_glColor3s;\n#define glColor3s glad_glColor3s\ntypedef void (APIENTRYP PFNGLCOLOR3SVPROC)(const GLshort *v);\nGLAPI PFNGLCOLOR3SVPROC glad_glColor3sv;\n#define glColor3sv glad_glColor3sv\ntypedef void (APIENTRYP PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue);\nGLAPI PFNGLCOLOR3UBPROC glad_glColor3ub;\n#define glColor3ub glad_glColor3ub\ntypedef void (APIENTRYP PFNGLCOLOR3UBVPROC)(const GLubyte *v);\nGLAPI PFNGLCOLOR3UBVPROC glad_glColor3ubv;\n#define glColor3ubv glad_glColor3ubv\ntypedef void (APIENTRYP PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue);\nGLAPI PFNGLCOLOR3UIPROC glad_glColor3ui;\n#define glColor3ui glad_glColor3ui\ntypedef void (APIENTRYP PFNGLCOLOR3UIVPROC)(const GLuint *v);\nGLAPI PFNGLCOLOR3UIVPROC glad_glColor3uiv;\n#define glColor3uiv glad_glColor3uiv\ntypedef void (APIENTRYP PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue);\nGLAPI PFNGLCOLOR3USPROC glad_glColor3us;\n#define glColor3us glad_glColor3us\ntypedef void (APIENTRYP PFNGLCOLOR3USVPROC)(const GLushort *v);\nGLAPI PFNGLCOLOR3USVPROC glad_glColor3usv;\n#define glColor3usv glad_glColor3usv\ntypedef void (APIENTRYP PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);\nGLAPI PFNGLCOLOR4BPROC glad_glColor4b;\n#define glColor4b glad_glColor4b\ntypedef void (APIENTRYP PFNGLCOLOR4BVPROC)(const GLbyte *v);\nGLAPI PFNGLCOLOR4BVPROC glad_glColor4bv;\n#define glColor4bv glad_glColor4bv\ntypedef void (APIENTRYP PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);\nGLAPI PFNGLCOLOR4DPROC glad_glColor4d;\n#define glColor4d glad_glColor4d\ntypedef void (APIENTRYP PFNGLCOLOR4DVPROC)(const GLdouble *v);\nGLAPI PFNGLCOLOR4DVPROC glad_glColor4dv;\n#define glColor4dv glad_glColor4dv\ntypedef void (APIENTRYP PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI PFNGLCOLOR4FPROC glad_glColor4f;\n#define glColor4f glad_glColor4f\ntypedef void (APIENTRYP PFNGLCOLOR4FVPROC)(const GLfloat *v);\nGLAPI PFNGLCOLOR4FVPROC glad_glColor4fv;\n#define glColor4fv glad_glColor4fv\ntypedef void (APIENTRYP PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha);\nGLAPI PFNGLCOLOR4IPROC glad_glColor4i;\n#define glColor4i glad_glColor4i\ntypedef void (APIENTRYP PFNGLCOLOR4IVPROC)(const GLint *v);\nGLAPI PFNGLCOLOR4IVPROC glad_glColor4iv;\n#define glColor4iv glad_glColor4iv\ntypedef void (APIENTRYP PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha);\nGLAPI PFNGLCOLOR4SPROC glad_glColor4s;\n#define glColor4s glad_glColor4s\ntypedef void (APIENTRYP PFNGLCOLOR4SVPROC)(const GLshort *v);\nGLAPI PFNGLCOLOR4SVPROC glad_glColor4sv;\n#define glColor4sv glad_glColor4sv\ntypedef void (APIENTRYP PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);\nGLAPI PFNGLCOLOR4UBPROC glad_glColor4ub;\n#define glColor4ub glad_glColor4ub\ntypedef void (APIENTRYP PFNGLCOLOR4UBVPROC)(const GLubyte *v);\nGLAPI PFNGLCOLOR4UBVPROC glad_glColor4ubv;\n#define glColor4ubv glad_glColor4ubv\ntypedef void (APIENTRYP PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha);\nGLAPI PFNGLCOLOR4UIPROC glad_glColor4ui;\n#define glColor4ui glad_glColor4ui\ntypedef void (APIENTRYP PFNGLCOLOR4UIVPROC)(const GLuint *v);\nGLAPI PFNGLCOLOR4UIVPROC glad_glColor4uiv;\n#define glColor4uiv glad_glColor4uiv\ntypedef void (APIENTRYP PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha);\nGLAPI PFNGLCOLOR4USPROC glad_glColor4us;\n#define glColor4us glad_glColor4us\ntypedef void (APIENTRYP PFNGLCOLOR4USVPROC)(const GLushort *v);\nGLAPI PFNGLCOLOR4USVPROC glad_glColor4usv;\n#define glColor4usv glad_glColor4usv\ntypedef void (APIENTRYP PFNGLEDGEFLAGPROC)(GLboolean flag);\nGLAPI PFNGLEDGEFLAGPROC glad_glEdgeFlag;\n#define glEdgeFlag glad_glEdgeFlag\ntypedef void (APIENTRYP PFNGLEDGEFLAGVPROC)(const GLboolean *flag);\nGLAPI PFNGLEDGEFLAGVPROC glad_glEdgeFlagv;\n#define glEdgeFlagv glad_glEdgeFlagv\ntypedef void (APIENTRYP PFNGLENDPROC)();\nGLAPI PFNGLENDPROC glad_glEnd;\n#define glEnd glad_glEnd\ntypedef void (APIENTRYP PFNGLINDEXDPROC)(GLdouble c);\nGLAPI PFNGLINDEXDPROC glad_glIndexd;\n#define glIndexd glad_glIndexd\ntypedef void (APIENTRYP PFNGLINDEXDVPROC)(const GLdouble *c);\nGLAPI PFNGLINDEXDVPROC glad_glIndexdv;\n#define glIndexdv glad_glIndexdv\ntypedef void (APIENTRYP PFNGLINDEXFPROC)(GLfloat c);\nGLAPI PFNGLINDEXFPROC glad_glIndexf;\n#define glIndexf glad_glIndexf\ntypedef void (APIENTRYP PFNGLINDEXFVPROC)(const GLfloat *c);\nGLAPI PFNGLINDEXFVPROC glad_glIndexfv;\n#define glIndexfv glad_glIndexfv\ntypedef void (APIENTRYP PFNGLINDEXIPROC)(GLint c);\nGLAPI PFNGLINDEXIPROC glad_glIndexi;\n#define glIndexi glad_glIndexi\ntypedef void (APIENTRYP PFNGLINDEXIVPROC)(const GLint *c);\nGLAPI PFNGLINDEXIVPROC glad_glIndexiv;\n#define glIndexiv glad_glIndexiv\ntypedef void (APIENTRYP PFNGLINDEXSPROC)(GLshort c);\nGLAPI PFNGLINDEXSPROC glad_glIndexs;\n#define glIndexs glad_glIndexs\ntypedef void (APIENTRYP PFNGLINDEXSVPROC)(const GLshort *c);\nGLAPI PFNGLINDEXSVPROC glad_glIndexsv;\n#define glIndexsv glad_glIndexsv\ntypedef void (APIENTRYP PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz);\nGLAPI PFNGLNORMAL3BPROC glad_glNormal3b;\n#define glNormal3b glad_glNormal3b\ntypedef void (APIENTRYP PFNGLNORMAL3BVPROC)(const GLbyte *v);\nGLAPI PFNGLNORMAL3BVPROC glad_glNormal3bv;\n#define glNormal3bv glad_glNormal3bv\ntypedef void (APIENTRYP PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz);\nGLAPI PFNGLNORMAL3DPROC glad_glNormal3d;\n#define glNormal3d glad_glNormal3d\ntypedef void (APIENTRYP PFNGLNORMAL3DVPROC)(const GLdouble *v);\nGLAPI PFNGLNORMAL3DVPROC glad_glNormal3dv;\n#define glNormal3dv glad_glNormal3dv\ntypedef void (APIENTRYP PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz);\nGLAPI PFNGLNORMAL3FPROC glad_glNormal3f;\n#define glNormal3f glad_glNormal3f\ntypedef void (APIENTRYP PFNGLNORMAL3FVPROC)(const GLfloat *v);\nGLAPI PFNGLNORMAL3FVPROC glad_glNormal3fv;\n#define glNormal3fv glad_glNormal3fv\ntypedef void (APIENTRYP PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz);\nGLAPI PFNGLNORMAL3IPROC glad_glNormal3i;\n#define glNormal3i glad_glNormal3i\ntypedef void (APIENTRYP PFNGLNORMAL3IVPROC)(const GLint *v);\nGLAPI PFNGLNORMAL3IVPROC glad_glNormal3iv;\n#define glNormal3iv glad_glNormal3iv\ntypedef void (APIENTRYP PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz);\nGLAPI PFNGLNORMAL3SPROC glad_glNormal3s;\n#define glNormal3s glad_glNormal3s\ntypedef void (APIENTRYP PFNGLNORMAL3SVPROC)(const GLshort *v);\nGLAPI PFNGLNORMAL3SVPROC glad_glNormal3sv;\n#define glNormal3sv glad_glNormal3sv\ntypedef void (APIENTRYP PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y);\nGLAPI PFNGLRASTERPOS2DPROC glad_glRasterPos2d;\n#define glRasterPos2d glad_glRasterPos2d\ntypedef void (APIENTRYP PFNGLRASTERPOS2DVPROC)(const GLdouble *v);\nGLAPI PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv;\n#define glRasterPos2dv glad_glRasterPos2dv\ntypedef void (APIENTRYP PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y);\nGLAPI PFNGLRASTERPOS2FPROC glad_glRasterPos2f;\n#define glRasterPos2f glad_glRasterPos2f\ntypedef void (APIENTRYP PFNGLRASTERPOS2FVPROC)(const GLfloat *v);\nGLAPI PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv;\n#define glRasterPos2fv glad_glRasterPos2fv\ntypedef void (APIENTRYP PFNGLRASTERPOS2IPROC)(GLint x, GLint y);\nGLAPI PFNGLRASTERPOS2IPROC glad_glRasterPos2i;\n#define glRasterPos2i glad_glRasterPos2i\ntypedef void (APIENTRYP PFNGLRASTERPOS2IVPROC)(const GLint *v);\nGLAPI PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv;\n#define glRasterPos2iv glad_glRasterPos2iv\ntypedef void (APIENTRYP PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y);\nGLAPI PFNGLRASTERPOS2SPROC glad_glRasterPos2s;\n#define glRasterPos2s glad_glRasterPos2s\ntypedef void (APIENTRYP PFNGLRASTERPOS2SVPROC)(const GLshort *v);\nGLAPI PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv;\n#define glRasterPos2sv glad_glRasterPos2sv\ntypedef void (APIENTRYP PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z);\nGLAPI PFNGLRASTERPOS3DPROC glad_glRasterPos3d;\n#define glRasterPos3d glad_glRasterPos3d\ntypedef void (APIENTRYP PFNGLRASTERPOS3DVPROC)(const GLdouble *v);\nGLAPI PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv;\n#define glRasterPos3dv glad_glRasterPos3dv\ntypedef void (APIENTRYP PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z);\nGLAPI PFNGLRASTERPOS3FPROC glad_glRasterPos3f;\n#define glRasterPos3f glad_glRasterPos3f\ntypedef void (APIENTRYP PFNGLRASTERPOS3FVPROC)(const GLfloat *v);\nGLAPI PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv;\n#define glRasterPos3fv glad_glRasterPos3fv\ntypedef void (APIENTRYP PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z);\nGLAPI PFNGLRASTERPOS3IPROC glad_glRasterPos3i;\n#define glRasterPos3i glad_glRasterPos3i\ntypedef void (APIENTRYP PFNGLRASTERPOS3IVPROC)(const GLint *v);\nGLAPI PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv;\n#define glRasterPos3iv glad_glRasterPos3iv\ntypedef void (APIENTRYP PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z);\nGLAPI PFNGLRASTERPOS3SPROC glad_glRasterPos3s;\n#define glRasterPos3s glad_glRasterPos3s\ntypedef void (APIENTRYP PFNGLRASTERPOS3SVPROC)(const GLshort *v);\nGLAPI PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv;\n#define glRasterPos3sv glad_glRasterPos3sv\ntypedef void (APIENTRYP PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI PFNGLRASTERPOS4DPROC glad_glRasterPos4d;\n#define glRasterPos4d glad_glRasterPos4d\ntypedef void (APIENTRYP PFNGLRASTERPOS4DVPROC)(const GLdouble *v);\nGLAPI PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv;\n#define glRasterPos4dv glad_glRasterPos4dv\ntypedef void (APIENTRYP PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI PFNGLRASTERPOS4FPROC glad_glRasterPos4f;\n#define glRasterPos4f glad_glRasterPos4f\ntypedef void (APIENTRYP PFNGLRASTERPOS4FVPROC)(const GLfloat *v);\nGLAPI PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv;\n#define glRasterPos4fv glad_glRasterPos4fv\ntypedef void (APIENTRYP PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w);\nGLAPI PFNGLRASTERPOS4IPROC glad_glRasterPos4i;\n#define glRasterPos4i glad_glRasterPos4i\ntypedef void (APIENTRYP PFNGLRASTERPOS4IVPROC)(const GLint *v);\nGLAPI PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv;\n#define glRasterPos4iv glad_glRasterPos4iv\ntypedef void (APIENTRYP PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI PFNGLRASTERPOS4SPROC glad_glRasterPos4s;\n#define glRasterPos4s glad_glRasterPos4s\ntypedef void (APIENTRYP PFNGLRASTERPOS4SVPROC)(const GLshort *v);\nGLAPI PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv;\n#define glRasterPos4sv glad_glRasterPos4sv\ntypedef void (APIENTRYP PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);\nGLAPI PFNGLRECTDPROC glad_glRectd;\n#define glRectd glad_glRectd\ntypedef void (APIENTRYP PFNGLRECTDVPROC)(const GLdouble *v1, const GLdouble *v2);\nGLAPI PFNGLRECTDVPROC glad_glRectdv;\n#define glRectdv glad_glRectdv\ntypedef void (APIENTRYP PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);\nGLAPI PFNGLRECTFPROC glad_glRectf;\n#define glRectf glad_glRectf\ntypedef void (APIENTRYP PFNGLRECTFVPROC)(const GLfloat *v1, const GLfloat *v2);\nGLAPI PFNGLRECTFVPROC glad_glRectfv;\n#define glRectfv glad_glRectfv\ntypedef void (APIENTRYP PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2);\nGLAPI PFNGLRECTIPROC glad_glRecti;\n#define glRecti glad_glRecti\ntypedef void (APIENTRYP PFNGLRECTIVPROC)(const GLint *v1, const GLint *v2);\nGLAPI PFNGLRECTIVPROC glad_glRectiv;\n#define glRectiv glad_glRectiv\ntypedef void (APIENTRYP PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2);\nGLAPI PFNGLRECTSPROC glad_glRects;\n#define glRects glad_glRects\ntypedef void (APIENTRYP PFNGLRECTSVPROC)(const GLshort *v1, const GLshort *v2);\nGLAPI PFNGLRECTSVPROC glad_glRectsv;\n#define glRectsv glad_glRectsv\ntypedef void (APIENTRYP PFNGLTEXCOORD1DPROC)(GLdouble s);\nGLAPI PFNGLTEXCOORD1DPROC glad_glTexCoord1d;\n#define glTexCoord1d glad_glTexCoord1d\ntypedef void (APIENTRYP PFNGLTEXCOORD1DVPROC)(const GLdouble *v);\nGLAPI PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv;\n#define glTexCoord1dv glad_glTexCoord1dv\ntypedef void (APIENTRYP PFNGLTEXCOORD1FPROC)(GLfloat s);\nGLAPI PFNGLTEXCOORD1FPROC glad_glTexCoord1f;\n#define glTexCoord1f glad_glTexCoord1f\ntypedef void (APIENTRYP PFNGLTEXCOORD1FVPROC)(const GLfloat *v);\nGLAPI PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv;\n#define glTexCoord1fv glad_glTexCoord1fv\ntypedef void (APIENTRYP PFNGLTEXCOORD1IPROC)(GLint s);\nGLAPI PFNGLTEXCOORD1IPROC glad_glTexCoord1i;\n#define glTexCoord1i glad_glTexCoord1i\ntypedef void (APIENTRYP PFNGLTEXCOORD1IVPROC)(const GLint *v);\nGLAPI PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv;\n#define glTexCoord1iv glad_glTexCoord1iv\ntypedef void (APIENTRYP PFNGLTEXCOORD1SPROC)(GLshort s);\nGLAPI PFNGLTEXCOORD1SPROC glad_glTexCoord1s;\n#define glTexCoord1s glad_glTexCoord1s\ntypedef void (APIENTRYP PFNGLTEXCOORD1SVPROC)(const GLshort *v);\nGLAPI PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv;\n#define glTexCoord1sv glad_glTexCoord1sv\ntypedef void (APIENTRYP PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t);\nGLAPI PFNGLTEXCOORD2DPROC glad_glTexCoord2d;\n#define glTexCoord2d glad_glTexCoord2d\ntypedef void (APIENTRYP PFNGLTEXCOORD2DVPROC)(const GLdouble *v);\nGLAPI PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv;\n#define glTexCoord2dv glad_glTexCoord2dv\ntypedef void (APIENTRYP PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t);\nGLAPI PFNGLTEXCOORD2FPROC glad_glTexCoord2f;\n#define glTexCoord2f glad_glTexCoord2f\ntypedef void (APIENTRYP PFNGLTEXCOORD2FVPROC)(const GLfloat *v);\nGLAPI PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv;\n#define glTexCoord2fv glad_glTexCoord2fv\ntypedef void (APIENTRYP PFNGLTEXCOORD2IPROC)(GLint s, GLint t);\nGLAPI PFNGLTEXCOORD2IPROC glad_glTexCoord2i;\n#define glTexCoord2i glad_glTexCoord2i\ntypedef void (APIENTRYP PFNGLTEXCOORD2IVPROC)(const GLint *v);\nGLAPI PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv;\n#define glTexCoord2iv glad_glTexCoord2iv\ntypedef void (APIENTRYP PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t);\nGLAPI PFNGLTEXCOORD2SPROC glad_glTexCoord2s;\n#define glTexCoord2s glad_glTexCoord2s\ntypedef void (APIENTRYP PFNGLTEXCOORD2SVPROC)(const GLshort *v);\nGLAPI PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv;\n#define glTexCoord2sv glad_glTexCoord2sv\ntypedef void (APIENTRYP PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r);\nGLAPI PFNGLTEXCOORD3DPROC glad_glTexCoord3d;\n#define glTexCoord3d glad_glTexCoord3d\ntypedef void (APIENTRYP PFNGLTEXCOORD3DVPROC)(const GLdouble *v);\nGLAPI PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv;\n#define glTexCoord3dv glad_glTexCoord3dv\ntypedef void (APIENTRYP PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r);\nGLAPI PFNGLTEXCOORD3FPROC glad_glTexCoord3f;\n#define glTexCoord3f glad_glTexCoord3f\ntypedef void (APIENTRYP PFNGLTEXCOORD3FVPROC)(const GLfloat *v);\nGLAPI PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv;\n#define glTexCoord3fv glad_glTexCoord3fv\ntypedef void (APIENTRYP PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r);\nGLAPI PFNGLTEXCOORD3IPROC glad_glTexCoord3i;\n#define glTexCoord3i glad_glTexCoord3i\ntypedef void (APIENTRYP PFNGLTEXCOORD3IVPROC)(const GLint *v);\nGLAPI PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv;\n#define glTexCoord3iv glad_glTexCoord3iv\ntypedef void (APIENTRYP PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r);\nGLAPI PFNGLTEXCOORD3SPROC glad_glTexCoord3s;\n#define glTexCoord3s glad_glTexCoord3s\ntypedef void (APIENTRYP PFNGLTEXCOORD3SVPROC)(const GLshort *v);\nGLAPI PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv;\n#define glTexCoord3sv glad_glTexCoord3sv\ntypedef void (APIENTRYP PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q);\nGLAPI PFNGLTEXCOORD4DPROC glad_glTexCoord4d;\n#define glTexCoord4d glad_glTexCoord4d\ntypedef void (APIENTRYP PFNGLTEXCOORD4DVPROC)(const GLdouble *v);\nGLAPI PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv;\n#define glTexCoord4dv glad_glTexCoord4dv\ntypedef void (APIENTRYP PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q);\nGLAPI PFNGLTEXCOORD4FPROC glad_glTexCoord4f;\n#define glTexCoord4f glad_glTexCoord4f\ntypedef void (APIENTRYP PFNGLTEXCOORD4FVPROC)(const GLfloat *v);\nGLAPI PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv;\n#define glTexCoord4fv glad_glTexCoord4fv\ntypedef void (APIENTRYP PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q);\nGLAPI PFNGLTEXCOORD4IPROC glad_glTexCoord4i;\n#define glTexCoord4i glad_glTexCoord4i\ntypedef void (APIENTRYP PFNGLTEXCOORD4IVPROC)(const GLint *v);\nGLAPI PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv;\n#define glTexCoord4iv glad_glTexCoord4iv\ntypedef void (APIENTRYP PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q);\nGLAPI PFNGLTEXCOORD4SPROC glad_glTexCoord4s;\n#define glTexCoord4s glad_glTexCoord4s\ntypedef void (APIENTRYP PFNGLTEXCOORD4SVPROC)(const GLshort *v);\nGLAPI PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv;\n#define glTexCoord4sv glad_glTexCoord4sv\ntypedef void (APIENTRYP PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y);\nGLAPI PFNGLVERTEX2DPROC glad_glVertex2d;\n#define glVertex2d glad_glVertex2d\ntypedef void (APIENTRYP PFNGLVERTEX2DVPROC)(const GLdouble *v);\nGLAPI PFNGLVERTEX2DVPROC glad_glVertex2dv;\n#define glVertex2dv glad_glVertex2dv\ntypedef void (APIENTRYP PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y);\nGLAPI PFNGLVERTEX2FPROC glad_glVertex2f;\n#define glVertex2f glad_glVertex2f\ntypedef void (APIENTRYP PFNGLVERTEX2FVPROC)(const GLfloat *v);\nGLAPI PFNGLVERTEX2FVPROC glad_glVertex2fv;\n#define glVertex2fv glad_glVertex2fv\ntypedef void (APIENTRYP PFNGLVERTEX2IPROC)(GLint x, GLint y);\nGLAPI PFNGLVERTEX2IPROC glad_glVertex2i;\n#define glVertex2i glad_glVertex2i\ntypedef void (APIENTRYP PFNGLVERTEX2IVPROC)(const GLint *v);\nGLAPI PFNGLVERTEX2IVPROC glad_glVertex2iv;\n#define glVertex2iv glad_glVertex2iv\ntypedef void (APIENTRYP PFNGLVERTEX2SPROC)(GLshort x, GLshort y);\nGLAPI PFNGLVERTEX2SPROC glad_glVertex2s;\n#define glVertex2s glad_glVertex2s\ntypedef void (APIENTRYP PFNGLVERTEX2SVPROC)(const GLshort *v);\nGLAPI PFNGLVERTEX2SVPROC glad_glVertex2sv;\n#define glVertex2sv glad_glVertex2sv\ntypedef void (APIENTRYP PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z);\nGLAPI PFNGLVERTEX3DPROC glad_glVertex3d;\n#define glVertex3d glad_glVertex3d\ntypedef void (APIENTRYP PFNGLVERTEX3DVPROC)(const GLdouble *v);\nGLAPI PFNGLVERTEX3DVPROC glad_glVertex3dv;\n#define glVertex3dv glad_glVertex3dv\ntypedef void (APIENTRYP PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z);\nGLAPI PFNGLVERTEX3FPROC glad_glVertex3f;\n#define glVertex3f glad_glVertex3f\ntypedef void (APIENTRYP PFNGLVERTEX3FVPROC)(const GLfloat *v);\nGLAPI PFNGLVERTEX3FVPROC glad_glVertex3fv;\n#define glVertex3fv glad_glVertex3fv\ntypedef void (APIENTRYP PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z);\nGLAPI PFNGLVERTEX3IPROC glad_glVertex3i;\n#define glVertex3i glad_glVertex3i\ntypedef void (APIENTRYP PFNGLVERTEX3IVPROC)(const GLint *v);\nGLAPI PFNGLVERTEX3IVPROC glad_glVertex3iv;\n#define glVertex3iv glad_glVertex3iv\ntypedef void (APIENTRYP PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z);\nGLAPI PFNGLVERTEX3SPROC glad_glVertex3s;\n#define glVertex3s glad_glVertex3s\ntypedef void (APIENTRYP PFNGLVERTEX3SVPROC)(const GLshort *v);\nGLAPI PFNGLVERTEX3SVPROC glad_glVertex3sv;\n#define glVertex3sv glad_glVertex3sv\ntypedef void (APIENTRYP PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI PFNGLVERTEX4DPROC glad_glVertex4d;\n#define glVertex4d glad_glVertex4d\ntypedef void (APIENTRYP PFNGLVERTEX4DVPROC)(const GLdouble *v);\nGLAPI PFNGLVERTEX4DVPROC glad_glVertex4dv;\n#define glVertex4dv glad_glVertex4dv\ntypedef void (APIENTRYP PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI PFNGLVERTEX4FPROC glad_glVertex4f;\n#define glVertex4f glad_glVertex4f\ntypedef void (APIENTRYP PFNGLVERTEX4FVPROC)(const GLfloat *v);\nGLAPI PFNGLVERTEX4FVPROC glad_glVertex4fv;\n#define glVertex4fv glad_glVertex4fv\ntypedef void (APIENTRYP PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w);\nGLAPI PFNGLVERTEX4IPROC glad_glVertex4i;\n#define glVertex4i glad_glVertex4i\ntypedef void (APIENTRYP PFNGLVERTEX4IVPROC)(const GLint *v);\nGLAPI PFNGLVERTEX4IVPROC glad_glVertex4iv;\n#define glVertex4iv glad_glVertex4iv\ntypedef void (APIENTRYP PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI PFNGLVERTEX4SPROC glad_glVertex4s;\n#define glVertex4s glad_glVertex4s\ntypedef void (APIENTRYP PFNGLVERTEX4SVPROC)(const GLshort *v);\nGLAPI PFNGLVERTEX4SVPROC glad_glVertex4sv;\n#define glVertex4sv glad_glVertex4sv\ntypedef void (APIENTRYP PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble *equation);\nGLAPI PFNGLCLIPPLANEPROC glad_glClipPlane;\n#define glClipPlane glad_glClipPlane\ntypedef void (APIENTRYP PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode);\nGLAPI PFNGLCOLORMATERIALPROC glad_glColorMaterial;\n#define glColorMaterial glad_glColorMaterial\ntypedef void (APIENTRYP PFNGLFOGFPROC)(GLenum pname, GLfloat param);\nGLAPI PFNGLFOGFPROC glad_glFogf;\n#define glFogf glad_glFogf\ntypedef void (APIENTRYP PFNGLFOGFVPROC)(GLenum pname, const GLfloat *params);\nGLAPI PFNGLFOGFVPROC glad_glFogfv;\n#define glFogfv glad_glFogfv\ntypedef void (APIENTRYP PFNGLFOGIPROC)(GLenum pname, GLint param);\nGLAPI PFNGLFOGIPROC glad_glFogi;\n#define glFogi glad_glFogi\ntypedef void (APIENTRYP PFNGLFOGIVPROC)(GLenum pname, const GLint *params);\nGLAPI PFNGLFOGIVPROC glad_glFogiv;\n#define glFogiv glad_glFogiv\ntypedef void (APIENTRYP PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param);\nGLAPI PFNGLLIGHTFPROC glad_glLightf;\n#define glLightf glad_glLightf\ntypedef void (APIENTRYP PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat *params);\nGLAPI PFNGLLIGHTFVPROC glad_glLightfv;\n#define glLightfv glad_glLightfv\ntypedef void (APIENTRYP PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param);\nGLAPI PFNGLLIGHTIPROC glad_glLighti;\n#define glLighti glad_glLighti\ntypedef void (APIENTRYP PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint *params);\nGLAPI PFNGLLIGHTIVPROC glad_glLightiv;\n#define glLightiv glad_glLightiv\ntypedef void (APIENTRYP PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param);\nGLAPI PFNGLLIGHTMODELFPROC glad_glLightModelf;\n#define glLightModelf glad_glLightModelf\ntypedef void (APIENTRYP PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat *params);\nGLAPI PFNGLLIGHTMODELFVPROC glad_glLightModelfv;\n#define glLightModelfv glad_glLightModelfv\ntypedef void (APIENTRYP PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param);\nGLAPI PFNGLLIGHTMODELIPROC glad_glLightModeli;\n#define glLightModeli glad_glLightModeli\ntypedef void (APIENTRYP PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint *params);\nGLAPI PFNGLLIGHTMODELIVPROC glad_glLightModeliv;\n#define glLightModeliv glad_glLightModeliv\ntypedef void (APIENTRYP PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern);\nGLAPI PFNGLLINESTIPPLEPROC glad_glLineStipple;\n#define glLineStipple glad_glLineStipple\ntypedef void (APIENTRYP PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param);\nGLAPI PFNGLMATERIALFPROC glad_glMaterialf;\n#define glMaterialf glad_glMaterialf\ntypedef void (APIENTRYP PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat *params);\nGLAPI PFNGLMATERIALFVPROC glad_glMaterialfv;\n#define glMaterialfv glad_glMaterialfv\ntypedef void (APIENTRYP PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param);\nGLAPI PFNGLMATERIALIPROC glad_glMateriali;\n#define glMateriali glad_glMateriali\ntypedef void (APIENTRYP PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint *params);\nGLAPI PFNGLMATERIALIVPROC glad_glMaterialiv;\n#define glMaterialiv glad_glMaterialiv\ntypedef void (APIENTRYP PFNGLPOLYGONSTIPPLEPROC)(const GLubyte *mask);\nGLAPI PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple;\n#define glPolygonStipple glad_glPolygonStipple\ntypedef void (APIENTRYP PFNGLSHADEMODELPROC)(GLenum mode);\nGLAPI PFNGLSHADEMODELPROC glad_glShadeModel;\n#define glShadeModel glad_glShadeModel\ntypedef void (APIENTRYP PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param);\nGLAPI PFNGLTEXENVFPROC glad_glTexEnvf;\n#define glTexEnvf glad_glTexEnvf\ntypedef void (APIENTRYP PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat *params);\nGLAPI PFNGLTEXENVFVPROC glad_glTexEnvfv;\n#define glTexEnvfv glad_glTexEnvfv\ntypedef void (APIENTRYP PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param);\nGLAPI PFNGLTEXENVIPROC glad_glTexEnvi;\n#define glTexEnvi glad_glTexEnvi\ntypedef void (APIENTRYP PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint *params);\nGLAPI PFNGLTEXENVIVPROC glad_glTexEnviv;\n#define glTexEnviv glad_glTexEnviv\ntypedef void (APIENTRYP PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param);\nGLAPI PFNGLTEXGENDPROC glad_glTexGend;\n#define glTexGend glad_glTexGend\ntypedef void (APIENTRYP PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble *params);\nGLAPI PFNGLTEXGENDVPROC glad_glTexGendv;\n#define glTexGendv glad_glTexGendv\ntypedef void (APIENTRYP PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param);\nGLAPI PFNGLTEXGENFPROC glad_glTexGenf;\n#define glTexGenf glad_glTexGenf\ntypedef void (APIENTRYP PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat *params);\nGLAPI PFNGLTEXGENFVPROC glad_glTexGenfv;\n#define glTexGenfv glad_glTexGenfv\ntypedef void (APIENTRYP PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param);\nGLAPI PFNGLTEXGENIPROC glad_glTexGeni;\n#define glTexGeni glad_glTexGeni\ntypedef void (APIENTRYP PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint *params);\nGLAPI PFNGLTEXGENIVPROC glad_glTexGeniv;\n#define glTexGeniv glad_glTexGeniv\ntypedef void (APIENTRYP PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat *buffer);\nGLAPI PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer;\n#define glFeedbackBuffer glad_glFeedbackBuffer\ntypedef void (APIENTRYP PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint *buffer);\nGLAPI PFNGLSELECTBUFFERPROC glad_glSelectBuffer;\n#define glSelectBuffer glad_glSelectBuffer\ntypedef GLint (APIENTRYP PFNGLRENDERMODEPROC)(GLenum mode);\nGLAPI PFNGLRENDERMODEPROC glad_glRenderMode;\n#define glRenderMode glad_glRenderMode\ntypedef void (APIENTRYP PFNGLINITNAMESPROC)();\nGLAPI PFNGLINITNAMESPROC glad_glInitNames;\n#define glInitNames glad_glInitNames\ntypedef void (APIENTRYP PFNGLLOADNAMEPROC)(GLuint name);\nGLAPI PFNGLLOADNAMEPROC glad_glLoadName;\n#define glLoadName glad_glLoadName\ntypedef void (APIENTRYP PFNGLPASSTHROUGHPROC)(GLfloat token);\nGLAPI PFNGLPASSTHROUGHPROC glad_glPassThrough;\n#define glPassThrough glad_glPassThrough\ntypedef void (APIENTRYP PFNGLPOPNAMEPROC)();\nGLAPI PFNGLPOPNAMEPROC glad_glPopName;\n#define glPopName glad_glPopName\ntypedef void (APIENTRYP PFNGLPUSHNAMEPROC)(GLuint name);\nGLAPI PFNGLPUSHNAMEPROC glad_glPushName;\n#define glPushName glad_glPushName\ntypedef void (APIENTRYP PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI PFNGLCLEARACCUMPROC glad_glClearAccum;\n#define glClearAccum glad_glClearAccum\ntypedef void (APIENTRYP PFNGLCLEARINDEXPROC)(GLfloat c);\nGLAPI PFNGLCLEARINDEXPROC glad_glClearIndex;\n#define glClearIndex glad_glClearIndex\ntypedef void (APIENTRYP PFNGLINDEXMASKPROC)(GLuint mask);\nGLAPI PFNGLINDEXMASKPROC glad_glIndexMask;\n#define glIndexMask glad_glIndexMask\ntypedef void (APIENTRYP PFNGLACCUMPROC)(GLenum op, GLfloat value);\nGLAPI PFNGLACCUMPROC glad_glAccum;\n#define glAccum glad_glAccum\ntypedef void (APIENTRYP PFNGLPOPATTRIBPROC)();\nGLAPI PFNGLPOPATTRIBPROC glad_glPopAttrib;\n#define glPopAttrib glad_glPopAttrib\ntypedef void (APIENTRYP PFNGLPUSHATTRIBPROC)(GLbitfield mask);\nGLAPI PFNGLPUSHATTRIBPROC glad_glPushAttrib;\n#define glPushAttrib glad_glPushAttrib\ntypedef void (APIENTRYP PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);\nGLAPI PFNGLMAP1DPROC glad_glMap1d;\n#define glMap1d glad_glMap1d\ntypedef void (APIENTRYP PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);\nGLAPI PFNGLMAP1FPROC glad_glMap1f;\n#define glMap1f glad_glMap1f\ntypedef void (APIENTRYP PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);\nGLAPI PFNGLMAP2DPROC glad_glMap2d;\n#define glMap2d glad_glMap2d\ntypedef void (APIENTRYP PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);\nGLAPI PFNGLMAP2FPROC glad_glMap2f;\n#define glMap2f glad_glMap2f\ntypedef void (APIENTRYP PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2);\nGLAPI PFNGLMAPGRID1DPROC glad_glMapGrid1d;\n#define glMapGrid1d glad_glMapGrid1d\ntypedef void (APIENTRYP PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2);\nGLAPI PFNGLMAPGRID1FPROC glad_glMapGrid1f;\n#define glMapGrid1f glad_glMapGrid1f\ntypedef void (APIENTRYP PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);\nGLAPI PFNGLMAPGRID2DPROC glad_glMapGrid2d;\n#define glMapGrid2d glad_glMapGrid2d\ntypedef void (APIENTRYP PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);\nGLAPI PFNGLMAPGRID2FPROC glad_glMapGrid2f;\n#define glMapGrid2f glad_glMapGrid2f\ntypedef void (APIENTRYP PFNGLEVALCOORD1DPROC)(GLdouble u);\nGLAPI PFNGLEVALCOORD1DPROC glad_glEvalCoord1d;\n#define glEvalCoord1d glad_glEvalCoord1d\ntypedef void (APIENTRYP PFNGLEVALCOORD1DVPROC)(const GLdouble *u);\nGLAPI PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv;\n#define glEvalCoord1dv glad_glEvalCoord1dv\ntypedef void (APIENTRYP PFNGLEVALCOORD1FPROC)(GLfloat u);\nGLAPI PFNGLEVALCOORD1FPROC glad_glEvalCoord1f;\n#define glEvalCoord1f glad_glEvalCoord1f\ntypedef void (APIENTRYP PFNGLEVALCOORD1FVPROC)(const GLfloat *u);\nGLAPI PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv;\n#define glEvalCoord1fv glad_glEvalCoord1fv\ntypedef void (APIENTRYP PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v);\nGLAPI PFNGLEVALCOORD2DPROC glad_glEvalCoord2d;\n#define glEvalCoord2d glad_glEvalCoord2d\ntypedef void (APIENTRYP PFNGLEVALCOORD2DVPROC)(const GLdouble *u);\nGLAPI PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv;\n#define glEvalCoord2dv glad_glEvalCoord2dv\ntypedef void (APIENTRYP PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v);\nGLAPI PFNGLEVALCOORD2FPROC glad_glEvalCoord2f;\n#define glEvalCoord2f glad_glEvalCoord2f\ntypedef void (APIENTRYP PFNGLEVALCOORD2FVPROC)(const GLfloat *u);\nGLAPI PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv;\n#define glEvalCoord2fv glad_glEvalCoord2fv\ntypedef void (APIENTRYP PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2);\nGLAPI PFNGLEVALMESH1PROC glad_glEvalMesh1;\n#define glEvalMesh1 glad_glEvalMesh1\ntypedef void (APIENTRYP PFNGLEVALPOINT1PROC)(GLint i);\nGLAPI PFNGLEVALPOINT1PROC glad_glEvalPoint1;\n#define glEvalPoint1 glad_glEvalPoint1\ntypedef void (APIENTRYP PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);\nGLAPI PFNGLEVALMESH2PROC glad_glEvalMesh2;\n#define glEvalMesh2 glad_glEvalMesh2\ntypedef void (APIENTRYP PFNGLEVALPOINT2PROC)(GLint i, GLint j);\nGLAPI PFNGLEVALPOINT2PROC glad_glEvalPoint2;\n#define glEvalPoint2 glad_glEvalPoint2\ntypedef void (APIENTRYP PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref);\nGLAPI PFNGLALPHAFUNCPROC glad_glAlphaFunc;\n#define glAlphaFunc glad_glAlphaFunc\ntypedef void (APIENTRYP PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor);\nGLAPI PFNGLPIXELZOOMPROC glad_glPixelZoom;\n#define glPixelZoom glad_glPixelZoom\ntypedef void (APIENTRYP PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param);\nGLAPI PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf;\n#define glPixelTransferf glad_glPixelTransferf\ntypedef void (APIENTRYP PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param);\nGLAPI PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi;\n#define glPixelTransferi glad_glPixelTransferi\ntypedef void (APIENTRYP PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat *values);\nGLAPI PFNGLPIXELMAPFVPROC glad_glPixelMapfv;\n#define glPixelMapfv glad_glPixelMapfv\ntypedef void (APIENTRYP PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint *values);\nGLAPI PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv;\n#define glPixelMapuiv glad_glPixelMapuiv\ntypedef void (APIENTRYP PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort *values);\nGLAPI PFNGLPIXELMAPUSVPROC glad_glPixelMapusv;\n#define glPixelMapusv glad_glPixelMapusv\ntypedef void (APIENTRYP PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);\nGLAPI PFNGLCOPYPIXELSPROC glad_glCopyPixels;\n#define glCopyPixels glad_glCopyPixels\ntypedef void (APIENTRYP PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\nGLAPI PFNGLDRAWPIXELSPROC glad_glDrawPixels;\n#define glDrawPixels glad_glDrawPixels\ntypedef void (APIENTRYP PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble *equation);\nGLAPI PFNGLGETCLIPPLANEPROC glad_glGetClipPlane;\n#define glGetClipPlane glad_glGetClipPlane\ntypedef void (APIENTRYP PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat *params);\nGLAPI PFNGLGETLIGHTFVPROC glad_glGetLightfv;\n#define glGetLightfv glad_glGetLightfv\ntypedef void (APIENTRYP PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint *params);\nGLAPI PFNGLGETLIGHTIVPROC glad_glGetLightiv;\n#define glGetLightiv glad_glGetLightiv\ntypedef void (APIENTRYP PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble *v);\nGLAPI PFNGLGETMAPDVPROC glad_glGetMapdv;\n#define glGetMapdv glad_glGetMapdv\ntypedef void (APIENTRYP PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat *v);\nGLAPI PFNGLGETMAPFVPROC glad_glGetMapfv;\n#define glGetMapfv glad_glGetMapfv\ntypedef void (APIENTRYP PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint *v);\nGLAPI PFNGLGETMAPIVPROC glad_glGetMapiv;\n#define glGetMapiv glad_glGetMapiv\ntypedef void (APIENTRYP PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat *params);\nGLAPI PFNGLGETMATERIALFVPROC glad_glGetMaterialfv;\n#define glGetMaterialfv glad_glGetMaterialfv\ntypedef void (APIENTRYP PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint *params);\nGLAPI PFNGLGETMATERIALIVPROC glad_glGetMaterialiv;\n#define glGetMaterialiv glad_glGetMaterialiv\ntypedef void (APIENTRYP PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat *values);\nGLAPI PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv;\n#define glGetPixelMapfv glad_glGetPixelMapfv\ntypedef void (APIENTRYP PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint *values);\nGLAPI PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv;\n#define glGetPixelMapuiv glad_glGetPixelMapuiv\ntypedef void (APIENTRYP PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort *values);\nGLAPI PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv;\n#define glGetPixelMapusv glad_glGetPixelMapusv\ntypedef void (APIENTRYP PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte *mask);\nGLAPI PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;\n#define glGetPolygonStipple glad_glGetPolygonStipple\ntypedef void (APIENTRYP PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat *params);\nGLAPI PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv;\n#define glGetTexEnvfv glad_glGetTexEnvfv\ntypedef void (APIENTRYP PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint *params);\nGLAPI PFNGLGETTEXENVIVPROC glad_glGetTexEnviv;\n#define glGetTexEnviv glad_glGetTexEnviv\ntypedef void (APIENTRYP PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble *params);\nGLAPI PFNGLGETTEXGENDVPROC glad_glGetTexGendv;\n#define glGetTexGendv glad_glGetTexGendv\ntypedef void (APIENTRYP PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat *params);\nGLAPI PFNGLGETTEXGENFVPROC glad_glGetTexGenfv;\n#define glGetTexGenfv glad_glGetTexGenfv\ntypedef void (APIENTRYP PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint *params);\nGLAPI PFNGLGETTEXGENIVPROC glad_glGetTexGeniv;\n#define glGetTexGeniv glad_glGetTexGeniv\ntypedef GLboolean (APIENTRYP PFNGLISLISTPROC)(GLuint list);\nGLAPI PFNGLISLISTPROC glad_glIsList;\n#define glIsList glad_glIsList\ntypedef void (APIENTRYP PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\nGLAPI PFNGLFRUSTUMPROC glad_glFrustum;\n#define glFrustum glad_glFrustum\ntypedef void (APIENTRYP PFNGLLOADIDENTITYPROC)();\nGLAPI PFNGLLOADIDENTITYPROC glad_glLoadIdentity;\n#define glLoadIdentity glad_glLoadIdentity\ntypedef void (APIENTRYP PFNGLLOADMATRIXFPROC)(const GLfloat *m);\nGLAPI PFNGLLOADMATRIXFPROC glad_glLoadMatrixf;\n#define glLoadMatrixf glad_glLoadMatrixf\ntypedef void (APIENTRYP PFNGLLOADMATRIXDPROC)(const GLdouble *m);\nGLAPI PFNGLLOADMATRIXDPROC glad_glLoadMatrixd;\n#define glLoadMatrixd glad_glLoadMatrixd\ntypedef void (APIENTRYP PFNGLMATRIXMODEPROC)(GLenum mode);\nGLAPI PFNGLMATRIXMODEPROC glad_glMatrixMode;\n#define glMatrixMode glad_glMatrixMode\ntypedef void (APIENTRYP PFNGLMULTMATRIXFPROC)(const GLfloat *m);\nGLAPI PFNGLMULTMATRIXFPROC glad_glMultMatrixf;\n#define glMultMatrixf glad_glMultMatrixf\ntypedef void (APIENTRYP PFNGLMULTMATRIXDPROC)(const GLdouble *m);\nGLAPI PFNGLMULTMATRIXDPROC glad_glMultMatrixd;\n#define glMultMatrixd glad_glMultMatrixd\ntypedef void (APIENTRYP PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\nGLAPI PFNGLORTHOPROC glad_glOrtho;\n#define glOrtho glad_glOrtho\ntypedef void (APIENTRYP PFNGLPOPMATRIXPROC)();\nGLAPI PFNGLPOPMATRIXPROC glad_glPopMatrix;\n#define glPopMatrix glad_glPopMatrix\ntypedef void (APIENTRYP PFNGLPUSHMATRIXPROC)();\nGLAPI PFNGLPUSHMATRIXPROC glad_glPushMatrix;\n#define glPushMatrix glad_glPushMatrix\ntypedef void (APIENTRYP PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\nGLAPI PFNGLROTATEDPROC glad_glRotated;\n#define glRotated glad_glRotated\ntypedef void (APIENTRYP PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\nGLAPI PFNGLROTATEFPROC glad_glRotatef;\n#define glRotatef glad_glRotatef\ntypedef void (APIENTRYP PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z);\nGLAPI PFNGLSCALEDPROC glad_glScaled;\n#define glScaled glad_glScaled\ntypedef void (APIENTRYP PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z);\nGLAPI PFNGLSCALEFPROC glad_glScalef;\n#define glScalef glad_glScalef\ntypedef void (APIENTRYP PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z);\nGLAPI PFNGLTRANSLATEDPROC glad_glTranslated;\n#define glTranslated glad_glTranslated\ntypedef void (APIENTRYP PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z);\nGLAPI PFNGLTRANSLATEFPROC glad_glTranslatef;\n#define glTranslatef glad_glTranslatef\n#endif\n#ifndef GL_VERSION_1_1\n#define GL_VERSION_1_1 1\nGLAPI int GLAD_GL_VERSION_1_1;\ntypedef void (APIENTRYP PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count);\nGLAPI PFNGLDRAWARRAYSPROC glad_glDrawArrays;\n#define glDrawArrays glad_glDrawArrays\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices);\nGLAPI PFNGLDRAWELEMENTSPROC glad_glDrawElements;\n#define glDrawElements glad_glDrawElements\ntypedef void (APIENTRYP PFNGLGETPOINTERVPROC)(GLenum pname, void **params);\nGLAPI PFNGLGETPOINTERVPROC glad_glGetPointerv;\n#define glGetPointerv glad_glGetPointerv\ntypedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units);\nGLAPI PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset;\n#define glPolygonOffset glad_glPolygonOffset\ntypedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\nGLAPI PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D;\n#define glCopyTexImage1D glad_glCopyTexImage1D\ntypedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\nGLAPI PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D;\n#define glCopyTexImage2D glad_glCopyTexImage2D\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D;\n#define glCopyTexSubImage1D glad_glCopyTexSubImage1D\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D;\n#define glCopyTexSubImage2D glad_glCopyTexSubImage2D\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\nGLAPI PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D;\n#define glTexSubImage1D glad_glTexSubImage1D\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\nGLAPI PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D;\n#define glTexSubImage2D glad_glTexSubImage2D\ntypedef void (APIENTRYP PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture);\nGLAPI PFNGLBINDTEXTUREPROC glad_glBindTexture;\n#define glBindTexture glad_glBindTexture\ntypedef void (APIENTRYP PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint *textures);\nGLAPI PFNGLDELETETEXTURESPROC glad_glDeleteTextures;\n#define glDeleteTextures glad_glDeleteTextures\ntypedef void (APIENTRYP PFNGLGENTEXTURESPROC)(GLsizei n, GLuint *textures);\nGLAPI PFNGLGENTEXTURESPROC glad_glGenTextures;\n#define glGenTextures glad_glGenTextures\ntypedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC)(GLuint texture);\nGLAPI PFNGLISTEXTUREPROC glad_glIsTexture;\n#define glIsTexture glad_glIsTexture\ntypedef void (APIENTRYP PFNGLARRAYELEMENTPROC)(GLint i);\nGLAPI PFNGLARRAYELEMENTPROC glad_glArrayElement;\n#define glArrayElement glad_glArrayElement\ntypedef void (APIENTRYP PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI PFNGLCOLORPOINTERPROC glad_glColorPointer;\n#define glColorPointer glad_glColorPointer\ntypedef void (APIENTRYP PFNGLDISABLECLIENTSTATEPROC)(GLenum array);\nGLAPI PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState;\n#define glDisableClientState glad_glDisableClientState\ntypedef void (APIENTRYP PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void *pointer);\nGLAPI PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer;\n#define glEdgeFlagPointer glad_glEdgeFlagPointer\ntypedef void (APIENTRYP PFNGLENABLECLIENTSTATEPROC)(GLenum array);\nGLAPI PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState;\n#define glEnableClientState glad_glEnableClientState\ntypedef void (APIENTRYP PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void *pointer);\nGLAPI PFNGLINDEXPOINTERPROC glad_glIndexPointer;\n#define glIndexPointer glad_glIndexPointer\ntypedef void (APIENTRYP PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void *pointer);\nGLAPI PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;\n#define glInterleavedArrays glad_glInterleavedArrays\ntypedef void (APIENTRYP PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void *pointer);\nGLAPI PFNGLNORMALPOINTERPROC glad_glNormalPointer;\n#define glNormalPointer glad_glNormalPointer\ntypedef void (APIENTRYP PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer;\n#define glTexCoordPointer glad_glTexCoordPointer\ntypedef void (APIENTRYP PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI PFNGLVERTEXPOINTERPROC glad_glVertexPointer;\n#define glVertexPointer glad_glVertexPointer\ntypedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint *textures, GLboolean *residences);\nGLAPI PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident;\n#define glAreTexturesResident glad_glAreTexturesResident\ntypedef void (APIENTRYP PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint *textures, const GLfloat *priorities);\nGLAPI PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;\n#define glPrioritizeTextures glad_glPrioritizeTextures\ntypedef void (APIENTRYP PFNGLINDEXUBPROC)(GLubyte c);\nGLAPI PFNGLINDEXUBPROC glad_glIndexub;\n#define glIndexub glad_glIndexub\ntypedef void (APIENTRYP PFNGLINDEXUBVPROC)(const GLubyte *c);\nGLAPI PFNGLINDEXUBVPROC glad_glIndexubv;\n#define glIndexubv glad_glIndexubv\ntypedef void (APIENTRYP PFNGLPOPCLIENTATTRIBPROC)();\nGLAPI PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;\n#define glPopClientAttrib glad_glPopClientAttrib\ntypedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask);\nGLAPI PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;\n#define glPushClientAttrib glad_glPushClientAttrib\n#endif\n#ifndef GL_VERSION_1_2\n#define GL_VERSION_1_2 1\nGLAPI int GLAD_GL_VERSION_1_2;\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);\nGLAPI PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements;\n#define glDrawRangeElements glad_glDrawRangeElements\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\nGLAPI PFNGLTEXIMAGE3DPROC glad_glTexImage3D;\n#define glTexImage3D glad_glTexImage3D\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\nGLAPI PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D;\n#define glTexSubImage3D glad_glTexSubImage3D\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D;\n#define glCopyTexSubImage3D glad_glCopyTexSubImage3D\n#endif\n#ifndef GL_VERSION_1_3\n#define GL_VERSION_1_3 1\nGLAPI int GLAD_GL_VERSION_1_3;\ntypedef void (APIENTRYP PFNGLACTIVETEXTUREPROC)(GLenum texture);\nGLAPI PFNGLACTIVETEXTUREPROC glad_glActiveTexture;\n#define glActiveTexture glad_glActiveTexture\ntypedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert);\nGLAPI PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage;\n#define glSampleCoverage glad_glSampleCoverage\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);\nGLAPI PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D;\n#define glCompressedTexImage3D glad_glCompressedTexImage3D\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);\nGLAPI PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D;\n#define glCompressedTexImage2D glad_glCompressedTexImage2D\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);\nGLAPI PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D;\n#define glCompressedTexImage1D glad_glCompressedTexImage1D\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);\nGLAPI PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D;\n#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);\nGLAPI PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D;\n#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);\nGLAPI PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D;\n#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D\ntypedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img);\nGLAPI PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage;\n#define glGetCompressedTexImage glad_glGetCompressedTexImage\ntypedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture);\nGLAPI PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture;\n#define glClientActiveTexture glad_glClientActiveTexture\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s);\nGLAPI PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d;\n#define glMultiTexCoord1d glad_glMultiTexCoord1d\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble *v);\nGLAPI PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv;\n#define glMultiTexCoord1dv glad_glMultiTexCoord1dv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s);\nGLAPI PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f;\n#define glMultiTexCoord1f glad_glMultiTexCoord1f\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat *v);\nGLAPI PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv;\n#define glMultiTexCoord1fv glad_glMultiTexCoord1fv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s);\nGLAPI PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i;\n#define glMultiTexCoord1i glad_glMultiTexCoord1i\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint *v);\nGLAPI PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv;\n#define glMultiTexCoord1iv glad_glMultiTexCoord1iv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s);\nGLAPI PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s;\n#define glMultiTexCoord1s glad_glMultiTexCoord1s\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort *v);\nGLAPI PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv;\n#define glMultiTexCoord1sv glad_glMultiTexCoord1sv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t);\nGLAPI PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d;\n#define glMultiTexCoord2d glad_glMultiTexCoord2d\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble *v);\nGLAPI PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv;\n#define glMultiTexCoord2dv glad_glMultiTexCoord2dv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t);\nGLAPI PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f;\n#define glMultiTexCoord2f glad_glMultiTexCoord2f\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat *v);\nGLAPI PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv;\n#define glMultiTexCoord2fv glad_glMultiTexCoord2fv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t);\nGLAPI PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i;\n#define glMultiTexCoord2i glad_glMultiTexCoord2i\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint *v);\nGLAPI PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv;\n#define glMultiTexCoord2iv glad_glMultiTexCoord2iv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t);\nGLAPI PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s;\n#define glMultiTexCoord2s glad_glMultiTexCoord2s\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort *v);\nGLAPI PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv;\n#define glMultiTexCoord2sv glad_glMultiTexCoord2sv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r);\nGLAPI PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d;\n#define glMultiTexCoord3d glad_glMultiTexCoord3d\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble *v);\nGLAPI PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv;\n#define glMultiTexCoord3dv glad_glMultiTexCoord3dv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);\nGLAPI PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f;\n#define glMultiTexCoord3f glad_glMultiTexCoord3f\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat *v);\nGLAPI PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv;\n#define glMultiTexCoord3fv glad_glMultiTexCoord3fv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r);\nGLAPI PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i;\n#define glMultiTexCoord3i glad_glMultiTexCoord3i\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint *v);\nGLAPI PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv;\n#define glMultiTexCoord3iv glad_glMultiTexCoord3iv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r);\nGLAPI PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s;\n#define glMultiTexCoord3s glad_glMultiTexCoord3s\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort *v);\nGLAPI PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv;\n#define glMultiTexCoord3sv glad_glMultiTexCoord3sv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\nGLAPI PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d;\n#define glMultiTexCoord4d glad_glMultiTexCoord4d\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble *v);\nGLAPI PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv;\n#define glMultiTexCoord4dv glad_glMultiTexCoord4dv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\nGLAPI PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f;\n#define glMultiTexCoord4f glad_glMultiTexCoord4f\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat *v);\nGLAPI PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv;\n#define glMultiTexCoord4fv glad_glMultiTexCoord4fv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q);\nGLAPI PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i;\n#define glMultiTexCoord4i glad_glMultiTexCoord4i\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint *v);\nGLAPI PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv;\n#define glMultiTexCoord4iv glad_glMultiTexCoord4iv\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\nGLAPI PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s;\n#define glMultiTexCoord4s glad_glMultiTexCoord4s\ntypedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort *v);\nGLAPI PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv;\n#define glMultiTexCoord4sv glad_glMultiTexCoord4sv\ntypedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC)(const GLfloat *m);\nGLAPI PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf;\n#define glLoadTransposeMatrixf glad_glLoadTransposeMatrixf\ntypedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC)(const GLdouble *m);\nGLAPI PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd;\n#define glLoadTransposeMatrixd glad_glLoadTransposeMatrixd\ntypedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC)(const GLfloat *m);\nGLAPI PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf;\n#define glMultTransposeMatrixf glad_glMultTransposeMatrixf\ntypedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC)(const GLdouble *m);\nGLAPI PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd;\n#define glMultTransposeMatrixd glad_glMultTransposeMatrixd\n#endif\n#ifndef GL_VERSION_1_4\n#define GL_VERSION_1_4 1\nGLAPI int GLAD_GL_VERSION_1_4;\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\nGLAPI PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate;\n#define glBlendFuncSeparate glad_glBlendFuncSeparate\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);\nGLAPI PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays;\n#define glMultiDrawArrays glad_glMultiDrawArrays\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount);\nGLAPI PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements;\n#define glMultiDrawElements glad_glMultiDrawElements\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param);\nGLAPI PFNGLPOINTPARAMETERFPROC glad_glPointParameterf;\n#define glPointParameterf glad_glPointParameterf\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat *params);\nGLAPI PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv;\n#define glPointParameterfv glad_glPointParameterfv\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param);\nGLAPI PFNGLPOINTPARAMETERIPROC glad_glPointParameteri;\n#define glPointParameteri glad_glPointParameteri\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint *params);\nGLAPI PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv;\n#define glPointParameteriv glad_glPointParameteriv\ntypedef void (APIENTRYP PFNGLFOGCOORDFPROC)(GLfloat coord);\nGLAPI PFNGLFOGCOORDFPROC glad_glFogCoordf;\n#define glFogCoordf glad_glFogCoordf\ntypedef void (APIENTRYP PFNGLFOGCOORDFVPROC)(const GLfloat *coord);\nGLAPI PFNGLFOGCOORDFVPROC glad_glFogCoordfv;\n#define glFogCoordfv glad_glFogCoordfv\ntypedef void (APIENTRYP PFNGLFOGCOORDDPROC)(GLdouble coord);\nGLAPI PFNGLFOGCOORDDPROC glad_glFogCoordd;\n#define glFogCoordd glad_glFogCoordd\ntypedef void (APIENTRYP PFNGLFOGCOORDDVPROC)(const GLdouble *coord);\nGLAPI PFNGLFOGCOORDDVPROC glad_glFogCoorddv;\n#define glFogCoorddv glad_glFogCoorddv\ntypedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC)(GLenum type, GLsizei stride, const void *pointer);\nGLAPI PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer;\n#define glFogCoordPointer glad_glFogCoordPointer\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue);\nGLAPI PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b;\n#define glSecondaryColor3b glad_glSecondaryColor3b\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC)(const GLbyte *v);\nGLAPI PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv;\n#define glSecondaryColor3bv glad_glSecondaryColor3bv\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue);\nGLAPI PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d;\n#define glSecondaryColor3d glad_glSecondaryColor3d\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC)(const GLdouble *v);\nGLAPI PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv;\n#define glSecondaryColor3dv glad_glSecondaryColor3dv\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue);\nGLAPI PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f;\n#define glSecondaryColor3f glad_glSecondaryColor3f\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC)(const GLfloat *v);\nGLAPI PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv;\n#define glSecondaryColor3fv glad_glSecondaryColor3fv\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC)(GLint red, GLint green, GLint blue);\nGLAPI PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i;\n#define glSecondaryColor3i glad_glSecondaryColor3i\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC)(const GLint *v);\nGLAPI PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv;\n#define glSecondaryColor3iv glad_glSecondaryColor3iv\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue);\nGLAPI PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s;\n#define glSecondaryColor3s glad_glSecondaryColor3s\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC)(const GLshort *v);\nGLAPI PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv;\n#define glSecondaryColor3sv glad_glSecondaryColor3sv\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue);\nGLAPI PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub;\n#define glSecondaryColor3ub glad_glSecondaryColor3ub\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC)(const GLubyte *v);\nGLAPI PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv;\n#define glSecondaryColor3ubv glad_glSecondaryColor3ubv\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue);\nGLAPI PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui;\n#define glSecondaryColor3ui glad_glSecondaryColor3ui\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC)(const GLuint *v);\nGLAPI PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv;\n#define glSecondaryColor3uiv glad_glSecondaryColor3uiv\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue);\nGLAPI PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us;\n#define glSecondaryColor3us glad_glSecondaryColor3us\ntypedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC)(const GLushort *v);\nGLAPI PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv;\n#define glSecondaryColor3usv glad_glSecondaryColor3usv\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer;\n#define glSecondaryColorPointer glad_glSecondaryColorPointer\ntypedef void (APIENTRYP PFNGLWINDOWPOS2DPROC)(GLdouble x, GLdouble y);\nGLAPI PFNGLWINDOWPOS2DPROC glad_glWindowPos2d;\n#define glWindowPos2d glad_glWindowPos2d\ntypedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC)(const GLdouble *v);\nGLAPI PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv;\n#define glWindowPos2dv glad_glWindowPos2dv\ntypedef void (APIENTRYP PFNGLWINDOWPOS2FPROC)(GLfloat x, GLfloat y);\nGLAPI PFNGLWINDOWPOS2FPROC glad_glWindowPos2f;\n#define glWindowPos2f glad_glWindowPos2f\ntypedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC)(const GLfloat *v);\nGLAPI PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv;\n#define glWindowPos2fv glad_glWindowPos2fv\ntypedef void (APIENTRYP PFNGLWINDOWPOS2IPROC)(GLint x, GLint y);\nGLAPI PFNGLWINDOWPOS2IPROC glad_glWindowPos2i;\n#define glWindowPos2i glad_glWindowPos2i\ntypedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC)(const GLint *v);\nGLAPI PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv;\n#define glWindowPos2iv glad_glWindowPos2iv\ntypedef void (APIENTRYP PFNGLWINDOWPOS2SPROC)(GLshort x, GLshort y);\nGLAPI PFNGLWINDOWPOS2SPROC glad_glWindowPos2s;\n#define glWindowPos2s glad_glWindowPos2s\ntypedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC)(const GLshort *v);\nGLAPI PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv;\n#define glWindowPos2sv glad_glWindowPos2sv\ntypedef void (APIENTRYP PFNGLWINDOWPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z);\nGLAPI PFNGLWINDOWPOS3DPROC glad_glWindowPos3d;\n#define glWindowPos3d glad_glWindowPos3d\ntypedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC)(const GLdouble *v);\nGLAPI PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv;\n#define glWindowPos3dv glad_glWindowPos3dv\ntypedef void (APIENTRYP PFNGLWINDOWPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z);\nGLAPI PFNGLWINDOWPOS3FPROC glad_glWindowPos3f;\n#define glWindowPos3f glad_glWindowPos3f\ntypedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC)(const GLfloat *v);\nGLAPI PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv;\n#define glWindowPos3fv glad_glWindowPos3fv\ntypedef void (APIENTRYP PFNGLWINDOWPOS3IPROC)(GLint x, GLint y, GLint z);\nGLAPI PFNGLWINDOWPOS3IPROC glad_glWindowPos3i;\n#define glWindowPos3i glad_glWindowPos3i\ntypedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC)(const GLint *v);\nGLAPI PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv;\n#define glWindowPos3iv glad_glWindowPos3iv\ntypedef void (APIENTRYP PFNGLWINDOWPOS3SPROC)(GLshort x, GLshort y, GLshort z);\nGLAPI PFNGLWINDOWPOS3SPROC glad_glWindowPos3s;\n#define glWindowPos3s glad_glWindowPos3s\ntypedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC)(const GLshort *v);\nGLAPI PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv;\n#define glWindowPos3sv glad_glWindowPos3sv\ntypedef void (APIENTRYP PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI PFNGLBLENDCOLORPROC glad_glBlendColor;\n#define glBlendColor glad_glBlendColor\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONPROC)(GLenum mode);\nGLAPI PFNGLBLENDEQUATIONPROC glad_glBlendEquation;\n#define glBlendEquation glad_glBlendEquation\n#endif\n#ifndef GL_VERSION_1_5\n#define GL_VERSION_1_5 1\nGLAPI int GLAD_GL_VERSION_1_5;\ntypedef void (APIENTRYP PFNGLGENQUERIESPROC)(GLsizei n, GLuint *ids);\nGLAPI PFNGLGENQUERIESPROC glad_glGenQueries;\n#define glGenQueries glad_glGenQueries\ntypedef void (APIENTRYP PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint *ids);\nGLAPI PFNGLDELETEQUERIESPROC glad_glDeleteQueries;\n#define glDeleteQueries glad_glDeleteQueries\ntypedef GLboolean (APIENTRYP PFNGLISQUERYPROC)(GLuint id);\nGLAPI PFNGLISQUERYPROC glad_glIsQuery;\n#define glIsQuery glad_glIsQuery\ntypedef void (APIENTRYP PFNGLBEGINQUERYPROC)(GLenum target, GLuint id);\nGLAPI PFNGLBEGINQUERYPROC glad_glBeginQuery;\n#define glBeginQuery glad_glBeginQuery\ntypedef void (APIENTRYP PFNGLENDQUERYPROC)(GLenum target);\nGLAPI PFNGLENDQUERYPROC glad_glEndQuery;\n#define glEndQuery glad_glEndQuery\ntypedef void (APIENTRYP PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint *params);\nGLAPI PFNGLGETQUERYIVPROC glad_glGetQueryiv;\n#define glGetQueryiv glad_glGetQueryiv\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint *params);\nGLAPI PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv;\n#define glGetQueryObjectiv glad_glGetQueryObjectiv\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint *params);\nGLAPI PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv;\n#define glGetQueryObjectuiv glad_glGetQueryObjectuiv\ntypedef void (APIENTRYP PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer);\nGLAPI PFNGLBINDBUFFERPROC glad_glBindBuffer;\n#define glBindBuffer glad_glBindBuffer\ntypedef void (APIENTRYP PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint *buffers);\nGLAPI PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers;\n#define glDeleteBuffers glad_glDeleteBuffers\ntypedef void (APIENTRYP PFNGLGENBUFFERSPROC)(GLsizei n, GLuint *buffers);\nGLAPI PFNGLGENBUFFERSPROC glad_glGenBuffers;\n#define glGenBuffers glad_glGenBuffers\ntypedef GLboolean (APIENTRYP PFNGLISBUFFERPROC)(GLuint buffer);\nGLAPI PFNGLISBUFFERPROC glad_glIsBuffer;\n#define glIsBuffer glad_glIsBuffer\ntypedef void (APIENTRYP PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void *data, GLenum usage);\nGLAPI PFNGLBUFFERDATAPROC glad_glBufferData;\n#define glBufferData glad_glBufferData\ntypedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);\nGLAPI PFNGLBUFFERSUBDATAPROC glad_glBufferSubData;\n#define glBufferSubData glad_glBufferSubData\ntypedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void *data);\nGLAPI PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData;\n#define glGetBufferSubData glad_glGetBufferSubData\ntypedef void * (APIENTRYP PFNGLMAPBUFFERPROC)(GLenum target, GLenum access);\nGLAPI PFNGLMAPBUFFERPROC glad_glMapBuffer;\n#define glMapBuffer glad_glMapBuffer\ntypedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC)(GLenum target);\nGLAPI PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer;\n#define glUnmapBuffer glad_glUnmapBuffer\ntypedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);\nGLAPI PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv;\n#define glGetBufferParameteriv glad_glGetBufferParameteriv\ntypedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void **params);\nGLAPI PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv;\n#define glGetBufferPointerv glad_glGetBufferPointerv\n#endif\n#ifndef GL_VERSION_2_0\n#define GL_VERSION_2_0 1\nGLAPI int GLAD_GL_VERSION_2_0;\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);\nGLAPI PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate;\n#define glBlendEquationSeparate glad_glBlendEquationSeparate\ntypedef void (APIENTRYP PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs);\nGLAPI PFNGLDRAWBUFFERSPROC glad_glDrawBuffers;\n#define glDrawBuffers glad_glDrawBuffers\ntypedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\nGLAPI PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate;\n#define glStencilOpSeparate glad_glStencilOpSeparate\ntypedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask);\nGLAPI PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate;\n#define glStencilFuncSeparate glad_glStencilFuncSeparate\ntypedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask);\nGLAPI PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate;\n#define glStencilMaskSeparate glad_glStencilMaskSeparate\ntypedef void (APIENTRYP PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader);\nGLAPI PFNGLATTACHSHADERPROC glad_glAttachShader;\n#define glAttachShader glad_glAttachShader\ntypedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name);\nGLAPI PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation;\n#define glBindAttribLocation glad_glBindAttribLocation\ntypedef void (APIENTRYP PFNGLCOMPILESHADERPROC)(GLuint shader);\nGLAPI PFNGLCOMPILESHADERPROC glad_glCompileShader;\n#define glCompileShader glad_glCompileShader\ntypedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC)();\nGLAPI PFNGLCREATEPROGRAMPROC glad_glCreateProgram;\n#define glCreateProgram glad_glCreateProgram\ntypedef GLuint (APIENTRYP PFNGLCREATESHADERPROC)(GLenum type);\nGLAPI PFNGLCREATESHADERPROC glad_glCreateShader;\n#define glCreateShader glad_glCreateShader\ntypedef void (APIENTRYP PFNGLDELETEPROGRAMPROC)(GLuint program);\nGLAPI PFNGLDELETEPROGRAMPROC glad_glDeleteProgram;\n#define glDeleteProgram glad_glDeleteProgram\ntypedef void (APIENTRYP PFNGLDELETESHADERPROC)(GLuint shader);\nGLAPI PFNGLDELETESHADERPROC glad_glDeleteShader;\n#define glDeleteShader glad_glDeleteShader\ntypedef void (APIENTRYP PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader);\nGLAPI PFNGLDETACHSHADERPROC glad_glDetachShader;\n#define glDetachShader glad_glDetachShader\ntypedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);\nGLAPI PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray;\n#define glDisableVertexAttribArray glad_glDisableVertexAttribArray\ntypedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index);\nGLAPI PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray;\n#define glEnableVertexAttribArray glad_glEnableVertexAttribArray\ntypedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\nGLAPI PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib;\n#define glGetActiveAttrib glad_glGetActiveAttrib\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\nGLAPI PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform;\n#define glGetActiveUniform glad_glGetActiveUniform\ntypedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);\nGLAPI PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders;\n#define glGetAttachedShaders glad_glGetAttachedShaders\ntypedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name);\nGLAPI PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation;\n#define glGetAttribLocation glad_glGetAttribLocation\ntypedef void (APIENTRYP PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params);\nGLAPI PFNGLGETPROGRAMIVPROC glad_glGetProgramiv;\n#define glGetProgramiv glad_glGetProgramiv\ntypedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\nGLAPI PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog;\n#define glGetProgramInfoLog glad_glGetProgramInfoLog\ntypedef void (APIENTRYP PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params);\nGLAPI PFNGLGETSHADERIVPROC glad_glGetShaderiv;\n#define glGetShaderiv glad_glGetShaderiv\ntypedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\nGLAPI PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog;\n#define glGetShaderInfoLog glad_glGetShaderInfoLog\ntypedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);\nGLAPI PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource;\n#define glGetShaderSource glad_glGetShaderSource\ntypedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name);\nGLAPI PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation;\n#define glGetUniformLocation glad_glGetUniformLocation\ntypedef void (APIENTRYP PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params);\nGLAPI PFNGLGETUNIFORMFVPROC glad_glGetUniformfv;\n#define glGetUniformfv glad_glGetUniformfv\ntypedef void (APIENTRYP PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params);\nGLAPI PFNGLGETUNIFORMIVPROC glad_glGetUniformiv;\n#define glGetUniformiv glad_glGetUniformiv\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params);\nGLAPI PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv;\n#define glGetVertexAttribdv glad_glGetVertexAttribdv\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params);\nGLAPI PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv;\n#define glGetVertexAttribfv glad_glGetVertexAttribfv\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params);\nGLAPI PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv;\n#define glGetVertexAttribiv glad_glGetVertexAttribiv\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void **pointer);\nGLAPI PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv;\n#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv\ntypedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC)(GLuint program);\nGLAPI PFNGLISPROGRAMPROC glad_glIsProgram;\n#define glIsProgram glad_glIsProgram\ntypedef GLboolean (APIENTRYP PFNGLISSHADERPROC)(GLuint shader);\nGLAPI PFNGLISSHADERPROC glad_glIsShader;\n#define glIsShader glad_glIsShader\ntypedef void (APIENTRYP PFNGLLINKPROGRAMPROC)(GLuint program);\nGLAPI PFNGLLINKPROGRAMPROC glad_glLinkProgram;\n#define glLinkProgram glad_glLinkProgram\ntypedef void (APIENTRYP PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);\nGLAPI PFNGLSHADERSOURCEPROC glad_glShaderSource;\n#define glShaderSource glad_glShaderSource\ntypedef void (APIENTRYP PFNGLUSEPROGRAMPROC)(GLuint program);\nGLAPI PFNGLUSEPROGRAMPROC glad_glUseProgram;\n#define glUseProgram glad_glUseProgram\ntypedef void (APIENTRYP PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0);\nGLAPI PFNGLUNIFORM1FPROC glad_glUniform1f;\n#define glUniform1f glad_glUniform1f\ntypedef void (APIENTRYP PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);\nGLAPI PFNGLUNIFORM2FPROC glad_glUniform2f;\n#define glUniform2f glad_glUniform2f\ntypedef void (APIENTRYP PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI PFNGLUNIFORM3FPROC glad_glUniform3f;\n#define glUniform3f glad_glUniform3f\ntypedef void (APIENTRYP PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI PFNGLUNIFORM4FPROC glad_glUniform4f;\n#define glUniform4f glad_glUniform4f\ntypedef void (APIENTRYP PFNGLUNIFORM1IPROC)(GLint location, GLint v0);\nGLAPI PFNGLUNIFORM1IPROC glad_glUniform1i;\n#define glUniform1i glad_glUniform1i\ntypedef void (APIENTRYP PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);\nGLAPI PFNGLUNIFORM2IPROC glad_glUniform2i;\n#define glUniform2i glad_glUniform2i\ntypedef void (APIENTRYP PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI PFNGLUNIFORM3IPROC glad_glUniform3i;\n#define glUniform3i glad_glUniform3i\ntypedef void (APIENTRYP PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI PFNGLUNIFORM4IPROC glad_glUniform4i;\n#define glUniform4i glad_glUniform4i\ntypedef void (APIENTRYP PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value);\nGLAPI PFNGLUNIFORM1FVPROC glad_glUniform1fv;\n#define glUniform1fv glad_glUniform1fv\ntypedef void (APIENTRYP PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value);\nGLAPI PFNGLUNIFORM2FVPROC glad_glUniform2fv;\n#define glUniform2fv glad_glUniform2fv\ntypedef void (APIENTRYP PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value);\nGLAPI PFNGLUNIFORM3FVPROC glad_glUniform3fv;\n#define glUniform3fv glad_glUniform3fv\ntypedef void (APIENTRYP PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value);\nGLAPI PFNGLUNIFORM4FVPROC glad_glUniform4fv;\n#define glUniform4fv glad_glUniform4fv\ntypedef void (APIENTRYP PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value);\nGLAPI PFNGLUNIFORM1IVPROC glad_glUniform1iv;\n#define glUniform1iv glad_glUniform1iv\ntypedef void (APIENTRYP PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value);\nGLAPI PFNGLUNIFORM2IVPROC glad_glUniform2iv;\n#define glUniform2iv glad_glUniform2iv\ntypedef void (APIENTRYP PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value);\nGLAPI PFNGLUNIFORM3IVPROC glad_glUniform3iv;\n#define glUniform3iv glad_glUniform3iv\ntypedef void (APIENTRYP PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value);\nGLAPI PFNGLUNIFORM4IVPROC glad_glUniform4iv;\n#define glUniform4iv glad_glUniform4iv\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv;\n#define glUniformMatrix2fv glad_glUniformMatrix2fv\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv;\n#define glUniformMatrix3fv glad_glUniformMatrix3fv\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv;\n#define glUniformMatrix4fv glad_glUniformMatrix4fv\ntypedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC)(GLuint program);\nGLAPI PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram;\n#define glValidateProgram glad_glValidateProgram\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);\nGLAPI PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d;\n#define glVertexAttrib1d glad_glVertexAttrib1d\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v);\nGLAPI PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv;\n#define glVertexAttrib1dv glad_glVertexAttrib1dv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);\nGLAPI PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f;\n#define glVertexAttrib1f glad_glVertexAttrib1f\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v);\nGLAPI PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv;\n#define glVertexAttrib1fv glad_glVertexAttrib1fv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x);\nGLAPI PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s;\n#define glVertexAttrib1s glad_glVertexAttrib1s\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v);\nGLAPI PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv;\n#define glVertexAttrib1sv glad_glVertexAttrib1sv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);\nGLAPI PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d;\n#define glVertexAttrib2d glad_glVertexAttrib2d\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v);\nGLAPI PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv;\n#define glVertexAttrib2dv glad_glVertexAttrib2dv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);\nGLAPI PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f;\n#define glVertexAttrib2f glad_glVertexAttrib2f\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v);\nGLAPI PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv;\n#define glVertexAttrib2fv glad_glVertexAttrib2fv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);\nGLAPI PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s;\n#define glVertexAttrib2s glad_glVertexAttrib2s\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v);\nGLAPI PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv;\n#define glVertexAttrib2sv glad_glVertexAttrib2sv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d;\n#define glVertexAttrib3d glad_glVertexAttrib3d\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v);\nGLAPI PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv;\n#define glVertexAttrib3dv glad_glVertexAttrib3dv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);\nGLAPI PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f;\n#define glVertexAttrib3f glad_glVertexAttrib3f\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v);\nGLAPI PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv;\n#define glVertexAttrib3fv glad_glVertexAttrib3fv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);\nGLAPI PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s;\n#define glVertexAttrib3s glad_glVertexAttrib3s\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v);\nGLAPI PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv;\n#define glVertexAttrib3sv glad_glVertexAttrib3sv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v);\nGLAPI PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv;\n#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v);\nGLAPI PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv;\n#define glVertexAttrib4Niv glad_glVertexAttrib4Niv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v);\nGLAPI PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv;\n#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\nGLAPI PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub;\n#define glVertexAttrib4Nub glad_glVertexAttrib4Nub\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v);\nGLAPI PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv;\n#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v);\nGLAPI PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv;\n#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v);\nGLAPI PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv;\n#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v);\nGLAPI PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv;\n#define glVertexAttrib4bv glad_glVertexAttrib4bv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d;\n#define glVertexAttrib4d glad_glVertexAttrib4d\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v);\nGLAPI PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv;\n#define glVertexAttrib4dv glad_glVertexAttrib4dv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f;\n#define glVertexAttrib4f glad_glVertexAttrib4f\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v);\nGLAPI PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv;\n#define glVertexAttrib4fv glad_glVertexAttrib4fv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v);\nGLAPI PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv;\n#define glVertexAttrib4iv glad_glVertexAttrib4iv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s;\n#define glVertexAttrib4s glad_glVertexAttrib4s\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v);\nGLAPI PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv;\n#define glVertexAttrib4sv glad_glVertexAttrib4sv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v);\nGLAPI PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv;\n#define glVertexAttrib4ubv glad_glVertexAttrib4ubv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v);\nGLAPI PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv;\n#define glVertexAttrib4uiv glad_glVertexAttrib4uiv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v);\nGLAPI PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv;\n#define glVertexAttrib4usv glad_glVertexAttrib4usv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);\nGLAPI PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer;\n#define glVertexAttribPointer glad_glVertexAttribPointer\n#endif\n#ifndef GL_VERSION_2_1\n#define GL_VERSION_2_1 1\nGLAPI int GLAD_GL_VERSION_2_1;\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv;\n#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv;\n#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv;\n#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv;\n#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv;\n#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv;\n#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv\n#endif\n#ifndef GL_VERSION_3_0\n#define GL_VERSION_3_0 1\nGLAPI int GLAD_GL_VERSION_3_0;\ntypedef void (APIENTRYP PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\nGLAPI PFNGLCOLORMASKIPROC glad_glColorMaski;\n#define glColorMaski glad_glColorMaski\ntypedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean *data);\nGLAPI PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v;\n#define glGetBooleani_v glad_glGetBooleani_v\ntypedef void (APIENTRYP PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint *data);\nGLAPI PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v;\n#define glGetIntegeri_v glad_glGetIntegeri_v\ntypedef void (APIENTRYP PFNGLENABLEIPROC)(GLenum target, GLuint index);\nGLAPI PFNGLENABLEIPROC glad_glEnablei;\n#define glEnablei glad_glEnablei\ntypedef void (APIENTRYP PFNGLDISABLEIPROC)(GLenum target, GLuint index);\nGLAPI PFNGLDISABLEIPROC glad_glDisablei;\n#define glDisablei glad_glDisablei\ntypedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC)(GLenum target, GLuint index);\nGLAPI PFNGLISENABLEDIPROC glad_glIsEnabledi;\n#define glIsEnabledi glad_glIsEnabledi\ntypedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode);\nGLAPI PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback;\n#define glBeginTransformFeedback glad_glBeginTransformFeedback\ntypedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC)();\nGLAPI PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback;\n#define glEndTransformFeedback glad_glEndTransformFeedback\ntypedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange;\n#define glBindBufferRange glad_glBindBufferRange\ntypedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer);\nGLAPI PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase;\n#define glBindBufferBase glad_glBindBufferBase\ntypedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);\nGLAPI PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings;\n#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings\ntypedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\nGLAPI PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying;\n#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying\ntypedef void (APIENTRYP PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp);\nGLAPI PFNGLCLAMPCOLORPROC glad_glClampColor;\n#define glClampColor glad_glClampColor\ntypedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode);\nGLAPI PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender;\n#define glBeginConditionalRender glad_glBeginConditionalRender\ntypedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC)();\nGLAPI PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender;\n#define glEndConditionalRender glad_glEndConditionalRender\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);\nGLAPI PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer;\n#define glVertexAttribIPointer glad_glVertexAttribIPointer\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint *params);\nGLAPI PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv;\n#define glGetVertexAttribIiv glad_glGetVertexAttribIiv\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint *params);\nGLAPI PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv;\n#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x);\nGLAPI PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i;\n#define glVertexAttribI1i glad_glVertexAttribI1i\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y);\nGLAPI PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i;\n#define glVertexAttribI2i glad_glVertexAttribI2i\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z);\nGLAPI PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i;\n#define glVertexAttribI3i glad_glVertexAttribI3i\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i;\n#define glVertexAttribI4i glad_glVertexAttribI4i\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x);\nGLAPI PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui;\n#define glVertexAttribI1ui glad_glVertexAttribI1ui\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y);\nGLAPI PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui;\n#define glVertexAttribI2ui glad_glVertexAttribI2ui\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z);\nGLAPI PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui;\n#define glVertexAttribI3ui glad_glVertexAttribI3ui\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui;\n#define glVertexAttribI4ui glad_glVertexAttribI4ui\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint *v);\nGLAPI PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv;\n#define glVertexAttribI1iv glad_glVertexAttribI1iv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint *v);\nGLAPI PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv;\n#define glVertexAttribI2iv glad_glVertexAttribI2iv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint *v);\nGLAPI PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv;\n#define glVertexAttribI3iv glad_glVertexAttribI3iv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint *v);\nGLAPI PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv;\n#define glVertexAttribI4iv glad_glVertexAttribI4iv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint *v);\nGLAPI PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv;\n#define glVertexAttribI1uiv glad_glVertexAttribI1uiv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint *v);\nGLAPI PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv;\n#define glVertexAttribI2uiv glad_glVertexAttribI2uiv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint *v);\nGLAPI PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv;\n#define glVertexAttribI3uiv glad_glVertexAttribI3uiv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint *v);\nGLAPI PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv;\n#define glVertexAttribI4uiv glad_glVertexAttribI4uiv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte *v);\nGLAPI PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv;\n#define glVertexAttribI4bv glad_glVertexAttribI4bv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort *v);\nGLAPI PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv;\n#define glVertexAttribI4sv glad_glVertexAttribI4sv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte *v);\nGLAPI PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv;\n#define glVertexAttribI4ubv glad_glVertexAttribI4ubv\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort *v);\nGLAPI PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv;\n#define glVertexAttribI4usv glad_glVertexAttribI4usv\ntypedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint *params);\nGLAPI PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv;\n#define glGetUniformuiv glad_glGetUniformuiv\ntypedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar *name);\nGLAPI PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation;\n#define glBindFragDataLocation glad_glBindFragDataLocation\ntypedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar *name);\nGLAPI PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation;\n#define glGetFragDataLocation glad_glGetFragDataLocation\ntypedef void (APIENTRYP PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0);\nGLAPI PFNGLUNIFORM1UIPROC glad_glUniform1ui;\n#define glUniform1ui glad_glUniform1ui\ntypedef void (APIENTRYP PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1);\nGLAPI PFNGLUNIFORM2UIPROC glad_glUniform2ui;\n#define glUniform2ui glad_glUniform2ui\ntypedef void (APIENTRYP PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI PFNGLUNIFORM3UIPROC glad_glUniform3ui;\n#define glUniform3ui glad_glUniform3ui\ntypedef void (APIENTRYP PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI PFNGLUNIFORM4UIPROC glad_glUniform4ui;\n#define glUniform4ui glad_glUniform4ui\ntypedef void (APIENTRYP PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint *value);\nGLAPI PFNGLUNIFORM1UIVPROC glad_glUniform1uiv;\n#define glUniform1uiv glad_glUniform1uiv\ntypedef void (APIENTRYP PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint *value);\nGLAPI PFNGLUNIFORM2UIVPROC glad_glUniform2uiv;\n#define glUniform2uiv glad_glUniform2uiv\ntypedef void (APIENTRYP PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint *value);\nGLAPI PFNGLUNIFORM3UIVPROC glad_glUniform3uiv;\n#define glUniform3uiv glad_glUniform3uiv\ntypedef void (APIENTRYP PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint *value);\nGLAPI PFNGLUNIFORM4UIVPROC glad_glUniform4uiv;\n#define glUniform4uiv glad_glUniform4uiv\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint *params);\nGLAPI PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv;\n#define glTexParameterIiv glad_glTexParameterIiv\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint *params);\nGLAPI PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv;\n#define glTexParameterIuiv glad_glTexParameterIuiv\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint *params);\nGLAPI PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv;\n#define glGetTexParameterIiv glad_glGetTexParameterIiv\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint *params);\nGLAPI PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv;\n#define glGetTexParameterIuiv glad_glGetTexParameterIuiv\ntypedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint *value);\nGLAPI PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv;\n#define glClearBufferiv glad_glClearBufferiv\ntypedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint *value);\nGLAPI PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv;\n#define glClearBufferuiv glad_glClearBufferuiv\ntypedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat *value);\nGLAPI PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv;\n#define glClearBufferfv glad_glClearBufferfv\ntypedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\nGLAPI PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi;\n#define glClearBufferfi glad_glClearBufferfi\ntypedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC)(GLenum name, GLuint index);\nGLAPI PFNGLGETSTRINGIPROC glad_glGetStringi;\n#define glGetStringi glad_glGetStringi\ntypedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);\nGLAPI PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer;\n#define glIsRenderbuffer glad_glIsRenderbuffer\ntypedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);\nGLAPI PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer;\n#define glBindRenderbuffer glad_glBindRenderbuffer\ntypedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers);\nGLAPI PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers;\n#define glDeleteRenderbuffers glad_glDeleteRenderbuffers\ntypedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers);\nGLAPI PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers;\n#define glGenRenderbuffers glad_glGenRenderbuffers\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage;\n#define glRenderbufferStorage glad_glRenderbufferStorage\ntypedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);\nGLAPI PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv;\n#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv\ntypedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);\nGLAPI PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer;\n#define glIsFramebuffer glad_glIsFramebuffer\ntypedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);\nGLAPI PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer;\n#define glBindFramebuffer glad_glBindFramebuffer\ntypedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers);\nGLAPI PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers;\n#define glDeleteFramebuffers glad_glDeleteFramebuffers\ntypedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers);\nGLAPI PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers;\n#define glGenFramebuffers glad_glGenFramebuffers\ntypedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);\nGLAPI PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus;\n#define glCheckFramebufferStatus glad_glCheckFramebufferStatus\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D;\n#define glFramebufferTexture1D glad_glFramebufferTexture1D\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D;\n#define glFramebufferTexture2D glad_glFramebufferTexture2D\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\nGLAPI PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D;\n#define glFramebufferTexture3D glad_glFramebufferTexture3D\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGLAPI PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer;\n#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer\ntypedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params);\nGLAPI PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv;\n#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv\ntypedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC)(GLenum target);\nGLAPI PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap;\n#define glGenerateMipmap glad_glGenerateMipmap\ntypedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\nGLAPI PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer;\n#define glBlitFramebuffer glad_glBlitFramebuffer\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample;\n#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGLAPI PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer;\n#define glFramebufferTextureLayer glad_glFramebufferTextureLayer\ntypedef void * (APIENTRYP PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\nGLAPI PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange;\n#define glMapBufferRange glad_glMapBufferRange\ntypedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length);\nGLAPI PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange;\n#define glFlushMappedBufferRange glad_glFlushMappedBufferRange\ntypedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC)(GLuint array);\nGLAPI PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray;\n#define glBindVertexArray glad_glBindVertexArray\ntypedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint *arrays);\nGLAPI PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays;\n#define glDeleteVertexArrays glad_glDeleteVertexArrays\ntypedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint *arrays);\nGLAPI PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays;\n#define glGenVertexArrays glad_glGenVertexArrays\ntypedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC)(GLuint array);\nGLAPI PFNGLISVERTEXARRAYPROC glad_glIsVertexArray;\n#define glIsVertexArray glad_glIsVertexArray\n#endif\n#ifndef GL_VERSION_3_1\n#define GL_VERSION_3_1 1\nGLAPI int GLAD_GL_VERSION_3_1;\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount);\nGLAPI PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced;\n#define glDrawArraysInstanced glad_glDrawArraysInstanced\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);\nGLAPI PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced;\n#define glDrawElementsInstanced glad_glDrawElementsInstanced\ntypedef void (APIENTRYP PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer);\nGLAPI PFNGLTEXBUFFERPROC glad_glTexBuffer;\n#define glTexBuffer glad_glTexBuffer\ntypedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index);\nGLAPI PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex;\n#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex\ntypedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\nGLAPI PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData;\n#define glCopyBufferSubData glad_glCopyBufferSubData\ntypedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);\nGLAPI PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices;\n#define glGetUniformIndices glad_glGetUniformIndices\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);\nGLAPI PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv;\n#define glGetActiveUniformsiv glad_glGetActiveUniformsiv\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);\nGLAPI PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName;\n#define glGetActiveUniformName glad_glGetActiveUniformName\ntypedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar *uniformBlockName);\nGLAPI PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex;\n#define glGetUniformBlockIndex glad_glGetUniformBlockIndex\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);\nGLAPI PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv;\n#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);\nGLAPI PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName;\n#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName\ntypedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\nGLAPI PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding;\n#define glUniformBlockBinding glad_glUniformBlockBinding\n#endif\n#ifndef GL_VERSION_3_2\n#define GL_VERSION_3_2 1\nGLAPI int GLAD_GL_VERSION_3_2;\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);\nGLAPI PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex;\n#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);\nGLAPI PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex;\n#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);\nGLAPI PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex;\n#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex);\nGLAPI PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex;\n#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex\ntypedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC)(GLenum mode);\nGLAPI PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex;\n#define glProvokingVertex glad_glProvokingVertex\ntypedef GLsync (APIENTRYP PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags);\nGLAPI PFNGLFENCESYNCPROC glad_glFenceSync;\n#define glFenceSync glad_glFenceSync\ntypedef GLboolean (APIENTRYP PFNGLISSYNCPROC)(GLsync sync);\nGLAPI PFNGLISSYNCPROC glad_glIsSync;\n#define glIsSync glad_glIsSync\ntypedef void (APIENTRYP PFNGLDELETESYNCPROC)(GLsync sync);\nGLAPI PFNGLDELETESYNCPROC glad_glDeleteSync;\n#define glDeleteSync glad_glDeleteSync\ntypedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);\nGLAPI PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync;\n#define glClientWaitSync glad_glClientWaitSync\ntypedef void (APIENTRYP PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);\nGLAPI PFNGLWAITSYNCPROC glad_glWaitSync;\n#define glWaitSync glad_glWaitSync\ntypedef void (APIENTRYP PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 *data);\nGLAPI PFNGLGETINTEGER64VPROC glad_glGetInteger64v;\n#define glGetInteger64v glad_glGetInteger64v\ntypedef void (APIENTRYP PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\nGLAPI PFNGLGETSYNCIVPROC glad_glGetSynciv;\n#define glGetSynciv glad_glGetSynciv\ntypedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 *data);\nGLAPI PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v;\n#define glGetInteger64i_v glad_glGetInteger64i_v\ntypedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 *params);\nGLAPI PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v;\n#define glGetBufferParameteri64v glad_glGetBufferParameteri64v\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level);\nGLAPI PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture;\n#define glFramebufferTexture glad_glFramebufferTexture\ntypedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\nGLAPI PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample;\n#define glTexImage2DMultisample glad_glTexImage2DMultisample\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample;\n#define glTexImage3DMultisample glad_glTexImage3DMultisample\ntypedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat *val);\nGLAPI PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv;\n#define glGetMultisamplefv glad_glGetMultisamplefv\ntypedef void (APIENTRYP PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask);\nGLAPI PFNGLSAMPLEMASKIPROC glad_glSampleMaski;\n#define glSampleMaski glad_glSampleMaski\n#endif\n#define GL_MULTISAMPLE_ARB 0x809D\n#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F\n#define GL_SAMPLE_COVERAGE_ARB 0x80A0\n#define GL_SAMPLE_BUFFERS_ARB 0x80A8\n#define GL_SAMPLES_ARB 0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB\n#define GL_MULTISAMPLE_BIT_ARB 0x20000000\n#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004\n#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252\n#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253\n#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254\n#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255\n#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n#define GL_NO_RESET_NOTIFICATION_ARB 0x8261\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION 0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245\n#define GL_DEBUG_SOURCE_API 0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249\n#define GL_DEBUG_SOURCE_APPLICATION 0x824A\n#define GL_DEBUG_SOURCE_OTHER 0x824B\n#define GL_DEBUG_TYPE_ERROR 0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E\n#define GL_DEBUG_TYPE_PORTABILITY 0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE 0x8250\n#define GL_DEBUG_TYPE_OTHER 0x8251\n#define GL_DEBUG_TYPE_MARKER 0x8268\n#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269\n#define GL_DEBUG_TYPE_POP_GROUP 0x826A\n#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C\n#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D\n#define GL_BUFFER 0x82E0\n#define GL_SHADER 0x82E1\n#define GL_PROGRAM 0x82E2\n#define GL_QUERY 0x82E3\n#define GL_PROGRAM_PIPELINE 0x82E4\n#define GL_SAMPLER 0x82E6\n#define GL_MAX_LABEL_LENGTH 0x82E8\n#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144\n#define GL_DEBUG_LOGGED_MESSAGES 0x9145\n#define GL_DEBUG_SEVERITY_HIGH 0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM 0x9147\n#define GL_DEBUG_SEVERITY_LOW 0x9148\n#define GL_DEBUG_OUTPUT 0x92E0\n#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245\n#define GL_DEBUG_SOURCE_API_KHR 0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249\n#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A\n#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B\n#define GL_DEBUG_TYPE_ERROR_KHR 0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E\n#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250\n#define GL_DEBUG_TYPE_OTHER_KHR 0x8251\n#define GL_DEBUG_TYPE_MARKER_KHR 0x8268\n#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269\n#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A\n#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C\n#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D\n#define GL_BUFFER_KHR 0x82E0\n#define GL_SHADER_KHR 0x82E1\n#define GL_PROGRAM_KHR 0x82E2\n#define GL_VERTEX_ARRAY_KHR 0x8074\n#define GL_QUERY_KHR 0x82E3\n#define GL_PROGRAM_PIPELINE_KHR 0x82E4\n#define GL_SAMPLER_KHR 0x82E6\n#define GL_MAX_LABEL_LENGTH_KHR 0x82E8\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145\n#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147\n#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148\n#define GL_DEBUG_OUTPUT_KHR 0x92E0\n#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002\n#define GL_STACK_OVERFLOW_KHR 0x0503\n#define GL_STACK_UNDERFLOW_KHR 0x0504\n#define GL_DISPLAY_LIST 0x82E7\n#ifndef GL_ARB_multisample\n#define GL_ARB_multisample 1\nGLAPI int GLAD_GL_ARB_multisample;\ntypedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC)(GLfloat value, GLboolean invert);\nGLAPI PFNGLSAMPLECOVERAGEARBPROC glad_glSampleCoverageARB;\n#define glSampleCoverageARB glad_glSampleCoverageARB\n#endif\n#ifndef GL_ARB_robustness\n#define GL_ARB_robustness 1\nGLAPI int GLAD_GL_ARB_robustness;\ntypedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC)();\nGLAPI PFNGLGETGRAPHICSRESETSTATUSARBPROC glad_glGetGraphicsResetStatusARB;\n#define glGetGraphicsResetStatusARB glad_glGetGraphicsResetStatusARB\ntypedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img);\nGLAPI PFNGLGETNTEXIMAGEARBPROC glad_glGetnTexImageARB;\n#define glGetnTexImageARB glad_glGetnTexImageARB\ntypedef void (APIENTRYP PFNGLREADNPIXELSARBPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);\nGLAPI PFNGLREADNPIXELSARBPROC glad_glReadnPixelsARB;\n#define glReadnPixelsARB glad_glReadnPixelsARB\ntypedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)(GLenum target, GLint lod, GLsizei bufSize, void *img);\nGLAPI PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC glad_glGetnCompressedTexImageARB;\n#define glGetnCompressedTexImageARB glad_glGetnCompressedTexImageARB\ntypedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);\nGLAPI PFNGLGETNUNIFORMFVARBPROC glad_glGetnUniformfvARB;\n#define glGetnUniformfvARB glad_glGetnUniformfvARB\ntypedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLint *params);\nGLAPI PFNGLGETNUNIFORMIVARBPROC glad_glGetnUniformivARB;\n#define glGetnUniformivARB glad_glGetnUniformivARB\ntypedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint *params);\nGLAPI PFNGLGETNUNIFORMUIVARBPROC glad_glGetnUniformuivARB;\n#define glGetnUniformuivARB glad_glGetnUniformuivARB\ntypedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble *params);\nGLAPI PFNGLGETNUNIFORMDVARBPROC glad_glGetnUniformdvARB;\n#define glGetnUniformdvARB glad_glGetnUniformdvARB\ntypedef void (APIENTRYP PFNGLGETNMAPDVARBPROC)(GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);\nGLAPI PFNGLGETNMAPDVARBPROC glad_glGetnMapdvARB;\n#define glGetnMapdvARB glad_glGetnMapdvARB\ntypedef void (APIENTRYP PFNGLGETNMAPFVARBPROC)(GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);\nGLAPI PFNGLGETNMAPFVARBPROC glad_glGetnMapfvARB;\n#define glGetnMapfvARB glad_glGetnMapfvARB\ntypedef void (APIENTRYP PFNGLGETNMAPIVARBPROC)(GLenum target, GLenum query, GLsizei bufSize, GLint *v);\nGLAPI PFNGLGETNMAPIVARBPROC glad_glGetnMapivARB;\n#define glGetnMapivARB glad_glGetnMapivARB\ntypedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC)(GLenum map, GLsizei bufSize, GLfloat *values);\nGLAPI PFNGLGETNPIXELMAPFVARBPROC glad_glGetnPixelMapfvARB;\n#define glGetnPixelMapfvARB glad_glGetnPixelMapfvARB\ntypedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC)(GLenum map, GLsizei bufSize, GLuint *values);\nGLAPI PFNGLGETNPIXELMAPUIVARBPROC glad_glGetnPixelMapuivARB;\n#define glGetnPixelMapuivARB glad_glGetnPixelMapuivARB\ntypedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC)(GLenum map, GLsizei bufSize, GLushort *values);\nGLAPI PFNGLGETNPIXELMAPUSVARBPROC glad_glGetnPixelMapusvARB;\n#define glGetnPixelMapusvARB glad_glGetnPixelMapusvARB\ntypedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC)(GLsizei bufSize, GLubyte *pattern);\nGLAPI PFNGLGETNPOLYGONSTIPPLEARBPROC glad_glGetnPolygonStippleARB;\n#define glGetnPolygonStippleARB glad_glGetnPolygonStippleARB\ntypedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);\nGLAPI PFNGLGETNCOLORTABLEARBPROC glad_glGetnColorTableARB;\n#define glGetnColorTableARB glad_glGetnColorTableARB\ntypedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);\nGLAPI PFNGLGETNCONVOLUTIONFILTERARBPROC glad_glGetnConvolutionFilterARB;\n#define glGetnConvolutionFilterARB glad_glGetnConvolutionFilterARB\ntypedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC)(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);\nGLAPI PFNGLGETNSEPARABLEFILTERARBPROC glad_glGetnSeparableFilterARB;\n#define glGetnSeparableFilterARB glad_glGetnSeparableFilterARB\ntypedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);\nGLAPI PFNGLGETNHISTOGRAMARBPROC glad_glGetnHistogramARB;\n#define glGetnHistogramARB glad_glGetnHistogramARB\ntypedef void (APIENTRYP PFNGLGETNMINMAXARBPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);\nGLAPI PFNGLGETNMINMAXARBPROC glad_glGetnMinmaxARB;\n#define glGetnMinmaxARB glad_glGetnMinmaxARB\n#endif\n#ifndef GL_KHR_debug\n#define GL_KHR_debug 1\nGLAPI int GLAD_GL_KHR_debug;\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\nGLAPI PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl;\n#define glDebugMessageControl glad_glDebugMessageControl\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\nGLAPI PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert;\n#define glDebugMessageInsert glad_glDebugMessageInsert\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void *userParam);\nGLAPI PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback;\n#define glDebugMessageCallback glad_glDebugMessageCallback\ntypedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\nGLAPI PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog;\n#define glGetDebugMessageLog glad_glGetDebugMessageLog\ntypedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar *message);\nGLAPI PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup;\n#define glPushDebugGroup glad_glPushDebugGroup\ntypedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC)();\nGLAPI PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup;\n#define glPopDebugGroup glad_glPopDebugGroup\ntypedef void (APIENTRYP PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);\nGLAPI PFNGLOBJECTLABELPROC glad_glObjectLabel;\n#define glObjectLabel glad_glObjectLabel\ntypedef void (APIENTRYP PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);\nGLAPI PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel;\n#define glGetObjectLabel glad_glGetObjectLabel\ntypedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC)(const void *ptr, GLsizei length, const GLchar *label);\nGLAPI PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel;\n#define glObjectPtrLabel glad_glObjectPtrLabel\ntypedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);\nGLAPI PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel;\n#define glGetObjectPtrLabel glad_glGetObjectPtrLabel\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\nGLAPI PFNGLDEBUGMESSAGECONTROLKHRPROC glad_glDebugMessageControlKHR;\n#define glDebugMessageControlKHR glad_glDebugMessageControlKHR\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\nGLAPI PFNGLDEBUGMESSAGEINSERTKHRPROC glad_glDebugMessageInsertKHR;\n#define glDebugMessageInsertKHR glad_glDebugMessageInsertKHR\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC)(GLDEBUGPROCKHR callback, const void *userParam);\nGLAPI PFNGLDEBUGMESSAGECALLBACKKHRPROC glad_glDebugMessageCallbackKHR;\n#define glDebugMessageCallbackKHR glad_glDebugMessageCallbackKHR\ntypedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\nGLAPI PFNGLGETDEBUGMESSAGELOGKHRPROC glad_glGetDebugMessageLogKHR;\n#define glGetDebugMessageLogKHR glad_glGetDebugMessageLogKHR\ntypedef void (APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC)(GLenum source, GLuint id, GLsizei length, const GLchar *message);\nGLAPI PFNGLPUSHDEBUGGROUPKHRPROC glad_glPushDebugGroupKHR;\n#define glPushDebugGroupKHR glad_glPushDebugGroupKHR\ntypedef void (APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC)();\nGLAPI PFNGLPOPDEBUGGROUPKHRPROC glad_glPopDebugGroupKHR;\n#define glPopDebugGroupKHR glad_glPopDebugGroupKHR\ntypedef void (APIENTRYP PFNGLOBJECTLABELKHRPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);\nGLAPI PFNGLOBJECTLABELKHRPROC glad_glObjectLabelKHR;\n#define glObjectLabelKHR glad_glObjectLabelKHR\ntypedef void (APIENTRYP PFNGLGETOBJECTLABELKHRPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);\nGLAPI PFNGLGETOBJECTLABELKHRPROC glad_glGetObjectLabelKHR;\n#define glGetObjectLabelKHR glad_glGetObjectLabelKHR\ntypedef void (APIENTRYP PFNGLOBJECTPTRLABELKHRPROC)(const void *ptr, GLsizei length, const GLchar *label);\nGLAPI PFNGLOBJECTPTRLABELKHRPROC glad_glObjectPtrLabelKHR;\n#define glObjectPtrLabelKHR glad_glObjectPtrLabelKHR\ntypedef void (APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);\nGLAPI PFNGLGETOBJECTPTRLABELKHRPROC glad_glGetObjectPtrLabelKHR;\n#define glGetObjectPtrLabelKHR glad_glGetObjectPtrLabelKHR\ntypedef void (APIENTRYP PFNGLGETPOINTERVKHRPROC)(GLenum pname, void **params);\nGLAPI PFNGLGETPOINTERVKHRPROC glad_glGetPointervKHR;\n#define glGetPointervKHR glad_glGetPointervKHR\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "external/GLFW/deps/glad.c",
    "content": "/*\n\n    OpenGL loader generated by glad 0.1.12a0 on Fri Sep 23 13:36:15 2016.\n\n    Language/Generator: C/C++\n    Specification: gl\n    APIs: gl=3.2\n    Profile: compatibility\n    Extensions:\n        GL_ARB_multisample,\n        GL_ARB_robustness,\n        GL_KHR_debug\n    Loader: False\n    Local files: False\n    Omit khrplatform: False\n\n    Commandline:\n        --profile=\"compatibility\" --api=\"gl=3.2\" --generator=\"c\" --spec=\"gl\" --no-loader --extensions=\"GL_ARB_multisample,GL_ARB_robustness,GL_KHR_debug\"\n    Online:\n        http://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&api=gl%3D3.2&extensions=GL_ARB_multisample&extensions=GL_ARB_robustness&extensions=GL_KHR_debug\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <glad/glad.h>\n\nstruct gladGLversionStruct GLVersion;\n\n#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0)\n#define _GLAD_IS_SOME_NEW_VERSION 1\n#endif\n\nstatic int max_loaded_major;\nstatic int max_loaded_minor;\n\nstatic const char *exts = NULL;\nstatic int num_exts_i = 0;\nstatic const char **exts_i = NULL;\n\nstatic int get_exts(void) {\n#ifdef _GLAD_IS_SOME_NEW_VERSION\n    if(max_loaded_major < 3) {\n#endif\n        exts = (const char *)glGetString(GL_EXTENSIONS);\n#ifdef _GLAD_IS_SOME_NEW_VERSION\n    } else {\n        int index;\n\n        num_exts_i = 0;\n        glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts_i);\n        if (num_exts_i > 0) {\n            exts_i = (const char **)realloc((void *)exts_i, num_exts_i * sizeof *exts_i);\n        }\n\n        if (exts_i == NULL) {\n            return 0;\n        }\n\n        for(index = 0; index < num_exts_i; index++) {\n            exts_i[index] = (const char*)glGetStringi(GL_EXTENSIONS, index);\n        }\n    }\n#endif\n    return 1;\n}\n\nstatic void free_exts(void) {\n    if (exts_i != NULL) {\n        free((char **)exts_i);\n        exts_i = NULL;\n    }\n}\n\nstatic int has_ext(const char *ext) {\n#ifdef _GLAD_IS_SOME_NEW_VERSION\n    if(max_loaded_major < 3) {\n#endif\n        const char *extensions;\n        const char *loc;\n        const char *terminator;\n        extensions = exts;\n        if(extensions == NULL || ext == NULL) {\n            return 0;\n        }\n\n        while(1) {\n            loc = strstr(extensions, ext);\n            if(loc == NULL) {\n                return 0;\n            }\n\n            terminator = loc + strlen(ext);\n            if((loc == extensions || *(loc - 1) == ' ') &&\n                (*terminator == ' ' || *terminator == '\\0')) {\n                return 1;\n            }\n            extensions = terminator;\n        }\n#ifdef _GLAD_IS_SOME_NEW_VERSION\n    } else {\n        int index;\n\n        for(index = 0; index < num_exts_i; index++) {\n            const char *e = exts_i[index];\n\n            if(strcmp(e, ext) == 0) {\n                return 1;\n            }\n        }\n    }\n#endif\n\n    return 0;\n}\nint GLAD_GL_VERSION_1_0;\nint GLAD_GL_VERSION_1_1;\nint GLAD_GL_VERSION_1_2;\nint GLAD_GL_VERSION_1_3;\nint GLAD_GL_VERSION_1_4;\nint GLAD_GL_VERSION_1_5;\nint GLAD_GL_VERSION_2_0;\nint GLAD_GL_VERSION_2_1;\nint GLAD_GL_VERSION_3_0;\nint GLAD_GL_VERSION_3_1;\nint GLAD_GL_VERSION_3_2;\nPFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D;\nPFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui;\nPFNGLWINDOWPOS2SPROC glad_glWindowPos2s;\nPFNGLWINDOWPOS2IPROC glad_glWindowPos2i;\nPFNGLWINDOWPOS2FPROC glad_glWindowPos2f;\nPFNGLWINDOWPOS2DPROC glad_glWindowPos2d;\nPFNGLVERTEX2FVPROC glad_glVertex2fv;\nPFNGLINDEXIPROC glad_glIndexi;\nPFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer;\nPFNGLRECTDVPROC glad_glRectdv;\nPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D;\nPFNGLEVALCOORD2DPROC glad_glEvalCoord2d;\nPFNGLEVALCOORD2FPROC glad_glEvalCoord2f;\nPFNGLINDEXDPROC glad_glIndexd;\nPFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv;\nPFNGLINDEXFPROC glad_glIndexf;\nPFNGLLINEWIDTHPROC glad_glLineWidth;\nPFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v;\nPFNGLGETMAPFVPROC glad_glGetMapfv;\nPFNGLINDEXSPROC glad_glIndexs;\nPFNGLCOMPILESHADERPROC glad_glCompileShader;\nPFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying;\nPFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv;\nPFNGLINDEXFVPROC glad_glIndexfv;\nPFNGLFOGIVPROC glad_glFogiv;\nPFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate;\nPFNGLRASTERPOS2FVPROC glad_glRasterPos2fv;\nPFNGLLIGHTMODELIVPROC glad_glLightModeliv;\nPFNGLCOLOR4UIPROC glad_glColor4ui;\nPFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv;\nPFNGLFOGFVPROC glad_glFogfv;\nPFNGLENABLEIPROC glad_glEnablei;\nPFNGLVERTEX4IVPROC glad_glVertex4iv;\nPFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv;\nPFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv;\nPFNGLCREATESHADERPROC glad_glCreateShader;\nPFNGLISBUFFERPROC glad_glIsBuffer;\nPFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv;\nPFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers;\nPFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D;\nPFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D;\nPFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f;\nPFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate;\nPFNGLVERTEX4FVPROC glad_glVertex4fv;\nPFNGLBINDTEXTUREPROC glad_glBindTexture;\nPFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s;\nPFNGLTEXCOORD2FVPROC glad_glTexCoord2fv;\nPFNGLSAMPLEMASKIPROC glad_glSampleMaski;\nPFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex;\nPFNGLTEXCOORD4FVPROC glad_glTexCoord4fv;\nPFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv;\nPFNGLPOINTSIZEPROC glad_glPointSize;\nPFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv;\nPFNGLDELETEPROGRAMPROC glad_glDeleteProgram;\nPFNGLCOLOR4BVPROC glad_glColor4bv;\nPFNGLRASTERPOS2FPROC glad_glRasterPos2f;\nPFNGLRASTERPOS2DPROC glad_glRasterPos2d;\nPFNGLLOADIDENTITYPROC glad_glLoadIdentity;\nPFNGLRASTERPOS2IPROC glad_glRasterPos2i;\nPFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage;\nPFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv;\nPFNGLCOLOR3BPROC glad_glColor3b;\nPFNGLCLEARBUFFERFVPROC glad_glClearBufferfv;\nPFNGLEDGEFLAGPROC glad_glEdgeFlag;\nPFNGLVERTEX3DPROC glad_glVertex3d;\nPFNGLVERTEX3FPROC glad_glVertex3f;\nPFNGLVERTEX3IPROC glad_glVertex3i;\nPFNGLCOLOR3IPROC glad_glColor3i;\nPFNGLUNIFORM3FPROC glad_glUniform3f;\nPFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv;\nPFNGLCOLOR3SPROC glad_glColor3s;\nPFNGLVERTEX3SPROC glad_glVertex3s;\nPFNGLCOLORMASKIPROC glad_glColorMaski;\nPFNGLCLEARBUFFERFIPROC glad_glClearBufferfi;\nPFNGLTEXCOORD1IVPROC glad_glTexCoord1iv;\nPFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer;\nPFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f;\nPFNGLVERTEX2IVPROC glad_glVertex2iv;\nPFNGLCOLOR3SVPROC glad_glColor3sv;\nPFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv;\nPFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv;\nPFNGLNORMALPOINTERPROC glad_glNormalPointer;\nPFNGLVERTEX4SVPROC glad_glVertex4sv;\nPFNGLPASSTHROUGHPROC glad_glPassThrough;\nPFNGLFOGIPROC glad_glFogi;\nPFNGLBEGINPROC glad_glBegin;\nPFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv;\nPFNGLCOLOR3UBVPROC glad_glColor3ubv;\nPFNGLVERTEXPOINTERPROC glad_glVertexPointer;\nPFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv;\nPFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers;\nPFNGLDRAWARRAYSPROC glad_glDrawArrays;\nPFNGLUNIFORM1UIPROC glad_glUniform1ui;\nPFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d;\nPFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f;\nPFNGLLIGHTFVPROC glad_glLightfv;\nPFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d;\nPFNGLCLEARPROC glad_glClear;\nPFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i;\nPFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName;\nPFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s;\nPFNGLISENABLEDPROC glad_glIsEnabled;\nPFNGLSTENCILOPPROC glad_glStencilOp;\nPFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv;\nPFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D;\nPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv;\nPFNGLTRANSLATEFPROC glad_glTranslatef;\nPFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub;\nPFNGLTRANSLATEDPROC glad_glTranslated;\nPFNGLTEXCOORD3SVPROC glad_glTexCoord3sv;\nPFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation;\nPFNGLTEXIMAGE1DPROC glad_glTexImage1D;\nPFNGLTEXPARAMETERIVPROC glad_glTexParameteriv;\nPFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv;\nPFNGLGETMATERIALFVPROC glad_glGetMaterialfv;\nPFNGLGETTEXIMAGEPROC glad_glGetTexImage;\nPFNGLFOGCOORDFVPROC glad_glFogCoordfv;\nPFNGLPIXELMAPUIVPROC glad_glPixelMapuiv;\nPFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog;\nPFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers;\nPFNGLINDEXSVPROC glad_glIndexsv;\nPFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders;\nPFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer;\nPFNGLVERTEX3IVPROC glad_glVertex3iv;\nPFNGLBITMAPPROC glad_glBitmap;\nPFNGLMATERIALIPROC glad_glMateriali;\nPFNGLISVERTEXARRAYPROC glad_glIsVertexArray;\nPFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray;\nPFNGLGETQUERYIVPROC glad_glGetQueryiv;\nPFNGLTEXCOORD4FPROC glad_glTexCoord4f;\nPFNGLTEXCOORD4DPROC glad_glTexCoord4d;\nPFNGLTEXCOORD4IPROC glad_glTexCoord4i;\nPFNGLMATERIALFPROC glad_glMaterialf;\nPFNGLTEXCOORD4SPROC glad_glTexCoord4s;\nPFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices;\nPFNGLISSHADERPROC glad_glIsShader;\nPFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s;\nPFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv;\nPFNGLVERTEX3DVPROC glad_glVertex3dv;\nPFNGLGETINTEGER64VPROC glad_glGetInteger64v;\nPFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv;\nPFNGLENABLEPROC glad_glEnable;\nPFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv;\nPFNGLCOLOR4FVPROC glad_glColor4fv;\nPFNGLTEXCOORD1FVPROC glad_glTexCoord1fv;\nPFNGLTEXCOORD2SVPROC glad_glTexCoord2sv;\nPFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv;\nPFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv;\nPFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i;\nPFNGLTEXCOORD3FVPROC glad_glTexCoord3fv;\nPFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv;\nPFNGLTEXGENFPROC glad_glTexGenf;\nPFNGLGETPOINTERVPROC glad_glGetPointerv;\nPFNGLPOLYGONOFFSETPROC glad_glPolygonOffset;\nPFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv;\nPFNGLNORMAL3FVPROC glad_glNormal3fv;\nPFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s;\nPFNGLDEPTHRANGEPROC glad_glDepthRange;\nPFNGLFRUSTUMPROC glad_glFrustum;\nPFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv;\nPFNGLDRAWBUFFERPROC glad_glDrawBuffer;\nPFNGLPUSHMATRIXPROC glad_glPushMatrix;\nPFNGLRASTERPOS3FVPROC glad_glRasterPos3fv;\nPFNGLORTHOPROC glad_glOrtho;\nPFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced;\nPFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv;\nPFNGLCLEARINDEXPROC glad_glClearIndex;\nPFNGLMAP1DPROC glad_glMap1d;\nPFNGLMAP1FPROC glad_glMap1f;\nPFNGLFLUSHPROC glad_glFlush;\nPFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv;\nPFNGLINDEXIVPROC glad_glIndexiv;\nPFNGLRASTERPOS3SVPROC glad_glRasterPos3sv;\nPFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv;\nPFNGLPIXELZOOMPROC glad_glPixelZoom;\nPFNGLFENCESYNCPROC glad_glFenceSync;\nPFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays;\nPFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv;\nPFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender;\nPFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex;\nPFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv;\nPFNGLLIGHTIPROC glad_glLighti;\nPFNGLLIGHTFPROC glad_glLightf;\nPFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation;\nPFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate;\nPFNGLCLAMPCOLORPROC glad_glClampColor;\nPFNGLUNIFORM4IVPROC glad_glUniform4iv;\nPFNGLCLEARSTENCILPROC glad_glClearStencil;\nPFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv;\nPFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv;\nPFNGLGENTEXTURESPROC glad_glGenTextures;\nPFNGLTEXCOORD4IVPROC glad_glTexCoord4iv;\nPFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv;\nPFNGLINDEXPOINTERPROC glad_glIndexPointer;\nPFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv;\nPFNGLISSYNCPROC glad_glIsSync;\nPFNGLVERTEX2FPROC glad_glVertex2f;\nPFNGLVERTEX2DPROC glad_glVertex2d;\nPFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers;\nPFNGLUNIFORM2IPROC glad_glUniform2i;\nPFNGLMAPGRID2DPROC glad_glMapGrid2d;\nPFNGLMAPGRID2FPROC glad_glMapGrid2f;\nPFNGLVERTEX2IPROC glad_glVertex2i;\nPFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer;\nPFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer;\nPFNGLVERTEX2SPROC glad_glVertex2s;\nPFNGLNORMAL3BVPROC glad_glNormal3bv;\nPFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv;\nPFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange;\nPFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv;\nPFNGLVERTEX3SVPROC glad_glVertex3sv;\nPFNGLGENQUERIESPROC glad_glGenQueries;\nPFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv;\nPFNGLTEXENVFPROC glad_glTexEnvf;\nPFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D;\nPFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v;\nPFNGLFOGCOORDDPROC glad_glFogCoordd;\nPFNGLFOGCOORDFPROC glad_glFogCoordf;\nPFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D;\nPFNGLTEXENVIPROC glad_glTexEnvi;\nPFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv;\nPFNGLISENABLEDIPROC glad_glIsEnabledi;\nPFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i;\nPFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv;\nPFNGLUNIFORM2IVPROC glad_glUniform2iv;\nPFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv;\nPFNGLUNIFORM4UIVPROC glad_glUniform4uiv;\nPFNGLMATRIXMODEPROC glad_glMatrixMode;\nPFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer;\nPFNGLGETMAPIVPROC glad_glGetMapiv;\nPFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D;\nPFNGLGETSHADERIVPROC glad_glGetShaderiv;\nPFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d;\nPFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f;\nPFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation;\nPFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;\nPFNGLCALLLISTPROC glad_glCallList;\nPFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv;\nPFNGLGETDOUBLEVPROC glad_glGetDoublev;\nPFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv;\nPFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d;\nPFNGLLIGHTMODELFPROC glad_glLightModelf;\nPFNGLGETUNIFORMIVPROC glad_glGetUniformiv;\nPFNGLVERTEX2SVPROC glad_glVertex2sv;\nPFNGLLIGHTMODELIPROC glad_glLightModeli;\nPFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv;\nPFNGLUNIFORM3FVPROC glad_glUniform3fv;\nPFNGLPIXELSTOREIPROC glad_glPixelStorei;\nPFNGLCALLLISTSPROC glad_glCallLists;\nPFNGLMAPBUFFERPROC glad_glMapBuffer;\nPFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d;\nPFNGLTEXCOORD3IPROC glad_glTexCoord3i;\nPFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv;\nPFNGLRASTERPOS3IPROC glad_glRasterPos3i;\nPFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b;\nPFNGLRASTERPOS3DPROC glad_glRasterPos3d;\nPFNGLRASTERPOS3FPROC glad_glRasterPos3f;\nPFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D;\nPFNGLTEXCOORD3FPROC glad_glTexCoord3f;\nPFNGLDELETESYNCPROC glad_glDeleteSync;\nPFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D;\nPFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample;\nPFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv;\nPFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements;\nPFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv;\nPFNGLTEXCOORD3SPROC glad_glTexCoord3s;\nPFNGLUNIFORM3IVPROC glad_glUniform3iv;\nPFNGLRASTERPOS3SPROC glad_glRasterPos3s;\nPFNGLPOLYGONMODEPROC glad_glPolygonMode;\nPFNGLDRAWBUFFERSPROC glad_glDrawBuffers;\nPFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv;\nPFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident;\nPFNGLISLISTPROC glad_glIsList;\nPFNGLRASTERPOS2SVPROC glad_glRasterPos2sv;\nPFNGLRASTERPOS4SVPROC glad_glRasterPos4sv;\nPFNGLCOLOR4SPROC glad_glColor4s;\nPFNGLUSEPROGRAMPROC glad_glUseProgram;\nPFNGLLINESTIPPLEPROC glad_glLineStipple;\nPFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv;\nPFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog;\nPFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv;\nPFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv;\nPFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv;\nPFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray;\nPFNGLCOLOR4BPROC glad_glColor4b;\nPFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f;\nPFNGLCOLOR4FPROC glad_glColor4f;\nPFNGLCOLOR4DPROC glad_glColor4d;\nPFNGLCOLOR4IPROC glad_glColor4i;\nPFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex;\nPFNGLRASTERPOS3IVPROC glad_glRasterPos3iv;\nPFNGLVERTEX2DVPROC glad_glVertex2dv;\nPFNGLTEXCOORD4SVPROC glad_glTexCoord4sv;\nPFNGLUNIFORM2UIVPROC glad_glUniform2uiv;\nPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D;\nPFNGLFINISHPROC glad_glFinish;\nPFNGLGETBOOLEANVPROC glad_glGetBooleanv;\nPFNGLDELETESHADERPROC glad_glDeleteShader;\nPFNGLDRAWELEMENTSPROC glad_glDrawElements;\nPFNGLRASTERPOS2SPROC glad_glRasterPos2s;\nPFNGLGETMAPDVPROC glad_glGetMapdv;\nPFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv;\nPFNGLMATERIALFVPROC glad_glMaterialfv;\nPFNGLVIEWPORTPROC glad_glViewport;\nPFNGLUNIFORM1UIVPROC glad_glUniform1uiv;\nPFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings;\nPFNGLINDEXDVPROC glad_glIndexdv;\nPFNGLTEXCOORD3DPROC glad_glTexCoord3d;\nPFNGLTEXCOORD3IVPROC glad_glTexCoord3iv;\nPFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i;\nPFNGLCLEARDEPTHPROC glad_glClearDepth;\nPFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv;\nPFNGLTEXPARAMETERFPROC glad_glTexParameterf;\nPFNGLTEXPARAMETERIPROC glad_glTexParameteri;\nPFNGLGETSHADERSOURCEPROC glad_glGetShaderSource;\nPFNGLTEXBUFFERPROC glad_glTexBuffer;\nPFNGLPOPNAMEPROC glad_glPopName;\nPFNGLVALIDATEPROGRAMPROC glad_glValidateProgram;\nPFNGLPIXELSTOREFPROC glad_glPixelStoref;\nPFNGLUNIFORM3UIVPROC glad_glUniform3uiv;\nPFNGLRASTERPOS4FVPROC glad_glRasterPos4fv;\nPFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv;\nPFNGLRECTIPROC glad_glRecti;\nPFNGLCOLOR4UBPROC glad_glColor4ub;\nPFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf;\nPFNGLRECTFPROC glad_glRectf;\nPFNGLRECTDPROC glad_glRectd;\nPFNGLNORMAL3SVPROC glad_glNormal3sv;\nPFNGLNEWLISTPROC glad_glNewList;\nPFNGLCOLOR4USPROC glad_glColor4us;\nPFNGLLINKPROGRAMPROC glad_glLinkProgram;\nPFNGLHINTPROC glad_glHint;\nPFNGLRECTSPROC glad_glRects;\nPFNGLTEXCOORD2DVPROC glad_glTexCoord2dv;\nPFNGLRASTERPOS4IVPROC glad_glRasterPos4iv;\nPFNGLGETSTRINGPROC glad_glGetString;\nPFNGLEDGEFLAGVPROC glad_glEdgeFlagv;\nPFNGLDETACHSHADERPROC glad_glDetachShader;\nPFNGLSCALEFPROC glad_glScalef;\nPFNGLENDQUERYPROC glad_glEndQuery;\nPFNGLSCALEDPROC glad_glScaled;\nPFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer;\nPFNGLCOPYPIXELSPROC glad_glCopyPixels;\nPFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui;\nPFNGLPOPATTRIBPROC glad_glPopAttrib;\nPFNGLDELETETEXTURESPROC glad_glDeleteTextures;\nPFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate;\nPFNGLDELETEQUERIESPROC glad_glDeleteQueries;\nPFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f;\nPFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d;\nPFNGLINITNAMESPROC glad_glInitNames;\nPFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v;\nPFNGLCOLOR3DVPROC glad_glColor3dv;\nPFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i;\nPFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv;\nPFNGLWAITSYNCPROC glad_glWaitSync;\nPFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s;\nPFNGLCOLORMATERIALPROC glad_glColorMaterial;\nPFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage;\nPFNGLUNIFORM1FPROC glad_glUniform1f;\nPFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv;\nPFNGLRENDERMODEPROC glad_glRenderMode;\nPFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage;\nPFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv;\nPFNGLUNIFORM1IPROC glad_glUniform1i;\nPFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib;\nPFNGLUNIFORM3IPROC glad_glUniform3i;\nPFNGLPIXELTRANSFERIPROC glad_glPixelTransferi;\nPFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D;\nPFNGLDISABLEPROC glad_glDisable;\nPFNGLLOGICOPPROC glad_glLogicOp;\nPFNGLEVALPOINT2PROC glad_glEvalPoint2;\nPFNGLPIXELTRANSFERFPROC glad_glPixelTransferf;\nPFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i;\nPFNGLUNIFORM4UIPROC glad_glUniform4ui;\nPFNGLCOLOR3FPROC glad_glColor3f;\nPFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer;\nPFNGLGETTEXENVFVPROC glad_glGetTexEnvfv;\nPFNGLRECTFVPROC glad_glRectfv;\nPFNGLCULLFACEPROC glad_glCullFace;\nPFNGLGETLIGHTFVPROC glad_glGetLightfv;\nPFNGLCOLOR3DPROC glad_glColor3d;\nPFNGLTEXGENDPROC glad_glTexGend;\nPFNGLTEXGENIPROC glad_glTexGeni;\nPFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s;\nPFNGLGETSTRINGIPROC glad_glGetStringi;\nPFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i;\nPFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f;\nPFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d;\nPFNGLATTACHSHADERPROC glad_glAttachShader;\nPFNGLFOGCOORDDVPROC glad_glFogCoorddv;\nPFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv;\nPFNGLGETTEXGENFVPROC glad_glGetTexGenfv;\nPFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer;\nPFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex;\nPFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D;\nPFNGLTEXGENIVPROC glad_glTexGeniv;\nPFNGLRASTERPOS2DVPROC glad_glRasterPos2dv;\nPFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv;\nPFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture;\nPFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv;\nPFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us;\nPFNGLTEXENVFVPROC glad_glTexEnvfv;\nPFNGLREADBUFFERPROC glad_glReadBuffer;\nPFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv;\nPFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced;\nPFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap;\nPFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv;\nPFNGLLIGHTMODELFVPROC glad_glLightModelfv;\nPFNGLDELETELISTSPROC glad_glDeleteLists;\nPFNGLGETCLIPPLANEPROC glad_glGetClipPlane;\nPFNGLVERTEX4DVPROC glad_glVertex4dv;\nPFNGLTEXCOORD2DPROC glad_glTexCoord2d;\nPFNGLPOPMATRIXPROC glad_glPopMatrix;\nPFNGLTEXCOORD2FPROC glad_glTexCoord2f;\nPFNGLCOLOR4IVPROC glad_glColor4iv;\nPFNGLINDEXUBVPROC glad_glIndexubv;\nPFNGLUNMAPBUFFERPROC glad_glUnmapBuffer;\nPFNGLTEXCOORD2IPROC glad_glTexCoord2i;\nPFNGLRASTERPOS4DPROC glad_glRasterPos4d;\nPFNGLRASTERPOS4FPROC glad_glRasterPos4f;\nPFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s;\nPFNGLTEXCOORD2SPROC glad_glTexCoord2s;\nPFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer;\nPFNGLVERTEX3FVPROC glad_glVertex3fv;\nPFNGLTEXCOORD4DVPROC glad_glTexCoord4dv;\nPFNGLMATERIALIVPROC glad_glMaterialiv;\nPFNGLISPROGRAMPROC glad_glIsProgram;\nPFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv;\nPFNGLVERTEX4SPROC glad_glVertex4s;\nPFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv;\nPFNGLNORMAL3DVPROC glad_glNormal3dv;\nPFNGLUNIFORM4IPROC glad_glUniform4i;\nPFNGLACTIVETEXTUREPROC glad_glActiveTexture;\nPFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray;\nPFNGLROTATEDPROC glad_glRotated;\nPFNGLROTATEFPROC glad_glRotatef;\nPFNGLVERTEX4IPROC glad_glVertex4i;\nPFNGLREADPIXELSPROC glad_glReadPixels;\nPFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv;\nPFNGLLOADNAMEPROC glad_glLoadName;\nPFNGLUNIFORM4FPROC glad_glUniform4f;\nPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample;\nPFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays;\nPFNGLSHADEMODELPROC glad_glShadeModel;\nPFNGLMAPGRID1DPROC glad_glMapGrid1d;\nPFNGLGETUNIFORMFVPROC glad_glGetUniformfv;\nPFNGLMAPGRID1FPROC glad_glMapGrid1f;\nPFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState;\nPFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv;\nPFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex;\nPFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer;\nPFNGLALPHAFUNCPROC glad_glAlphaFunc;\nPFNGLUNIFORM1IVPROC glad_glUniform1iv;\nPFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv;\nPFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv;\nPFNGLSTENCILFUNCPROC glad_glStencilFunc;\nPFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv;\nPFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding;\nPFNGLCOLOR4UIVPROC glad_glColor4uiv;\nPFNGLRECTIVPROC glad_glRectiv;\nPFNGLRASTERPOS3DVPROC glad_glRasterPos3dv;\nPFNGLEVALMESH2PROC glad_glEvalMesh2;\nPFNGLEVALMESH1PROC glad_glEvalMesh1;\nPFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer;\nPFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv;\nPFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv;\nPFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv;\nPFNGLCOLOR4UBVPROC glad_glColor4ubv;\nPFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd;\nPFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf;\nPFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i;\nPFNGLRASTERPOS2IVPROC glad_glRasterPos2iv;\nPFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData;\nPFNGLTEXENVIVPROC glad_glTexEnviv;\nPFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate;\nPFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui;\nPFNGLGENBUFFERSPROC glad_glGenBuffers;\nPFNGLSELECTBUFFERPROC glad_glSelectBuffer;\nPFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv;\nPFNGLPUSHATTRIBPROC glad_glPushAttrib;\nPFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer;\nPFNGLBLENDFUNCPROC glad_glBlendFunc;\nPFNGLCREATEPROGRAMPROC glad_glCreateProgram;\nPFNGLTEXIMAGE3DPROC glad_glTexImage3D;\nPFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer;\nPFNGLLIGHTIVPROC glad_glLightiv;\nPFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex;\nPFNGLTEXGENFVPROC glad_glTexGenfv;\nPFNGLENDPROC glad_glEnd;\nPFNGLDELETEBUFFERSPROC glad_glDeleteBuffers;\nPFNGLSCISSORPROC glad_glScissor;\nPFNGLCLIPPLANEPROC glad_glClipPlane;\nPFNGLPUSHNAMEPROC glad_glPushName;\nPFNGLTEXGENDVPROC glad_glTexGendv;\nPFNGLINDEXUBPROC glad_glIndexub;\nPFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv;\nPFNGLRASTERPOS4IPROC glad_glRasterPos4i;\nPFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd;\nPFNGLCLEARCOLORPROC glad_glClearColor;\nPFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv;\nPFNGLNORMAL3SPROC glad_glNormal3s;\nPFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv;\nPFNGLCLEARBUFFERIVPROC glad_glClearBufferiv;\nPFNGLPOINTPARAMETERIPROC glad_glPointParameteri;\nPFNGLBLENDCOLORPROC glad_glBlendColor;\nPFNGLWINDOWPOS3DPROC glad_glWindowPos3d;\nPFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv;\nPFNGLUNIFORM3UIPROC glad_glUniform3ui;\nPFNGLCOLOR4DVPROC glad_glColor4dv;\nPFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv;\nPFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv;\nPFNGLUNIFORM2FVPROC glad_glUniform2fv;\nPFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub;\nPFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui;\nPFNGLTEXCOORD3DVPROC glad_glTexCoord3dv;\nPFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange;\nPFNGLNORMAL3IVPROC glad_glNormal3iv;\nPFNGLWINDOWPOS3SPROC glad_glWindowPos3s;\nPFNGLPOINTPARAMETERFPROC glad_glPointParameterf;\nPFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv;\nPFNGLWINDOWPOS3IPROC glad_glWindowPos3i;\nPFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s;\nPFNGLWINDOWPOS3FPROC glad_glWindowPos3f;\nPFNGLCOLOR3USPROC glad_glColor3us;\nPFNGLCOLOR3UIVPROC glad_glColor3uiv;\nPFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv;\nPFNGLGETLIGHTIVPROC glad_glGetLightiv;\nPFNGLDEPTHFUNCPROC glad_glDepthFunc;\nPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D;\nPFNGLLISTBASEPROC glad_glListBase;\nPFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f;\nPFNGLCOLOR3UBPROC glad_glColor3ub;\nPFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d;\nPFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv;\nPFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv;\nPFNGLCOLOR3UIPROC glad_glColor3ui;\nPFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i;\nPFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;\nPFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync;\nPFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui;\nPFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv;\nPFNGLCOLORMASKPROC glad_glColorMask;\nPFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv;\nPFNGLBLENDEQUATIONPROC glad_glBlendEquation;\nPFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation;\nPFNGLRASTERPOS4SPROC glad_glRasterPos4s;\nPFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback;\nPFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv;\nPFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv;\nPFNGLCOLOR4SVPROC glad_glColor4sv;\nPFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;\nPFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback;\nPFNGLFOGFPROC glad_glFogf;\nPFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv;\nPFNGLCOLOR3IVPROC glad_glColor3iv;\nPFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D;\nPFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D;\nPFNGLTEXCOORD1IPROC glad_glTexCoord1i;\nPFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus;\nPFNGLTEXCOORD1DPROC glad_glTexCoord1d;\nPFNGLTEXCOORD1FPROC glad_glTexCoord1f;\nPFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender;\nPFNGLENABLECLIENTSTATEPROC glad_glEnableClientState;\nPFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation;\nPFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv;\nPFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv;\nPFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv;\nPFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements;\nPFNGLTEXCOORD1SPROC glad_glTexCoord1s;\nPFNGLBINDBUFFERBASEPROC glad_glBindBufferBase;\nPFNGLBUFFERSUBDATAPROC glad_glBufferSubData;\nPFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv;\nPFNGLGENLISTSPROC glad_glGenLists;\nPFNGLCOLOR3BVPROC glad_glColor3bv;\nPFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange;\nPFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture;\nPFNGLGETTEXGENDVPROC glad_glGetTexGendv;\nPFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays;\nPFNGLENDLISTPROC glad_glEndList;\nPFNGLUNIFORM2UIPROC glad_glUniform2ui;\nPFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv;\nPFNGLCOLOR3USVPROC glad_glColor3usv;\nPFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv;\nPFNGLDISABLEIPROC glad_glDisablei;\nPFNGLINDEXMASKPROC glad_glIndexMask;\nPFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;\nPFNGLSHADERSOURCEPROC glad_glShaderSource;\nPFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName;\nPFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv;\nPFNGLCLEARACCUMPROC glad_glClearAccum;\nPFNGLGETSYNCIVPROC glad_glGetSynciv;\nPFNGLUNIFORM2FPROC glad_glUniform2f;\nPFNGLBEGINQUERYPROC glad_glBeginQuery;\nPFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex;\nPFNGLBINDBUFFERPROC glad_glBindBuffer;\nPFNGLMAP2DPROC glad_glMap2d;\nPFNGLMAP2FPROC glad_glMap2f;\nPFNGLVERTEX4DPROC glad_glVertex4d;\nPFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv;\nPFNGLTEXCOORD1SVPROC glad_glTexCoord1sv;\nPFNGLBUFFERDATAPROC glad_glBufferData;\nPFNGLEVALPOINT1PROC glad_glEvalPoint1;\nPFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv;\nPFNGLTEXCOORD1DVPROC glad_glTexCoord1dv;\nPFNGLGETERRORPROC glad_glGetError;\nPFNGLGETTEXENVIVPROC glad_glGetTexEnviv;\nPFNGLGETPROGRAMIVPROC glad_glGetProgramiv;\nPFNGLGETFLOATVPROC glad_glGetFloatv;\nPFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D;\nPFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv;\nPFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv;\nPFNGLEVALCOORD1DPROC glad_glEvalCoord1d;\nPFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv;\nPFNGLEVALCOORD1FPROC glad_glEvalCoord1f;\nPFNGLPIXELMAPFVPROC glad_glPixelMapfv;\nPFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv;\nPFNGLGETINTEGERVPROC glad_glGetIntegerv;\nPFNGLACCUMPROC glad_glAccum;\nPFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv;\nPFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv;\nPFNGLRASTERPOS4DVPROC glad_glRasterPos4dv;\nPFNGLTEXCOORD2IVPROC glad_glTexCoord2iv;\nPFNGLISQUERYPROC glad_glIsQuery;\nPFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv;\nPFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv;\nPFNGLTEXIMAGE2DPROC glad_glTexImage2D;\nPFNGLSTENCILMASKPROC glad_glStencilMask;\nPFNGLDRAWPIXELSPROC glad_glDrawPixels;\nPFNGLMULTMATRIXDPROC glad_glMultMatrixd;\nPFNGLMULTMATRIXFPROC glad_glMultMatrixf;\nPFNGLISTEXTUREPROC glad_glIsTexture;\nPFNGLGETMATERIALIVPROC glad_glGetMaterialiv;\nPFNGLUNIFORM1FVPROC glad_glUniform1fv;\nPFNGLLOADMATRIXFPROC glad_glLoadMatrixf;\nPFNGLLOADMATRIXDPROC glad_glLoadMatrixd;\nPFNGLTEXPARAMETERFVPROC glad_glTexParameterfv;\nPFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv;\nPFNGLVERTEX4FPROC glad_glVertex4f;\nPFNGLRECTSVPROC glad_glRectsv;\nPFNGLCOLOR4USVPROC glad_glColor4usv;\nPFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple;\nPFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;\nPFNGLNORMAL3IPROC glad_glNormal3i;\nPFNGLNORMAL3FPROC glad_glNormal3f;\nPFNGLNORMAL3DPROC glad_glNormal3d;\nPFNGLNORMAL3BPROC glad_glNormal3b;\nPFNGLPIXELMAPUSVPROC glad_glPixelMapusv;\nPFNGLGETTEXGENIVPROC glad_glGetTexGeniv;\nPFNGLARRAYELEMENTPROC glad_glArrayElement;\nPFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData;\nPFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv;\nPFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d;\nPFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f;\nPFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv;\nPFNGLDEPTHMASKPROC glad_glDepthMask;\nPFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s;\nPFNGLCOLOR3FVPROC glad_glColor3fv;\nPFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample;\nPFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv;\nPFNGLUNIFORM4FVPROC glad_glUniform4fv;\nPFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform;\nPFNGLCOLORPOINTERPROC glad_glColorPointer;\nPFNGLFRONTFACEPROC glad_glFrontFace;\nPFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v;\nPFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv;\nint GLAD_GL_KHR_debug;\nint GLAD_GL_ARB_robustness;\nint GLAD_GL_ARB_multisample;\nPFNGLSAMPLECOVERAGEARBPROC glad_glSampleCoverageARB;\nPFNGLGETGRAPHICSRESETSTATUSARBPROC glad_glGetGraphicsResetStatusARB;\nPFNGLGETNTEXIMAGEARBPROC glad_glGetnTexImageARB;\nPFNGLREADNPIXELSARBPROC glad_glReadnPixelsARB;\nPFNGLGETNCOMPRESSEDTEXIMAGEARBPROC glad_glGetnCompressedTexImageARB;\nPFNGLGETNUNIFORMFVARBPROC glad_glGetnUniformfvARB;\nPFNGLGETNUNIFORMIVARBPROC glad_glGetnUniformivARB;\nPFNGLGETNUNIFORMUIVARBPROC glad_glGetnUniformuivARB;\nPFNGLGETNUNIFORMDVARBPROC glad_glGetnUniformdvARB;\nPFNGLGETNMAPDVARBPROC glad_glGetnMapdvARB;\nPFNGLGETNMAPFVARBPROC glad_glGetnMapfvARB;\nPFNGLGETNMAPIVARBPROC glad_glGetnMapivARB;\nPFNGLGETNPIXELMAPFVARBPROC glad_glGetnPixelMapfvARB;\nPFNGLGETNPIXELMAPUIVARBPROC glad_glGetnPixelMapuivARB;\nPFNGLGETNPIXELMAPUSVARBPROC glad_glGetnPixelMapusvARB;\nPFNGLGETNPOLYGONSTIPPLEARBPROC glad_glGetnPolygonStippleARB;\nPFNGLGETNCOLORTABLEARBPROC glad_glGetnColorTableARB;\nPFNGLGETNCONVOLUTIONFILTERARBPROC glad_glGetnConvolutionFilterARB;\nPFNGLGETNSEPARABLEFILTERARBPROC glad_glGetnSeparableFilterARB;\nPFNGLGETNHISTOGRAMARBPROC glad_glGetnHistogramARB;\nPFNGLGETNMINMAXARBPROC glad_glGetnMinmaxARB;\nPFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl;\nPFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert;\nPFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback;\nPFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog;\nPFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup;\nPFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup;\nPFNGLOBJECTLABELPROC glad_glObjectLabel;\nPFNGLGETOBJECTLABELPROC glad_glGetObjectLabel;\nPFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel;\nPFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel;\nPFNGLDEBUGMESSAGECONTROLKHRPROC glad_glDebugMessageControlKHR;\nPFNGLDEBUGMESSAGEINSERTKHRPROC glad_glDebugMessageInsertKHR;\nPFNGLDEBUGMESSAGECALLBACKKHRPROC glad_glDebugMessageCallbackKHR;\nPFNGLGETDEBUGMESSAGELOGKHRPROC glad_glGetDebugMessageLogKHR;\nPFNGLPUSHDEBUGGROUPKHRPROC glad_glPushDebugGroupKHR;\nPFNGLPOPDEBUGGROUPKHRPROC glad_glPopDebugGroupKHR;\nPFNGLOBJECTLABELKHRPROC glad_glObjectLabelKHR;\nPFNGLGETOBJECTLABELKHRPROC glad_glGetObjectLabelKHR;\nPFNGLOBJECTPTRLABELKHRPROC glad_glObjectPtrLabelKHR;\nPFNGLGETOBJECTPTRLABELKHRPROC glad_glGetObjectPtrLabelKHR;\nPFNGLGETPOINTERVKHRPROC glad_glGetPointervKHR;\nstatic void load_GL_VERSION_1_0(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_1_0) return;\n\tglad_glCullFace = (PFNGLCULLFACEPROC)load(\"glCullFace\");\n\tglad_glFrontFace = (PFNGLFRONTFACEPROC)load(\"glFrontFace\");\n\tglad_glHint = (PFNGLHINTPROC)load(\"glHint\");\n\tglad_glLineWidth = (PFNGLLINEWIDTHPROC)load(\"glLineWidth\");\n\tglad_glPointSize = (PFNGLPOINTSIZEPROC)load(\"glPointSize\");\n\tglad_glPolygonMode = (PFNGLPOLYGONMODEPROC)load(\"glPolygonMode\");\n\tglad_glScissor = (PFNGLSCISSORPROC)load(\"glScissor\");\n\tglad_glTexParameterf = (PFNGLTEXPARAMETERFPROC)load(\"glTexParameterf\");\n\tglad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC)load(\"glTexParameterfv\");\n\tglad_glTexParameteri = (PFNGLTEXPARAMETERIPROC)load(\"glTexParameteri\");\n\tglad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC)load(\"glTexParameteriv\");\n\tglad_glTexImage1D = (PFNGLTEXIMAGE1DPROC)load(\"glTexImage1D\");\n\tglad_glTexImage2D = (PFNGLTEXIMAGE2DPROC)load(\"glTexImage2D\");\n\tglad_glDrawBuffer = (PFNGLDRAWBUFFERPROC)load(\"glDrawBuffer\");\n\tglad_glClear = (PFNGLCLEARPROC)load(\"glClear\");\n\tglad_glClearColor = (PFNGLCLEARCOLORPROC)load(\"glClearColor\");\n\tglad_glClearStencil = (PFNGLCLEARSTENCILPROC)load(\"glClearStencil\");\n\tglad_glClearDepth = (PFNGLCLEARDEPTHPROC)load(\"glClearDepth\");\n\tglad_glStencilMask = (PFNGLSTENCILMASKPROC)load(\"glStencilMask\");\n\tglad_glColorMask = (PFNGLCOLORMASKPROC)load(\"glColorMask\");\n\tglad_glDepthMask = (PFNGLDEPTHMASKPROC)load(\"glDepthMask\");\n\tglad_glDisable = (PFNGLDISABLEPROC)load(\"glDisable\");\n\tglad_glEnable = (PFNGLENABLEPROC)load(\"glEnable\");\n\tglad_glFinish = (PFNGLFINISHPROC)load(\"glFinish\");\n\tglad_glFlush = (PFNGLFLUSHPROC)load(\"glFlush\");\n\tglad_glBlendFunc = (PFNGLBLENDFUNCPROC)load(\"glBlendFunc\");\n\tglad_glLogicOp = (PFNGLLOGICOPPROC)load(\"glLogicOp\");\n\tglad_glStencilFunc = (PFNGLSTENCILFUNCPROC)load(\"glStencilFunc\");\n\tglad_glStencilOp = (PFNGLSTENCILOPPROC)load(\"glStencilOp\");\n\tglad_glDepthFunc = (PFNGLDEPTHFUNCPROC)load(\"glDepthFunc\");\n\tglad_glPixelStoref = (PFNGLPIXELSTOREFPROC)load(\"glPixelStoref\");\n\tglad_glPixelStorei = (PFNGLPIXELSTOREIPROC)load(\"glPixelStorei\");\n\tglad_glReadBuffer = (PFNGLREADBUFFERPROC)load(\"glReadBuffer\");\n\tglad_glReadPixels = (PFNGLREADPIXELSPROC)load(\"glReadPixels\");\n\tglad_glGetBooleanv = (PFNGLGETBOOLEANVPROC)load(\"glGetBooleanv\");\n\tglad_glGetDoublev = (PFNGLGETDOUBLEVPROC)load(\"glGetDoublev\");\n\tglad_glGetError = (PFNGLGETERRORPROC)load(\"glGetError\");\n\tglad_glGetFloatv = (PFNGLGETFLOATVPROC)load(\"glGetFloatv\");\n\tglad_glGetIntegerv = (PFNGLGETINTEGERVPROC)load(\"glGetIntegerv\");\n\tglad_glGetString = (PFNGLGETSTRINGPROC)load(\"glGetString\");\n\tglad_glGetTexImage = (PFNGLGETTEXIMAGEPROC)load(\"glGetTexImage\");\n\tglad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC)load(\"glGetTexParameterfv\");\n\tglad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC)load(\"glGetTexParameteriv\");\n\tglad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC)load(\"glGetTexLevelParameterfv\");\n\tglad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC)load(\"glGetTexLevelParameteriv\");\n\tglad_glIsEnabled = (PFNGLISENABLEDPROC)load(\"glIsEnabled\");\n\tglad_glDepthRange = (PFNGLDEPTHRANGEPROC)load(\"glDepthRange\");\n\tglad_glViewport = (PFNGLVIEWPORTPROC)load(\"glViewport\");\n\tglad_glNewList = (PFNGLNEWLISTPROC)load(\"glNewList\");\n\tglad_glEndList = (PFNGLENDLISTPROC)load(\"glEndList\");\n\tglad_glCallList = (PFNGLCALLLISTPROC)load(\"glCallList\");\n\tglad_glCallLists = (PFNGLCALLLISTSPROC)load(\"glCallLists\");\n\tglad_glDeleteLists = (PFNGLDELETELISTSPROC)load(\"glDeleteLists\");\n\tglad_glGenLists = (PFNGLGENLISTSPROC)load(\"glGenLists\");\n\tglad_glListBase = (PFNGLLISTBASEPROC)load(\"glListBase\");\n\tglad_glBegin = (PFNGLBEGINPROC)load(\"glBegin\");\n\tglad_glBitmap = (PFNGLBITMAPPROC)load(\"glBitmap\");\n\tglad_glColor3b = (PFNGLCOLOR3BPROC)load(\"glColor3b\");\n\tglad_glColor3bv = (PFNGLCOLOR3BVPROC)load(\"glColor3bv\");\n\tglad_glColor3d = (PFNGLCOLOR3DPROC)load(\"glColor3d\");\n\tglad_glColor3dv = (PFNGLCOLOR3DVPROC)load(\"glColor3dv\");\n\tglad_glColor3f = (PFNGLCOLOR3FPROC)load(\"glColor3f\");\n\tglad_glColor3fv = (PFNGLCOLOR3FVPROC)load(\"glColor3fv\");\n\tglad_glColor3i = (PFNGLCOLOR3IPROC)load(\"glColor3i\");\n\tglad_glColor3iv = (PFNGLCOLOR3IVPROC)load(\"glColor3iv\");\n\tglad_glColor3s = (PFNGLCOLOR3SPROC)load(\"glColor3s\");\n\tglad_glColor3sv = (PFNGLCOLOR3SVPROC)load(\"glColor3sv\");\n\tglad_glColor3ub = (PFNGLCOLOR3UBPROC)load(\"glColor3ub\");\n\tglad_glColor3ubv = (PFNGLCOLOR3UBVPROC)load(\"glColor3ubv\");\n\tglad_glColor3ui = (PFNGLCOLOR3UIPROC)load(\"glColor3ui\");\n\tglad_glColor3uiv = (PFNGLCOLOR3UIVPROC)load(\"glColor3uiv\");\n\tglad_glColor3us = (PFNGLCOLOR3USPROC)load(\"glColor3us\");\n\tglad_glColor3usv = (PFNGLCOLOR3USVPROC)load(\"glColor3usv\");\n\tglad_glColor4b = (PFNGLCOLOR4BPROC)load(\"glColor4b\");\n\tglad_glColor4bv = (PFNGLCOLOR4BVPROC)load(\"glColor4bv\");\n\tglad_glColor4d = (PFNGLCOLOR4DPROC)load(\"glColor4d\");\n\tglad_glColor4dv = (PFNGLCOLOR4DVPROC)load(\"glColor4dv\");\n\tglad_glColor4f = (PFNGLCOLOR4FPROC)load(\"glColor4f\");\n\tglad_glColor4fv = (PFNGLCOLOR4FVPROC)load(\"glColor4fv\");\n\tglad_glColor4i = (PFNGLCOLOR4IPROC)load(\"glColor4i\");\n\tglad_glColor4iv = (PFNGLCOLOR4IVPROC)load(\"glColor4iv\");\n\tglad_glColor4s = (PFNGLCOLOR4SPROC)load(\"glColor4s\");\n\tglad_glColor4sv = (PFNGLCOLOR4SVPROC)load(\"glColor4sv\");\n\tglad_glColor4ub = (PFNGLCOLOR4UBPROC)load(\"glColor4ub\");\n\tglad_glColor4ubv = (PFNGLCOLOR4UBVPROC)load(\"glColor4ubv\");\n\tglad_glColor4ui = (PFNGLCOLOR4UIPROC)load(\"glColor4ui\");\n\tglad_glColor4uiv = (PFNGLCOLOR4UIVPROC)load(\"glColor4uiv\");\n\tglad_glColor4us = (PFNGLCOLOR4USPROC)load(\"glColor4us\");\n\tglad_glColor4usv = (PFNGLCOLOR4USVPROC)load(\"glColor4usv\");\n\tglad_glEdgeFlag = (PFNGLEDGEFLAGPROC)load(\"glEdgeFlag\");\n\tglad_glEdgeFlagv = (PFNGLEDGEFLAGVPROC)load(\"glEdgeFlagv\");\n\tglad_glEnd = (PFNGLENDPROC)load(\"glEnd\");\n\tglad_glIndexd = (PFNGLINDEXDPROC)load(\"glIndexd\");\n\tglad_glIndexdv = (PFNGLINDEXDVPROC)load(\"glIndexdv\");\n\tglad_glIndexf = (PFNGLINDEXFPROC)load(\"glIndexf\");\n\tglad_glIndexfv = (PFNGLINDEXFVPROC)load(\"glIndexfv\");\n\tglad_glIndexi = (PFNGLINDEXIPROC)load(\"glIndexi\");\n\tglad_glIndexiv = (PFNGLINDEXIVPROC)load(\"glIndexiv\");\n\tglad_glIndexs = (PFNGLINDEXSPROC)load(\"glIndexs\");\n\tglad_glIndexsv = (PFNGLINDEXSVPROC)load(\"glIndexsv\");\n\tglad_glNormal3b = (PFNGLNORMAL3BPROC)load(\"glNormal3b\");\n\tglad_glNormal3bv = (PFNGLNORMAL3BVPROC)load(\"glNormal3bv\");\n\tglad_glNormal3d = (PFNGLNORMAL3DPROC)load(\"glNormal3d\");\n\tglad_glNormal3dv = (PFNGLNORMAL3DVPROC)load(\"glNormal3dv\");\n\tglad_glNormal3f = (PFNGLNORMAL3FPROC)load(\"glNormal3f\");\n\tglad_glNormal3fv = (PFNGLNORMAL3FVPROC)load(\"glNormal3fv\");\n\tglad_glNormal3i = (PFNGLNORMAL3IPROC)load(\"glNormal3i\");\n\tglad_glNormal3iv = (PFNGLNORMAL3IVPROC)load(\"glNormal3iv\");\n\tglad_glNormal3s = (PFNGLNORMAL3SPROC)load(\"glNormal3s\");\n\tglad_glNormal3sv = (PFNGLNORMAL3SVPROC)load(\"glNormal3sv\");\n\tglad_glRasterPos2d = (PFNGLRASTERPOS2DPROC)load(\"glRasterPos2d\");\n\tglad_glRasterPos2dv = (PFNGLRASTERPOS2DVPROC)load(\"glRasterPos2dv\");\n\tglad_glRasterPos2f = (PFNGLRASTERPOS2FPROC)load(\"glRasterPos2f\");\n\tglad_glRasterPos2fv = (PFNGLRASTERPOS2FVPROC)load(\"glRasterPos2fv\");\n\tglad_glRasterPos2i = (PFNGLRASTERPOS2IPROC)load(\"glRasterPos2i\");\n\tglad_glRasterPos2iv = (PFNGLRASTERPOS2IVPROC)load(\"glRasterPos2iv\");\n\tglad_glRasterPos2s = (PFNGLRASTERPOS2SPROC)load(\"glRasterPos2s\");\n\tglad_glRasterPos2sv = (PFNGLRASTERPOS2SVPROC)load(\"glRasterPos2sv\");\n\tglad_glRasterPos3d = (PFNGLRASTERPOS3DPROC)load(\"glRasterPos3d\");\n\tglad_glRasterPos3dv = (PFNGLRASTERPOS3DVPROC)load(\"glRasterPos3dv\");\n\tglad_glRasterPos3f = (PFNGLRASTERPOS3FPROC)load(\"glRasterPos3f\");\n\tglad_glRasterPos3fv = (PFNGLRASTERPOS3FVPROC)load(\"glRasterPos3fv\");\n\tglad_glRasterPos3i = (PFNGLRASTERPOS3IPROC)load(\"glRasterPos3i\");\n\tglad_glRasterPos3iv = (PFNGLRASTERPOS3IVPROC)load(\"glRasterPos3iv\");\n\tglad_glRasterPos3s = (PFNGLRASTERPOS3SPROC)load(\"glRasterPos3s\");\n\tglad_glRasterPos3sv = (PFNGLRASTERPOS3SVPROC)load(\"glRasterPos3sv\");\n\tglad_glRasterPos4d = (PFNGLRASTERPOS4DPROC)load(\"glRasterPos4d\");\n\tglad_glRasterPos4dv = (PFNGLRASTERPOS4DVPROC)load(\"glRasterPos4dv\");\n\tglad_glRasterPos4f = (PFNGLRASTERPOS4FPROC)load(\"glRasterPos4f\");\n\tglad_glRasterPos4fv = (PFNGLRASTERPOS4FVPROC)load(\"glRasterPos4fv\");\n\tglad_glRasterPos4i = (PFNGLRASTERPOS4IPROC)load(\"glRasterPos4i\");\n\tglad_glRasterPos4iv = (PFNGLRASTERPOS4IVPROC)load(\"glRasterPos4iv\");\n\tglad_glRasterPos4s = (PFNGLRASTERPOS4SPROC)load(\"glRasterPos4s\");\n\tglad_glRasterPos4sv = (PFNGLRASTERPOS4SVPROC)load(\"glRasterPos4sv\");\n\tglad_glRectd = (PFNGLRECTDPROC)load(\"glRectd\");\n\tglad_glRectdv = (PFNGLRECTDVPROC)load(\"glRectdv\");\n\tglad_glRectf = (PFNGLRECTFPROC)load(\"glRectf\");\n\tglad_glRectfv = (PFNGLRECTFVPROC)load(\"glRectfv\");\n\tglad_glRecti = (PFNGLRECTIPROC)load(\"glRecti\");\n\tglad_glRectiv = (PFNGLRECTIVPROC)load(\"glRectiv\");\n\tglad_glRects = (PFNGLRECTSPROC)load(\"glRects\");\n\tglad_glRectsv = (PFNGLRECTSVPROC)load(\"glRectsv\");\n\tglad_glTexCoord1d = (PFNGLTEXCOORD1DPROC)load(\"glTexCoord1d\");\n\tglad_glTexCoord1dv = (PFNGLTEXCOORD1DVPROC)load(\"glTexCoord1dv\");\n\tglad_glTexCoord1f = (PFNGLTEXCOORD1FPROC)load(\"glTexCoord1f\");\n\tglad_glTexCoord1fv = (PFNGLTEXCOORD1FVPROC)load(\"glTexCoord1fv\");\n\tglad_glTexCoord1i = (PFNGLTEXCOORD1IPROC)load(\"glTexCoord1i\");\n\tglad_glTexCoord1iv = (PFNGLTEXCOORD1IVPROC)load(\"glTexCoord1iv\");\n\tglad_glTexCoord1s = (PFNGLTEXCOORD1SPROC)load(\"glTexCoord1s\");\n\tglad_glTexCoord1sv = (PFNGLTEXCOORD1SVPROC)load(\"glTexCoord1sv\");\n\tglad_glTexCoord2d = (PFNGLTEXCOORD2DPROC)load(\"glTexCoord2d\");\n\tglad_glTexCoord2dv = (PFNGLTEXCOORD2DVPROC)load(\"glTexCoord2dv\");\n\tglad_glTexCoord2f = (PFNGLTEXCOORD2FPROC)load(\"glTexCoord2f\");\n\tglad_glTexCoord2fv = (PFNGLTEXCOORD2FVPROC)load(\"glTexCoord2fv\");\n\tglad_glTexCoord2i = (PFNGLTEXCOORD2IPROC)load(\"glTexCoord2i\");\n\tglad_glTexCoord2iv = (PFNGLTEXCOORD2IVPROC)load(\"glTexCoord2iv\");\n\tglad_glTexCoord2s = (PFNGLTEXCOORD2SPROC)load(\"glTexCoord2s\");\n\tglad_glTexCoord2sv = (PFNGLTEXCOORD2SVPROC)load(\"glTexCoord2sv\");\n\tglad_glTexCoord3d = (PFNGLTEXCOORD3DPROC)load(\"glTexCoord3d\");\n\tglad_glTexCoord3dv = (PFNGLTEXCOORD3DVPROC)load(\"glTexCoord3dv\");\n\tglad_glTexCoord3f = (PFNGLTEXCOORD3FPROC)load(\"glTexCoord3f\");\n\tglad_glTexCoord3fv = (PFNGLTEXCOORD3FVPROC)load(\"glTexCoord3fv\");\n\tglad_glTexCoord3i = (PFNGLTEXCOORD3IPROC)load(\"glTexCoord3i\");\n\tglad_glTexCoord3iv = (PFNGLTEXCOORD3IVPROC)load(\"glTexCoord3iv\");\n\tglad_glTexCoord3s = (PFNGLTEXCOORD3SPROC)load(\"glTexCoord3s\");\n\tglad_glTexCoord3sv = (PFNGLTEXCOORD3SVPROC)load(\"glTexCoord3sv\");\n\tglad_glTexCoord4d = (PFNGLTEXCOORD4DPROC)load(\"glTexCoord4d\");\n\tglad_glTexCoord4dv = (PFNGLTEXCOORD4DVPROC)load(\"glTexCoord4dv\");\n\tglad_glTexCoord4f = (PFNGLTEXCOORD4FPROC)load(\"glTexCoord4f\");\n\tglad_glTexCoord4fv = (PFNGLTEXCOORD4FVPROC)load(\"glTexCoord4fv\");\n\tglad_glTexCoord4i = (PFNGLTEXCOORD4IPROC)load(\"glTexCoord4i\");\n\tglad_glTexCoord4iv = (PFNGLTEXCOORD4IVPROC)load(\"glTexCoord4iv\");\n\tglad_glTexCoord4s = (PFNGLTEXCOORD4SPROC)load(\"glTexCoord4s\");\n\tglad_glTexCoord4sv = (PFNGLTEXCOORD4SVPROC)load(\"glTexCoord4sv\");\n\tglad_glVertex2d = (PFNGLVERTEX2DPROC)load(\"glVertex2d\");\n\tglad_glVertex2dv = (PFNGLVERTEX2DVPROC)load(\"glVertex2dv\");\n\tglad_glVertex2f = (PFNGLVERTEX2FPROC)load(\"glVertex2f\");\n\tglad_glVertex2fv = (PFNGLVERTEX2FVPROC)load(\"glVertex2fv\");\n\tglad_glVertex2i = (PFNGLVERTEX2IPROC)load(\"glVertex2i\");\n\tglad_glVertex2iv = (PFNGLVERTEX2IVPROC)load(\"glVertex2iv\");\n\tglad_glVertex2s = (PFNGLVERTEX2SPROC)load(\"glVertex2s\");\n\tglad_glVertex2sv = (PFNGLVERTEX2SVPROC)load(\"glVertex2sv\");\n\tglad_glVertex3d = (PFNGLVERTEX3DPROC)load(\"glVertex3d\");\n\tglad_glVertex3dv = (PFNGLVERTEX3DVPROC)load(\"glVertex3dv\");\n\tglad_glVertex3f = (PFNGLVERTEX3FPROC)load(\"glVertex3f\");\n\tglad_glVertex3fv = (PFNGLVERTEX3FVPROC)load(\"glVertex3fv\");\n\tglad_glVertex3i = (PFNGLVERTEX3IPROC)load(\"glVertex3i\");\n\tglad_glVertex3iv = (PFNGLVERTEX3IVPROC)load(\"glVertex3iv\");\n\tglad_glVertex3s = (PFNGLVERTEX3SPROC)load(\"glVertex3s\");\n\tglad_glVertex3sv = (PFNGLVERTEX3SVPROC)load(\"glVertex3sv\");\n\tglad_glVertex4d = (PFNGLVERTEX4DPROC)load(\"glVertex4d\");\n\tglad_glVertex4dv = (PFNGLVERTEX4DVPROC)load(\"glVertex4dv\");\n\tglad_glVertex4f = (PFNGLVERTEX4FPROC)load(\"glVertex4f\");\n\tglad_glVertex4fv = (PFNGLVERTEX4FVPROC)load(\"glVertex4fv\");\n\tglad_glVertex4i = (PFNGLVERTEX4IPROC)load(\"glVertex4i\");\n\tglad_glVertex4iv = (PFNGLVERTEX4IVPROC)load(\"glVertex4iv\");\n\tglad_glVertex4s = (PFNGLVERTEX4SPROC)load(\"glVertex4s\");\n\tglad_glVertex4sv = (PFNGLVERTEX4SVPROC)load(\"glVertex4sv\");\n\tglad_glClipPlane = (PFNGLCLIPPLANEPROC)load(\"glClipPlane\");\n\tglad_glColorMaterial = (PFNGLCOLORMATERIALPROC)load(\"glColorMaterial\");\n\tglad_glFogf = (PFNGLFOGFPROC)load(\"glFogf\");\n\tglad_glFogfv = (PFNGLFOGFVPROC)load(\"glFogfv\");\n\tglad_glFogi = (PFNGLFOGIPROC)load(\"glFogi\");\n\tglad_glFogiv = (PFNGLFOGIVPROC)load(\"glFogiv\");\n\tglad_glLightf = (PFNGLLIGHTFPROC)load(\"glLightf\");\n\tglad_glLightfv = (PFNGLLIGHTFVPROC)load(\"glLightfv\");\n\tglad_glLighti = (PFNGLLIGHTIPROC)load(\"glLighti\");\n\tglad_glLightiv = (PFNGLLIGHTIVPROC)load(\"glLightiv\");\n\tglad_glLightModelf = (PFNGLLIGHTMODELFPROC)load(\"glLightModelf\");\n\tglad_glLightModelfv = (PFNGLLIGHTMODELFVPROC)load(\"glLightModelfv\");\n\tglad_glLightModeli = (PFNGLLIGHTMODELIPROC)load(\"glLightModeli\");\n\tglad_glLightModeliv = (PFNGLLIGHTMODELIVPROC)load(\"glLightModeliv\");\n\tglad_glLineStipple = (PFNGLLINESTIPPLEPROC)load(\"glLineStipple\");\n\tglad_glMaterialf = (PFNGLMATERIALFPROC)load(\"glMaterialf\");\n\tglad_glMaterialfv = (PFNGLMATERIALFVPROC)load(\"glMaterialfv\");\n\tglad_glMateriali = (PFNGLMATERIALIPROC)load(\"glMateriali\");\n\tglad_glMaterialiv = (PFNGLMATERIALIVPROC)load(\"glMaterialiv\");\n\tglad_glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC)load(\"glPolygonStipple\");\n\tglad_glShadeModel = (PFNGLSHADEMODELPROC)load(\"glShadeModel\");\n\tglad_glTexEnvf = (PFNGLTEXENVFPROC)load(\"glTexEnvf\");\n\tglad_glTexEnvfv = (PFNGLTEXENVFVPROC)load(\"glTexEnvfv\");\n\tglad_glTexEnvi = (PFNGLTEXENVIPROC)load(\"glTexEnvi\");\n\tglad_glTexEnviv = (PFNGLTEXENVIVPROC)load(\"glTexEnviv\");\n\tglad_glTexGend = (PFNGLTEXGENDPROC)load(\"glTexGend\");\n\tglad_glTexGendv = (PFNGLTEXGENDVPROC)load(\"glTexGendv\");\n\tglad_glTexGenf = (PFNGLTEXGENFPROC)load(\"glTexGenf\");\n\tglad_glTexGenfv = (PFNGLTEXGENFVPROC)load(\"glTexGenfv\");\n\tglad_glTexGeni = (PFNGLTEXGENIPROC)load(\"glTexGeni\");\n\tglad_glTexGeniv = (PFNGLTEXGENIVPROC)load(\"glTexGeniv\");\n\tglad_glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC)load(\"glFeedbackBuffer\");\n\tglad_glSelectBuffer = (PFNGLSELECTBUFFERPROC)load(\"glSelectBuffer\");\n\tglad_glRenderMode = (PFNGLRENDERMODEPROC)load(\"glRenderMode\");\n\tglad_glInitNames = (PFNGLINITNAMESPROC)load(\"glInitNames\");\n\tglad_glLoadName = (PFNGLLOADNAMEPROC)load(\"glLoadName\");\n\tglad_glPassThrough = (PFNGLPASSTHROUGHPROC)load(\"glPassThrough\");\n\tglad_glPopName = (PFNGLPOPNAMEPROC)load(\"glPopName\");\n\tglad_glPushName = (PFNGLPUSHNAMEPROC)load(\"glPushName\");\n\tglad_glClearAccum = (PFNGLCLEARACCUMPROC)load(\"glClearAccum\");\n\tglad_glClearIndex = (PFNGLCLEARINDEXPROC)load(\"glClearIndex\");\n\tglad_glIndexMask = (PFNGLINDEXMASKPROC)load(\"glIndexMask\");\n\tglad_glAccum = (PFNGLACCUMPROC)load(\"glAccum\");\n\tglad_glPopAttrib = (PFNGLPOPATTRIBPROC)load(\"glPopAttrib\");\n\tglad_glPushAttrib = (PFNGLPUSHATTRIBPROC)load(\"glPushAttrib\");\n\tglad_glMap1d = (PFNGLMAP1DPROC)load(\"glMap1d\");\n\tglad_glMap1f = (PFNGLMAP1FPROC)load(\"glMap1f\");\n\tglad_glMap2d = (PFNGLMAP2DPROC)load(\"glMap2d\");\n\tglad_glMap2f = (PFNGLMAP2FPROC)load(\"glMap2f\");\n\tglad_glMapGrid1d = (PFNGLMAPGRID1DPROC)load(\"glMapGrid1d\");\n\tglad_glMapGrid1f = (PFNGLMAPGRID1FPROC)load(\"glMapGrid1f\");\n\tglad_glMapGrid2d = (PFNGLMAPGRID2DPROC)load(\"glMapGrid2d\");\n\tglad_glMapGrid2f = (PFNGLMAPGRID2FPROC)load(\"glMapGrid2f\");\n\tglad_glEvalCoord1d = (PFNGLEVALCOORD1DPROC)load(\"glEvalCoord1d\");\n\tglad_glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC)load(\"glEvalCoord1dv\");\n\tglad_glEvalCoord1f = (PFNGLEVALCOORD1FPROC)load(\"glEvalCoord1f\");\n\tglad_glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC)load(\"glEvalCoord1fv\");\n\tglad_glEvalCoord2d = (PFNGLEVALCOORD2DPROC)load(\"glEvalCoord2d\");\n\tglad_glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC)load(\"glEvalCoord2dv\");\n\tglad_glEvalCoord2f = (PFNGLEVALCOORD2FPROC)load(\"glEvalCoord2f\");\n\tglad_glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC)load(\"glEvalCoord2fv\");\n\tglad_glEvalMesh1 = (PFNGLEVALMESH1PROC)load(\"glEvalMesh1\");\n\tglad_glEvalPoint1 = (PFNGLEVALPOINT1PROC)load(\"glEvalPoint1\");\n\tglad_glEvalMesh2 = (PFNGLEVALMESH2PROC)load(\"glEvalMesh2\");\n\tglad_glEvalPoint2 = (PFNGLEVALPOINT2PROC)load(\"glEvalPoint2\");\n\tglad_glAlphaFunc = (PFNGLALPHAFUNCPROC)load(\"glAlphaFunc\");\n\tglad_glPixelZoom = (PFNGLPIXELZOOMPROC)load(\"glPixelZoom\");\n\tglad_glPixelTransferf = (PFNGLPIXELTRANSFERFPROC)load(\"glPixelTransferf\");\n\tglad_glPixelTransferi = (PFNGLPIXELTRANSFERIPROC)load(\"glPixelTransferi\");\n\tglad_glPixelMapfv = (PFNGLPIXELMAPFVPROC)load(\"glPixelMapfv\");\n\tglad_glPixelMapuiv = (PFNGLPIXELMAPUIVPROC)load(\"glPixelMapuiv\");\n\tglad_glPixelMapusv = (PFNGLPIXELMAPUSVPROC)load(\"glPixelMapusv\");\n\tglad_glCopyPixels = (PFNGLCOPYPIXELSPROC)load(\"glCopyPixels\");\n\tglad_glDrawPixels = (PFNGLDRAWPIXELSPROC)load(\"glDrawPixels\");\n\tglad_glGetClipPlane = (PFNGLGETCLIPPLANEPROC)load(\"glGetClipPlane\");\n\tglad_glGetLightfv = (PFNGLGETLIGHTFVPROC)load(\"glGetLightfv\");\n\tglad_glGetLightiv = (PFNGLGETLIGHTIVPROC)load(\"glGetLightiv\");\n\tglad_glGetMapdv = (PFNGLGETMAPDVPROC)load(\"glGetMapdv\");\n\tglad_glGetMapfv = (PFNGLGETMAPFVPROC)load(\"glGetMapfv\");\n\tglad_glGetMapiv = (PFNGLGETMAPIVPROC)load(\"glGetMapiv\");\n\tglad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC)load(\"glGetMaterialfv\");\n\tglad_glGetMaterialiv = (PFNGLGETMATERIALIVPROC)load(\"glGetMaterialiv\");\n\tglad_glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC)load(\"glGetPixelMapfv\");\n\tglad_glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC)load(\"glGetPixelMapuiv\");\n\tglad_glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC)load(\"glGetPixelMapusv\");\n\tglad_glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC)load(\"glGetPolygonStipple\");\n\tglad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC)load(\"glGetTexEnvfv\");\n\tglad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC)load(\"glGetTexEnviv\");\n\tglad_glGetTexGendv = (PFNGLGETTEXGENDVPROC)load(\"glGetTexGendv\");\n\tglad_glGetTexGenfv = (PFNGLGETTEXGENFVPROC)load(\"glGetTexGenfv\");\n\tglad_glGetTexGeniv = (PFNGLGETTEXGENIVPROC)load(\"glGetTexGeniv\");\n\tglad_glIsList = (PFNGLISLISTPROC)load(\"glIsList\");\n\tglad_glFrustum = (PFNGLFRUSTUMPROC)load(\"glFrustum\");\n\tglad_glLoadIdentity = (PFNGLLOADIDENTITYPROC)load(\"glLoadIdentity\");\n\tglad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC)load(\"glLoadMatrixf\");\n\tglad_glLoadMatrixd = (PFNGLLOADMATRIXDPROC)load(\"glLoadMatrixd\");\n\tglad_glMatrixMode = (PFNGLMATRIXMODEPROC)load(\"glMatrixMode\");\n\tglad_glMultMatrixf = (PFNGLMULTMATRIXFPROC)load(\"glMultMatrixf\");\n\tglad_glMultMatrixd = (PFNGLMULTMATRIXDPROC)load(\"glMultMatrixd\");\n\tglad_glOrtho = (PFNGLORTHOPROC)load(\"glOrtho\");\n\tglad_glPopMatrix = (PFNGLPOPMATRIXPROC)load(\"glPopMatrix\");\n\tglad_glPushMatrix = (PFNGLPUSHMATRIXPROC)load(\"glPushMatrix\");\n\tglad_glRotated = (PFNGLROTATEDPROC)load(\"glRotated\");\n\tglad_glRotatef = (PFNGLROTATEFPROC)load(\"glRotatef\");\n\tglad_glScaled = (PFNGLSCALEDPROC)load(\"glScaled\");\n\tglad_glScalef = (PFNGLSCALEFPROC)load(\"glScalef\");\n\tglad_glTranslated = (PFNGLTRANSLATEDPROC)load(\"glTranslated\");\n\tglad_glTranslatef = (PFNGLTRANSLATEFPROC)load(\"glTranslatef\");\n}\nstatic void load_GL_VERSION_1_1(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_1_1) return;\n\tglad_glDrawArrays = (PFNGLDRAWARRAYSPROC)load(\"glDrawArrays\");\n\tglad_glDrawElements = (PFNGLDRAWELEMENTSPROC)load(\"glDrawElements\");\n\tglad_glGetPointerv = (PFNGLGETPOINTERVPROC)load(\"glGetPointerv\");\n\tglad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC)load(\"glPolygonOffset\");\n\tglad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)load(\"glCopyTexImage1D\");\n\tglad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)load(\"glCopyTexImage2D\");\n\tglad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)load(\"glCopyTexSubImage1D\");\n\tglad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)load(\"glCopyTexSubImage2D\");\n\tglad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)load(\"glTexSubImage1D\");\n\tglad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)load(\"glTexSubImage2D\");\n\tglad_glBindTexture = (PFNGLBINDTEXTUREPROC)load(\"glBindTexture\");\n\tglad_glDeleteTextures = (PFNGLDELETETEXTURESPROC)load(\"glDeleteTextures\");\n\tglad_glGenTextures = (PFNGLGENTEXTURESPROC)load(\"glGenTextures\");\n\tglad_glIsTexture = (PFNGLISTEXTUREPROC)load(\"glIsTexture\");\n\tglad_glArrayElement = (PFNGLARRAYELEMENTPROC)load(\"glArrayElement\");\n\tglad_glColorPointer = (PFNGLCOLORPOINTERPROC)load(\"glColorPointer\");\n\tglad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC)load(\"glDisableClientState\");\n\tglad_glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC)load(\"glEdgeFlagPointer\");\n\tglad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC)load(\"glEnableClientState\");\n\tglad_glIndexPointer = (PFNGLINDEXPOINTERPROC)load(\"glIndexPointer\");\n\tglad_glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC)load(\"glInterleavedArrays\");\n\tglad_glNormalPointer = (PFNGLNORMALPOINTERPROC)load(\"glNormalPointer\");\n\tglad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC)load(\"glTexCoordPointer\");\n\tglad_glVertexPointer = (PFNGLVERTEXPOINTERPROC)load(\"glVertexPointer\");\n\tglad_glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC)load(\"glAreTexturesResident\");\n\tglad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC)load(\"glPrioritizeTextures\");\n\tglad_glIndexub = (PFNGLINDEXUBPROC)load(\"glIndexub\");\n\tglad_glIndexubv = (PFNGLINDEXUBVPROC)load(\"glIndexubv\");\n\tglad_glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC)load(\"glPopClientAttrib\");\n\tglad_glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC)load(\"glPushClientAttrib\");\n}\nstatic void load_GL_VERSION_1_2(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_1_2) return;\n\tglad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)load(\"glDrawRangeElements\");\n\tglad_glTexImage3D = (PFNGLTEXIMAGE3DPROC)load(\"glTexImage3D\");\n\tglad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)load(\"glTexSubImage3D\");\n\tglad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)load(\"glCopyTexSubImage3D\");\n}\nstatic void load_GL_VERSION_1_3(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_1_3) return;\n\tglad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)load(\"glActiveTexture\");\n\tglad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)load(\"glSampleCoverage\");\n\tglad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)load(\"glCompressedTexImage3D\");\n\tglad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)load(\"glCompressedTexImage2D\");\n\tglad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)load(\"glCompressedTexImage1D\");\n\tglad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)load(\"glCompressedTexSubImage3D\");\n\tglad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)load(\"glCompressedTexSubImage2D\");\n\tglad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)load(\"glCompressedTexSubImage1D\");\n\tglad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)load(\"glGetCompressedTexImage\");\n\tglad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)load(\"glClientActiveTexture\");\n\tglad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)load(\"glMultiTexCoord1d\");\n\tglad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)load(\"glMultiTexCoord1dv\");\n\tglad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)load(\"glMultiTexCoord1f\");\n\tglad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)load(\"glMultiTexCoord1fv\");\n\tglad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)load(\"glMultiTexCoord1i\");\n\tglad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)load(\"glMultiTexCoord1iv\");\n\tglad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)load(\"glMultiTexCoord1s\");\n\tglad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)load(\"glMultiTexCoord1sv\");\n\tglad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)load(\"glMultiTexCoord2d\");\n\tglad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)load(\"glMultiTexCoord2dv\");\n\tglad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)load(\"glMultiTexCoord2f\");\n\tglad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)load(\"glMultiTexCoord2fv\");\n\tglad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)load(\"glMultiTexCoord2i\");\n\tglad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)load(\"glMultiTexCoord2iv\");\n\tglad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)load(\"glMultiTexCoord2s\");\n\tglad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)load(\"glMultiTexCoord2sv\");\n\tglad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)load(\"glMultiTexCoord3d\");\n\tglad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)load(\"glMultiTexCoord3dv\");\n\tglad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)load(\"glMultiTexCoord3f\");\n\tglad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)load(\"glMultiTexCoord3fv\");\n\tglad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)load(\"glMultiTexCoord3i\");\n\tglad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)load(\"glMultiTexCoord3iv\");\n\tglad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)load(\"glMultiTexCoord3s\");\n\tglad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)load(\"glMultiTexCoord3sv\");\n\tglad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)load(\"glMultiTexCoord4d\");\n\tglad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)load(\"glMultiTexCoord4dv\");\n\tglad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)load(\"glMultiTexCoord4f\");\n\tglad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)load(\"glMultiTexCoord4fv\");\n\tglad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)load(\"glMultiTexCoord4i\");\n\tglad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)load(\"glMultiTexCoord4iv\");\n\tglad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)load(\"glMultiTexCoord4s\");\n\tglad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)load(\"glMultiTexCoord4sv\");\n\tglad_glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)load(\"glLoadTransposeMatrixf\");\n\tglad_glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)load(\"glLoadTransposeMatrixd\");\n\tglad_glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)load(\"glMultTransposeMatrixf\");\n\tglad_glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)load(\"glMultTransposeMatrixd\");\n}\nstatic void load_GL_VERSION_1_4(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_1_4) return;\n\tglad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)load(\"glBlendFuncSeparate\");\n\tglad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)load(\"glMultiDrawArrays\");\n\tglad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)load(\"glMultiDrawElements\");\n\tglad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC)load(\"glPointParameterf\");\n\tglad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)load(\"glPointParameterfv\");\n\tglad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC)load(\"glPointParameteri\");\n\tglad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)load(\"glPointParameteriv\");\n\tglad_glFogCoordf = (PFNGLFOGCOORDFPROC)load(\"glFogCoordf\");\n\tglad_glFogCoordfv = (PFNGLFOGCOORDFVPROC)load(\"glFogCoordfv\");\n\tglad_glFogCoordd = (PFNGLFOGCOORDDPROC)load(\"glFogCoordd\");\n\tglad_glFogCoorddv = (PFNGLFOGCOORDDVPROC)load(\"glFogCoorddv\");\n\tglad_glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)load(\"glFogCoordPointer\");\n\tglad_glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)load(\"glSecondaryColor3b\");\n\tglad_glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)load(\"glSecondaryColor3bv\");\n\tglad_glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)load(\"glSecondaryColor3d\");\n\tglad_glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)load(\"glSecondaryColor3dv\");\n\tglad_glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)load(\"glSecondaryColor3f\");\n\tglad_glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)load(\"glSecondaryColor3fv\");\n\tglad_glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)load(\"glSecondaryColor3i\");\n\tglad_glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)load(\"glSecondaryColor3iv\");\n\tglad_glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)load(\"glSecondaryColor3s\");\n\tglad_glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)load(\"glSecondaryColor3sv\");\n\tglad_glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)load(\"glSecondaryColor3ub\");\n\tglad_glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)load(\"glSecondaryColor3ubv\");\n\tglad_glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)load(\"glSecondaryColor3ui\");\n\tglad_glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)load(\"glSecondaryColor3uiv\");\n\tglad_glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)load(\"glSecondaryColor3us\");\n\tglad_glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)load(\"glSecondaryColor3usv\");\n\tglad_glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)load(\"glSecondaryColorPointer\");\n\tglad_glWindowPos2d = (PFNGLWINDOWPOS2DPROC)load(\"glWindowPos2d\");\n\tglad_glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)load(\"glWindowPos2dv\");\n\tglad_glWindowPos2f = (PFNGLWINDOWPOS2FPROC)load(\"glWindowPos2f\");\n\tglad_glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)load(\"glWindowPos2fv\");\n\tglad_glWindowPos2i = (PFNGLWINDOWPOS2IPROC)load(\"glWindowPos2i\");\n\tglad_glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)load(\"glWindowPos2iv\");\n\tglad_glWindowPos2s = (PFNGLWINDOWPOS2SPROC)load(\"glWindowPos2s\");\n\tglad_glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)load(\"glWindowPos2sv\");\n\tglad_glWindowPos3d = (PFNGLWINDOWPOS3DPROC)load(\"glWindowPos3d\");\n\tglad_glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)load(\"glWindowPos3dv\");\n\tglad_glWindowPos3f = (PFNGLWINDOWPOS3FPROC)load(\"glWindowPos3f\");\n\tglad_glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)load(\"glWindowPos3fv\");\n\tglad_glWindowPos3i = (PFNGLWINDOWPOS3IPROC)load(\"glWindowPos3i\");\n\tglad_glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)load(\"glWindowPos3iv\");\n\tglad_glWindowPos3s = (PFNGLWINDOWPOS3SPROC)load(\"glWindowPos3s\");\n\tglad_glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)load(\"glWindowPos3sv\");\n\tglad_glBlendColor = (PFNGLBLENDCOLORPROC)load(\"glBlendColor\");\n\tglad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)load(\"glBlendEquation\");\n}\nstatic void load_GL_VERSION_1_5(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_1_5) return;\n\tglad_glGenQueries = (PFNGLGENQUERIESPROC)load(\"glGenQueries\");\n\tglad_glDeleteQueries = (PFNGLDELETEQUERIESPROC)load(\"glDeleteQueries\");\n\tglad_glIsQuery = (PFNGLISQUERYPROC)load(\"glIsQuery\");\n\tglad_glBeginQuery = (PFNGLBEGINQUERYPROC)load(\"glBeginQuery\");\n\tglad_glEndQuery = (PFNGLENDQUERYPROC)load(\"glEndQuery\");\n\tglad_glGetQueryiv = (PFNGLGETQUERYIVPROC)load(\"glGetQueryiv\");\n\tglad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)load(\"glGetQueryObjectiv\");\n\tglad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)load(\"glGetQueryObjectuiv\");\n\tglad_glBindBuffer = (PFNGLBINDBUFFERPROC)load(\"glBindBuffer\");\n\tglad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)load(\"glDeleteBuffers\");\n\tglad_glGenBuffers = (PFNGLGENBUFFERSPROC)load(\"glGenBuffers\");\n\tglad_glIsBuffer = (PFNGLISBUFFERPROC)load(\"glIsBuffer\");\n\tglad_glBufferData = (PFNGLBUFFERDATAPROC)load(\"glBufferData\");\n\tglad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)load(\"glBufferSubData\");\n\tglad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)load(\"glGetBufferSubData\");\n\tglad_glMapBuffer = (PFNGLMAPBUFFERPROC)load(\"glMapBuffer\");\n\tglad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)load(\"glUnmapBuffer\");\n\tglad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)load(\"glGetBufferParameteriv\");\n\tglad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)load(\"glGetBufferPointerv\");\n}\nstatic void load_GL_VERSION_2_0(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_2_0) return;\n\tglad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)load(\"glBlendEquationSeparate\");\n\tglad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC)load(\"glDrawBuffers\");\n\tglad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)load(\"glStencilOpSeparate\");\n\tglad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)load(\"glStencilFuncSeparate\");\n\tglad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)load(\"glStencilMaskSeparate\");\n\tglad_glAttachShader = (PFNGLATTACHSHADERPROC)load(\"glAttachShader\");\n\tglad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)load(\"glBindAttribLocation\");\n\tglad_glCompileShader = (PFNGLCOMPILESHADERPROC)load(\"glCompileShader\");\n\tglad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)load(\"glCreateProgram\");\n\tglad_glCreateShader = (PFNGLCREATESHADERPROC)load(\"glCreateShader\");\n\tglad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC)load(\"glDeleteProgram\");\n\tglad_glDeleteShader = (PFNGLDELETESHADERPROC)load(\"glDeleteShader\");\n\tglad_glDetachShader = (PFNGLDETACHSHADERPROC)load(\"glDetachShader\");\n\tglad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)load(\"glDisableVertexAttribArray\");\n\tglad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)load(\"glEnableVertexAttribArray\");\n\tglad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)load(\"glGetActiveAttrib\");\n\tglad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)load(\"glGetActiveUniform\");\n\tglad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)load(\"glGetAttachedShaders\");\n\tglad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)load(\"glGetAttribLocation\");\n\tglad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC)load(\"glGetProgramiv\");\n\tglad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)load(\"glGetProgramInfoLog\");\n\tglad_glGetShaderiv = (PFNGLGETSHADERIVPROC)load(\"glGetShaderiv\");\n\tglad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)load(\"glGetShaderInfoLog\");\n\tglad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)load(\"glGetShaderSource\");\n\tglad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)load(\"glGetUniformLocation\");\n\tglad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)load(\"glGetUniformfv\");\n\tglad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)load(\"glGetUniformiv\");\n\tglad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)load(\"glGetVertexAttribdv\");\n\tglad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)load(\"glGetVertexAttribfv\");\n\tglad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)load(\"glGetVertexAttribiv\");\n\tglad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)load(\"glGetVertexAttribPointerv\");\n\tglad_glIsProgram = (PFNGLISPROGRAMPROC)load(\"glIsProgram\");\n\tglad_glIsShader = (PFNGLISSHADERPROC)load(\"glIsShader\");\n\tglad_glLinkProgram = (PFNGLLINKPROGRAMPROC)load(\"glLinkProgram\");\n\tglad_glShaderSource = (PFNGLSHADERSOURCEPROC)load(\"glShaderSource\");\n\tglad_glUseProgram = (PFNGLUSEPROGRAMPROC)load(\"glUseProgram\");\n\tglad_glUniform1f = (PFNGLUNIFORM1FPROC)load(\"glUniform1f\");\n\tglad_glUniform2f = (PFNGLUNIFORM2FPROC)load(\"glUniform2f\");\n\tglad_glUniform3f = (PFNGLUNIFORM3FPROC)load(\"glUniform3f\");\n\tglad_glUniform4f = (PFNGLUNIFORM4FPROC)load(\"glUniform4f\");\n\tglad_glUniform1i = (PFNGLUNIFORM1IPROC)load(\"glUniform1i\");\n\tglad_glUniform2i = (PFNGLUNIFORM2IPROC)load(\"glUniform2i\");\n\tglad_glUniform3i = (PFNGLUNIFORM3IPROC)load(\"glUniform3i\");\n\tglad_glUniform4i = (PFNGLUNIFORM4IPROC)load(\"glUniform4i\");\n\tglad_glUniform1fv = (PFNGLUNIFORM1FVPROC)load(\"glUniform1fv\");\n\tglad_glUniform2fv = (PFNGLUNIFORM2FVPROC)load(\"glUniform2fv\");\n\tglad_glUniform3fv = (PFNGLUNIFORM3FVPROC)load(\"glUniform3fv\");\n\tglad_glUniform4fv = (PFNGLUNIFORM4FVPROC)load(\"glUniform4fv\");\n\tglad_glUniform1iv = (PFNGLUNIFORM1IVPROC)load(\"glUniform1iv\");\n\tglad_glUniform2iv = (PFNGLUNIFORM2IVPROC)load(\"glUniform2iv\");\n\tglad_glUniform3iv = (PFNGLUNIFORM3IVPROC)load(\"glUniform3iv\");\n\tglad_glUniform4iv = (PFNGLUNIFORM4IVPROC)load(\"glUniform4iv\");\n\tglad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)load(\"glUniformMatrix2fv\");\n\tglad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)load(\"glUniformMatrix3fv\");\n\tglad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)load(\"glUniformMatrix4fv\");\n\tglad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)load(\"glValidateProgram\");\n\tglad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)load(\"glVertexAttrib1d\");\n\tglad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)load(\"glVertexAttrib1dv\");\n\tglad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)load(\"glVertexAttrib1f\");\n\tglad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)load(\"glVertexAttrib1fv\");\n\tglad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)load(\"glVertexAttrib1s\");\n\tglad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)load(\"glVertexAttrib1sv\");\n\tglad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)load(\"glVertexAttrib2d\");\n\tglad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)load(\"glVertexAttrib2dv\");\n\tglad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)load(\"glVertexAttrib2f\");\n\tglad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)load(\"glVertexAttrib2fv\");\n\tglad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)load(\"glVertexAttrib2s\");\n\tglad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)load(\"glVertexAttrib2sv\");\n\tglad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)load(\"glVertexAttrib3d\");\n\tglad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)load(\"glVertexAttrib3dv\");\n\tglad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)load(\"glVertexAttrib3f\");\n\tglad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)load(\"glVertexAttrib3fv\");\n\tglad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)load(\"glVertexAttrib3s\");\n\tglad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)load(\"glVertexAttrib3sv\");\n\tglad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)load(\"glVertexAttrib4Nbv\");\n\tglad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)load(\"glVertexAttrib4Niv\");\n\tglad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)load(\"glVertexAttrib4Nsv\");\n\tglad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)load(\"glVertexAttrib4Nub\");\n\tglad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)load(\"glVertexAttrib4Nubv\");\n\tglad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)load(\"glVertexAttrib4Nuiv\");\n\tglad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)load(\"glVertexAttrib4Nusv\");\n\tglad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)load(\"glVertexAttrib4bv\");\n\tglad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)load(\"glVertexAttrib4d\");\n\tglad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)load(\"glVertexAttrib4dv\");\n\tglad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)load(\"glVertexAttrib4f\");\n\tglad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)load(\"glVertexAttrib4fv\");\n\tglad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)load(\"glVertexAttrib4iv\");\n\tglad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)load(\"glVertexAttrib4s\");\n\tglad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)load(\"glVertexAttrib4sv\");\n\tglad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)load(\"glVertexAttrib4ubv\");\n\tglad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)load(\"glVertexAttrib4uiv\");\n\tglad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)load(\"glVertexAttrib4usv\");\n\tglad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)load(\"glVertexAttribPointer\");\n}\nstatic void load_GL_VERSION_2_1(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_2_1) return;\n\tglad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)load(\"glUniformMatrix2x3fv\");\n\tglad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)load(\"glUniformMatrix3x2fv\");\n\tglad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)load(\"glUniformMatrix2x4fv\");\n\tglad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)load(\"glUniformMatrix4x2fv\");\n\tglad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)load(\"glUniformMatrix3x4fv\");\n\tglad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)load(\"glUniformMatrix4x3fv\");\n}\nstatic void load_GL_VERSION_3_0(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_3_0) return;\n\tglad_glColorMaski = (PFNGLCOLORMASKIPROC)load(\"glColorMaski\");\n\tglad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)load(\"glGetBooleani_v\");\n\tglad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load(\"glGetIntegeri_v\");\n\tglad_glEnablei = (PFNGLENABLEIPROC)load(\"glEnablei\");\n\tglad_glDisablei = (PFNGLDISABLEIPROC)load(\"glDisablei\");\n\tglad_glIsEnabledi = (PFNGLISENABLEDIPROC)load(\"glIsEnabledi\");\n\tglad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)load(\"glBeginTransformFeedback\");\n\tglad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)load(\"glEndTransformFeedback\");\n\tglad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load(\"glBindBufferRange\");\n\tglad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load(\"glBindBufferBase\");\n\tglad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)load(\"glTransformFeedbackVaryings\");\n\tglad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)load(\"glGetTransformFeedbackVarying\");\n\tglad_glClampColor = (PFNGLCLAMPCOLORPROC)load(\"glClampColor\");\n\tglad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)load(\"glBeginConditionalRender\");\n\tglad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)load(\"glEndConditionalRender\");\n\tglad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)load(\"glVertexAttribIPointer\");\n\tglad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)load(\"glGetVertexAttribIiv\");\n\tglad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)load(\"glGetVertexAttribIuiv\");\n\tglad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)load(\"glVertexAttribI1i\");\n\tglad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)load(\"glVertexAttribI2i\");\n\tglad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)load(\"glVertexAttribI3i\");\n\tglad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)load(\"glVertexAttribI4i\");\n\tglad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)load(\"glVertexAttribI1ui\");\n\tglad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)load(\"glVertexAttribI2ui\");\n\tglad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)load(\"glVertexAttribI3ui\");\n\tglad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)load(\"glVertexAttribI4ui\");\n\tglad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)load(\"glVertexAttribI1iv\");\n\tglad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)load(\"glVertexAttribI2iv\");\n\tglad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)load(\"glVertexAttribI3iv\");\n\tglad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)load(\"glVertexAttribI4iv\");\n\tglad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)load(\"glVertexAttribI1uiv\");\n\tglad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)load(\"glVertexAttribI2uiv\");\n\tglad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)load(\"glVertexAttribI3uiv\");\n\tglad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)load(\"glVertexAttribI4uiv\");\n\tglad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)load(\"glVertexAttribI4bv\");\n\tglad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)load(\"glVertexAttribI4sv\");\n\tglad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)load(\"glVertexAttribI4ubv\");\n\tglad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)load(\"glVertexAttribI4usv\");\n\tglad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)load(\"glGetUniformuiv\");\n\tglad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)load(\"glBindFragDataLocation\");\n\tglad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)load(\"glGetFragDataLocation\");\n\tglad_glUniform1ui = (PFNGLUNIFORM1UIPROC)load(\"glUniform1ui\");\n\tglad_glUniform2ui = (PFNGLUNIFORM2UIPROC)load(\"glUniform2ui\");\n\tglad_glUniform3ui = (PFNGLUNIFORM3UIPROC)load(\"glUniform3ui\");\n\tglad_glUniform4ui = (PFNGLUNIFORM4UIPROC)load(\"glUniform4ui\");\n\tglad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC)load(\"glUniform1uiv\");\n\tglad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC)load(\"glUniform2uiv\");\n\tglad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC)load(\"glUniform3uiv\");\n\tglad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC)load(\"glUniform4uiv\");\n\tglad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)load(\"glTexParameterIiv\");\n\tglad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)load(\"glTexParameterIuiv\");\n\tglad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)load(\"glGetTexParameterIiv\");\n\tglad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)load(\"glGetTexParameterIuiv\");\n\tglad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)load(\"glClearBufferiv\");\n\tglad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)load(\"glClearBufferuiv\");\n\tglad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)load(\"glClearBufferfv\");\n\tglad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)load(\"glClearBufferfi\");\n\tglad_glGetStringi = (PFNGLGETSTRINGIPROC)load(\"glGetStringi\");\n\tglad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)load(\"glIsRenderbuffer\");\n\tglad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)load(\"glBindRenderbuffer\");\n\tglad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)load(\"glDeleteRenderbuffers\");\n\tglad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)load(\"glGenRenderbuffers\");\n\tglad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)load(\"glRenderbufferStorage\");\n\tglad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)load(\"glGetRenderbufferParameteriv\");\n\tglad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)load(\"glIsFramebuffer\");\n\tglad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)load(\"glBindFramebuffer\");\n\tglad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)load(\"glDeleteFramebuffers\");\n\tglad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)load(\"glGenFramebuffers\");\n\tglad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)load(\"glCheckFramebufferStatus\");\n\tglad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)load(\"glFramebufferTexture1D\");\n\tglad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)load(\"glFramebufferTexture2D\");\n\tglad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)load(\"glFramebufferTexture3D\");\n\tglad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)load(\"glFramebufferRenderbuffer\");\n\tglad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)load(\"glGetFramebufferAttachmentParameteriv\");\n\tglad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)load(\"glGenerateMipmap\");\n\tglad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)load(\"glBlitFramebuffer\");\n\tglad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)load(\"glRenderbufferStorageMultisample\");\n\tglad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)load(\"glFramebufferTextureLayer\");\n\tglad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)load(\"glMapBufferRange\");\n\tglad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)load(\"glFlushMappedBufferRange\");\n\tglad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)load(\"glBindVertexArray\");\n\tglad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)load(\"glDeleteVertexArrays\");\n\tglad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)load(\"glGenVertexArrays\");\n\tglad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC)load(\"glIsVertexArray\");\n}\nstatic void load_GL_VERSION_3_1(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_3_1) return;\n\tglad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)load(\"glDrawArraysInstanced\");\n\tglad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)load(\"glDrawElementsInstanced\");\n\tglad_glTexBuffer = (PFNGLTEXBUFFERPROC)load(\"glTexBuffer\");\n\tglad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)load(\"glPrimitiveRestartIndex\");\n\tglad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)load(\"glCopyBufferSubData\");\n\tglad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)load(\"glGetUniformIndices\");\n\tglad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)load(\"glGetActiveUniformsiv\");\n\tglad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)load(\"glGetActiveUniformName\");\n\tglad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)load(\"glGetUniformBlockIndex\");\n\tglad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)load(\"glGetActiveUniformBlockiv\");\n\tglad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)load(\"glGetActiveUniformBlockName\");\n\tglad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)load(\"glUniformBlockBinding\");\n\tglad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load(\"glBindBufferRange\");\n\tglad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load(\"glBindBufferBase\");\n\tglad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load(\"glGetIntegeri_v\");\n}\nstatic void load_GL_VERSION_3_2(GLADloadproc load) {\n\tif(!GLAD_GL_VERSION_3_2) return;\n\tglad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)load(\"glDrawElementsBaseVertex\");\n\tglad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)load(\"glDrawRangeElementsBaseVertex\");\n\tglad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)load(\"glDrawElementsInstancedBaseVertex\");\n\tglad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)load(\"glMultiDrawElementsBaseVertex\");\n\tglad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)load(\"glProvokingVertex\");\n\tglad_glFenceSync = (PFNGLFENCESYNCPROC)load(\"glFenceSync\");\n\tglad_glIsSync = (PFNGLISSYNCPROC)load(\"glIsSync\");\n\tglad_glDeleteSync = (PFNGLDELETESYNCPROC)load(\"glDeleteSync\");\n\tglad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)load(\"glClientWaitSync\");\n\tglad_glWaitSync = (PFNGLWAITSYNCPROC)load(\"glWaitSync\");\n\tglad_glGetInteger64v = (PFNGLGETINTEGER64VPROC)load(\"glGetInteger64v\");\n\tglad_glGetSynciv = (PFNGLGETSYNCIVPROC)load(\"glGetSynciv\");\n\tglad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)load(\"glGetInteger64i_v\");\n\tglad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)load(\"glGetBufferParameteri64v\");\n\tglad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)load(\"glFramebufferTexture\");\n\tglad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)load(\"glTexImage2DMultisample\");\n\tglad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)load(\"glTexImage3DMultisample\");\n\tglad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)load(\"glGetMultisamplefv\");\n\tglad_glSampleMaski = (PFNGLSAMPLEMASKIPROC)load(\"glSampleMaski\");\n}\nstatic void load_GL_ARB_multisample(GLADloadproc load) {\n\tif(!GLAD_GL_ARB_multisample) return;\n\tglad_glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)load(\"glSampleCoverageARB\");\n}\nstatic void load_GL_ARB_robustness(GLADloadproc load) {\n\tif(!GLAD_GL_ARB_robustness) return;\n\tglad_glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)load(\"glGetGraphicsResetStatusARB\");\n\tglad_glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)load(\"glGetnTexImageARB\");\n\tglad_glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)load(\"glReadnPixelsARB\");\n\tglad_glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)load(\"glGetnCompressedTexImageARB\");\n\tglad_glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)load(\"glGetnUniformfvARB\");\n\tglad_glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)load(\"glGetnUniformivARB\");\n\tglad_glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)load(\"glGetnUniformuivARB\");\n\tglad_glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)load(\"glGetnUniformdvARB\");\n\tglad_glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)load(\"glGetnMapdvARB\");\n\tglad_glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)load(\"glGetnMapfvARB\");\n\tglad_glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)load(\"glGetnMapivARB\");\n\tglad_glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)load(\"glGetnPixelMapfvARB\");\n\tglad_glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)load(\"glGetnPixelMapuivARB\");\n\tglad_glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)load(\"glGetnPixelMapusvARB\");\n\tglad_glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)load(\"glGetnPolygonStippleARB\");\n\tglad_glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)load(\"glGetnColorTableARB\");\n\tglad_glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)load(\"glGetnConvolutionFilterARB\");\n\tglad_glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)load(\"glGetnSeparableFilterARB\");\n\tglad_glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)load(\"glGetnHistogramARB\");\n\tglad_glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)load(\"glGetnMinmaxARB\");\n}\nstatic void load_GL_KHR_debug(GLADloadproc load) {\n\tif(!GLAD_GL_KHR_debug) return;\n\tglad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)load(\"glDebugMessageControl\");\n\tglad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)load(\"glDebugMessageInsert\");\n\tglad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)load(\"glDebugMessageCallback\");\n\tglad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)load(\"glGetDebugMessageLog\");\n\tglad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)load(\"glPushDebugGroup\");\n\tglad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)load(\"glPopDebugGroup\");\n\tglad_glObjectLabel = (PFNGLOBJECTLABELPROC)load(\"glObjectLabel\");\n\tglad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)load(\"glGetObjectLabel\");\n\tglad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)load(\"glObjectPtrLabel\");\n\tglad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)load(\"glGetObjectPtrLabel\");\n\tglad_glGetPointerv = (PFNGLGETPOINTERVPROC)load(\"glGetPointerv\");\n\tglad_glDebugMessageControlKHR = (PFNGLDEBUGMESSAGECONTROLKHRPROC)load(\"glDebugMessageControlKHR\");\n\tglad_glDebugMessageInsertKHR = (PFNGLDEBUGMESSAGEINSERTKHRPROC)load(\"glDebugMessageInsertKHR\");\n\tglad_glDebugMessageCallbackKHR = (PFNGLDEBUGMESSAGECALLBACKKHRPROC)load(\"glDebugMessageCallbackKHR\");\n\tglad_glGetDebugMessageLogKHR = (PFNGLGETDEBUGMESSAGELOGKHRPROC)load(\"glGetDebugMessageLogKHR\");\n\tglad_glPushDebugGroupKHR = (PFNGLPUSHDEBUGGROUPKHRPROC)load(\"glPushDebugGroupKHR\");\n\tglad_glPopDebugGroupKHR = (PFNGLPOPDEBUGGROUPKHRPROC)load(\"glPopDebugGroupKHR\");\n\tglad_glObjectLabelKHR = (PFNGLOBJECTLABELKHRPROC)load(\"glObjectLabelKHR\");\n\tglad_glGetObjectLabelKHR = (PFNGLGETOBJECTLABELKHRPROC)load(\"glGetObjectLabelKHR\");\n\tglad_glObjectPtrLabelKHR = (PFNGLOBJECTPTRLABELKHRPROC)load(\"glObjectPtrLabelKHR\");\n\tglad_glGetObjectPtrLabelKHR = (PFNGLGETOBJECTPTRLABELKHRPROC)load(\"glGetObjectPtrLabelKHR\");\n\tglad_glGetPointervKHR = (PFNGLGETPOINTERVKHRPROC)load(\"glGetPointervKHR\");\n}\nstatic int find_extensionsGL(void) {\n\tif (!get_exts()) return 0;\n\tGLAD_GL_ARB_multisample = has_ext(\"GL_ARB_multisample\");\n\tGLAD_GL_ARB_robustness = has_ext(\"GL_ARB_robustness\");\n\tGLAD_GL_KHR_debug = has_ext(\"GL_KHR_debug\");\n\tfree_exts();\n\treturn 1;\n}\n\nstatic void find_coreGL(void) {\n\n    /* Thank you @elmindreda\n     * https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176\n     * https://github.com/glfw/glfw/blob/master/src/context.c#L36\n     */\n    int i, major, minor;\n\n    const char* version;\n    const char* prefixes[] = {\n        \"OpenGL ES-CM \",\n        \"OpenGL ES-CL \",\n        \"OpenGL ES \",\n        NULL\n    };\n\n    version = (const char*) glGetString(GL_VERSION);\n    if (!version) return;\n\n    for (i = 0;  prefixes[i];  i++) {\n        const size_t length = strlen(prefixes[i]);\n        if (strncmp(version, prefixes[i], length) == 0) {\n            version += length;\n            break;\n        }\n    }\n\n/* PR #18 */\n#ifdef _MSC_VER\n    sscanf_s(version, \"%d.%d\", &major, &minor);\n#else\n    sscanf(version, \"%d.%d\", &major, &minor);\n#endif\n\n    GLVersion.major = major; GLVersion.minor = minor;\n    max_loaded_major = major; max_loaded_minor = minor;\n\tGLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;\n\tGLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;\n\tGLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;\n\tGLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;\n\tGLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;\n\tGLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1;\n\tGLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2;\n\tGLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2;\n\tGLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3;\n\tGLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3;\n\tGLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3;\n\tif (GLVersion.major > 3 || (GLVersion.major >= 3 && GLVersion.minor >= 2)) {\n\t\tmax_loaded_major = 3;\n\t\tmax_loaded_minor = 2;\n\t}\n}\n\nint gladLoadGLLoader(GLADloadproc load) {\n\tGLVersion.major = 0; GLVersion.minor = 0;\n\tglGetString = (PFNGLGETSTRINGPROC)load(\"glGetString\");\n\tif(glGetString == NULL) return 0;\n\tif(glGetString(GL_VERSION) == NULL) return 0;\n\tfind_coreGL();\n\tload_GL_VERSION_1_0(load);\n\tload_GL_VERSION_1_1(load);\n\tload_GL_VERSION_1_2(load);\n\tload_GL_VERSION_1_3(load);\n\tload_GL_VERSION_1_4(load);\n\tload_GL_VERSION_1_5(load);\n\tload_GL_VERSION_2_0(load);\n\tload_GL_VERSION_2_1(load);\n\tload_GL_VERSION_3_0(load);\n\tload_GL_VERSION_3_1(load);\n\tload_GL_VERSION_3_2(load);\n\n\tif (!find_extensionsGL()) return 0;\n\tload_GL_ARB_multisample(load);\n\tload_GL_ARB_robustness(load);\n\tload_GL_KHR_debug(load);\n\treturn GLVersion.major != 0 || GLVersion.minor != 0;\n}\n\n"
  },
  {
    "path": "external/GLFW/deps/linmath.h",
    "content": "#ifndef LINMATH_H\n#define LINMATH_H\n\n#include <math.h>\n\n#ifdef _MSC_VER\n#define inline __inline\n#endif\n\n#define LINMATH_H_DEFINE_VEC(n) \\\ntypedef float vec##n[n]; \\\nstatic inline void vec##n##_add(vec##n r, vec##n const a, vec##n const b) \\\n{ \\\n\tint i; \\\n\tfor(i=0; i<n; ++i) \\\n\t\tr[i] = a[i] + b[i]; \\\n} \\\nstatic inline void vec##n##_sub(vec##n r, vec##n const a, vec##n const b) \\\n{ \\\n\tint i; \\\n\tfor(i=0; i<n; ++i) \\\n\t\tr[i] = a[i] - b[i]; \\\n} \\\nstatic inline void vec##n##_scale(vec##n r, vec##n const v, float const s) \\\n{ \\\n\tint i; \\\n\tfor(i=0; i<n; ++i) \\\n\t\tr[i] = v[i] * s; \\\n} \\\nstatic inline float vec##n##_mul_inner(vec##n const a, vec##n const b) \\\n{ \\\n\tfloat p = 0.; \\\n\tint i; \\\n\tfor(i=0; i<n; ++i) \\\n\t\tp += b[i]*a[i]; \\\n\treturn p; \\\n} \\\nstatic inline float vec##n##_len(vec##n const v) \\\n{ \\\n\treturn (float) sqrt(vec##n##_mul_inner(v,v)); \\\n} \\\nstatic inline void vec##n##_norm(vec##n r, vec##n const v) \\\n{ \\\n\tfloat k = 1.f / vec##n##_len(v); \\\n\tvec##n##_scale(r, v, k); \\\n}\n\nLINMATH_H_DEFINE_VEC(2)\nLINMATH_H_DEFINE_VEC(3)\nLINMATH_H_DEFINE_VEC(4)\n\nstatic inline void vec3_mul_cross(vec3 r, vec3 const a, vec3 const b)\n{\n\tr[0] = a[1]*b[2] - a[2]*b[1];\n\tr[1] = a[2]*b[0] - a[0]*b[2];\n\tr[2] = a[0]*b[1] - a[1]*b[0];\n}\n\nstatic inline void vec3_reflect(vec3 r, vec3 const v, vec3 const n)\n{\n\tfloat p  = 2.f*vec3_mul_inner(v, n);\n\tint i;\n\tfor(i=0;i<3;++i)\n\t\tr[i] = v[i] - p*n[i];\n}\n\nstatic inline void vec4_mul_cross(vec4 r, vec4 a, vec4 b)\n{\n\tr[0] = a[1]*b[2] - a[2]*b[1];\n\tr[1] = a[2]*b[0] - a[0]*b[2];\n\tr[2] = a[0]*b[1] - a[1]*b[0];\n\tr[3] = 1.f;\n}\n\nstatic inline void vec4_reflect(vec4 r, vec4 v, vec4 n)\n{\n\tfloat p  = 2.f*vec4_mul_inner(v, n);\n\tint i;\n\tfor(i=0;i<4;++i)\n\t\tr[i] = v[i] - p*n[i];\n}\n\ntypedef vec4 mat4x4[4];\nstatic inline void mat4x4_identity(mat4x4 M)\n{\n\tint i, j;\n\tfor(i=0; i<4; ++i)\n\t\tfor(j=0; j<4; ++j)\n\t\t\tM[i][j] = i==j ? 1.f : 0.f;\n}\nstatic inline void mat4x4_dup(mat4x4 M, mat4x4 N)\n{\n\tint i, j;\n\tfor(i=0; i<4; ++i)\n\t\tfor(j=0; j<4; ++j)\n\t\t\tM[i][j] = N[i][j];\n}\nstatic inline void mat4x4_row(vec4 r, mat4x4 M, int i)\n{\n\tint k;\n\tfor(k=0; k<4; ++k)\n\t\tr[k] = M[k][i];\n}\nstatic inline void mat4x4_col(vec4 r, mat4x4 M, int i)\n{\n\tint k;\n\tfor(k=0; k<4; ++k)\n\t\tr[k] = M[i][k];\n}\nstatic inline void mat4x4_transpose(mat4x4 M, mat4x4 N)\n{\n\tint i, j;\n\tfor(j=0; j<4; ++j)\n\t\tfor(i=0; i<4; ++i)\n\t\t\tM[i][j] = N[j][i];\n}\nstatic inline void mat4x4_add(mat4x4 M, mat4x4 a, mat4x4 b)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tvec4_add(M[i], a[i], b[i]);\n}\nstatic inline void mat4x4_sub(mat4x4 M, mat4x4 a, mat4x4 b)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tvec4_sub(M[i], a[i], b[i]);\n}\nstatic inline void mat4x4_scale(mat4x4 M, mat4x4 a, float k)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tvec4_scale(M[i], a[i], k);\n}\nstatic inline void mat4x4_scale_aniso(mat4x4 M, mat4x4 a, float x, float y, float z)\n{\n\tint i;\n\tvec4_scale(M[0], a[0], x);\n\tvec4_scale(M[1], a[1], y);\n\tvec4_scale(M[2], a[2], z);\n\tfor(i = 0; i < 4; ++i) {\n\t\tM[3][i] = a[3][i];\n\t}\n}\nstatic inline void mat4x4_mul(mat4x4 M, mat4x4 a, mat4x4 b)\n{\n\tmat4x4 temp;\n\tint k, r, c;\n\tfor(c=0; c<4; ++c) for(r=0; r<4; ++r) {\n\t\ttemp[c][r] = 0.f;\n\t\tfor(k=0; k<4; ++k)\n\t\t\ttemp[c][r] += a[k][r] * b[c][k];\n\t}\n\tmat4x4_dup(M, temp);\n}\nstatic inline void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)\n{\n\tint i, j;\n\tfor(j=0; j<4; ++j) {\n\t\tr[j] = 0.f;\n\t\tfor(i=0; i<4; ++i)\n\t\t\tr[j] += M[i][j] * v[i];\n\t}\n}\nstatic inline void mat4x4_translate(mat4x4 T, float x, float y, float z)\n{\n\tmat4x4_identity(T);\n\tT[3][0] = x;\n\tT[3][1] = y;\n\tT[3][2] = z;\n}\nstatic inline void mat4x4_translate_in_place(mat4x4 M, float x, float y, float z)\n{\n\tvec4 t = {x, y, z, 0};\n\tvec4 r;\n\tint i;\n\tfor (i = 0; i < 4; ++i) {\n\t\tmat4x4_row(r, M, i);\n\t\tM[3][i] += vec4_mul_inner(r, t);\n\t}\n}\nstatic inline void mat4x4_from_vec3_mul_outer(mat4x4 M, vec3 a, vec3 b)\n{\n\tint i, j;\n\tfor(i=0; i<4; ++i) for(j=0; j<4; ++j)\n\t\tM[i][j] = i<3 && j<3 ? a[i] * b[j] : 0.f;\n}\nstatic inline void mat4x4_rotate(mat4x4 R, mat4x4 M, float x, float y, float z, float angle)\n{\n\tfloat s = sinf(angle);\n\tfloat c = cosf(angle);\n\tvec3 u = {x, y, z};\n\n\tif(vec3_len(u) > 1e-4) {\n\t\tmat4x4 T, C, S = {{0}};\n\n\t\tvec3_norm(u, u);\n\t\tmat4x4_from_vec3_mul_outer(T, u, u);\n\n\t\tS[1][2] =  u[0];\n\t\tS[2][1] = -u[0];\n\t\tS[2][0] =  u[1];\n\t\tS[0][2] = -u[1];\n\t\tS[0][1] =  u[2];\n\t\tS[1][0] = -u[2];\n\n\t\tmat4x4_scale(S, S, s);\n\n\t\tmat4x4_identity(C);\n\t\tmat4x4_sub(C, C, T);\n\n\t\tmat4x4_scale(C, C, c);\n\n\t\tmat4x4_add(T, T, C);\n\t\tmat4x4_add(T, T, S);\n\n\t\tT[3][3] = 1.;\n\t\tmat4x4_mul(R, M, T);\n\t} else {\n\t\tmat4x4_dup(R, M);\n\t}\n}\nstatic inline void mat4x4_rotate_X(mat4x4 Q, mat4x4 M, float angle)\n{\n\tfloat s = sinf(angle);\n\tfloat c = cosf(angle);\n\tmat4x4 R = {\n\t\t{1.f, 0.f, 0.f, 0.f},\n\t\t{0.f,   c,   s, 0.f},\n\t\t{0.f,  -s,   c, 0.f},\n\t\t{0.f, 0.f, 0.f, 1.f}\n\t};\n\tmat4x4_mul(Q, M, R);\n}\nstatic inline void mat4x4_rotate_Y(mat4x4 Q, mat4x4 M, float angle)\n{\n\tfloat s = sinf(angle);\n\tfloat c = cosf(angle);\n\tmat4x4 R = {\n\t\t{   c, 0.f,   s, 0.f},\n\t\t{ 0.f, 1.f, 0.f, 0.f},\n\t\t{  -s, 0.f,   c, 0.f},\n\t\t{ 0.f, 0.f, 0.f, 1.f}\n\t};\n\tmat4x4_mul(Q, M, R);\n}\nstatic inline void mat4x4_rotate_Z(mat4x4 Q, mat4x4 M, float angle)\n{\n\tfloat s = sinf(angle);\n\tfloat c = cosf(angle);\n\tmat4x4 R = {\n\t\t{   c,   s, 0.f, 0.f},\n\t\t{  -s,   c, 0.f, 0.f},\n\t\t{ 0.f, 0.f, 1.f, 0.f},\n\t\t{ 0.f, 0.f, 0.f, 1.f}\n\t};\n\tmat4x4_mul(Q, M, R);\n}\nstatic inline void mat4x4_invert(mat4x4 T, mat4x4 M)\n{\n\tfloat idet;\n\tfloat s[6];\n\tfloat c[6];\n\ts[0] = M[0][0]*M[1][1] - M[1][0]*M[0][1];\n\ts[1] = M[0][0]*M[1][2] - M[1][0]*M[0][2];\n\ts[2] = M[0][0]*M[1][3] - M[1][0]*M[0][3];\n\ts[3] = M[0][1]*M[1][2] - M[1][1]*M[0][2];\n\ts[4] = M[0][1]*M[1][3] - M[1][1]*M[0][3];\n\ts[5] = M[0][2]*M[1][3] - M[1][2]*M[0][3];\n\n\tc[0] = M[2][0]*M[3][1] - M[3][0]*M[2][1];\n\tc[1] = M[2][0]*M[3][2] - M[3][0]*M[2][2];\n\tc[2] = M[2][0]*M[3][3] - M[3][0]*M[2][3];\n\tc[3] = M[2][1]*M[3][2] - M[3][1]*M[2][2];\n\tc[4] = M[2][1]*M[3][3] - M[3][1]*M[2][3];\n\tc[5] = M[2][2]*M[3][3] - M[3][2]*M[2][3];\n\n\t/* Assumes it is invertible */\n\tidet = 1.0f/( s[0]*c[5]-s[1]*c[4]+s[2]*c[3]+s[3]*c[2]-s[4]*c[1]+s[5]*c[0] );\n\n\tT[0][0] = ( M[1][1] * c[5] - M[1][2] * c[4] + M[1][3] * c[3]) * idet;\n\tT[0][1] = (-M[0][1] * c[5] + M[0][2] * c[4] - M[0][3] * c[3]) * idet;\n\tT[0][2] = ( M[3][1] * s[5] - M[3][2] * s[4] + M[3][3] * s[3]) * idet;\n\tT[0][3] = (-M[2][1] * s[5] + M[2][2] * s[4] - M[2][3] * s[3]) * idet;\n\n\tT[1][0] = (-M[1][0] * c[5] + M[1][2] * c[2] - M[1][3] * c[1]) * idet;\n\tT[1][1] = ( M[0][0] * c[5] - M[0][2] * c[2] + M[0][3] * c[1]) * idet;\n\tT[1][2] = (-M[3][0] * s[5] + M[3][2] * s[2] - M[3][3] * s[1]) * idet;\n\tT[1][3] = ( M[2][0] * s[5] - M[2][2] * s[2] + M[2][3] * s[1]) * idet;\n\n\tT[2][0] = ( M[1][0] * c[4] - M[1][1] * c[2] + M[1][3] * c[0]) * idet;\n\tT[2][1] = (-M[0][0] * c[4] + M[0][1] * c[2] - M[0][3] * c[0]) * idet;\n\tT[2][2] = ( M[3][0] * s[4] - M[3][1] * s[2] + M[3][3] * s[0]) * idet;\n\tT[2][3] = (-M[2][0] * s[4] + M[2][1] * s[2] - M[2][3] * s[0]) * idet;\n\n\tT[3][0] = (-M[1][0] * c[3] + M[1][1] * c[1] - M[1][2] * c[0]) * idet;\n\tT[3][1] = ( M[0][0] * c[3] - M[0][1] * c[1] + M[0][2] * c[0]) * idet;\n\tT[3][2] = (-M[3][0] * s[3] + M[3][1] * s[1] - M[3][2] * s[0]) * idet;\n\tT[3][3] = ( M[2][0] * s[3] - M[2][1] * s[1] + M[2][2] * s[0]) * idet;\n}\nstatic inline void mat4x4_orthonormalize(mat4x4 R, mat4x4 M)\n{\n\tfloat s = 1.;\n\tvec3 h;\n\n\tmat4x4_dup(R, M);\n\tvec3_norm(R[2], R[2]);\n\n\ts = vec3_mul_inner(R[1], R[2]);\n\tvec3_scale(h, R[2], s);\n\tvec3_sub(R[1], R[1], h);\n\tvec3_norm(R[2], R[2]);\n\n\ts = vec3_mul_inner(R[1], R[2]);\n\tvec3_scale(h, R[2], s);\n\tvec3_sub(R[1], R[1], h);\n\tvec3_norm(R[1], R[1]);\n\n\ts = vec3_mul_inner(R[0], R[1]);\n\tvec3_scale(h, R[1], s);\n\tvec3_sub(R[0], R[0], h);\n\tvec3_norm(R[0], R[0]);\n}\n\nstatic inline void mat4x4_frustum(mat4x4 M, float l, float r, float b, float t, float n, float f)\n{\n\tM[0][0] = 2.f*n/(r-l);\n\tM[0][1] = M[0][2] = M[0][3] = 0.f;\n\n\tM[1][1] = 2.f*n/(t-b);\n\tM[1][0] = M[1][2] = M[1][3] = 0.f;\n\n\tM[2][0] = (r+l)/(r-l);\n\tM[2][1] = (t+b)/(t-b);\n\tM[2][2] = -(f+n)/(f-n);\n\tM[2][3] = -1.f;\n\n\tM[3][2] = -2.f*(f*n)/(f-n);\n\tM[3][0] = M[3][1] = M[3][3] = 0.f;\n}\nstatic inline void mat4x4_ortho(mat4x4 M, float l, float r, float b, float t, float n, float f)\n{\n\tM[0][0] = 2.f/(r-l);\n\tM[0][1] = M[0][2] = M[0][3] = 0.f;\n\n\tM[1][1] = 2.f/(t-b);\n\tM[1][0] = M[1][2] = M[1][3] = 0.f;\n\n\tM[2][2] = -2.f/(f-n);\n\tM[2][0] = M[2][1] = M[2][3] = 0.f;\n\n\tM[3][0] = -(r+l)/(r-l);\n\tM[3][1] = -(t+b)/(t-b);\n\tM[3][2] = -(f+n)/(f-n);\n\tM[3][3] = 1.f;\n}\nstatic inline void mat4x4_perspective(mat4x4 m, float y_fov, float aspect, float n, float f)\n{\n\t/* NOTE: Degrees are an unhandy unit to work with.\n\t * linmath.h uses radians for everything! */\n\tfloat const a = 1.f / (float) tan(y_fov / 2.f);\n\n\tm[0][0] = a / aspect;\n\tm[0][1] = 0.f;\n\tm[0][2] = 0.f;\n\tm[0][3] = 0.f;\n\n\tm[1][0] = 0.f;\n\tm[1][1] = a;\n\tm[1][2] = 0.f;\n\tm[1][3] = 0.f;\n\n\tm[2][0] = 0.f;\n\tm[2][1] = 0.f;\n\tm[2][2] = -((f + n) / (f - n));\n\tm[2][3] = -1.f;\n\n\tm[3][0] = 0.f;\n\tm[3][1] = 0.f;\n\tm[3][2] = -((2.f * f * n) / (f - n));\n\tm[3][3] = 0.f;\n}\nstatic inline void mat4x4_look_at(mat4x4 m, vec3 eye, vec3 center, vec3 up)\n{\n\t/* Adapted from Android's OpenGL Matrix.java.                        */\n\t/* See the OpenGL GLUT documentation for gluLookAt for a description */\n\t/* of the algorithm. We implement it in a straightforward way:       */\n\n\t/* TODO: The negation of of can be spared by swapping the order of\n\t *       operands in the following cross products in the right way. */\n\tvec3 f;\n\tvec3 s;\n\tvec3 t;\n\n\tvec3_sub(f, center, eye);\n\tvec3_norm(f, f);\n\n\tvec3_mul_cross(s, f, up);\n\tvec3_norm(s, s);\n\n\tvec3_mul_cross(t, s, f);\n\n\tm[0][0] =  s[0];\n\tm[0][1] =  t[0];\n\tm[0][2] = -f[0];\n\tm[0][3] =   0.f;\n\n\tm[1][0] =  s[1];\n\tm[1][1] =  t[1];\n\tm[1][2] = -f[1];\n\tm[1][3] =   0.f;\n\n\tm[2][0] =  s[2];\n\tm[2][1] =  t[2];\n\tm[2][2] = -f[2];\n\tm[2][3] =   0.f;\n\n\tm[3][0] =  0.f;\n\tm[3][1] =  0.f;\n\tm[3][2] =  0.f;\n\tm[3][3] =  1.f;\n\n\tmat4x4_translate_in_place(m, -eye[0], -eye[1], -eye[2]);\n}\n\ntypedef float quat[4];\nstatic inline void quat_identity(quat q)\n{\n\tq[0] = q[1] = q[2] = 0.f;\n\tq[3] = 1.f;\n}\nstatic inline void quat_add(quat r, quat a, quat b)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tr[i] = a[i] + b[i];\n}\nstatic inline void quat_sub(quat r, quat a, quat b)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tr[i] = a[i] - b[i];\n}\nstatic inline void quat_mul(quat r, quat p, quat q)\n{\n\tvec3 w;\n\tvec3_mul_cross(r, p, q);\n\tvec3_scale(w, p, q[3]);\n\tvec3_add(r, r, w);\n\tvec3_scale(w, q, p[3]);\n\tvec3_add(r, r, w);\n\tr[3] = p[3]*q[3] - vec3_mul_inner(p, q);\n}\nstatic inline void quat_scale(quat r, quat v, float s)\n{\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tr[i] = v[i] * s;\n}\nstatic inline float quat_inner_product(quat a, quat b)\n{\n\tfloat p = 0.f;\n\tint i;\n\tfor(i=0; i<4; ++i)\n\t\tp += b[i]*a[i];\n\treturn p;\n}\nstatic inline void quat_conj(quat r, quat q)\n{\n\tint i;\n\tfor(i=0; i<3; ++i)\n\t\tr[i] = -q[i];\n\tr[3] = q[3];\n}\nstatic inline void quat_rotate(quat r, float angle, vec3 axis) {\n\tint i;\n\tvec3 v;\n\tvec3_scale(v, axis, sinf(angle / 2));\n\tfor(i=0; i<3; ++i)\n\t\tr[i] = v[i];\n\tr[3] = cosf(angle / 2);\n}\n#define quat_norm vec4_norm\nstatic inline void quat_mul_vec3(vec3 r, quat q, vec3 v)\n{\n/*\n * Method by Fabian 'ryg' Giessen (of Farbrausch)\nt = 2 * cross(q.xyz, v)\nv' = v + q.w * t + cross(q.xyz, t)\n */\n\tvec3 t = {q[0], q[1], q[2]};\n\tvec3 u = {q[0], q[1], q[2]};\n\n\tvec3_mul_cross(t, t, v);\n\tvec3_scale(t, t, 2);\n\n\tvec3_mul_cross(u, u, t);\n\tvec3_scale(t, t, q[3]);\n\n\tvec3_add(r, v, t);\n\tvec3_add(r, r, u);\n}\nstatic inline void mat4x4_from_quat(mat4x4 M, quat q)\n{\n\tfloat a = q[3];\n\tfloat b = q[0];\n\tfloat c = q[1];\n\tfloat d = q[2];\n\tfloat a2 = a*a;\n\tfloat b2 = b*b;\n\tfloat c2 = c*c;\n\tfloat d2 = d*d;\n\n\tM[0][0] = a2 + b2 - c2 - d2;\n\tM[0][1] = 2.f*(b*c + a*d);\n\tM[0][2] = 2.f*(b*d - a*c);\n\tM[0][3] = 0.f;\n\n\tM[1][0] = 2*(b*c - a*d);\n\tM[1][1] = a2 - b2 + c2 - d2;\n\tM[1][2] = 2.f*(c*d + a*b);\n\tM[1][3] = 0.f;\n\n\tM[2][0] = 2.f*(b*d + a*c);\n\tM[2][1] = 2.f*(c*d - a*b);\n\tM[2][2] = a2 - b2 - c2 + d2;\n\tM[2][3] = 0.f;\n\n\tM[3][0] = M[3][1] = M[3][2] = 0.f;\n\tM[3][3] = 1.f;\n}\n\nstatic inline void mat4x4o_mul_quat(mat4x4 R, mat4x4 M, quat q)\n{\n/*  XXX: The way this is written only works for othogonal matrices. */\n/* TODO: Take care of non-orthogonal case. */\n\tquat_mul_vec3(R[0], q, M[0]);\n\tquat_mul_vec3(R[1], q, M[1]);\n\tquat_mul_vec3(R[2], q, M[2]);\n\n\tR[3][0] = R[3][1] = R[3][2] = 0.f;\n\tR[3][3] = 1.f;\n}\nstatic inline void quat_from_mat4x4(quat q, mat4x4 M)\n{\n\tfloat r=0.f;\n\tint i;\n\n\tint perm[] = { 0, 1, 2, 0, 1 };\n\tint *p = perm;\n\n\tfor(i = 0; i<3; i++) {\n\t\tfloat m = M[i][i];\n\t\tif( m < r )\n\t\t\tcontinue;\n\t\tm = r;\n\t\tp = &perm[i];\n\t}\n\n\tr = (float) sqrt(1.f + M[p[0]][p[0]] - M[p[1]][p[1]] - M[p[2]][p[2]] );\n\n\tif(r < 1e-6) {\n\t\tq[0] = 1.f;\n\t\tq[1] = q[2] = q[3] = 0.f;\n\t\treturn;\n\t}\n\n\tq[0] = r/2.f;\n\tq[1] = (M[p[0]][p[1]] - M[p[1]][p[0]])/(2.f*r);\n\tq[2] = (M[p[2]][p[0]] - M[p[0]][p[2]])/(2.f*r);\n\tq[3] = (M[p[2]][p[1]] - M[p[1]][p[2]])/(2.f*r);\n}\n\n#endif\n"
  },
  {
    "path": "external/GLFW/deps/mingw/_mingw_dxhelper.h",
    "content": "/**\n * This file has no copyright assigned and is placed in the Public Domain.\n * This file is part of the mingw-w64 runtime package.\n * No warranty is given; refer to the file DISCLAIMER within this package.\n */\n\n#if defined(_MSC_VER) && !defined(_MSC_EXTENSIONS)\n#define NONAMELESSUNION\t\t1\n#endif\n#if defined(NONAMELESSSTRUCT) && \\\n   !defined(NONAMELESSUNION)\n#define NONAMELESSUNION\t\t1\n#endif\n#if defined(NONAMELESSUNION)  && \\\n   !defined(NONAMELESSSTRUCT)\n#define NONAMELESSSTRUCT\t1\n#endif\n#if !defined(__GNU_EXTENSION)\n#if defined(__GNUC__) || defined(__GNUG__)\n#define __GNU_EXTENSION\t\t__extension__\n#else\n#define __GNU_EXTENSION\n#endif\n#endif /* __extension__ */\n\n#ifndef __ANONYMOUS_DEFINED\n#define __ANONYMOUS_DEFINED\n#if defined(__GNUC__) || defined(__GNUG__)\n#define _ANONYMOUS_UNION\t__extension__\n#define _ANONYMOUS_STRUCT\t__extension__\n#else\n#define _ANONYMOUS_UNION\n#define _ANONYMOUS_STRUCT\n#endif\n#ifndef NONAMELESSUNION\n#define _UNION_NAME(x)\n#define _STRUCT_NAME(x)\n#else /* NONAMELESSUNION */\n#define _UNION_NAME(x)  x\n#define _STRUCT_NAME(x) x\n#endif\n#endif\t/* __ANONYMOUS_DEFINED */\n\n#ifndef DUMMYUNIONNAME\n# ifdef NONAMELESSUNION\n#  define DUMMYUNIONNAME  u\n#  define DUMMYUNIONNAME1 u1\t/* Wine uses this variant */\n#  define DUMMYUNIONNAME2 u2\n#  define DUMMYUNIONNAME3 u3\n#  define DUMMYUNIONNAME4 u4\n#  define DUMMYUNIONNAME5 u5\n#  define DUMMYUNIONNAME6 u6\n#  define DUMMYUNIONNAME7 u7\n#  define DUMMYUNIONNAME8 u8\n#  define DUMMYUNIONNAME9 u9\n# else /* NONAMELESSUNION */\n#  define DUMMYUNIONNAME\n#  define DUMMYUNIONNAME1\t/* Wine uses this variant */\n#  define DUMMYUNIONNAME2\n#  define DUMMYUNIONNAME3\n#  define DUMMYUNIONNAME4\n#  define DUMMYUNIONNAME5\n#  define DUMMYUNIONNAME6\n#  define DUMMYUNIONNAME7\n#  define DUMMYUNIONNAME8\n#  define DUMMYUNIONNAME9\n# endif\n#endif\t/* DUMMYUNIONNAME */\n\n#if !defined(DUMMYUNIONNAME1)\t/* MinGW does not define this one */\n# ifdef NONAMELESSUNION\n#  define DUMMYUNIONNAME1 u1\t/* Wine uses this variant */\n# else\n#  define DUMMYUNIONNAME1\t/* Wine uses this variant */\n# endif\n#endif\t/* DUMMYUNIONNAME1 */\n\n#ifndef DUMMYSTRUCTNAME\n# ifdef NONAMELESSUNION\n#  define DUMMYSTRUCTNAME  s\n#  define DUMMYSTRUCTNAME1 s1\t/* Wine uses this variant */\n#  define DUMMYSTRUCTNAME2 s2\n#  define DUMMYSTRUCTNAME3 s3\n#  define DUMMYSTRUCTNAME4 s4\n#  define DUMMYSTRUCTNAME5 s5\n# else\n#  define DUMMYSTRUCTNAME\n#  define DUMMYSTRUCTNAME1\t/* Wine uses this variant */\n#  define DUMMYSTRUCTNAME2\n#  define DUMMYSTRUCTNAME3\n#  define DUMMYSTRUCTNAME4\n#  define DUMMYSTRUCTNAME5\n# endif\n#endif /* DUMMYSTRUCTNAME */\n\n/* These are for compatibility with the Wine source tree */\n\n#ifndef WINELIB_NAME_AW\n# ifdef __MINGW_NAME_AW\n#   define WINELIB_NAME_AW  __MINGW_NAME_AW\n# else\n#  ifdef UNICODE\n#   define WINELIB_NAME_AW(func) func##W\n#  else\n#   define WINELIB_NAME_AW(func) func##A\n#  endif\n# endif\n#endif\t/* WINELIB_NAME_AW */\n\n#ifndef DECL_WINELIB_TYPE_AW\n# ifdef __MINGW_TYPEDEF_AW\n#  define DECL_WINELIB_TYPE_AW  __MINGW_TYPEDEF_AW\n# else\n#  define DECL_WINELIB_TYPE_AW(type)  typedef WINELIB_NAME_AW(type) type;\n# endif\n#endif\t/* DECL_WINELIB_TYPE_AW */\n\n"
  },
  {
    "path": "external/GLFW/deps/mingw/dinput.h",
    "content": "/*\n * Copyright (C) the Wine project\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\n */\n\n#ifndef __DINPUT_INCLUDED__\n#define __DINPUT_INCLUDED__\n\n#define COM_NO_WINDOWS_H\n#include <objbase.h>\n#include <_mingw_dxhelper.h>\n\n#ifndef DIRECTINPUT_VERSION\n#define DIRECTINPUT_VERSION\t0x0800\n#endif\n\n/* Classes */\nDEFINE_GUID(CLSID_DirectInput,\t\t0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(CLSID_DirectInputDevice,\t0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\n\nDEFINE_GUID(CLSID_DirectInput8,\t\t0x25E609E4,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(CLSID_DirectInputDevice8,\t0x25E609E5,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\n\n/* Interfaces */\nDEFINE_GUID(IID_IDirectInputA,\t\t0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(IID_IDirectInputW,\t\t0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(IID_IDirectInput2A,\t\t0x5944E662,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(IID_IDirectInput2W,\t\t0x5944E663,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(IID_IDirectInput7A,\t\t0x9A4CB684,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE);\nDEFINE_GUID(IID_IDirectInput7W,\t\t0x9A4CB685,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE);\nDEFINE_GUID(IID_IDirectInput8A,\t\t0xBF798030,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00);\nDEFINE_GUID(IID_IDirectInput8W,\t\t0xBF798031,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00);\nDEFINE_GUID(IID_IDirectInputDeviceA,\t0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(IID_IDirectInputDeviceW,\t0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(IID_IDirectInputDevice2A,\t0x5944E682,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(IID_IDirectInputDevice2W,\t0x5944E683,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(IID_IDirectInputDevice7A,\t0x57D7C6BC,0x2356,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE);\nDEFINE_GUID(IID_IDirectInputDevice7W,\t0x57D7C6BD,0x2356,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE);\nDEFINE_GUID(IID_IDirectInputDevice8A,\t0x54D41080,0xDC15,0x4833,0xA4,0x1B,0x74,0x8F,0x73,0xA3,0x81,0x79);\nDEFINE_GUID(IID_IDirectInputDevice8W,\t0x54D41081,0xDC15,0x4833,0xA4,0x1B,0x74,0x8F,0x73,0xA3,0x81,0x79);\nDEFINE_GUID(IID_IDirectInputEffect,\t0xE7E1F7C0,0x88D2,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\n\n/* Predefined object types */\nDEFINE_GUID(GUID_XAxis,\t0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_YAxis,\t0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_ZAxis,\t0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_RxAxis,0xA36D02F4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_RyAxis,0xA36D02F5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_RzAxis,0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_Slider,0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_Button,0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_Key,\t0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_POV,\t0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_Unknown,0xA36D02F3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\n\n/* Predefined product GUIDs */\nDEFINE_GUID(GUID_SysMouse,\t0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_SysKeyboard,\t0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_Joystick,\t0x6F1D2B70,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_SysMouseEm,\t0x6F1D2B80,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_SysMouseEm2,\t0x6F1D2B81,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_SysKeyboardEm,\t0x6F1D2B82,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\nDEFINE_GUID(GUID_SysKeyboardEm2,0x6F1D2B83,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);\n\n/* predefined forcefeedback effects */\nDEFINE_GUID(GUID_ConstantForce,\t0x13541C20,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_RampForce,\t0x13541C21,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_Square,\t0x13541C22,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_Sine,\t\t0x13541C23,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_Triangle,\t0x13541C24,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_SawtoothUp,\t0x13541C25,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_SawtoothDown,\t0x13541C26,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_Spring,\t0x13541C27,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_Damper,\t0x13541C28,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_Inertia,\t0x13541C29,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_Friction,\t0x13541C2A,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\nDEFINE_GUID(GUID_CustomForce,\t0x13541C2B,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);\n\ntypedef struct IDirectInputA *LPDIRECTINPUTA;\ntypedef struct IDirectInputW *LPDIRECTINPUTW;\ntypedef struct IDirectInput2A *LPDIRECTINPUT2A;\ntypedef struct IDirectInput2W *LPDIRECTINPUT2W;\ntypedef struct IDirectInput7A *LPDIRECTINPUT7A;\ntypedef struct IDirectInput7W *LPDIRECTINPUT7W;\n#if DIRECTINPUT_VERSION >= 0x0800\ntypedef struct IDirectInput8A *LPDIRECTINPUT8A;\ntypedef struct IDirectInput8W *LPDIRECTINPUT8W;\n#endif /* DI8 */\ntypedef struct IDirectInputDeviceA *LPDIRECTINPUTDEVICEA;\ntypedef struct IDirectInputDeviceW *LPDIRECTINPUTDEVICEW;\n#if DIRECTINPUT_VERSION >= 0x0500\ntypedef struct IDirectInputDevice2A *LPDIRECTINPUTDEVICE2A;\ntypedef struct IDirectInputDevice2W *LPDIRECTINPUTDEVICE2W;\n#endif /* DI5 */\n#if DIRECTINPUT_VERSION >= 0x0700\ntypedef struct IDirectInputDevice7A *LPDIRECTINPUTDEVICE7A;\ntypedef struct IDirectInputDevice7W *LPDIRECTINPUTDEVICE7W;\n#endif /* DI7 */\n#if DIRECTINPUT_VERSION >= 0x0800\ntypedef struct IDirectInputDevice8A *LPDIRECTINPUTDEVICE8A;\ntypedef struct IDirectInputDevice8W *LPDIRECTINPUTDEVICE8W;\n#endif /* DI8 */\n#if DIRECTINPUT_VERSION >= 0x0500\ntypedef struct IDirectInputEffect *LPDIRECTINPUTEFFECT;\n#endif /* DI5 */\ntypedef struct SysKeyboardA *LPSYSKEYBOARDA;\ntypedef struct SysMouseA *LPSYSMOUSEA;\n\n#define IID_IDirectInput WINELIB_NAME_AW(IID_IDirectInput)\n#define IDirectInput WINELIB_NAME_AW(IDirectInput)\nDECL_WINELIB_TYPE_AW(LPDIRECTINPUT)\n#define IID_IDirectInput2 WINELIB_NAME_AW(IID_IDirectInput2)\n#define IDirectInput2 WINELIB_NAME_AW(IDirectInput2)\nDECL_WINELIB_TYPE_AW(LPDIRECTINPUT2)\n#define IID_IDirectInput7 WINELIB_NAME_AW(IID_IDirectInput7)\n#define IDirectInput7 WINELIB_NAME_AW(IDirectInput7)\nDECL_WINELIB_TYPE_AW(LPDIRECTINPUT7)\n#if DIRECTINPUT_VERSION >= 0x0800\n#define IID_IDirectInput8 WINELIB_NAME_AW(IID_IDirectInput8)\n#define IDirectInput8 WINELIB_NAME_AW(IDirectInput8)\nDECL_WINELIB_TYPE_AW(LPDIRECTINPUT8)\n#endif /* DI8 */\n#define IID_IDirectInputDevice WINELIB_NAME_AW(IID_IDirectInputDevice)\n#define IDirectInputDevice WINELIB_NAME_AW(IDirectInputDevice)\nDECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE)\n#if DIRECTINPUT_VERSION >= 0x0500\n#define IID_IDirectInputDevice2 WINELIB_NAME_AW(IID_IDirectInputDevice2)\n#define IDirectInputDevice2 WINELIB_NAME_AW(IDirectInputDevice2)\nDECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE2)\n#endif /* DI5 */\n#if DIRECTINPUT_VERSION >= 0x0700\n#define IID_IDirectInputDevice7 WINELIB_NAME_AW(IID_IDirectInputDevice7)\n#define IDirectInputDevice7 WINELIB_NAME_AW(IDirectInputDevice7)\nDECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE7)\n#endif /* DI7 */\n#if DIRECTINPUT_VERSION >= 0x0800\n#define IID_IDirectInputDevice8 WINELIB_NAME_AW(IID_IDirectInputDevice8)\n#define IDirectInputDevice8 WINELIB_NAME_AW(IDirectInputDevice8)\nDECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE8)\n#endif /* DI8 */\n\n#define DI_OK                           S_OK\n#define DI_NOTATTACHED                  S_FALSE\n#define DI_BUFFEROVERFLOW               S_FALSE\n#define DI_PROPNOEFFECT                 S_FALSE\n#define DI_NOEFFECT                     S_FALSE\n#define DI_POLLEDDEVICE                 ((HRESULT)0x00000002L)\n#define DI_DOWNLOADSKIPPED              ((HRESULT)0x00000003L)\n#define DI_EFFECTRESTARTED              ((HRESULT)0x00000004L)\n#define DI_TRUNCATED                    ((HRESULT)0x00000008L)\n#define DI_SETTINGSNOTSAVED             ((HRESULT)0x0000000BL)\n#define DI_TRUNCATEDANDRESTARTED        ((HRESULT)0x0000000CL)\n#define DI_WRITEPROTECT                 ((HRESULT)0x00000013L)\n\n#define DIERR_OLDDIRECTINPUTVERSION     \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION)\n#define DIERR_BETADIRECTINPUTVERSION    \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP)\n#define DIERR_BADDRIVERVER              \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL)\n#define DIERR_DEVICENOTREG              REGDB_E_CLASSNOTREG\n#define DIERR_NOTFOUND                  \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)\n#define DIERR_OBJECTNOTFOUND            \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)\n#define DIERR_INVALIDPARAM              E_INVALIDARG\n#define DIERR_NOINTERFACE               E_NOINTERFACE\n#define DIERR_GENERIC                   E_FAIL\n#define DIERR_OUTOFMEMORY               E_OUTOFMEMORY\n#define DIERR_UNSUPPORTED               E_NOTIMPL\n#define DIERR_NOTINITIALIZED            \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY)\n#define DIERR_ALREADYINITIALIZED        \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED)\n#define DIERR_NOAGGREGATION             CLASS_E_NOAGGREGATION\n#define DIERR_OTHERAPPHASPRIO           E_ACCESSDENIED\n#define DIERR_INPUTLOST                 \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT)\n#define DIERR_ACQUIRED                  \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY)\n#define DIERR_NOTACQUIRED               \\\n    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS)\n#define DIERR_READONLY                  E_ACCESSDENIED\n#define DIERR_HANDLEEXISTS              E_ACCESSDENIED\n#ifndef E_PENDING\n#define E_PENDING                       0x8000000AL\n#endif\n#define DIERR_INSUFFICIENTPRIVS         0x80040200L\n#define DIERR_DEVICEFULL                0x80040201L\n#define DIERR_MOREDATA                  0x80040202L\n#define DIERR_NOTDOWNLOADED             0x80040203L\n#define DIERR_HASEFFECTS                0x80040204L\n#define DIERR_NOTEXCLUSIVEACQUIRED      0x80040205L\n#define DIERR_INCOMPLETEEFFECT          0x80040206L\n#define DIERR_NOTBUFFERED               0x80040207L\n#define DIERR_EFFECTPLAYING             0x80040208L\n#define DIERR_UNPLUGGED                 0x80040209L\n#define DIERR_REPORTFULL                0x8004020AL\n#define DIERR_MAPFILEFAIL               0x8004020BL\n\n#define DIENUM_STOP                     0\n#define DIENUM_CONTINUE                 1\n\n#define DIEDFL_ALLDEVICES               0x00000000\n#define DIEDFL_ATTACHEDONLY             0x00000001\n#define DIEDFL_FORCEFEEDBACK            0x00000100\n#define DIEDFL_INCLUDEALIASES           0x00010000\n#define DIEDFL_INCLUDEPHANTOMS          0x00020000\n#define DIEDFL_INCLUDEHIDDEN\t\t0x00040000\n\n#define DIDEVTYPE_DEVICE                1\n#define DIDEVTYPE_MOUSE                 2\n#define DIDEVTYPE_KEYBOARD              3\n#define DIDEVTYPE_JOYSTICK              4\n#define DIDEVTYPE_HID                   0x00010000\n\n#define DI8DEVCLASS_ALL             0\n#define DI8DEVCLASS_DEVICE          1\n#define DI8DEVCLASS_POINTER         2\n#define DI8DEVCLASS_KEYBOARD        3\n#define DI8DEVCLASS_GAMECTRL        4\n\n#define DI8DEVTYPE_DEVICE           0x11\n#define DI8DEVTYPE_MOUSE            0x12\n#define DI8DEVTYPE_KEYBOARD         0x13\n#define DI8DEVTYPE_JOYSTICK         0x14\n#define DI8DEVTYPE_GAMEPAD          0x15\n#define DI8DEVTYPE_DRIVING          0x16\n#define DI8DEVTYPE_FLIGHT           0x17\n#define DI8DEVTYPE_1STPERSON        0x18\n#define DI8DEVTYPE_DEVICECTRL       0x19\n#define DI8DEVTYPE_SCREENPOINTER    0x1A\n#define DI8DEVTYPE_REMOTE           0x1B\n#define DI8DEVTYPE_SUPPLEMENTAL     0x1C\n\t\n#define DIDEVTYPEMOUSE_UNKNOWN          1\n#define DIDEVTYPEMOUSE_TRADITIONAL      2\n#define DIDEVTYPEMOUSE_FINGERSTICK      3\n#define DIDEVTYPEMOUSE_TOUCHPAD         4\n#define DIDEVTYPEMOUSE_TRACKBALL        5\n\n#define DIDEVTYPEKEYBOARD_UNKNOWN       0\n#define DIDEVTYPEKEYBOARD_PCXT          1\n#define DIDEVTYPEKEYBOARD_OLIVETTI      2\n#define DIDEVTYPEKEYBOARD_PCAT          3\n#define DIDEVTYPEKEYBOARD_PCENH         4\n#define DIDEVTYPEKEYBOARD_NOKIA1050     5\n#define DIDEVTYPEKEYBOARD_NOKIA9140     6\n#define DIDEVTYPEKEYBOARD_NEC98         7\n#define DIDEVTYPEKEYBOARD_NEC98LAPTOP   8\n#define DIDEVTYPEKEYBOARD_NEC98106      9\n#define DIDEVTYPEKEYBOARD_JAPAN106     10\n#define DIDEVTYPEKEYBOARD_JAPANAX      11\n#define DIDEVTYPEKEYBOARD_J3100        12\n\n#define DIDEVTYPEJOYSTICK_UNKNOWN       1\n#define DIDEVTYPEJOYSTICK_TRADITIONAL   2\n#define DIDEVTYPEJOYSTICK_FLIGHTSTICK   3\n#define DIDEVTYPEJOYSTICK_GAMEPAD       4\n#define DIDEVTYPEJOYSTICK_RUDDER        5\n#define DIDEVTYPEJOYSTICK_WHEEL         6\n#define DIDEVTYPEJOYSTICK_HEADTRACKER   7\n\n#define DI8DEVTYPEMOUSE_UNKNOWN                     1\n#define DI8DEVTYPEMOUSE_TRADITIONAL                 2\n#define DI8DEVTYPEMOUSE_FINGERSTICK                 3\n#define DI8DEVTYPEMOUSE_TOUCHPAD                    4\n#define DI8DEVTYPEMOUSE_TRACKBALL                   5\n#define DI8DEVTYPEMOUSE_ABSOLUTE                    6\n\n#define DI8DEVTYPEKEYBOARD_UNKNOWN                  0\n#define DI8DEVTYPEKEYBOARD_PCXT                     1\n#define DI8DEVTYPEKEYBOARD_OLIVETTI                 2\n#define DI8DEVTYPEKEYBOARD_PCAT                     3\n#define DI8DEVTYPEKEYBOARD_PCENH                    4\n#define DI8DEVTYPEKEYBOARD_NOKIA1050                5\n#define DI8DEVTYPEKEYBOARD_NOKIA9140                6\n#define DI8DEVTYPEKEYBOARD_NEC98                    7\n#define DI8DEVTYPEKEYBOARD_NEC98LAPTOP              8\n#define DI8DEVTYPEKEYBOARD_NEC98106                 9\n#define DI8DEVTYPEKEYBOARD_JAPAN106                10\n#define DI8DEVTYPEKEYBOARD_JAPANAX                 11\n#define DI8DEVTYPEKEYBOARD_J3100                   12\n\n#define DI8DEVTYPE_LIMITEDGAMESUBTYPE               1\n\n#define DI8DEVTYPEJOYSTICK_LIMITED                  DI8DEVTYPE_LIMITEDGAMESUBTYPE\n#define DI8DEVTYPEJOYSTICK_STANDARD                 2\n\n#define DI8DEVTYPEGAMEPAD_LIMITED                   DI8DEVTYPE_LIMITEDGAMESUBTYPE\n#define DI8DEVTYPEGAMEPAD_STANDARD                  2\n#define DI8DEVTYPEGAMEPAD_TILT                      3\n\n#define DI8DEVTYPEDRIVING_LIMITED                   DI8DEVTYPE_LIMITEDGAMESUBTYPE\n#define DI8DEVTYPEDRIVING_COMBINEDPEDALS            2\n#define DI8DEVTYPEDRIVING_DUALPEDALS                3\n#define DI8DEVTYPEDRIVING_THREEPEDALS               4\n#define DI8DEVTYPEDRIVING_HANDHELD                  5\n\n#define DI8DEVTYPEFLIGHT_LIMITED                    DI8DEVTYPE_LIMITEDGAMESUBTYPE\n#define DI8DEVTYPEFLIGHT_STICK                      2\n#define DI8DEVTYPEFLIGHT_YOKE                       3\n#define DI8DEVTYPEFLIGHT_RC                         4\n\n#define DI8DEVTYPE1STPERSON_LIMITED                 DI8DEVTYPE_LIMITEDGAMESUBTYPE\n#define DI8DEVTYPE1STPERSON_UNKNOWN                 2\n#define DI8DEVTYPE1STPERSON_SIXDOF                  3\n#define DI8DEVTYPE1STPERSON_SHOOTER                 4\n\n#define DI8DEVTYPESCREENPTR_UNKNOWN                 2\n#define DI8DEVTYPESCREENPTR_LIGHTGUN                3\n#define DI8DEVTYPESCREENPTR_LIGHTPEN                4\n#define DI8DEVTYPESCREENPTR_TOUCH                   5\n\n#define DI8DEVTYPEREMOTE_UNKNOWN                    2\n\n#define DI8DEVTYPEDEVICECTRL_UNKNOWN                2\n#define DI8DEVTYPEDEVICECTRL_COMMSSELECTION         3\n#define DI8DEVTYPEDEVICECTRL_COMMSSELECTION_HARDWIRED 4\n\n#define DI8DEVTYPESUPPLEMENTAL_UNKNOWN              2\n#define DI8DEVTYPESUPPLEMENTAL_2NDHANDCONTROLLER    3\n#define DI8DEVTYPESUPPLEMENTAL_HEADTRACKER          4\n#define DI8DEVTYPESUPPLEMENTAL_HANDTRACKER          5\n#define DI8DEVTYPESUPPLEMENTAL_SHIFTSTICKGATE       6\n#define DI8DEVTYPESUPPLEMENTAL_SHIFTER              7\n#define DI8DEVTYPESUPPLEMENTAL_THROTTLE             8\n#define DI8DEVTYPESUPPLEMENTAL_SPLITTHROTTLE        9\n#define DI8DEVTYPESUPPLEMENTAL_COMBINEDPEDALS      10\n#define DI8DEVTYPESUPPLEMENTAL_DUALPEDALS          11\n#define DI8DEVTYPESUPPLEMENTAL_THREEPEDALS         12\n#define DI8DEVTYPESUPPLEMENTAL_RUDDERPEDALS        13\n\t\n#define GET_DIDEVICE_TYPE(dwDevType)     LOBYTE(dwDevType)\n#define GET_DIDEVICE_SUBTYPE(dwDevType)  HIBYTE(dwDevType)\n\ntypedef struct DIDEVICEOBJECTINSTANCE_DX3A {\n    DWORD   dwSize;\n    GUID    guidType;\n    DWORD   dwOfs;\n    DWORD   dwType;\n    DWORD   dwFlags;\n    CHAR    tszName[MAX_PATH];\n} DIDEVICEOBJECTINSTANCE_DX3A, *LPDIDEVICEOBJECTINSTANCE_DX3A;\ntypedef const DIDEVICEOBJECTINSTANCE_DX3A *LPCDIDEVICEOBJECTINSTANCE_DX3A;\ntypedef struct DIDEVICEOBJECTINSTANCE_DX3W {\n    DWORD   dwSize;\n    GUID    guidType;\n    DWORD   dwOfs;\n    DWORD   dwType;\n    DWORD   dwFlags;\n    WCHAR   tszName[MAX_PATH];\n} DIDEVICEOBJECTINSTANCE_DX3W, *LPDIDEVICEOBJECTINSTANCE_DX3W;\ntypedef const DIDEVICEOBJECTINSTANCE_DX3W *LPCDIDEVICEOBJECTINSTANCE_DX3W;\n\nDECL_WINELIB_TYPE_AW(DIDEVICEOBJECTINSTANCE_DX3)\nDECL_WINELIB_TYPE_AW(LPDIDEVICEOBJECTINSTANCE_DX3)\nDECL_WINELIB_TYPE_AW(LPCDIDEVICEOBJECTINSTANCE_DX3)\n\ntypedef struct DIDEVICEOBJECTINSTANCEA {\n    DWORD\tdwSize;\n    GUID\tguidType;\n    DWORD\tdwOfs;\n    DWORD\tdwType;\n    DWORD\tdwFlags;\n    CHAR\ttszName[MAX_PATH];\n#if(DIRECTINPUT_VERSION >= 0x0500)\n    DWORD\tdwFFMaxForce;\n    DWORD\tdwFFForceResolution;\n    WORD\twCollectionNumber;\n    WORD\twDesignatorIndex;\n    WORD\twUsagePage;\n    WORD\twUsage;\n    DWORD\tdwDimension;\n    WORD\twExponent;\n    WORD\twReserved;\n#endif /* DIRECTINPUT_VERSION >= 0x0500 */\n} DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA;\ntypedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA;\n\ntypedef struct DIDEVICEOBJECTINSTANCEW {\n    DWORD\tdwSize;\n    GUID\tguidType;\n    DWORD\tdwOfs;\n    DWORD\tdwType;\n    DWORD\tdwFlags;\n    WCHAR\ttszName[MAX_PATH];\n#if(DIRECTINPUT_VERSION >= 0x0500)\n    DWORD\tdwFFMaxForce;\n    DWORD\tdwFFForceResolution;\n    WORD\twCollectionNumber;\n    WORD\twDesignatorIndex;\n    WORD\twUsagePage;\n    WORD\twUsage;\n    DWORD\tdwDimension;\n    WORD\twExponent;\n    WORD\twReserved;\n#endif /* DIRECTINPUT_VERSION >= 0x0500 */\n} DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW;\ntypedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW;\n\nDECL_WINELIB_TYPE_AW(DIDEVICEOBJECTINSTANCE)\nDECL_WINELIB_TYPE_AW(LPDIDEVICEOBJECTINSTANCE)\nDECL_WINELIB_TYPE_AW(LPCDIDEVICEOBJECTINSTANCE)\n\ntypedef struct DIDEVICEINSTANCE_DX3A {\n    DWORD   dwSize;\n    GUID    guidInstance;\n    GUID    guidProduct;\n    DWORD   dwDevType;\n    CHAR    tszInstanceName[MAX_PATH];\n    CHAR    tszProductName[MAX_PATH];\n} DIDEVICEINSTANCE_DX3A, *LPDIDEVICEINSTANCE_DX3A;\ntypedef const DIDEVICEINSTANCE_DX3A *LPCDIDEVICEINSTANCE_DX3A;\ntypedef struct DIDEVICEINSTANCE_DX3W {\n    DWORD   dwSize;\n    GUID    guidInstance;\n    GUID    guidProduct;\n    DWORD   dwDevType;\n    WCHAR   tszInstanceName[MAX_PATH];\n    WCHAR   tszProductName[MAX_PATH];\n} DIDEVICEINSTANCE_DX3W, *LPDIDEVICEINSTANCE_DX3W;\ntypedef const DIDEVICEINSTANCE_DX3W *LPCDIDEVICEINSTANCE_DX3W;\n\nDECL_WINELIB_TYPE_AW(DIDEVICEINSTANCE_DX3)\nDECL_WINELIB_TYPE_AW(LPDIDEVICEINSTANCE_DX3)\nDECL_WINELIB_TYPE_AW(LPCDIDEVICEINSTANCE_DX3)\n\ntypedef struct DIDEVICEINSTANCEA {\n    DWORD\tdwSize;\n    GUID\tguidInstance;\n    GUID\tguidProduct;\n    DWORD\tdwDevType;\n    CHAR\ttszInstanceName[MAX_PATH];\n    CHAR\ttszProductName[MAX_PATH];\n#if(DIRECTINPUT_VERSION >= 0x0500)\n    GUID\tguidFFDriver;\n    WORD\twUsagePage;\n    WORD\twUsage;\n#endif /* DIRECTINPUT_VERSION >= 0x0500 */\n} DIDEVICEINSTANCEA, *LPDIDEVICEINSTANCEA;\ntypedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA;\n\ntypedef struct DIDEVICEINSTANCEW {\n    DWORD\tdwSize;\n    GUID\tguidInstance;\n    GUID\tguidProduct;\n    DWORD\tdwDevType;\n    WCHAR\ttszInstanceName[MAX_PATH];\n    WCHAR\ttszProductName[MAX_PATH];\n#if(DIRECTINPUT_VERSION >= 0x0500)\n    GUID\tguidFFDriver;\n    WORD\twUsagePage;\n    WORD\twUsage;\n#endif /* DIRECTINPUT_VERSION >= 0x0500 */\n} DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW;\ntypedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW;\n\nDECL_WINELIB_TYPE_AW(DIDEVICEINSTANCE)\nDECL_WINELIB_TYPE_AW(LPDIDEVICEINSTANCE)\nDECL_WINELIB_TYPE_AW(LPCDIDEVICEINSTANCE)\n\ntypedef BOOL (CALLBACK *LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA,LPVOID);\ntypedef BOOL (CALLBACK *LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW,LPVOID);\nDECL_WINELIB_TYPE_AW(LPDIENUMDEVICESCALLBACK)\n\n#define DIEDBS_MAPPEDPRI1\t\t0x00000001\n#define DIEDBS_MAPPEDPRI2\t\t0x00000002\n#define DIEDBS_RECENTDEVICE\t\t0x00000010\n#define DIEDBS_NEWDEVICE\t\t0x00000020\n\n#define DIEDBSFL_ATTACHEDONLY\t\t0x00000000\n#define DIEDBSFL_THISUSER\t\t0x00000010\n#define DIEDBSFL_FORCEFEEDBACK\t\tDIEDFL_FORCEFEEDBACK\n#define DIEDBSFL_AVAILABLEDEVICES\t0x00001000\n#define DIEDBSFL_MULTIMICEKEYBOARDS\t0x00002000\n#define DIEDBSFL_NONGAMINGDEVICES\t0x00004000\n#define DIEDBSFL_VALID\t\t\t0x00007110\n\n#if DIRECTINPUT_VERSION >= 0x0800\ntypedef BOOL (CALLBACK *LPDIENUMDEVICESBYSEMANTICSCBA)(LPCDIDEVICEINSTANCEA,LPDIRECTINPUTDEVICE8A,DWORD,DWORD,LPVOID);\ntypedef BOOL (CALLBACK *LPDIENUMDEVICESBYSEMANTICSCBW)(LPCDIDEVICEINSTANCEW,LPDIRECTINPUTDEVICE8W,DWORD,DWORD,LPVOID);\nDECL_WINELIB_TYPE_AW(LPDIENUMDEVICESBYSEMANTICSCB)\n#endif\n\ntypedef BOOL (CALLBACK *LPDICONFIGUREDEVICESCALLBACK)(LPUNKNOWN,LPVOID);\n\ntypedef BOOL (CALLBACK *LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA,LPVOID);\ntypedef BOOL (CALLBACK *LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW,LPVOID);\nDECL_WINELIB_TYPE_AW(LPDIENUMDEVICEOBJECTSCALLBACK)\n\n#if DIRECTINPUT_VERSION >= 0x0500\ntypedef BOOL (CALLBACK *LPDIENUMCREATEDEFFECTOBJECTSCALLBACK)(LPDIRECTINPUTEFFECT, LPVOID);\n#endif\n\n#define DIK_ESCAPE          0x01\n#define DIK_1               0x02\n#define DIK_2               0x03\n#define DIK_3               0x04\n#define DIK_4               0x05\n#define DIK_5               0x06\n#define DIK_6               0x07\n#define DIK_7               0x08\n#define DIK_8               0x09\n#define DIK_9               0x0A\n#define DIK_0               0x0B\n#define DIK_MINUS           0x0C    /* - on main keyboard */\n#define DIK_EQUALS          0x0D\n#define DIK_BACK            0x0E    /* backspace */\n#define DIK_TAB             0x0F\n#define DIK_Q               0x10\n#define DIK_W               0x11\n#define DIK_E               0x12\n#define DIK_R               0x13\n#define DIK_T               0x14\n#define DIK_Y               0x15\n#define DIK_U               0x16\n#define DIK_I               0x17\n#define DIK_O               0x18\n#define DIK_P               0x19\n#define DIK_LBRACKET        0x1A\n#define DIK_RBRACKET        0x1B\n#define DIK_RETURN          0x1C    /* Enter on main keyboard */\n#define DIK_LCONTROL        0x1D\n#define DIK_A               0x1E\n#define DIK_S               0x1F\n#define DIK_D               0x20\n#define DIK_F               0x21\n#define DIK_G               0x22\n#define DIK_H               0x23\n#define DIK_J               0x24\n#define DIK_K               0x25\n#define DIK_L               0x26\n#define DIK_SEMICOLON       0x27\n#define DIK_APOSTROPHE      0x28\n#define DIK_GRAVE           0x29    /* accent grave */\n#define DIK_LSHIFT          0x2A\n#define DIK_BACKSLASH       0x2B\n#define DIK_Z               0x2C\n#define DIK_X               0x2D\n#define DIK_C               0x2E\n#define DIK_V               0x2F\n#define DIK_B               0x30\n#define DIK_N               0x31\n#define DIK_M               0x32\n#define DIK_COMMA           0x33\n#define DIK_PERIOD          0x34    /* . on main keyboard */\n#define DIK_SLASH           0x35    /* / on main keyboard */\n#define DIK_RSHIFT          0x36\n#define DIK_MULTIPLY        0x37    /* * on numeric keypad */\n#define DIK_LMENU           0x38    /* left Alt */\n#define DIK_SPACE           0x39\n#define DIK_CAPITAL         0x3A\n#define DIK_F1              0x3B\n#define DIK_F2              0x3C\n#define DIK_F3              0x3D\n#define DIK_F4              0x3E\n#define DIK_F5              0x3F\n#define DIK_F6              0x40\n#define DIK_F7              0x41\n#define DIK_F8              0x42\n#define DIK_F9              0x43\n#define DIK_F10             0x44\n#define DIK_NUMLOCK         0x45\n#define DIK_SCROLL          0x46    /* Scroll Lock */\n#define DIK_NUMPAD7         0x47\n#define DIK_NUMPAD8         0x48\n#define DIK_NUMPAD9         0x49\n#define DIK_SUBTRACT        0x4A    /* - on numeric keypad */\n#define DIK_NUMPAD4         0x4B\n#define DIK_NUMPAD5         0x4C\n#define DIK_NUMPAD6         0x4D\n#define DIK_ADD             0x4E    /* + on numeric keypad */\n#define DIK_NUMPAD1         0x4F\n#define DIK_NUMPAD2         0x50\n#define DIK_NUMPAD3         0x51\n#define DIK_NUMPAD0         0x52\n#define DIK_DECIMAL         0x53    /* . on numeric keypad */\n#define DIK_OEM_102         0x56    /* < > | on UK/Germany keyboards */\n#define DIK_F11             0x57\n#define DIK_F12             0x58\n#define DIK_F13             0x64    /*                     (NEC PC98) */\n#define DIK_F14             0x65    /*                     (NEC PC98) */\n#define DIK_F15             0x66    /*                     (NEC PC98) */\n#define DIK_KANA            0x70    /* (Japanese keyboard)            */\n#define DIK_ABNT_C1         0x73    /* / ? on Portugese (Brazilian) keyboards */\n#define DIK_CONVERT         0x79    /* (Japanese keyboard)            */\n#define DIK_NOCONVERT       0x7B    /* (Japanese keyboard)            */\n#define DIK_YEN             0x7D    /* (Japanese keyboard)            */\n#define DIK_ABNT_C2         0x7E    /* Numpad . on Portugese (Brazilian) keyboards */\n#define DIK_NUMPADEQUALS    0x8D    /* = on numeric keypad (NEC PC98) */\n#define DIK_CIRCUMFLEX      0x90    /* (Japanese keyboard)            */\n#define DIK_AT              0x91    /*                     (NEC PC98) */\n#define DIK_COLON           0x92    /*                     (NEC PC98) */\n#define DIK_UNDERLINE       0x93    /*                     (NEC PC98) */\n#define DIK_KANJI           0x94    /* (Japanese keyboard)            */\n#define DIK_STOP            0x95    /*                     (NEC PC98) */\n#define DIK_AX              0x96    /*                     (Japan AX) */\n#define DIK_UNLABELED       0x97    /*                        (J3100) */\n#define DIK_NEXTTRACK       0x99    /* Next Track */\n#define DIK_NUMPADENTER     0x9C    /* Enter on numeric keypad */\n#define DIK_RCONTROL        0x9D\n#define DIK_MUTE\t    0xA0    /* Mute */\n#define DIK_CALCULATOR      0xA1    /* Calculator */\n#define DIK_PLAYPAUSE       0xA2    /* Play / Pause */\n#define DIK_MEDIASTOP       0xA4    /* Media Stop */\n#define DIK_VOLUMEDOWN      0xAE    /* Volume - */\n#define DIK_VOLUMEUP        0xB0    /* Volume + */\n#define DIK_WEBHOME         0xB2    /* Web home */\n#define DIK_NUMPADCOMMA     0xB3    /* , on numeric keypad (NEC PC98) */\n#define DIK_DIVIDE          0xB5    /* / on numeric keypad */\n#define DIK_SYSRQ           0xB7\n#define DIK_RMENU           0xB8    /* right Alt */\n#define DIK_PAUSE           0xC5    /* Pause */\n#define DIK_HOME            0xC7    /* Home on arrow keypad */\n#define DIK_UP              0xC8    /* UpArrow on arrow keypad */\n#define DIK_PRIOR           0xC9    /* PgUp on arrow keypad */\n#define DIK_LEFT            0xCB    /* LeftArrow on arrow keypad */\n#define DIK_RIGHT           0xCD    /* RightArrow on arrow keypad */\n#define DIK_END             0xCF    /* End on arrow keypad */\n#define DIK_DOWN            0xD0    /* DownArrow on arrow keypad */\n#define DIK_NEXT            0xD1    /* PgDn on arrow keypad */\n#define DIK_INSERT          0xD2    /* Insert on arrow keypad */\n#define DIK_DELETE          0xD3    /* Delete on arrow keypad */\n#define DIK_LWIN            0xDB    /* Left Windows key */\n#define DIK_RWIN            0xDC    /* Right Windows key */\n#define DIK_APPS            0xDD    /* AppMenu key */\n#define DIK_POWER           0xDE\n#define DIK_SLEEP           0xDF\n#define DIK_WAKE            0xE3    /* System Wake */\n#define DIK_WEBSEARCH       0xE5    /* Web Search */\n#define DIK_WEBFAVORITES    0xE6    /* Web Favorites */\n#define DIK_WEBREFRESH      0xE7    /* Web Refresh */\n#define DIK_WEBSTOP         0xE8    /* Web Stop */\n#define DIK_WEBFORWARD      0xE9    /* Web Forward */\n#define DIK_WEBBACK         0xEA    /* Web Back */\n#define DIK_MYCOMPUTER      0xEB    /* My Computer */\n#define DIK_MAIL            0xEC    /* Mail */\n#define DIK_MEDIASELECT     0xED    /* Media Select */\n\n#define DIK_BACKSPACE       DIK_BACK            /* backspace */\n#define DIK_NUMPADSTAR      DIK_MULTIPLY        /* * on numeric keypad */\n#define DIK_LALT            DIK_LMENU           /* left Alt */\n#define DIK_CAPSLOCK        DIK_CAPITAL         /* CapsLock */\n#define DIK_NUMPADMINUS     DIK_SUBTRACT        /* - on numeric keypad */\n#define DIK_NUMPADPLUS      DIK_ADD             /* + on numeric keypad */\n#define DIK_NUMPADPERIOD    DIK_DECIMAL         /* . on numeric keypad */\n#define DIK_NUMPADSLASH     DIK_DIVIDE          /* / on numeric keypad */\n#define DIK_RALT            DIK_RMENU           /* right Alt */\n#define DIK_UPARROW         DIK_UP              /* UpArrow on arrow keypad */\n#define DIK_PGUP            DIK_PRIOR           /* PgUp on arrow keypad */\n#define DIK_LEFTARROW       DIK_LEFT            /* LeftArrow on arrow keypad */\n#define DIK_RIGHTARROW      DIK_RIGHT           /* RightArrow on arrow keypad */\n#define DIK_DOWNARROW       DIK_DOWN            /* DownArrow on arrow keypad */\n#define DIK_PGDN            DIK_NEXT            /* PgDn on arrow keypad */\n\n#define DIDFT_ALL\t\t0x00000000\n#define DIDFT_RELAXIS\t\t0x00000001\n#define DIDFT_ABSAXIS\t\t0x00000002\n#define DIDFT_AXIS\t\t0x00000003\n#define DIDFT_PSHBUTTON\t\t0x00000004\n#define DIDFT_TGLBUTTON\t\t0x00000008\n#define DIDFT_BUTTON\t\t0x0000000C\n#define DIDFT_POV\t\t0x00000010\n#define DIDFT_COLLECTION\t0x00000040\n#define DIDFT_NODATA\t\t0x00000080\n#define DIDFT_ANYINSTANCE\t0x00FFFF00\n#define DIDFT_INSTANCEMASK\tDIDFT_ANYINSTANCE\n#define DIDFT_MAKEINSTANCE(n)\t((WORD)(n) << 8)\n#define DIDFT_GETTYPE(n)\tLOBYTE(n)\n#define DIDFT_GETINSTANCE(n)\tLOWORD((n) >> 8)\n#define DIDFT_FFACTUATOR\t0x01000000\n#define DIDFT_FFEFFECTTRIGGER\t0x02000000\n#if DIRECTINPUT_VERSION >= 0x050a\n#define DIDFT_OUTPUT\t\t0x10000000\n#define DIDFT_VENDORDEFINED\t0x04000000\n#define DIDFT_ALIAS\t\t0x08000000\n#endif /* DI5a */\n#ifndef DIDFT_OPTIONAL\n#define DIDFT_OPTIONAL\t\t0x80000000\n#endif\n#define DIDFT_ENUMCOLLECTION(n)\t((WORD)(n) << 8)\n#define DIDFT_NOCOLLECTION\t0x00FFFF00\n\n#define DIDF_ABSAXIS\t\t0x00000001\n#define DIDF_RELAXIS\t\t0x00000002\n\n#define DIGDD_PEEK\t\t0x00000001\n\n#define DISEQUENCE_COMPARE(dwSq1,cmp,dwSq2) ((int)((dwSq1) - (dwSq2)) cmp 0)\n\ntypedef struct DIDEVICEOBJECTDATA_DX3 {\n    DWORD\tdwOfs;\n    DWORD\tdwData;\n    DWORD\tdwTimeStamp;\n    DWORD\tdwSequence;\n} DIDEVICEOBJECTDATA_DX3,*LPDIDEVICEOBJECTDATA_DX3;\ntypedef const DIDEVICEOBJECTDATA_DX3 *LPCDIDEVICEOBJECTDATA_DX3;\n\ntypedef struct DIDEVICEOBJECTDATA {\n    DWORD\tdwOfs;\n    DWORD\tdwData;\n    DWORD\tdwTimeStamp;\n    DWORD\tdwSequence;\n#if(DIRECTINPUT_VERSION >= 0x0800)\n    UINT_PTR\tuAppData;\n#endif /* DIRECTINPUT_VERSION >= 0x0800 */\n} DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA;\ntypedef const DIDEVICEOBJECTDATA *LPCDIDEVICEOBJECTDATA;\n\ntypedef struct _DIOBJECTDATAFORMAT {\n    const GUID *pguid;\n    DWORD\tdwOfs;\n    DWORD\tdwType;\n    DWORD\tdwFlags;\n} DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT;\ntypedef const DIOBJECTDATAFORMAT *LPCDIOBJECTDATAFORMAT;\n\ntypedef struct _DIDATAFORMAT {\n    DWORD\t\t\tdwSize;\n    DWORD\t\t\tdwObjSize;\n    DWORD\t\t\tdwFlags;\n    DWORD\t\t\tdwDataSize;\n    DWORD\t\t\tdwNumObjs;\n    LPDIOBJECTDATAFORMAT\trgodf;\n} DIDATAFORMAT, *LPDIDATAFORMAT;\ntypedef const DIDATAFORMAT *LPCDIDATAFORMAT;\n\n#if DIRECTINPUT_VERSION >= 0x0500\n#define DIDOI_FFACTUATOR\t0x00000001\n#define DIDOI_FFEFFECTTRIGGER\t0x00000002\n#define DIDOI_POLLED\t\t0x00008000\n#define DIDOI_ASPECTPOSITION\t0x00000100\n#define DIDOI_ASPECTVELOCITY\t0x00000200\n#define DIDOI_ASPECTACCEL\t0x00000300\n#define DIDOI_ASPECTFORCE\t0x00000400\n#define DIDOI_ASPECTMASK\t0x00000F00\n#endif /* DI5 */\n#if DIRECTINPUT_VERSION >= 0x050a\n#define DIDOI_GUIDISUSAGE\t0x00010000\n#endif /* DI5a */\n\ntypedef struct DIPROPHEADER {\n    DWORD\tdwSize;\n    DWORD\tdwHeaderSize;\n    DWORD\tdwObj;\n    DWORD\tdwHow;\n} DIPROPHEADER,*LPDIPROPHEADER;\ntypedef const DIPROPHEADER *LPCDIPROPHEADER;\n\n#define DIPH_DEVICE\t0\n#define DIPH_BYOFFSET\t1\n#define DIPH_BYID\t2\n#if DIRECTINPUT_VERSION >= 0x050a\n#define DIPH_BYUSAGE\t3\n\n#define DIMAKEUSAGEDWORD(UsagePage, Usage) (DWORD)MAKELONG(Usage, UsagePage)\n#endif /* DI5a */\n\ntypedef struct DIPROPDWORD {\n\tDIPROPHEADER\tdiph;\n\tDWORD\t\tdwData;\n} DIPROPDWORD, *LPDIPROPDWORD;\ntypedef const DIPROPDWORD *LPCDIPROPDWORD;\n\ntypedef struct DIPROPRANGE {\n\tDIPROPHEADER\tdiph;\n\tLONG\t\tlMin;\n\tLONG\t\tlMax;\n} DIPROPRANGE, *LPDIPROPRANGE;\ntypedef const DIPROPRANGE *LPCDIPROPRANGE;\n\n#define DIPROPRANGE_NOMIN\t((LONG)0x80000000)\n#define DIPROPRANGE_NOMAX\t((LONG)0x7FFFFFFF)\n\n#if DIRECTINPUT_VERSION >= 0x050a\ntypedef struct DIPROPCAL {\n\tDIPROPHEADER diph;\n\tLONG\tlMin;\n\tLONG\tlCenter;\n\tLONG\tlMax;\n} DIPROPCAL, *LPDIPROPCAL;\ntypedef const DIPROPCAL *LPCDIPROPCAL;\n\ntypedef struct DIPROPCALPOV {\n\tDIPROPHEADER\tdiph;\n\tLONG\t\tlMin[5];\n\tLONG\t\tlMax[5];\n} DIPROPCALPOV, *LPDIPROPCALPOV;\ntypedef const DIPROPCALPOV *LPCDIPROPCALPOV;\n\ntypedef struct DIPROPGUIDANDPATH {\n\tDIPROPHEADER diph;\n\tGUID    guidClass;\n\tWCHAR   wszPath[MAX_PATH];\n} DIPROPGUIDANDPATH, *LPDIPROPGUIDANDPATH;\ntypedef const DIPROPGUIDANDPATH *LPCDIPROPGUIDANDPATH;\n\ntypedef struct DIPROPSTRING {\n        DIPROPHEADER diph;\n        WCHAR        wsz[MAX_PATH];\n} DIPROPSTRING, *LPDIPROPSTRING;\ntypedef const DIPROPSTRING *LPCDIPROPSTRING;\n#endif /* DI5a */\n\n#if DIRECTINPUT_VERSION >= 0x0800\ntypedef struct DIPROPPOINTER {\n\tDIPROPHEADER diph;\n\tUINT_PTR     uData;\n} DIPROPPOINTER, *LPDIPROPPOINTER;\ntypedef const DIPROPPOINTER *LPCDIPROPPOINTER;\n#endif /* DI8 */\n\n/* special property GUIDs */\n#ifdef __cplusplus\n#define MAKEDIPROP(prop)\t(*(const GUID *)(prop))\n#else\n#define MAKEDIPROP(prop)\t((REFGUID)(prop))\n#endif\n#define DIPROP_BUFFERSIZE\tMAKEDIPROP(1)\n#define DIPROP_AXISMODE\t\tMAKEDIPROP(2)\n\n#define DIPROPAXISMODE_ABS\t0\n#define DIPROPAXISMODE_REL\t1\n\n#define DIPROP_GRANULARITY\tMAKEDIPROP(3)\n#define DIPROP_RANGE\t\tMAKEDIPROP(4)\n#define DIPROP_DEADZONE\t\tMAKEDIPROP(5)\n#define DIPROP_SATURATION\tMAKEDIPROP(6)\n#define DIPROP_FFGAIN\t\tMAKEDIPROP(7)\n#define DIPROP_FFLOAD\t\tMAKEDIPROP(8)\n#define DIPROP_AUTOCENTER\tMAKEDIPROP(9)\n\n#define DIPROPAUTOCENTER_OFF\t0\n#define DIPROPAUTOCENTER_ON\t1\n\n#define DIPROP_CALIBRATIONMODE\tMAKEDIPROP(10)\n\n#define DIPROPCALIBRATIONMODE_COOKED\t0\n#define DIPROPCALIBRATIONMODE_RAW\t1\n\n#if DIRECTINPUT_VERSION >= 0x050a\n#define DIPROP_CALIBRATION\tMAKEDIPROP(11)\n#define DIPROP_GUIDANDPATH\tMAKEDIPROP(12)\n#define DIPROP_INSTANCENAME\tMAKEDIPROP(13)\n#define DIPROP_PRODUCTNAME\tMAKEDIPROP(14)\n#endif\n\n#if DIRECTINPUT_VERSION >= 0x5B2\n#define DIPROP_JOYSTICKID\tMAKEDIPROP(15)\n#define DIPROP_GETPORTDISPLAYNAME\tMAKEDIPROP(16)\n#endif\n\n#if DIRECTINPUT_VERSION >= 0x0700\n#define DIPROP_PHYSICALRANGE\tMAKEDIPROP(18)\n#define DIPROP_LOGICALRANGE\tMAKEDIPROP(19)\n#endif\n\n#if(DIRECTINPUT_VERSION >= 0x0800)\n#define DIPROP_KEYNAME\t\tMAKEDIPROP(20)\n#define DIPROP_CPOINTS\t\tMAKEDIPROP(21)\n#define DIPROP_APPDATA\t\tMAKEDIPROP(22)\n#define DIPROP_SCANCODE\t\tMAKEDIPROP(23)\n#define DIPROP_VIDPID\t\tMAKEDIPROP(24)\n#define DIPROP_USERNAME\t\tMAKEDIPROP(25)\n#define DIPROP_TYPENAME\t\tMAKEDIPROP(26)\n\n#define MAXCPOINTSNUM\t\t8\n\ntypedef struct _CPOINT {\n    LONG\tlP;\n    DWORD\tdwLog;\n} CPOINT, *PCPOINT;\n\ntypedef struct DIPROPCPOINTS {\n    DIPROPHEADER diph;\n    DWORD\tdwCPointsNum;\n    CPOINT\tcp[MAXCPOINTSNUM];\n} DIPROPCPOINTS, *LPDIPROPCPOINTS;\ntypedef const DIPROPCPOINTS *LPCDIPROPCPOINTS;\n#endif /* DI8 */\n\n\ntypedef struct DIDEVCAPS_DX3 {\n    DWORD\tdwSize;\n    DWORD\tdwFlags;\n    DWORD\tdwDevType;\n    DWORD\tdwAxes;\n    DWORD\tdwButtons;\n    DWORD\tdwPOVs;\n} DIDEVCAPS_DX3, *LPDIDEVCAPS_DX3;\n\ntypedef struct DIDEVCAPS {\n    DWORD\tdwSize;\n    DWORD\tdwFlags;\n    DWORD\tdwDevType;\n    DWORD\tdwAxes;\n    DWORD\tdwButtons;\n    DWORD\tdwPOVs;\n#if(DIRECTINPUT_VERSION >= 0x0500)\n    DWORD\tdwFFSamplePeriod;\n    DWORD\tdwFFMinTimeResolution;\n    DWORD\tdwFirmwareRevision;\n    DWORD\tdwHardwareRevision;\n    DWORD\tdwFFDriverVersion;\n#endif /* DIRECTINPUT_VERSION >= 0x0500 */\n} DIDEVCAPS,*LPDIDEVCAPS;\n\n#define DIDC_ATTACHED\t\t0x00000001\n#define DIDC_POLLEDDEVICE\t0x00000002\n#define DIDC_EMULATED\t\t0x00000004\n#define DIDC_POLLEDDATAFORMAT\t0x00000008\n#define DIDC_FORCEFEEDBACK\t0x00000100\n#define DIDC_FFATTACK\t\t0x00000200\n#define DIDC_FFFADE\t\t0x00000400\n#define DIDC_SATURATION\t\t0x00000800\n#define DIDC_POSNEGCOEFFICIENTS\t0x00001000\n#define DIDC_POSNEGSATURATION\t0x00002000\n#define DIDC_DEADBAND\t\t0x00004000\n#define DIDC_STARTDELAY\t\t0x00008000\n#define DIDC_ALIAS\t\t0x00010000\n#define DIDC_PHANTOM\t\t0x00020000\n#define DIDC_HIDDEN\t\t0x00040000\n\n\n/* SetCooperativeLevel dwFlags */\n#define DISCL_EXCLUSIVE\t\t0x00000001\n#define DISCL_NONEXCLUSIVE\t0x00000002\n#define DISCL_FOREGROUND\t0x00000004\n#define DISCL_BACKGROUND\t0x00000008\n#define DISCL_NOWINKEY          0x00000010\n\n#if (DIRECTINPUT_VERSION >= 0x0500)\n/* Device FF flags */\n#define DISFFC_RESET            0x00000001\n#define DISFFC_STOPALL          0x00000002\n#define DISFFC_PAUSE            0x00000004\n#define DISFFC_CONTINUE         0x00000008\n#define DISFFC_SETACTUATORSON   0x00000010\n#define DISFFC_SETACTUATORSOFF  0x00000020\n\n#define DIGFFS_EMPTY            0x00000001\n#define DIGFFS_STOPPED          0x00000002\n#define DIGFFS_PAUSED           0x00000004\n#define DIGFFS_ACTUATORSON      0x00000010\n#define DIGFFS_ACTUATORSOFF     0x00000020\n#define DIGFFS_POWERON          0x00000040\n#define DIGFFS_POWEROFF         0x00000080\n#define DIGFFS_SAFETYSWITCHON   0x00000100\n#define DIGFFS_SAFETYSWITCHOFF  0x00000200\n#define DIGFFS_USERFFSWITCHON   0x00000400\n#define DIGFFS_USERFFSWITCHOFF  0x00000800\n#define DIGFFS_DEVICELOST       0x80000000\n\n/* Effect flags */\n#define DIEFT_ALL\t\t0x00000000\n\n#define DIEFT_CONSTANTFORCE\t0x00000001\n#define DIEFT_RAMPFORCE\t\t0x00000002\n#define DIEFT_PERIODIC\t\t0x00000003\n#define DIEFT_CONDITION\t\t0x00000004\n#define DIEFT_CUSTOMFORCE\t0x00000005\n#define DIEFT_HARDWARE\t\t0x000000FF\n#define DIEFT_FFATTACK\t\t0x00000200\n#define DIEFT_FFFADE\t\t0x00000400\n#define DIEFT_SATURATION\t0x00000800\n#define DIEFT_POSNEGCOEFFICIENTS 0x00001000\n#define DIEFT_POSNEGSATURATION\t0x00002000\n#define DIEFT_DEADBAND\t\t0x00004000\n#define DIEFT_STARTDELAY\t0x00008000\n#define DIEFT_GETTYPE(n)\tLOBYTE(n)\n\n#define DIEFF_OBJECTIDS         0x00000001\n#define DIEFF_OBJECTOFFSETS     0x00000002\n#define DIEFF_CARTESIAN         0x00000010\n#define DIEFF_POLAR             0x00000020\n#define DIEFF_SPHERICAL         0x00000040\n\n#define DIEP_DURATION           0x00000001\n#define DIEP_SAMPLEPERIOD       0x00000002\n#define DIEP_GAIN               0x00000004\n#define DIEP_TRIGGERBUTTON      0x00000008\n#define DIEP_TRIGGERREPEATINTERVAL 0x00000010\n#define DIEP_AXES               0x00000020\n#define DIEP_DIRECTION          0x00000040\n#define DIEP_ENVELOPE           0x00000080\n#define DIEP_TYPESPECIFICPARAMS 0x00000100\n#if(DIRECTINPUT_VERSION >= 0x0600)\n#define DIEP_STARTDELAY         0x00000200\n#define DIEP_ALLPARAMS_DX5      0x000001FF\n#define DIEP_ALLPARAMS          0x000003FF\n#else\n#define DIEP_ALLPARAMS          0x000001FF\n#endif /* DIRECTINPUT_VERSION >= 0x0600 */\n#define DIEP_START              0x20000000\n#define DIEP_NORESTART          0x40000000\n#define DIEP_NODOWNLOAD         0x80000000\n#define DIEB_NOTRIGGER          0xFFFFFFFF\n\n#define DIES_SOLO               0x00000001\n#define DIES_NODOWNLOAD         0x80000000\n\n#define DIEGES_PLAYING          0x00000001\n#define DIEGES_EMULATED         0x00000002\n\n#define DI_DEGREES\t\t100\n#define DI_FFNOMINALMAX\t\t10000\n#define DI_SECONDS\t\t1000000\n\ntypedef struct DICONSTANTFORCE {\n\tLONG\t\t\tlMagnitude;\n} DICONSTANTFORCE, *LPDICONSTANTFORCE;\ntypedef const DICONSTANTFORCE *LPCDICONSTANTFORCE;\n\ntypedef struct DIRAMPFORCE {\n\tLONG\t\t\tlStart;\n\tLONG\t\t\tlEnd;\n} DIRAMPFORCE, *LPDIRAMPFORCE;\ntypedef const DIRAMPFORCE *LPCDIRAMPFORCE;\n\ntypedef struct DIPERIODIC {\n\tDWORD\t\t\tdwMagnitude;\n\tLONG\t\t\tlOffset;\n\tDWORD\t\t\tdwPhase;\n\tDWORD\t\t\tdwPeriod;\n} DIPERIODIC, *LPDIPERIODIC;\ntypedef const DIPERIODIC *LPCDIPERIODIC;\n\ntypedef struct DICONDITION {\n\tLONG\t\t\tlOffset;\n\tLONG\t\t\tlPositiveCoefficient;\n\tLONG\t\t\tlNegativeCoefficient;\n\tDWORD\t\t\tdwPositiveSaturation;\n\tDWORD\t\t\tdwNegativeSaturation;\n\tLONG\t\t\tlDeadBand;\n} DICONDITION, *LPDICONDITION;\ntypedef const DICONDITION *LPCDICONDITION;\n\ntypedef struct DICUSTOMFORCE {\n\tDWORD\t\t\tcChannels;\n\tDWORD\t\t\tdwSamplePeriod;\n\tDWORD\t\t\tcSamples;\n\tLPLONG\t\t\trglForceData;\n} DICUSTOMFORCE, *LPDICUSTOMFORCE;\ntypedef const DICUSTOMFORCE *LPCDICUSTOMFORCE;\n\ntypedef struct DIENVELOPE {\n\tDWORD\t\t\tdwSize;\n\tDWORD\t\t\tdwAttackLevel;\n\tDWORD\t\t\tdwAttackTime;\n\tDWORD\t\t\tdwFadeLevel;\n\tDWORD\t\t\tdwFadeTime;\n} DIENVELOPE, *LPDIENVELOPE;\ntypedef const DIENVELOPE *LPCDIENVELOPE;\n\ntypedef struct DIEFFECT_DX5 {\n\tDWORD\t\t\tdwSize;\n\tDWORD\t\t\tdwFlags;\n\tDWORD\t\t\tdwDuration;\n\tDWORD\t\t\tdwSamplePeriod;\n\tDWORD\t\t\tdwGain;\n\tDWORD\t\t\tdwTriggerButton;\n\tDWORD\t\t\tdwTriggerRepeatInterval;\n\tDWORD\t\t\tcAxes;\n\tLPDWORD\t\t\trgdwAxes;\n\tLPLONG\t\t\trglDirection;\n\tLPDIENVELOPE\t\tlpEnvelope;\n\tDWORD\t\t\tcbTypeSpecificParams;\n\tLPVOID\t\t\tlpvTypeSpecificParams;\n} DIEFFECT_DX5, *LPDIEFFECT_DX5;\ntypedef const DIEFFECT_DX5 *LPCDIEFFECT_DX5;\n\ntypedef struct DIEFFECT {\n\tDWORD\t\t\tdwSize;\n\tDWORD\t\t\tdwFlags;\n\tDWORD\t\t\tdwDuration;\n\tDWORD\t\t\tdwSamplePeriod;\n\tDWORD\t\t\tdwGain;\n\tDWORD\t\t\tdwTriggerButton;\n\tDWORD\t\t\tdwTriggerRepeatInterval;\n\tDWORD\t\t\tcAxes;\n\tLPDWORD\t\t\trgdwAxes;\n\tLPLONG\t\t\trglDirection;\n\tLPDIENVELOPE\t\tlpEnvelope;\n\tDWORD\t\t\tcbTypeSpecificParams;\n\tLPVOID\t\t\tlpvTypeSpecificParams;\n#if(DIRECTINPUT_VERSION >= 0x0600)\n\tDWORD\t\t\tdwStartDelay;\n#endif /* DIRECTINPUT_VERSION >= 0x0600 */\n} DIEFFECT, *LPDIEFFECT;\ntypedef const DIEFFECT *LPCDIEFFECT;\ntypedef DIEFFECT DIEFFECT_DX6;\ntypedef LPDIEFFECT LPDIEFFECT_DX6;\n\ntypedef struct DIEFFECTINFOA {\n\tDWORD\t\t\tdwSize;\n\tGUID\t\t\tguid;\n\tDWORD\t\t\tdwEffType;\n\tDWORD\t\t\tdwStaticParams;\n\tDWORD\t\t\tdwDynamicParams;\n\tCHAR\t\t\ttszName[MAX_PATH];\n} DIEFFECTINFOA, *LPDIEFFECTINFOA;\ntypedef const DIEFFECTINFOA *LPCDIEFFECTINFOA;\n\ntypedef struct DIEFFECTINFOW {\n\tDWORD\t\t\tdwSize;\n\tGUID\t\t\tguid;\n\tDWORD\t\t\tdwEffType;\n\tDWORD\t\t\tdwStaticParams;\n\tDWORD\t\t\tdwDynamicParams;\n\tWCHAR\t\t\ttszName[MAX_PATH];\n} DIEFFECTINFOW, *LPDIEFFECTINFOW;\ntypedef const DIEFFECTINFOW *LPCDIEFFECTINFOW;\n\nDECL_WINELIB_TYPE_AW(DIEFFECTINFO)\nDECL_WINELIB_TYPE_AW(LPDIEFFECTINFO)\nDECL_WINELIB_TYPE_AW(LPCDIEFFECTINFO)\n\ntypedef BOOL (CALLBACK *LPDIENUMEFFECTSCALLBACKA)(LPCDIEFFECTINFOA, LPVOID);\ntypedef BOOL (CALLBACK *LPDIENUMEFFECTSCALLBACKW)(LPCDIEFFECTINFOW, LPVOID);\n\ntypedef struct DIEFFESCAPE {\n\tDWORD\tdwSize;\n\tDWORD\tdwCommand;\n\tLPVOID\tlpvInBuffer;\n\tDWORD\tcbInBuffer;\n\tLPVOID\tlpvOutBuffer;\n\tDWORD\tcbOutBuffer;\n} DIEFFESCAPE, *LPDIEFFESCAPE;\n\ntypedef struct DIJOYSTATE {\n\tLONG\tlX;\n\tLONG\tlY;\n\tLONG\tlZ;\n\tLONG\tlRx;\n\tLONG\tlRy;\n\tLONG\tlRz;\n\tLONG\trglSlider[2];\n\tDWORD\trgdwPOV[4];\n\tBYTE\trgbButtons[32];\n} DIJOYSTATE, *LPDIJOYSTATE;\n\ntypedef struct DIJOYSTATE2 {\n\tLONG\tlX;\n\tLONG\tlY;\n\tLONG\tlZ;\n\tLONG\tlRx;\n\tLONG\tlRy;\n\tLONG\tlRz;\n\tLONG\trglSlider[2];\n\tDWORD\trgdwPOV[4];\n\tBYTE\trgbButtons[128];\n\tLONG\tlVX;\t\t/* 'v' as in velocity */\n\tLONG\tlVY;\n\tLONG\tlVZ;\n\tLONG\tlVRx;\n\tLONG\tlVRy;\n\tLONG\tlVRz;\n\tLONG\trglVSlider[2];\n\tLONG\tlAX;\t\t/* 'a' as in acceleration */\n\tLONG\tlAY;\n\tLONG\tlAZ;\n\tLONG\tlARx;\n\tLONG\tlARy;\n\tLONG\tlARz;\n\tLONG\trglASlider[2];\n\tLONG\tlFX;\t\t/* 'f' as in force */\n\tLONG\tlFY;\n\tLONG\tlFZ;\n\tLONG\tlFRx;\t\t/* 'fr' as in rotational force aka torque */\n\tLONG\tlFRy;\n\tLONG\tlFRz;\n\tLONG\trglFSlider[2];\n} DIJOYSTATE2, *LPDIJOYSTATE2;\n\n#define DIJOFS_X\t\tFIELD_OFFSET(DIJOYSTATE, lX)\n#define DIJOFS_Y\t\tFIELD_OFFSET(DIJOYSTATE, lY)\n#define DIJOFS_Z\t\tFIELD_OFFSET(DIJOYSTATE, lZ)\n#define DIJOFS_RX\t\tFIELD_OFFSET(DIJOYSTATE, lRx)\n#define DIJOFS_RY\t\tFIELD_OFFSET(DIJOYSTATE, lRy)\n#define DIJOFS_RZ\t\tFIELD_OFFSET(DIJOYSTATE, lRz)\n#define DIJOFS_SLIDER(n)\t(FIELD_OFFSET(DIJOYSTATE, rglSlider) + \\\n                                                        (n) * sizeof(LONG))\n#define DIJOFS_POV(n)\t\t(FIELD_OFFSET(DIJOYSTATE, rgdwPOV) + \\\n                                                        (n) * sizeof(DWORD))\n#define DIJOFS_BUTTON(n)\t(FIELD_OFFSET(DIJOYSTATE, rgbButtons) + (n))\n#define DIJOFS_BUTTON0\t\tDIJOFS_BUTTON(0)\n#define DIJOFS_BUTTON1\t\tDIJOFS_BUTTON(1)\n#define DIJOFS_BUTTON2\t\tDIJOFS_BUTTON(2)\n#define DIJOFS_BUTTON3\t\tDIJOFS_BUTTON(3)\n#define DIJOFS_BUTTON4\t\tDIJOFS_BUTTON(4)\n#define DIJOFS_BUTTON5\t\tDIJOFS_BUTTON(5)\n#define DIJOFS_BUTTON6\t\tDIJOFS_BUTTON(6)\n#define DIJOFS_BUTTON7\t\tDIJOFS_BUTTON(7)\n#define DIJOFS_BUTTON8\t\tDIJOFS_BUTTON(8)\n#define DIJOFS_BUTTON9\t\tDIJOFS_BUTTON(9)\n#define DIJOFS_BUTTON10\t\tDIJOFS_BUTTON(10)\n#define DIJOFS_BUTTON11\t\tDIJOFS_BUTTON(11)\n#define DIJOFS_BUTTON12\t\tDIJOFS_BUTTON(12)\n#define DIJOFS_BUTTON13\t\tDIJOFS_BUTTON(13)\n#define DIJOFS_BUTTON14\t\tDIJOFS_BUTTON(14)\n#define DIJOFS_BUTTON15\t\tDIJOFS_BUTTON(15)\n#define DIJOFS_BUTTON16\t\tDIJOFS_BUTTON(16)\n#define DIJOFS_BUTTON17\t\tDIJOFS_BUTTON(17)\n#define DIJOFS_BUTTON18\t\tDIJOFS_BUTTON(18)\n#define DIJOFS_BUTTON19\t\tDIJOFS_BUTTON(19)\n#define DIJOFS_BUTTON20\t\tDIJOFS_BUTTON(20)\n#define DIJOFS_BUTTON21\t\tDIJOFS_BUTTON(21)\n#define DIJOFS_BUTTON22\t\tDIJOFS_BUTTON(22)\n#define DIJOFS_BUTTON23\t\tDIJOFS_BUTTON(23)\n#define DIJOFS_BUTTON24\t\tDIJOFS_BUTTON(24)\n#define DIJOFS_BUTTON25\t\tDIJOFS_BUTTON(25)\n#define DIJOFS_BUTTON26\t\tDIJOFS_BUTTON(26)\n#define DIJOFS_BUTTON27\t\tDIJOFS_BUTTON(27)\n#define DIJOFS_BUTTON28\t\tDIJOFS_BUTTON(28)\n#define DIJOFS_BUTTON29\t\tDIJOFS_BUTTON(29)\n#define DIJOFS_BUTTON30\t\tDIJOFS_BUTTON(30)\n#define DIJOFS_BUTTON31\t\tDIJOFS_BUTTON(31)\n#endif /* DIRECTINPUT_VERSION >= 0x0500 */\n\n/* DInput 7 structures, types */\n#if(DIRECTINPUT_VERSION >= 0x0700)\ntypedef struct DIFILEEFFECT {\n  DWORD       dwSize;\n  GUID        GuidEffect;\n  LPCDIEFFECT lpDiEffect;\n  CHAR        szFriendlyName[MAX_PATH];\n} DIFILEEFFECT, *LPDIFILEEFFECT;\n\ntypedef const DIFILEEFFECT *LPCDIFILEEFFECT;\ntypedef BOOL (CALLBACK *LPDIENUMEFFECTSINFILECALLBACK)(LPCDIFILEEFFECT , LPVOID);\n#endif /* DIRECTINPUT_VERSION >= 0x0700 */\n\n/* DInput 8 structures and types */\n#if DIRECTINPUT_VERSION >= 0x0800\ntypedef struct _DIACTIONA {\n\tUINT_PTR\tuAppData;\n\tDWORD\t\tdwSemantic;\n\tDWORD\t\tdwFlags;\n\t__GNU_EXTENSION union {\n\t\tLPCSTR\tlptszActionName;\n\t\tUINT\tuResIdString;\n\t} DUMMYUNIONNAME;\n\tGUID\t\tguidInstance;\n\tDWORD\t\tdwObjID;\n\tDWORD\t\tdwHow;\n} DIACTIONA, *LPDIACTIONA;\ntypedef const DIACTIONA *LPCDIACTIONA;\n\ntypedef struct _DIACTIONW {\n\tUINT_PTR\tuAppData;\n\tDWORD\t\tdwSemantic;\n\tDWORD\t\tdwFlags;\n\t__GNU_EXTENSION union {\n\t\tLPCWSTR\tlptszActionName;\n\t\tUINT\tuResIdString;\n\t} DUMMYUNIONNAME;\n\tGUID\t\tguidInstance;\n\tDWORD\t\tdwObjID;\n\tDWORD\t\tdwHow;\n} DIACTIONW, *LPDIACTIONW;\ntypedef const DIACTIONW *LPCDIACTIONW;\n\nDECL_WINELIB_TYPE_AW(DIACTION)\nDECL_WINELIB_TYPE_AW(LPDIACTION)\nDECL_WINELIB_TYPE_AW(LPCDIACTION)\n\n#define DIA_FORCEFEEDBACK\t0x00000001\n#define DIA_APPMAPPED\t\t0x00000002\n#define DIA_APPNOMAP\t\t0x00000004\n#define DIA_NORANGE\t\t0x00000008\n#define DIA_APPFIXED\t\t0x00000010\n\n#define DIAH_UNMAPPED\t\t0x00000000\n#define DIAH_USERCONFIG\t\t0x00000001\n#define DIAH_APPREQUESTED\t0x00000002\n#define DIAH_HWAPP\t\t0x00000004\n#define DIAH_HWDEFAULT\t\t0x00000008\n#define DIAH_DEFAULT\t\t0x00000020\n#define DIAH_ERROR\t\t0x80000000\n\ntypedef struct _DIACTIONFORMATA {\n\tDWORD\t\tdwSize;\n\tDWORD\t\tdwActionSize;\n\tDWORD\t\tdwDataSize;\n\tDWORD\t\tdwNumActions;\n\tLPDIACTIONA\trgoAction;\n\tGUID\t\tguidActionMap;\n\tDWORD\t\tdwGenre;\n\tDWORD\t\tdwBufferSize;\n\tLONG\t\tlAxisMin;\n\tLONG\t\tlAxisMax;\n\tHINSTANCE\thInstString;\n\tFILETIME\tftTimeStamp;\n\tDWORD\t\tdwCRC;\n\tCHAR\t\ttszActionMap[MAX_PATH];\n} DIACTIONFORMATA, *LPDIACTIONFORMATA;\ntypedef const DIACTIONFORMATA *LPCDIACTIONFORMATA;\n\ntypedef struct _DIACTIONFORMATW {\n\tDWORD\t\tdwSize;\n\tDWORD\t\tdwActionSize;\n\tDWORD\t\tdwDataSize;\n\tDWORD\t\tdwNumActions;\n\tLPDIACTIONW\trgoAction;\n\tGUID\t\tguidActionMap;\n\tDWORD\t\tdwGenre;\n\tDWORD\t\tdwBufferSize;\n\tLONG\t\tlAxisMin;\n\tLONG\t\tlAxisMax;\n\tHINSTANCE\thInstString;\n\tFILETIME\tftTimeStamp;\n\tDWORD\t\tdwCRC;\n\tWCHAR\t\ttszActionMap[MAX_PATH];\n} DIACTIONFORMATW, *LPDIACTIONFORMATW;\ntypedef const DIACTIONFORMATW *LPCDIACTIONFORMATW;\n\nDECL_WINELIB_TYPE_AW(DIACTIONFORMAT)\nDECL_WINELIB_TYPE_AW(LPDIACTIONFORMAT)\nDECL_WINELIB_TYPE_AW(LPCDIACTIONFORMAT)\n\n#define DIAFTS_NEWDEVICELOW\t0xFFFFFFFF\n#define DIAFTS_NEWDEVICEHIGH\t0xFFFFFFFF\n#define DIAFTS_UNUSEDDEVICELOW\t0x00000000\n#define DIAFTS_UNUSEDDEVICEHIGH\t0x00000000\n\n#define DIDBAM_DEFAULT\t\t0x00000000\n#define DIDBAM_PRESERVE\t\t0x00000001\n#define DIDBAM_INITIALIZE\t0x00000002\n#define DIDBAM_HWDEFAULTS\t0x00000004\n\n#define DIDSAM_DEFAULT\t\t0x00000000\n#define DIDSAM_NOUSER\t\t0x00000001\n#define DIDSAM_FORCESAVE\t0x00000002\n\n#define DICD_DEFAULT\t\t0x00000000\n#define DICD_EDIT\t\t0x00000001\n\n#ifndef D3DCOLOR_DEFINED\ntypedef DWORD D3DCOLOR;\n#define D3DCOLOR_DEFINED\n#endif\n\ntypedef struct _DICOLORSET {\n\tDWORD\t\tdwSize;\n\tD3DCOLOR\tcTextFore;\n\tD3DCOLOR\tcTextHighlight;\n\tD3DCOLOR\tcCalloutLine;\n\tD3DCOLOR\tcCalloutHighlight;\n\tD3DCOLOR\tcBorder;\n\tD3DCOLOR\tcControlFill;\n\tD3DCOLOR\tcHighlightFill;\n\tD3DCOLOR\tcAreaFill;\n} DICOLORSET, *LPDICOLORSET;\ntypedef const DICOLORSET *LPCDICOLORSET;\n\ntypedef struct _DICONFIGUREDEVICESPARAMSA {\n\tDWORD\t\t\tdwSize;\n\tDWORD\t\t\tdwcUsers;\n\tLPSTR\t\t\tlptszUserNames;\n\tDWORD\t\t\tdwcFormats;\n\tLPDIACTIONFORMATA\tlprgFormats;\n\tHWND\t\t\thwnd;\n\tDICOLORSET\t\tdics;\n\tLPUNKNOWN\t\tlpUnkDDSTarget;\n} DICONFIGUREDEVICESPARAMSA, *LPDICONFIGUREDEVICESPARAMSA;\ntypedef const DICONFIGUREDEVICESPARAMSA *LPCDICONFIGUREDEVICESPARAMSA;\n\ntypedef struct _DICONFIGUREDEVICESPARAMSW {\n\tDWORD\t\t\tdwSize;\n\tDWORD\t\t\tdwcUsers;\n\tLPWSTR\t\t\tlptszUserNames;\n\tDWORD\t\t\tdwcFormats;\n\tLPDIACTIONFORMATW\tlprgFormats;\n\tHWND\t\t\thwnd;\n\tDICOLORSET\t\tdics;\n\tLPUNKNOWN\t\tlpUnkDDSTarget;\n} DICONFIGUREDEVICESPARAMSW, *LPDICONFIGUREDEVICESPARAMSW;\ntypedef const DICONFIGUREDEVICESPARAMSW *LPCDICONFIGUREDEVICESPARAMSW;\n\nDECL_WINELIB_TYPE_AW(DICONFIGUREDEVICESPARAMS)\nDECL_WINELIB_TYPE_AW(LPDICONFIGUREDEVICESPARAMS)\nDECL_WINELIB_TYPE_AW(LPCDICONFIGUREDEVICESPARAMS)\n\n#define DIDIFT_CONFIGURATION\t0x00000001\n#define DIDIFT_OVERLAY\t\t0x00000002\n\n#define DIDAL_CENTERED\t\t0x00000000\n#define DIDAL_LEFTALIGNED\t0x00000001\n#define DIDAL_RIGHTALIGNED\t0x00000002\n#define DIDAL_MIDDLE\t\t0x00000000\n#define DIDAL_TOPALIGNED\t0x00000004\n#define DIDAL_BOTTOMALIGNED\t0x00000008\n\ntypedef struct _DIDEVICEIMAGEINFOA {\n\tCHAR\ttszImagePath[MAX_PATH];\n\tDWORD\tdwFlags;\n\tDWORD\tdwViewID;\n\tRECT\trcOverlay;\n\tDWORD\tdwObjID;\n\tDWORD\tdwcValidPts;\n\tPOINT\trgptCalloutLine[5];\n\tRECT\trcCalloutRect;\n\tDWORD\tdwTextAlign;\n} DIDEVICEIMAGEINFOA, *LPDIDEVICEIMAGEINFOA;\ntypedef const DIDEVICEIMAGEINFOA *LPCDIDEVICEIMAGEINFOA;\n\ntypedef struct _DIDEVICEIMAGEINFOW {\n\tWCHAR\ttszImagePath[MAX_PATH];\n\tDWORD\tdwFlags;\n\tDWORD\tdwViewID;\n\tRECT\trcOverlay;\n\tDWORD\tdwObjID;\n\tDWORD\tdwcValidPts;\n\tPOINT\trgptCalloutLine[5];\n\tRECT\trcCalloutRect;\n\tDWORD\tdwTextAlign;\n} DIDEVICEIMAGEINFOW, *LPDIDEVICEIMAGEINFOW;\ntypedef const DIDEVICEIMAGEINFOW *LPCDIDEVICEIMAGEINFOW;\n\nDECL_WINELIB_TYPE_AW(DIDEVICEIMAGEINFO)\nDECL_WINELIB_TYPE_AW(LPDIDEVICEIMAGEINFO)\nDECL_WINELIB_TYPE_AW(LPCDIDEVICEIMAGEINFO)\n\ntypedef struct _DIDEVICEIMAGEINFOHEADERA {\n\tDWORD\tdwSize;\n\tDWORD\tdwSizeImageInfo;\n\tDWORD\tdwcViews;\n\tDWORD\tdwcButtons;\n\tDWORD\tdwcAxes;\n\tDWORD\tdwcPOVs;\n\tDWORD\tdwBufferSize;\n\tDWORD\tdwBufferUsed;\n\tLPDIDEVICEIMAGEINFOA\tlprgImageInfoArray;\n} DIDEVICEIMAGEINFOHEADERA, *LPDIDEVICEIMAGEINFOHEADERA;\ntypedef const DIDEVICEIMAGEINFOHEADERA *LPCDIDEVICEIMAGEINFOHEADERA;\n\ntypedef struct _DIDEVICEIMAGEINFOHEADERW {\n\tDWORD\tdwSize;\n\tDWORD\tdwSizeImageInfo;\n\tDWORD\tdwcViews;\n\tDWORD\tdwcButtons;\n\tDWORD\tdwcAxes;\n\tDWORD\tdwcPOVs;\n\tDWORD\tdwBufferSize;\n\tDWORD\tdwBufferUsed;\n\tLPDIDEVICEIMAGEINFOW\tlprgImageInfoArray;\n} DIDEVICEIMAGEINFOHEADERW, *LPDIDEVICEIMAGEINFOHEADERW;\ntypedef const DIDEVICEIMAGEINFOHEADERW *LPCDIDEVICEIMAGEINFOHEADERW;\n\nDECL_WINELIB_TYPE_AW(DIDEVICEIMAGEINFOHEADER)\nDECL_WINELIB_TYPE_AW(LPDIDEVICEIMAGEINFOHEADER)\nDECL_WINELIB_TYPE_AW(LPCDIDEVICEIMAGEINFOHEADER)\n\n#endif /* DI8 */\n\n\n/*****************************************************************************\n * IDirectInputEffect interface\n */\n#if (DIRECTINPUT_VERSION >= 0x0500)\n#undef INTERFACE\n#define INTERFACE IDirectInputEffect\nDECLARE_INTERFACE_(IDirectInputEffect,IUnknown)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputEffect methods ***/\n    STDMETHOD(Initialize)(THIS_ HINSTANCE, DWORD, REFGUID) PURE;\n    STDMETHOD(GetEffectGuid)(THIS_ LPGUID) PURE;\n    STDMETHOD(GetParameters)(THIS_ LPDIEFFECT, DWORD) PURE;\n    STDMETHOD(SetParameters)(THIS_ LPCDIEFFECT, DWORD) PURE;\n    STDMETHOD(Start)(THIS_ DWORD, DWORD) PURE;\n    STDMETHOD(Stop)(THIS) PURE;\n    STDMETHOD(GetEffectStatus)(THIS_ LPDWORD) PURE;\n    STDMETHOD(Download)(THIS) PURE;\n    STDMETHOD(Unload)(THIS) PURE;\n    STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE;\n};\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInputEffect_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInputEffect_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInputEffect_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInputEffect methods ***/\n#define IDirectInputEffect_Initialize(p,a,b,c)    (p)->lpVtbl->Initialize(p,a,b,c)\n#define IDirectInputEffect_GetEffectGuid(p,a)     (p)->lpVtbl->GetEffectGuid(p,a)\n#define IDirectInputEffect_GetParameters(p,a,b)   (p)->lpVtbl->GetParameters(p,a,b)\n#define IDirectInputEffect_SetParameters(p,a,b)   (p)->lpVtbl->SetParameters(p,a,b)\n#define IDirectInputEffect_Start(p,a,b)           (p)->lpVtbl->Start(p,a,b)\n#define IDirectInputEffect_Stop(p)                (p)->lpVtbl->Stop(p)\n#define IDirectInputEffect_GetEffectStatus(p,a)   (p)->lpVtbl->GetEffectStatus(p,a)\n#define IDirectInputEffect_Download(p)            (p)->lpVtbl->Download(p)\n#define IDirectInputEffect_Unload(p)              (p)->lpVtbl->Unload(p)\n#define IDirectInputEffect_Escape(p,a)            (p)->lpVtbl->Escape(p,a)\n#else\n/*** IUnknown methods ***/\n#define IDirectInputEffect_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInputEffect_AddRef(p)             (p)->AddRef()\n#define IDirectInputEffect_Release(p)            (p)->Release()\n/*** IDirectInputEffect methods ***/\n#define IDirectInputEffect_Initialize(p,a,b,c)    (p)->Initialize(a,b,c)\n#define IDirectInputEffect_GetEffectGuid(p,a)     (p)->GetEffectGuid(a)\n#define IDirectInputEffect_GetParameters(p,a,b)   (p)->GetParameters(a,b)\n#define IDirectInputEffect_SetParameters(p,a,b)   (p)->SetParameters(a,b)\n#define IDirectInputEffect_Start(p,a,b)           (p)->Start(a,b)\n#define IDirectInputEffect_Stop(p)                (p)->Stop()\n#define IDirectInputEffect_GetEffectStatus(p,a)   (p)->GetEffectStatus(a)\n#define IDirectInputEffect_Download(p)            (p)->Download()\n#define IDirectInputEffect_Unload(p)              (p)->Unload()\n#define IDirectInputEffect_Escape(p,a)            (p)->Escape(a)\n#endif\n\n#endif /* DI5 */\n\n\n/*****************************************************************************\n * IDirectInputDeviceA interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputDeviceA\nDECLARE_INTERFACE_(IDirectInputDeviceA,IUnknown)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputDeviceA methods ***/\n    STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE;\n    STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE;\n    STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE;\n    STDMETHOD(Acquire)(THIS) PURE;\n    STDMETHOD(Unacquire)(THIS) PURE;\n    STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE;\n    STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE;\n    STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE;\n    STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE;\n    STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE;\n    STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) PURE;\n    STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;\n};\n\n/*****************************************************************************\n * IDirectInputDeviceW interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputDeviceW\nDECLARE_INTERFACE_(IDirectInputDeviceW,IUnknown)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputDeviceW methods ***/\n    STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE;\n    STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE;\n    STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE;\n    STDMETHOD(Acquire)(THIS) PURE;\n    STDMETHOD(Unacquire)(THIS) PURE;\n    STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE;\n    STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE;\n    STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE;\n    STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE;\n    STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE;\n    STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE;\n    STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;\n};\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInputDevice_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInputDevice_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInputDevice methods ***/\n#define IDirectInputDevice_GetCapabilities(p,a)       (p)->lpVtbl->GetCapabilities(p,a)\n#define IDirectInputDevice_EnumObjects(p,a,b,c)       (p)->lpVtbl->EnumObjects(p,a,b,c)\n#define IDirectInputDevice_GetProperty(p,a,b)         (p)->lpVtbl->GetProperty(p,a,b)\n#define IDirectInputDevice_SetProperty(p,a,b)         (p)->lpVtbl->SetProperty(p,a,b)\n#define IDirectInputDevice_Acquire(p)                 (p)->lpVtbl->Acquire(p)\n#define IDirectInputDevice_Unacquire(p)               (p)->lpVtbl->Unacquire(p)\n#define IDirectInputDevice_GetDeviceState(p,a,b)      (p)->lpVtbl->GetDeviceState(p,a,b)\n#define IDirectInputDevice_GetDeviceData(p,a,b,c,d)   (p)->lpVtbl->GetDeviceData(p,a,b,c,d)\n#define IDirectInputDevice_SetDataFormat(p,a)         (p)->lpVtbl->SetDataFormat(p,a)\n#define IDirectInputDevice_SetEventNotification(p,a)  (p)->lpVtbl->SetEventNotification(p,a)\n#define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)\n#define IDirectInputDevice_GetObjectInfo(p,a,b,c)     (p)->lpVtbl->GetObjectInfo(p,a,b,c)\n#define IDirectInputDevice_GetDeviceInfo(p,a)         (p)->lpVtbl->GetDeviceInfo(p,a)\n#define IDirectInputDevice_RunControlPanel(p,a,b)     (p)->lpVtbl->RunControlPanel(p,a,b)\n#define IDirectInputDevice_Initialize(p,a,b,c)        (p)->lpVtbl->Initialize(p,a,b,c)\n#else\n/*** IUnknown methods ***/\n#define IDirectInputDevice_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInputDevice_AddRef(p)             (p)->AddRef()\n#define IDirectInputDevice_Release(p)            (p)->Release()\n/*** IDirectInputDevice methods ***/\n#define IDirectInputDevice_GetCapabilities(p,a)       (p)->GetCapabilities(a)\n#define IDirectInputDevice_EnumObjects(p,a,b,c)       (p)->EnumObjects(a,b,c)\n#define IDirectInputDevice_GetProperty(p,a,b)         (p)->GetProperty(a,b)\n#define IDirectInputDevice_SetProperty(p,a,b)         (p)->SetProperty(a,b)\n#define IDirectInputDevice_Acquire(p)                 (p)->Acquire()\n#define IDirectInputDevice_Unacquire(p)               (p)->Unacquire()\n#define IDirectInputDevice_GetDeviceState(p,a,b)      (p)->GetDeviceState(a,b)\n#define IDirectInputDevice_GetDeviceData(p,a,b,c,d)   (p)->GetDeviceData(a,b,c,d)\n#define IDirectInputDevice_SetDataFormat(p,a)         (p)->SetDataFormat(a)\n#define IDirectInputDevice_SetEventNotification(p,a)  (p)->SetEventNotification(a)\n#define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b)\n#define IDirectInputDevice_GetObjectInfo(p,a,b,c)     (p)->GetObjectInfo(a,b,c)\n#define IDirectInputDevice_GetDeviceInfo(p,a)         (p)->GetDeviceInfo(a)\n#define IDirectInputDevice_RunControlPanel(p,a,b)     (p)->RunControlPanel(a,b)\n#define IDirectInputDevice_Initialize(p,a,b,c)        (p)->Initialize(a,b,c)\n#endif\n\n\n#if (DIRECTINPUT_VERSION >= 0x0500)\n/*****************************************************************************\n * IDirectInputDevice2A interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputDevice2A\nDECLARE_INTERFACE_(IDirectInputDevice2A,IDirectInputDeviceA)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputDeviceA methods ***/\n    STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE;\n    STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE;\n    STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE;\n    STDMETHOD(Acquire)(THIS) PURE;\n    STDMETHOD(Unacquire)(THIS) PURE;\n    STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE;\n    STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE;\n    STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE;\n    STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE;\n    STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE;\n    STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) PURE;\n    STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;\n    /*** IDirectInputDevice2A methods ***/\n    STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE;\n    STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwEffType) PURE;\n    STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA pdei, REFGUID rguid) PURE;\n    STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE;\n    STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE;\n    STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE;\n    STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE;\n    STDMETHOD(Poll)(THIS) PURE;\n    STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE;\n};\n\n/*****************************************************************************\n * IDirectInputDevice2W interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputDevice2W\nDECLARE_INTERFACE_(IDirectInputDevice2W,IDirectInputDeviceW)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputDeviceW methods ***/\n    STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE;\n    STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE;\n    STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE;\n    STDMETHOD(Acquire)(THIS) PURE;\n    STDMETHOD(Unacquire)(THIS) PURE;\n    STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE;\n    STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE;\n    STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE;\n    STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE;\n    STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE;\n    STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE;\n    STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;\n    /*** IDirectInputDevice2W methods ***/\n    STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE;\n    STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwEffType) PURE;\n    STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW pdei, REFGUID rguid) PURE;\n    STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE;\n    STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE;\n    STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE;\n    STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE;\n    STDMETHOD(Poll)(THIS) PURE;\n    STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE;\n};\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInputDevice2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInputDevice2_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInputDevice2_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInputDevice methods ***/\n#define IDirectInputDevice2_GetCapabilities(p,a)       (p)->lpVtbl->GetCapabilities(p,a)\n#define IDirectInputDevice2_EnumObjects(p,a,b,c)       (p)->lpVtbl->EnumObjects(p,a,b,c)\n#define IDirectInputDevice2_GetProperty(p,a,b)         (p)->lpVtbl->GetProperty(p,a,b)\n#define IDirectInputDevice2_SetProperty(p,a,b)         (p)->lpVtbl->SetProperty(p,a,b)\n#define IDirectInputDevice2_Acquire(p)                 (p)->lpVtbl->Acquire(p)\n#define IDirectInputDevice2_Unacquire(p)               (p)->lpVtbl->Unacquire(p)\n#define IDirectInputDevice2_GetDeviceState(p,a,b)      (p)->lpVtbl->GetDeviceState(p,a,b)\n#define IDirectInputDevice2_GetDeviceData(p,a,b,c,d)   (p)->lpVtbl->GetDeviceData(p,a,b,c,d)\n#define IDirectInputDevice2_SetDataFormat(p,a)         (p)->lpVtbl->SetDataFormat(p,a)\n#define IDirectInputDevice2_SetEventNotification(p,a)  (p)->lpVtbl->SetEventNotification(p,a)\n#define IDirectInputDevice2_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)\n#define IDirectInputDevice2_GetObjectInfo(p,a,b,c)     (p)->lpVtbl->GetObjectInfo(p,a,b,c)\n#define IDirectInputDevice2_GetDeviceInfo(p,a)         (p)->lpVtbl->GetDeviceInfo(p,a)\n#define IDirectInputDevice2_RunControlPanel(p,a,b)     (p)->lpVtbl->RunControlPanel(p,a,b)\n#define IDirectInputDevice2_Initialize(p,a,b,c)        (p)->lpVtbl->Initialize(p,a,b,c)\n/*** IDirectInputDevice2 methods ***/\n#define IDirectInputDevice2_CreateEffect(p,a,b,c,d)           (p)->lpVtbl->CreateEffect(p,a,b,c,d)\n#define IDirectInputDevice2_EnumEffects(p,a,b,c)              (p)->lpVtbl->EnumEffects(p,a,b,c)\n#define IDirectInputDevice2_GetEffectInfo(p,a,b)              (p)->lpVtbl->GetEffectInfo(p,a,b)\n#define IDirectInputDevice2_GetForceFeedbackState(p,a)        (p)->lpVtbl->GetForceFeedbackState(p,a)\n#define IDirectInputDevice2_SendForceFeedbackCommand(p,a)     (p)->lpVtbl->SendForceFeedbackCommand(p,a)\n#define IDirectInputDevice2_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c)\n#define IDirectInputDevice2_Escape(p,a)                       (p)->lpVtbl->Escape(p,a)\n#define IDirectInputDevice2_Poll(p)                           (p)->lpVtbl->Poll(p)\n#define IDirectInputDevice2_SendDeviceData(p,a,b,c,d)         (p)->lpVtbl->SendDeviceData(p,a,b,c,d)\n#else\n/*** IUnknown methods ***/\n#define IDirectInputDevice2_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInputDevice2_AddRef(p)             (p)->AddRef()\n#define IDirectInputDevice2_Release(p)            (p)->Release()\n/*** IDirectInputDevice methods ***/\n#define IDirectInputDevice2_GetCapabilities(p,a)       (p)->GetCapabilities(a)\n#define IDirectInputDevice2_EnumObjects(p,a,b,c)       (p)->EnumObjects(a,b,c)\n#define IDirectInputDevice2_GetProperty(p,a,b)         (p)->GetProperty(a,b)\n#define IDirectInputDevice2_SetProperty(p,a,b)         (p)->SetProperty(a,b)\n#define IDirectInputDevice2_Acquire(p)                 (p)->Acquire()\n#define IDirectInputDevice2_Unacquire(p)               (p)->Unacquire()\n#define IDirectInputDevice2_GetDeviceState(p,a,b)      (p)->GetDeviceState(a,b)\n#define IDirectInputDevice2_GetDeviceData(p,a,b,c,d)   (p)->GetDeviceData(a,b,c,d)\n#define IDirectInputDevice2_SetDataFormat(p,a)         (p)->SetDataFormat(a)\n#define IDirectInputDevice2_SetEventNotification(p,a)  (p)->SetEventNotification(a)\n#define IDirectInputDevice2_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b)\n#define IDirectInputDevice2_GetObjectInfo(p,a,b,c)     (p)->GetObjectInfo(a,b,c)\n#define IDirectInputDevice2_GetDeviceInfo(p,a)         (p)->GetDeviceInfo(a)\n#define IDirectInputDevice2_RunControlPanel(p,a,b)     (p)->RunControlPanel(a,b)\n#define IDirectInputDevice2_Initialize(p,a,b,c)        (p)->Initialize(a,b,c)\n/*** IDirectInputDevice2 methods ***/\n#define IDirectInputDevice2_CreateEffect(p,a,b,c,d)           (p)->CreateEffect(a,b,c,d)\n#define IDirectInputDevice2_EnumEffects(p,a,b,c)              (p)->EnumEffects(a,b,c)\n#define IDirectInputDevice2_GetEffectInfo(p,a,b)              (p)->GetEffectInfo(a,b)\n#define IDirectInputDevice2_GetForceFeedbackState(p,a)        (p)->GetForceFeedbackState(a)\n#define IDirectInputDevice2_SendForceFeedbackCommand(p,a)     (p)->SendForceFeedbackCommand(a)\n#define IDirectInputDevice2_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c)\n#define IDirectInputDevice2_Escape(p,a)                       (p)->Escape(a)\n#define IDirectInputDevice2_Poll(p)                           (p)->Poll()\n#define IDirectInputDevice2_SendDeviceData(p,a,b,c,d)         (p)->SendDeviceData(a,b,c,d)\n#endif\n#endif /* DI5 */\n\n#if DIRECTINPUT_VERSION >= 0x0700\n/*****************************************************************************\n * IDirectInputDevice7A interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputDevice7A\nDECLARE_INTERFACE_(IDirectInputDevice7A,IDirectInputDevice2A)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputDeviceA methods ***/\n    STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE;\n    STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE;\n    STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE;\n    STDMETHOD(Acquire)(THIS) PURE;\n    STDMETHOD(Unacquire)(THIS) PURE;\n    STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE;\n    STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE;\n    STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE;\n    STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE;\n    STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE;\n    STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) PURE;\n    STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;\n    /*** IDirectInputDevice2A methods ***/\n    STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE;\n    STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwEffType) PURE;\n    STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA pdei, REFGUID rguid) PURE;\n    STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE;\n    STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE;\n    STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE;\n    STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE;\n    STDMETHOD(Poll)(THIS) PURE;\n    STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE;\n    /*** IDirectInputDevice7A methods ***/\n    STDMETHOD(EnumEffectsInFile)(THIS_ LPCSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE;\n    STDMETHOD(WriteEffectToFile)(THIS_ LPCSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE;\n};\n\n/*****************************************************************************\n * IDirectInputDevice7W interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputDevice7W\nDECLARE_INTERFACE_(IDirectInputDevice7W,IDirectInputDevice2W)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputDeviceW methods ***/\n    STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE;\n    STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE;\n    STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE;\n    STDMETHOD(Acquire)(THIS) PURE;\n    STDMETHOD(Unacquire)(THIS) PURE;\n    STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE;\n    STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE;\n    STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE;\n    STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE;\n    STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE;\n    STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE;\n    STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;\n    /*** IDirectInputDevice2W methods ***/\n    STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE;\n    STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwEffType) PURE;\n    STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW pdei, REFGUID rguid) PURE;\n    STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE;\n    STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE;\n    STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE;\n    STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE;\n    STDMETHOD(Poll)(THIS) PURE;\n    STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE;\n    /*** IDirectInputDevice7W methods ***/\n    STDMETHOD(EnumEffectsInFile)(THIS_ LPCWSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE;\n    STDMETHOD(WriteEffectToFile)(THIS_ LPCWSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE;\n};\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInputDevice7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInputDevice7_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInputDevice7_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInputDevice methods ***/\n#define IDirectInputDevice7_GetCapabilities(p,a)       (p)->lpVtbl->GetCapabilities(p,a)\n#define IDirectInputDevice7_EnumObjects(p,a,b,c)       (p)->lpVtbl->EnumObjects(p,a,b,c)\n#define IDirectInputDevice7_GetProperty(p,a,b)         (p)->lpVtbl->GetProperty(p,a,b)\n#define IDirectInputDevice7_SetProperty(p,a,b)         (p)->lpVtbl->SetProperty(p,a,b)\n#define IDirectInputDevice7_Acquire(p)                 (p)->lpVtbl->Acquire(p)\n#define IDirectInputDevice7_Unacquire(p)               (p)->lpVtbl->Unacquire(p)\n#define IDirectInputDevice7_GetDeviceState(p,a,b)      (p)->lpVtbl->GetDeviceState(p,a,b)\n#define IDirectInputDevice7_GetDeviceData(p,a,b,c,d)   (p)->lpVtbl->GetDeviceData(p,a,b,c,d)\n#define IDirectInputDevice7_SetDataFormat(p,a)         (p)->lpVtbl->SetDataFormat(p,a)\n#define IDirectInputDevice7_SetEventNotification(p,a)  (p)->lpVtbl->SetEventNotification(p,a)\n#define IDirectInputDevice7_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)\n#define IDirectInputDevice7_GetObjectInfo(p,a,b,c)     (p)->lpVtbl->GetObjectInfo(p,a,b,c)\n#define IDirectInputDevice7_GetDeviceInfo(p,a)         (p)->lpVtbl->GetDeviceInfo(p,a)\n#define IDirectInputDevice7_RunControlPanel(p,a,b)     (p)->lpVtbl->RunControlPanel(p,a,b)\n#define IDirectInputDevice7_Initialize(p,a,b,c)        (p)->lpVtbl->Initialize(p,a,b,c)\n/*** IDirectInputDevice2 methods ***/\n#define IDirectInputDevice7_CreateEffect(p,a,b,c,d)           (p)->lpVtbl->CreateEffect(p,a,b,c,d)\n#define IDirectInputDevice7_EnumEffects(p,a,b,c)              (p)->lpVtbl->EnumEffects(p,a,b,c)\n#define IDirectInputDevice7_GetEffectInfo(p,a,b)              (p)->lpVtbl->GetEffectInfo(p,a,b)\n#define IDirectInputDevice7_GetForceFeedbackState(p,a)        (p)->lpVtbl->GetForceFeedbackState(p,a)\n#define IDirectInputDevice7_SendForceFeedbackCommand(p,a)     (p)->lpVtbl->SendForceFeedbackCommand(p,a)\n#define IDirectInputDevice7_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c)\n#define IDirectInputDevice7_Escape(p,a)                       (p)->lpVtbl->Escape(p,a)\n#define IDirectInputDevice7_Poll(p)                           (p)->lpVtbl->Poll(p)\n#define IDirectInputDevice7_SendDeviceData(p,a,b,c,d)         (p)->lpVtbl->SendDeviceData(p,a,b,c,d)\n/*** IDirectInputDevice7 methods ***/\n#define IDirectInputDevice7_EnumEffectsInFile(p,a,b,c,d) (p)->lpVtbl->EnumEffectsInFile(p,a,b,c,d)\n#define IDirectInputDevice7_WriteEffectToFile(p,a,b,c,d) (p)->lpVtbl->WriteEffectToFile(p,a,b,c,d)\n#else\n/*** IUnknown methods ***/\n#define IDirectInputDevice7_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInputDevice7_AddRef(p)             (p)->AddRef()\n#define IDirectInputDevice7_Release(p)            (p)->Release()\n/*** IDirectInputDevice methods ***/\n#define IDirectInputDevice7_GetCapabilities(p,a)       (p)->GetCapabilities(a)\n#define IDirectInputDevice7_EnumObjects(p,a,b,c)       (p)->EnumObjects(a,b,c)\n#define IDirectInputDevice7_GetProperty(p,a,b)         (p)->GetProperty(a,b)\n#define IDirectInputDevice7_SetProperty(p,a,b)         (p)->SetProperty(a,b)\n#define IDirectInputDevice7_Acquire(p)                 (p)->Acquire()\n#define IDirectInputDevice7_Unacquire(p)               (p)->Unacquire()\n#define IDirectInputDevice7_GetDeviceState(p,a,b)      (p)->GetDeviceState(a,b)\n#define IDirectInputDevice7_GetDeviceData(p,a,b,c,d)   (p)->GetDeviceData(a,b,c,d)\n#define IDirectInputDevice7_SetDataFormat(p,a)         (p)->SetDataFormat(a)\n#define IDirectInputDevice7_SetEventNotification(p,a)  (p)->SetEventNotification(a)\n#define IDirectInputDevice7_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b)\n#define IDirectInputDevice7_GetObjectInfo(p,a,b,c)     (p)->GetObjectInfo(a,b,c)\n#define IDirectInputDevice7_GetDeviceInfo(p,a)         (p)->GetDeviceInfo(a)\n#define IDirectInputDevice7_RunControlPanel(p,a,b)     (p)->RunControlPanel(a,b)\n#define IDirectInputDevice7_Initialize(p,a,b,c)        (p)->Initialize(a,b,c)\n/*** IDirectInputDevice2 methods ***/\n#define IDirectInputDevice7_CreateEffect(p,a,b,c,d)           (p)->CreateEffect(a,b,c,d)\n#define IDirectInputDevice7_EnumEffects(p,a,b,c)              (p)->EnumEffects(a,b,c)\n#define IDirectInputDevice7_GetEffectInfo(p,a,b)              (p)->GetEffectInfo(a,b)\n#define IDirectInputDevice7_GetForceFeedbackState(p,a)        (p)->GetForceFeedbackState(a)\n#define IDirectInputDevice7_SendForceFeedbackCommand(p,a)     (p)->SendForceFeedbackCommand(a)\n#define IDirectInputDevice7_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c)\n#define IDirectInputDevice7_Escape(p,a)                       (p)->Escape(a)\n#define IDirectInputDevice7_Poll(p)                           (p)->Poll()\n#define IDirectInputDevice7_SendDeviceData(p,a,b,c,d)         (p)->SendDeviceData(a,b,c,d)\n/*** IDirectInputDevice7 methods ***/\n#define IDirectInputDevice7_EnumEffectsInFile(p,a,b,c,d) (p)->EnumEffectsInFile(a,b,c,d)\n#define IDirectInputDevice7_WriteEffectToFile(p,a,b,c,d) (p)->WriteEffectToFile(a,b,c,d)\n#endif\n\n#endif /* DI7 */\n\n#if DIRECTINPUT_VERSION >= 0x0800\n/*****************************************************************************\n * IDirectInputDevice8A interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputDevice8A\nDECLARE_INTERFACE_(IDirectInputDevice8A,IDirectInputDevice7A)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputDeviceA methods ***/\n    STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE;\n    STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE;\n    STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE;\n    STDMETHOD(Acquire)(THIS) PURE;\n    STDMETHOD(Unacquire)(THIS) PURE;\n    STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE;\n    STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE;\n    STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE;\n    STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE;\n    STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE;\n    STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) PURE;\n    STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA pdidi) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;\n    /*** IDirectInputDevice2A methods ***/\n    STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE;\n    STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID pvRef, DWORD dwEffType) PURE;\n    STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA pdei, REFGUID rguid) PURE;\n    STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE;\n    STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE;\n    STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE;\n    STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE;\n    STDMETHOD(Poll)(THIS) PURE;\n    STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE;\n    /*** IDirectInputDevice7A methods ***/\n    STDMETHOD(EnumEffectsInFile)(THIS_ LPCSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE;\n    STDMETHOD(WriteEffectToFile)(THIS_ LPCSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE;\n    /*** IDirectInputDevice8A methods ***/\n    STDMETHOD(BuildActionMap)(THIS_ LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) PURE;\n    STDMETHOD(SetActionMap)(THIS_ LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) PURE;\n    STDMETHOD(GetImageInfo)(THIS_ LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader) PURE;\n};\n\n/*****************************************************************************\n * IDirectInputDevice8W interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputDevice8W\nDECLARE_INTERFACE_(IDirectInputDevice8W,IDirectInputDevice7W)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputDeviceW methods ***/\n    STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE;\n    STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE;\n    STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE;\n    STDMETHOD(Acquire)(THIS) PURE;\n    STDMETHOD(Unacquire)(THIS) PURE;\n    STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE;\n    STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE;\n    STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE;\n    STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE;\n    STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE;\n    STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE;\n    STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE;\n    /*** IDirectInputDevice2W methods ***/\n    STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE;\n    STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwEffType) PURE;\n    STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW pdei, REFGUID rguid) PURE;\n    STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE;\n    STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE;\n    STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE;\n    STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE;\n    STDMETHOD(Poll)(THIS) PURE;\n    STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE;\n    /*** IDirectInputDevice7W methods ***/\n    STDMETHOD(EnumEffectsInFile)(THIS_ LPCWSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE;\n    STDMETHOD(WriteEffectToFile)(THIS_ LPCWSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE;\n    /*** IDirectInputDevice8W methods ***/\n    STDMETHOD(BuildActionMap)(THIS_ LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) PURE;\n    STDMETHOD(SetActionMap)(THIS_ LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) PURE;\n    STDMETHOD(GetImageInfo)(THIS_ LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader) PURE;\n};\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInputDevice8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInputDevice8_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInputDevice8_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInputDevice methods ***/\n#define IDirectInputDevice8_GetCapabilities(p,a)       (p)->lpVtbl->GetCapabilities(p,a)\n#define IDirectInputDevice8_EnumObjects(p,a,b,c)       (p)->lpVtbl->EnumObjects(p,a,b,c)\n#define IDirectInputDevice8_GetProperty(p,a,b)         (p)->lpVtbl->GetProperty(p,a,b)\n#define IDirectInputDevice8_SetProperty(p,a,b)         (p)->lpVtbl->SetProperty(p,a,b)\n#define IDirectInputDevice8_Acquire(p)                 (p)->lpVtbl->Acquire(p)\n#define IDirectInputDevice8_Unacquire(p)               (p)->lpVtbl->Unacquire(p)\n#define IDirectInputDevice8_GetDeviceState(p,a,b)      (p)->lpVtbl->GetDeviceState(p,a,b)\n#define IDirectInputDevice8_GetDeviceData(p,a,b,c,d)   (p)->lpVtbl->GetDeviceData(p,a,b,c,d)\n#define IDirectInputDevice8_SetDataFormat(p,a)         (p)->lpVtbl->SetDataFormat(p,a)\n#define IDirectInputDevice8_SetEventNotification(p,a)  (p)->lpVtbl->SetEventNotification(p,a)\n#define IDirectInputDevice8_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)\n#define IDirectInputDevice8_GetObjectInfo(p,a,b,c)     (p)->lpVtbl->GetObjectInfo(p,a,b,c)\n#define IDirectInputDevice8_GetDeviceInfo(p,a)         (p)->lpVtbl->GetDeviceInfo(p,a)\n#define IDirectInputDevice8_RunControlPanel(p,a,b)     (p)->lpVtbl->RunControlPanel(p,a,b)\n#define IDirectInputDevice8_Initialize(p,a,b,c)        (p)->lpVtbl->Initialize(p,a,b,c)\n/*** IDirectInputDevice2 methods ***/\n#define IDirectInputDevice8_CreateEffect(p,a,b,c,d)           (p)->lpVtbl->CreateEffect(p,a,b,c,d)\n#define IDirectInputDevice8_EnumEffects(p,a,b,c)              (p)->lpVtbl->EnumEffects(p,a,b,c)\n#define IDirectInputDevice8_GetEffectInfo(p,a,b)              (p)->lpVtbl->GetEffectInfo(p,a,b)\n#define IDirectInputDevice8_GetForceFeedbackState(p,a)        (p)->lpVtbl->GetForceFeedbackState(p,a)\n#define IDirectInputDevice8_SendForceFeedbackCommand(p,a)     (p)->lpVtbl->SendForceFeedbackCommand(p,a)\n#define IDirectInputDevice8_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c)\n#define IDirectInputDevice8_Escape(p,a)                       (p)->lpVtbl->Escape(p,a)\n#define IDirectInputDevice8_Poll(p)                           (p)->lpVtbl->Poll(p)\n#define IDirectInputDevice8_SendDeviceData(p,a,b,c,d)         (p)->lpVtbl->SendDeviceData(p,a,b,c,d)\n/*** IDirectInputDevice7 methods ***/\n#define IDirectInputDevice8_EnumEffectsInFile(p,a,b,c,d) (p)->lpVtbl->EnumEffectsInFile(p,a,b,c,d)\n#define IDirectInputDevice8_WriteEffectToFile(p,a,b,c,d) (p)->lpVtbl->WriteEffectToFile(p,a,b,c,d)\n/*** IDirectInputDevice8 methods ***/\n#define IDirectInputDevice8_BuildActionMap(p,a,b,c) (p)->lpVtbl->BuildActionMap(p,a,b,c)\n#define IDirectInputDevice8_SetActionMap(p,a,b,c)   (p)->lpVtbl->SetActionMap(p,a,b,c)\n#define IDirectInputDevice8_GetImageInfo(p,a)       (p)->lpVtbl->GetImageInfo(p,a)\n#else\n/*** IUnknown methods ***/\n#define IDirectInputDevice8_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInputDevice8_AddRef(p)             (p)->AddRef()\n#define IDirectInputDevice8_Release(p)            (p)->Release()\n/*** IDirectInputDevice methods ***/\n#define IDirectInputDevice8_GetCapabilities(p,a)       (p)->GetCapabilities(a)\n#define IDirectInputDevice8_EnumObjects(p,a,b,c)       (p)->EnumObjects(a,b,c)\n#define IDirectInputDevice8_GetProperty(p,a,b)         (p)->GetProperty(a,b)\n#define IDirectInputDevice8_SetProperty(p,a,b)         (p)->SetProperty(a,b)\n#define IDirectInputDevice8_Acquire(p)                 (p)->Acquire()\n#define IDirectInputDevice8_Unacquire(p)               (p)->Unacquire()\n#define IDirectInputDevice8_GetDeviceState(p,a,b)      (p)->GetDeviceState(a,b)\n#define IDirectInputDevice8_GetDeviceData(p,a,b,c,d)   (p)->GetDeviceData(a,b,c,d)\n#define IDirectInputDevice8_SetDataFormat(p,a)         (p)->SetDataFormat(a)\n#define IDirectInputDevice8_SetEventNotification(p,a)  (p)->SetEventNotification(a)\n#define IDirectInputDevice8_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b)\n#define IDirectInputDevice8_GetObjectInfo(p,a,b,c)     (p)->GetObjectInfo(a,b,c)\n#define IDirectInputDevice8_GetDeviceInfo(p,a)         (p)->GetDeviceInfo(a)\n#define IDirectInputDevice8_RunControlPanel(p,a,b)     (p)->RunControlPanel(a,b)\n#define IDirectInputDevice8_Initialize(p,a,b,c)        (p)->Initialize(a,b,c)\n/*** IDirectInputDevice2 methods ***/\n#define IDirectInputDevice8_CreateEffect(p,a,b,c,d)           (p)->CreateEffect(a,b,c,d)\n#define IDirectInputDevice8_EnumEffects(p,a,b,c)              (p)->EnumEffects(a,b,c)\n#define IDirectInputDevice8_GetEffectInfo(p,a,b)              (p)->GetEffectInfo(a,b)\n#define IDirectInputDevice8_GetForceFeedbackState(p,a)        (p)->GetForceFeedbackState(a)\n#define IDirectInputDevice8_SendForceFeedbackCommand(p,a)     (p)->SendForceFeedbackCommand(a)\n#define IDirectInputDevice8_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c)\n#define IDirectInputDevice8_Escape(p,a)                       (p)->Escape(a)\n#define IDirectInputDevice8_Poll(p)                           (p)->Poll()\n#define IDirectInputDevice8_SendDeviceData(p,a,b,c,d)         (p)->SendDeviceData(a,b,c,d)\n/*** IDirectInputDevice7 methods ***/\n#define IDirectInputDevice8_EnumEffectsInFile(p,a,b,c,d) (p)->EnumEffectsInFile(a,b,c,d)\n#define IDirectInputDevice8_WriteEffectToFile(p,a,b,c,d) (p)->WriteEffectToFile(a,b,c,d)\n/*** IDirectInputDevice8 methods ***/\n#define IDirectInputDevice8_BuildActionMap(p,a,b,c) (p)->BuildActionMap(a,b,c)\n#define IDirectInputDevice8_SetActionMap(p,a,b,c)   (p)->SetActionMap(a,b,c)\n#define IDirectInputDevice8_GetImageInfo(p,a)       (p)->GetImageInfo(a)\n#endif\n\n#endif /* DI8 */\n\n/* \"Standard\" Mouse report... */\ntypedef struct DIMOUSESTATE {\n  LONG lX;\n  LONG lY;\n  LONG lZ;\n  BYTE rgbButtons[4];\n} DIMOUSESTATE;\n\n#if DIRECTINPUT_VERSION >= 0x0700\n/* \"Standard\" Mouse report for DInput 7... */\ntypedef struct DIMOUSESTATE2 {\n  LONG lX;\n  LONG lY;\n  LONG lZ;\n  BYTE rgbButtons[8];\n} DIMOUSESTATE2;\n#endif /* DI7 */\n\n#define DIMOFS_X        FIELD_OFFSET(DIMOUSESTATE, lX)\n#define DIMOFS_Y        FIELD_OFFSET(DIMOUSESTATE, lY)\n#define DIMOFS_Z        FIELD_OFFSET(DIMOUSESTATE, lZ)\n#define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0)\n#define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1)\n#define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2)\n#define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3)\n#if DIRECTINPUT_VERSION >= 0x0700\n#define DIMOFS_BUTTON4 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 4)\n#define DIMOFS_BUTTON5 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 5)\n#define DIMOFS_BUTTON6 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 6)\n#define DIMOFS_BUTTON7 (FIELD_OFFSET(DIMOUSESTATE2, rgbButtons) + 7)\n#endif /* DI7 */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nextern const DIDATAFORMAT c_dfDIMouse;\n#if DIRECTINPUT_VERSION >= 0x0700\nextern const DIDATAFORMAT c_dfDIMouse2; /* DX 7 */\n#endif /* DI7 */\nextern const DIDATAFORMAT c_dfDIKeyboard;\n#if DIRECTINPUT_VERSION >= 0x0500\nextern const DIDATAFORMAT c_dfDIJoystick;\nextern const DIDATAFORMAT c_dfDIJoystick2;\n#endif /* DI5 */\n#ifdef __cplusplus\n};\n#endif\n\n/*****************************************************************************\n * IDirectInputA interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputA\nDECLARE_INTERFACE_(IDirectInputA,IUnknown)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputA methods ***/\n    STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEA *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE;\n    STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;\n};\n\n/*****************************************************************************\n * IDirectInputW interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInputW\nDECLARE_INTERFACE_(IDirectInputW,IUnknown)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputW methods ***/\n    STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEW *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE;\n    STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;\n};\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInput_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInput_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInput_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInput methods ***/\n#define IDirectInput_CreateDevice(p,a,b,c)  (p)->lpVtbl->CreateDevice(p,a,b,c)\n#define IDirectInput_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)\n#define IDirectInput_GetDeviceStatus(p,a)   (p)->lpVtbl->GetDeviceStatus(p,a)\n#define IDirectInput_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)\n#define IDirectInput_Initialize(p,a,b)      (p)->lpVtbl->Initialize(p,a,b)\n#else\n/*** IUnknown methods ***/\n#define IDirectInput_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInput_AddRef(p)             (p)->AddRef()\n#define IDirectInput_Release(p)            (p)->Release()\n/*** IDirectInput methods ***/\n#define IDirectInput_CreateDevice(p,a,b,c)  (p)->CreateDevice(a,b,c)\n#define IDirectInput_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d)\n#define IDirectInput_GetDeviceStatus(p,a)   (p)->GetDeviceStatus(a)\n#define IDirectInput_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b)\n#define IDirectInput_Initialize(p,a,b)      (p)->Initialize(a,b)\n#endif\n\n/*****************************************************************************\n * IDirectInput2A interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInput2A\nDECLARE_INTERFACE_(IDirectInput2A,IDirectInputA)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputA methods ***/\n    STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEA *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE;\n    STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;\n    /*** IDirectInput2A methods ***/\n    STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) PURE;\n};\n\n/*****************************************************************************\n * IDirectInput2W interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInput2W\nDECLARE_INTERFACE_(IDirectInput2W,IDirectInputW)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputW methods ***/\n    STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEW *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE;\n    STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;\n    /*** IDirectInput2W methods ***/\n    STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) PURE;\n};\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInput2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInput2_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInput2_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInput methods ***/\n#define IDirectInput2_CreateDevice(p,a,b,c)  (p)->lpVtbl->CreateDevice(p,a,b,c)\n#define IDirectInput2_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)\n#define IDirectInput2_GetDeviceStatus(p,a)   (p)->lpVtbl->GetDeviceStatus(p,a)\n#define IDirectInput2_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)\n#define IDirectInput2_Initialize(p,a,b)      (p)->lpVtbl->Initialize(p,a,b)\n/*** IDirectInput2 methods ***/\n#define IDirectInput2_FindDevice(p,a,b,c)    (p)->lpVtbl->FindDevice(p,a,b,c)\n#else\n/*** IUnknown methods ***/\n#define IDirectInput2_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInput2_AddRef(p)             (p)->AddRef()\n#define IDirectInput2_Release(p)            (p)->Release()\n/*** IDirectInput methods ***/\n#define IDirectInput2_CreateDevice(p,a,b,c)  (p)->CreateDevice(a,b,c)\n#define IDirectInput2_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d)\n#define IDirectInput2_GetDeviceStatus(p,a)   (p)->GetDeviceStatus(a)\n#define IDirectInput2_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b)\n#define IDirectInput2_Initialize(p,a,b)      (p)->Initialize(a,b)\n/*** IDirectInput2 methods ***/\n#define IDirectInput2_FindDevice(p,a,b,c)    (p)->FindDevice(a,b,c)\n#endif\n\n/*****************************************************************************\n * IDirectInput7A interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInput7A\nDECLARE_INTERFACE_(IDirectInput7A,IDirectInput2A)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputA methods ***/\n    STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEA *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE;\n    STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;\n    /*** IDirectInput2A methods ***/\n    STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) PURE;\n    /*** IDirectInput7A methods ***/\n    STDMETHOD(CreateDeviceEx)(THIS_ REFGUID rguid, REFIID riid, LPVOID *pvOut, LPUNKNOWN lpUnknownOuter) PURE;\n};\n\n/*****************************************************************************\n * IDirectInput7W interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInput7W\nDECLARE_INTERFACE_(IDirectInput7W,IDirectInput2W)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInputW methods ***/\n    STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEW *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE;\n    STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;\n    /*** IDirectInput2W methods ***/\n    STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) PURE;\n    /*** IDirectInput7W methods ***/\n    STDMETHOD(CreateDeviceEx)(THIS_ REFGUID rguid, REFIID riid, LPVOID *pvOut, LPUNKNOWN lpUnknownOuter) PURE;\n};\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInput7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInput7_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInput7_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInput methods ***/\n#define IDirectInput7_CreateDevice(p,a,b,c)  (p)->lpVtbl->CreateDevice(p,a,b,c)\n#define IDirectInput7_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)\n#define IDirectInput7_GetDeviceStatus(p,a)   (p)->lpVtbl->GetDeviceStatus(p,a)\n#define IDirectInput7_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)\n#define IDirectInput7_Initialize(p,a,b)      (p)->lpVtbl->Initialize(p,a,b)\n/*** IDirectInput2 methods ***/\n#define IDirectInput7_FindDevice(p,a,b,c)    (p)->lpVtbl->FindDevice(p,a,b,c)\n/*** IDirectInput7 methods ***/\n#define IDirectInput7_CreateDeviceEx(p,a,b,c,d) (p)->lpVtbl->CreateDeviceEx(p,a,b,c,d)\n#else\n/*** IUnknown methods ***/\n#define IDirectInput7_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInput7_AddRef(p)             (p)->AddRef()\n#define IDirectInput7_Release(p)            (p)->Release()\n/*** IDirectInput methods ***/\n#define IDirectInput7_CreateDevice(p,a,b,c)  (p)->CreateDevice(a,b,c)\n#define IDirectInput7_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d)\n#define IDirectInput7_GetDeviceStatus(p,a)   (p)->GetDeviceStatus(a)\n#define IDirectInput7_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b)\n#define IDirectInput7_Initialize(p,a,b)      (p)->Initialize(a,b)\n/*** IDirectInput2 methods ***/\n#define IDirectInput7_FindDevice(p,a,b,c)    (p)->FindDevice(a,b,c)\n/*** IDirectInput7 methods ***/\n#define IDirectInput7_CreateDeviceEx(p,a,b,c,d) (p)->CreateDeviceEx(a,b,c,d)\n#endif\n\n\n#if DIRECTINPUT_VERSION >= 0x0800\n/*****************************************************************************\n * IDirectInput8A interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInput8A\nDECLARE_INTERFACE_(IDirectInput8A,IUnknown)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInput8A methods ***/\n    STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICE8A *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE;\n    STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;\n    STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) PURE;\n    STDMETHOD(EnumDevicesBySemantics)(THIS_ LPCSTR ptszUserName, LPDIACTIONFORMATA lpdiActionFormat, LPDIENUMDEVICESBYSEMANTICSCBA lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(ConfigureDevices)(THIS_ LPDICONFIGUREDEVICESCALLBACK lpdiCallback, LPDICONFIGUREDEVICESPARAMSA lpdiCDParams, DWORD dwFlags, LPVOID pvRefData) PURE;\n};\n\n/*****************************************************************************\n * IDirectInput8W interface\n */\n#undef INTERFACE\n#define INTERFACE IDirectInput8W\nDECLARE_INTERFACE_(IDirectInput8W,IUnknown)\n{\n    /*** IUnknown methods ***/\n    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;\n    STDMETHOD_(ULONG,AddRef)(THIS) PURE;\n    STDMETHOD_(ULONG,Release)(THIS) PURE;\n    /*** IDirectInput8W methods ***/\n    STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICE8W *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE;\n    STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE;\n    STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE;\n    STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE;\n    STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) PURE;\n    STDMETHOD(EnumDevicesBySemantics)(THIS_ LPCWSTR ptszUserName, LPDIACTIONFORMATW lpdiActionFormat, LPDIENUMDEVICESBYSEMANTICSCBW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE;\n    STDMETHOD(ConfigureDevices)(THIS_ LPDICONFIGUREDEVICESCALLBACK lpdiCallback, LPDICONFIGUREDEVICESPARAMSW lpdiCDParams, DWORD dwFlags, LPVOID pvRefData) PURE;\n};\n#undef INTERFACE\n\n#if !defined(__cplusplus) || defined(CINTERFACE)\n/*** IUnknown methods ***/\n#define IDirectInput8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)\n#define IDirectInput8_AddRef(p)             (p)->lpVtbl->AddRef(p)\n#define IDirectInput8_Release(p)            (p)->lpVtbl->Release(p)\n/*** IDirectInput8 methods ***/\n#define IDirectInput8_CreateDevice(p,a,b,c)       (p)->lpVtbl->CreateDevice(p,a,b,c)\n#define IDirectInput8_EnumDevices(p,a,b,c,d)      (p)->lpVtbl->EnumDevices(p,a,b,c,d)\n#define IDirectInput8_GetDeviceStatus(p,a)        (p)->lpVtbl->GetDeviceStatus(p,a)\n#define IDirectInput8_RunControlPanel(p,a,b)      (p)->lpVtbl->RunControlPanel(p,a,b)\n#define IDirectInput8_Initialize(p,a,b)           (p)->lpVtbl->Initialize(p,a,b)\n#define IDirectInput8_FindDevice(p,a,b,c)         (p)->lpVtbl->FindDevice(p,a,b,c)\n#define IDirectInput8_EnumDevicesBySemantics(p,a,b,c,d,e) (p)->lpVtbl->EnumDevicesBySemantics(p,a,b,c,d,e)\n#define IDirectInput8_ConfigureDevices(p,a,b,c,d) (p)->lpVtbl->ConfigureDevices(p,a,b,c,d)\n#else\n/*** IUnknown methods ***/\n#define IDirectInput8_QueryInterface(p,a,b) (p)->QueryInterface(a,b)\n#define IDirectInput8_AddRef(p)             (p)->AddRef()\n#define IDirectInput8_Release(p)            (p)->Release()\n/*** IDirectInput8 methods ***/\n#define IDirectInput8_CreateDevice(p,a,b,c)       (p)->CreateDevice(a,b,c)\n#define IDirectInput8_EnumDevices(p,a,b,c,d)      (p)->EnumDevices(a,b,c,d)\n#define IDirectInput8_GetDeviceStatus(p,a)        (p)->GetDeviceStatus(a)\n#define IDirectInput8_RunControlPanel(p,a,b)      (p)->RunControlPanel(a,b)\n#define IDirectInput8_Initialize(p,a,b)           (p)->Initialize(a,b)\n#define IDirectInput8_FindDevice(p,a,b,c)         (p)->FindDevice(a,b,c)\n#define IDirectInput8_EnumDevicesBySemantics(p,a,b,c,d,e) (p)->EnumDevicesBySemantics(a,b,c,d,e)\n#define IDirectInput8_ConfigureDevices(p,a,b,c,d) (p)->ConfigureDevices(a,b,c,d)\n#endif\n\n#endif /* DI8 */\n\n/* Export functions */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if DIRECTINPUT_VERSION >= 0x0800\nHRESULT WINAPI DirectInput8Create(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN);\n#else /* DI < 8 */\nHRESULT WINAPI DirectInputCreateA(HINSTANCE,DWORD,LPDIRECTINPUTA *,LPUNKNOWN);\nHRESULT WINAPI DirectInputCreateW(HINSTANCE,DWORD,LPDIRECTINPUTW *,LPUNKNOWN);\n#define DirectInputCreate WINELIB_NAME_AW(DirectInputCreate)\n\nHRESULT WINAPI DirectInputCreateEx(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN);\n#endif /* DI8 */\n\n#ifdef __cplusplus\n};\n#endif\n\n#endif /* __DINPUT_INCLUDED__ */\n"
  },
  {
    "path": "external/GLFW/deps/mingw/xinput.h",
    "content": "/*\n * The Wine project - Xinput Joystick Library\n * Copyright 2008 Andrew Fenn\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\n */\n\n#ifndef __WINE_XINPUT_H\n#define __WINE_XINPUT_H\n\n#include <windef.h>\n\n/*\n * Bitmasks for the joysticks buttons, determines what has\n * been pressed on the joystick, these need to be mapped\n * to whatever device you're using instead of an xbox 360\n * joystick\n */\n\n#define XINPUT_GAMEPAD_DPAD_UP          0x0001\n#define XINPUT_GAMEPAD_DPAD_DOWN        0x0002\n#define XINPUT_GAMEPAD_DPAD_LEFT        0x0004\n#define XINPUT_GAMEPAD_DPAD_RIGHT       0x0008\n#define XINPUT_GAMEPAD_START            0x0010\n#define XINPUT_GAMEPAD_BACK             0x0020\n#define XINPUT_GAMEPAD_LEFT_THUMB       0x0040\n#define XINPUT_GAMEPAD_RIGHT_THUMB      0x0080\n#define XINPUT_GAMEPAD_LEFT_SHOULDER    0x0100\n#define XINPUT_GAMEPAD_RIGHT_SHOULDER   0x0200\n#define XINPUT_GAMEPAD_A                0x1000\n#define XINPUT_GAMEPAD_B                0x2000\n#define XINPUT_GAMEPAD_X                0x4000\n#define XINPUT_GAMEPAD_Y                0x8000\n\n/*\n * Defines the flags used to determine if the user is pushing\n * down on a button, not holding a button, etc\n */\n\n#define XINPUT_KEYSTROKE_KEYDOWN        0x0001\n#define XINPUT_KEYSTROKE_KEYUP          0x0002\n#define XINPUT_KEYSTROKE_REPEAT         0x0004\n\n/*\n * Defines the codes which are returned by XInputGetKeystroke\n */\n\n#define VK_PAD_A                        0x5800\n#define VK_PAD_B                        0x5801\n#define VK_PAD_X                        0x5802\n#define VK_PAD_Y                        0x5803\n#define VK_PAD_RSHOULDER                0x5804\n#define VK_PAD_LSHOULDER                0x5805\n#define VK_PAD_LTRIGGER                 0x5806\n#define VK_PAD_RTRIGGER                 0x5807\n#define VK_PAD_DPAD_UP                  0x5810\n#define VK_PAD_DPAD_DOWN                0x5811\n#define VK_PAD_DPAD_LEFT                0x5812\n#define VK_PAD_DPAD_RIGHT               0x5813\n#define VK_PAD_START                    0x5814\n#define VK_PAD_BACK                     0x5815\n#define VK_PAD_LTHUMB_PRESS             0x5816\n#define VK_PAD_RTHUMB_PRESS             0x5817\n#define VK_PAD_LTHUMB_UP                0x5820\n#define VK_PAD_LTHUMB_DOWN              0x5821\n#define VK_PAD_LTHUMB_RIGHT             0x5822\n#define VK_PAD_LTHUMB_LEFT              0x5823\n#define VK_PAD_LTHUMB_UPLEFT            0x5824\n#define VK_PAD_LTHUMB_UPRIGHT           0x5825\n#define VK_PAD_LTHUMB_DOWNRIGHT         0x5826\n#define VK_PAD_LTHUMB_DOWNLEFT          0x5827\n#define VK_PAD_RTHUMB_UP                0x5830\n#define VK_PAD_RTHUMB_DOWN              0x5831\n#define VK_PAD_RTHUMB_RIGHT             0x5832\n#define VK_PAD_RTHUMB_LEFT              0x5833\n#define VK_PAD_RTHUMB_UPLEFT            0x5834\n#define VK_PAD_RTHUMB_UPRIGHT           0x5835\n#define VK_PAD_RTHUMB_DOWNRIGHT         0x5836\n#define VK_PAD_RTHUMB_DOWNLEFT          0x5837\n\n/*\n * Deadzones are for analogue joystick controls on the joypad\n * which determine when input should be assumed to be in the\n * middle of the pad. This is a threshold to stop a joypad\n * controlling the game when the player isn't touching the\n * controls.\n */\n\n#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE  7849\n#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689\n#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD    30\n\n\n/*\n * Defines what type of abilities the type of joystick has\n * DEVTYPE_GAMEPAD is available for all joysticks, however\n * there may be more specific identifiers for other joysticks\n * which are being used.\n */\n\n#define XINPUT_DEVTYPE_GAMEPAD          0x01\n#define XINPUT_DEVSUBTYPE_GAMEPAD       0x01\n#define XINPUT_DEVSUBTYPE_WHEEL         0x02\n#define XINPUT_DEVSUBTYPE_ARCADE_STICK  0x03\n#define XINPUT_DEVSUBTYPE_FLIGHT_SICK   0x04\n#define XINPUT_DEVSUBTYPE_DANCE_PAD     0x05\n#define XINPUT_DEVSUBTYPE_GUITAR        0x06\n#define XINPUT_DEVSUBTYPE_DRUM_KIT      0x08\n\n/*\n * These are used with the XInputGetCapabilities function to\n * determine the abilities to the joystick which has been\n * plugged in.\n */\n\n#define XINPUT_CAPS_VOICE_SUPPORTED     0x0004\n#define XINPUT_FLAG_GAMEPAD             0x00000001\n\n/*\n * Defines the status of the battery if one is used in the\n * attached joystick. The first two define if the joystick\n * supports a battery. Disconnected means that the joystick\n * isn't connected. Wired shows that the joystick is a wired\n * joystick.\n */\n\n#define BATTERY_DEVTYPE_GAMEPAD         0x00\n#define BATTERY_DEVTYPE_HEADSET         0x01\n#define BATTERY_TYPE_DISCONNECTED       0x00\n#define BATTERY_TYPE_WIRED              0x01\n#define BATTERY_TYPE_ALKALINE           0x02\n#define BATTERY_TYPE_NIMH               0x03\n#define BATTERY_TYPE_UNKNOWN            0xFF\n#define BATTERY_LEVEL_EMPTY             0x00\n#define BATTERY_LEVEL_LOW               0x01\n#define BATTERY_LEVEL_MEDIUM            0x02\n#define BATTERY_LEVEL_FULL              0x03\n\n/*\n * How many joysticks can be used with this library. Games that\n * use the xinput library will not go over this number.\n */\n\n#define XUSER_MAX_COUNT                 4\n#define XUSER_INDEX_ANY                 0x000000FF\n\n/*\n * Defines the structure of an xbox 360 joystick.\n */\n\ntypedef struct _XINPUT_GAMEPAD {\n    WORD wButtons;\n    BYTE bLeftTrigger;\n    BYTE bRightTrigger;\n    SHORT sThumbLX;\n    SHORT sThumbLY;\n    SHORT sThumbRX;\n    SHORT sThumbRY;\n} XINPUT_GAMEPAD, *PXINPUT_GAMEPAD;\n\ntypedef struct _XINPUT_STATE {\n    DWORD dwPacketNumber;\n    XINPUT_GAMEPAD Gamepad;\n} XINPUT_STATE, *PXINPUT_STATE;\n\n/*\n * Defines the structure of how much vibration is set on both the\n * right and left motors in a joystick. If you're not using a 360\n * joystick you will have to map these to your device.\n */\n\ntypedef struct _XINPUT_VIBRATION {\n    WORD wLeftMotorSpeed;\n    WORD wRightMotorSpeed;\n} XINPUT_VIBRATION, *PXINPUT_VIBRATION;\n\n/*\n * Defines the structure for what kind of abilities the joystick has\n * such abilities are things such as if the joystick has the ability\n * to send and receive audio, if the joystick is in fact a driving\n * wheel or perhaps if the joystick is some kind of dance pad or\n * guitar.\n */\n\ntypedef struct _XINPUT_CAPABILITIES {\n    BYTE Type;\n    BYTE SubType;\n    WORD Flags;\n    XINPUT_GAMEPAD Gamepad;\n    XINPUT_VIBRATION Vibration;\n} XINPUT_CAPABILITIES, *PXINPUT_CAPABILITIES;\n\n/*\n * Defines the structure for a joystick input event which is\n * retrieved using the function XInputGetKeystroke\n */\ntypedef struct _XINPUT_KEYSTROKE {\n    WORD VirtualKey;\n    WCHAR Unicode;\n    WORD Flags;\n    BYTE UserIndex;\n    BYTE HidCode;\n} XINPUT_KEYSTROKE, *PXINPUT_KEYSTROKE;\n\ntypedef struct _XINPUT_BATTERY_INFORMATION\n{\n    BYTE BatteryType;\n    BYTE BatteryLevel;\n} XINPUT_BATTERY_INFORMATION, *PXINPUT_BATTERY_INFORMATION;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid WINAPI XInputEnable(WINBOOL);\nDWORD WINAPI XInputSetState(DWORD, XINPUT_VIBRATION*);\nDWORD WINAPI XInputGetState(DWORD, XINPUT_STATE*);\nDWORD WINAPI XInputGetKeystroke(DWORD, DWORD, PXINPUT_KEYSTROKE);\nDWORD WINAPI XInputGetCapabilities(DWORD, DWORD, XINPUT_CAPABILITIES*);\nDWORD WINAPI XInputGetDSoundAudioDeviceGuids(DWORD, GUID*, GUID*);\nDWORD WINAPI XInputGetBatteryInformation(DWORD, BYTE, XINPUT_BATTERY_INFORMATION*);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __WINE_XINPUT_H */\n"
  },
  {
    "path": "external/GLFW/deps/nuklear.h",
    "content": "/*\n Nuklear - 1.40.0 - public domain\n no warrenty implied; use at your own risk.\n authored from 2015-2017 by Micha Mettke\n\nABOUT:\n    This is a minimal state graphical user interface single header toolkit\n    written in ANSI C and licensed under public domain.\n    It was designed as a simple embeddable user interface for application and does\n    not have any dependencies, a default renderbackend or OS window and input handling\n    but instead provides a very modular library approach by using simple input state\n    for input and draw commands describing primitive shapes as output.\n    So instead of providing a layered library that tries to abstract over a number\n    of platform and render backends it only focuses on the actual UI.\n\nVALUES:\n    - Graphical user interface toolkit\n    - Single header library\n    - Written in C89 (a.k.a. ANSI C or ISO C90)\n    - Small codebase (~17kLOC)\n    - Focus on portability, efficiency and simplicity\n    - No dependencies (not even the standard library if not wanted)\n    - Fully skinnable and customizable\n    - Low memory footprint with total memory control if needed or wanted\n    - UTF-8 support\n    - No global or hidden state\n    - Customizable library modules (you can compile and use only what you need)\n    - Optional font baker and vertex buffer output\n\nUSAGE:\n    This library is self contained in one single header file and can be used either\n    in header only mode or in implementation mode. The header only mode is used\n    by default when included and allows including this header in other headers\n    and does not contain the actual implementation.\n\n    The implementation mode requires to define  the preprocessor macro\n    NK_IMPLEMENTATION in *one* .c/.cpp file before #includeing this file, e.g.:\n\n        #define NK_IMPLEMENTATION\n        #include \"nuklear.h\"\n\n    Also optionally define the symbols listed in the section \"OPTIONAL DEFINES\"\n    below in header and implementation mode if you want to use additional functionality\n    or need more control over the library.\n    IMPORTANT:  Every time you include \"nuklear.h\" you have to define the same flags.\n                This is very important not doing it either leads to compiler errors\n                or even worse stack corruptions.\n\nFEATURES:\n    - Absolutely no platform dependend code\n    - Memory management control ranging from/to\n        - Ease of use by allocating everything from standard library\n        - Control every byte of memory inside the library\n    - Font handling control ranging from/to\n        - Use your own font implementation for everything\n        - Use this libraries internal font baking and handling API\n    - Drawing output control ranging from/to\n        - Simple shapes for more high level APIs which already have drawing capabilities\n        - Hardware accessible anti-aliased vertex buffer output\n    - Customizable colors and properties ranging from/to\n        - Simple changes to color by filling a simple color table\n        - Complete control with ability to use skinning to decorate widgets\n    - Bendable UI library with widget ranging from/to\n        - Basic widgets like buttons, checkboxes, slider, ...\n        - Advanced widget like abstract comboboxes, contextual menus,...\n    - Compile time configuration to only compile what you need\n        - Subset which can be used if you do not want to link or use the standard library\n    - Can be easily modified to only update on user input instead of frame updates\n\nOPTIONAL DEFINES:\n    NK_PRIVATE\n        If defined declares all functions as static, so they can only be accessed\n        inside the file that contains the implementation\n\n    NK_INCLUDE_FIXED_TYPES\n        If defined it will include header <stdint.h> for fixed sized types\n        otherwise nuklear tries to select the correct type. If that fails it will\n        throw a compiler error and you have to select the correct types yourself.\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_INCLUDE_DEFAULT_ALLOCATOR\n        if defined it will include header <stdlib.h> and provide additional functions\n        to use this library without caring for memory allocation control and therefore\n        ease memory management.\n        <!> Adds the standard library with malloc and free so don't define if you\n            don't want to link to the standard library <!>\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_INCLUDE_STANDARD_IO\n        if defined it will include header <stdio.h> and provide\n        additional functions depending on file loading.\n        <!> Adds the standard library with fopen, fclose,... so don't define this\n            if you don't want to link to the standard library <!>\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_INCLUDE_STANDARD_VARARGS\n        if defined it will include header <stdarg.h> and provide\n        additional functions depending on variable arguments\n        <!> Adds the standard library with va_list and  so don't define this if\n            you don't want to link to the standard library<!>\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n        Defining this adds a vertex draw command list backend to this\n        library, which allows you to convert queue commands into vertex draw commands.\n        This is mainly if you need a hardware accessible format for OpenGL, DirectX,\n        Vulkan, Metal,...\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_INCLUDE_FONT_BAKING\n        Defining this adds `stb_truetype` and `stb_rect_pack` implementation\n        to this library and provides font baking and rendering.\n        If you already have font handling or do not want to use this font handler\n        you don't have to define it.\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_INCLUDE_DEFAULT_FONT\n        Defining this adds the default font: ProggyClean.ttf into this library\n        which can be loaded into a font atlas and allows using this library without\n        having a truetype font\n        <!> Enabling this adds ~12kb to global stack memory <!>\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_INCLUDE_COMMAND_USERDATA\n        Defining this adds a userdata pointer into each command. Can be useful for\n        example if you want to provide custom shaders depending on the used widget.\n        Can be combined with the style structures.\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_BUTTON_TRIGGER_ON_RELEASE\n        Different platforms require button clicks occuring either on buttons being\n        pressed (up to down) or released (down to up).\n        By default this library will react on buttons being pressed, but if you\n        define this it will only trigger if a button is released.\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_ZERO_COMMAND_MEMORY\n        Defining this will zero out memory for each drawing command added to a\n        drawing queue (inside nk_command_buffer_push). Zeroing command memory\n        is very useful for fast checking (using memcmp) if command buffers are\n        equal and avoid drawing frames when nothing on screen has changed since\n        previous frame.\n\n    NK_ASSERT\n        If you don't define this, nuklear will use <assert.h> with assert().\n        <!> Adds the standard library so define to nothing of not wanted <!>\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_BUFFER_DEFAULT_INITIAL_SIZE\n        Initial buffer size allocated by all buffers while using the default allocator\n        functions included by defining NK_INCLUDE_DEFAULT_ALLOCATOR. If you don't\n        want to allocate the default 4k memory then redefine it.\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_MAX_NUMBER_BUFFER\n        Maximum buffer size for the conversion buffer between float and string\n        Under normal circumstances this should be more than sufficient.\n        <!> If used needs to be defined for implementation and header <!>\n\n    NK_INPUT_MAX\n        Defines the max number of bytes which can be added as text input in one frame.\n        Under normal circumstances this should be more than sufficient.\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_MEMSET\n        You can define this to 'memset' or your own memset implementation\n        replacement. If not nuklear will use its own version.\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_MEMCPY\n        You can define this to 'memcpy' or your own memcpy implementation\n        replacement. If not nuklear will use its own version.\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_SQRT\n        You can define this to 'sqrt' or your own sqrt implementation\n        replacement. If not nuklear will use its own slow and not highly\n        accurate version.\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_SIN\n        You can define this to 'sinf' or your own sine implementation\n        replacement. If not nuklear will use its own approximation implementation.\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_COS\n        You can define this to 'cosf' or your own cosine implementation\n        replacement. If not nuklear will use its own approximation implementation.\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_STRTOD\n        You can define this to `strtod` or your own string to double conversion\n        implementation replacement. If not defined nuklear will use its own\n        imprecise and possibly unsafe version (does not handle nan or infinity!).\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_DTOA\n        You can define this to `dtoa` or your own double to string conversion\n        implementation replacement. If not defined nuklear will use its own\n        imprecise and possibly unsafe version (does not handle nan or infinity!).\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_VSNPRINTF\n        If you define `NK_INCLUDE_STANDARD_VARARGS` as well as `NK_INCLUDE_STANDARD_IO`\n        and want to be safe define this to `vsnprintf` on compilers supporting\n        later versions of C or C++. By default nuklear will check for your stdlib version\n        in C as well as compiler version in C++. if `vsnprintf` is available\n        it will define it to `vsnprintf` directly. If not defined and if you have\n        older versions of C or C++ it will be defined to `vsprintf` which is unsafe.\n        <!> If used it is only required to be defined for the implementation part <!>\n\n    NK_BYTE\n    NK_INT16\n    NK_UINT16\n    NK_INT32\n    NK_UINT32\n    NK_SIZE_TYPE\n    NK_POINTER_TYPE\n        If you compile without NK_USE_FIXED_TYPE then a number of standard types\n        will be selected and compile time validated. If they are incorrect you can\n        define the correct types by overloading these type defines.\n\nCREDITS:\n    Developed by Micha Mettke and every direct or indirect contributor.\n\n    Embeds stb_texedit, stb_truetype and stb_rectpack by Sean Barret (public domain)\n    Embeds ProggyClean.ttf font by Tristan Grimmer (MIT license).\n\n    Big thank you to Omar Cornut (ocornut@github) for his imgui library and\n    giving me the inspiration for this library, Casey Muratori for handmade hero\n    and his original immediate mode graphical user interface idea and Sean\n    Barret for his amazing single header libraries which restored my faith\n    in libraries and brought me to create some of my own.\n\nLICENSE:\n    This software is dual-licensed to the public domain and under the following\n    license: you are granted a perpetual, irrevocable license to copy, modify,\n    publish and distribute this file as you see fit.\n*/\n#ifndef NK_NUKLEAR_H_\n#define NK_NUKLEAR_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n * ==============================================================\n *\n *                          CONSTANTS\n *\n * ===============================================================\n */\n#define NK_UNDEFINED (-1.0f)\n#define NK_UTF_INVALID 0xFFFD /* internal invalid utf8 rune */\n#define NK_UTF_SIZE 4 /* describes the number of bytes a glyph consists of*/\n#ifndef NK_INPUT_MAX\n#define NK_INPUT_MAX 16\n#endif\n#ifndef NK_MAX_NUMBER_BUFFER\n#define NK_MAX_NUMBER_BUFFER 64\n#endif\n#ifndef NK_SCROLLBAR_HIDING_TIMEOUT\n#define NK_SCROLLBAR_HIDING_TIMEOUT 4.0f\n#endif\n/*\n * ==============================================================\n *\n *                          HELPER\n *\n * ===============================================================\n */\n#ifndef NK_API\n  #ifdef NK_PRIVATE\n    #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199409L))\n      #define NK_API static inline\n    #elif defined(__cplusplus)\n      #define NK_API static inline\n    #else\n      #define NK_API static\n    #endif\n  #else\n    #define NK_API extern\n  #endif\n#endif\n\n#define NK_INTERN static\n#define NK_STORAGE static\n#define NK_GLOBAL static\n\n#define NK_FLAG(x) (1 << (x))\n#define NK_STRINGIFY(x) #x\n#define NK_MACRO_STRINGIFY(x) NK_STRINGIFY(x)\n#define NK_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2\n#define NK_STRING_JOIN_DELAY(arg1, arg2) NK_STRING_JOIN_IMMEDIATE(arg1, arg2)\n#define NK_STRING_JOIN(arg1, arg2) NK_STRING_JOIN_DELAY(arg1, arg2)\n\n#ifdef _MSC_VER\n#define NK_UNIQUE_NAME(name) NK_STRING_JOIN(name,__COUNTER__)\n#else\n#define NK_UNIQUE_NAME(name) NK_STRING_JOIN(name,__LINE__)\n#endif\n\n#ifndef NK_STATIC_ASSERT\n#define NK_STATIC_ASSERT(exp) typedef char NK_UNIQUE_NAME(_dummy_array)[(exp)?1:-1]\n#endif\n\n#ifndef NK_FILE_LINE\n#ifdef _MSC_VER\n#define NK_FILE_LINE __FILE__ \":\" NK_MACRO_STRINGIFY(__COUNTER__)\n#else\n#define NK_FILE_LINE __FILE__ \":\" NK_MACRO_STRINGIFY(__LINE__)\n#endif\n#endif\n\n#define NK_MIN(a,b) ((a) < (b) ? (a) : (b))\n#define NK_MAX(a,b) ((a) < (b) ? (b) : (a))\n#define NK_CLAMP(i,v,x) (NK_MAX(NK_MIN(v,x), i))\n/*\n * ===============================================================\n *\n *                          BASIC\n *\n * ===============================================================\n */\n#ifdef NK_INCLUDE_FIXED_TYPES\n #include <stdint.h>\n #define NK_INT8 int8_t\n #define NK_UINT8 uint8_t\n #define NK_INT16 int16_t\n #define NK_UINT16 uint16_t\n #define NK_INT32 int32_t\n #define NK_UINT32 uint32_t\n #define NK_SIZE_TYPE uintptr_t\n #define NK_POINTER_TYPE uintptr_t\n#else\n  #ifndef NK_INT8\n    #define NK_INT8 char\n  #endif\n  #ifndef NK_UINT8\n    #define NK_UINT8 unsigned char\n  #endif\n  #ifndef NK_INT16\n    #define NK_INT16 signed short\n  #endif\n  #ifndef NK_UINT16\n    #define NK_UINT16 unsigned short\n  #endif\n  #ifndef NK_INT32\n    #if defined(_MSC_VER)\n      #define NK_INT32 __int32\n    #else\n      #define NK_INT32 signed int\n    #endif\n  #endif\n  #ifndef NK_UINT32\n    #if defined(_MSC_VER)\n      #define NK_UINT32 unsigned __int32\n    #else\n      #define NK_UINT32 unsigned int\n    #endif\n  #endif\n  #ifndef NK_SIZE_TYPE\n    #if defined(_WIN64) && defined(_MSC_VER)\n      #define NK_SIZE_TYPE unsigned __int64\n    #elif (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)\n      #define NK_SIZE_TYPE unsigned __int32\n    #elif defined(__GNUC__) || defined(__clang__)\n      #if defined(__x86_64__) || defined(__ppc64__)\n        #define NK_SIZE_TYPE unsigned long\n      #else\n        #define NK_SIZE_TYPE unsigned int\n      #endif\n    #else\n      #define NK_SIZE_TYPE unsigned long\n    #endif\n  #endif\n  #ifndef NK_POINTER_TYPE\n    #if defined(_WIN64) && defined(_MSC_VER)\n      #define NK_POINTER_TYPE unsigned __int64\n    #elif (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)\n      #define NK_POINTER_TYPE unsigned __int32\n    #elif defined(__GNUC__) || defined(__clang__)\n      #if defined(__x86_64__) || defined(__ppc64__)\n        #define NK_POINTER_TYPE unsigned long\n      #else\n        #define NK_POINTER_TYPE unsigned int\n      #endif\n    #else\n      #define NK_POINTER_TYPE unsigned long\n    #endif\n  #endif\n#endif\n\ntypedef NK_INT8 nk_char;\ntypedef NK_UINT8 nk_uchar;\ntypedef NK_UINT8 nk_byte;\ntypedef NK_INT16 nk_short;\ntypedef NK_UINT16 nk_ushort;\ntypedef NK_INT32 nk_int;\ntypedef NK_UINT32 nk_uint;\ntypedef NK_SIZE_TYPE nk_size;\ntypedef NK_POINTER_TYPE nk_ptr;\n\ntypedef nk_uint nk_hash;\ntypedef nk_uint nk_flags;\ntypedef nk_uint nk_rune;\n\n/* Make sure correct type size:\n * This will fire with a negative subscript error if the type sizes\n * are set incorrectly by the compiler, and compile out if not */\nNK_STATIC_ASSERT(sizeof(nk_short) == 2);\nNK_STATIC_ASSERT(sizeof(nk_ushort) == 2);\nNK_STATIC_ASSERT(sizeof(nk_uint) == 4);\nNK_STATIC_ASSERT(sizeof(nk_int) == 4);\nNK_STATIC_ASSERT(sizeof(nk_byte) == 1);\nNK_STATIC_ASSERT(sizeof(nk_flags) >= 4);\nNK_STATIC_ASSERT(sizeof(nk_rune) >= 4);\nNK_STATIC_ASSERT(sizeof(nk_size) >= sizeof(void*));\nNK_STATIC_ASSERT(sizeof(nk_ptr) >= sizeof(void*));\n\n/* ============================================================================\n *\n *                                  API\n *\n * =========================================================================== */\nstruct nk_buffer;\nstruct nk_allocator;\nstruct nk_command_buffer;\nstruct nk_draw_command;\nstruct nk_convert_config;\nstruct nk_style_item;\nstruct nk_text_edit;\nstruct nk_draw_list;\nstruct nk_user_font;\nstruct nk_panel;\nstruct nk_context;\nstruct nk_draw_vertex_layout_element;\nstruct nk_style_button;\nstruct nk_style_toggle;\nstruct nk_style_selectable;\nstruct nk_style_slide;\nstruct nk_style_progress;\nstruct nk_style_scrollbar;\nstruct nk_style_edit;\nstruct nk_style_property;\nstruct nk_style_chart;\nstruct nk_style_combo;\nstruct nk_style_tab;\nstruct nk_style_window_header;\nstruct nk_style_window;\n\nenum {nk_false, nk_true};\nstruct nk_color {nk_byte r,g,b,a;};\nstruct nk_colorf {float r,g,b,a;};\nstruct nk_vec2 {float x,y;};\nstruct nk_vec2i {short x, y;};\nstruct nk_rect {float x,y,w,h;};\nstruct nk_recti {short x,y,w,h;};\ntypedef char nk_glyph[NK_UTF_SIZE];\ntypedef union {void *ptr; int id;} nk_handle;\nstruct nk_image {nk_handle handle;unsigned short w,h;unsigned short region[4];};\nstruct nk_cursor {struct nk_image img; struct nk_vec2 size, offset;};\nstruct nk_scroll {nk_uint x, y;};\n\nenum nk_heading         {NK_UP, NK_RIGHT, NK_DOWN, NK_LEFT};\nenum nk_button_behavior {NK_BUTTON_DEFAULT, NK_BUTTON_REPEATER};\nenum nk_modify          {NK_FIXED = nk_false, NK_MODIFIABLE = nk_true};\nenum nk_orientation     {NK_VERTICAL, NK_HORIZONTAL};\nenum nk_collapse_states {NK_MINIMIZED = nk_false, NK_MAXIMIZED = nk_true};\nenum nk_show_states     {NK_HIDDEN = nk_false, NK_SHOWN = nk_true};\nenum nk_chart_type      {NK_CHART_LINES, NK_CHART_COLUMN, NK_CHART_MAX};\nenum nk_chart_event     {NK_CHART_HOVERING = 0x01, NK_CHART_CLICKED = 0x02};\nenum nk_color_format    {NK_RGB, NK_RGBA};\nenum nk_popup_type      {NK_POPUP_STATIC, NK_POPUP_DYNAMIC};\nenum nk_layout_format   {NK_DYNAMIC, NK_STATIC};\nenum nk_tree_type       {NK_TREE_NODE, NK_TREE_TAB};\n\ntypedef void*(*nk_plugin_alloc)(nk_handle, void *old, nk_size);\ntypedef void (*nk_plugin_free)(nk_handle, void *old);\ntypedef int(*nk_plugin_filter)(const struct nk_text_edit*, nk_rune unicode);\ntypedef void(*nk_plugin_paste)(nk_handle, struct nk_text_edit*);\ntypedef void(*nk_plugin_copy)(nk_handle, const char*, int len);\n\nstruct nk_allocator {\n    nk_handle userdata;\n    nk_plugin_alloc alloc;\n    nk_plugin_free free;\n};\nenum nk_symbol_type {\n    NK_SYMBOL_NONE,\n    NK_SYMBOL_X,\n    NK_SYMBOL_UNDERSCORE,\n    NK_SYMBOL_CIRCLE_SOLID,\n    NK_SYMBOL_CIRCLE_OUTLINE,\n    NK_SYMBOL_RECT_SOLID,\n    NK_SYMBOL_RECT_OUTLINE,\n    NK_SYMBOL_TRIANGLE_UP,\n    NK_SYMBOL_TRIANGLE_DOWN,\n    NK_SYMBOL_TRIANGLE_LEFT,\n    NK_SYMBOL_TRIANGLE_RIGHT,\n    NK_SYMBOL_PLUS,\n    NK_SYMBOL_MINUS,\n    NK_SYMBOL_MAX\n};\n/* =============================================================================\n *\n *                                  CONTEXT\n *\n * =============================================================================*/\n/*  Contexts are the main entry point and the majestro of nuklear and contain all required state.\n *  They are used for window, memory, input, style, stack, commands and time management and need\n *  to be passed into all nuklear GUI specific functions.\n *\n *  Usage\n *  -------------------\n *  To use a context it first has to be initialized which can be achieved by calling\n *  one of either `nk_init_default`, `nk_init_fixed`, `nk_init`, `nk_init_custom`.\n *  Each takes in a font handle and a specific way of handling memory. Memory control\n *  hereby ranges from standard library to just specifing a fixed sized block of memory\n *  which nuklear has to manage itself from.\n *\n *      struct nk_context ctx;\n *      nk_init_xxx(&ctx, ...);\n *      while (1) {\n *          [...]\n *          nk_clear(&ctx);\n *      }\n *      nk_free(&ctx);\n *\n *  Reference\n *  -------------------\n *  nk_init_default     - Initializes context with standard library memory alloction (malloc,free)\n *  nk_init_fixed       - Initializes context from single fixed size memory block\n *  nk_init             - Initializes context with memory allocator callbacks for alloc and free\n *  nk_init_custom      - Initializes context from two buffers. One for draw commands the other for window/panel/table allocations\n *  nk_clear            - Called at the end of the frame to reset and prepare the context for the next frame\n *  nk_free             - Shutdown and free all memory allocated inside the context\n *  nk_set_user_data    - Utility function to pass user data to draw command\n */\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\n/*  nk_init_default - Initializes a `nk_context` struct with a default standard library allocator.\n *  Should be used if you don't want to be bothered with memory management in nuklear.\n *  Parameters:\n *      @ctx must point to an either stack or heap allocated `nk_context` struct\n *      @font must point to a previously initialized font handle for more info look at font documentation\n *  Return values:\n *      true(1) on success\n *      false(0) on failure */\nNK_API int nk_init_default(struct nk_context*, const struct nk_user_font*);\n#endif\n/*  nk_init_fixed - Initializes a `nk_context` struct from a single fixed size memory block\n *  Should be used if you want complete control over nuklears memory management.\n *  Especially recommended for system with little memory or systems with virtual memory.\n *  For the later case you can just allocate for example 16MB of virtual memory\n *  and only the required amount of memory will actually be commited.\n *  IMPORTANT: make sure the passed memory block is aligned correctly for `nk_draw_commands`\n *  Parameters:\n *      @ctx must point to an either stack or heap allocated `nk_context` struct\n *      @memory must point to a previously allocated memory block\n *      @size must contain the total size of @memory\n *      @font must point to a previously initialized font handle for more info look at font documentation\n *  Return values:\n *      true(1) on success\n *      false(0) on failure */\nNK_API int nk_init_fixed(struct nk_context*, void *memory, nk_size size, const struct nk_user_font*);\n/*  nk_init - Initializes a `nk_context` struct with memory allocation callbacks for nuklear to allocate\n *  memory from. Used internally for `nk_init_default` and provides a kitchen sink allocation\n *  interface to nuklear. Can be useful for cases like monitoring memory consumption.\n *  Parameters:\n *      @ctx must point to an either stack or heap allocated `nk_context` struct\n *      @alloc must point to a previously allocated memory allocator\n *      @font must point to a previously initialized font handle for more info look at font documentation\n *  Return values:\n *      true(1) on success\n *      false(0) on failure */\nNK_API int nk_init(struct nk_context*, struct nk_allocator*, const struct nk_user_font*);\n/*  nk_init_custom - Initializes a `nk_context` struct from two different either fixed or growing\n *  buffers. The first buffer is for allocating draw commands while the second buffer is\n *  used for allocating windows, panels and state tables.\n *  Parameters:\n *      @ctx must point to an either stack or heap allocated `nk_context` struct\n *      @cmds must point to a previously initialized memory buffer either fixed or dynamic to store draw commands into\n *      @pool must point to a previously initialized memory buffer either fixed or dynamic to store windows, panels and tables\n *      @font must point to a previously initialized font handle for more info look at font documentation\n *  Return values:\n *      true(1) on success\n *      false(0) on failure */\nNK_API int nk_init_custom(struct nk_context*, struct nk_buffer *cmds, struct nk_buffer *pool, const struct nk_user_font*);\n/*  nk_clear - Resets the context state at the end of the frame. This includes mostly\n *  garbage collector tasks like removing windows or table not called and therefore\n *  used anymore.\n *  Parameters:\n *      @ctx must point to a previously initialized `nk_context` struct */\nNK_API void nk_clear(struct nk_context*);\n/*  nk_free - Frees all memory allocated by nuklear. Not needed if context was\n *  initialized with `nk_init_fixed`.\n *  Parameters:\n *      @ctx must point to a previously initialized `nk_context` struct */\nNK_API void nk_free(struct nk_context*);\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n/*  nk_set_user_data - Sets the currently passed userdata passed down into each draw command.\n *  Parameters:\n *      @ctx must point to a previously initialized `nk_context` struct\n *      @data handle with either pointer or index to be passed into every draw commands */\nNK_API void nk_set_user_data(struct nk_context*, nk_handle handle);\n#endif\n/* =============================================================================\n *\n *                                  INPUT\n *\n * =============================================================================*/\n/*  The input API is responsible for holding the current input state composed of\n *  mouse, key and text input states.\n *  It is worth noting that no direct os or window handling is done in nuklear.\n *  Instead all input state has to be provided by platform specific code. This in one hand\n *  expects more work from the user and complicates usage but on the other hand\n *  provides simple abstraction over a big number of platforms, libraries and other\n *  already provided functionality.\n *\n *  Usage\n *  -------------------\n *  Input state needs to be provided to nuklear by first calling `nk_input_begin`\n *  which resets internal state like delta mouse position and button transistions.\n *  After `nk_input_begin` all current input state needs to be provided. This includes\n *  mouse motion, button and key pressed and released, text input and scrolling.\n *  Both event- or state-based input handling are supported by this API\n *  and should work without problems. Finally after all input state has been\n *  mirrored `nk_input_end` needs to be called to finish input process.\n *\n *      struct nk_context ctx;\n *      nk_init_xxx(&ctx, ...);\n *      while (1) {\n *          Event evt;\n *          nk_input_begin(&ctx);\n *          while (GetEvent(&evt)) {\n *              if (evt.type == MOUSE_MOVE)\n *                  nk_input_motion(&ctx, evt.motion.x, evt.motion.y);\n *              else if (evt.type == ...) {\n *                  ...\n *              }\n *          }\n *          nk_input_end(&ctx);\n *          [...]\n *          nk_clear(&ctx);\n *      }\n *      nk_free(&ctx);\n *\n *  Reference\n *  -------------------\n *  nk_input_begin      - Begins the input mirroring process. Needs to be called before all other `nk_input_xxx` calls\n *  nk_input_motion     - Mirrors mouse cursor position\n *  nk_input_key        - Mirrors key state with either pressed or released\n *  nk_input_button     - Mirrors mouse button state with either pressed or released\n *  nk_input_scroll     - Mirrors mouse scroll values\n *  nk_input_char       - Adds a single ASCII text character into an internal text buffer\n *  nk_input_glyph      - Adds a single multi-byte UTF-8 character into an internal text buffer\n *  nk_input_unicode    - Adds a single unicode rune into an internal text buffer\n *  nk_input_end        - Ends the input mirroring process by calculating state changes. Don't call any `nk_input_xxx` function referenced above after this call\n */\nenum nk_keys {\n    NK_KEY_NONE,\n    NK_KEY_SHIFT,\n    NK_KEY_CTRL,\n    NK_KEY_DEL,\n    NK_KEY_ENTER,\n    NK_KEY_TAB,\n    NK_KEY_BACKSPACE,\n    NK_KEY_COPY,\n    NK_KEY_CUT,\n    NK_KEY_PASTE,\n    NK_KEY_UP,\n    NK_KEY_DOWN,\n    NK_KEY_LEFT,\n    NK_KEY_RIGHT,\n    /* Shortcuts: text field */\n    NK_KEY_TEXT_INSERT_MODE,\n    NK_KEY_TEXT_REPLACE_MODE,\n    NK_KEY_TEXT_RESET_MODE,\n    NK_KEY_TEXT_LINE_START,\n    NK_KEY_TEXT_LINE_END,\n    NK_KEY_TEXT_START,\n    NK_KEY_TEXT_END,\n    NK_KEY_TEXT_UNDO,\n    NK_KEY_TEXT_REDO,\n    NK_KEY_TEXT_SELECT_ALL,\n    NK_KEY_TEXT_WORD_LEFT,\n    NK_KEY_TEXT_WORD_RIGHT,\n    /* Shortcuts: scrollbar */\n    NK_KEY_SCROLL_START,\n    NK_KEY_SCROLL_END,\n    NK_KEY_SCROLL_DOWN,\n    NK_KEY_SCROLL_UP,\n    NK_KEY_MAX\n};\nenum nk_buttons {\n    NK_BUTTON_LEFT,\n    NK_BUTTON_MIDDLE,\n    NK_BUTTON_RIGHT,\n    NK_BUTTON_DOUBLE,\n    NK_BUTTON_MAX\n};\n/*  nk_input_begin - Begins the input mirroring process by resetting text, scroll\n *  mouse previous mouse position and movement as well as key state transistions,\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct */\nNK_API void nk_input_begin(struct nk_context*);\n/*  nk_input_motion - Mirros current mouse position to nuklear\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @x must constain an integer describing the current mouse cursor x-position\n *      @y must constain an integer describing the current mouse cursor y-position */\nNK_API void nk_input_motion(struct nk_context*, int x, int y);\n/*  nk_input_key - Mirros state of a specific key to nuklear\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @key must be any value specified in enum `nk_keys` that needs to be mirrored\n *      @down must be 0 for key is up and 1 for key is down */\nNK_API void nk_input_key(struct nk_context*, enum nk_keys, int down);\n/*  nk_input_button - Mirros the state of a specific mouse button to nuklear\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @nk_buttons must be any value specified in enum `nk_buttons` that needs to be mirrored\n *      @x must constain an integer describing mouse cursor x-position on click up/down\n *      @y must constain an integer describing mouse cursor y-position on click up/down\n *      @down must be 0 for key is up and 1 for key is down */\nNK_API void nk_input_button(struct nk_context*, enum nk_buttons, int x, int y, int down);\n/*  nk_input_char - Copies a single ASCII character into an internal text buffer\n *  This is basically a helper function to quickly push ASCII characters into\n *  nuklear. Note that you can only push up to NK_INPUT_MAX bytes into\n *  struct `nk_input` between `nk_input_begin` and `nk_input_end`.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @c must be a single ASCII character preferable one that can be printed */\nNK_API void nk_input_scroll(struct nk_context*, struct nk_vec2 val);\n/*  nk_input_char - Copies a single ASCII character into an internal text buffer\n *  This is basically a helper function to quickly push ASCII characters into\n *  nuklear. Note that you can only push up to NK_INPUT_MAX bytes into\n *  struct `nk_input` between `nk_input_begin` and `nk_input_end`.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @c must be a single ASCII character preferable one that can be printed */\nNK_API void nk_input_char(struct nk_context*, char);\n/*  nk_input_unicode - Converts a encoded unicode rune into UTF-8 and copies the result\n *  into an internal text buffer.\n *  Note that you can only push up to NK_INPUT_MAX bytes into\n *  struct `nk_input` between `nk_input_begin` and `nk_input_end`.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @glyph UTF-32 uncode codepoint */\nNK_API void nk_input_glyph(struct nk_context*, const nk_glyph);\n/*  nk_input_unicode - Converts a unicode rune into UTF-8 and copies the result\n *  into an internal text buffer.\n *  Note that you can only push up to NK_INPUT_MAX bytes into\n *  struct `nk_input` between `nk_input_begin` and `nk_input_end`.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @glyph UTF-32 uncode codepoint */\nNK_API void nk_input_unicode(struct nk_context*, nk_rune);\n/*  nk_input_end - End the input mirroring process by resetting mouse grabbing\n *  state to ensure the mouse cursor is not grabbed indefinitely.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct */\nNK_API void nk_input_end(struct nk_context*);\n/* =============================================================================\n *\n *                                  DRAWING\n *\n * =============================================================================*/\n/*  This library was designed to be render backend agnostic so it does\n *  not draw anything to screen directly. Instead all drawn shapes, widgets\n *  are made of, are buffered into memory and make up a command queue.\n *  Each frame therefore fills the command buffer with draw commands\n *  that then need to be executed by the user and his own render backend.\n *  After that the command buffer needs to be cleared and a new frame can be\n *  started. It is probably important to note that the command buffer is the main\n *  drawing API and the optional vertex buffer API only takes this format and\n *  converts it into a hardware accessible format.\n *\n *  Usage\n *  -------------------\n *  To draw all draw commands accumulated over a frame you need your own render\n *  backend able to draw a number of 2D primitives. This includes at least\n *  filled and stroked rectangles, circles, text, lines, triangles and scissors.\n *  As soon as this criterion is met you can iterate over each draw command\n *  and execute each draw command in a interpreter like fashion:\n *\n *      const struct nk_command *cmd = 0;\n *      nk_foreach(cmd, &ctx) {\n *      switch (cmd->type) {\n *      case NK_COMMAND_LINE:\n *          your_draw_line_function(...)\n *          break;\n *      case NK_COMMAND_RECT\n *          your_draw_rect_function(...)\n *          break;\n *      case ...:\n *          [...]\n *      }\n *\n *  In program flow context draw commands need to be executed after input has been\n *  gathered and the complete UI with windows and their contained widgets have\n *  been executed and before calling `nk_clear` which frees all previously\n *  allocated draw commands.\n *\n *      struct nk_context ctx;\n *      nk_init_xxx(&ctx, ...);\n *      while (1) {\n *          Event evt;\n *          nk_input_begin(&ctx);\n *          while (GetEvent(&evt)) {\n *              if (evt.type == MOUSE_MOVE)\n *                  nk_input_motion(&ctx, evt.motion.x, evt.motion.y);\n *              else if (evt.type == [...]) {\n *                  [...]\n *              }\n *          }\n *          nk_input_end(&ctx);\n *\n *          [...]\n *\n *          const struct nk_command *cmd = 0;\n *          nk_foreach(cmd, &ctx) {\n *          switch (cmd->type) {\n *          case NK_COMMAND_LINE:\n *              your_draw_line_function(...)\n *              break;\n *          case NK_COMMAND_RECT\n *              your_draw_rect_function(...)\n *              break;\n *          case ...:\n *              [...]\n *          }\n *          nk_clear(&ctx);\n *      }\n *      nk_free(&ctx);\n *\n *  You probably noticed that you have to draw all of the UI each frame which is\n *  quite wasteful. While the actual UI updating loop is quite fast rendering\n *  without actually needing it is not. So there are multiple things you could do.\n *\n *  First is only update on input. This of course is only an option if your\n *  application only depends on the UI and does not require any outside calculations.\n *  If you actually only update on input make sure to update the UI two times each\n *  frame and call `nk_clear` directly after the first pass and only draw in\n *  the second pass. In addition it is recommended to also add additional timers\n *  to make sure the UI is not drawn more than a fixed number of frames per second.\n *\n *      struct nk_context ctx;\n *      nk_init_xxx(&ctx, ...);\n *      while (1) {\n *          [...wait for input ]\n *\n *          [...do two UI passes ...]\n *          do_ui(...)\n *          nk_clear(&ctx);\n *          do_ui(...)\n *\n *          const struct nk_command *cmd = 0;\n *          nk_foreach(cmd, &ctx) {\n *          switch (cmd->type) {\n *          case NK_COMMAND_LINE:\n *              your_draw_line_function(...)\n *              break;\n *          case NK_COMMAND_RECT\n *              your_draw_rect_function(...)\n *              break;\n *          case ...:\n *              [...]\n *          }\n *          nk_clear(&ctx);\n *      }\n *      nk_free(&ctx);\n *\n *  The second probably more applicable trick is to only draw if anything changed.\n *  It is not really useful for applications with continous draw loop but\n *  quite useful for desktop applications. To actually get nuklear to only\n *  draw on changes you first have to define `NK_ZERO_COMMAND_MEMORY` and\n *  allocate a memory buffer that will store each unique drawing output.\n *  After each frame you compare the draw command memory inside the library\n *  with your allocated buffer by memcmp. If memcmp detects differences\n *  you have to copy the command buffer into the allocated buffer\n *  and then draw like usual (this example uses fixed memory but you could\n *  use dynamically allocated memory).\n *\n *      [... other defines ...]\n *      #define NK_ZERO_COMMAND_MEMORY\n *      #include \"nuklear.h\"\n *\n *      struct nk_context ctx;\n *      void *last = calloc(1,64*1024);\n *      void *buf = calloc(1,64*1024);\n *      nk_init_fixed(&ctx, buf, 64*1024);\n *      while (1) {\n *          [...input...]\n *          [...ui...]\n *\n *          void *cmds = nk_buffer_memory(&ctx.memory);\n *          if (memcmp(cmds, last, ctx.memory.allocated)) {\n *              memcpy(last,cmds,ctx.memory.allocated);\n *              const struct nk_command *cmd = 0;\n *              nk_foreach(cmd, &ctx) {\n *                  switch (cmd->type) {\n *                  case NK_COMMAND_LINE:\n *                      your_draw_line_function(...)\n *                      break;\n *                  case NK_COMMAND_RECT\n *                      your_draw_rect_function(...)\n *                      break;\n *                  case ...:\n *                      [...]\n *                  }\n *              }\n *          }\n *          nk_clear(&ctx);\n *      }\n *      nk_free(&ctx);\n *\n *  Finally while using draw commands makes sense for higher abstracted platforms like\n *  X11 and Win32 or drawing libraries it is often desirable to use graphics\n *  hardware directly. Therefore it is possible to just define\n *  `NK_INCLUDE_VERTEX_BUFFER_OUTPUT` which includes optional vertex output.\n *  To access the vertex output you first have to convert all draw commands into\n *  vertexes by calling `nk_convert` which takes in your prefered vertex format.\n *  After successfully converting all draw commands just iterate over and execute all\n *  vertex draw commands:\n *\n *      struct nk_convert_config cfg = {};\n *      static const struct nk_draw_vertex_layout_element vertex_layout[] = {\n *          {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct your_vertex, pos)},\n *          {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct your_vertex, uv)},\n *          {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct your_vertex, col)},\n *          {NK_VERTEX_LAYOUT_END}\n *      };\n *      cfg.shape_AA = NK_ANTI_ALIASING_ON;\n *      cfg.line_AA = NK_ANTI_ALIASING_ON;\n *      cfg.vertex_layout = vertex_layout;\n *      cfg.vertex_size = sizeof(struct your_vertex);\n *      cfg.vertex_alignment = NK_ALIGNOF(struct your_vertex);\n *      cfg.circle_segment_count = 22;\n *      cfg.curve_segment_count = 22;\n *      cfg.arc_segment_count = 22;\n *      cfg.global_alpha = 1.0f;\n *      cfg.null = dev->null;\n *\n *      struct nk_buffer cmds, verts, idx;\n *      nk_buffer_init_default(&cmds);\n *      nk_buffer_init_default(&verts);\n *      nk_buffer_init_default(&idx);\n *      nk_convert(&ctx, &cmds, &verts, &idx, &cfg);\n *      nk_draw_foreach(cmd, &ctx, &cmds) {\n *          if (!cmd->elem_count) continue;\n *          [...]\n *      }\n *      nk_buffer_free(&cms);\n *      nk_buffer_free(&verts);\n *      nk_buffer_free(&idx);\n *\n *  Reference\n *  -------------------\n *  nk__begin           - Returns the first draw command in the context draw command list to be drawn\n *  nk__next            - Increments the draw command iterator to the next command inside the context draw command list\n *  nk_foreach          - Iteratates over each draw command inside the context draw command list\n *\n *  nk_convert          - Converts from the abstract draw commands list into a hardware accessable vertex format\n *  nk__draw_begin      - Returns the first vertex command in the context vertex draw list to be executed\n *  nk__draw_next       - Increments the vertex command iterator to the next command inside the context vertex command list\n *  nk__draw_end        - Returns the end of the vertex draw list\n *  nk_draw_foreach     - Iterates over each vertex draw command inside the vertex draw list\n */\nenum nk_anti_aliasing {NK_ANTI_ALIASING_OFF, NK_ANTI_ALIASING_ON};\nenum nk_convert_result {\n    NK_CONVERT_SUCCESS = 0,\n    NK_CONVERT_INVALID_PARAM = 1,\n    NK_CONVERT_COMMAND_BUFFER_FULL = NK_FLAG(1),\n    NK_CONVERT_VERTEX_BUFFER_FULL = NK_FLAG(2),\n    NK_CONVERT_ELEMENT_BUFFER_FULL = NK_FLAG(3)\n};\nstruct nk_draw_null_texture {\n    nk_handle texture; /* texture handle to a texture with a white pixel */\n    struct nk_vec2 uv; /* coordinates to a white pixel in the texture  */\n};\nstruct nk_convert_config {\n    float global_alpha; /* global alpha value */\n    enum nk_anti_aliasing line_AA; /* line anti-aliasing flag can be turned off if you are tight on memory */\n    enum nk_anti_aliasing shape_AA; /* shape anti-aliasing flag can be turned off if you are tight on memory */\n    unsigned circle_segment_count; /* number of segments used for circles: default to 22 */\n    unsigned arc_segment_count; /* number of segments used for arcs: default to 22 */\n    unsigned curve_segment_count; /* number of segments used for curves: default to 22 */\n    struct nk_draw_null_texture null; /* handle to texture with a white pixel for shape drawing */\n    const struct nk_draw_vertex_layout_element *vertex_layout; /* describes the vertex output format and packing */\n    nk_size vertex_size; /* sizeof one vertex for vertex packing */\n    nk_size vertex_alignment; /* vertex alignment: Can be optained by NK_ALIGNOF */\n};\n/*  nk__begin - Returns a draw command list iterator to iterate all draw\n *  commands accumulated over one frame.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct at the end of a frame\n *  Return values:\n *      draw command pointer pointing to the first command inside the draw command list  */\nNK_API const struct nk_command* nk__begin(struct nk_context*);\n/*  nk__next - Returns a draw command list iterator to iterate all draw\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct at the end of a frame\n *      @cmd must point to an previously a draw command either returned by `nk__begin` or `nk__next`\n *  Return values:\n *      draw command pointer pointing to the next command inside the draw command list  */\nNK_API const struct nk_command* nk__next(struct nk_context*, const struct nk_command*);\n/*  nk_foreach - Iterates over each draw command inside the context draw command list\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct at the end of a frame\n *      @cmd pointer initialized to NULL */\n#define nk_foreach(c, ctx) for((c) = nk__begin(ctx); (c) != 0; (c) = nk__next(ctx,c))\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n/*  nk_convert - converts all internal draw command into vertex draw commands and fills\n *  three buffers with vertexes, vertex draw commands and vertex indicies. The vertex format\n *  as well as some other configuration values have to be configurated by filling out a\n *  `nk_convert_config` struct.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct at the end of a frame\n *      @cmds must point to a previously initialized buffer to hold converted vertex draw commands\n *      @vertices must point to a previously initialized buffer to hold all produced verticies\n *      @elements must point to a previously initialized buffer to hold all procudes vertex indicies\n *      @config must point to a filled out `nk_config` struct to configure the conversion process\n *  Returns:\n *      returns NK_CONVERT_SUCCESS on success and a enum nk_convert_result error values if not */\nNK_API nk_flags nk_convert(struct nk_context*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*);\n/*  nk__draw_begin - Returns a draw vertex command buffer iterator to iterate each the vertex draw command buffer\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct at the end of a frame\n *      @buf must point to an previously by `nk_convert` filled out vertex draw command buffer\n *  Return values:\n *      vertex draw command pointer pointing to the first command inside the vertex draw command buffer  */\nNK_API const struct nk_draw_command* nk__draw_begin(const struct nk_context*, const struct nk_buffer*);\n/*  nk__draw_end - Returns the vertex draw command  at the end of the vertex draw command buffer\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct at the end of a frame\n *      @buf must point to an previously by `nk_convert` filled out vertex draw command buffer\n *  Return values:\n *      vertex draw command pointer pointing to the end of the last vertex draw command inside the vertex draw command buffer  */\nNK_API const struct nk_draw_command* nk__draw_end(const struct nk_context*, const struct nk_buffer*);\n/*  nk__draw_next - Increments the the vertex draw command buffer iterator\n *  Parameters:\n *      @cmd must point to an previously either by `nk__draw_begin` or `nk__draw_next` returned vertex draw command\n *      @buf must point to an previously by `nk_convert` filled out vertex draw command buffer\n *      @ctx must point to an previously initialized `nk_context` struct at the end of a frame\n *  Return values:\n *      vertex draw command pointer pointing to the end of the last vertex draw command inside the vertex draw command buffer  */\nNK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*, const struct nk_buffer*, const struct nk_context*);\n/*  nk_draw_foreach - Iterates over each vertex draw command inside a vertex draw command buffer\n *  Parameters:\n *      @cmd nk_draw_command pointer set to NULL\n *      @buf must point to an previously by `nk_convert` filled out vertex draw command buffer\n *      @ctx must point to an previously initialized `nk_context` struct at the end of a frame */\n#define nk_draw_foreach(cmd,ctx, b) for((cmd)=nk__draw_begin(ctx, b); (cmd)!=0; (cmd)=nk__draw_next(cmd, b, ctx))\n#endif\n/* =============================================================================\n *\n *                                  WINDOW\n *\n * =============================================================================\n * Windows are the main persistent state used inside nuklear and are life time\n * controlled by simply \"retouching\" (i.e. calling) each window each frame.\n * All widgets inside nuklear can only be added inside function pair `nk_begin_xxx`\n * and `nk_end`. Calling any widgets outside these two functions will result in an\n * assert in debug or no state change in release mode.\n *\n * Each window holds frame persistent state like position, size, flags, state tables,\n * and some garbage collected internal persistent widget state. Each window\n * is linked into a window stack list which determines the drawing and overlapping\n * order. The topmost window thereby is the currently active window.\n *\n * To change window position inside the stack occurs either automatically by\n * user input by being clicked on or programatically by calling `nk_window_focus`.\n * Windows by default are visible unless explicitly being defined with flag\n * `NK_WINDOW_HIDDEN`, the user clicked the close button on windows with flag\n * `NK_WINDOW_CLOSABLE` or if a window was explicitly hidden by calling\n * `nk_window_show`. To explicitly close and destroy a window call `nk_window_close`.\n *\n * Usage\n * -------------------\n * To create and keep a window you have to call one of the two `nk_begin_xxx`\n * functions to start window declarations and `nk_end` at the end. Furthermore it\n * is recommended to check the return value of `nk_begin_xxx` and only process\n * widgets inside the window if the value is not 0. Either way you have to call\n * `nk_end` at the end of window declarations. Furthmore do not attempt to\n * nest `nk_begin_xxx` calls which will hopefully result in an assert or if not\n * in a segmation fault.\n *\n *      if (nk_begin_xxx(...) {\n *          [... widgets ...]\n *      }\n *      nk_end(ctx);\n *\n * In the grand concept window and widget declarations need to occur after input\n * handling and before drawing to screen. Not doing so can result in higher\n * latency or at worst invalid behavior. Furthermore make sure that `nk_clear`\n * is called at the end of the frame. While nuklears default platform backends\n * already call `nk_clear` for you if you write your own backend not calling\n * `nk_clear` can cause asserts or even worse undefined behavior.\n *\n *      struct nk_context ctx;\n *      nk_init_xxx(&ctx, ...);\n *      while (1) {\n *          Event evt;\n *          nk_input_begin(&ctx);\n *          while (GetEvent(&evt)) {\n *              if (evt.type == MOUSE_MOVE)\n *                  nk_input_motion(&ctx, evt.motion.x, evt.motion.y);\n *              else if (evt.type == [...]) {\n *                  nk_input_xxx(...);\n *              }\n *          }\n *          nk_input_end(&ctx);\n *\n *          if (nk_begin_xxx(...) {\n *              [...]\n *          }\n *          nk_end(ctx);\n *\n *          const struct nk_command *cmd = 0;\n *          nk_foreach(cmd, &ctx) {\n *          case NK_COMMAND_LINE:\n *              your_draw_line_function(...)\n *              break;\n *          case NK_COMMAND_RECT\n *              your_draw_rect_function(...)\n *              break;\n *          case ...:\n *              [...]\n *          }\n *          nk_clear(&ctx);\n *      }\n *      nk_free(&ctx);\n *\n *  Reference\n *  -------------------\n *  nk_begin                            - starts a new window; needs to be called every frame for every window (unless hidden) or otherwise the window gets removed\n *  nk_begin_titled                     - extended window start with seperated title and identifier to allow multiple windows with same name but not title\n *  nk_end                              - needs to be called at the end of the window building process to process scaling, scrollbars and general cleanup\n *\n *  nk_window_find                      - finds and returns the window with give name\n *  nk_window_get_bounds                - returns a rectangle with screen position and size of the currently processed window.\n *  nk_window_get_position              - returns the position of the currently processed window\n *  nk_window_get_size                  - returns the size with width and height of the currently processed window\n *  nk_window_get_width                 - returns the width of the currently processed window\n *  nk_window_get_height                - returns the height of the currently processed window\n *  nk_window_get_panel                 - returns the underlying panel which contains all processing state of the currnet window\n *  nk_window_get_content_region        - returns the position and size of the currently visible and non-clipped space inside the currently processed window\n *  nk_window_get_content_region_min    - returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window\n *  nk_window_get_content_region_max    - returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window\n *  nk_window_get_content_region_size   - returns the size of the currently visible and non-clipped space inside the currently processed window\n *  nk_window_get_canvas                - returns the draw command buffer. Can be used to draw custom widgets\n *\n *  nk_window_has_focus                 - returns if the currently processed window is currently active\n *  nk_window_is_collapsed              - returns if the window with given name is currently minimized/collapsed\n *  nk_window_is_closed                 - returns if the currently processed window was closed\n *  nk_window_is_hidden                 - returns if the currently processed window was hidden\n *  nk_window_is_active                 - same as nk_window_has_focus for some reason\n *  nk_window_is_hovered                - returns if the currently processed window is currently being hovered by mouse\n *  nk_window_is_any_hovered            - return if any wndow currently hovered\n *  nk_item_is_any_active               - returns if any window or widgets is currently hovered or active\n *\n *  nk_window_set_bounds                - updates position and size of the currently processed window\n *  nk_window_set_position              - updates position of the currently process window\n *  nk_window_set_size                  - updates the size of the currently processed window\n *  nk_window_set_focus                 - set the currently processed window as active window\n *\n *  nk_window_close                     - closes the window with given window name which deletes the window at the end of the frame\n *  nk_window_collapse                  - collapses the window with given window name\n *  nk_window_collapse_if               - collapses the window with given window name if the given condition was met\n *  nk_window_show                      - hides a visible or reshows a hidden window\n *  nk_window_show_if                   - hides/shows a window depending on condition\n */\nenum nk_panel_flags {\n    NK_WINDOW_BORDER            = NK_FLAG(0), /* Draws a border around the window to visually separate window from the background */\n    NK_WINDOW_MOVABLE           = NK_FLAG(1), /* The movable flag indicates that a window can be moved by user input or by dragging the window header */\n    NK_WINDOW_SCALABLE          = NK_FLAG(2), /* The scalable flag indicates that a window can be scaled by user input by dragging a scaler icon at the button of the window */\n    NK_WINDOW_CLOSABLE          = NK_FLAG(3), /* adds a closable icon into the header */\n    NK_WINDOW_MINIMIZABLE       = NK_FLAG(4), /* adds a minimize icon into the header */\n    NK_WINDOW_NO_SCROLLBAR      = NK_FLAG(5), /* Removes the scrollbar from the window */\n    NK_WINDOW_TITLE             = NK_FLAG(6), /* Forces a header at the top at the window showing the title */\n    NK_WINDOW_SCROLL_AUTO_HIDE  = NK_FLAG(7), /* Automatically hides the window scrollbar if no user interaction: also requires delta time in `nk_context` to be set each frame */\n    NK_WINDOW_BACKGROUND        = NK_FLAG(8), /* Always keep window in the background */\n    NK_WINDOW_SCALE_LEFT        = NK_FLAG(9), /* Puts window scaler in the left-ottom corner instead right-bottom*/\n    NK_WINDOW_NO_INPUT          = NK_FLAG(10) /* Prevents window of scaling, moving or getting focus */\n};\n/*  nk_begin - starts a new window; needs to be called every frame for every window (unless hidden) or otherwise the window gets removed\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @title window title and identifier. Needs to be persitent over frames to identify the window\n *      @bounds initial position and window size. However if you do not define `NK_WINDOW_SCALABLE` or `NK_WINDOW_MOVABLE` you can set window position and size every frame\n *      @flags window flags defined in `enum nk_panel_flags` with a number of different window behaviors\n *  Return values:\n *      returns 1 if the window can be filled up with widgets from this point until `nk_end or 0 otherwise for example if minimized `*/\nNK_API int nk_begin(struct nk_context *ctx, const char *title, struct nk_rect bounds, nk_flags flags);\n/*  nk_begin_titled - extended window start with seperated title and identifier to allow multiple windows with same name but not title\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name window identifier. Needs to be persitent over frames to identify the window\n *      @title window title displayed inside header if flag `NK_WINDOW_TITLE` or either `NK_WINDOW_CLOSABLE` or `NK_WINDOW_MINIMIZED` was set\n *      @bounds initial position and window size. However if you do not define `NK_WINDOW_SCALABLE` or `NK_WINDOW_MOVABLE` you can set window position and size every frame\n *      @flags window flags defined in `enum nk_panel_flags` with a number of different window behaviors\n *  Return values:\n *      returns 1 if the window can be filled up with widgets from this point until `nk_end or 0 otherwise `*/\nNK_API int nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, struct nk_rect bounds, nk_flags flags);\n/*  nk_end - needs to be called at the end of the window building process to process scaling, scrollbars and general cleanup.\n *  All widget calls after this functions will result in asserts or no state changes\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct */\nNK_API void nk_end(struct nk_context *ctx);\n/*  nk_window_find - finds and returns the window with give name\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name window identifier\n *  Return values:\n *      returns a `nk_window` struct pointing to the idified window or 0 if no window with given name was found */\nNK_API struct nk_window *nk_window_find(struct nk_context *ctx, const char *name);\n/*  nk_window_get_bounds - returns a rectangle with screen position and size of the currently processed window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns a `nk_rect` struct with window upper left position and size */\nNK_API struct nk_rect nk_window_get_bounds(const struct nk_context *ctx);\n/*  nk_window_get_position - returns the position of the currently processed window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns a `nk_vec2` struct with window upper left position */\nNK_API struct nk_vec2 nk_window_get_position(const struct nk_context *ctx);\n/*  nk_window_get_size - returns the size with width and height of the currently processed window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns a `nk_vec2` struct with window size */\nNK_API struct nk_vec2 nk_window_get_size(const struct nk_context*);\n/*  nk_window_get_width - returns the width of the currently processed window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns the window width */\nNK_API float nk_window_get_width(const struct nk_context*);\n/*  nk_window_get_height - returns the height of the currently processed window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns the window height */\nNK_API float nk_window_get_height(const struct nk_context*);\n/*  nk_window_get_panel - returns the underlying panel which contains all processing state of the currnet window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns a pointer to window internal `nk_panel` state. DO NOT keep this pointer around it is only valid until `nk_end` */\nNK_API struct nk_panel* nk_window_get_panel(struct nk_context*);\n/*  nk_window_get_content_region - returns the position and size of the currently visible and non-clipped space inside the currently processed window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns `nk_rect` struct with screen position and size (no scrollbar offset) of the visible space inside the current window */\nNK_API struct nk_rect nk_window_get_content_region(struct nk_context*);\n/*  nk_window_get_content_region_min - returns the upper left position of the currently visible and non-clipped space inside the currently processed window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns `nk_vec2` struct with  upper left screen position (no scrollbar offset) of the visible space inside the current window */\nNK_API struct nk_vec2 nk_window_get_content_region_min(struct nk_context*);\n/*  nk_window_get_content_region_max - returns the lower right screen position of the currently visible and non-clipped space inside the currently processed window.\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns `nk_vec2` struct with lower right screen position (no scrollbar offset) of the visible space inside the current window */\nNK_API struct nk_vec2 nk_window_get_content_region_max(struct nk_context*);\n/*  nk_window_get_content_region_size - returns the size of the currently visible and non-clipped space inside the currently processed window\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns `nk_vec2` struct with size the visible space inside the current window */\nNK_API struct nk_vec2 nk_window_get_content_region_size(struct nk_context*);\n/*  nk_window_get_canvas - returns the draw command buffer. Can be used to draw custom widgets\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns a pointer to window internal `nk_command_buffer` struct used as drawing canvas. Can be used to do custom drawing */\nNK_API struct nk_command_buffer* nk_window_get_canvas(struct nk_context*);\n/*  nk_window_has_focus - returns if the currently processed window is currently active\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns 0 if current window is not active or 1 if it is */\nNK_API int nk_window_has_focus(const struct nk_context*);\n/*  nk_window_is_collapsed - returns if the window with given name is currently minimized/collapsed\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of window you want to check is collapsed\n *  Return values:\n *      returns 1 if current window is minimized and 0 if window not found or is not minimized */\nNK_API int nk_window_is_collapsed(struct nk_context *ctx, const char *name);\n/*  nk_window_is_closed - returns if the window with given name was closed by calling `nk_close`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of window you want to check is closed\n *  Return values:\n *      returns 1 if current window was closed or 0 window not found or not closed */\nNK_API int nk_window_is_closed(struct nk_context*, const char*);\n/*  nk_window_is_hidden - returns if the window with given name is hidden\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of window you want to check is hidden\n *  Return values:\n *      returns 1 if current window is hidden or 0 window not found or visible */\nNK_API int nk_window_is_hidden(struct nk_context*, const char*);\n/*  nk_window_is_active - same as nk_window_has_focus for some reason\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of window you want to check is hidden\n *  Return values:\n *      returns 1 if current window is active or 0 window not found or not active */\nNK_API int nk_window_is_active(struct nk_context*, const char*);\n/*  nk_window_is_hovered - return if the current window is being hovered\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns 1 if current window is hovered or 0 otherwise */\nNK_API int nk_window_is_hovered(struct nk_context*);\n/*  nk_window_is_any_hovered - returns if the any window is being hovered\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns 1 if any window is hovered or 0 otherwise */\nNK_API int nk_window_is_any_hovered(struct nk_context*);\n/*  nk_item_is_any_active - returns if the any window is being hovered or any widget is currently active.\n *  Can be used to decide if input should be processed by UI or your specific input handling.\n *  Example could be UI and 3D camera to move inside a 3D space.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *  Return values:\n *      returns 1 if any window is hovered or any item is active or 0 otherwise */\nNK_API int nk_item_is_any_active(struct nk_context*);\n/*  nk_window_set_bounds - updates position and size of the currently processed window\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @bounds points to a `nk_rect` struct with the new position and size of currently active window */\nNK_API void nk_window_set_bounds(struct nk_context*, struct nk_rect bounds);\n/*  nk_window_set_position - updates position of the currently processed window\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @pos points to a `nk_vec2` struct with the new position of currently active window */\nNK_API void nk_window_set_position(struct nk_context*, struct nk_vec2 pos);\n/*  nk_window_set_size - updates size of the currently processed window\n *  IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @bounds points to a `nk_vec2` struct with the new size of currently active window */\nNK_API void nk_window_set_size(struct nk_context*, struct nk_vec2);\n/*  nk_window_set_focus - sets the window with given name as active\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of the window to be set active */\nNK_API void nk_window_set_focus(struct nk_context*, const char *name);\n/*  nk_window_close - closed a window and marks it for being freed at the end of the frame\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of the window to be closed */\nNK_API void nk_window_close(struct nk_context *ctx, const char *name);\n/*  nk_window_collapse - updates collapse state of a window with given name\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of the window to be either collapse or maximize */\nNK_API void nk_window_collapse(struct nk_context*, const char *name, enum nk_collapse_states state);\n/*  nk_window_collapse - updates collapse state of a window with given name if given condition is met\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of the window to be either collapse or maximize\n *      @state the window should be put into\n *      @condition that has to be true to actually commit the collsage state change */\nNK_API void nk_window_collapse_if(struct nk_context*, const char *name, enum nk_collapse_states, int cond);\n/*  nk_window_show - updates visibility state of a window with given name\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of the window to be either collapse or maximize\n *      @state with either visible or hidden to modify the window with */\nNK_API void nk_window_show(struct nk_context*, const char *name, enum nk_show_states);\n/*  nk_window_show_if - updates visibility state of a window with given name if a given condition is met\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @name of the window to be either collapse or maximize\n *      @state with either visible or hidden to modify the window with\n *      @condition that has to be true to actually commit the visible state change */\nNK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show_states, int cond);\n/* =============================================================================\n *\n *                                  LAYOUT\n *\n * ============================================================================= */\n/*  Layouting in general describes placing widget inside a window with position and size.\n *  While in this particular implementation there are five different APIs for layouting\n *  each with different trade offs between control and ease of use.\n *\n *  All layouting methodes in this library are based around the concept of a row.\n *  A row has a height the window content grows by and a number of columns and each\n *  layouting method specifies how each widget is placed inside the row.\n *  After a row has been allocated by calling a layouting functions and then\n *  filled with widgets will advance an internal pointer over the allocated row.\n *\n *  To acually define a layout you just call the appropriate layouting function\n *  and each subsequnetial widget call will place the widget as specified. Important\n *  here is that if you define more widgets then columns defined inside the layout\n *  functions it will allocate the next row without you having to make another layouting\n *  call.\n *\n *  Biggest limitation with using all these APIs outside the `nk_layout_space_xxx` API\n *  is that you have to define the row height for each. However the row height\n *  often depends on the height of the font.\n *\n *  To fix that internally nuklear uses a minimum row height that is set to the\n *  height plus padding of currently active font and overwrites the row height\n *  value if zero.\n *\n *  If you manually want to change the minimum row height then\n *  use nk_layout_set_min_row_height, and use nk_layout_reset_min_row_height to\n *  reset it back to be derived from font height.\n *\n *  Also if you change the font in nuklear it will automatically change the minimum\n *  row height for you and. This means if you change the font but still want\n *  a minimum row height smaller than the font you have to repush your value.\n *\n *  For actually more advanced UI I would even recommend using the `nk_layout_space_xxx`\n *  layouting method in combination with a cassowary constraint solver (there are\n *  some versions on github with permissive license model) to take over all control over widget\n *  layouting yourself. However for quick and dirty layouting using all the other layouting\n *  functions should be fine.\n *\n *  Usage\n *  -------------------\n *  1.) nk_layout_row_dynamic\n *  The easiest layouting function is `nk_layout_row_dynamic`. It provides each\n *  widgets with same horizontal space inside the row and dynamically grows\n *  if the owning window grows in width. So the number of columns dictates\n *  the size of each widget dynamically by formula:\n *\n *      widget_width = (window_width - padding - spacing) * (1/colum_count)\n *\n *  Just like all other layouting APIs if you define more widget than columns this\n *  library will allocate a new row and keep all layouting parameters previously\n *  defined.\n *\n *      if (nk_begin_xxx(...) {\n *          // first row with height: 30 composed of two widgets\n *          nk_layout_row_dynamic(&ctx, 30, 2);\n *          nk_widget(...);\n *          nk_widget(...);\n *\n *          // second row with same parameter as defined above\n *          nk_widget(...);\n *          nk_widget(...);\n *\n *          // third row uses 0 for height which will use auto layouting\n *          nk_layout_row_dynamic(&ctx, 0, 2);\n *          nk_widget(...);\n *          nk_widget(...);\n *      }\n *      nk_end(...);\n *\n *  2.) nk_layout_row_static\n *  Another easy layouting function is `nk_layout_row_static`. It provides each\n *  widget with same horizontal pixel width inside the row and does not grow\n *  if the owning window scales smaller or bigger.\n *\n *      if (nk_begin_xxx(...) {\n *          // first row with height: 30 composed of two widgets with width: 80\n *          nk_layout_row_static(&ctx, 30, 80, 2);\n *          nk_widget(...);\n *          nk_widget(...);\n *\n *          // second row with same parameter as defined above\n *          nk_widget(...);\n *          nk_widget(...);\n *\n *          // third row uses 0 for height which will use auto layouting\n *          nk_layout_row_static(&ctx, 0, 80, 2);\n *          nk_widget(...);\n *          nk_widget(...);\n *      }\n *      nk_end(...);\n *\n *  3.) nk_layout_row_xxx\n *  A little bit more advanced layouting API are functions `nk_layout_row_begin`,\n *  `nk_layout_row_push` and `nk_layout_row_end`. They allow to directly\n *  specify each column pixel or window ratio in a row. It supports either\n *  directly setting per column pixel width or widget window ratio but not\n *  both. Furthermore it is a immediate mode API so each value is directly\n *  pushed before calling a widget. Therefore the layout is not automatically\n *  repeating like the last two layouting functions.\n *\n *      if (nk_begin_xxx(...) {\n *          // first row with height: 25 composed of two widgets with width 60 and 40\n *          nk_layout_row_begin(ctx, NK_STATIC, 25, 2);\n *          nk_layout_row_push(ctx, 60);\n *          nk_widget(...);\n *          nk_layout_row_push(ctx, 40);\n *          nk_widget(...);\n *          nk_layout_row_end(ctx);\n *\n *          // second row with height: 25 composed of two widgets with window ratio 0.25 and 0.75\n *          nk_layout_row_begin(ctx, NK_DYNAMIC, 25, 2);\n *          nk_layout_row_push(ctx, 0.25f);\n *          nk_widget(...);\n *          nk_layout_row_push(ctx, 0.75f);\n *          nk_widget(...);\n *          nk_layout_row_end(ctx);\n *\n *          // third row with auto generated height: composed of two widgets with window ratio 0.25 and 0.75\n *          nk_layout_row_begin(ctx, NK_DYNAMIC, 0, 2);\n *          nk_layout_row_push(ctx, 0.25f);\n *          nk_widget(...);\n *          nk_layout_row_push(ctx, 0.75f);\n *          nk_widget(...);\n *          nk_layout_row_end(ctx);\n *      }\n *      nk_end(...);\n *\n *  4.) nk_layout_row\n *  The array counterpart to API nk_layout_row_xxx is the single nk_layout_row\n *  functions. Instead of pushing either pixel or window ratio for every widget\n *  it allows to define it by array. The trade of for less control is that\n *  `nk_layout_row` is automatically repeating. Otherwise the behavior is the\n *  same.\n *\n *      if (nk_begin_xxx(...) {\n *          // two rows with height: 30 composed of two widgets with width 60 and 40\n *          const float size[] = {60,40};\n *          nk_layout_row(ctx, NK_STATIC, 30, 2, ratio);\n *          nk_widget(...);\n *          nk_widget(...);\n *          nk_widget(...);\n *          nk_widget(...);\n *\n *          // two rows with height: 30 composed of two widgets with window ratio 0.25 and 0.75\n *          const float ratio[] = {0.25, 0.75};\n *          nk_layout_row(ctx, NK_DYNAMIC, 30, 2, ratio);\n *          nk_widget(...);\n *          nk_widget(...);\n *          nk_widget(...);\n *          nk_widget(...);\n *\n *          // two rows with auto generated height composed of two widgets with window ratio 0.25 and 0.75\n *          const float ratio[] = {0.25, 0.75};\n *          nk_layout_row(ctx, NK_DYNAMIC, 30, 2, ratio);\n *          nk_widget(...);\n *          nk_widget(...);\n *          nk_widget(...);\n *          nk_widget(...);\n *      }\n *      nk_end(...);\n *\n *  5.) nk_layout_row_template_xxx\n *  The most complex and second most flexible API is a simplified flexbox version without\n *  line wrapping and weights for dynamic widgets. It is an immediate mode API but\n *  unlike `nk_layout_row_xxx` it has auto repeat behavior and needs to be called\n *  before calling the templated widgets.\n *  The row template layout has three different per widget size specifier. The first\n *  one is the static widget size specifier with fixed widget pixel width. They do\n *  not grow if the row grows and will always stay the same. The second size\n *  specifier is nk_layout_row_template_push_variable which defines a\n *  minumum widget size but it also can grow if more space is available not taken\n *  by other widgets. Finally there are dynamic widgets which are completly flexible\n *  and unlike variable widgets can even shrink to zero if not enough space\n *  is provided.\n *\n *      if (nk_begin_xxx(...) {\n *          // two rows with height: 30 composed of three widgets\n *          nk_layout_row_template_begin(ctx, 30);\n *          nk_layout_row_template_push_dynamic(ctx);\n *          nk_layout_row_template_push_variable(ctx, 80);\n *          nk_layout_row_template_push_static(ctx, 80);\n *          nk_layout_row_template_end(ctx);\n *\n *          nk_widget(...); // dynamic widget can go to zero if not enough space\n *          nk_widget(...); // variable widget with min 80 pixel but can grow bigger if enough space\n *          nk_widget(...); // static widget with fixed 80 pixel width\n *\n *          // second row same layout\n *          nk_widget(...);\n *          nk_widget(...);\n *          nk_widget(...);\n *      }\n *      nk_end(...);\n *\n *  6.) nk_layout_space_xxx\n *  Finally the most flexible API directly allows you to place widgets inside the\n *  window. The space layout API is an immediate mode API which does not support\n *  row auto repeat and directly sets position and size of a widget. Position\n *  and size hereby can be either specified as ratio of alloated space or\n *  allocated space local position and pixel size. Since this API is quite\n *  powerfull there are a number of utility functions to get the available space\n *  and convert between local allocated space and screen space.\n *\n *      if (nk_begin_xxx(...) {\n *          // static row with height: 500 (you can set column count to INT_MAX if you don't want to be bothered)\n *          nk_layout_space_begin(ctx, NK_STATIC, 500, INT_MAX);\n *          nk_layout_space_push(ctx, nk_rect(0,0,150,200));\n *          nk_widget(...);\n *          nk_layout_space_push(ctx, nk_rect(200,200,100,200));\n *          nk_widget(...);\n *          nk_layout_space_end(ctx);\n *\n *          // dynamic row with height: 500 (you can set column count to INT_MAX if you don't want to be bothered)\n *          nk_layout_space_begin(ctx, NK_DYNAMIC, 500, INT_MAX);\n *          nk_layout_space_push(ctx, nk_rect(0.5,0.5,0.1,0.1));\n *          nk_widget(...);\n *          nk_layout_space_push(ctx, nk_rect(0.7,0.6,0.1,0.1));\n *          nk_widget(...);\n *      }\n *      nk_end(...);\n *\n *  Reference\n *  -------------------\n *  nk_layout_set_min_row_height            - set the currently used minimum row height to a specified value\n *  nk_layout_reset_min_row_height          - resets the currently used minimum row height to font height\n *\n *  nk_layout_widget_bounds                 - calculates current width a static layout row can fit inside a window\n *  nk_layout_ratio_from_pixel              - utility functions to calculate window ratio from pixel size\n *\n *  nk_layout_row_dynamic                   - current layout is divided into n same sized gowing columns\n *  nk_layout_row_static                    - current layout is divided into n same fixed sized columns\n *  nk_layout_row_begin                     - starts a new row with given height and number of columns\n *  nk_layout_row_push                      - pushes another column with given size or window ratio\n *  nk_layout_row_end                       - finished previously started row\n *  nk_layout_row                           - specifies row columns in array as either window ratio or size\n *\n *  nk_layout_row_template_begin            - begins the row template declaration\n *  nk_layout_row_template_push_dynamic     - adds a dynamic column that dynamically grows and can go to zero if not enough space\n *  nk_layout_row_template_push_variable    - adds a variable column that dynamically grows but does not shrink below specified pixel width\n *  nk_layout_row_template_push_static      - adds a static column that does not grow and will always have the same size\n *  nk_layout_row_template_end              - marks the end of the row template\n *\n *  nk_layout_space_begin                   - begins a new layouting space that allows to specify each widgets position and size\n *  nk_layout_space_push                    - pushes position and size of the next widget in own coordiante space either as pixel or ratio\n *  nk_layout_space_end                     - marks the end of the layouting space\n *\n *  nk_layout_space_bounds                  - callable after nk_layout_space_begin and returns total space allocated\n *  nk_layout_space_to_screen               - convertes vector from nk_layout_space coordiant space into screen space\n *  nk_layout_space_to_local                - convertes vector from screem space into nk_layout_space coordinates\n *  nk_layout_space_rect_to_screen          - convertes rectangle from nk_layout_space coordiant space into screen space\n *  nk_layout_space_rect_to_local           - convertes rectangle from screem space into nk_layout_space coordinates\n */\n/*  nk_layout_set_min_row_height - sets the currently used minimum row height.\n *  IMPORTANT: The passed height needs to include both your prefered row height\n *  as well as padding. No internal padding is added.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx`\n *      @height new minimum row height to be used for auto generating the row height */\nNK_API void nk_layout_set_min_row_height(struct nk_context*, float height);\n/*  nk_layout_reset_min_row_height - Reset the currently used minimum row height\n *  back to font height + text padding + additional padding (style_window.min_row_height_padding)\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` */\nNK_API void nk_layout_reset_min_row_height(struct nk_context*);\n/*  nk_layout_widget_bounds - returns the width of the next row allocate by one of the layouting functions\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` */\nNK_API struct nk_rect nk_layout_widget_bounds(struct nk_context*);\n/*  nk_layout_ratio_from_pixel - utility functions to calculate window ratio from pixel size\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context`\n *      @pixel_width to convert to window ratio */\nNK_API float nk_layout_ratio_from_pixel(struct nk_context*, float pixel_width);\n/*  nk_layout_row_dynamic - Sets current row layout to share horizontal space\n *  between @cols number of widgets evenly. Once called all subsequent widget\n *  calls greater than @cols will allocate a new row with same layout.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx`\n *      @row_height holds height of each widget in row or zero for auto layouting\n *      @cols number of widget inside row */\nNK_API void nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols);\n/*  nk_layout_row_static - Sets current row layout to fill @cols number of widgets\n *  in row with same @item_width horizontal size. Once called all subsequent widget\n *  calls greater than @cols will allocate a new row with same layout.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx`\n *      @height holds row height to allocate from panel for widget height\n *      @item_width holds width of each widget in row\n *      @cols number of widget inside row */\nNK_API void nk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols);\n/*  nk_layout_row_begin - Starts a new dynamic or fixed row with given height and columns.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx`\n *      @fmt either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns\n *      @row_height holds height of each widget in row or zero for auto layouting\n *      @cols number of widget inside row */\nNK_API void nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt, float row_height, int cols);\n/*  nk_layout_row_push - Specifies either window ratio or width of a single column\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_begin`\n *      @value either a window ratio or fixed width depending on @fmt in previous `nk_layout_row_begin` call */\nNK_API void nk_layout_row_push(struct nk_context*, float value);\n/*  nk_layout_row_end - finished previously started row\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_begin` */\nNK_API void nk_layout_row_end(struct nk_context*);\n/*  nk_layout_row - specifies row columns in array as either window ratio or size\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context`\n *      @fmt either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns\n *      @row_height holds height of each widget in row or zero for auto layouting\n *      @cols number of widget inside row */\nNK_API void nk_layout_row(struct nk_context*, enum nk_layout_format, float height, int cols, const float *ratio);\n/*  nk_layout_row_template_begin - Begins the row template declaration\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @row_height holds height of each widget in row or zero for auto layouting */\nNK_API void nk_layout_row_template_begin(struct nk_context*, float row_height);\n/*  nk_layout_row_template_push_dynamic - adds a dynamic column that dynamically grows and can go to zero if not enough space\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_template_begin` */\nNK_API void nk_layout_row_template_push_dynamic(struct nk_context*);\n/*  nk_layout_row_template_push_variable - adds a variable column that dynamically grows but does not shrink below specified pixel width\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_template_begin`\n *      @min_width holds the minimum pixel width the next column must be */\nNK_API void nk_layout_row_template_push_variable(struct nk_context*, float min_width);\n/*  nk_layout_row_template_push_static - adds a static column that does not grow and will always have the same size\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_template_begin`\n *      @width holds the absolulte pixel width value the next column must be */\nNK_API void nk_layout_row_template_push_static(struct nk_context*, float width);\n/*  nk_layout_row_template_end - marks the end of the row template\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_template_begin` */\nNK_API void nk_layout_row_template_end(struct nk_context*);\n/*  nk_layout_space_begin - begins a new layouting space that allows to specify each widgets position and size.\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct\n *      @fmt either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns\n *      @row_height holds height of each widget in row or zero for auto layouting\n *      @widget_count number of widgets inside row */\nNK_API void nk_layout_space_begin(struct nk_context*, enum nk_layout_format, float height, int widget_count);\n/*  nk_layout_space_push - pushes position and size of the next widget in own coordiante space either as pixel or ratio\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`\n *      @bounds position and size in laoyut space local coordinates */\nNK_API void nk_layout_space_push(struct nk_context*, struct nk_rect);\n/*  nk_layout_space_end - marks the end of the layout space\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` */\nNK_API void nk_layout_space_end(struct nk_context*);\n/*  nk_layout_space_bounds - returns total space allocated for `nk_layout_space`\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` */\nNK_API struct nk_rect nk_layout_space_bounds(struct nk_context*);\n/*  nk_layout_space_to_screen - convertes vector from nk_layout_space coordiant space into screen space\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`\n *      @vec position to convert from layout space into screen coordinate space */\nNK_API struct nk_vec2 nk_layout_space_to_screen(struct nk_context*, struct nk_vec2);\n/*  nk_layout_space_to_screen - convertes vector from layout space into screen space\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`\n *      @vec position to convert from screen space into layout coordinate space */\nNK_API struct nk_vec2 nk_layout_space_to_local(struct nk_context*, struct nk_vec2);\n/*  nk_layout_space_rect_to_screen - convertes rectangle from screen space into layout space\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`\n *      @bounds rectangle to convert from layout space into screen space */\nNK_API struct nk_rect nk_layout_space_rect_to_screen(struct nk_context*, struct nk_rect);\n/*  nk_layout_space_rect_to_local - convertes rectangle from layout space into screen space\n *  Parameters:\n *      @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`\n *      @bounds rectangle to convert from screen space into layout space */\nNK_API struct nk_rect nk_layout_space_rect_to_local(struct nk_context*, struct nk_rect);\n/* =============================================================================\n *\n *                                  GROUP\n *\n * ============================================================================= */\nNK_API int nk_group_begin(struct nk_context*, const char *title, nk_flags);\nNK_API int nk_group_scrolled_offset_begin(struct nk_context*, nk_uint *x_offset, nk_uint *y_offset, const char*, nk_flags);\nNK_API int nk_group_scrolled_begin(struct nk_context*, struct nk_scroll*, const char *title, nk_flags);\nNK_API void nk_group_scrolled_end(struct nk_context*);\nNK_API void nk_group_end(struct nk_context*);\n/* =============================================================================\n *\n *                                  LIST VIEW\n *\n * ============================================================================= */\nstruct nk_list_view {\n/* public: */\n    int begin, end, count;\n/* private: */\n    int total_height;\n    struct nk_context *ctx;\n    nk_uint *scroll_pointer;\n    nk_uint scroll_value;\n};\nNK_API int nk_list_view_begin(struct nk_context*, struct nk_list_view *out, const char *id, nk_flags, int row_height, int row_count);\nNK_API void nk_list_view_end(struct nk_list_view*);\n/* =============================================================================\n *\n *                                  TREE\n *\n * ============================================================================= */\n#define nk_tree_push(ctx, type, title, state) nk_tree_push_hashed(ctx, type, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__)\n#define nk_tree_push_id(ctx, type, title, state, id) nk_tree_push_hashed(ctx, type, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id)\nNK_API int nk_tree_push_hashed(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed);\n#define nk_tree_image_push(ctx, type, img, title, state) nk_tree_image_push_hashed(ctx, type, img, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__)\n#define nk_tree_image_push_id(ctx, type, img, title, state, id) nk_tree_image_push_hashed(ctx, type, img, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id)\nNK_API int nk_tree_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed);\nNK_API void nk_tree_pop(struct nk_context*);\nNK_API int nk_tree_state_push(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states *state);\nNK_API int nk_tree_state_image_push(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states *state);\nNK_API void nk_tree_state_pop(struct nk_context*);\n/* =============================================================================\n *\n *                                  WIDGET\n *\n * ============================================================================= */\nenum nk_widget_layout_states {\n    NK_WIDGET_INVALID, /* The widget cannot be seen and is completely out of view */\n    NK_WIDGET_VALID, /* The widget is completely inside the window and can be updated and drawn */\n    NK_WIDGET_ROM /* The widget is partially visible and cannot be updated */\n};\nenum nk_widget_states {\n    NK_WIDGET_STATE_MODIFIED    = NK_FLAG(1),\n    NK_WIDGET_STATE_INACTIVE    = NK_FLAG(2), /* widget is neither active nor hovered */\n    NK_WIDGET_STATE_ENTERED     = NK_FLAG(3), /* widget has been hovered on the current frame */\n    NK_WIDGET_STATE_HOVER       = NK_FLAG(4), /* widget is being hovered */\n    NK_WIDGET_STATE_ACTIVED     = NK_FLAG(5),/* widget is currently activated */\n    NK_WIDGET_STATE_LEFT        = NK_FLAG(6), /* widget is from this frame on not hovered anymore */\n    NK_WIDGET_STATE_HOVERED     = NK_WIDGET_STATE_HOVER|NK_WIDGET_STATE_MODIFIED, /* widget is being hovered */\n    NK_WIDGET_STATE_ACTIVE      = NK_WIDGET_STATE_ACTIVED|NK_WIDGET_STATE_MODIFIED /* widget is currently activated */\n};\nNK_API enum nk_widget_layout_states nk_widget(struct nk_rect*, const struct nk_context*);\nNK_API enum nk_widget_layout_states nk_widget_fitting(struct nk_rect*, struct nk_context*, struct nk_vec2);\nNK_API struct nk_rect nk_widget_bounds(struct nk_context*);\nNK_API struct nk_vec2 nk_widget_position(struct nk_context*);\nNK_API struct nk_vec2 nk_widget_size(struct nk_context*);\nNK_API float nk_widget_width(struct nk_context*);\nNK_API float nk_widget_height(struct nk_context*);\nNK_API int nk_widget_is_hovered(struct nk_context*);\nNK_API int nk_widget_is_mouse_clicked(struct nk_context*, enum nk_buttons);\nNK_API int nk_widget_has_mouse_click_down(struct nk_context*, enum nk_buttons, int down);\nNK_API void nk_spacing(struct nk_context*, int cols);\n/* =============================================================================\n *\n *                                  TEXT\n *\n * ============================================================================= */\nenum nk_text_align {\n    NK_TEXT_ALIGN_LEFT        = 0x01,\n    NK_TEXT_ALIGN_CENTERED    = 0x02,\n    NK_TEXT_ALIGN_RIGHT       = 0x04,\n    NK_TEXT_ALIGN_TOP         = 0x08,\n    NK_TEXT_ALIGN_MIDDLE      = 0x10,\n    NK_TEXT_ALIGN_BOTTOM      = 0x20\n};\nenum nk_text_alignment {\n    NK_TEXT_LEFT        = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_LEFT,\n    NK_TEXT_CENTERED    = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_CENTERED,\n    NK_TEXT_RIGHT       = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_RIGHT\n};\nNK_API void nk_text(struct nk_context*, const char*, int, nk_flags);\nNK_API void nk_text_colored(struct nk_context*, const char*, int, nk_flags, struct nk_color);\nNK_API void nk_text_wrap(struct nk_context*, const char*, int);\nNK_API void nk_text_wrap_colored(struct nk_context*, const char*, int, struct nk_color);\nNK_API void nk_label(struct nk_context*, const char*, nk_flags align);\nNK_API void nk_label_colored(struct nk_context*, const char*, nk_flags align, struct nk_color);\nNK_API void nk_label_wrap(struct nk_context*, const char*);\nNK_API void nk_label_colored_wrap(struct nk_context*, const char*, struct nk_color);\nNK_API void nk_image(struct nk_context*, struct nk_image);\n#ifdef NK_INCLUDE_STANDARD_VARARGS\nNK_API void nk_labelf(struct nk_context*, nk_flags, const char*, ...);\nNK_API void nk_labelf_colored(struct nk_context*, nk_flags align, struct nk_color, const char*,...);\nNK_API void nk_labelf_wrap(struct nk_context*, const char*,...);\nNK_API void nk_labelf_colored_wrap(struct nk_context*, struct nk_color, const char*,...);\nNK_API void nk_value_bool(struct nk_context*, const char *prefix, int);\nNK_API void nk_value_int(struct nk_context*, const char *prefix, int);\nNK_API void nk_value_uint(struct nk_context*, const char *prefix, unsigned int);\nNK_API void nk_value_float(struct nk_context*, const char *prefix, float);\nNK_API void nk_value_color_byte(struct nk_context*, const char *prefix, struct nk_color);\nNK_API void nk_value_color_float(struct nk_context*, const char *prefix, struct nk_color);\nNK_API void nk_value_color_hex(struct nk_context*, const char *prefix, struct nk_color);\n#endif\n/* =============================================================================\n *\n *                                  BUTTON\n *\n * ============================================================================= */\nNK_API int nk_button_text(struct nk_context*, const char *title, int len);\nNK_API int nk_button_label(struct nk_context*, const char *title);\nNK_API int nk_button_color(struct nk_context*, struct nk_color);\nNK_API int nk_button_symbol(struct nk_context*, enum nk_symbol_type);\nNK_API int nk_button_image(struct nk_context*, struct nk_image img);\nNK_API int nk_button_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags text_alignment);\nNK_API int nk_button_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment);\nNK_API int nk_button_image_label(struct nk_context*, struct nk_image img, const char*, nk_flags text_alignment);\nNK_API int nk_button_image_text(struct nk_context*, struct nk_image img, const char*, int, nk_flags alignment);\nNK_API int nk_button_text_styled(struct nk_context*, const struct nk_style_button*, const char *title, int len);\nNK_API int nk_button_label_styled(struct nk_context*, const struct nk_style_button*, const char *title);\nNK_API int nk_button_symbol_styled(struct nk_context*, const struct nk_style_button*, enum nk_symbol_type);\nNK_API int nk_button_image_styled(struct nk_context*, const struct nk_style_button*, struct nk_image img);\nNK_API int nk_button_symbol_text_styled(struct nk_context*,const struct nk_style_button*, enum nk_symbol_type, const char*, int, nk_flags alignment);\nNK_API int nk_button_symbol_label_styled(struct nk_context *ctx, const struct nk_style_button *style, enum nk_symbol_type symbol, const char *title, nk_flags align);\nNK_API int nk_button_image_label_styled(struct nk_context*,const struct nk_style_button*, struct nk_image img, const char*, nk_flags text_alignment);\nNK_API int nk_button_image_text_styled(struct nk_context*,const struct nk_style_button*, struct nk_image img, const char*, int, nk_flags alignment);\nNK_API void nk_button_set_behavior(struct nk_context*, enum nk_button_behavior);\nNK_API int nk_button_push_behavior(struct nk_context*, enum nk_button_behavior);\nNK_API int nk_button_pop_behavior(struct nk_context*);\n/* =============================================================================\n *\n *                                  CHECKBOX\n *\n * ============================================================================= */\nNK_API int nk_check_label(struct nk_context*, const char*, int active);\nNK_API int nk_check_text(struct nk_context*, const char*, int,int active);\nNK_API unsigned nk_check_flags_label(struct nk_context*, const char*, unsigned int flags, unsigned int value);\nNK_API unsigned nk_check_flags_text(struct nk_context*, const char*, int, unsigned int flags, unsigned int value);\nNK_API int nk_checkbox_label(struct nk_context*, const char*, int *active);\nNK_API int nk_checkbox_text(struct nk_context*, const char*, int, int *active);\nNK_API int nk_checkbox_flags_label(struct nk_context*, const char*, unsigned int *flags, unsigned int value);\nNK_API int nk_checkbox_flags_text(struct nk_context*, const char*, int, unsigned int *flags, unsigned int value);\n/* =============================================================================\n *\n *                                  RADIO BUTTON\n *\n * ============================================================================= */\nNK_API int nk_radio_label(struct nk_context*, const char*, int *active);\nNK_API int nk_radio_text(struct nk_context*, const char*, int, int *active);\nNK_API int nk_option_label(struct nk_context*, const char*, int active);\nNK_API int nk_option_text(struct nk_context*, const char*, int, int active);\n/* =============================================================================\n *\n *                                  SELECTABLE\n *\n * ============================================================================= */\nNK_API int nk_selectable_label(struct nk_context*, const char*, nk_flags align, int *value);\nNK_API int nk_selectable_text(struct nk_context*, const char*, int, nk_flags align, int *value);\nNK_API int nk_selectable_image_label(struct nk_context*,struct nk_image,  const char*, nk_flags align, int *value);\nNK_API int nk_selectable_image_text(struct nk_context*,struct nk_image, const char*, int, nk_flags align, int *value);\nNK_API int nk_select_label(struct nk_context*, const char*, nk_flags align, int value);\nNK_API int nk_select_text(struct nk_context*, const char*, int, nk_flags align, int value);\nNK_API int nk_select_image_label(struct nk_context*, struct nk_image,const char*, nk_flags align, int value);\nNK_API int nk_select_image_text(struct nk_context*, struct nk_image,const char*, int, nk_flags align, int value);\n/* =============================================================================\n *\n *                                  SLIDER\n *\n * ============================================================================= */\nNK_API float nk_slide_float(struct nk_context*, float min, float val, float max, float step);\nNK_API int nk_slide_int(struct nk_context*, int min, int val, int max, int step);\nNK_API int nk_slider_float(struct nk_context*, float min, float *val, float max, float step);\nNK_API int nk_slider_int(struct nk_context*, int min, int *val, int max, int step);\n/* =============================================================================\n *\n *                                  PROGRESSBAR\n *\n * ============================================================================= */\nNK_API int nk_progress(struct nk_context*, nk_size *cur, nk_size max, int modifyable);\nNK_API nk_size nk_prog(struct nk_context*, nk_size cur, nk_size max, int modifyable);\n\n/* =============================================================================\n *\n *                                  COLOR PICKER\n *\n * ============================================================================= */\nNK_API struct nk_color nk_color_picker(struct nk_context*, struct nk_color, enum nk_color_format);\nNK_API int nk_color_pick(struct nk_context*, struct nk_color*, enum nk_color_format);\n/* =============================================================================\n *\n *                                  PROPERTIES\n *\n * ============================================================================= */\nNK_API void nk_property_int(struct nk_context*, const char *name, int min, int *val, int max, int step, float inc_per_pixel);\nNK_API void nk_property_float(struct nk_context*, const char *name, float min, float *val, float max, float step, float inc_per_pixel);\nNK_API void nk_property_double(struct nk_context*, const char *name, double min, double *val, double max, double step, float inc_per_pixel);\nNK_API int nk_propertyi(struct nk_context*, const char *name, int min, int val, int max, int step, float inc_per_pixel);\nNK_API float nk_propertyf(struct nk_context*, const char *name, float min, float val, float max, float step, float inc_per_pixel);\nNK_API double nk_propertyd(struct nk_context*, const char *name, double min, double val, double max, double step, float inc_per_pixel);\n/* =============================================================================\n *\n *                                  TEXT EDIT\n *\n * ============================================================================= */\nenum nk_edit_flags {\n    NK_EDIT_DEFAULT                 = 0,\n    NK_EDIT_READ_ONLY               = NK_FLAG(0),\n    NK_EDIT_AUTO_SELECT             = NK_FLAG(1),\n    NK_EDIT_SIG_ENTER               = NK_FLAG(2),\n    NK_EDIT_ALLOW_TAB               = NK_FLAG(3),\n    NK_EDIT_NO_CURSOR               = NK_FLAG(4),\n    NK_EDIT_SELECTABLE              = NK_FLAG(5),\n    NK_EDIT_CLIPBOARD               = NK_FLAG(6),\n    NK_EDIT_CTRL_ENTER_NEWLINE      = NK_FLAG(7),\n    NK_EDIT_NO_HORIZONTAL_SCROLL    = NK_FLAG(8),\n    NK_EDIT_ALWAYS_INSERT_MODE      = NK_FLAG(9),\n    NK_EDIT_MULTILINE               = NK_FLAG(10),\n    NK_EDIT_GOTO_END_ON_ACTIVATE    = NK_FLAG(11)\n};\nenum nk_edit_types {\n    NK_EDIT_SIMPLE  = NK_EDIT_ALWAYS_INSERT_MODE,\n    NK_EDIT_FIELD   = NK_EDIT_SIMPLE|NK_EDIT_SELECTABLE|NK_EDIT_CLIPBOARD,\n    NK_EDIT_BOX     = NK_EDIT_ALWAYS_INSERT_MODE| NK_EDIT_SELECTABLE| NK_EDIT_MULTILINE|NK_EDIT_ALLOW_TAB|NK_EDIT_CLIPBOARD,\n    NK_EDIT_EDITOR  = NK_EDIT_SELECTABLE|NK_EDIT_MULTILINE|NK_EDIT_ALLOW_TAB| NK_EDIT_CLIPBOARD\n};\nenum nk_edit_events {\n    NK_EDIT_ACTIVE      = NK_FLAG(0), /* edit widget is currently being modified */\n    NK_EDIT_INACTIVE    = NK_FLAG(1), /* edit widget is not active and is not being modified */\n    NK_EDIT_ACTIVATED   = NK_FLAG(2), /* edit widget went from state inactive to state active */\n    NK_EDIT_DEACTIVATED = NK_FLAG(3), /* edit widget went from state active to state inactive */\n    NK_EDIT_COMMITED    = NK_FLAG(4) /* edit widget has received an enter and lost focus */\n};\nNK_API nk_flags nk_edit_string(struct nk_context*, nk_flags, char *buffer, int *len, int max, nk_plugin_filter);\nNK_API nk_flags nk_edit_string_zero_terminated(struct nk_context*, nk_flags, char *buffer, int max, nk_plugin_filter);\nNK_API nk_flags nk_edit_buffer(struct nk_context*, nk_flags, struct nk_text_edit*, nk_plugin_filter);\nNK_API void nk_edit_focus(struct nk_context*, nk_flags flags);\nNK_API void nk_edit_unfocus(struct nk_context*);\n/* =============================================================================\n *\n *                                  CHART\n *\n * ============================================================================= */\nNK_API int nk_chart_begin(struct nk_context*, enum nk_chart_type, int num, float min, float max);\nNK_API int nk_chart_begin_colored(struct nk_context*, enum nk_chart_type, struct nk_color, struct nk_color active, int num, float min, float max);\nNK_API void nk_chart_add_slot(struct nk_context *ctx, const enum nk_chart_type, int count, float min_value, float max_value);\nNK_API void nk_chart_add_slot_colored(struct nk_context *ctx, const enum nk_chart_type, struct nk_color, struct nk_color active, int count, float min_value, float max_value);\nNK_API nk_flags nk_chart_push(struct nk_context*, float);\nNK_API nk_flags nk_chart_push_slot(struct nk_context*, float, int);\nNK_API void nk_chart_end(struct nk_context*);\nNK_API void nk_plot(struct nk_context*, enum nk_chart_type, const float *values, int count, int offset);\nNK_API void nk_plot_function(struct nk_context*, enum nk_chart_type, void *userdata, float(*value_getter)(void* user, int index), int count, int offset);\n/* =============================================================================\n *\n *                                  POPUP\n *\n * ============================================================================= */\nNK_API int nk_popup_begin(struct nk_context*, enum nk_popup_type, const char*, nk_flags, struct nk_rect bounds);\nNK_API void nk_popup_close(struct nk_context*);\nNK_API void nk_popup_end(struct nk_context*);\n/* =============================================================================\n *\n *                                  COMBOBOX\n *\n * ============================================================================= */\nNK_API int nk_combo(struct nk_context*, const char **items, int count, int selected, int item_height, struct nk_vec2 size);\nNK_API int nk_combo_separator(struct nk_context*, const char *items_separated_by_separator, int separator, int selected, int count, int item_height, struct nk_vec2 size);\nNK_API int nk_combo_string(struct nk_context*, const char *items_separated_by_zeros, int selected, int count, int item_height, struct nk_vec2 size);\nNK_API int nk_combo_callback(struct nk_context*, void(*item_getter)(void*, int, const char**), void *userdata, int selected, int count, int item_height, struct nk_vec2 size);\nNK_API void nk_combobox(struct nk_context*, const char **items, int count, int *selected, int item_height, struct nk_vec2 size);\nNK_API void nk_combobox_string(struct nk_context*, const char *items_separated_by_zeros, int *selected, int count, int item_height, struct nk_vec2 size);\nNK_API void nk_combobox_separator(struct nk_context*, const char *items_separated_by_separator, int separator,int *selected, int count, int item_height, struct nk_vec2 size);\nNK_API void nk_combobox_callback(struct nk_context*, void(*item_getter)(void*, int, const char**), void*, int *selected, int count, int item_height, struct nk_vec2 size);\n/* =============================================================================\n *\n *                                  ABSTRACT COMBOBOX\n *\n * ============================================================================= */\nNK_API int nk_combo_begin_text(struct nk_context*, const char *selected, int, struct nk_vec2 size);\nNK_API int nk_combo_begin_label(struct nk_context*, const char *selected, struct nk_vec2 size);\nNK_API int nk_combo_begin_color(struct nk_context*, struct nk_color color, struct nk_vec2 size);\nNK_API int nk_combo_begin_symbol(struct nk_context*,  enum nk_symbol_type,  struct nk_vec2 size);\nNK_API int nk_combo_begin_symbol_label(struct nk_context*, const char *selected, enum nk_symbol_type, struct nk_vec2 size);\nNK_API int nk_combo_begin_symbol_text(struct nk_context*, const char *selected, int, enum nk_symbol_type, struct nk_vec2 size);\nNK_API int nk_combo_begin_image(struct nk_context*, struct nk_image img,  struct nk_vec2 size);\nNK_API int nk_combo_begin_image_label(struct nk_context*, const char *selected, struct nk_image, struct nk_vec2 size);\nNK_API int nk_combo_begin_image_text(struct nk_context*,  const char *selected, int, struct nk_image, struct nk_vec2 size);\nNK_API int nk_combo_item_label(struct nk_context*, const char*, nk_flags alignment);\nNK_API int nk_combo_item_text(struct nk_context*, const char*,int, nk_flags alignment);\nNK_API int nk_combo_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment);\nNK_API int nk_combo_item_image_text(struct nk_context*, struct nk_image, const char*, int,nk_flags alignment);\nNK_API int nk_combo_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment);\nNK_API int nk_combo_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment);\nNK_API void nk_combo_close(struct nk_context*);\nNK_API void nk_combo_end(struct nk_context*);\n/* =============================================================================\n *\n *                                  CONTEXTUAL\n *\n * ============================================================================= */\nNK_API int nk_contextual_begin(struct nk_context*, nk_flags, struct nk_vec2, struct nk_rect trigger_bounds);\nNK_API int nk_contextual_item_text(struct nk_context*, const char*, int,nk_flags align);\nNK_API int nk_contextual_item_label(struct nk_context*, const char*, nk_flags align);\nNK_API int nk_contextual_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment);\nNK_API int nk_contextual_item_image_text(struct nk_context*, struct nk_image, const char*, int len, nk_flags alignment);\nNK_API int nk_contextual_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment);\nNK_API int nk_contextual_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment);\nNK_API void nk_contextual_close(struct nk_context*);\nNK_API void nk_contextual_end(struct nk_context*);\n/* =============================================================================\n *\n *                                  TOOLTIP\n *\n * ============================================================================= */\nNK_API void nk_tooltip(struct nk_context*, const char*);\nNK_API int nk_tooltip_begin(struct nk_context*, float width);\nNK_API void nk_tooltip_end(struct nk_context*);\n/* =============================================================================\n *\n *                                  MENU\n *\n * ============================================================================= */\nNK_API void nk_menubar_begin(struct nk_context*);\nNK_API void nk_menubar_end(struct nk_context*);\nNK_API int nk_menu_begin_text(struct nk_context*, const char* title, int title_len, nk_flags align, struct nk_vec2 size);\nNK_API int nk_menu_begin_label(struct nk_context*, const char*, nk_flags align, struct nk_vec2 size);\nNK_API int nk_menu_begin_image(struct nk_context*, const char*, struct nk_image, struct nk_vec2 size);\nNK_API int nk_menu_begin_image_text(struct nk_context*, const char*, int,nk_flags align,struct nk_image, struct nk_vec2 size);\nNK_API int nk_menu_begin_image_label(struct nk_context*, const char*, nk_flags align,struct nk_image, struct nk_vec2 size);\nNK_API int nk_menu_begin_symbol(struct nk_context*, const char*, enum nk_symbol_type, struct nk_vec2 size);\nNK_API int nk_menu_begin_symbol_text(struct nk_context*, const char*, int,nk_flags align,enum nk_symbol_type, struct nk_vec2 size);\nNK_API int nk_menu_begin_symbol_label(struct nk_context*, const char*, nk_flags align,enum nk_symbol_type, struct nk_vec2 size);\nNK_API int nk_menu_item_text(struct nk_context*, const char*, int,nk_flags align);\nNK_API int nk_menu_item_label(struct nk_context*, const char*, nk_flags alignment);\nNK_API int nk_menu_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment);\nNK_API int nk_menu_item_image_text(struct nk_context*, struct nk_image, const char*, int len, nk_flags alignment);\nNK_API int nk_menu_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment);\nNK_API int nk_menu_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment);\nNK_API void nk_menu_close(struct nk_context*);\nNK_API void nk_menu_end(struct nk_context*);\n/* =============================================================================\n *\n *                                  STYLE\n *\n * ============================================================================= */\nenum nk_style_colors {\n    NK_COLOR_TEXT,\n    NK_COLOR_WINDOW,\n    NK_COLOR_HEADER,\n    NK_COLOR_BORDER,\n    NK_COLOR_BUTTON,\n    NK_COLOR_BUTTON_HOVER,\n    NK_COLOR_BUTTON_ACTIVE,\n    NK_COLOR_TOGGLE,\n    NK_COLOR_TOGGLE_HOVER,\n    NK_COLOR_TOGGLE_CURSOR,\n    NK_COLOR_SELECT,\n    NK_COLOR_SELECT_ACTIVE,\n    NK_COLOR_SLIDER,\n    NK_COLOR_SLIDER_CURSOR,\n    NK_COLOR_SLIDER_CURSOR_HOVER,\n    NK_COLOR_SLIDER_CURSOR_ACTIVE,\n    NK_COLOR_PROPERTY,\n    NK_COLOR_EDIT,\n    NK_COLOR_EDIT_CURSOR,\n    NK_COLOR_COMBO,\n    NK_COLOR_CHART,\n    NK_COLOR_CHART_COLOR,\n    NK_COLOR_CHART_COLOR_HIGHLIGHT,\n    NK_COLOR_SCROLLBAR,\n    NK_COLOR_SCROLLBAR_CURSOR,\n    NK_COLOR_SCROLLBAR_CURSOR_HOVER,\n    NK_COLOR_SCROLLBAR_CURSOR_ACTIVE,\n    NK_COLOR_TAB_HEADER,\n    NK_COLOR_COUNT\n};\nenum nk_style_cursor {\n    NK_CURSOR_ARROW,\n    NK_CURSOR_TEXT,\n    NK_CURSOR_MOVE,\n    NK_CURSOR_RESIZE_VERTICAL,\n    NK_CURSOR_RESIZE_HORIZONTAL,\n    NK_CURSOR_RESIZE_TOP_LEFT_DOWN_RIGHT,\n    NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT,\n    NK_CURSOR_COUNT\n};\nNK_API void nk_style_default(struct nk_context*);\nNK_API void nk_style_from_table(struct nk_context*, const struct nk_color*);\nNK_API void nk_style_load_cursor(struct nk_context*, enum nk_style_cursor, const struct nk_cursor*);\nNK_API void nk_style_load_all_cursors(struct nk_context*, struct nk_cursor*);\nNK_API const char* nk_style_get_color_by_name(enum nk_style_colors);\nNK_API void nk_style_set_font(struct nk_context*, const struct nk_user_font*);\nNK_API int nk_style_set_cursor(struct nk_context*, enum nk_style_cursor);\nNK_API void nk_style_show_cursor(struct nk_context*);\nNK_API void nk_style_hide_cursor(struct nk_context*);\n\nNK_API int nk_style_push_font(struct nk_context*, const struct nk_user_font*);\nNK_API int nk_style_push_float(struct nk_context*, float*, float);\nNK_API int nk_style_push_vec2(struct nk_context*, struct nk_vec2*, struct nk_vec2);\nNK_API int nk_style_push_style_item(struct nk_context*, struct nk_style_item*, struct nk_style_item);\nNK_API int nk_style_push_flags(struct nk_context*, nk_flags*, nk_flags);\nNK_API int nk_style_push_color(struct nk_context*, struct nk_color*, struct nk_color);\n\nNK_API int nk_style_pop_font(struct nk_context*);\nNK_API int nk_style_pop_float(struct nk_context*);\nNK_API int nk_style_pop_vec2(struct nk_context*);\nNK_API int nk_style_pop_style_item(struct nk_context*);\nNK_API int nk_style_pop_flags(struct nk_context*);\nNK_API int nk_style_pop_color(struct nk_context*);\n/* =============================================================================\n *\n *                                  COLOR\n *\n * ============================================================================= */\nNK_API struct nk_color nk_rgb(int r, int g, int b);\nNK_API struct nk_color nk_rgb_iv(const int *rgb);\nNK_API struct nk_color nk_rgb_bv(const nk_byte* rgb);\nNK_API struct nk_color nk_rgb_f(float r, float g, float b);\nNK_API struct nk_color nk_rgb_fv(const float *rgb);\nNK_API struct nk_color nk_rgb_hex(const char *rgb);\n\nNK_API struct nk_color nk_rgba(int r, int g, int b, int a);\nNK_API struct nk_color nk_rgba_u32(nk_uint);\nNK_API struct nk_color nk_rgba_iv(const int *rgba);\nNK_API struct nk_color nk_rgba_bv(const nk_byte *rgba);\nNK_API struct nk_color nk_rgba_f(float r, float g, float b, float a);\nNK_API struct nk_color nk_rgba_fv(const float *rgba);\nNK_API struct nk_color nk_rgba_hex(const char *rgb);\n\nNK_API struct nk_color nk_hsv(int h, int s, int v);\nNK_API struct nk_color nk_hsv_iv(const int *hsv);\nNK_API struct nk_color nk_hsv_bv(const nk_byte *hsv);\nNK_API struct nk_color nk_hsv_f(float h, float s, float v);\nNK_API struct nk_color nk_hsv_fv(const float *hsv);\n\nNK_API struct nk_color nk_hsva(int h, int s, int v, int a);\nNK_API struct nk_color nk_hsva_iv(const int *hsva);\nNK_API struct nk_color nk_hsva_bv(const nk_byte *hsva);\nNK_API struct nk_color nk_hsva_f(float h, float s, float v, float a);\nNK_API struct nk_color nk_hsva_fv(const float *hsva);\n\n/* color (conversion nuklear --> user) */\nNK_API void nk_color_f(float *r, float *g, float *b, float *a, struct nk_color);\nNK_API void nk_color_fv(float *rgba_out, struct nk_color);\nNK_API void nk_color_d(double *r, double *g, double *b, double *a, struct nk_color);\nNK_API void nk_color_dv(double *rgba_out, struct nk_color);\n\nNK_API nk_uint nk_color_u32(struct nk_color);\nNK_API void nk_color_hex_rgba(char *output, struct nk_color);\nNK_API void nk_color_hex_rgb(char *output, struct nk_color);\n\nNK_API void nk_color_hsv_i(int *out_h, int *out_s, int *out_v, struct nk_color);\nNK_API void nk_color_hsv_b(nk_byte *out_h, nk_byte *out_s, nk_byte *out_v, struct nk_color);\nNK_API void nk_color_hsv_iv(int *hsv_out, struct nk_color);\nNK_API void nk_color_hsv_bv(nk_byte *hsv_out, struct nk_color);\nNK_API void nk_color_hsv_f(float *out_h, float *out_s, float *out_v, struct nk_color);\nNK_API void nk_color_hsv_fv(float *hsv_out, struct nk_color);\n\nNK_API void nk_color_hsva_i(int *h, int *s, int *v, int *a, struct nk_color);\nNK_API void nk_color_hsva_b(nk_byte *h, nk_byte *s, nk_byte *v, nk_byte *a, struct nk_color);\nNK_API void nk_color_hsva_iv(int *hsva_out, struct nk_color);\nNK_API void nk_color_hsva_bv(nk_byte *hsva_out, struct nk_color);\nNK_API void nk_color_hsva_f(float *out_h, float *out_s, float *out_v, float *out_a, struct nk_color);\nNK_API void nk_color_hsva_fv(float *hsva_out, struct nk_color);\n/* =============================================================================\n *\n *                                  IMAGE\n *\n * ============================================================================= */\nNK_API nk_handle nk_handle_ptr(void*);\nNK_API nk_handle nk_handle_id(int);\nNK_API struct nk_image nk_image_handle(nk_handle);\nNK_API struct nk_image nk_image_ptr(void*);\nNK_API struct nk_image nk_image_id(int);\nNK_API int nk_image_is_subimage(const struct nk_image* img);\nNK_API struct nk_image nk_subimage_ptr(void*, unsigned short w, unsigned short h, struct nk_rect sub_region);\nNK_API struct nk_image nk_subimage_id(int, unsigned short w, unsigned short h, struct nk_rect sub_region);\nNK_API struct nk_image nk_subimage_handle(nk_handle, unsigned short w, unsigned short h, struct nk_rect sub_region);\n/* =============================================================================\n *\n *                                  MATH\n *\n * ============================================================================= */\nNK_API nk_hash nk_murmur_hash(const void *key, int len, nk_hash seed);\nNK_API void nk_triangle_from_direction(struct nk_vec2 *result, struct nk_rect r, float pad_x, float pad_y, enum nk_heading);\n\nNK_API struct nk_vec2 nk_vec2(float x, float y);\nNK_API struct nk_vec2 nk_vec2i(int x, int y);\nNK_API struct nk_vec2 nk_vec2v(const float *xy);\nNK_API struct nk_vec2 nk_vec2iv(const int *xy);\n\nNK_API struct nk_rect nk_get_null_rect(void);\nNK_API struct nk_rect nk_rect(float x, float y, float w, float h);\nNK_API struct nk_rect nk_recti(int x, int y, int w, int h);\nNK_API struct nk_rect nk_recta(struct nk_vec2 pos, struct nk_vec2 size);\nNK_API struct nk_rect nk_rectv(const float *xywh);\nNK_API struct nk_rect nk_rectiv(const int *xywh);\nNK_API struct nk_vec2 nk_rect_pos(struct nk_rect);\nNK_API struct nk_vec2 nk_rect_size(struct nk_rect);\n/* =============================================================================\n *\n *                                  STRING\n *\n * ============================================================================= */\nNK_API int nk_strlen(const char *str);\nNK_API int nk_stricmp(const char *s1, const char *s2);\nNK_API int nk_stricmpn(const char *s1, const char *s2, int n);\nNK_API int nk_strtoi(const char *str, const char **endptr);\nNK_API float nk_strtof(const char *str, const char **endptr);\nNK_API double nk_strtod(const char *str, const char **endptr);\nNK_API int nk_strfilter(const char *text, const char *regexp);\nNK_API int nk_strmatch_fuzzy_string(char const *str, char const *pattern, int *out_score);\nNK_API int nk_strmatch_fuzzy_text(const char *txt, int txt_len, const char *pattern, int *out_score);\n/* =============================================================================\n *\n *                                  UTF-8\n *\n * ============================================================================= */\nNK_API int nk_utf_decode(const char*, nk_rune*, int);\nNK_API int nk_utf_encode(nk_rune, char*, int);\nNK_API int nk_utf_len(const char*, int byte_len);\nNK_API const char* nk_utf_at(const char *buffer, int length, int index, nk_rune *unicode, int *len);\n/* ===============================================================\n *\n *                          FONT\n *\n * ===============================================================*/\n/*  Font handling in this library was designed to be quite customizable and lets\n    you decide what you want to use and what you want to provide. There are three\n    different ways to use the font atlas. The first two will use your font\n    handling scheme and only requires essential data to run nuklear. The next\n    slightly more advanced features is font handling with vertex buffer output.\n    Finally the most complex API wise is using nuklears font baking API.\n\n    1.) Using your own implementation without vertex buffer output\n    --------------------------------------------------------------\n    So first up the easiest way to do font handling is by just providing a\n    `nk_user_font` struct which only requires the height in pixel of the used\n    font and a callback to calculate the width of a string. This way of handling\n    fonts is best fitted for using the normal draw shape command API where you\n    do all the text drawing yourself and the library does not require any kind\n    of deeper knowledge about which font handling mechanism you use.\n    IMPORTANT: the `nk_user_font` pointer provided to nuklear has to persist\n    over the complete life time! I know this sucks but it is currently the only\n    way to switch between fonts.\n\n        float your_text_width_calculation(nk_handle handle, float height, const char *text, int len)\n        {\n            your_font_type *type = handle.ptr;\n            float text_width = ...;\n            return text_width;\n        }\n\n        struct nk_user_font font;\n        font.userdata.ptr = &your_font_class_or_struct;\n        font.height = your_font_height;\n        font.width = your_text_width_calculation;\n\n        struct nk_context ctx;\n        nk_init_default(&ctx, &font);\n\n    2.) Using your own implementation with vertex buffer output\n    --------------------------------------------------------------\n    While the first approach works fine if you don't want to use the optional\n    vertex buffer output it is not enough if you do. To get font handling working\n    for these cases you have to provide two additional parameters inside the\n    `nk_user_font`. First a texture atlas handle used to draw text as subimages\n    of a bigger font atlas texture and a callback to query a character's glyph\n    information (offset, size, ...). So it is still possible to provide your own\n    font and use the vertex buffer output.\n\n        float your_text_width_calculation(nk_handle handle, float height, const char *text, int len)\n        {\n            your_font_type *type = handle.ptr;\n            float text_width = ...;\n            return text_width;\n        }\n        void query_your_font_glyph(nk_handle handle, float font_height, struct nk_user_font_glyph *glyph, nk_rune codepoint, nk_rune next_codepoint)\n        {\n            your_font_type *type = handle.ptr;\n            glyph.width = ...;\n            glyph.height = ...;\n            glyph.xadvance = ...;\n            glyph.uv[0].x = ...;\n            glyph.uv[0].y = ...;\n            glyph.uv[1].x = ...;\n            glyph.uv[1].y = ...;\n            glyph.offset.x = ...;\n            glyph.offset.y = ...;\n        }\n\n        struct nk_user_font font;\n        font.userdata.ptr = &your_font_class_or_struct;\n        font.height = your_font_height;\n        font.width = your_text_width_calculation;\n        font.query = query_your_font_glyph;\n        font.texture.id = your_font_texture;\n\n        struct nk_context ctx;\n        nk_init_default(&ctx, &font);\n\n    3.) Nuklear font baker\n    ------------------------------------\n    The final approach if you do not have a font handling functionality or don't\n    want to use it in this library is by using the optional font baker.\n    The font baker API's can be used to create a font plus font atlas texture\n    and can be used with or without the vertex buffer output.\n\n    It still uses the `nk_user_font` struct and the two different approaches\n    previously stated still work. The font baker is not located inside\n    `nk_context` like all other systems since it can be understood as more of\n    an extension to nuklear and does not really depend on any `nk_context` state.\n\n    Font baker need to be initialized first by one of the nk_font_atlas_init_xxx\n    functions. If you don't care about memory just call the default version\n    `nk_font_atlas_init_default` which will allocate all memory from the standard library.\n    If you want to control memory allocation but you don't care if the allocated\n    memory is temporary and therefore can be freed directly after the baking process\n    is over or permanent you can call `nk_font_atlas_init`.\n\n    After successfull intializing the font baker you can add Truetype(.ttf) fonts from\n    different sources like memory or from file by calling one of the `nk_font_atlas_add_xxx`.\n    functions. Adding font will permanently store each font, font config and ttf memory block(!)\n    inside the font atlas and allows to reuse the font atlas. If you don't want to reuse\n    the font baker by for example adding additional fonts you can call\n    `nk_font_atlas_cleanup` after the baking process is over (after calling nk_font_atlas_end).\n\n    As soon as you added all fonts you wanted you can now start the baking process\n    for every selected glyphes to image by calling `nk_font_atlas_bake`.\n    The baking process returns image memory, width and height which can be used to\n    either create your own image object or upload it to any graphics library.\n    No matter which case you finally have to call `nk_font_atlas_end` which\n    will free all temporary memory including the font atlas image so make sure\n    you created our texture beforehand. `nk_font_atlas_end` requires a handle\n    to your font texture or object and optionally fills a `struct nk_draw_null_texture`\n    which can be used for the optional vertex output. If you don't want it just\n    set the argument to `NULL`.\n\n    At this point you are done and if you don't want to reuse the font atlas you\n    can call `nk_font_atlas_cleanup` to free all truetype blobs and configuration\n    memory. Finally if you don't use the font atlas and any of it's fonts anymore\n    you need to call `nk_font_atlas_clear` to free all memory still being used.\n\n        struct nk_font_atlas atlas;\n        nk_font_atlas_init_default(&atlas);\n        nk_font_atlas_begin(&atlas);\n        nk_font *font = nk_font_atlas_add_from_file(&atlas, \"Path/To/Your/TTF_Font.ttf\", 13, 0);\n        nk_font *font2 = nk_font_atlas_add_from_file(&atlas, \"Path/To/Your/TTF_Font2.ttf\", 16, 0);\n        const void* img = nk_font_atlas_bake(&atlas, &img_width, &img_height, NK_FONT_ATLAS_RGBA32);\n        nk_font_atlas_end(&atlas, nk_handle_id(texture), 0);\n\n        struct nk_context ctx;\n        nk_init_default(&ctx, &font->handle);\n        while (1) {\n\n        }\n        nk_font_atlas_clear(&atlas);\n\n    The font baker API is probably the most complex API inside this library and\n    I would suggest reading some of my examples `example/` to get a grip on how\n    to use the font atlas. There are a number of details I left out. For example\n    how to merge fonts, configure a font with `nk_font_config` to use other languages,\n    use another texture coodinate format and a lot more:\n\n        struct nk_font_config cfg = nk_font_config(font_pixel_height);\n        cfg.merge_mode = nk_false or nk_true;\n        cfg.range = nk_font_korean_glyph_ranges();\n        cfg.coord_type = NK_COORD_PIXEL;\n        nk_font *font = nk_font_atlas_add_from_file(&atlas, \"Path/To/Your/TTF_Font.ttf\", 13, &cfg);\n\n*/\nstruct nk_user_font_glyph;\ntypedef float(*nk_text_width_f)(nk_handle, float h, const char*, int len);\ntypedef void(*nk_query_font_glyph_f)(nk_handle handle, float font_height,\n                                    struct nk_user_font_glyph *glyph,\n                                    nk_rune codepoint, nk_rune next_codepoint);\n\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\nstruct nk_user_font_glyph {\n    struct nk_vec2 uv[2];\n    /* texture coordinates */\n    struct nk_vec2 offset;\n    /* offset between top left and glyph */\n    float width, height;\n    /* size of the glyph  */\n    float xadvance;\n    /* offset to the next glyph */\n};\n#endif\n\nstruct nk_user_font {\n    nk_handle userdata;\n    /* user provided font handle */\n    float height;\n    /* max height of the font */\n    nk_text_width_f width;\n    /* font string width in pixel callback */\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n    nk_query_font_glyph_f query;\n    /* font glyph callback to query drawing info */\n    nk_handle texture;\n    /* texture handle to the used font atlas or texture */\n#endif\n};\n\n#ifdef NK_INCLUDE_FONT_BAKING\nenum nk_font_coord_type {\n    NK_COORD_UV, /* texture coordinates inside font glyphs are clamped between 0-1 */\n    NK_COORD_PIXEL /* texture coordinates inside font glyphs are in absolute pixel */\n};\n\nstruct nk_baked_font {\n    float height;\n    /* height of the font  */\n    float ascent, descent;\n    /* font glyphs ascent and descent  */\n    nk_rune glyph_offset;\n    /* glyph array offset inside the font glyph baking output array  */\n    nk_rune glyph_count;\n    /* number of glyphs of this font inside the glyph baking array output */\n    const nk_rune *ranges;\n    /* font codepoint ranges as pairs of (from/to) and 0 as last element */\n};\n\nstruct nk_font_config {\n    struct nk_font_config *next;\n    /* NOTE: only used internally */\n    void *ttf_blob;\n    /* pointer to loaded TTF file memory block.\n     * NOTE: not needed for nk_font_atlas_add_from_memory and nk_font_atlas_add_from_file. */\n    nk_size ttf_size;\n    /* size of the loaded TTF file memory block\n     * NOTE: not needed for nk_font_atlas_add_from_memory and nk_font_atlas_add_from_file. */\n\n    unsigned char ttf_data_owned_by_atlas;\n    /* used inside font atlas: default to: 0*/\n    unsigned char merge_mode;\n    /* merges this font into the last font */\n    unsigned char pixel_snap;\n    /* align every character to pixel boundary (if true set oversample (1,1)) */\n    unsigned char oversample_v, oversample_h;\n    /* rasterize at hight quality for sub-pixel position */\n    unsigned char padding[3];\n\n    float size;\n    /* baked pixel height of the font */\n    enum nk_font_coord_type coord_type;\n    /* texture coordinate format with either pixel or UV coordinates */\n    struct nk_vec2 spacing;\n    /* extra pixel spacing between glyphs  */\n    const nk_rune *range;\n    /* list of unicode ranges (2 values per range, zero terminated) */\n    struct nk_baked_font *font;\n    /* font to setup in the baking process: NOTE: not needed for font atlas */\n    nk_rune fallback_glyph;\n    /* fallback glyph to use if a given rune is not found */\n};\n\nstruct nk_font_glyph {\n    nk_rune codepoint;\n    float xadvance;\n    float x0, y0, x1, y1, w, h;\n    float u0, v0, u1, v1;\n};\n\nstruct nk_font {\n    struct nk_font *next;\n    struct nk_user_font handle;\n    struct nk_baked_font info;\n    float scale;\n    struct nk_font_glyph *glyphs;\n    const struct nk_font_glyph *fallback;\n    nk_rune fallback_codepoint;\n    nk_handle texture;\n    struct nk_font_config *config;\n};\n\nenum nk_font_atlas_format {\n    NK_FONT_ATLAS_ALPHA8,\n    NK_FONT_ATLAS_RGBA32\n};\n\nstruct nk_font_atlas {\n    void *pixel;\n    int tex_width;\n    int tex_height;\n\n    struct nk_allocator permanent;\n    struct nk_allocator temporary;\n\n    struct nk_recti custom;\n    struct nk_cursor cursors[NK_CURSOR_COUNT];\n\n    int glyph_count;\n    struct nk_font_glyph *glyphs;\n    struct nk_font *default_font;\n    struct nk_font *fonts;\n    struct nk_font_config *config;\n    int font_num;\n};\n\n/* some language glyph codepoint ranges */\nNK_API const nk_rune *nk_font_default_glyph_ranges(void);\nNK_API const nk_rune *nk_font_chinese_glyph_ranges(void);\nNK_API const nk_rune *nk_font_cyrillic_glyph_ranges(void);\nNK_API const nk_rune *nk_font_korean_glyph_ranges(void);\n\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_API void nk_font_atlas_init_default(struct nk_font_atlas*);\n#endif\nNK_API void nk_font_atlas_init(struct nk_font_atlas*, struct nk_allocator*);\nNK_API void nk_font_atlas_init_custom(struct nk_font_atlas*, struct nk_allocator *persistent, struct nk_allocator *transient);\nNK_API void nk_font_atlas_begin(struct nk_font_atlas*);\nNK_API struct nk_font_config nk_font_config(float pixel_height);\nNK_API struct nk_font *nk_font_atlas_add(struct nk_font_atlas*, const struct nk_font_config*);\n#ifdef NK_INCLUDE_DEFAULT_FONT\nNK_API struct nk_font* nk_font_atlas_add_default(struct nk_font_atlas*, float height, const struct nk_font_config*);\n#endif\nNK_API struct nk_font* nk_font_atlas_add_from_memory(struct nk_font_atlas *atlas, void *memory, nk_size size, float height, const struct nk_font_config *config);\n#ifdef NK_INCLUDE_STANDARD_IO\nNK_API struct nk_font* nk_font_atlas_add_from_file(struct nk_font_atlas *atlas, const char *file_path, float height, const struct nk_font_config*);\n#endif\nNK_API struct nk_font *nk_font_atlas_add_compressed(struct nk_font_atlas*, void *memory, nk_size size, float height, const struct nk_font_config*);\nNK_API struct nk_font* nk_font_atlas_add_compressed_base85(struct nk_font_atlas*, const char *data, float height, const struct nk_font_config *config);\nNK_API const void* nk_font_atlas_bake(struct nk_font_atlas*, int *width, int *height, enum nk_font_atlas_format);\nNK_API void nk_font_atlas_end(struct nk_font_atlas*, nk_handle tex, struct nk_draw_null_texture*);\nNK_API const struct nk_font_glyph* nk_font_find_glyph(struct nk_font*, nk_rune unicode);\nNK_API void nk_font_atlas_cleanup(struct nk_font_atlas *atlas);\nNK_API void nk_font_atlas_clear(struct nk_font_atlas*);\n\n#endif\n\n/* ==============================================================\n *\n *                          MEMORY BUFFER\n *\n * ===============================================================*/\n/*  A basic (double)-buffer with linear allocation and resetting as only\n    freeing policy. The buffer's main purpose is to control all memory management\n    inside the GUI toolkit and still leave memory control as much as possible in\n    the hand of the user while also making sure the library is easy to use if\n    not as much control is needed.\n    In general all memory inside this library can be provided from the user in\n    three different ways.\n\n    The first way and the one providing most control is by just passing a fixed\n    size memory block. In this case all control lies in the hand of the user\n    since he can exactly control where the memory comes from and how much memory\n    the library should consume. Of course using the fixed size API removes the\n    ability to automatically resize a buffer if not enough memory is provided so\n    you have to take over the resizing. While being a fixed sized buffer sounds\n    quite limiting, it is very effective in this library since the actual memory\n    consumption is quite stable and has a fixed upper bound for a lot of cases.\n\n    If you don't want to think about how much memory the library should allocate\n    at all time or have a very dynamic UI with unpredictable memory consumption\n    habits but still want control over memory allocation you can use the dynamic\n    allocator based API. The allocator consists of two callbacks for allocating\n    and freeing memory and optional userdata so you can plugin your own allocator.\n\n    The final and easiest way can be used by defining\n    NK_INCLUDE_DEFAULT_ALLOCATOR which uses the standard library memory\n    allocation functions malloc and free and takes over complete control over\n    memory in this library.\n*/\nstruct nk_memory_status {\n    void *memory;\n    unsigned int type;\n    nk_size size;\n    nk_size allocated;\n    nk_size needed;\n    nk_size calls;\n};\n\nenum nk_allocation_type {\n    NK_BUFFER_FIXED,\n    NK_BUFFER_DYNAMIC\n};\n\nenum nk_buffer_allocation_type {\n    NK_BUFFER_FRONT,\n    NK_BUFFER_BACK,\n    NK_BUFFER_MAX\n};\n\nstruct nk_buffer_marker {\n    int active;\n    nk_size offset;\n};\n\nstruct nk_memory {void *ptr;nk_size size;};\nstruct nk_buffer {\n    struct nk_buffer_marker marker[NK_BUFFER_MAX];\n    /* buffer marker to free a buffer to a certain offset */\n    struct nk_allocator pool;\n    /* allocator callback for dynamic buffers */\n    enum nk_allocation_type type;\n    /* memory management type */\n    struct nk_memory memory;\n    /* memory and size of the current memory block */\n    float grow_factor;\n    /* growing factor for dynamic memory management */\n    nk_size allocated;\n    /* total amount of memory allocated */\n    nk_size needed;\n    /* totally consumed memory given that enough memory is present */\n    nk_size calls;\n    /* number of allocation calls */\n    nk_size size;\n    /* current size of the buffer */\n};\n\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_API void nk_buffer_init_default(struct nk_buffer*);\n#endif\nNK_API void nk_buffer_init(struct nk_buffer*, const struct nk_allocator*, nk_size size);\nNK_API void nk_buffer_init_fixed(struct nk_buffer*, void *memory, nk_size size);\nNK_API void nk_buffer_info(struct nk_memory_status*, struct nk_buffer*);\nNK_API void nk_buffer_push(struct nk_buffer*, enum nk_buffer_allocation_type type, const void *memory, nk_size size, nk_size align);\nNK_API void nk_buffer_mark(struct nk_buffer*, enum nk_buffer_allocation_type type);\nNK_API void nk_buffer_reset(struct nk_buffer*, enum nk_buffer_allocation_type type);\nNK_API void nk_buffer_clear(struct nk_buffer*);\nNK_API void nk_buffer_free(struct nk_buffer*);\nNK_API void *nk_buffer_memory(struct nk_buffer*);\nNK_API const void *nk_buffer_memory_const(const struct nk_buffer*);\nNK_API nk_size nk_buffer_total(struct nk_buffer*);\n\n/* ==============================================================\n *\n *                          STRING\n *\n * ===============================================================*/\n/*  Basic string buffer which is only used in context with the text editor\n *  to manage and manipulate dynamic or fixed size string content. This is _NOT_\n *  the default string handling method. The only instance you should have any contact\n *  with this API is if you interact with an `nk_text_edit` object inside one of the\n *  copy and paste functions and even there only for more advanced cases. */\nstruct nk_str {\n    struct nk_buffer buffer;\n    int len; /* in codepoints/runes/glyphs */\n};\n\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_API void nk_str_init_default(struct nk_str*);\n#endif\nNK_API void nk_str_init(struct nk_str*, const struct nk_allocator*, nk_size size);\nNK_API void nk_str_init_fixed(struct nk_str*, void *memory, nk_size size);\nNK_API void nk_str_clear(struct nk_str*);\nNK_API void nk_str_free(struct nk_str*);\n\nNK_API int nk_str_append_text_char(struct nk_str*, const char*, int);\nNK_API int nk_str_append_str_char(struct nk_str*, const char*);\nNK_API int nk_str_append_text_utf8(struct nk_str*, const char*, int);\nNK_API int nk_str_append_str_utf8(struct nk_str*, const char*);\nNK_API int nk_str_append_text_runes(struct nk_str*, const nk_rune*, int);\nNK_API int nk_str_append_str_runes(struct nk_str*, const nk_rune*);\n\nNK_API int nk_str_insert_at_char(struct nk_str*, int pos, const char*, int);\nNK_API int nk_str_insert_at_rune(struct nk_str*, int pos, const char*, int);\n\nNK_API int nk_str_insert_text_char(struct nk_str*, int pos, const char*, int);\nNK_API int nk_str_insert_str_char(struct nk_str*, int pos, const char*);\nNK_API int nk_str_insert_text_utf8(struct nk_str*, int pos, const char*, int);\nNK_API int nk_str_insert_str_utf8(struct nk_str*, int pos, const char*);\nNK_API int nk_str_insert_text_runes(struct nk_str*, int pos, const nk_rune*, int);\nNK_API int nk_str_insert_str_runes(struct nk_str*, int pos, const nk_rune*);\n\nNK_API void nk_str_remove_chars(struct nk_str*, int len);\nNK_API void nk_str_remove_runes(struct nk_str *str, int len);\nNK_API void nk_str_delete_chars(struct nk_str*, int pos, int len);\nNK_API void nk_str_delete_runes(struct nk_str*, int pos, int len);\n\nNK_API char *nk_str_at_char(struct nk_str*, int pos);\nNK_API char *nk_str_at_rune(struct nk_str*, int pos, nk_rune *unicode, int *len);\nNK_API nk_rune nk_str_rune_at(const struct nk_str*, int pos);\nNK_API const char *nk_str_at_char_const(const struct nk_str*, int pos);\nNK_API const char *nk_str_at_const(const struct nk_str*, int pos, nk_rune *unicode, int *len);\n\nNK_API char *nk_str_get(struct nk_str*);\nNK_API const char *nk_str_get_const(const struct nk_str*);\nNK_API int nk_str_len(struct nk_str*);\nNK_API int nk_str_len_char(struct nk_str*);\n\n/*===============================================================\n *\n *                      TEXT EDITOR\n *\n * ===============================================================*/\n/* Editing text in this library is handled by either `nk_edit_string` or\n * `nk_edit_buffer`. But like almost everything in this library there are multiple\n * ways of doing it and a balance between control and ease of use with memory\n * as well as functionality controlled by flags.\n *\n * This library generally allows three different levels of memory control:\n * First of is the most basic way of just providing a simple char array with\n * string length. This method is probably the easiest way of handling simple\n * user text input. Main upside is complete control over memory while the biggest\n * downside in comparsion with the other two approaches is missing undo/redo.\n *\n * For UIs that require undo/redo the second way was created. It is based on\n * a fixed size nk_text_edit struct, which has an internal undo/redo stack.\n * This is mainly useful if you want something more like a text editor but don't want\n * to have a dynamically growing buffer.\n *\n * The final way is using a dynamically growing nk_text_edit struct, which\n * has both a default version if you don't care where memory comes from and an\n * allocator version if you do. While the text editor is quite powerful for its\n * complexity I would not recommend editing gigabytes of data with it.\n * It is rather designed for uses cases which make sense for a GUI library not for\n * an full blown text editor.\n */\n#ifndef NK_TEXTEDIT_UNDOSTATECOUNT\n#define NK_TEXTEDIT_UNDOSTATECOUNT     99\n#endif\n\n#ifndef NK_TEXTEDIT_UNDOCHARCOUNT\n#define NK_TEXTEDIT_UNDOCHARCOUNT      999\n#endif\n\nstruct nk_text_edit;\nstruct nk_clipboard {\n    nk_handle userdata;\n    nk_plugin_paste paste;\n    nk_plugin_copy copy;\n};\n\nstruct nk_text_undo_record {\n   int where;\n   short insert_length;\n   short delete_length;\n   short char_storage;\n};\n\nstruct nk_text_undo_state {\n   struct nk_text_undo_record undo_rec[NK_TEXTEDIT_UNDOSTATECOUNT];\n   nk_rune undo_char[NK_TEXTEDIT_UNDOCHARCOUNT];\n   short undo_point;\n   short redo_point;\n   short undo_char_point;\n   short redo_char_point;\n};\n\nenum nk_text_edit_type {\n    NK_TEXT_EDIT_SINGLE_LINE,\n    NK_TEXT_EDIT_MULTI_LINE\n};\n\nenum nk_text_edit_mode {\n    NK_TEXT_EDIT_MODE_VIEW,\n    NK_TEXT_EDIT_MODE_INSERT,\n    NK_TEXT_EDIT_MODE_REPLACE\n};\n\nstruct nk_text_edit {\n    struct nk_clipboard clip;\n    struct nk_str string;\n    nk_plugin_filter filter;\n    struct nk_vec2 scrollbar;\n\n    int cursor;\n    int select_start;\n    int select_end;\n    unsigned char mode;\n    unsigned char cursor_at_end_of_line;\n    unsigned char initialized;\n    unsigned char has_preferred_x;\n    unsigned char single_line;\n    unsigned char active;\n    unsigned char padding1;\n    float preferred_x;\n    struct nk_text_undo_state undo;\n};\n\n/* filter function */\nNK_API int nk_filter_default(const struct nk_text_edit*, nk_rune unicode);\nNK_API int nk_filter_ascii(const struct nk_text_edit*, nk_rune unicode);\nNK_API int nk_filter_float(const struct nk_text_edit*, nk_rune unicode);\nNK_API int nk_filter_decimal(const struct nk_text_edit*, nk_rune unicode);\nNK_API int nk_filter_hex(const struct nk_text_edit*, nk_rune unicode);\nNK_API int nk_filter_oct(const struct nk_text_edit*, nk_rune unicode);\nNK_API int nk_filter_binary(const struct nk_text_edit*, nk_rune unicode);\n\n/* text editor */\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_API void nk_textedit_init_default(struct nk_text_edit*);\n#endif\nNK_API void nk_textedit_init(struct nk_text_edit*, struct nk_allocator*, nk_size size);\nNK_API void nk_textedit_init_fixed(struct nk_text_edit*, void *memory, nk_size size);\nNK_API void nk_textedit_free(struct nk_text_edit*);\nNK_API void nk_textedit_text(struct nk_text_edit*, const char*, int total_len);\nNK_API void nk_textedit_delete(struct nk_text_edit*, int where, int len);\nNK_API void nk_textedit_delete_selection(struct nk_text_edit*);\nNK_API void nk_textedit_select_all(struct nk_text_edit*);\nNK_API int nk_textedit_cut(struct nk_text_edit*);\nNK_API int nk_textedit_paste(struct nk_text_edit*, char const*, int len);\nNK_API void nk_textedit_undo(struct nk_text_edit*);\nNK_API void nk_textedit_redo(struct nk_text_edit*);\n\n/* ===============================================================\n *\n *                          DRAWING\n *\n * ===============================================================*/\n/*  This library was designed to be render backend agnostic so it does\n    not draw anything to screen. Instead all drawn shapes, widgets\n    are made of, are buffered into memory and make up a command queue.\n    Each frame therefore fills the command buffer with draw commands\n    that then need to be executed by the user and his own render backend.\n    After that the command buffer needs to be cleared and a new frame can be\n    started. It is probably important to note that the command buffer is the main\n    drawing API and the optional vertex buffer API only takes this format and\n    converts it into a hardware accessible format.\n\n    To use the command queue to draw your own widgets you can access the\n    command buffer of each window by calling `nk_window_get_canvas` after\n    previously having called `nk_begin`:\n\n        void draw_red_rectangle_widget(struct nk_context *ctx)\n        {\n            struct nk_command_buffer *canvas;\n            struct nk_input *input = &ctx->input;\n            canvas = nk_window_get_canvas(ctx);\n\n            struct nk_rect space;\n            enum nk_widget_layout_states state;\n            state = nk_widget(&space, ctx);\n            if (!state) return;\n\n            if (state != NK_WIDGET_ROM)\n                update_your_widget_by_user_input(...);\n            nk_fill_rect(canvas, space, 0, nk_rgb(255,0,0));\n        }\n\n        if (nk_begin(...)) {\n            nk_layout_row_dynamic(ctx, 25, 1);\n            draw_red_rectangle_widget(ctx);\n        }\n        nk_end(..)\n\n    Important to know if you want to create your own widgets is the `nk_widget`\n    call. It allocates space on the panel reserved for this widget to be used,\n    but also returns the state of the widget space. If your widget is not seen and does\n    not have to be updated it is '0' and you can just return. If it only has\n    to be drawn the state will be `NK_WIDGET_ROM` otherwise you can do both\n    update and draw your widget. The reason for seperating is to only draw and\n    update what is actually neccessary which is crucial for performance.\n*/\nenum nk_command_type {\n    NK_COMMAND_NOP,\n    NK_COMMAND_SCISSOR,\n    NK_COMMAND_LINE,\n    NK_COMMAND_CURVE,\n    NK_COMMAND_RECT,\n    NK_COMMAND_RECT_FILLED,\n    NK_COMMAND_RECT_MULTI_COLOR,\n    NK_COMMAND_CIRCLE,\n    NK_COMMAND_CIRCLE_FILLED,\n    NK_COMMAND_ARC,\n    NK_COMMAND_ARC_FILLED,\n    NK_COMMAND_TRIANGLE,\n    NK_COMMAND_TRIANGLE_FILLED,\n    NK_COMMAND_POLYGON,\n    NK_COMMAND_POLYGON_FILLED,\n    NK_COMMAND_POLYLINE,\n    NK_COMMAND_TEXT,\n    NK_COMMAND_IMAGE,\n    NK_COMMAND_CUSTOM\n};\n\n/* command base and header of every command inside the buffer */\nstruct nk_command {\n    enum nk_command_type type;\n    nk_size next;\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    nk_handle userdata;\n#endif\n};\n\nstruct nk_command_scissor {\n    struct nk_command header;\n    short x, y;\n    unsigned short w, h;\n};\n\nstruct nk_command_line {\n    struct nk_command header;\n    unsigned short line_thickness;\n    struct nk_vec2i begin;\n    struct nk_vec2i end;\n    struct nk_color color;\n};\n\nstruct nk_command_curve {\n    struct nk_command header;\n    unsigned short line_thickness;\n    struct nk_vec2i begin;\n    struct nk_vec2i end;\n    struct nk_vec2i ctrl[2];\n    struct nk_color color;\n};\n\nstruct nk_command_rect {\n    struct nk_command header;\n    unsigned short rounding;\n    unsigned short line_thickness;\n    short x, y;\n    unsigned short w, h;\n    struct nk_color color;\n};\n\nstruct nk_command_rect_filled {\n    struct nk_command header;\n    unsigned short rounding;\n    short x, y;\n    unsigned short w, h;\n    struct nk_color color;\n};\n\nstruct nk_command_rect_multi_color {\n    struct nk_command header;\n    short x, y;\n    unsigned short w, h;\n    struct nk_color left;\n    struct nk_color top;\n    struct nk_color bottom;\n    struct nk_color right;\n};\n\nstruct nk_command_triangle {\n    struct nk_command header;\n    unsigned short line_thickness;\n    struct nk_vec2i a;\n    struct nk_vec2i b;\n    struct nk_vec2i c;\n    struct nk_color color;\n};\n\nstruct nk_command_triangle_filled {\n    struct nk_command header;\n    struct nk_vec2i a;\n    struct nk_vec2i b;\n    struct nk_vec2i c;\n    struct nk_color color;\n};\n\nstruct nk_command_circle {\n    struct nk_command header;\n    short x, y;\n    unsigned short line_thickness;\n    unsigned short w, h;\n    struct nk_color color;\n};\n\nstruct nk_command_circle_filled {\n    struct nk_command header;\n    short x, y;\n    unsigned short w, h;\n    struct nk_color color;\n};\n\nstruct nk_command_arc {\n    struct nk_command header;\n    short cx, cy;\n    unsigned short r;\n    unsigned short line_thickness;\n    float a[2];\n    struct nk_color color;\n};\n\nstruct nk_command_arc_filled {\n    struct nk_command header;\n    short cx, cy;\n    unsigned short r;\n    float a[2];\n    struct nk_color color;\n};\n\nstruct nk_command_polygon {\n    struct nk_command header;\n    struct nk_color color;\n    unsigned short line_thickness;\n    unsigned short point_count;\n    struct nk_vec2i points[1];\n};\n\nstruct nk_command_polygon_filled {\n    struct nk_command header;\n    struct nk_color color;\n    unsigned short point_count;\n    struct nk_vec2i points[1];\n};\n\nstruct nk_command_polyline {\n    struct nk_command header;\n    struct nk_color color;\n    unsigned short line_thickness;\n    unsigned short point_count;\n    struct nk_vec2i points[1];\n};\n\nstruct nk_command_image {\n    struct nk_command header;\n    short x, y;\n    unsigned short w, h;\n    struct nk_image img;\n    struct nk_color col;\n};\n\ntypedef void (*nk_command_custom_callback)(void *canvas, short x,short y,\n    unsigned short w, unsigned short h, nk_handle callback_data);\nstruct nk_command_custom {\n    struct nk_command header;\n    short x, y;\n    unsigned short w, h;\n    nk_handle callback_data;\n    nk_command_custom_callback callback;\n};\n\nstruct nk_command_text {\n    struct nk_command header;\n    const struct nk_user_font *font;\n    struct nk_color background;\n    struct nk_color foreground;\n    short x, y;\n    unsigned short w, h;\n    float height;\n    int length;\n    char string[1];\n};\n\nenum nk_command_clipping {\n    NK_CLIPPING_OFF = nk_false,\n    NK_CLIPPING_ON = nk_true\n};\n\nstruct nk_command_buffer {\n    struct nk_buffer *base;\n    struct nk_rect clip;\n    int use_clipping;\n    nk_handle userdata;\n    nk_size begin, end, last;\n};\n\n/* shape outlines */\nNK_API void nk_stroke_line(struct nk_command_buffer *b, float x0, float y0, float x1, float y1, float line_thickness, struct nk_color);\nNK_API void nk_stroke_curve(struct nk_command_buffer*, float, float, float, float, float, float, float, float, float line_thickness, struct nk_color);\nNK_API void nk_stroke_rect(struct nk_command_buffer*, struct nk_rect, float rounding, float line_thickness, struct nk_color);\nNK_API void nk_stroke_circle(struct nk_command_buffer*, struct nk_rect, float line_thickness, struct nk_color);\nNK_API void nk_stroke_arc(struct nk_command_buffer*, float cx, float cy, float radius, float a_min, float a_max, float line_thickness, struct nk_color);\nNK_API void nk_stroke_triangle(struct nk_command_buffer*, float, float, float, float, float, float, float line_thichness, struct nk_color);\nNK_API void nk_stroke_polyline(struct nk_command_buffer*, float *points, int point_count, float line_thickness, struct nk_color col);\nNK_API void nk_stroke_polygon(struct nk_command_buffer*, float*, int point_count, float line_thickness, struct nk_color);\n\n/* filled shades */\nNK_API void nk_fill_rect(struct nk_command_buffer*, struct nk_rect, float rounding, struct nk_color);\nNK_API void nk_fill_rect_multi_color(struct nk_command_buffer*, struct nk_rect, struct nk_color left, struct nk_color top, struct nk_color right, struct nk_color bottom);\nNK_API void nk_fill_circle(struct nk_command_buffer*, struct nk_rect, struct nk_color);\nNK_API void nk_fill_arc(struct nk_command_buffer*, float cx, float cy, float radius, float a_min, float a_max, struct nk_color);\nNK_API void nk_fill_triangle(struct nk_command_buffer*, float x0, float y0, float x1, float y1, float x2, float y2, struct nk_color);\nNK_API void nk_fill_polygon(struct nk_command_buffer*, float*, int point_count, struct nk_color);\n\n/* misc */\nNK_API void nk_draw_image(struct nk_command_buffer*, struct nk_rect, const struct nk_image*, struct nk_color);\nNK_API void nk_draw_text(struct nk_command_buffer*, struct nk_rect, const char *text, int len, const struct nk_user_font*, struct nk_color, struct nk_color);\nNK_API void nk_push_scissor(struct nk_command_buffer*, struct nk_rect);\nNK_API void nk_push_custom(struct nk_command_buffer*, struct nk_rect, nk_command_custom_callback, nk_handle usr);\n\n/* ===============================================================\n *\n *                          INPUT\n *\n * ===============================================================*/\nstruct nk_mouse_button {\n    int down;\n    unsigned int clicked;\n    struct nk_vec2 clicked_pos;\n};\nstruct nk_mouse {\n    struct nk_mouse_button buttons[NK_BUTTON_MAX];\n    struct nk_vec2 pos;\n    struct nk_vec2 prev;\n    struct nk_vec2 delta;\n    struct nk_vec2 scroll_delta;\n    unsigned char grab;\n    unsigned char grabbed;\n    unsigned char ungrab;\n};\n\nstruct nk_key {\n    int down;\n    unsigned int clicked;\n};\nstruct nk_keyboard {\n    struct nk_key keys[NK_KEY_MAX];\n    char text[NK_INPUT_MAX];\n    int text_len;\n};\n\nstruct nk_input {\n    struct nk_keyboard keyboard;\n    struct nk_mouse mouse;\n};\n\nNK_API int nk_input_has_mouse_click(const struct nk_input*, enum nk_buttons);\nNK_API int nk_input_has_mouse_click_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect);\nNK_API int nk_input_has_mouse_click_down_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect, int down);\nNK_API int nk_input_is_mouse_click_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect);\nNK_API int nk_input_is_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id, struct nk_rect b, int down);\nNK_API int nk_input_any_mouse_click_in_rect(const struct nk_input*, struct nk_rect);\nNK_API int nk_input_is_mouse_prev_hovering_rect(const struct nk_input*, struct nk_rect);\nNK_API int nk_input_is_mouse_hovering_rect(const struct nk_input*, struct nk_rect);\nNK_API int nk_input_mouse_clicked(const struct nk_input*, enum nk_buttons, struct nk_rect);\nNK_API int nk_input_is_mouse_down(const struct nk_input*, enum nk_buttons);\nNK_API int nk_input_is_mouse_pressed(const struct nk_input*, enum nk_buttons);\nNK_API int nk_input_is_mouse_released(const struct nk_input*, enum nk_buttons);\nNK_API int nk_input_is_key_pressed(const struct nk_input*, enum nk_keys);\nNK_API int nk_input_is_key_released(const struct nk_input*, enum nk_keys);\nNK_API int nk_input_is_key_down(const struct nk_input*, enum nk_keys);\n\n/* ===============================================================\n *\n *                          DRAW LIST\n *\n * ===============================================================*/\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n/*  The optional vertex buffer draw list provides a 2D drawing context\n    with antialiasing functionality which takes basic filled or outlined shapes\n    or a path and outputs vertexes, elements and draw commands.\n    The actual draw list API is not required to be used directly while using this\n    library since converting the default library draw command output is done by\n    just calling `nk_convert` but I decided to still make this library accessible\n    since it can be useful.\n\n    The draw list is based on a path buffering and polygon and polyline\n    rendering API which allows a lot of ways to draw 2D content to screen.\n    In fact it is probably more powerful than needed but allows even more crazy\n    things than this library provides by default.\n*/\ntypedef nk_ushort nk_draw_index;\nenum nk_draw_list_stroke {\n    NK_STROKE_OPEN = nk_false,\n    /* build up path has no connection back to the beginning */\n    NK_STROKE_CLOSED = nk_true\n    /* build up path has a connection back to the beginning */\n};\n\nenum nk_draw_vertex_layout_attribute {\n    NK_VERTEX_POSITION,\n    NK_VERTEX_COLOR,\n    NK_VERTEX_TEXCOORD,\n    NK_VERTEX_ATTRIBUTE_COUNT\n};\n\nenum nk_draw_vertex_layout_format {\n    NK_FORMAT_SCHAR,\n    NK_FORMAT_SSHORT,\n    NK_FORMAT_SINT,\n    NK_FORMAT_UCHAR,\n    NK_FORMAT_USHORT,\n    NK_FORMAT_UINT,\n    NK_FORMAT_FLOAT,\n    NK_FORMAT_DOUBLE,\n\nNK_FORMAT_COLOR_BEGIN,\n    NK_FORMAT_R8G8B8 = NK_FORMAT_COLOR_BEGIN,\n    NK_FORMAT_R16G15B16,\n    NK_FORMAT_R32G32B32,\n\n    NK_FORMAT_R8G8B8A8,\n    NK_FORMAT_B8G8R8A8,\n    NK_FORMAT_R16G15B16A16,\n    NK_FORMAT_R32G32B32A32,\n    NK_FORMAT_R32G32B32A32_FLOAT,\n    NK_FORMAT_R32G32B32A32_DOUBLE,\n\n    NK_FORMAT_RGB32,\n    NK_FORMAT_RGBA32,\nNK_FORMAT_COLOR_END = NK_FORMAT_RGBA32,\n    NK_FORMAT_COUNT\n};\n\n#define NK_VERTEX_LAYOUT_END NK_VERTEX_ATTRIBUTE_COUNT,NK_FORMAT_COUNT,0\nstruct nk_draw_vertex_layout_element {\n    enum nk_draw_vertex_layout_attribute attribute;\n    enum nk_draw_vertex_layout_format format;\n    nk_size offset;\n};\n\nstruct nk_draw_command {\n    unsigned int elem_count;\n    /* number of elements in the current draw batch */\n    struct nk_rect clip_rect;\n    /* current screen clipping rectangle */\n    nk_handle texture;\n    /* current texture to set */\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    nk_handle userdata;\n#endif\n};\n\nstruct nk_draw_list {\n    struct nk_rect clip_rect;\n    struct nk_vec2 circle_vtx[12];\n    struct nk_convert_config config;\n\n    struct nk_buffer *buffer;\n    struct nk_buffer *vertices;\n    struct nk_buffer *elements;\n\n    unsigned int element_count;\n    unsigned int vertex_count;\n    unsigned int cmd_count;\n    nk_size cmd_offset;\n\n    unsigned int path_count;\n    unsigned int path_offset;\n\n    enum nk_anti_aliasing line_AA;\n    enum nk_anti_aliasing shape_AA;\n\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    nk_handle userdata;\n#endif\n};\n\n/* draw list */\nNK_API void nk_draw_list_init(struct nk_draw_list*);\nNK_API void nk_draw_list_setup(struct nk_draw_list*, const struct nk_convert_config*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, enum nk_anti_aliasing line_aa,enum nk_anti_aliasing shape_aa);\nNK_API void nk_draw_list_clear(struct nk_draw_list*);\n\n/* drawing */\n#define nk_draw_list_foreach(cmd, can, b) for((cmd)=nk__draw_list_begin(can, b); (cmd)!=0; (cmd)=nk__draw_list_next(cmd, b, can))\nNK_API const struct nk_draw_command* nk__draw_list_begin(const struct nk_draw_list*, const struct nk_buffer*);\nNK_API const struct nk_draw_command* nk__draw_list_next(const struct nk_draw_command*, const struct nk_buffer*, const struct nk_draw_list*);\nNK_API const struct nk_draw_command* nk__draw_list_end(const struct nk_draw_list*, const struct nk_buffer*);\nNK_API void nk_draw_list_clear(struct nk_draw_list *list);\n\n/* path */\nNK_API void nk_draw_list_path_clear(struct nk_draw_list*);\nNK_API void nk_draw_list_path_line_to(struct nk_draw_list*, struct nk_vec2 pos);\nNK_API void nk_draw_list_path_arc_to_fast(struct nk_draw_list*, struct nk_vec2 center, float radius, int a_min, int a_max);\nNK_API void nk_draw_list_path_arc_to(struct nk_draw_list*, struct nk_vec2 center, float radius, float a_min, float a_max, unsigned int segments);\nNK_API void nk_draw_list_path_rect_to(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, float rounding);\nNK_API void nk_draw_list_path_curve_to(struct nk_draw_list*, struct nk_vec2 p2, struct nk_vec2 p3, struct nk_vec2 p4, unsigned int num_segments);\nNK_API void nk_draw_list_path_fill(struct nk_draw_list*, struct nk_color);\nNK_API void nk_draw_list_path_stroke(struct nk_draw_list*, struct nk_color, enum nk_draw_list_stroke closed, float thickness);\n\n/* stroke */\nNK_API void nk_draw_list_stroke_line(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_color, float thickness);\nNK_API void nk_draw_list_stroke_rect(struct nk_draw_list*, struct nk_rect rect, struct nk_color, float rounding, float thickness);\nNK_API void nk_draw_list_stroke_triangle(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_vec2 c, struct nk_color, float thickness);\nNK_API void nk_draw_list_stroke_circle(struct nk_draw_list*, struct nk_vec2 center, float radius, struct nk_color, unsigned int segs, float thickness);\nNK_API void nk_draw_list_stroke_curve(struct nk_draw_list*, struct nk_vec2 p0, struct nk_vec2 cp0, struct nk_vec2 cp1, struct nk_vec2 p1, struct nk_color, unsigned int segments, float thickness);\nNK_API void nk_draw_list_stroke_poly_line(struct nk_draw_list*, const struct nk_vec2 *pnts, const unsigned int cnt, struct nk_color, enum nk_draw_list_stroke, float thickness, enum nk_anti_aliasing);\n\n/* fill */\nNK_API void nk_draw_list_fill_rect(struct nk_draw_list*, struct nk_rect rect, struct nk_color, float rounding);\nNK_API void nk_draw_list_fill_rect_multi_color(struct nk_draw_list*, struct nk_rect rect, struct nk_color left, struct nk_color top, struct nk_color right, struct nk_color bottom);\nNK_API void nk_draw_list_fill_triangle(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_vec2 c, struct nk_color);\nNK_API void nk_draw_list_fill_circle(struct nk_draw_list*, struct nk_vec2 center, float radius, struct nk_color col, unsigned int segs);\nNK_API void nk_draw_list_fill_poly_convex(struct nk_draw_list*, const struct nk_vec2 *points, const unsigned int count, struct nk_color, enum nk_anti_aliasing);\n\n/* misc */\nNK_API void nk_draw_list_add_image(struct nk_draw_list*, struct nk_image texture, struct nk_rect rect, struct nk_color);\nNK_API void nk_draw_list_add_text(struct nk_draw_list*, const struct nk_user_font*, struct nk_rect, const char *text, int len, float font_height, struct nk_color);\n#ifdef NK_INCLUDE_COMMAND_USERDATA\nNK_API void nk_draw_list_push_userdata(struct nk_draw_list*, nk_handle userdata);\n#endif\n\n#endif\n\n/* ===============================================================\n *\n *                          GUI\n *\n * ===============================================================*/\nenum nk_style_item_type {\n    NK_STYLE_ITEM_COLOR,\n    NK_STYLE_ITEM_IMAGE\n};\n\nunion nk_style_item_data {\n    struct nk_image image;\n    struct nk_color color;\n};\n\nstruct nk_style_item {\n    enum nk_style_item_type type;\n    union nk_style_item_data data;\n};\n\nstruct nk_style_text {\n    struct nk_color color;\n    struct nk_vec2 padding;\n};\n\nstruct nk_style_button {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n    struct nk_color border_color;\n\n    /* text */\n    struct nk_color text_background;\n    struct nk_color text_normal;\n    struct nk_color text_hover;\n    struct nk_color text_active;\n    nk_flags text_alignment;\n\n    /* properties */\n    float border;\n    float rounding;\n    struct nk_vec2 padding;\n    struct nk_vec2 image_padding;\n    struct nk_vec2 touch_padding;\n\n    /* optional user callbacks */\n    nk_handle userdata;\n    void(*draw_begin)(struct nk_command_buffer*, nk_handle userdata);\n    void(*draw_end)(struct nk_command_buffer*, nk_handle userdata);\n};\n\nstruct nk_style_toggle {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n    struct nk_color border_color;\n\n    /* cursor */\n    struct nk_style_item cursor_normal;\n    struct nk_style_item cursor_hover;\n\n    /* text */\n    struct nk_color text_normal;\n    struct nk_color text_hover;\n    struct nk_color text_active;\n    struct nk_color text_background;\n    nk_flags text_alignment;\n\n    /* properties */\n    struct nk_vec2 padding;\n    struct nk_vec2 touch_padding;\n    float spacing;\n    float border;\n\n    /* optional user callbacks */\n    nk_handle userdata;\n    void(*draw_begin)(struct nk_command_buffer*, nk_handle);\n    void(*draw_end)(struct nk_command_buffer*, nk_handle);\n};\n\nstruct nk_style_selectable {\n    /* background (inactive) */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item pressed;\n\n    /* background (active) */\n    struct nk_style_item normal_active;\n    struct nk_style_item hover_active;\n    struct nk_style_item pressed_active;\n\n    /* text color (inactive) */\n    struct nk_color text_normal;\n    struct nk_color text_hover;\n    struct nk_color text_pressed;\n\n    /* text color (active) */\n    struct nk_color text_normal_active;\n    struct nk_color text_hover_active;\n    struct nk_color text_pressed_active;\n    struct nk_color text_background;\n    nk_flags text_alignment;\n\n    /* properties */\n    float rounding;\n    struct nk_vec2 padding;\n    struct nk_vec2 touch_padding;\n    struct nk_vec2 image_padding;\n\n    /* optional user callbacks */\n    nk_handle userdata;\n    void(*draw_begin)(struct nk_command_buffer*, nk_handle);\n    void(*draw_end)(struct nk_command_buffer*, nk_handle);\n};\n\nstruct nk_style_slider {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n    struct nk_color border_color;\n\n    /* background bar */\n    struct nk_color bar_normal;\n    struct nk_color bar_hover;\n    struct nk_color bar_active;\n    struct nk_color bar_filled;\n\n    /* cursor */\n    struct nk_style_item cursor_normal;\n    struct nk_style_item cursor_hover;\n    struct nk_style_item cursor_active;\n\n    /* properties */\n    float border;\n    float rounding;\n    float bar_height;\n    struct nk_vec2 padding;\n    struct nk_vec2 spacing;\n    struct nk_vec2 cursor_size;\n\n    /* optional buttons */\n    int show_buttons;\n    struct nk_style_button inc_button;\n    struct nk_style_button dec_button;\n    enum nk_symbol_type inc_symbol;\n    enum nk_symbol_type dec_symbol;\n\n    /* optional user callbacks */\n    nk_handle userdata;\n    void(*draw_begin)(struct nk_command_buffer*, nk_handle);\n    void(*draw_end)(struct nk_command_buffer*, nk_handle);\n};\n\nstruct nk_style_progress {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n    struct nk_color border_color;\n\n    /* cursor */\n    struct nk_style_item cursor_normal;\n    struct nk_style_item cursor_hover;\n    struct nk_style_item cursor_active;\n    struct nk_color cursor_border_color;\n\n    /* properties */\n    float rounding;\n    float border;\n    float cursor_border;\n    float cursor_rounding;\n    struct nk_vec2 padding;\n\n    /* optional user callbacks */\n    nk_handle userdata;\n    void(*draw_begin)(struct nk_command_buffer*, nk_handle);\n    void(*draw_end)(struct nk_command_buffer*, nk_handle);\n};\n\nstruct nk_style_scrollbar {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n    struct nk_color border_color;\n\n    /* cursor */\n    struct nk_style_item cursor_normal;\n    struct nk_style_item cursor_hover;\n    struct nk_style_item cursor_active;\n    struct nk_color cursor_border_color;\n\n    /* properties */\n    float border;\n    float rounding;\n    float border_cursor;\n    float rounding_cursor;\n    struct nk_vec2 padding;\n\n    /* optional buttons */\n    int show_buttons;\n    struct nk_style_button inc_button;\n    struct nk_style_button dec_button;\n    enum nk_symbol_type inc_symbol;\n    enum nk_symbol_type dec_symbol;\n\n    /* optional user callbacks */\n    nk_handle userdata;\n    void(*draw_begin)(struct nk_command_buffer*, nk_handle);\n    void(*draw_end)(struct nk_command_buffer*, nk_handle);\n};\n\nstruct nk_style_edit {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n    struct nk_color border_color;\n    struct nk_style_scrollbar scrollbar;\n\n    /* cursor  */\n    struct nk_color cursor_normal;\n    struct nk_color cursor_hover;\n    struct nk_color cursor_text_normal;\n    struct nk_color cursor_text_hover;\n\n    /* text (unselected) */\n    struct nk_color text_normal;\n    struct nk_color text_hover;\n    struct nk_color text_active;\n\n    /* text (selected) */\n    struct nk_color selected_normal;\n    struct nk_color selected_hover;\n    struct nk_color selected_text_normal;\n    struct nk_color selected_text_hover;\n\n    /* properties */\n    float border;\n    float rounding;\n    float cursor_size;\n    struct nk_vec2 scrollbar_size;\n    struct nk_vec2 padding;\n    float row_padding;\n};\n\nstruct nk_style_property {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n    struct nk_color border_color;\n\n    /* text */\n    struct nk_color label_normal;\n    struct nk_color label_hover;\n    struct nk_color label_active;\n\n    /* symbols */\n    enum nk_symbol_type sym_left;\n    enum nk_symbol_type sym_right;\n\n    /* properties */\n    float border;\n    float rounding;\n    struct nk_vec2 padding;\n\n    struct nk_style_edit edit;\n    struct nk_style_button inc_button;\n    struct nk_style_button dec_button;\n\n    /* optional user callbacks */\n    nk_handle userdata;\n    void(*draw_begin)(struct nk_command_buffer*, nk_handle);\n    void(*draw_end)(struct nk_command_buffer*, nk_handle);\n};\n\nstruct nk_style_chart {\n    /* colors */\n    struct nk_style_item background;\n    struct nk_color border_color;\n    struct nk_color selected_color;\n    struct nk_color color;\n\n    /* properties */\n    float border;\n    float rounding;\n    struct nk_vec2 padding;\n};\n\nstruct nk_style_combo {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n    struct nk_color border_color;\n\n    /* label */\n    struct nk_color label_normal;\n    struct nk_color label_hover;\n    struct nk_color label_active;\n\n    /* symbol */\n    struct nk_color symbol_normal;\n    struct nk_color symbol_hover;\n    struct nk_color symbol_active;\n\n    /* button */\n    struct nk_style_button button;\n    enum nk_symbol_type sym_normal;\n    enum nk_symbol_type sym_hover;\n    enum nk_symbol_type sym_active;\n\n    /* properties */\n    float border;\n    float rounding;\n    struct nk_vec2 content_padding;\n    struct nk_vec2 button_padding;\n    struct nk_vec2 spacing;\n};\n\nstruct nk_style_tab {\n    /* background */\n    struct nk_style_item background;\n    struct nk_color border_color;\n    struct nk_color text;\n\n    /* button */\n    struct nk_style_button tab_maximize_button;\n    struct nk_style_button tab_minimize_button;\n    struct nk_style_button node_maximize_button;\n    struct nk_style_button node_minimize_button;\n    enum nk_symbol_type sym_minimize;\n    enum nk_symbol_type sym_maximize;\n\n    /* properties */\n    float border;\n    float rounding;\n    float indent;\n    struct nk_vec2 padding;\n    struct nk_vec2 spacing;\n};\n\nenum nk_style_header_align {\n    NK_HEADER_LEFT,\n    NK_HEADER_RIGHT\n};\nstruct nk_style_window_header {\n    /* background */\n    struct nk_style_item normal;\n    struct nk_style_item hover;\n    struct nk_style_item active;\n\n    /* button */\n    struct nk_style_button close_button;\n    struct nk_style_button minimize_button;\n    enum nk_symbol_type close_symbol;\n    enum nk_symbol_type minimize_symbol;\n    enum nk_symbol_type maximize_symbol;\n\n    /* title */\n    struct nk_color label_normal;\n    struct nk_color label_hover;\n    struct nk_color label_active;\n\n    /* properties */\n    enum nk_style_header_align align;\n    struct nk_vec2 padding;\n    struct nk_vec2 label_padding;\n    struct nk_vec2 spacing;\n};\n\nstruct nk_style_window {\n    struct nk_style_window_header header;\n    struct nk_style_item fixed_background;\n    struct nk_color background;\n\n    struct nk_color border_color;\n    struct nk_color popup_border_color;\n    struct nk_color combo_border_color;\n    struct nk_color contextual_border_color;\n    struct nk_color menu_border_color;\n    struct nk_color group_border_color;\n    struct nk_color tooltip_border_color;\n    struct nk_style_item scaler;\n\n    float border;\n    float combo_border;\n    float contextual_border;\n    float menu_border;\n    float group_border;\n    float tooltip_border;\n    float popup_border;\n    float min_row_height_padding;\n\n    float rounding;\n    struct nk_vec2 spacing;\n    struct nk_vec2 scrollbar_size;\n    struct nk_vec2 min_size;\n\n    struct nk_vec2 padding;\n    struct nk_vec2 group_padding;\n    struct nk_vec2 popup_padding;\n    struct nk_vec2 combo_padding;\n    struct nk_vec2 contextual_padding;\n    struct nk_vec2 menu_padding;\n    struct nk_vec2 tooltip_padding;\n};\n\nstruct nk_style {\n    const struct nk_user_font *font;\n    const struct nk_cursor *cursors[NK_CURSOR_COUNT];\n    const struct nk_cursor *cursor_active;\n    struct nk_cursor *cursor_last;\n    int cursor_visible;\n\n    struct nk_style_text text;\n    struct nk_style_button button;\n    struct nk_style_button contextual_button;\n    struct nk_style_button menu_button;\n    struct nk_style_toggle option;\n    struct nk_style_toggle checkbox;\n    struct nk_style_selectable selectable;\n    struct nk_style_slider slider;\n    struct nk_style_progress progress;\n    struct nk_style_property property;\n    struct nk_style_edit edit;\n    struct nk_style_chart chart;\n    struct nk_style_scrollbar scrollh;\n    struct nk_style_scrollbar scrollv;\n    struct nk_style_tab tab;\n    struct nk_style_combo combo;\n    struct nk_style_window window;\n};\n\nNK_API struct nk_style_item nk_style_item_image(struct nk_image img);\nNK_API struct nk_style_item nk_style_item_color(struct nk_color);\nNK_API struct nk_style_item nk_style_item_hide(void);\n\n/*==============================================================\n *                          PANEL\n * =============================================================*/\n#ifndef NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS\n#define NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS 16\n#endif\n#ifndef NK_CHART_MAX_SLOT\n#define NK_CHART_MAX_SLOT 4\n#endif\n\nenum nk_panel_type {\n    NK_PANEL_WINDOW     = NK_FLAG(0),\n    NK_PANEL_GROUP      = NK_FLAG(1),\n    NK_PANEL_POPUP      = NK_FLAG(2),\n    NK_PANEL_CONTEXTUAL = NK_FLAG(4),\n    NK_PANEL_COMBO      = NK_FLAG(5),\n    NK_PANEL_MENU       = NK_FLAG(6),\n    NK_PANEL_TOOLTIP    = NK_FLAG(7)\n};\nenum nk_panel_set {\n    NK_PANEL_SET_NONBLOCK = NK_PANEL_CONTEXTUAL|NK_PANEL_COMBO|NK_PANEL_MENU|NK_PANEL_TOOLTIP,\n    NK_PANEL_SET_POPUP = NK_PANEL_SET_NONBLOCK|NK_PANEL_POPUP,\n    NK_PANEL_SET_SUB = NK_PANEL_SET_POPUP|NK_PANEL_GROUP\n};\n\nstruct nk_chart_slot {\n    enum nk_chart_type type;\n    struct nk_color color;\n    struct nk_color highlight;\n    float min, max, range;\n    int count;\n    struct nk_vec2 last;\n    int index;\n};\n\nstruct nk_chart {\n    int slot;\n    float x, y, w, h;\n    struct nk_chart_slot slots[NK_CHART_MAX_SLOT];\n};\n\nenum nk_panel_row_layout_type {\n    NK_LAYOUT_DYNAMIC_FIXED = 0,\n    NK_LAYOUT_DYNAMIC_ROW,\n    NK_LAYOUT_DYNAMIC_FREE,\n    NK_LAYOUT_DYNAMIC,\n    NK_LAYOUT_STATIC_FIXED,\n    NK_LAYOUT_STATIC_ROW,\n    NK_LAYOUT_STATIC_FREE,\n    NK_LAYOUT_STATIC,\n    NK_LAYOUT_TEMPLATE,\n    NK_LAYOUT_COUNT\n};\nstruct nk_row_layout {\n    enum nk_panel_row_layout_type type;\n    int index;\n    float height;\n    float min_height;\n    int columns;\n    const float *ratio;\n    float item_width;\n    float item_height;\n    float item_offset;\n    float filled;\n    struct nk_rect item;\n    int tree_depth;\n    float templates[NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS];\n};\n\nstruct nk_popup_buffer {\n    nk_size begin;\n    nk_size parent;\n    nk_size last;\n    nk_size end;\n    int active;\n};\n\nstruct nk_menu_state {\n    float x, y, w, h;\n    struct nk_scroll offset;\n};\n\nstruct nk_panel {\n    enum nk_panel_type type;\n    nk_flags flags;\n    struct nk_rect bounds;\n    nk_uint *offset_x;\n    nk_uint *offset_y;\n    float at_x, at_y, max_x;\n    float footer_height;\n    float header_height;\n    float border;\n    unsigned int has_scrolling;\n    struct nk_rect clip;\n    struct nk_menu_state menu;\n    struct nk_row_layout row;\n    struct nk_chart chart;\n    struct nk_command_buffer *buffer;\n    struct nk_panel *parent;\n};\n\n/*==============================================================\n *                          WINDOW\n * =============================================================*/\n#ifndef NK_WINDOW_MAX_NAME\n#define NK_WINDOW_MAX_NAME 64\n#endif\n\nstruct nk_table;\nenum nk_window_flags {\n    NK_WINDOW_PRIVATE       = NK_FLAG(11),\n    NK_WINDOW_DYNAMIC       = NK_WINDOW_PRIVATE,\n    /* special window type growing up in height while being filled to a certain maximum height */\n    NK_WINDOW_ROM           = NK_FLAG(12),\n    /* sets window widgets into a read only mode and does not allow input changes */\n    NK_WINDOW_NOT_INTERACTIVE = NK_WINDOW_ROM|NK_WINDOW_NO_INPUT,\n    /* prevents all interaction caused by input to either window or widgets inside */\n    NK_WINDOW_HIDDEN        = NK_FLAG(13),\n    /* Hides window and stops any window interaction and drawing */\n    NK_WINDOW_CLOSED        = NK_FLAG(14),\n    /* Directly closes and frees the window at the end of the frame */\n    NK_WINDOW_MINIMIZED     = NK_FLAG(15),\n    /* marks the window as minimized */\n    NK_WINDOW_REMOVE_ROM    = NK_FLAG(16)\n    /* Removes read only mode at the end of the window */\n};\n\nstruct nk_popup_state {\n    struct nk_window *win;\n    enum nk_panel_type type;\n    struct nk_popup_buffer buf;\n    nk_hash name;\n    int active;\n    unsigned combo_count;\n    unsigned con_count, con_old;\n    unsigned active_con;\n    struct nk_rect header;\n};\n\nstruct nk_edit_state {\n    nk_hash name;\n    unsigned int seq;\n    unsigned int old;\n    int active, prev;\n    int cursor;\n    int sel_start;\n    int sel_end;\n    struct nk_scroll scrollbar;\n    unsigned char mode;\n    unsigned char single_line;\n};\n\nstruct nk_property_state {\n    int active, prev;\n    char buffer[NK_MAX_NUMBER_BUFFER];\n    int length;\n    int cursor;\n    int select_start;\n    int select_end;\n    nk_hash name;\n    unsigned int seq;\n    unsigned int old;\n    int state;\n};\n\nstruct nk_window {\n    unsigned int seq;\n    nk_hash name;\n    char name_string[NK_WINDOW_MAX_NAME];\n    nk_flags flags;\n\n    struct nk_rect bounds;\n    struct nk_scroll scrollbar;\n    struct nk_command_buffer buffer;\n    struct nk_panel *layout;\n    float scrollbar_hiding_timer;\n\n    /* persistent widget state */\n    struct nk_property_state property;\n    struct nk_popup_state popup;\n    struct nk_edit_state edit;\n    unsigned int scrolled;\n\n    struct nk_table *tables;\n    unsigned int table_count;\n\n    /* window list hooks */\n    struct nk_window *next;\n    struct nk_window *prev;\n    struct nk_window *parent;\n};\n\n/*==============================================================\n *                          STACK\n * =============================================================*/\n/* The style modifier stack can be used to temporarily change a\n * property inside `nk_style`. For example if you want a special\n * red button you can temporarily push the old button color onto a stack\n * draw the button with a red color and then you just pop the old color\n * back from the stack:\n *\n *      nk_style_push_style_item(ctx, &ctx->style.button.normal, nk_style_item_color(nk_rgb(255,0,0)));\n *      nk_style_push_style_item(ctx, &ctx->style.button.hover, nk_style_item_color(nk_rgb(255,0,0)));\n *      nk_style_push_style_item(ctx, &ctx->style.button.active, nk_style_item_color(nk_rgb(255,0,0)));\n *      nk_style_push_vec2(ctx, &cx->style.button.padding, nk_vec2(2,2));\n *\n *      nk_button(...);\n *\n *      nk_style_pop_style_item(ctx);\n *      nk_style_pop_style_item(ctx);\n *      nk_style_pop_style_item(ctx);\n *      nk_style_pop_vec2(ctx);\n *\n * Nuklear has a stack for style_items, float properties, vector properties,\n * flags, colors, fonts and for button_behavior. Each has it's own fixed size stack\n * which can be changed at compile time.\n */\n#ifndef NK_BUTTON_BEHAVIOR_STACK_SIZE\n#define NK_BUTTON_BEHAVIOR_STACK_SIZE 8\n#endif\n\n#ifndef NK_FONT_STACK_SIZE\n#define NK_FONT_STACK_SIZE 8\n#endif\n\n#ifndef NK_STYLE_ITEM_STACK_SIZE\n#define NK_STYLE_ITEM_STACK_SIZE 16\n#endif\n\n#ifndef NK_FLOAT_STACK_SIZE\n#define NK_FLOAT_STACK_SIZE 32\n#endif\n\n#ifndef NK_VECTOR_STACK_SIZE\n#define NK_VECTOR_STACK_SIZE 16\n#endif\n\n#ifndef NK_FLAGS_STACK_SIZE\n#define NK_FLAGS_STACK_SIZE 32\n#endif\n\n#ifndef NK_COLOR_STACK_SIZE\n#define NK_COLOR_STACK_SIZE 32\n#endif\n\n#define NK_CONFIGURATION_STACK_TYPE(prefix, name, type)\\\n    struct nk_config_stack_##name##_element {\\\n        prefix##_##type *address;\\\n        prefix##_##type old_value;\\\n    }\n#define NK_CONFIG_STACK(type,size)\\\n    struct nk_config_stack_##type {\\\n        int head;\\\n        struct nk_config_stack_##type##_element elements[size];\\\n    }\n\n#define nk_float float\nNK_CONFIGURATION_STACK_TYPE(struct nk, style_item, style_item);\nNK_CONFIGURATION_STACK_TYPE(nk ,float, float);\nNK_CONFIGURATION_STACK_TYPE(struct nk, vec2, vec2);\nNK_CONFIGURATION_STACK_TYPE(nk ,flags, flags);\nNK_CONFIGURATION_STACK_TYPE(struct nk, color, color);\nNK_CONFIGURATION_STACK_TYPE(const struct nk, user_font, user_font*);\nNK_CONFIGURATION_STACK_TYPE(enum nk, button_behavior, button_behavior);\n\nNK_CONFIG_STACK(style_item, NK_STYLE_ITEM_STACK_SIZE);\nNK_CONFIG_STACK(float, NK_FLOAT_STACK_SIZE);\nNK_CONFIG_STACK(vec2, NK_VECTOR_STACK_SIZE);\nNK_CONFIG_STACK(flags, NK_FLAGS_STACK_SIZE);\nNK_CONFIG_STACK(color, NK_COLOR_STACK_SIZE);\nNK_CONFIG_STACK(user_font, NK_FONT_STACK_SIZE);\nNK_CONFIG_STACK(button_behavior, NK_BUTTON_BEHAVIOR_STACK_SIZE);\n\nstruct nk_configuration_stacks {\n    struct nk_config_stack_style_item style_items;\n    struct nk_config_stack_float floats;\n    struct nk_config_stack_vec2 vectors;\n    struct nk_config_stack_flags flags;\n    struct nk_config_stack_color colors;\n    struct nk_config_stack_user_font fonts;\n    struct nk_config_stack_button_behavior button_behaviors;\n};\n\n/*==============================================================\n *                          CONTEXT\n * =============================================================*/\n#define NK_VALUE_PAGE_CAPACITY \\\n    (((NK_MAX(sizeof(struct nk_window),sizeof(struct nk_panel)) / sizeof(nk_uint))) / 2)\n\nstruct nk_table {\n    unsigned int seq;\n    unsigned int size;\n    nk_hash keys[NK_VALUE_PAGE_CAPACITY];\n    nk_uint values[NK_VALUE_PAGE_CAPACITY];\n    struct nk_table *next, *prev;\n};\n\nunion nk_page_data {\n    struct nk_table tbl;\n    struct nk_panel pan;\n    struct nk_window win;\n};\n\nstruct nk_page_element {\n    union nk_page_data data;\n    struct nk_page_element *next;\n    struct nk_page_element *prev;\n};\n\nstruct nk_page {\n    unsigned int size;\n    struct nk_page *next;\n    struct nk_page_element win[1];\n};\n\nstruct nk_pool {\n    struct nk_allocator alloc;\n    enum nk_allocation_type type;\n    unsigned int page_count;\n    struct nk_page *pages;\n    struct nk_page_element *freelist;\n    unsigned capacity;\n    nk_size size;\n    nk_size cap;\n};\n\nstruct nk_context {\n/* public: can be accessed freely */\n    struct nk_input input;\n    struct nk_style style;\n    struct nk_buffer memory;\n    struct nk_clipboard clip;\n    nk_flags last_widget_state;\n    enum nk_button_behavior button_behavior;\n    struct nk_configuration_stacks stacks;\n    float delta_time_seconds;\n\n/* private:\n    should only be accessed if you\n    know what you are doing */\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n    struct nk_draw_list draw_list;\n#endif\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    nk_handle userdata;\n#endif\n    /* text editor objects are quite big because of an internal\n     * undo/redo stack. Therefore it does not make sense to have one for\n     * each window for temporary use cases, so I only provide *one* instance\n     * for all windows. This works because the content is cleared anyway */\n    struct nk_text_edit text_edit;\n    /* draw buffer used for overlay drawing operation like cursor */\n    struct nk_command_buffer overlay;\n\n    /* windows */\n    int build;\n    int use_pool;\n    struct nk_pool pool;\n    struct nk_window *begin;\n    struct nk_window *end;\n    struct nk_window *active;\n    struct nk_window *current;\n    struct nk_page_element *freelist;\n    unsigned int count;\n    unsigned int seq;\n};\n\n/* ==============================================================\n *                          MATH\n * =============================================================== */\n#define NK_PI 3.141592654f\n#define NK_UTF_INVALID 0xFFFD\n#define NK_MAX_FLOAT_PRECISION 2\n\n#define NK_UNUSED(x) ((void)(x))\n#define NK_SATURATE(x) (NK_MAX(0, NK_MIN(1.0f, x)))\n#define NK_LEN(a) (sizeof(a)/sizeof(a)[0])\n#define NK_ABS(a) (((a) < 0) ? -(a) : (a))\n#define NK_BETWEEN(x, a, b) ((a) <= (x) && (x) < (b))\n#define NK_INBOX(px, py, x, y, w, h)\\\n    (NK_BETWEEN(px,x,x+w) && NK_BETWEEN(py,y,y+h))\n#define NK_INTERSECT(x0, y0, w0, h0, x1, y1, w1, h1) \\\n    (!(((x1 > (x0 + w0)) || ((x1 + w1) < x0) || (y1 > (y0 + h0)) || (y1 + h1) < y0)))\n#define NK_CONTAINS(x, y, w, h, bx, by, bw, bh)\\\n    (NK_INBOX(x,y, bx, by, bw, bh) && NK_INBOX(x+w,y+h, bx, by, bw, bh))\n\n#define nk_vec2_sub(a, b) nk_vec2((a).x - (b).x, (a).y - (b).y)\n#define nk_vec2_add(a, b) nk_vec2((a).x + (b).x, (a).y + (b).y)\n#define nk_vec2_len_sqr(a) ((a).x*(a).x+(a).y*(a).y)\n#define nk_vec2_muls(a, t) nk_vec2((a).x * (t), (a).y * (t))\n\n#define nk_ptr_add(t, p, i) ((t*)((void*)((nk_byte*)(p) + (i))))\n#define nk_ptr_add_const(t, p, i) ((const t*)((const void*)((const nk_byte*)(p) + (i))))\n#define nk_zero_struct(s) nk_zero(&s, sizeof(s))\n\n/* ==============================================================\n *                          ALIGNMENT\n * =============================================================== */\n/* Pointer to Integer type conversion for pointer alignment */\n#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC*/\n# define NK_UINT_TO_PTR(x) ((void*)(__PTRDIFF_TYPE__)(x))\n# define NK_PTR_TO_UINT(x) ((nk_size)(__PTRDIFF_TYPE__)(x))\n#elif !defined(__GNUC__) /* works for compilers other than LLVM */\n# define NK_UINT_TO_PTR(x) ((void*)&((char*)0)[x])\n# define NK_PTR_TO_UINT(x) ((nk_size)(((char*)x)-(char*)0))\n#elif defined(NK_USE_FIXED_TYPES) /* used if we have <stdint.h> */\n# define NK_UINT_TO_PTR(x) ((void*)(uintptr_t)(x))\n# define NK_PTR_TO_UINT(x) ((uintptr_t)(x))\n#else /* generates warning but works */\n# define NK_UINT_TO_PTR(x) ((void*)(x))\n# define NK_PTR_TO_UINT(x) ((nk_size)(x))\n#endif\n\n#define NK_ALIGN_PTR(x, mask)\\\n    (NK_UINT_TO_PTR((NK_PTR_TO_UINT((nk_byte*)(x) + (mask-1)) & ~(mask-1))))\n#define NK_ALIGN_PTR_BACK(x, mask)\\\n    (NK_UINT_TO_PTR((NK_PTR_TO_UINT((nk_byte*)(x)) & ~(mask-1))))\n\n#define NK_OFFSETOF(st,m) ((nk_ptr)&(((st*)0)->m))\n#define NK_CONTAINER_OF(ptr,type,member)\\\n    (type*)((void*)((char*)(1 ? (ptr): &((type*)0)->member) - NK_OFFSETOF(type, member)))\n\n#ifdef __cplusplus\n}\n#endif\n\n#ifdef __cplusplus\ntemplate<typename T> struct nk_alignof;\ntemplate<typename T, int size_diff> struct nk_helper{enum {value = size_diff};};\ntemplate<typename T> struct nk_helper<T,0>{enum {value = nk_alignof<T>::value};};\ntemplate<typename T> struct nk_alignof{struct Big {T x; char c;}; enum {\n    diff = sizeof(Big) - sizeof(T), value = nk_helper<Big, diff>::value};};\n#define NK_ALIGNOF(t) (nk_alignof<t>::value)\n#elif defined(_MSC_VER)\n#define NK_ALIGNOF(t) (__alignof(t))\n#else\n#define NK_ALIGNOF(t) ((char*)(&((struct {char c; t _h;}*)0)->_h) - (char*)0)\n#endif\n\n#endif /* NK_H_ */\n/*\n * ==============================================================\n *\n *                          IMPLEMENTATION\n *\n * ===============================================================\n */\n#ifdef NK_IMPLEMENTATION\n\n#ifndef NK_POOL_DEFAULT_CAPACITY\n#define NK_POOL_DEFAULT_CAPACITY 16\n#endif\n\n#ifndef NK_DEFAULT_COMMAND_BUFFER_SIZE\n#define NK_DEFAULT_COMMAND_BUFFER_SIZE (4*1024)\n#endif\n\n#ifndef NK_BUFFER_DEFAULT_INITIAL_SIZE\n#define NK_BUFFER_DEFAULT_INITIAL_SIZE (4*1024)\n#endif\n\n/* standard library headers */\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\n#include <stdlib.h> /* malloc, free */\n#endif\n#ifdef NK_INCLUDE_STANDARD_IO\n#include <stdio.h> /* fopen, fclose,... */\n#endif\n#ifdef NK_INCLUDE_STANDARD_VARARGS\n#include <stdarg.h> /* valist, va_start, va_end, ... */\n#endif\n#ifndef NK_ASSERT\n#include <assert.h>\n#define NK_ASSERT(expr) assert(expr)\n#endif\n\n#ifndef NK_MEMSET\n#define NK_MEMSET nk_memset\n#endif\n#ifndef NK_MEMCPY\n#define NK_MEMCPY nk_memcopy\n#endif\n#ifndef NK_SQRT\n#define NK_SQRT nk_sqrt\n#endif\n#ifndef NK_SIN\n#define NK_SIN nk_sin\n#endif\n#ifndef NK_COS\n#define NK_COS nk_cos\n#endif\n#ifndef NK_STRTOD\n#define NK_STRTOD nk_strtod\n#endif\n#ifndef NK_DTOA\n#define NK_DTOA nk_dtoa\n#endif\n\n#define NK_DEFAULT (-1)\n\n#ifndef NK_VSNPRINTF\n/* If your compiler does support `vsnprintf` I would highly recommend\n * defining this to vsnprintf instead since `vsprintf` is basically\n * unbelievable unsafe and should *NEVER* be used. But I have to support\n * it since C89 only provides this unsafe version. */\n  #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) ||\\\n      (defined(__cplusplus) && (__cplusplus >= 201103L)) || \\\n      (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L)) ||\\\n      (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)) ||\\\n       defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE)\n      #define NK_VSNPRINTF(s,n,f,a) vsnprintf(s,n,f,a)\n  #else\n    #define NK_VSNPRINTF(s,n,f,a) vsprintf(s,f,a)\n  #endif\n#endif\n\n#define NK_SCHAR_MIN (-127)\n#define NK_SCHAR_MAX 127\n#define NK_UCHAR_MIN 0\n#define NK_UCHAR_MAX 256\n#define NK_SSHORT_MIN (-32767)\n#define NK_SSHORT_MAX 32767\n#define NK_USHORT_MIN 0\n#define NK_USHORT_MAX 65535\n#define NK_SINT_MIN (-2147483647)\n#define NK_SINT_MAX 2147483647\n#define NK_UINT_MIN 0\n#define NK_UINT_MAX 4294967295u\n\n/* Make sure correct type size:\n * This will fire with a negative subscript error if the type sizes\n * are set incorrectly by the compiler, and compile out if not */\nNK_STATIC_ASSERT(sizeof(nk_size) >= sizeof(void*));\nNK_STATIC_ASSERT(sizeof(nk_ptr) == sizeof(void*));\nNK_STATIC_ASSERT(sizeof(nk_flags) >= 4);\nNK_STATIC_ASSERT(sizeof(nk_rune) >= 4);\nNK_STATIC_ASSERT(sizeof(nk_ushort) == 2);\nNK_STATIC_ASSERT(sizeof(nk_short) == 2);\nNK_STATIC_ASSERT(sizeof(nk_uint) == 4);\nNK_STATIC_ASSERT(sizeof(nk_int) == 4);\nNK_STATIC_ASSERT(sizeof(nk_byte) == 1);\n\nNK_GLOBAL const struct nk_rect nk_null_rect = {-8192.0f, -8192.0f, 16384, 16384};\n#define NK_FLOAT_PRECISION 0.00000000000001\n\nNK_GLOBAL const struct nk_color nk_red = {255,0,0,255};\nNK_GLOBAL const struct nk_color nk_green = {0,255,0,255};\nNK_GLOBAL const struct nk_color nk_blue = {0,0,255,255};\nNK_GLOBAL const struct nk_color nk_white = {255,255,255,255};\nNK_GLOBAL const struct nk_color nk_black = {0,0,0,255};\nNK_GLOBAL const struct nk_color nk_yellow = {255,255,0,255};\n\n/*\n * ==============================================================\n *\n *                          MATH\n *\n * ===============================================================\n */\n/*  Since nuklear is supposed to work on all systems providing floating point\n    math without any dependencies I also had to implement my own math functions\n    for sqrt, sin and cos. Since the actual highly accurate implementations for\n    the standard library functions are quite complex and I do not need high\n    precision for my use cases I use approximations.\n\n    Sqrt\n    ----\n    For square root nuklear uses the famous fast inverse square root:\n    https://en.wikipedia.org/wiki/Fast_inverse_square_root with\n    slightly tweaked magic constant. While on todays hardware it is\n    probably not faster it is still fast and accurate enough for\n    nuklear's use cases. IMPORTANT: this requires float format IEEE 754\n\n    Sine/Cosine\n    -----------\n    All constants inside both function are generated Remez's minimax\n    approximations for value range 0...2*PI. The reason why I decided to\n    approximate exactly that range is that nuklear only needs sine and\n    cosine to generate circles which only requires that exact range.\n    In addition I used Remez instead of Taylor for additional precision:\n    www.lolengine.net/blog/2011/12/21/better-function-approximatations.\n\n    The tool I used to generate constants for both sine and cosine\n    (it can actually approximate a lot more functions) can be\n    found here: www.lolengine.net/wiki/oss/lolremez\n*/\nNK_INTERN float\nnk_inv_sqrt(float number)\n{\n    float x2;\n    const float threehalfs = 1.5f;\n    union {nk_uint i; float f;} conv = {0};\n    conv.f = number;\n    x2 = number * 0.5f;\n    conv.i = 0x5f375A84 - (conv.i >> 1);\n    conv.f = conv.f * (threehalfs - (x2 * conv.f * conv.f));\n    return conv.f;\n}\n\nNK_INTERN float\nnk_sqrt(float x)\n{\n    return x * nk_inv_sqrt(x);\n}\n\nNK_INTERN float\nnk_sin(float x)\n{\n    NK_STORAGE const float a0 = +1.91059300966915117e-31f;\n    NK_STORAGE const float a1 = +1.00086760103908896f;\n    NK_STORAGE const float a2 = -1.21276126894734565e-2f;\n    NK_STORAGE const float a3 = -1.38078780785773762e-1f;\n    NK_STORAGE const float a4 = -2.67353392911981221e-2f;\n    NK_STORAGE const float a5 = +2.08026600266304389e-2f;\n    NK_STORAGE const float a6 = -3.03996055049204407e-3f;\n    NK_STORAGE const float a7 = +1.38235642404333740e-4f;\n    return a0 + x*(a1 + x*(a2 + x*(a3 + x*(a4 + x*(a5 + x*(a6 + x*a7))))));\n}\n\nNK_INTERN float\nnk_cos(float x)\n{\n    NK_STORAGE const float a0 = +1.00238601909309722f;\n    NK_STORAGE const float a1 = -3.81919947353040024e-2f;\n    NK_STORAGE const float a2 = -3.94382342128062756e-1f;\n    NK_STORAGE const float a3 = -1.18134036025221444e-1f;\n    NK_STORAGE const float a4 = +1.07123798512170878e-1f;\n    NK_STORAGE const float a5 = -1.86637164165180873e-2f;\n    NK_STORAGE const float a6 = +9.90140908664079833e-4f;\n    NK_STORAGE const float a7 = -5.23022132118824778e-14f;\n    return a0 + x*(a1 + x*(a2 + x*(a3 + x*(a4 + x*(a5 + x*(a6 + x*a7))))));\n}\n\nNK_INTERN nk_uint\nnk_round_up_pow2(nk_uint v)\n{\n    v--;\n    v |= v >> 1;\n    v |= v >> 2;\n    v |= v >> 4;\n    v |= v >> 8;\n    v |= v >> 16;\n    v++;\n    return v;\n}\n\nNK_API struct nk_rect\nnk_get_null_rect(void)\n{\n    return nk_null_rect;\n}\n\nNK_API struct nk_rect\nnk_rect(float x, float y, float w, float h)\n{\n    struct nk_rect r;\n    r.x = x; r.y = y;\n    r.w = w; r.h = h;\n    return r;\n}\n\nNK_API struct nk_rect\nnk_recti(int x, int y, int w, int h)\n{\n    struct nk_rect r;\n    r.x = (float)x;\n    r.y = (float)y;\n    r.w = (float)w;\n    r.h = (float)h;\n    return r;\n}\n\nNK_API struct nk_rect\nnk_recta(struct nk_vec2 pos, struct nk_vec2 size)\n{\n    return nk_rect(pos.x, pos.y, size.x, size.y);\n}\n\nNK_API struct nk_rect\nnk_rectv(const float *r)\n{\n    return nk_rect(r[0], r[1], r[2], r[3]);\n}\n\nNK_API struct nk_rect\nnk_rectiv(const int *r)\n{\n    return nk_recti(r[0], r[1], r[2], r[3]);\n}\n\nNK_API struct nk_vec2\nnk_rect_pos(struct nk_rect r)\n{\n    struct nk_vec2 ret;\n    ret.x = r.x; ret.y = r.y;\n    return ret;\n}\n\nNK_API struct nk_vec2\nnk_rect_size(struct nk_rect r)\n{\n    struct nk_vec2 ret;\n    ret.x = r.w; ret.y = r.h;\n    return ret;\n}\n\nNK_INTERN struct nk_rect\nnk_shrink_rect(struct nk_rect r, float amount)\n{\n    struct nk_rect res;\n    r.w = NK_MAX(r.w, 2 * amount);\n    r.h = NK_MAX(r.h, 2 * amount);\n    res.x = r.x + amount;\n    res.y = r.y + amount;\n    res.w = r.w - 2 * amount;\n    res.h = r.h - 2 * amount;\n    return res;\n}\n\nNK_INTERN struct nk_rect\nnk_pad_rect(struct nk_rect r, struct nk_vec2 pad)\n{\n    r.w = NK_MAX(r.w, 2 * pad.x);\n    r.h = NK_MAX(r.h, 2 * pad.y);\n    r.x += pad.x; r.y += pad.y;\n    r.w -= 2 * pad.x;\n    r.h -= 2 * pad.y;\n    return r;\n}\n\nNK_API struct nk_vec2\nnk_vec2(float x, float y)\n{\n    struct nk_vec2 ret;\n    ret.x = x; ret.y = y;\n    return ret;\n}\n\nNK_API struct nk_vec2\nnk_vec2i(int x, int y)\n{\n    struct nk_vec2 ret;\n    ret.x = (float)x;\n    ret.y = (float)y;\n    return ret;\n}\n\nNK_API struct nk_vec2\nnk_vec2v(const float *v)\n{\n    return nk_vec2(v[0], v[1]);\n}\n\nNK_API struct nk_vec2\nnk_vec2iv(const int *v)\n{\n    return nk_vec2i(v[0], v[1]);\n}\n\n/*\n * ==============================================================\n *\n *                          UTIL\n *\n * ===============================================================\n */\nNK_INTERN int nk_str_match_here(const char *regexp, const char *text);\nNK_INTERN int nk_str_match_star(int c, const char *regexp, const char *text);\nNK_INTERN int nk_is_lower(int c) {return (c >= 'a' && c <= 'z') || (c >= 0xE0 && c <= 0xFF);}\nNK_INTERN int nk_is_upper(int c){return (c >= 'A' && c <= 'Z') || (c >= 0xC0 && c <= 0xDF);}\nNK_INTERN int nk_to_upper(int c) {return (c >= 'a' && c <= 'z') ? (c - ('a' - 'A')) : c;}\nNK_INTERN int nk_to_lower(int c) {return (c >= 'A' && c <= 'Z') ? (c - ('a' + 'A')) : c;}\n\nNK_INTERN void*\nnk_memcopy(void *dst0, const void *src0, nk_size length)\n{\n    nk_ptr t;\n    char *dst = (char*)dst0;\n    const char *src = (const char*)src0;\n    if (length == 0 || dst == src)\n        goto done;\n\n    #define nk_word int\n    #define nk_wsize sizeof(nk_word)\n    #define nk_wmask (nk_wsize-1)\n    #define NK_TLOOP(s) if (t) NK_TLOOP1(s)\n    #define NK_TLOOP1(s) do { s; } while (--t)\n\n    if (dst < src) {\n        t = (nk_ptr)src; /* only need low bits */\n        if ((t | (nk_ptr)dst) & nk_wmask) {\n            if ((t ^ (nk_ptr)dst) & nk_wmask || length < nk_wsize)\n                t = length;\n            else\n                t = nk_wsize - (t & nk_wmask);\n            length -= t;\n            NK_TLOOP1(*dst++ = *src++);\n        }\n        t = length / nk_wsize;\n        NK_TLOOP(*(nk_word*)(void*)dst = *(const nk_word*)(const void*)src;\n            src += nk_wsize; dst += nk_wsize);\n        t = length & nk_wmask;\n        NK_TLOOP(*dst++ = *src++);\n    } else {\n        src += length;\n        dst += length;\n        t = (nk_ptr)src;\n        if ((t | (nk_ptr)dst) & nk_wmask) {\n            if ((t ^ (nk_ptr)dst) & nk_wmask || length <= nk_wsize)\n                t = length;\n            else\n                t &= nk_wmask;\n            length -= t;\n            NK_TLOOP1(*--dst = *--src);\n        }\n        t = length / nk_wsize;\n        NK_TLOOP(src -= nk_wsize; dst -= nk_wsize;\n            *(nk_word*)(void*)dst = *(const nk_word*)(const void*)src);\n        t = length & nk_wmask;\n        NK_TLOOP(*--dst = *--src);\n    }\n    #undef nk_word\n    #undef nk_wsize\n    #undef nk_wmask\n    #undef NK_TLOOP\n    #undef NK_TLOOP1\ndone:\n    return (dst0);\n}\n\nNK_INTERN void\nnk_memset(void *ptr, int c0, nk_size size)\n{\n    #define nk_word unsigned\n    #define nk_wsize sizeof(nk_word)\n    #define nk_wmask (nk_wsize - 1)\n    nk_byte *dst = (nk_byte*)ptr;\n    unsigned c = 0;\n    nk_size t = 0;\n\n    if ((c = (nk_byte)c0) != 0) {\n        c = (c << 8) | c; /* at least 16-bits  */\n        if (sizeof(unsigned int) > 2)\n            c = (c << 16) | c; /* at least 32-bits*/\n    }\n\n    /* too small of a word count */\n    dst = (nk_byte*)ptr;\n    if (size < 3 * nk_wsize) {\n        while (size--) *dst++ = (nk_byte)c0;\n        return;\n    }\n\n    /* align destination */\n    if ((t = NK_PTR_TO_UINT(dst) & nk_wmask) != 0) {\n        t = nk_wsize -t;\n        size -= t;\n        do {\n            *dst++ = (nk_byte)c0;\n        } while (--t != 0);\n    }\n\n    /* fill word */\n    t = size / nk_wsize;\n    do {\n        *(nk_word*)((void*)dst) = c;\n        dst += nk_wsize;\n    } while (--t != 0);\n\n    /* fill trailing bytes */\n    t = (size & nk_wmask);\n    if (t != 0) {\n        do {\n            *dst++ = (nk_byte)c0;\n        } while (--t != 0);\n    }\n\n    #undef nk_word\n    #undef nk_wsize\n    #undef nk_wmask\n}\n\nNK_INTERN void\nnk_zero(void *ptr, nk_size size)\n{\n    NK_ASSERT(ptr);\n    NK_MEMSET(ptr, 0, size);\n}\n\nNK_API int\nnk_strlen(const char *str)\n{\n    int siz = 0;\n    NK_ASSERT(str);\n    while (str && *str++ != '\\0') siz++;\n    return siz;\n}\n\nNK_API int\nnk_strtoi(const char *str, const char **endptr)\n{\n    int neg = 1;\n    const char *p = str;\n    int value = 0;\n\n    NK_ASSERT(str);\n    if (!str) return 0;\n\n    /* skip whitespace */\n    while (*p == ' ') p++;\n    if (*p == '-') {\n        neg = -1;\n        p++;\n    }\n    while (*p && *p >= '0' && *p <= '9') {\n        value = value * 10 + (int) (*p - '0');\n        p++;\n    }\n    if (endptr)\n        *endptr = p;\n    return neg*value;\n}\n\nNK_API double\nnk_strtod(const char *str, const char **endptr)\n{\n    double m;\n    double neg = 1.0;\n    const char *p = str;\n    double value = 0;\n    double number = 0;\n\n    NK_ASSERT(str);\n    if (!str) return 0;\n\n    /* skip whitespace */\n    while (*p == ' ') p++;\n    if (*p == '-') {\n        neg = -1.0;\n        p++;\n    }\n\n    while (*p && *p != '.' && *p != 'e') {\n        value = value * 10.0 + (double) (*p - '0');\n        p++;\n    }\n\n    if (*p == '.') {\n        p++;\n        for(m = 0.1; *p && *p != 'e'; p++ ) {\n            value = value + (double) (*p - '0') * m;\n            m *= 0.1;\n        }\n    }\n    if (*p == 'e') {\n        int i, pow, div;\n        p++;\n        if (*p == '-') {\n            div = nk_true;\n            p++;\n        } else if (*p == '+') {\n            div = nk_false;\n            p++;\n        } else div = nk_false;\n\n        for (pow = 0; *p; p++)\n            pow = pow * 10 + (int) (*p - '0');\n\n        for (m = 1.0, i = 0; i < pow; i++)\n            m *= 10.0;\n\n        if (div)\n            value /= m;\n        else value *= m;\n    }\n    number = value * neg;\n    if (endptr)\n        *endptr = p;\n    return number;\n}\n\nNK_API float\nnk_strtof(const char *str, const char **endptr)\n{\n    float float_value;\n    double double_value;\n    double_value = NK_STRTOD(str, endptr);\n    float_value = (float)double_value;\n    return float_value;\n}\n\nNK_API int\nnk_stricmp(const char *s1, const char *s2)\n{\n    nk_int c1,c2,d;\n    do {\n        c1 = *s1++;\n        c2 = *s2++;\n        d = c1 - c2;\n        while (d) {\n            if (c1 <= 'Z' && c1 >= 'A') {\n                d += ('a' - 'A');\n                if (!d) break;\n            }\n            if (c2 <= 'Z' && c2 >= 'A') {\n                d -= ('a' - 'A');\n                if (!d) break;\n            }\n            return ((d >= 0) << 1) - 1;\n        }\n    } while (c1);\n    return 0;\n}\n\nNK_API int\nnk_stricmpn(const char *s1, const char *s2, int n)\n{\n    int c1,c2,d;\n    NK_ASSERT(n >= 0);\n    do {\n        c1 = *s1++;\n        c2 = *s2++;\n        if (!n--) return 0;\n\n        d = c1 - c2;\n        while (d) {\n            if (c1 <= 'Z' && c1 >= 'A') {\n                d += ('a' - 'A');\n                if (!d) break;\n            }\n            if (c2 <= 'Z' && c2 >= 'A') {\n                d -= ('a' - 'A');\n                if (!d) break;\n            }\n            return ((d >= 0) << 1) - 1;\n        }\n    } while (c1);\n    return 0;\n}\n\nNK_INTERN int\nnk_str_match_here(const char *regexp, const char *text)\n{\n    if (regexp[0] == '\\0')\n        return 1;\n    if (regexp[1] == '*')\n        return nk_str_match_star(regexp[0], regexp+2, text);\n    if (regexp[0] == '$' && regexp[1] == '\\0')\n        return *text == '\\0';\n    if (*text!='\\0' && (regexp[0]=='.' || regexp[0]==*text))\n        return nk_str_match_here(regexp+1, text+1);\n    return 0;\n}\n\nNK_INTERN int\nnk_str_match_star(int c, const char *regexp, const char *text)\n{\n    do {/* a '* matches zero or more instances */\n        if (nk_str_match_here(regexp, text))\n            return 1;\n    } while (*text != '\\0' && (*text++ == c || c == '.'));\n    return 0;\n}\n\nNK_API int\nnk_strfilter(const char *text, const char *regexp)\n{\n    /*\n    c    matches any literal character c\n    .    matches any single character\n    ^    matches the beginning of the input string\n    $    matches the end of the input string\n    *    matches zero or more occurrences of the previous character*/\n    if (regexp[0] == '^')\n        return nk_str_match_here(regexp+1, text);\n    do {    /* must look even if string is empty */\n        if (nk_str_match_here(regexp, text))\n            return 1;\n    } while (*text++ != '\\0');\n    return 0;\n}\n\nNK_API int\nnk_strmatch_fuzzy_text(const char *str, int str_len,\n    const char *pattern, int *out_score)\n{\n    /* Returns true if each character in pattern is found sequentially within str\n     * if found then outScore is also set. Score value has no intrinsic meaning.\n     * Range varies with pattern. Can only compare scores with same search pattern. */\n\n    /* ------- scores --------- */\n    /* bonus for adjacent matches */\n    #define NK_ADJACENCY_BONUS 5\n    /* bonus if match occurs after a separator */\n    #define NK_SEPARATOR_BONUS 10\n    /* bonus if match is uppercase and prev is lower */\n    #define NK_CAMEL_BONUS 10\n    /* penalty applied for every letter in str before the first match */\n    #define NK_LEADING_LETTER_PENALTY (-3)\n    /* maximum penalty for leading letters */\n    #define NK_MAX_LEADING_LETTER_PENALTY (-9)\n    /* penalty for every letter that doesn't matter */\n    #define NK_UNMATCHED_LETTER_PENALTY (-1)\n\n    /* loop variables */\n    int score = 0;\n    char const * pattern_iter = pattern;\n    int str_iter = 0;\n    int prev_matched = nk_false;\n    int prev_lower = nk_false;\n    /* true so if first letter match gets separator bonus*/\n    int prev_separator = nk_true;\n\n    /* use \"best\" matched letter if multiple string letters match the pattern */\n    char const * best_letter = 0;\n    int best_letter_score = 0;\n\n    /* loop over strings */\n    NK_ASSERT(str);\n    NK_ASSERT(pattern);\n    if (!str || !str_len || !pattern) return 0;\n    while (str_iter < str_len)\n    {\n        const char pattern_letter = *pattern_iter;\n        const char str_letter = str[str_iter];\n\n        int next_match = *pattern_iter != '\\0' &&\n            nk_to_lower(pattern_letter) == nk_to_lower(str_letter);\n        int rematch = best_letter && nk_to_upper(*best_letter) == nk_to_upper(str_letter);\n\n        int advanced = next_match && best_letter;\n        int pattern_repeat = best_letter && *pattern_iter != '\\0';\n        pattern_repeat = pattern_repeat &&\n            nk_to_lower(*best_letter) == nk_to_lower(pattern_letter);\n\n        if (advanced || pattern_repeat) {\n            score += best_letter_score;\n            best_letter = 0;\n            best_letter_score = 0;\n        }\n\n        if (next_match || rematch)\n        {\n            int new_score = 0;\n            /* Apply penalty for each letter before the first pattern match */\n            if (pattern_iter == pattern) {\n                int count = (int)(&str[str_iter] - str);\n                int penalty = NK_LEADING_LETTER_PENALTY * count;\n                if (penalty < NK_MAX_LEADING_LETTER_PENALTY)\n                    penalty = NK_MAX_LEADING_LETTER_PENALTY;\n\n                score += penalty;\n            }\n\n            /* apply bonus for consecutive bonuses */\n            if (prev_matched)\n                new_score += NK_ADJACENCY_BONUS;\n\n            /* apply bonus for matches after a separator */\n            if (prev_separator)\n                new_score += NK_SEPARATOR_BONUS;\n\n            /* apply bonus across camel case boundaries */\n            if (prev_lower && nk_is_upper(str_letter))\n                new_score += NK_CAMEL_BONUS;\n\n            /* update pattern iter IFF the next pattern letter was matched */\n            if (next_match)\n                ++pattern_iter;\n\n            /* update best letter in str which may be for a \"next\" letter or a rematch */\n            if (new_score >= best_letter_score) {\n                /* apply penalty for now skipped letter */\n                if (best_letter != 0)\n                    score += NK_UNMATCHED_LETTER_PENALTY;\n\n                best_letter = &str[str_iter];\n                best_letter_score = new_score;\n            }\n            prev_matched = nk_true;\n        } else {\n            score += NK_UNMATCHED_LETTER_PENALTY;\n            prev_matched = nk_false;\n        }\n\n        /* separators should be more easily defined */\n        prev_lower = nk_is_lower(str_letter) != 0;\n        prev_separator = str_letter == '_' || str_letter == ' ';\n\n        ++str_iter;\n    }\n\n    /* apply score for last match */\n    if (best_letter)\n        score += best_letter_score;\n\n    /* did not match full pattern */\n    if (*pattern_iter != '\\0')\n        return nk_false;\n\n    if (out_score)\n        *out_score = score;\n    return nk_true;\n}\n\nNK_API int\nnk_strmatch_fuzzy_string(char const *str, char const *pattern, int *out_score)\n{return nk_strmatch_fuzzy_text(str, nk_strlen(str), pattern, out_score);}\n\nNK_INTERN int\nnk_string_float_limit(char *string, int prec)\n{\n    int dot = 0;\n    char *c = string;\n    while (*c) {\n        if (*c == '.') {\n            dot = 1;\n            c++;\n            continue;\n        }\n        if (dot == (prec+1)) {\n            *c = 0;\n            break;\n        }\n        if (dot > 0) dot++;\n        c++;\n    }\n    return (int)(c - string);\n}\n\nNK_INTERN double\nnk_pow(double x, int n)\n{\n    /*  check the sign of n */\n    double r = 1;\n    int plus = n >= 0;\n    n = (plus) ? n : -n;\n    while (n > 0) {\n        if ((n & 1) == 1)\n            r *= x;\n        n /= 2;\n        x *= x;\n    }\n    return plus ? r : 1.0 / r;\n}\n\nNK_INTERN int\nnk_ifloord(double x)\n{\n    x = (double)((int)x - ((x < 0.0) ? 1 : 0));\n    return (int)x;\n}\n\nNK_INTERN int\nnk_ifloorf(float x)\n{\n    x = (float)((int)x - ((x < 0.0f) ? 1 : 0));\n    return (int)x;\n}\n\nNK_INTERN int\nnk_iceilf(float x)\n{\n    if (x >= 0) {\n        int i = (int)x;\n        return i;\n    } else {\n        int t = (int)x;\n        float r = x - (float)t;\n        return (r > 0.0f) ? t+1: t;\n    }\n}\n\nNK_INTERN int\nnk_log10(double n)\n{\n    int neg;\n    int ret;\n    int exp = 0;\n\n    neg = (n < 0) ? 1 : 0;\n    ret = (neg) ? (int)-n : (int)n;\n    while ((ret / 10) > 0) {\n        ret /= 10;\n        exp++;\n    }\n    if (neg) exp = -exp;\n    return exp;\n}\n\nNK_INTERN void\nnk_strrev_ascii(char *s)\n{\n    int len = nk_strlen(s);\n    int end = len / 2;\n    int i = 0;\n    char t;\n    for (; i < end; ++i) {\n        t = s[i];\n        s[i] = s[len - 1 - i];\n        s[len -1 - i] = t;\n    }\n}\n\nNK_INTERN char*\nnk_itoa(char *s, long n)\n{\n    long i = 0;\n    if (n == 0) {\n        s[i++] = '0';\n        s[i] = 0;\n        return s;\n    }\n    if (n < 0) {\n        s[i++] = '-';\n        n = -n;\n    }\n    while (n > 0) {\n        s[i++] = (char)('0' + (n % 10));\n        n /= 10;\n    }\n    s[i] = 0;\n    if (s[0] == '-')\n        ++s;\n\n    nk_strrev_ascii(s);\n    return s;\n}\n\nNK_INTERN char*\nnk_dtoa(char *s, double n)\n{\n    int useExp = 0;\n    int digit = 0, m = 0, m1 = 0;\n    char *c = s;\n    int neg = 0;\n\n    NK_ASSERT(s);\n    if (!s) return 0;\n\n    if (n == 0.0) {\n        s[0] = '0'; s[1] = '\\0';\n        return s;\n    }\n\n    neg = (n < 0);\n    if (neg) n = -n;\n\n    /* calculate magnitude */\n    m = nk_log10(n);\n    useExp = (m >= 14 || (neg && m >= 9) || m <= -9);\n    if (neg) *(c++) = '-';\n\n    /* set up for scientific notation */\n    if (useExp) {\n        if (m < 0)\n           m -= 1;\n        n = n / (double)nk_pow(10.0, m);\n        m1 = m;\n        m = 0;\n    }\n    if (m < 1.0) {\n        m = 0;\n    }\n\n    /* convert the number */\n    while (n > NK_FLOAT_PRECISION || m >= 0) {\n        double weight = nk_pow(10.0, m);\n        if (weight > 0) {\n            double t = (double)n / weight;\n            digit = nk_ifloord(t);\n            n -= ((double)digit * weight);\n            *(c++) = (char)('0' + (char)digit);\n        }\n        if (m == 0 && n > 0)\n            *(c++) = '.';\n        m--;\n    }\n\n    if (useExp) {\n        /* convert the exponent */\n        int i, j;\n        *(c++) = 'e';\n        if (m1 > 0) {\n            *(c++) = '+';\n        } else {\n            *(c++) = '-';\n            m1 = -m1;\n        }\n        m = 0;\n        while (m1 > 0) {\n            *(c++) = (char)('0' + (char)(m1 % 10));\n            m1 /= 10;\n            m++;\n        }\n        c -= m;\n        for (i = 0, j = m-1; i<j; i++, j--) {\n            /* swap without temporary */\n            c[i] ^= c[j];\n            c[j] ^= c[i];\n            c[i] ^= c[j];\n        }\n        c += m;\n    }\n    *(c) = '\\0';\n    return s;\n}\n\n#ifdef NK_INCLUDE_STANDARD_VARARGS\n#ifndef NK_INCLUDE_STANDARD_IO\nstatic int\nnk_vsnprintf(char *buf, int buf_size, const char *fmt, va_list args)\n{\n    enum nk_arg_type {\n        NK_ARG_TYPE_CHAR,\n        NK_ARG_TYPE_SHORT,\n        NK_ARG_TYPE_DEFAULT,\n        NK_ARG_TYPE_LONG\n    };\n    enum nk_arg_flags {\n        NK_ARG_FLAG_LEFT = 0x01,\n        NK_ARG_FLAG_PLUS = 0x02,\n        NK_ARG_FLAG_SPACE = 0x04,\n        NK_ARG_FLAG_NUM = 0x10,\n        NK_ARG_FLAG_ZERO = 0x20\n    };\n\n    char number_buffer[NK_MAX_NUMBER_BUFFER];\n    enum nk_arg_type arg_type = NK_ARG_TYPE_DEFAULT;\n    int precision = NK_DEFAULT;\n    int width = NK_DEFAULT;\n    nk_flags flag = 0;\n\n    int len = 0;\n    int result = -1;\n    const char *iter = fmt;\n\n    NK_ASSERT(buf);\n    NK_ASSERT(buf_size);\n    if (!buf || !buf_size || !fmt) return 0;\n    for (iter = fmt; *iter && len < buf_size; iter++) {\n        /* copy all non-format characters */\n        while (*iter && (*iter != '%') && (len < buf_size))\n            buf[len++] = *iter++;\n        if (!(*iter) || len >= buf_size) break;\n        iter++;\n\n        /* flag arguments */\n        while (*iter) {\n            if (*iter == '-') flag |= NK_ARG_FLAG_LEFT;\n            else if (*iter == '+') flag |= NK_ARG_FLAG_PLUS;\n            else if (*iter == ' ') flag |= NK_ARG_FLAG_SPACE;\n            else if (*iter == '#') flag |= NK_ARG_FLAG_NUM;\n            else if (*iter == '0') flag |= NK_ARG_FLAG_ZERO;\n            else break;\n            iter++;\n        }\n\n        /* width argument */\n        width = NK_DEFAULT;\n        if (*iter >= '1' && *iter <= '9') {\n            const char *end;\n            width = nk_strtoi(iter, &end);\n            if (end == iter)\n                width = -1;\n            else iter = end;\n        } else if (*iter == '*') {\n            width = va_arg(args, int);\n            iter++;\n        }\n\n        /* precision argument */\n        precision = NK_DEFAULT;\n        if (*iter == '.') {\n            iter++;\n            if (*iter == '*') {\n                precision = va_arg(args, int);\n                iter++;\n            } else {\n                const char *end;\n                precision = nk_strtoi(iter, &end);\n                if (end == iter)\n                    precision = -1;\n                else iter = end;\n            }\n        }\n\n        /* length modifier */\n        if (*iter == 'h') {\n            if (*(iter+1) == 'h') {\n                arg_type = NK_ARG_TYPE_CHAR;\n                iter++;\n            } else arg_type = NK_ARG_TYPE_SHORT;\n            iter++;\n        } else if (*iter == 'l') {\n            arg_type = NK_ARG_TYPE_LONG;\n            iter++;\n        } else arg_type = NK_ARG_TYPE_DEFAULT;\n\n        /* specifier */\n        if (*iter == '%') {\n            NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT);\n            NK_ASSERT(precision == NK_DEFAULT);\n            NK_ASSERT(width == NK_DEFAULT);\n            if (len < buf_size)\n                buf[len++] = '%';\n        } else if (*iter == 's') {\n            /* string  */\n            const char *str = va_arg(args, const char*);\n            NK_ASSERT(str != buf && \"buffer and argument are not allowed to overlap!\");\n            NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT);\n            NK_ASSERT(precision == NK_DEFAULT);\n            NK_ASSERT(width == NK_DEFAULT);\n            if (str == buf) return -1;\n            while (str && *str && len < buf_size)\n                buf[len++] = *str++;\n        } else if (*iter == 'n') {\n            /* current length callback */\n            signed int *n = va_arg(args, int*);\n            NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT);\n            NK_ASSERT(precision == NK_DEFAULT);\n            NK_ASSERT(width == NK_DEFAULT);\n            if (n) *n = len;\n        } else if (*iter == 'c' || *iter == 'i' || *iter == 'd') {\n            /* signed integer */\n            long value = 0;\n            const char *num_iter;\n            int num_len, num_print, padding;\n            int cur_precision = NK_MAX(precision, 1);\n            int cur_width = NK_MAX(width, 0);\n\n            /* retrieve correct value type */\n            if (arg_type == NK_ARG_TYPE_CHAR)\n                value = (signed char)va_arg(args, int);\n            else if (arg_type == NK_ARG_TYPE_SHORT)\n                value = (signed short)va_arg(args, int);\n            else if (arg_type == NK_ARG_TYPE_LONG)\n                value = va_arg(args, signed long);\n            else if (*iter == 'c')\n                value = (unsigned char)va_arg(args, int);\n            else value = va_arg(args, signed int);\n\n            /* convert number to string */\n            nk_itoa(number_buffer, value);\n            num_len = nk_strlen(number_buffer);\n            padding = NK_MAX(cur_width - NK_MAX(cur_precision, num_len), 0);\n            if ((flag & NK_ARG_FLAG_PLUS) || (flag & NK_ARG_FLAG_SPACE))\n                padding = NK_MAX(padding-1, 0);\n\n            /* fill left padding up to a total of `width` characters */\n            if (!(flag & NK_ARG_FLAG_LEFT)) {\n                while (padding-- > 0 && (len < buf_size)) {\n                    if ((flag & NK_ARG_FLAG_ZERO) && (precision == NK_DEFAULT))\n                        buf[len++] = '0';\n                    else buf[len++] = ' ';\n                }\n            }\n\n            /* copy string value representation into buffer */\n            if ((flag & NK_ARG_FLAG_PLUS) && value >= 0 && len < buf_size)\n                buf[len++] = '+';\n            else if ((flag & NK_ARG_FLAG_SPACE) && value >= 0 && len < buf_size)\n                buf[len++] = ' ';\n\n            /* fill up to precision number of digits with '0' */\n            num_print = NK_MAX(cur_precision, num_len);\n            while (precision && (num_print > num_len) && (len < buf_size)) {\n                buf[len++] = '0';\n                num_print--;\n            }\n\n            /* copy string value representation into buffer */\n            num_iter = number_buffer;\n            while (precision && *num_iter && len < buf_size)\n                buf[len++] = *num_iter++;\n\n            /* fill right padding up to width characters */\n            if (flag & NK_ARG_FLAG_LEFT) {\n                while ((padding-- > 0) && (len < buf_size))\n                    buf[len++] = ' ';\n            }\n        } else if (*iter == 'o' || *iter == 'x' || *iter == 'X' || *iter == 'u') {\n            /* unsigned integer */\n            unsigned long value = 0;\n            int num_len = 0, num_print, padding = 0;\n            int cur_precision = NK_MAX(precision, 1);\n            int cur_width = NK_MAX(width, 0);\n            unsigned int base = (*iter == 'o') ? 8: (*iter == 'u')? 10: 16;\n\n            /* print oct/hex/dec value */\n            const char *upper_output_format = \"0123456789ABCDEF\";\n            const char *lower_output_format = \"0123456789abcdef\";\n            const char *output_format = (*iter == 'x') ?\n                lower_output_format: upper_output_format;\n\n            /* retrieve correct value type */\n            if (arg_type == NK_ARG_TYPE_CHAR)\n                value = (unsigned char)va_arg(args, int);\n            else if (arg_type == NK_ARG_TYPE_SHORT)\n                value = (unsigned short)va_arg(args, int);\n            else if (arg_type == NK_ARG_TYPE_LONG)\n                value = va_arg(args, unsigned long);\n            else value = va_arg(args, unsigned int);\n\n            do {\n                /* convert decimal number into hex/oct number */\n                int digit = output_format[value % base];\n                if (num_len < NK_MAX_NUMBER_BUFFER)\n                    number_buffer[num_len++] = (char)digit;\n                value /= base;\n            } while (value > 0);\n\n            num_print = NK_MAX(cur_precision, num_len);\n            padding = NK_MAX(cur_width - NK_MAX(cur_precision, num_len), 0);\n            if (flag & NK_ARG_FLAG_NUM)\n                padding = NK_MAX(padding-1, 0);\n\n            /* fill left padding up to a total of `width` characters */\n            if (!(flag & NK_ARG_FLAG_LEFT)) {\n                while ((padding-- > 0) && (len < buf_size)) {\n                    if ((flag & NK_ARG_FLAG_ZERO) && (precision == NK_DEFAULT))\n                        buf[len++] = '0';\n                    else buf[len++] = ' ';\n                }\n            }\n\n            /* fill up to precision number of digits */\n            if (num_print && (flag & NK_ARG_FLAG_NUM)) {\n                if ((*iter == 'o') && (len < buf_size)) {\n                    buf[len++] = '0';\n                } else if ((*iter == 'x') && ((len+1) < buf_size)) {\n                    buf[len++] = '0';\n                    buf[len++] = 'x';\n                } else if ((*iter == 'X') && ((len+1) < buf_size)) {\n                    buf[len++] = '0';\n                    buf[len++] = 'X';\n                }\n            }\n            while (precision && (num_print > num_len) && (len < buf_size)) {\n                buf[len++] = '0';\n                num_print--;\n            }\n\n            /* reverse number direction */\n            while (num_len > 0) {\n                if (precision && (len < buf_size))\n                    buf[len++] = number_buffer[num_len-1];\n                num_len--;\n            }\n\n            /* fill right padding up to width characters */\n            if (flag & NK_ARG_FLAG_LEFT) {\n                while ((padding-- > 0) && (len < buf_size))\n                    buf[len++] = ' ';\n            }\n        } else if (*iter == 'f') {\n            /* floating point */\n            const char *num_iter;\n            int cur_precision = (precision < 0) ? 6: precision;\n            int prefix, cur_width = NK_MAX(width, 0);\n            double value = va_arg(args, double);\n            int num_len = 0, frac_len = 0, dot = 0;\n            int padding = 0;\n\n            NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT);\n            NK_DTOA(number_buffer, value);\n            num_len = nk_strlen(number_buffer);\n\n            /* calculate padding */\n            num_iter = number_buffer;\n            while (*num_iter && *num_iter != '.')\n                num_iter++;\n\n            prefix = (*num_iter == '.')?(int)(num_iter - number_buffer)+1:0;\n            padding = NK_MAX(cur_width - (prefix + NK_MIN(cur_precision, num_len - prefix)) , 0);\n            if ((flag & NK_ARG_FLAG_PLUS) || (flag & NK_ARG_FLAG_SPACE))\n                padding = NK_MAX(padding-1, 0);\n\n            /* fill left padding up to a total of `width` characters */\n            if (!(flag & NK_ARG_FLAG_LEFT)) {\n                while (padding-- > 0 && (len < buf_size)) {\n                    if (flag & NK_ARG_FLAG_ZERO)\n                        buf[len++] = '0';\n                    else buf[len++] = ' ';\n                }\n            }\n\n            /* copy string value representation into buffer */\n            num_iter = number_buffer;\n            if ((flag & NK_ARG_FLAG_PLUS) && (value >= 0) && (len < buf_size))\n                buf[len++] = '+';\n            else if ((flag & NK_ARG_FLAG_SPACE) && (value >= 0) && (len < buf_size))\n                buf[len++] = ' ';\n            while (*num_iter) {\n                if (dot) frac_len++;\n                if (len < buf_size)\n                    buf[len++] = *num_iter;\n                if (*num_iter == '.') dot = 1;\n                if (frac_len >= cur_precision) break;\n                num_iter++;\n            }\n\n            /* fill number up to precision */\n            while (frac_len < cur_precision) {\n                if (!dot && len < buf_size) {\n                    buf[len++] = '.';\n                    dot = 1;\n                }\n                if (len < buf_size)\n                    buf[len++] = '0';\n                frac_len++;\n            }\n\n            /* fill right padding up to width characters */\n            if (flag & NK_ARG_FLAG_LEFT) {\n                while ((padding-- > 0) && (len < buf_size))\n                    buf[len++] = ' ';\n            }\n        } else {\n            /* Specifier not supported: g,G,e,E,p,z */\n            NK_ASSERT(0 && \"specifier is not supported!\");\n            return result;\n        }\n    }\n    buf[(len >= buf_size)?(buf_size-1):len] = 0;\n    result = (len >= buf_size)?-1:len;\n    return result;\n}\n#endif\n\nNK_INTERN int\nnk_strfmt(char *buf, int buf_size, const char *fmt, va_list args)\n{\n    int result = -1;\n    NK_ASSERT(buf);\n    NK_ASSERT(buf_size);\n    if (!buf || !buf_size || !fmt) return 0;\n#ifdef NK_INCLUDE_STANDARD_IO\n    result = NK_VSNPRINTF(buf, (nk_size)buf_size, fmt, args);\n    result = (result >= buf_size) ? -1: result;\n    buf[buf_size-1] = 0;\n#else\n    result = nk_vsnprintf(buf, buf_size, fmt, args);\n#endif\n    return result;\n}\n#endif\n\nNK_API nk_hash\nnk_murmur_hash(const void * key, int len, nk_hash seed)\n{\n    /* 32-Bit MurmurHash3: https://code.google.com/p/smhasher/wiki/MurmurHash3*/\n    #define NK_ROTL(x,r) ((x) << (r) | ((x) >> (32 - r)))\n    union {const nk_uint *i; const nk_byte *b;} conv = {0};\n    const nk_byte *data = (const nk_byte*)key;\n    const int nblocks = len/4;\n    nk_uint h1 = seed;\n    const nk_uint c1 = 0xcc9e2d51;\n    const nk_uint c2 = 0x1b873593;\n    const nk_byte *tail;\n    const nk_uint *blocks;\n    nk_uint k1;\n    int i;\n\n    /* body */\n    if (!key) return 0;\n    conv.b = (data + nblocks*4);\n    blocks = (const nk_uint*)conv.i;\n    for (i = -nblocks; i; ++i) {\n        k1 = blocks[i];\n        k1 *= c1;\n        k1 = NK_ROTL(k1,15);\n        k1 *= c2;\n\n        h1 ^= k1;\n        h1 = NK_ROTL(h1,13);\n        h1 = h1*5+0xe6546b64;\n    }\n\n    /* tail */\n    tail = (const nk_byte*)(data + nblocks*4);\n    k1 = 0;\n    switch (len & 3) {\n    case 3: k1 ^= (nk_uint)(tail[2] << 16);\n    case 2: k1 ^= (nk_uint)(tail[1] << 8u);\n    case 1: k1 ^= tail[0];\n            k1 *= c1;\n            k1 = NK_ROTL(k1,15);\n            k1 *= c2;\n            h1 ^= k1;\n    default: break;\n    }\n\n    /* finalization */\n    h1 ^= (nk_uint)len;\n    /* fmix32 */\n    h1 ^= h1 >> 16;\n    h1 *= 0x85ebca6b;\n    h1 ^= h1 >> 13;\n    h1 *= 0xc2b2ae35;\n    h1 ^= h1 >> 16;\n\n    #undef NK_ROTL\n    return h1;\n}\n\n#ifdef NK_INCLUDE_STANDARD_IO\nNK_INTERN char*\nnk_file_load(const char* path, nk_size* siz, struct nk_allocator *alloc)\n{\n    char *buf;\n    FILE *fd;\n    long ret;\n\n    NK_ASSERT(path);\n    NK_ASSERT(siz);\n    NK_ASSERT(alloc);\n    if (!path || !siz || !alloc)\n        return 0;\n\n    fd = fopen(path, \"rb\");\n    if (!fd) return 0;\n    fseek(fd, 0, SEEK_END);\n    ret = ftell(fd);\n    if (ret < 0) {\n        fclose(fd);\n        return 0;\n    }\n    *siz = (nk_size)ret;\n    fseek(fd, 0, SEEK_SET);\n    buf = (char*)alloc->alloc(alloc->userdata,0, *siz);\n    NK_ASSERT(buf);\n    if (!buf) {\n        fclose(fd);\n        return 0;\n    }\n    *siz = (nk_size)fread(buf, *siz, 1, fd);\n    fclose(fd);\n    return buf;\n}\n#endif\n\n/*\n * ==============================================================\n *\n *                          COLOR\n *\n * ===============================================================\n */\nNK_INTERN int\nnk_parse_hex(const char *p, int length)\n{\n    int i = 0;\n    int len = 0;\n    while (len < length) {\n        i <<= 4;\n        if (p[len] >= 'a' && p[len] <= 'f')\n            i += ((p[len] - 'a') + 10);\n        else if (p[len] >= 'A' && p[len] <= 'F')\n            i += ((p[len] - 'A') + 10);\n        else i += (p[len] - '0');\n        len++;\n    }\n    return i;\n}\n\nNK_API struct nk_color\nnk_rgba(int r, int g, int b, int a)\n{\n    struct nk_color ret;\n    ret.r = (nk_byte)NK_CLAMP(0, r, 255);\n    ret.g = (nk_byte)NK_CLAMP(0, g, 255);\n    ret.b = (nk_byte)NK_CLAMP(0, b, 255);\n    ret.a = (nk_byte)NK_CLAMP(0, a, 255);\n    return ret;\n}\n\nNK_API struct nk_color\nnk_rgb_hex(const char *rgb)\n{\n    struct nk_color col;\n    const char *c = rgb;\n    if (*c == '#') c++;\n    col.r = (nk_byte)nk_parse_hex(c, 2);\n    col.g = (nk_byte)nk_parse_hex(c+2, 2);\n    col.b = (nk_byte)nk_parse_hex(c+4, 2);\n    col.a = 255;\n    return col;\n}\n\nNK_API struct nk_color\nnk_rgba_hex(const char *rgb)\n{\n    struct nk_color col;\n    const char *c = rgb;\n    if (*c == '#') c++;\n    col.r = (nk_byte)nk_parse_hex(c, 2);\n    col.g = (nk_byte)nk_parse_hex(c+2, 2);\n    col.b = (nk_byte)nk_parse_hex(c+4, 2);\n    col.a = (nk_byte)nk_parse_hex(c+6, 2);\n    return col;\n}\n\nNK_API void\nnk_color_hex_rgba(char *output, struct nk_color col)\n{\n    #define NK_TO_HEX(i) ((i) <= 9 ? '0' + (i): 'A' - 10 + (i))\n    output[0] = (char)NK_TO_HEX((col.r & 0xF0) >> 4);\n    output[1] = (char)NK_TO_HEX((col.r & 0x0F));\n    output[2] = (char)NK_TO_HEX((col.g & 0xF0) >> 4);\n    output[3] = (char)NK_TO_HEX((col.g & 0x0F));\n    output[4] = (char)NK_TO_HEX((col.b & 0xF0) >> 4);\n    output[5] = (char)NK_TO_HEX((col.b & 0x0F));\n    output[6] = (char)NK_TO_HEX((col.a & 0xF0) >> 4);\n    output[7] = (char)NK_TO_HEX((col.a & 0x0F));\n    output[8] = '\\0';\n    #undef NK_TO_HEX\n}\n\nNK_API void\nnk_color_hex_rgb(char *output, struct nk_color col)\n{\n    #define NK_TO_HEX(i) ((i) <= 9 ? '0' + (i): 'A' - 10 + (i))\n    output[0] = (char)NK_TO_HEX((col.r & 0xF0) >> 4);\n    output[1] = (char)NK_TO_HEX((col.r & 0x0F));\n    output[2] = (char)NK_TO_HEX((col.g & 0xF0) >> 4);\n    output[3] = (char)NK_TO_HEX((col.g & 0x0F));\n    output[4] = (char)NK_TO_HEX((col.b & 0xF0) >> 4);\n    output[5] = (char)NK_TO_HEX((col.b & 0x0F));\n    output[6] = '\\0';\n    #undef NK_TO_HEX\n}\n\nNK_API struct nk_color\nnk_rgba_iv(const int *c)\n{\n    return nk_rgba(c[0], c[1], c[2], c[3]);\n}\n\nNK_API struct nk_color\nnk_rgba_bv(const nk_byte *c)\n{\n    return nk_rgba(c[0], c[1], c[2], c[3]);\n}\n\nNK_API struct nk_color\nnk_rgb(int r, int g, int b)\n{\n    struct nk_color ret;\n    ret.r = (nk_byte)NK_CLAMP(0, r, 255);\n    ret.g = (nk_byte)NK_CLAMP(0, g, 255);\n    ret.b = (nk_byte)NK_CLAMP(0, b, 255);\n    ret.a = (nk_byte)255;\n    return ret;\n}\n\nNK_API struct nk_color\nnk_rgb_iv(const int *c)\n{\n    return nk_rgb(c[0], c[1], c[2]);\n}\n\nNK_API struct nk_color\nnk_rgb_bv(const nk_byte* c)\n{\n    return nk_rgb(c[0], c[1], c[2]);\n}\n\nNK_API struct nk_color\nnk_rgba_u32(nk_uint in)\n{\n    struct nk_color ret;\n    ret.r = (in & 0xFF);\n    ret.g = ((in >> 8) & 0xFF);\n    ret.b = ((in >> 16) & 0xFF);\n    ret.a = (nk_byte)((in >> 24) & 0xFF);\n    return ret;\n}\n\nNK_API struct nk_color\nnk_rgba_f(float r, float g, float b, float a)\n{\n    struct nk_color ret;\n    ret.r = (nk_byte)(NK_SATURATE(r) * 255.0f);\n    ret.g = (nk_byte)(NK_SATURATE(g) * 255.0f);\n    ret.b = (nk_byte)(NK_SATURATE(b) * 255.0f);\n    ret.a = (nk_byte)(NK_SATURATE(a) * 255.0f);\n    return ret;\n}\n\nNK_API struct nk_color\nnk_rgba_fv(const float *c)\n{\n    return nk_rgba_f(c[0], c[1], c[2], c[3]);\n}\n\nNK_API struct nk_color\nnk_rgb_f(float r, float g, float b)\n{\n    struct nk_color ret;\n    ret.r = (nk_byte)(NK_SATURATE(r) * 255.0f);\n    ret.g = (nk_byte)(NK_SATURATE(g) * 255.0f);\n    ret.b = (nk_byte)(NK_SATURATE(b) * 255.0f);\n    ret.a = 255;\n    return ret;\n}\n\nNK_API struct nk_color\nnk_rgb_fv(const float *c)\n{\n    return nk_rgb_f(c[0], c[1], c[2]);\n}\n\nNK_API struct nk_color\nnk_hsv(int h, int s, int v)\n{\n    return nk_hsva(h, s, v, 255);\n}\n\nNK_API struct nk_color\nnk_hsv_iv(const int *c)\n{\n    return nk_hsv(c[0], c[1], c[2]);\n}\n\nNK_API struct nk_color\nnk_hsv_bv(const nk_byte *c)\n{\n    return nk_hsv(c[0], c[1], c[2]);\n}\n\nNK_API struct nk_color\nnk_hsv_f(float h, float s, float v)\n{\n    return nk_hsva_f(h, s, v, 1.0f);\n}\n\nNK_API struct nk_color\nnk_hsv_fv(const float *c)\n{\n    return nk_hsv_f(c[0], c[1], c[2]);\n}\n\nNK_API struct nk_color\nnk_hsva(int h, int s, int v, int a)\n{\n    float hf = ((float)NK_CLAMP(0, h, 255)) / 255.0f;\n    float sf = ((float)NK_CLAMP(0, s, 255)) / 255.0f;\n    float vf = ((float)NK_CLAMP(0, v, 255)) / 255.0f;\n    float af = ((float)NK_CLAMP(0, a, 255)) / 255.0f;\n    return nk_hsva_f(hf, sf, vf, af);\n}\n\nNK_API struct nk_color\nnk_hsva_iv(const int *c)\n{\n    return nk_hsva(c[0], c[1], c[2], c[3]);\n}\n\nNK_API struct nk_color\nnk_hsva_bv(const nk_byte *c)\n{\n    return nk_hsva(c[0], c[1], c[2], c[3]);\n}\n\nNK_API struct nk_color\nnk_hsva_f(float h, float s, float v, float a)\n{\n    struct nk_colorf out = {0,0,0,0};\n    float p, q, t, f;\n    int i;\n\n    if (s <= 0.0f) {\n        out.r = v; out.g = v; out.b = v;\n        return nk_rgb_f(out.r, out.g, out.b);\n    }\n\n    h = h / (60.0f/360.0f);\n    i = (int)h;\n    f = h - (float)i;\n    p = v * (1.0f - s);\n    q = v * (1.0f - (s * f));\n    t = v * (1.0f - s * (1.0f - f));\n\n    switch (i) {\n    case 0: default: out.r = v; out.g = t; out.b = p; break;\n    case 1: out.r = q; out.g = v; out.b = p; break;\n    case 2: out.r = p; out.g = v; out.b = t; break;\n    case 3: out.r = p; out.g = q; out.b = v; break;\n    case 4: out.r = t; out.g = p; out.b = v; break;\n    case 5: out.r = v; out.g = p; out.b = q; break;\n    }\n    return nk_rgba_f(out.r, out.g, out.b, a);\n}\n\nNK_API struct nk_color\nnk_hsva_fv(const float *c)\n{\n    return nk_hsva_f(c[0], c[1], c[2], c[3]);\n}\n\nNK_API nk_uint\nnk_color_u32(struct nk_color in)\n{\n    nk_uint out = (nk_uint)in.r;\n    out |= ((nk_uint)in.g << 8);\n    out |= ((nk_uint)in.b << 16);\n    out |= ((nk_uint)in.a << 24);\n    return out;\n}\n\nNK_API void\nnk_color_f(float *r, float *g, float *b, float *a, struct nk_color in)\n{\n    NK_STORAGE const float s = 1.0f/255.0f;\n    *r = (float)in.r * s;\n    *g = (float)in.g * s;\n    *b = (float)in.b * s;\n    *a = (float)in.a * s;\n}\n\nNK_API void\nnk_color_fv(float *c, struct nk_color in)\n{\n    nk_color_f(&c[0], &c[1], &c[2], &c[3], in);\n}\n\nNK_API void\nnk_color_d(double *r, double *g, double *b, double *a, struct nk_color in)\n{\n    NK_STORAGE const double s = 1.0/255.0;\n    *r = (double)in.r * s;\n    *g = (double)in.g * s;\n    *b = (double)in.b * s;\n    *a = (double)in.a * s;\n}\n\nNK_API void\nnk_color_dv(double *c, struct nk_color in)\n{\n    nk_color_d(&c[0], &c[1], &c[2], &c[3], in);\n}\n\nNK_API void\nnk_color_hsv_f(float *out_h, float *out_s, float *out_v, struct nk_color in)\n{\n    float a;\n    nk_color_hsva_f(out_h, out_s, out_v, &a, in);\n}\n\nNK_API void\nnk_color_hsv_fv(float *out, struct nk_color in)\n{\n    float a;\n    nk_color_hsva_f(&out[0], &out[1], &out[2], &a, in);\n}\n\nNK_API void\nnk_color_hsva_f(float *out_h, float *out_s,\n    float *out_v, float *out_a, struct nk_color in)\n{\n    float chroma;\n    float K = 0.0f;\n    float r,g,b,a;\n\n    nk_color_f(&r,&g,&b,&a, in);\n    if (g < b) {\n        const float t = g; g = b; b = t;\n        K = -1.f;\n    }\n    if (r < g) {\n        const float t = r; r = g; g = t;\n        K = -2.f/6.0f - K;\n    }\n    chroma = r - ((g < b) ? g: b);\n    *out_h = NK_ABS(K + (g - b)/(6.0f * chroma + 1e-20f));\n    *out_s = chroma / (r + 1e-20f);\n    *out_v = r;\n    *out_a = (float)in.a / 255.0f;\n}\n\nNK_API void\nnk_color_hsva_fv(float *out, struct nk_color in)\n{\n    nk_color_hsva_f(&out[0], &out[1], &out[2], &out[3], in);\n}\n\nNK_API void\nnk_color_hsva_i(int *out_h, int *out_s, int *out_v,\n                int *out_a, struct nk_color in)\n{\n    float h,s,v,a;\n    nk_color_hsva_f(&h, &s, &v, &a, in);\n    *out_h = (nk_byte)(h * 255.0f);\n    *out_s = (nk_byte)(s * 255.0f);\n    *out_v = (nk_byte)(v * 255.0f);\n    *out_a = (nk_byte)(a * 255.0f);\n}\n\nNK_API void\nnk_color_hsva_iv(int *out, struct nk_color in)\n{\n    nk_color_hsva_i(&out[0], &out[1], &out[2], &out[3], in);\n}\n\nNK_API void\nnk_color_hsva_bv(nk_byte *out, struct nk_color in)\n{\n    int tmp[4];\n    nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in);\n    out[0] = (nk_byte)tmp[0];\n    out[1] = (nk_byte)tmp[1];\n    out[2] = (nk_byte)tmp[2];\n    out[3] = (nk_byte)tmp[3];\n}\n\nNK_API void\nnk_color_hsva_b(nk_byte *h, nk_byte *s, nk_byte *v, nk_byte *a, struct nk_color in)\n{\n    int tmp[4];\n    nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in);\n    *h = (nk_byte)tmp[0];\n    *s = (nk_byte)tmp[1];\n    *v = (nk_byte)tmp[2];\n    *a = (nk_byte)tmp[3];\n}\n\nNK_API void\nnk_color_hsv_i(int *out_h, int *out_s, int *out_v, struct nk_color in)\n{\n    int a;\n    nk_color_hsva_i(out_h, out_s, out_v, &a, in);\n}\n\nNK_API void\nnk_color_hsv_b(nk_byte *out_h, nk_byte *out_s, nk_byte *out_v, struct nk_color in)\n{\n    int tmp[4];\n    nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in);\n    *out_h = (nk_byte)tmp[0];\n    *out_s = (nk_byte)tmp[1];\n    *out_v = (nk_byte)tmp[2];\n}\n\nNK_API void\nnk_color_hsv_iv(int *out, struct nk_color in)\n{\n    nk_color_hsv_i(&out[0], &out[1], &out[2], in);\n}\n\nNK_API void\nnk_color_hsv_bv(nk_byte *out, struct nk_color in)\n{\n    int tmp[4];\n    nk_color_hsv_i(&tmp[0], &tmp[1], &tmp[2], in);\n    out[0] = (nk_byte)tmp[0];\n    out[1] = (nk_byte)tmp[1];\n    out[2] = (nk_byte)tmp[2];\n}\n/*\n * ==============================================================\n *\n *                          IMAGE\n *\n * ===============================================================\n */\nNK_API nk_handle\nnk_handle_ptr(void *ptr)\n{\n    nk_handle handle = {0};\n    handle.ptr = ptr;\n    return handle;\n}\n\nNK_API nk_handle\nnk_handle_id(int id)\n{\n    nk_handle handle;\n    nk_zero_struct(handle);\n    handle.id = id;\n    return handle;\n}\n\nNK_API struct nk_image\nnk_subimage_ptr(void *ptr, unsigned short w, unsigned short h, struct nk_rect r)\n{\n    struct nk_image s;\n    nk_zero(&s, sizeof(s));\n    s.handle.ptr = ptr;\n    s.w = w; s.h = h;\n    s.region[0] = (unsigned short)r.x;\n    s.region[1] = (unsigned short)r.y;\n    s.region[2] = (unsigned short)r.w;\n    s.region[3] = (unsigned short)r.h;\n    return s;\n}\n\nNK_API struct nk_image\nnk_subimage_id(int id, unsigned short w, unsigned short h, struct nk_rect r)\n{\n    struct nk_image s;\n    nk_zero(&s, sizeof(s));\n    s.handle.id = id;\n    s.w = w; s.h = h;\n    s.region[0] = (unsigned short)r.x;\n    s.region[1] = (unsigned short)r.y;\n    s.region[2] = (unsigned short)r.w;\n    s.region[3] = (unsigned short)r.h;\n    return s;\n}\n\nNK_API struct nk_image\nnk_subimage_handle(nk_handle handle, unsigned short w, unsigned short h,\n    struct nk_rect r)\n{\n    struct nk_image s;\n    nk_zero(&s, sizeof(s));\n    s.handle = handle;\n    s.w = w; s.h = h;\n    s.region[0] = (unsigned short)r.x;\n    s.region[1] = (unsigned short)r.y;\n    s.region[2] = (unsigned short)r.w;\n    s.region[3] = (unsigned short)r.h;\n    return s;\n}\n\nNK_API struct nk_image\nnk_image_handle(nk_handle handle)\n{\n    struct nk_image s;\n    nk_zero(&s, sizeof(s));\n    s.handle = handle;\n    s.w = 0; s.h = 0;\n    s.region[0] = 0;\n    s.region[1] = 0;\n    s.region[2] = 0;\n    s.region[3] = 0;\n    return s;\n}\n\nNK_API struct nk_image\nnk_image_ptr(void *ptr)\n{\n    struct nk_image s;\n    nk_zero(&s, sizeof(s));\n    NK_ASSERT(ptr);\n    s.handle.ptr = ptr;\n    s.w = 0; s.h = 0;\n    s.region[0] = 0;\n    s.region[1] = 0;\n    s.region[2] = 0;\n    s.region[3] = 0;\n    return s;\n}\n\nNK_API struct nk_image\nnk_image_id(int id)\n{\n    struct nk_image s;\n    nk_zero(&s, sizeof(s));\n    s.handle.id = id;\n    s.w = 0; s.h = 0;\n    s.region[0] = 0;\n    s.region[1] = 0;\n    s.region[2] = 0;\n    s.region[3] = 0;\n    return s;\n}\n\nNK_API int\nnk_image_is_subimage(const struct nk_image* img)\n{\n    NK_ASSERT(img);\n    return !(img->w == 0 && img->h == 0);\n}\n\nNK_INTERN void\nnk_unify(struct nk_rect *clip, const struct nk_rect *a, float x0, float y0,\n    float x1, float y1)\n{\n    NK_ASSERT(a);\n    NK_ASSERT(clip);\n    clip->x = NK_MAX(a->x, x0);\n    clip->y = NK_MAX(a->y, y0);\n    clip->w = NK_MIN(a->x + a->w, x1) - clip->x;\n    clip->h = NK_MIN(a->y + a->h, y1) - clip->y;\n    clip->w = NK_MAX(0, clip->w);\n    clip->h = NK_MAX(0, clip->h);\n}\n\nNK_API void\nnk_triangle_from_direction(struct nk_vec2 *result, struct nk_rect r,\n    float pad_x, float pad_y, enum nk_heading direction)\n{\n    float w_half, h_half;\n    NK_ASSERT(result);\n\n    r.w = NK_MAX(2 * pad_x, r.w);\n    r.h = NK_MAX(2 * pad_y, r.h);\n    r.w = r.w - 2 * pad_x;\n    r.h = r.h - 2 * pad_y;\n\n    r.x = r.x + pad_x;\n    r.y = r.y + pad_y;\n\n    w_half = r.w / 2.0f;\n    h_half = r.h / 2.0f;\n\n    if (direction == NK_UP) {\n        result[0] = nk_vec2(r.x + w_half, r.y);\n        result[1] = nk_vec2(r.x + r.w, r.y + r.h);\n        result[2] = nk_vec2(r.x, r.y + r.h);\n    } else if (direction == NK_RIGHT) {\n        result[0] = nk_vec2(r.x, r.y);\n        result[1] = nk_vec2(r.x + r.w, r.y + h_half);\n        result[2] = nk_vec2(r.x, r.y + r.h);\n    } else if (direction == NK_DOWN) {\n        result[0] = nk_vec2(r.x, r.y);\n        result[1] = nk_vec2(r.x + r.w, r.y);\n        result[2] = nk_vec2(r.x + w_half, r.y + r.h);\n    } else {\n        result[0] = nk_vec2(r.x, r.y + h_half);\n        result[1] = nk_vec2(r.x + r.w, r.y);\n        result[2] = nk_vec2(r.x + r.w, r.y + r.h);\n    }\n}\n\nNK_INTERN int\nnk_text_clamp(const struct nk_user_font *font, const char *text,\n    int text_len, float space, int *glyphs, float *text_width,\n    nk_rune *sep_list, int sep_count)\n{\n    int i = 0;\n    int glyph_len = 0;\n    float last_width = 0;\n    nk_rune unicode = 0;\n    float width = 0;\n    int len = 0;\n    int g = 0;\n    float s;\n\n    int sep_len = 0;\n    int sep_g = 0;\n    float sep_width = 0;\n    sep_count = NK_MAX(sep_count,0);\n\n    glyph_len = nk_utf_decode(text, &unicode, text_len);\n    while (glyph_len && (width < space) && (len < text_len)) {\n        len += glyph_len;\n        s = font->width(font->userdata, font->height, text, len);\n        for (i = 0; i < sep_count; ++i) {\n            if (unicode != sep_list[i]) continue;\n            sep_width = last_width = width;\n            sep_g = g+1;\n            sep_len = len;\n            break;\n        }\n        if (i == sep_count){\n            last_width = sep_width = width;\n            sep_g = g+1;\n        }\n        width = s;\n        glyph_len = nk_utf_decode(&text[len], &unicode, text_len - len);\n        g++;\n    }\n    if (len >= text_len) {\n        *glyphs = g;\n        *text_width = last_width;\n        return len;\n    } else {\n        *glyphs = sep_g;\n        *text_width = sep_width;\n        return (!sep_len) ? len: sep_len;\n    }\n}\n\nenum {NK_DO_NOT_STOP_ON_NEW_LINE, NK_STOP_ON_NEW_LINE};\nNK_INTERN struct nk_vec2\nnk_text_calculate_text_bounds(const struct nk_user_font *font,\n    const char *begin, int byte_len, float row_height, const char **remaining,\n    struct nk_vec2 *out_offset, int *glyphs, int op)\n{\n    float line_height = row_height;\n    struct nk_vec2 text_size = nk_vec2(0,0);\n    float line_width = 0.0f;\n\n    float glyph_width;\n    int glyph_len = 0;\n    nk_rune unicode = 0;\n    int text_len = 0;\n    if (!begin || byte_len <= 0 || !font)\n        return nk_vec2(0,row_height);\n\n    glyph_len = nk_utf_decode(begin, &unicode, byte_len);\n    if (!glyph_len) return text_size;\n    glyph_width = font->width(font->userdata, font->height, begin, glyph_len);\n\n    *glyphs = 0;\n    while ((text_len < byte_len) && glyph_len) {\n        if (unicode == '\\n') {\n            text_size.x = NK_MAX(text_size.x, line_width);\n            text_size.y += line_height;\n            line_width = 0;\n            *glyphs+=1;\n            if (op == NK_STOP_ON_NEW_LINE)\n                break;\n\n            text_len++;\n            glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len);\n            continue;\n        }\n\n        if (unicode == '\\r') {\n            text_len++;\n            *glyphs+=1;\n            glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len);\n            continue;\n        }\n\n        *glyphs = *glyphs + 1;\n        text_len += glyph_len;\n        line_width += (float)glyph_width;\n        glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len);\n        glyph_width = font->width(font->userdata, font->height, begin+text_len, glyph_len);\n        continue;\n    }\n\n    if (text_size.x < line_width)\n        text_size.x = line_width;\n    if (out_offset)\n        *out_offset = nk_vec2(line_width, text_size.y + line_height);\n    if (line_width > 0 || text_size.y == 0.0f)\n        text_size.y += line_height;\n    if (remaining)\n        *remaining = begin+text_len;\n    return text_size;\n}\n\n/* ==============================================================\n *\n *                          UTF-8\n *\n * ===============================================================*/\nNK_GLOBAL const nk_byte nk_utfbyte[NK_UTF_SIZE+1] = {0x80, 0, 0xC0, 0xE0, 0xF0};\nNK_GLOBAL const nk_byte nk_utfmask[NK_UTF_SIZE+1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};\nNK_GLOBAL const nk_uint nk_utfmin[NK_UTF_SIZE+1] = {0, 0, 0x80, 0x800, 0x10000};\nNK_GLOBAL const nk_uint nk_utfmax[NK_UTF_SIZE+1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};\n\nNK_INTERN int\nnk_utf_validate(nk_rune *u, int i)\n{\n    NK_ASSERT(u);\n    if (!u) return 0;\n    if (!NK_BETWEEN(*u, nk_utfmin[i], nk_utfmax[i]) ||\n         NK_BETWEEN(*u, 0xD800, 0xDFFF))\n            *u = NK_UTF_INVALID;\n    for (i = 1; *u > nk_utfmax[i]; ++i);\n    return i;\n}\n\nNK_INTERN nk_rune\nnk_utf_decode_byte(char c, int *i)\n{\n    NK_ASSERT(i);\n    if (!i) return 0;\n    for(*i = 0; *i < (int)NK_LEN(nk_utfmask); ++(*i)) {\n        if (((nk_byte)c & nk_utfmask[*i]) == nk_utfbyte[*i])\n            return (nk_byte)(c & ~nk_utfmask[*i]);\n    }\n    return 0;\n}\n\nNK_API int\nnk_utf_decode(const char *c, nk_rune *u, int clen)\n{\n    int i, j, len, type=0;\n    nk_rune udecoded;\n\n    NK_ASSERT(c);\n    NK_ASSERT(u);\n\n    if (!c || !u) return 0;\n    if (!clen) return 0;\n    *u = NK_UTF_INVALID;\n\n    udecoded = nk_utf_decode_byte(c[0], &len);\n    if (!NK_BETWEEN(len, 1, NK_UTF_SIZE))\n        return 1;\n\n    for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {\n        udecoded = (udecoded << 6) | nk_utf_decode_byte(c[i], &type);\n        if (type != 0)\n            return j;\n    }\n    if (j < len)\n        return 0;\n    *u = udecoded;\n    nk_utf_validate(u, len);\n    return len;\n}\n\nNK_INTERN char\nnk_utf_encode_byte(nk_rune u, int i)\n{\n    return (char)((nk_utfbyte[i]) | ((nk_byte)u & ~nk_utfmask[i]));\n}\n\nNK_API int\nnk_utf_encode(nk_rune u, char *c, int clen)\n{\n    int len, i;\n    len = nk_utf_validate(&u, 0);\n    if (clen < len || !len || len > NK_UTF_SIZE)\n        return 0;\n\n    for (i = len - 1; i != 0; --i) {\n        c[i] = nk_utf_encode_byte(u, 0);\n        u >>= 6;\n    }\n    c[0] = nk_utf_encode_byte(u, len);\n    return len;\n}\n\nNK_API int\nnk_utf_len(const char *str, int len)\n{\n    const char *text;\n    int glyphs = 0;\n    int text_len;\n    int glyph_len;\n    int src_len = 0;\n    nk_rune unicode;\n\n    NK_ASSERT(str);\n    if (!str || !len) return 0;\n\n    text = str;\n    text_len = len;\n    glyph_len = nk_utf_decode(text, &unicode, text_len);\n    while (glyph_len && src_len < len) {\n        glyphs++;\n        src_len = src_len + glyph_len;\n        glyph_len = nk_utf_decode(text + src_len, &unicode, text_len - src_len);\n    }\n    return glyphs;\n}\n\nNK_API const char*\nnk_utf_at(const char *buffer, int length, int index,\n    nk_rune *unicode, int *len)\n{\n    int i = 0;\n    int src_len = 0;\n    int glyph_len = 0;\n    const char *text;\n    int text_len;\n\n    NK_ASSERT(buffer);\n    NK_ASSERT(unicode);\n    NK_ASSERT(len);\n\n    if (!buffer || !unicode || !len) return 0;\n    if (index < 0) {\n        *unicode = NK_UTF_INVALID;\n        *len = 0;\n        return 0;\n    }\n\n    text = buffer;\n    text_len = length;\n    glyph_len = nk_utf_decode(text, unicode, text_len);\n    while (glyph_len) {\n        if (i == index) {\n            *len = glyph_len;\n            break;\n        }\n\n        i++;\n        src_len = src_len + glyph_len;\n        glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len);\n    }\n    if (i != index) return 0;\n    return buffer + src_len;\n}\n\n/* ==============================================================\n *\n *                          BUFFER\n *\n * ===============================================================*/\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_INTERN void* nk_malloc(nk_handle unused, void *old,nk_size size)\n{NK_UNUSED(unused); NK_UNUSED(old); return malloc(size);}\nNK_INTERN void nk_mfree(nk_handle unused, void *ptr)\n{NK_UNUSED(unused); free(ptr);}\n\nNK_API void\nnk_buffer_init_default(struct nk_buffer *buffer)\n{\n    struct nk_allocator alloc;\n    alloc.userdata.ptr = 0;\n    alloc.alloc = nk_malloc;\n    alloc.free = nk_mfree;\n    nk_buffer_init(buffer, &alloc, NK_BUFFER_DEFAULT_INITIAL_SIZE);\n}\n#endif\n\nNK_API void\nnk_buffer_init(struct nk_buffer *b, const struct nk_allocator *a,\n    nk_size initial_size)\n{\n    NK_ASSERT(b);\n    NK_ASSERT(a);\n    NK_ASSERT(initial_size);\n    if (!b || !a || !initial_size) return;\n\n    nk_zero(b, sizeof(*b));\n    b->type = NK_BUFFER_DYNAMIC;\n    b->memory.ptr = a->alloc(a->userdata,0, initial_size);\n    b->memory.size = initial_size;\n    b->size = initial_size;\n    b->grow_factor = 2.0f;\n    b->pool = *a;\n}\n\nNK_API void\nnk_buffer_init_fixed(struct nk_buffer *b, void *m, nk_size size)\n{\n    NK_ASSERT(b);\n    NK_ASSERT(m);\n    NK_ASSERT(size);\n    if (!b || !m || !size) return;\n\n    nk_zero(b, sizeof(*b));\n    b->type = NK_BUFFER_FIXED;\n    b->memory.ptr = m;\n    b->memory.size = size;\n    b->size = size;\n}\n\nNK_INTERN void*\nnk_buffer_align(void *unaligned, nk_size align, nk_size *alignment,\n    enum nk_buffer_allocation_type type)\n{\n    void *memory = 0;\n    switch (type) {\n    default:\n    case NK_BUFFER_MAX:\n    case NK_BUFFER_FRONT:\n        if (align) {\n            memory = NK_ALIGN_PTR(unaligned, align);\n            *alignment = (nk_size)((nk_byte*)memory - (nk_byte*)unaligned);\n        } else {\n            memory = unaligned;\n            *alignment = 0;\n        }\n        break;\n    case NK_BUFFER_BACK:\n        if (align) {\n            memory = NK_ALIGN_PTR_BACK(unaligned, align);\n            *alignment = (nk_size)((nk_byte*)unaligned - (nk_byte*)memory);\n        } else {\n            memory = unaligned;\n            *alignment = 0;\n        }\n        break;\n    }\n    return memory;\n}\n\nNK_INTERN void*\nnk_buffer_realloc(struct nk_buffer *b, nk_size capacity, nk_size *size)\n{\n    void *temp;\n    nk_size buffer_size;\n\n    NK_ASSERT(b);\n    NK_ASSERT(size);\n    if (!b || !size || !b->pool.alloc || !b->pool.free)\n        return 0;\n\n    buffer_size = b->memory.size;\n    temp = b->pool.alloc(b->pool.userdata, b->memory.ptr, capacity);\n    NK_ASSERT(temp);\n    if (!temp) return 0;\n\n    *size = capacity;\n    if (temp != b->memory.ptr) {\n        NK_MEMCPY(temp, b->memory.ptr, buffer_size);\n        b->pool.free(b->pool.userdata, b->memory.ptr);\n    }\n\n    if (b->size == buffer_size) {\n        /* no back buffer so just set correct size */\n        b->size = capacity;\n        return temp;\n    } else {\n        /* copy back buffer to the end of the new buffer */\n        void *dst, *src;\n        nk_size back_size;\n        back_size = buffer_size - b->size;\n        dst = nk_ptr_add(void, temp, capacity - back_size);\n        src = nk_ptr_add(void, temp, b->size);\n        NK_MEMCPY(dst, src, back_size);\n        b->size = capacity - back_size;\n    }\n    return temp;\n}\n\nNK_INTERN void*\nnk_buffer_alloc(struct nk_buffer *b, enum nk_buffer_allocation_type type,\n    nk_size size, nk_size align)\n{\n    int full;\n    nk_size alignment;\n    void *unaligned;\n    void *memory;\n\n    NK_ASSERT(b);\n    NK_ASSERT(size);\n    if (!b || !size) return 0;\n    b->needed += size;\n\n    /* calculate total size with needed alignment + size */\n    if (type == NK_BUFFER_FRONT)\n        unaligned = nk_ptr_add(void, b->memory.ptr, b->allocated);\n    else unaligned = nk_ptr_add(void, b->memory.ptr, b->size - size);\n    memory = nk_buffer_align(unaligned, align, &alignment, type);\n\n    /* check if buffer has enough memory*/\n    if (type == NK_BUFFER_FRONT)\n        full = ((b->allocated + size + alignment) > b->size);\n    else full = ((b->size - NK_MIN(b->size,(size + alignment))) <= b->allocated);\n\n    if (full) {\n        nk_size capacity;\n        if (b->type != NK_BUFFER_DYNAMIC)\n            return 0;\n        NK_ASSERT(b->pool.alloc && b->pool.free);\n        if (b->type != NK_BUFFER_DYNAMIC || !b->pool.alloc || !b->pool.free)\n            return 0;\n\n        /* buffer is full so allocate bigger buffer if dynamic */\n        capacity = (nk_size)((float)b->memory.size * b->grow_factor);\n        capacity = NK_MAX(capacity, nk_round_up_pow2((nk_uint)(b->allocated + size)));\n        b->memory.ptr = nk_buffer_realloc(b, capacity, &b->memory.size);\n        if (!b->memory.ptr) return 0;\n\n        /* align newly allocated pointer */\n        if (type == NK_BUFFER_FRONT)\n            unaligned = nk_ptr_add(void, b->memory.ptr, b->allocated);\n        else unaligned = nk_ptr_add(void, b->memory.ptr, b->size - size);\n        memory = nk_buffer_align(unaligned, align, &alignment, type);\n    }\n    if (type == NK_BUFFER_FRONT)\n        b->allocated += size + alignment;\n    else b->size -= (size + alignment);\n    b->needed += alignment;\n    b->calls++;\n    return memory;\n}\n\nNK_API void\nnk_buffer_push(struct nk_buffer *b, enum nk_buffer_allocation_type type,\n    const void *memory, nk_size size, nk_size align)\n{\n    void *mem = nk_buffer_alloc(b, type, size, align);\n    if (!mem) return;\n    NK_MEMCPY(mem, memory, size);\n}\n\nNK_API void\nnk_buffer_mark(struct nk_buffer *buffer, enum nk_buffer_allocation_type type)\n{\n    NK_ASSERT(buffer);\n    if (!buffer) return;\n    buffer->marker[type].active = nk_true;\n    if (type == NK_BUFFER_BACK)\n        buffer->marker[type].offset = buffer->size;\n    else buffer->marker[type].offset = buffer->allocated;\n}\n\nNK_API void\nnk_buffer_reset(struct nk_buffer *buffer, enum nk_buffer_allocation_type type)\n{\n    NK_ASSERT(buffer);\n    if (!buffer) return;\n    if (type == NK_BUFFER_BACK) {\n        /* reset back buffer either back to marker or empty */\n        buffer->needed -= (buffer->memory.size - buffer->marker[type].offset);\n        if (buffer->marker[type].active)\n            buffer->size = buffer->marker[type].offset;\n        else buffer->size = buffer->memory.size;\n        buffer->marker[type].active = nk_false;\n    } else {\n        /* reset front buffer either back to back marker or empty */\n        buffer->needed -= (buffer->allocated - buffer->marker[type].offset);\n        if (buffer->marker[type].active)\n            buffer->allocated = buffer->marker[type].offset;\n        else buffer->allocated = 0;\n        buffer->marker[type].active = nk_false;\n    }\n}\n\nNK_API void\nnk_buffer_clear(struct nk_buffer *b)\n{\n    NK_ASSERT(b);\n    if (!b) return;\n    b->allocated = 0;\n    b->size = b->memory.size;\n    b->calls = 0;\n    b->needed = 0;\n}\n\nNK_API void\nnk_buffer_free(struct nk_buffer *b)\n{\n    NK_ASSERT(b);\n    if (!b || !b->memory.ptr) return;\n    if (b->type == NK_BUFFER_FIXED) return;\n    if (!b->pool.free) return;\n    NK_ASSERT(b->pool.free);\n    b->pool.free(b->pool.userdata, b->memory.ptr);\n}\n\nNK_API void\nnk_buffer_info(struct nk_memory_status *s, struct nk_buffer *b)\n{\n    NK_ASSERT(b);\n    NK_ASSERT(s);\n    if (!s || !b) return;\n    s->allocated = b->allocated;\n    s->size =  b->memory.size;\n    s->needed = b->needed;\n    s->memory = b->memory.ptr;\n    s->calls = b->calls;\n}\n\nNK_API void*\nnk_buffer_memory(struct nk_buffer *buffer)\n{\n    NK_ASSERT(buffer);\n    if (!buffer) return 0;\n    return buffer->memory.ptr;\n}\n\nNK_API const void*\nnk_buffer_memory_const(const struct nk_buffer *buffer)\n{\n    NK_ASSERT(buffer);\n    if (!buffer) return 0;\n    return buffer->memory.ptr;\n}\n\nNK_API nk_size\nnk_buffer_total(struct nk_buffer *buffer)\n{\n    NK_ASSERT(buffer);\n    if (!buffer) return 0;\n    return buffer->memory.size;\n}\n\n/*\n * ==============================================================\n *\n *                          STRING\n *\n * ===============================================================\n */\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_API void\nnk_str_init_default(struct nk_str *str)\n{\n    struct nk_allocator alloc;\n    alloc.userdata.ptr = 0;\n    alloc.alloc = nk_malloc;\n    alloc.free = nk_mfree;\n    nk_buffer_init(&str->buffer, &alloc, 32);\n    str->len = 0;\n}\n#endif\n\nNK_API void\nnk_str_init(struct nk_str *str, const struct nk_allocator *alloc, nk_size size)\n{\n    nk_buffer_init(&str->buffer, alloc, size);\n    str->len = 0;\n}\n\nNK_API void\nnk_str_init_fixed(struct nk_str *str, void *memory, nk_size size)\n{\n    nk_buffer_init_fixed(&str->buffer, memory, size);\n    str->len = 0;\n}\n\nNK_API int\nnk_str_append_text_char(struct nk_str *s, const char *str, int len)\n{\n    char *mem;\n    NK_ASSERT(s);\n    NK_ASSERT(str);\n    if (!s || !str || !len) return 0;\n    mem = (char*)nk_buffer_alloc(&s->buffer, NK_BUFFER_FRONT, (nk_size)len * sizeof(char), 0);\n    if (!mem) return 0;\n    NK_MEMCPY(mem, str, (nk_size)len * sizeof(char));\n    s->len += nk_utf_len(str, len);\n    return len;\n}\n\nNK_API int\nnk_str_append_str_char(struct nk_str *s, const char *str)\n{\n    return nk_str_append_text_char(s, str, nk_strlen(str));\n}\n\nNK_API int\nnk_str_append_text_utf8(struct nk_str *str, const char *text, int len)\n{\n    int i = 0;\n    int byte_len = 0;\n    nk_rune unicode;\n    if (!str || !text || !len) return 0;\n    for (i = 0; i < len; ++i)\n        byte_len += nk_utf_decode(text+byte_len, &unicode, 4);\n    nk_str_append_text_char(str, text, byte_len);\n    return len;\n}\n\nNK_API int\nnk_str_append_str_utf8(struct nk_str *str, const char *text)\n{\n    int runes = 0;\n    int byte_len = 0;\n    int num_runes = 0;\n    int glyph_len = 0;\n    nk_rune unicode;\n    if (!str || !text) return 0;\n\n    glyph_len = byte_len = nk_utf_decode(text+byte_len, &unicode, 4);\n    while (unicode != '\\0' && glyph_len) {\n        glyph_len = nk_utf_decode(text+byte_len, &unicode, 4);\n        byte_len += glyph_len;\n        num_runes++;\n    }\n    nk_str_append_text_char(str, text, byte_len);\n    return runes;\n}\n\nNK_API int\nnk_str_append_text_runes(struct nk_str *str, const nk_rune *text, int len)\n{\n    int i = 0;\n    int byte_len = 0;\n    nk_glyph glyph;\n\n    NK_ASSERT(str);\n    if (!str || !text || !len) return 0;\n    for (i = 0; i < len; ++i) {\n        byte_len = nk_utf_encode(text[i], glyph, NK_UTF_SIZE);\n        if (!byte_len) break;\n        nk_str_append_text_char(str, glyph, byte_len);\n    }\n    return len;\n}\n\nNK_API int\nnk_str_append_str_runes(struct nk_str *str, const nk_rune *runes)\n{\n    int i = 0;\n    nk_glyph glyph;\n    int byte_len;\n    NK_ASSERT(str);\n    if (!str || !runes) return 0;\n    while (runes[i] != '\\0') {\n        byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE);\n        nk_str_append_text_char(str, glyph, byte_len);\n        i++;\n    }\n    return i;\n}\n\nNK_API int\nnk_str_insert_at_char(struct nk_str *s, int pos, const char *str, int len)\n{\n    int i;\n    void *mem;\n    char *src;\n    char *dst;\n\n    int copylen;\n    NK_ASSERT(s);\n    NK_ASSERT(str);\n    NK_ASSERT(len >= 0);\n    if (!s || !str || !len || (nk_size)pos > s->buffer.allocated) return 0;\n    if ((s->buffer.allocated + (nk_size)len >= s->buffer.memory.size) &&\n        (s->buffer.type == NK_BUFFER_FIXED)) return 0;\n\n    copylen = (int)s->buffer.allocated - pos;\n    if (!copylen) {\n        nk_str_append_text_char(s, str, len);\n        return 1;\n    }\n    mem = nk_buffer_alloc(&s->buffer, NK_BUFFER_FRONT, (nk_size)len * sizeof(char), 0);\n    if (!mem) return 0;\n\n    /* memmove */\n    NK_ASSERT(((int)pos + (int)len + ((int)copylen - 1)) >= 0);\n    NK_ASSERT(((int)pos + ((int)copylen - 1)) >= 0);\n    dst = nk_ptr_add(char, s->buffer.memory.ptr, pos + len + (copylen - 1));\n    src = nk_ptr_add(char, s->buffer.memory.ptr, pos + (copylen-1));\n    for (i = 0; i < copylen; ++i) *dst-- = *src--;\n    mem = nk_ptr_add(void, s->buffer.memory.ptr, pos);\n    NK_MEMCPY(mem, str, (nk_size)len * sizeof(char));\n    s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated);\n    return 1;\n}\n\nNK_API int\nnk_str_insert_at_rune(struct nk_str *str, int pos, const char *cstr, int len)\n{\n    int glyph_len;\n    nk_rune unicode;\n    const char *begin;\n    const char *buffer;\n\n    NK_ASSERT(str);\n    NK_ASSERT(cstr);\n    NK_ASSERT(len);\n    if (!str || !cstr || !len) return 0;\n    begin = nk_str_at_rune(str, pos, &unicode, &glyph_len);\n    if (!str->len)\n        return nk_str_append_text_char(str, cstr, len);\n    buffer = nk_str_get_const(str);\n    if (!begin) return 0;\n    return nk_str_insert_at_char(str, (int)(begin - buffer), cstr, len);\n}\n\nNK_API int\nnk_str_insert_text_char(struct nk_str *str, int pos, const char *text, int len)\n{\n    return nk_str_insert_text_utf8(str, pos, text, len);\n}\n\nNK_API int\nnk_str_insert_str_char(struct nk_str *str, int pos, const char *text)\n{\n    return nk_str_insert_text_utf8(str, pos, text, nk_strlen(text));\n}\n\nNK_API int\nnk_str_insert_text_utf8(struct nk_str *str, int pos, const char *text, int len)\n{\n    int i = 0;\n    int byte_len = 0;\n    nk_rune unicode;\n\n    NK_ASSERT(str);\n    NK_ASSERT(text);\n    if (!str || !text || !len) return 0;\n    for (i = 0; i < len; ++i)\n        byte_len += nk_utf_decode(text+byte_len, &unicode, 4);\n    nk_str_insert_at_rune(str, pos, text, byte_len);\n    return len;\n}\n\nNK_API int\nnk_str_insert_str_utf8(struct nk_str *str, int pos, const char *text)\n{\n    int runes = 0;\n    int byte_len = 0;\n    int num_runes = 0;\n    int glyph_len = 0;\n    nk_rune unicode;\n    if (!str || !text) return 0;\n\n    glyph_len = byte_len = nk_utf_decode(text+byte_len, &unicode, 4);\n    while (unicode != '\\0' && glyph_len) {\n        glyph_len = nk_utf_decode(text+byte_len, &unicode, 4);\n        byte_len += glyph_len;\n        num_runes++;\n    }\n    nk_str_insert_at_rune(str, pos, text, byte_len);\n    return runes;\n}\n\nNK_API int\nnk_str_insert_text_runes(struct nk_str *str, int pos, const nk_rune *runes, int len)\n{\n    int i = 0;\n    int byte_len = 0;\n    nk_glyph glyph;\n\n    NK_ASSERT(str);\n    if (!str || !runes || !len) return 0;\n    for (i = 0; i < len; ++i) {\n        byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE);\n        if (!byte_len) break;\n        nk_str_insert_at_rune(str, pos+i, glyph, byte_len);\n    }\n    return len;\n}\n\nNK_API int\nnk_str_insert_str_runes(struct nk_str *str, int pos, const nk_rune *runes)\n{\n    int i = 0;\n    nk_glyph glyph;\n    int byte_len;\n    NK_ASSERT(str);\n    if (!str || !runes) return 0;\n    while (runes[i] != '\\0') {\n        byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE);\n        nk_str_insert_at_rune(str, pos+i, glyph, byte_len);\n        i++;\n    }\n    return i;\n}\n\nNK_API void\nnk_str_remove_chars(struct nk_str *s, int len)\n{\n    NK_ASSERT(s);\n    NK_ASSERT(len >= 0);\n    if (!s || len < 0 || (nk_size)len > s->buffer.allocated) return;\n    NK_ASSERT(((int)s->buffer.allocated - (int)len) >= 0);\n    s->buffer.allocated -= (nk_size)len;\n    s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated);\n}\n\nNK_API void\nnk_str_remove_runes(struct nk_str *str, int len)\n{\n    int index;\n    const char *begin;\n    const char *end;\n    nk_rune unicode;\n\n    NK_ASSERT(str);\n    NK_ASSERT(len >= 0);\n    if (!str || len < 0) return;\n    if (len >= str->len) {\n        str->len = 0;\n        return;\n    }\n\n    index = str->len - len;\n    begin = nk_str_at_rune(str, index, &unicode, &len);\n    end = (const char*)str->buffer.memory.ptr + str->buffer.allocated;\n    nk_str_remove_chars(str, (int)(end-begin)+1);\n}\n\nNK_API void\nnk_str_delete_chars(struct nk_str *s, int pos, int len)\n{\n    NK_ASSERT(s);\n    if (!s || !len || (nk_size)pos > s->buffer.allocated ||\n        (nk_size)(pos + len) > s->buffer.allocated) return;\n\n    if ((nk_size)(pos + len) < s->buffer.allocated) {\n        /* memmove */\n        char *dst = nk_ptr_add(char, s->buffer.memory.ptr, pos);\n        char *src = nk_ptr_add(char, s->buffer.memory.ptr, pos + len);\n        NK_MEMCPY(dst, src, s->buffer.allocated - (nk_size)(pos + len));\n        NK_ASSERT(((int)s->buffer.allocated - (int)len) >= 0);\n        s->buffer.allocated -= (nk_size)len;\n    } else nk_str_remove_chars(s, len);\n    s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated);\n}\n\nNK_API void\nnk_str_delete_runes(struct nk_str *s, int pos, int len)\n{\n    char *temp;\n    nk_rune unicode;\n    char *begin;\n    char *end;\n    int unused;\n\n    NK_ASSERT(s);\n    NK_ASSERT(s->len >= pos + len);\n    if (s->len < pos + len)\n        len = NK_CLAMP(0, (s->len - pos), s->len);\n    if (!len) return;\n\n    temp = (char *)s->buffer.memory.ptr;\n    begin = nk_str_at_rune(s, pos, &unicode, &unused);\n    if (!begin) return;\n    s->buffer.memory.ptr = begin;\n    end = nk_str_at_rune(s, len, &unicode, &unused);\n    s->buffer.memory.ptr = temp;\n    if (!end) return;\n    nk_str_delete_chars(s, (int)(begin - temp), (int)(end - begin));\n}\n\nNK_API char*\nnk_str_at_char(struct nk_str *s, int pos)\n{\n    NK_ASSERT(s);\n    if (!s || pos > (int)s->buffer.allocated) return 0;\n    return nk_ptr_add(char, s->buffer.memory.ptr, pos);\n}\n\nNK_API char*\nnk_str_at_rune(struct nk_str *str, int pos, nk_rune *unicode, int *len)\n{\n    int i = 0;\n    int src_len = 0;\n    int glyph_len = 0;\n    char *text;\n    int text_len;\n\n    NK_ASSERT(str);\n    NK_ASSERT(unicode);\n    NK_ASSERT(len);\n\n    if (!str || !unicode || !len) return 0;\n    if (pos < 0) {\n        *unicode = 0;\n        *len = 0;\n        return 0;\n    }\n\n    text = (char*)str->buffer.memory.ptr;\n    text_len = (int)str->buffer.allocated;\n    glyph_len = nk_utf_decode(text, unicode, text_len);\n    while (glyph_len) {\n        if (i == pos) {\n            *len = glyph_len;\n            break;\n        }\n\n        i++;\n        src_len = src_len + glyph_len;\n        glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len);\n    }\n    if (i != pos) return 0;\n    return text + src_len;\n}\n\nNK_API const char*\nnk_str_at_char_const(const struct nk_str *s, int pos)\n{\n    NK_ASSERT(s);\n    if (!s || pos > (int)s->buffer.allocated) return 0;\n    return nk_ptr_add(char, s->buffer.memory.ptr, pos);\n}\n\nNK_API const char*\nnk_str_at_const(const struct nk_str *str, int pos, nk_rune *unicode, int *len)\n{\n    int i = 0;\n    int src_len = 0;\n    int glyph_len = 0;\n    char *text;\n    int text_len;\n\n    NK_ASSERT(str);\n    NK_ASSERT(unicode);\n    NK_ASSERT(len);\n\n    if (!str || !unicode || !len) return 0;\n    if (pos < 0) {\n        *unicode = 0;\n        *len = 0;\n        return 0;\n    }\n\n    text = (char*)str->buffer.memory.ptr;\n    text_len = (int)str->buffer.allocated;\n    glyph_len = nk_utf_decode(text, unicode, text_len);\n    while (glyph_len) {\n        if (i == pos) {\n            *len = glyph_len;\n            break;\n        }\n\n        i++;\n        src_len = src_len + glyph_len;\n        glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len);\n    }\n    if (i != pos) return 0;\n    return text + src_len;\n}\n\nNK_API nk_rune\nnk_str_rune_at(const struct nk_str *str, int pos)\n{\n    int len;\n    nk_rune unicode = 0;\n    nk_str_at_const(str, pos, &unicode, &len);\n    return unicode;\n}\n\nNK_API char*\nnk_str_get(struct nk_str *s)\n{\n    NK_ASSERT(s);\n    if (!s || !s->len || !s->buffer.allocated) return 0;\n    return (char*)s->buffer.memory.ptr;\n}\n\nNK_API const char*\nnk_str_get_const(const struct nk_str *s)\n{\n    NK_ASSERT(s);\n    if (!s || !s->len || !s->buffer.allocated) return 0;\n    return (const char*)s->buffer.memory.ptr;\n}\n\nNK_API int\nnk_str_len(struct nk_str *s)\n{\n    NK_ASSERT(s);\n    if (!s || !s->len || !s->buffer.allocated) return 0;\n    return s->len;\n}\n\nNK_API int\nnk_str_len_char(struct nk_str *s)\n{\n    NK_ASSERT(s);\n    if (!s || !s->len || !s->buffer.allocated) return 0;\n    return (int)s->buffer.allocated;\n}\n\nNK_API void\nnk_str_clear(struct nk_str *str)\n{\n    NK_ASSERT(str);\n    nk_buffer_clear(&str->buffer);\n    str->len = 0;\n}\n\nNK_API void\nnk_str_free(struct nk_str *str)\n{\n    NK_ASSERT(str);\n    nk_buffer_free(&str->buffer);\n    str->len = 0;\n}\n\n/*\n * ==============================================================\n *\n *                      Command buffer\n *\n * ===============================================================\n*/\nNK_INTERN void\nnk_command_buffer_init(struct nk_command_buffer *cmdbuf,\n    struct nk_buffer *buffer, enum nk_command_clipping clip)\n{\n    NK_ASSERT(cmdbuf);\n    NK_ASSERT(buffer);\n    if (!cmdbuf || !buffer) return;\n    cmdbuf->base = buffer;\n    cmdbuf->use_clipping = clip;\n    cmdbuf->begin = buffer->allocated;\n    cmdbuf->end = buffer->allocated;\n    cmdbuf->last = buffer->allocated;\n}\n\nNK_INTERN void\nnk_command_buffer_reset(struct nk_command_buffer *buffer)\n{\n    NK_ASSERT(buffer);\n    if (!buffer) return;\n    buffer->begin = 0;\n    buffer->end = 0;\n    buffer->last = 0;\n    buffer->clip = nk_null_rect;\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    buffer->userdata.ptr = 0;\n#endif\n}\n\nNK_INTERN void*\nnk_command_buffer_push(struct nk_command_buffer* b,\n    enum nk_command_type t, nk_size size)\n{\n    NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_command);\n    struct nk_command *cmd;\n    nk_size alignment;\n    void *unaligned;\n    void *memory;\n\n    NK_ASSERT(b);\n    NK_ASSERT(b->base);\n    if (!b) return 0;\n    cmd = (struct nk_command*)nk_buffer_alloc(b->base,NK_BUFFER_FRONT,size,align);\n    if (!cmd) return 0;\n\n    /* make sure the offset to the next command is aligned */\n    b->last = (nk_size)((nk_byte*)cmd - (nk_byte*)b->base->memory.ptr);\n    unaligned = (nk_byte*)cmd + size;\n    memory = NK_ALIGN_PTR(unaligned, align);\n    alignment = (nk_size)((nk_byte*)memory - (nk_byte*)unaligned);\n#ifdef NK_ZERO_COMMAND_MEMORY\n    NK_MEMSET(cmd, 0, size + alignment);\n#endif\n\n    cmd->type = t;\n    cmd->next = b->base->allocated + alignment;\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    cmd->userdata = b->userdata;\n#endif\n    b->end = cmd->next;\n    return cmd;\n}\n\nNK_API void\nnk_push_scissor(struct nk_command_buffer *b, struct nk_rect r)\n{\n    struct nk_command_scissor *cmd;\n    NK_ASSERT(b);\n    if (!b) return;\n\n    b->clip.x = r.x;\n    b->clip.y = r.y;\n    b->clip.w = r.w;\n    b->clip.h = r.h;\n    cmd = (struct nk_command_scissor*)\n        nk_command_buffer_push(b, NK_COMMAND_SCISSOR, sizeof(*cmd));\n\n    if (!cmd) return;\n    cmd->x = (short)r.x;\n    cmd->y = (short)r.y;\n    cmd->w = (unsigned short)NK_MAX(0, r.w);\n    cmd->h = (unsigned short)NK_MAX(0, r.h);\n}\n\nNK_API void\nnk_stroke_line(struct nk_command_buffer *b, float x0, float y0,\n    float x1, float y1, float line_thickness, struct nk_color c)\n{\n    struct nk_command_line *cmd;\n    NK_ASSERT(b);\n    if (!b || line_thickness <= 0) return;\n    cmd = (struct nk_command_line*)\n        nk_command_buffer_push(b, NK_COMMAND_LINE, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->line_thickness = (unsigned short)line_thickness;\n    cmd->begin.x = (short)x0;\n    cmd->begin.y = (short)y0;\n    cmd->end.x = (short)x1;\n    cmd->end.y = (short)y1;\n    cmd->color = c;\n}\n\nNK_API void\nnk_stroke_curve(struct nk_command_buffer *b, float ax, float ay,\n    float ctrl0x, float ctrl0y, float ctrl1x, float ctrl1y,\n    float bx, float by, float line_thickness, struct nk_color col)\n{\n    struct nk_command_curve *cmd;\n    NK_ASSERT(b);\n    if (!b || col.a == 0 || line_thickness <= 0) return;\n\n    cmd = (struct nk_command_curve*)\n        nk_command_buffer_push(b, NK_COMMAND_CURVE, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->line_thickness = (unsigned short)line_thickness;\n    cmd->begin.x = (short)ax;\n    cmd->begin.y = (short)ay;\n    cmd->ctrl[0].x = (short)ctrl0x;\n    cmd->ctrl[0].y = (short)ctrl0y;\n    cmd->ctrl[1].x = (short)ctrl1x;\n    cmd->ctrl[1].y = (short)ctrl1y;\n    cmd->end.x = (short)bx;\n    cmd->end.y = (short)by;\n    cmd->color = col;\n}\n\nNK_API void\nnk_stroke_rect(struct nk_command_buffer *b, struct nk_rect rect,\n    float rounding, float line_thickness, struct nk_color c)\n{\n    struct nk_command_rect *cmd;\n    NK_ASSERT(b);\n    if (!b || c.a == 0 || rect.w == 0 || rect.h == 0 || line_thickness <= 0) return;\n    if (b->use_clipping) {\n        const struct nk_rect *clip = &b->clip;\n        if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h,\n            clip->x, clip->y, clip->w, clip->h)) return;\n    }\n    cmd = (struct nk_command_rect*)\n        nk_command_buffer_push(b, NK_COMMAND_RECT, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->rounding = (unsigned short)rounding;\n    cmd->line_thickness = (unsigned short)line_thickness;\n    cmd->x = (short)rect.x;\n    cmd->y = (short)rect.y;\n    cmd->w = (unsigned short)NK_MAX(0, rect.w);\n    cmd->h = (unsigned short)NK_MAX(0, rect.h);\n    cmd->color = c;\n}\n\nNK_API void\nnk_fill_rect(struct nk_command_buffer *b, struct nk_rect rect,\n    float rounding, struct nk_color c)\n{\n    struct nk_command_rect_filled *cmd;\n    NK_ASSERT(b);\n    if (!b || c.a == 0 || rect.w == 0 || rect.h == 0) return;\n    if (b->use_clipping) {\n        const struct nk_rect *clip = &b->clip;\n        if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h,\n            clip->x, clip->y, clip->w, clip->h)) return;\n    }\n\n    cmd = (struct nk_command_rect_filled*)\n        nk_command_buffer_push(b, NK_COMMAND_RECT_FILLED, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->rounding = (unsigned short)rounding;\n    cmd->x = (short)rect.x;\n    cmd->y = (short)rect.y;\n    cmd->w = (unsigned short)NK_MAX(0, rect.w);\n    cmd->h = (unsigned short)NK_MAX(0, rect.h);\n    cmd->color = c;\n}\n\nNK_API void\nnk_fill_rect_multi_color(struct nk_command_buffer *b, struct nk_rect rect,\n    struct nk_color left, struct nk_color top, struct nk_color right,\n    struct nk_color bottom)\n{\n    struct nk_command_rect_multi_color *cmd;\n    NK_ASSERT(b);\n    if (!b || rect.w == 0 || rect.h == 0) return;\n    if (b->use_clipping) {\n        const struct nk_rect *clip = &b->clip;\n        if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h,\n            clip->x, clip->y, clip->w, clip->h)) return;\n    }\n\n    cmd = (struct nk_command_rect_multi_color*)\n        nk_command_buffer_push(b, NK_COMMAND_RECT_MULTI_COLOR, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->x = (short)rect.x;\n    cmd->y = (short)rect.y;\n    cmd->w = (unsigned short)NK_MAX(0, rect.w);\n    cmd->h = (unsigned short)NK_MAX(0, rect.h);\n    cmd->left = left;\n    cmd->top = top;\n    cmd->right = right;\n    cmd->bottom = bottom;\n}\n\nNK_API void\nnk_stroke_circle(struct nk_command_buffer *b, struct nk_rect r,\n    float line_thickness, struct nk_color c)\n{\n    struct nk_command_circle *cmd;\n    if (!b || r.w == 0 || r.h == 0 || line_thickness <= 0) return;\n    if (b->use_clipping) {\n        const struct nk_rect *clip = &b->clip;\n        if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h))\n            return;\n    }\n\n    cmd = (struct nk_command_circle*)\n        nk_command_buffer_push(b, NK_COMMAND_CIRCLE, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->line_thickness = (unsigned short)line_thickness;\n    cmd->x = (short)r.x;\n    cmd->y = (short)r.y;\n    cmd->w = (unsigned short)NK_MAX(r.w, 0);\n    cmd->h = (unsigned short)NK_MAX(r.h, 0);\n    cmd->color = c;\n}\n\nNK_API void\nnk_fill_circle(struct nk_command_buffer *b, struct nk_rect r, struct nk_color c)\n{\n    struct nk_command_circle_filled *cmd;\n    NK_ASSERT(b);\n    if (!b || c.a == 0 || r.w == 0 || r.h == 0) return;\n    if (b->use_clipping) {\n        const struct nk_rect *clip = &b->clip;\n        if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h))\n            return;\n    }\n\n    cmd = (struct nk_command_circle_filled*)\n        nk_command_buffer_push(b, NK_COMMAND_CIRCLE_FILLED, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->x = (short)r.x;\n    cmd->y = (short)r.y;\n    cmd->w = (unsigned short)NK_MAX(r.w, 0);\n    cmd->h = (unsigned short)NK_MAX(r.h, 0);\n    cmd->color = c;\n}\n\nNK_API void\nnk_stroke_arc(struct nk_command_buffer *b, float cx, float cy, float radius,\n    float a_min, float a_max, float line_thickness, struct nk_color c)\n{\n    struct nk_command_arc *cmd;\n    if (!b || c.a == 0 || line_thickness <= 0) return;\n    cmd = (struct nk_command_arc*)\n        nk_command_buffer_push(b, NK_COMMAND_ARC, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->line_thickness = (unsigned short)line_thickness;\n    cmd->cx = (short)cx;\n    cmd->cy = (short)cy;\n    cmd->r = (unsigned short)radius;\n    cmd->a[0] = a_min;\n    cmd->a[1] = a_max;\n    cmd->color = c;\n}\n\nNK_API void\nnk_fill_arc(struct nk_command_buffer *b, float cx, float cy, float radius,\n    float a_min, float a_max, struct nk_color c)\n{\n    struct nk_command_arc_filled *cmd;\n    NK_ASSERT(b);\n    if (!b || c.a == 0) return;\n    cmd = (struct nk_command_arc_filled*)\n        nk_command_buffer_push(b, NK_COMMAND_ARC_FILLED, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->cx = (short)cx;\n    cmd->cy = (short)cy;\n    cmd->r = (unsigned short)radius;\n    cmd->a[0] = a_min;\n    cmd->a[1] = a_max;\n    cmd->color = c;\n}\n\nNK_API void\nnk_stroke_triangle(struct nk_command_buffer *b, float x0, float y0, float x1,\n    float y1, float x2, float y2, float line_thickness, struct nk_color c)\n{\n    struct nk_command_triangle *cmd;\n    NK_ASSERT(b);\n    if (!b || c.a == 0 || line_thickness <= 0) return;\n    if (b->use_clipping) {\n        const struct nk_rect *clip = &b->clip;\n        if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) &&\n            !NK_INBOX(x1, y1, clip->x, clip->y, clip->w, clip->h) &&\n            !NK_INBOX(x2, y2, clip->x, clip->y, clip->w, clip->h))\n            return;\n    }\n\n    cmd = (struct nk_command_triangle*)\n        nk_command_buffer_push(b, NK_COMMAND_TRIANGLE, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->line_thickness = (unsigned short)line_thickness;\n    cmd->a.x = (short)x0;\n    cmd->a.y = (short)y0;\n    cmd->b.x = (short)x1;\n    cmd->b.y = (short)y1;\n    cmd->c.x = (short)x2;\n    cmd->c.y = (short)y2;\n    cmd->color = c;\n}\n\nNK_API void\nnk_fill_triangle(struct nk_command_buffer *b, float x0, float y0, float x1,\n    float y1, float x2, float y2, struct nk_color c)\n{\n    struct nk_command_triangle_filled *cmd;\n    NK_ASSERT(b);\n    if (!b || c.a == 0) return;\n    if (!b) return;\n    if (b->use_clipping) {\n        const struct nk_rect *clip = &b->clip;\n        if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) &&\n            !NK_INBOX(x1, y1, clip->x, clip->y, clip->w, clip->h) &&\n            !NK_INBOX(x2, y2, clip->x, clip->y, clip->w, clip->h))\n            return;\n    }\n\n    cmd = (struct nk_command_triangle_filled*)\n        nk_command_buffer_push(b, NK_COMMAND_TRIANGLE_FILLED, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->a.x = (short)x0;\n    cmd->a.y = (short)y0;\n    cmd->b.x = (short)x1;\n    cmd->b.y = (short)y1;\n    cmd->c.x = (short)x2;\n    cmd->c.y = (short)y2;\n    cmd->color = c;\n}\n\nNK_API void\nnk_stroke_polygon(struct nk_command_buffer *b,  float *points, int point_count,\n    float line_thickness, struct nk_color col)\n{\n    int i;\n    nk_size size = 0;\n    struct nk_command_polygon *cmd;\n\n    NK_ASSERT(b);\n    if (!b || col.a == 0 || line_thickness <= 0) return;\n    size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count;\n    cmd = (struct nk_command_polygon*) nk_command_buffer_push(b, NK_COMMAND_POLYGON, size);\n    if (!cmd) return;\n    cmd->color = col;\n    cmd->line_thickness = (unsigned short)line_thickness;\n    cmd->point_count = (unsigned short)point_count;\n    for (i = 0; i < point_count; ++i) {\n        cmd->points[i].x = (short)points[i*2];\n        cmd->points[i].y = (short)points[i*2+1];\n    }\n}\n\nNK_API void\nnk_fill_polygon(struct nk_command_buffer *b, float *points, int point_count,\n    struct nk_color col)\n{\n    int i;\n    nk_size size = 0;\n    struct nk_command_polygon_filled *cmd;\n\n    NK_ASSERT(b);\n    if (!b || col.a == 0) return;\n    size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count;\n    cmd = (struct nk_command_polygon_filled*)\n        nk_command_buffer_push(b, NK_COMMAND_POLYGON_FILLED, size);\n    if (!cmd) return;\n    cmd->color = col;\n    cmd->point_count = (unsigned short)point_count;\n    for (i = 0; i < point_count; ++i) {\n        cmd->points[i].x = (short)points[i*2+0];\n        cmd->points[i].y = (short)points[i*2+1];\n    }\n}\n\nNK_API void\nnk_stroke_polyline(struct nk_command_buffer *b, float *points, int point_count,\n    float line_thickness, struct nk_color col)\n{\n    int i;\n    nk_size size = 0;\n    struct nk_command_polyline *cmd;\n\n    NK_ASSERT(b);\n    if (!b || col.a == 0 || line_thickness <= 0) return;\n    size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count;\n    cmd = (struct nk_command_polyline*) nk_command_buffer_push(b, NK_COMMAND_POLYLINE, size);\n    if (!cmd) return;\n    cmd->color = col;\n    cmd->point_count = (unsigned short)point_count;\n    cmd->line_thickness = (unsigned short)line_thickness;\n    for (i = 0; i < point_count; ++i) {\n        cmd->points[i].x = (short)points[i*2];\n        cmd->points[i].y = (short)points[i*2+1];\n    }\n}\n\nNK_API void\nnk_draw_image(struct nk_command_buffer *b, struct nk_rect r,\n    const struct nk_image *img, struct nk_color col)\n{\n    struct nk_command_image *cmd;\n    NK_ASSERT(b);\n    if (!b) return;\n    if (b->use_clipping) {\n        const struct nk_rect *c = &b->clip;\n        if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h))\n            return;\n    }\n\n    cmd = (struct nk_command_image*)\n        nk_command_buffer_push(b, NK_COMMAND_IMAGE, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->x = (short)r.x;\n    cmd->y = (short)r.y;\n    cmd->w = (unsigned short)NK_MAX(0, r.w);\n    cmd->h = (unsigned short)NK_MAX(0, r.h);\n    cmd->img = *img;\n    cmd->col = col;\n}\n\nNK_API void\nnk_push_custom(struct nk_command_buffer *b, struct nk_rect r,\n    nk_command_custom_callback cb, nk_handle usr)\n{\n    struct nk_command_custom *cmd;\n    NK_ASSERT(b);\n    if (!b) return;\n    if (b->use_clipping) {\n        const struct nk_rect *c = &b->clip;\n        if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h))\n            return;\n    }\n\n    cmd = (struct nk_command_custom*)\n        nk_command_buffer_push(b, NK_COMMAND_CUSTOM, sizeof(*cmd));\n    if (!cmd) return;\n    cmd->x = (short)r.x;\n    cmd->y = (short)r.y;\n    cmd->w = (unsigned short)NK_MAX(0, r.w);\n    cmd->h = (unsigned short)NK_MAX(0, r.h);\n    cmd->callback_data = usr;\n    cmd->callback = cb;\n}\n\nNK_API void\nnk_draw_text(struct nk_command_buffer *b, struct nk_rect r,\n    const char *string, int length, const struct nk_user_font *font,\n    struct nk_color bg, struct nk_color fg)\n{\n    float text_width = 0;\n    struct nk_command_text *cmd;\n\n    NK_ASSERT(b);\n    NK_ASSERT(font);\n    if (!b || !string || !length || (bg.a == 0 && fg.a == 0)) return;\n    if (b->use_clipping) {\n        const struct nk_rect *c = &b->clip;\n        if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h))\n            return;\n    }\n\n    /* make sure text fits inside bounds */\n    text_width = font->width(font->userdata, font->height, string, length);\n    if (text_width > r.w){\n        int glyphs = 0;\n        float txt_width = (float)text_width;\n        length = nk_text_clamp(font, string, length, r.w, &glyphs, &txt_width, 0,0);\n    }\n\n    if (!length) return;\n    cmd = (struct nk_command_text*)\n        nk_command_buffer_push(b, NK_COMMAND_TEXT, sizeof(*cmd) + (nk_size)(length + 1));\n    if (!cmd) return;\n    cmd->x = (short)r.x;\n    cmd->y = (short)r.y;\n    cmd->w = (unsigned short)r.w;\n    cmd->h = (unsigned short)r.h;\n    cmd->background = bg;\n    cmd->foreground = fg;\n    cmd->font = font;\n    cmd->length = length;\n    cmd->height = font->height;\n    NK_MEMCPY(cmd->string, string, (nk_size)length);\n    cmd->string[length] = '\\0';\n}\n\n/* ==============================================================\n *\n *                          DRAW LIST\n *\n * ===============================================================*/\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\nNK_API void\nnk_draw_list_init(struct nk_draw_list *list)\n{\n    nk_size i = 0;\n    NK_ASSERT(list);\n    if (!list) return;\n    nk_zero(list, sizeof(*list));\n    for (i = 0; i < NK_LEN(list->circle_vtx); ++i) {\n        const float a = ((float)i / (float)NK_LEN(list->circle_vtx)) * 2 * NK_PI;\n        list->circle_vtx[i].x = (float)NK_COS(a);\n        list->circle_vtx[i].y = (float)NK_SIN(a);\n    }\n}\n\nNK_API void\nnk_draw_list_setup(struct nk_draw_list *canvas, const struct nk_convert_config *config,\n    struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements,\n    enum nk_anti_aliasing line_aa, enum nk_anti_aliasing shape_aa)\n{\n    NK_ASSERT(canvas);\n    NK_ASSERT(config);\n    NK_ASSERT(cmds);\n    NK_ASSERT(vertices);\n    NK_ASSERT(elements);\n    if (!canvas || !config || !cmds || !vertices || !elements)\n        return;\n\n    canvas->buffer = cmds;\n    canvas->config = *config;\n    canvas->elements = elements;\n    canvas->vertices = vertices;\n    canvas->line_AA = line_aa;\n    canvas->shape_AA = shape_aa;\n    canvas->clip_rect = nk_null_rect;\n}\n\nNK_API const struct nk_draw_command*\nnk__draw_list_begin(const struct nk_draw_list *canvas, const struct nk_buffer *buffer)\n{\n    nk_byte *memory;\n    nk_size offset;\n    const struct nk_draw_command *cmd;\n\n    NK_ASSERT(buffer);\n    if (!buffer || !buffer->size || !canvas->cmd_count)\n        return 0;\n\n    memory = (nk_byte*)buffer->memory.ptr;\n    offset = buffer->memory.size - canvas->cmd_offset;\n    cmd = nk_ptr_add(const struct nk_draw_command, memory, offset);\n    return cmd;\n}\n\nNK_API const struct nk_draw_command*\nnk__draw_list_end(const struct nk_draw_list *canvas, const struct nk_buffer *buffer)\n{\n    nk_size size;\n    nk_size offset;\n    nk_byte *memory;\n    const struct nk_draw_command *end;\n\n    NK_ASSERT(buffer);\n    NK_ASSERT(canvas);\n    if (!buffer || !canvas)\n        return 0;\n\n    memory = (nk_byte*)buffer->memory.ptr;\n    size = buffer->memory.size;\n    offset = size - canvas->cmd_offset;\n    end = nk_ptr_add(const struct nk_draw_command, memory, offset);\n    end -= (canvas->cmd_count-1);\n    return end;\n}\n\nNK_API const struct nk_draw_command*\nnk__draw_list_next(const struct nk_draw_command *cmd,\n    const struct nk_buffer *buffer, const struct nk_draw_list *canvas)\n{\n    const struct nk_draw_command *end;\n    NK_ASSERT(buffer);\n    NK_ASSERT(canvas);\n    if (!cmd || !buffer || !canvas)\n        return 0;\n\n    end = nk__draw_list_end(canvas, buffer);\n    if (cmd <= end) return 0;\n    return (cmd-1);\n}\n\nNK_API void\nnk_draw_list_clear(struct nk_draw_list *list)\n{\n    NK_ASSERT(list);\n    if (!list) return;\n    if (list->buffer)\n        nk_buffer_clear(list->buffer);\n    if (list->vertices)\n        nk_buffer_clear(list->vertices);\n    if (list->elements)\n        nk_buffer_clear(list->elements);\n\n    list->element_count = 0;\n    list->vertex_count = 0;\n    list->cmd_offset = 0;\n    list->cmd_count = 0;\n    list->path_count = 0;\n    list->vertices = 0;\n    list->elements = 0;\n    list->clip_rect = nk_null_rect;\n}\n\nNK_INTERN struct nk_vec2*\nnk_draw_list_alloc_path(struct nk_draw_list *list, int count)\n{\n    struct nk_vec2 *points;\n    NK_STORAGE const nk_size point_align = NK_ALIGNOF(struct nk_vec2);\n    NK_STORAGE const nk_size point_size = sizeof(struct nk_vec2);\n    points = (struct nk_vec2*)\n        nk_buffer_alloc(list->buffer, NK_BUFFER_FRONT,\n                        point_size * (nk_size)count, point_align);\n\n    if (!points) return 0;\n    if (!list->path_offset) {\n        void *memory = nk_buffer_memory(list->buffer);\n        list->path_offset = (unsigned int)((nk_byte*)points - (nk_byte*)memory);\n    }\n    list->path_count += (unsigned int)count;\n    return points;\n}\n\nNK_INTERN struct nk_vec2\nnk_draw_list_path_last(struct nk_draw_list *list)\n{\n    void *memory;\n    struct nk_vec2 *point;\n    NK_ASSERT(list->path_count);\n    memory = nk_buffer_memory(list->buffer);\n    point = nk_ptr_add(struct nk_vec2, memory, list->path_offset);\n    point += (list->path_count-1);\n    return *point;\n}\n\nNK_INTERN struct nk_draw_command*\nnk_draw_list_push_command(struct nk_draw_list *list, struct nk_rect clip,\n    nk_handle texture)\n{\n    NK_STORAGE const nk_size cmd_align = NK_ALIGNOF(struct nk_draw_command);\n    NK_STORAGE const nk_size cmd_size = sizeof(struct nk_draw_command);\n    struct nk_draw_command *cmd;\n\n    NK_ASSERT(list);\n    cmd = (struct nk_draw_command*)\n        nk_buffer_alloc(list->buffer, NK_BUFFER_BACK, cmd_size, cmd_align);\n\n    if (!cmd) return 0;\n    if (!list->cmd_count) {\n        nk_byte *memory = (nk_byte*)nk_buffer_memory(list->buffer);\n        nk_size total = nk_buffer_total(list->buffer);\n        memory = nk_ptr_add(nk_byte, memory, total);\n        list->cmd_offset = (nk_size)(memory - (nk_byte*)cmd);\n    }\n\n    cmd->elem_count = 0;\n    cmd->clip_rect = clip;\n    cmd->texture = texture;\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    cmd->userdata = list->userdata;\n#endif\n\n    list->cmd_count++;\n    list->clip_rect = clip;\n    return cmd;\n}\n\nNK_INTERN struct nk_draw_command*\nnk_draw_list_command_last(struct nk_draw_list *list)\n{\n    void *memory;\n    nk_size size;\n    struct nk_draw_command *cmd;\n    NK_ASSERT(list->cmd_count);\n\n    memory = nk_buffer_memory(list->buffer);\n    size = nk_buffer_total(list->buffer);\n    cmd = nk_ptr_add(struct nk_draw_command, memory, size - list->cmd_offset);\n    return (cmd - (list->cmd_count-1));\n}\n\nNK_INTERN void\nnk_draw_list_add_clip(struct nk_draw_list *list, struct nk_rect rect)\n{\n    NK_ASSERT(list);\n    if (!list) return;\n    if (!list->cmd_count) {\n        nk_draw_list_push_command(list, rect, list->config.null.texture);\n    } else {\n        struct nk_draw_command *prev = nk_draw_list_command_last(list);\n        if (prev->elem_count == 0)\n            prev->clip_rect = rect;\n        nk_draw_list_push_command(list, rect, prev->texture);\n    }\n}\n\nNK_INTERN void\nnk_draw_list_push_image(struct nk_draw_list *list, nk_handle texture)\n{\n    NK_ASSERT(list);\n    if (!list) return;\n    if (!list->cmd_count) {\n        nk_draw_list_push_command(list, nk_null_rect, texture);\n    } else {\n        struct nk_draw_command *prev = nk_draw_list_command_last(list);\n        if (prev->elem_count == 0)\n            prev->texture = texture;\n        else if (prev->texture.id != texture.id)\n            nk_draw_list_push_command(list, prev->clip_rect, texture);\n    }\n}\n\n#ifdef NK_INCLUDE_COMMAND_USERDATA\nNK_API void\nnk_draw_list_push_userdata(struct nk_draw_list *list, nk_handle userdata)\n{\n    list->userdata = userdata;\n}\n#endif\n\nNK_INTERN void*\nnk_draw_list_alloc_vertices(struct nk_draw_list *list, nk_size count)\n{\n    void *vtx;\n    NK_ASSERT(list);\n    if (!list) return 0;\n    vtx = nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT,\n        list->config.vertex_size*count, list->config.vertex_alignment);\n    if (!vtx) return 0;\n    list->vertex_count += (unsigned int)count;\n    return vtx;\n}\n\nNK_INTERN nk_draw_index*\nnk_draw_list_alloc_elements(struct nk_draw_list *list, nk_size count)\n{\n    nk_draw_index *ids;\n    struct nk_draw_command *cmd;\n    NK_STORAGE const nk_size elem_align = NK_ALIGNOF(nk_draw_index);\n    NK_STORAGE const nk_size elem_size = sizeof(nk_draw_index);\n    NK_ASSERT(list);\n    if (!list) return 0;\n\n    ids = (nk_draw_index*)\n        nk_buffer_alloc(list->elements, NK_BUFFER_FRONT, elem_size*count, elem_align);\n    if (!ids) return 0;\n    cmd = nk_draw_list_command_last(list);\n    list->element_count += (unsigned int)count;\n    cmd->elem_count += (unsigned int)count;\n    return ids;\n}\n\nNK_INTERN int\nnk_draw_vertex_layout_element_is_end_of_layout(\n    const struct nk_draw_vertex_layout_element *element)\n{\n    return (element->attribute == NK_VERTEX_ATTRIBUTE_COUNT ||\n            element->format == NK_FORMAT_COUNT);\n}\n\nNK_INTERN void\nnk_draw_vertex_color(void *attribute, const float *values,\n    enum nk_draw_vertex_layout_format format)\n{\n    /* if this triggers you tried to provide a value format for a color */\n    NK_ASSERT(format >= NK_FORMAT_COLOR_BEGIN);\n    NK_ASSERT(format <= NK_FORMAT_COLOR_END);\n    if (format < NK_FORMAT_COLOR_BEGIN || format > NK_FORMAT_COLOR_END) return;\n\n    switch (format) {\n    default: NK_ASSERT(0 && \"Invalid vertex layout color format\"); break;\n    case NK_FORMAT_R8G8B8A8:\n    case NK_FORMAT_R8G8B8: {\n        struct nk_color col = nk_rgba_fv(values);\n        NK_MEMCPY(attribute, &col.r, sizeof(col));\n    } break;\n    case NK_FORMAT_B8G8R8A8: {\n        struct nk_color col = nk_rgba_fv(values);\n        struct nk_color bgra = nk_rgba(col.b, col.g, col.r, col.a);\n        NK_MEMCPY(attribute, &bgra, sizeof(bgra));\n    } break;\n    case NK_FORMAT_R16G15B16: {\n        nk_ushort col[3];\n        col[0] = (nk_ushort)NK_CLAMP(NK_USHORT_MIN, values[0] * NK_USHORT_MAX, NK_USHORT_MAX);\n        col[1] = (nk_ushort)NK_CLAMP(NK_USHORT_MIN, values[1] * NK_USHORT_MAX, NK_USHORT_MAX);\n        col[2] = (nk_ushort)NK_CLAMP(NK_USHORT_MIN, values[2] * NK_USHORT_MAX, NK_USHORT_MAX);\n        NK_MEMCPY(attribute, col, sizeof(col));\n    } break;\n    case NK_FORMAT_R16G15B16A16: {\n        nk_ushort col[4];\n        col[0] = (nk_ushort)NK_CLAMP(NK_USHORT_MIN, values[0] * NK_USHORT_MAX, NK_USHORT_MAX);\n        col[1] = (nk_ushort)NK_CLAMP(NK_USHORT_MIN, values[1] * NK_USHORT_MAX, NK_USHORT_MAX);\n        col[2] = (nk_ushort)NK_CLAMP(NK_USHORT_MIN, values[2] * NK_USHORT_MAX, NK_USHORT_MAX);\n        col[3] = (nk_ushort)NK_CLAMP(NK_USHORT_MIN, values[3] * NK_USHORT_MAX, NK_USHORT_MAX);\n        NK_MEMCPY(attribute, col, sizeof(col));\n    } break;\n    case NK_FORMAT_R32G32B32: {\n        nk_uint col[3];\n        col[0] = (nk_uint)NK_CLAMP(NK_UINT_MIN, values[0] * NK_UINT_MAX, NK_UINT_MAX);\n        col[1] = (nk_uint)NK_CLAMP(NK_UINT_MIN, values[1] * NK_UINT_MAX, NK_UINT_MAX);\n        col[2] = (nk_uint)NK_CLAMP(NK_UINT_MIN, values[2] * NK_UINT_MAX, NK_UINT_MAX);\n        NK_MEMCPY(attribute, col, sizeof(col));\n    } break;\n    case NK_FORMAT_R32G32B32A32: {\n        nk_uint col[4];\n        col[0] = (nk_uint)NK_CLAMP(NK_UINT_MIN, values[0] * NK_UINT_MAX, NK_UINT_MAX);\n        col[1] = (nk_uint)NK_CLAMP(NK_UINT_MIN, values[1] * NK_UINT_MAX, NK_UINT_MAX);\n        col[2] = (nk_uint)NK_CLAMP(NK_UINT_MIN, values[2] * NK_UINT_MAX, NK_UINT_MAX);\n        col[3] = (nk_uint)NK_CLAMP(NK_UINT_MIN, values[3] * NK_UINT_MAX, NK_UINT_MAX);\n        NK_MEMCPY(attribute, col, sizeof(col));\n    } break;\n    case NK_FORMAT_R32G32B32A32_FLOAT:\n        NK_MEMCPY(attribute, values, sizeof(float)*4);\n        break;\n    case NK_FORMAT_R32G32B32A32_DOUBLE: {\n        double col[4];\n        col[0] = (double)NK_SATURATE(values[0]);\n        col[1] = (double)NK_SATURATE(values[1]);\n        col[2] = (double)NK_SATURATE(values[2]);\n        col[3] = (double)NK_SATURATE(values[3]);\n        NK_MEMCPY(attribute, col, sizeof(col));\n    } break;\n    case NK_FORMAT_RGB32:\n    case NK_FORMAT_RGBA32: {\n        struct nk_color col = nk_rgba_fv(values);\n        nk_uint color = nk_color_u32(col);\n        NK_MEMCPY(attribute, &color, sizeof(color));\n    } break;\n    }\n}\n\nNK_INTERN void\nnk_draw_vertex_element(void *dst, const float *values, int value_count,\n    enum nk_draw_vertex_layout_format format)\n{\n    int value_index;\n    void *attribute = dst;\n    /* if this triggers you tried to provide a color format for a value */\n    NK_ASSERT(format < NK_FORMAT_COLOR_BEGIN);\n    if (format >= NK_FORMAT_COLOR_BEGIN && format <= NK_FORMAT_COLOR_END) return;\n    for (value_index = 0; value_index < value_count; ++value_index) {\n        switch (format) {\n        default: NK_ASSERT(0 && \"invalid vertex layout format\"); break;\n        case NK_FORMAT_SCHAR: {\n            char value = (char)NK_CLAMP(NK_SCHAR_MIN, values[value_index], NK_SCHAR_MAX);\n            NK_MEMCPY(attribute, &value, sizeof(value));\n            attribute = (void*)((char*)attribute + sizeof(char));\n        } break;\n        case NK_FORMAT_SSHORT: {\n            nk_short value = (nk_short)NK_CLAMP(NK_SSHORT_MIN, values[value_index], NK_SSHORT_MAX);\n            NK_MEMCPY(attribute, &value, sizeof(value));\n            attribute = (void*)((char*)attribute + sizeof(value));\n        } break;\n        case NK_FORMAT_SINT: {\n            nk_int value = (nk_int)NK_CLAMP(NK_SINT_MIN, values[value_index], NK_SINT_MAX);\n            NK_MEMCPY(attribute, &value, sizeof(value));\n            attribute = (void*)((char*)attribute + sizeof(nk_int));\n        } break;\n        case NK_FORMAT_UCHAR: {\n            unsigned char value = (unsigned char)NK_CLAMP(NK_UCHAR_MIN, values[value_index], NK_UCHAR_MAX);\n            NK_MEMCPY(attribute, &value, sizeof(value));\n            attribute = (void*)((char*)attribute + sizeof(unsigned char));\n        } break;\n        case NK_FORMAT_USHORT: {\n            nk_ushort value = (nk_ushort)NK_CLAMP(NK_USHORT_MIN, values[value_index], NK_USHORT_MAX);\n            NK_MEMCPY(attribute, &value, sizeof(value));\n            attribute = (void*)((char*)attribute + sizeof(value));\n            } break;\n        case NK_FORMAT_UINT: {\n            nk_uint value = (nk_uint)NK_CLAMP(NK_UINT_MIN, values[value_index], NK_UINT_MAX);\n            NK_MEMCPY(attribute, &value, sizeof(value));\n            attribute = (void*)((char*)attribute + sizeof(nk_uint));\n        } break;\n        case NK_FORMAT_FLOAT:\n            NK_MEMCPY(attribute, &values[value_index], sizeof(values[value_index]));\n            attribute = (void*)((char*)attribute + sizeof(float));\n            break;\n        case NK_FORMAT_DOUBLE: {\n            double value = (double)values[value_index];\n            NK_MEMCPY(attribute, &value, sizeof(value));\n            attribute = (void*)((char*)attribute + sizeof(double));\n            } break;\n        }\n    }\n}\n\nNK_INTERN void*\nnk_draw_vertex(void *dst, const struct nk_convert_config *config,\n    struct nk_vec2 pos, struct nk_vec2 uv, struct nk_colorf color)\n{\n    void *result = (void*)((char*)dst + config->vertex_size);\n    const struct nk_draw_vertex_layout_element *elem_iter = config->vertex_layout;\n    while (!nk_draw_vertex_layout_element_is_end_of_layout(elem_iter)) {\n        void *address = (void*)((char*)dst + elem_iter->offset);\n        switch (elem_iter->attribute) {\n        case NK_VERTEX_ATTRIBUTE_COUNT:\n        default: NK_ASSERT(0 && \"wrong element attribute\");\n        case NK_VERTEX_POSITION: nk_draw_vertex_element(address, &pos.x, 2, elem_iter->format); break;\n        case NK_VERTEX_TEXCOORD: nk_draw_vertex_element(address, &uv.x, 2, elem_iter->format); break;\n        case NK_VERTEX_COLOR: nk_draw_vertex_color(address, &color.r, elem_iter->format); break;\n        }\n        elem_iter++;\n    }\n    return result;\n}\n\nNK_API void\nnk_draw_list_stroke_poly_line(struct nk_draw_list *list, const struct nk_vec2 *points,\n    const unsigned int points_count, struct nk_color color, enum nk_draw_list_stroke closed,\n    float thickness, enum nk_anti_aliasing aliasing)\n{\n    nk_size count;\n    int thick_line;\n    struct nk_colorf col;\n    struct nk_colorf col_trans;\n    NK_ASSERT(list);\n    if (!list || points_count < 2) return;\n\n    color.a = (nk_byte)((float)color.a * list->config.global_alpha);\n    count = points_count;\n    if (!closed) count = points_count-1;\n    thick_line = thickness > 1.0f;\n\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    nk_draw_list_push_userdata(list, list->userdata);\n#endif\n\n    color.a = (nk_byte)((float)color.a * list->config.global_alpha);\n    nk_color_fv(&col.r, color);\n    col_trans = col;\n    col_trans.a = 0;\n\n    if (aliasing == NK_ANTI_ALIASING_ON) {\n        /* ANTI-ALIASED STROKE */\n        const float AA_SIZE = 1.0f;\n        NK_STORAGE const nk_size pnt_align = NK_ALIGNOF(struct nk_vec2);\n        NK_STORAGE const nk_size pnt_size = sizeof(struct nk_vec2);\n\n        /* allocate vertices and elements  */\n        nk_size i1 = 0;\n        nk_size vertex_offset;\n        nk_size index = list->vertex_count;\n\n        const nk_size idx_count = (thick_line) ?  (count * 18) : (count * 12);\n        const nk_size vtx_count = (thick_line) ? (points_count * 4): (points_count *3);\n\n        void *vtx = nk_draw_list_alloc_vertices(list, vtx_count);\n        nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count);\n\n        nk_size size;\n        struct nk_vec2 *normals, *temp;\n        if (!vtx || !ids) return;\n\n        /* temporary allocate normals + points */\n        vertex_offset = (nk_size)((nk_byte*)vtx - (nk_byte*)list->vertices->memory.ptr);\n        nk_buffer_mark(list->vertices, NK_BUFFER_FRONT);\n        size = pnt_size * ((thick_line) ? 5 : 3) * points_count;\n        normals = (struct nk_vec2*) nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT, size, pnt_align);\n        NK_ASSERT(normals);\n        if (!normals) return;\n        temp = normals + points_count;\n\n        /* make sure vertex pointer is still correct */\n        vtx = (void*)((nk_byte*)list->vertices->memory.ptr + vertex_offset);\n\n        /* calculate normals */\n        for (i1 = 0; i1 < count; ++i1) {\n            const nk_size i2 = ((i1 + 1) == points_count) ? 0 : (i1 + 1);\n            struct nk_vec2 diff = nk_vec2_sub(points[i2], points[i1]);\n            float len;\n\n            /* vec2 inverted length  */\n            len = nk_vec2_len_sqr(diff);\n            if (len != 0.0f)\n                len = nk_inv_sqrt(len);\n            else len = 1.0f;\n\n            diff = nk_vec2_muls(diff, len);\n            normals[i1].x = diff.y;\n            normals[i1].y = -diff.x;\n        }\n\n        if (!closed)\n            normals[points_count-1] = normals[points_count-2];\n\n        if (!thick_line) {\n            nk_size idx1, i;\n            if (!closed) {\n                struct nk_vec2 d;\n                temp[0] = nk_vec2_add(points[0], nk_vec2_muls(normals[0], AA_SIZE));\n                temp[1] = nk_vec2_sub(points[0], nk_vec2_muls(normals[0], AA_SIZE));\n                d = nk_vec2_muls(normals[points_count-1], AA_SIZE);\n                temp[(points_count-1) * 2 + 0] = nk_vec2_add(points[points_count-1], d);\n                temp[(points_count-1) * 2 + 1] = nk_vec2_sub(points[points_count-1], d);\n            }\n\n            /* fill elements */\n            idx1 = index;\n            for (i1 = 0; i1 < count; i1++) {\n                struct nk_vec2 dm;\n                float dmr2;\n                nk_size i2 = ((i1 + 1) == points_count) ? 0 : (i1 + 1);\n                nk_size idx2 = ((i1+1) == points_count) ? index: (idx1 + 3);\n\n                /* average normals */\n                dm = nk_vec2_muls(nk_vec2_add(normals[i1], normals[i2]), 0.5f);\n                dmr2 = dm.x * dm.x + dm.y* dm.y;\n                if (dmr2 > 0.000001f) {\n                    float scale = 1.0f/dmr2;\n                    scale = NK_MIN(100.0f, scale);\n                    dm = nk_vec2_muls(dm, scale);\n                }\n\n                dm = nk_vec2_muls(dm, AA_SIZE);\n                temp[i2*2+0] = nk_vec2_add(points[i2], dm);\n                temp[i2*2+1] = nk_vec2_sub(points[i2], dm);\n\n                ids[0] = (nk_draw_index)(idx2 + 0); ids[1] = (nk_draw_index)(idx1+0);\n                ids[2] = (nk_draw_index)(idx1 + 2); ids[3] = (nk_draw_index)(idx1+2);\n                ids[4] = (nk_draw_index)(idx2 + 2); ids[5] = (nk_draw_index)(idx2+0);\n                ids[6] = (nk_draw_index)(idx2 + 1); ids[7] = (nk_draw_index)(idx1+1);\n                ids[8] = (nk_draw_index)(idx1 + 0); ids[9] = (nk_draw_index)(idx1+0);\n                ids[10]= (nk_draw_index)(idx2 + 0); ids[11]= (nk_draw_index)(idx2+1);\n                ids += 12;\n                idx1 = idx2;\n            }\n\n            /* fill vertices */\n            for (i = 0; i < points_count; ++i) {\n                const struct nk_vec2 uv = list->config.null.uv;\n                vtx = nk_draw_vertex(vtx, &list->config, points[i], uv, col);\n                vtx = nk_draw_vertex(vtx, &list->config, temp[i*2+0], uv, col_trans);\n                vtx = nk_draw_vertex(vtx, &list->config, temp[i*2+1], uv, col_trans);\n            }\n        } else {\n            nk_size idx1, i;\n            const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f;\n            if (!closed) {\n                struct nk_vec2 d1 = nk_vec2_muls(normals[0], half_inner_thickness + AA_SIZE);\n                struct nk_vec2 d2 = nk_vec2_muls(normals[0], half_inner_thickness);\n\n                temp[0] = nk_vec2_add(points[0], d1);\n                temp[1] = nk_vec2_add(points[0], d2);\n                temp[2] = nk_vec2_sub(points[0], d2);\n                temp[3] = nk_vec2_sub(points[0], d1);\n\n                d1 = nk_vec2_muls(normals[points_count-1], half_inner_thickness + AA_SIZE);\n                d2 = nk_vec2_muls(normals[points_count-1], half_inner_thickness);\n\n                temp[(points_count-1)*4+0] = nk_vec2_add(points[points_count-1], d1);\n                temp[(points_count-1)*4+1] = nk_vec2_add(points[points_count-1], d2);\n                temp[(points_count-1)*4+2] = nk_vec2_sub(points[points_count-1], d2);\n                temp[(points_count-1)*4+3] = nk_vec2_sub(points[points_count-1], d1);\n            }\n\n            /* add all elements */\n            idx1 = index;\n            for (i1 = 0; i1 < count; ++i1) {\n                struct nk_vec2 dm_out, dm_in;\n                const nk_size i2 = ((i1+1) == points_count) ? 0: (i1 + 1);\n                nk_size idx2 = ((i1+1) == points_count) ? index: (idx1 + 4);\n\n                /* average normals */\n                struct nk_vec2 dm = nk_vec2_muls(nk_vec2_add(normals[i1], normals[i2]), 0.5f);\n                float dmr2 = dm.x * dm.x + dm.y* dm.y;\n                if (dmr2 > 0.000001f) {\n                    float scale = 1.0f/dmr2;\n                    scale = NK_MIN(100.0f, scale);\n                    dm = nk_vec2_muls(dm, scale);\n                }\n\n                dm_out = nk_vec2_muls(dm, ((half_inner_thickness) + AA_SIZE));\n                dm_in = nk_vec2_muls(dm, half_inner_thickness);\n                temp[i2*4+0] = nk_vec2_add(points[i2], dm_out);\n                temp[i2*4+1] = nk_vec2_add(points[i2], dm_in);\n                temp[i2*4+2] = nk_vec2_sub(points[i2], dm_in);\n                temp[i2*4+3] = nk_vec2_sub(points[i2], dm_out);\n\n                /* add indexes */\n                ids[0] = (nk_draw_index)(idx2 + 1); ids[1] = (nk_draw_index)(idx1+1);\n                ids[2] = (nk_draw_index)(idx1 + 2); ids[3] = (nk_draw_index)(idx1+2);\n                ids[4] = (nk_draw_index)(idx2 + 2); ids[5] = (nk_draw_index)(idx2+1);\n                ids[6] = (nk_draw_index)(idx2 + 1); ids[7] = (nk_draw_index)(idx1+1);\n                ids[8] = (nk_draw_index)(idx1 + 0); ids[9] = (nk_draw_index)(idx1+0);\n                ids[10]= (nk_draw_index)(idx2 + 0); ids[11] = (nk_draw_index)(idx2+1);\n                ids[12]= (nk_draw_index)(idx2 + 2); ids[13] = (nk_draw_index)(idx1+2);\n                ids[14]= (nk_draw_index)(idx1 + 3); ids[15] = (nk_draw_index)(idx1+3);\n                ids[16]= (nk_draw_index)(idx2 + 3); ids[17] = (nk_draw_index)(idx2+2);\n                ids += 18;\n                idx1 = idx2;\n            }\n\n            /* add vertices */\n            for (i = 0; i < points_count; ++i) {\n                const struct nk_vec2 uv = list->config.null.uv;\n                vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+0], uv, col_trans);\n                vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+1], uv, col);\n                vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+2], uv, col);\n                vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+3], uv, col_trans);\n            }\n        }\n        /* free temporary normals + points */\n        nk_buffer_reset(list->vertices, NK_BUFFER_FRONT);\n    } else {\n        /* NON ANTI-ALIASED STROKE */\n        nk_size i1 = 0;\n        nk_size idx = list->vertex_count;\n        const nk_size idx_count = count * 6;\n        const nk_size vtx_count = count * 4;\n        void *vtx = nk_draw_list_alloc_vertices(list, vtx_count);\n        nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count);\n        if (!vtx || !ids) return;\n\n        for (i1 = 0; i1 < count; ++i1) {\n            float dx, dy;\n            const struct nk_vec2 uv = list->config.null.uv;\n            const nk_size i2 = ((i1+1) == points_count) ? 0 : i1 + 1;\n            const struct nk_vec2 p1 = points[i1];\n            const struct nk_vec2 p2 = points[i2];\n            struct nk_vec2 diff = nk_vec2_sub(p2, p1);\n            float len;\n\n            /* vec2 inverted length  */\n            len = nk_vec2_len_sqr(diff);\n            if (len != 0.0f)\n                len = nk_inv_sqrt(len);\n            else len = 1.0f;\n            diff = nk_vec2_muls(diff, len);\n\n            /* add vertices */\n            dx = diff.x * (thickness * 0.5f);\n            dy = diff.y * (thickness * 0.5f);\n\n            vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p1.x + dy, p1.y - dx), uv, col);\n            vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p2.x + dy, p2.y - dx), uv, col);\n            vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p2.x - dy, p2.y + dx), uv, col);\n            vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p1.x - dy, p1.y + dx), uv, col);\n\n            ids[0] = (nk_draw_index)(idx+0); ids[1] = (nk_draw_index)(idx+1);\n            ids[2] = (nk_draw_index)(idx+2); ids[3] = (nk_draw_index)(idx+0);\n            ids[4] = (nk_draw_index)(idx+2); ids[5] = (nk_draw_index)(idx+3);\n\n            ids += 6;\n            idx += 4;\n        }\n    }\n}\n\nNK_API void\nnk_draw_list_fill_poly_convex(struct nk_draw_list *list,\n    const struct nk_vec2 *points, const unsigned int points_count,\n    struct nk_color color, enum nk_anti_aliasing aliasing)\n{\n    struct nk_colorf col;\n    struct nk_colorf col_trans;\n\n    NK_STORAGE const nk_size pnt_align = NK_ALIGNOF(struct nk_vec2);\n    NK_STORAGE const nk_size pnt_size = sizeof(struct nk_vec2);\n    NK_ASSERT(list);\n    if (!list || points_count < 3) return;\n\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    nk_draw_list_push_userdata(list, list->userdata);\n#endif\n\n    color.a = (nk_byte)((float)color.a * list->config.global_alpha);\n    nk_color_fv(&col.r, color);\n    col_trans = col;\n    col_trans.a = 0;\n\n    if (aliasing == NK_ANTI_ALIASING_ON) {\n        nk_size i = 0;\n        nk_size i0 = 0;\n        nk_size i1 = 0;\n\n        const float AA_SIZE = 1.0f;\n        nk_size vertex_offset = 0;\n        nk_size index = list->vertex_count;\n\n        const nk_size idx_count = (points_count-2)*3 + points_count*6;\n        const nk_size vtx_count = (points_count*2);\n\n        void *vtx = nk_draw_list_alloc_vertices(list, vtx_count);\n        nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count);\n\n        nk_size size = 0;\n        struct nk_vec2 *normals = 0;\n        unsigned int vtx_inner_idx = (unsigned int)(index + 0);\n        unsigned int vtx_outer_idx = (unsigned int)(index + 1);\n        if (!vtx || !ids) return;\n\n        /* temporary allocate normals */\n        vertex_offset = (nk_size)((nk_byte*)vtx - (nk_byte*)list->vertices->memory.ptr);\n        nk_buffer_mark(list->vertices, NK_BUFFER_FRONT);\n        size = pnt_size * points_count;\n        normals = (struct nk_vec2*) nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT, size, pnt_align);\n        NK_ASSERT(normals);\n        if (!normals) return;\n        vtx = (void*)((nk_byte*)list->vertices->memory.ptr + vertex_offset);\n\n        /* add elements */\n        for (i = 2; i < points_count; i++) {\n            ids[0] = (nk_draw_index)(vtx_inner_idx);\n            ids[1] = (nk_draw_index)(vtx_inner_idx + ((i-1) << 1));\n            ids[2] = (nk_draw_index)(vtx_inner_idx + (i << 1));\n            ids += 3;\n        }\n\n        /* compute normals */\n        for (i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) {\n            struct nk_vec2 p0 = points[i0];\n            struct nk_vec2 p1 = points[i1];\n            struct nk_vec2 diff = nk_vec2_sub(p1, p0);\n\n            /* vec2 inverted length  */\n            float len = nk_vec2_len_sqr(diff);\n            if (len != 0.0f)\n                len = nk_inv_sqrt(len);\n            else len = 1.0f;\n            diff = nk_vec2_muls(diff, len);\n\n            normals[i0].x = diff.y;\n            normals[i0].y = -diff.x;\n        }\n\n        /* add vertices + indexes */\n        for (i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) {\n            const struct nk_vec2 uv = list->config.null.uv;\n            struct nk_vec2 n0 = normals[i0];\n            struct nk_vec2 n1 = normals[i1];\n            struct nk_vec2 dm = nk_vec2_muls(nk_vec2_add(n0, n1), 0.5f);\n            float dmr2 = dm.x*dm.x + dm.y*dm.y;\n            if (dmr2 > 0.000001f) {\n                float scale = 1.0f / dmr2;\n                scale = NK_MIN(scale, 100.0f);\n                dm = nk_vec2_muls(dm, scale);\n            }\n            dm = nk_vec2_muls(dm, AA_SIZE * 0.5f);\n\n            /* add vertices */\n            vtx = nk_draw_vertex(vtx, &list->config, nk_vec2_sub(points[i1], dm), uv, col);\n            vtx = nk_draw_vertex(vtx, &list->config, nk_vec2_add(points[i1], dm), uv, col_trans);\n\n            /* add indexes */\n            ids[0] = (nk_draw_index)(vtx_inner_idx+(i1<<1));\n            ids[1] = (nk_draw_index)(vtx_inner_idx+(i0<<1));\n            ids[2] = (nk_draw_index)(vtx_outer_idx+(i0<<1));\n            ids[3] = (nk_draw_index)(vtx_outer_idx+(i0<<1));\n            ids[4] = (nk_draw_index)(vtx_outer_idx+(i1<<1));\n            ids[5] = (nk_draw_index)(vtx_inner_idx+(i1<<1));\n            ids += 6;\n        }\n        /* free temporary normals + points */\n        nk_buffer_reset(list->vertices, NK_BUFFER_FRONT);\n    } else {\n        nk_size i = 0;\n        nk_size index = list->vertex_count;\n        const nk_size idx_count = (points_count-2)*3;\n        const nk_size vtx_count = points_count;\n        void *vtx = nk_draw_list_alloc_vertices(list, vtx_count);\n        nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count);\n\n        if (!vtx || !ids) return;\n        for (i = 0; i < vtx_count; ++i)\n            vtx = nk_draw_vertex(vtx, &list->config, points[i], list->config.null.uv, col);\n        for (i = 2; i < points_count; ++i) {\n            ids[0] = (nk_draw_index)index;\n            ids[1] = (nk_draw_index)(index+ i - 1);\n            ids[2] = (nk_draw_index)(index+i);\n            ids += 3;\n        }\n    }\n}\n\nNK_API void\nnk_draw_list_path_clear(struct nk_draw_list *list)\n{\n    NK_ASSERT(list);\n    if (!list) return;\n    nk_buffer_reset(list->buffer, NK_BUFFER_FRONT);\n    list->path_count = 0;\n    list->path_offset = 0;\n}\n\nNK_API void\nnk_draw_list_path_line_to(struct nk_draw_list *list, struct nk_vec2 pos)\n{\n    struct nk_vec2 *points = 0;\n    struct nk_draw_command *cmd = 0;\n    NK_ASSERT(list);\n    if (!list) return;\n    if (!list->cmd_count)\n        nk_draw_list_add_clip(list, nk_null_rect);\n\n    cmd = nk_draw_list_command_last(list);\n    if (cmd && cmd->texture.ptr != list->config.null.texture.ptr)\n        nk_draw_list_push_image(list, list->config.null.texture);\n\n    points = nk_draw_list_alloc_path(list, 1);\n    if (!points) return;\n    points[0] = pos;\n}\n\nNK_API void\nnk_draw_list_path_arc_to_fast(struct nk_draw_list *list, struct nk_vec2 center,\n    float radius, int a_min, int a_max)\n{\n    int a = 0;\n    NK_ASSERT(list);\n    if (!list) return;\n    if (a_min <= a_max) {\n        for (a = a_min; a <= a_max; a++) {\n            const struct nk_vec2 c = list->circle_vtx[(nk_size)a % NK_LEN(list->circle_vtx)];\n            const float x = center.x + c.x * radius;\n            const float y = center.y + c.y * radius;\n            nk_draw_list_path_line_to(list, nk_vec2(x, y));\n        }\n    }\n}\n\nNK_API void\nnk_draw_list_path_arc_to(struct nk_draw_list *list, struct nk_vec2 center,\n    float radius, float a_min, float a_max, unsigned int segments)\n{\n    unsigned int i = 0;\n    NK_ASSERT(list);\n    if (!list) return;\n    if (radius == 0.0f) return;\n    for (i = 0; i <= segments; ++i) {\n        const float a = a_min + ((float)i / ((float)segments) * (a_max - a_min));\n        const float x = center.x + (float)NK_COS(a) * radius;\n        const float y = center.y + (float)NK_SIN(a) * radius;\n        nk_draw_list_path_line_to(list, nk_vec2(x, y));\n    }\n}\n\nNK_API void\nnk_draw_list_path_rect_to(struct nk_draw_list *list, struct nk_vec2 a,\n    struct nk_vec2 b, float rounding)\n{\n    float r;\n    NK_ASSERT(list);\n    if (!list) return;\n    r = rounding;\n    r = NK_MIN(r, ((b.x-a.x) < 0) ? -(b.x-a.x): (b.x-a.x));\n    r = NK_MIN(r, ((b.y-a.y) < 0) ? -(b.y-a.y): (b.y-a.y));\n\n    if (r == 0.0f) {\n        nk_draw_list_path_line_to(list, a);\n        nk_draw_list_path_line_to(list, nk_vec2(b.x,a.y));\n        nk_draw_list_path_line_to(list, b);\n        nk_draw_list_path_line_to(list, nk_vec2(a.x,b.y));\n    } else {\n        nk_draw_list_path_arc_to_fast(list, nk_vec2(a.x + r, a.y + r), r, 6, 9);\n        nk_draw_list_path_arc_to_fast(list, nk_vec2(b.x - r, a.y + r), r, 9, 12);\n        nk_draw_list_path_arc_to_fast(list, nk_vec2(b.x - r, b.y - r), r, 0, 3);\n        nk_draw_list_path_arc_to_fast(list, nk_vec2(a.x + r, b.y - r), r, 3, 6);\n    }\n}\n\nNK_API void\nnk_draw_list_path_curve_to(struct nk_draw_list *list, struct nk_vec2 p2,\n    struct nk_vec2 p3, struct nk_vec2 p4, unsigned int num_segments)\n{\n    float t_step;\n    unsigned int i_step;\n    struct nk_vec2 p1;\n\n    NK_ASSERT(list);\n    NK_ASSERT(list->path_count);\n    if (!list || !list->path_count) return;\n    num_segments = NK_MAX(num_segments, 1);\n\n    p1 = nk_draw_list_path_last(list);\n    t_step = 1.0f/(float)num_segments;\n    for (i_step = 1; i_step <= num_segments; ++i_step) {\n        float t = t_step * (float)i_step;\n        float u = 1.0f - t;\n        float w1 = u*u*u;\n        float w2 = 3*u*u*t;\n        float w3 = 3*u*t*t;\n        float w4 = t * t *t;\n        float x = w1 * p1.x + w2 * p2.x + w3 * p3.x + w4 * p4.x;\n        float y = w1 * p1.y + w2 * p2.y + w3 * p3.y + w4 * p4.y;\n        nk_draw_list_path_line_to(list, nk_vec2(x,y));\n    }\n}\n\nNK_API void\nnk_draw_list_path_fill(struct nk_draw_list *list, struct nk_color color)\n{\n    struct nk_vec2 *points;\n    NK_ASSERT(list);\n    if (!list) return;\n    points = (struct nk_vec2*)nk_buffer_memory(list->buffer);\n    nk_draw_list_fill_poly_convex(list, points, list->path_count, color, list->config.shape_AA);\n    nk_draw_list_path_clear(list);\n}\n\nNK_API void\nnk_draw_list_path_stroke(struct nk_draw_list *list, struct nk_color color,\n    enum nk_draw_list_stroke closed, float thickness)\n{\n    struct nk_vec2 *points;\n    NK_ASSERT(list);\n    if (!list) return;\n    points = (struct nk_vec2*)nk_buffer_memory(list->buffer);\n    nk_draw_list_stroke_poly_line(list, points, list->path_count, color,\n        closed, thickness, list->config.line_AA);\n    nk_draw_list_path_clear(list);\n}\n\nNK_API void\nnk_draw_list_stroke_line(struct nk_draw_list *list, struct nk_vec2 a,\n    struct nk_vec2 b, struct nk_color col, float thickness)\n{\n    NK_ASSERT(list);\n    if (!list || !col.a) return;\n    if (list->line_AA == NK_ANTI_ALIASING_ON) {\n        nk_draw_list_path_line_to(list, a);\n        nk_draw_list_path_line_to(list, b);\n    } else {\n        nk_draw_list_path_line_to(list, nk_vec2_sub(a,nk_vec2(0.5f,0.5f)));\n        nk_draw_list_path_line_to(list, nk_vec2_sub(b,nk_vec2(0.5f,0.5f)));\n    }\n    nk_draw_list_path_stroke(list,  col, NK_STROKE_OPEN, thickness);\n}\n\nNK_API void\nnk_draw_list_fill_rect(struct nk_draw_list *list, struct nk_rect rect,\n    struct nk_color col, float rounding)\n{\n    NK_ASSERT(list);\n    if (!list || !col.a) return;\n\n    if (list->line_AA == NK_ANTI_ALIASING_ON) {\n        nk_draw_list_path_rect_to(list, nk_vec2(rect.x, rect.y),\n            nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding);\n    } else {\n        nk_draw_list_path_rect_to(list, nk_vec2(rect.x-0.5f, rect.y-0.5f),\n            nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding);\n    } nk_draw_list_path_fill(list,  col);\n}\n\nNK_API void\nnk_draw_list_stroke_rect(struct nk_draw_list *list, struct nk_rect rect,\n    struct nk_color col, float rounding, float thickness)\n{\n    NK_ASSERT(list);\n    if (!list || !col.a) return;\n    if (list->line_AA == NK_ANTI_ALIASING_ON) {\n        nk_draw_list_path_rect_to(list, nk_vec2(rect.x, rect.y),\n            nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding);\n    } else {\n        nk_draw_list_path_rect_to(list, nk_vec2(rect.x-0.5f, rect.y-0.5f),\n            nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding);\n    } nk_draw_list_path_stroke(list,  col, NK_STROKE_CLOSED, thickness);\n}\n\nNK_API void\nnk_draw_list_fill_rect_multi_color(struct nk_draw_list *list, struct nk_rect rect,\n    struct nk_color left, struct nk_color top, struct nk_color right,\n    struct nk_color bottom)\n{\n    void *vtx;\n    struct nk_colorf col_left, col_top;\n    struct nk_colorf col_right, col_bottom;\n    nk_draw_index *idx;\n    nk_draw_index index;\n\n    nk_color_fv(&col_left.r, left);\n    nk_color_fv(&col_right.r, right);\n    nk_color_fv(&col_top.r, top);\n    nk_color_fv(&col_bottom.r, bottom);\n\n    NK_ASSERT(list);\n    if (!list) return;\n\n    nk_draw_list_push_image(list, list->config.null.texture);\n    index = (nk_draw_index)list->vertex_count;\n    vtx = nk_draw_list_alloc_vertices(list, 4);\n    idx = nk_draw_list_alloc_elements(list, 6);\n    if (!vtx || !idx) return;\n\n    idx[0] = (nk_draw_index)(index+0); idx[1] = (nk_draw_index)(index+1);\n    idx[2] = (nk_draw_index)(index+2); idx[3] = (nk_draw_index)(index+0);\n    idx[4] = (nk_draw_index)(index+2); idx[5] = (nk_draw_index)(index+3);\n\n    vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x, rect.y), list->config.null.uv, col_left);\n    vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x + rect.w, rect.y), list->config.null.uv, col_top);\n    vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x + rect.w, rect.y + rect.h), list->config.null.uv, col_right);\n    vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x, rect.y + rect.h), list->config.null.uv, col_bottom);\n}\n\nNK_API void\nnk_draw_list_fill_triangle(struct nk_draw_list *list, struct nk_vec2 a,\n    struct nk_vec2 b, struct nk_vec2 c, struct nk_color col)\n{\n    NK_ASSERT(list);\n    if (!list || !col.a) return;\n    nk_draw_list_path_line_to(list, a);\n    nk_draw_list_path_line_to(list, b);\n    nk_draw_list_path_line_to(list, c);\n    nk_draw_list_path_fill(list, col);\n}\n\nNK_API void\nnk_draw_list_stroke_triangle(struct nk_draw_list *list, struct nk_vec2 a,\n    struct nk_vec2 b, struct nk_vec2 c, struct nk_color col, float thickness)\n{\n    NK_ASSERT(list);\n    if (!list || !col.a) return;\n    nk_draw_list_path_line_to(list, a);\n    nk_draw_list_path_line_to(list, b);\n    nk_draw_list_path_line_to(list, c);\n    nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness);\n}\n\nNK_API void\nnk_draw_list_fill_circle(struct nk_draw_list *list, struct nk_vec2 center,\n    float radius, struct nk_color col, unsigned int segs)\n{\n    float a_max;\n    NK_ASSERT(list);\n    if (!list || !col.a) return;\n    a_max = NK_PI * 2.0f * ((float)segs - 1.0f) / (float)segs;\n    nk_draw_list_path_arc_to(list, center, radius, 0.0f, a_max, segs);\n    nk_draw_list_path_fill(list, col);\n}\n\nNK_API void\nnk_draw_list_stroke_circle(struct nk_draw_list *list, struct nk_vec2 center,\n    float radius, struct nk_color col, unsigned int segs, float thickness)\n{\n    float a_max;\n    NK_ASSERT(list);\n    if (!list || !col.a) return;\n    a_max = NK_PI * 2.0f * ((float)segs - 1.0f) / (float)segs;\n    nk_draw_list_path_arc_to(list, center, radius, 0.0f, a_max, segs);\n    nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness);\n}\n\nNK_API void\nnk_draw_list_stroke_curve(struct nk_draw_list *list, struct nk_vec2 p0,\n    struct nk_vec2 cp0, struct nk_vec2 cp1, struct nk_vec2 p1,\n    struct nk_color col, unsigned int segments, float thickness)\n{\n    NK_ASSERT(list);\n    if (!list || !col.a) return;\n    nk_draw_list_path_line_to(list, p0);\n    nk_draw_list_path_curve_to(list, cp0, cp1, p1, segments);\n    nk_draw_list_path_stroke(list, col, NK_STROKE_OPEN, thickness);\n}\n\nNK_INTERN void\nnk_draw_list_push_rect_uv(struct nk_draw_list *list, struct nk_vec2 a,\n    struct nk_vec2 c, struct nk_vec2 uva, struct nk_vec2 uvc,\n    struct nk_color color)\n{\n    void *vtx;\n    struct nk_vec2 uvb;\n    struct nk_vec2 uvd;\n    struct nk_vec2 b;\n    struct nk_vec2 d;\n\n    struct nk_colorf col;\n    nk_draw_index *idx;\n    nk_draw_index index;\n    NK_ASSERT(list);\n    if (!list) return;\n\n    nk_color_fv(&col.r, color);\n    uvb = nk_vec2(uvc.x, uva.y);\n    uvd = nk_vec2(uva.x, uvc.y);\n    b = nk_vec2(c.x, a.y);\n    d = nk_vec2(a.x, c.y);\n\n    index = (nk_draw_index)list->vertex_count;\n    vtx = nk_draw_list_alloc_vertices(list, 4);\n    idx = nk_draw_list_alloc_elements(list, 6);\n    if (!vtx || !idx) return;\n\n    idx[0] = (nk_draw_index)(index+0); idx[1] = (nk_draw_index)(index+1);\n    idx[2] = (nk_draw_index)(index+2); idx[3] = (nk_draw_index)(index+0);\n    idx[4] = (nk_draw_index)(index+2); idx[5] = (nk_draw_index)(index+3);\n\n    vtx = nk_draw_vertex(vtx, &list->config, a, uva, col);\n    vtx = nk_draw_vertex(vtx, &list->config, b, uvb, col);\n    vtx = nk_draw_vertex(vtx, &list->config, c, uvc, col);\n    vtx = nk_draw_vertex(vtx, &list->config, d, uvd, col);\n}\n\nNK_API void\nnk_draw_list_add_image(struct nk_draw_list *list, struct nk_image texture,\n    struct nk_rect rect, struct nk_color color)\n{\n    NK_ASSERT(list);\n    if (!list) return;\n    /* push new command with given texture */\n    nk_draw_list_push_image(list, texture.handle);\n    if (nk_image_is_subimage(&texture)) {\n        /* add region inside of the texture  */\n        struct nk_vec2 uv[2];\n        uv[0].x = (float)texture.region[0]/(float)texture.w;\n        uv[0].y = (float)texture.region[1]/(float)texture.h;\n        uv[1].x = (float)(texture.region[0] + texture.region[2])/(float)texture.w;\n        uv[1].y = (float)(texture.region[1] + texture.region[3])/(float)texture.h;\n        nk_draw_list_push_rect_uv(list, nk_vec2(rect.x, rect.y),\n            nk_vec2(rect.x + rect.w, rect.y + rect.h),  uv[0], uv[1], color);\n    } else nk_draw_list_push_rect_uv(list, nk_vec2(rect.x, rect.y),\n            nk_vec2(rect.x + rect.w, rect.y + rect.h),\n            nk_vec2(0.0f, 0.0f), nk_vec2(1.0f, 1.0f),color);\n}\n\nNK_API void\nnk_draw_list_add_text(struct nk_draw_list *list, const struct nk_user_font *font,\n    struct nk_rect rect, const char *text, int len, float font_height,\n    struct nk_color fg)\n{\n    float x = 0;\n    int text_len = 0;\n    nk_rune unicode = 0;\n    nk_rune next = 0;\n    int glyph_len = 0;\n    int next_glyph_len = 0;\n    struct nk_user_font_glyph g;\n\n    NK_ASSERT(list);\n    if (!list || !len || !text) return;\n    if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h,\n        list->clip_rect.x, list->clip_rect.y, list->clip_rect.w, list->clip_rect.h)) return;\n\n    nk_draw_list_push_image(list, font->texture);\n    x = rect.x;\n    glyph_len = nk_utf_decode(text, &unicode, len);\n    if (!glyph_len) return;\n\n    /* draw every glyph image */\n    fg.a = (nk_byte)((float)fg.a * list->config.global_alpha);\n    while (text_len < len && glyph_len) {\n        float gx, gy, gh, gw;\n        float char_width = 0;\n        if (unicode == NK_UTF_INVALID) break;\n\n        /* query currently drawn glyph information */\n        next_glyph_len = nk_utf_decode(text + text_len + glyph_len, &next, (int)len - text_len);\n        font->query(font->userdata, font_height, &g, unicode,\n                    (next == NK_UTF_INVALID) ? '\\0' : next);\n\n        /* calculate and draw glyph drawing rectangle and image */\n        gx = x + g.offset.x;\n        gy = rect.y + g.offset.y;\n        gw = g.width; gh = g.height;\n        char_width = g.xadvance;\n        nk_draw_list_push_rect_uv(list, nk_vec2(gx,gy), nk_vec2(gx + gw, gy+ gh),\n            g.uv[0], g.uv[1], fg);\n\n        /* offset next glyph */\n        text_len += glyph_len;\n        x += char_width;\n        glyph_len = next_glyph_len;\n        unicode = next;\n    }\n}\n\nNK_API nk_flags\nnk_convert(struct nk_context *ctx, struct nk_buffer *cmds,\n    struct nk_buffer *vertices, struct nk_buffer *elements,\n    const struct nk_convert_config *config)\n{\n    nk_flags res = NK_CONVERT_SUCCESS;\n    const struct nk_command *cmd;\n    NK_ASSERT(ctx);\n    NK_ASSERT(cmds);\n    NK_ASSERT(vertices);\n    NK_ASSERT(elements);\n    NK_ASSERT(config);\n    NK_ASSERT(config->vertex_layout);\n    NK_ASSERT(config->vertex_size);\n    if (!ctx || !cmds || !vertices || !elements || !config || !config->vertex_layout)\n        return NK_CONVERT_INVALID_PARAM;\n\n    nk_draw_list_setup(&ctx->draw_list, config, cmds, vertices, elements,\n        config->line_AA, config->shape_AA);\n    nk_foreach(cmd, ctx)\n    {\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n        ctx->draw_list.userdata = cmd->userdata;\n#endif\n        switch (cmd->type) {\n        case NK_COMMAND_NOP: break;\n        case NK_COMMAND_SCISSOR: {\n            const struct nk_command_scissor *s = (const struct nk_command_scissor*)cmd;\n            nk_draw_list_add_clip(&ctx->draw_list, nk_rect(s->x, s->y, s->w, s->h));\n        } break;\n        case NK_COMMAND_LINE: {\n            const struct nk_command_line *l = (const struct nk_command_line*)cmd;\n            nk_draw_list_stroke_line(&ctx->draw_list, nk_vec2(l->begin.x, l->begin.y),\n                nk_vec2(l->end.x, l->end.y), l->color, l->line_thickness);\n        } break;\n        case NK_COMMAND_CURVE: {\n            const struct nk_command_curve *q = (const struct nk_command_curve*)cmd;\n            nk_draw_list_stroke_curve(&ctx->draw_list, nk_vec2(q->begin.x, q->begin.y),\n                nk_vec2(q->ctrl[0].x, q->ctrl[0].y), nk_vec2(q->ctrl[1].x,\n                q->ctrl[1].y), nk_vec2(q->end.x, q->end.y), q->color,\n                config->curve_segment_count, q->line_thickness);\n        } break;\n        case NK_COMMAND_RECT: {\n            const struct nk_command_rect *r = (const struct nk_command_rect*)cmd;\n            nk_draw_list_stroke_rect(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h),\n                r->color, (float)r->rounding, r->line_thickness);\n        } break;\n        case NK_COMMAND_RECT_FILLED: {\n            const struct nk_command_rect_filled *r = (const struct nk_command_rect_filled*)cmd;\n            nk_draw_list_fill_rect(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h),\n                r->color, (float)r->rounding);\n        } break;\n        case NK_COMMAND_RECT_MULTI_COLOR: {\n            const struct nk_command_rect_multi_color *r = (const struct nk_command_rect_multi_color*)cmd;\n            nk_draw_list_fill_rect_multi_color(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h),\n                r->left, r->top, r->right, r->bottom);\n        } break;\n        case NK_COMMAND_CIRCLE: {\n            const struct nk_command_circle *c = (const struct nk_command_circle*)cmd;\n            nk_draw_list_stroke_circle(&ctx->draw_list, nk_vec2((float)c->x + (float)c->w/2,\n                (float)c->y + (float)c->h/2), (float)c->w/2, c->color,\n                config->circle_segment_count, c->line_thickness);\n        } break;\n        case NK_COMMAND_CIRCLE_FILLED: {\n            const struct nk_command_circle_filled *c = (const struct nk_command_circle_filled *)cmd;\n            nk_draw_list_fill_circle(&ctx->draw_list, nk_vec2((float)c->x + (float)c->w/2,\n                (float)c->y + (float)c->h/2), (float)c->w/2, c->color,\n                config->circle_segment_count);\n        } break;\n        case NK_COMMAND_ARC: {\n            const struct nk_command_arc *c = (const struct nk_command_arc*)cmd;\n            nk_draw_list_path_line_to(&ctx->draw_list, nk_vec2(c->cx, c->cy));\n            nk_draw_list_path_arc_to(&ctx->draw_list, nk_vec2(c->cx, c->cy), c->r,\n                c->a[0], c->a[1], config->arc_segment_count);\n            nk_draw_list_path_stroke(&ctx->draw_list, c->color, NK_STROKE_CLOSED, c->line_thickness);\n        } break;\n        case NK_COMMAND_ARC_FILLED: {\n            const struct nk_command_arc_filled *c = (const struct nk_command_arc_filled*)cmd;\n            nk_draw_list_path_line_to(&ctx->draw_list, nk_vec2(c->cx, c->cy));\n            nk_draw_list_path_arc_to(&ctx->draw_list, nk_vec2(c->cx, c->cy), c->r,\n                c->a[0], c->a[1], config->arc_segment_count);\n            nk_draw_list_path_fill(&ctx->draw_list, c->color);\n        } break;\n        case NK_COMMAND_TRIANGLE: {\n            const struct nk_command_triangle *t = (const struct nk_command_triangle*)cmd;\n            nk_draw_list_stroke_triangle(&ctx->draw_list, nk_vec2(t->a.x, t->a.y),\n                nk_vec2(t->b.x, t->b.y), nk_vec2(t->c.x, t->c.y), t->color,\n                t->line_thickness);\n        } break;\n        case NK_COMMAND_TRIANGLE_FILLED: {\n            const struct nk_command_triangle_filled *t = (const struct nk_command_triangle_filled*)cmd;\n            nk_draw_list_fill_triangle(&ctx->draw_list, nk_vec2(t->a.x, t->a.y),\n                nk_vec2(t->b.x, t->b.y), nk_vec2(t->c.x, t->c.y), t->color);\n        } break;\n        case NK_COMMAND_POLYGON: {\n            int i;\n            const struct nk_command_polygon*p = (const struct nk_command_polygon*)cmd;\n            for (i = 0; i < p->point_count; ++i) {\n                struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y);\n                nk_draw_list_path_line_to(&ctx->draw_list, pnt);\n            }\n            nk_draw_list_path_stroke(&ctx->draw_list, p->color, NK_STROKE_CLOSED, p->line_thickness);\n        } break;\n        case NK_COMMAND_POLYGON_FILLED: {\n            int i;\n            const struct nk_command_polygon_filled *p = (const struct nk_command_polygon_filled*)cmd;\n            for (i = 0; i < p->point_count; ++i) {\n                struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y);\n                nk_draw_list_path_line_to(&ctx->draw_list, pnt);\n            }\n            nk_draw_list_path_fill(&ctx->draw_list, p->color);\n        } break;\n        case NK_COMMAND_POLYLINE: {\n            int i;\n            const struct nk_command_polyline *p = (const struct nk_command_polyline*)cmd;\n            for (i = 0; i < p->point_count; ++i) {\n                struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y);\n                nk_draw_list_path_line_to(&ctx->draw_list, pnt);\n            }\n            nk_draw_list_path_stroke(&ctx->draw_list, p->color, NK_STROKE_OPEN, p->line_thickness);\n        } break;\n        case NK_COMMAND_TEXT: {\n            const struct nk_command_text *t = (const struct nk_command_text*)cmd;\n            nk_draw_list_add_text(&ctx->draw_list, t->font, nk_rect(t->x, t->y, t->w, t->h),\n                t->string, t->length, t->height, t->foreground);\n        } break;\n        case NK_COMMAND_IMAGE: {\n            const struct nk_command_image *i = (const struct nk_command_image*)cmd;\n            nk_draw_list_add_image(&ctx->draw_list, i->img, nk_rect(i->x, i->y, i->w, i->h), i->col);\n        } break;\n        case NK_COMMAND_CUSTOM: {\n            const struct nk_command_custom *c = (const struct nk_command_custom*)cmd;\n            c->callback(&ctx->draw_list, c->x, c->y, c->w, c->h, c->callback_data);\n        } break;\n        default: break;\n        }\n    }\n    res |= (cmds->needed > cmds->allocated + (cmds->memory.size - cmds->size)) ? NK_CONVERT_COMMAND_BUFFER_FULL: 0;\n    res |= (vertices->needed > vertices->allocated) ? NK_CONVERT_VERTEX_BUFFER_FULL: 0;\n    res |= (elements->needed > elements->allocated) ? NK_CONVERT_ELEMENT_BUFFER_FULL: 0;\n    return res;\n}\nNK_API const struct nk_draw_command*\nnk__draw_begin(const struct nk_context *ctx,\n    const struct nk_buffer *buffer)\n{return nk__draw_list_begin(&ctx->draw_list, buffer);}\n\nNK_API const struct nk_draw_command*\nnk__draw_end(const struct nk_context *ctx, const struct nk_buffer *buffer)\n{return nk__draw_list_end(&ctx->draw_list, buffer);}\n\nNK_API const struct nk_draw_command*\nnk__draw_next(const struct nk_draw_command *cmd,\n    const struct nk_buffer *buffer, const struct nk_context *ctx)\n{return nk__draw_list_next(cmd, buffer, &ctx->draw_list);}\n\n#endif\n\n/*\n * ==============================================================\n *\n *                          FONT HANDLING\n *\n * ===============================================================\n */\n#ifdef NK_INCLUDE_FONT_BAKING\n/* -------------------------------------------------------------\n *\n *                          RECT PACK\n *\n * --------------------------------------------------------------*/\n/* stb_rect_pack.h - v0.05 - public domain - rectangle packing */\n/* Sean Barrett 2014 */\n#define NK_RP__MAXVAL  0xffff\ntypedef unsigned short nk_rp_coord;\n\nstruct nk_rp_rect {\n    /* reserved for your use: */\n    int id;\n    /* input: */\n    nk_rp_coord w, h;\n    /* output: */\n    nk_rp_coord x, y;\n    int was_packed;\n    /* non-zero if valid packing */\n}; /* 16 bytes, nominally */\n\nstruct nk_rp_node {\n    nk_rp_coord  x,y;\n    struct nk_rp_node  *next;\n};\n\nstruct nk_rp_context {\n    int width;\n    int height;\n    int align;\n    int init_mode;\n    int heuristic;\n    int num_nodes;\n    struct nk_rp_node *active_head;\n    struct nk_rp_node *free_head;\n    struct nk_rp_node extra[2];\n    /* we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' */\n};\n\nstruct nk_rp__findresult {\n    int x,y;\n    struct nk_rp_node **prev_link;\n};\n\nenum NK_RP_HEURISTIC {\n    NK_RP_HEURISTIC_Skyline_default=0,\n    NK_RP_HEURISTIC_Skyline_BL_sortHeight = NK_RP_HEURISTIC_Skyline_default,\n    NK_RP_HEURISTIC_Skyline_BF_sortHeight\n};\nenum NK_RP_INIT_STATE{NK_RP__INIT_skyline = 1};\n\nNK_INTERN void\nnk_rp_setup_allow_out_of_mem(struct nk_rp_context *context, int allow_out_of_mem)\n{\n    if (allow_out_of_mem)\n        /* if it's ok to run out of memory, then don't bother aligning them; */\n        /* this gives better packing, but may fail due to OOM (even though */\n        /* the rectangles easily fit). @TODO a smarter approach would be to only */\n        /* quantize once we've hit OOM, then we could get rid of this parameter. */\n        context->align = 1;\n    else {\n        /* if it's not ok to run out of memory, then quantize the widths */\n        /* so that num_nodes is always enough nodes. */\n        /* */\n        /* I.e. num_nodes * align >= width */\n        /*                  align >= width / num_nodes */\n        /*                  align = ceil(width/num_nodes) */\n        context->align = (context->width + context->num_nodes-1) / context->num_nodes;\n    }\n}\n\nNK_INTERN void\nnk_rp_init_target(struct nk_rp_context *context, int width, int height,\n    struct nk_rp_node *nodes, int num_nodes)\n{\n    int i;\n#ifndef STBRP_LARGE_RECTS\n    NK_ASSERT(width <= 0xffff && height <= 0xffff);\n#endif\n\n    for (i=0; i < num_nodes-1; ++i)\n        nodes[i].next = &nodes[i+1];\n    nodes[i].next = 0;\n    context->init_mode = NK_RP__INIT_skyline;\n    context->heuristic = NK_RP_HEURISTIC_Skyline_default;\n    context->free_head = &nodes[0];\n    context->active_head = &context->extra[0];\n    context->width = width;\n    context->height = height;\n    context->num_nodes = num_nodes;\n    nk_rp_setup_allow_out_of_mem(context, 0);\n\n    /* node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) */\n    context->extra[0].x = 0;\n    context->extra[0].y = 0;\n    context->extra[0].next = &context->extra[1];\n    context->extra[1].x = (nk_rp_coord) width;\n    context->extra[1].y = 65535;\n    context->extra[1].next = 0;\n}\n\n/* find minimum y position if it starts at x1 */\nNK_INTERN int\nnk_rp__skyline_find_min_y(struct nk_rp_context *c, struct nk_rp_node *first,\n    int x0, int width, int *pwaste)\n{\n    struct nk_rp_node *node = first;\n    int x1 = x0 + width;\n    int min_y, visited_width, waste_area;\n    NK_ASSERT(first->x <= x0);\n    NK_UNUSED(c);\n\n    NK_ASSERT(node->next->x > x0);\n    /* we ended up handling this in the caller for efficiency */\n    NK_ASSERT(node->x <= x0);\n\n    min_y = 0;\n    waste_area = 0;\n    visited_width = 0;\n    while (node->x < x1)\n    {\n        if (node->y > min_y) {\n            /* raise min_y higher. */\n            /* we've accounted for all waste up to min_y, */\n            /* but we'll now add more waste for everything we've visited */\n            waste_area += visited_width * (node->y - min_y);\n            min_y = node->y;\n            /* the first time through, visited_width might be reduced */\n            if (node->x < x0)\n            visited_width += node->next->x - x0;\n            else\n            visited_width += node->next->x - node->x;\n        } else {\n            /* add waste area */\n            int under_width = node->next->x - node->x;\n            if (under_width + visited_width > width)\n            under_width = width - visited_width;\n            waste_area += under_width * (min_y - node->y);\n            visited_width += under_width;\n        }\n        node = node->next;\n    }\n    *pwaste = waste_area;\n    return min_y;\n}\n\nNK_INTERN struct nk_rp__findresult\nnk_rp__skyline_find_best_pos(struct nk_rp_context *c, int width, int height)\n{\n    int best_waste = (1<<30), best_x, best_y = (1 << 30);\n    struct nk_rp__findresult fr;\n    struct nk_rp_node **prev, *node, *tail, **best = 0;\n\n    /* align to multiple of c->align */\n    width = (width + c->align - 1);\n    width -= width % c->align;\n    NK_ASSERT(width % c->align == 0);\n\n    node = c->active_head;\n    prev = &c->active_head;\n    while (node->x + width <= c->width) {\n        int y,waste;\n        y = nk_rp__skyline_find_min_y(c, node, node->x, width, &waste);\n        /* actually just want to test BL */\n        if (c->heuristic == NK_RP_HEURISTIC_Skyline_BL_sortHeight) {\n            /* bottom left */\n            if (y < best_y) {\n            best_y = y;\n            best = prev;\n            }\n        } else {\n            /* best-fit */\n            if (y + height <= c->height) {\n                /* can only use it if it first vertically */\n                if (y < best_y || (y == best_y && waste < best_waste)) {\n                    best_y = y;\n                    best_waste = waste;\n                    best = prev;\n                }\n            }\n        }\n        prev = &node->next;\n        node = node->next;\n    }\n    best_x = (best == 0) ? 0 : (*best)->x;\n\n    /* if doing best-fit (BF), we also have to try aligning right edge to each node position */\n    /* */\n    /* e.g, if fitting */\n    /* */\n    /*     ____________________ */\n    /*    |____________________| */\n    /* */\n    /*            into */\n    /* */\n    /*   |                         | */\n    /*   |             ____________| */\n    /*   |____________| */\n    /* */\n    /* then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned */\n    /* */\n    /* This makes BF take about 2x the time */\n    if (c->heuristic == NK_RP_HEURISTIC_Skyline_BF_sortHeight)\n    {\n        tail = c->active_head;\n        node = c->active_head;\n        prev = &c->active_head;\n        /* find first node that's admissible */\n        while (tail->x < width)\n            tail = tail->next;\n        while (tail)\n        {\n            int xpos = tail->x - width;\n            int y,waste;\n            NK_ASSERT(xpos >= 0);\n            /* find the left position that matches this */\n            while (node->next->x <= xpos) {\n                prev = &node->next;\n                node = node->next;\n            }\n            NK_ASSERT(node->next->x > xpos && node->x <= xpos);\n            y = nk_rp__skyline_find_min_y(c, node, xpos, width, &waste);\n            if (y + height < c->height) {\n                if (y <= best_y) {\n                    if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {\n                        best_x = xpos;\n                        NK_ASSERT(y <= best_y);\n                        best_y = y;\n                        best_waste = waste;\n                        best = prev;\n                    }\n                }\n            }\n            tail = tail->next;\n        }\n    }\n    fr.prev_link = best;\n    fr.x = best_x;\n    fr.y = best_y;\n    return fr;\n}\n\nNK_INTERN struct nk_rp__findresult\nnk_rp__skyline_pack_rectangle(struct nk_rp_context *context, int width, int height)\n{\n    /* find best position according to heuristic */\n    struct nk_rp__findresult res = nk_rp__skyline_find_best_pos(context, width, height);\n    struct nk_rp_node *node, *cur;\n\n    /* bail if: */\n    /*    1. it failed */\n    /*    2. the best node doesn't fit (we don't always check this) */\n    /*    3. we're out of memory */\n    if (res.prev_link == 0 || res.y + height > context->height || context->free_head == 0) {\n        res.prev_link = 0;\n        return res;\n    }\n\n    /* on success, create new node */\n    node = context->free_head;\n    node->x = (nk_rp_coord) res.x;\n    node->y = (nk_rp_coord) (res.y + height);\n\n    context->free_head = node->next;\n\n    /* insert the new node into the right starting point, and */\n    /* let 'cur' point to the remaining nodes needing to be */\n    /* stitched back in */\n    cur = *res.prev_link;\n    if (cur->x < res.x) {\n        /* preserve the existing one, so start testing with the next one */\n        struct nk_rp_node *next = cur->next;\n        cur->next = node;\n        cur = next;\n    } else {\n        *res.prev_link = node;\n    }\n\n    /* from here, traverse cur and free the nodes, until we get to one */\n    /* that shouldn't be freed */\n    while (cur->next && cur->next->x <= res.x + width) {\n        struct nk_rp_node *next = cur->next;\n        /* move the current node to the free list */\n        cur->next = context->free_head;\n        context->free_head = cur;\n        cur = next;\n    }\n    /* stitch the list back in */\n    node->next = cur;\n\n    if (cur->x < res.x + width)\n        cur->x = (nk_rp_coord) (res.x + width);\n    return res;\n}\n\nNK_INTERN int\nnk_rect_height_compare(const void *a, const void *b)\n{\n    const struct nk_rp_rect *p = (const struct nk_rp_rect *) a;\n    const struct nk_rp_rect *q = (const struct nk_rp_rect *) b;\n    if (p->h > q->h)\n        return -1;\n    if (p->h < q->h)\n        return  1;\n    return (p->w > q->w) ? -1 : (p->w < q->w);\n}\n\nNK_INTERN int\nnk_rect_original_order(const void *a, const void *b)\n{\n    const struct nk_rp_rect *p = (const struct nk_rp_rect *) a;\n    const struct nk_rp_rect *q = (const struct nk_rp_rect *) b;\n    return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);\n}\n\nNK_INTERN void\nnk_rp_qsort(struct nk_rp_rect *array, unsigned int len, int(*cmp)(const void*,const void*))\n{\n    /* iterative quick sort */\n    #define NK_MAX_SORT_STACK 64\n    unsigned right, left = 0, stack[NK_MAX_SORT_STACK], pos = 0;\n    unsigned seed = len/2 * 69069+1;\n    for (;;) {\n        for (; left+1 < len; len++) {\n            struct nk_rp_rect pivot, tmp;\n            if (pos == NK_MAX_SORT_STACK) len = stack[pos = 0];\n            pivot = array[left+seed%(len-left)];\n            seed = seed * 69069 + 1;\n            stack[pos++] = len;\n            for (right = left-1;;) {\n                while (cmp(&array[++right], &pivot) < 0);\n                while (cmp(&pivot, &array[--len]) < 0);\n                if (right >= len) break;\n                tmp = array[right];\n                array[right] = array[len];\n                array[len] = tmp;\n            }\n        }\n        if (pos == 0) break;\n        left = len;\n        len = stack[--pos];\n    }\n    #undef NK_MAX_SORT_STACK\n}\n\nNK_INTERN void\nnk_rp_pack_rects(struct nk_rp_context *context, struct nk_rp_rect *rects, int num_rects)\n{\n    int i;\n    /* we use the 'was_packed' field internally to allow sorting/unsorting */\n    for (i=0; i < num_rects; ++i) {\n        rects[i].was_packed = i;\n    }\n\n    /* sort according to heuristic */\n    nk_rp_qsort(rects, (unsigned)num_rects, nk_rect_height_compare);\n\n    for (i=0; i < num_rects; ++i) {\n        struct nk_rp__findresult fr = nk_rp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);\n        if (fr.prev_link) {\n            rects[i].x = (nk_rp_coord) fr.x;\n            rects[i].y = (nk_rp_coord) fr.y;\n        } else {\n            rects[i].x = rects[i].y = NK_RP__MAXVAL;\n        }\n    }\n\n    /* unsort */\n    nk_rp_qsort(rects, (unsigned)num_rects, nk_rect_original_order);\n\n    /* set was_packed flags */\n    for (i=0; i < num_rects; ++i)\n        rects[i].was_packed = !(rects[i].x == NK_RP__MAXVAL && rects[i].y == NK_RP__MAXVAL);\n}\n\n/*\n * ==============================================================\n *\n *                          TRUETYPE\n *\n * ===============================================================\n */\n/* stb_truetype.h - v1.07 - public domain */\n#define NK_TT_MAX_OVERSAMPLE   8\n#define NK_TT__OVER_MASK  (NK_TT_MAX_OVERSAMPLE-1)\n\nstruct nk_tt_bakedchar {\n    unsigned short x0,y0,x1,y1;\n    /* coordinates of bbox in bitmap */\n    float xoff,yoff,xadvance;\n};\n\nstruct nk_tt_aligned_quad{\n    float x0,y0,s0,t0; /* top-left */\n    float x1,y1,s1,t1; /* bottom-right */\n};\n\nstruct nk_tt_packedchar {\n    unsigned short x0,y0,x1,y1;\n    /* coordinates of bbox in bitmap */\n    float xoff,yoff,xadvance;\n    float xoff2,yoff2;\n};\n\nstruct nk_tt_pack_range {\n    float font_size;\n    int first_unicode_codepoint_in_range;\n    /* if non-zero, then the chars are continuous, and this is the first codepoint */\n    int *array_of_unicode_codepoints;\n    /* if non-zero, then this is an array of unicode codepoints */\n    int num_chars;\n    struct nk_tt_packedchar *chardata_for_range; /* output */\n    unsigned char h_oversample, v_oversample;\n    /* don't set these, they're used internally */\n};\n\nstruct nk_tt_pack_context {\n    void *pack_info;\n    int   width;\n    int   height;\n    int   stride_in_bytes;\n    int   padding;\n    unsigned int   h_oversample, v_oversample;\n    unsigned char *pixels;\n    void  *nodes;\n};\n\nstruct nk_tt_fontinfo {\n    const unsigned char* data; /* pointer to .ttf file */\n    int fontstart;/* offset of start of font */\n    int numGlyphs;/* number of glyphs, needed for range checking */\n    int loca,head,glyf,hhea,hmtx,kern; /* table locations as offset from start of .ttf */\n    int index_map; /* a cmap mapping for our chosen character encoding */\n    int indexToLocFormat; /* format needed to map from glyph index to glyph */\n};\n\nenum {\n  NK_TT_vmove=1,\n  NK_TT_vline,\n  NK_TT_vcurve\n};\n\nstruct nk_tt_vertex {\n    short x,y,cx,cy;\n    unsigned char type,padding;\n};\n\nstruct nk_tt__bitmap{\n   int w,h,stride;\n   unsigned char *pixels;\n};\n\nstruct nk_tt__hheap_chunk {\n    struct nk_tt__hheap_chunk *next;\n};\nstruct nk_tt__hheap {\n    struct nk_allocator alloc;\n    struct nk_tt__hheap_chunk *head;\n    void   *first_free;\n    int    num_remaining_in_head_chunk;\n};\n\nstruct nk_tt__edge {\n    float x0,y0, x1,y1;\n    int invert;\n};\n\nstruct nk_tt__active_edge {\n    struct nk_tt__active_edge *next;\n    float fx,fdx,fdy;\n    float direction;\n    float sy;\n    float ey;\n};\nstruct nk_tt__point {float x,y;};\n\n#define NK_TT_MACSTYLE_DONTCARE     0\n#define NK_TT_MACSTYLE_BOLD         1\n#define NK_TT_MACSTYLE_ITALIC       2\n#define NK_TT_MACSTYLE_UNDERSCORE   4\n#define NK_TT_MACSTYLE_NONE         8\n/* <= not same as 0, this makes us check the bitfield is 0 */\n\nenum { /* platformID */\n   NK_TT_PLATFORM_ID_UNICODE   =0,\n   NK_TT_PLATFORM_ID_MAC       =1,\n   NK_TT_PLATFORM_ID_ISO       =2,\n   NK_TT_PLATFORM_ID_MICROSOFT =3\n};\n\nenum { /* encodingID for NK_TT_PLATFORM_ID_UNICODE */\n   NK_TT_UNICODE_EID_UNICODE_1_0    =0,\n   NK_TT_UNICODE_EID_UNICODE_1_1    =1,\n   NK_TT_UNICODE_EID_ISO_10646      =2,\n   NK_TT_UNICODE_EID_UNICODE_2_0_BMP=3,\n   NK_TT_UNICODE_EID_UNICODE_2_0_FULL=4\n};\n\nenum { /* encodingID for NK_TT_PLATFORM_ID_MICROSOFT */\n   NK_TT_MS_EID_SYMBOL        =0,\n   NK_TT_MS_EID_UNICODE_BMP   =1,\n   NK_TT_MS_EID_SHIFTJIS      =2,\n   NK_TT_MS_EID_UNICODE_FULL  =10\n};\n\nenum { /* encodingID for NK_TT_PLATFORM_ID_MAC; same as Script Manager codes */\n   NK_TT_MAC_EID_ROMAN        =0,   NK_TT_MAC_EID_ARABIC       =4,\n   NK_TT_MAC_EID_JAPANESE     =1,   NK_TT_MAC_EID_HEBREW       =5,\n   NK_TT_MAC_EID_CHINESE_TRAD =2,   NK_TT_MAC_EID_GREEK        =6,\n   NK_TT_MAC_EID_KOREAN       =3,   NK_TT_MAC_EID_RUSSIAN      =7\n};\n\nenum { /* languageID for NK_TT_PLATFORM_ID_MICROSOFT; same as LCID... */\n       /* problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs */\n   NK_TT_MS_LANG_ENGLISH     =0x0409,   NK_TT_MS_LANG_ITALIAN     =0x0410,\n   NK_TT_MS_LANG_CHINESE     =0x0804,   NK_TT_MS_LANG_JAPANESE    =0x0411,\n   NK_TT_MS_LANG_DUTCH       =0x0413,   NK_TT_MS_LANG_KOREAN      =0x0412,\n   NK_TT_MS_LANG_FRENCH      =0x040c,   NK_TT_MS_LANG_RUSSIAN     =0x0419,\n   NK_TT_MS_LANG_GERMAN      =0x0407,   NK_TT_MS_LANG_SPANISH     =0x0409,\n   NK_TT_MS_LANG_HEBREW      =0x040d,   NK_TT_MS_LANG_SWEDISH     =0x041D\n};\n\nenum { /* languageID for NK_TT_PLATFORM_ID_MAC */\n   NK_TT_MAC_LANG_ENGLISH      =0 ,   NK_TT_MAC_LANG_JAPANESE     =11,\n   NK_TT_MAC_LANG_ARABIC       =12,   NK_TT_MAC_LANG_KOREAN       =23,\n   NK_TT_MAC_LANG_DUTCH        =4 ,   NK_TT_MAC_LANG_RUSSIAN      =32,\n   NK_TT_MAC_LANG_FRENCH       =1 ,   NK_TT_MAC_LANG_SPANISH      =6 ,\n   NK_TT_MAC_LANG_GERMAN       =2 ,   NK_TT_MAC_LANG_SWEDISH      =5 ,\n   NK_TT_MAC_LANG_HEBREW       =10,   NK_TT_MAC_LANG_CHINESE_SIMPLIFIED =33,\n   NK_TT_MAC_LANG_ITALIAN      =3 ,   NK_TT_MAC_LANG_CHINESE_TRAD =19\n};\n\n#define nk_ttBYTE(p)     (* (const nk_byte *) (p))\n#define nk_ttCHAR(p)     (* (const char *) (p))\n\n#if defined(NK_BIGENDIAN) && !defined(NK_ALLOW_UNALIGNED_TRUETYPE)\n   #define nk_ttUSHORT(p)   (* (nk_ushort *) (p))\n   #define nk_ttSHORT(p)    (* (nk_short *) (p))\n   #define nk_ttULONG(p)    (* (nk_uint *) (p))\n   #define nk_ttLONG(p)     (* (nk_int *) (p))\n#else\n    static nk_ushort nk_ttUSHORT(const nk_byte *p) { return (nk_ushort)(p[0]*256 + p[1]); }\n    static nk_short nk_ttSHORT(const nk_byte *p)   { return (nk_short)(p[0]*256 + p[1]); }\n    static nk_uint nk_ttULONG(const nk_byte *p)  { return (nk_uint)((p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]); }\n#endif\n\n#define nk_tt_tag4(p,c0,c1,c2,c3)\\\n    ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3))\n#define nk_tt_tag(p,str) nk_tt_tag4(p,str[0],str[1],str[2],str[3])\n\nNK_INTERN int nk_tt_GetGlyphShape(const struct nk_tt_fontinfo *info, struct nk_allocator *alloc,\n                                int glyph_index, struct nk_tt_vertex **pvertices);\n\nNK_INTERN nk_uint\nnk_tt__find_table(const nk_byte *data, nk_uint fontstart, const char *tag)\n{\n    /* @OPTIMIZE: binary search */\n    nk_int num_tables = nk_ttUSHORT(data+fontstart+4);\n    nk_uint tabledir = fontstart + 12;\n    nk_int i;\n    for (i = 0; i < num_tables; ++i) {\n        nk_uint loc = tabledir + (nk_uint)(16*i);\n        if (nk_tt_tag(data+loc+0, tag))\n            return nk_ttULONG(data+loc+8);\n    }\n    return 0;\n}\n\nNK_INTERN int\nnk_tt_InitFont(struct nk_tt_fontinfo *info, const unsigned char *data2, int fontstart)\n{\n    nk_uint cmap, t;\n    nk_int i,numTables;\n    const nk_byte *data = (const nk_byte *) data2;\n\n    info->data = data;\n    info->fontstart = fontstart;\n\n    cmap = nk_tt__find_table(data, (nk_uint)fontstart, \"cmap\");       /* required */\n    info->loca = (int)nk_tt__find_table(data, (nk_uint)fontstart, \"loca\"); /* required */\n    info->head = (int)nk_tt__find_table(data, (nk_uint)fontstart, \"head\"); /* required */\n    info->glyf = (int)nk_tt__find_table(data, (nk_uint)fontstart, \"glyf\"); /* required */\n    info->hhea = (int)nk_tt__find_table(data, (nk_uint)fontstart, \"hhea\"); /* required */\n    info->hmtx = (int)nk_tt__find_table(data, (nk_uint)fontstart, \"hmtx\"); /* required */\n    info->kern = (int)nk_tt__find_table(data, (nk_uint)fontstart, \"kern\"); /* not required */\n    if (!cmap || !info->loca || !info->head || !info->glyf || !info->hhea || !info->hmtx)\n        return 0;\n\n    t = nk_tt__find_table(data, (nk_uint)fontstart, \"maxp\");\n    if (t) info->numGlyphs = nk_ttUSHORT(data+t+4);\n    else info->numGlyphs = 0xffff;\n\n    /* find a cmap encoding table we understand *now* to avoid searching */\n    /* later. (todo: could make this installable) */\n    /* the same regardless of glyph. */\n    numTables = nk_ttUSHORT(data + cmap + 2);\n    info->index_map = 0;\n    for (i=0; i < numTables; ++i)\n    {\n        nk_uint encoding_record = cmap + 4 + 8 * (nk_uint)i;\n        /* find an encoding we understand: */\n        switch(nk_ttUSHORT(data+encoding_record)) {\n        case NK_TT_PLATFORM_ID_MICROSOFT:\n            switch (nk_ttUSHORT(data+encoding_record+2)) {\n            case NK_TT_MS_EID_UNICODE_BMP:\n            case NK_TT_MS_EID_UNICODE_FULL:\n                /* MS/Unicode */\n                info->index_map = (int)(cmap + nk_ttULONG(data+encoding_record+4));\n                break;\n            default: break;\n            } break;\n        case NK_TT_PLATFORM_ID_UNICODE:\n            /* Mac/iOS has these */\n            /* all the encodingIDs are unicode, so we don't bother to check it */\n            info->index_map = (int)(cmap + nk_ttULONG(data+encoding_record+4));\n            break;\n        default: break;\n        }\n    }\n    if (info->index_map == 0)\n        return 0;\n    info->indexToLocFormat = nk_ttUSHORT(data+info->head + 50);\n    return 1;\n}\n\nNK_INTERN int\nnk_tt_FindGlyphIndex(const struct nk_tt_fontinfo *info, int unicode_codepoint)\n{\n    const nk_byte *data = info->data;\n    nk_uint index_map = (nk_uint)info->index_map;\n\n    nk_ushort format = nk_ttUSHORT(data + index_map + 0);\n    if (format == 0) { /* apple byte encoding */\n        nk_int bytes = nk_ttUSHORT(data + index_map + 2);\n        if (unicode_codepoint < bytes-6)\n            return nk_ttBYTE(data + index_map + 6 + unicode_codepoint);\n        return 0;\n    } else if (format == 6) {\n        nk_uint first = nk_ttUSHORT(data + index_map + 6);\n        nk_uint count = nk_ttUSHORT(data + index_map + 8);\n        if ((nk_uint) unicode_codepoint >= first && (nk_uint) unicode_codepoint < first+count)\n            return nk_ttUSHORT(data + index_map + 10 + (unicode_codepoint - (int)first)*2);\n        return 0;\n    } else if (format == 2) {\n        NK_ASSERT(0); /* @TODO: high-byte mapping for japanese/chinese/korean */\n        return 0;\n    } else if (format == 4) { /* standard mapping for windows fonts: binary search collection of ranges */\n        nk_ushort segcount = nk_ttUSHORT(data+index_map+6) >> 1;\n        nk_ushort searchRange = nk_ttUSHORT(data+index_map+8) >> 1;\n        nk_ushort entrySelector = nk_ttUSHORT(data+index_map+10);\n        nk_ushort rangeShift = nk_ttUSHORT(data+index_map+12) >> 1;\n\n        /* do a binary search of the segments */\n        nk_uint endCount = index_map + 14;\n        nk_uint search = endCount;\n\n        if (unicode_codepoint > 0xffff)\n            return 0;\n\n        /* they lie from endCount .. endCount + segCount */\n        /* but searchRange is the nearest power of two, so... */\n        if (unicode_codepoint >= nk_ttUSHORT(data + search + rangeShift*2))\n            search += (nk_uint)(rangeShift*2);\n\n        /* now decrement to bias correctly to find smallest */\n        search -= 2;\n        while (entrySelector) {\n            nk_ushort end;\n            searchRange >>= 1;\n            end = nk_ttUSHORT(data + search + searchRange*2);\n            if (unicode_codepoint > end)\n                search += (nk_uint)(searchRange*2);\n            --entrySelector;\n        }\n        search += 2;\n\n      {\n         nk_ushort offset, start;\n         nk_ushort item = (nk_ushort) ((search - endCount) >> 1);\n\n         NK_ASSERT(unicode_codepoint <= nk_ttUSHORT(data + endCount + 2*item));\n         start = nk_ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item);\n         if (unicode_codepoint < start)\n            return 0;\n\n         offset = nk_ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item);\n         if (offset == 0)\n            return (nk_ushort) (unicode_codepoint + nk_ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item));\n\n         return nk_ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item);\n      }\n   } else if (format == 12 || format == 13) {\n        nk_uint ngroups = nk_ttULONG(data+index_map+12);\n        nk_int low,high;\n        low = 0; high = (nk_int)ngroups;\n        /* Binary search the right group. */\n        while (low < high) {\n            nk_int mid = low + ((high-low) >> 1); /* rounds down, so low <= mid < high */\n            nk_uint start_char = nk_ttULONG(data+index_map+16+mid*12);\n            nk_uint end_char = nk_ttULONG(data+index_map+16+mid*12+4);\n            if ((nk_uint) unicode_codepoint < start_char)\n                high = mid;\n            else if ((nk_uint) unicode_codepoint > end_char)\n                low = mid+1;\n            else {\n                nk_uint start_glyph = nk_ttULONG(data+index_map+16+mid*12+8);\n                if (format == 12)\n                    return (int)start_glyph + (int)unicode_codepoint - (int)start_char;\n                else /* format == 13 */\n                    return (int)start_glyph;\n            }\n        }\n        return 0; /* not found */\n    }\n    /* @TODO */\n    NK_ASSERT(0);\n    return 0;\n}\n\nNK_INTERN void\nnk_tt_setvertex(struct nk_tt_vertex *v, nk_byte type, nk_int x, nk_int y, nk_int cx, nk_int cy)\n{\n    v->type = type;\n    v->x = (nk_short) x;\n    v->y = (nk_short) y;\n    v->cx = (nk_short) cx;\n    v->cy = (nk_short) cy;\n}\n\nNK_INTERN int\nnk_tt__GetGlyfOffset(const struct nk_tt_fontinfo *info, int glyph_index)\n{\n    int g1,g2;\n    if (glyph_index >= info->numGlyphs) return -1; /* glyph index out of range */\n    if (info->indexToLocFormat >= 2)    return -1; /* unknown index->glyph map format */\n\n    if (info->indexToLocFormat == 0) {\n        g1 = info->glyf + nk_ttUSHORT(info->data + info->loca + glyph_index * 2) * 2;\n        g2 = info->glyf + nk_ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2;\n    } else {\n        g1 = info->glyf + (int)nk_ttULONG (info->data + info->loca + glyph_index * 4);\n        g2 = info->glyf + (int)nk_ttULONG (info->data + info->loca + glyph_index * 4 + 4);\n    }\n    return g1==g2 ? -1 : g1; /* if length is 0, return -1 */\n}\n\nNK_INTERN int\nnk_tt_GetGlyphBox(const struct nk_tt_fontinfo *info, int glyph_index,\n    int *x0, int *y0, int *x1, int *y1)\n{\n    int g = nk_tt__GetGlyfOffset(info, glyph_index);\n    if (g < 0) return 0;\n\n    if (x0) *x0 = nk_ttSHORT(info->data + g + 2);\n    if (y0) *y0 = nk_ttSHORT(info->data + g + 4);\n    if (x1) *x1 = nk_ttSHORT(info->data + g + 6);\n    if (y1) *y1 = nk_ttSHORT(info->data + g + 8);\n    return 1;\n}\n\nNK_INTERN int\nstbtt__close_shape(struct nk_tt_vertex *vertices, int num_vertices, int was_off,\n    int start_off, nk_int sx, nk_int sy, nk_int scx, nk_int scy, nk_int cx, nk_int cy)\n{\n   if (start_off) {\n      if (was_off)\n         nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy);\n      nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve, sx,sy,scx,scy);\n   } else {\n      if (was_off)\n         nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve,sx,sy,cx,cy);\n      else\n         nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vline,sx,sy,0,0);\n   }\n   return num_vertices;\n}\n\nNK_INTERN int\nnk_tt_GetGlyphShape(const struct nk_tt_fontinfo *info, struct nk_allocator *alloc,\n    int glyph_index, struct nk_tt_vertex **pvertices)\n{\n    nk_short numberOfContours;\n    const nk_byte *endPtsOfContours;\n    const nk_byte *data = info->data;\n    struct nk_tt_vertex *vertices=0;\n    int num_vertices=0;\n    int g = nk_tt__GetGlyfOffset(info, glyph_index);\n    *pvertices = 0;\n\n    if (g < 0) return 0;\n    numberOfContours = nk_ttSHORT(data + g);\n    if (numberOfContours > 0) {\n        nk_byte flags=0,flagcount;\n        nk_int ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0;\n        nk_int x,y,cx,cy,sx,sy, scx,scy;\n        const nk_byte *points;\n        endPtsOfContours = (data + g + 10);\n        ins = nk_ttUSHORT(data + g + 10 + numberOfContours * 2);\n        points = data + g + 10 + numberOfContours * 2 + 2 + ins;\n\n        n = 1+nk_ttUSHORT(endPtsOfContours + numberOfContours*2-2);\n        m = n + 2*numberOfContours;  /* a loose bound on how many vertices we might need */\n        vertices = (struct nk_tt_vertex *)alloc->alloc(alloc->userdata, 0, (nk_size)m * sizeof(vertices[0]));\n        if (vertices == 0)\n            return 0;\n\n        next_move = 0;\n        flagcount=0;\n\n        /* in first pass, we load uninterpreted data into the allocated array */\n        /* above, shifted to the end of the array so we won't overwrite it when */\n        /* we create our final data starting from the front */\n        off = m - n; /* starting offset for uninterpreted data, regardless of how m ends up being calculated */\n\n        /* first load flags */\n        for (i=0; i < n; ++i) {\n            if (flagcount == 0) {\n                flags = *points++;\n                if (flags & 8)\n                    flagcount = *points++;\n            } else --flagcount;\n            vertices[off+i].type = flags;\n        }\n\n        /* now load x coordinates */\n        x=0;\n        for (i=0; i < n; ++i) {\n            flags = vertices[off+i].type;\n            if (flags & 2) {\n                nk_short dx = *points++;\n                x += (flags & 16) ? dx : -dx; /* ??? */\n            } else {\n                if (!(flags & 16)) {\n                    x = x + (nk_short) (points[0]*256 + points[1]);\n                    points += 2;\n                }\n            }\n            vertices[off+i].x = (nk_short) x;\n        }\n\n        /* now load y coordinates */\n        y=0;\n        for (i=0; i < n; ++i) {\n            flags = vertices[off+i].type;\n            if (flags & 4) {\n                nk_short dy = *points++;\n                y += (flags & 32) ? dy : -dy; /* ??? */\n            } else {\n                if (!(flags & 32)) {\n                    y = y + (nk_short) (points[0]*256 + points[1]);\n                    points += 2;\n                }\n            }\n            vertices[off+i].y = (nk_short) y;\n        }\n\n        /* now convert them to our format */\n        num_vertices=0;\n        sx = sy = cx = cy = scx = scy = 0;\n        for (i=0; i < n; ++i)\n        {\n            flags = vertices[off+i].type;\n            x     = (nk_short) vertices[off+i].x;\n            y     = (nk_short) vertices[off+i].y;\n\n            if (next_move == i) {\n                if (i != 0)\n                    num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);\n\n                /* now start the new one                */\n                start_off = !(flags & 1);\n                if (start_off) {\n                    /* if we start off with an off-curve point, then when we need to find a point on the curve */\n                    /* where we can start, and we need to save some state for when we wraparound. */\n                    scx = x;\n                    scy = y;\n                    if (!(vertices[off+i+1].type & 1)) {\n                        /* next point is also a curve point, so interpolate an on-point curve */\n                        sx = (x + (nk_int) vertices[off+i+1].x) >> 1;\n                        sy = (y + (nk_int) vertices[off+i+1].y) >> 1;\n                    } else {\n                        /* otherwise just use the next point as our start point */\n                        sx = (nk_int) vertices[off+i+1].x;\n                        sy = (nk_int) vertices[off+i+1].y;\n                        ++i; /* we're using point i+1 as the starting point, so skip it */\n                    }\n                } else {\n                    sx = x;\n                    sy = y;\n                }\n                nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vmove,sx,sy,0,0);\n                was_off = 0;\n                next_move = 1 + nk_ttUSHORT(endPtsOfContours+j*2);\n                ++j;\n            } else {\n                if (!(flags & 1))\n                { /* if it's a curve */\n                    if (was_off) /* two off-curve control points in a row means interpolate an on-curve midpoint */\n                        nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy);\n                    cx = x;\n                    cy = y;\n                    was_off = 1;\n                } else {\n                    if (was_off)\n                        nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve, x,y, cx, cy);\n                    else nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vline, x,y,0,0);\n                    was_off = 0;\n                }\n            }\n        }\n        num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);\n    } else if (numberOfContours == -1) {\n        /* Compound shapes. */\n        int more = 1;\n        const nk_byte *comp = data + g + 10;\n        num_vertices = 0;\n        vertices = 0;\n\n        while (more)\n        {\n            nk_ushort flags, gidx;\n            int comp_num_verts = 0, i;\n            struct nk_tt_vertex *comp_verts = 0, *tmp = 0;\n            float mtx[6] = {1,0,0,1,0,0}, m, n;\n\n            flags = (nk_ushort)nk_ttSHORT(comp); comp+=2;\n            gidx = (nk_ushort)nk_ttSHORT(comp); comp+=2;\n\n            if (flags & 2) { /* XY values */\n                if (flags & 1) { /* shorts */\n                    mtx[4] = nk_ttSHORT(comp); comp+=2;\n                    mtx[5] = nk_ttSHORT(comp); comp+=2;\n                } else {\n                    mtx[4] = nk_ttCHAR(comp); comp+=1;\n                    mtx[5] = nk_ttCHAR(comp); comp+=1;\n                }\n            } else {\n                /* @TODO handle matching point */\n                NK_ASSERT(0);\n            }\n            if (flags & (1<<3)) { /* WE_HAVE_A_SCALE */\n                mtx[0] = mtx[3] = nk_ttSHORT(comp)/16384.0f; comp+=2;\n                mtx[1] = mtx[2] = 0;\n            } else if (flags & (1<<6)) { /* WE_HAVE_AN_X_AND_YSCALE */\n                mtx[0] = nk_ttSHORT(comp)/16384.0f; comp+=2;\n                mtx[1] = mtx[2] = 0;\n                mtx[3] = nk_ttSHORT(comp)/16384.0f; comp+=2;\n            } else if (flags & (1<<7)) { /* WE_HAVE_A_TWO_BY_TWO */\n                mtx[0] = nk_ttSHORT(comp)/16384.0f; comp+=2;\n                mtx[1] = nk_ttSHORT(comp)/16384.0f; comp+=2;\n                mtx[2] = nk_ttSHORT(comp)/16384.0f; comp+=2;\n                mtx[3] = nk_ttSHORT(comp)/16384.0f; comp+=2;\n            }\n\n             /* Find transformation scales. */\n            m = (float) NK_SQRT(mtx[0]*mtx[0] + mtx[1]*mtx[1]);\n            n = (float) NK_SQRT(mtx[2]*mtx[2] + mtx[3]*mtx[3]);\n\n             /* Get indexed glyph. */\n            comp_num_verts = nk_tt_GetGlyphShape(info, alloc, gidx, &comp_verts);\n            if (comp_num_verts > 0)\n            {\n                /* Transform vertices. */\n                for (i = 0; i < comp_num_verts; ++i) {\n                    struct nk_tt_vertex* v = &comp_verts[i];\n                    short x,y;\n                    x=v->x; y=v->y;\n                    v->x = (short)(m * (mtx[0]*x + mtx[2]*y + mtx[4]));\n                    v->y = (short)(n * (mtx[1]*x + mtx[3]*y + mtx[5]));\n                    x=v->cx; y=v->cy;\n                    v->cx = (short)(m * (mtx[0]*x + mtx[2]*y + mtx[4]));\n                    v->cy = (short)(n * (mtx[1]*x + mtx[3]*y + mtx[5]));\n                }\n                /* Append vertices. */\n                tmp = (struct nk_tt_vertex*)alloc->alloc(alloc->userdata, 0,\n                    (nk_size)(num_vertices+comp_num_verts)*sizeof(struct nk_tt_vertex));\n                if (!tmp) {\n                    if (vertices) alloc->free(alloc->userdata, vertices);\n                    if (comp_verts) alloc->free(alloc->userdata, comp_verts);\n                    return 0;\n                }\n                if (num_vertices > 0) NK_MEMCPY(tmp, vertices, (nk_size)num_vertices*sizeof(struct nk_tt_vertex));\n                NK_MEMCPY(tmp+num_vertices, comp_verts, (nk_size)comp_num_verts*sizeof(struct nk_tt_vertex));\n                if (vertices) alloc->free(alloc->userdata,vertices);\n                vertices = tmp;\n                alloc->free(alloc->userdata,comp_verts);\n                num_vertices += comp_num_verts;\n            }\n            /* More components ? */\n            more = flags & (1<<5);\n        }\n    } else if (numberOfContours < 0) {\n        /* @TODO other compound variations? */\n        NK_ASSERT(0);\n    } else {\n        /* numberOfCounters == 0, do nothing */\n    }\n    *pvertices = vertices;\n    return num_vertices;\n}\n\nNK_INTERN void\nnk_tt_GetGlyphHMetrics(const struct nk_tt_fontinfo *info, int glyph_index,\n    int *advanceWidth, int *leftSideBearing)\n{\n    nk_ushort numOfLongHorMetrics = nk_ttUSHORT(info->data+info->hhea + 34);\n    if (glyph_index < numOfLongHorMetrics) {\n        if (advanceWidth)\n            *advanceWidth    = nk_ttSHORT(info->data + info->hmtx + 4*glyph_index);\n        if (leftSideBearing)\n            *leftSideBearing = nk_ttSHORT(info->data + info->hmtx + 4*glyph_index + 2);\n    } else {\n        if (advanceWidth)\n            *advanceWidth    = nk_ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1));\n        if (leftSideBearing)\n            *leftSideBearing = nk_ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics));\n    }\n}\n\nNK_INTERN void\nnk_tt_GetFontVMetrics(const struct nk_tt_fontinfo *info,\n    int *ascent, int *descent, int *lineGap)\n{\n   if (ascent ) *ascent  = nk_ttSHORT(info->data+info->hhea + 4);\n   if (descent) *descent = nk_ttSHORT(info->data+info->hhea + 6);\n   if (lineGap) *lineGap = nk_ttSHORT(info->data+info->hhea + 8);\n}\n\nNK_INTERN float\nnk_tt_ScaleForPixelHeight(const struct nk_tt_fontinfo *info, float height)\n{\n   int fheight = nk_ttSHORT(info->data + info->hhea + 4) - nk_ttSHORT(info->data + info->hhea + 6);\n   return (float) height / (float)fheight;\n}\n\nNK_INTERN float\nnk_tt_ScaleForMappingEmToPixels(const struct nk_tt_fontinfo *info, float pixels)\n{\n   int unitsPerEm = nk_ttUSHORT(info->data + info->head + 18);\n   return pixels / (float)unitsPerEm;\n}\n\n/*-------------------------------------------------------------\n *            antialiasing software rasterizer\n * --------------------------------------------------------------*/\nNK_INTERN void\nnk_tt_GetGlyphBitmapBoxSubpixel(const struct nk_tt_fontinfo *font,\n    int glyph, float scale_x, float scale_y,float shift_x, float shift_y,\n    int *ix0, int *iy0, int *ix1, int *iy1)\n{\n    int x0,y0,x1,y1;\n    if (!nk_tt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) {\n        /* e.g. space character */\n        if (ix0) *ix0 = 0;\n        if (iy0) *iy0 = 0;\n        if (ix1) *ix1 = 0;\n        if (iy1) *iy1 = 0;\n    } else {\n        /* move to integral bboxes (treating pixels as little squares, what pixels get touched)? */\n        if (ix0) *ix0 = nk_ifloorf((float)x0 * scale_x + shift_x);\n        if (iy0) *iy0 = nk_ifloorf((float)-y1 * scale_y + shift_y);\n        if (ix1) *ix1 = nk_iceilf ((float)x1 * scale_x + shift_x);\n        if (iy1) *iy1 = nk_iceilf ((float)-y0 * scale_y + shift_y);\n    }\n}\n\nNK_INTERN void\nnk_tt_GetGlyphBitmapBox(const struct nk_tt_fontinfo *font, int glyph,\n    float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   nk_tt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1);\n}\n\n/*-------------------------------------------------------------\n *                          Rasterizer\n * --------------------------------------------------------------*/\nNK_INTERN void*\nnk_tt__hheap_alloc(struct nk_tt__hheap *hh, nk_size size)\n{\n    if (hh->first_free) {\n        void *p = hh->first_free;\n        hh->first_free = * (void **) p;\n        return p;\n    } else {\n        if (hh->num_remaining_in_head_chunk == 0) {\n            int count = (size < 32 ? 2000 : size < 128 ? 800 : 100);\n            struct nk_tt__hheap_chunk *c = (struct nk_tt__hheap_chunk *)\n                hh->alloc.alloc(hh->alloc.userdata, 0,\n                sizeof(struct nk_tt__hheap_chunk) + size * (nk_size)count);\n            if (c == 0) return 0;\n            c->next = hh->head;\n            hh->head = c;\n            hh->num_remaining_in_head_chunk = count;\n        }\n        --hh->num_remaining_in_head_chunk;\n        return (char *) (hh->head) + size * (nk_size)hh->num_remaining_in_head_chunk;\n    }\n}\n\nNK_INTERN void\nnk_tt__hheap_free(struct nk_tt__hheap *hh, void *p)\n{\n    *(void **) p = hh->first_free;\n    hh->first_free = p;\n}\n\nNK_INTERN void\nnk_tt__hheap_cleanup(struct nk_tt__hheap *hh)\n{\n    struct nk_tt__hheap_chunk *c = hh->head;\n    while (c) {\n        struct nk_tt__hheap_chunk *n = c->next;\n        hh->alloc.free(hh->alloc.userdata, c);\n        c = n;\n    }\n}\n\nNK_INTERN struct nk_tt__active_edge*\nnk_tt__new_active(struct nk_tt__hheap *hh, struct nk_tt__edge *e,\n    int off_x, float start_point)\n{\n    struct nk_tt__active_edge *z = (struct nk_tt__active_edge *)\n        nk_tt__hheap_alloc(hh, sizeof(*z));\n    float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);\n    /*STBTT_assert(e->y0 <= start_point); */\n    if (!z) return z;\n    z->fdx = dxdy;\n    z->fdy = (dxdy != 0) ? (1/dxdy): 0;\n    z->fx = e->x0 + dxdy * (start_point - e->y0);\n    z->fx -= (float)off_x;\n    z->direction = e->invert ? 1.0f : -1.0f;\n    z->sy = e->y0;\n    z->ey = e->y1;\n    z->next = 0;\n    return z;\n}\n\nNK_INTERN void\nnk_tt__handle_clipped_edge(float *scanline, int x, struct nk_tt__active_edge *e,\n    float x0, float y0, float x1, float y1)\n{\n    if (y0 == y1) return;\n    NK_ASSERT(y0 < y1);\n    NK_ASSERT(e->sy <= e->ey);\n    if (y0 > e->ey) return;\n    if (y1 < e->sy) return;\n    if (y0 < e->sy) {\n        x0 += (x1-x0) * (e->sy - y0) / (y1-y0);\n        y0 = e->sy;\n    }\n    if (y1 > e->ey) {\n        x1 += (x1-x0) * (e->ey - y1) / (y1-y0);\n        y1 = e->ey;\n    }\n\n    if (x0 == x) NK_ASSERT(x1 <= x+1);\n    else if (x0 == x+1) NK_ASSERT(x1 >= x);\n    else if (x0 <= x) NK_ASSERT(x1 <= x);\n    else if (x0 >= x+1) NK_ASSERT(x1 >= x+1);\n    else NK_ASSERT(x1 >= x && x1 <= x+1);\n\n    if (x0 <= x && x1 <= x)\n        scanline[x] += e->direction * (y1-y0);\n    else if (x0 >= x+1 && x1 >= x+1);\n    else {\n        NK_ASSERT(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1);\n        /* coverage = 1 - average x position */\n        scanline[x] += (float)e->direction * (float)(y1-y0) * (1.0f-((x0-(float)x)+(x1-(float)x))/2.0f);\n    }\n}\n\nNK_INTERN void\nnk_tt__fill_active_edges_new(float *scanline, float *scanline_fill, int len,\n    struct nk_tt__active_edge *e, float y_top)\n{\n    float y_bottom = y_top+1;\n    while (e)\n    {\n        /* brute force every pixel */\n        /* compute intersection points with top & bottom */\n        NK_ASSERT(e->ey >= y_top);\n        if (e->fdx == 0) {\n            float x0 = e->fx;\n            if (x0 < len) {\n                if (x0 >= 0) {\n                    nk_tt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom);\n                    nk_tt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom);\n                } else {\n                    nk_tt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom);\n                }\n            }\n        } else {\n            float x0 = e->fx;\n            float dx = e->fdx;\n            float xb = x0 + dx;\n            float x_top, x_bottom;\n            float y0,y1;\n            float dy = e->fdy;\n            NK_ASSERT(e->sy <= y_bottom && e->ey >= y_top);\n\n            /* compute endpoints of line segment clipped to this scanline (if the */\n            /* line segment starts on this scanline. x0 is the intersection of the */\n            /* line with y_top, but that may be off the line segment. */\n            if (e->sy > y_top) {\n                x_top = x0 + dx * (e->sy - y_top);\n                y0 = e->sy;\n            } else {\n                x_top = x0;\n                y0 = y_top;\n            }\n\n            if (e->ey < y_bottom) {\n                x_bottom = x0 + dx * (e->ey - y_top);\n                y1 = e->ey;\n            } else {\n                x_bottom = xb;\n                y1 = y_bottom;\n            }\n\n            if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len)\n            {\n                /* from here on, we don't have to range check x values */\n                if ((int) x_top == (int) x_bottom) {\n                    float height;\n                    /* simple case, only spans one pixel */\n                    int x = (int) x_top;\n                    height = y1 - y0;\n                    NK_ASSERT(x >= 0 && x < len);\n                    scanline[x] += e->direction * (1.0f-(((float)x_top - (float)x) + ((float)x_bottom-(float)x))/2.0f)  * (float)height;\n                    scanline_fill[x] += e->direction * (float)height; /* everything right of this pixel is filled */\n                } else {\n                    int x,x1,x2;\n                    float y_crossing, step, sign, area;\n                    /* covers 2+ pixels */\n                    if (x_top > x_bottom)\n                    {\n                        /* flip scanline vertically; signed area is the same */\n                        float t;\n                        y0 = y_bottom - (y0 - y_top);\n                        y1 = y_bottom - (y1 - y_top);\n                        t = y0; y0 = y1; y1 = t;\n                        t = x_bottom; x_bottom = x_top; x_top = t;\n                        dx = -dx;\n                        dy = -dy;\n                        t = x0; x0 = xb; xb = t;\n                    }\n\n                    x1 = (int) x_top;\n                    x2 = (int) x_bottom;\n                    /* compute intersection with y axis at x1+1 */\n                    y_crossing = ((float)x1+1 - (float)x0) * (float)dy + (float)y_top;\n\n                    sign = e->direction;\n                    /* area of the rectangle covered from y0..y_crossing */\n                    area = sign * (y_crossing-y0);\n                    /* area of the triangle (x_top,y0), (x+1,y0), (x+1,y_crossing) */\n                    scanline[x1] += area * (1.0f-((float)((float)x_top - (float)x1)+(float)(x1+1-x1))/2.0f);\n\n                    step = sign * dy;\n                    for (x = x1+1; x < x2; ++x) {\n                        scanline[x] += area + step/2;\n                        area += step;\n                    }\n                    y_crossing += (float)dy * (float)(x2 - (x1+1));\n\n                    scanline[x2] += area + sign * (1.0f-((float)(x2-x2)+((float)x_bottom-(float)x2))/2.0f) * (y1-y_crossing);\n                    scanline_fill[x2] += sign * (y1-y0);\n                }\n            }\n            else\n            {\n                /* if edge goes outside of box we're drawing, we require */\n                /* clipping logic. since this does not match the intended use */\n                /* of this library, we use a different, very slow brute */\n                /* force implementation */\n                int x;\n                for (x=0; x < len; ++x)\n                {\n                    /* cases: */\n                    /* */\n                    /* there can be up to two intersections with the pixel. any intersection */\n                    /* with left or right edges can be handled by splitting into two (or three) */\n                    /* regions. intersections with top & bottom do not necessitate case-wise logic. */\n                    /* */\n                    /* the old way of doing this found the intersections with the left & right edges, */\n                    /* then used some simple logic to produce up to three segments in sorted order */\n                    /* from top-to-bottom. however, this had a problem: if an x edge was epsilon */\n                    /* across the x border, then the corresponding y position might not be distinct */\n                    /* from the other y segment, and it might ignored as an empty segment. to avoid */\n                    /* that, we need to explicitly produce segments based on x positions. */\n\n                    /* rename variables to clear pairs */\n                    float ya = y_top;\n                    float x1 = (float) (x);\n                    float x2 = (float) (x+1);\n                    float x3 = xb;\n                    float y3 = y_bottom;\n                    float yb,y2;\n\n                    yb = ((float)x - x0) / dx + y_top;\n                    y2 = ((float)x+1 - x0) / dx + y_top;\n\n                    if (x0 < x1 && x3 > x2) {         /* three segments descending down-right */\n                        nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x1,yb);\n                        nk_tt__handle_clipped_edge(scanline,x,e, x1,yb, x2,y2);\n                        nk_tt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);\n                    } else if (x3 < x1 && x0 > x2) {  /* three segments descending down-left */\n                        nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x2,y2);\n                        nk_tt__handle_clipped_edge(scanline,x,e, x2,y2, x1,yb);\n                        nk_tt__handle_clipped_edge(scanline,x,e, x1,yb, x3,y3);\n                    } else if (x0 < x1 && x3 > x1) {  /* two segments across x, down-right */\n                        nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x1,yb);\n                        nk_tt__handle_clipped_edge(scanline,x,e, x1,yb, x3,y3);\n                    } else if (x3 < x1 && x0 > x1) {  /* two segments across x, down-left */\n                        nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x1,yb);\n                        nk_tt__handle_clipped_edge(scanline,x,e, x1,yb, x3,y3);\n                    } else if (x0 < x2 && x3 > x2) {  /* two segments across x+1, down-right */\n                        nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x2,y2);\n                        nk_tt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);\n                    } else if (x3 < x2 && x0 > x2) {  /* two segments across x+1, down-left */\n                        nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x2,y2);\n                        nk_tt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);\n                    } else {  /* one segment */\n                        nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x3,y3);\n                    }\n                }\n            }\n        }\n        e = e->next;\n    }\n}\n\n/* directly AA rasterize edges w/o supersampling */\nNK_INTERN void\nnk_tt__rasterize_sorted_edges(struct nk_tt__bitmap *result, struct nk_tt__edge *e,\n    int n, int vsubsample, int off_x, int off_y, struct nk_allocator *alloc)\n{\n    struct nk_tt__hheap hh;\n    struct nk_tt__active_edge *active = 0;\n    int y,j=0, i;\n    float scanline_data[129], *scanline, *scanline2;\n\n    NK_UNUSED(vsubsample);\n    nk_zero_struct(hh);\n    hh.alloc = *alloc;\n\n    if (result->w > 64)\n        scanline = (float *) alloc->alloc(alloc->userdata,0, (nk_size)(result->w*2+1) * sizeof(float));\n    else scanline = scanline_data;\n\n    scanline2 = scanline + result->w;\n    y = off_y;\n    e[n].y0 = (float) (off_y + result->h) + 1;\n\n    while (j < result->h)\n    {\n        /* find center of pixel for this scanline */\n        float scan_y_top    = (float)y + 0.0f;\n        float scan_y_bottom = (float)y + 1.0f;\n        struct nk_tt__active_edge **step = &active;\n\n        NK_MEMSET(scanline , 0, (nk_size)result->w*sizeof(scanline[0]));\n        NK_MEMSET(scanline2, 0, (nk_size)(result->w+1)*sizeof(scanline[0]));\n\n        /* update all active edges; */\n        /* remove all active edges that terminate before the top of this scanline */\n        while (*step) {\n            struct nk_tt__active_edge * z = *step;\n            if (z->ey <= scan_y_top) {\n                *step = z->next; /* delete from list */\n                NK_ASSERT(z->direction);\n                z->direction = 0;\n                nk_tt__hheap_free(&hh, z);\n            } else {\n                step = &((*step)->next); /* advance through list */\n            }\n        }\n\n        /* insert all edges that start before the bottom of this scanline */\n        while (e->y0 <= scan_y_bottom) {\n            if (e->y0 != e->y1) {\n                struct nk_tt__active_edge *z = nk_tt__new_active(&hh, e, off_x, scan_y_top);\n                if (z != 0) {\n                    NK_ASSERT(z->ey >= scan_y_top);\n                    /* insert at front */\n                    z->next = active;\n                    active = z;\n                }\n            }\n            ++e;\n        }\n\n        /* now process all active edges */\n        if (active)\n            nk_tt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top);\n\n        {\n            float sum = 0;\n            for (i=0; i < result->w; ++i) {\n                float k;\n                int m;\n                sum += scanline2[i];\n                k = scanline[i] + sum;\n                k = (float) NK_ABS(k) * 255.0f + 0.5f;\n                m = (int) k;\n                if (m > 255) m = 255;\n                result->pixels[j*result->stride + i] = (unsigned char) m;\n            }\n        }\n        /* advance all the edges */\n        step = &active;\n        while (*step) {\n            struct nk_tt__active_edge *z = *step;\n            z->fx += z->fdx; /* advance to position for current scanline */\n            step = &((*step)->next); /* advance through list */\n        }\n        ++y;\n        ++j;\n    }\n    nk_tt__hheap_cleanup(&hh);\n    if (scanline != scanline_data)\n        alloc->free(alloc->userdata, scanline);\n}\n\n#define NK_TT__COMPARE(a,b)  ((a)->y0 < (b)->y0)\nNK_INTERN void\nnk_tt__sort_edges_ins_sort(struct nk_tt__edge *p, int n)\n{\n    int i,j;\n    for (i=1; i < n; ++i) {\n        struct nk_tt__edge t = p[i], *a = &t;\n        j = i;\n        while (j > 0) {\n            struct nk_tt__edge *b = &p[j-1];\n            int c = NK_TT__COMPARE(a,b);\n            if (!c) break;\n            p[j] = p[j-1];\n            --j;\n        }\n        if (i != j)\n            p[j] = t;\n    }\n}\n\nNK_INTERN void\nnk_tt__sort_edges_quicksort(struct nk_tt__edge *p, int n)\n{\n    /* threshold for transitioning to insertion sort */\n    while (n > 12) {\n        struct nk_tt__edge t;\n        int c01,c12,c,m,i,j;\n\n        /* compute median of three */\n        m = n >> 1;\n        c01 = NK_TT__COMPARE(&p[0],&p[m]);\n        c12 = NK_TT__COMPARE(&p[m],&p[n-1]);\n\n        /* if 0 >= mid >= end, or 0 < mid < end, then use mid */\n        if (c01 != c12) {\n            /* otherwise, we'll need to swap something else to middle */\n            int z;\n            c = NK_TT__COMPARE(&p[0],&p[n-1]);\n            /* 0>mid && mid<n:  0>n => n; 0<n => 0 */\n            /* 0<mid && mid>n:  0>n => 0; 0<n => n */\n            z = (c == c12) ? 0 : n-1;\n            t = p[z];\n            p[z] = p[m];\n            p[m] = t;\n        }\n\n        /* now p[m] is the median-of-three */\n        /* swap it to the beginning so it won't move around */\n        t = p[0];\n        p[0] = p[m];\n        p[m] = t;\n\n        /* partition loop */\n        i=1;\n        j=n-1;\n        for(;;) {\n            /* handling of equality is crucial here */\n            /* for sentinels & efficiency with duplicates */\n            for (;;++i) {\n                if (!NK_TT__COMPARE(&p[i], &p[0])) break;\n            }\n            for (;;--j) {\n                if (!NK_TT__COMPARE(&p[0], &p[j])) break;\n            }\n\n            /* make sure we haven't crossed */\n             if (i >= j) break;\n             t = p[i];\n             p[i] = p[j];\n             p[j] = t;\n\n            ++i;\n            --j;\n\n        }\n\n        /* recurse on smaller side, iterate on larger */\n        if (j < (n-i)) {\n            nk_tt__sort_edges_quicksort(p,j);\n            p = p+i;\n            n = n-i;\n        } else {\n            nk_tt__sort_edges_quicksort(p+i, n-i);\n            n = j;\n        }\n    }\n}\n\nNK_INTERN void\nnk_tt__sort_edges(struct nk_tt__edge *p, int n)\n{\n   nk_tt__sort_edges_quicksort(p, n);\n   nk_tt__sort_edges_ins_sort(p, n);\n}\n\nNK_INTERN void\nnk_tt__rasterize(struct nk_tt__bitmap *result, struct nk_tt__point *pts,\n    int *wcount, int windings, float scale_x, float scale_y,\n    float shift_x, float shift_y, int off_x, int off_y, int invert,\n    struct nk_allocator *alloc)\n{\n    float y_scale_inv = invert ? -scale_y : scale_y;\n    struct nk_tt__edge *e;\n    int n,i,j,k,m;\n    int vsubsample = 1;\n    /* vsubsample should divide 255 evenly; otherwise we won't reach full opacity */\n\n    /* now we have to blow out the windings into explicit edge lists */\n    n = 0;\n    for (i=0; i < windings; ++i)\n        n += wcount[i];\n\n    e = (struct nk_tt__edge*)\n       alloc->alloc(alloc->userdata, 0,(sizeof(*e) * (nk_size)(n+1)));\n    if (e == 0) return;\n    n = 0;\n\n    m=0;\n    for (i=0; i < windings; ++i)\n    {\n        struct nk_tt__point *p = pts + m;\n        m += wcount[i];\n        j = wcount[i]-1;\n        for (k=0; k < wcount[i]; j=k++) {\n            int a=k,b=j;\n            /* skip the edge if horizontal */\n            if (p[j].y == p[k].y)\n                continue;\n\n            /* add edge from j to k to the list */\n            e[n].invert = 0;\n            if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) {\n                e[n].invert = 1;\n                a=j,b=k;\n            }\n            e[n].x0 = p[a].x * scale_x + shift_x;\n            e[n].y0 = (p[a].y * y_scale_inv + shift_y) * (float)vsubsample;\n            e[n].x1 = p[b].x * scale_x + shift_x;\n            e[n].y1 = (p[b].y * y_scale_inv + shift_y) * (float)vsubsample;\n            ++n;\n        }\n    }\n\n    /* now sort the edges by their highest point (should snap to integer, and then by x) */\n    /*STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); */\n    nk_tt__sort_edges(e, n);\n    /* now, traverse the scanlines and find the intersections on each scanline, use xor winding rule */\n    nk_tt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, alloc);\n    alloc->free(alloc->userdata, e);\n}\n\nNK_INTERN void\nnk_tt__add_point(struct nk_tt__point *points, int n, float x, float y)\n{\n    if (!points) return; /* during first pass, it's unallocated */\n    points[n].x = x;\n    points[n].y = y;\n}\n\nNK_INTERN int\nnk_tt__tesselate_curve(struct nk_tt__point *points, int *num_points,\n    float x0, float y0, float x1, float y1, float x2, float y2,\n    float objspace_flatness_squared, int n)\n{\n    /* tesselate until threshold p is happy...\n     * @TODO warped to compensate for non-linear stretching */\n    /* midpoint */\n    float mx = (x0 + 2*x1 + x2)/4;\n    float my = (y0 + 2*y1 + y2)/4;\n    /* versus directly drawn line */\n    float dx = (x0+x2)/2 - mx;\n    float dy = (y0+y2)/2 - my;\n    if (n > 16) /* 65536 segments on one curve better be enough! */\n        return 1;\n\n    /* half-pixel error allowed... need to be smaller if AA */\n    if (dx*dx+dy*dy > objspace_flatness_squared) {\n        nk_tt__tesselate_curve(points, num_points, x0,y0,\n            (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1);\n        nk_tt__tesselate_curve(points, num_points, mx,my,\n            (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1);\n    } else {\n        nk_tt__add_point(points, *num_points,x2,y2);\n        *num_points = *num_points+1;\n    }\n    return 1;\n}\n\n/* returns number of contours */\nNK_INTERN struct nk_tt__point*\nnk_tt_FlattenCurves(struct nk_tt_vertex *vertices, int num_verts,\n    float objspace_flatness, int **contour_lengths, int *num_contours,\n    struct nk_allocator *alloc)\n{\n    struct nk_tt__point *points=0;\n    int num_points=0;\n    float objspace_flatness_squared = objspace_flatness * objspace_flatness;\n    int i;\n    int n=0;\n    int start=0;\n    int pass;\n\n    /* count how many \"moves\" there are to get the contour count */\n    for (i=0; i < num_verts; ++i)\n        if (vertices[i].type == NK_TT_vmove) ++n;\n\n    *num_contours = n;\n    if (n == 0) return 0;\n\n    *contour_lengths = (int *)\n        alloc->alloc(alloc->userdata,0, (sizeof(**contour_lengths) * (nk_size)n));\n    if (*contour_lengths == 0) {\n        *num_contours = 0;\n        return 0;\n    }\n\n    /* make two passes through the points so we don't need to realloc */\n    for (pass=0; pass < 2; ++pass)\n    {\n        float x=0,y=0;\n        if (pass == 1) {\n            points = (struct nk_tt__point *)\n                alloc->alloc(alloc->userdata,0, (nk_size)num_points * sizeof(points[0]));\n            if (points == 0) goto error;\n        }\n        num_points = 0;\n        n= -1;\n\n        for (i=0; i < num_verts; ++i)\n        {\n            switch (vertices[i].type) {\n            case NK_TT_vmove:\n                /* start the next contour */\n                if (n >= 0)\n                (*contour_lengths)[n] = num_points - start;\n                ++n;\n                start = num_points;\n\n                x = vertices[i].x, y = vertices[i].y;\n                nk_tt__add_point(points, num_points++, x,y);\n                break;\n            case NK_TT_vline:\n               x = vertices[i].x, y = vertices[i].y;\n               nk_tt__add_point(points, num_points++, x, y);\n               break;\n            case NK_TT_vcurve:\n               nk_tt__tesselate_curve(points, &num_points, x,y,\n                                        vertices[i].cx, vertices[i].cy,\n                                        vertices[i].x,  vertices[i].y,\n                                        objspace_flatness_squared, 0);\n               x = vertices[i].x, y = vertices[i].y;\n               break;\n            default: break;\n         }\n      }\n      (*contour_lengths)[n] = num_points - start;\n   }\n   return points;\n\nerror:\n   alloc->free(alloc->userdata, points);\n   alloc->free(alloc->userdata, *contour_lengths);\n   *contour_lengths = 0;\n   *num_contours = 0;\n   return 0;\n}\n\nNK_INTERN void\nnk_tt_Rasterize(struct nk_tt__bitmap *result, float flatness_in_pixels,\n    struct nk_tt_vertex *vertices, int num_verts,\n    float scale_x, float scale_y, float shift_x, float shift_y,\n    int x_off, int y_off, int invert, struct nk_allocator *alloc)\n{\n    float scale = scale_x > scale_y ? scale_y : scale_x;\n    int winding_count, *winding_lengths;\n    struct nk_tt__point *windings = nk_tt_FlattenCurves(vertices, num_verts,\n        flatness_in_pixels / scale, &winding_lengths, &winding_count, alloc);\n\n    NK_ASSERT(alloc);\n    if (windings) {\n        nk_tt__rasterize(result, windings, winding_lengths, winding_count,\n            scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, alloc);\n        alloc->free(alloc->userdata, winding_lengths);\n        alloc->free(alloc->userdata, windings);\n    }\n}\n\nNK_INTERN void\nnk_tt_MakeGlyphBitmapSubpixel(const struct nk_tt_fontinfo *info, unsigned char *output,\n    int out_w, int out_h, int out_stride, float scale_x, float scale_y,\n    float shift_x, float shift_y, int glyph, struct nk_allocator *alloc)\n{\n    int ix0,iy0;\n    struct nk_tt_vertex *vertices;\n    int num_verts = nk_tt_GetGlyphShape(info, alloc, glyph, &vertices);\n    struct nk_tt__bitmap gbm;\n\n    nk_tt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x,\n        shift_y, &ix0,&iy0,0,0);\n    gbm.pixels = output;\n    gbm.w = out_w;\n    gbm.h = out_h;\n    gbm.stride = out_stride;\n\n    if (gbm.w && gbm.h)\n        nk_tt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y,\n            shift_x, shift_y, ix0,iy0, 1, alloc);\n    alloc->free(alloc->userdata, vertices);\n}\n\n/*-------------------------------------------------------------\n *                          Bitmap baking\n * --------------------------------------------------------------*/\nNK_INTERN int\nnk_tt_PackBegin(struct nk_tt_pack_context *spc, unsigned char *pixels,\n    int pw, int ph, int stride_in_bytes, int padding, struct nk_allocator *alloc)\n{\n    int num_nodes = pw - padding;\n    struct nk_rp_context *context = (struct nk_rp_context *)\n        alloc->alloc(alloc->userdata,0, sizeof(*context));\n    struct nk_rp_node *nodes = (struct nk_rp_node*)\n        alloc->alloc(alloc->userdata,0, (sizeof(*nodes  ) * (nk_size)num_nodes));\n\n    if (context == 0 || nodes == 0) {\n        if (context != 0) alloc->free(alloc->userdata, context);\n        if (nodes   != 0) alloc->free(alloc->userdata, nodes);\n        return 0;\n    }\n\n    spc->width = pw;\n    spc->height = ph;\n    spc->pixels = pixels;\n    spc->pack_info = context;\n    spc->nodes = nodes;\n    spc->padding = padding;\n    spc->stride_in_bytes = (stride_in_bytes != 0) ? stride_in_bytes : pw;\n    spc->h_oversample = 1;\n    spc->v_oversample = 1;\n\n    nk_rp_init_target(context, pw-padding, ph-padding, nodes, num_nodes);\n    if (pixels)\n        NK_MEMSET(pixels, 0, (nk_size)(pw*ph)); /* background of 0 around pixels */\n    return 1;\n}\n\nNK_INTERN void\nnk_tt_PackEnd(struct nk_tt_pack_context *spc, struct nk_allocator *alloc)\n{\n    alloc->free(alloc->userdata, spc->nodes);\n    alloc->free(alloc->userdata, spc->pack_info);\n}\n\nNK_INTERN void\nnk_tt_PackSetOversampling(struct nk_tt_pack_context *spc,\n    unsigned int h_oversample, unsigned int v_oversample)\n{\n   NK_ASSERT(h_oversample <= NK_TT_MAX_OVERSAMPLE);\n   NK_ASSERT(v_oversample <= NK_TT_MAX_OVERSAMPLE);\n   if (h_oversample <= NK_TT_MAX_OVERSAMPLE)\n      spc->h_oversample = h_oversample;\n   if (v_oversample <= NK_TT_MAX_OVERSAMPLE)\n      spc->v_oversample = v_oversample;\n}\n\nNK_INTERN void\nnk_tt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes,\n    int kernel_width)\n{\n    unsigned char buffer[NK_TT_MAX_OVERSAMPLE];\n    int safe_w = w - kernel_width;\n    int j;\n\n    for (j=0; j < h; ++j)\n    {\n        int i;\n        unsigned int total;\n        NK_MEMSET(buffer, 0, (nk_size)kernel_width);\n\n        total = 0;\n\n        /* make kernel_width a constant in common cases so compiler can optimize out the divide */\n        switch (kernel_width) {\n        case 2:\n            for (i=0; i <= safe_w; ++i) {\n                total += (unsigned int)(pixels[i] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i];\n                pixels[i] = (unsigned char) (total / 2);\n            }\n            break;\n        case 3:\n            for (i=0; i <= safe_w; ++i) {\n                total += (unsigned int)(pixels[i] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i];\n                pixels[i] = (unsigned char) (total / 3);\n            }\n            break;\n        case 4:\n            for (i=0; i <= safe_w; ++i) {\n                total += (unsigned int)pixels[i] - buffer[i & NK_TT__OVER_MASK];\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i];\n                pixels[i] = (unsigned char) (total / 4);\n            }\n            break;\n        case 5:\n            for (i=0; i <= safe_w; ++i) {\n                total += (unsigned int)(pixels[i] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i];\n                pixels[i] = (unsigned char) (total / 5);\n            }\n            break;\n        default:\n            for (i=0; i <= safe_w; ++i) {\n                total += (unsigned int)(pixels[i] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i];\n                pixels[i] = (unsigned char) (total / (unsigned int)kernel_width);\n            }\n            break;\n        }\n\n        for (; i < w; ++i) {\n            NK_ASSERT(pixels[i] == 0);\n            total -= (unsigned int)(buffer[i & NK_TT__OVER_MASK]);\n            pixels[i] = (unsigned char) (total / (unsigned int)kernel_width);\n        }\n        pixels += stride_in_bytes;\n    }\n}\n\nNK_INTERN void\nnk_tt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes,\n    int kernel_width)\n{\n    unsigned char buffer[NK_TT_MAX_OVERSAMPLE];\n    int safe_h = h - kernel_width;\n    int j;\n\n    for (j=0; j < w; ++j)\n    {\n        int i;\n        unsigned int total;\n        NK_MEMSET(buffer, 0, (nk_size)kernel_width);\n\n        total = 0;\n\n        /* make kernel_width a constant in common cases so compiler can optimize out the divide */\n        switch (kernel_width) {\n        case 2:\n            for (i=0; i <= safe_h; ++i) {\n                total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes];\n                pixels[i*stride_in_bytes] = (unsigned char) (total / 2);\n            }\n            break;\n         case 3:\n            for (i=0; i <= safe_h; ++i) {\n                total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes];\n                pixels[i*stride_in_bytes] = (unsigned char) (total / 3);\n            }\n            break;\n         case 4:\n            for (i=0; i <= safe_h; ++i) {\n                total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes];\n                pixels[i*stride_in_bytes] = (unsigned char) (total / 4);\n            }\n            break;\n         case 5:\n            for (i=0; i <= safe_h; ++i) {\n                total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes];\n                pixels[i*stride_in_bytes] = (unsigned char) (total / 5);\n            }\n            break;\n         default:\n            for (i=0; i <= safe_h; ++i) {\n                total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]);\n                buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes];\n                pixels[i*stride_in_bytes] = (unsigned char) (total / (unsigned int)kernel_width);\n            }\n            break;\n        }\n\n        for (; i < h; ++i) {\n            NK_ASSERT(pixels[i*stride_in_bytes] == 0);\n            total -= (unsigned int)(buffer[i & NK_TT__OVER_MASK]);\n            pixels[i*stride_in_bytes] = (unsigned char) (total / (unsigned int)kernel_width);\n        }\n        pixels += 1;\n    }\n}\n\nNK_INTERN float\nnk_tt__oversample_shift(int oversample)\n{\n    if (!oversample)\n        return 0.0f;\n\n    /* The prefilter is a box filter of width \"oversample\", */\n    /* which shifts phase by (oversample - 1)/2 pixels in */\n    /* oversampled space. We want to shift in the opposite */\n    /* direction to counter this. */\n    return (float)-(oversample - 1) / (2.0f * (float)oversample);\n}\n\n/* rects array must be big enough to accommodate all characters in the given ranges */\nNK_INTERN int\nnk_tt_PackFontRangesGatherRects(struct nk_tt_pack_context *spc,\n    struct nk_tt_fontinfo *info, struct nk_tt_pack_range *ranges,\n    int num_ranges, struct nk_rp_rect *rects)\n{\n    int i,j,k;\n    k = 0;\n\n    for (i=0; i < num_ranges; ++i) {\n        float fh = ranges[i].font_size;\n        float scale = (fh > 0) ? nk_tt_ScaleForPixelHeight(info, fh):\n            nk_tt_ScaleForMappingEmToPixels(info, -fh);\n        ranges[i].h_oversample = (unsigned char) spc->h_oversample;\n        ranges[i].v_oversample = (unsigned char) spc->v_oversample;\n        for (j=0; j < ranges[i].num_chars; ++j) {\n            int x0,y0,x1,y1;\n            int codepoint = ranges[i].first_unicode_codepoint_in_range ?\n                ranges[i].first_unicode_codepoint_in_range + j :\n                ranges[i].array_of_unicode_codepoints[j];\n\n            int glyph = nk_tt_FindGlyphIndex(info, codepoint);\n            nk_tt_GetGlyphBitmapBoxSubpixel(info,glyph, scale * (float)spc->h_oversample,\n                scale * (float)spc->v_oversample, 0,0, &x0,&y0,&x1,&y1);\n            rects[k].w = (nk_rp_coord) (x1-x0 + spc->padding + (int)spc->h_oversample-1);\n            rects[k].h = (nk_rp_coord) (y1-y0 + spc->padding + (int)spc->v_oversample-1);\n            ++k;\n        }\n    }\n    return k;\n}\n\nNK_INTERN int\nnk_tt_PackFontRangesRenderIntoRects(struct nk_tt_pack_context *spc,\n    struct nk_tt_fontinfo *info, struct nk_tt_pack_range *ranges,\n    int num_ranges, struct nk_rp_rect *rects, struct nk_allocator *alloc)\n{\n    int i,j,k, return_value = 1;\n    /* save current values */\n    int old_h_over = (int)spc->h_oversample;\n    int old_v_over = (int)spc->v_oversample;\n    /* rects array must be big enough to accommodate all characters in the given ranges */\n\n    k = 0;\n    for (i=0; i < num_ranges; ++i)\n    {\n        float fh = ranges[i].font_size;\n        float recip_h,recip_v,sub_x,sub_y;\n        float scale = fh > 0 ? nk_tt_ScaleForPixelHeight(info, fh):\n            nk_tt_ScaleForMappingEmToPixels(info, -fh);\n\n        spc->h_oversample = ranges[i].h_oversample;\n        spc->v_oversample = ranges[i].v_oversample;\n\n        recip_h = 1.0f / (float)spc->h_oversample;\n        recip_v = 1.0f / (float)spc->v_oversample;\n\n        sub_x = nk_tt__oversample_shift((int)spc->h_oversample);\n        sub_y = nk_tt__oversample_shift((int)spc->v_oversample);\n\n        for (j=0; j < ranges[i].num_chars; ++j)\n        {\n            struct nk_rp_rect *r = &rects[k];\n            if (r->was_packed)\n            {\n                struct nk_tt_packedchar *bc = &ranges[i].chardata_for_range[j];\n                int advance, lsb, x0,y0,x1,y1;\n                int codepoint = ranges[i].first_unicode_codepoint_in_range ?\n                    ranges[i].first_unicode_codepoint_in_range + j :\n                    ranges[i].array_of_unicode_codepoints[j];\n                int glyph = nk_tt_FindGlyphIndex(info, codepoint);\n                nk_rp_coord pad = (nk_rp_coord) spc->padding;\n\n                /* pad on left and top */\n                r->x = (nk_rp_coord)((int)r->x + (int)pad);\n                r->y = (nk_rp_coord)((int)r->y + (int)pad);\n                r->w = (nk_rp_coord)((int)r->w - (int)pad);\n                r->h = (nk_rp_coord)((int)r->h - (int)pad);\n\n                nk_tt_GetGlyphHMetrics(info, glyph, &advance, &lsb);\n                nk_tt_GetGlyphBitmapBox(info, glyph, scale * (float)spc->h_oversample,\n                        (scale * (float)spc->v_oversample), &x0,&y0,&x1,&y1);\n                nk_tt_MakeGlyphBitmapSubpixel(info, spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                    (int)(r->w - spc->h_oversample+1), (int)(r->h - spc->v_oversample+1),\n                    spc->stride_in_bytes, scale * (float)spc->h_oversample,\n                    scale * (float)spc->v_oversample, 0,0, glyph, alloc);\n\n                if (spc->h_oversample > 1)\n                   nk_tt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                        r->w, r->h, spc->stride_in_bytes, (int)spc->h_oversample);\n\n                if (spc->v_oversample > 1)\n                   nk_tt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                        r->w, r->h, spc->stride_in_bytes, (int)spc->v_oversample);\n\n                bc->x0       = (nk_ushort)  r->x;\n                bc->y0       = (nk_ushort)  r->y;\n                bc->x1       = (nk_ushort) (r->x + r->w);\n                bc->y1       = (nk_ushort) (r->y + r->h);\n                bc->xadvance = scale * (float)advance;\n                bc->xoff     = (float)  x0 * recip_h + sub_x;\n                bc->yoff     = (float)  y0 * recip_v + sub_y;\n                bc->xoff2    = ((float)x0 + r->w) * recip_h + sub_x;\n                bc->yoff2    = ((float)y0 + r->h) * recip_v + sub_y;\n            } else {\n                return_value = 0; /* if any fail, report failure */\n            }\n            ++k;\n        }\n    }\n    /* restore original values */\n    spc->h_oversample = (unsigned int)old_h_over;\n    spc->v_oversample = (unsigned int)old_v_over;\n    return return_value;\n}\n\nNK_INTERN void\nnk_tt_GetPackedQuad(struct nk_tt_packedchar *chardata, int pw, int ph,\n    int char_index, float *xpos, float *ypos, struct nk_tt_aligned_quad *q,\n    int align_to_integer)\n{\n    float ipw = 1.0f / (float)pw, iph = 1.0f / (float)ph;\n    struct nk_tt_packedchar *b = (struct nk_tt_packedchar*)(chardata + char_index);\n    if (align_to_integer) {\n        int tx = nk_ifloorf((*xpos + b->xoff) + 0.5f);\n        int ty = nk_ifloorf((*ypos + b->yoff) + 0.5f);\n\n        float x = (float)tx;\n        float y = (float)ty;\n\n        q->x0 = x;\n        q->y0 = y;\n        q->x1 = x + b->xoff2 - b->xoff;\n        q->y1 = y + b->yoff2 - b->yoff;\n    } else {\n        q->x0 = *xpos + b->xoff;\n        q->y0 = *ypos + b->yoff;\n        q->x1 = *xpos + b->xoff2;\n        q->y1 = *ypos + b->yoff2;\n    }\n    q->s0 = b->x0 * ipw;\n    q->t0 = b->y0 * iph;\n    q->s1 = b->x1 * ipw;\n    q->t1 = b->y1 * iph;\n    *xpos += b->xadvance;\n}\n\n/* -------------------------------------------------------------\n *\n *                          FONT BAKING\n *\n * --------------------------------------------------------------*/\nstruct nk_font_bake_data {\n    struct nk_tt_fontinfo info;\n    struct nk_rp_rect *rects;\n    struct nk_tt_pack_range *ranges;\n    nk_rune range_count;\n};\n\nstruct nk_font_baker {\n    struct nk_allocator alloc;\n    struct nk_tt_pack_context spc;\n    struct nk_font_bake_data *build;\n    struct nk_tt_packedchar *packed_chars;\n    struct nk_rp_rect *rects;\n    struct nk_tt_pack_range *ranges;\n};\n\nNK_GLOBAL const nk_size nk_rect_align = NK_ALIGNOF(struct nk_rp_rect);\nNK_GLOBAL const nk_size nk_range_align = NK_ALIGNOF(struct nk_tt_pack_range);\nNK_GLOBAL const nk_size nk_char_align = NK_ALIGNOF(struct nk_tt_packedchar);\nNK_GLOBAL const nk_size nk_build_align = NK_ALIGNOF(struct nk_font_bake_data);\nNK_GLOBAL const nk_size nk_baker_align = NK_ALIGNOF(struct nk_font_baker);\n\nNK_INTERN int\nnk_range_count(const nk_rune *range)\n{\n    const nk_rune *iter = range;\n    NK_ASSERT(range);\n    if (!range) return 0;\n    while (*(iter++) != 0);\n    return (iter == range) ? 0 : (int)((iter - range)/2);\n}\n\nNK_INTERN int\nnk_range_glyph_count(const nk_rune *range, int count)\n{\n    int i = 0;\n    int total_glyphs = 0;\n    for (i = 0; i < count; ++i) {\n        int diff;\n        nk_rune f = range[(i*2)+0];\n        nk_rune t = range[(i*2)+1];\n        NK_ASSERT(t >= f);\n        diff = (int)((t - f) + 1);\n        total_glyphs += diff;\n    }\n    return total_glyphs;\n}\n\nNK_API const nk_rune*\nnk_font_default_glyph_ranges(void)\n{\n    NK_STORAGE const nk_rune ranges[] = {0x0020, 0x00FF, 0};\n    return ranges;\n}\n\nNK_API const nk_rune*\nnk_font_chinese_glyph_ranges(void)\n{\n    NK_STORAGE const nk_rune ranges[] = {\n        0x0020, 0x00FF,\n        0x3000, 0x30FF,\n        0x31F0, 0x31FF,\n        0xFF00, 0xFFEF,\n        0x4e00, 0x9FAF,\n        0\n    };\n    return ranges;\n}\n\nNK_API const nk_rune*\nnk_font_cyrillic_glyph_ranges(void)\n{\n    NK_STORAGE const nk_rune ranges[] = {\n        0x0020, 0x00FF,\n        0x0400, 0x052F,\n        0x2DE0, 0x2DFF,\n        0xA640, 0xA69F,\n        0\n    };\n    return ranges;\n}\n\nNK_API const nk_rune*\nnk_font_korean_glyph_ranges(void)\n{\n    NK_STORAGE const nk_rune ranges[] = {\n        0x0020, 0x00FF,\n        0x3131, 0x3163,\n        0xAC00, 0xD79D,\n        0\n    };\n    return ranges;\n}\n\nNK_INTERN void\nnk_font_baker_memory(nk_size *temp, int *glyph_count,\n    struct nk_font_config *config_list, int count)\n{\n    int range_count = 0;\n    int total_range_count = 0;\n    struct nk_font_config *iter;\n\n    NK_ASSERT(config_list);\n    NK_ASSERT(glyph_count);\n    if (!config_list) {\n        *temp = 0;\n        *glyph_count = 0;\n        return;\n    }\n\n    *glyph_count = 0;\n    if (!config_list->range)\n        config_list->range = nk_font_default_glyph_ranges();\n    for (iter = config_list; iter; iter = iter->next) {\n        range_count = nk_range_count(iter->range);\n        total_range_count += range_count;\n        *glyph_count += nk_range_glyph_count(iter->range, range_count);\n    }\n\n    *temp = (nk_size)*glyph_count * sizeof(struct nk_rp_rect);\n    *temp += (nk_size)total_range_count * sizeof(struct nk_tt_pack_range);\n    *temp += (nk_size)*glyph_count * sizeof(struct nk_tt_packedchar);\n    *temp += (nk_size)count * sizeof(struct nk_font_bake_data);\n    *temp += sizeof(struct nk_font_baker);\n    *temp += nk_rect_align + nk_range_align + nk_char_align;\n    *temp += nk_build_align + nk_baker_align;\n}\n\nNK_INTERN struct nk_font_baker*\nnk_font_baker(void *memory, int glyph_count, int count, struct nk_allocator *alloc)\n{\n    struct nk_font_baker *baker;\n    if (!memory) return 0;\n    /* setup baker inside a memory block  */\n    baker = (struct nk_font_baker*)NK_ALIGN_PTR(memory, nk_baker_align);\n    baker->build = (struct nk_font_bake_data*)NK_ALIGN_PTR((baker + 1), nk_build_align);\n    baker->packed_chars = (struct nk_tt_packedchar*)NK_ALIGN_PTR((baker->build + count), nk_char_align);\n    baker->rects = (struct nk_rp_rect*)NK_ALIGN_PTR((baker->packed_chars + glyph_count), nk_rect_align);\n    baker->ranges = (struct nk_tt_pack_range*)NK_ALIGN_PTR((baker->rects + glyph_count), nk_range_align);\n    baker->alloc = *alloc;\n    return baker;\n}\n\nNK_INTERN int\nnk_font_bake_pack(struct nk_font_baker *baker,\n    nk_size *image_memory, int *width, int *height, struct nk_recti *custom,\n    const struct nk_font_config *config_list, int count,\n    struct nk_allocator *alloc)\n{\n    NK_STORAGE const nk_size max_height = 1024 * 32;\n    const struct nk_font_config *config_iter;\n    int total_glyph_count = 0;\n    int total_range_count = 0;\n    int range_count = 0;\n    int i = 0;\n\n    NK_ASSERT(image_memory);\n    NK_ASSERT(width);\n    NK_ASSERT(height);\n    NK_ASSERT(config_list);\n    NK_ASSERT(count);\n    NK_ASSERT(alloc);\n\n    if (!image_memory || !width || !height || !config_list || !count) return nk_false;\n    for (config_iter = config_list; config_iter; config_iter = config_iter->next) {\n        range_count = nk_range_count(config_iter->range);\n        total_range_count += range_count;\n        total_glyph_count += nk_range_glyph_count(config_iter->range, range_count);\n    }\n\n    /* setup font baker from temporary memory */\n    for (config_iter = config_list; config_iter; config_iter = config_iter->next) {\n        const struct nk_font_config *cfg = config_iter;\n        if (!nk_tt_InitFont(&baker->build[i++].info, (const unsigned char*)cfg->ttf_blob, 0))\n            return nk_false;\n    }\n\n    *height = 0;\n    *width = (total_glyph_count > 1000) ? 1024 : 512;\n    nk_tt_PackBegin(&baker->spc, 0, (int)*width, (int)max_height, 0, 1, alloc);\n    {\n        int input_i = 0;\n        int range_n = 0;\n        int rect_n = 0;\n        int char_n = 0;\n\n        if (custom) {\n            /* pack custom user data first so it will be in the upper left corner*/\n            struct nk_rp_rect custom_space;\n            nk_zero(&custom_space, sizeof(custom_space));\n            custom_space.w = (nk_rp_coord)((custom->w * 2) + 1);\n            custom_space.h = (nk_rp_coord)(custom->h + 1);\n\n            nk_tt_PackSetOversampling(&baker->spc, 1, 1);\n            nk_rp_pack_rects((struct nk_rp_context*)baker->spc.pack_info, &custom_space, 1);\n            *height = NK_MAX(*height, (int)(custom_space.y + custom_space.h));\n\n            custom->x = (short)custom_space.x;\n            custom->y = (short)custom_space.y;\n            custom->w = (short)custom_space.w;\n            custom->h = (short)custom_space.h;\n        }\n\n        /* first font pass: pack all glyphs */\n        for (input_i = 0, config_iter = config_list; input_i < count && config_iter;\n            input_i++, config_iter = config_iter->next)\n        {\n            int n = 0;\n            int glyph_count;\n            const nk_rune *in_range;\n            const struct nk_font_config *cfg = config_iter;\n            struct nk_font_bake_data *tmp = &baker->build[input_i];\n\n            /* count glyphs + ranges in current font */\n            glyph_count = 0; range_count = 0;\n            for (in_range = cfg->range; in_range[0] && in_range[1]; in_range += 2) {\n                glyph_count += (int)(in_range[1] - in_range[0]) + 1;\n                range_count++;\n            }\n\n            /* setup ranges  */\n            tmp->ranges = baker->ranges + range_n;\n            tmp->range_count = (nk_rune)range_count;\n            range_n += range_count;\n            for (i = 0; i < range_count; ++i) {\n                in_range = &cfg->range[i * 2];\n                tmp->ranges[i].font_size = cfg->size;\n                tmp->ranges[i].first_unicode_codepoint_in_range = (int)in_range[0];\n                tmp->ranges[i].num_chars = (int)(in_range[1]- in_range[0]) + 1;\n                tmp->ranges[i].chardata_for_range = baker->packed_chars + char_n;\n                char_n += tmp->ranges[i].num_chars;\n            }\n\n            /* pack */\n            tmp->rects = baker->rects + rect_n;\n            rect_n += glyph_count;\n            nk_tt_PackSetOversampling(&baker->spc, cfg->oversample_h, cfg->oversample_v);\n            n = nk_tt_PackFontRangesGatherRects(&baker->spc, &tmp->info,\n                tmp->ranges, (int)tmp->range_count, tmp->rects);\n            nk_rp_pack_rects((struct nk_rp_context*)baker->spc.pack_info, tmp->rects, (int)n);\n\n            /* texture height */\n            for (i = 0; i < n; ++i) {\n                if (tmp->rects[i].was_packed)\n                    *height = NK_MAX(*height, tmp->rects[i].y + tmp->rects[i].h);\n            }\n        }\n        NK_ASSERT(rect_n == total_glyph_count);\n        NK_ASSERT(char_n == total_glyph_count);\n        NK_ASSERT(range_n == total_range_count);\n    }\n    *height = (int)nk_round_up_pow2((nk_uint)*height);\n    *image_memory = (nk_size)(*width) * (nk_size)(*height);\n    return nk_true;\n}\n\nNK_INTERN void\nnk_font_bake(struct nk_font_baker *baker, void *image_memory, int width, int height,\n    struct nk_font_glyph *glyphs, int glyphs_count,\n    const struct nk_font_config *config_list, int font_count)\n{\n    int input_i = 0;\n    nk_rune glyph_n = 0;\n    const struct nk_font_config *config_iter;\n\n    NK_ASSERT(image_memory);\n    NK_ASSERT(width);\n    NK_ASSERT(height);\n    NK_ASSERT(config_list);\n    NK_ASSERT(baker);\n    NK_ASSERT(font_count);\n    NK_ASSERT(glyphs_count);\n    if (!image_memory || !width || !height || !config_list ||\n        !font_count || !glyphs || !glyphs_count)\n        return;\n\n    /* second font pass: render glyphs */\n    nk_zero(image_memory, (nk_size)((nk_size)width * (nk_size)height));\n    baker->spc.pixels = (unsigned char*)image_memory;\n    baker->spc.height = (int)height;\n    for (input_i = 0, config_iter = config_list; input_i < font_count && config_iter;\n        ++input_i, config_iter = config_iter->next)\n    {\n        const struct nk_font_config *cfg = config_iter;\n        struct nk_font_bake_data *tmp = &baker->build[input_i];\n        nk_tt_PackSetOversampling(&baker->spc, cfg->oversample_h, cfg->oversample_v);\n        nk_tt_PackFontRangesRenderIntoRects(&baker->spc, &tmp->info, tmp->ranges,\n            (int)tmp->range_count, tmp->rects, &baker->alloc);\n    }\n    nk_tt_PackEnd(&baker->spc, &baker->alloc);\n\n    /* third pass: setup font and glyphs */\n    for (input_i = 0, config_iter = config_list; input_i < font_count && config_iter;\n        ++input_i, config_iter = config_iter->next)\n    {\n        nk_size i = 0;\n        int char_idx = 0;\n        nk_rune glyph_count = 0;\n        const struct nk_font_config *cfg = config_iter;\n        struct nk_font_bake_data *tmp = &baker->build[input_i];\n        struct nk_baked_font *dst_font = cfg->font;\n\n        float font_scale = nk_tt_ScaleForPixelHeight(&tmp->info, cfg->size);\n        int unscaled_ascent, unscaled_descent, unscaled_line_gap;\n        nk_tt_GetFontVMetrics(&tmp->info, &unscaled_ascent, &unscaled_descent,\n                                &unscaled_line_gap);\n\n        /* fill baked font */\n        if (!cfg->merge_mode) {\n            dst_font->ranges = cfg->range;\n            dst_font->height = cfg->size;\n            dst_font->ascent = ((float)unscaled_ascent * font_scale);\n            dst_font->descent = ((float)unscaled_descent * font_scale);\n            dst_font->glyph_offset = glyph_n;\n        }\n\n        /* fill own baked font glyph array */\n        for (i = 0; i < tmp->range_count; ++i)\n        {\n            struct nk_tt_pack_range *range = &tmp->ranges[i];\n            for (char_idx = 0; char_idx < range->num_chars; char_idx++)\n            {\n                nk_rune codepoint = 0;\n                float dummy_x = 0, dummy_y = 0;\n                struct nk_tt_aligned_quad q;\n                struct nk_font_glyph *glyph;\n\n                /* query glyph bounds from stb_truetype */\n                const struct nk_tt_packedchar *pc = &range->chardata_for_range[char_idx];\n                if (!pc->x0 && !pc->x1 && !pc->y0 && !pc->y1) continue;\n                codepoint = (nk_rune)(range->first_unicode_codepoint_in_range + char_idx);\n                nk_tt_GetPackedQuad(range->chardata_for_range, (int)width,\n                    (int)height, char_idx, &dummy_x, &dummy_y, &q, 0);\n\n                /* fill own glyph type with data */\n                glyph = &glyphs[dst_font->glyph_offset + (unsigned int)glyph_count];\n                glyph->codepoint = codepoint;\n                glyph->x0 = q.x0; glyph->y0 = q.y0;\n                glyph->x1 = q.x1; glyph->y1 = q.y1;\n                glyph->y0 += (dst_font->ascent + 0.5f);\n                glyph->y1 += (dst_font->ascent + 0.5f);\n                glyph->w = glyph->x1 - glyph->x0 + 0.5f;\n                glyph->h = glyph->y1 - glyph->y0;\n\n                if (cfg->coord_type == NK_COORD_PIXEL) {\n                    glyph->u0 = q.s0 * (float)width;\n                    glyph->v0 = q.t0 * (float)height;\n                    glyph->u1 = q.s1 * (float)width;\n                    glyph->v1 = q.t1 * (float)height;\n                } else {\n                    glyph->u0 = q.s0;\n                    glyph->v0 = q.t0;\n                    glyph->u1 = q.s1;\n                    glyph->v1 = q.t1;\n                }\n                glyph->xadvance = (pc->xadvance + cfg->spacing.x);\n                if (cfg->pixel_snap)\n                    glyph->xadvance = (float)(int)(glyph->xadvance + 0.5f);\n                glyph_count++;\n            }\n        }\n        dst_font->glyph_count = glyph_count;\n        glyph_n += dst_font->glyph_count;\n    }\n}\n\nNK_INTERN void\nnk_font_bake_custom_data(void *img_memory, int img_width, int img_height,\n    struct nk_recti img_dst, const char *texture_data_mask, int tex_width,\n    int tex_height, char white, char black)\n{\n    nk_byte *pixels;\n    int y = 0;\n    int x = 0;\n    int n = 0;\n\n    NK_ASSERT(img_memory);\n    NK_ASSERT(img_width);\n    NK_ASSERT(img_height);\n    NK_ASSERT(texture_data_mask);\n    NK_UNUSED(tex_height);\n    if (!img_memory || !img_width || !img_height || !texture_data_mask)\n        return;\n\n    pixels = (nk_byte*)img_memory;\n    for (y = 0, n = 0; y < tex_height; ++y) {\n        for (x = 0; x < tex_width; ++x, ++n) {\n            const int off0 = ((img_dst.x + x) + (img_dst.y + y) * img_width);\n            const int off1 = off0 + 1 + tex_width;\n            pixels[off0] = (texture_data_mask[n] == white) ? 0xFF : 0x00;\n            pixels[off1] = (texture_data_mask[n] == black) ? 0xFF : 0x00;\n        }\n    }\n}\n\nNK_INTERN void\nnk_font_bake_convert(void *out_memory, int img_width, int img_height,\n    const void *in_memory)\n{\n    int n = 0;\n    nk_rune *dst;\n    const nk_byte *src;\n\n    NK_ASSERT(out_memory);\n    NK_ASSERT(in_memory);\n    NK_ASSERT(img_width);\n    NK_ASSERT(img_height);\n    if (!out_memory || !in_memory || !img_height || !img_width) return;\n\n    dst = (nk_rune*)out_memory;\n    src = (const nk_byte*)in_memory;\n    for (n = (int)(img_width * img_height); n > 0; n--)\n        *dst++ = ((nk_rune)(*src++) << 24) | 0x00FFFFFF;\n}\n\n/* -------------------------------------------------------------\n *\n *                          FONT\n *\n * --------------------------------------------------------------*/\nNK_INTERN float\nnk_font_text_width(nk_handle handle, float height, const char *text, int len)\n{\n    nk_rune unicode;\n    int text_len  = 0;\n    float text_width = 0;\n    int glyph_len = 0;\n    float scale = 0;\n\n    struct nk_font *font = (struct nk_font*)handle.ptr;\n    NK_ASSERT(font);\n    NK_ASSERT(font->glyphs);\n    if (!font || !text || !len)\n        return 0;\n\n    scale = height/font->info.height;\n    glyph_len = text_len = nk_utf_decode(text, &unicode, (int)len);\n    if (!glyph_len) return 0;\n    while (text_len <= (int)len && glyph_len) {\n        const struct nk_font_glyph *g;\n        if (unicode == NK_UTF_INVALID) break;\n\n        /* query currently drawn glyph information */\n        g = nk_font_find_glyph(font, unicode);\n        text_width += g->xadvance * scale;\n\n        /* offset next glyph */\n        glyph_len = nk_utf_decode(text + text_len, &unicode, (int)len - text_len);\n        text_len += glyph_len;\n    }\n    return text_width;\n}\n\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\nNK_INTERN void\nnk_font_query_font_glyph(nk_handle handle, float height,\n    struct nk_user_font_glyph *glyph, nk_rune codepoint, nk_rune next_codepoint)\n{\n    float scale;\n    const struct nk_font_glyph *g;\n    struct nk_font *font;\n\n    NK_ASSERT(glyph);\n    NK_UNUSED(next_codepoint);\n\n    font = (struct nk_font*)handle.ptr;\n    NK_ASSERT(font);\n    NK_ASSERT(font->glyphs);\n    if (!font || !glyph)\n        return;\n\n    scale = height/font->info.height;\n    g = nk_font_find_glyph(font, codepoint);\n    glyph->width = (g->x1 - g->x0) * scale;\n    glyph->height = (g->y1 - g->y0) * scale;\n    glyph->offset = nk_vec2(g->x0 * scale, g->y0 * scale);\n    glyph->xadvance = (g->xadvance * scale);\n    glyph->uv[0] = nk_vec2(g->u0, g->v0);\n    glyph->uv[1] = nk_vec2(g->u1, g->v1);\n}\n#endif\n\nNK_API const struct nk_font_glyph*\nnk_font_find_glyph(struct nk_font *font, nk_rune unicode)\n{\n    int i = 0;\n    int count;\n    int total_glyphs = 0;\n    const struct nk_font_glyph *glyph = 0;\n\n    NK_ASSERT(font);\n    NK_ASSERT(font->glyphs);\n    NK_ASSERT(font->info.ranges);\n    if (!font || !font->glyphs) return 0;\n\n    glyph = font->fallback;\n    count = nk_range_count(font->info.ranges);\n    for (i = 0; i < count; ++i) {\n        nk_rune f = font->info.ranges[(i*2)+0];\n        nk_rune t = font->info.ranges[(i*2)+1];\n        int diff = (int)((t - f) + 1);\n        if (unicode >= f && unicode <= t)\n            return &font->glyphs[((nk_rune)total_glyphs + (unicode - f))];\n        total_glyphs += diff;\n    }\n    return glyph;\n}\n\nNK_INTERN void\nnk_font_init(struct nk_font *font, float pixel_height,\n    nk_rune fallback_codepoint, struct nk_font_glyph *glyphs,\n    const struct nk_baked_font *baked_font, nk_handle atlas)\n{\n    struct nk_baked_font baked;\n    NK_ASSERT(font);\n    NK_ASSERT(glyphs);\n    NK_ASSERT(baked_font);\n    if (!font || !glyphs || !baked_font)\n        return;\n\n    baked = *baked_font;\n    font->fallback = 0;\n    font->info = baked;\n    font->scale = (float)pixel_height / (float)font->info.height;\n    font->glyphs = &glyphs[baked_font->glyph_offset];\n    font->texture = atlas;\n    font->fallback_codepoint = fallback_codepoint;\n    font->fallback = nk_font_find_glyph(font, fallback_codepoint);\n\n    font->handle.height = font->info.height * font->scale;\n    font->handle.width = nk_font_text_width;\n    font->handle.userdata.ptr = font;\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n    font->handle.query = nk_font_query_font_glyph;\n    font->handle.texture = font->texture;\n#endif\n}\n\n/* ---------------------------------------------------------------------------\n *\n *                          DEFAULT FONT\n *\n * ProggyClean.ttf\n * Copyright (c) 2004, 2005 Tristan Grimmer\n * MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip)\n * Download and more information at http://upperbounds.net\n *-----------------------------------------------------------------------------*/\n#ifdef NK_INCLUDE_DEFAULT_FONT\n\n #ifdef __clang__\n#pragma clang diagnostic push\n\n#pragma clang diagnostic ignored \"-Woverlength-strings\"\n#elif defined(__GNUC__) || defined(__GNUG__)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Woverlength-strings\"\n#endif\n\nNK_GLOBAL const char nk_proggy_clean_ttf_compressed_data_base85[11980+1] =\n    \"7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/\"\n    \"2*>]b(MC;$jPfY.;h^`IWM9<Lh2TlS+f-s$o6Q<BWH`YiU.xfLq$N;$0iR/GX:U(jcW2p/W*q?-qmnUCI;jHSAiFWM.R*kU@C=GH?a9wp8f$e.-4^Qg1)Q-GL(lf(r/7GrRgwV%MS=C#\"\n    \"`8ND>Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1<q-UE31#^-V'8IRUo7Qf./L>=Ke$$'5F%)]0^#0X@U.a<r:QLtFsLcL6##lOj)#.Y5<-R&KgLwqJfLgN&;Q?gI^#DY2uL\"\n    \"i@^rMl9t=cWq6##weg>$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;-<nLENhvx>-VsM.M0rJfLH2eTM`*oJMHRC`N\"\n    \"kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`&#0j@'DbG&#^$PG.Ll+DNa<XCMKEV*N)LN/N\"\n    \"*b=%Q6pia-Xg8I$<MR&,VdJe$<(7G;Ckl'&hF;;$<_=X(b.RS%%)###MPBuuE1V:v&cX&#2m#(&cV]`k9OhLMbn%s$G2,B$BfD3X*sp5#l,$R#]x_X1xKX%b5U*[r5iMfUo9U`N99hG)\"\n    \"tm+/Us9pG)XPu`<0s-)WTt(gCRxIg(%6sfh=ktMKn3j)<6<b5Sk_/0(^]AaN#(p/L>&VZ>1i%h1S9u5o@YaaW$e+b<TWFn/Z:Oh(Cx2$lNEoN^e)#CFY@@I;BOQ*sRwZtZxRcU7uW6CX\"\n    \"ow0i(?$Q[cjOd[P4d)]>ROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc.\"\n    \"x]Ip.PH^'/aqUO/$1WxLoW0[iLA<QT;5HKD+@qQ'NQ(3_PLhE48R.qAPSwQ0/WK?Z,[x?-J;jQTWA0X@KJ(_Y8N-:/M74:/-ZpKrUss?d#dZq]DAbkU*JqkL+nwX@@47`5>w=4h(9.`G\"\n    \"CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?G<Nald$qs]@]L<J7bR*>gv:[7MI2k).'2($5FNP&EQ(,)\"\n    \"U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#\"\n    \"'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM\"\n    \"_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0<q-]L_?^)1vw'.,MRsqVr.L;aN&#/EgJ)PBc[-f>+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu\"\n    \"Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/\"\n    \"/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[K<L\"\n    \"%a2E-grWVM3@2=-k22tL]4$##6We'8UJCKE[d_=%wI;'6X-GsLX4j^SgJ$##R*w,vP3wK#iiW&#*h^D&R?jp7+/u&#(AP##XU8c$fSYW-J95_-Dp[g9wcO&#M-h1OcJlc-*vpw0xUX&#\"\n    \"OQFKNX@QI'IoPp7nb,QU//MQ&ZDkKP)X<WSVL(68uVl&#c'[0#(s1X&xm$Y%B7*K:eDA323j998GXbA#pwMs-jgD$9QISB-A_(aN4xoFM^@C58D0+Q+q3n0#3U1InDjF682-SjMXJK)(\"\n    \"h$hxua_K]ul92%'BOU&#BRRh-slg8KDlr:%L71Ka:.A;%YULjDPmL<LYs8i#XwJOYaKPKc1h:'9Ke,g)b),78=I39B;xiY$bgGw-&.Zi9InXDuYa%G*f2Bq7mn9^#p1vv%#(Wi-;/Z5h\"\n    \"o;#2:;%d&#x9v68C5g?ntX0X)pT`;%pB3q7mgGN)3%(P8nTd5L7GeA-GL@+%J3u2:(Yf>et`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO\"\n    \"j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J<j$UpK<Q4a1]MupW^-\"\n    \"sj_$%[HK%'F####QRZJ::Y3EGl4'@%FkiAOg#p[##O`gukTfBHagL<LHw%q&OV0##F=6/:chIm0@eCP8X]:kFI%hl8hgO@RcBhS-@Qb$%+m=hPDLg*%K8ln(wcf3/'DW-$.lR?n[nCH-\"\n    \"eXOONTJlh:.RYF%3'p6sq:UIMA945&^HFS87@$EP2iG<-lCO$%c`uKGD3rC$x0BL8aFn--`ke%#HMP'vh1/R&O_J9'um,.<tx[@%wsJk&bUT2`0uMv7gg#qp/ij.L56'hl;.s5CUrxjO\"\n    \"M7-##.l+Au'A&O:-T72L]P`&=;ctp'XScX*rU.>-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%\"\n    \"LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$M<Jnq79VsJW/mWS*PUiq76;]/NM_>hLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]\"\n    \"%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et\"\n    \"Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$<M-SGZ':+Q_k+uvOSLiEo(<aD/K<CCc`'Lx>'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:\"\n    \"a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VB<HFF*qL(\"\n    \"$/V,;(kXZejWO`<[5?\\?ewY(*9=%wDc;,u<'9t3W-(H1th3+G]ucQ]kLs7df($/*JL]@*t7Bu_G3_7mp7<iaQjO@.kLg;x3B0lqp7Hf,^Ze7-##@/c58Mo(3;knp0%)A7?-W+eI'o8)b<\"\n    \"nKnw'Ho8C=Y>pqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<<aG/1N$#FX$0V5Y6x'aErI3I$7x%E`v<-BY,)%-?Psf*l?%C3.mM(=/M0:JxG'?\"\n    \"7WhH%o'a<-80g0NBxoO(GH<dM]n.+%q@jH?f.UsJ2Ggs&4<-e47&Kl+f//9@`b+?.TeN_&B8Ss?v;^Trk;f#YvJkl&w$]>-+k?'(<S:68tq*WoDfZu';mM?8X[ma8W%*`-=;D.(nc7/;\"\n    \")g:T1=^J$&BRV(-lTmNB6xqB[@0*o.erM*<SWF]u2=st-*(6v>^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M\"\n    \"D?@f&1'BW-)Ju<L25gl8uhVm1hL$##*8###'A3/LkKW+(^rWX?5W_8g)a(m&K8P>#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX(\"\n    \"P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs\"\n    \"bIu)'Z,*[>br5fX^:FPAWr-m2KgL<LUN098kTF&#lvo58=/vjDo;.;)Ka*hLR#/k=rKbxuV`>Q_nN6'8uTG&#1T5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q\"\n    \"h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aeg<Z'<$#4H)6,>e0jT6'N#(q%.O=?2S]u*(m<-\"\n    \"V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i\"\n    \"sZ88+dKQ)W6>J%CL<KE>`.d*(B`-n8D9oK<Up]c$X$(,)M8Zt7/[rdkqTgl-0cuGMv'?>-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P&#9r+$%CE=68>K8r0=dSC%%(@p7\"\n    \".m7jilQ02'0-VWAg<a/''3u.=4L$Y)6k/K:_[3=&jvL<L0C/2'v:^;-DIBW,B4E68:kZ;%?8(Q8BH=kO65BW?xSG&#@uU,DS*,?.+(o(#1vCS8#CHF>TlGW'b)Tq7VT9q^*^$$.:&N@@\"\n    \"$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*\"\n    \"hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u\"\n    \"@-W$U%VEQ/,,>>#)D<h#`)h0:<Q6909ua+&VU%n2:cG3FJ-%@Bj-DgLr`Hw&HAKjKjseK</xKT*)B,N9X3]krc12t'pgTV(Lv-tL[xg_%=M_q7a^x?7Ubd>#%8cY#YZ?=,`Wdxu/ae&#\"\n    \"w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$s<Eh#c&)q.MXI%#v9ROa5FZO%sF7q7Nwb&#ptUJ:aqJe$Sl68%.D###EC><?-aF&#RNQv>o8lKN%5/$(vdfq7+ebA#\"\n    \"u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(<c`Q8N)jEIF*+?P2a8g%)$q]o2aH8C&<SibC/q,(e:v;-b#6[$NtDZ84Je2KNvB#$P5?tQ3nt(0\"\n    \"d=j.LQf./Ll33+(;q3L-w=8dX$#WF&uIJ@-bfI>%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoF&#4DoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8\"\n    \"6e%B/:=>)N4xeW.*wft-;$'58-ESqr<b?UI(_%@[P46>#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#\"\n    \"b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjL<Lni;''X.`$#8+1GD\"\n    \":k$YUWsbn8ogh6rxZ2Z9]%nd+>V#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#<NEdtg(n'=S1A(Q1/I&4([%dM`,Iu'1:_hL>SfD07&6D<fp8dHM7/g+\"\n    \"tlPN9J*rKaPct&?'uBCem^jn%9_K)<,C5K3s=5g&GmJb*[SYq7K;TRLGCsM-$$;S%:Y@r7AK0pprpL<Lrh,q7e/%KWK:50I^+m'vi`3?%Zp+<-d+$L-Sv:@.o19n$s0&39;kn;S%BSq*\"\n    \"$3WoJSCLweV[aZ'MQIjO<7;X-X;&+dMLvu#^UsGEC9WEc[X(wI7#2.(F0jV*eZf<-Qv3J-c+J5AlrB#$p(H68LvEA'q3n0#m,[`*8Ft)FcYgEud]CWfm68,(aLA$@EFTgLXoBq/UPlp7\"\n    \":d[/;r_ix=:TF`S5H-b<LI&HY(K=h#)]Lk$K14lVfm:x$H<3^Ql<M`$OhapBnkup'D#L$Pb_`N*g]2e;X/Dtg,bsj&K#2[-:iYr'_wgH)NUIR8a1n#S?Yej'h8^58UbZd+^FKD*T@;6A\"\n    \"7aQC[K8d-(v6GI$x:T<&'Gp5Uf>@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-<aN((^7('#Z0wK#5GX@7\"\n    \"u][`*S^43933A4rl][`*O4CgLEl]v$1Q3AeF37dbXk,.)vj#x'd`;qgbQR%FW,2(?LO=s%Sc68%NP'##Aotl8x=BE#j1UD([3$M(]UI2LX3RpKN@;/#f'f/&_mt&F)XdF<9t4)Qa.*kT\"\n    \"LwQ'(TTB9.xH'>#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5<N?)NBS)QN*_I,?&)2'IM%L3I)X((e/dl2&8'<M\"\n    \":^#M*Q+[T.Xri.LYS3v%fF`68h;b-X[/En'CR.q7E)p'/kle2HM,u;^%OKC-N+Ll%F9CF<Nf'^#t2L,;27W:0O@6##U6W7:$rJfLWHj$#)woqBefIZ.PK<b*t7ed;p*_m;4ExK#h@&]>\"\n    \"_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%\"\n    \"hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;\"\n    \"^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmL<LD)F^%[tC'8;+9E#C$g%#5Y>q9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:\"\n    \"+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3<n-&%H%b<FDj2M<hH=&Eh<2Len$b*aTX=-8QxN)k11IM1c^j%\"\n    \"9s<L<NFSo)B?+<-(GxsF,^-Eh@$4dXhN$+#rxK8'je'D7k`e;)2pYwPA'_p9&@^18ml1^[@g4t*[JOa*[=Qp7(qJ_oOL^('7fB&Hq-:sf,sNj8xq^>$U4O]GKx'm9)b@p7YsvK3w^YR-\"\n    \"CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*\"\n    \"hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdF<TddF<9Ah-6&9tWoDlh]&1SpGMq>Ti1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IX<N+T+0MlMBPQ*Vj>SsD<U4JHY\"\n    \"8kD2)2fU/M#$e.)T4,_=8hLim[&);?UkK'-x?'(:siIfL<$pFM`i<?%W(mGDHM%>iWP,##P`%/L<eXi:@Z9C.7o=@(pXdAO/NLQ8lPl+HPOQa8wD8=^GlPa8TKI1CjhsCTSLJM'/Wl>-\"\n    \"S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n<bhPmUkMw>%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL<LoNs'6,'85`\"\n    \"0?t/'_U59@]ddF<#LdF<eWdF<OuN/45rY<-L@&#+fm>69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdF<gR@2L=FNU-<b[(9c/ML3m;Z[$oF3g)GAWqpARc=<ROu7cL5l;-[A]%/\"\n    \"+fsd;l#SafT/f*W]0=O'$(Tb<[)*@e775R-:Yob%g*>l*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj\"\n    \"M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#<IGe;__.thjZl<%w(Wk2xmp4Q@I#I9,DF]u7-P=.-_:YJ]aS@V\"\n    \"?6*C()dOp7:WL,b&3Rg/.cmM9&r^>$(>.Z-I&J(Q0Hd5Q%7Co-b`-c<N(6r@ip+AurK<m86QIth*#v;-OBqi+L7wDE-Ir8K['m+DDSLwK&/.?-V%U_%3:qKNu$_b*B-kp7NaD'QdWQPK\"\n    \"Yq[@>P)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8<FfNkgg^oIbah*#8/Qt$F&:K*-(N/'+1vMB,u()-a.VUU*#[e%gAAO(S>WlA2);Sa\"\n    \">gXm8YB`1d@K#n]76-a$U,mF<fX]idqd)<3,]J7JmW4`6]uks=4-72L(jEk+:bJ0M^q-8Dm_Z?0olP1C9Sa&H[d&c$ooQUj]Exd*3ZM@-WGW2%s',B-_M%>%Ul:#/'xoFM9QX-$.QN'>\"\n    \"[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B</R90;eZ]%Ncq;-Tl]#F>2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I\"\n    \"wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1<Vc52=u`3^o-n1'g4v58Hj&6_t7$##?M)c<$bgQ_'SY((-xkA#\"\n    \"Y(,p'H9rIVY-b,'%bCPF7.J<Up^,(dU1VY*5#WkTU>h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-u<Hp,3@e^9UB1J+ak9-TN/mhKPg+AJYd$\"\n    \"MlvAF_jCK*.O-^(63adMT->W%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)\"\n    \"i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo\"\n    \"1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P\"\n    \"iDDG)g,r%+?,$@?uou5tSe2aN_AQU*<h`e-GI7)?OK2A.d7_c)?wQ5AS@DL3r#7fSkgl6-++D:'A,uq7SvlB$pcpH'q3n0#_%dY#xCpr-l<F0NR@-##FEV6NTF6##$l84N1w?AO>'IAO\"\n    \"URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#\"\n    \";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T<XoIB&hx=T1PcDaB&;HH+-AFr?(m9HZV)FKS8JCw;SD=6[^/DZUL`EUDf]GGlG&>\"\n    \"w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#<xU?#@.i?#D:%@#HF7@#LRI@#P_[@#Tkn@#Xw*A#]-=A#a9OA#\"\n    \"d<F&#*;G##.GY##2Sl##6`($#:l:$#>xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4&#3^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4\"\n    \"A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#\"\n    \"/QHC#3^ZC#7jmC#;v)D#?,<D#C8ND#GDaD#KPsD#O]/E#g1A5#KA*1#gC17#MGd;#8(02#L-d3#rWM4#Hga1#,<w0#T.j<#O#'2#CYN1#qa^:#_4m3#o@/=#eG8=#t8J5#`+78#4uI-#\"\n    \"m3B2#SB[8#Q0@8#i[*9#iOn8#1Nm;#^sN9#qh<9#:=x-#P;K2#$%X9#bC+.#Rg;<#mN=.#MTF.#RZO.#2?)4#Y#(/#[)1/#b;L/#dAU/#0Sv;#lY$0#n`-0#sf60#(F24#wrH0#%/e0#\"\n    \"TmD<#%JSMFove:CTBEXI:<eh2g)B,3h2^G3i;#d3jD>)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP\"\n    \"GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp\"\n    \"O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#\";\n#endif /* NK_INCLUDE_DEFAULT_FONT */\n\n#define NK_CURSOR_DATA_W 90\n#define NK_CURSOR_DATA_H 27\nNK_GLOBAL const char nk_custom_cursor_data[NK_CURSOR_DATA_W * NK_CURSOR_DATA_H + 1] =\n{\n    \"..-         -XXXXXXX-    X    -           X           -XXXXXXX          -          XXXXXXX\"\n    \"..-         -X.....X-   X.X   -          X.X          -X.....X          -          X.....X\"\n    \"---         -XXX.XXX-  X...X  -         X...X         -X....X           -           X....X\"\n    \"X           -  X.X  - X.....X -        X.....X        -X...X            -            X...X\"\n    \"XX          -  X.X  -X.......X-       X.......X       -X..X.X           -           X.X..X\"\n    \"X.X         -  X.X  -XXXX.XXXX-       XXXX.XXXX       -X.X X.X          -          X.X X.X\"\n    \"X..X        -  X.X  -   X.X   -          X.X          -XX   X.X         -         X.X   XX\"\n    \"X...X       -  X.X  -   X.X   -    XX    X.X    XX    -      X.X        -        X.X      \"\n    \"X....X      -  X.X  -   X.X   -   X.X    X.X    X.X   -       X.X       -       X.X       \"\n    \"X.....X     -  X.X  -   X.X   -  X..X    X.X    X..X  -        X.X      -      X.X        \"\n    \"X......X    -  X.X  -   X.X   - X...XXXXXX.XXXXXX...X -         X.X   XX-XX   X.X         \"\n    \"X.......X   -  X.X  -   X.X   -X.....................X-          X.X X.X-X.X X.X          \"\n    \"X........X  -  X.X  -   X.X   - X...XXXXXX.XXXXXX...X -           X.X..X-X..X.X           \"\n    \"X.........X -XXX.XXX-   X.X   -  X..X    X.X    X..X  -            X...X-X...X            \"\n    \"X..........X-X.....X-   X.X   -   X.X    X.X    X.X   -           X....X-X....X           \"\n    \"X......XXXXX-XXXXXXX-   X.X   -    XX    X.X    XX    -          X.....X-X.....X          \"\n    \"X...X..X    ---------   X.X   -          X.X          -          XXXXXXX-XXXXXXX          \"\n    \"X..X X..X   -       -XXXX.XXXX-       XXXX.XXXX       ------------------------------------\"\n    \"X.X  X..X   -       -X.......X-       X.......X       -    XX           XX    -           \"\n    \"XX    X..X  -       - X.....X -        X.....X        -   X.X           X.X   -           \"\n    \"      X..X          -  X...X  -         X...X         -  X..X           X..X  -           \"\n    \"       XX           -   X.X   -          X.X          - X...XXXXXXXXXXXXX...X -           \"\n    \"------------        -    X    -           X           -X.....................X-           \"\n    \"                    ----------------------------------- X...XXXXXXXXXXXXX...X -           \"\n    \"                                                      -  X..X           X..X  -           \"\n    \"                                                      -   X.X           X.X   -           \"\n    \"                                                      -    XX           XX    -           \"\n};\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#elif defined(__GNUC__) || defined(__GNUG__)\n#pragma GCC diagnostic pop\n#endif\n\nNK_INTERN unsigned int\nnk_decompress_length(unsigned char *input)\n{\n    return (unsigned int)((input[8] << 24) + (input[9] << 16) + (input[10] << 8) + input[11]);\n}\n\nNK_GLOBAL unsigned char *nk__barrier;\nNK_GLOBAL unsigned char *nk__barrier2;\nNK_GLOBAL unsigned char *nk__barrier3;\nNK_GLOBAL unsigned char *nk__barrier4;\nNK_GLOBAL unsigned char *nk__dout;\n\nNK_INTERN void\nnk__match(unsigned char *data, unsigned int length)\n{\n    /* INVERSE of memmove... write each byte before copying the next...*/\n    NK_ASSERT (nk__dout + length <= nk__barrier);\n    if (nk__dout + length > nk__barrier) { nk__dout += length; return; }\n    if (data < nk__barrier4) { nk__dout = nk__barrier+1; return; }\n    while (length--) *nk__dout++ = *data++;\n}\n\nNK_INTERN void\nnk__lit(unsigned char *data, unsigned int length)\n{\n    NK_ASSERT (nk__dout + length <= nk__barrier);\n    if (nk__dout + length > nk__barrier) { nk__dout += length; return; }\n    if (data < nk__barrier2) { nk__dout = nk__barrier+1; return; }\n    NK_MEMCPY(nk__dout, data, length);\n    nk__dout += length;\n}\n\n#define nk__in2(x)   ((i[x] << 8) + i[(x)+1])\n#define nk__in3(x)   ((i[x] << 16) + nk__in2((x)+1))\n#define nk__in4(x)   ((i[x] << 24) + nk__in3((x)+1))\n\nNK_INTERN unsigned char*\nnk_decompress_token(unsigned char *i)\n{\n    if (*i >= 0x20) { /* use fewer if's for cases that expand small */\n        if (*i >= 0x80)       nk__match(nk__dout-i[1]-1, (unsigned int)i[0] - 0x80 + 1), i += 2;\n        else if (*i >= 0x40)  nk__match(nk__dout-(nk__in2(0) - 0x4000 + 1), (unsigned int)i[2]+1), i += 3;\n        else /* *i >= 0x20 */ nk__lit(i+1, (unsigned int)i[0] - 0x20 + 1), i += 1 + (i[0] - 0x20 + 1);\n    } else { /* more ifs for cases that expand large, since overhead is amortized */\n        if (*i >= 0x18)       nk__match(nk__dout-(unsigned int)(nk__in3(0) - 0x180000 + 1), (unsigned int)i[3]+1), i += 4;\n        else if (*i >= 0x10)  nk__match(nk__dout-(unsigned int)(nk__in3(0) - 0x100000 + 1), (unsigned int)nk__in2(3)+1), i += 5;\n        else if (*i >= 0x08)  nk__lit(i+2, (unsigned int)nk__in2(0) - 0x0800 + 1), i += 2 + (nk__in2(0) - 0x0800 + 1);\n        else if (*i == 0x07)  nk__lit(i+3, (unsigned int)nk__in2(1) + 1), i += 3 + (nk__in2(1) + 1);\n        else if (*i == 0x06)  nk__match(nk__dout-(unsigned int)(nk__in3(1)+1), i[4]+1u), i += 5;\n        else if (*i == 0x04)  nk__match(nk__dout-(unsigned int)(nk__in3(1)+1), (unsigned int)nk__in2(4)+1u), i += 6;\n    }\n    return i;\n}\n\nNK_INTERN unsigned int\nnk_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen)\n{\n    const unsigned long ADLER_MOD = 65521;\n    unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16;\n    unsigned long blocklen, i;\n\n    blocklen = buflen % 5552;\n    while (buflen) {\n        for (i=0; i + 7 < blocklen; i += 8) {\n            s1 += buffer[0]; s2 += s1;\n            s1 += buffer[1]; s2 += s1;\n            s1 += buffer[2]; s2 += s1;\n            s1 += buffer[3]; s2 += s1;\n            s1 += buffer[4]; s2 += s1;\n            s1 += buffer[5]; s2 += s1;\n            s1 += buffer[6]; s2 += s1;\n            s1 += buffer[7]; s2 += s1;\n            buffer += 8;\n        }\n        for (; i < blocklen; ++i) {\n            s1 += *buffer++; s2 += s1;\n        }\n\n        s1 %= ADLER_MOD; s2 %= ADLER_MOD;\n        buflen -= (unsigned int)blocklen;\n        blocklen = 5552;\n    }\n    return (unsigned int)(s2 << 16) + (unsigned int)s1;\n}\n\nNK_INTERN unsigned int\nnk_decompress(unsigned char *output, unsigned char *i, unsigned int length)\n{\n    unsigned int olen;\n    if (nk__in4(0) != 0x57bC0000) return 0;\n    if (nk__in4(4) != 0)          return 0; /* error! stream is > 4GB */\n    olen = nk_decompress_length(i);\n    nk__barrier2 = i;\n    nk__barrier3 = i+length;\n    nk__barrier = output + olen;\n    nk__barrier4 = output;\n    i += 16;\n\n    nk__dout = output;\n    for (;;) {\n        unsigned char *old_i = i;\n        i = nk_decompress_token(i);\n        if (i == old_i) {\n            if (*i == 0x05 && i[1] == 0xfa) {\n                NK_ASSERT(nk__dout == output + olen);\n                if (nk__dout != output + olen) return 0;\n                if (nk_adler32(1, output, olen) != (unsigned int) nk__in4(2))\n                    return 0;\n                return olen;\n            } else {\n                NK_ASSERT(0); /* NOTREACHED */\n                return 0;\n            }\n        }\n        NK_ASSERT(nk__dout <= output + olen);\n        if (nk__dout > output + olen)\n            return 0;\n    }\n}\n\nNK_INTERN unsigned int\nnk_decode_85_byte(char c)\n{ return (unsigned int)((c >= '\\\\') ? c-36 : c-35); }\n\nNK_INTERN void\nnk_decode_85(unsigned char* dst, const unsigned char* src)\n{\n    while (*src)\n    {\n        unsigned int tmp =\n            nk_decode_85_byte((char)src[0]) +\n            85 * (nk_decode_85_byte((char)src[1]) +\n            85 * (nk_decode_85_byte((char)src[2]) +\n            85 * (nk_decode_85_byte((char)src[3]) +\n            85 * nk_decode_85_byte((char)src[4]))));\n\n        /* we can't assume little-endianess. */\n        dst[0] = (unsigned char)((tmp >> 0) & 0xFF);\n        dst[1] = (unsigned char)((tmp >> 8) & 0xFF);\n        dst[2] = (unsigned char)((tmp >> 16) & 0xFF);\n        dst[3] = (unsigned char)((tmp >> 24) & 0xFF);\n\n        src += 5;\n        dst += 4;\n    }\n}\n\n/* -------------------------------------------------------------\n *\n *                          FONT ATLAS\n *\n * --------------------------------------------------------------*/\nNK_API struct nk_font_config\nnk_font_config(float pixel_height)\n{\n    struct nk_font_config cfg;\n    nk_zero_struct(cfg);\n    cfg.ttf_blob = 0;\n    cfg.ttf_size = 0;\n    cfg.ttf_data_owned_by_atlas = 0;\n    cfg.size = pixel_height;\n    cfg.oversample_h = 3;\n    cfg.oversample_v = 1;\n    cfg.pixel_snap = 0;\n    cfg.coord_type = NK_COORD_UV;\n    cfg.spacing = nk_vec2(0,0);\n    cfg.range = nk_font_default_glyph_ranges();\n    cfg.merge_mode = 0;\n    cfg.fallback_glyph = '?';\n    cfg.font = 0;\n    return cfg;\n}\n\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_API void\nnk_font_atlas_init_default(struct nk_font_atlas *atlas)\n{\n    NK_ASSERT(atlas);\n    if (!atlas) return;\n    nk_zero_struct(*atlas);\n    atlas->temporary.userdata.ptr = 0;\n    atlas->temporary.alloc = nk_malloc;\n    atlas->temporary.free = nk_mfree;\n    atlas->permanent.userdata.ptr = 0;\n    atlas->permanent.alloc = nk_malloc;\n    atlas->permanent.free = nk_mfree;\n}\n#endif\n\nNK_API void\nnk_font_atlas_init(struct nk_font_atlas *atlas, struct nk_allocator *alloc)\n{\n    NK_ASSERT(atlas);\n    NK_ASSERT(alloc);\n    if (!atlas || !alloc) return;\n    nk_zero_struct(*atlas);\n    atlas->permanent = *alloc;\n    atlas->temporary = *alloc;\n}\n\nNK_API void\nnk_font_atlas_init_custom(struct nk_font_atlas *atlas,\n    struct nk_allocator *permanent, struct nk_allocator *temporary)\n{\n    NK_ASSERT(atlas);\n    NK_ASSERT(permanent);\n    NK_ASSERT(temporary);\n    if (!atlas || !permanent || !temporary) return;\n    nk_zero_struct(*atlas);\n    atlas->permanent = *permanent;\n    atlas->temporary = *temporary;\n}\n\nNK_API void\nnk_font_atlas_begin(struct nk_font_atlas *atlas)\n{\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc && atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc && atlas->permanent.free);\n    if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free ||\n        !atlas->temporary.alloc || !atlas->temporary.free) return;\n    if (atlas->glyphs) {\n        atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs);\n        atlas->glyphs = 0;\n    }\n    if (atlas->pixel) {\n        atlas->permanent.free(atlas->permanent.userdata, atlas->pixel);\n        atlas->pixel = 0;\n    }\n}\n\nNK_API struct nk_font*\nnk_font_atlas_add(struct nk_font_atlas *atlas, const struct nk_font_config *config)\n{\n    struct nk_font *font = 0;\n    struct nk_font_config *cfg;\n\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n\n    NK_ASSERT(config);\n    NK_ASSERT(config->ttf_blob);\n    NK_ASSERT(config->ttf_size);\n    NK_ASSERT(config->size > 0.0f);\n\n    if (!atlas || !config || !config->ttf_blob || !config->ttf_size || config->size <= 0.0f||\n        !atlas->permanent.alloc || !atlas->permanent.free ||\n        !atlas->temporary.alloc || !atlas->temporary.free)\n        return 0;\n\n    /* allocate and insert font config into list */\n    cfg = (struct nk_font_config*)\n        atlas->permanent.alloc(atlas->permanent.userdata,0, sizeof(struct nk_font_config));\n    NK_MEMCPY(cfg, config, sizeof(*config));\n    if (!atlas->config) {\n        atlas->config = cfg;\n        cfg->next = 0;\n    } else {\n        cfg->next = atlas->config;\n        atlas->config = cfg;\n    }\n\n    /* allocate new font */\n    if (!config->merge_mode) {\n        font = (struct nk_font*)\n            atlas->permanent.alloc(atlas->permanent.userdata,0, sizeof(struct nk_font));\n        NK_ASSERT(font);\n        if (!font) return 0;\n        font->config = cfg;\n    } else {\n        NK_ASSERT(atlas->font_num);\n        font = atlas->fonts;\n        font->config = cfg;\n    }\n\n    /* insert font into list */\n    if (!config->merge_mode) {\n        if (!atlas->fonts) {\n            atlas->fonts = font;\n            font->next = 0;\n        } else {\n            font->next = atlas->fonts;\n            atlas->fonts = font;\n        }\n        cfg->font = &font->info;\n    }\n\n    /* create own copy of .TTF font blob */\n    if (!config->ttf_data_owned_by_atlas) {\n        cfg->ttf_blob = atlas->permanent.alloc(atlas->permanent.userdata,0, cfg->ttf_size);\n        NK_ASSERT(cfg->ttf_blob);\n        if (!cfg->ttf_blob) {\n            atlas->font_num++;\n            return 0;\n        }\n        NK_MEMCPY(cfg->ttf_blob, config->ttf_blob, cfg->ttf_size);\n        cfg->ttf_data_owned_by_atlas = 1;\n    }\n    atlas->font_num++;\n    return font;\n}\n\nNK_API struct nk_font*\nnk_font_atlas_add_from_memory(struct nk_font_atlas *atlas, void *memory,\n    nk_size size, float height, const struct nk_font_config *config)\n{\n    struct nk_font_config cfg;\n    NK_ASSERT(memory);\n    NK_ASSERT(size);\n\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n    if (!atlas || !atlas->temporary.alloc || !atlas->temporary.free || !memory || !size ||\n        !atlas->permanent.alloc || !atlas->permanent.free)\n        return 0;\n\n    cfg = (config) ? *config: nk_font_config(height);\n    cfg.ttf_blob = memory;\n    cfg.ttf_size = size;\n    cfg.size = height;\n    cfg.ttf_data_owned_by_atlas = 0;\n    return nk_font_atlas_add(atlas, &cfg);\n}\n\n#ifdef NK_INCLUDE_STANDARD_IO\nNK_API struct nk_font*\nnk_font_atlas_add_from_file(struct nk_font_atlas *atlas, const char *file_path,\n    float height, const struct nk_font_config *config)\n{\n    nk_size size;\n    char *memory;\n    struct nk_font_config cfg;\n\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n\n    if (!atlas || !file_path) return 0;\n    memory = nk_file_load(file_path, &size, &atlas->permanent);\n    if (!memory) return 0;\n\n    cfg = (config) ? *config: nk_font_config(height);\n    cfg.ttf_blob = memory;\n    cfg.ttf_size = size;\n    cfg.size = height;\n    cfg.ttf_data_owned_by_atlas = 1;\n    return nk_font_atlas_add(atlas, &cfg);\n}\n#endif\n\nNK_API struct nk_font*\nnk_font_atlas_add_compressed(struct nk_font_atlas *atlas,\n    void *compressed_data, nk_size compressed_size, float height,\n    const struct nk_font_config *config)\n{\n    unsigned int decompressed_size;\n    void *decompressed_data;\n    struct nk_font_config cfg;\n\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n\n    NK_ASSERT(compressed_data);\n    NK_ASSERT(compressed_size);\n    if (!atlas || !compressed_data || !atlas->temporary.alloc || !atlas->temporary.free ||\n        !atlas->permanent.alloc || !atlas->permanent.free)\n        return 0;\n\n    decompressed_size = nk_decompress_length((unsigned char*)compressed_data);\n    decompressed_data = atlas->permanent.alloc(atlas->permanent.userdata,0,decompressed_size);\n    NK_ASSERT(decompressed_data);\n    if (!decompressed_data) return 0;\n    nk_decompress((unsigned char*)decompressed_data, (unsigned char*)compressed_data,\n        (unsigned int)compressed_size);\n\n    cfg = (config) ? *config: nk_font_config(height);\n    cfg.ttf_blob = decompressed_data;\n    cfg.ttf_size = decompressed_size;\n    cfg.size = height;\n    cfg.ttf_data_owned_by_atlas = 1;\n    return nk_font_atlas_add(atlas, &cfg);\n}\n\nNK_API struct nk_font*\nnk_font_atlas_add_compressed_base85(struct nk_font_atlas *atlas,\n    const char *data_base85, float height, const struct nk_font_config *config)\n{\n    int compressed_size;\n    void *compressed_data;\n    struct nk_font *font;\n\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n\n    NK_ASSERT(data_base85);\n    if (!atlas || !data_base85 || !atlas->temporary.alloc || !atlas->temporary.free ||\n        !atlas->permanent.alloc || !atlas->permanent.free)\n        return 0;\n\n    compressed_size = (((int)nk_strlen(data_base85) + 4) / 5) * 4;\n    compressed_data = atlas->temporary.alloc(atlas->temporary.userdata,0, (nk_size)compressed_size);\n    NK_ASSERT(compressed_data);\n    if (!compressed_data) return 0;\n    nk_decode_85((unsigned char*)compressed_data, (const unsigned char*)data_base85);\n    font = nk_font_atlas_add_compressed(atlas, compressed_data,\n                    (nk_size)compressed_size, height, config);\n    atlas->temporary.free(atlas->temporary.userdata, compressed_data);\n    return font;\n}\n\n#ifdef NK_INCLUDE_DEFAULT_FONT\nNK_API struct nk_font*\nnk_font_atlas_add_default(struct nk_font_atlas *atlas,\n    float pixel_height, const struct nk_font_config *config)\n{\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n    return nk_font_atlas_add_compressed_base85(atlas,\n        nk_proggy_clean_ttf_compressed_data_base85, pixel_height, config);\n}\n#endif\n\nNK_API const void*\nnk_font_atlas_bake(struct nk_font_atlas *atlas, int *width, int *height,\n    enum nk_font_atlas_format fmt)\n{\n    int i = 0;\n    void *tmp = 0;\n    nk_size tmp_size, img_size;\n    struct nk_font *font_iter;\n    struct nk_font_baker *baker;\n\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n\n    NK_ASSERT(width);\n    NK_ASSERT(height);\n    if (!atlas || !width || !height ||\n        !atlas->temporary.alloc || !atlas->temporary.free ||\n        !atlas->permanent.alloc || !atlas->permanent.free)\n        return 0;\n\n#ifdef NK_INCLUDE_DEFAULT_FONT\n    /* no font added so just use default font */\n    if (!atlas->font_num)\n        atlas->default_font = nk_font_atlas_add_default(atlas, 13.0f, 0);\n#endif\n    NK_ASSERT(atlas->font_num);\n    if (!atlas->font_num) return 0;\n\n    /* allocate temporary baker memory required for the baking process */\n    nk_font_baker_memory(&tmp_size, &atlas->glyph_count, atlas->config, atlas->font_num);\n    tmp = atlas->temporary.alloc(atlas->temporary.userdata,0, tmp_size);\n    NK_ASSERT(tmp);\n    if (!tmp) goto failed;\n\n    /* allocate glyph memory for all fonts */\n    baker = nk_font_baker(tmp, atlas->glyph_count, atlas->font_num, &atlas->temporary);\n    atlas->glyphs = (struct nk_font_glyph*)atlas->permanent.alloc(\n        atlas->permanent.userdata,0, sizeof(struct nk_font_glyph)*(nk_size)atlas->glyph_count);\n    NK_ASSERT(atlas->glyphs);\n    if (!atlas->glyphs)\n        goto failed;\n\n    /* pack all glyphs into a tight fit space */\n    atlas->custom.w = (NK_CURSOR_DATA_W*2)+1;\n    atlas->custom.h = NK_CURSOR_DATA_H + 1;\n    if (!nk_font_bake_pack(baker, &img_size, width, height, &atlas->custom,\n        atlas->config, atlas->font_num, &atlas->temporary))\n        goto failed;\n\n    /* allocate memory for the baked image font atlas */\n    atlas->pixel = atlas->temporary.alloc(atlas->temporary.userdata,0, img_size);\n    NK_ASSERT(atlas->pixel);\n    if (!atlas->pixel)\n        goto failed;\n\n    /* bake glyphs and custom white pixel into image */\n    nk_font_bake(baker, atlas->pixel, *width, *height,\n        atlas->glyphs, atlas->glyph_count, atlas->config, atlas->font_num);\n    nk_font_bake_custom_data(atlas->pixel, *width, *height, atlas->custom,\n            nk_custom_cursor_data, NK_CURSOR_DATA_W, NK_CURSOR_DATA_H, '.', 'X');\n\n    if (fmt == NK_FONT_ATLAS_RGBA32) {\n        /* convert alpha8 image into rgba32 image */\n        void *img_rgba = atlas->temporary.alloc(atlas->temporary.userdata,0,\n                            (nk_size)(*width * *height * 4));\n        NK_ASSERT(img_rgba);\n        if (!img_rgba) goto failed;\n        nk_font_bake_convert(img_rgba, *width, *height, atlas->pixel);\n        atlas->temporary.free(atlas->temporary.userdata, atlas->pixel);\n        atlas->pixel = img_rgba;\n    }\n    atlas->tex_width = *width;\n    atlas->tex_height = *height;\n\n    /* initialize each font */\n    for (font_iter = atlas->fonts; font_iter; font_iter = font_iter->next) {\n        struct nk_font *font = font_iter;\n        struct nk_font_config *config = font->config;\n        nk_font_init(font, config->size, config->fallback_glyph, atlas->glyphs,\n            config->font, nk_handle_ptr(0));\n    }\n\n    /* initialize each cursor */\n    {NK_STORAGE const struct nk_vec2 nk_cursor_data[NK_CURSOR_COUNT][3] = {\n        /* Pos ----- Size ------- Offset --*/\n        {{ 0, 3},   {12,19},    { 0, 0}},\n        {{13, 0},   { 7,16},    { 4, 8}},\n        {{31, 0},   {23,23},    {11,11}},\n        {{21, 0},   { 9, 23},   { 5,11}},\n        {{55,18},   {23, 9},    {11, 5}},\n        {{73, 0},   {17,17},    { 9, 9}},\n        {{55, 0},   {17,17},    { 9, 9}}\n    };\n    for (i = 0; i < NK_CURSOR_COUNT; ++i) {\n        struct nk_cursor *cursor = &atlas->cursors[i];\n        cursor->img.w = (unsigned short)*width;\n        cursor->img.h = (unsigned short)*height;\n        cursor->img.region[0] = (unsigned short)(atlas->custom.x + nk_cursor_data[i][0].x);\n        cursor->img.region[1] = (unsigned short)(atlas->custom.y + nk_cursor_data[i][0].y);\n        cursor->img.region[2] = (unsigned short)nk_cursor_data[i][1].x;\n        cursor->img.region[3] = (unsigned short)nk_cursor_data[i][1].y;\n        cursor->size = nk_cursor_data[i][1];\n        cursor->offset = nk_cursor_data[i][2];\n    }}\n    /* free temporary memory */\n    atlas->temporary.free(atlas->temporary.userdata, tmp);\n    return atlas->pixel;\n\nfailed:\n    /* error so cleanup all memory */\n    if (tmp) atlas->temporary.free(atlas->temporary.userdata, tmp);\n    if (atlas->glyphs) {\n        atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs);\n        atlas->glyphs = 0;\n    }\n    if (atlas->pixel) {\n        atlas->temporary.free(atlas->temporary.userdata, atlas->pixel);\n        atlas->pixel = 0;\n    }\n    return 0;\n}\n\nNK_API void\nnk_font_atlas_end(struct nk_font_atlas *atlas, nk_handle texture,\n    struct nk_draw_null_texture *null)\n{\n    int i = 0;\n    struct nk_font *font_iter;\n    NK_ASSERT(atlas);\n    if (!atlas) {\n        if (!null) return;\n        null->texture = texture;\n        null->uv = nk_vec2(0.5f,0.5f);\n    }\n    if (null) {\n        null->texture = texture;\n        null->uv.x = (atlas->custom.x + 0.5f)/(float)atlas->tex_width;\n        null->uv.y = (atlas->custom.y + 0.5f)/(float)atlas->tex_height;\n    }\n    for (font_iter = atlas->fonts; font_iter; font_iter = font_iter->next) {\n        font_iter->texture = texture;\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n        font_iter->handle.texture = texture;\n#endif\n    }\n    for (i = 0; i < NK_CURSOR_COUNT; ++i)\n        atlas->cursors[i].img.handle = texture;\n\n    atlas->temporary.free(atlas->temporary.userdata, atlas->pixel);\n    atlas->pixel = 0;\n    atlas->tex_width = 0;\n    atlas->tex_height = 0;\n    atlas->custom.x = 0;\n    atlas->custom.y = 0;\n    atlas->custom.w = 0;\n    atlas->custom.h = 0;\n}\n\nNK_API void\nnk_font_atlas_cleanup(struct nk_font_atlas *atlas)\n{\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n\n    if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free) return;\n    if (atlas->config) {\n        struct nk_font_config *iter, *next;\n        for (iter = atlas->config; iter; iter = next) {\n            next = iter->next;\n            atlas->permanent.free(atlas->permanent.userdata, iter->ttf_blob);\n            atlas->permanent.free(atlas->permanent.userdata, iter);\n        }\n        atlas->config = 0;\n    }\n}\n\nNK_API void\nnk_font_atlas_clear(struct nk_font_atlas *atlas)\n{\n    NK_ASSERT(atlas);\n    NK_ASSERT(atlas->temporary.alloc);\n    NK_ASSERT(atlas->temporary.free);\n    NK_ASSERT(atlas->permanent.alloc);\n    NK_ASSERT(atlas->permanent.free);\n    if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free) return;\n\n    nk_font_atlas_cleanup(atlas);\n    if (atlas->fonts) {\n        struct nk_font *iter, *next;\n        for (iter = atlas->fonts; iter; iter = next) {\n            next = iter->next;\n            atlas->permanent.free(atlas->permanent.userdata, iter);\n        }\n        atlas->fonts = 0;\n    }\n    if (atlas->glyphs)\n        atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs);\n    nk_zero_struct(*atlas);\n}\n#endif\n/* ==============================================================\n *\n *                          INPUT\n *\n * ===============================================================*/\nNK_API void\nnk_input_begin(struct nk_context *ctx)\n{\n    int i;\n    struct nk_input *in;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    in = &ctx->input;\n    for (i = 0; i < NK_BUTTON_MAX; ++i)\n        in->mouse.buttons[i].clicked = 0;\n\n    in->keyboard.text_len = 0;\n    in->mouse.scroll_delta = nk_vec2(0,0);\n    in->mouse.prev.x = in->mouse.pos.x;\n    in->mouse.prev.y = in->mouse.pos.y;\n    in->mouse.delta.x = 0;\n    in->mouse.delta.y = 0;\n    for (i = 0; i < NK_KEY_MAX; i++)\n        in->keyboard.keys[i].clicked = 0;\n}\n\nNK_API void\nnk_input_end(struct nk_context *ctx)\n{\n    struct nk_input *in;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    in = &ctx->input;\n    if (in->mouse.grab)\n        in->mouse.grab = 0;\n    if (in->mouse.ungrab) {\n        in->mouse.grabbed = 0;\n        in->mouse.ungrab = 0;\n        in->mouse.grab = 0;\n    }\n}\n\nNK_API void\nnk_input_motion(struct nk_context *ctx, int x, int y)\n{\n    struct nk_input *in;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    in = &ctx->input;\n    in->mouse.pos.x = (float)x;\n    in->mouse.pos.y = (float)y;\n    in->mouse.delta.x = in->mouse.pos.x - in->mouse.prev.x;\n    in->mouse.delta.y = in->mouse.pos.y - in->mouse.prev.y;\n}\n\nNK_API void\nnk_input_key(struct nk_context *ctx, enum nk_keys key, int down)\n{\n    struct nk_input *in;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    in = &ctx->input;\n    if (in->keyboard.keys[key].down != down)\n        in->keyboard.keys[key].clicked++;\n    in->keyboard.keys[key].down = down;\n}\n\nNK_API void\nnk_input_button(struct nk_context *ctx, enum nk_buttons id, int x, int y, int down)\n{\n    struct nk_mouse_button *btn;\n    struct nk_input *in;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    in = &ctx->input;\n    if (in->mouse.buttons[id].down == down) return;\n\n    btn = &in->mouse.buttons[id];\n    btn->clicked_pos.x = (float)x;\n    btn->clicked_pos.y = (float)y;\n    btn->down = down;\n    btn->clicked++;\n}\n\nNK_API void\nnk_input_scroll(struct nk_context *ctx, struct nk_vec2 val)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    ctx->input.mouse.scroll_delta.x += val.x;\n    ctx->input.mouse.scroll_delta.y += val.y;\n}\n\nNK_API void\nnk_input_glyph(struct nk_context *ctx, const nk_glyph glyph)\n{\n    int len = 0;\n    nk_rune unicode;\n    struct nk_input *in;\n\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    in = &ctx->input;\n\n    len = nk_utf_decode(glyph, &unicode, NK_UTF_SIZE);\n    if (len && ((in->keyboard.text_len + len) < NK_INPUT_MAX)) {\n        nk_utf_encode(unicode, &in->keyboard.text[in->keyboard.text_len],\n            NK_INPUT_MAX - in->keyboard.text_len);\n        in->keyboard.text_len += len;\n    }\n}\n\nNK_API void\nnk_input_char(struct nk_context *ctx, char c)\n{\n    nk_glyph glyph;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    glyph[0] = c;\n    nk_input_glyph(ctx, glyph);\n}\n\nNK_API void\nnk_input_unicode(struct nk_context *ctx, nk_rune unicode)\n{\n    nk_glyph rune;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    nk_utf_encode(unicode, rune, NK_UTF_SIZE);\n    nk_input_glyph(ctx, rune);\n}\n\nNK_API int\nnk_input_has_mouse_click(const struct nk_input *i, enum nk_buttons id)\n{\n    const struct nk_mouse_button *btn;\n    if (!i) return nk_false;\n    btn = &i->mouse.buttons[id];\n    return (btn->clicked && btn->down == nk_false) ? nk_true : nk_false;\n}\n\nNK_API int\nnk_input_has_mouse_click_in_rect(const struct nk_input *i, enum nk_buttons id,\n    struct nk_rect b)\n{\n    const struct nk_mouse_button *btn;\n    if (!i) return nk_false;\n    btn = &i->mouse.buttons[id];\n    if (!NK_INBOX(btn->clicked_pos.x,btn->clicked_pos.y,b.x,b.y,b.w,b.h))\n        return nk_false;\n    return nk_true;\n}\n\nNK_API int\nnk_input_has_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id,\n    struct nk_rect b, int down)\n{\n    const struct nk_mouse_button *btn;\n    if (!i) return nk_false;\n    btn = &i->mouse.buttons[id];\n    return nk_input_has_mouse_click_in_rect(i, id, b) && (btn->down == down);\n}\n\nNK_API int\nnk_input_is_mouse_click_in_rect(const struct nk_input *i, enum nk_buttons id,\n    struct nk_rect b)\n{\n    const struct nk_mouse_button *btn;\n    if (!i) return nk_false;\n    btn = &i->mouse.buttons[id];\n    return (nk_input_has_mouse_click_down_in_rect(i, id, b, nk_false) &&\n            btn->clicked) ? nk_true : nk_false;\n}\n\nNK_API int\nnk_input_is_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id,\n    struct nk_rect b, int down)\n{\n    const struct nk_mouse_button *btn;\n    if (!i) return nk_false;\n    btn = &i->mouse.buttons[id];\n    return (nk_input_has_mouse_click_down_in_rect(i, id, b, down) &&\n            btn->clicked) ? nk_true : nk_false;\n}\n\nNK_API int\nnk_input_any_mouse_click_in_rect(const struct nk_input *in, struct nk_rect b)\n{\n    int i, down = 0;\n    for (i = 0; i < NK_BUTTON_MAX; ++i)\n        down = down || nk_input_is_mouse_click_in_rect(in, (enum nk_buttons)i, b);\n    return down;\n}\n\nNK_API int\nnk_input_is_mouse_hovering_rect(const struct nk_input *i, struct nk_rect rect)\n{\n    if (!i) return nk_false;\n    return NK_INBOX(i->mouse.pos.x, i->mouse.pos.y, rect.x, rect.y, rect.w, rect.h);\n}\n\nNK_API int\nnk_input_is_mouse_prev_hovering_rect(const struct nk_input *i, struct nk_rect rect)\n{\n    if (!i) return nk_false;\n    return NK_INBOX(i->mouse.prev.x, i->mouse.prev.y, rect.x, rect.y, rect.w, rect.h);\n}\n\nNK_API int\nnk_input_mouse_clicked(const struct nk_input *i, enum nk_buttons id, struct nk_rect rect)\n{\n    if (!i) return nk_false;\n    if (!nk_input_is_mouse_hovering_rect(i, rect)) return nk_false;\n    return nk_input_is_mouse_click_in_rect(i, id, rect);\n}\n\nNK_API int\nnk_input_is_mouse_down(const struct nk_input *i, enum nk_buttons id)\n{\n    if (!i) return nk_false;\n    return i->mouse.buttons[id].down;\n}\n\nNK_API int\nnk_input_is_mouse_pressed(const struct nk_input *i, enum nk_buttons id)\n{\n    const struct nk_mouse_button *b;\n    if (!i) return nk_false;\n    b = &i->mouse.buttons[id];\n    if (b->down && b->clicked)\n        return nk_true;\n    return nk_false;\n}\n\nNK_API int\nnk_input_is_mouse_released(const struct nk_input *i, enum nk_buttons id)\n{\n    if (!i) return nk_false;\n    return (!i->mouse.buttons[id].down && i->mouse.buttons[id].clicked);\n}\n\nNK_API int\nnk_input_is_key_pressed(const struct nk_input *i, enum nk_keys key)\n{\n    const struct nk_key *k;\n    if (!i) return nk_false;\n    k = &i->keyboard.keys[key];\n    if ((k->down && k->clicked) || (!k->down && k->clicked >= 2))\n        return nk_true;\n    return nk_false;\n}\n\nNK_API int\nnk_input_is_key_released(const struct nk_input *i, enum nk_keys key)\n{\n    const struct nk_key *k;\n    if (!i) return nk_false;\n    k = &i->keyboard.keys[key];\n    if ((!k->down && k->clicked) || (k->down && k->clicked >= 2))\n        return nk_true;\n    return nk_false;\n}\n\nNK_API int\nnk_input_is_key_down(const struct nk_input *i, enum nk_keys key)\n{\n    const struct nk_key *k;\n    if (!i) return nk_false;\n    k = &i->keyboard.keys[key];\n    if (k->down) return nk_true;\n    return nk_false;\n}\n\n/*\n * ==============================================================\n *\n *                          TEXT EDITOR\n *\n * ===============================================================\n */\n/* stb_textedit.h - v1.8  - public domain - Sean Barrett */\nstruct nk_text_find {\n   float x,y;    /* position of n'th character */\n   float height; /* height of line */\n   int first_char, length; /* first char of row, and length */\n   int prev_first;  /*_ first char of previous row */\n};\n\nstruct nk_text_edit_row {\n   float x0,x1;\n   /* starting x location, end x location (allows for align=right, etc) */\n   float baseline_y_delta;\n   /* position of baseline relative to previous row's baseline*/\n   float ymin,ymax;\n   /* height of row above and below baseline */\n   int num_chars;\n};\n\n/* forward declarations */\nNK_INTERN void nk_textedit_makeundo_delete(struct nk_text_edit*, int, int);\nNK_INTERN void nk_textedit_makeundo_insert(struct nk_text_edit*, int, int);\nNK_INTERN void nk_textedit_makeundo_replace(struct nk_text_edit*, int, int, int);\n#define NK_TEXT_HAS_SELECTION(s)   ((s)->select_start != (s)->select_end)\n\nNK_INTERN float\nnk_textedit_get_width(const struct nk_text_edit *edit, int line_start, int char_id,\n    const struct nk_user_font *font)\n{\n    int len = 0;\n    nk_rune unicode = 0;\n    const char *str = nk_str_at_const(&edit->string, line_start + char_id, &unicode, &len);\n    return font->width(font->userdata, font->height, str, len);\n}\n\nNK_INTERN void\nnk_textedit_layout_row(struct nk_text_edit_row *r, struct nk_text_edit *edit,\n    int line_start_id, float row_height, const struct nk_user_font *font)\n{\n    int l;\n    int glyphs = 0;\n    nk_rune unicode;\n    const char *remaining;\n    int len = nk_str_len_char(&edit->string);\n    const char *end = nk_str_get_const(&edit->string) + len;\n    const char *text = nk_str_at_const(&edit->string, line_start_id, &unicode, &l);\n    const struct nk_vec2 size = nk_text_calculate_text_bounds(font,\n        text, (int)(end - text), row_height, &remaining, 0, &glyphs, NK_STOP_ON_NEW_LINE);\n\n    r->x0 = 0.0f;\n    r->x1 = size.x;\n    r->baseline_y_delta = size.y;\n    r->ymin = 0.0f;\n    r->ymax = size.y;\n    r->num_chars = glyphs;\n}\n\nNK_INTERN int\nnk_textedit_locate_coord(struct nk_text_edit *edit, float x, float y,\n    const struct nk_user_font *font, float row_height)\n{\n    struct nk_text_edit_row r;\n    int n = edit->string.len;\n    float base_y = 0, prev_x;\n    int i=0, k;\n\n    r.x0 = r.x1 = 0;\n    r.ymin = r.ymax = 0;\n    r.num_chars = 0;\n\n    /* search rows to find one that straddles 'y' */\n    while (i < n) {\n        nk_textedit_layout_row(&r, edit, i, row_height, font);\n        if (r.num_chars <= 0)\n            return n;\n\n        if (i==0 && y < base_y + r.ymin)\n            return 0;\n\n        if (y < base_y + r.ymax)\n            break;\n\n        i += r.num_chars;\n        base_y += r.baseline_y_delta;\n    }\n\n    /* below all text, return 'after' last character */\n    if (i >= n)\n        return n;\n\n    /* check if it's before the beginning of the line */\n    if (x < r.x0)\n        return i;\n\n    /* check if it's before the end of the line */\n    if (x < r.x1) {\n        /* search characters in row for one that straddles 'x' */\n        k = i;\n        prev_x = r.x0;\n        for (i=0; i < r.num_chars; ++i) {\n            float w = nk_textedit_get_width(edit, k, i, font);\n            if (x < prev_x+w) {\n                if (x < prev_x+w/2)\n                    return k+i;\n                else return k+i+1;\n            }\n            prev_x += w;\n        }\n        /* shouldn't happen, but if it does, fall through to end-of-line case */\n    }\n\n    /* if the last character is a newline, return that.\n     * otherwise return 'after' the last character */\n    if (nk_str_rune_at(&edit->string, i+r.num_chars-1) == '\\n')\n        return i+r.num_chars-1;\n    else return i+r.num_chars;\n}\n\nNK_INTERN void\nnk_textedit_click(struct nk_text_edit *state, float x, float y,\n    const struct nk_user_font *font, float row_height)\n{\n    /* API click: on mouse down, move the cursor to the clicked location,\n     * and reset the selection */\n    state->cursor = nk_textedit_locate_coord(state, x, y, font, row_height);\n    state->select_start = state->cursor;\n    state->select_end = state->cursor;\n    state->has_preferred_x = 0;\n}\n\nNK_INTERN void\nnk_textedit_drag(struct nk_text_edit *state, float x, float y,\n    const struct nk_user_font *font, float row_height)\n{\n    /* API drag: on mouse drag, move the cursor and selection endpoint\n     * to the clicked location */\n    int p = nk_textedit_locate_coord(state, x, y, font, row_height);\n    if (state->select_start == state->select_end)\n        state->select_start = state->cursor;\n    state->cursor = state->select_end = p;\n}\n\nNK_INTERN void\nnk_textedit_find_charpos(struct nk_text_find *find, struct nk_text_edit *state,\n    int n, int single_line, const struct nk_user_font *font, float row_height)\n{\n    /* find the x/y location of a character, and remember info about the previous\n     * row in case we get a move-up event (for page up, we'll have to rescan) */\n    struct nk_text_edit_row r;\n    int prev_start = 0;\n    int z = state->string.len;\n    int i=0, first;\n\n    nk_zero_struct(r);\n    if (n == z) {\n        /* if it's at the end, then find the last line -- simpler than trying to\n        explicitly handle this case in the regular code */\n        nk_textedit_layout_row(&r, state, 0, row_height, font);\n        if (single_line) {\n            find->first_char = 0;\n            find->length = z;\n        } else {\n            while (i < z) {\n                prev_start = i;\n                i += r.num_chars;\n                nk_textedit_layout_row(&r, state, i, row_height, font);\n            }\n\n            find->first_char = i;\n            find->length = r.num_chars;\n        }\n        find->x = r.x1;\n        find->y = r.ymin;\n        find->height = r.ymax - r.ymin;\n        find->prev_first = prev_start;\n        return;\n    }\n\n    /* search rows to find the one that straddles character n */\n    find->y = 0;\n\n    for(;;) {\n        nk_textedit_layout_row(&r, state, i, row_height, font);\n        if (n < i + r.num_chars) break;\n        prev_start = i;\n        i += r.num_chars;\n        find->y += r.baseline_y_delta;\n    }\n\n    find->first_char = first = i;\n    find->length = r.num_chars;\n    find->height = r.ymax - r.ymin;\n    find->prev_first = prev_start;\n\n    /* now scan to find xpos */\n    find->x = r.x0;\n    for (i=0; first+i < n; ++i)\n        find->x += nk_textedit_get_width(state, first, i, font);\n}\n\nNK_INTERN void\nnk_textedit_clamp(struct nk_text_edit *state)\n{\n    /* make the selection/cursor state valid if client altered the string */\n    int n = state->string.len;\n    if (NK_TEXT_HAS_SELECTION(state)) {\n        if (state->select_start > n) state->select_start = n;\n        if (state->select_end   > n) state->select_end = n;\n        /* if clamping forced them to be equal, move the cursor to match */\n        if (state->select_start == state->select_end)\n            state->cursor = state->select_start;\n    }\n    if (state->cursor > n) state->cursor = n;\n}\n\nNK_API void\nnk_textedit_delete(struct nk_text_edit *state, int where, int len)\n{\n    /* delete characters while updating undo */\n    nk_textedit_makeundo_delete(state, where, len);\n    nk_str_delete_runes(&state->string, where, len);\n    state->has_preferred_x = 0;\n}\n\nNK_API void\nnk_textedit_delete_selection(struct nk_text_edit *state)\n{\n    /* delete the section */\n    nk_textedit_clamp(state);\n    if (NK_TEXT_HAS_SELECTION(state)) {\n        if (state->select_start < state->select_end) {\n            nk_textedit_delete(state, state->select_start,\n                state->select_end - state->select_start);\n            state->select_end = state->cursor = state->select_start;\n        } else {\n            nk_textedit_delete(state, state->select_end,\n                state->select_start - state->select_end);\n            state->select_start = state->cursor = state->select_end;\n        }\n        state->has_preferred_x = 0;\n    }\n}\n\nNK_INTERN void\nnk_textedit_sortselection(struct nk_text_edit *state)\n{\n    /* canonicalize the selection so start <= end */\n    if (state->select_end < state->select_start) {\n        int temp = state->select_end;\n        state->select_end = state->select_start;\n        state->select_start = temp;\n    }\n}\n\nNK_INTERN void\nnk_textedit_move_to_first(struct nk_text_edit *state)\n{\n    /* move cursor to first character of selection */\n    if (NK_TEXT_HAS_SELECTION(state)) {\n        nk_textedit_sortselection(state);\n        state->cursor = state->select_start;\n        state->select_end = state->select_start;\n        state->has_preferred_x = 0;\n    }\n}\n\nNK_INTERN void\nnk_textedit_move_to_last(struct nk_text_edit *state)\n{\n    /* move cursor to last character of selection */\n    if (NK_TEXT_HAS_SELECTION(state)) {\n        nk_textedit_sortselection(state);\n        nk_textedit_clamp(state);\n        state->cursor = state->select_end;\n        state->select_start = state->select_end;\n        state->has_preferred_x = 0;\n    }\n}\n\nNK_INTERN int\nnk_is_word_boundary( struct nk_text_edit *state, int idx)\n{\n    int len;\n    nk_rune c;\n    if (idx <= 0) return 1;\n    if (!nk_str_at_rune(&state->string, idx, &c, &len)) return 1;\n    return (c == ' ' || c == '\\t' ||c == 0x3000 || c == ',' || c == ';' ||\n            c == '(' || c == ')' || c == '{' || c == '}' || c == '[' || c == ']' ||\n            c == '|');\n}\n\nNK_INTERN int\nnk_textedit_move_to_word_previous(struct nk_text_edit *state)\n{\n   int c = state->cursor - 1;\n   while( c >= 0 && !nk_is_word_boundary(state, c))\n      --c;\n\n   if( c < 0 )\n      c = 0;\n\n   return c;\n}\n\nNK_INTERN int\nnk_textedit_move_to_word_next(struct nk_text_edit *state)\n{\n   const int len = state->string.len;\n   int c = state->cursor+1;\n   while( c < len && !nk_is_word_boundary(state, c))\n      ++c;\n\n   if( c > len )\n      c = len;\n\n   return c;\n}\n\nNK_INTERN void\nnk_textedit_prep_selection_at_cursor(struct nk_text_edit *state)\n{\n    /* update selection and cursor to match each other */\n    if (!NK_TEXT_HAS_SELECTION(state))\n        state->select_start = state->select_end = state->cursor;\n    else state->cursor = state->select_end;\n}\n\nNK_API int\nnk_textedit_cut(struct nk_text_edit *state)\n{\n    /* API cut: delete selection */\n    if (state->mode == NK_TEXT_EDIT_MODE_VIEW)\n        return 0;\n    if (NK_TEXT_HAS_SELECTION(state)) {\n        nk_textedit_delete_selection(state); /* implicitly clamps */\n        state->has_preferred_x = 0;\n        return 1;\n    }\n   return 0;\n}\n\nNK_API int\nnk_textedit_paste(struct nk_text_edit *state, char const *ctext, int len)\n{\n    /* API paste: replace existing selection with passed-in text */\n    int glyphs;\n    const char *text = (const char *) ctext;\n    if (state->mode == NK_TEXT_EDIT_MODE_VIEW) return 0;\n\n    /* if there's a selection, the paste should delete it */\n    nk_textedit_clamp(state);\n    nk_textedit_delete_selection(state);\n\n    /* try to insert the characters */\n    glyphs = nk_utf_len(ctext, len);\n    if (nk_str_insert_text_char(&state->string, state->cursor, text, len)) {\n        nk_textedit_makeundo_insert(state, state->cursor, glyphs);\n        state->cursor += len;\n        state->has_preferred_x = 0;\n        return 1;\n    }\n    /* remove the undo since we didn't actually insert the characters */\n    if (state->undo.undo_point)\n        --state->undo.undo_point;\n    return 0;\n}\n\nNK_API void\nnk_textedit_text(struct nk_text_edit *state, const char *text, int total_len)\n{\n    nk_rune unicode;\n    int glyph_len;\n    int text_len = 0;\n\n    NK_ASSERT(state);\n    NK_ASSERT(text);\n    if (!text || !total_len || state->mode == NK_TEXT_EDIT_MODE_VIEW) return;\n\n    glyph_len = nk_utf_decode(text, &unicode, total_len);\n    while ((text_len < total_len) && glyph_len)\n    {\n        /* don't insert a backward delete, just process the event */\n        if (unicode == 127) goto next;\n        /* can't add newline in single-line mode */\n        if (unicode == '\\n' && state->single_line) goto next;\n        /* filter incoming text */\n        if (state->filter && !state->filter(state, unicode)) goto next;\n\n        if (!NK_TEXT_HAS_SELECTION(state) &&\n            state->cursor < state->string.len)\n        {\n            if (state->mode == NK_TEXT_EDIT_MODE_REPLACE) {\n                nk_textedit_makeundo_replace(state, state->cursor, 1, 1);\n                nk_str_delete_runes(&state->string, state->cursor, 1);\n            }\n            if (nk_str_insert_text_utf8(&state->string, state->cursor,\n                                        text+text_len, 1))\n            {\n                ++state->cursor;\n                state->has_preferred_x = 0;\n            }\n        } else {\n            nk_textedit_delete_selection(state); /* implicitly clamps */\n            if (nk_str_insert_text_utf8(&state->string, state->cursor,\n                                        text+text_len, 1))\n            {\n                nk_textedit_makeundo_insert(state, state->cursor, 1);\n                ++state->cursor;\n                state->has_preferred_x = 0;\n            }\n        }\n        next:\n        text_len += glyph_len;\n        glyph_len = nk_utf_decode(text + text_len, &unicode, total_len-text_len);\n    }\n}\n\nNK_INTERN void\nnk_textedit_key(struct nk_text_edit *state, enum nk_keys key, int shift_mod,\n    const struct nk_user_font *font, float row_height)\n{\nretry:\n    switch (key)\n    {\n    case NK_KEY_NONE:\n    case NK_KEY_CTRL:\n    case NK_KEY_ENTER:\n    case NK_KEY_SHIFT:\n    case NK_KEY_TAB:\n    case NK_KEY_COPY:\n    case NK_KEY_CUT:\n    case NK_KEY_PASTE:\n    case NK_KEY_MAX:\n    default: break;\n    case NK_KEY_TEXT_UNDO:\n         nk_textedit_undo(state);\n         state->has_preferred_x = 0;\n         break;\n\n    case NK_KEY_TEXT_REDO:\n        nk_textedit_redo(state);\n        state->has_preferred_x = 0;\n        break;\n\n    case NK_KEY_TEXT_SELECT_ALL:\n        nk_textedit_select_all(state);\n        state->has_preferred_x = 0;\n        break;\n\n    case NK_KEY_TEXT_INSERT_MODE:\n        if (state->mode == NK_TEXT_EDIT_MODE_VIEW)\n            state->mode = NK_TEXT_EDIT_MODE_INSERT;\n        break;\n    case NK_KEY_TEXT_REPLACE_MODE:\n        if (state->mode == NK_TEXT_EDIT_MODE_VIEW)\n            state->mode = NK_TEXT_EDIT_MODE_REPLACE;\n        break;\n    case NK_KEY_TEXT_RESET_MODE:\n        if (state->mode == NK_TEXT_EDIT_MODE_INSERT ||\n            state->mode == NK_TEXT_EDIT_MODE_REPLACE)\n            state->mode = NK_TEXT_EDIT_MODE_VIEW;\n        break;\n\n    case NK_KEY_LEFT:\n        if (shift_mod) {\n            nk_textedit_clamp(state);\n            nk_textedit_prep_selection_at_cursor(state);\n            /* move selection left */\n            if (state->select_end > 0)\n                --state->select_end;\n            state->cursor = state->select_end;\n            state->has_preferred_x = 0;\n        } else {\n            /* if currently there's a selection,\n             * move cursor to start of selection */\n            if (NK_TEXT_HAS_SELECTION(state))\n                nk_textedit_move_to_first(state);\n            else if (state->cursor > 0)\n               --state->cursor;\n            state->has_preferred_x = 0;\n        } break;\n\n    case NK_KEY_RIGHT:\n        if (shift_mod) {\n            nk_textedit_prep_selection_at_cursor(state);\n            /* move selection right */\n            ++state->select_end;\n            nk_textedit_clamp(state);\n            state->cursor = state->select_end;\n            state->has_preferred_x = 0;\n        } else {\n            /* if currently there's a selection,\n             * move cursor to end of selection */\n            if (NK_TEXT_HAS_SELECTION(state))\n                nk_textedit_move_to_last(state);\n            else ++state->cursor;\n            nk_textedit_clamp(state);\n            state->has_preferred_x = 0;\n        } break;\n\n    case NK_KEY_TEXT_WORD_LEFT:\n        if (shift_mod) {\n            if( !NK_TEXT_HAS_SELECTION( state ) )\n            nk_textedit_prep_selection_at_cursor(state);\n            state->cursor = nk_textedit_move_to_word_previous(state);\n            state->select_end = state->cursor;\n            nk_textedit_clamp(state );\n        } else {\n            if (NK_TEXT_HAS_SELECTION(state))\n                nk_textedit_move_to_first(state);\n            else {\n                state->cursor = nk_textedit_move_to_word_previous(state);\n                nk_textedit_clamp(state );\n            }\n        } break;\n\n    case NK_KEY_TEXT_WORD_RIGHT:\n        if (shift_mod) {\n            if( !NK_TEXT_HAS_SELECTION( state ) )\n                nk_textedit_prep_selection_at_cursor(state);\n            state->cursor = nk_textedit_move_to_word_next(state);\n            state->select_end = state->cursor;\n            nk_textedit_clamp(state);\n        } else {\n            if (NK_TEXT_HAS_SELECTION(state))\n                nk_textedit_move_to_last(state);\n            else {\n                state->cursor = nk_textedit_move_to_word_next(state);\n                nk_textedit_clamp(state );\n            }\n        } break;\n\n    case NK_KEY_DOWN: {\n        struct nk_text_find find;\n        struct nk_text_edit_row row;\n        int i, sel = shift_mod;\n\n        if (state->single_line) {\n            /* on windows, up&down in single-line behave like left&right */\n            key = NK_KEY_RIGHT;\n            goto retry;\n        }\n\n        if (sel)\n            nk_textedit_prep_selection_at_cursor(state);\n        else if (NK_TEXT_HAS_SELECTION(state))\n            nk_textedit_move_to_last(state);\n\n        /* compute current position of cursor point */\n        nk_textedit_clamp(state);\n        nk_textedit_find_charpos(&find, state, state->cursor, state->single_line,\n            font, row_height);\n\n        /* now find character position down a row */\n        if (find.length)\n        {\n            float x;\n            float goal_x = state->has_preferred_x ? state->preferred_x : find.x;\n            int start = find.first_char + find.length;\n\n            state->cursor = start;\n            nk_textedit_layout_row(&row, state, state->cursor, row_height, font);\n            x = row.x0;\n\n            for (i=0; i < row.num_chars && x < row.x1; ++i) {\n                float dx = nk_textedit_get_width(state, start, i, font);\n                x += dx;\n                if (x > goal_x)\n                    break;\n                ++state->cursor;\n            }\n            nk_textedit_clamp(state);\n\n            state->has_preferred_x = 1;\n            state->preferred_x = goal_x;\n            if (sel)\n                state->select_end = state->cursor;\n        }\n    } break;\n\n    case NK_KEY_UP: {\n        struct nk_text_find find;\n        struct nk_text_edit_row row;\n        int i, sel = shift_mod;\n\n        if (state->single_line) {\n            /* on windows, up&down become left&right */\n            key = NK_KEY_LEFT;\n            goto retry;\n        }\n\n        if (sel)\n            nk_textedit_prep_selection_at_cursor(state);\n        else if (NK_TEXT_HAS_SELECTION(state))\n            nk_textedit_move_to_first(state);\n\n         /* compute current position of cursor point */\n         nk_textedit_clamp(state);\n         nk_textedit_find_charpos(&find, state, state->cursor, state->single_line,\n                font, row_height);\n\n         /* can only go up if there's a previous row */\n         if (find.prev_first != find.first_char) {\n            /* now find character position up a row */\n            float x;\n            float goal_x = state->has_preferred_x ? state->preferred_x : find.x;\n\n            state->cursor = find.prev_first;\n            nk_textedit_layout_row(&row, state, state->cursor, row_height, font);\n            x = row.x0;\n\n            for (i=0; i < row.num_chars && x < row.x1; ++i) {\n                float dx = nk_textedit_get_width(state, find.prev_first, i, font);\n                x += dx;\n                if (x > goal_x)\n                    break;\n                ++state->cursor;\n            }\n            nk_textedit_clamp(state);\n\n            state->has_preferred_x = 1;\n            state->preferred_x = goal_x;\n            if (sel) state->select_end = state->cursor;\n         }\n      } break;\n\n    case NK_KEY_DEL:\n        if (state->mode == NK_TEXT_EDIT_MODE_VIEW)\n            break;\n        if (NK_TEXT_HAS_SELECTION(state))\n            nk_textedit_delete_selection(state);\n        else {\n            int n = state->string.len;\n            if (state->cursor < n)\n                nk_textedit_delete(state, state->cursor, 1);\n         }\n         state->has_preferred_x = 0;\n         break;\n\n    case NK_KEY_BACKSPACE:\n        if (state->mode == NK_TEXT_EDIT_MODE_VIEW)\n            break;\n        if (NK_TEXT_HAS_SELECTION(state))\n            nk_textedit_delete_selection(state);\n        else {\n            nk_textedit_clamp(state);\n            if (state->cursor > 0) {\n                nk_textedit_delete(state, state->cursor-1, 1);\n                --state->cursor;\n            }\n         }\n         state->has_preferred_x = 0;\n         break;\n\n    case NK_KEY_TEXT_START:\n         if (shift_mod) {\n            nk_textedit_prep_selection_at_cursor(state);\n            state->cursor = state->select_end = 0;\n            state->has_preferred_x = 0;\n         } else {\n            state->cursor = state->select_start = state->select_end = 0;\n            state->has_preferred_x = 0;\n         }\n         break;\n\n    case NK_KEY_TEXT_END:\n         if (shift_mod) {\n            nk_textedit_prep_selection_at_cursor(state);\n            state->cursor = state->select_end = state->string.len;\n            state->has_preferred_x = 0;\n         } else {\n            state->cursor = state->string.len;\n            state->select_start = state->select_end = 0;\n            state->has_preferred_x = 0;\n         }\n         break;\n\n    case NK_KEY_TEXT_LINE_START: {\n        if (shift_mod) {\n            struct nk_text_find find;\n           nk_textedit_clamp(state);\n            nk_textedit_prep_selection_at_cursor(state);\n            if (state->string.len && state->cursor == state->string.len)\n                --state->cursor;\n            nk_textedit_find_charpos(&find, state,state->cursor, state->single_line,\n                font, row_height);\n            state->cursor = state->select_end = find.first_char;\n            state->has_preferred_x = 0;\n        } else {\n            struct nk_text_find find;\n            if (state->string.len && state->cursor == state->string.len)\n                --state->cursor;\n            nk_textedit_clamp(state);\n            nk_textedit_move_to_first(state);\n            nk_textedit_find_charpos(&find, state, state->cursor, state->single_line,\n                font, row_height);\n            state->cursor = find.first_char;\n            state->has_preferred_x = 0;\n        }\n      } break;\n\n    case NK_KEY_TEXT_LINE_END: {\n        if (shift_mod) {\n            struct nk_text_find find;\n            nk_textedit_clamp(state);\n            nk_textedit_prep_selection_at_cursor(state);\n            nk_textedit_find_charpos(&find, state, state->cursor, state->single_line,\n                font, row_height);\n            state->has_preferred_x = 0;\n            state->cursor = find.first_char + find.length;\n            if (find.length > 0 && nk_str_rune_at(&state->string, state->cursor-1) == '\\n')\n                --state->cursor;\n            state->select_end = state->cursor;\n        } else {\n            struct nk_text_find find;\n            nk_textedit_clamp(state);\n            nk_textedit_move_to_first(state);\n            nk_textedit_find_charpos(&find, state, state->cursor, state->single_line,\n                font, row_height);\n\n            state->has_preferred_x = 0;\n            state->cursor = find.first_char + find.length;\n            if (find.length > 0 && nk_str_rune_at(&state->string, state->cursor-1) == '\\n')\n                --state->cursor;\n        }} break;\n    }\n}\n\nNK_INTERN void\nnk_textedit_flush_redo(struct nk_text_undo_state *state)\n{\n    state->redo_point = NK_TEXTEDIT_UNDOSTATECOUNT;\n    state->redo_char_point = NK_TEXTEDIT_UNDOCHARCOUNT;\n}\n\nNK_INTERN void\nnk_textedit_discard_undo(struct nk_text_undo_state *state)\n{\n    /* discard the oldest entry in the undo list */\n    if (state->undo_point > 0) {\n        /* if the 0th undo state has characters, clean those up */\n        if (state->undo_rec[0].char_storage >= 0) {\n            int n = state->undo_rec[0].insert_length, i;\n            /* delete n characters from all other records */\n            state->undo_char_point = (short)(state->undo_char_point - n);\n            NK_MEMCPY(state->undo_char, state->undo_char + n,\n                (nk_size)state->undo_char_point*sizeof(nk_rune));\n            for (i=0; i < state->undo_point; ++i) {\n                if (state->undo_rec[i].char_storage >= 0)\n                state->undo_rec[i].char_storage = (short)\n                    (state->undo_rec[i].char_storage - n);\n            }\n        }\n        --state->undo_point;\n        NK_MEMCPY(state->undo_rec, state->undo_rec+1,\n            (nk_size)((nk_size)state->undo_point * sizeof(state->undo_rec[0])));\n    }\n}\n\nNK_INTERN void\nnk_textedit_discard_redo(struct nk_text_undo_state *state)\n{\n/*  discard the oldest entry in the redo list--it's bad if this\n    ever happens, but because undo & redo have to store the actual\n    characters in different cases, the redo character buffer can\n    fill up even though the undo buffer didn't */\n    nk_size num;\n    int k = NK_TEXTEDIT_UNDOSTATECOUNT-1;\n    if (state->redo_point <= k) {\n        /* if the k'th undo state has characters, clean those up */\n        if (state->undo_rec[k].char_storage >= 0) {\n            int n = state->undo_rec[k].insert_length, i;\n            /* delete n characters from all other records */\n            state->redo_char_point = (short)(state->redo_char_point + n);\n            num = (nk_size)(NK_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point);\n            NK_MEMCPY(state->undo_char + state->redo_char_point,\n                state->undo_char + state->redo_char_point-n, num * sizeof(char));\n            for (i = state->redo_point; i < k; ++i) {\n                if (state->undo_rec[i].char_storage >= 0) {\n                    state->undo_rec[i].char_storage = (short)\n                        (state->undo_rec[i].char_storage + n);\n                }\n            }\n        }\n        ++state->redo_point;\n        num = (nk_size)(NK_TEXTEDIT_UNDOSTATECOUNT - state->redo_point);\n        if (num) NK_MEMCPY(state->undo_rec + state->redo_point-1,\n            state->undo_rec + state->redo_point, num * sizeof(state->undo_rec[0]));\n    }\n}\n\nNK_INTERN struct nk_text_undo_record*\nnk_textedit_create_undo_record(struct nk_text_undo_state *state, int numchars)\n{\n    /* any time we create a new undo record, we discard redo*/\n    nk_textedit_flush_redo(state);\n\n    /* if we have no free records, we have to make room,\n     * by sliding the existing records down */\n    if (state->undo_point == NK_TEXTEDIT_UNDOSTATECOUNT)\n        nk_textedit_discard_undo(state);\n\n    /* if the characters to store won't possibly fit in the buffer,\n     * we can't undo */\n    if (numchars > NK_TEXTEDIT_UNDOCHARCOUNT) {\n        state->undo_point = 0;\n        state->undo_char_point = 0;\n        return 0;\n    }\n\n    /* if we don't have enough free characters in the buffer,\n     * we have to make room */\n    while (state->undo_char_point + numchars > NK_TEXTEDIT_UNDOCHARCOUNT)\n        nk_textedit_discard_undo(state);\n    return &state->undo_rec[state->undo_point++];\n}\n\nNK_INTERN nk_rune*\nnk_textedit_createundo(struct nk_text_undo_state *state, int pos,\n    int insert_len, int delete_len)\n{\n    struct nk_text_undo_record *r = nk_textedit_create_undo_record(state, insert_len);\n    if (r == 0)\n        return 0;\n\n    r->where = pos;\n    r->insert_length = (short) insert_len;\n    r->delete_length = (short) delete_len;\n\n    if (insert_len == 0) {\n        r->char_storage = -1;\n        return 0;\n    } else {\n        r->char_storage = state->undo_char_point;\n        state->undo_char_point = (short)(state->undo_char_point +  insert_len);\n        return &state->undo_char[r->char_storage];\n    }\n}\n\nNK_API void\nnk_textedit_undo(struct nk_text_edit *state)\n{\n    struct nk_text_undo_state *s = &state->undo;\n    struct nk_text_undo_record u, *r;\n    if (s->undo_point == 0)\n        return;\n\n    /* we need to do two things: apply the undo record, and create a redo record */\n    u = s->undo_rec[s->undo_point-1];\n    r = &s->undo_rec[s->redo_point-1];\n    r->char_storage = -1;\n\n    r->insert_length = u.delete_length;\n    r->delete_length = u.insert_length;\n    r->where = u.where;\n\n    if (u.delete_length)\n    {\n       /*   if the undo record says to delete characters, then the redo record will\n            need to re-insert the characters that get deleted, so we need to store\n            them.\n            there are three cases:\n                - there's enough room to store the characters\n                - characters stored for *redoing* don't leave room for redo\n                - characters stored for *undoing* don't leave room for redo\n            if the last is true, we have to bail */\n        if (s->undo_char_point + u.delete_length >= NK_TEXTEDIT_UNDOCHARCOUNT) {\n            /* the undo records take up too much character space; there's no space\n            * to store the redo characters */\n            r->insert_length = 0;\n        } else {\n            int i;\n            /* there's definitely room to store the characters eventually */\n            while (s->undo_char_point + u.delete_length > s->redo_char_point) {\n                /* there's currently not enough room, so discard a redo record */\n                nk_textedit_discard_redo(s);\n                /* should never happen: */\n                if (s->redo_point == NK_TEXTEDIT_UNDOSTATECOUNT)\n                    return;\n            }\n\n            r = &s->undo_rec[s->redo_point-1];\n            r->char_storage = (short)(s->redo_char_point - u.delete_length);\n            s->redo_char_point = (short)(s->redo_char_point -  u.delete_length);\n\n            /* now save the characters */\n            for (i=0; i < u.delete_length; ++i)\n                s->undo_char[r->char_storage + i] =\n                    nk_str_rune_at(&state->string, u.where + i);\n        }\n        /* now we can carry out the deletion */\n        nk_str_delete_runes(&state->string, u.where, u.delete_length);\n    }\n\n    /* check type of recorded action: */\n    if (u.insert_length) {\n        /* easy case: was a deletion, so we need to insert n characters */\n        nk_str_insert_text_runes(&state->string, u.where,\n            &s->undo_char[u.char_storage], u.insert_length);\n        s->undo_char_point = (short)(s->undo_char_point - u.insert_length);\n    }\n    state->cursor = (short)(u.where + u.insert_length);\n\n    s->undo_point--;\n    s->redo_point--;\n}\n\nNK_API void\nnk_textedit_redo(struct nk_text_edit *state)\n{\n    struct nk_text_undo_state *s = &state->undo;\n    struct nk_text_undo_record *u, r;\n    if (s->redo_point == NK_TEXTEDIT_UNDOSTATECOUNT)\n        return;\n\n    /* we need to do two things: apply the redo record, and create an undo record */\n    u = &s->undo_rec[s->undo_point];\n    r = s->undo_rec[s->redo_point];\n\n    /* we KNOW there must be room for the undo record, because the redo record\n    was derived from an undo record */\n    u->delete_length = r.insert_length;\n    u->insert_length = r.delete_length;\n    u->where = r.where;\n    u->char_storage = -1;\n\n    if (r.delete_length) {\n        /* the redo record requires us to delete characters, so the undo record\n        needs to store the characters */\n        if (s->undo_char_point + u->insert_length > s->redo_char_point) {\n            u->insert_length = 0;\n            u->delete_length = 0;\n        } else {\n            int i;\n            u->char_storage = s->undo_char_point;\n            s->undo_char_point = (short)(s->undo_char_point + u->insert_length);\n\n            /* now save the characters */\n            for (i=0; i < u->insert_length; ++i) {\n                s->undo_char[u->char_storage + i] =\n                    nk_str_rune_at(&state->string, u->where + i);\n            }\n        }\n        nk_str_delete_runes(&state->string, r.where, r.delete_length);\n    }\n\n    if (r.insert_length) {\n        /* easy case: need to insert n characters */\n        nk_str_insert_text_runes(&state->string, r.where,\n            &s->undo_char[r.char_storage], r.insert_length);\n    }\n    state->cursor = r.where + r.insert_length;\n\n    s->undo_point++;\n    s->redo_point++;\n}\n\nNK_INTERN void\nnk_textedit_makeundo_insert(struct nk_text_edit *state, int where, int length)\n{\n    nk_textedit_createundo(&state->undo, where, 0, length);\n}\n\nNK_INTERN void\nnk_textedit_makeundo_delete(struct nk_text_edit *state, int where, int length)\n{\n    int i;\n    nk_rune *p = nk_textedit_createundo(&state->undo, where, length, 0);\n    if (p) {\n        for (i=0; i < length; ++i)\n            p[i] = nk_str_rune_at(&state->string, where+i);\n    }\n}\n\nNK_INTERN void\nnk_textedit_makeundo_replace(struct nk_text_edit *state, int where,\n    int old_length, int new_length)\n{\n    int i;\n    nk_rune *p = nk_textedit_createundo(&state->undo, where, old_length, new_length);\n    if (p) {\n        for (i=0; i < old_length; ++i)\n            p[i] = nk_str_rune_at(&state->string, where+i);\n    }\n}\n\nNK_INTERN void\nnk_textedit_clear_state(struct nk_text_edit *state, enum nk_text_edit_type type,\n    nk_plugin_filter filter)\n{\n    /* reset the state to default */\n   state->undo.undo_point = 0;\n   state->undo.undo_char_point = 0;\n   state->undo.redo_point = NK_TEXTEDIT_UNDOSTATECOUNT;\n   state->undo.redo_char_point = NK_TEXTEDIT_UNDOCHARCOUNT;\n   state->select_end = state->select_start = 0;\n   state->cursor = 0;\n   state->has_preferred_x = 0;\n   state->preferred_x = 0;\n   state->cursor_at_end_of_line = 0;\n   state->initialized = 1;\n   state->single_line = (unsigned char)(type == NK_TEXT_EDIT_SINGLE_LINE);\n   state->mode = NK_TEXT_EDIT_MODE_VIEW;\n   state->filter = filter;\n   state->scrollbar = nk_vec2(0,0);\n}\n\nNK_API void\nnk_textedit_init_fixed(struct nk_text_edit *state, void *memory, nk_size size)\n{\n    NK_ASSERT(state);\n    NK_ASSERT(memory);\n    if (!state || !memory || !size) return;\n    NK_MEMSET(state, 0, sizeof(struct nk_text_edit));\n    nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0);\n    nk_str_init_fixed(&state->string, memory, size);\n}\n\nNK_API void\nnk_textedit_init(struct nk_text_edit *state, struct nk_allocator *alloc, nk_size size)\n{\n    NK_ASSERT(state);\n    NK_ASSERT(alloc);\n    if (!state || !alloc) return;\n    NK_MEMSET(state, 0, sizeof(struct nk_text_edit));\n    nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0);\n    nk_str_init(&state->string, alloc, size);\n}\n\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_API void\nnk_textedit_init_default(struct nk_text_edit *state)\n{\n    NK_ASSERT(state);\n    if (!state) return;\n    NK_MEMSET(state, 0, sizeof(struct nk_text_edit));\n    nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0);\n    nk_str_init_default(&state->string);\n}\n#endif\n\nNK_API void\nnk_textedit_select_all(struct nk_text_edit *state)\n{\n    NK_ASSERT(state);\n    state->select_start = 0;\n    state->select_end = state->string.len;\n}\n\nNK_API void\nnk_textedit_free(struct nk_text_edit *state)\n{\n    NK_ASSERT(state);\n    if (!state) return;\n    nk_str_free(&state->string);\n}\n\n/* ===============================================================\n *\n *                          TEXT WIDGET\n *\n * ===============================================================*/\n#define nk_widget_state_reset(s)\\\n    if ((*(s)) & NK_WIDGET_STATE_MODIFIED)\\\n        (*(s)) = NK_WIDGET_STATE_INACTIVE|NK_WIDGET_STATE_MODIFIED;\\\n    else (*(s)) = NK_WIDGET_STATE_INACTIVE;\n\nstruct nk_text {\n    struct nk_vec2 padding;\n    struct nk_color background;\n    struct nk_color text;\n};\n\nNK_INTERN void\nnk_widget_text(struct nk_command_buffer *o, struct nk_rect b,\n    const char *string, int len, const struct nk_text *t,\n    nk_flags a, const struct nk_user_font *f)\n{\n    struct nk_rect label;\n    float text_width;\n\n    NK_ASSERT(o);\n    NK_ASSERT(t);\n    if (!o || !t) return;\n\n    b.h = NK_MAX(b.h, 2 * t->padding.y);\n    label.x = 0; label.w = 0;\n    label.y = b.y + t->padding.y;\n    label.h = NK_MIN(f->height, b.h - 2 * t->padding.y);\n\n    text_width = f->width(f->userdata, f->height, (const char*)string, len);\n    text_width += (2.0f * t->padding.x);\n\n    /* align in x-axis */\n    if (a & NK_TEXT_ALIGN_LEFT) {\n        label.x = b.x + t->padding.x;\n        label.w = NK_MAX(0, b.w - 2 * t->padding.x);\n    } else if (a & NK_TEXT_ALIGN_CENTERED) {\n        label.w = NK_MAX(1, 2 * t->padding.x + (float)text_width);\n        label.x = (b.x + t->padding.x + ((b.w - 2 * t->padding.x) - label.w) / 2);\n        label.x = NK_MAX(b.x + t->padding.x, label.x);\n        label.w = NK_MIN(b.x + b.w, label.x + label.w);\n        if (label.w >= label.x) label.w -= label.x;\n    } else if (a & NK_TEXT_ALIGN_RIGHT) {\n        label.x = NK_MAX(b.x + t->padding.x, (b.x + b.w) - (2 * t->padding.x + (float)text_width));\n        label.w = (float)text_width + 2 * t->padding.x;\n    } else return;\n\n    /* align in y-axis */\n    if (a & NK_TEXT_ALIGN_MIDDLE) {\n        label.y = b.y + b.h/2.0f - (float)f->height/2.0f;\n        label.h = NK_MAX(b.h/2.0f, b.h - (b.h/2.0f + f->height/2.0f));\n    } else if (a & NK_TEXT_ALIGN_BOTTOM) {\n        label.y = b.y + b.h - f->height;\n        label.h = f->height;\n    }\n    nk_draw_text(o, label, (const char*)string,\n        len, f, t->background, t->text);\n}\n\nNK_INTERN void\nnk_widget_text_wrap(struct nk_command_buffer *o, struct nk_rect b,\n    const char *string, int len, const struct nk_text *t,\n    const struct nk_user_font *f)\n{\n    float width;\n    int glyphs = 0;\n    int fitting = 0;\n    int done = 0;\n    struct nk_rect line;\n    struct nk_text text;\n    NK_INTERN nk_rune seperator[] = {' '};\n\n    NK_ASSERT(o);\n    NK_ASSERT(t);\n    if (!o || !t) return;\n\n    text.padding = nk_vec2(0,0);\n    text.background = t->background;\n    text.text = t->text;\n\n    b.w = NK_MAX(b.w, 2 * t->padding.x);\n    b.h = NK_MAX(b.h, 2 * t->padding.y);\n    b.h = b.h - 2 * t->padding.y;\n\n    line.x = b.x + t->padding.x;\n    line.y = b.y + t->padding.y;\n    line.w = b.w - 2 * t->padding.x;\n    line.h = 2 * t->padding.y + f->height;\n\n    fitting = nk_text_clamp(f, string, len, line.w, &glyphs, &width, seperator,NK_LEN(seperator));\n    while (done < len) {\n        if (!fitting || line.y + line.h >= (b.y + b.h)) break;\n        nk_widget_text(o, line, &string[done], fitting, &text, NK_TEXT_LEFT, f);\n        done += fitting;\n        line.y += f->height + 2 * t->padding.y;\n        fitting = nk_text_clamp(f, &string[done], len - done, line.w, &glyphs, &width, seperator,NK_LEN(seperator));\n    }\n}\n\n/* ===============================================================\n *\n *                          BUTTON\n *\n * ===============================================================*/\nNK_INTERN void\nnk_draw_symbol(struct nk_command_buffer *out, enum nk_symbol_type type,\n    struct nk_rect content, struct nk_color background, struct nk_color foreground,\n    float border_width, const struct nk_user_font *font)\n{\n    switch (type) {\n    case NK_SYMBOL_X:\n    case NK_SYMBOL_UNDERSCORE:\n    case NK_SYMBOL_PLUS:\n    case NK_SYMBOL_MINUS: {\n        /* single character text symbol */\n        const char *X = (type == NK_SYMBOL_X) ? \"x\":\n            (type == NK_SYMBOL_UNDERSCORE) ? \"_\":\n            (type == NK_SYMBOL_PLUS) ? \"+\": \"-\";\n        struct nk_text text;\n        text.padding = nk_vec2(0,0);\n        text.background = background;\n        text.text = foreground;\n        nk_widget_text(out, content, X, 1, &text, NK_TEXT_CENTERED, font);\n    } break;\n    case NK_SYMBOL_CIRCLE_SOLID:\n    case NK_SYMBOL_CIRCLE_OUTLINE:\n    case NK_SYMBOL_RECT_SOLID:\n    case NK_SYMBOL_RECT_OUTLINE: {\n        /* simple empty/filled shapes */\n        if (type == NK_SYMBOL_RECT_SOLID || type == NK_SYMBOL_RECT_OUTLINE) {\n            nk_fill_rect(out, content,  0, foreground);\n            if (type == NK_SYMBOL_RECT_OUTLINE)\n                nk_fill_rect(out, nk_shrink_rect(content, border_width), 0, background);\n        } else {\n            nk_fill_circle(out, content, foreground);\n            if (type == NK_SYMBOL_CIRCLE_OUTLINE)\n                nk_fill_circle(out, nk_shrink_rect(content, 1), background);\n        }\n    } break;\n    case NK_SYMBOL_TRIANGLE_UP:\n    case NK_SYMBOL_TRIANGLE_DOWN:\n    case NK_SYMBOL_TRIANGLE_LEFT:\n    case NK_SYMBOL_TRIANGLE_RIGHT: {\n        enum nk_heading heading;\n        struct nk_vec2 points[3];\n        heading = (type == NK_SYMBOL_TRIANGLE_RIGHT) ? NK_RIGHT :\n            (type == NK_SYMBOL_TRIANGLE_LEFT) ? NK_LEFT:\n            (type == NK_SYMBOL_TRIANGLE_UP) ? NK_UP: NK_DOWN;\n        nk_triangle_from_direction(points, content, 0, 0, heading);\n        nk_fill_triangle(out, points[0].x, points[0].y, points[1].x, points[1].y,\n            points[2].x, points[2].y, foreground);\n    } break;\n    default:\n    case NK_SYMBOL_NONE:\n    case NK_SYMBOL_MAX: break;\n    }\n}\n\nNK_INTERN int\nnk_button_behavior(nk_flags *state, struct nk_rect r,\n    const struct nk_input *i, enum nk_button_behavior behavior)\n{\n    int ret = 0;\n    nk_widget_state_reset(state);\n    if (!i) return 0;\n    if (nk_input_is_mouse_hovering_rect(i, r)) {\n        *state = NK_WIDGET_STATE_HOVERED;\n        if (nk_input_is_mouse_down(i, NK_BUTTON_LEFT))\n            *state = NK_WIDGET_STATE_ACTIVE;\n        if (nk_input_has_mouse_click_in_rect(i, NK_BUTTON_LEFT, r)) {\n            ret = (behavior != NK_BUTTON_DEFAULT) ?\n                nk_input_is_mouse_down(i, NK_BUTTON_LEFT):\n#ifdef NK_BUTTON_TRIGGER_ON_RELEASE\n                nk_input_is_mouse_released(i, NK_BUTTON_LEFT);\n#else\n                nk_input_is_mouse_pressed(i, NK_BUTTON_LEFT);\n#endif\n        }\n    }\n    if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(i, r))\n        *state |= NK_WIDGET_STATE_ENTERED;\n    else if (nk_input_is_mouse_prev_hovering_rect(i, r))\n        *state |= NK_WIDGET_STATE_LEFT;\n    return ret;\n}\n\nNK_INTERN const struct nk_style_item*\nnk_draw_button(struct nk_command_buffer *out,\n    const struct nk_rect *bounds, nk_flags state,\n    const struct nk_style_button *style)\n{\n    const struct nk_style_item *background;\n    if (state & NK_WIDGET_STATE_HOVER)\n        background = &style->hover;\n    else if (state & NK_WIDGET_STATE_ACTIVED)\n        background = &style->active;\n    else background = &style->normal;\n\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        nk_draw_image(out, *bounds, &background->data.image, nk_white);\n    } else {\n        nk_fill_rect(out, *bounds, style->rounding, background->data.color);\n        nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color);\n    }\n    return background;\n}\n\nNK_INTERN int\nnk_do_button(nk_flags *state, struct nk_command_buffer *out, struct nk_rect r,\n    const struct nk_style_button *style, const struct nk_input *in,\n    enum nk_button_behavior behavior, struct nk_rect *content)\n{\n    struct nk_rect bounds;\n    NK_ASSERT(style);\n    NK_ASSERT(state);\n    NK_ASSERT(out);\n    if (!out || !style)\n        return nk_false;\n\n    /* calculate button content space */\n    content->x = r.x + style->padding.x + style->border + style->rounding;\n    content->y = r.y + style->padding.y + style->border + style->rounding;\n    content->w = r.w - (2 * style->padding.x + style->border + style->rounding*2);\n    content->h = r.h - (2 * style->padding.y + style->border + style->rounding*2);\n\n    /* execute button behavior */\n    bounds.x = r.x - style->touch_padding.x;\n    bounds.y = r.y - style->touch_padding.y;\n    bounds.w = r.w + 2 * style->touch_padding.x;\n    bounds.h = r.h + 2 * style->touch_padding.y;\n    return nk_button_behavior(state, bounds, in, behavior);\n}\n\nNK_INTERN void\nnk_draw_button_text(struct nk_command_buffer *out,\n    const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state,\n    const struct nk_style_button *style, const char *txt, int len,\n    nk_flags text_alignment, const struct nk_user_font *font)\n{\n    struct nk_text text;\n    const struct nk_style_item *background;\n    background = nk_draw_button(out, bounds, state, style);\n\n    /* select correct colors/images */\n    if (background->type == NK_STYLE_ITEM_COLOR)\n        text.background = background->data.color;\n    else text.background = style->text_background;\n    if (state & NK_WIDGET_STATE_HOVER)\n        text.text = style->text_hover;\n    else if (state & NK_WIDGET_STATE_ACTIVED)\n        text.text = style->text_active;\n    else text.text = style->text_normal;\n\n    text.padding = nk_vec2(0,0);\n    nk_widget_text(out, *content, txt, len, &text, text_alignment, font);\n}\n\nNK_INTERN int\nnk_do_button_text(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect bounds,\n    const char *string, int len, nk_flags align, enum nk_button_behavior behavior,\n    const struct nk_style_button *style, const struct nk_input *in,\n    const struct nk_user_font *font)\n{\n    struct nk_rect content;\n    int ret = nk_false;\n\n    NK_ASSERT(state);\n    NK_ASSERT(style);\n    NK_ASSERT(out);\n    NK_ASSERT(string);\n    NK_ASSERT(font);\n    if (!out || !style || !font || !string)\n        return nk_false;\n\n    ret = nk_do_button(state, out, bounds, style, in, behavior, &content);\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_button_text(out, &bounds, &content, *state, style, string, len, align, font);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return ret;\n}\n\nNK_INTERN void\nnk_draw_button_symbol(struct nk_command_buffer *out,\n    const struct nk_rect *bounds, const struct nk_rect *content,\n    nk_flags state, const struct nk_style_button *style,\n    enum nk_symbol_type type, const struct nk_user_font *font)\n{\n    struct nk_color sym, bg;\n    const struct nk_style_item *background;\n\n    /* select correct colors/images */\n    background = nk_draw_button(out, bounds, state, style);\n    if (background->type == NK_STYLE_ITEM_COLOR)\n        bg = background->data.color;\n    else bg = style->text_background;\n\n    if (state & NK_WIDGET_STATE_HOVER)\n        sym = style->text_hover;\n    else if (state & NK_WIDGET_STATE_ACTIVED)\n        sym = style->text_active;\n    else sym = style->text_normal;\n    nk_draw_symbol(out, type, *content, bg, sym, 1, font);\n}\n\nNK_INTERN int\nnk_do_button_symbol(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect bounds,\n    enum nk_symbol_type symbol, enum nk_button_behavior behavior,\n    const struct nk_style_button *style, const struct nk_input *in,\n    const struct nk_user_font *font)\n{\n    int ret;\n    struct nk_rect content;\n\n    NK_ASSERT(state);\n    NK_ASSERT(style);\n    NK_ASSERT(font);\n    NK_ASSERT(out);\n    if (!out || !style || !font || !state)\n        return nk_false;\n\n    ret = nk_do_button(state, out, bounds, style, in, behavior, &content);\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_button_symbol(out, &bounds, &content, *state, style, symbol, font);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return ret;\n}\n\nNK_INTERN void\nnk_draw_button_image(struct nk_command_buffer *out,\n    const struct nk_rect *bounds, const struct nk_rect *content,\n    nk_flags state, const struct nk_style_button *style, const struct nk_image *img)\n{\n    nk_draw_button(out, bounds, state, style);\n    nk_draw_image(out, *content, img, nk_white);\n}\n\nNK_INTERN int\nnk_do_button_image(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect bounds,\n    struct nk_image img, enum nk_button_behavior b,\n    const struct nk_style_button *style, const struct nk_input *in)\n{\n    int ret;\n    struct nk_rect content;\n\n    NK_ASSERT(state);\n    NK_ASSERT(style);\n    NK_ASSERT(out);\n    if (!out || !style || !state)\n        return nk_false;\n\n    ret = nk_do_button(state, out, bounds, style, in, b, &content);\n    content.x += style->image_padding.x;\n    content.y += style->image_padding.y;\n    content.w -= 2 * style->image_padding.x;\n    content.h -= 2 * style->image_padding.y;\n\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_button_image(out, &bounds, &content, *state, style, &img);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return ret;\n}\n\nNK_INTERN void\nnk_draw_button_text_symbol(struct nk_command_buffer *out,\n    const struct nk_rect *bounds, const struct nk_rect *label,\n    const struct nk_rect *symbol, nk_flags state, const struct nk_style_button *style,\n    const char *str, int len, enum nk_symbol_type type,\n    const struct nk_user_font *font)\n{\n    struct nk_color sym;\n    struct nk_text text;\n    const struct nk_style_item *background;\n\n    /* select correct background colors/images */\n    background = nk_draw_button(out, bounds, state, style);\n    if (background->type == NK_STYLE_ITEM_COLOR)\n        text.background = background->data.color;\n    else text.background = style->text_background;\n\n    /* select correct text colors */\n    if (state & NK_WIDGET_STATE_HOVER) {\n        sym = style->text_hover;\n        text.text = style->text_hover;\n    } else if (state & NK_WIDGET_STATE_ACTIVED) {\n        sym = style->text_active;\n        text.text = style->text_active;\n    } else {\n        sym = style->text_normal;\n        text.text = style->text_normal;\n    }\n\n    text.padding = nk_vec2(0,0);\n    nk_draw_symbol(out, type, *symbol, style->text_background, sym, 0, font);\n    nk_widget_text(out, *label, str, len, &text, NK_TEXT_CENTERED, font);\n}\n\nNK_INTERN int\nnk_do_button_text_symbol(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect bounds,\n    enum nk_symbol_type symbol, const char *str, int len, nk_flags align,\n    enum nk_button_behavior behavior, const struct nk_style_button *style,\n    const struct nk_user_font *font, const struct nk_input *in)\n{\n    int ret;\n    struct nk_rect tri = {0,0,0,0};\n    struct nk_rect content;\n\n    NK_ASSERT(style);\n    NK_ASSERT(out);\n    NK_ASSERT(font);\n    if (!out || !style || !font)\n        return nk_false;\n\n    ret = nk_do_button(state, out, bounds, style, in, behavior, &content);\n    tri.y = content.y + (content.h/2) - font->height/2;\n    tri.w = font->height; tri.h = font->height;\n    if (align & NK_TEXT_ALIGN_LEFT) {\n        tri.x = (content.x + content.w) - (2 * style->padding.x + tri.w);\n        tri.x = NK_MAX(tri.x, 0);\n    } else tri.x = content.x + 2 * style->padding.x;\n\n    /* draw button */\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_button_text_symbol(out, &bounds, &content, &tri,\n        *state, style, str, len, symbol, font);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return ret;\n}\n\nNK_INTERN void\nnk_draw_button_text_image(struct nk_command_buffer *out,\n    const struct nk_rect *bounds, const struct nk_rect *label,\n    const struct nk_rect *image, nk_flags state, const struct nk_style_button *style,\n    const char *str, int len, const struct nk_user_font *font,\n    const struct nk_image *img)\n{\n    struct nk_text text;\n    const struct nk_style_item *background;\n    background = nk_draw_button(out, bounds, state, style);\n\n    /* select correct colors */\n    if (background->type == NK_STYLE_ITEM_COLOR)\n        text.background = background->data.color;\n    else text.background = style->text_background;\n    if (state & NK_WIDGET_STATE_HOVER)\n        text.text = style->text_hover;\n    else if (state & NK_WIDGET_STATE_ACTIVED)\n        text.text = style->text_active;\n    else text.text = style->text_normal;\n\n    text.padding = nk_vec2(0,0);\n    nk_widget_text(out, *label, str, len, &text, NK_TEXT_CENTERED, font);\n    nk_draw_image(out, *image, img, nk_white);\n}\n\nNK_INTERN int\nnk_do_button_text_image(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect bounds,\n    struct nk_image img, const char* str, int len, nk_flags align,\n    enum nk_button_behavior behavior, const struct nk_style_button *style,\n    const struct nk_user_font *font, const struct nk_input *in)\n{\n    int ret;\n    struct nk_rect icon;\n    struct nk_rect content;\n\n    NK_ASSERT(style);\n    NK_ASSERT(state);\n    NK_ASSERT(font);\n    NK_ASSERT(out);\n    if (!out || !font || !style || !str)\n        return nk_false;\n\n    ret = nk_do_button(state, out, bounds, style, in, behavior, &content);\n    icon.y = bounds.y + style->padding.y;\n    icon.w = icon.h = bounds.h - 2 * style->padding.y;\n    if (align & NK_TEXT_ALIGN_LEFT) {\n        icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w);\n        icon.x = NK_MAX(icon.x, 0);\n    } else icon.x = bounds.x + 2 * style->padding.x;\n\n    icon.x += style->image_padding.x;\n    icon.y += style->image_padding.y;\n    icon.w -= 2 * style->image_padding.x;\n    icon.h -= 2 * style->image_padding.y;\n\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_button_text_image(out, &bounds, &content, &icon, *state, style, str, len, font, &img);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return ret;\n}\n\n/* ===============================================================\n *\n *                          TOGGLE\n *\n * ===============================================================*/\nenum nk_toggle_type {\n    NK_TOGGLE_CHECK,\n    NK_TOGGLE_OPTION\n};\n\nNK_INTERN int\nnk_toggle_behavior(const struct nk_input *in, struct nk_rect select,\n    nk_flags *state, int active)\n{\n    nk_widget_state_reset(state);\n    if (nk_button_behavior(state, select, in, NK_BUTTON_DEFAULT)) {\n        *state = NK_WIDGET_STATE_ACTIVE;\n        active = !active;\n    }\n    if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, select))\n        *state |= NK_WIDGET_STATE_ENTERED;\n    else if (nk_input_is_mouse_prev_hovering_rect(in, select))\n        *state |= NK_WIDGET_STATE_LEFT;\n    return active;\n}\n\nNK_INTERN void\nnk_draw_checkbox(struct nk_command_buffer *out,\n    nk_flags state, const struct nk_style_toggle *style, int active,\n    const struct nk_rect *label, const struct nk_rect *selector,\n    const struct nk_rect *cursors, const char *string, int len,\n    const struct nk_user_font *font)\n{\n    const struct nk_style_item *background;\n    const struct nk_style_item *cursor;\n    struct nk_text text;\n\n    /* select correct colors/images */\n    if (state & NK_WIDGET_STATE_HOVER) {\n        background = &style->hover;\n        cursor = &style->cursor_hover;\n        text.text = style->text_hover;\n    } else if (state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->hover;\n        cursor = &style->cursor_hover;\n        text.text = style->text_active;\n    } else {\n        background = &style->normal;\n        cursor = &style->cursor_normal;\n        text.text = style->text_normal;\n    }\n\n    /* draw background and cursor */\n    if (background->type == NK_STYLE_ITEM_COLOR) {\n        nk_fill_rect(out, *selector, 0, style->border_color);\n        nk_fill_rect(out, nk_shrink_rect(*selector, style->border), 0, background->data.color);\n    } else nk_draw_image(out, *selector, &background->data.image, nk_white);\n    if (active) {\n        if (cursor->type == NK_STYLE_ITEM_IMAGE)\n            nk_draw_image(out, *cursors, &cursor->data.image, nk_white);\n        else nk_fill_rect(out, *cursors, 0, cursor->data.color);\n    }\n\n    text.padding.x = 0;\n    text.padding.y = 0;\n    text.background = style->text_background;\n    nk_widget_text(out, *label, string, len, &text, NK_TEXT_LEFT, font);\n}\n\nNK_INTERN void\nnk_draw_option(struct nk_command_buffer *out,\n    nk_flags state, const struct nk_style_toggle *style, int active,\n    const struct nk_rect *label, const struct nk_rect *selector,\n    const struct nk_rect *cursors, const char *string, int len,\n    const struct nk_user_font *font)\n{\n    const struct nk_style_item *background;\n    const struct nk_style_item *cursor;\n    struct nk_text text;\n\n    /* select correct colors/images */\n    if (state & NK_WIDGET_STATE_HOVER) {\n        background = &style->hover;\n        cursor = &style->cursor_hover;\n        text.text = style->text_hover;\n    } else if (state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->hover;\n        cursor = &style->cursor_hover;\n        text.text = style->text_active;\n    } else {\n        background = &style->normal;\n        cursor = &style->cursor_normal;\n        text.text = style->text_normal;\n    }\n\n    /* draw background and cursor */\n    if (background->type == NK_STYLE_ITEM_COLOR) {\n        nk_fill_circle(out, *selector, style->border_color);\n        nk_fill_circle(out, nk_shrink_rect(*selector, style->border), background->data.color);\n    } else nk_draw_image(out, *selector, &background->data.image, nk_white);\n    if (active) {\n        if (cursor->type == NK_STYLE_ITEM_IMAGE)\n            nk_draw_image(out, *cursors, &cursor->data.image, nk_white);\n        else nk_fill_circle(out, *cursors, cursor->data.color);\n    }\n\n    text.padding.x = 0;\n    text.padding.y = 0;\n    text.background = style->text_background;\n    nk_widget_text(out, *label, string, len, &text, NK_TEXT_LEFT, font);\n}\n\nNK_INTERN int\nnk_do_toggle(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect r,\n    int *active, const char *str, int len, enum nk_toggle_type type,\n    const struct nk_style_toggle *style, const struct nk_input *in,\n    const struct nk_user_font *font)\n{\n    int was_active;\n    struct nk_rect bounds;\n    struct nk_rect select;\n    struct nk_rect cursor;\n    struct nk_rect label;\n\n    NK_ASSERT(style);\n    NK_ASSERT(out);\n    NK_ASSERT(font);\n    if (!out || !style || !font || !active)\n        return 0;\n\n    r.w = NK_MAX(r.w, font->height + 2 * style->padding.x);\n    r.h = NK_MAX(r.h, font->height + 2 * style->padding.y);\n\n    /* add additional touch padding for touch screen devices */\n    bounds.x = r.x - style->touch_padding.x;\n    bounds.y = r.y - style->touch_padding.y;\n    bounds.w = r.w + 2 * style->touch_padding.x;\n    bounds.h = r.h + 2 * style->touch_padding.y;\n\n    /* calculate the selector space */\n    select.w = font->height;\n    select.h = select.w;\n    select.y = r.y + r.h/2.0f - select.h/2.0f;\n    select.x = r.x;\n\n    /* calculate the bounds of the cursor inside the selector */\n    cursor.x = select.x + style->padding.x + style->border;\n    cursor.y = select.y + style->padding.y + style->border;\n    cursor.w = select.w - (2 * style->padding.x + 2 * style->border);\n    cursor.h = select.h - (2 * style->padding.y + 2 * style->border);\n\n    /* label behind the selector */\n    label.x = select.x + select.w + style->spacing;\n    label.y = select.y;\n    label.w = NK_MAX(r.x + r.w, label.x) - label.x;\n    label.h = select.w;\n\n    /* update selector */\n    was_active = *active;\n    *active = nk_toggle_behavior(in, bounds, state, *active);\n\n    /* draw selector */\n    if (style->draw_begin)\n        style->draw_begin(out, style->userdata);\n    if (type == NK_TOGGLE_CHECK) {\n        nk_draw_checkbox(out, *state, style, *active, &label, &select, &cursor, str, len, font);\n    } else {\n        nk_draw_option(out, *state, style, *active, &label, &select, &cursor, str, len, font);\n    }\n    if (style->draw_end)\n        style->draw_end(out, style->userdata);\n    return (was_active != *active);\n}\n\n/* ===============================================================\n *\n *                          SELECTABLE\n *\n * ===============================================================*/\nNK_INTERN void\nnk_draw_selectable(struct nk_command_buffer *out,\n    nk_flags state, const struct nk_style_selectable *style, int active,\n    const struct nk_rect *bounds, const struct nk_rect *icon, const struct nk_image *img,\n    const char *string, int len, nk_flags align, const struct nk_user_font *font)\n{\n    const struct nk_style_item *background;\n    struct nk_text text;\n    text.padding = style->padding;\n\n    /* select correct colors/images */\n    if (!active) {\n        if (state & NK_WIDGET_STATE_ACTIVED) {\n            background = &style->pressed;\n            text.text = style->text_pressed;\n        } else if (state & NK_WIDGET_STATE_HOVER) {\n            background = &style->hover;\n            text.text = style->text_hover;\n        } else {\n            background = &style->normal;\n            text.text = style->text_normal;\n        }\n    } else {\n        if (state & NK_WIDGET_STATE_ACTIVED) {\n            background = &style->pressed_active;\n            text.text = style->text_pressed_active;\n        } else if (state & NK_WIDGET_STATE_HOVER) {\n            background = &style->hover_active;\n            text.text = style->text_hover_active;\n        } else {\n            background = &style->normal_active;\n            text.text = style->text_normal_active;\n        }\n    }\n\n\n    /* draw selectable background and text */\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        nk_draw_image(out, *bounds, &background->data.image, nk_white);\n        text.background = nk_rgba(0,0,0,0);\n    } else {\n        nk_fill_rect(out, *bounds, style->rounding, background->data.color);\n        text.background = background->data.color;\n    }\n    if (img && icon) nk_draw_image(out, *icon, img, nk_white);\n    nk_widget_text(out, *bounds, string, len, &text, align, font);\n}\n\nNK_INTERN int\nnk_do_selectable(nk_flags *state, struct nk_command_buffer *out,\n    struct nk_rect bounds, const char *str, int len, nk_flags align, int *value,\n    const struct nk_style_selectable *style, const struct nk_input *in,\n    const struct nk_user_font *font)\n{\n    int old_value;\n    struct nk_rect touch;\n\n    NK_ASSERT(state);\n    NK_ASSERT(out);\n    NK_ASSERT(str);\n    NK_ASSERT(len);\n    NK_ASSERT(value);\n    NK_ASSERT(style);\n    NK_ASSERT(font);\n\n    if (!state || !out || !str || !len || !value || !style || !font) return 0;\n    old_value = *value;\n\n    /* remove padding */\n    touch.x = bounds.x - style->touch_padding.x;\n    touch.y = bounds.y - style->touch_padding.y;\n    touch.w = bounds.w + style->touch_padding.x * 2;\n    touch.h = bounds.h + style->touch_padding.y * 2;\n\n    /* update button */\n    if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT))\n        *value = !(*value);\n\n    /* draw selectable */\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_selectable(out, *state, style, *value, &bounds, 0,0, str, len, align, font);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return old_value != *value;\n}\n\nNK_INTERN int\nnk_do_selectable_image(nk_flags *state, struct nk_command_buffer *out,\n    struct nk_rect bounds, const char *str, int len, nk_flags align, int *value,\n    const struct nk_image *img, const struct nk_style_selectable *style,\n    const struct nk_input *in, const struct nk_user_font *font)\n{\n    int old_value;\n    struct nk_rect touch;\n    struct nk_rect icon;\n\n    NK_ASSERT(state);\n    NK_ASSERT(out);\n    NK_ASSERT(str);\n    NK_ASSERT(len);\n    NK_ASSERT(value);\n    NK_ASSERT(style);\n    NK_ASSERT(font);\n\n    if (!state || !out || !str || !len || !value || !style || !font) return 0;\n    old_value = *value;\n\n    /* toggle behavior */\n    touch.x = bounds.x - style->touch_padding.x;\n    touch.y = bounds.y - style->touch_padding.y;\n    touch.w = bounds.w + style->touch_padding.x * 2;\n    touch.h = bounds.h + style->touch_padding.y * 2;\n    if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT))\n        *value = !(*value);\n\n    icon.y = bounds.y + style->padding.y;\n    icon.w = icon.h = bounds.h - 2 * style->padding.y;\n    if (align & NK_TEXT_ALIGN_LEFT) {\n        icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w);\n        icon.x = NK_MAX(icon.x, 0);\n    } else icon.x = bounds.x + 2 * style->padding.x;\n\n    icon.x += style->image_padding.x;\n    icon.y += style->image_padding.y;\n    icon.w -= 2 * style->image_padding.x;\n    icon.h -= 2 * style->image_padding.y;\n\n    /* draw selectable */\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_selectable(out, *state, style, *value, &bounds, &icon, img, str, len, align, font);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return old_value != *value;\n}\n\n\n/* ===============================================================\n *\n *                          SLIDER\n *\n * ===============================================================*/\nNK_INTERN float\nnk_slider_behavior(nk_flags *state, struct nk_rect *logical_cursor,\n    struct nk_rect *visual_cursor, struct nk_input *in,\n    struct nk_rect bounds, float slider_min, float slider_max, float slider_value,\n    float slider_step, float slider_steps)\n{\n    int left_mouse_down;\n    int left_mouse_click_in_cursor;\n\n    /* check if visual cursor is being dragged */\n    nk_widget_state_reset(state);\n    left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down;\n    left_mouse_click_in_cursor = in && nk_input_has_mouse_click_down_in_rect(in,\n            NK_BUTTON_LEFT, *visual_cursor, nk_true);\n\n    if (left_mouse_down && left_mouse_click_in_cursor)\n    {\n        float ratio = 0;\n        const float d = in->mouse.pos.x - (visual_cursor->x+visual_cursor->w*0.5f);\n        const float pxstep = bounds.w / slider_steps;\n\n        /* only update value if the next slider step is reached */\n        *state = NK_WIDGET_STATE_ACTIVE;\n        if (NK_ABS(d) >= pxstep) {\n            const float steps = (float)((int)(NK_ABS(d) / pxstep));\n            slider_value += (d > 0) ? (slider_step*steps) : -(slider_step*steps);\n            slider_value = NK_CLAMP(slider_min, slider_value, slider_max);\n            ratio = (slider_value - slider_min)/slider_step;\n            logical_cursor->x = bounds.x + (logical_cursor->w * ratio);\n            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = logical_cursor->x;\n        }\n    }\n\n    /* slider widget state */\n    if (nk_input_is_mouse_hovering_rect(in, bounds))\n        *state = NK_WIDGET_STATE_HOVERED;\n    if (*state & NK_WIDGET_STATE_HOVER &&\n        !nk_input_is_mouse_prev_hovering_rect(in, bounds))\n        *state |= NK_WIDGET_STATE_ENTERED;\n    else if (nk_input_is_mouse_prev_hovering_rect(in, bounds))\n        *state |= NK_WIDGET_STATE_LEFT;\n    return slider_value;\n}\n\nNK_INTERN void\nnk_draw_slider(struct nk_command_buffer *out, nk_flags state,\n    const struct nk_style_slider *style, const struct nk_rect *bounds,\n    const struct nk_rect *visual_cursor, float min, float value, float max)\n{\n    struct nk_rect fill;\n    struct nk_rect bar;\n    const struct nk_style_item *background;\n\n    /* select correct slider images/colors */\n    struct nk_color bar_color;\n    const struct nk_style_item *cursor;\n\n    NK_UNUSED(min);\n    NK_UNUSED(max);\n    NK_UNUSED(value);\n\n    if (state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->active;\n        bar_color = style->bar_active;\n        cursor = &style->cursor_active;\n    } else if (state & NK_WIDGET_STATE_HOVER) {\n        background = &style->hover;\n        bar_color = style->bar_hover;\n        cursor = &style->cursor_hover;\n    } else {\n        background = &style->normal;\n        bar_color = style->bar_normal;\n        cursor = &style->cursor_normal;\n    }\n\n    /* calculate slider background bar */\n    bar.x = bounds->x;\n    bar.y = (visual_cursor->y + visual_cursor->h/2) - bounds->h/12;\n    bar.w = bounds->w;\n    bar.h = bounds->h/6;\n\n    /* filled background bar style */\n    fill.w = (visual_cursor->x + (visual_cursor->w/2.0f)) - bar.x;\n    fill.x = bar.x;\n    fill.y = bar.y;\n    fill.h = bar.h;\n\n    /* draw background */\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        nk_draw_image(out, *bounds, &background->data.image, nk_white);\n    } else {\n        nk_fill_rect(out, *bounds, style->rounding, background->data.color);\n        nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color);\n    }\n\n    /* draw slider bar */\n    nk_fill_rect(out, bar, style->rounding, bar_color);\n    nk_fill_rect(out, fill, style->rounding, style->bar_filled);\n\n    /* draw cursor */\n    if (cursor->type == NK_STYLE_ITEM_IMAGE)\n        nk_draw_image(out, *visual_cursor, &cursor->data.image, nk_white);\n    else nk_fill_circle(out, *visual_cursor, cursor->data.color);\n}\n\nNK_INTERN float\nnk_do_slider(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect bounds,\n    float min, float val, float max, float step,\n    const struct nk_style_slider *style, struct nk_input *in,\n    const struct nk_user_font *font)\n{\n    float slider_range;\n    float slider_min;\n    float slider_max;\n    float slider_value;\n    float slider_steps;\n    float cursor_offset;\n\n    struct nk_rect visual_cursor;\n    struct nk_rect logical_cursor;\n\n    NK_ASSERT(style);\n    NK_ASSERT(out);\n    if (!out || !style)\n        return 0;\n\n    /* remove padding from slider bounds */\n    bounds.x = bounds.x + style->padding.x;\n    bounds.y = bounds.y + style->padding.y;\n    bounds.h = NK_MAX(bounds.h, 2*style->padding.y);\n    bounds.w = NK_MAX(bounds.w, 2*style->padding.x + style->cursor_size.x);\n    bounds.w -= 2 * style->padding.x;\n    bounds.h -= 2 * style->padding.y;\n\n    /* optional buttons */\n    if (style->show_buttons) {\n        nk_flags ws;\n        struct nk_rect button;\n        button.y = bounds.y;\n        button.w = bounds.h;\n        button.h = bounds.h;\n\n        /* decrement button */\n        button.x = bounds.x;\n        if (nk_do_button_symbol(&ws, out, button, style->dec_symbol, NK_BUTTON_DEFAULT,\n            &style->dec_button, in, font))\n            val -= step;\n\n        /* increment button */\n        button.x = (bounds.x + bounds.w) - button.w;\n        if (nk_do_button_symbol(&ws, out, button, style->inc_symbol, NK_BUTTON_DEFAULT,\n            &style->inc_button, in, font))\n            val += step;\n\n        bounds.x = bounds.x + button.w + style->spacing.x;\n        bounds.w = bounds.w - (2*button.w + 2*style->spacing.x);\n    }\n\n    /* remove one cursor size to support visual cursor */\n    bounds.x += style->cursor_size.x*0.5f;\n    bounds.w -= style->cursor_size.x;\n\n    /* make sure the provided values are correct */\n    slider_max = NK_MAX(min, max);\n    slider_min = NK_MIN(min, max);\n    slider_value = NK_CLAMP(slider_min, val, slider_max);\n    slider_range = slider_max - slider_min;\n    slider_steps = slider_range / step;\n    cursor_offset = (slider_value - slider_min) / step;\n\n    /* calculate cursor\n    Basically you have two cursors. One for visual representation and interaction\n    and one for updating the actual cursor value. */\n    logical_cursor.h = bounds.h;\n    logical_cursor.w = bounds.w / slider_steps;\n    logical_cursor.x = bounds.x + (logical_cursor.w * cursor_offset);\n    logical_cursor.y = bounds.y;\n\n    visual_cursor.h = style->cursor_size.y;\n    visual_cursor.w = style->cursor_size.x;\n    visual_cursor.y = (bounds.y + bounds.h*0.5f) - visual_cursor.h*0.5f;\n    visual_cursor.x = logical_cursor.x - visual_cursor.w*0.5f;\n\n    slider_value = nk_slider_behavior(state, &logical_cursor, &visual_cursor,\n        in, bounds, slider_min, slider_max, slider_value, step, slider_steps);\n    visual_cursor.x = logical_cursor.x - visual_cursor.w*0.5f;\n\n    /* draw slider */\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_slider(out, *state, style, &bounds, &visual_cursor, slider_min, slider_value, slider_max);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return slider_value;\n}\n\n/* ===============================================================\n *\n *                          PROGRESSBAR\n *\n * ===============================================================*/\nNK_INTERN nk_size\nnk_progress_behavior(nk_flags *state, const struct nk_input *in,\n    struct nk_rect r, nk_size max, nk_size value, int modifiable)\n{\n    nk_widget_state_reset(state);\n    if (in && modifiable && nk_input_is_mouse_hovering_rect(in, r)) {\n        int left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;\n        int left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,\n            NK_BUTTON_LEFT, r, nk_true);\n\n        if (left_mouse_down && left_mouse_click_in_cursor) {\n            float ratio = NK_MAX(0, (float)(in->mouse.pos.x - r.x)) / (float)r.w;\n            value = (nk_size)NK_MAX(0,((float)max * ratio));\n            *state = NK_WIDGET_STATE_ACTIVE;\n        } else *state = NK_WIDGET_STATE_HOVERED;\n    }\n\n    /* set progressbar widget state */\n    if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, r))\n        *state |= NK_WIDGET_STATE_ENTERED;\n    else if (nk_input_is_mouse_prev_hovering_rect(in, r))\n        *state |= NK_WIDGET_STATE_LEFT;\n\n    if (!max) return value;\n    value = NK_MIN(value, max);\n    return value;\n}\n\nNK_INTERN void\nnk_draw_progress(struct nk_command_buffer *out, nk_flags state,\n    const struct nk_style_progress *style, const struct nk_rect *bounds,\n    const struct nk_rect *scursor, nk_size value, nk_size max)\n{\n    const struct nk_style_item *background;\n    const struct nk_style_item *cursor;\n\n    NK_UNUSED(max);\n    NK_UNUSED(value);\n\n    /* select correct colors/images to draw */\n    if (state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->active;\n        cursor = &style->cursor_active;\n    } else if (state & NK_WIDGET_STATE_HOVER){\n        background = &style->hover;\n        cursor = &style->cursor_hover;\n    } else {\n        background = &style->normal;\n        cursor = &style->cursor_normal;\n    }\n\n    /* draw background */\n    if (background->type == NK_STYLE_ITEM_COLOR) {\n        nk_fill_rect(out, *bounds, style->rounding, background->data.color);\n        nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color);\n    } else nk_draw_image(out, *bounds, &background->data.image, nk_white);\n\n    /* draw cursor */\n    if (background->type == NK_STYLE_ITEM_COLOR) {\n        nk_fill_rect(out, *scursor, style->rounding, cursor->data.color);\n        nk_stroke_rect(out, *scursor, style->rounding, style->border, style->border_color);\n    } else nk_draw_image(out, *scursor, &cursor->data.image, nk_white);\n}\n\nNK_INTERN nk_size\nnk_do_progress(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect bounds,\n    nk_size value, nk_size max, int modifiable,\n    const struct nk_style_progress *style, const struct nk_input *in)\n{\n    float prog_scale;\n    nk_size prog_value;\n    struct nk_rect cursor;\n\n    NK_ASSERT(style);\n    NK_ASSERT(out);\n    if (!out || !style) return 0;\n\n    /* calculate progressbar cursor */\n    cursor.w = NK_MAX(bounds.w, 2 * style->padding.x + 2 * style->border);\n    cursor.h = NK_MAX(bounds.h, 2 * style->padding.y + 2 * style->border);\n    cursor = nk_pad_rect(bounds, nk_vec2(style->padding.x + style->border, style->padding.y + style->border));\n    prog_scale = (float)value / (float)max;\n    cursor.w = (bounds.w - 2) * prog_scale;\n\n    /* update progressbar */\n    prog_value = NK_MIN(value, max);\n    prog_value = nk_progress_behavior(state, in, bounds, max, prog_value, modifiable);\n\n    /* draw progressbar */\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_progress(out, *state, style, &bounds, &cursor, value, max);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return prog_value;\n}\n\n/* ===============================================================\n *\n *                          SCROLLBAR\n *\n * ===============================================================*/\nNK_INTERN float\nnk_scrollbar_behavior(nk_flags *state, struct nk_input *in,\n    int has_scrolling, const struct nk_rect *scroll,\n    const struct nk_rect *cursor, const struct nk_rect *empty0,\n    const struct nk_rect *empty1, float scroll_offset,\n    float target, float scroll_step, enum nk_orientation o)\n{\n    nk_flags ws = 0;\n    int left_mouse_down;\n    int left_mouse_click_in_cursor;\n    float scroll_delta;\n\n    nk_widget_state_reset(state);\n    if (!in) return scroll_offset;\n\n    left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;\n    left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,\n        NK_BUTTON_LEFT, *cursor, nk_true);\n    if (nk_input_is_mouse_hovering_rect(in, *scroll))\n        *state = NK_WIDGET_STATE_HOVERED;\n\n    scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x;\n    if (left_mouse_down && left_mouse_click_in_cursor) {\n        /* update cursor by mouse dragging */\n        float pixel, delta;\n        *state = NK_WIDGET_STATE_ACTIVE;\n        if (o == NK_VERTICAL) {\n            float cursor_y;\n            pixel = in->mouse.delta.y;\n            delta = (pixel / scroll->h) * target;\n            scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll->h);\n            cursor_y = scroll->y + ((scroll_offset/target) * scroll->h);\n            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y = cursor_y + cursor->h/2.0f;\n        } else {\n            float cursor_x;\n            pixel = in->mouse.delta.x;\n            delta = (pixel / scroll->w) * target;\n            scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll->w);\n            cursor_x = scroll->x + ((scroll_offset/target) * scroll->w);\n            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor_x + cursor->w/2.0f;\n        }\n    } else if ((nk_input_is_key_pressed(in, NK_KEY_SCROLL_UP) && o == NK_VERTICAL && has_scrolling)||\n            nk_button_behavior(&ws, *empty0, in, NK_BUTTON_DEFAULT)) {\n        /* scroll page up by click on empty space or shortcut */\n        if (o == NK_VERTICAL)\n            scroll_offset = NK_MAX(0, scroll_offset - scroll->h);\n        else scroll_offset = NK_MAX(0, scroll_offset - scroll->w);\n    } else if ((nk_input_is_key_pressed(in, NK_KEY_SCROLL_DOWN) && o == NK_VERTICAL && has_scrolling) ||\n        nk_button_behavior(&ws, *empty1, in, NK_BUTTON_DEFAULT)) {\n        /* scroll page down by click on empty space or shortcut */\n        if (o == NK_VERTICAL)\n            scroll_offset = NK_MIN(scroll_offset + scroll->h, target - scroll->h);\n        else scroll_offset = NK_MIN(scroll_offset + scroll->w, target - scroll->w);\n    } else if (has_scrolling) {\n        if ((scroll_delta < 0 || (scroll_delta > 0))) {\n            /* update cursor by mouse scrolling */\n            scroll_offset = scroll_offset + scroll_step * (-scroll_delta);\n            if (o == NK_VERTICAL)\n                scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->h);\n            else scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->w);\n        } else if (nk_input_is_key_pressed(in, NK_KEY_SCROLL_START)) {\n            /* update cursor to the beginning  */\n            if (o == NK_VERTICAL) scroll_offset = 0;\n        } else if (nk_input_is_key_pressed(in, NK_KEY_SCROLL_END)) {\n            /* update cursor to the end */\n            if (o == NK_VERTICAL) scroll_offset = target - scroll->h;\n        }\n    }\n    if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, *scroll))\n        *state |= NK_WIDGET_STATE_ENTERED;\n    else if (nk_input_is_mouse_prev_hovering_rect(in, *scroll))\n        *state |= NK_WIDGET_STATE_LEFT;\n    return scroll_offset;\n}\n\nNK_INTERN void\nnk_draw_scrollbar(struct nk_command_buffer *out, nk_flags state,\n    const struct nk_style_scrollbar *style, const struct nk_rect *bounds,\n    const struct nk_rect *scroll)\n{\n    const struct nk_style_item *background;\n    const struct nk_style_item *cursor;\n\n    /* select correct colors/images to draw */\n    if (state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->active;\n        cursor = &style->cursor_active;\n    } else if (state & NK_WIDGET_STATE_HOVER) {\n        background = &style->hover;\n        cursor = &style->cursor_hover;\n    } else {\n        background = &style->normal;\n        cursor = &style->cursor_normal;\n    }\n\n    /* draw background */\n    if (background->type == NK_STYLE_ITEM_COLOR) {\n        nk_fill_rect(out, *bounds, style->rounding, background->data.color);\n        nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color);\n    } else {\n        nk_draw_image(out, *bounds, &background->data.image, nk_white);\n    }\n\n    /* draw cursor */\n    if (background->type == NK_STYLE_ITEM_COLOR) {\n        nk_fill_rect(out, *scroll, style->rounding_cursor, cursor->data.color);\n        nk_stroke_rect(out, *scroll, style->rounding_cursor, style->border_cursor, style->cursor_border_color);\n    } else nk_draw_image(out, *scroll, &cursor->data.image, nk_white);\n}\n\nNK_INTERN float\nnk_do_scrollbarv(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling,\n    float offset, float target, float step, float button_pixel_inc,\n    const struct nk_style_scrollbar *style, struct nk_input *in,\n    const struct nk_user_font *font)\n{\n    struct nk_rect empty_north;\n    struct nk_rect empty_south;\n    struct nk_rect cursor;\n\n    float scroll_step;\n    float scroll_offset;\n    float scroll_off;\n    float scroll_ratio;\n\n    NK_ASSERT(out);\n    NK_ASSERT(style);\n    NK_ASSERT(state);\n    if (!out || !style) return 0;\n\n    scroll.w = NK_MAX(scroll.w, 1);\n    scroll.h = NK_MAX(scroll.h, 0);\n    if (target <= scroll.h) return 0;\n\n    /* optional scrollbar buttons */\n    if (style->show_buttons) {\n        nk_flags ws;\n        float scroll_h;\n        struct nk_rect button;\n\n        button.x = scroll.x;\n        button.w = scroll.w;\n        button.h = scroll.w;\n\n        scroll_h = NK_MAX(scroll.h - 2 * button.h,0);\n        scroll_step = NK_MIN(step, button_pixel_inc);\n\n        /* decrement button */\n        button.y = scroll.y;\n        if (nk_do_button_symbol(&ws, out, button, style->dec_symbol,\n            NK_BUTTON_REPEATER, &style->dec_button, in, font))\n            offset = offset - scroll_step;\n\n        /* increment button */\n        button.y = scroll.y + scroll.h - button.h;\n        if (nk_do_button_symbol(&ws, out, button, style->inc_symbol,\n            NK_BUTTON_REPEATER, &style->inc_button, in, font))\n            offset = offset + scroll_step;\n\n        scroll.y = scroll.y + button.h;\n        scroll.h = scroll_h;\n    }\n\n    /* calculate scrollbar constants */\n    scroll_step = NK_MIN(step, scroll.h);\n    scroll_offset = NK_CLAMP(0, offset, target - scroll.h);\n    scroll_ratio = scroll.h / target;\n    scroll_off = scroll_offset / target;\n\n    /* calculate scrollbar cursor bounds */\n    cursor.h = NK_MAX((scroll_ratio * scroll.h) - (2*style->border + 2*style->padding.y), 0);\n    cursor.y = scroll.y + (scroll_off * scroll.h) + style->border + style->padding.y;\n    cursor.w = scroll.w - (2 * style->border + 2 * style->padding.x);\n    cursor.x = scroll.x + style->border + style->padding.x;\n\n    /* calculate empty space around cursor */\n    empty_north.x = scroll.x;\n    empty_north.y = scroll.y;\n    empty_north.w = scroll.w;\n    empty_north.h = NK_MAX(cursor.y - scroll.y, 0);\n\n    empty_south.x = scroll.x;\n    empty_south.y = cursor.y + cursor.h;\n    empty_south.w = scroll.w;\n    empty_south.h = NK_MAX((scroll.y + scroll.h) - (cursor.y + cursor.h), 0);\n\n    /* update scrollbar */\n    scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, &scroll, &cursor,\n        &empty_north, &empty_south, scroll_offset, target, scroll_step, NK_VERTICAL);\n    scroll_off = scroll_offset / target;\n    cursor.y = scroll.y + (scroll_off * scroll.h) + style->border_cursor + style->padding.y;\n\n    /* draw scrollbar */\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_scrollbar(out, *state, style, &scroll, &cursor);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return scroll_offset;\n}\n\nNK_INTERN float\nnk_do_scrollbarh(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling,\n    float offset, float target, float step, float button_pixel_inc,\n    const struct nk_style_scrollbar *style, struct nk_input *in,\n    const struct nk_user_font *font)\n{\n    struct nk_rect cursor;\n    struct nk_rect empty_west;\n    struct nk_rect empty_east;\n\n    float scroll_step;\n    float scroll_offset;\n    float scroll_off;\n    float scroll_ratio;\n\n    NK_ASSERT(out);\n    NK_ASSERT(style);\n    if (!out || !style) return 0;\n\n    /* scrollbar background */\n    scroll.h = NK_MAX(scroll.h, 1);\n    scroll.w = NK_MAX(scroll.w, 2 * scroll.h);\n    if (target <= scroll.w) return 0;\n\n    /* optional scrollbar buttons */\n    if (style->show_buttons) {\n        nk_flags ws;\n        float scroll_w;\n        struct nk_rect button;\n        button.y = scroll.y;\n        button.w = scroll.h;\n        button.h = scroll.h;\n\n        scroll_w = scroll.w - 2 * button.w;\n        scroll_step = NK_MIN(step, button_pixel_inc);\n\n        /* decrement button */\n        button.x = scroll.x;\n        if (nk_do_button_symbol(&ws, out, button, style->dec_symbol,\n            NK_BUTTON_REPEATER, &style->dec_button, in, font))\n            offset = offset - scroll_step;\n\n        /* increment button */\n        button.x = scroll.x + scroll.w - button.w;\n        if (nk_do_button_symbol(&ws, out, button, style->inc_symbol,\n            NK_BUTTON_REPEATER, &style->inc_button, in, font))\n            offset = offset + scroll_step;\n\n        scroll.x = scroll.x + button.w;\n        scroll.w = scroll_w;\n    }\n\n    /* calculate scrollbar constants */\n    scroll_step = NK_MIN(step, scroll.w);\n    scroll_offset = NK_CLAMP(0, offset, target - scroll.w);\n    scroll_ratio = scroll.w / target;\n    scroll_off = scroll_offset / target;\n\n    /* calculate cursor bounds */\n    cursor.w = (scroll_ratio * scroll.w) - (2*style->border + 2*style->padding.x);\n    cursor.x = scroll.x + (scroll_off * scroll.w) + style->border + style->padding.x;\n    cursor.h = scroll.h - (2 * style->border + 2 * style->padding.y);\n    cursor.y = scroll.y + style->border + style->padding.y;\n\n    /* calculate empty space around cursor */\n    empty_west.x = scroll.x;\n    empty_west.y = scroll.y;\n    empty_west.w = cursor.x - scroll.x;\n    empty_west.h = scroll.h;\n\n    empty_east.x = cursor.x + cursor.w;\n    empty_east.y = scroll.y;\n    empty_east.w = (scroll.x + scroll.w) - (cursor.x + cursor.w);\n    empty_east.h = scroll.h;\n\n    /* update scrollbar */\n    scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, &scroll, &cursor,\n        &empty_west, &empty_east, scroll_offset, target, scroll_step, NK_HORIZONTAL);\n    scroll_off = scroll_offset / target;\n    cursor.x = scroll.x + (scroll_off * scroll.w);\n\n    /* draw scrollbar */\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_scrollbar(out, *state, style, &scroll, &cursor);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n    return scroll_offset;\n}\n\n/* ===============================================================\n *\n *                          FILTER\n *\n * ===============================================================*/\nNK_API int nk_filter_default(const struct nk_text_edit *box, nk_rune unicode)\n{(void)unicode;NK_UNUSED(box);return nk_true;}\n\nNK_API int\nnk_filter_ascii(const struct nk_text_edit *box, nk_rune unicode)\n{\n    NK_UNUSED(box);\n    if (unicode > 128) return nk_false;\n    else return nk_true;\n}\n\nNK_API int\nnk_filter_float(const struct nk_text_edit *box, nk_rune unicode)\n{\n    NK_UNUSED(box);\n    if ((unicode < '0' || unicode > '9') && unicode != '.' && unicode != '-')\n        return nk_false;\n    else return nk_true;\n}\n\nNK_API int\nnk_filter_decimal(const struct nk_text_edit *box, nk_rune unicode)\n{\n    NK_UNUSED(box);\n    if ((unicode < '0' || unicode > '9') && unicode != '-')\n        return nk_false;\n    else return nk_true;\n}\n\nNK_API int\nnk_filter_hex(const struct nk_text_edit *box, nk_rune unicode)\n{\n    NK_UNUSED(box);\n    if ((unicode < '0' || unicode > '9') &&\n        (unicode < 'a' || unicode > 'f') &&\n        (unicode < 'A' || unicode > 'F'))\n        return nk_false;\n    else return nk_true;\n}\n\nNK_API int\nnk_filter_oct(const struct nk_text_edit *box, nk_rune unicode)\n{\n    NK_UNUSED(box);\n    if (unicode < '0' || unicode > '7')\n        return nk_false;\n    else return nk_true;\n}\n\nNK_API int\nnk_filter_binary(const struct nk_text_edit *box, nk_rune unicode)\n{\n    NK_UNUSED(box);\n    if (unicode != '0' && unicode != '1')\n        return nk_false;\n    else return nk_true;\n}\n\n/* ===============================================================\n *\n *                          EDIT\n *\n * ===============================================================*/\nNK_INTERN void\nnk_edit_draw_text(struct nk_command_buffer *out,\n    const struct nk_style_edit *style, float pos_x, float pos_y,\n    float x_offset, const char *text, int byte_len, float row_height,\n    const struct nk_user_font *font, struct nk_color background,\n    struct nk_color foreground, int is_selected)\n{\n    NK_ASSERT(out);\n    NK_ASSERT(font);\n    NK_ASSERT(style);\n    if (!text || !byte_len || !out || !style) return;\n\n    {int glyph_len = 0;\n    nk_rune unicode = 0;\n    int text_len = 0;\n    float line_width = 0;\n    float glyph_width;\n    const char *line = text;\n    float line_offset = 0;\n    int line_count = 0;\n\n    struct nk_text txt;\n    txt.padding = nk_vec2(0,0);\n    txt.background = background;\n    txt.text = foreground;\n\n    glyph_len = nk_utf_decode(text+text_len, &unicode, byte_len-text_len);\n    if (!glyph_len) return;\n    while ((text_len < byte_len) && glyph_len)\n    {\n        if (unicode == '\\n') {\n            /* new line sepeator so draw previous line */\n            struct nk_rect label;\n            label.y = pos_y + line_offset;\n            label.h = row_height;\n            label.w = line_width;\n            label.x = pos_x;\n            if (!line_count)\n                label.x += x_offset;\n\n            if (is_selected) /* selection needs to draw different background color */\n                nk_fill_rect(out, label, 0, background);\n            nk_widget_text(out, label, line, (int)((text + text_len) - line),\n                &txt, NK_TEXT_CENTERED, font);\n\n            text_len++;\n            line_count++;\n            line_width = 0;\n            line = text + text_len;\n            line_offset += row_height;\n            glyph_len = nk_utf_decode(text + text_len, &unicode, (int)(byte_len-text_len));\n            continue;\n        }\n        if (unicode == '\\r') {\n            text_len++;\n            glyph_len = nk_utf_decode(text + text_len, &unicode, byte_len-text_len);\n            continue;\n        }\n        glyph_width = font->width(font->userdata, font->height, text+text_len, glyph_len);\n        line_width += (float)glyph_width;\n        text_len += glyph_len;\n        glyph_len = nk_utf_decode(text + text_len, &unicode, byte_len-text_len);\n        continue;\n    }\n    if (line_width > 0) {\n        /* draw last line */\n        struct nk_rect label;\n        label.y = pos_y + line_offset;\n        label.h = row_height;\n        label.w = line_width;\n        label.x = pos_x;\n        if (!line_count)\n            label.x += x_offset;\n\n        if (is_selected)\n            nk_fill_rect(out, label, 0, background);\n        nk_widget_text(out, label, line, (int)((text + text_len) - line),\n            &txt, NK_TEXT_LEFT, font);\n    }}\n}\n\nNK_INTERN nk_flags\nnk_do_edit(nk_flags *state, struct nk_command_buffer *out,\n    struct nk_rect bounds, nk_flags flags, nk_plugin_filter filter,\n    struct nk_text_edit *edit, const struct nk_style_edit *style,\n    struct nk_input *in, const struct nk_user_font *font)\n{\n    struct nk_rect area;\n    nk_flags ret = 0;\n    float row_height;\n    char prev_state = 0;\n    char is_hovered = 0;\n    char select_all = 0;\n    char cursor_follow = 0;\n    struct nk_rect old_clip;\n    struct nk_rect clip;\n\n    NK_ASSERT(state);\n    NK_ASSERT(out);\n    NK_ASSERT(style);\n    if (!state || !out || !style)\n        return ret;\n\n    /* visible text area calculation */\n    area.x = bounds.x + style->padding.x + style->border;\n    area.y = bounds.y + style->padding.y + style->border;\n    area.w = bounds.w - (2.0f * style->padding.x + 2 * style->border);\n    area.h = bounds.h - (2.0f * style->padding.y + 2 * style->border);\n    if (flags & NK_EDIT_MULTILINE)\n        area.w = NK_MAX(0, area.w - style->scrollbar_size.x);\n    row_height = (flags & NK_EDIT_MULTILINE)? font->height + style->row_padding: area.h;\n\n    /* calculate clipping rectangle */\n    old_clip = out->clip;\n    nk_unify(&clip, &old_clip, area.x, area.y, area.x + area.w, area.y + area.h);\n\n    /* update edit state */\n    prev_state = (char)edit->active;\n    is_hovered = (char)nk_input_is_mouse_hovering_rect(in, bounds);\n    if (in && in->mouse.buttons[NK_BUTTON_LEFT].clicked && in->mouse.buttons[NK_BUTTON_LEFT].down) {\n        edit->active = NK_INBOX(in->mouse.pos.x, in->mouse.pos.y,\n                                bounds.x, bounds.y, bounds.w, bounds.h);\n    }\n\n    /* (de)activate text editor */\n    if (!prev_state && edit->active) {\n        const enum nk_text_edit_type type = (flags & NK_EDIT_MULTILINE) ?\n            NK_TEXT_EDIT_MULTI_LINE: NK_TEXT_EDIT_SINGLE_LINE;\n        nk_textedit_clear_state(edit, type, filter);\n        if (flags & NK_EDIT_ALWAYS_INSERT_MODE)\n            edit->mode = NK_TEXT_EDIT_MODE_INSERT;\n        if (flags & NK_EDIT_AUTO_SELECT)\n            select_all = nk_true;\n        if (flags & NK_EDIT_GOTO_END_ON_ACTIVATE) {\n            edit->cursor = edit->string.len;\n            in = 0;\n        }\n    } else if (!edit->active) edit->mode = NK_TEXT_EDIT_MODE_VIEW;\n    if (flags & NK_EDIT_READ_ONLY)\n        edit->mode = NK_TEXT_EDIT_MODE_VIEW;\n\n    ret = (edit->active) ? NK_EDIT_ACTIVE: NK_EDIT_INACTIVE;\n    if (prev_state != edit->active)\n        ret |= (edit->active) ? NK_EDIT_ACTIVATED: NK_EDIT_DEACTIVATED;\n\n    /* handle user input */\n    if (edit->active && in)\n    {\n        int shift_mod = in->keyboard.keys[NK_KEY_SHIFT].down;\n        const float mouse_x = (in->mouse.pos.x - area.x) + edit->scrollbar.x;\n        const float mouse_y = (in->mouse.pos.y - area.y) + edit->scrollbar.y;\n\n        /* mouse click handler */\n        is_hovered = (char)nk_input_is_mouse_hovering_rect(in, area);\n        if (select_all) {\n            nk_textedit_select_all(edit);\n        } else if (is_hovered && in->mouse.buttons[NK_BUTTON_LEFT].down &&\n            in->mouse.buttons[NK_BUTTON_LEFT].clicked) {\n            nk_textedit_click(edit, mouse_x, mouse_y, font, row_height);\n        } else if (is_hovered && in->mouse.buttons[NK_BUTTON_LEFT].down &&\n            (in->mouse.delta.x != 0.0f || in->mouse.delta.y != 0.0f)) {\n            nk_textedit_drag(edit, mouse_x, mouse_y, font, row_height);\n            cursor_follow = nk_true;\n        } else if (is_hovered && in->mouse.buttons[NK_BUTTON_RIGHT].clicked &&\n            in->mouse.buttons[NK_BUTTON_RIGHT].down) {\n            nk_textedit_key(edit, NK_KEY_TEXT_WORD_LEFT, nk_false, font, row_height);\n            nk_textedit_key(edit, NK_KEY_TEXT_WORD_RIGHT, nk_true, font, row_height);\n            cursor_follow = nk_true;\n        }\n\n        {int i; /* keyboard input */\n        int old_mode = edit->mode;\n        for (i = 0; i < NK_KEY_MAX; ++i) {\n            if (i == NK_KEY_ENTER || i == NK_KEY_TAB) continue; /* special case */\n            if (nk_input_is_key_pressed(in, (enum nk_keys)i)) {\n                nk_textedit_key(edit, (enum nk_keys)i, shift_mod, font, row_height);\n                cursor_follow = nk_true;\n            }\n        }\n        if (old_mode != edit->mode) {\n            in->keyboard.text_len = 0;\n        }}\n\n        /* text input */\n        edit->filter = filter;\n        if (in->keyboard.text_len) {\n            nk_textedit_text(edit, in->keyboard.text, in->keyboard.text_len);\n            cursor_follow = nk_true;\n            in->keyboard.text_len = 0;\n        }\n\n        /* enter key handler */\n        if (nk_input_is_key_pressed(in, NK_KEY_ENTER)) {\n            cursor_follow = nk_true;\n            if (flags & NK_EDIT_CTRL_ENTER_NEWLINE && shift_mod)\n                nk_textedit_text(edit, \"\\n\", 1);\n            else if (flags & NK_EDIT_SIG_ENTER)\n                ret |= NK_EDIT_COMMITED;\n            else nk_textedit_text(edit, \"\\n\", 1);\n        }\n\n        /* cut & copy handler */\n        {int copy= nk_input_is_key_pressed(in, NK_KEY_COPY);\n        int cut = nk_input_is_key_pressed(in, NK_KEY_CUT);\n        if ((copy || cut) && (flags & NK_EDIT_CLIPBOARD))\n        {\n            int glyph_len;\n            nk_rune unicode;\n            const char *text;\n            int b = edit->select_start;\n            int e = edit->select_end;\n\n            int begin = NK_MIN(b, e);\n            int end = NK_MAX(b, e);\n            text = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len);\n            if (edit->clip.copy)\n                edit->clip.copy(edit->clip.userdata, text, end - begin);\n            if (cut && !(flags & NK_EDIT_READ_ONLY)){\n                nk_textedit_cut(edit);\n                cursor_follow = nk_true;\n            }\n        }}\n\n        /* paste handler */\n        {int paste = nk_input_is_key_pressed(in, NK_KEY_PASTE);\n        if (paste && (flags & NK_EDIT_CLIPBOARD) && edit->clip.paste) {\n            edit->clip.paste(edit->clip.userdata, edit);\n            cursor_follow = nk_true;\n        }}\n\n        /* tab handler */\n        {int tab = nk_input_is_key_pressed(in, NK_KEY_TAB);\n        if (tab && (flags & NK_EDIT_ALLOW_TAB)) {\n            nk_textedit_text(edit, \"    \", 4);\n            cursor_follow = nk_true;\n        }}\n    }\n\n    /* set widget state */\n    if (edit->active)\n        *state = NK_WIDGET_STATE_ACTIVE;\n    else nk_widget_state_reset(state);\n\n    if (is_hovered)\n        *state |= NK_WIDGET_STATE_HOVERED;\n\n    /* DRAW EDIT */\n    {const char *text = nk_str_get_const(&edit->string);\n    int len = nk_str_len_char(&edit->string);\n\n    {/* select background colors/images  */\n    const struct nk_style_item *background;\n    if (*state & NK_WIDGET_STATE_ACTIVED)\n        background = &style->active;\n    else if (*state & NK_WIDGET_STATE_HOVER)\n        background = &style->hover;\n    else background = &style->normal;\n\n    /* draw background frame */\n    if (background->type == NK_STYLE_ITEM_COLOR) {\n        nk_stroke_rect(out, bounds, style->rounding, style->border, style->border_color);\n        nk_fill_rect(out, bounds, style->rounding, background->data.color);\n    } else nk_draw_image(out, bounds, &background->data.image, nk_white);}\n\n    area.w = NK_MAX(0, area.w - style->cursor_size);\n    if (edit->active)\n    {\n        int total_lines = 1;\n        struct nk_vec2 text_size = nk_vec2(0,0);\n\n        /* text pointer positions */\n        const char *cursor_ptr = 0;\n        const char *select_begin_ptr = 0;\n        const char *select_end_ptr = 0;\n\n        /* 2D pixel positions */\n        struct nk_vec2 cursor_pos = nk_vec2(0,0);\n        struct nk_vec2 selection_offset_start = nk_vec2(0,0);\n        struct nk_vec2 selection_offset_end = nk_vec2(0,0);\n\n        int selection_begin = NK_MIN(edit->select_start, edit->select_end);\n        int selection_end = NK_MAX(edit->select_start, edit->select_end);\n\n        /* calculate total line count + total space + cursor/selection position */\n        float line_width = 0.0f;\n        if (text && len)\n        {\n            /* utf8 encoding */\n            float glyph_width;\n            int glyph_len = 0;\n            nk_rune unicode = 0;\n            int text_len = 0;\n            int glyphs = 0;\n            int row_begin = 0;\n\n            glyph_len = nk_utf_decode(text, &unicode, len);\n            glyph_width = font->width(font->userdata, font->height, text, glyph_len);\n            line_width = 0;\n\n            /* iterate all lines */\n            while ((text_len < len) && glyph_len)\n            {\n                /* set cursor 2D position and line */\n                if (!cursor_ptr && glyphs == edit->cursor)\n                {\n                    int glyph_offset;\n                    struct nk_vec2 out_offset;\n                    struct nk_vec2 row_size;\n                    const char *remaining;\n\n                    /* calculate 2d position */\n                    cursor_pos.y = (float)(total_lines-1) * row_height;\n                    row_size = nk_text_calculate_text_bounds(font, text+row_begin,\n                                text_len-row_begin, row_height, &remaining,\n                                &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE);\n                    cursor_pos.x = row_size.x;\n                    cursor_ptr = text + text_len;\n                }\n\n                /* set start selection 2D position and line */\n                if (!select_begin_ptr && edit->select_start != edit->select_end &&\n                    glyphs == selection_begin)\n                {\n                    int glyph_offset;\n                    struct nk_vec2 out_offset;\n                    struct nk_vec2 row_size;\n                    const char *remaining;\n\n                    /* calculate 2d position */\n                    selection_offset_start.y = (float)(NK_MAX(total_lines-1,0)) * row_height;\n                    row_size = nk_text_calculate_text_bounds(font, text+row_begin,\n                                text_len-row_begin, row_height, &remaining,\n                                &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE);\n                    selection_offset_start.x = row_size.x;\n                    select_begin_ptr = text + text_len;\n                }\n\n                /* set end selection 2D position and line */\n                if (!select_end_ptr && edit->select_start != edit->select_end &&\n                    glyphs == selection_end)\n                {\n                    int glyph_offset;\n                    struct nk_vec2 out_offset;\n                    struct nk_vec2 row_size;\n                    const char *remaining;\n\n                    /* calculate 2d position */\n                    selection_offset_end.y = (float)(total_lines-1) * row_height;\n                    row_size = nk_text_calculate_text_bounds(font, text+row_begin,\n                                text_len-row_begin, row_height, &remaining,\n                                &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE);\n                    selection_offset_end.x = row_size.x;\n                    select_end_ptr = text + text_len;\n                }\n                if (unicode == '\\n') {\n                    text_size.x = NK_MAX(text_size.x, line_width);\n                    total_lines++;\n                    line_width = 0;\n                    text_len++;\n                    glyphs++;\n                    row_begin = text_len;\n                    glyph_len = nk_utf_decode(text + text_len, &unicode, len-text_len);\n                    glyph_width = font->width(font->userdata, font->height, text+text_len, glyph_len);\n                    continue;\n                }\n\n                glyphs++;\n                text_len += glyph_len;\n                line_width += (float)glyph_width;\n\n                glyph_len = nk_utf_decode(text + text_len, &unicode, len-text_len);\n                glyph_width = font->width(font->userdata, font->height,\n                    text+text_len, glyph_len);\n                continue;\n            }\n            text_size.y = (float)total_lines * row_height;\n\n            /* handle case when cursor is at end of text buffer */\n            if (!cursor_ptr && edit->cursor == edit->string.len) {\n                cursor_pos.x = line_width;\n                cursor_pos.y = text_size.y - row_height;\n            }\n        }\n        {\n            /* scrollbar */\n            if (cursor_follow)\n            {\n                /* update scrollbar to follow cursor */\n                if (!(flags & NK_EDIT_NO_HORIZONTAL_SCROLL)) {\n                    /* horizontal scroll */\n                    const float scroll_increment = area.w * 0.25f;\n                    if (cursor_pos.x < edit->scrollbar.x)\n                        edit->scrollbar.x = (float)(int)NK_MAX(0.0f, cursor_pos.x - scroll_increment);\n                    if (cursor_pos.x >= edit->scrollbar.x + area.w)\n                        edit->scrollbar.x = (float)(int)NK_MAX(0.0f, cursor_pos.x);\n                } else edit->scrollbar.x = 0;\n\n                if (flags & NK_EDIT_MULTILINE) {\n                    /* vertical scroll */\n                    if (cursor_pos.y < edit->scrollbar.y)\n                        edit->scrollbar.y = NK_MAX(0.0f, cursor_pos.y - row_height);\n                    if (cursor_pos.y >= edit->scrollbar.y + area.h)\n                        edit->scrollbar.y = edit->scrollbar.y + row_height;\n                } else edit->scrollbar.y = 0;\n            }\n\n            /* scrollbar widget */\n            if (flags & NK_EDIT_MULTILINE)\n            {\n                nk_flags ws;\n                struct nk_rect scroll;\n                float scroll_target;\n                float scroll_offset;\n                float scroll_step;\n                float scroll_inc;\n\n                scroll = area;\n                scroll.x = (bounds.x + bounds.w - style->border) - style->scrollbar_size.x;\n                scroll.w = style->scrollbar_size.x;\n\n                scroll_offset = edit->scrollbar.y;\n                scroll_step = scroll.h * 0.10f;\n                scroll_inc = scroll.h * 0.01f;\n                scroll_target = text_size.y;\n                edit->scrollbar.y = nk_do_scrollbarv(&ws, out, scroll, 0,\n                        scroll_offset, scroll_target, scroll_step, scroll_inc,\n                        &style->scrollbar, in, font);\n            }\n        }\n\n        /* draw text */\n        {struct nk_color background_color;\n        struct nk_color text_color;\n        struct nk_color sel_background_color;\n        struct nk_color sel_text_color;\n        struct nk_color cursor_color;\n        struct nk_color cursor_text_color;\n        const struct nk_style_item *background;\n        nk_push_scissor(out, clip);\n\n        /* select correct colors to draw */\n        if (*state & NK_WIDGET_STATE_ACTIVED) {\n            background = &style->active;\n            text_color = style->text_active;\n            sel_text_color = style->selected_text_hover;\n            sel_background_color = style->selected_hover;\n            cursor_color = style->cursor_hover;\n            cursor_text_color = style->cursor_text_hover;\n        } else if (*state & NK_WIDGET_STATE_HOVER) {\n            background = &style->hover;\n            text_color = style->text_hover;\n            sel_text_color = style->selected_text_hover;\n            sel_background_color = style->selected_hover;\n            cursor_text_color = style->cursor_text_hover;\n            cursor_color = style->cursor_hover;\n        } else {\n            background = &style->normal;\n            text_color = style->text_normal;\n            sel_text_color = style->selected_text_normal;\n            sel_background_color = style->selected_normal;\n            cursor_color = style->cursor_normal;\n            cursor_text_color = style->cursor_text_normal;\n        }\n        if (background->type == NK_STYLE_ITEM_IMAGE)\n            background_color = nk_rgba(0,0,0,0);\n        else background_color = background->data.color;\n\n\n        if (edit->select_start == edit->select_end) {\n            /* no selection so just draw the complete text */\n            const char *begin = nk_str_get_const(&edit->string);\n            int l = nk_str_len_char(&edit->string);\n            nk_edit_draw_text(out, style, area.x - edit->scrollbar.x,\n                area.y - edit->scrollbar.y, 0, begin, l, row_height, font,\n                background_color, text_color, nk_false);\n        } else {\n            /* edit has selection so draw 1-3 text chunks */\n            if (edit->select_start != edit->select_end && selection_begin > 0){\n                /* draw unselected text before selection */\n                const char *begin = nk_str_get_const(&edit->string);\n                NK_ASSERT(select_begin_ptr);\n                nk_edit_draw_text(out, style, area.x - edit->scrollbar.x,\n                    area.y - edit->scrollbar.y, 0, begin, (int)(select_begin_ptr - begin),\n                    row_height, font, background_color, text_color, nk_false);\n            }\n            if (edit->select_start != edit->select_end) {\n                /* draw selected text */\n                NK_ASSERT(select_begin_ptr);\n                if (!select_end_ptr) {\n                    const char *begin = nk_str_get_const(&edit->string);\n                    select_end_ptr = begin + nk_str_len_char(&edit->string);\n                }\n                nk_edit_draw_text(out, style,\n                    area.x - edit->scrollbar.x,\n                    area.y + selection_offset_start.y - edit->scrollbar.y,\n                    selection_offset_start.x,\n                    select_begin_ptr, (int)(select_end_ptr - select_begin_ptr),\n                    row_height, font, sel_background_color, sel_text_color, nk_true);\n            }\n            if ((edit->select_start != edit->select_end &&\n                selection_end < edit->string.len))\n            {\n                /* draw unselected text after selected text */\n                const char *begin = select_end_ptr;\n                const char *end = nk_str_get_const(&edit->string) +\n                                    nk_str_len_char(&edit->string);\n                NK_ASSERT(select_end_ptr);\n                nk_edit_draw_text(out, style,\n                    area.x - edit->scrollbar.x,\n                    area.y + selection_offset_end.y - edit->scrollbar.y,\n                    selection_offset_end.x,\n                    begin, (int)(end - begin), row_height, font,\n                    background_color, text_color, nk_true);\n            }\n        }\n\n        /* cursor */\n        if (edit->select_start == edit->select_end)\n        {\n            if (edit->cursor >= nk_str_len(&edit->string) ||\n                (cursor_ptr && *cursor_ptr == '\\n')) {\n                /* draw cursor at end of line */\n                struct nk_rect cursor;\n                cursor.w = style->cursor_size;\n                cursor.h = font->height;\n                cursor.x = area.x + cursor_pos.x - edit->scrollbar.x;\n                cursor.y = area.y + cursor_pos.y + row_height/2.0f - cursor.h/2.0f;\n                cursor.y -= edit->scrollbar.y;\n                nk_fill_rect(out, cursor, 0, cursor_color);\n            } else {\n                /* draw cursor inside text */\n                int glyph_len;\n                struct nk_rect label;\n                struct nk_text txt;\n\n                nk_rune unicode;\n                NK_ASSERT(cursor_ptr);\n                glyph_len = nk_utf_decode(cursor_ptr, &unicode, 4);\n\n                label.x = area.x + cursor_pos.x - edit->scrollbar.x;\n                label.y = area.y + cursor_pos.y - edit->scrollbar.y;\n                label.w = font->width(font->userdata, font->height, cursor_ptr, glyph_len);\n                label.h = row_height;\n\n                txt.padding = nk_vec2(0,0);\n                txt.background = cursor_color;;\n                txt.text = cursor_text_color;\n                nk_fill_rect(out, label, 0, cursor_color);\n                nk_widget_text(out, label, cursor_ptr, glyph_len, &txt, NK_TEXT_LEFT, font);\n            }\n        }}\n    } else {\n        /* not active so just draw text */\n        int l = nk_str_len_char(&edit->string);\n        const char *begin = nk_str_get_const(&edit->string);\n\n        const struct nk_style_item *background;\n        struct nk_color background_color;\n        struct nk_color text_color;\n        nk_push_scissor(out, clip);\n        if (*state & NK_WIDGET_STATE_ACTIVED) {\n            background = &style->active;\n            text_color = style->text_active;\n        } else if (*state & NK_WIDGET_STATE_HOVER) {\n            background = &style->hover;\n            text_color = style->text_hover;\n        } else {\n            background = &style->normal;\n            text_color = style->text_normal;\n        }\n        if (background->type == NK_STYLE_ITEM_IMAGE)\n            background_color = nk_rgba(0,0,0,0);\n        else background_color = background->data.color;\n        nk_edit_draw_text(out, style, area.x - edit->scrollbar.x,\n            area.y - edit->scrollbar.y, 0, begin, l, row_height, font,\n            background_color, text_color, nk_false);\n    }\n    nk_push_scissor(out, old_clip);}\n    return ret;\n}\n\n/* ===============================================================\n *\n *                          PROPERTY\n *\n * ===============================================================*/\nenum nk_property_status {\n    NK_PROPERTY_DEFAULT,\n    NK_PROPERTY_EDIT,\n    NK_PROPERTY_DRAG\n};\nenum nk_property_filter {\n    NK_FILTER_INT,\n    NK_FILTER_FLOAT\n};\nenum nk_property_kind {\n    NK_PROPERTY_INT,\n    NK_PROPERTY_FLOAT,\n    NK_PROPERTY_DOUBLE\n};\nunion nk_property {\n    int i;\n    float f;\n    double d;\n};\nstruct nk_property_variant {\n    enum nk_property_kind kind;\n    union nk_property value;\n    union nk_property min_value;\n    union nk_property max_value;\n    union nk_property step;\n};\n\nNK_INTERN void\nnk_drag_behavior(nk_flags *state, const struct nk_input *in,\n    struct nk_rect drag, struct nk_property_variant *variant,\n    float inc_per_pixel)\n{\n    int left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down;\n    int left_mouse_click_in_cursor = in &&\n        nk_input_has_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, drag, nk_true);\n\n    nk_widget_state_reset(state);\n    if (nk_input_is_mouse_hovering_rect(in, drag))\n        *state = NK_WIDGET_STATE_HOVERED;\n\n    if (left_mouse_down && left_mouse_click_in_cursor) {\n        float delta, pixels;\n        pixels = in->mouse.delta.x;\n        delta = pixels * inc_per_pixel;\n        switch (variant->kind) {\n        default: break;\n        case NK_PROPERTY_INT:\n            variant->value.i = variant->value.i + (int)delta;\n            variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i, variant->max_value.i);\n            break;\n        case NK_PROPERTY_FLOAT:\n            variant->value.f = variant->value.f + (float)delta;\n            variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f, variant->max_value.f);\n            break;\n        case NK_PROPERTY_DOUBLE:\n            variant->value.d = variant->value.d + (double)delta;\n            variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d, variant->max_value.d);\n            break;\n        }\n        *state = NK_WIDGET_STATE_ACTIVE;\n    }\n    if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, drag))\n        *state |= NK_WIDGET_STATE_ENTERED;\n    else if (nk_input_is_mouse_prev_hovering_rect(in, drag))\n        *state |= NK_WIDGET_STATE_LEFT;\n}\n\nNK_INTERN void\nnk_property_behavior(nk_flags *ws, const struct nk_input *in,\n    struct nk_rect property,  struct nk_rect label, struct nk_rect edit,\n    struct nk_rect empty, int *state, struct nk_property_variant *variant,\n    float inc_per_pixel)\n{\n    if (in && *state == NK_PROPERTY_DEFAULT) {\n        if (nk_button_behavior(ws, edit, in, NK_BUTTON_DEFAULT))\n            *state = NK_PROPERTY_EDIT;\n        else if (nk_input_is_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, label, nk_true))\n            *state = NK_PROPERTY_DRAG;\n        else if (nk_input_is_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, empty, nk_true))\n            *state = NK_PROPERTY_DRAG;\n    }\n    if (*state == NK_PROPERTY_DRAG) {\n        nk_drag_behavior(ws, in, property, variant, inc_per_pixel);\n        if (!(*ws & NK_WIDGET_STATE_ACTIVED)) *state = NK_PROPERTY_DEFAULT;\n    }\n}\n\nNK_INTERN void\nnk_draw_property(struct nk_command_buffer *out, const struct nk_style_property *style,\n    const struct nk_rect *bounds, const struct nk_rect *label, nk_flags state,\n    const char *name, int len, const struct nk_user_font *font)\n{\n    struct nk_text text;\n    const struct nk_style_item *background;\n\n    /* select correct background and text color */\n    if (state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->active;\n        text.text = style->label_active;\n    } else if (state & NK_WIDGET_STATE_HOVER) {\n        background = &style->hover;\n        text.text = style->label_hover;\n    } else {\n        background = &style->normal;\n        text.text = style->label_normal;\n    }\n\n    /* draw background */\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        nk_draw_image(out, *bounds, &background->data.image, nk_white);\n        text.background = nk_rgba(0,0,0,0);\n    } else {\n        text.background = background->data.color;\n        nk_fill_rect(out, *bounds, style->rounding, background->data.color);\n        nk_stroke_rect(out, *bounds, style->rounding, style->border, background->data.color);\n    }\n\n    /* draw label */\n    text.padding = nk_vec2(0,0);\n    nk_widget_text(out, *label, name, len, &text, NK_TEXT_CENTERED, font);\n}\n\nNK_INTERN void\nnk_do_property(nk_flags *ws,\n    struct nk_command_buffer *out, struct nk_rect property,\n    const char *name, struct nk_property_variant *variant,\n    float inc_per_pixel, char *buffer, int *len,\n    int *state, int *cursor, int *select_begin, int *select_end,\n    const struct nk_style_property *style,\n    enum nk_property_filter filter, struct nk_input *in,\n    const struct nk_user_font *font, struct nk_text_edit *text_edit,\n    enum nk_button_behavior behavior)\n{\n    const nk_plugin_filter filters[] = {\n        nk_filter_decimal,\n        nk_filter_float\n    };\n    int active, old;\n    int num_len, name_len;\n    char string[NK_MAX_NUMBER_BUFFER];\n    float size;\n\n    char *dst = 0;\n    int *length;\n\n    struct nk_rect left;\n    struct nk_rect right;\n    struct nk_rect label;\n    struct nk_rect edit;\n    struct nk_rect empty;\n\n    /* left decrement button */\n    left.h = font->height/2;\n    left.w = left.h;\n    left.x = property.x + style->border + style->padding.x;\n    left.y = property.y + style->border + property.h/2.0f - left.h/2;\n\n    /* text label */\n    name_len = nk_strlen(name);\n    size = font->width(font->userdata, font->height, name, name_len);\n    label.x = left.x + left.w + style->padding.x;\n    label.w = (float)size + 2 * style->padding.x;\n    label.y = property.y + style->border + style->padding.y;\n    label.h = property.h - (2 * style->border + 2 * style->padding.y);\n\n    /* right increment button */\n    right.y = left.y;\n    right.w = left.w;\n    right.h = left.h;\n    right.x = property.x + property.w - (right.w + style->padding.x);\n\n    /* edit */\n    if (*state == NK_PROPERTY_EDIT) {\n        size = font->width(font->userdata, font->height, buffer, *len);\n        size += style->edit.cursor_size;\n        length = len;\n        dst = buffer;\n    } else {\n        switch (variant->kind) {\n        default: break;\n        case NK_PROPERTY_INT:\n            nk_itoa(string, variant->value.i);\n            num_len = nk_strlen(string);\n            break;\n        case NK_PROPERTY_FLOAT:\n            nk_dtoa(string, (double)variant->value.f);\n            num_len = nk_string_float_limit(string, NK_MAX_FLOAT_PRECISION);\n            break;\n        case NK_PROPERTY_DOUBLE:\n            nk_dtoa(string, variant->value.d);\n            num_len = nk_string_float_limit(string, NK_MAX_FLOAT_PRECISION);\n            break;\n        }\n        size = font->width(font->userdata, font->height, string, num_len);\n        dst = string;\n        length = &num_len;\n    }\n\n    edit.w =  (float)size + 2 * style->padding.x;\n    edit.w = NK_MIN(edit.w, right.x - (label.x + label.w));\n    edit.x = right.x - (edit.w + style->padding.x);\n    edit.y = property.y + style->border;\n    edit.h = property.h - (2 * style->border);\n\n    /* empty left space activator */\n    empty.w = edit.x - (label.x + label.w);\n    empty.x = label.x + label.w;\n    empty.y = property.y;\n    empty.h = property.h;\n\n    /* update property */\n    old = (*state == NK_PROPERTY_EDIT);\n    nk_property_behavior(ws, in, property, label, edit, empty, state, variant, inc_per_pixel);\n\n    /* draw property */\n    if (style->draw_begin) style->draw_begin(out, style->userdata);\n    nk_draw_property(out, style, &property, &label, *ws, name, name_len, font);\n    if (style->draw_end) style->draw_end(out, style->userdata);\n\n    /* execute right button  */\n    if (nk_do_button_symbol(ws, out, left, style->sym_left, behavior, &style->dec_button, in, font)) {\n        switch (variant->kind) {\n        default: break;\n        case NK_PROPERTY_INT:\n            variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i - variant->step.i, variant->max_value.i); break;\n        case NK_PROPERTY_FLOAT:\n            variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f - variant->step.f, variant->max_value.f); break;\n        case NK_PROPERTY_DOUBLE:\n            variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d - variant->step.d, variant->max_value.d); break;\n        }\n    }\n    /* execute left button  */\n    if (nk_do_button_symbol(ws, out, right, style->sym_right, behavior, &style->inc_button, in, font)) {\n        switch (variant->kind) {\n        default: break;\n        case NK_PROPERTY_INT:\n            variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i + variant->step.i, variant->max_value.i); break;\n        case NK_PROPERTY_FLOAT:\n            variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f + variant->step.f, variant->max_value.f); break;\n        case NK_PROPERTY_DOUBLE:\n            variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d + variant->step.d, variant->max_value.d); break;\n        }\n    }\n    if (old != NK_PROPERTY_EDIT && (*state == NK_PROPERTY_EDIT)) {\n        /* property has been activated so setup buffer */\n        NK_MEMCPY(buffer, dst, (nk_size)*length);\n        *cursor = nk_utf_len(buffer, *length);\n        *len = *length;\n        length = len;\n        dst = buffer;\n        active = 0;\n    } else active = (*state == NK_PROPERTY_EDIT);\n\n    /* execute and run text edit field */\n    nk_textedit_clear_state(text_edit, NK_TEXT_EDIT_SINGLE_LINE, filters[filter]);\n    text_edit->active = (unsigned char)active;\n    text_edit->string.len = *length;\n    text_edit->cursor = NK_CLAMP(0, *cursor, *length);\n    text_edit->select_start = NK_CLAMP(0,*select_begin, *length);\n    text_edit->select_end = NK_CLAMP(0,*select_end, *length);\n    text_edit->string.buffer.allocated = (nk_size)*length;\n    text_edit->string.buffer.memory.size = NK_MAX_NUMBER_BUFFER;\n    text_edit->string.buffer.memory.ptr = dst;\n    text_edit->string.buffer.size = NK_MAX_NUMBER_BUFFER;\n    text_edit->mode = NK_TEXT_EDIT_MODE_INSERT;\n    nk_do_edit(ws, out, edit, NK_EDIT_FIELD|NK_EDIT_AUTO_SELECT,\n        filters[filter], text_edit, &style->edit, (*state == NK_PROPERTY_EDIT) ? in: 0, font);\n\n    *length = text_edit->string.len;\n    *cursor = text_edit->cursor;\n    *select_begin = text_edit->select_start;\n    *select_end = text_edit->select_end;\n    if (text_edit->active && nk_input_is_key_pressed(in, NK_KEY_ENTER))\n        text_edit->active = nk_false;\n\n    if (active && !text_edit->active) {\n        /* property is now not active so convert edit text to value*/\n        *state = NK_PROPERTY_DEFAULT;\n        buffer[*len] = '\\0';\n        switch (variant->kind) {\n        default: break;\n        case NK_PROPERTY_INT:\n            variant->value.i = nk_strtoi(buffer, 0);\n            variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i, variant->max_value.i);\n            break;\n        case NK_PROPERTY_FLOAT:\n            nk_string_float_limit(buffer, NK_MAX_FLOAT_PRECISION);\n            variant->value.f = nk_strtof(buffer, 0);\n            variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f, variant->max_value.f);\n            break;\n        case NK_PROPERTY_DOUBLE:\n            nk_string_float_limit(buffer, NK_MAX_FLOAT_PRECISION);\n            variant->value.d = nk_strtod(buffer, 0);\n            variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d, variant->max_value.d);\n            break;\n        }\n    }\n}\n/* ===============================================================\n *\n *                          COLOR PICKER\n *\n * ===============================================================*/\nNK_INTERN int\nnk_color_picker_behavior(nk_flags *state,\n    const struct nk_rect *bounds, const struct nk_rect *matrix,\n    const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar,\n    struct nk_color *color, const struct nk_input *in)\n{\n    float hsva[4];\n    int value_changed = 0;\n    int hsv_changed = 0;\n\n    NK_ASSERT(state);\n    NK_ASSERT(matrix);\n    NK_ASSERT(hue_bar);\n    NK_ASSERT(color);\n\n    /* color matrix */\n    nk_color_hsva_fv(hsva, *color);\n    if (nk_button_behavior(state, *matrix, in, NK_BUTTON_REPEATER)) {\n        hsva[1] = NK_SATURATE((in->mouse.pos.x - matrix->x) / (matrix->w-1));\n        hsva[2] = 1.0f - NK_SATURATE((in->mouse.pos.y - matrix->y) / (matrix->h-1));\n        value_changed = hsv_changed = 1;\n    }\n\n    /* hue bar */\n    if (nk_button_behavior(state, *hue_bar, in, NK_BUTTON_REPEATER)) {\n        hsva[0] = NK_SATURATE((in->mouse.pos.y - hue_bar->y) / (hue_bar->h-1));\n        value_changed = hsv_changed = 1;\n    }\n\n    /* alpha bar */\n    if (alpha_bar) {\n        if (nk_button_behavior(state, *alpha_bar, in, NK_BUTTON_REPEATER)) {\n            hsva[3] = 1.0f - NK_SATURATE((in->mouse.pos.y - alpha_bar->y) / (alpha_bar->h-1));\n            value_changed = 1;\n        }\n    }\n    nk_widget_state_reset(state);\n    if (hsv_changed) {\n        *color = nk_hsva_fv(hsva);\n        *state = NK_WIDGET_STATE_ACTIVE;\n    }\n    if (value_changed) {\n        color->a = (nk_byte)(hsva[3] * 255.0f);\n        *state = NK_WIDGET_STATE_ACTIVE;\n    }\n\n    /* set color picker widget state */\n    if (nk_input_is_mouse_hovering_rect(in, *bounds))\n        *state = NK_WIDGET_STATE_HOVERED;\n    if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, *bounds))\n        *state |= NK_WIDGET_STATE_ENTERED;\n    else if (nk_input_is_mouse_prev_hovering_rect(in, *bounds))\n        *state |= NK_WIDGET_STATE_LEFT;\n    return value_changed;\n}\n\nNK_INTERN void\nnk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix,\n    const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar,\n    struct nk_color color)\n{\n    NK_STORAGE const struct nk_color black = {0,0,0,255};\n    NK_STORAGE const struct nk_color white = {255, 255, 255, 255};\n    NK_STORAGE const struct nk_color black_trans = {0,0,0,0};\n\n    const float crosshair_size = 7.0f;\n    struct nk_color temp;\n    float hsva[4];\n    float line_y;\n    int i;\n\n    NK_ASSERT(o);\n    NK_ASSERT(matrix);\n    NK_ASSERT(hue_bar);\n\n    /* draw hue bar */\n    nk_color_hsv_fv(hsva, color);\n    for (i = 0; i < 6; ++i) {\n        NK_GLOBAL const struct nk_color hue_colors[] = {\n            {255, 0, 0, 255},\n            {255,255,0,255},\n            {0,255,0,255},\n            {0, 255,255,255},\n            {0,0,255,255},\n            {255, 0, 255, 255},\n            {255, 0, 0, 255}\n        };\n        nk_fill_rect_multi_color(o,\n            nk_rect(hue_bar->x, hue_bar->y + (float)i * (hue_bar->h/6.0f) + 0.5f,\n                hue_bar->w, (hue_bar->h/6.0f) + 0.5f), hue_colors[i], hue_colors[i],\n                hue_colors[i+1], hue_colors[i+1]);\n    }\n    line_y = (float)(int)(hue_bar->y + hsva[0] * matrix->h + 0.5f);\n    nk_stroke_line(o, hue_bar->x-1, line_y, hue_bar->x + hue_bar->w + 2,\n        line_y, 1, nk_rgb(255,255,255));\n\n    /* draw alpha bar */\n    if (alpha_bar) {\n        float alpha = NK_SATURATE((float)color.a/255.0f);\n        line_y = (float)(int)(alpha_bar->y +  (1.0f - alpha) * matrix->h + 0.5f);\n\n        nk_fill_rect_multi_color(o, *alpha_bar, white, white, black, black);\n        nk_stroke_line(o, alpha_bar->x-1, line_y, alpha_bar->x + alpha_bar->w + 2,\n            line_y, 1, nk_rgb(255,255,255));\n    }\n\n    /* draw color matrix */\n    temp = nk_hsv_f(hsva[0], 1.0f, 1.0f);\n    nk_fill_rect_multi_color(o, *matrix, white, temp, temp, white);\n    nk_fill_rect_multi_color(o, *matrix, black_trans, black_trans, black, black);\n\n    /* draw cross-hair */\n    {struct nk_vec2 p; float S = hsva[1]; float V = hsva[2];\n    p.x = (float)(int)(matrix->x + S * matrix->w);\n    p.y = (float)(int)(matrix->y + (1.0f - V) * matrix->h);\n    nk_stroke_line(o, p.x - crosshair_size, p.y, p.x-2, p.y, 1.0f, white);\n    nk_stroke_line(o, p.x + crosshair_size + 1, p.y, p.x+3, p.y, 1.0f, white);\n    nk_stroke_line(o, p.x, p.y + crosshair_size + 1, p.x, p.y+3, 1.0f, white);\n    nk_stroke_line(o, p.x, p.y - crosshair_size, p.x, p.y-2, 1.0f, white);}\n}\n\nNK_INTERN int\nnk_do_color_picker(nk_flags *state,\n    struct nk_command_buffer *out, struct nk_color *color,\n    enum nk_color_format fmt, struct nk_rect bounds,\n    struct nk_vec2 padding, const struct nk_input *in,\n    const struct nk_user_font *font)\n{\n    int ret = 0;\n    struct nk_rect matrix;\n    struct nk_rect hue_bar;\n    struct nk_rect alpha_bar;\n    float bar_w;\n\n    NK_ASSERT(out);\n    NK_ASSERT(color);\n    NK_ASSERT(state);\n    NK_ASSERT(font);\n    if (!out || !color || !state || !font)\n        return ret;\n\n    bar_w = font->height;\n    bounds.x += padding.x;\n    bounds.y += padding.x;\n    bounds.w -= 2 * padding.x;\n    bounds.h -= 2 * padding.y;\n\n    matrix.x = bounds.x;\n    matrix.y = bounds.y;\n    matrix.h = bounds.h;\n    matrix.w = bounds.w - (3 * padding.x + 2 * bar_w);\n\n    hue_bar.w = bar_w;\n    hue_bar.y = bounds.y;\n    hue_bar.h = matrix.h;\n    hue_bar.x = matrix.x + matrix.w + padding.x;\n\n    alpha_bar.x = hue_bar.x + hue_bar.w + padding.x;\n    alpha_bar.y = bounds.y;\n    alpha_bar.w = bar_w;\n    alpha_bar.h = matrix.h;\n\n    ret = nk_color_picker_behavior(state, &bounds, &matrix, &hue_bar,\n        (fmt == NK_RGBA) ? &alpha_bar:0, color, in);\n    nk_draw_color_picker(out, &matrix, &hue_bar, (fmt == NK_RGBA) ? &alpha_bar:0, *color);\n    return ret;\n}\n\n/* ==============================================================\n *\n *                          STYLE\n *\n * ===============================================================*/\nNK_API void nk_style_default(struct nk_context *ctx){nk_style_from_table(ctx, 0);}\n#define NK_COLOR_MAP(NK_COLOR)\\\n    NK_COLOR(NK_COLOR_TEXT,                 175,175,175,255) \\\n    NK_COLOR(NK_COLOR_WINDOW,               45, 45, 45, 255) \\\n    NK_COLOR(NK_COLOR_HEADER,               40, 40, 40, 255) \\\n    NK_COLOR(NK_COLOR_BORDER,               65, 65, 65, 255) \\\n    NK_COLOR(NK_COLOR_BUTTON,               50, 50, 50, 255) \\\n    NK_COLOR(NK_COLOR_BUTTON_HOVER,         40, 40, 40, 255) \\\n    NK_COLOR(NK_COLOR_BUTTON_ACTIVE,        35, 35, 35, 255) \\\n    NK_COLOR(NK_COLOR_TOGGLE,               100,100,100,255) \\\n    NK_COLOR(NK_COLOR_TOGGLE_HOVER,         120,120,120,255) \\\n    NK_COLOR(NK_COLOR_TOGGLE_CURSOR,        45, 45, 45, 255) \\\n    NK_COLOR(NK_COLOR_SELECT,               45, 45, 45, 255) \\\n    NK_COLOR(NK_COLOR_SELECT_ACTIVE,        35, 35, 35,255) \\\n    NK_COLOR(NK_COLOR_SLIDER,               38, 38, 38, 255) \\\n    NK_COLOR(NK_COLOR_SLIDER_CURSOR,        100,100,100,255) \\\n    NK_COLOR(NK_COLOR_SLIDER_CURSOR_HOVER,  120,120,120,255) \\\n    NK_COLOR(NK_COLOR_SLIDER_CURSOR_ACTIVE, 150,150,150,255) \\\n    NK_COLOR(NK_COLOR_PROPERTY,             38, 38, 38, 255) \\\n    NK_COLOR(NK_COLOR_EDIT,                 38, 38, 38, 255)  \\\n    NK_COLOR(NK_COLOR_EDIT_CURSOR,          175,175,175,255) \\\n    NK_COLOR(NK_COLOR_COMBO,                45, 45, 45, 255) \\\n    NK_COLOR(NK_COLOR_CHART,                120,120,120,255) \\\n    NK_COLOR(NK_COLOR_CHART_COLOR,          45, 45, 45, 255) \\\n    NK_COLOR(NK_COLOR_CHART_COLOR_HIGHLIGHT,255, 0,  0, 255) \\\n    NK_COLOR(NK_COLOR_SCROLLBAR,            40, 40, 40, 255) \\\n    NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR,     100,100,100,255) \\\n    NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR_HOVER,120,120,120,255) \\\n    NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR_ACTIVE,150,150,150,255) \\\n    NK_COLOR(NK_COLOR_TAB_HEADER,           40, 40, 40,255)\n\nNK_GLOBAL const struct nk_color\nnk_default_color_style[NK_COLOR_COUNT] = {\n#define NK_COLOR(a,b,c,d,e) {b,c,d,e},\n    NK_COLOR_MAP(NK_COLOR)\n#undef NK_COLOR\n};\n\nNK_GLOBAL const char *nk_color_names[NK_COLOR_COUNT] = {\n#define NK_COLOR(a,b,c,d,e) #a,\n    NK_COLOR_MAP(NK_COLOR)\n#undef NK_COLOR\n};\n\nNK_API const char *nk_style_get_color_by_name(enum nk_style_colors c)\n{return nk_color_names[c];}\n\nNK_API struct nk_style_item nk_style_item_image(struct nk_image img)\n{struct nk_style_item i; i.type = NK_STYLE_ITEM_IMAGE; i.data.image = img; return i;}\n\nNK_API struct nk_style_item nk_style_item_color(struct nk_color col)\n{struct nk_style_item i; i.type = NK_STYLE_ITEM_COLOR; i.data.color = col; return i;}\n\nNK_API struct nk_style_item nk_style_item_hide(void)\n{struct nk_style_item i; i.type = NK_STYLE_ITEM_COLOR; i.data.color = nk_rgba(0,0,0,0); return i;}\n\nNK_API void\nnk_style_from_table(struct nk_context *ctx, const struct nk_color *table)\n{\n    struct nk_style *style;\n    struct nk_style_text *text;\n    struct nk_style_button *button;\n    struct nk_style_toggle *toggle;\n    struct nk_style_selectable *select;\n    struct nk_style_slider *slider;\n    struct nk_style_progress *prog;\n    struct nk_style_scrollbar *scroll;\n    struct nk_style_edit *edit;\n    struct nk_style_property *property;\n    struct nk_style_combo *combo;\n    struct nk_style_chart *chart;\n    struct nk_style_tab *tab;\n    struct nk_style_window *win;\n\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    style = &ctx->style;\n    table = (!table) ? nk_default_color_style: table;\n\n    /* default text */\n    text = &style->text;\n    text->color = table[NK_COLOR_TEXT];\n    text->padding = nk_vec2(0,0);\n\n    /* default button */\n    button = &style->button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_BUTTON]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_BUTTON_HOVER]);\n    button->active          = nk_style_item_color(table[NK_COLOR_BUTTON_ACTIVE]);\n    button->border_color    = table[NK_COLOR_BORDER];\n    button->text_background = table[NK_COLOR_BUTTON];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(2.0f,2.0f);\n    button->image_padding   = nk_vec2(0.0f,0.0f);\n    button->touch_padding   = nk_vec2(0.0f, 0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 1.0f;\n    button->rounding        = 4.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n\n    /* contextual button */\n    button = &style->contextual_button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_WINDOW]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_BUTTON_HOVER]);\n    button->active          = nk_style_item_color(table[NK_COLOR_BUTTON_ACTIVE]);\n    button->border_color    = table[NK_COLOR_WINDOW];\n    button->text_background = table[NK_COLOR_WINDOW];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(2.0f,2.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 0.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n\n    /* menu button */\n    button = &style->menu_button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_WINDOW]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_WINDOW]);\n    button->active          = nk_style_item_color(table[NK_COLOR_WINDOW]);\n    button->border_color    = table[NK_COLOR_WINDOW];\n    button->text_background = table[NK_COLOR_WINDOW];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(2.0f,2.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 0.0f;\n    button->rounding        = 1.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n\n    /* checkbox toggle */\n    toggle = &style->checkbox;\n    nk_zero_struct(*toggle);\n    toggle->normal          = nk_style_item_color(table[NK_COLOR_TOGGLE]);\n    toggle->hover           = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]);\n    toggle->active          = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]);\n    toggle->cursor_normal   = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]);\n    toggle->cursor_hover    = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]);\n    toggle->userdata        = nk_handle_ptr(0);\n    toggle->text_background = table[NK_COLOR_WINDOW];\n    toggle->text_normal     = table[NK_COLOR_TEXT];\n    toggle->text_hover      = table[NK_COLOR_TEXT];\n    toggle->text_active     = table[NK_COLOR_TEXT];\n    toggle->padding         = nk_vec2(2.0f, 2.0f);\n    toggle->touch_padding   = nk_vec2(0,0);\n    toggle->border_color    = nk_rgba(0,0,0,0);\n    toggle->border          = 0.0f;\n    toggle->spacing         = 4;\n\n    /* option toggle */\n    toggle = &style->option;\n    nk_zero_struct(*toggle);\n    toggle->normal          = nk_style_item_color(table[NK_COLOR_TOGGLE]);\n    toggle->hover           = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]);\n    toggle->active          = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]);\n    toggle->cursor_normal   = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]);\n    toggle->cursor_hover    = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]);\n    toggle->userdata        = nk_handle_ptr(0);\n    toggle->text_background = table[NK_COLOR_WINDOW];\n    toggle->text_normal     = table[NK_COLOR_TEXT];\n    toggle->text_hover      = table[NK_COLOR_TEXT];\n    toggle->text_active     = table[NK_COLOR_TEXT];\n    toggle->padding         = nk_vec2(3.0f, 3.0f);\n    toggle->touch_padding   = nk_vec2(0,0);\n    toggle->border_color    = nk_rgba(0,0,0,0);\n    toggle->border          = 0.0f;\n    toggle->spacing         = 4;\n\n    /* selectable */\n    select = &style->selectable;\n    nk_zero_struct(*select);\n    select->normal          = nk_style_item_color(table[NK_COLOR_SELECT]);\n    select->hover           = nk_style_item_color(table[NK_COLOR_SELECT]);\n    select->pressed         = nk_style_item_color(table[NK_COLOR_SELECT]);\n    select->normal_active   = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]);\n    select->hover_active    = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]);\n    select->pressed_active  = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]);\n    select->text_normal     = table[NK_COLOR_TEXT];\n    select->text_hover      = table[NK_COLOR_TEXT];\n    select->text_pressed    = table[NK_COLOR_TEXT];\n    select->text_normal_active  = table[NK_COLOR_TEXT];\n    select->text_hover_active   = table[NK_COLOR_TEXT];\n    select->text_pressed_active = table[NK_COLOR_TEXT];\n    select->padding         = nk_vec2(2.0f,2.0f);\n    select->touch_padding   = nk_vec2(0,0);\n    select->userdata        = nk_handle_ptr(0);\n    select->rounding        = 0.0f;\n    select->draw_begin      = 0;\n    select->draw_end        = 0;\n\n    /* slider */\n    slider = &style->slider;\n    nk_zero_struct(*slider);\n    slider->normal          = nk_style_item_hide();\n    slider->hover           = nk_style_item_hide();\n    slider->active          = nk_style_item_hide();\n    slider->bar_normal      = table[NK_COLOR_SLIDER];\n    slider->bar_hover       = table[NK_COLOR_SLIDER];\n    slider->bar_active      = table[NK_COLOR_SLIDER];\n    slider->bar_filled      = table[NK_COLOR_SLIDER_CURSOR];\n    slider->cursor_normal   = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR]);\n    slider->cursor_hover    = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_HOVER]);\n    slider->cursor_active   = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_ACTIVE]);\n    slider->inc_symbol      = NK_SYMBOL_TRIANGLE_RIGHT;\n    slider->dec_symbol      = NK_SYMBOL_TRIANGLE_LEFT;\n    slider->cursor_size     = nk_vec2(16,16);\n    slider->padding         = nk_vec2(2,2);\n    slider->spacing         = nk_vec2(2,2);\n    slider->userdata        = nk_handle_ptr(0);\n    slider->show_buttons    = nk_false;\n    slider->bar_height      = 8;\n    slider->rounding        = 0;\n    slider->draw_begin      = 0;\n    slider->draw_end        = 0;\n\n    /* slider buttons */\n    button = &style->slider.inc_button;\n    button->normal          = nk_style_item_color(nk_rgb(40,40,40));\n    button->hover           = nk_style_item_color(nk_rgb(42,42,42));\n    button->active          = nk_style_item_color(nk_rgb(44,44,44));\n    button->border_color    = nk_rgb(65,65,65);\n    button->text_background = nk_rgb(40,40,40);\n    button->text_normal     = nk_rgb(175,175,175);\n    button->text_hover      = nk_rgb(175,175,175);\n    button->text_active     = nk_rgb(175,175,175);\n    button->padding         = nk_vec2(8.0f,8.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 1.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n    style->slider.dec_button = style->slider.inc_button;\n\n    /* progressbar */\n    prog = &style->progress;\n    nk_zero_struct(*prog);\n    prog->normal            = nk_style_item_color(table[NK_COLOR_SLIDER]);\n    prog->hover             = nk_style_item_color(table[NK_COLOR_SLIDER]);\n    prog->active            = nk_style_item_color(table[NK_COLOR_SLIDER]);\n    prog->cursor_normal     = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR]);\n    prog->cursor_hover      = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_HOVER]);\n    prog->cursor_active     = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_ACTIVE]);\n    prog->border_color      = nk_rgba(0,0,0,0);\n    prog->cursor_border_color = nk_rgba(0,0,0,0);\n    prog->userdata          = nk_handle_ptr(0);\n    prog->padding           = nk_vec2(4,4);\n    prog->rounding          = 0;\n    prog->border            = 0;\n    prog->cursor_rounding   = 0;\n    prog->cursor_border     = 0;\n    prog->draw_begin        = 0;\n    prog->draw_end          = 0;\n\n    /* scrollbars */\n    scroll = &style->scrollh;\n    nk_zero_struct(*scroll);\n    scroll->normal          = nk_style_item_color(table[NK_COLOR_SCROLLBAR]);\n    scroll->hover           = nk_style_item_color(table[NK_COLOR_SCROLLBAR]);\n    scroll->active          = nk_style_item_color(table[NK_COLOR_SCROLLBAR]);\n    scroll->cursor_normal   = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR]);\n    scroll->cursor_hover    = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR_HOVER]);\n    scroll->cursor_active   = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR_ACTIVE]);\n    scroll->dec_symbol      = NK_SYMBOL_CIRCLE_SOLID;\n    scroll->inc_symbol      = NK_SYMBOL_CIRCLE_SOLID;\n    scroll->userdata        = nk_handle_ptr(0);\n    scroll->border_color    = table[NK_COLOR_SCROLLBAR];\n    scroll->cursor_border_color = table[NK_COLOR_SCROLLBAR];\n    scroll->padding         = nk_vec2(0,0);\n    scroll->show_buttons    = nk_false;\n    scroll->border          = 0;\n    scroll->rounding        = 0;\n    scroll->border_cursor   = 0;\n    scroll->rounding_cursor = 0;\n    scroll->draw_begin      = 0;\n    scroll->draw_end        = 0;\n    style->scrollv = style->scrollh;\n\n    /* scrollbars buttons */\n    button = &style->scrollh.inc_button;\n    button->normal          = nk_style_item_color(nk_rgb(40,40,40));\n    button->hover           = nk_style_item_color(nk_rgb(42,42,42));\n    button->active          = nk_style_item_color(nk_rgb(44,44,44));\n    button->border_color    = nk_rgb(65,65,65);\n    button->text_background = nk_rgb(40,40,40);\n    button->text_normal     = nk_rgb(175,175,175);\n    button->text_hover      = nk_rgb(175,175,175);\n    button->text_active     = nk_rgb(175,175,175);\n    button->padding         = nk_vec2(4.0f,4.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 1.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n    style->scrollh.dec_button = style->scrollh.inc_button;\n    style->scrollv.inc_button = style->scrollh.inc_button;\n    style->scrollv.dec_button = style->scrollh.inc_button;\n\n    /* edit */\n    edit = &style->edit;\n    nk_zero_struct(*edit);\n    edit->normal            = nk_style_item_color(table[NK_COLOR_EDIT]);\n    edit->hover             = nk_style_item_color(table[NK_COLOR_EDIT]);\n    edit->active            = nk_style_item_color(table[NK_COLOR_EDIT]);\n    edit->cursor_normal     = table[NK_COLOR_TEXT];\n    edit->cursor_hover      = table[NK_COLOR_TEXT];\n    edit->cursor_text_normal= table[NK_COLOR_EDIT];\n    edit->cursor_text_hover = table[NK_COLOR_EDIT];\n    edit->border_color      = table[NK_COLOR_BORDER];\n    edit->text_normal       = table[NK_COLOR_TEXT];\n    edit->text_hover        = table[NK_COLOR_TEXT];\n    edit->text_active       = table[NK_COLOR_TEXT];\n    edit->selected_normal   = table[NK_COLOR_TEXT];\n    edit->selected_hover    = table[NK_COLOR_TEXT];\n    edit->selected_text_normal  = table[NK_COLOR_EDIT];\n    edit->selected_text_hover   = table[NK_COLOR_EDIT];\n    edit->scrollbar_size    = nk_vec2(10,10);\n    edit->scrollbar         = style->scrollv;\n    edit->padding           = nk_vec2(4,4);\n    edit->row_padding       = 2;\n    edit->cursor_size       = 4;\n    edit->border            = 1;\n    edit->rounding          = 0;\n\n    /* property */\n    property = &style->property;\n    nk_zero_struct(*property);\n    property->normal        = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    property->hover         = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    property->active        = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    property->border_color  = table[NK_COLOR_BORDER];\n    property->label_normal  = table[NK_COLOR_TEXT];\n    property->label_hover   = table[NK_COLOR_TEXT];\n    property->label_active  = table[NK_COLOR_TEXT];\n    property->sym_left      = NK_SYMBOL_TRIANGLE_LEFT;\n    property->sym_right     = NK_SYMBOL_TRIANGLE_RIGHT;\n    property->userdata      = nk_handle_ptr(0);\n    property->padding       = nk_vec2(4,4);\n    property->border        = 1;\n    property->rounding      = 10;\n    property->draw_begin    = 0;\n    property->draw_end      = 0;\n\n    /* property buttons */\n    button = &style->property.dec_button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    button->active          = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    button->border_color    = nk_rgba(0,0,0,0);\n    button->text_background = table[NK_COLOR_PROPERTY];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(0.0f,0.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 0.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n    style->property.inc_button = style->property.dec_button;\n\n    /* property edit */\n    edit = &style->property.edit;\n    nk_zero_struct(*edit);\n    edit->normal            = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    edit->hover             = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    edit->active            = nk_style_item_color(table[NK_COLOR_PROPERTY]);\n    edit->border_color      = nk_rgba(0,0,0,0);\n    edit->cursor_normal     = table[NK_COLOR_TEXT];\n    edit->cursor_hover      = table[NK_COLOR_TEXT];\n    edit->cursor_text_normal= table[NK_COLOR_EDIT];\n    edit->cursor_text_hover = table[NK_COLOR_EDIT];\n    edit->text_normal       = table[NK_COLOR_TEXT];\n    edit->text_hover        = table[NK_COLOR_TEXT];\n    edit->text_active       = table[NK_COLOR_TEXT];\n    edit->selected_normal   = table[NK_COLOR_TEXT];\n    edit->selected_hover    = table[NK_COLOR_TEXT];\n    edit->selected_text_normal  = table[NK_COLOR_EDIT];\n    edit->selected_text_hover   = table[NK_COLOR_EDIT];\n    edit->padding           = nk_vec2(0,0);\n    edit->cursor_size       = 8;\n    edit->border            = 0;\n    edit->rounding          = 0;\n\n    /* chart */\n    chart = &style->chart;\n    nk_zero_struct(*chart);\n    chart->background       = nk_style_item_color(table[NK_COLOR_CHART]);\n    chart->border_color     = table[NK_COLOR_BORDER];\n    chart->selected_color   = table[NK_COLOR_CHART_COLOR_HIGHLIGHT];\n    chart->color            = table[NK_COLOR_CHART_COLOR];\n    chart->padding          = nk_vec2(4,4);\n    chart->border           = 0;\n    chart->rounding         = 0;\n\n    /* combo */\n    combo = &style->combo;\n    combo->normal           = nk_style_item_color(table[NK_COLOR_COMBO]);\n    combo->hover            = nk_style_item_color(table[NK_COLOR_COMBO]);\n    combo->active           = nk_style_item_color(table[NK_COLOR_COMBO]);\n    combo->border_color     = table[NK_COLOR_BORDER];\n    combo->label_normal     = table[NK_COLOR_TEXT];\n    combo->label_hover      = table[NK_COLOR_TEXT];\n    combo->label_active     = table[NK_COLOR_TEXT];\n    combo->sym_normal       = NK_SYMBOL_TRIANGLE_DOWN;\n    combo->sym_hover        = NK_SYMBOL_TRIANGLE_DOWN;\n    combo->sym_active       = NK_SYMBOL_TRIANGLE_DOWN;\n    combo->content_padding  = nk_vec2(4,4);\n    combo->button_padding   = nk_vec2(0,4);\n    combo->spacing          = nk_vec2(4,0);\n    combo->border           = 1;\n    combo->rounding         = 0;\n\n    /* combo button */\n    button = &style->combo.button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_COMBO]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_COMBO]);\n    button->active          = nk_style_item_color(table[NK_COLOR_COMBO]);\n    button->border_color    = nk_rgba(0,0,0,0);\n    button->text_background = table[NK_COLOR_COMBO];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(2.0f,2.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 0.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n\n    /* tab */\n    tab = &style->tab;\n    tab->background         = nk_style_item_color(table[NK_COLOR_TAB_HEADER]);\n    tab->border_color       = table[NK_COLOR_BORDER];\n    tab->text               = table[NK_COLOR_TEXT];\n    tab->sym_minimize       = NK_SYMBOL_TRIANGLE_RIGHT;\n    tab->sym_maximize       = NK_SYMBOL_TRIANGLE_DOWN;\n    tab->padding            = nk_vec2(4,4);\n    tab->spacing            = nk_vec2(4,4);\n    tab->indent             = 10.0f;\n    tab->border             = 1;\n    tab->rounding           = 0;\n\n    /* tab button */\n    button = &style->tab.tab_minimize_button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_TAB_HEADER]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_TAB_HEADER]);\n    button->active          = nk_style_item_color(table[NK_COLOR_TAB_HEADER]);\n    button->border_color    = nk_rgba(0,0,0,0);\n    button->text_background = table[NK_COLOR_TAB_HEADER];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(2.0f,2.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 0.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n    style->tab.tab_maximize_button =*button;\n\n    /* node button */\n    button = &style->tab.node_minimize_button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_WINDOW]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_WINDOW]);\n    button->active          = nk_style_item_color(table[NK_COLOR_WINDOW]);\n    button->border_color    = nk_rgba(0,0,0,0);\n    button->text_background = table[NK_COLOR_TAB_HEADER];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(2.0f,2.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 0.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n    style->tab.node_maximize_button =*button;\n\n    /* window header */\n    win = &style->window;\n    win->header.align = NK_HEADER_RIGHT;\n    win->header.close_symbol = NK_SYMBOL_X;\n    win->header.minimize_symbol = NK_SYMBOL_MINUS;\n    win->header.maximize_symbol = NK_SYMBOL_PLUS;\n    win->header.normal = nk_style_item_color(table[NK_COLOR_HEADER]);\n    win->header.hover = nk_style_item_color(table[NK_COLOR_HEADER]);\n    win->header.active = nk_style_item_color(table[NK_COLOR_HEADER]);\n    win->header.label_normal = table[NK_COLOR_TEXT];\n    win->header.label_hover = table[NK_COLOR_TEXT];\n    win->header.label_active = table[NK_COLOR_TEXT];\n    win->header.label_padding = nk_vec2(4,4);\n    win->header.padding = nk_vec2(4,4);\n    win->header.spacing = nk_vec2(0,0);\n\n    /* window header close button */\n    button = &style->window.header.close_button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_HEADER]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_HEADER]);\n    button->active          = nk_style_item_color(table[NK_COLOR_HEADER]);\n    button->border_color    = nk_rgba(0,0,0,0);\n    button->text_background = table[NK_COLOR_HEADER];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(0.0f,0.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 0.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n\n    /* window header minimize button */\n    button = &style->window.header.minimize_button;\n    nk_zero_struct(*button);\n    button->normal          = nk_style_item_color(table[NK_COLOR_HEADER]);\n    button->hover           = nk_style_item_color(table[NK_COLOR_HEADER]);\n    button->active          = nk_style_item_color(table[NK_COLOR_HEADER]);\n    button->border_color    = nk_rgba(0,0,0,0);\n    button->text_background = table[NK_COLOR_HEADER];\n    button->text_normal     = table[NK_COLOR_TEXT];\n    button->text_hover      = table[NK_COLOR_TEXT];\n    button->text_active     = table[NK_COLOR_TEXT];\n    button->padding         = nk_vec2(0.0f,0.0f);\n    button->touch_padding   = nk_vec2(0.0f,0.0f);\n    button->userdata        = nk_handle_ptr(0);\n    button->text_alignment  = NK_TEXT_CENTERED;\n    button->border          = 0.0f;\n    button->rounding        = 0.0f;\n    button->draw_begin      = 0;\n    button->draw_end        = 0;\n\n    /* window */\n    win->background = table[NK_COLOR_WINDOW];\n    win->fixed_background = nk_style_item_color(table[NK_COLOR_WINDOW]);\n    win->border_color = table[NK_COLOR_BORDER];\n    win->popup_border_color = table[NK_COLOR_BORDER];\n    win->combo_border_color = table[NK_COLOR_BORDER];\n    win->contextual_border_color = table[NK_COLOR_BORDER];\n    win->menu_border_color = table[NK_COLOR_BORDER];\n    win->group_border_color = table[NK_COLOR_BORDER];\n    win->tooltip_border_color = table[NK_COLOR_BORDER];\n    win->scaler = nk_style_item_color(table[NK_COLOR_TEXT]);\n\n    win->rounding = 0.0f;\n    win->spacing = nk_vec2(4,4);\n    win->scrollbar_size = nk_vec2(10,10);\n    win->min_size = nk_vec2(64,64);\n\n    win->combo_border = 1.0f;\n    win->contextual_border = 1.0f;\n    win->menu_border = 1.0f;\n    win->group_border = 1.0f;\n    win->tooltip_border = 1.0f;\n    win->popup_border = 1.0f;\n    win->border = 2.0f;\n    win->min_row_height_padding = 8;\n\n    win->padding = nk_vec2(4,4);\n    win->group_padding = nk_vec2(4,4);\n    win->popup_padding = nk_vec2(4,4);\n    win->combo_padding = nk_vec2(4,4);\n    win->contextual_padding = nk_vec2(4,4);\n    win->menu_padding = nk_vec2(4,4);\n    win->tooltip_padding = nk_vec2(4,4);\n}\n\nNK_API void\nnk_style_set_font(struct nk_context *ctx, const struct nk_user_font *font)\n{\n    struct nk_style *style;\n    NK_ASSERT(ctx);\n\n    if (!ctx) return;\n    style = &ctx->style;\n    style->font = font;\n    ctx->stacks.fonts.head = 0;\n    if (ctx->current)\n        nk_layout_reset_min_row_height(ctx);\n}\n\nNK_API int\nnk_style_push_font(struct nk_context *ctx, const struct nk_user_font *font)\n{\n    struct nk_config_stack_user_font *font_stack;\n    struct nk_config_stack_user_font_element *element;\n\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n\n    font_stack = &ctx->stacks.fonts;\n    NK_ASSERT(font_stack->head < (int)NK_LEN(font_stack->elements));\n    if (font_stack->head >= (int)NK_LEN(font_stack->elements))\n        return 0;\n\n    element = &font_stack->elements[font_stack->head++];\n    element->address = &ctx->style.font;\n    element->old_value = ctx->style.font;\n    ctx->style.font = font;\n    return 1;\n}\n\nNK_API int\nnk_style_pop_font(struct nk_context *ctx)\n{\n    struct nk_config_stack_user_font *font_stack;\n    struct nk_config_stack_user_font_element *element;\n\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n\n    font_stack = &ctx->stacks.fonts;\n    NK_ASSERT(font_stack->head > 0);\n    if (font_stack->head < 1)\n        return 0;\n\n    element = &font_stack->elements[--font_stack->head];\n    *element->address = element->old_value;\n    return 1;\n}\n\n#define NK_STYLE_PUSH_IMPLEMENATION(prefix, type, stack) \\\nnk_style_push_##type(struct nk_context *ctx, prefix##_##type *address, prefix##_##type value)\\\n{\\\n    struct nk_config_stack_##type * type_stack;\\\n    struct nk_config_stack_##type##_element *element;\\\n    NK_ASSERT(ctx);\\\n    if (!ctx) return 0;\\\n    type_stack = &ctx->stacks.stack;\\\n    NK_ASSERT(type_stack->head < (int)NK_LEN(type_stack->elements));\\\n    if (type_stack->head >= (int)NK_LEN(type_stack->elements))\\\n        return 0;\\\n    element = &type_stack->elements[type_stack->head++];\\\n    element->address = address;\\\n    element->old_value = *address;\\\n    *address = value;\\\n    return 1;\\\n}\n\n#define NK_STYLE_POP_IMPLEMENATION(type, stack) \\\nnk_style_pop_##type(struct nk_context *ctx)\\\n{\\\n    struct nk_config_stack_##type *type_stack;\\\n    struct nk_config_stack_##type##_element *element;\\\n    NK_ASSERT(ctx);\\\n    if (!ctx) return 0;\\\n    type_stack = &ctx->stacks.stack;\\\n    NK_ASSERT(type_stack->head > 0);\\\n    if (type_stack->head < 1)\\\n        return 0;\\\n    element = &type_stack->elements[--type_stack->head];\\\n    *element->address = element->old_value;\\\n    return 1;\\\n}\n\nNK_API int NK_STYLE_PUSH_IMPLEMENATION(struct nk, style_item, style_items)\nNK_API int NK_STYLE_PUSH_IMPLEMENATION(nk,float, floats)\nNK_API int NK_STYLE_PUSH_IMPLEMENATION(struct nk, vec2, vectors)\nNK_API int NK_STYLE_PUSH_IMPLEMENATION(nk,flags, flags)\nNK_API int NK_STYLE_PUSH_IMPLEMENATION(struct nk,color, colors)\n\nNK_API int NK_STYLE_POP_IMPLEMENATION(style_item, style_items)\nNK_API int NK_STYLE_POP_IMPLEMENATION(float,floats)\nNK_API int NK_STYLE_POP_IMPLEMENATION(vec2, vectors)\nNK_API int NK_STYLE_POP_IMPLEMENATION(flags,flags)\nNK_API int NK_STYLE_POP_IMPLEMENATION(color,colors)\n\nNK_API int\nnk_style_set_cursor(struct nk_context *ctx, enum nk_style_cursor c)\n{\n    struct nk_style *style;\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n    style = &ctx->style;\n    if (style->cursors[c]) {\n        style->cursor_active = style->cursors[c];\n        return 1;\n    }\n    return 0;\n}\n\nNK_API void\nnk_style_show_cursor(struct nk_context *ctx)\n{\n    ctx->style.cursor_visible = nk_true;\n}\n\nNK_API void\nnk_style_hide_cursor(struct nk_context *ctx)\n{\n    ctx->style.cursor_visible = nk_false;\n}\n\nNK_API void\nnk_style_load_cursor(struct nk_context *ctx, enum nk_style_cursor cursor,\n    const struct nk_cursor *c)\n{\n    struct nk_style *style;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    style = &ctx->style;\n    style->cursors[cursor] = c;\n}\n\nNK_API void\nnk_style_load_all_cursors(struct nk_context *ctx, struct nk_cursor *cursors)\n{\n    int i = 0;\n    struct nk_style *style;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    style = &ctx->style;\n    for (i = 0; i < NK_CURSOR_COUNT; ++i)\n        style->cursors[i] = &cursors[i];\n    style->cursor_visible = nk_true;\n}\n\n/* ===============================================================\n *\n *                          POOL\n *\n * ===============================================================*/\nNK_INTERN void\nnk_pool_init(struct nk_pool *pool, struct nk_allocator *alloc,\n    unsigned int capacity)\n{\n    nk_zero(pool, sizeof(*pool));\n    pool->alloc = *alloc;\n    pool->capacity = capacity;\n    pool->type = NK_BUFFER_DYNAMIC;\n    pool->pages = 0;\n}\n\nNK_INTERN void\nnk_pool_free(struct nk_pool *pool)\n{\n    struct nk_page *iter = pool->pages;\n    if (!pool) return;\n    if (pool->type == NK_BUFFER_FIXED) return;\n    while (iter) {\n        struct nk_page *next = iter->next;\n        pool->alloc.free(pool->alloc.userdata, iter);\n        iter = next;\n    }\n}\n\nNK_INTERN void\nnk_pool_init_fixed(struct nk_pool *pool, void *memory, nk_size size)\n{\n    nk_zero(pool, sizeof(*pool));\n    NK_ASSERT(size >= sizeof(struct nk_page));\n    if (size < sizeof(struct nk_page)) return;\n    pool->capacity = (unsigned)(size - sizeof(struct nk_page)) / sizeof(struct nk_page_element);\n    pool->pages = (struct nk_page*)memory;\n    pool->type = NK_BUFFER_FIXED;\n    pool->size = size;\n}\n\nNK_INTERN struct nk_page_element*\nnk_pool_alloc(struct nk_pool *pool)\n{\n    if (!pool->pages || pool->pages->size >= pool->capacity) {\n        /* allocate new page */\n        struct nk_page *page;\n        if (pool->type == NK_BUFFER_FIXED) {\n            if (!pool->pages) {\n                NK_ASSERT(pool->pages);\n                return 0;\n            }\n            NK_ASSERT(pool->pages->size < pool->capacity);\n            return 0;\n        } else {\n            nk_size size = sizeof(struct nk_page);\n            size += NK_POOL_DEFAULT_CAPACITY * sizeof(union nk_page_data);\n            page = (struct nk_page*)pool->alloc.alloc(pool->alloc.userdata,0, size);\n            page->next = pool->pages;\n            pool->pages = page;\n            page->size = 0;\n        }\n    }\n    return &pool->pages->win[pool->pages->size++];\n}\n\n/* ===============================================================\n *\n *                          CONTEXT\n *\n * ===============================================================*/\nNK_INTERN void* nk_create_window(struct nk_context *ctx);\nNK_INTERN void nk_remove_window(struct nk_context*, struct nk_window*);\nNK_INTERN void nk_free_window(struct nk_context *ctx, struct nk_window *win);\nNK_INTERN void nk_free_table(struct nk_context *ctx, struct nk_table *tbl);\nNK_INTERN void nk_remove_table(struct nk_window *win, struct nk_table *tbl);\nNK_INTERN void* nk_create_panel(struct nk_context *ctx);\nNK_INTERN void nk_free_panel(struct nk_context*, struct nk_panel *pan);\n\nNK_INTERN void\nnk_setup(struct nk_context *ctx, const struct nk_user_font *font)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    nk_zero_struct(*ctx);\n    nk_style_default(ctx);\n    ctx->seq = 1;\n    if (font) ctx->style.font = font;\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n    nk_draw_list_init(&ctx->draw_list);\n#endif\n}\n\n#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR\nNK_API int\nnk_init_default(struct nk_context *ctx, const struct nk_user_font *font)\n{\n    struct nk_allocator alloc;\n    alloc.userdata.ptr = 0;\n    alloc.alloc = nk_malloc;\n    alloc.free = nk_mfree;\n    return nk_init(ctx, &alloc, font);\n}\n#endif\n\nNK_API int\nnk_init_fixed(struct nk_context *ctx, void *memory, nk_size size,\n    const struct nk_user_font *font)\n{\n    NK_ASSERT(memory);\n    if (!memory) return 0;\n    nk_setup(ctx, font);\n    nk_buffer_init_fixed(&ctx->memory, memory, size);\n    ctx->use_pool = nk_false;\n    return 1;\n}\n\nNK_API int\nnk_init_custom(struct nk_context *ctx, struct nk_buffer *cmds,\n    struct nk_buffer *pool, const struct nk_user_font *font)\n{\n    NK_ASSERT(cmds);\n    NK_ASSERT(pool);\n    if (!cmds || !pool) return 0;\n\n    nk_setup(ctx, font);\n    ctx->memory = *cmds;\n    if (pool->type == NK_BUFFER_FIXED) {\n        /* take memory from buffer and alloc fixed pool */\n        nk_pool_init_fixed(&ctx->pool, pool->memory.ptr, pool->memory.size);\n    } else {\n        /* create dynamic pool from buffer allocator */\n        struct nk_allocator *alloc = &pool->pool;\n        nk_pool_init(&ctx->pool, alloc, NK_POOL_DEFAULT_CAPACITY);\n    }\n    ctx->use_pool = nk_true;\n    return 1;\n}\n\nNK_API int\nnk_init(struct nk_context *ctx, struct nk_allocator *alloc,\n    const struct nk_user_font *font)\n{\n    NK_ASSERT(alloc);\n    if (!alloc) return 0;\n    nk_setup(ctx, font);\n    nk_buffer_init(&ctx->memory, alloc, NK_DEFAULT_COMMAND_BUFFER_SIZE);\n    nk_pool_init(&ctx->pool, alloc, NK_POOL_DEFAULT_CAPACITY);\n    ctx->use_pool = nk_true;\n    return 1;\n}\n\n#ifdef NK_INCLUDE_COMMAND_USERDATA\nNK_API void\nnk_set_user_data(struct nk_context *ctx, nk_handle handle)\n{\n    if (!ctx) return;\n    ctx->userdata = handle;\n    if (ctx->current)\n        ctx->current->buffer.userdata = handle;\n}\n#endif\n\nNK_API void\nnk_free(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    nk_buffer_free(&ctx->memory);\n    if (ctx->use_pool)\n        nk_pool_free(&ctx->pool);\n\n    nk_zero(&ctx->input, sizeof(ctx->input));\n    nk_zero(&ctx->style, sizeof(ctx->style));\n    nk_zero(&ctx->memory, sizeof(ctx->memory));\n\n    ctx->seq = 0;\n    ctx->build = 0;\n    ctx->begin = 0;\n    ctx->end = 0;\n    ctx->active = 0;\n    ctx->current = 0;\n    ctx->freelist = 0;\n    ctx->count = 0;\n}\n\nNK_API void\nnk_clear(struct nk_context *ctx)\n{\n    struct nk_window *iter;\n    struct nk_window *next;\n    NK_ASSERT(ctx);\n\n    if (!ctx) return;\n    if (ctx->use_pool)\n        nk_buffer_clear(&ctx->memory);\n    else nk_buffer_reset(&ctx->memory, NK_BUFFER_FRONT);\n\n    ctx->build = 0;\n    ctx->memory.calls = 0;\n    ctx->last_widget_state = 0;\n    ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_ARROW];\n    NK_MEMSET(&ctx->overlay, 0, sizeof(ctx->overlay));\n#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n    nk_draw_list_clear(&ctx->draw_list);\n#endif\n\n    /* garbage collector */\n    iter = ctx->begin;\n    while (iter) {\n        /* make sure minimized windows do not get removed */\n        if ((iter->flags & NK_WINDOW_MINIMIZED) &&\n            !(iter->flags & NK_WINDOW_CLOSED)) {\n            iter = iter->next;\n            continue;\n        }\n        /* remove hotness from hidden or closed windows*/\n        if (((iter->flags & NK_WINDOW_HIDDEN) ||\n            (iter->flags & NK_WINDOW_CLOSED)) &&\n            iter == ctx->active)\n            ctx->active = iter->next;\n\n        /* free unused popup windows */\n        if (iter->popup.win && iter->popup.win->seq != ctx->seq) {\n            nk_free_window(ctx, iter->popup.win);\n            iter->popup.win = 0;\n        }\n        /* remove unused window state tables */\n        {struct nk_table *n, *it = iter->tables;\n        while (it) {\n            n = it->next;\n            if (it->seq != ctx->seq) {\n                nk_remove_table(iter, it);\n                nk_zero(it, sizeof(union nk_page_data));\n                nk_free_table(ctx, it);\n                if (it == iter->tables)\n                    iter->tables = n;\n            }\n            it = n;\n        }}\n        /* window itself is not used anymore so free */\n        if (iter->seq != ctx->seq || iter->flags & NK_WINDOW_CLOSED) {\n            next = iter->next;\n            nk_remove_window(ctx, iter);\n            nk_free_window(ctx, iter);\n            iter = next;\n        } else iter = iter->next;\n    }\n    ctx->seq++;\n}\n\n/* ----------------------------------------------------------------\n *\n *                          BUFFERING\n *\n * ---------------------------------------------------------------*/\nNK_INTERN void\nnk_start_buffer(struct nk_context *ctx, struct nk_command_buffer *buffer)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(buffer);\n    if (!ctx || !buffer) return;\n    buffer->begin = ctx->memory.allocated;\n    buffer->end = buffer->begin;\n    buffer->last = buffer->begin;\n    buffer->clip = nk_null_rect;\n}\n\nNK_INTERN void\nnk_start(struct nk_context *ctx, struct nk_window *win)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(win);\n    nk_start_buffer(ctx, &win->buffer);\n}\n\nNK_INTERN void\nnk_start_popup(struct nk_context *ctx, struct nk_window *win)\n{\n    struct nk_popup_buffer *buf;\n    NK_ASSERT(ctx);\n    NK_ASSERT(win);\n    if (!ctx || !win) return;\n\n    /* save buffer fill state for popup */\n    buf = &win->popup.buf;\n    buf->begin = win->buffer.end;\n    buf->end = win->buffer.end;\n    buf->parent = win->buffer.last;\n    buf->last = buf->begin;\n    buf->active = nk_true;\n}\n\nNK_INTERN void\nnk_finish_popup(struct nk_context *ctx, struct nk_window *win)\n{\n    struct nk_popup_buffer *buf;\n    NK_ASSERT(ctx);\n    NK_ASSERT(win);\n    if (!ctx || !win) return;\n\n    buf = &win->popup.buf;\n    buf->last = win->buffer.last;\n    buf->end = win->buffer.end;\n}\n\nNK_INTERN void\nnk_finish_buffer(struct nk_context *ctx, struct nk_command_buffer *buffer)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(buffer);\n    if (!ctx || !buffer) return;\n    buffer->end = ctx->memory.allocated;\n}\n\nNK_INTERN void\nnk_finish(struct nk_context *ctx, struct nk_window *win)\n{\n    struct nk_popup_buffer *buf;\n    struct nk_command *parent_last;\n    void *memory;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(win);\n    if (!ctx || !win) return;\n    nk_finish_buffer(ctx, &win->buffer);\n    if (!win->popup.buf.active) return;\n\n    buf = &win->popup.buf;\n    memory = ctx->memory.memory.ptr;\n    parent_last = nk_ptr_add(struct nk_command, memory, buf->parent);\n    parent_last->next = buf->end;\n}\n\nNK_INTERN void\nnk_build(struct nk_context *ctx)\n{\n    struct nk_window *iter = 0;\n    struct nk_command *cmd = 0;\n    nk_byte *buffer = 0;\n\n    /* draw cursor overlay */\n    if (!ctx->style.cursor_active)\n        ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_ARROW];\n    if (ctx->style.cursor_active && !ctx->input.mouse.grabbed && ctx->style.cursor_visible) {\n        struct nk_rect mouse_bounds;\n        const struct nk_cursor *cursor = ctx->style.cursor_active;\n        nk_command_buffer_init(&ctx->overlay, &ctx->memory, NK_CLIPPING_OFF);\n        nk_start_buffer(ctx, &ctx->overlay);\n\n        mouse_bounds.x = ctx->input.mouse.pos.x - cursor->offset.x;\n        mouse_bounds.y = ctx->input.mouse.pos.y - cursor->offset.y;\n        mouse_bounds.w = cursor->size.x;\n        mouse_bounds.h = cursor->size.y;\n\n        nk_draw_image(&ctx->overlay, mouse_bounds, &cursor->img, nk_white);\n        nk_finish_buffer(ctx, &ctx->overlay);\n    }\n    /* build one big draw command list out of all window buffers */\n    iter = ctx->begin;\n    buffer = (nk_byte*)ctx->memory.memory.ptr;\n    while (iter != 0) {\n        struct nk_window *next = iter->next;\n        if (iter->buffer.last == iter->buffer.begin || (iter->flags & NK_WINDOW_HIDDEN)||\n            iter->seq != ctx->seq)\n            goto cont;\n\n        cmd = nk_ptr_add(struct nk_command, buffer, iter->buffer.last);\n        while (next && ((next->buffer.last == next->buffer.begin) ||\n            (next->flags & NK_WINDOW_HIDDEN)))\n            next = next->next; /* skip empty command buffers */\n\n        if (next) cmd->next = next->buffer.begin;\n        cont: iter = next;\n    }\n    /* append all popup draw commands into lists */\n    iter = ctx->begin;\n    while (iter != 0) {\n        struct nk_window *next = iter->next;\n        struct nk_popup_buffer *buf;\n        if (!iter->popup.buf.active)\n            goto skip;\n\n        buf = &iter->popup.buf;\n        cmd->next = buf->begin;\n        cmd = nk_ptr_add(struct nk_command, buffer, buf->last);\n        buf->active = nk_false;\n        skip: iter = next;\n    }\n    /* append overlay commands */\n    if (cmd) {\n        if (ctx->overlay.end != ctx->overlay.begin)\n            cmd->next = ctx->overlay.begin;\n        else cmd->next = ctx->memory.allocated;\n    }\n}\n\nNK_API const struct nk_command*\nnk__begin(struct nk_context *ctx)\n{\n    struct nk_window *iter;\n    nk_byte *buffer;\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n    if (!ctx->count) return 0;\n\n    buffer = (nk_byte*)ctx->memory.memory.ptr;\n    if (!ctx->build) {\n        nk_build(ctx);\n        ctx->build = nk_true;\n    }\n    iter = ctx->begin;\n    while (iter && ((iter->buffer.begin == iter->buffer.end) || (iter->flags & NK_WINDOW_HIDDEN)))\n        iter = iter->next;\n    if (!iter) return 0;\n    return nk_ptr_add_const(struct nk_command, buffer, iter->buffer.begin);\n}\n\nNK_API const struct nk_command*\nnk__next(struct nk_context *ctx, const struct nk_command *cmd)\n{\n    nk_byte *buffer;\n    const struct nk_command *next;\n    NK_ASSERT(ctx);\n    if (!ctx || !cmd || !ctx->count) return 0;\n    if (cmd->next >= ctx->memory.allocated) return 0;\n    buffer = (nk_byte*)ctx->memory.memory.ptr;\n    next = nk_ptr_add_const(struct nk_command, buffer, cmd->next);\n    return next;\n}\n\n/* ----------------------------------------------------------------\n *\n *                          PANEL\n *\n * ---------------------------------------------------------------*/\nstatic int\nnk_panel_has_header(nk_flags flags, const char *title)\n{\n    int active = 0;\n    active = (flags & (NK_WINDOW_CLOSABLE|NK_WINDOW_MINIMIZABLE));\n    active = active || (flags & NK_WINDOW_TITLE);\n    active = active && !(flags & NK_WINDOW_HIDDEN) && title;\n    return active;\n}\n\nNK_INTERN struct nk_vec2\nnk_panel_get_padding(const struct nk_style *style, enum nk_panel_type type)\n{\n    switch (type) {\n    default:\n    case NK_PANEL_WINDOW: return style->window.padding;\n    case NK_PANEL_GROUP: return style->window.group_padding;\n    case NK_PANEL_POPUP: return style->window.popup_padding;\n    case NK_PANEL_CONTEXTUAL: return style->window.contextual_padding;\n    case NK_PANEL_COMBO: return style->window.combo_padding;\n    case NK_PANEL_MENU: return style->window.menu_padding;\n    case NK_PANEL_TOOLTIP: return style->window.menu_padding;\n    }\n}\n\nNK_INTERN float\nnk_panel_get_border(const struct nk_style *style, nk_flags flags,\n    enum nk_panel_type type)\n{\n    if (flags & NK_WINDOW_BORDER) {\n        switch (type) {\n        default:\n        case NK_PANEL_WINDOW: return style->window.border;\n        case NK_PANEL_GROUP: return style->window.group_border;\n        case NK_PANEL_POPUP: return style->window.popup_border;\n        case NK_PANEL_CONTEXTUAL: return style->window.contextual_border;\n        case NK_PANEL_COMBO: return style->window.combo_border;\n        case NK_PANEL_MENU: return style->window.menu_border;\n        case NK_PANEL_TOOLTIP: return style->window.menu_border;\n    }} else return 0;\n}\n\nNK_INTERN struct nk_color\nnk_panel_get_border_color(const struct nk_style *style, enum nk_panel_type type)\n{\n    switch (type) {\n    default:\n    case NK_PANEL_WINDOW: return style->window.border_color;\n    case NK_PANEL_GROUP: return style->window.group_border_color;\n    case NK_PANEL_POPUP: return style->window.popup_border_color;\n    case NK_PANEL_CONTEXTUAL: return style->window.contextual_border_color;\n    case NK_PANEL_COMBO: return style->window.combo_border_color;\n    case NK_PANEL_MENU: return style->window.menu_border_color;\n    case NK_PANEL_TOOLTIP: return style->window.menu_border_color;\n    }\n}\n\nNK_INTERN int\nnk_panel_is_sub(enum nk_panel_type type)\n{\n    return (type & NK_PANEL_SET_SUB)?1:0;\n}\n\nNK_INTERN int\nnk_panel_is_nonblock(enum nk_panel_type type)\n{\n    return (type & NK_PANEL_SET_NONBLOCK)?1:0;\n}\n\nNK_INTERN int\nnk_panel_begin(struct nk_context *ctx, const char *title, enum nk_panel_type panel_type)\n{\n    struct nk_input *in;\n    struct nk_window *win;\n    struct nk_panel *layout;\n    struct nk_command_buffer *out;\n    const struct nk_style *style;\n    const struct nk_user_font *font;\n\n    struct nk_vec2 scrollbar_size;\n    struct nk_vec2 panel_padding;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout) return 0;\n    nk_zero(ctx->current->layout, sizeof(*ctx->current->layout));\n    if ((ctx->current->flags & NK_WINDOW_HIDDEN) || (ctx->current->flags & NK_WINDOW_CLOSED)) {\n        nk_zero(ctx->current->layout, sizeof(struct nk_panel));\n        ctx->current->layout->type = panel_type;\n        return 0;\n    }\n    /* pull state into local stack */\n    style = &ctx->style;\n    font = style->font;\n    win = ctx->current;\n    layout = win->layout;\n    out = &win->buffer;\n    in = (win->flags & NK_WINDOW_NO_INPUT) ? 0: &ctx->input;\n#ifdef NK_INCLUDE_COMMAND_USERDATA\n    win->buffer.userdata = ctx->userdata;\n#endif\n    /* pull style configuration into local stack */\n    scrollbar_size = style->window.scrollbar_size;\n    panel_padding = nk_panel_get_padding(style, panel_type);\n\n    /* window movement */\n    if ((win->flags & NK_WINDOW_MOVABLE) && !(win->flags & NK_WINDOW_ROM)) {\n        int left_mouse_down;\n        int left_mouse_click_in_cursor;\n\n        /* calculate draggable window space */\n        struct nk_rect header;\n        header.x = win->bounds.x;\n        header.y = win->bounds.y;\n        header.w = win->bounds.w;\n        if (nk_panel_has_header(win->flags, title)) {\n            header.h = font->height + 2.0f * style->window.header.padding.y;\n            header.h += 2.0f * style->window.header.label_padding.y;\n        } else header.h = panel_padding.y;\n\n        /* window movement by dragging */\n        left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;\n        left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,\n            NK_BUTTON_LEFT, header, nk_true);\n        if (left_mouse_down && left_mouse_click_in_cursor) {\n            win->bounds.x = win->bounds.x + in->mouse.delta.x;\n            win->bounds.y = win->bounds.y + in->mouse.delta.y;\n            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x += in->mouse.delta.x;\n            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y += in->mouse.delta.y;\n            ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_MOVE];\n        }\n    }\n\n    /* setup panel */\n    layout->type = panel_type;\n    layout->flags = win->flags;\n    layout->bounds = win->bounds;\n    layout->bounds.x += panel_padding.x;\n    layout->bounds.w -= 2*panel_padding.x;\n    if (win->flags & NK_WINDOW_BORDER) {\n        layout->border = nk_panel_get_border(style, win->flags, panel_type);\n        layout->bounds = nk_shrink_rect(layout->bounds, layout->border);\n    } else layout->border = 0;\n    layout->at_y = layout->bounds.y;\n    layout->at_x = layout->bounds.x;\n    layout->max_x = 0;\n    layout->header_height = 0;\n    layout->footer_height = 0;\n    nk_layout_reset_min_row_height(ctx);\n    layout->row.index = 0;\n    layout->row.columns = 0;\n    layout->row.ratio = 0;\n    layout->row.item_width = 0;\n    layout->row.tree_depth = 0;\n    layout->row.height = panel_padding.y;\n    layout->has_scrolling = nk_true;\n    if (!(win->flags & NK_WINDOW_NO_SCROLLBAR))\n        layout->bounds.w -= scrollbar_size.x;\n    if (!nk_panel_is_nonblock(panel_type)) {\n        layout->footer_height = 0;\n        if (!(win->flags & NK_WINDOW_NO_SCROLLBAR) || win->flags & NK_WINDOW_SCALABLE)\n            layout->footer_height = scrollbar_size.y;\n        layout->bounds.h -= layout->footer_height;\n    }\n\n    /* panel header */\n    if (nk_panel_has_header(win->flags, title))\n    {\n        struct nk_text text;\n        struct nk_rect header;\n        const struct nk_style_item *background = 0;\n\n        /* calculate header bounds */\n        header.x = win->bounds.x;\n        header.y = win->bounds.y;\n        header.w = win->bounds.w;\n        header.h = font->height + 2.0f * style->window.header.padding.y;\n        header.h += (2.0f * style->window.header.label_padding.y);\n\n        /* shrink panel by header */\n        layout->header_height = header.h;\n        layout->bounds.y += header.h;\n        layout->bounds.h -= header.h;\n        layout->at_y += header.h;\n\n        /* select correct header background and text color */\n        if (ctx->active == win) {\n            background = &style->window.header.active;\n            text.text = style->window.header.label_active;\n        } else if (nk_input_is_mouse_hovering_rect(&ctx->input, header)) {\n            background = &style->window.header.hover;\n            text.text = style->window.header.label_hover;\n        } else {\n            background = &style->window.header.normal;\n            text.text = style->window.header.label_normal;\n        }\n\n        /* draw header background */\n        header.h += 1.0f;\n        if (background->type == NK_STYLE_ITEM_IMAGE) {\n            text.background = nk_rgba(0,0,0,0);\n            nk_draw_image(&win->buffer, header, &background->data.image, nk_white);\n        } else {\n            text.background = background->data.color;\n            nk_fill_rect(out, header, 0, background->data.color);\n        }\n\n        /* window close button */\n        {struct nk_rect button;\n        button.y = header.y + style->window.header.padding.y;\n        button.h = header.h - 2 * style->window.header.padding.y;\n        button.w = button.h;\n        if (win->flags & NK_WINDOW_CLOSABLE) {\n            nk_flags ws = 0;\n            if (style->window.header.align == NK_HEADER_RIGHT) {\n                button.x = (header.w + header.x) - (button.w + style->window.header.padding.x);\n                header.w -= button.w + style->window.header.spacing.x + style->window.header.padding.x;\n            } else {\n                button.x = header.x + style->window.header.padding.x;\n                header.x += button.w + style->window.header.spacing.x + style->window.header.padding.x;\n            }\n\n            if (nk_do_button_symbol(&ws, &win->buffer, button,\n                style->window.header.close_symbol, NK_BUTTON_DEFAULT,\n                &style->window.header.close_button, in, style->font) && !(win->flags & NK_WINDOW_ROM))\n            {\n                layout->flags |= NK_WINDOW_HIDDEN;\n                layout->flags &= (nk_flags)~NK_WINDOW_MINIMIZED;\n            }\n        }\n\n        /* window minimize button */\n        if (win->flags & NK_WINDOW_MINIMIZABLE) {\n            nk_flags ws = 0;\n            if (style->window.header.align == NK_HEADER_RIGHT) {\n                button.x = (header.w + header.x) - button.w;\n                if (!(win->flags & NK_WINDOW_CLOSABLE)) {\n                    button.x -= style->window.header.padding.x;\n                    header.w -= style->window.header.padding.x;\n                }\n                header.w -= button.w + style->window.header.spacing.x;\n            } else {\n                button.x = header.x;\n                header.x += button.w + style->window.header.spacing.x + style->window.header.padding.x;\n            }\n            if (nk_do_button_symbol(&ws, &win->buffer, button, (layout->flags & NK_WINDOW_MINIMIZED)?\n                style->window.header.maximize_symbol: style->window.header.minimize_symbol,\n                NK_BUTTON_DEFAULT, &style->window.header.minimize_button, in, style->font) && !(win->flags & NK_WINDOW_ROM))\n                layout->flags = (layout->flags & NK_WINDOW_MINIMIZED) ?\n                    layout->flags & (nk_flags)~NK_WINDOW_MINIMIZED:\n                    layout->flags | NK_WINDOW_MINIMIZED;\n        }}\n\n        {/* window header title */\n        int text_len = nk_strlen(title);\n        struct nk_rect label = {0,0,0,0};\n        float t = font->width(font->userdata, font->height, title, text_len);\n        text.padding = nk_vec2(0,0);\n\n        label.x = header.x + style->window.header.padding.x;\n        label.x += style->window.header.label_padding.x;\n        label.y = header.y + style->window.header.label_padding.y;\n        label.h = font->height + 2 * style->window.header.label_padding.y;\n        label.w = t + 2 * style->window.header.spacing.x;\n        label.w = NK_CLAMP(0, label.w, header.x + header.w - label.x);\n        nk_widget_text(out, label,(const char*)title, text_len, &text, NK_TEXT_LEFT, font);}\n    }\n\n    /* draw window background */\n    if (!(layout->flags & NK_WINDOW_MINIMIZED) && !(layout->flags & NK_WINDOW_DYNAMIC)) {\n        struct nk_rect body;\n        body.x = win->bounds.x;\n        body.w = win->bounds.w;\n        body.y = (win->bounds.y + layout->header_height);\n        body.h = (win->bounds.h - layout->header_height);\n        if (style->window.fixed_background.type == NK_STYLE_ITEM_IMAGE)\n            nk_draw_image(out, body, &style->window.fixed_background.data.image, nk_white);\n        else nk_fill_rect(out, body, 0, style->window.fixed_background.data.color);\n    }\n\n    /* set clipping rectangle */\n    {struct nk_rect clip;\n    layout->clip = layout->bounds;\n    nk_unify(&clip, &win->buffer.clip, layout->clip.x, layout->clip.y,\n        layout->clip.x + layout->clip.w, layout->clip.y + layout->clip.h);\n    nk_push_scissor(out, clip);\n    layout->clip = clip;}\n    return !(layout->flags & NK_WINDOW_HIDDEN) && !(layout->flags & NK_WINDOW_MINIMIZED);\n}\n\nNK_INTERN void\nnk_panel_end(struct nk_context *ctx)\n{\n    struct nk_input *in;\n    struct nk_window *window;\n    struct nk_panel *layout;\n    const struct nk_style *style;\n    struct nk_command_buffer *out;\n\n    struct nk_vec2 scrollbar_size;\n    struct nk_vec2 panel_padding;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    window = ctx->current;\n    layout = window->layout;\n    style = &ctx->style;\n    out = &window->buffer;\n    in = (layout->flags & NK_WINDOW_ROM || layout->flags & NK_WINDOW_NO_INPUT) ? 0 :&ctx->input;\n    if (!nk_panel_is_sub(layout->type))\n        nk_push_scissor(out, nk_null_rect);\n\n    /* cache configuration data */\n    scrollbar_size = style->window.scrollbar_size;\n    panel_padding = nk_panel_get_padding(style, layout->type);\n\n    /* update the current cursor Y-position to point over the last added widget */\n    layout->at_y += layout->row.height;\n\n    /* dynamic panels */\n    if (layout->flags & NK_WINDOW_DYNAMIC && !(layout->flags & NK_WINDOW_MINIMIZED))\n    {\n        /* update panel height to fit dynamic growth */\n        struct nk_rect empty_space;\n        if (layout->at_y < (layout->bounds.y + layout->bounds.h))\n            layout->bounds.h = layout->at_y - layout->bounds.y;\n\n        /* fill top empty space */\n        empty_space.x = window->bounds.x;\n        empty_space.y = layout->bounds.y;\n        empty_space.h = panel_padding.y;\n        empty_space.w = window->bounds.w;\n        nk_fill_rect(out, empty_space, 0, style->window.background);\n\n        /* fill left empty space */\n        empty_space.x = window->bounds.x;\n        empty_space.y = layout->bounds.y;\n        empty_space.w = panel_padding.x + layout->border;\n        empty_space.h = layout->bounds.h;\n        nk_fill_rect(out, empty_space, 0, style->window.background);\n\n        /* fill right empty space */\n        empty_space.x = layout->bounds.x + layout->bounds.w - layout->border;\n        empty_space.y = layout->bounds.y;\n        empty_space.w = panel_padding.x + layout->border;\n        empty_space.h = layout->bounds.h;\n        if (*layout->offset_y == 0 && !(layout->flags & NK_WINDOW_NO_SCROLLBAR))\n            empty_space.w += scrollbar_size.x;\n        nk_fill_rect(out, empty_space, 0, style->window.background);\n\n        /* fill bottom empty space */\n        if (*layout->offset_x != 0 && !(layout->flags & NK_WINDOW_NO_SCROLLBAR)) {\n            empty_space.x = window->bounds.x;\n            empty_space.y = layout->bounds.y + layout->bounds.h;\n            empty_space.w = window->bounds.w;\n            empty_space.h = scrollbar_size.y;\n            nk_fill_rect(out, empty_space, 0, style->window.background);\n        }\n    }\n\n    /* scrollbars */\n    if (!(layout->flags & NK_WINDOW_NO_SCROLLBAR) &&\n        !(layout->flags & NK_WINDOW_MINIMIZED) &&\n        window->scrollbar_hiding_timer < NK_SCROLLBAR_HIDING_TIMEOUT)\n    {\n        struct nk_rect scroll;\n        int scroll_has_scrolling;\n        float scroll_target;\n        float scroll_offset;\n        float scroll_step;\n        float scroll_inc;\n\n        /* mouse wheel scrolling */\n        if (nk_panel_is_sub(layout->type))\n        {\n            /* sub-window mouse wheel scrolling */\n            struct nk_window *root_window = window;\n            struct nk_panel *root_panel = window->layout;\n            while (root_panel->parent)\n                root_panel = root_panel->parent;\n            while (root_window->parent)\n                root_window = root_window->parent;\n\n            /* only allow scrolling if parent window is active */\n            scroll_has_scrolling = 0;\n            if ((root_window == ctx->active) && layout->has_scrolling) {\n                /* and panel is being hovered and inside clip rect*/\n                if (nk_input_is_mouse_hovering_rect(in, layout->bounds) &&\n                    NK_INTERSECT(layout->bounds.x, layout->bounds.y, layout->bounds.w, layout->bounds.h,\n                        root_panel->clip.x, root_panel->clip.y, root_panel->clip.w, root_panel->clip.h))\n                {\n                    /* deactivate all parent scrolling */\n                    root_panel = window->layout;\n                    while (root_panel->parent) {\n                        root_panel->has_scrolling = nk_false;\n                        root_panel = root_panel->parent;\n                    }\n                    root_panel->has_scrolling = nk_false;\n                    scroll_has_scrolling = nk_true;\n                }\n            }\n        } else if (!nk_panel_is_sub(layout->type)) {\n            /* window mouse wheel scrolling */\n            scroll_has_scrolling = (window == ctx->active) && layout->has_scrolling;\n            if (in && (in->mouse.scroll_delta.y > 0 || in->mouse.scroll_delta.x > 0) && scroll_has_scrolling)\n                window->scrolled = nk_true;\n            else window->scrolled = nk_false;\n        } else scroll_has_scrolling = nk_false;\n\n        {\n            /* vertical scrollbar */\n            nk_flags state = 0;\n            scroll.x = layout->bounds.x + layout->bounds.w + panel_padding.x;\n            scroll.y = layout->bounds.y;\n            scroll.w = scrollbar_size.x;\n            scroll.h = layout->bounds.h;\n\n            scroll_offset = (float)*layout->offset_y;\n            scroll_step = scroll.h * 0.10f;\n            scroll_inc = scroll.h * 0.01f;\n            scroll_target = (float)(int)(layout->at_y - scroll.y);\n            scroll_offset = nk_do_scrollbarv(&state, out, scroll, scroll_has_scrolling,\n                scroll_offset, scroll_target, scroll_step, scroll_inc,\n                &ctx->style.scrollv, in, style->font);\n            *layout->offset_y = (nk_uint)scroll_offset;\n            if (in && scroll_has_scrolling)\n                in->mouse.scroll_delta.y = 0;\n        }\n        {\n            /* horizontal scrollbar */\n            nk_flags state = 0;\n            scroll.x = layout->bounds.x;\n            scroll.y = layout->bounds.y + layout->bounds.h;\n            scroll.w = layout->bounds.w;\n            scroll.h = scrollbar_size.y;\n\n            scroll_offset = (float)*layout->offset_x;\n            scroll_target = (float)(int)(layout->max_x - scroll.x);\n            scroll_step = layout->max_x * 0.05f;\n            scroll_inc = layout->max_x * 0.005f;\n            scroll_offset = nk_do_scrollbarh(&state, out, scroll, scroll_has_scrolling,\n                scroll_offset, scroll_target, scroll_step, scroll_inc,\n                &ctx->style.scrollh, in, style->font);\n            *layout->offset_x = (nk_uint)scroll_offset;\n        }\n    }\n\n    /* hide scroll if no user input */\n    if (window->flags & NK_WINDOW_SCROLL_AUTO_HIDE) {\n        int has_input = ctx->input.mouse.delta.x != 0 || ctx->input.mouse.delta.y != 0 || ctx->input.mouse.scroll_delta.y != 0;\n        int is_window_hovered = nk_window_is_hovered(ctx);\n        int any_item_active = (ctx->last_widget_state & NK_WIDGET_STATE_MODIFIED);\n        if ((!has_input && is_window_hovered) || (!is_window_hovered && !any_item_active))\n            window->scrollbar_hiding_timer += ctx->delta_time_seconds;\n        else window->scrollbar_hiding_timer = 0;\n    } else window->scrollbar_hiding_timer = 0;\n\n    /* window border */\n    if (layout->flags & NK_WINDOW_BORDER)\n    {\n        struct nk_color border_color = nk_panel_get_border_color(style, layout->type);\n        const float padding_y = (layout->flags & NK_WINDOW_MINIMIZED) ?\n            style->window.border + window->bounds.y + layout->header_height:\n            (layout->flags & NK_WINDOW_DYNAMIC)?\n            layout->bounds.y + layout->bounds.h + layout->footer_height:\n            window->bounds.y + window->bounds.h;\n\n        /* draw border top */\n        nk_stroke_line(out,window->bounds.x,window->bounds.y,\n            window->bounds.x + window->bounds.w, window->bounds.y,\n            layout->border, border_color);\n\n        /* draw bottom border */\n        nk_stroke_line(out, window->bounds.x, padding_y,\n            window->bounds.x + window->bounds.w, padding_y, layout->border, border_color);\n\n        /* draw left border */\n        nk_stroke_line(out, window->bounds.x + layout->border*0.5f,\n            window->bounds.y, window->bounds.x + layout->border*0.5f,\n            padding_y, layout->border, border_color);\n\n        /* draw right border */\n        nk_stroke_line(out, window->bounds.x + window->bounds.w - layout->border*0.5f,\n            window->bounds.y, window->bounds.x + window->bounds.w - layout->border*0.5f,\n            padding_y, layout->border, border_color);\n    }\n\n    /* scaler */\n    if ((layout->flags & NK_WINDOW_SCALABLE) && in && !(layout->flags & NK_WINDOW_MINIMIZED))\n    {\n        /* calculate scaler bounds */\n        struct nk_rect scaler;\n        scaler.w = scrollbar_size.x;\n        scaler.h = scrollbar_size.y;\n        scaler.y = layout->bounds.y + layout->bounds.h;\n        if (layout->flags & NK_WINDOW_SCALE_LEFT)\n            scaler.x = layout->bounds.x - panel_padding.x * 0.5f;\n        else scaler.x = layout->bounds.x + layout->bounds.w + panel_padding.x;\n        if (layout->flags & NK_WINDOW_NO_SCROLLBAR)\n            scaler.x -= scaler.w;\n\n        /* draw scaler */\n        {const struct nk_style_item *item = &style->window.scaler;\n        if (item->type == NK_STYLE_ITEM_IMAGE)\n            nk_draw_image(out, scaler, &item->data.image, nk_white);\n        else {\n            if (layout->flags & NK_WINDOW_SCALE_LEFT) {\n                nk_fill_triangle(out, scaler.x, scaler.y, scaler.x,\n                    scaler.y + scaler.h, scaler.x + scaler.w,\n                    scaler.y + scaler.h, item->data.color);\n            } else {\n                nk_fill_triangle(out, scaler.x + scaler.w, scaler.y, scaler.x + scaler.w,\n                    scaler.y + scaler.h, scaler.x, scaler.y + scaler.h, item->data.color);\n            }\n        }}\n\n        /* do window scaling */\n        if (!(window->flags & NK_WINDOW_ROM)) {\n            struct nk_vec2 window_size = style->window.min_size;\n            int left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;\n            int left_mouse_click_in_scaler = nk_input_has_mouse_click_down_in_rect(in,\n                    NK_BUTTON_LEFT, scaler, nk_true);\n\n            if (left_mouse_down && left_mouse_click_in_scaler) {\n                float delta_x = in->mouse.delta.x;\n                if (layout->flags & NK_WINDOW_SCALE_LEFT) {\n                    delta_x = -delta_x;\n                    window->bounds.x += in->mouse.delta.x;\n                }\n                /* dragging in x-direction  */\n                if (window->bounds.w + delta_x >= window_size.x) {\n                    if ((delta_x < 0) || (delta_x > 0 && in->mouse.pos.x >= scaler.x)) {\n                        window->bounds.w = window->bounds.w + delta_x;\n                        scaler.x += in->mouse.delta.x;\n                    }\n                }\n                /* dragging in y-direction (only possible if static window) */\n                if (!(layout->flags & NK_WINDOW_DYNAMIC)) {\n                    if (window_size.y < window->bounds.h + in->mouse.delta.y) {\n                        if ((in->mouse.delta.y < 0) || (in->mouse.delta.y > 0 && in->mouse.pos.y >= scaler.y)) {\n                            window->bounds.h = window->bounds.h + in->mouse.delta.y;\n                            scaler.y += in->mouse.delta.y;\n                        }\n                    }\n                }\n                ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT];\n                in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = scaler.x + scaler.w/2.0f;\n                in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y = scaler.y + scaler.h/2.0f;\n            }\n        }\n    }\n    if (!nk_panel_is_sub(layout->type)) {\n        /* window is hidden so clear command buffer  */\n        if (layout->flags & NK_WINDOW_HIDDEN)\n            nk_command_buffer_reset(&window->buffer);\n        /* window is visible and not tab */\n        else nk_finish(ctx, window);\n    }\n\n    /* NK_WINDOW_REMOVE_ROM flag was set so remove NK_WINDOW_ROM */\n    if (layout->flags & NK_WINDOW_REMOVE_ROM) {\n        layout->flags &= ~(nk_flags)NK_WINDOW_ROM;\n        layout->flags &= ~(nk_flags)NK_WINDOW_REMOVE_ROM;\n    }\n    window->flags = layout->flags;\n\n    /* property garbage collector */\n    if (window->property.active && window->property.old != window->property.seq &&\n        window->property.active == window->property.prev) {\n        nk_zero(&window->property, sizeof(window->property));\n    } else {\n        window->property.old = window->property.seq;\n        window->property.prev = window->property.active;\n        window->property.seq = 0;\n    }\n    /* edit garbage collector */\n    if (window->edit.active && window->edit.old != window->edit.seq &&\n       window->edit.active == window->edit.prev) {\n        nk_zero(&window->edit, sizeof(window->edit));\n    } else {\n        window->edit.old = window->edit.seq;\n        window->edit.prev = window->edit.active;\n        window->edit.seq = 0;\n    }\n    /* contextual garbage collector */\n    if (window->popup.active_con && window->popup.con_old != window->popup.con_count) {\n        window->popup.con_count = 0;\n        window->popup.con_old = 0;\n        window->popup.active_con = 0;\n    } else {\n        window->popup.con_old = window->popup.con_count;\n        window->popup.con_count = 0;\n    }\n    window->popup.combo_count = 0;\n    /* helper to make sure you have a 'nk_tree_push' for every 'nk_tree_pop' */\n    NK_ASSERT(!layout->row.tree_depth);\n}\n\n/* ----------------------------------------------------------------\n *\n *                          PAGE ELEMENT\n *\n * ---------------------------------------------------------------*/\nNK_INTERN struct nk_page_element*\nnk_create_page_element(struct nk_context *ctx)\n{\n    struct nk_page_element *elem;\n    if (ctx->freelist) {\n        /* unlink page element from free list */\n        elem = ctx->freelist;\n        ctx->freelist = elem->next;\n    } else if (ctx->use_pool) {\n        /* allocate page element from memory pool */\n        elem = nk_pool_alloc(&ctx->pool);\n        NK_ASSERT(elem);\n        if (!elem) return 0;\n    } else {\n        /* allocate new page element from back of fixed size memory buffer */\n        NK_STORAGE const nk_size size = sizeof(struct nk_page_element);\n        NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_page_element);\n        elem = (struct nk_page_element*)nk_buffer_alloc(&ctx->memory, NK_BUFFER_BACK, size, align);\n        NK_ASSERT(elem);\n        if (!elem) return 0;\n    }\n    nk_zero_struct(*elem);\n    elem->next = 0;\n    elem->prev = 0;\n    return elem;\n}\n\nNK_INTERN void\nnk_link_page_element_into_freelist(struct nk_context *ctx,\n    struct nk_page_element *elem)\n{\n    /* link table into freelist */\n    if (!ctx->freelist) {\n        ctx->freelist = elem;\n    } else {\n        elem->next = ctx->freelist;\n        ctx->freelist = elem;\n    }\n}\n\nNK_INTERN void\nnk_free_page_element(struct nk_context *ctx, struct nk_page_element *elem)\n{\n    /* we have a pool so just add to free list */\n    if (ctx->use_pool) {\n        nk_link_page_element_into_freelist(ctx, elem);\n        return;\n    }\n    /* if possible remove last element from back of fixed memory buffer */\n    {void *elem_end = (void*)(elem + 1);\n    void *buffer_end = (nk_byte*)ctx->memory.memory.ptr + ctx->memory.size;\n    if (elem_end == buffer_end)\n        ctx->memory.size -= sizeof(struct nk_page_element);\n    else nk_link_page_element_into_freelist(ctx, elem);}\n}\n\n/* ----------------------------------------------------------------\n *\n *                          PANEL\n *\n * ---------------------------------------------------------------*/\nNK_INTERN void*\nnk_create_panel(struct nk_context *ctx)\n{\n    struct nk_page_element *elem;\n    elem = nk_create_page_element(ctx);\n    if (!elem) return 0;\n    nk_zero_struct(*elem);\n    return &elem->data.pan;\n}\n\nNK_INTERN void\nnk_free_panel(struct nk_context *ctx, struct nk_panel *pan)\n{\n    union nk_page_data *pd = NK_CONTAINER_OF(pan, union nk_page_data, pan);\n    struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data);\n    nk_free_page_element(ctx, pe);\n}\n\n/* ----------------------------------------------------------------\n *\n *                          TABLES\n *\n * ---------------------------------------------------------------*/\nNK_INTERN struct nk_table*\nnk_create_table(struct nk_context *ctx)\n{\n    struct nk_page_element *elem;\n    elem = nk_create_page_element(ctx);\n    if (!elem) return 0;\n    nk_zero_struct(*elem);\n    return &elem->data.tbl;\n}\n\nNK_INTERN void\nnk_free_table(struct nk_context *ctx, struct nk_table *tbl)\n{\n    union nk_page_data *pd = NK_CONTAINER_OF(tbl, union nk_page_data, tbl);\n    struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data);\n    nk_free_page_element(ctx, pe);\n}\n\nNK_INTERN void\nnk_push_table(struct nk_window *win, struct nk_table *tbl)\n{\n    if (!win->tables) {\n        win->tables = tbl;\n        tbl->next = 0;\n        tbl->prev = 0;\n        tbl->size = 0;\n        win->table_count = 1;\n        return;\n    }\n    win->tables->prev = tbl;\n    tbl->next = win->tables;\n    tbl->prev = 0;\n    tbl->size = 0;\n    win->tables = tbl;\n    win->table_count++;\n}\n\nNK_INTERN void\nnk_remove_table(struct nk_window *win, struct nk_table *tbl)\n{\n    if (win->tables == tbl)\n        win->tables = tbl->next;\n    if (tbl->next)\n        tbl->next->prev = tbl->prev;\n    if (tbl->prev)\n        tbl->prev->next = tbl->next;\n    tbl->next = 0;\n    tbl->prev = 0;\n}\n\nNK_INTERN nk_uint*\nnk_add_value(struct nk_context *ctx, struct nk_window *win,\n            nk_hash name, nk_uint value)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(win);\n    if (!win || !ctx) return 0;\n    if (!win->tables || win->tables->size >= NK_VALUE_PAGE_CAPACITY) {\n        struct nk_table *tbl = nk_create_table(ctx);\n        NK_ASSERT(tbl);\n        if (!tbl) return 0;\n        nk_push_table(win, tbl);\n    }\n    win->tables->seq = win->seq;\n    win->tables->keys[win->tables->size] = name;\n    win->tables->values[win->tables->size] = value;\n    return &win->tables->values[win->tables->size++];\n}\n\nNK_INTERN nk_uint*\nnk_find_value(struct nk_window *win, nk_hash name)\n{\n    struct nk_table *iter = win->tables;\n    while (iter) {\n        unsigned int i = 0;\n        unsigned int size = iter->size;\n        for (i = 0; i < size; ++i) {\n            if (iter->keys[i] == name) {\n                iter->seq = win->seq;\n                return &iter->values[i];\n            }\n        } size = NK_VALUE_PAGE_CAPACITY;\n        iter = iter->next;\n    }\n    return 0;\n}\n\n/* ----------------------------------------------------------------\n *\n *                          WINDOW\n *\n * ---------------------------------------------------------------*/\nNK_INTERN void*\nnk_create_window(struct nk_context *ctx)\n{\n    struct nk_page_element *elem;\n    elem = nk_create_page_element(ctx);\n    if (!elem) return 0;\n    elem->data.win.seq = ctx->seq;\n    return &elem->data.win;\n}\n\nNK_INTERN void\nnk_free_window(struct nk_context *ctx, struct nk_window *win)\n{\n    /* unlink windows from list */\n    struct nk_table *it = win->tables;\n    if (win->popup.win) {\n        nk_free_window(ctx, win->popup.win);\n        win->popup.win = 0;\n    }\n    win->next = 0;\n    win->prev = 0;\n\n    while (it) {\n        /*free window state tables */\n        struct nk_table *n = it->next;\n        nk_remove_table(win, it);\n        nk_free_table(ctx, it);\n        if (it == win->tables)\n            win->tables = n;\n        it = n;\n    }\n\n    /* link windows into freelist */\n    {union nk_page_data *pd = NK_CONTAINER_OF(win, union nk_page_data, win);\n    struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data);\n    nk_free_page_element(ctx, pe);}\n}\n\nNK_INTERN struct nk_window*\nnk_find_window(struct nk_context *ctx, nk_hash hash, const char *name)\n{\n    struct nk_window *iter;\n    iter = ctx->begin;\n    while (iter) {\n        NK_ASSERT(iter != iter->next);\n        if (iter->name == hash) {\n            int max_len = nk_strlen(iter->name_string);\n            if (!nk_stricmpn(iter->name_string, name, max_len))\n                return iter;\n        }\n        iter = iter->next;\n    }\n    return 0;\n}\n\nenum nk_window_insert_location {\n    NK_INSERT_BACK, /* inserts window into the back of list (front of screen) */\n    NK_INSERT_FRONT /* inserts window into the front of list (back of screen) */\n};\nNK_INTERN void\nnk_insert_window(struct nk_context *ctx, struct nk_window *win,\n    enum nk_window_insert_location loc)\n{\n    const struct nk_window *iter;\n    NK_ASSERT(ctx);\n    NK_ASSERT(win);\n    if (!win || !ctx) return;\n\n    iter = ctx->begin;\n    while (iter) {\n        NK_ASSERT(iter != iter->next);\n        NK_ASSERT(iter != win);\n        if (iter == win) return;\n        iter = iter->next;\n    }\n\n    if (!ctx->begin) {\n        win->next = 0;\n        win->prev = 0;\n        ctx->begin = win;\n        ctx->end = win;\n        ctx->count = 1;\n        return;\n    }\n    if (loc == NK_INSERT_BACK) {\n        struct nk_window *end;\n        end = ctx->end;\n        end->flags |= NK_WINDOW_ROM;\n        end->next = win;\n        win->prev = ctx->end;\n        win->next = 0;\n        ctx->end = win;\n        ctx->active = ctx->end;\n        ctx->end->flags &= ~(nk_flags)NK_WINDOW_ROM;\n    } else {\n        ctx->end->flags |= NK_WINDOW_ROM;\n        ctx->begin->prev = win;\n        win->next = ctx->begin;\n        win->prev = 0;\n        ctx->begin = win;\n        ctx->begin->flags &= ~(nk_flags)NK_WINDOW_ROM;\n    }\n    ctx->count++;\n}\n\nNK_INTERN void\nnk_remove_window(struct nk_context *ctx, struct nk_window *win)\n{\n    if (win == ctx->begin || win == ctx->end) {\n        if (win == ctx->begin) {\n            ctx->begin = win->next;\n            if (win->next)\n                win->next->prev = 0;\n        }\n        if (win == ctx->end) {\n            ctx->end = win->prev;\n            if (win->prev)\n                win->prev->next = 0;\n        }\n    } else {\n        if (win->next)\n            win->next->prev = win->prev;\n        if (win->prev)\n            win->prev->next = win->next;\n    }\n    if (win == ctx->active || !ctx->active) {\n        ctx->active = ctx->end;\n        if (ctx->end)\n            ctx->end->flags &= ~(nk_flags)NK_WINDOW_ROM;\n    }\n    win->next = 0;\n    win->prev = 0;\n    ctx->count--;\n}\n\nNK_API int\nnk_begin(struct nk_context *ctx, const char *title,\n    struct nk_rect bounds, nk_flags flags)\n{\n    return nk_begin_titled(ctx, title, title, bounds, flags);\n}\n\nNK_API int\nnk_begin_titled(struct nk_context *ctx, const char *name, const char *title,\n    struct nk_rect bounds, nk_flags flags)\n{\n    struct nk_window *win;\n    struct nk_style *style;\n    nk_hash title_hash;\n    int title_len;\n    int ret = 0;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(name);\n    NK_ASSERT(title);\n    NK_ASSERT(ctx->style.font && ctx->style.font->width && \"if this triggers you forgot to add a font\");\n    NK_ASSERT(!ctx->current && \"if this triggers you missed a `nk_end` call\");\n    if (!ctx || ctx->current || !title || !name)\n        return 0;\n\n    /* find or create window */\n    style = &ctx->style;\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    win = nk_find_window(ctx, title_hash, name);\n    if (!win) {\n        /* create new window */\n        nk_size name_length = (nk_size)nk_strlen(name);\n        win = (struct nk_window*)nk_create_window(ctx);\n        NK_ASSERT(win);\n        if (!win) return 0;\n\n        if (flags & NK_WINDOW_BACKGROUND)\n            nk_insert_window(ctx, win, NK_INSERT_FRONT);\n        else nk_insert_window(ctx, win, NK_INSERT_BACK);\n        nk_command_buffer_init(&win->buffer, &ctx->memory, NK_CLIPPING_ON);\n\n        win->flags = flags;\n        win->bounds = bounds;\n        win->name = title_hash;\n        name_length = NK_MIN(name_length, NK_WINDOW_MAX_NAME-1);\n        NK_MEMCPY(win->name_string, name, name_length);\n        win->name_string[name_length] = 0;\n        win->popup.win = 0;\n        if (!ctx->active)\n            ctx->active = win;\n    } else {\n        /* update window */\n        win->flags &= ~(nk_flags)(NK_WINDOW_PRIVATE-1);\n        win->flags |= flags;\n        if (!(win->flags & (NK_WINDOW_MOVABLE | NK_WINDOW_SCALABLE)))\n            win->bounds = bounds;\n        /* If this assert triggers you either:\n         *\n         * I.) Have more than one window with the same name or\n         * II.) You forgot to actually draw the window.\n         *      More specific you did not call `nk_clear` (nk_clear will be\n         *      automatically called for you if you are using one of the\n         *      provided demo backends). */\n        NK_ASSERT(win->seq != ctx->seq);\n        win->seq = ctx->seq;\n        if (!ctx->active && !(win->flags & NK_WINDOW_HIDDEN))\n            ctx->active = win;\n    }\n    if (win->flags & NK_WINDOW_HIDDEN) {\n        ctx->current = win;\n        win->layout = 0;\n        return 0;\n    }\n\n    /* window overlapping */\n    if (!(win->flags & NK_WINDOW_HIDDEN) && !(win->flags & NK_WINDOW_NO_INPUT))\n    {\n        int inpanel, ishovered;\n        const struct nk_window *iter = win;\n        float h = ctx->style.font->height + 2.0f * style->window.header.padding.y +\n            (2.0f * style->window.header.label_padding.y);\n        struct nk_rect win_bounds = (!(win->flags & NK_WINDOW_MINIMIZED))?\n            win->bounds: nk_rect(win->bounds.x, win->bounds.y, win->bounds.w, h);\n\n        /* activate window if hovered and no other window is overlapping this window */\n        nk_start(ctx, win);\n        inpanel = nk_input_has_mouse_click_down_in_rect(&ctx->input, NK_BUTTON_LEFT, win_bounds, nk_true);\n        inpanel = inpanel && ctx->input.mouse.buttons[NK_BUTTON_LEFT].clicked;\n        ishovered = nk_input_is_mouse_hovering_rect(&ctx->input, win_bounds);\n        if ((win != ctx->active) && ishovered && !ctx->input.mouse.buttons[NK_BUTTON_LEFT].down) {\n            iter = win->next;\n            while (iter) {\n                struct nk_rect iter_bounds = (!(iter->flags & NK_WINDOW_MINIMIZED))?\n                    iter->bounds: nk_rect(iter->bounds.x, iter->bounds.y, iter->bounds.w, h);\n                if (NK_INTERSECT(win_bounds.x, win_bounds.y, win_bounds.w, win_bounds.h,\n                    iter_bounds.x, iter_bounds.y, iter_bounds.w, iter_bounds.h) &&\n                    (!(iter->flags & NK_WINDOW_HIDDEN) || !(iter->flags & NK_WINDOW_BACKGROUND)))\n                    break;\n\n                if (iter->popup.win && iter->popup.active && !(iter->flags & NK_WINDOW_HIDDEN) &&\n                    NK_INTERSECT(win->bounds.x, win_bounds.y, win_bounds.w, win_bounds.h,\n                    iter->popup.win->bounds.x, iter->popup.win->bounds.y,\n                    iter->popup.win->bounds.w, iter->popup.win->bounds.h))\n                    break;\n                iter = iter->next;\n            }\n        }\n\n        /* activate window if clicked */\n        if (iter && inpanel && (win != ctx->end) && !(iter->flags & NK_WINDOW_BACKGROUND)) {\n            iter = win->next;\n            while (iter) {\n                /* try to find a panel with higher priority in the same position */\n                struct nk_rect iter_bounds = (!(iter->flags & NK_WINDOW_MINIMIZED))?\n                iter->bounds: nk_rect(iter->bounds.x, iter->bounds.y, iter->bounds.w, h);\n                if (NK_INBOX(ctx->input.mouse.pos.x, ctx->input.mouse.pos.y,\n                    iter_bounds.x, iter_bounds.y, iter_bounds.w, iter_bounds.h) &&\n                    !(iter->flags & NK_WINDOW_HIDDEN))\n                    break;\n                if (iter->popup.win && iter->popup.active && !(iter->flags & NK_WINDOW_HIDDEN) &&\n                    NK_INTERSECT(win_bounds.x, win_bounds.y, win_bounds.w, win_bounds.h,\n                    iter->popup.win->bounds.x, iter->popup.win->bounds.y,\n                    iter->popup.win->bounds.w, iter->popup.win->bounds.h))\n                    break;\n                iter = iter->next;\n            }\n        }\n\n        if (!iter && ctx->end != win) {\n            if (!(win->flags & NK_WINDOW_BACKGROUND)) {\n                /* current window is active in that position so transfer to top\n                 * at the highest priority in stack */\n                nk_remove_window(ctx, win);\n                nk_insert_window(ctx, win, NK_INSERT_BACK);\n            }\n            win->flags &= ~(nk_flags)NK_WINDOW_ROM;\n            ctx->active = win;\n        }\n        if (ctx->end != win && !(win->flags & NK_WINDOW_BACKGROUND))\n            win->flags |= NK_WINDOW_ROM;\n    }\n\n    win->layout = (struct nk_panel*)nk_create_panel(ctx);\n    ctx->current = win;\n    ret = nk_panel_begin(ctx, title, NK_PANEL_WINDOW);\n    win->layout->offset_x = &win->scrollbar.x;\n    win->layout->offset_y = &win->scrollbar.y;\n    return ret;\n}\n\nNK_API void\nnk_end(struct nk_context *ctx)\n{\n    struct nk_panel *layout;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current && \"if this triggers you forgot to call `nk_begin`\");\n    if (!ctx || !ctx->current)\n        return;\n\n    layout = ctx->current->layout;\n    if (!layout || (layout->type == NK_PANEL_WINDOW && (ctx->current->flags & NK_WINDOW_HIDDEN))) {\n        ctx->current = 0;\n        return;\n    }\n    nk_panel_end(ctx);\n    nk_free_panel(ctx, ctx->current->layout);\n    ctx->current = 0;\n}\n\nNK_API struct nk_rect\nnk_window_get_bounds(const struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return nk_rect(0,0,0,0);\n    return ctx->current->bounds;\n}\n\nNK_API struct nk_vec2\nnk_window_get_position(const struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return nk_vec2(0,0);\n    return nk_vec2(ctx->current->bounds.x, ctx->current->bounds.y);\n}\n\nNK_API struct nk_vec2\nnk_window_get_size(const struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return nk_vec2(0,0);\n    return nk_vec2(ctx->current->bounds.w, ctx->current->bounds.h);\n}\n\nNK_API float\nnk_window_get_width(const struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return 0;\n    return ctx->current->bounds.w;\n}\n\nNK_API float\nnk_window_get_height(const struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return 0;\n    return ctx->current->bounds.h;\n}\n\nNK_API struct nk_rect\nnk_window_get_content_region(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return nk_rect(0,0,0,0);\n    return ctx->current->layout->clip;\n}\n\nNK_API struct nk_vec2\nnk_window_get_content_region_min(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current) return nk_vec2(0,0);\n    return nk_vec2(ctx->current->layout->clip.x, ctx->current->layout->clip.y);\n}\n\nNK_API struct nk_vec2\nnk_window_get_content_region_max(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current) return nk_vec2(0,0);\n    return nk_vec2(ctx->current->layout->clip.x + ctx->current->layout->clip.w,\n        ctx->current->layout->clip.y + ctx->current->layout->clip.h);\n}\n\nNK_API struct nk_vec2\nnk_window_get_content_region_size(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current) return nk_vec2(0,0);\n    return nk_vec2(ctx->current->layout->clip.w, ctx->current->layout->clip.h);\n}\n\nNK_API struct nk_command_buffer*\nnk_window_get_canvas(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current) return 0;\n    return &ctx->current->buffer;\n}\n\nNK_API struct nk_panel*\nnk_window_get_panel(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return 0;\n    return ctx->current->layout;\n}\n\nNK_API int\nnk_window_has_focus(const struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current) return 0;\n    return ctx->current == ctx->active;\n}\n\nNK_API int\nnk_window_is_hovered(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return 0;\n    return nk_input_is_mouse_hovering_rect(&ctx->input, ctx->current->bounds);\n}\n\nNK_API int\nnk_window_is_any_hovered(struct nk_context *ctx)\n{\n    struct nk_window *iter;\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n    iter = ctx->begin;\n    while (iter) {\n        /* check if window is being hovered */\n        if (iter->flags & NK_WINDOW_MINIMIZED) {\n            struct nk_rect header = iter->bounds;\n            header.h = ctx->style.font->height + 2 * ctx->style.window.header.padding.y;\n            if (nk_input_is_mouse_hovering_rect(&ctx->input, header))\n                return 1;\n        } else if (nk_input_is_mouse_hovering_rect(&ctx->input, iter->bounds)) {\n            return 1;\n        }\n        /* check if window popup is being hovered */\n        if (iter->popup.active && iter->popup.win && nk_input_is_mouse_hovering_rect(&ctx->input, iter->popup.win->bounds))\n            return 1;\n        iter = iter->next;\n    }\n    return 0;\n}\n\nNK_API int\nnk_item_is_any_active(struct nk_context *ctx)\n{\n    int any_hovered = nk_window_is_any_hovered(ctx);\n    int any_active = (ctx->last_widget_state & NK_WIDGET_STATE_MODIFIED);\n    return any_hovered || any_active;\n}\n\nNK_API int\nnk_window_is_collapsed(struct nk_context *ctx, const char *name)\n{\n    int title_len;\n    nk_hash title_hash;\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    win = nk_find_window(ctx, title_hash, name);\n    if (!win) return 0;\n    return win->flags & NK_WINDOW_MINIMIZED;\n}\n\nNK_API int\nnk_window_is_closed(struct nk_context *ctx, const char *name)\n{\n    int title_len;\n    nk_hash title_hash;\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    if (!ctx) return 1;\n\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    win = nk_find_window(ctx, title_hash, name);\n    if (!win) return 1;\n    return (win->flags & NK_WINDOW_CLOSED);\n}\n\nNK_API int\nnk_window_is_hidden(struct nk_context *ctx, const char *name)\n{\n    int title_len;\n    nk_hash title_hash;\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    if (!ctx) return 1;\n\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    win = nk_find_window(ctx, title_hash, name);\n    if (!win) return 1;\n    return (win->flags & NK_WINDOW_HIDDEN);\n}\n\nNK_API int\nnk_window_is_active(struct nk_context *ctx, const char *name)\n{\n    int title_len;\n    nk_hash title_hash;\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    win = nk_find_window(ctx, title_hash, name);\n    if (!win) return 0;\n    return win == ctx->active;\n}\n\nNK_API struct nk_window*\nnk_window_find(struct nk_context *ctx, const char *name)\n{\n    int title_len;\n    nk_hash title_hash;\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    return nk_find_window(ctx, title_hash, name);\n}\n\nNK_API void\nnk_window_close(struct nk_context *ctx, const char *name)\n{\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    win = nk_window_find(ctx, name);\n    if (!win) return;\n    NK_ASSERT(ctx->current != win && \"You cannot close a currently active window\");\n    if (ctx->current == win) return;\n    win->flags |= NK_WINDOW_HIDDEN;\n    win->flags |= NK_WINDOW_CLOSED;\n}\n\nNK_API void\nnk_window_set_bounds(struct nk_context *ctx, struct nk_rect bounds)\n{\n    NK_ASSERT(ctx); NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return;\n    ctx->current->bounds = bounds;\n}\n\nNK_API void\nnk_window_set_position(struct nk_context *ctx, struct nk_vec2 pos)\n{\n    NK_ASSERT(ctx); NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return;\n    ctx->current->bounds.x = pos.x;\n    ctx->current->bounds.y = pos.y;\n}\n\nNK_API void\nnk_window_set_size(struct nk_context *ctx, struct nk_vec2 size)\n{\n    NK_ASSERT(ctx); NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return;\n    ctx->current->bounds.w = size.x;\n    ctx->current->bounds.h = size.y;\n}\n\nNK_API void\nnk_window_collapse(struct nk_context *ctx, const char *name,\n                    enum nk_collapse_states c)\n{\n    int title_len;\n    nk_hash title_hash;\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    win = nk_find_window(ctx, title_hash, name);\n    if (!win) return;\n    if (c == NK_MINIMIZED)\n        win->flags |= NK_WINDOW_MINIMIZED;\n    else win->flags &= ~(nk_flags)NK_WINDOW_MINIMIZED;\n}\n\nNK_API void\nnk_window_collapse_if(struct nk_context *ctx, const char *name,\n    enum nk_collapse_states c, int cond)\n{\n    NK_ASSERT(ctx);\n    if (!ctx || !cond) return;\n    nk_window_collapse(ctx, name, c);\n}\n\nNK_API void\nnk_window_show(struct nk_context *ctx, const char *name, enum nk_show_states s)\n{\n    int title_len;\n    nk_hash title_hash;\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    win = nk_find_window(ctx, title_hash, name);\n    if (!win) return;\n    if (s == NK_HIDDEN) {\n        win->flags |= NK_WINDOW_HIDDEN;\n    } else win->flags &= ~(nk_flags)NK_WINDOW_HIDDEN;\n}\n\nNK_API void\nnk_window_show_if(struct nk_context *ctx, const char *name,\n    enum nk_show_states s, int cond)\n{\n    NK_ASSERT(ctx);\n    if (!ctx || !cond) return;\n    nk_window_show(ctx, name, s);\n}\n\nNK_API void\nnk_window_set_focus(struct nk_context *ctx, const char *name)\n{\n    int title_len;\n    nk_hash title_hash;\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n\n    title_len = (int)nk_strlen(name);\n    title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE);\n    win = nk_find_window(ctx, title_hash, name);\n    if (win && ctx->end != win) {\n        nk_remove_window(ctx, win);\n        nk_insert_window(ctx, win, NK_INSERT_BACK);\n    }\n    ctx->active = win;\n}\n\n/*----------------------------------------------------------------\n *\n *                          MENUBAR\n *\n * --------------------------------------------------------------*/\nNK_API void\nnk_menubar_begin(struct nk_context *ctx)\n{\n    struct nk_panel *layout;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    layout = ctx->current->layout;\n    NK_ASSERT(layout->at_y == layout->bounds.y);\n    /* if this assert triggers you allocated space between nk_begin and nk_menubar_begin.\n    If you want a menubar the first nuklear function after `nk_begin` has to be a\n    `nk_menubar_begin` call. Inside the menubar you then have to allocate space for\n    widgets (also supports multiple rows).\n    Example:\n        if (nk_begin(...)) {\n            nk_menubar_begin(...);\n                nk_layout_xxxx(...);\n                nk_button(...);\n                nk_layout_xxxx(...);\n                nk_button(...);\n            nk_menubar_end(...);\n        }\n        nk_end(...);\n    */\n    if (layout->flags & NK_WINDOW_HIDDEN || layout->flags & NK_WINDOW_MINIMIZED)\n        return;\n\n    layout->menu.x = layout->at_x;\n    layout->menu.y = layout->at_y + layout->row.height;\n    layout->menu.w = layout->bounds.w;\n    layout->menu.offset.x = *layout->offset_x;\n    layout->menu.offset.y = *layout->offset_y;\n    *layout->offset_y = 0;\n}\n\nNK_API void\nnk_menubar_end(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    struct nk_command_buffer *out;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    out = &win->buffer;\n    layout = win->layout;\n    if (layout->flags & NK_WINDOW_HIDDEN || layout->flags & NK_WINDOW_MINIMIZED)\n        return;\n\n    layout->menu.h = layout->at_y - layout->menu.y;\n    layout->bounds.y += layout->menu.h + ctx->style.window.spacing.y + layout->row.height;\n    layout->bounds.h -= layout->menu.h + ctx->style.window.spacing.y + layout->row.height;\n\n    *layout->offset_x = layout->menu.offset.x;\n    *layout->offset_y = layout->menu.offset.y;\n    layout->at_y = layout->bounds.y - layout->row.height;\n\n    layout->clip.y = layout->bounds.y;\n    layout->clip.h = layout->bounds.h;\n    nk_push_scissor(out, layout->clip);\n}\n/* -------------------------------------------------------------\n *\n *                          LAYOUT\n *\n * --------------------------------------------------------------*/\nNK_API void\nnk_layout_set_min_row_height(struct nk_context *ctx, float height)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    layout->row.min_height = height;\n}\n\nNK_API void\nnk_layout_reset_min_row_height(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    layout->row.min_height = ctx->style.font->height;\n    layout->row.min_height += ctx->style.text.padding.y*2;\n    layout->row.min_height += ctx->style.window.min_row_height_padding*2;\n}\n\nNK_INTERN float\nnk_layout_row_calculate_usable_space(const struct nk_style *style, enum nk_panel_type type,\n    float total_space, int columns)\n{\n    float panel_padding;\n    float panel_spacing;\n    float panel_space;\n\n    struct nk_vec2 spacing;\n    struct nk_vec2 padding;\n\n    spacing = style->window.spacing;\n    padding = nk_panel_get_padding(style, type);\n\n    /* calculate the usable panel space */\n    panel_padding = 2 * padding.x;\n    panel_spacing = (float)NK_MAX(columns - 1, 0) * spacing.x;\n    panel_space  = total_space - panel_padding - panel_spacing;\n    return panel_space;\n}\n\nNK_INTERN void\nnk_panel_layout(const struct nk_context *ctx, struct nk_window *win,\n    float height, int cols)\n{\n    struct nk_panel *layout;\n    const struct nk_style *style;\n    struct nk_command_buffer *out;\n\n    struct nk_vec2 item_spacing;\n    struct nk_color color;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    /* prefetch some configuration data */\n    layout = win->layout;\n    style = &ctx->style;\n    out = &win->buffer;\n    color = style->window.background;\n    item_spacing = style->window.spacing;\n\n    /*  if one of these triggers you forgot to add an `if` condition around either\n        a window, group, popup, combobox or contextual menu `begin` and `end` block.\n        Example:\n            if (nk_begin(...) {...} nk_end(...); or\n            if (nk_group_begin(...) { nk_group_end(...);} */\n    NK_ASSERT(!(layout->flags & NK_WINDOW_MINIMIZED));\n    NK_ASSERT(!(layout->flags & NK_WINDOW_HIDDEN));\n    NK_ASSERT(!(layout->flags & NK_WINDOW_CLOSED));\n\n    /* update the current row and set the current row layout */\n    layout->row.index = 0;\n    layout->at_y += layout->row.height;\n    layout->row.columns = cols;\n    if (height == 0.0f)\n        layout->row.height = NK_MAX(height, layout->row.min_height) + item_spacing.y;\n    else layout->row.height = height + item_spacing.y;\n\n    layout->row.item_offset = 0;\n    if (layout->flags & NK_WINDOW_DYNAMIC) {\n        /* draw background for dynamic panels */\n        struct nk_rect background;\n        background.x = win->bounds.x;\n        background.w = win->bounds.w;\n        background.y = layout->at_y - 1.0f;\n        background.h = layout->row.height + 1.0f;\n        nk_fill_rect(out, background, 0, color);\n    }\n}\n\nNK_INTERN void\nnk_row_layout(struct nk_context *ctx, enum nk_layout_format fmt,\n    float height, int cols, int width)\n{\n    /* update the current row and set the current row layout */\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    nk_panel_layout(ctx, win, height, cols);\n    if (fmt == NK_DYNAMIC)\n        win->layout->row.type = NK_LAYOUT_DYNAMIC_FIXED;\n    else win->layout->row.type = NK_LAYOUT_STATIC_FIXED;\n\n    win->layout->row.ratio = 0;\n    win->layout->row.filled = 0;\n    win->layout->row.item_offset = 0;\n    win->layout->row.item_width = (float)width;\n}\n\nNK_API float\nnk_layout_ratio_from_pixel(struct nk_context *ctx, float pixel_width)\n{\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    NK_ASSERT(pixel_width);\n    if (!ctx || !ctx->current || !ctx->current->layout) return 0;\n    win = ctx->current;\n    return NK_CLAMP(0.0f, pixel_width/win->bounds.x, 1.0f);\n}\n\nNK_API void\nnk_layout_row_dynamic(struct nk_context *ctx, float height, int cols)\n{\n    nk_row_layout(ctx, NK_DYNAMIC, height, cols, 0);\n}\n\nNK_API void\nnk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols)\n{\n    nk_row_layout(ctx, NK_STATIC, height, cols, item_width);\n}\n\nNK_API void\nnk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt,\n    float row_height, int cols)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    nk_panel_layout(ctx, win, row_height, cols);\n    if (fmt == NK_DYNAMIC)\n        layout->row.type = NK_LAYOUT_DYNAMIC_ROW;\n    else layout->row.type = NK_LAYOUT_STATIC_ROW;\n\n    layout->row.ratio = 0;\n    layout->row.filled = 0;\n    layout->row.item_width = 0;\n    layout->row.item_offset = 0;\n    layout->row.columns = cols;\n}\n\nNK_API void\nnk_layout_row_push(struct nk_context *ctx, float ratio_or_width)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    NK_ASSERT(layout->row.type == NK_LAYOUT_STATIC_ROW || layout->row.type == NK_LAYOUT_DYNAMIC_ROW);\n    if (layout->row.type != NK_LAYOUT_STATIC_ROW && layout->row.type != NK_LAYOUT_DYNAMIC_ROW)\n        return;\n\n    if (layout->row.type == NK_LAYOUT_DYNAMIC_ROW) {\n        float ratio = ratio_or_width;\n        if ((ratio + layout->row.filled) > 1.0f) return;\n        if (ratio > 0.0f)\n            layout->row.item_width = NK_SATURATE(ratio);\n        else layout->row.item_width = 1.0f - layout->row.filled;\n    } else layout->row.item_width = ratio_or_width;\n}\n\nNK_API void\nnk_layout_row_end(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    NK_ASSERT(layout->row.type == NK_LAYOUT_STATIC_ROW || layout->row.type == NK_LAYOUT_DYNAMIC_ROW);\n    if (layout->row.type != NK_LAYOUT_STATIC_ROW && layout->row.type != NK_LAYOUT_DYNAMIC_ROW)\n        return;\n    layout->row.item_width = 0;\n    layout->row.item_offset = 0;\n}\n\nNK_API void\nnk_layout_row(struct nk_context *ctx, enum nk_layout_format fmt,\n    float height, int cols, const float *ratio)\n{\n    int i;\n    int n_undef = 0;\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    nk_panel_layout(ctx, win, height, cols);\n    if (fmt == NK_DYNAMIC) {\n        /* calculate width of undefined widget ratios */\n        float r = 0;\n        layout->row.ratio = ratio;\n        for (i = 0; i < cols; ++i) {\n            if (ratio[i] < 0.0f)\n                n_undef++;\n            else r += ratio[i];\n        }\n        r = NK_SATURATE(1.0f - r);\n        layout->row.type = NK_LAYOUT_DYNAMIC;\n        layout->row.item_width = (r > 0 && n_undef > 0) ? (r / (float)n_undef):0;\n    } else {\n        layout->row.ratio = ratio;\n        layout->row.type = NK_LAYOUT_STATIC;\n        layout->row.item_width = 0;\n        layout->row.item_offset = 0;\n    }\n    layout->row.item_offset = 0;\n    layout->row.filled = 0;\n}\n\nNK_API void\nnk_layout_row_template_begin(struct nk_context *ctx, float height)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    nk_panel_layout(ctx, win, height, 1);\n    layout->row.type = NK_LAYOUT_TEMPLATE;\n    layout->row.columns = 0;\n    layout->row.ratio = 0;\n    layout->row.item_width = 0;\n    layout->row.item_height = 0;\n    layout->row.item_offset = 0;\n    layout->row.filled = 0;\n    layout->row.item.x = 0;\n    layout->row.item.y = 0;\n    layout->row.item.w = 0;\n    layout->row.item.h = 0;\n}\n\nNK_API void\nnk_layout_row_template_push_dynamic(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE);\n    NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);\n    if (layout->row.type != NK_LAYOUT_TEMPLATE) return;\n    if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return;\n    layout->row.templates[layout->row.columns++] = -1.0f;\n}\n\nNK_API void\nnk_layout_row_template_push_variable(struct nk_context *ctx, float min_width)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE);\n    NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);\n    if (layout->row.type != NK_LAYOUT_TEMPLATE) return;\n    if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return;\n    layout->row.templates[layout->row.columns++] = -min_width;\n}\n\nNK_API void\nnk_layout_row_template_push_static(struct nk_context *ctx, float width)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE);\n    NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);\n    if (layout->row.type != NK_LAYOUT_TEMPLATE) return;\n    if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return;\n    layout->row.templates[layout->row.columns++] = width;\n}\n\nNK_API void\nnk_layout_row_template_end(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    int i = 0;\n    int variable_count = 0;\n    int min_variable_count = 0;\n    float min_fixed_width = 0.0f;\n    float total_fixed_width = 0.0f;\n    float max_variable_width = 0.0f;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE);\n    if (layout->row.type != NK_LAYOUT_TEMPLATE) return;\n    for (i = 0; i < layout->row.columns; ++i) {\n        float width = layout->row.templates[i];\n        if (width >= 0.0f) {\n            total_fixed_width += width;\n            min_fixed_width += width;\n        } else if (width < -1.0f) {\n            width = -width;\n            total_fixed_width += width;\n            max_variable_width = NK_MAX(max_variable_width, width);\n            variable_count++;\n        } else {\n            min_variable_count++;\n            variable_count++;\n        }\n    }\n    if (variable_count) {\n        float space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type,\n                            layout->bounds.w, layout->row.columns);\n        float var_width = (NK_MAX(space-min_fixed_width,0.0f)) / (float)variable_count;\n        int enough_space = var_width >= max_variable_width;\n        if (!enough_space)\n            var_width = (NK_MAX(space-total_fixed_width,0)) / (float)min_variable_count;\n        for (i = 0; i < layout->row.columns; ++i) {\n            float *width = &layout->row.templates[i];\n            *width = (*width >= 0.0f)? *width: (*width < -1.0f && !enough_space)? -(*width): var_width;\n        }\n    }\n}\n\nNK_API void\nnk_layout_space_begin(struct nk_context *ctx, enum nk_layout_format fmt,\n    float height, int widget_count)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    nk_panel_layout(ctx, win, height, widget_count);\n    if (fmt == NK_STATIC)\n        layout->row.type = NK_LAYOUT_STATIC_FREE;\n    else layout->row.type = NK_LAYOUT_DYNAMIC_FREE;\n\n    layout->row.ratio = 0;\n    layout->row.filled = 0;\n    layout->row.item_width = 0;\n    layout->row.item_offset = 0;\n}\n\nNK_API void\nnk_layout_space_end(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    layout->row.item_width = 0;\n    layout->row.item_height = 0;\n    layout->row.item_offset = 0;\n    nk_zero(&layout->row.item, sizeof(layout->row.item));\n}\n\nNK_API void\nnk_layout_space_push(struct nk_context *ctx, struct nk_rect rect)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    layout->row.item = rect;\n}\n\nNK_API struct nk_rect\nnk_layout_space_bounds(struct nk_context *ctx)\n{\n    struct nk_rect ret;\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    win = ctx->current;\n    layout = win->layout;\n\n    ret.x = layout->clip.x;\n    ret.y = layout->clip.y;\n    ret.w = layout->clip.w;\n    ret.h = layout->row.height;\n    return ret;\n}\n\nNK_API struct nk_rect\nnk_layout_widget_bounds(struct nk_context *ctx)\n{\n    struct nk_rect ret;\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    win = ctx->current;\n    layout = win->layout;\n\n    ret.x = layout->at_x;\n    ret.y = layout->at_y;\n    ret.w = layout->bounds.w - NK_MAX(layout->at_x - layout->bounds.x,0);\n    ret.h = layout->row.height;\n    return ret;\n}\n\nNK_API struct nk_vec2\nnk_layout_space_to_screen(struct nk_context *ctx, struct nk_vec2 ret)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    win = ctx->current;\n    layout = win->layout;\n\n    ret.x += layout->at_x - (float)*layout->offset_x;\n    ret.y += layout->at_y - (float)*layout->offset_y;\n    return ret;\n}\n\nNK_API struct nk_vec2\nnk_layout_space_to_local(struct nk_context *ctx, struct nk_vec2 ret)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    win = ctx->current;\n    layout = win->layout;\n\n    ret.x += -layout->at_x + (float)*layout->offset_x;\n    ret.y += -layout->at_y + (float)*layout->offset_y;\n    return ret;\n}\n\nNK_API struct nk_rect\nnk_layout_space_rect_to_screen(struct nk_context *ctx, struct nk_rect ret)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    win = ctx->current;\n    layout = win->layout;\n\n    ret.x += layout->at_x - (float)*layout->offset_x;\n    ret.y += layout->at_y - (float)*layout->offset_y;\n    return ret;\n}\n\nNK_API struct nk_rect\nnk_layout_space_rect_to_local(struct nk_context *ctx, struct nk_rect ret)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    win = ctx->current;\n    layout = win->layout;\n\n    ret.x += -layout->at_x + (float)*layout->offset_x;\n    ret.y += -layout->at_y + (float)*layout->offset_y;\n    return ret;\n}\n\nNK_INTERN void\nnk_panel_alloc_row(const struct nk_context *ctx, struct nk_window *win)\n{\n    struct nk_panel *layout = win->layout;\n    struct nk_vec2 spacing = ctx->style.window.spacing;\n    const float row_height = layout->row.height - spacing.y;\n    nk_panel_layout(ctx, win, row_height, layout->row.columns);\n}\n\nNK_INTERN void\nnk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx,\n    struct nk_window *win, int modify)\n{\n    struct nk_panel *layout;\n    const struct nk_style *style;\n\n    struct nk_vec2 spacing;\n    struct nk_vec2 padding;\n\n    float item_offset = 0;\n    float item_width = 0;\n    float item_spacing = 0;\n    float panel_space = 0;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    style = &ctx->style;\n    NK_ASSERT(bounds);\n\n    spacing = style->window.spacing;\n    padding = nk_panel_get_padding(style, layout->type);\n    panel_space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type,\n                                            layout->bounds.w, layout->row.columns);\n\n    /* calculate the width of one item inside the current layout space */\n    switch (layout->row.type) {\n    case NK_LAYOUT_DYNAMIC_FIXED: {\n        /* scaling fixed size widgets item width */\n        item_width = NK_MAX(1.0f,panel_space-1.0f) / (float)layout->row.columns;\n        item_offset = (float)layout->row.index * item_width;\n        item_spacing = (float)layout->row.index * spacing.x;\n    } break;\n    case NK_LAYOUT_DYNAMIC_ROW: {\n        /* scaling single ratio widget width */\n        item_width = layout->row.item_width * panel_space;\n        item_offset = layout->row.item_offset;\n        item_spacing = 0;\n\n        if (modify) {\n            layout->row.item_offset += item_width + spacing.x;\n            layout->row.filled += layout->row.item_width;\n            layout->row.index = 0;\n        }\n    } break;\n    case NK_LAYOUT_DYNAMIC_FREE: {\n        /* panel width depended free widget placing */\n        bounds->x = layout->at_x + (layout->bounds.w * layout->row.item.x);\n        bounds->x -= (float)*layout->offset_x;\n        bounds->y = layout->at_y + (layout->row.height * layout->row.item.y);\n        bounds->y -= (float)*layout->offset_y;\n        bounds->w = layout->bounds.w  * layout->row.item.w;\n        bounds->h = layout->row.height * layout->row.item.h;\n        return;\n    } break;\n    case NK_LAYOUT_DYNAMIC: {\n        /* scaling arrays of panel width ratios for every widget */\n        float ratio;\n        NK_ASSERT(layout->row.ratio);\n        ratio = (layout->row.ratio[layout->row.index] < 0) ?\n            layout->row.item_width : layout->row.ratio[layout->row.index];\n\n        item_spacing = (float)layout->row.index * spacing.x;\n        item_width = (ratio * panel_space);\n        item_offset = layout->row.item_offset;\n\n        if (modify) {\n            layout->row.item_offset += item_width;\n            layout->row.filled += ratio;\n        }\n    } break;\n    case NK_LAYOUT_STATIC_FIXED: {\n        /* non-scaling fixed widgets item width */\n        item_width = layout->row.item_width;\n        item_offset = (float)layout->row.index * item_width;\n        item_spacing = (float)layout->row.index * spacing.x;\n    } break;\n    case NK_LAYOUT_STATIC_ROW: {\n        /* scaling single ratio widget width */\n        item_width = layout->row.item_width;\n        item_offset = layout->row.item_offset;\n        item_spacing = (float)layout->row.index * spacing.x;\n        if (modify) layout->row.item_offset += item_width;\n    } break;\n    case NK_LAYOUT_STATIC_FREE: {\n        /* free widget placing */\n        bounds->x = layout->at_x + layout->row.item.x;\n        bounds->w = layout->row.item.w;\n        if (((bounds->x + bounds->w) > layout->max_x) && modify)\n            layout->max_x = (bounds->x + bounds->w);\n        bounds->x -= (float)*layout->offset_x;\n        bounds->y = layout->at_y + layout->row.item.y;\n        bounds->y -= (float)*layout->offset_y;\n        bounds->h = layout->row.item.h;\n        return;\n    } break;\n    case NK_LAYOUT_STATIC: {\n        /* non-scaling array of panel pixel width for every widget */\n        item_spacing = (float)layout->row.index * spacing.x;\n        item_width = layout->row.ratio[layout->row.index];\n        item_offset = layout->row.item_offset;\n        if (modify) layout->row.item_offset += item_width;\n    } break;\n    case NK_LAYOUT_TEMPLATE: {\n        /* stretchy row layout with combined dynamic/static widget width*/\n        NK_ASSERT(layout->row.index < layout->row.columns);\n        NK_ASSERT(layout->row.index < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);\n        item_width = layout->row.templates[layout->row.index];\n        item_offset = layout->row.item_offset;\n        item_spacing = (float)layout->row.index * spacing.x;\n        if (modify) layout->row.item_offset += item_width;\n    } break;\n    default: NK_ASSERT(0); break;\n    };\n\n    /* set the bounds of the newly allocated widget */\n    bounds->w = item_width;\n    bounds->h = layout->row.height - spacing.y;\n    bounds->y = layout->at_y - (float)*layout->offset_y;\n    bounds->x = layout->at_x + item_offset + item_spacing + padding.x;\n    if (((bounds->x + bounds->w) > layout->max_x) && modify)\n        layout->max_x = bounds->x + bounds->w;\n    bounds->x -= (float)*layout->offset_x;\n}\n\nNK_INTERN void\nnk_panel_alloc_space(struct nk_rect *bounds, const struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    /* check if the end of the row has been hit and begin new row if so */\n    win = ctx->current;\n    layout = win->layout;\n    if (layout->row.index >= layout->row.columns)\n        nk_panel_alloc_row(ctx, win);\n\n    /* calculate widget position and size */\n    nk_layout_widget_space(bounds, ctx, win, nk_true);\n    layout->row.index++;\n}\n\nNK_INTERN void\nnk_layout_peek(struct nk_rect *bounds, struct nk_context *ctx)\n{\n    float y;\n    int index;\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    y = layout->at_y;\n    index = layout->row.index;\n    if (layout->row.index >= layout->row.columns) {\n        layout->at_y += layout->row.height;\n        layout->row.index = 0;\n    }\n    nk_layout_widget_space(bounds, ctx, win, nk_false);\n    layout->at_y = y;\n    layout->row.index = index;\n}\n\nNK_INTERN int\nnk_tree_state_base(struct nk_context *ctx, enum nk_tree_type type,\n    struct nk_image *img, const char *title, enum nk_collapse_states *state)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_style *style;\n    struct nk_command_buffer *out;\n    const struct nk_input *in;\n    const struct nk_style_button *button;\n    enum nk_symbol_type symbol;\n    float row_height;\n\n    struct nk_vec2 item_spacing;\n    struct nk_rect header = {0,0,0,0};\n    struct nk_rect sym = {0,0,0,0};\n    struct nk_text text;\n\n    nk_flags ws = 0;\n    enum nk_widget_layout_states widget_state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    /* cache some data */\n    win = ctx->current;\n    layout = win->layout;\n    out = &win->buffer;\n    style = &ctx->style;\n    item_spacing = style->window.spacing;\n\n    /* calculate header bounds and draw background */\n    row_height = style->font->height + 2 * style->tab.padding.y;\n    nk_layout_set_min_row_height(ctx, row_height);\n    nk_layout_row_dynamic(ctx, row_height, 1);\n    nk_layout_reset_min_row_height(ctx);\n\n    widget_state = nk_widget(&header, ctx);\n    if (type == NK_TREE_TAB) {\n        const struct nk_style_item *background = &style->tab.background;\n        if (background->type == NK_STYLE_ITEM_IMAGE) {\n            nk_draw_image(out, header, &background->data.image, nk_white);\n            text.background = nk_rgba(0,0,0,0);\n        } else {\n            text.background = background->data.color;\n            nk_fill_rect(out, header, 0, style->tab.border_color);\n            nk_fill_rect(out, nk_shrink_rect(header, style->tab.border),\n                style->tab.rounding, background->data.color);\n        }\n    } else text.background = style->window.background;\n\n    /* update node state */\n    in = (!(layout->flags & NK_WINDOW_ROM)) ? &ctx->input: 0;\n    in = (in && widget_state == NK_WIDGET_VALID) ? &ctx->input : 0;\n    if (nk_button_behavior(&ws, header, in, NK_BUTTON_DEFAULT))\n        *state = (*state == NK_MAXIMIZED) ? NK_MINIMIZED : NK_MAXIMIZED;\n\n    /* select correct button style */\n    if (*state == NK_MAXIMIZED) {\n        symbol = style->tab.sym_maximize;\n        if (type == NK_TREE_TAB)\n            button = &style->tab.tab_maximize_button;\n        else button = &style->tab.node_maximize_button;\n    } else {\n        symbol = style->tab.sym_minimize;\n        if (type == NK_TREE_TAB)\n            button = &style->tab.tab_minimize_button;\n        else button = &style->tab.node_minimize_button;\n    }\n\n    {/* draw triangle button */\n    sym.w = sym.h = style->font->height;\n    sym.y = header.y + style->tab.padding.y;\n    sym.x = header.x + style->tab.padding.x;\n    nk_do_button_symbol(&ws, &win->buffer, sym, symbol, NK_BUTTON_DEFAULT,\n        button, 0, style->font);\n\n    if (img) {\n        /* draw optional image icon */\n        sym.x = sym.x + sym.w + 4 * item_spacing.x;\n        nk_draw_image(&win->buffer, sym, img, nk_white);\n        sym.w = style->font->height + style->tab.spacing.x;}\n    }\n\n    {/* draw label */\n    struct nk_rect label;\n    header.w = NK_MAX(header.w, sym.w + item_spacing.x);\n    label.x = sym.x + sym.w + item_spacing.x;\n    label.y = sym.y;\n    label.w = header.w - (sym.w + item_spacing.y + style->tab.indent);\n    label.h = style->font->height;\n    text.text = style->tab.text;\n    text.padding = nk_vec2(0,0);\n    nk_widget_text(out, label, title, nk_strlen(title), &text,\n        NK_TEXT_LEFT, style->font);}\n\n    /* increase x-axis cursor widget position pointer */\n    if (*state == NK_MAXIMIZED) {\n        layout->at_x = header.x + (float)*layout->offset_x + style->tab.indent;\n        layout->bounds.w = NK_MAX(layout->bounds.w, style->tab.indent);\n        layout->bounds.w -= (style->tab.indent + style->window.padding.x);\n        layout->row.tree_depth++;\n        return nk_true;\n    } else return nk_false;\n}\n\nNK_INTERN int\nnk_tree_base(struct nk_context *ctx, enum nk_tree_type type,\n    struct nk_image *img, const char *title, enum nk_collapse_states initial_state,\n    const char *hash, int len, int line)\n{\n    struct nk_window *win = ctx->current;\n    int title_len = 0;\n    nk_hash tree_hash = 0;\n    nk_uint *state = 0;\n\n    /* retrieve tree state from internal widget state tables */\n    if (!hash) {\n        title_len = (int)nk_strlen(title);\n        tree_hash = nk_murmur_hash(title, (int)title_len, (nk_hash)line);\n    } else tree_hash = nk_murmur_hash(hash, len, (nk_hash)line);\n    state = nk_find_value(win, tree_hash);\n    if (!state) {\n        state = nk_add_value(ctx, win, tree_hash, 0);\n        *state = initial_state;\n    }\n    return nk_tree_state_base(ctx, type, img, title, (enum nk_collapse_states*)state);\n}\n\nNK_API int\nnk_tree_state_push(struct nk_context *ctx, enum nk_tree_type type,\n    const char *title, enum nk_collapse_states *state)\n{return nk_tree_state_base(ctx, type, 0, title, state);}\n\nNK_API int\nnk_tree_state_image_push(struct nk_context *ctx, enum nk_tree_type type,\n    struct nk_image img, const char *title, enum nk_collapse_states *state)\n{return nk_tree_state_base(ctx, type, &img, title, state);}\n\nNK_API void\nnk_tree_state_pop(struct nk_context *ctx)\n{\n    struct nk_window *win = 0;\n    struct nk_panel *layout = 0;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    layout->at_x -= ctx->style.tab.indent + ctx->style.window.padding.x;\n    layout->bounds.w += ctx->style.tab.indent + ctx->style.window.padding.x;\n    NK_ASSERT(layout->row.tree_depth);\n    layout->row.tree_depth--;\n}\n\nNK_API int\nnk_tree_push_hashed(struct nk_context *ctx, enum nk_tree_type type,\n    const char *title, enum nk_collapse_states initial_state,\n    const char *hash, int len, int line)\n{return nk_tree_base(ctx, type, 0, title, initial_state, hash, len, line);}\n\nNK_API int\nnk_tree_image_push_hashed(struct nk_context *ctx, enum nk_tree_type type,\n    struct nk_image img, const char *title, enum nk_collapse_states initial_state,\n    const char *hash, int len,int seed)\n{return nk_tree_base(ctx, type, &img, title, initial_state, hash, len, seed);}\n\nNK_API void\nnk_tree_pop(struct nk_context *ctx)\n{nk_tree_state_pop(ctx);}\n\n/*----------------------------------------------------------------\n *\n *                          WIDGETS\n *\n * --------------------------------------------------------------*/\nNK_API struct nk_rect\nnk_widget_bounds(struct nk_context *ctx)\n{\n    struct nk_rect bounds;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current)\n        return nk_rect(0,0,0,0);\n    nk_layout_peek(&bounds, ctx);\n    return bounds;\n}\n\nNK_API struct nk_vec2\nnk_widget_position(struct nk_context *ctx)\n{\n    struct nk_rect bounds;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current)\n        return nk_vec2(0,0);\n\n    nk_layout_peek(&bounds, ctx);\n    return nk_vec2(bounds.x, bounds.y);\n}\n\nNK_API struct nk_vec2\nnk_widget_size(struct nk_context *ctx)\n{\n    struct nk_rect bounds;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current)\n        return nk_vec2(0,0);\n\n    nk_layout_peek(&bounds, ctx);\n    return nk_vec2(bounds.w, bounds.h);\n}\n\nNK_API float\nnk_widget_width(struct nk_context *ctx)\n{\n    struct nk_rect bounds;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current)\n        return 0;\n\n    nk_layout_peek(&bounds, ctx);\n    return bounds.w;\n}\n\nNK_API float\nnk_widget_height(struct nk_context *ctx)\n{\n    struct nk_rect bounds;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current)\n        return 0;\n\n    nk_layout_peek(&bounds, ctx);\n    return bounds.h;\n}\n\nNK_API int\nnk_widget_is_hovered(struct nk_context *ctx)\n{\n    struct nk_rect c, v;\n    struct nk_rect bounds;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current || ctx->active != ctx->current)\n        return 0;\n\n    c = ctx->current->layout->clip;\n    c.x = (float)((int)c.x);\n    c.y = (float)((int)c.y);\n    c.w = (float)((int)c.w);\n    c.h = (float)((int)c.h);\n\n    nk_layout_peek(&bounds, ctx);\n    nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h);\n    if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h))\n        return 0;\n    return nk_input_is_mouse_hovering_rect(&ctx->input, bounds);\n}\n\nNK_API int\nnk_widget_is_mouse_clicked(struct nk_context *ctx, enum nk_buttons btn)\n{\n    struct nk_rect c, v;\n    struct nk_rect bounds;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current || ctx->active != ctx->current)\n        return 0;\n\n    c = ctx->current->layout->clip;\n    c.x = (float)((int)c.x);\n    c.y = (float)((int)c.y);\n    c.w = (float)((int)c.w);\n    c.h = (float)((int)c.h);\n\n    nk_layout_peek(&bounds, ctx);\n    nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h);\n    if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h))\n        return 0;\n    return nk_input_mouse_clicked(&ctx->input, btn, bounds);\n}\n\nNK_API int\nnk_widget_has_mouse_click_down(struct nk_context *ctx, enum nk_buttons btn, int down)\n{\n    struct nk_rect c, v;\n    struct nk_rect bounds;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current || ctx->active != ctx->current)\n        return 0;\n\n    c = ctx->current->layout->clip;\n    c.x = (float)((int)c.x);\n    c.y = (float)((int)c.y);\n    c.w = (float)((int)c.w);\n    c.h = (float)((int)c.h);\n\n    nk_layout_peek(&bounds, ctx);\n    nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h);\n    if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h))\n        return 0;\n    return nk_input_has_mouse_click_down_in_rect(&ctx->input, btn, bounds, down);\n}\n\nNK_API enum nk_widget_layout_states\nnk_widget(struct nk_rect *bounds, const struct nk_context *ctx)\n{\n    struct nk_rect c, v;\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return NK_WIDGET_INVALID;\n\n    /* allocate space and check if the widget needs to be updated and drawn */\n    nk_panel_alloc_space(bounds, ctx);\n    win = ctx->current;\n    layout = win->layout;\n    in = &ctx->input;\n    c = layout->clip;\n\n    /*  if one of these triggers you forgot to add an `if` condition around either\n        a window, group, popup, combobox or contextual menu `begin` and `end` block.\n        Example:\n            if (nk_begin(...) {...} nk_end(...); or\n            if (nk_group_begin(...) { nk_group_end(...);} */\n    NK_ASSERT(!(layout->flags & NK_WINDOW_MINIMIZED));\n    NK_ASSERT(!(layout->flags & NK_WINDOW_HIDDEN));\n    NK_ASSERT(!(layout->flags & NK_WINDOW_CLOSED));\n\n    /* need to convert to int here to remove floating point errors */\n    bounds->x = (float)((int)bounds->x);\n    bounds->y = (float)((int)bounds->y);\n    bounds->w = (float)((int)bounds->w);\n    bounds->h = (float)((int)bounds->h);\n\n    c.x = (float)((int)c.x);\n    c.y = (float)((int)c.y);\n    c.w = (float)((int)c.w);\n    c.h = (float)((int)c.h);\n\n    nk_unify(&v, &c, bounds->x, bounds->y, bounds->x + bounds->w, bounds->y + bounds->h);\n    if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds->x, bounds->y, bounds->w, bounds->h))\n        return NK_WIDGET_INVALID;\n    if (!NK_INBOX(in->mouse.pos.x, in->mouse.pos.y, v.x, v.y, v.w, v.h))\n        return NK_WIDGET_ROM;\n    return NK_WIDGET_VALID;\n}\n\nNK_API enum nk_widget_layout_states\nnk_widget_fitting(struct nk_rect *bounds, struct nk_context *ctx,\n    struct nk_vec2 item_padding)\n{\n    /* update the bounds to stand without padding  */\n    struct nk_window *win;\n    struct nk_style *style;\n    struct nk_panel *layout;\n    enum nk_widget_layout_states state;\n    struct nk_vec2 panel_padding;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return NK_WIDGET_INVALID;\n\n    win = ctx->current;\n    style = &ctx->style;\n    layout = win->layout;\n    state = nk_widget(bounds, ctx);\n\n    panel_padding = nk_panel_get_padding(style, layout->type);\n    if (layout->row.index == 1) {\n        bounds->w += panel_padding.x;\n        bounds->x -= panel_padding.x;\n    } else bounds->x -= item_padding.x;\n\n    if (layout->row.index == layout->row.columns)\n        bounds->w += panel_padding.x;\n    else bounds->w += item_padding.x;\n    return state;\n}\n\n/*----------------------------------------------------------------\n *\n *                          MISC\n *\n * --------------------------------------------------------------*/\nNK_API void\nnk_spacing(struct nk_context *ctx, int cols)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    struct nk_rect none;\n    int i, index, rows;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    /* spacing over row boundaries */\n    win = ctx->current;\n    layout = win->layout;\n    index = (layout->row.index + cols) % layout->row.columns;\n    rows = (layout->row.index + cols) / layout->row.columns;\n    if (rows) {\n        for (i = 0; i < rows; ++i)\n            nk_panel_alloc_row(ctx, win);\n        cols = index;\n    }\n    /* non table layout need to allocate space */\n    if (layout->row.type != NK_LAYOUT_DYNAMIC_FIXED &&\n        layout->row.type != NK_LAYOUT_STATIC_FIXED) {\n        for (i = 0; i < cols; ++i)\n            nk_panel_alloc_space(&none, ctx);\n    }\n    layout->row.index = index;\n}\n\n/*----------------------------------------------------------------\n *\n *                          TEXT\n *\n * --------------------------------------------------------------*/\nNK_API void\nnk_text_colored(struct nk_context *ctx, const char *str, int len,\n    nk_flags alignment, struct nk_color color)\n{\n    struct nk_window *win;\n    const struct nk_style *style;\n\n    struct nk_vec2 item_padding;\n    struct nk_rect bounds;\n    struct nk_text text;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout) return;\n\n    win = ctx->current;\n    style = &ctx->style;\n    nk_panel_alloc_space(&bounds, ctx);\n    item_padding = style->text.padding;\n\n    text.padding.x = item_padding.x;\n    text.padding.y = item_padding.y;\n    text.background = style->window.background;\n    text.text = color;\n    nk_widget_text(&win->buffer, bounds, str, len, &text, alignment, style->font);\n}\n\nNK_API void\nnk_text_wrap_colored(struct nk_context *ctx, const char *str,\n    int len, struct nk_color color)\n{\n    struct nk_window *win;\n    const struct nk_style *style;\n\n    struct nk_vec2 item_padding;\n    struct nk_rect bounds;\n    struct nk_text text;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout) return;\n\n    win = ctx->current;\n    style = &ctx->style;\n    nk_panel_alloc_space(&bounds, ctx);\n    item_padding = style->text.padding;\n\n    text.padding.x = item_padding.x;\n    text.padding.y = item_padding.y;\n    text.background = style->window.background;\n    text.text = color;\n    nk_widget_text_wrap(&win->buffer, bounds, str, len, &text, style->font);\n}\n\n#ifdef NK_INCLUDE_STANDARD_VARARGS\nNK_API void\nnk_labelf_colored(struct nk_context *ctx, nk_flags flags,\n    struct nk_color color, const char *fmt, ...)\n{\n    char buf[256];\n    va_list args;\n    va_start(args, fmt);\n    nk_strfmt(buf, NK_LEN(buf), fmt, args);\n    nk_label_colored(ctx, buf, flags, color);\n    va_end(args);\n}\n\nNK_API void\nnk_labelf_colored_wrap(struct nk_context *ctx, struct nk_color color,\n    const char *fmt, ...)\n{\n    char buf[256];\n    va_list args;\n    va_start(args, fmt);\n    nk_strfmt(buf, NK_LEN(buf), fmt, args);\n    nk_label_colored_wrap(ctx, buf, color);\n    va_end(args);\n}\n\nNK_API void\nnk_labelf(struct nk_context *ctx, nk_flags flags, const char *fmt, ...)\n{\n    char buf[256];\n    va_list args;\n    va_start(args, fmt);\n    nk_strfmt(buf, NK_LEN(buf), fmt, args);\n    nk_label(ctx, buf, flags);\n    va_end(args);\n}\n\nNK_API void\nnk_labelf_wrap(struct nk_context *ctx, const char *fmt,...)\n{\n    char buf[256];\n    va_list args;\n    va_start(args, fmt);\n    nk_strfmt(buf, NK_LEN(buf), fmt, args);\n    nk_label_wrap(ctx, buf);\n    va_end(args);\n}\n\nNK_API void\nnk_value_bool(struct nk_context *ctx, const char *prefix, int value)\n{nk_labelf(ctx, NK_TEXT_LEFT, \"%s: %s\", prefix, ((value) ? \"true\": \"false\"));}\n\nNK_API void\nnk_value_int(struct nk_context *ctx, const char *prefix, int value)\n{nk_labelf(ctx, NK_TEXT_LEFT, \"%s: %d\", prefix, value);}\n\nNK_API void\nnk_value_uint(struct nk_context *ctx, const char *prefix, unsigned int value)\n{nk_labelf(ctx, NK_TEXT_LEFT, \"%s: %u\", prefix, value);}\n\nNK_API void\nnk_value_float(struct nk_context *ctx, const char *prefix, float value)\n{\n    double double_value = (double)value;\n    nk_labelf(ctx, NK_TEXT_LEFT, \"%s: %.3f\", prefix, double_value);\n}\n\nNK_API void\nnk_value_color_byte(struct nk_context *ctx, const char *p, struct nk_color c)\n{nk_labelf(ctx, NK_TEXT_LEFT, \"%s: (%d, %d, %d, %d)\", p, c.r, c.g, c.b, c.a);}\n\nNK_API void\nnk_value_color_float(struct nk_context *ctx, const char *p, struct nk_color color)\n{\n    double c[4]; nk_color_dv(c, color);\n    nk_labelf(ctx, NK_TEXT_LEFT, \"%s: (%.2f, %.2f, %.2f, %.2f)\",\n        p, c[0], c[1], c[2], c[3]);\n}\n\nNK_API void\nnk_value_color_hex(struct nk_context *ctx, const char *prefix, struct nk_color color)\n{\n    char hex[16];\n    nk_color_hex_rgba(hex, color);\n    nk_labelf(ctx, NK_TEXT_LEFT, \"%s: %s\", prefix, hex);\n}\n#endif\n\nNK_API void\nnk_text(struct nk_context *ctx, const char *str, int len, nk_flags alignment)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    nk_text_colored(ctx, str, len, alignment, ctx->style.text.color);\n}\n\nNK_API void\nnk_text_wrap(struct nk_context *ctx, const char *str, int len)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    nk_text_wrap_colored(ctx, str, len, ctx->style.text.color);\n}\n\nNK_API void\nnk_label(struct nk_context *ctx, const char *str, nk_flags alignment)\n{nk_text(ctx, str, nk_strlen(str), alignment);}\n\nNK_API void\nnk_label_colored(struct nk_context *ctx, const char *str, nk_flags align,\n    struct nk_color color)\n{nk_text_colored(ctx, str, nk_strlen(str), align, color);}\n\nNK_API void\nnk_label_wrap(struct nk_context *ctx, const char *str)\n{nk_text_wrap(ctx, str, nk_strlen(str));}\n\nNK_API void\nnk_label_colored_wrap(struct nk_context *ctx, const char *str, struct nk_color color)\n{nk_text_wrap_colored(ctx, str, nk_strlen(str), color);}\n\nNK_API void\nnk_image(struct nk_context *ctx, struct nk_image img)\n{\n    struct nk_window *win;\n    struct nk_rect bounds;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout) return;\n\n    win = ctx->current;\n    if (!nk_widget(&bounds, ctx)) return;\n    nk_draw_image(&win->buffer, bounds, &img, nk_white);\n}\n\n/*----------------------------------------------------------------\n *\n *                          BUTTON\n *\n * --------------------------------------------------------------*/\nNK_API void\nnk_button_set_behavior(struct nk_context *ctx, enum nk_button_behavior behavior)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return;\n    ctx->button_behavior = behavior;\n}\n\nNK_API int\nnk_button_push_behavior(struct nk_context *ctx, enum nk_button_behavior behavior)\n{\n    struct nk_config_stack_button_behavior *button_stack;\n    struct nk_config_stack_button_behavior_element *element;\n\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n\n    button_stack = &ctx->stacks.button_behaviors;\n    NK_ASSERT(button_stack->head < (int)NK_LEN(button_stack->elements));\n    if (button_stack->head >= (int)NK_LEN(button_stack->elements))\n        return 0;\n\n    element = &button_stack->elements[button_stack->head++];\n    element->address = &ctx->button_behavior;\n    element->old_value = ctx->button_behavior;\n    ctx->button_behavior = behavior;\n    return 1;\n}\n\nNK_API int\nnk_button_pop_behavior(struct nk_context *ctx)\n{\n    struct nk_config_stack_button_behavior *button_stack;\n    struct nk_config_stack_button_behavior_element *element;\n\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n\n    button_stack = &ctx->stacks.button_behaviors;\n    NK_ASSERT(button_stack->head > 0);\n    if (button_stack->head < 1)\n        return 0;\n\n    element = &button_stack->elements[--button_stack->head];\n    *element->address = element->old_value;\n    return 1;\n}\n\nNK_API int\nnk_button_text_styled(struct nk_context *ctx,\n    const struct nk_style_button *style, const char *title, int len)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(style);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!style || !ctx || !ctx->current || !ctx->current->layout) return 0;\n\n    win = ctx->current;\n    layout = win->layout;\n    state = nk_widget(&bounds, ctx);\n\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    return nk_do_button_text(&ctx->last_widget_state, &win->buffer, bounds,\n                    title, len, style->text_alignment, ctx->button_behavior,\n                    style, in, ctx->style.font);\n}\n\nNK_API int\nnk_button_text(struct nk_context *ctx, const char *title, int len)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n    return nk_button_text_styled(ctx, &ctx->style.button, title, len);\n}\n\nNK_API int nk_button_label_styled(struct nk_context *ctx,\n    const struct nk_style_button *style, const char *title)\n{return nk_button_text_styled(ctx, style, title, nk_strlen(title));}\n\nNK_API int nk_button_label(struct nk_context *ctx, const char *title)\n{return nk_button_text(ctx, title, nk_strlen(title));}\n\nNK_API int\nnk_button_color(struct nk_context *ctx, struct nk_color color)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n    struct nk_style_button button;\n\n    int ret = 0;\n    struct nk_rect bounds;\n    struct nk_rect content;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    layout = win->layout;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n\n    button = ctx->style.button;\n    button.normal = nk_style_item_color(color);\n    button.hover = nk_style_item_color(color);\n    button.active = nk_style_item_color(color);\n    ret = nk_do_button(&ctx->last_widget_state, &win->buffer, bounds,\n                &button, in, ctx->button_behavior, &content);\n    nk_draw_button(&win->buffer, &bounds, ctx->last_widget_state, &button);\n    return ret;\n}\n\nNK_API int\nnk_button_symbol_styled(struct nk_context *ctx,\n    const struct nk_style_button *style, enum nk_symbol_type symbol)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    layout = win->layout;\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    return nk_do_button_symbol(&ctx->last_widget_state, &win->buffer, bounds,\n            symbol, ctx->button_behavior, style, in, ctx->style.font);\n}\n\nNK_API int\nnk_button_symbol(struct nk_context *ctx, enum nk_symbol_type symbol)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n    return nk_button_symbol_styled(ctx, &ctx->style.button, symbol);\n}\n\nNK_API int\nnk_button_image_styled(struct nk_context *ctx, const struct nk_style_button *style,\n    struct nk_image img)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    layout = win->layout;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    return nk_do_button_image(&ctx->last_widget_state, &win->buffer, bounds,\n                img, ctx->button_behavior, style, in);\n}\n\nNK_API int\nnk_button_image(struct nk_context *ctx, struct nk_image img)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n    return nk_button_image_styled(ctx, &ctx->style.button, img);\n}\n\nNK_API int\nnk_button_symbol_text_styled(struct nk_context *ctx,\n    const struct nk_style_button *style, enum nk_symbol_type symbol,\n    const char *text, int len, nk_flags align)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    layout = win->layout;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    return nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, bounds,\n                symbol, text, len, align, ctx->button_behavior,\n                style, ctx->style.font, in);\n}\n\nNK_API int\nnk_button_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol,\n    const char* text, int len, nk_flags align)\n{\n    NK_ASSERT(ctx);\n    if (!ctx) return 0;\n    return nk_button_symbol_text_styled(ctx, &ctx->style.button, symbol, text, len, align);\n}\n\nNK_API int nk_button_symbol_label(struct nk_context *ctx, enum nk_symbol_type symbol,\n    const char *label, nk_flags align)\n{return nk_button_symbol_text(ctx, symbol, label, nk_strlen(label), align);}\n\nNK_API int nk_button_symbol_label_styled(struct nk_context *ctx,\n    const struct nk_style_button *style, enum nk_symbol_type symbol,\n    const char *title, nk_flags align)\n{return nk_button_symbol_text_styled(ctx, style, symbol, title, nk_strlen(title), align);}\n\nNK_API int\nnk_button_image_text_styled(struct nk_context *ctx,\n    const struct nk_style_button *style, struct nk_image img, const char *text,\n    int len, nk_flags align)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    layout = win->layout;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    return nk_do_button_text_image(&ctx->last_widget_state, &win->buffer,\n            bounds, img, text, len, align, ctx->button_behavior,\n            style, ctx->style.font, in);\n}\n\nNK_API int\nnk_button_image_text(struct nk_context *ctx, struct nk_image img,\n    const char *text, int len, nk_flags align)\n{return nk_button_image_text_styled(ctx, &ctx->style.button,img, text, len, align);}\n\n\nNK_API int nk_button_image_label(struct nk_context *ctx, struct nk_image img,\n    const char *label, nk_flags align)\n{return nk_button_image_text(ctx, img, label, nk_strlen(label), align);}\n\nNK_API int nk_button_image_label_styled(struct nk_context *ctx,\n    const struct nk_style_button *style, struct nk_image img,\n    const char *label, nk_flags text_alignment)\n{return nk_button_image_text_styled(ctx, style, img, label, nk_strlen(label), text_alignment);}\n\n/*----------------------------------------------------------------\n *\n *                          SELECTABLE\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_selectable_text(struct nk_context *ctx, const char *str, int len,\n    nk_flags align, int *value)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n    const struct nk_style *style;\n\n    enum nk_widget_layout_states state;\n    struct nk_rect bounds;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(value);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout || !value)\n        return 0;\n\n    win = ctx->current;\n    layout = win->layout;\n    style = &ctx->style;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    return nk_do_selectable(&ctx->last_widget_state, &win->buffer, bounds,\n                str, len, align, value, &style->selectable, in, style->font);\n}\n\nNK_API int\nnk_selectable_image_text(struct nk_context *ctx, struct nk_image img,\n    const char *str, int len, nk_flags align, int *value)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n    const struct nk_style *style;\n\n    enum nk_widget_layout_states state;\n    struct nk_rect bounds;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(value);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout || !value)\n        return 0;\n\n    win = ctx->current;\n    layout = win->layout;\n    style = &ctx->style;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    return nk_do_selectable_image(&ctx->last_widget_state, &win->buffer, bounds,\n                str, len, align, value, &img, &style->selectable, in, style->font);\n}\n\nNK_API int nk_select_text(struct nk_context *ctx, const char *str, int len,\n    nk_flags align, int value)\n{nk_selectable_text(ctx, str, len, align, &value);return value;}\n\nNK_API int nk_selectable_label(struct nk_context *ctx, const char *str, nk_flags align, int *value)\n{return nk_selectable_text(ctx, str, nk_strlen(str), align, value);}\n\nNK_API int nk_selectable_image_label(struct nk_context *ctx,struct nk_image img,\n    const char *str, nk_flags align, int *value)\n{return nk_selectable_image_text(ctx, img, str, nk_strlen(str), align, value);}\n\nNK_API int nk_select_label(struct nk_context *ctx, const char *str, nk_flags align, int value)\n{nk_selectable_text(ctx, str, nk_strlen(str), align, &value);return value;}\n\nNK_API int nk_select_image_label(struct nk_context *ctx, struct nk_image img,\n    const char *str, nk_flags align, int value)\n{nk_selectable_image_text(ctx, img, str, nk_strlen(str), align, &value);return value;}\n\nNK_API int nk_select_image_text(struct nk_context *ctx, struct nk_image img,\n    const char *str, int len, nk_flags align, int value)\n{nk_selectable_image_text(ctx, img, str, len, align, &value);return value;}\n\n/*----------------------------------------------------------------\n *\n *                          CHECKBOX\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_check_text(struct nk_context *ctx, const char *text, int len, int active)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n    const struct nk_style *style;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return active;\n\n    win = ctx->current;\n    style = &ctx->style;\n    layout = win->layout;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return active;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    nk_do_toggle(&ctx->last_widget_state, &win->buffer, bounds, &active,\n        text, len, NK_TOGGLE_CHECK, &style->checkbox, in, style->font);\n    return active;\n}\n\nNK_API unsigned int\nnk_check_flags_text(struct nk_context *ctx, const char *text, int len,\n    unsigned int flags, unsigned int value)\n{\n    int old_active;\n    NK_ASSERT(ctx);\n    NK_ASSERT(text);\n    if (!ctx || !text) return flags;\n    old_active = (int)((flags & value) & value);\n    if (nk_check_text(ctx, text, len, old_active))\n        flags |= value;\n    else flags &= ~value;\n    return flags;\n}\n\nNK_API int\nnk_checkbox_text(struct nk_context *ctx, const char *text, int len, int *active)\n{\n    int old_val;\n    NK_ASSERT(ctx);\n    NK_ASSERT(text);\n    NK_ASSERT(active);\n    if (!ctx || !text || !active) return 0;\n    old_val = *active;\n    *active = nk_check_text(ctx, text, len, *active);\n    return old_val != *active;\n}\n\nNK_API int\nnk_checkbox_flags_text(struct nk_context *ctx, const char *text, int len,\n    unsigned int *flags, unsigned int value)\n{\n    int active;\n    NK_ASSERT(ctx);\n    NK_ASSERT(text);\n    NK_ASSERT(flags);\n    if (!ctx || !text || !flags) return 0;\n\n    active = (int)((*flags & value) & value);\n    if (nk_checkbox_text(ctx, text, len, &active)) {\n        if (active) *flags |= value;\n        else *flags &= ~value;\n        return 1;\n    }\n    return 0;\n}\n\nNK_API int nk_check_label(struct nk_context *ctx, const char *label, int active)\n{return nk_check_text(ctx, label, nk_strlen(label), active);}\n\nNK_API unsigned int nk_check_flags_label(struct nk_context *ctx, const char *label,\n    unsigned int flags, unsigned int value)\n{return nk_check_flags_text(ctx, label, nk_strlen(label), flags, value);}\n\nNK_API int nk_checkbox_label(struct nk_context *ctx, const char *label, int *active)\n{return nk_checkbox_text(ctx, label, nk_strlen(label), active);}\n\nNK_API int nk_checkbox_flags_label(struct nk_context *ctx, const char *label,\n    unsigned int *flags, unsigned int value)\n{return nk_checkbox_flags_text(ctx, label, nk_strlen(label), flags, value);}\n\n/*----------------------------------------------------------------\n *\n *                          OPTION\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_option_text(struct nk_context *ctx, const char *text, int len, int is_active)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_input *in;\n    const struct nk_style *style;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return is_active;\n\n    win = ctx->current;\n    style = &ctx->style;\n    layout = win->layout;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return state;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    nk_do_toggle(&ctx->last_widget_state, &win->buffer, bounds, &is_active,\n        text, len, NK_TOGGLE_OPTION, &style->option, in, style->font);\n    return is_active;\n}\n\nNK_API int\nnk_radio_text(struct nk_context *ctx, const char *text, int len, int *active)\n{\n    int old_value;\n    NK_ASSERT(ctx);\n    NK_ASSERT(text);\n    NK_ASSERT(active);\n    if (!ctx || !text || !active) return 0;\n    old_value = *active;\n    *active = nk_option_text(ctx, text, len, old_value);\n    return old_value != *active;\n}\n\nNK_API int\nnk_option_label(struct nk_context *ctx, const char *label, int active)\n{return nk_option_text(ctx, label, nk_strlen(label), active);}\n\nNK_API int\nnk_radio_label(struct nk_context *ctx, const char *label, int *active)\n{return nk_radio_text(ctx, label, nk_strlen(label), active);}\n\n/*----------------------------------------------------------------\n *\n *                          SLIDER\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_slider_float(struct nk_context *ctx, float min_value, float *value, float max_value,\n    float value_step)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    struct nk_input *in;\n    const struct nk_style *style;\n\n    int ret = 0;\n    float old_value;\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    NK_ASSERT(value);\n    if (!ctx || !ctx->current || !ctx->current->layout || !value)\n        return ret;\n\n    win = ctx->current;\n    style = &ctx->style;\n    layout = win->layout;\n\n    state = nk_widget(&bounds, ctx);\n    if (!state) return ret;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n\n    old_value = *value;\n    *value = nk_do_slider(&ctx->last_widget_state, &win->buffer, bounds, min_value,\n                old_value, max_value, value_step, &style->slider, in, style->font);\n    return (old_value > *value || old_value < *value);\n}\n\nNK_API float\nnk_slide_float(struct nk_context *ctx, float min, float val, float max, float step)\n{\n    nk_slider_float(ctx, min, &val, max, step); return val;\n}\n\nNK_API int\nnk_slide_int(struct nk_context *ctx, int min, int val, int max, int step)\n{\n    float value = (float)val;\n    nk_slider_float(ctx, (float)min, &value, (float)max, (float)step);\n    return (int)value;\n}\n\nNK_API int\nnk_slider_int(struct nk_context *ctx, int min, int *val, int max, int step)\n{\n    int ret;\n    float value = (float)*val;\n    ret = nk_slider_float(ctx, (float)min, &value, (float)max, (float)step);\n    *val =  (int)value;\n    return ret;\n}\n\n/*----------------------------------------------------------------\n *\n *                          PROGRESSBAR\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_progress(struct nk_context *ctx, nk_size *cur, nk_size max, int is_modifyable)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_style *style;\n    const struct nk_input *in;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n    nk_size old_value;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(cur);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout || !cur)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    layout = win->layout;\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    old_value = *cur;\n    *cur = nk_do_progress(&ctx->last_widget_state, &win->buffer, bounds,\n            *cur, max, is_modifyable, &style->progress, in);\n    return (*cur != old_value);\n}\n\nNK_API nk_size nk_prog(struct nk_context *ctx, nk_size cur, nk_size max, int modifyable)\n{nk_progress(ctx, &cur, max, modifyable);return cur;}\n\n/*----------------------------------------------------------------\n *\n *                          EDIT\n *\n * --------------------------------------------------------------*/\nNK_API void\nnk_edit_focus(struct nk_context *ctx, nk_flags flags)\n{\n    nk_hash hash;\n    struct nk_window *win;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return;\n\n    win = ctx->current;\n    hash = win->edit.seq;\n    win->edit.active = nk_true;\n    win->edit.name = hash;\n    if (flags & NK_EDIT_ALWAYS_INSERT_MODE)\n        win->edit.mode = NK_TEXT_EDIT_MODE_INSERT;\n}\n\nNK_API void\nnk_edit_unfocus(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return;\n\n    win = ctx->current;\n    win->edit.active = nk_false;\n    win->edit.name = 0;\n}\n\nNK_API nk_flags\nnk_edit_string(struct nk_context *ctx, nk_flags flags,\n    char *memory, int *len, int max, nk_plugin_filter filter)\n{\n    nk_hash hash;\n    nk_flags state;\n    struct nk_text_edit *edit;\n    struct nk_window *win;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(memory);\n    NK_ASSERT(len);\n    if (!ctx || !memory || !len)\n        return 0;\n\n    filter = (!filter) ? nk_filter_default: filter;\n    win = ctx->current;\n    hash = win->edit.seq;\n    edit = &ctx->text_edit;\n    nk_textedit_clear_state(&ctx->text_edit, (flags & NK_EDIT_MULTILINE)?\n        NK_TEXT_EDIT_MULTI_LINE: NK_TEXT_EDIT_SINGLE_LINE, filter);\n\n    if (win->edit.active && hash == win->edit.name) {\n        if (flags & NK_EDIT_NO_CURSOR)\n            edit->cursor = nk_utf_len(memory, *len);\n        else edit->cursor = win->edit.cursor;\n        if (!(flags & NK_EDIT_SELECTABLE)) {\n            edit->select_start = win->edit.cursor;\n            edit->select_end = win->edit.cursor;\n        } else {\n            edit->select_start = win->edit.sel_start;\n            edit->select_end = win->edit.sel_end;\n        }\n        edit->mode = win->edit.mode;\n        edit->scrollbar.x = (float)win->edit.scrollbar.x;\n        edit->scrollbar.y = (float)win->edit.scrollbar.y;\n        edit->active = nk_true;\n    } else edit->active = nk_false;\n\n    max = NK_MAX(1, max);\n    *len = NK_MIN(*len, max-1);\n    nk_str_init_fixed(&edit->string, memory, (nk_size)max);\n    edit->string.buffer.allocated = (nk_size)*len;\n    edit->string.len = nk_utf_len(memory, *len);\n    state = nk_edit_buffer(ctx, flags, edit, filter);\n    *len = (int)edit->string.buffer.allocated;\n\n    if (edit->active) {\n        win->edit.cursor = edit->cursor;\n        win->edit.sel_start = edit->select_start;\n        win->edit.sel_end = edit->select_end;\n        win->edit.mode = edit->mode;\n        win->edit.scrollbar.x = (nk_ushort)edit->scrollbar.x;\n        win->edit.scrollbar.y = (nk_ushort)edit->scrollbar.y;\n    }\n    return state;\n}\n\nNK_API nk_flags\nnk_edit_buffer(struct nk_context *ctx, nk_flags flags,\n    struct nk_text_edit *edit, nk_plugin_filter filter)\n{\n    struct nk_window *win;\n    struct nk_style *style;\n    struct nk_input *in;\n\n    enum nk_widget_layout_states state;\n    struct nk_rect bounds;\n\n    nk_flags ret_flags = 0;\n    unsigned char prev_state;\n    nk_hash hash;\n\n    /* make sure correct values */\n    NK_ASSERT(ctx);\n    NK_ASSERT(edit);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    state = nk_widget(&bounds, ctx);\n    if (!state) return state;\n    in = (win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n\n    /* check if edit is currently hot item */\n    hash = win->edit.seq++;\n    if (win->edit.active && hash == win->edit.name) {\n        if (flags & NK_EDIT_NO_CURSOR)\n            edit->cursor = edit->string.len;\n        if (!(flags & NK_EDIT_SELECTABLE)) {\n            edit->select_start = edit->cursor;\n            edit->select_end = edit->cursor;\n        }\n        if (flags & NK_EDIT_CLIPBOARD)\n            edit->clip = ctx->clip;\n    }\n\n    filter = (!filter) ? nk_filter_default: filter;\n    prev_state = (unsigned char)edit->active;\n    in = (flags & NK_EDIT_READ_ONLY) ? 0: in;\n    ret_flags = nk_do_edit(&ctx->last_widget_state, &win->buffer, bounds, flags,\n                    filter, edit, &style->edit, in, style->font);\n\n    if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n        ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_TEXT];\n    if (edit->active && prev_state != edit->active) {\n        /* current edit is now hot */\n        win->edit.active = nk_true;\n        win->edit.name = hash;\n    } else if (prev_state && !edit->active) {\n        /* current edit is now cold */\n        win->edit.active = nk_false;\n    }\n    return ret_flags;\n}\n\nNK_API nk_flags\nnk_edit_string_zero_terminated(struct nk_context *ctx, nk_flags flags,\n    char *buffer, int max, nk_plugin_filter filter)\n{\n    nk_flags result;\n    int len = nk_strlen(buffer);\n    result = nk_edit_string(ctx, flags, buffer, &len, max, filter);\n    buffer[NK_MIN(NK_MAX(max-1,0), len)] = '\\0';\n    return result;\n}\n\n/*----------------------------------------------------------------\n *\n *                          PROPERTY\n *\n * --------------------------------------------------------------*/\nNK_INTERN struct nk_property_variant\nnk_property_variant_int(int value, int min_value, int max_value, int step)\n{\n    struct nk_property_variant result;\n    result.kind = NK_PROPERTY_INT;\n    result.value.i = value;\n    result.min_value.i = min_value;\n    result.max_value.i = max_value;\n    result.step.i = step;\n    return result;\n}\n\nNK_INTERN struct nk_property_variant\nnk_property_variant_float(float value, float min_value, float max_value, float step)\n{\n    struct nk_property_variant result;\n    result.kind = NK_PROPERTY_FLOAT;\n    result.value.f = value;\n    result.min_value.f = min_value;\n    result.max_value.f = max_value;\n    result.step.f = step;\n    return result;\n}\n\nNK_INTERN struct nk_property_variant\nnk_property_variant_double(double value, double min_value, double max_value,\n    double step)\n{\n    struct nk_property_variant result;\n    result.kind = NK_PROPERTY_DOUBLE;\n    result.value.d = value;\n    result.min_value.d = min_value;\n    result.max_value.d = max_value;\n    result.step.d = step;\n    return result;\n}\n\nNK_INTERN void\nnk_property(struct nk_context *ctx, const char *name, struct nk_property_variant *variant,\n    float inc_per_pixel, const enum nk_property_filter filter)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    struct nk_input *in;\n    const struct nk_style *style;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states s;\n\n    int *state = 0;\n    nk_hash hash = 0;\n    char *buffer = 0;\n    int *len = 0;\n    int *cursor = 0;\n    int *select_begin = 0;\n    int *select_end = 0;\n    int old_state;\n\n    char dummy_buffer[NK_MAX_NUMBER_BUFFER];\n    int dummy_state = NK_PROPERTY_DEFAULT;\n    int dummy_length = 0;\n    int dummy_cursor = 0;\n    int dummy_select_begin = 0;\n    int dummy_select_end = 0;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    win = ctx->current;\n    layout = win->layout;\n    style = &ctx->style;\n    s = nk_widget(&bounds, ctx);\n    if (!s) return;\n\n    /* calculate hash from name */\n    if (name[0] == '#') {\n        hash = nk_murmur_hash(name, (int)nk_strlen(name), win->property.seq++);\n        name++; /* special number hash */\n    } else hash = nk_murmur_hash(name, (int)nk_strlen(name), 42);\n\n    /* check if property is currently hot item */\n    if (win->property.active && hash == win->property.name) {\n        buffer = win->property.buffer;\n        len = &win->property.length;\n        cursor = &win->property.cursor;\n        state = &win->property.state;\n        select_begin = &win->property.select_start;\n        select_end = &win->property.select_end;\n    } else {\n        buffer = dummy_buffer;\n        len = &dummy_length;\n        cursor = &dummy_cursor;\n        state = &dummy_state;\n        select_begin =  &dummy_select_begin;\n        select_end = &dummy_select_end;\n    }\n\n    /* execute property widget */\n    old_state = *state;\n    ctx->text_edit.clip = ctx->clip;\n    in = ((s == NK_WIDGET_ROM && !win->property.active) ||\n        layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    nk_do_property(&ctx->last_widget_state, &win->buffer, bounds, name,\n        variant, inc_per_pixel, buffer, len, state, cursor, select_begin,\n        select_end, &style->property, filter, in, style->font, &ctx->text_edit,\n        ctx->button_behavior);\n\n    if (in && *state != NK_PROPERTY_DEFAULT && !win->property.active) {\n        /* current property is now hot */\n        win->property.active = 1;\n        NK_MEMCPY(win->property.buffer, buffer, (nk_size)*len);\n        win->property.length = *len;\n        win->property.cursor = *cursor;\n        win->property.state = *state;\n        win->property.name = hash;\n        win->property.select_start = *select_begin;\n        win->property.select_end = *select_end;\n        if (*state == NK_PROPERTY_DRAG) {\n            ctx->input.mouse.grab = nk_true;\n            ctx->input.mouse.grabbed = nk_true;\n        }\n    }\n    /* check if previously active property is now inactive */\n    if (*state == NK_PROPERTY_DEFAULT && old_state != NK_PROPERTY_DEFAULT) {\n        if (old_state == NK_PROPERTY_DRAG) {\n            ctx->input.mouse.grab = nk_false;\n            ctx->input.mouse.grabbed = nk_false;\n            ctx->input.mouse.ungrab = nk_true;\n        }\n        win->property.select_start = 0;\n        win->property.select_end = 0;\n        win->property.active = 0;\n    }\n}\n\nNK_API void\nnk_property_int(struct nk_context *ctx, const char *name,\n    int min, int *val, int max, int step, float inc_per_pixel)\n{\n    struct nk_property_variant variant;\n    NK_ASSERT(ctx);\n    NK_ASSERT(name);\n    NK_ASSERT(val);\n\n    if (!ctx || !ctx->current || !name || !val) return;\n    variant = nk_property_variant_int(*val, min, max, step);\n    nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_INT);\n    *val = variant.value.i;\n}\n\nNK_API void\nnk_property_float(struct nk_context *ctx, const char *name,\n    float min, float *val, float max, float step, float inc_per_pixel)\n{\n    struct nk_property_variant variant;\n    NK_ASSERT(ctx);\n    NK_ASSERT(name);\n    NK_ASSERT(val);\n\n    if (!ctx || !ctx->current || !name || !val) return;\n    variant = nk_property_variant_float(*val, min, max, step);\n    nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT);\n    *val = variant.value.f;\n}\n\nNK_API void\nnk_property_double(struct nk_context *ctx, const char *name,\n    double min, double *val, double max, double step, float inc_per_pixel)\n{\n    struct nk_property_variant variant;\n    NK_ASSERT(ctx);\n    NK_ASSERT(name);\n    NK_ASSERT(val);\n\n    if (!ctx || !ctx->current || !name || !val) return;\n    variant = nk_property_variant_double(*val, min, max, step);\n    nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT);\n    *val = variant.value.d;\n}\n\nNK_API int\nnk_propertyi(struct nk_context *ctx, const char *name, int min, int val,\n    int max, int step, float inc_per_pixel)\n{\n    struct nk_property_variant variant;\n    NK_ASSERT(ctx);\n    NK_ASSERT(name);\n\n    if (!ctx || !ctx->current || !name) return val;\n    variant = nk_property_variant_int(val, min, max, step);\n    nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_INT);\n    val = variant.value.i;\n    return val;\n}\n\nNK_API float\nnk_propertyf(struct nk_context *ctx, const char *name, float min,\n    float val, float max, float step, float inc_per_pixel)\n{\n    struct nk_property_variant variant;\n    NK_ASSERT(ctx);\n    NK_ASSERT(name);\n\n    if (!ctx || !ctx->current || !name) return val;\n    variant = nk_property_variant_float(val, min, max, step);\n    nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT);\n    val = variant.value.f;\n    return val;\n}\n\nNK_API double\nnk_propertyd(struct nk_context *ctx, const char *name, double min,\n    double val, double max, double step, float inc_per_pixel)\n{\n    struct nk_property_variant variant;\n    NK_ASSERT(ctx);\n    NK_ASSERT(name);\n\n    if (!ctx || !ctx->current || !name) return val;\n    variant = nk_property_variant_double(val, min, max, step);\n    nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT);\n    val = variant.value.d;\n    return val;\n}\n\n/*----------------------------------------------------------------\n *\n *                          COLOR PICKER\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_color_pick(struct nk_context * ctx, struct nk_color *color,\n    enum nk_color_format fmt)\n{\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_style *config;\n    const struct nk_input *in;\n\n    enum nk_widget_layout_states state;\n    struct nk_rect bounds;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(color);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout || !color)\n        return 0;\n\n    win = ctx->current;\n    config = &ctx->style;\n    layout = win->layout;\n    state = nk_widget(&bounds, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    return nk_do_color_picker(&ctx->last_widget_state, &win->buffer, color, fmt, bounds,\n                nk_vec2(0,0), in, config->font);\n}\n\nNK_API struct nk_color\nnk_color_picker(struct nk_context *ctx, struct nk_color color,\n    enum nk_color_format fmt)\n{\n    nk_color_pick(ctx, &color, fmt);\n    return color;\n}\n\n/* -------------------------------------------------------------\n *\n *                          CHART\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_chart_begin_colored(struct nk_context *ctx, enum nk_chart_type type,\n    struct nk_color color, struct nk_color highlight,\n    int count, float min_value, float max_value)\n{\n    struct nk_window *win;\n    struct nk_chart *chart;\n    const struct nk_style *config;\n    const struct nk_style_chart *style;\n\n    const struct nk_style_item *background;\n    struct nk_rect bounds = {0, 0, 0, 0};\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n\n    if (!ctx || !ctx->current || !ctx->current->layout) return 0;\n    if (!nk_widget(&bounds, ctx)) {\n        chart = &ctx->current->layout->chart;\n        nk_zero(chart, sizeof(*chart));\n        return 0;\n    }\n\n    win = ctx->current;\n    config = &ctx->style;\n    chart = &win->layout->chart;\n    style = &config->chart;\n\n    /* setup basic generic chart  */\n    nk_zero(chart, sizeof(*chart));\n    chart->x = bounds.x + style->padding.x;\n    chart->y = bounds.y + style->padding.y;\n    chart->w = bounds.w - 2 * style->padding.x;\n    chart->h = bounds.h - 2 * style->padding.y;\n    chart->w = NK_MAX(chart->w, 2 * style->padding.x);\n    chart->h = NK_MAX(chart->h, 2 * style->padding.y);\n\n    /* add first slot into chart */\n    {struct nk_chart_slot *slot = &chart->slots[chart->slot++];\n    slot->type = type;\n    slot->count = count;\n    slot->color = color;\n    slot->highlight = highlight;\n    slot->min = NK_MIN(min_value, max_value);\n    slot->max = NK_MAX(min_value, max_value);\n    slot->range = slot->max - slot->min;}\n\n    /* draw chart background */\n    background = &style->background;\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        nk_draw_image(&win->buffer, bounds, &background->data.image, nk_white);\n    } else {\n        nk_fill_rect(&win->buffer, bounds, style->rounding, style->border_color);\n        nk_fill_rect(&win->buffer, nk_shrink_rect(bounds, style->border),\n            style->rounding, style->background.data.color);\n    }\n    return 1;\n}\n\nNK_API int\nnk_chart_begin(struct nk_context *ctx, const enum nk_chart_type type,\n    int count, float min_value, float max_value)\n{return nk_chart_begin_colored(ctx, type, ctx->style.chart.color, ctx->style.chart.selected_color, count, min_value, max_value);}\n\nNK_API void\nnk_chart_add_slot_colored(struct nk_context *ctx, const enum nk_chart_type type,\n    struct nk_color color, struct nk_color highlight,\n    int count, float min_value, float max_value)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    NK_ASSERT(ctx->current->layout->chart.slot < NK_CHART_MAX_SLOT);\n    if (!ctx || !ctx->current || !ctx->current->layout) return;\n    if (ctx->current->layout->chart.slot >= NK_CHART_MAX_SLOT) return;\n\n    /* add another slot into the graph */\n    {struct nk_chart *chart = &ctx->current->layout->chart;\n    struct nk_chart_slot *slot = &chart->slots[chart->slot++];\n    slot->type = type;\n    slot->count = count;\n    slot->color = color;\n    slot->highlight = highlight;\n    slot->min = NK_MIN(min_value, max_value);\n    slot->max = NK_MAX(min_value, max_value);\n    slot->range = slot->max - slot->min;}\n}\n\nNK_API void\nnk_chart_add_slot(struct nk_context *ctx, const enum nk_chart_type type,\n    int count, float min_value, float max_value)\n{nk_chart_add_slot_colored(ctx, type, ctx->style.chart.color, ctx->style.chart.selected_color, count, min_value, max_value);}\n\nNK_INTERN nk_flags\nnk_chart_push_line(struct nk_context *ctx, struct nk_window *win,\n    struct nk_chart *g, float value, int slot)\n{\n    struct nk_panel *layout = win->layout;\n    const struct nk_input *i = &ctx->input;\n    struct nk_command_buffer *out = &win->buffer;\n\n    nk_flags ret = 0;\n    struct nk_vec2 cur;\n    struct nk_rect bounds;\n    struct nk_color color;\n    float step;\n    float range;\n    float ratio;\n\n    NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT);\n    step = g->w / (float)g->slots[slot].count;\n    range = g->slots[slot].max - g->slots[slot].min;\n    ratio = (value - g->slots[slot].min) / range;\n\n    if (g->slots[slot].index == 0) {\n        /* first data point does not have a connection */\n        g->slots[slot].last.x = g->x;\n        g->slots[slot].last.y = (g->y + g->h) - ratio * (float)g->h;\n\n        bounds.x = g->slots[slot].last.x - 2;\n        bounds.y = g->slots[slot].last.y - 2;\n        bounds.w = bounds.h = 4;\n\n        color = g->slots[slot].color;\n        if (!(layout->flags & NK_WINDOW_ROM) &&\n            NK_INBOX(i->mouse.pos.x,i->mouse.pos.y, g->slots[slot].last.x-3, g->slots[slot].last.y-3, 6, 6)){\n            ret = nk_input_is_mouse_hovering_rect(i, bounds) ? NK_CHART_HOVERING : 0;\n            ret |= (i->mouse.buttons[NK_BUTTON_LEFT].down &&\n                i->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0;\n            color = g->slots[slot].highlight;\n        }\n        nk_fill_rect(out, bounds, 0, color);\n        g->slots[slot].index += 1;\n        return ret;\n    }\n\n    /* draw a line between the last data point and the new one */\n    color = g->slots[slot].color;\n    cur.x = g->x + (float)(step * (float)g->slots[slot].index);\n    cur.y = (g->y + g->h) - (ratio * (float)g->h);\n    nk_stroke_line(out, g->slots[slot].last.x, g->slots[slot].last.y, cur.x, cur.y, 1.0f, color);\n\n    bounds.x = cur.x - 3;\n    bounds.y = cur.y - 3;\n    bounds.w = bounds.h = 6;\n\n    /* user selection of current data point */\n    if (!(layout->flags & NK_WINDOW_ROM)) {\n        if (nk_input_is_mouse_hovering_rect(i, bounds)) {\n            ret = NK_CHART_HOVERING;\n            ret |= (!i->mouse.buttons[NK_BUTTON_LEFT].down &&\n                i->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0;\n            color = g->slots[slot].highlight;\n        }\n    }\n    nk_fill_rect(out, nk_rect(cur.x - 2, cur.y - 2, 4, 4), 0, color);\n\n    /* save current data point position */\n    g->slots[slot].last.x = cur.x;\n    g->slots[slot].last.y = cur.y;\n    g->slots[slot].index  += 1;\n    return ret;\n}\n\nNK_INTERN nk_flags\nnk_chart_push_column(const struct nk_context *ctx, struct nk_window *win,\n    struct nk_chart *chart, float value, int slot)\n{\n    struct nk_command_buffer *out = &win->buffer;\n    const struct nk_input *in = &ctx->input;\n    struct nk_panel *layout = win->layout;\n\n    float ratio;\n    nk_flags ret = 0;\n    struct nk_color color;\n    struct nk_rect item = {0,0,0,0};\n\n    NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT);\n    if (chart->slots[slot].index  >= chart->slots[slot].count)\n        return nk_false;\n    if (chart->slots[slot].count) {\n        float padding = (float)(chart->slots[slot].count-1);\n        item.w = (chart->w - padding) / (float)(chart->slots[slot].count);\n    }\n\n    /* calculate bounds of current bar chart entry */\n    color = chart->slots[slot].color;;\n    item.h = chart->h * NK_ABS((value/chart->slots[slot].range));\n    if (value >= 0) {\n        ratio = (value + NK_ABS(chart->slots[slot].min)) / NK_ABS(chart->slots[slot].range);\n        item.y = (chart->y + chart->h) - chart->h * ratio;\n    } else {\n        ratio = (value - chart->slots[slot].max) / chart->slots[slot].range;\n        item.y = chart->y + (chart->h * NK_ABS(ratio)) - item.h;\n    }\n    item.x = chart->x + ((float)chart->slots[slot].index * item.w);\n    item.x = item.x + ((float)chart->slots[slot].index);\n\n    /* user chart bar selection */\n    if (!(layout->flags & NK_WINDOW_ROM) &&\n        NK_INBOX(in->mouse.pos.x,in->mouse.pos.y,item.x,item.y,item.w,item.h)) {\n        ret = NK_CHART_HOVERING;\n        ret |= (!in->mouse.buttons[NK_BUTTON_LEFT].down &&\n                in->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0;\n        color = chart->slots[slot].highlight;\n    }\n    nk_fill_rect(out, item, 0, color);\n    chart->slots[slot].index += 1;\n    return ret;\n}\n\nNK_API nk_flags\nnk_chart_push_slot(struct nk_context *ctx, float value, int slot)\n{\n    nk_flags flags;\n    struct nk_window *win;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT);\n    NK_ASSERT(slot < ctx->current->layout->chart.slot);\n    if (!ctx || !ctx->current || slot >= NK_CHART_MAX_SLOT) return nk_false;\n    if (slot >= ctx->current->layout->chart.slot) return nk_false;\n\n    win = ctx->current;\n    if (win->layout->chart.slot < slot) return nk_false;\n    switch (win->layout->chart.slots[slot].type) {\n    case NK_CHART_LINES:\n        flags = nk_chart_push_line(ctx, win, &win->layout->chart, value, slot); break;\n    case NK_CHART_COLUMN:\n        flags = nk_chart_push_column(ctx, win, &win->layout->chart, value, slot); break;\n    default:\n    case NK_CHART_MAX:\n        flags = 0;\n    }\n    return flags;\n}\n\nNK_API nk_flags\nnk_chart_push(struct nk_context *ctx, float value)\n{return nk_chart_push_slot(ctx, value, 0);}\n\nNK_API void\nnk_chart_end(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_chart *chart;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current)\n        return;\n\n    win = ctx->current;\n    chart = &win->layout->chart;\n    NK_MEMSET(chart, 0, sizeof(*chart));\n    return;\n}\n\nNK_API void\nnk_plot(struct nk_context *ctx, enum nk_chart_type type, const float *values,\n    int count, int offset)\n{\n    int i = 0;\n    float min_value;\n    float max_value;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(values);\n    if (!ctx || !values || !count) return;\n\n    min_value = values[offset];\n    max_value = values[offset];\n    for (i = 0; i < count; ++i) {\n        min_value = NK_MIN(values[i + offset], min_value);\n        max_value = NK_MAX(values[i + offset], max_value);\n    }\n\n    if (nk_chart_begin(ctx, type, count, min_value, max_value)) {\n        for (i = 0; i < count; ++i)\n            nk_chart_push(ctx, values[i + offset]);\n        nk_chart_end(ctx);\n    }\n}\n\nNK_API void\nnk_plot_function(struct nk_context *ctx, enum nk_chart_type type, void *userdata,\n    float(*value_getter)(void* user, int index), int count, int offset)\n{\n    int i = 0;\n    float min_value;\n    float max_value;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(value_getter);\n    if (!ctx || !value_getter || !count) return;\n\n    max_value = min_value = value_getter(userdata, offset);\n    for (i = 0; i < count; ++i) {\n        float value = value_getter(userdata, i + offset);\n        min_value = NK_MIN(value, min_value);\n        max_value = NK_MAX(value, max_value);\n    }\n\n    if (nk_chart_begin(ctx, type, count, min_value, max_value)) {\n        for (i = 0; i < count; ++i)\n            nk_chart_push(ctx, value_getter(userdata, i + offset));\n        nk_chart_end(ctx);\n    }\n}\n\n/* -------------------------------------------------------------\n *\n *                          GROUP\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_group_scrolled_offset_begin(struct nk_context *ctx,\n    nk_uint *x_offset, nk_uint *y_offset, const char *title, nk_flags flags)\n{\n    struct nk_rect bounds;\n    struct nk_window panel;\n    struct nk_window *win;\n\n    win = ctx->current;\n    nk_panel_alloc_space(&bounds, ctx);\n    {const struct nk_rect *c = &win->layout->clip;\n    if (!NK_INTERSECT(c->x, c->y, c->w, c->h, bounds.x, bounds.y, bounds.w, bounds.h) &&\n        !(flags & NK_WINDOW_MOVABLE)) {\n        return 0;\n    }}\n    if (win->flags & NK_WINDOW_ROM)\n        flags |= NK_WINDOW_ROM;\n\n    /* initialize a fake window to create the panel from */\n    nk_zero(&panel, sizeof(panel));\n    panel.bounds = bounds;\n    panel.flags = flags;\n    panel.scrollbar.x = *x_offset;\n    panel.scrollbar.y = *y_offset;\n    panel.buffer = win->buffer;\n    panel.layout = (struct nk_panel*)nk_create_panel(ctx);\n    ctx->current = &panel;\n    nk_panel_begin(ctx, (flags & NK_WINDOW_TITLE) ? title: 0, NK_PANEL_GROUP);\n\n    win->buffer = panel.buffer;\n    win->buffer.clip = panel.layout->clip;\n    panel.layout->offset_x = x_offset;\n    panel.layout->offset_y = y_offset;\n    panel.layout->parent = win->layout;\n    win->layout = panel.layout;\n\n    ctx->current = win;\n    if ((panel.layout->flags & NK_WINDOW_CLOSED) ||\n        (panel.layout->flags & NK_WINDOW_MINIMIZED))\n    {\n        nk_flags f = panel.layout->flags;\n        nk_group_scrolled_end(ctx);\n        if (f & NK_WINDOW_CLOSED)\n            return NK_WINDOW_CLOSED;\n        if (f & NK_WINDOW_MINIMIZED)\n            return NK_WINDOW_MINIMIZED;\n    }\n    return 1;\n}\n\nNK_API void\nnk_group_scrolled_end(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_panel *parent;\n    struct nk_panel *g;\n\n    struct nk_rect clip;\n    struct nk_window pan;\n    struct nk_vec2 panel_padding;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current)\n        return;\n\n    /* make sure nk_group_begin was called correctly */\n    NK_ASSERT(ctx->current);\n    win = ctx->current;\n    NK_ASSERT(win->layout);\n    g = win->layout;\n    NK_ASSERT(g->parent);\n    parent = g->parent;\n\n    /* dummy window */\n    nk_zero_struct(pan);\n    panel_padding = nk_panel_get_padding(&ctx->style, NK_PANEL_GROUP);\n    pan.bounds.y = g->bounds.y - (g->header_height + g->menu.h);\n    pan.bounds.x = g->bounds.x - panel_padding.x;\n    pan.bounds.w = g->bounds.w + 2 * panel_padding.x;\n    pan.bounds.h = g->bounds.h + g->header_height + g->menu.h;\n    if (g->flags & NK_WINDOW_BORDER) {\n        pan.bounds.x -= g->border;\n        pan.bounds.y -= g->border;\n        pan.bounds.w += 2*g->border;\n        pan.bounds.h += 2*g->border;\n    }\n    if (!(g->flags & NK_WINDOW_NO_SCROLLBAR)) {\n        pan.bounds.w += ctx->style.window.scrollbar_size.x;\n        pan.bounds.h += ctx->style.window.scrollbar_size.y;\n    }\n    pan.scrollbar.x = *g->offset_x;\n    pan.scrollbar.y = *g->offset_y;\n    pan.flags = g->flags;\n    pan.buffer = win->buffer;\n    pan.layout = g;\n    pan.parent = win;\n    ctx->current = &pan;\n\n    /* make sure group has correct clipping rectangle */\n    nk_unify(&clip, &parent->clip, pan.bounds.x, pan.bounds.y,\n        pan.bounds.x + pan.bounds.w, pan.bounds.y + pan.bounds.h + panel_padding.x);\n    nk_push_scissor(&pan.buffer, clip);\n    nk_end(ctx);\n\n    win->buffer = pan.buffer;\n    nk_push_scissor(&win->buffer, parent->clip);\n    ctx->current = win;\n    win->layout = parent;\n    g->bounds = pan.bounds;\n    return;\n}\n\nNK_API int\nnk_group_scrolled_begin(struct nk_context *ctx,\n    struct nk_scroll *scroll, const char *title, nk_flags flags)\n{return nk_group_scrolled_offset_begin(ctx, &scroll->x, &scroll->y, title, flags);}\n\nNK_API int\nnk_group_begin(struct nk_context *ctx, const char *title, nk_flags flags)\n{\n    int title_len;\n    nk_hash title_hash;\n    struct nk_window *win;\n    nk_uint *x_offset;\n    nk_uint *y_offset;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(title);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout || !title)\n        return 0;\n\n    /* find persistent group scrollbar value */\n    win = ctx->current;\n    title_len = (int)nk_strlen(title);\n    title_hash = nk_murmur_hash(title, (int)title_len, NK_PANEL_GROUP);\n    x_offset = nk_find_value(win, title_hash);\n    if (!x_offset) {\n        x_offset = nk_add_value(ctx, win, title_hash, 0);\n        y_offset = nk_add_value(ctx, win, title_hash+1, 0);\n\n        NK_ASSERT(x_offset);\n        NK_ASSERT(y_offset);\n        if (!x_offset || !y_offset) return 0;\n        *x_offset = *y_offset = 0;\n    } else y_offset = nk_find_value(win, title_hash+1);\n    return nk_group_scrolled_offset_begin(ctx, x_offset, y_offset, title, flags);\n}\n\nNK_API void\nnk_group_end(struct nk_context *ctx)\n{nk_group_scrolled_end(ctx);}\n\nNK_API int\nnk_list_view_begin(struct nk_context *ctx, struct nk_list_view *view,\n    const char *title, nk_flags flags, int row_height, int row_count)\n{\n    int title_len;\n    nk_hash title_hash;\n    nk_uint *x_offset;\n    nk_uint *y_offset;\n\n    int result;\n    struct nk_window *win;\n    struct nk_panel *layout;\n    const struct nk_style *style;\n    struct nk_vec2 item_spacing;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(view);\n    NK_ASSERT(title);\n    if (!ctx || !view || !title) return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    item_spacing = style->window.spacing;\n    row_height += NK_MAX(0, (int)item_spacing.y);\n\n    /* find persistent list view scrollbar offset */\n    title_len = (int)nk_strlen(title);\n    title_hash = nk_murmur_hash(title, (int)title_len, NK_PANEL_GROUP);\n    x_offset = nk_find_value(win, title_hash);\n    if (!x_offset) {\n        x_offset = nk_add_value(ctx, win, title_hash, 0);\n        y_offset = nk_add_value(ctx, win, title_hash+1, 0);\n\n        NK_ASSERT(x_offset);\n        NK_ASSERT(y_offset);\n        if (!x_offset || !y_offset) return 0;\n        *x_offset = *y_offset = 0;\n    } else y_offset = nk_find_value(win, title_hash+1);\n    view->scroll_value = *y_offset;\n    view->scroll_pointer = y_offset;\n\n    *y_offset = 0;\n    result = nk_group_scrolled_offset_begin(ctx, x_offset, y_offset, title, flags);\n    win = ctx->current;\n    layout = win->layout;\n\n    view->total_height = row_height * NK_MAX(row_count,1);\n    view->begin = (int)NK_MAX(((float)view->scroll_value / (float)row_height), 0.0f);\n    view->count = (int)NK_MAX(nk_iceilf((layout->clip.h)/(float)row_height), 0);\n    view->end = view->begin + view->count;\n    view->ctx = ctx;\n    return result;\n}\n\nNK_API void\nnk_list_view_end(struct nk_list_view *view)\n{\n    struct nk_context *ctx;\n    struct nk_window *win;\n    struct nk_panel *layout;\n\n    NK_ASSERT(view);\n    NK_ASSERT(view->ctx);\n    NK_ASSERT(view->scroll_pointer);\n    if (!view || !view->ctx) return;\n\n    ctx = view->ctx;\n    win = ctx->current;\n    layout = win->layout;\n    layout->at_y = layout->bounds.y + (float)view->total_height;\n    *view->scroll_pointer = *view->scroll_pointer + view->scroll_value;\n    nk_group_end(view->ctx);\n}\n\n/* --------------------------------------------------------------\n *\n *                          POPUP\n *\n * --------------------------------------------------------------*/\nNK_API int\nnk_popup_begin(struct nk_context *ctx, enum nk_popup_type type,\n    const char *title, nk_flags flags, struct nk_rect rect)\n{\n    struct nk_window *popup;\n    struct nk_window *win;\n    struct nk_panel *panel;\n\n    int title_len;\n    nk_hash title_hash;\n    nk_size allocated;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(title);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    panel = win->layout;\n    NK_ASSERT(!(panel->type & NK_PANEL_SET_POPUP) && \"popups are not allowed to have popups\");\n    (void)panel;\n    title_len = (int)nk_strlen(title);\n    title_hash = nk_murmur_hash(title, (int)title_len, NK_PANEL_POPUP);\n\n    popup = win->popup.win;\n    if (!popup) {\n        popup = (struct nk_window*)nk_create_window(ctx);\n        popup->parent = win;\n        win->popup.win = popup;\n        win->popup.active = 0;\n        win->popup.type = NK_PANEL_POPUP;\n    }\n\n    /* make sure we have correct popup */\n    if (win->popup.name != title_hash) {\n        if (!win->popup.active) {\n            nk_zero(popup, sizeof(*popup));\n            win->popup.name = title_hash;\n            win->popup.active = 1;\n            win->popup.type = NK_PANEL_POPUP;\n        } else return 0;\n    }\n\n    /* popup position is local to window */\n    ctx->current = popup;\n    rect.x += win->layout->clip.x;\n    rect.y += win->layout->clip.y;\n\n    /* setup popup data */\n    popup->parent = win;\n    popup->bounds = rect;\n    popup->seq = ctx->seq;\n    popup->layout = (struct nk_panel*)nk_create_panel(ctx);\n    popup->flags = flags;\n    popup->flags |= NK_WINDOW_BORDER;\n    if (type == NK_POPUP_DYNAMIC)\n        popup->flags |= NK_WINDOW_DYNAMIC;\n\n    popup->buffer = win->buffer;\n    nk_start_popup(ctx, win);\n    allocated = ctx->memory.allocated;\n    nk_push_scissor(&popup->buffer, nk_null_rect);\n\n    if (nk_panel_begin(ctx, title, NK_PANEL_POPUP)) {\n        /* popup is running therefore invalidate parent panels */\n        struct nk_panel *root;\n        root = win->layout;\n        while (root) {\n            root->flags |= NK_WINDOW_ROM;\n            root->flags &= ~(nk_flags)NK_WINDOW_REMOVE_ROM;\n            root = root->parent;\n        }\n        win->popup.active = 1;\n        popup->layout->offset_x = &popup->scrollbar.x;\n        popup->layout->offset_y = &popup->scrollbar.y;\n        popup->layout->parent = win->layout;\n        return 1;\n    } else {\n        /* popup was closed/is invalid so cleanup */\n        struct nk_panel *root;\n        root = win->layout;\n        while (root) {\n            root->flags |= NK_WINDOW_REMOVE_ROM;\n            root = root->parent;\n        }\n        win->popup.buf.active = 0;\n        win->popup.active = 0;\n        ctx->memory.allocated = allocated;\n        ctx->current = win;\n        nk_free_panel(ctx, popup->layout);\n        popup->layout = 0;\n        return 0;\n    }\n}\n\nNK_INTERN int\nnk_nonblock_begin(struct nk_context *ctx,\n    nk_flags flags, struct nk_rect body, struct nk_rect header,\n    enum nk_panel_type panel_type)\n{\n    struct nk_window *popup;\n    struct nk_window *win;\n    struct nk_panel *panel;\n    int is_active = nk_true;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    /* popups cannot have popups */\n    win = ctx->current;\n    panel = win->layout;\n    NK_ASSERT(!(panel->type & NK_PANEL_SET_POPUP));\n    (void)panel;\n    popup = win->popup.win;\n    if (!popup) {\n        /* create window for nonblocking popup */\n        popup = (struct nk_window*)nk_create_window(ctx);\n        popup->parent = win;\n        win->popup.win = popup;\n        win->popup.type = panel_type;\n        nk_command_buffer_init(&popup->buffer, &ctx->memory, NK_CLIPPING_ON);\n    } else {\n        /* close the popup if user pressed outside or in the header */\n        int pressed, in_body, in_header;\n        pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT);\n        in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body);\n        in_header = nk_input_is_mouse_hovering_rect(&ctx->input, header);\n        if (pressed && (!in_body || in_header))\n            is_active = nk_false;\n    }\n    win->popup.header = header;\n\n    if (!is_active) {\n        /* remove read only mode from all parent panels */\n        struct nk_panel *root = win->layout;\n        while (root) {\n            root->flags |= NK_WINDOW_REMOVE_ROM;\n            root = root->parent;\n        }\n        return is_active;\n    }\n\n    popup->bounds = body;\n    popup->parent = win;\n    popup->layout = (struct nk_panel*)nk_create_panel(ctx);\n    popup->flags = flags;\n    popup->flags |= NK_WINDOW_BORDER;\n    popup->flags |= NK_WINDOW_DYNAMIC;\n    popup->seq = ctx->seq;\n    win->popup.active = 1;\n    NK_ASSERT(popup->layout);\n\n    nk_start_popup(ctx, win);\n    popup->buffer = win->buffer;\n    nk_push_scissor(&popup->buffer, nk_null_rect);\n    ctx->current = popup;\n\n    nk_panel_begin(ctx, 0, panel_type);\n    win->buffer = popup->buffer;\n    popup->layout->parent = win->layout;\n    popup->layout->offset_x = &popup->scrollbar.x;\n    popup->layout->offset_y = &popup->scrollbar.y;\n\n    /* set read only mode to all parent panels */\n    {struct nk_panel *root;\n    root = win->layout;\n    while (root) {\n        root->flags |= NK_WINDOW_ROM;\n        root = root->parent;\n    }}\n    return is_active;\n}\n\nNK_API void\nnk_popup_close(struct nk_context *ctx)\n{\n    struct nk_window *popup;\n    NK_ASSERT(ctx);\n    if (!ctx || !ctx->current) return;\n\n    popup = ctx->current;\n    NK_ASSERT(popup->parent);\n    NK_ASSERT(popup->layout->type & NK_PANEL_SET_POPUP);\n    popup->flags |= NK_WINDOW_HIDDEN;\n}\n\nNK_API void\nnk_popup_end(struct nk_context *ctx)\n{\n    struct nk_window *win;\n    struct nk_window *popup;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return;\n\n    popup = ctx->current;\n    if (!popup->parent) return;\n    win = popup->parent;\n    if (popup->flags & NK_WINDOW_HIDDEN) {\n        struct nk_panel *root;\n        root = win->layout;\n        while (root) {\n            root->flags |= NK_WINDOW_REMOVE_ROM;\n            root = root->parent;\n        }\n        win->popup.active = 0;\n    }\n    nk_push_scissor(&popup->buffer, nk_null_rect);\n    nk_end(ctx);\n\n    win->buffer = popup->buffer;\n    nk_finish_popup(ctx, win);\n    ctx->current = win;\n    nk_push_scissor(&win->buffer, win->layout->clip);\n}\n/* -------------------------------------------------------------\n *\n *                          TOOLTIP\n *\n * -------------------------------------------------------------- */\nNK_API int\nnk_tooltip_begin(struct nk_context *ctx, float width)\n{\n    struct nk_window *win;\n    const struct nk_input *in;\n    struct nk_rect bounds;\n    int ret;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    /* make sure that no nonblocking popup is currently active */\n    win = ctx->current;\n    in = &ctx->input;\n    if (win->popup.win && (win->popup.type & NK_PANEL_SET_NONBLOCK))\n        return 0;\n\n    bounds.w = width;\n    bounds.h = nk_null_rect.h;\n    bounds.x = (in->mouse.pos.x + 1) - win->layout->clip.x;\n    bounds.y = (in->mouse.pos.y + 1) - win->layout->clip.y;\n\n    ret = nk_popup_begin(ctx, NK_POPUP_DYNAMIC,\n        \"__##Tooltip##__\", NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER, bounds);\n    if (ret) win->layout->flags &= ~(nk_flags)NK_WINDOW_ROM;\n    win->popup.type = NK_PANEL_TOOLTIP;\n    ctx->current->layout->type = NK_PANEL_TOOLTIP;\n    return ret;\n}\n\nNK_API void\nnk_tooltip_end(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return;\n    ctx->current->seq--;\n    nk_popup_close(ctx);\n    nk_popup_end(ctx);\n}\n\nNK_API void\nnk_tooltip(struct nk_context *ctx, const char *text)\n{\n    const struct nk_style *style;\n    struct nk_vec2 padding;\n\n    int text_len;\n    float text_width;\n    float text_height;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    NK_ASSERT(text);\n    if (!ctx || !ctx->current || !ctx->current->layout || !text)\n        return;\n\n    /* fetch configuration data */\n    style = &ctx->style;\n    padding = style->window.padding;\n\n    /* calculate size of the text and tooltip */\n    text_len = nk_strlen(text);\n    text_width = style->font->width(style->font->userdata,\n                    style->font->height, text, text_len);\n    text_width += (4 * padding.x);\n    text_height = (style->font->height + 2 * padding.y);\n\n    /* execute tooltip and fill with text */\n    if (nk_tooltip_begin(ctx, (float)text_width)) {\n        nk_layout_row_dynamic(ctx, (float)text_height, 1);\n        nk_text(ctx, text, text_len, NK_TEXT_LEFT);\n        nk_tooltip_end(ctx);\n    }\n}\n/* -------------------------------------------------------------\n *\n *                          CONTEXTUAL\n *\n * -------------------------------------------------------------- */\nNK_API int\nnk_contextual_begin(struct nk_context *ctx, nk_flags flags, struct nk_vec2 size,\n    struct nk_rect trigger_bounds)\n{\n    struct nk_window *win;\n    struct nk_window *popup;\n    struct nk_rect body;\n\n    NK_STORAGE const struct nk_rect null_rect = {0,0,0,0};\n    int is_clicked = 0;\n    int is_active = 0;\n    int is_open = 0;\n    int ret = 0;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    ++win->popup.con_count;\n\n    /* check if currently active contextual is active */\n    popup = win->popup.win;\n    is_open = (popup && win->popup.type == NK_PANEL_CONTEXTUAL);\n    is_clicked = nk_input_mouse_clicked(&ctx->input, NK_BUTTON_RIGHT, trigger_bounds);\n    if (win->popup.active_con && win->popup.con_count != win->popup.active_con)\n        return 0;\n    if ((is_clicked && is_open && !is_active) || (!is_open && !is_active && !is_clicked))\n        return 0;\n\n    /* calculate contextual position on click */\n    win->popup.active_con = win->popup.con_count;\n    if (is_clicked) {\n        body.x = ctx->input.mouse.pos.x;\n        body.y = ctx->input.mouse.pos.y;\n    } else {\n        body.x = popup->bounds.x;\n        body.y = popup->bounds.y;\n    }\n    body.w = size.x;\n    body.h = size.y;\n\n    /* start nonblocking contextual popup */\n    ret = nk_nonblock_begin(ctx, flags|NK_WINDOW_NO_SCROLLBAR, body,\n            null_rect, NK_PANEL_CONTEXTUAL);\n    if (ret) win->popup.type = NK_PANEL_CONTEXTUAL;\n    else {\n        win->popup.active_con = 0;\n        if (win->popup.win)\n            win->popup.win->flags = 0;\n    }\n    return ret;\n}\n\nNK_API int\nnk_contextual_item_text(struct nk_context *ctx, const char *text, int len,\n    nk_flags alignment)\n{\n    struct nk_window *win;\n    const struct nk_input *in;\n    const struct nk_style *style;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding);\n    if (!state) return nk_false;\n\n    in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    if (nk_do_button_text(&ctx->last_widget_state, &win->buffer, bounds,\n        text, len, alignment, NK_BUTTON_DEFAULT, &style->contextual_button, in, style->font)) {\n        nk_contextual_close(ctx);\n        return nk_true;\n    }\n    return nk_false;\n}\n\nNK_API int nk_contextual_item_label(struct nk_context *ctx, const char *label, nk_flags align)\n{return nk_contextual_item_text(ctx, label, nk_strlen(label), align);}\n\nNK_API int\nnk_contextual_item_image_text(struct nk_context *ctx, struct nk_image img,\n    const char *text, int len, nk_flags align)\n{\n    struct nk_window *win;\n    const struct nk_input *in;\n    const struct nk_style *style;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding);\n    if (!state) return nk_false;\n\n    in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    if (nk_do_button_text_image(&ctx->last_widget_state, &win->buffer, bounds,\n        img, text, len, align, NK_BUTTON_DEFAULT, &style->contextual_button, style->font, in)){\n        nk_contextual_close(ctx);\n        return nk_true;\n    }\n    return nk_false;\n}\n\nNK_API int nk_contextual_item_image_label(struct nk_context *ctx, struct nk_image img,\n    const char *label, nk_flags align)\n{return nk_contextual_item_image_text(ctx, img, label, nk_strlen(label), align);}\n\nNK_API int\nnk_contextual_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol,\n    const char *text, int len, nk_flags align)\n{\n    struct nk_window *win;\n    const struct nk_input *in;\n    const struct nk_style *style;\n\n    struct nk_rect bounds;\n    enum nk_widget_layout_states state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding);\n    if (!state) return nk_false;\n\n    in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    if (nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, bounds,\n        symbol, text, len, align, NK_BUTTON_DEFAULT, &style->contextual_button, style->font, in)) {\n        nk_contextual_close(ctx);\n        return nk_true;\n    }\n    return nk_false;\n}\n\nNK_API int nk_contextual_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type symbol,\n    const char *text, nk_flags align)\n{return nk_contextual_item_symbol_text(ctx, symbol, text, nk_strlen(text), align);}\n\nNK_API void\nnk_contextual_close(struct nk_context *ctx)\n{\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout) return;\n    nk_popup_close(ctx);\n}\n\nNK_API void\nnk_contextual_end(struct nk_context *ctx)\n{\n    struct nk_window *popup;\n    struct nk_panel *panel;\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !ctx->current) return;\n\n    popup = ctx->current;\n    panel = popup->layout;\n    NK_ASSERT(popup->parent);\n    NK_ASSERT(panel->type & NK_PANEL_SET_POPUP);\n    if (panel->flags & NK_WINDOW_DYNAMIC) {\n        /* Close behavior\n        This is a bit of a hack solution since we do not know before we end our popup\n        how big it will be. We therefore do not directly know when a\n        click outside the non-blocking popup must close it at that direct frame.\n        Instead it will be closed in the next frame.*/\n        struct nk_rect body = {0,0,0,0};\n        if (panel->at_y < (panel->bounds.y + panel->bounds.h)) {\n            struct nk_vec2 padding = nk_panel_get_padding(&ctx->style, panel->type);\n            body = panel->bounds;\n            body.y = (panel->at_y + panel->footer_height + panel->border + padding.y + panel->row.height);\n            body.h = (panel->bounds.y + panel->bounds.h) - body.y;\n        }\n        {int pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT);\n        int in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body);\n        if (pressed && in_body)\n            popup->flags |= NK_WINDOW_HIDDEN;\n        }\n    }\n    if (popup->flags & NK_WINDOW_HIDDEN)\n        popup->seq = 0;\n    nk_popup_end(ctx);\n    return;\n}\n/* -------------------------------------------------------------\n *\n *                          COMBO\n *\n * --------------------------------------------------------------*/\nNK_INTERN int\nnk_combo_begin(struct nk_context *ctx, struct nk_window *win,\n    struct nk_vec2 size, int is_clicked, struct nk_rect header)\n{\n    struct nk_window *popup;\n    int is_open = 0;\n    int is_active = 0;\n    struct nk_rect body;\n    nk_hash hash;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    popup = win->popup.win;\n    body.x = header.x;\n    body.w = size.x;\n    body.y = header.y + header.h-ctx->style.window.combo_border;\n    body.h = size.y;\n\n    hash = win->popup.combo_count++;\n    is_open = (popup) ? nk_true:nk_false;\n    is_active = (popup && (win->popup.name == hash) && win->popup.type == NK_PANEL_COMBO);\n    if ((is_clicked && is_open && !is_active) || (is_open && !is_active) ||\n        (!is_open && !is_active && !is_clicked)) return 0;\n    if (!nk_nonblock_begin(ctx, 0, body,\n        (is_clicked && is_open)?nk_rect(0,0,0,0):header, NK_PANEL_COMBO)) return 0;\n\n    win->popup.type = NK_PANEL_COMBO;\n    win->popup.name = hash;\n    return 1;\n}\n\nNK_API int\nnk_combo_begin_text(struct nk_context *ctx, const char *selected, int len,\n    struct nk_vec2 size)\n{\n    const struct nk_input *in;\n    struct nk_window *win;\n    struct nk_style *style;\n\n    enum nk_widget_layout_states s;\n    int is_clicked = nk_false;\n    struct nk_rect header;\n    const struct nk_style_item *background;\n    struct nk_text text;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(selected);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout || !selected)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    s = nk_widget(&header, ctx);\n    if (s == NK_WIDGET_INVALID)\n        return 0;\n\n    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;\n    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))\n        is_clicked = nk_true;\n\n    /* draw combo box header background and border */\n    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->combo.active;\n        text.text = style->combo.label_active;\n    } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) {\n        background = &style->combo.hover;\n        text.text = style->combo.label_hover;\n    } else {\n        background = &style->combo.normal;\n        text.text = style->combo.label_normal;\n    }\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        text.background = nk_rgba(0,0,0,0);\n        nk_draw_image(&win->buffer, header, &background->data.image, nk_white);\n    } else {\n        text.background = background->data.color;\n        nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);\n        nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);\n    }\n    {\n        /* print currently selected text item */\n        struct nk_rect label;\n        struct nk_rect button;\n        struct nk_rect content;\n\n        enum nk_symbol_type sym;\n        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n            sym = style->combo.sym_hover;\n        else if (is_clicked)\n            sym = style->combo.sym_active;\n        else sym = style->combo.sym_normal;\n\n        /* calculate button */\n        button.w = header.h - 2 * style->combo.button_padding.y;\n        button.x = (header.x + header.w - header.h) - style->combo.button_padding.x;\n        button.y = header.y + style->combo.button_padding.y;\n        button.h = button.w;\n\n        content.x = button.x + style->combo.button.padding.x;\n        content.y = button.y + style->combo.button.padding.y;\n        content.w = button.w - 2 * style->combo.button.padding.x;\n        content.h = button.h - 2 * style->combo.button.padding.y;\n\n        /* draw selected label */\n        text.padding = nk_vec2(0,0);\n        label.x = header.x + style->combo.content_padding.x;\n        label.y = header.y + style->combo.content_padding.y;\n        label.w = button.x - (style->combo.content_padding.x + style->combo.spacing.x) - label.x;;\n        label.h = header.h - 2 * style->combo.content_padding.y;\n        nk_widget_text(&win->buffer, label, selected, len, &text,\n            NK_TEXT_LEFT, ctx->style.font);\n\n        /* draw open/close button */\n        nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state,\n            &ctx->style.combo.button, sym, style->font);\n    }\n    return nk_combo_begin(ctx, win, size, is_clicked, header);\n}\n\nNK_API int nk_combo_begin_label(struct nk_context *ctx, const char *selected, struct nk_vec2 size)\n{return nk_combo_begin_text(ctx, selected, nk_strlen(selected), size);}\n\nNK_API int\nnk_combo_begin_color(struct nk_context *ctx, struct nk_color color, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    struct nk_style *style;\n    const struct nk_input *in;\n\n    struct nk_rect header;\n    int is_clicked = nk_false;\n    enum nk_widget_layout_states s;\n    const struct nk_style_item *background;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    s = nk_widget(&header, ctx);\n    if (s == NK_WIDGET_INVALID)\n        return 0;\n\n    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;\n    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))\n        is_clicked = nk_true;\n\n    /* draw combo box header background and border */\n    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED)\n        background = &style->combo.active;\n    else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n        background = &style->combo.hover;\n    else background = &style->combo.normal;\n\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        nk_draw_image(&win->buffer, header, &background->data.image,nk_white);\n    } else {\n        nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);\n        nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);\n    }\n    {\n        struct nk_rect content;\n        struct nk_rect button;\n        struct nk_rect bounds;\n\n        enum nk_symbol_type sym;\n        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n            sym = style->combo.sym_hover;\n        else if (is_clicked)\n            sym = style->combo.sym_active;\n        else sym = style->combo.sym_normal;\n\n        /* calculate button */\n        button.w = header.h - 2 * style->combo.button_padding.y;\n        button.x = (header.x + header.w - header.h) - style->combo.button_padding.x;\n        button.y = header.y + style->combo.button_padding.y;\n        button.h = button.w;\n\n        content.x = button.x + style->combo.button.padding.x;\n        content.y = button.y + style->combo.button.padding.y;\n        content.w = button.w - 2 * style->combo.button.padding.x;\n        content.h = button.h - 2 * style->combo.button.padding.y;\n\n        /* draw color */\n        bounds.h = header.h - 4 * style->combo.content_padding.y;\n        bounds.y = header.y + 2 * style->combo.content_padding.y;\n        bounds.x = header.x + 2 * style->combo.content_padding.x;\n        bounds.w = (button.x - (style->combo.content_padding.x + style->combo.spacing.x)) - bounds.x;\n        nk_fill_rect(&win->buffer, bounds, 0, color);\n\n        /* draw open/close button */\n        nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state,\n            &ctx->style.combo.button, sym, style->font);\n    }\n    return nk_combo_begin(ctx, win, size, is_clicked, header);\n}\n\nNK_API int\nnk_combo_begin_symbol(struct nk_context *ctx, enum nk_symbol_type symbol, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    struct nk_style *style;\n    const struct nk_input *in;\n\n    struct nk_rect header;\n    int is_clicked = nk_false;\n    enum nk_widget_layout_states s;\n    const struct nk_style_item *background;\n    struct nk_color sym_background;\n    struct nk_color symbol_color;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    s = nk_widget(&header, ctx);\n    if (s == NK_WIDGET_INVALID)\n        return 0;\n\n    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;\n    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))\n        is_clicked = nk_true;\n\n    /* draw combo box header background and border */\n    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->combo.active;\n        symbol_color = style->combo.symbol_active;\n    } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) {\n        background = &style->combo.hover;\n        symbol_color = style->combo.symbol_hover;\n    } else {\n        background = &style->combo.normal;\n        symbol_color = style->combo.symbol_hover;\n    }\n\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        sym_background = nk_rgba(0,0,0,0);\n        nk_draw_image(&win->buffer, header, &background->data.image, nk_white);\n    } else {\n        sym_background = background->data.color;\n        nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);\n        nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);\n    }\n    {\n        struct nk_rect bounds = {0,0,0,0};\n        struct nk_rect content;\n        struct nk_rect button;\n\n        enum nk_symbol_type sym;\n        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n            sym = style->combo.sym_hover;\n        else if (is_clicked)\n            sym = style->combo.sym_active;\n        else sym = style->combo.sym_normal;\n\n        /* calculate button */\n        button.w = header.h - 2 * style->combo.button_padding.y;\n        button.x = (header.x + header.w - header.h) - style->combo.button_padding.y;\n        button.y = header.y + style->combo.button_padding.y;\n        button.h = button.w;\n\n        content.x = button.x + style->combo.button.padding.x;\n        content.y = button.y + style->combo.button.padding.y;\n        content.w = button.w - 2 * style->combo.button.padding.x;\n        content.h = button.h - 2 * style->combo.button.padding.y;\n\n        /* draw symbol */\n        bounds.h = header.h - 2 * style->combo.content_padding.y;\n        bounds.y = header.y + style->combo.content_padding.y;\n        bounds.x = header.x + style->combo.content_padding.x;\n        bounds.w = (button.x - style->combo.content_padding.y) - bounds.x;\n        nk_draw_symbol(&win->buffer, symbol, bounds, sym_background, symbol_color,\n            1.0f, style->font);\n\n        /* draw open/close button */\n        nk_draw_button_symbol(&win->buffer, &bounds, &content, ctx->last_widget_state,\n            &ctx->style.combo.button, sym, style->font);\n    }\n    return nk_combo_begin(ctx, win, size, is_clicked, header);\n}\n\nNK_API int\nnk_combo_begin_symbol_text(struct nk_context *ctx, const char *selected, int len,\n    enum nk_symbol_type symbol, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    struct nk_style *style;\n    struct nk_input *in;\n\n    struct nk_rect header;\n    int is_clicked = nk_false;\n    enum nk_widget_layout_states s;\n    const struct nk_style_item *background;\n    struct nk_color symbol_color;\n    struct nk_text text;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    s = nk_widget(&header, ctx);\n    if (!s) return 0;\n\n    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;\n    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))\n        is_clicked = nk_true;\n\n    /* draw combo box header background and border */\n    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->combo.active;\n        symbol_color = style->combo.symbol_active;\n        text.text = style->combo.label_active;\n    } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) {\n        background = &style->combo.hover;\n        symbol_color = style->combo.symbol_hover;\n        text.text = style->combo.label_hover;\n    } else {\n        background = &style->combo.normal;\n        symbol_color = style->combo.symbol_normal;\n        text.text = style->combo.label_normal;\n    }\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        text.background = nk_rgba(0,0,0,0);\n        nk_draw_image(&win->buffer, header, &background->data.image, nk_white);\n    } else {\n        text.background = background->data.color;\n        nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);\n        nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);\n    }\n    {\n        struct nk_rect content;\n        struct nk_rect button;\n        struct nk_rect label;\n        struct nk_rect image;\n\n        enum nk_symbol_type sym;\n        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n            sym = style->combo.sym_hover;\n        else if (is_clicked)\n            sym = style->combo.sym_active;\n        else sym = style->combo.sym_normal;\n\n        /* calculate button */\n        button.w = header.h - 2 * style->combo.button_padding.y;\n        button.x = (header.x + header.w - header.h) - style->combo.button_padding.x;\n        button.y = header.y + style->combo.button_padding.y;\n        button.h = button.w;\n\n        content.x = button.x + style->combo.button.padding.x;\n        content.y = button.y + style->combo.button.padding.y;\n        content.w = button.w - 2 * style->combo.button.padding.x;\n        content.h = button.h - 2 * style->combo.button.padding.y;\n        nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state,\n            &ctx->style.combo.button, sym, style->font);\n\n        /* draw symbol */\n        image.x = header.x + style->combo.content_padding.x;\n        image.y = header.y + style->combo.content_padding.y;\n        image.h = header.h - 2 * style->combo.content_padding.y;\n        image.w = image.h;\n        nk_draw_symbol(&win->buffer, symbol, image, text.background, symbol_color,\n            1.0f, style->font);\n\n        /* draw label */\n        text.padding = nk_vec2(0,0);\n        label.x = image.x + image.w + style->combo.spacing.x + style->combo.content_padding.x;\n        label.y = header.y + style->combo.content_padding.y;\n        label.w = (button.x - style->combo.content_padding.x) - label.x;\n        label.h = header.h - 2 * style->combo.content_padding.y;\n        nk_widget_text(&win->buffer, label, selected, len, &text, NK_TEXT_LEFT, style->font);\n    }\n    return nk_combo_begin(ctx, win, size, is_clicked, header);\n}\n\nNK_API int\nnk_combo_begin_image(struct nk_context *ctx, struct nk_image img, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    struct nk_style *style;\n    const struct nk_input *in;\n\n    struct nk_rect header;\n    int is_clicked = nk_false;\n    enum nk_widget_layout_states s;\n    const struct nk_style_item *background;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    s = nk_widget(&header, ctx);\n    if (s == NK_WIDGET_INVALID)\n        return 0;\n\n    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;\n    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))\n        is_clicked = nk_true;\n\n    /* draw combo box header background and border */\n    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED)\n        background = &style->combo.active;\n    else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n        background = &style->combo.hover;\n    else background = &style->combo.normal;\n\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        nk_draw_image(&win->buffer, header, &background->data.image, nk_white);\n    } else {\n        nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);\n        nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);\n    }\n    {\n        struct nk_rect bounds = {0,0,0,0};\n        struct nk_rect content;\n        struct nk_rect button;\n\n        enum nk_symbol_type sym;\n        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n            sym = style->combo.sym_hover;\n        else if (is_clicked)\n            sym = style->combo.sym_active;\n        else sym = style->combo.sym_normal;\n\n        /* calculate button */\n        button.w = header.h - 2 * style->combo.button_padding.y;\n        button.x = (header.x + header.w - header.h) - style->combo.button_padding.y;\n        button.y = header.y + style->combo.button_padding.y;\n        button.h = button.w;\n\n        content.x = button.x + style->combo.button.padding.x;\n        content.y = button.y + style->combo.button.padding.y;\n        content.w = button.w - 2 * style->combo.button.padding.x;\n        content.h = button.h - 2 * style->combo.button.padding.y;\n\n        /* draw image */\n        bounds.h = header.h - 2 * style->combo.content_padding.y;\n        bounds.y = header.y + style->combo.content_padding.y;\n        bounds.x = header.x + style->combo.content_padding.x;\n        bounds.w = (button.x - style->combo.content_padding.y) - bounds.x;\n        nk_draw_image(&win->buffer, bounds, &img, nk_white);\n\n        /* draw open/close button */\n        nk_draw_button_symbol(&win->buffer, &bounds, &content, ctx->last_widget_state,\n            &ctx->style.combo.button, sym, style->font);\n    }\n    return nk_combo_begin(ctx, win, size, is_clicked, header);\n}\n\nNK_API int\nnk_combo_begin_image_text(struct nk_context *ctx, const char *selected, int len,\n    struct nk_image img, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    struct nk_style *style;\n    struct nk_input *in;\n\n    struct nk_rect header;\n    int is_clicked = nk_false;\n    enum nk_widget_layout_states s;\n    const struct nk_style_item *background;\n    struct nk_text text;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    style = &ctx->style;\n    s = nk_widget(&header, ctx);\n    if (!s) return 0;\n\n    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;\n    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))\n        is_clicked = nk_true;\n\n    /* draw combo box header background and border */\n    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) {\n        background = &style->combo.active;\n        text.text = style->combo.label_active;\n    } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) {\n        background = &style->combo.hover;\n        text.text = style->combo.label_hover;\n    } else {\n        background = &style->combo.normal;\n        text.text = style->combo.label_normal;\n    }\n    if (background->type == NK_STYLE_ITEM_IMAGE) {\n        text.background = nk_rgba(0,0,0,0);\n        nk_draw_image(&win->buffer, header, &background->data.image, nk_white);\n    } else {\n        text.background = background->data.color;\n        nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);\n        nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);\n    }\n    {\n        struct nk_rect content;\n        struct nk_rect button;\n        struct nk_rect label;\n        struct nk_rect image;\n\n        enum nk_symbol_type sym;\n        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)\n            sym = style->combo.sym_hover;\n        else if (is_clicked)\n            sym = style->combo.sym_active;\n        else sym = style->combo.sym_normal;\n\n        /* calculate button */\n        button.w = header.h - 2 * style->combo.button_padding.y;\n        button.x = (header.x + header.w - header.h) - style->combo.button_padding.x;\n        button.y = header.y + style->combo.button_padding.y;\n        button.h = button.w;\n\n        content.x = button.x + style->combo.button.padding.x;\n        content.y = button.y + style->combo.button.padding.y;\n        content.w = button.w - 2 * style->combo.button.padding.x;\n        content.h = button.h - 2 * style->combo.button.padding.y;\n        nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state,\n            &ctx->style.combo.button, sym, style->font);\n\n        /* draw image */\n        image.x = header.x + style->combo.content_padding.x;\n        image.y = header.y + style->combo.content_padding.y;\n        image.h = header.h - 2 * style->combo.content_padding.y;\n        image.w = image.h;\n        nk_draw_image(&win->buffer, image, &img, nk_white);\n\n        /* draw label */\n        text.padding = nk_vec2(0,0);\n        label.x = image.x + image.w + style->combo.spacing.x + style->combo.content_padding.x;\n        label.y = header.y + style->combo.content_padding.y;\n        label.w = (button.x - style->combo.content_padding.x) - label.x;\n        label.h = header.h - 2 * style->combo.content_padding.y;\n        nk_widget_text(&win->buffer, label, selected, len, &text, NK_TEXT_LEFT, style->font);\n    }\n    return nk_combo_begin(ctx, win, size, is_clicked, header);\n}\n\nNK_API int nk_combo_begin_symbol_label(struct nk_context *ctx,\n    const char *selected, enum nk_symbol_type type, struct nk_vec2 size)\n{return nk_combo_begin_symbol_text(ctx, selected, nk_strlen(selected), type, size);}\n\nNK_API int nk_combo_begin_image_label(struct nk_context *ctx,\n    const char *selected, struct nk_image img, struct nk_vec2 size)\n{return nk_combo_begin_image_text(ctx, selected, nk_strlen(selected), img, size);}\n\nNK_API int nk_combo_item_text(struct nk_context *ctx, const char *text, int len,nk_flags align)\n{return nk_contextual_item_text(ctx, text, len, align);}\n\nNK_API int nk_combo_item_label(struct nk_context *ctx, const char *label, nk_flags align)\n{return nk_contextual_item_label(ctx, label, align);}\n\nNK_API int nk_combo_item_image_text(struct nk_context *ctx, struct nk_image img, const char *text,\n    int len, nk_flags alignment)\n{return nk_contextual_item_image_text(ctx, img, text, len, alignment);}\n\nNK_API int nk_combo_item_image_label(struct nk_context *ctx, struct nk_image img,\n    const char *text, nk_flags alignment)\n{return nk_contextual_item_image_label(ctx, img, text, alignment);}\n\nNK_API int nk_combo_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym,\n    const char *text, int len, nk_flags alignment)\n{return nk_contextual_item_symbol_text(ctx, sym, text, len, alignment);}\n\nNK_API int nk_combo_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym,\n    const char *label, nk_flags alignment)\n{return nk_contextual_item_symbol_label(ctx, sym, label, alignment);}\n\nNK_API void nk_combo_end(struct nk_context *ctx)\n{nk_contextual_end(ctx);}\n\nNK_API void nk_combo_close(struct nk_context *ctx)\n{nk_contextual_close(ctx);}\n\nNK_API int\nnk_combo(struct nk_context *ctx, const char **items, int count,\n    int selected, int item_height, struct nk_vec2 size)\n{\n    int i = 0;\n    int max_height;\n    struct nk_vec2 item_spacing;\n    struct nk_vec2 window_padding;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(items);\n    NK_ASSERT(ctx->current);\n    if (!ctx || !items ||!count)\n        return selected;\n\n    item_spacing = ctx->style.window.spacing;\n    window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type);\n    max_height = count * item_height + count * (int)item_spacing.y;\n    max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2;\n    size.y = NK_MIN(size.y, (float)max_height);\n    if (nk_combo_begin_label(ctx, items[selected], size)) {\n        nk_layout_row_dynamic(ctx, (float)item_height, 1);\n        for (i = 0; i < count; ++i) {\n            if (nk_combo_item_label(ctx, items[i], NK_TEXT_LEFT))\n                selected = i;\n        }\n        nk_combo_end(ctx);\n    }\n    return selected;\n}\n\nNK_API int\nnk_combo_separator(struct nk_context *ctx, const char *items_separated_by_separator,\n    int separator, int selected, int count, int item_height, struct nk_vec2 size)\n{\n    int i;\n    int max_height;\n    struct nk_vec2 item_spacing;\n    struct nk_vec2 window_padding;\n    const char *current_item;\n    const char *iter;\n    int length = 0;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(items_separated_by_separator);\n    if (!ctx || !items_separated_by_separator)\n        return selected;\n\n    /* calculate popup window */\n    item_spacing = ctx->style.window.spacing;\n    window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type);\n    max_height = count * item_height + count * (int)item_spacing.y;\n    max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2;\n    size.y = NK_MIN(size.y, (float)max_height);\n\n    /* find selected item */\n    current_item = items_separated_by_separator;\n    for (i = 0; i < count; ++i) {\n        iter = current_item;\n        while (*iter && *iter != separator) iter++;\n        length = (int)(iter - current_item);\n        if (i == selected) break;\n        current_item = iter + 1;\n    }\n\n    if (nk_combo_begin_text(ctx, current_item, length, size)) {\n        current_item = items_separated_by_separator;\n        nk_layout_row_dynamic(ctx, (float)item_height, 1);\n        for (i = 0; i < count; ++i) {\n            iter = current_item;\n            while (*iter && *iter != separator) iter++;\n            length = (int)(iter - current_item);\n            if (nk_combo_item_text(ctx, current_item, length, NK_TEXT_LEFT))\n                selected = i;\n            current_item = current_item + length + 1;\n        }\n        nk_combo_end(ctx);\n    }\n    return selected;\n}\n\nNK_API int\nnk_combo_string(struct nk_context *ctx, const char *items_separated_by_zeros,\n    int selected, int count, int item_height, struct nk_vec2 size)\n{return nk_combo_separator(ctx, items_separated_by_zeros, '\\0', selected, count, item_height, size);}\n\nNK_API int\nnk_combo_callback(struct nk_context *ctx, void(*item_getter)(void*, int, const char**),\n    void *userdata, int selected, int count, int item_height, struct nk_vec2 size)\n{\n    int i;\n    int max_height;\n    struct nk_vec2 item_spacing;\n    struct nk_vec2 window_padding;\n    const char *item;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(item_getter);\n    if (!ctx || !item_getter)\n        return selected;\n\n    /* calculate popup window */\n    item_spacing = ctx->style.window.spacing;\n    window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type);\n    max_height = count * item_height + count * (int)item_spacing.y;\n    max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2;\n    size.y = NK_MIN(size.y, (float)max_height);\n\n    item_getter(userdata, selected, &item);\n    if (nk_combo_begin_label(ctx, item, size)) {\n        nk_layout_row_dynamic(ctx, (float)item_height, 1);\n        for (i = 0; i < count; ++i) {\n            item_getter(userdata, i, &item);\n            if (nk_combo_item_label(ctx, item, NK_TEXT_LEFT))\n                selected = i;\n        }\n        nk_combo_end(ctx);\n    }\n    return selected;\n}\n\nNK_API void nk_combobox(struct nk_context *ctx, const char **items, int count,\n    int *selected, int item_height, struct nk_vec2 size)\n{*selected = nk_combo(ctx, items, count, *selected, item_height, size);}\n\nNK_API void nk_combobox_string(struct nk_context *ctx, const char *items_separated_by_zeros,\n    int *selected, int count, int item_height, struct nk_vec2 size)\n{*selected = nk_combo_string(ctx, items_separated_by_zeros, *selected, count, item_height, size);}\n\nNK_API void nk_combobox_separator(struct nk_context *ctx, const char *items_separated_by_separator,\n    int separator,int *selected, int count, int item_height, struct nk_vec2 size)\n{*selected = nk_combo_separator(ctx, items_separated_by_separator, separator,\n    *selected, count, item_height, size);}\n\nNK_API void nk_combobox_callback(struct nk_context *ctx,\n    void(*item_getter)(void* data, int id, const char **out_text),\n    void *userdata, int *selected, int count, int item_height, struct nk_vec2 size)\n{*selected = nk_combo_callback(ctx, item_getter, userdata,  *selected, count, item_height, size);}\n\n/*\n * -------------------------------------------------------------\n *\n *                          MENU\n *\n * --------------------------------------------------------------\n */\nNK_INTERN int\nnk_menu_begin(struct nk_context *ctx, struct nk_window *win,\n    const char *id, int is_clicked, struct nk_rect header, struct nk_vec2 size)\n{\n    int is_open = 0;\n    int is_active = 0;\n    struct nk_rect body;\n    struct nk_window *popup;\n    nk_hash hash = nk_murmur_hash(id, (int)nk_strlen(id), NK_PANEL_MENU);\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    body.x = header.x;\n    body.w = size.x;\n    body.y = header.y + header.h;\n    body.h = size.y;\n\n    popup = win->popup.win;\n    is_open = popup ? nk_true : nk_false;\n    is_active = (popup && (win->popup.name == hash) && win->popup.type == NK_PANEL_MENU);\n    if ((is_clicked && is_open && !is_active) || (is_open && !is_active) ||\n        (!is_open && !is_active && !is_clicked)) return 0;\n    if (!nk_nonblock_begin(ctx, NK_WINDOW_NO_SCROLLBAR, body, header, NK_PANEL_MENU))\n        return 0;\n\n    win->popup.type = NK_PANEL_MENU;\n    win->popup.name = hash;\n    return 1;\n}\n\nNK_API int\nnk_menu_begin_text(struct nk_context *ctx, const char *title, int len,\n    nk_flags align, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    const struct nk_input *in;\n    struct nk_rect header;\n    int is_clicked = nk_false;\n    nk_flags state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    state = nk_widget(&header, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || win->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    if (nk_do_button_text(&ctx->last_widget_state, &win->buffer, header,\n        title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in, ctx->style.font))\n        is_clicked = nk_true;\n    return nk_menu_begin(ctx, win, title, is_clicked, header, size);\n}\n\nNK_API int nk_menu_begin_label(struct nk_context *ctx,\n    const char *text, nk_flags align, struct nk_vec2 size)\n{return nk_menu_begin_text(ctx, text, nk_strlen(text), align, size);}\n\nNK_API int\nnk_menu_begin_image(struct nk_context *ctx, const char *id, struct nk_image img,\n    struct nk_vec2 size)\n{\n    struct nk_window *win;\n    struct nk_rect header;\n    const struct nk_input *in;\n    int is_clicked = nk_false;\n    nk_flags state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    state = nk_widget(&header, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    if (nk_do_button_image(&ctx->last_widget_state, &win->buffer, header,\n        img, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in))\n        is_clicked = nk_true;\n    return nk_menu_begin(ctx, win, id, is_clicked, header, size);\n}\n\nNK_API int\nnk_menu_begin_symbol(struct nk_context *ctx, const char *id,\n    enum nk_symbol_type sym, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    const struct nk_input *in;\n    struct nk_rect header;\n    int is_clicked = nk_false;\n    nk_flags state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    state = nk_widget(&header, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    if (nk_do_button_symbol(&ctx->last_widget_state,  &win->buffer, header,\n        sym, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in, ctx->style.font))\n        is_clicked = nk_true;\n    return nk_menu_begin(ctx, win, id, is_clicked, header, size);\n}\n\nNK_API int\nnk_menu_begin_image_text(struct nk_context *ctx, const char *title, int len,\n    nk_flags align, struct nk_image img, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    struct nk_rect header;\n    const struct nk_input *in;\n    int is_clicked = nk_false;\n    nk_flags state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    state = nk_widget(&header, ctx);\n    if (!state) return 0;\n    in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    if (nk_do_button_text_image(&ctx->last_widget_state, &win->buffer,\n        header, img, title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button,\n        ctx->style.font, in))\n        is_clicked = nk_true;\n    return nk_menu_begin(ctx, win, title, is_clicked, header, size);\n}\n\nNK_API int nk_menu_begin_image_label(struct nk_context *ctx,\n    const char *title, nk_flags align, struct nk_image img, struct nk_vec2 size)\n{return nk_menu_begin_image_text(ctx, title, nk_strlen(title), align, img, size);}\n\nNK_API int\nnk_menu_begin_symbol_text(struct nk_context *ctx, const char *title, int len,\n    nk_flags align, enum nk_symbol_type sym, struct nk_vec2 size)\n{\n    struct nk_window *win;\n    struct nk_rect header;\n    const struct nk_input *in;\n    int is_clicked = nk_false;\n    nk_flags state;\n\n    NK_ASSERT(ctx);\n    NK_ASSERT(ctx->current);\n    NK_ASSERT(ctx->current->layout);\n    if (!ctx || !ctx->current || !ctx->current->layout)\n        return 0;\n\n    win = ctx->current;\n    state = nk_widget(&header, ctx);\n    if (!state) return 0;\n\n    in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;\n    if (nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer,\n        header, sym, title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button,\n        ctx->style.font, in)) is_clicked = nk_true;\n    return nk_menu_begin(ctx, win, title, is_clicked, header, size);\n}\n\nNK_API int nk_menu_begin_symbol_label(struct nk_context *ctx,\n    const char *title, nk_flags align, enum nk_symbol_type sym, struct nk_vec2 size )\n{return nk_menu_begin_symbol_text(ctx, title, nk_strlen(title), align,sym,size);}\n\nNK_API int nk_menu_item_text(struct nk_context *ctx, const char *title, int len, nk_flags align)\n{return nk_contextual_item_text(ctx, title, len, align);}\n\nNK_API int nk_menu_item_label(struct nk_context *ctx, const char *label, nk_flags align)\n{return nk_contextual_item_label(ctx, label, align);}\n\nNK_API int nk_menu_item_image_label(struct nk_context *ctx, struct nk_image img,\n    const char *label, nk_flags align)\n{return nk_contextual_item_image_label(ctx, img, label, align);}\n\nNK_API int nk_menu_item_image_text(struct nk_context *ctx, struct nk_image img,\n    const char *text, int len, nk_flags align)\n{return nk_contextual_item_image_text(ctx, img, text, len, align);}\n\nNK_API int nk_menu_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym,\n    const char *text, int len, nk_flags align)\n{return nk_contextual_item_symbol_text(ctx, sym, text, len, align);}\n\nNK_API int nk_menu_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym,\n    const char *label, nk_flags align)\n{return nk_contextual_item_symbol_label(ctx, sym, label, align);}\n\nNK_API void nk_menu_close(struct nk_context *ctx)\n{nk_contextual_close(ctx);}\n\nNK_API void\nnk_menu_end(struct nk_context *ctx)\n{nk_contextual_end(ctx);}\n\n#endif\n"
  },
  {
    "path": "external/GLFW/deps/nuklear_glfw_gl2.h",
    "content": "/*\n * Nuklear - v1.32.0 - public domain\n * no warrenty implied; use at your own risk.\n * authored from 2015-2017 by Micha Mettke\n */\n/*\n * ==============================================================\n *\n *                              API\n *\n * ===============================================================\n */\n#ifndef NK_GLFW_GL2_H_\n#define NK_GLFW_GL2_H_\n\n#include <GLFW/glfw3.h>\n\nenum nk_glfw_init_state{\n    NK_GLFW3_DEFAULT = 0,\n    NK_GLFW3_INSTALL_CALLBACKS\n};\nNK_API struct nk_context*   nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state);\nNK_API void                 nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas);\nNK_API void                 nk_glfw3_font_stash_end(void);\n\nNK_API void                 nk_glfw3_new_frame(void);\nNK_API void                 nk_glfw3_render(enum nk_anti_aliasing);\nNK_API void                 nk_glfw3_shutdown(void);\n\nNK_API void                 nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint);\nNK_API void                 nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);\n\n#endif\n\n/*\n * ==============================================================\n *\n *                          IMPLEMENTATION\n *\n * ===============================================================\n */\n#ifdef NK_GLFW_GL2_IMPLEMENTATION\n\n#ifndef NK_GLFW_TEXT_MAX\n#define NK_GLFW_TEXT_MAX 256\n#endif\n#ifndef NK_GLFW_DOUBLE_CLICK_LO\n#define NK_GLFW_DOUBLE_CLICK_LO 0.02\n#endif\n#ifndef NK_GLFW_DOUBLE_CLICK_HI\n#define NK_GLFW_DOUBLE_CLICK_HI 0.2\n#endif\n\nstruct nk_glfw_device {\n    struct nk_buffer cmds;\n    struct nk_draw_null_texture null;\n    GLuint font_tex;\n};\n\nstruct nk_glfw_vertex {\n    float position[2];\n    float uv[2];\n    nk_byte col[4];\n};\n\nstatic struct nk_glfw {\n    GLFWwindow *win;\n    int width, height;\n    int display_width, display_height;\n    struct nk_glfw_device ogl;\n    struct nk_context ctx;\n    struct nk_font_atlas atlas;\n    struct nk_vec2 fb_scale;\n    unsigned int text[NK_GLFW_TEXT_MAX];\n    int text_len;\n    struct nk_vec2 scroll;\n    double last_button_click;\n} glfw;\n\nNK_INTERN void\nnk_glfw3_device_upload_atlas(const void *image, int width, int height)\n{\n    struct nk_glfw_device *dev = &glfw.ogl;\n    glGenTextures(1, &dev->font_tex);\n    glBindTexture(GL_TEXTURE_2D, dev->font_tex);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0,\n                GL_RGBA, GL_UNSIGNED_BYTE, image);\n}\n\nNK_API void\nnk_glfw3_render(enum nk_anti_aliasing AA)\n{\n    /* setup global state */\n    struct nk_glfw_device *dev = &glfw.ogl;\n    glPushAttrib(GL_ENABLE_BIT|GL_COLOR_BUFFER_BIT|GL_TRANSFORM_BIT);\n    glDisable(GL_CULL_FACE);\n    glDisable(GL_DEPTH_TEST);\n    glEnable(GL_SCISSOR_TEST);\n    glEnable(GL_BLEND);\n    glEnable(GL_TEXTURE_2D);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n    /* setup viewport/project */\n    glViewport(0,0,(GLsizei)glfw.display_width,(GLsizei)glfw.display_height);\n    glMatrixMode(GL_PROJECTION);\n    glPushMatrix();\n    glLoadIdentity();\n    glOrtho(0.0f, glfw.width, glfw.height, 0.0f, -1.0f, 1.0f);\n    glMatrixMode(GL_MODELVIEW);\n    glPushMatrix();\n    glLoadIdentity();\n\n    glEnableClientState(GL_VERTEX_ARRAY);\n    glEnableClientState(GL_TEXTURE_COORD_ARRAY);\n    glEnableClientState(GL_COLOR_ARRAY);\n    {\n        GLsizei vs = sizeof(struct nk_glfw_vertex);\n        size_t vp = offsetof(struct nk_glfw_vertex, position);\n        size_t vt = offsetof(struct nk_glfw_vertex, uv);\n        size_t vc = offsetof(struct nk_glfw_vertex, col);\n\n        /* convert from command queue into draw list and draw to screen */\n        const struct nk_draw_command *cmd;\n        const nk_draw_index *offset = NULL;\n        struct nk_buffer vbuf, ebuf;\n\n        /* fill convert configuration */\n        struct nk_convert_config config;\n        static const struct nk_draw_vertex_layout_element vertex_layout[] = {\n            {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, position)},\n            {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, uv)},\n            {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct nk_glfw_vertex, col)},\n            {NK_VERTEX_LAYOUT_END}\n        };\n        NK_MEMSET(&config, 0, sizeof(config));\n        config.vertex_layout = vertex_layout;\n        config.vertex_size = sizeof(struct nk_glfw_vertex);\n        config.vertex_alignment = NK_ALIGNOF(struct nk_glfw_vertex);\n        config.null = dev->null;\n        config.circle_segment_count = 22;\n        config.curve_segment_count = 22;\n        config.arc_segment_count = 22;\n        config.global_alpha = 1.0f;\n        config.shape_AA = AA;\n        config.line_AA = AA;\n\n        /* convert shapes into vertexes */\n        nk_buffer_init_default(&vbuf);\n        nk_buffer_init_default(&ebuf);\n        nk_convert(&glfw.ctx, &dev->cmds, &vbuf, &ebuf, &config);\n\n        /* setup vertex buffer pointer */\n        {const void *vertices = nk_buffer_memory_const(&vbuf);\n        glVertexPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vp));\n        glTexCoordPointer(2, GL_FLOAT, vs, (const void*)((const nk_byte*)vertices + vt));\n        glColorPointer(4, GL_UNSIGNED_BYTE, vs, (const void*)((const nk_byte*)vertices + vc));}\n\n        /* iterate over and execute each draw command */\n        offset = (const nk_draw_index*)nk_buffer_memory_const(&ebuf);\n        nk_draw_foreach(cmd, &glfw.ctx, &dev->cmds)\n        {\n            if (!cmd->elem_count) continue;\n            glBindTexture(GL_TEXTURE_2D, (GLuint)cmd->texture.id);\n            glScissor(\n                (GLint)(cmd->clip_rect.x * glfw.fb_scale.x),\n                (GLint)((glfw.height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h)) * glfw.fb_scale.y),\n                (GLint)(cmd->clip_rect.w * glfw.fb_scale.x),\n                (GLint)(cmd->clip_rect.h * glfw.fb_scale.y));\n            glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, GL_UNSIGNED_SHORT, offset);\n            offset += cmd->elem_count;\n        }\n        nk_clear(&glfw.ctx);\n        nk_buffer_free(&vbuf);\n        nk_buffer_free(&ebuf);\n    }\n\n    /* default OpenGL state */\n    glDisableClientState(GL_VERTEX_ARRAY);\n    glDisableClientState(GL_TEXTURE_COORD_ARRAY);\n    glDisableClientState(GL_COLOR_ARRAY);\n\n    glDisable(GL_CULL_FACE);\n    glDisable(GL_DEPTH_TEST);\n    glDisable(GL_SCISSOR_TEST);\n    glDisable(GL_BLEND);\n    glDisable(GL_TEXTURE_2D);\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n    glMatrixMode(GL_MODELVIEW);\n    glPopMatrix();\n    glMatrixMode(GL_PROJECTION);\n    glPopMatrix();\n    glPopAttrib();\n}\n\nNK_API void\nnk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint)\n{\n    (void)win;\n    if (glfw.text_len < NK_GLFW_TEXT_MAX)\n        glfw.text[glfw.text_len++] = codepoint;\n}\n\nNK_API void\nnk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)\n{\n    (void)win; (void)xoff;\n    glfw.scroll.x += (float)xoff;\n    glfw.scroll.y += (float)yoff;\n}\n\nNK_API void\nnk_glfw3_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)\n{\n    double x, y;\n    if (button != GLFW_MOUSE_BUTTON_LEFT) return;\n    glfwGetCursorPos(window, &x, &y);\n    if (action == GLFW_PRESS)  {\n        double dt = glfwGetTime() - glfw.last_button_click;\n        if (dt > NK_GLFW_DOUBLE_CLICK_LO && dt < NK_GLFW_DOUBLE_CLICK_HI)\n            nk_input_button(&glfw.ctx, NK_BUTTON_DOUBLE, (int)x, (int)y, nk_true);\n        glfw.last_button_click = glfwGetTime();\n    } else nk_input_button(&glfw.ctx, NK_BUTTON_DOUBLE, (int)x, (int)y, nk_false);\n}\n\nNK_INTERN void\nnk_glfw3_clipbard_paste(nk_handle usr, struct nk_text_edit *edit)\n{\n    const char *text = glfwGetClipboardString(glfw.win);\n    if (text) nk_textedit_paste(edit, text, nk_strlen(text));\n    (void)usr;\n}\n\nNK_INTERN void\nnk_glfw3_clipbard_copy(nk_handle usr, const char *text, int len)\n{\n    char *str = 0;\n    (void)usr;\n    if (!len) return;\n    str = (char*)malloc((size_t)len+1);\n    if (!str) return;\n    NK_MEMCPY(str, text, (size_t)len);\n    str[len] = '\\0';\n    glfwSetClipboardString(glfw.win, str);\n    free(str);\n}\n\nNK_API struct nk_context*\nnk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state init_state)\n{\n    glfw.win = win;\n    if (init_state == NK_GLFW3_INSTALL_CALLBACKS) {\n        glfwSetScrollCallback(win, nk_gflw3_scroll_callback);\n        glfwSetCharCallback(win, nk_glfw3_char_callback);\n        glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);\n    }\n    nk_init_default(&glfw.ctx, 0);\n    glfw.ctx.clip.copy = nk_glfw3_clipbard_copy;\n    glfw.ctx.clip.paste = nk_glfw3_clipbard_paste;\n    glfw.ctx.clip.userdata = nk_handle_ptr(0);\n    nk_buffer_init_default(&glfw.ogl.cmds);\n    return &glfw.ctx;\n}\n\nNK_API void\nnk_glfw3_font_stash_begin(struct nk_font_atlas **atlas)\n{\n    nk_font_atlas_init_default(&glfw.atlas);\n    nk_font_atlas_begin(&glfw.atlas);\n    *atlas = &glfw.atlas;\n}\n\nNK_API void\nnk_glfw3_font_stash_end(void)\n{\n    const void *image; int w, h;\n    image = nk_font_atlas_bake(&glfw.atlas, &w, &h, NK_FONT_ATLAS_RGBA32);\n    nk_glfw3_device_upload_atlas(image, w, h);\n    nk_font_atlas_end(&glfw.atlas, nk_handle_id((int)glfw.ogl.font_tex), &glfw.ogl.null);\n    if (glfw.atlas.default_font)\n        nk_style_set_font(&glfw.ctx, &glfw.atlas.default_font->handle);\n}\n\nNK_API void\nnk_glfw3_new_frame(void)\n{\n    int i;\n    double x, y;\n    struct nk_context *ctx = &glfw.ctx;\n    struct GLFWwindow *win = glfw.win;\n\n    glfwGetWindowSize(win, &glfw.width, &glfw.height);\n    glfwGetFramebufferSize(win, &glfw.display_width, &glfw.display_height);\n    glfw.fb_scale.x = (float)glfw.display_width/(float)glfw.width;\n    glfw.fb_scale.y = (float)glfw.display_height/(float)glfw.height;\n\n    nk_input_begin(ctx);\n    for (i = 0; i < glfw.text_len; ++i)\n        nk_input_unicode(ctx, glfw.text[i]);\n\n    /* optional grabbing behavior */\n    if (ctx->input.mouse.grab)\n        glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);\n    else if (ctx->input.mouse.ungrab)\n        glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_NORMAL);\n\n    nk_input_key(ctx, NK_KEY_DEL, glfwGetKey(win, GLFW_KEY_DELETE) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_ENTER, glfwGetKey(win, GLFW_KEY_ENTER) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_TAB, glfwGetKey(win, GLFW_KEY_TAB) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_BACKSPACE, glfwGetKey(win, GLFW_KEY_BACKSPACE) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_UP, glfwGetKey(win, GLFW_KEY_UP) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_DOWN, glfwGetKey(win, GLFW_KEY_DOWN) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_TEXT_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_TEXT_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_SCROLL_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_SCROLL_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_SCROLL_DOWN, glfwGetKey(win, GLFW_KEY_PAGE_DOWN) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_SCROLL_UP, glfwGetKey(win, GLFW_KEY_PAGE_UP) == GLFW_PRESS);\n    nk_input_key(ctx, NK_KEY_SHIFT, glfwGetKey(win, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS||\n                                    glfwGetKey(win, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);\n\n    if (glfwGetKey(win, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS ||\n        glfwGetKey(win, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {\n        nk_input_key(ctx, NK_KEY_COPY, glfwGetKey(win, GLFW_KEY_C) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_PASTE, glfwGetKey(win, GLFW_KEY_V) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_CUT, glfwGetKey(win, GLFW_KEY_X) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_TEXT_UNDO, glfwGetKey(win, GLFW_KEY_Z) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_TEXT_REDO, glfwGetKey(win, GLFW_KEY_R) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_TEXT_LINE_START, glfwGetKey(win, GLFW_KEY_B) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_TEXT_LINE_END, glfwGetKey(win, GLFW_KEY_E) == GLFW_PRESS);\n    } else {\n        nk_input_key(ctx, NK_KEY_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);\n        nk_input_key(ctx, NK_KEY_COPY, 0);\n        nk_input_key(ctx, NK_KEY_PASTE, 0);\n        nk_input_key(ctx, NK_KEY_CUT, 0);\n        nk_input_key(ctx, NK_KEY_SHIFT, 0);\n    }\n\n    glfwGetCursorPos(win, &x, &y);\n    nk_input_motion(ctx, (int)x, (int)y);\n    if (ctx->input.mouse.grabbed) {\n        glfwSetCursorPos(glfw.win, ctx->input.mouse.prev.x, ctx->input.mouse.prev.y);\n        ctx->input.mouse.pos.x = ctx->input.mouse.prev.x;\n        ctx->input.mouse.pos.y = ctx->input.mouse.prev.y;\n    }\n\n    nk_input_button(ctx, NK_BUTTON_LEFT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS);\n    nk_input_button(ctx, NK_BUTTON_MIDDLE, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS);\n    nk_input_button(ctx, NK_BUTTON_RIGHT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS);\n    nk_input_scroll(ctx, glfw.scroll);\n    nk_input_end(&glfw.ctx);\n    glfw.text_len = 0;\n    glfw.scroll = nk_vec2(0,0);\n}\n\nNK_API\nvoid nk_glfw3_shutdown(void)\n{\n    struct nk_glfw_device *dev = &glfw.ogl;\n    nk_font_atlas_clear(&glfw.atlas);\n    nk_free(&glfw.ctx);\n    glDeleteTextures(1, &dev->font_tex);\n    nk_buffer_free(&dev->cmds);\n    NK_MEMSET(&glfw, 0, sizeof(glfw));\n}\n\n#endif\n"
  },
  {
    "path": "external/GLFW/deps/stb_image_write.h",
    "content": "/* stb_image_write - v1.02 - public domain - http://nothings.org/stb/stb_image_write.h\n   writes out PNG/BMP/TGA images to C stdio - Sean Barrett 2010-2015\n                                     no warranty implied; use at your own risk\n\n   Before #including,\n\n       #define STB_IMAGE_WRITE_IMPLEMENTATION\n\n   in the file that you want to have the implementation.\n\n   Will probably not work correctly with strict-aliasing optimizations.\n\nABOUT:\n\n   This header file is a library for writing images to C stdio. It could be\n   adapted to write to memory or a general streaming interface; let me know.\n\n   The PNG output is not optimal; it is 20-50% larger than the file\n   written by a decent optimizing implementation. This library is designed\n   for source code compactness and simplicity, not optimal image file size\n   or run-time performance.\n\nBUILDING:\n\n   You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h.\n   You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace\n   malloc,realloc,free.\n   You can define STBIW_MEMMOVE() to replace memmove()\n\nUSAGE:\n\n   There are four functions, one for each image file format:\n\n     int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);\n     int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);\n     int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);\n     int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);\n\n   There are also four equivalent functions that use an arbitrary write function. You are\n   expected to open/close your file-equivalent before and after calling these:\n\n     int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);\n     int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\n     int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\n     int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);\n\n   where the callback is:\n      void stbi_write_func(void *context, void *data, int size);\n\n   You can define STBI_WRITE_NO_STDIO to disable the file variant of these\n   functions, so the library will not use stdio.h at all. However, this will\n   also disable HDR writing, because it requires stdio for formatted output.\n\n   Each function returns 0 on failure and non-0 on success.\n\n   The functions create an image file defined by the parameters. The image\n   is a rectangle of pixels stored from left-to-right, top-to-bottom.\n   Each pixel contains 'comp' channels of data stored interleaved with 8-bits\n   per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is\n   monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall.\n   The *data pointer points to the first byte of the top-left-most pixel.\n   For PNG, \"stride_in_bytes\" is the distance in bytes from the first byte of\n   a row of pixels to the first byte of the next row of pixels.\n\n   PNG creates output files with the same number of components as the input.\n   The BMP format expands Y to RGB in the file format and does not\n   output alpha.\n\n   PNG supports writing rectangles of data even when the bytes storing rows of\n   data are not consecutive in memory (e.g. sub-rectangles of a larger image),\n   by supplying the stride between the beginning of adjacent rows. The other\n   formats do not. (Thus you cannot write a native-format BMP through the BMP\n   writer, both because it is in BGR order and because it may have padding\n   at the end of the line.)\n\n   HDR expects linear float data. Since the format is always 32-bit rgb(e)\n   data, alpha (if provided) is discarded, and for monochrome data it is\n   replicated across all three channels.\n\n   TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed\n   data, set the global variable 'stbi_write_tga_with_rle' to 0.\n\nCREDITS:\n\n   PNG/BMP/TGA\n      Sean Barrett\n   HDR\n      Baldur Karlsson\n   TGA monochrome:\n      Jean-Sebastien Guay\n   misc enhancements:\n      Tim Kelsey\n   TGA RLE\n      Alan Hickman\n   initial file IO callback implementation\n      Emmanuel Julien\n   bugfixes:\n      github:Chribba\n      Guillaume Chereau\n      github:jry2\n      github:romigrou\n      Sergio Gonzalez\n      Jonas Karlsson\n      Filip Wasil\n      Thatcher Ulrich\n      \nLICENSE\n\nThis software is dual-licensed to the public domain and under the following\nlicense: you are granted a perpetual, irrevocable license to copy, modify,\npublish, and distribute this file as you see fit.\n\n*/\n\n#ifndef INCLUDE_STB_IMAGE_WRITE_H\n#define INCLUDE_STB_IMAGE_WRITE_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef STB_IMAGE_WRITE_STATIC\n#define STBIWDEF static\n#else\n#define STBIWDEF extern\nextern int stbi_write_tga_with_rle;\n#endif\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void  *data, int stride_in_bytes);\nSTBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);\n#endif\n\ntypedef void stbi_write_func(void *context, void *data, int size);\n\nSTBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);\nSTBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif//INCLUDE_STB_IMAGE_WRITE_H\n\n#ifdef STB_IMAGE_WRITE_IMPLEMENTATION\n\n#ifdef _WIN32\n   #ifndef _CRT_SECURE_NO_WARNINGS\n   #define _CRT_SECURE_NO_WARNINGS\n   #endif\n   #ifndef _CRT_NONSTDC_NO_DEPRECATE\n   #define _CRT_NONSTDC_NO_DEPRECATE\n   #endif\n#endif\n\n#ifndef STBI_WRITE_NO_STDIO\n#include <stdio.h>\n#endif // STBI_WRITE_NO_STDIO\n\n#include <stdarg.h>\n#include <stdlib.h>\n#include <string.h>\n#include <math.h>\n\n#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED))\n// ok\n#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED)\n// ok\n#else\n#error \"Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED).\"\n#endif\n\n#ifndef STBIW_MALLOC\n#define STBIW_MALLOC(sz)        malloc(sz)\n#define STBIW_REALLOC(p,newsz)  realloc(p,newsz)\n#define STBIW_FREE(p)           free(p)\n#endif\n\n#ifndef STBIW_REALLOC_SIZED\n#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz)\n#endif\n\n\n#ifndef STBIW_MEMMOVE\n#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz)\n#endif\n\n\n#ifndef STBIW_ASSERT\n#include <assert.h>\n#define STBIW_ASSERT(x) assert(x)\n#endif\n\n#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff)\n\ntypedef struct\n{\n   stbi_write_func *func;\n   void *context;\n} stbi__write_context;\n\n// initialize a callback-based context\nstatic void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context)\n{\n   s->func    = c;\n   s->context = context;\n}\n\n#ifndef STBI_WRITE_NO_STDIO\n\nstatic void stbi__stdio_write(void *context, void *data, int size)\n{\n   fwrite(data,1,size,(FILE*) context);\n}\n\nstatic int stbi__start_write_file(stbi__write_context *s, const char *filename)\n{\n   FILE *f = fopen(filename, \"wb\");\n   stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f);\n   return f != NULL;\n}\n\nstatic void stbi__end_write_file(stbi__write_context *s)\n{\n   fclose((FILE *)s->context);\n}\n\n#endif // !STBI_WRITE_NO_STDIO\n\ntypedef unsigned int stbiw_uint32;\ntypedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1];\n\n#ifdef STB_IMAGE_WRITE_STATIC\nstatic int stbi_write_tga_with_rle = 1;\n#else\nint stbi_write_tga_with_rle = 1;\n#endif\n\nstatic void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v)\n{\n   while (*fmt) {\n      switch (*fmt++) {\n         case ' ': break;\n         case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int));\n                     s->func(s->context,&x,1);\n                     break; }\n         case '2': { int x = va_arg(v,int);\n                     unsigned char b[2];\n                     b[0] = STBIW_UCHAR(x);\n                     b[1] = STBIW_UCHAR(x>>8);\n                     s->func(s->context,b,2);\n                     break; }\n         case '4': { stbiw_uint32 x = va_arg(v,int);\n                     unsigned char b[4];\n                     b[0]=STBIW_UCHAR(x);\n                     b[1]=STBIW_UCHAR(x>>8);\n                     b[2]=STBIW_UCHAR(x>>16);\n                     b[3]=STBIW_UCHAR(x>>24);\n                     s->func(s->context,b,4);\n                     break; }\n         default:\n            STBIW_ASSERT(0);\n            return;\n      }\n   }\n}\n\nstatic void stbiw__writef(stbi__write_context *s, const char *fmt, ...)\n{\n   va_list v;\n   va_start(v, fmt);\n   stbiw__writefv(s, fmt, v);\n   va_end(v);\n}\n\nstatic void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c)\n{\n   unsigned char arr[3];\n   arr[0] = a, arr[1] = b, arr[2] = c;\n   s->func(s->context, arr, 3);\n}\n\nstatic void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d)\n{\n   unsigned char bg[3] = { 255, 0, 255}, px[3];\n   int k;\n\n   if (write_alpha < 0)\n      s->func(s->context, &d[comp - 1], 1);\n\n   switch (comp) {\n      case 1:\n         s->func(s->context,d,1);\n         break;\n      case 2:\n         if (expand_mono)\n            stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp\n         else\n            s->func(s->context, d, 1);  // monochrome TGA\n         break;\n      case 4:\n         if (!write_alpha) {\n            // composite against pink background\n            for (k = 0; k < 3; ++k)\n               px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255;\n            stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]);\n            break;\n         }\n         /* FALLTHROUGH */\n      case 3:\n         stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]);\n         break;\n   }\n   if (write_alpha > 0)\n      s->func(s->context, &d[comp - 1], 1);\n}\n\nstatic void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono)\n{\n   stbiw_uint32 zero = 0;\n   int i,j, j_end;\n\n   if (y <= 0)\n      return;\n\n   if (vdir < 0)\n      j_end = -1, j = y-1;\n   else\n      j_end =  y, j = 0;\n\n   for (; j != j_end; j += vdir) {\n      for (i=0; i < x; ++i) {\n         unsigned char *d = (unsigned char *) data + (j*x+i)*comp;\n         stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d);\n      }\n      s->func(s->context, &zero, scanline_pad);\n   }\n}\n\nstatic int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...)\n{\n   if (y < 0 || x < 0) {\n      return 0;\n   } else {\n      va_list v;\n      va_start(v, fmt);\n      stbiw__writefv(s, fmt, v);\n      va_end(v);\n      stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono);\n      return 1;\n   }\n}\n\nstatic int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data)\n{\n   int pad = (-x*3) & 3;\n   return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad,\n           \"11 4 22 4\" \"4 44 22 444444\",\n           'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40,  // file header\n            40, x,y, 1,24, 0,0,0,0,0,0);             // bitmap header\n}\n\nSTBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_bmp_core(&s, x, y, comp, data);\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_bmp_core(&s, x, y, comp, data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif //!STBI_WRITE_NO_STDIO\n\nstatic int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data)\n{\n   int has_alpha = (comp == 2 || comp == 4);\n   int colorbytes = has_alpha ? comp-1 : comp;\n   int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3\n\n   if (y < 0 || x < 0)\n      return 0;\n\n   if (!stbi_write_tga_with_rle) {\n      return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0,\n         \"111 221 2222 11\", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8);\n   } else {\n      int i,j,k;\n\n      stbiw__writef(s, \"111 221 2222 11\", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8);\n\n      for (j = y - 1; j >= 0; --j) {\n          unsigned char *row = (unsigned char *) data + j * x * comp;\n         int len;\n\n         for (i = 0; i < x; i += len) {\n            unsigned char *begin = row + i * comp;\n            int diff = 1;\n            len = 1;\n\n            if (i < x - 1) {\n               ++len;\n               diff = memcmp(begin, row + (i + 1) * comp, comp);\n               if (diff) {\n                  const unsigned char *prev = begin;\n                  for (k = i + 2; k < x && len < 128; ++k) {\n                     if (memcmp(prev, row + k * comp, comp)) {\n                        prev += comp;\n                        ++len;\n                     } else {\n                        --len;\n                        break;\n                     }\n                  }\n               } else {\n                  for (k = i + 2; k < x && len < 128; ++k) {\n                     if (!memcmp(begin, row + k * comp, comp)) {\n                        ++len;\n                     } else {\n                        break;\n                     }\n                  }\n               }\n            }\n\n            if (diff) {\n               unsigned char header = STBIW_UCHAR(len - 1);\n               s->func(s->context, &header, 1);\n               for (k = 0; k < len; ++k) {\n                  stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp);\n               }\n            } else {\n               unsigned char header = STBIW_UCHAR(len - 129);\n               s->func(s->context, &header, 1);\n               stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin);\n            }\n         }\n      }\n   }\n   return 1;\n}\n\nint stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_tga_core(&s, x, y, comp, (void *) data);\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nint stbi_write_tga(char const *filename, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_tga_core(&s, x, y, comp, (void *) data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif\n\n// *************************************************************************************************\n// Radiance RGBE HDR writer\n// by Baldur Karlsson\n#ifndef STBI_WRITE_NO_STDIO\n\n#define stbiw__max(a, b)  ((a) > (b) ? (a) : (b))\n\nvoid stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)\n{\n   int exponent;\n   float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2]));\n\n   if (maxcomp < 1e-32f) {\n      rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;\n   } else {\n      float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp;\n\n      rgbe[0] = (unsigned char)(linear[0] * normalize);\n      rgbe[1] = (unsigned char)(linear[1] * normalize);\n      rgbe[2] = (unsigned char)(linear[2] * normalize);\n      rgbe[3] = (unsigned char)(exponent + 128);\n   }\n}\n\nvoid stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte)\n{\n   unsigned char lengthbyte = STBIW_UCHAR(length+128);\n   STBIW_ASSERT(length+128 <= 255);\n   s->func(s->context, &lengthbyte, 1);\n   s->func(s->context, &databyte, 1);\n}\n\nvoid stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data)\n{\n   unsigned char lengthbyte = STBIW_UCHAR(length);\n   STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code\n   s->func(s->context, &lengthbyte, 1);\n   s->func(s->context, data, length);\n}\n\nvoid stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline)\n{\n   unsigned char scanlineheader[4] = { 2, 2, 0, 0 };\n   unsigned char rgbe[4];\n   float linear[3];\n   int x;\n\n   scanlineheader[2] = (width&0xff00)>>8;\n   scanlineheader[3] = (width&0x00ff);\n\n   /* skip RLE for images too small or large */\n   if (width < 8 || width >= 32768) {\n      for (x=0; x < width; x++) {\n         switch (ncomp) {\n            case 4: /* fallthrough */\n            case 3: linear[2] = scanline[x*ncomp + 2];\n                    linear[1] = scanline[x*ncomp + 1];\n                    linear[0] = scanline[x*ncomp + 0];\n                    break;\n            default:\n                    linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];\n                    break;\n         }\n         stbiw__linear_to_rgbe(rgbe, linear);\n         s->func(s->context, rgbe, 4);\n      }\n   } else {\n      int c,r;\n      /* encode into scratch buffer */\n      for (x=0; x < width; x++) {\n         switch(ncomp) {\n            case 4: /* fallthrough */\n            case 3: linear[2] = scanline[x*ncomp + 2];\n                    linear[1] = scanline[x*ncomp + 1];\n                    linear[0] = scanline[x*ncomp + 0];\n                    break;\n            default:\n                    linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];\n                    break;\n         }\n         stbiw__linear_to_rgbe(rgbe, linear);\n         scratch[x + width*0] = rgbe[0];\n         scratch[x + width*1] = rgbe[1];\n         scratch[x + width*2] = rgbe[2];\n         scratch[x + width*3] = rgbe[3];\n      }\n\n      s->func(s->context, scanlineheader, 4);\n\n      /* RLE each component separately */\n      for (c=0; c < 4; c++) {\n         unsigned char *comp = &scratch[width*c];\n\n         x = 0;\n         while (x < width) {\n            // find first run\n            r = x;\n            while (r+2 < width) {\n               if (comp[r] == comp[r+1] && comp[r] == comp[r+2])\n                  break;\n               ++r;\n            }\n            if (r+2 >= width)\n               r = width;\n            // dump up to first run\n            while (x < r) {\n               int len = r-x;\n               if (len > 128) len = 128;\n               stbiw__write_dump_data(s, len, &comp[x]);\n               x += len;\n            }\n            // if there's a run, output it\n            if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd\n               // find next byte after run\n               while (r < width && comp[r] == comp[x])\n                  ++r;\n               // output run up to r\n               while (x < r) {\n                  int len = r-x;\n                  if (len > 127) len = 127;\n                  stbiw__write_run_data(s, len, comp[x]);\n                  x += len;\n               }\n            }\n         }\n      }\n   }\n}\n\nstatic int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data)\n{\n   if (y <= 0 || x <= 0 || data == NULL)\n      return 0;\n   else {\n      // Each component is stored separately. Allocate scratch space for full output scanline.\n      unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4);\n      int i, len;\n      char buffer[128];\n      char header[] = \"#?RADIANCE\\n# Written by stb_image_write.h\\nFORMAT=32-bit_rle_rgbe\\n\";\n      s->func(s->context, header, sizeof(header)-1);\n\n      len = sprintf(buffer, \"EXPOSURE=          1.0000000000000\\n\\n-Y %d +X %d\\n\", y, x);\n      s->func(s->context, buffer, len);\n\n      for(i=0; i < y; i++)\n         stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*i*x);\n      STBIW_FREE(scratch);\n      return 1;\n   }\n}\n\nint stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_hdr_core(&s, x, y, comp, (float *) data);\n}\n\nint stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif // STBI_WRITE_NO_STDIO\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// PNG writer\n//\n\n// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()\n#define stbiw__sbraw(a) ((int *) (a) - 2)\n#define stbiw__sbm(a)   stbiw__sbraw(a)[0]\n#define stbiw__sbn(a)   stbiw__sbraw(a)[1]\n\n#define stbiw__sbneedgrow(a,n)  ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a))\n#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0)\n#define stbiw__sbgrow(a,n)  stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a)))\n\n#define stbiw__sbpush(a, v)      (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v))\n#define stbiw__sbcount(a)        ((a) ? stbiw__sbn(a) : 0)\n#define stbiw__sbfree(a)         ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0)\n\nstatic void *stbiw__sbgrowf(void **arr, int increment, int itemsize)\n{\n   int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1;\n   void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2);\n   STBIW_ASSERT(p);\n   if (p) {\n      if (!*arr) ((int *) p)[1] = 0;\n      *arr = (void *) ((int *) p + 2);\n      stbiw__sbm(*arr) = m;\n   }\n   return *arr;\n}\n\nstatic unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount)\n{\n   while (*bitcount >= 8) {\n      stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer));\n      *bitbuffer >>= 8;\n      *bitcount -= 8;\n   }\n   return data;\n}\n\nstatic int stbiw__zlib_bitrev(int code, int codebits)\n{\n   int res=0;\n   while (codebits--) {\n      res = (res << 1) | (code & 1);\n      code >>= 1;\n   }\n   return res;\n}\n\nstatic unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit)\n{\n   int i;\n   for (i=0; i < limit && i < 258; ++i)\n      if (a[i] != b[i]) break;\n   return i;\n}\n\nstatic unsigned int stbiw__zhash(unsigned char *data)\n{\n   stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16);\n   hash ^= hash << 3;\n   hash += hash >> 5;\n   hash ^= hash << 4;\n   hash += hash >> 17;\n   hash ^= hash << 25;\n   hash += hash >> 6;\n   return hash;\n}\n\n#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount))\n#define stbiw__zlib_add(code,codebits) \\\n      (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush())\n#define stbiw__zlib_huffa(b,c)  stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c)\n// default huffman tables\n#define stbiw__zlib_huff1(n)  stbiw__zlib_huffa(0x30 + (n), 8)\n#define stbiw__zlib_huff2(n)  stbiw__zlib_huffa(0x190 + (n)-144, 9)\n#define stbiw__zlib_huff3(n)  stbiw__zlib_huffa(0 + (n)-256,7)\n#define stbiw__zlib_huff4(n)  stbiw__zlib_huffa(0xc0 + (n)-280,8)\n#define stbiw__zlib_huff(n)  ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n))\n#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n))\n\n#define stbiw__ZHASH   16384\n\nunsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality)\n{\n   static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 };\n   static unsigned char  lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5,  0 };\n   static unsigned short distc[]   = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 };\n   static unsigned char  disteb[]  = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };\n   unsigned int bitbuf=0;\n   int i,j, bitcount=0;\n   unsigned char *out = NULL;\n   unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(char**));\n   if (quality < 5) quality = 5;\n\n   stbiw__sbpush(out, 0x78);   // DEFLATE 32K window\n   stbiw__sbpush(out, 0x5e);   // FLEVEL = 1\n   stbiw__zlib_add(1,1);  // BFINAL = 1\n   stbiw__zlib_add(1,2);  // BTYPE = 1 -- fixed huffman\n\n   for (i=0; i < stbiw__ZHASH; ++i)\n      hash_table[i] = NULL;\n\n   i=0;\n   while (i < data_len-3) {\n      // hash next 3 bytes of data to be compressed\n      int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3;\n      unsigned char *bestloc = 0;\n      unsigned char **hlist = hash_table[h];\n      int n = stbiw__sbcount(hlist);\n      for (j=0; j < n; ++j) {\n         if (hlist[j]-data > i-32768) { // if entry lies within window\n            int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i);\n            if (d >= best) best=d,bestloc=hlist[j];\n         }\n      }\n      // when hash table entry is too long, delete half the entries\n      if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) {\n         STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality);\n         stbiw__sbn(hash_table[h]) = quality;\n      }\n      stbiw__sbpush(hash_table[h],data+i);\n\n      if (bestloc) {\n         // \"lazy matching\" - check match at *next* byte, and if it's better, do cur byte as literal\n         h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1);\n         hlist = hash_table[h];\n         n = stbiw__sbcount(hlist);\n         for (j=0; j < n; ++j) {\n            if (hlist[j]-data > i-32767) {\n               int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1);\n               if (e > best) { // if next match is better, bail on current match\n                  bestloc = NULL;\n                  break;\n               }\n            }\n         }\n      }\n\n      if (bestloc) {\n         int d = (int) (data+i - bestloc); // distance back\n         STBIW_ASSERT(d <= 32767 && best <= 258);\n         for (j=0; best > lengthc[j+1]-1; ++j);\n         stbiw__zlib_huff(j+257);\n         if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]);\n         for (j=0; d > distc[j+1]-1; ++j);\n         stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5);\n         if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]);\n         i += best;\n      } else {\n         stbiw__zlib_huffb(data[i]);\n         ++i;\n      }\n   }\n   // write out final bytes\n   for (;i < data_len; ++i)\n      stbiw__zlib_huffb(data[i]);\n   stbiw__zlib_huff(256); // end of block\n   // pad with 0 bits to byte boundary\n   while (bitcount)\n      stbiw__zlib_add(0,1);\n\n   for (i=0; i < stbiw__ZHASH; ++i)\n      (void) stbiw__sbfree(hash_table[i]);\n   STBIW_FREE(hash_table);\n\n   {\n      // compute adler32 on input\n      unsigned int s1=1, s2=0;\n      int blocklen = (int) (data_len % 5552);\n      j=0;\n      while (j < data_len) {\n         for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1;\n         s1 %= 65521, s2 %= 65521;\n         j += blocklen;\n         blocklen = 5552;\n      }\n      stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8));\n      stbiw__sbpush(out, STBIW_UCHAR(s2));\n      stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8));\n      stbiw__sbpush(out, STBIW_UCHAR(s1));\n   }\n   *out_len = stbiw__sbn(out);\n   // make returned pointer freeable\n   STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len);\n   return (unsigned char *) stbiw__sbraw(out);\n}\n\nstatic unsigned int stbiw__crc32(unsigned char *buffer, int len)\n{\n   static unsigned int crc_table[256] =\n   {\n      0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n      0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n      0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n      0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n      0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n      0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n      0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n      0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n      0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n      0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n      0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n      0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n      0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n      0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n      0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n      0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n      0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n      0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n      0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n      0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n      0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n      0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n      0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n      0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n      0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n      0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n      0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n      0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n      0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n      0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n      0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n      0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\n   };\n\n   unsigned int crc = ~0u;\n   int i;\n   for (i=0; i < len; ++i)\n      crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)];\n   return ~crc;\n}\n\n#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4)\n#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v));\n#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3])\n\nstatic void stbiw__wpcrc(unsigned char **data, int len)\n{\n   unsigned int crc = stbiw__crc32(*data - len - 4, len+4);\n   stbiw__wp32(*data, crc);\n}\n\nstatic unsigned char stbiw__paeth(int a, int b, int c)\n{\n   int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c);\n   if (pa <= pb && pa <= pc) return STBIW_UCHAR(a);\n   if (pb <= pc) return STBIW_UCHAR(b);\n   return STBIW_UCHAR(c);\n}\n\nunsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len)\n{\n   int ctype[5] = { -1, 0, 4, 2, 6 };\n   unsigned char sig[8] = { 137,80,78,71,13,10,26,10 };\n   unsigned char *out,*o, *filt, *zlib;\n   signed char *line_buffer;\n   int i,j,k,p,zlen;\n\n   if (stride_bytes == 0)\n      stride_bytes = x * n;\n\n   filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0;\n   line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; }\n   for (j=0; j < y; ++j) {\n      static int mapping[] = { 0,1,2,3,4 };\n      static int firstmap[] = { 0,1,0,5,6 };\n      int *mymap = j ? mapping : firstmap;\n      int best = 0, bestval = 0x7fffffff;\n      for (p=0; p < 2; ++p) {\n         for (k= p?best:0; k < 5; ++k) {\n            int type = mymap[k],est=0;\n            unsigned char *z = pixels + stride_bytes*j;\n            for (i=0; i < n; ++i)\n               switch (type) {\n                  case 0: line_buffer[i] = z[i]; break;\n                  case 1: line_buffer[i] = z[i]; break;\n                  case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;\n                  case 3: line_buffer[i] = z[i] - (z[i-stride_bytes]>>1); break;\n                  case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-stride_bytes],0)); break;\n                  case 5: line_buffer[i] = z[i]; break;\n                  case 6: line_buffer[i] = z[i]; break;\n               }\n            for (i=n; i < x*n; ++i) {\n               switch (type) {\n                  case 0: line_buffer[i] = z[i]; break;\n                  case 1: line_buffer[i] = z[i] - z[i-n]; break;\n                  case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;\n                  case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-stride_bytes])>>1); break;\n                  case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-stride_bytes], z[i-stride_bytes-n]); break;\n                  case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break;\n                  case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break;\n               }\n            }\n            if (p) break;\n            for (i=0; i < x*n; ++i)\n               est += abs((signed char) line_buffer[i]);\n            if (est < bestval) { bestval = est; best = k; }\n         }\n      }\n      // when we get here, best contains the filter type, and line_buffer contains the data\n      filt[j*(x*n+1)] = (unsigned char) best;\n      STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n);\n   }\n   STBIW_FREE(line_buffer);\n   zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); // increase 8 to get smaller but use more memory\n   STBIW_FREE(filt);\n   if (!zlib) return 0;\n\n   // each tag requires 12 bytes of overhead\n   out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12);\n   if (!out) return 0;\n   *out_len = 8 + 12+13 + 12+zlen + 12;\n\n   o=out;\n   STBIW_MEMMOVE(o,sig,8); o+= 8;\n   stbiw__wp32(o, 13); // header length\n   stbiw__wptag(o, \"IHDR\");\n   stbiw__wp32(o, x);\n   stbiw__wp32(o, y);\n   *o++ = 8;\n   *o++ = STBIW_UCHAR(ctype[n]);\n   *o++ = 0;\n   *o++ = 0;\n   *o++ = 0;\n   stbiw__wpcrc(&o,13);\n\n   stbiw__wp32(o, zlen);\n   stbiw__wptag(o, \"IDAT\");\n   STBIW_MEMMOVE(o, zlib, zlen);\n   o += zlen;\n   STBIW_FREE(zlib);\n   stbiw__wpcrc(&o, zlen);\n\n   stbiw__wp32(o,0);\n   stbiw__wptag(o, \"IEND\");\n   stbiw__wpcrc(&o,0);\n\n   STBIW_ASSERT(o == out + *out_len);\n\n   return out;\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes)\n{\n   FILE *f;\n   int len;\n   unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);\n   if (png == NULL) return 0;\n   f = fopen(filename, \"wb\");\n   if (!f) { STBIW_FREE(png); return 0; }\n   fwrite(png, 1, len, f);\n   fclose(f);\n   STBIW_FREE(png);\n   return 1;\n}\n#endif\n\nSTBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes)\n{\n   int len;\n   unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);\n   if (png == NULL) return 0;\n   func(context, png, len);\n   STBIW_FREE(png);\n   return 1;\n}\n\n#endif // STB_IMAGE_WRITE_IMPLEMENTATION\n\n/* Revision history\n      1.02 (2016-04-02)\n             avoid allocating large structures on the stack\n      1.01 (2016-01-16)\n             STBIW_REALLOC_SIZED: support allocators with no realloc support\n             avoid race-condition in crc initialization\n             minor compile issues\n      1.00 (2015-09-14)\n             installable file IO function\n      0.99 (2015-09-13)\n             warning fixes; TGA rle support\n      0.98 (2015-04-08)\n             added STBIW_MALLOC, STBIW_ASSERT etc\n      0.97 (2015-01-18)\n             fixed HDR asserts, rewrote HDR rle logic\n      0.96 (2015-01-17)\n             add HDR output\n             fix monochrome BMP\n      0.95 (2014-08-17)\n\t\t       add monochrome TGA output\n      0.94 (2014-05-31)\n             rename private functions to avoid conflicts with stb_image.h\n      0.93 (2014-05-27)\n             warning fixes\n      0.92 (2010-08-01)\n             casts to unsigned char to fix warnings\n      0.91 (2010-07-17)\n             first public release\n      0.90   first internal release\n*/\n"
  },
  {
    "path": "external/GLFW/deps/tinycthread.c",
    "content": "/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; -*-\nCopyright (c) 2012 Marcus Geelnard\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n    1. The origin of this software must not be misrepresented; you must not\n    claim that you wrote the original software. If you use this software\n    in a product, an acknowledgment in the product documentation would be\n    appreciated but is not required.\n\n    2. Altered source versions must be plainly marked as such, and must not be\n    misrepresented as being the original software.\n\n    3. This notice may not be removed or altered from any source\n    distribution.\n*/\n\n/* 2013-01-06 Camilla Löwy <elmindreda@glfw.org>\n *\n * Added casts from time_t to DWORD to avoid warnings on VC++.\n * Fixed time retrieval on POSIX systems.\n */\n\n#include \"tinycthread.h\"\n#include <stdlib.h>\n\n/* Platform specific includes */\n#if defined(_TTHREAD_POSIX_)\n  #include <signal.h>\n  #include <sched.h>\n  #include <unistd.h>\n  #include <sys/time.h>\n  #include <errno.h>\n#elif defined(_TTHREAD_WIN32_)\n  #include <process.h>\n  #include <sys/timeb.h>\n#endif\n\n/* Standard, good-to-have defines */\n#ifndef NULL\n  #define NULL (void*)0\n#endif\n#ifndef TRUE\n  #define TRUE 1\n#endif\n#ifndef FALSE\n  #define FALSE 0\n#endif\n\nint mtx_init(mtx_t *mtx, int type)\n{\n#if defined(_TTHREAD_WIN32_)\n  mtx->mAlreadyLocked = FALSE;\n  mtx->mRecursive = type & mtx_recursive;\n  InitializeCriticalSection(&mtx->mHandle);\n  return thrd_success;\n#else\n  int ret;\n  pthread_mutexattr_t attr;\n  pthread_mutexattr_init(&attr);\n  if (type & mtx_recursive)\n  {\n    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);\n  }\n  ret = pthread_mutex_init(mtx, &attr);\n  pthread_mutexattr_destroy(&attr);\n  return ret == 0 ? thrd_success : thrd_error;\n#endif\n}\n\nvoid mtx_destroy(mtx_t *mtx)\n{\n#if defined(_TTHREAD_WIN32_)\n  DeleteCriticalSection(&mtx->mHandle);\n#else\n  pthread_mutex_destroy(mtx);\n#endif\n}\n\nint mtx_lock(mtx_t *mtx)\n{\n#if defined(_TTHREAD_WIN32_)\n  EnterCriticalSection(&mtx->mHandle);\n  if (!mtx->mRecursive)\n  {\n    while(mtx->mAlreadyLocked) Sleep(1000); /* Simulate deadlock... */\n    mtx->mAlreadyLocked = TRUE;\n  }\n  return thrd_success;\n#else\n  return pthread_mutex_lock(mtx) == 0 ? thrd_success : thrd_error;\n#endif\n}\n\nint mtx_timedlock(mtx_t *mtx, const struct timespec *ts)\n{\n  /* FIXME! */\n  (void)mtx;\n  (void)ts;\n  return thrd_error;\n}\n\nint mtx_trylock(mtx_t *mtx)\n{\n#if defined(_TTHREAD_WIN32_)\n  int ret = TryEnterCriticalSection(&mtx->mHandle) ? thrd_success : thrd_busy;\n  if ((!mtx->mRecursive) && (ret == thrd_success) && mtx->mAlreadyLocked)\n  {\n    LeaveCriticalSection(&mtx->mHandle);\n    ret = thrd_busy;\n  }\n  return ret;\n#else\n  return (pthread_mutex_trylock(mtx) == 0) ? thrd_success : thrd_busy;\n#endif\n}\n\nint mtx_unlock(mtx_t *mtx)\n{\n#if defined(_TTHREAD_WIN32_)\n  mtx->mAlreadyLocked = FALSE;\n  LeaveCriticalSection(&mtx->mHandle);\n  return thrd_success;\n#else\n  return pthread_mutex_unlock(mtx) == 0 ? thrd_success : thrd_error;;\n#endif\n}\n\n#if defined(_TTHREAD_WIN32_)\n#define _CONDITION_EVENT_ONE 0\n#define _CONDITION_EVENT_ALL 1\n#endif\n\nint cnd_init(cnd_t *cond)\n{\n#if defined(_TTHREAD_WIN32_)\n  cond->mWaitersCount = 0;\n\n  /* Init critical section */\n  InitializeCriticalSection(&cond->mWaitersCountLock);\n\n  /* Init events */\n  cond->mEvents[_CONDITION_EVENT_ONE] = CreateEvent(NULL, FALSE, FALSE, NULL);\n  if (cond->mEvents[_CONDITION_EVENT_ONE] == NULL)\n  {\n    cond->mEvents[_CONDITION_EVENT_ALL] = NULL;\n    return thrd_error;\n  }\n  cond->mEvents[_CONDITION_EVENT_ALL] = CreateEvent(NULL, TRUE, FALSE, NULL);\n  if (cond->mEvents[_CONDITION_EVENT_ALL] == NULL)\n  {\n    CloseHandle(cond->mEvents[_CONDITION_EVENT_ONE]);\n    cond->mEvents[_CONDITION_EVENT_ONE] = NULL;\n    return thrd_error;\n  }\n\n  return thrd_success;\n#else\n  return pthread_cond_init(cond, NULL) == 0 ? thrd_success : thrd_error;\n#endif\n}\n\nvoid cnd_destroy(cnd_t *cond)\n{\n#if defined(_TTHREAD_WIN32_)\n  if (cond->mEvents[_CONDITION_EVENT_ONE] != NULL)\n  {\n    CloseHandle(cond->mEvents[_CONDITION_EVENT_ONE]);\n  }\n  if (cond->mEvents[_CONDITION_EVENT_ALL] != NULL)\n  {\n    CloseHandle(cond->mEvents[_CONDITION_EVENT_ALL]);\n  }\n  DeleteCriticalSection(&cond->mWaitersCountLock);\n#else\n  pthread_cond_destroy(cond);\n#endif\n}\n\nint cnd_signal(cnd_t *cond)\n{\n#if defined(_TTHREAD_WIN32_)\n  int haveWaiters;\n\n  /* Are there any waiters? */\n  EnterCriticalSection(&cond->mWaitersCountLock);\n  haveWaiters = (cond->mWaitersCount > 0);\n  LeaveCriticalSection(&cond->mWaitersCountLock);\n\n  /* If we have any waiting threads, send them a signal */\n  if(haveWaiters)\n  {\n    if (SetEvent(cond->mEvents[_CONDITION_EVENT_ONE]) == 0)\n    {\n      return thrd_error;\n    }\n  }\n\n  return thrd_success;\n#else\n  return pthread_cond_signal(cond) == 0 ? thrd_success : thrd_error;\n#endif\n}\n\nint cnd_broadcast(cnd_t *cond)\n{\n#if defined(_TTHREAD_WIN32_)\n  int haveWaiters;\n\n  /* Are there any waiters? */\n  EnterCriticalSection(&cond->mWaitersCountLock);\n  haveWaiters = (cond->mWaitersCount > 0);\n  LeaveCriticalSection(&cond->mWaitersCountLock);\n\n  /* If we have any waiting threads, send them a signal */\n  if(haveWaiters)\n  {\n    if (SetEvent(cond->mEvents[_CONDITION_EVENT_ALL]) == 0)\n    {\n      return thrd_error;\n    }\n  }\n\n  return thrd_success;\n#else\n  return pthread_cond_signal(cond) == 0 ? thrd_success : thrd_error;\n#endif\n}\n\n#if defined(_TTHREAD_WIN32_)\nstatic int _cnd_timedwait_win32(cnd_t *cond, mtx_t *mtx, DWORD timeout)\n{\n  int result, lastWaiter;\n\n  /* Increment number of waiters */\n  EnterCriticalSection(&cond->mWaitersCountLock);\n  ++ cond->mWaitersCount;\n  LeaveCriticalSection(&cond->mWaitersCountLock);\n\n  /* Release the mutex while waiting for the condition (will decrease\n     the number of waiters when done)... */\n  mtx_unlock(mtx);\n\n  /* Wait for either event to become signaled due to cnd_signal() or\n     cnd_broadcast() being called */\n  result = WaitForMultipleObjects(2, cond->mEvents, FALSE, timeout);\n  if (result == WAIT_TIMEOUT)\n  {\n    return thrd_timeout;\n  }\n  else if (result == (int)WAIT_FAILED)\n  {\n    return thrd_error;\n  }\n\n  /* Check if we are the last waiter */\n  EnterCriticalSection(&cond->mWaitersCountLock);\n  -- cond->mWaitersCount;\n  lastWaiter = (result == (WAIT_OBJECT_0 + _CONDITION_EVENT_ALL)) &&\n               (cond->mWaitersCount == 0);\n  LeaveCriticalSection(&cond->mWaitersCountLock);\n\n  /* If we are the last waiter to be notified to stop waiting, reset the event */\n  if (lastWaiter)\n  {\n    if (ResetEvent(cond->mEvents[_CONDITION_EVENT_ALL]) == 0)\n    {\n      return thrd_error;\n    }\n  }\n\n  /* Re-acquire the mutex */\n  mtx_lock(mtx);\n\n  return thrd_success;\n}\n#endif\n\nint cnd_wait(cnd_t *cond, mtx_t *mtx)\n{\n#if defined(_TTHREAD_WIN32_)\n  return _cnd_timedwait_win32(cond, mtx, INFINITE);\n#else\n  return pthread_cond_wait(cond, mtx) == 0 ? thrd_success : thrd_error;\n#endif\n}\n\nint cnd_timedwait(cnd_t *cond, mtx_t *mtx, const struct timespec *ts)\n{\n#if defined(_TTHREAD_WIN32_)\n  struct timespec now;\n  if (clock_gettime(CLOCK_REALTIME, &now) == 0)\n  {\n    DWORD delta = (DWORD) ((ts->tv_sec - now.tv_sec) * 1000 +\n                           (ts->tv_nsec - now.tv_nsec + 500000) / 1000000);\n    return _cnd_timedwait_win32(cond, mtx, delta);\n  }\n  else\n    return thrd_error;\n#else\n  int ret;\n  ret = pthread_cond_timedwait(cond, mtx, ts);\n  if (ret == ETIMEDOUT)\n  {\n    return thrd_timeout;\n  }\n  return ret == 0 ? thrd_success : thrd_error;\n#endif\n}\n\n\n/** Information to pass to the new thread (what to run). */\ntypedef struct {\n  thrd_start_t mFunction; /**< Pointer to the function to be executed. */\n  void * mArg;            /**< Function argument for the thread function. */\n} _thread_start_info;\n\n/* Thread wrapper function. */\n#if defined(_TTHREAD_WIN32_)\nstatic unsigned WINAPI _thrd_wrapper_function(void * aArg)\n#elif defined(_TTHREAD_POSIX_)\nstatic void * _thrd_wrapper_function(void * aArg)\n#endif\n{\n  thrd_start_t fun;\n  void *arg;\n  int  res;\n#if defined(_TTHREAD_POSIX_)\n  void *pres;\n#endif\n\n  /* Get thread startup information */\n  _thread_start_info *ti = (_thread_start_info *) aArg;\n  fun = ti->mFunction;\n  arg = ti->mArg;\n\n  /* The thread is responsible for freeing the startup information */\n  free((void *)ti);\n\n  /* Call the actual client thread function */\n  res = fun(arg);\n\n#if defined(_TTHREAD_WIN32_)\n  return res;\n#else\n  pres = malloc(sizeof(int));\n  if (pres != NULL)\n  {\n    *(int*)pres = res;\n  }\n  return pres;\n#endif\n}\n\nint thrd_create(thrd_t *thr, thrd_start_t func, void *arg)\n{\n  /* Fill out the thread startup information (passed to the thread wrapper,\n     which will eventually free it) */\n  _thread_start_info* ti = (_thread_start_info*)malloc(sizeof(_thread_start_info));\n  if (ti == NULL)\n  {\n    return thrd_nomem;\n  }\n  ti->mFunction = func;\n  ti->mArg = arg;\n\n  /* Create the thread */\n#if defined(_TTHREAD_WIN32_)\n  *thr = (HANDLE)_beginthreadex(NULL, 0, _thrd_wrapper_function, (void *)ti, 0, NULL);\n#elif defined(_TTHREAD_POSIX_)\n  if(pthread_create(thr, NULL, _thrd_wrapper_function, (void *)ti) != 0)\n  {\n    *thr = 0;\n  }\n#endif\n\n  /* Did we fail to create the thread? */\n  if(!*thr)\n  {\n    free(ti);\n    return thrd_error;\n  }\n\n  return thrd_success;\n}\n\nthrd_t thrd_current(void)\n{\n#if defined(_TTHREAD_WIN32_)\n  return GetCurrentThread();\n#else\n  return pthread_self();\n#endif\n}\n\nint thrd_detach(thrd_t thr)\n{\n  /* FIXME! */\n  (void)thr;\n  return thrd_error;\n}\n\nint thrd_equal(thrd_t thr0, thrd_t thr1)\n{\n#if defined(_TTHREAD_WIN32_)\n  return thr0 == thr1;\n#else\n  return pthread_equal(thr0, thr1);\n#endif\n}\n\nvoid thrd_exit(int res)\n{\n#if defined(_TTHREAD_WIN32_)\n  ExitThread(res);\n#else\n  void *pres = malloc(sizeof(int));\n  if (pres != NULL)\n  {\n    *(int*)pres = res;\n  }\n  pthread_exit(pres);\n#endif\n}\n\nint thrd_join(thrd_t thr, int *res)\n{\n#if defined(_TTHREAD_WIN32_)\n  if (WaitForSingleObject(thr, INFINITE) == WAIT_FAILED)\n  {\n    return thrd_error;\n  }\n  if (res != NULL)\n  {\n    DWORD dwRes;\n    GetExitCodeThread(thr, &dwRes);\n    *res = dwRes;\n  }\n#elif defined(_TTHREAD_POSIX_)\n  void *pres;\n  int ires = 0;\n  if (pthread_join(thr, &pres) != 0)\n  {\n    return thrd_error;\n  }\n  if (pres != NULL)\n  {\n    ires = *(int*)pres;\n    free(pres);\n  }\n  if (res != NULL)\n  {\n    *res = ires;\n  }\n#endif\n  return thrd_success;\n}\n\nint thrd_sleep(const struct timespec *time_point, struct timespec *remaining)\n{\n  struct timespec now;\n#if defined(_TTHREAD_WIN32_)\n  DWORD delta;\n#else\n  long delta;\n#endif\n\n  /* Get the current time */\n  if (clock_gettime(CLOCK_REALTIME, &now) != 0)\n    return -2;  // FIXME: Some specific error code?\n\n#if defined(_TTHREAD_WIN32_)\n  /* Delta in milliseconds */\n  delta = (DWORD) ((time_point->tv_sec - now.tv_sec) * 1000 +\n                   (time_point->tv_nsec - now.tv_nsec + 500000) / 1000000);\n  if (delta > 0)\n  {\n    Sleep(delta);\n  }\n#else\n  /* Delta in microseconds */\n  delta = (time_point->tv_sec - now.tv_sec) * 1000000L +\n          (time_point->tv_nsec - now.tv_nsec + 500L) / 1000L;\n\n  /* On some systems, the usleep argument must be < 1000000 */\n  while (delta > 999999L)\n  {\n    usleep(999999);\n    delta -= 999999L;\n  }\n  if (delta > 0L)\n  {\n    usleep((useconds_t)delta);\n  }\n#endif\n\n  /* We don't support waking up prematurely (yet) */\n  if (remaining)\n  {\n    remaining->tv_sec = 0;\n    remaining->tv_nsec = 0;\n  }\n  return 0;\n}\n\nvoid thrd_yield(void)\n{\n#if defined(_TTHREAD_WIN32_)\n  Sleep(0);\n#else\n  sched_yield();\n#endif\n}\n\nint tss_create(tss_t *key, tss_dtor_t dtor)\n{\n#if defined(_TTHREAD_WIN32_)\n  /* FIXME: The destructor function is not supported yet... */\n  if (dtor != NULL)\n  {\n    return thrd_error;\n  }\n  *key = TlsAlloc();\n  if (*key == TLS_OUT_OF_INDEXES)\n  {\n    return thrd_error;\n  }\n#else\n  if (pthread_key_create(key, dtor) != 0)\n  {\n    return thrd_error;\n  }\n#endif\n  return thrd_success;\n}\n\nvoid tss_delete(tss_t key)\n{\n#if defined(_TTHREAD_WIN32_)\n  TlsFree(key);\n#else\n  pthread_key_delete(key);\n#endif\n}\n\nvoid *tss_get(tss_t key)\n{\n#if defined(_TTHREAD_WIN32_)\n  return TlsGetValue(key);\n#else\n  return pthread_getspecific(key);\n#endif\n}\n\nint tss_set(tss_t key, void *val)\n{\n#if defined(_TTHREAD_WIN32_)\n  if (TlsSetValue(key, val) == 0)\n  {\n    return thrd_error;\n  }\n#else\n  if (pthread_setspecific(key, val) != 0)\n  {\n    return thrd_error;\n  }\n#endif\n  return thrd_success;\n}\n\n#if defined(_TTHREAD_EMULATE_CLOCK_GETTIME_)\nint _tthread_clock_gettime(clockid_t clk_id, struct timespec *ts)\n{\n#if defined(_TTHREAD_WIN32_)\n  struct _timeb tb;\n  _ftime(&tb);\n  ts->tv_sec = (time_t)tb.time;\n  ts->tv_nsec = 1000000L * (long)tb.millitm;\n#else\n  struct timeval tv;\n  gettimeofday(&tv, NULL);\n  ts->tv_sec = (time_t)tv.tv_sec;\n  ts->tv_nsec = 1000L * (long)tv.tv_usec;\n#endif\n  return 0;\n}\n#endif // _TTHREAD_EMULATE_CLOCK_GETTIME_\n\n"
  },
  {
    "path": "external/GLFW/deps/tinycthread.h",
    "content": "/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; -*-\nCopyright (c) 2012 Marcus Geelnard\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n    1. The origin of this software must not be misrepresented; you must not\n    claim that you wrote the original software. If you use this software\n    in a product, an acknowledgment in the product documentation would be\n    appreciated but is not required.\n\n    2. Altered source versions must be plainly marked as such, and must not be\n    misrepresented as being the original software.\n\n    3. This notice may not be removed or altered from any source\n    distribution.\n*/\n\n#ifndef _TINYCTHREAD_H_\n#define _TINYCTHREAD_H_\n\n/**\n* @file\n* @mainpage TinyCThread API Reference\n*\n* @section intro_sec Introduction\n* TinyCThread is a minimal, portable implementation of basic threading\n* classes for C.\n*\n* They closely mimic the functionality and naming of the C11 standard, and\n* should be easily replaceable with the corresponding standard variants.\n*\n* @section port_sec Portability\n* The Win32 variant uses the native Win32 API for implementing the thread\n* classes, while for other systems, the POSIX threads API (pthread) is used.\n*\n* @section misc_sec Miscellaneous\n* The following special keywords are available: #_Thread_local.\n*\n* For more detailed information, browse the different sections of this\n* documentation. A good place to start is:\n* tinycthread.h.\n*/\n\n/* Which platform are we on? */\n#if !defined(_TTHREAD_PLATFORM_DEFINED_)\n  #if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__)\n    #define _TTHREAD_WIN32_\n  #else\n    #define _TTHREAD_POSIX_\n  #endif\n  #define _TTHREAD_PLATFORM_DEFINED_\n#endif\n\n/* Activate some POSIX functionality (e.g. clock_gettime and recursive mutexes) */\n#if defined(_TTHREAD_POSIX_)\n  #undef _FEATURES_H\n  #if !defined(_GNU_SOURCE)\n    #define _GNU_SOURCE\n  #endif\n  #if !defined(_POSIX_C_SOURCE) || ((_POSIX_C_SOURCE - 0) < 199309L)\n    #undef _POSIX_C_SOURCE\n    #define _POSIX_C_SOURCE 199309L\n  #endif\n  #if !defined(_XOPEN_SOURCE) || ((_XOPEN_SOURCE - 0) < 500)\n    #undef _XOPEN_SOURCE\n    #define _XOPEN_SOURCE 500\n  #endif\n#endif\n\n/* Generic includes */\n#include <time.h>\n\n/* Platform specific includes */\n#if defined(_TTHREAD_POSIX_)\n  #include <sys/time.h>\n  #include <pthread.h>\n#elif defined(_TTHREAD_WIN32_)\n  #ifndef WIN32_LEAN_AND_MEAN\n    #define WIN32_LEAN_AND_MEAN\n    #define __UNDEF_LEAN_AND_MEAN\n  #endif\n  #include <windows.h>\n  #ifdef __UNDEF_LEAN_AND_MEAN\n    #undef WIN32_LEAN_AND_MEAN\n    #undef __UNDEF_LEAN_AND_MEAN\n  #endif\n#endif\n\n/* Workaround for missing TIME_UTC: If time.h doesn't provide TIME_UTC,\n   it's quite likely that libc does not support it either. Hence, fall back to\n   the only other supported time specifier: CLOCK_REALTIME (and if that fails,\n   we're probably emulating clock_gettime anyway, so anything goes). */\n#ifndef TIME_UTC\n  #ifdef CLOCK_REALTIME\n    #define TIME_UTC CLOCK_REALTIME\n  #else\n    #define TIME_UTC 0\n  #endif\n#endif\n\n/* Workaround for missing clock_gettime (most Windows compilers, afaik) */\n#if defined(_TTHREAD_WIN32_) || defined(__APPLE_CC__)\n#define _TTHREAD_EMULATE_CLOCK_GETTIME_\n/* Emulate struct timespec */\n#if defined(_TTHREAD_WIN32_)\nstruct _ttherad_timespec {\n  time_t tv_sec;\n  long   tv_nsec;\n};\n#define timespec _ttherad_timespec\n#endif\n\n/* Emulate clockid_t */\ntypedef int _tthread_clockid_t;\n#define clockid_t _tthread_clockid_t\n\n/* Emulate clock_gettime */\nint _tthread_clock_gettime(clockid_t clk_id, struct timespec *ts);\n#define clock_gettime _tthread_clock_gettime\n#ifndef CLOCK_REALTIME\n  #define CLOCK_REALTIME 0\n#endif\n#endif\n\n\n/** TinyCThread version (major number). */\n#define TINYCTHREAD_VERSION_MAJOR 1\n/** TinyCThread version (minor number). */\n#define TINYCTHREAD_VERSION_MINOR 1\n/** TinyCThread version (full version). */\n#define TINYCTHREAD_VERSION (TINYCTHREAD_VERSION_MAJOR * 100 + TINYCTHREAD_VERSION_MINOR)\n\n/**\n* @def _Thread_local\n* Thread local storage keyword.\n* A variable that is declared with the @c _Thread_local keyword makes the\n* value of the variable local to each thread (known as thread-local storage,\n* or TLS). Example usage:\n* @code\n* // This variable is local to each thread.\n* _Thread_local int variable;\n* @endcode\n* @note The @c _Thread_local keyword is a macro that maps to the corresponding\n* compiler directive (e.g. @c __declspec(thread)).\n* @note This directive is currently not supported on Mac OS X (it will give\n* a compiler error), since compile-time TLS is not supported in the Mac OS X\n* executable format. Also, some older versions of MinGW (before GCC 4.x) do\n* not support this directive.\n* @hideinitializer\n*/\n\n/* FIXME: Check for a PROPER value of __STDC_VERSION__ to know if we have C11 */\n#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201102L)) && !defined(_Thread_local)\n #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_CC) || defined(__IBMCPP__)\n  #define _Thread_local __thread\n #else\n  #define _Thread_local __declspec(thread)\n #endif\n#endif\n\n/* Macros */\n#define TSS_DTOR_ITERATIONS 0\n\n/* Function return values */\n#define thrd_error    0 /**< The requested operation failed */\n#define thrd_success  1 /**< The requested operation succeeded */\n#define thrd_timeout  2 /**< The time specified in the call was reached without acquiring the requested resource */\n#define thrd_busy     3 /**< The requested operation failed because a tesource requested by a test and return function is already in use */\n#define thrd_nomem    4 /**< The requested operation failed because it was unable to allocate memory */\n\n/* Mutex types */\n#define mtx_plain     1\n#define mtx_timed     2\n#define mtx_try       4\n#define mtx_recursive 8\n\n/* Mutex */\n#if defined(_TTHREAD_WIN32_)\ntypedef struct {\n  CRITICAL_SECTION mHandle;   /* Critical section handle */\n  int mAlreadyLocked;         /* TRUE if the mutex is already locked */\n  int mRecursive;             /* TRUE if the mutex is recursive */\n} mtx_t;\n#else\ntypedef pthread_mutex_t mtx_t;\n#endif\n\n/** Create a mutex object.\n* @param mtx A mutex object.\n* @param type Bit-mask that must have one of the following six values:\n*   @li @c mtx_plain for a simple non-recursive mutex\n*   @li @c mtx_timed for a non-recursive mutex that supports timeout\n*   @li @c mtx_try for a non-recursive mutex that supports test and return\n*   @li @c mtx_plain | @c mtx_recursive (same as @c mtx_plain, but recursive)\n*   @li @c mtx_timed | @c mtx_recursive (same as @c mtx_timed, but recursive)\n*   @li @c mtx_try | @c mtx_recursive (same as @c mtx_try, but recursive)\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint mtx_init(mtx_t *mtx, int type);\n\n/** Release any resources used by the given mutex.\n* @param mtx A mutex object.\n*/\nvoid mtx_destroy(mtx_t *mtx);\n\n/** Lock the given mutex.\n* Blocks until the given mutex can be locked. If the mutex is non-recursive, and\n* the calling thread already has a lock on the mutex, this call will block\n* forever.\n* @param mtx A mutex object.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint mtx_lock(mtx_t *mtx);\n\n/** NOT YET IMPLEMENTED.\n*/\nint mtx_timedlock(mtx_t *mtx, const struct timespec *ts);\n\n/** Try to lock the given mutex.\n* The specified mutex shall support either test and return or timeout. If the\n* mutex is already locked, the function returns without blocking.\n* @param mtx A mutex object.\n* @return @ref thrd_success on success, or @ref thrd_busy if the resource\n* requested is already in use, or @ref thrd_error if the request could not be\n* honored.\n*/\nint mtx_trylock(mtx_t *mtx);\n\n/** Unlock the given mutex.\n* @param mtx A mutex object.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint mtx_unlock(mtx_t *mtx);\n\n/* Condition variable */\n#if defined(_TTHREAD_WIN32_)\ntypedef struct {\n  HANDLE mEvents[2];                  /* Signal and broadcast event HANDLEs. */\n  unsigned int mWaitersCount;         /* Count of the number of waiters. */\n  CRITICAL_SECTION mWaitersCountLock; /* Serialize access to mWaitersCount. */\n} cnd_t;\n#else\ntypedef pthread_cond_t cnd_t;\n#endif\n\n/** Create a condition variable object.\n* @param cond A condition variable object.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint cnd_init(cnd_t *cond);\n\n/** Release any resources used by the given condition variable.\n* @param cond A condition variable object.\n*/\nvoid cnd_destroy(cnd_t *cond);\n\n/** Signal a condition variable.\n* Unblocks one of the threads that are blocked on the given condition variable\n* at the time of the call. If no threads are blocked on the condition variable\n* at the time of the call, the function does nothing and return success.\n* @param cond A condition variable object.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint cnd_signal(cnd_t *cond);\n\n/** Broadcast a condition variable.\n* Unblocks all of the threads that are blocked on the given condition variable\n* at the time of the call. If no threads are blocked on the condition variable\n* at the time of the call, the function does nothing and return success.\n* @param cond A condition variable object.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint cnd_broadcast(cnd_t *cond);\n\n/** Wait for a condition variable to become signaled.\n* The function atomically unlocks the given mutex and endeavors to block until\n* the given condition variable is signaled by a call to cnd_signal or to\n* cnd_broadcast. When the calling thread becomes unblocked it locks the mutex\n* before it returns.\n* @param cond A condition variable object.\n* @param mtx A mutex object.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint cnd_wait(cnd_t *cond, mtx_t *mtx);\n\n/** Wait for a condition variable to become signaled.\n* The function atomically unlocks the given mutex and endeavors to block until\n* the given condition variable is signaled by a call to cnd_signal or to\n* cnd_broadcast, or until after the specified time. When the calling thread\n* becomes unblocked it locks the mutex before it returns.\n* @param cond A condition variable object.\n* @param mtx A mutex object.\n* @param xt A point in time at which the request will time out (absolute time).\n* @return @ref thrd_success upon success, or @ref thrd_timeout if the time\n* specified in the call was reached without acquiring the requested resource, or\n* @ref thrd_error if the request could not be honored.\n*/\nint cnd_timedwait(cnd_t *cond, mtx_t *mtx, const struct timespec *ts);\n\n/* Thread */\n#if defined(_TTHREAD_WIN32_)\ntypedef HANDLE thrd_t;\n#else\ntypedef pthread_t thrd_t;\n#endif\n\n/** Thread start function.\n* Any thread that is started with the @ref thrd_create() function must be\n* started through a function of this type.\n* @param arg The thread argument (the @c arg argument of the corresponding\n*        @ref thrd_create() call).\n* @return The thread return value, which can be obtained by another thread\n* by using the @ref thrd_join() function.\n*/\ntypedef int (*thrd_start_t)(void *arg);\n\n/** Create a new thread.\n* @param thr Identifier of the newly created thread.\n* @param func A function pointer to the function that will be executed in\n*        the new thread.\n* @param arg An argument to the thread function.\n* @return @ref thrd_success on success, or @ref thrd_nomem if no memory could\n* be allocated for the thread requested, or @ref thrd_error if the request\n* could not be honored.\n* @note A thread’s identifier may be reused for a different thread once the\n* original thread has exited and either been detached or joined to another\n* thread.\n*/\nint thrd_create(thrd_t *thr, thrd_start_t func, void *arg);\n\n/** Identify the calling thread.\n* @return The identifier of the calling thread.\n*/\nthrd_t thrd_current(void);\n\n/** NOT YET IMPLEMENTED.\n*/\nint thrd_detach(thrd_t thr);\n\n/** Compare two thread identifiers.\n* The function determines if two thread identifiers refer to the same thread.\n* @return Zero if the two thread identifiers refer to different threads.\n* Otherwise a nonzero value is returned.\n*/\nint thrd_equal(thrd_t thr0, thrd_t thr1);\n\n/** Terminate execution of the calling thread.\n* @param res Result code of the calling thread.\n*/\nvoid thrd_exit(int res);\n\n/** Wait for a thread to terminate.\n* The function joins the given thread with the current thread by blocking\n* until the other thread has terminated.\n* @param thr The thread to join with.\n* @param res If this pointer is not NULL, the function will store the result\n*        code of the given thread in the integer pointed to by @c res.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint thrd_join(thrd_t thr, int *res);\n\n/** Put the calling thread to sleep.\n* Suspend execution of the calling thread.\n* @param time_point A point in time at which the thread will resume (absolute time).\n* @param remaining If non-NULL, this parameter will hold the remaining time until\n*                  time_point upon return. This will typically be zero, but if\n*                  the thread was woken up by a signal that is not ignored before\n*                  time_point was reached @c remaining will hold a positive\n*                  time.\n* @return 0 (zero) on successful sleep, or -1 if an interrupt occurred.\n*/\nint thrd_sleep(const struct timespec *time_point, struct timespec *remaining);\n\n/** Yield execution to another thread.\n* Permit other threads to run, even if the current thread would ordinarily\n* continue to run.\n*/\nvoid thrd_yield(void);\n\n/* Thread local storage */\n#if defined(_TTHREAD_WIN32_)\ntypedef DWORD tss_t;\n#else\ntypedef pthread_key_t tss_t;\n#endif\n\n/** Destructor function for a thread-specific storage.\n* @param val The value of the destructed thread-specific storage.\n*/\ntypedef void (*tss_dtor_t)(void *val);\n\n/** Create a thread-specific storage.\n* @param key The unique key identifier that will be set if the function is\n*        successful.\n* @param dtor Destructor function. This can be NULL.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n* @note The destructor function is not supported under Windows. If @c dtor is\n* not NULL when calling this function under Windows, the function will fail\n* and return @ref thrd_error.\n*/\nint tss_create(tss_t *key, tss_dtor_t dtor);\n\n/** Delete a thread-specific storage.\n* The function releases any resources used by the given thread-specific\n* storage.\n* @param key The key that shall be deleted.\n*/\nvoid tss_delete(tss_t key);\n\n/** Get the value for a thread-specific storage.\n* @param key The thread-specific storage identifier.\n* @return The value for the current thread held in the given thread-specific\n* storage.\n*/\nvoid *tss_get(tss_t key);\n\n/** Set the value for a thread-specific storage.\n* @param key The thread-specific storage identifier.\n* @param val The value of the thread-specific storage to set for the current\n*        thread.\n* @return @ref thrd_success on success, or @ref thrd_error if the request could\n* not be honored.\n*/\nint tss_set(tss_t key, void *val);\n\n\n#endif /* _TINYTHREAD_H_ */\n\n"
  },
  {
    "path": "external/GLFW/deps/vs2008/stdint.h",
    "content": "// ISO C9x  compliant stdint.h for Microsoft Visual Studio\n// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 \n// \n//  Copyright (c) 2006-2008 Alexander Chemeris\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// \n//   1. Redistributions of source code must retain the above copyright notice,\n//      this list of conditions and the following disclaimer.\n// \n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n// \n//   3. The name of the author may be used to endorse or promote products\n//      derived from this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \n// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// \n///////////////////////////////////////////////////////////////////////////////\n\n#ifndef _MSC_VER // [\n#error \"Use this header only with Microsoft Visual C++ compilers!\"\n#endif // _MSC_VER ]\n\n#ifndef _MSC_STDINT_H_ // [\n#define _MSC_STDINT_H_\n\n#if _MSC_VER > 1000\n#pragma once\n#endif\n\n#include <limits.h>\n\n// For Visual Studio 6 in C++ mode and for many Visual Studio versions when\n// compiling for ARM we should wrap <wchar.h> include with 'extern \"C++\" {}'\n// or compiler give many errors like this:\n//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#  include <wchar.h>\n#ifdef __cplusplus\n}\n#endif\n\n// Define _W64 macros to mark types changing their size, like intptr_t.\n#ifndef _W64\n#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300\n#     define _W64 __w64\n#  else\n#     define _W64\n#  endif\n#endif\n\n\n// 7.18.1 Integer types\n\n// 7.18.1.1 Exact-width integer types\n\n// Visual Studio 6 and Embedded Visual C++ 4 doesn't\n// realize that, e.g. char has the same size as __int8\n// so we give up on __intX for them.\n#if (_MSC_VER < 1300)\n   typedef signed char       int8_t;\n   typedef signed short      int16_t;\n   typedef signed int        int32_t;\n   typedef unsigned char     uint8_t;\n   typedef unsigned short    uint16_t;\n   typedef unsigned int      uint32_t;\n#else\n   typedef signed __int8     int8_t;\n   typedef signed __int16    int16_t;\n   typedef signed __int32    int32_t;\n   typedef unsigned __int8   uint8_t;\n   typedef unsigned __int16  uint16_t;\n   typedef unsigned __int32  uint32_t;\n#endif\ntypedef signed __int64       int64_t;\ntypedef unsigned __int64     uint64_t;\n\n\n// 7.18.1.2 Minimum-width integer types\ntypedef int8_t    int_least8_t;\ntypedef int16_t   int_least16_t;\ntypedef int32_t   int_least32_t;\ntypedef int64_t   int_least64_t;\ntypedef uint8_t   uint_least8_t;\ntypedef uint16_t  uint_least16_t;\ntypedef uint32_t  uint_least32_t;\ntypedef uint64_t  uint_least64_t;\n\n// 7.18.1.3 Fastest minimum-width integer types\ntypedef int8_t    int_fast8_t;\ntypedef int16_t   int_fast16_t;\ntypedef int32_t   int_fast32_t;\ntypedef int64_t   int_fast64_t;\ntypedef uint8_t   uint_fast8_t;\ntypedef uint16_t  uint_fast16_t;\ntypedef uint32_t  uint_fast32_t;\ntypedef uint64_t  uint_fast64_t;\n\n// 7.18.1.4 Integer types capable of holding object pointers\n#ifdef _WIN64 // [\n   typedef signed __int64    intptr_t;\n   typedef unsigned __int64  uintptr_t;\n#else // _WIN64 ][\n   typedef _W64 signed int   intptr_t;\n   typedef _W64 unsigned int uintptr_t;\n#endif // _WIN64 ]\n\n// 7.18.1.5 Greatest-width integer types\ntypedef int64_t   intmax_t;\ntypedef uint64_t  uintmax_t;\n\n\n// 7.18.2 Limits of specified-width integer types\n\n#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259\n\n// 7.18.2.1 Limits of exact-width integer types\n#define INT8_MIN     ((int8_t)_I8_MIN)\n#define INT8_MAX     _I8_MAX\n#define INT16_MIN    ((int16_t)_I16_MIN)\n#define INT16_MAX    _I16_MAX\n#define INT32_MIN    ((int32_t)_I32_MIN)\n#define INT32_MAX    _I32_MAX\n#define INT64_MIN    ((int64_t)_I64_MIN)\n#define INT64_MAX    _I64_MAX\n#define UINT8_MAX    _UI8_MAX\n#define UINT16_MAX   _UI16_MAX\n#define UINT32_MAX   _UI32_MAX\n#define UINT64_MAX   _UI64_MAX\n\n// 7.18.2.2 Limits of minimum-width integer types\n#define INT_LEAST8_MIN    INT8_MIN\n#define INT_LEAST8_MAX    INT8_MAX\n#define INT_LEAST16_MIN   INT16_MIN\n#define INT_LEAST16_MAX   INT16_MAX\n#define INT_LEAST32_MIN   INT32_MIN\n#define INT_LEAST32_MAX   INT32_MAX\n#define INT_LEAST64_MIN   INT64_MIN\n#define INT_LEAST64_MAX   INT64_MAX\n#define UINT_LEAST8_MAX   UINT8_MAX\n#define UINT_LEAST16_MAX  UINT16_MAX\n#define UINT_LEAST32_MAX  UINT32_MAX\n#define UINT_LEAST64_MAX  UINT64_MAX\n\n// 7.18.2.3 Limits of fastest minimum-width integer types\n#define INT_FAST8_MIN    INT8_MIN\n#define INT_FAST8_MAX    INT8_MAX\n#define INT_FAST16_MIN   INT16_MIN\n#define INT_FAST16_MAX   INT16_MAX\n#define INT_FAST32_MIN   INT32_MIN\n#define INT_FAST32_MAX   INT32_MAX\n#define INT_FAST64_MIN   INT64_MIN\n#define INT_FAST64_MAX   INT64_MAX\n#define UINT_FAST8_MAX   UINT8_MAX\n#define UINT_FAST16_MAX  UINT16_MAX\n#define UINT_FAST32_MAX  UINT32_MAX\n#define UINT_FAST64_MAX  UINT64_MAX\n\n// 7.18.2.4 Limits of integer types capable of holding object pointers\n#ifdef _WIN64 // [\n#  define INTPTR_MIN   INT64_MIN\n#  define INTPTR_MAX   INT64_MAX\n#  define UINTPTR_MAX  UINT64_MAX\n#else // _WIN64 ][\n#  define INTPTR_MIN   INT32_MIN\n#  define INTPTR_MAX   INT32_MAX\n#  define UINTPTR_MAX  UINT32_MAX\n#endif // _WIN64 ]\n\n// 7.18.2.5 Limits of greatest-width integer types\n#define INTMAX_MIN   INT64_MIN\n#define INTMAX_MAX   INT64_MAX\n#define UINTMAX_MAX  UINT64_MAX\n\n// 7.18.3 Limits of other integer types\n\n#ifdef _WIN64 // [\n#  define PTRDIFF_MIN  _I64_MIN\n#  define PTRDIFF_MAX  _I64_MAX\n#else  // _WIN64 ][\n#  define PTRDIFF_MIN  _I32_MIN\n#  define PTRDIFF_MAX  _I32_MAX\n#endif  // _WIN64 ]\n\n#define SIG_ATOMIC_MIN  INT_MIN\n#define SIG_ATOMIC_MAX  INT_MAX\n\n#ifndef SIZE_MAX // [\n#  ifdef _WIN64 // [\n#     define SIZE_MAX  _UI64_MAX\n#  else // _WIN64 ][\n#     define SIZE_MAX  _UI32_MAX\n#  endif // _WIN64 ]\n#endif // SIZE_MAX ]\n\n// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>\n#ifndef WCHAR_MIN // [\n#  define WCHAR_MIN  0\n#endif  // WCHAR_MIN ]\n#ifndef WCHAR_MAX // [\n#  define WCHAR_MAX  _UI16_MAX\n#endif  // WCHAR_MAX ]\n\n#define WINT_MIN  0\n#define WINT_MAX  _UI16_MAX\n\n#endif // __STDC_LIMIT_MACROS ]\n\n\n// 7.18.4 Limits of other integer types\n\n#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260\n\n// 7.18.4.1 Macros for minimum-width integer constants\n\n#define INT8_C(val)  val##i8\n#define INT16_C(val) val##i16\n#define INT32_C(val) val##i32\n#define INT64_C(val) val##i64\n\n#define UINT8_C(val)  val##ui8\n#define UINT16_C(val) val##ui16\n#define UINT32_C(val) val##ui32\n#define UINT64_C(val) val##ui64\n\n// 7.18.4.2 Macros for greatest-width integer constants\n#define INTMAX_C   INT64_C\n#define UINTMAX_C  UINT64_C\n\n#endif // __STDC_CONSTANT_MACROS ]\n\n\n#endif // _MSC_STDINT_H_ ]\n"
  },
  {
    "path": "external/GLFW/deps/vulkan/vk_platform.h",
    "content": "//\n// File: vk_platform.h\n//\n/*\n** Copyright (c) 2014-2015 The Khronos Group Inc.\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n\n#ifndef VK_PLATFORM_H_\n#define VK_PLATFORM_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif // __cplusplus\n\n/*\n***************************************************************************************************\n*   Platform-specific directives and type declarations\n***************************************************************************************************\n*/\n\n/* Platform-specific calling convention macros.\n *\n * Platforms should define these so that Vulkan clients call Vulkan commands\n * with the same calling conventions that the Vulkan implementation expects.\n *\n * VKAPI_ATTR - Placed before the return type in function declarations.\n *              Useful for C++11 and GCC/Clang-style function attribute syntax.\n * VKAPI_CALL - Placed after the return type in function declarations.\n *              Useful for MSVC-style calling convention syntax.\n * VKAPI_PTR  - Placed between the '(' and '*' in function pointer types.\n *\n * Function declaration:  VKAPI_ATTR void VKAPI_CALL vkCommand(void);\n * Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);\n */\n#if defined(_WIN32)\n    // On Windows, Vulkan commands use the stdcall convention\n    #define VKAPI_ATTR\n    #define VKAPI_CALL __stdcall\n    #define VKAPI_PTR  VKAPI_CALL\n#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7\n    #error \"Vulkan isn't supported for the 'armeabi' NDK ABI\"\n#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE)\n    // On Android 32-bit ARM targets, Vulkan functions use the \"hardfloat\"\n    // calling convention, i.e. float parameters are passed in registers. This\n    // is true even if the rest of the application passes floats on the stack,\n    // as it does by default when compiling for the armeabi-v7a NDK ABI.\n    #define VKAPI_ATTR __attribute__((pcs(\"aapcs-vfp\")))\n    #define VKAPI_CALL\n    #define VKAPI_PTR  VKAPI_ATTR\n#else\n    // On other platforms, use the default calling convention\n    #define VKAPI_ATTR\n    #define VKAPI_CALL\n    #define VKAPI_PTR\n#endif\n\n#include <stddef.h>\n\n#if !defined(VK_NO_STDINT_H)\n    #if defined(_MSC_VER) && (_MSC_VER < 1600)\n        typedef signed   __int8  int8_t;\n        typedef unsigned __int8  uint8_t;\n        typedef signed   __int16 int16_t;\n        typedef unsigned __int16 uint16_t;\n        typedef signed   __int32 int32_t;\n        typedef unsigned __int32 uint32_t;\n        typedef signed   __int64 int64_t;\n        typedef unsigned __int64 uint64_t;\n    #else\n        #include <stdint.h>\n    #endif\n#endif // !defined(VK_NO_STDINT_H)\n\n#ifdef __cplusplus\n} // extern \"C\"\n#endif // __cplusplus\n\n// Platform-specific headers required by platform window system extensions.\n// These are enabled prior to #including \"vulkan.h\". The same enable then\n// controls inclusion of the extension interfaces in vulkan.h.\n\n#ifdef VK_USE_PLATFORM_ANDROID_KHR\n#include <android/native_window.h>\n#endif\n\n#ifdef VK_USE_PLATFORM_MIR_KHR\n#include <mir_toolkit/client_types.h>\n#endif\n\n#ifdef VK_USE_PLATFORM_WAYLAND_KHR\n#include <wayland-client.h>\n#endif\n\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n#include <windows.h>\n#endif\n\n#ifdef VK_USE_PLATFORM_XLIB_KHR\n#include <X11/Xlib.h>\n#endif\n\n#ifdef VK_USE_PLATFORM_XCB_KHR\n#include <xcb/xcb.h>\n#endif\n\n#endif\n"
  },
  {
    "path": "external/GLFW/deps/vulkan/vulkan.h",
    "content": "#ifndef VULKAN_H_\n#define VULKAN_H_ 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n** Copyright (c) 2015-2017 The Khronos Group Inc.\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n/*\n** This header is generated from the Khronos Vulkan XML API Registry.\n**\n*/\n\n\n#define VK_VERSION_1_0 1\n#include \"vk_platform.h\"\n\n#define VK_MAKE_VERSION(major, minor, patch) \\\n    (((major) << 22) | ((minor) << 12) | (patch))\n\n// DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead.\n//#define VK_API_VERSION VK_MAKE_VERSION(1, 0, 0)\n\n// Vulkan 1.0 version number\n#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)\n\n#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22)\n#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)\n#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)\n// Version of this file\n#define VK_HEADER_VERSION 39\n\n\n#define VK_NULL_HANDLE 0\n        \n\n\n#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;\n\n\n#if !defined(VK_DEFINE_NON_DISPATCHABLE_HANDLE)\n#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)\n        #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;\n#else\n        #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;\n#endif\n#endif\n        \n\n\ntypedef uint32_t VkFlags;\ntypedef uint32_t VkBool32;\ntypedef uint64_t VkDeviceSize;\ntypedef uint32_t VkSampleMask;\n\nVK_DEFINE_HANDLE(VkInstance)\nVK_DEFINE_HANDLE(VkPhysicalDevice)\nVK_DEFINE_HANDLE(VkDevice)\nVK_DEFINE_HANDLE(VkQueue)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSemaphore)\nVK_DEFINE_HANDLE(VkCommandBuffer)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFence)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeviceMemory)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkQueryPool)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineCache)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineLayout)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipeline)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSetLayout)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorPool)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSet)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool)\n\n#define VK_LOD_CLAMP_NONE                 1000.0f\n#define VK_REMAINING_MIP_LEVELS           (~0U)\n#define VK_REMAINING_ARRAY_LAYERS         (~0U)\n#define VK_WHOLE_SIZE                     (~0ULL)\n#define VK_ATTACHMENT_UNUSED              (~0U)\n#define VK_TRUE                           1\n#define VK_FALSE                          0\n#define VK_QUEUE_FAMILY_IGNORED           (~0U)\n#define VK_SUBPASS_EXTERNAL               (~0U)\n#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE  256\n#define VK_UUID_SIZE                      16\n#define VK_MAX_MEMORY_TYPES               32\n#define VK_MAX_MEMORY_HEAPS               16\n#define VK_MAX_EXTENSION_NAME_SIZE        256\n#define VK_MAX_DESCRIPTION_SIZE           256\n\n\ntypedef enum VkPipelineCacheHeaderVersion {\n    VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1,\n    VK_PIPELINE_CACHE_HEADER_VERSION_BEGIN_RANGE = VK_PIPELINE_CACHE_HEADER_VERSION_ONE,\n    VK_PIPELINE_CACHE_HEADER_VERSION_END_RANGE = VK_PIPELINE_CACHE_HEADER_VERSION_ONE,\n    VK_PIPELINE_CACHE_HEADER_VERSION_RANGE_SIZE = (VK_PIPELINE_CACHE_HEADER_VERSION_ONE - VK_PIPELINE_CACHE_HEADER_VERSION_ONE + 1),\n    VK_PIPELINE_CACHE_HEADER_VERSION_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineCacheHeaderVersion;\n\ntypedef enum VkResult {\n    VK_SUCCESS = 0,\n    VK_NOT_READY = 1,\n    VK_TIMEOUT = 2,\n    VK_EVENT_SET = 3,\n    VK_EVENT_RESET = 4,\n    VK_INCOMPLETE = 5,\n    VK_ERROR_OUT_OF_HOST_MEMORY = -1,\n    VK_ERROR_OUT_OF_DEVICE_MEMORY = -2,\n    VK_ERROR_INITIALIZATION_FAILED = -3,\n    VK_ERROR_DEVICE_LOST = -4,\n    VK_ERROR_MEMORY_MAP_FAILED = -5,\n    VK_ERROR_LAYER_NOT_PRESENT = -6,\n    VK_ERROR_EXTENSION_NOT_PRESENT = -7,\n    VK_ERROR_FEATURE_NOT_PRESENT = -8,\n    VK_ERROR_INCOMPATIBLE_DRIVER = -9,\n    VK_ERROR_TOO_MANY_OBJECTS = -10,\n    VK_ERROR_FORMAT_NOT_SUPPORTED = -11,\n    VK_ERROR_FRAGMENTED_POOL = -12,\n    VK_ERROR_SURFACE_LOST_KHR = -1000000000,\n    VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,\n    VK_SUBOPTIMAL_KHR = 1000001003,\n    VK_ERROR_OUT_OF_DATE_KHR = -1000001004,\n    VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001,\n    VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,\n    VK_ERROR_INVALID_SHADER_NV = -1000012000,\n    VK_ERROR_OUT_OF_POOL_MEMORY_KHR = -1000069000,\n    VK_RESULT_BEGIN_RANGE = VK_ERROR_FRAGMENTED_POOL,\n    VK_RESULT_END_RANGE = VK_INCOMPLETE,\n    VK_RESULT_RANGE_SIZE = (VK_INCOMPLETE - VK_ERROR_FRAGMENTED_POOL + 1),\n    VK_RESULT_MAX_ENUM = 0x7FFFFFFF\n} VkResult;\n\ntypedef enum VkStructureType {\n    VK_STRUCTURE_TYPE_APPLICATION_INFO = 0,\n    VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 1,\n    VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO = 2,\n    VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = 3,\n    VK_STRUCTURE_TYPE_SUBMIT_INFO = 4,\n    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO = 5,\n    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = 6,\n    VK_STRUCTURE_TYPE_BIND_SPARSE_INFO = 7,\n    VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 8,\n    VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 9,\n    VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 10,\n    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = 11,\n    VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = 12,\n    VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = 13,\n    VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 14,\n    VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = 15,\n    VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 16,\n    VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 17,\n    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 18,\n    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 19,\n    VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 20,\n    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 21,\n    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 22,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 23,\n    VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 24,\n    VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 25,\n    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 26,\n    VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = 27,\n    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 28,\n    VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 29,\n    VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 30,\n    VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 31,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 32,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 33,\n    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO = 34,\n    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 35,\n    VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 36,\n    VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 37,\n    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 38,\n    VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = 39,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = 40,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO = 41,\n    VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = 42,\n    VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 43,\n    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 44,\n    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 45,\n    VK_STRUCTURE_TYPE_MEMORY_BARRIER = 46,\n    VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO = 47,\n    VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = 48,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000,\n    VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001,\n    VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR = 1000002000,\n    VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR = 1000002001,\n    VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR = 1000003000,\n    VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000,\n    VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000,\n    VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000,\n    VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR = 1000007000,\n    VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR = 1000008000,\n    VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,\n    VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000,\n    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD = 1000018000,\n    VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000,\n    VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001,\n    VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002,\n    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000,\n    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001,\n    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002,\n    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000,\n    VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV = 1000056001,\n    VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057000,\n    VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057001,\n    VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR = 1000059000,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR = 1000059001,\n    VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR = 1000059002,\n    VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR = 1000059003,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR = 1000059004,\n    VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR = 1000059005,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = 1000059006,\n    VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = 1000059007,\n    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = 1000059008,\n    VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000,\n    VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000,\n    VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX = 1000086000,\n    VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX = 1000086001,\n    VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX = 1000086002,\n    VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX = 1000086003,\n    VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX = 1000086004,\n    VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX = 1000086005,\n    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = 1000090000,\n    VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT = 1000091000,\n    VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT = 1000091001,\n    VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT = 1000091002,\n    VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003,\n    VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO,\n    VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO,\n    VK_STRUCTURE_TYPE_RANGE_SIZE = (VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO - VK_STRUCTURE_TYPE_APPLICATION_INFO + 1),\n    VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkStructureType;\n\ntypedef enum VkSystemAllocationScope {\n    VK_SYSTEM_ALLOCATION_SCOPE_COMMAND = 0,\n    VK_SYSTEM_ALLOCATION_SCOPE_OBJECT = 1,\n    VK_SYSTEM_ALLOCATION_SCOPE_CACHE = 2,\n    VK_SYSTEM_ALLOCATION_SCOPE_DEVICE = 3,\n    VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE = 4,\n    VK_SYSTEM_ALLOCATION_SCOPE_BEGIN_RANGE = VK_SYSTEM_ALLOCATION_SCOPE_COMMAND,\n    VK_SYSTEM_ALLOCATION_SCOPE_END_RANGE = VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE,\n    VK_SYSTEM_ALLOCATION_SCOPE_RANGE_SIZE = (VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE - VK_SYSTEM_ALLOCATION_SCOPE_COMMAND + 1),\n    VK_SYSTEM_ALLOCATION_SCOPE_MAX_ENUM = 0x7FFFFFFF\n} VkSystemAllocationScope;\n\ntypedef enum VkInternalAllocationType {\n    VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE = 0,\n    VK_INTERNAL_ALLOCATION_TYPE_BEGIN_RANGE = VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE,\n    VK_INTERNAL_ALLOCATION_TYPE_END_RANGE = VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE,\n    VK_INTERNAL_ALLOCATION_TYPE_RANGE_SIZE = (VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE - VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE + 1),\n    VK_INTERNAL_ALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkInternalAllocationType;\n\ntypedef enum VkFormat {\n    VK_FORMAT_UNDEFINED = 0,\n    VK_FORMAT_R4G4_UNORM_PACK8 = 1,\n    VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2,\n    VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3,\n    VK_FORMAT_R5G6B5_UNORM_PACK16 = 4,\n    VK_FORMAT_B5G6R5_UNORM_PACK16 = 5,\n    VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6,\n    VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7,\n    VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8,\n    VK_FORMAT_R8_UNORM = 9,\n    VK_FORMAT_R8_SNORM = 10,\n    VK_FORMAT_R8_USCALED = 11,\n    VK_FORMAT_R8_SSCALED = 12,\n    VK_FORMAT_R8_UINT = 13,\n    VK_FORMAT_R8_SINT = 14,\n    VK_FORMAT_R8_SRGB = 15,\n    VK_FORMAT_R8G8_UNORM = 16,\n    VK_FORMAT_R8G8_SNORM = 17,\n    VK_FORMAT_R8G8_USCALED = 18,\n    VK_FORMAT_R8G8_SSCALED = 19,\n    VK_FORMAT_R8G8_UINT = 20,\n    VK_FORMAT_R8G8_SINT = 21,\n    VK_FORMAT_R8G8_SRGB = 22,\n    VK_FORMAT_R8G8B8_UNORM = 23,\n    VK_FORMAT_R8G8B8_SNORM = 24,\n    VK_FORMAT_R8G8B8_USCALED = 25,\n    VK_FORMAT_R8G8B8_SSCALED = 26,\n    VK_FORMAT_R8G8B8_UINT = 27,\n    VK_FORMAT_R8G8B8_SINT = 28,\n    VK_FORMAT_R8G8B8_SRGB = 29,\n    VK_FORMAT_B8G8R8_UNORM = 30,\n    VK_FORMAT_B8G8R8_SNORM = 31,\n    VK_FORMAT_B8G8R8_USCALED = 32,\n    VK_FORMAT_B8G8R8_SSCALED = 33,\n    VK_FORMAT_B8G8R8_UINT = 34,\n    VK_FORMAT_B8G8R8_SINT = 35,\n    VK_FORMAT_B8G8R8_SRGB = 36,\n    VK_FORMAT_R8G8B8A8_UNORM = 37,\n    VK_FORMAT_R8G8B8A8_SNORM = 38,\n    VK_FORMAT_R8G8B8A8_USCALED = 39,\n    VK_FORMAT_R8G8B8A8_SSCALED = 40,\n    VK_FORMAT_R8G8B8A8_UINT = 41,\n    VK_FORMAT_R8G8B8A8_SINT = 42,\n    VK_FORMAT_R8G8B8A8_SRGB = 43,\n    VK_FORMAT_B8G8R8A8_UNORM = 44,\n    VK_FORMAT_B8G8R8A8_SNORM = 45,\n    VK_FORMAT_B8G8R8A8_USCALED = 46,\n    VK_FORMAT_B8G8R8A8_SSCALED = 47,\n    VK_FORMAT_B8G8R8A8_UINT = 48,\n    VK_FORMAT_B8G8R8A8_SINT = 49,\n    VK_FORMAT_B8G8R8A8_SRGB = 50,\n    VK_FORMAT_A8B8G8R8_UNORM_PACK32 = 51,\n    VK_FORMAT_A8B8G8R8_SNORM_PACK32 = 52,\n    VK_FORMAT_A8B8G8R8_USCALED_PACK32 = 53,\n    VK_FORMAT_A8B8G8R8_SSCALED_PACK32 = 54,\n    VK_FORMAT_A8B8G8R8_UINT_PACK32 = 55,\n    VK_FORMAT_A8B8G8R8_SINT_PACK32 = 56,\n    VK_FORMAT_A8B8G8R8_SRGB_PACK32 = 57,\n    VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58,\n    VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59,\n    VK_FORMAT_A2R10G10B10_USCALED_PACK32 = 60,\n    VK_FORMAT_A2R10G10B10_SSCALED_PACK32 = 61,\n    VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62,\n    VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63,\n    VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64,\n    VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65,\n    VK_FORMAT_A2B10G10R10_USCALED_PACK32 = 66,\n    VK_FORMAT_A2B10G10R10_SSCALED_PACK32 = 67,\n    VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68,\n    VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69,\n    VK_FORMAT_R16_UNORM = 70,\n    VK_FORMAT_R16_SNORM = 71,\n    VK_FORMAT_R16_USCALED = 72,\n    VK_FORMAT_R16_SSCALED = 73,\n    VK_FORMAT_R16_UINT = 74,\n    VK_FORMAT_R16_SINT = 75,\n    VK_FORMAT_R16_SFLOAT = 76,\n    VK_FORMAT_R16G16_UNORM = 77,\n    VK_FORMAT_R16G16_SNORM = 78,\n    VK_FORMAT_R16G16_USCALED = 79,\n    VK_FORMAT_R16G16_SSCALED = 80,\n    VK_FORMAT_R16G16_UINT = 81,\n    VK_FORMAT_R16G16_SINT = 82,\n    VK_FORMAT_R16G16_SFLOAT = 83,\n    VK_FORMAT_R16G16B16_UNORM = 84,\n    VK_FORMAT_R16G16B16_SNORM = 85,\n    VK_FORMAT_R16G16B16_USCALED = 86,\n    VK_FORMAT_R16G16B16_SSCALED = 87,\n    VK_FORMAT_R16G16B16_UINT = 88,\n    VK_FORMAT_R16G16B16_SINT = 89,\n    VK_FORMAT_R16G16B16_SFLOAT = 90,\n    VK_FORMAT_R16G16B16A16_UNORM = 91,\n    VK_FORMAT_R16G16B16A16_SNORM = 92,\n    VK_FORMAT_R16G16B16A16_USCALED = 93,\n    VK_FORMAT_R16G16B16A16_SSCALED = 94,\n    VK_FORMAT_R16G16B16A16_UINT = 95,\n    VK_FORMAT_R16G16B16A16_SINT = 96,\n    VK_FORMAT_R16G16B16A16_SFLOAT = 97,\n    VK_FORMAT_R32_UINT = 98,\n    VK_FORMAT_R32_SINT = 99,\n    VK_FORMAT_R32_SFLOAT = 100,\n    VK_FORMAT_R32G32_UINT = 101,\n    VK_FORMAT_R32G32_SINT = 102,\n    VK_FORMAT_R32G32_SFLOAT = 103,\n    VK_FORMAT_R32G32B32_UINT = 104,\n    VK_FORMAT_R32G32B32_SINT = 105,\n    VK_FORMAT_R32G32B32_SFLOAT = 106,\n    VK_FORMAT_R32G32B32A32_UINT = 107,\n    VK_FORMAT_R32G32B32A32_SINT = 108,\n    VK_FORMAT_R32G32B32A32_SFLOAT = 109,\n    VK_FORMAT_R64_UINT = 110,\n    VK_FORMAT_R64_SINT = 111,\n    VK_FORMAT_R64_SFLOAT = 112,\n    VK_FORMAT_R64G64_UINT = 113,\n    VK_FORMAT_R64G64_SINT = 114,\n    VK_FORMAT_R64G64_SFLOAT = 115,\n    VK_FORMAT_R64G64B64_UINT = 116,\n    VK_FORMAT_R64G64B64_SINT = 117,\n    VK_FORMAT_R64G64B64_SFLOAT = 118,\n    VK_FORMAT_R64G64B64A64_UINT = 119,\n    VK_FORMAT_R64G64B64A64_SINT = 120,\n    VK_FORMAT_R64G64B64A64_SFLOAT = 121,\n    VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122,\n    VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123,\n    VK_FORMAT_D16_UNORM = 124,\n    VK_FORMAT_X8_D24_UNORM_PACK32 = 125,\n    VK_FORMAT_D32_SFLOAT = 126,\n    VK_FORMAT_S8_UINT = 127,\n    VK_FORMAT_D16_UNORM_S8_UINT = 128,\n    VK_FORMAT_D24_UNORM_S8_UINT = 129,\n    VK_FORMAT_D32_SFLOAT_S8_UINT = 130,\n    VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131,\n    VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132,\n    VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133,\n    VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134,\n    VK_FORMAT_BC2_UNORM_BLOCK = 135,\n    VK_FORMAT_BC2_SRGB_BLOCK = 136,\n    VK_FORMAT_BC3_UNORM_BLOCK = 137,\n    VK_FORMAT_BC3_SRGB_BLOCK = 138,\n    VK_FORMAT_BC4_UNORM_BLOCK = 139,\n    VK_FORMAT_BC4_SNORM_BLOCK = 140,\n    VK_FORMAT_BC5_UNORM_BLOCK = 141,\n    VK_FORMAT_BC5_SNORM_BLOCK = 142,\n    VK_FORMAT_BC6H_UFLOAT_BLOCK = 143,\n    VK_FORMAT_BC6H_SFLOAT_BLOCK = 144,\n    VK_FORMAT_BC7_UNORM_BLOCK = 145,\n    VK_FORMAT_BC7_SRGB_BLOCK = 146,\n    VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147,\n    VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148,\n    VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149,\n    VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150,\n    VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151,\n    VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152,\n    VK_FORMAT_EAC_R11_UNORM_BLOCK = 153,\n    VK_FORMAT_EAC_R11_SNORM_BLOCK = 154,\n    VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155,\n    VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156,\n    VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157,\n    VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158,\n    VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159,\n    VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160,\n    VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161,\n    VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162,\n    VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163,\n    VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164,\n    VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165,\n    VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166,\n    VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167,\n    VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168,\n    VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169,\n    VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170,\n    VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171,\n    VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172,\n    VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173,\n    VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174,\n    VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175,\n    VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176,\n    VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177,\n    VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178,\n    VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179,\n    VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180,\n    VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181,\n    VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182,\n    VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183,\n    VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184,\n    VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000,\n    VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001,\n    VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002,\n    VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003,\n    VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004,\n    VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005,\n    VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006,\n    VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007,\n    VK_FORMAT_BEGIN_RANGE = VK_FORMAT_UNDEFINED,\n    VK_FORMAT_END_RANGE = VK_FORMAT_ASTC_12x12_SRGB_BLOCK,\n    VK_FORMAT_RANGE_SIZE = (VK_FORMAT_ASTC_12x12_SRGB_BLOCK - VK_FORMAT_UNDEFINED + 1),\n    VK_FORMAT_MAX_ENUM = 0x7FFFFFFF\n} VkFormat;\n\ntypedef enum VkImageType {\n    VK_IMAGE_TYPE_1D = 0,\n    VK_IMAGE_TYPE_2D = 1,\n    VK_IMAGE_TYPE_3D = 2,\n    VK_IMAGE_TYPE_BEGIN_RANGE = VK_IMAGE_TYPE_1D,\n    VK_IMAGE_TYPE_END_RANGE = VK_IMAGE_TYPE_3D,\n    VK_IMAGE_TYPE_RANGE_SIZE = (VK_IMAGE_TYPE_3D - VK_IMAGE_TYPE_1D + 1),\n    VK_IMAGE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkImageType;\n\ntypedef enum VkImageTiling {\n    VK_IMAGE_TILING_OPTIMAL = 0,\n    VK_IMAGE_TILING_LINEAR = 1,\n    VK_IMAGE_TILING_BEGIN_RANGE = VK_IMAGE_TILING_OPTIMAL,\n    VK_IMAGE_TILING_END_RANGE = VK_IMAGE_TILING_LINEAR,\n    VK_IMAGE_TILING_RANGE_SIZE = (VK_IMAGE_TILING_LINEAR - VK_IMAGE_TILING_OPTIMAL + 1),\n    VK_IMAGE_TILING_MAX_ENUM = 0x7FFFFFFF\n} VkImageTiling;\n\ntypedef enum VkPhysicalDeviceType {\n    VK_PHYSICAL_DEVICE_TYPE_OTHER = 0,\n    VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 1,\n    VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 2,\n    VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 3,\n    VK_PHYSICAL_DEVICE_TYPE_CPU = 4,\n    VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE = VK_PHYSICAL_DEVICE_TYPE_OTHER,\n    VK_PHYSICAL_DEVICE_TYPE_END_RANGE = VK_PHYSICAL_DEVICE_TYPE_CPU,\n    VK_PHYSICAL_DEVICE_TYPE_RANGE_SIZE = (VK_PHYSICAL_DEVICE_TYPE_CPU - VK_PHYSICAL_DEVICE_TYPE_OTHER + 1),\n    VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkPhysicalDeviceType;\n\ntypedef enum VkQueryType {\n    VK_QUERY_TYPE_OCCLUSION = 0,\n    VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,\n    VK_QUERY_TYPE_TIMESTAMP = 2,\n    VK_QUERY_TYPE_BEGIN_RANGE = VK_QUERY_TYPE_OCCLUSION,\n    VK_QUERY_TYPE_END_RANGE = VK_QUERY_TYPE_TIMESTAMP,\n    VK_QUERY_TYPE_RANGE_SIZE = (VK_QUERY_TYPE_TIMESTAMP - VK_QUERY_TYPE_OCCLUSION + 1),\n    VK_QUERY_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkQueryType;\n\ntypedef enum VkSharingMode {\n    VK_SHARING_MODE_EXCLUSIVE = 0,\n    VK_SHARING_MODE_CONCURRENT = 1,\n    VK_SHARING_MODE_BEGIN_RANGE = VK_SHARING_MODE_EXCLUSIVE,\n    VK_SHARING_MODE_END_RANGE = VK_SHARING_MODE_CONCURRENT,\n    VK_SHARING_MODE_RANGE_SIZE = (VK_SHARING_MODE_CONCURRENT - VK_SHARING_MODE_EXCLUSIVE + 1),\n    VK_SHARING_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkSharingMode;\n\ntypedef enum VkImageLayout {\n    VK_IMAGE_LAYOUT_UNDEFINED = 0,\n    VK_IMAGE_LAYOUT_GENERAL = 1,\n    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2,\n    VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3,\n    VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4,\n    VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5,\n    VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6,\n    VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7,\n    VK_IMAGE_LAYOUT_PREINITIALIZED = 8,\n    VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,\n    VK_IMAGE_LAYOUT_BEGIN_RANGE = VK_IMAGE_LAYOUT_UNDEFINED,\n    VK_IMAGE_LAYOUT_END_RANGE = VK_IMAGE_LAYOUT_PREINITIALIZED,\n    VK_IMAGE_LAYOUT_RANGE_SIZE = (VK_IMAGE_LAYOUT_PREINITIALIZED - VK_IMAGE_LAYOUT_UNDEFINED + 1),\n    VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF\n} VkImageLayout;\n\ntypedef enum VkImageViewType {\n    VK_IMAGE_VIEW_TYPE_1D = 0,\n    VK_IMAGE_VIEW_TYPE_2D = 1,\n    VK_IMAGE_VIEW_TYPE_3D = 2,\n    VK_IMAGE_VIEW_TYPE_CUBE = 3,\n    VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4,\n    VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5,\n    VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6,\n    VK_IMAGE_VIEW_TYPE_BEGIN_RANGE = VK_IMAGE_VIEW_TYPE_1D,\n    VK_IMAGE_VIEW_TYPE_END_RANGE = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY,\n    VK_IMAGE_VIEW_TYPE_RANGE_SIZE = (VK_IMAGE_VIEW_TYPE_CUBE_ARRAY - VK_IMAGE_VIEW_TYPE_1D + 1),\n    VK_IMAGE_VIEW_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkImageViewType;\n\ntypedef enum VkComponentSwizzle {\n    VK_COMPONENT_SWIZZLE_IDENTITY = 0,\n    VK_COMPONENT_SWIZZLE_ZERO = 1,\n    VK_COMPONENT_SWIZZLE_ONE = 2,\n    VK_COMPONENT_SWIZZLE_R = 3,\n    VK_COMPONENT_SWIZZLE_G = 4,\n    VK_COMPONENT_SWIZZLE_B = 5,\n    VK_COMPONENT_SWIZZLE_A = 6,\n    VK_COMPONENT_SWIZZLE_BEGIN_RANGE = VK_COMPONENT_SWIZZLE_IDENTITY,\n    VK_COMPONENT_SWIZZLE_END_RANGE = VK_COMPONENT_SWIZZLE_A,\n    VK_COMPONENT_SWIZZLE_RANGE_SIZE = (VK_COMPONENT_SWIZZLE_A - VK_COMPONENT_SWIZZLE_IDENTITY + 1),\n    VK_COMPONENT_SWIZZLE_MAX_ENUM = 0x7FFFFFFF\n} VkComponentSwizzle;\n\ntypedef enum VkVertexInputRate {\n    VK_VERTEX_INPUT_RATE_VERTEX = 0,\n    VK_VERTEX_INPUT_RATE_INSTANCE = 1,\n    VK_VERTEX_INPUT_RATE_BEGIN_RANGE = VK_VERTEX_INPUT_RATE_VERTEX,\n    VK_VERTEX_INPUT_RATE_END_RANGE = VK_VERTEX_INPUT_RATE_INSTANCE,\n    VK_VERTEX_INPUT_RATE_RANGE_SIZE = (VK_VERTEX_INPUT_RATE_INSTANCE - VK_VERTEX_INPUT_RATE_VERTEX + 1),\n    VK_VERTEX_INPUT_RATE_MAX_ENUM = 0x7FFFFFFF\n} VkVertexInputRate;\n\ntypedef enum VkPrimitiveTopology {\n    VK_PRIMITIVE_TOPOLOGY_POINT_LIST = 0,\n    VK_PRIMITIVE_TOPOLOGY_LINE_LIST = 1,\n    VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = 2,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = 3,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = 4,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = 5,\n    VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY = 6,\n    VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY = 7,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY = 8,\n    VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY = 9,\n    VK_PRIMITIVE_TOPOLOGY_PATCH_LIST = 10,\n    VK_PRIMITIVE_TOPOLOGY_BEGIN_RANGE = VK_PRIMITIVE_TOPOLOGY_POINT_LIST,\n    VK_PRIMITIVE_TOPOLOGY_END_RANGE = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,\n    VK_PRIMITIVE_TOPOLOGY_RANGE_SIZE = (VK_PRIMITIVE_TOPOLOGY_PATCH_LIST - VK_PRIMITIVE_TOPOLOGY_POINT_LIST + 1),\n    VK_PRIMITIVE_TOPOLOGY_MAX_ENUM = 0x7FFFFFFF\n} VkPrimitiveTopology;\n\ntypedef enum VkPolygonMode {\n    VK_POLYGON_MODE_FILL = 0,\n    VK_POLYGON_MODE_LINE = 1,\n    VK_POLYGON_MODE_POINT = 2,\n    VK_POLYGON_MODE_BEGIN_RANGE = VK_POLYGON_MODE_FILL,\n    VK_POLYGON_MODE_END_RANGE = VK_POLYGON_MODE_POINT,\n    VK_POLYGON_MODE_RANGE_SIZE = (VK_POLYGON_MODE_POINT - VK_POLYGON_MODE_FILL + 1),\n    VK_POLYGON_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkPolygonMode;\n\ntypedef enum VkFrontFace {\n    VK_FRONT_FACE_COUNTER_CLOCKWISE = 0,\n    VK_FRONT_FACE_CLOCKWISE = 1,\n    VK_FRONT_FACE_BEGIN_RANGE = VK_FRONT_FACE_COUNTER_CLOCKWISE,\n    VK_FRONT_FACE_END_RANGE = VK_FRONT_FACE_CLOCKWISE,\n    VK_FRONT_FACE_RANGE_SIZE = (VK_FRONT_FACE_CLOCKWISE - VK_FRONT_FACE_COUNTER_CLOCKWISE + 1),\n    VK_FRONT_FACE_MAX_ENUM = 0x7FFFFFFF\n} VkFrontFace;\n\ntypedef enum VkCompareOp {\n    VK_COMPARE_OP_NEVER = 0,\n    VK_COMPARE_OP_LESS = 1,\n    VK_COMPARE_OP_EQUAL = 2,\n    VK_COMPARE_OP_LESS_OR_EQUAL = 3,\n    VK_COMPARE_OP_GREATER = 4,\n    VK_COMPARE_OP_NOT_EQUAL = 5,\n    VK_COMPARE_OP_GREATER_OR_EQUAL = 6,\n    VK_COMPARE_OP_ALWAYS = 7,\n    VK_COMPARE_OP_BEGIN_RANGE = VK_COMPARE_OP_NEVER,\n    VK_COMPARE_OP_END_RANGE = VK_COMPARE_OP_ALWAYS,\n    VK_COMPARE_OP_RANGE_SIZE = (VK_COMPARE_OP_ALWAYS - VK_COMPARE_OP_NEVER + 1),\n    VK_COMPARE_OP_MAX_ENUM = 0x7FFFFFFF\n} VkCompareOp;\n\ntypedef enum VkStencilOp {\n    VK_STENCIL_OP_KEEP = 0,\n    VK_STENCIL_OP_ZERO = 1,\n    VK_STENCIL_OP_REPLACE = 2,\n    VK_STENCIL_OP_INCREMENT_AND_CLAMP = 3,\n    VK_STENCIL_OP_DECREMENT_AND_CLAMP = 4,\n    VK_STENCIL_OP_INVERT = 5,\n    VK_STENCIL_OP_INCREMENT_AND_WRAP = 6,\n    VK_STENCIL_OP_DECREMENT_AND_WRAP = 7,\n    VK_STENCIL_OP_BEGIN_RANGE = VK_STENCIL_OP_KEEP,\n    VK_STENCIL_OP_END_RANGE = VK_STENCIL_OP_DECREMENT_AND_WRAP,\n    VK_STENCIL_OP_RANGE_SIZE = (VK_STENCIL_OP_DECREMENT_AND_WRAP - VK_STENCIL_OP_KEEP + 1),\n    VK_STENCIL_OP_MAX_ENUM = 0x7FFFFFFF\n} VkStencilOp;\n\ntypedef enum VkLogicOp {\n    VK_LOGIC_OP_CLEAR = 0,\n    VK_LOGIC_OP_AND = 1,\n    VK_LOGIC_OP_AND_REVERSE = 2,\n    VK_LOGIC_OP_COPY = 3,\n    VK_LOGIC_OP_AND_INVERTED = 4,\n    VK_LOGIC_OP_NO_OP = 5,\n    VK_LOGIC_OP_XOR = 6,\n    VK_LOGIC_OP_OR = 7,\n    VK_LOGIC_OP_NOR = 8,\n    VK_LOGIC_OP_EQUIVALENT = 9,\n    VK_LOGIC_OP_INVERT = 10,\n    VK_LOGIC_OP_OR_REVERSE = 11,\n    VK_LOGIC_OP_COPY_INVERTED = 12,\n    VK_LOGIC_OP_OR_INVERTED = 13,\n    VK_LOGIC_OP_NAND = 14,\n    VK_LOGIC_OP_SET = 15,\n    VK_LOGIC_OP_BEGIN_RANGE = VK_LOGIC_OP_CLEAR,\n    VK_LOGIC_OP_END_RANGE = VK_LOGIC_OP_SET,\n    VK_LOGIC_OP_RANGE_SIZE = (VK_LOGIC_OP_SET - VK_LOGIC_OP_CLEAR + 1),\n    VK_LOGIC_OP_MAX_ENUM = 0x7FFFFFFF\n} VkLogicOp;\n\ntypedef enum VkBlendFactor {\n    VK_BLEND_FACTOR_ZERO = 0,\n    VK_BLEND_FACTOR_ONE = 1,\n    VK_BLEND_FACTOR_SRC_COLOR = 2,\n    VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR = 3,\n    VK_BLEND_FACTOR_DST_COLOR = 4,\n    VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR = 5,\n    VK_BLEND_FACTOR_SRC_ALPHA = 6,\n    VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA = 7,\n    VK_BLEND_FACTOR_DST_ALPHA = 8,\n    VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA = 9,\n    VK_BLEND_FACTOR_CONSTANT_COLOR = 10,\n    VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR = 11,\n    VK_BLEND_FACTOR_CONSTANT_ALPHA = 12,\n    VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA = 13,\n    VK_BLEND_FACTOR_SRC_ALPHA_SATURATE = 14,\n    VK_BLEND_FACTOR_SRC1_COLOR = 15,\n    VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR = 16,\n    VK_BLEND_FACTOR_SRC1_ALPHA = 17,\n    VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA = 18,\n    VK_BLEND_FACTOR_BEGIN_RANGE = VK_BLEND_FACTOR_ZERO,\n    VK_BLEND_FACTOR_END_RANGE = VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA,\n    VK_BLEND_FACTOR_RANGE_SIZE = (VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA - VK_BLEND_FACTOR_ZERO + 1),\n    VK_BLEND_FACTOR_MAX_ENUM = 0x7FFFFFFF\n} VkBlendFactor;\n\ntypedef enum VkBlendOp {\n    VK_BLEND_OP_ADD = 0,\n    VK_BLEND_OP_SUBTRACT = 1,\n    VK_BLEND_OP_REVERSE_SUBTRACT = 2,\n    VK_BLEND_OP_MIN = 3,\n    VK_BLEND_OP_MAX = 4,\n    VK_BLEND_OP_BEGIN_RANGE = VK_BLEND_OP_ADD,\n    VK_BLEND_OP_END_RANGE = VK_BLEND_OP_MAX,\n    VK_BLEND_OP_RANGE_SIZE = (VK_BLEND_OP_MAX - VK_BLEND_OP_ADD + 1),\n    VK_BLEND_OP_MAX_ENUM = 0x7FFFFFFF\n} VkBlendOp;\n\ntypedef enum VkDynamicState {\n    VK_DYNAMIC_STATE_VIEWPORT = 0,\n    VK_DYNAMIC_STATE_SCISSOR = 1,\n    VK_DYNAMIC_STATE_LINE_WIDTH = 2,\n    VK_DYNAMIC_STATE_DEPTH_BIAS = 3,\n    VK_DYNAMIC_STATE_BLEND_CONSTANTS = 4,\n    VK_DYNAMIC_STATE_DEPTH_BOUNDS = 5,\n    VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = 6,\n    VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = 7,\n    VK_DYNAMIC_STATE_STENCIL_REFERENCE = 8,\n    VK_DYNAMIC_STATE_BEGIN_RANGE = VK_DYNAMIC_STATE_VIEWPORT,\n    VK_DYNAMIC_STATE_END_RANGE = VK_DYNAMIC_STATE_STENCIL_REFERENCE,\n    VK_DYNAMIC_STATE_RANGE_SIZE = (VK_DYNAMIC_STATE_STENCIL_REFERENCE - VK_DYNAMIC_STATE_VIEWPORT + 1),\n    VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF\n} VkDynamicState;\n\ntypedef enum VkFilter {\n    VK_FILTER_NEAREST = 0,\n    VK_FILTER_LINEAR = 1,\n    VK_FILTER_CUBIC_IMG = 1000015000,\n    VK_FILTER_BEGIN_RANGE = VK_FILTER_NEAREST,\n    VK_FILTER_END_RANGE = VK_FILTER_LINEAR,\n    VK_FILTER_RANGE_SIZE = (VK_FILTER_LINEAR - VK_FILTER_NEAREST + 1),\n    VK_FILTER_MAX_ENUM = 0x7FFFFFFF\n} VkFilter;\n\ntypedef enum VkSamplerMipmapMode {\n    VK_SAMPLER_MIPMAP_MODE_NEAREST = 0,\n    VK_SAMPLER_MIPMAP_MODE_LINEAR = 1,\n    VK_SAMPLER_MIPMAP_MODE_BEGIN_RANGE = VK_SAMPLER_MIPMAP_MODE_NEAREST,\n    VK_SAMPLER_MIPMAP_MODE_END_RANGE = VK_SAMPLER_MIPMAP_MODE_LINEAR,\n    VK_SAMPLER_MIPMAP_MODE_RANGE_SIZE = (VK_SAMPLER_MIPMAP_MODE_LINEAR - VK_SAMPLER_MIPMAP_MODE_NEAREST + 1),\n    VK_SAMPLER_MIPMAP_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkSamplerMipmapMode;\n\ntypedef enum VkSamplerAddressMode {\n    VK_SAMPLER_ADDRESS_MODE_REPEAT = 0,\n    VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1,\n    VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2,\n    VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3,\n    VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4,\n    VK_SAMPLER_ADDRESS_MODE_BEGIN_RANGE = VK_SAMPLER_ADDRESS_MODE_REPEAT,\n    VK_SAMPLER_ADDRESS_MODE_END_RANGE = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,\n    VK_SAMPLER_ADDRESS_MODE_RANGE_SIZE = (VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER - VK_SAMPLER_ADDRESS_MODE_REPEAT + 1),\n    VK_SAMPLER_ADDRESS_MODE_MAX_ENUM = 0x7FFFFFFF\n} VkSamplerAddressMode;\n\ntypedef enum VkBorderColor {\n    VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0,\n    VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 1,\n    VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 2,\n    VK_BORDER_COLOR_INT_OPAQUE_BLACK = 3,\n    VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 4,\n    VK_BORDER_COLOR_INT_OPAQUE_WHITE = 5,\n    VK_BORDER_COLOR_BEGIN_RANGE = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,\n    VK_BORDER_COLOR_END_RANGE = VK_BORDER_COLOR_INT_OPAQUE_WHITE,\n    VK_BORDER_COLOR_RANGE_SIZE = (VK_BORDER_COLOR_INT_OPAQUE_WHITE - VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK + 1),\n    VK_BORDER_COLOR_MAX_ENUM = 0x7FFFFFFF\n} VkBorderColor;\n\ntypedef enum VkDescriptorType {\n    VK_DESCRIPTOR_TYPE_SAMPLER = 0,\n    VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = 1,\n    VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = 2,\n    VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = 3,\n    VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = 4,\n    VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = 5,\n    VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = 6,\n    VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = 7,\n    VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8,\n    VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9,\n    VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10,\n    VK_DESCRIPTOR_TYPE_BEGIN_RANGE = VK_DESCRIPTOR_TYPE_SAMPLER,\n    VK_DESCRIPTOR_TYPE_END_RANGE = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,\n    VK_DESCRIPTOR_TYPE_RANGE_SIZE = (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT - VK_DESCRIPTOR_TYPE_SAMPLER + 1),\n    VK_DESCRIPTOR_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkDescriptorType;\n\ntypedef enum VkAttachmentLoadOp {\n    VK_ATTACHMENT_LOAD_OP_LOAD = 0,\n    VK_ATTACHMENT_LOAD_OP_CLEAR = 1,\n    VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2,\n    VK_ATTACHMENT_LOAD_OP_BEGIN_RANGE = VK_ATTACHMENT_LOAD_OP_LOAD,\n    VK_ATTACHMENT_LOAD_OP_END_RANGE = VK_ATTACHMENT_LOAD_OP_DONT_CARE,\n    VK_ATTACHMENT_LOAD_OP_RANGE_SIZE = (VK_ATTACHMENT_LOAD_OP_DONT_CARE - VK_ATTACHMENT_LOAD_OP_LOAD + 1),\n    VK_ATTACHMENT_LOAD_OP_MAX_ENUM = 0x7FFFFFFF\n} VkAttachmentLoadOp;\n\ntypedef enum VkAttachmentStoreOp {\n    VK_ATTACHMENT_STORE_OP_STORE = 0,\n    VK_ATTACHMENT_STORE_OP_DONT_CARE = 1,\n    VK_ATTACHMENT_STORE_OP_BEGIN_RANGE = VK_ATTACHMENT_STORE_OP_STORE,\n    VK_ATTACHMENT_STORE_OP_END_RANGE = VK_ATTACHMENT_STORE_OP_DONT_CARE,\n    VK_ATTACHMENT_STORE_OP_RANGE_SIZE = (VK_ATTACHMENT_STORE_OP_DONT_CARE - VK_ATTACHMENT_STORE_OP_STORE + 1),\n    VK_ATTACHMENT_STORE_OP_MAX_ENUM = 0x7FFFFFFF\n} VkAttachmentStoreOp;\n\ntypedef enum VkPipelineBindPoint {\n    VK_PIPELINE_BIND_POINT_GRAPHICS = 0,\n    VK_PIPELINE_BIND_POINT_COMPUTE = 1,\n    VK_PIPELINE_BIND_POINT_BEGIN_RANGE = VK_PIPELINE_BIND_POINT_GRAPHICS,\n    VK_PIPELINE_BIND_POINT_END_RANGE = VK_PIPELINE_BIND_POINT_COMPUTE,\n    VK_PIPELINE_BIND_POINT_RANGE_SIZE = (VK_PIPELINE_BIND_POINT_COMPUTE - VK_PIPELINE_BIND_POINT_GRAPHICS + 1),\n    VK_PIPELINE_BIND_POINT_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineBindPoint;\n\ntypedef enum VkCommandBufferLevel {\n    VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0,\n    VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1,\n    VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE = VK_COMMAND_BUFFER_LEVEL_PRIMARY,\n    VK_COMMAND_BUFFER_LEVEL_END_RANGE = VK_COMMAND_BUFFER_LEVEL_SECONDARY,\n    VK_COMMAND_BUFFER_LEVEL_RANGE_SIZE = (VK_COMMAND_BUFFER_LEVEL_SECONDARY - VK_COMMAND_BUFFER_LEVEL_PRIMARY + 1),\n    VK_COMMAND_BUFFER_LEVEL_MAX_ENUM = 0x7FFFFFFF\n} VkCommandBufferLevel;\n\ntypedef enum VkIndexType {\n    VK_INDEX_TYPE_UINT16 = 0,\n    VK_INDEX_TYPE_UINT32 = 1,\n    VK_INDEX_TYPE_BEGIN_RANGE = VK_INDEX_TYPE_UINT16,\n    VK_INDEX_TYPE_END_RANGE = VK_INDEX_TYPE_UINT32,\n    VK_INDEX_TYPE_RANGE_SIZE = (VK_INDEX_TYPE_UINT32 - VK_INDEX_TYPE_UINT16 + 1),\n    VK_INDEX_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkIndexType;\n\ntypedef enum VkSubpassContents {\n    VK_SUBPASS_CONTENTS_INLINE = 0,\n    VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1,\n    VK_SUBPASS_CONTENTS_BEGIN_RANGE = VK_SUBPASS_CONTENTS_INLINE,\n    VK_SUBPASS_CONTENTS_END_RANGE = VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS,\n    VK_SUBPASS_CONTENTS_RANGE_SIZE = (VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS - VK_SUBPASS_CONTENTS_INLINE + 1),\n    VK_SUBPASS_CONTENTS_MAX_ENUM = 0x7FFFFFFF\n} VkSubpassContents;\n\ntypedef VkFlags VkInstanceCreateFlags;\n\ntypedef enum VkFormatFeatureFlagBits {\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 0x00000001,\n    VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = 0x00000002,\n    VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = 0x00000004,\n    VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000008,\n    VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = 0x00000010,\n    VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 0x00000020,\n    VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = 0x00000040,\n    VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = 0x00000080,\n    VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = 0x00000100,\n    VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000200,\n    VK_FORMAT_FEATURE_BLIT_SRC_BIT = 0x00000400,\n    VK_FORMAT_FEATURE_BLIT_DST_BIT = 0x00000800,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0x00001000,\n    VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = 0x00002000,\n    VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR = 0x00004000,\n    VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR = 0x00008000,\n    VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkFormatFeatureFlagBits;\ntypedef VkFlags VkFormatFeatureFlags;\n\ntypedef enum VkImageUsageFlagBits {\n    VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0x00000001,\n    VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0x00000002,\n    VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004,\n    VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008,\n    VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010,\n    VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,\n    VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,\n    VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,\n    VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkImageUsageFlagBits;\ntypedef VkFlags VkImageUsageFlags;\n\ntypedef enum VkImageCreateFlagBits {\n    VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 0x00000001,\n    VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,\n    VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004,\n    VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008,\n    VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010,\n    VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR = 0x00000020,\n    VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkImageCreateFlagBits;\ntypedef VkFlags VkImageCreateFlags;\n\ntypedef enum VkSampleCountFlagBits {\n    VK_SAMPLE_COUNT_1_BIT = 0x00000001,\n    VK_SAMPLE_COUNT_2_BIT = 0x00000002,\n    VK_SAMPLE_COUNT_4_BIT = 0x00000004,\n    VK_SAMPLE_COUNT_8_BIT = 0x00000008,\n    VK_SAMPLE_COUNT_16_BIT = 0x00000010,\n    VK_SAMPLE_COUNT_32_BIT = 0x00000020,\n    VK_SAMPLE_COUNT_64_BIT = 0x00000040,\n    VK_SAMPLE_COUNT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSampleCountFlagBits;\ntypedef VkFlags VkSampleCountFlags;\n\ntypedef enum VkQueueFlagBits {\n    VK_QUEUE_GRAPHICS_BIT = 0x00000001,\n    VK_QUEUE_COMPUTE_BIT = 0x00000002,\n    VK_QUEUE_TRANSFER_BIT = 0x00000004,\n    VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008,\n    VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkQueueFlagBits;\ntypedef VkFlags VkQueueFlags;\n\ntypedef enum VkMemoryPropertyFlagBits {\n    VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = 0x00000001,\n    VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 0x00000002,\n    VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 0x00000004,\n    VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0x00000008,\n    VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010,\n    VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkMemoryPropertyFlagBits;\ntypedef VkFlags VkMemoryPropertyFlags;\n\ntypedef enum VkMemoryHeapFlagBits {\n    VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 0x00000001,\n    VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkMemoryHeapFlagBits;\ntypedef VkFlags VkMemoryHeapFlags;\ntypedef VkFlags VkDeviceCreateFlags;\ntypedef VkFlags VkDeviceQueueCreateFlags;\n\ntypedef enum VkPipelineStageFlagBits {\n    VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = 0x00000001,\n    VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = 0x00000002,\n    VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = 0x00000004,\n    VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = 0x00000008,\n    VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = 0x00000010,\n    VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = 0x00000020,\n    VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = 0x00000040,\n    VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = 0x00000080,\n    VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = 0x00000100,\n    VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = 0x00000200,\n    VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400,\n    VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 0x00000800,\n    VK_PIPELINE_STAGE_TRANSFER_BIT = 0x00001000,\n    VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = 0x00002000,\n    VK_PIPELINE_STAGE_HOST_BIT = 0x00004000,\n    VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 0x00008000,\n    VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 0x00010000,\n    VK_PIPELINE_STAGE_COMMAND_PROCESS_BIT_NVX = 0x00020000,\n    VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineStageFlagBits;\ntypedef VkFlags VkPipelineStageFlags;\ntypedef VkFlags VkMemoryMapFlags;\n\ntypedef enum VkImageAspectFlagBits {\n    VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,\n    VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,\n    VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,\n    VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,\n    VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkImageAspectFlagBits;\ntypedef VkFlags VkImageAspectFlags;\n\ntypedef enum VkSparseImageFormatFlagBits {\n    VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = 0x00000001,\n    VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = 0x00000002,\n    VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = 0x00000004,\n    VK_SPARSE_IMAGE_FORMAT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSparseImageFormatFlagBits;\ntypedef VkFlags VkSparseImageFormatFlags;\n\ntypedef enum VkSparseMemoryBindFlagBits {\n    VK_SPARSE_MEMORY_BIND_METADATA_BIT = 0x00000001,\n    VK_SPARSE_MEMORY_BIND_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkSparseMemoryBindFlagBits;\ntypedef VkFlags VkSparseMemoryBindFlags;\n\ntypedef enum VkFenceCreateFlagBits {\n    VK_FENCE_CREATE_SIGNALED_BIT = 0x00000001,\n    VK_FENCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkFenceCreateFlagBits;\ntypedef VkFlags VkFenceCreateFlags;\ntypedef VkFlags VkSemaphoreCreateFlags;\ntypedef VkFlags VkEventCreateFlags;\ntypedef VkFlags VkQueryPoolCreateFlags;\n\ntypedef enum VkQueryPipelineStatisticFlagBits {\n    VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = 0x00000001,\n    VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = 0x00000002,\n    VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = 0x00000004,\n    VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = 0x00000008,\n    VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = 0x00000010,\n    VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = 0x00000020,\n    VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = 0x00000040,\n    VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = 0x00000080,\n    VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 0x00000100,\n    VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 0x00000200,\n    VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 0x00000400,\n    VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkQueryPipelineStatisticFlagBits;\ntypedef VkFlags VkQueryPipelineStatisticFlags;\n\ntypedef enum VkQueryResultFlagBits {\n    VK_QUERY_RESULT_64_BIT = 0x00000001,\n    VK_QUERY_RESULT_WAIT_BIT = 0x00000002,\n    VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004,\n    VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008,\n    VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkQueryResultFlagBits;\ntypedef VkFlags VkQueryResultFlags;\n\ntypedef enum VkBufferCreateFlagBits {\n    VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 0x00000001,\n    VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,\n    VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004,\n    VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkBufferCreateFlagBits;\ntypedef VkFlags VkBufferCreateFlags;\n\ntypedef enum VkBufferUsageFlagBits {\n    VK_BUFFER_USAGE_TRANSFER_SRC_BIT = 0x00000001,\n    VK_BUFFER_USAGE_TRANSFER_DST_BIT = 0x00000002,\n    VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004,\n    VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 0x00000008,\n    VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 0x00000010,\n    VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 0x00000020,\n    VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040,\n    VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080,\n    VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100,\n    VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkBufferUsageFlagBits;\ntypedef VkFlags VkBufferUsageFlags;\ntypedef VkFlags VkBufferViewCreateFlags;\ntypedef VkFlags VkImageViewCreateFlags;\ntypedef VkFlags VkShaderModuleCreateFlags;\ntypedef VkFlags VkPipelineCacheCreateFlags;\n\ntypedef enum VkPipelineCreateFlagBits {\n    VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001,\n    VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002,\n    VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004,\n    VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkPipelineCreateFlagBits;\ntypedef VkFlags VkPipelineCreateFlags;\ntypedef VkFlags VkPipelineShaderStageCreateFlags;\n\ntypedef enum VkShaderStageFlagBits {\n    VK_SHADER_STAGE_VERTEX_BIT = 0x00000001,\n    VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 0x00000002,\n    VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 0x00000004,\n    VK_SHADER_STAGE_GEOMETRY_BIT = 0x00000008,\n    VK_SHADER_STAGE_FRAGMENT_BIT = 0x00000010,\n    VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020,\n    VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F,\n    VK_SHADER_STAGE_ALL = 0x7FFFFFFF,\n    VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkShaderStageFlagBits;\ntypedef VkFlags VkPipelineVertexInputStateCreateFlags;\ntypedef VkFlags VkPipelineInputAssemblyStateCreateFlags;\ntypedef VkFlags VkPipelineTessellationStateCreateFlags;\ntypedef VkFlags VkPipelineViewportStateCreateFlags;\ntypedef VkFlags VkPipelineRasterizationStateCreateFlags;\n\ntypedef enum VkCullModeFlagBits {\n    VK_CULL_MODE_NONE = 0,\n    VK_CULL_MODE_FRONT_BIT = 0x00000001,\n    VK_CULL_MODE_BACK_BIT = 0x00000002,\n    VK_CULL_MODE_FRONT_AND_BACK = 0x00000003,\n    VK_CULL_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCullModeFlagBits;\ntypedef VkFlags VkCullModeFlags;\ntypedef VkFlags VkPipelineMultisampleStateCreateFlags;\ntypedef VkFlags VkPipelineDepthStencilStateCreateFlags;\ntypedef VkFlags VkPipelineColorBlendStateCreateFlags;\n\ntypedef enum VkColorComponentFlagBits {\n    VK_COLOR_COMPONENT_R_BIT = 0x00000001,\n    VK_COLOR_COMPONENT_G_BIT = 0x00000002,\n    VK_COLOR_COMPONENT_B_BIT = 0x00000004,\n    VK_COLOR_COMPONENT_A_BIT = 0x00000008,\n    VK_COLOR_COMPONENT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkColorComponentFlagBits;\ntypedef VkFlags VkColorComponentFlags;\ntypedef VkFlags VkPipelineDynamicStateCreateFlags;\ntypedef VkFlags VkPipelineLayoutCreateFlags;\ntypedef VkFlags VkShaderStageFlags;\ntypedef VkFlags VkSamplerCreateFlags;\ntypedef VkFlags VkDescriptorSetLayoutCreateFlags;\n\ntypedef enum VkDescriptorPoolCreateFlagBits {\n    VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001,\n    VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkDescriptorPoolCreateFlagBits;\ntypedef VkFlags VkDescriptorPoolCreateFlags;\ntypedef VkFlags VkDescriptorPoolResetFlags;\ntypedef VkFlags VkFramebufferCreateFlags;\ntypedef VkFlags VkRenderPassCreateFlags;\n\ntypedef enum VkAttachmentDescriptionFlagBits {\n    VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0x00000001,\n    VK_ATTACHMENT_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkAttachmentDescriptionFlagBits;\ntypedef VkFlags VkAttachmentDescriptionFlags;\ntypedef VkFlags VkSubpassDescriptionFlags;\n\ntypedef enum VkAccessFlagBits {\n    VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 0x00000001,\n    VK_ACCESS_INDEX_READ_BIT = 0x00000002,\n    VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004,\n    VK_ACCESS_UNIFORM_READ_BIT = 0x00000008,\n    VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 0x00000010,\n    VK_ACCESS_SHADER_READ_BIT = 0x00000020,\n    VK_ACCESS_SHADER_WRITE_BIT = 0x00000040,\n    VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0x00000080,\n    VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100,\n    VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200,\n    VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400,\n    VK_ACCESS_TRANSFER_READ_BIT = 0x00000800,\n    VK_ACCESS_TRANSFER_WRITE_BIT = 0x00001000,\n    VK_ACCESS_HOST_READ_BIT = 0x00002000,\n    VK_ACCESS_HOST_WRITE_BIT = 0x00004000,\n    VK_ACCESS_MEMORY_READ_BIT = 0x00008000,\n    VK_ACCESS_MEMORY_WRITE_BIT = 0x00010000,\n    VK_ACCESS_COMMAND_PROCESS_READ_BIT_NVX = 0x00020000,\n    VK_ACCESS_COMMAND_PROCESS_WRITE_BIT_NVX = 0x00040000,\n    VK_ACCESS_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkAccessFlagBits;\ntypedef VkFlags VkAccessFlags;\n\ntypedef enum VkDependencyFlagBits {\n    VK_DEPENDENCY_BY_REGION_BIT = 0x00000001,\n    VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkDependencyFlagBits;\ntypedef VkFlags VkDependencyFlags;\n\ntypedef enum VkCommandPoolCreateFlagBits {\n    VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 0x00000001,\n    VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 0x00000002,\n    VK_COMMAND_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCommandPoolCreateFlagBits;\ntypedef VkFlags VkCommandPoolCreateFlags;\n\ntypedef enum VkCommandPoolResetFlagBits {\n    VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 0x00000001,\n    VK_COMMAND_POOL_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCommandPoolResetFlagBits;\ntypedef VkFlags VkCommandPoolResetFlags;\n\ntypedef enum VkCommandBufferUsageFlagBits {\n    VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 0x00000001,\n    VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 0x00000002,\n    VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 0x00000004,\n    VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCommandBufferUsageFlagBits;\ntypedef VkFlags VkCommandBufferUsageFlags;\n\ntypedef enum VkQueryControlFlagBits {\n    VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001,\n    VK_QUERY_CONTROL_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkQueryControlFlagBits;\ntypedef VkFlags VkQueryControlFlags;\n\ntypedef enum VkCommandBufferResetFlagBits {\n    VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 0x00000001,\n    VK_COMMAND_BUFFER_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkCommandBufferResetFlagBits;\ntypedef VkFlags VkCommandBufferResetFlags;\n\ntypedef enum VkStencilFaceFlagBits {\n    VK_STENCIL_FACE_FRONT_BIT = 0x00000001,\n    VK_STENCIL_FACE_BACK_BIT = 0x00000002,\n    VK_STENCIL_FRONT_AND_BACK = 0x00000003,\n    VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF\n} VkStencilFaceFlagBits;\ntypedef VkFlags VkStencilFaceFlags;\n\ntypedef void* (VKAPI_PTR *PFN_vkAllocationFunction)(\n    void*                                       pUserData,\n    size_t                                      size,\n    size_t                                      alignment,\n    VkSystemAllocationScope                     allocationScope);\n\ntypedef void* (VKAPI_PTR *PFN_vkReallocationFunction)(\n    void*                                       pUserData,\n    void*                                       pOriginal,\n    size_t                                      size,\n    size_t                                      alignment,\n    VkSystemAllocationScope                     allocationScope);\n\ntypedef void (VKAPI_PTR *PFN_vkFreeFunction)(\n    void*                                       pUserData,\n    void*                                       pMemory);\n\ntypedef void (VKAPI_PTR *PFN_vkInternalAllocationNotification)(\n    void*                                       pUserData,\n    size_t                                      size,\n    VkInternalAllocationType                    allocationType,\n    VkSystemAllocationScope                     allocationScope);\n\ntypedef void (VKAPI_PTR *PFN_vkInternalFreeNotification)(\n    void*                                       pUserData,\n    size_t                                      size,\n    VkInternalAllocationType                    allocationType,\n    VkSystemAllocationScope                     allocationScope);\n\ntypedef void (VKAPI_PTR *PFN_vkVoidFunction)(void);\n\ntypedef struct VkApplicationInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    const char*        pApplicationName;\n    uint32_t           applicationVersion;\n    const char*        pEngineName;\n    uint32_t           engineVersion;\n    uint32_t           apiVersion;\n} VkApplicationInfo;\n\ntypedef struct VkInstanceCreateInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkInstanceCreateFlags       flags;\n    const VkApplicationInfo*    pApplicationInfo;\n    uint32_t                    enabledLayerCount;\n    const char* const*          ppEnabledLayerNames;\n    uint32_t                    enabledExtensionCount;\n    const char* const*          ppEnabledExtensionNames;\n} VkInstanceCreateInfo;\n\ntypedef struct VkAllocationCallbacks {\n    void*                                   pUserData;\n    PFN_vkAllocationFunction                pfnAllocation;\n    PFN_vkReallocationFunction              pfnReallocation;\n    PFN_vkFreeFunction                      pfnFree;\n    PFN_vkInternalAllocationNotification    pfnInternalAllocation;\n    PFN_vkInternalFreeNotification          pfnInternalFree;\n} VkAllocationCallbacks;\n\ntypedef struct VkPhysicalDeviceFeatures {\n    VkBool32    robustBufferAccess;\n    VkBool32    fullDrawIndexUint32;\n    VkBool32    imageCubeArray;\n    VkBool32    independentBlend;\n    VkBool32    geometryShader;\n    VkBool32    tessellationShader;\n    VkBool32    sampleRateShading;\n    VkBool32    dualSrcBlend;\n    VkBool32    logicOp;\n    VkBool32    multiDrawIndirect;\n    VkBool32    drawIndirectFirstInstance;\n    VkBool32    depthClamp;\n    VkBool32    depthBiasClamp;\n    VkBool32    fillModeNonSolid;\n    VkBool32    depthBounds;\n    VkBool32    wideLines;\n    VkBool32    largePoints;\n    VkBool32    alphaToOne;\n    VkBool32    multiViewport;\n    VkBool32    samplerAnisotropy;\n    VkBool32    textureCompressionETC2;\n    VkBool32    textureCompressionASTC_LDR;\n    VkBool32    textureCompressionBC;\n    VkBool32    occlusionQueryPrecise;\n    VkBool32    pipelineStatisticsQuery;\n    VkBool32    vertexPipelineStoresAndAtomics;\n    VkBool32    fragmentStoresAndAtomics;\n    VkBool32    shaderTessellationAndGeometryPointSize;\n    VkBool32    shaderImageGatherExtended;\n    VkBool32    shaderStorageImageExtendedFormats;\n    VkBool32    shaderStorageImageMultisample;\n    VkBool32    shaderStorageImageReadWithoutFormat;\n    VkBool32    shaderStorageImageWriteWithoutFormat;\n    VkBool32    shaderUniformBufferArrayDynamicIndexing;\n    VkBool32    shaderSampledImageArrayDynamicIndexing;\n    VkBool32    shaderStorageBufferArrayDynamicIndexing;\n    VkBool32    shaderStorageImageArrayDynamicIndexing;\n    VkBool32    shaderClipDistance;\n    VkBool32    shaderCullDistance;\n    VkBool32    shaderFloat64;\n    VkBool32    shaderInt64;\n    VkBool32    shaderInt16;\n    VkBool32    shaderResourceResidency;\n    VkBool32    shaderResourceMinLod;\n    VkBool32    sparseBinding;\n    VkBool32    sparseResidencyBuffer;\n    VkBool32    sparseResidencyImage2D;\n    VkBool32    sparseResidencyImage3D;\n    VkBool32    sparseResidency2Samples;\n    VkBool32    sparseResidency4Samples;\n    VkBool32    sparseResidency8Samples;\n    VkBool32    sparseResidency16Samples;\n    VkBool32    sparseResidencyAliased;\n    VkBool32    variableMultisampleRate;\n    VkBool32    inheritedQueries;\n} VkPhysicalDeviceFeatures;\n\ntypedef struct VkFormatProperties {\n    VkFormatFeatureFlags    linearTilingFeatures;\n    VkFormatFeatureFlags    optimalTilingFeatures;\n    VkFormatFeatureFlags    bufferFeatures;\n} VkFormatProperties;\n\ntypedef struct VkExtent3D {\n    uint32_t    width;\n    uint32_t    height;\n    uint32_t    depth;\n} VkExtent3D;\n\ntypedef struct VkImageFormatProperties {\n    VkExtent3D            maxExtent;\n    uint32_t              maxMipLevels;\n    uint32_t              maxArrayLayers;\n    VkSampleCountFlags    sampleCounts;\n    VkDeviceSize          maxResourceSize;\n} VkImageFormatProperties;\n\ntypedef struct VkPhysicalDeviceLimits {\n    uint32_t              maxImageDimension1D;\n    uint32_t              maxImageDimension2D;\n    uint32_t              maxImageDimension3D;\n    uint32_t              maxImageDimensionCube;\n    uint32_t              maxImageArrayLayers;\n    uint32_t              maxTexelBufferElements;\n    uint32_t              maxUniformBufferRange;\n    uint32_t              maxStorageBufferRange;\n    uint32_t              maxPushConstantsSize;\n    uint32_t              maxMemoryAllocationCount;\n    uint32_t              maxSamplerAllocationCount;\n    VkDeviceSize          bufferImageGranularity;\n    VkDeviceSize          sparseAddressSpaceSize;\n    uint32_t              maxBoundDescriptorSets;\n    uint32_t              maxPerStageDescriptorSamplers;\n    uint32_t              maxPerStageDescriptorUniformBuffers;\n    uint32_t              maxPerStageDescriptorStorageBuffers;\n    uint32_t              maxPerStageDescriptorSampledImages;\n    uint32_t              maxPerStageDescriptorStorageImages;\n    uint32_t              maxPerStageDescriptorInputAttachments;\n    uint32_t              maxPerStageResources;\n    uint32_t              maxDescriptorSetSamplers;\n    uint32_t              maxDescriptorSetUniformBuffers;\n    uint32_t              maxDescriptorSetUniformBuffersDynamic;\n    uint32_t              maxDescriptorSetStorageBuffers;\n    uint32_t              maxDescriptorSetStorageBuffersDynamic;\n    uint32_t              maxDescriptorSetSampledImages;\n    uint32_t              maxDescriptorSetStorageImages;\n    uint32_t              maxDescriptorSetInputAttachments;\n    uint32_t              maxVertexInputAttributes;\n    uint32_t              maxVertexInputBindings;\n    uint32_t              maxVertexInputAttributeOffset;\n    uint32_t              maxVertexInputBindingStride;\n    uint32_t              maxVertexOutputComponents;\n    uint32_t              maxTessellationGenerationLevel;\n    uint32_t              maxTessellationPatchSize;\n    uint32_t              maxTessellationControlPerVertexInputComponents;\n    uint32_t              maxTessellationControlPerVertexOutputComponents;\n    uint32_t              maxTessellationControlPerPatchOutputComponents;\n    uint32_t              maxTessellationControlTotalOutputComponents;\n    uint32_t              maxTessellationEvaluationInputComponents;\n    uint32_t              maxTessellationEvaluationOutputComponents;\n    uint32_t              maxGeometryShaderInvocations;\n    uint32_t              maxGeometryInputComponents;\n    uint32_t              maxGeometryOutputComponents;\n    uint32_t              maxGeometryOutputVertices;\n    uint32_t              maxGeometryTotalOutputComponents;\n    uint32_t              maxFragmentInputComponents;\n    uint32_t              maxFragmentOutputAttachments;\n    uint32_t              maxFragmentDualSrcAttachments;\n    uint32_t              maxFragmentCombinedOutputResources;\n    uint32_t              maxComputeSharedMemorySize;\n    uint32_t              maxComputeWorkGroupCount[3];\n    uint32_t              maxComputeWorkGroupInvocations;\n    uint32_t              maxComputeWorkGroupSize[3];\n    uint32_t              subPixelPrecisionBits;\n    uint32_t              subTexelPrecisionBits;\n    uint32_t              mipmapPrecisionBits;\n    uint32_t              maxDrawIndexedIndexValue;\n    uint32_t              maxDrawIndirectCount;\n    float                 maxSamplerLodBias;\n    float                 maxSamplerAnisotropy;\n    uint32_t              maxViewports;\n    uint32_t              maxViewportDimensions[2];\n    float                 viewportBoundsRange[2];\n    uint32_t              viewportSubPixelBits;\n    size_t                minMemoryMapAlignment;\n    VkDeviceSize          minTexelBufferOffsetAlignment;\n    VkDeviceSize          minUniformBufferOffsetAlignment;\n    VkDeviceSize          minStorageBufferOffsetAlignment;\n    int32_t               minTexelOffset;\n    uint32_t              maxTexelOffset;\n    int32_t               minTexelGatherOffset;\n    uint32_t              maxTexelGatherOffset;\n    float                 minInterpolationOffset;\n    float                 maxInterpolationOffset;\n    uint32_t              subPixelInterpolationOffsetBits;\n    uint32_t              maxFramebufferWidth;\n    uint32_t              maxFramebufferHeight;\n    uint32_t              maxFramebufferLayers;\n    VkSampleCountFlags    framebufferColorSampleCounts;\n    VkSampleCountFlags    framebufferDepthSampleCounts;\n    VkSampleCountFlags    framebufferStencilSampleCounts;\n    VkSampleCountFlags    framebufferNoAttachmentsSampleCounts;\n    uint32_t              maxColorAttachments;\n    VkSampleCountFlags    sampledImageColorSampleCounts;\n    VkSampleCountFlags    sampledImageIntegerSampleCounts;\n    VkSampleCountFlags    sampledImageDepthSampleCounts;\n    VkSampleCountFlags    sampledImageStencilSampleCounts;\n    VkSampleCountFlags    storageImageSampleCounts;\n    uint32_t              maxSampleMaskWords;\n    VkBool32              timestampComputeAndGraphics;\n    float                 timestampPeriod;\n    uint32_t              maxClipDistances;\n    uint32_t              maxCullDistances;\n    uint32_t              maxCombinedClipAndCullDistances;\n    uint32_t              discreteQueuePriorities;\n    float                 pointSizeRange[2];\n    float                 lineWidthRange[2];\n    float                 pointSizeGranularity;\n    float                 lineWidthGranularity;\n    VkBool32              strictLines;\n    VkBool32              standardSampleLocations;\n    VkDeviceSize          optimalBufferCopyOffsetAlignment;\n    VkDeviceSize          optimalBufferCopyRowPitchAlignment;\n    VkDeviceSize          nonCoherentAtomSize;\n} VkPhysicalDeviceLimits;\n\ntypedef struct VkPhysicalDeviceSparseProperties {\n    VkBool32    residencyStandard2DBlockShape;\n    VkBool32    residencyStandard2DMultisampleBlockShape;\n    VkBool32    residencyStandard3DBlockShape;\n    VkBool32    residencyAlignedMipSize;\n    VkBool32    residencyNonResidentStrict;\n} VkPhysicalDeviceSparseProperties;\n\ntypedef struct VkPhysicalDeviceProperties {\n    uint32_t                            apiVersion;\n    uint32_t                            driverVersion;\n    uint32_t                            vendorID;\n    uint32_t                            deviceID;\n    VkPhysicalDeviceType                deviceType;\n    char                                deviceName[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE];\n    uint8_t                             pipelineCacheUUID[VK_UUID_SIZE];\n    VkPhysicalDeviceLimits              limits;\n    VkPhysicalDeviceSparseProperties    sparseProperties;\n} VkPhysicalDeviceProperties;\n\ntypedef struct VkQueueFamilyProperties {\n    VkQueueFlags    queueFlags;\n    uint32_t        queueCount;\n    uint32_t        timestampValidBits;\n    VkExtent3D      minImageTransferGranularity;\n} VkQueueFamilyProperties;\n\ntypedef struct VkMemoryType {\n    VkMemoryPropertyFlags    propertyFlags;\n    uint32_t                 heapIndex;\n} VkMemoryType;\n\ntypedef struct VkMemoryHeap {\n    VkDeviceSize         size;\n    VkMemoryHeapFlags    flags;\n} VkMemoryHeap;\n\ntypedef struct VkPhysicalDeviceMemoryProperties {\n    uint32_t        memoryTypeCount;\n    VkMemoryType    memoryTypes[VK_MAX_MEMORY_TYPES];\n    uint32_t        memoryHeapCount;\n    VkMemoryHeap    memoryHeaps[VK_MAX_MEMORY_HEAPS];\n} VkPhysicalDeviceMemoryProperties;\n\ntypedef struct VkDeviceQueueCreateInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkDeviceQueueCreateFlags    flags;\n    uint32_t                    queueFamilyIndex;\n    uint32_t                    queueCount;\n    const float*                pQueuePriorities;\n} VkDeviceQueueCreateInfo;\n\ntypedef struct VkDeviceCreateInfo {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkDeviceCreateFlags                flags;\n    uint32_t                           queueCreateInfoCount;\n    const VkDeviceQueueCreateInfo*     pQueueCreateInfos;\n    uint32_t                           enabledLayerCount;\n    const char* const*                 ppEnabledLayerNames;\n    uint32_t                           enabledExtensionCount;\n    const char* const*                 ppEnabledExtensionNames;\n    const VkPhysicalDeviceFeatures*    pEnabledFeatures;\n} VkDeviceCreateInfo;\n\ntypedef struct VkExtensionProperties {\n    char        extensionName[VK_MAX_EXTENSION_NAME_SIZE];\n    uint32_t    specVersion;\n} VkExtensionProperties;\n\ntypedef struct VkLayerProperties {\n    char        layerName[VK_MAX_EXTENSION_NAME_SIZE];\n    uint32_t    specVersion;\n    uint32_t    implementationVersion;\n    char        description[VK_MAX_DESCRIPTION_SIZE];\n} VkLayerProperties;\n\ntypedef struct VkSubmitInfo {\n    VkStructureType                sType;\n    const void*                    pNext;\n    uint32_t                       waitSemaphoreCount;\n    const VkSemaphore*             pWaitSemaphores;\n    const VkPipelineStageFlags*    pWaitDstStageMask;\n    uint32_t                       commandBufferCount;\n    const VkCommandBuffer*         pCommandBuffers;\n    uint32_t                       signalSemaphoreCount;\n    const VkSemaphore*             pSignalSemaphores;\n} VkSubmitInfo;\n\ntypedef struct VkMemoryAllocateInfo {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceSize       allocationSize;\n    uint32_t           memoryTypeIndex;\n} VkMemoryAllocateInfo;\n\ntypedef struct VkMappedMemoryRange {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDeviceMemory     memory;\n    VkDeviceSize       offset;\n    VkDeviceSize       size;\n} VkMappedMemoryRange;\n\ntypedef struct VkMemoryRequirements {\n    VkDeviceSize    size;\n    VkDeviceSize    alignment;\n    uint32_t        memoryTypeBits;\n} VkMemoryRequirements;\n\ntypedef struct VkSparseImageFormatProperties {\n    VkImageAspectFlags          aspectMask;\n    VkExtent3D                  imageGranularity;\n    VkSparseImageFormatFlags    flags;\n} VkSparseImageFormatProperties;\n\ntypedef struct VkSparseImageMemoryRequirements {\n    VkSparseImageFormatProperties    formatProperties;\n    uint32_t                         imageMipTailFirstLod;\n    VkDeviceSize                     imageMipTailSize;\n    VkDeviceSize                     imageMipTailOffset;\n    VkDeviceSize                     imageMipTailStride;\n} VkSparseImageMemoryRequirements;\n\ntypedef struct VkSparseMemoryBind {\n    VkDeviceSize               resourceOffset;\n    VkDeviceSize               size;\n    VkDeviceMemory             memory;\n    VkDeviceSize               memoryOffset;\n    VkSparseMemoryBindFlags    flags;\n} VkSparseMemoryBind;\n\ntypedef struct VkSparseBufferMemoryBindInfo {\n    VkBuffer                     buffer;\n    uint32_t                     bindCount;\n    const VkSparseMemoryBind*    pBinds;\n} VkSparseBufferMemoryBindInfo;\n\ntypedef struct VkSparseImageOpaqueMemoryBindInfo {\n    VkImage                      image;\n    uint32_t                     bindCount;\n    const VkSparseMemoryBind*    pBinds;\n} VkSparseImageOpaqueMemoryBindInfo;\n\ntypedef struct VkImageSubresource {\n    VkImageAspectFlags    aspectMask;\n    uint32_t              mipLevel;\n    uint32_t              arrayLayer;\n} VkImageSubresource;\n\ntypedef struct VkOffset3D {\n    int32_t    x;\n    int32_t    y;\n    int32_t    z;\n} VkOffset3D;\n\ntypedef struct VkSparseImageMemoryBind {\n    VkImageSubresource         subresource;\n    VkOffset3D                 offset;\n    VkExtent3D                 extent;\n    VkDeviceMemory             memory;\n    VkDeviceSize               memoryOffset;\n    VkSparseMemoryBindFlags    flags;\n} VkSparseImageMemoryBind;\n\ntypedef struct VkSparseImageMemoryBindInfo {\n    VkImage                           image;\n    uint32_t                          bindCount;\n    const VkSparseImageMemoryBind*    pBinds;\n} VkSparseImageMemoryBindInfo;\n\ntypedef struct VkBindSparseInfo {\n    VkStructureType                             sType;\n    const void*                                 pNext;\n    uint32_t                                    waitSemaphoreCount;\n    const VkSemaphore*                          pWaitSemaphores;\n    uint32_t                                    bufferBindCount;\n    const VkSparseBufferMemoryBindInfo*         pBufferBinds;\n    uint32_t                                    imageOpaqueBindCount;\n    const VkSparseImageOpaqueMemoryBindInfo*    pImageOpaqueBinds;\n    uint32_t                                    imageBindCount;\n    const VkSparseImageMemoryBindInfo*          pImageBinds;\n    uint32_t                                    signalSemaphoreCount;\n    const VkSemaphore*                          pSignalSemaphores;\n} VkBindSparseInfo;\n\ntypedef struct VkFenceCreateInfo {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkFenceCreateFlags    flags;\n} VkFenceCreateInfo;\n\ntypedef struct VkSemaphoreCreateInfo {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkSemaphoreCreateFlags    flags;\n} VkSemaphoreCreateInfo;\n\ntypedef struct VkEventCreateInfo {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkEventCreateFlags    flags;\n} VkEventCreateInfo;\n\ntypedef struct VkQueryPoolCreateInfo {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkQueryPoolCreateFlags           flags;\n    VkQueryType                      queryType;\n    uint32_t                         queryCount;\n    VkQueryPipelineStatisticFlags    pipelineStatistics;\n} VkQueryPoolCreateInfo;\n\ntypedef struct VkBufferCreateInfo {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkBufferCreateFlags    flags;\n    VkDeviceSize           size;\n    VkBufferUsageFlags     usage;\n    VkSharingMode          sharingMode;\n    uint32_t               queueFamilyIndexCount;\n    const uint32_t*        pQueueFamilyIndices;\n} VkBufferCreateInfo;\n\ntypedef struct VkBufferViewCreateInfo {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkBufferViewCreateFlags    flags;\n    VkBuffer                   buffer;\n    VkFormat                   format;\n    VkDeviceSize               offset;\n    VkDeviceSize               range;\n} VkBufferViewCreateInfo;\n\ntypedef struct VkImageCreateInfo {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkImageCreateFlags       flags;\n    VkImageType              imageType;\n    VkFormat                 format;\n    VkExtent3D               extent;\n    uint32_t                 mipLevels;\n    uint32_t                 arrayLayers;\n    VkSampleCountFlagBits    samples;\n    VkImageTiling            tiling;\n    VkImageUsageFlags        usage;\n    VkSharingMode            sharingMode;\n    uint32_t                 queueFamilyIndexCount;\n    const uint32_t*          pQueueFamilyIndices;\n    VkImageLayout            initialLayout;\n} VkImageCreateInfo;\n\ntypedef struct VkSubresourceLayout {\n    VkDeviceSize    offset;\n    VkDeviceSize    size;\n    VkDeviceSize    rowPitch;\n    VkDeviceSize    arrayPitch;\n    VkDeviceSize    depthPitch;\n} VkSubresourceLayout;\n\ntypedef struct VkComponentMapping {\n    VkComponentSwizzle    r;\n    VkComponentSwizzle    g;\n    VkComponentSwizzle    b;\n    VkComponentSwizzle    a;\n} VkComponentMapping;\n\ntypedef struct VkImageSubresourceRange {\n    VkImageAspectFlags    aspectMask;\n    uint32_t              baseMipLevel;\n    uint32_t              levelCount;\n    uint32_t              baseArrayLayer;\n    uint32_t              layerCount;\n} VkImageSubresourceRange;\n\ntypedef struct VkImageViewCreateInfo {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkImageViewCreateFlags     flags;\n    VkImage                    image;\n    VkImageViewType            viewType;\n    VkFormat                   format;\n    VkComponentMapping         components;\n    VkImageSubresourceRange    subresourceRange;\n} VkImageViewCreateInfo;\n\ntypedef struct VkShaderModuleCreateInfo {\n    VkStructureType              sType;\n    const void*                  pNext;\n    VkShaderModuleCreateFlags    flags;\n    size_t                       codeSize;\n    const uint32_t*              pCode;\n} VkShaderModuleCreateInfo;\n\ntypedef struct VkPipelineCacheCreateInfo {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkPipelineCacheCreateFlags    flags;\n    size_t                        initialDataSize;\n    const void*                   pInitialData;\n} VkPipelineCacheCreateInfo;\n\ntypedef struct VkSpecializationMapEntry {\n    uint32_t    constantID;\n    uint32_t    offset;\n    size_t      size;\n} VkSpecializationMapEntry;\n\ntypedef struct VkSpecializationInfo {\n    uint32_t                           mapEntryCount;\n    const VkSpecializationMapEntry*    pMapEntries;\n    size_t                             dataSize;\n    const void*                        pData;\n} VkSpecializationInfo;\n\ntypedef struct VkPipelineShaderStageCreateInfo {\n    VkStructureType                     sType;\n    const void*                         pNext;\n    VkPipelineShaderStageCreateFlags    flags;\n    VkShaderStageFlagBits               stage;\n    VkShaderModule                      module;\n    const char*                         pName;\n    const VkSpecializationInfo*         pSpecializationInfo;\n} VkPipelineShaderStageCreateInfo;\n\ntypedef struct VkVertexInputBindingDescription {\n    uint32_t             binding;\n    uint32_t             stride;\n    VkVertexInputRate    inputRate;\n} VkVertexInputBindingDescription;\n\ntypedef struct VkVertexInputAttributeDescription {\n    uint32_t    location;\n    uint32_t    binding;\n    VkFormat    format;\n    uint32_t    offset;\n} VkVertexInputAttributeDescription;\n\ntypedef struct VkPipelineVertexInputStateCreateInfo {\n    VkStructureType                             sType;\n    const void*                                 pNext;\n    VkPipelineVertexInputStateCreateFlags       flags;\n    uint32_t                                    vertexBindingDescriptionCount;\n    const VkVertexInputBindingDescription*      pVertexBindingDescriptions;\n    uint32_t                                    vertexAttributeDescriptionCount;\n    const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;\n} VkPipelineVertexInputStateCreateInfo;\n\ntypedef struct VkPipelineInputAssemblyStateCreateInfo {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    VkPipelineInputAssemblyStateCreateFlags    flags;\n    VkPrimitiveTopology                        topology;\n    VkBool32                                   primitiveRestartEnable;\n} VkPipelineInputAssemblyStateCreateInfo;\n\ntypedef struct VkPipelineTessellationStateCreateInfo {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkPipelineTessellationStateCreateFlags    flags;\n    uint32_t                                  patchControlPoints;\n} VkPipelineTessellationStateCreateInfo;\n\ntypedef struct VkViewport {\n    float    x;\n    float    y;\n    float    width;\n    float    height;\n    float    minDepth;\n    float    maxDepth;\n} VkViewport;\n\ntypedef struct VkOffset2D {\n    int32_t    x;\n    int32_t    y;\n} VkOffset2D;\n\ntypedef struct VkExtent2D {\n    uint32_t    width;\n    uint32_t    height;\n} VkExtent2D;\n\ntypedef struct VkRect2D {\n    VkOffset2D    offset;\n    VkExtent2D    extent;\n} VkRect2D;\n\ntypedef struct VkPipelineViewportStateCreateInfo {\n    VkStructureType                       sType;\n    const void*                           pNext;\n    VkPipelineViewportStateCreateFlags    flags;\n    uint32_t                              viewportCount;\n    const VkViewport*                     pViewports;\n    uint32_t                              scissorCount;\n    const VkRect2D*                       pScissors;\n} VkPipelineViewportStateCreateInfo;\n\ntypedef struct VkPipelineRasterizationStateCreateInfo {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    VkPipelineRasterizationStateCreateFlags    flags;\n    VkBool32                                   depthClampEnable;\n    VkBool32                                   rasterizerDiscardEnable;\n    VkPolygonMode                              polygonMode;\n    VkCullModeFlags                            cullMode;\n    VkFrontFace                                frontFace;\n    VkBool32                                   depthBiasEnable;\n    float                                      depthBiasConstantFactor;\n    float                                      depthBiasClamp;\n    float                                      depthBiasSlopeFactor;\n    float                                      lineWidth;\n} VkPipelineRasterizationStateCreateInfo;\n\ntypedef struct VkPipelineMultisampleStateCreateInfo {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkPipelineMultisampleStateCreateFlags    flags;\n    VkSampleCountFlagBits                    rasterizationSamples;\n    VkBool32                                 sampleShadingEnable;\n    float                                    minSampleShading;\n    const VkSampleMask*                      pSampleMask;\n    VkBool32                                 alphaToCoverageEnable;\n    VkBool32                                 alphaToOneEnable;\n} VkPipelineMultisampleStateCreateInfo;\n\ntypedef struct VkStencilOpState {\n    VkStencilOp    failOp;\n    VkStencilOp    passOp;\n    VkStencilOp    depthFailOp;\n    VkCompareOp    compareOp;\n    uint32_t       compareMask;\n    uint32_t       writeMask;\n    uint32_t       reference;\n} VkStencilOpState;\n\ntypedef struct VkPipelineDepthStencilStateCreateInfo {\n    VkStructureType                           sType;\n    const void*                               pNext;\n    VkPipelineDepthStencilStateCreateFlags    flags;\n    VkBool32                                  depthTestEnable;\n    VkBool32                                  depthWriteEnable;\n    VkCompareOp                               depthCompareOp;\n    VkBool32                                  depthBoundsTestEnable;\n    VkBool32                                  stencilTestEnable;\n    VkStencilOpState                          front;\n    VkStencilOpState                          back;\n    float                                     minDepthBounds;\n    float                                     maxDepthBounds;\n} VkPipelineDepthStencilStateCreateInfo;\n\ntypedef struct VkPipelineColorBlendAttachmentState {\n    VkBool32                 blendEnable;\n    VkBlendFactor            srcColorBlendFactor;\n    VkBlendFactor            dstColorBlendFactor;\n    VkBlendOp                colorBlendOp;\n    VkBlendFactor            srcAlphaBlendFactor;\n    VkBlendFactor            dstAlphaBlendFactor;\n    VkBlendOp                alphaBlendOp;\n    VkColorComponentFlags    colorWriteMask;\n} VkPipelineColorBlendAttachmentState;\n\ntypedef struct VkPipelineColorBlendStateCreateInfo {\n    VkStructureType                               sType;\n    const void*                                   pNext;\n    VkPipelineColorBlendStateCreateFlags          flags;\n    VkBool32                                      logicOpEnable;\n    VkLogicOp                                     logicOp;\n    uint32_t                                      attachmentCount;\n    const VkPipelineColorBlendAttachmentState*    pAttachments;\n    float                                         blendConstants[4];\n} VkPipelineColorBlendStateCreateInfo;\n\ntypedef struct VkPipelineDynamicStateCreateInfo {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkPipelineDynamicStateCreateFlags    flags;\n    uint32_t                             dynamicStateCount;\n    const VkDynamicState*                pDynamicStates;\n} VkPipelineDynamicStateCreateInfo;\n\ntypedef struct VkGraphicsPipelineCreateInfo {\n    VkStructureType                                  sType;\n    const void*                                      pNext;\n    VkPipelineCreateFlags                            flags;\n    uint32_t                                         stageCount;\n    const VkPipelineShaderStageCreateInfo*           pStages;\n    const VkPipelineVertexInputStateCreateInfo*      pVertexInputState;\n    const VkPipelineInputAssemblyStateCreateInfo*    pInputAssemblyState;\n    const VkPipelineTessellationStateCreateInfo*     pTessellationState;\n    const VkPipelineViewportStateCreateInfo*         pViewportState;\n    const VkPipelineRasterizationStateCreateInfo*    pRasterizationState;\n    const VkPipelineMultisampleStateCreateInfo*      pMultisampleState;\n    const VkPipelineDepthStencilStateCreateInfo*     pDepthStencilState;\n    const VkPipelineColorBlendStateCreateInfo*       pColorBlendState;\n    const VkPipelineDynamicStateCreateInfo*          pDynamicState;\n    VkPipelineLayout                                 layout;\n    VkRenderPass                                     renderPass;\n    uint32_t                                         subpass;\n    VkPipeline                                       basePipelineHandle;\n    int32_t                                          basePipelineIndex;\n} VkGraphicsPipelineCreateInfo;\n\ntypedef struct VkComputePipelineCreateInfo {\n    VkStructureType                    sType;\n    const void*                        pNext;\n    VkPipelineCreateFlags              flags;\n    VkPipelineShaderStageCreateInfo    stage;\n    VkPipelineLayout                   layout;\n    VkPipeline                         basePipelineHandle;\n    int32_t                            basePipelineIndex;\n} VkComputePipelineCreateInfo;\n\ntypedef struct VkPushConstantRange {\n    VkShaderStageFlags    stageFlags;\n    uint32_t              offset;\n    uint32_t              size;\n} VkPushConstantRange;\n\ntypedef struct VkPipelineLayoutCreateInfo {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkPipelineLayoutCreateFlags     flags;\n    uint32_t                        setLayoutCount;\n    const VkDescriptorSetLayout*    pSetLayouts;\n    uint32_t                        pushConstantRangeCount;\n    const VkPushConstantRange*      pPushConstantRanges;\n} VkPipelineLayoutCreateInfo;\n\ntypedef struct VkSamplerCreateInfo {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkSamplerCreateFlags    flags;\n    VkFilter                magFilter;\n    VkFilter                minFilter;\n    VkSamplerMipmapMode     mipmapMode;\n    VkSamplerAddressMode    addressModeU;\n    VkSamplerAddressMode    addressModeV;\n    VkSamplerAddressMode    addressModeW;\n    float                   mipLodBias;\n    VkBool32                anisotropyEnable;\n    float                   maxAnisotropy;\n    VkBool32                compareEnable;\n    VkCompareOp             compareOp;\n    float                   minLod;\n    float                   maxLod;\n    VkBorderColor           borderColor;\n    VkBool32                unnormalizedCoordinates;\n} VkSamplerCreateInfo;\n\ntypedef struct VkDescriptorSetLayoutBinding {\n    uint32_t              binding;\n    VkDescriptorType      descriptorType;\n    uint32_t              descriptorCount;\n    VkShaderStageFlags    stageFlags;\n    const VkSampler*      pImmutableSamplers;\n} VkDescriptorSetLayoutBinding;\n\ntypedef struct VkDescriptorSetLayoutCreateInfo {\n    VkStructureType                        sType;\n    const void*                            pNext;\n    VkDescriptorSetLayoutCreateFlags       flags;\n    uint32_t                               bindingCount;\n    const VkDescriptorSetLayoutBinding*    pBindings;\n} VkDescriptorSetLayoutCreateInfo;\n\ntypedef struct VkDescriptorPoolSize {\n    VkDescriptorType    type;\n    uint32_t            descriptorCount;\n} VkDescriptorPoolSize;\n\ntypedef struct VkDescriptorPoolCreateInfo {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkDescriptorPoolCreateFlags    flags;\n    uint32_t                       maxSets;\n    uint32_t                       poolSizeCount;\n    const VkDescriptorPoolSize*    pPoolSizes;\n} VkDescriptorPoolCreateInfo;\n\ntypedef struct VkDescriptorSetAllocateInfo {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkDescriptorPool                descriptorPool;\n    uint32_t                        descriptorSetCount;\n    const VkDescriptorSetLayout*    pSetLayouts;\n} VkDescriptorSetAllocateInfo;\n\ntypedef struct VkDescriptorImageInfo {\n    VkSampler        sampler;\n    VkImageView      imageView;\n    VkImageLayout    imageLayout;\n} VkDescriptorImageInfo;\n\ntypedef struct VkDescriptorBufferInfo {\n    VkBuffer        buffer;\n    VkDeviceSize    offset;\n    VkDeviceSize    range;\n} VkDescriptorBufferInfo;\n\ntypedef struct VkWriteDescriptorSet {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkDescriptorSet                  dstSet;\n    uint32_t                         dstBinding;\n    uint32_t                         dstArrayElement;\n    uint32_t                         descriptorCount;\n    VkDescriptorType                 descriptorType;\n    const VkDescriptorImageInfo*     pImageInfo;\n    const VkDescriptorBufferInfo*    pBufferInfo;\n    const VkBufferView*              pTexelBufferView;\n} VkWriteDescriptorSet;\n\ntypedef struct VkCopyDescriptorSet {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkDescriptorSet    srcSet;\n    uint32_t           srcBinding;\n    uint32_t           srcArrayElement;\n    VkDescriptorSet    dstSet;\n    uint32_t           dstBinding;\n    uint32_t           dstArrayElement;\n    uint32_t           descriptorCount;\n} VkCopyDescriptorSet;\n\ntypedef struct VkFramebufferCreateInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkFramebufferCreateFlags    flags;\n    VkRenderPass                renderPass;\n    uint32_t                    attachmentCount;\n    const VkImageView*          pAttachments;\n    uint32_t                    width;\n    uint32_t                    height;\n    uint32_t                    layers;\n} VkFramebufferCreateInfo;\n\ntypedef struct VkAttachmentDescription {\n    VkAttachmentDescriptionFlags    flags;\n    VkFormat                        format;\n    VkSampleCountFlagBits           samples;\n    VkAttachmentLoadOp              loadOp;\n    VkAttachmentStoreOp             storeOp;\n    VkAttachmentLoadOp              stencilLoadOp;\n    VkAttachmentStoreOp             stencilStoreOp;\n    VkImageLayout                   initialLayout;\n    VkImageLayout                   finalLayout;\n} VkAttachmentDescription;\n\ntypedef struct VkAttachmentReference {\n    uint32_t         attachment;\n    VkImageLayout    layout;\n} VkAttachmentReference;\n\ntypedef struct VkSubpassDescription {\n    VkSubpassDescriptionFlags       flags;\n    VkPipelineBindPoint             pipelineBindPoint;\n    uint32_t                        inputAttachmentCount;\n    const VkAttachmentReference*    pInputAttachments;\n    uint32_t                        colorAttachmentCount;\n    const VkAttachmentReference*    pColorAttachments;\n    const VkAttachmentReference*    pResolveAttachments;\n    const VkAttachmentReference*    pDepthStencilAttachment;\n    uint32_t                        preserveAttachmentCount;\n    const uint32_t*                 pPreserveAttachments;\n} VkSubpassDescription;\n\ntypedef struct VkSubpassDependency {\n    uint32_t                srcSubpass;\n    uint32_t                dstSubpass;\n    VkPipelineStageFlags    srcStageMask;\n    VkPipelineStageFlags    dstStageMask;\n    VkAccessFlags           srcAccessMask;\n    VkAccessFlags           dstAccessMask;\n    VkDependencyFlags       dependencyFlags;\n} VkSubpassDependency;\n\ntypedef struct VkRenderPassCreateInfo {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkRenderPassCreateFlags           flags;\n    uint32_t                          attachmentCount;\n    const VkAttachmentDescription*    pAttachments;\n    uint32_t                          subpassCount;\n    const VkSubpassDescription*       pSubpasses;\n    uint32_t                          dependencyCount;\n    const VkSubpassDependency*        pDependencies;\n} VkRenderPassCreateInfo;\n\ntypedef struct VkCommandPoolCreateInfo {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkCommandPoolCreateFlags    flags;\n    uint32_t                    queueFamilyIndex;\n} VkCommandPoolCreateInfo;\n\ntypedef struct VkCommandBufferAllocateInfo {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkCommandPool           commandPool;\n    VkCommandBufferLevel    level;\n    uint32_t                commandBufferCount;\n} VkCommandBufferAllocateInfo;\n\ntypedef struct VkCommandBufferInheritanceInfo {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkRenderPass                     renderPass;\n    uint32_t                         subpass;\n    VkFramebuffer                    framebuffer;\n    VkBool32                         occlusionQueryEnable;\n    VkQueryControlFlags              queryFlags;\n    VkQueryPipelineStatisticFlags    pipelineStatistics;\n} VkCommandBufferInheritanceInfo;\n\ntypedef struct VkCommandBufferBeginInfo {\n    VkStructureType                          sType;\n    const void*                              pNext;\n    VkCommandBufferUsageFlags                flags;\n    const VkCommandBufferInheritanceInfo*    pInheritanceInfo;\n} VkCommandBufferBeginInfo;\n\ntypedef struct VkBufferCopy {\n    VkDeviceSize    srcOffset;\n    VkDeviceSize    dstOffset;\n    VkDeviceSize    size;\n} VkBufferCopy;\n\ntypedef struct VkImageSubresourceLayers {\n    VkImageAspectFlags    aspectMask;\n    uint32_t              mipLevel;\n    uint32_t              baseArrayLayer;\n    uint32_t              layerCount;\n} VkImageSubresourceLayers;\n\ntypedef struct VkImageCopy {\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffset;\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffset;\n    VkExtent3D                  extent;\n} VkImageCopy;\n\ntypedef struct VkImageBlit {\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffsets[2];\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffsets[2];\n} VkImageBlit;\n\ntypedef struct VkBufferImageCopy {\n    VkDeviceSize                bufferOffset;\n    uint32_t                    bufferRowLength;\n    uint32_t                    bufferImageHeight;\n    VkImageSubresourceLayers    imageSubresource;\n    VkOffset3D                  imageOffset;\n    VkExtent3D                  imageExtent;\n} VkBufferImageCopy;\n\ntypedef union VkClearColorValue {\n    float       float32[4];\n    int32_t     int32[4];\n    uint32_t    uint32[4];\n} VkClearColorValue;\n\ntypedef struct VkClearDepthStencilValue {\n    float       depth;\n    uint32_t    stencil;\n} VkClearDepthStencilValue;\n\ntypedef union VkClearValue {\n    VkClearColorValue           color;\n    VkClearDepthStencilValue    depthStencil;\n} VkClearValue;\n\ntypedef struct VkClearAttachment {\n    VkImageAspectFlags    aspectMask;\n    uint32_t              colorAttachment;\n    VkClearValue          clearValue;\n} VkClearAttachment;\n\ntypedef struct VkClearRect {\n    VkRect2D    rect;\n    uint32_t    baseArrayLayer;\n    uint32_t    layerCount;\n} VkClearRect;\n\ntypedef struct VkImageResolve {\n    VkImageSubresourceLayers    srcSubresource;\n    VkOffset3D                  srcOffset;\n    VkImageSubresourceLayers    dstSubresource;\n    VkOffset3D                  dstOffset;\n    VkExtent3D                  extent;\n} VkImageResolve;\n\ntypedef struct VkMemoryBarrier {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkAccessFlags      srcAccessMask;\n    VkAccessFlags      dstAccessMask;\n} VkMemoryBarrier;\n\ntypedef struct VkBufferMemoryBarrier {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkAccessFlags      srcAccessMask;\n    VkAccessFlags      dstAccessMask;\n    uint32_t           srcQueueFamilyIndex;\n    uint32_t           dstQueueFamilyIndex;\n    VkBuffer           buffer;\n    VkDeviceSize       offset;\n    VkDeviceSize       size;\n} VkBufferMemoryBarrier;\n\ntypedef struct VkImageMemoryBarrier {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkAccessFlags              srcAccessMask;\n    VkAccessFlags              dstAccessMask;\n    VkImageLayout              oldLayout;\n    VkImageLayout              newLayout;\n    uint32_t                   srcQueueFamilyIndex;\n    uint32_t                   dstQueueFamilyIndex;\n    VkImage                    image;\n    VkImageSubresourceRange    subresourceRange;\n} VkImageMemoryBarrier;\n\ntypedef struct VkRenderPassBeginInfo {\n    VkStructureType        sType;\n    const void*            pNext;\n    VkRenderPass           renderPass;\n    VkFramebuffer          framebuffer;\n    VkRect2D               renderArea;\n    uint32_t               clearValueCount;\n    const VkClearValue*    pClearValues;\n} VkRenderPassBeginInfo;\n\ntypedef struct VkDispatchIndirectCommand {\n    uint32_t    x;\n    uint32_t    y;\n    uint32_t    z;\n} VkDispatchIndirectCommand;\n\ntypedef struct VkDrawIndexedIndirectCommand {\n    uint32_t    indexCount;\n    uint32_t    instanceCount;\n    uint32_t    firstIndex;\n    int32_t     vertexOffset;\n    uint32_t    firstInstance;\n} VkDrawIndexedIndirectCommand;\n\ntypedef struct VkDrawIndirectCommand {\n    uint32_t    vertexCount;\n    uint32_t    instanceCount;\n    uint32_t    firstVertex;\n    uint32_t    firstInstance;\n} VkDrawIndirectCommand;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateInstance)(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance);\ntypedef void (VKAPI_PTR *PFN_vkDestroyInstance)(VkInstance instance, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties);\ntypedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddr)(VkInstance instance, const char* pName);\ntypedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetDeviceProcAddr)(VkDevice device, const char* pName);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDevice)(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDevice)(VkDevice device, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateInstanceExtensionProperties)(const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateDeviceExtensionProperties)(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateInstanceLayerProperties)(uint32_t* pPropertyCount, VkLayerProperties* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkEnumerateDeviceLayerProperties)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkLayerProperties* pProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceQueue)(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue* pQueue);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueWaitIdle)(VkQueue queue);\ntypedef VkResult (VKAPI_PTR *PFN_vkDeviceWaitIdle)(VkDevice device);\ntypedef VkResult (VKAPI_PTR *PFN_vkAllocateMemory)(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory);\ntypedef void (VKAPI_PTR *PFN_vkFreeMemory)(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkMapMemory)(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData);\ntypedef void (VKAPI_PTR *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory memory);\ntypedef VkResult (VKAPI_PTR *PFN_vkFlushMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges);\ntypedef VkResult (VKAPI_PTR *PFN_vkInvalidateMappedMemoryRanges)(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges);\ntypedef void (VKAPI_PTR *PFN_vkGetDeviceMemoryCommitment)(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory)(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset);\ntypedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory)(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset);\ntypedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements)(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements)(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements)(VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueueBindSparse)(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateFence)(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence);\ntypedef void (VKAPI_PTR *PFN_vkDestroyFence)(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetFenceStatus)(VkDevice device, VkFence fence);\ntypedef VkResult (VKAPI_PTR *PFN_vkWaitForFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSemaphore)(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore);\ntypedef void (VKAPI_PTR *PFN_vkDestroySemaphore)(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateEvent)(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent);\ntypedef void (VKAPI_PTR *PFN_vkDestroyEvent)(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetEventStatus)(VkDevice device, VkEvent event);\ntypedef VkResult (VKAPI_PTR *PFN_vkSetEvent)(VkDevice device, VkEvent event);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetEvent)(VkDevice device, VkEvent event);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateQueryPool)(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool);\ntypedef void (VKAPI_PTR *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateBuffer)(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer);\ntypedef void (VKAPI_PTR *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView);\ntypedef void (VKAPI_PTR *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateImage)(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage);\ntypedef void (VKAPI_PTR *PFN_vkDestroyImage)(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout)(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateImageView)(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView);\ntypedef void (VKAPI_PTR *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateShaderModule)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule);\ntypedef void (VKAPI_PTR *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineCache)(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPipelineCacheData)(VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize, void* pData);\ntypedef VkResult (VKAPI_PTR *PFN_vkMergePipelineCaches)(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateGraphicsPipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateComputePipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPipeline)(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineLayout)(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout);\ntypedef void (VKAPI_PTR *PFN_vkDestroyPipelineLayout)(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSampler)(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler);\ntypedef void (VKAPI_PTR *PFN_vkDestroySampler)(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorSetLayout)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDescriptorSetLayout)(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorPool)(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags);\ntypedef VkResult (VKAPI_PTR *PFN_vkAllocateDescriptorSets)(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets);\ntypedef VkResult (VKAPI_PTR *PFN_vkFreeDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets);\ntypedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateFramebuffer)(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer);\ntypedef void (VKAPI_PTR *PFN_vkDestroyFramebuffer)(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass)(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass);\ntypedef void (VKAPI_PTR *PFN_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkGetRenderAreaGranularity)(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateCommandPool)(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool);\ntypedef void (VKAPI_PTR *PFN_vkDestroyCommandPool)(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags);\ntypedef VkResult (VKAPI_PTR *PFN_vkAllocateCommandBuffers)(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers);\ntypedef void (VKAPI_PTR *PFN_vkFreeCommandBuffers)(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers);\ntypedef VkResult (VKAPI_PTR *PFN_vkBeginCommandBuffer)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkEndCommandBuffer)(VkCommandBuffer commandBuffer);\ntypedef VkResult (VKAPI_PTR *PFN_vkResetCommandBuffer)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindPipeline)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetViewport)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetScissor)(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetLineWidth)(VkCommandBuffer commandBuffer, float lineWidth);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBias)(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetBlendConstants)(VkCommandBuffer commandBuffer, const float blendConstants[4]);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetDepthBounds)(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilCompareMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilWriteMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetStencilReference)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);\ntypedef void (VKAPI_PTR *PFN_vkCmdBindVertexBuffers)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);\ntypedef void (VKAPI_PTR *PFN_vkCmdDraw)(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndexed)(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z);\ntypedef void (VKAPI_PTR *PFN_vkCmdDispatchIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdBlitImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData);\ntypedef void (VKAPI_PTR *PFN_vkCmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data);\ntypedef void (VKAPI_PTR *PFN_vkCmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);\ntypedef void (VKAPI_PTR *PFN_vkCmdClearDepthStencilImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);\ntypedef void (VKAPI_PTR *PFN_vkCmdClearAttachments)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment* pAttachments, uint32_t rectCount, const VkClearRect* pRects);\ntypedef void (VKAPI_PTR *PFN_vkCmdResolveImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve* pRegions);\ntypedef void (VKAPI_PTR *PFN_vkCmdSetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdResetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask);\ntypedef void (VKAPI_PTR *PFN_vkCmdWaitEvents)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers);\ntypedef void (VKAPI_PTR *PFN_vkCmdPipelineBarrier)(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query);\ntypedef void (VKAPI_PTR *PFN_vkCmdResetQueryPool)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);\ntypedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query);\ntypedef void (VKAPI_PTR *PFN_vkCmdCopyQueryPoolResults)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags);\ntypedef void (VKAPI_PTR *PFN_vkCmdPushConstants)(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void* pValues);\ntypedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents);\ntypedef void (VKAPI_PTR *PFN_vkCmdNextSubpass)(VkCommandBuffer commandBuffer, VkSubpassContents contents);\ntypedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass)(VkCommandBuffer commandBuffer);\ntypedef void (VKAPI_PTR *PFN_vkCmdExecuteCommands)(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(\n    const VkInstanceCreateInfo*                 pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkInstance*                                 pInstance);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyInstance(\n    VkInstance                                  instance,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(\n    VkInstance                                  instance,\n    uint32_t*                                   pPhysicalDeviceCount,\n    VkPhysicalDevice*                           pPhysicalDevices);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceFeatures*                   pFeatures);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkFormatProperties*                         pFormatProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkImageType                                 type,\n    VkImageTiling                               tiling,\n    VkImageUsageFlags                           usage,\n    VkImageCreateFlags                          flags,\n    VkImageFormatProperties*                    pImageFormatProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceProperties*                 pProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pQueueFamilyPropertyCount,\n    VkQueueFamilyProperties*                    pQueueFamilyProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceMemoryProperties*           pMemoryProperties);\n\nVKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(\n    VkInstance                                  instance,\n    const char*                                 pName);\n\nVKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(\n    VkDevice                                    device,\n    const char*                                 pName);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(\n    VkPhysicalDevice                            physicalDevice,\n    const VkDeviceCreateInfo*                   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDevice*                                   pDevice);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDevice(\n    VkDevice                                    device,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(\n    const char*                                 pLayerName,\n    uint32_t*                                   pPropertyCount,\n    VkExtensionProperties*                      pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(\n    VkPhysicalDevice                            physicalDevice,\n    const char*                                 pLayerName,\n    uint32_t*                                   pPropertyCount,\n    VkExtensionProperties*                      pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(\n    uint32_t*                                   pPropertyCount,\n    VkLayerProperties*                          pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkLayerProperties*                          pProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(\n    VkDevice                                    device,\n    uint32_t                                    queueFamilyIndex,\n    uint32_t                                    queueIndex,\n    VkQueue*                                    pQueue);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(\n    VkQueue                                     queue,\n    uint32_t                                    submitCount,\n    const VkSubmitInfo*                         pSubmits,\n    VkFence                                     fence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(\n    VkQueue                                     queue);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(\n    VkDevice                                    device);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(\n    VkDevice                                    device,\n    const VkMemoryAllocateInfo*                 pAllocateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDeviceMemory*                             pMemory);\n\nVKAPI_ATTR void VKAPI_CALL vkFreeMemory(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkMapMemory(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    VkDeviceSize                                offset,\n    VkDeviceSize                                size,\n    VkMemoryMapFlags                            flags,\n    void**                                      ppData);\n\nVKAPI_ATTR void VKAPI_CALL vkUnmapMemory(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkFlushMappedMemoryRanges(\n    VkDevice                                    device,\n    uint32_t                                    memoryRangeCount,\n    const VkMappedMemoryRange*                  pMemoryRanges);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkInvalidateMappedMemoryRanges(\n    VkDevice                                    device,\n    uint32_t                                    memoryRangeCount,\n    const VkMappedMemoryRange*                  pMemoryRanges);\n\nVKAPI_ATTR void VKAPI_CALL vkGetDeviceMemoryCommitment(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    VkDeviceSize*                               pCommittedMemoryInBytes);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(\n    VkDevice                                    device,\n    VkBuffer                                    buffer,\n    VkDeviceMemory                              memory,\n    VkDeviceSize                                memoryOffset);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(\n    VkDevice                                    device,\n    VkImage                                     image,\n    VkDeviceMemory                              memory,\n    VkDeviceSize                                memoryOffset);\n\nVKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements(\n    VkDevice                                    device,\n    VkBuffer                                    buffer,\n    VkMemoryRequirements*                       pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements(\n    VkDevice                                    device,\n    VkImage                                     image,\n    VkMemoryRequirements*                       pMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements(\n    VkDevice                                    device,\n    VkImage                                     image,\n    uint32_t*                                   pSparseMemoryRequirementCount,\n    VkSparseImageMemoryRequirements*            pSparseMemoryRequirements);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkImageType                                 type,\n    VkSampleCountFlagBits                       samples,\n    VkImageUsageFlags                           usage,\n    VkImageTiling                               tiling,\n    uint32_t*                                   pPropertyCount,\n    VkSparseImageFormatProperties*              pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueueBindSparse(\n    VkQueue                                     queue,\n    uint32_t                                    bindInfoCount,\n    const VkBindSparseInfo*                     pBindInfo,\n    VkFence                                     fence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(\n    VkDevice                                    device,\n    const VkFenceCreateInfo*                    pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkFence*                                    pFence);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyFence(\n    VkDevice                                    device,\n    VkFence                                     fence,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetFences(\n    VkDevice                                    device,\n    uint32_t                                    fenceCount,\n    const VkFence*                              pFences);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(\n    VkDevice                                    device,\n    VkFence                                     fence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(\n    VkDevice                                    device,\n    uint32_t                                    fenceCount,\n    const VkFence*                              pFences,\n    VkBool32                                    waitAll,\n    uint64_t                                    timeout);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(\n    VkDevice                                    device,\n    const VkSemaphoreCreateInfo*                pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSemaphore*                                pSemaphore);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroySemaphore(\n    VkDevice                                    device,\n    VkSemaphore                                 semaphore,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent(\n    VkDevice                                    device,\n    const VkEventCreateInfo*                    pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkEvent*                                    pEvent);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyEvent(\n    VkDevice                                    device,\n    VkEvent                                     event,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(\n    VkDevice                                    device,\n    VkEvent                                     event);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(\n    VkDevice                                    device,\n    VkEvent                                     event);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(\n    VkDevice                                    device,\n    VkEvent                                     event);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(\n    VkDevice                                    device,\n    const VkQueryPoolCreateInfo*                pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkQueryPool*                                pQueryPool);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyQueryPool(\n    VkDevice                                    device,\n    VkQueryPool                                 queryPool,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(\n    VkDevice                                    device,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery,\n    uint32_t                                    queryCount,\n    size_t                                      dataSize,\n    void*                                       pData,\n    VkDeviceSize                                stride,\n    VkQueryResultFlags                          flags);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer(\n    VkDevice                                    device,\n    const VkBufferCreateInfo*                   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkBuffer*                                   pBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyBuffer(\n    VkDevice                                    device,\n    VkBuffer                                    buffer,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(\n    VkDevice                                    device,\n    const VkBufferViewCreateInfo*               pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkBufferView*                               pView);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyBufferView(\n    VkDevice                                    device,\n    VkBufferView                                bufferView,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(\n    VkDevice                                    device,\n    const VkImageCreateInfo*                    pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkImage*                                    pImage);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyImage(\n    VkDevice                                    device,\n    VkImage                                     image,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(\n    VkDevice                                    device,\n    VkImage                                     image,\n    const VkImageSubresource*                   pSubresource,\n    VkSubresourceLayout*                        pLayout);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(\n    VkDevice                                    device,\n    const VkImageViewCreateInfo*                pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkImageView*                                pView);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyImageView(\n    VkDevice                                    device,\n    VkImageView                                 imageView,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(\n    VkDevice                                    device,\n    const VkShaderModuleCreateInfo*             pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkShaderModule*                             pShaderModule);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyShaderModule(\n    VkDevice                                    device,\n    VkShaderModule                              shaderModule,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(\n    VkDevice                                    device,\n    const VkPipelineCacheCreateInfo*            pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipelineCache*                            pPipelineCache);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPipelineCache(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineCacheData(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    size_t*                                     pDataSize,\n    void*                                       pData);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches(\n    VkDevice                                    device,\n    VkPipelineCache                             dstCache,\n    uint32_t                                    srcCacheCount,\n    const VkPipelineCache*                      pSrcCaches);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    uint32_t                                    createInfoCount,\n    const VkGraphicsPipelineCreateInfo*         pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipeline*                                 pPipelines);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines(\n    VkDevice                                    device,\n    VkPipelineCache                             pipelineCache,\n    uint32_t                                    createInfoCount,\n    const VkComputePipelineCreateInfo*          pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipeline*                                 pPipelines);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPipeline(\n    VkDevice                                    device,\n    VkPipeline                                  pipeline,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineLayout(\n    VkDevice                                    device,\n    const VkPipelineLayoutCreateInfo*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkPipelineLayout*                           pPipelineLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyPipelineLayout(\n    VkDevice                                    device,\n    VkPipelineLayout                            pipelineLayout,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(\n    VkDevice                                    device,\n    const VkSamplerCreateInfo*                  pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSampler*                                  pSampler);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroySampler(\n    VkDevice                                    device,\n    VkSampler                                   sampler,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(\n    VkDevice                                    device,\n    const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDescriptorSetLayout*                      pSetLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorSetLayout(\n    VkDevice                                    device,\n    VkDescriptorSetLayout                       descriptorSetLayout,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool(\n    VkDevice                                    device,\n    const VkDescriptorPoolCreateInfo*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDescriptorPool*                           pDescriptorPool);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorPool(\n    VkDevice                                    device,\n    VkDescriptorPool                            descriptorPool,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool(\n    VkDevice                                    device,\n    VkDescriptorPool                            descriptorPool,\n    VkDescriptorPoolResetFlags                  flags);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets(\n    VkDevice                                    device,\n    const VkDescriptorSetAllocateInfo*          pAllocateInfo,\n    VkDescriptorSet*                            pDescriptorSets);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(\n    VkDevice                                    device,\n    VkDescriptorPool                            descriptorPool,\n    uint32_t                                    descriptorSetCount,\n    const VkDescriptorSet*                      pDescriptorSets);\n\nVKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(\n    VkDevice                                    device,\n    uint32_t                                    descriptorWriteCount,\n    const VkWriteDescriptorSet*                 pDescriptorWrites,\n    uint32_t                                    descriptorCopyCount,\n    const VkCopyDescriptorSet*                  pDescriptorCopies);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(\n    VkDevice                                    device,\n    const VkFramebufferCreateInfo*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkFramebuffer*                              pFramebuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyFramebuffer(\n    VkDevice                                    device,\n    VkFramebuffer                               framebuffer,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(\n    VkDevice                                    device,\n    const VkRenderPassCreateInfo*               pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkRenderPass*                               pRenderPass);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyRenderPass(\n    VkDevice                                    device,\n    VkRenderPass                                renderPass,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity(\n    VkDevice                                    device,\n    VkRenderPass                                renderPass,\n    VkExtent2D*                                 pGranularity);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(\n    VkDevice                                    device,\n    const VkCommandPoolCreateInfo*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkCommandPool*                              pCommandPool);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    VkCommandPoolResetFlags                     flags);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(\n    VkDevice                                    device,\n    const VkCommandBufferAllocateInfo*          pAllocateInfo,\n    VkCommandBuffer*                            pCommandBuffers);\n\nVKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    uint32_t                                    commandBufferCount,\n    const VkCommandBuffer*                      pCommandBuffers);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(\n    VkCommandBuffer                             commandBuffer,\n    const VkCommandBufferBeginInfo*             pBeginInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(\n    VkCommandBuffer                             commandBuffer);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkCommandBufferResetFlags                   flags);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipeline                                  pipeline);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetViewport(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstViewport,\n    uint32_t                                    viewportCount,\n    const VkViewport*                           pViewports);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetScissor(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstScissor,\n    uint32_t                                    scissorCount,\n    const VkRect2D*                             pScissors);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(\n    VkCommandBuffer                             commandBuffer,\n    float                                       lineWidth);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(\n    VkCommandBuffer                             commandBuffer,\n    float                                       depthBiasConstantFactor,\n    float                                       depthBiasClamp,\n    float                                       depthBiasSlopeFactor);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(\n    VkCommandBuffer                             commandBuffer,\n    const float                                 blendConstants[4]);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(\n    VkCommandBuffer                             commandBuffer,\n    float                                       minDepthBounds,\n    float                                       maxDepthBounds);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(\n    VkCommandBuffer                             commandBuffer,\n    VkStencilFaceFlags                          faceMask,\n    uint32_t                                    compareMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(\n    VkCommandBuffer                             commandBuffer,\n    VkStencilFaceFlags                          faceMask,\n    uint32_t                                    writeMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(\n    VkCommandBuffer                             commandBuffer,\n    VkStencilFaceFlags                          faceMask,\n    uint32_t                                    reference);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineBindPoint                         pipelineBindPoint,\n    VkPipelineLayout                            layout,\n    uint32_t                                    firstSet,\n    uint32_t                                    descriptorSetCount,\n    const VkDescriptorSet*                      pDescriptorSets,\n    uint32_t                                    dynamicOffsetCount,\n    const uint32_t*                             pDynamicOffsets);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkIndexType                                 indexType);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    firstBinding,\n    uint32_t                                    bindingCount,\n    const VkBuffer*                             pBuffers,\n    const VkDeviceSize*                         pOffsets);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDraw(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    vertexCount,\n    uint32_t                                    instanceCount,\n    uint32_t                                    firstVertex,\n    uint32_t                                    firstInstance);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    indexCount,\n    uint32_t                                    instanceCount,\n    uint32_t                                    firstIndex,\n    int32_t                                     vertexOffset,\n    uint32_t                                    firstInstance);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    uint32_t                                    drawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    uint32_t                                    drawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatch(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    x,\n    uint32_t                                    y,\n    uint32_t                                    z);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    srcBuffer,\n    VkBuffer                                    dstBuffer,\n    uint32_t                                    regionCount,\n    const VkBufferCopy*                         pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     srcImage,\n    VkImageLayout                               srcImageLayout,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    uint32_t                                    regionCount,\n    const VkImageCopy*                          pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     srcImage,\n    VkImageLayout                               srcImageLayout,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    uint32_t                                    regionCount,\n    const VkImageBlit*                          pRegions,\n    VkFilter                                    filter);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    srcBuffer,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    uint32_t                                    regionCount,\n    const VkBufferImageCopy*                    pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     srcImage,\n    VkImageLayout                               srcImageLayout,\n    VkBuffer                                    dstBuffer,\n    uint32_t                                    regionCount,\n    const VkBufferImageCopy*                    pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    dstBuffer,\n    VkDeviceSize                                dstOffset,\n    VkDeviceSize                                dataSize,\n    const void*                                 pData);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    dstBuffer,\n    VkDeviceSize                                dstOffset,\n    VkDeviceSize                                size,\n    uint32_t                                    data);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     image,\n    VkImageLayout                               imageLayout,\n    const VkClearColorValue*                    pColor,\n    uint32_t                                    rangeCount,\n    const VkImageSubresourceRange*              pRanges);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     image,\n    VkImageLayout                               imageLayout,\n    const VkClearDepthStencilValue*             pDepthStencil,\n    uint32_t                                    rangeCount,\n    const VkImageSubresourceRange*              pRanges);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    attachmentCount,\n    const VkClearAttachment*                    pAttachments,\n    uint32_t                                    rectCount,\n    const VkClearRect*                          pRects);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(\n    VkCommandBuffer                             commandBuffer,\n    VkImage                                     srcImage,\n    VkImageLayout                               srcImageLayout,\n    VkImage                                     dstImage,\n    VkImageLayout                               dstImageLayout,\n    uint32_t                                    regionCount,\n    const VkImageResolve*                       pRegions);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdSetEvent(\n    VkCommandBuffer                             commandBuffer,\n    VkEvent                                     event,\n    VkPipelineStageFlags                        stageMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResetEvent(\n    VkCommandBuffer                             commandBuffer,\n    VkEvent                                     event,\n    VkPipelineStageFlags                        stageMask);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    eventCount,\n    const VkEvent*                              pEvents,\n    VkPipelineStageFlags                        srcStageMask,\n    VkPipelineStageFlags                        dstStageMask,\n    uint32_t                                    memoryBarrierCount,\n    const VkMemoryBarrier*                      pMemoryBarriers,\n    uint32_t                                    bufferMemoryBarrierCount,\n    const VkBufferMemoryBarrier*                pBufferMemoryBarriers,\n    uint32_t                                    imageMemoryBarrierCount,\n    const VkImageMemoryBarrier*                 pImageMemoryBarriers);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineStageFlags                        srcStageMask,\n    VkPipelineStageFlags                        dstStageMask,\n    VkDependencyFlags                           dependencyFlags,\n    uint32_t                                    memoryBarrierCount,\n    const VkMemoryBarrier*                      pMemoryBarriers,\n    uint32_t                                    bufferMemoryBarrierCount,\n    const VkBufferMemoryBarrier*                pBufferMemoryBarriers,\n    uint32_t                                    imageMemoryBarrierCount,\n    const VkImageMemoryBarrier*                 pImageMemoryBarriers);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query,\n    VkQueryControlFlags                         flags);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery,\n    uint32_t                                    queryCount);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineStageFlagBits                     pipelineStage,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    query);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults(\n    VkCommandBuffer                             commandBuffer,\n    VkQueryPool                                 queryPool,\n    uint32_t                                    firstQuery,\n    uint32_t                                    queryCount,\n    VkBuffer                                    dstBuffer,\n    VkDeviceSize                                dstOffset,\n    VkDeviceSize                                stride,\n    VkQueryResultFlags                          flags);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(\n    VkCommandBuffer                             commandBuffer,\n    VkPipelineLayout                            layout,\n    VkShaderStageFlags                          stageFlags,\n    uint32_t                                    offset,\n    uint32_t                                    size,\n    const void*                                 pValues);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass(\n    VkCommandBuffer                             commandBuffer,\n    const VkRenderPassBeginInfo*                pRenderPassBegin,\n    VkSubpassContents                           contents);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(\n    VkCommandBuffer                             commandBuffer,\n    VkSubpassContents                           contents);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(\n    VkCommandBuffer                             commandBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands(\n    VkCommandBuffer                             commandBuffer,\n    uint32_t                                    commandBufferCount,\n    const VkCommandBuffer*                      pCommandBuffers);\n#endif\n\n#define VK_KHR_surface 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)\n\n#define VK_KHR_SURFACE_SPEC_VERSION       25\n#define VK_KHR_SURFACE_EXTENSION_NAME     \"VK_KHR_surface\"\n#define VK_COLORSPACE_SRGB_NONLINEAR_KHR  VK_COLOR_SPACE_SRGB_NONLINEAR_KHR\n\n\ntypedef enum VkColorSpaceKHR {\n    VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0,\n    VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT = 1000104001,\n    VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT = 1000104002,\n    VK_COLOR_SPACE_SCRGB_LINEAR_EXT = 1000104003,\n    VK_COLOR_SPACE_SCRGB_NONLINEAR_EXT = 1000104004,\n    VK_COLOR_SPACE_DCI_P3_LINEAR_EXT = 1000104005,\n    VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT = 1000104006,\n    VK_COLOR_SPACE_BT709_LINEAR_EXT = 1000104007,\n    VK_COLOR_SPACE_BT709_NONLINEAR_EXT = 1000104008,\n    VK_COLOR_SPACE_BT2020_LINEAR_EXT = 1000104009,\n    VK_COLOR_SPACE_BT2020_NONLINEAR_EXT = 1000104010,\n    VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT = 1000104011,\n    VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT = 1000104012,\n    VK_COLOR_SPACE_BEGIN_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR,\n    VK_COLOR_SPACE_END_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR,\n    VK_COLOR_SPACE_RANGE_SIZE_KHR = (VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - VK_COLOR_SPACE_SRGB_NONLINEAR_KHR + 1),\n    VK_COLOR_SPACE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkColorSpaceKHR;\n\ntypedef enum VkPresentModeKHR {\n    VK_PRESENT_MODE_IMMEDIATE_KHR = 0,\n    VK_PRESENT_MODE_MAILBOX_KHR = 1,\n    VK_PRESENT_MODE_FIFO_KHR = 2,\n    VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3,\n    VK_PRESENT_MODE_BEGIN_RANGE_KHR = VK_PRESENT_MODE_IMMEDIATE_KHR,\n    VK_PRESENT_MODE_END_RANGE_KHR = VK_PRESENT_MODE_FIFO_RELAXED_KHR,\n    VK_PRESENT_MODE_RANGE_SIZE_KHR = (VK_PRESENT_MODE_FIFO_RELAXED_KHR - VK_PRESENT_MODE_IMMEDIATE_KHR + 1),\n    VK_PRESENT_MODE_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkPresentModeKHR;\n\n\ntypedef enum VkSurfaceTransformFlagBitsKHR {\n    VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR = 0x00000001,\n    VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR = 0x00000002,\n    VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR = 0x00000004,\n    VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR = 0x00000008,\n    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR = 0x00000010,\n    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR = 0x00000020,\n    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR = 0x00000040,\n    VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR = 0x00000080,\n    VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = 0x00000100,\n    VK_SURFACE_TRANSFORM_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkSurfaceTransformFlagBitsKHR;\ntypedef VkFlags VkSurfaceTransformFlagsKHR;\n\ntypedef enum VkCompositeAlphaFlagBitsKHR {\n    VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 0x00000001,\n    VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR = 0x00000002,\n    VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR = 0x00000004,\n    VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR = 0x00000008,\n    VK_COMPOSITE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkCompositeAlphaFlagBitsKHR;\ntypedef VkFlags VkCompositeAlphaFlagsKHR;\n\ntypedef struct VkSurfaceCapabilitiesKHR {\n    uint32_t                         minImageCount;\n    uint32_t                         maxImageCount;\n    VkExtent2D                       currentExtent;\n    VkExtent2D                       minImageExtent;\n    VkExtent2D                       maxImageExtent;\n    uint32_t                         maxImageArrayLayers;\n    VkSurfaceTransformFlagsKHR       supportedTransforms;\n    VkSurfaceTransformFlagBitsKHR    currentTransform;\n    VkCompositeAlphaFlagsKHR         supportedCompositeAlpha;\n    VkImageUsageFlags                supportedUsageFlags;\n} VkSurfaceCapabilitiesKHR;\n\ntypedef struct VkSurfaceFormatKHR {\n    VkFormat           format;\n    VkColorSpaceKHR    colorSpace;\n} VkSurfaceFormatKHR;\n\n\ntypedef void (VKAPI_PTR *PFN_vkDestroySurfaceKHR)(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(\n    VkInstance                                  instance,\n    VkSurfaceKHR                                surface,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    VkSurfaceKHR                                surface,\n    VkBool32*                                   pSupported);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    VkSurfaceCapabilitiesKHR*                   pSurfaceCapabilities);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    uint32_t*                                   pSurfaceFormatCount,\n    VkSurfaceFormatKHR*                         pSurfaceFormats);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    uint32_t*                                   pPresentModeCount,\n    VkPresentModeKHR*                           pPresentModes);\n#endif\n\n#define VK_KHR_swapchain 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSwapchainKHR)\n\n#define VK_KHR_SWAPCHAIN_SPEC_VERSION     68\n#define VK_KHR_SWAPCHAIN_EXTENSION_NAME   \"VK_KHR_swapchain\"\n\ntypedef VkFlags VkSwapchainCreateFlagsKHR;\n\ntypedef struct VkSwapchainCreateInfoKHR {\n    VkStructureType                  sType;\n    const void*                      pNext;\n    VkSwapchainCreateFlagsKHR        flags;\n    VkSurfaceKHR                     surface;\n    uint32_t                         minImageCount;\n    VkFormat                         imageFormat;\n    VkColorSpaceKHR                  imageColorSpace;\n    VkExtent2D                       imageExtent;\n    uint32_t                         imageArrayLayers;\n    VkImageUsageFlags                imageUsage;\n    VkSharingMode                    imageSharingMode;\n    uint32_t                         queueFamilyIndexCount;\n    const uint32_t*                  pQueueFamilyIndices;\n    VkSurfaceTransformFlagBitsKHR    preTransform;\n    VkCompositeAlphaFlagBitsKHR      compositeAlpha;\n    VkPresentModeKHR                 presentMode;\n    VkBool32                         clipped;\n    VkSwapchainKHR                   oldSwapchain;\n} VkSwapchainCreateInfoKHR;\n\ntypedef struct VkPresentInfoKHR {\n    VkStructureType          sType;\n    const void*              pNext;\n    uint32_t                 waitSemaphoreCount;\n    const VkSemaphore*       pWaitSemaphores;\n    uint32_t                 swapchainCount;\n    const VkSwapchainKHR*    pSwapchains;\n    const uint32_t*          pImageIndices;\n    VkResult*                pResults;\n} VkPresentInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSwapchainKHR)(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain);\ntypedef void (VKAPI_PTR *PFN_vkDestroySwapchainKHR)(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainImagesKHR)(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages);\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImageKHR)(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex);\ntypedef VkResult (VKAPI_PTR *PFN_vkQueuePresentKHR)(VkQueue queue, const VkPresentInfoKHR* pPresentInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(\n    VkDevice                                    device,\n    const VkSwapchainCreateInfoKHR*             pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSwapchainKHR*                             pSwapchain);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    uint32_t*                                   pSwapchainImageCount,\n    VkImage*                                    pSwapchainImages);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    uint64_t                                    timeout,\n    VkSemaphore                                 semaphore,\n    VkFence                                     fence,\n    uint32_t*                                   pImageIndex);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(\n    VkQueue                                     queue,\n    const VkPresentInfoKHR*                     pPresentInfo);\n#endif\n\n#define VK_KHR_display 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayKHR)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDisplayModeKHR)\n\n#define VK_KHR_DISPLAY_SPEC_VERSION       21\n#define VK_KHR_DISPLAY_EXTENSION_NAME     \"VK_KHR_display\"\n\n\ntypedef enum VkDisplayPlaneAlphaFlagBitsKHR {\n    VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR = 0x00000001,\n    VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR = 0x00000002,\n    VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR = 0x00000004,\n    VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR = 0x00000008,\n    VK_DISPLAY_PLANE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF\n} VkDisplayPlaneAlphaFlagBitsKHR;\ntypedef VkFlags VkDisplayPlaneAlphaFlagsKHR;\ntypedef VkFlags VkDisplayModeCreateFlagsKHR;\ntypedef VkFlags VkDisplaySurfaceCreateFlagsKHR;\n\ntypedef struct VkDisplayPropertiesKHR {\n    VkDisplayKHR                  display;\n    const char*                   displayName;\n    VkExtent2D                    physicalDimensions;\n    VkExtent2D                    physicalResolution;\n    VkSurfaceTransformFlagsKHR    supportedTransforms;\n    VkBool32                      planeReorderPossible;\n    VkBool32                      persistentContent;\n} VkDisplayPropertiesKHR;\n\ntypedef struct VkDisplayModeParametersKHR {\n    VkExtent2D    visibleRegion;\n    uint32_t      refreshRate;\n} VkDisplayModeParametersKHR;\n\ntypedef struct VkDisplayModePropertiesKHR {\n    VkDisplayModeKHR              displayMode;\n    VkDisplayModeParametersKHR    parameters;\n} VkDisplayModePropertiesKHR;\n\ntypedef struct VkDisplayModeCreateInfoKHR {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkDisplayModeCreateFlagsKHR    flags;\n    VkDisplayModeParametersKHR     parameters;\n} VkDisplayModeCreateInfoKHR;\n\ntypedef struct VkDisplayPlaneCapabilitiesKHR {\n    VkDisplayPlaneAlphaFlagsKHR    supportedAlpha;\n    VkOffset2D                     minSrcPosition;\n    VkOffset2D                     maxSrcPosition;\n    VkExtent2D                     minSrcExtent;\n    VkExtent2D                     maxSrcExtent;\n    VkOffset2D                     minDstPosition;\n    VkOffset2D                     maxDstPosition;\n    VkExtent2D                     minDstExtent;\n    VkExtent2D                     maxDstExtent;\n} VkDisplayPlaneCapabilitiesKHR;\n\ntypedef struct VkDisplayPlanePropertiesKHR {\n    VkDisplayKHR    currentDisplay;\n    uint32_t        currentStackIndex;\n} VkDisplayPlanePropertiesKHR;\n\ntypedef struct VkDisplaySurfaceCreateInfoKHR {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkDisplaySurfaceCreateFlagsKHR    flags;\n    VkDisplayModeKHR                  displayMode;\n    uint32_t                          planeIndex;\n    uint32_t                          planeStackIndex;\n    VkSurfaceTransformFlagBitsKHR     transform;\n    float                             globalAlpha;\n    VkDisplayPlaneAlphaFlagBitsKHR    alphaMode;\n    VkExtent2D                        imageExtent;\n} VkDisplaySurfaceCreateInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneSupportedDisplaysKHR)(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDisplayModePropertiesKHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDisplayModeKHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneCapabilitiesKHR)(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDisplayPlaneSurfaceKHR)(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayPropertiesKHR*                     pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayPlanePropertiesKHR*                pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    planeIndex,\n    uint32_t*                                   pDisplayCount,\n    VkDisplayKHR*                               pDisplays);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayKHR                                display,\n    uint32_t*                                   pPropertyCount,\n    VkDisplayModePropertiesKHR*                 pProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayModeKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayKHR                                display,\n    const VkDisplayModeCreateInfoKHR*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDisplayModeKHR*                           pMode);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayModeKHR                            mode,\n    uint32_t                                    planeIndex,\n    VkDisplayPlaneCapabilitiesKHR*              pCapabilities);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(\n    VkInstance                                  instance,\n    const VkDisplaySurfaceCreateInfoKHR*        pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n\n#define VK_KHR_display_swapchain 1\n#define VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION 9\n#define VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME \"VK_KHR_display_swapchain\"\n\ntypedef struct VkDisplayPresentInfoKHR {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkRect2D           srcRect;\n    VkRect2D           dstRect;\n    VkBool32           persistent;\n} VkDisplayPresentInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateSharedSwapchainsKHR)(VkDevice device, uint32_t swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR(\n    VkDevice                                    device,\n    uint32_t                                    swapchainCount,\n    const VkSwapchainCreateInfoKHR*             pCreateInfos,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSwapchainKHR*                             pSwapchains);\n#endif\n\n#ifdef VK_USE_PLATFORM_XLIB_KHR\n#define VK_KHR_xlib_surface 1\n#include <X11/Xlib.h>\n\n#define VK_KHR_XLIB_SURFACE_SPEC_VERSION  6\n#define VK_KHR_XLIB_SURFACE_EXTENSION_NAME \"VK_KHR_xlib_surface\"\n\ntypedef VkFlags VkXlibSurfaceCreateFlagsKHR;\n\ntypedef struct VkXlibSurfaceCreateInfoKHR {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkXlibSurfaceCreateFlagsKHR    flags;\n    Display*                       dpy;\n    Window                         window;\n} VkXlibSurfaceCreateInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(\n    VkInstance                                  instance,\n    const VkXlibSurfaceCreateInfoKHR*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    Display*                                    dpy,\n    VisualID                                    visualID);\n#endif\n#endif /* VK_USE_PLATFORM_XLIB_KHR */\n\n#ifdef VK_USE_PLATFORM_XCB_KHR\n#define VK_KHR_xcb_surface 1\n#include <xcb/xcb.h>\n\n#define VK_KHR_XCB_SURFACE_SPEC_VERSION   6\n#define VK_KHR_XCB_SURFACE_EXTENSION_NAME \"VK_KHR_xcb_surface\"\n\ntypedef VkFlags VkXcbSurfaceCreateFlagsKHR;\n\ntypedef struct VkXcbSurfaceCreateInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkXcbSurfaceCreateFlagsKHR    flags;\n    xcb_connection_t*             connection;\n    xcb_window_t                  window;\n} VkXcbSurfaceCreateInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateXcbSurfaceKHR)(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR(\n    VkInstance                                  instance,\n    const VkXcbSurfaceCreateInfoKHR*            pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    xcb_connection_t*                           connection,\n    xcb_visualid_t                              visual_id);\n#endif\n#endif /* VK_USE_PLATFORM_XCB_KHR */\n\n#ifdef VK_USE_PLATFORM_WAYLAND_KHR\n#define VK_KHR_wayland_surface 1\n#include <wayland-client.h>\n\n#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 5\n#define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME \"VK_KHR_wayland_surface\"\n\ntypedef VkFlags VkWaylandSurfaceCreateFlagsKHR;\n\ntypedef struct VkWaylandSurfaceCreateInfoKHR {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkWaylandSurfaceCreateFlagsKHR    flags;\n    struct wl_display*                display;\n    struct wl_surface*                surface;\n} VkWaylandSurfaceCreateInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display* display);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(\n    VkInstance                                  instance,\n    const VkWaylandSurfaceCreateInfoKHR*        pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    struct wl_display*                          display);\n#endif\n#endif /* VK_USE_PLATFORM_WAYLAND_KHR */\n\n#ifdef VK_USE_PLATFORM_MIR_KHR\n#define VK_KHR_mir_surface 1\n#include <mir_toolkit/client_types.h>\n\n#define VK_KHR_MIR_SURFACE_SPEC_VERSION   4\n#define VK_KHR_MIR_SURFACE_EXTENSION_NAME \"VK_KHR_mir_surface\"\n\ntypedef VkFlags VkMirSurfaceCreateFlagsKHR;\n\ntypedef struct VkMirSurfaceCreateInfoKHR {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkMirSurfaceCreateFlagsKHR    flags;\n    MirConnection*                connection;\n    MirSurface*                   mirSurface;\n} VkMirSurfaceCreateInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateMirSurfaceKHR)(VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, MirConnection* connection);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateMirSurfaceKHR(\n    VkInstance                                  instance,\n    const VkMirSurfaceCreateInfoKHR*            pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceMirPresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex,\n    MirConnection*                              connection);\n#endif\n#endif /* VK_USE_PLATFORM_MIR_KHR */\n\n#ifdef VK_USE_PLATFORM_ANDROID_KHR\n#define VK_KHR_android_surface 1\n#include <android/native_window.h>\n\n#define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6\n#define VK_KHR_ANDROID_SURFACE_EXTENSION_NAME \"VK_KHR_android_surface\"\n\ntypedef VkFlags VkAndroidSurfaceCreateFlagsKHR;\n\ntypedef struct VkAndroidSurfaceCreateInfoKHR {\n    VkStructureType                   sType;\n    const void*                       pNext;\n    VkAndroidSurfaceCreateFlagsKHR    flags;\n    ANativeWindow*                    window;\n} VkAndroidSurfaceCreateInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateAndroidSurfaceKHR)(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(\n    VkInstance                                  instance,\n    const VkAndroidSurfaceCreateInfoKHR*        pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n#endif /* VK_USE_PLATFORM_ANDROID_KHR */\n\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n#define VK_KHR_win32_surface 1\n#include <windows.h>\n\n#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 5\n#define VK_KHR_WIN32_SURFACE_EXTENSION_NAME \"VK_KHR_win32_surface\"\n\ntypedef VkFlags VkWin32SurfaceCreateFlagsKHR;\n\ntypedef struct VkWin32SurfaceCreateInfoKHR {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkWin32SurfaceCreateFlagsKHR    flags;\n    HINSTANCE                       hinstance;\n    HWND                            hwnd;\n} VkWin32SurfaceCreateInfoKHR;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\ntypedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(\n    VkInstance                                  instance,\n    const VkWin32SurfaceCreateInfoKHR*          pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n\nVKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t                                    queueFamilyIndex);\n#endif\n#endif /* VK_USE_PLATFORM_WIN32_KHR */\n\n#define VK_KHR_sampler_mirror_clamp_to_edge 1\n#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_SPEC_VERSION 1\n#define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME \"VK_KHR_sampler_mirror_clamp_to_edge\"\n\n\n#define VK_KHR_get_physical_device_properties2 1\n#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_SPEC_VERSION 1\n#define VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME \"VK_KHR_get_physical_device_properties2\"\n\ntypedef struct VkPhysicalDeviceFeatures2KHR {\n    VkStructureType             sType;\n    void*                       pNext;\n    VkPhysicalDeviceFeatures    features;\n} VkPhysicalDeviceFeatures2KHR;\n\ntypedef struct VkPhysicalDeviceProperties2KHR {\n    VkStructureType               sType;\n    void*                         pNext;\n    VkPhysicalDeviceProperties    properties;\n} VkPhysicalDeviceProperties2KHR;\n\ntypedef struct VkFormatProperties2KHR {\n    VkStructureType       sType;\n    void*                 pNext;\n    VkFormatProperties    formatProperties;\n} VkFormatProperties2KHR;\n\ntypedef struct VkImageFormatProperties2KHR {\n    VkStructureType            sType;\n    void*                      pNext;\n    VkImageFormatProperties    imageFormatProperties;\n} VkImageFormatProperties2KHR;\n\ntypedef struct VkPhysicalDeviceImageFormatInfo2KHR {\n    VkStructureType       sType;\n    const void*           pNext;\n    VkFormat              format;\n    VkImageType           type;\n    VkImageTiling         tiling;\n    VkImageUsageFlags     usage;\n    VkImageCreateFlags    flags;\n} VkPhysicalDeviceImageFormatInfo2KHR;\n\ntypedef struct VkQueueFamilyProperties2KHR {\n    VkStructureType            sType;\n    void*                      pNext;\n    VkQueueFamilyProperties    queueFamilyProperties;\n} VkQueueFamilyProperties2KHR;\n\ntypedef struct VkPhysicalDeviceMemoryProperties2KHR {\n    VkStructureType                     sType;\n    void*                               pNext;\n    VkPhysicalDeviceMemoryProperties    memoryProperties;\n} VkPhysicalDeviceMemoryProperties2KHR;\n\ntypedef struct VkSparseImageFormatProperties2KHR {\n    VkStructureType                  sType;\n    void*                            pNext;\n    VkSparseImageFormatProperties    properties;\n} VkSparseImageFormatProperties2KHR;\n\ntypedef struct VkPhysicalDeviceSparseImageFormatInfo2KHR {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkFormat                 format;\n    VkImageType              type;\n    VkSampleCountFlagBits    samples;\n    VkImageUsageFlags        usage;\n    VkImageTiling            tiling;\n} VkPhysicalDeviceSparseImageFormatInfo2KHR;\n\n\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR* pFeatures);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2KHR* pProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFormatProperties2KHR)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2KHR* pFormatProperties);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR* pImageFormatInfo, VkImageFormatProperties2KHR* pImageFormatProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties2KHR* pQueueFamilyProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2KHR* pMemoryProperties);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2KHR* pProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceFeatures2KHR*               pFeatures);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceProperties2KHR*             pProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkFormatProperties2KHR*                     pFormatProperties);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceImageFormatInfo2KHR*  pImageFormatInfo,\n    VkImageFormatProperties2KHR*                pImageFormatProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    uint32_t*                                   pQueueFamilyPropertyCount,\n    VkQueueFamilyProperties2KHR*                pQueueFamilyProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    VkPhysicalDeviceMemoryProperties2KHR*       pMemoryProperties);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties2KHR(\n    VkPhysicalDevice                            physicalDevice,\n    const VkPhysicalDeviceSparseImageFormatInfo2KHR* pFormatInfo,\n    uint32_t*                                   pPropertyCount,\n    VkSparseImageFormatProperties2KHR*          pProperties);\n#endif\n\n#define VK_KHR_shader_draw_parameters 1\n#define VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION 1\n#define VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME \"VK_KHR_shader_draw_parameters\"\n\n\n#define VK_KHR_maintenance1 1\n#define VK_KHR_MAINTENANCE1_SPEC_VERSION  1\n#define VK_KHR_MAINTENANCE1_EXTENSION_NAME \"VK_KHR_maintenance1\"\n\ntypedef VkFlags VkCommandPoolTrimFlagsKHR;\n\ntypedef void (VKAPI_PTR *PFN_vkTrimCommandPoolKHR)(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkTrimCommandPoolKHR(\n    VkDevice                                    device,\n    VkCommandPool                               commandPool,\n    VkCommandPoolTrimFlagsKHR                   flags);\n#endif\n\n#define VK_EXT_debug_report 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)\n\n#define VK_EXT_DEBUG_REPORT_SPEC_VERSION  4\n#define VK_EXT_DEBUG_REPORT_EXTENSION_NAME \"VK_EXT_debug_report\"\n#define VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT\n\n\ntypedef enum VkDebugReportObjectTypeEXT {\n    VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT = 0,\n    VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT = 1,\n    VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT = 2,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT = 3,\n    VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT = 4,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT = 5,\n    VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT = 6,\n    VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT = 7,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT = 8,\n    VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT = 9,\n    VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT = 10,\n    VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT = 11,\n    VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT = 12,\n    VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT = 13,\n    VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT = 14,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT = 15,\n    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT = 16,\n    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT = 17,\n    VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT = 18,\n    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT = 19,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT = 20,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT = 21,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT = 22,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT = 23,\n    VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT = 24,\n    VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT = 25,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT = 26,\n    VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT = 27,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = 28,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT = 29,\n    VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT = 30,\n    VK_DEBUG_REPORT_OBJECT_TYPE_OBJECT_TABLE_NVX_EXT = 31,\n    VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT = 32,\n    VK_DEBUG_REPORT_OBJECT_TYPE_BEGIN_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,\n    VK_DEBUG_REPORT_OBJECT_TYPE_END_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT,\n    VK_DEBUG_REPORT_OBJECT_TYPE_RANGE_SIZE_EXT = (VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT + 1),\n    VK_DEBUG_REPORT_OBJECT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDebugReportObjectTypeEXT;\n\ntypedef enum VkDebugReportErrorEXT {\n    VK_DEBUG_REPORT_ERROR_NONE_EXT = 0,\n    VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT = 1,\n    VK_DEBUG_REPORT_ERROR_BEGIN_RANGE_EXT = VK_DEBUG_REPORT_ERROR_NONE_EXT,\n    VK_DEBUG_REPORT_ERROR_END_RANGE_EXT = VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT,\n    VK_DEBUG_REPORT_ERROR_RANGE_SIZE_EXT = (VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT - VK_DEBUG_REPORT_ERROR_NONE_EXT + 1),\n    VK_DEBUG_REPORT_ERROR_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDebugReportErrorEXT;\n\n\ntypedef enum VkDebugReportFlagBitsEXT {\n    VK_DEBUG_REPORT_INFORMATION_BIT_EXT = 0x00000001,\n    VK_DEBUG_REPORT_WARNING_BIT_EXT = 0x00000002,\n    VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT = 0x00000004,\n    VK_DEBUG_REPORT_ERROR_BIT_EXT = 0x00000008,\n    VK_DEBUG_REPORT_DEBUG_BIT_EXT = 0x00000010,\n    VK_DEBUG_REPORT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDebugReportFlagBitsEXT;\ntypedef VkFlags VkDebugReportFlagsEXT;\n\ntypedef VkBool32 (VKAPI_PTR *PFN_vkDebugReportCallbackEXT)(\n    VkDebugReportFlagsEXT                       flags,\n    VkDebugReportObjectTypeEXT                  objectType,\n    uint64_t                                    object,\n    size_t                                      location,\n    int32_t                                     messageCode,\n    const char*                                 pLayerPrefix,\n    const char*                                 pMessage,\n    void*                                       pUserData);\n\n\ntypedef struct VkDebugReportCallbackCreateInfoEXT {\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkDebugReportFlagsEXT           flags;\n    PFN_vkDebugReportCallbackEXT    pfnCallback;\n    void*                           pUserData;\n} VkDebugReportCallbackCreateInfoEXT;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateDebugReportCallbackEXT)(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback);\ntypedef void (VKAPI_PTR *PFN_vkDestroyDebugReportCallbackEXT)(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator);\ntypedef void (VKAPI_PTR *PFN_vkDebugReportMessageEXT)(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(\n    VkInstance                                  instance,\n    const VkDebugReportCallbackCreateInfoEXT*   pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkDebugReportCallbackEXT*                   pCallback);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(\n    VkInstance                                  instance,\n    VkDebugReportCallbackEXT                    callback,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(\n    VkInstance                                  instance,\n    VkDebugReportFlagsEXT                       flags,\n    VkDebugReportObjectTypeEXT                  objectType,\n    uint64_t                                    object,\n    size_t                                      location,\n    int32_t                                     messageCode,\n    const char*                                 pLayerPrefix,\n    const char*                                 pMessage);\n#endif\n\n#define VK_NV_glsl_shader 1\n#define VK_NV_GLSL_SHADER_SPEC_VERSION    1\n#define VK_NV_GLSL_SHADER_EXTENSION_NAME  \"VK_NV_glsl_shader\"\n\n\n#define VK_IMG_filter_cubic 1\n#define VK_IMG_FILTER_CUBIC_SPEC_VERSION  1\n#define VK_IMG_FILTER_CUBIC_EXTENSION_NAME \"VK_IMG_filter_cubic\"\n\n\n#define VK_AMD_rasterization_order 1\n#define VK_AMD_RASTERIZATION_ORDER_SPEC_VERSION 1\n#define VK_AMD_RASTERIZATION_ORDER_EXTENSION_NAME \"VK_AMD_rasterization_order\"\n\n\ntypedef enum VkRasterizationOrderAMD {\n    VK_RASTERIZATION_ORDER_STRICT_AMD = 0,\n    VK_RASTERIZATION_ORDER_RELAXED_AMD = 1,\n    VK_RASTERIZATION_ORDER_BEGIN_RANGE_AMD = VK_RASTERIZATION_ORDER_STRICT_AMD,\n    VK_RASTERIZATION_ORDER_END_RANGE_AMD = VK_RASTERIZATION_ORDER_RELAXED_AMD,\n    VK_RASTERIZATION_ORDER_RANGE_SIZE_AMD = (VK_RASTERIZATION_ORDER_RELAXED_AMD - VK_RASTERIZATION_ORDER_STRICT_AMD + 1),\n    VK_RASTERIZATION_ORDER_MAX_ENUM_AMD = 0x7FFFFFFF\n} VkRasterizationOrderAMD;\n\ntypedef struct VkPipelineRasterizationStateRasterizationOrderAMD {\n    VkStructureType            sType;\n    const void*                pNext;\n    VkRasterizationOrderAMD    rasterizationOrder;\n} VkPipelineRasterizationStateRasterizationOrderAMD;\n\n\n\n#define VK_AMD_shader_trinary_minmax 1\n#define VK_AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION 1\n#define VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME \"VK_AMD_shader_trinary_minmax\"\n\n\n#define VK_AMD_shader_explicit_vertex_parameter 1\n#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION 1\n#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME \"VK_AMD_shader_explicit_vertex_parameter\"\n\n\n#define VK_EXT_debug_marker 1\n#define VK_EXT_DEBUG_MARKER_SPEC_VERSION  3\n#define VK_EXT_DEBUG_MARKER_EXTENSION_NAME \"VK_EXT_debug_marker\"\n\ntypedef struct VkDebugMarkerObjectNameInfoEXT {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkDebugReportObjectTypeEXT    objectType;\n    uint64_t                      object;\n    const char*                   pObjectName;\n} VkDebugMarkerObjectNameInfoEXT;\n\ntypedef struct VkDebugMarkerObjectTagInfoEXT {\n    VkStructureType               sType;\n    const void*                   pNext;\n    VkDebugReportObjectTypeEXT    objectType;\n    uint64_t                      object;\n    uint64_t                      tagName;\n    size_t                        tagSize;\n    const void*                   pTag;\n} VkDebugMarkerObjectTagInfoEXT;\n\ntypedef struct VkDebugMarkerMarkerInfoEXT {\n    VkStructureType    sType;\n    const void*        pNext;\n    const char*        pMarkerName;\n    float              color[4];\n} VkDebugMarkerMarkerInfoEXT;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectTagEXT)(VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectNameEXT)(VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerBeginEXT)(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerEndEXT)(VkCommandBuffer commandBuffer);\ntypedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerInsertEXT)(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectTagEXT(\n    VkDevice                                    device,\n    VkDebugMarkerObjectTagInfoEXT*              pTagInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectNameEXT(\n    VkDevice                                    device,\n    VkDebugMarkerObjectNameInfoEXT*             pNameInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerBeginEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkDebugMarkerMarkerInfoEXT*                 pMarkerInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerEndEXT(\n    VkCommandBuffer                             commandBuffer);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerInsertEXT(\n    VkCommandBuffer                             commandBuffer,\n    VkDebugMarkerMarkerInfoEXT*                 pMarkerInfo);\n#endif\n\n#define VK_AMD_gcn_shader 1\n#define VK_AMD_GCN_SHADER_SPEC_VERSION    1\n#define VK_AMD_GCN_SHADER_EXTENSION_NAME  \"VK_AMD_gcn_shader\"\n\n\n#define VK_NV_dedicated_allocation 1\n#define VK_NV_DEDICATED_ALLOCATION_SPEC_VERSION 1\n#define VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME \"VK_NV_dedicated_allocation\"\n\ntypedef struct VkDedicatedAllocationImageCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           dedicatedAllocation;\n} VkDedicatedAllocationImageCreateInfoNV;\n\ntypedef struct VkDedicatedAllocationBufferCreateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           dedicatedAllocation;\n} VkDedicatedAllocationBufferCreateInfoNV;\n\ntypedef struct VkDedicatedAllocationMemoryAllocateInfoNV {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkImage            image;\n    VkBuffer           buffer;\n} VkDedicatedAllocationMemoryAllocateInfoNV;\n\n\n\n#define VK_AMD_draw_indirect_count 1\n#define VK_AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION 1\n#define VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME \"VK_AMD_draw_indirect_count\"\n\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\ntypedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountAMD(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountAMD(\n    VkCommandBuffer                             commandBuffer,\n    VkBuffer                                    buffer,\n    VkDeviceSize                                offset,\n    VkBuffer                                    countBuffer,\n    VkDeviceSize                                countBufferOffset,\n    uint32_t                                    maxDrawCount,\n    uint32_t                                    stride);\n#endif\n\n#define VK_AMD_negative_viewport_height 1\n#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION 1\n#define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME \"VK_AMD_negative_viewport_height\"\n\n\n#define VK_AMD_gpu_shader_half_float 1\n#define VK_AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION 1\n#define VK_AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME \"VK_AMD_gpu_shader_half_float\"\n\n\n#define VK_AMD_shader_ballot 1\n#define VK_AMD_SHADER_BALLOT_SPEC_VERSION 1\n#define VK_AMD_SHADER_BALLOT_EXTENSION_NAME \"VK_AMD_shader_ballot\"\n\n\n#define VK_IMG_format_pvrtc 1\n#define VK_IMG_FORMAT_PVRTC_SPEC_VERSION  1\n#define VK_IMG_FORMAT_PVRTC_EXTENSION_NAME \"VK_IMG_format_pvrtc\"\n\n\n#define VK_NV_external_memory_capabilities 1\n#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_SPEC_VERSION 1\n#define VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME \"VK_NV_external_memory_capabilities\"\n\n\ntypedef enum VkExternalMemoryHandleTypeFlagBitsNV {\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV = 0x00000001,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV = 0x00000002,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV = 0x00000004,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV = 0x00000008,\n    VK_EXTERNAL_MEMORY_HANDLE_TYPE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkExternalMemoryHandleTypeFlagBitsNV;\ntypedef VkFlags VkExternalMemoryHandleTypeFlagsNV;\n\ntypedef enum VkExternalMemoryFeatureFlagBitsNV {\n    VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV = 0x00000001,\n    VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV = 0x00000002,\n    VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV = 0x00000004,\n    VK_EXTERNAL_MEMORY_FEATURE_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF\n} VkExternalMemoryFeatureFlagBitsNV;\ntypedef VkFlags VkExternalMemoryFeatureFlagsNV;\n\ntypedef struct VkExternalImageFormatPropertiesNV {\n    VkImageFormatProperties              imageFormatProperties;\n    VkExternalMemoryFeatureFlagsNV       externalMemoryFeatures;\n    VkExternalMemoryHandleTypeFlagsNV    exportFromImportedHandleTypes;\n    VkExternalMemoryHandleTypeFlagsNV    compatibleHandleTypes;\n} VkExternalImageFormatPropertiesNV;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceExternalImageFormatPropertiesNV(\n    VkPhysicalDevice                            physicalDevice,\n    VkFormat                                    format,\n    VkImageType                                 type,\n    VkImageTiling                               tiling,\n    VkImageUsageFlags                           usage,\n    VkImageCreateFlags                          flags,\n    VkExternalMemoryHandleTypeFlagsNV           externalHandleType,\n    VkExternalImageFormatPropertiesNV*          pExternalImageFormatProperties);\n#endif\n\n#define VK_NV_external_memory 1\n#define VK_NV_EXTERNAL_MEMORY_SPEC_VERSION 1\n#define VK_NV_EXTERNAL_MEMORY_EXTENSION_NAME \"VK_NV_external_memory\"\n\ntypedef struct VkExternalMemoryImageCreateInfoNV {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkExternalMemoryHandleTypeFlagsNV    handleTypes;\n} VkExternalMemoryImageCreateInfoNV;\n\ntypedef struct VkExportMemoryAllocateInfoNV {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkExternalMemoryHandleTypeFlagsNV    handleTypes;\n} VkExportMemoryAllocateInfoNV;\n\n\n\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n#define VK_NV_external_memory_win32 1\n#define VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1\n#define VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME \"VK_NV_external_memory_win32\"\n\ntypedef struct VkImportMemoryWin32HandleInfoNV {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkExternalMemoryHandleTypeFlagsNV    handleType;\n    HANDLE                               handle;\n} VkImportMemoryWin32HandleInfoNV;\n\ntypedef struct VkExportMemoryWin32HandleInfoNV {\n    VkStructureType               sType;\n    const void*                   pNext;\n    const SECURITY_ATTRIBUTES*    pAttributes;\n    DWORD                         dwAccess;\n} VkExportMemoryWin32HandleInfoNV;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleNV)(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV(\n    VkDevice                                    device,\n    VkDeviceMemory                              memory,\n    VkExternalMemoryHandleTypeFlagsNV           handleType,\n    HANDLE*                                     pHandle);\n#endif\n#endif /* VK_USE_PLATFORM_WIN32_KHR */\n\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n#define VK_NV_win32_keyed_mutex 1\n#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 1\n#define VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME \"VK_NV_win32_keyed_mutex\"\n\ntypedef struct VkWin32KeyedMutexAcquireReleaseInfoNV {\n    VkStructureType          sType;\n    const void*              pNext;\n    uint32_t                 acquireCount;\n    const VkDeviceMemory*    pAcquireSyncs;\n    const uint64_t*          pAcquireKeys;\n    const uint32_t*          pAcquireTimeoutMilliseconds;\n    uint32_t                 releaseCount;\n    const VkDeviceMemory*    pReleaseSyncs;\n    const uint64_t*          pReleaseKeys;\n} VkWin32KeyedMutexAcquireReleaseInfoNV;\n\n\n#endif /* VK_USE_PLATFORM_WIN32_KHR */\n\n#define VK_EXT_validation_flags 1\n#define VK_EXT_VALIDATION_FLAGS_SPEC_VERSION 1\n#define VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME \"VK_EXT_validation_flags\"\n\n\ntypedef enum VkValidationCheckEXT {\n    VK_VALIDATION_CHECK_ALL_EXT = 0,\n    VK_VALIDATION_CHECK_BEGIN_RANGE_EXT = VK_VALIDATION_CHECK_ALL_EXT,\n    VK_VALIDATION_CHECK_END_RANGE_EXT = VK_VALIDATION_CHECK_ALL_EXT,\n    VK_VALIDATION_CHECK_RANGE_SIZE_EXT = (VK_VALIDATION_CHECK_ALL_EXT - VK_VALIDATION_CHECK_ALL_EXT + 1),\n    VK_VALIDATION_CHECK_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkValidationCheckEXT;\n\ntypedef struct VkValidationFlagsEXT {\n    VkStructureType          sType;\n    const void*              pNext;\n    uint32_t                 disabledValidationCheckCount;\n    VkValidationCheckEXT*    pDisabledValidationChecks;\n} VkValidationFlagsEXT;\n\n\n\n#ifdef VK_USE_PLATFORM_VI_NN\n#define VK_NN_vi_surface 1\n#define VK_NN_VI_SURFACE_SPEC_VERSION     1\n#define VK_NN_VI_SURFACE_EXTENSION_NAME   \"VK_NN_vi_surface\"\n\ntypedef VkFlags VkViSurfaceCreateFlagsNN;\n\ntypedef struct VkViSurfaceCreateInfoNN {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkViSurfaceCreateFlagsNN    flags;\n    void*                       window;\n} VkViSurfaceCreateInfoNN;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateViSurfaceNN)(VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateViSurfaceNN(\n    VkInstance                                  instance,\n    const VkViSurfaceCreateInfoNN*              pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkSurfaceKHR*                               pSurface);\n#endif\n#endif /* VK_USE_PLATFORM_VI_NN */\n\n#define VK_EXT_shader_subgroup_ballot 1\n#define VK_EXT_SHADER_SUBGROUP_BALLOT_SPEC_VERSION 1\n#define VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME \"VK_EXT_shader_subgroup_ballot\"\n\n\n#define VK_EXT_shader_subgroup_vote 1\n#define VK_EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION 1\n#define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME \"VK_EXT_shader_subgroup_vote\"\n\n\n#define VK_NVX_device_generated_commands 1\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkObjectTableNVX)\nVK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectCommandsLayoutNVX)\n\n#define VK_NVX_DEVICE_GENERATED_COMMANDS_SPEC_VERSION 1\n#define VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME \"VK_NVX_device_generated_commands\"\n\n\ntypedef enum VkIndirectCommandsTokenTypeNVX {\n    VK_INDIRECT_COMMANDS_TOKEN_PIPELINE_NVX = 0,\n    VK_INDIRECT_COMMANDS_TOKEN_DESCRIPTOR_SET_NVX = 1,\n    VK_INDIRECT_COMMANDS_TOKEN_INDEX_BUFFER_NVX = 2,\n    VK_INDIRECT_COMMANDS_TOKEN_VERTEX_BUFFER_NVX = 3,\n    VK_INDIRECT_COMMANDS_TOKEN_PUSH_CONSTANT_NVX = 4,\n    VK_INDIRECT_COMMANDS_TOKEN_DRAW_INDEXED_NVX = 5,\n    VK_INDIRECT_COMMANDS_TOKEN_DRAW_NVX = 6,\n    VK_INDIRECT_COMMANDS_TOKEN_DISPATCH_NVX = 7,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_BEGIN_RANGE_NVX = VK_INDIRECT_COMMANDS_TOKEN_PIPELINE_NVX,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_END_RANGE_NVX = VK_INDIRECT_COMMANDS_TOKEN_DISPATCH_NVX,\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_RANGE_SIZE_NVX = (VK_INDIRECT_COMMANDS_TOKEN_DISPATCH_NVX - VK_INDIRECT_COMMANDS_TOKEN_PIPELINE_NVX + 1),\n    VK_INDIRECT_COMMANDS_TOKEN_TYPE_MAX_ENUM_NVX = 0x7FFFFFFF\n} VkIndirectCommandsTokenTypeNVX;\n\ntypedef enum VkObjectEntryTypeNVX {\n    VK_OBJECT_ENTRY_DESCRIPTOR_SET_NVX = 0,\n    VK_OBJECT_ENTRY_PIPELINE_NVX = 1,\n    VK_OBJECT_ENTRY_INDEX_BUFFER_NVX = 2,\n    VK_OBJECT_ENTRY_VERTEX_BUFFER_NVX = 3,\n    VK_OBJECT_ENTRY_PUSH_CONSTANT_NVX = 4,\n    VK_OBJECT_ENTRY_TYPE_BEGIN_RANGE_NVX = VK_OBJECT_ENTRY_DESCRIPTOR_SET_NVX,\n    VK_OBJECT_ENTRY_TYPE_END_RANGE_NVX = VK_OBJECT_ENTRY_PUSH_CONSTANT_NVX,\n    VK_OBJECT_ENTRY_TYPE_RANGE_SIZE_NVX = (VK_OBJECT_ENTRY_PUSH_CONSTANT_NVX - VK_OBJECT_ENTRY_DESCRIPTOR_SET_NVX + 1),\n    VK_OBJECT_ENTRY_TYPE_MAX_ENUM_NVX = 0x7FFFFFFF\n} VkObjectEntryTypeNVX;\n\n\ntypedef enum VkIndirectCommandsLayoutUsageFlagBitsNVX {\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NVX = 0x00000001,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_SPARSE_SEQUENCES_BIT_NVX = 0x00000002,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EMPTY_EXECUTIONS_BIT_NVX = 0x00000004,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NVX = 0x00000008,\n    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_FLAG_BITS_MAX_ENUM_NVX = 0x7FFFFFFF\n} VkIndirectCommandsLayoutUsageFlagBitsNVX;\ntypedef VkFlags VkIndirectCommandsLayoutUsageFlagsNVX;\n\ntypedef enum VkObjectEntryUsageFlagBitsNVX {\n    VK_OBJECT_ENTRY_USAGE_GRAPHICS_BIT_NVX = 0x00000001,\n    VK_OBJECT_ENTRY_USAGE_COMPUTE_BIT_NVX = 0x00000002,\n    VK_OBJECT_ENTRY_USAGE_FLAG_BITS_MAX_ENUM_NVX = 0x7FFFFFFF\n} VkObjectEntryUsageFlagBitsNVX;\ntypedef VkFlags VkObjectEntryUsageFlagsNVX;\n\ntypedef struct VkDeviceGeneratedCommandsFeaturesNVX {\n    VkStructureType    sType;\n    const void*        pNext;\n    VkBool32           computeBindingPointSupport;\n} VkDeviceGeneratedCommandsFeaturesNVX;\n\ntypedef struct VkDeviceGeneratedCommandsLimitsNVX {\n    VkStructureType    sType;\n    const void*        pNext;\n    uint32_t           maxIndirectCommandsLayoutTokenCount;\n    uint32_t           maxObjectEntryCounts;\n    uint32_t           minSequenceCountBufferOffsetAlignment;\n    uint32_t           minSequenceIndexBufferOffsetAlignment;\n    uint32_t           minCommandsTokenBufferOffsetAlignment;\n} VkDeviceGeneratedCommandsLimitsNVX;\n\ntypedef struct VkIndirectCommandsTokenNVX {\n    VkIndirectCommandsTokenTypeNVX    tokenType;\n    VkBuffer                          buffer;\n    VkDeviceSize                      offset;\n} VkIndirectCommandsTokenNVX;\n\ntypedef struct VkIndirectCommandsLayoutTokenNVX {\n    VkIndirectCommandsTokenTypeNVX    tokenType;\n    uint32_t                          bindingUnit;\n    uint32_t                          dynamicCount;\n    uint32_t                          divisor;\n} VkIndirectCommandsLayoutTokenNVX;\n\ntypedef struct VkIndirectCommandsLayoutCreateInfoNVX {\n    VkStructureType                            sType;\n    const void*                                pNext;\n    VkPipelineBindPoint                        pipelineBindPoint;\n    VkIndirectCommandsLayoutUsageFlagsNVX      flags;\n    uint32_t                                   tokenCount;\n    const VkIndirectCommandsLayoutTokenNVX*    pTokens;\n} VkIndirectCommandsLayoutCreateInfoNVX;\n\ntypedef struct VkCmdProcessCommandsInfoNVX {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    VkObjectTableNVX                     objectTable;\n    VkIndirectCommandsLayoutNVX          indirectCommandsLayout;\n    uint32_t                             indirectCommandsTokenCount;\n    const VkIndirectCommandsTokenNVX*    pIndirectCommandsTokens;\n    uint32_t                             maxSequencesCount;\n    VkCommandBuffer                      targetCommandBuffer;\n    VkBuffer                             sequencesCountBuffer;\n    VkDeviceSize                         sequencesCountOffset;\n    VkBuffer                             sequencesIndexBuffer;\n    VkDeviceSize                         sequencesIndexOffset;\n} VkCmdProcessCommandsInfoNVX;\n\ntypedef struct VkCmdReserveSpaceForCommandsInfoNVX {\n    VkStructureType                sType;\n    const void*                    pNext;\n    VkObjectTableNVX               objectTable;\n    VkIndirectCommandsLayoutNVX    indirectCommandsLayout;\n    uint32_t                       maxSequencesCount;\n} VkCmdReserveSpaceForCommandsInfoNVX;\n\ntypedef struct VkObjectTableCreateInfoNVX {\n    VkStructureType                      sType;\n    const void*                          pNext;\n    uint32_t                             objectCount;\n    const VkObjectEntryTypeNVX*          pObjectEntryTypes;\n    const uint32_t*                      pObjectEntryCounts;\n    const VkObjectEntryUsageFlagsNVX*    pObjectEntryUsageFlags;\n    uint32_t                             maxUniformBuffersPerDescriptor;\n    uint32_t                             maxStorageBuffersPerDescriptor;\n    uint32_t                             maxStorageImagesPerDescriptor;\n    uint32_t                             maxSampledImagesPerDescriptor;\n    uint32_t                             maxPipelineLayouts;\n} VkObjectTableCreateInfoNVX;\n\ntypedef struct VkObjectTableEntryNVX {\n    VkObjectEntryTypeNVX          type;\n    VkObjectEntryUsageFlagsNVX    flags;\n} VkObjectTableEntryNVX;\n\ntypedef struct VkObjectTablePipelineEntryNVX {\n    VkObjectEntryTypeNVX          type;\n    VkObjectEntryUsageFlagsNVX    flags;\n    VkPipeline                    pipeline;\n} VkObjectTablePipelineEntryNVX;\n\ntypedef struct VkObjectTableDescriptorSetEntryNVX {\n    VkObjectEntryTypeNVX          type;\n    VkObjectEntryUsageFlagsNVX    flags;\n    VkPipelineLayout              pipelineLayout;\n    VkDescriptorSet               descriptorSet;\n} VkObjectTableDescriptorSetEntryNVX;\n\ntypedef struct VkObjectTableVertexBufferEntryNVX {\n    VkObjectEntryTypeNVX          type;\n    VkObjectEntryUsageFlagsNVX    flags;\n    VkBuffer                      buffer;\n} VkObjectTableVertexBufferEntryNVX;\n\ntypedef struct VkObjectTableIndexBufferEntryNVX {\n    VkObjectEntryTypeNVX          type;\n    VkObjectEntryUsageFlagsNVX    flags;\n    VkBuffer                      buffer;\n    VkIndexType                   indexType;\n} VkObjectTableIndexBufferEntryNVX;\n\ntypedef struct VkObjectTablePushConstantEntryNVX {\n    VkObjectEntryTypeNVX          type;\n    VkObjectEntryUsageFlagsNVX    flags;\n    VkPipelineLayout              pipelineLayout;\n    VkShaderStageFlags            stageFlags;\n} VkObjectTablePushConstantEntryNVX;\n\n\ntypedef void (VKAPI_PTR *PFN_vkCmdProcessCommandsNVX)(VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo);\ntypedef void (VKAPI_PTR *PFN_vkCmdReserveSpaceForCommandsNVX)(VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateIndirectCommandsLayoutNVX)(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout);\ntypedef void (VKAPI_PTR *PFN_vkDestroyIndirectCommandsLayoutNVX)(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkCreateObjectTableNVX)(VkDevice device, const VkObjectTableCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkObjectTableNVX* pObjectTable);\ntypedef void (VKAPI_PTR *PFN_vkDestroyObjectTableNVX)(VkDevice device, VkObjectTableNVX objectTable, const VkAllocationCallbacks* pAllocator);\ntypedef VkResult (VKAPI_PTR *PFN_vkRegisterObjectsNVX)(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount, const VkObjectTableEntryNVX* const*    ppObjectTableEntries, const uint32_t* pObjectIndices);\ntypedef VkResult (VKAPI_PTR *PFN_vkUnregisterObjectsNVX)(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount, const VkObjectEntryTypeNVX* pObjectEntryTypes, const uint32_t* pObjectIndices);\ntypedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX)(VkPhysicalDevice physicalDevice, VkDeviceGeneratedCommandsFeaturesNVX* pFeatures, VkDeviceGeneratedCommandsLimitsNVX* pLimits);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR void VKAPI_CALL vkCmdProcessCommandsNVX(\n    VkCommandBuffer                             commandBuffer,\n    const VkCmdProcessCommandsInfoNVX*          pProcessCommandsInfo);\n\nVKAPI_ATTR void VKAPI_CALL vkCmdReserveSpaceForCommandsNVX(\n    VkCommandBuffer                             commandBuffer,\n    const VkCmdReserveSpaceForCommandsInfoNVX*  pReserveSpaceInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectCommandsLayoutNVX(\n    VkDevice                                    device,\n    const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkIndirectCommandsLayoutNVX*                pIndirectCommandsLayout);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyIndirectCommandsLayoutNVX(\n    VkDevice                                    device,\n    VkIndirectCommandsLayoutNVX                 indirectCommandsLayout,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkCreateObjectTableNVX(\n    VkDevice                                    device,\n    const VkObjectTableCreateInfoNVX*           pCreateInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkObjectTableNVX*                           pObjectTable);\n\nVKAPI_ATTR void VKAPI_CALL vkDestroyObjectTableNVX(\n    VkDevice                                    device,\n    VkObjectTableNVX                            objectTable,\n    const VkAllocationCallbacks*                pAllocator);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkRegisterObjectsNVX(\n    VkDevice                                    device,\n    VkObjectTableNVX                            objectTable,\n    uint32_t                                    objectCount,\n    const VkObjectTableEntryNVX* const*         ppObjectTableEntries,\n    const uint32_t*                             pObjectIndices);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkUnregisterObjectsNVX(\n    VkDevice                                    device,\n    VkObjectTableNVX                            objectTable,\n    uint32_t                                    objectCount,\n    const VkObjectEntryTypeNVX*                 pObjectEntryTypes,\n    const uint32_t*                             pObjectIndices);\n\nVKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(\n    VkPhysicalDevice                            physicalDevice,\n    VkDeviceGeneratedCommandsFeaturesNVX*       pFeatures,\n    VkDeviceGeneratedCommandsLimitsNVX*         pLimits);\n#endif\n\n#define VK_EXT_direct_mode_display 1\n#define VK_EXT_DIRECT_MODE_DISPLAY_SPEC_VERSION 1\n#define VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME \"VK_EXT_direct_mode_display\"\n\ntypedef VkResult (VKAPI_PTR *PFN_vkReleaseDisplayEXT)(VkPhysicalDevice physicalDevice, VkDisplayKHR display);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkReleaseDisplayEXT(\n    VkPhysicalDevice                            physicalDevice,\n    VkDisplayKHR                                display);\n#endif\n\n#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT\n#define VK_EXT_acquire_xlib_display 1\n#include <X11/extensions/Xrandr.h>\n\n#define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1\n#define VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME \"VK_EXT_acquire_xlib_display\"\n\ntypedef VkResult (VKAPI_PTR *PFN_vkAcquireXlibDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetRandROutputDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, VkDisplayKHR* pDisplay);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkAcquireXlibDisplayEXT(\n    VkPhysicalDevice                            physicalDevice,\n    Display*                                    dpy,\n    VkDisplayKHR                                display);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetRandROutputDisplayEXT(\n    VkPhysicalDevice                            physicalDevice,\n    Display*                                    dpy,\n    RROutput                                    rrOutput,\n    VkDisplayKHR*                               pDisplay);\n#endif\n#endif /* VK_USE_PLATFORM_XLIB_XRANDR_EXT */\n\n#define VK_EXT_display_surface_counter 1\n#define VK_EXT_DISPLAY_SURFACE_COUNTER_SPEC_VERSION 1\n#define VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME \"VK_EXT_display_surface_counter\"\n\n\ntypedef enum VkSurfaceCounterFlagBitsEXT {\n    VK_SURFACE_COUNTER_VBLANK_EXT = 0x00000001,\n    VK_SURFACE_COUNTER_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkSurfaceCounterFlagBitsEXT;\ntypedef VkFlags VkSurfaceCounterFlagsEXT;\n\ntypedef struct VkSurfaceCapabilities2EXT {\n    VkStructureType                  sType;\n    void*                            pNext;\n    uint32_t                         minImageCount;\n    uint32_t                         maxImageCount;\n    VkExtent2D                       currentExtent;\n    VkExtent2D                       minImageExtent;\n    VkExtent2D                       maxImageExtent;\n    uint32_t                         maxImageArrayLayers;\n    VkSurfaceTransformFlagsKHR       supportedTransforms;\n    VkSurfaceTransformFlagBitsKHR    currentTransform;\n    VkCompositeAlphaFlagsKHR         supportedCompositeAlpha;\n    VkImageUsageFlags                supportedUsageFlags;\n    VkSurfaceCounterFlagsEXT         supportedSurfaceCounters;\n} VkSurfaceCapabilities2EXT;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilities2EXT* pSurfaceCapabilities);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2EXT(\n    VkPhysicalDevice                            physicalDevice,\n    VkSurfaceKHR                                surface,\n    VkSurfaceCapabilities2EXT*                  pSurfaceCapabilities);\n#endif\n\n#define VK_EXT_display_control 1\n#define VK_EXT_DISPLAY_CONTROL_SPEC_VERSION 1\n#define VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME \"VK_EXT_display_control\"\n\n\ntypedef enum VkDisplayPowerStateEXT {\n    VK_DISPLAY_POWER_STATE_OFF_EXT = 0,\n    VK_DISPLAY_POWER_STATE_SUSPEND_EXT = 1,\n    VK_DISPLAY_POWER_STATE_ON_EXT = 2,\n    VK_DISPLAY_POWER_STATE_BEGIN_RANGE_EXT = VK_DISPLAY_POWER_STATE_OFF_EXT,\n    VK_DISPLAY_POWER_STATE_END_RANGE_EXT = VK_DISPLAY_POWER_STATE_ON_EXT,\n    VK_DISPLAY_POWER_STATE_RANGE_SIZE_EXT = (VK_DISPLAY_POWER_STATE_ON_EXT - VK_DISPLAY_POWER_STATE_OFF_EXT + 1),\n    VK_DISPLAY_POWER_STATE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDisplayPowerStateEXT;\n\ntypedef enum VkDeviceEventTypeEXT {\n    VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT = 0,\n    VK_DEVICE_EVENT_TYPE_BEGIN_RANGE_EXT = VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT,\n    VK_DEVICE_EVENT_TYPE_END_RANGE_EXT = VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT,\n    VK_DEVICE_EVENT_TYPE_RANGE_SIZE_EXT = (VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT - VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT + 1),\n    VK_DEVICE_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDeviceEventTypeEXT;\n\ntypedef enum VkDisplayEventTypeEXT {\n    VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT = 0,\n    VK_DISPLAY_EVENT_TYPE_BEGIN_RANGE_EXT = VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT,\n    VK_DISPLAY_EVENT_TYPE_END_RANGE_EXT = VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT,\n    VK_DISPLAY_EVENT_TYPE_RANGE_SIZE_EXT = (VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT - VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT + 1),\n    VK_DISPLAY_EVENT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF\n} VkDisplayEventTypeEXT;\n\ntypedef struct VkDisplayPowerInfoEXT {\n    VkStructureType           sType;\n    const void*               pNext;\n    VkDisplayPowerStateEXT    powerState;\n} VkDisplayPowerInfoEXT;\n\ntypedef struct VkDeviceEventInfoEXT {\n    VkStructureType         sType;\n    const void*             pNext;\n    VkDeviceEventTypeEXT    deviceEvent;\n} VkDeviceEventInfoEXT;\n\ntypedef struct VkDisplayEventInfoEXT {\n    VkStructureType          sType;\n    const void*              pNext;\n    VkDisplayEventTypeEXT    displayEvent;\n} VkDisplayEventInfoEXT;\n\ntypedef struct VkSwapchainCounterCreateInfoEXT {\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkSurfaceCounterFlagsEXT    surfaceCounters;\n} VkSwapchainCounterCreateInfoEXT;\n\n\ntypedef VkResult (VKAPI_PTR *PFN_vkDisplayPowerControlEXT)(VkDevice device, VkDisplayKHR display, const VkDisplayPowerInfoEXT* pDisplayPowerInfo);\ntypedef VkResult (VKAPI_PTR *PFN_vkRegisterDeviceEventEXT)(VkDevice device, const VkDeviceEventInfoEXT* pDeviceEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence);\ntypedef VkResult (VKAPI_PTR *PFN_vkRegisterDisplayEventEXT)(VkDevice device, VkDisplayKHR display, const VkDisplayEventInfoEXT* pDisplayEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence);\ntypedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainCounterEXT)(VkDevice device, VkSwapchainKHR swapchain, VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue);\n\n#ifndef VK_NO_PROTOTYPES\nVKAPI_ATTR VkResult VKAPI_CALL vkDisplayPowerControlEXT(\n    VkDevice                                    device,\n    VkDisplayKHR                                display,\n    const VkDisplayPowerInfoEXT*                pDisplayPowerInfo);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkRegisterDeviceEventEXT(\n    VkDevice                                    device,\n    const VkDeviceEventInfoEXT*                 pDeviceEventInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkFence*                                    pFence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkRegisterDisplayEventEXT(\n    VkDevice                                    device,\n    VkDisplayKHR                                display,\n    const VkDisplayEventInfoEXT*                pDisplayEventInfo,\n    const VkAllocationCallbacks*                pAllocator,\n    VkFence*                                    pFence);\n\nVKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainCounterEXT(\n    VkDevice                                    device,\n    VkSwapchainKHR                              swapchain,\n    VkSurfaceCounterFlagBitsEXT                 counter,\n    uint64_t*                                   pCounterValue);\n#endif\n\n#define VK_EXT_swapchain_colorspace 1\n#define VK_SWAPCHAIN_COLOR_SPACE_SPEC_VERSION 1\n#define VK_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME \"VK_EXT_swapchain_colorspace\"\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "external/GLFW/docs/CMakeLists.txt",
    "content": "\nset(glfw_DOCS_SOURCES\n    \"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h\"\n    \"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h\"\n    \"${GLFW_SOURCE_DIR}/docs/main.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/news.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/moving.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/quick.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/compile.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/build.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/intro.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/context.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/monitor.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/window.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/input.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/vulkan.dox\"\n    \"${GLFW_SOURCE_DIR}/docs/compat.dox\")\n\nif (GLFW_DOCUMENT_INTERNALS)\n    list(APPEND glfw_DOCS_SOURCES\n        \"${GLFW_SOURCE_DIR}/docs/internal.dox\"\n        \"${GLFW_SOURCE_DIR}/src/internal.h\")\nendif()\n\nforeach(arg ${glfw_DOCS_SOURCES})\n    set(GLFW_DOCS_SOURCES \"${GLFW_DOCS_SOURCES} \\\\\\n\\\"${arg}\\\"\")\nendforeach()\n\nconfigure_file(Doxyfile.in Doxyfile @ONLY)\n                     \nadd_custom_target(docs ALL \"${DOXYGEN_EXECUTABLE}\"\n                  WORKING_DIRECTORY \"${GLFW_BINARY_DIR}/docs\"\n                  COMMENT \"Generating HTML documentation\" VERBATIM)\n\n"
  },
  {
    "path": "external/GLFW/docs/Doxyfile.in",
    "content": "# Doxyfile 1.8.3.1\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a hash (#) is considered a comment and will be ignored.\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# http://www.gnu.org/software/libiconv for the list of possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or sequence of words) that should\n# identify the project. Note that if you do not use Doxywizard you need\n# to put quotes around the project name if it contains spaces.\n\nPROJECT_NAME           = \"GLFW\"\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n\nPROJECT_NUMBER         = @GLFW_VERSION_FULL@\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer\n# a quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = \"A multi-platform library for OpenGL, window and input\"\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is\n# included in the documentation. The maximum height of the logo should not\n# exceed 55 pixels and the maximum width should not exceed 200 pixels.\n# Doxygen will copy the logo to the output directory.\n\nPROJECT_LOGO           =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n# base path where the generated documentation will be put.\n# If a relative path is entered, it will be relative to the location\n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = \"@GLFW_BINARY_DIR@/docs\"\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n# 4096 sub-directories (in 2 levels) under the output directory of each output\n# format and will distribute the generated files over these directories.\n# Enabling this option can be useful when feeding doxygen a huge amount of\n# source files, where putting all generated files in the same directory would\n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = NO\n\n# This tag implements a quasi-intelligent brief description abbreviator\n# that is used to form the text in various listings. Each string\n# in this list, if found as the leading text of the brief description, will be\n# stripped from the text and the result after processing the whole list, is\n# used as the annotated text. Otherwise, the brief description is used as-is.\n# If left blank, the following values are used (\"$name\" is automatically\n# replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       =\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = YES\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user-defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the\n# path to strip. Note that you specify absolute paths here, but also\n# relative paths, which will be relative from the directory where doxygen is\n# started.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n# the path mentioned in the documentation of a class, which tells\n# the reader which header file to include in order to use a class.\n# If left blank only the name of the header file containing the class\n# definition is used. Otherwise one should specify the include paths that\n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n# (but less readable) file names. This can be useful if your file system\n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments will behave just like regular Qt-style comments\n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n# interpret the first line (until the first dot) of a Qt-style\n# comment as the brief description. If set to NO, the comments\n# will behave just like regular Qt-style comments (thus requiring\n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n# treat a multi-line C++ special comment block (i.e. a block of //! or ///\n# comments) as a brief description. This used to be the default behaviour.\n# The new default is to treat a multi-line C++ comment block as a detailed\n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n# a new page for each member. If set to NO, the documentation of a member will\n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user-defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                = \"thread_safety=@par Thread safety\\n\" \\\n                         \"pointer_lifetime=@par Pointer lifetime\\n\" \\\n                         \"analysis=@par Analysis\\n\" \\\n                         \"reentrancy=@par Reentrancy\\n\" \\\n                         \"errors=@par Errors\\n\" \\\n                         \"glfw3=@par\\n__GLFW 3:__\" \\\n                         \"x11=__X11:__\" \\\n                         \"wayland=__Wayland:__\" \\\n                         \"win32=__Windows:__\" \\\n                         \"macos=__macOS:__\" \\\n                         \"linux=__Linux:__\"\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding\n# \"class=itcl::class\" will allow you to use the command class in the\n# itcl::class meaning.\n\nTCL_SUBST              =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n# sources only. Doxygen will then generate output that is more tailored for C.\n# For instance, some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = YES\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n# sources only. Doxygen will then generate output that is more tailored for\n# Java. For instance, namespaces will be presented as packages, qualified\n# scopes will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources only. Doxygen will then generate output that is more tailored for\n# Fortran.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for\n# VHDL.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension,\n# and language is one of the parsers supported by doxygen: IDL, Java,\n# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,\n# C++. For instance to make doxygen treat .inc files as Fortran files (default\n# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note\n# that for custom extensions you also need to set FILE_PATTERNS otherwise the\n# files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all\n# comments according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you\n# can mix doxygen, HTML, and XML commands with Markdown formatting.\n# Disable only in case of backward compatibilities issues.\n\nMARKDOWN_SUPPORT       = YES\n\n# When enabled doxygen tries to link words that correspond to documented classes,\n# or namespaces to their corresponding documentation. Such a link can be\n# prevented in individual cases by by putting a % sign in front of the word or\n# globally by setting AUTOLINK_SUPPORT to NO.\n\nAUTOLINK_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should\n# set this tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n# func(std::string) {}). This also makes the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n# Doxygen will parse them like normal C++ but will assume all classes use public\n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES (the\n# default) will make doxygen replace the get and set methods by a property in\n# the documentation. This will only work if the methods are indeed getting or\n# setting a simple type. If this is not the case, or you want to show the\n# methods anyway, you should set this option to NO.\n\nIDL_PROPERTY_SUPPORT   = NO\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n# the same type (for instance a group of public functions) to be put as a\n# subgroup of that type (e.g. under the Public Functions section). Set it to\n# NO to prevent subgrouping. Alternatively, this can be done per class using\n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n# unions are shown inside the group in which they are included (e.g. using\n# @ingroup) instead of on a separate page (for HTML and Man pages) or\n# section (for LaTeX and RTF).\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n# unions with only public data fields will be shown inline in the documentation\n# of the scope in which they are defined (i.e. file, namespace, or group\n# documentation), provided this scope is documented. If set to NO (the default),\n# structs, classes, and unions are shown on a separate page (for HTML and Man\n# pages) or section (for LaTeX and RTF).\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n# is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically\n# be useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\n# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\n# their name and scope. Since this can be an expensive process and often the\n# same symbol appear multiple times in the code, doxygen keeps a cache of\n# pre-resolved symbols. If the cache is too small doxygen will become slower.\n# If the cache is too large, memory is wasted. The cache size is given by this\n# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = YES\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal\n# scope will be included in the documentation.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = NO\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n# defined locally in source files will be included in the documentation.\n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local\n# methods, which are defined in the implementation section but not in\n# the interface are included in the documentation.\n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base\n# name of the file that contains the anonymous namespace. By default\n# anonymous namespaces are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these classes will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n# friend (class|struct|union) declarations.\n# If set to NO (the default) these declarations will be included in the\n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n# documentation blocks found inside the body of a function.\n# If set to NO (the default) these blocks will be appended to the\n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put a list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = NO\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n# will list include files with double quotes in the documentation\n# rather than with sharp brackets.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = NO\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n# brief documentation of file, namespace and class members alphabetically\n# by member name. If set to NO (the default) the members will appear in\n# declaration order.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n# will sort the (brief and detailed) documentation of class members so that\n# constructors and destructors are listed first. If set to NO (the default)\n# the constructors will appear in the respective orders defined by\n# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n# hierarchy of group names into alphabetical order. If set to NO (the default)\n# the group names will appear in their defined order.\n\nSORT_GROUP_NAMES       = YES\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n# sorted by fully-qualified names, including namespaces. If set to\n# NO (the default), the class list will be sorted only by class name,\n# not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the\n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n# do proper type resolution of all parameters of a function it will reject a\n# match between the prototype and the implementation of a member function even\n# if there is only one candidate or it is obvious which candidate to choose\n# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n# will still accept a match between prototype and implementation in such cases.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n# disable (NO) the deprecated list. This list is created by putting\n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if section-label ... \\endif\n# and \\cond section-label ... \\endcond blocks.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or macro consists of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and macros in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n# This will remove the Files entry from the Quick Index and from the\n# Folder Tree View (if specified). The default is YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n# Namespaces page.\n# This will remove the Namespaces entry from the Quick Index\n# and from the Folder Tree View (if specified). The default is YES.\n\nSHOW_NAMESPACES        = NO\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command <command> <input-file>, where <command> is the value of\n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n# provided by doxygen. Whatever the program writes to standard output\n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option.\n# You can optionally specify a file name after the option, if omitted\n# DoxygenLayout.xml will be used as the name of the layout file.\n\nLAYOUT_FILE            =\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files\n# containing the references data. This must be a list of .bib files. The\n# .bib extension is automatically appended if omitted. Using this command\n# requires the bibtex tool to be installed. See also\n# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\n# feature you need bibtex and perl available in the search path. Do not use\n# file names with spaces, bibtex cannot handle them.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = YES\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some\n# parameters in a documented function, or documenting parameters that\n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_NO_PARAMDOC option can be enabled to get warnings for\n# functions that are documented, but have no documentation for their parameters\n# or return value. If set to NO (the default) doxygen will only warn about\n# wrong or incomplete parameter documentation, but not about the absence of\n# documentation.\n\nWARN_NO_PARAMDOC       = YES\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text. Optionally the format may contain\n# $version, which will be replaced by the version of the file (if it could\n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           = \"@GLFW_BINARY_DIR@/docs/warnings.txt\"\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n\nINPUT                  = @GLFW_DOCS_SOURCES@\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n# also the default input encoding. Doxygen uses libiconv (or the iconv built\n# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for\n# the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank the following patterns are tested:\n# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n# *.f90 *.f *.for *.vhd *.vhdl\n\nFILE_PATTERNS          = *.h *.dox\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = NO\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                =\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories. Note that the wildcards are matched\n# against the file with absolute path, so to exclude all test directories\n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       =\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        = APIENTRY GLFWAPI\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           = \"@GLFW_SOURCE_DIR@/examples\"\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       =\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude\n# commands irrespective of the value of the RECURSIVE tag.\n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.\n# If FILTER_PATTERNS is specified, this tag will be\n# ignored.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis.\n# Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match.\n# The filters are a list of the form:\n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n# info on how filters are used. If FILTER_PATTERNS is empty or if\n# non of the patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n# and it is also possible to disable source filtering for a specific pattern\n# using *.ext= (so without naming a filter). This option only has effect when\n# FILTER_SOURCE_FILES is enabled.\n\nFILTER_SOURCE_PATTERNS =\n\n# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page (index.html).\n# This can be useful if you have a project on for instance GitHub and want reuse\n# the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE =\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n# Note: To get rid of all source code in the generated output, make sure also\n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C, C++ and Fortran comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES\n# then for each documented function all documented\n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES\n# then for each documented function all documented entities\n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.\n# Otherwise they will link to the documentation.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code\n# will point to the HTML generated by the htags(1) tool instead of doxygen\n# built-in source browser. The htags tool is part of GNU's global source\n# tagging system (see http://www.gnu.org/software/global/global.html). You\n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = YES\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          = glfw GLFW_\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header. Note that when using a custom header you are responsible\n#  for the proper inclusion of any scripts and style sheets that doxygen\n# needs, which is dependent on the configuration options used.\n# It is advised to generate a default header using \"doxygen -w html\n# header.html footer.html stylesheet.css YourConfigFile\" and then modify\n# that header. Note that the header is subject to change so you typically\n# have to redo this when upgrading to a newer version of doxygen or when\n# changing the value of configuration settings such as GENERATE_TREEVIEW!\n\nHTML_HEADER            = \"@GLFW_SOURCE_DIR@/docs/header.html\"\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            = \"@GLFW_SOURCE_DIR@/docs/footer.html\"\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If left blank doxygen will\n# generate a default style sheet. Note that it is recommended to use\n# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this\n# tag will in the future become obsolete.\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional\n# user-defined cascading style sheet that is included after the standard\n# style sheets created by doxygen. Using this option one can overrule\n# certain style aspects. This is preferred over using HTML_STYLESHEET\n# since it does not replace the standard style sheet and is therefor more\n# robust against future updates. Doxygen will copy the style sheet file to\n# the output directory.\n\nHTML_EXTRA_STYLESHEET  = \"@GLFW_SOURCE_DIR@/docs/extra.css\"\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that\n# the files will be copied as-is; there are no commands or markers available.\n\nHTML_EXTRA_FILES       = \"@GLFW_SOURCE_DIR@/docs/spaces.svg\"\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n# Doxygen will adjust the colors in the style sheet and background images\n# according to this color. Hue is specified as an angle on a colorwheel,\n# see http://en.wikipedia.org/wiki/Hue for more information.\n# For instance the value 0 represents red, 60 is yellow, 120 is green,\n# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n# The allowed range is 0 to 359.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n# the colors in the HTML output. For a value of 0 the output will use\n# grayscales only. A value of 255 will produce the most vivid colors.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n# the luminance component of the colors in the HTML output. Values below\n# 100 gradually make the output lighter, whereas values above 100 make\n# the output darker. The value divided by 100 is the actual gamma applied,\n# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n# and 100 does not change the gamma.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting\n# this to NO can help when comparing the output of multiple runs.\n\nHTML_TIMESTAMP         = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of\n# entries shown in the various tree structured indices initially; the user\n# can expand and collapse entries dynamically later on. Doxygen will expand\n# the tree to such a level that at most the specified number of entries are\n# visible (unless a fully collapsed tree already exceeds this amount).\n# So setting the number of entries 1 will produce a full collapsed tree by\n# default. 0 is a special value representing an infinite number of entries\n# and will result in a full expanded tree by default.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files\n# will be generated that can be used as input for Apple's Xcode 3\n# integrated development environment, introduced with OSX 10.5 (Leopard).\n# To create a documentation set, doxygen will generate a Makefile in the\n# HTML output directory. Running make will produce the docset in that\n# directory and running \"make install\" will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n# it at startup.\n# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n\nGENERATE_DOCSET        = NO\n\n# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n# feed. A documentation feed provides an umbrella under which multiple\n# documentation sets from a single provider (such as a company or product suite)\n# can be grouped.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n# should uniquely identify the documentation set bundle. This should be a\n# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n# will append .docset to the name.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely\n# identify the documentation publisher. This should be a reverse domain-name\n# style string, e.g. com.mycompany.MyDocSet.documentation.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n# be used to specify the file name of the resulting .chm file. You\n# can add a path in front of the file if the result should not be\n# written to the html output directory.\n\nCHM_FILE               =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n# be used to specify the location (absolute path including file name) of\n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n# is used to encode HtmlHelp index (hhk), content (hhc) and project file\n# content.\n\nCHM_INDEX_ENCODING     =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members\n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n# that can be used as input for Qt's qhelpgenerator to generate a\n# Qt Compressed Help (.qch) of the generated HTML documentation.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n# be used to specify the file name of the resulting .qch file.\n# The path specified is relative to the HTML output folder.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#namespace\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#virtual-folders\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n# add. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#custom-filters\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">\n# Qt Help Project / Custom Filters</a>.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's\n# filter section matches.\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">\n# Qt Help Project / Filter Attributes</a>.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n# be used to specify the location of Qt's qhelpgenerator.\n# If non-empty doxygen will try to run qhelpgenerator on the generated\n# .qhp file.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n#  will be generated, which together with the HTML files, form an Eclipse help\n# plugin. To install this plugin and make it available under the help contents\n# menu in Eclipse, the contents of the directory containing the HTML and XML\n# files needs to be copied into the plugins directory of eclipse. The name of\n# the directory within the plugins directory should be the same as\n# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n# the help appears.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have\n# this name.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)\n# at top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it. Since the tabs have the same information as the\n# navigation tree you can set this option to NO if you already set\n# GENERATE_TREEVIEW to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information.\n# If the tag value is set to YES, a side panel will be generated\n# containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n# Windows users are probably better off using the HTML help feature.\n# Since the tree basically has the same information as the tab index you\n# could consider to set DISABLE_INDEX to NO when enabling this option.\n\nGENERATE_TREEVIEW      = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n# (range [0,1..20]) that doxygen will group on one line in the generated HTML\n# documentation. Note that a value of 0 will completely suppress the enum\n# values from appearing in the overview section.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 300\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n# links to external symbols imported via tag files in a separate window.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of Latex formulas included\n# as images in the HTML documentation. The default is 10. Note that\n# when you change the font size after a successful doxygen run you need\n# to manually remove any form_*.png images from the HTML output directory\n# to force them to be regenerated.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are\n# not supported properly for IE 6.0, but are supported on all modern browsers.\n# Note that when changing this option you need to delete any form_*.png files\n# in the HTML output before the changes have effect.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n# (see http://www.mathjax.org) which uses client side Javascript for the\n# rendering instead of using prerendered bitmaps. Use this if you do not\n# have LaTeX installed or if you want to formulas look prettier in the HTML\n# output. When enabled you may also need to install MathJax separately and\n# configure the path to it using the MATHJAX_RELPATH option.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and\n# SVG. The default value is HTML-CSS, which is slower, but has the best\n# compatibility.\n\nMATHJAX_FORMAT         = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the\n# HTML output directory using the MATHJAX_RELPATH option. The destination\n# directory should contain the MathJax.js script. For instance, if the mathjax\n# directory is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to\n# the MathJax Content Delivery Network so you can quickly see the result without\n# installing MathJax.\n# However, it is strongly recommended to install a local\n# copy of MathJax from http://www.mathjax.org before deployment.\n\nMATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\n# names that should be enabled during MathJax rendering.\n\nMATHJAX_EXTENSIONS     =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box\n# for the HTML output. The underlying search engine uses javascript\n# and DHTML and should work on any modern browser. Note that when using\n# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n# (GENERATE_DOCSET) there is already a search function so this one should\n# typically be disabled. For large projects the javascript based search engine\n# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a web server instead of a web client using Javascript.\n# There are two flavours of web server based search depending on the\n# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for\n# searching and an index file used by the script. When EXTERNAL_SEARCH is\n# enabled the indexing and searching needs to be provided by external tools.\n# See the manual for details.\n\nSERVER_BASED_SEARCH    = NO\n\n# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP\n# script for searching. Instead the search results are written to an XML file\n# which needs to be processed by an external indexer. Doxygen will invoke an\n# external search engine pointed to by the SEARCHENGINE_URL option to obtain\n# the search results. Doxygen ships with an example indexer (doxyindexer) and\n# search engine (doxysearch.cgi) which are based on the open source search engine\n# library Xapian. See the manual for configuration details.\n\nEXTERNAL_SEARCH        = NO\n\n# The SEARCHENGINE_URL should point to a search engine hosted by a web server\n# which will returned the search results when EXTERNAL_SEARCH is enabled.\n# Doxygen ships with an example search engine (doxysearch) which is based on\n# the open source search engine library Xapian. See the manual for configuration\n# details.\n\nSEARCHENGINE_URL       =\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n# search data is written to a file for indexing by an external tool. With the\n# SEARCHDATA_FILE tag the name of this file can be specified.\n\nSEARCHDATA_FILE        = searchdata.xml\n\n# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the\n# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n# projects and redirect the results back to the right project.\n\nEXTERNAL_SEARCH_ID     =\n\n# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n# projects other than the one defined by this configuration file, but that are\n# all added to the same external search index. Each project needs to have a\n# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id\n# of to a relative location where the documentation can be found.\n# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...\n\nEXTRA_SEARCH_MAPPINGS  =\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked. If left blank `latex' will be used as the default command name.\n# Note that when enabling USE_PDFLATEX this option is only used for\n# generating bitmaps for formulas in the HTML output, but not in the\n# Makefile that is written to the output directory.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n# generate index for LaTeX. If left blank `makeindex' will be used as the\n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, letter, legal and\n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n# the generated latex document. The footer should contain everything after\n# the last chapter. If it is left blank doxygen will generate a\n# standard footer. Notice: only use this tag if you know what you are doing!\n\nLATEX_FOOTER           =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not\n# include the index chapters (such as File Index, Compound Index, etc.)\n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n# If LATEX_SOURCE_CODE is set to YES then doxygen will include\n# source code with syntax highlighting in the LaTeX output.\n# Note that which sources are shown also depends on other settings\n# such as SOURCE_BROWSER.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. The default style is \"plain\". See\n# http://en.wikipedia.org/wiki/BibTeX for more info.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimized for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using WORD or other\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load style sheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n# then it will generate one additional man file for each entity\n# documented in the real man page(s). These additional files\n# only source the real man page, but without them the man command\n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will\n# generate an XML file that captures the structure of\n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n# dump the program listings (including syntax highlighting\n# and cross-referencing information) to the XML output. Note that\n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n# generate an AutoGen Definitions (see autogen.sf.net) file\n# that captures the structure of the code including all\n# documentation. Note that this feature is still experimental\n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will\n# generate a Perl module file that captures the structure of\n# the code including all documentation. Note that this\n# feature is still experimental and incomplete at the\n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n# the necessary Makefile rules, Perl scripts and LaTeX code to be able\n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n# nicely formatted so it can be parsed by a human reader.\n# This is useful\n# if you want to understand what is going on.\n# On the other hand, if this\n# tag is set to NO the size of the Perl module output will be much smaller\n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file\n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n# This is useful so different doxyrules.make files included by the same\n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = YES\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = YES\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# pointed to by INCLUDE_PATH will be searched when a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed. To prevent a macro definition from being\n# undefined via #undef or recursively expanded use the := operator\n# instead of the = operator.\n\nPREDEFINED             = GLFWAPI=                   \\\n                         GLFW_EXPOSE_NATIVE_WIN32   \\\n                         GLFW_EXPOSE_NATIVE_WGL     \\\n                         GLFW_EXPOSE_NATIVE_X11     \\\n                         GLFW_EXPOSE_NATIVE_WAYLAND \\\n                         GLFW_EXPOSE_NATIVE_MIR     \\\n                         GLFW_EXPOSE_NATIVE_GLX     \\\n                         GLFW_EXPOSE_NATIVE_COCOA   \\\n                         GLFW_EXPOSE_NATIVE_NSGL    \\\n                         GLFW_EXPOSE_NATIVE_EGL     \\\n                         GLFW_EXPOSE_NATIVE_OSMESA  \\\n                         VK_VERSION_1_0\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition that\n# overrules the definition found in the source code.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n# doxygen's preprocessor will remove all references to function-like macros\n# that are alone on a line, have an all uppercase name, and do not end with a\n# semicolon, because these will confuse the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. For each\n# tag file the location of the external documentation should be added. The\n# format of a tag file without this location is as follows:\n#\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n#\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where \"loc1\" and \"loc2\" can be relative or absolute paths\n# or URLs. Note that each tag file must have a unique name (where the name does\n# NOT include the path). If a tag file is not located in the directory in which\n# doxygen is run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will\n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n# or super classes. Setting the tag to NO turns the diagrams off. Note that\n# this option also works with HAVE_DOT disabled, but it is recommended to\n# install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see\n# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# If set to YES, the inheritance and collaboration graphs will hide\n# inheritance and usage relations if the target is undocumented\n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = NO\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n# allowed to run in parallel. When set to 0 (the default) doxygen will\n# base this on the number of processors available in the system. You can set it\n# explicitly to a value larger than 0 to get control over the balance\n# between CPU load and processing speed.\n\nDOT_NUM_THREADS        = 0\n\n# By default doxygen will use the Helvetica font for all dot files that\n# doxygen generates. When you want a differently looking font you can specify\n# the font name using DOT_FONTNAME. You need to make sure dot is able to find\n# the font, which can be done by putting it in a standard location or by setting\n# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n# directory containing the font.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n# The default size is 10pt.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the Helvetica font.\n# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\n# set the path where dot can find it.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside\n# the class node. If there are many fields or methods and many nodes the\n# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n# threshold limits the number of items for each type to make the size more\n# managable. Set this to 0 for no limit. Note that the threshold may be\n# exceeded by 50% before the limit is enforced.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If set to YES, the inheritance and collaboration graphs will show the\n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n# tags are set to YES then doxygen will generate a graph for each documented\n# file showing the direct and indirect include dependencies of the file with\n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n# documented header file showing the documented files that directly or\n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH and HAVE_DOT options are set to YES then\n# doxygen will generate a call dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable call graphs\n# for selected functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n# doxygen will generate a caller dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable caller\n# graphs for selected functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will generate a graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES\n# then doxygen will show the dependencies a directory has on other directories\n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. Possible values are svg, png, jpg, or gif.\n# If left blank png will be used. If you choose svg you need to set\n# HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible in IE 9+ (other browsers do not have this requirement).\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n# Note that this requires a modern browser other than Internet Explorer.\n# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\n# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible. Older versions of IE do not have SVG support.\n\nINTERACTIVE_SVG        = NO\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the\n# \\dotfile command).\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the\n# \\mscfile command).\n\nMSCFILE_DIRS           =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n# nodes that will be shown in the graph. If the number of nodes in a graph\n# becomes larger than this value, doxygen will truncate the graph, which is\n# visualized by representing a node as a red box. Note that doxygen if the\n# number of direct children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n# graphs generated by dot. A depth value of 3 means that only nodes reachable\n# from the root by following a path via at most 3 edges will be shown. Nodes\n# that lay further from the root node will be omitted. Note that setting this\n# option to 1 or 2 may greatly reduce the computation time needed for large\n# code bases. Also note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not\n# seem to support this out of the box. Warning: Depending on the platform used,\n# enabling this option may lead to badly anti-aliased labels on the edges of\n# a graph (i.e. they become hard to read).\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10)\n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermediate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "external/GLFW/docs/DoxygenLayout.xml",
    "content": "<doxygenlayout version=\"1.0\">\n  <!-- Generated by doxygen 1.8.3.1 -->\n  <!-- Navigation index tabs for HTML output -->\n  <navindex>\n    <tab type=\"mainpage\" visible=\"yes\" title=\"Introduction\"/>\n    <tab type=\"pages\" visible=\"yes\" title=\"Guides\" intro=\"\"/>\n    <tab type=\"modules\" visible=\"yes\" title=\"Reference\" intro=\"\"/>\n    <tab type=\"namespaces\" visible=\"yes\" title=\"\">\n      <tab type=\"namespacelist\" visible=\"yes\" title=\"\" intro=\"\"/>\n      <tab type=\"namespacemembers\" visible=\"yes\" title=\"\" intro=\"\"/>\n    </tab>\n    <tab type=\"classes\" visible=\"no\" title=\"\">\n      <tab type=\"classlist\" visible=\"yes\" title=\"\" intro=\"\"/>\n      <tab type=\"classindex\" visible=\"$ALPHABETICAL_INDEX\" title=\"\"/> \n      <tab type=\"hierarchy\" visible=\"yes\" title=\"\" intro=\"\"/>\n      <tab type=\"classmembers\" visible=\"yes\" title=\"\" intro=\"\"/>\n    </tab>\n    <tab type=\"files\" visible=\"yes\" title=\"Header Files\">\n      <tab type=\"filelist\" visible=\"yes\" title=\"\" intro=\"\"/>\n      <tab type=\"globals\" visible=\"yes\" title=\"\" intro=\"\"/>\n    </tab>\n    <tab type=\"examples\" visible=\"yes\" title=\"\" intro=\"\"/>  \n  </navindex>\n\n  <!-- Layout definition for a class page -->\n  <class>\n    <briefdescription visible=\"yes\"/>\n    <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n    <inheritancegraph visible=\"$CLASS_GRAPH\"/>\n    <collaborationgraph visible=\"$COLLABORATION_GRAPH\"/>\n    <memberdecl>\n      <nestedclasses visible=\"yes\" title=\"\"/>\n      <publictypes title=\"\"/>\n      <publicslots title=\"\"/>\n      <signals title=\"\"/>\n      <publicmethods title=\"\"/>\n      <publicstaticmethods title=\"\"/>\n      <publicattributes title=\"\"/>\n      <publicstaticattributes title=\"\"/>\n      <protectedtypes title=\"\"/>\n      <protectedslots title=\"\"/>\n      <protectedmethods title=\"\"/>\n      <protectedstaticmethods title=\"\"/>\n      <protectedattributes title=\"\"/>\n      <protectedstaticattributes title=\"\"/>\n      <packagetypes title=\"\"/>\n      <packagemethods title=\"\"/>\n      <packagestaticmethods title=\"\"/>\n      <packageattributes title=\"\"/>\n      <packagestaticattributes title=\"\"/>\n      <properties title=\"\"/>\n      <events title=\"\"/>\n      <privatetypes title=\"\"/>\n      <privateslots title=\"\"/>\n      <privatemethods title=\"\"/>\n      <privatestaticmethods title=\"\"/>\n      <privateattributes title=\"\"/>\n      <privatestaticattributes title=\"\"/>\n      <friends title=\"\"/>\n      <related title=\"\" subtitle=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <constructors title=\"\"/>\n      <functions title=\"\"/>\n      <related title=\"\"/>\n      <variables title=\"\"/>\n      <properties title=\"\"/>\n      <events title=\"\"/>\n    </memberdef>\n    <allmemberslink visible=\"yes\"/>\n    <usedfiles visible=\"$SHOW_USED_FILES\"/>\n    <authorsection visible=\"yes\"/>\n  </class>\n\n  <!-- Layout definition for a namespace page -->\n  <namespace>\n    <briefdescription visible=\"yes\"/>\n    <memberdecl>\n      <nestednamespaces visible=\"yes\" title=\"\"/>\n      <classes visible=\"yes\" title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n    </memberdef>\n    <authorsection visible=\"yes\"/>\n  </namespace>\n\n  <!-- Layout definition for a file page -->\n  <file>\n    <briefdescription visible=\"yes\"/>\n    <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n    <includegraph visible=\"$INCLUDE_GRAPH\"/>\n    <includedbygraph visible=\"$INCLUDED_BY_GRAPH\"/>\n    <sourcelink visible=\"yes\"/>\n    <memberdecl>\n      <classes visible=\"yes\" title=\"\"/>\n      <namespaces visible=\"yes\" title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n    <memberdef>\n      <inlineclasses title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n    </memberdef>\n    <authorsection/>\n  </file>\n\n  <!-- Layout definition for a group page -->\n  <group>\n    <briefdescription visible=\"yes\"/>\n    <detaileddescription title=\"Description\"/>\n    <groupgraph visible=\"$GROUP_GRAPHS\"/>\n    <memberdecl>\n      <nestedgroups visible=\"yes\" title=\"\"/>\n      <dirs visible=\"yes\" title=\"\"/>\n      <files visible=\"yes\" title=\"\"/>\n      <namespaces visible=\"yes\" title=\"\"/>\n      <classes visible=\"yes\" title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <enumvalues title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <signals title=\"\"/>\n      <publicslots title=\"\"/>\n      <protectedslots title=\"\"/>\n      <privateslots title=\"\"/>\n      <events title=\"\"/>\n      <properties title=\"\"/>\n      <friends title=\"\"/>\n      <membergroups visible=\"yes\"/>\n    </memberdecl>\n    <memberdef>\n      <pagedocs/>\n      <inlineclasses title=\"\"/>\n      <defines title=\"\"/>\n      <typedefs title=\"\"/>\n      <enums title=\"\"/>\n      <enumvalues title=\"\"/>\n      <functions title=\"\"/>\n      <variables title=\"\"/>\n      <signals title=\"\"/>\n      <publicslots title=\"\"/>\n      <protectedslots title=\"\"/>\n      <privateslots title=\"\"/>\n      <events title=\"\"/>\n      <properties title=\"\"/>\n      <friends title=\"\"/>\n    </memberdef>\n    <authorsection visible=\"yes\"/>\n  </group>\n\n  <!-- Layout definition for a directory page -->\n  <directory>\n    <briefdescription visible=\"yes\"/>\n    <directorygraph visible=\"yes\"/>\n    <memberdecl>\n      <dirs visible=\"yes\"/>\n      <files visible=\"yes\"/>\n    </memberdecl>\n    <detaileddescription title=\"\"/>\n  </directory>\n</doxygenlayout>\n"
  },
  {
    "path": "external/GLFW/docs/build.dox",
    "content": "/*!\n\n@page build_guide Building applications\n\n@tableofcontents\n\nThis is about compiling and linking applications that use GLFW.  For information on\nhow to write such applications, start with the\n[introductory tutorial](@ref quick_guide).  For information on how to compile\nthe GLFW library itself, see @ref compile_guide.\n\nThis is not a tutorial on compilation or linking.  It assumes basic\nunderstanding of how to compile and link a C program as well as how to use the\nspecific compiler of your chosen development environment.  The compilation\nand linking process should be explained in your C programming material and in\nthe documentation for your development environment.\n\n\n@section build_include Including the GLFW header file\n\nYou should include the GLFW header in the source files where you use OpenGL or\nGLFW.\n\n@code\n#include <GLFW/glfw3.h>\n@endcode\n\nThis header declares the GLFW API and by default also includes the OpenGL header\nfrom your development environment.  See below for how to control this.\n\nThe GLFW header also defines any platform-specific macros needed by your OpenGL\nheader, so it can be included without needing any window system headers.\n\nFor example, under Windows you are normally required to include `windows.h`\nbefore the OpenGL header, which would bring in the whole Win32 API.  The GLFW\nheader duplicates the small number of macros needed.\n\nIt does this only when needed, so if `windows.h` _is_ included, the GLFW header\ndoes not try to redefine those symbols.  The reverse is not true, i.e.\n`windows.h` cannot cope if any of its symbols have already been defined.\n\nIn other words:\n\n - Do _not_ include the OpenGL headers yourself, as GLFW does this for you\n - Do _not_ include `windows.h` or other platform-specific headers unless you\n   plan on using those APIs directly\n - If you _do_ need to include such headers, do it _before_ including\n   the GLFW header and it will handle this\n\nIf you are using an OpenGL extension loading library such as\n[glad](https://github.com/Dav1dde/glad), the extension loader header should\nbe included _before_ the GLFW one.\n\n@code\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n@endcode\n\nAlternatively the @ref GLFW_INCLUDE_NONE macro (described below) can be used to\nprevent the GLFW header from including the OpenGL header.\n\n@code\n#define GLFW_INCLUDE_NONE\n#include <GLFW/glfw3.h>\n#include <glad/glad.h>\n@endcode\n\n\n@subsection build_macros GLFW header option macros\n\nThese macros may be defined before the inclusion of the GLFW header and affect\nits behavior.\n\n@anchor GLFW_DLL\n__GLFW_DLL__ is required on Windows when using the GLFW DLL, to tell the\ncompiler that the GLFW functions are defined in a DLL.\n\nThe following macros control which OpenGL or OpenGL ES API header is included.\nOnly one of these may be defined at a time.\n\n@anchor GLFW_INCLUDE_GLCOREARB\n__GLFW_INCLUDE_GLCOREARB__ makes the GLFW header include the modern\n`GL/glcorearb.h` header (`OpenGL/gl3.h` on macOS) instead of the regular OpenGL\nheader.\n\n@anchor GLFW_INCLUDE_ES1\n__GLFW_INCLUDE_ES1__ makes the GLFW header include the OpenGL ES 1.x `GLES/gl.h`\nheader instead of the regular OpenGL header.\n\n@anchor GLFW_INCLUDE_ES2\n__GLFW_INCLUDE_ES2__ makes the GLFW header include the OpenGL ES 2.0\n`GLES2/gl2.h` header instead of the regular OpenGL header.\n\n@anchor GLFW_INCLUDE_ES3\n__GLFW_INCLUDE_ES3__ makes the GLFW header include the OpenGL ES 3.0\n`GLES3/gl3.h` header instead of the regular OpenGL header.\n\n@anchor GLFW_INCLUDE_ES31\n__GLFW_INCLUDE_ES31__ makes the GLFW header include the OpenGL ES 3.1\n`GLES3/gl31.h` header instead of the regular OpenGL header.\n\n@anchor GLFW_INCLUDE_ES32\n__GLFW_INCLUDE_ES31__ makes the GLFW header include the OpenGL ES 3.2\n`GLES3/gl32.h` header instead of the regular OpenGL header.\n\n@anchor GLFW_INCLUDE_NONE\n__GLFW_INCLUDE_NONE__ makes the GLFW header not include any OpenGL or OpenGL ES\nAPI header.  This is useful in combination with an extension loading library.\n\nIf none of the above inclusion macros are defined, the standard OpenGL `GL/gl.h`\nheader (`OpenGL/gl.h` on macOS) is included.\n\nThe following macros control the inclusion of additional API headers.  Any\nnumber of these may be defined simultaneously, and/or together with one of the\nabove macros.\n\n@anchor GLFW_INCLUDE_VULKAN\n__GLFW_INCLUDE_VULKAN__ makes the GLFW header include the Vulkan\n`vulkan/vulkan.h` header in addition to any selected OpenGL or OpenGL ES header.\n\n@anchor GLFW_INCLUDE_GLEXT\n__GLFW_INCLUDE_GLEXT__ makes the GLFW header include the appropriate extension\nheader for the OpenGL or OpenGL ES header selected above after and in addition\nto that header.\n\n@anchor GLFW_INCLUDE_GLU\n__GLFW_INCLUDE_GLU__ makes the header include the GLU header in addition to the\nheader selected above.  This should only be used with the standard OpenGL header\nand only for compatibility with legacy code.  GLU has been deprecated and should\nnot be used in new code.\n\n@note GLFW does not provide any of the API headers mentioned above.  They must\nbe provided by your development environment or your OpenGL, OpenGL ES or Vulkan\nSDK.\n\n@note None of these macros may be defined during the compilation of GLFW itself.\nIf your build includes GLFW and you define any these in your build files, make\nsure they are not applied to the GLFW sources.\n\n\n@section build_link Link with the right libraries\n\nGLFW is essentially a wrapper of various platform-specific APIs and therefore\nneeds to link against many different system libraries.  If you are using GLFW as\na shared library / dynamic library / DLL then it takes care of these links.\nHowever, if you are using GLFW as a static library then your executable will\nneed to link against these libraries.\n\nOn Windows and macOS, the list of system libraries is static and can be\nhard-coded into your build environment.  See the section for your development\nenvironment below.  On Linux and other Unix-like operating systems, the list\nvaries but can be retrieved in various ways as described below.\n\nA good general introduction to linking is\n[Beginner's Guide to Linkers](http://www.lurklurk.org/linkers/linkers.html) by\nDavid Drysdale.\n\n\n@subsection build_link_win32 With MinGW or Visual C++ on Windows\n\nThe static version of the GLFW library is named `glfw3`.  When using this\nversion, it is also necessary to link with some libraries that GLFW uses.\n\nWhen linking an application under Windows that uses the static version of GLFW,\nyou must link with `opengl32`.  On some versions of MinGW, you must also\nexplicitly link with `gdi32`, while other versions of MinGW include it in the\nset of default libraries along with other dependencies like `user32` and\n`kernel32`.  If you are using GLU, you must also link with `glu32`.\n\nThe link library for the GLFW DLL is named `glfw3dll`.  When compiling an\napplication that uses the DLL version of GLFW, you need to define the @ref\nGLFW_DLL macro _before_ any inclusion of the GLFW header.  This can be done\neither with a compiler switch or by defining it in your source code.\n\nAn application using the GLFW DLL does not need to link against any of its\ndependencies, but you still have to link against `opengl32` if your application\nuses OpenGL and `glu32` if it uses GLU.\n\n\n@subsection build_link_cmake_source With CMake and GLFW source\n\nThis section is about using CMake to compile and link GLFW along with your\napplication.  If you want to use an installed binary instead, see @ref\nbuild_link_cmake_package.\n\nWith a few changes to your `CMakeLists.txt` you can have the GLFW source tree\nbuilt along with your application.\n\nWhen including GLFW as part of your build, you probably don't want to build the\nGLFW tests, examples and documentation.  To disable these, set the corresponding\ncache variables before adding the GLFW source tree.\n\n@code\nset(GLFW_BUILD_DOCS OFF CACHE BOOL \"\" FORCE)\nset(GLFW_BUILD_TESTS OFF CACHE BOOL \"\" FORCE)\nset(GLFW_BUILD_EXAMPLES OFF CACHE BOOL \"\" FORCE)\n@endcode\n\nThen add the root directory of the GLFW source tree to your project.  This\nwill add the `glfw` target and the necessary cache variables to your project.\n\n@code{.cmake}\nadd_subdirectory(path/to/glfw)\n@endcode\n\nOnce GLFW has been added to the project, link against it with the `glfw` target.\nThis adds all link-time dependencies of GLFW as it is currently configured,\nthe include directory for the GLFW header and, when applicable, the @ref\nGLFW_DLL macro.\n\n@code{.cmake}\ntarget_link_libraries(myapp glfw)\n@endcode\n\nNote that the dependencies do not include OpenGL or GLU, as GLFW loads any\nOpenGL, OpenGL ES or Vulkan libraries it needs at runtime and does not use GLU.\nIf your application calls OpenGL directly, instead of using a modern\n[extension loader library](@ref context_glext_auto) you can find it by requiring\nthe OpenGL package.\n\n@code{.cmake}\nfind_package(OpenGL REQUIRED)\n@endcode\n\nIf OpenGL is found, the `OPENGL_FOUND` variable is true and the\n`OPENGL_INCLUDE_DIR` and `OPENGL_gl_LIBRARY` cache variables can be used.\n\n@code{.cmake}\ntarget_include_directories(myapp ${OPENGL_INCLUDE_DIR})\ntarget_link_libraries(myapp ${OPENGL_gl_LIBRARY})\n@endcode\n\nThe OpenGL CMake package also looks for GLU.  If GLU is found, the\n`OPENGL_GLU_FOUND` variable is true and the `OPENGL_INCLUDE_DIR` and\n`OPENGL_glu_LIBRARY` cache variables can be used.\n\n@code{.cmake}\ntarget_link_libraries(myapp ${OPENGL_glu_LIBRARY})\n@endcode\n\n@note GLU has been deprecated and should not be used in new code, but some\nlegacy code requires it.  See the [section on GLU](@ref moving_glu) in the\ntransition guide for suggested replacements.\n\n\n@subsection build_link_cmake_package With CMake and installed GLFW binaries\n\nThis section is about using CMake to link GLFW after it has been built and\ninstalled.  If you want to build it along with your application instead, see\n@ref build_link_cmake_source.\n\nWith a few changes to your `CMakeLists.txt` you can locate the package and\ntarget files generated when GLFW is installed.\n\n@code{.cmake}\nfind_package(glfw3 3.3 REQUIRED)\n@endcode\n\nOnce GLFW has been added to the project, link against it with the `glfw` target.\nThis adds all link-time dependencies of GLFW as it is currently configured,\nthe include directory for the GLFW header and, when applicable, the @ref\nGLFW_DLL macro.\n\n@code{.cmake}\ntarget_link_libraries(myapp glfw)\n@endcode\n\nNote that the dependencies do not include OpenGL or GLU, as GLFW loads any\nOpenGL, OpenGL ES or Vulkan libraries it needs at runtime and does not use GLU.\nIf your application calls OpenGL directly, instead of using a modern\n[extension loader library](@ref context_glext_auto) you can find it by requiring\nthe OpenGL package.\n\n@code{.cmake}\nfind_package(OpenGL REQUIRED)\n@endcode\n\nIf OpenGL is found, the `OPENGL_FOUND` variable is true and the\n`OPENGL_INCLUDE_DIR` and `OPENGL_gl_LIBRARY` cache variables can be used.\n\n@code{.cmake}\ntarget_include_directories(myapp ${OPENGL_INCLUDE_DIR})\ntarget_link_libraries(myapp ${OPENGL_gl_LIBRARY})\n@endcode\n\nThe OpenGL CMake package also looks for GLU.  If GLU is found, the\n`OPENGL_GLU_FOUND` variable is true and the `OPENGL_INCLUDE_DIR` and\n`OPENGL_glu_LIBRARY` cache variables can be used.\n\n@code{.cmake}\ntarget_link_libraries(myapp ${OPENGL_glu_LIBRARY})\n@endcode\n\n@note GLU has been deprecated and should not be used in new code, but some\nlegacy code requires it.  See the [section on GLU](@ref moving_glu) in the\ntransition guide for suggested replacements.\n\n\n@subsection build_link_pkgconfig With makefiles and pkg-config on Unix\n\nGLFW supports [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config/),\nand the `glfw3.pc` pkg-config file is generated when the GLFW library is built\nand is installed along with it.  A pkg-config file describes all necessary\ncompile-time and link-time flags and dependencies needed to use a library.  When\nthey are updated or if they differ between systems, you will get the correct\nones automatically.\n\nA typical compile and link command-line when using the static version of the\nGLFW library may look like this:\n\n@code{.sh}\ncc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --static --libs glfw3`\n@endcode\n\nIf you are using the shared version of the GLFW library, omit the `--static`\nflag.\n\n@code{.sh}\ncc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --libs glfw3`\n@endcode\n\nYou can also use the `glfw3.pc` file without installing it first, by using the\n`PKG_CONFIG_PATH` environment variable.\n\n@code{.sh}\nenv PKG_CONFIG_PATH=path/to/glfw/src cc `pkg-config --cflags glfw3` -o myprog myprog.c `pkg-config --libs glfw3`\n@endcode\n\nThe dependencies do not include OpenGL or GLU, as GLFW loads any OpenGL, OpenGL\nES or Vulkan libraries it needs at runtime and does not use GLU.  On macOS, GLU\nis built into the OpenGL framework, so if you need GLU you don't need to do\nanything extra.  If you need GLU and are using Linux or BSD, you should add the\n`glu` pkg-config package.\n\n@code{.sh}\ncc `pkg-config --cflags glfw3 glu` -o myprog myprog.c `pkg-config --libs glfw3 glu`\n@endcode\n\n@note GLU has been deprecated and should not be used in new code, but some\nlegacy code requires it.  See the [section on GLU](@ref moving_glu) in the\ntransition guide for suggested replacements.\n\nIf you are using the static version of the GLFW library, make sure you don't\nlink statically against GLU.\n\n@code{.sh}\ncc `pkg-config --cflags glfw3 glu` -o myprog myprog.c `pkg-config --static --libs glfw3` `pkg-config --libs glu`\n@endcode\n\n\n@subsection build_link_xcode With Xcode on macOS\n\nIf you are using the dynamic library version of GLFW, add it to the project\ndependencies.\n\nIf you are using the static library version of GLFW, add it and the Cocoa,\nOpenGL, IOKit and CoreVideo frameworks to the project as dependencies.  They can\nall be found in `/System/Library/Frameworks`.\n\n\n@subsection build_link_osx With command-line on macOS\n\nIt is recommended that you use [pkg-config](@ref build_link_pkgconfig) when\nbuilding from the command line on macOS.  That way you will get any new\ndependencies added automatically.  If you still wish to build manually, you need\nto add the required frameworks and libraries to your command-line yourself using\nthe `-l` and `-framework` switches.\n\nIf you are using the dynamic GLFW library, which is named `libglfw.3.dylib`, do:\n\n@code{.sh}\ncc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo\n@endcode\n\nIf you are using the static library, named `libglfw3.a`, substitute `-lglfw3`\nfor `-lglfw`.\n\nNote that you do not add the `.framework` extension to a framework when linking\nagainst it from the command-line.\n\nThe OpenGL framework contains both the OpenGL and GLU APIs, so there is nothing\nspecial to do when using GLU.  Also note that even though your machine may have\n`libGL`-style OpenGL libraries, they are for use with the X Window System and\nwill _not_ work with the macOS native version of GLFW.\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/compat.dox",
    "content": "/*!\n\n@page compat_guide Standards conformance\n\n@tableofcontents\n\nThis guide describes the various API extensions used by this version of GLFW.\nIt lists what are essentially implementation details, but which are nonetheless\nvital knowledge for developers intending to deploy their applications on a wide\nrange of machines.\n\nThe information in this guide is not a part of GLFW API, but merely\npreconditions for some parts of the library to function on a given machine.  Any\npart of this information may change in future versions of GLFW and that will not\nbe considered a breaking API change.\n\n\n@section compat_x11 X11 extensions, protocols and IPC standards\n\nAs GLFW uses Xlib directly, without any intervening toolkit\nlibrary, it has sole responsibility for interacting well with the many and\nvaried window managers in use on Unix-like systems.  In order for applications\nand window managers to work well together, a number of standards and\nconventions have been developed that regulate behavior outside the scope of the\nX11 API; most importantly the\n[Inter-Client Communication Conventions Manual](http://www.tronche.com/gui/x/icccm/)\n(ICCCM) and\n[Extended Window Manager Hints](http://standards.freedesktop.org/wm-spec/wm-spec-latest.html)\n(EWMH) standards.\n\nGLFW uses the `_MOTIF_WM_HINTS` window property to support borderless windows.\nIf the running window manager does not support this property, the\n`GLFW_DECORATED` hint will have no effect.\n\nGLFW uses the ICCCM `WM_DELETE_WINDOW` protocol to intercept the user\nattempting to close the GLFW window.  If the running window manager does not\nsupport this protocol, the close callback will never be called.\n\nGLFW uses the EWMH `_NET_WM_PING` protocol, allowing the window manager notify\nthe user when the application has stopped responding, i.e. when it has ceased to\nprocess events.  If the running window manager does not support this protocol,\nthe user will not be notified if the application locks up.\n\nGLFW uses the EWMH `_NET_WM_STATE_FULLSCREEN` window state to tell the window\nmanager to make the GLFW window full screen.  If the running window manager does\nnot support this state, full screen windows may not work properly.  GLFW has\na fallback code path in case this state is unavailable, but every window manager\nbehaves slightly differently in this regard.\n\nGLFW uses the EWMH `_NET_WM_BYPASS_COMPOSITOR` window property to tell a\ncompositing window manager to un-redirect full screen GLFW windows.  If the\nrunning window manager uses compositing but does not support this property then\nadditional copying may be performed for each buffer swap of full screen windows.\n\nGLFW uses the\n[clipboard manager protocol](http://www.freedesktop.org/wiki/ClipboardManager/)\nto push a clipboard string (i.e. selection) owned by a GLFW window about to be\ndestroyed to the clipboard manager.  If there is no running clipboard manager,\nthe clipboard string will be unavailable once the window has been destroyed.\n\nGLFW uses the\n[X drag-and-drop protocol](http://www.freedesktop.org/wiki/Specifications/XDND/)\nto provide file drop events.  If the application originating the drag does not\nsupport this protocol, drag and drop will not work.\n\nGLFW uses the XRandR 1.3 extension to provide multi-monitor support.  If the\nrunning X server does not support this version of this extension, multi-monitor\nsupport will not function and only a single, desktop-spanning monitor will be\nreported.\n\nGLFW uses the XRandR 1.3 and Xf86vidmode extensions to provide gamma ramp\nsupport.  If the running X server does not support either or both of these\nextensions, gamma ramp support will not function.\n\nGLFW uses the Xkb extension and detectable auto-repeat to provide keyboard\ninput.  If the running X server does not support this extension, a non-Xkb\nfallback path is used.\n\nGLFW uses the XInput2 extension to provide raw, non-accelerated mouse motion\nwhen the cursor is disabled.  If the running X server does not support this\nextension, regular accelerated mouse motion will be used. \n\nGLFW uses both the XRender extension and the compositing manager to support\ntransparent window framebuffers.  If the running X server does not support this\nextension or there is no running compositing manager, the `GLFW_TRANSPARENT`\nframebuffer hint will have no effect.\n\n\n@section compat_glx GLX extensions\n\nThe GLX API is the default API used to create OpenGL contexts on Unix-like\nsystems using the X Window System.\n\nGLFW uses the GLX 1.3 `GLXFBConfig` functions to enumerate and select framebuffer pixel\nformats.  If GLX 1.3 is not supported, @ref glfwInit will fail.\n\nGLFW uses the `GLX_MESA_swap_control,` `GLX_EXT_swap_control` and\n`GLX_SGI_swap_control` extensions to provide vertical retrace synchronization\n(or _vsync_), in that order of preference.  Where none of these extension are\navailable, calling @ref glfwSwapInterval will have no effect.\n\nGLFW uses the `GLX_ARB_multisample` extension to create contexts with\nmultisampling anti-aliasing.  Where this extension is unavailable, the\n`GLFW_SAMPLES` hint will have no effect.\n\nGLFW uses the `GLX_ARB_create_context` extension when available, even when\ncreating OpenGL contexts of version 2.1 and below.  Where this extension is\nunavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`\nhints will only be partially supported, the `GLFW_OPENGL_DEBUG_CONTEXT` hint\nwill have no effect, and setting the `GLFW_OPENGL_PROFILE` or\n`GLFW_OPENGL_FORWARD_COMPAT` hints to `GLFW_TRUE` will cause @ref\nglfwCreateWindow to fail.\n\nGLFW uses the `GLX_ARB_create_context_profile` extension to provide support for\ncontext profiles.  Where this extension is unavailable, setting the\n`GLFW_OPENGL_PROFILE` hint to anything but `GLFW_OPENGL_ANY_PROFILE`, or setting\n`GLFW_CLIENT_API` to anything but `GLFW_OPENGL_API` or `GLFW_NO_API` will cause\n@ref glfwCreateWindow to fail.\n\nGLFW uses the `GLX_ARB_context_flush_control` extension to provide control over\nwhether a context is flushed when it is released (made non-current).  Where this\nextension is unavailable, the `GLFW_CONTEXT_RELEASE_BEHAVIOR` hint will have no\neffect and the context will always be flushed when released.\n\nGLFW uses the `GLX_ARB_framebuffer_sRGB` and `GLX_EXT_framebuffer_sRGB`\nextensions to provide support for sRGB framebuffers.  Where both of these\nextensions are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.\n\n\n@section compat_wgl WGL extensions\n\nThe WGL API is used to create OpenGL contexts on Microsoft Windows and other\nimplementations of the Win32 API, such as Wine.\n\nGLFW uses either the `WGL_EXT_extension_string` or the\n`WGL_ARB_extension_string` extension to check for the presence of all other WGL\nextensions listed below.  If both are available, the EXT one is preferred.  If\nneither is available, no other extensions are used and many GLFW features\nrelated to context creation will have no effect or cause errors when used.\n\nGLFW uses the `WGL_EXT_swap_control` extension to provide vertical retrace\nsynchronization (or _vsync_).  Where this extension is unavailable, calling @ref\nglfwSwapInterval will have no effect.\n\nGLFW uses the `WGL_ARB_pixel_format` and `WGL_ARB_multisample` extensions to\ncreate contexts with multisampling anti-aliasing.  Where these extensions are\nunavailable, the `GLFW_SAMPLES` hint will have no effect.\n\nGLFW uses the `WGL_ARB_create_context` extension when available, even when\ncreating OpenGL contexts of version 2.1 and below.  Where this extension is\nunavailable, the `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR`\nhints will only be partially supported, the `GLFW_OPENGL_DEBUG_CONTEXT` hint\nwill have no effect, and setting the `GLFW_OPENGL_PROFILE` or\n`GLFW_OPENGL_FORWARD_COMPAT` hints to `GLFW_TRUE` will cause @ref\nglfwCreateWindow to fail.\n\nGLFW uses the `WGL_ARB_create_context_profile` extension to provide support for\ncontext profiles.  Where this extension is unavailable, setting the\n`GLFW_OPENGL_PROFILE` hint to anything but `GLFW_OPENGL_ANY_PROFILE` will cause\n@ref glfwCreateWindow to fail.\n\nGLFW uses the `WGL_ARB_context_flush_control` extension to provide control over\nwhether a context is flushed when it is released (made non-current).  Where this\nextension is unavailable, the `GLFW_CONTEXT_RELEASE_BEHAVIOR` hint will have no\neffect and the context will always be flushed when released.\n\nGLFW uses the `WGL_ARB_framebuffer_sRGB` and `WGL_EXT_framebuffer_sRGB`\nextensions to provide support for sRGB framebuffers.  Where both of these\nextension are unavailable, the `GLFW_SRGB_CAPABLE` hint will have no effect.\n\n\n@section compat_osx OpenGL on macOS\n\nSupport for OpenGL 3.2 and above was introduced with OS X 10.7 and even then\nonly forward-compatible, core profile contexts are supported.  Support for\nOpenGL 4.1 was introduced with OS X 10.9, also limited to forward-compatible,\ncore profile contexts.  There is also still no mechanism for requesting debug\ncontexts or no-error contexts.  Versions of Mac OS X earlier than 10.7 support\nat most OpenGL version 2.1.\n\nBecause of this, on OS X 10.7 and later, the `GLFW_CONTEXT_VERSION_MAJOR` and\n`GLFW_CONTEXT_VERSION_MINOR` hints will cause @ref glfwCreateWindow to fail if\ngiven version 3.0 or 3.1.  The `GLFW_OPENGL_FORWARD_COMPAT` hint must be set to\n`GLFW_TRUE` and the `GLFW_OPENGL_PROFILE` hint must be set to\n`GLFW_OPENGL_CORE_PROFILE` when creating OpenGL 3.2 and later contexts.  The\n`GLFW_OPENGL_DEBUG_CONTEXT` and `GLFW_CONTEXT_NO_ERROR` hints are ignored.\n\nAlso, on Mac OS X 10.6 and below, the `GLFW_CONTEXT_VERSION_MAJOR` and\n`GLFW_CONTEXT_VERSION_MINOR` hints will fail if given a version above 2.1,\nsetting the `GLFW_OPENGL_PROFILE` or `GLFW_OPENGL_FORWARD_COMPAT` hints to\na non-default value will cause @ref glfwCreateWindow to fail and the\n`GLFW_OPENGL_DEBUG_CONTEXT` hint is ignored.\n\n\n@section compat_vulkan Vulkan loader and API\n\nBy default, GLFW uses the standard system-wide Vulkan loader to access the\nVulkan API on all platforms except macOS.  This is installed by both graphics\ndrivers and Vulkan SDKs.  If either the loader or at least one minimally\nfunctional ICD is missing, @ref glfwVulkanSupported will return `GLFW_FALSE` and\nall other Vulkan-related functions will fail with an @ref GLFW_API_UNAVAILABLE\nerror.\n\n\n@section compat_wsi Vulkan WSI extensions\n\nThe Vulkan WSI extensions are used to create Vulkan surfaces for GLFW windows on\nall supported platforms.\n\nGLFW uses the `VK_KHR_surface` and `VK_KHR_win32_surface` extensions to create\nsurfaces on Microsoft Windows.  If any of these extensions are not available,\n@ref glfwGetRequiredInstanceExtensions will return an empty list and window\nsurface creation will fail.\n\nGLFW uses the `VK_KHR_surface` and `VK_MVK_macos_surface` extensions to create\nsurfaces on macOS.  If any of these extensions are not available, @ref\nglfwGetRequiredInstanceExtensions will return an empty list and window surface\ncreation will fail.\n\nGLFW uses the `VK_KHR_surface` and either the `VK_KHR_xlib_surface` or\n`VK_KHR_xcb_surface` extensions to create surfaces on X11.  If `VK_KHR_surface`\nor both `VK_KHR_xlib_surface` and `VK_KHR_xcb_surface` are not available, @ref\nglfwGetRequiredInstanceExtensions will return an empty list and window surface\ncreation will fail.\n\nGLFW uses the `VK_KHR_surface` and `VK_KHR_wayland_surface` extensions to create\nsurfaces on Wayland.  If any of these extensions are not available, @ref\nglfwGetRequiredInstanceExtensions will return an empty list and window surface\ncreation will fail.\n\nGLFW uses the `VK_KHR_surface` and `VK_KHR_mir_surface` extensions to create\nsurfaces on Mir.  If any of these extensions are not available, @ref\nglfwGetRequiredInstanceExtensions will return an empty list and window surface\ncreation will fail.\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/compile.dox",
    "content": "/*!\n\n@page compile_guide Compiling GLFW\n\n@tableofcontents\n\nThis is about compiling the GLFW library itself.  For information on how to\nbuild applications that use GLFW, see @ref build_guide.\n\n\n@section compile_cmake Using CMake\n\nGLFW uses [CMake](http://www.cmake.org/) to generate project files or makefiles\nfor a particular development environment.  If you are on a Unix-like system such\nas Linux or FreeBSD or have a package system like Fink, MacPorts, Cygwin or\nHomebrew, you can install its CMake package.  If not, you can download\ninstallers for Windows and macOS from the\n[CMake website](http://www.cmake.org/).\n\n@note CMake only generates project files or makefiles.  It does not compile the\nactual GLFW library.  To compile GLFW, first generate these files for your\nchosen development environment and then use them to compile the actual GLFW\nlibrary.\n\n\n@subsection compile_deps Dependencies\n\nOnce you have installed CMake, make sure that all other dependencies are\navailable.  On some platforms, GLFW needs a few additional packages to be\ninstalled.  See the section for your chosen platform and development environment\nbelow.\n\n\n@subsubsection compile_deps_msvc Dependencies for Visual C++ on Windows\n\nThe Windows SDK bundled with Visual C++ already contains all the necessary\nheaders, link libraries and tools except for CMake.  Move on to @ref\ncompile_generate.\n\n\n@subsubsection compile_deps_mingw Dependencies for MinGW or MinGW-w64 on Windows\n\nBoth the MinGW and the MinGW-w64 packages already contain all the necessary\nheaders, link libraries and tools except for CMake.  Move on to @ref\ncompile_generate.\n\n\n@subsubsection compile_deps_mingw_cross Dependencies for MinGW or MinGW-w64 cross-compilation\n\nBoth Cygwin and many Linux distributions have MinGW or MinGW-w64 packages.  For\nexample, Cygwin has the `mingw64-i686-gcc` and `mingw64-x86_64-gcc` packages\nfor 32- and 64-bit version of MinGW-w64, while Debian GNU/Linux and derivatives\nlike Ubuntu have the `mingw-w64` package for both.\n\nGLFW has CMake toolchain files in the `CMake/` directory that allow for easy\ncross-compilation of Windows binaries.  To use these files you need to add a\nspecial parameter when generating the project files or makefiles:\n\n@code{.sh}\ncmake -DCMAKE_TOOLCHAIN_FILE=<toolchain-file> .\n@endcode\n\nThe exact toolchain file to use depends on the prefix used by the MinGW or\nMinGW-w64 binaries on your system.  You can usually see this in the /usr\ndirectory.  For example, both the Debian/Ubuntu and Cygwin MinGW-w64 packages\nhave `/usr/x86_64-w64-mingw32` for the 64-bit compilers, so the correct\ninvocation would be:\n\n@code{.sh}\ncmake -DCMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake .\n@endcode\n\nFor more details see the article\n[CMake Cross Compiling](http://www.paraview.org/Wiki/CMake_Cross_Compiling) on\nthe CMake wiki.\n\nOnce you have this set up, move on to @ref compile_generate.\n\n\n@subsubsection compile_deps_xcode Dependencies for Xcode on macOS\n\nXcode comes with all necessary tools except for CMake.  The required headers\nand libraries are included in the core macOS frameworks.  Xcode can be\ndownloaded from the Mac App Store or from the ADC Member Center.\n\nOnce you have Xcode installed, move on to @ref compile_generate.\n\n\n@subsubsection compile_deps_x11 Dependencies for Linux and X11\n\nTo compile GLFW for X11, you need to have the X11 packages installed, as well as\nthe basic development tools like GCC and make.  For example, on Ubuntu and other\ndistributions based on Debian GNU/Linux, you need to install the `xorg-dev`\npackage, which pulls in all X.org header packages.\n\nOnce you have installed the necessary packages, move on to @ref\ncompile_generate.\n\n\n@subsection compile_deps_osmesa Dependencies for Linux and OSMesa\n\nTo compile GLFW for OSMesa, you need to install the OSMesa library and header\npackages.  For example, on Ubuntu and other distributions based on Debian\nGNU/Linux, you need to install the `libosmesa6-dev` package.  The OSMesa library\nis required at runtime for context creation and is loaded on demand.\n\nOnce you have installed the necessary packages, move on to @ref\ncompile_generate.\n\n\n@subsection compile_generate Generating build files with CMake\n\nOnce you have all necessary dependencies it is time to generate the project\nfiles or makefiles for your development environment.  CMake needs to know two\npaths for this: the path to the _root_ directory of the GLFW source tree (i.e.\n_not_ the `src` subdirectory) and the target path for the generated files and\ncompiled binaries.  If these are the same, it is called an in-tree build,\notherwise it is called an out-of-tree build.\n\nOne of several advantages of out-of-tree builds is that you can generate files\nand compile for different development environments using a single source tree.\n\n@note This section is about generating the project files or makefiles necessary\nto compile the GLFW library, not about compiling the actual library.\n\n\n@subsubsection compile_generate_cli Generating files with the CMake command-line tool\n\nTo make an in-tree build, enter the _root_ directory of the GLFW source tree\n(i.e. _not_ the `src` subdirectory) and run CMake.  The current directory is\nused as target path, while the path provided as an argument is used to find the\nsource tree.\n\n@code{.sh}\ncd <glfw-root-dir>\ncmake .\n@endcode\n\nTo make an out-of-tree build, make a directory outside of the source tree, enter\nit and run CMake with the (relative or absolute) path to the root of the source\ntree as an argument.\n\n@code{.sh}\nmkdir glfw-build\ncd glfw-build\ncmake <glfw-root-dir>\n@endcode\n\nOnce you have generated the project files or makefiles for your chosen\ndevelopment environment, move on to @ref compile_compile.\n\n\n@subsubsection compile_generate_gui Generating files with the CMake GUI\n\nIf you are using the GUI version, choose the root of the GLFW source tree as\nsource location and the same directory or another, empty directory as the\ndestination for binaries.  Choose _Configure_, change any options you wish to,\n_Configure_ again to let the changes take effect and then _Generate_.\n\nOnce you have generated the project files or makefiles for your chosen\ndevelopment environment, move on to @ref compile_compile.\n\n\n@subsection compile_compile Compiling the library\n\nYou should now have all required dependencies and the project files or makefiles\nnecessary to compile GLFW.  Go ahead and compile the actual GLFW library with\nthese files, as you would with any other project.\n\nOnce the GLFW library is compiled, you are ready to build your applications,\nlinking it to the GLFW library.  See @ref build_guide for more information.\n\n\n@subsection compile_options CMake options\n\nThe CMake files for GLFW provide a number of options, although not all are\navailable on all supported platforms.  Some of these are de facto standards\namong projects using CMake and so have no `GLFW_` prefix.\n\nIf you are using the GUI version of CMake, these are listed and can be changed\nfrom there.  If you are using the command-line version of CMake you can use the\n`ccmake` ncurses GUI to set options.  Some package systems like Ubuntu and other\ndistributions based on Debian GNU/Linux have this tool in a separate\n`cmake-curses-gui` package.\n\nFinally, if you don't want to use any GUI, you can set options from the `cmake`\ncommand-line with the `-D` flag.\n\n@code{.sh}\ncmake -DBUILD_SHARED_LIBS=ON .\n@endcode\n\n\n@subsubsection compile_options_shared Shared CMake options\n\n@anchor BUILD_SHARED_LIBS\n__BUILD_SHARED_LIBS__ determines whether GLFW is built as a static\nlibrary or as a DLL / shared library / dynamic library.\n\n@anchor LIB_SUFFIX\n__LIB_SUFFIX__ affects where the GLFW shared /dynamic library is installed.  If\nit is empty, it is installed to `${CMAKE_INSTALL_PREFIX}/lib`.  If it is set to\n`64`, it is installed to `${CMAKE_INSTALL_PREFIX}/lib64`.\n\n@anchor GLFW_BUILD_EXAMPLES\n__GLFW_BUILD_EXAMPLES__ determines whether the GLFW examples are built\nalong with the library.\n\n@anchor GLFW_BUILD_TESTS\n__GLFW_BUILD_TESTS__ determines whether the GLFW test programs are\nbuilt along with the library.\n\n@anchor GLFW_BUILD_DOCS\n__GLFW_BUILD_DOCS__ determines whether the GLFW documentation is built along\nwith the library.\n\n@anchor GLFW_VULKAN_STATIC\n__GLFW_VULKAN_STATIC__ determines whether to use the Vulkan loader linked\nstatically into the application.\n\n\n@subsubsection compile_options_win32 Windows specific CMake options\n\n@anchor USE_MSVC_RUNTIME_LIBRARY_DLL\n__USE_MSVC_RUNTIME_LIBRARY_DLL__ determines whether to use the DLL version or the\nstatic library version of the Visual C++ runtime library.  If set to `ON`, the\nDLL version of the Visual C++ library is used.\n\n@anchor GLFW_USE_HYBRID_HPG\n__GLFW_USE_HYBRID_HPG__ determines whether to export the `NvOptimusEnablement` and\n`AmdPowerXpressRequestHighPerformance` symbols, which force the use of the\nhigh-performance GPU on Nvidia Optimus and AMD PowerXpress systems.  These symbols\nneed to be exported by the EXE to be detected by the driver, so the override\nwill not work if GLFW is built as a DLL.\n\n\n@section compile_manual Compiling GLFW manually\n\nIf you wish to compile GLFW without its CMake build environment then you will\nhave to do at least some of the platform detection yourself.  GLFW needs\na configuration macro to be defined in order to know what window system it's\nbeing compiled for and also has optional, platform-specific ones for various\nfeatures.\n\nWhen building with CMake, the `glfw_config.h` configuration header is generated\nbased on the current platform and CMake options.  The GLFW CMake environment\ndefines @b GLFW_USE_CONFIG_H, which causes this header to be included by\n`internal.h`.  Without this macro, GLFW will expect the necessary configuration\nmacros to be defined on the command-line.\n\nThe window creation API is used to create windows, handle input, monitors, gamma\nramps and clipboard.  The options are:\n\n - @b _GLFW_COCOA to use the Cocoa frameworks\n - @b _GLFW_WIN32 to use the Win32 API\n - @b _GLFW_X11 to use the X Window System\n - @b _GLFW_WAYLAND to use the Wayland API (experimental and incomplete)\n - @b _GLFW_MIR to use the Mir API (experimental and incomplete)\n - @b _GLFW_OSMESA to use the OSMesa API (headless and non-interactive)\n\nIf you are building GLFW as a shared library / dynamic library / DLL then you\nmust also define @b _GLFW_BUILD_DLL.  Otherwise, you must not define it.\n\nIf you are linking the Vulkan loader statically into your application then you\nmust also define @b _GLFW_VULKAN_STATIC.  Otherwise, GLFW will attempt to use the\nexternal version.\n\nIf you are using a custom name for the Vulkan, EGL, GLX, OSMesa, OpenGL, GLESv1\nor GLESv2 library, you can override the default names by defining those you need\nof @b _GLFW_VULKAN_LIBRARY, @b _GLFW_EGL_LIBRARY, @b _GLFW_GLX_LIBRARY, @b\n_GLFW_OSMESA_LIBRARY, @b _GLFW_OPENGL_LIBRARY, @b _GLFW_GLESV1_LIBRARY and @b\n_GLFW_GLESV2_LIBRARY.  Otherwise, GLFW will use the built-in default names.\n\nFor the EGL context creation API, the following options are available:\n\n - @b _GLFW_USE_EGLPLATFORM_H to use `EGL/eglplatform.h` for native handle\n   definitions (fallback)\n\n@note None of the @ref build_macros may be defined during the compilation of\nGLFW.  If you define any of these in your build files, make sure they are not\napplied to the GLFW sources.\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/context.dox",
    "content": "/*!\n\n@page context_guide Context guide\n\n@tableofcontents\n\nThis guide introduces the OpenGL and OpenGL ES context related functions of\nGLFW.  For details on a specific function in this category, see the @ref\ncontext.  There are also guides for the other areas of the GLFW API.\n\n - @ref intro_guide\n - @ref window_guide\n - @ref vulkan_guide\n - @ref monitor_guide\n - @ref input_guide\n\n\n@section context_object Context objects\n\nA window object encapsulates both a top-level window and an OpenGL or OpenGL ES\ncontext.  It is created with @ref glfwCreateWindow and destroyed with @ref\nglfwDestroyWindow or @ref glfwTerminate.  See @ref window_creation for more\ninformation.\n\nAs the window and context are inseparably linked, the window object also serves\nas the context handle.\n\nTo test the creation of various kinds of contexts and see their properties, run\nthe `glfwinfo` test program.\n\n@note Vulkan does not have a context and the Vulkan instance is created via the\nVulkan API itself.  If you will be using Vulkan to render to a window, disable\ncontext creation by setting the [GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint)\nhint to `GLFW_NO_API`.  For more information, see the @ref vulkan_guide.\n\n\n@subsection context_hints Context creation hints\n\nThere are a number of hints, specified using @ref glfwWindowHint, related to\nwhat kind of context is created.  See\n[context related hints](@ref window_hints_ctx) in the window guide.\n\n\n@subsection context_sharing Context object sharing\n\nWhen creating a window and its OpenGL or OpenGL ES context with @ref\nglfwCreateWindow, you can specify another window whose context the new one\nshould share its objects (textures, vertex and element buffers, etc.) with.\n\n@code\nGLFWwindow* second_window = glfwCreateWindow(640, 480, \"Second Window\", NULL, first_window);\n@endcode\n\nObject sharing is implemented by the operating system and graphics driver.  On\nplatforms where it is possible to choose which types of objects are shared, GLFW\nrequests that all types are shared.\n\nSee the relevant chapter of the [OpenGL](https://www.opengl.org/registry/) or\n[OpenGL ES](http://www.khronos.org/opengles/) reference documents for more\ninformation.  The name and number of this chapter unfortunately varies between\nversions and APIs, but has at times been named _Shared Objects and Multiple\nContexts_.\n\nGLFW comes with a barebones object sharing test program called `sharing`.\n\n\n@subsection context_offscreen Offscreen contexts\n\nGLFW doesn't support creating contexts without an associated window.  However,\ncontexts with hidden windows can be created with the\n[GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window hint.\n\n@code\nglfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);\n\nGLFWwindow* offscreen_context = glfwCreateWindow(640, 480, \"\", NULL, NULL);\n@endcode\n\nThe window never needs to be shown and its context can be used as a plain\noffscreen context.  Depending on the window manager, the size of a hidden\nwindow's framebuffer may not be usable or modifiable, so framebuffer\nobjects are recommended for rendering with such contexts.\n\nYou should still [process events](@ref events) as long as you have at least one\nwindow, even if none of them are visible.\n\n@macos The first time a window is created the menu bar is created.  This is not\ndesirable for example when writing a command-line only application.  Menu bar\ncreation can be disabled with the @ref GLFW_COCOA_MENUBAR init hint.\n\n\n@subsection context_less Windows without contexts\n\nYou can disable context creation by setting the\n[GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint to `GLFW_NO_API`.  Windows\nwithout contexts must not be passed to @ref glfwMakeContextCurrent or @ref\nglfwSwapBuffers.\n\n\n@section context_current Current context\n\nBefore you can make OpenGL or OpenGL ES calls, you need to have a current\ncontext of the correct type.  A context can only be current for a single thread\nat a time, and a thread can only have a single context current at a time.\n\nThe context of a window is made current with @ref glfwMakeContextCurrent.\n\n@code\nglfwMakeContextCurrent(window);\n@endcode\n\nThe window of the current context is returned by @ref glfwGetCurrentContext.\n\n@code\nGLFWwindow* window = glfwGetCurrentContext();\n@endcode\n\nThe following GLFW functions require a context to be current.  Calling any these\nfunctions without a current context will generate a @ref GLFW_NO_CURRENT_CONTEXT\nerror.\n\n - @ref glfwSwapInterval\n - @ref glfwExtensionSupported\n - @ref glfwGetProcAddress\n\n\n@section context_swap Buffer swapping\n\nBuffer swapping is part of the window and framebuffer, not the context.  See\n@ref buffer_swap.\n\n\n@section context_glext OpenGL and OpenGL ES extensions\n\nOne of the benefits of OpenGL and OpenGL ES is their extensibility.\nHardware vendors may include extensions in their implementations that extend the\nAPI before that functionality is included in a new version of the OpenGL or\nOpenGL ES specification, and some extensions are never included and remain\nas extensions until they become obsolete.\n\nAn extension is defined by:\n\n- An extension name (e.g. `GL_ARB_debug_output`)\n- New OpenGL tokens (e.g. `GL_DEBUG_SEVERITY_HIGH_ARB`)\n- New OpenGL functions (e.g. `glGetDebugMessageLogARB`)\n\nNote the `ARB` affix, which stands for Architecture Review Board and is used\nfor official extensions.  The extension above was created by the ARB, but there\nare many different affixes, like `NV` for Nvidia and `AMD` for, well, AMD.  Any\ngroup may also use the generic `EXT` affix.  Lists of extensions, together with\ntheir specifications, can be found at the\n[OpenGL Registry](http://www.opengl.org/registry/) and\n[OpenGL ES Registry](https://www.khronos.org/registry/gles/).\n\n\n@subsection context_glext_auto Loading extension with a loader library\n\nAn extension loader library is the easiest and best way to access both OpenGL and\nOpenGL ES extensions and modern versions of the core OpenGL or OpenGL ES APIs.\nThey will take care of all the details of declaring and loading everything you\nneed.  One such library is [glad](https://github.com/Dav1dde/glad) and there are\nseveral others.  \n\nThe following example will use glad but all extension loader libraries work\nsimilarly.\n\nFirst you need to generate the source files using the glad Python script.  This\nexample generates a loader for any version of OpenGL, which is the default for\nboth GLFW and glad, but loaders for OpenGL ES, as well as loaders for specific\nAPI versions and extension sets can be generated.  The generated files are\nwritten to the `output` directory.\n\n@code{.sh}\npython main.py --generator c --no-loader --out-path output\n@endcode\n\nThe `--no-loader` option is added because GLFW already provides a function for\nloading OpenGL and OpenGL ES function pointers, one that automatically uses the\nselected context creation API, and glad can call this instead of having to\nimplement its own.  There are several other command-line options as well.  See\nthe glad documentation for details.\n\nAdd the generated `output/src/glad.c`, `output/include/glad/glad.h` and\n`output/include/KHR/khrplatform.h` files to your build.  Then you need to\ninclude the glad header file, which will replace the OpenGL header of your\ndevelopment environment.  By including the glad header before the GLFW header,\nit suppresses the development environment's OpenGL or OpenGL ES header.\n\n@code\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n@endcode\n\nFinally you need to initialize glad once you have a suitable current context.\n\n@code\nwindow = glfwCreateWindow(640, 480, \"My Window\", NULL, NULL);\nif (!window)\n{\n    ...\n}\n\nglfwMakeContextCurrent(window);\n\ngladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n@endcode\n\nOnce glad has been loaded, you have access to all OpenGL core and extension\nfunctions supported by both the context you created and the glad loader you\ngenerated and you are ready to start rendering.\n\nYou can specify a minimum required OpenGL or OpenGL ES version with\n[context hints](@ref window_hints_ctx).  If your needs are more complex, you can\ncheck the actual OpenGL or OpenGL ES version with\n[context attributes](@ref window_attribs_ctx), or you can check whether\na specific version is supported by the current context with the\n`GLAD_GL_VERSION_x_x` booleans.\n\n@code\nif (GLAD_GL_VERSION_3_2)\n{\n    // Call OpenGL 3.2+ specific code\n}\n@endcode\n\nTo check whether a specific extension is supported, use the `GLAD_GL_xxx`\nbooleans.\n\n@code\nif (GLAD_GL_ARB_debug_output)\n{\n    // Use GL_ARB_debug_output\n}\n@endcode\n\n\n@subsection context_glext_manual Loading extensions manually\n\n__Do not use this technique__ unless it is absolutely necessary.  An\n[extension loader library](@ref context_glext_auto) will save you a ton of\ntedious, repetitive, error prone work.\n\nTo use a certain extension, you must first check whether the context supports\nthat extension and then, if it introduces new functions, retrieve the pointers\nto those functions.  GLFW provides @ref glfwExtensionSupported and @ref\nglfwGetProcAddress for manual loading of extensions and new API functions.\n\nThis section will demonstrate manual loading of OpenGL extensions.  The loading\nof OpenGL ES extensions is identical except for the name of the extension header.\n\n\n@subsubsection context_glext_header The glext.h header\n\nThe `glext.h` extension header is a continually updated file that defines the\ninterfaces for all OpenGL extensions.  The latest version of this can always be\nfound at the [OpenGL Registry](http://www.opengl.org/registry/).  There are also\nextension headers for the various versions of OpenGL ES at the\n[OpenGL ES Registry](https://www.khronos.org/registry/gles/).  It it strongly\nrecommended that you use your own copy of the extension header, as the one\nincluded in your development environment may be several years out of date and\nmay not include the extensions you wish to use.\n\nThe header defines function pointer types for all functions of all extensions it\nsupports.  These have names like `PFNGLGETDEBUGMESSAGELOGARBPROC` (for\n`glGetDebugMessageLogARB`), i.e. the name is made uppercase and `PFN` (pointer\nto function) and `PROC` (procedure) are added to the ends.\n\nTo include the extension header, define @ref GLFW_INCLUDE_GLEXT before including\nthe GLFW header.\n\n@code\n#define GLFW_INCLUDE_GLEXT\n#include <GLFW/glfw3.h>\n@endcode\n\n\n@subsubsection context_glext_string Checking for extensions\n\nA given machine may not actually support the extension (it may have older\ndrivers or a graphics card that lacks the necessary hardware features), so it\nis necessary to check at run-time whether the context supports the extension.\nThis is done with @ref glfwExtensionSupported.\n\n@code\nif (glfwExtensionSupported(\"GL_ARB_debug_output\"))\n{\n    // The extension is supported by the current context\n}\n@endcode\n\nThe argument is a null terminated ASCII string with the extension name.  If the\nextension is supported, @ref glfwExtensionSupported returns `GLFW_TRUE`,\notherwise it returns `GLFW_FALSE`.\n\n\n@subsubsection context_glext_proc Fetching function pointers\n\nMany extensions, though not all, require the use of new OpenGL functions.\nThese functions often do not have entry points in the client API libraries of\nyour operating system, making it necessary to fetch them at run time.  You can\nretrieve pointers to these functions with @ref glfwGetProcAddress.\n\n@code\nPFNGLGETDEBUGMESSAGELOGARBPROC pfnGetDebugMessageLog = glfwGetProcAddress(\"glGetDebugMessageLogARB\");\n@endcode\n\nIn general, you should avoid giving the function pointer variables the (exact)\nsame name as the function, as this may confuse your linker.  Instead, you can\nuse a different prefix, like above, or some other naming scheme.\n\nNow that all the pieces have been introduced, here is what they might look like\nwhen used together.\n\n@code\n#define GLFW_INCLUDE_GLEXT\n#include <GLFW/glfw3.h>\n\n#define glGetDebugMessageLogARB pfnGetDebugMessageLog\nPFNGLGETDEBUGMESSAGELOGARBPROC pfnGetDebugMessageLog;\n\n// Flag indicating whether the extension is supported\nint has_ARB_debug_output = 0;\n\nvoid load_extensions(void)\n{\n    if (glfwExtensionSupported(\"GL_ARB_debug_output\"))\n    {\n        pfnGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGARBPROC)\n            glfwGetProcAddress(\"glGetDebugMessageLogARB\");\n        has_ARB_debug_output = 1;\n    }\n}\n\nvoid some_function(void)\n{\n    if (has_ARB_debug_output)\n    {\n        // Now the extension function can be called as usual\n        glGetDebugMessageLogARB(...);\n    }\n}\n@endcode\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/extra.css",
    "content": ".sm-dox,.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted,.sm-dox ul a:hover{background:none;text-shadow:none}.sm-dox a span.sub-arrow{border-color:#f2f2f2 transparent transparent transparent}.sm-dox a span.sub-arrow:active,.sm-dox a span.sub-arrow:focus,.sm-dox a span.sub-arrow:hover,.sm-dox a:hover span.sub-arrow{border-color:#f60 transparent transparent transparent}.sm-dox ul a span.sub-arrow:active,.sm-dox ul a span.sub-arrow:focus,.sm-dox ul a span.sub-arrow:hover,.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #f60}.sm-dox ul a:hover{background:#666;text-shadow:none}.sm-dox ul.sm-nowrap a{color:#4d4d4d;text-shadow:none}#main-nav,#main-menu,#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li,.memdoc,dl.reflist dd,div.toc li,.ah,span.lineno,span.lineno a,span.lineno a:hover,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,.doxtable code{background:none}#titlearea,.footer,.contents,div.header,.memdoc,table.doxtable td,table.doxtable th,hr,.memSeparator{border:none}#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li,.reflist dt a.el,.levels span,.directory .levels span{text-shadow:none}.memdoc,dl.reflist dd{box-shadow:none}div.headertitle,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,table.doxtable code{padding:0}#nav-path,.directory .levels,span.lineno{display:none}html,#titlearea,.footer,tr.even,.directory tr.even,.doxtable tr:nth-child(even),.mdescLeft,.mdescRight,.memItemLeft,.memItemRight,code{background:#f2f2f2}body{color:#4d4d4d}h1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em{color:#1a1a1a;border-bottom:none}h1{padding-top:.5em;font-size:180%}h2{padding-top:.5em;margin-bottom:0;font-size:140%}h3{padding-top:.5em;margin-bottom:0;font-size:110%}.glfwheader{font-size:16px;height:64px;max-width:920px;min-width:800px;padding:0 32px;margin:0 auto}#glfwhome{line-height:64px;padding-right:48px;color:#666;font-size:2.5em;background:url(\"http://www.glfw.org/css/arrow.png\") no-repeat right}.glfwnavbar{list-style-type:none;margin:0 auto;float:right}#glfwhome,.glfwnavbar li{float:left}.glfwnavbar a,.glfwnavbar a:visited{line-height:64px;margin-left:2em;display:block;color:#666}#glfwhome,.glfwnavbar a,.glfwnavbar a:visited{transition:.35s ease}#titlearea,.footer{color:#666}address.footer{text-align:center;padding:2em;margin-top:3em}#top{background:#666}#main-nav{max-width:960px;min-width:800px;margin:0 auto;font-size:13px}#main-menu{max-width:920px;min-width:800px;margin:0 auto;font-size:13px}.memtitle{display:none}.memproto,.memname{font-weight:bold;text-shadow:none}#main-menu{height:36px;display:block;position:relative}#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li{color:#f2f2f2}#main-menu li ul.sm-nowrap li a{color:#4d4d4d}#main-menu li ul.sm-nowrap li a:hover{color:#f60}.contents{min-height:590px}div.contents,div.header{max-width:920px;margin:0 auto;padding:0 32px;background:#fff none}table.doxtable th,dl.reflist dt{background:linear-gradient(to bottom, #ffa733 0, #f60 100%);box-shadow:inset 0 0 32px #f60;text-shadow:0 -1px 1px #b34700;text-align:left;color:#fff}dl.reflist dt a.el{color:#f60;padding:.2em;border-radius:4px;background-color:#ffe0cc}div.toc{float:none;width:auto}div.toc h3{font-size:1.17em}div.toc ul{padding-left:1.5em}div.toc li{font-size:1em;padding-left:0;list-style-type:disc}div.toc,.memproto,div.qindex,div.ah{background:linear-gradient(to bottom, #f2f2f2 0, #e6e6e6 100%);box-shadow:inset 0 0 32px #e6e6e6;text-shadow:0 1px 1px #fff;color:#1a1a1a;border:2px solid #e6e6e6;border-radius:4px}.paramname{color:#803300}dl.reflist dt{border:2px solid #f60;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:none}dl.reflist dd{border:2px solid #f60;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:none}table.doxtable{border-collapse:inherit;border-spacing:0;border:2px solid #f60;border-radius:4px}a,a:hover,a:visited,a:visited:hover,.contents a:visited,.el,a.el:visited,#glfwhome:hover,#main-menu a:hover,span.lineno a:hover{color:#f60;text-decoration:none}div.directory{border-collapse:inherit;border-spacing:0;border:2px solid #f60;border-radius:4px}hr,.memSeparator{height:2px;background:linear-gradient(to right, #f2f2f2 0, #d9d9d9 50%, #f2f2f2 100%)}dl.note,dl.pre,dl.post,dl.invariant{background:linear-gradient(to bottom, #ddfad1 0, #cbf7ba 100%);box-shadow:inset 0 0 32px #baf5a3;color:#1e5309;border:2px solid #afe599}dl.warning,dl.attention{background:linear-gradient(to bottom, #fae8d1 0, #f7ddba 100%);box-shadow:inset 0 0 32px #f5d1a3;color:#533309;border:2px solid #e5c499}dl.deprecated,dl.bug{background:linear-gradient(to bottom, #fad1e3 0, #f7bad6 100%);box-shadow:inset 0 0 32px #f5a3c8;color:#53092a;border:2px solid #e599bb}dl.todo,dl.test{background:linear-gradient(to bottom, #d1ecfa 0, #bae3f7 100%);box-shadow:inset 0 0 32px #a3daf5;color:#093a53;border:2px solid #99cce5}dl.note,dl.pre,dl.post,dl.invariant,dl.warning,dl.attention,dl.deprecated,dl.bug,dl.todo,dl.test{border-radius:4px;padding:1em;text-shadow:0 1px 1px #fff;margin:1em 0}.note a,.pre a,.post a,.invariant a,.warning a,.attention a,.deprecated a,.bug a,.todo a,.test a,.note a:visited,.pre a:visited,.post a:visited,.invariant a:visited,.warning a:visited,.attention a:visited,.deprecated a:visited,.bug a:visited,.todo a:visited,.test a:visited{color:inherit}div.line{line-height:inherit}div.fragment,pre.fragment{background:#f2f2f2;border-radius:4px;border:none;padding:1em;overflow:auto;border-left:4px solid #ccc;margin:1em 0}.lineno a,.lineno a:visited,.line,pre.fragment{color:#4d4d4d}span.preprocessor,span.comment{color:#007899}a.code,a.code:visited{color:#e64500}span.keyword,span.keywordtype,span.keywordflow{color:#404040;font-weight:bold}span.stringliteral{color:#360099}code{padding:.1em;border-radius:4px}\n"
  },
  {
    "path": "external/GLFW/docs/extra.less",
    "content": "// NOTE: Please use this file to perform modifications on default style sheets.\n//\n// You need to install a few Ruby gems to generate extra.css from this file:\n// gem install less therubyracer\n//\n// Run this command to regenerate extra.css after you're finished with changes:\n// lessc --compress extra.less > extra.css\n//\n// Alternatively you can use online services to regenerate extra.css.\n\n\n// Default text color for page contents\n@default-text-color: hsl(0,0%,30%);\n\n// Page header, footer, table rows, inline codes and definition lists\n@header-footer-background-color: hsl(0,0%,95%);\n\n// Page header, footer links and navigation bar background\n@header-footer-link-color: hsl(0,0%,40%);\n\n// Doxygen navigation bar links\n@navbar-link-color: @header-footer-background-color;\n\n// Page content background color\n@content-background-color: hsl(0,0%,100%);\n\n// Bold, italic, h1, h2, ... and table of contents\n@heading-color: hsl(0,0%,10%);\n\n// Function, enum and macro definition separator\n@def-separator-color: @header-footer-background-color;\n\n// Base color hue\n@base-hue: 24;\n\n// Default color used for links\n@default-link-color: hsl(@base-hue,100%,50%);\n\n// Doxygen navigation bar active tab\n@tab-text-color: hsl(0,0%,100%);\n@tab-background-color1: @default-link-color;\n@tab-background-color2: lighten(spin(@tab-background-color1, 10), 10%);\n\n// Table borders\n@default-border-color: @default-link-color;\n\n// Table header\n@table-text-color: @tab-text-color;\n@table-background-color1: @tab-background-color1;\n@table-background-color2: @tab-background-color2;\n\n// Table of contents, data structure index and prototypes\n@toc-background-color1: hsl(0,0%,90%);\n@toc-background-color2: lighten(@toc-background-color1, 5%);\n\n// Function prototype parameters color\n@prototype-param-color: darken(@default-link-color, 25%);\n\n// Message box color: note, pre, post and invariant\n@box-note-color: hsl(103,80%,85%);\n\n// Message box color: warning and attention\n@box-warning-color: hsl(34,80%,85%);\n\n// Message box color: deprecated and bug\n@box-bug-color: hsl(333,80%,85%);\n\n// Message box color: todo and test\n@box-todo-color: hsl(200,80%,85%);\n\n// Message box helper function\n.message-box(@base-color) {\n\tbackground:linear-gradient(to bottom,lighten(@base-color, 5%) 0%,@base-color 100%);\n\tbox-shadow:inset 0 0 32px darken(@base-color, 5%);\n\tcolor:darken(@base-color, 67%);\n\tborder:2px solid desaturate(darken(@base-color, 10%), 20%);\n}\n\n.sm-dox,.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted,.sm-dox ul a:hover {\n    background:none;\n    text-shadow:none;\n}\n\n.sm-dox a span.sub-arrow {\n\tborder-color:@navbar-link-color transparent transparent transparent;\n}\n\n.sm-dox a span.sub-arrow:active,.sm-dox a span.sub-arrow:focus,.sm-dox a span.sub-arrow:hover,.sm-dox a:hover span.sub-arrow {\n\tborder-color:@default-link-color transparent transparent transparent;\n}\n\n.sm-dox ul a span.sub-arrow:active,.sm-dox ul a span.sub-arrow:focus,.sm-dox ul a span.sub-arrow:hover,.sm-dox ul a:hover span.sub-arrow {\n\tborder-color:transparent transparent transparent @default-link-color;\n}\n\n.sm-dox ul a:hover {\n    background:@header-footer-link-color;\n    text-shadow:none;\n}\n\n.sm-dox ul.sm-nowrap a {\n\tcolor:@default-text-color;\n    text-shadow:none;\n}\n\n#main-nav,#main-menu,#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li,.memdoc,dl.reflist dd,div.toc li,.ah,span.lineno,span.lineno a,span.lineno a:hover,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,.doxtable code {\n\tbackground:none;\n}\n\n#titlearea,.footer,.contents,div.header,.memdoc,table.doxtable td,table.doxtable th,hr,.memSeparator {\n\tborder:none;\n}\n\n#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li,.reflist dt a.el,.levels span,.directory .levels span {\n\ttext-shadow:none;\n}\n\n.memdoc,dl.reflist dd {\n\tbox-shadow:none;\n}\n\ndiv.headertitle,.note code,.pre code,.post code,.invariant code,.warning code,.attention code,.deprecated code,.bug code,.todo code,.test code,table.doxtable code {\n\tpadding:0;\n}\n\n#nav-path,.directory .levels,span.lineno {\n\tdisplay:none;\n}\n\nhtml,#titlearea,.footer,tr.even,.directory tr.even,.doxtable tr:nth-child(even),.mdescLeft,.mdescRight,.memItemLeft,.memItemRight,code {\n\tbackground:@header-footer-background-color;\n}\n\nbody {\n\tcolor:@default-text-color;\n}\n\nh1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em {\n\tcolor:@heading-color;\n\tborder-bottom:none;\n}\n\nh1 {\n  padding-top:0.5em;\n  font-size:180%;\n}\n\nh2 {\n  padding-top:0.5em;\n  margin-bottom:0;\n  font-size:140%;\n}\n\nh3 {\n  padding-top:0.5em;\n  margin-bottom:0;\n  font-size:110%;\n}\n\n.glfwheader {\n\tfont-size:16px;\n\theight:64px;\n\tmax-width:920px;\n\tmin-width:800px;\n\tpadding:0 32px;\n\tmargin:0 auto;\n}\n\n#glfwhome {\n\tline-height:64px;\n\tpadding-right:48px;\n\tcolor:@header-footer-link-color;\n\tfont-size:2.5em;\n\tbackground:url(\"http://www.glfw.org/css/arrow.png\") no-repeat right;\n}\n\n.glfwnavbar {\n\tlist-style-type:none;\n\tmargin:0 auto;\n\tfloat:right;\n}\n\n#glfwhome,.glfwnavbar li {\n\tfloat:left;\n}\n\n.glfwnavbar a,.glfwnavbar a:visited {\n\tline-height:64px;\n\tmargin-left:2em;\n\tdisplay:block;\n\tcolor:@header-footer-link-color;\n}\n\n#glfwhome,.glfwnavbar a,.glfwnavbar a:visited {\n\ttransition:.35s ease;\n}\n\n#titlearea,.footer {\n\tcolor:@header-footer-link-color;\n}\n\naddress.footer {\n\ttext-align:center;\n\tpadding:2em;\n\tmargin-top:3em;\n}\n\n#top {\n\tbackground:@header-footer-link-color;\n}\n\n#main-nav {\n\tmax-width:960px;\n\tmin-width:800px;\n\tmargin:0 auto;\n\tfont-size:13px;\n}\n\n#main-menu {\n\tmax-width:920px;\n\tmin-width:800px;\n\tmargin:0 auto;\n\tfont-size:13px;\n}\n\n.memtitle {\n    display:none;\n}\n\n.memproto,.memname {\n    font-weight:bold;\n    text-shadow:none;\n}\n\n#main-menu {\n\theight:36px;\n\tdisplay:block;\n\tposition:relative;\n}\n\n#main-menu a,#main-menu a:visited,#main-menu a:hover,#main-menu li {\n\tcolor:@navbar-link-color;\n}\n\n#main-menu li ul.sm-nowrap li a {\n\tcolor:@default-text-color;\n}\n\n#main-menu li ul.sm-nowrap li a:hover {\n\tcolor:@default-link-color;\n}\n\n.contents {\n\tmin-height:590px;\n}\n\ndiv.contents,div.header {\n\tmax-width:920px;\n\tmargin:0 auto;\n\tpadding:0 32px;\n\tbackground:@content-background-color none;\n}\n\ntable.doxtable th,dl.reflist dt {\n\tbackground:linear-gradient(to bottom,@table-background-color2 0%,@table-background-color1 100%);\n\tbox-shadow:inset 0 0 32px @table-background-color1;\n\ttext-shadow:0 -1px 1px darken(@table-background-color1, 15%);\n\ttext-align:left;\n\tcolor:@table-text-color;\n}\n\ndl.reflist dt a.el {\n\tcolor:@default-link-color;\n\tpadding:.2em;\n\tborder-radius:4px;\n\tbackground-color:lighten(@default-link-color, 40%);\n}\n\ndiv.toc {\n\tfloat:none;\n\twidth:auto;\n}\n\ndiv.toc h3 {\n\tfont-size:1.17em;\n}\n\ndiv.toc ul {\n\tpadding-left:1.5em;\n}\n\ndiv.toc li {\n\tfont-size:1em;\n\tpadding-left:0;\n\tlist-style-type:disc;\n}\n\ndiv.toc,.memproto,div.qindex,div.ah {\n\tbackground:linear-gradient(to bottom,@toc-background-color2 0%,@toc-background-color1 100%);\n\tbox-shadow:inset 0 0 32px @toc-background-color1;\n\ttext-shadow:0 1px 1px lighten(@toc-background-color2, 10%);\n\tcolor:@heading-color;\n\tborder:2px solid @toc-background-color1;\n\tborder-radius:4px;\n}\n\n.paramname {\n\tcolor:@prototype-param-color;\n}\n\ndl.reflist dt {\n\tborder:2px solid @default-border-color;\n\tborder-top-left-radius:4px;\n\tborder-top-right-radius:4px;\n\tborder-bottom:none;\n}\n\ndl.reflist dd {\n\tborder:2px solid @default-border-color;\n\tborder-bottom-right-radius:4px;\n\tborder-bottom-left-radius:4px;\n\tborder-top:none;\n}\n\ntable.doxtable {\n\tborder-collapse:inherit;\n\tborder-spacing:0;\n\tborder:2px solid @default-border-color;\n\tborder-radius:4px;\n}\n\na,a:hover,a:visited,a:visited:hover,.contents a:visited,.el,a.el:visited,#glfwhome:hover,#main-menu a:hover,span.lineno a:hover {\n\tcolor:@default-link-color;\n\ttext-decoration:none;\n}\n\ndiv.directory {\n\tborder-collapse:inherit;\n\tborder-spacing:0;\n\tborder:2px solid @default-border-color;\n\tborder-radius:4px;\n}\n\nhr,.memSeparator {\n\theight:2px;\n\tbackground:linear-gradient(to right,@def-separator-color 0%,darken(@def-separator-color, 10%) 50%,@def-separator-color 100%);\n}\n\ndl.note,dl.pre,dl.post,dl.invariant {\n\t.message-box(@box-note-color);\n}\n\ndl.warning,dl.attention {\n\t.message-box(@box-warning-color);\n}\n\ndl.deprecated,dl.bug {\n\t.message-box(@box-bug-color);\n}\n\ndl.todo,dl.test {\n\t.message-box(@box-todo-color);\n}\n\ndl.note,dl.pre,dl.post,dl.invariant,dl.warning,dl.attention,dl.deprecated,dl.bug,dl.todo,dl.test {\n\tborder-radius:4px;\n\tpadding:1em;\n\ttext-shadow:0 1px 1px hsl(0,0%,100%);\n\tmargin:1em 0;\n}\n\n.note a,.pre a,.post a,.invariant a,.warning a,.attention a,.deprecated a,.bug a,.todo a,.test a,.note a:visited,.pre a:visited,.post a:visited,.invariant a:visited,.warning a:visited,.attention a:visited,.deprecated a:visited,.bug a:visited,.todo a:visited,.test a:visited {\n\tcolor:inherit;\n}\n\ndiv.line {\n\tline-height:inherit;\n}\n\ndiv.fragment,pre.fragment {\n\tbackground:hsl(0,0%,95%);\n\tborder-radius:4px;\n\tborder:none;\n\tpadding:1em;\n\toverflow:auto;\n\tborder-left:4px solid hsl(0,0%,80%);\n\tmargin:1em 0;\n}\n\n.lineno a,.lineno a:visited,.line,pre.fragment {\n\tcolor:@default-text-color;\n}\n\nspan.preprocessor,span.comment {\n\tcolor:hsl(193,100%,30%);\n}\n\na.code,a.code:visited {\n\tcolor:hsl(18,100%,45%);\n}\n\nspan.keyword,span.keywordtype,span.keywordflow {\n\tcolor:darken(@default-text-color, 5%);\n\tfont-weight:bold;\n}\n\nspan.stringliteral {\n\tcolor:hsl(261,100%,30%);\n}\n\ncode {\n\tpadding:.1em;\n\tborder-radius:4px;\n}\n"
  },
  {
    "path": "external/GLFW/docs/footer.html",
    "content": "<address class=\"footer\">\n<p>\nLast update on $date for $projectname $projectnumber\n</p>\n</address>\n</body>\n</html>\n"
  },
  {
    "path": "external/GLFW/docs/header.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen $doxygenversion\"/>\n<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n<link href=\"$relpath^tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"$relpath^jquery.js\"></script>\n<script type=\"text/javascript\" src=\"$relpath^dynsections.js\"></script>\n$treeview\n$search\n$mathjax\n<link href=\"$relpath^$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n$extrastylesheet\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n\n<!--BEGIN TITLEAREA-->\n<div id=\"titlearea\">\n\t<div class=\"glfwheader\">\n\t\t<a href=\"http://www.glfw.org/\" id=\"glfwhome\">GLFW</a>\n\t\t<ul class=\"glfwnavbar\">\n\t\t\t<li><a href=\"http://www.glfw.org/documentation.html\">Documentation</a></li>\n\t\t\t<li><a href=\"http://www.glfw.org/download.html\">Download</a></li>\n\t\t\t<li><a href=\"http://www.glfw.org/community.html\">Community</a></li>\n\t\t</ul>\n\t</div>\n</div>\n<!--END TITLEAREA-->\n<!-- end header part -->\n"
  },
  {
    "path": "external/GLFW/docs/input.dox",
    "content": "/*!\n\n@page input_guide Input guide\n \n@tableofcontents\n\nThis guide introduces the input related functions of GLFW.  For details on\na specific function in this category, see the @ref input.  There are also guides\nfor the other areas of GLFW.\n\n - @ref intro_guide\n - @ref window_guide\n - @ref context_guide\n - @ref vulkan_guide\n - @ref monitor_guide\n\nGLFW provides many kinds of input.  While some can only be polled, like time, or\nonly received via callbacks, like scrolling, many provide both callbacks and\npolling.  Callbacks are more work to use than polling but is less CPU intensive\nand guarantees that you do not miss state changes.\n\nAll input callbacks receive a window handle.  By using the\n[window user pointer](@ref window_userptr), you can access non-global structures\nor objects from your callbacks.\n\nTo get a better feel for how the various events callbacks behave, run the\n`events` test program.  It register every callback supported by GLFW and prints\nout all arguments provided for every event, along with time and sequence\ninformation.\n\n\n@section events Event processing\n\nGLFW needs to poll the window system for events both to provide input to the\napplication and to prove to the window system that the application hasn't locked\nup.  Event processing is normally done each frame after\n[buffer swapping](@ref buffer_swap).  Even when you have no windows, event\npolling needs to be done in order to receive monitor and joystick connection\nevents.\n\nThere are three functions for processing pending events.  @ref glfwPollEvents,\nprocesses only those events that have already been received and then returns\nimmediately.\n\n@code\nglfwPollEvents();\n@endcode\n\nThis is the best choice when rendering continuously, like most games do.\n\nIf you only need to update the contents of the window when you receive new\ninput, @ref glfwWaitEvents is a better choice.\n\n@code\nglfwWaitEvents();\n@endcode\n\nIt puts the thread to sleep until at least one event has been received and then\nprocesses all received events.  This saves a great deal of CPU cycles and is\nuseful for, for example, editing tools.  There must be at least one GLFW window\nfor this function to sleep.\n\nIf you want to wait for events but have UI elements or other tasks that need\nperiodic updates, @ref glfwWaitEventsTimeout lets you specify a timeout.\n\n@code\nglfwWaitEventsTimeout(0.7);\n@endcode\n\nIt puts the thread to sleep until at least one event has been received, or until\nthe specified number of seconds have elapsed.  It then processes any received\nevents.\n\nIf the main thread is sleeping in @ref glfwWaitEvents, you can wake it from\nanother thread by posting an empty event to the event queue with @ref\nglfwPostEmptyEvent.\n\n@code\nglfwPostEmptyEvent();\n@endcode\n\nDo not assume that callbacks will _only_ be called in response to the above\nfunctions.  While it is necessary to process events in one or more of the ways\nabove, window systems that require GLFW to register callbacks of its own can\npass events to GLFW in response to many window system function calls.  GLFW will\npass those events on to the application callbacks before returning.\n\nFor example, on Windows the system function that @ref glfwSetWindowSize is\nimplemented with will send window size events directly to the event callback\nthat every window has and that GLFW implements for its windows.  If you have set\na [window size callback](@ref window_size) GLFW will call it in turn with the\nnew size before everything returns back out of the @ref glfwSetWindowSize call.\n\n\n@section input_keyboard Keyboard input\n\nGLFW divides keyboard input into two categories; key events and character\nevents.  Key events relate to actual physical keyboard keys, whereas character\nevents relate to the Unicode code points generated by pressing some of them.\n\nKeys and characters do not map 1:1.  A single key press may produce several\ncharacters, and a single character may require several keys to produce.  This\nmay not be the case on your machine, but your users are likely not all using the\nsame keyboard layout, input method or even operating system as you.\n\n\n@subsection input_key Key input\n\nIf you wish to be notified when a physical key is pressed or released or when it\nrepeats, set a key callback.\n\n@code\nglfwSetKeyCallback(window, key_callback);\n@endcode\n\nThe callback function receives the [keyboard key](@ref keys), platform-specific\nscancode, key action and [modifier bits](@ref mods).\n\n@code\nvoid key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key == GLFW_KEY_E && action == GLFW_PRESS)\n        activate_airship();\n}\n@endcode\n\nThe action is one of `GLFW_PRESS`, `GLFW_REPEAT` or `GLFW_RELEASE`.  The key\nwill be `GLFW_KEY_UNKNOWN` if GLFW lacks a key token for it, for example\n_E-mail_ and _Play_ keys.\n\nThe scancode is unique for every key, regardless of whether it has a key token.\nScancodes are platform-specific but consistent over time, so keys will have\ndifferent scancodes depending on the platform but they are safe to save to disk.\nYou can query the scancode for any [named key](@ref keys) on the current\nplatform with @ref glfwGetKeyScancode.\n\n@code\nconst int scancode = glfwGetKeyScancode(GLFW_KEY_X);\nset_key_mapping(scancode, swap_weapons);\n@endcode\n\nThe last reported state for every [named key](@ref keys) is also saved in\nper-window state arrays that can be polled with @ref glfwGetKey.\n\n@code\nint state = glfwGetKey(window, GLFW_KEY_E);\nif (state == GLFW_PRESS)\n{\n    activate_airship();\n}\n@endcode\n\nThe returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.\n\nThis function only returns cached key event state.  It does not poll the\nsystem for the current physical state of the key.\n\n@anchor GLFW_STICKY_KEYS\nWhenever you poll state, you risk missing the state change you are looking for.\nIf a pressed key is released again before you poll its state, you will have\nmissed the key press.  The recommended solution for this is to use a\nkey callback, but there is also the `GLFW_STICKY_KEYS` input mode.\n\n@code\nglfwSetInputMode(window, GLFW_STICKY_KEYS, 1);\n@endcode\n\nWhen sticky keys mode is enabled, the pollable state of a key will remain\n`GLFW_PRESS` until the state of that key is polled with @ref glfwGetKey.  Once\nit has been polled, if a key release event had been processed in the meantime,\nthe state will reset to `GLFW_RELEASE`, otherwise it will remain `GLFW_PRESS`.\n\nThe `GLFW_KEY_LAST` constant holds the highest value of any\n[named key](@ref keys).\n\n\n@subsection input_char Text input\n\nGLFW supports text input in the form of a stream of\n[Unicode code points](https://en.wikipedia.org/wiki/Unicode), as produced by the\noperating system text input system.  Unlike key input, text input obeys keyboard\nlayouts and modifier keys and supports composing characters using\n[dead keys](https://en.wikipedia.org/wiki/Dead_key).  Once received, you can\nencode the code points into UTF-8 or any other encoding you prefer.\n\nBecause an `unsigned int` is 32 bits long on all platforms supported by GLFW,\nyou can treat the code point argument as native endian UTF-32.\n\nThere are two callbacks for receiving Unicode code points.  If you wish to\noffer regular text input, set a character callback.\n\n@code\nglfwSetCharCallback(window, character_callback);\n@endcode\n\nThe callback function receives Unicode code points for key events that would\nhave led to regular text input and generally behaves as a standard text field on\nthat platform.\n\n@code\nvoid character_callback(GLFWwindow* window, unsigned int codepoint)\n{\n}\n@endcode\n\nIf you also wish to receive those Unicode code points generated with modifier\nkey combinations that a plain text field would ignore, or want to know exactly\nwhat modifier keys were used, set a character with modifiers callback.\n\n@code\nglfwSetCharModsCallback(window, charmods_callback);\n@endcode\n\nThe callback function receives Unicode code points and\n[modifier bits](@ref mods).\n\n@code\nvoid charmods_callback(GLFWwindow* window, unsigned int codepoint, int mods)\n{\n}\n@endcode\n\n\n@subsection input_key_name Key names\n\nIf you wish to refer to keys by name, you can query the keyboard layout\ndependent name of printable keys with @ref glfwGetKeyName.\n\n@code\nconst char* key_name = glfwGetKeyName(GLFW_KEY_W, 0);\nshow_tutorial_hint(\"Press %s to move forward\", key_name);\n@endcode\n\nThis function can handle both [keys and scancodes](@ref input_key).  If the\nspecified key is `GLFW_KEY_UNKNOWN` then the scancode is used, otherwise it is\nignored.  This matches the behavior of the key callback, meaning the callback\narguments can always be passed unmodified to this function.\n\n\n@section input_mouse Mouse input\n\nMouse input comes in many forms, including cursor motion, button presses and\nscrolling offsets.  The cursor appearance can also be changed, either to\na custom image or a standard cursor shape from the system theme.\n\n\n@subsection cursor_pos Cursor position\n\nIf you wish to be notified when the cursor moves over the window, set a cursor\nposition callback.\n\n@code\nglfwSetCursorPosCallback(window, cursor_pos_callback);\n@endcode\n\nThe callback functions receives the cursor position, measured in screen\ncoordinates but relative to the top-left corner of the window client area.  On\nplatforms that provide it, the full sub-pixel cursor position is passed on.\n\n@code\nstatic void cursor_position_callback(GLFWwindow* window, double xpos, double ypos)\n{\n}\n@endcode\n\nThe cursor position is also saved per-window and can be polled with @ref\nglfwGetCursorPos.\n\n@code\ndouble xpos, ypos;\nglfwGetCursorPos(window, &xpos, &ypos);\n@endcode\n\n\n@subsection cursor_mode Cursor mode\n\n@anchor GLFW_CURSOR\nThe `GLFW_CURSOR` input mode provides several cursor modes for special forms of\nmouse motion input.  By default, the cursor mode is `GLFW_CURSOR_NORMAL`,\nmeaning the regular arrow cursor (or another cursor set with @ref glfwSetCursor)\nis used and cursor motion is not limited.\n\nIf you wish to implement mouse motion based camera controls or other input\nschemes that require unlimited mouse movement, set the cursor mode to\n`GLFW_CURSOR_DISABLED`.\n\n@code\nglfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);\n@endcode\n\nThis will hide the cursor and lock it to the specified window.  GLFW will then\ntake care of all the details of cursor re-centering and offset calculation and\nproviding the application with a virtual cursor position.  This virtual position\nis provided normally via both the cursor position callback and through polling.\n\n@note You should not implement your own version of this functionality using\nother features of GLFW.  It is not supported and will not work as robustly as\n`GLFW_CURSOR_DISABLED`.\n\nIf you only wish the cursor to become hidden when it is over a window but still\nwant it to behave normally, set the cursor mode to `GLFW_CURSOR_HIDDEN`.\n\n@code\nglfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);\n@endcode\n\nThis mode puts no limit on the motion of the cursor.\n\nTo exit out of either of these special modes, restore the `GLFW_CURSOR_NORMAL`\ncursor mode.\n\n@code\nglfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);\n@endcode\n\n\n@subsection cursor_object Cursor objects\n\nGLFW supports creating both custom and system theme cursor images, encapsulated\nas @ref GLFWcursor objects.  They are created with @ref glfwCreateCursor or @ref\nglfwCreateStandardCursor and destroyed with @ref glfwDestroyCursor, or @ref\nglfwTerminate, if any remain.\n\n\n@subsubsection cursor_custom Custom cursor creation\n\nA custom cursor is created with @ref glfwCreateCursor, which returns a handle to\nthe created cursor object.  For example, this creates a 16x16 white square\ncursor with the hot-spot in the upper-left corner:\n\n@code\nunsigned char pixels[16 * 16 * 4];\nmemset(pixels, 0xff, sizeof(pixels));\n\nGLFWimage image;\nimage.width = 16;\nimage.height = 16;\nimage.pixels = pixels;\n\nGLFWcursor* cursor = glfwCreateCursor(&image, 0, 0);\n@endcode\n\nIf cursor creation fails, `NULL` will be returned, so it is necessary to check\nthe return value.\n\nThe image data is 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits\nper channel with the red channel first.  The pixels are arranged canonically as\nsequential rows, starting from the top-left corner.\n\n\n@subsubsection cursor_standard Standard cursor creation\n\nA cursor with a [standard shape](@ref shapes) from the current system cursor\ntheme can be can be created with @ref glfwCreateStandardCursor.\n\n@code\nGLFWcursor* cursor = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);\n@endcode\n\nThese cursor objects behave in the exact same way as those created with @ref\nglfwCreateCursor except that the system cursor theme provides the actual image.\n\n\n@subsubsection cursor_destruction Cursor destruction\n\nWhen a cursor is no longer needed, destroy it with @ref glfwDestroyCursor.\n\n@code\nglfwDestroyCursor(cursor);\n@endcode\n\nCursor destruction always succeeds.  If the cursor is current for any window,\nthat window will revert to the default cursor.  This does not affect the cursor\nmode.  All remaining cursors remaining are destroyed when @ref glfwTerminate is\ncalled.\n\n\n@subsubsection cursor_set Cursor setting\n\nA cursor can be set as current for a window with @ref glfwSetCursor.\n\n@code\nglfwSetCursor(window, cursor);\n@endcode\n\nOnce set, the cursor image will be used as long as the system cursor is over the\nclient area of the window and the [cursor mode](@ref cursor_mode) is set\nto `GLFW_CURSOR_NORMAL`.\n\nA single cursor may be set for any number of windows.\n\nTo revert to the default cursor, set the cursor of that window to `NULL`.\n\n@code\nglfwSetCursor(window, NULL);\n@endcode\n\nWhen a cursor is destroyed, any window that has it set will revert to the\ndefault cursor.  This does not affect the cursor mode.\n\n\n@subsection cursor_enter Cursor enter/leave events\n\nIf you wish to be notified when the cursor enters or leaves the client area of\na window, set a cursor enter/leave callback.\n\n@code\nglfwSetCursorEnterCallback(window, cursor_enter_callback);\n@endcode\n\nThe callback function receives the new classification of the cursor.\n\n@code\nvoid cursor_enter_callback(GLFWwindow* window, int entered)\n{\n    if (entered)\n    {\n        // The cursor entered the client area of the window\n    }\n    else\n    {\n        // The cursor left the client area of the window\n    }\n}\n@endcode\n\n\n@subsection input_mouse_button Mouse button input\n\nIf you wish to be notified when a mouse button is pressed or released, set\na mouse button callback.\n\n@code\nglfwSetMouseButtonCallback(window, mouse_button_callback);\n@endcode\n\nThe callback function receives the [mouse button](@ref buttons), button action\nand [modifier bits](@ref mods).\n\n@code\nvoid mouse_button_callback(GLFWwindow* window, int button, int action, int mods)\n{\n    if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS)\n        popup_menu();\n}\n@endcode\n\nThe action is one of `GLFW_PRESS` or `GLFW_RELEASE`.\n\nMouse button states for [named buttons](@ref buttons) are also saved in\nper-window state arrays that can be polled with @ref glfwGetMouseButton.\n\n@code\nint state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);\nif (state == GLFW_PRESS)\n{\n    upgrade_cow();\n}\n@endcode\n\nThe returned state is one of `GLFW_PRESS` or `GLFW_RELEASE`.\n\nThis function only returns cached mouse button event state.  It does not poll\nthe system for the current state of the mouse button.\n\n@anchor GLFW_STICKY_MOUSE_BUTTONS\nWhenever you poll state, you risk missing the state change you are looking for.\nIf a pressed mouse button is released again before you poll its state, you will have\nmissed the button press.  The recommended solution for this is to use a\nmouse button callback, but there is also the `GLFW_STICKY_MOUSE_BUTTONS`\ninput mode.\n\n@code\nglfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, 1);\n@endcode\n\nWhen sticky mouse buttons mode is enabled, the pollable state of a mouse button\nwill remain `GLFW_PRESS` until the state of that button is polled with @ref\nglfwGetMouseButton.  Once it has been polled, if a mouse button release event\nhad been processed in the meantime, the state will reset to `GLFW_RELEASE`,\notherwise it will remain `GLFW_PRESS`.\n\nThe `GLFW_MOUSE_BUTTON_LAST` constant holds the highest value of any\n[named button](@ref buttons).\n\n\n@subsection scrolling Scroll input\n\nIf you wish to be notified when the user scrolls, whether with a mouse wheel or\ntouchpad gesture, set a scroll callback.\n\n@code\nglfwSetScrollCallback(window, scroll_callback);\n@endcode\n\nThe callback function receives two-dimensional scroll offsets.\n\n@code\nvoid scroll_callback(GLFWwindow* window, double xoffset, double yoffset)\n{\n}\n@endcode\n\nA normal mouse wheel, being vertical, provides offsets along the Y-axis.\n\n\n@section joystick Joystick input\n\nThe joystick functions expose connected joysticks and controllers, with both\nreferred to as joysticks.  It supports up to sixteen joysticks, ranging from\n`GLFW_JOYSTICK_1`, `GLFW_JOYSTICK_2` up to and including `GLFW_JOYSTICK_16` or\n`GLFW_JOYSTICK_LAST`.  You can test whether a [joystick](@ref joysticks) is\npresent with @ref glfwJoystickPresent.\n\n@code\nint present = glfwJoystickPresent(GLFW_JOYSTICK_1);\n@endcode\n\nWhen GLFW is initialized, detected joysticks are added to to the beginning of\nthe array.  Once a joystick is detected, it keeps its assigned ID until it is\ndisconnected or the library is terminated, so as joysticks are connected and\ndisconnected, there may appear gaps in the IDs.\n\nJoystick axis, button and hat state is updated when polled and does not require\na window to be created or events to be processed.  However, if you want joystick\nconnection and disconnection events reliably delivered to the\n[joystick callback](@ref joystick_event) then you must\n[process events](@ref events).\n\nTo see all the properties of all connected joysticks in real-time, run the\n`joysticks` test program.\n\n\n@subsection joystick_axis Joystick axis states\n\nThe positions of all axes of a joystick are returned by @ref\nglfwGetJoystickAxes.  See the reference documentation for the lifetime of the\nreturned array.\n\n@code\nint count;\nconst float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_5, &count);\n@endcode\n\nEach element in the returned array is a value between -1.0 and 1.0.\n\n\n@subsection joystick_button Joystick button states\n\nThe states of all buttons of a joystick are returned by @ref\nglfwGetJoystickButtons.  See the reference documentation for the lifetime of the\nreturned array.\n\n@code\nint count;\nconst unsigned char* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_3, &count);\n@endcode\n\nEach element in the returned array is either `GLFW_PRESS` or `GLFW_RELEASE`.\n\nFor backward compatibility with earlier versions that did not have @ref\nglfwGetJoystickHats, the button array by default also includes all hats.  See\nthe reference documentation for @ref glfwGetJoystickButtons for details.\n\n\n@subsection joystick_hat Joystick hat states\n\nThe states of all hats are returned by @ref glfwGetJoystickHats.  See the\nreference documentation for the lifetime of the returned array.\n\n@code\nint count;\nconst unsigned char* hats = glfwGetJoystickHats(GLFW_JOYSTICK_7, &count);\n@endcode\n\nEach element in the returned array is one of the following:\n\nName                  | Value\n--------------------- | --------------------------------\n`GLFW_HAT_CENTERED`   | 0\n`GLFW_HAT_UP`         | 1\n`GLFW_HAT_RIGHT`      | 2\n`GLFW_HAT_DOWN`       | 4\n`GLFW_HAT_LEFT`       | 8\n`GLFW_HAT_RIGHT_UP`   | `GLFW_HAT_RIGHT` \\| `GLFW_HAT_UP`\n`GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \\| `GLFW_HAT_DOWN`\n`GLFW_HAT_LEFT_UP`    | `GLFW_HAT_LEFT` \\| `GLFW_HAT_UP`\n`GLFW_HAT_LEFT_DOWN`  | `GLFW_HAT_LEFT` \\| `GLFW_HAT_DOWN`\n\nThe diagonal directions are bitwise combinations of the primary (up, right, down\nand left) directions and you can test for these individually by ANDing it with\nthe corresponding direction.\n\n@code\nif (hats[2] & GLFW_HAT_RIGHT)\n{\n    // State of hat 2 could be right-up, right or right-down\n}\n@endcode\n\nFor backward compatibility with earlier versions that did not have @ref\nglfwGetJoystickHats, all hats are by default also included in the button array.\nSee the reference documentation for @ref glfwGetJoystickButtons for details.\n\n\n@subsection joystick_name Joystick name\n\nThe human-readable, UTF-8 encoded name of a joystick is returned by @ref\nglfwGetJoystickName.  See the reference documentation for the lifetime of the\nreturned string.           \n\n@code\nconst char* name = glfwGetJoystickName(GLFW_JOYSTICK_4);\n@endcode\n\nJoystick names are not guaranteed to be unique.  Two joysticks of the same model\nand make may have the same name.  Only the [joystick token](@ref joysticks) is\nguaranteed to be unique, and only until that joystick is disconnected.\n\n\n@subsection joystick_event Joystick configuration changes\n\nIf you wish to be notified when a joystick is connected or disconnected, set\na joystick callback.\n\n@code\nglfwSetJoystickCallback(joystick_callback);\n@endcode\n\nThe callback function receives the ID of the joystick that has been connected\nand disconnected and the event that occurred.\n\n@code\nvoid joystick_callback(int jid, int event)\n{\n    if (event == GLFW_CONNECTED)\n    {\n        // The joystick was connected\n    }\n    else if (event == GLFW_DISCONNECTED)\n    {\n        // The joystick was disconnected\n    }\n}\n@endcode\n\nFor joystick connection and disconnection events to be delivered on all\nplatforms, you need to call one of the [event processing](@ref events)\nfunctions.  Joystick disconnection may also be detected and the callback\ncalled by joystick functions.  The function will then return whatever it\nreturns for a disconnected joystick.\n\n\n@subsection gamepad Gamepad input\n\nThe joystick functions provide unlabeled axes, buttons and hats, with no\nindication of where they are located on the device.  Their order may also vary\nbetween platforms even with the same device.\n\nTo solve this problem the SDL community crowdsourced the\n[SDL_GameControllerDB](https://github.com/gabomdq/SDL_GameControllerDB) project,\na database of mappings from many different devices to an Xbox-like gamepad.\n\nGLFW supports this mapping format and contains a copy of the mappings\navailable at the time of release.  See @ref gamepad_mapping for how to update\nthis at runtime.  Mappings will be assigned to joysticks automatically any time\na joystick is connected or the mappings are updated.\n\nYou can check whether a joystick is both present and has a gamepad mapping with\n@ref glfwJoystickIsGamepad.\n\n@code\nif (glfwJoystickIsGamepad(GLFW_JOYSTICK_2))\n{\n    // Use as gamepad\n}\n@endcode\n\nIf you are only interested in gamepad input you can use this function instead of\n@ref glfwJoystickPresent.\n\nYou can query the human-readable name provided by the gamepad mapping with @ref\nglfwGetGamepadName.  This may or may not be the same as the\n[joystick name](@ref joystick_name).\n\n@code\nconst char* name = glfwGetGamepadName(GLFW_JOYSTICK_7);\n@endcode\n\nTo retrieve the gamepad state of a joystick, call @ref glfwGetGamepadState.\n\n@code\nGLFWgamepadstate state;\n\nif (glfwGetGamepadState(GLFW_JOYSTICK_3, &state))\n{\n    if (state.buttons[GLFW_GAMEPAD_BUTTON_A])\n    {\n        input_jump();\n    }\n\n    input_speed(state.axes[GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER]);\n}\n@endcode\n\nThe @ref GLFWgamepadstate struct has two arrays; one for button states and one\nfor axis states.  The values for each button and axis are the same as for the\n@ref glfwGetJoystickButtons and @ref glfwGetJoystickAxes functions, i.e.\n`GLFW_PRESS` or `GLFW_RELEASE` for buttons and -1.0 to 1.0 inclusive for axes.\n\nThe sizes of the arrays and the positions within each array are fixed.\n\nThe [button indices](@ref gamepad_buttons) are `GLFW_GAMEPAD_BUTTON_A`,\n`GLFW_GAMEPAD_BUTTON_B`, `GLFW_GAMEPAD_BUTTON_X`, `GLFW_GAMEPAD_BUTTON_Y`,\n`GLFW_GAMEPAD_BUTTON_LEFT_BUMPER`, `GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER`,\n`GLFW_GAMEPAD_BUTTON_BACK`, `GLFW_GAMEPAD_BUTTON_START`,\n`GLFW_GAMEPAD_BUTTON_GUIDE`, `GLFW_GAMEPAD_BUTTON_LEFT_THUMB`,\n`GLFW_GAMEPAD_BUTTON_RIGHT_THUMB`, `GLFW_GAMEPAD_BUTTON_DPAD_UP`,\n`GLFW_GAMEPAD_BUTTON_DPAD_RIGHT`, `GLFW_GAMEPAD_BUTTON_DPAD_DOWN` and\n`GLFW_GAMEPAD_BUTTON_DPAD_LEFT`.\n\nFor those who prefer, there are also the `GLFW_GAMEPAD_BUTTON_CROSS`,\n`GLFW_GAMEPAD_BUTTON_CIRCLE`, `GLFW_GAMEPAD_BUTTON_SQUARE` and\n`GLFW_GAMEPAD_BUTTON_TRIANGLE` aliases for the A, B, X and Y button indices.\n\nThe [axis indices](@ref gamepad_axes) are `GLFW_GAMEPAD_AXIS_LEFT_X`,\n`GLFW_GAMEPAD_AXIS_LEFT_Y`, `GLFW_GAMEPAD_AXIS_RIGHT_X`,\n`GLFW_GAMEPAD_AXIS_RIGHT_Y`, `GLFW_GAMEPAD_AXIS_LEFT_TRIGGER` and\n`GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER`.\n\nThe `GLFW_GAMEPAD_BUTTON_LAST` and `GLFW_GAMEPAD_AXIS_LAST` constants equal\nthe largest available index for each array.\n\n\n@subsection gamepad_mapping Gamepad mappings\n\nGLFW contains a copy of the mappings available in\n[SDL_GameControllerDB](https://github.com/gabomdq/SDL_GameControllerDB) at the\ntime of release.  Newer ones can be added at runtime with @ref\nglfwUpdateGamepadMappings.\n\n@code\nconst char* mappings = load_file_contents(\"gamecontrollerdb.txt\");\n\nglfwUpdateGamepadMappings(mappings);\n@endcode\n\nThis function supports everything from single lines up to and including the\nunmodified contents of the whole `gamecontrollerdb.txt` file.\n\nBelow is a description of the mapping format.  Please keep in mind that __this\ndescription is not authoritative__.  The format is defined by the SDL and\nSDL_GameControllerDB projects and their documentation and code takes precedence.\n\nEach mapping is a single line of comma-separated values describing the GUID,\nname and layout of the gamepad.  Lines that do not begin with a hexadecimal\ndigit are ignored.\n\nThe first value is always the gamepad GUID, a 32 character long hexadecimal\nstring that typically identifies its make, model, revision and the type of\nconnection to the computer.  When this information is not available, the GUID is\ngenerated using the gamepad name.  GLFW uses the SDL 2.0.5+ GUID format but can\nconvert from the older formats.\n\nThe second value is always the human-readable name of the gamepad.\n\nAll subsequent values are in the form `<field>:<value>` and describe the layout\nof the mapping.  These fields may not all be present and may occur in any order.\n\nThe button fields are `a`, `b`, `c`, `d`, `back`, `start`, `guide`, `dpup`,\n`dpright`, `dpdown`, `dpleft`, `leftshoulder`, `rightshoulder`, `leftstick` and\n`rightstick`.\n\nThe axis fields are `leftx`, `lefty`, `rightx`, `righty`, `lefttrigger` and\n`righttrigger`.\n\nThe value of an axis or button field can be a joystick button, a joystick axis,\na hat bitmask or empty.  Joystick buttons are specified as `bN`, for example\n`b2` for the third button.  Joystick axes are specified as `aN`, for example\n`a7` for the eighth button.  Joystick hat bit masks are specified as `hN.N`, for\nexample `h0.8` for left on the first hat.  More than one bit may be set in the\nmask.\n\nThe hat bit mask match the [hat states](@ref hat_state) in the joystick\nfunctions.\n\nThere is also the special `platform` field that specifies which platform the\nmapping is valid for.  Possible values are `Windows`, `Mac OS X` and `Linux`.\n\nBelow is an example of what a gamepad mapping might look like.  It is the\none built into GLFW for Xbox controllers accessed via the XInput API on Windows.\nThis example has been broken into several lines to fit on the page, but real\ngamepad mappings must be a single line.\n\n@code{.unparsed}\n78696e70757401000000000000000000,XInput Gamepad (GLFW),platform:Windows,a:b0,\nb:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,\nrightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,\nrighttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\n@endcode\n\n@note GLFW does not yet support the range and inversion modifiers `+`, `-` and\n`~` that were recently added to SDL.\n\n\n@section time Time input\n\nGLFW provides high-resolution time input, in seconds, with @ref glfwGetTime.\n\n@code\ndouble seconds = glfwGetTime();\n@endcode\n\nIt returns the number of seconds since the timer was started when the library\nwas initialized with @ref glfwInit.  The platform-specific time sources used\nusually have micro- or nanosecond resolution.\n\nYou can modify the reference time with @ref glfwSetTime.\n\n@code\nglfwSetTime(4.0);\n@endcode\n\nThis sets the timer to the specified time, in seconds.\n\nYou can also access the raw timer value, measured in 1&nbsp;/&nbsp;frequency\nseconds, with @ref glfwGetTimerValue.\n\n@code\nuint64_t value = glfwGetTimerValue();\n@endcode\n\nThe frequency of the raw timer varies depending on what time sources are\navailable on the machine.  You can query its frequency, in Hz, with @ref\nglfwGetTimerFrequency.\n\n@code\nuint64_t freqency = glfwGetTimerFrequency();\n@endcode\n\n\n@section clipboard Clipboard input and output\n\nIf the system clipboard contains a UTF-8 encoded string or if it can be\nconverted to one, you can retrieve it with @ref glfwGetClipboardString.  See the\nreference documentation for the lifetime of the returned string.\n\n@code\nconst char* text = glfwGetClipboardString(window);\nif (text)\n{\n    insert_text(text);\n}\n@endcode\n\nIf the clipboard is empty or if its contents could not be converted, `NULL` is\nreturned.\n\nThe contents of the system clipboard can be set to a UTF-8 encoded string with\n@ref glfwSetClipboardString.\n\n@code\nglfwSetClipboardString(window, \"A string with words in it\");\n@endcode\n\nThe clipboard functions take a window handle argument because some window\nsystems require a window to communicate with the system clipboard.  Any valid\nwindow may be used.\n\n\n@section path_drop Path drop input\n\nIf you wish to receive the paths of files and/or directories dropped on\na window, set a file drop callback.\n\n@code\nglfwSetDropCallback(window, drop_callback);\n@endcode\n\nThe callback function receives an array of paths encoded as UTF-8.\n\n@code\nvoid drop_callback(GLFWwindow* window, int count, const char** paths)\n{\n    int i;\n    for (i = 0;  i < count;  i++)\n        handle_dropped_file(paths[i]);\n}\n@endcode\n\nThe path array and its strings are only valid until the file drop callback\nreturns, as they may have been generated specifically for that event.  You need\nto make a deep copy of the array if you want to keep the paths.\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/internal.dox",
    "content": "/*!\n\n@page internals_guide Internal structure\n\n@tableofcontents\n\nThere are several interfaces inside GLFW.  Each interface has its own area of\nresponsibility and its own naming conventions.\n\n\n@section internals_public Public interface\n\nThe most well-known is the public interface, described in the glfw3.h header\nfile.  This is implemented in source files shared by all platforms and these\nfiles contain no platform-specific code.  This code usually ends up calling the\nplatform and internal interfaces to do the actual work.\n\nThe public interface uses the OpenGL naming conventions except with GLFW and\nglfw instead of GL and gl.  For struct members, where OpenGL sets no precedent,\nit use headless camel case.\n\nExamples: @ref glfwCreateWindow, @ref GLFWwindow, @ref GLFWvidmode.redBits,\n`GLFW_RED_BITS`\n\n\n@section internals_native Native interface\n\nThe [native interface](@ref native) is a small set of publicly available\nbut platform-specific functions, described in the glfw3native.h header file and\nused to gain access to the underlying window, context and (on some platforms)\ndisplay handles used by the platform interface.\n\nThe function names of the native interface are similar to those of the public\ninterface, but embeds the name of the interface that the returned handle is\nfrom.\n\nExamples: @ref glfwGetX11Window, @ref glfwGetWGLContext\n\n\n@section internals_internal Internal interface\n\nThe internal interface consists of utility functions used by all other\ninterfaces.  It is shared code implemented in the same shared source files as\nthe public and event interfaces.  The internal interface is described in the\ninternal.h header file.\n\nThe internal interface is in charge of GLFW's global data, which it stores in\na `_GLFWlibrary` struct named `_glfw`.\n\nThe internal interface uses the same style as the public interface, except all\nglobal names have a leading underscore.\n\nExamples: @ref _glfwIsValidContextConfig, @ref _GLFWwindow, `_glfw.currentRamp`\n\n\n@section internals_platform Platform interface\n\nThe platform interface implements all platform-specific operations as a service\nto the public interface.  This includes event processing.  The platform\ninterface is never directly called by application code and never directly calls\napplication-provided callbacks.  It is also prohibited from modifying the\nplatform-independent part of the internal structs.  Instead, it calls the event\ninterface when events interesting to GLFW are received.\n\nThe platform interface mirrors those parts of the public interface that needs to\nperform platform-specific operations on some or all platforms.  The are also\nnamed the same except that the glfw function prefix is replaced by\n_glfwPlatform.\n\nExamples: @ref _glfwPlatformCreateWindow\n\nThe platform interface also defines structs that contain platform-specific\nglobal and per-object state.  Their names mirror those of the internal\ninterface, except that an interface-specific suffix is added.\n\nExamples: `_GLFWwindowX11`, `_GLFWcontextWGL`\n\nThese structs are incorporated as members into the internal interface structs\nusing special macros that name them after the specific interface used.  This\nprevents shared code from accidentally using these members.\n\nExamples: `window.win32.handle`, `_glfw.x11.display`\n\n\n@section internals_event Event interface\n\nThe event interface is implemented in the same shared source files as the public\ninterface and is responsible for delivering the events it receives to the\napplication, either via callbacks, via window state changes or both.\n\nThe function names of the event interface use a `_glfwInput` prefix and the\nObjectEvent pattern.\n\nExamples: @ref _glfwInputWindowFocus, @ref _glfwInputCursorMotion\n\n\n@section internals_static Static functions\n\nStatic functions may be used by any interface and have no prefixes or suffixes.\nThese use headless camel case.\n\nExamples: `clearScrollOffsets`\n\n\n@section internals_config Configuration macros\n\nGLFW uses a number of configuration macros to select at compile time which\ninterfaces and code paths to use.  They are defined in the glfw_config.h header file,\nwhich is generated from the `glfw_config.h.in` file by CMake.\n\nConfiguration macros the same style as tokens in the public interface, except\nwith a leading underscore.\n\nExamples: `_GLFW_USE_HYBRID_HPG` \n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/intro.dox",
    "content": "/*! \n\n@page intro_guide Introduction to the API\n \n@tableofcontents\n\nThis guide introduces the basic concepts of GLFW and describes initialization,\nerror handling and API guarantees and limitations.  For a broad but shallow\ntutorial, see @ref quick_guide instead.  For details on a specific function in\nthis category, see the @ref init.\n\nThere are also guides for the other areas of GLFW.\n\n - @ref window_guide\n - @ref context_guide\n - @ref vulkan_guide\n - @ref monitor_guide\n - @ref input_guide\n\n\n@section intro_init Initialization and termination\n\nBefore most GLFW functions may be called, the library must be initialized.\nThis initialization checks what features are available on the machine,\nenumerates monitors and joysticks, initializes the timer and performs any\nrequired platform-specific initialization.\n\nOnly the following functions may be called before the library has been\nsuccessfully initialized, and only from the main thread.\n\n - @ref glfwGetVersion\n - @ref glfwGetVersionString\n - @ref glfwGetError\n - @ref glfwSetErrorCallback\n - @ref glfwInitHint\n - @ref glfwInitHintString\n - @ref glfwInit\n - @ref glfwTerminate\n\nCalling any other function before successful initialization will cause a @ref\nGLFW_NOT_INITIALIZED error.\n\n\n@subsection intro_init_init Initializing GLFW\n\nThe library is initialized with @ref glfwInit, which returns `GLFW_FALSE` if an\nerror occurred.\n\n@code\nif (!glfwInit())\n{\n    // Handle initialization failure\n}\n@endcode\n\nIf any part of initialization fails, any parts that succeeded are terminated as\nif @ref glfwTerminate had been called.  The library only needs to be initialized\nonce and additional calls to an already initialized library will return\n`GLFW_TRUE` immediately.\n\nOnce the library has been successfully initialized, it should be terminated\nbefore the application exits.  Modern systems are very good at freeing resources\nallocated by programs that exit, but GLFW sometimes has to change global system\nsettings and these might not be restored without termination.\n\n\n@subsection init_hints Initialization hints\n\nInitialization hints are set before @ref glfwInit and affect how the library\nbehaves until termination.  Integer type hints are set with @ref glfwInitHint\nand string type hints with @ref glfwInitHintString.\n\n@code\nglfwInitHint(GLFW_JOYSTICK_HAT_BUTTONS, GLFW_FALSE);\n@endcode\n\nThe values you set hints to are never reset by GLFW, but they only take effect\nduring initialization.  Once GLFW has been initialized, any values you set will\nbe ignored until the library is terminated and initialized again.\n\nSome hints are platform specific.  These may be set on any platform but they\nwill only affect their specific platform.  Other platforms will ignore them.\nSetting these hints requires no platform specific headers or functions.\n\n\n@subsubsection init_hints_shared Shared init hints\n\n@anchor GLFW_JOYSTICK_HAT_BUTTONS\n__GLFW_JOYSTICK_HAT_BUTTONS__ specifies whether to also expose joystick hats as\nbuttons, for compatibility with earlier versions of GLFW that did not have @ref\nglfwGetJoystickHats.  Set this with @ref glfwInitHint.\n\n\n@subsubsection init_hints_osx macOS specific init hints\n\n@anchor GLFW_COCOA_CHDIR_RESOURCES\n__GLFW_COCOA_CHDIR_RESOURCES__ specifies whether to set the current directory to\nthe application to the `Contents/Resources` subdirectory of the application's\nbundle, if present.  Set this with @ref glfwInitHint.\n\n@anchor GLFW_COCOA_MENUBAR\n__GLFW_COCOA_MENUBAR__ specifies whether to create a basic menu bar, either from\na nib or manually, when the first window is created, which is when AppKit is\ninitialized.  Set this with @ref glfwInitHint.\n\n\n@subsubsection init_hints_x11 X11 specific init hints\n\n@anchor GLFW_X11_WM_CLASS_NAME\n@anchor GLFW_X11_WM_CLASS_CLASS\n__GLFW_X11_WM_CLASS_NAME__ and __GLFW_X11_WM_CLASS_CLASS__ specifies the desired\nASCII encoded name and class parts of the ICCCM `WM_CLASS` hint for all windows.\nSet this with @ref glfwInitHintString.\n\n\n@subsubsection init_hints_values Supported and default values\n\nInitialization hint             | Default value | Supported values\n------------------------------- | ------------- | ----------------\n@ref GLFW_JOYSTICK_HAT_BUTTONS  | `GLFW_TRUE`   | `GLFW_TRUE` or `GLFW_FALSE`\n@ref GLFW_COCOA_CHDIR_RESOURCES | `GLFW_TRUE`   | `GLFW_TRUE` or `GLFW_FALSE`\n@ref GLFW_COCOA_MENUBAR         | `GLFW_TRUE`   | `GLFW_TRUE` or `GLFW_FALSE`\n@ref GLFW_X11_WM_CLASS_NAME     | `\"\"`          | An ASCII encoded `WM_CLASS` name\n@ref GLFW_X11_WM_CLASS_CLASS    | `\"\"`          | An ASCII encoded `WM_CLASS` class\n\n\n@subsection intro_init_terminate Terminating GLFW\n\nBefore your application exits, you should terminate the GLFW library if it has\nbeen initialized.  This is done with @ref glfwTerminate.\n\n@code\nglfwTerminate();\n@endcode\n\nThis will destroy any remaining window, monitor and cursor objects, restore any\nmodified gamma ramps, re-enable the screensaver if it had been disabled and free\nany other resources allocated by GLFW.\n\nOnce the library is terminated, it is as if it had never been initialized and\nyou will need to initialize it again before being able to use GLFW.  If the\nlibrary was not initialized or had already been terminated, it return\nimmediately. \n\n\n@section error_handling Error handling\n\nSome GLFW functions have return values that indicate an error, but this is often\nnot very helpful when trying to figure out what happened or why it occurred.\nOther functions have no return value reserved for errors, so error notification\nneeds a separate channel.  Finally, far from all GLFW functions have return\nvalues.\n\nThe last [error code](@ref errors) for the calling thread can be queried at any\ntime with @ref glfwGetError.\n\n@code\nint code = glfwGetError(NULL);\n\nif (code != GLFW_NO_ERROR)\n    handle_error(code);\n@endcode\n\nIf no error has occurred since the last call, @ref GLFW_NO_ERROR (zero) is\nreturned.  The error is cleared before the function returns.\n\nThe error code indicates the general category of the error.  Some error codes,\nsuch as @ref GLFW_NOT_INITIALIZED has only a single meaning, whereas others like\n@ref GLFW_PLATFORM_ERROR are used for many different errors.\n\nGLFW often has more information about an error than its general category.  You\ncan retrieve a UTF-8 encoded human-readable description along with the error\ncode.  If no error has occurred since the last call, the description is set to\n`NULL`.\n\n@code\nconst char* description;\nint code = glfwGetError(&description);\n\nif (description)\n    display_error_message(code, description);\n@endcode\n\nThe retrieved description string is only valid until the next error occurs.\nThis means you must make a copy of it if you want to keep it.\n\nYou can also set an error callback, which will be called each time an error\noccurs.  It is set with @ref glfwSetErrorCallback.\n\n@code\nglfwSetErrorCallback(error_callback);\n@endcode\n\nThe error callback receives the same error code and human-readable description\nreturned by @ref glfwGetError.\n\n@code\nvoid error_callback(int code, const char* description)\n{\n    display_error_message(code, description);\n}\n@endcode\n\nThe error callback is called after the error is stored, so calling @ref\nglfwGetError from within the error callback returns the same values as the\ncallback argument.\n\nThe description string passed to the callback is only valid until the error\ncallback returns.  This means you must make a copy of it if you want to keep it.\n\n__Reported errors are never fatal.__  As long as GLFW was successfully\ninitialized, it will remain initialized and in a safe state until terminated\nregardless of how many errors occur.  If an error occurs during initialization\nthat causes @ref glfwInit to fail, any part of the library that was initialized\nwill be safely terminated.\n\nDo not rely on a currently invalid call to generate a specific error, as in the\nfuture that same call may generate a different error or become valid.\n\n\n@section coordinate_systems Coordinate systems\n\nGLFW has two primary coordinate systems: the _virtual screen_ and the window\n_client area_ or _content area_.  Both use the same unit: _virtual screen\ncoordinates_, or just _screen coordinates_, which don't necessarily correspond\nto pixels.\n\n<img src=\"spaces.svg\" width=\"90%\" />\n\nBoth the virtual screen and the client area coordinate systems have the X-axis\npointing to the right and the Y-axis pointing down.\n\nWindow and monitor positions are specified as the position of the upper-left\ncorners of their content areas relative to the virtual screen, while cursor\npositions are specified relative to a window's client area.\n\nBecause the origin of the window's client area coordinate system is also the\npoint from which the window position is specified, you can translate client area\ncoordinates to the virtual screen by adding the window position.  The window\nframe, when present, extends out from the client area but does not affect the\nwindow position.\n\nAlmost all positions and sizes in GLFW are measured in screen coordinates\nrelative to one of the two origins above.  This includes cursor positions,\nwindow positions and sizes, window frame sizes, monitor positions and video mode\nresolutions.\n\nTwo exceptions are the [monitor physical size](@ref monitor_size), which is\nmeasured in millimetres, and [framebuffer size](@ref window_fbsize), which is\nmeasured in pixels.\n\nPixels and screen coordinates may map 1:1 on your machine, but they won't on\nevery other machine, for example on a Mac with a Retina display.  The ratio\nbetween screen coordinates and pixels may also change at run-time depending on\nwhich monitor the window is currently considered to be on.\n\n\n@section guarantees_limitations Guarantees and limitations\n\nThis section describes the conditions under which GLFW can be expected to\nfunction, barring bugs in the operating system or drivers.  Use of GLFW outside\nof these limits may work on some platforms, or on some machines, or some of the\ntime, or on some versions of GLFW, but it may break at any time and this will\nnot be considered a bug.\n\n\n@subsection lifetime Pointer lifetimes\n\nGLFW will never free any pointer you provide to it and you must never free any\npointer it provides to you.\n\nMany GLFW functions return pointers to dynamically allocated structures, strings\nor arrays, and some callbacks are provided with strings or arrays.  These are\nalways managed by GLFW and should never be freed by the application.  The\nlifetime of these pointers is documented for each GLFW function and callback.\nIf you need to keep this data, you must copy it before its lifetime expires.\n\nMany GLFW functions accept pointers to structures or strings allocated by the\napplication.  These are never freed by GLFW and are always the responsibility of\nthe application.  If GLFW needs to keep the data in these structures or strings,\nit is copied before the function returns.\n\nPointer lifetimes are guaranteed not to be shortened in future minor or patch\nreleases.\n\n\n@subsection reentrancy Reentrancy\n\nGLFW event processing and object destruction are not reentrant.  This means that\nthe following functions must not be called from any callback function:\n\n - @ref glfwDestroyWindow\n - @ref glfwDestroyCursor\n - @ref glfwPollEvents\n - @ref glfwWaitEvents\n - @ref glfwWaitEventsTimeout\n - @ref glfwTerminate\n\nThese functions may be made reentrant in future minor or patch releases, but\nfunctions not on this list will not be made non-reentrant.\n\n\n@subsection thread_safety Thread safety\n\nMost GLFW functions must only be called from the main thread (the thread that\ncalls main), but some may be called from any thread once the library has been\ninitialized.  Before initialization the whole library is thread-unsafe.\n\nThe reference documentation for every GLFW function states whether it is limited\nto the main thread.                                                        \n\nInitialization, termination, event processing and the creation and\ndestruction of windows, cursors and OpenGL and OpenGL ES contexts are all\nrestricted to the main thread due to limitations of one or several platforms.\n\nBecause event processing must be performed on the main thread, all callbacks\nexcept for the error callback will only be called on that thread.  The error\ncallback may be called on any thread, as any GLFW function may generate errors.\n\nThe error code and description may be queried from any thread.\n\n - @ref glfwGetError\n\nEmpty events may be posted from any thread.\n\n - @ref glfwPostEmptyEvent\n\nThe window user pointer and close flag may be read and written from any thread,\nbut this is not synchronized by GLFW.\n\n - @ref glfwGetWindowUserPointer\n - @ref glfwSetWindowUserPointer\n - @ref glfwWindowShouldClose\n - @ref glfwSetWindowShouldClose\n\nThese functions for working with OpenGL and OpenGL ES contexts may be called\nfrom any thread, but the window object is not synchronized by GLFW.\n\n - @ref glfwMakeContextCurrent\n - @ref glfwGetCurrentContext\n - @ref glfwSwapBuffers\n - @ref glfwSwapInterval\n - @ref glfwExtensionSupported\n - @ref glfwGetProcAddress\n\nThe raw timer functions may be called from any thread.\n\n - @ref glfwGetTimerFrequency\n - @ref glfwGetTimerValue\n\nThe regular timer may be used from any thread, but reading and writing the timer\noffset is not synchronized by GLFW.\n\n - @ref glfwGetTime\n - @ref glfwSetTime\n\nLibrary version information may be queried from any thread.\n\n - @ref glfwGetVersion\n - @ref glfwGetVersionString\n\nAll Vulkan related functions may be called from any thread.\n\n - @ref glfwVulkanSupported\n - @ref glfwGetRequiredInstanceExtensions\n - @ref glfwGetInstanceProcAddress\n - @ref glfwGetPhysicalDevicePresentationSupport\n - @ref glfwCreateWindowSurface\n\nGLFW uses synchronization objects internally only to manage the per-thread\ncontext and error states.  Additional synchronization is left to the\napplication.\n\nFunctions that may currently be called from any thread will always remain so,\nbut functions that are currently limited to the main thread may be updated to\nallow calls from any thread in future releases.\n\n\n@subsection compatibility Version compatibility\n\nGLFW guarantees source and binary backward compatibility with earlier minor\nversions of the API.  This means that you can drop in a newer version of the\nlibrary and existing programs will continue to compile and existing binaries\nwill continue to run.\n\nOnce a function or constant has been added, the signature of that function or\nvalue of that constant will remain unchanged until the next major version of\nGLFW.  No compatibility of any kind is guaranteed between major versions.\n\nUndocumented behavior, i.e. behavior that is not described in the documentation,\nmay change at any time until it is documented.\n\nIf the reference documentation and the implementation differ, the reference\ndocumentation will almost always take precedence and the implementation will be\nfixed in the next release.  The reference documentation will also take\nprecedence over anything stated in a guide.\n\n\n@subsection event_order Event order\n\nThe order of arrival of related events is not guaranteed to be consistent\nacross platforms.  The exception is synthetic key and mouse button release\nevents, which are always delivered after the window defocus event.\n\n\n@section intro_version Version management\n\nGLFW provides mechanisms for identifying what version of GLFW your application\nwas compiled against as well as what version it is currently running against.\nIf you are loading GLFW dynamically (not just linking dynamically), you can use\nthis to verify that the library binary is compatible with your application.\n\n\n@subsection intro_version_compile Compile-time version\n\nThe compile-time version of GLFW is provided by the GLFW header with the\n`GLFW_VERSION_MAJOR`, `GLFW_VERSION_MINOR` and `GLFW_VERSION_REVISION` macros.\n\n@code\nprintf(\"Compiled against GLFW %i.%i.%i\\n\",\n       GLFW_VERSION_MAJOR,\n       GLFW_VERSION_MINOR,\n       GLFW_VERSION_REVISION);\n@endcode\n\n\n@subsection intro_version_runtime Run-time version\n\nThe run-time version can be retrieved with @ref glfwGetVersion, a function that\nmay be called regardless of whether GLFW is initialized.\n\n@code\nint major, minor, revision;\nglfwGetVersion(&major, &minor, &revision);\n\nprintf(\"Running against GLFW %i.%i.%i\\n\", major, minor, revision);\n@endcode\n\n\n@subsection intro_version_string Version string\n\nGLFW 3 also provides a compile-time generated version string that describes the\nversion, platform, compiler and any platform-specific compile-time options.\nThis is primarily intended for submitting bug reports, to allow developers to\nsee which code paths are enabled in a binary.\n\nThe version string is returned by @ref glfwGetVersionString, a function that may\nbe called regardless of whether GLFW is initialized.\n\n__Do not use the version string__ to parse the GLFW library version.  The @ref\nglfwGetVersion function already provides the version of the running library\nbinary.\n\nThe format of the string is as follows:\n - The version of GLFW\n - The name of the window system API\n - The name of the context creation API\n - Any additional options or APIs\n\nFor example, when compiling GLFW 3.0 with MinGW using the Win32 and WGL\nback ends, the version string may look something like this:\n\n@code\n3.0.0 Win32 WGL MinGW\n@endcode\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/main.dox",
    "content": "/*!\n\n@mainpage notitle\n\n@section main_intro Introduction\n\nGLFW is a free, Open Source, multi-platform library for OpenGL, OpenGL ES and\nVulkan application development.  It provides a simple, platform-independent API\nfor creating windows, contexts and surfaces, reading input, handling events, etc.\n\nSee @ref news_33 for highlights or the\n[version history](http://www.glfw.org/changelog.html) for details.\n\n@ref quick_guide is a guide for users new to GLFW.  It takes you through how to\nwrite a small but complete program.\n\nThere are guides for each section of the API:\n\n - @ref intro_guide – initialization, error handling and high-level design\n - @ref window_guide – creating and working with windows and framebuffers\n - @ref context_guide – working with OpenGL and OpenGL ES contexts\n - @ref vulkan_guide - working with Vulkan objects and extensions\n - @ref monitor_guide – enumerating and working with monitors and video modes\n - @ref input_guide – receiving events, polling and processing input\n\nOnce you have written a program, see @ref compile_guide and @ref build_guide.\n\nThe [reference documentation](modules.html) provides more detailed information\nabout specific functions.\n\n@ref moving_guide explains what has changed and how to update existing code to\nuse the new API.\n\nThere is a section on @ref guarantees_limitations for pointer lifetimes,\nreentrancy, thread safety, event order and backward and forward compatibility.\n\nThe [FAQ](http://www.glfw.org/faq.html) answers many common questions about the\ndesign, implementation and use of GLFW.\n\nFinally, @ref compat_guide explains what APIs, standards and protocols GLFW uses\nand what happens when they are not present on a given machine.\n\nThis documentation was generated with Doxygen.  The sources for it are available\nin both the [source distribution](http://www.glfw.org/download.html) and\n[GitHub repository](https://github.com/glfw/glfw).\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/monitor.dox",
    "content": "/*!\n\n@page monitor_guide Monitor guide\n\n@tableofcontents\n\nThis guide introduces the monitor related functions of GLFW.  For details on\na specific function in this category, see the @ref monitor.  There are also\nguides for the other areas of GLFW.\n\n - @ref intro_guide\n - @ref window_guide\n - @ref context_guide\n - @ref vulkan_guide\n - @ref input_guide\n\n\n@section monitor_object Monitor objects\n\nA monitor object represents a currently connected monitor and is represented as\na pointer to the [opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type\n@ref GLFWmonitor.  Monitor objects cannot be created or destroyed by the\napplication and retain their addresses until the monitors they represent are\ndisconnected or until the library is [terminated](@ref intro_init_terminate).\n\nEach monitor has a current video mode, a list of supported video modes,\na virtual position, a human-readable name, an estimated physical size and\na gamma ramp.  One of the monitors is the primary monitor.\n\nThe virtual position of a monitor is in\n[screen coordinates](@ref coordinate_systems) and, together with the current\nvideo mode, describes the viewports that the connected monitors provide into the\nvirtual desktop that spans them.\n\nTo see how GLFW views your monitor setup and its available video modes, run the\n`monitors` test program.\n\n\n@subsection monitor_monitors Retrieving monitors\n\nThe primary monitor is returned by @ref glfwGetPrimaryMonitor.  It is the user's\npreferred monitor and is usually the one with global UI elements like task bar\nor menu bar.\n\n@code\nGLFWmonitor* primary = glfwGetPrimaryMonitor();\n@endcode\n\nYou can retrieve all currently connected monitors with @ref glfwGetMonitors.\nSee the reference documentation for the lifetime of the returned array.\n\n@code\nint count;\nGLFWmonitor** monitors = glfwGetMonitors(&count);\n@endcode\n\nThe primary monitor is always the first monitor in the returned array, but other\nmonitors may be moved to a different index when a monitor is connected or\ndisconnected.\n\n\n@subsection monitor_event Monitor configuration changes\n\nIf you wish to be notified when a monitor is connected or disconnected, set\na monitor callback.\n\n@code\nglfwSetMonitorCallback(monitor_callback);\n@endcode\n\nThe callback function receives the handle for the monitor that has been\nconnected or disconnected and the event that occurred.\n\n@code\nvoid monitor_callback(GLFWmonitor* monitor, int event)\n{\n    if (event == GLFW_CONNECTED)\n    {\n        // The monitor was connected\n    }\n    else if (event == GLFW_DISCONNECTED)\n    {\n        // The monitor was disconnected\n    }\n}\n@endcode\n\nIf a monitor is disconnected, any windows that are full screen on it get forced\ninto windowed mode.\n\n\n@section monitor_properties Monitor properties\n\nEach monitor has a current video mode, a list of supported video modes,\na virtual position, a human-readable name, an estimated physical size and\na gamma ramp.\n\n\n@subsection monitor_modes Video modes\n\nGLFW generally does a good job selecting a suitable video mode when you create\na full screen window, change its video mode or or make a windowed one full\nscreen, but it is sometimes useful to know exactly which video modes are\nsupported.\n\nVideo modes are represented as @ref GLFWvidmode structures.  You can get an\narray of the video modes supported by a monitor with @ref glfwGetVideoModes.\nSee the reference documentation for the lifetime of the returned array.\n\n@code\nint count;\nGLFWvidmode* modes = glfwGetVideoModes(monitor, &count);\n@endcode\n\nTo get the current video mode of a monitor call @ref glfwGetVideoMode.  See the\nreference documentation for the lifetime of the returned pointer.\n\n@code\nconst GLFWvidmode* mode = glfwGetVideoMode(monitor);\n@endcode\n\nThe resolution of a video mode is specified in\n[screen coordinates](@ref coordinate_systems), not pixels.\n\n\n@subsection monitor_size Physical size\n\nThe physical size of a monitor in millimetres, or an estimation of it, can be\nretrieved with @ref glfwGetMonitorPhysicalSize.  This has no relation to its\ncurrent _resolution_, i.e. the width and height of its current\n[video mode](@ref monitor_modes).\n\n@code\nint widthMM, heightMM;\nglfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM);\n@endcode\n\nThis can, for example, be used together with the current video mode to calculate\nthe DPI of a monitor. \n\n@code\nconst double dpi = mode->width / (widthMM / 25.4);\n@endcode\n\n\n@subsection monitor_pos Virtual position\n\nThe position of the monitor on the virtual desktop, in\n[screen coordinates](@ref coordinate_systems), can be retrieved with @ref\nglfwGetMonitorPos.\n\n@code\nint xpos, ypos;\nglfwGetMonitorPos(monitor, &xpos, &ypos);\n@endcode\n\n\n@subsection monitor_name Human-readable name\n\nThe human-readable, UTF-8 encoded name of a monitor is returned by @ref\nglfwGetMonitorName.  See the reference documentation for the lifetime of the\nreturned string.\n\n@code\nconst char* name = glfwGetMonitorName(monitor);\n@endcode\n\nMonitor names are not guaranteed to be unique.  Two monitors of the same model\nand make may have the same name.  Only the monitor handle is guaranteed to be\nunique, and only until that monitor is disconnected.\n\n\n@subsection monitor_gamma Gamma ramp\n\nThe gamma ramp of a monitor can be set with @ref glfwSetGammaRamp, which accepts\na monitor handle and a pointer to a @ref GLFWgammaramp structure.\n\n@code\nGLFWgammaramp ramp;\nunsigned short red[256], green[256], blue[256];\n\nramp.size = 256;\nramp.red = red;\nramp.green = green;\nramp.blue = blue;\n\nfor (i = 0;  i < ramp.size;  i++)\n{\n    // Fill out gamma ramp arrays as desired\n}\n\nglfwSetGammaRamp(monitor, &ramp);\n@endcode\n\nThe gamma ramp data is copied before the function returns, so there is no need\nto keep it around once the ramp has been set.\n\nIt is recommended that your gamma ramp have the same size as the current gamma\nramp for that monitor.\n\nThe current gamma ramp for a monitor is returned by @ref glfwGetGammaRamp.  See\nthe reference documentation for the lifetime of the returned structure.\n\n@code\nconst GLFWgammaramp* ramp = glfwGetGammaRamp(monitor);\n@endcode\n\nIf you wish to set a regular gamma ramp, you can have GLFW calculate it for you\nfrom the desired exponent with @ref glfwSetGamma, which in turn calls @ref\nglfwSetGammaRamp with the resulting ramp.\n\n@code\nglfwSetGamma(monitor, 1.0);\n@endcode\n\nTo experiment with gamma correction via the @ref glfwSetGamma function, run the\n`gamma` test program.\n\n@note The software controlled gamma ramp is applied _in addition_ to the\nhardware gamma correction, which today is usually an approximation of sRGB\ngamma.  This means that setting a perfectly linear ramp, or gamma 1.0, will\nproduce the default (usually sRGB-like) behavior.\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/moving.dox",
    "content": "/*!\n\n@page moving_guide Moving from GLFW 2 to 3\n\n@tableofcontents\n\nThis is a transition guide for moving from GLFW 2 to 3.  It describes what has\nchanged or been removed, but does _not_ include\n[new features](@ref news) unless they are required when moving an existing code\nbase onto the new API.  For example, the new multi-monitor functions are\nrequired to create full screen windows with GLFW 3.\n\n\n@section moving_removed Changed and removed features\n\n@subsection moving_renamed_files Renamed library and header file\n\nThe GLFW 3 header is named @ref glfw3.h and moved to the `GLFW` directory, to\navoid collisions with the headers of other major versions.  Similarly, the GLFW\n3 library is named `glfw3,` except when it's installed as a shared library on\nUnix-like systems, where it uses the\n[soname](https://en.wikipedia.org/wiki/soname) `libglfw.so.3`.\n\n@par Old syntax\n@code\n#include <GL/glfw.h>\n@endcode\n\n@par New syntax\n@code\n#include <GLFW/glfw3.h>\n@endcode\n\n\n@subsection moving_threads Removal of threading functions\n\nThe threading functions have been removed, including the per-thread sleep\nfunction.  They were fairly primitive, under-used, poorly integrated and took\ntime away from the focus of GLFW (i.e.  context, input and window).  There are\nbetter threading libraries available and native threading support is available\nin both [C++11](http://en.cppreference.com/w/cpp/thread) and\n[C11](http://en.cppreference.com/w/c/thread), both of which are gaining\ntraction. \n\nIf you wish to use the C++11 or C11 facilities but your compiler doesn't yet\nsupport them, see the\n[TinyThread++](https://gitorious.org/tinythread/tinythreadpp) and\n[TinyCThread](https://github.com/tinycthread/tinycthread) projects created by\nthe original author of GLFW.  These libraries implement a usable subset of the\nthreading APIs in C++11 and C11, and in fact some GLFW 3 test programs use\nTinyCThread.\n\nHowever, GLFW 3 has better support for _use from multiple threads_ than GLFW\n2 had.  Contexts can be made current on any thread, although only a single\nthread at a time, and the documentation explicitly states which functions may be\nused from any thread and which must only be used from the main thread.\n\n@par Removed functions\n`glfwSleep`, `glfwCreateThread`, `glfwDestroyThread`, `glfwWaitThread`,\n`glfwGetThreadID`, `glfwCreateMutex`, `glfwDestroyMutex`, `glfwLockMutex`,\n`glfwUnlockMutex`, `glfwCreateCond`, `glfwDestroyCond`, `glfwWaitCond`,\n`glfwSignalCond`, `glfwBroadcastCond` and `glfwGetNumberOfProcessors`.\n\n@par Removed types\n`GLFWthreadfun`\n\n\n@subsection moving_image Removal of image and texture loading\n\nThe image and texture loading functions have been removed.  They only supported\nthe Targa image format, making them mostly useful for beginner level examples.\nTo become of sufficiently high quality to warrant keeping them in GLFW 3, they\nwould need not only to support other formats, but also modern extensions to\nOpenGL texturing.  This would either add a number of external\ndependencies (libjpeg, libpng, etc.), or force GLFW to ship with inline versions\nof these libraries. \n\nAs there already are libraries doing this, it is unnecessary both to duplicate\nthe work and to tie the duplicate to GLFW.  The resulting library would also be\nplatform-independent, as both OpenGL and stdio are available wherever GLFW is.\n\n@par Removed functions\n`glfwReadImage`, `glfwReadMemoryImage`, `glfwFreeImage`, `glfwLoadTexture2D`,\n`glfwLoadMemoryTexture2D` and `glfwLoadTextureImage2D`.\n\n\n@subsection moving_stdcall Removal of GLFWCALL macro\n\nThe `GLFWCALL` macro, which made callback functions use\n[__stdcall](http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) on Windows,\nhas been removed.  GLFW is written in C, not Pascal.  Removing this macro means\nthere's one less thing for application programmers to remember, i.e. the\nrequirement to mark all callback functions with `GLFWCALL`.  It also simplifies\nthe creation of DLLs and DLL link libraries, as there's no need to explicitly\ndisable `@n` entry point suffixes. \n\n@par Old syntax\n@code\nvoid GLFWCALL callback_function(...);\n@endcode\n\n@par New syntax\n@code\nvoid callback_function(...);\n@endcode\n\n\n@subsection moving_window_handles Window handle parameters\n\nBecause GLFW 3 supports multiple windows, window handle parameters have been\nadded to all window-related GLFW functions and callbacks.  The handle of\na newly created window is returned by @ref glfwCreateWindow (formerly\n`glfwOpenWindow`).  Window handles are pointers to the\n[opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type @ref GLFWwindow.\n\n@par Old syntax\n@code\nglfwSetWindowTitle(\"New Window Title\");\n@endcode\n\n@par New syntax\n@code\nglfwSetWindowTitle(window, \"New Window Title\");\n@endcode\n\n\n@subsection moving_monitor Explicit monitor selection\n\nGLFW 3 provides support for multiple monitors.  To request a full screen mode window,\ninstead of passing `GLFW_FULLSCREEN` you specify which monitor you wish the\nwindow to use.  The @ref glfwGetPrimaryMonitor function returns the monitor that\nGLFW 2 would have selected, but there are many other\n[monitor functions](@ref monitor_guide).  Monitor handles are pointers to the\n[opaque](https://en.wikipedia.org/wiki/Opaque_data_type) type @ref GLFWmonitor.\n\n@par Old basic full screen\n@code\nglfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_FULLSCREEN);\n@endcode\n\n@par New basic full screen\n@code\nwindow = glfwCreateWindow(640, 480, \"My Window\", glfwGetPrimaryMonitor(), NULL);\n@endcode\n\n@note The framebuffer bit depth parameters of `glfwOpenWindow` have been turned\ninto [window hints](@ref window_hints), but as they have been given\n[sane defaults](@ref window_hints_values) you rarely need to set these hints.\n\n\n@subsection moving_autopoll Removal of automatic event polling\n\nGLFW 3 does not automatically poll for events in @ref glfwSwapBuffers, meaning\nyou need to call @ref glfwPollEvents or @ref glfwWaitEvents yourself.  Unlike\nbuffer swap, which acts on a single window, the event processing functions act\non all windows at once.\n\n@par Old basic main loop\n@code\nwhile (...)\n{\n    // Process input\n    // Render output\n    glfwSwapBuffers();\n}\n@endcode\n\n@par New basic main loop\n@code\nwhile (...)\n{\n    // Process input\n    // Render output\n    glfwSwapBuffers(window);\n    glfwPollEvents();\n}\n@endcode\n\n\n@subsection moving_context Explicit context management\n\nEach GLFW 3 window has its own OpenGL context and only you, the application\nprogrammer, can know which context should be current on which thread at any\ngiven time.  Therefore, GLFW 3 leaves that decision to you.\n\nThis means that you need to call @ref glfwMakeContextCurrent after creating\na window before you can call any OpenGL functions.\n\n\n@subsection moving_hidpi Separation of window and framebuffer sizes\n\nWindow positions and sizes now use screen coordinates, which may not be the same\nas pixels on machines with high-DPI monitors.  This is important as OpenGL uses\npixels, not screen coordinates.  For example, the rectangle specified with\n`glViewport` needs to use pixels.  Therefore, framebuffer size functions have\nbeen added.  You can retrieve the size of the framebuffer of a window with @ref\nglfwGetFramebufferSize function.  A framebuffer size callback has also been\nadded, which can be set with @ref glfwSetFramebufferSizeCallback.\n\n@par Old basic viewport setup\n@code\nglfwGetWindowSize(&width, &height);\nglViewport(0, 0, width, height);\n@endcode\n\n@par New basic viewport setup\n@code\nglfwGetFramebufferSize(window, &width, &height);\nglViewport(0, 0, width, height);\n@endcode\n\n\n@subsection moving_window_close Window closing changes\n\nThe `GLFW_OPENED` window parameter has been removed.  As long as the window has\nnot been destroyed, whether through @ref glfwDestroyWindow or @ref\nglfwTerminate, the window is \"open\".\n\nA user attempting to close a window is now just an event like any other.  Unlike\nGLFW 2, windows and contexts created with GLFW 3 will never be destroyed unless\nyou choose them to be.  Each window now has a close flag that is set to\n`GLFW_TRUE` when the user attempts to close that window.  By default, nothing else\nhappens and the window stays visible.  It is then up to you to either destroy\nthe window, take some other action or ignore the request.\n\nYou can query the close flag at any time with @ref glfwWindowShouldClose and set\nit at any time with @ref glfwSetWindowShouldClose.\n\n@par Old basic main loop\n@code\nwhile (glfwGetWindowParam(GLFW_OPENED))\n{\n    ...\n}\n@endcode\n\n@par New basic main loop\n@code\nwhile (!glfwWindowShouldClose(window))\n{\n    ...\n}\n@endcode\n\nThe close callback no longer returns a value.  Instead, it is called after the\nclose flag has been set so it can override its value, if it chooses to, before\nevent processing completes.  You may however not call @ref glfwDestroyWindow\nfrom the close callback (or any other window related callback).\n\n@par Old syntax\n@code\nint GLFWCALL window_close_callback(void);\n@endcode\n\n@par New syntax\n@code\nvoid window_close_callback(GLFWwindow* window);\n@endcode\n\n@note GLFW never clears the close flag to `GLFW_FALSE`, meaning you can use it\nfor other reasons to close the window as well, for example the user choosing\nQuit from an in-game menu.\n\n\n@subsection moving_hints Persistent window hints\n\nThe `glfwOpenWindowHint` function has been renamed to @ref glfwWindowHint.\n\nWindow hints are no longer reset to their default values on window creation, but\ninstead retain their values until modified by @ref glfwWindowHint or @ref\nglfwDefaultWindowHints, or until the library is terminated and re-initialized.\n\n\n@subsection moving_video_modes Video mode enumeration\n\nVideo mode enumeration is now per-monitor.  The @ref glfwGetVideoModes function\nnow returns all available modes for a specific monitor instead of requiring you\nto guess how large an array you need.  The `glfwGetDesktopMode` function, which\nhad poorly defined behavior, has been replaced by @ref glfwGetVideoMode, which\nreturns the current mode of a monitor.\n\n\n@subsection moving_char_up Removal of character actions\n\nThe action parameter of the [character callback](@ref GLFWcharfun) has been\nremoved.  This was an artefact of the origin of GLFW, i.e. being developed in\nEnglish by a Swede.  However, many keyboard layouts require more than one key to\nproduce characters with diacritical marks. Even the Swedish keyboard layout\nrequires this for uncommon cases like ü.\n\n@par Old syntax\n@code\nvoid GLFWCALL character_callback(int character, int action);\n@endcode\n\n@par New syntax\n@code\nvoid character_callback(GLFWwindow* window, int character);\n@endcode\n\n\n@subsection moving_cursorpos Cursor position changes\n\nThe `glfwGetMousePos` function has been renamed to @ref glfwGetCursorPos,\n`glfwSetMousePos` to @ref glfwSetCursorPos and `glfwSetMousePosCallback` to @ref\nglfwSetCursorPosCallback.\n\nThe cursor position is now `double` instead of `int`, both for the direct\nfunctions and for the callback.  Some platforms can provide sub-pixel cursor\nmovement and this data is now passed on to the application where available.  On\nplatforms where this is not provided, the decimal part is zero.\n\nGLFW 3 only allows you to position the cursor within a window using @ref\nglfwSetCursorPos (formerly `glfwSetMousePos`) when that window is active.\nUnless the window is active, the function fails silently.\n\n\n@subsection moving_wheel Wheel position replaced by scroll offsets\n\nThe `glfwGetMouseWheel` function has been removed.  Scrolling is the input of\noffsets and has no absolute position.  The mouse wheel callback has been\nreplaced by a [scroll callback](@ref GLFWscrollfun) that receives\ntwo-dimensional floating point scroll offsets.  This allows you to receive\nprecise scroll data from for example modern touchpads.\n\n@par Old syntax\n@code\nvoid GLFWCALL mouse_wheel_callback(int position);\n@endcode\n\n@par New syntax\n@code\nvoid scroll_callback(GLFWwindow* window, double xoffset, double yoffset);\n@endcode\n\n@par Removed functions\n`glfwGetMouseWheel`\n\n\n@subsection moving_repeat Key repeat action\n\nThe `GLFW_KEY_REPEAT` enable has been removed and key repeat is always enabled\nfor both keys and characters.  A new key action, `GLFW_REPEAT`, has been added\nto allow the [key callback](@ref GLFWkeyfun) to distinguish an initial key press\nfrom a repeat.  Note that @ref glfwGetKey still returns only `GLFW_PRESS` or\n`GLFW_RELEASE`.\n\n\n@subsection moving_keys Physical key input\n\nGLFW 3 key tokens map to physical keys, unlike in GLFW 2 where they mapped to\nthe values generated by the current keyboard layout.  The tokens are named\naccording to the values they would have using the standard US layout, but this\nis only a convenience, as most programmers are assumed to know that layout.\nThis means that (for example) `GLFW_KEY_LEFT_BRACKET` is always a single key and\nis the same key in the same place regardless of what keyboard layouts the users\nof your program has.\n\nThe key input facility was never meant for text input, although using it that\nway worked slightly better in GLFW 2.  If you were using it to input text, you\nshould be using the character callback instead, on both GLFW 2 and 3.  This will\ngive you the characters being input, as opposed to the keys being pressed.\n\nGLFW 3 has key tokens for all keys on a standard 105 key keyboard, so instead of\nhaving to remember whether to check for `'a'` or `'A'`, you now check for\n`GLFW_KEY_A`.\n\n\n@subsection moving_joystick Joystick function changes\n\nThe `glfwGetJoystickPos` function has been renamed to @ref glfwGetJoystickAxes.\n\nThe `glfwGetJoystickParam` function and the `GLFW_PRESENT`, `GLFW_AXES` and\n`GLFW_BUTTONS` tokens have been replaced by the @ref glfwJoystickPresent\nfunction as well as axis and button counts returned by the @ref\nglfwGetJoystickAxes and @ref glfwGetJoystickButtons functions.\n\n\n@subsection moving_mbcs Win32 MBCS support\n\nThe Win32 port of GLFW 3 will not compile in\n[MBCS mode](http://msdn.microsoft.com/en-us/library/5z097dxa.aspx).\nHowever, because the use of the Unicode version of the Win32 API doesn't affect\nthe process as a whole, but only those windows created using it, it's perfectly\npossible to call MBCS functions from other parts of the same application.\nTherefore, even if an application using GLFW has MBCS mode code, there's no need\nfor GLFW itself to support it.\n\n\n@subsection moving_windows Support for versions of Windows older than XP\n\nAll explicit support for version of Windows older than XP has been removed.\nThere is no code that actively prevents GLFW 3 from running on these earlier\nversions, but it uses Win32 functions that those versions lack.\n\nWindows XP was released in 2001, and by now (January 2015) it has not only\nreplaced almost all earlier versions of Windows, but is itself rapidly being\nreplaced by Windows 7 and 8.  The MSDN library doesn't even provide\ndocumentation for version older than Windows 2000, making it difficult to\nmaintain compatibility with these versions even if it was deemed worth the\neffort.\n\nThe Win32 API has also not stood still, and GLFW 3 uses many functions only\npresent on Windows XP or later.  Even supporting an OS as new as XP (new\nfrom the perspective of GLFW 2, which still supports Windows 95) requires\nruntime checking for a number of functions that are present only on modern\nversion of Windows.\n\n\n@subsection moving_syskeys Capture of system-wide hotkeys\n\nThe ability to disable and capture system-wide hotkeys like Alt+Tab has been\nremoved.  Modern applications, whether they're games, scientific visualisations\nor something else, are nowadays expected to be good desktop citizens and allow\nthese hotkeys to function even when running in full screen mode.\n\n\n@subsection moving_terminate Automatic termination\n\nGLFW 3 does not register @ref glfwTerminate with `atexit` at initialization,\nbecause `exit` calls registered functions from the calling thread and while it\nis permitted to call `exit` from any thread, @ref glfwTerminate must only be\ncalled from the main thread.\n\nTo release all resources allocated by GLFW, you should call @ref glfwTerminate\nyourself, from the main thread, before the program terminates.  Note that this\ndestroys all windows not already destroyed with @ref glfwDestroyWindow,\ninvalidating any window handles you may still have.\n\n\n@subsection moving_glu GLU header inclusion\n\nGLFW 3 does not by default include the GLU header and GLU itself has been\ndeprecated by [Khronos](https://en.wikipedia.org/wiki/Khronos_Group).  __New\nprojects should not use GLU__, but if you need it for legacy code that\nhas been moved to GLFW 3, you can request that the GLFW header includes it by\ndefining @ref GLFW_INCLUDE_GLU before the inclusion of the GLFW header.\n\n@par Old syntax\n@code\n#include <GL/glfw.h>\n@endcode\n\n@par New syntax\n@code\n#define GLFW_INCLUDE_GLU\n#include <GLFW/glfw3.h>\n@endcode\n\nThere are many libraries that offer replacements for the functionality offered\nby GLU.  For the matrix helper functions, see math libraries like\n[GLM](https://github.com/g-truc/glm) (for C++),\n[linmath.h](https://github.com/datenwolf/linmath.h) (for C) and others.  For the\ntessellation functions, see for example\n[libtess2](https://github.com/memononen/libtess2).\n\n\n@section moving_tables Name change tables\n\n\n@subsection moving_renamed_functions Renamed functions\n\n| GLFW 2                      | GLFW 3                        | Notes |\n| --------------------------- | ----------------------------- | ----- |\n| `glfwOpenWindow`            | @ref glfwCreateWindow         | All channel bit depths are now hints\n| `glfwCloseWindow`           | @ref glfwDestroyWindow        |       |\n| `glfwOpenWindowHint`        | @ref glfwWindowHint           | Now accepts all `GLFW_*_BITS` tokens |\n| `glfwEnable`                | @ref glfwSetInputMode         |       |\n| `glfwDisable`               | @ref glfwSetInputMode         |       |\n| `glfwGetMousePos`           | @ref glfwGetCursorPos         |       |\n| `glfwSetMousePos`           | @ref glfwSetCursorPos         |       |\n| `glfwSetMousePosCallback`   | @ref glfwSetCursorPosCallback |       |\n| `glfwSetMouseWheelCallback` | @ref glfwSetScrollCallback    | Accepts two-dimensional scroll offsets as doubles |\n| `glfwGetJoystickPos`        | @ref glfwGetJoystickAxes      |       |\n| `glfwGetWindowParam`        | @ref glfwGetWindowAttrib      |       |\n| `glfwGetGLVersion`          | @ref glfwGetWindowAttrib      | Use `GLFW_CONTEXT_VERSION_MAJOR`, `GLFW_CONTEXT_VERSION_MINOR` and `GLFW_CONTEXT_REVISION` |\n| `glfwGetDesktopMode`        | @ref glfwGetVideoMode         | Returns the current mode of a monitor |\n| `glfwGetJoystickParam`      | @ref glfwJoystickPresent      | The axis and button counts are provided by @ref glfwGetJoystickAxes and @ref glfwGetJoystickButtons |\n\n\n@subsection moving_renamed_types Renamed types\n\n| GLFW 2              | GLFW 3                | Notes |\n| ------------------- | --------------------- |       |\n| `GLFWmousewheelfun` | @ref GLFWscrollfun    |       |\n| `GLFWmouseposfun`   | @ref GLFWcursorposfun |       |\n\n\n@subsection moving_renamed_tokens Renamed tokens\n\n| GLFW 2                      | GLFW 3                       | Notes |\n| --------------------------- | ---------------------------- | ----- |\n| `GLFW_OPENGL_VERSION_MAJOR` | `GLFW_CONTEXT_VERSION_MAJOR` | Renamed as it applies to OpenGL ES as well |\n| `GLFW_OPENGL_VERSION_MINOR` | `GLFW_CONTEXT_VERSION_MINOR` | Renamed as it applies to OpenGL ES as well |\n| `GLFW_FSAA_SAMPLES`         | `GLFW_SAMPLES`               | Renamed to match the OpenGL API |\n| `GLFW_ACTIVE`               | `GLFW_FOCUSED`               | Renamed to match the window focus callback |\n| `GLFW_WINDOW_NO_RESIZE`     | `GLFW_RESIZABLE`             | The default has been inverted |\n| `GLFW_MOUSE_CURSOR`         | `GLFW_CURSOR`                | Used with @ref glfwSetInputMode |\n| `GLFW_KEY_ESC`              | `GLFW_KEY_ESCAPE`            |       |\n| `GLFW_KEY_DEL`              | `GLFW_KEY_DELETE`            |       |\n| `GLFW_KEY_PAGEUP`           | `GLFW_KEY_PAGE_UP`           |       |\n| `GLFW_KEY_PAGEDOWN`         | `GLFW_KEY_PAGE_DOWN`         |       |\n| `GLFW_KEY_KP_NUM_LOCK`      | `GLFW_KEY_NUM_LOCK`          |       |\n| `GLFW_KEY_LCTRL`            | `GLFW_KEY_LEFT_CONTROL`      |       |\n| `GLFW_KEY_LSHIFT`           | `GLFW_KEY_LEFT_SHIFT`        |       |\n| `GLFW_KEY_LALT`             | `GLFW_KEY_LEFT_ALT`          |       |\n| `GLFW_KEY_LSUPER`           | `GLFW_KEY_LEFT_SUPER`        |       |\n| `GLFW_KEY_RCTRL`            | `GLFW_KEY_RIGHT_CONTROL`     |       |\n| `GLFW_KEY_RSHIFT`           | `GLFW_KEY_RIGHT_SHIFT`       |       |\n| `GLFW_KEY_RALT`             | `GLFW_KEY_RIGHT_ALT`         |       |\n| `GLFW_KEY_RSUPER`           | `GLFW_KEY_RIGHT_SUPER`       |       |\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/news.dox",
    "content": "/*!\n\n@page news Release notes\n\n@section news_33 Release notes for 3.3\n\n\n@subsection news_33_geterror Error query\n\nGLFW now supports querying the last error code for the calling thread and its\nhuman-readable description with @ref glfwGetError.\n\n@see @ref error_handling\n\n\n@subsection news_33_gamepad SDL_GameControllerDB support and gamepad input\n\nGLFW now supports remapping of gamepads and controllers to a 360-like controller\nlayout with @ref glfwJoystickIsGamepad, @ref glfwGetJoystickGUID, @ref\nglfwGetGamepadName, @ref glfwGetGamepadState and @ref glfwUpdateGamepadMappings,\nand the input state struct @ref GLFWgamepadstate.\n\n@sa @ref gamepad\n\n\n@subsection news_33_attention User attention request\n\nGLFW now supports requesting user attention to a specific window (on macOS to\nthe application as a whole) with @ref glfwRequestWindowAttention.\n\n@see @ref window_attention\n\n\n@subsection news_33_maximize Window maximization callback\n\nGLFW now supports notifying the application that the window has been maximized\n@ref glfwSetWindowMaximizeCallback.\n\n@see @ref window_maximize\n\n\n@subsection news_33_keyscancode Platform-specific key scancode query\n\nGLFW now supports querying the platform dependent scancode of any physical key\nwith @ref glfwGetKeyScancode.\n\n@see @ref input_key\n\n\n@subsection news_33_setwindowattrib Support for updating window attributes\n\nGLFW now supports changing the [GLFW_DECORATED](@ref GLFW_DECORATED_attrib),\n[GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib),\n[GLFW_FLOATING](@ref GLFW_FLOATING_attrib) and\n[GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) attributes for existing\nwindows with @ref glfwSetWindowAttrib.\n\n@see @ref window_attribs\n\n\n@subsection news_33_inithint Support for initialization hints\n\nGLFW now supports setting library initialization hints with @ref glfwInitHint\nor @ref glfwInitHintString.  These must be set before initialization to take\neffect.\n\n@see @ref init_hints\n\n\n@subsection news_33_platformhints Support for platform specific hints\n\nGLFW now supports platform specific init and window hints to control system\nfeatures that are only available on a single platform.\n\n@see @ref init_hints_osx\n@see @ref window_hints_osx\n\n\n@subsection news_33_joyhats Support for joystick hats\n\nGLFW now supports querying the hats (or POVs or D-pads) of a joystick with @ref\nglfwGetJoystickHats.  Hats are by default also exposed as buttons, but this can\nbe disabled with the @ref GLFW_JOYSTICK_HAT_BUTTONS init hint.\n\n@see @ref joystick_hat\n\n\n@subsection news_33_transparent Support for transparent window framebuffer\n\nGLFW now supports the creation of windows with transparent framebuffers on\nsystems with desktop compositing enabled with the @ref GLFW_TRANSPARENT window\nhint and attribute.  Any window decorations will still be opaque.\n\n\n@subsection news_33_centercursor Cursor centering window hint\n\nGLFW now supports controlling whether the cursor is centered over newly created\nfull screen windows with the [GLFW_CENTER_CURSOR](@ref GLFW_CENTER_CURSOR_hint)\nwindow hint.  It is enabled by default.\n\n\n@subsection news_33_rawmotion Support for raw mouse motion\n\nGLFW now uses raw (unscaled and unaccelerated) mouse motion in disabled cursor\nmode on platforms where this is available, specifically Windows and X11.\n\n\n@subsection news_33_moltenvk Support for Vulkan on macOS via MoltenVK\n\nGLFW now supports the `VK_MVK_macos_surface` window surface creation extension\nprovided by [MoltenVK](https://moltengl.com/moltenvk/).\n\n@see @ref vulkan_guide\n\n\n@subsection news_33_osmesa OSMesa backend for headless software rendering\n\nGLFW now supports creating offscreen OpenGL contexts using\n[OSMesa](https://www.mesa3d.org/osmesa.html) by setting\n[GLFW_CONTEXT_CREATION_API](@ref GLFW_CONTEXT_CREATION_API_hint) to\n`GLFW_OSMESA_CONTEXT_API`.\n\nThere is also a new null backend that uses OSMesa as its native context\ncreation API, intended for automated testing.  This backend does not provide\ninput.\n\n\n@subsection news_33_primary X11 primary selection access\n\nGLFW now supports querying and setting the X11 primary selection via the native\naccess functions @ref glfwGetX11SelectionString and @ref\nglfwSetX11SelectionString.\n\n\n@section news_32 Release notes for 3.2\n\n\n@subsection news_32_vulkan Support for Vulkan\n\nGLFW now supports basic integration with Vulkan with @ref glfwVulkanSupported,\n@ref glfwGetRequiredInstanceExtensions, @ref glfwGetInstanceProcAddress, @ref\nglfwGetPhysicalDevicePresentationSupport and @ref glfwCreateWindowSurface.\nVulkan header inclusion can be selected with\n@ref GLFW_INCLUDE_VULKAN.\n\n\n@subsection news_32_setwindowmonitor Window mode switching\n\nGLFW now supports switching between windowed and full screen modes and updating\nthe monitor and desired resolution and refresh rate of full screen windows with\n@ref glfwSetWindowMonitor.\n\n\n@subsection news_32_maximize Window maxmimization support\n\nGLFW now supports window maximization with @ref glfwMaximizeWindow and the\n@ref GLFW_MAXIMIZED window hint and attribute.\n\n\n@subsection news_32_focus Window input focus control\n\nGLFW now supports giving windows input focus with @ref glfwFocusWindow.\n\n\n@subsection news_32_sizelimits Window size limit support\n\nGLFW now supports setting both absolute and relative window size limits with\n@ref glfwSetWindowSizeLimits and @ref glfwSetWindowAspectRatio.\n\n\n@subsection news_32_keyname Localized key names\n\nGLFW now supports querying the localized name of printable keys with @ref\nglfwGetKeyName, either by key token or by scancode.\n\n\n@subsection news_32_waittimeout Wait for events with timeout\n\nGLFW now supports waiting for events for a set amount of time with @ref\nglfwWaitEventsTimeout.\n\n\n@subsection news_32_icon Window icon support\n\nGLFW now supports setting the icon of windows with @ref glfwSetWindowIcon.\n\n\n@subsection news_32_timer Raw timer access\n\nGLFW now supports raw timer values with @ref glfwGetTimerValue and @ref\nglfwGetTimerFrequency.\n\n\n@subsection news_32_joystick Joystick connection callback\n\nGLFW now supports notifying when a joystick has been connected or disconnected\nwith @ref glfwSetJoystickCallback.\n\n\n@subsection news_32_noapi Context-less windows\n\nGLFW now supports creating windows without a OpenGL or OpenGL ES context by\nsetting the [GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint to `GLFW_NO_API`.\n\n\n@subsection news_32_contextapi Run-time context creation API selection\n\nGLFW now supports selecting and querying the context creation API at run-time\nwith the @ref GLFW_CONTEXT_CREATION_API hint and attribute.\n\n\n@subsection news_32_noerror Error-free context creation\n\nGLFW now supports creating and querying OpenGL and OpenGL ES contexts that do\nnot emit errors with the @ref GLFW_CONTEXT_NO_ERROR hint, provided the machine\nsupports the `GL_KHR_no_error` extension.\n\n\n@subsection news_32_cmake CMake config-file package support\n\nGLFW now supports being used as a\n[config-file package](@ref build_link_cmake_package) from other projects for\neasy linking with the library and its dependencies.\n\n\n@section news_31 Release notes for 3.1\n\nThese are the release highlights.  For a full list of changes see the\n[version history](http://www.glfw.org/changelog.html).\n\n\n@subsection news_31_cursor Custom mouse cursor images\n\nGLFW now supports creating and setting both custom cursor images and standard\ncursor shapes.  They are created with @ref glfwCreateCursor or @ref\nglfwCreateStandardCursor, set with @ref glfwSetCursor and destroyed with @ref\nglfwDestroyCursor.\n\n@see @ref cursor_object\n\n\n@subsection news_31_drop Path drop event\n\nGLFW now provides a callback for receiving the paths of files and directories\ndropped onto GLFW windows.  The callback is set with @ref glfwSetDropCallback.\n\n@see @ref path_drop\n\n\n@subsection news_31_emptyevent Main thread wake-up\n\nGLFW now provides the @ref glfwPostEmptyEvent function for posting an empty\nevent from another thread to the main thread event queue, causing @ref\nglfwWaitEvents to return.\n\n@see @ref events\n\n\n@subsection news_31_framesize Window frame size query\n\nGLFW now supports querying the size, on each side, of the frame around the\nclient area of a window, with @ref glfwGetWindowFrameSize.\n\n@see [Window size](@ref window_size)\n\n\n@subsection news_31_autoiconify Simultaneous multi-monitor rendering\n\nGLFW now supports disabling auto-iconification of full screen windows with\nthe [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_hint) window hint.  This is\nintended for people building multi-monitor installations, where you need windows\nto stay in full screen despite losing input focus.\n\n\n@subsection news_31_floating Floating windows\n\nGLFW now supports floating windows, also called topmost or always on top, for\neasier debugging with the @ref GLFW_FLOATING window hint and attribute.\n\n\n@subsection news_31_focused Initially unfocused windows\n\nGLFW now supports preventing a windowed mode window from gaining input focus on\ncreation, with the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) window hint.\n\n\n@subsection news_31_direct Direct access for window attributes and cursor position\n\nGLFW now queries the window input focus, visibility and iconification attributes\nand the cursor position directly instead of returning cached data.\n\n\n@subsection news_31_charmods Character with modifiers callback\n\nGLFW now provides a callback for character events with modifier key bits.  The\ncallback is set with @ref glfwSetCharModsCallback.  Unlike the regular character\ncallback, this will report character events that will not result in a character\nbeing input, for example if the Control key is held down.\n\n@see @ref input_char\n\n\n@subsection news_31_single Single buffered framebuffers\n\nGLFW now supports the creation of single buffered windows, with the @ref\nGLFW_DOUBLEBUFFER hint.\n\n\n@subsection news_31_glext Macro for including extension header\n\nGLFW now includes the extension header appropriate for the chosen OpenGL or\nOpenGL ES header when @ref GLFW_INCLUDE_GLEXT is defined.  GLFW does not provide\nthese headers.  They must be provided by your development environment or your\nOpenGL or OpenGL ES SDK.\n\n\n@subsection news_31_release Context release behaviors\n\nGLFW now supports controlling and querying whether the pipeline is flushed when\na context is made non-current, with the @ref GLFW_CONTEXT_RELEASE_BEHAVIOR hint\nand attribute, provided the machine supports the `GL_KHR_context_flush_control`\nextension.\n\n\n@subsection news_31_wayland (Experimental) Wayland support\n\nGLFW now has an _experimental_ Wayland display protocol backend that can be\nselected on Linux with a CMake option.\n\n\n@subsection news_31_mir (Experimental) Mir support\n\nGLFW now has an _experimental_ Mir display server backend that can be selected\non Linux with a CMake option.\n\n\n@section news_30 Release notes for 3.0\n\nThese are the release highlights.  For a full list of changes see the\n[version history](http://www.glfw.org/changelog.html).\n\n\n@subsection news_30_cmake CMake build system\n\nGLFW now uses the CMake build system instead of the various makefiles and\nproject files used by earlier versions.  CMake is available for all platforms\nsupported by GLFW, is present in most package systems and can generate\nmakefiles and/or project files for most popular development environments.\n\nFor more information on how to use CMake, see the\n[CMake manual](http://cmake.org/cmake/help/documentation.html).\n\n\n@subsection news_30_multiwnd Multi-window support\n\nGLFW now supports the creation of multiple windows, each with their own OpenGL\nor OpenGL ES context, and all window functions now take a window handle.  Event\ncallbacks are now per-window and are provided with the handle of the window that\nreceived the event.  The @ref glfwMakeContextCurrent function has been added to\nselect which context is current on a given thread.\n\n\n@subsection news_30_multimon Multi-monitor support\n\nGLFW now explicitly supports multiple monitors.  They can be enumerated with\n@ref glfwGetMonitors, queried with @ref glfwGetVideoModes, @ref\nglfwGetMonitorPos, @ref glfwGetMonitorName and @ref glfwGetMonitorPhysicalSize,\nand specified at window creation to make the newly created window full screen on\nthat specific monitor.\n\n\n@subsection news_30_unicode Unicode support\n\nAll string arguments to GLFW functions and all strings returned by GLFW now use\nthe UTF-8 encoding.  This includes the window title, error string, clipboard\ntext, monitor and joystick names as well as the extension function arguments (as\nASCII is a subset of UTF-8).\n\n\n@subsection news_30_clipboard Clipboard text I/O\n\nGLFW now supports reading and writing plain text to and from the system\nclipboard, with the @ref glfwGetClipboardString and @ref glfwSetClipboardString\nfunctions.\n\n\n@subsection news_30_gamma Gamma ramp support\n\nGLFW now supports setting and reading back the gamma ramp of monitors, with the\n@ref glfwGetGammaRamp and @ref glfwSetGammaRamp functions.  There is also @ref\nglfwSetGamma, which generates a ramp from a gamma value and then sets it.\n\n\n@subsection news_30_gles OpenGL ES support\n\nGLFW now supports the creation of OpenGL ES contexts, by setting the\n[GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint to `GLFW_OPENGL_ES_API`, where\ncreation of such contexts are supported.  Note that GLFW _does not implement_\nOpenGL ES, so your driver must provide support in a way usable by GLFW.  Modern\nNvidia and Intel drivers support creation of OpenGL ES context using the GLX and\nWGL APIs, while AMD provides an EGL implementation instead.\n\n\n@subsection news_30_egl (Experimental) EGL support\n\nGLFW now has an experimental EGL context creation back end that can be selected\nthrough CMake options.\n\n\n@subsection news_30_hidpi High-DPI support\n\nGLFW now supports high-DPI monitors on both Windows and macOS, giving windows\nfull resolution framebuffers where other UI elements are scaled up.  To achieve\nthis, @ref glfwGetFramebufferSize and @ref glfwSetFramebufferSizeCallback have\nbeen added.  These work with pixels, while the rest of the GLFW API works with\nscreen coordinates.  This is important as OpenGL uses pixels, not screen\ncoordinates.\n\n\n@subsection news_30_error Error callback\n\nGLFW now has an error callback, which can provide your application with much\nmore detailed diagnostics than was previously possible.  The callback is passed\nan error code and a description string.\n\n\n@subsection news_30_wndptr Per-window user pointer\n\nEach window now has a user-defined pointer, retrieved with @ref\nglfwGetWindowUserPointer and set with @ref glfwSetWindowUserPointer, to make it\neasier to integrate GLFW into C++ code.\n\n\n@subsection news_30_iconifyfun Window iconification callback\n\nEach window now has a callback for iconification and restoration events,\nwhich is set with @ref glfwSetWindowIconifyCallback.\n\n\n@subsection news_30_wndposfun Window position callback\n\nEach window now has a callback for position events, which is set with @ref\nglfwSetWindowPosCallback.\n\n\n@subsection news_30_wndpos Window position query\n\nThe position of a window can now be retrieved using @ref glfwGetWindowPos.\n\n\n@subsection news_30_focusfun Window focus callback\n\nEach windows now has a callback for focus events, which is set with @ref\nglfwSetWindowFocusCallback.\n\n\n@subsection news_30_enterleave Cursor enter/leave callback\n\nEach window now has a callback for when the mouse cursor enters or leaves its\nclient area, which is set with @ref glfwSetCursorEnterCallback.\n\n\n@subsection news_30_wndtitle Initial window title\n\nThe title of a window is now specified at creation time, as one of the arguments\nto @ref glfwCreateWindow.\n\n\n@subsection news_30_hidden Hidden windows\n\nWindows can now be hidden with @ref glfwHideWindow, shown using @ref\nglfwShowWindow and created initially hidden with the @ref GLFW_VISIBLE window\nhint and attribute.  This allows for off-screen rendering in a way compatible\nwith most drivers, as well as moving a window to a specific position before\nshowing it.\n\n\n@subsection news_30_undecorated Undecorated windows\n\nWindowed mode windows can now be created without decorations, e.g. things like\na frame, a title bar, with the @ref GLFW_DECORATED window hint and attribute.\nThis allows for the creation of things like splash screens.\n\n\n@subsection news_30_keymods Modifier key bit masks\n\n[Modifier key bit mask](@ref mods) parameters have been added to the\n[mouse button](@ref GLFWmousebuttonfun) and [key](@ref GLFWkeyfun) callbacks.\n\n\n@subsection news_30_scancode Platform-specific scancodes\n\nA scancode parameter has been added to the [key callback](@ref GLFWkeyfun). Keys\nthat don't have a [key token](@ref keys) still get passed on with the key\nparameter set to `GLFW_KEY_UNKNOWN`.  These scancodes will vary between machines\nand are intended to be used for key bindings.\n\n\n@subsection news_30_jsname Joystick names\n\nThe name of a joystick can now be retrieved using @ref glfwGetJoystickName.\n\n\n@subsection news_30_doxygen Doxygen documentation\n\nYou are reading it.\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/quick.dox",
    "content": "/*!\n\n@page quick_guide Getting started\n\n@tableofcontents\n\nThis guide takes you through writing a simple application using GLFW 3.  The\napplication will create a window and OpenGL context, render a rotating triangle\nand exit when the user closes the window or presses _Escape_.  This guide will\nintroduce a few of the most commonly used functions, but there are many more.\n\nThis guide assumes no experience with earlier versions of GLFW.  If you\nhave used GLFW 2 in the past, read @ref moving_guide, as some functions\nbehave differently in GLFW 3.\n\n\n@section quick_steps Step by step\n\n@subsection quick_include Including the GLFW header\n\nIn the source files of your application where you use OpenGL or GLFW, you need\nto include the GLFW 3 header file.\n\n@code\n#include <GLFW/glfw3.h>\n@endcode\n\nThis defines all the constants, types and function prototypes of the GLFW API.\nIt also includes the OpenGL header from your development environment and\ndefines all the constants and types necessary for it to work on your platform\nwithout including any platform-specific headers.\n\nIn other words:\n\n- Do _not_ include the OpenGL header yourself, as GLFW does this for you in\n  a platform-independent way\n- Do _not_ include `windows.h` or other platform-specific headers unless\n  you plan on using those APIs yourself\n- If you _do_ need to include such headers, include them _before_ the GLFW\n  header and it will detect this\n\nOn some platforms supported by GLFW the OpenGL header and link library only\nexpose older versions of OpenGL.  The most extreme case is Windows, which only\nexposes OpenGL 1.2.  The easiest way to work around this is to use an\n[extension loader library](@ref context_glext_auto).\n\nIf you are using such a library then you should include its header _before_ the\nGLFW header.  This lets it replace the OpenGL header included by GLFW without\nconflicts.  This example uses\n[glad](https://github.com/Dav1dde/glad), but the same rule applies to all such\nlibraries.\n\n@code\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n@endcode\n\n\n@subsection quick_init_term Initializing and terminating GLFW\n\nBefore you can use most GLFW functions, the library must be initialized.  On\nsuccessful initialization, `GLFW_TRUE` is returned.  If an error occurred,\n`GLFW_FALSE` is returned.\n\n@code\nif (!glfwInit())\n{\n    // Initialization failed\n}\n@endcode\n\nNote that `GLFW_TRUE` and `GLFW_FALSE` are and will always be one and zero.\n\nWhen you are done using GLFW, typically just before the application exits, you\nneed to terminate GLFW.\n\n@code\nglfwTerminate();\n@endcode\n\nThis destroys any remaining windows and releases any other resources allocated by\nGLFW.  After this call, you must initialize GLFW again before using any GLFW\nfunctions that require it.\n\n\n@subsection quick_capture_error Setting an error callback\n\nMost events are reported through callbacks, whether it's a key being pressed,\na GLFW window being moved, or an error occurring.  Callbacks are C functions (or\nC++ static methods) that are called by GLFW with arguments describing the event.\n\nIn case a GLFW function fails, an error is reported to the GLFW error callback.\nYou can receive these reports with an error callback.  This function must have\nthe signature below but may do anything permitted in other callbacks.\n\n@code\nvoid error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n@endcode\n\nCallback functions must be set, so GLFW knows to call them.  The function to set\nthe error callback is one of the few GLFW functions that may be called before\ninitialization, which lets you be notified of errors both during and after\ninitialization.\n\n@code\nglfwSetErrorCallback(error_callback);\n@endcode\n\n\n@subsection quick_create_window Creating a window and context\n\nThe window and its OpenGL context are created with a single call to @ref\nglfwCreateWindow, which returns a handle to the created combined window and\ncontext object\n\n@code\nGLFWwindow* window = glfwCreateWindow(640, 480, \"My Title\", NULL, NULL);\nif (!window)\n{\n    // Window or OpenGL context creation failed\n}\n@endcode\n\nThis creates a 640 by 480 windowed mode window with an OpenGL context.  If\nwindow or OpenGL context creation fails, `NULL` will be returned.  You should\nalways check the return value.  While window creation rarely fails, context\ncreation depends on properly installed drivers and may fail even on machines\nwith the necessary hardware.\n\nBy default, the OpenGL context GLFW creates may have any version.  You can\nrequire a minimum OpenGL version by setting the `GLFW_CONTEXT_VERSION_MAJOR` and\n`GLFW_CONTEXT_VERSION_MINOR` hints _before_ creation.  If the required minimum\nversion is not supported on the machine, context (and window) creation fails.\n\n@code\nglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\nglfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\nGLFWwindow* window = glfwCreateWindow(640, 480, \"My Title\", NULL, NULL);\nif (!window)\n{\n    // Window or context creation failed\n}\n@endcode\n\nThe window handle is passed to all window related functions and is provided to\nalong to all window related callbacks, so they can tell which window received\nthe event.\n\nWhen a window and context is no longer needed, destroy it.\n\n@code\nglfwDestroyWindow(window);\n@endcode\n\nOnce this function is called, no more events will be delivered for that window\nand its handle becomes invalid.\n\n\n@subsection quick_context_current Making the OpenGL context current\n\nBefore you can use the OpenGL API, you must have a current OpenGL context.\n\n@code\nglfwMakeContextCurrent(window);\n@endcode\n\nThe context will remain current until you make another context current or until\nthe window owning the current context is destroyed.\n\nIf you are using an [extension loader library](@ref context_glext_auto) to\naccess modern OpenGL then this is when to initialize it, as the loader needs\na current context to load from.  This example uses\n[glad](https://github.com/Dav1dde/glad), but the same rule applies to all such\nlibraries. \n\n@code\ngladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n@endcode\n\n\n@subsection quick_window_close Checking the window close flag\n\nEach window has a flag indicating whether the window should be closed.\n\nWhen the user attempts to close the window, either by pressing the close widget\nin the title bar or using a key combination like Alt+F4, this flag is set to 1.\nNote that __the window isn't actually closed__, so you are expected to monitor\nthis flag and either destroy the window or give some kind of feedback to the\nuser.\n\n@code\nwhile (!glfwWindowShouldClose(window))\n{\n    // Keep running\n}\n@endcode\n\nYou can be notified when the user is attempting to close the window by setting\na close callback with @ref glfwSetWindowCloseCallback.  The callback will be\ncalled immediately after the close flag has been set.\n\nYou can also set it yourself with @ref glfwSetWindowShouldClose.  This can be\nuseful if you want to interpret other kinds of input as closing the window, like\nfor example pressing the _Escape_ key.\n\n\n@subsection quick_key_input Receiving input events\n\nEach window has a large number of callbacks that can be set to receive all the\nvarious kinds of events.  To receive key press and release events, create a key\ncallback function.\n\n@code\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n@endcode\n\nThe key callback, like other window related callbacks, are set per-window.\n\n@code\nglfwSetKeyCallback(window, key_callback);\n@endcode\n\nIn order for event callbacks to be called when events occur, you need to process\nevents as described below.\n\n\n@subsection quick_render Rendering with OpenGL\n\nOnce you have a current OpenGL context, you can use OpenGL normally.  In this\ntutorial, a multi-colored rotating triangle will be rendered.  The framebuffer\nsize needs to be retrieved for `glViewport`.\n\n@code\nint width, height;\nglfwGetFramebufferSize(window, &width, &height);\nglViewport(0, 0, width, height);\n@endcode\n\nYou can also set a framebuffer size callback using @ref\nglfwSetFramebufferSizeCallback and be notified when the size changes.\n\nActual rendering with OpenGL is outside the scope of this tutorial, but there\nare [many](https://open.gl/) [excellent](https://learnopengl.com/)\n[tutorial](http://openglbook.com/) [sites](http://ogldev.atspace.co.uk/) that\nteach modern OpenGL.  Some of them use GLFW to create the context and window\nwhile others use GLUT or SDL, but remember that OpenGL itself always works the\nsame.\n\n\n@subsection quick_timer Reading the timer\n\nTo create smooth animation, a time source is needed.  GLFW provides a timer that\nreturns the number of seconds since initialization.  The time source used is the\nmost accurate on each platform and generally has micro- or nanosecond\nresolution.\n\n@code\ndouble time = glfwGetTime();\n@endcode\n\n\n@subsection quick_swap_buffers Swapping buffers\n\nGLFW windows by default use double buffering.  That means that each window has\ntwo rendering buffers; a front buffer and a back buffer.  The front buffer is\nthe one being displayed and the back buffer the one you render to.\n\nWhen the entire frame has been rendered, the buffers need to be swapped with one\nanother, so the back buffer becomes the front buffer and vice versa.\n\n@code\nglfwSwapBuffers(window);\n@endcode\n\nThe swap interval indicates how many frames to wait until swapping the buffers,\ncommonly known as _vsync_.  By default, the swap interval is zero, meaning\nbuffer swapping will occur immediately.  On fast machines, many of those frames\nwill never be seen, as the screen is still only updated typically 60-75 times\nper second, so this wastes a lot of CPU and GPU cycles.\n\nAlso, because the buffers will be swapped in the middle the screen update,\nleading to [screen tearing](https://en.wikipedia.org/wiki/Screen_tearing).\n\nFor these reasons, applications will typically want to set the swap interval to\none.  It can be set to higher values, but this is usually not recommended,\nbecause of the input latency it leads to.\n\n@code\nglfwSwapInterval(1);\n@endcode\n\nThis function acts on the current context and will fail unless a context is\ncurrent.\n\n\n@subsection quick_process_events Processing events\n\nGLFW needs to communicate regularly with the window system both in order to\nreceive events and to show that the application hasn't locked up.  Event\nprocessing must be done regularly while you have visible windows and is normally\ndone each frame after buffer swapping.\n\nThere are two methods for processing pending events; polling and waiting.  This\nexample will use event polling, which processes only those events that have\nalready been received and then returns immediately.  \n\n@code\nglfwPollEvents();\n@endcode\n\nThis is the best choice when rendering continually, like most games do.  If\ninstead you only need to update your rendering once you have received new input,\n@ref glfwWaitEvents is a better choice.  It waits until at least one event has\nbeen received, putting the thread to sleep in the meantime, and then processes\nall received events.  This saves a great deal of CPU cycles and is useful for,\nfor example, many kinds of editing tools.\n\n\n@section quick_example Putting it together\n\nNow that you know how to initialize GLFW, create a window and poll for\nkeyboard input, it's possible to create a simple program.\n\nThis program creates a 640 by 480 windowed mode window and starts a loop that\nclears the screen, renders a triangle and processes events until the user either\npresses _Escape_ or closes the window.\n\n@snippet simple.c code\n\nThe program above can be found in the\n[source package](http://www.glfw.org/download.html) as `examples/simple.c`\nand is compiled along with all other examples when you build GLFW.  If you\nbuilt GLFW from the source package then already have this as `simple.exe` on\nWindows, `simple` on Linux or `simple.app` on macOS.\n\nThis tutorial used only a few of the many functions GLFW provides.  There are\nguides for each of the areas covered by GLFW.  Each guide will introduce all the\nfunctions for that category.\n\n - @ref intro_guide\n - @ref window_guide\n - @ref context_guide\n - @ref monitor_guide\n - @ref input_guide\n\nYou can access reference documentation for any GLFW function by clicking it and\nthe reference for each function links to related functions and guide sections.\n\nThe tutorial ends here.  Once you have written a program that uses GLFW, you\nwill need to compile and link it.  How to do that depends on the development\nenvironment you are using and is best explained by the documentation for that\nenvironment.  To learn about the details that are specific to GLFW, see\n@ref build_guide.\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/vulkan.dox",
    "content": "/*!\n\n@page vulkan_guide Vulkan guide\n \n@tableofcontents\n\nThis guide is intended to fill the gaps between the [Vulkan\ndocumentation](https://www.khronos.org/vulkan/) and the rest of the GLFW\ndocumentation and is not a replacement for either.  It assumes some familiarity\nwith Vulkan concepts like loaders, devices, queues and surfaces and leaves it to\nthe Vulkan documentation to explain the details of Vulkan functions.\n\nTo develop for Vulkan you should install an SDK for your platform, for example\nthe [LunarG Vulkan SDK](https://vulkan.lunarg.com/) for Windows and Linux or\n[MoltenVK](https://moltengl.com/moltenvk/) for macOS.  Apart from headers and\nlink libraries, they should also provide the validation layers necessary for\ndevelopment.\n\nThe GLFW library does not need the Vulkan SDK to enable support for Vulkan.\nHowever, any Vulkan-specific test and example programs are built only if the\nCMake files find a Vulkan SDK.\n\n@macos Because MoltenVK is typically not installed system-wide, you will need to\npoint CMake to it using the `CMAKE_FRAMEWORK_PATH` variable when configuring the\nGLFW source tree.  Set this variable to the `MoltenVK/macOS` subdirectory of the\nSDK, either on the command-line or in the CMake GUI.\n\nFor details on a specific function in this category, see the @ref vulkan.  There\nare also guides for the other areas of the GLFW API.\n\n - @ref intro_guide\n - @ref window_guide\n - @ref context_guide\n - @ref monitor_guide\n - @ref input_guide\n\n\n@section vulkan_loader Linking against the Vulkan loader\n\nBy default, GLFW will look for the Vulkan loader on demand at runtime via its\nstandard name (`vulkan-1.dll` on Windows, `libvulkan.so.1` on Linux and other\nUnix-like systems and `libMoltenVK.dylib` on macOS).  This means that GLFW does\nnot need to be linked against the loader.  However, it also means that if you\nare using the static library form of the Vulkan loader GLFW will either fail to\nfind it or (worse) use the wrong one.\n\nThe @ref GLFW_VULKAN_STATIC CMake option makes GLFW link directly against the\nstatic library form.  Not linking against the Vulkan loader will then be\na compile-time error.\n\n@macos When using the static library form of MoltenVK (i.e. `MetalVK.framework`\nand not `libMoltenVK.dylib`) you must also link against its dependencies: the\n`Cocoa`, `Metal` and `QuartzCore` system frameworks and the `libc++` library.\n\n\n@section vulkan_include Including the Vulkan and GLFW header files\n\nTo include the Vulkan header, define @ref GLFW_INCLUDE_VULKAN before including\nthe GLFW header.\n\n@code\n#define GLFW_INCLUDE_VULKAN\n#include <GLFW/glfw3.h>\n@endcode\n\nIf you instead want to include the Vulkan header from a custom location or use\nyour own custom Vulkan header then do this before the GLFW header.\n\n@code\n#include <path/to/vulkan.h>\n#include <GLFW/glfw3.h>\n@endcode\n\nUnless a Vulkan header is included, either by the GLFW header or above it, any\nGLFW functions that take or return Vulkan types will not be declared.\n\nThe `VK_USE_PLATFORM_*_KHR` macros do not need to be defined for the Vulkan part\nof GLFW to work.  Define them only if you are using these extensions directly.\n\n\n@section vulkan_support Querying for Vulkan support\n\nIf you are linking directly against the Vulkan loader then you can skip this\nsection.  The canonical desktop loader library exports all Vulkan core and\nKhronos extension functions, allowing them to be called directly.\n\nIf you are loading the Vulkan loader dynamically instead of linking directly\nagainst it, you can check for the availability of a loader and ICD with @ref\nglfwVulkanSupported.\n\n@code\nif (glfwVulkanSupported())\n{\n    // Vulkan is available, at least for compute\n}\n@endcode\n\nThis function returns `GLFW_TRUE` if the Vulkan loader and any minimally\nfunctional ICD was found.\n\nIf if one or both were not found, calling any other Vulkan related GLFW function\nwill generate a @ref GLFW_API_UNAVAILABLE error.\n\n\n@subsection vulkan_proc Querying Vulkan function pointers\n\nTo load any Vulkan core or extension function from the found loader, call @ref\nglfwGetInstanceProcAddress.  To load functions needed for instance creation,\npass `NULL` as the instance.\n\n@code\nPFN_vkCreateInstance pfnCreateInstance = (PFN_vkCreateInstance)\n    glfwGetInstanceProcAddress(NULL, \"vkCreateInstance\");\n@endcode\n\nOnce you have created an instance, you can load from it all other Vulkan core\nfunctions and functions from any instance extensions you enabled.\n\n@code\nPFN_vkCreateDevice pfnCreateDevice = (PFN_vkCreateDevice)\n    glfwGetInstanceProcAddress(instance, \"vkCreateDevice\");\n@endcode\n\nThis function in turn calls `vkGetInstanceProcAddr`.  If that fails, the\nfunction falls back to a platform-specific query of the Vulkan loader (i.e.\n`dlsym` or `GetProcAddress`).  If that also fails, the function returns `NULL`.\nFor more information about `vkGetInstanceProcAddr`, see the Vulkan\ndocumentation.\n\nVulkan also provides `vkGetDeviceProcAddr` for loading device-specific versions\nof Vulkan function.  This function can be retrieved from an instance with @ref\nglfwGetInstanceProcAddress.\n\n@code\nPFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)\n    glfwGetInstanceProcAddress(instance, \"vkGetDeviceProcAddr\");\n@endcode\n\nDevice-specific functions may execute a little bit faster, due to not having to\ndispatch internally based on the device passed to them.  For more information\nabout `vkGetDeviceProcAddr`, see the Vulkan documentation.\n\n\n@section vulkan_ext Querying required Vulkan extensions\n\nTo do anything useful with Vulkan you need to create an instance.  If you want\nto use Vulkan to render to a window, you must enable the instance extensions\nGLFW requires to create Vulkan surfaces.\n\nTo query the instance extensions required, call @ref\nglfwGetRequiredInstanceExtensions.\n\n@code\nuint32_t count;\nconst char** extensions = glfwGetRequiredInstanceExtensions(&count);\n@endcode\n\nThese extensions must all be enabled when creating instances that are going to\nbe passed to @ref glfwGetPhysicalDevicePresentationSupport and @ref\nglfwCreateWindowSurface.  The set of extensions will vary depending on platform\nand may also vary depending on graphics drivers and other factors.\n\nIf it fails it will return `NULL` and GLFW will not be able to create Vulkan\nwindow surfaces.  You can still use Vulkan for off-screen rendering and compute\nwork.\n\nThe returned array will always contain `VK_KHR_surface`, so if you don't\nrequire any additional extensions you can pass this list directly to the\n`VkInstanceCreateInfo` struct.\n\n@code\nVkInstanceCreateInfo ici;\n\nmemset(&ici, 0, sizeof(ici));\nici.enabledExtensionCount = count;\nici.ppEnabledExtensionNames = extensions;\n...\n@endcode\n\nAdditional extensions may be required by future versions of GLFW.  You should\ncheck whether any extensions you wish to enable are already in the returned\narray, as it is an error to specify an extension more than once in the\n`VkInstanceCreateInfo` struct. \n\n\n@section vulkan_present Querying for Vulkan presentation support\n\nNot every queue family of every Vulkan device can present images to surfaces.\nTo check whether a specific queue family of a physical device supports image\npresentation without first having to create a window and surface, call @ref\nglfwGetPhysicalDevicePresentationSupport.\n\n@code\nif (glfwGetPhysicalDevicePresentationSupport(instance, physical_device, queue_family_index))\n{\n    // Queue family supports image presentation\n}\n@endcode\n\nThe `VK_KHR_surface` extension additionally provides the \n`vkGetPhysicalDeviceSurfaceSupportKHR` function, which performs the same test on\nan existing Vulkan surface.\n\n\n@section vulkan_window Creating the window\n\nUnless you will be using OpenGL or OpenGL ES with the same window as Vulkan,\nthere is no need to create a context.  You can disable context creation with the\n[GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint) hint.\n\n@code\nglfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);\nGLFWwindow* window = glfwCreateWindow(640, 480, \"Window Title\", NULL, NULL);\n@endcode\n\nSee @ref context_less for more information.\n\n\n@section vulkan_surface Creating a Vulkan window surface\n\nYou can create a Vulkan surface (as defined by the `VK_KHR_surface` extension)\nfor a GLFW window with @ref glfwCreateWindowSurface.\n\n@code\nVkSurfaceKHR surface;\nVkResult err = glfwCreateWindowSurface(instance, window, NULL, &surface);\nif (err)\n{\n    // Window surface creation failed\n}\n@endcode\n\nIt is your responsibility to destroy the surface.  GLFW does not destroy it for\nyou.  Call `vkDestroySurfaceKHR` function from the same extension to destroy it.\n\n*/\n"
  },
  {
    "path": "external/GLFW/docs/window.dox",
    "content": "/*!\n\n@page window_guide Window guide\n \n@tableofcontents\n\nThis guide introduces the window related functions of GLFW.  For details on\na specific function in this category, see the @ref window.  There are also\nguides for the other areas of GLFW.\n\n - @ref intro_guide\n - @ref context_guide\n - @ref vulkan_guide\n - @ref monitor_guide\n - @ref input_guide\n\n\n@section window_object Window objects\n\nThe @ref GLFWwindow object encapsulates both a window and a context.  They are\ncreated with @ref glfwCreateWindow and destroyed with @ref glfwDestroyWindow, or\n@ref glfwTerminate, if any remain.  As the window and context are inseparably\nlinked, the object pointer is used as both a context and window handle.\n\nTo see the event stream provided to the various window related callbacks, run\nthe `events` test program.\n\n\n@subsection window_creation Window creation\n\nA window and its OpenGL or OpenGL ES context are created with @ref\nglfwCreateWindow, which returns a handle to the created window object.  For\nexample, this creates a 640 by 480 windowed mode window:\n\n@code\nGLFWwindow* window = glfwCreateWindow(640, 480, \"My Title\", NULL, NULL);\n@endcode\n\nIf window creation fails, `NULL` will be returned, so it is necessary to check\nthe return value.\n\nThe window handle is passed to all window related functions and is provided to\nalong with all input events, so event handlers can tell which window received\nthe event.\n\n\n@subsubsection window_full_screen Full screen windows\n\nTo create a full screen window, you need to specify which monitor the window\nshould use.  In most cases, the user's primary monitor is a good choice.\nFor more information about retrieving monitors, see @ref monitor_monitors. \n\n@code\nGLFWwindow* window = glfwCreateWindow(640, 480, \"My Title\", glfwGetPrimaryMonitor(), NULL);\n@endcode\n\nFull screen windows cover the entire display area of a monitor, have no border\nor decorations.\n\nWindowed mode windows can be made full screen by setting a monitor with @ref\nglfwSetWindowMonitor, and full screen ones can be made windowed by unsetting it\nwith the same function.\n\nEach field of the @ref GLFWvidmode structure corresponds to a function parameter\nor window hint and combine to form the _desired video mode_ for that window.\nThe supported video mode most closely matching the desired video mode will be\nset for the chosen monitor as long as the window has input focus.  For more\ninformation about retrieving video modes, see @ref monitor_modes.\n\nVideo mode field        | Corresponds to\n----------------------- | ------------------------\nGLFWvidmode.width       | `width` parameter\nGLFWvidmode.height      | `height` parameter\nGLFWvidmode.redBits     | @ref GLFW_RED_BITS hint\nGLFWvidmode.greenBits   | @ref GLFW_GREEN_BITS hint\nGLFWvidmode.blueBits    | @ref GLFW_BLUE_BITS hint\nGLFWvidmode.refreshRate | @ref GLFW_REFRESH_RATE hint\n\nOnce you have a full screen window, you can change its resolution, refresh rate\nand monitor with @ref glfwSetWindowMonitor.  If you only need change its\nresolution you can also call @ref glfwSetWindowSize.  In all cases, the new\nvideo mode will be selected the same way as the video mode chosen by @ref\nglfwCreateWindow.  If the window has an OpenGL or OpenGL ES context, it will be\nunaffected.\n\nBy default, the original video mode of the monitor will be restored and the\nwindow iconified if it loses input focus, to allow the user to switch back to\nthe desktop.  This behavior can be disabled with the\n[GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_hint) window hint, for example if you\nwish to simultaneously cover multiple monitors with full screen windows.\n\nIf a monitor is disconnected, any window that is full screen on that monitor\nwill be forced into windowed mode.  See @ref monitor_event for more information.\n\n\n@subsubsection window_windowed_full_screen \"Windowed full screen\" windows\n\nIf the closest match for the desired video mode is the current one, the video\nmode will not be changed, making window creation faster and application\nswitching much smoother.  This is sometimes called _windowed full screen_ or\n_borderless full screen_ window and counts as a full screen window.  To create\nsuch a window, request the current video mode.\n\n@code\nconst GLFWvidmode* mode = glfwGetVideoMode(monitor);\n\nglfwWindowHint(GLFW_RED_BITS, mode->redBits);\nglfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);\nglfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);\nglfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);\n\nGLFWwindow* window = glfwCreateWindow(mode->width, mode->height, \"My Title\", monitor, NULL);\n@endcode\n\nThis also works for windowed mode windows that are made full screen.\n\n@code\nconst GLFWvidmode* mode = glfwGetVideoMode(monitor);\n\nglfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);\n@endcode\n\nNote that @ref glfwGetVideoMode returns the _current_ video mode of a monitor,\nso if you already have a full screen window on that monitor that you want to\nmake windowed full screen, you need to have saved the desktop resolution before.\n\n\n@subsection window_destruction Window destruction\n\nWhen a window is no longer needed, destroy it with @ref glfwDestroyWindow.\n\n@code\nglfwDestroyWindow(window);\n@endcode\n\nWindow destruction always succeeds.  Before the actual destruction, all\ncallbacks are removed so no further events will be delivered for the window.\nAll windows remaining when @ref glfwTerminate is called are destroyed as well.\n\nWhen a full screen window is destroyed, the original video mode of its monitor\nis restored, but the gamma ramp is left untouched.\n\n\n@subsection window_hints Window creation hints\n\nThere are a number of hints that can be set before the creation of a window and\ncontext.  Some affect the window itself, others affect the framebuffer or\ncontext.  These hints are set to their default values each time the library is\ninitialized with @ref glfwInit, can be set individually with @ref glfwWindowHint\nand reset all at once to their defaults with @ref glfwDefaultWindowHints.\n\nSome hints are platform specific.  These are always valid to set on any\nplatform but they will only affect their specific platform.  Other platforms\nwill ignore them.  Setting these hints requires no platform specific headers or\ncalls.\n\nNote that hints need to be set _before_ the creation of the window and context\nyou wish to have the specified attributes.\n\n\n@subsubsection window_hints_hard Hard and soft constraints\n\nSome window hints are hard constraints.  These must match the available\ncapabilities _exactly_ for window and context creation to succeed.  Hints\nthat are not hard constraints are matched as closely as possible, but the\nresulting context and framebuffer may differ from what these hints requested.\n\nThe following hints are always hard constraints:\n- @ref GLFW_STEREO\n- @ref GLFW_DOUBLEBUFFER\n- [GLFW_CLIENT_API](@ref GLFW_CLIENT_API_hint)\n- [GLFW_CONTEXT_CREATION_API](@ref GLFW_CONTEXT_CREATION_API_hint)\n\nThe following additional hints are hard constraints when requesting an OpenGL\ncontext, but are ignored when requesting an OpenGL ES context:\n- [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint)\n- [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint)\n\n\n@subsubsection window_hints_wnd Window related hints\n\n@anchor GLFW_RESIZABLE_hint\n__GLFW_RESIZABLE__ specifies whether the windowed mode window will be resizable\n_by the user_.  The window will still be resizable using the @ref\nglfwSetWindowSize function.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.\nThis hint is ignored for full screen and undecorated windows.\n\n@anchor GLFW_VISIBLE_hint\n__GLFW_VISIBLE__ specifies whether the windowed mode window will be initially\nvisible.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.  This hint is\nignored for full screen windows.\n\n@anchor GLFW_DECORATED_hint\n__GLFW_DECORATED__ specifies whether the windowed mode window will have window\ndecorations such as a border, a close widget, etc.  An undecorated window will\nnot be resizable by the user but will still allow the user to generate close\nevents on some platforms.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.\nThis hint is ignored for full screen windows.\n\n@anchor GLFW_FOCUSED_hint\n__GLFW_FOCUSED__ specifies whether the windowed mode window will be given input\nfocus when created.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.  This\nhint is ignored for full screen and initially hidden windows.\n\n@anchor GLFW_AUTO_ICONIFY_hint\n__GLFW_AUTO_ICONIFY__ specifies whether the full screen window will\nautomatically iconify and restore the previous video mode on input focus loss.\nPossible values are `GLFW_TRUE` and `GLFW_FALSE`.  This hint is ignored for\nwindowed mode windows.\n\n@anchor GLFW_FLOATING_hint\n__GLFW_FLOATING__ specifies whether the windowed mode window will be floating\nabove other regular windows, also called topmost or always-on-top.  This is\nintended primarily for debugging purposes and cannot be used to implement proper\nfull screen windows.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.  This\nhint is ignored for full screen windows.\n\n@anchor GLFW_MAXIMIZED_hint\n__GLFW_MAXIMIZED__ specifies whether the windowed mode window will be maximized\nwhen created.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.  This hint is\nignored for full screen windows.\n\n@anchor GLFW_CENTER_CURSOR_hint\n__GLFW_CENTER_CURSOR__ specifies whether the cursor should be centered over\nnewly created full screen windows.  Possible values are `GLFW_TRUE` and\n`GLFW_FALSE`.  This hint is ignored for windowed mode windows.\n\n@anchor GLFW_TRANSPARENT_hint\n__GLFW_TRANSPARENT__ specifies whether the window framebuffer will be\ntransparent.  If enabled and supported by the system, the window framebuffer\nalpha channel will be used to combine the framebuffer with the background.  This\ndoes not affect window decorations.  Possible values are `GLFW_TRUE` and\n`GLFW_FALSE`.\n\n\n@subsubsection window_hints_fb Framebuffer related hints\n\n@anchor GLFW_RED_BITS\n@anchor GLFW_GREEN_BITS\n@anchor GLFW_BLUE_BITS\n@anchor GLFW_ALPHA_BITS\n@anchor GLFW_DEPTH_BITS\n@anchor GLFW_STENCIL_BITS\n__GLFW_RED_BITS__, __GLFW_GREEN_BITS__, __GLFW_BLUE_BITS__, __GLFW_ALPHA_BITS__,\n__GLFW_DEPTH_BITS__ and __GLFW_STENCIL_BITS__ specify the desired bit depths of\nthe various components of the default framebuffer.  A value of `GLFW_DONT_CARE`\nmeans the application has no preference.\n\n@anchor GLFW_ACCUM_RED_BITS\n@anchor GLFW_ACCUM_GREEN_BITS\n@anchor GLFW_ACCUM_BLUE_BITS\n@anchor GLFW_ACCUM_ALPHA_BITS\n__GLFW_ACCUM_RED_BITS__, __GLFW_ACCUM_GREEN_BITS__, __GLFW_ACCUM_BLUE_BITS__ and\n__GLFW_ACCUM_ALPHA_BITS__ specify the desired bit depths of the various\ncomponents of the accumulation buffer.  A value of `GLFW_DONT_CARE` means the\napplication has no preference.\n\n@par\nAccumulation buffers are a legacy OpenGL feature and should not be used in new\ncode.\n\n@anchor GLFW_AUX_BUFFERS\n__GLFW_AUX_BUFFERS__ specifies the desired number of auxiliary buffers.  A value\nof `GLFW_DONT_CARE` means the application has no preference.\n\n@par\nAuxiliary buffers are a legacy OpenGL feature and should not be used in new\ncode.\n\n@anchor GLFW_STEREO\n__GLFW_STEREO__ specifies whether to use OpenGL stereoscopic rendering.\nPossible values are `GLFW_TRUE` and `GLFW_FALSE`.  This is a hard constraint.\n\n@anchor GLFW_SAMPLES\n__GLFW_SAMPLES__ specifies the desired number of samples to use for\nmultisampling.  Zero disables multisampling.  A value of `GLFW_DONT_CARE` means\nthe application has no preference.\n\n@anchor GLFW_SRGB_CAPABLE\n__GLFW_SRGB_CAPABLE__ specifies whether the framebuffer should be sRGB capable.\nPossible values are `GLFW_TRUE` and `GLFW_FALSE`.\n\n@par\n__OpenGL:__ If enabled and supported by the system, the `GL_FRAMEBUFFER_SRGB`\nenable will control sRGB rendering.  By default, sRGB rendering will be\ndisabled.\n\n@par\n__OpenGL ES:__ If enabled and supported by the system, the context will always\nhave sRGB rendering enabled.\n\n@anchor GLFW_DOUBLEBUFFER\n__GLFW_DOUBLEBUFFER__ specifies whether the framebuffer should be double\nbuffered.  You nearly always want to use double buffering.  This is a hard\nconstraint.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.\n\n\n@subsubsection window_hints_mtr Monitor related hints\n\n@anchor GLFW_REFRESH_RATE\n__GLFW_REFRESH_RATE__ specifies the desired refresh rate for full screen\nwindows.  A value of `GLFW_DONT_CARE` means the highest available refresh rate\nwill be used.  This hint is ignored for windowed mode windows.\n\n\n@subsubsection window_hints_ctx Context related hints\n\n@anchor GLFW_CLIENT_API_hint\n__GLFW_CLIENT_API__ specifies which client API to create the context for.\nPossible values are `GLFW_OPENGL_API`, `GLFW_OPENGL_ES_API` and `GLFW_NO_API`.\nThis is a hard constraint.\n\n@anchor GLFW_CONTEXT_CREATION_API_hint\n__GLFW_CONTEXT_CREATION_API__ specifies which context creation API to use to\ncreate the context.  Possible values are `GLFW_NATIVE_CONTEXT_API`,\n`GLFW_EGL_CONTEXT_API` and `GLFW_OSMESA_CONTEXT_API`.  This is a hard\nconstraint.  If no client API is requested, this hint is ignored.\n\n@par\n@macos The EGL API is not available on this platform and requests to use it\nwill fail.\n\n@par\n__Wayland, Mir:__ The EGL API _is_ the native context creation API, so this hint\nwill have no effect.\n\n@par\n__OSMesa:__ As its name implies, an OpenGL context created with OSMesa does not\nupdate the window contents when its buffers are swapped.  Use OpenGL functions\nor the OSMesa native access functions @ref glfwGetOSMesaColorBuffer and @ref\nglfwGetOSMesaDepthBuffer to retrieve the framebuffer contents.\n\n@note An OpenGL extension loader library that assumes it knows which context\ncreation API is used on a given platform may fail if you change this hint.  This\ncan be resolved by having it load via @ref glfwGetProcAddress, which always uses\nthe selected API.\n\n@bug On some Linux systems, creating contexts via both the native and EGL APIs\nin a single process will cause the application to segfault.  Stick to one API or\nthe other on Linux for now.\n\n@anchor GLFW_CONTEXT_VERSION_MAJOR_hint\n@anchor GLFW_CONTEXT_VERSION_MINOR_hint\n__GLFW_CONTEXT_VERSION_MAJOR__ and __GLFW_CONTEXT_VERSION_MINOR__ specify the\nclient API version that the created context must be compatible with.  The exact\nbehavior of these hints depend on the requested client API.\n\n@note Do not confuse these hints with `GLFW_VERSION_MAJOR` and\n`GLFW_VERSION_MINOR`, which provide the API version of the GLFW header.\n\n@par\n__OpenGL:__ These hints are not hard constraints, but creation will fail if the\nOpenGL version of the created context is less than the one requested.  It is\ntherefore perfectly safe to use the default of version 1.0 for legacy code and\nyou will still get backwards-compatible contexts of version 3.0 and above when\navailable.\n\n@par\nWhile there is no way to ask the driver for a context of the highest supported\nversion, GLFW will attempt to provide this when you ask for a version 1.0\ncontext, which is the default for these hints.\n\n@par\n__OpenGL ES:__ These hints are not hard constraints, but creation will fail if\nthe OpenGL ES version of the created context is less than the one requested.\nAdditionally, OpenGL ES 1.x cannot be returned if 2.0 or later was requested,\nand vice versa.  This is because OpenGL ES 3.x is backward compatible with 2.0,\nbut OpenGL ES 2.0 is not backward compatible with 1.x.\n\n@note @macos The OS only supports forward-compatible core profile contexts for\nOpenGL versions 3.2 and later.  Before creating an OpenGL context of version\n3.2 or later you must set the\n[GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and\n[GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly.  OpenGL\n3.0 and 3.1 contexts are not supported at all on macOS.\n\n@anchor GLFW_OPENGL_FORWARD_COMPAT_hint\n__GLFW_OPENGL_FORWARD_COMPAT__ specifies whether the OpenGL context should be\nforward-compatible, i.e. one where all functionality deprecated in the requested\nversion of OpenGL is removed.  This must only be used if the requested OpenGL\nversion is 3.0 or above.  If OpenGL ES is requested, this hint is ignored.\n\n@par\nForward-compatibility is described in detail in the\n[OpenGL Reference Manual](https://www.opengl.org/registry/).\n\n@anchor GLFW_OPENGL_DEBUG_CONTEXT_hint\n__GLFW_OPENGL_DEBUG_CONTEXT__ specifies whether to create a debug OpenGL\ncontext, which may have additional error and performance issue reporting\nfunctionality.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.  If OpenGL ES\nis requested, this hint is ignored.\n\n@anchor GLFW_OPENGL_PROFILE_hint\n__GLFW_OPENGL_PROFILE__ specifies which OpenGL profile to create the context\nfor.  Possible values are one of `GLFW_OPENGL_CORE_PROFILE` or\n`GLFW_OPENGL_COMPAT_PROFILE`, or `GLFW_OPENGL_ANY_PROFILE` to not request\na specific profile.  If requesting an OpenGL version below 3.2,\n`GLFW_OPENGL_ANY_PROFILE` must be used.  If OpenGL ES is requested, this hint\nis ignored.\n\n@par\nOpenGL profiles are described in detail in the\n[OpenGL Reference Manual](https://www.opengl.org/registry/).\n\n@anchor GLFW_CONTEXT_ROBUSTNESS_hint\n__GLFW_CONTEXT_ROBUSTNESS__ specifies the robustness strategy to be used by the\ncontext.  This can be one of `GLFW_NO_RESET_NOTIFICATION` or\n`GLFW_LOSE_CONTEXT_ON_RESET`, or `GLFW_NO_ROBUSTNESS` to not request\na robustness strategy.\n\n@anchor GLFW_CONTEXT_RELEASE_BEHAVIOR_hint\n__GLFW_CONTEXT_RELEASE_BEHAVIOR__ specifies the release behavior to be\nused by the context.  Possible values are one of `GLFW_ANY_RELEASE_BEHAVIOR`,\n`GLFW_RELEASE_BEHAVIOR_FLUSH` or `GLFW_RELEASE_BEHAVIOR_NONE`.  If the\nbehavior is `GLFW_ANY_RELEASE_BEHAVIOR`, the default behavior of the context\ncreation API will be used.  If the behavior is `GLFW_RELEASE_BEHAVIOR_FLUSH`,\nthe pipeline will be flushed whenever the context is released from being the\ncurrent one.  If the behavior is `GLFW_RELEASE_BEHAVIOR_NONE`, the pipeline will\nnot be flushed on release.\n\n@par\nContext release behaviors are described in detail by the\n[GL_KHR_context_flush_control](https://www.opengl.org/registry/specs/KHR/context_flush_control.txt)\nextension.\n\n@anchor GLFW_CONTEXT_NO_ERROR_hint\n__GLFW_CONTEXT_NO_ERROR__ specifies whether errors should be generated by the\ncontext.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.  If enabled,\nsituations that would have generated errors instead cause undefined behavior.\n\n@par\nThe no error mode for OpenGL and OpenGL ES is described in detail by the\n[GL_KHR_no_error](https://www.opengl.org/registry/specs/KHR/no_error.txt)\nextension.\n\n\n@subsubsection window_hints_osx macOS specific window hints\n\n@anchor GLFW_COCOA_RETINA_FRAMEBUFFER_hint\n__GLFW_COCOA_RETINA_FRAMEBUFFER__ specifies whether to use full resolution\nframebuffers on Retina displays.  Possible values are `GLFW_TRUE` and\n`GLFW_FALSE`.  This is ignored on other platforms.\n\n@anchor GLFW_COCOA_FRAME_AUTOSAVE_hint\n__GLFW_COCOA_FRAME_AUTOSAVE__ specifies whether to activate frame autosaving\nusing the window title specified at window creation.  Possible values are\n`GLFW_TRUE` and `GLFW_FALSE`.  This is ignored on other platforms.\n\n@anchor GLFW_COCOA_GRAPHICS_SWITCHING_hint\n__GLFW_COCOA_GRAPHICS_SWITCHING__ specifies whether to in Automatic Graphics\nSwitching, i.e. to allow the system to choose the integrated GPU for the OpenGL\ncontext and move it between GPUs if necessary or whether to force it to always\nrun on the discrete GPU.  This only affects systems with both integrated and\ndiscrete GPUs.  Possible values are `GLFW_TRUE` and `GLFW_FALSE`.  This is\nignored on other platforms.\n\n@par\nSimpler programs and tools may want to enable this to save power, while games\nand other applications performing advanced rendering will want to leave it\ndisabled.\n\n@par\nA bundled application that wishes to participate in Automatic Graphics Switching\nshould also declare this in its `Info.plist` by setting the\n`NSSupportsAutomaticGraphicsSwitching` key to `true`.\n\n\n@subsubsection window_hints_values Supported and default values\n\nWindow hint                   | Default value               | Supported values\n----------------------------- | --------------------------- | ----------------\nGLFW_RESIZABLE                | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_VISIBLE                  | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_DECORATED                | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_FOCUSED                  | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_AUTO_ICONIFY             | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_FLOATING                 | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_MAXIMIZED                | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_CENTER_CURSOR            | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_TRANSPARENT              | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_RED_BITS                 | 8                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_GREEN_BITS               | 8                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_BLUE_BITS                | 8                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_ALPHA_BITS               | 8                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_DEPTH_BITS               | 24                          | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_STENCIL_BITS             | 8                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_ACCUM_RED_BITS           | 0                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_ACCUM_GREEN_BITS         | 0                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_ACCUM_BLUE_BITS          | 0                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_ACCUM_ALPHA_BITS         | 0                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_AUX_BUFFERS              | 0                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_SAMPLES                  | 0                           | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_REFRESH_RATE             | `GLFW_DONT_CARE`            | 0 to `INT_MAX` or `GLFW_DONT_CARE`\nGLFW_STEREO                   | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_SRGB_CAPABLE             | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_DOUBLEBUFFER             | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_CLIENT_API               | `GLFW_OPENGL_API`           | `GLFW_OPENGL_API`, `GLFW_OPENGL_ES_API` or `GLFW_NO_API`\nGLFW_CONTEXT_CREATION_API     | `GLFW_NATIVE_CONTEXT_API`   | `GLFW_NATIVE_CONTEXT_API`, `GLFW_EGL_CONTEXT_API` or `GLFW_OSMESA_CONTEXT_API`\nGLFW_CONTEXT_VERSION_MAJOR    | 1                           | Any valid major version number of the chosen client API\nGLFW_CONTEXT_VERSION_MINOR    | 0                           | Any valid minor version number of the chosen client API\nGLFW_CONTEXT_ROBUSTNESS       | `GLFW_NO_ROBUSTNESS`        | `GLFW_NO_ROBUSTNESS`, `GLFW_NO_RESET_NOTIFICATION` or `GLFW_LOSE_CONTEXT_ON_RESET`\nGLFW_CONTEXT_RELEASE_BEHAVIOR | `GLFW_ANY_RELEASE_BEHAVIOR` | `GLFW_ANY_RELEASE_BEHAVIOR`, `GLFW_RELEASE_BEHAVIOR_FLUSH` or `GLFW_RELEASE_BEHAVIOR_NONE`\nGLFW_OPENGL_FORWARD_COMPAT    | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_OPENGL_DEBUG_CONTEXT     | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_OPENGL_PROFILE           | `GLFW_OPENGL_ANY_PROFILE`   | `GLFW_OPENGL_ANY_PROFILE`, `GLFW_OPENGL_COMPAT_PROFILE` or `GLFW_OPENGL_CORE_PROFILE`\nGLFW_COCOA_RETINA_FRAMEBUFFER | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_COCOA_FRAME_AUTOSAVE     | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\nGLFW_COCOA_GRAPHICS_SWITCHING | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`\n\n\n@section window_events Window event processing\n\nSee @ref events.\n\n\n@section window_properties Window properties and events\n\n@subsection window_userptr User pointer\n\nEach window has a user pointer that can be set with @ref\nglfwSetWindowUserPointer and fetched with @ref glfwGetWindowUserPointer.  This\ncan be used for any purpose you need and will not be modified by GLFW throughout\nthe life-time of the window.\n\nThe initial value of the pointer is `NULL`.\n\n\n@subsection window_close Window closing and close flag\n\nWhen the user attempts to close the window, for example by clicking the close\nwidget or using a key chord like Alt+F4, the _close flag_ of the window is set.\nThe window is however not actually destroyed and, unless you watch for this\nstate change, nothing further happens.\n\nThe current state of the close flag is returned by @ref glfwWindowShouldClose\nand can be set or cleared directly with @ref glfwSetWindowShouldClose.  A common\npattern is to use the close flag as a main loop condition.\n\n@code\nwhile (!glfwWindowShouldClose(window))\n{\n    render(window);\n\n    glfwSwapBuffers(window);\n    glfwPollEvents();\n}\n@endcode\n\nIf you wish to be notified when the user attempts to close a window, set a close\ncallback.\n\n@code\nglfwSetWindowCloseCallback(window, window_close_callback);\n@endcode\n\nThe callback function is called directly _after_ the close flag has been set.\nIt can be used for example to filter close requests and clear the close flag\nagain unless certain conditions are met.\n\n@code\nvoid window_close_callback(GLFWwindow* window)\n{\n    if (!time_to_close)\n        glfwSetWindowShouldClose(window, GLFW_FALSE);\n}\n@endcode\n\n\n@subsection window_size Window size\n\nThe size of a window can be changed with @ref glfwSetWindowSize.  For windowed\nmode windows, this sets the size, in\n[screen coordinates](@ref coordinate_systems) of the _client area_ or _content\narea_ of the window.  The window system may impose limits on window size.\n\n@code\nglfwSetWindowSize(window, 640, 480);\n@endcode\n\nFor full screen windows, the specified size becomes the new resolution of the\nwindow's desired video mode.  The video mode most closely matching the new\ndesired video mode is set immediately.  The window is resized to fit the\nresolution of the set video mode.\n\nIf you wish to be notified when a window is resized, whether by the user or\nthe system, set a size callback.\n\n@code\nglfwSetWindowSizeCallback(window, window_size_callback);\n@endcode\n\nThe callback function receives the new size, in screen coordinates, of the\nclient area of the window when it is resized.\n\n@code\nvoid window_size_callback(GLFWwindow* window, int width, int height)\n{\n}\n@endcode\n\nThere is also @ref glfwGetWindowSize for directly retrieving the current size of\na window.\n\n@code\nint width, height;\nglfwGetWindowSize(window, &width, &height);\n@endcode\n\n@note Do not pass the window size to `glViewport` or other pixel-based OpenGL\ncalls.  The window size is in screen coordinates, not pixels.  Use the\n[framebuffer size](@ref window_fbsize), which is in pixels, for pixel-based\ncalls.\n\nThe above functions work with the size of the client area, but decorated windows\ntypically have title bars and window frames around this rectangle.  You can\nretrieve the extents of these with @ref glfwGetWindowFrameSize.\n\n@code\nint left, top, right, bottom;\nglfwGetWindowFrameSize(window, &left, &top, &right, &bottom);\n@endcode\n\nThe returned values are the distances, in screen coordinates, from the edges of\nthe client area to the corresponding edges of the full window.  As they are\ndistances and not coordinates, they are always zero or positive.\n\n\n@subsection window_fbsize Framebuffer size\n\nWhile the size of a window is measured in screen coordinates, OpenGL works with\npixels.  The size you pass into `glViewport`, for example, should be in pixels.\nOn some machines screen coordinates and pixels are the same, but on others they\nwill not be.  There is a second set of functions to retrieve the size, in\npixels, of the framebuffer of a window.\n\nIf you wish to be notified when the framebuffer of a window is resized, whether\nby the user or the system, set a size callback.\n\n@code\nglfwSetFramebufferSizeCallback(window, framebuffer_size_callback);\n@endcode\n\nThe callback function receives the new size of the framebuffer when it is\nresized, which can for example be used to update the OpenGL viewport.\n\n@code\nvoid framebuffer_size_callback(GLFWwindow* window, int width, int height)\n{\n    glViewport(0, 0, width, height);\n}\n@endcode\n\nThere is also @ref glfwGetFramebufferSize for directly retrieving the current\nsize of the framebuffer of a window.\n\n@code\nint width, height;\nglfwGetFramebufferSize(window, &width, &height);\nglViewport(0, 0, width, height);\n@endcode\n\nThe size of a framebuffer may change independently of the size of a window, for\nexample if the window is dragged between a regular monitor and a high-DPI one.\n\n\n@subsection window_sizelimits Window size limits\n\nThe minimum and maximum size of the client area of a windowed mode window can be\nenforced with @ref glfwSetWindowSizeLimits.  The user may resize the window to\nany size and aspect ratio within the specified limits, unless the aspect ratio\nis also set.\n\n@code\nglfwSetWindowSizeLimits(window, 200, 200, 400, 400);\n@endcode\n\nTo specify only a minimum size or only a maximum one, set the other pair to\n`GLFW_DONT_CARE`.\n\n@code\nglfwSetWindowSizeLimits(window, 640, 480, GLFW_DONT_CARE, GLFW_DONT_CARE);\n@endcode\n\nTo disable size limits for a window, set them all to `GLFW_DONT_CARE`.\n\nThe aspect ratio of the client area of a windowed mode window can be enforced\nwith @ref glfwSetWindowAspectRatio.  The user may resize the window freely\nunless size limits are also set, but the size will be constrained to maintain\nthe aspect ratio.\n\n@code\nglfwSetWindowAspectRatio(window, 16, 9);\n@endcode\n\nThe aspect ratio is specified as a numerator and denominator, corresponding to\nthe width and height, respectively.  If you want a window to maintain its\ncurrent aspect ratio, use its current size as the ratio.\n\n@code\nint width, height;\nglfwGetWindowSize(window, &width, &height);\nglfwSetWindowAspectRatio(window, width, height);\n@endcode\n\nTo disable the aspect ratio limit for a window, set both terms to\n`GLFW_DONT_CARE`.\n\nYou can have both size limits and aspect ratio set for a window, but the results\nare undefined if they conflict.\n\n\n@subsection window_pos Window position\n\nThe position of a windowed-mode window can be changed with @ref\nglfwSetWindowPos.  This moves the window so that the upper-left corner of its\nclient area has the specified [screen coordinates](@ref coordinate_systems).\nThe window system may put limitations on window placement.\n\n@code\nglfwSetWindowPos(window, 100, 100);\n@endcode\n\nIf you wish to be notified when a window is moved, whether by the user, system\nor your own code, set a position callback.\n\n@code\nglfwSetWindowPosCallback(window, window_pos_callback);\n@endcode\n\nThe callback function receives the new position of the upper-left corner of the \nclient area when the window is moved.\n\n@code\nvoid window_pos_callback(GLFWwindow* window, int xpos, int ypos)\n{\n}\n@endcode\n\nThere is also @ref glfwGetWindowPos for directly retrieving the current position\nof the client area of the window.\n\n@code\nint xpos, ypos;\nglfwGetWindowPos(window, &xpos, &ypos);\n@endcode\n\n\n@subsection window_title Window title\n\nAll GLFW windows have a title, although undecorated or full screen windows may\nnot display it or only display it in a task bar or similar interface.  You can\nset a UTF-8 encoded window title with @ref glfwSetWindowTitle.\n\n@code\nglfwSetWindowTitle(window, \"My Window\");\n@endcode\n\nThe specified string is copied before the function returns, so there is no need\nto keep it around.\n\nAs long as your source file is encoded as UTF-8, you can use any Unicode\ncharacters directly in the source.\n\n@code\nglfwSetWindowTitle(window, \"ラストエグザイル\");\n@endcode\n\nIf you are using C++11 or C11, you can use a UTF-8 string literal.\n\n@code\nglfwSetWindowTitle(window, u8\"This is always a UTF-8 string\");\n@endcode\n\n\n@subsection window_icon Window icon\n\nDecorated windows have icons on some platforms.  You can set this icon by\nspecifying a list of candidate images with @ref glfwSetWindowIcon.\n\n@code\nGLFWimage images[2];\nimages[0] = load_icon(\"my_icon.png\");\nimages[1] = load_icon(\"my_icon_small.png\");\n\nglfwSetWindowIcon(window, 2, images);\n@endcode\n\nThe image data is 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits\nper channel with the red channel first.  The pixels are arranged canonically as\nsequential rows, starting from the top-left corner.\n\nTo revert to the default window icon, pass in an empty image array.\n\n@code\nglfwSetWindowIcon(window, 0, NULL);\n@endcode\n\n\n@subsection window_monitor Window monitor\n\nFull screen windows are associated with a specific monitor.  You can get the\nhandle for this monitor with @ref glfwGetWindowMonitor.\n\n@code\nGLFWmonitor* monitor = glfwGetWindowMonitor(window);\n@endcode\n\nThis monitor handle is one of those returned by @ref glfwGetMonitors.\n\nFor windowed mode windows, this function returns `NULL`.  This is how to tell\nfull screen windows from windowed mode windows.\n\nYou can move windows between monitors or between full screen and windowed mode\nwith @ref glfwSetWindowMonitor.  When making a window full screen on the same or\non a different monitor, specify the desired monitor, resolution and refresh\nrate.  The position arguments are ignored.\n\n@code\nconst GLFWvidmode* mode = glfwGetVideoMode(monitor);\n\nglfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);\n@endcode\n\nWhen making the window windowed, specify the desired position and size.  The\nrefresh rate argument is ignored.\n\n@code\nglfwSetWindowMonitor(window, NULL, xpos, ypos, width, height, 0);\n@endcode\n\nThis restores any previous window settings such as whether it is decorated,\nfloating, resizable, has size or aspect ratio limits, etc..  To restore a window\nthat was originally windowed to its original size and position, save these\nbefore making it full screen and then pass them in as above.\n\n\n@subsection window_iconify Window iconification\n\nWindows can be iconified (i.e. minimized) with @ref glfwIconifyWindow.\n\n@code\nglfwIconifyWindow(window);\n@endcode\n\nWhen a full screen window is iconified, the original video mode of its monitor\nis restored until the user or application restores the window.\n\nIconified windows can be restored with @ref glfwRestoreWindow.  This function\nalso restores windows from maximization.\n\n@code\nglfwRestoreWindow(window);\n@endcode\n\nWhen a full screen window is restored, the desired video mode is restored to its\nmonitor as well.\n\nIf you wish to be notified when a window is iconified or restored, whether by\nthe user, system or your own code, set a iconify callback.\n\n@code\nglfwSetWindowIconifyCallback(window, window_iconify_callback);\n@endcode\n\nThe callback function receives changes in the iconification state of the window.\n\n@code\nvoid window_iconify_callback(GLFWwindow* window, int iconified)\n{\n    if (iconified)\n    {\n        // The window was iconified\n    }\n    else\n    {\n        // The window was restored\n    }\n}\n@endcode\n\nYou can also get the current iconification state with @ref glfwGetWindowAttrib.\n\n@code\nint iconified = glfwGetWindowAttrib(window, GLFW_ICONIFIED);\n@endcode\n\n\n@subsection window_maximize Window maximization\n\nWindows can be maximized (i.e. zoomed) with @ref glfwMaximizeWindow.\n\n@code\nglfwMaximizeWindow(window);\n@endcode\n\nFull screen windows cannot be maximized and passing a full screen window to this\nfunction does nothing.\n\nMaximized windows can be restored with @ref glfwRestoreWindow.  This function\nalso restores windows from iconification.\n\n@code\nglfwRestoreWindow(window);\n@endcode\n\nIf you wish to be notified when a window is maximized or restored, whether by\nthe user, system or your own code, set a maximize callback.\n\n@code\nglfwSetWindowMaximizeCallback(window, window_maximize_callback);\n@endcode\n\nThe callback function receives changes in the maximization state of the window.\n\n@code\nvoid window_maximize_callback(GLFWwindow* window, int maximized)\n{\n    if (maximized)\n    {\n        // The window was maximized\n    }\n    else\n    {\n        // The window was restored\n    }\n}\n@endcode\n\nYou can also get the current maximization state with @ref glfwGetWindowAttrib.\n\n@code\nint maximized = glfwGetWindowAttrib(window, GLFW_MAXIMIZED);\n@endcode\n\nBy default, newly created windows are not maximized.  You can change this\nbehavior by setting the [GLFW_MAXIMIZED](@ref GLFW_MAXIMIZED_hint) window hint\nbefore creating the window.\n\n@code\nglfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE);\n@endcode\n\n\n@subsection window_hide Window visibility\n\nWindowed mode windows can be hidden with @ref glfwHideWindow.\n\n@code\nglfwHideWindow(window);\n@endcode\n\nThis makes the window completely invisible to the user, including removing it\nfrom the task bar, dock or window list.  Full screen windows cannot be hidden\nand calling @ref glfwHideWindow on a full screen window does nothing.\n\nHidden windows can be shown with @ref glfwShowWindow.\n\n@code\nglfwShowWindow(window);\n@endcode\n\n\nYou can also get the current visibility state with @ref glfwGetWindowAttrib.\n\n@code\nint visible = glfwGetWindowAttrib(window, GLFW_VISIBLE);\n@endcode\n\nBy default, newly created windows are visible.  You can change this behavior by\nsetting the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window hint before creating\nthe window.\n\n@code\nglfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);\n@endcode\n\nWindows created hidden are completely invisible to the user until shown.  This\ncan be useful if you need to set up your window further before showing it, for\nexample moving it to a specific location.\n\n\n@subsection window_focus Window input focus\n\nWindows can be given input focus and brought to the front with @ref\nglfwFocusWindow.\n\n@code\nglfwFocusWindow(window);\n@endcode\n\nKeep in mind that it can be very disruptive to the user when a window is forced\nto the top.  For a less disruptive way of getting the user's attention, see\n[attention requests](@ref window_attention).\n\nIf you wish to be notified when a window gains or loses input focus, whether by\nthe user, system or your own code, set a focus callback.\n\n@code\nglfwSetWindowFocusCallback(window, window_focus_callback);\n@endcode\n\nThe callback function receives changes in the input focus state of the window.\n\n@code\nvoid window_focus_callback(GLFWwindow* window, int focused)\n{\n    if (focused)\n    {\n        // The window gained input focus\n    }\n    else\n    {\n        // The window lost input focus\n    }\n}\n@endcode\n\nYou can also get the current input focus state with @ref glfwGetWindowAttrib.\n\n@code\nint focused = glfwGetWindowAttrib(window, GLFW_FOCUSED);\n@endcode\n\nBy default, newly created windows are given input focus.  You can change this\nbehavior by setting the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) window hint\nbefore creating the window.\n\n@code\nglfwWindowHint(GLFW_FOCUSED, GLFW_FALSE);\n@endcode\n\n\n@subsection window_attention Window attention request\n\nIf you wish to notify the user of an event without interrupting, you can request\nattention with @ref glfwRequestWindowAttention.\n\n@code\nglfwRequestWindowAttention(window);\n@endcode\n\nThe system will highlight the specified window, or on platforms where this is\nnot supported, the application as a whole.  Once the user has given it\nattention, the system will automatically end the request.\n\n\n@subsection window_refresh Window damage and refresh\n\nIf you wish to be notified when the contents of a window is damaged and needs\nto be refreshed, set a window refresh callback.\n\n@code\nglfwSetWindowRefreshCallback(m_handle, window_refresh_callback);\n@endcode\n\nThe callback function is called when the contents of the window needs to be\nrefreshed.\n\n@code\nvoid window_refresh_callback(GLFWwindow* window)\n{\n    draw_editor_ui(window);\n    glfwSwapBuffers(window);\n}\n@endcode\n\n@note On compositing window systems such as Aero, Compiz or Aqua, where the\nwindow contents are saved off-screen, this callback might only be called when\nthe window or framebuffer is resized.\n\n\n@subsection window_transparency Window transparency\n\nWindow framebuffers can be made transparent on a per-pixel per-frame basis with\nthe [GLFW_TRANSPARENT](@ref GLFW_TRANSPARENT_hint) window hint.\n\n@code\nglfwWindowHint(GLFW_TRANSPARENT, GLFW_TRUE);\n@endcode\n\nIf supported by the system, the window framebuffer will be composited with the\nbackground using the framebuffer per-pixel alpha channel.  This requires desktop\ncompositing to be enabled on the system.  It does not affect window decorations.\n\nYou can check whether the window framebuffer was successfully made transparent\nwith the [GLFW_TRANSPARENT](@ref GLFW_TRANSPARENT_attrib) window attribute.\n\n@code\nif (glfwGetWindowAttrib(window, GLFW_TRANSPARENT))\n{\n    // window framebuffer is currently transparent\n}\n@endcode\n\n\n@subsection window_attribs Window attributes\n\nWindows have a number of attributes that can be returned using @ref\nglfwGetWindowAttrib.  Some reflect state that may change as a result of user\ninteraction, (e.g. whether it has input focus), while others reflect inherent\nproperties of the window (e.g. what kind of border it has).  Some are related to\nthe window and others to its OpenGL or OpenGL ES context.\n\n@code\nif (glfwGetWindowAttrib(window, GLFW_FOCUSED))\n{\n    // window has input focus\n}\n@endcode\n\nThe [GLFW_DECORATED](@ref GLFW_DECORATED_attrib),\n[GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib),\n[GLFW_FLOATING](@ref GLFW_FLOATING_attrib) and\n[GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) window attributes can be\nchanged with @ref glfwSetWindowAttrib.\n\n@code\nglfwSetWindowAttrib(window, GLFW_RESIZABLE, GLFW_FALSE);\n@endcode\n\n\n\n@subsubsection window_attribs_wnd Window related attributes\n\n@anchor GLFW_FOCUSED_attrib\n__GLFW_FOCUSED__ indicates whether the specified window has input focus.  See\n@ref window_focus for details.\n\n@anchor GLFW_ICONIFIED_attrib\n__GLFW_ICONIFIED__ indicates whether the specified window is iconified.\nSee @ref window_iconify for details.\n\n@anchor GLFW_MAXIMIZED_attrib\n__GLFW_MAXIMIZED__ indicates whether the specified window is maximized.  See\n@ref window_maximize for details.\n\n@anchor GLFW_VISIBLE_attrib\n__GLFW_VISIBLE__ indicates whether the specified window is visible.  See @ref\nwindow_hide for details.\n\n@anchor GLFW_RESIZABLE_attrib\n__GLFW_RESIZABLE__ indicates whether the specified window is resizable _by the\nuser_.  This can be set before creation with the\n[GLFW_RESIZABLE](@ref GLFW_RESIZABLE_hint) window hint or after with @ref\nglfwSetWindowAttrib.\n\n@anchor GLFW_DECORATED_attrib\n__GLFW_DECORATED__ indicates whether the specified window has decorations such\nas a border, a close widget, etc.  This can be set before creation with the\n[GLFW_DECORATED](@ref GLFW_DECORATED_hint) window hint or after with @ref\nglfwSetWindowAttrib.\n\n@anchor GLFW_AUTO_ICONIFY_attrib\n__GLFW_AUTO_ICONIFY__ indicates whether the specified full screen window is\niconified on focus loss, a close widget, etc.  This can be set before creation\nwith the [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_hint) window hint or after\nwith @ref glfwSetWindowAttrib.\n\n@anchor GLFW_FLOATING_attrib\n__GLFW_FLOATING__ indicates whether the specified window is floating, also\ncalled topmost or always-on-top.  This can be set before creation with the\n[GLFW_FLOATING](@ref GLFW_FLOATING_hint) window hint or after with @ref\nglfwSetWindowAttrib.\n\n@anchor GLFW_TRANSPARENT_attrib\n__GLFW_TRANSPARENT__ indicates whether the specified window has a transparent\nframebuffer, i.e. the window contents is composited with the background using\nthe window framebuffer alpha channel.  See @ref window_transparency for details.\n\n\n@subsubsection window_attribs_ctx Context related attributes\n\n@anchor GLFW_CLIENT_API_attrib\n__GLFW_CLIENT_API__ indicates the client API provided by the window's context;\neither `GLFW_OPENGL_API`, `GLFW_OPENGL_ES_API` or `GLFW_NO_API`.\n\n@anchor GLFW_CONTEXT_CREATION_API_attrib\n__GLFW_CONTEXT_CREATION_API__ indicates the context creation API used to create\nthe window's context; either `GLFW_NATIVE_CONTEXT_API`, `GLFW_EGL_CONTEXT_API`\nor `GLFW_OSMESA_CONTEXT_API`.\n\n@anchor GLFW_CONTEXT_VERSION_MAJOR_attrib\n@anchor GLFW_CONTEXT_VERSION_MINOR_attrib\n@anchor GLFW_CONTEXT_REVISION_attrib\n__GLFW_CONTEXT_VERSION_MAJOR__, __GLFW_CONTEXT_VERSION_MINOR__ and\n__GLFW_CONTEXT_REVISION__ indicate the client API version of the window's\ncontext.\n\n@note Do not confuse these attributes with `GLFW_VERSION_MAJOR`,\n`GLFW_VERSION_MINOR` and `GLFW_VERSION_REVISION` which provide the API version\nof the GLFW header.\n\n@anchor GLFW_OPENGL_FORWARD_COMPAT_attrib\n__GLFW_OPENGL_FORWARD_COMPAT__ is `GLFW_TRUE` if the window's context is an\nOpenGL forward-compatible one, or `GLFW_FALSE` otherwise.\n\n@anchor GLFW_OPENGL_DEBUG_CONTEXT_attrib\n__GLFW_OPENGL_DEBUG_CONTEXT__ is `GLFW_TRUE` if the window's context is an\nOpenGL debug context, or `GLFW_FALSE` otherwise.\n\n@anchor GLFW_OPENGL_PROFILE_attrib\n__GLFW_OPENGL_PROFILE__ indicates the OpenGL profile used by the context.  This\nis `GLFW_OPENGL_CORE_PROFILE` or `GLFW_OPENGL_COMPAT_PROFILE` if the context\nuses a known profile, or `GLFW_OPENGL_ANY_PROFILE` if the OpenGL profile is\nunknown or the context is an OpenGL ES context.  Note that the returned profile\nmay not match the profile bits of the context flags, as GLFW will try other\nmeans of detecting the profile when no bits are set.\n\n@anchor GLFW_CONTEXT_ROBUSTNESS_attrib\n__GLFW_CONTEXT_ROBUSTNESS__ indicates the robustness strategy used by the\ncontext.  This is `GLFW_LOSE_CONTEXT_ON_RESET` or `GLFW_NO_RESET_NOTIFICATION`\nif the window's context supports robustness, or `GLFW_NO_ROBUSTNESS` otherwise.\n\n\n@subsubsection window_attribs_fb Framebuffer related attributes\n\nGLFW does not expose attributes of the default framebuffer (i.e. the framebuffer\nattached to the window) as these can be queried directly with either OpenGL,\nOpenGL ES or Vulkan.\n\nIf you are using version 3.0 or later of OpenGL or OpenGL ES, the\n`glGetFramebufferAttachmentParameteriv` function can be used to retrieve the\nnumber of bits for the red, green, blue, alpha, depth and stencil buffer\nchannels.  Otherwise, the `glGetIntegerv` function can be used.\n\nThe number of MSAA samples are always retrieved with `glGetIntegerv`.  For\ncontexts supporting framebuffer objects, the number of samples of the currently\nbound framebuffer is returned.\n\nAttribute    | glGetIntegerv     | glGetFramebufferAttachmentParameteriv\n------------ | ----------------- | -------------------------------------\nRed bits     | `GL_RED_BITS`     | `GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE`\nGreen bits   | `GL_GREEN_BITS`   | `GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE`\nBlue bits    | `GL_BLUE_BITS`    | `GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE`\nAlpha bits   | `GL_ALPHA_BITS`   | `GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE`\nDepth bits   | `GL_DEPTH_BITS`   | `GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE`\nStencil bits | `GL_STENCIL_BITS` | `GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE`\nMSAA samples | `GL_SAMPLES`      | _Not provided by this function_\n\nWhen calling `glGetFramebufferAttachmentParameteriv`, the red, green, blue and\nalpha sizes are queried from the `GL_BACK_LEFT`, while the depth and stencil\nsizes are queried from the `GL_DEPTH` and `GL_STENCIL` attachments,\nrespectively.\n\n\n@section buffer_swap Buffer swapping\n\nGLFW windows are by default double buffered.  That means that you have two\nrendering buffers; a front buffer and a back buffer.  The front buffer is\nthe one being displayed and the back buffer the one you render to.\n\nWhen the entire frame has been rendered, it is time to swap the back and the\nfront buffers in order to display what has been rendered and begin rendering\na new frame.  This is done with @ref glfwSwapBuffers.\n\n@code\nglfwSwapBuffers(window);\n@endcode\n\nSometimes it can be useful to select when the buffer swap will occur.  With the\nfunction @ref glfwSwapInterval it is possible to select the minimum number of\nmonitor refreshes the driver wait should from the time @ref glfwSwapBuffers was\ncalled before swapping the buffers:\n\n@code\nglfwSwapInterval(1);\n@endcode\n\nIf the interval is zero, the swap will take place immediately when @ref\nglfwSwapBuffers is called without waiting for a refresh.  Otherwise at least\ninterval retraces will pass between each buffer swap.  Using a swap interval of\nzero can be useful for benchmarking purposes, when it is not desirable to\nmeasure the time it takes to wait for the vertical retrace.  However, a swap\ninterval of one lets you avoid tearing.\n\nNote that this may not work on all machines, as some drivers have\nuser-controlled settings that override any swap interval the application\nrequests.\n\n*/\n"
  },
  {
    "path": "external/GLFW/examples/CMakeLists.txt",
    "content": "\nlink_libraries(glfw)\n\ninclude_directories(${glfw_INCLUDE_DIRS} \"${GLFW_SOURCE_DIR}/deps\")\n\nif (MATH_LIBRARY)\n    link_libraries(\"${MATH_LIBRARY}\")\nendif()\n\nif (MSVC)\n    add_definitions(-D_CRT_SECURE_NO_WARNINGS)\nendif()\n\nif (GLFW_USE_OSMESA)\n    add_definitions(-DUSE_NATIVE_OSMESA)\nendif()\n\nif (WIN32)\n    set(ICON glfw.rc)\nelseif (APPLE)\n    set(ICON glfw.icns)\n    set_source_files_properties(glfw.icns PROPERTIES\n        MACOSX_PACKAGE_LOCATION \"Resources\")\nendif()\n\nset(GLAD \"${GLFW_SOURCE_DIR}/deps/glad/glad.h\"\n         \"${GLFW_SOURCE_DIR}/deps/glad.c\")\nset(GETOPT \"${GLFW_SOURCE_DIR}/deps/getopt.h\"\n           \"${GLFW_SOURCE_DIR}/deps/getopt.c\")\nset(TINYCTHREAD \"${GLFW_SOURCE_DIR}/deps/tinycthread.h\"\n                \"${GLFW_SOURCE_DIR}/deps/tinycthread.c\")\n\nadd_executable(boing WIN32 MACOSX_BUNDLE boing.c ${ICON} ${GLAD})\nadd_executable(gears WIN32 MACOSX_BUNDLE gears.c ${ICON} ${GLAD})\nadd_executable(heightmap WIN32 MACOSX_BUNDLE heightmap.c ${ICON} ${GLAD})\nadd_executable(offscreen offscreen.c ${ICON} ${GLAD})\nadd_executable(particles WIN32 MACOSX_BUNDLE particles.c ${ICON} ${TINYCTHREAD} ${GETOPT} ${GLAD})\nadd_executable(simple WIN32 MACOSX_BUNDLE simple.c ${ICON} ${GLAD})\nadd_executable(splitview WIN32 MACOSX_BUNDLE splitview.c ${ICON} ${GLAD})\nadd_executable(wave WIN32 MACOSX_BUNDLE wave.c ${ICON} ${GLAD})\n\ntarget_link_libraries(particles \"${CMAKE_THREAD_LIBS_INIT}\")\nif (RT_LIBRARY)\n    target_link_libraries(particles \"${RT_LIBRARY}\")\nendif()\n\nset(WINDOWS_BINARIES boing gears heightmap particles simple splitview wave)\nset(CONSOLE_BINARIES offscreen)\n\nset_target_properties(${WINDOWS_BINARIES} ${CONSOLE_BINARIES} PROPERTIES\n                      FOLDER \"GLFW3/Examples\")\n\nif (MSVC)\n    # Tell MSVC to use main instead of WinMain for Windows subsystem executables\n    set_target_properties(${WINDOWS_BINARIES} PROPERTIES\n                          LINK_FLAGS \"/ENTRY:mainCRTStartup\")\nendif()\n\nif (APPLE)\n    set_target_properties(boing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Boing\")\n    set_target_properties(gears PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Gears\")\n    set_target_properties(heightmap PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Heightmap\")\n    set_target_properties(particles PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Particles\")\n    set_target_properties(simple PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Simple\")\n    set_target_properties(splitview PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"SplitView\")\n    set_target_properties(wave PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Wave\")\n\n    set_target_properties(${WINDOWS_BINARIES} PROPERTIES\n                          RESOURCE glfw.icns\n                          MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}\n                          MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION_FULL}\n                          MACOSX_BUNDLE_ICON_FILE glfw.icns\n                          MACOSX_BUNDLE_INFO_PLIST \"${GLFW_SOURCE_DIR}/CMake/MacOSXBundleInfo.plist.in\")\nendif()\n\n"
  },
  {
    "path": "external/GLFW/examples/boing.c",
    "content": "/*****************************************************************************\n * Title:   GLBoing\n * Desc:    Tribute to Amiga Boing.\n * Author:  Jim Brooks  <gfx@jimbrooks.org>\n *          Original Amiga authors were R.J. Mical and Dale Luck.\n *          GLFW conversion by Marcus Geelnard\n * Notes:   - 360' = 2*PI [radian]\n *\n *          - Distances between objects are created by doing a relative\n *            Z translations.\n *\n *          - Although OpenGL enticingly supports alpha-blending,\n *            the shadow of the original Boing didn't affect the color\n *            of the grid.\n *\n *          - [Marcus] Changed timing scheme from interval driven to frame-\n *            time based animation steps (which results in much smoother\n *            movement)\n *\n * History of Amiga Boing:\n *\n * Boing was demonstrated on the prototype Amiga (codenamed \"Lorraine\") in\n * 1985. According to legend, it was written ad-hoc in one night by\n * R. J. Mical and Dale Luck. Because the bouncing ball animation was so fast\n * and smooth, attendees did not believe the Amiga prototype was really doing\n * the rendering. Suspecting a trick, they began looking around the booth for\n * a hidden computer or VCR.\n *****************************************************************************/\n\n#if defined(_MSC_VER)\n // Make MS math.h define M_PI\n #define _USE_MATH_DEFINES\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <linmath.h>\n\n\n/*****************************************************************************\n * Various declarations and macros\n *****************************************************************************/\n\n/* Prototypes */\nvoid init( void );\nvoid display( void );\nvoid reshape( GLFWwindow* window, int w, int h );\nvoid key_callback( GLFWwindow* window, int key, int scancode, int action, int mods );\nvoid mouse_button_callback( GLFWwindow* window, int button, int action, int mods );\nvoid cursor_position_callback( GLFWwindow* window, double x, double y );\nvoid DrawBoingBall( void );\nvoid BounceBall( double dt );\nvoid DrawBoingBallBand( GLfloat long_lo, GLfloat long_hi );\nvoid DrawGrid( void );\n\n#define RADIUS           70.f\n#define STEP_LONGITUDE   22.5f                   /* 22.5 makes 8 bands like original Boing */\n#define STEP_LATITUDE    22.5f\n\n#define DIST_BALL       (RADIUS * 2.f + RADIUS * 0.1f)\n\n#define VIEW_SCENE_DIST (DIST_BALL * 3.f + 200.f)/* distance from viewer to middle of boing area */\n#define GRID_SIZE       (RADIUS * 4.5f)          /* length (width) of grid */\n#define BOUNCE_HEIGHT   (RADIUS * 2.1f)\n#define BOUNCE_WIDTH    (RADIUS * 2.1f)\n\n#define SHADOW_OFFSET_X -20.f\n#define SHADOW_OFFSET_Y  10.f\n#define SHADOW_OFFSET_Z   0.f\n\n#define WALL_L_OFFSET   0.f\n#define WALL_R_OFFSET   5.f\n\n/* Animation speed (50.0 mimics the original GLUT demo speed) */\n#define ANIMATION_SPEED 50.f\n\n/* Maximum allowed delta time per physics iteration */\n#define MAX_DELTA_T 0.02f\n\n/* Draw ball, or its shadow */\ntypedef enum { DRAW_BALL, DRAW_BALL_SHADOW } DRAW_BALL_ENUM;\n\n/* Vertex type */\ntypedef struct {float x; float y; float z;} vertex_t;\n\n/* Global vars */\nint windowed_xpos, windowed_ypos, windowed_width, windowed_height;\nint width, height;\nGLfloat deg_rot_y       = 0.f;\nGLfloat deg_rot_y_inc   = 2.f;\nint override_pos        = GLFW_FALSE;\nGLfloat cursor_x        = 0.f;\nGLfloat cursor_y        = 0.f;\nGLfloat ball_x          = -RADIUS;\nGLfloat ball_y          = -RADIUS;\nGLfloat ball_x_inc      = 1.f;\nGLfloat ball_y_inc      = 2.f;\nDRAW_BALL_ENUM drawBallHow;\ndouble  t;\ndouble  t_old = 0.f;\ndouble  dt;\n\n/* Random number generator */\n#ifndef RAND_MAX\n #define RAND_MAX 4095\n#endif\n\n\n/*****************************************************************************\n * Truncate a degree.\n *****************************************************************************/\nGLfloat TruncateDeg( GLfloat deg )\n{\n   if ( deg >= 360.f )\n      return (deg - 360.f);\n   else\n      return deg;\n}\n\n/*****************************************************************************\n * Convert a degree (360-based) into a radian.\n * 360' = 2 * PI\n *****************************************************************************/\ndouble deg2rad( double deg )\n{\n   return deg / 360 * (2 * M_PI);\n}\n\n/*****************************************************************************\n * 360' sin().\n *****************************************************************************/\ndouble sin_deg( double deg )\n{\n   return sin( deg2rad( deg ) );\n}\n\n/*****************************************************************************\n * 360' cos().\n *****************************************************************************/\ndouble cos_deg( double deg )\n{\n   return cos( deg2rad( deg ) );\n}\n\n/*****************************************************************************\n * Compute a cross product (for a normal vector).\n *\n * c = a x b\n *****************************************************************************/\nvoid CrossProduct( vertex_t a, vertex_t b, vertex_t c, vertex_t *n )\n{\n   GLfloat u1, u2, u3;\n   GLfloat v1, v2, v3;\n\n   u1 = b.x - a.x;\n   u2 = b.y - a.y;\n   u3 = b.y - a.z;\n\n   v1 = c.x - a.x;\n   v2 = c.y - a.y;\n   v3 = c.z - a.z;\n\n   n->x = u2 * v3 - v2 * v3;\n   n->y = u3 * v1 - v3 * u1;\n   n->z = u1 * v2 - v1 * u2;\n}\n\n\n#define BOING_DEBUG 0\n\n\n/*****************************************************************************\n * init()\n *****************************************************************************/\nvoid init( void )\n{\n   /*\n    * Clear background.\n    */\n   glClearColor( 0.55f, 0.55f, 0.55f, 0.f );\n\n   glShadeModel( GL_FLAT );\n}\n\n\n/*****************************************************************************\n * display()\n *****************************************************************************/\nvoid display(void)\n{\n   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );\n   glPushMatrix();\n\n   drawBallHow = DRAW_BALL_SHADOW;\n   DrawBoingBall();\n\n   DrawGrid();\n\n   drawBallHow = DRAW_BALL;\n   DrawBoingBall();\n\n   glPopMatrix();\n   glFlush();\n}\n\n\n/*****************************************************************************\n * reshape()\n *****************************************************************************/\nvoid reshape( GLFWwindow* window, int w, int h )\n{\n   mat4x4 projection, view;\n\n   glViewport( 0, 0, (GLsizei)w, (GLsizei)h );\n\n   glMatrixMode( GL_PROJECTION );\n   mat4x4_perspective( projection,\n                       2.f * (float) atan2( RADIUS, 200.f ),\n                       (float)w / (float)h,\n                       1.f, VIEW_SCENE_DIST );\n   glLoadMatrixf((const GLfloat*) projection);\n\n   glMatrixMode( GL_MODELVIEW );\n   {\n      vec3 eye = { 0.f, 0.f, VIEW_SCENE_DIST };\n      vec3 center = { 0.f, 0.f, 0.f };\n      vec3 up = { 0.f, -1.f, 0.f };\n      mat4x4_look_at( view, eye, center, up );\n   }\n   glLoadMatrixf((const GLfloat*) view);\n}\n\nvoid key_callback( GLFWwindow* window, int key, int scancode, int action, int mods )\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    if (key == GLFW_KEY_ESCAPE && mods == 0)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n    if ((key == GLFW_KEY_ENTER && mods == GLFW_MOD_ALT) ||\n        (key == GLFW_KEY_F11 && mods == GLFW_MOD_ALT))\n    {\n        if (glfwGetWindowMonitor(window))\n        {\n            glfwSetWindowMonitor(window, NULL,\n                                 windowed_xpos, windowed_ypos,\n                                 windowed_width, windowed_height, 0);\n        }\n        else\n        {\n            GLFWmonitor* monitor = glfwGetPrimaryMonitor();\n            if (monitor)\n            {\n                const GLFWvidmode* mode = glfwGetVideoMode(monitor);\n                glfwGetWindowPos(window, &windowed_xpos, &windowed_ypos);\n                glfwGetWindowSize(window, &windowed_width, &windowed_height);\n                glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);\n            }\n        }\n    }\n}\n\nstatic void set_ball_pos ( GLfloat x, GLfloat y )\n{\n   ball_x = (width / 2) - x;\n   ball_y = y - (height / 2);\n}\n\nvoid mouse_button_callback( GLFWwindow* window, int button, int action, int mods )\n{\n   if (button != GLFW_MOUSE_BUTTON_LEFT)\n      return;\n\n   if (action == GLFW_PRESS)\n   {\n      override_pos = GLFW_TRUE;\n      set_ball_pos(cursor_x, cursor_y);\n   }\n   else\n   {\n      override_pos = GLFW_FALSE;\n   }\n}\n\nvoid cursor_position_callback( GLFWwindow* window, double x, double y )\n{\n   cursor_x = (float) x;\n   cursor_y = (float) y;\n\n   if ( override_pos )\n      set_ball_pos(cursor_x, cursor_y);\n}\n\n/*****************************************************************************\n * Draw the Boing ball.\n *\n * The Boing ball is sphere in which each facet is a rectangle.\n * Facet colors alternate between red and white.\n * The ball is built by stacking latitudinal circles.  Each circle is composed\n * of a widely-separated set of points, so that each facet is noticably large.\n *****************************************************************************/\nvoid DrawBoingBall( void )\n{\n   GLfloat lon_deg;     /* degree of longitude */\n   double dt_total, dt2;\n\n   glPushMatrix();\n   glMatrixMode( GL_MODELVIEW );\n\n  /*\n   * Another relative Z translation to separate objects.\n   */\n   glTranslatef( 0.0, 0.0, DIST_BALL );\n\n   /* Update ball position and rotation (iterate if necessary) */\n   dt_total = dt;\n   while( dt_total > 0.0 )\n   {\n       dt2 = dt_total > MAX_DELTA_T ? MAX_DELTA_T : dt_total;\n       dt_total -= dt2;\n       BounceBall( dt2 );\n       deg_rot_y = TruncateDeg( deg_rot_y + deg_rot_y_inc*((float)dt2*ANIMATION_SPEED) );\n   }\n\n   /* Set ball position */\n   glTranslatef( ball_x, ball_y, 0.0 );\n\n  /*\n   * Offset the shadow.\n   */\n   if ( drawBallHow == DRAW_BALL_SHADOW )\n   {\n      glTranslatef( SHADOW_OFFSET_X,\n                    SHADOW_OFFSET_Y,\n                    SHADOW_OFFSET_Z );\n   }\n\n  /*\n   * Tilt the ball.\n   */\n   glRotatef( -20.0, 0.0, 0.0, 1.0 );\n\n  /*\n   * Continually rotate ball around Y axis.\n   */\n   glRotatef( deg_rot_y, 0.0, 1.0, 0.0 );\n\n  /*\n   * Set OpenGL state for Boing ball.\n   */\n   glCullFace( GL_FRONT );\n   glEnable( GL_CULL_FACE );\n   glEnable( GL_NORMALIZE );\n\n  /*\n   * Build a faceted latitude slice of the Boing ball,\n   * stepping same-sized vertical bands of the sphere.\n   */\n   for ( lon_deg = 0;\n         lon_deg < 180;\n         lon_deg += STEP_LONGITUDE )\n   {\n     /*\n      * Draw a latitude circle at this longitude.\n      */\n      DrawBoingBallBand( lon_deg,\n                         lon_deg + STEP_LONGITUDE );\n   }\n\n   glPopMatrix();\n\n   return;\n}\n\n\n/*****************************************************************************\n * Bounce the ball.\n *****************************************************************************/\nvoid BounceBall( double delta_t )\n{\n   GLfloat sign;\n   GLfloat deg;\n\n   if ( override_pos )\n     return;\n\n   /* Bounce on walls */\n   if ( ball_x >  (BOUNCE_WIDTH/2 + WALL_R_OFFSET ) )\n   {\n      ball_x_inc = -0.5f - 0.75f * (GLfloat)rand() / (GLfloat)RAND_MAX;\n      deg_rot_y_inc = -deg_rot_y_inc;\n   }\n   if ( ball_x < -(BOUNCE_HEIGHT/2 + WALL_L_OFFSET) )\n   {\n      ball_x_inc =  0.5f + 0.75f * (GLfloat)rand() / (GLfloat)RAND_MAX;\n      deg_rot_y_inc = -deg_rot_y_inc;\n   }\n\n   /* Bounce on floor / roof */\n   if ( ball_y >  BOUNCE_HEIGHT/2      )\n   {\n      ball_y_inc = -0.75f - 1.f * (GLfloat)rand() / (GLfloat)RAND_MAX;\n   }\n   if ( ball_y < -BOUNCE_HEIGHT/2*0.85 )\n   {\n      ball_y_inc =  0.75f + 1.f * (GLfloat)rand() / (GLfloat)RAND_MAX;\n   }\n\n   /* Update ball position */\n   ball_x += ball_x_inc * ((float)delta_t*ANIMATION_SPEED);\n   ball_y += ball_y_inc * ((float)delta_t*ANIMATION_SPEED);\n\n  /*\n   * Simulate the effects of gravity on Y movement.\n   */\n   if ( ball_y_inc < 0 ) sign = -1.0; else sign = 1.0;\n\n   deg = (ball_y + BOUNCE_HEIGHT/2) * 90 / BOUNCE_HEIGHT;\n   if ( deg > 80 ) deg = 80;\n   if ( deg < 10 ) deg = 10;\n\n   ball_y_inc = sign * 4.f * (float) sin_deg( deg );\n}\n\n\n/*****************************************************************************\n * Draw a faceted latitude band of the Boing ball.\n *\n * Parms:   long_lo, long_hi\n *          Low and high longitudes of slice, resp.\n *****************************************************************************/\nvoid DrawBoingBallBand( GLfloat long_lo,\n                        GLfloat long_hi )\n{\n   vertex_t vert_ne;            /* \"ne\" means south-east, so on */\n   vertex_t vert_nw;\n   vertex_t vert_sw;\n   vertex_t vert_se;\n   vertex_t vert_norm;\n   GLfloat  lat_deg;\n   static int colorToggle = 0;\n\n  /*\n   * Iterate thru the points of a latitude circle.\n   * A latitude circle is a 2D set of X,Z points.\n   */\n   for ( lat_deg = 0;\n         lat_deg <= (360 - STEP_LATITUDE);\n         lat_deg += STEP_LATITUDE )\n   {\n     /*\n      * Color this polygon with red or white.\n      */\n      if ( colorToggle )\n         glColor3f( 0.8f, 0.1f, 0.1f );\n      else\n         glColor3f( 0.95f, 0.95f, 0.95f );\n#if 0\n      if ( lat_deg >= 180 )\n         if ( colorToggle )\n            glColor3f( 0.1f, 0.8f, 0.1f );\n         else\n            glColor3f( 0.5f, 0.5f, 0.95f );\n#endif\n      colorToggle = ! colorToggle;\n\n     /*\n      * Change color if drawing shadow.\n      */\n      if ( drawBallHow == DRAW_BALL_SHADOW )\n         glColor3f( 0.35f, 0.35f, 0.35f );\n\n     /*\n      * Assign each Y.\n      */\n      vert_ne.y = vert_nw.y = (float) cos_deg(long_hi) * RADIUS;\n      vert_sw.y = vert_se.y = (float) cos_deg(long_lo) * RADIUS;\n\n     /*\n      * Assign each X,Z with sin,cos values scaled by latitude radius indexed by longitude.\n      * Eg, long=0 and long=180 are at the poles, so zero scale is sin(longitude),\n      * while long=90 (sin(90)=1) is at equator.\n      */\n      vert_ne.x = (float) cos_deg( lat_deg                 ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE ));\n      vert_se.x = (float) cos_deg( lat_deg                 ) * (RADIUS * (float) sin_deg( long_lo                  ));\n      vert_nw.x = (float) cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE ));\n      vert_sw.x = (float) cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo                  ));\n\n      vert_ne.z = (float) sin_deg( lat_deg                 ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE ));\n      vert_se.z = (float) sin_deg( lat_deg                 ) * (RADIUS * (float) sin_deg( long_lo                  ));\n      vert_nw.z = (float) sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE ));\n      vert_sw.z = (float) sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo                  ));\n\n     /*\n      * Draw the facet.\n      */\n      glBegin( GL_POLYGON );\n\n      CrossProduct( vert_ne, vert_nw, vert_sw, &vert_norm );\n      glNormal3f( vert_norm.x, vert_norm.y, vert_norm.z );\n\n      glVertex3f( vert_ne.x, vert_ne.y, vert_ne.z );\n      glVertex3f( vert_nw.x, vert_nw.y, vert_nw.z );\n      glVertex3f( vert_sw.x, vert_sw.y, vert_sw.z );\n      glVertex3f( vert_se.x, vert_se.y, vert_se.z );\n\n      glEnd();\n\n#if BOING_DEBUG\n      printf( \"----------------------------------------------------------- \\n\" );\n      printf( \"lat = %f  long_lo = %f  long_hi = %f \\n\", lat_deg, long_lo, long_hi );\n      printf( \"vert_ne  x = %.8f  y = %.8f  z = %.8f \\n\", vert_ne.x, vert_ne.y, vert_ne.z );\n      printf( \"vert_nw  x = %.8f  y = %.8f  z = %.8f \\n\", vert_nw.x, vert_nw.y, vert_nw.z );\n      printf( \"vert_se  x = %.8f  y = %.8f  z = %.8f \\n\", vert_se.x, vert_se.y, vert_se.z );\n      printf( \"vert_sw  x = %.8f  y = %.8f  z = %.8f \\n\", vert_sw.x, vert_sw.y, vert_sw.z );\n#endif\n\n   }\n\n  /*\n   * Toggle color so that next band will opposite red/white colors than this one.\n   */\n   colorToggle = ! colorToggle;\n\n  /*\n   * This circular band is done.\n   */\n   return;\n}\n\n\n/*****************************************************************************\n * Draw the purple grid of lines, behind the Boing ball.\n * When the Workbench is dropped to the bottom, Boing shows 12 rows.\n *****************************************************************************/\nvoid DrawGrid( void )\n{\n   int              row, col;\n   const int        rowTotal    = 12;                   /* must be divisible by 2 */\n   const int        colTotal    = rowTotal;             /* must be same as rowTotal */\n   const GLfloat    widthLine   = 2.0;                  /* should be divisible by 2 */\n   const GLfloat    sizeCell    = GRID_SIZE / rowTotal;\n   const GLfloat    z_offset    = -40.0;\n   GLfloat          xl, xr;\n   GLfloat          yt, yb;\n\n   glPushMatrix();\n   glDisable( GL_CULL_FACE );\n\n  /*\n   * Another relative Z translation to separate objects.\n   */\n   glTranslatef( 0.0, 0.0, DIST_BALL );\n\n  /*\n   * Draw vertical lines (as skinny 3D rectangles).\n   */\n   for ( col = 0; col <= colTotal; col++ )\n   {\n     /*\n      * Compute co-ords of line.\n      */\n      xl = -GRID_SIZE / 2 + col * sizeCell;\n      xr = xl + widthLine;\n\n      yt =  GRID_SIZE / 2;\n      yb = -GRID_SIZE / 2 - widthLine;\n\n      glBegin( GL_POLYGON );\n\n      glColor3f( 0.6f, 0.1f, 0.6f );               /* purple */\n\n      glVertex3f( xr, yt, z_offset );       /* NE */\n      glVertex3f( xl, yt, z_offset );       /* NW */\n      glVertex3f( xl, yb, z_offset );       /* SW */\n      glVertex3f( xr, yb, z_offset );       /* SE */\n\n      glEnd();\n   }\n\n  /*\n   * Draw horizontal lines (as skinny 3D rectangles).\n   */\n   for ( row = 0; row <= rowTotal; row++ )\n   {\n     /*\n      * Compute co-ords of line.\n      */\n      yt = GRID_SIZE / 2 - row * sizeCell;\n      yb = yt - widthLine;\n\n      xl = -GRID_SIZE / 2;\n      xr =  GRID_SIZE / 2 + widthLine;\n\n      glBegin( GL_POLYGON );\n\n      glColor3f( 0.6f, 0.1f, 0.6f );               /* purple */\n\n      glVertex3f( xr, yt, z_offset );       /* NE */\n      glVertex3f( xl, yt, z_offset );       /* NW */\n      glVertex3f( xl, yb, z_offset );       /* SW */\n      glVertex3f( xr, yb, z_offset );       /* SE */\n\n      glEnd();\n   }\n\n   glPopMatrix();\n\n   return;\n}\n\n\n/*======================================================================*\n * main()\n *======================================================================*/\n\nint main( void )\n{\n   GLFWwindow* window;\n\n   /* Init GLFW */\n   if( !glfwInit() )\n      exit( EXIT_FAILURE );\n\n   window = glfwCreateWindow( 400, 400, \"Boing (classic Amiga demo)\", NULL, NULL );\n   if (!window)\n   {\n       glfwTerminate();\n       exit( EXIT_FAILURE );\n   }\n\n   glfwSetWindowAspectRatio(window, 1, 1);\n\n   glfwSetFramebufferSizeCallback(window, reshape);\n   glfwSetKeyCallback(window, key_callback);\n   glfwSetMouseButtonCallback(window, mouse_button_callback);\n   glfwSetCursorPosCallback(window, cursor_position_callback);\n\n   glfwMakeContextCurrent(window);\n   gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n   glfwSwapInterval( 1 );\n\n   glfwGetFramebufferSize(window, &width, &height);\n   reshape(window, width, height);\n\n   glfwSetTime( 0.0 );\n\n   init();\n\n   /* Main loop */\n   for (;;)\n   {\n       /* Timing */\n       t = glfwGetTime();\n       dt = t - t_old;\n       t_old = t;\n\n       /* Draw one frame */\n       display();\n\n       /* Swap buffers */\n       glfwSwapBuffers(window);\n       glfwPollEvents();\n\n       /* Check if we are still running */\n       if (glfwWindowShouldClose(window))\n           break;\n   }\n\n   glfwTerminate();\n   exit( EXIT_SUCCESS );\n}\n\n"
  },
  {
    "path": "external/GLFW/examples/gears.c",
    "content": "/*\n * 3-D gear wheels.  This program is in the public domain.\n *\n * Command line options:\n *    -info      print GL implementation information\n *    -exit      automatically exit after 30 seconds\n *\n *\n * Brian Paul\n *\n *\n * Marcus Geelnard:\n *   - Conversion to GLFW\n *   - Time based rendering (frame rate independent)\n *   - Slightly modified camera that should work better for stereo viewing\n *\n *\n * Camilla Löwy:\n *   - Removed FPS counter (this is not a benchmark)\n *   - Added a few comments\n *   - Enabled vsync\n */\n\n#if defined(_MSC_VER)\n // Make MS math.h define M_PI\n #define _USE_MATH_DEFINES\n#endif\n\n#include <math.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n/**\n\n  Draw a gear wheel.  You'll probably want to call this function when\n  building a display list since we do a lot of trig here.\n\n  Input:  inner_radius - radius of hole at center\n          outer_radius - radius at center of teeth\n          width - width of gear teeth - number of teeth\n          tooth_depth - depth of tooth\n\n **/\n\nstatic void\ngear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,\n  GLint teeth, GLfloat tooth_depth)\n{\n  GLint i;\n  GLfloat r0, r1, r2;\n  GLfloat angle, da;\n  GLfloat u, v, len;\n\n  r0 = inner_radius;\n  r1 = outer_radius - tooth_depth / 2.f;\n  r2 = outer_radius + tooth_depth / 2.f;\n\n  da = 2.f * (float) M_PI / teeth / 4.f;\n\n  glShadeModel(GL_FLAT);\n\n  glNormal3f(0.f, 0.f, 1.f);\n\n  /* draw front face */\n  glBegin(GL_QUAD_STRIP);\n  for (i = 0; i <= teeth; i++) {\n    angle = i * 2.f * (float) M_PI / teeth;\n    glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f);\n    glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f);\n    if (i < teeth) {\n      glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f);\n      glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f);\n    }\n  }\n  glEnd();\n\n  /* draw front sides of teeth */\n  glBegin(GL_QUADS);\n  da = 2.f * (float) M_PI / teeth / 4.f;\n  for (i = 0; i < teeth; i++) {\n    angle = i * 2.f * (float) M_PI / teeth;\n\n    glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f);\n    glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), width * 0.5f);\n    glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), width * 0.5f);\n    glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f);\n  }\n  glEnd();\n\n  glNormal3f(0.0, 0.0, -1.0);\n\n  /* draw back face */\n  glBegin(GL_QUAD_STRIP);\n  for (i = 0; i <= teeth; i++) {\n    angle = i * 2.f * (float) M_PI / teeth;\n    glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f);\n    glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f);\n    if (i < teeth) {\n      glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f);\n      glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f);\n    }\n  }\n  glEnd();\n\n  /* draw back sides of teeth */\n  glBegin(GL_QUADS);\n  da = 2.f * (float) M_PI / teeth / 4.f;\n  for (i = 0; i < teeth; i++) {\n    angle = i * 2.f * (float) M_PI / teeth;\n\n    glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f);\n    glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), -width * 0.5f);\n    glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), -width * 0.5f);\n    glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f);\n  }\n  glEnd();\n\n  /* draw outward faces of teeth */\n  glBegin(GL_QUAD_STRIP);\n  for (i = 0; i < teeth; i++) {\n    angle = i * 2.f * (float) M_PI / teeth;\n\n    glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f);\n    glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f);\n    u = r2 * (float) cos(angle + da) - r1 * (float) cos(angle);\n    v = r2 * (float) sin(angle + da) - r1 * (float) sin(angle);\n    len = (float) sqrt(u * u + v * v);\n    u /= len;\n    v /= len;\n    glNormal3f(v, -u, 0.0);\n    glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), width * 0.5f);\n    glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), -width * 0.5f);\n    glNormal3f((float) cos(angle), (float) sin(angle), 0.f);\n    glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), width * 0.5f);\n    glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), -width * 0.5f);\n    u = r1 * (float) cos(angle + 3 * da) - r2 * (float) cos(angle + 2 * da);\n    v = r1 * (float) sin(angle + 3 * da) - r2 * (float) sin(angle + 2 * da);\n    glNormal3f(v, -u, 0.f);\n    glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f);\n    glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f);\n    glNormal3f((float) cos(angle), (float) sin(angle), 0.f);\n  }\n\n  glVertex3f(r1 * (float) cos(0), r1 * (float) sin(0), width * 0.5f);\n  glVertex3f(r1 * (float) cos(0), r1 * (float) sin(0), -width * 0.5f);\n\n  glEnd();\n\n  glShadeModel(GL_SMOOTH);\n\n  /* draw inside radius cylinder */\n  glBegin(GL_QUAD_STRIP);\n  for (i = 0; i <= teeth; i++) {\n    angle = i * 2.f * (float) M_PI / teeth;\n    glNormal3f(-(float) cos(angle), -(float) sin(angle), 0.f);\n    glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f);\n    glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f);\n  }\n  glEnd();\n\n}\n\n\nstatic GLfloat view_rotx = 20.f, view_roty = 30.f, view_rotz = 0.f;\nstatic GLint gear1, gear2, gear3;\nstatic GLfloat angle = 0.f;\n\n/* OpenGL draw function & timing */\nstatic void draw(void)\n{\n  glClearColor(0.0, 0.0, 0.0, 0.0);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n  glPushMatrix();\n    glRotatef(view_rotx, 1.0, 0.0, 0.0);\n    glRotatef(view_roty, 0.0, 1.0, 0.0);\n    glRotatef(view_rotz, 0.0, 0.0, 1.0);\n\n    glPushMatrix();\n      glTranslatef(-3.0, -2.0, 0.0);\n      glRotatef(angle, 0.0, 0.0, 1.0);\n      glCallList(gear1);\n    glPopMatrix();\n\n    glPushMatrix();\n      glTranslatef(3.1f, -2.f, 0.f);\n      glRotatef(-2.f * angle - 9.f, 0.f, 0.f, 1.f);\n      glCallList(gear2);\n    glPopMatrix();\n\n    glPushMatrix();\n      glTranslatef(-3.1f, 4.2f, 0.f);\n      glRotatef(-2.f * angle - 25.f, 0.f, 0.f, 1.f);\n      glCallList(gear3);\n    glPopMatrix();\n\n  glPopMatrix();\n}\n\n\n/* update animation parameters */\nstatic void animate(void)\n{\n  angle = 100.f * (float) glfwGetTime();\n}\n\n\n/* change view angle, exit upon ESC */\nvoid key( GLFWwindow* window, int k, int s, int action, int mods )\n{\n  if( action != GLFW_PRESS ) return;\n\n  switch (k) {\n  case GLFW_KEY_Z:\n    if( mods & GLFW_MOD_SHIFT )\n      view_rotz -= 5.0;\n    else\n      view_rotz += 5.0;\n    break;\n  case GLFW_KEY_ESCAPE:\n    glfwSetWindowShouldClose(window, GLFW_TRUE);\n    break;\n  case GLFW_KEY_UP:\n    view_rotx += 5.0;\n    break;\n  case GLFW_KEY_DOWN:\n    view_rotx -= 5.0;\n    break;\n  case GLFW_KEY_LEFT:\n    view_roty += 5.0;\n    break;\n  case GLFW_KEY_RIGHT:\n    view_roty -= 5.0;\n    break;\n  default:\n    return;\n  }\n}\n\n\n/* new window size */\nvoid reshape( GLFWwindow* window, int width, int height )\n{\n  GLfloat h = (GLfloat) height / (GLfloat) width;\n  GLfloat xmax, znear, zfar;\n\n  znear = 5.0f;\n  zfar  = 30.0f;\n  xmax  = znear * 0.5f;\n\n  glViewport( 0, 0, (GLint) width, (GLint) height );\n  glMatrixMode( GL_PROJECTION );\n  glLoadIdentity();\n  glFrustum( -xmax, xmax, -xmax*h, xmax*h, znear, zfar );\n  glMatrixMode( GL_MODELVIEW );\n  glLoadIdentity();\n  glTranslatef( 0.0, 0.0, -20.0 );\n}\n\n\n/* program & OpenGL initialization */\nstatic void init(void)\n{\n  static GLfloat pos[4] = {5.f, 5.f, 10.f, 0.f};\n  static GLfloat red[4] = {0.8f, 0.1f, 0.f, 1.f};\n  static GLfloat green[4] = {0.f, 0.8f, 0.2f, 1.f};\n  static GLfloat blue[4] = {0.2f, 0.2f, 1.f, 1.f};\n\n  glLightfv(GL_LIGHT0, GL_POSITION, pos);\n  glEnable(GL_CULL_FACE);\n  glEnable(GL_LIGHTING);\n  glEnable(GL_LIGHT0);\n  glEnable(GL_DEPTH_TEST);\n\n  /* make the gears */\n  gear1 = glGenLists(1);\n  glNewList(gear1, GL_COMPILE);\n  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);\n  gear(1.f, 4.f, 1.f, 20, 0.7f);\n  glEndList();\n\n  gear2 = glGenLists(1);\n  glNewList(gear2, GL_COMPILE);\n  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);\n  gear(0.5f, 2.f, 2.f, 10, 0.7f);\n  glEndList();\n\n  gear3 = glGenLists(1);\n  glNewList(gear3, GL_COMPILE);\n  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);\n  gear(1.3f, 2.f, 0.5f, 10, 0.7f);\n  glEndList();\n\n  glEnable(GL_NORMALIZE);\n}\n\n\n/* program entry */\nint main(int argc, char *argv[])\n{\n    GLFWwindow* window;\n    int width, height;\n\n    if( !glfwInit() )\n    {\n        fprintf( stderr, \"Failed to initialize GLFW\\n\" );\n        exit( EXIT_FAILURE );\n    }\n\n    glfwWindowHint(GLFW_DEPTH_BITS, 16);\n    glfwWindowHint(GLFW_TRANSPARENT, GLFW_TRUE);\n\n    window = glfwCreateWindow( 300, 300, \"Gears\", NULL, NULL );\n    if (!window)\n    {\n        fprintf( stderr, \"Failed to open GLFW window\\n\" );\n        glfwTerminate();\n        exit( EXIT_FAILURE );\n    }\n\n    // Set callback functions\n    glfwSetFramebufferSizeCallback(window, reshape);\n    glfwSetKeyCallback(window, key);\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval( 1 );\n\n    glfwGetFramebufferSize(window, &width, &height);\n    reshape(window, width, height);\n\n    // Parse command-line options\n    init();\n\n    // Main loop\n    while( !glfwWindowShouldClose(window) )\n    {\n        // Draw gears\n        draw();\n\n        // Update animation\n        animate();\n\n        // Swap buffers\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n\n    // Terminate GLFW\n    glfwTerminate();\n\n    // Exit program\n    exit( EXIT_SUCCESS );\n}\n\n"
  },
  {
    "path": "external/GLFW/examples/glfw.rc",
    "content": "\nGLFW_ICON               ICON            \"glfw.ico\"\n\n"
  },
  {
    "path": "external/GLFW/examples/heightmap.c",
    "content": "//========================================================================\n// Heightmap example program using OpenGL 3 core profile\n// Copyright (c) 2010 Olivier Delannoy\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <math.h>\n#include <assert.h>\n#include <stddef.h>\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n/* Map height updates */\n#define MAX_CIRCLE_SIZE (5.0f)\n#define MAX_DISPLACEMENT (1.0f)\n#define DISPLACEMENT_SIGN_LIMIT (0.3f)\n#define MAX_ITER (200)\n#define NUM_ITER_AT_A_TIME (1)\n\n/* Map general information */\n#define MAP_SIZE (10.0f)\n#define MAP_NUM_VERTICES (80)\n#define MAP_NUM_TOTAL_VERTICES (MAP_NUM_VERTICES*MAP_NUM_VERTICES)\n#define MAP_NUM_LINES (3* (MAP_NUM_VERTICES - 1) * (MAP_NUM_VERTICES - 1) + \\\n               2 * (MAP_NUM_VERTICES - 1))\n\n\n/**********************************************************************\n * Default shader programs\n *********************************************************************/\n\nstatic const char* vertex_shader_text =\n\"#version 150\\n\"\n\"uniform mat4 project;\\n\"\n\"uniform mat4 modelview;\\n\"\n\"in float x;\\n\"\n\"in float y;\\n\"\n\"in float z;\\n\"\n\"\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"   gl_Position = project * modelview * vec4(x, y, z, 1.0);\\n\"\n\"}\\n\";\n\nstatic const char* fragment_shader_text =\n\"#version 150\\n\"\n\"out vec4 color;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    color = vec4(0.2, 1.0, 0.2, 1.0); \\n\"\n\"}\\n\";\n\n/**********************************************************************\n * Values for shader uniforms\n *********************************************************************/\n\n/* Frustum configuration */\nstatic GLfloat view_angle = 45.0f;\nstatic GLfloat aspect_ratio = 4.0f/3.0f;\nstatic GLfloat z_near = 1.0f;\nstatic GLfloat z_far = 100.f;\n\n/* Projection matrix */\nstatic GLfloat projection_matrix[16] = {\n    1.0f, 0.0f, 0.0f, 0.0f,\n    0.0f, 1.0f, 0.0f, 0.0f,\n    0.0f, 0.0f, 1.0f, 0.0f,\n    0.0f, 0.0f, 0.0f, 1.0f\n};\n\n/* Model view matrix */\nstatic GLfloat modelview_matrix[16] = {\n    1.0f, 0.0f, 0.0f, 0.0f,\n    0.0f, 1.0f, 0.0f, 0.0f,\n    0.0f, 0.0f, 1.0f, 0.0f,\n    0.0f, 0.0f, 0.0f, 1.0f\n};\n\n/**********************************************************************\n * Heightmap vertex and index data\n *********************************************************************/\n\nstatic GLfloat map_vertices[3][MAP_NUM_TOTAL_VERTICES];\nstatic GLuint  map_line_indices[2*MAP_NUM_LINES];\n\n/* Store uniform location for the shaders\n * Those values are setup as part of the process of creating\n * the shader program. They should not be used before creating\n * the program.\n */\nstatic GLuint mesh;\nstatic GLuint mesh_vbo[4];\n\n/**********************************************************************\n * OpenGL helper functions\n *********************************************************************/\n\n/* Creates a shader object of the specified type using the specified text\n */\nstatic GLuint make_shader(GLenum type, const char* text)\n{\n    GLuint shader;\n    GLint shader_ok;\n    GLsizei log_length;\n    char info_log[8192];\n\n    shader = glCreateShader(type);\n    if (shader != 0)\n    {\n        glShaderSource(shader, 1, (const GLchar**)&text, NULL);\n        glCompileShader(shader);\n        glGetShaderiv(shader, GL_COMPILE_STATUS, &shader_ok);\n        if (shader_ok != GL_TRUE)\n        {\n            fprintf(stderr, \"ERROR: Failed to compile %s shader\\n\", (type == GL_FRAGMENT_SHADER) ? \"fragment\" : \"vertex\" );\n            glGetShaderInfoLog(shader, 8192, &log_length,info_log);\n            fprintf(stderr, \"ERROR: \\n%s\\n\\n\", info_log);\n            glDeleteShader(shader);\n            shader = 0;\n        }\n    }\n    return shader;\n}\n\n/* Creates a program object using the specified vertex and fragment text\n */\nstatic GLuint make_shader_program(const char* vs_text, const char* fs_text)\n{\n    GLuint program = 0u;\n    GLint program_ok;\n    GLuint vertex_shader = 0u;\n    GLuint fragment_shader = 0u;\n    GLsizei log_length;\n    char info_log[8192];\n\n    vertex_shader = make_shader(GL_VERTEX_SHADER, vs_text);\n    if (vertex_shader != 0u)\n    {\n        fragment_shader = make_shader(GL_FRAGMENT_SHADER, fs_text);\n        if (fragment_shader != 0u)\n        {\n            /* make the program that connect the two shader and link it */\n            program = glCreateProgram();\n            if (program != 0u)\n            {\n                /* attach both shader and link */\n                glAttachShader(program, vertex_shader);\n                glAttachShader(program, fragment_shader);\n                glLinkProgram(program);\n                glGetProgramiv(program, GL_LINK_STATUS, &program_ok);\n\n                if (program_ok != GL_TRUE)\n                {\n                    fprintf(stderr, \"ERROR, failed to link shader program\\n\");\n                    glGetProgramInfoLog(program, 8192, &log_length, info_log);\n                    fprintf(stderr, \"ERROR: \\n%s\\n\\n\", info_log);\n                    glDeleteProgram(program);\n                    glDeleteShader(fragment_shader);\n                    glDeleteShader(vertex_shader);\n                    program = 0u;\n                }\n            }\n        }\n        else\n        {\n            fprintf(stderr, \"ERROR: Unable to load fragment shader\\n\");\n            glDeleteShader(vertex_shader);\n        }\n    }\n    else\n    {\n        fprintf(stderr, \"ERROR: Unable to load vertex shader\\n\");\n    }\n    return program;\n}\n\n/**********************************************************************\n * Geometry creation functions\n *********************************************************************/\n\n/* Generate vertices and indices for the heightmap\n */\nstatic void init_map(void)\n{\n    int i;\n    int j;\n    int k;\n    GLfloat step = MAP_SIZE / (MAP_NUM_VERTICES - 1);\n    GLfloat x = 0.0f;\n    GLfloat z = 0.0f;\n    /* Create a flat grid */\n    k = 0;\n    for (i = 0 ; i < MAP_NUM_VERTICES ; ++i)\n    {\n        for (j = 0 ; j < MAP_NUM_VERTICES ; ++j)\n        {\n            map_vertices[0][k] = x;\n            map_vertices[1][k] = 0.0f;\n            map_vertices[2][k] = z;\n            z += step;\n            ++k;\n        }\n        x += step;\n        z = 0.0f;\n    }\n#if DEBUG_ENABLED\n    for (i = 0 ; i < MAP_NUM_TOTAL_VERTICES ; ++i)\n    {\n        printf (\"Vertice %d (%f, %f, %f)\\n\",\n                i, map_vertices[0][i], map_vertices[1][i], map_vertices[2][i]);\n\n    }\n#endif\n    /* create indices */\n    /* line fan based on i\n     * i+1\n     * |  / i + n + 1\n     * | /\n     * |/\n     * i --- i + n\n     */\n\n    /* close the top of the square */\n    k = 0;\n    for (i = 0 ; i < MAP_NUM_VERTICES  -1 ; ++i)\n    {\n        map_line_indices[k++] = (i + 1) * MAP_NUM_VERTICES -1;\n        map_line_indices[k++] = (i + 2) * MAP_NUM_VERTICES -1;\n    }\n    /* close the right of the square */\n    for (i = 0 ; i < MAP_NUM_VERTICES -1 ; ++i)\n    {\n        map_line_indices[k++] = (MAP_NUM_VERTICES - 1) * MAP_NUM_VERTICES + i;\n        map_line_indices[k++] = (MAP_NUM_VERTICES - 1) * MAP_NUM_VERTICES + i + 1;\n    }\n\n    for (i = 0 ; i < (MAP_NUM_VERTICES - 1) ; ++i)\n    {\n        for (j = 0 ; j < (MAP_NUM_VERTICES - 1) ; ++j)\n        {\n            int ref = i * (MAP_NUM_VERTICES) + j;\n            map_line_indices[k++] = ref;\n            map_line_indices[k++] = ref + 1;\n\n            map_line_indices[k++] = ref;\n            map_line_indices[k++] = ref + MAP_NUM_VERTICES;\n\n            map_line_indices[k++] = ref;\n            map_line_indices[k++] = ref + MAP_NUM_VERTICES + 1;\n        }\n    }\n\n#ifdef DEBUG_ENABLED\n    for (k = 0 ; k < 2 * MAP_NUM_LINES ; k += 2)\n    {\n        int beg, end;\n        beg = map_line_indices[k];\n        end = map_line_indices[k+1];\n        printf (\"Line %d: %d -> %d (%f, %f, %f) -> (%f, %f, %f)\\n\",\n                k / 2, beg, end,\n                map_vertices[0][beg], map_vertices[1][beg], map_vertices[2][beg],\n                map_vertices[0][end], map_vertices[1][end], map_vertices[2][end]);\n    }\n#endif\n}\n\nstatic void generate_heightmap__circle(float* center_x, float* center_y,\n        float* size, float* displacement)\n{\n    float sign;\n    /* random value for element in between [0-1.0] */\n    *center_x = (MAP_SIZE * rand()) / (1.0f * RAND_MAX);\n    *center_y = (MAP_SIZE * rand()) / (1.0f * RAND_MAX);\n    *size = (MAX_CIRCLE_SIZE * rand()) / (1.0f * RAND_MAX);\n    sign = (1.0f * rand()) / (1.0f * RAND_MAX);\n    sign = (sign < DISPLACEMENT_SIGN_LIMIT) ? -1.0f : 1.0f;\n    *displacement = (sign * (MAX_DISPLACEMENT * rand())) / (1.0f * RAND_MAX);\n}\n\n/* Run the specified number of iterations of the generation process for the\n * heightmap\n */\nstatic void update_map(int num_iter)\n{\n    assert(num_iter > 0);\n    while(num_iter)\n    {\n        /* center of the circle */\n        float center_x;\n        float center_z;\n        float circle_size;\n        float disp;\n        size_t ii;\n        generate_heightmap__circle(&center_x, &center_z, &circle_size, &disp);\n        disp = disp / 2.0f;\n        for (ii = 0u ; ii < MAP_NUM_TOTAL_VERTICES ; ++ii)\n        {\n            GLfloat dx = center_x - map_vertices[0][ii];\n            GLfloat dz = center_z - map_vertices[2][ii];\n            GLfloat pd = (2.0f * (float) sqrt((dx * dx) + (dz * dz))) / circle_size;\n            if (fabs(pd) <= 1.0f)\n            {\n                /* tx,tz is within the circle */\n                GLfloat new_height = disp + (float) (cos(pd*3.14f)*disp);\n                map_vertices[1][ii] += new_height;\n            }\n        }\n        --num_iter;\n    }\n}\n\n/**********************************************************************\n * OpenGL helper functions\n *********************************************************************/\n\n/* Create VBO, IBO and VAO objects for the heightmap geometry and bind them to\n * the specified program object\n */\nstatic void make_mesh(GLuint program)\n{\n    GLuint attrloc;\n\n    glGenVertexArrays(1, &mesh);\n    glGenBuffers(4, mesh_vbo);\n    glBindVertexArray(mesh);\n    /* Prepare the data for drawing through a buffer inidices */\n    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh_vbo[3]);\n    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)* MAP_NUM_LINES * 2, map_line_indices, GL_STATIC_DRAW);\n\n    /* Prepare the attributes for rendering */\n    attrloc = glGetAttribLocation(program, \"x\");\n    glBindBuffer(GL_ARRAY_BUFFER, mesh_vbo[0]);\n    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * MAP_NUM_TOTAL_VERTICES, &map_vertices[0][0], GL_STATIC_DRAW);\n    glEnableVertexAttribArray(attrloc);\n    glVertexAttribPointer(attrloc, 1, GL_FLOAT, GL_FALSE, 0, 0);\n\n    attrloc = glGetAttribLocation(program, \"z\");\n    glBindBuffer(GL_ARRAY_BUFFER, mesh_vbo[2]);\n    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * MAP_NUM_TOTAL_VERTICES, &map_vertices[2][0], GL_STATIC_DRAW);\n    glEnableVertexAttribArray(attrloc);\n    glVertexAttribPointer(attrloc, 1, GL_FLOAT, GL_FALSE, 0, 0);\n\n    attrloc = glGetAttribLocation(program, \"y\");\n    glBindBuffer(GL_ARRAY_BUFFER, mesh_vbo[1]);\n    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * MAP_NUM_TOTAL_VERTICES, &map_vertices[1][0], GL_DYNAMIC_DRAW);\n    glEnableVertexAttribArray(attrloc);\n    glVertexAttribPointer(attrloc, 1, GL_FLOAT, GL_FALSE, 0, 0);\n}\n\n/* Update VBO vertices from source data\n */\nstatic void update_mesh(void)\n{\n    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * MAP_NUM_TOTAL_VERTICES, &map_vertices[1][0]);\n}\n\n/**********************************************************************\n * GLFW callback functions\n *********************************************************************/\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    switch(key)\n    {\n        case GLFW_KEY_ESCAPE:\n            /* Exit program on Escape */\n            glfwSetWindowShouldClose(window, GLFW_TRUE);\n            break;\n    }\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nint main(int argc, char** argv)\n{\n    GLFWwindow* window;\n    int iter;\n    double dt;\n    double last_update_time;\n    int frame;\n    float f;\n    GLint uloc_modelview;\n    GLint uloc_project;\n    int width, height;\n\n    GLuint shader_program;\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);\n    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);\n\n    window = glfwCreateWindow(800, 600, \"GLFW OpenGL3 Heightmap demo\", NULL, NULL);\n    if (! window )\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    /* Register events callback */\n    glfwSetKeyCallback(window, key_callback);\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n\n    /* Prepare opengl resources for rendering */\n    shader_program = make_shader_program(vertex_shader_text, fragment_shader_text);\n\n    if (shader_program == 0u)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glUseProgram(shader_program);\n    uloc_project   = glGetUniformLocation(shader_program, \"project\");\n    uloc_modelview = glGetUniformLocation(shader_program, \"modelview\");\n\n    /* Compute the projection matrix */\n    f = 1.0f / tanf(view_angle / 2.0f);\n    projection_matrix[0]  = f / aspect_ratio;\n    projection_matrix[5]  = f;\n    projection_matrix[10] = (z_far + z_near)/ (z_near - z_far);\n    projection_matrix[11] = -1.0f;\n    projection_matrix[14] = 2.0f * (z_far * z_near) / (z_near - z_far);\n    glUniformMatrix4fv(uloc_project, 1, GL_FALSE, projection_matrix);\n\n    /* Set the camera position */\n    modelview_matrix[12]  = -5.0f;\n    modelview_matrix[13]  = -5.0f;\n    modelview_matrix[14]  = -20.0f;\n    glUniformMatrix4fv(uloc_modelview, 1, GL_FALSE, modelview_matrix);\n\n    /* Create mesh data */\n    init_map();\n    make_mesh(shader_program);\n\n    /* Create vao + vbo to store the mesh */\n    /* Create the vbo to store all the information for the grid and the height */\n\n    /* setup the scene ready for rendering */\n    glfwGetFramebufferSize(window, &width, &height);\n    glViewport(0, 0, width, height);\n    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\n\n    /* main loop */\n    frame = 0;\n    iter = 0;\n    last_update_time = glfwGetTime();\n\n    while (!glfwWindowShouldClose(window))\n    {\n        ++frame;\n        /* render the next frame */\n        glClear(GL_COLOR_BUFFER_BIT);\n        glDrawElements(GL_LINES, 2* MAP_NUM_LINES , GL_UNSIGNED_INT, 0);\n\n        /* display and process events through callbacks */\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n        /* Check the frame rate and update the heightmap if needed */\n        dt = glfwGetTime();\n        if ((dt - last_update_time) > 0.2)\n        {\n            /* generate the next iteration of the heightmap */\n            if (iter < MAX_ITER)\n            {\n                update_map(NUM_ITER_AT_A_TIME);\n                update_mesh();\n                iter += NUM_ITER_AT_A_TIME;\n            }\n            last_update_time = dt;\n            frame = 0;\n        }\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/examples/offscreen.c",
    "content": "//========================================================================\n// Offscreen rendering example\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#if USE_NATIVE_OSMESA\n #define GLFW_EXPOSE_NATIVE_OSMESA\n #include <GLFW/glfw3native.h>\n#endif\n\n#include \"linmath.h\"\n\n#include <stdlib.h>\n#include <stdio.h>\n\n#define STB_IMAGE_WRITE_IMPLEMENTATION\n#include <stb_image_write.h>\n\nstatic const struct\n{\n    float x, y;\n    float r, g, b;\n} vertices[3] =\n{\n    { -0.6f, -0.4f, 1.f, 0.f, 0.f },\n    {  0.6f, -0.4f, 0.f, 1.f, 0.f },\n    {   0.f,  0.6f, 0.f, 0.f, 1.f }\n};\n\nstatic const char* vertex_shader_text =\n\"#version 110\\n\"\n\"uniform mat4 MVP;\\n\"\n\"attribute vec3 vCol;\\n\"\n\"attribute vec2 vPos;\\n\"\n\"varying vec3 color;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = MVP * vec4(vPos, 0.0, 1.0);\\n\"\n\"    color = vCol;\\n\"\n\"}\\n\";\n\nstatic const char* fragment_shader_text =\n\"#version 110\\n\"\n\"varying vec3 color;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = vec4(color, 1.0);\\n\"\n\"}\\n\";\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nint main(void)\n{\n    GLFWwindow* window;\n    GLuint vertex_buffer, vertex_shader, fragment_shader, program;\n    GLint mvp_location, vpos_location, vcol_location;\n    float ratio;\n    int width, height;\n    mat4x4 mvp;\n    char* buffer;\n\n    glfwSetErrorCallback(error_callback);\n\n    glfwInitHint(GLFW_COCOA_MENUBAR, GLFW_FALSE);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\n    glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);\n\n    window = glfwCreateWindow(640, 480, \"Simple example\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n\n    // NOTE: OpenGL error checks have been omitted for brevity\n\n    glGenBuffers(1, &vertex_buffer);\n    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);\n\n    vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);\n    glCompileShader(vertex_shader);\n\n    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);\n    glCompileShader(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    mvp_location = glGetUniformLocation(program, \"MVP\");\n    vpos_location = glGetAttribLocation(program, \"vPos\");\n    vcol_location = glGetAttribLocation(program, \"vCol\");\n\n    glEnableVertexAttribArray(vpos_location);\n    glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,\n                          sizeof(vertices[0]), (void*) 0);\n    glEnableVertexAttribArray(vcol_location);\n    glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,\n                          sizeof(vertices[0]), (void*) (sizeof(float) * 2));\n\n    glfwGetFramebufferSize(window, &width, &height);\n    ratio = width / (float) height;\n\n    glViewport(0, 0, width, height);\n    glClear(GL_COLOR_BUFFER_BIT);\n\n    mat4x4_ortho(mvp, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);\n\n    glUseProgram(program);\n    glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);\n    glDrawArrays(GL_TRIANGLES, 0, 3);\n\n#if USE_NATIVE_OSMESA\n    glfwGetOSMesaColorBuffer(window, &width, &height, NULL, (void**) &buffer);\n#else\n    buffer = calloc(4, width * height);\n    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);\n#endif\n\n    // Write image Y-flipped because OpenGL\n    stbi_write_png(\"offscreen.png\",\n                   width, height, 4,\n                   buffer + (width * 4 * (height - 1)),\n                   -width * 4);\n\n#if USE_NATIVE_OSMESA\n    // Here is where there's nothing\n#else\n    free(buffer);\n#endif\n\n    glfwDestroyWindow(window);\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/examples/particles.c",
    "content": "//========================================================================\n// A simple particle engine with threaded physics\n// Copyright (c) Marcus Geelnard\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#if defined(_MSC_VER)\n // Make MS math.h define M_PI\n #define _USE_MATH_DEFINES\n#endif\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <math.h>\n#include <time.h>\n\n#include <tinycthread.h>\n#include <getopt.h>\n#include <linmath.h>\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n// Define tokens for GL_EXT_separate_specular_color if not already defined\n#ifndef GL_EXT_separate_specular_color\n#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT  0x81F8\n#define GL_SINGLE_COLOR_EXT               0x81F9\n#define GL_SEPARATE_SPECULAR_COLOR_EXT    0x81FA\n#endif // GL_EXT_separate_specular_color\n\n\n//========================================================================\n// Type definitions\n//========================================================================\n\ntypedef struct\n{\n    float x, y, z;\n} Vec3;\n\n// This structure is used for interleaved vertex arrays (see the\n// draw_particles function)\n//\n// NOTE: This structure SHOULD be packed on most systems. It uses 32-bit fields\n// on 32-bit boundaries, and is a multiple of 64 bits in total (6x32=3x64). If\n// it does not work, try using pragmas or whatever to force the structure to be\n// packed.\ntypedef struct\n{\n    GLfloat s, t;         // Texture coordinates\n    GLuint  rgba;         // Color (four ubytes packed into an uint)\n    GLfloat x, y, z;      // Vertex coordinates\n} Vertex;\n\n\n//========================================================================\n// Program control global variables\n//========================================================================\n\n// Window dimensions\nfloat aspect_ratio;\n\n// \"wireframe\" flag (true if we use wireframe view)\nint wireframe;\n\n// Thread synchronization\nstruct {\n    double    t;         // Time (s)\n    float     dt;        // Time since last frame (s)\n    int       p_frame;   // Particle physics frame number\n    int       d_frame;   // Particle draw frame number\n    cnd_t     p_done;    // Condition: particle physics done\n    cnd_t     d_done;    // Condition: particle draw done\n    mtx_t     particles_lock; // Particles data sharing mutex\n} thread_sync;\n\n\n//========================================================================\n// Texture declarations (we hard-code them into the source code, since\n// they are so simple)\n//========================================================================\n\n#define P_TEX_WIDTH  8    // Particle texture dimensions\n#define P_TEX_HEIGHT 8\n#define F_TEX_WIDTH  16   // Floor texture dimensions\n#define F_TEX_HEIGHT 16\n\n// Texture object IDs\nGLuint particle_tex_id, floor_tex_id;\n\n// Particle texture (a simple spot)\nconst unsigned char particle_texture[ P_TEX_WIDTH * P_TEX_HEIGHT ] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x11, 0x22, 0x22, 0x11, 0x00, 0x00,\n    0x00, 0x11, 0x33, 0x88, 0x77, 0x33, 0x11, 0x00,\n    0x00, 0x22, 0x88, 0xff, 0xee, 0x77, 0x22, 0x00,\n    0x00, 0x22, 0x77, 0xee, 0xff, 0x88, 0x22, 0x00,\n    0x00, 0x11, 0x33, 0x77, 0x88, 0x33, 0x11, 0x00,\n    0x00, 0x00, 0x11, 0x33, 0x22, 0x11, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\n// Floor texture (your basic checkered floor)\nconst unsigned char floor_texture[ F_TEX_WIDTH * F_TEX_HEIGHT ] = {\n    0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0xff, 0xf0, 0xcc, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0xf0, 0xcc, 0xee, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0x30, 0x66, 0x30, 0x30, 0x30, 0x20, 0x30, 0x30,\n    0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xee, 0xf0, 0xf0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xf0, 0xf0, 0xf0, 0x30, 0x30, 0x55, 0x30, 0x30, 0x44, 0x30, 0x30,\n    0xf0, 0xdd, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xf0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x60, 0x30,\n    0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x33, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x30, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x30, 0xf0, 0xff, 0xf0, 0xf0, 0xdd, 0xf0, 0xf0, 0xff,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x55, 0x33, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xf0,\n    0x30, 0x44, 0x66, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0xf0, 0xf0, 0xaa, 0xf0, 0xf0, 0xcc, 0xf0,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xdd, 0xf0,\n    0x30, 0x30, 0x30, 0x77, 0x30, 0x30, 0x30, 0x30, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,\n    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,\n};\n\n\n//========================================================================\n// These are fixed constants that control the particle engine. In a\n// modular world, these values should be variables...\n//========================================================================\n\n// Maximum number of particles\n#define MAX_PARTICLES   3000\n\n// Life span of a particle (in seconds)\n#define LIFE_SPAN       8.f\n\n// A new particle is born every [BIRTH_INTERVAL] second\n#define BIRTH_INTERVAL (LIFE_SPAN/(float)MAX_PARTICLES)\n\n// Particle size (meters)\n#define PARTICLE_SIZE   0.7f\n\n// Gravitational constant (m/s^2)\n#define GRAVITY         9.8f\n\n// Base initial velocity (m/s)\n#define VELOCITY        8.f\n\n// Bounce friction (1.0 = no friction, 0.0 = maximum friction)\n#define FRICTION        0.75f\n\n// \"Fountain\" height (m)\n#define FOUNTAIN_HEIGHT 3.f\n\n// Fountain radius (m)\n#define FOUNTAIN_RADIUS 1.6f\n\n// Minimum delta-time for particle phisics (s)\n#define MIN_DELTA_T     (BIRTH_INTERVAL * 0.5f)\n\n\n//========================================================================\n// Particle system global variables\n//========================================================================\n\n// This structure holds all state for a single particle\ntypedef struct {\n    float x,y,z;     // Position in space\n    float vx,vy,vz;  // Velocity vector\n    float r,g,b;     // Color of particle\n    float life;      // Life of particle (1.0 = newborn, < 0.0 = dead)\n    int   active;    // Tells if this particle is active\n} PARTICLE;\n\n// Global vectors holding all particles. We use two vectors for double\n// buffering.\nstatic PARTICLE particles[MAX_PARTICLES];\n\n// Global variable holding the age of the youngest particle\nstatic float min_age;\n\n// Color of latest born particle (used for fountain lighting)\nstatic float glow_color[4];\n\n// Position of latest born particle (used for fountain lighting)\nstatic float glow_pos[4];\n\n\n//========================================================================\n// Object material and fog configuration constants\n//========================================================================\n\nconst GLfloat fountain_diffuse[4]  = { 0.7f, 1.f,  1.f,  1.f };\nconst GLfloat fountain_specular[4] = {  1.f, 1.f,  1.f,  1.f };\nconst GLfloat fountain_shininess   = 12.f;\nconst GLfloat floor_diffuse[4]     = { 1.f,  0.6f, 0.6f, 1.f };\nconst GLfloat floor_specular[4]    = { 0.6f, 0.6f, 0.6f, 1.f };\nconst GLfloat floor_shininess      = 18.f;\nconst GLfloat fog_color[4]         = { 0.1f, 0.1f, 0.1f, 1.f };\n\n\n//========================================================================\n// Print usage information\n//========================================================================\n\nstatic void usage(void)\n{\n    printf(\"Usage: particles [-bfhs]\\n\");\n    printf(\"Options:\\n\");\n    printf(\" -f   Run in full screen\\n\");\n    printf(\" -h   Display this help\\n\");\n    printf(\" -s   Run program as single thread (default is to use two threads)\\n\");\n    printf(\"\\n\");\n    printf(\"Program runtime controls:\\n\");\n    printf(\" W    Toggle wireframe mode\\n\");\n    printf(\" Esc  Exit program\\n\");\n}\n\n\n//========================================================================\n// Initialize a new particle\n//========================================================================\n\nstatic void init_particle(PARTICLE *p, double t)\n{\n    float xy_angle, velocity;\n\n    // Start position of particle is at the fountain blow-out\n    p->x = 0.f;\n    p->y = 0.f;\n    p->z = FOUNTAIN_HEIGHT;\n\n    // Start velocity is up (Z)...\n    p->vz = 0.7f + (0.3f / 4096.f) * (float) (rand() & 4095);\n\n    // ...and a randomly chosen X/Y direction\n    xy_angle = (2.f * (float) M_PI / 4096.f) * (float) (rand() & 4095);\n    p->vx = 0.4f * (float) cos(xy_angle);\n    p->vy = 0.4f * (float) sin(xy_angle);\n\n    // Scale velocity vector according to a time-varying velocity\n    velocity = VELOCITY * (0.8f + 0.1f * (float) (sin(0.5 * t) + sin(1.31 * t)));\n    p->vx *= velocity;\n    p->vy *= velocity;\n    p->vz *= velocity;\n\n    // Color is time-varying\n    p->r = 0.7f + 0.3f * (float) sin(0.34 * t + 0.1);\n    p->g = 0.6f + 0.4f * (float) sin(0.63 * t + 1.1);\n    p->b = 0.6f + 0.4f * (float) sin(0.91 * t + 2.1);\n\n    // Store settings for fountain glow lighting\n    glow_pos[0] = 0.4f * (float) sin(1.34 * t);\n    glow_pos[1] = 0.4f * (float) sin(3.11 * t);\n    glow_pos[2] = FOUNTAIN_HEIGHT + 1.f;\n    glow_pos[3] = 1.f;\n    glow_color[0] = p->r;\n    glow_color[1] = p->g;\n    glow_color[2] = p->b;\n    glow_color[3] = 1.f;\n\n    // The particle is new-born and active\n    p->life = 1.f;\n    p->active = 1;\n}\n\n\n//========================================================================\n// Update a particle\n//========================================================================\n\n#define FOUNTAIN_R2 (FOUNTAIN_RADIUS+PARTICLE_SIZE/2)*(FOUNTAIN_RADIUS+PARTICLE_SIZE/2)\n\nstatic void update_particle(PARTICLE *p, float dt)\n{\n    // If the particle is not active, we need not do anything\n    if (!p->active)\n        return;\n\n    // The particle is getting older...\n    p->life -= dt * (1.f / LIFE_SPAN);\n\n    // Did the particle die?\n    if (p->life <= 0.f)\n    {\n        p->active = 0;\n        return;\n    }\n\n    // Apply gravity\n    p->vz = p->vz - GRAVITY * dt;\n\n    // Update particle position\n    p->x = p->x + p->vx * dt;\n    p->y = p->y + p->vy * dt;\n    p->z = p->z + p->vz * dt;\n\n    // Simple collision detection + response\n    if (p->vz < 0.f)\n    {\n        // Particles should bounce on the fountain (with friction)\n        if ((p->x * p->x + p->y * p->y) < FOUNTAIN_R2 &&\n            p->z < (FOUNTAIN_HEIGHT + PARTICLE_SIZE / 2))\n        {\n            p->vz = -FRICTION * p->vz;\n            p->z  = FOUNTAIN_HEIGHT + PARTICLE_SIZE / 2 +\n                    FRICTION * (FOUNTAIN_HEIGHT +\n                    PARTICLE_SIZE / 2 - p->z);\n        }\n\n        // Particles should bounce on the floor (with friction)\n        else if (p->z < PARTICLE_SIZE / 2)\n        {\n            p->vz = -FRICTION * p->vz;\n            p->z  = PARTICLE_SIZE / 2 +\n                    FRICTION * (PARTICLE_SIZE / 2 - p->z);\n        }\n    }\n}\n\n\n//========================================================================\n// The main frame for the particle engine. Called once per frame.\n//========================================================================\n\nstatic void particle_engine(double t, float dt)\n{\n    int i;\n    float dt2;\n\n    // Update particles (iterated several times per frame if dt is too large)\n    while (dt > 0.f)\n    {\n        // Calculate delta time for this iteration\n        dt2 = dt < MIN_DELTA_T ? dt : MIN_DELTA_T;\n\n        for (i = 0;  i < MAX_PARTICLES;  i++)\n            update_particle(&particles[i], dt2);\n\n        min_age += dt2;\n\n        // Should we create any new particle(s)?\n        while (min_age >= BIRTH_INTERVAL)\n        {\n            min_age -= BIRTH_INTERVAL;\n\n            // Find a dead particle to replace with a new one\n            for (i = 0;  i < MAX_PARTICLES;  i++)\n            {\n                if (!particles[i].active)\n                {\n                    init_particle(&particles[i], t + min_age);\n                    update_particle(&particles[i], min_age);\n                    break;\n                }\n            }\n        }\n\n        dt -= dt2;\n    }\n}\n\n\n//========================================================================\n// Draw all active particles. We use OpenGL 1.1 vertex\n// arrays for this in order to accelerate the drawing.\n//========================================================================\n\n#define BATCH_PARTICLES 70  // Number of particles to draw in each batch\n                            // (70 corresponds to 7.5 KB = will not blow\n                            // the L1 data cache on most CPUs)\n#define PARTICLE_VERTS  4   // Number of vertices per particle\n\nstatic void draw_particles(GLFWwindow* window, double t, float dt)\n{\n    int i, particle_count;\n    Vertex vertex_array[BATCH_PARTICLES * PARTICLE_VERTS];\n    Vertex* vptr;\n    float alpha;\n    GLuint rgba;\n    Vec3 quad_lower_left, quad_lower_right;\n    GLfloat mat[16];\n    PARTICLE* pptr;\n\n    // Here comes the real trick with flat single primitive objects (s.c.\n    // \"billboards\"): We must rotate the textured primitive so that it\n    // always faces the viewer (is coplanar with the view-plane).\n    // We:\n    //   1) Create the primitive around origo (0,0,0)\n    //   2) Rotate it so that it is coplanar with the view plane\n    //   3) Translate it according to the particle position\n    // Note that 1) and 2) is the same for all particles (done only once).\n\n    // Get modelview matrix. We will only use the upper left 3x3 part of\n    // the matrix, which represents the rotation.\n    glGetFloatv(GL_MODELVIEW_MATRIX, mat);\n\n    // 1) & 2) We do it in one swift step:\n    // Although not obvious, the following six lines represent two matrix/\n    // vector multiplications. The matrix is the inverse 3x3 rotation\n    // matrix (i.e. the transpose of the same matrix), and the two vectors\n    // represent the lower left corner of the quad, PARTICLE_SIZE/2 *\n    // (-1,-1,0), and the lower right corner, PARTICLE_SIZE/2 * (1,-1,0).\n    // The upper left/right corners of the quad is always the negative of\n    // the opposite corners (regardless of rotation).\n    quad_lower_left.x = (-PARTICLE_SIZE / 2) * (mat[0] + mat[1]);\n    quad_lower_left.y = (-PARTICLE_SIZE / 2) * (mat[4] + mat[5]);\n    quad_lower_left.z = (-PARTICLE_SIZE / 2) * (mat[8] + mat[9]);\n    quad_lower_right.x = (PARTICLE_SIZE / 2) * (mat[0] - mat[1]);\n    quad_lower_right.y = (PARTICLE_SIZE / 2) * (mat[4] - mat[5]);\n    quad_lower_right.z = (PARTICLE_SIZE / 2) * (mat[8] - mat[9]);\n\n    // Don't update z-buffer, since all particles are transparent!\n    glDepthMask(GL_FALSE);\n\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE);\n\n    // Select particle texture\n    if (!wireframe)\n    {\n        glEnable(GL_TEXTURE_2D);\n        glBindTexture(GL_TEXTURE_2D, particle_tex_id);\n    }\n\n    // Set up vertex arrays. We use interleaved arrays, which is easier to\n    // handle (in most situations) and it gives a linear memeory access\n    // access pattern (which may give better performance in some\n    // situations). GL_T2F_C4UB_V3F means: 2 floats for texture coords,\n    // 4 ubytes for color and 3 floats for vertex coord (in that order).\n    // Most OpenGL cards / drivers are optimized for this format.\n    glInterleavedArrays(GL_T2F_C4UB_V3F, 0, vertex_array);\n\n    // Wait for particle physics thread to be done\n    mtx_lock(&thread_sync.particles_lock);\n    while (!glfwWindowShouldClose(window) &&\n            thread_sync.p_frame <= thread_sync.d_frame)\n    {\n        struct timespec ts;\n        clock_gettime(CLOCK_REALTIME, &ts);\n        ts.tv_nsec += 100 * 1000 * 1000;\n        ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000);\n        ts.tv_nsec %= 1000 * 1000 * 1000;\n        cnd_timedwait(&thread_sync.p_done, &thread_sync.particles_lock, &ts);\n    }\n\n    // Store the frame time and delta time for the physics thread\n    thread_sync.t = t;\n    thread_sync.dt = dt;\n\n    // Update frame counter\n    thread_sync.d_frame++;\n\n    // Loop through all particles and build vertex arrays.\n    particle_count = 0;\n    vptr = vertex_array;\n    pptr = particles;\n\n    for (i = 0;  i < MAX_PARTICLES;  i++)\n    {\n        if (pptr->active)\n        {\n            // Calculate particle intensity (we set it to max during 75%\n            // of its life, then it fades out)\n            alpha =  4.f * pptr->life;\n            if (alpha > 1.f)\n                alpha = 1.f;\n\n            // Convert color from float to 8-bit (store it in a 32-bit\n            // integer using endian independent type casting)\n            ((GLubyte*) &rgba)[0] = (GLubyte)(pptr->r * 255.f);\n            ((GLubyte*) &rgba)[1] = (GLubyte)(pptr->g * 255.f);\n            ((GLubyte*) &rgba)[2] = (GLubyte)(pptr->b * 255.f);\n            ((GLubyte*) &rgba)[3] = (GLubyte)(alpha * 255.f);\n\n            // 3) Translate the quad to the correct position in modelview\n            // space and store its parameters in vertex arrays (we also\n            // store texture coord and color information for each vertex).\n\n            // Lower left corner\n            vptr->s    = 0.f;\n            vptr->t    = 0.f;\n            vptr->rgba = rgba;\n            vptr->x    = pptr->x + quad_lower_left.x;\n            vptr->y    = pptr->y + quad_lower_left.y;\n            vptr->z    = pptr->z + quad_lower_left.z;\n            vptr ++;\n\n            // Lower right corner\n            vptr->s    = 1.f;\n            vptr->t    = 0.f;\n            vptr->rgba = rgba;\n            vptr->x    = pptr->x + quad_lower_right.x;\n            vptr->y    = pptr->y + quad_lower_right.y;\n            vptr->z    = pptr->z + quad_lower_right.z;\n            vptr ++;\n\n            // Upper right corner\n            vptr->s    = 1.f;\n            vptr->t    = 1.f;\n            vptr->rgba = rgba;\n            vptr->x    = pptr->x - quad_lower_left.x;\n            vptr->y    = pptr->y - quad_lower_left.y;\n            vptr->z    = pptr->z - quad_lower_left.z;\n            vptr ++;\n\n            // Upper left corner\n            vptr->s    = 0.f;\n            vptr->t    = 1.f;\n            vptr->rgba = rgba;\n            vptr->x    = pptr->x - quad_lower_right.x;\n            vptr->y    = pptr->y - quad_lower_right.y;\n            vptr->z    = pptr->z - quad_lower_right.z;\n            vptr ++;\n\n            // Increase count of drawable particles\n            particle_count ++;\n        }\n\n        // If we have filled up one batch of particles, draw it as a set\n        // of quads using glDrawArrays.\n        if (particle_count >= BATCH_PARTICLES)\n        {\n            // The first argument tells which primitive type we use (QUAD)\n            // The second argument tells the index of the first vertex (0)\n            // The last argument is the vertex count\n            glDrawArrays(GL_QUADS, 0, PARTICLE_VERTS * particle_count);\n            particle_count = 0;\n            vptr = vertex_array;\n        }\n\n        // Next particle\n        pptr++;\n    }\n\n    // We are done with the particle data\n    mtx_unlock(&thread_sync.particles_lock);\n    cnd_signal(&thread_sync.d_done);\n\n    // Draw final batch of particles (if any)\n    glDrawArrays(GL_QUADS, 0, PARTICLE_VERTS * particle_count);\n\n    // Disable vertex arrays (Note: glInterleavedArrays implicitly called\n    // glEnableClientState for vertex, texture coord and color arrays)\n    glDisableClientState(GL_VERTEX_ARRAY);\n    glDisableClientState(GL_TEXTURE_COORD_ARRAY);\n    glDisableClientState(GL_COLOR_ARRAY);\n\n    glDisable(GL_TEXTURE_2D);\n    glDisable(GL_BLEND);\n\n    glDepthMask(GL_TRUE);\n}\n\n\n//========================================================================\n// Fountain geometry specification\n//========================================================================\n\n#define FOUNTAIN_SIDE_POINTS 14\n#define FOUNTAIN_SWEEP_STEPS 32\n\nstatic const float fountain_side[FOUNTAIN_SIDE_POINTS * 2] =\n{\n    1.2f, 0.f,  1.f, 0.2f,  0.41f, 0.3f, 0.4f, 0.35f,\n    0.4f, 1.95f, 0.41f, 2.f, 0.8f, 2.2f,  1.2f, 2.4f,\n    1.5f, 2.7f,  1.55f,2.95f, 1.6f, 3.f,  1.f, 3.f,\n    0.5f, 3.f,  0.f, 3.f\n};\n\nstatic const float fountain_normal[FOUNTAIN_SIDE_POINTS * 2] =\n{\n    1.0000f, 0.0000f,  0.6428f, 0.7660f,  0.3420f, 0.9397f,  1.0000f, 0.0000f,\n    1.0000f, 0.0000f,  0.3420f,-0.9397f,  0.4226f,-0.9063f,  0.5000f,-0.8660f,\n    0.7660f,-0.6428f,  0.9063f,-0.4226f,  0.0000f,1.00000f,  0.0000f,1.00000f,\n    0.0000f,1.00000f,  0.0000f,1.00000f\n};\n\n\n//========================================================================\n// Draw a fountain\n//========================================================================\n\nstatic void draw_fountain(void)\n{\n    static GLuint fountain_list = 0;\n    double angle;\n    float  x, y;\n    int m, n;\n\n    // The first time, we build the fountain display list\n    if (!fountain_list)\n    {\n        fountain_list = glGenLists(1);\n        glNewList(fountain_list, GL_COMPILE_AND_EXECUTE);\n\n        glMaterialfv(GL_FRONT, GL_DIFFUSE, fountain_diffuse);\n        glMaterialfv(GL_FRONT, GL_SPECULAR, fountain_specular);\n        glMaterialf(GL_FRONT, GL_SHININESS, fountain_shininess);\n\n        // Build fountain using triangle strips\n        for (n = 0;  n < FOUNTAIN_SIDE_POINTS - 1;  n++)\n        {\n            glBegin(GL_TRIANGLE_STRIP);\n            for (m = 0;  m <= FOUNTAIN_SWEEP_STEPS;  m++)\n            {\n                angle = (double) m * (2.0 * M_PI / (double) FOUNTAIN_SWEEP_STEPS);\n                x = (float) cos(angle);\n                y = (float) sin(angle);\n\n                // Draw triangle strip\n                glNormal3f(x * fountain_normal[n * 2 + 2],\n                           y * fountain_normal[n * 2 + 2],\n                           fountain_normal[n * 2 + 3]);\n                glVertex3f(x * fountain_side[n * 2 + 2],\n                           y * fountain_side[n * 2 + 2],\n                           fountain_side[n * 2 +3 ]);\n                glNormal3f(x * fountain_normal[n * 2],\n                           y * fountain_normal[n * 2],\n                           fountain_normal[n * 2 + 1]);\n                glVertex3f(x * fountain_side[n * 2],\n                           y * fountain_side[n * 2],\n                           fountain_side[n * 2 + 1]);\n            }\n\n            glEnd();\n        }\n\n        glEndList();\n    }\n    else\n        glCallList(fountain_list);\n}\n\n\n//========================================================================\n// Recursive function for building variable tesselated floor\n//========================================================================\n\nstatic void tessellate_floor(float x1, float y1, float x2, float y2, int depth)\n{\n    float delta, x, y;\n\n    // Last recursion?\n    if (depth >= 5)\n        delta = 999999.f;\n    else\n    {\n        x = (float) (fabs(x1) < fabs(x2) ? fabs(x1) : fabs(x2));\n        y = (float) (fabs(y1) < fabs(y2) ? fabs(y1) : fabs(y2));\n        delta = x*x + y*y;\n    }\n\n    // Recurse further?\n    if (delta < 0.1f)\n    {\n        x = (x1 + x2) * 0.5f;\n        y = (y1 + y2) * 0.5f;\n        tessellate_floor(x1, y1,  x,  y, depth + 1);\n        tessellate_floor(x, y1, x2,  y, depth + 1);\n        tessellate_floor(x1,  y,  x, y2, depth + 1);\n        tessellate_floor(x,  y, x2, y2, depth + 1);\n    }\n    else\n    {\n        glTexCoord2f(x1 * 30.f, y1 * 30.f);\n        glVertex3f(  x1 * 80.f, y1 * 80.f, 0.f);\n        glTexCoord2f(x2 * 30.f, y1 * 30.f);\n        glVertex3f(  x2 * 80.f, y1 * 80.f, 0.f);\n        glTexCoord2f(x2 * 30.f, y2 * 30.f);\n        glVertex3f(  x2 * 80.f, y2 * 80.f, 0.f);\n        glTexCoord2f(x1 * 30.f, y2 * 30.f);\n        glVertex3f(  x1 * 80.f, y2 * 80.f, 0.f);\n    }\n}\n\n\n//========================================================================\n// Draw floor. We build the floor recursively and let the tessellation in the\n// center (near x,y=0,0) be high, while the tessellation around the edges be\n// low.\n//========================================================================\n\nstatic void draw_floor(void)\n{\n    static GLuint floor_list = 0;\n\n    if (!wireframe)\n    {\n        glEnable(GL_TEXTURE_2D);\n        glBindTexture(GL_TEXTURE_2D, floor_tex_id);\n    }\n\n    // The first time, we build the floor display list\n    if (!floor_list)\n    {\n        floor_list = glGenLists(1);\n        glNewList(floor_list, GL_COMPILE_AND_EXECUTE);\n\n        glMaterialfv(GL_FRONT, GL_DIFFUSE, floor_diffuse);\n        glMaterialfv(GL_FRONT, GL_SPECULAR, floor_specular);\n        glMaterialf(GL_FRONT, GL_SHININESS, floor_shininess);\n\n        // Draw floor as a bunch of triangle strips (high tesselation\n        // improves lighting)\n        glNormal3f(0.f, 0.f, 1.f);\n        glBegin(GL_QUADS);\n        tessellate_floor(-1.f, -1.f, 0.f, 0.f, 0);\n        tessellate_floor( 0.f, -1.f, 1.f, 0.f, 0);\n        tessellate_floor( 0.f,  0.f, 1.f, 1.f, 0);\n        tessellate_floor(-1.f,  0.f, 0.f, 1.f, 0);\n        glEnd();\n\n        glEndList();\n    }\n    else\n        glCallList(floor_list);\n\n    glDisable(GL_TEXTURE_2D);\n\n}\n\n\n//========================================================================\n// Position and configure light sources\n//========================================================================\n\nstatic void setup_lights(void)\n{\n    float l1pos[4], l1amb[4], l1dif[4], l1spec[4];\n    float l2pos[4], l2amb[4], l2dif[4], l2spec[4];\n\n    // Set light source 1 parameters\n    l1pos[0] =  0.f;  l1pos[1] = -9.f; l1pos[2] =   8.f;  l1pos[3] = 1.f;\n    l1amb[0] = 0.2f;  l1amb[1] = 0.2f;  l1amb[2] = 0.2f;  l1amb[3] = 1.f;\n    l1dif[0] = 0.8f;  l1dif[1] = 0.4f;  l1dif[2] = 0.2f;  l1dif[3] = 1.f;\n    l1spec[0] = 1.f; l1spec[1] = 0.6f; l1spec[2] = 0.2f; l1spec[3] = 0.f;\n\n    // Set light source 2 parameters\n    l2pos[0] =  -15.f; l2pos[1] =  12.f; l2pos[2] = 1.5f; l2pos[3] =  1.f;\n    l2amb[0] =    0.f; l2amb[1] =   0.f; l2amb[2] =  0.f; l2amb[3] =  1.f;\n    l2dif[0] =   0.2f; l2dif[1] =  0.4f; l2dif[2] = 0.8f; l2dif[3] =  1.f;\n    l2spec[0] =  0.2f; l2spec[1] = 0.6f; l2spec[2] = 1.f; l2spec[3] = 0.f;\n\n    glLightfv(GL_LIGHT1, GL_POSITION, l1pos);\n    glLightfv(GL_LIGHT1, GL_AMBIENT, l1amb);\n    glLightfv(GL_LIGHT1, GL_DIFFUSE, l1dif);\n    glLightfv(GL_LIGHT1, GL_SPECULAR, l1spec);\n    glLightfv(GL_LIGHT2, GL_POSITION, l2pos);\n    glLightfv(GL_LIGHT2, GL_AMBIENT, l2amb);\n    glLightfv(GL_LIGHT2, GL_DIFFUSE, l2dif);\n    glLightfv(GL_LIGHT2, GL_SPECULAR, l2spec);\n    glLightfv(GL_LIGHT3, GL_POSITION, glow_pos);\n    glLightfv(GL_LIGHT3, GL_DIFFUSE, glow_color);\n    glLightfv(GL_LIGHT3, GL_SPECULAR, glow_color);\n\n    glEnable(GL_LIGHT1);\n    glEnable(GL_LIGHT2);\n    glEnable(GL_LIGHT3);\n}\n\n\n//========================================================================\n// Main rendering function\n//========================================================================\n\nstatic void draw_scene(GLFWwindow* window, double t)\n{\n    double xpos, ypos, zpos, angle_x, angle_y, angle_z;\n    static double t_old = 0.0;\n    float dt;\n    mat4x4 projection;\n\n    // Calculate frame-to-frame delta time\n    dt = (float) (t - t_old);\n    t_old = t;\n\n    mat4x4_perspective(projection,\n                       65.f * (float) M_PI / 180.f,\n                       aspect_ratio,\n                       1.0, 60.0);\n\n    glClearColor(0.1f, 0.1f, 0.1f, 1.f);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    glMatrixMode(GL_PROJECTION);\n    glLoadMatrixf((const GLfloat*) projection);\n\n    // Setup camera\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n\n    // Rotate camera\n    angle_x = 90.0 - 10.0;\n    angle_y = 10.0 * sin(0.3 * t);\n    angle_z = 10.0 * t;\n    glRotated(-angle_x, 1.0, 0.0, 0.0);\n    glRotated(-angle_y, 0.0, 1.0, 0.0);\n    glRotated(-angle_z, 0.0, 0.0, 1.0);\n\n    // Translate camera\n    xpos =  15.0 * sin((M_PI / 180.0) * angle_z) +\n             2.0 * sin((M_PI / 180.0) * 3.1 * t);\n    ypos = -15.0 * cos((M_PI / 180.0) * angle_z) +\n             2.0 * cos((M_PI / 180.0) * 2.9 * t);\n    zpos = 4.0 + 2.0 * cos((M_PI / 180.0) * 4.9 * t);\n    glTranslated(-xpos, -ypos, -zpos);\n\n    glFrontFace(GL_CCW);\n    glCullFace(GL_BACK);\n    glEnable(GL_CULL_FACE);\n\n    setup_lights();\n    glEnable(GL_LIGHTING);\n\n    glEnable(GL_FOG);\n    glFogi(GL_FOG_MODE, GL_EXP);\n    glFogf(GL_FOG_DENSITY, 0.05f);\n    glFogfv(GL_FOG_COLOR, fog_color);\n\n    draw_floor();\n\n    glEnable(GL_DEPTH_TEST);\n    glDepthFunc(GL_LEQUAL);\n    glDepthMask(GL_TRUE);\n\n    draw_fountain();\n\n    glDisable(GL_LIGHTING);\n    glDisable(GL_FOG);\n\n    // Particles must be drawn after all solid objects have been drawn\n    draw_particles(window, t, dt);\n\n    // Z-buffer not needed anymore\n    glDisable(GL_DEPTH_TEST);\n}\n\n\n//========================================================================\n// Window resize callback function\n//========================================================================\n\nstatic void resize_callback(GLFWwindow* window, int width, int height)\n{\n    glViewport(0, 0, width, height);\n    aspect_ratio = height ? width / (float) height : 1.f;\n}\n\n\n//========================================================================\n// Key callback functions\n//========================================================================\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action == GLFW_PRESS)\n    {\n        switch (key)\n        {\n            case GLFW_KEY_ESCAPE:\n                glfwSetWindowShouldClose(window, GLFW_TRUE);\n                break;\n            case GLFW_KEY_W:\n                wireframe = !wireframe;\n                glPolygonMode(GL_FRONT_AND_BACK,\n                              wireframe ? GL_LINE : GL_FILL);\n                break;\n            default:\n                break;\n        }\n    }\n}\n\n\n//========================================================================\n// Thread for updating particle physics\n//========================================================================\n\nstatic int physics_thread_main(void* arg)\n{\n    GLFWwindow* window = arg;\n\n    for (;;)\n    {\n        mtx_lock(&thread_sync.particles_lock);\n\n        // Wait for particle drawing to be done\n        while (!glfwWindowShouldClose(window) &&\n               thread_sync.p_frame > thread_sync.d_frame)\n        {\n            struct timespec ts;\n            clock_gettime(CLOCK_REALTIME, &ts);\n            ts.tv_nsec += 100 * 1000 * 1000;\n            ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000);\n            ts.tv_nsec %= 1000 * 1000 * 1000;\n            cnd_timedwait(&thread_sync.d_done, &thread_sync.particles_lock, &ts);\n        }\n\n        if (glfwWindowShouldClose(window))\n            break;\n\n        // Update particles\n        particle_engine(thread_sync.t, thread_sync.dt);\n\n        // Update frame counter\n        thread_sync.p_frame++;\n\n        // Unlock mutex and signal drawing thread\n        mtx_unlock(&thread_sync.particles_lock);\n        cnd_signal(&thread_sync.p_done);\n    }\n\n    return 0;\n}\n\n\n//========================================================================\n// main\n//========================================================================\n\nint main(int argc, char** argv)\n{\n    int ch, width, height;\n    thrd_t physics_thread = 0;\n    GLFWwindow* window;\n    GLFWmonitor* monitor = NULL;\n\n    if (!glfwInit())\n    {\n        fprintf(stderr, \"Failed to initialize GLFW\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    while ((ch = getopt(argc, argv, \"fh\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'f':\n                monitor = glfwGetPrimaryMonitor();\n                break;\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n        }\n    }\n\n    if (monitor)\n    {\n        const GLFWvidmode* mode = glfwGetVideoMode(monitor);\n\n        glfwWindowHint(GLFW_RED_BITS, mode->redBits);\n        glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);\n        glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);\n        glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);\n\n        width  = mode->width;\n        height = mode->height;\n    }\n    else\n    {\n        width  = 640;\n        height = 480;\n    }\n\n    window = glfwCreateWindow(width, height, \"Particle Engine\", monitor, NULL);\n    if (!window)\n    {\n        fprintf(stderr, \"Failed to create GLFW window\\n\");\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    if (monitor)\n        glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    glfwSetFramebufferSizeCallback(window, resize_callback);\n    glfwSetKeyCallback(window, key_callback);\n\n    // Set initial aspect ratio\n    glfwGetFramebufferSize(window, &width, &height);\n    resize_callback(window, width, height);\n\n    // Upload particle texture\n    glGenTextures(1, &particle_tex_id);\n    glBindTexture(GL_TEXTURE_2D, particle_tex_id);\n    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, P_TEX_WIDTH, P_TEX_HEIGHT,\n                 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, particle_texture);\n\n    // Upload floor texture\n    glGenTextures(1, &floor_tex_id);\n    glBindTexture(GL_TEXTURE_2D, floor_tex_id);\n    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, F_TEX_WIDTH, F_TEX_HEIGHT,\n                 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, floor_texture);\n\n    if (glfwExtensionSupported(\"GL_EXT_separate_specular_color\"))\n    {\n        glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL_EXT,\n                      GL_SEPARATE_SPECULAR_COLOR_EXT);\n    }\n\n    // Set filled polygon mode as default (not wireframe)\n    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n    wireframe = 0;\n\n    // Set initial times\n    thread_sync.t  = 0.0;\n    thread_sync.dt = 0.001f;\n    thread_sync.p_frame = 0;\n    thread_sync.d_frame = 0;\n\n    mtx_init(&thread_sync.particles_lock, mtx_timed);\n    cnd_init(&thread_sync.p_done);\n    cnd_init(&thread_sync.d_done);\n\n    if (thrd_create(&physics_thread, physics_thread_main, window) != thrd_success)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwSetTime(0.0);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        draw_scene(window, glfwGetTime());\n\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n\n    thrd_join(physics_thread, NULL);\n\n    glfwDestroyWindow(window);\n    glfwTerminate();\n\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/examples/simple.c",
    "content": "//========================================================================\n// Simple GLFW example\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//! [code]\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include \"linmath.h\"\n\n#include <stdlib.h>\n#include <stdio.h>\n\nstatic const struct\n{\n    float x, y;\n    float r, g, b;\n} vertices[3] =\n{\n    { -0.6f, -0.4f, 1.f, 0.f, 0.f },\n    {  0.6f, -0.4f, 0.f, 1.f, 0.f },\n    {   0.f,  0.6f, 0.f, 0.f, 1.f }\n};\n\nstatic const char* vertex_shader_text =\n\"#version 110\\n\"\n\"uniform mat4 MVP;\\n\"\n\"attribute vec3 vCol;\\n\"\n\"attribute vec2 vPos;\\n\"\n\"varying vec3 color;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = MVP * vec4(vPos, 0.0, 1.0);\\n\"\n\"    color = vCol;\\n\"\n\"}\\n\";\n\nstatic const char* fragment_shader_text =\n\"#version 110\\n\"\n\"varying vec3 color;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = vec4(color, 1.0);\\n\"\n\"}\\n\";\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\nint main(void)\n{\n    GLFWwindow* window;\n    GLuint vertex_buffer, vertex_shader, fragment_shader, program;\n    GLint mvp_location, vpos_location, vcol_location;\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\n\n    window = glfwCreateWindow(640, 480, \"Simple example\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwSetKeyCallback(window, key_callback);\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    // NOTE: OpenGL error checks have been omitted for brevity\n\n    glGenBuffers(1, &vertex_buffer);\n    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);\n\n    vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);\n    glCompileShader(vertex_shader);\n\n    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);\n    glCompileShader(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    mvp_location = glGetUniformLocation(program, \"MVP\");\n    vpos_location = glGetAttribLocation(program, \"vPos\");\n    vcol_location = glGetAttribLocation(program, \"vCol\");\n\n    glEnableVertexAttribArray(vpos_location);\n    glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,\n                          sizeof(vertices[0]), (void*) 0);\n    glEnableVertexAttribArray(vcol_location);\n    glVertexAttribPointer(vcol_location, 3, GL_FLOAT, GL_FALSE,\n                          sizeof(vertices[0]), (void*) (sizeof(float) * 2));\n\n    while (!glfwWindowShouldClose(window))\n    {\n        float ratio;\n        int width, height;\n        mat4x4 m, p, mvp;\n\n        glfwGetFramebufferSize(window, &width, &height);\n        ratio = width / (float) height;\n\n        glViewport(0, 0, width, height);\n        glClear(GL_COLOR_BUFFER_BIT);\n\n        mat4x4_identity(m);\n        mat4x4_rotate_Z(m, m, (float) glfwGetTime());\n        mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 1.f, -1.f);\n        mat4x4_mul(mvp, p, m);\n\n        glUseProgram(program);\n        glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);\n        glDrawArrays(GL_TRIANGLES, 0, 3);\n\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n\n    glfwDestroyWindow(window);\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n//! [code]\n"
  },
  {
    "path": "external/GLFW/examples/splitview.c",
    "content": "//========================================================================\n// This is an example program for the GLFW library\n//\n// The program uses a \"split window\" view, rendering four views of the\n// same scene in one window (e.g. uesful for 3D modelling software). This\n// demo uses scissors to separete the four different rendering areas from\n// each other.\n//\n// (If the code seems a little bit strange here and there, it may be\n//  because I am not a friend of orthogonal projections)\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#if defined(_MSC_VER)\n // Make MS math.h define M_PI\n #define _USE_MATH_DEFINES\n#endif\n\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <linmath.h>\n\n\n//========================================================================\n// Global variables\n//========================================================================\n\n// Mouse position\nstatic double xpos = 0, ypos = 0;\n\n// Window size\nstatic int width, height;\n\n// Active view: 0 = none, 1 = upper left, 2 = upper right, 3 = lower left,\n// 4 = lower right\nstatic int active_view = 0;\n\n// Rotation around each axis\nstatic int rot_x = 0, rot_y = 0, rot_z = 0;\n\n// Do redraw?\nstatic int do_redraw = 1;\n\n\n//========================================================================\n// Draw a solid torus (use a display list for the model)\n//========================================================================\n\n#define TORUS_MAJOR     1.5\n#define TORUS_MINOR     0.5\n#define TORUS_MAJOR_RES 32\n#define TORUS_MINOR_RES 32\n\nstatic void drawTorus(void)\n{\n    static GLuint torus_list = 0;\n    int    i, j, k;\n    double s, t, x, y, z, nx, ny, nz, scale, twopi;\n\n    if (!torus_list)\n    {\n        // Start recording displaylist\n        torus_list = glGenLists(1);\n        glNewList(torus_list, GL_COMPILE_AND_EXECUTE);\n\n        // Draw torus\n        twopi = 2.0 * M_PI;\n        for (i = 0;  i < TORUS_MINOR_RES;  i++)\n        {\n            glBegin(GL_QUAD_STRIP);\n            for (j = 0;  j <= TORUS_MAJOR_RES;  j++)\n            {\n                for (k = 1;  k >= 0;  k--)\n                {\n                    s = (i + k) % TORUS_MINOR_RES + 0.5;\n                    t = j % TORUS_MAJOR_RES;\n\n                    // Calculate point on surface\n                    x = (TORUS_MAJOR + TORUS_MINOR * cos(s * twopi / TORUS_MINOR_RES)) * cos(t * twopi / TORUS_MAJOR_RES);\n                    y = TORUS_MINOR * sin(s * twopi / TORUS_MINOR_RES);\n                    z = (TORUS_MAJOR + TORUS_MINOR * cos(s * twopi / TORUS_MINOR_RES)) * sin(t * twopi / TORUS_MAJOR_RES);\n\n                    // Calculate surface normal\n                    nx = x - TORUS_MAJOR * cos(t * twopi / TORUS_MAJOR_RES);\n                    ny = y;\n                    nz = z - TORUS_MAJOR * sin(t * twopi / TORUS_MAJOR_RES);\n                    scale = 1.0 / sqrt(nx*nx + ny*ny + nz*nz);\n                    nx *= scale;\n                    ny *= scale;\n                    nz *= scale;\n\n                    glNormal3f((float) nx, (float) ny, (float) nz);\n                    glVertex3f((float) x, (float) y, (float) z);\n                }\n            }\n\n            glEnd();\n        }\n\n        // Stop recording displaylist\n        glEndList();\n    }\n    else\n    {\n        // Playback displaylist\n        glCallList(torus_list);\n    }\n}\n\n\n//========================================================================\n// Draw the scene (a rotating torus)\n//========================================================================\n\nstatic void drawScene(void)\n{\n    const GLfloat model_diffuse[4]  = {1.0f, 0.8f, 0.8f, 1.0f};\n    const GLfloat model_specular[4] = {0.6f, 0.6f, 0.6f, 1.0f};\n    const GLfloat model_shininess   = 20.0f;\n\n    glPushMatrix();\n\n    // Rotate the object\n    glRotatef((GLfloat) rot_x * 0.5f, 1.0f, 0.0f, 0.0f);\n    glRotatef((GLfloat) rot_y * 0.5f, 0.0f, 1.0f, 0.0f);\n    glRotatef((GLfloat) rot_z * 0.5f, 0.0f, 0.0f, 1.0f);\n\n    // Set model color (used for orthogonal views, lighting disabled)\n    glColor4fv(model_diffuse);\n\n    // Set model material (used for perspective view, lighting enabled)\n    glMaterialfv(GL_FRONT, GL_DIFFUSE, model_diffuse);\n    glMaterialfv(GL_FRONT, GL_SPECULAR, model_specular);\n    glMaterialf(GL_FRONT, GL_SHININESS, model_shininess);\n\n    // Draw torus\n    drawTorus();\n\n    glPopMatrix();\n}\n\n\n//========================================================================\n// Draw a 2D grid (used for orthogonal views)\n//========================================================================\n\nstatic void drawGrid(float scale, int steps)\n{\n    int i;\n    float x, y;\n    mat4x4 view;\n\n    glPushMatrix();\n\n    // Set background to some dark bluish grey\n    glClearColor(0.05f, 0.05f, 0.2f, 0.0f);\n    glClear(GL_COLOR_BUFFER_BIT);\n\n    // Setup modelview matrix (flat XY view)\n    {\n        vec3 eye = { 0.f, 0.f, 1.f };\n        vec3 center = { 0.f, 0.f, 0.f };\n        vec3 up = { 0.f, 1.f, 0.f };\n        mat4x4_look_at(view, eye, center, up);\n    }\n    glLoadMatrixf((const GLfloat*) view);\n\n    // We don't want to update the Z-buffer\n    glDepthMask(GL_FALSE);\n\n    // Set grid color\n    glColor3f(0.0f, 0.5f, 0.5f);\n\n    glBegin(GL_LINES);\n\n    // Horizontal lines\n    x = scale * 0.5f * (float) (steps - 1);\n    y = -scale * 0.5f * (float) (steps - 1);\n    for (i = 0;  i < steps;  i++)\n    {\n        glVertex3f(-x, y, 0.0f);\n        glVertex3f(x, y, 0.0f);\n        y += scale;\n    }\n\n    // Vertical lines\n    x = -scale * 0.5f * (float) (steps - 1);\n    y = scale * 0.5f * (float) (steps - 1);\n    for (i = 0;  i < steps;  i++)\n    {\n        glVertex3f(x, -y, 0.0f);\n        glVertex3f(x, y, 0.0f);\n        x += scale;\n    }\n\n    glEnd();\n\n    // Enable Z-buffer writing again\n    glDepthMask(GL_TRUE);\n\n    glPopMatrix();\n}\n\n\n//========================================================================\n// Draw all views\n//========================================================================\n\nstatic void drawAllViews(void)\n{\n    const GLfloat light_position[4] = {0.0f, 8.0f, 8.0f, 1.0f};\n    const GLfloat light_diffuse[4]  = {1.0f, 1.0f, 1.0f, 1.0f};\n    const GLfloat light_specular[4] = {1.0f, 1.0f, 1.0f, 1.0f};\n    const GLfloat light_ambient[4]  = {0.2f, 0.2f, 0.3f, 1.0f};\n    float aspect;\n    mat4x4 view, projection;\n\n    // Calculate aspect of window\n    if (height > 0)\n        aspect = (float) width / (float) height;\n    else\n        aspect = 1.f;\n\n    // Clear screen\n    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    // Enable scissor test\n    glEnable(GL_SCISSOR_TEST);\n\n    // Enable depth test\n    glEnable(GL_DEPTH_TEST);\n    glDepthFunc(GL_LEQUAL);\n\n    // ** ORTHOGONAL VIEWS **\n\n    // For orthogonal views, use wireframe rendering\n    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);\n\n    // Enable line anti-aliasing\n    glEnable(GL_LINE_SMOOTH);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n    // Setup orthogonal projection matrix\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    glOrtho(-3.0 * aspect, 3.0 * aspect, -3.0, 3.0, 1.0, 50.0);\n\n    // Upper left view (TOP VIEW)\n    glViewport(0, height / 2, width / 2, height / 2);\n    glScissor(0, height / 2, width / 2, height / 2);\n    glMatrixMode(GL_MODELVIEW);\n    {\n        vec3 eye = { 0.f, 10.f, 1e-3f };\n        vec3 center = { 0.f, 0.f, 0.f };\n        vec3 up = { 0.f, 1.f, 0.f };\n        mat4x4_look_at( view, eye, center, up );\n    }\n    glLoadMatrixf((const GLfloat*) view);\n    drawGrid(0.5, 12);\n    drawScene();\n\n    // Lower left view (FRONT VIEW)\n    glViewport(0, 0, width / 2, height / 2);\n    glScissor(0, 0, width / 2, height / 2);\n    glMatrixMode(GL_MODELVIEW);\n    {\n        vec3 eye = { 0.f, 0.f, 10.f };\n        vec3 center = { 0.f, 0.f, 0.f };\n        vec3 up = { 0.f, 1.f, 0.f };\n        mat4x4_look_at( view, eye, center, up );\n    }\n    glLoadMatrixf((const GLfloat*) view);\n    drawGrid(0.5, 12);\n    drawScene();\n\n    // Lower right view (SIDE VIEW)\n    glViewport(width / 2, 0, width / 2, height / 2);\n    glScissor(width / 2, 0, width / 2, height / 2);\n    glMatrixMode(GL_MODELVIEW);\n    {\n        vec3 eye = { 10.f, 0.f, 0.f };\n        vec3 center = { 0.f, 0.f, 0.f };\n        vec3 up = { 0.f, 1.f, 0.f };\n        mat4x4_look_at( view, eye, center, up );\n    }\n    glLoadMatrixf((const GLfloat*) view);\n    drawGrid(0.5, 12);\n    drawScene();\n\n    // Disable line anti-aliasing\n    glDisable(GL_LINE_SMOOTH);\n    glDisable(GL_BLEND);\n\n    // ** PERSPECTIVE VIEW **\n\n    // For perspective view, use solid rendering\n    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\n    // Enable face culling (faster rendering)\n    glEnable(GL_CULL_FACE);\n    glCullFace(GL_BACK);\n    glFrontFace(GL_CW);\n\n    // Setup perspective projection matrix\n    glMatrixMode(GL_PROJECTION);\n    mat4x4_perspective(projection,\n                       65.f * (float) M_PI / 180.f,\n                       aspect,\n                       1.f, 50.f);\n    glLoadMatrixf((const GLfloat*) projection);\n\n    // Upper right view (PERSPECTIVE VIEW)\n    glViewport(width / 2, height / 2, width / 2, height / 2);\n    glScissor(width / 2, height / 2, width / 2, height / 2);\n    glMatrixMode(GL_MODELVIEW);\n    {\n        vec3 eye = { 3.f, 1.5f, 3.f };\n        vec3 center = { 0.f, 0.f, 0.f };\n        vec3 up = { 0.f, 1.f, 0.f };\n        mat4x4_look_at( view, eye, center, up );\n    }\n    glLoadMatrixf((const GLfloat*) view);\n\n    // Configure and enable light source 1\n    glLightfv(GL_LIGHT1, GL_POSITION, light_position);\n    glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);\n    glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);\n    glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);\n    glEnable(GL_LIGHT1);\n    glEnable(GL_LIGHTING);\n\n    // Draw scene\n    drawScene();\n\n    // Disable lighting\n    glDisable(GL_LIGHTING);\n\n    // Disable face culling\n    glDisable(GL_CULL_FACE);\n\n    // Disable depth test\n    glDisable(GL_DEPTH_TEST);\n\n    // Disable scissor test\n    glDisable(GL_SCISSOR_TEST);\n\n    // Draw a border around the active view\n    if (active_view > 0 && active_view != 2)\n    {\n        glViewport(0, 0, width, height);\n\n        glMatrixMode(GL_PROJECTION);\n        glLoadIdentity();\n        glOrtho(0.0, 2.0, 0.0, 2.0, 0.0, 1.0);\n\n        glMatrixMode(GL_MODELVIEW);\n        glLoadIdentity();\n        glTranslatef((GLfloat) ((active_view - 1) & 1), (GLfloat) (1 - (active_view - 1) / 2), 0.0f);\n\n        glColor3f(1.0f, 1.0f, 0.6f);\n\n        glBegin(GL_LINE_STRIP);\n        glVertex2i(0, 0);\n        glVertex2i(1, 0);\n        glVertex2i(1, 1);\n        glVertex2i(0, 1);\n        glVertex2i(0, 0);\n        glEnd();\n    }\n}\n\n\n//========================================================================\n// Framebuffer size callback function\n//========================================================================\n\nstatic void framebufferSizeFun(GLFWwindow* window, int w, int h)\n{\n    width  = w;\n    height = h > 0 ? h : 1;\n    do_redraw = 1;\n}\n\n\n//========================================================================\n// Window refresh callback function\n//========================================================================\n\nstatic void windowRefreshFun(GLFWwindow* window)\n{\n    drawAllViews();\n    glfwSwapBuffers(window);\n    do_redraw = 0;\n}\n\n\n//========================================================================\n// Mouse position callback function\n//========================================================================\n\nstatic void cursorPosFun(GLFWwindow* window, double x, double y)\n{\n    int wnd_width, wnd_height, fb_width, fb_height;\n    double scale;\n\n    glfwGetWindowSize(window, &wnd_width, &wnd_height);\n    glfwGetFramebufferSize(window, &fb_width, &fb_height);\n\n    scale = (double) fb_width / (double) wnd_width;\n\n    x *= scale;\n    y *= scale;\n\n    // Depending on which view was selected, rotate around different axes\n    switch (active_view)\n    {\n        case 1:\n            rot_x += (int) (y - ypos);\n            rot_z += (int) (x - xpos);\n            do_redraw = 1;\n            break;\n        case 3:\n            rot_x += (int) (y - ypos);\n            rot_y += (int) (x - xpos);\n            do_redraw = 1;\n            break;\n        case 4:\n            rot_y += (int) (x - xpos);\n            rot_z += (int) (y - ypos);\n            do_redraw = 1;\n            break;\n        default:\n            // Do nothing for perspective view, or if no view is selected\n            break;\n    }\n\n    // Remember cursor position\n    xpos = x;\n    ypos = y;\n}\n\n\n//========================================================================\n// Mouse button callback function\n//========================================================================\n\nstatic void mouseButtonFun(GLFWwindow* window, int button, int action, int mods)\n{\n    if ((button == GLFW_MOUSE_BUTTON_LEFT) && action == GLFW_PRESS)\n    {\n        // Detect which of the four views was clicked\n        active_view = 1;\n        if (xpos >= width / 2)\n            active_view += 1;\n        if (ypos >= height / 2)\n            active_view += 2;\n    }\n    else if (button == GLFW_MOUSE_BUTTON_LEFT)\n    {\n        // Deselect any previously selected view\n        active_view = 0;\n    }\n\n    do_redraw = 1;\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\n\n//========================================================================\n// main\n//========================================================================\n\nint main(void)\n{\n    GLFWwindow* window;\n\n    // Initialise GLFW\n    if (!glfwInit())\n    {\n        fprintf(stderr, \"Failed to initialize GLFW\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    glfwWindowHint(GLFW_SAMPLES, 4);\n\n    // Open OpenGL window\n    window = glfwCreateWindow(500, 500, \"Split view demo\", NULL, NULL);\n    if (!window)\n    {\n        fprintf(stderr, \"Failed to open GLFW window\\n\");\n\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    // Set callback functions\n    glfwSetFramebufferSizeCallback(window, framebufferSizeFun);\n    glfwSetWindowRefreshCallback(window, windowRefreshFun);\n    glfwSetCursorPosCallback(window, cursorPosFun);\n    glfwSetMouseButtonCallback(window, mouseButtonFun);\n    glfwSetKeyCallback(window, key_callback);\n\n    // Enable vsync\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    if (GLAD_GL_ARB_multisample || GLAD_GL_VERSION_1_3)\n        glEnable(GL_MULTISAMPLE_ARB);\n\n    glfwGetFramebufferSize(window, &width, &height);\n    framebufferSizeFun(window, width, height);\n\n    // Main loop\n    for (;;)\n    {\n        // Only redraw if we need to\n        if (do_redraw)\n            windowRefreshFun(window);\n\n        // Wait for new events\n        glfwWaitEvents();\n\n        // Check if the window should be closed\n        if (glfwWindowShouldClose(window))\n            break;\n    }\n\n    // Close OpenGL window and terminate GLFW\n    glfwTerminate();\n\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/examples/wave.c",
    "content": "/*****************************************************************************\n * Wave Simulation in OpenGL\n * (C) 2002 Jakob Thomsen\n * http://home.in.tum.de/~thomsen\n * Modified for GLFW by Sylvain Hellegouarch - sh@programmationworld.com\n * Modified for variable frame rate by Marcus Geelnard\n * 2003-Jan-31: Minor cleanups and speedups / MG\n * 2010-10-24: Formatting and cleanup - Camilla Löwy\n *****************************************************************************/\n\n#if defined(_MSC_VER)\n // Make MS math.h define M_PI\n #define _USE_MATH_DEFINES\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <linmath.h>\n\n// Maximum delta T to allow for differential calculations\n#define MAX_DELTA_T 0.01\n\n// Animation speed (10.0 looks good)\n#define ANIMATION_SPEED 10.0\n\nGLfloat alpha = 210.f, beta = -70.f;\nGLfloat zoom = 2.f;\n\ndouble cursorX;\ndouble cursorY;\n\nstruct Vertex\n{\n    GLfloat x, y, z;\n    GLfloat r, g, b;\n};\n\n#define GRIDW 50\n#define GRIDH 50\n#define VERTEXNUM (GRIDW*GRIDH)\n\n#define QUADW (GRIDW - 1)\n#define QUADH (GRIDH - 1)\n#define QUADNUM (QUADW*QUADH)\n\nGLuint quad[4 * QUADNUM];\nstruct Vertex vertex[VERTEXNUM];\n\n/* The grid will look like this:\n *\n *      3   4   5\n *      *---*---*\n *      |   |   |\n *      | 0 | 1 |\n *      |   |   |\n *      *---*---*\n *      0   1   2\n */\n\n//========================================================================\n// Initialize grid geometry\n//========================================================================\n\nvoid init_vertices(void)\n{\n    int x, y, p;\n\n    // Place the vertices in a grid\n    for (y = 0;  y < GRIDH;  y++)\n    {\n        for (x = 0;  x < GRIDW;  x++)\n        {\n            p = y * GRIDW + x;\n\n            vertex[p].x = (GLfloat) (x - GRIDW / 2) / (GLfloat) (GRIDW / 2);\n            vertex[p].y = (GLfloat) (y - GRIDH / 2) / (GLfloat) (GRIDH / 2);\n            vertex[p].z = 0;\n\n            if ((x % 4 < 2) ^ (y % 4 < 2))\n                vertex[p].r = 0.0;\n            else\n                vertex[p].r = 1.0;\n\n            vertex[p].g = (GLfloat) y / (GLfloat) GRIDH;\n            vertex[p].b = 1.f - ((GLfloat) x / (GLfloat) GRIDW + (GLfloat) y / (GLfloat) GRIDH) / 2.f;\n        }\n    }\n\n    for (y = 0;  y < QUADH;  y++)\n    {\n        for (x = 0;  x < QUADW;  x++)\n        {\n            p = 4 * (y * QUADW + x);\n\n            quad[p + 0] = y       * GRIDW + x;     // Some point\n            quad[p + 1] = y       * GRIDW + x + 1; // Neighbor at the right side\n            quad[p + 2] = (y + 1) * GRIDW + x + 1; // Upper right neighbor\n            quad[p + 3] = (y + 1) * GRIDW + x;     // Upper neighbor\n        }\n    }\n}\n\ndouble dt;\ndouble p[GRIDW][GRIDH];\ndouble vx[GRIDW][GRIDH], vy[GRIDW][GRIDH];\ndouble ax[GRIDW][GRIDH], ay[GRIDW][GRIDH];\n\n//========================================================================\n// Initialize grid\n//========================================================================\n\nvoid init_grid(void)\n{\n    int x, y;\n    double dx, dy, d;\n\n    for (y = 0; y < GRIDH;  y++)\n    {\n        for (x = 0; x < GRIDW;  x++)\n        {\n            dx = (double) (x - GRIDW / 2);\n            dy = (double) (y - GRIDH / 2);\n            d = sqrt(dx * dx + dy * dy);\n            if (d < 0.1 * (double) (GRIDW / 2))\n            {\n                d = d * 10.0;\n                p[x][y] = -cos(d * (M_PI / (double)(GRIDW * 4))) * 100.0;\n            }\n            else\n                p[x][y] = 0.0;\n\n            vx[x][y] = 0.0;\n            vy[x][y] = 0.0;\n        }\n    }\n}\n\n\n//========================================================================\n// Draw scene\n//========================================================================\n\nvoid draw_scene(GLFWwindow* window)\n{\n    // Clear the color and depth buffers\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    // We don't want to modify the projection matrix\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n\n    // Move back\n    glTranslatef(0.0, 0.0, -zoom);\n    // Rotate the view\n    glRotatef(beta, 1.0, 0.0, 0.0);\n    glRotatef(alpha, 0.0, 0.0, 1.0);\n\n    glDrawElements(GL_QUADS, 4 * QUADNUM, GL_UNSIGNED_INT, quad);\n\n    glfwSwapBuffers(window);\n}\n\n\n//========================================================================\n// Initialize Miscellaneous OpenGL state\n//========================================================================\n\nvoid init_opengl(void)\n{\n    // Use Gouraud (smooth) shading\n    glShadeModel(GL_SMOOTH);\n\n    // Switch on the z-buffer\n    glEnable(GL_DEPTH_TEST);\n\n    glEnableClientState(GL_VERTEX_ARRAY);\n    glEnableClientState(GL_COLOR_ARRAY);\n    glVertexPointer(3, GL_FLOAT, sizeof(struct Vertex), vertex);\n    glColorPointer(3, GL_FLOAT, sizeof(struct Vertex), &vertex[0].r); // Pointer to the first color\n\n    glPointSize(2.0);\n\n    // Background color is black\n    glClearColor(0, 0, 0, 0);\n}\n\n\n//========================================================================\n// Modify the height of each vertex according to the pressure\n//========================================================================\n\nvoid adjust_grid(void)\n{\n    int pos;\n    int x, y;\n\n    for (y = 0; y < GRIDH;  y++)\n    {\n        for (x = 0;  x < GRIDW;  x++)\n        {\n            pos = y * GRIDW + x;\n            vertex[pos].z = (float) (p[x][y] * (1.0 / 50.0));\n        }\n    }\n}\n\n\n//========================================================================\n// Calculate wave propagation\n//========================================================================\n\nvoid calc_grid(void)\n{\n    int x, y, x2, y2;\n    double time_step = dt * ANIMATION_SPEED;\n\n    // Compute accelerations\n    for (x = 0;  x < GRIDW;  x++)\n    {\n        x2 = (x + 1) % GRIDW;\n        for(y = 0; y < GRIDH; y++)\n            ax[x][y] = p[x][y] - p[x2][y];\n    }\n\n    for (y = 0;  y < GRIDH;  y++)\n    {\n        y2 = (y + 1) % GRIDH;\n        for(x = 0; x < GRIDW; x++)\n            ay[x][y] = p[x][y] - p[x][y2];\n    }\n\n    // Compute speeds\n    for (x = 0;  x < GRIDW;  x++)\n    {\n        for (y = 0;  y < GRIDH;  y++)\n        {\n            vx[x][y] = vx[x][y] + ax[x][y] * time_step;\n            vy[x][y] = vy[x][y] + ay[x][y] * time_step;\n        }\n    }\n\n    // Compute pressure\n    for (x = 1;  x < GRIDW;  x++)\n    {\n        x2 = x - 1;\n        for (y = 1;  y < GRIDH;  y++)\n        {\n            y2 = y - 1;\n            p[x][y] = p[x][y] + (vx[x2][y] - vx[x][y] + vy[x][y2] - vy[x][y]) * time_step;\n        }\n    }\n}\n\n\n//========================================================================\n// Print errors\n//========================================================================\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\n\n//========================================================================\n// Handle key strokes\n//========================================================================\n\nvoid key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, GLFW_TRUE);\n            break;\n        case GLFW_KEY_SPACE:\n            init_grid();\n            break;\n        case GLFW_KEY_LEFT:\n            alpha += 5;\n            break;\n        case GLFW_KEY_RIGHT:\n            alpha -= 5;\n            break;\n        case GLFW_KEY_UP:\n            beta -= 5;\n            break;\n        case GLFW_KEY_DOWN:\n            beta += 5;\n            break;\n        case GLFW_KEY_PAGE_UP:\n            zoom -= 0.25f;\n            if (zoom < 0.f)\n                zoom = 0.f;\n            break;\n        case GLFW_KEY_PAGE_DOWN:\n            zoom += 0.25f;\n            break;\n        default:\n            break;\n    }\n}\n\n\n//========================================================================\n// Callback function for mouse button events\n//========================================================================\n\nvoid mouse_button_callback(GLFWwindow* window, int button, int action, int mods)\n{\n    if (button != GLFW_MOUSE_BUTTON_LEFT)\n        return;\n\n    if (action == GLFW_PRESS)\n    {\n        glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);\n        glfwGetCursorPos(window, &cursorX, &cursorY);\n    }\n    else\n        glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);\n}\n\n\n//========================================================================\n// Callback function for cursor motion events\n//========================================================================\n\nvoid cursor_position_callback(GLFWwindow* window, double x, double y)\n{\n    if (glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED)\n    {\n        alpha += (GLfloat) (x - cursorX) / 10.f;\n        beta += (GLfloat) (y - cursorY) / 10.f;\n\n        cursorX = x;\n        cursorY = y;\n    }\n}\n\n\n//========================================================================\n// Callback function for scroll events\n//========================================================================\n\nvoid scroll_callback(GLFWwindow* window, double x, double y)\n{\n    zoom += (float) y / 4.f;\n    if (zoom < 0)\n        zoom = 0;\n}\n\n\n//========================================================================\n// Callback function for framebuffer resize events\n//========================================================================\n\nvoid framebuffer_size_callback(GLFWwindow* window, int width, int height)\n{\n    float ratio = 1.f;\n    mat4x4 projection;\n\n    if (height > 0)\n        ratio = (float) width / (float) height;\n\n    // Setup viewport\n    glViewport(0, 0, width, height);\n\n    // Change to the projection matrix and set our viewing volume\n    glMatrixMode(GL_PROJECTION);\n    mat4x4_perspective(projection,\n                       60.f * (float) M_PI / 180.f,\n                       ratio,\n                       1.f, 1024.f);\n    glLoadMatrixf((const GLfloat*) projection);\n}\n\n\n//========================================================================\n// main\n//========================================================================\n\nint main(int argc, char* argv[])\n{\n    GLFWwindow* window;\n    double t, dt_total, t_old;\n    int width, height;\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    window = glfwCreateWindow(640, 480, \"Wave Simulation\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwSetKeyCallback(window, key_callback);\n    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);\n    glfwSetMouseButtonCallback(window, mouse_button_callback);\n    glfwSetCursorPosCallback(window, cursor_position_callback);\n    glfwSetScrollCallback(window, scroll_callback);\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    glfwGetFramebufferSize(window, &width, &height);\n    framebuffer_size_callback(window, width, height);\n\n    // Initialize OpenGL\n    init_opengl();\n\n    // Initialize simulation\n    init_vertices();\n    init_grid();\n    adjust_grid();\n\n    // Initialize timer\n    t_old = glfwGetTime() - 0.01;\n\n    while (!glfwWindowShouldClose(window))\n    {\n        t = glfwGetTime();\n        dt_total = t - t_old;\n        t_old = t;\n\n        // Safety - iterate if dt_total is too large\n        while (dt_total > 0.f)\n        {\n            // Select iteration time step\n            dt = dt_total > MAX_DELTA_T ? MAX_DELTA_T : dt_total;\n            dt_total -= dt;\n\n            // Calculate wave propagation\n            calc_grid();\n        }\n\n        // Compute height of each vertex\n        adjust_grid();\n\n        // Draw wave grid to OpenGL display\n        draw_scene(window);\n\n        glfwPollEvents();\n    }\n\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/include/GLFW/glfw3.h",
    "content": "/*************************************************************************\n * GLFW 3.3 - www.glfw.org\n * A library for OpenGL, window and input\n *------------------------------------------------------------------------\n * Copyright (c) 2002-2006 Marcus Geelnard\n * Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would\n *    be appreciated but is not required.\n *\n * 2. Altered source versions must be plainly marked as such, and must not\n *    be misrepresented as being the original software.\n *\n * 3. This notice may not be removed or altered from any source\n *    distribution.\n *\n *************************************************************************/\n\n#ifndef _glfw3_h_\n#define _glfw3_h_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/*************************************************************************\n * Doxygen documentation\n *************************************************************************/\n\n/*! @file glfw3.h\n *  @brief The header of the GLFW 3 API.\n *\n *  This is the header file of the GLFW 3 API.  It defines all its types and\n *  declares all its functions.\n *\n *  For more information about how to use this file, see @ref build_include.\n */\n/*! @defgroup context Context reference\n *  @brief Functions and types related to OpenGL and OpenGL ES contexts.\n *\n *  This is the reference documentation for OpenGL and OpenGL ES context related\n *  functions.  For more task-oriented information, see the @ref context_guide.\n */\n/*! @defgroup vulkan Vulkan reference\n *  @brief Functions and types related to Vulkan.\n *\n *  This is the reference documentation for Vulkan related functions and types.\n *  For more task-oriented information, see the @ref vulkan_guide.\n */\n/*! @defgroup init Initialization, version and error reference\n *  @brief Functions and types related to initialization and error handling.\n *\n *  This is the reference documentation for initialization and termination of\n *  the library, version management and error handling.  For more task-oriented\n *  information, see the @ref intro_guide.\n */\n/*! @defgroup input Input reference\n *  @brief Functions and types related to input handling.\n *\n *  This is the reference documentation for input related functions and types.\n *  For more task-oriented information, see the @ref input_guide.\n */\n/*! @defgroup monitor Monitor reference\n *  @brief Functions and types related to monitors.\n *\n *  This is the reference documentation for monitor related functions and types.\n *  For more task-oriented information, see the @ref monitor_guide.\n */\n/*! @defgroup window Window reference\n *  @brief Functions and types related to windows.\n *\n *  This is the reference documentation for window related functions and types,\n *  including creation, deletion and event polling.  For more task-oriented\n *  information, see the @ref window_guide.\n */\n\n\n/*************************************************************************\n * Compiler- and platform-specific preprocessor work\n *************************************************************************/\n\n/* If we are we on Windows, we want a single define for it.\n */\n#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__))\n #define _WIN32\n#endif /* _WIN32 */\n\n/* It is customary to use APIENTRY for OpenGL function pointer declarations on\n * all platforms.  Additionally, the Windows OpenGL header needs APIENTRY.\n */\n#ifndef APIENTRY\n #ifdef _WIN32\n  #define APIENTRY __stdcall\n #else\n  #define APIENTRY\n #endif\n #define GLFW_APIENTRY_DEFINED\n#endif /* APIENTRY */\n\n/* Some Windows OpenGL headers need this.\n */\n#if !defined(WINGDIAPI) && defined(_WIN32)\n #define WINGDIAPI __declspec(dllimport)\n #define GLFW_WINGDIAPI_DEFINED\n#endif /* WINGDIAPI */\n\n/* Some Windows GLU headers need this.\n */\n#if !defined(CALLBACK) && defined(_WIN32)\n #define CALLBACK __stdcall\n #define GLFW_CALLBACK_DEFINED\n#endif /* CALLBACK */\n\n/* Include because most Windows GLU headers need wchar_t and\n * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h.\n * Include it unconditionally to avoid surprising side-effects.\n */\n#include <stddef.h>\n\n/* Include because it is needed by Vulkan and related functions.\n * Include it unconditionally to avoid surprising side-effects.\n */\n#include <stdint.h>\n\n/* Include the chosen OpenGL or OpenGL ES headers.\n */\n#if defined(GLFW_INCLUDE_ES1)\n\n #include <GLES/gl.h>\n #if defined(GLFW_INCLUDE_GLEXT)\n  #include <GLES/glext.h>\n #endif\n\n#elif defined(GLFW_INCLUDE_ES2)\n\n #include <GLES2/gl2.h>\n #if defined(GLFW_INCLUDE_GLEXT)\n  #include <GLES2/gl2ext.h>\n #endif\n\n#elif defined(GLFW_INCLUDE_ES3)\n\n #include <GLES3/gl3.h>\n #if defined(GLFW_INCLUDE_GLEXT)\n  #include <GLES2/gl2ext.h>\n #endif\n\n#elif defined(GLFW_INCLUDE_ES31)\n\n #include <GLES3/gl31.h>\n #if defined(GLFW_INCLUDE_GLEXT)\n  #include <GLES2/gl2ext.h>\n #endif\n\n#elif defined(GLFW_INCLUDE_ES32)\n\n #include <GLES3/gl32.h>\n #if defined(GLFW_INCLUDE_GLEXT)\n  #include <GLES2/gl2ext.h>\n #endif\n\n#elif defined(GLFW_INCLUDE_GLCOREARB)\n\n #if defined(__APPLE__)\n\n  #include <OpenGL/gl3.h>\n  #if defined(GLFW_INCLUDE_GLEXT)\n   #include <OpenGL/gl3ext.h>\n  #endif /*GLFW_INCLUDE_GLEXT*/\n\n #else /*__APPLE__*/\n\n  #include <GL/glcorearb.h>\n\n #endif /*__APPLE__*/\n\n#elif !defined(GLFW_INCLUDE_NONE)\n\n #if defined(__APPLE__)\n\n  #if !defined(GLFW_INCLUDE_GLEXT)\n   #define GL_GLEXT_LEGACY\n  #endif\n  #include <OpenGL/gl.h>\n  #if defined(GLFW_INCLUDE_GLU)\n   #include <OpenGL/glu.h>\n  #endif\n\n #else /*__APPLE__*/\n\n  #include <GL/gl.h>\n  #if defined(GLFW_INCLUDE_GLEXT)\n   #include <GL/glext.h>\n  #endif\n  #if defined(GLFW_INCLUDE_GLU)\n   #include <GL/glu.h>\n  #endif\n\n #endif /*__APPLE__*/\n\n#endif /* OpenGL and OpenGL ES headers */\n\n#if defined(GLFW_INCLUDE_VULKAN)\n  #include <vulkan/vulkan.h>\n#endif /* Vulkan header */\n\n#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL)\n /* GLFW_DLL must be defined by applications that are linking against the DLL\n  * version of the GLFW library.  _GLFW_BUILD_DLL is defined by the GLFW\n  * configuration header when compiling the DLL version of the library.\n  */\n #error \"You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined\"\n#endif\n\n/* GLFWAPI is used to declare public API functions for export\n * from the DLL / shared library / dynamic library.\n */\n#if defined(_WIN32) && defined(_GLFW_BUILD_DLL)\n /* We are building GLFW as a Win32 DLL */\n #define GLFWAPI __declspec(dllexport)\n#elif defined(_WIN32) && defined(GLFW_DLL)\n /* We are calling GLFW as a Win32 DLL */\n #define GLFWAPI __declspec(dllimport)\n#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL)\n /* We are building GLFW as a shared / dynamic library */\n #define GLFWAPI __attribute__((visibility(\"default\")))\n#else\n /* We are building or calling GLFW as a static library */\n #define GLFWAPI\n#endif\n\n\n/*************************************************************************\n * GLFW API tokens\n *************************************************************************/\n\n/*! @name GLFW version macros\n *  @{ */\n/*! @brief The major version number of the GLFW library.\n *\n *  This is incremented when the API is changed in non-compatible ways.\n *  @ingroup init\n */\n#define GLFW_VERSION_MAJOR          3\n/*! @brief The minor version number of the GLFW library.\n *\n *  This is incremented when features are added to the API but it remains\n *  backward-compatible.\n *  @ingroup init\n */\n#define GLFW_VERSION_MINOR          3\n/*! @brief The revision number of the GLFW library.\n *\n *  This is incremented when a bug fix release is made that does not contain any\n *  API changes.\n *  @ingroup init\n */\n#define GLFW_VERSION_REVISION       0\n/*! @} */\n\n/*! @name Boolean values\n *  @{ */\n/*! @brief One.\n *\n *  One.  Seriously.  You don't _need_ to use this symbol in your code.  It's\n *  semantic sugar for the number 1.  You can also use `1` or `true` or `_True`\n *  or `GL_TRUE` or whatever you want.\n */\n#define GLFW_TRUE                   1\n/*! @brief Zero.\n *\n *  Zero.  Seriously.  You don't _need_ to use this symbol in your code.  It's\n *  semantic sugar for the number 0.  You can also use `0` or `false` or\n *  `_False` or `GL_FALSE` or whatever you want.\n */\n#define GLFW_FALSE                  0\n/*! @} */\n\n/*! @name Key and button actions\n *  @{ */\n/*! @brief The key or mouse button was released.\n *\n *  The key or mouse button was released.\n *\n *  @ingroup input\n */\n#define GLFW_RELEASE                0\n/*! @brief The key or mouse button was pressed.\n *\n *  The key or mouse button was pressed.\n *\n *  @ingroup input\n */\n#define GLFW_PRESS                  1\n/*! @brief The key was held down until it repeated.\n *\n *  The key was held down until it repeated.\n *\n *  @ingroup input\n */\n#define GLFW_REPEAT                 2\n/*! @} */\n\n/*! @defgroup hat_state Joystick hat states\n *\n *  See [joystick hat input](@ref joystick_hat) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n#define GLFW_HAT_CENTERED           0\n#define GLFW_HAT_UP                 1\n#define GLFW_HAT_RIGHT              2\n#define GLFW_HAT_DOWN               4\n#define GLFW_HAT_LEFT               8\n#define GLFW_HAT_RIGHT_UP           (GLFW_HAT_RIGHT | GLFW_HAT_UP)\n#define GLFW_HAT_RIGHT_DOWN         (GLFW_HAT_RIGHT | GLFW_HAT_DOWN)\n#define GLFW_HAT_LEFT_UP            (GLFW_HAT_LEFT  | GLFW_HAT_UP)\n#define GLFW_HAT_LEFT_DOWN          (GLFW_HAT_LEFT  | GLFW_HAT_DOWN)\n/*! @} */\n\n/*! @defgroup keys Keyboard keys\n *  @brief Keyboard key IDs.\n *\n *  See [key input](@ref input_key) for how these are used.\n *\n *  These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60),\n *  but re-arranged to map to 7-bit ASCII for printable keys (function keys are\n *  put in the 256+ range).\n *\n *  The naming of the key codes follow these rules:\n *   - The US keyboard layout is used\n *   - Names of printable alpha-numeric characters are used (e.g. \"A\", \"R\",\n *     \"3\", etc.)\n *   - For non-alphanumeric characters, Unicode:ish names are used (e.g.\n *     \"COMMA\", \"LEFT_SQUARE_BRACKET\", etc.). Note that some names do not\n *     correspond to the Unicode standard (usually for brevity)\n *   - Keys that lack a clear US mapping are named \"WORLD_x\"\n *   - For non-printable keys, custom names are used (e.g. \"F4\",\n *     \"BACKSPACE\", etc.)\n *\n *  @ingroup input\n *  @{\n */\n\n/* The unknown key */\n#define GLFW_KEY_UNKNOWN            -1\n\n/* Printable keys */\n#define GLFW_KEY_SPACE              32\n#define GLFW_KEY_APOSTROPHE         39  /* ' */\n#define GLFW_KEY_COMMA              44  /* , */\n#define GLFW_KEY_MINUS              45  /* - */\n#define GLFW_KEY_PERIOD             46  /* . */\n#define GLFW_KEY_SLASH              47  /* / */\n#define GLFW_KEY_0                  48\n#define GLFW_KEY_1                  49\n#define GLFW_KEY_2                  50\n#define GLFW_KEY_3                  51\n#define GLFW_KEY_4                  52\n#define GLFW_KEY_5                  53\n#define GLFW_KEY_6                  54\n#define GLFW_KEY_7                  55\n#define GLFW_KEY_8                  56\n#define GLFW_KEY_9                  57\n#define GLFW_KEY_SEMICOLON          59  /* ; */\n#define GLFW_KEY_EQUAL              61  /* = */\n#define GLFW_KEY_A                  65\n#define GLFW_KEY_B                  66\n#define GLFW_KEY_C                  67\n#define GLFW_KEY_D                  68\n#define GLFW_KEY_E                  69\n#define GLFW_KEY_F                  70\n#define GLFW_KEY_G                  71\n#define GLFW_KEY_H                  72\n#define GLFW_KEY_I                  73\n#define GLFW_KEY_J                  74\n#define GLFW_KEY_K                  75\n#define GLFW_KEY_L                  76\n#define GLFW_KEY_M                  77\n#define GLFW_KEY_N                  78\n#define GLFW_KEY_O                  79\n#define GLFW_KEY_P                  80\n#define GLFW_KEY_Q                  81\n#define GLFW_KEY_R                  82\n#define GLFW_KEY_S                  83\n#define GLFW_KEY_T                  84\n#define GLFW_KEY_U                  85\n#define GLFW_KEY_V                  86\n#define GLFW_KEY_W                  87\n#define GLFW_KEY_X                  88\n#define GLFW_KEY_Y                  89\n#define GLFW_KEY_Z                  90\n#define GLFW_KEY_LEFT_BRACKET       91  /* [ */\n#define GLFW_KEY_BACKSLASH          92  /* \\ */\n#define GLFW_KEY_RIGHT_BRACKET      93  /* ] */\n#define GLFW_KEY_GRAVE_ACCENT       96  /* ` */\n#define GLFW_KEY_WORLD_1            161 /* non-US #1 */\n#define GLFW_KEY_WORLD_2            162 /* non-US #2 */\n\n/* Function keys */\n#define GLFW_KEY_ESCAPE             256\n#define GLFW_KEY_ENTER              257\n#define GLFW_KEY_TAB                258\n#define GLFW_KEY_BACKSPACE          259\n#define GLFW_KEY_INSERT             260\n#define GLFW_KEY_DELETE             261\n#define GLFW_KEY_RIGHT              262\n#define GLFW_KEY_LEFT               263\n#define GLFW_KEY_DOWN               264\n#define GLFW_KEY_UP                 265\n#define GLFW_KEY_PAGE_UP            266\n#define GLFW_KEY_PAGE_DOWN          267\n#define GLFW_KEY_HOME               268\n#define GLFW_KEY_END                269\n#define GLFW_KEY_CAPS_LOCK          280\n#define GLFW_KEY_SCROLL_LOCK        281\n#define GLFW_KEY_NUM_LOCK           282\n#define GLFW_KEY_PRINT_SCREEN       283\n#define GLFW_KEY_PAUSE              284\n#define GLFW_KEY_F1                 290\n#define GLFW_KEY_F2                 291\n#define GLFW_KEY_F3                 292\n#define GLFW_KEY_F4                 293\n#define GLFW_KEY_F5                 294\n#define GLFW_KEY_F6                 295\n#define GLFW_KEY_F7                 296\n#define GLFW_KEY_F8                 297\n#define GLFW_KEY_F9                 298\n#define GLFW_KEY_F10                299\n#define GLFW_KEY_F11                300\n#define GLFW_KEY_F12                301\n#define GLFW_KEY_F13                302\n#define GLFW_KEY_F14                303\n#define GLFW_KEY_F15                304\n#define GLFW_KEY_F16                305\n#define GLFW_KEY_F17                306\n#define GLFW_KEY_F18                307\n#define GLFW_KEY_F19                308\n#define GLFW_KEY_F20                309\n#define GLFW_KEY_F21                310\n#define GLFW_KEY_F22                311\n#define GLFW_KEY_F23                312\n#define GLFW_KEY_F24                313\n#define GLFW_KEY_F25                314\n#define GLFW_KEY_KP_0               320\n#define GLFW_KEY_KP_1               321\n#define GLFW_KEY_KP_2               322\n#define GLFW_KEY_KP_3               323\n#define GLFW_KEY_KP_4               324\n#define GLFW_KEY_KP_5               325\n#define GLFW_KEY_KP_6               326\n#define GLFW_KEY_KP_7               327\n#define GLFW_KEY_KP_8               328\n#define GLFW_KEY_KP_9               329\n#define GLFW_KEY_KP_DECIMAL         330\n#define GLFW_KEY_KP_DIVIDE          331\n#define GLFW_KEY_KP_MULTIPLY        332\n#define GLFW_KEY_KP_SUBTRACT        333\n#define GLFW_KEY_KP_ADD             334\n#define GLFW_KEY_KP_ENTER           335\n#define GLFW_KEY_KP_EQUAL           336\n#define GLFW_KEY_LEFT_SHIFT         340\n#define GLFW_KEY_LEFT_CONTROL       341\n#define GLFW_KEY_LEFT_ALT           342\n#define GLFW_KEY_LEFT_SUPER         343\n#define GLFW_KEY_RIGHT_SHIFT        344\n#define GLFW_KEY_RIGHT_CONTROL      345\n#define GLFW_KEY_RIGHT_ALT          346\n#define GLFW_KEY_RIGHT_SUPER        347\n#define GLFW_KEY_MENU               348\n\n#define GLFW_KEY_LAST               GLFW_KEY_MENU\n\n/*! @} */\n\n/*! @defgroup mods Modifier key flags\n *  @brief Modifier key flags.\n *\n *  See [key input](@ref input_key) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n\n/*! @brief If this bit is set one or more Shift keys were held down.\n */\n#define GLFW_MOD_SHIFT           0x0001\n/*! @brief If this bit is set one or more Control keys were held down.\n */\n#define GLFW_MOD_CONTROL         0x0002\n/*! @brief If this bit is set one or more Alt keys were held down.\n */\n#define GLFW_MOD_ALT             0x0004\n/*! @brief If this bit is set one or more Super keys were held down.\n */\n#define GLFW_MOD_SUPER           0x0008\n\n/*! @} */\n\n/*! @defgroup buttons Mouse buttons\n *  @brief Mouse button IDs.\n *\n *  See [mouse button input](@ref input_mouse_button) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n#define GLFW_MOUSE_BUTTON_1         0\n#define GLFW_MOUSE_BUTTON_2         1\n#define GLFW_MOUSE_BUTTON_3         2\n#define GLFW_MOUSE_BUTTON_4         3\n#define GLFW_MOUSE_BUTTON_5         4\n#define GLFW_MOUSE_BUTTON_6         5\n#define GLFW_MOUSE_BUTTON_7         6\n#define GLFW_MOUSE_BUTTON_8         7\n#define GLFW_MOUSE_BUTTON_LAST      GLFW_MOUSE_BUTTON_8\n#define GLFW_MOUSE_BUTTON_LEFT      GLFW_MOUSE_BUTTON_1\n#define GLFW_MOUSE_BUTTON_RIGHT     GLFW_MOUSE_BUTTON_2\n#define GLFW_MOUSE_BUTTON_MIDDLE    GLFW_MOUSE_BUTTON_3\n/*! @} */\n\n/*! @defgroup joysticks Joysticks\n *  @brief Joystick IDs.\n *\n *  See [joystick input](@ref joystick) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n#define GLFW_JOYSTICK_1             0\n#define GLFW_JOYSTICK_2             1\n#define GLFW_JOYSTICK_3             2\n#define GLFW_JOYSTICK_4             3\n#define GLFW_JOYSTICK_5             4\n#define GLFW_JOYSTICK_6             5\n#define GLFW_JOYSTICK_7             6\n#define GLFW_JOYSTICK_8             7\n#define GLFW_JOYSTICK_9             8\n#define GLFW_JOYSTICK_10            9\n#define GLFW_JOYSTICK_11            10\n#define GLFW_JOYSTICK_12            11\n#define GLFW_JOYSTICK_13            12\n#define GLFW_JOYSTICK_14            13\n#define GLFW_JOYSTICK_15            14\n#define GLFW_JOYSTICK_16            15\n#define GLFW_JOYSTICK_LAST          GLFW_JOYSTICK_16\n/*! @} */\n\n/*! @defgroup gamepad_buttons Gamepad buttons\n *  @brief Gamepad buttons.\n *\n *  See @ref gamepad for how these are used.\n *\n *  @ingroup input\n *  @{ */\n#define GLFW_GAMEPAD_BUTTON_A               0\n#define GLFW_GAMEPAD_BUTTON_B               1\n#define GLFW_GAMEPAD_BUTTON_X               2\n#define GLFW_GAMEPAD_BUTTON_Y               3\n#define GLFW_GAMEPAD_BUTTON_LEFT_BUMPER     4\n#define GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER    5\n#define GLFW_GAMEPAD_BUTTON_BACK            6\n#define GLFW_GAMEPAD_BUTTON_START           7\n#define GLFW_GAMEPAD_BUTTON_GUIDE           8\n#define GLFW_GAMEPAD_BUTTON_LEFT_THUMB      9\n#define GLFW_GAMEPAD_BUTTON_RIGHT_THUMB     10\n#define GLFW_GAMEPAD_BUTTON_DPAD_UP         11\n#define GLFW_GAMEPAD_BUTTON_DPAD_RIGHT      12\n#define GLFW_GAMEPAD_BUTTON_DPAD_DOWN       13\n#define GLFW_GAMEPAD_BUTTON_DPAD_LEFT       14\n#define GLFW_GAMEPAD_BUTTON_LAST            GLFW_GAMEPAD_BUTTON_DPAD_LEFT\n\n#define GLFW_GAMEPAD_BUTTON_CROSS       GLFW_GAMEPAD_BUTTON_A\n#define GLFW_GAMEPAD_BUTTON_CIRCLE      GLFW_GAMEPAD_BUTTON_B\n#define GLFW_GAMEPAD_BUTTON_SQUARE      GLFW_GAMEPAD_BUTTON_X\n#define GLFW_GAMEPAD_BUTTON_TRIANGLE    GLFW_GAMEPAD_BUTTON_Y\n/*! @} */\n\n/*! @defgroup gamepad_axes Gamepad axes\n *  @brief Gamepad axes.\n *\n *  See @ref gamepad for how these are used.\n *\n *  @ingroup input\n *  @{ */\n#define GLFW_GAMEPAD_AXIS_LEFT_X        0\n#define GLFW_GAMEPAD_AXIS_LEFT_Y        1\n#define GLFW_GAMEPAD_AXIS_RIGHT_X       2\n#define GLFW_GAMEPAD_AXIS_RIGHT_Y       3\n#define GLFW_GAMEPAD_AXIS_LEFT_TRIGGER  4\n#define GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER 5\n#define GLFW_GAMEPAD_AXIS_LAST          GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER\n/*! @} */\n\n/*! @defgroup errors Error codes\n *  @brief Error codes.\n *\n *  See [error handling](@ref error_handling) for how these are used.\n *\n *  @ingroup init\n *  @{ */\n/*! @brief No error has occurred.\n *\n *  No error has occurred.\n *\n *  @analysis Yay.\n */\n#define GLFW_NO_ERROR               0\n/*! @brief GLFW has not been initialized.\n *\n *  This occurs if a GLFW function was called that must not be called unless the\n *  library is [initialized](@ref intro_init).\n *\n *  @analysis Application programmer error.  Initialize GLFW before calling any\n *  function that requires initialization.\n */\n#define GLFW_NOT_INITIALIZED        0x00010001\n/*! @brief No context is current for this thread.\n *\n *  This occurs if a GLFW function was called that needs and operates on the\n *  current OpenGL or OpenGL ES context but no context is current on the calling\n *  thread.  One such function is @ref glfwSwapInterval.\n *\n *  @analysis Application programmer error.  Ensure a context is current before\n *  calling functions that require a current context.\n */\n#define GLFW_NO_CURRENT_CONTEXT     0x00010002\n/*! @brief One of the arguments to the function was an invalid enum value.\n *\n *  One of the arguments to the function was an invalid enum value, for example\n *  requesting @ref GLFW_RED_BITS with @ref glfwGetWindowAttrib.\n *\n *  @analysis Application programmer error.  Fix the offending call.\n */\n#define GLFW_INVALID_ENUM           0x00010003\n/*! @brief One of the arguments to the function was an invalid value.\n *\n *  One of the arguments to the function was an invalid value, for example\n *  requesting a non-existent OpenGL or OpenGL ES version like 2.7.\n *\n *  Requesting a valid but unavailable OpenGL or OpenGL ES version will instead\n *  result in a @ref GLFW_VERSION_UNAVAILABLE error.\n *\n *  @analysis Application programmer error.  Fix the offending call.\n */\n#define GLFW_INVALID_VALUE          0x00010004\n/*! @brief A memory allocation failed.\n *\n *  A memory allocation failed.\n *\n *  @analysis A bug in GLFW or the underlying operating system.  Report the bug\n *  to our [issue tracker](https://github.com/glfw/glfw/issues).\n */\n#define GLFW_OUT_OF_MEMORY          0x00010005\n/*! @brief GLFW could not find support for the requested API on the system.\n *\n *  GLFW could not find support for the requested API on the system.\n *\n *  @analysis The installed graphics driver does not support the requested\n *  API, or does not support it via the chosen context creation backend.\n *  Below are a few examples.\n *\n *  @par\n *  Some pre-installed Windows graphics drivers do not support OpenGL.  AMD only\n *  supports OpenGL ES via EGL, while Nvidia and Intel only support it via\n *  a WGL or GLX extension.  macOS does not provide OpenGL ES at all.  The Mesa\n *  EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary\n *  driver.  Older graphics drivers do not support Vulkan.\n */\n#define GLFW_API_UNAVAILABLE        0x00010006\n/*! @brief The requested OpenGL or OpenGL ES version is not available.\n *\n *  The requested OpenGL or OpenGL ES version (including any requested context\n *  or framebuffer hints) is not available on this machine.\n *\n *  @analysis The machine does not support your requirements.  If your\n *  application is sufficiently flexible, downgrade your requirements and try\n *  again.  Otherwise, inform the user that their machine does not match your\n *  requirements.\n *\n *  @par\n *  Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0\n *  comes out before the 4.x series gets that far, also fail with this error and\n *  not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions\n *  will exist.\n */\n#define GLFW_VERSION_UNAVAILABLE    0x00010007\n/*! @brief A platform-specific error occurred that does not match any of the\n *  more specific categories.\n *\n *  A platform-specific error occurred that does not match any of the more\n *  specific categories.\n *\n *  @analysis A bug or configuration error in GLFW, the underlying operating\n *  system or its drivers, or a lack of required resources.  Report the issue to\n *  our [issue tracker](https://github.com/glfw/glfw/issues).\n */\n#define GLFW_PLATFORM_ERROR         0x00010008\n/*! @brief The requested format is not supported or available.\n *\n *  If emitted during window creation, the requested pixel format is not\n *  supported.\n *\n *  If emitted when querying the clipboard, the contents of the clipboard could\n *  not be converted to the requested format.\n *\n *  @analysis If emitted during window creation, one or more\n *  [hard constraints](@ref window_hints_hard) did not match any of the\n *  available pixel formats.  If your application is sufficiently flexible,\n *  downgrade your requirements and try again.  Otherwise, inform the user that\n *  their machine does not match your requirements.\n *\n *  @par\n *  If emitted when querying the clipboard, ignore the error or report it to\n *  the user, as appropriate.\n */\n#define GLFW_FORMAT_UNAVAILABLE     0x00010009\n/*! @brief The specified window does not have an OpenGL or OpenGL ES context.\n *\n *  A window that does not have an OpenGL or OpenGL ES context was passed to\n *  a function that requires it to have one.\n *\n *  @analysis Application programmer error.  Fix the offending call.\n */\n#define GLFW_NO_WINDOW_CONTEXT      0x0001000A\n/*! @} */\n\n/*! @addtogroup window\n *  @{ */\n/*! @brief Input focus window hint and attribute\n *\n *  Input focus [window hint](@ref GLFW_FOCUSED_hint) or\n *  [window attribute](@ref GLFW_FOCUSED_attrib).\n */\n#define GLFW_FOCUSED                0x00020001\n/*! @brief Window iconification window attribute\n *\n *  Window iconification [window attribute](@ref GLFW_ICONIFIED_attrib).\n */\n#define GLFW_ICONIFIED              0x00020002\n/*! @brief Window resize-ability window hint and attribute\n *\n *  Window resize-ability [window hint](@ref GLFW_RESIZABLE_hint) and\n *  [window attribute](@ref GLFW_RESIZABLE_attrib).\n */\n#define GLFW_RESIZABLE              0x00020003\n/*! @brief Window visibility window hint and attribute\n *\n *  Window visibility [window hint](@ref GLFW_VISIBLE_hint) and\n *  [window attribute](@ref GLFW_VISIBLE_attrib).\n */\n#define GLFW_VISIBLE                0x00020004\n/*! @brief Window decoration window hint and attribute\n *\n *  Window decoration [window hint](@ref GLFW_DECORATED_hint) and\n *  [window attribute](@ref GLFW_DECORATED_attrib).\n */\n#define GLFW_DECORATED              0x00020005\n/*! @brief Window auto-iconification window hint and attribute\n *\n *  Window auto-iconification [window hint](@ref GLFW_AUTO_ICONIFY_hint) and\n *  [window attribute](@ref GLFW_AUTO_ICONIFY_attrib).\n */\n#define GLFW_AUTO_ICONIFY           0x00020006\n/*! @brief Window decoration window hint and attribute\n *\n *  Window decoration [window hint](@ref GLFW_FLOATING_hint) and\n *  [window attribute](@ref GLFW_FLOATING_attrib).\n */\n#define GLFW_FLOATING               0x00020007\n/*! @brief Window maximization window hint and attribute\n *\n *  Window maximization [window hint](@ref GLFW_MAXIMIZED_hint) and\n *  [window attribute](@ref GLFW_MAXIMIZED_attrib).\n */\n#define GLFW_MAXIMIZED              0x00020008\n/*! @brief Cursor centering window hint\n *\n *  Cursor centering [window hint](@ref GLFW_CENTER_CURSOR_hint).\n */\n#define GLFW_CENTER_CURSOR          0x00020009\n/*! @brief Window framebuffer transparency hint and attribute\n *\n *  Window framebuffer transparency [window hint](@ref GLFW_TRANSPARENT_hint)\n *  and [window attribute](@ref GLFW_TRANSPARENT_attrib).\n */\n#define GLFW_TRANSPARENT            0x0002000A\n\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_RED_BITS).\n */\n#define GLFW_RED_BITS               0x00021001\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_GREEN_BITS).\n */\n#define GLFW_GREEN_BITS             0x00021002\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_BLUE_BITS).\n */\n#define GLFW_BLUE_BITS              0x00021003\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_ALPHA_BITS).\n */\n#define GLFW_ALPHA_BITS             0x00021004\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_DEPTH_BITS).\n */\n#define GLFW_DEPTH_BITS             0x00021005\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_STENCIL_BITS).\n */\n#define GLFW_STENCIL_BITS           0x00021006\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_ACCUM_RED_BITS).\n */\n#define GLFW_ACCUM_RED_BITS         0x00021007\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_ACCUM_GREEN_BITS).\n */\n#define GLFW_ACCUM_GREEN_BITS       0x00021008\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_ACCUM_BLUE_BITS).\n */\n#define GLFW_ACCUM_BLUE_BITS        0x00021009\n/*! @brief Framebuffer bit depth hint.\n *\n *  Framebuffer bit depth [hint](@ref GLFW_ACCUM_ALPHA_BITS).\n */\n#define GLFW_ACCUM_ALPHA_BITS       0x0002100A\n/*! @brief Framebuffer auxiliary buffer hint.\n *\n *  Framebuffer auxiliary buffer [hint](@ref GLFW_AUX_BUFFERS).\n */\n#define GLFW_AUX_BUFFERS            0x0002100B\n/*! @brief OpenGL stereoscopic rendering hint.\n *\n *  OpenGL stereoscopic rendering [hint](@ref GLFW_STEREO).\n */\n#define GLFW_STEREO                 0x0002100C\n/*! @brief Framebuffer MSAA samples hint.\n *\n *  Framebuffer MSAA samples [hint](@ref GLFW_SAMPLES).\n */\n#define GLFW_SAMPLES                0x0002100D\n/*! @brief Framebuffer sRGB hint.\n *\n *  Framebuffer sRGB [hint](@ref GLFW_SRGB_CAPABLE).\n */\n#define GLFW_SRGB_CAPABLE           0x0002100E\n/*! @brief Monitor refresh rate hint.\n *\n *  Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE).\n */\n#define GLFW_REFRESH_RATE           0x0002100F\n/*! @brief Framebuffer double buffering hint.\n *\n *  Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER).\n */\n#define GLFW_DOUBLEBUFFER           0x00021010\n\n/*! @brief Context client API hint and attribute.\n *\n *  Context client API [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_CLIENT_API             0x00022001\n/*! @brief Context client API major version hint and attribute.\n *\n *  Context client API major version [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_CONTEXT_VERSION_MAJOR  0x00022002\n/*! @brief Context client API minor version hint and attribute.\n *\n *  Context client API minor version [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_CONTEXT_VERSION_MINOR  0x00022003\n/*! @brief Context client API revision number hint and attribute.\n *\n *  Context client API revision number [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_CONTEXT_REVISION       0x00022004\n/*! @brief Context robustness hint and attribute.\n *\n *  Context client API revision number [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_CONTEXT_ROBUSTNESS     0x00022005\n/*! @brief OpenGL forward-compatibility hint and attribute.\n *\n *  OpenGL forward-compatibility [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_OPENGL_FORWARD_COMPAT  0x00022006\n/*! @brief OpenGL debug context hint and attribute.\n *\n *  OpenGL debug context [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_OPENGL_DEBUG_CONTEXT   0x00022007\n/*! @brief OpenGL profile hint and attribute.\n *\n *  OpenGL profile [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_OPENGL_PROFILE         0x00022008\n/*! @brief Context flush-on-release hint and attribute.\n *\n *  Context flush-on-release [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009\n/*! @brief Context error suppression hint and attribute.\n *\n *  Context error suppression [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_CONTEXT_NO_ERROR       0x0002200A\n/*! @brief Context creation API hint and attribute.\n *\n *  Context creation API [hint](@ref GLFW_CLIENT_API_hint) and\n *  [attribute](@ref GLFW_CLIENT_API_attrib).\n */\n#define GLFW_CONTEXT_CREATION_API   0x0002200B\n\n#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001\n#define GLFW_COCOA_FRAME_AUTOSAVE     0x00023002\n#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003\n/*! @} */\n\n#define GLFW_NO_API                          0\n#define GLFW_OPENGL_API             0x00030001\n#define GLFW_OPENGL_ES_API          0x00030002\n\n#define GLFW_NO_ROBUSTNESS                   0\n#define GLFW_NO_RESET_NOTIFICATION  0x00031001\n#define GLFW_LOSE_CONTEXT_ON_RESET  0x00031002\n\n#define GLFW_OPENGL_ANY_PROFILE              0\n#define GLFW_OPENGL_CORE_PROFILE    0x00032001\n#define GLFW_OPENGL_COMPAT_PROFILE  0x00032002\n\n#define GLFW_CURSOR                 0x00033001\n#define GLFW_STICKY_KEYS            0x00033002\n#define GLFW_STICKY_MOUSE_BUTTONS   0x00033003\n\n#define GLFW_CURSOR_NORMAL          0x00034001\n#define GLFW_CURSOR_HIDDEN          0x00034002\n#define GLFW_CURSOR_DISABLED        0x00034003\n\n#define GLFW_ANY_RELEASE_BEHAVIOR            0\n#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001\n#define GLFW_RELEASE_BEHAVIOR_NONE  0x00035002\n\n#define GLFW_NATIVE_CONTEXT_API     0x00036001\n#define GLFW_EGL_CONTEXT_API        0x00036002\n#define GLFW_OSMESA_CONTEXT_API     0x00036003\n\n/*! @defgroup shapes Standard cursor shapes\n *  @brief Standard system cursor shapes.\n *\n *  See [standard cursor creation](@ref cursor_standard) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n\n/*! @brief The regular arrow cursor shape.\n *\n *  The regular arrow cursor.\n */\n#define GLFW_ARROW_CURSOR           0x00036001\n/*! @brief The text input I-beam cursor shape.\n *\n *  The text input I-beam cursor shape.\n */\n#define GLFW_IBEAM_CURSOR           0x00036002\n/*! @brief The crosshair shape.\n *\n *  The crosshair shape.\n */\n#define GLFW_CROSSHAIR_CURSOR       0x00036003\n/*! @brief The hand shape.\n *\n *  The hand shape.\n */\n#define GLFW_HAND_CURSOR            0x00036004\n/*! @brief The horizontal resize arrow shape.\n *\n *  The horizontal resize arrow shape.\n */\n#define GLFW_HRESIZE_CURSOR         0x00036005\n/*! @brief The vertical resize arrow shape.\n *\n *  The vertical resize arrow shape.\n */\n#define GLFW_VRESIZE_CURSOR         0x00036006\n/*! @} */\n\n#define GLFW_CONNECTED              0x00040001\n#define GLFW_DISCONNECTED           0x00040002\n\n/*! @addtogroup init\n *  @{ */\n#define GLFW_JOYSTICK_HAT_BUTTONS   0x00050001\n\n#define GLFW_COCOA_CHDIR_RESOURCES  0x00051001\n#define GLFW_COCOA_MENUBAR          0x00051002\n\n#define GLFW_X11_WM_CLASS_NAME      0x00052001\n#define GLFW_X11_WM_CLASS_CLASS     0x00052002\n/*! @} */\n\n#define GLFW_DONT_CARE              -1\n\n\n/*************************************************************************\n * GLFW API types\n *************************************************************************/\n\n/*! @brief Client API function pointer type.\n *\n *  Generic function pointer used for returning client API function pointers\n *  without forcing a cast from a regular pointer.\n *\n *  @sa @ref context_glext\n *  @sa @ref glfwGetProcAddress\n *\n *  @since Added in version 3.0.\n \n *  @ingroup context\n */\ntypedef void (*GLFWglproc)(void);\n\n/*! @brief Vulkan API function pointer type.\n *\n *  Generic function pointer used for returning Vulkan API function pointers\n *  without forcing a cast from a regular pointer.\n *\n *  @sa @ref vulkan_proc\n *  @sa @ref glfwGetInstanceProcAddress\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\ntypedef void (*GLFWvkproc)(void);\n\n/*! @brief Opaque monitor object.\n *\n *  Opaque monitor object.\n *\n *  @see @ref monitor_object\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\ntypedef struct GLFWmonitor GLFWmonitor;\n\n/*! @brief Opaque window object.\n *\n *  Opaque window object.\n *\n *  @see @ref window_object\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef struct GLFWwindow GLFWwindow;\n\n/*! @brief Opaque cursor object.\n *\n *  Opaque cursor object.\n *\n *  @see @ref cursor_object\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup cursor\n */\ntypedef struct GLFWcursor GLFWcursor;\n\n/*! @brief The function signature for error callbacks.\n *\n *  This is the function signature for error callback functions.\n *\n *  @param[in] error An [error code](@ref errors).\n *  @param[in] description A UTF-8 encoded string describing the error.\n *\n *  @sa @ref error_handling\n *  @sa @ref glfwSetErrorCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup init\n */\ntypedef void (* GLFWerrorfun)(int,const char*);\n\n/*! @brief The function signature for window position callbacks.\n *\n *  This is the function signature for window position callback functions.\n *\n *  @param[in] window The window that was moved.\n *  @param[in] xpos The new x-coordinate, in screen coordinates, of the\n *  upper-left corner of the client area of the window.\n *  @param[in] ypos The new y-coordinate, in screen coordinates, of the\n *  upper-left corner of the client area of the window.\n *\n *  @sa @ref window_pos\n *  @sa @ref glfwSetWindowPosCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowposfun)(GLFWwindow*,int,int);\n\n/*! @brief The function signature for window resize callbacks.\n *\n *  This is the function signature for window size callback functions.\n *\n *  @param[in] window The window that was resized.\n *  @param[in] width The new width, in screen coordinates, of the window.\n *  @param[in] height The new height, in screen coordinates, of the window.\n *\n *  @sa @ref window_size\n *  @sa @ref glfwSetWindowSizeCallback\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int);\n\n/*! @brief The function signature for window close callbacks.\n *\n *  This is the function signature for window close callback functions.\n *\n *  @param[in] window The window that the user attempted to close.\n *\n *  @sa @ref window_close\n *  @sa @ref glfwSetWindowCloseCallback\n *\n *  @since Added in version 2.5.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowclosefun)(GLFWwindow*);\n\n/*! @brief The function signature for window content refresh callbacks.\n *\n *  This is the function signature for window refresh callback functions.\n *\n *  @param[in] window The window whose content needs to be refreshed.\n *\n *  @sa @ref window_refresh\n *  @sa @ref glfwSetWindowRefreshCallback\n *\n *  @since Added in version 2.5.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowrefreshfun)(GLFWwindow*);\n\n/*! @brief The function signature for window focus/defocus callbacks.\n *\n *  This is the function signature for window focus callback functions.\n *\n *  @param[in] window The window that gained or lost input focus.\n *  @param[in] focused `GLFW_TRUE` if the window was given input focus, or\n *  `GLFW_FALSE` if it lost it.\n *\n *  @sa @ref window_focus\n *  @sa @ref glfwSetWindowFocusCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);\n\n/*! @brief The function signature for window iconify/restore callbacks.\n *\n *  This is the function signature for window iconify/restore callback\n *  functions.\n *\n *  @param[in] window The window that was iconified or restored.\n *  @param[in] iconified `GLFW_TRUE` if the window was iconified, or\n *  `GLFW_FALSE` if it was restored.\n *\n *  @sa @ref window_iconify\n *  @sa @ref glfwSetWindowIconifyCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int);\n\n/*! @brief The function signature for window maximize/restore callbacks.\n *\n *  This is the function signature for window maximize/restore callback\n *  functions.\n *\n *  @param[in] window The window that was maximized or restored.\n *  @param[in] iconified `GLFW_TRUE` if the window was maximized, or\n *  `GLFW_FALSE` if it was restored.\n *\n *  @sa @ref window_maximize\n *  @sa glfwSetWindowMaximizeCallback\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowmaximizefun)(GLFWwindow*,int);\n\n/*! @brief The function signature for framebuffer resize callbacks.\n *\n *  This is the function signature for framebuffer resize callback\n *  functions.\n *\n *  @param[in] window The window whose framebuffer was resized.\n *  @param[in] width The new width, in pixels, of the framebuffer.\n *  @param[in] height The new height, in pixels, of the framebuffer.\n *\n *  @sa @ref window_fbsize\n *  @sa @ref glfwSetFramebufferSizeCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int);\n\n/*! @brief The function signature for mouse button callbacks.\n *\n *  This is the function signature for mouse button callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] button The [mouse button](@ref buttons) that was pressed or\n *  released.\n *  @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`.\n *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were\n *  held down.\n *\n *  @sa @ref input_mouse_button\n *  @sa @ref glfwSetMouseButtonCallback\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle and modifier mask parameters.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);\n\n/*! @brief The function signature for cursor position callbacks.\n *\n *  This is the function signature for cursor position callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] xpos The new cursor x-coordinate, relative to the left edge of\n *  the client area.\n *  @param[in] ypos The new cursor y-coordinate, relative to the top edge of the\n *  client area.\n *\n *  @sa @ref cursor_pos\n *  @sa @ref glfwSetCursorPosCallback\n *\n *  @since Added in version 3.0.  Replaces `GLFWmouseposfun`.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWcursorposfun)(GLFWwindow*,double,double);\n\n/*! @brief The function signature for cursor enter/leave callbacks.\n *\n *  This is the function signature for cursor enter/leave callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] entered `GLFW_TRUE` if the cursor entered the window's client\n *  area, or `GLFW_FALSE` if it left it.\n *\n *  @sa @ref cursor_enter\n *  @sa @ref glfwSetCursorEnterCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWcursorenterfun)(GLFWwindow*,int);\n\n/*! @brief The function signature for scroll callbacks.\n *\n *  This is the function signature for scroll callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] xoffset The scroll offset along the x-axis.\n *  @param[in] yoffset The scroll offset along the y-axis.\n *\n *  @sa @ref scrolling\n *  @sa @ref glfwSetScrollCallback\n *\n *  @since Added in version 3.0.  Replaces `GLFWmousewheelfun`.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWscrollfun)(GLFWwindow*,double,double);\n\n/*! @brief The function signature for keyboard key callbacks.\n *\n *  This is the function signature for keyboard key callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] key The [keyboard key](@ref keys) that was pressed or released.\n *  @param[in] scancode The system-specific scancode of the key.\n *  @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`.\n *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were\n *  held down.\n *\n *  @sa @ref input_key\n *  @sa @ref glfwSetKeyCallback\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle, scancode and modifier mask parameters.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);\n\n/*! @brief The function signature for Unicode character callbacks.\n *\n *  This is the function signature for Unicode character callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] codepoint The Unicode code point of the character.\n *\n *  @sa @ref input_char\n *  @sa @ref glfwSetCharCallback\n *\n *  @since Added in version 2.4.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);\n\n/*! @brief The function signature for Unicode character with modifiers\n *  callbacks.\n *\n *  This is the function signature for Unicode character with modifiers callback\n *  functions.  It is called for each input character, regardless of what\n *  modifier keys are held down.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] codepoint The Unicode code point of the character.\n *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were\n *  held down.\n *\n *  @sa @ref input_char\n *  @sa @ref glfwSetCharModsCallback\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);\n\n/*! @brief The function signature for file drop callbacks.\n *\n *  This is the function signature for file drop callbacks.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] count The number of dropped files.\n *  @param[in] paths The UTF-8 encoded file and/or directory path names.\n *\n *  @sa @ref path_drop\n *  @sa @ref glfwSetDropCallback\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWdropfun)(GLFWwindow*,int,const char**);\n\n/*! @brief The function signature for monitor configuration callbacks.\n *\n *  This is the function signature for monitor configuration callback functions.\n *\n *  @param[in] monitor The monitor that was connected or disconnected.\n *  @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.\n *\n *  @sa @ref monitor_event\n *  @sa @ref glfwSetMonitorCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\ntypedef void (* GLFWmonitorfun)(GLFWmonitor*,int);\n\n/*! @brief The function signature for joystick configuration callbacks.\n *\n *  This is the function signature for joystick configuration callback\n *  functions.\n *\n *  @param[in] jid The joystick that was connected or disconnected.\n *  @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.\n *\n *  @sa @ref joystick_event\n *  @sa @ref glfwSetJoystickCallback\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWjoystickfun)(int,int);\n\n/*! @brief Video mode type.\n *\n *  This describes a single video mode.\n *\n *  @sa @ref monitor_modes\n *  @sa @ref glfwGetVideoMode\n *  @sa @ref glfwGetVideoModes\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added refresh rate member.\n *\n *  @ingroup monitor\n */\ntypedef struct GLFWvidmode\n{\n    /*! The width, in screen coordinates, of the video mode.\n     */\n    int width;\n    /*! The height, in screen coordinates, of the video mode.\n     */\n    int height;\n    /*! The bit depth of the red channel of the video mode.\n     */\n    int redBits;\n    /*! The bit depth of the green channel of the video mode.\n     */\n    int greenBits;\n    /*! The bit depth of the blue channel of the video mode.\n     */\n    int blueBits;\n    /*! The refresh rate, in Hz, of the video mode.\n     */\n    int refreshRate;\n} GLFWvidmode;\n\n/*! @brief Gamma ramp.\n *\n *  This describes the gamma ramp for a monitor.\n *\n *  @sa @ref monitor_gamma\n *  @sa @ref glfwGetGammaRamp\n *  @sa @ref glfwSetGammaRamp\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\ntypedef struct GLFWgammaramp\n{\n    /*! An array of value describing the response of the red channel.\n     */\n    unsigned short* red;\n    /*! An array of value describing the response of the green channel.\n     */\n    unsigned short* green;\n    /*! An array of value describing the response of the blue channel.\n     */\n    unsigned short* blue;\n    /*! The number of elements in each array.\n     */\n    unsigned int size;\n} GLFWgammaramp;\n\n/*! @brief Image data.\n *\n *  This describes a single 2D image.  See the documentation for each related\n *  function what the expected pixel format is.\n *\n *  @sa @ref cursor_custom\n *  @sa @ref window_icon\n *\n *  @since Added in version 2.1.\n *  @glfw3 Removed format and bytes-per-pixel members.\n */\ntypedef struct GLFWimage\n{\n    /*! The width, in pixels, of this image.\n     */\n    int width;\n    /*! The height, in pixels, of this image.\n     */\n    int height;\n    /*! The pixel data of this image, arranged left-to-right, top-to-bottom.\n     */\n    unsigned char* pixels;\n} GLFWimage;\n\n/*! @brief Gamepad input state\n *\n *  This describes the input state of a gamepad.\n *\n *  @sa @ref gamepad\n *  @sa @ref glfwGetGamepadState\n *\n *  @since Added in version 3.3.\n */\ntypedef struct GLFWgamepadstate\n{\n    /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS`\n     *  or `GLFW_RELEASE`.\n     */\n    unsigned char buttons[15];\n    /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0\n     *  to 1.0 inclusive.\n     */\n    float axes[6];\n} GLFWgamepadstate;\n\n\n/*************************************************************************\n * GLFW API functions\n *************************************************************************/\n\n/*! @brief Initializes the GLFW library.\n *\n *  This function initializes the GLFW library.  Before most GLFW functions can\n *  be used, GLFW must be initialized, and before an application terminates GLFW\n *  should be terminated in order to free any resources allocated during or\n *  after initialization.\n *\n *  If this function fails, it calls @ref glfwTerminate before returning.  If it\n *  succeeds, you should call @ref glfwTerminate before the application exits.\n *\n *  Additional calls to this function after successful initialization but before\n *  termination will return `GLFW_TRUE` immediately.\n *\n *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark @macos This function will change the current directory of the\n *  application to the `Contents/Resources` subdirectory of the application's\n *  bundle, if present.  This can be disabled with the @ref\n *  GLFW_COCOA_CHDIR_RESOURCES init hint.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref intro_init\n *  @sa @ref glfwTerminate\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup init\n */\nGLFWAPI int glfwInit(void);\n\n/*! @brief Terminates the GLFW library.\n *\n *  This function destroys all remaining windows and cursors, restores any\n *  modified gamma ramps and frees any other allocated resources.  Once this\n *  function is called, you must again call @ref glfwInit successfully before\n *  you will be able to use most GLFW functions.\n *\n *  If GLFW has been successfully initialized, this function should be called\n *  before the application exits.  If initialization fails, there is no need to\n *  call this function, as it is called by @ref glfwInit before it returns\n *  failure.\n *\n *  @errors Possible errors include @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @warning The contexts of any remaining windows must not be current on any\n *  other thread when this function is called.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref intro_init\n *  @sa @ref glfwInit\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup init\n */\nGLFWAPI void glfwTerminate(void);\n\n/*! @brief Sets the specified init hint to the desired value.\n *\n *  This function sets hints for the next initialization of GLFW.  Only integer\n *  type hints can be set with this function.\n *\n *  The values you set hints to are never reset by GLFW, but they only take\n *  effect during initialization.  Once GLFW has been initialized, any values\n *  you set will be ignored until the library is terminated and initialized\n *  again.\n *\n *  Some hints are platform specific.  These may be set on any platform but they\n *  will only affect their specific platform.  Other platforms will ignore them.\n *  Setting these hints requires no platform specific headers or functions. \n *\n *  @param[in] hint The [init hint](@ref init_hints) to set.\n *  @param[in] value The new value of the init hint.\n *\n *  @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref\n *  GLFW_INVALID_VALUE.\n *\n *  @remarks This function may be called before @ref glfwInit.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa init_hints\n *  @sa glfwInit\n *  @sa glfwInitHintString\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup init\n */\nGLFWAPI void glfwInitHint(int hint, int value);\n\n/*! @brief Sets the specified init hint to the desired value.\n *\n *  This function sets hints for the next initialization of GLFW.  Only string\n *  type hints can be set with this function.\n *\n *  The values you set hints to are never reset by GLFW, but they only take\n *  effect during initialization.  Once GLFW has been initialized, any values\n *  you set will be ignored until the library is terminated and initialized\n *  again.\n *\n *  Some hints are platform specific.  These may be set on any platform but they\n *  will only affect their specific platform.  Other platforms will ignore them.\n *  Setting these hints requires no platform specific headers or functions. \n *\n *  @param[in] hint The [init hint](@ref init_hints) to set.\n *  @param[in] value The new value of the init hint.\n *\n *  @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref\n *  GLFW_INVALID_VALUE.\n *\n *  @remarks This function may be called before @ref glfwInit.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa init_hints\n *  @sa glfwInit\n *  @sa glfwInitHint\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup init\n */\nGLFWAPI void glfwInitHintString(int hint, const char* value);\n\n/*! @brief Retrieves the version of the GLFW library.\n *\n *  This function retrieves the major, minor and revision numbers of the GLFW\n *  library.  It is intended for when you are using GLFW as a shared library and\n *  want to ensure that you are using the minimum required version.\n *\n *  Any or all of the version arguments may be `NULL`.\n *\n *  @param[out] major Where to store the major version number, or `NULL`.\n *  @param[out] minor Where to store the minor version number, or `NULL`.\n *  @param[out] rev Where to store the revision number, or `NULL`.\n *\n *  @errors None.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref intro_version\n *  @sa @ref glfwGetVersionString\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup init\n */\nGLFWAPI void glfwGetVersion(int* major, int* minor, int* rev);\n\n/*! @brief Returns a string describing the compile-time configuration.\n *\n *  This function returns the compile-time generated\n *  [version string](@ref intro_version_string) of the GLFW library binary.  It\n *  describes the version, platform, compiler and any platform-specific\n *  compile-time options.  It should not be confused with the OpenGL or OpenGL\n *  ES version string, queried with `glGetString`.\n *\n *  __Do not use the version string__ to parse the GLFW library version.  The\n *  @ref glfwGetVersion function provides the version of the running library\n *  binary in numerical format.\n *\n *  @return The ASCII encoded GLFW version string.\n *\n *  @errors None.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @pointer_lifetime The returned string is static and compile-time generated.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref intro_version\n *  @sa @ref glfwGetVersion\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup init\n */\nGLFWAPI const char* glfwGetVersionString(void);\n\n/*! @brief Returns and clears the last error for the calling thread.\n *\n *  This function returns and clears the [error code](@ref errors) of the last\n *  error that occurred on the calling thread, and optionally a UTF-8 encoded\n *  human-readable description of it.  If no error has occurred since the last\n *  call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is\n *  set to `NULL`.\n *\n *  @param[in] description Where to store the error description pointer, or `NULL`.\n *  @return The last error code for the calling thread, or @ref GLFW_NO_ERROR\n *  (zero).\n *\n *  @errors None.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is guaranteed to be valid only until the\n *  next error occurs or the library is terminated.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref error_handling\n *  @sa @ref glfwSetErrorCallback\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup init\n */\nGLFWAPI int glfwGetError(const char** description);\n\n/*! @brief Sets the error callback.\n *\n *  This function sets the error callback, which is called with an error code\n *  and a human-readable description each time a GLFW error occurs.\n *\n *  The error code is set before the callback is called.  Calling @ref\n *  glfwGetError from the error callback will return the same value as the error\n *  code argument.\n *\n *  The error callback is called on the thread where the error occurred.  If you\n *  are using GLFW from multiple threads, your error callback needs to be\n *  written accordingly.\n *\n *  Because the description string may have been generated specifically for that\n *  error, it is not guaranteed to be valid after the callback has returned.  If\n *  you wish to use it after the callback returns, you need to make a copy.\n *\n *  Once set, the error callback remains set even after the library has been\n *  terminated.\n *\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set.\n *\n *  @errors None.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref error_handling\n *  @sa @ref glfwGetError\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup init\n */\nGLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun);\n\n/*! @brief Returns the currently connected monitors.\n *\n *  This function returns an array of handles for all currently connected\n *  monitors.  The primary monitor is always first in the returned array.  If no\n *  monitors were found, this function returns `NULL`.\n *\n *  @param[out] count Where to store the number of monitors in the returned\n *  array.  This is set to zero if an error occurred.\n *  @return An array of monitor handles, or `NULL` if no monitors were found or\n *  if an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is guaranteed to be valid only until the\n *  monitor configuration changes or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_monitors\n *  @sa @ref monitor_event\n *  @sa @ref glfwGetPrimaryMonitor\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI GLFWmonitor** glfwGetMonitors(int* count);\n\n/*! @brief Returns the primary monitor.\n *\n *  This function returns the primary monitor.  This is usually the monitor\n *  where elements like the task bar or global menu bar are located.\n *\n *  @return The primary monitor, or `NULL` if no monitors were found or if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @remark The primary monitor is always first in the array returned by @ref\n *  glfwGetMonitors.\n *\n *  @sa @ref monitor_monitors\n *  @sa @ref glfwGetMonitors\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void);\n\n/*! @brief Returns the position of the monitor's viewport on the virtual screen.\n *\n *  This function returns the position, in screen coordinates, of the upper-left\n *  corner of the specified monitor.\n *\n *  Any or all of the position arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` position arguments will be set to zero.\n *\n *  @param[in] monitor The monitor to query.\n *  @param[out] xpos Where to store the monitor x-coordinate, or `NULL`.\n *  @param[out] ypos Where to store the monitor y-coordinate, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_properties\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos);\n\n/*! @brief Returns the physical size of the monitor.\n *\n *  This function returns the size, in millimetres, of the display area of the\n *  specified monitor.\n *\n *  Some systems do not provide accurate monitor size information, either\n *  because the monitor\n *  [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data)\n *  data is incorrect or because the driver does not report it accurately.\n *\n *  Any or all of the size arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` size arguments will be set to zero.\n *\n *  @param[in] monitor The monitor to query.\n *  @param[out] widthMM Where to store the width, in millimetres, of the\n *  monitor's display area, or `NULL`.\n *  @param[out] heightMM Where to store the height, in millimetres, of the\n *  monitor's display area, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @remark @win32 calculates the returned physical size from the\n *  current resolution and system DPI instead of querying the monitor EDID data.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_properties\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM);\n\n/*! @brief Returns the name of the specified monitor.\n *\n *  This function returns a human-readable name, encoded as UTF-8, of the\n *  specified monitor.  The name typically reflects the make and model of the\n *  monitor and is not guaranteed to be unique among the connected monitors.\n *\n *  @param[in] monitor The monitor to query.\n *  @return The UTF-8 encoded name of the monitor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified monitor is\n *  disconnected or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_properties\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor);\n\n/*! @brief Sets the monitor configuration callback.\n *\n *  This function sets the monitor configuration callback, or removes the\n *  currently set callback.  This is called when a monitor is connected to or\n *  disconnected from the system.\n *\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_event\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun);\n\n/*! @brief Returns the available video modes for the specified monitor.\n *\n *  This function returns an array of all video modes supported by the specified\n *  monitor.  The returned array is sorted in ascending order, first by color\n *  bit depth (the sum of all channel depths) and then by resolution area (the\n *  product of width and height).\n *\n *  @param[in] monitor The monitor to query.\n *  @param[out] count Where to store the number of video modes in the returned\n *  array.  This is set to zero if an error occurred.\n *  @return An array of video modes, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified monitor is\n *  disconnected, this function is called again for that monitor or the library\n *  is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_modes\n *  @sa @ref glfwGetVideoMode\n *\n *  @since Added in version 1.0.\n *  @glfw3 Changed to return an array of modes for a specific monitor.\n *\n *  @ingroup monitor\n */\nGLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count);\n\n/*! @brief Returns the current mode of the specified monitor.\n *\n *  This function returns the current video mode of the specified monitor.  If\n *  you have created a full screen window for that monitor, the return value\n *  will depend on whether that window is iconified.\n *\n *  @param[in] monitor The monitor to query.\n *  @return The current mode of the monitor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified monitor is\n *  disconnected or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_modes\n *  @sa @ref glfwGetVideoModes\n *\n *  @since Added in version 3.0.  Replaces `glfwGetDesktopMode`.\n *\n *  @ingroup monitor\n */\nGLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor);\n\n/*! @brief Generates a gamma ramp and sets it for the specified monitor.\n *\n *  This function generates a 256-element gamma ramp from the specified exponent\n *  and then calls @ref glfwSetGammaRamp with it.  The value must be a finite\n *  number greater than zero.\n *\n *  The software controlled gamma ramp is applied _in addition_ to the hardware\n *  gamma correction, which today is usually an approximation of sRGB gamma.\n *  This means that setting a perfectly linear ramp, or gamma 1.0, will produce\n *  the default (usually sRGB-like) behavior.\n *\n *  For gamma correct rendering with OpenGL or OpenGL ES, see the @ref\n *  GLFW_SRGB_CAPABLE hint.\n *\n *  @param[in] monitor The monitor whose gamma ramp to set.\n *  @param[in] gamma The desired exponent.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland Gamma handling is currently unavailable, this function will\n *  always emit @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_gamma\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma);\n\n/*! @brief Returns the current gamma ramp for the specified monitor.\n *\n *  This function returns the current gamma ramp of the specified monitor.\n *\n *  @param[in] monitor The monitor to query.\n *  @return The current gamma ramp, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland Gamma handling is currently unavailable, this function will\n *  always return `NULL` and emit @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned structure and its arrays are allocated and\n *  freed by GLFW.  You should not free them yourself.  They are valid until the\n *  specified monitor is disconnected, this function is called again for that\n *  monitor or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_gamma\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor);\n\n/*! @brief Sets the current gamma ramp for the specified monitor.\n *\n *  This function sets the current gamma ramp for the specified monitor.  The\n *  original gamma ramp for that monitor is saved by GLFW the first time this\n *  function is called and is restored by @ref glfwTerminate.\n *\n *  The software controlled gamma ramp is applied _in addition_ to the hardware\n *  gamma correction, which today is usually an approximation of sRGB gamma.\n *  This means that setting a perfectly linear ramp, or gamma 1.0, will produce\n *  the default (usually sRGB-like) behavior.\n *\n *  For gamma correct rendering with OpenGL or OpenGL ES, see the @ref\n *  GLFW_SRGB_CAPABLE hint.\n *\n *  @param[in] monitor The monitor whose gamma ramp to set.\n *  @param[in] ramp The gamma ramp to use.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark Gamma ramp sizes other than 256 are not supported by all platforms\n *  or graphics hardware.\n *\n *  @remark @win32 The gamma ramp size must be 256.\n *\n *  @remark @wayland Gamma handling is currently unavailable, this function will\n *  always emit @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The specified gamma ramp is copied before this function\n *  returns.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_gamma\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp);\n\n/*! @brief Resets all window hints to their default values.\n *\n *  This function resets all window hints to their\n *  [default values](@ref window_hints_values).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_hints\n *  @sa @ref glfwWindowHint\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwDefaultWindowHints(void);\n\n/*! @brief Sets the specified window hint to the desired value.\n *\n *  This function sets hints for the next call to @ref glfwCreateWindow.  The\n *  hints, once set, retain their values until changed by a call to @ref\n *  glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is\n *  terminated.\n *\n *  This function does not check whether the specified hint values are valid.\n *  If you set hints to invalid values this will instead be reported by the next\n *  call to @ref glfwCreateWindow.\n *\n *  @param[in] hint The [window hint](@ref window_hints) to set.\n *  @param[in] value The new value of the window hint.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_hints\n *  @sa @ref glfwDefaultWindowHints\n *\n *  @since Added in version 3.0.  Replaces `glfwOpenWindowHint`.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwWindowHint(int hint, int value);\n\n/*! @brief Creates a window and its associated context.\n *\n *  This function creates a window and its associated OpenGL or OpenGL ES\n *  context.  Most of the options controlling how the window and its context\n *  should be created are specified with [window hints](@ref window_hints).\n *\n *  Successful creation does not change which context is current.  Before you\n *  can use the newly created context, you need to\n *  [make it current](@ref context_current).  For information about the `share`\n *  parameter, see @ref context_sharing.\n *\n *  The created window, framebuffer and context may differ from what you\n *  requested, as not all parameters and hints are\n *  [hard constraints](@ref window_hints_hard).  This includes the size of the\n *  window, especially for full screen windows.  To query the actual attributes\n *  of the created window, framebuffer and context, see @ref\n *  glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize.\n *\n *  To create a full screen window, you need to specify the monitor the window\n *  will cover.  If no monitor is specified, the window will be windowed mode.\n *  Unless you have a way for the user to choose a specific monitor, it is\n *  recommended that you pick the primary monitor.  For more information on how\n *  to query connected monitors, see @ref monitor_monitors.\n *\n *  For full screen windows, the specified size becomes the resolution of the\n *  window's _desired video mode_.  As long as a full screen window is not\n *  iconified, the supported video mode most closely matching the desired video\n *  mode is set for the specified monitor.  For more information about full\n *  screen windows, including the creation of so called _windowed full screen_\n *  or _borderless full screen_ windows, see @ref window_windowed_full_screen.\n *\n *  Once you have created the window, you can switch it between windowed and\n *  full screen mode with @ref glfwSetWindowMonitor.  This will not affect its\n *  OpenGL or OpenGL ES context.\n *\n *  By default, newly created windows use the placement recommended by the\n *  window system.  To create the window at a specific position, make it\n *  initially invisible using the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window\n *  hint, set its [position](@ref window_pos) and then [show](@ref window_hide)\n *  it.\n *\n *  As long as at least one full screen window is not iconified, the screensaver\n *  is prohibited from starting.\n *\n *  Window systems put limits on window sizes.  Very large or very small window\n *  dimensions may be overridden by the window system on creation.  Check the\n *  actual [size](@ref window_size) after creation.\n *\n *  The [swap interval](@ref buffer_swap) is not set during window creation and\n *  the initial value may vary depending on driver settings and defaults.\n *\n *  @param[in] width The desired width, in screen coordinates, of the window.\n *  This must be greater than zero.\n *  @param[in] height The desired height, in screen coordinates, of the window.\n *  This must be greater than zero.\n *  @param[in] title The initial, UTF-8 encoded window title.\n *  @param[in] monitor The monitor to use for full screen mode, or `NULL` for\n *  windowed mode.\n *  @param[in] share The window whose context to share resources with, or `NULL`\n *  to not share resources.\n *  @return The handle of the created window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref\n *  GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @win32 Window creation will fail if the Microsoft GDI software\n *  OpenGL implementation is the only one available.\n *\n *  @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it\n *  will be set as the initial icon for the window.  If no such icon is present,\n *  the `IDI_WINLOGO` icon will be used instead.  To set a different icon, see\n *  @ref glfwSetWindowIcon.\n *\n *  @remark @win32 The context to share resources with must not be current on\n *  any other thread.\n *\n *  @remark @macos The OS only supports forward-compatible core profile contexts\n *  for OpenGL versions 3.2 and later.  Before creating an OpenGL context of\n *  version 3.2 or later you must set the\n *  [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and\n *  [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly.\n *  OpenGL 3.0 and 3.1 contexts are not supported at all on macOS.\n *\n *  @remark @macos The GLFW window has no icon, as it is not a document\n *  window, but the dock icon will be the same as the application bundle's icon.\n *  For more information on bundles, see the\n *  [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)\n *  in the Mac Developer Library.\n *\n *  @remark @macos The first time a window is created the menu bar is created.\n *  If GLFW finds a `MainMenu.nib` it is loaded and assumed to contain a menu\n *  bar.  Otherwise a minimal menu bar is created manually with common commands\n *  like Hide, Quit and About.  The About entry opens a minimal about dialog\n *  with information from the application's bundle.  Menu bar creation can be\n *  disabled entirely with the @ref GLFW_COCOA_MENUBAR init hint.\n *\n *  @remark @macos On OS X 10.10 and later the window frame will not be rendered\n *  at full resolution on Retina displays unless the\n *  [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint)\n *  hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the\n *  application bundle's `Info.plist`.  For more information, see\n *  [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html)\n *  in the Mac Developer Library.  The GLFW test and example programs use\n *  a custom `Info.plist` template for this, which can be found as\n *  `CMake/MacOSXBundleInfo.plist.in` in the source tree.\n *\n *  @remark @macos When activating frame autosaving with\n *  [GLFW_COCOA_FRAME_AUTOSAVE](@ref GLFW_COCOA_FRAME_AUTOSAVE_hint), the\n *  specified window size may be overriden by a previously saved size and\n *  position.\n *\n *  @remark @x11 Some window managers will not respect the placement of\n *  initially hidden windows.\n *\n *  @remark @x11 Due to the asynchronous nature of X11, it may take a moment for\n *  a window to reach its requested state.  This means you may not be able to\n *  query the final size, position or other attributes directly after window\n *  creation.\n *\n *  @remark @x11 The name and class of the `WM_CLASS` window property will by\n *  default be set to the window title passed to this function.  Set the @ref\n *  GLFW_X11_WM_CLASS_NAME and @ref GLFW_X11_WM_CLASS_CLASS init hints before\n *  initialization to override this.\n *\n *  @remark @wayland The window frame is currently unimplemented, as if\n *  [GLFW_DECORATED](@ref GLFW_DECORATED_hint) was always set to `GLFW_FALSE`.\n *  A compositor can still emit close, resize or maximize events, using for\n *  example a keybind mechanism.\n *\n *  @remark @wayland A full screen window will not attempt to change the mode,\n *  no matter what the requested size or refresh rate.\n *\n *  @remark @wayland The wl_shell protocol does not support window\n *  icons, the window will inherit the one defined in the application's\n *  desktop file, so this function emits @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland Screensaver inhibition is currently unimplemented.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_creation\n *  @sa @ref glfwDestroyWindow\n *\n *  @since Added in version 3.0.  Replaces `glfwOpenWindow`.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);\n\n/*! @brief Destroys the specified window and its context.\n *\n *  This function destroys the specified window and its context.  On calling\n *  this function, no further callbacks will be called for that window.\n *\n *  If the context of the specified window is current on the main thread, it is\n *  detached before being destroyed.\n *\n *  @param[in] window The window to destroy.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @note The context of the specified window must not be current on any other\n *  thread when this function is called.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_creation\n *  @sa @ref glfwCreateWindow\n *\n *  @since Added in version 3.0.  Replaces `glfwCloseWindow`.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwDestroyWindow(GLFWwindow* window);\n\n/*! @brief Checks the close flag of the specified window.\n *\n *  This function returns the value of the close flag of the specified window.\n *\n *  @param[in] window The window to query.\n *  @return The value of the close flag.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @sa @ref window_close\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI int glfwWindowShouldClose(GLFWwindow* window);\n\n/*! @brief Sets the close flag of the specified window.\n *\n *  This function sets the value of the close flag of the specified window.\n *  This can be used to override the user's attempt to close the window, or\n *  to signal that it should be closed.\n *\n *  @param[in] window The window whose flag to change.\n *  @param[in] value The new value.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @sa @ref window_close\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value);\n\n/*! @brief Sets the title of the specified window.\n *\n *  This function sets the window title, encoded as UTF-8, of the specified\n *  window.\n *\n *  @param[in] window The window whose title to change.\n *  @param[in] title The UTF-8 encoded window title.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @macos The window title will not be updated until the next time you\n *  process events.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_title\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title);\n\n/*! @brief Sets the icon for the specified window.\n *\n *  This function sets the icon of the specified window.  If passed an array of\n *  candidate images, those of or closest to the sizes desired by the system are\n *  selected.  If no images are specified, the window reverts to its default\n *  icon.\n *\n *  The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight\n *  bits per channel with the red channel first.  They are arranged canonically\n *  as packed sequential rows, starting from the top-left corner.\n *\n *  The desired image sizes varies depending on platform and system settings.\n *  The selected images will be rescaled as needed.  Good sizes include 16x16,\n *  32x32 and 48x48.\n *\n *  @param[in] window The window whose icon to set.\n *  @param[in] count The number of images in the specified array, or zero to\n *  revert to the default window icon.\n *  @param[in] images The images to create the icon from.  This is ignored if\n *  count is zero.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The specified image data is copied before this function\n *  returns.\n *\n *  @remark @macos The GLFW window has no icon, as it is not a document\n *  window, so this function does nothing.  The dock icon will be the same as\n *  the application bundle's icon.  For more information on bundles, see the\n *  [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)\n *  in the Mac Developer Library.\n *\n *  @remark @wayland The wl_shell protocol does not support icons, the window\n *  will inherit the one defined in the application's desktop file, so this\n *  function emits @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_icon\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images);\n\n/*! @brief Retrieves the position of the client area of the specified window.\n *\n *  This function retrieves the position, in screen coordinates, of the\n *  upper-left corner of the client area of the specified window.\n *\n *  Any or all of the position arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` position arguments will be set to zero.\n *\n *  @param[in] window The window to query.\n *  @param[out] xpos Where to store the x-coordinate of the upper-left corner of\n *  the client area, or `NULL`.\n *  @param[out] ypos Where to store the y-coordinate of the upper-left corner of\n *  the client area, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland There is no way for an application to retrieve the global\n *  position of its windows, this function will always emit @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_pos\n *  @sa @ref glfwSetWindowPos\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);\n\n/*! @brief Sets the position of the client area of the specified window.\n *\n *  This function sets the position, in screen coordinates, of the upper-left\n *  corner of the client area of the specified windowed mode window.  If the\n *  window is a full screen window, this function does nothing.\n *\n *  __Do not use this function__ to move an already visible window unless you\n *  have very good reasons for doing so, as it will confuse and annoy the user.\n *\n *  The window manager may put limits on what positions are allowed.  GLFW\n *  cannot and should not override these limits.\n *\n *  @param[in] window The window to query.\n *  @param[in] xpos The x-coordinate of the upper-left corner of the client area.\n *  @param[in] ypos The y-coordinate of the upper-left corner of the client area.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland There is no way for an application to set the global\n *  position of its windows, this function will always emit @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_pos\n *  @sa @ref glfwGetWindowPos\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);\n\n/*! @brief Retrieves the size of the client area of the specified window.\n *\n *  This function retrieves the size, in screen coordinates, of the client area\n *  of the specified window.  If you wish to retrieve the size of the\n *  framebuffer of the window in pixels, see @ref glfwGetFramebufferSize.\n *\n *  Any or all of the size arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` size arguments will be set to zero.\n *\n *  @param[in] window The window whose size to retrieve.\n *  @param[out] width Where to store the width, in screen coordinates, of the\n *  client area, or `NULL`.\n *  @param[out] height Where to store the height, in screen coordinates, of the\n *  client area, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_size\n *  @sa @ref glfwSetWindowSize\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);\n\n/*! @brief Sets the size limits of the specified window.\n *\n *  This function sets the size limits of the client area of the specified\n *  window.  If the window is full screen, the size limits only take effect\n *  once it is made windowed.  If the window is not resizable, this function\n *  does nothing.\n *\n *  The size limits are applied immediately to a windowed mode window and may\n *  cause it to be resized.\n *\n *  The maximum dimensions must be greater than or equal to the minimum\n *  dimensions and all must be greater than or equal to zero.\n *\n *  @param[in] window The window to set limits for.\n *  @param[in] minwidth The minimum width, in screen coordinates, of the client\n *  area, or `GLFW_DONT_CARE`.\n *  @param[in] minheight The minimum height, in screen coordinates, of the\n *  client area, or `GLFW_DONT_CARE`.\n *  @param[in] maxwidth The maximum width, in screen coordinates, of the client\n *  area, or `GLFW_DONT_CARE`.\n *  @param[in] maxheight The maximum height, in screen coordinates, of the\n *  client area, or `GLFW_DONT_CARE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark If you set size limits and an aspect ratio that conflict, the\n *  results are undefined.\n *\n *  @remark @wayland The size limits will not be applied until the window is\n *  actually resized, either by the user or by the compositor.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_sizelimits\n *  @sa @ref glfwSetWindowAspectRatio\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);\n\n/*! @brief Sets the aspect ratio of the specified window.\n *\n *  This function sets the required aspect ratio of the client area of the\n *  specified window.  If the window is full screen, the aspect ratio only takes\n *  effect once it is made windowed.  If the window is not resizable, this\n *  function does nothing.\n *\n *  The aspect ratio is specified as a numerator and a denominator and both\n *  values must be greater than zero.  For example, the common 16:9 aspect ratio\n *  is specified as 16 and 9, respectively.\n *\n *  If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect\n *  ratio limit is disabled.\n *\n *  The aspect ratio is applied immediately to a windowed mode window and may\n *  cause it to be resized.\n *\n *  @param[in] window The window to set limits for.\n *  @param[in] numer The numerator of the desired aspect ratio, or\n *  `GLFW_DONT_CARE`.\n *  @param[in] denom The denominator of the desired aspect ratio, or\n *  `GLFW_DONT_CARE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark If you set size limits and an aspect ratio that conflict, the\n *  results are undefined.\n *\n *  @remark @wayland The aspect ratio will not be applied until the window is\n *  actually resized, either by the user or by the compositor.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_sizelimits\n *  @sa @ref glfwSetWindowSizeLimits\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);\n\n/*! @brief Sets the size of the client area of the specified window.\n *\n *  This function sets the size, in screen coordinates, of the client area of\n *  the specified window.\n *\n *  For full screen windows, this function updates the resolution of its desired\n *  video mode and switches to the video mode closest to it, without affecting\n *  the window's context.  As the context is unaffected, the bit depths of the\n *  framebuffer remain unchanged.\n *\n *  If you wish to update the refresh rate of the desired video mode in addition\n *  to its resolution, see @ref glfwSetWindowMonitor.\n *\n *  The window manager may put limits on what sizes are allowed.  GLFW cannot\n *  and should not override these limits.\n *\n *  @param[in] window The window to resize.\n *  @param[in] width The desired width, in screen coordinates, of the window\n *  client area.\n *  @param[in] height The desired height, in screen coordinates, of the window\n *  client area.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland A full screen window will not attempt to change the mode,\n *  no matter what the requested size.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_size\n *  @sa @ref glfwGetWindowSize\n *  @sa @ref glfwSetWindowMonitor\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height);\n\n/*! @brief Retrieves the size of the framebuffer of the specified window.\n *\n *  This function retrieves the size, in pixels, of the framebuffer of the\n *  specified window.  If you wish to retrieve the size of the window in screen\n *  coordinates, see @ref glfwGetWindowSize.\n *\n *  Any or all of the size arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` size arguments will be set to zero.\n *\n *  @param[in] window The window whose framebuffer to query.\n *  @param[out] width Where to store the width, in pixels, of the framebuffer,\n *  or `NULL`.\n *  @param[out] height Where to store the height, in pixels, of the framebuffer,\n *  or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_fbsize\n *  @sa @ref glfwSetFramebufferSizeCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height);\n\n/*! @brief Retrieves the size of the frame of the window.\n *\n *  This function retrieves the size, in screen coordinates, of each edge of the\n *  frame of the specified window.  This size includes the title bar, if the\n *  window has one.  The size of the frame may vary depending on the\n *  [window-related hints](@ref window_hints_wnd) used to create it.\n *\n *  Because this function retrieves the size of each window frame edge and not\n *  the offset along a particular coordinate axis, the retrieved values will\n *  always be zero or positive.\n *\n *  Any or all of the size arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` size arguments will be set to zero.\n *\n *  @param[in] window The window whose frame size to query.\n *  @param[out] left Where to store the size, in screen coordinates, of the left\n *  edge of the window frame, or `NULL`.\n *  @param[out] top Where to store the size, in screen coordinates, of the top\n *  edge of the window frame, or `NULL`.\n *  @param[out] right Where to store the size, in screen coordinates, of the\n *  right edge of the window frame, or `NULL`.\n *  @param[out] bottom Where to store the size, in screen coordinates, of the\n *  bottom edge of the window frame, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland The window frame is currently unimplemented, as if\n *  [GLFW_DECORATED](@ref GLFW_DECORATED_hint) was always set to `GLFW_FALSE`,\n *  so the returned values will always be zero.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_size\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom);\n\n/*! @brief Iconifies the specified window.\n *\n *  This function iconifies (minimizes) the specified window if it was\n *  previously restored.  If the window is already iconified, this function does\n *  nothing.\n *\n *  If the specified window is a full screen window, the original monitor\n *  resolution is restored until the window is restored.\n *\n *  @param[in] window The window to iconify.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland There is no concept of iconification in wl_shell, this\n *  function will always emit @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_iconify\n *  @sa @ref glfwRestoreWindow\n *  @sa @ref glfwMaximizeWindow\n *\n *  @since Added in version 2.1.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwIconifyWindow(GLFWwindow* window);\n\n/*! @brief Restores the specified window.\n *\n *  This function restores the specified window if it was previously iconified\n *  (minimized) or maximized.  If the window is already restored, this function\n *  does nothing.\n *\n *  If the specified window is a full screen window, the resolution chosen for\n *  the window is restored on the selected monitor.\n *\n *  @param[in] window The window to restore.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_iconify\n *  @sa @ref glfwIconifyWindow\n *  @sa @ref glfwMaximizeWindow\n *\n *  @since Added in version 2.1.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwRestoreWindow(GLFWwindow* window);\n\n/*! @brief Maximizes the specified window.\n *\n *  This function maximizes the specified window if it was previously not\n *  maximized.  If the window is already maximized, this function does nothing.\n *\n *  If the specified window is a full screen window, this function does nothing.\n *\n *  @param[in] window The window to maximize.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @par Thread Safety\n *  This function may only be called from the main thread.\n *\n *  @sa @ref window_iconify\n *  @sa @ref glfwIconifyWindow\n *  @sa @ref glfwRestoreWindow\n *\n *  @since Added in GLFW 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwMaximizeWindow(GLFWwindow* window);\n\n/*! @brief Makes the specified window visible.\n *\n *  This function makes the specified window visible if it was previously\n *  hidden.  If the window is already visible or is in full screen mode, this\n *  function does nothing.\n *\n *  @param[in] window The window to make visible.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_hide\n *  @sa @ref glfwHideWindow\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwShowWindow(GLFWwindow* window);\n\n/*! @brief Hides the specified window.\n *\n *  This function hides the specified window if it was previously visible.  If\n *  the window is already hidden or is in full screen mode, this function does\n *  nothing.\n *\n *  @param[in] window The window to hide.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_hide\n *  @sa @ref glfwShowWindow\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwHideWindow(GLFWwindow* window);\n\n/*! @brief Brings the specified window to front and sets input focus.\n *\n *  This function brings the specified window to front and sets input focus.\n *  The window should already be visible and not iconified.\n *\n *  By default, both windowed and full screen mode windows are focused when\n *  initially created.  Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to\n *  disable this behavior.\n *\n *  __Do not use this function__ to steal focus from other applications unless\n *  you are certain that is what the user wants.  Focus stealing can be\n *  extremely disruptive.\n *\n *  For a less disruptive way of getting the user's attention, see\n *  [attention requests](@ref window_attention).\n *\n *  @param[in] window The window to give input focus.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland It is not possible for an application to bring its windows\n *  to front, this function will always emit @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_focus\n *  @sa @ref window_attention\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwFocusWindow(GLFWwindow* window);\n\n/*! @brief Requests user attention to the specified window.\n *\n *  This function requests user attention to the specified window.  On\n *  platforms where this is not supported, attention is requested to the\n *  application as a whole.\n *\n *  Once the user has given attention, usually by focusing the window or\n *  application, the system will end the request automatically.\n *\n *  @param[in] window The window to request attention to.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @macos Attention is requested to the application as a whole, not the\n *  specific window.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_attention\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwRequestWindowAttention(GLFWwindow* window);\n\n/*! @brief Returns the monitor that the window uses for full screen mode.\n *\n *  This function returns the handle of the monitor that the specified window is\n *  in full screen on.\n *\n *  @param[in] window The window to query.\n *  @return The monitor, or `NULL` if the window is in windowed mode or an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_monitor\n *  @sa @ref glfwSetWindowMonitor\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window);\n\n/*! @brief Sets the mode, monitor, video mode and placement of a window.\n *\n *  This function sets the monitor that the window uses for full screen mode or,\n *  if the monitor is `NULL`, makes it windowed mode.\n *\n *  When setting a monitor, this function updates the width, height and refresh\n *  rate of the desired video mode and switches to the video mode closest to it.\n *  The window position is ignored when setting a monitor.\n *\n *  When the monitor is `NULL`, the position, width and height are used to\n *  place the window client area.  The refresh rate is ignored when no monitor\n *  is specified.\n *\n *  If you only wish to update the resolution of a full screen window or the\n *  size of a windowed mode window, see @ref glfwSetWindowSize.\n *\n *  When a window transitions from full screen to windowed mode, this function\n *  restores any previous window settings such as whether it is decorated,\n *  floating, resizable, has size or aspect ratio limits, etc.\n *\n *  @param[in] window The window whose monitor, size or video mode to set.\n *  @param[in] monitor The desired monitor, or `NULL` to set windowed mode.\n *  @param[in] xpos The desired x-coordinate of the upper-left corner of the\n *  client area.\n *  @param[in] ypos The desired y-coordinate of the upper-left corner of the\n *  client area.\n *  @param[in] width The desired with, in screen coordinates, of the client area\n *  or video mode.\n *  @param[in] height The desired height, in screen coordinates, of the client\n *  area or video mode.\n *  @param[in] refreshRate The desired refresh rate, in Hz, of the video mode,\n *  or `GLFW_DONT_CARE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise\n *  affected by any resizing or mode switching, although you may need to update\n *  your viewport if the framebuffer size has changed.\n *\n *  @remark @wayland The desired window position is ignored, as there is no way\n *  for an application to set this property.\n *\n *  @remark @wayland Setting the window to full screen will not attempt to\n *  change the mode, no matter what the requested size or refresh rate.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_monitor\n *  @sa @ref window_full_screen\n *  @sa @ref glfwGetWindowMonitor\n *  @sa @ref glfwSetWindowSize\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);\n\n/*! @brief Returns an attribute of the specified window.\n *\n *  This function returns the value of an attribute of the specified window or\n *  its OpenGL or OpenGL ES context.\n *\n *  @param[in] window The window to query.\n *  @param[in] attrib The [window attribute](@ref window_attribs) whose value to\n *  return.\n *  @return The value of the attribute, or zero if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark Framebuffer related hints are not window attributes.  See @ref\n *  window_attribs_fb for more information.\n *\n *  @remark Zero is a valid value for many window and context related\n *  attributes so you cannot use a return value of zero as an indication of\n *  errors.  However, this function should not fail as long as it is passed\n *  valid arguments and the library has been [initialized](@ref intro_init).\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_attribs\n *  @sa @ref glfwSetWindowAttrib\n *\n *  @since Added in version 3.0.  Replaces `glfwGetWindowParam` and\n *  `glfwGetGLVersion`.\n *\n *  @ingroup window\n */\nGLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib);\n\n/*! @brief Sets an attribute of the specified window.\n *\n *  This function sets the value of an attribute of the specified window.\n *\n *  The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib),\n *  [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib),\n *  [GLFW_FLOATING](@ref GLFW_FLOATING_attrib) and\n *  [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib).   \n *\n *  Some of these attributes are ignored for full screen windows.  The new\n *  value will take effect if the window is later made windowed.\n *\n *  Some of these attributes are ignored for windowed mode windows.  The new\n *  value will take effect if the window is later made full screen.\n *\n *  @param[in] window The window to set the attribute for.\n *  @param[in] attrib A supported window attribute.\n *  @param[in] value `GLFW_TRUE` or `GLFW_FALSE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark Calling @ref glfwGetWindowAttrib will always return the latest\n *  value, even if that value is ignored by the current mode of the window.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_attribs\n *  @sa @ref glfwGetWindowAttrib\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value);\n\n/*! @brief Sets the user pointer of the specified window.\n *\n *  This function sets the user-defined pointer of the specified window.  The\n *  current value is retained until the window is destroyed.  The initial value\n *  is `NULL`.\n *\n *  @param[in] window The window whose pointer to set.\n *  @param[in] pointer The new value.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @sa @ref window_userptr\n *  @sa @ref glfwGetWindowUserPointer\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer);\n\n/*! @brief Returns the user pointer of the specified window.\n *\n *  This function returns the current value of the user-defined pointer of the\n *  specified window.  The initial value is `NULL`.\n *\n *  @param[in] window The window whose pointer to return.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @sa @ref window_userptr\n *  @sa @ref glfwSetWindowUserPointer\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window);\n\n/*! @brief Sets the position callback for the specified window.\n *\n *  This function sets the position callback of the specified window, which is\n *  called when the window is moved.  The callback is provided with the screen\n *  position of the upper-left corner of the client area of the window.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @remark @wayland This callback will never be called, as there is no way for\n *  an application to know its global position.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_pos\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun);\n\n/*! @brief Sets the size callback for the specified window.\n *\n *  This function sets the size callback of the specified window, which is\n *  called when the window is resized.  The callback is provided with the size,\n *  in screen coordinates, of the client area of the window.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_size\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun);\n\n/*! @brief Sets the close callback for the specified window.\n *\n *  This function sets the close callback of the specified window, which is\n *  called when the user attempts to close the window, for example by clicking\n *  the close widget in the title bar.\n *\n *  The close flag is set before this callback is called, but you can modify it\n *  at any time with @ref glfwSetWindowShouldClose.\n *\n *  The close callback is not triggered by @ref glfwDestroyWindow.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @remark @macos Selecting Quit from the application menu will trigger the\n *  close callback for all windows.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_close\n *\n *  @since Added in version 2.5.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun);\n\n/*! @brief Sets the refresh callback for the specified window.\n *\n *  This function sets the refresh callback of the specified window, which is\n *  called when the client area of the window needs to be redrawn, for example\n *  if the window has been exposed after having been covered by another window.\n *\n *  On compositing window systems such as Aero, Compiz, Aqua or Wayland, where\n *  the window contents are saved off-screen, this callback may be called only\n *  very infrequently or never at all.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_refresh\n *\n *  @since Added in version 2.5.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun);\n\n/*! @brief Sets the focus callback for the specified window.\n *\n *  This function sets the focus callback of the specified window, which is\n *  called when the window gains or loses input focus.\n *\n *  After the focus callback is called for a window that lost input focus,\n *  synthetic key and mouse button release events will be generated for all such\n *  that had been pressed.  For more information, see @ref glfwSetKeyCallback\n *  and @ref glfwSetMouseButtonCallback.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_focus\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun);\n\n/*! @brief Sets the iconify callback for the specified window.\n *\n *  This function sets the iconification callback of the specified window, which\n *  is called when the window is iconified or restored.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @remark @wayland The wl_shell protocol has no concept of iconification,\n *  this callback will never be called.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_iconify\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun);\n\n/*! @brief Sets the maximize callback for the specified window.\n *\n *  This function sets the maximization callback of the specified window, which\n *  is called when the window is maximized or restored.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_maximize\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun cbfun);\n\n/*! @brief Sets the framebuffer resize callback for the specified window.\n *\n *  This function sets the framebuffer resize callback of the specified window,\n *  which is called when the framebuffer of the specified window is resized.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_fbsize\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun);\n\n/*! @brief Processes all pending events.\n *\n *  This function processes only those events that are already in the event\n *  queue and then returns immediately.  Processing events will cause the window\n *  and input callbacks associated with those events to be called.\n *\n *  On some platforms, a window move, resize or menu operation will cause event\n *  processing to block.  This is due to how event processing is designed on\n *  those platforms.  You can use the\n *  [window refresh callback](@ref window_refresh) to redraw the contents of\n *  your window when necessary during such operations.\n *\n *  Do not assume that callbacks you set will _only_ be called in response to\n *  event processing functions like this one.  While it is necessary to poll for\n *  events, window systems that require GLFW to register callbacks of its own\n *  can pass events to GLFW in response to many window system function calls.\n *  GLFW will pass those events on to the application callbacks before\n *  returning.\n *\n *  Event processing is not required for joystick input to work.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref events\n *  @sa @ref glfwWaitEvents\n *  @sa @ref glfwWaitEventsTimeout\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwPollEvents(void);\n\n/*! @brief Waits until events are queued and processes them.\n *\n *  This function puts the calling thread to sleep until at least one event is\n *  available in the event queue.  Once one or more events are available,\n *  it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue\n *  are processed and the function then returns immediately.  Processing events\n *  will cause the window and input callbacks associated with those events to be\n *  called.\n *\n *  Since not all events are associated with callbacks, this function may return\n *  without a callback having been called even if you are monitoring all\n *  callbacks.\n *\n *  On some platforms, a window move, resize or menu operation will cause event\n *  processing to block.  This is due to how event processing is designed on\n *  those platforms.  You can use the\n *  [window refresh callback](@ref window_refresh) to redraw the contents of\n *  your window when necessary during such operations.\n *\n *  Do not assume that callbacks you set will _only_ be called in response to\n *  event processing functions like this one.  While it is necessary to poll for\n *  events, window systems that require GLFW to register callbacks of its own\n *  can pass events to GLFW in response to many window system function calls.\n *  GLFW will pass those events on to the application callbacks before\n *  returning.\n *\n *  If no windows exist, this function returns immediately.  For synchronization\n *  of threads in applications that do not create windows, use your threading\n *  library of choice.\n *\n *  Event processing is not required for joystick input to work.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref events\n *  @sa @ref glfwPollEvents\n *  @sa @ref glfwWaitEventsTimeout\n *\n *  @since Added in version 2.5.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwWaitEvents(void);\n\n/*! @brief Waits with timeout until events are queued and processes them.\n *\n *  This function puts the calling thread to sleep until at least one event is\n *  available in the event queue, or until the specified timeout is reached.  If\n *  one or more events are available, it behaves exactly like @ref\n *  glfwPollEvents, i.e. the events in the queue are processed and the function\n *  then returns immediately.  Processing events will cause the window and input\n *  callbacks associated with those events to be called.\n *\n *  The timeout value must be a positive finite number.\n *\n *  Since not all events are associated with callbacks, this function may return\n *  without a callback having been called even if you are monitoring all\n *  callbacks.\n *\n *  On some platforms, a window move, resize or menu operation will cause event\n *  processing to block.  This is due to how event processing is designed on\n *  those platforms.  You can use the\n *  [window refresh callback](@ref window_refresh) to redraw the contents of\n *  your window when necessary during such operations.\n *\n *  Do not assume that callbacks you set will _only_ be called in response to\n *  event processing functions like this one.  While it is necessary to poll for\n *  events, window systems that require GLFW to register callbacks of its own\n *  can pass events to GLFW in response to many window system function calls.\n *  GLFW will pass those events on to the application callbacks before\n *  returning.\n *\n *  If no windows exist, this function returns immediately.  For synchronization\n *  of threads in applications that do not create windows, use your threading\n *  library of choice.\n *\n *  Event processing is not required for joystick input to work.\n *\n *  @param[in] timeout The maximum amount of time, in seconds, to wait.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref events\n *  @sa @ref glfwPollEvents\n *  @sa @ref glfwWaitEvents\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwWaitEventsTimeout(double timeout);\n\n/*! @brief Posts an empty event to the event queue.\n *\n *  This function posts an empty event from the current thread to the event\n *  queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return.\n *\n *  If no windows exist, this function returns immediately.  For synchronization\n *  of threads in applications that do not create windows, use your threading\n *  library of choice.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref events\n *  @sa @ref glfwWaitEvents\n *  @sa @ref glfwWaitEventsTimeout\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwPostEmptyEvent(void);\n\n/*! @brief Returns the value of an input option for the specified window.\n *\n *  This function returns the value of an input option for the specified window.\n *  The mode must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS or\n *  @ref GLFW_STICKY_MOUSE_BUTTONS.\n *\n *  @param[in] window The window to query.\n *  @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or\n *  `GLFW_STICKY_MOUSE_BUTTONS`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref glfwSetInputMode\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);\n\n/*! @brief Sets an input option for the specified window.\n *\n *  This function sets an input mode option for the specified window.  The mode\n *  must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS or\n *  @ref GLFW_STICKY_MOUSE_BUTTONS.\n *\n *  If the mode is `GLFW_CURSOR`, the value must be one of the following cursor\n *  modes:\n *  - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally.\n *  - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client\n *    area of the window but does not restrict the cursor from leaving.\n *  - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual\n *    and unlimited cursor movement.  This is useful for implementing for\n *    example 3D camera controls.\n *\n *  If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to\n *  enable sticky keys, or `GLFW_FALSE` to disable it.  If sticky keys are\n *  enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS`\n *  the next time it is called even if the key had been released before the\n *  call.  This is useful when you are only interested in whether keys have been\n *  pressed but not when or in which order.\n *\n *  If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either\n *  `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it.\n *  If sticky mouse buttons are enabled, a mouse button press will ensure that\n *  @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even\n *  if the mouse button had been released before the call.  This is useful when\n *  you are only interested in whether mouse buttons have been pressed but not\n *  when or in which order.\n *\n *  @param[in] window The window whose input mode to set.\n *  @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or\n *  `GLFW_STICKY_MOUSE_BUTTONS`.\n *  @param[in] value The new value of the specified input mode.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref glfwGetInputMode\n *\n *  @since Added in version 3.0.  Replaces `glfwEnable` and `glfwDisable`.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value);\n\n/*! @brief Returns the layout-specific name of the specified printable key.\n *\n *  This function returns the name of the specified printable key, encoded as\n *  UTF-8.  This is typically the character that key would produce without any\n *  modifier keys, intended for displaying key bindings to the user.  For dead\n *  keys, it is typically the diacritic it would add to a character.\n *\n *  __Do not use this function__ for [text input](@ref input_char).  You will\n *  break text input for many languages even if it happens to work for yours.\n *\n *  If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key,\n *  otherwise the scancode is ignored.  If you specify a non-printable key, or\n *  `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this\n *  function returns `NULL` but does not emit an error.\n *\n *  This behavior allows you to always pass in the arguments in the\n *  [key callback](@ref input_key) without modification.\n *\n *  The printable keys are:\n *  - `GLFW_KEY_APOSTROPHE`\n *  - `GLFW_KEY_COMMA`\n *  - `GLFW_KEY_MINUS`\n *  - `GLFW_KEY_PERIOD`\n *  - `GLFW_KEY_SLASH`\n *  - `GLFW_KEY_SEMICOLON`\n *  - `GLFW_KEY_EQUAL`\n *  - `GLFW_KEY_LEFT_BRACKET`\n *  - `GLFW_KEY_RIGHT_BRACKET`\n *  - `GLFW_KEY_BACKSLASH`\n *  - `GLFW_KEY_WORLD_1`\n *  - `GLFW_KEY_WORLD_2`\n *  - `GLFW_KEY_0` to `GLFW_KEY_9`\n *  - `GLFW_KEY_A` to `GLFW_KEY_Z`\n *  - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9`\n *  - `GLFW_KEY_KP_DECIMAL`\n *  - `GLFW_KEY_KP_DIVIDE`\n *  - `GLFW_KEY_KP_MULTIPLY`\n *  - `GLFW_KEY_KP_SUBTRACT`\n *  - `GLFW_KEY_KP_ADD`\n *  - `GLFW_KEY_KP_EQUAL`\n *\n *  Names for printable keys depend on keyboard layout, while names for\n *  non-printable keys are the same across layouts but depend on the application\n *  language and should be localized along with other user interface text.\n *\n *  @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`.\n *  @param[in] scancode The scancode of the key to query.\n *  @return The UTF-8 encoded, layout-specific name of the key, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the next call to @ref\n *  glfwGetKeyName, or until the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_key_name\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\nGLFWAPI const char* glfwGetKeyName(int key, int scancode);\n\n/*! @brief Returns the platform-specific scancode of the specified key.\n *\n *  This function returns the platform-specific scancode of the specified key.\n *\n *  If the key is `GLFW_KEY_UNKNOWN` or does not exist on the keyboard this\n *  method will return `-1`.\n *\n *  @param[in] key Any [named key](@ref keys).\n *  @return The platform-specific scancode for the key, or `-1` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref input_key\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwGetKeyScancode(int key);\n\n/*! @brief Returns the last reported state of a keyboard key for the specified\n *  window.\n *\n *  This function returns the last state reported for the specified key to the\n *  specified window.  The returned state is one of `GLFW_PRESS` or\n *  `GLFW_RELEASE`.  The higher-level action `GLFW_REPEAT` is only reported to\n *  the key callback.\n *\n *  If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns\n *  `GLFW_PRESS` the first time you call it for a key that was pressed, even if\n *  that key has already been released.\n *\n *  The key functions deal with physical keys, with [key tokens](@ref keys)\n *  named after their use on the standard US keyboard layout.  If you want to\n *  input text, use the Unicode character callback instead.\n *\n *  The [modifier key bit masks](@ref mods) are not key tokens and cannot be\n *  used with this function.\n *\n *  __Do not use this function__ to implement [text input](@ref input_char).\n *\n *  @param[in] window The desired window.\n *  @param[in] key The desired [keyboard key](@ref keys).  `GLFW_KEY_UNKNOWN` is\n *  not a valid key for this function.\n *  @return One of `GLFW_PRESS` or `GLFW_RELEASE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_key\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwGetKey(GLFWwindow* window, int key);\n\n/*! @brief Returns the last reported state of a mouse button for the specified\n *  window.\n *\n *  This function returns the last state reported for the specified mouse button\n *  to the specified window.  The returned state is one of `GLFW_PRESS` or\n *  `GLFW_RELEASE`.\n *\n *  If the @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function\n *  `GLFW_PRESS` the first time you call it for a mouse button that was pressed,\n *  even if that mouse button has already been released.\n *\n *  @param[in] window The desired window.\n *  @param[in] button The desired [mouse button](@ref buttons).\n *  @return One of `GLFW_PRESS` or `GLFW_RELEASE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_mouse_button\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button);\n\n/*! @brief Retrieves the position of the cursor relative to the client area of\n *  the window.\n *\n *  This function returns the position of the cursor, in screen coordinates,\n *  relative to the upper-left corner of the client area of the specified\n *  window.\n *\n *  If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor\n *  position is unbounded and limited only by the minimum and maximum values of\n *  a `double`.\n *\n *  The coordinate can be converted to their integer equivalents with the\n *  `floor` function.  Casting directly to an integer type works for positive\n *  coordinates, but fails for negative ones.\n *\n *  Any or all of the position arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` position arguments will be set to zero.\n *\n *  @param[in] window The desired window.\n *  @param[out] xpos Where to store the cursor x-coordinate, relative to the\n *  left edge of the client area, or `NULL`.\n *  @param[out] ypos Where to store the cursor y-coordinate, relative to the to\n *  top edge of the client area, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_pos\n *  @sa @ref glfwSetCursorPos\n *\n *  @since Added in version 3.0.  Replaces `glfwGetMousePos`.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);\n\n/*! @brief Sets the position of the cursor, relative to the client area of the\n *  window.\n *\n *  This function sets the position, in screen coordinates, of the cursor\n *  relative to the upper-left corner of the client area of the specified\n *  window.  The window must have input focus.  If the window does not have\n *  input focus when this function is called, it fails silently.\n *\n *  __Do not use this function__ to implement things like camera controls.  GLFW\n *  already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the\n *  cursor, transparently re-centers it and provides unconstrained cursor\n *  motion.  See @ref glfwSetInputMode for more information.\n *\n *  If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is\n *  unconstrained and limited only by the minimum and maximum values of\n *  a `double`.\n *\n *  @param[in] window The desired window.\n *  @param[in] xpos The desired x-coordinate, relative to the left edge of the\n *  client area.\n *  @param[in] ypos The desired y-coordinate, relative to the top edge of the\n *  client area.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland This function will only work when the cursor mode is\n *  `GLFW_CURSOR_DISABLED`, otherwise it will do nothing.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_pos\n *  @sa @ref glfwGetCursorPos\n *\n *  @since Added in version 3.0.  Replaces `glfwSetMousePos`.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos);\n\n/*! @brief Creates a custom cursor.\n *\n *  Creates a new custom cursor image that can be set for a window with @ref\n *  glfwSetCursor.  The cursor can be destroyed with @ref glfwDestroyCursor.\n *  Any remaining cursors are destroyed by @ref glfwTerminate.\n *\n *  The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight\n *  bits per channel with the red channel first.  They are arranged canonically\n *  as packed sequential rows, starting from the top-left corner.\n *\n *  The cursor hotspot is specified in pixels, relative to the upper-left corner\n *  of the cursor image.  Like all other coordinate systems in GLFW, the X-axis\n *  points to the right and the Y-axis points down.\n *\n *  @param[in] image The desired cursor image.\n *  @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot.\n *  @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot.\n *  @return The handle of the created cursor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The specified image data is copied before this function\n *  returns.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_object\n *  @sa @ref glfwDestroyCursor\n *  @sa @ref glfwCreateStandardCursor\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot);\n\n/*! @brief Creates a cursor with a standard shape.\n *\n *  Returns a cursor with a [standard shape](@ref shapes), that can be set for\n *  a window with @ref glfwSetCursor.\n *\n *  @param[in] shape One of the [standard shapes](@ref shapes).\n *  @return A new cursor ready to use or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_object\n *  @sa @ref glfwCreateCursor\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape);\n\n/*! @brief Destroys a cursor.\n *\n *  This function destroys a cursor previously created with @ref\n *  glfwCreateCursor.  Any remaining cursors will be destroyed by @ref\n *  glfwTerminate.\n *\n *  If the specified cursor is current for any window, that window will be\n *  reverted to the default cursor.  This does not affect the cursor mode.\n *\n *  @param[in] cursor The cursor object to destroy.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_object\n *  @sa @ref glfwCreateCursor\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwDestroyCursor(GLFWcursor* cursor);\n\n/*! @brief Sets the cursor for the window.\n *\n *  This function sets the cursor image to be used when the cursor is over the\n *  client area of the specified window.  The set cursor will only be visible\n *  when the [cursor mode](@ref cursor_mode) of the window is\n *  `GLFW_CURSOR_NORMAL`.\n *\n *  On some platforms, the set cursor may not be visible unless the window also\n *  has input focus.\n *\n *  @param[in] window The window to set the cursor for.\n *  @param[in] cursor The cursor to set, or `NULL` to switch back to the default\n *  arrow cursor.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_object\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor);\n\n/*! @brief Sets the key callback.\n *\n *  This function sets the key callback of the specified window, which is called\n *  when a key is pressed, repeated or released.\n *\n *  The key functions deal with physical keys, with layout independent\n *  [key tokens](@ref keys) named after their values in the standard US keyboard\n *  layout.  If you want to input text, use the\n *  [character callback](@ref glfwSetCharCallback) instead.\n *\n *  When a window loses input focus, it will generate synthetic key release\n *  events for all pressed keys.  You can tell these events from user-generated\n *  events by the fact that the synthetic ones are generated after the focus\n *  loss event has been processed, i.e. after the\n *  [window focus callback](@ref glfwSetWindowFocusCallback) has been called.\n *\n *  The scancode of a key is specific to that platform or sometimes even to that\n *  machine.  Scancodes are intended to allow users to bind keys that don't have\n *  a GLFW key token.  Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their\n *  state is not saved and so it cannot be queried with @ref glfwGetKey.\n *\n *  Sometimes GLFW needs to generate synthetic key events, in which case the\n *  scancode may be zero.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new key callback, or `NULL` to remove the currently\n *  set callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_key\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);\n\n/*! @brief Sets the Unicode character callback.\n *\n *  This function sets the character callback of the specified window, which is\n *  called when a Unicode character is input.\n *\n *  The character callback is intended for Unicode text input.  As it deals with\n *  characters, it is keyboard layout dependent, whereas the\n *  [key callback](@ref glfwSetKeyCallback) is not.  Characters do not map 1:1\n *  to physical keys, as a key may produce zero, one or more characters.  If you\n *  want to know whether a specific physical key was pressed or released, see\n *  the key callback instead.\n *\n *  The character callback behaves as system text input normally does and will\n *  not be called if modifier keys are held down that would prevent normal text\n *  input on that platform, for example a Super (Command) key on macOS or Alt key\n *  on Windows.  There is a\n *  [character with modifiers callback](@ref glfwSetCharModsCallback) that\n *  receives these events.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_char\n *\n *  @since Added in version 2.4.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun);\n\n/*! @brief Sets the Unicode character with modifiers callback.\n *\n *  This function sets the character with modifiers callback of the specified\n *  window, which is called when a Unicode character is input regardless of what\n *  modifier keys are used.\n *\n *  The character with modifiers callback is intended for implementing custom\n *  Unicode character input.  For regular Unicode text input, see the\n *  [character callback](@ref glfwSetCharCallback).  Like the character\n *  callback, the character with modifiers callback deals with characters and is\n *  keyboard layout dependent.  Characters do not map 1:1 to physical keys, as\n *  a key may produce zero, one or more characters.  If you want to know whether\n *  a specific physical key was pressed or released, see the\n *  [key callback](@ref glfwSetKeyCallback) instead.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_char\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun);\n\n/*! @brief Sets the mouse button callback.\n *\n *  This function sets the mouse button callback of the specified window, which\n *  is called when a mouse button is pressed or released.\n *\n *  When a window loses input focus, it will generate synthetic mouse button\n *  release events for all pressed mouse buttons.  You can tell these events\n *  from user-generated events by the fact that the synthetic ones are generated\n *  after the focus loss event has been processed, i.e. after the\n *  [window focus callback](@ref glfwSetWindowFocusCallback) has been called.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_mouse_button\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun);\n\n/*! @brief Sets the cursor position callback.\n *\n *  This function sets the cursor position callback of the specified window,\n *  which is called when the cursor is moved.  The callback is provided with the\n *  position, in screen coordinates, relative to the upper-left corner of the\n *  client area of the window.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_pos\n *\n *  @since Added in version 3.0.  Replaces `glfwSetMousePosCallback`.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun);\n\n/*! @brief Sets the cursor enter/exit callback.\n *\n *  This function sets the cursor boundary crossing callback of the specified\n *  window, which is called when the cursor enters or leaves the client area of\n *  the window.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_enter\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun);\n\n/*! @brief Sets the scroll callback.\n *\n *  This function sets the scroll callback of the specified window, which is\n *  called when a scrolling device is used, such as a mouse wheel or scrolling\n *  area of a touchpad.\n *\n *  The scroll callback receives all scrolling input, like that from a mouse\n *  wheel or a touchpad scrolling area.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new scroll callback, or `NULL` to remove the currently\n *  set callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref scrolling\n *\n *  @since Added in version 3.0.  Replaces `glfwSetMouseWheelCallback`.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun);\n\n/*! @brief Sets the file drop callback.\n *\n *  This function sets the file drop callback of the specified window, which is\n *  called when one or more dragged files are dropped on the window.\n *\n *  Because the path array and its strings may have been generated specifically\n *  for that event, they are not guaranteed to be valid after the callback has\n *  returned.  If you wish to use them after the callback returns, you need to\n *  make a deep copy.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new file drop callback, or `NULL` to remove the\n *  currently set callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @remark @wayland File drop is currently unimplemented.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref path_drop\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun);\n\n/*! @brief Returns whether the specified joystick is present.\n *\n *  This function returns whether the specified joystick is present.\n *\n *  There is no need to call this function before other functions that accept\n *  a joystick ID, as they all check for presence before performing any other\n *  work.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick\n *\n *  @since Added in version 3.0.  Replaces `glfwGetJoystickParam`.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwJoystickPresent(int jid);\n\n/*! @brief Returns the values of all axes of the specified joystick.\n *\n *  This function returns the values of all axes of the specified joystick.\n *  Each element in the array is a value between -1.0 and 1.0.\n *\n *  If the specified joystick is not present this function will return `NULL`\n *  but will not generate an error.  This can be used instead of first calling\n *  @ref glfwJoystickPresent.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @param[out] count Where to store the number of axis values in the returned\n *  array.  This is set to zero if the joystick is not present or an error\n *  occurred.\n *  @return An array of axis values, or `NULL` if the joystick is not present or\n *  an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_axis\n *\n *  @since Added in version 3.0.  Replaces `glfwGetJoystickPos`.\n *\n *  @ingroup input\n */\nGLFWAPI const float* glfwGetJoystickAxes(int jid, int* count);\n\n/*! @brief Returns the state of all buttons of the specified joystick.\n *\n *  This function returns the state of all buttons of the specified joystick.\n *  Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`.\n *\n *  For backward compatibility with earlier versions that did not have @ref\n *  glfwGetJoystickHats, the button array also includes all hats, each\n *  represented as four buttons.  The hats are in the same order as returned by\n *  __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and\n *  _left_.  To disable these extra buttons, set the @ref\n *  GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization.\n *\n *  If the specified joystick is not present this function will return `NULL`\n *  but will not generate an error.  This can be used instead of first calling\n *  @ref glfwJoystickPresent.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @param[out] count Where to store the number of button states in the returned\n *  array.  This is set to zero if the joystick is not present or an error\n *  occurred.\n *  @return An array of button states, or `NULL` if the joystick is not present\n *  or an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_button\n *\n *  @since Added in version 2.2.\n *  @glfw3 Changed to return a dynamic array.\n *\n *  @ingroup input\n */\nGLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count);\n\n/*! @brief Returns the state of all hats of the specified joystick.\n *\n *  This function returns the state of all hats of the specified joystick.\n *  Each element in the array is one of the following values:\n *\n *  Name                  | Value\n *  --------------------- | --------------------------------\n *  `GLFW_HAT_CENTERED`   | 0\n *  `GLFW_HAT_UP`         | 1\n *  `GLFW_HAT_RIGHT`      | 2\n *  `GLFW_HAT_DOWN`       | 4\n *  `GLFW_HAT_LEFT`       | 8\n *  `GLFW_HAT_RIGHT_UP`   | `GLFW_HAT_RIGHT` \\| `GLFW_HAT_UP`\n *  `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \\| `GLFW_HAT_DOWN`\n *  `GLFW_HAT_LEFT_UP`    | `GLFW_HAT_LEFT` \\| `GLFW_HAT_UP`\n *  `GLFW_HAT_LEFT_DOWN`  | `GLFW_HAT_LEFT` \\| `GLFW_HAT_DOWN`\n *\n *  The diagonal directions are bitwise combinations of the primary (up, right,\n *  down and left) directions and you can test for these individually by ANDing\n *  it with the corresponding direction.\n *\n *  @code\n *  if (hats[2] & GLFW_HAT_RIGHT)                                \n *  {                                                            \n *      // State of hat 2 could be right-up, right or right-down \n *  }                                                            \n *  @endcode\n *\n *  If the specified joystick is not present this function will return `NULL`\n *  but will not generate an error.  This can be used instead of first calling\n *  @ref glfwJoystickPresent.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @param[out] count Where to store the number of hat states in the returned\n *  array.  This is set to zero if the joystick is not present or an error\n *  occurred.\n *  @return An array of hat states, or `NULL` if the joystick is not present\n *  or an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected, this function is called again for that joystick or the library\n *  is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_hat\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup input\n */\nGLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count);\n\n/*! @brief Returns the name of the specified joystick.\n *\n *  This function returns the name, encoded as UTF-8, of the specified joystick.\n *  The returned string is allocated and freed by GLFW.  You should not free it\n *  yourself.\n *\n *  If the specified joystick is not present this function will return `NULL`\n *  but will not generate an error.  This can be used instead of first calling\n *  @ref glfwJoystickPresent.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick\n *  is not present or an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_name\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI const char* glfwGetJoystickName(int jid);\n\n/*! @brief Returns the SDL comaptible GUID of the specified joystick.\n *\n *  This function returns the SDL compatible GUID, as a UTF-8 encoded\n *  hexadecimal string, of the specified joystick.  The returned string is\n *  allocated and freed by GLFW.  You should not free it yourself.\n *\n *  The GUID is what connects a joystick to a gamepad mapping.  A connected\n *  joystick will always have a GUID even if there is no gamepad mapping\n *  assigned to it.\n *\n *  If the specified joystick is not present this function will return `NULL`\n *  but will not generate an error.  This can be used instead of first calling\n *  @ref glfwJoystickPresent.\n *\n *  The GUID uses the format introduced in SDL 2.0.5.  This GUID tries to\n *  uniquely identify the make and model of a joystick but does not identify\n *  a specific unit, e.g. all wired Xbox 360 controllers will have the same\n *  GUID on that platform.  The GUID for a unit may vary between platforms\n *  depending on what hardware information the platform specific APIs provide.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @return The UTF-8 encoded GUID of the joystick, or `NULL` if the joystick\n *  is not present or an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref gamepad\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup input\n */\nGLFWAPI const char* glfwGetJoystickGUID(int jid);\n\n/*! @brief Returns whether the specified joystick has a gamepad mapping.\n *\n *  This function returns whether the specified joystick is both present and has\n *  a gamepad mapping.\n *\n *  If the specified joystick is present but does not have a gamepad mapping\n *  this function will return `GLFW_FALSE` but will not generate an error.  Call\n *  @ref glfwJoystickPresent to check if a joystick is present regardless of\n *  whether it has a mapping.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping,\n *  or `GLFW_FALSE` otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref gamepad\n *  @sa @ref glfwGetGamepadState\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwJoystickIsGamepad(int jid);\n\n/*! @brief Sets the joystick configuration callback.\n *\n *  This function sets the joystick configuration callback, or removes the\n *  currently set callback.  This is called when a joystick is connected to or\n *  disconnected from the system.\n *\n *  For joystick connection and disconnection events to be delivered on all\n *  platforms, you need to call one of the [event processing](@ref events)\n *  functions.  Joystick disconnection may also be detected and the callback\n *  called by joystick functions.  The function will then return whatever it\n *  returns if the joystick is not present.\n *\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_event\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun);\n\n/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings.\n *\n *  This function parses the specified ASCII encoded string and updates the\n *  internal list with any gamepad mappings it finds.  This string may\n *  contain either a single gamepad mapping or many mappings separated by\n *  newlines.  The parser supports the full format of the `gamecontrollerdb.txt`\n *  source file including empty lines and comments.\n *\n *  See @ref gamepad_mapping for a description of the format.\n *\n *  If there is already a gamepad mapping for a given GUID in the internal list,\n *  it will be replaced by the one passed to this function.  If the library is\n *  terminated and re-initialized the internal list will revert to the built-in\n *  default.\n *\n *  @param[in] string The string containing the gamepad mappings.\n *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_VALUE.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref gamepad\n *  @sa @ref glfwJoystickIsGamepad\n *  @sa @ref glfwGetGamepadName\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwUpdateGamepadMappings(const char* string);\n\n/*! @brief Returns the human-readable gamepad name for the specified joystick.\n *\n *  This function returns the human-readable name of the gamepad from the\n *  gamepad mapping assigned to the specified joystick.\n *\n *  If the specified joystick is not present or does not have a gamepad mapping\n *  this function will return `NULL` but will not generate an error.  Call\n *  @ref glfwJoystickPresent to check whether it is present regardless of\n *  whether it has a mapping.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @return The UTF-8 encoded name of the gamepad, or `NULL` if the\n *  joystick is not present, does not have a mapping or an\n *  [error](@ref error_handling) occurred.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected, the gamepad mappings are updated or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref gamepad\n *  @sa @ref glfwJoystickIsGamepad\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup input\n */\nGLFWAPI const char* glfwGetGamepadName(int jid);\n\n/*! @brief Retrieves the state of the specified joystick remapped as a gamepad.\n *\n *  This function retrives the state of the specified joystick remapped to\n *  an Xbox-like gamepad.\n *\n *  If the specified joystick is not present or does not have a gamepad mapping\n *  this function will return `GLFW_FALSE` but will not generate an error.  Call\n *  @ref glfwJoystickPresent to check whether it is present regardless of\n *  whether it has a mapping.\n *\n *  The Guide button may not be available for input as it is often hooked by the\n *  system or the Steam client.\n *\n *  Not all devices have all the buttons or axes provided by @ref\n *  GLFWgamepadstate.  Unavailable buttons and axes will always report\n *  `GLFW_RELEASE` and 1.0 respectively.\n *\n *  @param[in] jid The [joystick](@ref joysticks) to query.\n *  @param[out] state The gamepad input state of the joystick.\n *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is\n *  connected, it has no gamepad mapping or an [error](@ref error_handling)\n *  occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @sa @ref gamepad\n *  @sa @ref glfwUpdateGamepadMappings\n *  @sa @ref glfwJoystickIsGamepad\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state);\n\n/*! @brief Sets the clipboard to the specified string.\n *\n *  This function sets the system clipboard to the specified, UTF-8 encoded\n *  string.\n *\n *  @param[in] window The window that will own the clipboard contents.\n *  @param[in] string A UTF-8 encoded string.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland Clipboard is currently unimplemented.\n *\n *  @pointer_lifetime The specified string is copied before this function\n *  returns.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref clipboard\n *  @sa @ref glfwGetClipboardString\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string);\n\n/*! @brief Returns the contents of the clipboard as a string.\n *\n *  This function returns the contents of the system clipboard, if it contains\n *  or is convertible to a UTF-8 encoded string.  If the clipboard is empty or\n *  if its contents cannot be converted, `NULL` is returned and a @ref\n *  GLFW_FORMAT_UNAVAILABLE error is generated.\n *\n *  @param[in] window The window that will request the clipboard contents.\n *  @return The contents of the clipboard as a UTF-8 encoded string, or `NULL`\n *  if an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @wayland Clipboard is currently unimplemented.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the next call to @ref\n *  glfwGetClipboardString or @ref glfwSetClipboardString, or until the library\n *  is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref clipboard\n *  @sa @ref glfwSetClipboardString\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI const char* glfwGetClipboardString(GLFWwindow* window);\n\n/*! @brief Returns the value of the GLFW timer.\n *\n *  This function returns the value of the GLFW timer.  Unless the timer has\n *  been set using @ref glfwSetTime, the timer measures time elapsed since GLFW\n *  was initialized.\n *\n *  The resolution of the timer is system dependent, but is usually on the order\n *  of a few micro- or nanoseconds.  It uses the highest-resolution monotonic\n *  time source on each supported platform.\n *\n *  @return The current value, in seconds, or zero if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Reading and\n *  writing of the internal timer offset is not atomic, so it needs to be\n *  externally synchronized with calls to @ref glfwSetTime.\n *\n *  @sa @ref time\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup input\n */\nGLFWAPI double glfwGetTime(void);\n\n/*! @brief Sets the GLFW timer.\n *\n *  This function sets the value of the GLFW timer.  It then continues to count\n *  up from that value.  The value must be a positive finite number less than\n *  or equal to 18446744073.0, which is approximately 584.5 years.\n *\n *  @param[in] time The new value, in seconds.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_VALUE.\n *\n *  @remark The upper limit of the timer is calculated as\n *  floor((2<sup>64</sup> - 1) / 10<sup>9</sup>) and is due to implementations\n *  storing nanoseconds in 64 bits.  The limit may be increased in the future.\n *\n *  @thread_safety This function may be called from any thread.  Reading and\n *  writing of the internal timer offset is not atomic, so it needs to be\n *  externally synchronized with calls to @ref glfwGetTime.\n *\n *  @sa @ref time\n *\n *  @since Added in version 2.2.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetTime(double time);\n\n/*! @brief Returns the current value of the raw timer.\n *\n *  This function returns the current value of the raw timer, measured in\n *  1&nbsp;/&nbsp;frequency seconds.  To get the frequency, call @ref\n *  glfwGetTimerFrequency.\n *\n *  @return The value of the timer, or zero if an \n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref time\n *  @sa @ref glfwGetTimerFrequency\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\nGLFWAPI uint64_t glfwGetTimerValue(void);\n\n/*! @brief Returns the frequency, in Hz, of the raw timer.\n *\n *  This function returns the frequency, in Hz, of the raw timer.\n *\n *  @return The frequency of the timer, in Hz, or zero if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref time\n *  @sa @ref glfwGetTimerValue\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\nGLFWAPI uint64_t glfwGetTimerFrequency(void);\n\n/*! @brief Makes the context of the specified window current for the calling\n *  thread.\n *\n *  This function makes the OpenGL or OpenGL ES context of the specified window\n *  current on the calling thread.  A context can only be made current on\n *  a single thread at a time and each thread can have only a single current\n *  context at a time.\n *\n *  By default, making a context non-current implicitly forces a pipeline flush.\n *  On machines that support `GL_KHR_context_flush_control`, you can control\n *  whether a context performs this flush by setting the\n *  [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint)\n *  hint.\n *\n *  The specified window must have an OpenGL or OpenGL ES context.  Specifying\n *  a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT\n *  error.\n *\n *  @param[in] window The window whose context to make current, or `NULL` to\n *  detach the current context.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref context_current\n *  @sa @ref glfwGetCurrentContext\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup context\n */\nGLFWAPI void glfwMakeContextCurrent(GLFWwindow* window);\n\n/*! @brief Returns the window whose context is current on the calling thread.\n *\n *  This function returns the window whose OpenGL or OpenGL ES context is\n *  current on the calling thread.\n *\n *  @return The window whose context is current, or `NULL` if no window's\n *  context is current.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref context_current\n *  @sa @ref glfwMakeContextCurrent\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup context\n */\nGLFWAPI GLFWwindow* glfwGetCurrentContext(void);\n\n/*! @brief Swaps the front and back buffers of the specified window.\n *\n *  This function swaps the front and back buffers of the specified window when\n *  rendering with OpenGL or OpenGL ES.  If the swap interval is greater than\n *  zero, the GPU driver waits the specified number of screen updates before\n *  swapping the buffers.\n *\n *  The specified window must have an OpenGL or OpenGL ES context.  Specifying\n *  a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT\n *  error.\n *\n *  This function does not apply to Vulkan.  If you are rendering with Vulkan,\n *  see `vkQueuePresentKHR` instead.\n *\n *  @param[in] window The window whose buffers to swap.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark __EGL:__ The context of the specified window must be current on the\n *  calling thread.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref buffer_swap\n *  @sa @ref glfwSwapInterval\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSwapBuffers(GLFWwindow* window);\n\n/*! @brief Sets the swap interval for the current context.\n *\n *  This function sets the swap interval for the current OpenGL or OpenGL ES\n *  context, i.e. the number of screen updates to wait from the time @ref\n *  glfwSwapBuffers was called before swapping the buffers and returning.  This\n *  is sometimes called _vertical synchronization_, _vertical retrace\n *  synchronization_ or just _vsync_.\n *\n *  Contexts that support either of the `WGL_EXT_swap_control_tear` and\n *  `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals,\n *  which allow the driver to swap even if a frame arrives a little bit late.\n *  You can check for the presence of these extensions using @ref\n *  glfwExtensionSupported.  For more information about swap tearing, see the\n *  extension specifications.\n *\n *  A context must be current on the calling thread.  Calling this function\n *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error.\n *\n *  This function does not apply to Vulkan.  If you are rendering with Vulkan,\n *  see the present mode of your swapchain instead.\n *\n *  @param[in] interval The minimum number of screen updates to wait for\n *  until the buffers are swapped by @ref glfwSwapBuffers.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark This function is not called during context creation, leaving the\n *  swap interval set to whatever is the default on that platform.  This is done\n *  because some swap interval extensions used by GLFW do not allow the swap\n *  interval to be reset to zero once it has been set to a non-zero value.\n *\n *  @remark Some GPU drivers do not honor the requested swap interval, either\n *  because of a user setting that overrides the application's request or due to\n *  bugs in the driver.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref buffer_swap\n *  @sa @ref glfwSwapBuffers\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup context\n */\nGLFWAPI void glfwSwapInterval(int interval);\n\n/*! @brief Returns whether the specified extension is available.\n *\n *  This function returns whether the specified\n *  [API extension](@ref context_glext) is supported by the current OpenGL or\n *  OpenGL ES context.  It searches both for client API extension and context\n *  creation API extensions.\n *\n *  A context must be current on the calling thread.  Calling this function\n *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error.\n *\n *  As this functions retrieves and searches one or more extension strings each\n *  call, it is recommended that you cache its results if it is going to be used\n *  frequently.  The extension strings will not change during the lifetime of\n *  a context, so there is no danger in doing this.\n *\n *  This function does not apply to Vulkan.  If you are using Vulkan, see @ref\n *  glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties`\n *  and `vkEnumerateDeviceExtensionProperties` instead.\n *\n *  @param[in] extension The ASCII encoded name of the extension.\n *  @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE`\n *  otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref context_glext\n *  @sa @ref glfwGetProcAddress\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup context\n */\nGLFWAPI int glfwExtensionSupported(const char* extension);\n\n/*! @brief Returns the address of the specified function for the current\n *  context.\n *\n *  This function returns the address of the specified OpenGL or OpenGL ES\n *  [core or extension function](@ref context_glext), if it is supported\n *  by the current context.\n *\n *  A context must be current on the calling thread.  Calling this function\n *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error.\n *\n *  This function does not apply to Vulkan.  If you are rendering with Vulkan,\n *  see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and\n *  `vkGetDeviceProcAddr` instead.\n *\n *  @param[in] procname The ASCII encoded name of the function.\n *  @return The address of the function, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark The address of a given function is not guaranteed to be the same\n *  between contexts.\n *\n *  @remark This function may return a non-`NULL` address despite the\n *  associated version or extension not being available.  Always check the\n *  context version or extension string first.\n *\n *  @pointer_lifetime The returned function pointer is valid until the context\n *  is destroyed or the library is terminated.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref context_glext\n *  @sa @ref glfwExtensionSupported\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup context\n */\nGLFWAPI GLFWglproc glfwGetProcAddress(const char* procname);\n\n/*! @brief Returns whether the Vulkan loader and an ICD have been found.\n *\n *  This function returns whether the Vulkan loader and any minimally functional\n *  ICD have been found.\n *\n *  The availability of a Vulkan loader and even an ICD does not by itself\n *  guarantee that surface creation or even instance creation is possible.\n *  For example, on Fermi systems Nvidia will install an ICD that provides no\n *  actual Vulkan support.  Call @ref glfwGetRequiredInstanceExtensions to check\n *  whether the extensions necessary for Vulkan surface creation are available\n *  and @ref glfwGetPhysicalDevicePresentationSupport to check whether a queue\n *  family of a physical device supports image presentation.\n *\n *  @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE`\n *  otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref vulkan_support\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI int glfwVulkanSupported(void);\n\n/*! @brief Returns the Vulkan instance extensions required by GLFW.\n *\n *  This function returns an array of names of Vulkan instance extensions required\n *  by GLFW for creating Vulkan surfaces for GLFW windows.  If successful, the\n *  list will always contains `VK_KHR_surface`, so if you don't require any\n *  additional extensions you can pass this list directly to the\n *  `VkInstanceCreateInfo` struct.\n *\n *  If Vulkan is not available on the machine, this function returns `NULL` and\n *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported\n *  to check whether Vulkan is at least minimally available.\n *\n *  If Vulkan is available but no set of extensions allowing window surface\n *  creation was found, this function returns `NULL`.  You may still use Vulkan\n *  for off-screen rendering and compute work.\n *\n *  @param[out] count Where to store the number of extensions in the returned\n *  array.  This is set to zero if an error occurred.\n *  @return An array of ASCII encoded extension names, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_API_UNAVAILABLE.\n *\n *  @remark Additional extensions may be required by future versions of GLFW.\n *  You should check if any extensions you wish to enable are already in the\n *  returned array, as it is an error to specify an extension more than once in\n *  the `VkInstanceCreateInfo` struct.\n *\n *  @remark @macos This function currently only supports the\n *  `VK_MVK_macos_surface` extension from MoltenVK.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is guaranteed to be valid only until the\n *  library is terminated.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref vulkan_ext\n *  @sa @ref glfwCreateWindowSurface\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count);\n\n#if defined(VK_VERSION_1_0)\n\n/*! @brief Returns the address of the specified Vulkan instance function.\n *\n *  This function returns the address of the specified Vulkan core or extension\n *  function for the specified instance.  If instance is set to `NULL` it can\n *  return any function exported from the Vulkan loader, including at least the\n *  following functions:\n *\n *  - `vkEnumerateInstanceExtensionProperties`\n *  - `vkEnumerateInstanceLayerProperties`\n *  - `vkCreateInstance`\n *  - `vkGetInstanceProcAddr`\n *\n *  If Vulkan is not available on the machine, this function returns `NULL` and\n *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported\n *  to check whether Vulkan is at least minimally available.\n *\n *  This function is equivalent to calling `vkGetInstanceProcAddr` with\n *  a platform-specific query of the Vulkan loader as a fallback.\n *\n *  @param[in] instance The Vulkan instance to query, or `NULL` to retrieve\n *  functions related to instance creation.\n *  @param[in] procname The ASCII encoded name of the function.\n *  @return The address of the function, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_API_UNAVAILABLE.\n *\n *  @pointer_lifetime The returned function pointer is valid until the library\n *  is terminated.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref vulkan_proc\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname);\n\n/*! @brief Returns whether the specified queue family can present images.\n *\n *  This function returns whether the specified queue family of the specified\n *  physical device supports presentation to the platform GLFW was built for.\n *\n *  If Vulkan or the required window surface creation instance extensions are\n *  not available on the machine, or if the specified instance was not created\n *  with the required extensions, this function returns `GLFW_FALSE` and\n *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported\n *  to check whether Vulkan is at least minimally available and @ref\n *  glfwGetRequiredInstanceExtensions to check what instance extensions are\n *  required.\n *\n *  @param[in] instance The instance that the physical device belongs to.\n *  @param[in] device The physical device that the queue family belongs to.\n *  @param[in] queuefamily The index of the queue family to query.\n *  @return `GLFW_TRUE` if the queue family supports presentation, or\n *  `GLFW_FALSE` otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark @macos This function currently always returns `GLFW_TRUE`, as the\n *  `VK_MVK_macos_surface` extension does not provide\n *  a `vkGetPhysicalDevice*PresentationSupport` type function.\n *\n *  @thread_safety This function may be called from any thread.  For\n *  synchronization details of Vulkan objects, see the Vulkan specification.\n *\n *  @sa @ref vulkan_present\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);\n\n/*! @brief Creates a Vulkan surface for the specified window.\n *\n *  This function creates a Vulkan surface for the specified window.\n *\n *  If the Vulkan loader or at least one minimally functional ICD were not found,\n *  this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref\n *  GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported to check whether\n *  Vulkan is at least minimally available.\n *\n *  If the required window surface creation instance extensions are not\n *  available or if the specified instance was not created with these extensions\n *  enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and\n *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref\n *  glfwGetRequiredInstanceExtensions to check what instance extensions are\n *  required.\n *\n *  The window surface must be destroyed before the specified Vulkan instance.\n *  It is the responsibility of the caller to destroy the window surface.  GLFW\n *  does not destroy it for you.  Call `vkDestroySurfaceKHR` to destroy the\n *  surface.\n *\n *  @param[in] instance The Vulkan instance to create the surface in.\n *  @param[in] window The window to create the surface for.\n *  @param[in] allocator The allocator to use, or `NULL` to use the default\n *  allocator.\n *  @param[out] surface Where to store the handle of the surface.  This is set\n *  to `VK_NULL_HANDLE` if an error occurred.\n *  @return `VK_SUCCESS` if successful, or a Vulkan error code if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark If an error occurs before the creation call is made, GLFW returns\n *  the Vulkan error code most appropriate for the error.  Appropriate use of\n *  @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should\n *  eliminate almost all occurrences of these errors.\n *\n *  @remark @macos This function currently only supports the\n *  `VK_MVK_macos_surface` extension from MoltenVK.\n *\n *  @remark @macos This function creates and sets a `CAMetalLayer` instance for\n *  the window content view, which is required for MoltenVK to function.\n *\n *  @thread_safety This function may be called from any thread.  For\n *  synchronization details of Vulkan objects, see the Vulkan specification.\n *\n *  @sa @ref vulkan_surface\n *  @sa @ref glfwGetRequiredInstanceExtensions\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);\n\n#endif /*VK_VERSION_1_0*/\n\n\n/*************************************************************************\n * Global definition cleanup\n *************************************************************************/\n\n/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */\n\n#ifdef GLFW_WINGDIAPI_DEFINED\n #undef WINGDIAPI\n #undef GLFW_WINGDIAPI_DEFINED\n#endif\n\n#ifdef GLFW_CALLBACK_DEFINED\n #undef CALLBACK\n #undef GLFW_CALLBACK_DEFINED\n#endif\n\n/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally\n * defined by some gl.h variants (OpenBSD) so define it after if needed.\n */\n#ifndef GLAPIENTRY\n #define GLAPIENTRY APIENTRY\n#endif\n\n/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _glfw3_h_ */\n\n"
  },
  {
    "path": "external/GLFW/include/GLFW/glfw3native.h",
    "content": "/*************************************************************************\n * GLFW 3.3 - www.glfw.org\n * A library for OpenGL, window and input\n *------------------------------------------------------------------------\n * Copyright (c) 2002-2006 Marcus Geelnard\n * Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would\n *    be appreciated but is not required.\n *\n * 2. Altered source versions must be plainly marked as such, and must not\n *    be misrepresented as being the original software.\n *\n * 3. This notice may not be removed or altered from any source\n *    distribution.\n *\n *************************************************************************/\n\n#ifndef _glfw3_native_h_\n#define _glfw3_native_h_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/*************************************************************************\n * Doxygen documentation\n *************************************************************************/\n\n/*! @file glfw3native.h\n *  @brief The header of the native access functions.\n *\n *  This is the header file of the native access functions.  See @ref native for\n *  more information.\n */\n/*! @defgroup native Native access\n *  @brief Functions related to accessing native handles.\n *\n *  **By using the native access functions you assert that you know what you're\n *  doing and how to fix problems caused by using them.  If you don't, you\n *  shouldn't be using them.**\n *\n *  Before the inclusion of @ref glfw3native.h, you may define zero or more\n *  window system API macro and zero or more context creation API macros.\n *\n *  The chosen backends must match those the library was compiled for.  Failure\n *  to do this will cause a link-time error.\n *\n *  The available window API macros are:\n *  * `GLFW_EXPOSE_NATIVE_WIN32`\n *  * `GLFW_EXPOSE_NATIVE_COCOA`\n *  * `GLFW_EXPOSE_NATIVE_X11`\n *  * `GLFW_EXPOSE_NATIVE_WAYLAND`\n *  * `GLFW_EXPOSE_NATIVE_MIR`\n *\n *  The available context API macros are:\n *  * `GLFW_EXPOSE_NATIVE_WGL`\n *  * `GLFW_EXPOSE_NATIVE_NSGL`\n *  * `GLFW_EXPOSE_NATIVE_GLX`\n *  * `GLFW_EXPOSE_NATIVE_EGL`\n *  * `GLFW_EXPOSE_NATIVE_OSMESA`\n *\n *  These macros select which of the native access functions that are declared\n *  and which platform-specific headers to include.  It is then up your (by\n *  definition platform-specific) code to handle which of these should be\n *  defined.\n */\n\n\n/*************************************************************************\n * System headers and types\n *************************************************************************/\n\n#if defined(GLFW_EXPOSE_NATIVE_WIN32)\n // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for\n // example to allow applications to correctly declare a GL_ARB_debug_output\n // callback) but windows.h assumes no one will define APIENTRY before it does\n #if defined(GLFW_APIENTRY_DEFINED)\n  #undef APIENTRY\n  #undef GLFW_APIENTRY_DEFINED\n #endif\n #include <windows.h>\n#elif defined(GLFW_EXPOSE_NATIVE_COCOA)\n #include <ApplicationServices/ApplicationServices.h>\n #if defined(__OBJC__)\n  #import <Cocoa/Cocoa.h>\n #else\n  typedef void* id;\n #endif\n#elif defined(GLFW_EXPOSE_NATIVE_X11)\n #include <X11/Xlib.h>\n #include <X11/extensions/Xrandr.h>\n#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)\n #include <wayland-client.h>\n#elif defined(GLFW_EXPOSE_NATIVE_MIR)\n #include <mir_toolkit/mir_client_library.h>\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_WGL)\n /* WGL is declared by windows.h */\n#endif\n#if defined(GLFW_EXPOSE_NATIVE_NSGL)\n /* NSGL is declared by Cocoa.h */\n#endif\n#if defined(GLFW_EXPOSE_NATIVE_GLX)\n #include <GL/glx.h>\n#endif\n#if defined(GLFW_EXPOSE_NATIVE_EGL)\n #include <EGL/egl.h>\n#endif\n#if defined(GLFW_EXPOSE_NATIVE_OSMESA)\n #include <GL/osmesa.h>\n#endif\n\n\n/*************************************************************************\n * Functions\n *************************************************************************/\n\n#if defined(GLFW_EXPOSE_NATIVE_WIN32)\n/*! @brief Returns the adapter device name of the specified monitor.\n *\n *  @return The UTF-8 encoded adapter device name (for example `\\\\.\\DISPLAY1`)\n *  of the specified monitor, or `NULL` if an [error](@ref error_handling)\n *  occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);\n\n/*! @brief Returns the display device name of the specified monitor.\n *\n *  @return The UTF-8 encoded display device name (for example\n *  `\\\\.\\DISPLAY1\\Monitor0`) of the specified monitor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the `HWND` of the specified window.\n *\n *  @return The `HWND` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_WGL)\n/*! @brief Returns the `HGLRC` of the specified window.\n *\n *  @return The `HGLRC` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_COCOA)\n/*! @brief Returns the `CGDirectDisplayID` of the specified monitor.\n *\n *  @return The `CGDirectDisplayID` of the specified monitor, or\n *  `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the `NSWindow` of the specified window.\n *\n *  @return The `NSWindow` of the specified window, or `nil` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_NSGL)\n/*! @brief Returns the `NSOpenGLContext` of the specified window.\n *\n *  @return The `NSOpenGLContext` of the specified window, or `nil` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI id glfwGetNSGLContext(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_X11)\n/*! @brief Returns the `Display` used by GLFW.\n *\n *  @return The `Display` used by GLFW, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI Display* glfwGetX11Display(void);\n\n/*! @brief Returns the `RRCrtc` of the specified monitor.\n *\n *  @return The `RRCrtc` of the specified monitor, or `None` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);\n\n/*! @brief Returns the `RROutput` of the specified monitor.\n *\n *  @return The `RROutput` of the specified monitor, or `None` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the `Window` of the specified window.\n *\n *  @return The `Window` of the specified window, or `None` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI Window glfwGetX11Window(GLFWwindow* window);\n\n/*! @brief Sets the current primary selection to the specified string.\n *\n *  @param[in] string A UTF-8 encoded string.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The specified string is copied before this function\n *  returns.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref clipboard\n *  @sa glfwGetX11SelectionString\n *  @sa glfwSetClipboardString\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup native\n */\nGLFWAPI void glfwSetX11SelectionString(const char* string);\n\n/*! @brief Returns the contents of the current primary selection as a string.\n *\n *  If the selection is empty or if its contents cannot be converted, `NULL`\n *  is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated.\n *\n *  @return The contents of the selection as a UTF-8 encoded string, or `NULL`\n *  if an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW. You\n *  should not free it yourself. It is valid until the next call to @ref\n *  glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the\n *  library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref clipboard\n *  @sa glfwSetX11SelectionString\n *  @sa glfwGetClipboardString\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup native\n */\nGLFWAPI const char* glfwGetX11SelectionString(void);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_GLX)\n/*! @brief Returns the `GLXContext` of the specified window.\n *\n *  @return The `GLXContext` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);\n\n/*! @brief Returns the `GLXWindow` of the specified window.\n *\n *  @return The `GLXWindow` of the specified window, or `None` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)\n/*! @brief Returns the `struct wl_display*` used by GLFW.\n *\n *  @return The `struct wl_display*` used by GLFW, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI struct wl_display* glfwGetWaylandDisplay(void);\n\n/*! @brief Returns the `struct wl_output*` of the specified monitor.\n *\n *  @return The `struct wl_output*` of the specified monitor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the main `struct wl_surface*` of the specified window.\n *\n *  @return The main `struct wl_surface*` of the specified window, or `NULL` if\n *  an [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_MIR)\n/*! @brief Returns the `MirConnection*` used by GLFW.\n *\n *  @return The `MirConnection*` used by GLFW, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI MirConnection* glfwGetMirDisplay(void);\n\n/*! @brief Returns the Mir output ID of the specified monitor.\n *\n *  @return The Mir output ID of the specified monitor, or zero if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the `MirWindow*` of the specified window.\n *\n *  @return The `MirWindow*` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI MirWindow* glfwGetMirWindow(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_EGL)\n/*! @brief Returns the `EGLDisplay` used by GLFW.\n *\n *  @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI EGLDisplay glfwGetEGLDisplay(void);\n\n/*! @brief Returns the `EGLContext` of the specified window.\n *\n *  @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);\n\n/*! @brief Returns the `EGLSurface` of the specified window.\n *\n *  @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_OSMESA)\n/*! @brief Retrieves the color buffer associated with the specified window.\n *\n *  @param[in] window The window whose color buffer to retrieve.\n *  @param[out] width Where to store the width of the color buffer, or `NULL`.\n *  @param[out] height Where to store the height of the color buffer, or `NULL`.\n *  @param[out] format Where to store the OSMesa pixel format of the color\n *  buffer, or `NULL`.\n *  @param[out] buffer Where to store the address of the color buffer, or\n *  `NULL`.\n *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup native\n */\nGLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer);\n\n/*! @brief Retrieves the depth buffer associated with the specified window.\n *\n *  @param[in] window The window whose depth buffer to retrieve.\n *  @param[out] width Where to store the width of the depth buffer, or `NULL`.\n *  @param[out] height Where to store the height of the depth buffer, or `NULL`.\n *  @param[out] bytesPerValue Where to store the number of bytes per depth\n *  buffer element, or `NULL`.\n *  @param[out] buffer Where to store the address of the depth buffer, or\n *  `NULL`.\n *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup native\n */\nGLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer);\n\n/*! @brief Returns the `OSMesaContext` of the specified window.\n *\n *  @return The `OSMesaContext` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.3.\n *\n *  @ingroup native\n */\nGLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _glfw3_native_h_ */\n\n"
  },
  {
    "path": "external/GLFW/src/CMakeLists.txt",
    "content": "\nset(common_HEADERS internal.h mappings.h\n                   \"${GLFW_BINARY_DIR}/src/glfw_config.h\"\n                   \"${GLFW_SOURCE_DIR}/include/GLFW/glfw3.h\"\n                   \"${GLFW_SOURCE_DIR}/include/GLFW/glfw3native.h\")\nset(common_SOURCES context.c init.c input.c monitor.c vulkan.c window.c)\n\nif (_GLFW_COCOA)\n    set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h cocoa_joystick.h\n                     posix_thread.h nsgl_context.h egl_context.h osmesa_context.h)\n    set(glfw_SOURCES ${common_SOURCES} cocoa_init.m cocoa_joystick.m\n                     cocoa_monitor.m cocoa_window.m cocoa_time.c posix_thread.c\n                     nsgl_context.m egl_context.c osmesa_context.c)\nelseif (_GLFW_WIN32)\n    set(glfw_HEADERS ${common_HEADERS} win32_platform.h win32_joystick.h\n                     wgl_context.h egl_context.h osmesa_context.h)\n    set(glfw_SOURCES ${common_SOURCES} win32_init.c win32_joystick.c\n                     win32_monitor.c win32_time.c win32_thread.c win32_window.c\n                     wgl_context.c egl_context.c osmesa_context.c)\nelseif (_GLFW_X11)\n    set(glfw_HEADERS ${common_HEADERS} x11_platform.h xkb_unicode.h posix_time.h\n                     posix_thread.h glx_context.h egl_context.h osmesa_context.h)\n    set(glfw_SOURCES ${common_SOURCES} x11_init.c x11_monitor.c x11_window.c\n                     xkb_unicode.c posix_time.c posix_thread.c glx_context.c\n                     egl_context.c osmesa_context.c)\n\n    if (\"${CMAKE_SYSTEM_NAME}\" STREQUAL \"Linux\")\n        set(glfw_HEADERS ${glfw_HEADERS} linux_joystick.h)\n        set(glfw_SOURCES ${glfw_SOURCES} linux_joystick.c)\n    else()\n        set(glfw_HEADERS ${glfw_HEADERS} null_joystick.h)\n        set(glfw_SOURCES ${glfw_SOURCES} null_joystick.c)\n    endif()\nelseif (_GLFW_WAYLAND)\n    set(glfw_HEADERS ${common_HEADERS} wl_platform.h linux_joystick.h\n                     posix_time.h posix_thread.h xkb_unicode.h egl_context.h\n                     osmesa_context.h)\n    set(glfw_SOURCES ${common_SOURCES} wl_init.c wl_monitor.c wl_window.c\n                     linux_joystick.c posix_time.c posix_thread.c xkb_unicode.c\n                     egl_context.c osmesa_context.c)\n\n    ecm_add_wayland_client_protocol(glfw_SOURCES\n        PROTOCOL\n        \"${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml\"\n        BASENAME relative-pointer-unstable-v1)\n    ecm_add_wayland_client_protocol(glfw_SOURCES\n        PROTOCOL\n        \"${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml\"\n        BASENAME pointer-constraints-unstable-v1)\nelseif (_GLFW_MIR)\n    set(glfw_HEADERS ${common_HEADERS} mir_platform.h linux_joystick.h\n                     posix_time.h posix_thread.h xkb_unicode.h egl_context.h\n                     osmesa_context.h)\n    set(glfw_SOURCES ${common_SOURCES} mir_init.c mir_monitor.c mir_window.c\n                     linux_joystick.c posix_time.c posix_thread.c xkb_unicode.c\n                     egl_context.c osmesa_context.c)\nelseif (_GLFW_OSMESA)\n    set(glfw_HEADERS ${common_HEADERS} null_platform.h null_joystick.h\n                     posix_time.h posix_thread.h osmesa_context.h)\n    set(glfw_SOURCES ${common_SOURCES} null_init.c null_monitor.c null_window.c\n                     null_joystick.c posix_time.c posix_thread.c osmesa_context.c)\nendif()\n\nif (APPLE)\n    # For some reason, CMake doesn't know about .m\n    set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C)\nendif()\n\n# Make GCC and Clang warn about declarations that VS 2010 and 2012 won't accept\n# for all source files that VS will build\nif (${CMAKE_C_COMPILER_ID} STREQUAL GNU OR ${CMAKE_C_COMPILER_ID} STREQUAL Clang)\n    if (WIN32)\n        set(windows_SOURCES ${glfw_SOURCES})\n    else()\n        set(windows_SOURCES ${common_SOURCES})\n    endif()\n    set_source_files_properties(${windows_SOURCES} PROPERTIES\n        COMPILE_FLAGS -Wdeclaration-after-statement)\nendif()\n\nadd_library(glfw ${glfw_SOURCES} ${glfw_HEADERS})\nset_target_properties(glfw PROPERTIES\n                      OUTPUT_NAME ${GLFW_LIB_NAME}\n                      VERSION ${GLFW_VERSION}\n                      SOVERSION ${GLFW_VERSION_MAJOR}\n                      POSITION_INDEPENDENT_CODE ON\n                      FOLDER \"GLFW3\")\n\ntarget_compile_definitions(glfw PRIVATE\n                           _GLFW_USE_CONFIG_H\n                           $<$<BOOL:${UNIX}>:_XOPEN_SOURCE=600>)\ntarget_include_directories(glfw PUBLIC\n                           \"$<BUILD_INTERFACE:${GLFW_SOURCE_DIR}/include>\"\n                           \"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>\")\ntarget_include_directories(glfw PRIVATE\n                           \"${GLFW_SOURCE_DIR}/src\"\n                           \"${GLFW_BINARY_DIR}/src\"\n                           ${glfw_INCLUDE_DIRS})\n\n# HACK: When building on MinGW, WINVER and UNICODE need to be defined before\n# the inclusion of stddef.h (by glfw3.h), which is itself included before\n# win32_platform.h.  We define them here until a saner solution can be found\n# NOTE: MinGW-w64 and Visual C++ do /not/ need this hack.\ntarget_compile_definitions(glfw PRIVATE\n                           \"$<$<BOOL:${MINGW}>:UNICODE;WINVER=0x0501>\")\n\n# Enable a reasonable set of warnings (no, -Wextra is not reasonable)\ntarget_compile_options(glfw PRIVATE\n                       \"$<$<C_COMPILER_ID:Clang>:-Wall>\"\n                       \"$<$<C_COMPILER_ID:GNU>:-Wall>\")\n\nif (BUILD_SHARED_LIBS)\n    if (WIN32)\n        if (MINGW)\n            # Remove the lib prefix on the DLL (but not the import library\n            set_target_properties(glfw PROPERTIES PREFIX \"\")\n\n            # Add a suffix to the import library to avoid naming conflicts\n            set_target_properties(glfw PROPERTIES IMPORT_SUFFIX \"dll.a\")\n        else()\n            # Add a suffix to the import library to avoid naming conflicts\n            set_target_properties(glfw PROPERTIES IMPORT_SUFFIX \"dll.lib\")\n        endif()\n    elseif (APPLE)\n        # Add -fno-common to work around a bug in Apple's GCC\n        target_compile_options(glfw PRIVATE \"-fno-common\")\n\n        set_target_properties(glfw PROPERTIES\n                              INSTALL_NAME_DIR \"lib${LIB_SUFFIX}\")\n    elseif (UNIX)\n        # Hide symbols not explicitly tagged for export from the shared library\n        target_compile_options(glfw PRIVATE \"-fvisibility=hidden\")\n    endif()\n\n    target_compile_definitions(glfw INTERFACE GLFW_DLL)\n    target_link_libraries(glfw PRIVATE ${glfw_LIBRARIES})\nelse()\n    target_link_libraries(glfw INTERFACE ${glfw_LIBRARIES})\nendif()\n\nif (MSVC)\n    target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS)\nendif()\n\nif (GLFW_INSTALL)\n    install(TARGETS glfw\n            EXPORT glfwTargets\n            RUNTIME DESTINATION \"bin\"\n            ARCHIVE DESTINATION \"lib${LIB_SUFFIX}\"\n            LIBRARY DESTINATION \"lib${LIB_SUFFIX}\")\nendif()\n\n"
  },
  {
    "path": "external/GLFW/src/cocoa_init.m",
    "content": "//========================================================================\n// GLFW 3.3 macOS - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n#include <sys/param.h> // For MAXPATHLEN\n\n\n// Change to our application bundle's resources directory, if present\n//\nstatic void changeToResourcesDirectory(void)\n{\n    char resourcesPath[MAXPATHLEN];\n\n    CFBundleRef bundle = CFBundleGetMainBundle();\n    if (!bundle)\n        return;\n\n    CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(bundle);\n\n    CFStringRef last = CFURLCopyLastPathComponent(resourcesURL);\n    if (CFStringCompare(CFSTR(\"Resources\"), last, 0) != kCFCompareEqualTo)\n    {\n        CFRelease(last);\n        CFRelease(resourcesURL);\n        return;\n    }\n\n    CFRelease(last);\n\n    if (!CFURLGetFileSystemRepresentation(resourcesURL,\n                                          true,\n                                          (UInt8*) resourcesPath,\n                                          MAXPATHLEN))\n    {\n        CFRelease(resourcesURL);\n        return;\n    }\n\n    CFRelease(resourcesURL);\n\n    chdir(resourcesPath);\n}\n\n// Create key code translation tables\n//\nstatic void createKeyTables(void)\n{\n    int scancode;\n\n    memset(_glfw.ns.keycodes, -1, sizeof(_glfw.ns.keycodes));\n    memset(_glfw.ns.scancodes, -1, sizeof(_glfw.ns.scancodes));\n\n    _glfw.ns.keycodes[0x1D] = GLFW_KEY_0;\n    _glfw.ns.keycodes[0x12] = GLFW_KEY_1;\n    _glfw.ns.keycodes[0x13] = GLFW_KEY_2;\n    _glfw.ns.keycodes[0x14] = GLFW_KEY_3;\n    _glfw.ns.keycodes[0x15] = GLFW_KEY_4;\n    _glfw.ns.keycodes[0x17] = GLFW_KEY_5;\n    _glfw.ns.keycodes[0x16] = GLFW_KEY_6;\n    _glfw.ns.keycodes[0x1A] = GLFW_KEY_7;\n    _glfw.ns.keycodes[0x1C] = GLFW_KEY_8;\n    _glfw.ns.keycodes[0x19] = GLFW_KEY_9;\n    _glfw.ns.keycodes[0x00] = GLFW_KEY_A;\n    _glfw.ns.keycodes[0x0B] = GLFW_KEY_B;\n    _glfw.ns.keycodes[0x08] = GLFW_KEY_C;\n    _glfw.ns.keycodes[0x02] = GLFW_KEY_D;\n    _glfw.ns.keycodes[0x0E] = GLFW_KEY_E;\n    _glfw.ns.keycodes[0x03] = GLFW_KEY_F;\n    _glfw.ns.keycodes[0x05] = GLFW_KEY_G;\n    _glfw.ns.keycodes[0x04] = GLFW_KEY_H;\n    _glfw.ns.keycodes[0x22] = GLFW_KEY_I;\n    _glfw.ns.keycodes[0x26] = GLFW_KEY_J;\n    _glfw.ns.keycodes[0x28] = GLFW_KEY_K;\n    _glfw.ns.keycodes[0x25] = GLFW_KEY_L;\n    _glfw.ns.keycodes[0x2E] = GLFW_KEY_M;\n    _glfw.ns.keycodes[0x2D] = GLFW_KEY_N;\n    _glfw.ns.keycodes[0x1F] = GLFW_KEY_O;\n    _glfw.ns.keycodes[0x23] = GLFW_KEY_P;\n    _glfw.ns.keycodes[0x0C] = GLFW_KEY_Q;\n    _glfw.ns.keycodes[0x0F] = GLFW_KEY_R;\n    _glfw.ns.keycodes[0x01] = GLFW_KEY_S;\n    _glfw.ns.keycodes[0x11] = GLFW_KEY_T;\n    _glfw.ns.keycodes[0x20] = GLFW_KEY_U;\n    _glfw.ns.keycodes[0x09] = GLFW_KEY_V;\n    _glfw.ns.keycodes[0x0D] = GLFW_KEY_W;\n    _glfw.ns.keycodes[0x07] = GLFW_KEY_X;\n    _glfw.ns.keycodes[0x10] = GLFW_KEY_Y;\n    _glfw.ns.keycodes[0x06] = GLFW_KEY_Z;\n\n    _glfw.ns.keycodes[0x27] = GLFW_KEY_APOSTROPHE;\n    _glfw.ns.keycodes[0x2A] = GLFW_KEY_BACKSLASH;\n    _glfw.ns.keycodes[0x2B] = GLFW_KEY_COMMA;\n    _glfw.ns.keycodes[0x18] = GLFW_KEY_EQUAL;\n    _glfw.ns.keycodes[0x32] = GLFW_KEY_GRAVE_ACCENT;\n    _glfw.ns.keycodes[0x21] = GLFW_KEY_LEFT_BRACKET;\n    _glfw.ns.keycodes[0x1B] = GLFW_KEY_MINUS;\n    _glfw.ns.keycodes[0x2F] = GLFW_KEY_PERIOD;\n    _glfw.ns.keycodes[0x1E] = GLFW_KEY_RIGHT_BRACKET;\n    _glfw.ns.keycodes[0x29] = GLFW_KEY_SEMICOLON;\n    _glfw.ns.keycodes[0x2C] = GLFW_KEY_SLASH;\n    _glfw.ns.keycodes[0x0A] = GLFW_KEY_WORLD_1;\n\n    _glfw.ns.keycodes[0x33] = GLFW_KEY_BACKSPACE;\n    _glfw.ns.keycodes[0x39] = GLFW_KEY_CAPS_LOCK;\n    _glfw.ns.keycodes[0x75] = GLFW_KEY_DELETE;\n    _glfw.ns.keycodes[0x7D] = GLFW_KEY_DOWN;\n    _glfw.ns.keycodes[0x77] = GLFW_KEY_END;\n    _glfw.ns.keycodes[0x24] = GLFW_KEY_ENTER;\n    _glfw.ns.keycodes[0x35] = GLFW_KEY_ESCAPE;\n    _glfw.ns.keycodes[0x7A] = GLFW_KEY_F1;\n    _glfw.ns.keycodes[0x78] = GLFW_KEY_F2;\n    _glfw.ns.keycodes[0x63] = GLFW_KEY_F3;\n    _glfw.ns.keycodes[0x76] = GLFW_KEY_F4;\n    _glfw.ns.keycodes[0x60] = GLFW_KEY_F5;\n    _glfw.ns.keycodes[0x61] = GLFW_KEY_F6;\n    _glfw.ns.keycodes[0x62] = GLFW_KEY_F7;\n    _glfw.ns.keycodes[0x64] = GLFW_KEY_F8;\n    _glfw.ns.keycodes[0x65] = GLFW_KEY_F9;\n    _glfw.ns.keycodes[0x6D] = GLFW_KEY_F10;\n    _glfw.ns.keycodes[0x67] = GLFW_KEY_F11;\n    _glfw.ns.keycodes[0x6F] = GLFW_KEY_F12;\n    _glfw.ns.keycodes[0x69] = GLFW_KEY_F13;\n    _glfw.ns.keycodes[0x6B] = GLFW_KEY_F14;\n    _glfw.ns.keycodes[0x71] = GLFW_KEY_F15;\n    _glfw.ns.keycodes[0x6A] = GLFW_KEY_F16;\n    _glfw.ns.keycodes[0x40] = GLFW_KEY_F17;\n    _glfw.ns.keycodes[0x4F] = GLFW_KEY_F18;\n    _glfw.ns.keycodes[0x50] = GLFW_KEY_F19;\n    _glfw.ns.keycodes[0x5A] = GLFW_KEY_F20;\n    _glfw.ns.keycodes[0x73] = GLFW_KEY_HOME;\n    _glfw.ns.keycodes[0x72] = GLFW_KEY_INSERT;\n    _glfw.ns.keycodes[0x7B] = GLFW_KEY_LEFT;\n    _glfw.ns.keycodes[0x3A] = GLFW_KEY_LEFT_ALT;\n    _glfw.ns.keycodes[0x3B] = GLFW_KEY_LEFT_CONTROL;\n    _glfw.ns.keycodes[0x38] = GLFW_KEY_LEFT_SHIFT;\n    _glfw.ns.keycodes[0x37] = GLFW_KEY_LEFT_SUPER;\n    _glfw.ns.keycodes[0x6E] = GLFW_KEY_MENU;\n    _glfw.ns.keycodes[0x47] = GLFW_KEY_NUM_LOCK;\n    _glfw.ns.keycodes[0x79] = GLFW_KEY_PAGE_DOWN;\n    _glfw.ns.keycodes[0x74] = GLFW_KEY_PAGE_UP;\n    _glfw.ns.keycodes[0x7C] = GLFW_KEY_RIGHT;\n    _glfw.ns.keycodes[0x3D] = GLFW_KEY_RIGHT_ALT;\n    _glfw.ns.keycodes[0x3E] = GLFW_KEY_RIGHT_CONTROL;\n    _glfw.ns.keycodes[0x3C] = GLFW_KEY_RIGHT_SHIFT;\n    _glfw.ns.keycodes[0x36] = GLFW_KEY_RIGHT_SUPER;\n    _glfw.ns.keycodes[0x31] = GLFW_KEY_SPACE;\n    _glfw.ns.keycodes[0x30] = GLFW_KEY_TAB;\n    _glfw.ns.keycodes[0x7E] = GLFW_KEY_UP;\n\n    _glfw.ns.keycodes[0x52] = GLFW_KEY_KP_0;\n    _glfw.ns.keycodes[0x53] = GLFW_KEY_KP_1;\n    _glfw.ns.keycodes[0x54] = GLFW_KEY_KP_2;\n    _glfw.ns.keycodes[0x55] = GLFW_KEY_KP_3;\n    _glfw.ns.keycodes[0x56] = GLFW_KEY_KP_4;\n    _glfw.ns.keycodes[0x57] = GLFW_KEY_KP_5;\n    _glfw.ns.keycodes[0x58] = GLFW_KEY_KP_6;\n    _glfw.ns.keycodes[0x59] = GLFW_KEY_KP_7;\n    _glfw.ns.keycodes[0x5B] = GLFW_KEY_KP_8;\n    _glfw.ns.keycodes[0x5C] = GLFW_KEY_KP_9;\n    _glfw.ns.keycodes[0x45] = GLFW_KEY_KP_ADD;\n    _glfw.ns.keycodes[0x41] = GLFW_KEY_KP_DECIMAL;\n    _glfw.ns.keycodes[0x4B] = GLFW_KEY_KP_DIVIDE;\n    _glfw.ns.keycodes[0x4C] = GLFW_KEY_KP_ENTER;\n    _glfw.ns.keycodes[0x51] = GLFW_KEY_KP_EQUAL;\n    _glfw.ns.keycodes[0x43] = GLFW_KEY_KP_MULTIPLY;\n    _glfw.ns.keycodes[0x4E] = GLFW_KEY_KP_SUBTRACT;\n\n    for (scancode = 0;  scancode < 256;  scancode++)\n    {\n        // Store the reverse translation for faster key name lookup\n        if (_glfw.ns.keycodes[scancode] >= 0)\n            _glfw.ns.scancodes[_glfw.ns.keycodes[scancode]] = scancode;\n    }\n}\n\n// Retrieve Unicode data for the current keyboard layout\n//\nstatic GLFWbool updateUnicodeDataNS(void)\n{\n    if (_glfw.ns.inputSource)\n    {\n        CFRelease(_glfw.ns.inputSource);\n        _glfw.ns.inputSource = NULL;\n        _glfw.ns.unicodeData = nil;\n    }\n\n    _glfw.ns.inputSource = TISCopyCurrentKeyboardLayoutInputSource();\n    if (!_glfw.ns.inputSource)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to retrieve keyboard layout input source\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.ns.unicodeData =\n        TISGetInputSourceProperty(_glfw.ns.inputSource,\n                                  kTISPropertyUnicodeKeyLayoutData);\n    if (!_glfw.ns.unicodeData)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to retrieve keyboard layout Unicode data\");\n        return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\n// Load HIToolbox.framework and the TIS symbols we need from it\n//\nstatic GLFWbool initializeTIS(void)\n{\n    // This works only because Cocoa has already loaded it properly\n    _glfw.ns.tis.bundle =\n        CFBundleGetBundleWithIdentifier(CFSTR(\"com.apple.HIToolbox\"));\n    if (!_glfw.ns.tis.bundle)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to load HIToolbox.framework\");\n        return GLFW_FALSE;\n    }\n\n    CFStringRef* kPropertyUnicodeKeyLayoutData =\n        CFBundleGetDataPointerForName(_glfw.ns.tis.bundle,\n                                      CFSTR(\"kTISPropertyUnicodeKeyLayoutData\"));\n    _glfw.ns.tis.CopyCurrentKeyboardLayoutInputSource =\n        CFBundleGetFunctionPointerForName(_glfw.ns.tis.bundle,\n                                          CFSTR(\"TISCopyCurrentKeyboardLayoutInputSource\"));\n    _glfw.ns.tis.GetInputSourceProperty =\n        CFBundleGetFunctionPointerForName(_glfw.ns.tis.bundle,\n                                          CFSTR(\"TISGetInputSourceProperty\"));\n    _glfw.ns.tis.GetKbdType =\n        CFBundleGetFunctionPointerForName(_glfw.ns.tis.bundle,\n                                          CFSTR(\"LMGetKbdType\"));\n\n    if (!kPropertyUnicodeKeyLayoutData ||\n        !TISCopyCurrentKeyboardLayoutInputSource ||\n        !TISGetInputSourceProperty ||\n        !LMGetKbdType)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to load TIS API symbols\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.ns.tis.kPropertyUnicodeKeyLayoutData =\n        *kPropertyUnicodeKeyLayoutData;\n\n    return updateUnicodeDataNS();\n}\n\n@interface GLFWLayoutListener : NSObject\n@end\n\n@implementation GLFWLayoutListener\n\n- (void)selectedKeyboardInputSourceChanged:(NSObject* )object\n{\n    updateUnicodeDataNS();\n}\n\n@end\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformInit(void)\n{\n    _glfw.ns.autoreleasePool = [[NSAutoreleasePool alloc] init];\n\n    if (_glfw.hints.init.ns.chdir)\n        changeToResourcesDirectory();\n\n    _glfw.ns.listener = [[GLFWLayoutListener alloc] init];\n    [[NSNotificationCenter defaultCenter]\n        addObserver:_glfw.ns.listener\n           selector:@selector(selectedKeyboardInputSourceChanged:)\n               name:NSTextInputContextKeyboardSelectionDidChangeNotification\n             object:nil];\n\n    createKeyTables();\n\n    _glfw.ns.eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);\n    if (!_glfw.ns.eventSource)\n        return GLFW_FALSE;\n\n    CGEventSourceSetLocalEventsSuppressionInterval(_glfw.ns.eventSource, 0.0);\n\n    if (!initializeTIS())\n        return GLFW_FALSE;\n\n    _glfwInitTimerNS();\n    _glfwInitJoysticksNS();\n\n    _glfwPollMonitorsNS();\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformTerminate(void)\n{\n    if (_glfw.ns.inputSource)\n    {\n        CFRelease(_glfw.ns.inputSource);\n        _glfw.ns.inputSource = NULL;\n        _glfw.ns.unicodeData = nil;\n    }\n\n    if (_glfw.ns.eventSource)\n    {\n        CFRelease(_glfw.ns.eventSource);\n        _glfw.ns.eventSource = NULL;\n    }\n\n    if (_glfw.ns.delegate)\n    {\n        [NSApp setDelegate:nil];\n        [_glfw.ns.delegate release];\n        _glfw.ns.delegate = nil;\n    }\n\n    if (_glfw.ns.listener)\n    {\n        [[NSNotificationCenter defaultCenter]\n            removeObserver:_glfw.ns.listener\n                      name:NSTextInputContextKeyboardSelectionDidChangeNotification\n                    object:nil];\n        [[NSNotificationCenter defaultCenter]\n            removeObserver:_glfw.ns.listener];\n        [_glfw.ns.listener release];\n        _glfw.ns.listener = nil;\n    }\n\n    free(_glfw.ns.clipboardString);\n\n    _glfwTerminateNSGL();\n    _glfwTerminateJoysticksNS();\n\n    [_glfw.ns.autoreleasePool release];\n    _glfw.ns.autoreleasePool = nil;\n}\n\nconst char* _glfwPlatformGetVersionString(void)\n{\n    return _GLFW_VERSION_NUMBER \" Cocoa NSGL\"\n#if defined(_GLFW_BUILD_DLL)\n        \" dynamic\"\n#endif\n        ;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/cocoa_joystick.h",
    "content": "//========================================================================\n// GLFW 3.3 Cocoa - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <IOKit/IOKitLib.h>\n#include <IOKit/IOCFPlugIn.h>\n#include <IOKit/hid/IOHIDLib.h>\n#include <IOKit/hid/IOHIDKeys.h>\n\n#define _GLFW_PLATFORM_JOYSTICK_STATE         _GLFWjoystickNS ns\n#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE\n\n#define _GLFW_PLATFORM_MAPPING_NAME \"Mac OS X\"\n\n// Cocoa-specific per-joystick data\n//\ntypedef struct _GLFWjoystickNS\n{\n    IOHIDDeviceRef      device;\n    CFMutableArrayRef   axes;\n    CFMutableArrayRef   buttons;\n    CFMutableArrayRef   hats;\n} _GLFWjoystickNS;\n\n\nvoid _glfwInitJoysticksNS(void);\nvoid _glfwTerminateJoysticksNS(void);\n\n"
  },
  {
    "path": "external/GLFW/src/cocoa_joystick.m",
    "content": "//========================================================================\n// GLFW 3.3 Cocoa - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>\n// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <unistd.h>\n#include <ctype.h>\n#include <string.h>\n\n#include <mach/mach.h>\n#include <mach/mach_error.h>\n\n#include <CoreFoundation/CoreFoundation.h>\n#include <Kernel/IOKit/hidsystem/IOHIDUsageTables.h>\n\n\n// Joystick element information\n//\ntypedef struct _GLFWjoyelementNS\n{\n    IOHIDElementRef native;\n    uint32_t        usage;\n    int             index;\n    long            minimum;\n    long            maximum;\n\n} _GLFWjoyelementNS;\n\n\n// Returns the value of the specified element of the specified joystick\n//\nstatic long getElementValue(_GLFWjoystick* js, _GLFWjoyelementNS* element)\n{\n    IOHIDValueRef valueRef;\n    long value = 0;\n\n    if (js->ns.device)\n    {\n        if (IOHIDDeviceGetValue(js->ns.device,\n                                element->native,\n                                &valueRef) == kIOReturnSuccess)\n        {\n            value = IOHIDValueGetIntegerValue(valueRef);\n        }\n    }\n\n    return value;\n}\n\n// Comparison function for matching the SDL element order\n//\nstatic CFComparisonResult compareElements(const void* fp,\n                                          const void* sp,\n                                          void* user)\n{\n    const _GLFWjoyelementNS* fe = fp;\n    const _GLFWjoyelementNS* se = sp;\n    if (fe->usage < se->usage)\n        return kCFCompareLessThan;\n    if (fe->usage > se->usage)\n        return kCFCompareGreaterThan;\n    if (fe->index < se->index)\n        return kCFCompareLessThan;\n    if (fe->index > se->index)\n        return kCFCompareGreaterThan;\n    return kCFCompareEqualTo;\n}\n\n// Removes the specified joystick\n//\nstatic void closeJoystick(_GLFWjoystick* js)\n{\n    int i;\n\n    if (!js->present)\n        return;\n\n    for (i = 0;  i < CFArrayGetCount(js->ns.axes);  i++)\n        free((void*) CFArrayGetValueAtIndex(js->ns.axes, i));\n    CFRelease(js->ns.axes);\n\n    for (i = 0;  i < CFArrayGetCount(js->ns.buttons);  i++)\n        free((void*) CFArrayGetValueAtIndex(js->ns.buttons, i));\n    CFRelease(js->ns.buttons);\n\n    for (i = 0;  i < CFArrayGetCount(js->ns.hats);  i++)\n        free((void*) CFArrayGetValueAtIndex(js->ns.hats, i));\n    CFRelease(js->ns.hats);\n\n    _glfwFreeJoystick(js);\n    _glfwInputJoystick(js, GLFW_DISCONNECTED);\n}\n\n// Callback for user-initiated joystick addition\n//\nstatic void matchCallback(void* context,\n                          IOReturn result,\n                          void* sender,\n                          IOHIDDeviceRef device)\n{\n    int jid;\n    char name[256];\n    char guid[33];\n    CFIndex i;\n    CFTypeRef property;\n    uint32_t vendor = 0, product = 0, version = 0;\n    _GLFWjoystick* js;\n    CFMutableArrayRef axes, buttons, hats;\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        if (_glfw.joysticks[jid].ns.device == device)\n            return;\n    }\n\n    axes    = CFArrayCreateMutable(NULL, 0, NULL);\n    buttons = CFArrayCreateMutable(NULL, 0, NULL);\n    hats    = CFArrayCreateMutable(NULL, 0, NULL);\n\n    property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey));\n    if (property)\n    {\n        CFStringGetCString(property,\n                           name,\n                           sizeof(name),\n                           kCFStringEncodingUTF8);\n    }\n    else\n        strncpy(name, \"Unknown\", sizeof(name));\n\n    property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVendorIDKey));\n    if (property)\n        CFNumberGetValue(property, kCFNumberSInt32Type, &vendor);\n\n    property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey));\n    if (property)\n        CFNumberGetValue(property, kCFNumberSInt32Type, &product);\n\n    property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVersionNumberKey));\n    if (property)\n        CFNumberGetValue(property, kCFNumberSInt32Type, &version);\n\n    // Generate a joystick GUID that matches the SDL 2.0.5+ one\n    if (vendor && product)\n    {\n        sprintf(guid, \"03000000%02x%02x0000%02x%02x0000%02x%02x0000\",\n                (uint8_t) vendor, (uint8_t) (vendor >> 8),\n                (uint8_t) product, (uint8_t) (product >> 8),\n                (uint8_t) version, (uint8_t) (version >> 8));\n    }\n    else\n    {\n        sprintf(guid, \"05000000%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x00\",\n                name[0], name[1], name[2], name[3],\n                name[4], name[5], name[6], name[7],\n                name[8], name[9], name[10]);\n    }\n\n    CFArrayRef elements =\n        IOHIDDeviceCopyMatchingElements(device, NULL, kIOHIDOptionsTypeNone);\n\n    for (i = 0;  i < CFArrayGetCount(elements);  i++)\n    {\n        IOHIDElementRef native = (IOHIDElementRef)\n            CFArrayGetValueAtIndex(elements, i);\n        if (CFGetTypeID(native) != IOHIDElementGetTypeID())\n            continue;\n\n        const IOHIDElementType type = IOHIDElementGetType(native);\n        if ((type != kIOHIDElementTypeInput_Axis) &&\n            (type != kIOHIDElementTypeInput_Button) &&\n            (type != kIOHIDElementTypeInput_Misc))\n        {\n            continue;\n        }\n\n        CFMutableArrayRef target = NULL;\n\n        const uint32_t usage = IOHIDElementGetUsage(native);\n        const uint32_t page = IOHIDElementGetUsagePage(native);\n        if (page == kHIDPage_GenericDesktop)\n        {\n            switch (usage)\n            {\n                case kHIDUsage_GD_X:\n                case kHIDUsage_GD_Y:\n                case kHIDUsage_GD_Z:\n                case kHIDUsage_GD_Rx:\n                case kHIDUsage_GD_Ry:\n                case kHIDUsage_GD_Rz:\n                case kHIDUsage_GD_Slider:\n                case kHIDUsage_GD_Dial:\n                case kHIDUsage_GD_Wheel:\n                    target = axes;\n                    break;\n                case kHIDUsage_GD_Hatswitch:\n                    target = hats;\n                    break;\n            }\n        }\n        else if (page == kHIDPage_Button)\n            target = buttons;\n\n        if (target)\n        {\n            _GLFWjoyelementNS* element = calloc(1, sizeof(_GLFWjoyelementNS));\n            element->native  = native;\n            element->usage   = usage;\n            element->index   = (int) CFArrayGetCount(target);\n            element->minimum = IOHIDElementGetLogicalMin(native);\n            element->maximum = IOHIDElementGetLogicalMax(native);\n            CFArrayAppendValue(target, element);\n        }\n    }\n\n    CFRelease(elements);\n\n    CFArraySortValues(axes, CFRangeMake(0, CFArrayGetCount(axes)),\n                      compareElements, NULL);\n    CFArraySortValues(buttons, CFRangeMake(0, CFArrayGetCount(buttons)),\n                      compareElements, NULL);\n    CFArraySortValues(hats, CFRangeMake(0, CFArrayGetCount(hats)),\n                      compareElements, NULL);\n\n    js = _glfwAllocJoystick(name, guid,\n                            CFArrayGetCount(axes),\n                            CFArrayGetCount(buttons),\n                            CFArrayGetCount(hats));\n\n    js->ns.device  = device;\n    js->ns.axes    = axes;\n    js->ns.buttons = buttons;\n    js->ns.hats    = hats;\n\n    _glfwInputJoystick(js, GLFW_CONNECTED);\n}\n\n// Callback for user-initiated joystick removal\n//\nstatic void removeCallback(void* context,\n                           IOReturn result,\n                           void* sender,\n                           IOHIDDeviceRef device)\n{\n    int jid;\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        if (_glfw.joysticks[jid].ns.device == device)\n        {\n            closeJoystick(_glfw.joysticks + jid);\n            break;\n        }\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialize joystick interface\n//\nvoid _glfwInitJoysticksNS(void)\n{\n    CFMutableArrayRef matching;\n    const long usages[] =\n    {\n        kHIDUsage_GD_Joystick,\n        kHIDUsage_GD_GamePad,\n        kHIDUsage_GD_MultiAxisController\n    };\n\n    _glfw.ns.hidManager = IOHIDManagerCreate(kCFAllocatorDefault,\n                                             kIOHIDOptionsTypeNone);\n\n    matching = CFArrayCreateMutable(kCFAllocatorDefault,\n                                    0,\n                                    &kCFTypeArrayCallBacks);\n    if (!matching)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR, \"Cocoa: Failed to create array\");\n        return;\n    }\n\n    for (int i = 0;  i < sizeof(usages) / sizeof(long);  i++)\n    {\n        const long page = kHIDPage_GenericDesktop;\n\n        CFMutableDictionaryRef dict =\n            CFDictionaryCreateMutable(kCFAllocatorDefault,\n                                      0,\n                                      &kCFTypeDictionaryKeyCallBacks,\n                                      &kCFTypeDictionaryValueCallBacks);\n        if (!dict)\n            continue;\n\n        CFNumberRef pageRef = CFNumberCreate(kCFAllocatorDefault,\n                                             kCFNumberLongType,\n                                             &page);\n        CFNumberRef usageRef = CFNumberCreate(kCFAllocatorDefault,\n                                              kCFNumberLongType,\n                                              &usages[i]);\n        if (pageRef && usageRef)\n        {\n            CFDictionarySetValue(dict,\n                                 CFSTR(kIOHIDDeviceUsagePageKey),\n                                 pageRef);\n            CFDictionarySetValue(dict,\n                                 CFSTR(kIOHIDDeviceUsageKey),\n                                 usageRef);\n            CFArrayAppendValue(matching, dict);\n        }\n\n        if (pageRef)\n            CFRelease(pageRef);\n        if (usageRef)\n            CFRelease(usageRef);\n\n        CFRelease(dict);\n    }\n\n    IOHIDManagerSetDeviceMatchingMultiple(_glfw.ns.hidManager, matching);\n    CFRelease(matching);\n\n    IOHIDManagerRegisterDeviceMatchingCallback(_glfw.ns.hidManager,\n                                               &matchCallback, NULL);\n    IOHIDManagerRegisterDeviceRemovalCallback(_glfw.ns.hidManager,\n                                              &removeCallback, NULL);\n    IOHIDManagerScheduleWithRunLoop(_glfw.ns.hidManager,\n                                    CFRunLoopGetMain(),\n                                    kCFRunLoopDefaultMode);\n    IOHIDManagerOpen(_glfw.ns.hidManager, kIOHIDOptionsTypeNone);\n\n    // Execute the run loop once in order to register any initially-attached\n    // joysticks\n    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false);\n}\n\n// Close all opened joystick handles\n//\nvoid _glfwTerminateJoysticksNS(void)\n{\n    int jid;\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n        closeJoystick(_glfw.joysticks + jid);\n\n    CFRelease(_glfw.ns.hidManager);\n    _glfw.ns.hidManager = NULL;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)\n{\n    if (mode & _GLFW_POLL_AXES)\n    {\n        CFIndex i;\n\n        for (i = 0;  i < CFArrayGetCount(js->ns.axes);  i++)\n        {\n            _GLFWjoyelementNS* axis = (_GLFWjoyelementNS*)\n                CFArrayGetValueAtIndex(js->ns.axes, i);\n\n            const long raw = getElementValue(js, axis);\n            // Perform auto calibration\n            if (raw < axis->minimum)\n                axis->minimum = raw;\n            if (raw > axis->maximum)\n                axis->maximum = raw;\n\n            const long delta = axis->maximum - axis->minimum;\n            if (delta == 0)\n                _glfwInputJoystickAxis(js, i, 0.f);\n            else\n            {\n                const float value = (2.f * (raw - axis->minimum) / delta) - 1.f;\n                _glfwInputJoystickAxis(js, i, value);\n            }\n        }\n    }\n\n    if (mode & _GLFW_POLL_BUTTONS)\n    {\n        CFIndex i;\n\n        for (i = 0;  i < CFArrayGetCount(js->ns.buttons);  i++)\n        {\n            _GLFWjoyelementNS* button = (_GLFWjoyelementNS*)\n                CFArrayGetValueAtIndex(js->ns.buttons, i);\n            const char value = getElementValue(js, button) - button->minimum;\n            _glfwInputJoystickButton(js, i, value);\n        }\n\n        for (i = 0;  i < CFArrayGetCount(js->ns.hats);  i++)\n        {\n            const int states[9] =\n            {\n                GLFW_HAT_UP,\n                GLFW_HAT_RIGHT_UP,\n                GLFW_HAT_RIGHT,\n                GLFW_HAT_RIGHT_DOWN,\n                GLFW_HAT_DOWN,\n                GLFW_HAT_LEFT_DOWN,\n                GLFW_HAT_LEFT,\n                GLFW_HAT_LEFT_UP,\n                GLFW_HAT_CENTERED\n            };\n\n            _GLFWjoyelementNS* hat = (_GLFWjoyelementNS*)\n                CFArrayGetValueAtIndex(js->ns.hats, i);\n            long state = getElementValue(js, hat) - hat->minimum;\n            if (state < 0 || state > 8)\n                state = 8;\n\n            _glfwInputJoystickHat(js, i, states[state]);\n        }\n    }\n\n    return js->present;\n}\n\nvoid _glfwPlatformUpdateGamepadGUID(char* guid)\n{\n    if ((strncmp(guid + 4, \"000000000000\", 12) == 0) &&\n        (strncmp(guid + 20, \"000000000000\", 12) == 0))\n    {\n        char original[33];\n        strcpy(original, guid);\n        sprintf(guid, \"03000000%.4s0000%.4s000000000000\",\n                original, original + 16);\n    }\n}\n\n"
  },
  {
    "path": "external/GLFW/src/cocoa_monitor.m",
    "content": "//========================================================================\n// GLFW 3.3 macOS - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdlib.h>\n#include <limits.h>\n\n#include <IOKit/graphics/IOGraphicsLib.h>\n#include <CoreVideo/CVBase.h>\n#include <CoreVideo/CVDisplayLink.h>\n#include <ApplicationServices/ApplicationServices.h>\n\n\n// Get the name of the specified display, or NULL\n//\nstatic char* getDisplayName(CGDirectDisplayID displayID)\n{\n    io_iterator_t it;\n    io_service_t service;\n    CFDictionaryRef info;\n\n    if (IOServiceGetMatchingServices(kIOMasterPortDefault,\n                                     IOServiceMatching(\"IODisplayConnect\"),\n                                     &it) != 0)\n    {\n        // This may happen if a desktop Mac is running headless\n        return NULL;\n    }\n\n    while ((service = IOIteratorNext(it)) != 0)\n    {\n        info = IODisplayCreateInfoDictionary(service,\n                                             kIODisplayOnlyPreferredName);\n\n        CFNumberRef vendorIDRef =\n            CFDictionaryGetValue(info, CFSTR(kDisplayVendorID));\n        CFNumberRef productIDRef =\n            CFDictionaryGetValue(info, CFSTR(kDisplayProductID));\n        if (!vendorIDRef || !productIDRef)\n        {\n            CFRelease(info);\n            continue;\n        }\n\n        unsigned int vendorID, productID;\n        CFNumberGetValue(vendorIDRef, kCFNumberIntType, &vendorID);\n        CFNumberGetValue(productIDRef, kCFNumberIntType, &productID);\n\n        if (CGDisplayVendorNumber(displayID) == vendorID &&\n            CGDisplayModelNumber(displayID) == productID)\n        {\n            // Info dictionary is used and freed below\n            break;\n        }\n\n        CFRelease(info);\n    }\n\n    IOObjectRelease(it);\n\n    if (!service)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to find service port for display\");\n        return NULL;\n    }\n\n    CFDictionaryRef names =\n        CFDictionaryGetValue(info, CFSTR(kDisplayProductName));\n\n    CFStringRef nameRef;\n\n    if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR(\"en_US\"),\n                                                 (const void**) &nameRef))\n    {\n        // This may happen if a desktop Mac is running headless\n        CFRelease(info);\n        return NULL;\n    }\n\n    const CFIndex size =\n        CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef),\n                                          kCFStringEncodingUTF8);\n    char* name = calloc(size + 1, 1);\n    CFStringGetCString(nameRef, name, size, kCFStringEncodingUTF8);\n\n    CFRelease(info);\n    return name;\n}\n\n// Check whether the display mode should be included in enumeration\n//\nstatic GLFWbool modeIsGood(CGDisplayModeRef mode)\n{\n    uint32_t flags = CGDisplayModeGetIOFlags(mode);\n\n    if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag))\n        return GLFW_FALSE;\n    if (flags & kDisplayModeInterlacedFlag)\n        return GLFW_FALSE;\n    if (flags & kDisplayModeStretchedFlag)\n        return GLFW_FALSE;\n\n#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100\n    CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);\n    if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) &&\n        CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0))\n    {\n        CFRelease(format);\n        return GLFW_FALSE;\n    }\n\n    CFRelease(format);\n#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */\n    return GLFW_TRUE;\n}\n\n// Convert Core Graphics display mode to GLFW video mode\n//\nstatic GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,\n                                            CVDisplayLinkRef link)\n{\n    GLFWvidmode result;\n    result.width = (int) CGDisplayModeGetWidth(mode);\n    result.height = (int) CGDisplayModeGetHeight(mode);\n    result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode);\n\n    if (result.refreshRate == 0)\n    {\n        const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);\n        if (!(time.flags & kCVTimeIsIndefinite))\n            result.refreshRate = (int) (time.timeScale / (double) time.timeValue);\n    }\n\n#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100\n    CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);\n    if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0)\n    {\n        result.redBits = 5;\n        result.greenBits = 5;\n        result.blueBits = 5;\n    }\n    else\n#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */\n    {\n        result.redBits = 8;\n        result.greenBits = 8;\n        result.blueBits = 8;\n    }\n\n#if MAC_OS_X_VERSION_MAX_ALLOWED <= 101100\n    CFRelease(format);\n#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */\n    return result;\n}\n\n// Starts reservation for display fading\n//\nstatic CGDisplayFadeReservationToken beginFadeReservation(void)\n{\n    CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken;\n\n    if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess)\n    {\n        CGDisplayFade(token, 0.3,\n                      kCGDisplayBlendNormal,\n                      kCGDisplayBlendSolidColor,\n                      0.0, 0.0, 0.0,\n                      TRUE);\n    }\n\n    return token;\n}\n\n// Ends reservation for display fading\n//\nstatic void endFadeReservation(CGDisplayFadeReservationToken token)\n{\n    if (token != kCGDisplayFadeReservationInvalidToken)\n    {\n        CGDisplayFade(token, 0.5,\n                      kCGDisplayBlendSolidColor,\n                      kCGDisplayBlendNormal,\n                      0.0, 0.0, 0.0,\n                      FALSE);\n        CGReleaseDisplayFadeReservation(token);\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Poll for changes in the set of connected monitors\n//\nvoid _glfwPollMonitorsNS(void)\n{\n    uint32_t i, j, displayCount, disconnectedCount;\n    CGDirectDisplayID* displays;\n    _GLFWmonitor** disconnected = NULL;\n\n    CGGetOnlineDisplayList(0, NULL, &displayCount);\n    displays = calloc(displayCount, sizeof(CGDirectDisplayID));\n    CGGetOnlineDisplayList(displayCount, displays, &displayCount);\n\n    disconnectedCount = _glfw.monitorCount;\n    if (disconnectedCount)\n    {\n        disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*));\n        memcpy(disconnected,\n               _glfw.monitors,\n               _glfw.monitorCount * sizeof(_GLFWmonitor*));\n    }\n\n    for (i = 0;  i < displayCount;  i++)\n    {\n        _GLFWmonitor* monitor;\n        const uint32_t unitNumber = CGDisplayUnitNumber(displays[i]);\n\n        if (CGDisplayIsAsleep(displays[i]))\n            continue;\n\n        for (j = 0;  j < disconnectedCount;  j++)\n        {\n            // HACK: Compare unit numbers instead of display IDs to work around\n            //       display replacement on machines with automatic graphics\n            //       switching\n            if (disconnected[j] && disconnected[j]->ns.unitNumber == unitNumber)\n            {\n                disconnected[j] = NULL;\n                break;\n            }\n        }\n\n        const CGSize size = CGDisplayScreenSize(displays[i]);\n        char* name = getDisplayName(displays[i]);\n        if (!name)\n            name = strdup(\"Unknown\");\n\n        monitor = _glfwAllocMonitor(name, size.width, size.height);\n        monitor->ns.displayID  = displays[i];\n        monitor->ns.unitNumber = unitNumber;\n\n        free(name);\n\n        _glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST);\n    }\n\n    for (i = 0;  i < disconnectedCount;  i++)\n    {\n        if (disconnected[i])\n            _glfwInputMonitor(disconnected[i], GLFW_DISCONNECTED, 0);\n    }\n\n    free(disconnected);\n    free(displays);\n}\n\n// Change the current video mode\n//\nGLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired)\n{\n    CFArrayRef modes;\n    CFIndex count, i;\n    CVDisplayLinkRef link;\n    CGDisplayModeRef native = NULL;\n    GLFWvidmode current;\n    const GLFWvidmode* best;\n\n    best = _glfwChooseVideoMode(monitor, desired);\n    _glfwPlatformGetVideoMode(monitor, &current);\n    if (_glfwCompareVideoModes(&current, best) == 0)\n        return GLFW_TRUE;\n\n    CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);\n\n    modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);\n    count = CFArrayGetCount(modes);\n\n    for (i = 0;  i < count;  i++)\n    {\n        CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);\n        if (!modeIsGood(dm))\n            continue;\n\n        const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);\n        if (_glfwCompareVideoModes(best, &mode) == 0)\n        {\n            native = dm;\n            break;\n        }\n    }\n\n    if (native)\n    {\n        if (monitor->ns.previousMode == NULL)\n            monitor->ns.previousMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);\n\n        CGDisplayFadeReservationToken token = beginFadeReservation();\n        CGDisplaySetDisplayMode(monitor->ns.displayID, native, NULL);\n        endFadeReservation(token);\n    }\n\n    CFRelease(modes);\n    CVDisplayLinkRelease(link);\n\n    if (!native)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Monitor mode list changed\");\n        return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\n// Restore the previously saved (original) video mode\n//\nvoid _glfwRestoreVideoModeNS(_GLFWmonitor* monitor)\n{\n    if (monitor->ns.previousMode)\n    {\n        CGDisplayFadeReservationToken token = beginFadeReservation();\n        CGDisplaySetDisplayMode(monitor->ns.displayID,\n                                monitor->ns.previousMode, NULL);\n        endFadeReservation(token);\n\n        CGDisplayModeRelease(monitor->ns.previousMode);\n        monitor->ns.previousMode = NULL;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)\n{\n    const CGRect bounds = CGDisplayBounds(monitor->ns.displayID);\n\n    if (xpos)\n        *xpos = (int) bounds.origin.x;\n    if (ypos)\n        *ypos = (int) bounds.origin.y;\n}\n\nGLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count)\n{\n    CFArrayRef modes;\n    CFIndex found, i, j;\n    GLFWvidmode* result;\n    CVDisplayLinkRef link;\n\n    *count = 0;\n\n    CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);\n\n    modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);\n    found = CFArrayGetCount(modes);\n    result = calloc(found, sizeof(GLFWvidmode));\n\n    for (i = 0;  i < found;  i++)\n    {\n        CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);\n        if (!modeIsGood(dm))\n            continue;\n\n        const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);\n\n        for (j = 0;  j < *count;  j++)\n        {\n            if (_glfwCompareVideoModes(result + j, &mode) == 0)\n                break;\n        }\n\n        // Skip duplicate modes\n        if (i < *count)\n            continue;\n\n        (*count)++;\n        result[*count - 1] = mode;\n    }\n\n    CFRelease(modes);\n    CVDisplayLinkRelease(link);\n    return result;\n}\n\nvoid _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode)\n{\n    CGDisplayModeRef displayMode;\n    CVDisplayLinkRef link;\n\n    CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);\n\n    displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);\n    *mode = vidmodeFromCGDisplayMode(displayMode, link);\n    CGDisplayModeRelease(displayMode);\n\n    CVDisplayLinkRelease(link);\n}\n\nvoid _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)\n{\n    uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID);\n    CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue));\n\n    CGGetDisplayTransferByTable(monitor->ns.displayID,\n                                size,\n                                values,\n                                values + size,\n                                values + size * 2,\n                                &size);\n\n    _glfwAllocGammaArrays(ramp, size);\n\n    for (i = 0; i < size; i++)\n    {\n        ramp->red[i]   = (unsigned short) (values[i] * 65535);\n        ramp->green[i] = (unsigned short) (values[i + size] * 65535);\n        ramp->blue[i]  = (unsigned short) (values[i + size * 2] * 65535);\n    }\n\n    free(values);\n}\n\nvoid _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)\n{\n    int i;\n    CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue));\n\n    for (i = 0;  i < ramp->size;  i++)\n    {\n        values[i]                  = ramp->red[i] / 65535.f;\n        values[i + ramp->size]     = ramp->green[i] / 65535.f;\n        values[i + ramp->size * 2] = ramp->blue[i] / 65535.f;\n    }\n\n    CGSetDisplayTransferByTable(monitor->ns.displayID,\n                                ramp->size,\n                                values,\n                                values + ramp->size,\n                                values + ramp->size * 2);\n\n    free(values);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay);\n    return monitor->ns.displayID;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/cocoa_platform.h",
    "content": "//========================================================================\n// GLFW 3.3 macOS - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <stdint.h>\n#include <dlfcn.h>\n\n#if defined(__OBJC__)\n#import <Carbon/Carbon.h>\n#import <Cocoa/Cocoa.h>\n#else\n#include <Carbon/Carbon.h>\n#include <ApplicationServices/ApplicationServices.h>\ntypedef void* id;\n#endif\n\ntypedef VkFlags VkMacOSSurfaceCreateFlagsMVK;\n\ntypedef struct VkMacOSSurfaceCreateInfoMVK\n{\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkMacOSSurfaceCreateFlagsMVK    flags;\n    const void*                     pView;\n} VkMacOSSurfaceCreateInfoMVK;\n\ntypedef VkResult (APIENTRY *PFN_vkCreateMacOSSurfaceMVK)(VkInstance,const VkMacOSSurfaceCreateInfoMVK*,const VkAllocationCallbacks*,VkSurfaceKHR*);\n\n#include \"posix_thread.h\"\n#include \"cocoa_joystick.h\"\n#include \"nsgl_context.h\"\n#include \"egl_context.h\"\n#include \"osmesa_context.h\"\n\n#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)\n#define _glfw_dlclose(handle) dlclose(handle)\n#define _glfw_dlsym(handle, name) dlsym(handle, name)\n\n#define _GLFW_EGL_NATIVE_WINDOW  ((EGLNativeWindowType) window->ns.view)\n#define _GLFW_EGL_NATIVE_DISPLAY EGL_DEFAULT_DISPLAY\n\n#define _GLFW_PLATFORM_WINDOW_STATE         _GLFWwindowNS  ns\n#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns\n#define _GLFW_PLATFORM_LIBRARY_TIMER_STATE  _GLFWtimerNS   ns\n#define _GLFW_PLATFORM_MONITOR_STATE        _GLFWmonitorNS ns\n#define _GLFW_PLATFORM_CURSOR_STATE         _GLFWcursorNS  ns\n\n// HIToolbox.framework pointer typedefs\n#define kTISPropertyUnicodeKeyLayoutData _glfw.ns.tis.kPropertyUnicodeKeyLayoutData\ntypedef TISInputSourceRef (*PFN_TISCopyCurrentKeyboardLayoutInputSource)(void);\n#define TISCopyCurrentKeyboardLayoutInputSource _glfw.ns.tis.CopyCurrentKeyboardLayoutInputSource\ntypedef void* (*PFN_TISGetInputSourceProperty)(TISInputSourceRef,CFStringRef);\n#define TISGetInputSourceProperty _glfw.ns.tis.GetInputSourceProperty\ntypedef UInt8 (*PFN_LMGetKbdType)(void);\n#define LMGetKbdType _glfw.ns.tis.GetKbdType\n\n\n// Cocoa-specific per-window data\n//\ntypedef struct _GLFWwindowNS\n{\n    id              object;\n    id              delegate;\n    id              view;\n    id              layer;\n\n    GLFWbool        maximized;\n\n    // The total sum of the distances the cursor has been warped\n    // since the last cursor motion event was processed\n    // This is kept to counteract Cocoa doing the same internally\n    double          cursorWarpDeltaX, cursorWarpDeltaY;\n\n} _GLFWwindowNS;\n\n// Cocoa-specific global data\n//\ntypedef struct _GLFWlibraryNS\n{\n    CGEventSourceRef    eventSource;\n    id                  delegate;\n    id                  autoreleasePool;\n    GLFWbool            cursorHidden;\n    TISInputSourceRef   inputSource;\n    IOHIDManagerRef     hidManager;\n    id                  unicodeData;\n    id                  listener;\n\n    char                keyName[64];\n    short int           keycodes[256];\n    short int           scancodes[GLFW_KEY_LAST + 1];\n    char*               clipboardString;\n    CGPoint             cascadePoint;\n    // Where to place the cursor when re-enabled\n    double              restoreCursorPosX, restoreCursorPosY;\n    // The window whose disabled cursor mode is active\n    _GLFWwindow*        disabledCursorWindow;\n\n    struct {\n        CFBundleRef     bundle;\n        PFN_TISCopyCurrentKeyboardLayoutInputSource CopyCurrentKeyboardLayoutInputSource;\n        PFN_TISGetInputSourceProperty GetInputSourceProperty;\n        PFN_LMGetKbdType GetKbdType;\n        CFStringRef     kPropertyUnicodeKeyLayoutData;\n    } tis;\n\n} _GLFWlibraryNS;\n\n// Cocoa-specific per-monitor data\n//\ntypedef struct _GLFWmonitorNS\n{\n    CGDirectDisplayID   displayID;\n    CGDisplayModeRef    previousMode;\n    uint32_t            unitNumber;\n\n} _GLFWmonitorNS;\n\n// Cocoa-specific per-cursor data\n//\ntypedef struct _GLFWcursorNS\n{\n    id              object;\n\n} _GLFWcursorNS;\n\n// Cocoa-specific global timer data\n//\ntypedef struct _GLFWtimerNS\n{\n    uint64_t        frequency;\n\n} _GLFWtimerNS;\n\n\nvoid _glfwInitTimerNS(void);\n\nvoid _glfwPollMonitorsNS(void);\nGLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired);\nvoid _glfwRestoreVideoModeNS(_GLFWmonitor* monitor);\n\n"
  },
  {
    "path": "external/GLFW/src/cocoa_time.c",
    "content": "//========================================================================\n// GLFW 3.3 macOS - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <mach/mach_time.h>\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialise timer\n//\nvoid _glfwInitTimerNS(void)\n{\n    mach_timebase_info_data_t info;\n    mach_timebase_info(&info);\n\n    _glfw.timer.ns.frequency = (info.denom * 1e9) / info.numer;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nuint64_t _glfwPlatformGetTimerValue(void)\n{\n    return mach_absolute_time();\n}\n\nuint64_t _glfwPlatformGetTimerFrequency(void)\n{\n    return _glfw.timer.ns.frequency;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/cocoa_window.m",
    "content": "//========================================================================\n// GLFW 3.3 macOS - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <float.h>\n#include <string.h>\n\n// Needed for _NSGetProgname\n#include <crt_externs.h>\n\n// HACK: The 10.12 SDK adds new symbols and immediately deprecates the old ones\n#if MAC_OS_X_VERSION_MAX_ALLOWED < 101200\n #define NSWindowStyleMaskBorderless NSBorderlessWindowMask\n #define NSWindowStyleMaskClosable NSClosableWindowMask\n #define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask\n #define NSWindowStyleMaskResizable NSResizableWindowMask\n #define NSWindowStyleMaskTitled NSTitledWindowMask\n #define NSEventModifierFlagCommand NSCommandKeyMask\n #define NSEventModifierFlagControl NSControlKeyMask\n #define NSEventModifierFlagOption NSAlternateKeyMask\n #define NSEventModifierFlagShift NSShiftKeyMask\n #define NSEventModifierFlagDeviceIndependentFlagsMask NSDeviceIndependentModifierFlagsMask\n #define NSEventMaskAny NSAnyEventMask\n #define NSEventTypeApplicationDefined NSApplicationDefined\n #define NSEventTypeKeyUp NSKeyUp\n#endif\n\n\n// Returns the style mask corresponding to the window settings\n//\nstatic NSUInteger getStyleMask(_GLFWwindow* window)\n{\n    NSUInteger styleMask = 0;\n\n    if (window->monitor || !window->decorated)\n        styleMask |= NSWindowStyleMaskBorderless;\n    else\n    {\n        styleMask |= NSWindowStyleMaskTitled |\n                     NSWindowStyleMaskClosable |\n                     NSWindowStyleMaskMiniaturizable;\n\n        if (window->resizable)\n            styleMask |= NSWindowStyleMaskResizable;\n    }\n\n    return styleMask;\n}\n\n// Center the cursor in the view of the window\n//\nstatic void centerCursor(_GLFWwindow *window)\n{\n    int width, height;\n    _glfwPlatformGetWindowSize(window, &width, &height);\n    _glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0);\n}\n\n// Returns whether the cursor is in the client area of the specified window\n//\nstatic GLFWbool cursorInClientArea(_GLFWwindow* window)\n{\n    const NSPoint pos = [window->ns.object mouseLocationOutsideOfEventStream];\n    return [window->ns.view mouse:pos inRect:[window->ns.view frame]];\n}\n\n// Hides the cursor if not already hidden\n//\nstatic void hideCursor(_GLFWwindow* window)\n{\n    if (!_glfw.ns.cursorHidden)\n    {\n        [NSCursor hide];\n        _glfw.ns.cursorHidden = GLFW_TRUE;\n    }\n}\n\n// Shows the cursor if not already shown\n//\nstatic void showCursor(_GLFWwindow* window)\n{\n    if (_glfw.ns.cursorHidden)\n    {\n        [NSCursor unhide];\n        _glfw.ns.cursorHidden = GLFW_FALSE;\n    }\n}\n\n// Updates the cursor image according to its cursor mode\n//\nstatic void updateCursorImage(_GLFWwindow* window)\n{\n    if (window->cursorMode == GLFW_CURSOR_NORMAL)\n    {\n        showCursor(window);\n\n        if (window->cursor)\n            [(NSCursor*) window->cursor->ns.object set];\n        else\n            [[NSCursor arrowCursor] set];\n    }\n    else\n        hideCursor(window);\n}\n\n// Transforms the specified y-coordinate between the CG display and NS screen\n// coordinate systems\n//\nstatic float transformY(float y)\n{\n    return CGDisplayBounds(CGMainDisplayID()).size.height - y;\n}\n\n// Make the specified window and its video mode active on its monitor\n//\nstatic GLFWbool acquireMonitor(_GLFWwindow* window)\n{\n    const GLFWbool status = _glfwSetVideoModeNS(window->monitor, &window->videoMode);\n    const CGRect bounds = CGDisplayBounds(window->monitor->ns.displayID);\n    const NSRect frame = NSMakeRect(bounds.origin.x,\n                                    transformY(bounds.origin.y + bounds.size.height),\n                                    bounds.size.width,\n                                    bounds.size.height);\n\n    [window->ns.object setFrame:frame display:YES];\n\n    _glfwInputMonitorWindow(window->monitor, window);\n    return status;\n}\n\n// Remove the window and restore the original video mode\n//\nstatic void releaseMonitor(_GLFWwindow* window)\n{\n    if (window->monitor->window != window)\n        return;\n\n    _glfwInputMonitorWindow(window->monitor, NULL);\n    _glfwRestoreVideoModeNS(window->monitor);\n}\n\n// Translates macOS key modifiers into GLFW ones\n//\nstatic int translateFlags(NSUInteger flags)\n{\n    int mods = 0;\n\n    if (flags & NSEventModifierFlagShift)\n        mods |= GLFW_MOD_SHIFT;\n    if (flags & NSEventModifierFlagControl)\n        mods |= GLFW_MOD_CONTROL;\n    if (flags & NSEventModifierFlagOption)\n        mods |= GLFW_MOD_ALT;\n    if (flags & NSEventModifierFlagCommand)\n        mods |= GLFW_MOD_SUPER;\n\n    return mods;\n}\n\n// Translates a macOS keycode to a GLFW keycode\n//\nstatic int translateKey(unsigned int key)\n{\n    if (key >= sizeof(_glfw.ns.keycodes) / sizeof(_glfw.ns.keycodes[0]))\n        return GLFW_KEY_UNKNOWN;\n\n    return _glfw.ns.keycodes[key];\n}\n\n// Translate a GLFW keycode to a Cocoa modifier flag\n//\nstatic NSUInteger translateKeyToModifierFlag(int key)\n{\n    switch (key)\n    {\n        case GLFW_KEY_LEFT_SHIFT:\n        case GLFW_KEY_RIGHT_SHIFT:\n            return NSEventModifierFlagShift;\n        case GLFW_KEY_LEFT_CONTROL:\n        case GLFW_KEY_RIGHT_CONTROL:\n            return NSEventModifierFlagControl;\n        case GLFW_KEY_LEFT_ALT:\n        case GLFW_KEY_RIGHT_ALT:\n            return NSEventModifierFlagOption;\n        case GLFW_KEY_LEFT_SUPER:\n        case GLFW_KEY_RIGHT_SUPER:\n            return NSEventModifierFlagCommand;\n    }\n\n    return 0;\n}\n\n// Defines a constant for empty ranges in NSTextInputClient\n//\nstatic const NSRange kEmptyRange = { NSNotFound, 0 };\n\n\n//------------------------------------------------------------------------\n// Delegate for window related notifications\n//------------------------------------------------------------------------\n\n@interface GLFWWindowDelegate : NSObject\n{\n    _GLFWwindow* window;\n}\n\n- (instancetype)initWithGlfwWindow:(_GLFWwindow *)initWindow;\n\n@end\n\n@implementation GLFWWindowDelegate\n\n- (instancetype)initWithGlfwWindow:(_GLFWwindow *)initWindow\n{\n    self = [super init];\n    if (self != nil)\n        window = initWindow;\n\n    return self;\n}\n\n- (BOOL)windowShouldClose:(id)sender\n{\n    _glfwInputWindowCloseRequest(window);\n    return NO;\n}\n\n- (void)windowDidResize:(NSNotification *)notification\n{\n    if (window->context.client != GLFW_NO_API)\n        [window->context.nsgl.object update];\n\n    if (_glfw.ns.disabledCursorWindow == window)\n        centerCursor(window);\n\n    const int maximized = [window->ns.object isZoomed];\n    if (window->ns.maximized != maximized)\n    {\n        window->ns.maximized = maximized;\n        _glfwInputWindowMaximize(window, maximized);\n    }\n\n    const NSRect contentRect = [window->ns.view frame];\n    const NSRect fbRect = [window->ns.view convertRectToBacking:contentRect];\n\n    _glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height);\n    _glfwInputWindowSize(window, contentRect.size.width, contentRect.size.height);\n}\n\n- (void)windowDidMove:(NSNotification *)notification\n{\n    if (window->context.client != GLFW_NO_API)\n        [window->context.nsgl.object update];\n\n    if (_glfw.ns.disabledCursorWindow == window)\n        centerCursor(window);\n\n    int x, y;\n    _glfwPlatformGetWindowPos(window, &x, &y);\n    _glfwInputWindowPos(window, x, y);\n}\n\n- (void)windowDidMiniaturize:(NSNotification *)notification\n{\n    if (window->monitor)\n        releaseMonitor(window);\n\n    _glfwInputWindowIconify(window, GLFW_TRUE);\n}\n\n- (void)windowDidDeminiaturize:(NSNotification *)notification\n{\n    if (window->monitor)\n        acquireMonitor(window);\n\n    _glfwInputWindowIconify(window, GLFW_FALSE);\n}\n\n- (void)windowDidBecomeKey:(NSNotification *)notification\n{\n    if (_glfw.ns.disabledCursorWindow == window)\n        centerCursor(window);\n\n    _glfwInputWindowFocus(window, GLFW_TRUE);\n    _glfwPlatformSetCursorMode(window, window->cursorMode);\n}\n\n- (void)windowDidResignKey:(NSNotification *)notification\n{\n    if (window->monitor && window->autoIconify)\n        _glfwPlatformIconifyWindow(window);\n\n    _glfwInputWindowFocus(window, GLFW_FALSE);\n}\n\n@end\n\n\n//------------------------------------------------------------------------\n// Delegate for application related notifications\n//------------------------------------------------------------------------\n\n@interface GLFWApplicationDelegate : NSObject\n@end\n\n@implementation GLFWApplicationDelegate\n\n- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender\n{\n    _GLFWwindow* window;\n\n    for (window = _glfw.windowListHead;  window;  window = window->next)\n        _glfwInputWindowCloseRequest(window);\n\n    return NSTerminateCancel;\n}\n\n- (void)applicationDidChangeScreenParameters:(NSNotification *) notification\n{\n    _GLFWwindow* window;\n\n    for (window = _glfw.windowListHead;  window;  window = window->next)\n    {\n        if (window->context.client != GLFW_NO_API)\n            [window->context.nsgl.object update];\n    }\n\n    _glfwPollMonitorsNS();\n}\n\n- (void)applicationDidFinishLaunching:(NSNotification *)notification\n{\n    [NSApp stop:nil];\n\n    _glfwPlatformPostEmptyEvent();\n}\n\n- (void)applicationDidHide:(NSNotification *)notification\n{\n    int i;\n\n    for (i = 0;  i < _glfw.monitorCount;  i++)\n        _glfwRestoreVideoModeNS(_glfw.monitors[i]);\n}\n\n@end\n\n\n//------------------------------------------------------------------------\n// Content view class for the GLFW window\n//------------------------------------------------------------------------\n\n@interface GLFWContentView : NSView <NSTextInputClient>\n{\n    _GLFWwindow* window;\n    NSTrackingArea* trackingArea;\n    NSMutableAttributedString* markedText;\n}\n\n- (instancetype)initWithGlfwWindow:(_GLFWwindow *)initWindow;\n\n@end\n\n@implementation GLFWContentView\n\n- (instancetype)initWithGlfwWindow:(_GLFWwindow *)initWindow\n{\n    self = [super init];\n    if (self != nil)\n    {\n        window = initWindow;\n        trackingArea = nil;\n        markedText = [[NSMutableAttributedString alloc] init];\n\n        [self updateTrackingAreas];\n        [self registerForDraggedTypes:[NSArray arrayWithObjects:\n                                       NSFilenamesPboardType, nil]];\n    }\n\n    return self;\n}\n\n- (void)dealloc\n{\n    [trackingArea release];\n    [markedText release];\n    [super dealloc];\n}\n\n- (BOOL)isOpaque\n{\n    return [window->ns.object isOpaque];\n}\n\n- (BOOL)canBecomeKeyView\n{\n    return YES;\n}\n\n- (BOOL)acceptsFirstResponder\n{\n    return YES;\n}\n\n- (BOOL)wantsUpdateLayer\n{\n    return YES;\n}\n\n- (id)makeBackingLayer\n{\n    if (window->ns.layer)\n        return window->ns.layer;\n\n    return [super makeBackingLayer];\n}\n\n- (void)cursorUpdate:(NSEvent *)event\n{\n    updateCursorImage(window);\n}\n\n- (void)mouseDown:(NSEvent *)event\n{\n    _glfwInputMouseClick(window,\n                         GLFW_MOUSE_BUTTON_LEFT,\n                         GLFW_PRESS,\n                         translateFlags([event modifierFlags]));\n}\n\n- (void)mouseDragged:(NSEvent *)event\n{\n    [self mouseMoved:event];\n}\n\n- (void)mouseUp:(NSEvent *)event\n{\n    _glfwInputMouseClick(window,\n                         GLFW_MOUSE_BUTTON_LEFT,\n                         GLFW_RELEASE,\n                         translateFlags([event modifierFlags]));\n}\n\n- (void)mouseMoved:(NSEvent *)event\n{\n    if (window->cursorMode == GLFW_CURSOR_DISABLED)\n    {\n        const double dx = [event deltaX] - window->ns.cursorWarpDeltaX;\n        const double dy = [event deltaY] - window->ns.cursorWarpDeltaY;\n\n        _glfwInputCursorPos(window,\n                            window->virtualCursorPosX + dx,\n                            window->virtualCursorPosY + dy);\n    }\n    else\n    {\n        const NSRect contentRect = [window->ns.view frame];\n        const NSPoint pos = [event locationInWindow];\n\n        _glfwInputCursorPos(window, pos.x, contentRect.size.height - pos.y);\n    }\n\n    window->ns.cursorWarpDeltaX = 0;\n    window->ns.cursorWarpDeltaY = 0;\n}\n\n- (void)rightMouseDown:(NSEvent *)event\n{\n    _glfwInputMouseClick(window,\n                         GLFW_MOUSE_BUTTON_RIGHT,\n                         GLFW_PRESS,\n                         translateFlags([event modifierFlags]));\n}\n\n- (void)rightMouseDragged:(NSEvent *)event\n{\n    [self mouseMoved:event];\n}\n\n- (void)rightMouseUp:(NSEvent *)event\n{\n    _glfwInputMouseClick(window,\n                         GLFW_MOUSE_BUTTON_RIGHT,\n                         GLFW_RELEASE,\n                         translateFlags([event modifierFlags]));\n}\n\n- (void)otherMouseDown:(NSEvent *)event\n{\n    _glfwInputMouseClick(window,\n                         (int) [event buttonNumber],\n                         GLFW_PRESS,\n                         translateFlags([event modifierFlags]));\n}\n\n- (void)otherMouseDragged:(NSEvent *)event\n{\n    [self mouseMoved:event];\n}\n\n- (void)otherMouseUp:(NSEvent *)event\n{\n    _glfwInputMouseClick(window,\n                         (int) [event buttonNumber],\n                         GLFW_RELEASE,\n                         translateFlags([event modifierFlags]));\n}\n\n- (void)mouseExited:(NSEvent *)event\n{\n    if (window->cursorMode == GLFW_CURSOR_HIDDEN)\n        showCursor(window);\n\n    _glfwInputCursorEnter(window, GLFW_FALSE);\n}\n\n- (void)mouseEntered:(NSEvent *)event\n{\n    if (window->cursorMode == GLFW_CURSOR_HIDDEN)\n        hideCursor(window);\n\n    _glfwInputCursorEnter(window, GLFW_TRUE);\n}\n\n- (void)viewDidChangeBackingProperties\n{\n    const NSRect contentRect = [window->ns.view frame];\n    const NSRect fbRect = [window->ns.view convertRectToBacking:contentRect];\n\n    _glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height);\n}\n\n- (void)drawRect:(NSRect)rect\n{\n    _glfwInputWindowDamage(window);\n}\n\n- (void)updateTrackingAreas\n{\n    if (trackingArea != nil)\n    {\n        [self removeTrackingArea:trackingArea];\n        [trackingArea release];\n    }\n\n    const NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited |\n                                          NSTrackingActiveInKeyWindow |\n                                          NSTrackingEnabledDuringMouseDrag |\n                                          NSTrackingCursorUpdate |\n                                          NSTrackingInVisibleRect |\n                                          NSTrackingAssumeInside;\n\n    trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]\n                                                options:options\n                                                  owner:self\n                                               userInfo:nil];\n\n    [self addTrackingArea:trackingArea];\n    [super updateTrackingAreas];\n}\n\n- (void)keyDown:(NSEvent *)event\n{\n    const int key = translateKey([event keyCode]);\n    const int mods = translateFlags([event modifierFlags]);\n\n    _glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods);\n\n    [self interpretKeyEvents:[NSArray arrayWithObject:event]];\n}\n\n- (void)flagsChanged:(NSEvent *)event\n{\n    int action;\n    const unsigned int modifierFlags =\n        [event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;\n    const int key = translateKey([event keyCode]);\n    const int mods = translateFlags(modifierFlags);\n    const NSUInteger keyFlag = translateKeyToModifierFlag(key);\n\n    if (keyFlag & modifierFlags)\n    {\n        if (window->keys[key] == GLFW_PRESS)\n            action = GLFW_RELEASE;\n        else\n            action = GLFW_PRESS;\n    }\n    else\n        action = GLFW_RELEASE;\n\n    _glfwInputKey(window, key, [event keyCode], action, mods);\n}\n\n- (void)keyUp:(NSEvent *)event\n{\n    const int key = translateKey([event keyCode]);\n    const int mods = translateFlags([event modifierFlags]);\n    _glfwInputKey(window, key, [event keyCode], GLFW_RELEASE, mods);\n}\n\n- (void)scrollWheel:(NSEvent *)event\n{\n    double deltaX, deltaY;\n\n    deltaX = [event scrollingDeltaX];\n    deltaY = [event scrollingDeltaY];\n\n    if ([event hasPreciseScrollingDeltas])\n    {\n        deltaX *= 0.1;\n        deltaY *= 0.1;\n    }\n\n    if (fabs(deltaX) > 0.0 || fabs(deltaY) > 0.0)\n        _glfwInputScroll(window, deltaX, deltaY);\n}\n\n- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender\n{\n    if ((NSDragOperationGeneric & [sender draggingSourceOperationMask])\n        == NSDragOperationGeneric)\n    {\n        [self setNeedsDisplay:YES];\n        return NSDragOperationGeneric;\n    }\n\n    return NSDragOperationNone;\n}\n\n- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender\n{\n    [self setNeedsDisplay:YES];\n    return YES;\n}\n\n- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender\n{\n    NSPasteboard* pasteboard = [sender draggingPasteboard];\n    NSArray* files = [pasteboard propertyListForType:NSFilenamesPboardType];\n\n    const NSRect contentRect = [window->ns.view frame];\n    _glfwInputCursorPos(window,\n                        [sender draggingLocation].x,\n                        contentRect.size.height - [sender draggingLocation].y);\n\n    const int count = [files count];\n    if (count)\n    {\n        NSEnumerator* e = [files objectEnumerator];\n        char** paths = calloc(count, sizeof(char*));\n        int i;\n\n        for (i = 0;  i < count;  i++)\n            paths[i] = strdup([[e nextObject] UTF8String]);\n\n        _glfwInputDrop(window, count, (const char**) paths);\n\n        for (i = 0;  i < count;  i++)\n            free(paths[i]);\n        free(paths);\n    }\n\n    return YES;\n}\n\n- (void)concludeDragOperation:(id <NSDraggingInfo>)sender\n{\n    [self setNeedsDisplay:YES];\n}\n\n- (BOOL)hasMarkedText\n{\n    return [markedText length] > 0;\n}\n\n- (NSRange)markedRange\n{\n    if ([markedText length] > 0)\n        return NSMakeRange(0, [markedText length] - 1);\n    else\n        return kEmptyRange;\n}\n\n- (NSRange)selectedRange\n{\n    return kEmptyRange;\n}\n\n- (void)setMarkedText:(id)string\n        selectedRange:(NSRange)selectedRange\n     replacementRange:(NSRange)replacementRange\n{\n    [markedText release];\n    if ([string isKindOfClass:[NSAttributedString class]])\n        markedText = [[NSMutableAttributedString alloc] initWithAttributedString:string];\n    else\n        markedText = [[NSMutableAttributedString alloc] initWithString:string];\n}\n\n- (void)unmarkText\n{\n    [[markedText mutableString] setString:@\"\"];\n}\n\n- (NSArray*)validAttributesForMarkedText\n{\n    return [NSArray array];\n}\n\n- (NSAttributedString*)attributedSubstringForProposedRange:(NSRange)range\n                                               actualRange:(NSRangePointer)actualRange\n{\n    return nil;\n}\n\n- (NSUInteger)characterIndexForPoint:(NSPoint)point\n{\n    return 0;\n}\n\n- (NSRect)firstRectForCharacterRange:(NSRange)range\n                         actualRange:(NSRangePointer)actualRange\n{\n    int xpos, ypos;\n    _glfwPlatformGetWindowPos(window, &xpos, &ypos);\n    const NSRect contentRect = [window->ns.view frame];\n    return NSMakeRect(xpos, transformY(ypos + contentRect.size.height), 0.0, 0.0);\n}\n\n- (void)insertText:(id)string replacementRange:(NSRange)replacementRange\n{\n    NSString* characters;\n    NSEvent* event = [NSApp currentEvent];\n    const int mods = translateFlags([event modifierFlags]);\n    const int plain = !(mods & GLFW_MOD_SUPER);\n\n    if ([string isKindOfClass:[NSAttributedString class]])\n        characters = [string string];\n    else\n        characters = (NSString*) string;\n\n    NSUInteger i, length = [characters length];\n\n    for (i = 0;  i < length;  i++)\n    {\n        const unichar codepoint = [characters characterAtIndex:i];\n        if ((codepoint & 0xff00) == 0xf700)\n            continue;\n\n        _glfwInputChar(window, codepoint, mods, plain);\n    }\n}\n\n- (void)doCommandBySelector:(SEL)selector\n{\n}\n\n@end\n\n\n//------------------------------------------------------------------------\n// GLFW window class\n//------------------------------------------------------------------------\n\n@interface GLFWWindow : NSWindow {}\n@end\n\n@implementation GLFWWindow\n\n- (BOOL)canBecomeKeyWindow\n{\n    // Required for NSWindowStyleMaskBorderless windows\n    return YES;\n}\n\n- (BOOL)canBecomeMainWindow\n{\n    return YES;\n}\n\n@end\n\n\n//------------------------------------------------------------------------\n// GLFW application class\n//------------------------------------------------------------------------\n\n@interface GLFWApplication : NSApplication\n{\n    NSArray* nibObjects;\n}\n\n@end\n\n@implementation GLFWApplication\n\n// From http://cocoadev.com/index.pl?GameKeyboardHandlingAlmost\n// This works around an AppKit bug, where key up events while holding\n// down the command key don't get sent to the key window.\n- (void)sendEvent:(NSEvent *)event\n{\n    if ([event type] == NSEventTypeKeyUp &&\n        ([event modifierFlags] & NSEventModifierFlagCommand))\n    {\n        [[self keyWindow] sendEvent:event];\n    }\n    else\n        [super sendEvent:event];\n}\n\n\n// No-op thread entry point\n//\n- (void)doNothing:(id)object\n{\n}\n\n- (void)loadMainMenu\n{\n#if MAC_OS_X_VERSION_MAX_ALLOWED >= 100800\n    [[NSBundle mainBundle] loadNibNamed:@\"MainMenu\"\n                                  owner:NSApp\n                        topLevelObjects:&nibObjects];\n#else\n    [[NSBundle mainBundle] loadNibNamed:@\"MainMenu\" owner:NSApp];\n#endif\n}\n@end\n\n// Set up the menu bar (manually)\n// This is nasty, nasty stuff -- calls to undocumented semi-private APIs that\n// could go away at any moment, lots of stuff that really should be\n// localize(d|able), etc.  Add a nib to save us this horror.\n//\nstatic void createMenuBar(void)\n{\n    size_t i;\n    NSString* appName = nil;\n    NSDictionary* bundleInfo = [[NSBundle mainBundle] infoDictionary];\n    NSString* nameKeys[] =\n    {\n        @\"CFBundleDisplayName\",\n        @\"CFBundleName\",\n        @\"CFBundleExecutable\",\n    };\n\n    // Try to figure out what the calling application is called\n\n    for (i = 0;  i < sizeof(nameKeys) / sizeof(nameKeys[0]);  i++)\n    {\n        id name = [bundleInfo objectForKey:nameKeys[i]];\n        if (name &&\n            [name isKindOfClass:[NSString class]] &&\n            ![name isEqualToString:@\"\"])\n        {\n            appName = name;\n            break;\n        }\n    }\n\n    if (!appName)\n    {\n        char** progname = _NSGetProgname();\n        if (progname && *progname)\n            appName = [NSString stringWithUTF8String:*progname];\n        else\n            appName = @\"GLFW Application\";\n    }\n\n    NSMenu* bar = [[NSMenu alloc] init];\n    [NSApp setMainMenu:bar];\n\n    NSMenuItem* appMenuItem =\n        [bar addItemWithTitle:@\"\" action:NULL keyEquivalent:@\"\"];\n    NSMenu* appMenu = [[NSMenu alloc] init];\n    [appMenuItem setSubmenu:appMenu];\n\n    [appMenu addItemWithTitle:[NSString stringWithFormat:@\"About %@\", appName]\n                       action:@selector(orderFrontStandardAboutPanel:)\n                keyEquivalent:@\"\"];\n    [appMenu addItem:[NSMenuItem separatorItem]];\n    NSMenu* servicesMenu = [[NSMenu alloc] init];\n    [NSApp setServicesMenu:servicesMenu];\n    [[appMenu addItemWithTitle:@\"Services\"\n                       action:NULL\n                keyEquivalent:@\"\"] setSubmenu:servicesMenu];\n    [servicesMenu release];\n    [appMenu addItem:[NSMenuItem separatorItem]];\n    [appMenu addItemWithTitle:[NSString stringWithFormat:@\"Hide %@\", appName]\n                       action:@selector(hide:)\n                keyEquivalent:@\"h\"];\n    [[appMenu addItemWithTitle:@\"Hide Others\"\n                       action:@selector(hideOtherApplications:)\n                keyEquivalent:@\"h\"]\n        setKeyEquivalentModifierMask:NSEventModifierFlagOption | NSEventModifierFlagCommand];\n    [appMenu addItemWithTitle:@\"Show All\"\n                       action:@selector(unhideAllApplications:)\n                keyEquivalent:@\"\"];\n    [appMenu addItem:[NSMenuItem separatorItem]];\n    [appMenu addItemWithTitle:[NSString stringWithFormat:@\"Quit %@\", appName]\n                       action:@selector(terminate:)\n                keyEquivalent:@\"q\"];\n\n    NSMenuItem* windowMenuItem =\n        [bar addItemWithTitle:@\"\" action:NULL keyEquivalent:@\"\"];\n    [bar release];\n    NSMenu* windowMenu = [[NSMenu alloc] initWithTitle:@\"Window\"];\n    [NSApp setWindowsMenu:windowMenu];\n    [windowMenuItem setSubmenu:windowMenu];\n\n    [windowMenu addItemWithTitle:@\"Minimize\"\n                          action:@selector(performMiniaturize:)\n                   keyEquivalent:@\"m\"];\n    [windowMenu addItemWithTitle:@\"Zoom\"\n                          action:@selector(performZoom:)\n                   keyEquivalent:@\"\"];\n    [windowMenu addItem:[NSMenuItem separatorItem]];\n    [windowMenu addItemWithTitle:@\"Bring All to Front\"\n                          action:@selector(arrangeInFront:)\n                   keyEquivalent:@\"\"];\n\n    // TODO: Make this appear at the bottom of the menu (for consistency)\n    [windowMenu addItem:[NSMenuItem separatorItem]];\n    [[windowMenu addItemWithTitle:@\"Enter Full Screen\"\n                           action:@selector(toggleFullScreen:)\n                    keyEquivalent:@\"f\"]\n     setKeyEquivalentModifierMask:NSEventModifierFlagControl | NSEventModifierFlagCommand];\n\n    // Prior to Snow Leopard, we need to use this oddly-named semi-private API\n    // to get the application menu working properly.\n    SEL setAppleMenuSelector = NSSelectorFromString(@\"setAppleMenu:\");\n    [NSApp performSelector:setAppleMenuSelector withObject:appMenu];\n}\n\n// Initialize the Cocoa Application Kit\n//\nstatic GLFWbool initializeAppKit(void)\n{\n    if (NSApp)\n        return GLFW_TRUE;\n\n    // Implicitly create shared NSApplication instance\n    [GLFWApplication sharedApplication];\n\n    // Make Cocoa enter multi-threaded mode\n    [NSThread detachNewThreadSelector:@selector(doNothing:)\n                             toTarget:NSApp\n                           withObject:nil];\n\n    if (_glfw.hints.init.ns.menubar)\n    {\n        // In case we are unbundled, make us a proper UI application\n        [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];\n\n        // Menu bar setup must go between sharedApplication above and\n        // finishLaunching below, in order to properly emulate the behavior\n        // of NSApplicationMain\n\n        if ([[NSBundle mainBundle] pathForResource:@\"MainMenu\" ofType:@\"nib\"])\n            [NSApp loadMainMenu];\n        else\n            createMenuBar();\n    }\n\n    // There can only be one application delegate, but we allocate it the\n    // first time a window is created to keep all window code in this file\n    _glfw.ns.delegate = [[GLFWApplicationDelegate alloc] init];\n    if (_glfw.ns.delegate == nil)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to create application delegate\");\n        return GLFW_FALSE;\n    }\n\n    [NSApp setDelegate:_glfw.ns.delegate];\n    [NSApp run];\n\n    // Press and Hold prevents some keys from emitting repeated characters\n    NSDictionary* defaults =\n        [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO],\n                                                   @\"ApplePressAndHoldEnabled\",\n                                                   nil];\n    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];\n\n    return GLFW_TRUE;\n}\n\n// Create the Cocoa window\n//\nstatic GLFWbool createNativeWindow(_GLFWwindow* window,\n                                   const _GLFWwndconfig* wndconfig,\n                                   const _GLFWfbconfig* fbconfig)\n{\n    window->ns.delegate = [[GLFWWindowDelegate alloc] initWithGlfwWindow:window];\n    if (window->ns.delegate == nil)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to create window delegate\");\n        return GLFW_FALSE;\n    }\n\n    NSRect contentRect;\n\n    if (window->monitor)\n    {\n        GLFWvidmode mode;\n        int xpos, ypos;\n\n        _glfwPlatformGetVideoMode(window->monitor, &mode);\n        _glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);\n\n        contentRect = NSMakeRect(xpos, ypos, mode.width, mode.height);\n    }\n    else\n        contentRect = NSMakeRect(0, 0, wndconfig->width, wndconfig->height);\n\n    window->ns.object = [[GLFWWindow alloc]\n        initWithContentRect:contentRect\n                  styleMask:getStyleMask(window)\n                    backing:NSBackingStoreBuffered\n                      defer:NO];\n\n    if (window->ns.object == nil)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR, \"Cocoa: Failed to create window\");\n        return GLFW_FALSE;\n    }\n\n    if (window->monitor)\n        [window->ns.object setLevel:NSMainMenuWindowLevel + 1];\n    else\n    {\n        [window->ns.object center];\n        _glfw.ns.cascadePoint =\n            NSPointToCGPoint([window->ns.object cascadeTopLeftFromPoint:\n                              NSPointFromCGPoint(_glfw.ns.cascadePoint)]);\n\n        if (wndconfig->resizable)\n        {\n            const NSWindowCollectionBehavior behavior =\n                NSWindowCollectionBehaviorFullScreenPrimary |\n                NSWindowCollectionBehaviorManaged;\n            [window->ns.object setCollectionBehavior:behavior];\n        }\n\n        if (wndconfig->floating)\n            [window->ns.object setLevel:NSFloatingWindowLevel];\n\n        if (wndconfig->maximized)\n            [window->ns.object zoom:nil];\n    }\n\n    if (wndconfig->ns.frame)\n        [window->ns.object setFrameAutosaveName:[NSString stringWithUTF8String:wndconfig->title]];\n\n    window->ns.view = [[GLFWContentView alloc] initWithGlfwWindow:window];\n\n    if (wndconfig->ns.retina)\n        [window->ns.view setWantsBestResolutionOpenGLSurface:YES];\n\n    if (fbconfig->transparent)\n    {\n        [window->ns.object setOpaque:NO];\n        [window->ns.object setBackgroundColor:[NSColor clearColor]];\n    }\n\n    [window->ns.object setContentView:window->ns.view];\n    [window->ns.object makeFirstResponder:window->ns.view];\n    [window->ns.object setTitle:[NSString stringWithUTF8String:wndconfig->title]];\n    [window->ns.object setDelegate:window->ns.delegate];\n    [window->ns.object setAcceptsMouseMovedEvents:YES];\n    [window->ns.object setRestorable:NO];\n\n    return GLFW_TRUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformCreateWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig)\n{\n    if (!initializeAppKit())\n        return GLFW_FALSE;\n\n    if (!createNativeWindow(window, wndconfig, fbconfig))\n        return GLFW_FALSE;\n\n    if (ctxconfig->client != GLFW_NO_API)\n    {\n        if (ctxconfig->source == GLFW_NATIVE_CONTEXT_API)\n        {\n            if (!_glfwInitNSGL())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextNSGL(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_EGL_CONTEXT_API)\n        {\n            if (!_glfwInitEGL())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API)\n        {\n            if (!_glfwInitOSMesa())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n    }\n\n    if (window->monitor)\n    {\n        _glfwPlatformShowWindow(window);\n        _glfwPlatformFocusWindow(window);\n        if (!acquireMonitor(window))\n            return GLFW_FALSE;\n\n        if (wndconfig->centerCursor)\n            centerCursor(window);\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyWindow(_GLFWwindow* window)\n{\n    if (_glfw.ns.disabledCursorWindow == window)\n        _glfw.ns.disabledCursorWindow = NULL;\n\n    [window->ns.object orderOut:nil];\n\n    if (window->monitor)\n        releaseMonitor(window);\n\n    if (window->context.destroy)\n        window->context.destroy(window);\n\n    [window->ns.object setDelegate:nil];\n    [window->ns.delegate release];\n    window->ns.delegate = nil;\n\n    [window->ns.view release];\n    window->ns.view = nil;\n\n    [window->ns.object close];\n    window->ns.object = nil;\n\n    [_glfw.ns.autoreleasePool drain];\n    _glfw.ns.autoreleasePool = [[NSAutoreleasePool alloc] init];\n}\n\nvoid _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char *title)\n{\n    NSString* string = [NSString stringWithUTF8String:title];\n    [window->ns.object setTitle:string];\n    // HACK: Set the miniwindow title explicitly as setTitle: doesn't update it\n    //       if the window lacks NSWindowStyleMaskTitled\n    [window->ns.object setMiniwindowTitle:string];\n}\n\nvoid _glfwPlatformSetWindowIcon(_GLFWwindow* window,\n                                int count, const GLFWimage* images)\n{\n    // Regular windows do not have icons\n}\n\nvoid _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)\n{\n    const NSRect contentRect =\n        [window->ns.object contentRectForFrameRect:[window->ns.object frame]];\n\n    if (xpos)\n        *xpos = contentRect.origin.x;\n    if (ypos)\n        *ypos = transformY(contentRect.origin.y + contentRect.size.height);\n}\n\nvoid _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y)\n{\n    const NSRect contentRect = [window->ns.view frame];\n    const NSRect dummyRect = NSMakeRect(x, transformY(y + contentRect.size.height), 0, 0);\n    const NSRect frameRect = [window->ns.object frameRectForContentRect:dummyRect];\n    [window->ns.object setFrameOrigin:frameRect.origin];\n}\n\nvoid _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)\n{\n    const NSRect contentRect = [window->ns.view frame];\n\n    if (width)\n        *width = contentRect.size.width;\n    if (height)\n        *height = contentRect.size.height;\n}\n\nvoid _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)\n{\n    if (window->monitor)\n    {\n        if (window->monitor->window == window)\n            acquireMonitor(window);\n    }\n    else\n        [window->ns.object setContentSize:NSMakeSize(width, height)];\n}\n\nvoid _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,\n                                      int minwidth, int minheight,\n                                      int maxwidth, int maxheight)\n{\n    if (minwidth == GLFW_DONT_CARE || minheight == GLFW_DONT_CARE)\n        [window->ns.object setContentMinSize:NSMakeSize(0, 0)];\n    else\n        [window->ns.object setContentMinSize:NSMakeSize(minwidth, minheight)];\n\n    if (maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE)\n        [window->ns.object setContentMaxSize:NSMakeSize(DBL_MAX, DBL_MAX)];\n    else\n        [window->ns.object setContentMaxSize:NSMakeSize(maxwidth, maxheight)];\n}\n\nvoid _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)\n{\n    if (numer == GLFW_DONT_CARE || denom == GLFW_DONT_CARE)\n        [window->ns.object setResizeIncrements:NSMakeSize(1.0, 1.0)];\n    else\n        [window->ns.object setContentAspectRatio:NSMakeSize(numer, denom)];\n}\n\nvoid _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)\n{\n    const NSRect contentRect = [window->ns.view frame];\n    const NSRect fbRect = [window->ns.view convertRectToBacking:contentRect];\n\n    if (width)\n        *width = (int) fbRect.size.width;\n    if (height)\n        *height = (int) fbRect.size.height;\n}\n\nvoid _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,\n                                     int* left, int* top,\n                                     int* right, int* bottom)\n{\n    const NSRect contentRect = [window->ns.view frame];\n    const NSRect frameRect = [window->ns.object frameRectForContentRect:contentRect];\n\n    if (left)\n        *left = contentRect.origin.x - frameRect.origin.x;\n    if (top)\n        *top = frameRect.origin.y + frameRect.size.height -\n               contentRect.origin.y - contentRect.size.height;\n    if (right)\n        *right = frameRect.origin.x + frameRect.size.width -\n                 contentRect.origin.x - contentRect.size.width;\n    if (bottom)\n        *bottom = contentRect.origin.y - frameRect.origin.y;\n}\n\nvoid _glfwPlatformIconifyWindow(_GLFWwindow* window)\n{\n    [window->ns.object miniaturize:nil];\n}\n\nvoid _glfwPlatformRestoreWindow(_GLFWwindow* window)\n{\n    if ([window->ns.object isMiniaturized])\n        [window->ns.object deminiaturize:nil];\n    else if ([window->ns.object isZoomed])\n        [window->ns.object zoom:nil];\n}\n\nvoid _glfwPlatformMaximizeWindow(_GLFWwindow* window)\n{\n    if (![window->ns.object isZoomed])\n        [window->ns.object zoom:nil];\n}\n\nvoid _glfwPlatformShowWindow(_GLFWwindow* window)\n{\n    [window->ns.object orderFront:nil];\n}\n\nvoid _glfwPlatformHideWindow(_GLFWwindow* window)\n{\n    [window->ns.object orderOut:nil];\n}\n\nvoid _glfwPlatformRequestWindowAttention(_GLFWwindow* window)\n{\n    [NSApp requestUserAttention:NSInformationalRequest];\n}\n\nvoid _glfwPlatformFocusWindow(_GLFWwindow* window)\n{\n    // Make us the active application\n    // HACK: This has been moved here from initializeAppKit to prevent\n    //       applications using only hidden windows from being activated, but\n    //       should probably not be done every time any window is shown\n    [NSApp activateIgnoringOtherApps:YES];\n\n    [window->ns.object makeKeyAndOrderFront:nil];\n}\n\nvoid _glfwPlatformSetWindowMonitor(_GLFWwindow* window,\n                                   _GLFWmonitor* monitor,\n                                   int xpos, int ypos,\n                                   int width, int height,\n                                   int refreshRate)\n{\n    if (window->monitor == monitor)\n    {\n        if (monitor)\n        {\n            if (monitor->window == window)\n                acquireMonitor(window);\n        }\n        else\n        {\n            const NSRect contentRect =\n                NSMakeRect(xpos, transformY(ypos + height), width, height);\n            const NSRect frameRect =\n                [window->ns.object frameRectForContentRect:contentRect\n                                                 styleMask:getStyleMask(window)];\n\n            [window->ns.object setFrame:frameRect display:YES];\n        }\n\n        return;\n    }\n\n    if (window->monitor)\n        releaseMonitor(window);\n\n    _glfwInputWindowMonitorChange(window, monitor);\n\n    // HACK: Allow the state cached in Cocoa to catch up to reality\n    // TODO: Solve this in a less terrible way\n    _glfwPlatformPollEvents();\n\n    const NSUInteger styleMask = getStyleMask(window);\n    [window->ns.object setStyleMask:styleMask];\n    [window->ns.object makeFirstResponder:window->ns.view];\n\n    NSRect contentRect;\n\n    if (monitor)\n    {\n        GLFWvidmode mode;\n\n        _glfwPlatformGetVideoMode(window->monitor, &mode);\n        _glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);\n\n        contentRect = NSMakeRect(xpos, transformY(ypos + mode.height),\n                                    mode.width, mode.height);\n    }\n    else\n    {\n        contentRect = NSMakeRect(xpos, transformY(ypos + height),\n                                    width, height);\n    }\n\n    NSRect frameRect = [window->ns.object frameRectForContentRect:contentRect\n                                                        styleMask:styleMask];\n    [window->ns.object setFrame:frameRect display:YES];\n\n    if (monitor)\n    {\n        [window->ns.object setLevel:NSMainMenuWindowLevel + 1];\n        [window->ns.object setHasShadow:NO];\n\n        acquireMonitor(window);\n    }\n    else\n    {\n        if (window->numer != GLFW_DONT_CARE &&\n            window->denom != GLFW_DONT_CARE)\n        {\n            [window->ns.object setContentAspectRatio:NSMakeSize(window->numer,\n                                                                window->denom)];\n        }\n\n        if (window->minwidth != GLFW_DONT_CARE &&\n            window->minheight != GLFW_DONT_CARE)\n        {\n            [window->ns.object setContentMinSize:NSMakeSize(window->minwidth,\n                                                            window->minheight)];\n        }\n\n        if (window->maxwidth != GLFW_DONT_CARE &&\n            window->maxheight != GLFW_DONT_CARE)\n        {\n            [window->ns.object setContentMaxSize:NSMakeSize(window->maxwidth,\n                                                            window->maxheight)];\n        }\n\n        if (window->floating)\n            [window->ns.object setLevel:NSFloatingWindowLevel];\n        else\n            [window->ns.object setLevel:NSNormalWindowLevel];\n\n        [window->ns.object setHasShadow:YES];\n        // HACK: Clearing NSWindowStyleMaskTitled resets and disables the window\n        //       title property but the miniwindow title property is unaffected\n        [window->ns.object setTitle:[window->ns.object miniwindowTitle]];\n    }\n}\n\nint _glfwPlatformWindowFocused(_GLFWwindow* window)\n{\n    return [window->ns.object isKeyWindow];\n}\n\nint _glfwPlatformWindowIconified(_GLFWwindow* window)\n{\n    return [window->ns.object isMiniaturized];\n}\n\nint _glfwPlatformWindowVisible(_GLFWwindow* window)\n{\n    return [window->ns.object isVisible];\n}\n\nint _glfwPlatformWindowMaximized(_GLFWwindow* window)\n{\n    return [window->ns.object isZoomed];\n}\n\nint _glfwPlatformFramebufferTransparent(_GLFWwindow* window)\n{\n    return ![window->ns.object isOpaque] && ![window->ns.view isOpaque];\n}\n\nvoid _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)\n{\n    [window->ns.object setStyleMask:getStyleMask(window)];\n}\n\nvoid _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)\n{\n    [window->ns.object setStyleMask:getStyleMask(window)];\n    [window->ns.object makeFirstResponder:window->ns.view];\n}\n\nvoid _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)\n{\n    if (enabled)\n        [window->ns.object setLevel:NSFloatingWindowLevel];\n    else\n        [window->ns.object setLevel:NSNormalWindowLevel];\n}\n\nvoid _glfwPlatformPollEvents(void)\n{\n    for (;;)\n    {\n        NSEvent* event = [NSApp nextEventMatchingMask:NSEventMaskAny\n                                            untilDate:[NSDate distantPast]\n                                               inMode:NSDefaultRunLoopMode\n                                              dequeue:YES];\n        if (event == nil)\n            break;\n\n        [NSApp sendEvent:event];\n    }\n\n    [_glfw.ns.autoreleasePool drain];\n    _glfw.ns.autoreleasePool = [[NSAutoreleasePool alloc] init];\n}\n\nvoid _glfwPlatformWaitEvents(void)\n{\n    // I wanted to pass NO to dequeue:, and rely on PollEvents to\n    // dequeue and send.  For reasons not at all clear to me, passing\n    // NO to dequeue: causes this method never to return.\n    NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny\n                                        untilDate:[NSDate distantFuture]\n                                           inMode:NSDefaultRunLoopMode\n                                          dequeue:YES];\n    [NSApp sendEvent:event];\n\n    _glfwPlatformPollEvents();\n}\n\nvoid _glfwPlatformWaitEventsTimeout(double timeout)\n{\n    NSDate* date = [NSDate dateWithTimeIntervalSinceNow:timeout];\n    NSEvent* event = [NSApp nextEventMatchingMask:NSEventMaskAny\n                                        untilDate:date\n                                           inMode:NSDefaultRunLoopMode\n                                          dequeue:YES];\n    if (event)\n        [NSApp sendEvent:event];\n\n    _glfwPlatformPollEvents();\n}\n\nvoid _glfwPlatformPostEmptyEvent(void)\n{\n    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];\n    NSEvent* event = [NSEvent otherEventWithType:NSEventTypeApplicationDefined\n                                        location:NSMakePoint(0, 0)\n                                   modifierFlags:0\n                                       timestamp:0\n                                    windowNumber:0\n                                         context:nil\n                                         subtype:0\n                                           data1:0\n                                           data2:0];\n    [NSApp postEvent:event atStart:YES];\n    [pool drain];\n}\n\nvoid _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)\n{\n    const NSRect contentRect = [window->ns.view frame];\n    const NSPoint pos = [window->ns.object mouseLocationOutsideOfEventStream];\n\n    if (xpos)\n        *xpos = pos.x;\n    if (ypos)\n        *ypos = contentRect.size.height - pos.y - 1;\n}\n\nvoid _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)\n{\n    updateCursorImage(window);\n\n    const NSRect contentRect = [window->ns.view frame];\n    const NSPoint pos = [window->ns.object mouseLocationOutsideOfEventStream];\n\n    window->ns.cursorWarpDeltaX += x - pos.x;\n    window->ns.cursorWarpDeltaY += y - contentRect.size.height + pos.y;\n\n    if (window->monitor)\n    {\n        CGDisplayMoveCursorToPoint(window->monitor->ns.displayID,\n                                   CGPointMake(x, y));\n    }\n    else\n    {\n        const NSRect localRect = NSMakeRect(x, contentRect.size.height - y - 1, 0, 0);\n        const NSRect globalRect = [window->ns.object convertRectToScreen:localRect];\n        const NSPoint globalPoint = globalRect.origin;\n\n        CGWarpMouseCursorPosition(CGPointMake(globalPoint.x,\n                                              transformY(globalPoint.y)));\n    }\n}\n\nvoid _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)\n{\n    if (mode == GLFW_CURSOR_DISABLED)\n    {\n        _glfw.ns.disabledCursorWindow = window;\n        _glfwPlatformGetCursorPos(window,\n                                  &_glfw.ns.restoreCursorPosX,\n                                  &_glfw.ns.restoreCursorPosY);\n        centerCursor(window);\n        CGAssociateMouseAndMouseCursorPosition(false);\n    }\n    else if (_glfw.ns.disabledCursorWindow == window)\n    {\n        _glfw.ns.disabledCursorWindow = NULL;\n        CGAssociateMouseAndMouseCursorPosition(true);\n        _glfwPlatformSetCursorPos(window,\n                                  _glfw.ns.restoreCursorPosX,\n                                  _glfw.ns.restoreCursorPosY);\n    }\n\n    if (cursorInClientArea(window))\n        updateCursorImage(window);\n}\n\nconst char* _glfwPlatformGetScancodeName(int scancode)\n{\n    UInt32 deadKeyState = 0;\n    UniChar characters[8];\n    UniCharCount characterCount = 0;\n\n    if (UCKeyTranslate([(NSData*) _glfw.ns.unicodeData bytes],\n                       scancode,\n                       kUCKeyActionDisplay,\n                       0,\n                       LMGetKbdType(),\n                       kUCKeyTranslateNoDeadKeysBit,\n                       &deadKeyState,\n                       sizeof(characters) / sizeof(characters[0]),\n                       &characterCount,\n                       characters) != noErr)\n    {\n        return NULL;\n    }\n\n    if (!characterCount)\n        return NULL;\n\n    CFStringRef string = CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault,\n                                                            characters,\n                                                            characterCount,\n                                                            kCFAllocatorNull);\n    CFStringGetCString(string,\n                       _glfw.ns.keyName,\n                       sizeof(_glfw.ns.keyName),\n                       kCFStringEncodingUTF8);\n    CFRelease(string);\n\n    return _glfw.ns.keyName;\n}\n\nint _glfwPlatformGetKeyScancode(int key)\n{\n    return _glfw.ns.scancodes[key];\n}\n\nint _glfwPlatformCreateCursor(_GLFWcursor* cursor,\n                              const GLFWimage* image,\n                              int xhot, int yhot)\n{\n    NSImage* native;\n    NSBitmapImageRep* rep;\n\n    if (!initializeAppKit())\n        return GLFW_FALSE;\n\n    rep = [[NSBitmapImageRep alloc]\n        initWithBitmapDataPlanes:NULL\n                      pixelsWide:image->width\n                      pixelsHigh:image->height\n                   bitsPerSample:8\n                 samplesPerPixel:4\n                        hasAlpha:YES\n                        isPlanar:NO\n                  colorSpaceName:NSCalibratedRGBColorSpace\n                    bitmapFormat:NSAlphaNonpremultipliedBitmapFormat\n                     bytesPerRow:image->width * 4\n                    bitsPerPixel:32];\n\n    if (rep == nil)\n        return GLFW_FALSE;\n\n    memcpy([rep bitmapData], image->pixels, image->width * image->height * 4);\n\n    native = [[NSImage alloc] initWithSize:NSMakeSize(image->width, image->height)];\n    [native addRepresentation:rep];\n\n    cursor->ns.object = [[NSCursor alloc] initWithImage:native\n                                                hotSpot:NSMakePoint(xhot, yhot)];\n\n    [native release];\n    [rep release];\n\n    if (cursor->ns.object == nil)\n        return GLFW_FALSE;\n\n    return GLFW_TRUE;\n}\n\nint _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)\n{\n    if (!initializeAppKit())\n        return GLFW_FALSE;\n\n    if (shape == GLFW_ARROW_CURSOR)\n        cursor->ns.object = [NSCursor arrowCursor];\n    else if (shape == GLFW_IBEAM_CURSOR)\n        cursor->ns.object = [NSCursor IBeamCursor];\n    else if (shape == GLFW_CROSSHAIR_CURSOR)\n        cursor->ns.object = [NSCursor crosshairCursor];\n    else if (shape == GLFW_HAND_CURSOR)\n        cursor->ns.object = [NSCursor pointingHandCursor];\n    else if (shape == GLFW_HRESIZE_CURSOR)\n        cursor->ns.object = [NSCursor resizeLeftRightCursor];\n    else if (shape == GLFW_VRESIZE_CURSOR)\n        cursor->ns.object = [NSCursor resizeUpDownCursor];\n\n    if (!cursor->ns.object)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to retrieve standard cursor\");\n        return GLFW_FALSE;\n    }\n\n    [cursor->ns.object retain];\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyCursor(_GLFWcursor* cursor)\n{\n    if (cursor->ns.object)\n        [(NSCursor*) cursor->ns.object release];\n}\n\nvoid _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)\n{\n    if (cursorInClientArea(window))\n        updateCursorImage(window);\n}\n\nvoid _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string)\n{\n    NSArray* types = [NSArray arrayWithObjects:NSStringPboardType, nil];\n\n    NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];\n    [pasteboard declareTypes:types owner:nil];\n    [pasteboard setString:[NSString stringWithUTF8String:string]\n                  forType:NSStringPboardType];\n}\n\nconst char* _glfwPlatformGetClipboardString(_GLFWwindow* window)\n{\n    NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];\n\n    if (![[pasteboard types] containsObject:NSStringPboardType])\n    {\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"Cocoa: Failed to retrieve string from pasteboard\");\n        return NULL;\n    }\n\n    NSString* object = [pasteboard stringForType:NSStringPboardType];\n    if (!object)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to retrieve object from pasteboard\");\n        return NULL;\n    }\n\n    free(_glfw.ns.clipboardString);\n    _glfw.ns.clipboardString = strdup([object UTF8String]);\n\n    return _glfw.ns.clipboardString;\n}\n\nvoid _glfwPlatformGetRequiredInstanceExtensions(char** extensions)\n{\n    if (!_glfw.vk.KHR_surface || !_glfw.vk.MVK_macos_surface)\n        return;\n\n    extensions[0] = \"VK_KHR_surface\";\n    extensions[1] = \"VK_MVK_macos_surface\";\n}\n\nint _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,\n                                                      VkPhysicalDevice device,\n                                                      uint32_t queuefamily)\n{\n    return GLFW_TRUE;\n}\n\nVkResult _glfwPlatformCreateWindowSurface(VkInstance instance,\n                                          _GLFWwindow* window,\n                                          const VkAllocationCallbacks* allocator,\n                                          VkSurfaceKHR* surface)\n{\n#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101100\n    VkResult err;\n    VkMacOSSurfaceCreateInfoMVK sci;\n    PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;\n\n    vkCreateMacOSSurfaceMVK = (PFN_vkCreateMacOSSurfaceMVK)\n        vkGetInstanceProcAddr(instance, \"vkCreateMacOSSurfaceMVK\");\n    if (!vkCreateMacOSSurfaceMVK)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Cocoa: Vulkan instance missing VK_MVK_macos_surface extension\");\n        return VK_ERROR_EXTENSION_NOT_PRESENT;\n    }\n\n    // HACK: Dynamically load Core Animation to avoid adding an extra\n    //       dependency for the majority who don't use MoltenVK\n    NSBundle* bundle = [NSBundle bundleWithPath:@\"/System/Library/Frameworks/QuartzCore.framework\"];\n    if (!bundle)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to find QuartzCore.framework\");\n        return VK_ERROR_EXTENSION_NOT_PRESENT;\n    }\n\n    // NOTE: Create the layer here as makeBackingLayer should not return nil\n    window->ns.layer = [[bundle classNamed:@\"CAMetalLayer\"] layer];\n    if (!window->ns.layer)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to create layer for view\");\n        return VK_ERROR_EXTENSION_NOT_PRESENT;\n    }\n\n    [window->ns.view setWantsLayer:YES];\n\n    memset(&sci, 0, sizeof(sci));\n    sci.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;\n    sci.pView = window->ns.view;\n\n    err = vkCreateMacOSSurfaceMVK(instance, &sci, allocator, surface);\n    if (err)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Cocoa: Failed to create Vulkan surface: %s\",\n                        _glfwGetVulkanResultString(err));\n    }\n\n    return err;\n#else\n    return VK_ERROR_EXTENSION_NOT_PRESENT;\n#endif\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI id glfwGetCocoaWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(nil);\n    return window->ns.object;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/context.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <assert.h>\n#include <stdio.h>\n#include <string.h>\n#include <limits.h>\n#include <stdio.h>\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig)\n{\n    if (ctxconfig->source != GLFW_NATIVE_CONTEXT_API &&\n        ctxconfig->source != GLFW_EGL_CONTEXT_API &&\n        ctxconfig->source != GLFW_OSMESA_CONTEXT_API)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM,\n                        \"Invalid context creation API 0x%08X\",\n                        ctxconfig->source);\n        return GLFW_FALSE;\n    }\n\n    if (ctxconfig->client != GLFW_NO_API &&\n        ctxconfig->client != GLFW_OPENGL_API &&\n        ctxconfig->client != GLFW_OPENGL_ES_API)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM,\n                        \"Invalid client API 0x%08X\",\n                        ctxconfig->client);\n        return GLFW_FALSE;\n    }\n\n    if (ctxconfig->client == GLFW_OPENGL_API)\n    {\n        if ((ctxconfig->major < 1 || ctxconfig->minor < 0) ||\n            (ctxconfig->major == 1 && ctxconfig->minor > 5) ||\n            (ctxconfig->major == 2 && ctxconfig->minor > 1) ||\n            (ctxconfig->major == 3 && ctxconfig->minor > 3))\n        {\n            // OpenGL 1.0 is the smallest valid version\n            // OpenGL 1.x series ended with version 1.5\n            // OpenGL 2.x series ended with version 2.1\n            // OpenGL 3.x series ended with version 3.3\n            // For now, let everything else through\n\n            _glfwInputError(GLFW_INVALID_VALUE,\n                            \"Invalid OpenGL version %i.%i\",\n                            ctxconfig->major, ctxconfig->minor);\n            return GLFW_FALSE;\n        }\n\n        if (ctxconfig->profile)\n        {\n            if (ctxconfig->profile != GLFW_OPENGL_CORE_PROFILE &&\n                ctxconfig->profile != GLFW_OPENGL_COMPAT_PROFILE)\n            {\n                _glfwInputError(GLFW_INVALID_ENUM,\n                                \"Invalid OpenGL profile 0x%08X\",\n                                ctxconfig->profile);\n                return GLFW_FALSE;\n            }\n\n            if (ctxconfig->major <= 2 ||\n                (ctxconfig->major == 3 && ctxconfig->minor < 2))\n            {\n                // Desktop OpenGL context profiles are only defined for version 3.2\n                // and above\n\n                _glfwInputError(GLFW_INVALID_VALUE,\n                                \"Context profiles are only defined for OpenGL version 3.2 and above\");\n                return GLFW_FALSE;\n            }\n        }\n\n        if (ctxconfig->forward && ctxconfig->major <= 2)\n        {\n            // Forward-compatible contexts are only defined for OpenGL version 3.0 and above\n            _glfwInputError(GLFW_INVALID_VALUE,\n                            \"Forward-compatibility is only defined for OpenGL version 3.0 and above\");\n            return GLFW_FALSE;\n        }\n    }\n    else if (ctxconfig->client == GLFW_OPENGL_ES_API)\n    {\n        if (ctxconfig->major < 1 || ctxconfig->minor < 0 ||\n            (ctxconfig->major == 1 && ctxconfig->minor > 1) ||\n            (ctxconfig->major == 2 && ctxconfig->minor > 0))\n        {\n            // OpenGL ES 1.0 is the smallest valid version\n            // OpenGL ES 1.x series ended with version 1.1\n            // OpenGL ES 2.x series ended with version 2.0\n            // For now, let everything else through\n\n            _glfwInputError(GLFW_INVALID_VALUE,\n                            \"Invalid OpenGL ES version %i.%i\",\n                            ctxconfig->major, ctxconfig->minor);\n            return GLFW_FALSE;\n        }\n    }\n\n    if (ctxconfig->robustness)\n    {\n        if (ctxconfig->robustness != GLFW_NO_RESET_NOTIFICATION &&\n            ctxconfig->robustness != GLFW_LOSE_CONTEXT_ON_RESET)\n        {\n            _glfwInputError(GLFW_INVALID_ENUM,\n                            \"Invalid context robustness mode 0x%08X\",\n                            ctxconfig->robustness);\n            return GLFW_FALSE;\n        }\n    }\n\n    if (ctxconfig->release)\n    {\n        if (ctxconfig->release != GLFW_RELEASE_BEHAVIOR_NONE &&\n            ctxconfig->release != GLFW_RELEASE_BEHAVIOR_FLUSH)\n        {\n            _glfwInputError(GLFW_INVALID_ENUM,\n                            \"Invalid context release behavior 0x%08X\",\n                            ctxconfig->release);\n            return GLFW_FALSE;\n        }\n    }\n\n    return GLFW_TRUE;\n}\n\nconst _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,\n                                         const _GLFWfbconfig* alternatives,\n                                         unsigned int count)\n{\n    unsigned int i;\n    unsigned int missing, leastMissing = UINT_MAX;\n    unsigned int colorDiff, leastColorDiff = UINT_MAX;\n    unsigned int extraDiff, leastExtraDiff = UINT_MAX;\n    const _GLFWfbconfig* current;\n    const _GLFWfbconfig* closest = NULL;\n\n    for (i = 0;  i < count;  i++)\n    {\n        current = alternatives + i;\n\n        if (desired->stereo > 0 && current->stereo == 0)\n        {\n            // Stereo is a hard constraint\n            continue;\n        }\n\n        if (desired->doublebuffer != current->doublebuffer)\n        {\n            // Double buffering is a hard constraint\n            continue;\n        }\n\n        // Count number of missing buffers\n        {\n            missing = 0;\n\n            if (desired->alphaBits > 0 && current->alphaBits == 0)\n                missing++;\n\n            if (desired->depthBits > 0 && current->depthBits == 0)\n                missing++;\n\n            if (desired->stencilBits > 0 && current->stencilBits == 0)\n                missing++;\n\n            if (desired->auxBuffers > 0 &&\n                current->auxBuffers < desired->auxBuffers)\n            {\n                missing += desired->auxBuffers - current->auxBuffers;\n            }\n\n            if (desired->samples > 0 && current->samples == 0)\n            {\n                // Technically, several multisampling buffers could be\n                // involved, but that's a lower level implementation detail and\n                // not important to us here, so we count them as one\n                missing++;\n            }\n\n            if (desired->transparent != current->transparent)\n                missing++;\n        }\n\n        // These polynomials make many small channel size differences matter\n        // less than one large channel size difference\n\n        // Calculate color channel size difference value\n        {\n            colorDiff = 0;\n\n            if (desired->redBits != GLFW_DONT_CARE)\n            {\n                colorDiff += (desired->redBits - current->redBits) *\n                             (desired->redBits - current->redBits);\n            }\n\n            if (desired->greenBits != GLFW_DONT_CARE)\n            {\n                colorDiff += (desired->greenBits - current->greenBits) *\n                             (desired->greenBits - current->greenBits);\n            }\n\n            if (desired->blueBits != GLFW_DONT_CARE)\n            {\n                colorDiff += (desired->blueBits - current->blueBits) *\n                             (desired->blueBits - current->blueBits);\n            }\n        }\n\n        // Calculate non-color channel size difference value\n        {\n            extraDiff = 0;\n\n            if (desired->alphaBits != GLFW_DONT_CARE)\n            {\n                extraDiff += (desired->alphaBits - current->alphaBits) *\n                             (desired->alphaBits - current->alphaBits);\n            }\n\n            if (desired->depthBits != GLFW_DONT_CARE)\n            {\n                extraDiff += (desired->depthBits - current->depthBits) *\n                             (desired->depthBits - current->depthBits);\n            }\n\n            if (desired->stencilBits != GLFW_DONT_CARE)\n            {\n                extraDiff += (desired->stencilBits - current->stencilBits) *\n                             (desired->stencilBits - current->stencilBits);\n            }\n\n            if (desired->accumRedBits != GLFW_DONT_CARE)\n            {\n                extraDiff += (desired->accumRedBits - current->accumRedBits) *\n                             (desired->accumRedBits - current->accumRedBits);\n            }\n\n            if (desired->accumGreenBits != GLFW_DONT_CARE)\n            {\n                extraDiff += (desired->accumGreenBits - current->accumGreenBits) *\n                             (desired->accumGreenBits - current->accumGreenBits);\n            }\n\n            if (desired->accumBlueBits != GLFW_DONT_CARE)\n            {\n                extraDiff += (desired->accumBlueBits - current->accumBlueBits) *\n                             (desired->accumBlueBits - current->accumBlueBits);\n            }\n\n            if (desired->accumAlphaBits != GLFW_DONT_CARE)\n            {\n                extraDiff += (desired->accumAlphaBits - current->accumAlphaBits) *\n                             (desired->accumAlphaBits - current->accumAlphaBits);\n            }\n\n            if (desired->samples != GLFW_DONT_CARE)\n            {\n                extraDiff += (desired->samples - current->samples) *\n                             (desired->samples - current->samples);\n            }\n\n            if (desired->sRGB && !current->sRGB)\n                extraDiff++;\n        }\n\n        // Figure out if the current one is better than the best one found so far\n        // Least number of missing buffers is the most important heuristic,\n        // then color buffer size match and lastly size match for other buffers\n\n        if (missing < leastMissing)\n            closest = current;\n        else if (missing == leastMissing)\n        {\n            if ((colorDiff < leastColorDiff) ||\n                (colorDiff == leastColorDiff && extraDiff < leastExtraDiff))\n            {\n                closest = current;\n            }\n        }\n\n        if (current == closest)\n        {\n            leastMissing = missing;\n            leastColorDiff = colorDiff;\n            leastExtraDiff = extraDiff;\n        }\n    }\n\n    return closest;\n}\n\nGLFWbool _glfwRefreshContextAttribs(const _GLFWctxconfig* ctxconfig)\n{\n    int i;\n    _GLFWwindow* window;\n    const char* version;\n    const char* prefixes[] =\n    {\n        \"OpenGL ES-CM \",\n        \"OpenGL ES-CL \",\n        \"OpenGL ES \",\n        NULL\n    };\n\n    window = _glfwPlatformGetTls(&_glfw.contextSlot);\n\n    window->context.source = ctxconfig->source;\n    window->context.client = GLFW_OPENGL_API;\n\n    window->context.GetIntegerv = (PFNGLGETINTEGERVPROC)\n        window->context.getProcAddress(\"glGetIntegerv\");\n    window->context.GetString = (PFNGLGETSTRINGPROC)\n        window->context.getProcAddress(\"glGetString\");\n    if (!window->context.GetIntegerv || !window->context.GetString)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR, \"Entry point retrieval is broken\");\n        return GLFW_FALSE;\n    }\n\n    version = (const char*) window->context.GetString(GL_VERSION);\n    if (!version)\n    {\n        if (ctxconfig->client == GLFW_OPENGL_API)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"OpenGL version string retrieval is broken\");\n        }\n        else\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"OpenGL ES version string retrieval is broken\");\n        }\n\n        return GLFW_FALSE;\n    }\n\n    for (i = 0;  prefixes[i];  i++)\n    {\n        const size_t length = strlen(prefixes[i]);\n\n        if (strncmp(version, prefixes[i], length) == 0)\n        {\n            version += length;\n            window->context.client = GLFW_OPENGL_ES_API;\n            break;\n        }\n    }\n\n    if (!sscanf(version, \"%d.%d.%d\",\n                &window->context.major,\n                &window->context.minor,\n                &window->context.revision))\n    {\n        if (window->context.client == GLFW_OPENGL_API)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"No version found in OpenGL version string\");\n        }\n        else\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"No version found in OpenGL ES version string\");\n        }\n\n        return GLFW_FALSE;\n    }\n\n    if (window->context.major < ctxconfig->major ||\n        (window->context.major == ctxconfig->major &&\n         window->context.minor < ctxconfig->minor))\n    {\n        // The desired OpenGL version is greater than the actual version\n        // This only happens if the machine lacks {GLX|WGL}_ARB_create_context\n        // /and/ the user has requested an OpenGL version greater than 1.0\n\n        // For API consistency, we emulate the behavior of the\n        // {GLX|WGL}_ARB_create_context extension and fail here\n\n        if (window->context.client == GLFW_OPENGL_API)\n        {\n            _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                            \"Requested OpenGL version %i.%i, got version %i.%i\",\n                            ctxconfig->major, ctxconfig->minor,\n                            window->context.major, window->context.minor);\n        }\n        else\n        {\n            _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                            \"Requested OpenGL ES version %i.%i, got version %i.%i\",\n                            ctxconfig->major, ctxconfig->minor,\n                            window->context.major, window->context.minor);\n        }\n\n        return GLFW_FALSE;\n    }\n\n    if (window->context.major >= 3)\n    {\n        // OpenGL 3.0+ uses a different function for extension string retrieval\n        // We cache it here instead of in glfwExtensionSupported mostly to alert\n        // users as early as possible that their build may be broken\n\n        window->context.GetStringi = (PFNGLGETSTRINGIPROC)\n            window->context.getProcAddress(\"glGetStringi\");\n        if (!window->context.GetStringi)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"Entry point retrieval is broken\");\n            return GLFW_FALSE;\n        }\n    }\n\n    if (window->context.client == GLFW_OPENGL_API)\n    {\n        // Read back context flags (OpenGL 3.0 and above)\n        if (window->context.major >= 3)\n        {\n            GLint flags;\n            window->context.GetIntegerv(GL_CONTEXT_FLAGS, &flags);\n\n            if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT)\n                window->context.forward = GLFW_TRUE;\n\n            if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)\n                window->context.debug = GLFW_TRUE;\n            else if (glfwExtensionSupported(\"GL_ARB_debug_output\") &&\n                     ctxconfig->debug)\n            {\n                // HACK: This is a workaround for older drivers (pre KHR_debug)\n                //       not setting the debug bit in the context flags for\n                //       debug contexts\n                window->context.debug = GLFW_TRUE;\n            }\n\n            if (flags & GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR)\n                window->context.noerror = GLFW_TRUE;\n        }\n\n        // Read back OpenGL context profile (OpenGL 3.2 and above)\n        if (window->context.major >= 4 ||\n            (window->context.major == 3 && window->context.minor >= 2))\n        {\n            GLint mask;\n            window->context.GetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);\n\n            if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)\n                window->context.profile = GLFW_OPENGL_COMPAT_PROFILE;\n            else if (mask & GL_CONTEXT_CORE_PROFILE_BIT)\n                window->context.profile = GLFW_OPENGL_CORE_PROFILE;\n            else if (glfwExtensionSupported(\"GL_ARB_compatibility\"))\n            {\n                // HACK: This is a workaround for the compatibility profile bit\n                //       not being set in the context flags if an OpenGL 3.2+\n                //       context was created without having requested a specific\n                //       version\n                window->context.profile = GLFW_OPENGL_COMPAT_PROFILE;\n            }\n        }\n\n        // Read back robustness strategy\n        if (glfwExtensionSupported(\"GL_ARB_robustness\"))\n        {\n            // NOTE: We avoid using the context flags for detection, as they are\n            //       only present from 3.0 while the extension applies from 1.1\n\n            GLint strategy;\n            window->context.GetIntegerv(GL_RESET_NOTIFICATION_STRATEGY_ARB,\n                                        &strategy);\n\n            if (strategy == GL_LOSE_CONTEXT_ON_RESET_ARB)\n                window->context.robustness = GLFW_LOSE_CONTEXT_ON_RESET;\n            else if (strategy == GL_NO_RESET_NOTIFICATION_ARB)\n                window->context.robustness = GLFW_NO_RESET_NOTIFICATION;\n        }\n    }\n    else\n    {\n        // Read back robustness strategy\n        if (glfwExtensionSupported(\"GL_EXT_robustness\"))\n        {\n            // NOTE: The values of these constants match those of the OpenGL ARB\n            //       one, so we can reuse them here\n\n            GLint strategy;\n            window->context.GetIntegerv(GL_RESET_NOTIFICATION_STRATEGY_ARB,\n                                        &strategy);\n\n            if (strategy == GL_LOSE_CONTEXT_ON_RESET_ARB)\n                window->context.robustness = GLFW_LOSE_CONTEXT_ON_RESET;\n            else if (strategy == GL_NO_RESET_NOTIFICATION_ARB)\n                window->context.robustness = GLFW_NO_RESET_NOTIFICATION;\n        }\n    }\n\n    if (glfwExtensionSupported(\"GL_KHR_context_flush_control\"))\n    {\n        GLint behavior;\n        window->context.GetIntegerv(GL_CONTEXT_RELEASE_BEHAVIOR, &behavior);\n\n        if (behavior == GL_NONE)\n            window->context.release = GLFW_RELEASE_BEHAVIOR_NONE;\n        else if (behavior == GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH)\n            window->context.release = GLFW_RELEASE_BEHAVIOR_FLUSH;\n    }\n\n    // Clearing the front buffer to black to avoid garbage pixels left over from\n    // previous uses of our bit of VRAM\n    {\n        PFNGLCLEARPROC glClear = (PFNGLCLEARPROC)\n            window->context.getProcAddress(\"glClear\");\n        glClear(GL_COLOR_BUFFER_BIT);\n        window->context.swapBuffers(window);\n    }\n\n    return GLFW_TRUE;\n}\n\nGLFWbool _glfwStringInExtensionString(const char* string, const char* extensions)\n{\n    const char* start = extensions;\n\n    for (;;)\n    {\n        const char* where;\n        const char* terminator;\n\n        where = strstr(start, string);\n        if (!where)\n            return GLFW_FALSE;\n\n        terminator = where + strlen(string);\n        if (where == start || *(where - 1) == ' ')\n        {\n            if (*terminator == ' ' || *terminator == '\\0')\n                break;\n        }\n\n        start = terminator;\n    }\n\n    return GLFW_TRUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW public API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI void glfwMakeContextCurrent(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFWwindow* previous = _glfwPlatformGetTls(&_glfw.contextSlot);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (window && window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return;\n    }\n\n    if (previous)\n    {\n        if (!window || window->context.source != previous->context.source)\n            previous->context.makeCurrent(NULL);\n    }\n\n    if (window)\n        window->context.makeCurrent(window);\n}\n\nGLFWAPI GLFWwindow* glfwGetCurrentContext(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return _glfwPlatformGetTls(&_glfw.contextSlot);\n}\n\nGLFWAPI void glfwSwapBuffers(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return;\n    }\n\n    window->context.swapBuffers(window);\n}\n\nGLFWAPI void glfwSwapInterval(int interval)\n{\n    _GLFWwindow* window;\n\n    _GLFW_REQUIRE_INIT();\n\n    window = _glfwPlatformGetTls(&_glfw.contextSlot);\n    if (!window)\n    {\n        _glfwInputError(GLFW_NO_CURRENT_CONTEXT, NULL);\n        return;\n    }\n\n    window->context.swapInterval(interval);\n}\n\nGLFWAPI int glfwExtensionSupported(const char* extension)\n{\n    _GLFWwindow* window;\n    assert(extension != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n\n    window = _glfwPlatformGetTls(&_glfw.contextSlot);\n    if (!window)\n    {\n        _glfwInputError(GLFW_NO_CURRENT_CONTEXT, NULL);\n        return GLFW_FALSE;\n    }\n\n    if (*extension == '\\0')\n    {\n        _glfwInputError(GLFW_INVALID_VALUE, \"Extension name is empty string\");\n        return GLFW_FALSE;\n    }\n\n    if (window->context.major >= 3)\n    {\n        int i;\n        GLint count;\n\n        // Check if extension is in the modern OpenGL extensions string list\n\n        window->context.GetIntegerv(GL_NUM_EXTENSIONS, &count);\n\n        for (i = 0;  i < count;  i++)\n        {\n            const char* en = (const char*)\n                window->context.GetStringi(GL_EXTENSIONS, i);\n            if (!en)\n            {\n                _glfwInputError(GLFW_PLATFORM_ERROR,\n                                \"Extension string retrieval is broken\");\n                return GLFW_FALSE;\n            }\n\n            if (strcmp(en, extension) == 0)\n                return GLFW_TRUE;\n        }\n    }\n    else\n    {\n        // Check if extension is in the old style OpenGL extensions string\n\n        const char* extensions = (const char*)\n            window->context.GetString(GL_EXTENSIONS);\n        if (!extensions)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"Extension string retrieval is broken\");\n            return GLFW_FALSE;\n        }\n\n        if (_glfwStringInExtensionString(extension, extensions))\n            return GLFW_TRUE;\n    }\n\n    // Check if extension is in the platform-specific string\n    return window->context.extensionSupported(extension);\n}\n\nGLFWAPI GLFWglproc glfwGetProcAddress(const char* procname)\n{\n    _GLFWwindow* window;\n    assert(procname != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    window = _glfwPlatformGetTls(&_glfw.contextSlot);\n    if (!window)\n    {\n        _glfwInputError(GLFW_NO_CURRENT_CONTEXT, NULL);\n        return NULL;\n    }\n\n    return window->context.getProcAddress(procname);\n}\n\n"
  },
  {
    "path": "external/GLFW/src/egl_context.c",
    "content": "//========================================================================\n// GLFW 3.3 EGL - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n\n\n// Return a description of the specified EGL error\n//\nstatic const char* getEGLErrorString(EGLint error)\n{\n    switch (error)\n    {\n        case EGL_SUCCESS:\n            return \"Success\";\n        case EGL_NOT_INITIALIZED:\n            return \"EGL is not or could not be initialized\";\n        case EGL_BAD_ACCESS:\n            return \"EGL cannot access a requested resource\";\n        case EGL_BAD_ALLOC:\n            return \"EGL failed to allocate resources for the requested operation\";\n        case EGL_BAD_ATTRIBUTE:\n            return \"An unrecognized attribute or attribute value was passed in the attribute list\";\n        case EGL_BAD_CONTEXT:\n            return \"An EGLContext argument does not name a valid EGL rendering context\";\n        case EGL_BAD_CONFIG:\n            return \"An EGLConfig argument does not name a valid EGL frame buffer configuration\";\n        case EGL_BAD_CURRENT_SURFACE:\n            return \"The current surface of the calling thread is a window, pixel buffer or pixmap that is no longer valid\";\n        case EGL_BAD_DISPLAY:\n            return \"An EGLDisplay argument does not name a valid EGL display connection\";\n        case EGL_BAD_SURFACE:\n            return \"An EGLSurface argument does not name a valid surface configured for GL rendering\";\n        case EGL_BAD_MATCH:\n            return \"Arguments are inconsistent\";\n        case EGL_BAD_PARAMETER:\n            return \"One or more argument values are invalid\";\n        case EGL_BAD_NATIVE_PIXMAP:\n            return \"A NativePixmapType argument does not refer to a valid native pixmap\";\n        case EGL_BAD_NATIVE_WINDOW:\n            return \"A NativeWindowType argument does not refer to a valid native window\";\n        case EGL_CONTEXT_LOST:\n            return \"The application must destroy all contexts and reinitialise\";\n        default:\n            return \"ERROR: UNKNOWN EGL ERROR\";\n    }\n}\n\n// Returns the specified attribute of the specified EGLConfig\n//\nstatic int getEGLConfigAttrib(EGLConfig config, int attrib)\n{\n    int value;\n    eglGetConfigAttrib(_glfw.egl.display, config, attrib, &value);\n    return value;\n}\n\n// Return the EGLConfig most closely matching the specified hints\n//\nstatic GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig,\n                                const _GLFWfbconfig* desired,\n                                EGLConfig* result)\n{\n    EGLConfig* nativeConfigs;\n    _GLFWfbconfig* usableConfigs;\n    const _GLFWfbconfig* closest;\n    int i, nativeCount, usableCount;\n\n    eglGetConfigs(_glfw.egl.display, NULL, 0, &nativeCount);\n    if (!nativeCount)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE, \"EGL: No EGLConfigs returned\");\n        return GLFW_FALSE;\n    }\n\n    nativeConfigs = calloc(nativeCount, sizeof(EGLConfig));\n    eglGetConfigs(_glfw.egl.display, nativeConfigs, nativeCount, &nativeCount);\n\n    usableConfigs = calloc(nativeCount, sizeof(_GLFWfbconfig));\n    usableCount = 0;\n\n    for (i = 0;  i < nativeCount;  i++)\n    {\n        const EGLConfig n = nativeConfigs[i];\n        _GLFWfbconfig* u = usableConfigs + usableCount;\n\n        // Only consider RGB(A) EGLConfigs\n        if (getEGLConfigAttrib(n, EGL_COLOR_BUFFER_TYPE) != EGL_RGB_BUFFER)\n            continue;\n\n        // Only consider window EGLConfigs\n        if (!(getEGLConfigAttrib(n, EGL_SURFACE_TYPE) & EGL_WINDOW_BIT))\n            continue;\n\n#if defined(_GLFW_X11)\n        XVisualInfo vi = {0};\n\n        // Only consider EGLConfigs with associated Visuals\n        vi.visualid = getEGLConfigAttrib(n, EGL_NATIVE_VISUAL_ID);\n        if (!vi.visualid)\n            continue;\n\n        if (desired->transparent)\n        {\n            int count;\n            XVisualInfo* vis = XGetVisualInfo(_glfw.x11.display,\n                                              VisualIDMask, &vi,\n                                              &count);\n            if (vis)\n            {\n                u->transparent = _glfwIsVisualTransparentX11(vis[0].visual);\n                XFree(vis);\n            }\n        }\n#endif // _GLFW_X11\n\n        if (ctxconfig->client == GLFW_OPENGL_ES_API)\n        {\n            if (ctxconfig->major == 1)\n            {\n                if (!(getEGLConfigAttrib(n, EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES_BIT))\n                    continue;\n            }\n            else\n            {\n                if (!(getEGLConfigAttrib(n, EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT))\n                    continue;\n            }\n        }\n        else if (ctxconfig->client == GLFW_OPENGL_API)\n        {\n            if (!(getEGLConfigAttrib(n, EGL_RENDERABLE_TYPE) & EGL_OPENGL_BIT))\n                continue;\n        }\n\n        u->redBits = getEGLConfigAttrib(n, EGL_RED_SIZE);\n        u->greenBits = getEGLConfigAttrib(n, EGL_GREEN_SIZE);\n        u->blueBits = getEGLConfigAttrib(n, EGL_BLUE_SIZE);\n\n        u->alphaBits = getEGLConfigAttrib(n, EGL_ALPHA_SIZE);\n        u->depthBits = getEGLConfigAttrib(n, EGL_DEPTH_SIZE);\n        u->stencilBits = getEGLConfigAttrib(n, EGL_STENCIL_SIZE);\n\n        u->samples = getEGLConfigAttrib(n, EGL_SAMPLES);\n        u->doublebuffer = GLFW_TRUE;\n\n        u->handle = (uintptr_t) n;\n        usableCount++;\n    }\n\n    closest = _glfwChooseFBConfig(desired, usableConfigs, usableCount);\n    if (closest)\n        *result = (EGLConfig) closest->handle;\n\n    free(nativeConfigs);\n    free(usableConfigs);\n\n    return closest != NULL;\n}\n\nstatic void makeContextCurrentEGL(_GLFWwindow* window)\n{\n    if (window)\n    {\n        if (!eglMakeCurrent(_glfw.egl.display,\n                            window->context.egl.surface,\n                            window->context.egl.surface,\n                            window->context.egl.handle))\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"EGL: Failed to make context current: %s\",\n                            getEGLErrorString(eglGetError()));\n            return;\n        }\n    }\n    else\n    {\n        if (!eglMakeCurrent(_glfw.egl.display,\n                            EGL_NO_SURFACE,\n                            EGL_NO_SURFACE,\n                            EGL_NO_CONTEXT))\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"EGL: Failed to clear current context: %s\",\n                            getEGLErrorString(eglGetError()));\n            return;\n        }\n    }\n\n    _glfwPlatformSetTls(&_glfw.contextSlot, window);\n}\n\nstatic void swapBuffersEGL(_GLFWwindow* window)\n{\n    if (window != _glfwPlatformGetTls(&_glfw.contextSlot))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"EGL: The context must be current on the calling thread when swapping buffers\");\n        return;\n    }\n\n    eglSwapBuffers(_glfw.egl.display, window->context.egl.surface);\n}\n\nstatic void swapIntervalEGL(int interval)\n{\n    eglSwapInterval(_glfw.egl.display, interval);\n}\n\nstatic int extensionSupportedEGL(const char* extension)\n{\n    const char* extensions = eglQueryString(_glfw.egl.display, EGL_EXTENSIONS);\n    if (extensions)\n    {\n        if (_glfwStringInExtensionString(extension, extensions))\n            return GLFW_TRUE;\n    }\n\n    return GLFW_FALSE;\n}\n\nstatic GLFWglproc getProcAddressEGL(const char* procname)\n{\n    _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot);\n\n    if (window->context.egl.client)\n    {\n        GLFWglproc proc = (GLFWglproc) _glfw_dlsym(window->context.egl.client,\n                                                   procname);\n        if (proc)\n            return proc;\n    }\n\n    return eglGetProcAddress(procname);\n}\n\nstatic void destroyContextEGL(_GLFWwindow* window)\n{\n#if defined(_GLFW_X11)\n    // NOTE: Do not unload libGL.so.1 while the X11 display is still open,\n    //       as it will make XCloseDisplay segfault\n    if (window->context.client != GLFW_OPENGL_API)\n#endif // _GLFW_X11\n    {\n        if (window->context.egl.client)\n        {\n            _glfw_dlclose(window->context.egl.client);\n            window->context.egl.client = NULL;\n        }\n    }\n\n    if (window->context.egl.surface)\n    {\n        eglDestroySurface(_glfw.egl.display, window->context.egl.surface);\n        window->context.egl.surface = EGL_NO_SURFACE;\n    }\n\n    if (window->context.egl.handle)\n    {\n        eglDestroyContext(_glfw.egl.display, window->context.egl.handle);\n        window->context.egl.handle = EGL_NO_CONTEXT;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialize EGL\n//\nGLFWbool _glfwInitEGL(void)\n{\n    int i;\n    const char* sonames[] =\n    {\n#if defined(_GLFW_EGL_LIBRARY)\n        _GLFW_EGL_LIBRARY,\n#elif defined(_GLFW_WIN32)\n        \"libEGL.dll\",\n        \"EGL.dll\",\n#elif defined(_GLFW_COCOA)\n        \"libEGL.dylib\",\n#elif defined(__CYGWIN__)\n        \"libEGL-1.so\",\n#else\n        \"libEGL.so.1\",\n#endif\n        NULL\n    };\n\n    if (_glfw.egl.handle)\n        return GLFW_TRUE;\n\n    for (i = 0;  sonames[i];  i++)\n    {\n        _glfw.egl.handle = _glfw_dlopen(sonames[i]);\n        if (_glfw.egl.handle)\n            break;\n    }\n\n    if (!_glfw.egl.handle)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE, \"EGL: Library not found\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.egl.prefix = (strncmp(sonames[i], \"lib\", 3) == 0);\n\n    _glfw.egl.GetConfigAttrib = (PFN_eglGetConfigAttrib)\n        _glfw_dlsym(_glfw.egl.handle, \"eglGetConfigAttrib\");\n    _glfw.egl.GetConfigs = (PFN_eglGetConfigs)\n        _glfw_dlsym(_glfw.egl.handle, \"eglGetConfigs\");\n    _glfw.egl.GetDisplay = (PFN_eglGetDisplay)\n        _glfw_dlsym(_glfw.egl.handle, \"eglGetDisplay\");\n    _glfw.egl.GetError = (PFN_eglGetError)\n        _glfw_dlsym(_glfw.egl.handle, \"eglGetError\");\n    _glfw.egl.Initialize = (PFN_eglInitialize)\n        _glfw_dlsym(_glfw.egl.handle, \"eglInitialize\");\n    _glfw.egl.Terminate = (PFN_eglTerminate)\n        _glfw_dlsym(_glfw.egl.handle, \"eglTerminate\");\n    _glfw.egl.BindAPI = (PFN_eglBindAPI)\n        _glfw_dlsym(_glfw.egl.handle, \"eglBindAPI\");\n    _glfw.egl.CreateContext = (PFN_eglCreateContext)\n        _glfw_dlsym(_glfw.egl.handle, \"eglCreateContext\");\n    _glfw.egl.DestroySurface = (PFN_eglDestroySurface)\n        _glfw_dlsym(_glfw.egl.handle, \"eglDestroySurface\");\n    _glfw.egl.DestroyContext = (PFN_eglDestroyContext)\n        _glfw_dlsym(_glfw.egl.handle, \"eglDestroyContext\");\n    _glfw.egl.CreateWindowSurface = (PFN_eglCreateWindowSurface)\n        _glfw_dlsym(_glfw.egl.handle, \"eglCreateWindowSurface\");\n    _glfw.egl.MakeCurrent = (PFN_eglMakeCurrent)\n        _glfw_dlsym(_glfw.egl.handle, \"eglMakeCurrent\");\n    _glfw.egl.SwapBuffers = (PFN_eglSwapBuffers)\n        _glfw_dlsym(_glfw.egl.handle, \"eglSwapBuffers\");\n    _glfw.egl.SwapInterval = (PFN_eglSwapInterval)\n        _glfw_dlsym(_glfw.egl.handle, \"eglSwapInterval\");\n    _glfw.egl.QueryString = (PFN_eglQueryString)\n        _glfw_dlsym(_glfw.egl.handle, \"eglQueryString\");\n    _glfw.egl.GetProcAddress = (PFN_eglGetProcAddress)\n        _glfw_dlsym(_glfw.egl.handle, \"eglGetProcAddress\");\n\n    if (!_glfw.egl.GetConfigAttrib ||\n        !_glfw.egl.GetConfigs ||\n        !_glfw.egl.GetDisplay ||\n        !_glfw.egl.GetError ||\n        !_glfw.egl.Initialize ||\n        !_glfw.egl.Terminate ||\n        !_glfw.egl.BindAPI ||\n        !_glfw.egl.CreateContext ||\n        !_glfw.egl.DestroySurface ||\n        !_glfw.egl.DestroyContext ||\n        !_glfw.egl.CreateWindowSurface ||\n        !_glfw.egl.MakeCurrent ||\n        !_glfw.egl.SwapBuffers ||\n        !_glfw.egl.SwapInterval ||\n        !_glfw.egl.QueryString ||\n        !_glfw.egl.GetProcAddress)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"EGL: Failed to load required entry points\");\n\n        _glfwTerminateEGL();\n        return GLFW_FALSE;\n    }\n\n    _glfw.egl.display = eglGetDisplay(_GLFW_EGL_NATIVE_DISPLAY);\n    if (_glfw.egl.display == EGL_NO_DISPLAY)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"EGL: Failed to get EGL display: %s\",\n                        getEGLErrorString(eglGetError()));\n\n        _glfwTerminateEGL();\n        return GLFW_FALSE;\n    }\n\n    if (!eglInitialize(_glfw.egl.display, &_glfw.egl.major, &_glfw.egl.minor))\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"EGL: Failed to initialize EGL: %s\",\n                        getEGLErrorString(eglGetError()));\n\n        _glfwTerminateEGL();\n        return GLFW_FALSE;\n    }\n\n    _glfw.egl.KHR_create_context =\n        extensionSupportedEGL(\"EGL_KHR_create_context\");\n    _glfw.egl.KHR_create_context_no_error =\n        extensionSupportedEGL(\"EGL_KHR_create_context_no_error\");\n    _glfw.egl.KHR_gl_colorspace =\n        extensionSupportedEGL(\"EGL_KHR_gl_colorspace\");\n    _glfw.egl.KHR_get_all_proc_addresses =\n        extensionSupportedEGL(\"EGL_KHR_get_all_proc_addresses\");\n    _glfw.egl.KHR_context_flush_control =\n        extensionSupportedEGL(\"EGL_KHR_context_flush_control\");\n\n    return GLFW_TRUE;\n}\n\n// Terminate EGL\n//\nvoid _glfwTerminateEGL(void)\n{\n    if (_glfw.egl.display)\n    {\n        eglTerminate(_glfw.egl.display);\n        _glfw.egl.display = EGL_NO_DISPLAY;\n    }\n\n    if (_glfw.egl.handle)\n    {\n        _glfw_dlclose(_glfw.egl.handle);\n        _glfw.egl.handle = NULL;\n    }\n}\n\n#define setAttrib(a, v) \\\n{ \\\n    assert((size_t) (index + 1) < sizeof(attribs) / sizeof(attribs[0])); \\\n    attribs[index++] = a; \\\n    attribs[index++] = v; \\\n}\n\n// Create the OpenGL or OpenGL ES context\n//\nGLFWbool _glfwCreateContextEGL(_GLFWwindow* window,\n                               const _GLFWctxconfig* ctxconfig,\n                               const _GLFWfbconfig* fbconfig)\n{\n    EGLint attribs[40];\n    EGLConfig config;\n    EGLContext share = NULL;\n    int index = 0;\n\n    if (!_glfw.egl.display)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE, \"EGL: API not available\");\n        return GLFW_FALSE;\n    }\n\n    if (ctxconfig->share)\n        share = ctxconfig->share->context.egl.handle;\n\n    if (!chooseEGLConfig(ctxconfig, fbconfig, &config))\n    {\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"EGL: Failed to find a suitable EGLConfig\");\n        return GLFW_FALSE;\n    }\n\n    if (ctxconfig->client == GLFW_OPENGL_ES_API)\n    {\n        if (!eglBindAPI(EGL_OPENGL_ES_API))\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"EGL: Failed to bind OpenGL ES: %s\",\n                            getEGLErrorString(eglGetError()));\n            return GLFW_FALSE;\n        }\n    }\n    else\n    {\n        if (!eglBindAPI(EGL_OPENGL_API))\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"EGL: Failed to bind OpenGL: %s\",\n                            getEGLErrorString(eglGetError()));\n            return GLFW_FALSE;\n        }\n    }\n\n    if (_glfw.egl.KHR_create_context)\n    {\n        int mask = 0, flags = 0;\n\n        if (ctxconfig->client == GLFW_OPENGL_API)\n        {\n            if (ctxconfig->forward)\n                flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;\n\n            if (ctxconfig->profile == GLFW_OPENGL_CORE_PROFILE)\n                mask |= EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;\n            else if (ctxconfig->profile == GLFW_OPENGL_COMPAT_PROFILE)\n                mask |= EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR;\n        }\n\n        if (ctxconfig->debug)\n            flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR;\n\n        if (ctxconfig->robustness)\n        {\n            if (ctxconfig->robustness == GLFW_NO_RESET_NOTIFICATION)\n            {\n                setAttrib(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR,\n                          EGL_NO_RESET_NOTIFICATION_KHR);\n            }\n            else if (ctxconfig->robustness == GLFW_LOSE_CONTEXT_ON_RESET)\n            {\n                setAttrib(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR,\n                          EGL_LOSE_CONTEXT_ON_RESET_KHR);\n            }\n\n            flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;\n        }\n\n        if (ctxconfig->noerror)\n        {\n            if (_glfw.egl.KHR_create_context_no_error)\n                setAttrib(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, GLFW_TRUE);\n        }\n\n        if (ctxconfig->major != 1 || ctxconfig->minor != 0)\n        {\n            setAttrib(EGL_CONTEXT_MAJOR_VERSION_KHR, ctxconfig->major);\n            setAttrib(EGL_CONTEXT_MINOR_VERSION_KHR, ctxconfig->minor);\n        }\n\n        if (mask)\n            setAttrib(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, mask);\n\n        if (flags)\n            setAttrib(EGL_CONTEXT_FLAGS_KHR, flags);\n    }\n    else\n    {\n        if (ctxconfig->client == GLFW_OPENGL_ES_API)\n            setAttrib(EGL_CONTEXT_CLIENT_VERSION, ctxconfig->major);\n    }\n\n    if (_glfw.egl.KHR_context_flush_control)\n    {\n        if (ctxconfig->release == GLFW_RELEASE_BEHAVIOR_NONE)\n        {\n            setAttrib(EGL_CONTEXT_RELEASE_BEHAVIOR_KHR,\n                      EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR);\n        }\n        else if (ctxconfig->release == GLFW_RELEASE_BEHAVIOR_FLUSH)\n        {\n            setAttrib(EGL_CONTEXT_RELEASE_BEHAVIOR_KHR,\n                      EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR);\n        }\n    }\n\n    setAttrib(EGL_NONE, EGL_NONE);\n\n    window->context.egl.handle = eglCreateContext(_glfw.egl.display,\n                                                  config, share, attribs);\n\n    if (window->context.egl.handle == EGL_NO_CONTEXT)\n    {\n        _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                        \"EGL: Failed to create context: %s\",\n                        getEGLErrorString(eglGetError()));\n        return GLFW_FALSE;\n    }\n\n    // Set up attributes for surface creation\n    {\n        int index = 0;\n\n        if (fbconfig->sRGB)\n        {\n            if (_glfw.egl.KHR_gl_colorspace)\n                setAttrib(EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR);\n        }\n\n        setAttrib(EGL_NONE, EGL_NONE);\n    }\n\n    window->context.egl.surface =\n        eglCreateWindowSurface(_glfw.egl.display,\n                               config,\n                               _GLFW_EGL_NATIVE_WINDOW,\n                               attribs);\n    if (window->context.egl.surface == EGL_NO_SURFACE)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"EGL: Failed to create window surface: %s\",\n                        getEGLErrorString(eglGetError()));\n        return GLFW_FALSE;\n    }\n\n    window->context.egl.config = config;\n\n    // Load the appropriate client library\n    if (!_glfw.egl.KHR_get_all_proc_addresses)\n    {\n        int i;\n        const char** sonames;\n        const char* es1sonames[] =\n        {\n#if defined(_GLFW_GLESV1_LIBRARY)\n            _GLFW_GLESV1_LIBRARY,\n#elif defined(_GLFW_WIN32)\n            \"GLESv1_CM.dll\",\n            \"libGLES_CM.dll\",\n#elif defined(_GLFW_COCOA)\n            \"libGLESv1_CM.dylib\",\n#else\n            \"libGLESv1_CM.so.1\",\n            \"libGLES_CM.so.1\",\n#endif\n            NULL\n        };\n        const char* es2sonames[] =\n        {\n#if defined(_GLFW_GLESV2_LIBRARY)\n            _GLFW_GLESV2_LIBRARY,\n#elif defined(_GLFW_WIN32)\n            \"GLESv2.dll\",\n            \"libGLESv2.dll\",\n#elif defined(_GLFW_COCOA)\n            \"libGLESv2.dylib\",\n#elif defined(__CYGWIN__)\n            \"libGLESv2-2.so\",\n#else\n            \"libGLESv2.so.2\",\n#endif\n            NULL\n        };\n        const char* glsonames[] =\n        {\n#if defined(_GLFW_OPENGL_LIBRARY)\n            _GLFW_OPENGL_LIBRARY,\n#elif defined(_GLFW_WIN32)\n#elif defined(_GLFW_COCOA)\n#else\n            \"libGL.so.1\",\n#endif\n            NULL\n        };\n\n        if (ctxconfig->client == GLFW_OPENGL_ES_API)\n        {\n            if (ctxconfig->major == 1)\n                sonames = es1sonames;\n            else\n                sonames = es2sonames;\n        }\n        else\n            sonames = glsonames;\n\n        for (i = 0;  sonames[i];  i++)\n        {\n            // HACK: Match presence of lib prefix to increase chance of finding\n            //       a matching pair in the jungle that is Win32 EGL/GLES\n            if (_glfw.egl.prefix != (strncmp(sonames[i], \"lib\", 3) == 0))\n                continue;\n\n            window->context.egl.client = _glfw_dlopen(sonames[i]);\n            if (window->context.egl.client)\n                break;\n        }\n\n        if (!window->context.egl.client)\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"EGL: Failed to load client library\");\n            return GLFW_FALSE;\n        }\n    }\n\n    window->context.makeCurrent = makeContextCurrentEGL;\n    window->context.swapBuffers = swapBuffersEGL;\n    window->context.swapInterval = swapIntervalEGL;\n    window->context.extensionSupported = extensionSupportedEGL;\n    window->context.getProcAddress = getProcAddressEGL;\n    window->context.destroy = destroyContextEGL;\n\n    return GLFW_TRUE;\n}\n\n#undef setAttrib\n\n// Returns the Visual and depth of the chosen EGLConfig\n//\n#if defined(_GLFW_X11)\nGLFWbool _glfwChooseVisualEGL(const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig,\n                              Visual** visual, int* depth)\n{\n    XVisualInfo* result;\n    XVisualInfo desired;\n    EGLConfig native;\n    EGLint visualID = 0, count = 0;\n    const long vimask = VisualScreenMask | VisualIDMask;\n\n    if (!chooseEGLConfig(ctxconfig, fbconfig, &native))\n    {\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"EGL: Failed to find a suitable EGLConfig\");\n        return GLFW_FALSE;\n    }\n\n    eglGetConfigAttrib(_glfw.egl.display, native,\n                       EGL_NATIVE_VISUAL_ID, &visualID);\n\n    desired.screen = _glfw.x11.screen;\n    desired.visualid = visualID;\n\n    result = XGetVisualInfo(_glfw.x11.display, vimask, &desired, &count);\n    if (!result)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"EGL: Failed to retrieve Visual for EGLConfig\");\n        return GLFW_FALSE;\n    }\n\n    *visual = result->visual;\n    *depth = result->depth;\n\n    XFree(result);\n    return GLFW_TRUE;\n}\n#endif // _GLFW_X11\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI EGLDisplay glfwGetEGLDisplay(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_DISPLAY);\n    return _glfw.egl.display;\n}\n\nGLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_CONTEXT);\n\n    if (window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return EGL_NO_CONTEXT;\n    }\n\n    return window->context.egl.handle;\n}\n\nGLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(EGL_NO_SURFACE);\n\n    if (window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return EGL_NO_SURFACE;\n    }\n\n    return window->context.egl.surface;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/egl_context.h",
    "content": "//========================================================================\n// GLFW 3.3 EGL - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#if defined(_GLFW_USE_EGLPLATFORM_H)\n #include <EGL/eglplatform.h>\n#elif defined(_GLFW_WIN32)\n #define EGLAPIENTRY __stdcall\ntypedef HDC EGLNativeDisplayType;\ntypedef HWND EGLNativeWindowType;\n#elif defined(_GLFW_COCOA)\n #define EGLAPIENTRY\ntypedef void* EGLNativeDisplayType;\ntypedef id EGLNativeWindowType;\n#elif defined(_GLFW_X11)\n #define EGLAPIENTRY\ntypedef Display* EGLNativeDisplayType;\ntypedef Window EGLNativeWindowType;\n#elif defined(_GLFW_WAYLAND)\n #define EGLAPIENTRY\ntypedef struct wl_display* EGLNativeDisplayType;\ntypedef struct wl_egl_window* EGLNativeWindowType;\n#elif defined(_GLFW_MIR)\n #define EGLAPIENTRY\ntypedef MirEGLNativeDisplayType EGLNativeDisplayType;\ntypedef MirEGLNativeWindowType EGLNativeWindowType;\n#else\n #error \"No supported EGL platform selected\"\n#endif\n\n#define EGL_SUCCESS\t0x3000\n#define EGL_NOT_INITIALIZED\t0x3001\n#define EGL_BAD_ACCESS 0x3002\n#define EGL_BAD_ALLOC 0x3003\n#define EGL_BAD_ATTRIBUTE 0x3004\n#define EGL_BAD_CONFIG 0x3005\n#define EGL_BAD_CONTEXT\t0x3006\n#define EGL_BAD_CURRENT_SURFACE\t0x3007\n#define EGL_BAD_DISPLAY\t0x3008\n#define EGL_BAD_MATCH 0x3009\n#define EGL_BAD_NATIVE_PIXMAP 0x300a\n#define EGL_BAD_NATIVE_WINDOW 0x300b\n#define EGL_BAD_PARAMETER 0x300c\n#define EGL_BAD_SURFACE\t0x300d\n#define EGL_CONTEXT_LOST 0x300e\n#define EGL_COLOR_BUFFER_TYPE 0x303f\n#define EGL_RGB_BUFFER 0x308e\n#define EGL_SURFACE_TYPE 0x3033\n#define EGL_WINDOW_BIT 0x0004\n#define EGL_RENDERABLE_TYPE\t0x3040\n#define EGL_OPENGL_ES_BIT 0x0001\n#define EGL_OPENGL_ES2_BIT 0x0004\n#define EGL_OPENGL_BIT 0x0008\n#define EGL_ALPHA_SIZE 0x3021\n#define EGL_BLUE_SIZE 0x3022\n#define EGL_GREEN_SIZE 0x3023\n#define EGL_RED_SIZE 0x3024\n#define EGL_DEPTH_SIZE 0x3025\n#define EGL_STENCIL_SIZE 0x3026\n#define EGL_SAMPLES\t0x3031\n#define EGL_OPENGL_ES_API 0x30a0\n#define EGL_OPENGL_API 0x30a2\n#define EGL_NONE 0x3038\n#define EGL_EXTENSIONS 0x3055\n#define EGL_CONTEXT_CLIENT_VERSION 0x3098\n#define EGL_NATIVE_VISUAL_ID 0x302e\n#define EGL_NO_SURFACE ((EGLSurface) 0)\n#define EGL_NO_DISPLAY ((EGLDisplay) 0)\n#define EGL_NO_CONTEXT ((EGLContext) 0)\n#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType) 0)\n\n#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002\n#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001\n#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002\n#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001\n#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31bd\n#define EGL_NO_RESET_NOTIFICATION_KHR 0x31be\n#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31bf\n#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004\n#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098\n#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30fb\n#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30fd\n#define EGL_CONTEXT_FLAGS_KHR 0x30fc\n#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31b3\n#define EGL_GL_COLORSPACE_KHR 0x309d\n#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089\n#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097\n#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0\n#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098\n\ntypedef int EGLint;\ntypedef unsigned int EGLBoolean;\ntypedef unsigned int EGLenum;\ntypedef void* EGLConfig;\ntypedef void* EGLContext;\ntypedef void* EGLDisplay;\ntypedef void* EGLSurface;\n\n// EGL function pointer typedefs\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglGetConfigAttrib)(EGLDisplay,EGLConfig,EGLint,EGLint*);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglGetConfigs)(EGLDisplay,EGLConfig*,EGLint,EGLint*);\ntypedef EGLDisplay (EGLAPIENTRY * PFN_eglGetDisplay)(EGLNativeDisplayType);\ntypedef EGLint (EGLAPIENTRY * PFN_eglGetError)(void);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglInitialize)(EGLDisplay,EGLint*,EGLint*);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglTerminate)(EGLDisplay);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglBindAPI)(EGLenum);\ntypedef EGLContext (EGLAPIENTRY * PFN_eglCreateContext)(EGLDisplay,EGLConfig,EGLContext,const EGLint*);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglDestroySurface)(EGLDisplay,EGLSurface);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglDestroyContext)(EGLDisplay,EGLContext);\ntypedef EGLSurface (EGLAPIENTRY * PFN_eglCreateWindowSurface)(EGLDisplay,EGLConfig,EGLNativeWindowType,const EGLint*);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglMakeCurrent)(EGLDisplay,EGLSurface,EGLSurface,EGLContext);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapBuffers)(EGLDisplay,EGLSurface);\ntypedef EGLBoolean (EGLAPIENTRY * PFN_eglSwapInterval)(EGLDisplay,EGLint);\ntypedef const char* (EGLAPIENTRY * PFN_eglQueryString)(EGLDisplay,EGLint);\ntypedef GLFWglproc (EGLAPIENTRY * PFN_eglGetProcAddress)(const char*);\n#define eglGetConfigAttrib _glfw.egl.GetConfigAttrib\n#define eglGetConfigs _glfw.egl.GetConfigs\n#define eglGetDisplay _glfw.egl.GetDisplay\n#define eglGetError _glfw.egl.GetError\n#define eglInitialize _glfw.egl.Initialize\n#define eglTerminate _glfw.egl.Terminate\n#define eglBindAPI _glfw.egl.BindAPI\n#define eglCreateContext _glfw.egl.CreateContext\n#define eglDestroySurface _glfw.egl.DestroySurface\n#define eglDestroyContext _glfw.egl.DestroyContext\n#define eglCreateWindowSurface _glfw.egl.CreateWindowSurface\n#define eglMakeCurrent _glfw.egl.MakeCurrent\n#define eglSwapBuffers _glfw.egl.SwapBuffers\n#define eglSwapInterval _glfw.egl.SwapInterval\n#define eglQueryString _glfw.egl.QueryString\n#define eglGetProcAddress _glfw.egl.GetProcAddress\n\n#define _GLFW_EGL_CONTEXT_STATE            _GLFWcontextEGL egl\n#define _GLFW_EGL_LIBRARY_CONTEXT_STATE    _GLFWlibraryEGL egl\n\n\n// EGL-specific per-context data\n//\ntypedef struct _GLFWcontextEGL\n{\n   EGLConfig        config;\n   EGLContext       handle;\n   EGLSurface       surface;\n\n   void*            client;\n\n} _GLFWcontextEGL;\n\n// EGL-specific global data\n//\ntypedef struct _GLFWlibraryEGL\n{\n    EGLDisplay      display;\n    EGLint          major, minor;\n    GLFWbool        prefix;\n\n    GLFWbool        KHR_create_context;\n    GLFWbool        KHR_create_context_no_error;\n    GLFWbool        KHR_gl_colorspace;\n    GLFWbool        KHR_get_all_proc_addresses;\n    GLFWbool        KHR_context_flush_control;\n\n    void*           handle;\n\n    PFN_eglGetConfigAttrib      GetConfigAttrib;\n    PFN_eglGetConfigs           GetConfigs;\n    PFN_eglGetDisplay           GetDisplay;\n    PFN_eglGetError             GetError;\n    PFN_eglInitialize           Initialize;\n    PFN_eglTerminate            Terminate;\n    PFN_eglBindAPI              BindAPI;\n    PFN_eglCreateContext        CreateContext;\n    PFN_eglDestroySurface       DestroySurface;\n    PFN_eglDestroyContext       DestroyContext;\n    PFN_eglCreateWindowSurface  CreateWindowSurface;\n    PFN_eglMakeCurrent          MakeCurrent;\n    PFN_eglSwapBuffers          SwapBuffers;\n    PFN_eglSwapInterval         SwapInterval;\n    PFN_eglQueryString          QueryString;\n    PFN_eglGetProcAddress       GetProcAddress;\n\n} _GLFWlibraryEGL;\n\n\nGLFWbool _glfwInitEGL(void);\nvoid _glfwTerminateEGL(void);\nGLFWbool _glfwCreateContextEGL(_GLFWwindow* window,\n                               const _GLFWctxconfig* ctxconfig,\n                               const _GLFWfbconfig* fbconfig);\n#if defined(_GLFW_X11)\nGLFWbool _glfwChooseVisualEGL(const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig,\n                              Visual** visual, int* depth);\n#endif /*_GLFW_X11*/\n\n"
  },
  {
    "path": "external/GLFW/src/glfw3.pc.in",
    "content": "prefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=${prefix}\nincludedir=${prefix}/include\nlibdir=${exec_prefix}/lib@LIB_SUFFIX@\n\nName: GLFW\nDescription: A multi-platform library for OpenGL, window and input\nVersion: @GLFW_VERSION_FULL@\nURL: http://www.glfw.org/\nRequires.private: @GLFW_PKG_DEPS@\nLibs: -L${libdir} -l@GLFW_LIB_NAME@\nLibs.private: @GLFW_PKG_LIBS@\nCflags: -I${includedir}\n"
  },
  {
    "path": "external/GLFW/src/glfw3Config.cmake.in",
    "content": "include(\"${CMAKE_CURRENT_LIST_DIR}/glfw3Targets.cmake\")\n"
  },
  {
    "path": "external/GLFW/src/glfw_config.h.in",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2010-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n// As glfw_config.h.in, this file is used by CMake to produce the\n// glfw_config.h configuration header file.  If you are adding a feature\n// requiring conditional compilation, this is where to add the macro.\n//========================================================================\n// As glfw_config.h, this file defines compile-time option macros for a\n// specific platform and development environment.  If you are using the\n// GLFW CMake files, modify glfw_config.h.in instead of this file.  If you\n// are using your own build system, make this file define the appropriate\n// macros in whatever way is suitable.\n//========================================================================\n\n// Define this to 1 if building GLFW for X11\n#cmakedefine _GLFW_X11\n// Define this to 1 if building GLFW for Win32\n#cmakedefine _GLFW_WIN32\n// Define this to 1 if building GLFW for Cocoa\n#cmakedefine _GLFW_COCOA\n// Define this to 1 if building GLFW for Wayland\n#cmakedefine _GLFW_WAYLAND\n// Define this to 1 if building GLFW for Mir\n#cmakedefine _GLFW_MIR\n// Define this to 1 if building GLFW for OSMesa\n#cmakedefine _GLFW_OSMESA\n\n// Define this to 1 if building as a shared library / dynamic library / DLL\n#cmakedefine _GLFW_BUILD_DLL\n// Define this to 1 to use Vulkan loader linked statically into application\n#cmakedefine _GLFW_VULKAN_STATIC\n\n// Define this to 1 to force use of high-performance GPU on hybrid systems\n#cmakedefine _GLFW_USE_HYBRID_HPG\n\n"
  },
  {
    "path": "external/GLFW/src/glx_context.c",
    "content": "//========================================================================\n// GLFW 3.3 GLX - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n\n#ifndef GLXBadProfileARB\n #define GLXBadProfileARB 13\n#endif\n\n\n// Returns the specified attribute of the specified GLXFBConfig\n//\nstatic int getGLXFBConfigAttrib(GLXFBConfig fbconfig, int attrib)\n{\n    int value;\n    glXGetFBConfigAttrib(_glfw.x11.display, fbconfig, attrib, &value);\n    return value;\n}\n\n// Return the GLXFBConfig most closely matching the specified hints\n//\nstatic GLFWbool chooseGLXFBConfig(const _GLFWfbconfig* desired,\n                                  GLXFBConfig* result)\n{\n    GLXFBConfig* nativeConfigs;\n    _GLFWfbconfig* usableConfigs;\n    const _GLFWfbconfig* closest;\n    int i, nativeCount, usableCount;\n    const char* vendor;\n    GLFWbool trustWindowBit = GLFW_TRUE;\n\n    // HACK: This is a (hopefully temporary) workaround for Chromium\n    //       (VirtualBox GL) not setting the window bit on any GLXFBConfigs\n    vendor = glXGetClientString(_glfw.x11.display, GLX_VENDOR);\n    if (vendor && strcmp(vendor, \"Chromium\") == 0)\n        trustWindowBit = GLFW_FALSE;\n\n    nativeConfigs =\n        glXGetFBConfigs(_glfw.x11.display, _glfw.x11.screen, &nativeCount);\n    if (!nativeConfigs || !nativeCount)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE, \"GLX: No GLXFBConfigs returned\");\n        return GLFW_FALSE;\n    }\n\n    usableConfigs = calloc(nativeCount, sizeof(_GLFWfbconfig));\n    usableCount = 0;\n\n    for (i = 0;  i < nativeCount;  i++)\n    {\n        const GLXFBConfig n = nativeConfigs[i];\n        _GLFWfbconfig* u = usableConfigs + usableCount;\n\n        // Only consider RGBA GLXFBConfigs\n        if (!(getGLXFBConfigAttrib(n, GLX_RENDER_TYPE) & GLX_RGBA_BIT))\n            continue;\n\n        // Only consider window GLXFBConfigs\n        if (!(getGLXFBConfigAttrib(n, GLX_DRAWABLE_TYPE) & GLX_WINDOW_BIT))\n        {\n            if (trustWindowBit)\n                continue;\n        }\n\n        if (desired->transparent)\n        {\n            XVisualInfo* vi = glXGetVisualFromFBConfig(_glfw.x11.display, n);\n            if (vi)\n            {\n                u->transparent = _glfwIsVisualTransparentX11(vi->visual);\n                XFree(vi);\n            }\n        }\n\n        u->redBits = getGLXFBConfigAttrib(n, GLX_RED_SIZE);\n        u->greenBits = getGLXFBConfigAttrib(n, GLX_GREEN_SIZE);\n        u->blueBits = getGLXFBConfigAttrib(n, GLX_BLUE_SIZE);\n\n        u->alphaBits = getGLXFBConfigAttrib(n, GLX_ALPHA_SIZE);\n        u->depthBits = getGLXFBConfigAttrib(n, GLX_DEPTH_SIZE);\n        u->stencilBits = getGLXFBConfigAttrib(n, GLX_STENCIL_SIZE);\n\n        u->accumRedBits = getGLXFBConfigAttrib(n, GLX_ACCUM_RED_SIZE);\n        u->accumGreenBits = getGLXFBConfigAttrib(n, GLX_ACCUM_GREEN_SIZE);\n        u->accumBlueBits = getGLXFBConfigAttrib(n, GLX_ACCUM_BLUE_SIZE);\n        u->accumAlphaBits = getGLXFBConfigAttrib(n, GLX_ACCUM_ALPHA_SIZE);\n\n        u->auxBuffers = getGLXFBConfigAttrib(n, GLX_AUX_BUFFERS);\n\n        if (getGLXFBConfigAttrib(n, GLX_STEREO))\n            u->stereo = GLFW_TRUE;\n        if (getGLXFBConfigAttrib(n, GLX_DOUBLEBUFFER))\n            u->doublebuffer = GLFW_TRUE;\n\n        if (_glfw.glx.ARB_multisample)\n            u->samples = getGLXFBConfigAttrib(n, GLX_SAMPLES);\n\n        if (_glfw.glx.ARB_framebuffer_sRGB || _glfw.glx.EXT_framebuffer_sRGB)\n            u->sRGB = getGLXFBConfigAttrib(n, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB);\n\n        u->handle = (uintptr_t) n;\n        usableCount++;\n    }\n\n    closest = _glfwChooseFBConfig(desired, usableConfigs, usableCount);\n    if (closest)\n        *result = (GLXFBConfig) closest->handle;\n\n    XFree(nativeConfigs);\n    free(usableConfigs);\n\n    return closest != NULL;\n}\n\n// Create the OpenGL context using legacy API\n//\nstatic GLXContext createLegacyContextGLX(_GLFWwindow* window,\n                                         GLXFBConfig fbconfig,\n                                         GLXContext share)\n{\n    return glXCreateNewContext(_glfw.x11.display,\n                               fbconfig,\n                               GLX_RGBA_TYPE,\n                               share,\n                               True);\n}\n\nstatic void makeContextCurrentGLX(_GLFWwindow* window)\n{\n    if (window)\n    {\n        if (!glXMakeCurrent(_glfw.x11.display,\n                            window->context.glx.window,\n                            window->context.glx.handle))\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"GLX: Failed to make context current\");\n            return;\n        }\n    }\n    else\n    {\n        if (!glXMakeCurrent(_glfw.x11.display, None, NULL))\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"GLX: Failed to clear current context\");\n            return;\n        }\n    }\n\n    _glfwPlatformSetTls(&_glfw.contextSlot, window);\n}\n\nstatic void swapBuffersGLX(_GLFWwindow* window)\n{\n    glXSwapBuffers(_glfw.x11.display, window->context.glx.window);\n}\n\nstatic void swapIntervalGLX(int interval)\n{\n    _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot);\n\n    if (_glfw.glx.EXT_swap_control)\n    {\n        _glfw.glx.SwapIntervalEXT(_glfw.x11.display,\n                                  window->context.glx.window,\n                                  interval);\n    }\n    else if (_glfw.glx.MESA_swap_control)\n        _glfw.glx.SwapIntervalMESA(interval);\n    else if (_glfw.glx.SGI_swap_control)\n    {\n        if (interval > 0)\n            _glfw.glx.SwapIntervalSGI(interval);\n    }\n}\n\nstatic int extensionSupportedGLX(const char* extension)\n{\n    const char* extensions =\n        glXQueryExtensionsString(_glfw.x11.display, _glfw.x11.screen);\n    if (extensions)\n    {\n        if (_glfwStringInExtensionString(extension, extensions))\n            return GLFW_TRUE;\n    }\n\n    return GLFW_FALSE;\n}\n\nstatic GLFWglproc getProcAddressGLX(const char* procname)\n{\n    if (_glfw.glx.GetProcAddress)\n        return _glfw.glx.GetProcAddress((const GLubyte*) procname);\n    else if (_glfw.glx.GetProcAddressARB)\n        return _glfw.glx.GetProcAddressARB((const GLubyte*) procname);\n    else\n        return dlsym(_glfw.glx.handle, procname);\n}\n\n// Destroy the OpenGL context\n//\nstatic void destroyContextGLX(_GLFWwindow* window)\n{\n    if (window->context.glx.window)\n    {\n        glXDestroyWindow(_glfw.x11.display, window->context.glx.window);\n        window->context.glx.window = None;\n    }\n\n    if (window->context.glx.handle)\n    {\n        glXDestroyContext(_glfw.x11.display, window->context.glx.handle);\n        window->context.glx.handle = NULL;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialize GLX\n//\nGLFWbool _glfwInitGLX(void)\n{\n    int i;\n    const char* sonames[] =\n    {\n#if defined(_GLFW_GLX_LIBRARY)\n        _GLFW_GLX_LIBRARY,\n#elif defined(__CYGWIN__)\n        \"libGL-1.so\",\n#else\n        \"libGL.so.1\",\n        \"libGL.so\",\n#endif\n        NULL\n    };\n\n    if (_glfw.glx.handle)\n        return GLFW_TRUE;\n\n    for (i = 0;  sonames[i];  i++)\n    {\n        _glfw.glx.handle = dlopen(sonames[i], RTLD_LAZY | RTLD_GLOBAL);\n        if (_glfw.glx.handle)\n            break;\n    }\n\n    if (!_glfw.glx.handle)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE, \"GLX: Failed to load GLX\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.glx.GetFBConfigs =\n        dlsym(_glfw.glx.handle, \"glXGetFBConfigs\");\n    _glfw.glx.GetFBConfigAttrib =\n        dlsym(_glfw.glx.handle, \"glXGetFBConfigAttrib\");\n    _glfw.glx.GetClientString =\n        dlsym(_glfw.glx.handle, \"glXGetClientString\");\n    _glfw.glx.QueryExtension =\n        dlsym(_glfw.glx.handle, \"glXQueryExtension\");\n    _glfw.glx.QueryVersion =\n        dlsym(_glfw.glx.handle, \"glXQueryVersion\");\n    _glfw.glx.DestroyContext =\n        dlsym(_glfw.glx.handle, \"glXDestroyContext\");\n    _glfw.glx.MakeCurrent =\n        dlsym(_glfw.glx.handle, \"glXMakeCurrent\");\n    _glfw.glx.SwapBuffers =\n        dlsym(_glfw.glx.handle, \"glXSwapBuffers\");\n    _glfw.glx.QueryExtensionsString =\n        dlsym(_glfw.glx.handle, \"glXQueryExtensionsString\");\n    _glfw.glx.CreateNewContext =\n        dlsym(_glfw.glx.handle, \"glXCreateNewContext\");\n    _glfw.glx.CreateWindow =\n        dlsym(_glfw.glx.handle, \"glXCreateWindow\");\n    _glfw.glx.DestroyWindow =\n        dlsym(_glfw.glx.handle, \"glXDestroyWindow\");\n    _glfw.glx.GetProcAddress =\n        dlsym(_glfw.glx.handle, \"glXGetProcAddress\");\n    _glfw.glx.GetProcAddressARB =\n        dlsym(_glfw.glx.handle, \"glXGetProcAddressARB\");\n    _glfw.glx.GetVisualFromFBConfig =\n        dlsym(_glfw.glx.handle, \"glXGetVisualFromFBConfig\");\n\n    if (!_glfw.glx.GetFBConfigs ||\n        !_glfw.glx.GetFBConfigAttrib ||\n        !_glfw.glx.GetClientString ||\n        !_glfw.glx.QueryExtension ||\n        !_glfw.glx.QueryVersion ||\n        !_glfw.glx.DestroyContext ||\n        !_glfw.glx.MakeCurrent ||\n        !_glfw.glx.SwapBuffers ||\n        !_glfw.glx.QueryExtensionsString ||\n        !_glfw.glx.CreateNewContext ||\n        !_glfw.glx.CreateWindow ||\n        !_glfw.glx.DestroyWindow ||\n        !_glfw.glx.GetProcAddress ||\n        !_glfw.glx.GetProcAddressARB ||\n        !_glfw.glx.GetVisualFromFBConfig)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"GLX: Failed to load required entry points\");\n        return GLFW_FALSE;\n    }\n\n    if (!glXQueryExtension(_glfw.x11.display,\n                           &_glfw.glx.errorBase,\n                           &_glfw.glx.eventBase))\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE, \"GLX: GLX extension not found\");\n        return GLFW_FALSE;\n    }\n\n    if (!glXQueryVersion(_glfw.x11.display, &_glfw.glx.major, &_glfw.glx.minor))\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"GLX: Failed to query GLX version\");\n        return GLFW_FALSE;\n    }\n\n    if (_glfw.glx.major == 1 && _glfw.glx.minor < 3)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"GLX: GLX version 1.3 is required\");\n        return GLFW_FALSE;\n    }\n\n    if (extensionSupportedGLX(\"GLX_EXT_swap_control\"))\n    {\n        _glfw.glx.SwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)\n            getProcAddressGLX(\"glXSwapIntervalEXT\");\n\n        if (_glfw.glx.SwapIntervalEXT)\n            _glfw.glx.EXT_swap_control = GLFW_TRUE;\n    }\n\n    if (extensionSupportedGLX(\"GLX_SGI_swap_control\"))\n    {\n        _glfw.glx.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)\n            getProcAddressGLX(\"glXSwapIntervalSGI\");\n\n        if (_glfw.glx.SwapIntervalSGI)\n            _glfw.glx.SGI_swap_control = GLFW_TRUE;\n    }\n\n    if (extensionSupportedGLX(\"GLX_MESA_swap_control\"))\n    {\n        _glfw.glx.SwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)\n            getProcAddressGLX(\"glXSwapIntervalMESA\");\n\n        if (_glfw.glx.SwapIntervalMESA)\n            _glfw.glx.MESA_swap_control = GLFW_TRUE;\n    }\n\n    if (extensionSupportedGLX(\"GLX_ARB_multisample\"))\n        _glfw.glx.ARB_multisample = GLFW_TRUE;\n\n    if (extensionSupportedGLX(\"GLX_ARB_framebuffer_sRGB\"))\n        _glfw.glx.ARB_framebuffer_sRGB = GLFW_TRUE;\n\n    if (extensionSupportedGLX(\"GLX_EXT_framebuffer_sRGB\"))\n        _glfw.glx.EXT_framebuffer_sRGB = GLFW_TRUE;\n\n    if (extensionSupportedGLX(\"GLX_ARB_create_context\"))\n    {\n        _glfw.glx.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)\n            getProcAddressGLX(\"glXCreateContextAttribsARB\");\n\n        if (_glfw.glx.CreateContextAttribsARB)\n            _glfw.glx.ARB_create_context = GLFW_TRUE;\n    }\n\n    if (extensionSupportedGLX(\"GLX_ARB_create_context_robustness\"))\n        _glfw.glx.ARB_create_context_robustness = GLFW_TRUE;\n\n    if (extensionSupportedGLX(\"GLX_ARB_create_context_profile\"))\n        _glfw.glx.ARB_create_context_profile = GLFW_TRUE;\n\n    if (extensionSupportedGLX(\"GLX_EXT_create_context_es2_profile\"))\n        _glfw.glx.EXT_create_context_es2_profile = GLFW_TRUE;\n\n    if (extensionSupportedGLX(\"GLX_ARB_create_context_no_error\"))\n        _glfw.glx.ARB_create_context_no_error = GLFW_TRUE;\n\n    if (extensionSupportedGLX(\"GLX_ARB_context_flush_control\"))\n        _glfw.glx.ARB_context_flush_control = GLFW_TRUE;\n\n    return GLFW_TRUE;\n}\n\n// Terminate GLX\n//\nvoid _glfwTerminateGLX(void)\n{\n    // NOTE: This function must not call any X11 functions, as it is called\n    //       after XCloseDisplay (see _glfwPlatformTerminate for details)\n\n    if (_glfw.glx.handle)\n    {\n        dlclose(_glfw.glx.handle);\n        _glfw.glx.handle = NULL;\n    }\n}\n\n#define setAttrib(a, v) \\\n{ \\\n    assert((size_t) (index + 1) < sizeof(attribs) / sizeof(attribs[0])); \\\n    attribs[index++] = a; \\\n    attribs[index++] = v; \\\n}\n\n// Create the OpenGL or OpenGL ES context\n//\nGLFWbool _glfwCreateContextGLX(_GLFWwindow* window,\n                               const _GLFWctxconfig* ctxconfig,\n                               const _GLFWfbconfig* fbconfig)\n{\n    int attribs[40];\n    GLXFBConfig native = NULL;\n    GLXContext share = NULL;\n\n    if (ctxconfig->share)\n        share = ctxconfig->share->context.glx.handle;\n\n    if (!chooseGLXFBConfig(fbconfig, &native))\n    {\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"GLX: Failed to find a suitable GLXFBConfig\");\n        return GLFW_FALSE;\n    }\n\n    if (ctxconfig->client == GLFW_OPENGL_ES_API)\n    {\n        if (!_glfw.glx.ARB_create_context ||\n            !_glfw.glx.ARB_create_context_profile ||\n            !_glfw.glx.EXT_create_context_es2_profile)\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"GLX: OpenGL ES requested but GLX_EXT_create_context_es2_profile is unavailable\");\n            return GLFW_FALSE;\n        }\n    }\n\n    if (ctxconfig->forward)\n    {\n        if (!_glfw.glx.ARB_create_context)\n        {\n            _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                            \"GLX: Forward compatibility requested but GLX_ARB_create_context_profile is unavailable\");\n            return GLFW_FALSE;\n        }\n    }\n\n    if (ctxconfig->profile)\n    {\n        if (!_glfw.glx.ARB_create_context ||\n            !_glfw.glx.ARB_create_context_profile)\n        {\n            _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                            \"GLX: An OpenGL profile requested but GLX_ARB_create_context_profile is unavailable\");\n            return GLFW_FALSE;\n        }\n    }\n\n    _glfwGrabErrorHandlerX11();\n\n    if (_glfw.glx.ARB_create_context)\n    {\n        int index = 0, mask = 0, flags = 0;\n\n        if (ctxconfig->client == GLFW_OPENGL_API)\n        {\n            if (ctxconfig->forward)\n                flags |= GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;\n\n            if (ctxconfig->profile == GLFW_OPENGL_CORE_PROFILE)\n                mask |= GLX_CONTEXT_CORE_PROFILE_BIT_ARB;\n            else if (ctxconfig->profile == GLFW_OPENGL_COMPAT_PROFILE)\n                mask |= GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;\n        }\n        else\n            mask |= GLX_CONTEXT_ES2_PROFILE_BIT_EXT;\n\n        if (ctxconfig->debug)\n            flags |= GLX_CONTEXT_DEBUG_BIT_ARB;\n\n        if (ctxconfig->robustness)\n        {\n            if (_glfw.glx.ARB_create_context_robustness)\n            {\n                if (ctxconfig->robustness == GLFW_NO_RESET_NOTIFICATION)\n                {\n                    setAttrib(GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB,\n                              GLX_NO_RESET_NOTIFICATION_ARB);\n                }\n                else if (ctxconfig->robustness == GLFW_LOSE_CONTEXT_ON_RESET)\n                {\n                    setAttrib(GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB,\n                              GLX_LOSE_CONTEXT_ON_RESET_ARB);\n                }\n\n                flags |= GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB;\n            }\n        }\n\n        if (ctxconfig->release)\n        {\n            if (_glfw.glx.ARB_context_flush_control)\n            {\n                if (ctxconfig->release == GLFW_RELEASE_BEHAVIOR_NONE)\n                {\n                    setAttrib(GLX_CONTEXT_RELEASE_BEHAVIOR_ARB,\n                              GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB);\n                }\n                else if (ctxconfig->release == GLFW_RELEASE_BEHAVIOR_FLUSH)\n                {\n                    setAttrib(GLX_CONTEXT_RELEASE_BEHAVIOR_ARB,\n                              GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB);\n                }\n            }\n        }\n\n        if (ctxconfig->noerror)\n        {\n            if (_glfw.glx.ARB_create_context_no_error)\n                setAttrib(GLX_CONTEXT_OPENGL_NO_ERROR_ARB, GLFW_TRUE);\n        }\n\n        // NOTE: Only request an explicitly versioned context when necessary, as\n        //       explicitly requesting version 1.0 does not always return the\n        //       highest version supported by the driver\n        if (ctxconfig->major != 1 || ctxconfig->minor != 0)\n        {\n            setAttrib(GLX_CONTEXT_MAJOR_VERSION_ARB, ctxconfig->major);\n            setAttrib(GLX_CONTEXT_MINOR_VERSION_ARB, ctxconfig->minor);\n        }\n\n        if (mask)\n            setAttrib(GLX_CONTEXT_PROFILE_MASK_ARB, mask);\n\n        if (flags)\n            setAttrib(GLX_CONTEXT_FLAGS_ARB, flags);\n\n        setAttrib(None, None);\n\n        window->context.glx.handle =\n            _glfw.glx.CreateContextAttribsARB(_glfw.x11.display,\n                                              native,\n                                              share,\n                                              True,\n                                              attribs);\n\n        // HACK: This is a fallback for broken versions of the Mesa\n        //       implementation of GLX_ARB_create_context_profile that fail\n        //       default 1.0 context creation with a GLXBadProfileARB error in\n        //       violation of the extension spec\n        if (!window->context.glx.handle)\n        {\n            if (_glfw.x11.errorCode == _glfw.glx.errorBase + GLXBadProfileARB &&\n                ctxconfig->client == GLFW_OPENGL_API &&\n                ctxconfig->profile == GLFW_OPENGL_ANY_PROFILE &&\n                ctxconfig->forward == GLFW_FALSE)\n            {\n                window->context.glx.handle =\n                    createLegacyContextGLX(window, native, share);\n            }\n        }\n    }\n    else\n    {\n        window->context.glx.handle =\n            createLegacyContextGLX(window, native, share);\n    }\n\n    _glfwReleaseErrorHandlerX11();\n\n    if (!window->context.glx.handle)\n    {\n        _glfwInputErrorX11(GLFW_VERSION_UNAVAILABLE, \"GLX: Failed to create context\");\n        return GLFW_FALSE;\n    }\n\n    window->context.glx.window =\n        glXCreateWindow(_glfw.x11.display, native, window->x11.handle, NULL);\n    if (!window->context.glx.window)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR, \"GLX: Failed to create window\");\n        return GLFW_FALSE;\n    }\n\n    window->context.makeCurrent = makeContextCurrentGLX;\n    window->context.swapBuffers = swapBuffersGLX;\n    window->context.swapInterval = swapIntervalGLX;\n    window->context.extensionSupported = extensionSupportedGLX;\n    window->context.getProcAddress = getProcAddressGLX;\n    window->context.destroy = destroyContextGLX;\n\n    return GLFW_TRUE;\n}\n\n#undef setAttrib\n\n// Returns the Visual and depth of the chosen GLXFBConfig\n//\nGLFWbool _glfwChooseVisualGLX(const _GLFWwndconfig* wndconfig,\n                  const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig,\n                              Visual** visual, int* depth)\n{\n    GLXFBConfig native;\n    XVisualInfo* result;\n\n    if (!chooseGLXFBConfig(fbconfig, &native))\n    {\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"GLX: Failed to find a suitable GLXFBConfig\");\n        return GLFW_FALSE;\n    }\n\n    result = glXGetVisualFromFBConfig(_glfw.x11.display, native);\n    if (!result)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"GLX: Failed to retrieve Visual for GLXFBConfig\");\n        return GLFW_FALSE;\n    }\n\n    *visual = result->visual;\n    *depth  = result->depth;\n\n    XFree(result);\n    return GLFW_TRUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return NULL;\n    }\n\n    return window->context.glx.handle;\n}\n\nGLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(None);\n\n    if (window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return None;\n    }\n\n    return window->context.glx.window;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/glx_context.h",
    "content": "//========================================================================\n// GLFW 3.3 GLX - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define GLX_VENDOR 1\n#define GLX_RGBA_BIT 0x00000001\n#define GLX_WINDOW_BIT 0x00000001\n#define GLX_DRAWABLE_TYPE 0x8010\n#define GLX_RENDER_TYPE\t0x8011\n#define GLX_RGBA_TYPE 0x8014\n#define GLX_DOUBLEBUFFER 5\n#define GLX_STEREO 6\n#define GLX_AUX_BUFFERS\t7\n#define GLX_RED_SIZE 8\n#define GLX_GREEN_SIZE 9\n#define GLX_BLUE_SIZE 10\n#define GLX_ALPHA_SIZE 11\n#define GLX_DEPTH_SIZE 12\n#define GLX_STENCIL_SIZE 13\n#define GLX_ACCUM_RED_SIZE 14\n#define GLX_ACCUM_GREEN_SIZE 15\n#define GLX_ACCUM_BLUE_SIZE\t16\n#define GLX_ACCUM_ALPHA_SIZE 17\n#define GLX_SAMPLES 0x186a1\n#define GLX_VISUAL_ID 0x800b\n\n#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20b2\n#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001\n#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\n#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\n#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126\n#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002\n#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091\n#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092\n#define GLX_CONTEXT_FLAGS_ARB 0x2094\n#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004\n#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004\n#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252\n#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261\n#define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097\n#define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0\n#define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098\n#define GLX_CONTEXT_OPENGL_NO_ERROR_ARB 0x31b3\n\ntypedef XID GLXWindow;\ntypedef XID GLXDrawable;\ntypedef struct __GLXFBConfig* GLXFBConfig;\ntypedef struct __GLXcontext* GLXContext;\ntypedef void (*__GLXextproc)(void);\n\ntypedef int (*PFNGLXGETFBCONFIGATTRIBPROC)(Display*,GLXFBConfig,int,int*);\ntypedef const char* (*PFNGLXGETCLIENTSTRINGPROC)(Display*,int);\ntypedef Bool (*PFNGLXQUERYEXTENSIONPROC)(Display*,int*,int*);\ntypedef Bool (*PFNGLXQUERYVERSIONPROC)(Display*,int*,int*);\ntypedef void (*PFNGLXDESTROYCONTEXTPROC)(Display*,GLXContext);\ntypedef Bool (*PFNGLXMAKECURRENTPROC)(Display*,GLXDrawable,GLXContext);\ntypedef void (*PFNGLXSWAPBUFFERSPROC)(Display*,GLXDrawable);\ntypedef const char* (*PFNGLXQUERYEXTENSIONSSTRINGPROC)(Display*,int);\ntypedef GLXFBConfig* (*PFNGLXGETFBCONFIGSPROC)(Display*,int,int*);\ntypedef GLXContext (*PFNGLXCREATENEWCONTEXTPROC)(Display*,GLXFBConfig,int,GLXContext,Bool);\ntypedef __GLXextproc (* PFNGLXGETPROCADDRESSPROC)(const GLubyte *procName);\ntypedef void (*PFNGLXSWAPINTERVALEXTPROC)(Display*,GLXDrawable,int);\ntypedef XVisualInfo* (*PFNGLXGETVISUALFROMFBCONFIGPROC)(Display*,GLXFBConfig);\ntypedef GLXWindow (*PFNGLXCREATEWINDOWPROC)(Display*,GLXFBConfig,Window,const int*);\ntypedef void (*PFNGLXDESTROYWINDOWPROC)(Display*,GLXWindow);\n\ntypedef int (*PFNGLXSWAPINTERVALMESAPROC)(int);\ntypedef int (*PFNGLXSWAPINTERVALSGIPROC)(int);\ntypedef GLXContext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display*,GLXFBConfig,GLXContext,Bool,const int*);\n\n// libGL.so function pointer typedefs\n#define glXGetFBConfigs _glfw.glx.GetFBConfigs\n#define glXGetFBConfigAttrib _glfw.glx.GetFBConfigAttrib\n#define glXGetClientString _glfw.glx.GetClientString\n#define glXQueryExtension _glfw.glx.QueryExtension\n#define glXQueryVersion _glfw.glx.QueryVersion\n#define glXDestroyContext _glfw.glx.DestroyContext\n#define glXMakeCurrent _glfw.glx.MakeCurrent\n#define glXSwapBuffers _glfw.glx.SwapBuffers\n#define glXQueryExtensionsString _glfw.glx.QueryExtensionsString\n#define glXCreateNewContext _glfw.glx.CreateNewContext\n#define glXGetVisualFromFBConfig _glfw.glx.GetVisualFromFBConfig\n#define glXCreateWindow _glfw.glx.CreateWindow\n#define glXDestroyWindow _glfw.glx.DestroyWindow\n\n#define _GLFW_PLATFORM_CONTEXT_STATE            _GLFWcontextGLX glx\n#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE    _GLFWlibraryGLX glx\n\n\n// GLX-specific per-context data\n//\ntypedef struct _GLFWcontextGLX\n{\n    GLXContext      handle;\n    GLXWindow       window;\n\n} _GLFWcontextGLX;\n\n// GLX-specific global data\n//\ntypedef struct _GLFWlibraryGLX\n{\n    int             major, minor;\n    int             eventBase;\n    int             errorBase;\n\n    // dlopen handle for libGL.so.1\n    void*           handle;\n\n    // GLX 1.3 functions\n    PFNGLXGETFBCONFIGSPROC              GetFBConfigs;\n    PFNGLXGETFBCONFIGATTRIBPROC         GetFBConfigAttrib;\n    PFNGLXGETCLIENTSTRINGPROC           GetClientString;\n    PFNGLXQUERYEXTENSIONPROC            QueryExtension;\n    PFNGLXQUERYVERSIONPROC              QueryVersion;\n    PFNGLXDESTROYCONTEXTPROC            DestroyContext;\n    PFNGLXMAKECURRENTPROC               MakeCurrent;\n    PFNGLXSWAPBUFFERSPROC               SwapBuffers;\n    PFNGLXQUERYEXTENSIONSSTRINGPROC     QueryExtensionsString;\n    PFNGLXCREATENEWCONTEXTPROC          CreateNewContext;\n    PFNGLXGETVISUALFROMFBCONFIGPROC     GetVisualFromFBConfig;\n    PFNGLXCREATEWINDOWPROC              CreateWindow;\n    PFNGLXDESTROYWINDOWPROC             DestroyWindow;\n\n    // GLX 1.4 and extension functions\n    PFNGLXGETPROCADDRESSPROC            GetProcAddress;\n    PFNGLXGETPROCADDRESSPROC            GetProcAddressARB;\n    PFNGLXSWAPINTERVALSGIPROC           SwapIntervalSGI;\n    PFNGLXSWAPINTERVALEXTPROC           SwapIntervalEXT;\n    PFNGLXSWAPINTERVALMESAPROC          SwapIntervalMESA;\n    PFNGLXCREATECONTEXTATTRIBSARBPROC   CreateContextAttribsARB;\n    GLFWbool        SGI_swap_control;\n    GLFWbool        EXT_swap_control;\n    GLFWbool        MESA_swap_control;\n    GLFWbool        ARB_multisample;\n    GLFWbool        ARB_framebuffer_sRGB;\n    GLFWbool        EXT_framebuffer_sRGB;\n    GLFWbool        ARB_create_context;\n    GLFWbool        ARB_create_context_profile;\n    GLFWbool        ARB_create_context_robustness;\n    GLFWbool        EXT_create_context_es2_profile;\n    GLFWbool        ARB_create_context_no_error;\n    GLFWbool        ARB_context_flush_control;\n\n} _GLFWlibraryGLX;\n\nGLFWbool _glfwInitGLX(void);\nvoid _glfwTerminateGLX(void);\nGLFWbool _glfwCreateContextGLX(_GLFWwindow* window,\n                               const _GLFWctxconfig* ctxconfig,\n                               const _GLFWfbconfig* fbconfig);\nvoid _glfwDestroyContextGLX(_GLFWwindow* window);\nGLFWbool _glfwChooseVisualGLX(const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig,\n                              Visual** visual, int* depth);\n\n"
  },
  {
    "path": "external/GLFW/src/init.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n#include \"mappings.h\"\n\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <assert.h>\n\n\n// The global variables below comprise all global data in GLFW.\n// Any other global variable is a bug.\n\n// Global state shared between compilation units of GLFW\n//\n_GLFWlibrary _glfw = { GLFW_FALSE };\n\n// These are outside of _glfw so they can be used before initialization and\n// after termination\n//\nstatic _GLFWerror _glfwMainThreadError;\nstatic GLFWerrorfun _glfwErrorCallback;\nstatic _GLFWinitconfig _glfwInitHints =\n{\n    GLFW_TRUE,      // hat buttons\n    {\n        GLFW_TRUE,  // macOS menu bar\n        GLFW_TRUE   // macOS bundle chdir\n    },\n    {\n        \"\",         // X11 WM_CLASS name\n        \"\"          // X11 WM_CLASS class\n    }\n};\n\n// Returns a generic string representation of the specified error\n//\nstatic const char* getErrorString(int code)\n{\n    switch (code)\n    {\n        case GLFW_NOT_INITIALIZED:\n            return \"The GLFW library is not initialized\";\n        case GLFW_NO_CURRENT_CONTEXT:\n            return \"There is no current context\";\n        case GLFW_INVALID_ENUM:\n            return \"Invalid argument for enum parameter\";\n        case GLFW_INVALID_VALUE:\n            return \"Invalid value for parameter\";\n        case GLFW_OUT_OF_MEMORY:\n            return \"Out of memory\";\n        case GLFW_API_UNAVAILABLE:\n            return \"The requested API is unavailable\";\n        case GLFW_VERSION_UNAVAILABLE:\n            return \"The requested API version is unavailable\";\n        case GLFW_PLATFORM_ERROR:\n            return \"An undocumented platform-specific error occurred\";\n        case GLFW_FORMAT_UNAVAILABLE:\n            return \"The requested format is unavailable\";\n        case GLFW_NO_WINDOW_CONTEXT:\n            return \"The specified window has no context\";\n        default:\n            return \"ERROR: UNKNOWN GLFW ERROR\";\n    }\n}\n\n// Terminate the library\n//\nstatic void terminate(void)\n{\n    int i;\n\n    memset(&_glfw.callbacks, 0, sizeof(_glfw.callbacks));\n\n    while (_glfw.windowListHead)\n        glfwDestroyWindow((GLFWwindow*) _glfw.windowListHead);\n\n    while (_glfw.cursorListHead)\n        glfwDestroyCursor((GLFWcursor*) _glfw.cursorListHead);\n\n    for (i = 0;  i < _glfw.monitorCount;  i++)\n    {\n        _GLFWmonitor* monitor = _glfw.monitors[i];\n        if (monitor->originalRamp.size)\n            _glfwPlatformSetGammaRamp(monitor, &monitor->originalRamp);\n        _glfwFreeMonitor(monitor);\n    }\n\n    free(_glfw.monitors);\n    _glfw.monitors = NULL;\n    _glfw.monitorCount = 0;\n\n    free(_glfw.mappings);\n    _glfw.mappings = NULL;\n    _glfw.mappingCount = 0;\n\n    _glfwTerminateVulkan();\n    _glfwPlatformTerminate();\n\n    _glfw.initialized = GLFW_FALSE;\n\n    while (_glfw.errorListHead)\n    {\n        _GLFWerror* error = _glfw.errorListHead;\n        _glfw.errorListHead = error->next;\n        free(error);\n    }\n\n    _glfwPlatformDestroyTls(&_glfw.contextSlot);\n    _glfwPlatformDestroyTls(&_glfw.errorSlot);\n    _glfwPlatformDestroyMutex(&_glfw.errorLock);\n\n    memset(&_glfw, 0, sizeof(_glfw));\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                         GLFW event API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwInputError(int code, const char* format, ...)\n{\n    _GLFWerror* error;\n    char description[_GLFW_MESSAGE_SIZE];\n\n    if (format)\n    {\n        va_list vl;\n\n        va_start(vl, format);\n        vsnprintf(description, sizeof(description), format, vl);\n        va_end(vl);\n\n        description[sizeof(description) - 1] = '\\0';\n    }\n    else\n        strcpy(description, getErrorString(code));\n\n    if (_glfw.initialized)\n    {\n        error = _glfwPlatformGetTls(&_glfw.errorSlot);\n        if (!error)\n        {\n            error = calloc(1, sizeof(_GLFWerror));\n            _glfwPlatformSetTls(&_glfw.errorSlot, error);\n            _glfwPlatformLockMutex(&_glfw.errorLock);\n            error->next = _glfw.errorListHead;\n            _glfw.errorListHead = error;\n            _glfwPlatformUnlockMutex(&_glfw.errorLock);\n        }\n    }\n    else\n        error = &_glfwMainThreadError;\n\n    error->code = code;\n    strcpy(error->description, description);\n\n    if (_glfwErrorCallback)\n        _glfwErrorCallback(code, description);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW public API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI int glfwInit(void)\n{\n    if (_glfw.initialized)\n        return GLFW_TRUE;\n\n    memset(&_glfw, 0, sizeof(_glfw));\n    _glfw.hints.init = _glfwInitHints;\n\n    if (!_glfwPlatformInit())\n    {\n        terminate();\n        return GLFW_FALSE;\n    }\n\n    if (!_glfwPlatformCreateMutex(&_glfw.errorLock))\n        return GLFW_FALSE;\n    if (!_glfwPlatformCreateTls(&_glfw.errorSlot))\n        return GLFW_FALSE;\n    if (!_glfwPlatformCreateTls(&_glfw.contextSlot))\n        return GLFW_FALSE;\n\n    _glfwPlatformSetTls(&_glfw.errorSlot, &_glfwMainThreadError);\n\n    _glfw.initialized = GLFW_TRUE;\n    _glfw.timer.offset = _glfwPlatformGetTimerValue();\n\n    glfwDefaultWindowHints();\n    glfwUpdateGamepadMappings(_glfwDefaultMappings);\n\n    return GLFW_TRUE;\n}\n\nGLFWAPI void glfwTerminate(void)\n{\n    if (!_glfw.initialized)\n        return;\n\n    terminate();\n}\n\nGLFWAPI void glfwInitHint(int hint, int value)\n{\n    switch (hint)\n    {\n        case GLFW_JOYSTICK_HAT_BUTTONS:\n            _glfwInitHints.hatButtons = value;\n            return;\n        case GLFW_COCOA_CHDIR_RESOURCES:\n            _glfwInitHints.ns.chdir = value;\n            return;\n        case GLFW_COCOA_MENUBAR:\n            _glfwInitHints.ns.menubar = value;\n            return;\n    }\n\n    _glfwInputError(GLFW_INVALID_ENUM,\n                    \"Invalid integer type init hint 0x%08X\", hint);\n}\n\nGLFWAPI void glfwInitHintString(int hint, const char* value)\n{\n    assert(value != NULL);\n\n    switch (hint)\n    {\n        case GLFW_X11_WM_CLASS_NAME:\n            strncpy(_glfwInitHints.x11.className, value,\n                    sizeof(_glfwInitHints.x11.className) - 1);\n            break;\n        case GLFW_X11_WM_CLASS_CLASS:\n            strncpy(_glfwInitHints.x11.classClass, value,\n                    sizeof(_glfwInitHints.x11.classClass) - 1);\n            break;\n    }\n\n    _glfwInputError(GLFW_INVALID_ENUM,\n                    \"Invalid string type init hint 0x%08X\", hint);\n}\n\nGLFWAPI void glfwGetVersion(int* major, int* minor, int* rev)\n{\n    if (major != NULL)\n        *major = GLFW_VERSION_MAJOR;\n    if (minor != NULL)\n        *minor = GLFW_VERSION_MINOR;\n    if (rev != NULL)\n        *rev = GLFW_VERSION_REVISION;\n}\n\nGLFWAPI const char* glfwGetVersionString(void)\n{\n    return _glfwPlatformGetVersionString();\n}\n\nGLFWAPI int glfwGetError(const char** description)\n{\n    _GLFWerror* error;\n    int code = GLFW_NO_ERROR;\n\n    if (description)\n        *description = NULL;\n\n    if (_glfw.initialized)\n        error = _glfwPlatformGetTls(&_glfw.errorSlot);\n    else\n        error = &_glfwMainThreadError;\n\n    if (error)\n    {\n        code = error->code;\n        error->code = GLFW_NO_ERROR;\n        if (description && code)\n            *description = error->description;\n    }\n\n    return code;\n}\n\nGLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun)\n{\n    _GLFW_SWAP_POINTERS(_glfwErrorCallback, cbfun);\n    return cbfun;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/input.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <assert.h>\n#include <float.h>\n#include <math.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n\n// Internal key state used for sticky keys\n#define _GLFW_STICK 3\n\n// Internal constants for gamepad mapping source types\n#define _GLFW_JOYSTICK_AXIS     1\n#define _GLFW_JOYSTICK_BUTTON   2\n#define _GLFW_JOYSTICK_HATBIT   3\n\n// Finds a mapping based on joystick GUID\n//\nstatic _GLFWmapping* findMapping(const char* guid)\n{\n    int i;\n\n    for (i = 0;  i < _glfw.mappingCount;  i++)\n    {\n        if (strcmp(_glfw.mappings[i].guid, guid) == 0)\n            return _glfw.mappings + i;\n    }\n\n    return NULL;\n}\n\n// Parses an SDL_GameControllerDB line and adds it to the mapping list\n//\nstatic GLFWbool parseMapping(_GLFWmapping* mapping, const char* string)\n{\n    const char* c = string;\n    size_t i, length;\n    struct\n    {\n        const char* name;\n        _GLFWmapelement* element;\n    } fields[] =\n    {\n        { \"platform\",      NULL },\n        { \"a\",             mapping->buttons + GLFW_GAMEPAD_BUTTON_A },\n        { \"b\",             mapping->buttons + GLFW_GAMEPAD_BUTTON_B },\n        { \"x\",             mapping->buttons + GLFW_GAMEPAD_BUTTON_X },\n        { \"y\",             mapping->buttons + GLFW_GAMEPAD_BUTTON_Y },\n        { \"back\",          mapping->buttons + GLFW_GAMEPAD_BUTTON_BACK },\n        { \"start\",         mapping->buttons + GLFW_GAMEPAD_BUTTON_START },\n        { \"guide\",         mapping->buttons + GLFW_GAMEPAD_BUTTON_GUIDE },\n        { \"leftshoulder\",  mapping->buttons + GLFW_GAMEPAD_BUTTON_LEFT_BUMPER },\n        { \"rightshoulder\", mapping->buttons + GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER },\n        { \"leftstick\",     mapping->buttons + GLFW_GAMEPAD_BUTTON_LEFT_THUMB },\n        { \"rightstick\",    mapping->buttons + GLFW_GAMEPAD_BUTTON_RIGHT_THUMB },\n        { \"dpup\",          mapping->buttons + GLFW_GAMEPAD_BUTTON_DPAD_UP },\n        { \"dpright\",       mapping->buttons + GLFW_GAMEPAD_BUTTON_DPAD_RIGHT },\n        { \"dpdown\",        mapping->buttons + GLFW_GAMEPAD_BUTTON_DPAD_DOWN },\n        { \"dpleft\",        mapping->buttons + GLFW_GAMEPAD_BUTTON_DPAD_LEFT },\n        { \"lefttrigger\",   mapping->axes + GLFW_GAMEPAD_AXIS_LEFT_TRIGGER },\n        { \"righttrigger\",  mapping->axes + GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER },\n        { \"leftx\",         mapping->axes + GLFW_GAMEPAD_AXIS_LEFT_X },\n        { \"lefty\",         mapping->axes + GLFW_GAMEPAD_AXIS_LEFT_Y },\n        { \"rightx\",        mapping->axes + GLFW_GAMEPAD_AXIS_RIGHT_X },\n        { \"righty\",        mapping->axes + GLFW_GAMEPAD_AXIS_RIGHT_Y }\n    };\n\n    length = strcspn(c, \",\");\n    if (length != 32 || c[length] != ',')\n    {\n        _glfwInputError(GLFW_INVALID_VALUE, NULL);\n        return GLFW_FALSE;\n    }\n\n    memcpy(mapping->guid, c, length);\n    c += length + 1;\n\n    length = strcspn(c, \",\");\n    if (length >= sizeof(mapping->name) || c[length] != ',')\n    {\n        _glfwInputError(GLFW_INVALID_VALUE, NULL);\n        return GLFW_FALSE;\n    }\n\n    memcpy(mapping->name, c, length);\n    c += length + 1;\n\n    while (*c)\n    {\n        for (i = 0;  i < sizeof(fields) / sizeof(fields[0]);  i++)\n        {\n            length = strlen(fields[i].name);\n            if (strncmp(c, fields[i].name, length) != 0 || c[length] != ':')\n                continue;\n\n            c += length + 1;\n\n            if (fields[i].element)\n            {\n                if (*c == 'a')\n                    fields[i].element->type = _GLFW_JOYSTICK_AXIS;\n                else if (*c == 'b')\n                    fields[i].element->type = _GLFW_JOYSTICK_BUTTON;\n                else if (*c == 'h')\n                    fields[i].element->type = _GLFW_JOYSTICK_HATBIT;\n                else\n                    break;\n\n                if (fields[i].element->type == _GLFW_JOYSTICK_HATBIT)\n                {\n                    const unsigned int hat = strtoul(c + 1, (char**) &c, 10);\n                    const unsigned int bit = strtoul(c + 1, (char**) &c, 10);\n                    fields[i].element->value = (hat << 4) | bit;\n                }\n                else\n                    fields[i].element->value = (uint8_t) strtoul(c + 1, (char**) &c, 10);\n            }\n            else\n            {\n                length = strlen(_GLFW_PLATFORM_MAPPING_NAME);\n                if (strncmp(c, _GLFW_PLATFORM_MAPPING_NAME, length) != 0)\n                    return GLFW_FALSE;\n            }\n\n            break;\n        }\n\n        c += strcspn(c, \",\");\n        c += strspn(c, \",\");\n    }\n\n    for (i = 0;  i < 32;  i++)\n    {\n        if (mapping->guid[i] >= 'A' && mapping->guid[i] <= 'F')\n            mapping->guid[i] += 'a' - 'A';\n    }\n\n    _glfwPlatformUpdateGamepadGUID(mapping->guid);\n    return GLFW_TRUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                         GLFW event API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key >= 0 && key <= GLFW_KEY_LAST)\n    {\n        GLFWbool repeated = GLFW_FALSE;\n\n        if (action == GLFW_RELEASE && window->keys[key] == GLFW_RELEASE)\n            return;\n\n        if (action == GLFW_PRESS && window->keys[key] == GLFW_PRESS)\n            repeated = GLFW_TRUE;\n\n        if (action == GLFW_RELEASE && window->stickyKeys)\n            window->keys[key] = _GLFW_STICK;\n        else\n            window->keys[key] = (char) action;\n\n        if (repeated)\n            action = GLFW_REPEAT;\n    }\n\n    if (window->callbacks.key)\n        window->callbacks.key((GLFWwindow*) window, key, scancode, action, mods);\n}\n\nvoid _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, GLFWbool plain)\n{\n    if (codepoint < 32 || (codepoint > 126 && codepoint < 160))\n        return;\n\n    if (window->callbacks.charmods)\n        window->callbacks.charmods((GLFWwindow*) window, codepoint, mods);\n\n    if (plain)\n    {\n        if (window->callbacks.character)\n            window->callbacks.character((GLFWwindow*) window, codepoint);\n    }\n}\n\nvoid _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset)\n{\n    if (window->callbacks.scroll)\n        window->callbacks.scroll((GLFWwindow*) window, xoffset, yoffset);\n}\n\nvoid _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods)\n{\n    if (button < 0 || button > GLFW_MOUSE_BUTTON_LAST)\n        return;\n\n    if (action == GLFW_RELEASE && window->stickyMouseButtons)\n        window->mouseButtons[button] = _GLFW_STICK;\n    else\n        window->mouseButtons[button] = (char) action;\n\n    if (window->callbacks.mouseButton)\n        window->callbacks.mouseButton((GLFWwindow*) window, button, action, mods);\n}\n\nvoid _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos)\n{\n    if (window->virtualCursorPosX == xpos && window->virtualCursorPosY == ypos)\n        return;\n\n    window->virtualCursorPosX = xpos;\n    window->virtualCursorPosY = ypos;\n\n    if (window->callbacks.cursorPos)\n        window->callbacks.cursorPos((GLFWwindow*) window, xpos, ypos);\n}\n\nvoid _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered)\n{\n    if (window->callbacks.cursorEnter)\n        window->callbacks.cursorEnter((GLFWwindow*) window, entered);\n}\n\nvoid _glfwInputDrop(_GLFWwindow* window, int count, const char** paths)\n{\n    if (window->callbacks.drop)\n        window->callbacks.drop((GLFWwindow*) window, count, paths);\n}\n\nvoid _glfwInputJoystick(_GLFWjoystick* js, int event)\n{\n    const int jid = (int) (js - _glfw.joysticks);\n\n    if (_glfw.callbacks.joystick)\n        _glfw.callbacks.joystick(jid, event);\n}\n\nvoid _glfwInputJoystickAxis(_GLFWjoystick* js, int axis, float value)\n{\n    js->axes[axis] = value;\n}\n\nvoid _glfwInputJoystickButton(_GLFWjoystick* js, int button, char value)\n{\n    js->buttons[button] = value;\n}\n\nvoid _glfwInputJoystickHat(_GLFWjoystick* js, int hat, char value)\n{\n    const int base = js->buttonCount + hat * 4;\n\n    js->buttons[base + 0] = (value & 0x01) ? GLFW_PRESS : GLFW_RELEASE;\n    js->buttons[base + 1] = (value & 0x02) ? GLFW_PRESS : GLFW_RELEASE;\n    js->buttons[base + 2] = (value & 0x04) ? GLFW_PRESS : GLFW_RELEASE;\n    js->buttons[base + 3] = (value & 0x08) ? GLFW_PRESS : GLFW_RELEASE;\n\n    js->hats[hat] = value;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n_GLFWjoystick* _glfwAllocJoystick(const char* name,\n                                  const char* guid,\n                                  int axisCount,\n                                  int buttonCount,\n                                  int hatCount)\n{\n    int jid;\n    _GLFWjoystick* js;\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        if (!_glfw.joysticks[jid].present)\n            break;\n    }\n\n    if (jid > GLFW_JOYSTICK_LAST)\n        return NULL;\n\n    js = _glfw.joysticks + jid;\n    js->present     = GLFW_TRUE;\n    js->name        = strdup(name);\n    js->axes        = calloc(axisCount, sizeof(float));\n    js->buttons     = calloc(buttonCount + hatCount * 4, 1);\n    js->hats        = calloc(hatCount, 1);\n    js->axisCount   = axisCount;\n    js->buttonCount = buttonCount;\n    js->hatCount    = hatCount;\n    js->mapping     = findMapping(guid);\n\n    strcpy(js->guid, guid);\n\n    return js;\n}\n\nvoid _glfwFreeJoystick(_GLFWjoystick* js)\n{\n    free(js->name);\n    free(js->axes);\n    free(js->buttons);\n    free(js->hats);\n    memset(js, 0, sizeof(_GLFWjoystick));\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW public API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(0);\n\n    switch (mode)\n    {\n        case GLFW_CURSOR:\n            return window->cursorMode;\n        case GLFW_STICKY_KEYS:\n            return window->stickyKeys;\n        case GLFW_STICKY_MOUSE_BUTTONS:\n            return window->stickyMouseButtons;\n    }\n\n    _glfwInputError(GLFW_INVALID_ENUM, \"Invalid input mode 0x%08X\", mode);\n    return 0;\n}\n\nGLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (mode == GLFW_CURSOR)\n    {\n        if (value != GLFW_CURSOR_NORMAL &&\n            value != GLFW_CURSOR_HIDDEN &&\n            value != GLFW_CURSOR_DISABLED)\n        {\n            _glfwInputError(GLFW_INVALID_ENUM,\n                            \"Invalid cursor mode 0x%08X\",\n                            value);\n            return;\n        }\n\n        if (window->cursorMode == value)\n            return;\n\n        window->cursorMode = value;\n\n        _glfwPlatformGetCursorPos(window,\n                                  &window->virtualCursorPosX,\n                                  &window->virtualCursorPosY);\n\n        if (_glfwPlatformWindowFocused(window))\n            _glfwPlatformSetCursorMode(window, value);\n    }\n    else if (mode == GLFW_STICKY_KEYS)\n    {\n        value = value ? GLFW_TRUE : GLFW_FALSE;\n        if (window->stickyKeys == value)\n            return;\n\n        if (!value)\n        {\n            int i;\n\n            // Release all sticky keys\n            for (i = 0;  i <= GLFW_KEY_LAST;  i++)\n            {\n                if (window->keys[i] == _GLFW_STICK)\n                    window->keys[i] = GLFW_RELEASE;\n            }\n        }\n\n        window->stickyKeys = value ? GLFW_TRUE : GLFW_FALSE;\n    }\n    else if (mode == GLFW_STICKY_MOUSE_BUTTONS)\n    {\n        value = value ? GLFW_TRUE : GLFW_FALSE;\n        if (window->stickyMouseButtons == value)\n            return;\n\n        if (!value)\n        {\n            int i;\n\n            // Release all sticky mouse buttons\n            for (i = 0;  i <= GLFW_MOUSE_BUTTON_LAST;  i++)\n            {\n                if (window->mouseButtons[i] == _GLFW_STICK)\n                    window->mouseButtons[i] = GLFW_RELEASE;\n            }\n        }\n\n        window->stickyMouseButtons = value ? GLFW_TRUE : GLFW_FALSE;\n    }\n    else\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid input mode 0x%08X\", mode);\n}\n\nGLFWAPI const char* glfwGetKeyName(int key, int scancode)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (key != GLFW_KEY_UNKNOWN)\n    {\n        if (key != GLFW_KEY_KP_EQUAL &&\n            (key < GLFW_KEY_KP_0 || key > GLFW_KEY_KP_ADD) &&\n            (key < GLFW_KEY_APOSTROPHE || key > GLFW_KEY_WORLD_2))\n        {\n            return NULL;\n        }\n\n        scancode = _glfwPlatformGetKeyScancode(key);\n    }\n\n    return _glfwPlatformGetScancodeName(scancode);\n}\n\nGLFWAPI int glfwGetKeyScancode(int key)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(-1);\n\n    if (key < GLFW_KEY_SPACE || key > GLFW_KEY_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid key %i\", key);\n        return GLFW_RELEASE;\n    }\n\n    return _glfwPlatformGetKeyScancode(key);\n}\n\nGLFWAPI int glfwGetKey(GLFWwindow* handle, int key)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_RELEASE);\n\n    if (key < GLFW_KEY_SPACE || key > GLFW_KEY_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid key %i\", key);\n        return GLFW_RELEASE;\n    }\n\n    if (window->keys[key] == _GLFW_STICK)\n    {\n        // Sticky mode: release key now\n        window->keys[key] = GLFW_RELEASE;\n        return GLFW_PRESS;\n    }\n\n    return (int) window->keys[key];\n}\n\nGLFWAPI int glfwGetMouseButton(GLFWwindow* handle, int button)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_RELEASE);\n\n    if (button < GLFW_MOUSE_BUTTON_1 || button > GLFW_MOUSE_BUTTON_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid mouse button %i\", button);\n        return GLFW_RELEASE;\n    }\n\n    if (window->mouseButtons[button] == _GLFW_STICK)\n    {\n        // Sticky mode: release mouse button now\n        window->mouseButtons[button] = GLFW_RELEASE;\n        return GLFW_PRESS;\n    }\n\n    return (int) window->mouseButtons[button];\n}\n\nGLFWAPI void glfwGetCursorPos(GLFWwindow* handle, double* xpos, double* ypos)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    if (xpos)\n        *xpos = 0;\n    if (ypos)\n        *ypos = 0;\n\n    _GLFW_REQUIRE_INIT();\n\n    if (window->cursorMode == GLFW_CURSOR_DISABLED)\n    {\n        if (xpos)\n            *xpos = window->virtualCursorPosX;\n        if (ypos)\n            *ypos = window->virtualCursorPosY;\n    }\n    else\n        _glfwPlatformGetCursorPos(window, xpos, ypos);\n}\n\nGLFWAPI void glfwSetCursorPos(GLFWwindow* handle, double xpos, double ypos)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (xpos != xpos || xpos < -DBL_MAX || xpos > DBL_MAX ||\n        ypos != ypos || ypos < -DBL_MAX || ypos > DBL_MAX)\n    {\n        _glfwInputError(GLFW_INVALID_VALUE,\n                        \"Invalid cursor position %f %f\",\n                        xpos, ypos);\n        return;\n    }\n\n    if (!_glfwPlatformWindowFocused(window))\n        return;\n\n    if (window->cursorMode == GLFW_CURSOR_DISABLED)\n    {\n        // Only update the accumulated position if the cursor is disabled\n        window->virtualCursorPosX = xpos;\n        window->virtualCursorPosY = ypos;\n    }\n    else\n    {\n        // Update system cursor position\n        _glfwPlatformSetCursorPos(window, xpos, ypos);\n    }\n}\n\nGLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot)\n{\n    _GLFWcursor* cursor;\n\n    assert(image != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    cursor = calloc(1, sizeof(_GLFWcursor));\n    cursor->next = _glfw.cursorListHead;\n    _glfw.cursorListHead = cursor;\n\n    if (!_glfwPlatformCreateCursor(cursor, image, xhot, yhot))\n    {\n        glfwDestroyCursor((GLFWcursor*) cursor);\n        return NULL;\n    }\n\n    return (GLFWcursor*) cursor;\n}\n\nGLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape)\n{\n    _GLFWcursor* cursor;\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (shape != GLFW_ARROW_CURSOR &&\n        shape != GLFW_IBEAM_CURSOR &&\n        shape != GLFW_CROSSHAIR_CURSOR &&\n        shape != GLFW_HAND_CURSOR &&\n        shape != GLFW_HRESIZE_CURSOR &&\n        shape != GLFW_VRESIZE_CURSOR)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid standard cursor 0x%08X\", shape);\n        return NULL;\n    }\n\n    cursor = calloc(1, sizeof(_GLFWcursor));\n    cursor->next = _glfw.cursorListHead;\n    _glfw.cursorListHead = cursor;\n\n    if (!_glfwPlatformCreateStandardCursor(cursor, shape))\n    {\n        glfwDestroyCursor((GLFWcursor*) cursor);\n        return NULL;\n    }\n\n    return (GLFWcursor*) cursor;\n}\n\nGLFWAPI void glfwDestroyCursor(GLFWcursor* handle)\n{\n    _GLFWcursor* cursor = (_GLFWcursor*) handle;\n\n    _GLFW_REQUIRE_INIT();\n\n    if (cursor == NULL)\n        return;\n\n    // Make sure the cursor is not being used by any window\n    {\n        _GLFWwindow* window;\n\n        for (window = _glfw.windowListHead;  window;  window = window->next)\n        {\n            if (window->cursor == cursor)\n                glfwSetCursor((GLFWwindow*) window, NULL);\n        }\n    }\n\n    _glfwPlatformDestroyCursor(cursor);\n\n    // Unlink cursor from global linked list\n    {\n        _GLFWcursor** prev = &_glfw.cursorListHead;\n\n        while (*prev != cursor)\n            prev = &((*prev)->next);\n\n        *prev = cursor->next;\n    }\n\n    free(cursor);\n}\n\nGLFWAPI void glfwSetCursor(GLFWwindow* windowHandle, GLFWcursor* cursorHandle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) windowHandle;\n    _GLFWcursor* cursor = (_GLFWcursor*) cursorHandle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    window->cursor = cursor;\n\n    _glfwPlatformSetCursor(window, cursor);\n}\n\nGLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* handle, GLFWkeyfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.key, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* handle, GLFWcharfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.character, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* handle, GLFWcharmodsfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.charmods, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* handle,\n                                                      GLFWmousebuttonfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.mouseButton, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* handle,\n                                                  GLFWcursorposfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.cursorPos, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* handle,\n                                                      GLFWcursorenterfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.cursorEnter, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* handle,\n                                            GLFWscrollfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.scroll, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* handle, GLFWdropfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.drop, cbfun);\n    return cbfun;\n}\n\nGLFWAPI int glfwJoystickPresent(int jid)\n{\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return GLFW_FALSE;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return GLFW_FALSE;\n\n    return _glfwPlatformPollJoystick(js, _GLFW_POLL_PRESENCE);\n}\n\nGLFWAPI const float* glfwGetJoystickAxes(int jid, int* count)\n{\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n    assert(count != NULL);\n\n    *count = 0;\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return NULL;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return NULL;\n\n    if (!_glfwPlatformPollJoystick(js, _GLFW_POLL_AXES))\n        return NULL;\n\n    *count = js->axisCount;\n    return js->axes;\n}\n\nGLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count)\n{\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n    assert(count != NULL);\n\n    *count = 0;\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return NULL;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return NULL;\n\n    if (!_glfwPlatformPollJoystick(js, _GLFW_POLL_BUTTONS))\n        return NULL;\n\n    if (_glfw.hints.init.hatButtons)\n        *count = js->buttonCount + js->hatCount * 4;\n    else\n        *count = js->buttonCount;\n\n    return js->buttons;\n}\n\nGLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count)\n{\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n    assert(count != NULL);\n\n    *count = 0;\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return NULL;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return NULL;\n\n    if (!_glfwPlatformPollJoystick(js, _GLFW_POLL_BUTTONS))\n        return NULL;\n\n    *count = js->hatCount;\n    return js->hats;\n}\n\nGLFWAPI const char* glfwGetJoystickName(int jid)\n{\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return NULL;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return NULL;\n\n    if (!_glfwPlatformPollJoystick(js, _GLFW_POLL_PRESENCE))\n        return NULL;\n\n    return js->name;\n}\n\nGLFWAPI const char* glfwGetJoystickGUID(int jid)\n{\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return NULL;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return NULL;\n\n    if (!_glfwPlatformPollJoystick(js, _GLFW_POLL_PRESENCE))\n        return NULL;\n\n    return js->guid;\n}\n\nGLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(_glfw.callbacks.joystick, cbfun);\n    return cbfun;\n}\n\nGLFWAPI int glfwUpdateGamepadMappings(const char* string)\n{\n    int jid;\n    const char* c = string;\n\n    assert(string != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n\n    while (*c)\n    {\n        if (isxdigit(*c))\n        {\n            char line[1024];\n\n            const size_t length = strcspn(c, \"\\r\\n\");\n            if (length < sizeof(line))\n            {\n                _GLFWmapping mapping = {{0}};\n\n                memcpy(line, c, length);\n                line[length] = '\\0';\n\n                if (parseMapping(&mapping, line))\n                {\n                    _GLFWmapping* previous = findMapping(mapping.guid);\n                    if (previous)\n                        *previous = mapping;\n                    else\n                    {\n                        _glfw.mappingCount++;\n                        _glfw.mappings =\n                            realloc(_glfw.mappings,\n                                    sizeof(_GLFWmapping) * _glfw.mappingCount);\n                        _glfw.mappings[_glfw.mappingCount - 1] = mapping;\n                    }\n                }\n            }\n\n            c += length;\n        }\n        else\n        {\n            c += strcspn(c, \"\\r\\n\");\n            c += strspn(c, \"\\r\\n\");\n        }\n    }\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        _GLFWjoystick* js = _glfw.joysticks + jid;\n        if (js->present)\n            js->mapping = findMapping(js->guid);\n    }\n\n    return GLFW_TRUE;\n}\n\nGLFWAPI int glfwJoystickIsGamepad(int jid)\n{\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return GLFW_FALSE;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return GLFW_FALSE;\n\n    if (!_glfwPlatformPollJoystick(js, _GLFW_POLL_PRESENCE))\n        return GLFW_FALSE;\n\n    return js->mapping != NULL;\n}\n\nGLFWAPI const char* glfwGetGamepadName(int jid)\n{\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return NULL;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return NULL;\n\n    if (!_glfwPlatformPollJoystick(js, _GLFW_POLL_PRESENCE))\n        return NULL;\n\n    if (!js->mapping)\n        return NULL;\n\n    return js->mapping->name;\n}\n\nGLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state)\n{\n    int i;\n    _GLFWjoystick* js;\n\n    assert(jid >= GLFW_JOYSTICK_1);\n    assert(jid <= GLFW_JOYSTICK_LAST);\n    assert(state != NULL);\n\n    memset(state, 0, sizeof(GLFWgamepadstate));\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n\n    if (jid < 0 || jid > GLFW_JOYSTICK_LAST)\n    {\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid joystick ID %i\", jid);\n        return GLFW_FALSE;\n    }\n\n    js = _glfw.joysticks + jid;\n    if (!js->present)\n        return GLFW_FALSE;\n\n    if (!_glfwPlatformPollJoystick(js, _GLFW_POLL_ALL))\n        return GLFW_FALSE;\n\n    if (!js->mapping)\n        return GLFW_FALSE;\n\n    for (i = 0;  i <= GLFW_GAMEPAD_BUTTON_LAST;  i++)\n    {\n        if (js->mapping->buttons[i].type == _GLFW_JOYSTICK_AXIS)\n        {\n            if (fabs(js->axes[js->mapping->buttons[i].value]) > 0.5)\n                state->buttons[i] = GLFW_PRESS;\n        }\n        else if (js->mapping->buttons[i].type == _GLFW_JOYSTICK_HATBIT)\n        {\n            const unsigned int hat = js->mapping->buttons[i].value >> 4;\n            const unsigned int bit = js->mapping->buttons[i].value & 0xf;\n            if (js->hats[hat] & bit)\n                state->buttons[i] = GLFW_PRESS;\n        }\n        else if (js->mapping->buttons[i].type == _GLFW_JOYSTICK_BUTTON)\n            state->buttons[i] = js->buttons[js->mapping->buttons[i].value];\n    }\n\n    for (i = 0;  i <= GLFW_GAMEPAD_AXIS_LAST;  i++)\n    {\n        if (js->mapping->axes[i].type == _GLFW_JOYSTICK_AXIS)\n            state->axes[i] = js->axes[js->mapping->axes[i].value];\n        else if (js->mapping->buttons[i].type == _GLFW_JOYSTICK_HATBIT)\n        {\n            const unsigned int hat = js->mapping->buttons[i].value >> 4;\n            const unsigned int bit = js->mapping->buttons[i].value & 0xf;\n            if (js->hats[hat] & bit)\n                state->axes[i] = 1.f;\n        }\n        else if (js->mapping->buttons[i].type == _GLFW_JOYSTICK_BUTTON)\n            state->axes[i] = (float) js->buttons[js->mapping->axes[i].value];\n    }\n\n    return GLFW_TRUE;\n}\n\nGLFWAPI void glfwSetClipboardString(GLFWwindow* handle, const char* string)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n    assert(string != NULL);\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformSetClipboardString(window, string);\n}\n\nGLFWAPI const char* glfwGetClipboardString(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return _glfwPlatformGetClipboardString(window);\n}\n\nGLFWAPI double glfwGetTime(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(0.0);\n    return (double) (_glfwPlatformGetTimerValue() - _glfw.timer.offset) /\n        _glfwPlatformGetTimerFrequency();\n}\n\nGLFWAPI void glfwSetTime(double time)\n{\n    _GLFW_REQUIRE_INIT();\n\n    if (time != time || time < 0.0 || time > 18446744073.0)\n    {\n        _glfwInputError(GLFW_INVALID_VALUE, \"Invalid time %f\", time);\n        return;\n    }\n\n    _glfw.timer.offset = _glfwPlatformGetTimerValue() -\n        (uint64_t) (time * _glfwPlatformGetTimerFrequency());\n}\n\nGLFWAPI uint64_t glfwGetTimerValue(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(0);\n    return _glfwPlatformGetTimerValue();\n}\n\nGLFWAPI uint64_t glfwGetTimerFrequency(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(0);\n    return _glfwPlatformGetTimerFrequency();\n}\n\n"
  },
  {
    "path": "external/GLFW/src/internal.h",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#if defined(_GLFW_USE_CONFIG_H)\n #include \"glfw_config.h\"\n#endif\n\n#if defined(GLFW_INCLUDE_GLCOREARB) || \\\n    defined(GLFW_INCLUDE_ES1)       || \\\n    defined(GLFW_INCLUDE_ES2)       || \\\n    defined(GLFW_INCLUDE_ES3)       || \\\n    defined(GLFW_INCLUDE_ES31)      || \\\n    defined(GLFW_INCLUDE_ES32)      || \\\n    defined(GLFW_INCLUDE_NONE)      || \\\n    defined(GLFW_INCLUDE_GLEXT)     || \\\n    defined(GLFW_INCLUDE_GLU)       || \\\n    defined(GLFW_INCLUDE_VULKAN)    || \\\n    defined(GLFW_DLL)\n #error \"You must not define any header option macros when compiling GLFW\"\n#endif\n\n#define GLFW_INCLUDE_NONE\n#include \"../include/GLFW/glfw3.h\"\n\n#define _GLFW_INSERT_FIRST      0\n#define _GLFW_INSERT_LAST       1\n\n#define _GLFW_POLL_PRESENCE     0\n#define _GLFW_POLL_AXES         1\n#define _GLFW_POLL_BUTTONS      2\n#define _GLFW_POLL_ALL          (_GLFW_POLL_AXES | _GLFW_POLL_BUTTONS)\n\n#define _GLFW_MESSAGE_SIZE      1024\n\ntypedef int GLFWbool;\n\ntypedef struct _GLFWerror       _GLFWerror;\ntypedef struct _GLFWinitconfig  _GLFWinitconfig;\ntypedef struct _GLFWwndconfig   _GLFWwndconfig;\ntypedef struct _GLFWctxconfig   _GLFWctxconfig;\ntypedef struct _GLFWfbconfig    _GLFWfbconfig;\ntypedef struct _GLFWcontext     _GLFWcontext;\ntypedef struct _GLFWwindow      _GLFWwindow;\ntypedef struct _GLFWlibrary     _GLFWlibrary;\ntypedef struct _GLFWmonitor     _GLFWmonitor;\ntypedef struct _GLFWcursor      _GLFWcursor;\ntypedef struct _GLFWmapelement  _GLFWmapelement;\ntypedef struct _GLFWmapping     _GLFWmapping;\ntypedef struct _GLFWjoystick    _GLFWjoystick;\ntypedef struct _GLFWtls         _GLFWtls;\ntypedef struct _GLFWmutex       _GLFWmutex;\n\ntypedef void (* _GLFWmakecontextcurrentfun)(_GLFWwindow*);\ntypedef void (* _GLFWswapbuffersfun)(_GLFWwindow*);\ntypedef void (* _GLFWswapintervalfun)(int);\ntypedef int (* _GLFWextensionsupportedfun)(const char*);\ntypedef GLFWglproc (* _GLFWgetprocaddressfun)(const char*);\ntypedef void (* _GLFWdestroycontextfun)(_GLFWwindow*);\n\n#define GL_VERSION 0x1f02\n#define GL_NONE\t0\n#define GL_COLOR_BUFFER_BIT\t0x00004000\n#define GL_UNSIGNED_BYTE 0x1401\n#define GL_EXTENSIONS 0x1f03\n#define GL_NUM_EXTENSIONS 0x821d\n#define GL_CONTEXT_FLAGS 0x821e\n#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001\n#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002\n#define GL_CONTEXT_PROFILE_MASK 0x9126\n#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\n#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001\n#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252\n#define GL_NO_RESET_NOTIFICATION_ARB 0x8261\n#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82fb\n#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82fc\n#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008\n\ntypedef int\tGLint;\ntypedef unsigned int GLuint;\ntypedef unsigned int GLenum;\ntypedef unsigned int GLbitfield;\ntypedef unsigned char GLubyte;\n\ntypedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield);\ntypedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);\ntypedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);\ntypedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);\n\n#define VK_NULL_HANDLE 0\n\ntypedef void* VkInstance;\ntypedef void* VkPhysicalDevice;\ntypedef uint64_t VkSurfaceKHR;\ntypedef uint32_t VkFlags;\ntypedef uint32_t VkBool32;\n\ntypedef enum VkStructureType\n{\n    VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000,\n    VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000,\n    VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000,\n    VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR = 1000007000,\n    VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,\n    VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000053000,\n    VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF\n} VkStructureType;\n\ntypedef enum VkResult\n{\n    VK_SUCCESS = 0,\n    VK_NOT_READY = 1,\n    VK_TIMEOUT = 2,\n    VK_EVENT_SET = 3,\n    VK_EVENT_RESET = 4,\n    VK_INCOMPLETE = 5,\n    VK_ERROR_OUT_OF_HOST_MEMORY = -1,\n    VK_ERROR_OUT_OF_DEVICE_MEMORY = -2,\n    VK_ERROR_INITIALIZATION_FAILED = -3,\n    VK_ERROR_DEVICE_LOST = -4,\n    VK_ERROR_MEMORY_MAP_FAILED = -5,\n    VK_ERROR_LAYER_NOT_PRESENT = -6,\n    VK_ERROR_EXTENSION_NOT_PRESENT = -7,\n    VK_ERROR_FEATURE_NOT_PRESENT = -8,\n    VK_ERROR_INCOMPATIBLE_DRIVER = -9,\n    VK_ERROR_TOO_MANY_OBJECTS = -10,\n    VK_ERROR_FORMAT_NOT_SUPPORTED = -11,\n    VK_ERROR_SURFACE_LOST_KHR = -1000000000,\n    VK_SUBOPTIMAL_KHR = 1000001003,\n    VK_ERROR_OUT_OF_DATE_KHR = -1000001004,\n    VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001,\n    VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,\n    VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,\n    VK_RESULT_MAX_ENUM = 0x7FFFFFFF\n} VkResult;\n\ntypedef struct VkAllocationCallbacks VkAllocationCallbacks;\n\ntypedef struct VkExtensionProperties\n{\n    char            extensionName[256];\n    uint32_t        specVersion;\n} VkExtensionProperties;\n\ntypedef void (APIENTRY * PFN_vkVoidFunction)(void);\n\n#if defined(_GLFW_VULKAN_STATIC)\n  PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance,const char*);\n  VkResult vkEnumerateInstanceExtensionProperties(const char*,uint32_t*,VkExtensionProperties*);\n#else\n  typedef PFN_vkVoidFunction (APIENTRY * PFN_vkGetInstanceProcAddr)(VkInstance,const char*);\n  typedef VkResult (APIENTRY * PFN_vkEnumerateInstanceExtensionProperties)(const char*,uint32_t*,VkExtensionProperties*);\n  #define vkEnumerateInstanceExtensionProperties _glfw.vk.EnumerateInstanceExtensionProperties\n  #define vkGetInstanceProcAddr _glfw.vk.GetInstanceProcAddr\n#endif\n\n#if defined(_GLFW_COCOA)\n #include \"cocoa_platform.h\"\n#elif defined(_GLFW_WIN32)\n #include \"win32_platform.h\"\n#elif defined(_GLFW_X11)\n #include \"x11_platform.h\"\n#elif defined(_GLFW_WAYLAND)\n #include \"wl_platform.h\"\n#elif defined(_GLFW_MIR)\n #include \"mir_platform.h\"\n#elif defined(_GLFW_OSMESA)\n #include \"null_platform.h\"\n#else\n #error \"No supported window creation API selected\"\n#endif\n\n\n//========================================================================\n// Doxygen group definitions\n//========================================================================\n\n/*! @defgroup platform Platform interface\n *  @brief The interface implemented by the platform-specific code.\n *\n *  The platform API is the interface exposed by the platform-specific code for\n *  each platform and is called by the shared code of the public API It mirrors\n *  the public API except it uses objects instead of handles.\n */\n/*! @defgroup event Event interface\n *  @brief The interface used by the platform-specific code to report events.\n *\n *  The event API is used by the platform-specific code to notify the shared\n *  code of events that can be translated into state changes and/or callback\n *  calls.\n */\n/*! @defgroup utility Utility functions\n *  @brief Various utility functions for internal use.\n *\n *  These functions are shared code and may be used by any part of GLFW\n *  Each platform may add its own utility functions, but those must only be\n *  called by the platform-specific code\n */\n\n\n//========================================================================\n// Helper macros\n//========================================================================\n\n// Constructs a version number string from the public header macros\n#define _GLFW_CONCAT_VERSION(m, n, r) #m \".\" #n \".\" #r\n#define _GLFW_MAKE_VERSION(m, n, r) _GLFW_CONCAT_VERSION(m, n, r)\n#define _GLFW_VERSION_NUMBER _GLFW_MAKE_VERSION(GLFW_VERSION_MAJOR, \\\n                                                GLFW_VERSION_MINOR, \\\n                                                GLFW_VERSION_REVISION)\n\n// Checks for whether the library has been initialized\n#define _GLFW_REQUIRE_INIT()                         \\\n    if (!_glfw.initialized)                          \\\n    {                                                \\\n        _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \\\n        return;                                      \\\n    }\n#define _GLFW_REQUIRE_INIT_OR_RETURN(x)              \\\n    if (!_glfw.initialized)                          \\\n    {                                                \\\n        _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \\\n        return x;                                    \\\n    }\n\n// Swaps the provided pointers\n#define _GLFW_SWAP_POINTERS(x, y) \\\n    {                             \\\n        void* t;                  \\\n        t = x;                    \\\n        x = y;                    \\\n        y = t;                    \\\n    }\n\n\n//========================================================================\n// Platform-independent structures\n//========================================================================\n\nstruct _GLFWerror\n{\n    _GLFWerror*     next;\n    int             code;\n    char            description[_GLFW_MESSAGE_SIZE];\n};\n\n/*! @brief Initialization configuration.\n *\n *  Parameters relating to the initialization of the library.\n */\nstruct _GLFWinitconfig\n{\n    GLFWbool      hatButtons;\n    struct {\n        GLFWbool  menubar;\n        GLFWbool  chdir;\n    } ns;\n    struct {\n        char      className[256];\n        char      classClass[256];\n    } x11;\n};\n\n/*! @brief Window configuration.\n *\n *  Parameters relating to the creation of the window but not directly related\n *  to the framebuffer.  This is used to pass window creation parameters from\n *  shared code to the platform API.\n */\nstruct _GLFWwndconfig\n{\n    int           width;\n    int           height;\n    const char*   title;\n    GLFWbool      resizable;\n    GLFWbool      visible;\n    GLFWbool      decorated;\n    GLFWbool      focused;\n    GLFWbool      autoIconify;\n    GLFWbool      floating;\n    GLFWbool      maximized;\n    GLFWbool      centerCursor;\n    struct {\n        GLFWbool  retina;\n        GLFWbool  frame;\n    } ns;\n};\n\n/*! @brief Context configuration.\n *\n *  Parameters relating to the creation of the context but not directly related\n *  to the framebuffer.  This is used to pass context creation parameters from\n *  shared code to the platform API.\n */\nstruct _GLFWctxconfig\n{\n    int           client;\n    int           source;\n    int           major;\n    int           minor;\n    GLFWbool      forward;\n    GLFWbool      debug;\n    GLFWbool      noerror;\n    int           profile;\n    int           robustness;\n    int           release;\n    _GLFWwindow*  share;\n    struct {\n        GLFWbool  offline;\n    } nsgl;\n};\n\n/*! @brief Framebuffer configuration.\n *\n *  This describes buffers and their sizes.  It also contains\n *  a platform-specific ID used to map back to the backend API object.\n *\n *  It is used to pass framebuffer parameters from shared code to the platform\n *  API and also to enumerate and select available framebuffer configs.\n */\nstruct _GLFWfbconfig\n{\n    int         redBits;\n    int         greenBits;\n    int         blueBits;\n    int         alphaBits;\n    int         depthBits;\n    int         stencilBits;\n    int         accumRedBits;\n    int         accumGreenBits;\n    int         accumBlueBits;\n    int         accumAlphaBits;\n    int         auxBuffers;\n    GLFWbool    stereo;\n    int         samples;\n    GLFWbool    sRGB;\n    GLFWbool    doublebuffer;\n    GLFWbool    transparent;\n    uintptr_t   handle;\n};\n\n/*! @brief Context structure.\n */\nstruct _GLFWcontext\n{\n    int                 client;\n    int                 source;\n    int                 major, minor, revision;\n    GLFWbool            forward, debug, noerror;\n    int                 profile;\n    int                 robustness;\n    int                 release;\n\n    PFNGLGETSTRINGIPROC GetStringi;\n    PFNGLGETINTEGERVPROC GetIntegerv;\n    PFNGLGETSTRINGPROC  GetString;\n\n    _GLFWmakecontextcurrentfun  makeCurrent;\n    _GLFWswapbuffersfun         swapBuffers;\n    _GLFWswapintervalfun        swapInterval;\n    _GLFWextensionsupportedfun  extensionSupported;\n    _GLFWgetprocaddressfun      getProcAddress;\n    _GLFWdestroycontextfun      destroy;\n\n    // This is defined in the context API's context.h\n    _GLFW_PLATFORM_CONTEXT_STATE;\n    // This is defined in egl_context.h\n    _GLFW_EGL_CONTEXT_STATE;\n    // This is defined in osmesa_context.h\n    _GLFW_OSMESA_CONTEXT_STATE;\n};\n\n/*! @brief Window and context structure.\n */\nstruct _GLFWwindow\n{\n    struct _GLFWwindow* next;\n\n    // Window settings and state\n    GLFWbool            resizable;\n    GLFWbool            decorated;\n    GLFWbool            autoIconify;\n    GLFWbool            floating;\n    GLFWbool            shouldClose;\n    void*               userPointer;\n    GLFWvidmode         videoMode;\n    _GLFWmonitor*       monitor;\n    _GLFWcursor*        cursor;\n\n    int                 minwidth, minheight;\n    int                 maxwidth, maxheight;\n    int                 numer, denom;\n\n    GLFWbool            stickyKeys;\n    GLFWbool            stickyMouseButtons;\n    int                 cursorMode;\n    char                mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];\n    char                keys[GLFW_KEY_LAST + 1];\n    // Virtual cursor position when cursor is disabled\n    double              virtualCursorPosX, virtualCursorPosY;\n\n    _GLFWcontext        context;\n\n    struct {\n        GLFWwindowposfun        pos;\n        GLFWwindowsizefun       size;\n        GLFWwindowclosefun      close;\n        GLFWwindowrefreshfun    refresh;\n        GLFWwindowfocusfun      focus;\n        GLFWwindowiconifyfun    iconify;\n        GLFWwindowmaximizefun   maximize;\n        GLFWframebuffersizefun  fbsize;\n        GLFWmousebuttonfun      mouseButton;\n        GLFWcursorposfun        cursorPos;\n        GLFWcursorenterfun      cursorEnter;\n        GLFWscrollfun           scroll;\n        GLFWkeyfun              key;\n        GLFWcharfun             character;\n        GLFWcharmodsfun         charmods;\n        GLFWdropfun             drop;\n    } callbacks;\n\n    // This is defined in the window API's platform.h\n    _GLFW_PLATFORM_WINDOW_STATE;\n};\n\n/*! @brief Monitor structure.\n */\nstruct _GLFWmonitor\n{\n    char*           name;\n\n    // Physical dimensions in millimeters.\n    int             widthMM, heightMM;\n\n    // The window whose video mode is current on this monitor\n    _GLFWwindow*    window;\n\n    GLFWvidmode*    modes;\n    int             modeCount;\n    GLFWvidmode     currentMode;\n\n    GLFWgammaramp   originalRamp;\n    GLFWgammaramp   currentRamp;\n\n    // This is defined in the window API's platform.h\n    _GLFW_PLATFORM_MONITOR_STATE;\n};\n\n/*! @brief Cursor structure\n */\nstruct _GLFWcursor\n{\n    _GLFWcursor*    next;\n\n    // This is defined in the window API's platform.h\n    _GLFW_PLATFORM_CURSOR_STATE;\n};\n\n/*! @brief Gamepad mapping element structure\n */\nstruct _GLFWmapelement\n{\n    uint8_t         type;\n    uint8_t         value;\n};\n\n/*! @brief Gamepad mapping structure\n */\nstruct _GLFWmapping\n{\n    char            name[128];\n    char            guid[33];\n    _GLFWmapelement buttons[15];\n    _GLFWmapelement axes[6];\n};\n\n/*! @brief Joystick structure\n */\nstruct _GLFWjoystick\n{\n    GLFWbool        present;\n    float*          axes;\n    int             axisCount;\n    unsigned char*  buttons;\n    int             buttonCount;\n    unsigned char*  hats;\n    int             hatCount;\n    char*           name;\n    char            guid[33];\n    _GLFWmapping*   mapping;\n\n    // This is defined in the joystick API's joystick.h\n    _GLFW_PLATFORM_JOYSTICK_STATE;\n};\n\n/*! @brief Thread local storage structure.\n */\nstruct _GLFWtls\n{\n    // This is defined in the platform's thread.h\n    _GLFW_PLATFORM_TLS_STATE;\n};\n\n/*! @brief Mutex structure.\n */\nstruct _GLFWmutex\n{\n    // This is defined in the platform's thread.h\n    _GLFW_PLATFORM_MUTEX_STATE;\n};\n\n/*! @brief Library global data.\n */\nstruct _GLFWlibrary\n{\n    GLFWbool            initialized;\n\n    struct {\n        _GLFWinitconfig init;\n        _GLFWfbconfig   framebuffer;\n        _GLFWwndconfig  window;\n        _GLFWctxconfig  context;\n        int             refreshRate;\n    } hints;\n\n    _GLFWerror*         errorListHead;\n    _GLFWcursor*        cursorListHead;\n    _GLFWwindow*        windowListHead;\n\n    _GLFWmonitor**      monitors;\n    int                 monitorCount;\n\n    _GLFWjoystick       joysticks[GLFW_JOYSTICK_LAST + 1];\n    _GLFWmapping*       mappings;\n    int                 mappingCount;\n\n    _GLFWtls            errorSlot;\n    _GLFWtls            contextSlot;\n    _GLFWmutex          errorLock;\n\n    struct {\n        uint64_t        offset;\n        // This is defined in the platform's time.h\n        _GLFW_PLATFORM_LIBRARY_TIMER_STATE;\n    } timer;\n\n    struct {\n        GLFWbool        available;\n        void*           handle;\n        char*           extensions[2];\n#if !defined(_GLFW_VULKAN_STATIC)\n        PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties;\n        PFN_vkGetInstanceProcAddr GetInstanceProcAddr;\n#endif\n        GLFWbool        KHR_surface;\n#if defined(_GLFW_WIN32)\n        GLFWbool        KHR_win32_surface;\n#elif defined(_GLFW_COCOA)\n        GLFWbool        MVK_macos_surface;\n#elif defined(_GLFW_X11)\n        GLFWbool        KHR_xlib_surface;\n        GLFWbool        KHR_xcb_surface;\n#elif defined(_GLFW_WAYLAND)\n        GLFWbool        KHR_wayland_surface;\n#elif defined(_GLFW_MIR)\n        GLFWbool        KHR_mir_surface;\n#endif\n    } vk;\n\n    struct {\n        GLFWmonitorfun  monitor;\n        GLFWjoystickfun joystick;\n    } callbacks;\n\n    // This is defined in the window API's platform.h\n    _GLFW_PLATFORM_LIBRARY_WINDOW_STATE;\n    // This is defined in the context API's context.h\n    _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE;\n    // This is defined in the platform's joystick.h\n    _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE;\n    // This is defined in egl_context.h\n    _GLFW_EGL_LIBRARY_CONTEXT_STATE;\n    // This is defined in osmesa_context.h\n    _GLFW_OSMESA_LIBRARY_CONTEXT_STATE;\n};\n\n\n//========================================================================\n// Global state shared between compilation units of GLFW\n//========================================================================\n\n/*! @brief All global data shared between compilation units.\n */\nextern _GLFWlibrary _glfw;\n\n\n//========================================================================\n// Platform API functions\n//========================================================================\n\n/*! @addtogroup platform @{ */\n\nint _glfwPlatformInit(void);\nvoid _glfwPlatformTerminate(void);\nconst char* _glfwPlatformGetVersionString(void);\n\nvoid _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos);\nvoid _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos);\nvoid _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode);\nint _glfwPlatformCreateCursor(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot);\nint _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape);\nvoid _glfwPlatformDestroyCursor(_GLFWcursor* cursor);\nvoid _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor);\n\nconst char* _glfwPlatformGetScancodeName(int scancode);\nint _glfwPlatformGetKeyScancode(int key);\n\nvoid _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos);\nGLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count);\nvoid _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode);\nvoid _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp);\nvoid _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);\n\nvoid _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string);\nconst char* _glfwPlatformGetClipboardString(_GLFWwindow* window);\n\nint _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode);\nvoid _glfwPlatformUpdateGamepadGUID(char* guid);\n\nuint64_t _glfwPlatformGetTimerValue(void);\nuint64_t _glfwPlatformGetTimerFrequency(void);\n\nint _glfwPlatformCreateWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig);\nvoid _glfwPlatformDestroyWindow(_GLFWwindow* window);\nvoid _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title);\nvoid _glfwPlatformSetWindowIcon(_GLFWwindow* window, int count, const GLFWimage* images);\nvoid _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos);\nvoid _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos);\nvoid _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height);\nvoid _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);\nvoid _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);\nvoid _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom);\nvoid _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height);\nvoid _glfwPlatformGetWindowFrameSize(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);\nvoid _glfwPlatformIconifyWindow(_GLFWwindow* window);\nvoid _glfwPlatformRestoreWindow(_GLFWwindow* window);\nvoid _glfwPlatformMaximizeWindow(_GLFWwindow* window);\nvoid _glfwPlatformShowWindow(_GLFWwindow* window);\nvoid _glfwPlatformHideWindow(_GLFWwindow* window);\nvoid _glfwPlatformRequestWindowAttention(_GLFWwindow* window);\nvoid _glfwPlatformFocusWindow(_GLFWwindow* window);\nvoid _glfwPlatformSetWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);\nint _glfwPlatformWindowFocused(_GLFWwindow* window);\nint _glfwPlatformWindowIconified(_GLFWwindow* window);\nint _glfwPlatformWindowVisible(_GLFWwindow* window);\nint _glfwPlatformWindowMaximized(_GLFWwindow* window);\nint _glfwPlatformFramebufferTransparent(_GLFWwindow* window);\nvoid _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled);\nvoid _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled);\nvoid _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled);\n\nvoid _glfwPlatformPollEvents(void);\nvoid _glfwPlatformWaitEvents(void);\nvoid _glfwPlatformWaitEventsTimeout(double timeout);\nvoid _glfwPlatformPostEmptyEvent(void);\n\nvoid _glfwPlatformGetRequiredInstanceExtensions(char** extensions);\nint _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);\nVkResult _glfwPlatformCreateWindowSurface(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);\n\nGLFWbool _glfwPlatformCreateTls(_GLFWtls* tls);\nvoid _glfwPlatformDestroyTls(_GLFWtls* tls);\nvoid* _glfwPlatformGetTls(_GLFWtls* tls);\nvoid _glfwPlatformSetTls(_GLFWtls* tls, void* value);\n\nGLFWbool _glfwPlatformCreateMutex(_GLFWmutex* mutex);\nvoid _glfwPlatformDestroyMutex(_GLFWmutex* mutex);\nvoid _glfwPlatformLockMutex(_GLFWmutex* mutex);\nvoid _glfwPlatformUnlockMutex(_GLFWmutex* mutex);\n\n/*! @} */\n\n\n//========================================================================\n// Event API functions\n//========================================================================\n\n/*! @brief Notifies shared code that a window has lost or received input focus.\n *  @param[in] window The window that received the event.\n *  @param[in] focused `GLFW_TRUE` if the window received focus, or `GLFW_FALSE`\n *  if it lost focus.\n *  @ingroup event\n */\nvoid _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused);\n\n/*! @brief Notifies shared code that a window has moved.\n *  @param[in] window The window that received the event.\n *  @param[in] xpos The new x-coordinate of the client area of the window.\n *  @param[in] ypos The new y-coordinate of the client area of the window.\n *  @ingroup event\n */\nvoid _glfwInputWindowPos(_GLFWwindow* window, int xpos, int ypos);\n\n/*! @brief Notifies shared code that a window has been resized.\n *  @param[in] window The window that received the event.\n *  @param[in] width The new width of the client area of the window.\n *  @param[in] height The new height of the client area of the window.\n *  @ingroup event\n */\nvoid _glfwInputWindowSize(_GLFWwindow* window, int width, int height);\n\n/*! @brief Notifies shared code that a window framebuffer has been resized.\n *  @param[in] window The window that received the event.\n *  @param[in] width The new width, in pixels, of the framebuffer.\n *  @param[in] height The new height, in pixels, of the framebuffer.\n *  @ingroup event\n */\nvoid _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height);\n\n/*! @brief Notifies shared code that a window has been iconified or restored.\n *  @param[in] window The window that received the event.\n *  @param[in] iconified `GLFW_TRUE` if the window was iconified, or\n *  `GLFW_FALSE` if it was restored.\n *  @ingroup event\n */\nvoid _glfwInputWindowIconify(_GLFWwindow* window, GLFWbool iconified);\n\n/*! @brief Notifies shared code that a window has been maximized or restored.\n *  @param[in] window The window that received the event.\n *  @param[in] maximized `GLFW_TRUE` if the window was maximized, or\n *  `GLFW_FALSE` if it was restored.\n *  @ingroup event\n */\nvoid _glfwInputWindowMaximize(_GLFWwindow* window, GLFWbool maximized);\n\n/*! @brief Notifies shared code that a window's contents needs updating.\n *  @param[in] window The window that received the event.\n */\nvoid _glfwInputWindowDamage(_GLFWwindow* window);\n\n/*! @brief Notifies shared code that the user wishes to close a window.\n *  @param[in] window The window that received the event.\n *  @ingroup event\n */\nvoid _glfwInputWindowCloseRequest(_GLFWwindow* window);\n\n/*! @brief Notifies shared code that a window has changed its desired monitor.\n *  @param[in] window The window that received the event.\n *  @param[in] monitor The new desired monitor, or `NULL`.\n *  @ingroup event\n */\nvoid _glfwInputWindowMonitorChange(_GLFWwindow* window, _GLFWmonitor* monitor);\n\n/*! @brief Notifies shared code of a physical key event.\n *  @param[in] window The window that received the event.\n *  @param[in] key The key that was pressed or released.\n *  @param[in] scancode The system-specific scan code of the key.\n *  @param[in] action @ref GLFW_PRESS or @ref GLFW_RELEASE.\n *  @param[in] mods The modifiers pressed when the event was generated.\n *  @ingroup event\n */\nvoid _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int mods);\n\n/*! @brief Notifies shared code of a Unicode character input event.\n *  @param[in] window The window that received the event.\n *  @param[in] codepoint The Unicode code point of the input character.\n *  @param[in] mods Bit field describing which modifier keys were held down.\n *  @param[in] plain `GLFW_TRUE` if the character is regular text input, or\n *  `GLFW_FALSE` otherwise.\n *  @ingroup event\n */\nvoid _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, GLFWbool plain);\n\n/*! @brief Notifies shared code of a scroll event.\n *  @param[in] window The window that received the event.\n *  @param[in] xoffset The scroll offset along the x-axis.\n *  @param[in] yoffset The scroll offset along the y-axis.\n *  @ingroup event\n */\nvoid _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset);\n\n/*! @brief Notifies shared code of a mouse button click event.\n *  @param[in] window The window that received the event.\n *  @param[in] button The button that was pressed or released.\n *  @param[in] action @ref GLFW_PRESS or @ref GLFW_RELEASE.\n *  @param[in] mods The modifiers pressed when the event was generated.\n *  @ingroup event\n */\nvoid _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods);\n\n/*! @brief Notifies shared code of a cursor motion event.\n *  @param[in] window The window that received the event.\n *  @param[in] xpos The new x-coordinate of the cursor, relative to the left\n *  edge of the client area of the window.\n *  @param[in] ypos The new y-coordinate of the cursor, relative to the top edge\n *  of the client area of the window.\n *  @ingroup event\n */\nvoid _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos);\n\n/*! @brief Notifies shared code of a cursor enter/leave event.\n *  @param[in] window The window that received the event.\n *  @param[in] entered `GLFW_TRUE` if the cursor entered the client area of the\n *  window, or `GLFW_FALSE` if it left it.\n *  @ingroup event\n */\nvoid _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered);\n\n/*! @brief Notifies shared code of a monitor connection or disconnection.\n *  @param[in] monitor The monitor that was connected or disconnected.\n *  @param[in] action One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.\n *  @param[in] placement `_GLFW_INSERT_FIRST` or `_GLFW_INSERT_LAST`.\n *  @ingroup event\n */\nvoid _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement);\n\n/*! @brief Notifies shared code that a full screen window has acquired or\n *  released a monitor.\n *  @param[in] monitor The monitor that was acquired or released.\n *  @param[in] window The window that acquired the monitor, or `NULL`.\n *  @ingroup event\n */\nvoid _glfwInputMonitorWindow(_GLFWmonitor* monitor, _GLFWwindow* window);\n\n/*! @brief Notifies shared code of an error.\n *  @param[in] code The error code most suitable for the error.\n *  @param[in] format The `printf` style format string of the error\n *  description.\n *  @ingroup event\n */\n#if defined(__GNUC__)\nvoid _glfwInputError(int code, const char* format, ...) __attribute__((format(printf, 2, 3)));\n#else\nvoid _glfwInputError(int code, const char* format, ...);\n#endif\n\n/*! @brief Notifies shared code of files or directories dropped on a window.\n *  @param[in] window The window that received the event.\n *  @param[in] count The number of dropped objects.\n *  @param[in] names The names of the dropped objects.\n *  @ingroup event\n */\nvoid _glfwInputDrop(_GLFWwindow* window, int count, const char** names);\n\n/*! @brief Notifies shared code of a joystick connection or disconnection.\n *  @param[in] js The joystick that was connected or disconnected.\n *  @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.\n *  @ingroup event\n */\nvoid _glfwInputJoystick(_GLFWjoystick* js, int event);\n\n/*! @brief Notifies shared code of the new value of a joystick axis.\n *  @param[in] js The joystick whose axis to update.\n *  @param[in] axis The index of the axis to update.\n *  @param[in] value The new value of the axis.\n */\nvoid _glfwInputJoystickAxis(_GLFWjoystick* js, int axis, float value);\n\n/*! @brief Notifies shared code of the new value of a joystick button.\n *  @param[in] js The joystick whose button to update.\n *  @param[in] button The index of the button to update.\n *  @param[in] value The new value of the button.\n */\nvoid _glfwInputJoystickButton(_GLFWjoystick* js, int button, char value);\n\n/*! @brief Notifies shared code of the new value of a joystick hat.\n *  @param[in] js The joystick whose hat to update.\n *  @param[in] button The index of the hat to update.\n *  @param[in] value The new value of the hat.\n */\nvoid _glfwInputJoystickHat(_GLFWjoystick* js, int hat, char value);\n\n\n//========================================================================\n// Utility functions\n//========================================================================\n\n/*! @brief Chooses the video mode most closely matching the desired one.\n *  @ingroup utility\n */\nconst GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor,\n                                        const GLFWvidmode* desired);\n\n/*! @brief Performs lexical comparison between two @ref GLFWvidmode structures.\n *  @ingroup utility\n */\nint _glfwCompareVideoModes(const GLFWvidmode* first, const GLFWvidmode* second);\n\n/*! @brief Splits a color depth into red, green and blue bit depths.\n *  @ingroup utility\n */\nvoid _glfwSplitBPP(int bpp, int* red, int* green, int* blue);\n\n/*! @brief Searches an extension string for the specified extension.\n *  @param[in] string The extension string to search.\n *  @param[in] extensions The extension to search for.\n *  @return `GLFW_TRUE` if the extension was found, or `GLFW_FALSE` otherwise.\n *  @ingroup utility\n */\nGLFWbool _glfwStringInExtensionString(const char* string, const char* extensions);\n\n/*! @brief Chooses the framebuffer config that best matches the desired one.\n *  @param[in] desired The desired framebuffer config.\n *  @param[in] alternatives The framebuffer configs supported by the system.\n *  @param[in] count The number of entries in the alternatives array.\n *  @return The framebuffer config most closely matching the desired one, or @c\n *  NULL if none fulfilled the hard constraints of the desired values.\n *  @ingroup utility\n */\nconst _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,\n                                         const _GLFWfbconfig* alternatives,\n                                         unsigned int count);\n\n/*! @brief Retrieves the attributes of the current context.\n *  @param[in] ctxconfig The desired context attributes.\n *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if the context is\n *  unusable.\n *  @ingroup utility\n */\nGLFWbool _glfwRefreshContextAttribs(const _GLFWctxconfig* ctxconfig);\n\n/*! @brief Checks whether the desired context attributes are valid.\n *  @param[in] ctxconfig The context attributes to check.\n *  @return `GLFW_TRUE` if the context attributes are valid, or `GLFW_FALSE`\n *  otherwise.\n *  @ingroup utility\n *\n *  This function checks things like whether the specified client API version\n *  exists and whether all relevant options have supported and non-conflicting\n *  values.\n */\nGLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig);\n\n/*! @brief Allocates red, green and blue value arrays of the specified size.\n *  @ingroup utility\n */\nvoid _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size);\n\n/*! @brief Frees the red, green and blue value arrays and clears the struct.\n *  @ingroup utility\n */\nvoid _glfwFreeGammaArrays(GLFWgammaramp* ramp);\n\n/*! @brief Allocates and returns a monitor object with the specified name\n *  and dimensions.\n *  @param[in] name The name of the monitor.\n *  @param[in] widthMM The width, in mm, of the monitor's display area.\n *  @param[in] heightMM The height, in mm, of the monitor's display area.\n *  @return The newly created object.\n *  @ingroup utility\n */\n_GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM);\n\n/*! @brief Frees a monitor object and any data associated with it.\n *  @ingroup utility\n  */\nvoid _glfwFreeMonitor(_GLFWmonitor* monitor);\n\n/*! @brief Returns an available joystick object with arrays and name allocated.\n *  @ingroup utility\n  */\n_GLFWjoystick* _glfwAllocJoystick(const char* name,\n                                  const char* guid,\n                                  int axisCount,\n                                  int buttonCount,\n                                  int hatCount);\n\n/*! @brief Frees arrays and name and flags the joystick object as unused.\n *  @ingroup utility\n  */\nvoid _glfwFreeJoystick(_GLFWjoystick* js);\n\n/*! @ingroup utility\n */\nGLFWbool _glfwInitVulkan(int mode);\n\n/*! @ingroup utility\n */\nvoid _glfwTerminateVulkan(void);\n\n/*! @ingroup utility\n */\nconst char* _glfwGetVulkanResultString(VkResult result);\n\n"
  },
  {
    "path": "external/GLFW/src/linux_joystick.c",
    "content": "//========================================================================\n// GLFW 3.3 Linux - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <sys/inotify.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <dirent.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n// Apply an EV_KEY event to the specified joystick\n//\nstatic void handleKeyEvent(_GLFWjoystick* js, int code, int value)\n{\n    _glfwInputJoystickButton(js,\n                             js->linjs.keyMap[code - BTN_MISC],\n                             value ? GLFW_PRESS : GLFW_RELEASE);\n}\n\n// Apply an EV_ABS event to the specified joystick\n//\nstatic void handleAbsEvent(_GLFWjoystick* js, int code, int value)\n{\n    const int index = js->linjs.absMap[code];\n\n    if (code >= ABS_HAT0X && code <= ABS_HAT3Y)\n    {\n        static const char stateMap[3][3] =\n        {\n            { GLFW_HAT_CENTERED, GLFW_HAT_UP,       GLFW_HAT_DOWN },\n            { GLFW_HAT_LEFT,     GLFW_HAT_LEFT_UP,  GLFW_HAT_LEFT_DOWN },\n            { GLFW_HAT_RIGHT,    GLFW_HAT_RIGHT_UP, GLFW_HAT_RIGHT_DOWN },\n        };\n\n        const int hat = (code - ABS_HAT0X) / 2;\n        const int axis = (code - ABS_HAT0X) % 2;\n        int* state = js->linjs.hats[hat];\n\n        // NOTE: Looking at several input drivers, it seems all hat events use\n        //       -1 for left / up, 0 for centered and 1 for right / down\n        if (value == 0)\n            state[axis] = 0;\n        else if (value < 0)\n            state[axis] = 1;\n        else if (value > 0)\n            state[axis] = 2;\n\n        _glfwInputJoystickHat(js, index, stateMap[state[0]][state[1]]);\n    }\n    else\n    {\n        const struct input_absinfo* info = &js->linjs.absInfo[code];\n        float normalized = value;\n\n        const int range = info->maximum - info->minimum;\n        if (range)\n        {\n            // Normalize to 0.0 -> 1.0\n            normalized = (normalized - info->minimum) / range;\n            // Normalize to -1.0 -> 1.0\n            normalized = normalized * 2.0f - 1.0f;\n        }\n\n        _glfwInputJoystickAxis(js, index, normalized);\n    }\n}\n\n// Poll state of absolute axes\n//\nstatic void pollAbsState(_GLFWjoystick* js)\n{\n    int code;\n\n    for (code = 0;  code < ABS_CNT;  code++)\n    {\n        if (js->linjs.absMap[code] < 0)\n            continue;\n\n        struct input_absinfo* info = &js->linjs.absInfo[code];\n\n        if (ioctl(js->linjs.fd, EVIOCGABS(code), info) < 0)\n            continue;\n\n        handleAbsEvent(js, code, info->value);\n    }\n}\n\n#define isBitSet(bit, arr) (arr[(bit) / 8] & (1 << ((bit) % 8)))\n\n// Attempt to open the specified joystick device\n//\nstatic GLFWbool openJoystickDevice(const char* path)\n{\n    int jid, code;\n    char name[256] = \"\";\n    char guid[33] = \"\";\n    char evBits[(EV_CNT + 7) / 8] = {0};\n    char keyBits[(KEY_CNT + 7) / 8] = {0};\n    char absBits[(ABS_CNT + 7) / 8] = {0};\n    int axisCount = 0, buttonCount = 0, hatCount = 0;\n    struct input_id id;\n    _GLFWjoystickLinux linjs = {0};\n    _GLFWjoystick* js = NULL;\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        if (!_glfw.joysticks[jid].present)\n            continue;\n        if (strcmp(_glfw.joysticks[jid].linjs.path, path) == 0)\n            return GLFW_FALSE;\n    }\n\n    linjs.fd = open(path, O_RDONLY | O_NONBLOCK);\n    if (linjs.fd == -1)\n        return GLFW_FALSE;\n\n    if (ioctl(linjs.fd, EVIOCGBIT(0, sizeof(evBits)), evBits) < 0 ||\n        ioctl(linjs.fd, EVIOCGBIT(EV_KEY, sizeof(keyBits)), keyBits) < 0 ||\n        ioctl(linjs.fd, EVIOCGBIT(EV_ABS, sizeof(absBits)), absBits) < 0 ||\n        ioctl(linjs.fd, EVIOCGID, &id) < 0)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Linux: Failed to query input device: %s\",\n                        strerror(errno));\n        close(linjs.fd);\n        return GLFW_FALSE;\n    }\n\n    // Ensure this device supports the events expected of a joystick\n    if (!isBitSet(EV_KEY, evBits) || !isBitSet(EV_ABS, evBits))\n    {\n        close(linjs.fd);\n        return GLFW_FALSE;\n    }\n\n    if (ioctl(linjs.fd, EVIOCGNAME(sizeof(name)), name) < 0)\n        strncpy(name, \"Unknown\", sizeof(name));\n\n    // Generate a joystick GUID that matches the SDL 2.0.5+ one\n    if (id.vendor && id.product && id.version)\n    {\n        sprintf(guid, \"%02x%02x0000%02x%02x0000%02x%02x0000%02x%02x0000\",\n                id.bustype & 0xff, id.bustype >> 8,\n                id.vendor & 0xff,  id.vendor >> 8,\n                id.product & 0xff, id.product >> 8,\n                id.version & 0xff, id.version >> 8);\n    }\n    else\n    {\n        sprintf(guid, \"%02x%02x0000%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x00\",\n                id.bustype & 0xff, id.bustype >> 8,\n                name[0], name[1], name[2], name[3],\n                name[4], name[5], name[6], name[7],\n                name[8], name[9], name[10]);\n    }\n\n    for (code = BTN_MISC;  code < KEY_CNT;  code++)\n    {\n        if (!isBitSet(code, keyBits))\n            continue;\n\n        linjs.keyMap[code - BTN_MISC] = buttonCount;\n        buttonCount++;\n    }\n\n    for (code = 0;  code < ABS_CNT;  code++)\n    {\n        linjs.absMap[code] = -1;\n        if (!isBitSet(code, absBits))\n            continue;\n\n        if (code >= ABS_HAT0X && code <= ABS_HAT3Y)\n        {\n            linjs.absMap[code] = hatCount;\n            hatCount++;\n            // Skip the Y axis\n            code++;\n        }\n        else\n        {\n            if (ioctl(linjs.fd, EVIOCGABS(code), &linjs.absInfo[code]) < 0)\n                continue;\n\n            linjs.absMap[code] = axisCount;\n            axisCount++;\n        }\n    }\n\n    js = _glfwAllocJoystick(name, guid, axisCount, buttonCount, hatCount);\n    if (!js)\n    {\n        close(linjs.fd);\n        return GLFW_FALSE;\n    }\n\n    strncpy(linjs.path, path, sizeof(linjs.path));\n    memcpy(&js->linjs, &linjs, sizeof(linjs));\n\n    pollAbsState(js);\n\n    _glfwInputJoystick(js, GLFW_CONNECTED);\n    return GLFW_TRUE;\n}\n\n#undef isBitSet\n\n// Frees all resources associated with the specified joystick\n//\nstatic void closeJoystick(_GLFWjoystick* js)\n{\n    close(js->linjs.fd);\n    _glfwFreeJoystick(js);\n    _glfwInputJoystick(js, GLFW_DISCONNECTED);\n}\n\n// Lexically compare joysticks by name; used by qsort\n//\nstatic int compareJoysticks(const void* fp, const void* sp)\n{\n    const _GLFWjoystick* fj = fp;\n    const _GLFWjoystick* sj = sp;\n    return strcmp(fj->linjs.path, sj->linjs.path);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialize joystick interface\n//\nGLFWbool _glfwInitJoysticksLinux(void)\n{\n    DIR* dir;\n    int count = 0;\n    const char* dirname = \"/dev/input\";\n\n    _glfw.linjs.inotify = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);\n    if (_glfw.linjs.inotify > 0)\n    {\n        // HACK: Register for IN_ATTRIB to get notified when udev is done\n        //       This works well in practice but the true way is libudev\n\n        _glfw.linjs.watch = inotify_add_watch(_glfw.linjs.inotify,\n                                              dirname,\n                                              IN_CREATE | IN_ATTRIB | IN_DELETE);\n    }\n\n    // Continue without device connection notifications if inotify fails\n\n    if (regcomp(&_glfw.linjs.regex, \"^event[0-9]\\\\+$\", 0) != 0)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR, \"Linux: Failed to compile regex\");\n        return GLFW_FALSE;\n    }\n\n    dir = opendir(dirname);\n    if (dir)\n    {\n        struct dirent* entry;\n\n        while ((entry = readdir(dir)))\n        {\n            regmatch_t match;\n\n            if (regexec(&_glfw.linjs.regex, entry->d_name, 1, &match, 0) != 0)\n                continue;\n\n            char path[PATH_MAX];\n\n            snprintf(path, sizeof(path), \"%s/%s\", dirname, entry->d_name);\n\n            if (openJoystickDevice(path))\n                count++;\n        }\n\n        closedir(dir);\n    }\n\n    // Continue with no joysticks if enumeration fails\n\n    qsort(_glfw.joysticks, count, sizeof(_GLFWjoystick), compareJoysticks);\n    return GLFW_TRUE;\n}\n\n// Close all opened joystick handles\n//\nvoid _glfwTerminateJoysticksLinux(void)\n{\n    int jid;\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        _GLFWjoystick* js = _glfw.joysticks + jid;\n        if (js->present)\n            closeJoystick(js);\n    }\n\n    regfree(&_glfw.linjs.regex);\n\n    if (_glfw.linjs.inotify > 0)\n    {\n        if (_glfw.linjs.watch > 0)\n            inotify_rm_watch(_glfw.linjs.inotify, _glfw.linjs.watch);\n\n        close(_glfw.linjs.inotify);\n    }\n}\n\nvoid _glfwDetectJoystickConnectionLinux(void)\n{\n    ssize_t offset = 0;\n    char buffer[16384];\n\n    if (_glfw.linjs.inotify <= 0)\n        return;\n\n    const ssize_t size = read(_glfw.linjs.inotify, buffer, sizeof(buffer));\n\n    while (size > offset)\n    {\n        regmatch_t match;\n        const struct inotify_event* e = (struct inotify_event*) (buffer + offset);\n\n        offset += sizeof(struct inotify_event) + e->len;\n\n        if (regexec(&_glfw.linjs.regex, e->name, 1, &match, 0) != 0)\n            continue;\n\n        char path[PATH_MAX];\n        snprintf(path, sizeof(path), \"/dev/input/%s\", e->name);\n\n        if (e->mask & (IN_CREATE | IN_ATTRIB))\n            openJoystickDevice(path);\n        else if (e->mask & IN_DELETE)\n        {\n            int jid;\n\n            for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n            {\n                if (strcmp(_glfw.joysticks[jid].linjs.path, path) == 0)\n                {\n                    closeJoystick(_glfw.joysticks + jid);\n                    break;\n                }\n            }\n        }\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)\n{\n    // Read all queued events (non-blocking)\n    for (;;)\n    {\n        struct input_event e;\n\n        errno = 0;\n        if (read(js->linjs.fd, &e, sizeof(e)) < 0)\n        {\n            // Reset the joystick slot if the device was disconnected\n            if (errno == ENODEV)\n                closeJoystick(js);\n\n            break;\n        }\n\n        if (e.type == EV_SYN)\n        {\n            if (e.code == SYN_DROPPED)\n                _glfw.linjs.dropped = GLFW_TRUE;\n            else if (e.code == SYN_REPORT)\n            {\n                _glfw.linjs.dropped = GLFW_FALSE;\n                pollAbsState(js);\n            }\n        }\n\n        if (_glfw.linjs.dropped)\n            continue;\n\n        if (e.type == EV_KEY)\n            handleKeyEvent(js, e.code, e.value);\n        else if (e.type == EV_ABS)\n            handleAbsEvent(js, e.code, e.value);\n    }\n\n    return js->present;\n}\n\nvoid _glfwPlatformUpdateGamepadGUID(char* guid)\n{\n}\n\n"
  },
  {
    "path": "external/GLFW/src/linux_joystick.h",
    "content": "//========================================================================\n// GLFW 3.3 Linux - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <linux/input.h>\n#include <linux/limits.h>\n#include <regex.h>\n\n#define _GLFW_PLATFORM_JOYSTICK_STATE         _GLFWjoystickLinux linjs\n#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE _GLFWlibraryLinux  linjs\n\n#define _GLFW_PLATFORM_MAPPING_NAME \"Linux\"\n\n// Linux-specific joystick data\n//\ntypedef struct _GLFWjoystickLinux\n{\n    int                     fd;\n    char                    path[PATH_MAX];\n    int                     keyMap[KEY_CNT - BTN_MISC];\n    int                     absMap[ABS_CNT];\n    struct input_absinfo    absInfo[ABS_CNT];\n    int                     hats[4][2];\n} _GLFWjoystickLinux;\n\n// Linux-specific joystick API data\n//\ntypedef struct _GLFWlibraryLinux\n{\n    int                     inotify;\n    int                     watch;\n    regex_t                 regex;\n    GLFWbool                dropped;\n} _GLFWlibraryLinux;\n\n\nGLFWbool _glfwInitJoysticksLinux(void);\nvoid _glfwTerminateJoysticksLinux(void);\nvoid _glfwDetectJoystickConnectionLinux(void);\n\n"
  },
  {
    "path": "external/GLFW/src/mappings.h",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n// As mappings.h.in, this file is used by CMake to produce the mappings.h\n// header file.  If you are adding a GLFW specific gamepad mapping, this is\n// where to put it.\n//========================================================================\n// As mappings.h, this provides all pre-defined gamepad mappings, including\n// all available in SDL_GameControllerDB.  Do not edit this file.  Any gamepad\n// mappings not specific to GLFW should be submitted to SDL_GameControllerDB.\n// This file can be re-generated from mappings.h.in and the upstream\n// gamecontrollerdb.txt with the GenerateMappings.cmake script.\n//========================================================================\n\n// All gamepad mappings not labeled GLFW are copied from the\n// SDL_GameControllerDB project under the following license:\n//\n// Simple DirectMedia Layer\n// Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the\n// use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required. \n//\n// 2. Altered source versions must be plainly marked as such, and must not be\n//    misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst char* _glfwDefaultMappings =\n\"8f0e1200000000000000504944564944,Acme,platform:Windows,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,\\n\"\n\"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\\n\"\n\"ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\\n\"\n\"6d0416c2000000000000504944564944,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\\n\"\n\"0d0f6e00000000000000504944564944,HORIPAD 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"6d0419c2000000000000504944564944,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\\n\"\n\"88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,\\n\"\n\"4c056802000000000000504944564944,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows,\\n\"\n\"25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows,\\n\"\n\"4c05c405000000000000504944564944,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows,\\n\"\n\"4c05cc09000000000000504944564944,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows,\\n\"\n\"4c05a00b000000000000504944564944,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows,\\n\"\n\"6d0418c2000000000000504944564944,Logitech RumblePad 2 USB,platform:Windows,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"36280100000000000000504944564944,OUYA Controller,platform:Windows,a:b0,b:b3,y:b2,x:b1,start:b14,guide:b15,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b8,dpleft:b10,dpdown:b9,dpright:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b12,righttrigger:b13,\\n\"\n\"4f0400b3000000000000504944564944,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Windows,\\n\"\n\"00f00300000000000000504944564944,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows,\\n\"\n\"00f0f100000000000000504944564944,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows,\\n\"\n\"28040140000000000000504944564944,GamePad Pro USB,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7,\\n\"\n\"ff113133000000000000504944564944,SVEN X-PAD,platform:Windows,a:b2,b:b3,y:b1,x:b0,start:b5,back:b4,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b8,righttrigger:b9,\\n\"\n\"8f0e0300000000000000504944564944,Piranha xtreme,platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,\\n\"\n\"8f0e0d31000000000000504944564944,Multilaser JS071 USB,platform:Windows,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,\\n\"\n\"10080300000000000000504944564944,PS2 USB,platform:Windows,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a4,righty:a2,lefttrigger:b4,righttrigger:b5,\\n\"\n\"79000600000000000000504944564944,G-Shark GS-GP702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"4b12014d000000000000504944564944,NYKO AIRFLO,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftstick:a0,rightstick:a2,leftshoulder:a3,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:h0.6,lefty:h0.12,rightx:h0.9,righty:h0.4,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"d6206dca000000000000504944564944,PowerA Pro Ex,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,y:b1,x:b0,start:b4,guide:b10,back:b5,leftstick:b8,rightstick:b9,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows,\\n\"\n\"4f0415b3000000000000504944564944,Thrustmaster Dual Analog 3.2,platform:Windows,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"6f0e1e01000000000000504944564944,Rock Candy Gamepad for PS3,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,\\n\"\n\"83056020000000000000504944564944,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,y:b2,x:b3,start:b7,back:b6,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Windows,\\n\"\n\"10080100000000000000504944564944,PS1 USB,platform:Windows,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,\\n\"\n\"49190204000000000000504944564944,Ipega PG-9023,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows,\\n\"\n\"4f0423b3000000000000504944564944,Dual Trigger 3-in-1,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"0d0f4900000000000000504944564944,Hatsune Miku Sho Controller,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"79004318000000000000504944564944,Mayflash GameCube Controller Adapter,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b0,start:b9,guide:b0,leftshoulder:b4,rightshoulder:b7,leftstick:b0,rightstick:b0,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,\\n\"\n\"79000018000000000000504944564944,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"2509e803000000000000504944564944,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"300f1001000000000000504944564944,Saitek P480 Rumble Pad,a:b2,b:b3,x:b0,y:b1,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b5,righttrigger:b7,platform:Windows,\\n\"\n\"10280900000000000000504944564944,8Bitdo SFC30 GamePad,a:b1,b:b0,y:b3,x:b4,start:b11,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,platform:Windows,\\n\"\n\"63252305000000000000504944564944,USB Vibration Joystick (BM),platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"20380900000000000000504944564944,8Bitdo NES30 PRO Wireless,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"02200090000000000000504944564944,8Bitdo NES30 PRO USB,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"ff113133000000000000504944564944,Gembird JPD-DualForce,platform:Windows,a:b2,b:b3,x:b0,y:b1,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,leftstick:b10,rightstick:b11,\\n\"\n\"341a0108000000000000504944564944,EXEQ RF USB Gamepad 8206,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,leftstick:b8,rightstick:b7,back:b8,start:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows,\\n\"\n\"c0111352000000000000504944564944,Battalife Joystick,platform:Windows,x:b4,a:b6,b:b7,y:b5,back:b2,start:b3,leftshoulder:b0,rightshoulder:b1,leftx:a0,lefty:a1,\\n\"\n\"100801e5000000000000504944564944,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Windows,\\n\"\n\"79000600000000000000504944564944,NGS Phantom,a:b2,b:b3,y:b1,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Windows,\\n\"\n\"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\\n\"\n\"6d0400000000000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\\n\"\n\"6d0400000000000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\\n\"\n\"6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\\n\"\n\"6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\\n\"\n\"4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,\\n\"\n\"4c05000000000000c405000000000000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Mac OS X,\\n\"\n\"4c05000000000000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Mac OS X,\\n\"\n\"5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\\n\"\n\"891600000000000000fd000000000000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b8,guide:b10,back:b9,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b11,dpleft:b13,dpdown:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Mac OS X,\\n\"\n\"4f0400000000000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Mac OS X,\\n\"\n\"8f0e0000000000000300000000000000,Piranha xtreme,platform:Mac OS X,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,\\n\"\n\"0d0f0000000000004d00000000000000,HORI Gem Pad 3,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,\\n\"\n\"79000000000000000600000000000000,G-Shark GP-702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,\\n\"\n\"4f0400000000000015b3000000000000,Thrustmaster Dual Analog 3.2,platform:Mac OS X,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\\n\"\n\"050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,y:b9,x:b10,start:b6,guide:b8,back:b7,dpup:b2,dpleft:b0,dpdown:b3,dpright:b1,leftx:a0,lefty:a1,lefttrigger:b12,righttrigger:,leftshoulder:b11,platform:Mac OS X,\\n\"\n\"83050000000000006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X,\\n\"\n\"bd1200000000000015d0000000000000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X,\\n\"\n\"79000000000000001100000000000000,Retrolink Classic Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a3,lefty:a4,platform:Mac OS X,\\n\"\n\"5e04000000000000dd02000000000000,Xbox One Wired Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"5e04000000000000ea02000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"5e04000000000000e002000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b10,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,x:b18,y:b17,back:b7,guide:b8,start:b6,leftstick:b23,rightstick:b24,leftshoulder:b19,rightshoulder:b20,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b21,righttrigger:b22,platform:Mac OS X,\\n\"\n\"79000000000000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,x:b0,y:b12,back:b32,start:b36,leftstick:b40,rightstick:b44,leftshoulder:b16,rightshoulder:b20,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a8,righty:a12,lefttrigger:b24,righttrigger:b28,platform:Mac OS X,\\n\"\n\"2509000000000000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,\\n\"\n\"351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,\\n\"\n\"b4040000000000000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,x:b3,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,\\n\"\n\"81170000000000007e05000000000000,Sega Saturn,x:b0,a:b2,b:b4,y:b6,start:b13,dpleft:b15,dpdown:b16,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,lefttrigger:b10,rightshoulder:b9,righttrigger:a4,righttrigger:b11,leftx:a0,lefty:a2,platform:Mac OS X,\\n\"\n\"10280000000000000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,\\n\"\n\"d814000000000000cecf000000000000,MC Cthulhu,platform:Mac OS X,leftx:,lefty:,rightx:,righty:,lefttrigger:b6,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,righttrigger:b7,\\n\"\n\"0d0f0000000000006600000000000000,HORIPAD FPS PLUS 4,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:a4,\\n\"\n\"0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\\n\"\n\"03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\\n\"\n\"030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\\n\"\n\"030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\\n\"\n\"030000006d04000016c2000011010000,Logitech F310 Gamepad (DInput),x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Linux,\\n\"\n\"030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\\n\"\n\"030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\\n\"\n\"030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\\n\"\n\"030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\\n\"\n\"030000004c050000c405000011010000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,\\n\"\n\"050000004c050000c405000000010000,Sony DualShock 4 BT,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\\n\"\n\"030000004c050000cc09000011010000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,\\n\"\n\"050000004c050000cc09000000010000,Sony DualShock 4 V2 BT,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,\\n\"\n\"030000004c050000a00b000011010000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,\\n\"\n\"030000006f0e00003001000001010000,EA Sports PS3 Controller,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,\\n\"\n\"03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\\n\"\n\"030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\\n\"\n\"030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\\n\"\n\"030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\\n\"\n\"03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,y:b0,x:b3,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux,\\n\"\n\"03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Linux,\\n\"\n\"030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,y:b3,x:b1,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux,\\n\"\n\"030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a5,\\n\"\n\"030000008f0e00000300000010010000,GreenAsia Inc.    USB Joystick     ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,\\n\"\n\"030000008f0e00001200000010010000,GreenAsia Inc.      USB  Joystick  ,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,\\n\"\n\"030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,\\n\"\n\"030000006d04000016c2000010010000,Logitech Logitech Dual Action,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"03000000260900008888000000010000,GameCube {WiseGroup USB box},a:b0,b:b2,y:b3,x:b1,start:b7,leftshoulder:,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,rightstick:,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:Linux,\\n\"\n\"030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,y:b4,x:b3,start:b8,guide:b5,back:b2,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b9,righttrigger:b10,platform:Linux,\\n\"\n\"030000006d04000018c2000010010000,Logitech Logitech RumblePad 2 USB,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"05000000d6200000ad0d000001000000,Moga Pro,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,\\n\"\n\"030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,\\n\"\n\"030000004f04000008d0000000010000,Thrustmaster Run N Drive  Wireless,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,\\n\"\n\"0300000000f000000300000000010000,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux,\\n\"\n\"0300000000f00000f100000000010000,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux,\\n\"\n\"030000006f0e00001f01000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"03000000280400000140000000010000,Gravis GamePad Pro USB ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftx:a0,lefty:a1,\\n\"\n\"030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"030000005e0400008502000000010000,Microsoft X-Box pad (Japan),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,\\n\"\n\"03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,platform:Linux,a:b2,b:b1,y:b0,x:b3,start:b8,back:b9,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,\\n\"\n\"030000008916000000fd000024010000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,\\n\"\n\"030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux,\\n\"\n\"03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,\\n\"\n\"060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,\\n\"\n\"050000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,\\n\"\n\"03000000790000000600000010010000,DragonRise Inc.   Generic   USB  Joystick  ,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a3,rightx:a1,righty:a4,\\n\"\n\"03000000666600000488000000010000,Super Joy Box 5 Pro,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b9,start:b8,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,dpup:b12,dpleft:b15,dpdown:b14,dpright:b13,\\n\"\n\"05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,\\n\"\n\"05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,\\n\"\n\"030000008916000001fd000024010000,Razer Onza Classic Edition,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:b11,dpdown:b14,dpright:b12,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"030000005e040000d102000001010000,Microsoft X-Box One pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"030000005e040000dd02000003020000,Microsoft X-Box One pad v2,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux,\\n\"\n\"03000000790000001100000010010000,RetroLink Saturn Classic Controller,platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,\\n\"\n\"050000007e0500003003000001000000,Nintendo Wii U Pro Controller,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b8,start:b9,guide:b10,leftshoulder:b4,rightshoulder:b5,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,\\n\"\n\"030000005e0400008e02000004010000,Microsoft X-Box 360 pad,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,\\n\"\n\"030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,\\n\"\n\"030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7\\n\"\n\"03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b7,back:b6,guide:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,lefttrigger:a5,righttrigger:a4,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux,\\n\"\n\"030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"030000006f0e00001304000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:a0,rightstick:a3,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux,\\n\"\n\"03000000bd12000015d0000010010000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux,\\n\"\n\"03000000790000001100000010010000,Retrolink Classic Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux,\\n\"\n\"03000000c9110000f055000011010000,HJC Game GAMEPAD,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b2,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b0,dpright:h0.2,righttrigger:b7,b:b1,platform:Linux,\\n\"\n\"03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux,\\n\"\n\"03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,y:b3,x:b0,start:b9,guide:,back:,leftstick:,rightstick:,leftshoulder:,dpleft:b15,dpdown:b14,dpright:b13,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,rightshoulder:b7,dpup:b12,platform:Linux,\\n\"\n\"030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,platform:Linux,x:b0,a:b2,b:b3,y:b1,back:b10,guide:b12,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,platform:Linux,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,guide:b8,leftstick:b9,rightstick:b10,lefttrigger:a2,righttrigger:a5,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"030000006f0e00003901000020060000,Afterglow Wired Controller for Xbox One,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux,\\n\"\n\"030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,platform:Linux,a:b0,b:b2,x:b1,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,\\n\"\n\"05000000102800000900000000010000,8Bitdo SFC30 GamePad,platform:Linux,x:b4,a:b1,b:b0,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,\\n\"\n\"03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftshoulder:b4,rightshoulder:b5,lefttrigger:b6,righttrigger:b7,leftx:a0,lefty:a1,\\n\"\n\"030000000d0f00000d00000000010000,hori,platform:Linux,a:b0,b:b6,y:b2,x:b1,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,start:b9,guide:b10,back:b8,leftshoulder:b3,rightshoulder:b7,leftx:b4,lefty:b5,\\n\"\n\"03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,\\n\"\n\"03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,platform:Linux,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7,\\n\"\n\"03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),platform:Linux,a:b3,b:b4,y:b1,x:b0,start:b7,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,\\n\"\n\"05000000010000000100000003000000,Nintendo Wiimote,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b9,guide:b10,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,\\n\"\n\"030000005e0400008e02000062230000,Microsoft X-Box 360 pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,y:b1,x:b0,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b6,righttrigger:b7,platform:Linux,\\n\"\n\"030000006f0e00000103000000020000,Logic3 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"05000000380700006652000025010000,Mad Catz C.T.R.L.R ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,\\n\"\n\"030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,\\n\"\n\"03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:a2,righttrigger:a5,\\n\"\n\"05000000a00500003232000001000000,8Bitdo Zero GamePad,platform:Linux,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,\\n\"\n\"030000001008000001e5000010010000,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Linux,\\n\"\n\"03000000100800000300000010010000,USB Gamepad,platform:Linux,a:b2,b:b1,x:b3,y:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,\\n\"\n\"05000000ac0500003232000001000000,VR-BOX,platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,\\n\"\n\"03000000780000000600000010010000,Microntek USB Joystick,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftx:a0,lefty:a1,\\n\"\n\n\"78696e70757401000000000000000000,XInput Gamepad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757402000000000000000000,XInput Wheel (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757403000000000000000000,XInput Arcade Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757404000000000000000000,XInput Flight Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757405000000000000000000,XInput Dance Pad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757406000000000000000000,XInput Guitar (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757408000000000000000000,XInput Drum Kit (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\";\n\n"
  },
  {
    "path": "external/GLFW/src/mappings.h.in",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n// As mappings.h.in, this file is used by CMake to produce the mappings.h\n// header file.  If you are adding a GLFW specific gamepad mapping, this is\n// where to put it.\n//========================================================================\n// As mappings.h, this provides all pre-defined gamepad mappings, including\n// all available in SDL_GameControllerDB.  Do not edit this file.  Any gamepad\n// mappings not specific to GLFW should be submitted to SDL_GameControllerDB.\n// This file can be re-generated from mappings.h.in and the upstream\n// gamecontrollerdb.txt with the GenerateMappings.cmake script.\n//========================================================================\n\n// All gamepad mappings not labeled GLFW are copied from the\n// SDL_GameControllerDB project under the following license:\n//\n// Simple DirectMedia Layer\n// Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from the\n// use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required. \n//\n// 2. Altered source versions must be plainly marked as such, and must not be\n//    misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source distribution.\n\nconst char* _glfwDefaultMappings =\n@GLFW_GAMEPAD_MAPPINGS@\n\"78696e70757401000000000000000000,XInput Gamepad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757402000000000000000000,XInput Wheel (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757403000000000000000000,XInput Arcade Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757404000000000000000000,XInput Flight Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757405000000000000000000,XInput Dance Pad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757406000000000000000000,XInput Guitar (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\"\n\"78696e70757408000000000000000000,XInput Drum Kit (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,\\n\";\n\n"
  },
  {
    "path": "external/GLFW/src/mir_init.c",
    "content": "//========================================================================\n// GLFW 3.3 Mir - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014-2017 Brandon Schaefer <brandon.schaefer@canonical.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <linux/input.h>\n#include <stdlib.h>\n#include <string.h>\n\n\n// Create key code translation tables\n//\nstatic void createKeyTables(void)\n{\n    int scancode;\n\n    memset(_glfw.mir.keycodes, -1, sizeof(_glfw.mir.keycodes));\n    memset(_glfw.mir.scancodes, -1, sizeof(_glfw.mir.scancodes));\n\n    _glfw.mir.keycodes[KEY_GRAVE]      = GLFW_KEY_GRAVE_ACCENT;\n    _glfw.mir.keycodes[KEY_1]          = GLFW_KEY_1;\n    _glfw.mir.keycodes[KEY_2]          = GLFW_KEY_2;\n    _glfw.mir.keycodes[KEY_3]          = GLFW_KEY_3;\n    _glfw.mir.keycodes[KEY_4]          = GLFW_KEY_4;\n    _glfw.mir.keycodes[KEY_5]          = GLFW_KEY_5;\n    _glfw.mir.keycodes[KEY_6]          = GLFW_KEY_6;\n    _glfw.mir.keycodes[KEY_7]          = GLFW_KEY_7;\n    _glfw.mir.keycodes[KEY_8]          = GLFW_KEY_8;\n    _glfw.mir.keycodes[KEY_9]          = GLFW_KEY_9;\n    _glfw.mir.keycodes[KEY_0]          = GLFW_KEY_0;\n    _glfw.mir.keycodes[KEY_SPACE]      = GLFW_KEY_SPACE;\n    _glfw.mir.keycodes[KEY_MINUS]      = GLFW_KEY_MINUS;\n    _glfw.mir.keycodes[KEY_EQUAL]      = GLFW_KEY_EQUAL;\n    _glfw.mir.keycodes[KEY_Q]          = GLFW_KEY_Q;\n    _glfw.mir.keycodes[KEY_W]          = GLFW_KEY_W;\n    _glfw.mir.keycodes[KEY_E]          = GLFW_KEY_E;\n    _glfw.mir.keycodes[KEY_R]          = GLFW_KEY_R;\n    _glfw.mir.keycodes[KEY_T]          = GLFW_KEY_T;\n    _glfw.mir.keycodes[KEY_Y]          = GLFW_KEY_Y;\n    _glfw.mir.keycodes[KEY_U]          = GLFW_KEY_U;\n    _glfw.mir.keycodes[KEY_I]          = GLFW_KEY_I;\n    _glfw.mir.keycodes[KEY_O]          = GLFW_KEY_O;\n    _glfw.mir.keycodes[KEY_P]          = GLFW_KEY_P;\n    _glfw.mir.keycodes[KEY_LEFTBRACE]  = GLFW_KEY_LEFT_BRACKET;\n    _glfw.mir.keycodes[KEY_RIGHTBRACE] = GLFW_KEY_RIGHT_BRACKET;\n    _glfw.mir.keycodes[KEY_A]          = GLFW_KEY_A;\n    _glfw.mir.keycodes[KEY_S]          = GLFW_KEY_S;\n    _glfw.mir.keycodes[KEY_D]          = GLFW_KEY_D;\n    _glfw.mir.keycodes[KEY_F]          = GLFW_KEY_F;\n    _glfw.mir.keycodes[KEY_G]          = GLFW_KEY_G;\n    _glfw.mir.keycodes[KEY_H]          = GLFW_KEY_H;\n    _glfw.mir.keycodes[KEY_J]          = GLFW_KEY_J;\n    _glfw.mir.keycodes[KEY_K]          = GLFW_KEY_K;\n    _glfw.mir.keycodes[KEY_L]          = GLFW_KEY_L;\n    _glfw.mir.keycodes[KEY_SEMICOLON]  = GLFW_KEY_SEMICOLON;\n    _glfw.mir.keycodes[KEY_APOSTROPHE] = GLFW_KEY_APOSTROPHE;\n    _glfw.mir.keycodes[KEY_Z]          = GLFW_KEY_Z;\n    _glfw.mir.keycodes[KEY_X]          = GLFW_KEY_X;\n    _glfw.mir.keycodes[KEY_C]          = GLFW_KEY_C;\n    _glfw.mir.keycodes[KEY_V]          = GLFW_KEY_V;\n    _glfw.mir.keycodes[KEY_B]          = GLFW_KEY_B;\n    _glfw.mir.keycodes[KEY_N]          = GLFW_KEY_N;\n    _glfw.mir.keycodes[KEY_M]          = GLFW_KEY_M;\n    _glfw.mir.keycodes[KEY_COMMA]      = GLFW_KEY_COMMA;\n    _glfw.mir.keycodes[KEY_DOT]        = GLFW_KEY_PERIOD;\n    _glfw.mir.keycodes[KEY_SLASH]      = GLFW_KEY_SLASH;\n    _glfw.mir.keycodes[KEY_BACKSLASH]  = GLFW_KEY_BACKSLASH;\n    _glfw.mir.keycodes[KEY_ESC]        = GLFW_KEY_ESCAPE;\n    _glfw.mir.keycodes[KEY_TAB]        = GLFW_KEY_TAB;\n    _glfw.mir.keycodes[KEY_LEFTSHIFT]  = GLFW_KEY_LEFT_SHIFT;\n    _glfw.mir.keycodes[KEY_RIGHTSHIFT] = GLFW_KEY_RIGHT_SHIFT;\n    _glfw.mir.keycodes[KEY_LEFTCTRL]   = GLFW_KEY_LEFT_CONTROL;\n    _glfw.mir.keycodes[KEY_RIGHTCTRL]  = GLFW_KEY_RIGHT_CONTROL;\n    _glfw.mir.keycodes[KEY_LEFTALT]    = GLFW_KEY_LEFT_ALT;\n    _glfw.mir.keycodes[KEY_RIGHTALT]   = GLFW_KEY_RIGHT_ALT;\n    _glfw.mir.keycodes[KEY_LEFTMETA]   = GLFW_KEY_LEFT_SUPER;\n    _glfw.mir.keycodes[KEY_RIGHTMETA]  = GLFW_KEY_RIGHT_SUPER;\n    _glfw.mir.keycodes[KEY_MENU]       = GLFW_KEY_MENU;\n    _glfw.mir.keycodes[KEY_NUMLOCK]    = GLFW_KEY_NUM_LOCK;\n    _glfw.mir.keycodes[KEY_CAPSLOCK]   = GLFW_KEY_CAPS_LOCK;\n    _glfw.mir.keycodes[KEY_PRINT]      = GLFW_KEY_PRINT_SCREEN;\n    _glfw.mir.keycodes[KEY_SCROLLLOCK] = GLFW_KEY_SCROLL_LOCK;\n    _glfw.mir.keycodes[KEY_PAUSE]      = GLFW_KEY_PAUSE;\n    _glfw.mir.keycodes[KEY_DELETE]     = GLFW_KEY_DELETE;\n    _glfw.mir.keycodes[KEY_BACKSPACE]  = GLFW_KEY_BACKSPACE;\n    _glfw.mir.keycodes[KEY_ENTER]      = GLFW_KEY_ENTER;\n    _glfw.mir.keycodes[KEY_HOME]       = GLFW_KEY_HOME;\n    _glfw.mir.keycodes[KEY_END]        = GLFW_KEY_END;\n    _glfw.mir.keycodes[KEY_PAGEUP]     = GLFW_KEY_PAGE_UP;\n    _glfw.mir.keycodes[KEY_PAGEDOWN]   = GLFW_KEY_PAGE_DOWN;\n    _glfw.mir.keycodes[KEY_INSERT]     = GLFW_KEY_INSERT;\n    _glfw.mir.keycodes[KEY_LEFT]       = GLFW_KEY_LEFT;\n    _glfw.mir.keycodes[KEY_RIGHT]      = GLFW_KEY_RIGHT;\n    _glfw.mir.keycodes[KEY_DOWN]       = GLFW_KEY_DOWN;\n    _glfw.mir.keycodes[KEY_UP]         = GLFW_KEY_UP;\n    _glfw.mir.keycodes[KEY_F1]         = GLFW_KEY_F1;\n    _glfw.mir.keycodes[KEY_F2]         = GLFW_KEY_F2;\n    _glfw.mir.keycodes[KEY_F3]         = GLFW_KEY_F3;\n    _glfw.mir.keycodes[KEY_F4]         = GLFW_KEY_F4;\n    _glfw.mir.keycodes[KEY_F5]         = GLFW_KEY_F5;\n    _glfw.mir.keycodes[KEY_F6]         = GLFW_KEY_F6;\n    _glfw.mir.keycodes[KEY_F7]         = GLFW_KEY_F7;\n    _glfw.mir.keycodes[KEY_F8]         = GLFW_KEY_F8;\n    _glfw.mir.keycodes[KEY_F9]         = GLFW_KEY_F9;\n    _glfw.mir.keycodes[KEY_F10]        = GLFW_KEY_F10;\n    _glfw.mir.keycodes[KEY_F11]        = GLFW_KEY_F11;\n    _glfw.mir.keycodes[KEY_F12]        = GLFW_KEY_F12;\n    _glfw.mir.keycodes[KEY_F13]        = GLFW_KEY_F13;\n    _glfw.mir.keycodes[KEY_F14]        = GLFW_KEY_F14;\n    _glfw.mir.keycodes[KEY_F15]        = GLFW_KEY_F15;\n    _glfw.mir.keycodes[KEY_F16]        = GLFW_KEY_F16;\n    _glfw.mir.keycodes[KEY_F17]        = GLFW_KEY_F17;\n    _glfw.mir.keycodes[KEY_F18]        = GLFW_KEY_F18;\n    _glfw.mir.keycodes[KEY_F19]        = GLFW_KEY_F19;\n    _glfw.mir.keycodes[KEY_F20]        = GLFW_KEY_F20;\n    _glfw.mir.keycodes[KEY_F21]        = GLFW_KEY_F21;\n    _glfw.mir.keycodes[KEY_F22]        = GLFW_KEY_F22;\n    _glfw.mir.keycodes[KEY_F23]        = GLFW_KEY_F23;\n    _glfw.mir.keycodes[KEY_F24]        = GLFW_KEY_F24;\n    _glfw.mir.keycodes[KEY_KPSLASH]    = GLFW_KEY_KP_DIVIDE;\n    _glfw.mir.keycodes[KEY_KPDOT]      = GLFW_KEY_KP_MULTIPLY;\n    _glfw.mir.keycodes[KEY_KPMINUS]    = GLFW_KEY_KP_SUBTRACT;\n    _glfw.mir.keycodes[KEY_KPPLUS]     = GLFW_KEY_KP_ADD;\n    _glfw.mir.keycodes[KEY_KP0]        = GLFW_KEY_KP_0;\n    _glfw.mir.keycodes[KEY_KP1]        = GLFW_KEY_KP_1;\n    _glfw.mir.keycodes[KEY_KP2]        = GLFW_KEY_KP_2;\n    _glfw.mir.keycodes[KEY_KP3]        = GLFW_KEY_KP_3;\n    _glfw.mir.keycodes[KEY_KP4]        = GLFW_KEY_KP_4;\n    _glfw.mir.keycodes[KEY_KP5]        = GLFW_KEY_KP_5;\n    _glfw.mir.keycodes[KEY_KP6]        = GLFW_KEY_KP_6;\n    _glfw.mir.keycodes[KEY_KP7]        = GLFW_KEY_KP_7;\n    _glfw.mir.keycodes[KEY_KP8]        = GLFW_KEY_KP_8;\n    _glfw.mir.keycodes[KEY_KP9]        = GLFW_KEY_KP_9;\n    _glfw.mir.keycodes[KEY_KPCOMMA]    = GLFW_KEY_KP_DECIMAL;\n    _glfw.mir.keycodes[KEY_KPEQUAL]    = GLFW_KEY_KP_EQUAL;\n    _glfw.mir.keycodes[KEY_KPENTER]    = GLFW_KEY_KP_ENTER;\n\n    for (scancode = 0;  scancode < 256;  scancode++)\n    {\n        if (_glfw.mir.keycodes[scancode] > 0)\n            _glfw.mir.scancodes[_glfw.mir.keycodes[scancode]] = scancode;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformInit(void)\n{\n    int error;\n\n    _glfw.mir.connection = mir_connect_sync(NULL, __PRETTY_FUNCTION__);\n\n    if (!mir_connection_is_valid(_glfw.mir.connection))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Mir: Unable to connect to server: %s\",\n                        mir_connection_get_error_message(_glfw.mir.connection));\n\n        return GLFW_FALSE;\n    }\n\n    _glfw.mir.display =\n        mir_connection_get_egl_native_display(_glfw.mir.connection);\n\n    createKeyTables();\n\n    if (!_glfwInitJoysticksLinux())\n        return GLFW_FALSE;\n\n    _glfwInitTimerPOSIX();\n\n    _glfw.mir.eventQueue = calloc(1, sizeof(EventQueue));\n    _glfwInitEventQueueMir(_glfw.mir.eventQueue);\n\n    error = pthread_mutex_init(&_glfw.mir.eventMutex, NULL);\n    if (error)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Mir: Failed to create event mutex: %s\",\n                        strerror(error));\n        return GLFW_FALSE;\n    }\n\n    _glfwPollMonitorsMir();\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformTerminate(void)\n{\n    _glfwTerminateEGL();\n    _glfwTerminateJoysticksLinux();\n\n    _glfwDeleteEventQueueMir(_glfw.mir.eventQueue);\n\n    pthread_mutex_destroy(&_glfw.mir.eventMutex);\n\n    mir_connection_release(_glfw.mir.connection);\n}\n\nconst char* _glfwPlatformGetVersionString(void)\n{\n    return _GLFW_VERSION_NUMBER \" Mir EGL\"\n#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)\n        \" clock_gettime\"\n#else\n        \" gettimeofday\"\n#endif\n        \" evdev\"\n#if defined(_GLFW_BUILD_DLL)\n        \" shared\"\n#endif\n        ;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/mir_monitor.c",
    "content": "//========================================================================\n// GLFW 3.3 Mir - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014-2017 Brandon Schaefer <brandon.schaefer@canonical.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdlib.h>\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Poll for changes in the set of connected monitors\n//\nvoid _glfwPollMonitorsMir(void)\n{\n    int i;\n    MirDisplayConfig* displayConfig =\n        mir_connection_create_display_configuration(_glfw.mir.connection);\n\n    int numOutputs = mir_display_config_get_num_outputs(displayConfig);\n\n    for (i = 0;  i < numOutputs;  i++)\n    {\n        const MirOutput* output        = mir_display_config_get_output(displayConfig, i);\n        MirOutputConnectionState state = mir_output_get_connection_state(output);\n        bool enabled = mir_output_is_enabled(output);\n\n        if (enabled && state == mir_output_connection_state_connected)\n        {\n            int widthMM  = mir_output_get_physical_width_mm(output);\n            int heightMM = mir_output_get_physical_height_mm(output);\n            int x  = mir_output_get_position_x(output);\n            int y  = mir_output_get_position_y(output);\n            int id = mir_output_get_id(output);\n            size_t currentMode = mir_output_get_current_mode_index(output);\n            const char* name   = mir_output_type_name(mir_output_get_type(output));\n\n            _GLFWmonitor* monitor = _glfwAllocMonitor(name,\n                                                      widthMM,\n                                                      heightMM);\n            monitor->mir.x        = x;\n            monitor->mir.y        = y;\n            monitor->mir.outputId = id;\n            monitor->mir.curMode  = currentMode;\n            monitor->modes = _glfwPlatformGetVideoModes(monitor, &monitor->modeCount);\n\n            _glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST);\n        }\n    }\n\n    mir_display_config_release(displayConfig);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)\n{\n    if (xpos)\n        *xpos = monitor->mir.x;\n    if (ypos)\n        *ypos = monitor->mir.y;\n}\n\nstatic void FillInRGBBitsFromPixelFormat(GLFWvidmode* mode, const MirPixelFormat pf)\n{\n    switch (pf)\n    {\n      case mir_pixel_format_rgb_565:\n          mode->redBits   = 5;\n          mode->greenBits = 6;\n          mode->blueBits  = 5;\n          break;\n      case mir_pixel_format_rgba_5551:\n          mode->redBits   = 5;\n          mode->greenBits = 5;\n          mode->blueBits  = 5;\n          break;\n      case mir_pixel_format_rgba_4444:\n          mode->redBits   = 4;\n          mode->greenBits = 4;\n          mode->blueBits  = 4;\n          break;\n      case mir_pixel_format_abgr_8888:\n      case mir_pixel_format_xbgr_8888:\n      case mir_pixel_format_argb_8888:\n      case mir_pixel_format_xrgb_8888:\n      case mir_pixel_format_bgr_888:\n      case mir_pixel_format_rgb_888:\n      default:\n          mode->redBits   = 8;\n          mode->greenBits = 8;\n          mode->blueBits  = 8;\n          break;\n    }\n}\n\nGLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)\n{\n    int i;\n    GLFWvidmode* modes = NULL;\n    MirDisplayConfig* displayConfig =\n        mir_connection_create_display_configuration(_glfw.mir.connection);\n\n    int numOutputs = mir_display_config_get_num_outputs(displayConfig);\n\n    for (i = 0;  i < numOutputs;  i++)\n    {\n        const MirOutput* output = mir_display_config_get_output(displayConfig, i);\n        int id = mir_output_get_id(output);\n\n        if (id != monitor->mir.outputId)\n            continue;\n\n        MirOutputConnectionState state = mir_output_get_connection_state(output);\n        bool enabled = mir_output_is_enabled(output);\n\n        // We must have been disconnected\n        if (!enabled || state != mir_output_connection_state_connected)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"Mir: Monitor no longer connected\");\n            return NULL;\n        }\n\n        int numModes = mir_output_get_num_modes(output);\n        modes = calloc(numModes, sizeof(GLFWvidmode));\n\n        for (*found = 0;  *found < numModes;  (*found)++)\n        {\n            const MirOutputMode* mode = mir_output_get_mode(output, *found);\n            int width  = mir_output_mode_get_width(mode);\n            int height = mir_output_mode_get_height(mode);\n            double refreshRate = mir_output_mode_get_refresh_rate(mode);\n            MirPixelFormat currentFormat = mir_output_get_current_pixel_format(output);\n\n            modes[*found].width  = width;\n            modes[*found].height = height;\n            modes[*found].refreshRate = refreshRate;\n\n            FillInRGBBitsFromPixelFormat(&modes[*found], currentFormat);\n        }\n\n        break;\n    }\n\n    mir_display_config_release(displayConfig);\n\n    return modes;\n}\n\nvoid _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)\n{\n    *mode = monitor->modes[monitor->mir.curMode];\n}\n\nvoid _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI int glfwGetMirMonitor(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(0);\n    return monitor->mir.outputId;\n}\n"
  },
  {
    "path": "external/GLFW/src/mir_platform.h",
    "content": "//========================================================================\n// GLFW 3.3 Mir - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014-2017 Brandon Schaefer <brandon.schaefer@canonical.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <sys/queue.h>\n#include <pthread.h>\n#include <dlfcn.h>\n\n#include <mir_toolkit/mir_client_library.h>\n\ntypedef VkFlags VkMirWindowCreateFlagsKHR;\n\ntypedef struct VkMirWindowCreateInfoKHR\n{\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkMirWindowCreateFlagsKHR   flags;\n    MirConnection*              connection;\n    MirWindow*                  mirWindow;\n} VkMirWindowCreateInfoKHR;\n\ntypedef VkResult (APIENTRY *PFN_vkCreateMirWindowKHR)(VkInstance,const VkMirWindowCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);\ntypedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)(VkPhysicalDevice,uint32_t,MirConnection*);\n\n#include \"posix_thread.h\"\n#include \"posix_time.h\"\n#include \"linux_joystick.h\"\n#include \"xkb_unicode.h\"\n#include \"egl_context.h\"\n#include \"osmesa_context.h\"\n\n#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)\n#define _glfw_dlclose(handle) dlclose(handle)\n#define _glfw_dlsym(handle, name) dlsym(handle, name)\n\n#define _GLFW_EGL_NATIVE_WINDOW  ((EGLNativeWindowType) window->mir.nativeWindow)\n#define _GLFW_EGL_NATIVE_DISPLAY ((EGLNativeDisplayType) _glfw.mir.display)\n\n#define _GLFW_PLATFORM_WINDOW_STATE         _GLFWwindowMir  mir\n#define _GLFW_PLATFORM_MONITOR_STATE        _GLFWmonitorMir mir\n#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryMir mir\n#define _GLFW_PLATFORM_CURSOR_STATE         _GLFWcursorMir  mir\n\n#define _GLFW_PLATFORM_CONTEXT_STATE\n#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE\n\n\n// Mir-specific Event Queue\n//\ntypedef struct EventQueue\n{\n    TAILQ_HEAD(, EventNode) head;\n} EventQueue;\n\n// Mir-specific per-window data\n//\ntypedef struct _GLFWwindowMir\n{\n    MirWindow*              window;\n    int                     width;\n    int                     height;\n    MirEGLNativeWindowType  nativeWindow;\n    _GLFWcursor*            currentCursor;\n\n} _GLFWwindowMir;\n\n// Mir-specific per-monitor data\n//\ntypedef struct _GLFWmonitorMir\n{\n    int curMode;\n    int outputId;\n    int x;\n    int y;\n\n} _GLFWmonitorMir;\n\n// Mir-specific global data\n//\ntypedef struct _GLFWlibraryMir\n{\n    MirConnection*          connection;\n    MirEGLNativeDisplayType display;\n    EventQueue* eventQueue;\n\n    short int keycodes[256];\n    short int scancodes[GLFW_KEY_LAST + 1];\n\n    pthread_mutex_t eventMutex;\n    pthread_cond_t  eventCond;\n\n    // The window whose disabled cursor mode is active\n    _GLFWwindow* disabledCursorWindow;\n\n} _GLFWlibraryMir;\n\n// Mir-specific per-cursor data\n// TODO: Only system cursors are implemented in Mir atm. Need to wait for support.\n//\ntypedef struct _GLFWcursorMir\n{\n    MirCursorConfiguration* conf;\n    MirBufferStream*        customCursor;\n    char const*             cursorName; // only needed for system cursors\n} _GLFWcursorMir;\n\n\nextern void _glfwPollMonitorsMir(void);\nextern void _glfwInitEventQueueMir(EventQueue* queue);\nextern void _glfwDeleteEventQueueMir(EventQueue* queue);\n\n"
  },
  {
    "path": "external/GLFW/src/mir_window.c",
    "content": "//========================================================================\n// GLFW 3.3 Mir - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014-2017 Brandon Schaefer <brandon.schaefer@canonical.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <linux/input.h>\n#include <stdlib.h>\n#include <string.h>\n\n\ntypedef struct EventNode\n{\n    TAILQ_ENTRY(EventNode) entries;\n    const MirEvent*        event;\n    _GLFWwindow*           window;\n} EventNode;\n\nstatic void deleteNode(EventQueue* queue, EventNode* node)\n{\n    mir_event_unref(node->event);\n    free(node);\n}\n\nstatic GLFWbool emptyEventQueue(EventQueue* queue)\n{\n    return queue->head.tqh_first == NULL;\n}\n\n// TODO The mir_event_ref is not supposed to be used but ... its needed\n//      in this case. Need to wait until we can read from an FD set up by mir\n//      for single threaded event handling.\nstatic EventNode* newEventNode(const MirEvent* event, _GLFWwindow* context)\n{\n    EventNode* newNode = calloc(1, sizeof(EventNode));\n    newNode->event     = mir_event_ref(event);\n    newNode->window    = context;\n\n    return newNode;\n}\n\nstatic void enqueueEvent(const MirEvent* event, _GLFWwindow* context)\n{\n    pthread_mutex_lock(&_glfw.mir.eventMutex);\n\n    EventNode* newNode = newEventNode(event, context);\n    TAILQ_INSERT_TAIL(&_glfw.mir.eventQueue->head, newNode, entries);\n\n    pthread_cond_signal(&_glfw.mir.eventCond);\n\n    pthread_mutex_unlock(&_glfw.mir.eventMutex);\n}\n\nstatic EventNode* dequeueEvent(EventQueue* queue)\n{\n    EventNode* node = NULL;\n\n    pthread_mutex_lock(&_glfw.mir.eventMutex);\n\n    node = queue->head.tqh_first;\n\n    if (node)\n        TAILQ_REMOVE(&queue->head, node, entries);\n\n    pthread_mutex_unlock(&_glfw.mir.eventMutex);\n\n    return node;\n}\n\nstatic MirPixelFormat findValidPixelFormat(void)\n{\n    unsigned int i, validFormats, mirPixelFormats = 32;\n    MirPixelFormat formats[mir_pixel_formats];\n\n    mir_connection_get_available_surface_formats(_glfw.mir.connection, formats,\n                                                 mirPixelFormats, &validFormats);\n\n    for (i = 0;  i < validFormats;  i++)\n    {\n        if (formats[i] == mir_pixel_format_abgr_8888 ||\n            formats[i] == mir_pixel_format_xbgr_8888 ||\n            formats[i] == mir_pixel_format_argb_8888 ||\n            formats[i] == mir_pixel_format_xrgb_8888)\n        {\n            return formats[i];\n        }\n    }\n\n    return mir_pixel_format_invalid;\n}\n\nstatic int mirModToGLFWMod(uint32_t mods)\n{\n    int publicMods = 0x0;\n\n    if (mods & mir_input_event_modifier_alt)\n        publicMods |= GLFW_MOD_ALT;\n    else if (mods & mir_input_event_modifier_shift)\n        publicMods |= GLFW_MOD_SHIFT;\n    else if (mods & mir_input_event_modifier_ctrl)\n        publicMods |= GLFW_MOD_CONTROL;\n    else if (mods & mir_input_event_modifier_meta)\n        publicMods |= GLFW_MOD_SUPER;\n\n    return publicMods;\n}\n\nstatic int toGLFWKeyCode(uint32_t key)\n{\n    if (key < sizeof(_glfw.mir.keycodes) / sizeof(_glfw.mir.keycodes[0]))\n        return _glfw.mir.keycodes[key];\n\n    return GLFW_KEY_UNKNOWN;\n}\n\nstatic void handleKeyEvent(const MirKeyboardEvent* key_event, _GLFWwindow* window)\n{\n    const int action    = mir_keyboard_event_action   (key_event);\n    const int scan_code = mir_keyboard_event_scan_code(key_event);\n    const int key_code  = mir_keyboard_event_key_code (key_event);\n    const int modifiers = mir_keyboard_event_modifiers(key_event);\n\n    const int  pressed = action == mir_keyboard_action_up ? GLFW_RELEASE : GLFW_PRESS;\n    const int  mods    = mirModToGLFWMod(modifiers);\n    const long text    = _glfwKeySym2Unicode(key_code);\n    const int  plain   = !(mods & (GLFW_MOD_CONTROL | GLFW_MOD_ALT));\n\n    _glfwInputKey(window, toGLFWKeyCode(scan_code), scan_code, pressed, mods);\n\n    if (text != -1)\n        _glfwInputChar(window, text, mods, plain);\n}\n\nstatic void handlePointerButton(_GLFWwindow* window,\n                              int pressed,\n                              const MirPointerEvent* pointer_event)\n{\n    int mods                = mir_pointer_event_modifiers(pointer_event);\n    const int publicMods    = mirModToGLFWMod(mods);\n    MirPointerButton button = mir_pointer_button_primary;\n    static uint32_t oldButtonStates = 0;\n    uint32_t newButtonStates        = mir_pointer_event_buttons(pointer_event);\n    int publicButton                = GLFW_MOUSE_BUTTON_LEFT;\n\n    // XOR our old button states our new states to figure out what was added or removed\n    button = newButtonStates ^ oldButtonStates;\n\n    switch (button)\n    {\n        case mir_pointer_button_primary:\n            publicButton = GLFW_MOUSE_BUTTON_LEFT;\n            break;\n        case mir_pointer_button_secondary:\n            publicButton = GLFW_MOUSE_BUTTON_RIGHT;\n            break;\n        case mir_pointer_button_tertiary:\n            publicButton = GLFW_MOUSE_BUTTON_MIDDLE;\n            break;\n        case mir_pointer_button_forward:\n            // FIXME What is the forward button?\n            publicButton = GLFW_MOUSE_BUTTON_4;\n            break;\n        case mir_pointer_button_back:\n            // FIXME What is the back button?\n            publicButton = GLFW_MOUSE_BUTTON_5;\n            break;\n        default:\n            break;\n    }\n\n    oldButtonStates = newButtonStates;\n\n    _glfwInputMouseClick(window, publicButton, pressed, publicMods);\n}\n\nstatic void handlePointerMotion(_GLFWwindow* window,\n                                const MirPointerEvent* pointer_event)\n{\n    const int hscroll = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_hscroll);\n    const int vscroll = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_vscroll);\n\n    if (window->cursorMode == GLFW_CURSOR_DISABLED)\n    {\n        if (_glfw.mir.disabledCursorWindow != window)\n            return;\n\n        const int dx = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_relative_x);\n        const int dy = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_relative_y);\n        const int current_x = window->virtualCursorPosX;\n        const int current_y = window->virtualCursorPosY;\n\n        _glfwInputCursorPos(window, dx + current_x, dy + current_y);\n    }\n    else\n    {\n        const int x = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_x);\n        const int y = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_y);\n\n        _glfwInputCursorPos(window, x, y);\n    }\n\n    if (hscroll != 0 || vscroll != 0)\n      _glfwInputScroll(window, hscroll, vscroll);\n}\n\nstatic void handlePointerEvent(const MirPointerEvent* pointer_event,\n                             _GLFWwindow* window)\n{\n    int action = mir_pointer_event_action(pointer_event);\n\n    switch (action)\n    {\n          case mir_pointer_action_button_down:\n              handlePointerButton(window, GLFW_PRESS, pointer_event);\n              break;\n          case mir_pointer_action_button_up:\n              handlePointerButton(window, GLFW_RELEASE, pointer_event);\n              break;\n          case mir_pointer_action_motion:\n              handlePointerMotion(window, pointer_event);\n              break;\n          case mir_pointer_action_enter:\n          case mir_pointer_action_leave:\n              break;\n          default:\n              break;\n    }\n}\n\nstatic void handleInput(const MirInputEvent* input_event, _GLFWwindow* window)\n{\n    int type = mir_input_event_get_type(input_event);\n\n    switch (type)\n    {\n        case mir_input_event_type_key:\n            handleKeyEvent(mir_input_event_get_keyboard_event(input_event), window);\n            break;\n        case mir_input_event_type_pointer:\n            handlePointerEvent(mir_input_event_get_pointer_event(input_event), window);\n            break;\n        default:\n            break;\n    }\n}\n\nstatic void handleEvent(const MirEvent* event, _GLFWwindow* window)\n{\n    int type = mir_event_get_type(event);\n\n    switch (type)\n    {\n        case mir_event_type_input:\n            handleInput(mir_event_get_input_event(event), window);\n            break;\n        default:\n            break;\n    }\n}\n\nstatic void addNewEvent(MirWindow* window, const MirEvent* event, void* context)\n{\n    enqueueEvent(event, context);\n}\n\nstatic GLFWbool createWindow(_GLFWwindow* window)\n{\n    MirWindowSpec* spec;\n    MirBufferUsage buffer_usage = mir_buffer_usage_hardware;\n    MirPixelFormat pixel_format = findValidPixelFormat();\n\n    if (pixel_format == mir_pixel_format_invalid)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Mir: Unable to find a correct pixel format\");\n        return GLFW_FALSE;\n    }\n\n    spec = mir_create_normal_window_spec(_glfw.mir.connection,\n                                         window->mir.width,\n                                         window->mir.height);\n\n    mir_window_spec_set_pixel_format(spec, pixel_format);\n    mir_window_spec_set_buffer_usage(spec, buffer_usage);\n\n    window->mir.window = mir_create_window_sync(spec);\n    mir_window_spec_release(spec);\n\n    if (!mir_window_is_valid(window->mir.window))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Mir: Unable to create window: %s\",\n                        mir_window_get_error_message(window->mir.window));\n\n        return GLFW_FALSE;\n    }\n\n    mir_window_set_event_handler(window->mir.window, addNewEvent, window);\n\n    return GLFW_TRUE;\n}\n\nstatic void setWindowConfinement(_GLFWwindow* window, MirPointerConfinementState state)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_pointer_confinement(spec, state);\n\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwInitEventQueueMir(EventQueue* queue)\n{\n    TAILQ_INIT(&queue->head);\n}\n\nvoid _glfwDeleteEventQueueMir(EventQueue* queue)\n{\n    if (queue)\n    {\n        EventNode* node, *node_next;\n        node = queue->head.tqh_first;\n\n        while (node != NULL)\n        {\n            node_next = node->entries.tqe_next;\n\n            TAILQ_REMOVE(&queue->head, node, entries);\n            deleteNode(queue, node);\n\n            node = node_next;\n        }\n\n        free(queue);\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformCreateWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig)\n{\n    if (window->monitor)\n    {\n        GLFWvidmode mode;\n        _glfwPlatformGetVideoMode(window->monitor, &mode);\n\n        mir_window_set_state(window->mir.window, mir_window_state_fullscreen);\n\n        if (wndconfig->width > mode.width || wndconfig->height > mode.height)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"Mir: Requested window size too large: %ix%i\",\n                            wndconfig->width, wndconfig->height);\n\n            return GLFW_FALSE;\n        }\n    }\n\n    window->mir.width  = wndconfig->width;\n    window->mir.height = wndconfig->height;\n    window->mir.currentCursor = NULL;\n\n    if (!createWindow(window))\n        return GLFW_FALSE;\n\n    window->mir.nativeWindow = mir_buffer_stream_get_egl_native_window(\n        mir_window_get_buffer_stream(window->mir.window));\n\n    if (ctxconfig->client != GLFW_NO_API)\n    {\n        if (ctxconfig->source == GLFW_EGL_CONTEXT_API ||\n            ctxconfig->source == GLFW_NATIVE_CONTEXT_API)\n        {\n            if (!_glfwInitEGL())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API)\n        {\n            if (!_glfwInitOSMesa())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyWindow(_GLFWwindow* window)\n{\n    if (_glfw.mir.disabledCursorWindow == window)\n        _glfw.mir.disabledCursorWindow = NULL;\n\n    if (mir_window_is_valid(window->mir.window))\n    {\n        mir_window_release_sync(window->mir.window);\n        window->mir.window= NULL;\n    }\n\n    if (window->context.destroy)\n        window->context.destroy(window);\n}\n\nvoid _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_name(spec, title);\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformSetWindowIcon(_GLFWwindow* window,\n                                int count, const GLFWimage* images)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_width (spec, width);\n    mir_window_spec_set_height(spec, height);\n\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,\n                                      int minwidth, int minheight,\n                                      int maxwidth, int maxheight)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_max_width (spec, maxwidth);\n    mir_window_spec_set_max_height(spec, maxheight);\n    mir_window_spec_set_min_width (spec, minwidth);\n    mir_window_spec_set_min_height(spec, minheight);\n\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,\n                                     int* left, int* top,\n                                     int* right, int* bottom)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)\n{\n    if (width)\n        *width  = window->mir.width;\n    if (height)\n        *height = window->mir.height;\n}\n\nvoid _glfwPlatformIconifyWindow(_GLFWwindow* window)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_state(spec, mir_window_state_minimized);\n\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformRestoreWindow(_GLFWwindow* window)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_state(spec, mir_window_state_restored);\n\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformMaximizeWindow(_GLFWwindow* window)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_state(spec, mir_window_state_maximized);\n\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformHideWindow(_GLFWwindow* window)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_state(spec, mir_window_state_hidden);\n\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformShowWindow(_GLFWwindow* window)\n{\n    MirWindowSpec* spec;\n\n    spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_state(spec, mir_window_state_restored);\n\n    mir_window_apply_spec(window->mir.window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformRequestWindowAttention(_GLFWwindow* window)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformFocusWindow(_GLFWwindow* window)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformSetWindowMonitor(_GLFWwindow* window,\n                                   _GLFWmonitor* monitor,\n                                   int xpos, int ypos,\n                                   int width, int height,\n                                   int refreshRate)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nint _glfwPlatformWindowFocused(_GLFWwindow* window)\n{\n    return mir_window_get_focus_state(window->mir.window) == mir_window_focus_state_focused;\n}\n\nint _glfwPlatformWindowIconified(_GLFWwindow* window)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n    return GLFW_FALSE;\n}\n\nint _glfwPlatformWindowVisible(_GLFWwindow* window)\n{\n    return mir_window_get_visibility(window->mir.window) == mir_window_visibility_exposed;\n}\n\nint _glfwPlatformWindowMaximized(_GLFWwindow* window)\n{\n    return mir_window_get_state(window->mir.window) == mir_window_state_maximized;\n}\n\nint _glfwPlatformFramebufferTransparent(_GLFWwindow* window)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n    return GLFW_FALSE;\n}\n\nvoid _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformPollEvents(void)\n{\n    EventNode* node = NULL;\n\n    while ((node = dequeueEvent(_glfw.mir.eventQueue)))\n    {\n        handleEvent(node->event, node->window);\n        deleteNode(_glfw.mir.eventQueue, node);\n    }\n}\n\nvoid _glfwPlatformWaitEvents(void)\n{\n    pthread_mutex_lock(&_glfw.mir.eventMutex);\n\n    while (emptyEventQueue(_glfw.mir.eventQueue))\n        pthread_cond_wait(&_glfw.mir.eventCond, &_glfw.mir.eventMutex);\n\n    pthread_mutex_unlock(&_glfw.mir.eventMutex);\n\n    _glfwPlatformPollEvents();\n}\n\nvoid _glfwPlatformWaitEventsTimeout(double timeout)\n{\n    pthread_mutex_lock(&_glfw.mir.eventMutex);\n\n    if (emptyEventQueue(_glfw.mir.eventQueue))\n    {\n        struct timespec time;\n        clock_gettime(CLOCK_REALTIME, &time);\n        time.tv_sec += (long) timeout;\n        time.tv_nsec += (long) ((timeout - (long) timeout) * 1e9);\n        pthread_cond_timedwait(&_glfw.mir.eventCond, &_glfw.mir.eventMutex, &time);\n    }\n\n    pthread_mutex_unlock(&_glfw.mir.eventMutex);\n\n    _glfwPlatformPollEvents();\n}\n\nvoid _glfwPlatformPostEmptyEvent(void)\n{\n}\n\nvoid _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)\n{\n    if (width)\n        *width  = window->mir.width;\n    if (height)\n        *height = window->mir.height;\n}\n\nint _glfwPlatformCreateCursor(_GLFWcursor* cursor,\n                              const GLFWimage* image,\n                              int xhot, int yhot)\n{\n    MirBufferStream* stream;\n\n    int i_w = image->width;\n    int i_h = image->height;\n\n    stream = mir_connection_create_buffer_stream_sync(_glfw.mir.connection,\n                                                      i_w, i_h,\n                                                      mir_pixel_format_argb_8888,\n                                                      mir_buffer_usage_software);\n\n    cursor->mir.conf = mir_cursor_configuration_from_buffer_stream(stream, xhot, yhot);\n\n    MirGraphicsRegion region;\n    mir_buffer_stream_get_graphics_region(stream, &region);\n\n    unsigned char* pixels = image->pixels;\n    char* dest = region.vaddr;\n    int i;\n\n    for (i = 0; i < i_w * i_h; i++, pixels += 4)\n    {\n        unsigned int alpha = pixels[3];\n        *dest++ = (char)(pixels[2] * alpha / 255);\n        *dest++ = (char)(pixels[1] * alpha / 255);\n        *dest++ = (char)(pixels[0] * alpha / 255);\n        *dest++ = (char)alpha;\n    }\n\n    mir_buffer_stream_swap_buffers_sync(stream);\n    cursor->mir.customCursor = stream;\n\n    return GLFW_TRUE;\n}\n\nstatic const char* getSystemCursorName(int shape)\n{\n    switch (shape)\n    {\n        case GLFW_ARROW_CURSOR:\n            return mir_arrow_cursor_name;\n        case GLFW_IBEAM_CURSOR:\n            return mir_caret_cursor_name;\n        case GLFW_CROSSHAIR_CURSOR:\n            return mir_crosshair_cursor_name;\n        case GLFW_HAND_CURSOR:\n            return mir_open_hand_cursor_name;\n        case GLFW_HRESIZE_CURSOR:\n            return mir_horizontal_resize_cursor_name;\n        case GLFW_VRESIZE_CURSOR:\n            return mir_vertical_resize_cursor_name;\n    }\n\n    return NULL;\n}\n\nint _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)\n{\n    cursor->mir.conf         = NULL;\n    cursor->mir.customCursor = NULL;\n    cursor->mir.cursorName   = getSystemCursorName(shape);\n\n    return cursor->mir.cursorName != NULL;\n}\n\nvoid _glfwPlatformDestroyCursor(_GLFWcursor* cursor)\n{\n    if (cursor->mir.conf)\n        mir_cursor_configuration_destroy(cursor->mir.conf);\n    if (cursor->mir.customCursor)\n        mir_buffer_stream_release_sync(cursor->mir.customCursor);\n}\n\nstatic void setCursorNameForWindow(MirWindow* window, char const* name)\n{\n    MirWindowSpec* spec = mir_create_window_spec(_glfw.mir.connection);\n    mir_window_spec_set_cursor_name(spec, name);\n    mir_window_apply_spec(window, spec);\n    mir_window_spec_release(spec);\n}\n\nvoid _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)\n{\n    if (cursor)\n    {\n        window->mir.currentCursor = cursor;\n\n        if (cursor->mir.cursorName)\n        {\n            setCursorNameForWindow(window->mir.window, cursor->mir.cursorName);\n        }\n        else if (cursor->mir.conf)\n        {\n            mir_window_configure_cursor(window->mir.window, cursor->mir.conf);\n        }\n    }\n    else\n    {\n        setCursorNameForWindow(window->mir.window, mir_default_cursor_name);\n    }\n}\n\nvoid _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nvoid _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)\n{\n    if (mode == GLFW_CURSOR_DISABLED)\n    {\n        _glfw.mir.disabledCursorWindow = window;\n        setWindowConfinement(window, mir_pointer_confined_to_window);\n        setCursorNameForWindow(window->mir.window, mir_disabled_cursor_name);\n    }\n    else\n    {\n        // If we were disabled before lets undo that!\n        if (_glfw.mir.disabledCursorWindow == window)\n        {\n            _glfw.mir.disabledCursorWindow = NULL;\n            setWindowConfinement(window, mir_pointer_unconfined);\n        }\n\n        if (window->cursorMode == GLFW_CURSOR_NORMAL)\n        {\n            _glfwPlatformSetCursor(window, window->mir.currentCursor);\n        }\n        else if (window->cursorMode == GLFW_CURSOR_HIDDEN)\n        {\n            setCursorNameForWindow(window->mir.window, mir_disabled_cursor_name);\n        }\n    }\n}\n\nconst char* _glfwPlatformGetScancodeName(int scancode)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n    return NULL;\n}\n\nint _glfwPlatformGetKeyScancode(int key)\n{\n    return _glfw.mir.scancodes[key];\n}\n\nvoid _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n}\n\nconst char* _glfwPlatformGetClipboardString(_GLFWwindow* window)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Mir: Unsupported function %s\", __PRETTY_FUNCTION__);\n\n    return NULL;\n}\n\nvoid _glfwPlatformGetRequiredInstanceExtensions(char** extensions)\n{\n    if (!_glfw.vk.KHR_surface || !_glfw.vk.KHR_mir_surface)\n        return;\n\n    extensions[0] = \"VK_KHR_surface\";\n    extensions[1] = \"VK_KHR_mir_surface\";\n}\n\nint _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,\n                                                      VkPhysicalDevice device,\n                                                      uint32_t queuefamily)\n{\n    PFN_vkGetPhysicalDeviceMirPresentationSupportKHR\n        vkGetPhysicalDeviceMirPresentationSupportKHR =\n        (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)\n        vkGetInstanceProcAddr(instance, \"vkGetPhysicalDeviceMirPresentationSupportKHR\");\n    if (!vkGetPhysicalDeviceMirPresentationSupportKHR)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Mir: Vulkan instance missing VK_KHR_mir_surface extension\");\n        return GLFW_FALSE;\n    }\n\n    return vkGetPhysicalDeviceMirPresentationSupportKHR(device,\n                                                        queuefamily,\n                                                        _glfw.mir.connection);\n}\n\nVkResult _glfwPlatformCreateWindowSurface(VkInstance instance,\n                                          _GLFWwindow* window,\n                                          const VkAllocationCallbacks* allocator,\n                                          VkSurfaceKHR* surface)\n{\n    VkResult err;\n    VkMirWindowCreateInfoKHR sci;\n    PFN_vkCreateMirWindowKHR vkCreateMirWindowKHR;\n\n    vkCreateMirWindowKHR = (PFN_vkCreateMirWindowKHR)\n        vkGetInstanceProcAddr(instance, \"vkCreateMirWindowKHR\");\n    if (!vkCreateMirWindowKHR)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Mir: Vulkan instance missing VK_KHR_mir_surface extension\");\n        return VK_ERROR_EXTENSION_NOT_PRESENT;\n    }\n\n    memset(&sci, 0, sizeof(sci));\n    sci.sType = VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR;\n    sci.connection = _glfw.mir.connection;\n    sci.mirWindow  = window->mir.window;\n\n    err = vkCreateMirWindowKHR(instance, &sci, allocator, surface);\n    if (err)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Mir: Failed to create Vulkan surface: %s\",\n                        _glfwGetVulkanResultString(err));\n    }\n\n    return err;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI MirConnection* glfwGetMirDisplay(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return _glfw.mir.connection;\n}\n\nGLFWAPI MirWindow* glfwGetMirWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return window->mir.window;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/monitor.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <assert.h>\n#include <math.h>\n#include <float.h>\n#include <string.h>\n#include <stdlib.h>\n#include <limits.h>\n\n\n// Lexically compare video modes, used by qsort\n//\nstatic int compareVideoModes(const void* fp, const void* sp)\n{\n    const GLFWvidmode* fm = fp;\n    const GLFWvidmode* sm = sp;\n    const int fbpp = fm->redBits + fm->greenBits + fm->blueBits;\n    const int sbpp = sm->redBits + sm->greenBits + sm->blueBits;\n    const int farea = fm->width * fm->height;\n    const int sarea = sm->width * sm->height;\n\n    // First sort on color bits per pixel\n    if (fbpp != sbpp)\n        return fbpp - sbpp;\n\n    // Then sort on screen area\n    if (farea != sarea)\n        return farea - sarea;\n\n    // Lastly sort on refresh rate\n    return fm->refreshRate - sm->refreshRate;\n}\n\n// Retrieves the available modes for the specified monitor\n//\nstatic GLFWbool refreshVideoModes(_GLFWmonitor* monitor)\n{\n    int modeCount;\n    GLFWvidmode* modes;\n\n    if (monitor->modes)\n        return GLFW_TRUE;\n\n    modes = _glfwPlatformGetVideoModes(monitor, &modeCount);\n    if (!modes)\n        return GLFW_FALSE;\n\n    qsort(modes, modeCount, sizeof(GLFWvidmode), compareVideoModes);\n\n    free(monitor->modes);\n    monitor->modes = modes;\n    monitor->modeCount = modeCount;\n\n    return GLFW_TRUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                         GLFW event API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement)\n{\n    if (action == GLFW_CONNECTED)\n    {\n        _glfw.monitorCount++;\n        _glfw.monitors =\n            realloc(_glfw.monitors, sizeof(_GLFWmonitor*) * _glfw.monitorCount);\n\n        if (placement == _GLFW_INSERT_FIRST)\n        {\n            memmove(_glfw.monitors + 1,\n                    _glfw.monitors,\n                    (_glfw.monitorCount - 1) * sizeof(_GLFWmonitor*));\n            _glfw.monitors[0] = monitor;\n        }\n        else\n            _glfw.monitors[_glfw.monitorCount - 1] = monitor;\n    }\n    else if (action == GLFW_DISCONNECTED)\n    {\n        int i;\n\n        for (i = 0;  i < _glfw.monitorCount;  i++)\n        {\n            if (_glfw.monitors[i] == monitor)\n            {\n                _glfw.monitorCount--;\n                memmove(_glfw.monitors + i,\n                        _glfw.monitors + i + 1,\n                        (_glfw.monitorCount - i) * sizeof(_GLFWmonitor*));\n                break;\n            }\n        }\n    }\n\n    if (_glfw.callbacks.monitor)\n        _glfw.callbacks.monitor((GLFWmonitor*) monitor, action);\n\n    if (action == GLFW_DISCONNECTED)\n        _glfwFreeMonitor(monitor);\n}\n\nvoid _glfwInputMonitorWindow(_GLFWmonitor* monitor, _GLFWwindow* window)\n{\n    monitor->window = window;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n_GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM)\n{\n    _GLFWmonitor* monitor = calloc(1, sizeof(_GLFWmonitor));\n    monitor->widthMM = widthMM;\n    monitor->heightMM = heightMM;\n\n    if (name)\n        monitor->name = strdup(name);\n\n    return monitor;\n}\n\nvoid _glfwFreeMonitor(_GLFWmonitor* monitor)\n{\n    if (monitor == NULL)\n        return;\n\n    _glfwFreeGammaArrays(&monitor->originalRamp);\n    _glfwFreeGammaArrays(&monitor->currentRamp);\n\n    free(monitor->modes);\n    free(monitor->name);\n    free(monitor);\n}\n\nvoid _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size)\n{\n    ramp->red = calloc(size, sizeof(unsigned short));\n    ramp->green = calloc(size, sizeof(unsigned short));\n    ramp->blue = calloc(size, sizeof(unsigned short));\n    ramp->size = size;\n}\n\nvoid _glfwFreeGammaArrays(GLFWgammaramp* ramp)\n{\n    free(ramp->red);\n    free(ramp->green);\n    free(ramp->blue);\n\n    memset(ramp, 0, sizeof(GLFWgammaramp));\n}\n\nconst GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor,\n                                        const GLFWvidmode* desired)\n{\n    int i;\n    unsigned int sizeDiff, leastSizeDiff = UINT_MAX;\n    unsigned int rateDiff, leastRateDiff = UINT_MAX;\n    unsigned int colorDiff, leastColorDiff = UINT_MAX;\n    const GLFWvidmode* current;\n    const GLFWvidmode* closest = NULL;\n\n    if (!refreshVideoModes(monitor))\n        return NULL;\n\n    for (i = 0;  i < monitor->modeCount;  i++)\n    {\n        current = monitor->modes + i;\n\n        colorDiff = 0;\n\n        if (desired->redBits != GLFW_DONT_CARE)\n            colorDiff += abs(current->redBits - desired->redBits);\n        if (desired->greenBits != GLFW_DONT_CARE)\n            colorDiff += abs(current->greenBits - desired->greenBits);\n        if (desired->blueBits != GLFW_DONT_CARE)\n            colorDiff += abs(current->blueBits - desired->blueBits);\n\n        sizeDiff = abs((current->width - desired->width) *\n                       (current->width - desired->width) +\n                       (current->height - desired->height) *\n                       (current->height - desired->height));\n\n        if (desired->refreshRate != GLFW_DONT_CARE)\n            rateDiff = abs(current->refreshRate - desired->refreshRate);\n        else\n            rateDiff = UINT_MAX - current->refreshRate;\n\n        if ((colorDiff < leastColorDiff) ||\n            (colorDiff == leastColorDiff && sizeDiff < leastSizeDiff) ||\n            (colorDiff == leastColorDiff && sizeDiff == leastSizeDiff && rateDiff < leastRateDiff))\n        {\n            closest = current;\n            leastSizeDiff = sizeDiff;\n            leastRateDiff = rateDiff;\n            leastColorDiff = colorDiff;\n        }\n    }\n\n    return closest;\n}\n\nint _glfwCompareVideoModes(const GLFWvidmode* fm, const GLFWvidmode* sm)\n{\n    return compareVideoModes(fm, sm);\n}\n\nvoid _glfwSplitBPP(int bpp, int* red, int* green, int* blue)\n{\n    int delta;\n\n    // We assume that by 32 the user really meant 24\n    if (bpp == 32)\n        bpp = 24;\n\n    // Convert \"bits per pixel\" to red, green & blue sizes\n\n    *red = *green = *blue = bpp / 3;\n    delta = bpp - (*red * 3);\n    if (delta >= 1)\n        *green = *green + 1;\n\n    if (delta == 2)\n        *red = *red + 1;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW public API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI GLFWmonitor** glfwGetMonitors(int* count)\n{\n    assert(count != NULL);\n\n    *count = 0;\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    *count = _glfw.monitorCount;\n    return (GLFWmonitor**) _glfw.monitors;\n}\n\nGLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (!_glfw.monitorCount)\n        return NULL;\n\n    return (GLFWmonitor*) _glfw.monitors[0];\n}\n\nGLFWAPI void glfwGetMonitorPos(GLFWmonitor* handle, int* xpos, int* ypos)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    assert(monitor != NULL);\n\n    if (xpos)\n        *xpos = 0;\n    if (ypos)\n        *ypos = 0;\n\n    _GLFW_REQUIRE_INIT();\n\n    _glfwPlatformGetMonitorPos(monitor, xpos, ypos);\n}\n\nGLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* handle, int* widthMM, int* heightMM)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    assert(monitor != NULL);\n\n    if (widthMM)\n        *widthMM = 0;\n    if (heightMM)\n        *heightMM = 0;\n\n    _GLFW_REQUIRE_INIT();\n\n    if (widthMM)\n        *widthMM = monitor->widthMM;\n    if (heightMM)\n        *heightMM = monitor->heightMM;\n}\n\nGLFWAPI const char* glfwGetMonitorName(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    assert(monitor != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return monitor->name;\n}\n\nGLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(_glfw.callbacks.monitor, cbfun);\n    return cbfun;\n}\n\nGLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* handle, int* count)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    assert(monitor != NULL);\n    assert(count != NULL);\n\n    *count = 0;\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (!refreshVideoModes(monitor))\n        return NULL;\n\n    *count = monitor->modeCount;\n    return monitor->modes;\n}\n\nGLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    assert(monitor != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    _glfwPlatformGetVideoMode(monitor, &monitor->currentMode);\n    return &monitor->currentMode;\n}\n\nGLFWAPI void glfwSetGamma(GLFWmonitor* handle, float gamma)\n{\n    int i;\n    unsigned short values[256];\n    GLFWgammaramp ramp;\n    assert(handle != NULL);\n    assert(gamma == gamma);\n    assert(gamma >= 0.f);\n    assert(gamma <= FLT_MAX);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (gamma != gamma || gamma <= 0.f || gamma > FLT_MAX)\n    {\n        _glfwInputError(GLFW_INVALID_VALUE, \"Invalid gamma value %f\", gamma);\n        return;\n    }\n\n    for (i = 0;  i < 256;  i++)\n    {\n        double value;\n\n        // Calculate intensity\n        value = i / 255.0;\n        // Apply gamma curve\n        value = pow(value, 1.0 / gamma) * 65535.0 + 0.5;\n\n        // Clamp to value range\n        if (value > 65535.0)\n            value = 65535.0;\n\n        values[i] = (unsigned short) value;\n    }\n\n    ramp.red = values;\n    ramp.green = values;\n    ramp.blue = values;\n    ramp.size = 256;\n\n    glfwSetGammaRamp(handle, &ramp);\n}\n\nGLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    assert(monitor != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    _glfwFreeGammaArrays(&monitor->currentRamp);\n    _glfwPlatformGetGammaRamp(monitor, &monitor->currentRamp);\n\n    return &monitor->currentRamp;\n}\n\nGLFWAPI void glfwSetGammaRamp(GLFWmonitor* handle, const GLFWgammaramp* ramp)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    assert(monitor != NULL);\n    assert(ramp != NULL);\n    assert(ramp->size > 0);\n    assert(ramp->red != NULL);\n    assert(ramp->green != NULL);\n    assert(ramp->blue != NULL);\n\n    if (ramp->size <= 0)\n    {\n        _glfwInputError(GLFW_INVALID_VALUE,\n                        \"Invalid gamma ramp size %i\",\n                        ramp->size);\n        return;\n    }\n\n    _GLFW_REQUIRE_INIT();\n\n    if (!monitor->originalRamp.size)\n        _glfwPlatformGetGammaRamp(monitor, &monitor->originalRamp);\n\n    _glfwPlatformSetGammaRamp(monitor, ramp);\n}\n\n"
  },
  {
    "path": "external/GLFW/src/nsgl_context.h",
    "content": "//========================================================================\n// GLFW 3.3 macOS - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define _GLFW_PLATFORM_CONTEXT_STATE            _GLFWcontextNSGL nsgl\n#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE    _GLFWlibraryNSGL nsgl\n\n\n// NSGL-specific per-context data\n//\ntypedef struct _GLFWcontextNSGL\n{\n    id           pixelFormat;\n    id\t         object;\n\n} _GLFWcontextNSGL;\n\n// NSGL-specific global data\n//\ntypedef struct _GLFWlibraryNSGL\n{\n    // dlopen handle for OpenGL.framework (for glfwGetProcAddress)\n    CFBundleRef     framework;\n\n} _GLFWlibraryNSGL;\n\n\nGLFWbool _glfwInitNSGL(void);\nvoid _glfwTerminateNSGL(void);\nGLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,\n                                const _GLFWctxconfig* ctxconfig,\n                                const _GLFWfbconfig* fbconfig);\nvoid _glfwDestroyContextNSGL(_GLFWwindow* window);\n\n"
  },
  {
    "path": "external/GLFW/src/nsgl_context.m",
    "content": "//========================================================================\n// GLFW 3.3 macOS - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n\nstatic void makeContextCurrentNSGL(_GLFWwindow* window)\n{\n    if (window)\n        [window->context.nsgl.object makeCurrentContext];\n    else\n        [NSOpenGLContext clearCurrentContext];\n\n    _glfwPlatformSetTls(&_glfw.contextSlot, window);\n}\n\nstatic void swapBuffersNSGL(_GLFWwindow* window)\n{\n    // ARP appears to be unnecessary, but this is future-proof\n    [window->context.nsgl.object flushBuffer];\n}\n\nstatic void swapIntervalNSGL(int interval)\n{\n    _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot);\n\n    GLint sync = interval;\n    [window->context.nsgl.object setValues:&sync\n                              forParameter:NSOpenGLCPSwapInterval];\n}\n\nstatic int extensionSupportedNSGL(const char* extension)\n{\n    // There are no NSGL extensions\n    return GLFW_FALSE;\n}\n\nstatic GLFWglproc getProcAddressNSGL(const char* procname)\n{\n    CFStringRef symbolName = CFStringCreateWithCString(kCFAllocatorDefault,\n                                                       procname,\n                                                       kCFStringEncodingASCII);\n\n    GLFWglproc symbol = CFBundleGetFunctionPointerForName(_glfw.nsgl.framework,\n                                                          symbolName);\n\n    CFRelease(symbolName);\n\n    return symbol;\n}\n\n// Destroy the OpenGL context\n//\nstatic void destroyContextNSGL(_GLFWwindow* window)\n{\n    [window->context.nsgl.pixelFormat release];\n    window->context.nsgl.pixelFormat = nil;\n\n    [window->context.nsgl.object release];\n    window->context.nsgl.object = nil;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialize OpenGL support\n//\nGLFWbool _glfwInitNSGL(void)\n{\n    if (_glfw.nsgl.framework)\n        return GLFW_TRUE;\n\n    _glfw.nsgl.framework =\n        CFBundleGetBundleWithIdentifier(CFSTR(\"com.apple.opengl\"));\n    if (_glfw.nsgl.framework == NULL)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"NSGL: Failed to locate OpenGL framework\");\n        return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\n// Terminate OpenGL support\n//\nvoid _glfwTerminateNSGL(void)\n{\n}\n\n// Create the OpenGL context\n//\nGLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,\n                                const _GLFWctxconfig* ctxconfig,\n                                const _GLFWfbconfig* fbconfig)\n{\n    if (ctxconfig->client == GLFW_OPENGL_ES_API)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"NSGL: OpenGL ES is not available on macOS\");\n        return GLFW_FALSE;\n    }\n\n    if (ctxconfig->major > 2)\n    {\n        if (ctxconfig->major == 3 && ctxconfig->minor < 2)\n        {\n            _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                            \"NSGL: The targeted version of macOS does not support OpenGL 3.0 or 3.1 but may support 3.2 and above\");\n            return GLFW_FALSE;\n        }\n\n        if (!ctxconfig->forward || ctxconfig->profile != GLFW_OPENGL_CORE_PROFILE)\n        {\n            _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                            \"NSGL: The targeted version of macOS only supports forward-compatible core profile contexts for OpenGL 3.2 and above\");\n            return GLFW_FALSE;\n        }\n    }\n\n    // Context robustness modes (GL_KHR_robustness) are not yet supported by\n    // macOS but are not a hard constraint, so ignore and continue\n\n    // Context release behaviors (GL_KHR_context_flush_control) are not yet\n    // supported by macOS but are not a hard constraint, so ignore and continue\n\n    // Debug contexts (GL_KHR_debug) are not yet supported by macOS but are not\n    // a hard constraint, so ignore and continue\n\n    // No-error contexts (GL_KHR_no_error) are not yet supported by macOS but\n    // are not a hard constraint, so ignore and continue\n\n#define addAttrib(a) \\\n{ \\\n    assert((size_t) index < sizeof(attribs) / sizeof(attribs[0])); \\\n    attribs[index++] = a; \\\n}\n#define setAttrib(a, v) { addAttrib(a); addAttrib(v); }\n\n    NSOpenGLPixelFormatAttribute attribs[40];\n    int index = 0;\n\n    addAttrib(NSOpenGLPFAAccelerated);\n    addAttrib(NSOpenGLPFAClosestPolicy);\n\n    if (ctxconfig->nsgl.offline)\n    {\n        addAttrib(NSOpenGLPFAAllowOfflineRenderers);\n        // NOTE: This replaces the NSSupportsAutomaticGraphicsSwitching key in\n        //       Info.plist for unbundled applications\n        // HACK: This assumes that NSOpenGLPixelFormat will remain\n        //       a straightforward wrapper of its CGL counterpart\n#if MAC_OS_X_VERSION_MAX_ALLOWED >= 100800\n        addAttrib(kCGLPFASupportsAutomaticGraphicsSwitching);\n#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/\n    }\n\n#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101000\n    if (ctxconfig->major >= 4)\n    {\n        setAttrib(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core);\n    }\n    else\n#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/\n    if (ctxconfig->major >= 3)\n    {\n        setAttrib(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core);\n    }\n\n    if (ctxconfig->major <= 2)\n    {\n        if (fbconfig->auxBuffers != GLFW_DONT_CARE)\n            setAttrib(NSOpenGLPFAAuxBuffers, fbconfig->auxBuffers);\n\n        if (fbconfig->accumRedBits != GLFW_DONT_CARE &&\n            fbconfig->accumGreenBits != GLFW_DONT_CARE &&\n            fbconfig->accumBlueBits != GLFW_DONT_CARE &&\n            fbconfig->accumAlphaBits != GLFW_DONT_CARE)\n        {\n            const int accumBits = fbconfig->accumRedBits +\n                                  fbconfig->accumGreenBits +\n                                  fbconfig->accumBlueBits +\n                                  fbconfig->accumAlphaBits;\n\n            setAttrib(NSOpenGLPFAAccumSize, accumBits);\n        }\n    }\n\n    if (fbconfig->redBits != GLFW_DONT_CARE &&\n        fbconfig->greenBits != GLFW_DONT_CARE &&\n        fbconfig->blueBits != GLFW_DONT_CARE)\n    {\n        int colorBits = fbconfig->redBits +\n                        fbconfig->greenBits +\n                        fbconfig->blueBits;\n\n        // macOS needs non-zero color size, so set reasonable values\n        if (colorBits == 0)\n            colorBits = 24;\n        else if (colorBits < 15)\n            colorBits = 15;\n\n        setAttrib(NSOpenGLPFAColorSize, colorBits);\n    }\n\n    if (fbconfig->alphaBits != GLFW_DONT_CARE)\n        setAttrib(NSOpenGLPFAAlphaSize, fbconfig->alphaBits);\n\n    if (fbconfig->depthBits != GLFW_DONT_CARE)\n        setAttrib(NSOpenGLPFADepthSize, fbconfig->depthBits);\n\n    if (fbconfig->stencilBits != GLFW_DONT_CARE)\n        setAttrib(NSOpenGLPFAStencilSize, fbconfig->stencilBits);\n\n    if (fbconfig->stereo)\n    {\n#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101200\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"NSGL: Stereo rendering is deprecated\");\n        return GLFW_FALSE;\n#else\n        addAttrib(NSOpenGLPFAStereo);\n#endif\n    }\n\n    if (fbconfig->doublebuffer)\n        addAttrib(NSOpenGLPFADoubleBuffer);\n\n    if (fbconfig->samples != GLFW_DONT_CARE)\n    {\n        if (fbconfig->samples == 0)\n        {\n            setAttrib(NSOpenGLPFASampleBuffers, 0);\n        }\n        else\n        {\n            setAttrib(NSOpenGLPFASampleBuffers, 1);\n            setAttrib(NSOpenGLPFASamples, fbconfig->samples);\n        }\n    }\n\n    // NOTE: All NSOpenGLPixelFormats on the relevant cards support sRGB\n    //       framebuffer, so there's no need (and no way) to request it\n\n    addAttrib(0);\n\n#undef addAttrib\n#undef setAttrib\n\n    window->context.nsgl.pixelFormat =\n        [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];\n    if (window->context.nsgl.pixelFormat == nil)\n    {\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"NSGL: Failed to find a suitable pixel format\");\n        return GLFW_FALSE;\n    }\n\n    NSOpenGLContext* share = NULL;\n\n    if (ctxconfig->share)\n        share = ctxconfig->share->context.nsgl.object;\n\n    window->context.nsgl.object =\n        [[NSOpenGLContext alloc] initWithFormat:window->context.nsgl.pixelFormat\n                                   shareContext:share];\n    if (window->context.nsgl.object == nil)\n    {\n        _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                        \"NSGL: Failed to create OpenGL context\");\n        return GLFW_FALSE;\n    }\n\n    if (fbconfig->transparent)\n    {\n        GLint opaque = 0;\n        [window->context.nsgl.object setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];\n    }\n\n    [window->context.nsgl.object setView:window->ns.view];\n\n    window->context.makeCurrent = makeContextCurrentNSGL;\n    window->context.swapBuffers = swapBuffersNSGL;\n    window->context.swapInterval = swapIntervalNSGL;\n    window->context.extensionSupported = extensionSupportedNSGL;\n    window->context.getProcAddress = getProcAddressNSGL;\n    window->context.destroy = destroyContextNSGL;\n\n    return GLFW_TRUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI id glfwGetNSGLContext(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(nil);\n\n    if (window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return NULL;\n    }\n\n    return window->context.nsgl.object;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/null_init.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2016 Google Inc.\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformInit(void)\n{\n    _glfwInitTimerPOSIX();\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformTerminate(void)\n{\n    _glfwTerminateOSMesa();\n}\n\nconst char* _glfwPlatformGetVersionString(void)\n{\n    return _GLFW_VERSION_NUMBER \" null OSMesa\";\n}\n\n"
  },
  {
    "path": "external/GLFW/src/null_joystick.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)\n{\n    return GLFW_FALSE;\n}\n\nvoid _glfwPlatformUpdateGamepadGUID(char* guid)\n{\n}\n\n"
  },
  {
    "path": "external/GLFW/src/null_joystick.h",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define _GLFW_PLATFORM_JOYSTICK_STATE         int nulljs\n#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE int nulljs\n\n#define _GLFW_PLATFORM_MAPPING_NAME \"\"\n\n"
  },
  {
    "path": "external/GLFW/src/null_monitor.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2016 Google Inc.\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)\n{\n}\n\nGLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)\n{\n    return NULL;\n}\n\nvoid _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)\n{\n}\n\nvoid _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)\n{\n}\n\nvoid _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)\n{\n}\n\n"
  },
  {
    "path": "external/GLFW/src/null_platform.h",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2016 Google Inc.\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <dlfcn.h>\n\n#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNull null\n\n#define _GLFW_PLATFORM_CONTEXT_STATE\n#define _GLFW_PLATFORM_MONITOR_STATE\n#define _GLFW_PLATFORM_CURSOR_STATE\n#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE\n#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE\n#define _GLFW_EGL_CONTEXT_STATE\n#define _GLFW_EGL_LIBRARY_CONTEXT_STATE\n\n#include \"osmesa_context.h\"\n#include \"posix_time.h\"\n#include \"posix_thread.h\"\n#include \"null_joystick.h\"\n\n#if defined(_GLFW_WIN32)\n #define _glfw_dlopen(name) LoadLibraryA(name)\n #define _glfw_dlclose(handle) FreeLibrary((HMODULE) handle)\n #define _glfw_dlsym(handle, name) GetProcAddress((HMODULE) handle, name)\n#else\n #define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)\n #define _glfw_dlclose(handle) dlclose(handle)\n #define _glfw_dlsym(handle, name) dlsym(handle, name)\n#endif\n\n// Null-specific per-window data\n//\ntypedef struct _GLFWwindowNull\n{\n    int width;\n    int height;\n} _GLFWwindowNull;\n\n"
  },
  {
    "path": "external/GLFW/src/null_window.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2016 Google Inc.\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n\nstatic int createNativeWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig)\n{\n    window->null.width = wndconfig->width;\n    window->null.height = wndconfig->height;\n\n    return GLFW_TRUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformCreateWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig)\n{\n    if (!createNativeWindow(window, wndconfig))\n        return GLFW_FALSE;\n\n    if (ctxconfig->client != GLFW_NO_API)\n    {\n        if (ctxconfig->source == GLFW_NATIVE_CONTEXT_API ||\n            ctxconfig->source == GLFW_OSMESA_CONTEXT_API)\n        {\n            if (!_glfwInitOSMesa())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE, \"Null: EGL not available\");\n            return GLFW_FALSE;\n        }\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyWindow(_GLFWwindow* window)\n{\n    if (window->context.destroy)\n        window->context.destroy(window);\n}\n\nvoid _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)\n{\n}\n\nvoid _glfwPlatformSetWindowIcon(_GLFWwindow* window, int count,\n                                const GLFWimage* images)\n{\n}\n\nvoid _glfwPlatformSetWindowMonitor(_GLFWwindow* window,\n                                   _GLFWmonitor* monitor,\n                                   int xpos, int ypos,\n                                   int width, int height,\n                                   int refreshRate)\n{\n}\n\nvoid _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)\n{\n}\n\nvoid _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)\n{\n}\n\nvoid _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)\n{\n    if (width)\n        *width = window->null.width;\n    if (height)\n        *height = window->null.height;\n}\n\nvoid _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)\n{\n    window->null.width = width;\n    window->null.height = height;\n}\n\nvoid _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,\n                                      int minwidth, int minheight,\n                                      int maxwidth, int maxheight)\n{\n}\n\nvoid _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int n, int d)\n{\n}\n\nvoid _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)\n{\n    if (width)\n        *width = window->null.width;\n    if (height)\n        *height = window->null.height;\n}\n\nvoid _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,\n                                     int* left, int* top,\n                                     int* right, int* bottom)\n{\n}\n\nvoid _glfwPlatformIconifyWindow(_GLFWwindow* window)\n{\n}\n\nvoid _glfwPlatformRestoreWindow(_GLFWwindow* window)\n{\n}\n\nvoid _glfwPlatformMaximizeWindow(_GLFWwindow* window)\n{\n}\n\nint _glfwPlatformWindowMaximized(_GLFWwindow* window)\n{\n    return GLFW_FALSE;\n}\n\nint _glfwPlatformFramebufferTransparent(_GLFWwindow* window)\n{\n    return GLFW_FALSE;\n}\n\nvoid _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)\n{\n}\n\nvoid _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)\n{\n}\n\nvoid _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)\n{\n}\n\nvoid _glfwPlatformShowWindow(_GLFWwindow* window)\n{\n}\n\n\nvoid _glfwPlatformRequestWindowAttention(_GLFWwindow* window)\n{\n}\n\nvoid _glfwPlatformUnhideWindow(_GLFWwindow* window)\n{\n}\n\nvoid _glfwPlatformHideWindow(_GLFWwindow* window)\n{\n}\n\nvoid _glfwPlatformFocusWindow(_GLFWwindow* window)\n{\n}\n\nint _glfwPlatformWindowFocused(_GLFWwindow* window)\n{\n    return GLFW_FALSE;\n}\n\nint _glfwPlatformWindowIconified(_GLFWwindow* window)\n{\n    return GLFW_FALSE;\n}\n\nint _glfwPlatformWindowVisible(_GLFWwindow* window)\n{\n    return GLFW_FALSE;\n}\n\nvoid _glfwPlatformPollEvents(void)\n{\n}\n\nvoid _glfwPlatformWaitEvents(void)\n{\n}\n\nvoid _glfwPlatformWaitEventsTimeout(double timeout)\n{\n}\n\nvoid _glfwPlatformPostEmptyEvent(void)\n{\n}\n\nvoid _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)\n{\n}\n\nvoid _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)\n{\n}\n\nvoid _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)\n{\n}\n\nint _glfwPlatformCreateCursor(_GLFWcursor* cursor,\n                              const GLFWimage* image,\n                              int xhot, int yhot)\n{\n    return GLFW_TRUE;\n}\n\nint _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)\n{\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyCursor(_GLFWcursor* cursor)\n{\n}\n\nvoid _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)\n{\n}\n\nvoid _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string)\n{\n}\n\nconst char* _glfwPlatformGetClipboardString(_GLFWwindow* window)\n{\n    return NULL;\n}\n\nconst char* _glfwPlatformGetScancodeName(int scancode)\n{\n    return \"\";\n}\n\nint _glfwPlatformGetKeyScancode(int key)\n{\n    return -1;\n}\n\nvoid _glfwPlatformGetRequiredInstanceExtensions(char** extensions)\n{\n}\n\nint _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,\n                                                      VkPhysicalDevice device,\n                                                      uint32_t queuefamily)\n{\n    return GLFW_FALSE;\n}\n\nVkResult _glfwPlatformCreateWindowSurface(VkInstance instance,\n                                          _GLFWwindow* window,\n                                          const VkAllocationCallbacks* allocator,\n                                          VkSurfaceKHR* surface)\n{\n    // This seems like the most appropriate error to return here\n    return VK_ERROR_INITIALIZATION_FAILED;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/osmesa_context.c",
    "content": "//========================================================================\n// GLFW 3.3 OSMesa - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2016 Google Inc.\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n\n#include \"internal.h\"\n\n\nstatic void makeContextCurrentOSMesa(_GLFWwindow* window)\n{\n    if (window)\n    {\n        int width, height;\n        _glfwPlatformGetFramebufferSize(window, &width, &height);\n\n        // Check to see if we need to allocate a new buffer\n        if ((window->context.osmesa.buffer == NULL) ||\n            (width != window->context.osmesa.width) ||\n            (height != window->context.osmesa.height))\n        {\n            free(window->context.osmesa.buffer);\n\n            // Allocate the new buffer (width * height * 8-bit RGBA)\n            window->context.osmesa.buffer = calloc(4, width * height);\n            window->context.osmesa.width  = width;\n            window->context.osmesa.height = height;\n        }\n\n        if (!OSMesaMakeCurrent(window->context.osmesa.handle,\n                               window->context.osmesa.buffer,\n                               GL_UNSIGNED_BYTE,\n                               width, height))\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"OSMesa: Failed to make context current\");\n            return;\n        }\n    }\n\n    _glfwPlatformSetTls(&_glfw.contextSlot, window);\n}\n\nstatic GLFWglproc getProcAddressOSMesa(const char* procname)\n{\n    return (GLFWglproc) OSMesaGetProcAddress(procname);\n}\n\nstatic void destroyContextOSMesa(_GLFWwindow* window)\n{\n    if (window->context.osmesa.handle)\n    {\n        OSMesaDestroyContext(window->context.osmesa.handle);\n        window->context.osmesa.handle = NULL;\n    }\n\n    if (window->context.osmesa.buffer)\n    {\n        free(window->context.osmesa.buffer);\n        window->context.osmesa.width = 0;\n        window->context.osmesa.height = 0;\n    }\n}\n\nstatic void swapBuffersOSMesa(_GLFWwindow* window)\n{\n    // No double buffering on OSMesa\n}\n\nstatic void swapIntervalOSMesa(int interval)\n{\n    // No swap interval on OSMesa\n}\n\nstatic int extensionSupportedOSMesa(const char* extension)\n{\n    // OSMesa does not have extensions\n    return GLFW_FALSE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWbool _glfwInitOSMesa(void)\n{\n    int i;\n    const char* sonames[] =\n    {\n#if defined(_GLFW_OSMESA_LIBRARY)\n        _GLFW_OSMESA_LIBRARY,\n#elif defined(_WIN32)\n        \"libOSMesa.dll\",\n        \"OSMesa.dll\",\n#elif defined(__APPLE__)\n        \"libOSMesa.8.dylib\",\n#elif defined(__CYGWIN__)\n        \"libOSMesa-8.so\",\n#else\n        \"libOSMesa.so.8\",\n        \"libOSMesa.so.6\",\n#endif\n        NULL\n    };\n\n    if (_glfw.osmesa.handle)\n        return GLFW_TRUE;\n\n    for (i = 0;  sonames[i];  i++)\n    {\n        _glfw.osmesa.handle = _glfw_dlopen(sonames[i]);\n        if (_glfw.osmesa.handle)\n            break;\n    }\n\n    if (!_glfw.osmesa.handle)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE, \"OSMesa: Library not found\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.osmesa.CreateContextExt = (PFN_OSMesaCreateContextExt)\n        _glfw_dlsym(_glfw.osmesa.handle, \"OSMesaCreateContextExt\");\n    _glfw.osmesa.CreateContextAttribs = (PFN_OSMesaCreateContextAttribs)\n        _glfw_dlsym(_glfw.osmesa.handle, \"OSMesaCreateContextAttribs\");\n    _glfw.osmesa.DestroyContext = (PFN_OSMesaDestroyContext)\n        _glfw_dlsym(_glfw.osmesa.handle, \"OSMesaDestroyContext\");\n    _glfw.osmesa.MakeCurrent = (PFN_OSMesaMakeCurrent)\n        _glfw_dlsym(_glfw.osmesa.handle, \"OSMesaMakeCurrent\");\n    _glfw.osmesa.GetColorBuffer = (PFN_OSMesaGetColorBuffer)\n        _glfw_dlsym(_glfw.osmesa.handle, \"OSMesaGetColorBuffer\");\n    _glfw.osmesa.GetDepthBuffer = (PFN_OSMesaGetDepthBuffer)\n        _glfw_dlsym(_glfw.osmesa.handle, \"OSMesaGetDepthBuffer\");\n    _glfw.osmesa.GetProcAddress = (PFN_OSMesaGetProcAddress)\n        _glfw_dlsym(_glfw.osmesa.handle, \"OSMesaGetProcAddress\");\n\n    if (!_glfw.osmesa.CreateContextExt ||\n        !_glfw.osmesa.DestroyContext ||\n        !_glfw.osmesa.MakeCurrent ||\n        !_glfw.osmesa.GetColorBuffer ||\n        !_glfw.osmesa.GetDepthBuffer ||\n        !_glfw.osmesa.GetProcAddress)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"OSMesa: Failed to load required entry points\");\n\n        _glfwTerminateOSMesa();\n        return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwTerminateOSMesa(void)\n{\n    if (_glfw.osmesa.handle)\n    {\n        _glfw_dlclose(_glfw.osmesa.handle);\n        _glfw.osmesa.handle = NULL;\n    }\n}\n\n#define setAttrib(a, v) \\\n{ \\\n    assert((size_t) (index + 1) < sizeof(attribs) / sizeof(attribs[0])); \\\n    attribs[index++] = a; \\\n    attribs[index++] = v; \\\n}\n\nGLFWbool _glfwCreateContextOSMesa(_GLFWwindow* window,\n                                  const _GLFWctxconfig* ctxconfig,\n                                  const _GLFWfbconfig* fbconfig)\n{\n    OSMesaContext share = NULL;\n    const int accumBits = fbconfig->accumRedBits +\n                          fbconfig->accumGreenBits +\n                          fbconfig->accumBlueBits +\n                          fbconfig->accumAlphaBits;\n\n    if (ctxconfig->client == GLFW_OPENGL_ES_API)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"OSMesa: OpenGL ES is not available on OSMesa\");\n        return GLFW_FALSE;\n    }\n\n    if (ctxconfig->share)\n        share = ctxconfig->share->context.osmesa.handle;\n\n    if (OSMesaCreateContextAttribs)\n    {\n        int index = 0, attribs[40];\n\n        setAttrib(OSMESA_FORMAT, OSMESA_RGBA);\n        setAttrib(OSMESA_DEPTH_BITS, fbconfig->depthBits);\n        setAttrib(OSMESA_STENCIL_BITS, fbconfig->stencilBits);\n        setAttrib(OSMESA_ACCUM_BITS, accumBits);\n\n        if (ctxconfig->profile == GLFW_OPENGL_CORE_PROFILE)\n        {\n            setAttrib(OSMESA_PROFILE, OSMESA_CORE_PROFILE);\n        }\n        else if (ctxconfig->profile == GLFW_OPENGL_COMPAT_PROFILE)\n        {\n            setAttrib(OSMESA_PROFILE, OSMESA_COMPAT_PROFILE);\n        }\n\n        if (ctxconfig->major != 1 || ctxconfig->minor != 0)\n        {\n            setAttrib(OSMESA_CONTEXT_MAJOR_VERSION, ctxconfig->major);\n            setAttrib(OSMESA_CONTEXT_MINOR_VERSION, ctxconfig->minor);\n        }\n\n        if (ctxconfig->forward)\n        {\n            _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                            \"OSMesa: Foward-compatible contexts not supported\");\n            return GLFW_FALSE;\n        }\n\n        setAttrib(0, 0);\n\n        window->context.osmesa.handle =\n            OSMesaCreateContextAttribs(attribs, share);\n    }\n    else\n    {\n        if (ctxconfig->profile)\n        {\n            _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                            \"OSMesa: OpenGL profiles unavailable\");\n            return GLFW_FALSE;\n        }\n\n        window->context.osmesa.handle =\n            OSMesaCreateContextExt(OSMESA_RGBA,\n                                   fbconfig->depthBits,\n                                   fbconfig->stencilBits,\n                                   accumBits,\n                                   share);\n    }\n\n    if (window->context.osmesa.handle == NULL)\n    {\n        _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                        \"OSMesa: Failed to create context\");\n        return GLFW_FALSE;\n    }\n\n    window->context.makeCurrent = makeContextCurrentOSMesa;\n    window->context.swapBuffers = swapBuffersOSMesa;\n    window->context.swapInterval = swapIntervalOSMesa;\n    window->context.extensionSupported = extensionSupportedOSMesa;\n    window->context.getProcAddress = getProcAddressOSMesa;\n    window->context.destroy = destroyContextOSMesa;\n\n    return GLFW_TRUE;\n}\n\n#undef setAttrib\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* handle, int* width,\n                                     int* height, int* format, void** buffer)\n{\n    void* mesaBuffer;\n    GLint mesaWidth, mesaHeight, mesaFormat;\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n\n    if (!OSMesaGetColorBuffer(window->context.osmesa.handle,\n                              &mesaWidth, &mesaHeight,\n                              &mesaFormat, &mesaBuffer))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"OSMesa: Failed to retrieve color buffer\");\n        return GLFW_FALSE;\n    }\n\n    if (width)\n        *width = mesaWidth;\n    if (height)\n        *height = mesaHeight;\n    if (format)\n        *format = mesaFormat;\n    if (buffer)\n        *buffer = mesaBuffer;\n\n    return GLFW_TRUE;\n}\n\nGLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* handle,\n                                     int* width, int* height,\n                                     int* bytesPerValue,\n                                     void** buffer)\n{\n    void* mesaBuffer;\n    GLint mesaWidth, mesaHeight, mesaBytes;\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n\n    if (!OSMesaGetDepthBuffer(window->context.osmesa.handle,\n                              &mesaWidth, &mesaHeight,\n                              &mesaBytes, &mesaBuffer))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"OSMesa: Failed to retrieve depth buffer\");\n        return GLFW_FALSE;\n    }\n\n    if (width)\n        *width = mesaWidth;\n    if (height)\n        *height = mesaHeight;\n    if (bytesPerValue)\n        *bytesPerValue = mesaBytes;\n    if (buffer)\n        *buffer = mesaBuffer;\n\n    return GLFW_TRUE;\n}\n\nGLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return NULL;\n    }\n\n    return window->context.osmesa.handle;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/osmesa_context.h",
    "content": "//========================================================================\n// GLFW 3.3 OSMesa - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2016 Google Inc.\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define OSMESA_RGBA 0x1908\n#define OSMESA_FORMAT 0x22\n#define OSMESA_DEPTH_BITS 0x30\n#define OSMESA_STENCIL_BITS 0x31\n#define OSMESA_ACCUM_BITS 0x32\n#define OSMESA_PROFILE 0x33\n#define OSMESA_CORE_PROFILE 0x34\n#define OSMESA_COMPAT_PROFILE 0x35\n#define OSMESA_CONTEXT_MAJOR_VERSION 0x36\n#define OSMESA_CONTEXT_MINOR_VERSION 0x37\n\ntypedef void* OSMesaContext;\ntypedef void (*OSMESAproc)();\n\ntypedef OSMesaContext (GLAPIENTRY * PFN_OSMesaCreateContextExt)(GLenum,GLint,GLint,GLint,OSMesaContext);\ntypedef OSMesaContext (GLAPIENTRY * PFN_OSMesaCreateContextAttribs)(const int*,OSMesaContext);\ntypedef void (GLAPIENTRY * PFN_OSMesaDestroyContext)(OSMesaContext);\ntypedef int (GLAPIENTRY * PFN_OSMesaMakeCurrent)(OSMesaContext,void*,int,int,int);\ntypedef int (GLAPIENTRY * PFN_OSMesaGetColorBuffer)(OSMesaContext,int*,int*,int*,void**);\ntypedef int (GLAPIENTRY * PFN_OSMesaGetDepthBuffer)(OSMesaContext,int*,int*,int*,void**);\ntypedef GLFWglproc (GLAPIENTRY * PFN_OSMesaGetProcAddress)(const char*);\n#define OSMesaCreateContextExt _glfw.osmesa.CreateContextExt\n#define OSMesaCreateContextAttribs _glfw.osmesa.CreateContextAttribs\n#define OSMesaDestroyContext _glfw.osmesa.DestroyContext\n#define OSMesaMakeCurrent _glfw.osmesa.MakeCurrent\n#define OSMesaGetColorBuffer _glfw.osmesa.GetColorBuffer\n#define OSMesaGetDepthBuffer _glfw.osmesa.GetDepthBuffer\n#define OSMesaGetProcAddress _glfw.osmesa.GetProcAddress\n\n#define _GLFW_OSMESA_CONTEXT_STATE              _GLFWcontextOSMesa osmesa\n#define _GLFW_OSMESA_LIBRARY_CONTEXT_STATE      _GLFWlibraryOSMesa osmesa\n\n\n// OSMesa-specific per-context data\n//\ntypedef struct _GLFWcontextOSMesa\n{\n    OSMesaContext       handle;\n    int                 width;\n    int                 height;\n    void*               buffer;\n\n} _GLFWcontextOSMesa;\n\n// OSMesa-specific global data\n//\ntypedef struct _GLFWlibraryOSMesa\n{\n    void*           handle;\n\n    PFN_OSMesaCreateContextExt      CreateContextExt;\n    PFN_OSMesaCreateContextAttribs  CreateContextAttribs;\n    PFN_OSMesaDestroyContext        DestroyContext;\n    PFN_OSMesaMakeCurrent           MakeCurrent;\n    PFN_OSMesaGetColorBuffer        GetColorBuffer;\n    PFN_OSMesaGetDepthBuffer        GetDepthBuffer;\n    PFN_OSMesaGetProcAddress        GetProcAddress;\n\n} _GLFWlibraryOSMesa;\n\n\nGLFWbool _glfwInitOSMesa(void);\nvoid _glfwTerminateOSMesa(void);\nGLFWbool _glfwCreateContextOSMesa(_GLFWwindow* window,\n                                  const _GLFWctxconfig* ctxconfig,\n                                  const _GLFWfbconfig* fbconfig);\n\n"
  },
  {
    "path": "external/GLFW/src/posix_thread.c",
    "content": "//========================================================================\n// GLFW 3.3 POSIX - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <assert.h>\n#include <string.h>\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWbool _glfwPlatformCreateTls(_GLFWtls* tls)\n{\n    assert(tls->posix.allocated == GLFW_FALSE);\n\n    if (pthread_key_create(&tls->posix.key, NULL) != 0)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"POSIX: Failed to create context TLS\");\n        return GLFW_FALSE;\n    }\n\n    tls->posix.allocated = GLFW_TRUE;\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyTls(_GLFWtls* tls)\n{\n    if (tls->posix.allocated)\n        pthread_key_delete(tls->posix.key);\n    memset(tls, 0, sizeof(_GLFWtls));\n}\n\nvoid* _glfwPlatformGetTls(_GLFWtls* tls)\n{\n    assert(tls->posix.allocated == GLFW_TRUE);\n    return pthread_getspecific(tls->posix.key);\n}\n\nvoid _glfwPlatformSetTls(_GLFWtls* tls, void* value)\n{\n    assert(tls->posix.allocated == GLFW_TRUE);\n    pthread_setspecific(tls->posix.key, value);\n}\n\nGLFWbool _glfwPlatformCreateMutex(_GLFWmutex* mutex)\n{\n    assert(mutex->posix.allocated == GLFW_FALSE);\n\n    if (pthread_mutex_init(&mutex->posix.handle, NULL) != 0)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR, \"POSIX: Failed to create mutex\");\n        return GLFW_FALSE;\n    }\n\n    return mutex->posix.allocated = GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyMutex(_GLFWmutex* mutex)\n{\n    if (mutex->posix.allocated)\n        pthread_mutex_destroy(&mutex->posix.handle);\n    memset(mutex, 0, sizeof(_GLFWmutex));\n}\n\nvoid _glfwPlatformLockMutex(_GLFWmutex* mutex)\n{\n    assert(mutex->posix.allocated == GLFW_TRUE);\n    pthread_mutex_lock(&mutex->posix.handle);\n}\n\nvoid _glfwPlatformUnlockMutex(_GLFWmutex* mutex)\n{\n    assert(mutex->posix.allocated == GLFW_TRUE);\n    pthread_mutex_unlock(&mutex->posix.handle);\n}\n\n"
  },
  {
    "path": "external/GLFW/src/posix_thread.h",
    "content": "//========================================================================\n// GLFW 3.3 POSIX - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <pthread.h>\n\n#define _GLFW_PLATFORM_TLS_STATE    _GLFWtlsPOSIX   posix\n#define _GLFW_PLATFORM_MUTEX_STATE  _GLFWmutexPOSIX posix\n\n\n// POSIX-specific thread local storage data\n//\ntypedef struct _GLFWtlsPOSIX\n{\n    GLFWbool        allocated;\n    pthread_key_t   key;\n\n} _GLFWtlsPOSIX;\n\n// POSIX-specific mutex data\n//\ntypedef struct _GLFWmutexPOSIX\n{\n    GLFWbool        allocated;\n    pthread_mutex_t handle;\n\n} _GLFWmutexPOSIX;\n\n"
  },
  {
    "path": "external/GLFW/src/posix_time.c",
    "content": "//========================================================================\n// GLFW 3.3 POSIX - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <sys/time.h>\n#include <time.h>\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialise timer\n//\nvoid _glfwInitTimerPOSIX(void)\n{\n#if defined(CLOCK_MONOTONIC)\n    struct timespec ts;\n\n    if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0)\n    {\n        _glfw.timer.posix.monotonic = GLFW_TRUE;\n        _glfw.timer.posix.frequency = 1000000000;\n    }\n    else\n#endif\n    {\n        _glfw.timer.posix.monotonic = GLFW_FALSE;\n        _glfw.timer.posix.frequency = 1000000;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nuint64_t _glfwPlatformGetTimerValue(void)\n{\n#if defined(CLOCK_MONOTONIC)\n    if (_glfw.timer.posix.monotonic)\n    {\n        struct timespec ts;\n        clock_gettime(CLOCK_MONOTONIC, &ts);\n        return (uint64_t) ts.tv_sec * (uint64_t) 1000000000 + (uint64_t) ts.tv_nsec;\n    }\n    else\n#endif\n    {\n        struct timeval tv;\n        gettimeofday(&tv, NULL);\n        return (uint64_t) tv.tv_sec * (uint64_t) 1000000 + (uint64_t) tv.tv_usec;\n    }\n}\n\nuint64_t _glfwPlatformGetTimerFrequency(void)\n{\n    return _glfw.timer.posix.frequency;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/posix_time.h",
    "content": "//========================================================================\n// GLFW 3.3 POSIX - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define _GLFW_PLATFORM_LIBRARY_TIMER_STATE _GLFWtimerPOSIX posix\n\n#include <stdint.h>\n\n\n// POSIX-specific global timer data\n//\ntypedef struct _GLFWtimerPOSIX\n{\n    GLFWbool    monotonic;\n    uint64_t    frequency;\n\n} _GLFWtimerPOSIX;\n\n\nvoid _glfwInitTimerPOSIX(void);\n\n"
  },
  {
    "path": "external/GLFW/src/vulkan.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <assert.h>\n#include <string.h>\n#include <stdlib.h>\n\n#define _GLFW_FIND_LOADER    1\n#define _GLFW_REQUIRE_LOADER 2\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWbool _glfwInitVulkan(int mode)\n{\n    VkResult err;\n    VkExtensionProperties* ep;\n    uint32_t i, count;\n\n    if (_glfw.vk.available)\n        return GLFW_TRUE;\n\n#if !defined(_GLFW_VULKAN_STATIC)\n#if defined(_GLFW_VULKAN_LIBRARY)\n    _glfw.vk.handle = _glfw_dlopen(_GLFW_VULKAN_LIBRARY);\n#elif defined(_GLFW_WIN32)\n    _glfw.vk.handle = _glfw_dlopen(\"vulkan-1.dll\");\n#elif defined(_GLFW_COCOA)\n    _glfw.vk.handle = _glfw_dlopen(\"libMoltenVK.dylib\");\n#else\n    _glfw.vk.handle = _glfw_dlopen(\"libvulkan.so.1\");\n#endif\n    if (!_glfw.vk.handle)\n    {\n        if (mode == _GLFW_REQUIRE_LOADER)\n            _glfwInputError(GLFW_API_UNAVAILABLE, \"Vulkan: Loader not found\");\n\n        return GLFW_FALSE;\n    }\n\n    _glfw.vk.GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)\n        _glfw_dlsym(_glfw.vk.handle, \"vkGetInstanceProcAddr\");\n    if (!_glfw.vk.GetInstanceProcAddr)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Vulkan: Loader does not export vkGetInstanceProcAddr\");\n\n        _glfwTerminateVulkan();\n        return GLFW_FALSE;\n    }\n\n    _glfw.vk.EnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)\n        vkGetInstanceProcAddr(NULL, \"vkEnumerateInstanceExtensionProperties\");\n    if (!_glfw.vk.EnumerateInstanceExtensionProperties)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Vulkan: Failed to retrieve vkEnumerateInstanceExtensionProperties\");\n\n        _glfwTerminateVulkan();\n        return GLFW_FALSE;\n    }\n#endif // _GLFW_VULKAN_STATIC\n\n    err = vkEnumerateInstanceExtensionProperties(NULL, &count, NULL);\n    if (err)\n    {\n        // NOTE: This happens on systems with a loader but without any Vulkan ICD\n        if (mode == _GLFW_REQUIRE_LOADER)\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"Vulkan: Failed to query instance extension count: %s\",\n                            _glfwGetVulkanResultString(err));\n        }\n\n        _glfwTerminateVulkan();\n        return GLFW_FALSE;\n    }\n\n    ep = calloc(count, sizeof(VkExtensionProperties));\n\n    err = vkEnumerateInstanceExtensionProperties(NULL, &count, ep);\n    if (err)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Vulkan: Failed to query instance extensions: %s\",\n                        _glfwGetVulkanResultString(err));\n\n        free(ep);\n        _glfwTerminateVulkan();\n        return GLFW_FALSE;\n    }\n\n    for (i = 0;  i < count;  i++)\n    {\n        if (strcmp(ep[i].extensionName, \"VK_KHR_surface\") == 0)\n            _glfw.vk.KHR_surface = GLFW_TRUE;\n#if defined(_GLFW_WIN32)\n        else if (strcmp(ep[i].extensionName, \"VK_KHR_win32_surface\") == 0)\n            _glfw.vk.KHR_win32_surface = GLFW_TRUE;\n#elif defined(_GLFW_COCOA)\n        else if (strcmp(ep[i].extensionName, \"VK_MVK_macos_surface\") == 0)\n            _glfw.vk.MVK_macos_surface = GLFW_TRUE;\n#elif defined(_GLFW_X11)\n        else if (strcmp(ep[i].extensionName, \"VK_KHR_xlib_surface\") == 0)\n            _glfw.vk.KHR_xlib_surface = GLFW_TRUE;\n        else if (strcmp(ep[i].extensionName, \"VK_KHR_xcb_surface\") == 0)\n            _glfw.vk.KHR_xcb_surface = GLFW_TRUE;\n#elif defined(_GLFW_WAYLAND)\n        else if (strcmp(ep[i].extensionName, \"VK_KHR_wayland_surface\") == 0)\n            _glfw.vk.KHR_wayland_surface = GLFW_TRUE;\n#elif defined(_GLFW_MIR)\n        else if (strcmp(ep[i].extensionName, \"VK_KHR_mir_surface\") == 0)\n            _glfw.vk.KHR_mir_surface = GLFW_TRUE;\n#endif\n    }\n\n    free(ep);\n\n    _glfw.vk.available = GLFW_TRUE;\n\n    _glfwPlatformGetRequiredInstanceExtensions(_glfw.vk.extensions);\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwTerminateVulkan(void)\n{\n#if !defined(_GLFW_VULKAN_STATIC)\n    if (_glfw.vk.handle)\n        _glfw_dlclose(_glfw.vk.handle);\n#endif\n}\n\nconst char* _glfwGetVulkanResultString(VkResult result)\n{\n    switch (result)\n    {\n        case VK_SUCCESS:\n            return \"Success\";\n        case VK_NOT_READY:\n            return \"A fence or query has not yet completed\";\n        case VK_TIMEOUT:\n            return \"A wait operation has not completed in the specified time\";\n        case VK_EVENT_SET:\n            return \"An event is signaled\";\n        case VK_EVENT_RESET:\n            return \"An event is unsignaled\";\n        case VK_INCOMPLETE:\n            return \"A return array was too small for the result\";\n        case VK_ERROR_OUT_OF_HOST_MEMORY:\n            return \"A host memory allocation has failed\";\n        case VK_ERROR_OUT_OF_DEVICE_MEMORY:\n            return \"A device memory allocation has failed\";\n        case VK_ERROR_INITIALIZATION_FAILED:\n            return \"Initialization of an object could not be completed for implementation-specific reasons\";\n        case VK_ERROR_DEVICE_LOST:\n            return \"The logical or physical device has been lost\";\n        case VK_ERROR_MEMORY_MAP_FAILED:\n            return \"Mapping of a memory object has failed\";\n        case VK_ERROR_LAYER_NOT_PRESENT:\n            return \"A requested layer is not present or could not be loaded\";\n        case VK_ERROR_EXTENSION_NOT_PRESENT:\n            return \"A requested extension is not supported\";\n        case VK_ERROR_FEATURE_NOT_PRESENT:\n            return \"A requested feature is not supported\";\n        case VK_ERROR_INCOMPATIBLE_DRIVER:\n            return \"The requested version of Vulkan is not supported by the driver or is otherwise incompatible\";\n        case VK_ERROR_TOO_MANY_OBJECTS:\n            return \"Too many objects of the type have already been created\";\n        case VK_ERROR_FORMAT_NOT_SUPPORTED:\n            return \"A requested format is not supported on this device\";\n        case VK_ERROR_SURFACE_LOST_KHR:\n            return \"A surface is no longer available\";\n        case VK_SUBOPTIMAL_KHR:\n            return \"A swapchain no longer matches the surface properties exactly, but can still be used\";\n        case VK_ERROR_OUT_OF_DATE_KHR:\n            return \"A surface has changed in such a way that it is no longer compatible with the swapchain\";\n        case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR:\n            return \"The display used by a swapchain does not use the same presentable image layout\";\n        case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR:\n            return \"The requested window is already connected to a VkSurfaceKHR, or to some other non-Vulkan API\";\n        case VK_ERROR_VALIDATION_FAILED_EXT:\n            return \"A validation layer found an error\";\n        default:\n            return \"ERROR: UNKNOWN VULKAN ERROR\";\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW public API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI int glfwVulkanSupported(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n    return _glfwInitVulkan(_GLFW_FIND_LOADER);\n}\n\nGLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count)\n{\n    assert(count != NULL);\n\n    *count = 0;\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER))\n        return NULL;\n\n    if (!_glfw.vk.extensions[0])\n        return NULL;\n\n    *count = 2;\n    return (const char**) _glfw.vk.extensions;\n}\n\nGLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance,\n                                              const char* procname)\n{\n    GLFWvkproc proc;\n    assert(procname != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER))\n        return NULL;\n\n    proc = (GLFWvkproc) vkGetInstanceProcAddr(instance, procname);\n#if defined(_GLFW_VULKAN_STATIC)\n    if (!proc)\n    {\n        if (strcmp(procname, \"vkGetInstanceProcAddr\") == 0)\n            return (GLFWvkproc) vkGetInstanceProcAddr;\n    }\n#else\n    if (!proc)\n        proc = (GLFWvkproc) _glfw_dlsym(_glfw.vk.handle, procname);\n#endif\n\n    return proc;\n}\n\nGLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance,\n                                                     VkPhysicalDevice device,\n                                                     uint32_t queuefamily)\n{\n    assert(instance != VK_NULL_HANDLE);\n    assert(device != VK_NULL_HANDLE);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);\n\n    if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER))\n        return GLFW_FALSE;\n\n    if (!_glfw.vk.extensions[0])\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Vulkan: Window surface creation extensions not found\");\n        return GLFW_FALSE;\n    }\n\n    return _glfwPlatformGetPhysicalDevicePresentationSupport(instance,\n                                                             device,\n                                                             queuefamily);\n}\n\nGLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance,\n                                         GLFWwindow* handle,\n                                         const VkAllocationCallbacks* allocator,\n                                         VkSurfaceKHR* surface)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(instance != VK_NULL_HANDLE);\n    assert(window != NULL);\n    assert(surface != NULL);\n\n    *surface = VK_NULL_HANDLE;\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(VK_ERROR_INITIALIZATION_FAILED);\n\n    if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER))\n        return VK_ERROR_INITIALIZATION_FAILED;\n\n    if (!_glfw.vk.extensions[0])\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Vulkan: Window surface creation extensions not found\");\n        return VK_ERROR_EXTENSION_NOT_PRESENT;\n    }\n\n    return _glfwPlatformCreateWindowSurface(instance, window, allocator, surface);\n}\n\n"
  },
  {
    "path": "external/GLFW/src/wgl_context.c",
    "content": "//========================================================================\n// GLFW 3.3 WGL - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdlib.h>\n#include <malloc.h>\n#include <assert.h>\n\n\n// Returns the specified attribute of the specified pixel format\n//\nstatic int getPixelFormatAttrib(_GLFWwindow* window, int pixelFormat, int attrib)\n{\n    int value = 0;\n\n    assert(_glfw.wgl.ARB_pixel_format);\n\n    if (!_glfw.wgl.GetPixelFormatAttribivARB(window->context.wgl.dc,\n                                             pixelFormat,\n                                             0, 1, &attrib, &value))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"WGL: Failed to retrieve pixel format attribute\");\n        return 0;\n    }\n\n    return value;\n}\n\n// Return a list of available and usable framebuffer configs\n//\nstatic int choosePixelFormat(_GLFWwindow* window,\n                             const _GLFWctxconfig* ctxconfig,\n                             const _GLFWfbconfig* fbconfig)\n{\n    _GLFWfbconfig* usableConfigs;\n    const _GLFWfbconfig* closest;\n    int i, pixelFormat, nativeCount, usableCount;\n\n    if (_glfw.wgl.ARB_pixel_format)\n    {\n        nativeCount = getPixelFormatAttrib(window,\n                                           1,\n                                           WGL_NUMBER_PIXEL_FORMATS_ARB);\n    }\n    else\n    {\n        nativeCount = DescribePixelFormat(window->context.wgl.dc,\n                                          1,\n                                          sizeof(PIXELFORMATDESCRIPTOR),\n                                          NULL);\n    }\n\n    usableConfigs = calloc(nativeCount, sizeof(_GLFWfbconfig));\n    usableCount = 0;\n\n    for (i = 0;  i < nativeCount;  i++)\n    {\n        const int n = i + 1;\n        _GLFWfbconfig* u = usableConfigs + usableCount;\n\n        if (_glfw.wgl.ARB_pixel_format)\n        {\n            // Get pixel format attributes through \"modern\" extension\n\n            if (!getPixelFormatAttrib(window, n, WGL_SUPPORT_OPENGL_ARB) ||\n                !getPixelFormatAttrib(window, n, WGL_DRAW_TO_WINDOW_ARB))\n            {\n                continue;\n            }\n\n            if (getPixelFormatAttrib(window, n, WGL_PIXEL_TYPE_ARB) !=\n                WGL_TYPE_RGBA_ARB)\n            {\n                continue;\n            }\n\n            if (getPixelFormatAttrib(window, n, WGL_ACCELERATION_ARB) ==\n                 WGL_NO_ACCELERATION_ARB)\n            {\n                continue;\n            }\n\n            u->redBits = getPixelFormatAttrib(window, n, WGL_RED_BITS_ARB);\n            u->greenBits = getPixelFormatAttrib(window, n, WGL_GREEN_BITS_ARB);\n            u->blueBits = getPixelFormatAttrib(window, n, WGL_BLUE_BITS_ARB);\n            u->alphaBits = getPixelFormatAttrib(window, n, WGL_ALPHA_BITS_ARB);\n\n            u->depthBits = getPixelFormatAttrib(window, n, WGL_DEPTH_BITS_ARB);\n            u->stencilBits = getPixelFormatAttrib(window, n, WGL_STENCIL_BITS_ARB);\n\n            u->accumRedBits = getPixelFormatAttrib(window, n, WGL_ACCUM_RED_BITS_ARB);\n            u->accumGreenBits = getPixelFormatAttrib(window, n, WGL_ACCUM_GREEN_BITS_ARB);\n            u->accumBlueBits = getPixelFormatAttrib(window, n, WGL_ACCUM_BLUE_BITS_ARB);\n            u->accumAlphaBits = getPixelFormatAttrib(window, n, WGL_ACCUM_ALPHA_BITS_ARB);\n\n            u->auxBuffers = getPixelFormatAttrib(window, n, WGL_AUX_BUFFERS_ARB);\n\n            if (getPixelFormatAttrib(window, n, WGL_STEREO_ARB))\n                u->stereo = GLFW_TRUE;\n            if (getPixelFormatAttrib(window, n, WGL_DOUBLE_BUFFER_ARB))\n                u->doublebuffer = GLFW_TRUE;\n\n            if (_glfw.wgl.ARB_multisample)\n                u->samples = getPixelFormatAttrib(window, n, WGL_SAMPLES_ARB);\n\n            if (ctxconfig->client == GLFW_OPENGL_API)\n            {\n                if (_glfw.wgl.ARB_framebuffer_sRGB ||\n                    _glfw.wgl.EXT_framebuffer_sRGB)\n                {\n                    if (getPixelFormatAttrib(window, n, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB))\n                        u->sRGB = GLFW_TRUE;\n                }\n            }\n            else\n            {\n                if (_glfw.wgl.EXT_colorspace)\n                {\n                    if (getPixelFormatAttrib(window, n, WGL_COLORSPACE_EXT) ==\n                        WGL_COLORSPACE_SRGB_EXT)\n                    {\n                        u->sRGB = GLFW_TRUE;\n                    }\n                }\n            }\n        }\n        else\n        {\n            // Get pixel format attributes through legacy PFDs\n\n            PIXELFORMATDESCRIPTOR pfd;\n\n            if (!DescribePixelFormat(window->context.wgl.dc,\n                                     n,\n                                     sizeof(PIXELFORMATDESCRIPTOR),\n                                     &pfd))\n            {\n                continue;\n            }\n\n            if (!(pfd.dwFlags & PFD_DRAW_TO_WINDOW) ||\n                !(pfd.dwFlags & PFD_SUPPORT_OPENGL))\n            {\n                continue;\n            }\n\n            if (!(pfd.dwFlags & PFD_GENERIC_ACCELERATED) &&\n                (pfd.dwFlags & PFD_GENERIC_FORMAT))\n            {\n                continue;\n            }\n\n            if (pfd.iPixelType != PFD_TYPE_RGBA)\n                continue;\n\n            u->redBits = pfd.cRedBits;\n            u->greenBits = pfd.cGreenBits;\n            u->blueBits = pfd.cBlueBits;\n            u->alphaBits = pfd.cAlphaBits;\n\n            u->depthBits = pfd.cDepthBits;\n            u->stencilBits = pfd.cStencilBits;\n\n            u->accumRedBits = pfd.cAccumRedBits;\n            u->accumGreenBits = pfd.cAccumGreenBits;\n            u->accumBlueBits = pfd.cAccumBlueBits;\n            u->accumAlphaBits = pfd.cAccumAlphaBits;\n\n            u->auxBuffers = pfd.cAuxBuffers;\n\n            if (pfd.dwFlags & PFD_STEREO)\n                u->stereo = GLFW_TRUE;\n            if (pfd.dwFlags & PFD_DOUBLEBUFFER)\n                u->doublebuffer = GLFW_TRUE;\n        }\n\n        u->handle = n;\n        usableCount++;\n    }\n\n    if (!usableCount)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"WGL: The driver does not appear to support OpenGL\");\n\n        free(usableConfigs);\n        return 0;\n    }\n\n    closest = _glfwChooseFBConfig(fbconfig, usableConfigs, usableCount);\n    if (!closest)\n    {\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"WGL: Failed to find a suitable pixel format\");\n\n        free(usableConfigs);\n        return 0;\n    }\n\n    pixelFormat = (int) closest->handle;\n    free(usableConfigs);\n\n    return pixelFormat;\n}\n\nstatic void makeContextCurrentWGL(_GLFWwindow* window)\n{\n    if (window)\n    {\n        if (wglMakeCurrent(window->context.wgl.dc, window->context.wgl.handle))\n            _glfwPlatformSetTls(&_glfw.contextSlot, window);\n        else\n        {\n            _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                                 \"WGL: Failed to make context current\");\n            _glfwPlatformSetTls(&_glfw.contextSlot, NULL);\n        }\n    }\n    else\n    {\n        if (!wglMakeCurrent(NULL, NULL))\n        {\n            _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                                 \"WGL: Failed to clear current context\");\n        }\n\n        _glfwPlatformSetTls(&_glfw.contextSlot, NULL);\n    }\n}\n\nstatic void swapBuffersWGL(_GLFWwindow* window)\n{\n    // HACK: Use DwmFlush when desktop composition is enabled\n    if (_glfwIsCompositionEnabledWin32() && !window->monitor)\n    {\n        int count = abs(window->context.wgl.interval);\n        while (count--)\n            DwmFlush();\n    }\n\n    SwapBuffers(window->context.wgl.dc);\n}\n\nstatic void swapIntervalWGL(int interval)\n{\n    _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot);\n\n    window->context.wgl.interval = interval;\n\n    // HACK: Disable WGL swap interval when desktop composition is enabled to\n    //       avoid interfering with DWM vsync\n    if (_glfwIsCompositionEnabledWin32() && !window->monitor)\n        interval = 0;\n\n    if (_glfw.wgl.EXT_swap_control)\n        _glfw.wgl.SwapIntervalEXT(interval);\n}\n\nstatic int extensionSupportedWGL(const char* extension)\n{\n    const char* extensions;\n\n    if (_glfw.wgl.GetExtensionsStringEXT)\n    {\n        extensions = _glfw.wgl.GetExtensionsStringEXT();\n        if (extensions)\n        {\n            if (_glfwStringInExtensionString(extension, extensions))\n                return GLFW_TRUE;\n        }\n    }\n\n    if (_glfw.wgl.GetExtensionsStringARB)\n    {\n        extensions = _glfw.wgl.GetExtensionsStringARB(wglGetCurrentDC());\n        if (extensions)\n        {\n            if (_glfwStringInExtensionString(extension, extensions))\n                return GLFW_TRUE;\n        }\n    }\n\n    return GLFW_FALSE;\n}\n\nstatic GLFWglproc getProcAddressWGL(const char* procname)\n{\n    const GLFWglproc proc = (GLFWglproc) wglGetProcAddress(procname);\n    if (proc)\n        return proc;\n\n    return (GLFWglproc) GetProcAddress(_glfw.wgl.instance, procname);\n}\n\n// Destroy the OpenGL context\n//\nstatic void destroyContextWGL(_GLFWwindow* window)\n{\n    if (window->context.wgl.handle)\n    {\n        wglDeleteContext(window->context.wgl.handle);\n        window->context.wgl.handle = NULL;\n    }\n}\n\n// Initialize WGL-specific extensions\n//\nstatic void loadWGLExtensions(void)\n{\n    PIXELFORMATDESCRIPTOR pfd;\n    HGLRC rc;\n    HDC dc = GetDC(_glfw.win32.helperWindowHandle);;\n\n    _glfw.wgl.extensionsLoaded = GLFW_TRUE;\n\n    // NOTE: A dummy context has to be created for opengl32.dll to load the\n    //       OpenGL ICD, from which we can then query WGL extensions\n    // NOTE: This code will accept the Microsoft GDI ICD; accelerated context\n    //       creation failure occurs during manual pixel format enumeration\n\n    ZeroMemory(&pfd, sizeof(pfd));\n    pfd.nSize = sizeof(pfd);\n    pfd.nVersion = 1;\n    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;\n    pfd.iPixelType = PFD_TYPE_RGBA;\n    pfd.cColorBits = 24;\n\n    if (!SetPixelFormat(dc, ChoosePixelFormat(dc, &pfd), &pfd))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"WGL: Failed to set pixel format for dummy context\");\n        return;\n    }\n\n    rc = wglCreateContext(dc);\n    if (!rc)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"WGL: Failed to create dummy context\");\n        return;\n    }\n\n    if (!wglMakeCurrent(dc, rc))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"WGL: Failed to make dummy context current\");\n        wglDeleteContext(rc);\n        return;\n    }\n\n    // NOTE: Functions must be loaded first as they're needed to retrieve the\n    //       extension string that tells us whether the functions are supported\n    _glfw.wgl.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)\n        wglGetProcAddress(\"wglGetExtensionsStringEXT\");\n    _glfw.wgl.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)\n        wglGetProcAddress(\"wglGetExtensionsStringARB\");\n    _glfw.wgl.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)\n        wglGetProcAddress(\"wglCreateContextAttribsARB\");\n    _glfw.wgl.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)\n        wglGetProcAddress(\"wglSwapIntervalEXT\");\n    _glfw.wgl.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)\n        wglGetProcAddress(\"wglGetPixelFormatAttribivARB\");\n\n    // NOTE: WGL_ARB_extensions_string and WGL_EXT_extensions_string are not\n    //       checked below as we are already using them\n    _glfw.wgl.ARB_multisample =\n        extensionSupportedWGL(\"WGL_ARB_multisample\");\n    _glfw.wgl.ARB_framebuffer_sRGB =\n        extensionSupportedWGL(\"WGL_ARB_framebuffer_sRGB\");\n    _glfw.wgl.EXT_framebuffer_sRGB =\n        extensionSupportedWGL(\"WGL_EXT_framebuffer_sRGB\");\n    _glfw.wgl.ARB_create_context =\n        extensionSupportedWGL(\"WGL_ARB_create_context\");\n    _glfw.wgl.ARB_create_context_profile =\n        extensionSupportedWGL(\"WGL_ARB_create_context_profile\");\n    _glfw.wgl.EXT_create_context_es2_profile =\n        extensionSupportedWGL(\"WGL_EXT_create_context_es2_profile\");\n    _glfw.wgl.ARB_create_context_robustness =\n        extensionSupportedWGL(\"WGL_ARB_create_context_robustness\");\n    _glfw.wgl.ARB_create_context_no_error =\n        extensionSupportedWGL(\"WGL_ARB_create_context_no_error\");\n    _glfw.wgl.EXT_swap_control =\n        extensionSupportedWGL(\"WGL_EXT_swap_control\");\n    _glfw.wgl.EXT_colorspace =\n        extensionSupportedWGL(\"WGL_EXT_colorspace\");\n    _glfw.wgl.ARB_pixel_format =\n        extensionSupportedWGL(\"WGL_ARB_pixel_format\");\n    _glfw.wgl.ARB_context_flush_control =\n        extensionSupportedWGL(\"WGL_ARB_context_flush_control\");\n\n    wglMakeCurrent(dc, NULL);\n    wglDeleteContext(rc);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialize WGL\n//\nGLFWbool _glfwInitWGL(void)\n{\n    if (_glfw.wgl.instance)\n        return GLFW_TRUE;\n\n    _glfw.wgl.instance = LoadLibraryA(\"opengl32.dll\");\n    if (!_glfw.wgl.instance)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"WGL: Failed to load opengl32.dll\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.wgl.CreateContext = (PFN_wglCreateContext)\n        GetProcAddress(_glfw.wgl.instance, \"wglCreateContext\");\n    _glfw.wgl.DeleteContext = (PFN_wglDeleteContext)\n        GetProcAddress(_glfw.wgl.instance, \"wglDeleteContext\");\n    _glfw.wgl.GetProcAddress = (PFN_wglGetProcAddress)\n        GetProcAddress(_glfw.wgl.instance, \"wglGetProcAddress\");\n    _glfw.wgl.GetCurrentDC = (PFN_wglGetCurrentDC)\n        GetProcAddress(_glfw.wgl.instance, \"wglGetCurrentDC\");\n    _glfw.wgl.MakeCurrent = (PFN_wglMakeCurrent)\n        GetProcAddress(_glfw.wgl.instance, \"wglMakeCurrent\");\n    _glfw.wgl.ShareLists = (PFN_wglShareLists)\n        GetProcAddress(_glfw.wgl.instance, \"wglShareLists\");\n\n    return GLFW_TRUE;\n}\n\n// Terminate WGL\n//\nvoid _glfwTerminateWGL(void)\n{\n    if (_glfw.wgl.instance)\n        FreeLibrary(_glfw.wgl.instance);\n}\n\n#define setAttrib(a, v) \\\n{ \\\n    assert((size_t) (index + 1) < sizeof(attribs) / sizeof(attribs[0])); \\\n    attribs[index++] = a; \\\n    attribs[index++] = v; \\\n}\n\n// Create the OpenGL or OpenGL ES context\n//\nGLFWbool _glfwCreateContextWGL(_GLFWwindow* window,\n                               const _GLFWctxconfig* ctxconfig,\n                               const _GLFWfbconfig* fbconfig)\n{\n    int attribs[40];\n    int pixelFormat;\n    PIXELFORMATDESCRIPTOR pfd;\n    HGLRC share = NULL;\n\n    if (!_glfw.wgl.extensionsLoaded)\n        loadWGLExtensions();\n\n    if (ctxconfig->share)\n        share = ctxconfig->share->context.wgl.handle;\n\n    window->context.wgl.dc = GetDC(window->win32.handle);\n    if (!window->context.wgl.dc)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"WGL: Failed to retrieve DC for window\");\n        return GLFW_FALSE;\n    }\n\n    pixelFormat = choosePixelFormat(window, ctxconfig, fbconfig);\n    if (!pixelFormat)\n        return GLFW_FALSE;\n\n    if (!DescribePixelFormat(window->context.wgl.dc,\n                             pixelFormat, sizeof(pfd), &pfd))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"WGL: Failed to retrieve PFD for selected pixel format\");\n        return GLFW_FALSE;\n    }\n\n    if (!SetPixelFormat(window->context.wgl.dc, pixelFormat, &pfd))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"WGL: Failed to set selected pixel format\");\n        return GLFW_FALSE;\n    }\n\n    if (ctxconfig->client == GLFW_OPENGL_API)\n    {\n        if (ctxconfig->forward)\n        {\n            if (!_glfw.wgl.ARB_create_context)\n            {\n                _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                                \"WGL: A forward compatible OpenGL context requested but WGL_ARB_create_context is unavailable\");\n                return GLFW_FALSE;\n            }\n        }\n\n        if (ctxconfig->profile)\n        {\n            if (!_glfw.wgl.ARB_create_context_profile)\n            {\n                _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                                \"WGL: OpenGL profile requested but WGL_ARB_create_context_profile is unavailable\");\n                return GLFW_FALSE;\n            }\n        }\n    }\n    else\n    {\n        if (!_glfw.wgl.ARB_create_context ||\n            !_glfw.wgl.ARB_create_context_profile ||\n            !_glfw.wgl.EXT_create_context_es2_profile)\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"WGL: OpenGL ES requested but WGL_ARB_create_context_es2_profile is unavailable\");\n            return GLFW_FALSE;\n        }\n    }\n\n    if (_glfw.wgl.ARB_create_context)\n    {\n        int index = 0, mask = 0, flags = 0;\n\n        if (ctxconfig->client == GLFW_OPENGL_API)\n        {\n            if (ctxconfig->forward)\n                flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;\n\n            if (ctxconfig->profile == GLFW_OPENGL_CORE_PROFILE)\n                mask |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;\n            else if (ctxconfig->profile == GLFW_OPENGL_COMPAT_PROFILE)\n                mask |= WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;\n        }\n        else\n            mask |= WGL_CONTEXT_ES2_PROFILE_BIT_EXT;\n\n        if (ctxconfig->debug)\n            flags |= WGL_CONTEXT_DEBUG_BIT_ARB;\n\n        if (ctxconfig->robustness)\n        {\n            if (_glfw.wgl.ARB_create_context_robustness)\n            {\n                if (ctxconfig->robustness == GLFW_NO_RESET_NOTIFICATION)\n                {\n                    setAttrib(WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB,\n                              WGL_NO_RESET_NOTIFICATION_ARB);\n                }\n                else if (ctxconfig->robustness == GLFW_LOSE_CONTEXT_ON_RESET)\n                {\n                    setAttrib(WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB,\n                              WGL_LOSE_CONTEXT_ON_RESET_ARB);\n                }\n\n                flags |= WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB;\n            }\n        }\n\n        if (ctxconfig->release)\n        {\n            if (_glfw.wgl.ARB_context_flush_control)\n            {\n                if (ctxconfig->release == GLFW_RELEASE_BEHAVIOR_NONE)\n                {\n                    setAttrib(WGL_CONTEXT_RELEASE_BEHAVIOR_ARB,\n                              WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB);\n                }\n                else if (ctxconfig->release == GLFW_RELEASE_BEHAVIOR_FLUSH)\n                {\n                    setAttrib(WGL_CONTEXT_RELEASE_BEHAVIOR_ARB,\n                              WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB);\n                }\n            }\n        }\n\n        if (ctxconfig->noerror)\n        {\n            if (_glfw.wgl.ARB_create_context_no_error)\n                setAttrib(WGL_CONTEXT_OPENGL_NO_ERROR_ARB, GLFW_TRUE);\n        }\n\n        // NOTE: Only request an explicitly versioned context when necessary, as\n        //       explicitly requesting version 1.0 does not always return the\n        //       highest version supported by the driver\n        if (ctxconfig->major != 1 || ctxconfig->minor != 0)\n        {\n            setAttrib(WGL_CONTEXT_MAJOR_VERSION_ARB, ctxconfig->major);\n            setAttrib(WGL_CONTEXT_MINOR_VERSION_ARB, ctxconfig->minor);\n        }\n\n        if (flags)\n            setAttrib(WGL_CONTEXT_FLAGS_ARB, flags);\n\n        if (mask)\n            setAttrib(WGL_CONTEXT_PROFILE_MASK_ARB, mask);\n\n        setAttrib(0, 0);\n\n        window->context.wgl.handle =\n            _glfw.wgl.CreateContextAttribsARB(window->context.wgl.dc,\n                                              share, attribs);\n        if (!window->context.wgl.handle)\n        {\n            const DWORD error = GetLastError();\n\n            if (error == (0xc0070000 | ERROR_INVALID_VERSION_ARB))\n            {\n                if (ctxconfig->client == GLFW_OPENGL_API)\n                {\n                    _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                                    \"WGL: Driver does not support OpenGL version %i.%i\",\n                                    ctxconfig->major,\n                                    ctxconfig->minor);\n                }\n                else\n                {\n                    _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                                    \"WGL: Driver does not support OpenGL ES version %i.%i\",\n                                    ctxconfig->major,\n                                    ctxconfig->minor);\n                }\n            }\n            else if (error == (0xc0070000 | ERROR_INVALID_PROFILE_ARB))\n            {\n                _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                                \"WGL: Driver does not support the requested OpenGL profile\");\n            }\n            else if (error == (0xc0070000 | ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB))\n            {\n                _glfwInputError(GLFW_INVALID_VALUE,\n                                \"WGL: The share context is not compatible with the requested context\");\n            }\n            else\n            {\n                if (ctxconfig->client == GLFW_OPENGL_API)\n                {\n                    _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                                    \"WGL: Failed to create OpenGL context\");\n                }\n                else\n                {\n                    _glfwInputError(GLFW_VERSION_UNAVAILABLE,\n                                    \"WGL: Failed to create OpenGL ES context\");\n                }\n            }\n\n            return GLFW_FALSE;\n        }\n    }\n    else\n    {\n        window->context.wgl.handle = wglCreateContext(window->context.wgl.dc);\n        if (!window->context.wgl.handle)\n        {\n            _glfwInputErrorWin32(GLFW_VERSION_UNAVAILABLE,\n                                 \"WGL: Failed to create OpenGL context\");\n            return GLFW_FALSE;\n        }\n\n        if (share)\n        {\n            if (!wglShareLists(share, window->context.wgl.handle))\n            {\n                _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                                     \"WGL: Failed to enable sharing with specified OpenGL context\");\n                return GLFW_FALSE;\n            }\n        }\n    }\n\n    window->context.makeCurrent = makeContextCurrentWGL;\n    window->context.swapBuffers = swapBuffersWGL;\n    window->context.swapInterval = swapIntervalWGL;\n    window->context.extensionSupported = extensionSupportedWGL;\n    window->context.getProcAddress = getProcAddressWGL;\n    window->context.destroy = destroyContextWGL;\n\n    return GLFW_TRUE;\n}\n\n#undef setAttrib\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (window->context.client == GLFW_NO_API)\n    {\n        _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n        return NULL;\n    }\n\n    return window->context.wgl.handle;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/wgl_context.h",
    "content": "//========================================================================\n// GLFW 3.3 WGL - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000\n#define WGL_SUPPORT_OPENGL_ARB 0x2010\n#define WGL_DRAW_TO_WINDOW_ARB 0x2001\n#define WGL_PIXEL_TYPE_ARB 0x2013\n#define WGL_TYPE_RGBA_ARB 0x202b\n#define WGL_ACCELERATION_ARB 0x2003\n#define WGL_NO_ACCELERATION_ARB 0x2025\n#define WGL_RED_BITS_ARB 0x2015\n#define WGL_RED_SHIFT_ARB 0x2016\n#define WGL_GREEN_BITS_ARB 0x2017\n#define WGL_GREEN_SHIFT_ARB 0x2018\n#define WGL_BLUE_BITS_ARB 0x2019\n#define WGL_BLUE_SHIFT_ARB 0x201a\n#define WGL_ALPHA_BITS_ARB 0x201b\n#define WGL_ALPHA_SHIFT_ARB 0x201c\n#define WGL_ACCUM_BITS_ARB 0x201d\n#define WGL_ACCUM_RED_BITS_ARB 0x201e\n#define WGL_ACCUM_GREEN_BITS_ARB 0x201f\n#define WGL_ACCUM_BLUE_BITS_ARB 0x2020\n#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021\n#define WGL_DEPTH_BITS_ARB 0x2022\n#define WGL_STENCIL_BITS_ARB 0x2023\n#define WGL_AUX_BUFFERS_ARB 0x2024\n#define WGL_STEREO_ARB 0x2012\n#define WGL_DOUBLE_BUFFER_ARB 0x2011\n#define WGL_SAMPLES_ARB 0x2042\n#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20a9\n#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001\n#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002\n#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126\n#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\n#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\n#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091\n#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092\n#define WGL_CONTEXT_FLAGS_ARB 0x2094\n#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004\n#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004\n#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252\n#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261\n#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097\n#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0\n#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098\n#define WGL_CONTEXT_OPENGL_NO_ERROR_ARB 0x31b3\n#define WGL_COLORSPACE_EXT 0x309d\n#define WGL_COLORSPACE_SRGB_EXT 0x3089\n\n#define ERROR_INVALID_VERSION_ARB 0x2095\n#define ERROR_INVALID_PROFILE_ARB 0x2096\n#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054\n\ntypedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC)(int);\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC,int,int,UINT,const int*,int*);\ntypedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void);\ntypedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC);\ntypedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC,HGLRC,const int*);\n\ntypedef HGLRC (WINAPI * PFN_wglCreateContext)(HDC);\ntypedef BOOL (WINAPI * PFN_wglDeleteContext)(HGLRC);\ntypedef PROC (WINAPI * PFN_wglGetProcAddress)(LPCSTR);\ntypedef HDC (WINAPI * PFN_wglGetCurrentDC)(void);\ntypedef BOOL (WINAPI * PFN_wglMakeCurrent)(HDC,HGLRC);\ntypedef BOOL (WINAPI * PFN_wglShareLists)(HGLRC,HGLRC);\n\n// opengl32.dll function pointer typedefs\n#define wglCreateContext _glfw.wgl.CreateContext\n#define wglDeleteContext _glfw.wgl.DeleteContext\n#define wglGetProcAddress _glfw.wgl.GetProcAddress\n#define wglGetCurrentDC _glfw.wgl.GetCurrentDC\n#define wglMakeCurrent _glfw.wgl.MakeCurrent\n#define wglShareLists _glfw.wgl.ShareLists\n\n#define _GLFW_RECREATION_NOT_NEEDED 0\n#define _GLFW_RECREATION_REQUIRED   1\n#define _GLFW_RECREATION_IMPOSSIBLE 2\n\n#define _GLFW_PLATFORM_CONTEXT_STATE            _GLFWcontextWGL wgl\n#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE    _GLFWlibraryWGL wgl\n\n\n// WGL-specific per-context data\n//\ntypedef struct _GLFWcontextWGL\n{\n    HDC       dc;\n    HGLRC     handle;\n    int       interval;\n\n} _GLFWcontextWGL;\n\n// WGL-specific global data\n//\ntypedef struct _GLFWlibraryWGL\n{\n    HINSTANCE                           instance;\n    PFN_wglCreateContext                CreateContext;\n    PFN_wglDeleteContext                DeleteContext;\n    PFN_wglGetProcAddress               GetProcAddress;\n    PFN_wglGetCurrentDC                 GetCurrentDC;\n    PFN_wglMakeCurrent                  MakeCurrent;\n    PFN_wglShareLists                   ShareLists;\n\n    GLFWbool                            extensionsLoaded;\n\n    PFNWGLSWAPINTERVALEXTPROC           SwapIntervalEXT;\n    PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB;\n    PFNWGLGETEXTENSIONSSTRINGEXTPROC    GetExtensionsStringEXT;\n    PFNWGLGETEXTENSIONSSTRINGARBPROC    GetExtensionsStringARB;\n    PFNWGLCREATECONTEXTATTRIBSARBPROC   CreateContextAttribsARB;\n    GLFWbool                            EXT_swap_control;\n    GLFWbool                            EXT_colorspace;\n    GLFWbool                            ARB_multisample;\n    GLFWbool                            ARB_framebuffer_sRGB;\n    GLFWbool                            EXT_framebuffer_sRGB;\n    GLFWbool                            ARB_pixel_format;\n    GLFWbool                            ARB_create_context;\n    GLFWbool                            ARB_create_context_profile;\n    GLFWbool                            EXT_create_context_es2_profile;\n    GLFWbool                            ARB_create_context_robustness;\n    GLFWbool                            ARB_create_context_no_error;\n    GLFWbool                            ARB_context_flush_control;\n\n} _GLFWlibraryWGL;\n\n\nGLFWbool _glfwInitWGL(void);\nvoid _glfwTerminateWGL(void);\nGLFWbool _glfwCreateContextWGL(_GLFWwindow* window,\n                               const _GLFWctxconfig* ctxconfig,\n                               const _GLFWfbconfig* fbconfig);\n\n"
  },
  {
    "path": "external/GLFW/src/win32_init.c",
    "content": "//========================================================================\n// GLFW 3.3 Win32 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdlib.h>\n#include <malloc.h>\n\nstatic const GUID _glfw_GUID_DEVINTERFACE_HID =\n    {0x4d1e55b2,0xf16f,0x11cf,{0x88,0xcb,0x00,0x11,0x11,0x00,0x00,0x30}};\n\n#define GUID_DEVINTERFACE_HID _glfw_GUID_DEVINTERFACE_HID\n\n#if defined(_GLFW_USE_HYBRID_HPG) || defined(_GLFW_USE_OPTIMUS_HPG)\n\n// Executables (but not DLLs) exporting this symbol with this value will be\n// automatically directed to the high-performance GPU on Nvidia Optimus systems\n// with up-to-date drivers\n//\n__declspec(dllexport) DWORD NvOptimusEnablement = 1;\n\n// Executables (but not DLLs) exporting this symbol with this value will be\n// automatically directed to the high-performance GPU on AMD PowerXpress systems\n// with up-to-date drivers\n//\n__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;\n\n#endif // _GLFW_USE_HYBRID_HPG\n\n#if defined(_GLFW_BUILD_DLL)\n\n// GLFW DLL entry point\n//\nBOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)\n{\n    return TRUE;\n}\n\n#endif // _GLFW_BUILD_DLL\n\n// HACK: Define versionhelpers.h functions manually as MinGW lacks the header\nBOOL IsWindowsVersionOrGreater(WORD major, WORD minor, WORD sp)\n{\n    OSVERSIONINFOEXW osvi = { sizeof(osvi), major, minor, 0, 0, {0}, sp };\n    DWORD mask = VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR;\n    ULONGLONG cond = VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL);\n    cond = VerSetConditionMask(cond, VER_MINORVERSION, VER_GREATER_EQUAL);\n    cond = VerSetConditionMask(cond, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);\n    return VerifyVersionInfoW(&osvi, mask, cond);\n}\n\n// Load necessary libraries (DLLs)\n//\nstatic GLFWbool loadLibraries(void)\n{\n    _glfw.win32.winmm.instance = LoadLibraryA(\"winmm.dll\");\n    if (!_glfw.win32.winmm.instance)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to load winmm.dll\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.win32.winmm.GetTime = (PFN_timeGetTime)\n        GetProcAddress(_glfw.win32.winmm.instance, \"timeGetTime\");\n\n    _glfw.win32.user32.instance = LoadLibraryA(\"user32.dll\");\n    if (!_glfw.win32.user32.instance)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to load user32.dll\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.win32.user32.SetProcessDPIAware_ = (PFN_SetProcessDPIAware)\n        GetProcAddress(_glfw.win32.user32.instance, \"SetProcessDPIAware\");\n    _glfw.win32.user32.ChangeWindowMessageFilterEx_ = (PFN_ChangeWindowMessageFilterEx)\n        GetProcAddress(_glfw.win32.user32.instance, \"ChangeWindowMessageFilterEx\");\n\n    _glfw.win32.dinput8.instance = LoadLibraryA(\"dinput8.dll\");\n    if (_glfw.win32.dinput8.instance)\n    {\n        _glfw.win32.dinput8.Create = (PFN_DirectInput8Create)\n            GetProcAddress(_glfw.win32.dinput8.instance, \"DirectInput8Create\");\n    }\n\n    {\n        int i;\n        const char* names[] =\n        {\n            \"xinput1_4.dll\",\n            \"xinput1_3.dll\",\n            \"xinput9_1_0.dll\",\n            \"xinput1_2.dll\",\n            \"xinput1_1.dll\",\n            NULL\n        };\n\n        for (i = 0;  names[i];  i++)\n        {\n            _glfw.win32.xinput.instance = LoadLibraryA(names[i]);\n            if (_glfw.win32.xinput.instance)\n            {\n                _glfw.win32.xinput.GetCapabilities = (PFN_XInputGetCapabilities)\n                    GetProcAddress(_glfw.win32.xinput.instance, \"XInputGetCapabilities\");\n                _glfw.win32.xinput.GetState = (PFN_XInputGetState)\n                    GetProcAddress(_glfw.win32.xinput.instance, \"XInputGetState\");\n\n                break;\n            }\n        }\n    }\n\n    _glfw.win32.dwmapi.instance = LoadLibraryA(\"dwmapi.dll\");\n    if (_glfw.win32.dwmapi.instance)\n    {\n        _glfw.win32.dwmapi.IsCompositionEnabled = (PFN_DwmIsCompositionEnabled)\n            GetProcAddress(_glfw.win32.dwmapi.instance, \"DwmIsCompositionEnabled\");\n        _glfw.win32.dwmapi.Flush = (PFN_DwmFlush)\n            GetProcAddress(_glfw.win32.dwmapi.instance, \"DwmFlush\");\n        _glfw.win32.dwmapi.EnableBlurBehindWindow = (PFN_DwmEnableBlurBehindWindow)\n            GetProcAddress(_glfw.win32.dwmapi.instance, \"DwmEnableBlurBehindWindow\");\n    }\n\n    _glfw.win32.shcore.instance = LoadLibraryA(\"shcore.dll\");\n    if (_glfw.win32.shcore.instance)\n    {\n        _glfw.win32.shcore.SetProcessDpiAwareness_ = (PFN_SetProcessDpiAwareness)\n            GetProcAddress(_glfw.win32.shcore.instance, \"SetProcessDpiAwareness\");\n    }\n\n    return GLFW_TRUE;\n}\n\n// Unload used libraries (DLLs)\n//\nstatic void freeLibraries(void)\n{\n    if (_glfw.win32.xinput.instance)\n        FreeLibrary(_glfw.win32.xinput.instance);\n\n    if (_glfw.win32.dinput8.instance)\n        FreeLibrary(_glfw.win32.dinput8.instance);\n\n    if (_glfw.win32.winmm.instance)\n        FreeLibrary(_glfw.win32.winmm.instance);\n\n    if (_glfw.win32.user32.instance)\n        FreeLibrary(_glfw.win32.user32.instance);\n\n    if (_glfw.win32.dwmapi.instance)\n        FreeLibrary(_glfw.win32.dwmapi.instance);\n\n    if (_glfw.win32.shcore.instance)\n        FreeLibrary(_glfw.win32.shcore.instance);\n}\n\n// Create key code translation tables\n//\nstatic void createKeyTables(void)\n{\n    int scancode;\n\n    memset(_glfw.win32.keycodes, -1, sizeof(_glfw.win32.keycodes));\n    memset(_glfw.win32.scancodes, -1, sizeof(_glfw.win32.scancodes));\n\n    _glfw.win32.keycodes[0x00B] = GLFW_KEY_0;\n    _glfw.win32.keycodes[0x002] = GLFW_KEY_1;\n    _glfw.win32.keycodes[0x003] = GLFW_KEY_2;\n    _glfw.win32.keycodes[0x004] = GLFW_KEY_3;\n    _glfw.win32.keycodes[0x005] = GLFW_KEY_4;\n    _glfw.win32.keycodes[0x006] = GLFW_KEY_5;\n    _glfw.win32.keycodes[0x007] = GLFW_KEY_6;\n    _glfw.win32.keycodes[0x008] = GLFW_KEY_7;\n    _glfw.win32.keycodes[0x009] = GLFW_KEY_8;\n    _glfw.win32.keycodes[0x00A] = GLFW_KEY_9;\n    _glfw.win32.keycodes[0x01E] = GLFW_KEY_A;\n    _glfw.win32.keycodes[0x030] = GLFW_KEY_B;\n    _glfw.win32.keycodes[0x02E] = GLFW_KEY_C;\n    _glfw.win32.keycodes[0x020] = GLFW_KEY_D;\n    _glfw.win32.keycodes[0x012] = GLFW_KEY_E;\n    _glfw.win32.keycodes[0x021] = GLFW_KEY_F;\n    _glfw.win32.keycodes[0x022] = GLFW_KEY_G;\n    _glfw.win32.keycodes[0x023] = GLFW_KEY_H;\n    _glfw.win32.keycodes[0x017] = GLFW_KEY_I;\n    _glfw.win32.keycodes[0x024] = GLFW_KEY_J;\n    _glfw.win32.keycodes[0x025] = GLFW_KEY_K;\n    _glfw.win32.keycodes[0x026] = GLFW_KEY_L;\n    _glfw.win32.keycodes[0x032] = GLFW_KEY_M;\n    _glfw.win32.keycodes[0x031] = GLFW_KEY_N;\n    _glfw.win32.keycodes[0x018] = GLFW_KEY_O;\n    _glfw.win32.keycodes[0x019] = GLFW_KEY_P;\n    _glfw.win32.keycodes[0x010] = GLFW_KEY_Q;\n    _glfw.win32.keycodes[0x013] = GLFW_KEY_R;\n    _glfw.win32.keycodes[0x01F] = GLFW_KEY_S;\n    _glfw.win32.keycodes[0x014] = GLFW_KEY_T;\n    _glfw.win32.keycodes[0x016] = GLFW_KEY_U;\n    _glfw.win32.keycodes[0x02F] = GLFW_KEY_V;\n    _glfw.win32.keycodes[0x011] = GLFW_KEY_W;\n    _glfw.win32.keycodes[0x02D] = GLFW_KEY_X;\n    _glfw.win32.keycodes[0x015] = GLFW_KEY_Y;\n    _glfw.win32.keycodes[0x02C] = GLFW_KEY_Z;\n\n    _glfw.win32.keycodes[0x028] = GLFW_KEY_APOSTROPHE;\n    _glfw.win32.keycodes[0x02B] = GLFW_KEY_BACKSLASH;\n    _glfw.win32.keycodes[0x033] = GLFW_KEY_COMMA;\n    _glfw.win32.keycodes[0x00D] = GLFW_KEY_EQUAL;\n    _glfw.win32.keycodes[0x029] = GLFW_KEY_GRAVE_ACCENT;\n    _glfw.win32.keycodes[0x01A] = GLFW_KEY_LEFT_BRACKET;\n    _glfw.win32.keycodes[0x00C] = GLFW_KEY_MINUS;\n    _glfw.win32.keycodes[0x034] = GLFW_KEY_PERIOD;\n    _glfw.win32.keycodes[0x01B] = GLFW_KEY_RIGHT_BRACKET;\n    _glfw.win32.keycodes[0x027] = GLFW_KEY_SEMICOLON;\n    _glfw.win32.keycodes[0x035] = GLFW_KEY_SLASH;\n    _glfw.win32.keycodes[0x056] = GLFW_KEY_WORLD_2;\n\n    _glfw.win32.keycodes[0x00E] = GLFW_KEY_BACKSPACE;\n    _glfw.win32.keycodes[0x153] = GLFW_KEY_DELETE;\n    _glfw.win32.keycodes[0x14F] = GLFW_KEY_END;\n    _glfw.win32.keycodes[0x01C] = GLFW_KEY_ENTER;\n    _glfw.win32.keycodes[0x001] = GLFW_KEY_ESCAPE;\n    _glfw.win32.keycodes[0x147] = GLFW_KEY_HOME;\n    _glfw.win32.keycodes[0x152] = GLFW_KEY_INSERT;\n    _glfw.win32.keycodes[0x15D] = GLFW_KEY_MENU;\n    _glfw.win32.keycodes[0x151] = GLFW_KEY_PAGE_DOWN;\n    _glfw.win32.keycodes[0x149] = GLFW_KEY_PAGE_UP;\n    _glfw.win32.keycodes[0x045] = GLFW_KEY_PAUSE;\n    _glfw.win32.keycodes[0x146] = GLFW_KEY_PAUSE;\n    _glfw.win32.keycodes[0x039] = GLFW_KEY_SPACE;\n    _glfw.win32.keycodes[0x00F] = GLFW_KEY_TAB;\n    _glfw.win32.keycodes[0x03A] = GLFW_KEY_CAPS_LOCK;\n    _glfw.win32.keycodes[0x145] = GLFW_KEY_NUM_LOCK;\n    _glfw.win32.keycodes[0x046] = GLFW_KEY_SCROLL_LOCK;\n    _glfw.win32.keycodes[0x03B] = GLFW_KEY_F1;\n    _glfw.win32.keycodes[0x03C] = GLFW_KEY_F2;\n    _glfw.win32.keycodes[0x03D] = GLFW_KEY_F3;\n    _glfw.win32.keycodes[0x03E] = GLFW_KEY_F4;\n    _glfw.win32.keycodes[0x03F] = GLFW_KEY_F5;\n    _glfw.win32.keycodes[0x040] = GLFW_KEY_F6;\n    _glfw.win32.keycodes[0x041] = GLFW_KEY_F7;\n    _glfw.win32.keycodes[0x042] = GLFW_KEY_F8;\n    _glfw.win32.keycodes[0x043] = GLFW_KEY_F9;\n    _glfw.win32.keycodes[0x044] = GLFW_KEY_F10;\n    _glfw.win32.keycodes[0x057] = GLFW_KEY_F11;\n    _glfw.win32.keycodes[0x058] = GLFW_KEY_F12;\n    _glfw.win32.keycodes[0x064] = GLFW_KEY_F13;\n    _glfw.win32.keycodes[0x065] = GLFW_KEY_F14;\n    _glfw.win32.keycodes[0x066] = GLFW_KEY_F15;\n    _glfw.win32.keycodes[0x067] = GLFW_KEY_F16;\n    _glfw.win32.keycodes[0x068] = GLFW_KEY_F17;\n    _glfw.win32.keycodes[0x069] = GLFW_KEY_F18;\n    _glfw.win32.keycodes[0x06A] = GLFW_KEY_F19;\n    _glfw.win32.keycodes[0x06B] = GLFW_KEY_F20;\n    _glfw.win32.keycodes[0x06C] = GLFW_KEY_F21;\n    _glfw.win32.keycodes[0x06D] = GLFW_KEY_F22;\n    _glfw.win32.keycodes[0x06E] = GLFW_KEY_F23;\n    _glfw.win32.keycodes[0x076] = GLFW_KEY_F24;\n    _glfw.win32.keycodes[0x038] = GLFW_KEY_LEFT_ALT;\n    _glfw.win32.keycodes[0x01D] = GLFW_KEY_LEFT_CONTROL;\n    _glfw.win32.keycodes[0x02A] = GLFW_KEY_LEFT_SHIFT;\n    _glfw.win32.keycodes[0x15B] = GLFW_KEY_LEFT_SUPER;\n    _glfw.win32.keycodes[0x137] = GLFW_KEY_PRINT_SCREEN;\n    _glfw.win32.keycodes[0x138] = GLFW_KEY_RIGHT_ALT;\n    _glfw.win32.keycodes[0x11D] = GLFW_KEY_RIGHT_CONTROL;\n    _glfw.win32.keycodes[0x036] = GLFW_KEY_RIGHT_SHIFT;\n    _glfw.win32.keycodes[0x15C] = GLFW_KEY_RIGHT_SUPER;\n    _glfw.win32.keycodes[0x150] = GLFW_KEY_DOWN;\n    _glfw.win32.keycodes[0x14B] = GLFW_KEY_LEFT;\n    _glfw.win32.keycodes[0x14D] = GLFW_KEY_RIGHT;\n    _glfw.win32.keycodes[0x148] = GLFW_KEY_UP;\n\n    _glfw.win32.keycodes[0x052] = GLFW_KEY_KP_0;\n    _glfw.win32.keycodes[0x04F] = GLFW_KEY_KP_1;\n    _glfw.win32.keycodes[0x050] = GLFW_KEY_KP_2;\n    _glfw.win32.keycodes[0x051] = GLFW_KEY_KP_3;\n    _glfw.win32.keycodes[0x04B] = GLFW_KEY_KP_4;\n    _glfw.win32.keycodes[0x04C] = GLFW_KEY_KP_5;\n    _glfw.win32.keycodes[0x04D] = GLFW_KEY_KP_6;\n    _glfw.win32.keycodes[0x047] = GLFW_KEY_KP_7;\n    _glfw.win32.keycodes[0x048] = GLFW_KEY_KP_8;\n    _glfw.win32.keycodes[0x049] = GLFW_KEY_KP_9;\n    _glfw.win32.keycodes[0x04E] = GLFW_KEY_KP_ADD;\n    _glfw.win32.keycodes[0x053] = GLFW_KEY_KP_DECIMAL;\n    _glfw.win32.keycodes[0x135] = GLFW_KEY_KP_DIVIDE;\n    _glfw.win32.keycodes[0x11C] = GLFW_KEY_KP_ENTER;\n    _glfw.win32.keycodes[0x037] = GLFW_KEY_KP_MULTIPLY;\n    _glfw.win32.keycodes[0x04A] = GLFW_KEY_KP_SUBTRACT;\n\n    for (scancode = 0;  scancode < 512;  scancode++)\n    {\n        if (_glfw.win32.keycodes[scancode] > 0)\n            _glfw.win32.scancodes[_glfw.win32.keycodes[scancode]] = scancode;\n    }\n}\n\n// Creates a dummy window for behind-the-scenes work\n//\nstatic HWND createHelperWindow(void)\n{\n    MSG msg;\n    HWND window = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW,\n                                  _GLFW_WNDCLASSNAME,\n                                  L\"GLFW message window\",\n                                  WS_CLIPSIBLINGS | WS_CLIPCHILDREN,\n                                  0, 0, 1, 1,\n                                  NULL, NULL,\n                                  GetModuleHandleW(NULL),\n                                  NULL);\n    if (!window)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to create helper window\");\n        return NULL;\n    }\n\n    // HACK: The first call to ShowWindow is ignored if the parent process\n    //       passed along a STARTUPINFO, so clear that flag with a no-op call\n    ShowWindow(window, SW_HIDE);\n\n    // Register for HID device notifications\n    {\n        DEV_BROADCAST_DEVICEINTERFACE_W dbi;\n        ZeroMemory(&dbi, sizeof(dbi));\n        dbi.dbcc_size = sizeof(dbi);\n        dbi.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;\n        dbi.dbcc_classguid = GUID_DEVINTERFACE_HID;\n\n        RegisterDeviceNotificationW(window,\n                                    (DEV_BROADCAST_HDR*) &dbi,\n                                    DEVICE_NOTIFY_WINDOW_HANDLE);\n    }\n\n    while (PeekMessageW(&msg, _glfw.win32.helperWindowHandle, 0, 0, PM_REMOVE))\n    {\n        TranslateMessage(&msg);\n        DispatchMessageW(&msg);\n    }\n\n   return window;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Returns a wide string version of the specified UTF-8 string\n//\nWCHAR* _glfwCreateWideStringFromUTF8Win32(const char* source)\n{\n    WCHAR* target;\n    int count;\n\n    count = MultiByteToWideChar(CP_UTF8, 0, source, -1, NULL, 0);\n    if (!count)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to convert string from UTF-8\");\n        return NULL;\n    }\n\n    target = calloc(count, sizeof(WCHAR));\n\n    if (!MultiByteToWideChar(CP_UTF8, 0, source, -1, target, count))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to convert string from UTF-8\");\n        free(target);\n        return NULL;\n    }\n\n    return target;\n}\n\n// Returns a UTF-8 string version of the specified wide string\n//\nchar* _glfwCreateUTF8FromWideStringWin32(const WCHAR* source)\n{\n    char* target;\n    int size;\n\n    size = WideCharToMultiByte(CP_UTF8, 0, source, -1, NULL, 0, NULL, NULL);\n    if (!size)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to convert string to UTF-8\");\n        return NULL;\n    }\n\n    target = calloc(size, 1);\n\n    if (!WideCharToMultiByte(CP_UTF8, 0, source, -1, target, size, NULL, NULL))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to convert string to UTF-8\");\n        free(target);\n        return NULL;\n    }\n\n    return target;\n}\n\n// Reports the specified error, appending information about the last Win32 error\n//\nvoid _glfwInputErrorWin32(int error, const char* description)\n{\n    WCHAR buffer[_GLFW_MESSAGE_SIZE] = L\"\";\n    char message[_GLFW_MESSAGE_SIZE] = \"\";\n\n    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM |\n                       FORMAT_MESSAGE_IGNORE_INSERTS |\n                       FORMAT_MESSAGE_MAX_WIDTH_MASK,\n                   NULL,\n                   GetLastError() & 0xffff,\n                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n                   buffer,\n                   sizeof(buffer),\n                   NULL);\n    WideCharToMultiByte(CP_UTF8, 0, buffer, -1, message, sizeof(message), NULL, NULL);\n\n    _glfwInputError(error, \"%s: %s\", description, message);\n}\n\n// Updates key names according to the current keyboard layout\n//\nvoid _glfwUpdateKeyNamesWin32(void)\n{\n    int key;\n    BYTE state[256] = {0};\n\n    memset(_glfw.win32.keynames, 0, sizeof(_glfw.win32.keynames));\n\n    for (key = GLFW_KEY_SPACE;  key <= GLFW_KEY_LAST;  key++)\n    {\n        UINT vk;\n        int scancode, length;\n        WCHAR chars[16];\n\n        scancode = _glfw.win32.scancodes[key];\n        if (scancode == -1)\n            continue;\n\n        if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_ADD)\n        {\n            const UINT vks[] = {\n                VK_NUMPAD0,  VK_NUMPAD1,  VK_NUMPAD2, VK_NUMPAD3,\n                VK_NUMPAD4,  VK_NUMPAD5,  VK_NUMPAD6, VK_NUMPAD7,\n                VK_NUMPAD8,  VK_NUMPAD9,  VK_DECIMAL, VK_DIVIDE,\n                VK_MULTIPLY, VK_SUBTRACT, VK_ADD\n            };\n\n            vk = vks[key - GLFW_KEY_KP_0];\n        }\n        else\n            vk = MapVirtualKey(scancode, MAPVK_VSC_TO_VK);\n\n        length = ToUnicode(vk, scancode, state,\n                           chars, sizeof(chars) / sizeof(WCHAR),\n                           0);\n\n        if (length == -1)\n        {\n            length = ToUnicode(vk, scancode, state,\n                               chars, sizeof(chars) / sizeof(WCHAR),\n                               0);\n        }\n\n        if (length < 1)\n            continue;\n\n        WideCharToMultiByte(CP_UTF8, 0, chars, 1,\n                            _glfw.win32.keynames[key],\n                            sizeof(_glfw.win32.keynames[key]),\n                            NULL, NULL);\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformInit(void)\n{\n    // To make SetForegroundWindow work as we want, we need to fiddle\n    // with the FOREGROUNDLOCKTIMEOUT system setting (we do this as early\n    // as possible in the hope of still being the foreground process)\n    SystemParametersInfoW(SPI_GETFOREGROUNDLOCKTIMEOUT, 0,\n                          &_glfw.win32.foregroundLockTimeout, 0);\n    SystemParametersInfoW(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, UIntToPtr(0),\n                          SPIF_SENDCHANGE);\n\n    if (!loadLibraries())\n        return GLFW_FALSE;\n\n    createKeyTables();\n    _glfwUpdateKeyNamesWin32();\n\n    if (IsWindows8Point1OrGreater())\n        SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE);\n    else if (IsWindowsVistaOrGreater())\n        SetProcessDPIAware();\n\n    if (!_glfwRegisterWindowClassWin32())\n        return GLFW_FALSE;\n\n    _glfw.win32.helperWindowHandle = createHelperWindow();\n    if (!_glfw.win32.helperWindowHandle)\n        return GLFW_FALSE;\n\n    _glfwInitTimerWin32();\n    _glfwInitJoysticksWin32();\n\n    _glfwPollMonitorsWin32();\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformTerminate(void)\n{\n    if (_glfw.win32.helperWindowHandle)\n        DestroyWindow(_glfw.win32.helperWindowHandle);\n\n    _glfwUnregisterWindowClassWin32();\n\n    // Restore previous foreground lock timeout system setting\n    SystemParametersInfoW(SPI_SETFOREGROUNDLOCKTIMEOUT, 0,\n                          UIntToPtr(_glfw.win32.foregroundLockTimeout),\n                          SPIF_SENDCHANGE);\n\n    free(_glfw.win32.clipboardString);\n    free(_glfw.win32.rawInput);\n\n    _glfwTerminateWGL();\n    _glfwTerminateEGL();\n\n    _glfwTerminateJoysticksWin32();\n\n    freeLibraries();\n}\n\nconst char* _glfwPlatformGetVersionString(void)\n{\n    return _GLFW_VERSION_NUMBER \" Win32 WGL EGL\"\n#if defined(__MINGW32__)\n        \" MinGW\"\n#elif defined(_MSC_VER)\n        \" VisualC\"\n#endif\n#if defined(_GLFW_USE_HYBRID_HPG) || defined(_GLFW_USE_OPTIMUS_HPG)\n        \" hybrid-GPU\"\n#endif\n#if defined(_GLFW_BUILD_DLL)\n        \" DLL\"\n#endif\n        ;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/win32_joystick.c",
    "content": "//========================================================================\n// GLFW 3.3 Win32 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdio.h>\n#include <math.h>\n\n#define _GLFW_TYPE_AXIS     0\n#define _GLFW_TYPE_SLIDER   1\n#define _GLFW_TYPE_BUTTON   2\n#define _GLFW_TYPE_POV      3\n\n// Data produced with DirectInput device object enumeration\n//\ntypedef struct _GLFWobjenumWin32\n{\n    IDirectInputDevice8W*   device;\n    _GLFWjoyobjectWin32*    objects;\n    int                     objectCount;\n    int                     axisCount;\n    int                     sliderCount;\n    int                     buttonCount;\n    int                     povCount;\n} _GLFWobjenumWin32;\n\n// Define local copies of the necessary GUIDs\n//\nstatic const GUID _glfw_IID_IDirectInput8W =\n    {0xbf798031,0x483a,0x4da2,{0xaa,0x99,0x5d,0x64,0xed,0x36,0x97,0x00}};\nstatic const GUID _glfw_GUID_XAxis =\n    {0xa36d02e0,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};\nstatic const GUID _glfw_GUID_YAxis =\n    {0xa36d02e1,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};\nstatic const GUID _glfw_GUID_ZAxis =\n    {0xa36d02e2,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};\nstatic const GUID _glfw_GUID_RxAxis =\n    {0xa36d02f4,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};\nstatic const GUID _glfw_GUID_RyAxis =\n    {0xa36d02f5,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};\nstatic const GUID _glfw_GUID_RzAxis =\n    {0xa36d02e3,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};\nstatic const GUID _glfw_GUID_Slider =\n    {0xa36d02e4,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};\nstatic const GUID _glfw_GUID_POV =\n    {0xa36d02f2,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};\n\n#define IID_IDirectInput8W _glfw_IID_IDirectInput8W\n#define GUID_XAxis _glfw_GUID_XAxis\n#define GUID_YAxis _glfw_GUID_YAxis\n#define GUID_ZAxis _glfw_GUID_ZAxis\n#define GUID_RxAxis _glfw_GUID_RxAxis\n#define GUID_RyAxis _glfw_GUID_RyAxis\n#define GUID_RzAxis _glfw_GUID_RzAxis\n#define GUID_Slider _glfw_GUID_Slider\n#define GUID_POV _glfw_GUID_POV\n\n// Object data array for our clone of c_dfDIJoystick\n// Generated with https://github.com/elmindreda/c_dfDIJoystick2\n//\nstatic DIOBJECTDATAFORMAT _glfwObjectDataFormats[] =\n{\n    { &GUID_XAxis,DIJOFS_X,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION },\n    { &GUID_YAxis,DIJOFS_Y,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION },\n    { &GUID_ZAxis,DIJOFS_Z,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION },\n    { &GUID_RxAxis,DIJOFS_RX,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION },\n    { &GUID_RyAxis,DIJOFS_RY,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION },\n    { &GUID_RzAxis,DIJOFS_RZ,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION },\n    { &GUID_Slider,DIJOFS_SLIDER(0),DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION },\n    { &GUID_Slider,DIJOFS_SLIDER(1),DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION },\n    { &GUID_POV,DIJOFS_POV(0),DIDFT_POV|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { &GUID_POV,DIJOFS_POV(1),DIDFT_POV|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { &GUID_POV,DIJOFS_POV(2),DIDFT_POV|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { &GUID_POV,DIJOFS_POV(3),DIDFT_POV|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(0),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(1),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(2),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(3),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(4),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(5),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(6),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(7),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(8),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(9),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(10),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(11),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(12),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(13),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(14),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(15),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(16),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(17),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(18),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(19),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(20),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(21),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(22),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(23),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(24),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(25),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(26),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(27),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(28),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(29),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(30),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n    { NULL,DIJOFS_BUTTON(31),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },\n};\n\n// Our clone of c_dfDIJoystick\n//\nstatic const DIDATAFORMAT _glfwDataFormat =\n{\n    sizeof(DIDATAFORMAT),\n    sizeof(DIOBJECTDATAFORMAT),\n    DIDFT_ABSAXIS,\n    sizeof(DIJOYSTATE),\n    sizeof(_glfwObjectDataFormats) / sizeof(DIOBJECTDATAFORMAT),\n    _glfwObjectDataFormats\n};\n\n// Returns a description fitting the specified XInput capabilities\n//\nstatic const char* getDeviceDescription(const XINPUT_CAPABILITIES* xic)\n{\n    switch (xic->SubType)\n    {\n        case XINPUT_DEVSUBTYPE_WHEEL:\n            return \"XInput Wheel\";\n        case XINPUT_DEVSUBTYPE_ARCADE_STICK:\n            return \"XInput Arcade Stick\";\n        case XINPUT_DEVSUBTYPE_FLIGHT_STICK:\n            return \"XInput Flight Stick\";\n        case XINPUT_DEVSUBTYPE_DANCE_PAD:\n            return \"XInput Dance Pad\";\n        case XINPUT_DEVSUBTYPE_GUITAR:\n            return \"XInput Guitar\";\n        case XINPUT_DEVSUBTYPE_DRUM_KIT:\n            return \"XInput Drum Kit\";\n        case XINPUT_DEVSUBTYPE_GAMEPAD:\n        {\n            if (xic->Flags & XINPUT_CAPS_WIRELESS)\n                return \"Wireless Xbox Controller\";\n            else\n                return \"Xbox Controller\";\n        }\n    }\n\n    return \"Unknown XInput Device\";\n}\n\n// Lexically compare device objects\n//\nstatic int compareJoystickObjects(const void* first, const void* second)\n{\n    const _GLFWjoyobjectWin32* fo = first;\n    const _GLFWjoyobjectWin32* so = second;\n\n    if (fo->type != so->type)\n        return fo->type - so->type;\n\n    return fo->offset - so->offset;\n}\n\n// Checks whether the specified device supports XInput\n// Technique from FDInputJoystickManager::IsXInputDeviceFast in ZDoom\n//\nstatic GLFWbool supportsXInput(const GUID* guid)\n{\n    UINT i, count = 0;\n    RAWINPUTDEVICELIST* ridl;\n    GLFWbool result = GLFW_FALSE;\n\n    if (GetRawInputDeviceList(NULL, &count, sizeof(RAWINPUTDEVICELIST)) != 0)\n        return GLFW_FALSE;\n\n    ridl = calloc(count, sizeof(RAWINPUTDEVICELIST));\n\n    if (GetRawInputDeviceList(ridl, &count, sizeof(RAWINPUTDEVICELIST)) == (UINT) -1)\n    {\n        free(ridl);\n        return GLFW_FALSE;\n    }\n\n    for (i = 0;  i < count;  i++)\n    {\n        RID_DEVICE_INFO rdi;\n        char name[256];\n        UINT size;\n\n        if (ridl[i].dwType != RIM_TYPEHID)\n            continue;\n\n        ZeroMemory(&rdi, sizeof(rdi));\n        rdi.cbSize = sizeof(rdi);\n        size = sizeof(rdi);\n\n        if ((INT) GetRawInputDeviceInfoA(ridl[i].hDevice,\n                                         RIDI_DEVICEINFO,\n                                         &rdi, &size) == -1)\n        {\n            continue;\n        }\n\n        if (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) != (LONG) guid->Data1)\n            continue;\n\n        memset(name, 0, sizeof(name));\n        size = sizeof(name);\n\n        if ((INT) GetRawInputDeviceInfoA(ridl[i].hDevice,\n                                         RIDI_DEVICENAME,\n                                         name, &size) == -1)\n        {\n            break;\n        }\n\n        name[sizeof(name) - 1] = '\\0';\n        if (strstr(name, \"IG_\"))\n        {\n            result = GLFW_TRUE;\n            break;\n        }\n    }\n\n    free(ridl);\n    return result;\n}\n\n// Frees all resources associated with the specified joystick\n//\nstatic void closeJoystick(_GLFWjoystick* js)\n{\n    if (js->win32.device)\n    {\n        IDirectInputDevice8_Unacquire(js->win32.device);\n        IDirectInputDevice8_Release(js->win32.device);\n    }\n\n    _glfwFreeJoystick(js);\n    _glfwInputJoystick(js, GLFW_DISCONNECTED);\n}\n\n// DirectInput device object enumeration callback\n// Insights gleaned from SDL\n//\nstatic BOOL CALLBACK deviceObjectCallback(const DIDEVICEOBJECTINSTANCEW* doi,\n                                          void* user)\n{\n    _GLFWobjenumWin32* data = user;\n    _GLFWjoyobjectWin32* object = data->objects + data->objectCount;\n\n    if (DIDFT_GETTYPE(doi->dwType) & DIDFT_AXIS)\n    {\n        DIPROPRANGE dipr;\n\n        if (memcmp(&doi->guidType, &GUID_Slider, sizeof(GUID)) == 0)\n            object->offset = DIJOFS_SLIDER(data->sliderCount);\n        else if (memcmp(&doi->guidType, &GUID_XAxis, sizeof(GUID)) == 0)\n            object->offset = DIJOFS_X;\n        else if (memcmp(&doi->guidType, &GUID_YAxis, sizeof(GUID)) == 0)\n            object->offset = DIJOFS_Y;\n        else if (memcmp(&doi->guidType, &GUID_ZAxis, sizeof(GUID)) == 0)\n            object->offset = DIJOFS_Z;\n        else if (memcmp(&doi->guidType, &GUID_RxAxis, sizeof(GUID)) == 0)\n            object->offset = DIJOFS_RX;\n        else if (memcmp(&doi->guidType, &GUID_RyAxis, sizeof(GUID)) == 0)\n            object->offset = DIJOFS_RY;\n        else if (memcmp(&doi->guidType, &GUID_RzAxis, sizeof(GUID)) == 0)\n            object->offset = DIJOFS_RZ;\n        else\n            return DIENUM_CONTINUE;\n\n        ZeroMemory(&dipr, sizeof(dipr));\n        dipr.diph.dwSize = sizeof(dipr);\n        dipr.diph.dwHeaderSize = sizeof(dipr.diph);\n        dipr.diph.dwObj = doi->dwType;\n        dipr.diph.dwHow = DIPH_BYID;\n        dipr.lMin = -32768;\n        dipr.lMax =  32767;\n\n        if (FAILED(IDirectInputDevice8_SetProperty(data->device,\n                                                   DIPROP_RANGE,\n                                                   &dipr.diph)))\n        {\n            return DIENUM_CONTINUE;\n        }\n\n        if (memcmp(&doi->guidType, &GUID_Slider, sizeof(GUID)) == 0)\n        {\n            object->type = _GLFW_TYPE_SLIDER;\n            data->sliderCount++;\n        }\n        else\n        {\n            object->type = _GLFW_TYPE_AXIS;\n            data->axisCount++;\n        }\n    }\n    else if (DIDFT_GETTYPE(doi->dwType) & DIDFT_BUTTON)\n    {\n        object->offset = DIJOFS_BUTTON(data->buttonCount);\n        object->type = _GLFW_TYPE_BUTTON;\n        data->buttonCount++;\n    }\n    else if (DIDFT_GETTYPE(doi->dwType) & DIDFT_POV)\n    {\n        object->offset = DIJOFS_POV(data->povCount);\n        object->type = _GLFW_TYPE_POV;\n        data->povCount++;\n    }\n\n    data->objectCount++;\n    return DIENUM_CONTINUE;\n}\n\n// DirectInput device enumeration callback\n//\nstatic BOOL CALLBACK deviceCallback(const DIDEVICEINSTANCE* di, void* user)\n{\n    int jid = 0;\n    DIDEVCAPS dc;\n    DIPROPDWORD dipd;\n    IDirectInputDevice8* device;\n    _GLFWobjenumWin32 data;\n    _GLFWjoystick* js;\n    char guid[33];\n    char name[256];\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        _GLFWjoystick* js = _glfw.joysticks + jid;\n        if (js->present)\n        {\n            if (memcmp(&js->win32.guid, &di->guidInstance, sizeof(GUID)) == 0)\n                return DIENUM_CONTINUE;\n        }\n    }\n\n    if (supportsXInput(&di->guidProduct))\n        return DIENUM_CONTINUE;\n\n    if (FAILED(IDirectInput8_CreateDevice(_glfw.win32.dinput8.api,\n                                          &di->guidInstance,\n                                          &device,\n                                          NULL)))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR, \"Win32: Failed to create device\");\n        return DIENUM_CONTINUE;\n    }\n\n    if (FAILED(IDirectInputDevice8_SetDataFormat(device, &_glfwDataFormat)))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Win32: Failed to set device data format\");\n\n        IDirectInputDevice8_Release(device);\n        return DIENUM_CONTINUE;\n    }\n\n    ZeroMemory(&dc, sizeof(dc));\n    dc.dwSize = sizeof(dc);\n\n    if (FAILED(IDirectInputDevice8_GetCapabilities(device, &dc)))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Win32: Failed to query device capabilities\");\n\n        IDirectInputDevice8_Release(device);\n        return DIENUM_CONTINUE;\n    }\n\n    ZeroMemory(&dipd, sizeof(dipd));\n    dipd.diph.dwSize = sizeof(dipd);\n    dipd.diph.dwHeaderSize = sizeof(dipd.diph);\n    dipd.diph.dwHow = DIPH_DEVICE;\n    dipd.dwData = DIPROPAXISMODE_ABS;\n\n    if (FAILED(IDirectInputDevice8_SetProperty(device,\n                                               DIPROP_AXISMODE,\n                                               &dipd.diph)))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Win32: Failed to set device axis mode\");\n\n        IDirectInputDevice8_Release(device);\n        return DIENUM_CONTINUE;\n    }\n\n    memset(&data, 0, sizeof(data));\n    data.device = device;\n    data.objects = calloc(dc.dwAxes + dc.dwButtons + dc.dwPOVs,\n                          sizeof(_GLFWjoyobjectWin32));\n\n    if (FAILED(IDirectInputDevice8_EnumObjects(device,\n                                               deviceObjectCallback,\n                                               &data,\n                                               DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV)))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Win32: Failed to enumerate device objects\");\n\n        IDirectInputDevice8_Release(device);\n        free(data.objects);\n        return DIENUM_CONTINUE;\n    }\n\n    qsort(data.objects, data.objectCount,\n          sizeof(_GLFWjoyobjectWin32),\n          compareJoystickObjects);\n\n    if (!WideCharToMultiByte(CP_UTF8, 0,\n                             di->tszInstanceName, -1,\n                             name, sizeof(name),\n                             NULL, NULL))\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Win32: Failed to convert joystick name to UTF-8\");\n\n        IDirectInputDevice8_Release(device);\n        free(data.objects);\n        return DIENUM_STOP;\n    }\n\n    // Generate a joystick GUID that matches the SDL 2.0.5+ one\n    if (memcmp(&di->guidProduct.Data4[2], \"PIDVID\", 6) == 0)\n    {\n        sprintf(guid, \"03000000%02x%02x0000%02x%02x000000000000\",\n                (uint8_t) di->guidProduct.Data1,\n                (uint8_t) (di->guidProduct.Data1 >> 8),\n                (uint8_t) (di->guidProduct.Data1 >> 16),\n                (uint8_t) (di->guidProduct.Data1 >> 24));\n    }\n    else\n    {\n        sprintf(guid, \"05000000%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x00\",\n                name[0], name[1], name[2], name[3],\n                name[4], name[5], name[6], name[7],\n                name[8], name[9], name[10]);\n    }\n\n    js = _glfwAllocJoystick(name, guid,\n                            data.axisCount + data.sliderCount,\n                            data.buttonCount,\n                            data.povCount);\n    if (!js)\n    {\n        IDirectInputDevice8_Release(device);\n        free(data.objects);\n        return DIENUM_STOP;\n    }\n\n    js->win32.device = device;\n    js->win32.guid = di->guidInstance;\n    js->win32.objects = data.objects;\n    js->win32.objectCount = data.objectCount;\n\n    _glfwInputJoystick(js, GLFW_CONNECTED);\n    return DIENUM_CONTINUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialize joystick interface\n//\nvoid _glfwInitJoysticksWin32(void)\n{\n    if (_glfw.win32.dinput8.instance)\n    {\n        if (FAILED(DirectInput8Create(GetModuleHandle(NULL),\n                                      DIRECTINPUT_VERSION,\n                                      &IID_IDirectInput8W,\n                                      (void**) &_glfw.win32.dinput8.api,\n                                      NULL)))\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"Win32: Failed to create interface\");\n        }\n    }\n\n    _glfwDetectJoystickConnectionWin32();\n}\n\n// Close all opened joystick handles\n//\nvoid _glfwTerminateJoysticksWin32(void)\n{\n    int jid;\n\n    for (jid = GLFW_JOYSTICK_1;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n        closeJoystick(_glfw.joysticks + jid);\n\n    if (_glfw.win32.dinput8.api)\n        IDirectInput8_Release(_glfw.win32.dinput8.api);\n}\n\n// Checks for new joysticks after DBT_DEVICEARRIVAL\n//\nvoid _glfwDetectJoystickConnectionWin32(void)\n{\n    if (_glfw.win32.xinput.instance)\n    {\n        DWORD index;\n\n        for (index = 0;  index < XUSER_MAX_COUNT;  index++)\n        {\n            int jid;\n            char guid[33];\n            XINPUT_CAPABILITIES xic;\n            _GLFWjoystick* js;\n\n            for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n            {\n                if (_glfw.joysticks[jid].present &&\n                    _glfw.joysticks[jid].win32.device == NULL &&\n                    _glfw.joysticks[jid].win32.index == index)\n                {\n                    break;\n                }\n            }\n\n            if (jid <= GLFW_JOYSTICK_LAST)\n                continue;\n\n            if (XInputGetCapabilities(index, 0, &xic) != ERROR_SUCCESS)\n                continue;\n\n            // Generate a joystick GUID that matches the SDL 2.0.5+ one\n            sprintf(guid, \"78696e707574%02x000000000000000000\",\n                    xic.SubType & 0xff);\n\n            js = _glfwAllocJoystick(getDeviceDescription(&xic), guid, 6, 10, 1);\n            if (!js)\n                continue;\n\n            js->win32.index = index;\n\n            _glfwInputJoystick(js, GLFW_CONNECTED);\n        }\n    }\n\n    if (_glfw.win32.dinput8.api)\n    {\n        if (FAILED(IDirectInput8_EnumDevices(_glfw.win32.dinput8.api,\n                                             DI8DEVCLASS_GAMECTRL,\n                                             deviceCallback,\n                                             NULL,\n                                             DIEDFL_ALLDEVICES)))\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"Failed to enumerate DirectInput8 devices\");\n            return;\n        }\n    }\n}\n\n// Checks for joystick disconnection after DBT_DEVICEREMOVECOMPLETE\n//\nvoid _glfwDetectJoystickDisconnectionWin32(void)\n{\n    int jid;\n\n    for (jid = 0;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        _GLFWjoystick* js = _glfw.joysticks + jid;\n        if (js->present)\n            _glfwPlatformPollJoystick(js, _GLFW_POLL_PRESENCE);\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode)\n{\n    if (js->win32.device)\n    {\n        int i, ai = 0, bi = 0, pi = 0;\n        HRESULT result;\n        DIJOYSTATE state;\n\n        IDirectInputDevice8_Poll(js->win32.device);\n        result = IDirectInputDevice8_GetDeviceState(js->win32.device,\n                                                    sizeof(state),\n                                                    &state);\n        if (result == DIERR_NOTACQUIRED || result == DIERR_INPUTLOST)\n        {\n            IDirectInputDevice8_Acquire(js->win32.device);\n            IDirectInputDevice8_Poll(js->win32.device);\n            result = IDirectInputDevice8_GetDeviceState(js->win32.device,\n                                                        sizeof(state),\n                                                        &state);\n        }\n\n        if (FAILED(result))\n        {\n            closeJoystick(js);\n            return GLFW_FALSE;\n        }\n\n        if (mode == _GLFW_POLL_PRESENCE)\n            return GLFW_TRUE;\n\n        for (i = 0;  i < js->win32.objectCount;  i++)\n        {\n            const void* data = (char*) &state + js->win32.objects[i].offset;\n\n            switch (js->win32.objects[i].type)\n            {\n                case _GLFW_TYPE_AXIS:\n                case _GLFW_TYPE_SLIDER:\n                {\n                    const float value = (*((LONG*) data) + 0.5f) / 32767.5f;\n                    _glfwInputJoystickAxis(js, ai, value);\n                    ai++;\n                    break;\n                }\n\n                case _GLFW_TYPE_BUTTON:\n                {\n                    const char value = (*((BYTE*) data) & 0x80) != 0;\n                    _glfwInputJoystickButton(js, bi, value);\n                    bi++;\n                    break;\n                }\n\n                case _GLFW_TYPE_POV:\n                {\n                    const int states[9] =\n                    {\n                        GLFW_HAT_UP,\n                        GLFW_HAT_RIGHT_UP,\n                        GLFW_HAT_RIGHT,\n                        GLFW_HAT_RIGHT_DOWN,\n                        GLFW_HAT_DOWN,\n                        GLFW_HAT_LEFT_DOWN,\n                        GLFW_HAT_LEFT,\n                        GLFW_HAT_LEFT_UP,\n                        GLFW_HAT_CENTERED\n                    };\n\n                    // Screams of horror are appropriate at this point\n                    int state = LOWORD(*(DWORD*) data) / (45 * DI_DEGREES);\n                    if (state < 0 || state > 8)\n                        state = 8;\n\n                    _glfwInputJoystickHat(js, pi, states[state]);\n                    pi++;\n                    break;\n                }\n            }\n        }\n    }\n    else\n    {\n        int i, dpad = 0;\n        DWORD result;\n        XINPUT_STATE xis;\n        const WORD buttons[10] =\n        {\n            XINPUT_GAMEPAD_A,\n            XINPUT_GAMEPAD_B,\n            XINPUT_GAMEPAD_X,\n            XINPUT_GAMEPAD_Y,\n            XINPUT_GAMEPAD_LEFT_SHOULDER,\n            XINPUT_GAMEPAD_RIGHT_SHOULDER,\n            XINPUT_GAMEPAD_BACK,\n            XINPUT_GAMEPAD_START,\n            XINPUT_GAMEPAD_LEFT_THUMB,\n            XINPUT_GAMEPAD_RIGHT_THUMB\n        };\n\n        result = XInputGetState(js->win32.index, &xis);\n        if (result != ERROR_SUCCESS)\n        {\n            if (result == ERROR_DEVICE_NOT_CONNECTED)\n                closeJoystick(js);\n\n            return GLFW_FALSE;\n        }\n\n        if (mode == _GLFW_POLL_PRESENCE)\n            return GLFW_TRUE;\n\n        _glfwInputJoystickAxis(js, 0, (xis.Gamepad.sThumbLX + 0.5f) / 32767.5f);\n        _glfwInputJoystickAxis(js, 1, (xis.Gamepad.sThumbLY + 0.5f) / 32767.5f);\n        _glfwInputJoystickAxis(js, 2, (xis.Gamepad.sThumbRX + 0.5f) / 32767.5f);\n        _glfwInputJoystickAxis(js, 3, (xis.Gamepad.sThumbRY + 0.5f) / 32767.5f);\n        _glfwInputJoystickAxis(js, 4, xis.Gamepad.bLeftTrigger / 127.5f - 1.f);\n        _glfwInputJoystickAxis(js, 5, xis.Gamepad.bRightTrigger / 127.5f - 1.f);\n\n        for (i = 0;  i < 10;  i++)\n        {\n            const char value = (xis.Gamepad.wButtons & buttons[i]) ? 1 : 0;\n            _glfwInputJoystickButton(js, i, value);\n        }\n\n        if (xis.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)\n            dpad |= GLFW_HAT_UP;\n        if (xis.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)\n            dpad |= GLFW_HAT_RIGHT;\n        if (xis.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)\n            dpad |= GLFW_HAT_DOWN;\n        if (xis.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)\n            dpad |= GLFW_HAT_LEFT;\n\n        _glfwInputJoystickHat(js, 0, dpad);\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformUpdateGamepadGUID(char* guid)\n{\n    if (strcmp(guid + 20, \"504944564944\") == 0)\n    {\n        char original[33];\n        strcpy(original, guid);\n        sprintf(guid, \"03000000%.4s0000%.4s000000000000\",\n                original, original + 4);\n    }\n}\n\n"
  },
  {
    "path": "external/GLFW/src/win32_joystick.h",
    "content": "//========================================================================\n// GLFW 3.3 Win32 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define _GLFW_PLATFORM_JOYSTICK_STATE         _GLFWjoystickWin32 win32\n#define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE int dummy\n\n#define _GLFW_PLATFORM_MAPPING_NAME \"Windows\"\n\n// Joystick element (axis, button or slider)\n//\ntypedef struct _GLFWjoyobjectWin32\n{\n    int                     offset;\n    int                     type;\n} _GLFWjoyobjectWin32;\n\n// Win32-specific per-joystick data\n//\ntypedef struct _GLFWjoystickWin32\n{\n    _GLFWjoyobjectWin32*    objects;\n    int                     objectCount;\n    IDirectInputDevice8W*   device;\n    DWORD                   index;\n    GUID                    guid;\n} _GLFWjoystickWin32;\n\n\nvoid _glfwInitJoysticksWin32(void);\nvoid _glfwTerminateJoysticksWin32(void);\nvoid _glfwDetectJoystickConnectionWin32(void);\nvoid _glfwDetectJoystickDisconnectionWin32(void);\n\n"
  },
  {
    "path": "external/GLFW/src/win32_monitor.c",
    "content": "//========================================================================\n// GLFW 3.3 Win32 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n#include <malloc.h>\n\n\n// Callback for EnumDisplayMonitors in createMonitor\n//\nstatic BOOL CALLBACK monitorCallback(HMONITOR handle,\n                                     HDC dc,\n                                     RECT* rect,\n                                     LPARAM data)\n{\n    MONITORINFOEXW mi;\n    ZeroMemory(&mi, sizeof(mi));\n    mi.cbSize = sizeof(mi);\n\n    if (GetMonitorInfoW(handle, (MONITORINFO*) &mi))\n    {\n        _GLFWmonitor* monitor = (_GLFWmonitor*) data;\n        if (wcscmp(mi.szDevice, monitor->win32.adapterName) == 0)\n            monitor->win32.handle = handle;\n    }\n\n    return TRUE;\n}\n\n// Create monitor from an adapter and (optionally) a display\n//\nstatic _GLFWmonitor* createMonitor(DISPLAY_DEVICEW* adapter,\n                                   DISPLAY_DEVICEW* display)\n{\n    _GLFWmonitor* monitor;\n    char* name;\n    HDC dc;\n    DEVMODEW dm;\n    RECT rect;\n\n    if (display)\n        name = _glfwCreateUTF8FromWideStringWin32(display->DeviceString);\n    else\n        name = _glfwCreateUTF8FromWideStringWin32(adapter->DeviceString);\n    if (!name)\n        return NULL;\n\n    dc = CreateDCW(L\"DISPLAY\", adapter->DeviceName, NULL, NULL);\n\n    monitor = _glfwAllocMonitor(name,\n                                GetDeviceCaps(dc, HORZSIZE),\n                                GetDeviceCaps(dc, VERTSIZE));\n\n    DeleteDC(dc);\n    free(name);\n\n    if (adapter->StateFlags & DISPLAY_DEVICE_MODESPRUNED)\n        monitor->win32.modesPruned = GLFW_TRUE;\n\n    wcscpy(monitor->win32.adapterName, adapter->DeviceName);\n    WideCharToMultiByte(CP_UTF8, 0,\n                        adapter->DeviceName, -1,\n                        monitor->win32.publicAdapterName,\n                        sizeof(monitor->win32.publicAdapterName),\n                        NULL, NULL);\n\n    if (display)\n    {\n        wcscpy(monitor->win32.displayName, display->DeviceName);\n        WideCharToMultiByte(CP_UTF8, 0,\n                            display->DeviceName, -1,\n                            monitor->win32.publicDisplayName,\n                            sizeof(monitor->win32.publicDisplayName),\n                            NULL, NULL);\n    }\n\n    ZeroMemory(&dm, sizeof(dm));\n    dm.dmSize = sizeof(dm);\n    EnumDisplaySettingsW(adapter->DeviceName, ENUM_CURRENT_SETTINGS, &dm);\n\n    rect.left   = dm.dmPosition.x;\n    rect.top    = dm.dmPosition.y;\n    rect.right  = dm.dmPosition.x + dm.dmPelsWidth;\n    rect.bottom = dm.dmPosition.y + dm.dmPelsHeight;\n\n    EnumDisplayMonitors(NULL, &rect, monitorCallback, (LPARAM) monitor);\n    return monitor;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Poll for changes in the set of connected monitors\n//\nvoid _glfwPollMonitorsWin32(void)\n{\n    int i, disconnectedCount;\n    _GLFWmonitor** disconnected = NULL;\n    DWORD adapterIndex, displayIndex;\n    DISPLAY_DEVICEW adapter, display;\n    _GLFWmonitor* monitor;\n\n    disconnectedCount = _glfw.monitorCount;\n    if (disconnectedCount)\n    {\n        disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*));\n        memcpy(disconnected,\n               _glfw.monitors,\n               _glfw.monitorCount * sizeof(_GLFWmonitor*));\n    }\n\n    for (adapterIndex = 0;  ;  adapterIndex++)\n    {\n        int type = _GLFW_INSERT_LAST;\n\n        ZeroMemory(&adapter, sizeof(adapter));\n        adapter.cb = sizeof(adapter);\n\n        if (!EnumDisplayDevicesW(NULL, adapterIndex, &adapter, 0))\n            break;\n\n        if (!(adapter.StateFlags & DISPLAY_DEVICE_ACTIVE))\n            continue;\n\n        if (adapter.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)\n            type = _GLFW_INSERT_FIRST;\n\n        for (displayIndex = 0;  ;  displayIndex++)\n        {\n            ZeroMemory(&display, sizeof(display));\n            display.cb = sizeof(display);\n\n            if (!EnumDisplayDevicesW(adapter.DeviceName, displayIndex, &display, 0))\n                break;\n\n            if (!(display.StateFlags & DISPLAY_DEVICE_ACTIVE))\n                continue;\n\n            for (i = 0;  i < disconnectedCount;  i++)\n            {\n                if (disconnected[i] &&\n                    wcscmp(disconnected[i]->win32.displayName,\n                           display.DeviceName) == 0)\n                {\n                    disconnected[i] = NULL;\n                    break;\n                }\n            }\n\n            if (i < disconnectedCount)\n                continue;\n\n            monitor = createMonitor(&adapter, &display);\n            if (!monitor)\n            {\n                free(disconnected);\n                return;\n            }\n\n            _glfwInputMonitor(monitor, GLFW_CONNECTED, type);\n\n            type = _GLFW_INSERT_LAST;\n        }\n\n        // HACK: If an active adapter does not have any display devices\n        //       (as sometimes happens), add it directly as a monitor\n        if (displayIndex == 0)\n        {\n            for (i = 0;  i < disconnectedCount;  i++)\n            {\n                if (disconnected[i] &&\n                    wcscmp(disconnected[i]->win32.adapterName,\n                           adapter.DeviceName) == 0)\n                {\n                    disconnected[i] = NULL;\n                    break;\n                }\n            }\n\n            if (i < disconnectedCount)\n                continue;\n\n            monitor = createMonitor(&adapter, NULL);\n            if (!monitor)\n            {\n                free(disconnected);\n                return;\n            }\n\n            _glfwInputMonitor(monitor, GLFW_CONNECTED, type);\n        }\n    }\n\n    for (i = 0;  i < disconnectedCount;  i++)\n    {\n        if (disconnected[i])\n            _glfwInputMonitor(disconnected[i], GLFW_DISCONNECTED, 0);\n    }\n\n    free(disconnected);\n}\n\n// Change the current video mode\n//\nGLFWbool _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired)\n{\n    GLFWvidmode current;\n    const GLFWvidmode* best;\n    DEVMODEW dm;\n    LONG result;\n\n    best = _glfwChooseVideoMode(monitor, desired);\n    _glfwPlatformGetVideoMode(monitor, &current);\n    if (_glfwCompareVideoModes(&current, best) == 0)\n        return GLFW_TRUE;\n\n    ZeroMemory(&dm, sizeof(dm));\n    dm.dmSize = sizeof(dm);\n    dm.dmFields           = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL |\n                            DM_DISPLAYFREQUENCY;\n    dm.dmPelsWidth        = best->width;\n    dm.dmPelsHeight       = best->height;\n    dm.dmBitsPerPel       = best->redBits + best->greenBits + best->blueBits;\n    dm.dmDisplayFrequency = best->refreshRate;\n\n    if (dm.dmBitsPerPel < 15 || dm.dmBitsPerPel >= 24)\n        dm.dmBitsPerPel = 32;\n\n    result = ChangeDisplaySettingsExW(monitor->win32.adapterName,\n                                      &dm,\n                                      NULL,\n                                      CDS_FULLSCREEN,\n                                      NULL);\n    if (result != DISP_CHANGE_SUCCESSFUL)\n    {\n        const char* description = \"Unknown error\";\n\n        if (result == DISP_CHANGE_BADDUALVIEW)\n            description = \"The system uses DualView\";\n        else if (result == DISP_CHANGE_BADFLAGS)\n            description = \"Invalid flags\";\n        else if (result == DISP_CHANGE_BADMODE)\n            description = \"Graphics mode not supported\";\n        else if (result == DISP_CHANGE_BADPARAM)\n            description = \"Invalid parameter\";\n        else if (result == DISP_CHANGE_FAILED)\n            description = \"Graphics mode failed\";\n        else if (result == DISP_CHANGE_NOTUPDATED)\n            description = \"Failed to write to registry\";\n        else if (result == DISP_CHANGE_RESTART)\n            description = \"Computer restart required\";\n\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Win32: Failed to set video mode: %s\",\n                        description);\n\n        return GLFW_FALSE;\n    }\n\n    monitor->win32.modeChanged = GLFW_TRUE;\n    return GLFW_TRUE;\n}\n\n// Restore the previously saved (original) video mode\n//\nvoid _glfwRestoreVideoModeWin32(_GLFWmonitor* monitor)\n{\n    if (monitor->win32.modeChanged)\n    {\n        ChangeDisplaySettingsExW(monitor->win32.adapterName,\n                                 NULL, NULL, CDS_FULLSCREEN, NULL);\n        monitor->win32.modeChanged = GLFW_FALSE;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)\n{\n    DEVMODEW dm;\n    ZeroMemory(&dm, sizeof(dm));\n    dm.dmSize = sizeof(dm);\n\n    EnumDisplaySettingsExW(monitor->win32.adapterName,\n                           ENUM_CURRENT_SETTINGS,\n                           &dm,\n                           EDS_ROTATEDMODE);\n\n    if (xpos)\n        *xpos = dm.dmPosition.x;\n    if (ypos)\n        *ypos = dm.dmPosition.y;\n}\n\nGLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count)\n{\n    int modeIndex = 0, size = 0;\n    GLFWvidmode* result = NULL;\n\n    *count = 0;\n\n    for (;;)\n    {\n        int i;\n        GLFWvidmode mode;\n        DEVMODEW dm;\n\n        ZeroMemory(&dm, sizeof(dm));\n        dm.dmSize = sizeof(dm);\n\n        if (!EnumDisplaySettingsW(monitor->win32.adapterName, modeIndex, &dm))\n            break;\n\n        modeIndex++;\n\n        // Skip modes with less than 15 BPP\n        if (dm.dmBitsPerPel < 15)\n            continue;\n\n        mode.width  = dm.dmPelsWidth;\n        mode.height = dm.dmPelsHeight;\n        mode.refreshRate = dm.dmDisplayFrequency;\n        _glfwSplitBPP(dm.dmBitsPerPel,\n                      &mode.redBits,\n                      &mode.greenBits,\n                      &mode.blueBits);\n\n        for (i = 0;  i < *count;  i++)\n        {\n            if (_glfwCompareVideoModes(result + i, &mode) == 0)\n                break;\n        }\n\n        // Skip duplicate modes\n        if (i < *count)\n            continue;\n\n        if (monitor->win32.modesPruned)\n        {\n            // Skip modes not supported by the connected displays\n            if (ChangeDisplaySettingsExW(monitor->win32.adapterName,\n                                         &dm,\n                                         NULL,\n                                         CDS_TEST,\n                                         NULL) != DISP_CHANGE_SUCCESSFUL)\n            {\n                continue;\n            }\n        }\n\n        if (*count == size)\n        {\n            size += 128;\n            result = (GLFWvidmode*) realloc(result, size * sizeof(GLFWvidmode));\n        }\n\n        (*count)++;\n        result[*count - 1] = mode;\n    }\n\n    if (!*count)\n    {\n        // HACK: Report the current mode if no valid modes were found\n        result = calloc(1, sizeof(GLFWvidmode));\n        _glfwPlatformGetVideoMode(monitor, result);\n        *count = 1;\n    }\n\n    return result;\n}\n\nvoid _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)\n{\n    DEVMODEW dm;\n    ZeroMemory(&dm, sizeof(dm));\n    dm.dmSize = sizeof(dm);\n\n    EnumDisplaySettingsW(monitor->win32.adapterName, ENUM_CURRENT_SETTINGS, &dm);\n\n    mode->width  = dm.dmPelsWidth;\n    mode->height = dm.dmPelsHeight;\n    mode->refreshRate = dm.dmDisplayFrequency;\n    _glfwSplitBPP(dm.dmBitsPerPel,\n                  &mode->redBits,\n                  &mode->greenBits,\n                  &mode->blueBits);\n}\n\nvoid _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)\n{\n    HDC dc;\n    WORD values[768];\n\n    dc = CreateDCW(L\"DISPLAY\", monitor->win32.adapterName, NULL, NULL);\n    GetDeviceGammaRamp(dc, values);\n    DeleteDC(dc);\n\n    _glfwAllocGammaArrays(ramp, 256);\n\n    memcpy(ramp->red,   values +   0, 256 * sizeof(unsigned short));\n    memcpy(ramp->green, values + 256, 256 * sizeof(unsigned short));\n    memcpy(ramp->blue,  values + 512, 256 * sizeof(unsigned short));\n}\n\nvoid _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)\n{\n    HDC dc;\n    WORD values[768];\n\n    if (ramp->size != 256)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Win32: Gamma ramp size must be 256\");\n        return;\n    }\n\n    memcpy(values +   0, ramp->red,   256 * sizeof(unsigned short));\n    memcpy(values + 256, ramp->green, 256 * sizeof(unsigned short));\n    memcpy(values + 512, ramp->blue,  256 * sizeof(unsigned short));\n\n    dc = CreateDCW(L\"DISPLAY\", monitor->win32.adapterName, NULL, NULL);\n    SetDeviceGammaRamp(dc, values);\n    DeleteDC(dc);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return monitor->win32.publicAdapterName;\n}\n\nGLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return monitor->win32.publicDisplayName;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/win32_platform.h",
    "content": "//========================================================================\n// GLFW 3.3 Win32 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n// We don't need all the fancy stuff\n#ifndef NOMINMAX\n #define NOMINMAX\n#endif\n\n#ifndef VC_EXTRALEAN\n #define VC_EXTRALEAN\n#endif\n\n#ifndef WIN32_LEAN_AND_MEAN\n #define WIN32_LEAN_AND_MEAN\n#endif\n\n// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for\n// example to allow applications to correctly declare a GL_ARB_debug_output\n// callback) but windows.h assumes no one will define APIENTRY before it does\n#undef APIENTRY\n\n// GLFW on Windows is Unicode only and does not work in MBCS mode\n#ifndef UNICODE\n #define UNICODE\n#endif\n\n// GLFW requires Windows XP or later\n#if WINVER < 0x0501\n #undef WINVER\n #define WINVER 0x0501\n#endif\n#if _WIN32_WINNT < 0x0501\n #undef _WIN32_WINNT\n #define _WIN32_WINNT 0x0501\n#endif\n\n// GLFW uses DirectInput8 interfaces\n#define DIRECTINPUT_VERSION 0x0800\n\n#include <wctype.h>\n#include <windows.h>\n#include <dinput.h>\n#include <xinput.h>\n#include <dbt.h>\n\n#if defined(_MSC_VER)\n #include <malloc.h>\n #define strdup _strdup\n#endif\n\n// HACK: Define macros that some windows.h variants don't\n#ifndef WM_MOUSEHWHEEL\n #define WM_MOUSEHWHEEL 0x020E\n#endif\n#ifndef WM_DWMCOMPOSITIONCHANGED\n #define WM_DWMCOMPOSITIONCHANGED 0x031E\n#endif\n#ifndef WM_COPYGLOBALDATA\n #define WM_COPYGLOBALDATA 0x0049\n#endif\n#ifndef WM_UNICHAR\n #define WM_UNICHAR 0x0109\n#endif\n#ifndef UNICODE_NOCHAR\n #define UNICODE_NOCHAR 0xFFFF\n#endif\n#ifndef WM_DPICHANGED\n #define WM_DPICHANGED 0x02E0\n#endif\n#ifndef GET_XBUTTON_WPARAM\n #define GET_XBUTTON_WPARAM(w) (HIWORD(w))\n#endif\n#ifndef EDS_ROTATEDMODE\n #define EDS_ROTATEDMODE 0x00000004\n#endif\n#ifndef DISPLAY_DEVICE_ACTIVE\n #define DISPLAY_DEVICE_ACTIVE 0x00000001\n#endif\n#ifndef _WIN32_WINNT_WINBLUE\n #define _WIN32_WINNT_WINBLUE 0x0602\n#endif\n\n#if WINVER < 0x0601\ntypedef struct tagCHANGEFILTERSTRUCT\n{\n    DWORD cbSize;\n    DWORD ExtStatus;\n\n} CHANGEFILTERSTRUCT, *PCHANGEFILTERSTRUCT;\n#ifndef MSGFLT_ALLOW\n #define MSGFLT_ALLOW 1\n#endif\n#endif /*Windows 7*/\n\n#if WINVER < 0x0600\n#define DWM_BB_ENABLE 0x00000001\n#define DWM_BB_BLURREGION 0x00000002\ntypedef struct\n{\n    DWORD dwFlags;\n    BOOL fEnable;\n    HRGN hRgnBlur;\n    BOOL fTransitionOnMaximized;\n} DWM_BLURBEHIND;\n#endif /*Windows Vista*/\n\n#ifndef DPI_ENUMS_DECLARED\ntypedef enum PROCESS_DPI_AWARENESS\n{\n    PROCESS_DPI_UNAWARE = 0,\n    PROCESS_SYSTEM_DPI_AWARE = 1,\n    PROCESS_PER_MONITOR_DPI_AWARE = 2\n} PROCESS_DPI_AWARENESS;\n#endif /*DPI_ENUMS_DECLARED*/\n\n// HACK: Define versionhelpers.h functions manually as MinGW lacks the header\nBOOL IsWindowsVersionOrGreater(WORD major, WORD minor, WORD sp);\n#define IsWindowsVistaOrGreater()                              \\\n    IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA),      \\\n                              LOBYTE(_WIN32_WINNT_VISTA), 0)\n#define IsWindows7OrGreater()                                  \\\n    IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7),       \\\n                              LOBYTE(_WIN32_WINNT_WIN7), 0)\n#define IsWindows8OrGreater()                                  \\\n    IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8),       \\\n                              LOBYTE(_WIN32_WINNT_WIN8), 0)\n#define IsWindows8Point1OrGreater()                            \\\n    IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE),    \\\n                              LOBYTE(_WIN32_WINNT_WINBLUE), 0)\n\n// HACK: Define macros that some xinput.h variants don't\n#ifndef XINPUT_CAPS_WIRELESS\n #define XINPUT_CAPS_WIRELESS 0x0002\n#endif\n#ifndef XINPUT_DEVSUBTYPE_WHEEL\n #define XINPUT_DEVSUBTYPE_WHEEL 0x02\n#endif\n#ifndef XINPUT_DEVSUBTYPE_ARCADE_STICK\n #define XINPUT_DEVSUBTYPE_ARCADE_STICK 0x03\n#endif\n#ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK\n #define XINPUT_DEVSUBTYPE_FLIGHT_STICK 0x04\n#endif\n#ifndef XINPUT_DEVSUBTYPE_DANCE_PAD\n #define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05\n#endif\n#ifndef XINPUT_DEVSUBTYPE_GUITAR\n #define XINPUT_DEVSUBTYPE_GUITAR 0x06\n#endif\n#ifndef XINPUT_DEVSUBTYPE_DRUM_KIT\n #define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08\n#endif\n#ifndef XINPUT_DEVSUBTYPE_ARCADE_PAD\n #define XINPUT_DEVSUBTYPE_ARCADE_PAD 0x13\n#endif\n#ifndef XUSER_MAX_COUNT\n #define XUSER_MAX_COUNT 4\n#endif\n\n// HACK: Define macros that some dinput.h variants don't\n#ifndef DIDFT_OPTIONAL\n #define DIDFT_OPTIONAL\t0x80000000\n#endif\n\n// winmm.dll function pointer typedefs\ntypedef DWORD (WINAPI * PFN_timeGetTime)(void);\n#define timeGetTime _glfw.win32.winmm.GetTime\n\n// xinput.dll function pointer typedefs\ntypedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);\ntypedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);\n#define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities\n#define XInputGetState _glfw.win32.xinput.GetState\n\n// dinput8.dll function pointer typedefs\ntypedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);\n#define DirectInput8Create _glfw.win32.dinput8.Create\n\n// user32.dll function pointer typedefs\ntypedef BOOL (WINAPI * PFN_SetProcessDPIAware)(void);\ntypedef BOOL (WINAPI * PFN_ChangeWindowMessageFilterEx)(HWND,UINT,DWORD,PCHANGEFILTERSTRUCT);\n#define SetProcessDPIAware _glfw.win32.user32.SetProcessDPIAware_\n#define ChangeWindowMessageFilterEx _glfw.win32.user32.ChangeWindowMessageFilterEx_\n\n// dwmapi.dll function pointer typedefs\ntypedef HRESULT (WINAPI * PFN_DwmIsCompositionEnabled)(BOOL*);\ntypedef HRESULT (WINAPI * PFN_DwmFlush)(VOID);\ntypedef HRESULT(WINAPI * PFN_DwmEnableBlurBehindWindow)(HWND,const DWM_BLURBEHIND*);\n#define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled\n#define DwmFlush _glfw.win32.dwmapi.Flush\n#define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow\n\n// shcore.dll function pointer typedefs\ntypedef HRESULT (WINAPI * PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS);\n#define SetProcessDpiAwareness _glfw.win32.shcore.SetProcessDpiAwareness_\n\ntypedef VkFlags VkWin32SurfaceCreateFlagsKHR;\n\ntypedef struct VkWin32SurfaceCreateInfoKHR\n{\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkWin32SurfaceCreateFlagsKHR    flags;\n    HINSTANCE                       hinstance;\n    HWND                            hwnd;\n} VkWin32SurfaceCreateInfoKHR;\n\ntypedef VkResult (APIENTRY *PFN_vkCreateWin32SurfaceKHR)(VkInstance,const VkWin32SurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);\ntypedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice,uint32_t);\n\n#include \"win32_joystick.h\"\n#include \"wgl_context.h\"\n#include \"egl_context.h\"\n#include \"osmesa_context.h\"\n\n#define _GLFW_WNDCLASSNAME L\"GLFW30\"\n\n#define _glfw_dlopen(name) LoadLibraryA(name)\n#define _glfw_dlclose(handle) FreeLibrary((HMODULE) handle)\n#define _glfw_dlsym(handle, name) GetProcAddress((HMODULE) handle, name)\n\n#define _GLFW_EGL_NATIVE_WINDOW  ((EGLNativeWindowType) window->win32.handle)\n#define _GLFW_EGL_NATIVE_DISPLAY EGL_DEFAULT_DISPLAY\n\n#define _GLFW_PLATFORM_WINDOW_STATE         _GLFWwindowWin32  win32\n#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 win32\n#define _GLFW_PLATFORM_LIBRARY_TIMER_STATE  _GLFWtimerWin32   win32\n#define _GLFW_PLATFORM_MONITOR_STATE        _GLFWmonitorWin32 win32\n#define _GLFW_PLATFORM_CURSOR_STATE         _GLFWcursorWin32  win32\n#define _GLFW_PLATFORM_TLS_STATE            _GLFWtlsWin32     win32\n#define _GLFW_PLATFORM_MUTEX_STATE          _GLFWmutexWin32   win32\n\n\n// Win32-specific per-window data\n//\ntypedef struct _GLFWwindowWin32\n{\n    HWND                handle;\n    HICON               bigIcon;\n    HICON               smallIcon;\n\n    GLFWbool            cursorTracked;\n    GLFWbool            frameAction;\n    GLFWbool            iconified;\n    GLFWbool            maximized;\n    // Whether to enable framebuffer transparency on DWM\n    GLFWbool            transparent;\n\n    // The last received cursor position, regardless of source\n    int                 lastCursorPosX, lastCursorPosY;\n\n} _GLFWwindowWin32;\n\n// Win32-specific global data\n//\ntypedef struct _GLFWlibraryWin32\n{\n    HWND                helperWindowHandle;\n    DWORD               foregroundLockTimeout;\n    int                 acquiredMonitorCount;\n    char*               clipboardString;\n    short int           keycodes[512];\n    short int           scancodes[GLFW_KEY_LAST + 1];\n    char                keynames[GLFW_KEY_LAST + 1][5];\n    // Where to place the cursor when re-enabled\n    double              restoreCursorPosX, restoreCursorPosY;\n    // The window whose disabled cursor mode is active\n    _GLFWwindow*        disabledCursorWindow;\n    RAWINPUT*           rawInput;\n    int                 rawInputSize;\n\n    struct {\n        HINSTANCE                       instance;\n        PFN_timeGetTime                 GetTime;\n    } winmm;\n\n    struct {\n        HINSTANCE                       instance;\n        PFN_DirectInput8Create          Create;\n        IDirectInput8W*                 api;\n    } dinput8;\n\n    struct {\n        HINSTANCE                       instance;\n        PFN_XInputGetCapabilities       GetCapabilities;\n        PFN_XInputGetState              GetState;\n    } xinput;\n\n    struct {\n        HINSTANCE                       instance;\n        PFN_SetProcessDPIAware          SetProcessDPIAware_;\n        PFN_ChangeWindowMessageFilterEx ChangeWindowMessageFilterEx_;\n    } user32;\n\n    struct {\n        HINSTANCE                       instance;\n        PFN_DwmIsCompositionEnabled     IsCompositionEnabled;\n        PFN_DwmFlush                    Flush;\n        PFN_DwmEnableBlurBehindWindow   EnableBlurBehindWindow;\n    } dwmapi;\n\n    struct {\n        HINSTANCE                       instance;\n        PFN_SetProcessDpiAwareness      SetProcessDpiAwareness_;\n    } shcore;\n\n} _GLFWlibraryWin32;\n\n// Win32-specific per-monitor data\n//\ntypedef struct _GLFWmonitorWin32\n{\n    HMONITOR            handle;\n    // This size matches the static size of DISPLAY_DEVICE.DeviceName\n    WCHAR               adapterName[32];\n    WCHAR               displayName[32];\n    char                publicAdapterName[64];\n    char                publicDisplayName[64];\n    GLFWbool            modesPruned;\n    GLFWbool            modeChanged;\n\n} _GLFWmonitorWin32;\n\n// Win32-specific per-cursor data\n//\ntypedef struct _GLFWcursorWin32\n{\n    HCURSOR             handle;\n\n} _GLFWcursorWin32;\n\n// Win32-specific global timer data\n//\ntypedef struct _GLFWtimerWin32\n{\n    GLFWbool            hasPC;\n    uint64_t            frequency;\n\n} _GLFWtimerWin32;\n\n// Win32-specific thread local storage data\n//\ntypedef struct _GLFWtlsWin32\n{\n    GLFWbool            allocated;\n    DWORD               index;\n\n} _GLFWtlsWin32;\n\n// Win32-specific mutex data\n//\ntypedef struct _GLFWmutexWin32\n{\n    GLFWbool            allocated;\n    CRITICAL_SECTION    section;\n\n} _GLFWmutexWin32;\n\n\nGLFWbool _glfwRegisterWindowClassWin32(void);\nvoid _glfwUnregisterWindowClassWin32(void);\nGLFWbool _glfwIsCompositionEnabledWin32(void);\n\nWCHAR* _glfwCreateWideStringFromUTF8Win32(const char* source);\nchar* _glfwCreateUTF8FromWideStringWin32(const WCHAR* source);\nvoid _glfwInputErrorWin32(int error, const char* description);\nvoid _glfwUpdateKeyNamesWin32(void);\n\nvoid _glfwInitTimerWin32(void);\n\nvoid _glfwPollMonitorsWin32(void);\nGLFWbool _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired);\nvoid _glfwRestoreVideoModeWin32(_GLFWmonitor* monitor);\n\n"
  },
  {
    "path": "external/GLFW/src/win32_thread.c",
    "content": "//========================================================================\n// GLFW 3.3 Win32 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <assert.h>\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWbool _glfwPlatformCreateTls(_GLFWtls* tls)\n{\n    assert(tls->win32.allocated == GLFW_FALSE);\n\n    tls->win32.index = TlsAlloc();\n    if (tls->win32.index == TLS_OUT_OF_INDEXES)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to allocate TLS index\");\n        return GLFW_FALSE;\n    }\n\n    tls->win32.allocated = GLFW_TRUE;\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyTls(_GLFWtls* tls)\n{\n    if (tls->win32.allocated)\n        TlsFree(tls->win32.index);\n    memset(tls, 0, sizeof(_GLFWtls));\n}\n\nvoid* _glfwPlatformGetTls(_GLFWtls* tls)\n{\n    assert(tls->win32.allocated == GLFW_TRUE);\n    return TlsGetValue(tls->win32.index);\n}\n\nvoid _glfwPlatformSetTls(_GLFWtls* tls, void* value)\n{\n    assert(tls->win32.allocated == GLFW_TRUE);\n    TlsSetValue(tls->win32.index, value);\n}\n\nGLFWbool _glfwPlatformCreateMutex(_GLFWmutex* mutex)\n{\n    assert(mutex->win32.allocated == GLFW_FALSE);\n    InitializeCriticalSection(&mutex->win32.section);\n    return mutex->win32.allocated = GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyMutex(_GLFWmutex* mutex)\n{\n    if (mutex->win32.allocated)\n        DeleteCriticalSection(&mutex->win32.section);\n    memset(mutex, 0, sizeof(_GLFWmutex));\n}\n\nvoid _glfwPlatformLockMutex(_GLFWmutex* mutex)\n{\n    assert(mutex->win32.allocated == GLFW_TRUE);\n    EnterCriticalSection(&mutex->win32.section);\n}\n\nvoid _glfwPlatformUnlockMutex(_GLFWmutex* mutex)\n{\n    assert(mutex->win32.allocated == GLFW_TRUE);\n    LeaveCriticalSection(&mutex->win32.section);\n}\n\n"
  },
  {
    "path": "external/GLFW/src/win32_time.c",
    "content": "//========================================================================\n// GLFW 3.3 Win32 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Initialise timer\n//\nvoid _glfwInitTimerWin32(void)\n{\n    uint64_t frequency;\n\n    if (QueryPerformanceFrequency((LARGE_INTEGER*) &frequency))\n    {\n        _glfw.timer.win32.hasPC = GLFW_TRUE;\n        _glfw.timer.win32.frequency = frequency;\n    }\n    else\n    {\n        _glfw.timer.win32.hasPC = GLFW_FALSE;\n        _glfw.timer.win32.frequency = 1000;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nuint64_t _glfwPlatformGetTimerValue(void)\n{\n    if (_glfw.timer.win32.hasPC)\n    {\n        uint64_t value;\n        QueryPerformanceCounter((LARGE_INTEGER*) &value);\n        return value;\n    }\n    else\n        return (uint64_t) timeGetTime();\n}\n\nuint64_t _glfwPlatformGetTimerFrequency(void)\n{\n    return _glfw.timer.win32.frequency;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/win32_window.c",
    "content": "//========================================================================\n// GLFW 3.3 Win32 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <limits.h>\n#include <stdlib.h>\n#include <malloc.h>\n#include <string.h>\n#include <windowsx.h>\n#include <shellapi.h>\n\n#define _GLFW_KEY_INVALID -2\n\n// Returns the window style for the specified window\n//\nstatic DWORD getWindowStyle(const _GLFWwindow* window)\n{\n    DWORD style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN;\n\n    if (window->monitor)\n        style |= WS_POPUP;\n    else\n    {\n        style |= WS_SYSMENU | WS_MINIMIZEBOX;\n\n        if (window->decorated)\n        {\n            style |= WS_CAPTION;\n\n            if (window->resizable)\n                style |= WS_MAXIMIZEBOX | WS_THICKFRAME;\n        }\n        else\n            style |= WS_POPUP;\n    }\n\n    return style;\n}\n\n// Returns the extended window style for the specified window\n//\nstatic DWORD getWindowExStyle(const _GLFWwindow* window)\n{\n    DWORD style = WS_EX_APPWINDOW;\n\n    if (window->monitor || window->floating)\n        style |= WS_EX_TOPMOST;\n\n    return style;\n}\n\n// Returns the image whose area most closely matches the desired one\n//\nstatic const GLFWimage* chooseImage(int count, const GLFWimage* images,\n                                    int width, int height)\n{\n    int i, leastDiff = INT_MAX;\n    const GLFWimage* closest = NULL;\n\n    for (i = 0;  i < count;  i++)\n    {\n        const int currDiff = abs(images[i].width * images[i].height -\n                                 width * height);\n        if (currDiff < leastDiff)\n        {\n            closest = images + i;\n            leastDiff = currDiff;\n        }\n    }\n\n    return closest;\n}\n\n// Creates an RGBA icon or cursor\n//\nstatic HICON createIcon(const GLFWimage* image,\n                        int xhot, int yhot, GLFWbool icon)\n{\n    int i;\n    HDC dc;\n    HICON handle;\n    HBITMAP color, mask;\n    BITMAPV5HEADER bi;\n    ICONINFO ii;\n    unsigned char* target = NULL;\n    unsigned char* source = image->pixels;\n\n    ZeroMemory(&bi, sizeof(bi));\n    bi.bV5Size        = sizeof(bi);\n    bi.bV5Width       = image->width;\n    bi.bV5Height      = -image->height;\n    bi.bV5Planes      = 1;\n    bi.bV5BitCount    = 32;\n    bi.bV5Compression = BI_BITFIELDS;\n    bi.bV5RedMask     = 0x00ff0000;\n    bi.bV5GreenMask   = 0x0000ff00;\n    bi.bV5BlueMask    = 0x000000ff;\n    bi.bV5AlphaMask   = 0xff000000;\n\n    dc = GetDC(NULL);\n    color = CreateDIBSection(dc,\n                             (BITMAPINFO*) &bi,\n                             DIB_RGB_COLORS,\n                             (void**) &target,\n                             NULL,\n                             (DWORD) 0);\n    ReleaseDC(NULL, dc);\n\n    if (!color)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to create RGBA bitmap\");\n        return NULL;\n    }\n\n    mask = CreateBitmap(image->width, image->height, 1, 1, NULL);\n    if (!mask)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to create mask bitmap\");\n        DeleteObject(color);\n        return NULL;\n    }\n\n    for (i = 0;  i < image->width * image->height;  i++)\n    {\n        target[0] = source[2];\n        target[1] = source[1];\n        target[2] = source[0];\n        target[3] = source[3];\n        target += 4;\n        source += 4;\n    }\n\n    ZeroMemory(&ii, sizeof(ii));\n    ii.fIcon    = icon;\n    ii.xHotspot = xhot;\n    ii.yHotspot = yhot;\n    ii.hbmMask  = mask;\n    ii.hbmColor = color;\n\n    handle = CreateIconIndirect(&ii);\n\n    DeleteObject(color);\n    DeleteObject(mask);\n\n    if (!handle)\n    {\n        if (icon)\n        {\n            _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                                 \"Win32: Failed to create icon\");\n        }\n        else\n        {\n            _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                                 \"Win32: Failed to create cursor\");\n        }\n    }\n\n    return handle;\n}\n\n// Translate client window size to full window size according to styles\n//\nstatic void getFullWindowSize(DWORD style, DWORD exStyle,\n                              int clientWidth, int clientHeight,\n                              int* fullWidth, int* fullHeight)\n{\n    RECT rect = { 0, 0, clientWidth, clientHeight };\n    AdjustWindowRectEx(&rect, style, FALSE, exStyle);\n    *fullWidth = rect.right - rect.left;\n    *fullHeight = rect.bottom - rect.top;\n}\n\n// Enforce the client rect aspect ratio based on which edge is being dragged\n//\nstatic void applyAspectRatio(_GLFWwindow* window, int edge, RECT* area)\n{\n    int xoff, yoff;\n    const float ratio = (float) window->numer / (float) window->denom;\n\n    getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),\n                      0, 0, &xoff, &yoff);\n\n    if (edge == WMSZ_LEFT  || edge == WMSZ_BOTTOMLEFT ||\n        edge == WMSZ_RIGHT || edge == WMSZ_BOTTOMRIGHT)\n    {\n        area->bottom = area->top + yoff +\n            (int) ((area->right - area->left - xoff) / ratio);\n    }\n    else if (edge == WMSZ_TOPLEFT || edge == WMSZ_TOPRIGHT)\n    {\n        area->top = area->bottom - yoff -\n            (int) ((area->right - area->left - xoff) / ratio);\n    }\n    else if (edge == WMSZ_TOP || edge == WMSZ_BOTTOM)\n    {\n        area->right = area->left + xoff +\n            (int) ((area->bottom - area->top - yoff) * ratio);\n    }\n}\n\n// Centers the cursor over the window client area\n//\nstatic void centerCursor(_GLFWwindow* window)\n{\n    int width, height;\n    _glfwPlatformGetWindowSize(window, &width, &height);\n    _glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0);\n}\n\n// Returns whether the cursor is in the client area of the specified window\n//\nstatic GLFWbool cursorInClientArea(_GLFWwindow* window)\n{\n    RECT area;\n    POINT pos;\n\n    if (!GetCursorPos(&pos))\n        return GLFW_FALSE;\n\n    if (WindowFromPoint(pos) != window->win32.handle)\n        return GLFW_FALSE;\n\n    GetClientRect(window->win32.handle, &area);\n    ClientToScreen(window->win32.handle, (POINT*) &area.left);\n    ClientToScreen(window->win32.handle, (POINT*) &area.right);\n\n    return PtInRect(&area, pos);\n}\n\n// Updates the cursor image according to its cursor mode\n//\nstatic void updateCursorImage(_GLFWwindow* window)\n{\n    if (window->cursorMode == GLFW_CURSOR_NORMAL)\n    {\n        if (window->cursor)\n            SetCursor(window->cursor->win32.handle);\n        else\n            SetCursor(LoadCursorW(NULL, IDC_ARROW));\n    }\n    else\n        SetCursor(NULL);\n}\n\n// Updates the cursor clip rect\n//\nstatic void updateClipRect(_GLFWwindow* window)\n{\n    if (window)\n    {\n        RECT clipRect;\n        GetClientRect(window->win32.handle, &clipRect);\n        ClientToScreen(window->win32.handle, (POINT*) &clipRect.left);\n        ClientToScreen(window->win32.handle, (POINT*) &clipRect.right);\n        ClipCursor(&clipRect);\n    }\n    else\n        ClipCursor(NULL);\n}\n\n// Update native window styles to match attributes\n//\nstatic void updateWindowStyles(const _GLFWwindow* window)\n{\n    RECT rect;\n    DWORD style = GetWindowLongW(window->win32.handle, GWL_STYLE);\n    style &= ~(WS_OVERLAPPEDWINDOW | WS_POPUP);\n    style |= getWindowStyle(window);\n\n    GetClientRect(window->win32.handle, &rect);\n    AdjustWindowRectEx(&rect, style, FALSE, getWindowExStyle(window));\n    ClientToScreen(window->win32.handle, (POINT*) &rect.left);\n    ClientToScreen(window->win32.handle, (POINT*) &rect.right);\n    SetWindowLongW(window->win32.handle, GWL_STYLE, style);\n    SetWindowPos(window->win32.handle, HWND_TOP,\n                 rect.left, rect.top,\n                 rect.right - rect.left, rect.bottom - rect.top,\n                 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOZORDER);\n}\n\n// Update window framebuffer transparency\n//\nstatic void updateFramebufferTransparency(const _GLFWwindow* window)\n{\n    if (!IsWindowsVistaOrGreater())\n        return;\n\n    if (_glfwIsCompositionEnabledWin32())\n    {\n        HRGN region = CreateRectRgn(0, 0, -1, -1);\n        DWM_BLURBEHIND bb = {0};\n        bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;\n        bb.hRgnBlur = region;\n        bb.fEnable = TRUE;\n\n        if (SUCCEEDED(DwmEnableBlurBehindWindow(window->win32.handle, &bb)))\n        {\n            // Decorated windows don't repaint the transparent background\n            // leaving a trail behind animations\n            // HACK: Making the window layered with a transparency color key\n            //       seems to fix this.  Normally, when specifying\n            //       a transparency color key to be used when composing the\n            //       layered window, all pixels painted by the window in this\n            //       color will be transparent.  That doesn't seem to be the\n            //       case anymore, at least when used with blur behind window\n            //       plus negative region.\n            LONG exStyle = GetWindowLongW(window->win32.handle, GWL_EXSTYLE);\n            exStyle |= WS_EX_LAYERED;\n            SetWindowLongW(window->win32.handle, GWL_EXSTYLE, exStyle);\n\n            // Using a color key not equal to black to fix the trailing\n            // issue.  When set to black, something is making the hit test\n            // not resize with the window frame.\n            SetLayeredWindowAttributes(window->win32.handle,\n                                       RGB(0, 193, 48), 255, LWA_COLORKEY);\n        }\n\n        DeleteObject(region);\n    }\n    else\n    {\n        LONG exStyle = GetWindowLongW(window->win32.handle, GWL_EXSTYLE);\n        exStyle &= ~WS_EX_LAYERED;\n        SetWindowLongW(window->win32.handle, GWL_EXSTYLE, exStyle);\n        RedrawWindow(window->win32.handle, NULL, NULL,\n                     RDW_ERASE | RDW_INVALIDATE | RDW_FRAME);\n    }\n}\n\n// Translates a GLFW standard cursor to a resource ID\n//\nstatic LPWSTR translateCursorShape(int shape)\n{\n    switch (shape)\n    {\n        case GLFW_ARROW_CURSOR:\n            return IDC_ARROW;\n        case GLFW_IBEAM_CURSOR:\n            return IDC_IBEAM;\n        case GLFW_CROSSHAIR_CURSOR:\n            return IDC_CROSS;\n        case GLFW_HAND_CURSOR:\n            return IDC_HAND;\n        case GLFW_HRESIZE_CURSOR:\n            return IDC_SIZEWE;\n        case GLFW_VRESIZE_CURSOR:\n            return IDC_SIZENS;\n    }\n\n    return NULL;\n}\n\n// Retrieves and translates modifier keys\n//\nstatic int getKeyMods(void)\n{\n    int mods = 0;\n\n    if (GetKeyState(VK_SHIFT) & (1 << 31))\n        mods |= GLFW_MOD_SHIFT;\n    if (GetKeyState(VK_CONTROL) & (1 << 31))\n        mods |= GLFW_MOD_CONTROL;\n    if (GetKeyState(VK_MENU) & (1 << 31))\n        mods |= GLFW_MOD_ALT;\n    if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & (1 << 31))\n        mods |= GLFW_MOD_SUPER;\n\n    return mods;\n}\n\n// Retrieves and translates modifier keys\n//\nstatic int getAsyncKeyMods(void)\n{\n    int mods = 0;\n\n    if (GetAsyncKeyState(VK_SHIFT) & (1 << 31))\n        mods |= GLFW_MOD_SHIFT;\n    if (GetAsyncKeyState(VK_CONTROL) & (1 << 31))\n        mods |= GLFW_MOD_CONTROL;\n    if (GetAsyncKeyState(VK_MENU) & (1 << 31))\n        mods |= GLFW_MOD_ALT;\n    if ((GetAsyncKeyState(VK_LWIN) | GetAsyncKeyState(VK_RWIN)) & (1 << 31))\n        mods |= GLFW_MOD_SUPER;\n\n    return mods;\n}\n\n// Translates a Windows key to the corresponding GLFW key\n//\nstatic int translateKey(WPARAM wParam, LPARAM lParam)\n{\n    // The Ctrl keys require special handling\n    if (wParam == VK_CONTROL)\n    {\n        MSG next;\n        DWORD time;\n\n        // Right side keys have the extended key bit set\n        if (lParam & 0x01000000)\n            return GLFW_KEY_RIGHT_CONTROL;\n\n        // HACK: Alt Gr sends Left Ctrl and then Right Alt in close sequence\n        //       We only want the Right Alt message, so if the next message is\n        //       Right Alt we ignore this (synthetic) Left Ctrl message\n        time = GetMessageTime();\n\n        if (PeekMessageW(&next, NULL, 0, 0, PM_NOREMOVE))\n        {\n            if (next.message == WM_KEYDOWN ||\n                next.message == WM_SYSKEYDOWN ||\n                next.message == WM_KEYUP ||\n                next.message == WM_SYSKEYUP)\n            {\n                if (next.wParam == VK_MENU &&\n                    (next.lParam & 0x01000000) &&\n                    next.time == time)\n                {\n                    // Next message is Right Alt down so discard this\n                    return _GLFW_KEY_INVALID;\n                }\n            }\n        }\n\n        return GLFW_KEY_LEFT_CONTROL;\n    }\n\n    if (wParam == VK_PROCESSKEY)\n    {\n        // IME notifies that keys have been filtered by setting the virtual\n        // key-code to VK_PROCESSKEY\n        return _GLFW_KEY_INVALID;\n    }\n\n    return _glfw.win32.keycodes[HIWORD(lParam) & 0x1FF];\n}\n\n// Make the specified window and its video mode active on its monitor\n//\nstatic GLFWbool acquireMonitor(_GLFWwindow* window)\n{\n    GLFWvidmode mode;\n    GLFWbool status;\n    int xpos, ypos;\n\n    if (!_glfw.win32.acquiredMonitorCount)\n        SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED);\n    if (!window->monitor->window)\n        _glfw.win32.acquiredMonitorCount++;\n\n    status = _glfwSetVideoModeWin32(window->monitor, &window->videoMode);\n\n    _glfwPlatformGetVideoMode(window->monitor, &mode);\n    _glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);\n\n    SetWindowPos(window->win32.handle, HWND_TOPMOST,\n                 xpos, ypos, mode.width, mode.height,\n                 SWP_NOACTIVATE | SWP_NOCOPYBITS);\n\n    _glfwInputMonitorWindow(window->monitor, window);\n    return status;\n}\n\n// Remove the window and restore the original video mode\n//\nstatic void releaseMonitor(_GLFWwindow* window)\n{\n    if (window->monitor->window != window)\n        return;\n\n    _glfw.win32.acquiredMonitorCount--;\n    if (!_glfw.win32.acquiredMonitorCount)\n        SetThreadExecutionState(ES_CONTINUOUS);\n\n    _glfwInputMonitorWindow(window->monitor, NULL);\n    _glfwRestoreVideoModeWin32(window->monitor);\n}\n\n// Window callback function (handles window messages)\n//\nstatic LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,\n                                   WPARAM wParam, LPARAM lParam)\n{\n    _GLFWwindow* window = GetPropW(hWnd, L\"GLFW\");\n    if (!window)\n    {\n        // This is the message handling for the hidden helper window\n\n        switch (uMsg)\n        {\n            case WM_DISPLAYCHANGE:\n                _glfwPollMonitorsWin32();\n                break;\n\n            case WM_DEVICECHANGE:\n            {\n                if (wParam == DBT_DEVICEARRIVAL)\n                {\n                    DEV_BROADCAST_HDR* dbh = (DEV_BROADCAST_HDR*) lParam;\n                    if (dbh && dbh->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)\n                        _glfwDetectJoystickConnectionWin32();\n                }\n                else if (wParam == DBT_DEVICEREMOVECOMPLETE)\n                {\n                    DEV_BROADCAST_HDR* dbh = (DEV_BROADCAST_HDR*) lParam;\n                    if (dbh && dbh->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)\n                        _glfwDetectJoystickDisconnectionWin32();\n                }\n\n                break;\n            }\n        }\n\n        return DefWindowProcW(hWnd, uMsg, wParam, lParam);\n    }\n\n    switch (uMsg)\n    {\n        case WM_MOUSEACTIVATE:\n        {\n            // HACK: Postpone cursor disabling when the window was activated by\n            //       clicking a caption button\n            if (HIWORD(lParam) == WM_LBUTTONDOWN)\n            {\n                if (LOWORD(lParam) == HTCLOSE ||\n                    LOWORD(lParam) == HTMINBUTTON ||\n                    LOWORD(lParam) == HTMAXBUTTON)\n                {\n                    window->win32.frameAction = GLFW_TRUE;\n                }\n            }\n\n            break;\n        }\n\n        case WM_CAPTURECHANGED:\n        {\n            // HACK: Disable the cursor once the caption button action has been\n            //       completed or cancelled\n            if (lParam == 0 && window->win32.frameAction)\n            {\n                if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                    _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);\n\n                window->win32.frameAction = GLFW_FALSE;\n            }\n\n            break;\n        }\n\n        case WM_SETFOCUS:\n        {\n            _glfwInputWindowFocus(window, GLFW_TRUE);\n\n            // HACK: Do not disable cursor while the user is interacting with\n            //       a caption button\n            if (window->win32.frameAction)\n                break;\n\n            if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);\n\n            return 0;\n        }\n\n        case WM_KILLFOCUS:\n        {\n            if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                _glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL);\n\n            if (window->monitor && window->autoIconify)\n                _glfwPlatformIconifyWindow(window);\n\n            _glfwInputWindowFocus(window, GLFW_FALSE);\n            return 0;\n        }\n\n        case WM_SYSCOMMAND:\n        {\n            switch (wParam & 0xfff0)\n            {\n                case SC_SCREENSAVE:\n                case SC_MONITORPOWER:\n                {\n                    if (window->monitor)\n                    {\n                        // We are running in full screen mode, so disallow\n                        // screen saver and screen blanking\n                        return 0;\n                    }\n                    else\n                        break;\n                }\n\n                // User trying to access application menu using ALT?\n                case SC_KEYMENU:\n                    return 0;\n            }\n            break;\n        }\n\n        case WM_CLOSE:\n        {\n            _glfwInputWindowCloseRequest(window);\n            return 0;\n        }\n\n        case WM_INPUTLANGCHANGE:\n        {\n            _glfwUpdateKeyNamesWin32();\n            break;\n        }\n\n        case WM_CHAR:\n        case WM_SYSCHAR:\n        case WM_UNICHAR:\n        {\n            const GLFWbool plain = (uMsg != WM_SYSCHAR);\n\n            if (uMsg == WM_UNICHAR && wParam == UNICODE_NOCHAR)\n            {\n                // WM_UNICHAR is not sent by Windows, but is sent by some\n                // third-party input method engine\n                // Returning TRUE here announces support for this message\n                return TRUE;\n            }\n\n            _glfwInputChar(window, (unsigned int) wParam, getKeyMods(), plain);\n            return 0;\n        }\n\n        case WM_KEYDOWN:\n        case WM_SYSKEYDOWN:\n        case WM_KEYUP:\n        case WM_SYSKEYUP:\n        {\n            const int key = translateKey(wParam, lParam);\n            const int scancode = (lParam >> 16) & 0x1ff;\n            const int action = ((lParam >> 31) & 1) ? GLFW_RELEASE : GLFW_PRESS;\n            const int mods = getKeyMods();\n\n            if (key == _GLFW_KEY_INVALID)\n                break;\n\n            if (action == GLFW_RELEASE && wParam == VK_SHIFT)\n            {\n                // HACK: Release both Shift keys on Shift up event, as when both\n                //       are pressed the first release does not emit any event\n                // NOTE: The other half of this is in _glfwPlatformPollEvents\n                _glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, scancode, action, mods);\n                _glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, scancode, action, mods);\n            }\n            else if (wParam == VK_SNAPSHOT)\n            {\n                // HACK: Key down is not reported for the Print Screen key\n                _glfwInputKey(window, key, scancode, GLFW_PRESS, mods);\n                _glfwInputKey(window, key, scancode, GLFW_RELEASE, mods);\n            }\n            else\n                _glfwInputKey(window, key, scancode, action, mods);\n\n            break;\n        }\n\n        case WM_LBUTTONDOWN:\n        case WM_RBUTTONDOWN:\n        case WM_MBUTTONDOWN:\n        case WM_XBUTTONDOWN:\n        case WM_LBUTTONUP:\n        case WM_RBUTTONUP:\n        case WM_MBUTTONUP:\n        case WM_XBUTTONUP:\n        {\n            int i, button, action;\n\n            if (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP)\n                button = GLFW_MOUSE_BUTTON_LEFT;\n            else if (uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONUP)\n                button = GLFW_MOUSE_BUTTON_RIGHT;\n            else if (uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONUP)\n                button = GLFW_MOUSE_BUTTON_MIDDLE;\n            else if (GET_XBUTTON_WPARAM(wParam) == XBUTTON1)\n                button = GLFW_MOUSE_BUTTON_4;\n            else\n                button = GLFW_MOUSE_BUTTON_5;\n\n            if (uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN ||\n                uMsg == WM_MBUTTONDOWN || uMsg == WM_XBUTTONDOWN)\n            {\n                action = GLFW_PRESS;\n            }\n            else\n                action = GLFW_RELEASE;\n\n            for (i = 0;  i <= GLFW_MOUSE_BUTTON_LAST;  i++)\n            {\n                if (window->mouseButtons[i] == GLFW_PRESS)\n                    break;\n            }\n\n            if (i > GLFW_MOUSE_BUTTON_LAST)\n                SetCapture(hWnd);\n\n            _glfwInputMouseClick(window, button, action, getKeyMods());\n\n            for (i = 0;  i <= GLFW_MOUSE_BUTTON_LAST;  i++)\n            {\n                if (window->mouseButtons[i] == GLFW_PRESS)\n                    break;\n            }\n\n            if (i > GLFW_MOUSE_BUTTON_LAST)\n                ReleaseCapture();\n\n            if (uMsg == WM_XBUTTONDOWN || uMsg == WM_XBUTTONUP)\n                return TRUE;\n\n            return 0;\n        }\n\n        case WM_MOUSEMOVE:\n        {\n            const int x = GET_X_LPARAM(lParam);\n            const int y = GET_Y_LPARAM(lParam);\n\n            // Disabled cursor motion input is provided by WM_INPUT\n            if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                break;\n\n            _glfwInputCursorPos(window, x, y);\n\n            window->win32.lastCursorPosX = x;\n            window->win32.lastCursorPosY = y;\n\n            if (!window->win32.cursorTracked)\n            {\n                TRACKMOUSEEVENT tme;\n                ZeroMemory(&tme, sizeof(tme));\n                tme.cbSize = sizeof(tme);\n                tme.dwFlags = TME_LEAVE;\n                tme.hwndTrack = window->win32.handle;\n                TrackMouseEvent(&tme);\n\n                window->win32.cursorTracked = GLFW_TRUE;\n                _glfwInputCursorEnter(window, GLFW_TRUE);\n            }\n\n            return 0;\n        }\n\n        case WM_INPUT:\n        {\n            UINT size;\n            HRAWINPUT ri = (HRAWINPUT) lParam;\n            RAWINPUT* data;\n            int dx, dy;\n\n            // Only process input when disabled cursor mode is applied\n            if (_glfw.win32.disabledCursorWindow != window)\n                break;\n\n            GetRawInputData(ri, RID_INPUT, NULL, &size, sizeof(RAWINPUTHEADER));\n            if (size > (UINT) _glfw.win32.rawInputSize)\n            {\n                free(_glfw.win32.rawInput);\n                _glfw.win32.rawInput = calloc(size, 1);\n                _glfw.win32.rawInputSize = size;\n            }\n\n            size = _glfw.win32.rawInputSize;\n            if (GetRawInputData(ri, RID_INPUT,\n                                _glfw.win32.rawInput, &size,\n                                sizeof(RAWINPUTHEADER)) == (UINT) -1)\n            {\n                _glfwInputError(GLFW_PLATFORM_ERROR,\n                                \"Win32: Failed to retrieve raw input data\");\n                break;\n            }\n\n            data = _glfw.win32.rawInput;\n            if (data->data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE)\n            {\n                dx = data->data.mouse.lLastX - window->win32.lastCursorPosX;\n                dy = data->data.mouse.lLastY - window->win32.lastCursorPosY;\n            }\n            else\n            {\n                dx = data->data.mouse.lLastX;\n                dy = data->data.mouse.lLastY;\n            }\n\n            _glfwInputCursorPos(window,\n                                window->virtualCursorPosX + dx,\n                                window->virtualCursorPosY + dy);\n\n            window->win32.lastCursorPosX += dx;\n            window->win32.lastCursorPosY += dy;\n            break;\n        }\n\n        case WM_MOUSELEAVE:\n        {\n            window->win32.cursorTracked = GLFW_FALSE;\n            _glfwInputCursorEnter(window, GLFW_FALSE);\n            return 0;\n        }\n\n        case WM_MOUSEWHEEL:\n        {\n            _glfwInputScroll(window, 0.0, (SHORT) HIWORD(wParam) / (double) WHEEL_DELTA);\n            return 0;\n        }\n\n        case WM_MOUSEHWHEEL:\n        {\n            // This message is only sent on Windows Vista and later\n            // NOTE: The X-axis is inverted for consistency with macOS and X11\n            _glfwInputScroll(window, -((SHORT) HIWORD(wParam) / (double) WHEEL_DELTA), 0.0);\n            return 0;\n        }\n\n        case WM_ENTERSIZEMOVE:\n        case WM_ENTERMENULOOP:\n        {\n            // HACK: Postpone cursor disabling while the user is moving or\n            //       resizing the window or using the menu\n            if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                _glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL);\n\n            break;\n        }\n\n        case WM_EXITSIZEMOVE:\n        case WM_EXITMENULOOP:\n        {\n            // HACK: Disable the cursor once the user is done moving or\n            //       resizing the window or using the menu\n            if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);\n\n            break;\n        }\n\n        case WM_SIZE:\n        {\n            const GLFWbool iconified = wParam == SIZE_MINIMIZED;\n            const GLFWbool maximized = wParam == SIZE_MAXIMIZED ||\n                                       (window->win32.maximized &&\n                                        wParam != SIZE_RESTORED);\n\n            if (_glfw.win32.disabledCursorWindow == window)\n                updateClipRect(window);\n\n            if (window->win32.iconified != iconified)\n                _glfwInputWindowIconify(window, iconified);\n\n            if (window->win32.maximized != maximized)\n                _glfwInputWindowMaximize(window, maximized);\n\n            _glfwInputFramebufferSize(window, LOWORD(lParam), HIWORD(lParam));\n            _glfwInputWindowSize(window, LOWORD(lParam), HIWORD(lParam));\n\n            if (window->monitor && window->win32.iconified != iconified)\n            {\n                if (iconified)\n                    releaseMonitor(window);\n                else\n                    acquireMonitor(window);\n            }\n\n            window->win32.iconified = iconified;\n            window->win32.maximized = maximized;\n            return 0;\n        }\n\n        case WM_MOVE:\n        {\n            if (_glfw.win32.disabledCursorWindow == window)\n                updateClipRect(window);\n\n            // NOTE: This cannot use LOWORD/HIWORD recommended by MSDN, as\n            // those macros do not handle negative window positions correctly\n            _glfwInputWindowPos(window,\n                                GET_X_LPARAM(lParam),\n                                GET_Y_LPARAM(lParam));\n            return 0;\n        }\n\n        case WM_SIZING:\n        {\n            if (window->numer == GLFW_DONT_CARE ||\n                window->denom == GLFW_DONT_CARE)\n            {\n                break;\n            }\n\n            applyAspectRatio(window, (int) wParam, (RECT*) lParam);\n            return TRUE;\n        }\n\n        case WM_GETMINMAXINFO:\n        {\n            int xoff, yoff;\n            MINMAXINFO* mmi = (MINMAXINFO*) lParam;\n\n            if (window->monitor)\n                break;\n\n            getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),\n                              0, 0, &xoff, &yoff);\n\n            if (window->minwidth != GLFW_DONT_CARE &&\n                window->minheight != GLFW_DONT_CARE)\n            {\n                mmi->ptMinTrackSize.x = window->minwidth + xoff;\n                mmi->ptMinTrackSize.y = window->minheight + yoff;\n            }\n\n            if (window->maxwidth != GLFW_DONT_CARE &&\n                window->maxheight != GLFW_DONT_CARE)\n            {\n                mmi->ptMaxTrackSize.x = window->maxwidth + xoff;\n                mmi->ptMaxTrackSize.y = window->maxheight + yoff;\n            }\n\n            return 0;\n        }\n\n        case WM_PAINT:\n        {\n            _glfwInputWindowDamage(window);\n            break;\n        }\n\n        case WM_ERASEBKGND:\n        {\n            return TRUE;\n        }\n\n        case WM_DWMCOMPOSITIONCHANGED:\n        {\n            if (window->win32.transparent)\n                updateFramebufferTransparency(window);\n            return 0;\n        }\n\n        case WM_SETCURSOR:\n        {\n            if (LOWORD(lParam) == HTCLIENT)\n            {\n                updateCursorImage(window);\n                return TRUE;\n            }\n\n            break;\n        }\n\n        case WM_DPICHANGED:\n        {\n            RECT* rect = (RECT*) lParam;\n            SetWindowPos(window->win32.handle,\n                         HWND_TOP,\n                         rect->left,\n                         rect->top,\n                         rect->right - rect->left,\n                         rect->bottom - rect->top,\n                         SWP_NOACTIVATE | SWP_NOZORDER);\n            break;\n        }\n\n        case WM_DROPFILES:\n        {\n            HDROP drop = (HDROP) wParam;\n            POINT pt;\n            int i;\n\n            const int count = DragQueryFileW(drop, 0xffffffff, NULL, 0);\n            char** paths = calloc(count, sizeof(char*));\n\n            // Move the mouse to the position of the drop\n            DragQueryPoint(drop, &pt);\n            _glfwInputCursorPos(window, pt.x, pt.y);\n\n            for (i = 0;  i < count;  i++)\n            {\n                const UINT length = DragQueryFileW(drop, i, NULL, 0);\n                WCHAR* buffer = calloc(length + 1, sizeof(WCHAR));\n\n                DragQueryFileW(drop, i, buffer, length + 1);\n                paths[i] = _glfwCreateUTF8FromWideStringWin32(buffer);\n\n                free(buffer);\n            }\n\n            _glfwInputDrop(window, count, (const char**) paths);\n\n            for (i = 0;  i < count;  i++)\n                free(paths[i]);\n            free(paths);\n\n            DragFinish(drop);\n            return 0;\n        }\n    }\n\n    return DefWindowProcW(hWnd, uMsg, wParam, lParam);\n}\n\n// Creates the GLFW window\n//\nstatic int createNativeWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig,\n                              const _GLFWfbconfig* fbconfig)\n{\n    int xpos, ypos, fullWidth, fullHeight;\n    WCHAR* wideTitle;\n    DWORD style = getWindowStyle(window);\n    DWORD exStyle = getWindowExStyle(window);\n\n    if (window->monitor)\n    {\n        GLFWvidmode mode;\n\n        // NOTE: This window placement is temporary and approximate, as the\n        //       correct position and size cannot be known until the monitor\n        //       video mode has been picked in _glfwSetVideoModeWin32\n        _glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);\n        _glfwPlatformGetVideoMode(window->monitor, &mode);\n        fullWidth  = mode.width;\n        fullHeight = mode.height;\n    }\n    else\n    {\n        xpos = CW_USEDEFAULT;\n        ypos = CW_USEDEFAULT;\n\n        if (wndconfig->maximized)\n            style |= WS_MAXIMIZE;\n\n        getFullWindowSize(style, exStyle,\n                          wndconfig->width, wndconfig->height,\n                          &fullWidth, &fullHeight);\n    }\n\n    wideTitle = _glfwCreateWideStringFromUTF8Win32(wndconfig->title);\n    if (!wideTitle)\n        return GLFW_FALSE;\n\n    window->win32.handle = CreateWindowExW(exStyle,\n                                           _GLFW_WNDCLASSNAME,\n                                           wideTitle,\n                                           style,\n                                           xpos, ypos,\n                                           fullWidth, fullHeight,\n                                           NULL, // No parent window\n                                           NULL, // No window menu\n                                           GetModuleHandleW(NULL),\n                                           NULL);\n\n    free(wideTitle);\n\n    if (!window->win32.handle)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to create window\");\n        return GLFW_FALSE;\n    }\n\n    SetPropW(window->win32.handle, L\"GLFW\", window);\n\n    if (IsWindows7OrGreater())\n    {\n        ChangeWindowMessageFilterEx(window->win32.handle,\n                                    WM_DROPFILES, MSGFLT_ALLOW, NULL);\n        ChangeWindowMessageFilterEx(window->win32.handle,\n                                    WM_COPYDATA, MSGFLT_ALLOW, NULL);\n        ChangeWindowMessageFilterEx(window->win32.handle,\n                                    WM_COPYGLOBALDATA, MSGFLT_ALLOW, NULL);\n    }\n\n    DragAcceptFiles(window->win32.handle, TRUE);\n\n    if (fbconfig->transparent)\n    {\n        updateFramebufferTransparency(window);\n        window->win32.transparent = GLFW_TRUE;\n    }\n\n    return GLFW_TRUE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Registers the GLFW window class\n//\nGLFWbool _glfwRegisterWindowClassWin32(void)\n{\n    WNDCLASSEXW wc;\n\n    ZeroMemory(&wc, sizeof(wc));\n    wc.cbSize        = sizeof(wc);\n    wc.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;\n    wc.lpfnWndProc   = (WNDPROC) windowProc;\n    wc.hInstance     = GetModuleHandleW(NULL);\n    wc.hCursor       = LoadCursorW(NULL, IDC_ARROW);\n    wc.lpszClassName = _GLFW_WNDCLASSNAME;\n\n    // Load user-provided icon if available\n    wc.hIcon = LoadImageW(GetModuleHandleW(NULL),\n                          L\"GLFW_ICON\", IMAGE_ICON,\n                          0, 0, LR_DEFAULTSIZE | LR_SHARED);\n    if (!wc.hIcon)\n    {\n        // No user-provided icon found, load default icon\n        wc.hIcon = LoadImageW(NULL,\n                              IDI_APPLICATION, IMAGE_ICON,\n                              0, 0, LR_DEFAULTSIZE | LR_SHARED);\n    }\n\n    if (!RegisterClassExW(&wc))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to register window class\");\n        return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\n// Unregisters the GLFW window class\n//\nvoid _glfwUnregisterWindowClassWin32(void)\n{\n    UnregisterClassW(_GLFW_WNDCLASSNAME, GetModuleHandleW(NULL));\n}\n\n// Returns whether desktop compositing is enabled\n//\nGLFWbool _glfwIsCompositionEnabledWin32(void)\n{\n    if (IsWindowsVistaOrGreater())\n    {\n        BOOL enabled;\n        if (SUCCEEDED(DwmIsCompositionEnabled(&enabled)))\n            return enabled;\n    }\n\n    return FALSE;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformCreateWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig)\n{\n    if (!createNativeWindow(window, wndconfig, fbconfig))\n        return GLFW_FALSE;\n\n    if (ctxconfig->client != GLFW_NO_API)\n    {\n        if (ctxconfig->source == GLFW_NATIVE_CONTEXT_API)\n        {\n            if (!_glfwInitWGL())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextWGL(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_EGL_CONTEXT_API)\n        {\n            if (!_glfwInitEGL())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API)\n        {\n            if (!_glfwInitOSMesa())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n    }\n\n    if (window->monitor)\n    {\n        _glfwPlatformShowWindow(window);\n        _glfwPlatformFocusWindow(window);\n        if (!acquireMonitor(window))\n            return GLFW_FALSE;\n\n        if (wndconfig->centerCursor)\n            centerCursor(window);\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyWindow(_GLFWwindow* window)\n{\n    if (window->monitor)\n        releaseMonitor(window);\n\n    if (window->context.destroy)\n        window->context.destroy(window);\n\n    if (_glfw.win32.disabledCursorWindow == window)\n        _glfw.win32.disabledCursorWindow = NULL;\n\n    if (window->win32.handle)\n    {\n        RemovePropW(window->win32.handle, L\"GLFW\");\n        DestroyWindow(window->win32.handle);\n        window->win32.handle = NULL;\n    }\n\n    if (window->win32.bigIcon)\n        DestroyIcon(window->win32.bigIcon);\n\n    if (window->win32.smallIcon)\n        DestroyIcon(window->win32.smallIcon);\n}\n\nvoid _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)\n{\n    WCHAR* wideTitle = _glfwCreateWideStringFromUTF8Win32(title);\n    if (!wideTitle)\n        return;\n\n    SetWindowTextW(window->win32.handle, wideTitle);\n    free(wideTitle);\n}\n\nvoid _glfwPlatformSetWindowIcon(_GLFWwindow* window,\n                                int count, const GLFWimage* images)\n{\n    HICON bigIcon = NULL, smallIcon = NULL;\n\n    if (count)\n    {\n        const GLFWimage* bigImage = chooseImage(count, images,\n                                                GetSystemMetrics(SM_CXICON),\n                                                GetSystemMetrics(SM_CYICON));\n        const GLFWimage* smallImage = chooseImage(count, images,\n                                                  GetSystemMetrics(SM_CXSMICON),\n                                                  GetSystemMetrics(SM_CYSMICON));\n\n        bigIcon = createIcon(bigImage, 0, 0, GLFW_TRUE);\n        smallIcon = createIcon(smallImage, 0, 0, GLFW_TRUE);\n    }\n    else\n    {\n        bigIcon = (HICON) GetClassLongPtrW(window->win32.handle, GCLP_HICON);\n        smallIcon = (HICON) GetClassLongPtrW(window->win32.handle, GCLP_HICONSM);\n    }\n\n    SendMessage(window->win32.handle, WM_SETICON, ICON_BIG, (LPARAM) bigIcon);\n    SendMessage(window->win32.handle, WM_SETICON, ICON_SMALL, (LPARAM) smallIcon);\n\n    if (window->win32.bigIcon)\n        DestroyIcon(window->win32.bigIcon);\n\n    if (window->win32.smallIcon)\n        DestroyIcon(window->win32.smallIcon);\n\n    if (count)\n    {\n        window->win32.bigIcon = bigIcon;\n        window->win32.smallIcon = smallIcon;\n    }\n}\n\nvoid _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)\n{\n    POINT pos = { 0, 0 };\n    ClientToScreen(window->win32.handle, &pos);\n\n    if (xpos)\n        *xpos = pos.x;\n    if (ypos)\n        *ypos = pos.y;\n}\n\nvoid _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)\n{\n    RECT rect = { xpos, ypos, xpos, ypos };\n    AdjustWindowRectEx(&rect, getWindowStyle(window),\n                       FALSE, getWindowExStyle(window));\n    SetWindowPos(window->win32.handle, NULL, rect.left, rect.top, 0, 0,\n                 SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);\n}\n\nvoid _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)\n{\n    RECT area;\n    GetClientRect(window->win32.handle, &area);\n\n    if (width)\n        *width = area.right;\n    if (height)\n        *height = area.bottom;\n}\n\nvoid _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)\n{\n    if (window->monitor)\n    {\n        if (window->monitor->window == window)\n            acquireMonitor(window);\n    }\n    else\n    {\n        RECT rect = { 0, 0, width, height };\n        AdjustWindowRectEx(&rect, getWindowStyle(window),\n                           FALSE, getWindowExStyle(window));\n        SetWindowPos(window->win32.handle, HWND_TOP,\n                     0, 0, rect.right - rect.left, rect.bottom - rect.top,\n                     SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER);\n    }\n}\n\nvoid _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,\n                                      int minwidth, int minheight,\n                                      int maxwidth, int maxheight)\n{\n    RECT area;\n\n    if ((minwidth == GLFW_DONT_CARE || minheight == GLFW_DONT_CARE) &&\n        (maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE))\n    {\n        return;\n    }\n\n    GetWindowRect(window->win32.handle, &area);\n    MoveWindow(window->win32.handle,\n               area.left, area.top,\n               area.right - area.left,\n               area.bottom - area.top, TRUE);\n}\n\nvoid _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)\n{\n    RECT area;\n\n    if (numer == GLFW_DONT_CARE || denom == GLFW_DONT_CARE)\n        return;\n\n    GetWindowRect(window->win32.handle, &area);\n    applyAspectRatio(window, WMSZ_BOTTOMRIGHT, &area);\n    MoveWindow(window->win32.handle,\n               area.left, area.top,\n               area.right - area.left,\n               area.bottom - area.top, TRUE);\n}\n\nvoid _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)\n{\n    _glfwPlatformGetWindowSize(window, width, height);\n}\n\nvoid _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,\n                                     int* left, int* top,\n                                     int* right, int* bottom)\n{\n    RECT rect;\n    int width, height;\n\n    _glfwPlatformGetWindowSize(window, &width, &height);\n    SetRect(&rect, 0, 0, width, height);\n    AdjustWindowRectEx(&rect, getWindowStyle(window),\n                       FALSE, getWindowExStyle(window));\n\n    if (left)\n        *left = -rect.left;\n    if (top)\n        *top = -rect.top;\n    if (right)\n        *right = rect.right - width;\n    if (bottom)\n        *bottom = rect.bottom - height;\n}\n\nvoid _glfwPlatformIconifyWindow(_GLFWwindow* window)\n{\n    ShowWindow(window->win32.handle, SW_MINIMIZE);\n}\n\nvoid _glfwPlatformRestoreWindow(_GLFWwindow* window)\n{\n    ShowWindow(window->win32.handle, SW_RESTORE);\n}\n\nvoid _glfwPlatformMaximizeWindow(_GLFWwindow* window)\n{\n    ShowWindow(window->win32.handle, SW_MAXIMIZE);\n}\n\nvoid _glfwPlatformShowWindow(_GLFWwindow* window)\n{\n    ShowWindow(window->win32.handle, SW_SHOW);\n}\n\nvoid _glfwPlatformHideWindow(_GLFWwindow* window)\n{\n    ShowWindow(window->win32.handle, SW_HIDE);\n}\n\nvoid _glfwPlatformRequestWindowAttention(_GLFWwindow* window)\n{\n    FlashWindow(window->win32.handle, TRUE);\n}\n\nvoid _glfwPlatformFocusWindow(_GLFWwindow* window)\n{\n    BringWindowToTop(window->win32.handle);\n    SetForegroundWindow(window->win32.handle);\n    SetFocus(window->win32.handle);\n}\n\nvoid _glfwPlatformSetWindowMonitor(_GLFWwindow* window,\n                                   _GLFWmonitor* monitor,\n                                   int xpos, int ypos,\n                                   int width, int height,\n                                   int refreshRate)\n{\n    if (window->monitor == monitor)\n    {\n        if (monitor)\n        {\n            if (monitor->window == window)\n                acquireMonitor(window);\n        }\n        else\n        {\n            RECT rect = { xpos, ypos, xpos + width, ypos + height };\n            AdjustWindowRectEx(&rect, getWindowStyle(window),\n                               FALSE, getWindowExStyle(window));\n            SetWindowPos(window->win32.handle, HWND_TOP,\n                         rect.left, rect.top,\n                         rect.right - rect.left, rect.bottom - rect.top,\n                         SWP_NOCOPYBITS | SWP_NOACTIVATE | SWP_NOZORDER);\n        }\n\n        return;\n    }\n\n    if (window->monitor)\n        releaseMonitor(window);\n\n    _glfwInputWindowMonitorChange(window, monitor);\n\n    if (monitor)\n    {\n        GLFWvidmode mode;\n        DWORD style = GetWindowLongW(window->win32.handle, GWL_STYLE);\n        UINT flags = SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOCOPYBITS;\n\n        if (window->decorated)\n        {\n            style &= ~WS_OVERLAPPEDWINDOW;\n            style |= getWindowStyle(window);\n            SetWindowLongW(window->win32.handle, GWL_STYLE, style);\n\n            flags |= SWP_FRAMECHANGED;\n        }\n\n        _glfwPlatformGetVideoMode(monitor, &mode);\n        _glfwPlatformGetMonitorPos(monitor, &xpos, &ypos);\n\n        SetWindowPos(window->win32.handle, HWND_TOPMOST,\n                     xpos, ypos, mode.width, mode.height,\n                     flags);\n\n        acquireMonitor(window);\n    }\n    else\n    {\n        HWND after;\n        RECT rect = { xpos, ypos, xpos + width, ypos + height };\n        DWORD style = GetWindowLongW(window->win32.handle, GWL_STYLE);\n        UINT flags = SWP_NOACTIVATE | SWP_NOCOPYBITS;\n\n        if (window->decorated)\n        {\n            style &= ~WS_POPUP;\n            style |= getWindowStyle(window);\n            SetWindowLongW(window->win32.handle, GWL_STYLE, style);\n\n            flags |= SWP_FRAMECHANGED;\n        }\n\n        if (window->floating)\n            after = HWND_TOPMOST;\n        else\n            after = HWND_NOTOPMOST;\n\n        AdjustWindowRectEx(&rect, getWindowStyle(window),\n                           FALSE, getWindowExStyle(window));\n        SetWindowPos(window->win32.handle, after,\n                     rect.left, rect.top,\n                     rect.right - rect.left, rect.bottom - rect.top,\n                     flags);\n    }\n}\n\nint _glfwPlatformWindowFocused(_GLFWwindow* window)\n{\n    return window->win32.handle == GetActiveWindow();\n}\n\nint _glfwPlatformWindowIconified(_GLFWwindow* window)\n{\n    return IsIconic(window->win32.handle);\n}\n\nint _glfwPlatformWindowVisible(_GLFWwindow* window)\n{\n    return IsWindowVisible(window->win32.handle);\n}\n\nint _glfwPlatformWindowMaximized(_GLFWwindow* window)\n{\n    return IsZoomed(window->win32.handle);\n}\n\nint _glfwPlatformFramebufferTransparent(_GLFWwindow* window)\n{\n    return window->win32.transparent && _glfwIsCompositionEnabledWin32();\n}\n\nvoid _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)\n{\n    updateWindowStyles(window);\n}\n\nvoid _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)\n{\n    updateWindowStyles(window);\n}\n\nvoid _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)\n{\n    const HWND after = enabled ? HWND_TOPMOST : HWND_NOTOPMOST;\n    SetWindowPos(window->win32.handle, after, 0, 0, 0, 0,\n                 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);\n}\n\nvoid _glfwPlatformPollEvents(void)\n{\n    MSG msg;\n    HWND handle;\n    _GLFWwindow* window;\n\n    while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))\n    {\n        if (msg.message == WM_QUIT)\n        {\n            // NOTE: While GLFW does not itself post WM_QUIT, other processes\n            //       may post it to this one, for example Task Manager\n            // HACK: Treat WM_QUIT as a close on all windows\n\n            window = _glfw.windowListHead;\n            while (window)\n            {\n                _glfwInputWindowCloseRequest(window);\n                window = window->next;\n            }\n        }\n        else\n        {\n            TranslateMessage(&msg);\n            DispatchMessageW(&msg);\n        }\n    }\n\n    handle = GetActiveWindow();\n    if (handle)\n    {\n        // NOTE: Shift keys on Windows tend to \"stick\" when both are pressed as\n        //       no key up message is generated by the first key release\n        //       The other half of this is in the handling of WM_KEYUP\n        // HACK: Query actual key state and synthesize release events as needed\n        window = GetPropW(handle, L\"GLFW\");\n        if (window)\n        {\n            const GLFWbool lshift = (GetAsyncKeyState(VK_LSHIFT) >> 15) & 1;\n            const GLFWbool rshift = (GetAsyncKeyState(VK_RSHIFT) >> 15) & 1;\n\n            if (!lshift && window->keys[GLFW_KEY_LEFT_SHIFT] == GLFW_PRESS)\n            {\n                const int mods = getAsyncKeyMods();\n                const int scancode = _glfw.win32.scancodes[GLFW_KEY_LEFT_SHIFT];\n                _glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, scancode, GLFW_RELEASE, mods);\n            }\n            else if (!rshift && window->keys[GLFW_KEY_RIGHT_SHIFT] == GLFW_PRESS)\n            {\n                const int mods = getAsyncKeyMods();\n                const int scancode = _glfw.win32.scancodes[GLFW_KEY_RIGHT_SHIFT];\n                _glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, scancode, GLFW_RELEASE, mods);\n            }\n        }\n    }\n\n    window = _glfw.win32.disabledCursorWindow;\n    if (window)\n    {\n        int width, height;\n        _glfwPlatformGetWindowSize(window, &width, &height);\n\n        // NOTE: Re-center the cursor only if it has moved since the last call,\n        //       to avoid breaking glfwWaitEvents with WM_MOUSEMOVE\n        if (window->win32.lastCursorPosX != width / 2 ||\n            window->win32.lastCursorPosY != height / 2)\n        {\n            _glfwPlatformSetCursorPos(window, width / 2, height / 2);\n        }\n    }\n}\n\nvoid _glfwPlatformWaitEvents(void)\n{\n    WaitMessage();\n\n    _glfwPlatformPollEvents();\n}\n\nvoid _glfwPlatformWaitEventsTimeout(double timeout)\n{\n    MsgWaitForMultipleObjects(0, NULL, FALSE, (DWORD) (timeout * 1e3), QS_ALLEVENTS);\n\n    _glfwPlatformPollEvents();\n}\n\nvoid _glfwPlatformPostEmptyEvent(void)\n{\n    PostMessage(_glfw.win32.helperWindowHandle, WM_NULL, 0, 0);\n}\n\nvoid _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)\n{\n    POINT pos;\n\n    if (GetCursorPos(&pos))\n    {\n        ScreenToClient(window->win32.handle, &pos);\n\n        if (xpos)\n            *xpos = pos.x;\n        if (ypos)\n            *ypos = pos.y;\n    }\n}\n\nvoid _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos)\n{\n    POINT pos = { (int) xpos, (int) ypos };\n\n    // Store the new position so it can be recognized later\n    window->win32.lastCursorPosX = pos.x;\n    window->win32.lastCursorPosY = pos.y;\n\n    ClientToScreen(window->win32.handle, &pos);\n    SetCursorPos(pos.x, pos.y);\n}\n\nvoid _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)\n{\n    if (mode == GLFW_CURSOR_DISABLED)\n    {\n        const RAWINPUTDEVICE rid = { 0x01, 0x02, 0, window->win32.handle };\n\n        _glfw.win32.disabledCursorWindow = window;\n        _glfwPlatformGetCursorPos(window,\n                                  &_glfw.win32.restoreCursorPosX,\n                                  &_glfw.win32.restoreCursorPosY);\n        centerCursor(window);\n        updateClipRect(window);\n\n        if (!RegisterRawInputDevices(&rid, 1, sizeof(rid)))\n        {\n            _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                                 \"Win32: Failed to register raw input device\");\n        }\n    }\n    else if (_glfw.win32.disabledCursorWindow == window)\n    {\n        const RAWINPUTDEVICE rid = { 0x01, 0x02, RIDEV_REMOVE, NULL };\n\n        _glfw.win32.disabledCursorWindow = NULL;\n        updateClipRect(NULL);\n        _glfwPlatformSetCursorPos(window,\n                                  _glfw.win32.restoreCursorPosX,\n                                  _glfw.win32.restoreCursorPosY);\n\n        if (!RegisterRawInputDevices(&rid, 1, sizeof(rid)))\n        {\n            _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                                 \"Win32: Failed to remove raw input device\");\n        }\n    }\n\n    if (cursorInClientArea(window))\n        updateCursorImage(window);\n}\n\nconst char* _glfwPlatformGetScancodeName(int scancode)\n{\n    return _glfw.win32.keynames[_glfw.win32.keycodes[scancode]];\n}\n\nint _glfwPlatformGetKeyScancode(int key)\n{\n    return _glfw.win32.scancodes[key];\n}\n\nint _glfwPlatformCreateCursor(_GLFWcursor* cursor,\n                              const GLFWimage* image,\n                              int xhot, int yhot)\n{\n    cursor->win32.handle = (HCURSOR) createIcon(image, xhot, yhot, GLFW_FALSE);\n    if (!cursor->win32.handle)\n        return GLFW_FALSE;\n\n    return GLFW_TRUE;\n}\n\nint _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)\n{\n    cursor->win32.handle =\n        CopyCursor(LoadCursorW(NULL, translateCursorShape(shape)));\n    if (!cursor->win32.handle)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to create standard cursor\");\n        return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyCursor(_GLFWcursor* cursor)\n{\n    if (cursor->win32.handle)\n        DestroyIcon((HICON) cursor->win32.handle);\n}\n\nvoid _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)\n{\n    if (cursorInClientArea(window))\n        updateCursorImage(window);\n}\n\nvoid _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string)\n{\n    int characterCount;\n    HANDLE object;\n    WCHAR* buffer;\n\n    characterCount = MultiByteToWideChar(CP_UTF8, 0, string, -1, NULL, 0);\n    if (!characterCount)\n        return;\n\n    object = GlobalAlloc(GMEM_MOVEABLE, characterCount * sizeof(WCHAR));\n    if (!object)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to allocate global handle for clipboard\");\n        return;\n    }\n\n    buffer = GlobalLock(object);\n    if (!buffer)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to lock global handle\");\n        GlobalFree(object);\n        return;\n    }\n\n    MultiByteToWideChar(CP_UTF8, 0, string, -1, buffer, characterCount);\n    GlobalUnlock(object);\n\n    if (!OpenClipboard(_glfw.win32.helperWindowHandle))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to open clipboard\");\n        GlobalFree(object);\n        return;\n    }\n\n    EmptyClipboard();\n    SetClipboardData(CF_UNICODETEXT, object);\n    CloseClipboard();\n}\n\nconst char* _glfwPlatformGetClipboardString(_GLFWwindow* window)\n{\n    HANDLE object;\n    WCHAR* buffer;\n\n    if (!OpenClipboard(_glfw.win32.helperWindowHandle))\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to open clipboard\");\n        return NULL;\n    }\n\n    object = GetClipboardData(CF_UNICODETEXT);\n    if (!object)\n    {\n        _glfwInputErrorWin32(GLFW_FORMAT_UNAVAILABLE,\n                             \"Win32: Failed to convert clipboard to string\");\n        CloseClipboard();\n        return NULL;\n    }\n\n    buffer = GlobalLock(object);\n    if (!buffer)\n    {\n        _glfwInputErrorWin32(GLFW_PLATFORM_ERROR,\n                             \"Win32: Failed to lock global handle\");\n        CloseClipboard();\n        return NULL;\n    }\n\n    free(_glfw.win32.clipboardString);\n    _glfw.win32.clipboardString = _glfwCreateUTF8FromWideStringWin32(buffer);\n\n    GlobalUnlock(object);\n    CloseClipboard();\n\n    return _glfw.win32.clipboardString;\n}\n\nvoid _glfwPlatformGetRequiredInstanceExtensions(char** extensions)\n{\n    if (!_glfw.vk.KHR_surface || !_glfw.vk.KHR_win32_surface)\n        return;\n\n    extensions[0] = \"VK_KHR_surface\";\n    extensions[1] = \"VK_KHR_win32_surface\";\n}\n\nint _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,\n                                                      VkPhysicalDevice device,\n                                                      uint32_t queuefamily)\n{\n    PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR\n        vkGetPhysicalDeviceWin32PresentationSupportKHR =\n        (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)\n        vkGetInstanceProcAddr(instance, \"vkGetPhysicalDeviceWin32PresentationSupportKHR\");\n    if (!vkGetPhysicalDeviceWin32PresentationSupportKHR)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Win32: Vulkan instance missing VK_KHR_win32_surface extension\");\n        return GLFW_FALSE;\n    }\n\n    return vkGetPhysicalDeviceWin32PresentationSupportKHR(device, queuefamily);\n}\n\nVkResult _glfwPlatformCreateWindowSurface(VkInstance instance,\n                                          _GLFWwindow* window,\n                                          const VkAllocationCallbacks* allocator,\n                                          VkSurfaceKHR* surface)\n{\n    VkResult err;\n    VkWin32SurfaceCreateInfoKHR sci;\n    PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;\n\n    vkCreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)\n        vkGetInstanceProcAddr(instance, \"vkCreateWin32SurfaceKHR\");\n    if (!vkCreateWin32SurfaceKHR)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Win32: Vulkan instance missing VK_KHR_win32_surface extension\");\n        return VK_ERROR_EXTENSION_NOT_PRESENT;\n    }\n\n    memset(&sci, 0, sizeof(sci));\n    sci.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;\n    sci.hinstance = GetModuleHandle(NULL);\n    sci.hwnd = window->win32.handle;\n\n    err = vkCreateWin32SurfaceKHR(instance, &sci, allocator, surface);\n    if (err)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Win32: Failed to create Vulkan surface: %s\",\n                        _glfwGetVulkanResultString(err));\n    }\n\n    return err;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI HWND glfwGetWin32Window(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return window->win32.handle;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/window.c",
    "content": "//========================================================================\n// GLFW 3.3 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <assert.h>\n#include <string.h>\n#include <stdlib.h>\n#include <float.h>\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                         GLFW event API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused)\n{\n    if (window->callbacks.focus)\n        window->callbacks.focus((GLFWwindow*) window, focused);\n\n    if (!focused)\n    {\n        int key, button;\n\n        for (key = 0;  key <= GLFW_KEY_LAST;  key++)\n        {\n            if (window->keys[key] == GLFW_PRESS)\n            {\n                const int scancode = _glfwPlatformGetKeyScancode(key);\n                _glfwInputKey(window, key, scancode, GLFW_RELEASE, 0);\n            }\n        }\n\n        for (button = 0;  button <= GLFW_MOUSE_BUTTON_LAST;  button++)\n        {\n            if (window->mouseButtons[button] == GLFW_PRESS)\n                _glfwInputMouseClick(window, button, GLFW_RELEASE, 0);\n        }\n    }\n}\n\nvoid _glfwInputWindowPos(_GLFWwindow* window, int x, int y)\n{\n    if (window->callbacks.pos)\n        window->callbacks.pos((GLFWwindow*) window, x, y);\n}\n\nvoid _glfwInputWindowSize(_GLFWwindow* window, int width, int height)\n{\n    if (window->callbacks.size)\n        window->callbacks.size((GLFWwindow*) window, width, height);\n}\n\nvoid _glfwInputWindowIconify(_GLFWwindow* window, GLFWbool iconified)\n{\n    if (window->callbacks.iconify)\n        window->callbacks.iconify((GLFWwindow*) window, iconified);\n}\n\nvoid _glfwInputWindowMaximize(_GLFWwindow* window, GLFWbool maximized)\n{\n    if (window->callbacks.maximize)\n        window->callbacks.maximize((GLFWwindow*) window, maximized);\n}\n\nvoid _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height)\n{\n    if (window->callbacks.fbsize)\n        window->callbacks.fbsize((GLFWwindow*) window, width, height);\n}\n\nvoid _glfwInputWindowDamage(_GLFWwindow* window)\n{\n    if (window->callbacks.refresh)\n        window->callbacks.refresh((GLFWwindow*) window);\n}\n\nvoid _glfwInputWindowCloseRequest(_GLFWwindow* window)\n{\n    window->shouldClose = GLFW_TRUE;\n\n    if (window->callbacks.close)\n        window->callbacks.close((GLFWwindow*) window);\n}\n\nvoid _glfwInputWindowMonitorChange(_GLFWwindow* window, _GLFWmonitor* monitor)\n{\n    window->monitor = monitor;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW public API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,\n                                     const char* title,\n                                     GLFWmonitor* monitor,\n                                     GLFWwindow* share)\n{\n    _GLFWfbconfig fbconfig;\n    _GLFWctxconfig ctxconfig;\n    _GLFWwndconfig wndconfig;\n    _GLFWwindow* window;\n    _GLFWwindow* previous;\n\n    assert(title != NULL);\n    assert(width >= 0);\n    assert(height >= 0);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n\n    if (width <= 0 || height <= 0)\n    {\n        _glfwInputError(GLFW_INVALID_VALUE,\n                        \"Invalid window size %ix%i\",\n                        width, height);\n\n        return NULL;\n    }\n\n    fbconfig  = _glfw.hints.framebuffer;\n    ctxconfig = _glfw.hints.context;\n    wndconfig = _glfw.hints.window;\n\n    wndconfig.width   = width;\n    wndconfig.height  = height;\n    wndconfig.title   = title;\n    ctxconfig.share   = (_GLFWwindow*) share;\n\n    if (ctxconfig.share)\n    {\n        if (ctxconfig.client == GLFW_NO_API ||\n            ctxconfig.share->context.client == GLFW_NO_API)\n        {\n            _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL);\n            return NULL;\n        }\n    }\n\n    if (!_glfwIsValidContextConfig(&ctxconfig))\n        return NULL;\n\n    window = calloc(1, sizeof(_GLFWwindow));\n    window->next = _glfw.windowListHead;\n    _glfw.windowListHead = window;\n\n    window->videoMode.width       = width;\n    window->videoMode.height      = height;\n    window->videoMode.redBits     = fbconfig.redBits;\n    window->videoMode.greenBits   = fbconfig.greenBits;\n    window->videoMode.blueBits    = fbconfig.blueBits;\n    window->videoMode.refreshRate = _glfw.hints.refreshRate;\n\n    window->monitor     = (_GLFWmonitor*) monitor;\n    window->resizable   = wndconfig.resizable;\n    window->decorated   = wndconfig.decorated;\n    window->autoIconify = wndconfig.autoIconify;\n    window->floating    = wndconfig.floating;\n    window->cursorMode  = GLFW_CURSOR_NORMAL;\n\n    window->minwidth    = GLFW_DONT_CARE;\n    window->minheight   = GLFW_DONT_CARE;\n    window->maxwidth    = GLFW_DONT_CARE;\n    window->maxheight   = GLFW_DONT_CARE;\n    window->numer       = GLFW_DONT_CARE;\n    window->denom       = GLFW_DONT_CARE;\n\n    // Save the currently current context so it can be restored later\n    previous = _glfwPlatformGetTls(&_glfw.contextSlot);\n    if (ctxconfig.client != GLFW_NO_API)\n        glfwMakeContextCurrent(NULL);\n\n    // Open the actual window and create its context\n    if (!_glfwPlatformCreateWindow(window, &wndconfig, &ctxconfig, &fbconfig))\n    {\n        glfwMakeContextCurrent((GLFWwindow*) previous);\n        glfwDestroyWindow((GLFWwindow*) window);\n        return NULL;\n    }\n\n    if (ctxconfig.client != GLFW_NO_API)\n    {\n        window->context.makeCurrent(window);\n\n        // Retrieve the actual (as opposed to requested) context attributes\n        if (!_glfwRefreshContextAttribs(&ctxconfig))\n        {\n            glfwMakeContextCurrent((GLFWwindow*) previous);\n            glfwDestroyWindow((GLFWwindow*) window);\n            return NULL;\n        }\n\n        // Restore the previously current context (or NULL)\n        glfwMakeContextCurrent((GLFWwindow*) previous);\n    }\n\n    if (!window->monitor)\n    {\n        if (wndconfig.visible)\n        {\n            _glfwPlatformShowWindow(window);\n            if (wndconfig.focused)\n                _glfwPlatformFocusWindow(window);\n        }\n    }\n\n    return (GLFWwindow*) window;\n}\n\nvoid glfwDefaultWindowHints(void)\n{\n    _GLFW_REQUIRE_INIT();\n\n    // The default is OpenGL with minimum version 1.0\n    memset(&_glfw.hints.context, 0, sizeof(_glfw.hints.context));\n    _glfw.hints.context.client = GLFW_OPENGL_API;\n    _glfw.hints.context.source = GLFW_NATIVE_CONTEXT_API;\n    _glfw.hints.context.major  = 1;\n    _glfw.hints.context.minor  = 0;\n\n    // The default is a focused, visible, resizable window with decorations\n    memset(&_glfw.hints.window, 0, sizeof(_glfw.hints.window));\n    _glfw.hints.window.resizable   = GLFW_TRUE;\n    _glfw.hints.window.visible     = GLFW_TRUE;\n    _glfw.hints.window.decorated   = GLFW_TRUE;\n    _glfw.hints.window.focused     = GLFW_TRUE;\n    _glfw.hints.window.autoIconify = GLFW_TRUE;\n\n    // The default is 24 bits of color, 24 bits of depth and 8 bits of stencil,\n    // double buffered\n    memset(&_glfw.hints.framebuffer, 0, sizeof(_glfw.hints.framebuffer));\n    _glfw.hints.framebuffer.redBits      = 8;\n    _glfw.hints.framebuffer.greenBits    = 8;\n    _glfw.hints.framebuffer.blueBits     = 8;\n    _glfw.hints.framebuffer.alphaBits    = 8;\n    _glfw.hints.framebuffer.depthBits    = 24;\n    _glfw.hints.framebuffer.stencilBits  = 8;\n    _glfw.hints.framebuffer.doublebuffer = GLFW_TRUE;\n\n    // The default is to select the highest available refresh rate\n    _glfw.hints.refreshRate = GLFW_DONT_CARE;\n\n    // The default is to use full Retina resolution framebuffers\n    _glfw.hints.window.ns.retina = GLFW_TRUE;\n}\n\nGLFWAPI void glfwWindowHint(int hint, int value)\n{\n    _GLFW_REQUIRE_INIT();\n\n    switch (hint)\n    {\n        case GLFW_RED_BITS:\n            _glfw.hints.framebuffer.redBits = value;\n            return;\n        case GLFW_GREEN_BITS:\n            _glfw.hints.framebuffer.greenBits = value;\n            return;\n        case GLFW_BLUE_BITS:\n            _glfw.hints.framebuffer.blueBits = value;\n            return;\n        case GLFW_ALPHA_BITS:\n            _glfw.hints.framebuffer.alphaBits = value;\n            return;\n        case GLFW_DEPTH_BITS:\n            _glfw.hints.framebuffer.depthBits = value;\n            return;\n        case GLFW_STENCIL_BITS:\n            _glfw.hints.framebuffer.stencilBits = value;\n            return;\n        case GLFW_ACCUM_RED_BITS:\n            _glfw.hints.framebuffer.accumRedBits = value;\n            return;\n        case GLFW_ACCUM_GREEN_BITS:\n            _glfw.hints.framebuffer.accumGreenBits = value;\n            return;\n        case GLFW_ACCUM_BLUE_BITS:\n            _glfw.hints.framebuffer.accumBlueBits = value;\n            return;\n        case GLFW_ACCUM_ALPHA_BITS:\n            _glfw.hints.framebuffer.accumAlphaBits = value;\n            return;\n        case GLFW_AUX_BUFFERS:\n            _glfw.hints.framebuffer.auxBuffers = value;\n            return;\n        case GLFW_STEREO:\n            _glfw.hints.framebuffer.stereo = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_DOUBLEBUFFER:\n            _glfw.hints.framebuffer.doublebuffer = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_TRANSPARENT:\n            _glfw.hints.framebuffer.transparent = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_SAMPLES:\n            _glfw.hints.framebuffer.samples = value;\n            return;\n        case GLFW_SRGB_CAPABLE:\n            _glfw.hints.framebuffer.sRGB = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_RESIZABLE:\n            _glfw.hints.window.resizable = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_DECORATED:\n            _glfw.hints.window.decorated = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_FOCUSED:\n            _glfw.hints.window.focused = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_AUTO_ICONIFY:\n            _glfw.hints.window.autoIconify = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_FLOATING:\n            _glfw.hints.window.floating = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_MAXIMIZED:\n            _glfw.hints.window.maximized = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_VISIBLE:\n            _glfw.hints.window.visible = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_COCOA_RETINA_FRAMEBUFFER:\n            _glfw.hints.window.ns.retina = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_COCOA_FRAME_AUTOSAVE:\n            _glfw.hints.window.ns.frame = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_COCOA_GRAPHICS_SWITCHING:\n            _glfw.hints.context.nsgl.offline = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_CENTER_CURSOR:\n            _glfw.hints.window.centerCursor = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_CLIENT_API:\n            _glfw.hints.context.client = value;\n            return;\n        case GLFW_CONTEXT_CREATION_API:\n            _glfw.hints.context.source = value;\n            return;\n        case GLFW_CONTEXT_VERSION_MAJOR:\n            _glfw.hints.context.major = value;\n            return;\n        case GLFW_CONTEXT_VERSION_MINOR:\n            _glfw.hints.context.minor = value;\n            return;\n        case GLFW_CONTEXT_ROBUSTNESS:\n            _glfw.hints.context.robustness = value;\n            return;\n        case GLFW_OPENGL_FORWARD_COMPAT:\n            _glfw.hints.context.forward = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_OPENGL_DEBUG_CONTEXT:\n            _glfw.hints.context.debug = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_CONTEXT_NO_ERROR:\n            _glfw.hints.context.noerror = value ? GLFW_TRUE : GLFW_FALSE;\n            return;\n        case GLFW_OPENGL_PROFILE:\n            _glfw.hints.context.profile = value;\n            return;\n        case GLFW_CONTEXT_RELEASE_BEHAVIOR:\n            _glfw.hints.context.release = value;\n            return;\n        case GLFW_REFRESH_RATE:\n            _glfw.hints.refreshRate = value;\n            return;\n    }\n\n    _glfwInputError(GLFW_INVALID_ENUM, \"Invalid window hint 0x%08X\", hint);\n}\n\nGLFWAPI void glfwDestroyWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n\n    _GLFW_REQUIRE_INIT();\n\n    // Allow closing of NULL (to match the behavior of free)\n    if (window == NULL)\n        return;\n\n    // Clear all callbacks to avoid exposing a half torn-down window object\n    memset(&window->callbacks, 0, sizeof(window->callbacks));\n\n    // The window's context must not be current on another thread when the\n    // window is destroyed\n    if (window == _glfwPlatformGetTls(&_glfw.contextSlot))\n        glfwMakeContextCurrent(NULL);\n\n    _glfwPlatformDestroyWindow(window);\n\n    // Unlink window from global linked list\n    {\n        _GLFWwindow** prev = &_glfw.windowListHead;\n\n        while (*prev != window)\n            prev = &((*prev)->next);\n\n        *prev = window->next;\n    }\n\n    free(window);\n}\n\nGLFWAPI int glfwWindowShouldClose(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(0);\n    return window->shouldClose;\n}\n\nGLFWAPI void glfwSetWindowShouldClose(GLFWwindow* handle, int value)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n    window->shouldClose = value;\n}\n\nGLFWAPI void glfwSetWindowTitle(GLFWwindow* handle, const char* title)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n    assert(title != NULL);\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformSetWindowTitle(window, title);\n}\n\nGLFWAPI void glfwSetWindowIcon(GLFWwindow* handle,\n                               int count, const GLFWimage* images)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n    assert(count >= 0);\n    assert(count == 0 || images != NULL);\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformSetWindowIcon(window, count, images);\n}\n\nGLFWAPI void glfwGetWindowPos(GLFWwindow* handle, int* xpos, int* ypos)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    if (xpos)\n        *xpos = 0;\n    if (ypos)\n        *ypos = 0;\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformGetWindowPos(window, xpos, ypos);\n}\n\nGLFWAPI void glfwSetWindowPos(GLFWwindow* handle, int xpos, int ypos)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (window->monitor)\n        return;\n\n    _glfwPlatformSetWindowPos(window, xpos, ypos);\n}\n\nGLFWAPI void glfwGetWindowSize(GLFWwindow* handle, int* width, int* height)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    if (width)\n        *width = 0;\n    if (height)\n        *height = 0;\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformGetWindowSize(window, width, height);\n}\n\nGLFWAPI void glfwSetWindowSize(GLFWwindow* handle, int width, int height)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n    assert(width >= 0);\n    assert(height >= 0);\n\n    _GLFW_REQUIRE_INIT();\n\n    window->videoMode.width  = width;\n    window->videoMode.height = height;\n\n    _glfwPlatformSetWindowSize(window, width, height);\n}\n\nGLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* handle,\n                                     int minwidth, int minheight,\n                                     int maxwidth, int maxheight)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (minwidth != GLFW_DONT_CARE && minheight != GLFW_DONT_CARE)\n    {\n        if (minwidth < 0 || minheight < 0)\n        {\n            _glfwInputError(GLFW_INVALID_VALUE,\n                            \"Invalid window minimum size %ix%i\",\n                            minwidth, minheight);\n            return;\n        }\n    }\n\n    if (maxwidth != GLFW_DONT_CARE && maxheight != GLFW_DONT_CARE)\n    {\n        if (maxwidth < 0 || maxheight < 0 ||\n            maxwidth < minwidth || maxheight < minheight)\n        {\n            _glfwInputError(GLFW_INVALID_VALUE,\n                            \"Invalid window maximum size %ix%i\",\n                            maxwidth, maxheight);\n            return;\n        }\n    }\n\n    window->minwidth  = minwidth;\n    window->minheight = minheight;\n    window->maxwidth  = maxwidth;\n    window->maxheight = maxheight;\n\n    if (window->monitor || !window->resizable)\n        return;\n\n    _glfwPlatformSetWindowSizeLimits(window,\n                                     minwidth, minheight,\n                                     maxwidth, maxheight);\n}\n\nGLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* handle, int numer, int denom)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n    assert(numer != 0);\n    assert(denom != 0);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (numer != GLFW_DONT_CARE && denom != GLFW_DONT_CARE)\n    {\n        if (numer <= 0 || denom <= 0)\n        {\n            _glfwInputError(GLFW_INVALID_VALUE,\n                            \"Invalid window aspect ratio %i:%i\",\n                            numer, denom);\n            return;\n        }\n    }\n\n    window->numer = numer;\n    window->denom = denom;\n\n    if (window->monitor || !window->resizable)\n        return;\n\n    _glfwPlatformSetWindowAspectRatio(window, numer, denom);\n}\n\nGLFWAPI void glfwGetFramebufferSize(GLFWwindow* handle, int* width, int* height)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    if (width)\n        *width = 0;\n    if (height)\n        *height = 0;\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformGetFramebufferSize(window, width, height);\n}\n\nGLFWAPI void glfwGetWindowFrameSize(GLFWwindow* handle,\n                                    int* left, int* top,\n                                    int* right, int* bottom)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    if (left)\n        *left = 0;\n    if (top)\n        *top = 0;\n    if (right)\n        *right = 0;\n    if (bottom)\n        *bottom = 0;\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformGetWindowFrameSize(window, left, top, right, bottom);\n}\n\nGLFWAPI void glfwIconifyWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformIconifyWindow(window);\n}\n\nGLFWAPI void glfwRestoreWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformRestoreWindow(window);\n}\n\nGLFWAPI void glfwMaximizeWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (window->monitor)\n        return;\n\n    _glfwPlatformMaximizeWindow(window);\n}\n\nGLFWAPI void glfwShowWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (window->monitor)\n        return;\n\n    _glfwPlatformShowWindow(window);\n    _glfwPlatformFocusWindow(window);\n}\n\nGLFWAPI void glfwRequestWindowAttention(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    _glfwPlatformRequestWindowAttention(window);\n}\n\nGLFWAPI void glfwHideWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (window->monitor)\n        return;\n\n    _glfwPlatformHideWindow(window);\n}\n\nGLFWAPI void glfwFocusWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    _glfwPlatformFocusWindow(window);\n}\n\nGLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(0);\n\n    switch (attrib)\n    {\n        case GLFW_FOCUSED:\n            return _glfwPlatformWindowFocused(window);\n        case GLFW_ICONIFIED:\n            return _glfwPlatformWindowIconified(window);\n        case GLFW_VISIBLE:\n            return _glfwPlatformWindowVisible(window);\n        case GLFW_MAXIMIZED:\n            return _glfwPlatformWindowMaximized(window);\n        case GLFW_TRANSPARENT:\n            return _glfwPlatformFramebufferTransparent(window);\n        case GLFW_RESIZABLE:\n            return window->resizable;\n        case GLFW_DECORATED:\n            return window->decorated;\n        case GLFW_FLOATING:\n            return window->floating;\n        case GLFW_AUTO_ICONIFY:\n            return window->autoIconify;\n        case GLFW_CLIENT_API:\n            return window->context.client;\n        case GLFW_CONTEXT_CREATION_API:\n            return window->context.source;\n        case GLFW_CONTEXT_VERSION_MAJOR:\n            return window->context.major;\n        case GLFW_CONTEXT_VERSION_MINOR:\n            return window->context.minor;\n        case GLFW_CONTEXT_REVISION:\n            return window->context.revision;\n        case GLFW_CONTEXT_ROBUSTNESS:\n            return window->context.robustness;\n        case GLFW_OPENGL_FORWARD_COMPAT:\n            return window->context.forward;\n        case GLFW_OPENGL_DEBUG_CONTEXT:\n            return window->context.debug;\n        case GLFW_OPENGL_PROFILE:\n            return window->context.profile;\n        case GLFW_CONTEXT_RELEASE_BEHAVIOR:\n            return window->context.release;\n        case GLFW_CONTEXT_NO_ERROR:\n            return window->context.noerror;\n    }\n\n    _glfwInputError(GLFW_INVALID_ENUM, \"Invalid window attribute 0x%08X\", attrib);\n    return 0;\n}\n\nGLFWAPI void glfwSetWindowAttrib(GLFWwindow* handle, int attrib, int value)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n\n    value = value ? GLFW_TRUE : GLFW_FALSE;\n\n    if (attrib == GLFW_AUTO_ICONIFY)\n        window->autoIconify = value;\n    else if (attrib == GLFW_RESIZABLE)\n    {\n        if (window->resizable == value)\n            return;\n\n        window->resizable = value;\n        if (!window->monitor)\n            _glfwPlatformSetWindowResizable(window, value);\n    }\n    else if (attrib == GLFW_DECORATED)\n    {\n        if (window->decorated == value)\n            return;\n\n        window->decorated = value;\n        if (!window->monitor)\n            _glfwPlatformSetWindowDecorated(window, value);\n    }\n    else if (attrib == GLFW_FLOATING)\n    {\n        if (window->floating == value)\n            return;\n\n        window->floating = value;\n        if (!window->monitor)\n            _glfwPlatformSetWindowFloating(window, value);\n    }\n    else\n        _glfwInputError(GLFW_INVALID_ENUM, \"Invalid window attribute 0x%08X\", attrib);\n}\n\nGLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return (GLFWmonitor*) window->monitor;\n}\n\nGLFWAPI void glfwSetWindowMonitor(GLFWwindow* wh,\n                                  GLFWmonitor* mh,\n                                  int xpos, int ypos,\n                                  int width, int height,\n                                  int refreshRate)\n{\n    _GLFWwindow* window = (_GLFWwindow*) wh;\n    _GLFWmonitor* monitor = (_GLFWmonitor*) mh;\n    assert(window != NULL);\n    assert(width >= 0);\n    assert(height >= 0);\n\n    _GLFW_REQUIRE_INIT();\n\n    if (width <= 0 || height <= 0)\n    {\n        _glfwInputError(GLFW_INVALID_VALUE,\n                        \"Invalid window size %ix%i\",\n                        width, height);\n        return;\n    }\n\n    if (refreshRate < 0 && refreshRate != GLFW_DONT_CARE)\n    {\n        _glfwInputError(GLFW_INVALID_VALUE,\n                        \"Invalid refresh rate %i\",\n                        refreshRate);\n        return;\n    }\n\n    window->videoMode.width       = width;\n    window->videoMode.height      = height;\n    window->videoMode.refreshRate = refreshRate;\n\n    _glfwPlatformSetWindowMonitor(window, monitor,\n                                  xpos, ypos, width, height,\n                                  refreshRate);\n}\n\nGLFWAPI void glfwSetWindowUserPointer(GLFWwindow* handle, void* pointer)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT();\n    window->userPointer = pointer;\n}\n\nGLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return window->userPointer;\n}\n\nGLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* handle,\n                                                  GLFWwindowposfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.pos, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* handle,\n                                                    GLFWwindowsizefun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.size, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* handle,\n                                                      GLFWwindowclosefun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.close, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* handle,\n                                                          GLFWwindowrefreshfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.refresh, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* handle,\n                                                      GLFWwindowfocusfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.focus, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* handle,\n                                                          GLFWwindowiconifyfun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.iconify, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* handle,\n                                                            GLFWwindowmaximizefun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.maximize, cbfun);\n    return cbfun;\n}\n\nGLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* handle,\n                                                              GLFWframebuffersizefun cbfun)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    assert(window != NULL);\n\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    _GLFW_SWAP_POINTERS(window->callbacks.fbsize, cbfun);\n    return cbfun;\n}\n\nGLFWAPI void glfwPollEvents(void)\n{\n    _GLFW_REQUIRE_INIT();\n    _glfwPlatformPollEvents();\n}\n\nGLFWAPI void glfwWaitEvents(void)\n{\n    _GLFW_REQUIRE_INIT();\n\n    if (!_glfw.windowListHead)\n        return;\n\n    _glfwPlatformWaitEvents();\n}\n\nGLFWAPI void glfwWaitEventsTimeout(double timeout)\n{\n    _GLFW_REQUIRE_INIT();\n    assert(timeout == timeout);\n    assert(timeout >= 0.0);\n    assert(timeout <= DBL_MAX);\n\n    if (timeout != timeout || timeout < 0.0 || timeout > DBL_MAX)\n    {\n        _glfwInputError(GLFW_INVALID_VALUE, \"Invalid time %f\", timeout);\n        return;\n    }\n\n    _glfwPlatformWaitEventsTimeout(timeout);\n}\n\nGLFWAPI void glfwPostEmptyEvent(void)\n{\n    _GLFW_REQUIRE_INIT();\n\n    if (!_glfw.windowListHead)\n        return;\n\n    _glfwPlatformPostEmptyEvent();\n}\n\n"
  },
  {
    "path": "external/GLFW/src/wl_init.c",
    "content": "//========================================================================\n// GLFW 3.3 Wayland - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <linux/input.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/mman.h>\n#include <unistd.h>\n#include <wayland-client.h>\n#include <wayland-cursor.h>\n\n\nstatic inline int min(int n1, int n2)\n{\n    return n1 < n2 ? n1 : n2;\n}\n\nstatic void pointerHandleEnter(void* data,\n                               struct wl_pointer* pointer,\n                               uint32_t serial,\n                               struct wl_surface* surface,\n                               wl_fixed_t sx,\n                               wl_fixed_t sy)\n{\n    _GLFWwindow* window = wl_surface_get_user_data(surface);\n\n    _glfw.wl.pointerSerial = serial;\n    _glfw.wl.pointerFocus = window;\n\n    _glfwPlatformSetCursor(window, window->wl.currentCursor);\n    _glfwInputCursorEnter(window, GLFW_TRUE);\n}\n\nstatic void pointerHandleLeave(void* data,\n                               struct wl_pointer* pointer,\n                               uint32_t serial,\n                               struct wl_surface* surface)\n{\n    _GLFWwindow* window = _glfw.wl.pointerFocus;\n\n    if (!window)\n        return;\n\n    _glfw.wl.pointerSerial = serial;\n    _glfw.wl.pointerFocus = NULL;\n    _glfwInputCursorEnter(window, GLFW_FALSE);\n}\n\nstatic void pointerHandleMotion(void* data,\n                                struct wl_pointer* pointer,\n                                uint32_t time,\n                                wl_fixed_t sx,\n                                wl_fixed_t sy)\n{\n    _GLFWwindow* window = _glfw.wl.pointerFocus;\n\n    if (!window)\n        return;\n\n    if (window->cursorMode == GLFW_CURSOR_DISABLED)\n        return;\n    else\n    {\n        window->wl.cursorPosX = wl_fixed_to_double(sx);\n        window->wl.cursorPosY = wl_fixed_to_double(sy);\n    }\n\n    _glfwInputCursorPos(window,\n                        wl_fixed_to_double(sx),\n                        wl_fixed_to_double(sy));\n}\n\nstatic void pointerHandleButton(void* data,\n                                struct wl_pointer* wl_pointer,\n                                uint32_t serial,\n                                uint32_t time,\n                                uint32_t button,\n                                uint32_t state)\n{\n    _GLFWwindow* window = _glfw.wl.pointerFocus;\n    int glfwButton;\n\n    if (!window)\n        return;\n\n    _glfw.wl.pointerSerial = serial;\n\n    /* Makes left, right and middle 0, 1 and 2. Overall order follows evdev\n     * codes. */\n    glfwButton = button - BTN_LEFT;\n\n    _glfwInputMouseClick(window,\n                         glfwButton,\n                         state == WL_POINTER_BUTTON_STATE_PRESSED\n                                ? GLFW_PRESS\n                                : GLFW_RELEASE,\n                         _glfw.wl.xkb.modifiers);\n}\n\nstatic void pointerHandleAxis(void* data,\n                              struct wl_pointer* wl_pointer,\n                              uint32_t time,\n                              uint32_t axis,\n                              wl_fixed_t value)\n{\n    _GLFWwindow* window = _glfw.wl.pointerFocus;\n    double scrollFactor;\n    double x, y;\n\n    if (!window)\n        return;\n\n    /* Wayland scroll events are in pointer motion coordinate space (think\n     * two finger scroll). The factor 10 is commonly used to convert to\n     * \"scroll step means 1.0. */\n    scrollFactor = 1.0/10.0;\n\n    switch (axis)\n    {\n        case WL_POINTER_AXIS_HORIZONTAL_SCROLL:\n            x = wl_fixed_to_double(value) * scrollFactor;\n            y = 0.0;\n            break;\n        case WL_POINTER_AXIS_VERTICAL_SCROLL:\n            x = 0.0;\n            y = wl_fixed_to_double(value) * scrollFactor;\n            break;\n        default:\n            break;\n    }\n\n    _glfwInputScroll(window, x, y);\n}\n\nstatic const struct wl_pointer_listener pointerListener = {\n    pointerHandleEnter,\n    pointerHandleLeave,\n    pointerHandleMotion,\n    pointerHandleButton,\n    pointerHandleAxis,\n};\n\nstatic void keyboardHandleKeymap(void* data,\n                                 struct wl_keyboard* keyboard,\n                                 uint32_t format,\n                                 int fd,\n                                 uint32_t size)\n{\n    struct xkb_keymap* keymap;\n    struct xkb_state* state;\n    struct xkb_compose_table* composeTable;\n    struct xkb_compose_state* composeState;\n    char* mapStr;\n    const char* locale;\n\n    if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1)\n    {\n        close(fd);\n        return;\n    }\n\n    mapStr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);\n    if (mapStr == MAP_FAILED) {\n        close(fd);\n        return;\n    }\n\n    keymap = xkb_keymap_new_from_string(_glfw.wl.xkb.context,\n                                        mapStr,\n                                        XKB_KEYMAP_FORMAT_TEXT_V1,\n                                        0);\n    munmap(mapStr, size);\n    close(fd);\n\n    if (!keymap)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Failed to compile keymap\");\n        return;\n    }\n\n    state = xkb_state_new(keymap);\n    if (!state)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Failed to create XKB state\");\n        xkb_keymap_unref(keymap);\n        return;\n    }\n\n    // Look up the preferred locale, falling back to \"C\" as default.\n    locale = getenv(\"LC_ALL\");\n    if (!locale)\n        locale = getenv(\"LC_CTYPE\");\n    if (!locale)\n        locale = getenv(\"LANG\");\n    if (!locale)\n        locale = \"C\";\n\n    composeTable =\n        xkb_compose_table_new_from_locale(_glfw.wl.xkb.context, locale,\n                                          XKB_COMPOSE_COMPILE_NO_FLAGS);\n    if (composeTable)\n    {\n        composeState =\n            xkb_compose_state_new(composeTable, XKB_COMPOSE_STATE_NO_FLAGS);\n        xkb_compose_table_unref(composeTable);\n        if (composeState)\n            _glfw.wl.xkb.composeState = composeState;\n        else\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"Wayland: Failed to create XKB compose state\");\n    }\n    else\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Failed to create XKB compose table\");\n    }\n\n    xkb_keymap_unref(_glfw.wl.xkb.keymap);\n    xkb_state_unref(_glfw.wl.xkb.state);\n    _glfw.wl.xkb.keymap = keymap;\n    _glfw.wl.xkb.state = state;\n\n    _glfw.wl.xkb.controlMask =\n        1 << xkb_keymap_mod_get_index(_glfw.wl.xkb.keymap, \"Control\");\n    _glfw.wl.xkb.altMask =\n        1 << xkb_keymap_mod_get_index(_glfw.wl.xkb.keymap, \"Mod1\");\n    _glfw.wl.xkb.shiftMask =\n        1 << xkb_keymap_mod_get_index(_glfw.wl.xkb.keymap, \"Shift\");\n    _glfw.wl.xkb.superMask =\n        1 << xkb_keymap_mod_get_index(_glfw.wl.xkb.keymap, \"Mod4\");\n}\n\nstatic void keyboardHandleEnter(void* data,\n                                struct wl_keyboard* keyboard,\n                                uint32_t serial,\n                                struct wl_surface* surface,\n                                struct wl_array* keys)\n{\n    _GLFWwindow* window = wl_surface_get_user_data(surface);\n\n    _glfw.wl.keyboardFocus = window;\n    _glfwInputWindowFocus(window, GLFW_TRUE);\n}\n\nstatic void keyboardHandleLeave(void* data,\n                                struct wl_keyboard* keyboard,\n                                uint32_t serial,\n                                struct wl_surface* surface)\n{\n    _GLFWwindow* window = _glfw.wl.keyboardFocus;\n\n    if (!window)\n        return;\n\n    _glfw.wl.keyboardFocus = NULL;\n    _glfwInputWindowFocus(window, GLFW_FALSE);\n}\n\nstatic int toGLFWKeyCode(uint32_t key)\n{\n    if (key < sizeof(_glfw.wl.keycodes) / sizeof(_glfw.wl.keycodes[0]))\n        return _glfw.wl.keycodes[key];\n\n    return GLFW_KEY_UNKNOWN;\n}\n\nstatic xkb_keysym_t composeSymbol(xkb_keysym_t sym)\n{\n    if (sym == XKB_KEY_NoSymbol || !_glfw.wl.xkb.composeState)\n        return sym;\n    if (xkb_compose_state_feed(_glfw.wl.xkb.composeState, sym)\n            != XKB_COMPOSE_FEED_ACCEPTED)\n        return sym;\n    switch (xkb_compose_state_get_status(_glfw.wl.xkb.composeState))\n    {\n        case XKB_COMPOSE_COMPOSED:\n            return xkb_compose_state_get_one_sym(_glfw.wl.xkb.composeState);\n        case XKB_COMPOSE_COMPOSING:\n        case XKB_COMPOSE_CANCELLED:\n            return XKB_KEY_NoSymbol;\n        case XKB_COMPOSE_NOTHING:\n        default:\n            return sym;\n    }\n}\n\nstatic void inputChar(_GLFWwindow* window, uint32_t key)\n{\n    uint32_t code, numSyms;\n    long cp;\n    const xkb_keysym_t *syms;\n    xkb_keysym_t sym;\n\n    code = key + 8;\n    numSyms = xkb_state_key_get_syms(_glfw.wl.xkb.state, code, &syms);\n\n    if (numSyms == 1)\n    {\n        sym = composeSymbol(syms[0]);\n        cp = _glfwKeySym2Unicode(sym);\n        if (cp != -1)\n        {\n            const int mods = _glfw.wl.xkb.modifiers;\n            const int plain = !(mods & (GLFW_MOD_CONTROL | GLFW_MOD_ALT));\n            _glfwInputChar(window, cp, mods, plain);\n        }\n    }\n}\n\nstatic void keyboardHandleKey(void* data,\n                              struct wl_keyboard* keyboard,\n                              uint32_t serial,\n                              uint32_t time,\n                              uint32_t key,\n                              uint32_t state)\n{\n    int keyCode;\n    int action;\n    _GLFWwindow* window = _glfw.wl.keyboardFocus;\n\n    if (!window)\n        return;\n\n    keyCode = toGLFWKeyCode(key);\n    action = state == WL_KEYBOARD_KEY_STATE_PRESSED\n            ? GLFW_PRESS : GLFW_RELEASE;\n\n    _glfwInputKey(window, keyCode, key, action,\n                  _glfw.wl.xkb.modifiers);\n\n    if (action == GLFW_PRESS)\n        inputChar(window, key);\n}\n\nstatic void keyboardHandleModifiers(void* data,\n                                    struct wl_keyboard* keyboard,\n                                    uint32_t serial,\n                                    uint32_t modsDepressed,\n                                    uint32_t modsLatched,\n                                    uint32_t modsLocked,\n                                    uint32_t group)\n{\n    xkb_mod_mask_t mask;\n    unsigned int modifiers = 0;\n\n    if (!_glfw.wl.xkb.keymap)\n        return;\n\n    xkb_state_update_mask(_glfw.wl.xkb.state,\n                          modsDepressed,\n                          modsLatched,\n                          modsLocked,\n                          0,\n                          0,\n                          group);\n\n    mask = xkb_state_serialize_mods(_glfw.wl.xkb.state,\n                                    XKB_STATE_MODS_DEPRESSED |\n                                    XKB_STATE_LAYOUT_DEPRESSED |\n                                    XKB_STATE_MODS_LATCHED |\n                                    XKB_STATE_LAYOUT_LATCHED);\n    if (mask & _glfw.wl.xkb.controlMask)\n        modifiers |= GLFW_MOD_CONTROL;\n    if (mask & _glfw.wl.xkb.altMask)\n        modifiers |= GLFW_MOD_ALT;\n    if (mask & _glfw.wl.xkb.shiftMask)\n        modifiers |= GLFW_MOD_SHIFT;\n    if (mask & _glfw.wl.xkb.superMask)\n        modifiers |= GLFW_MOD_SUPER;\n    _glfw.wl.xkb.modifiers = modifiers;\n}\n\nstatic const struct wl_keyboard_listener keyboardListener = {\n    keyboardHandleKeymap,\n    keyboardHandleEnter,\n    keyboardHandleLeave,\n    keyboardHandleKey,\n    keyboardHandleModifiers,\n};\n\nstatic void seatHandleCapabilities(void* data,\n                                   struct wl_seat* seat,\n                                   enum wl_seat_capability caps)\n{\n    if ((caps & WL_SEAT_CAPABILITY_POINTER) && !_glfw.wl.pointer)\n    {\n        _glfw.wl.pointer = wl_seat_get_pointer(seat);\n        wl_pointer_add_listener(_glfw.wl.pointer, &pointerListener, NULL);\n    }\n    else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && _glfw.wl.pointer)\n    {\n        wl_pointer_destroy(_glfw.wl.pointer);\n        _glfw.wl.pointer = NULL;\n    }\n\n    if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !_glfw.wl.keyboard)\n    {\n        _glfw.wl.keyboard = wl_seat_get_keyboard(seat);\n        wl_keyboard_add_listener(_glfw.wl.keyboard, &keyboardListener, NULL);\n    }\n    else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && _glfw.wl.keyboard)\n    {\n        wl_keyboard_destroy(_glfw.wl.keyboard);\n        _glfw.wl.keyboard = NULL;\n    }\n}\n\nstatic const struct wl_seat_listener seatListener = {\n    seatHandleCapabilities\n};\n\nstatic void registryHandleGlobal(void* data,\n                                 struct wl_registry* registry,\n                                 uint32_t name,\n                                 const char* interface,\n                                 uint32_t version)\n{\n    if (strcmp(interface, \"wl_compositor\") == 0)\n    {\n        _glfw.wl.compositorVersion = min(3, version);\n        _glfw.wl.compositor =\n            wl_registry_bind(registry, name, &wl_compositor_interface,\n                             _glfw.wl.compositorVersion);\n    }\n    else if (strcmp(interface, \"wl_shm\") == 0)\n    {\n        _glfw.wl.shm =\n            wl_registry_bind(registry, name, &wl_shm_interface, 1);\n    }\n    else if (strcmp(interface, \"wl_shell\") == 0)\n    {\n        _glfw.wl.shell =\n            wl_registry_bind(registry, name, &wl_shell_interface, 1);\n    }\n    else if (strcmp(interface, \"wl_output\") == 0)\n    {\n        _glfwAddOutputWayland(name, version);\n    }\n    else if (strcmp(interface, \"wl_seat\") == 0)\n    {\n        if (!_glfw.wl.seat)\n        {\n            _glfw.wl.seat =\n                wl_registry_bind(registry, name, &wl_seat_interface, 1);\n            wl_seat_add_listener(_glfw.wl.seat, &seatListener, NULL);\n        }\n    }\n    else if (strcmp(interface, \"zwp_relative_pointer_manager_v1\") == 0)\n    {\n        _glfw.wl.relativePointerManager =\n            wl_registry_bind(registry, name,\n                             &zwp_relative_pointer_manager_v1_interface,\n                             1);\n    }\n    else if (strcmp(interface, \"zwp_pointer_constraints_v1\") == 0)\n    {\n        _glfw.wl.pointerConstraints =\n            wl_registry_bind(registry, name,\n                             &zwp_pointer_constraints_v1_interface,\n                             1);\n    }\n}\n\nstatic void registryHandleGlobalRemove(void *data,\n                                       struct wl_registry *registry,\n                                       uint32_t name)\n{\n}\n\n\nstatic const struct wl_registry_listener registryListener = {\n    registryHandleGlobal,\n    registryHandleGlobalRemove\n};\n\n// Create key code translation tables\n//\nstatic void createKeyTables(void)\n{\n    int scancode;\n\n    memset(_glfw.wl.keycodes, -1, sizeof(_glfw.wl.keycodes));\n    memset(_glfw.wl.scancodes, -1, sizeof(_glfw.wl.scancodes));\n\n    _glfw.wl.keycodes[KEY_GRAVE]      = GLFW_KEY_GRAVE_ACCENT;\n    _glfw.wl.keycodes[KEY_1]          = GLFW_KEY_1;\n    _glfw.wl.keycodes[KEY_2]          = GLFW_KEY_2;\n    _glfw.wl.keycodes[KEY_3]          = GLFW_KEY_3;\n    _glfw.wl.keycodes[KEY_4]          = GLFW_KEY_4;\n    _glfw.wl.keycodes[KEY_5]          = GLFW_KEY_5;\n    _glfw.wl.keycodes[KEY_6]          = GLFW_KEY_6;\n    _glfw.wl.keycodes[KEY_7]          = GLFW_KEY_7;\n    _glfw.wl.keycodes[KEY_8]          = GLFW_KEY_8;\n    _glfw.wl.keycodes[KEY_9]          = GLFW_KEY_9;\n    _glfw.wl.keycodes[KEY_0]          = GLFW_KEY_0;\n    _glfw.wl.keycodes[KEY_SPACE]      = GLFW_KEY_SPACE;\n    _glfw.wl.keycodes[KEY_MINUS]      = GLFW_KEY_MINUS;\n    _glfw.wl.keycodes[KEY_EQUAL]      = GLFW_KEY_EQUAL;\n    _glfw.wl.keycodes[KEY_Q]          = GLFW_KEY_Q;\n    _glfw.wl.keycodes[KEY_W]          = GLFW_KEY_W;\n    _glfw.wl.keycodes[KEY_E]          = GLFW_KEY_E;\n    _glfw.wl.keycodes[KEY_R]          = GLFW_KEY_R;\n    _glfw.wl.keycodes[KEY_T]          = GLFW_KEY_T;\n    _glfw.wl.keycodes[KEY_Y]          = GLFW_KEY_Y;\n    _glfw.wl.keycodes[KEY_U]          = GLFW_KEY_U;\n    _glfw.wl.keycodes[KEY_I]          = GLFW_KEY_I;\n    _glfw.wl.keycodes[KEY_O]          = GLFW_KEY_O;\n    _glfw.wl.keycodes[KEY_P]          = GLFW_KEY_P;\n    _glfw.wl.keycodes[KEY_LEFTBRACE]  = GLFW_KEY_LEFT_BRACKET;\n    _glfw.wl.keycodes[KEY_RIGHTBRACE] = GLFW_KEY_RIGHT_BRACKET;\n    _glfw.wl.keycodes[KEY_A]          = GLFW_KEY_A;\n    _glfw.wl.keycodes[KEY_S]          = GLFW_KEY_S;\n    _glfw.wl.keycodes[KEY_D]          = GLFW_KEY_D;\n    _glfw.wl.keycodes[KEY_F]          = GLFW_KEY_F;\n    _glfw.wl.keycodes[KEY_G]          = GLFW_KEY_G;\n    _glfw.wl.keycodes[KEY_H]          = GLFW_KEY_H;\n    _glfw.wl.keycodes[KEY_J]          = GLFW_KEY_J;\n    _glfw.wl.keycodes[KEY_K]          = GLFW_KEY_K;\n    _glfw.wl.keycodes[KEY_L]          = GLFW_KEY_L;\n    _glfw.wl.keycodes[KEY_SEMICOLON]  = GLFW_KEY_SEMICOLON;\n    _glfw.wl.keycodes[KEY_APOSTROPHE] = GLFW_KEY_APOSTROPHE;\n    _glfw.wl.keycodes[KEY_Z]          = GLFW_KEY_Z;\n    _glfw.wl.keycodes[KEY_X]          = GLFW_KEY_X;\n    _glfw.wl.keycodes[KEY_C]          = GLFW_KEY_C;\n    _glfw.wl.keycodes[KEY_V]          = GLFW_KEY_V;\n    _glfw.wl.keycodes[KEY_B]          = GLFW_KEY_B;\n    _glfw.wl.keycodes[KEY_N]          = GLFW_KEY_N;\n    _glfw.wl.keycodes[KEY_M]          = GLFW_KEY_M;\n    _glfw.wl.keycodes[KEY_COMMA]      = GLFW_KEY_COMMA;\n    _glfw.wl.keycodes[KEY_DOT]        = GLFW_KEY_PERIOD;\n    _glfw.wl.keycodes[KEY_SLASH]      = GLFW_KEY_SLASH;\n    _glfw.wl.keycodes[KEY_BACKSLASH]  = GLFW_KEY_BACKSLASH;\n    _glfw.wl.keycodes[KEY_ESC]        = GLFW_KEY_ESCAPE;\n    _glfw.wl.keycodes[KEY_TAB]        = GLFW_KEY_TAB;\n    _glfw.wl.keycodes[KEY_LEFTSHIFT]  = GLFW_KEY_LEFT_SHIFT;\n    _glfw.wl.keycodes[KEY_RIGHTSHIFT] = GLFW_KEY_RIGHT_SHIFT;\n    _glfw.wl.keycodes[KEY_LEFTCTRL]   = GLFW_KEY_LEFT_CONTROL;\n    _glfw.wl.keycodes[KEY_RIGHTCTRL]  = GLFW_KEY_RIGHT_CONTROL;\n    _glfw.wl.keycodes[KEY_LEFTALT]    = GLFW_KEY_LEFT_ALT;\n    _glfw.wl.keycodes[KEY_RIGHTALT]   = GLFW_KEY_RIGHT_ALT;\n    _glfw.wl.keycodes[KEY_LEFTMETA]   = GLFW_KEY_LEFT_SUPER;\n    _glfw.wl.keycodes[KEY_RIGHTMETA]  = GLFW_KEY_RIGHT_SUPER;\n    _glfw.wl.keycodes[KEY_MENU]       = GLFW_KEY_MENU;\n    _glfw.wl.keycodes[KEY_NUMLOCK]    = GLFW_KEY_NUM_LOCK;\n    _glfw.wl.keycodes[KEY_CAPSLOCK]   = GLFW_KEY_CAPS_LOCK;\n    _glfw.wl.keycodes[KEY_PRINT]      = GLFW_KEY_PRINT_SCREEN;\n    _glfw.wl.keycodes[KEY_SCROLLLOCK] = GLFW_KEY_SCROLL_LOCK;\n    _glfw.wl.keycodes[KEY_PAUSE]      = GLFW_KEY_PAUSE;\n    _glfw.wl.keycodes[KEY_DELETE]     = GLFW_KEY_DELETE;\n    _glfw.wl.keycodes[KEY_BACKSPACE]  = GLFW_KEY_BACKSPACE;\n    _glfw.wl.keycodes[KEY_ENTER]      = GLFW_KEY_ENTER;\n    _glfw.wl.keycodes[KEY_HOME]       = GLFW_KEY_HOME;\n    _glfw.wl.keycodes[KEY_END]        = GLFW_KEY_END;\n    _glfw.wl.keycodes[KEY_PAGEUP]     = GLFW_KEY_PAGE_UP;\n    _glfw.wl.keycodes[KEY_PAGEDOWN]   = GLFW_KEY_PAGE_DOWN;\n    _glfw.wl.keycodes[KEY_INSERT]     = GLFW_KEY_INSERT;\n    _glfw.wl.keycodes[KEY_LEFT]       = GLFW_KEY_LEFT;\n    _glfw.wl.keycodes[KEY_RIGHT]      = GLFW_KEY_RIGHT;\n    _glfw.wl.keycodes[KEY_DOWN]       = GLFW_KEY_DOWN;\n    _glfw.wl.keycodes[KEY_UP]         = GLFW_KEY_UP;\n    _glfw.wl.keycodes[KEY_F1]         = GLFW_KEY_F1;\n    _glfw.wl.keycodes[KEY_F2]         = GLFW_KEY_F2;\n    _glfw.wl.keycodes[KEY_F3]         = GLFW_KEY_F3;\n    _glfw.wl.keycodes[KEY_F4]         = GLFW_KEY_F4;\n    _glfw.wl.keycodes[KEY_F5]         = GLFW_KEY_F5;\n    _glfw.wl.keycodes[KEY_F6]         = GLFW_KEY_F6;\n    _glfw.wl.keycodes[KEY_F7]         = GLFW_KEY_F7;\n    _glfw.wl.keycodes[KEY_F8]         = GLFW_KEY_F8;\n    _glfw.wl.keycodes[KEY_F9]         = GLFW_KEY_F9;\n    _glfw.wl.keycodes[KEY_F10]        = GLFW_KEY_F10;\n    _glfw.wl.keycodes[KEY_F11]        = GLFW_KEY_F11;\n    _glfw.wl.keycodes[KEY_F12]        = GLFW_KEY_F12;\n    _glfw.wl.keycodes[KEY_F13]        = GLFW_KEY_F13;\n    _glfw.wl.keycodes[KEY_F14]        = GLFW_KEY_F14;\n    _glfw.wl.keycodes[KEY_F15]        = GLFW_KEY_F15;\n    _glfw.wl.keycodes[KEY_F16]        = GLFW_KEY_F16;\n    _glfw.wl.keycodes[KEY_F17]        = GLFW_KEY_F17;\n    _glfw.wl.keycodes[KEY_F18]        = GLFW_KEY_F18;\n    _glfw.wl.keycodes[KEY_F19]        = GLFW_KEY_F19;\n    _glfw.wl.keycodes[KEY_F20]        = GLFW_KEY_F20;\n    _glfw.wl.keycodes[KEY_F21]        = GLFW_KEY_F21;\n    _glfw.wl.keycodes[KEY_F22]        = GLFW_KEY_F22;\n    _glfw.wl.keycodes[KEY_F23]        = GLFW_KEY_F23;\n    _glfw.wl.keycodes[KEY_F24]        = GLFW_KEY_F24;\n    _glfw.wl.keycodes[KEY_KPSLASH]    = GLFW_KEY_KP_DIVIDE;\n    _glfw.wl.keycodes[KEY_KPDOT]      = GLFW_KEY_KP_MULTIPLY;\n    _glfw.wl.keycodes[KEY_KPMINUS]    = GLFW_KEY_KP_SUBTRACT;\n    _glfw.wl.keycodes[KEY_KPPLUS]     = GLFW_KEY_KP_ADD;\n    _glfw.wl.keycodes[KEY_KP0]        = GLFW_KEY_KP_0;\n    _glfw.wl.keycodes[KEY_KP1]        = GLFW_KEY_KP_1;\n    _glfw.wl.keycodes[KEY_KP2]        = GLFW_KEY_KP_2;\n    _glfw.wl.keycodes[KEY_KP3]        = GLFW_KEY_KP_3;\n    _glfw.wl.keycodes[KEY_KP4]        = GLFW_KEY_KP_4;\n    _glfw.wl.keycodes[KEY_KP5]        = GLFW_KEY_KP_5;\n    _glfw.wl.keycodes[KEY_KP6]        = GLFW_KEY_KP_6;\n    _glfw.wl.keycodes[KEY_KP7]        = GLFW_KEY_KP_7;\n    _glfw.wl.keycodes[KEY_KP8]        = GLFW_KEY_KP_8;\n    _glfw.wl.keycodes[KEY_KP9]        = GLFW_KEY_KP_9;\n    _glfw.wl.keycodes[KEY_KPCOMMA]    = GLFW_KEY_KP_DECIMAL;\n    _glfw.wl.keycodes[KEY_KPEQUAL]    = GLFW_KEY_KP_EQUAL;\n    _glfw.wl.keycodes[KEY_KPENTER]    = GLFW_KEY_KP_ENTER;\n\n    for (scancode = 0;  scancode < 256;  scancode++)\n    {\n        if (_glfw.wl.keycodes[scancode] > 0)\n            _glfw.wl.scancodes[_glfw.wl.keycodes[scancode]] = scancode;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformInit(void)\n{\n    _glfw.wl.display = wl_display_connect(NULL);\n    if (!_glfw.wl.display)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Failed to connect to display\");\n        return GLFW_FALSE;\n    }\n\n    _glfw.wl.registry = wl_display_get_registry(_glfw.wl.display);\n    wl_registry_add_listener(_glfw.wl.registry, &registryListener, NULL);\n\n    createKeyTables();\n\n    _glfw.wl.xkb.context = xkb_context_new(0);\n    if (!_glfw.wl.xkb.context)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Failed to initialize xkb context\");\n        return GLFW_FALSE;\n    }\n\n    // Sync so we got all registry objects\n    wl_display_roundtrip(_glfw.wl.display);\n\n    // Sync so we got all initial output events\n    wl_display_roundtrip(_glfw.wl.display);\n\n    if (!_glfwInitJoysticksLinux())\n        return GLFW_FALSE;\n\n    _glfwInitTimerPOSIX();\n\n    if (_glfw.wl.pointer && _glfw.wl.shm)\n    {\n        _glfw.wl.cursorTheme = wl_cursor_theme_load(NULL, 32, _glfw.wl.shm);\n        if (!_glfw.wl.cursorTheme)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"Wayland: Unable to load default cursor theme\\n\");\n            return GLFW_FALSE;\n        }\n        _glfw.wl.cursorSurface =\n            wl_compositor_create_surface(_glfw.wl.compositor);\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformTerminate(void)\n{\n    _glfwTerminateEGL();\n    _glfwTerminateJoysticksLinux();\n\n    xkb_compose_state_unref(_glfw.wl.xkb.composeState);\n    xkb_keymap_unref(_glfw.wl.xkb.keymap);\n    xkb_state_unref(_glfw.wl.xkb.state);\n    xkb_context_unref(_glfw.wl.xkb.context);\n\n    if (_glfw.wl.cursorTheme)\n        wl_cursor_theme_destroy(_glfw.wl.cursorTheme);\n    if (_glfw.wl.cursorSurface)\n        wl_surface_destroy(_glfw.wl.cursorSurface);\n    if (_glfw.wl.compositor)\n        wl_compositor_destroy(_glfw.wl.compositor);\n    if (_glfw.wl.shm)\n        wl_shm_destroy(_glfw.wl.shm);\n    if (_glfw.wl.shell)\n        wl_shell_destroy(_glfw.wl.shell);\n    if (_glfw.wl.pointer)\n        wl_pointer_destroy(_glfw.wl.pointer);\n    if (_glfw.wl.keyboard)\n        wl_keyboard_destroy(_glfw.wl.keyboard);\n    if (_glfw.wl.seat)\n        wl_seat_destroy(_glfw.wl.seat);\n    if (_glfw.wl.relativePointerManager)\n        zwp_relative_pointer_manager_v1_destroy(_glfw.wl.relativePointerManager);\n    if (_glfw.wl.pointerConstraints)\n        zwp_pointer_constraints_v1_destroy(_glfw.wl.pointerConstraints);\n    if (_glfw.wl.registry)\n        wl_registry_destroy(_glfw.wl.registry);\n    if (_glfw.wl.display)\n    {\n        wl_display_flush(_glfw.wl.display);\n        wl_display_disconnect(_glfw.wl.display);\n    }\n}\n\nconst char* _glfwPlatformGetVersionString(void)\n{\n    return _GLFW_VERSION_NUMBER \" Wayland EGL\"\n#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)\n        \" clock_gettime\"\n#else\n        \" gettimeofday\"\n#endif\n        \" evdev\"\n#if defined(_GLFW_BUILD_DLL)\n        \" shared\"\n#endif\n        ;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/wl_monitor.c",
    "content": "//========================================================================\n// GLFW 3.3 Wayland - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <errno.h>\n\n\nstatic void geometry(void* data,\n                     struct wl_output* output,\n                     int32_t x,\n                     int32_t y,\n                     int32_t physicalWidth,\n                     int32_t physicalHeight,\n                     int32_t subpixel,\n                     const char* make,\n                     const char* model,\n                     int32_t transform)\n{\n    struct _GLFWmonitor *monitor = data;\n    char name[1024];\n\n    monitor->wl.x = x;\n    monitor->wl.y = y;\n    monitor->widthMM = physicalWidth;\n    monitor->heightMM = physicalHeight;\n\n    snprintf(name, sizeof(name), \"%s %s\", make, model);\n    monitor->name = strdup(name);\n}\n\nstatic void mode(void* data,\n                 struct wl_output* output,\n                 uint32_t flags,\n                 int32_t width,\n                 int32_t height,\n                 int32_t refresh)\n{\n    struct _GLFWmonitor *monitor = data;\n    GLFWvidmode mode;\n\n    mode.width = width;\n    mode.height = height;\n    mode.redBits = 8;\n    mode.greenBits = 8;\n    mode.blueBits = 8;\n    mode.refreshRate = refresh / 1000;\n\n    monitor->modeCount++;\n    monitor->modes =\n        realloc(monitor->modes, monitor->modeCount * sizeof(GLFWvidmode));\n    monitor->modes[monitor->modeCount - 1] = mode;\n\n    if (flags & WL_OUTPUT_MODE_CURRENT)\n        monitor->wl.currentMode = monitor->modeCount - 1;\n}\n\nstatic void done(void* data, struct wl_output* output)\n{\n    struct _GLFWmonitor *monitor = data;\n\n    _glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST);\n}\n\nstatic void scale(void* data,\n                  struct wl_output* output,\n                  int32_t factor)\n{\n    struct _GLFWmonitor *monitor = data;\n\n    monitor->wl.scale = factor;\n}\n\nstatic const struct wl_output_listener outputListener = {\n    geometry,\n    mode,\n    done,\n    scale,\n};\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwAddOutputWayland(uint32_t name, uint32_t version)\n{\n    _GLFWmonitor *monitor;\n    struct wl_output *output;\n\n    if (version < 2)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Unsupported output interface version\");\n        return;\n    }\n\n    // The actual name of this output will be set in the geometry handler.\n    monitor = _glfwAllocMonitor(NULL, 0, 0);\n\n    output = wl_registry_bind(_glfw.wl.registry,\n                              name,\n                              &wl_output_interface,\n                              2);\n    if (!output)\n    {\n        _glfwFreeMonitor(monitor);\n        return;\n    }\n\n    monitor->wl.scale = 1;\n    monitor->wl.output = output;\n\n    wl_output_add_listener(output, &outputListener, monitor);\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)\n{\n    if (xpos)\n        *xpos = monitor->wl.x;\n    if (ypos)\n        *ypos = monitor->wl.y;\n}\n\nGLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)\n{\n    *found = monitor->modeCount;\n    return monitor->modes;\n}\n\nvoid _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)\n{\n    *mode = monitor->modes[monitor->wl.currentMode];\n}\n\nvoid _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)\n{\n    // TODO\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Gamma ramp getting not supported yet\");\n}\n\nvoid _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)\n{\n    // TODO\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Gamma ramp setting not supported yet\");\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return monitor->wl.output;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/wl_platform.h",
    "content": "//========================================================================\n// GLFW 3.3 Wayland - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <wayland-client.h>\n#include <xkbcommon/xkbcommon.h>\n#include <xkbcommon/xkbcommon-compose.h>\n#include <dlfcn.h>\n\ntypedef VkFlags VkWaylandSurfaceCreateFlagsKHR;\n\ntypedef struct VkWaylandSurfaceCreateInfoKHR\n{\n    VkStructureType                 sType;\n    const void*                     pNext;\n    VkWaylandSurfaceCreateFlagsKHR  flags;\n    struct wl_display*              display;\n    struct wl_surface*              surface;\n} VkWaylandSurfaceCreateInfoKHR;\n\ntypedef VkResult (APIENTRY *PFN_vkCreateWaylandSurfaceKHR)(VkInstance,const VkWaylandSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);\ntypedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice,uint32_t,struct wl_display*);\n\n#include \"posix_thread.h\"\n#include \"posix_time.h\"\n#include \"linux_joystick.h\"\n#include \"xkb_unicode.h\"\n#include \"egl_context.h\"\n#include \"osmesa_context.h\"\n\n#include \"wayland-relative-pointer-unstable-v1-client-protocol.h\"\n#include \"wayland-pointer-constraints-unstable-v1-client-protocol.h\"\n\n#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)\n#define _glfw_dlclose(handle) dlclose(handle)\n#define _glfw_dlsym(handle, name) dlsym(handle, name)\n\n#define _GLFW_EGL_NATIVE_WINDOW         ((EGLNativeWindowType) window->wl.native)\n#define _GLFW_EGL_NATIVE_DISPLAY        ((EGLNativeDisplayType) _glfw.wl.display)\n\n#define _GLFW_PLATFORM_WINDOW_STATE         _GLFWwindowWayland  wl\n#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWayland wl\n#define _GLFW_PLATFORM_MONITOR_STATE        _GLFWmonitorWayland wl\n#define _GLFW_PLATFORM_CURSOR_STATE         _GLFWcursorWayland  wl\n\n#define _GLFW_PLATFORM_CONTEXT_STATE\n#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE\n\n\n// Wayland-specific per-window data\n//\ntypedef struct _GLFWwindowWayland\n{\n    int                         width, height;\n    GLFWbool                    visible;\n    GLFWbool                    maximized;\n    GLFWbool                    transparent;\n    struct wl_surface*          surface;\n    struct wl_egl_window*       native;\n    struct wl_shell_surface*    shellSurface;\n    struct wl_callback*         callback;\n\n    _GLFWcursor*                currentCursor;\n    double                      cursorPosX, cursorPosY;\n\n    char*                       title;\n\n    // We need to track the monitors the window spans on to calculate the\n    // optimal scaling factor.\n    int                         scale;\n    _GLFWmonitor**              monitors;\n    int                         monitorsCount;\n    int                         monitorsSize;\n\n    struct {\n        struct zwp_relative_pointer_v1*    relativePointer;\n        struct zwp_locked_pointer_v1*      lockedPointer;\n    } pointerLock;\n} _GLFWwindowWayland;\n\n// Wayland-specific global data\n//\ntypedef struct _GLFWlibraryWayland\n{\n    struct wl_display*          display;\n    struct wl_registry*         registry;\n    struct wl_compositor*       compositor;\n    struct wl_shell*            shell;\n    struct wl_shm*              shm;\n    struct wl_seat*             seat;\n    struct wl_pointer*          pointer;\n    struct wl_keyboard*         keyboard;\n    struct zwp_relative_pointer_manager_v1* relativePointerManager;\n    struct zwp_pointer_constraints_v1*      pointerConstraints;\n\n    int                         compositorVersion;\n\n    struct wl_cursor_theme*     cursorTheme;\n    struct wl_surface*          cursorSurface;\n    uint32_t                    pointerSerial;\n\n    short int                   keycodes[256];\n    short int                   scancodes[GLFW_KEY_LAST + 1];\n\n    struct {\n        struct xkb_context*     context;\n        struct xkb_keymap*      keymap;\n        struct xkb_state*       state;\n        struct xkb_compose_state* composeState;\n        xkb_mod_mask_t          controlMask;\n        xkb_mod_mask_t          altMask;\n        xkb_mod_mask_t          shiftMask;\n        xkb_mod_mask_t          superMask;\n        unsigned int            modifiers;\n    } xkb;\n\n    _GLFWwindow*                pointerFocus;\n    _GLFWwindow*                keyboardFocus;\n\n} _GLFWlibraryWayland;\n\n// Wayland-specific per-monitor data\n//\ntypedef struct _GLFWmonitorWayland\n{\n    struct wl_output*           output;\n    int                         currentMode;\n\n    int                         x;\n    int                         y;\n    int                         scale;\n\n} _GLFWmonitorWayland;\n\n// Wayland-specific per-cursor data\n//\ntypedef struct _GLFWcursorWayland\n{\n    struct wl_cursor_image*     image;\n    struct wl_buffer*           buffer;\n    int                         width, height;\n    int                         xhot, yhot;\n} _GLFWcursorWayland;\n\n\nvoid _glfwAddOutputWayland(uint32_t name, uint32_t version);\n\n"
  },
  {
    "path": "external/GLFW/src/wl_window.c",
    "content": "//========================================================================\n// GLFW 3.3 Wayland - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define _GNU_SOURCE\n\n#include \"internal.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <unistd.h>\n#include <string.h>\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <poll.h>\n\n#include <wayland-egl.h>\n#include <wayland-cursor.h>\n\n\nstatic void handlePing(void* data,\n                       struct wl_shell_surface* shellSurface,\n                       uint32_t serial)\n{\n    wl_shell_surface_pong(shellSurface, serial);\n}\n\nstatic void handleConfigure(void* data,\n                            struct wl_shell_surface* shellSurface,\n                            uint32_t edges,\n                            int32_t width,\n                            int32_t height)\n{\n    _GLFWwindow* window = data;\n    float aspectRatio;\n    float targetRatio;\n\n    if (!window->monitor)\n    {\n        if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE)\n        {\n            aspectRatio = (float)width / (float)height;\n            targetRatio = (float)window->numer / (float)window->denom;\n            if (aspectRatio < targetRatio)\n                height = width / targetRatio;\n            else if (aspectRatio > targetRatio)\n                width = height * targetRatio;\n        }\n\n        if (window->minwidth != GLFW_DONT_CARE && width < window->minwidth)\n            width = window->minwidth;\n        else if (window->maxwidth != GLFW_DONT_CARE && width > window->maxwidth)\n            width = window->maxwidth;\n\n        if (window->minheight != GLFW_DONT_CARE && height < window->minheight)\n            height = window->minheight;\n        else if (window->maxheight != GLFW_DONT_CARE && height > window->maxheight)\n            height = window->maxheight;\n    }\n\n    _glfwInputWindowSize(window, width, height);\n    _glfwPlatformSetWindowSize(window, width, height);\n    _glfwInputWindowDamage(window);\n}\n\nstatic void handlePopupDone(void* data,\n                            struct wl_shell_surface* shellSurface)\n{\n}\n\nstatic const struct wl_shell_surface_listener shellSurfaceListener = {\n    handlePing,\n    handleConfigure,\n    handlePopupDone\n};\n\nstatic void checkScaleChange(_GLFWwindow* window)\n{\n    int scaledWidth, scaledHeight;\n    int scale = 1;\n    int i;\n    int monitorScale;\n\n    // Check if we will be able to set the buffer scale or not.\n    if (_glfw.wl.compositorVersion < 3)\n        return;\n\n    // Get the scale factor from the highest scale monitor.\n    for (i = 0; i < window->wl.monitorsCount; ++i)\n    {\n        monitorScale = window->wl.monitors[i]->wl.scale;\n        if (scale < monitorScale)\n            scale = monitorScale;\n    }\n\n    // Only change the framebuffer size if the scale changed.\n    if (scale != window->wl.scale)\n    {\n        window->wl.scale = scale;\n        scaledWidth = window->wl.width * scale;\n        scaledHeight = window->wl.height * scale;\n        wl_surface_set_buffer_scale(window->wl.surface, scale);\n        wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0);\n        _glfwInputFramebufferSize(window, scaledWidth, scaledHeight);\n    }\n}\n\nstatic void handleEnter(void *data,\n                        struct wl_surface *surface,\n                        struct wl_output *output)\n{\n    _GLFWwindow* window = data;\n    _GLFWmonitor* monitor = wl_output_get_user_data(output);\n\n    if (window->wl.monitorsCount + 1 > window->wl.monitorsSize)\n    {\n        ++window->wl.monitorsSize;\n        window->wl.monitors =\n            realloc(window->wl.monitors,\n                    window->wl.monitorsSize * sizeof(_GLFWmonitor*));\n    }\n\n    window->wl.monitors[window->wl.monitorsCount++] = monitor;\n\n    checkScaleChange(window);\n}\n\nstatic void handleLeave(void *data,\n                        struct wl_surface *surface,\n                        struct wl_output *output)\n{\n    _GLFWwindow* window = data;\n    _GLFWmonitor* monitor = wl_output_get_user_data(output);\n    GLFWbool found;\n    int i;\n\n    for (i = 0, found = GLFW_FALSE; i < window->wl.monitorsCount - 1; ++i)\n    {\n        if (monitor == window->wl.monitors[i])\n            found = GLFW_TRUE;\n        if (found)\n            window->wl.monitors[i] = window->wl.monitors[i + 1];\n    }\n    window->wl.monitors[--window->wl.monitorsCount] = NULL;\n\n    checkScaleChange(window);\n}\n\nstatic const struct wl_surface_listener surfaceListener = {\n    handleEnter,\n    handleLeave\n};\n\n// Makes the surface considered as XRGB instead of ARGB.\nstatic void setOpaqueRegion(_GLFWwindow* window)\n{\n    struct wl_region* region;\n\n    region = wl_compositor_create_region(_glfw.wl.compositor);\n    if (!region)\n        return;\n\n    wl_region_add(region, 0, 0, window->wl.width, window->wl.height);\n    wl_surface_set_opaque_region(window->wl.surface, region);\n    wl_surface_commit(window->wl.surface);\n    wl_region_destroy(region);\n}\n\nstatic GLFWbool createSurface(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig)\n{\n    window->wl.surface = wl_compositor_create_surface(_glfw.wl.compositor);\n    if (!window->wl.surface)\n        return GLFW_FALSE;\n\n    wl_surface_add_listener(window->wl.surface,\n                            &surfaceListener,\n                            window);\n\n    wl_surface_set_user_data(window->wl.surface, window);\n\n    window->wl.native = wl_egl_window_create(window->wl.surface,\n                                             wndconfig->width,\n                                             wndconfig->height);\n    if (!window->wl.native)\n        return GLFW_FALSE;\n\n    window->wl.width = wndconfig->width;\n    window->wl.height = wndconfig->height;\n    window->wl.scale = 1;\n\n    if (!window->wl.transparent)\n        setOpaqueRegion(window);\n\n    return GLFW_TRUE;\n}\n\nstatic GLFWbool createShellSurface(_GLFWwindow* window)\n{\n    window->wl.shellSurface = wl_shell_get_shell_surface(_glfw.wl.shell,\n                                                         window->wl.surface);\n    if (!window->wl.shellSurface)\n        return GLFW_FALSE;\n\n    wl_shell_surface_add_listener(window->wl.shellSurface,\n                                  &shellSurfaceListener,\n                                  window);\n\n    if (window->wl.title)\n        wl_shell_surface_set_title(window->wl.shellSurface, window->wl.title);\n\n    if (window->monitor)\n    {\n        wl_shell_surface_set_fullscreen(\n            window->wl.shellSurface,\n            WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,\n            0,\n            window->monitor->wl.output);\n    }\n    else if (window->wl.maximized)\n    {\n        wl_shell_surface_set_maximized(window->wl.shellSurface, NULL);\n    }\n    else\n    {\n        wl_shell_surface_set_toplevel(window->wl.shellSurface);\n    }\n\n    wl_surface_commit(window->wl.surface);\n\n    return GLFW_TRUE;\n}\n\nstatic int\ncreateTmpfileCloexec(char* tmpname)\n{\n    int fd;\n\n    fd = mkostemp(tmpname, O_CLOEXEC);\n    if (fd >= 0)\n        unlink(tmpname);\n\n    return fd;\n}\n\nstatic void\nhandleEvents(int timeout)\n{\n    struct wl_display* display = _glfw.wl.display;\n    struct pollfd fds[] = {\n        { wl_display_get_fd(display), POLLIN },\n    };\n\n    while (wl_display_prepare_read(display) != 0)\n        wl_display_dispatch_pending(display);\n\n    // If an error different from EAGAIN happens, we have likely been\n    // disconnected from the Wayland session, try to handle that the best we\n    // can.\n    if (wl_display_flush(display) < 0 && errno != EAGAIN)\n    {\n        _GLFWwindow* window = _glfw.windowListHead;\n        while (window)\n        {\n            _glfwInputWindowCloseRequest(window);\n            window = window->next;\n        }\n        wl_display_cancel_read(display);\n        return;\n    }\n\n    if (poll(fds, 1, timeout) > 0)\n    {\n        wl_display_read_events(display);\n        wl_display_dispatch_pending(display);\n    }\n    else\n    {\n        wl_display_cancel_read(display);\n    }\n}\n\n/*\n * Create a new, unique, anonymous file of the given size, and\n * return the file descriptor for it. The file descriptor is set\n * CLOEXEC. The file is immediately suitable for mmap()'ing\n * the given size at offset zero.\n *\n * The file should not have a permanent backing store like a disk,\n * but may have if XDG_RUNTIME_DIR is not properly implemented in OS.\n *\n * The file name is deleted from the file system.\n *\n * The file is suitable for buffer sharing between processes by\n * transmitting the file descriptor over Unix sockets using the\n * SCM_RIGHTS methods.\n *\n * posix_fallocate() is used to guarantee that disk space is available\n * for the file at the given size. If disk space is insufficent, errno\n * is set to ENOSPC. If posix_fallocate() is not supported, program may\n * receive SIGBUS on accessing mmap()'ed file contents instead.\n */\nint\ncreateAnonymousFile(off_t size)\n{\n    static const char template[] = \"/glfw-shared-XXXXXX\";\n    const char* path;\n    char* name;\n    int fd;\n    int ret;\n\n    path = getenv(\"XDG_RUNTIME_DIR\");\n    if (!path)\n    {\n        errno = ENOENT;\n        return -1;\n    }\n\n    name = calloc(strlen(path) + sizeof(template), 1);\n    strcpy(name, path);\n    strcat(name, template);\n\n    fd = createTmpfileCloexec(name);\n\n    free(name);\n\n    if (fd < 0)\n        return -1;\n    ret = posix_fallocate(fd, 0, size);\n    if (ret != 0)\n    {\n        close(fd);\n        errno = ret;\n        return -1;\n    }\n    return fd;\n}\n\n// Translates a GLFW standard cursor to a theme cursor name\n//\nstatic char *translateCursorShape(int shape)\n{\n    switch (shape)\n    {\n        case GLFW_ARROW_CURSOR:\n            return \"left_ptr\";\n        case GLFW_IBEAM_CURSOR:\n            return \"xterm\";\n        case GLFW_CROSSHAIR_CURSOR:\n            return \"crosshair\";\n        case GLFW_HAND_CURSOR:\n            return \"grabbing\";\n        case GLFW_HRESIZE_CURSOR:\n            return \"sb_h_double_arrow\";\n        case GLFW_VRESIZE_CURSOR:\n            return \"sb_v_double_arrow\";\n    }\n    return NULL;\n}\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformCreateWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig)\n{\n    window->wl.transparent = fbconfig->transparent;\n\n    if (!createSurface(window, wndconfig))\n        return GLFW_FALSE;\n\n    if (ctxconfig->client != GLFW_NO_API)\n    {\n        if (ctxconfig->source == GLFW_EGL_CONTEXT_API ||\n            ctxconfig->source == GLFW_NATIVE_CONTEXT_API)\n        {\n            if (!_glfwInitEGL())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API)\n        {\n            if (!_glfwInitOSMesa())\n                return GLFW_FALSE;\n            if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n    }\n\n    if (wndconfig->title)\n        window->wl.title = strdup(wndconfig->title);\n\n    if (wndconfig->visible)\n    {\n        if (!createShellSurface(window))\n            return GLFW_FALSE;\n\n        window->wl.visible = GLFW_TRUE;\n    }\n    else\n    {\n        window->wl.shellSurface = NULL;\n        window->wl.visible = GLFW_FALSE;\n    }\n\n    window->wl.currentCursor = NULL;\n\n    window->wl.monitors = calloc(1, sizeof(_GLFWmonitor*));\n    window->wl.monitorsCount = 0;\n    window->wl.monitorsSize = 1;\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyWindow(_GLFWwindow* window)\n{\n    if (window == _glfw.wl.pointerFocus)\n    {\n        _glfw.wl.pointerFocus = NULL;\n        _glfwInputCursorEnter(window, GLFW_FALSE);\n    }\n    if (window == _glfw.wl.keyboardFocus)\n    {\n        _glfw.wl.keyboardFocus = NULL;\n        _glfwInputWindowFocus(window, GLFW_FALSE);\n    }\n\n    if (window->context.destroy)\n        window->context.destroy(window);\n\n    if (window->wl.native)\n        wl_egl_window_destroy(window->wl.native);\n\n    if (window->wl.shellSurface)\n        wl_shell_surface_destroy(window->wl.shellSurface);\n\n    if (window->wl.surface)\n        wl_surface_destroy(window->wl.surface);\n\n    free(window->wl.title);\n    free(window->wl.monitors);\n}\n\nvoid _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)\n{\n    if (window->wl.title)\n        free(window->wl.title);\n    window->wl.title = strdup(title);\n    if (window->wl.shellSurface)\n        wl_shell_surface_set_title(window->wl.shellSurface, title);\n}\n\nvoid _glfwPlatformSetWindowIcon(_GLFWwindow* window,\n                                int count, const GLFWimage* images)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Setting window icon not supported\");\n}\n\nvoid _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)\n{\n    // A Wayland client is not aware of its position, so just warn and leave it\n    // as (0, 0)\n\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Window position retrieval not supported\");\n}\n\nvoid _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)\n{\n    // A Wayland client can not set its position, so just warn\n\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Window position setting not supported\");\n}\n\nvoid _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)\n{\n    if (width)\n        *width = window->wl.width;\n    if (height)\n        *height = window->wl.height;\n}\n\nvoid _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)\n{\n    int scaledWidth = width * window->wl.scale;\n    int scaledHeight = height * window->wl.scale;\n    window->wl.width = width;\n    window->wl.height = height;\n    wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0);\n    if (!window->wl.transparent)\n        setOpaqueRegion(window);\n    _glfwInputFramebufferSize(window, scaledWidth, scaledHeight);\n}\n\nvoid _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,\n                                      int minwidth, int minheight,\n                                      int maxwidth, int maxheight)\n{\n    // TODO: find out how to trigger a resize.\n    // The actual limits are checked in the wl_shell_surface::configure handler.\n}\n\nvoid _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)\n{\n    // TODO: find out how to trigger a resize.\n    // The actual limits are checked in the wl_shell_surface::configure handler.\n}\n\nvoid _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)\n{\n    _glfwPlatformGetWindowSize(window, width, height);\n    *width *= window->wl.scale;\n    *height *= window->wl.scale;\n}\n\nvoid _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,\n                                     int* left, int* top,\n                                     int* right, int* bottom)\n{\n    // TODO: will need a proper implementation once decorations are\n    // implemented, but for now just leave everything as 0.\n}\n\nvoid _glfwPlatformIconifyWindow(_GLFWwindow* window)\n{\n    // TODO: move to xdg_shell instead of wl_shell.\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Iconify window not supported\");\n}\n\nvoid _glfwPlatformRestoreWindow(_GLFWwindow* window)\n{\n    // TODO: also do the same for iconified.\n    if (window->monitor || window->wl.maximized)\n    {\n        if (window->wl.shellSurface)\n            wl_shell_surface_set_toplevel(window->wl.shellSurface);\n\n        window->wl.maximized = GLFW_FALSE;\n    }\n}\n\nvoid _glfwPlatformMaximizeWindow(_GLFWwindow* window)\n{\n    if (!window->monitor && !window->wl.maximized)\n    {\n        if (window->wl.shellSurface)\n        {\n            // Let the compositor select the best output.\n            wl_shell_surface_set_maximized(window->wl.shellSurface, NULL);\n        }\n        window->wl.maximized = GLFW_TRUE;\n    }\n}\n\nvoid _glfwPlatformShowWindow(_GLFWwindow* window)\n{\n    if (!window->monitor)\n    {\n        if (!window->wl.shellSurface)\n            createShellSurface(window);\n        window->wl.visible = GLFW_TRUE;\n    }\n}\n\nvoid _glfwPlatformHideWindow(_GLFWwindow* window)\n{\n    if (!window->monitor)\n    {\n        if (window->wl.shellSurface)\n            wl_shell_surface_destroy(window->wl.shellSurface);\n        window->wl.visible = GLFW_FALSE;\n    }\n}\n\nvoid _glfwPlatformRequestWindowAttention(_GLFWwindow* window)\n{\n    // TODO\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Window attention request not implemented yet\");\n}\n\nvoid _glfwPlatformFocusWindow(_GLFWwindow* window)\n{\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Focusing a window requires user interaction\");\n}\n\nvoid _glfwPlatformSetWindowMonitor(_GLFWwindow* window,\n                                   _GLFWmonitor* monitor,\n                                   int xpos, int ypos,\n                                   int width, int height,\n                                   int refreshRate)\n{\n    if (monitor)\n    {\n        wl_shell_surface_set_fullscreen(\n            window->wl.shellSurface,\n            WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,\n            refreshRate * 1000, // Convert Hz to mHz.\n            monitor->wl.output);\n    }\n    else\n    {\n        wl_shell_surface_set_toplevel(window->wl.shellSurface);\n    }\n    _glfwInputWindowMonitorChange(window, monitor);\n}\n\nint _glfwPlatformWindowFocused(_GLFWwindow* window)\n{\n    return _glfw.wl.keyboardFocus == window;\n}\n\nint _glfwPlatformWindowIconified(_GLFWwindow* window)\n{\n    // TODO: move to xdg_shell, wl_shell doesn't have any iconified concept.\n    return GLFW_FALSE;\n}\n\nint _glfwPlatformWindowVisible(_GLFWwindow* window)\n{\n    return window->wl.visible;\n}\n\nint _glfwPlatformWindowMaximized(_GLFWwindow* window)\n{\n    return window->wl.maximized;\n}\n\nint _glfwPlatformFramebufferTransparent(_GLFWwindow* window)\n{\n    return window->wl.transparent;\n}\n\nvoid _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)\n{\n    // TODO\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Window attribute setting not implemented yet\");\n}\n\nvoid _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)\n{\n    // TODO\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Window attribute setting not implemented yet\");\n}\n\nvoid _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)\n{\n    // TODO\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Window attribute setting not implemented yet\");\n}\n\nvoid _glfwPlatformPollEvents(void)\n{\n    handleEvents(0);\n}\n\nvoid _glfwPlatformWaitEvents(void)\n{\n    handleEvents(-1);\n}\n\nvoid _glfwPlatformWaitEventsTimeout(double timeout)\n{\n    handleEvents((int) (timeout * 1e3));\n}\n\nvoid _glfwPlatformPostEmptyEvent(void)\n{\n    wl_display_sync(_glfw.wl.display);\n}\n\nvoid _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)\n{\n    if (xpos)\n        *xpos = window->wl.cursorPosX;\n    if (ypos)\n        *ypos = window->wl.cursorPosY;\n}\n\nstatic GLFWbool isPointerLocked(_GLFWwindow* window);\n\nvoid _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)\n{\n    if (isPointerLocked(window))\n    {\n        zwp_locked_pointer_v1_set_cursor_position_hint(\n            window->wl.pointerLock.lockedPointer,\n            wl_fixed_from_double(x), wl_fixed_from_double(y));\n        wl_surface_commit(window->wl.surface);\n    }\n}\n\nvoid _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)\n{\n    _glfwPlatformSetCursor(window, window->wl.currentCursor);\n}\n\nconst char* _glfwPlatformGetScancodeName(int scancode)\n{\n    // TODO\n    return NULL;\n}\n\nint _glfwPlatformGetKeyScancode(int key)\n{\n    return _glfw.wl.scancodes[key];\n}\n\nint _glfwPlatformCreateCursor(_GLFWcursor* cursor,\n                              const GLFWimage* image,\n                              int xhot, int yhot)\n{\n    struct wl_shm_pool* pool;\n    int stride = image->width * 4;\n    int length = image->width * image->height * 4;\n    void* data;\n    int fd, i;\n\n    fd = createAnonymousFile(length);\n    if (fd < 0)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Creating a buffer file for %d B failed: %m\",\n                        length);\n        return GLFW_FALSE;\n    }\n\n    data = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);\n    if (data == MAP_FAILED)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Cursor mmap failed: %m\");\n        close(fd);\n        return GLFW_FALSE;\n    }\n\n    pool = wl_shm_create_pool(_glfw.wl.shm, fd, length);\n\n    close(fd);\n    unsigned char* source = (unsigned char*) image->pixels;\n    unsigned char* target = data;\n    for (i = 0;  i < image->width * image->height;  i++, source += 4)\n    {\n        unsigned int alpha = source[3];\n\n        *target++ = (unsigned char) ((source[2] * alpha) / 255);\n        *target++ = (unsigned char) ((source[1] * alpha) / 255);\n        *target++ = (unsigned char) ((source[0] * alpha) / 255);\n        *target++ = (unsigned char) alpha;\n    }\n\n    cursor->wl.buffer =\n        wl_shm_pool_create_buffer(pool, 0,\n                                  image->width,\n                                  image->height,\n                                  stride, WL_SHM_FORMAT_ARGB8888);\n    munmap(data, length);\n    wl_shm_pool_destroy(pool);\n\n    cursor->wl.width = image->width;\n    cursor->wl.height = image->height;\n    cursor->wl.xhot = xhot;\n    cursor->wl.yhot = yhot;\n    return GLFW_TRUE;\n}\n\nint _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)\n{\n    struct wl_cursor* standardCursor;\n\n    standardCursor = wl_cursor_theme_get_cursor(_glfw.wl.cursorTheme,\n                                                translateCursorShape(shape));\n    if (!standardCursor)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Standard cursor \\\"%s\\\" not found\",\n                        translateCursorShape(shape));\n        return GLFW_FALSE;\n    }\n\n    cursor->wl.image = standardCursor->images[0];\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyCursor(_GLFWcursor* cursor)\n{\n    // If it's a standard cursor we don't need to do anything here\n    if (cursor->wl.image)\n        return;\n\n    if (cursor->wl.buffer)\n        wl_buffer_destroy(cursor->wl.buffer);\n}\n\nstatic void handleRelativeMotion(void* data,\n                                 struct zwp_relative_pointer_v1* pointer,\n                                 uint32_t timeHi,\n                                 uint32_t timeLo,\n                                 wl_fixed_t dx,\n                                 wl_fixed_t dy,\n                                 wl_fixed_t dxUnaccel,\n                                 wl_fixed_t dyUnaccel)\n{\n    _GLFWwindow* window = data;\n\n    if (window->cursorMode != GLFW_CURSOR_DISABLED)\n        return;\n\n    _glfwInputCursorPos(window,\n                        window->virtualCursorPosX + wl_fixed_to_double(dxUnaccel),\n                        window->virtualCursorPosY + wl_fixed_to_double(dyUnaccel));\n}\n\nstatic const struct zwp_relative_pointer_v1_listener relativePointerListener = {\n    handleRelativeMotion\n};\n\nstatic void handleLocked(void* data,\n                         struct zwp_locked_pointer_v1* lockedPointer)\n{\n}\n\nstatic void unlockPointer(_GLFWwindow* window)\n{\n    struct zwp_relative_pointer_v1* relativePointer =\n        window->wl.pointerLock.relativePointer;\n    struct zwp_locked_pointer_v1* lockedPointer =\n        window->wl.pointerLock.lockedPointer;\n\n    zwp_relative_pointer_v1_destroy(relativePointer);\n    zwp_locked_pointer_v1_destroy(lockedPointer);\n\n    window->wl.pointerLock.relativePointer = NULL;\n    window->wl.pointerLock.lockedPointer = NULL;\n}\n\nstatic void lockPointer(_GLFWwindow* window);\n\nstatic void handleUnlocked(void* data,\n                           struct zwp_locked_pointer_v1* lockedPointer)\n{\n}\n\nstatic const struct zwp_locked_pointer_v1_listener lockedPointerListener = {\n    handleLocked,\n    handleUnlocked\n};\n\nstatic void lockPointer(_GLFWwindow* window)\n{\n    struct zwp_relative_pointer_v1* relativePointer;\n    struct zwp_locked_pointer_v1* lockedPointer;\n\n    if (!_glfw.wl.relativePointerManager)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: no relative pointer manager\");\n        return;\n    }\n\n    relativePointer =\n        zwp_relative_pointer_manager_v1_get_relative_pointer(\n            _glfw.wl.relativePointerManager,\n            _glfw.wl.pointer);\n    zwp_relative_pointer_v1_add_listener(relativePointer,\n                                         &relativePointerListener,\n                                         window);\n\n    lockedPointer =\n        zwp_pointer_constraints_v1_lock_pointer(\n            _glfw.wl.pointerConstraints,\n            window->wl.surface,\n            _glfw.wl.pointer,\n            NULL,\n            ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT);\n    zwp_locked_pointer_v1_add_listener(lockedPointer,\n                                       &lockedPointerListener,\n                                       window);\n\n    window->wl.pointerLock.relativePointer = relativePointer;\n    window->wl.pointerLock.lockedPointer = lockedPointer;\n\n    wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerSerial,\n                          NULL, 0, 0);\n}\n\nstatic GLFWbool isPointerLocked(_GLFWwindow* window)\n{\n    return window->wl.pointerLock.lockedPointer != NULL;\n}\n\nvoid _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)\n{\n    struct wl_buffer* buffer;\n    struct wl_cursor* defaultCursor;\n    struct wl_cursor_image* image;\n    struct wl_surface* surface = _glfw.wl.cursorSurface;\n\n    if (!_glfw.wl.pointer)\n        return;\n\n    window->wl.currentCursor = cursor;\n\n    // If we're not in the correct window just save the cursor\n    // the next time the pointer enters the window the cursor will change\n    if (window != _glfw.wl.pointerFocus)\n        return;\n\n    // Unlock possible pointer lock if no longer disabled.\n    if (window->cursorMode != GLFW_CURSOR_DISABLED && isPointerLocked(window))\n        unlockPointer(window);\n\n    if (window->cursorMode == GLFW_CURSOR_NORMAL)\n    {\n        if (cursor)\n            image = cursor->wl.image;\n        else\n        {\n            defaultCursor = wl_cursor_theme_get_cursor(_glfw.wl.cursorTheme,\n                                                       \"left_ptr\");\n            if (!defaultCursor)\n            {\n                _glfwInputError(GLFW_PLATFORM_ERROR,\n                                \"Wayland: Standard cursor not found\");\n                return;\n            }\n            image = defaultCursor->images[0];\n        }\n\n        if (image)\n        {\n            buffer = wl_cursor_image_get_buffer(image);\n            if (!buffer)\n                return;\n            wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerSerial,\n                                  surface,\n                                  image->hotspot_x,\n                                  image->hotspot_y);\n            wl_surface_attach(surface, buffer, 0, 0);\n            wl_surface_damage(surface, 0, 0,\n                              image->width, image->height);\n            wl_surface_commit(surface);\n        }\n        else\n        {\n            wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerSerial,\n                                  surface,\n                                  cursor->wl.xhot,\n                                  cursor->wl.yhot);\n            wl_surface_attach(surface, cursor->wl.buffer, 0, 0);\n            wl_surface_damage(surface, 0, 0,\n                              cursor->wl.width, cursor->wl.height);\n            wl_surface_commit(surface);\n        }\n    }\n    else if (window->cursorMode == GLFW_CURSOR_DISABLED)\n    {\n        if (!isPointerLocked(window))\n            lockPointer(window);\n    }\n    else if (window->cursorMode == GLFW_CURSOR_HIDDEN)\n    {\n        wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerSerial,\n                              NULL, 0, 0);\n    }\n}\n\nvoid _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string)\n{\n    // TODO\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Clipboard setting not implemented yet\");\n}\n\nconst char* _glfwPlatformGetClipboardString(_GLFWwindow* window)\n{\n    // TODO\n    _glfwInputError(GLFW_PLATFORM_ERROR,\n                    \"Wayland: Clipboard getting not implemented yet\");\n    return NULL;\n}\n\nvoid _glfwPlatformGetRequiredInstanceExtensions(char** extensions)\n{\n    if (!_glfw.vk.KHR_surface || !_glfw.vk.KHR_wayland_surface)\n        return;\n\n    extensions[0] = \"VK_KHR_surface\";\n    extensions[1] = \"VK_KHR_wayland_surface\";\n}\n\nint _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,\n                                                      VkPhysicalDevice device,\n                                                      uint32_t queuefamily)\n{\n    PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR\n        vkGetPhysicalDeviceWaylandPresentationSupportKHR =\n        (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)\n        vkGetInstanceProcAddr(instance, \"vkGetPhysicalDeviceWaylandPresentationSupportKHR\");\n    if (!vkGetPhysicalDeviceWaylandPresentationSupportKHR)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Wayland: Vulkan instance missing VK_KHR_wayland_surface extension\");\n        return VK_NULL_HANDLE;\n    }\n\n    return vkGetPhysicalDeviceWaylandPresentationSupportKHR(device,\n                                                            queuefamily,\n                                                            _glfw.wl.display);\n}\n\nVkResult _glfwPlatformCreateWindowSurface(VkInstance instance,\n                                          _GLFWwindow* window,\n                                          const VkAllocationCallbacks* allocator,\n                                          VkSurfaceKHR* surface)\n{\n    VkResult err;\n    VkWaylandSurfaceCreateInfoKHR sci;\n    PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;\n\n    vkCreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)\n        vkGetInstanceProcAddr(instance, \"vkCreateWaylandSurfaceKHR\");\n    if (!vkCreateWaylandSurfaceKHR)\n    {\n        _glfwInputError(GLFW_API_UNAVAILABLE,\n                        \"Wayland: Vulkan instance missing VK_KHR_wayland_surface extension\");\n        return VK_ERROR_EXTENSION_NOT_PRESENT;\n    }\n\n    memset(&sci, 0, sizeof(sci));\n    sci.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;\n    sci.display = _glfw.wl.display;\n    sci.surface = window->wl.surface;\n\n    err = vkCreateWaylandSurfaceKHR(instance, &sci, allocator, surface);\n    if (err)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"Wayland: Failed to create Vulkan surface: %s\",\n                        _glfwGetVulkanResultString(err));\n    }\n\n    return err;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI struct wl_display* glfwGetWaylandDisplay(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return _glfw.wl.display;\n}\n\nGLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return window->wl.surface;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/x11_init.c",
    "content": "//========================================================================\n// GLFW 3.3 X11 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <X11/Xresource.h>\n\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n#include <stdio.h>\n#include <locale.h>\n\n\n// Translate an X11 key code to a GLFW key code.\n//\nstatic int translateKeyCode(int scancode)\n{\n    int keySym;\n\n    // Valid key code range is  [8,255], according to the Xlib manual\n    if (scancode < 8 || scancode > 255)\n        return GLFW_KEY_UNKNOWN;\n\n    if (_glfw.x11.xkb.available)\n    {\n        // Try secondary keysym, for numeric keypad keys\n        // Note: This way we always force \"NumLock = ON\", which is intentional\n        // since the returned key code should correspond to a physical\n        // location.\n        keySym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, 0, 1);\n        switch (keySym)\n        {\n            case XK_KP_0:           return GLFW_KEY_KP_0;\n            case XK_KP_1:           return GLFW_KEY_KP_1;\n            case XK_KP_2:           return GLFW_KEY_KP_2;\n            case XK_KP_3:           return GLFW_KEY_KP_3;\n            case XK_KP_4:           return GLFW_KEY_KP_4;\n            case XK_KP_5:           return GLFW_KEY_KP_5;\n            case XK_KP_6:           return GLFW_KEY_KP_6;\n            case XK_KP_7:           return GLFW_KEY_KP_7;\n            case XK_KP_8:           return GLFW_KEY_KP_8;\n            case XK_KP_9:           return GLFW_KEY_KP_9;\n            case XK_KP_Separator:\n            case XK_KP_Decimal:     return GLFW_KEY_KP_DECIMAL;\n            case XK_KP_Equal:       return GLFW_KEY_KP_EQUAL;\n            case XK_KP_Enter:       return GLFW_KEY_KP_ENTER;\n            default:                break;\n        }\n\n        // Now try primary keysym for function keys (non-printable keys)\n        // These should not depend on the current keyboard layout\n        keySym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, 0, 0);\n    }\n    else\n    {\n        int dummy;\n        KeySym* keySyms;\n\n        keySyms = XGetKeyboardMapping(_glfw.x11.display, scancode, 1, &dummy);\n        keySym = keySyms[0];\n        XFree(keySyms);\n    }\n\n    switch (keySym)\n    {\n        case XK_Escape:         return GLFW_KEY_ESCAPE;\n        case XK_Tab:            return GLFW_KEY_TAB;\n        case XK_Shift_L:        return GLFW_KEY_LEFT_SHIFT;\n        case XK_Shift_R:        return GLFW_KEY_RIGHT_SHIFT;\n        case XK_Control_L:      return GLFW_KEY_LEFT_CONTROL;\n        case XK_Control_R:      return GLFW_KEY_RIGHT_CONTROL;\n        case XK_Meta_L:\n        case XK_Alt_L:          return GLFW_KEY_LEFT_ALT;\n        case XK_Mode_switch: // Mapped to Alt_R on many keyboards\n        case XK_ISO_Level3_Shift: // AltGr on at least some machines\n        case XK_Meta_R:\n        case XK_Alt_R:          return GLFW_KEY_RIGHT_ALT;\n        case XK_Super_L:        return GLFW_KEY_LEFT_SUPER;\n        case XK_Super_R:        return GLFW_KEY_RIGHT_SUPER;\n        case XK_Menu:           return GLFW_KEY_MENU;\n        case XK_Num_Lock:       return GLFW_KEY_NUM_LOCK;\n        case XK_Caps_Lock:      return GLFW_KEY_CAPS_LOCK;\n        case XK_Print:          return GLFW_KEY_PRINT_SCREEN;\n        case XK_Scroll_Lock:    return GLFW_KEY_SCROLL_LOCK;\n        case XK_Pause:          return GLFW_KEY_PAUSE;\n        case XK_Delete:         return GLFW_KEY_DELETE;\n        case XK_BackSpace:      return GLFW_KEY_BACKSPACE;\n        case XK_Return:         return GLFW_KEY_ENTER;\n        case XK_Home:           return GLFW_KEY_HOME;\n        case XK_End:            return GLFW_KEY_END;\n        case XK_Page_Up:        return GLFW_KEY_PAGE_UP;\n        case XK_Page_Down:      return GLFW_KEY_PAGE_DOWN;\n        case XK_Insert:         return GLFW_KEY_INSERT;\n        case XK_Left:           return GLFW_KEY_LEFT;\n        case XK_Right:          return GLFW_KEY_RIGHT;\n        case XK_Down:           return GLFW_KEY_DOWN;\n        case XK_Up:             return GLFW_KEY_UP;\n        case XK_F1:             return GLFW_KEY_F1;\n        case XK_F2:             return GLFW_KEY_F2;\n        case XK_F3:             return GLFW_KEY_F3;\n        case XK_F4:             return GLFW_KEY_F4;\n        case XK_F5:             return GLFW_KEY_F5;\n        case XK_F6:             return GLFW_KEY_F6;\n        case XK_F7:             return GLFW_KEY_F7;\n        case XK_F8:             return GLFW_KEY_F8;\n        case XK_F9:             return GLFW_KEY_F9;\n        case XK_F10:            return GLFW_KEY_F10;\n        case XK_F11:            return GLFW_KEY_F11;\n        case XK_F12:            return GLFW_KEY_F12;\n        case XK_F13:            return GLFW_KEY_F13;\n        case XK_F14:            return GLFW_KEY_F14;\n        case XK_F15:            return GLFW_KEY_F15;\n        case XK_F16:            return GLFW_KEY_F16;\n        case XK_F17:            return GLFW_KEY_F17;\n        case XK_F18:            return GLFW_KEY_F18;\n        case XK_F19:            return GLFW_KEY_F19;\n        case XK_F20:            return GLFW_KEY_F20;\n        case XK_F21:            return GLFW_KEY_F21;\n        case XK_F22:            return GLFW_KEY_F22;\n        case XK_F23:            return GLFW_KEY_F23;\n        case XK_F24:            return GLFW_KEY_F24;\n        case XK_F25:            return GLFW_KEY_F25;\n\n        // Numeric keypad\n        case XK_KP_Divide:      return GLFW_KEY_KP_DIVIDE;\n        case XK_KP_Multiply:    return GLFW_KEY_KP_MULTIPLY;\n        case XK_KP_Subtract:    return GLFW_KEY_KP_SUBTRACT;\n        case XK_KP_Add:         return GLFW_KEY_KP_ADD;\n\n        // These should have been detected in secondary keysym test above!\n        case XK_KP_Insert:      return GLFW_KEY_KP_0;\n        case XK_KP_End:         return GLFW_KEY_KP_1;\n        case XK_KP_Down:        return GLFW_KEY_KP_2;\n        case XK_KP_Page_Down:   return GLFW_KEY_KP_3;\n        case XK_KP_Left:        return GLFW_KEY_KP_4;\n        case XK_KP_Right:       return GLFW_KEY_KP_6;\n        case XK_KP_Home:        return GLFW_KEY_KP_7;\n        case XK_KP_Up:          return GLFW_KEY_KP_8;\n        case XK_KP_Page_Up:     return GLFW_KEY_KP_9;\n        case XK_KP_Delete:      return GLFW_KEY_KP_DECIMAL;\n        case XK_KP_Equal:       return GLFW_KEY_KP_EQUAL;\n        case XK_KP_Enter:       return GLFW_KEY_KP_ENTER;\n\n        // Last resort: Check for printable keys (should not happen if the XKB\n        // extension is available). This will give a layout dependent mapping\n        // (which is wrong, and we may miss some keys, especially on non-US\n        // keyboards), but it's better than nothing...\n        case XK_a:              return GLFW_KEY_A;\n        case XK_b:              return GLFW_KEY_B;\n        case XK_c:              return GLFW_KEY_C;\n        case XK_d:              return GLFW_KEY_D;\n        case XK_e:              return GLFW_KEY_E;\n        case XK_f:              return GLFW_KEY_F;\n        case XK_g:              return GLFW_KEY_G;\n        case XK_h:              return GLFW_KEY_H;\n        case XK_i:              return GLFW_KEY_I;\n        case XK_j:              return GLFW_KEY_J;\n        case XK_k:              return GLFW_KEY_K;\n        case XK_l:              return GLFW_KEY_L;\n        case XK_m:              return GLFW_KEY_M;\n        case XK_n:              return GLFW_KEY_N;\n        case XK_o:              return GLFW_KEY_O;\n        case XK_p:              return GLFW_KEY_P;\n        case XK_q:              return GLFW_KEY_Q;\n        case XK_r:              return GLFW_KEY_R;\n        case XK_s:              return GLFW_KEY_S;\n        case XK_t:              return GLFW_KEY_T;\n        case XK_u:              return GLFW_KEY_U;\n        case XK_v:              return GLFW_KEY_V;\n        case XK_w:              return GLFW_KEY_W;\n        case XK_x:              return GLFW_KEY_X;\n        case XK_y:              return GLFW_KEY_Y;\n        case XK_z:              return GLFW_KEY_Z;\n        case XK_1:              return GLFW_KEY_1;\n        case XK_2:              return GLFW_KEY_2;\n        case XK_3:              return GLFW_KEY_3;\n        case XK_4:              return GLFW_KEY_4;\n        case XK_5:              return GLFW_KEY_5;\n        case XK_6:              return GLFW_KEY_6;\n        case XK_7:              return GLFW_KEY_7;\n        case XK_8:              return GLFW_KEY_8;\n        case XK_9:              return GLFW_KEY_9;\n        case XK_0:              return GLFW_KEY_0;\n        case XK_space:          return GLFW_KEY_SPACE;\n        case XK_minus:          return GLFW_KEY_MINUS;\n        case XK_equal:          return GLFW_KEY_EQUAL;\n        case XK_bracketleft:    return GLFW_KEY_LEFT_BRACKET;\n        case XK_bracketright:   return GLFW_KEY_RIGHT_BRACKET;\n        case XK_backslash:      return GLFW_KEY_BACKSLASH;\n        case XK_semicolon:      return GLFW_KEY_SEMICOLON;\n        case XK_apostrophe:     return GLFW_KEY_APOSTROPHE;\n        case XK_grave:          return GLFW_KEY_GRAVE_ACCENT;\n        case XK_comma:          return GLFW_KEY_COMMA;\n        case XK_period:         return GLFW_KEY_PERIOD;\n        case XK_slash:          return GLFW_KEY_SLASH;\n        case XK_less:           return GLFW_KEY_WORLD_1; // At least in some layouts...\n        default:                break;\n    }\n\n    // No matching translation was found\n    return GLFW_KEY_UNKNOWN;\n}\n\n// Create key code translation tables\n//\nstatic void createKeyTables(void)\n{\n    int scancode, key;\n\n    memset(_glfw.x11.keycodes, -1, sizeof(_glfw.x11.keycodes));\n    memset(_glfw.x11.scancodes, -1, sizeof(_glfw.x11.scancodes));\n\n    if (_glfw.x11.xkb.available)\n    {\n        // Use XKB to determine physical key locations independently of the\n        // current keyboard layout\n\n        char name[XkbKeyNameLength + 1];\n        XkbDescPtr desc = XkbGetMap(_glfw.x11.display, 0, XkbUseCoreKbd);\n        XkbGetNames(_glfw.x11.display, XkbKeyNamesMask, desc);\n\n        // Find the X11 key code -> GLFW key code mapping\n        for (scancode = desc->min_key_code;  scancode <= desc->max_key_code;  scancode++)\n        {\n            memcpy(name, desc->names->keys[scancode].name, XkbKeyNameLength);\n            name[XkbKeyNameLength] = '\\0';\n\n            // Map the key name to a GLFW key code. Note: We only map printable\n            // keys here, and we use the US keyboard layout. The rest of the\n            // keys (function keys) are mapped using traditional KeySym\n            // translations.\n            if (strcmp(name, \"TLDE\") == 0) key = GLFW_KEY_GRAVE_ACCENT;\n            else if (strcmp(name, \"AE01\") == 0) key = GLFW_KEY_1;\n            else if (strcmp(name, \"AE02\") == 0) key = GLFW_KEY_2;\n            else if (strcmp(name, \"AE03\") == 0) key = GLFW_KEY_3;\n            else if (strcmp(name, \"AE04\") == 0) key = GLFW_KEY_4;\n            else if (strcmp(name, \"AE05\") == 0) key = GLFW_KEY_5;\n            else if (strcmp(name, \"AE06\") == 0) key = GLFW_KEY_6;\n            else if (strcmp(name, \"AE07\") == 0) key = GLFW_KEY_7;\n            else if (strcmp(name, \"AE08\") == 0) key = GLFW_KEY_8;\n            else if (strcmp(name, \"AE09\") == 0) key = GLFW_KEY_9;\n            else if (strcmp(name, \"AE10\") == 0) key = GLFW_KEY_0;\n            else if (strcmp(name, \"AE11\") == 0) key = GLFW_KEY_MINUS;\n            else if (strcmp(name, \"AE12\") == 0) key = GLFW_KEY_EQUAL;\n            else if (strcmp(name, \"AD01\") == 0) key = GLFW_KEY_Q;\n            else if (strcmp(name, \"AD02\") == 0) key = GLFW_KEY_W;\n            else if (strcmp(name, \"AD03\") == 0) key = GLFW_KEY_E;\n            else if (strcmp(name, \"AD04\") == 0) key = GLFW_KEY_R;\n            else if (strcmp(name, \"AD05\") == 0) key = GLFW_KEY_T;\n            else if (strcmp(name, \"AD06\") == 0) key = GLFW_KEY_Y;\n            else if (strcmp(name, \"AD07\") == 0) key = GLFW_KEY_U;\n            else if (strcmp(name, \"AD08\") == 0) key = GLFW_KEY_I;\n            else if (strcmp(name, \"AD09\") == 0) key = GLFW_KEY_O;\n            else if (strcmp(name, \"AD10\") == 0) key = GLFW_KEY_P;\n            else if (strcmp(name, \"AD11\") == 0) key = GLFW_KEY_LEFT_BRACKET;\n            else if (strcmp(name, \"AD12\") == 0) key = GLFW_KEY_RIGHT_BRACKET;\n            else if (strcmp(name, \"AC01\") == 0) key = GLFW_KEY_A;\n            else if (strcmp(name, \"AC02\") == 0) key = GLFW_KEY_S;\n            else if (strcmp(name, \"AC03\") == 0) key = GLFW_KEY_D;\n            else if (strcmp(name, \"AC04\") == 0) key = GLFW_KEY_F;\n            else if (strcmp(name, \"AC05\") == 0) key = GLFW_KEY_G;\n            else if (strcmp(name, \"AC06\") == 0) key = GLFW_KEY_H;\n            else if (strcmp(name, \"AC07\") == 0) key = GLFW_KEY_J;\n            else if (strcmp(name, \"AC08\") == 0) key = GLFW_KEY_K;\n            else if (strcmp(name, \"AC09\") == 0) key = GLFW_KEY_L;\n            else if (strcmp(name, \"AC10\") == 0) key = GLFW_KEY_SEMICOLON;\n            else if (strcmp(name, \"AC11\") == 0) key = GLFW_KEY_APOSTROPHE;\n            else if (strcmp(name, \"AB01\") == 0) key = GLFW_KEY_Z;\n            else if (strcmp(name, \"AB02\") == 0) key = GLFW_KEY_X;\n            else if (strcmp(name, \"AB03\") == 0) key = GLFW_KEY_C;\n            else if (strcmp(name, \"AB04\") == 0) key = GLFW_KEY_V;\n            else if (strcmp(name, \"AB05\") == 0) key = GLFW_KEY_B;\n            else if (strcmp(name, \"AB06\") == 0) key = GLFW_KEY_N;\n            else if (strcmp(name, \"AB07\") == 0) key = GLFW_KEY_M;\n            else if (strcmp(name, \"AB08\") == 0) key = GLFW_KEY_COMMA;\n            else if (strcmp(name, \"AB09\") == 0) key = GLFW_KEY_PERIOD;\n            else if (strcmp(name, \"AB10\") == 0) key = GLFW_KEY_SLASH;\n            else if (strcmp(name, \"BKSL\") == 0) key = GLFW_KEY_BACKSLASH;\n            else if (strcmp(name, \"LSGT\") == 0) key = GLFW_KEY_WORLD_1;\n            else key = GLFW_KEY_UNKNOWN;\n\n            if ((scancode >= 0) && (scancode < 256))\n                _glfw.x11.keycodes[scancode] = key;\n        }\n\n        XkbFreeNames(desc, XkbKeyNamesMask, True);\n        XkbFreeKeyboard(desc, 0, True);\n    }\n\n    for (scancode = 0;  scancode < 256;  scancode++)\n    {\n        // Translate the un-translated key codes using traditional X11 KeySym\n        // lookups\n        if (_glfw.x11.keycodes[scancode] < 0)\n            _glfw.x11.keycodes[scancode] = translateKeyCode(scancode);\n\n        // Store the reverse translation for faster key name lookup\n        if (_glfw.x11.keycodes[scancode] > 0)\n            _glfw.x11.scancodes[_glfw.x11.keycodes[scancode]] = scancode;\n    }\n}\n\n// Check whether the IM has a usable style\n//\nstatic GLFWbool hasUsableInputMethodStyle(void)\n{\n    unsigned int i;\n    GLFWbool found = GLFW_FALSE;\n    XIMStyles* styles = NULL;\n\n    if (XGetIMValues(_glfw.x11.im, XNQueryInputStyle, &styles, NULL) != NULL)\n        return GLFW_FALSE;\n\n    for (i = 0;  i < styles->count_styles;  i++)\n    {\n        if (styles->supported_styles[i] == (XIMPreeditNothing | XIMStatusNothing))\n        {\n            found = GLFW_TRUE;\n            break;\n        }\n    }\n\n    XFree(styles);\n    return found;\n}\n\n// Check whether the specified atom is supported\n//\nstatic Atom getSupportedAtom(Atom* supportedAtoms,\n                             unsigned long atomCount,\n                             const char* atomName)\n{\n    unsigned long i;\n    const Atom atom = XInternAtom(_glfw.x11.display, atomName, False);\n\n    for (i = 0;  i < atomCount;  i++)\n    {\n        if (supportedAtoms[i] == atom)\n            return atom;\n    }\n\n    return None;\n}\n\n// Check whether the running window manager is EWMH-compliant\n//\nstatic void detectEWMH(void)\n{\n    Window* windowFromRoot = NULL;\n    Window* windowFromChild = NULL;\n\n    // First we need a couple of atoms\n    const Atom supportingWmCheck =\n        XInternAtom(_glfw.x11.display, \"_NET_SUPPORTING_WM_CHECK\", False);\n    const Atom wmSupported =\n        XInternAtom(_glfw.x11.display, \"_NET_SUPPORTED\", False);\n\n    // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window\n    if (!_glfwGetWindowPropertyX11(_glfw.x11.root,\n                                   supportingWmCheck,\n                                   XA_WINDOW,\n                                   (unsigned char**) &windowFromRoot))\n    {\n        return;\n    }\n\n    _glfwGrabErrorHandlerX11();\n\n    // It should be the ID of a child window (of the root)\n    // Then we look for the same property on the child window\n    if (!_glfwGetWindowPropertyX11(*windowFromRoot,\n                                   supportingWmCheck,\n                                   XA_WINDOW,\n                                   (unsigned char**) &windowFromChild))\n    {\n        XFree(windowFromRoot);\n        return;\n    }\n\n    _glfwReleaseErrorHandlerX11();\n\n    // It should be the ID of that same child window\n    if (*windowFromRoot != *windowFromChild)\n    {\n        XFree(windowFromRoot);\n        XFree(windowFromChild);\n        return;\n    }\n\n    XFree(windowFromRoot);\n    XFree(windowFromChild);\n\n    // We are now fairly sure that an EWMH-compliant window manager is running\n\n    Atom* supportedAtoms;\n    unsigned long atomCount;\n\n    // Now we need to check the _NET_SUPPORTED property of the root window\n    // It should be a list of supported WM protocol and state atoms\n    atomCount = _glfwGetWindowPropertyX11(_glfw.x11.root,\n                                          wmSupported,\n                                          XA_ATOM,\n                                          (unsigned char**) &supportedAtoms);\n\n    // See which of the atoms we support that are supported by the WM\n    _glfw.x11.NET_WM_STATE =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_STATE\");\n    _glfw.x11.NET_WM_STATE_ABOVE =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_STATE_ABOVE\");\n    _glfw.x11.NET_WM_STATE_FULLSCREEN =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_STATE_FULLSCREEN\");\n    _glfw.x11.NET_WM_STATE_MAXIMIZED_VERT =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_STATE_MAXIMIZED_VERT\");\n    _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_STATE_MAXIMIZED_HORZ\");\n    _glfw.x11.NET_WM_STATE_DEMANDS_ATTENTION =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_STATE_DEMANDS_ATTENTION\");\n    _glfw.x11.NET_WM_FULLSCREEN_MONITORS =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_FULLSCREEN_MONITORS\");\n    _glfw.x11.NET_WM_WINDOW_TYPE =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_WINDOW_TYPE\");\n    _glfw.x11.NET_WM_WINDOW_TYPE_NORMAL =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_WM_WINDOW_TYPE_NORMAL\");\n    _glfw.x11.NET_ACTIVE_WINDOW =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_ACTIVE_WINDOW\");\n    _glfw.x11.NET_FRAME_EXTENTS =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_FRAME_EXTENTS\");\n    _glfw.x11.NET_REQUEST_FRAME_EXTENTS =\n        getSupportedAtom(supportedAtoms, atomCount, \"_NET_REQUEST_FRAME_EXTENTS\");\n\n    if (supportedAtoms)\n        XFree(supportedAtoms);\n}\n\n// Look for and initialize supported X11 extensions\n//\nstatic GLFWbool initExtensions(void)\n{\n    _glfw.x11.vidmode.handle = dlopen(\"libXxf86vm.so.1\", RTLD_LAZY | RTLD_GLOBAL);\n    if (_glfw.x11.vidmode.handle)\n    {\n        _glfw.x11.vidmode.QueryExtension = (PFN_XF86VidModeQueryExtension)\n            dlsym(_glfw.x11.vidmode.handle, \"XF86VidModeQueryExtension\");\n        _glfw.x11.vidmode.GetGammaRamp = (PFN_XF86VidModeGetGammaRamp)\n            dlsym(_glfw.x11.vidmode.handle, \"XF86VidModeGetGammaRamp\");\n        _glfw.x11.vidmode.SetGammaRamp = (PFN_XF86VidModeSetGammaRamp)\n            dlsym(_glfw.x11.vidmode.handle, \"XF86VidModeSetGammaRamp\");\n        _glfw.x11.vidmode.GetGammaRampSize = (PFN_XF86VidModeGetGammaRampSize)\n            dlsym(_glfw.x11.vidmode.handle, \"XF86VidModeGetGammaRampSize\");\n\n        _glfw.x11.vidmode.available =\n            XF86VidModeQueryExtension(_glfw.x11.display,\n                                      &_glfw.x11.vidmode.eventBase,\n                                      &_glfw.x11.vidmode.errorBase);\n    }\n\n    _glfw.x11.xi.handle = dlopen(\"libXi.so.6\", RTLD_LAZY | RTLD_GLOBAL);\n    if (_glfw.x11.xi.handle)\n    {\n        _glfw.x11.xi.QueryVersion = (PFN_XIQueryVersion)\n            dlsym(_glfw.x11.xi.handle, \"XIQueryVersion\");\n        _glfw.x11.xi.SelectEvents = (PFN_XISelectEvents)\n            dlsym(_glfw.x11.xi.handle, \"XISelectEvents\");\n\n        if (XQueryExtension(_glfw.x11.display,\n                            \"XInputExtension\",\n                            &_glfw.x11.xi.majorOpcode,\n                            &_glfw.x11.xi.eventBase,\n                            &_glfw.x11.xi.errorBase))\n        {\n            _glfw.x11.xi.major = 2;\n            _glfw.x11.xi.minor = 0;\n\n            if (XIQueryVersion(_glfw.x11.display,\n                               &_glfw.x11.xi.major,\n                               &_glfw.x11.xi.minor) == Success)\n            {\n                _glfw.x11.xi.available = GLFW_TRUE;\n            }\n        }\n    }\n\n    _glfw.x11.randr.handle = dlopen(\"libXrandr.so.2\", RTLD_LAZY | RTLD_GLOBAL);\n    if (_glfw.x11.randr.handle)\n    {\n        _glfw.x11.randr.AllocGamma = (PFN_XRRAllocGamma)\n            dlsym(_glfw.x11.randr.handle, \"XRRAllocGamma\");\n        _glfw.x11.randr.FreeGamma = (PFN_XRRFreeGamma)\n            dlsym(_glfw.x11.randr.handle, \"XRRFreeGamma\");\n        _glfw.x11.randr.FreeCrtcInfo = (PFN_XRRFreeCrtcInfo)\n            dlsym(_glfw.x11.randr.handle, \"XRRFreeCrtcInfo\");\n        _glfw.x11.randr.FreeGamma = (PFN_XRRFreeGamma)\n            dlsym(_glfw.x11.randr.handle, \"XRRFreeGamma\");\n        _glfw.x11.randr.FreeOutputInfo = (PFN_XRRFreeOutputInfo)\n            dlsym(_glfw.x11.randr.handle, \"XRRFreeOutputInfo\");\n        _glfw.x11.randr.FreeScreenResources = (PFN_XRRFreeScreenResources)\n            dlsym(_glfw.x11.randr.handle, \"XRRFreeScreenResources\");\n        _glfw.x11.randr.GetCrtcGamma = (PFN_XRRGetCrtcGamma)\n            dlsym(_glfw.x11.randr.handle, \"XRRGetCrtcGamma\");\n        _glfw.x11.randr.GetCrtcGammaSize = (PFN_XRRGetCrtcGammaSize)\n            dlsym(_glfw.x11.randr.handle, \"XRRGetCrtcGammaSize\");\n        _glfw.x11.randr.GetCrtcInfo = (PFN_XRRGetCrtcInfo)\n            dlsym(_glfw.x11.randr.handle, \"XRRGetCrtcInfo\");\n        _glfw.x11.randr.GetOutputInfo = (PFN_XRRGetOutputInfo)\n            dlsym(_glfw.x11.randr.handle, \"XRRGetOutputInfo\");\n        _glfw.x11.randr.GetOutputPrimary = (PFN_XRRGetOutputPrimary)\n            dlsym(_glfw.x11.randr.handle, \"XRRGetOutputPrimary\");\n        _glfw.x11.randr.GetScreenResourcesCurrent = (PFN_XRRGetScreenResourcesCurrent)\n            dlsym(_glfw.x11.randr.handle, \"XRRGetScreenResourcesCurrent\");\n        _glfw.x11.randr.QueryExtension = (PFN_XRRQueryExtension)\n            dlsym(_glfw.x11.randr.handle, \"XRRQueryExtension\");\n        _glfw.x11.randr.QueryVersion = (PFN_XRRQueryVersion)\n            dlsym(_glfw.x11.randr.handle, \"XRRQueryVersion\");\n        _glfw.x11.randr.SelectInput = (PFN_XRRSelectInput)\n            dlsym(_glfw.x11.randr.handle, \"XRRSelectInput\");\n        _glfw.x11.randr.SetCrtcConfig = (PFN_XRRSetCrtcConfig)\n            dlsym(_glfw.x11.randr.handle, \"XRRSetCrtcConfig\");\n        _glfw.x11.randr.SetCrtcGamma = (PFN_XRRSetCrtcGamma)\n            dlsym(_glfw.x11.randr.handle, \"XRRSetCrtcGamma\");\n        _glfw.x11.randr.UpdateConfiguration = (PFN_XRRUpdateConfiguration)\n            dlsym(_glfw.x11.randr.handle, \"XRRUpdateConfiguration\");\n\n        if (XRRQueryExtension(_glfw.x11.display,\n                              &_glfw.x11.randr.eventBase,\n                              &_glfw.x11.randr.errorBase))\n        {\n            if (XRRQueryVersion(_glfw.x11.display,\n                                &_glfw.x11.randr.major,\n                                &_glfw.x11.randr.minor))\n            {\n                // The GLFW RandR path requires at least version 1.3\n                if (_glfw.x11.randr.major > 1 || _glfw.x11.randr.minor >= 3)\n                    _glfw.x11.randr.available = GLFW_TRUE;\n            }\n            else\n            {\n                _glfwInputError(GLFW_PLATFORM_ERROR,\n                                \"X11: Failed to query RandR version\");\n            }\n        }\n    }\n\n    if (_glfw.x11.randr.available)\n    {\n        XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display,\n                                                              _glfw.x11.root);\n\n        if (!sr->ncrtc || !XRRGetCrtcGammaSize(_glfw.x11.display, sr->crtcs[0]))\n        {\n            // This is likely an older Nvidia driver with broken gamma support\n            // Flag it as useless and fall back to xf86vm gamma, if available\n            _glfw.x11.randr.gammaBroken = GLFW_TRUE;\n        }\n\n        if (!sr->ncrtc)\n        {\n            // A system without CRTCs is likely a system with broken RandR\n            // Disable the RandR monitor path and fall back to core functions\n            _glfw.x11.randr.monitorBroken = GLFW_TRUE;\n        }\n\n        XRRFreeScreenResources(sr);\n    }\n\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken)\n    {\n        XRRSelectInput(_glfw.x11.display, _glfw.x11.root,\n                       RROutputChangeNotifyMask);\n    }\n\n    _glfw.x11.xcursor.handle = dlopen(\"libXcursor.so.1\", RTLD_LAZY | RTLD_GLOBAL);\n    if (_glfw.x11.xcursor.handle)\n    {\n        _glfw.x11.xcursor.ImageCreate = (PFN_XcursorImageCreate)\n            dlsym(_glfw.x11.xcursor.handle, \"XcursorImageCreate\");\n        _glfw.x11.xcursor.ImageDestroy = (PFN_XcursorImageDestroy)\n            dlsym(_glfw.x11.xcursor.handle, \"XcursorImageDestroy\");\n        _glfw.x11.xcursor.ImageLoadCursor = (PFN_XcursorImageLoadCursor)\n            dlsym(_glfw.x11.xcursor.handle, \"XcursorImageLoadCursor\");\n    }\n\n    _glfw.x11.xinerama.handle = dlopen(\"libXinerama.so.1\", RTLD_LAZY | RTLD_GLOBAL);\n    if (_glfw.x11.xinerama.handle)\n    {\n        _glfw.x11.xinerama.IsActive = (PFN_XineramaIsActive)\n            dlsym(_glfw.x11.xinerama.handle, \"XineramaIsActive\");\n        _glfw.x11.xinerama.QueryExtension = (PFN_XineramaQueryExtension)\n            dlsym(_glfw.x11.xinerama.handle, \"XineramaQueryExtension\");\n        _glfw.x11.xinerama.QueryScreens = (PFN_XineramaQueryScreens)\n            dlsym(_glfw.x11.xinerama.handle, \"XineramaQueryScreens\");\n\n        if (XineramaQueryExtension(_glfw.x11.display,\n                                   &_glfw.x11.xinerama.major,\n                                   &_glfw.x11.xinerama.minor))\n        {\n            if (XineramaIsActive(_glfw.x11.display))\n                _glfw.x11.xinerama.available = GLFW_TRUE;\n        }\n    }\n\n    _glfw.x11.xkb.major = 1;\n    _glfw.x11.xkb.minor = 0;\n    _glfw.x11.xkb.available =\n        XkbQueryExtension(_glfw.x11.display,\n                          &_glfw.x11.xkb.majorOpcode,\n                          &_glfw.x11.xkb.eventBase,\n                          &_glfw.x11.xkb.errorBase,\n                          &_glfw.x11.xkb.major,\n                          &_glfw.x11.xkb.minor);\n\n    if (_glfw.x11.xkb.available)\n    {\n        Bool supported;\n\n        if (XkbSetDetectableAutoRepeat(_glfw.x11.display, True, &supported))\n        {\n            if (supported)\n                _glfw.x11.xkb.detectable = GLFW_TRUE;\n        }\n    }\n\n    _glfw.x11.x11xcb.handle = dlopen(\"libX11-xcb.so.1\", RTLD_LAZY | RTLD_GLOBAL);\n    if (_glfw.x11.x11xcb.handle)\n    {\n        _glfw.x11.x11xcb.GetXCBConnection = (PFN_XGetXCBConnection)\n            dlsym(_glfw.x11.x11xcb.handle, \"XGetXCBConnection\");\n    }\n\n    _glfw.x11.xrender.handle = dlopen(\"libXrender.so.1\", RTLD_LAZY | RTLD_GLOBAL);\n    if (_glfw.x11.xrender.handle)\n    {\n        _glfw.x11.xrender.QueryExtension = (PFN_XRenderQueryExtension)\n            dlsym(_glfw.x11.xrender.handle, \"XRenderQueryExtension\");\n        _glfw.x11.xrender.QueryVersion = (PFN_XRenderQueryVersion)\n            dlsym(_glfw.x11.xrender.handle, \"XRenderQueryVersion\");\n        _glfw.x11.xrender.FindVisualFormat = (PFN_XRenderFindVisualFormat)\n            dlsym(_glfw.x11.xrender.handle, \"XRenderFindVisualFormat\");\n\n        if (XRenderQueryExtension(_glfw.x11.display,\n                                  &_glfw.x11.xrender.errorBase,\n                                  &_glfw.x11.xrender.eventBase))\n        {\n            if (XRenderQueryVersion(_glfw.x11.display,\n                                    &_glfw.x11.xrender.major,\n                                    &_glfw.x11.xrender.minor))\n            {\n                _glfw.x11.xrender.available = GLFW_TRUE;\n            }\n        }\n    }\n\n    // Update the key code LUT\n    // FIXME: We should listen to XkbMapNotify events to track changes to\n    // the keyboard mapping.\n    createKeyTables();\n\n    // Detect whether an EWMH-conformant window manager is running\n    detectEWMH();\n\n    // String format atoms\n    _glfw.x11.NULL_ = XInternAtom(_glfw.x11.display, \"NULL\", False);\n    _glfw.x11.UTF8_STRING = XInternAtom(_glfw.x11.display, \"UTF8_STRING\", False);\n    _glfw.x11.ATOM_PAIR = XInternAtom(_glfw.x11.display, \"ATOM_PAIR\", False);\n\n    // Custom selection property atom\n    _glfw.x11.GLFW_SELECTION =\n        XInternAtom(_glfw.x11.display, \"GLFW_SELECTION\", False);\n\n    // ICCCM standard clipboard atoms\n    _glfw.x11.TARGETS = XInternAtom(_glfw.x11.display, \"TARGETS\", False);\n    _glfw.x11.MULTIPLE = XInternAtom(_glfw.x11.display, \"MULTIPLE\", False);\n    _glfw.x11.PRIMARY = XInternAtom(_glfw.x11.display, \"PRIMARY\", False);\n    _glfw.x11.INCR = XInternAtom(_glfw.x11.display, \"INCR\", False);\n    _glfw.x11.CLIPBOARD = XInternAtom(_glfw.x11.display, \"CLIPBOARD\", False);\n\n    // Clipboard manager atoms\n    _glfw.x11.CLIPBOARD_MANAGER =\n        XInternAtom(_glfw.x11.display, \"CLIPBOARD_MANAGER\", False);\n    _glfw.x11.SAVE_TARGETS =\n        XInternAtom(_glfw.x11.display, \"SAVE_TARGETS\", False);\n\n    // Xdnd (drag and drop) atoms\n    _glfw.x11.XdndAware = XInternAtom(_glfw.x11.display, \"XdndAware\", False);\n    _glfw.x11.XdndEnter = XInternAtom(_glfw.x11.display, \"XdndEnter\", False);\n    _glfw.x11.XdndPosition = XInternAtom(_glfw.x11.display, \"XdndPosition\", False);\n    _glfw.x11.XdndStatus = XInternAtom(_glfw.x11.display, \"XdndStatus\", False);\n    _glfw.x11.XdndActionCopy = XInternAtom(_glfw.x11.display, \"XdndActionCopy\", False);\n    _glfw.x11.XdndDrop = XInternAtom(_glfw.x11.display, \"XdndDrop\", False);\n    _glfw.x11.XdndFinished = XInternAtom(_glfw.x11.display, \"XdndFinished\", False);\n    _glfw.x11.XdndSelection = XInternAtom(_glfw.x11.display, \"XdndSelection\", False);\n    _glfw.x11.XdndTypeList = XInternAtom(_glfw.x11.display, \"XdndTypeList\", False);\n    _glfw.x11.text_uri_list = XInternAtom(_glfw.x11.display, \"text/uri-list\", False);\n\n    // ICCCM, EWMH and Motif window property atoms\n    // These can be set safely even without WM support\n    // The EWMH atoms that require WM support are handled in detectEWMH\n    _glfw.x11.WM_PROTOCOLS =\n        XInternAtom(_glfw.x11.display, \"WM_PROTOCOLS\", False);\n    _glfw.x11.WM_STATE =\n        XInternAtom(_glfw.x11.display, \"WM_STATE\", False);\n    _glfw.x11.WM_DELETE_WINDOW =\n        XInternAtom(_glfw.x11.display, \"WM_DELETE_WINDOW\", False);\n    _glfw.x11.NET_WM_ICON =\n        XInternAtom(_glfw.x11.display, \"_NET_WM_ICON\", False);\n    _glfw.x11.NET_WM_PING =\n        XInternAtom(_glfw.x11.display, \"_NET_WM_PING\", False);\n    _glfw.x11.NET_WM_PID =\n        XInternAtom(_glfw.x11.display, \"_NET_WM_PID\", False);\n    _glfw.x11.NET_WM_NAME =\n        XInternAtom(_glfw.x11.display, \"_NET_WM_NAME\", False);\n    _glfw.x11.NET_WM_ICON_NAME =\n        XInternAtom(_glfw.x11.display, \"_NET_WM_ICON_NAME\", False);\n    _glfw.x11.NET_WM_BYPASS_COMPOSITOR =\n        XInternAtom(_glfw.x11.display, \"_NET_WM_BYPASS_COMPOSITOR\", False);\n    _glfw.x11.MOTIF_WM_HINTS =\n        XInternAtom(_glfw.x11.display, \"_MOTIF_WM_HINTS\", False);\n\n    return GLFW_TRUE;\n}\n\n// Create a blank cursor for hidden and disabled cursor modes\n//\nstatic Cursor createHiddenCursor(void)\n{\n    unsigned char pixels[16 * 16 * 4] = { 0 };\n    GLFWimage image = { 16, 16, pixels };\n    return _glfwCreateCursorX11(&image, 0, 0);\n}\n\n// Create a helper window for IPC\n//\nstatic Window createHelperWindow(void)\n{\n    XSetWindowAttributes wa;\n    wa.event_mask = PropertyChangeMask;\n\n    return XCreateWindow(_glfw.x11.display, _glfw.x11.root,\n                         0, 0, 1, 1, 0, 0,\n                         InputOnly,\n                         DefaultVisual(_glfw.x11.display, _glfw.x11.screen),\n                         CWEventMask, &wa);\n}\n\n// X error handler\n//\nstatic int errorHandler(Display *display, XErrorEvent* event)\n{\n    _glfw.x11.errorCode = event->error_code;\n    return 0;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Sets the X error handler callback\n//\nvoid _glfwGrabErrorHandlerX11(void)\n{\n    _glfw.x11.errorCode = Success;\n    XSetErrorHandler(errorHandler);\n}\n\n// Clears the X error handler callback\n//\nvoid _glfwReleaseErrorHandlerX11(void)\n{\n    // Synchronize to make sure all commands are processed\n    XSync(_glfw.x11.display, False);\n    XSetErrorHandler(NULL);\n}\n\n// Reports the specified error, appending information about the last X error\n//\nvoid _glfwInputErrorX11(int error, const char* message)\n{\n    char buffer[_GLFW_MESSAGE_SIZE];\n    XGetErrorText(_glfw.x11.display, _glfw.x11.errorCode,\n                  buffer, sizeof(buffer));\n\n    _glfwInputError(error, \"%s: %s\", message, buffer);\n}\n\n// Creates a native cursor object from the specified image and hotspot\n//\nCursor _glfwCreateCursorX11(const GLFWimage* image, int xhot, int yhot)\n{\n    int i;\n    Cursor cursor;\n\n    if (!_glfw.x11.xcursor.handle)\n        return None;\n\n    XcursorImage* native = XcursorImageCreate(image->width, image->height);\n    if (native == NULL)\n        return None;\n\n    native->xhot = xhot;\n    native->yhot = yhot;\n\n    unsigned char* source = (unsigned char*) image->pixels;\n    XcursorPixel* target = native->pixels;\n\n    for (i = 0;  i < image->width * image->height;  i++, target++, source += 4)\n    {\n        unsigned int alpha = source[3];\n\n        *target = (alpha << 24) |\n                  ((unsigned char) ((source[0] * alpha) / 255) << 16) |\n                  ((unsigned char) ((source[1] * alpha) / 255) <<  8) |\n                  ((unsigned char) ((source[2] * alpha) / 255) <<  0);\n    }\n\n    cursor = XcursorImageLoadCursor(_glfw.x11.display, native);\n    XcursorImageDestroy(native);\n\n    return cursor;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformInit(void)\n{\n#if !defined(X_HAVE_UTF8_STRING)\n    // HACK: If the current locale is \"C\" and the Xlib UTF-8 functions are\n    //       unavailable, apply the environment's locale in the hope that it's\n    //       both available and not \"C\"\n    //       This is done because the \"C\" locale breaks wide character input,\n    //       which is what we fall back on when UTF-8 support is missing\n    if (strcmp(setlocale(LC_CTYPE, NULL), \"C\") == 0)\n        setlocale(LC_CTYPE, \"\");\n#endif\n\n    XInitThreads();\n\n    _glfw.x11.display = XOpenDisplay(NULL);\n    if (!_glfw.x11.display)\n    {\n        const char* display = getenv(\"DISPLAY\");\n        if (display)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"X11: Failed to open display %s\", display);\n        }\n        else\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"X11: The DISPLAY environment variable is missing\");\n        }\n\n        return GLFW_FALSE;\n    }\n\n    _glfw.x11.screen = DefaultScreen(_glfw.x11.display);\n    _glfw.x11.root = RootWindow(_glfw.x11.display, _glfw.x11.screen);\n    _glfw.x11.context = XUniqueContext();\n\n    if (!initExtensions())\n        return GLFW_FALSE;\n\n    _glfw.x11.helperWindowHandle = createHelperWindow();\n    _glfw.x11.hiddenCursorHandle = createHiddenCursor();\n\n    if (XSupportsLocale())\n    {\n        XSetLocaleModifiers(\"\");\n\n        _glfw.x11.im = XOpenIM(_glfw.x11.display, 0, NULL, NULL);\n        if (_glfw.x11.im)\n        {\n            if (!hasUsableInputMethodStyle())\n            {\n                XCloseIM(_glfw.x11.im);\n                _glfw.x11.im = NULL;\n            }\n        }\n    }\n\n#if defined(__linux__)\n    if (!_glfwInitJoysticksLinux())\n        return GLFW_FALSE;\n#endif\n\n    _glfwInitTimerPOSIX();\n\n    _glfwPollMonitorsX11();\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformTerminate(void)\n{\n    if (_glfw.x11.helperWindowHandle)\n    {\n        if (XGetSelectionOwner(_glfw.x11.display, _glfw.x11.CLIPBOARD) ==\n            _glfw.x11.helperWindowHandle)\n        {\n            _glfwPushSelectionToManagerX11();\n        }\n\n        XDestroyWindow(_glfw.x11.display, _glfw.x11.helperWindowHandle);\n        _glfw.x11.helperWindowHandle = None;\n    }\n\n    if (_glfw.x11.hiddenCursorHandle)\n    {\n        XFreeCursor(_glfw.x11.display, _glfw.x11.hiddenCursorHandle);\n        _glfw.x11.hiddenCursorHandle = (Cursor) 0;\n    }\n\n    free(_glfw.x11.primarySelectionString);\n    free(_glfw.x11.clipboardString);\n\n    if (_glfw.x11.im)\n    {\n        XCloseIM(_glfw.x11.im);\n        _glfw.x11.im = NULL;\n    }\n\n    _glfwTerminateEGL();\n\n    if (_glfw.x11.display)\n    {\n        XCloseDisplay(_glfw.x11.display);\n        _glfw.x11.display = NULL;\n    }\n\n    if (_glfw.x11.x11xcb.handle)\n    {\n        dlclose(_glfw.x11.x11xcb.handle);\n        _glfw.x11.x11xcb.handle = NULL;\n    }\n\n    if (_glfw.x11.xcursor.handle)\n    {\n        dlclose(_glfw.x11.xcursor.handle);\n        _glfw.x11.xcursor.handle = NULL;\n    }\n\n    if (_glfw.x11.randr.handle)\n    {\n        dlclose(_glfw.x11.randr.handle);\n        _glfw.x11.randr.handle = NULL;\n    }\n\n    if (_glfw.x11.xinerama.handle)\n    {\n        dlclose(_glfw.x11.xinerama.handle);\n        _glfw.x11.xinerama.handle = NULL;\n    }\n\n    // NOTE: This needs to be done after XCloseDisplay, as libGL registers\n    //       cleanup callbacks that get called by it\n    _glfwTerminateGLX();\n\n#if defined(__linux__)\n    _glfwTerminateJoysticksLinux();\n#endif\n}\n\nconst char* _glfwPlatformGetVersionString(void)\n{\n    return _GLFW_VERSION_NUMBER \" X11 GLX EGL\"\n#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)\n        \" clock_gettime\"\n#else\n        \" gettimeofday\"\n#endif\n#if defined(__linux__)\n        \" evdev\"\n#endif\n#if defined(_GLFW_BUILD_DLL)\n        \" shared\"\n#endif\n        ;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/x11_monitor.c",
    "content": "//========================================================================\n// GLFW 3.3 X11 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <limits.h>\n#include <stdlib.h>\n#include <string.h>\n\n\n// Check whether the display mode should be included in enumeration\n//\nstatic GLFWbool modeIsGood(const XRRModeInfo* mi)\n{\n    return (mi->modeFlags & RR_Interlace) == 0;\n}\n\n// Calculates the refresh rate, in Hz, from the specified RandR mode info\n//\nstatic int calculateRefreshRate(const XRRModeInfo* mi)\n{\n    if (mi->hTotal && mi->vTotal)\n        return (int) ((double) mi->dotClock / ((double) mi->hTotal * (double) mi->vTotal));\n    else\n        return 0;\n}\n\n// Returns the mode info for a RandR mode XID\n//\nstatic const XRRModeInfo* getModeInfo(const XRRScreenResources* sr, RRMode id)\n{\n    int i;\n\n    for (i = 0;  i < sr->nmode;  i++)\n    {\n        if (sr->modes[i].id == id)\n            return sr->modes + i;\n    }\n\n    return NULL;\n}\n\n// Convert RandR mode info to GLFW video mode\n//\nstatic GLFWvidmode vidmodeFromModeInfo(const XRRModeInfo* mi,\n                                       const XRRCrtcInfo* ci)\n{\n    GLFWvidmode mode;\n\n    if (ci->rotation == RR_Rotate_90 || ci->rotation == RR_Rotate_270)\n    {\n        mode.width  = mi->height;\n        mode.height = mi->width;\n    }\n    else\n    {\n        mode.width  = mi->width;\n        mode.height = mi->height;\n    }\n\n    mode.refreshRate = calculateRefreshRate(mi);\n\n    _glfwSplitBPP(DefaultDepth(_glfw.x11.display, _glfw.x11.screen),\n                  &mode.redBits, &mode.greenBits, &mode.blueBits);\n\n    return mode;\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Poll for changes in the set of connected monitors\n//\nvoid _glfwPollMonitorsX11(void)\n{\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken)\n    {\n        int i, j, disconnectedCount, screenCount = 0;\n        _GLFWmonitor** disconnected = NULL;\n        XineramaScreenInfo* screens = NULL;\n        XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display,\n                                                              _glfw.x11.root);\n        RROutput primary = XRRGetOutputPrimary(_glfw.x11.display,\n                                               _glfw.x11.root);\n\n        if (_glfw.x11.xinerama.available)\n            screens = XineramaQueryScreens(_glfw.x11.display, &screenCount);\n\n        disconnectedCount = _glfw.monitorCount;\n        if (disconnectedCount)\n        {\n            disconnected = calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*));\n            memcpy(disconnected,\n                   _glfw.monitors,\n                   _glfw.monitorCount * sizeof(_GLFWmonitor*));\n        }\n\n        for (i = 0;  i < sr->noutput;  i++)\n        {\n            int type, widthMM, heightMM;\n            XRROutputInfo* oi;\n            XRRCrtcInfo* ci;\n            _GLFWmonitor* monitor;\n\n            oi = XRRGetOutputInfo(_glfw.x11.display, sr, sr->outputs[i]);\n            if (oi->connection != RR_Connected || oi->crtc == None)\n            {\n                XRRFreeOutputInfo(oi);\n                continue;\n            }\n\n            for (j = 0;  j < disconnectedCount;  j++)\n            {\n                if (disconnected[j] &&\n                    disconnected[j]->x11.output == sr->outputs[i])\n                {\n                    disconnected[j] = NULL;\n                    break;\n                }\n            }\n\n            if (j < disconnectedCount)\n            {\n                XRRFreeOutputInfo(oi);\n                continue;\n            }\n\n            ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc);\n            if (ci->rotation == RR_Rotate_90 || ci->rotation == RR_Rotate_270)\n            {\n                widthMM  = oi->mm_height;\n                heightMM = oi->mm_width;\n            }\n            else\n            {\n                widthMM  = oi->mm_width;\n                heightMM = oi->mm_height;\n            }\n\n            monitor = _glfwAllocMonitor(oi->name, widthMM, heightMM);\n            monitor->x11.output = sr->outputs[i];\n            monitor->x11.crtc   = oi->crtc;\n\n            for (j = 0;  j < screenCount;  j++)\n            {\n                if (screens[j].x_org == ci->x &&\n                    screens[j].y_org == ci->y &&\n                    screens[j].width == ci->width &&\n                    screens[j].height == ci->height)\n                {\n                    monitor->x11.index = j;\n                    break;\n                }\n            }\n\n            if (monitor->x11.output == primary)\n                type = _GLFW_INSERT_FIRST;\n            else\n                type = _GLFW_INSERT_LAST;\n\n            _glfwInputMonitor(monitor, GLFW_CONNECTED, type);\n\n            XRRFreeOutputInfo(oi);\n            XRRFreeCrtcInfo(ci);\n        }\n\n        XRRFreeScreenResources(sr);\n\n        if (screens)\n            XFree(screens);\n\n        for (i = 0;  i < disconnectedCount;  i++)\n        {\n            if (disconnected[i])\n                _glfwInputMonitor(disconnected[i], GLFW_DISCONNECTED, 0);\n        }\n\n        free(disconnected);\n    }\n\n    if (!_glfw.monitorCount)\n    {\n        const int widthMM = DisplayWidthMM(_glfw.x11.display, _glfw.x11.screen);\n        const int heightMM = DisplayHeightMM(_glfw.x11.display, _glfw.x11.screen);\n\n        _glfwInputMonitor(_glfwAllocMonitor(\"Display\", widthMM, heightMM),\n                          GLFW_CONNECTED,\n                          _GLFW_INSERT_FIRST);\n    }\n}\n\n// Set the current video mode for the specified monitor\n//\nGLFWbool _glfwSetVideoModeX11(_GLFWmonitor* monitor, const GLFWvidmode* desired)\n{\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken)\n    {\n        XRRScreenResources* sr;\n        XRRCrtcInfo* ci;\n        XRROutputInfo* oi;\n        GLFWvidmode current;\n        const GLFWvidmode* best;\n        RRMode native = None;\n        int i;\n\n        best = _glfwChooseVideoMode(monitor, desired);\n        _glfwPlatformGetVideoMode(monitor, &current);\n        if (_glfwCompareVideoModes(&current, best) == 0)\n            return GLFW_TRUE;\n\n        sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root);\n        ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc);\n        oi = XRRGetOutputInfo(_glfw.x11.display, sr, monitor->x11.output);\n\n        for (i = 0;  i < oi->nmode;  i++)\n        {\n            const XRRModeInfo* mi = getModeInfo(sr, oi->modes[i]);\n            if (!modeIsGood(mi))\n                continue;\n\n            const GLFWvidmode mode = vidmodeFromModeInfo(mi, ci);\n            if (_glfwCompareVideoModes(best, &mode) == 0)\n            {\n                native = mi->id;\n                break;\n            }\n        }\n\n        if (native)\n        {\n            if (monitor->x11.oldMode == None)\n                monitor->x11.oldMode = ci->mode;\n\n            XRRSetCrtcConfig(_glfw.x11.display,\n                             sr, monitor->x11.crtc,\n                             CurrentTime,\n                             ci->x, ci->y,\n                             native,\n                             ci->rotation,\n                             ci->outputs,\n                             ci->noutput);\n        }\n\n        XRRFreeOutputInfo(oi);\n        XRRFreeCrtcInfo(ci);\n        XRRFreeScreenResources(sr);\n\n        if (!native)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"X11: Monitor mode list changed\");\n            return GLFW_FALSE;\n        }\n    }\n\n    return GLFW_TRUE;\n}\n\n// Restore the saved (original) video mode for the specified monitor\n//\nvoid _glfwRestoreVideoModeX11(_GLFWmonitor* monitor)\n{\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken)\n    {\n        XRRScreenResources* sr;\n        XRRCrtcInfo* ci;\n\n        if (monitor->x11.oldMode == None)\n            return;\n\n        sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root);\n        ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc);\n\n        XRRSetCrtcConfig(_glfw.x11.display,\n                         sr, monitor->x11.crtc,\n                         CurrentTime,\n                         ci->x, ci->y,\n                         monitor->x11.oldMode,\n                         ci->rotation,\n                         ci->outputs,\n                         ci->noutput);\n\n        XRRFreeCrtcInfo(ci);\n        XRRFreeScreenResources(sr);\n\n        monitor->x11.oldMode = None;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nvoid _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)\n{\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken)\n    {\n        XRRScreenResources* sr;\n        XRRCrtcInfo* ci;\n\n        sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root);\n        ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc);\n\n        if (xpos)\n            *xpos = ci->x;\n        if (ypos)\n            *ypos = ci->y;\n\n        XRRFreeCrtcInfo(ci);\n        XRRFreeScreenResources(sr);\n    }\n}\n\nGLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count)\n{\n    GLFWvidmode* result;\n\n    *count = 0;\n\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken)\n    {\n        int i, j;\n        XRRScreenResources* sr;\n        XRRCrtcInfo* ci;\n        XRROutputInfo* oi;\n\n        sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root);\n        ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc);\n        oi = XRRGetOutputInfo(_glfw.x11.display, sr, monitor->x11.output);\n\n        result = calloc(oi->nmode, sizeof(GLFWvidmode));\n\n        for (i = 0;  i < oi->nmode;  i++)\n        {\n            const XRRModeInfo* mi = getModeInfo(sr, oi->modes[i]);\n            if (!modeIsGood(mi))\n                continue;\n\n            const GLFWvidmode mode = vidmodeFromModeInfo(mi, ci);\n\n            for (j = 0;  j < *count;  j++)\n            {\n                if (_glfwCompareVideoModes(result + j, &mode) == 0)\n                    break;\n            }\n\n            // Skip duplicate modes\n            if (j < *count)\n                continue;\n\n            (*count)++;\n            result[*count - 1] = mode;\n        }\n\n        XRRFreeOutputInfo(oi);\n        XRRFreeCrtcInfo(ci);\n        XRRFreeScreenResources(sr);\n    }\n    else\n    {\n        *count = 1;\n        result = calloc(1, sizeof(GLFWvidmode));\n        _glfwPlatformGetVideoMode(monitor, result);\n    }\n\n    return result;\n}\n\nvoid _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)\n{\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken)\n    {\n        XRRScreenResources* sr;\n        XRRCrtcInfo* ci;\n\n        sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root);\n        ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc);\n\n        *mode = vidmodeFromModeInfo(getModeInfo(sr, ci->mode), ci);\n\n        XRRFreeCrtcInfo(ci);\n        XRRFreeScreenResources(sr);\n    }\n    else\n    {\n        mode->width = DisplayWidth(_glfw.x11.display, _glfw.x11.screen);\n        mode->height = DisplayHeight(_glfw.x11.display, _glfw.x11.screen);\n        mode->refreshRate = 0;\n\n        _glfwSplitBPP(DefaultDepth(_glfw.x11.display, _glfw.x11.screen),\n                      &mode->redBits, &mode->greenBits, &mode->blueBits);\n    }\n}\n\nvoid _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)\n{\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.gammaBroken)\n    {\n        const size_t size = XRRGetCrtcGammaSize(_glfw.x11.display,\n                                                monitor->x11.crtc);\n        XRRCrtcGamma* gamma = XRRGetCrtcGamma(_glfw.x11.display,\n                                              monitor->x11.crtc);\n\n        _glfwAllocGammaArrays(ramp, size);\n\n        memcpy(ramp->red,   gamma->red,   size * sizeof(unsigned short));\n        memcpy(ramp->green, gamma->green, size * sizeof(unsigned short));\n        memcpy(ramp->blue,  gamma->blue,  size * sizeof(unsigned short));\n\n        XRRFreeGamma(gamma);\n    }\n    else if (_glfw.x11.vidmode.available)\n    {\n        int size;\n        XF86VidModeGetGammaRampSize(_glfw.x11.display, _glfw.x11.screen, &size);\n\n        _glfwAllocGammaArrays(ramp, size);\n\n        XF86VidModeGetGammaRamp(_glfw.x11.display,\n                                _glfw.x11.screen,\n                                ramp->size, ramp->red, ramp->green, ramp->blue);\n    }\n}\n\nvoid _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)\n{\n    if (_glfw.x11.randr.available && !_glfw.x11.randr.gammaBroken)\n    {\n        if (XRRGetCrtcGammaSize(_glfw.x11.display, monitor->x11.crtc) != ramp->size)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"X11: Gamma ramp size must match current ramp size\");\n            return;\n        }\n\n        XRRCrtcGamma* gamma = XRRAllocGamma(ramp->size);\n\n        memcpy(gamma->red,   ramp->red,   ramp->size * sizeof(unsigned short));\n        memcpy(gamma->green, ramp->green, ramp->size * sizeof(unsigned short));\n        memcpy(gamma->blue,  ramp->blue,  ramp->size * sizeof(unsigned short));\n\n        XRRSetCrtcGamma(_glfw.x11.display, monitor->x11.crtc, gamma);\n        XRRFreeGamma(gamma);\n    }\n    else if (_glfw.x11.vidmode.available)\n    {\n        XF86VidModeSetGammaRamp(_glfw.x11.display,\n                                _glfw.x11.screen,\n                                ramp->size,\n                                (unsigned short*) ramp->red,\n                                (unsigned short*) ramp->green,\n                                (unsigned short*) ramp->blue);\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(None);\n    return monitor->x11.crtc;\n}\n\nGLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* handle)\n{\n    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(None);\n    return monitor->x11.output;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/x11_platform.h",
    "content": "//========================================================================\n// GLFW 3.3 X11 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include <unistd.h>\n#include <signal.h>\n#include <stdint.h>\n#include <dlfcn.h>\n\n#include <X11/Xlib.h>\n#include <X11/keysym.h>\n#include <X11/Xatom.h>\n#include <X11/Xcursor/Xcursor.h>\n\n// The XRandR extension provides mode setting and gamma control\n#include <X11/extensions/Xrandr.h>\n\n// The Xkb extension provides improved keyboard support\n#include <X11/XKBlib.h>\n\n// The Xinerama extension provides legacy monitor indices\n#include <X11/extensions/Xinerama.h>\n\n// The XInput extension provides raw mouse motion input\n#include <X11/extensions/XInput2.h>\n\ntypedef XRRCrtcGamma* (* PFN_XRRAllocGamma)(int);\ntypedef void (* PFN_XRRFreeCrtcInfo)(XRRCrtcInfo*);\ntypedef void (* PFN_XRRFreeGamma)(XRRCrtcGamma*);\ntypedef void (* PFN_XRRFreeOutputInfo)(XRROutputInfo*);\ntypedef void (* PFN_XRRFreeScreenResources)(XRRScreenResources*);\ntypedef XRRCrtcGamma* (* PFN_XRRGetCrtcGamma)(Display*,RRCrtc);\ntypedef int (* PFN_XRRGetCrtcGammaSize)(Display*,RRCrtc);\ntypedef XRRCrtcInfo* (* PFN_XRRGetCrtcInfo) (Display*,XRRScreenResources*,RRCrtc);\ntypedef XRROutputInfo* (* PFN_XRRGetOutputInfo)(Display*,XRRScreenResources*,RROutput);\ntypedef RROutput (* PFN_XRRGetOutputPrimary)(Display*,Window);\ntypedef XRRScreenResources* (* PFN_XRRGetScreenResourcesCurrent)(Display*,Window);\ntypedef Bool (* PFN_XRRQueryExtension)(Display*,int*,int*);\ntypedef Status (* PFN_XRRQueryVersion)(Display*,int*,int*);\ntypedef void (* PFN_XRRSelectInput)(Display*,Window,int);\ntypedef Status (* PFN_XRRSetCrtcConfig)(Display*,XRRScreenResources*,RRCrtc,Time,int,int,RRMode,Rotation,RROutput*,int);\ntypedef void (* PFN_XRRSetCrtcGamma)(Display*,RRCrtc,XRRCrtcGamma*);\ntypedef int (* PFN_XRRUpdateConfiguration)(XEvent*);\n#define XRRAllocGamma _glfw.x11.randr.AllocGamma\n#define XRRFreeCrtcInfo _glfw.x11.randr.FreeCrtcInfo\n#define XRRFreeGamma _glfw.x11.randr.FreeGamma\n#define XRRFreeOutputInfo _glfw.x11.randr.FreeOutputInfo\n#define XRRFreeScreenResources _glfw.x11.randr.FreeScreenResources\n#define XRRGetCrtcGamma _glfw.x11.randr.GetCrtcGamma\n#define XRRGetCrtcGammaSize _glfw.x11.randr.GetCrtcGammaSize\n#define XRRGetCrtcInfo _glfw.x11.randr.GetCrtcInfo\n#define XRRGetOutputInfo _glfw.x11.randr.GetOutputInfo\n#define XRRGetOutputPrimary _glfw.x11.randr.GetOutputPrimary\n#define XRRGetScreenResourcesCurrent _glfw.x11.randr.GetScreenResourcesCurrent\n#define XRRQueryExtension _glfw.x11.randr.QueryExtension\n#define XRRQueryVersion _glfw.x11.randr.QueryVersion\n#define XRRSelectInput _glfw.x11.randr.SelectInput\n#define XRRSetCrtcConfig _glfw.x11.randr.SetCrtcConfig\n#define XRRSetCrtcGamma _glfw.x11.randr.SetCrtcGamma\n#define XRRUpdateConfiguration _glfw.x11.randr.UpdateConfiguration\n\ntypedef XcursorImage* (* PFN_XcursorImageCreate)(int,int);\ntypedef void (* PFN_XcursorImageDestroy)(XcursorImage*);\ntypedef Cursor (* PFN_XcursorImageLoadCursor)(Display*,const XcursorImage*);\n#define XcursorImageCreate _glfw.x11.xcursor.ImageCreate\n#define XcursorImageDestroy _glfw.x11.xcursor.ImageDestroy\n#define XcursorImageLoadCursor _glfw.x11.xcursor.ImageLoadCursor\n\ntypedef Bool (* PFN_XineramaIsActive)(Display*);\ntypedef Bool (* PFN_XineramaQueryExtension)(Display*,int*,int*);\ntypedef XineramaScreenInfo* (* PFN_XineramaQueryScreens)(Display*,int*);\n#define XineramaIsActive _glfw.x11.xinerama.IsActive\n#define XineramaQueryExtension _glfw.x11.xinerama.QueryExtension\n#define XineramaQueryScreens _glfw.x11.xinerama.QueryScreens\n\ntypedef XID xcb_window_t;\ntypedef XID xcb_visualid_t;\ntypedef struct xcb_connection_t xcb_connection_t;\ntypedef xcb_connection_t* (* PFN_XGetXCBConnection)(Display*);\n#define XGetXCBConnection _glfw.x11.x11xcb.GetXCBConnection\n\ntypedef Bool (* PFN_XF86VidModeQueryExtension)(Display*,int*,int*);\ntypedef Bool (* PFN_XF86VidModeGetGammaRamp)(Display*,int,int,unsigned short*,unsigned short*,unsigned short*);\ntypedef Bool (* PFN_XF86VidModeSetGammaRamp)(Display*,int,int,unsigned short*,unsigned short*,unsigned short*);\ntypedef Bool (* PFN_XF86VidModeGetGammaRampSize)(Display*,int,int*);\n#define XF86VidModeQueryExtension _glfw.x11.vidmode.QueryExtension\n#define XF86VidModeGetGammaRamp _glfw.x11.vidmode.GetGammaRamp\n#define XF86VidModeSetGammaRamp _glfw.x11.vidmode.SetGammaRamp\n#define XF86VidModeGetGammaRampSize _glfw.x11.vidmode.GetGammaRampSize\n\ntypedef Status (* PFN_XIQueryVersion)(Display*,int*,int*);\ntypedef int (* PFN_XISelectEvents)(Display*,Window,XIEventMask*,int);\n#define XIQueryVersion _glfw.x11.xi.QueryVersion\n#define XISelectEvents _glfw.x11.xi.SelectEvents\n\ntypedef Bool (* PFN_XRenderQueryExtension)(Display*,int*,int*);\ntypedef Status (* PFN_XRenderQueryVersion)(Display*dpy,int*,int*);\ntypedef XRenderPictFormat* (* PFN_XRenderFindVisualFormat)(Display*,Visual const*);\n#define XRenderQueryExtension _glfw.x11.xrender.QueryExtension\n#define XRenderQueryVersion _glfw.x11.xrender.QueryVersion\n#define XRenderFindVisualFormat _glfw.x11.xrender.FindVisualFormat\n\ntypedef VkFlags VkXlibSurfaceCreateFlagsKHR;\ntypedef VkFlags VkXcbSurfaceCreateFlagsKHR;\n\ntypedef struct VkXlibSurfaceCreateInfoKHR\n{\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkXlibSurfaceCreateFlagsKHR flags;\n    Display*                    dpy;\n    Window                      window;\n} VkXlibSurfaceCreateInfoKHR;\n\ntypedef struct VkXcbSurfaceCreateInfoKHR\n{\n    VkStructureType             sType;\n    const void*                 pNext;\n    VkXcbSurfaceCreateFlagsKHR  flags;\n    xcb_connection_t*           connection;\n    xcb_window_t                window;\n} VkXcbSurfaceCreateInfoKHR;\n\ntypedef VkResult (APIENTRY *PFN_vkCreateXlibSurfaceKHR)(VkInstance,const VkXlibSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);\ntypedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice,uint32_t,Display*,VisualID);\ntypedef VkResult (APIENTRY *PFN_vkCreateXcbSurfaceKHR)(VkInstance,const VkXcbSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);\ntypedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice,uint32_t,xcb_connection_t*,xcb_visualid_t);\n\n#include \"posix_thread.h\"\n#include \"posix_time.h\"\n#include \"xkb_unicode.h\"\n#include \"glx_context.h\"\n#include \"egl_context.h\"\n#include \"osmesa_context.h\"\n#if defined(__linux__)\n#include \"linux_joystick.h\"\n#else\n#include \"null_joystick.h\"\n#endif\n\n#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)\n#define _glfw_dlclose(handle) dlclose(handle)\n#define _glfw_dlsym(handle, name) dlsym(handle, name)\n\n#define _GLFW_EGL_NATIVE_WINDOW  ((EGLNativeWindowType) window->x11.handle)\n#define _GLFW_EGL_NATIVE_DISPLAY ((EGLNativeDisplayType) _glfw.x11.display)\n\n#define _GLFW_PLATFORM_WINDOW_STATE         _GLFWwindowX11  x11\n#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 x11\n#define _GLFW_PLATFORM_MONITOR_STATE        _GLFWmonitorX11 x11\n#define _GLFW_PLATFORM_CURSOR_STATE         _GLFWcursorX11  x11\n\n\n// X11-specific per-window data\n//\ntypedef struct _GLFWwindowX11\n{\n    Colormap        colormap;\n    Window          handle;\n    XIC             ic;\n\n    GLFWbool        overrideRedirect;\n    GLFWbool        iconified;\n    GLFWbool        maximized;\n\n    // Whether the visual supports framebuffer transparency\n    GLFWbool        transparent;\n\n    // Cached position and size used to filter out duplicate events\n    int             width, height;\n    int             xpos, ypos;\n\n    // The last received cursor position, regardless of source\n    int             lastCursorPosX, lastCursorPosY;\n    // The last position the cursor was warped to by GLFW\n    int             warpCursorPosX, warpCursorPosY;\n\n    // The time of the last KeyPress event\n    Time            lastKeyTime;\n\n} _GLFWwindowX11;\n\n// X11-specific global data\n//\ntypedef struct _GLFWlibraryX11\n{\n    Display*        display;\n    int             screen;\n    Window          root;\n\n    // Helper window for IPC\n    Window          helperWindowHandle;\n    // Invisible cursor for hidden cursor mode\n    Cursor          hiddenCursorHandle;\n    // Context for mapping window XIDs to _GLFWwindow pointers\n    XContext        context;\n    // XIM input method\n    XIM             im;\n    // Most recent error code received by X error handler\n    int             errorCode;\n    // Primary selection string (while the primary selection is owned)\n    char*           primarySelectionString;\n    // Clipboard string (while the selection is owned)\n    char*           clipboardString;\n    // Key name string\n    char            keyName[5];\n    // X11 keycode to GLFW key LUT\n    short int       keycodes[256];\n    // GLFW key to X11 keycode LUT\n    short int       scancodes[GLFW_KEY_LAST + 1];\n    // Where to place the cursor when re-enabled\n    double          restoreCursorPosX, restoreCursorPosY;\n    // The window whose disabled cursor mode is active\n    _GLFWwindow*    disabledCursorWindow;\n\n    // Window manager atoms\n    Atom            WM_PROTOCOLS;\n    Atom            WM_STATE;\n    Atom            WM_DELETE_WINDOW;\n    Atom            NET_WM_NAME;\n    Atom            NET_WM_ICON_NAME;\n    Atom            NET_WM_ICON;\n    Atom            NET_WM_PID;\n    Atom            NET_WM_PING;\n    Atom            NET_WM_WINDOW_TYPE;\n    Atom            NET_WM_WINDOW_TYPE_NORMAL;\n    Atom            NET_WM_STATE;\n    Atom            NET_WM_STATE_ABOVE;\n    Atom            NET_WM_STATE_FULLSCREEN;\n    Atom            NET_WM_STATE_MAXIMIZED_VERT;\n    Atom            NET_WM_STATE_MAXIMIZED_HORZ;\n    Atom            NET_WM_STATE_DEMANDS_ATTENTION;\n    Atom            NET_WM_BYPASS_COMPOSITOR;\n    Atom            NET_WM_FULLSCREEN_MONITORS;\n    Atom            NET_ACTIVE_WINDOW;\n    Atom            NET_FRAME_EXTENTS;\n    Atom            NET_REQUEST_FRAME_EXTENTS;\n    Atom            MOTIF_WM_HINTS;\n\n    // Xdnd (drag and drop) atoms\n    Atom            XdndAware;\n    Atom            XdndEnter;\n    Atom            XdndPosition;\n    Atom            XdndStatus;\n    Atom            XdndActionCopy;\n    Atom            XdndDrop;\n    Atom            XdndFinished;\n    Atom            XdndSelection;\n    Atom            XdndTypeList;\n    Atom            text_uri_list;\n\n    // Selection (clipboard) atoms\n    Atom            TARGETS;\n    Atom            MULTIPLE;\n    Atom            INCR;\n    Atom            CLIPBOARD;\n    Atom            PRIMARY;\n    Atom            CLIPBOARD_MANAGER;\n    Atom            SAVE_TARGETS;\n    Atom            NULL_;\n    Atom            UTF8_STRING;\n    Atom            COMPOUND_STRING;\n    Atom            ATOM_PAIR;\n    Atom            GLFW_SELECTION;\n\n    struct {\n        GLFWbool    available;\n        void*       handle;\n        int         eventBase;\n        int         errorBase;\n        int         major;\n        int         minor;\n        GLFWbool    gammaBroken;\n        GLFWbool    monitorBroken;\n        PFN_XRRAllocGamma AllocGamma;\n        PFN_XRRFreeCrtcInfo FreeCrtcInfo;\n        PFN_XRRFreeGamma FreeGamma;\n        PFN_XRRFreeOutputInfo FreeOutputInfo;\n        PFN_XRRFreeScreenResources FreeScreenResources;\n        PFN_XRRGetCrtcGamma GetCrtcGamma;\n        PFN_XRRGetCrtcGammaSize GetCrtcGammaSize;\n        PFN_XRRGetCrtcInfo GetCrtcInfo;\n        PFN_XRRGetOutputInfo GetOutputInfo;\n        PFN_XRRGetOutputPrimary GetOutputPrimary;\n        PFN_XRRGetScreenResourcesCurrent GetScreenResourcesCurrent;\n        PFN_XRRQueryExtension QueryExtension;\n        PFN_XRRQueryVersion QueryVersion;\n        PFN_XRRSelectInput SelectInput;\n        PFN_XRRSetCrtcConfig SetCrtcConfig;\n        PFN_XRRSetCrtcGamma SetCrtcGamma;\n        PFN_XRRUpdateConfiguration UpdateConfiguration;\n    } randr;\n\n    struct {\n        GLFWbool    available;\n        GLFWbool    detectable;\n        int         majorOpcode;\n        int         eventBase;\n        int         errorBase;\n        int         major;\n        int         minor;\n    } xkb;\n\n    struct {\n        int         count;\n        int         timeout;\n        int         interval;\n        int         blanking;\n        int         exposure;\n    } saver;\n\n    struct {\n        int         version;\n        Window      source;\n        Atom        format;\n    } xdnd;\n\n    struct {\n        void*       handle;\n        PFN_XcursorImageCreate ImageCreate;\n        PFN_XcursorImageDestroy ImageDestroy;\n        PFN_XcursorImageLoadCursor ImageLoadCursor;\n    } xcursor;\n\n    struct {\n        GLFWbool    available;\n        void*       handle;\n        int         major;\n        int         minor;\n        PFN_XineramaIsActive IsActive;\n        PFN_XineramaQueryExtension QueryExtension;\n        PFN_XineramaQueryScreens QueryScreens;\n    } xinerama;\n\n    struct {\n        void*       handle;\n        PFN_XGetXCBConnection GetXCBConnection;\n    } x11xcb;\n\n    struct {\n        GLFWbool    available;\n        void*       handle;\n        int         eventBase;\n        int         errorBase;\n        PFN_XF86VidModeQueryExtension QueryExtension;\n        PFN_XF86VidModeGetGammaRamp GetGammaRamp;\n        PFN_XF86VidModeSetGammaRamp SetGammaRamp;\n        PFN_XF86VidModeGetGammaRampSize GetGammaRampSize;\n    } vidmode;\n\n    struct {\n        GLFWbool    available;\n        void*       handle;\n        int         majorOpcode;\n        int         eventBase;\n        int         errorBase;\n        int         major;\n        int         minor;\n        PFN_XIQueryVersion QueryVersion;\n        PFN_XISelectEvents SelectEvents;\n    } xi;\n\n    struct {\n        GLFWbool    available;\n        void*       handle;\n        int         major;\n        int         minor;\n        int         eventBase;\n        int         errorBase;\n        PFN_XRenderQueryExtension QueryExtension;\n        PFN_XRenderQueryVersion QueryVersion;\n        PFN_XRenderFindVisualFormat FindVisualFormat;\n    } xrender;\n\n} _GLFWlibraryX11;\n\n// X11-specific per-monitor data\n//\ntypedef struct _GLFWmonitorX11\n{\n    RROutput        output;\n    RRCrtc          crtc;\n    RRMode          oldMode;\n\n    // Index of corresponding Xinerama screen,\n    // for EWMH full screen window placement\n    int             index;\n\n} _GLFWmonitorX11;\n\n// X11-specific per-cursor data\n//\ntypedef struct _GLFWcursorX11\n{\n    Cursor handle;\n\n} _GLFWcursorX11;\n\n\nvoid _glfwPollMonitorsX11(void);\nGLFWbool _glfwSetVideoModeX11(_GLFWmonitor* monitor, const GLFWvidmode* desired);\nvoid _glfwRestoreVideoModeX11(_GLFWmonitor* monitor);\n\nCursor _glfwCreateCursorX11(const GLFWimage* image, int xhot, int yhot);\n\nunsigned long _glfwGetWindowPropertyX11(Window window,\n                                        Atom property,\n                                        Atom type,\n                                        unsigned char** value);\nGLFWbool _glfwIsVisualTransparentX11(Visual* visual);\n\nvoid _glfwGrabErrorHandlerX11(void);\nvoid _glfwReleaseErrorHandlerX11(void);\nvoid _glfwInputErrorX11(int error, const char* message);\n\nvoid _glfwPushSelectionToManagerX11(void);\n\n"
  },
  {
    "path": "external/GLFW/src/x11_window.c",
    "content": "//========================================================================\n// GLFW 3.3 X11 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n#include <X11/cursorfont.h>\n#include <X11/Xmd.h>\n\n#include <sys/select.h>\n\n#include <string.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <limits.h>\n#include <errno.h>\n#include <assert.h>\n\n// Action for EWMH client messages\n#define _NET_WM_STATE_REMOVE        0\n#define _NET_WM_STATE_ADD           1\n#define _NET_WM_STATE_TOGGLE        2\n\n// Additional mouse button names for XButtonEvent\n#define Button6            6\n#define Button7            7\n\n#define _GLFW_XDND_VERSION 5\n\n\n// Wait for data to arrive using select\n// This avoids blocking other threads via the per-display Xlib lock that also\n// covers GLX functions\n//\nstatic GLFWbool waitForEvent(double* timeout)\n{\n    fd_set fds;\n    const int fd = ConnectionNumber(_glfw.x11.display);\n    int count = fd + 1;\n\n#if defined(__linux__)\n    if (_glfw.linjs.inotify > fd)\n        count = _glfw.linjs.inotify + 1;\n#endif\n    for (;;)\n    {\n        FD_ZERO(&fds);\n        FD_SET(fd, &fds);\n#if defined(__linux__)\n        if (_glfw.linjs.inotify > 0)\n            FD_SET(_glfw.linjs.inotify, &fds);\n#endif\n\n        if (timeout)\n        {\n            const long seconds = (long) *timeout;\n            const long microseconds = (long) ((*timeout - seconds) * 1e6);\n            struct timeval tv = { seconds, microseconds };\n            const uint64_t base = _glfwPlatformGetTimerValue();\n\n            const int result = select(count, &fds, NULL, NULL, &tv);\n            const int error = errno;\n\n            *timeout -= (_glfwPlatformGetTimerValue() - base) /\n                (double) _glfwPlatformGetTimerFrequency();\n\n            if (result > 0)\n                return GLFW_TRUE;\n            if ((result == -1 && error == EINTR) || *timeout <= 0.0)\n                return GLFW_FALSE;\n        }\n        else if (select(count, &fds, NULL, NULL, NULL) != -1 || errno != EINTR)\n            return GLFW_TRUE;\n    }\n}\n\n// Waits until a VisibilityNotify event arrives for the specified window or the\n// timeout period elapses (ICCCM section 4.2.2)\n//\nstatic GLFWbool waitForVisibilityNotify(_GLFWwindow* window)\n{\n    XEvent dummy;\n    double timeout = 0.1;\n\n    while (!XCheckTypedWindowEvent(_glfw.x11.display,\n                                   window->x11.handle,\n                                   VisibilityNotify,\n                                   &dummy))\n    {\n        if (!waitForEvent(&timeout))\n            return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\n// Returns whether the window is iconified\n//\nstatic int getWindowState(_GLFWwindow* window)\n{\n    int result = WithdrawnState;\n    struct {\n        CARD32 state;\n        Window icon;\n    } *state = NULL;\n\n    if (_glfwGetWindowPropertyX11(window->x11.handle,\n                                  _glfw.x11.WM_STATE,\n                                  _glfw.x11.WM_STATE,\n                                  (unsigned char**) &state) >= 2)\n    {\n        result = state->state;\n    }\n\n    if (state)\n        XFree(state);\n\n    return result;\n}\n\n// Returns whether the event is a selection event\n//\nstatic Bool isSelectionEvent(Display* display, XEvent* event, XPointer pointer)\n{\n    if (event->xany.window != _glfw.x11.helperWindowHandle)\n        return False;\n\n    return event->type == SelectionRequest ||\n           event->type == SelectionNotify ||\n           event->type == SelectionClear;\n}\n\n// Returns whether it is a _NET_FRAME_EXTENTS event for the specified window\n//\nstatic Bool isFrameExtentsEvent(Display* display, XEvent* event, XPointer pointer)\n{\n    _GLFWwindow* window = (_GLFWwindow*) pointer;\n    return event->type == PropertyNotify &&\n           event->xproperty.state == PropertyNewValue &&\n           event->xproperty.window == window->x11.handle &&\n           event->xproperty.atom == _glfw.x11.NET_FRAME_EXTENTS;\n}\n\n// Returns whether it is a property event for the specified selection transfer\n//\nstatic Bool isSelPropNewValueNotify(Display* display, XEvent* event, XPointer pointer)\n{\n    XEvent* notification = (XEvent*) pointer;\n    return event->type == PropertyNotify &&\n           event->xproperty.state == PropertyNewValue &&\n           event->xproperty.window == notification->xselection.requestor &&\n           event->xproperty.atom == notification->xselection.property;\n}\n\n// Translates a GLFW standard cursor to a font cursor shape\n//\nstatic int translateCursorShape(int shape)\n{\n    switch (shape)\n    {\n        case GLFW_ARROW_CURSOR:\n            return XC_left_ptr;\n        case GLFW_IBEAM_CURSOR:\n            return XC_xterm;\n        case GLFW_CROSSHAIR_CURSOR:\n            return XC_crosshair;\n        case GLFW_HAND_CURSOR:\n            return XC_hand1;\n        case GLFW_HRESIZE_CURSOR:\n            return XC_sb_h_double_arrow;\n        case GLFW_VRESIZE_CURSOR:\n            return XC_sb_v_double_arrow;\n    }\n\n    return 0;\n}\n\n// Translates an X event modifier state mask\n//\nstatic int translateState(int state)\n{\n    int mods = 0;\n\n    if (state & ShiftMask)\n        mods |= GLFW_MOD_SHIFT;\n    if (state & ControlMask)\n        mods |= GLFW_MOD_CONTROL;\n    if (state & Mod1Mask)\n        mods |= GLFW_MOD_ALT;\n    if (state & Mod4Mask)\n        mods |= GLFW_MOD_SUPER;\n\n    return mods;\n}\n\n// Translates an X11 key code to a GLFW key token\n//\nstatic int translateKey(int scancode)\n{\n    // Use the pre-filled LUT (see createKeyTables() in x11_init.c)\n    if (scancode < 0 || scancode > 255)\n        return GLFW_KEY_UNKNOWN;\n\n    return _glfw.x11.keycodes[scancode];\n}\n\n// Return the GLFW window corresponding to the specified X11 window\n//\nstatic _GLFWwindow* findWindowByHandle(Window handle)\n{\n    _GLFWwindow* window;\n\n    if (XFindContext(_glfw.x11.display,\n                     handle,\n                     _glfw.x11.context,\n                     (XPointer*) &window) != 0)\n    {\n        return NULL;\n    }\n\n    return window;\n}\n\n// Sends an EWMH or ICCCM event to the window manager\n//\nstatic void sendEventToWM(_GLFWwindow* window, Atom type,\n                          long a, long b, long c, long d, long e)\n{\n    XEvent event;\n    memset(&event, 0, sizeof(event));\n\n    event.type = ClientMessage;\n    event.xclient.window = window->x11.handle;\n    event.xclient.format = 32; // Data is 32-bit longs\n    event.xclient.message_type = type;\n    event.xclient.data.l[0] = a;\n    event.xclient.data.l[1] = b;\n    event.xclient.data.l[2] = c;\n    event.xclient.data.l[3] = d;\n    event.xclient.data.l[4] = e;\n\n    XSendEvent(_glfw.x11.display, _glfw.x11.root,\n               False,\n               SubstructureNotifyMask | SubstructureRedirectMask,\n               &event);\n}\n\n// Updates the normal hints according to the window settings\n//\nstatic void updateNormalHints(_GLFWwindow* window, int width, int height)\n{\n    XSizeHints* hints = XAllocSizeHints();\n\n    if (!window->monitor)\n    {\n        if (window->resizable)\n        {\n            if (window->minwidth != GLFW_DONT_CARE &&\n                window->minheight != GLFW_DONT_CARE)\n            {\n                hints->flags |= PMinSize;\n                hints->min_width = window->minwidth;\n                hints->min_height = window->minheight;\n            }\n\n            if (window->maxwidth != GLFW_DONT_CARE &&\n                window->maxheight != GLFW_DONT_CARE)\n            {\n                hints->flags |= PMaxSize;\n                hints->max_width = window->maxwidth;\n                hints->max_height = window->maxheight;\n            }\n\n            if (window->numer != GLFW_DONT_CARE &&\n                window->denom != GLFW_DONT_CARE)\n            {\n                hints->flags |= PAspect;\n                hints->min_aspect.x = hints->max_aspect.x = window->numer;\n                hints->min_aspect.y = hints->max_aspect.y = window->denom;\n            }\n        }\n        else\n        {\n            hints->flags |= (PMinSize | PMaxSize);\n            hints->min_width  = hints->max_width  = width;\n            hints->min_height = hints->max_height = height;\n        }\n    }\n\n    hints->flags |= PWinGravity;\n    hints->win_gravity = StaticGravity;\n\n    XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);\n    XFree(hints);\n}\n\n// Updates the full screen status of the window\n//\nstatic void updateWindowMode(_GLFWwindow* window)\n{\n    if (window->monitor)\n    {\n        if (_glfw.x11.xinerama.available &&\n            _glfw.x11.NET_WM_FULLSCREEN_MONITORS)\n        {\n            sendEventToWM(window,\n                          _glfw.x11.NET_WM_FULLSCREEN_MONITORS,\n                          window->monitor->x11.index,\n                          window->monitor->x11.index,\n                          window->monitor->x11.index,\n                          window->monitor->x11.index,\n                          0);\n        }\n\n        if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN)\n        {\n            sendEventToWM(window,\n                          _glfw.x11.NET_WM_STATE,\n                          _NET_WM_STATE_ADD,\n                          _glfw.x11.NET_WM_STATE_FULLSCREEN,\n                          0, 1, 0);\n        }\n        else\n        {\n            // This is the butcher's way of removing window decorations\n            // Setting the override-redirect attribute on a window makes the\n            // window manager ignore the window completely (ICCCM, section 4)\n            // The good thing is that this makes undecorated full screen windows\n            // easy to do; the bad thing is that we have to do everything\n            // manually and some things (like iconify/restore) won't work at\n            // all, as those are tasks usually performed by the window manager\n\n            XSetWindowAttributes attributes;\n            attributes.override_redirect = True;\n            XChangeWindowAttributes(_glfw.x11.display,\n                                    window->x11.handle,\n                                    CWOverrideRedirect,\n                                    &attributes);\n\n            window->x11.overrideRedirect = GLFW_TRUE;\n        }\n\n        // Enable compositor bypass\n        if (!window->x11.transparent)\n        {\n            const unsigned long value = 1;\n\n            XChangeProperty(_glfw.x11.display,  window->x11.handle,\n                            _glfw.x11.NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32,\n                            PropModeReplace, (unsigned char*) &value, 1);\n        }\n    }\n    else\n    {\n        if (_glfw.x11.xinerama.available &&\n            _glfw.x11.NET_WM_FULLSCREEN_MONITORS)\n        {\n            XDeleteProperty(_glfw.x11.display, window->x11.handle,\n                            _glfw.x11.NET_WM_FULLSCREEN_MONITORS);\n        }\n\n        if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN)\n        {\n            sendEventToWM(window,\n                          _glfw.x11.NET_WM_STATE,\n                          _NET_WM_STATE_REMOVE,\n                          _glfw.x11.NET_WM_STATE_FULLSCREEN,\n                          0, 1, 0);\n        }\n        else\n        {\n            XSetWindowAttributes attributes;\n            attributes.override_redirect = False;\n            XChangeWindowAttributes(_glfw.x11.display,\n                                    window->x11.handle,\n                                    CWOverrideRedirect,\n                                    &attributes);\n\n            window->x11.overrideRedirect = GLFW_FALSE;\n        }\n\n        // Disable compositor bypass\n        if (!window->x11.transparent)\n        {\n            XDeleteProperty(_glfw.x11.display, window->x11.handle,\n                            _glfw.x11.NET_WM_BYPASS_COMPOSITOR);\n        }\n    }\n}\n\n// Splits and translates a text/uri-list into separate file paths\n// NOTE: This function destroys the provided string\n//\nstatic char** parseUriList(char* text, int* count)\n{\n    const char* prefix = \"file://\";\n    char** paths = NULL;\n    char* line;\n\n    *count = 0;\n\n    while ((line = strtok(text, \"\\r\\n\")))\n    {\n        text = NULL;\n\n        if (line[0] == '#')\n            continue;\n\n        if (strncmp(line, prefix, strlen(prefix)) == 0)\n        {\n            line += strlen(prefix);\n            // TODO: Validate hostname\n            while (*line != '/')\n                line++;\n        }\n\n        (*count)++;\n\n        char* path = calloc(strlen(line) + 1, 1);\n        paths = realloc(paths, *count * sizeof(char*));\n        paths[*count - 1] = path;\n\n        while (*line)\n        {\n            if (line[0] == '%' && line[1] && line[2])\n            {\n                const char digits[3] = { line[1], line[2], '\\0' };\n                *path = strtol(digits, NULL, 16);\n                line += 2;\n            }\n            else\n                *path = *line;\n\n            path++;\n            line++;\n        }\n    }\n\n    return paths;\n}\n\n// Encode a Unicode code point to a UTF-8 stream\n// Based on cutef8 by Jeff Bezanson (Public Domain)\n//\nstatic size_t encodeUTF8(char* s, unsigned int ch)\n{\n    size_t count = 0;\n\n    if (ch < 0x80)\n        s[count++] = (char) ch;\n    else if (ch < 0x800)\n    {\n        s[count++] = (ch >> 6) | 0xc0;\n        s[count++] = (ch & 0x3f) | 0x80;\n    }\n    else if (ch < 0x10000)\n    {\n        s[count++] = (ch >> 12) | 0xe0;\n        s[count++] = ((ch >> 6) & 0x3f) | 0x80;\n        s[count++] = (ch & 0x3f) | 0x80;\n    }\n    else if (ch < 0x110000)\n    {\n        s[count++] = (ch >> 18) | 0xf0;\n        s[count++] = ((ch >> 12) & 0x3f) | 0x80;\n        s[count++] = ((ch >> 6) & 0x3f) | 0x80;\n        s[count++] = (ch & 0x3f) | 0x80;\n    }\n\n    return count;\n}\n\n// Decode a Unicode code point from a UTF-8 stream\n// Based on cutef8 by Jeff Bezanson (Public Domain)\n//\n#if defined(X_HAVE_UTF8_STRING)\nstatic unsigned int decodeUTF8(const char** s)\n{\n    unsigned int ch = 0, count = 0;\n    static const unsigned int offsets[] =\n    {\n        0x00000000u, 0x00003080u, 0x000e2080u,\n        0x03c82080u, 0xfa082080u, 0x82082080u\n    };\n\n    do\n    {\n        ch = (ch << 6) + (unsigned char) **s;\n        (*s)++;\n        count++;\n    } while ((**s & 0xc0) == 0x80);\n\n    assert(count <= 6);\n    return ch - offsets[count - 1];\n}\n#endif /*X_HAVE_UTF8_STRING*/\n\n// Convert the specified Latin-1 string to UTF-8\n//\nstatic char* convertLatin1toUTF8(const char* source)\n{\n    size_t size = 1;\n    const char* sp;\n\n    for (sp = source;  *sp;  sp++)\n        size += (*sp & 0x80) ? 2 : 1;\n\n    char* target = calloc(size, 1);\n    char* tp = target;\n\n    for (sp = source;  *sp;  sp++)\n        tp += encodeUTF8(tp, *sp);\n\n    return target;\n}\n\n// Centers the cursor over the window client area\n//\nstatic void centerCursor(_GLFWwindow* window)\n{\n    int width, height;\n    _glfwPlatformGetWindowSize(window, &width, &height);\n    _glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0);\n}\n\n// Updates the cursor image according to its cursor mode\n//\nstatic void updateCursorImage(_GLFWwindow* window)\n{\n    if (window->cursorMode == GLFW_CURSOR_NORMAL)\n    {\n        if (window->cursor)\n        {\n            XDefineCursor(_glfw.x11.display, window->x11.handle,\n                          window->cursor->x11.handle);\n        }\n        else\n            XUndefineCursor(_glfw.x11.display, window->x11.handle);\n    }\n    else\n    {\n        XDefineCursor(_glfw.x11.display, window->x11.handle,\n                      _glfw.x11.hiddenCursorHandle);\n    }\n}\n\n// Create the X11 window (and its colormap)\n//\nstatic GLFWbool createNativeWindow(_GLFWwindow* window,\n                                   const _GLFWwndconfig* wndconfig,\n                                   Visual* visual, int depth)\n{\n    // Create a colormap based on the visual used by the current context\n    window->x11.colormap = XCreateColormap(_glfw.x11.display,\n                                           _glfw.x11.root,\n                                           visual,\n                                           AllocNone);\n\n    window->x11.transparent = _glfwIsVisualTransparentX11(visual);\n\n    // Create the actual window\n    {\n        XSetWindowAttributes wa;\n        const unsigned long wamask = CWBorderPixel | CWColormap | CWEventMask;\n\n        wa.colormap = window->x11.colormap;\n        wa.border_pixel = 0;\n        wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask |\n                        PointerMotionMask | ButtonPressMask | ButtonReleaseMask |\n                        ExposureMask | FocusChangeMask | VisibilityChangeMask |\n                        EnterWindowMask | LeaveWindowMask | PropertyChangeMask;\n\n        _glfwGrabErrorHandlerX11();\n\n        window->x11.handle = XCreateWindow(_glfw.x11.display,\n                                           _glfw.x11.root,\n                                           0, 0,\n                                           wndconfig->width, wndconfig->height,\n                                           0,      // Border width\n                                           depth,  // Color depth\n                                           InputOutput,\n                                           visual,\n                                           wamask,\n                                           &wa);\n\n        _glfwReleaseErrorHandlerX11();\n\n        if (!window->x11.handle)\n        {\n            _glfwInputErrorX11(GLFW_PLATFORM_ERROR,\n                               \"X11: Failed to create window\");\n            return GLFW_FALSE;\n        }\n\n        XSaveContext(_glfw.x11.display,\n                     window->x11.handle,\n                     _glfw.x11.context,\n                     (XPointer) window);\n    }\n\n    if (!wndconfig->decorated)\n        _glfwPlatformSetWindowDecorated(window, GLFW_FALSE);\n\n    if (_glfw.x11.NET_WM_STATE && !window->monitor)\n    {\n        Atom states[3];\n        int count = 0;\n\n        if (wndconfig->floating)\n        {\n            if (_glfw.x11.NET_WM_STATE_ABOVE)\n                states[count++] = _glfw.x11.NET_WM_STATE_ABOVE;\n        }\n\n        if (wndconfig->maximized)\n        {\n            if (_glfw.x11.NET_WM_STATE_MAXIMIZED_VERT &&\n                _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ)\n            {\n                states[count++] = _glfw.x11.NET_WM_STATE_MAXIMIZED_VERT;\n                states[count++] = _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ;\n                window->x11.maximized = GLFW_TRUE;\n            }\n        }\n\n        if (count)\n        {\n            XChangeProperty(_glfw.x11.display, window->x11.handle,\n                            _glfw.x11.NET_WM_STATE, XA_ATOM, 32,\n                            PropModeReplace, (unsigned char*) &states, count);\n        }\n    }\n\n    // Declare the WM protocols supported by GLFW\n    {\n        Atom protocols[] =\n        {\n            _glfw.x11.WM_DELETE_WINDOW,\n            _glfw.x11.NET_WM_PING\n        };\n\n        XSetWMProtocols(_glfw.x11.display, window->x11.handle,\n                        protocols, sizeof(protocols) / sizeof(Atom));\n    }\n\n    // Declare our PID\n    {\n        const long pid = getpid();\n\n        XChangeProperty(_glfw.x11.display,  window->x11.handle,\n                        _glfw.x11.NET_WM_PID, XA_CARDINAL, 32,\n                        PropModeReplace,\n                        (unsigned char*) &pid, 1);\n    }\n\n    if (_glfw.x11.NET_WM_WINDOW_TYPE && _glfw.x11.NET_WM_WINDOW_TYPE_NORMAL)\n    {\n        Atom type = _glfw.x11.NET_WM_WINDOW_TYPE_NORMAL;\n        XChangeProperty(_glfw.x11.display,  window->x11.handle,\n                        _glfw.x11.NET_WM_WINDOW_TYPE, XA_ATOM, 32,\n                        PropModeReplace, (unsigned char*) &type, 1);\n    }\n\n    // Set ICCCM WM_HINTS property\n    {\n        XWMHints* hints = XAllocWMHints();\n        if (!hints)\n        {\n            _glfwInputError(GLFW_OUT_OF_MEMORY,\n                            \"X11: Failed to allocate WM hints\");\n            return GLFW_FALSE;\n        }\n\n        hints->flags = StateHint;\n        hints->initial_state = NormalState;\n\n        XSetWMHints(_glfw.x11.display, window->x11.handle, hints);\n        XFree(hints);\n    }\n\n    updateNormalHints(window, wndconfig->width, wndconfig->height);\n\n    // Set ICCCM WM_CLASS property\n    {\n        XClassHint* hint = XAllocClassHint();\n\n        if (strlen(_glfw.hints.init.x11.className) &&\n            strlen(_glfw.hints.init.x11.classClass))\n        {\n            hint->res_name = (char*) _glfw.hints.init.x11.className;\n            hint->res_class = (char*) _glfw.hints.init.x11.classClass;\n        }\n        else if (strlen(wndconfig->title))\n        {\n            hint->res_name = (char*) wndconfig->title;\n            hint->res_class = (char*) wndconfig->title;\n        }\n        else\n        {\n            hint->res_name = (char*) \"glfw-application\";\n            hint->res_class = (char*) \"GLFW-Application\";\n        }\n\n        XSetClassHint(_glfw.x11.display, window->x11.handle, hint);\n        XFree(hint);\n    }\n\n    // Announce support for Xdnd (drag and drop)\n    {\n        const Atom version = _GLFW_XDND_VERSION;\n        XChangeProperty(_glfw.x11.display, window->x11.handle,\n                        _glfw.x11.XdndAware, XA_ATOM, 32,\n                        PropModeReplace, (unsigned char*) &version, 1);\n    }\n\n    _glfwPlatformSetWindowTitle(window, wndconfig->title);\n\n    if (_glfw.x11.im)\n    {\n        window->x11.ic = XCreateIC(_glfw.x11.im,\n                                   XNInputStyle,\n                                   XIMPreeditNothing | XIMStatusNothing,\n                                   XNClientWindow,\n                                   window->x11.handle,\n                                   XNFocusWindow,\n                                   window->x11.handle,\n                                   NULL);\n    }\n\n    _glfwPlatformGetWindowPos(window, &window->x11.xpos, &window->x11.ypos);\n    _glfwPlatformGetWindowSize(window, &window->x11.width, &window->x11.height);\n\n    return GLFW_TRUE;\n}\n\n// Set the specified property to the selection converted to the requested target\n//\nstatic Atom writeTargetToProperty(const XSelectionRequestEvent* request)\n{\n    int i;\n    char* selectionString = NULL;\n    const Atom formats[] = { _glfw.x11.UTF8_STRING, XA_STRING };\n    const int formatCount = sizeof(formats) / sizeof(formats[0]);\n\n    if (request->selection == _glfw.x11.PRIMARY)\n        selectionString = _glfw.x11.primarySelectionString;\n    else\n        selectionString = _glfw.x11.clipboardString;\n\n    if (request->property == None)\n    {\n        // The requester is a legacy client (ICCCM section 2.2)\n        // We don't support legacy clients, so fail here\n        return None;\n    }\n\n    if (request->target == _glfw.x11.TARGETS)\n    {\n        // The list of supported targets was requested\n\n        const Atom targets[] = { _glfw.x11.TARGETS,\n                                 _glfw.x11.MULTIPLE,\n                                 _glfw.x11.UTF8_STRING,\n                                 XA_STRING };\n\n        XChangeProperty(_glfw.x11.display,\n                        request->requestor,\n                        request->property,\n                        XA_ATOM,\n                        32,\n                        PropModeReplace,\n                        (unsigned char*) targets,\n                        sizeof(targets) / sizeof(targets[0]));\n\n        return request->property;\n    }\n\n    if (request->target == _glfw.x11.MULTIPLE)\n    {\n        // Multiple conversions were requested\n\n        Atom* targets;\n        unsigned long i, count;\n\n        count = _glfwGetWindowPropertyX11(request->requestor,\n                                          request->property,\n                                          _glfw.x11.ATOM_PAIR,\n                                          (unsigned char**) &targets);\n\n        for (i = 0;  i < count;  i += 2)\n        {\n            int j;\n\n            for (j = 0;  j < formatCount;  j++)\n            {\n                if (targets[i] == formats[j])\n                    break;\n            }\n\n            if (j < formatCount)\n            {\n                XChangeProperty(_glfw.x11.display,\n                                request->requestor,\n                                targets[i + 1],\n                                targets[i],\n                                8,\n                                PropModeReplace,\n                                (unsigned char *) selectionString,\n                                strlen(selectionString));\n            }\n            else\n                targets[i + 1] = None;\n        }\n\n        XChangeProperty(_glfw.x11.display,\n                        request->requestor,\n                        request->property,\n                        _glfw.x11.ATOM_PAIR,\n                        32,\n                        PropModeReplace,\n                        (unsigned char*) targets,\n                        count);\n\n        XFree(targets);\n\n        return request->property;\n    }\n\n    if (request->target == _glfw.x11.SAVE_TARGETS)\n    {\n        // The request is a check whether we support SAVE_TARGETS\n        // It should be handled as a no-op side effect target\n\n        XChangeProperty(_glfw.x11.display,\n                        request->requestor,\n                        request->property,\n                        _glfw.x11.NULL_,\n                        32,\n                        PropModeReplace,\n                        NULL,\n                        0);\n\n        return request->property;\n    }\n\n    // Conversion to a data target was requested\n\n    for (i = 0;  i < formatCount;  i++)\n    {\n        if (request->target == formats[i])\n        {\n            // The requested target is one we support\n\n            XChangeProperty(_glfw.x11.display,\n                            request->requestor,\n                            request->property,\n                            request->target,\n                            8,\n                            PropModeReplace,\n                            (unsigned char *) selectionString,\n                            strlen(selectionString));\n\n            return request->property;\n        }\n    }\n\n    // The requested target is not supported\n\n    return None;\n}\n\nstatic void handleSelectionClear(XEvent* event)\n{\n    if (event->xselectionclear.selection == _glfw.x11.PRIMARY)\n    {\n        free(_glfw.x11.primarySelectionString);\n        _glfw.x11.primarySelectionString = NULL;\n    }\n    else\n    {\n        free(_glfw.x11.clipboardString);\n        _glfw.x11.clipboardString = NULL;\n    }\n}\n\nstatic void handleSelectionRequest(XEvent* event)\n{\n    const XSelectionRequestEvent* request = &event->xselectionrequest;\n\n    XEvent reply;\n    memset(&reply, 0, sizeof(reply));\n\n    reply.xselection.property = writeTargetToProperty(request);\n    reply.xselection.type = SelectionNotify;\n    reply.xselection.display = request->display;\n    reply.xselection.requestor = request->requestor;\n    reply.xselection.selection = request->selection;\n    reply.xselection.target = request->target;\n    reply.xselection.time = request->time;\n\n    XSendEvent(_glfw.x11.display, request->requestor, False, 0, &reply);\n}\n\nstatic const char* getSelectionString(Atom selection)\n{\n    size_t i;\n    char** selectionString = NULL;\n    const Atom targets[] = { _glfw.x11.UTF8_STRING, XA_STRING };\n    const size_t targetCount = sizeof(targets) / sizeof(targets[0]);\n\n    if (selection == _glfw.x11.PRIMARY)\n        selectionString = &_glfw.x11.primarySelectionString;\n    else\n        selectionString = &_glfw.x11.clipboardString;\n\n    if (XGetSelectionOwner(_glfw.x11.display, selection) ==\n        _glfw.x11.helperWindowHandle)\n    {\n        // Instead of doing a large number of X round-trips just to put this\n        // string into a window property and then read it back, just return it\n        return *selectionString;\n    }\n\n    free(*selectionString);\n    *selectionString = NULL;\n\n    for (i = 0;  i < targetCount;  i++)\n    {\n        char* data;\n        Atom actualType;\n        int actualFormat;\n        unsigned long itemCount, bytesAfter;\n        XEvent notification, dummy;\n\n        XConvertSelection(_glfw.x11.display,\n                          selection,\n                          targets[i],\n                          _glfw.x11.GLFW_SELECTION,\n                          _glfw.x11.helperWindowHandle,\n                          CurrentTime);\n\n        while (!XCheckTypedWindowEvent(_glfw.x11.display,\n                                       _glfw.x11.helperWindowHandle,\n                                       SelectionNotify,\n                                       &notification))\n        {\n            waitForEvent(NULL);\n        }\n\n        if (notification.xselection.property == None)\n            continue;\n\n        XCheckIfEvent(_glfw.x11.display,\n                      &dummy,\n                      isSelPropNewValueNotify,\n                      (XPointer) &notification);\n\n        XGetWindowProperty(_glfw.x11.display,\n                           notification.xselection.requestor,\n                           notification.xselection.property,\n                           0,\n                           LONG_MAX,\n                           True,\n                           AnyPropertyType,\n                           &actualType,\n                           &actualFormat,\n                           &itemCount,\n                           &bytesAfter,\n                           (unsigned char**) &data);\n\n        if (actualType == _glfw.x11.INCR)\n        {\n            size_t size = 1;\n            char* string = NULL;\n\n            for (;;)\n            {\n                while (!XCheckIfEvent(_glfw.x11.display,\n                                      &dummy,\n                                      isSelPropNewValueNotify,\n                                      (XPointer) &notification))\n                {\n                    waitForEvent(NULL);\n                }\n\n                XFree(data);\n                XGetWindowProperty(_glfw.x11.display,\n                                   notification.xselection.requestor,\n                                   notification.xselection.property,\n                                   0,\n                                   LONG_MAX,\n                                   True,\n                                   AnyPropertyType,\n                                   &actualType,\n                                   &actualFormat,\n                                   &itemCount,\n                                   &bytesAfter,\n                                   (unsigned char**) &data);\n\n                if (itemCount)\n                {\n                    size += itemCount;\n                    string = realloc(string, size);\n                    string[size - itemCount - 1] = '\\0';\n                    strcat(string, data);\n                }\n\n                if (!itemCount)\n                {\n                    if (targets[i] == XA_STRING)\n                    {\n                        *selectionString = convertLatin1toUTF8(string);\n                        free(string);\n                    }\n                    else\n                        *selectionString = string;\n\n                    break;\n                }\n            }\n        }\n        else if (actualType == targets[i])\n        {\n            if (targets[i] == XA_STRING)\n                *selectionString = convertLatin1toUTF8(data);\n            else\n                *selectionString = strdup(data);\n        }\n\n        XFree(data);\n\n        if (*selectionString)\n            break;\n    }\n\n    if (!*selectionString)\n    {\n        _glfwInputError(GLFW_FORMAT_UNAVAILABLE,\n                        \"X11: Failed to convert selection to string\");\n    }\n\n    return *selectionString;\n}\n\n// Make the specified window and its video mode active on its monitor\n//\nstatic GLFWbool acquireMonitor(_GLFWwindow* window)\n{\n    GLFWbool status;\n\n    if (_glfw.x11.saver.count == 0)\n    {\n        // Remember old screen saver settings\n        XGetScreenSaver(_glfw.x11.display,\n                        &_glfw.x11.saver.timeout,\n                        &_glfw.x11.saver.interval,\n                        &_glfw.x11.saver.blanking,\n                        &_glfw.x11.saver.exposure);\n\n        // Disable screen saver\n        XSetScreenSaver(_glfw.x11.display, 0, 0, DontPreferBlanking,\n                        DefaultExposures);\n    }\n\n    if (!window->monitor->window)\n        _glfw.x11.saver.count++;\n\n    status = _glfwSetVideoModeX11(window->monitor, &window->videoMode);\n\n    if (window->x11.overrideRedirect)\n    {\n        int xpos, ypos;\n        GLFWvidmode mode;\n\n        // Manually position the window over its monitor\n        _glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);\n        _glfwPlatformGetVideoMode(window->monitor, &mode);\n\n        XMoveResizeWindow(_glfw.x11.display, window->x11.handle,\n                          xpos, ypos, mode.width, mode.height);\n    }\n\n    _glfwInputMonitorWindow(window->monitor, window);\n    return status;\n}\n\n// Remove the window and restore the original video mode\n//\nstatic void releaseMonitor(_GLFWwindow* window)\n{\n    if (window->monitor->window != window)\n        return;\n\n    _glfwInputMonitorWindow(window->monitor, NULL);\n    _glfwRestoreVideoModeX11(window->monitor);\n\n    _glfw.x11.saver.count--;\n\n    if (_glfw.x11.saver.count == 0)\n    {\n        // Restore old screen saver settings\n        XSetScreenSaver(_glfw.x11.display,\n                        _glfw.x11.saver.timeout,\n                        _glfw.x11.saver.interval,\n                        _glfw.x11.saver.blanking,\n                        _glfw.x11.saver.exposure);\n    }\n}\n\n// Process the specified X event\n//\nstatic void processEvent(XEvent *event)\n{\n    _GLFWwindow* window = NULL;\n    int keycode = 0;\n    Bool filtered = False;\n\n    // HACK: Save scancode as some IMs clear the field in XFilterEvent\n    if (event->type == KeyPress || event->type == KeyRelease)\n        keycode = event->xkey.keycode;\n\n    if (_glfw.x11.im)\n        filtered = XFilterEvent(event, None);\n\n    if (_glfw.x11.randr.available)\n    {\n        if (event->type == _glfw.x11.randr.eventBase + RRNotify)\n        {\n            XRRUpdateConfiguration(event);\n            _glfwPollMonitorsX11();\n            return;\n        }\n    }\n\n    if (event->type == GenericEvent)\n    {\n        if (_glfw.x11.xi.available)\n        {\n            _GLFWwindow* window = _glfw.x11.disabledCursorWindow;\n\n            if (window &&\n                event->xcookie.extension == _glfw.x11.xi.majorOpcode &&\n                XGetEventData(_glfw.x11.display, &event->xcookie) &&\n                event->xcookie.evtype == XI_RawMotion)\n            {\n                XIRawEvent* re = event->xcookie.data;\n                if (re->valuators.mask_len)\n                {\n                    const double* values = re->raw_values;\n                    double xpos = window->virtualCursorPosX;\n                    double ypos = window->virtualCursorPosY;\n\n                    if (XIMaskIsSet(re->valuators.mask, 0))\n                    {\n                        xpos += *values;\n                        values++;\n                    }\n\n                    if (XIMaskIsSet(re->valuators.mask, 1))\n                        ypos += *values;\n\n                    _glfwInputCursorPos(window, xpos, ypos);\n                }\n            }\n\n            XFreeEventData(_glfw.x11.display, &event->xcookie);\n        }\n\n        return;\n    }\n\n    if (event->type == SelectionClear)\n    {\n        handleSelectionClear(event);\n        return;\n    }\n    else if (event->type == SelectionRequest)\n    {\n        handleSelectionRequest(event);\n        return;\n    }\n\n    window = findWindowByHandle(event->xany.window);\n    if (window == NULL)\n    {\n        // This is an event for a window that has already been destroyed\n        return;\n    }\n\n    switch (event->type)\n    {\n        case KeyPress:\n        {\n            const int key = translateKey(keycode);\n            const int mods = translateState(event->xkey.state);\n            const int plain = !(mods & (GLFW_MOD_CONTROL | GLFW_MOD_ALT));\n\n            if (window->x11.ic)\n            {\n                // HACK: Ignore duplicate key press events generated by ibus\n                //       These have the same timestamp as the original event\n                //       Corresponding release events are filtered out\n                //       implicitly by the GLFW key repeat logic\n                if (window->x11.lastKeyTime < event->xkey.time)\n                {\n                    if (keycode)\n                        _glfwInputKey(window, key, keycode, GLFW_PRESS, mods);\n\n                    window->x11.lastKeyTime = event->xkey.time;\n                }\n\n                if (!filtered)\n                {\n                    int count;\n                    Status status;\n#if defined(X_HAVE_UTF8_STRING)\n                    char buffer[100];\n                    char* chars = buffer;\n\n                    count = Xutf8LookupString(window->x11.ic,\n                                              &event->xkey,\n                                              buffer, sizeof(buffer) - 1,\n                                              NULL, &status);\n\n                    if (status == XBufferOverflow)\n                    {\n                        chars = calloc(count + 1, 1);\n                        count = Xutf8LookupString(window->x11.ic,\n                                                  &event->xkey,\n                                                  chars, count,\n                                                  NULL, &status);\n                    }\n\n                    if (status == XLookupChars || status == XLookupBoth)\n                    {\n                        const char* c = chars;\n                        chars[count] = '\\0';\n                        while (c - chars < count)\n                            _glfwInputChar(window, decodeUTF8(&c), mods, plain);\n                    }\n#else /*X_HAVE_UTF8_STRING*/\n                    wchar_t buffer[16];\n                    wchar_t* chars = buffer;\n\n                    count = XwcLookupString(window->x11.ic,\n                                            &event->xkey,\n                                            buffer,\n                                            sizeof(buffer) / sizeof(wchar_t),\n                                            NULL,\n                                            &status);\n\n                    if (status == XBufferOverflow)\n                    {\n                        chars = calloc(count, sizeof(wchar_t));\n                        count = XwcLookupString(window->x11.ic,\n                                                &event->xkey,\n                                                chars, count,\n                                                NULL, &status);\n                    }\n\n                    if (status == XLookupChars || status == XLookupBoth)\n                    {\n                        int i;\n                        for (i = 0;  i < count;  i++)\n                            _glfwInputChar(window, chars[i], mods, plain);\n                    }\n#endif /*X_HAVE_UTF8_STRING*/\n\n                    if (chars != buffer)\n                        free(chars);\n                }\n            }\n            else\n            {\n                KeySym keysym;\n                XLookupString(&event->xkey, NULL, 0, &keysym, NULL);\n\n                _glfwInputKey(window, key, keycode, GLFW_PRESS, mods);\n\n                const long character = _glfwKeySym2Unicode(keysym);\n                if (character != -1)\n                    _glfwInputChar(window, character, mods, plain);\n            }\n\n            return;\n        }\n\n        case KeyRelease:\n        {\n            const int key = translateKey(keycode);\n            const int mods = translateState(event->xkey.state);\n\n            if (!_glfw.x11.xkb.detectable)\n            {\n                // HACK: Key repeat events will arrive as KeyRelease/KeyPress\n                //       pairs with similar or identical time stamps\n                //       The key repeat logic in _glfwInputKey expects only key\n                //       presses to repeat, so detect and discard release events\n                if (XEventsQueued(_glfw.x11.display, QueuedAfterReading))\n                {\n                    XEvent next;\n                    XPeekEvent(_glfw.x11.display, &next);\n\n                    if (next.type == KeyPress &&\n                        next.xkey.window == event->xkey.window &&\n                        next.xkey.keycode == keycode)\n                    {\n                        // HACK: The time of repeat events sometimes doesn't\n                        //       match that of the press event, so add an\n                        //       epsilon\n                        //       Toshiyuki Takahashi can press a button\n                        //       16 times per second so it's fairly safe to\n                        //       assume that no human is pressing the key 50\n                        //       times per second (value is ms)\n                        if ((next.xkey.time - event->xkey.time) < 20)\n                        {\n                            // This is very likely a server-generated key repeat\n                            // event, so ignore it\n                            return;\n                        }\n                    }\n                }\n            }\n\n            _glfwInputKey(window, key, keycode, GLFW_RELEASE, mods);\n            return;\n        }\n\n        case ButtonPress:\n        {\n            const int mods = translateState(event->xbutton.state);\n\n            if (event->xbutton.button == Button1)\n                _glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS, mods);\n            else if (event->xbutton.button == Button2)\n                _glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS, mods);\n            else if (event->xbutton.button == Button3)\n                _glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS, mods);\n\n            // Modern X provides scroll events as mouse button presses\n            else if (event->xbutton.button == Button4)\n                _glfwInputScroll(window, 0.0, 1.0);\n            else if (event->xbutton.button == Button5)\n                _glfwInputScroll(window, 0.0, -1.0);\n            else if (event->xbutton.button == Button6)\n                _glfwInputScroll(window, 1.0, 0.0);\n            else if (event->xbutton.button == Button7)\n                _glfwInputScroll(window, -1.0, 0.0);\n\n            else\n            {\n                // Additional buttons after 7 are treated as regular buttons\n                // We subtract 4 to fill the gap left by scroll input above\n                _glfwInputMouseClick(window,\n                                     event->xbutton.button - Button1 - 4,\n                                     GLFW_PRESS,\n                                     mods);\n            }\n\n            return;\n        }\n\n        case ButtonRelease:\n        {\n            const int mods = translateState(event->xbutton.state);\n\n            if (event->xbutton.button == Button1)\n            {\n                _glfwInputMouseClick(window,\n                                     GLFW_MOUSE_BUTTON_LEFT,\n                                     GLFW_RELEASE,\n                                     mods);\n            }\n            else if (event->xbutton.button == Button2)\n            {\n                _glfwInputMouseClick(window,\n                                     GLFW_MOUSE_BUTTON_MIDDLE,\n                                     GLFW_RELEASE,\n                                     mods);\n            }\n            else if (event->xbutton.button == Button3)\n            {\n                _glfwInputMouseClick(window,\n                                     GLFW_MOUSE_BUTTON_RIGHT,\n                                     GLFW_RELEASE,\n                                     mods);\n            }\n            else if (event->xbutton.button > Button7)\n            {\n                // Additional buttons after 7 are treated as regular buttons\n                // We subtract 4 to fill the gap left by scroll input above\n                _glfwInputMouseClick(window,\n                                     event->xbutton.button - Button1 - 4,\n                                     GLFW_RELEASE,\n                                     mods);\n            }\n\n            return;\n        }\n\n        case EnterNotify:\n        {\n            // HACK: This is a workaround for WMs (KWM, Fluxbox) that otherwise\n            //       ignore the defined cursor for hidden cursor mode\n            if (window->cursorMode == GLFW_CURSOR_HIDDEN)\n                _glfwPlatformSetCursorMode(window, GLFW_CURSOR_HIDDEN);\n\n            _glfwInputCursorEnter(window, GLFW_TRUE);\n            return;\n        }\n\n        case LeaveNotify:\n        {\n            _glfwInputCursorEnter(window, GLFW_FALSE);\n            return;\n        }\n\n        case MotionNotify:\n        {\n            const int x = event->xmotion.x;\n            const int y = event->xmotion.y;\n\n            if (x != window->x11.warpCursorPosX ||\n                y != window->x11.warpCursorPosY)\n            {\n                // The cursor was moved by something other than GLFW\n\n                if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                {\n                    if (_glfw.x11.disabledCursorWindow != window)\n                        return;\n                    if (_glfw.x11.xi.available)\n                        return;\n\n                    const int dx = x - window->x11.lastCursorPosX;\n                    const int dy = y - window->x11.lastCursorPosY;\n\n                    _glfwInputCursorPos(window,\n                                        window->virtualCursorPosX + dx,\n                                        window->virtualCursorPosY + dy);\n                }\n                else\n                    _glfwInputCursorPos(window, x, y);\n            }\n\n            window->x11.lastCursorPosX = x;\n            window->x11.lastCursorPosY = y;\n            return;\n        }\n\n        case ConfigureNotify:\n        {\n            if (event->xconfigure.width != window->x11.width ||\n                event->xconfigure.height != window->x11.height)\n            {\n                _glfwInputFramebufferSize(window,\n                                          event->xconfigure.width,\n                                          event->xconfigure.height);\n\n                _glfwInputWindowSize(window,\n                                     event->xconfigure.width,\n                                     event->xconfigure.height);\n\n                window->x11.width = event->xconfigure.width;\n                window->x11.height = event->xconfigure.height;\n            }\n\n            if (event->xconfigure.x != window->x11.xpos ||\n                event->xconfigure.y != window->x11.ypos)\n            {\n                if (window->x11.overrideRedirect || event->xany.send_event)\n                {\n                    _glfwInputWindowPos(window,\n                                        event->xconfigure.x,\n                                        event->xconfigure.y);\n\n                    window->x11.xpos = event->xconfigure.x;\n                    window->x11.ypos = event->xconfigure.y;\n                }\n            }\n\n            return;\n        }\n\n        case ClientMessage:\n        {\n            // Custom client message, probably from the window manager\n\n            if (filtered)\n                return;\n\n            if (event->xclient.message_type == None)\n                return;\n\n            if (event->xclient.message_type == _glfw.x11.WM_PROTOCOLS)\n            {\n                const Atom protocol = event->xclient.data.l[0];\n                if (protocol == None)\n                    return;\n\n                if (protocol == _glfw.x11.WM_DELETE_WINDOW)\n                {\n                    // The window manager was asked to close the window, for\n                    // example by the user pressing a 'close' window decoration\n                    // button\n                    _glfwInputWindowCloseRequest(window);\n                }\n                else if (protocol == _glfw.x11.NET_WM_PING)\n                {\n                    // The window manager is pinging the application to ensure\n                    // it's still responding to events\n\n                    XEvent reply = *event;\n                    reply.xclient.window = _glfw.x11.root;\n\n                    XSendEvent(_glfw.x11.display, _glfw.x11.root,\n                               False,\n                               SubstructureNotifyMask | SubstructureRedirectMask,\n                               &reply);\n                }\n            }\n            else if (event->xclient.message_type == _glfw.x11.XdndEnter)\n            {\n                // A drag operation has entered the window\n                unsigned long i, count;\n                Atom* formats = NULL;\n                const GLFWbool list = event->xclient.data.l[1] & 1;\n\n                _glfw.x11.xdnd.source  = event->xclient.data.l[0];\n                _glfw.x11.xdnd.version = event->xclient.data.l[1] >> 24;\n                _glfw.x11.xdnd.format  = None;\n\n                if (_glfw.x11.xdnd.version > _GLFW_XDND_VERSION)\n                    return;\n\n                if (list)\n                {\n                    count = _glfwGetWindowPropertyX11(_glfw.x11.xdnd.source,\n                                                      _glfw.x11.XdndTypeList,\n                                                      XA_ATOM,\n                                                      (unsigned char**) &formats);\n                }\n                else\n                {\n                    count = 3;\n                    formats = (Atom*) event->xclient.data.l + 2;\n                }\n\n                for (i = 0;  i < count;  i++)\n                {\n                    if (formats[i] == _glfw.x11.text_uri_list)\n                    {\n                        _glfw.x11.xdnd.format = _glfw.x11.text_uri_list;\n                        break;\n                    }\n                }\n\n                if (list && formats)\n                    XFree(formats);\n            }\n            else if (event->xclient.message_type == _glfw.x11.XdndDrop)\n            {\n                // The drag operation has finished by dropping on the window\n                Time time = CurrentTime;\n\n                if (_glfw.x11.xdnd.version > _GLFW_XDND_VERSION)\n                    return;\n\n                if (_glfw.x11.xdnd.format)\n                {\n                    if (_glfw.x11.xdnd.version >= 1)\n                        time = event->xclient.data.l[2];\n\n                    // Request the chosen format from the source window\n                    XConvertSelection(_glfw.x11.display,\n                                      _glfw.x11.XdndSelection,\n                                      _glfw.x11.xdnd.format,\n                                      _glfw.x11.XdndSelection,\n                                      window->x11.handle,\n                                      time);\n                }\n                else if (_glfw.x11.xdnd.version >= 2)\n                {\n                    XEvent reply;\n                    memset(&reply, 0, sizeof(reply));\n\n                    reply.type = ClientMessage;\n                    reply.xclient.window = _glfw.x11.xdnd.source;\n                    reply.xclient.message_type = _glfw.x11.XdndFinished;\n                    reply.xclient.format = 32;\n                    reply.xclient.data.l[0] = window->x11.handle;\n                    reply.xclient.data.l[1] = 0; // The drag was rejected\n                    reply.xclient.data.l[2] = None;\n\n                    XSendEvent(_glfw.x11.display, _glfw.x11.xdnd.source,\n                               False, NoEventMask, &reply);\n                    XFlush(_glfw.x11.display);\n                }\n            }\n            else if (event->xclient.message_type == _glfw.x11.XdndPosition)\n            {\n                // The drag operation has moved over the window\n                const int xabs = (event->xclient.data.l[2] >> 16) & 0xffff;\n                const int yabs = (event->xclient.data.l[2]) & 0xffff;\n                Window dummy;\n                int xpos, ypos;\n\n                if (_glfw.x11.xdnd.version > _GLFW_XDND_VERSION)\n                    return;\n\n                XTranslateCoordinates(_glfw.x11.display,\n                                      _glfw.x11.root,\n                                      window->x11.handle,\n                                      xabs, yabs,\n                                      &xpos, &ypos,\n                                      &dummy);\n\n                _glfwInputCursorPos(window, xpos, ypos);\n\n                XEvent reply;\n                memset(&reply, 0, sizeof(reply));\n\n                reply.type = ClientMessage;\n                reply.xclient.window = _glfw.x11.xdnd.source;\n                reply.xclient.message_type = _glfw.x11.XdndStatus;\n                reply.xclient.format = 32;\n                reply.xclient.data.l[0] = window->x11.handle;\n                reply.xclient.data.l[2] = 0; // Specify an empty rectangle\n                reply.xclient.data.l[3] = 0;\n\n                if (_glfw.x11.xdnd.format)\n                {\n                    // Reply that we are ready to copy the dragged data\n                    reply.xclient.data.l[1] = 1; // Accept with no rectangle\n                    if (_glfw.x11.xdnd.version >= 2)\n                        reply.xclient.data.l[4] = _glfw.x11.XdndActionCopy;\n                }\n\n                XSendEvent(_glfw.x11.display, _glfw.x11.xdnd.source,\n                           False, NoEventMask, &reply);\n                XFlush(_glfw.x11.display);\n            }\n\n            return;\n        }\n\n        case SelectionNotify:\n        {\n            if (event->xselection.property == _glfw.x11.XdndSelection)\n            {\n                // The converted data from the drag operation has arrived\n                char* data;\n                const unsigned long result =\n                    _glfwGetWindowPropertyX11(event->xselection.requestor,\n                                              event->xselection.property,\n                                              event->xselection.target,\n                                              (unsigned char**) &data);\n\n                if (result)\n                {\n                    int i, count;\n                    char** paths = parseUriList(data, &count);\n\n                    _glfwInputDrop(window, count, (const char**) paths);\n\n                    for (i = 0;  i < count;  i++)\n                        free(paths[i]);\n                    free(paths);\n                }\n\n                if (data)\n                    XFree(data);\n\n                if (_glfw.x11.xdnd.version >= 2)\n                {\n                    XEvent reply;\n                    memset(&reply, 0, sizeof(reply));\n\n                    reply.type = ClientMessage;\n                    reply.xclient.window = _glfw.x11.xdnd.source;\n                    reply.xclient.message_type = _glfw.x11.XdndFinished;\n                    reply.xclient.format = 32;\n                    reply.xclient.data.l[0] = window->x11.handle;\n                    reply.xclient.data.l[1] = result;\n                    reply.xclient.data.l[2] = _glfw.x11.XdndActionCopy;\n\n                    XSendEvent(_glfw.x11.display, _glfw.x11.xdnd.source,\n                               False, NoEventMask, &reply);\n                    XFlush(_glfw.x11.display);\n                }\n            }\n\n            return;\n        }\n\n        case FocusIn:\n        {\n            if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);\n\n            if (event->xfocus.mode == NotifyGrab ||\n                event->xfocus.mode == NotifyUngrab)\n            {\n                // Ignore focus events from popup indicator windows, window menu\n                // key chords and window dragging\n                return;\n            }\n\n            if (window->x11.ic)\n                XSetICFocus(window->x11.ic);\n\n            _glfwInputWindowFocus(window, GLFW_TRUE);\n            return;\n        }\n\n        case FocusOut:\n        {\n            if (window->cursorMode == GLFW_CURSOR_DISABLED)\n                _glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL);\n\n            if (event->xfocus.mode == NotifyGrab ||\n                event->xfocus.mode == NotifyUngrab)\n            {\n                // Ignore focus events from popup indicator windows, window menu\n                // key chords and window dragging\n                return;\n            }\n\n            if (window->x11.ic)\n                XUnsetICFocus(window->x11.ic);\n\n            if (window->monitor && window->autoIconify)\n                _glfwPlatformIconifyWindow(window);\n\n            _glfwInputWindowFocus(window, GLFW_FALSE);\n            return;\n        }\n\n        case Expose:\n        {\n            _glfwInputWindowDamage(window);\n            return;\n        }\n\n        case PropertyNotify:\n        {\n            if (event->xproperty.state != PropertyNewValue)\n                return;\n\n            if (event->xproperty.atom == _glfw.x11.WM_STATE)\n            {\n                const int state = getWindowState(window);\n                if (state != IconicState && state != NormalState)\n                    return;\n\n                const GLFWbool iconified = (state == IconicState);\n                if (window->x11.iconified != iconified)\n                {\n                    if (window->monitor)\n                    {\n                        if (iconified)\n                            releaseMonitor(window);\n                        else\n                            acquireMonitor(window);\n                    }\n\n                    window->x11.iconified = iconified;\n                    _glfwInputWindowIconify(window, iconified);\n                }\n            }\n            else if (event->xproperty.atom == _glfw.x11.NET_WM_STATE)\n            {\n                const GLFWbool maximized = _glfwPlatformWindowMaximized(window);\n                if (window->x11.maximized != maximized)\n                {\n                    window->x11.maximized = maximized;\n                    _glfwInputWindowMaximize(window, maximized);\n                }\n            }\n\n            return;\n        }\n\n        case DestroyNotify:\n            return;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Retrieve a single window property of the specified type\n// Inspired by fghGetWindowProperty from freeglut\n//\nunsigned long _glfwGetWindowPropertyX11(Window window,\n                                        Atom property,\n                                        Atom type,\n                                        unsigned char** value)\n{\n    Atom actualType;\n    int actualFormat;\n    unsigned long itemCount, bytesAfter;\n\n    XGetWindowProperty(_glfw.x11.display,\n                       window,\n                       property,\n                       0,\n                       LONG_MAX,\n                       False,\n                       type,\n                       &actualType,\n                       &actualFormat,\n                       &itemCount,\n                       &bytesAfter,\n                       value);\n\n    return itemCount;\n}\n\nGLFWbool _glfwIsVisualTransparentX11(Visual* visual)\n{\n    if (!_glfw.x11.xrender.available)\n        return GLFW_FALSE;\n\n    XRenderPictFormat* pf = XRenderFindVisualFormat(_glfw.x11.display, visual);\n    return pf && pf->direct.alphaMask;\n}\n\n// Push contents of our selection to clipboard manager\n//\nvoid _glfwPushSelectionToManagerX11(void)\n{\n    XConvertSelection(_glfw.x11.display,\n                      _glfw.x11.CLIPBOARD_MANAGER,\n                      _glfw.x11.SAVE_TARGETS,\n                      None,\n                      _glfw.x11.helperWindowHandle,\n                      CurrentTime);\n\n    for (;;)\n    {\n        XEvent event;\n\n        while (XCheckIfEvent(_glfw.x11.display, &event, isSelectionEvent, NULL))\n        {\n            switch (event.type)\n            {\n                case SelectionRequest:\n                    handleSelectionRequest(&event);\n                    break;\n\n                case SelectionClear:\n                    handleSelectionClear(&event);\n                    break;\n\n                case SelectionNotify:\n                {\n                    if (event.xselection.target == _glfw.x11.SAVE_TARGETS)\n                    {\n                        // This means one of two things; either the selection\n                        // was not owned, which means there is no clipboard\n                        // manager, or the transfer to the clipboard manager has\n                        // completed\n                        // In either case, it means we are done here\n                        return;\n                    }\n\n                    break;\n                }\n            }\n        }\n\n        waitForEvent(NULL);\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW platform API                      //////\n//////////////////////////////////////////////////////////////////////////\n\nint _glfwPlatformCreateWindow(_GLFWwindow* window,\n                              const _GLFWwndconfig* wndconfig,\n                              const _GLFWctxconfig* ctxconfig,\n                              const _GLFWfbconfig* fbconfig)\n{\n    Visual* visual;\n    int depth;\n\n    if (ctxconfig->client != GLFW_NO_API)\n    {\n        if (ctxconfig->source == GLFW_NATIVE_CONTEXT_API)\n        {\n            if (!_glfwInitGLX())\n                return GLFW_FALSE;\n            if (!_glfwChooseVisualGLX(wndconfig, ctxconfig, fbconfig, &visual, &depth))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_EGL_CONTEXT_API)\n        {\n            if (!_glfwInitEGL())\n                return GLFW_FALSE;\n            if (!_glfwChooseVisualEGL(wndconfig, ctxconfig, fbconfig, &visual, &depth))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API)\n        {\n            if (!_glfwInitOSMesa())\n                return GLFW_FALSE;\n        }\n    }\n\n    if (ctxconfig->client == GLFW_NO_API ||\n        ctxconfig->source == GLFW_OSMESA_CONTEXT_API)\n    {\n        visual = DefaultVisual(_glfw.x11.display, _glfw.x11.screen);\n        depth = DefaultDepth(_glfw.x11.display, _glfw.x11.screen);\n    }\n\n    if (!createNativeWindow(window, wndconfig, visual, depth))\n        return GLFW_FALSE;\n\n    if (ctxconfig->client != GLFW_NO_API)\n    {\n        if (ctxconfig->source == GLFW_NATIVE_CONTEXT_API)\n        {\n            if (!_glfwCreateContextGLX(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_EGL_CONTEXT_API)\n        {\n            if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n        else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API)\n        {\n            if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))\n                return GLFW_FALSE;\n        }\n    }\n\n    if (window->monitor)\n    {\n        _glfwPlatformShowWindow(window);\n        updateWindowMode(window);\n        if (!acquireMonitor(window))\n            return GLFW_FALSE;\n\n        if (wndconfig->centerCursor)\n            centerCursor(window);\n    }\n\n    XFlush(_glfw.x11.display);\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyWindow(_GLFWwindow* window)\n{\n    if (_glfw.x11.disabledCursorWindow == window)\n        _glfw.x11.disabledCursorWindow = NULL;\n\n    if (window->monitor)\n        releaseMonitor(window);\n\n    if (window->x11.ic)\n    {\n        XDestroyIC(window->x11.ic);\n        window->x11.ic = NULL;\n    }\n\n    if (window->context.destroy)\n        window->context.destroy(window);\n\n    if (window->x11.handle)\n    {\n        XDeleteContext(_glfw.x11.display, window->x11.handle, _glfw.x11.context);\n        XUnmapWindow(_glfw.x11.display, window->x11.handle);\n        XDestroyWindow(_glfw.x11.display, window->x11.handle);\n        window->x11.handle = (Window) 0;\n    }\n\n    if (window->x11.colormap)\n    {\n        XFreeColormap(_glfw.x11.display, window->x11.colormap);\n        window->x11.colormap = (Colormap) 0;\n    }\n\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)\n{\n#if defined(X_HAVE_UTF8_STRING)\n    Xutf8SetWMProperties(_glfw.x11.display,\n                         window->x11.handle,\n                         title, title,\n                         NULL, 0,\n                         NULL, NULL, NULL);\n#else\n    // This may be a slightly better fallback than using XStoreName and\n    // XSetIconName, which always store their arguments using STRING\n    XmbSetWMProperties(_glfw.x11.display,\n                       window->x11.handle,\n                       title, title,\n                       NULL, 0,\n                       NULL, NULL, NULL);\n#endif\n\n    XChangeProperty(_glfw.x11.display,  window->x11.handle,\n                    _glfw.x11.NET_WM_NAME, _glfw.x11.UTF8_STRING, 8,\n                    PropModeReplace,\n                    (unsigned char*) title, strlen(title));\n\n    XChangeProperty(_glfw.x11.display,  window->x11.handle,\n                    _glfw.x11.NET_WM_ICON_NAME, _glfw.x11.UTF8_STRING, 8,\n                    PropModeReplace,\n                    (unsigned char*) title, strlen(title));\n\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformSetWindowIcon(_GLFWwindow* window,\n                                int count, const GLFWimage* images)\n{\n    if (count)\n    {\n        int i, j, longCount = 0;\n\n        for (i = 0;  i < count;  i++)\n            longCount += 2 + images[i].width * images[i].height;\n\n        long* icon = calloc(longCount, sizeof(long));\n        long* target = icon;\n\n        for (i = 0;  i < count;  i++)\n        {\n            *target++ = images[i].width;\n            *target++ = images[i].height;\n\n            for (j = 0;  j < images[i].width * images[i].height;  j++)\n            {\n                *target++ = (images[i].pixels[j * 4 + 0] << 16) |\n                            (images[i].pixels[j * 4 + 1] <<  8) |\n                            (images[i].pixels[j * 4 + 2] <<  0) |\n                            (images[i].pixels[j * 4 + 3] << 24);\n            }\n        }\n\n        XChangeProperty(_glfw.x11.display, window->x11.handle,\n                        _glfw.x11.NET_WM_ICON,\n                        XA_CARDINAL, 32,\n                        PropModeReplace,\n                        (unsigned char*) icon,\n                        longCount);\n\n        free(icon);\n    }\n    else\n    {\n        XDeleteProperty(_glfw.x11.display, window->x11.handle,\n                        _glfw.x11.NET_WM_ICON);\n    }\n\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)\n{\n    Window dummy;\n    int x, y;\n\n    XTranslateCoordinates(_glfw.x11.display, window->x11.handle, _glfw.x11.root,\n                          0, 0, &x, &y, &dummy);\n\n    if (xpos)\n        *xpos = x;\n    if (ypos)\n        *ypos = y;\n}\n\nvoid _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)\n{\n    // HACK: Explicitly setting PPosition to any value causes some WMs, notably\n    //       Compiz and Metacity, to honor the position of unmapped windows\n    if (!_glfwPlatformWindowVisible(window))\n    {\n        long supplied;\n        XSizeHints* hints = XAllocSizeHints();\n\n        if (XGetWMNormalHints(_glfw.x11.display, window->x11.handle, hints, &supplied))\n        {\n            hints->flags |= PPosition;\n            hints->x = hints->y = 0;\n\n            XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);\n        }\n\n        XFree(hints);\n    }\n\n    XMoveWindow(_glfw.x11.display, window->x11.handle, xpos, ypos);\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)\n{\n    XWindowAttributes attribs;\n    XGetWindowAttributes(_glfw.x11.display, window->x11.handle, &attribs);\n\n    if (width)\n        *width = attribs.width;\n    if (height)\n        *height = attribs.height;\n}\n\nvoid _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)\n{\n    if (window->monitor)\n    {\n        if (window->monitor->window == window)\n            acquireMonitor(window);\n    }\n    else\n    {\n        if (!window->resizable)\n            updateNormalHints(window, width, height);\n\n        XResizeWindow(_glfw.x11.display, window->x11.handle, width, height);\n    }\n\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,\n                                      int minwidth, int minheight,\n                                      int maxwidth, int maxheight)\n{\n    int width, height;\n    _glfwPlatformGetWindowSize(window, &width, &height);\n    updateNormalHints(window, width, height);\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)\n{\n    int width, height;\n    _glfwPlatformGetWindowSize(window, &width, &height);\n    updateNormalHints(window, width, height);\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)\n{\n    _glfwPlatformGetWindowSize(window, width, height);\n}\n\nvoid _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,\n                                     int* left, int* top,\n                                     int* right, int* bottom)\n{\n    long* extents = NULL;\n\n    if (window->monitor || !window->decorated)\n        return;\n\n    if (_glfw.x11.NET_FRAME_EXTENTS == None)\n        return;\n\n    if (!_glfwPlatformWindowVisible(window) &&\n        _glfw.x11.NET_REQUEST_FRAME_EXTENTS)\n    {\n        XEvent event;\n        double timeout = 0.5;\n\n        // Ensure _NET_FRAME_EXTENTS is set, allowing glfwGetWindowFrameSize to\n        // function before the window is mapped\n        sendEventToWM(window, _glfw.x11.NET_REQUEST_FRAME_EXTENTS,\n                      0, 0, 0, 0, 0);\n\n        // HACK: Use a timeout because earlier versions of some window managers\n        //       (at least Unity, Fluxbox and Xfwm) failed to send the reply\n        //       They have been fixed but broken versions are still in the wild\n        //       If you are affected by this and your window manager is NOT\n        //       listed above, PLEASE report it to their and our issue trackers\n        while (!XCheckIfEvent(_glfw.x11.display,\n                              &event,\n                              isFrameExtentsEvent,\n                              (XPointer) window))\n        {\n            if (!waitForEvent(&timeout))\n            {\n                _glfwInputError(GLFW_PLATFORM_ERROR,\n                                \"X11: The window manager has a broken _NET_REQUEST_FRAME_EXTENTS implementation; please report this issue\");\n                return;\n            }\n        }\n    }\n\n    if (_glfwGetWindowPropertyX11(window->x11.handle,\n                                  _glfw.x11.NET_FRAME_EXTENTS,\n                                  XA_CARDINAL,\n                                  (unsigned char**) &extents) == 4)\n    {\n        if (left)\n            *left = extents[0];\n        if (top)\n            *top = extents[2];\n        if (right)\n            *right = extents[1];\n        if (bottom)\n            *bottom = extents[3];\n    }\n\n    if (extents)\n        XFree(extents);\n}\n\nvoid _glfwPlatformIconifyWindow(_GLFWwindow* window)\n{\n    if (window->x11.overrideRedirect)\n    {\n        // Override-redirect windows cannot be iconified or restored, as those\n        // tasks are performed by the window manager\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"X11: Iconification of full screen windows requires a WM that supports EWMH full screen\");\n        return;\n    }\n\n    XIconifyWindow(_glfw.x11.display, window->x11.handle, _glfw.x11.screen);\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformRestoreWindow(_GLFWwindow* window)\n{\n    if (window->x11.overrideRedirect)\n    {\n        // Override-redirect windows cannot be iconified or restored, as those\n        // tasks are performed by the window manager\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"X11: Iconification of full screen windows requires a WM that supports EWMH full screen\");\n        return;\n    }\n\n    if (_glfwPlatformWindowIconified(window))\n    {\n        XMapWindow(_glfw.x11.display, window->x11.handle);\n        waitForVisibilityNotify(window);\n    }\n    else if (_glfwPlatformWindowVisible(window))\n    {\n        if (_glfw.x11.NET_WM_STATE &&\n            _glfw.x11.NET_WM_STATE_MAXIMIZED_VERT &&\n            _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ)\n        {\n            sendEventToWM(window,\n                          _glfw.x11.NET_WM_STATE,\n                          _NET_WM_STATE_REMOVE,\n                          _glfw.x11.NET_WM_STATE_MAXIMIZED_VERT,\n                          _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ,\n                          1, 0);\n        }\n    }\n\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformMaximizeWindow(_GLFWwindow* window)\n{\n    if (_glfw.x11.NET_WM_STATE &&\n        _glfw.x11.NET_WM_STATE_MAXIMIZED_VERT &&\n        _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ)\n    {\n        sendEventToWM(window,\n                      _glfw.x11.NET_WM_STATE,\n                      _NET_WM_STATE_ADD,\n                      _glfw.x11.NET_WM_STATE_MAXIMIZED_VERT,\n                      _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ,\n                      1, 0);\n        XFlush(_glfw.x11.display);\n    }\n}\n\nvoid _glfwPlatformShowWindow(_GLFWwindow* window)\n{\n    if (_glfwPlatformWindowVisible(window))\n        return;\n\n    XMapWindow(_glfw.x11.display, window->x11.handle);\n    waitForVisibilityNotify(window);\n}\n\nvoid _glfwPlatformHideWindow(_GLFWwindow* window)\n{\n    XUnmapWindow(_glfw.x11.display, window->x11.handle);\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformRequestWindowAttention(_GLFWwindow* window)\n{\n    sendEventToWM(window,\n                  _glfw.x11.NET_WM_STATE,\n                  _NET_WM_STATE_ADD,\n                  _glfw.x11.NET_WM_STATE_DEMANDS_ATTENTION,\n                  0, 1, 0);\n}\n\nvoid _glfwPlatformFocusWindow(_GLFWwindow* window)\n{\n    if (_glfw.x11.NET_ACTIVE_WINDOW)\n        sendEventToWM(window, _glfw.x11.NET_ACTIVE_WINDOW, 1, 0, 0, 0, 0);\n    else\n    {\n        XRaiseWindow(_glfw.x11.display, window->x11.handle);\n        XSetInputFocus(_glfw.x11.display, window->x11.handle,\n                       RevertToParent, CurrentTime);\n    }\n\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformSetWindowMonitor(_GLFWwindow* window,\n                                   _GLFWmonitor* monitor,\n                                   int xpos, int ypos,\n                                   int width, int height,\n                                   int refreshRate)\n{\n    if (window->monitor == monitor)\n    {\n        if (monitor)\n        {\n            if (monitor->window == window)\n                acquireMonitor(window);\n        }\n        else\n        {\n            XMoveResizeWindow(_glfw.x11.display, window->x11.handle,\n                              xpos, ypos, width, height);\n        }\n\n        return;\n    }\n\n    if (window->monitor)\n        releaseMonitor(window);\n\n    _glfwInputWindowMonitorChange(window, monitor);\n    updateNormalHints(window, width, height);\n    updateWindowMode(window);\n\n    if (window->monitor)\n    {\n        XMapRaised(_glfw.x11.display, window->x11.handle);\n        if (waitForVisibilityNotify(window))\n            acquireMonitor(window);\n    }\n    else\n    {\n        XMoveResizeWindow(_glfw.x11.display, window->x11.handle,\n                          xpos, ypos, width, height);\n    }\n\n    XFlush(_glfw.x11.display);\n}\n\nint _glfwPlatformWindowFocused(_GLFWwindow* window)\n{\n    Window focused;\n    int state;\n\n    XGetInputFocus(_glfw.x11.display, &focused, &state);\n    return window->x11.handle == focused;\n}\n\nint _glfwPlatformWindowIconified(_GLFWwindow* window)\n{\n    return getWindowState(window) == IconicState;\n}\n\nint _glfwPlatformWindowVisible(_GLFWwindow* window)\n{\n    XWindowAttributes wa;\n    XGetWindowAttributes(_glfw.x11.display, window->x11.handle, &wa);\n    return wa.map_state == IsViewable;\n}\n\nint _glfwPlatformWindowMaximized(_GLFWwindow* window)\n{\n    Atom* states;\n    unsigned long i;\n    GLFWbool maximized = GLFW_FALSE;\n    const unsigned long count =\n        _glfwGetWindowPropertyX11(window->x11.handle,\n                                  _glfw.x11.NET_WM_STATE,\n                                  XA_ATOM,\n                                  (unsigned char**) &states);\n\n    for (i = 0;  i < count;  i++)\n    {\n        if (states[i] == _glfw.x11.NET_WM_STATE_MAXIMIZED_VERT ||\n            states[i] == _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ)\n        {\n            maximized = GLFW_TRUE;\n            break;\n        }\n    }\n\n    if (states)\n        XFree(states);\n\n    return maximized;\n}\n\nint _glfwPlatformFramebufferTransparent(_GLFWwindow* window)\n{\n    if (!window->x11.transparent)\n        return GLFW_FALSE;\n\n    // Check whether a compositing manager is running\n    char name[32];\n    snprintf(name, sizeof(name), \"_NET_WM_CM_S%u\", _glfw.x11.screen);\n    const Atom selection = XInternAtom(_glfw.x11.display, name, False);\n    return XGetSelectionOwner(_glfw.x11.display, selection) != None;\n}\n\nvoid _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)\n{\n    int width, height;\n    _glfwPlatformGetWindowSize(window, &width, &height);\n    updateNormalHints(window, width, height);\n}\n\nvoid _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)\n{\n    if (enabled)\n    {\n        XDeleteProperty(_glfw.x11.display,\n                        window->x11.handle,\n                        _glfw.x11.MOTIF_WM_HINTS);\n    }\n    else\n    {\n        struct\n        {\n            unsigned long flags;\n            unsigned long functions;\n            unsigned long decorations;\n            long input_mode;\n            unsigned long status;\n        } hints;\n\n        hints.flags = 2;       // Set decorations\n        hints.decorations = 0; // No decorations\n\n        XChangeProperty(_glfw.x11.display, window->x11.handle,\n                        _glfw.x11.MOTIF_WM_HINTS,\n                        _glfw.x11.MOTIF_WM_HINTS, 32,\n                        PropModeReplace,\n                        (unsigned char*) &hints,\n                        sizeof(hints) / sizeof(long));\n    }\n}\n\nvoid _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)\n{\n    if (!_glfw.x11.NET_WM_STATE || !_glfw.x11.NET_WM_STATE_ABOVE)\n        return;\n\n    if (_glfwPlatformWindowVisible(window))\n    {\n        const Atom action = enabled ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE;\n        sendEventToWM(window,\n                      _glfw.x11.NET_WM_STATE,\n                      action,\n                      _glfw.x11.NET_WM_STATE_ABOVE,\n                      0, 1, 0);\n    }\n    else\n    {\n        Atom* states;\n        unsigned long i, count;\n\n        count = _glfwGetWindowPropertyX11(window->x11.handle,\n                                          _glfw.x11.NET_WM_STATE,\n                                          XA_ATOM,\n                                          (unsigned char**) &states);\n        if (!states)\n            return;\n\n        if (enabled)\n        {\n            for (i = 0;  i < count;  i++)\n            {\n                if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)\n                    break;\n            }\n\n            if (i == count)\n            {\n                XChangeProperty(_glfw.x11.display, window->x11.handle,\n                                _glfw.x11.NET_WM_STATE, XA_ATOM, 32,\n                                PropModeAppend,\n                                (unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE,\n                                1);\n            }\n        }\n        else\n        {\n            for (i = 0;  i < count;  i++)\n            {\n                if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)\n                {\n                    states[i] = states[count - 1];\n                    count--;\n                }\n            }\n\n            XChangeProperty(_glfw.x11.display, window->x11.handle,\n                            _glfw.x11.NET_WM_STATE, XA_ATOM, 32,\n                            PropModeReplace, (unsigned char*) &states, count);\n        }\n\n        XFree(states);\n    }\n\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformPollEvents(void)\n{\n    _GLFWwindow* window;\n\n#if defined(__linux__)\n    _glfwDetectJoystickConnectionLinux();\n#endif\n    int count = XPending(_glfw.x11.display);\n    while (count--)\n    {\n        XEvent event;\n        XNextEvent(_glfw.x11.display, &event);\n        processEvent(&event);\n    }\n\n    window = _glfw.x11.disabledCursorWindow;\n    if (window)\n    {\n        int width, height;\n        _glfwPlatformGetWindowSize(window, &width, &height);\n\n        // NOTE: Re-center the cursor only if it has moved since the last call,\n        //       to avoid breaking glfwWaitEvents with MotionNotify\n        if (window->x11.lastCursorPosX != width / 2 ||\n            window->x11.lastCursorPosY != height / 2)\n        {\n            _glfwPlatformSetCursorPos(window, width / 2, height / 2);\n        }\n    }\n\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformWaitEvents(void)\n{\n    while (!XPending(_glfw.x11.display))\n        waitForEvent(NULL);\n\n    _glfwPlatformPollEvents();\n}\n\nvoid _glfwPlatformWaitEventsTimeout(double timeout)\n{\n    while (!XPending(_glfw.x11.display))\n    {\n        if (!waitForEvent(&timeout))\n            break;\n    }\n\n    _glfwPlatformPollEvents();\n}\n\nvoid _glfwPlatformPostEmptyEvent(void)\n{\n    XEvent event;\n\n    memset(&event, 0, sizeof(event));\n    event.type = ClientMessage;\n    event.xclient.window = _glfw.x11.helperWindowHandle;\n    event.xclient.format = 32; // Data is 32-bit longs\n    event.xclient.message_type = _glfw.x11.NULL_;\n\n    XSendEvent(_glfw.x11.display, _glfw.x11.helperWindowHandle, False, 0, &event);\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)\n{\n    Window root, child;\n    int rootX, rootY, childX, childY;\n    unsigned int mask;\n\n    XQueryPointer(_glfw.x11.display, window->x11.handle,\n                  &root, &child,\n                  &rootX, &rootY, &childX, &childY,\n                  &mask);\n\n    if (xpos)\n        *xpos = childX;\n    if (ypos)\n        *ypos = childY;\n}\n\nvoid _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y)\n{\n    // Store the new position so it can be recognized later\n    window->x11.warpCursorPosX = (int) x;\n    window->x11.warpCursorPosY = (int) y;\n\n    XWarpPointer(_glfw.x11.display, None, window->x11.handle,\n                 0,0,0,0, (int) x, (int) y);\n    XFlush(_glfw.x11.display);\n}\n\nvoid _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)\n{\n    if (mode == GLFW_CURSOR_DISABLED)\n    {\n        if (_glfw.x11.xi.available)\n        {\n            XIEventMask em;\n            unsigned char mask[XIMaskLen(XI_RawMotion)] = { 0 };\n\n            em.deviceid = XIAllMasterDevices;\n            em.mask_len = sizeof(mask);\n            em.mask = mask;\n            XISetMask(mask, XI_RawMotion);\n\n            XISelectEvents(_glfw.x11.display, _glfw.x11.root, &em, 1);\n        }\n\n        _glfw.x11.disabledCursorWindow = window;\n        _glfwPlatformGetCursorPos(window,\n                                  &_glfw.x11.restoreCursorPosX,\n                                  &_glfw.x11.restoreCursorPosY);\n        centerCursor(window);\n        XGrabPointer(_glfw.x11.display, window->x11.handle, True,\n                     ButtonPressMask | ButtonReleaseMask | PointerMotionMask,\n                     GrabModeAsync, GrabModeAsync,\n                     window->x11.handle,\n                     _glfw.x11.hiddenCursorHandle,\n                     CurrentTime);\n    }\n    else if (_glfw.x11.disabledCursorWindow == window)\n    {\n        if (_glfw.x11.xi.available)\n        {\n            XIEventMask em;\n            unsigned char mask[] = { 0 };\n\n            em.deviceid = XIAllMasterDevices;\n            em.mask_len = sizeof(mask);\n            em.mask = mask;\n\n            XISelectEvents(_glfw.x11.display, _glfw.x11.root, &em, 1);\n        }\n\n        _glfw.x11.disabledCursorWindow = NULL;\n        XUngrabPointer(_glfw.x11.display, CurrentTime);\n        _glfwPlatformSetCursorPos(window,\n                                  _glfw.x11.restoreCursorPosX,\n                                  _glfw.x11.restoreCursorPosY);\n    }\n\n    updateCursorImage(window);\n    XFlush(_glfw.x11.display);\n}\n\nconst char* _glfwPlatformGetScancodeName(int scancode)\n{\n    if (!_glfw.x11.xkb.available)\n        return NULL;\n\n    const KeySym keysym = XkbKeycodeToKeysym(_glfw.x11.display, scancode, 0, 0);\n    if (keysym == NoSymbol)\n        return NULL;\n\n    const long ch = _glfwKeySym2Unicode(keysym);\n    if (ch == -1)\n        return NULL;\n\n    const size_t count = encodeUTF8(_glfw.x11.keyName, (unsigned int) ch);\n    if (count == 0)\n        return NULL;\n\n    _glfw.x11.keyName[count] = '\\0';\n    return _glfw.x11.keyName;\n}\n\nint _glfwPlatformGetKeyScancode(int key)\n{\n    return _glfw.x11.scancodes[key];\n}\n\nint _glfwPlatformCreateCursor(_GLFWcursor* cursor,\n                              const GLFWimage* image,\n                              int xhot, int yhot)\n{\n    cursor->x11.handle = _glfwCreateCursorX11(image, xhot, yhot);\n    if (!cursor->x11.handle)\n        return GLFW_FALSE;\n\n    return GLFW_TRUE;\n}\n\nint _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)\n{\n    cursor->x11.handle = XCreateFontCursor(_glfw.x11.display,\n                                           translateCursorShape(shape));\n    if (!cursor->x11.handle)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"X11: Failed to create standard cursor\");\n        return GLFW_FALSE;\n    }\n\n    return GLFW_TRUE;\n}\n\nvoid _glfwPlatformDestroyCursor(_GLFWcursor* cursor)\n{\n    if (cursor->x11.handle)\n        XFreeCursor(_glfw.x11.display, cursor->x11.handle);\n}\n\nvoid _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)\n{\n    if (window->cursorMode == GLFW_CURSOR_NORMAL)\n    {\n        updateCursorImage(window);\n        XFlush(_glfw.x11.display);\n    }\n}\n\nvoid _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string)\n{\n    free(_glfw.x11.clipboardString);\n    _glfw.x11.clipboardString = strdup(string);\n\n    XSetSelectionOwner(_glfw.x11.display,\n                       _glfw.x11.CLIPBOARD,\n                       _glfw.x11.helperWindowHandle,\n                       CurrentTime);\n\n    if (XGetSelectionOwner(_glfw.x11.display, _glfw.x11.CLIPBOARD) !=\n        _glfw.x11.helperWindowHandle)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"X11: Failed to become owner of clipboard selection\");\n    }\n}\n\nconst char* _glfwPlatformGetClipboardString(_GLFWwindow* window)\n{\n    return getSelectionString(_glfw.x11.CLIPBOARD);\n}\n\nvoid _glfwPlatformGetRequiredInstanceExtensions(char** extensions)\n{\n    if (!_glfw.vk.KHR_surface)\n        return;\n\n    if (!_glfw.vk.KHR_xcb_surface || !_glfw.x11.x11xcb.handle)\n    {\n        if (!_glfw.vk.KHR_xlib_surface)\n            return;\n    }\n\n    extensions[0] = \"VK_KHR_surface\";\n\n    // NOTE: VK_KHR_xcb_surface is preferred due to some early ICDs exposing but\n    //       not correctly implementing VK_KHR_xlib_surface\n    if (_glfw.vk.KHR_xcb_surface && _glfw.x11.x11xcb.handle)\n        extensions[1] = \"VK_KHR_xcb_surface\";\n    else\n        extensions[1] = \"VK_KHR_xlib_surface\";\n}\n\nint _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,\n                                                      VkPhysicalDevice device,\n                                                      uint32_t queuefamily)\n{\n    VisualID visualID = XVisualIDFromVisual(DefaultVisual(_glfw.x11.display,\n                                                          _glfw.x11.screen));\n\n    if (_glfw.vk.KHR_xcb_surface && _glfw.x11.x11xcb.handle)\n    {\n        PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR\n            vkGetPhysicalDeviceXcbPresentationSupportKHR =\n            (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)\n            vkGetInstanceProcAddr(instance, \"vkGetPhysicalDeviceXcbPresentationSupportKHR\");\n        if (!vkGetPhysicalDeviceXcbPresentationSupportKHR)\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"X11: Vulkan instance missing VK_KHR_xcb_surface extension\");\n            return GLFW_FALSE;\n        }\n\n        xcb_connection_t* connection = XGetXCBConnection(_glfw.x11.display);\n        if (!connection)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"X11: Failed to retrieve XCB connection\");\n            return GLFW_FALSE;\n        }\n\n        return vkGetPhysicalDeviceXcbPresentationSupportKHR(device,\n                                                            queuefamily,\n                                                            connection,\n                                                            visualID);\n    }\n    else\n    {\n        PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR\n            vkGetPhysicalDeviceXlibPresentationSupportKHR =\n            (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)\n            vkGetInstanceProcAddr(instance, \"vkGetPhysicalDeviceXlibPresentationSupportKHR\");\n        if (!vkGetPhysicalDeviceXlibPresentationSupportKHR)\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"X11: Vulkan instance missing VK_KHR_xlib_surface extension\");\n            return GLFW_FALSE;\n        }\n\n        return vkGetPhysicalDeviceXlibPresentationSupportKHR(device,\n                                                             queuefamily,\n                                                             _glfw.x11.display,\n                                                             visualID);\n    }\n}\n\nVkResult _glfwPlatformCreateWindowSurface(VkInstance instance,\n                                          _GLFWwindow* window,\n                                          const VkAllocationCallbacks* allocator,\n                                          VkSurfaceKHR* surface)\n{\n    if (_glfw.vk.KHR_xcb_surface && _glfw.x11.x11xcb.handle)\n    {\n        VkResult err;\n        VkXcbSurfaceCreateInfoKHR sci;\n        PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR;\n\n        xcb_connection_t* connection = XGetXCBConnection(_glfw.x11.display);\n        if (!connection)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"X11: Failed to retrieve XCB connection\");\n            return VK_ERROR_EXTENSION_NOT_PRESENT;\n        }\n\n        vkCreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)\n            vkGetInstanceProcAddr(instance, \"vkCreateXcbSurfaceKHR\");\n        if (!vkCreateXcbSurfaceKHR)\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"X11: Vulkan instance missing VK_KHR_xcb_surface extension\");\n            return VK_ERROR_EXTENSION_NOT_PRESENT;\n        }\n\n        memset(&sci, 0, sizeof(sci));\n        sci.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;\n        sci.connection = connection;\n        sci.window = window->x11.handle;\n\n        err = vkCreateXcbSurfaceKHR(instance, &sci, allocator, surface);\n        if (err)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"X11: Failed to create Vulkan XCB surface: %s\",\n                            _glfwGetVulkanResultString(err));\n        }\n\n        return err;\n    }\n    else\n    {\n        VkResult err;\n        VkXlibSurfaceCreateInfoKHR sci;\n        PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;\n\n        vkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)\n            vkGetInstanceProcAddr(instance, \"vkCreateXlibSurfaceKHR\");\n        if (!vkCreateXlibSurfaceKHR)\n        {\n            _glfwInputError(GLFW_API_UNAVAILABLE,\n                            \"X11: Vulkan instance missing VK_KHR_xlib_surface extension\");\n            return VK_ERROR_EXTENSION_NOT_PRESENT;\n        }\n\n        memset(&sci, 0, sizeof(sci));\n        sci.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;\n        sci.dpy = _glfw.x11.display;\n        sci.window = window->x11.handle;\n\n        err = vkCreateXlibSurfaceKHR(instance, &sci, allocator, surface);\n        if (err)\n        {\n            _glfwInputError(GLFW_PLATFORM_ERROR,\n                            \"X11: Failed to create Vulkan X11 surface: %s\",\n                            _glfwGetVulkanResultString(err));\n        }\n\n        return err;\n    }\n}\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                        GLFW native API                       //////\n//////////////////////////////////////////////////////////////////////////\n\nGLFWAPI Display* glfwGetX11Display(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return _glfw.x11.display;\n}\n\nGLFWAPI Window glfwGetX11Window(GLFWwindow* handle)\n{\n    _GLFWwindow* window = (_GLFWwindow*) handle;\n    _GLFW_REQUIRE_INIT_OR_RETURN(None);\n    return window->x11.handle;\n}\n\nGLFWAPI void glfwSetX11SelectionString(const char* string)\n{\n    _GLFW_REQUIRE_INIT();\n\n    free(_glfw.x11.primarySelectionString);\n    _glfw.x11.primarySelectionString = strdup(string);\n\n    XSetSelectionOwner(_glfw.x11.display,\n                       _glfw.x11.PRIMARY,\n                       _glfw.x11.helperWindowHandle,\n                       CurrentTime);\n\n    if (XGetSelectionOwner(_glfw.x11.display, _glfw.x11.PRIMARY) !=\n        _glfw.x11.helperWindowHandle)\n    {\n        _glfwInputError(GLFW_PLATFORM_ERROR,\n                        \"X11: Failed to become owner of primary selection\");\n    }\n}\n\nGLFWAPI const char* glfwGetX11SelectionString(void)\n{\n    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);\n    return getSelectionString(_glfw.x11.PRIMARY);\n}\n\n"
  },
  {
    "path": "external/GLFW/src/xkb_unicode.c",
    "content": "//========================================================================\n// GLFW 3.3 X11 - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2002-2006 Marcus Geelnard\n// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#include \"internal.h\"\n\n\n/*\n * Marcus: This code was originally written by Markus G. Kuhn.\n * I have made some slight changes (trimmed it down a bit from >60 KB to\n * 20 KB), but the functionality is the same.\n */\n\n/*\n * This module converts keysym values into the corresponding ISO 10646\n * (UCS, Unicode) values.\n *\n * The array keysymtab[] contains pairs of X11 keysym values for graphical\n * characters and the corresponding Unicode value. The function\n * _glfwKeySym2Unicode() maps a keysym onto a Unicode value using a binary\n * search, therefore keysymtab[] must remain SORTED by keysym value.\n *\n * We allow to represent any UCS character in the range U-00000000 to\n * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.\n * This admittedly does not cover the entire 31-bit space of UCS, but\n * it does cover all of the characters up to U-10FFFF, which can be\n * represented by UTF-16, and more, and it is very unlikely that higher\n * UCS codes will ever be assigned by ISO. So to get Unicode character\n * U+ABCD you can directly use keysym 0x0100abcd.\n *\n * Original author: Markus G. Kuhn <mkuhn@acm.org>, University of\n *                  Cambridge, April 2001\n *\n * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing\n * an initial draft of the mapping table.\n *\n */\n\n\n//************************************************************************\n//****                KeySym to Unicode mapping table                 ****\n//************************************************************************\n\nstatic const struct codepair {\n  unsigned short keysym;\n  unsigned short ucs;\n} keysymtab[] = {\n  { 0x01a1, 0x0104 },\n  { 0x01a2, 0x02d8 },\n  { 0x01a3, 0x0141 },\n  { 0x01a5, 0x013d },\n  { 0x01a6, 0x015a },\n  { 0x01a9, 0x0160 },\n  { 0x01aa, 0x015e },\n  { 0x01ab, 0x0164 },\n  { 0x01ac, 0x0179 },\n  { 0x01ae, 0x017d },\n  { 0x01af, 0x017b },\n  { 0x01b1, 0x0105 },\n  { 0x01b2, 0x02db },\n  { 0x01b3, 0x0142 },\n  { 0x01b5, 0x013e },\n  { 0x01b6, 0x015b },\n  { 0x01b7, 0x02c7 },\n  { 0x01b9, 0x0161 },\n  { 0x01ba, 0x015f },\n  { 0x01bb, 0x0165 },\n  { 0x01bc, 0x017a },\n  { 0x01bd, 0x02dd },\n  { 0x01be, 0x017e },\n  { 0x01bf, 0x017c },\n  { 0x01c0, 0x0154 },\n  { 0x01c3, 0x0102 },\n  { 0x01c5, 0x0139 },\n  { 0x01c6, 0x0106 },\n  { 0x01c8, 0x010c },\n  { 0x01ca, 0x0118 },\n  { 0x01cc, 0x011a },\n  { 0x01cf, 0x010e },\n  { 0x01d0, 0x0110 },\n  { 0x01d1, 0x0143 },\n  { 0x01d2, 0x0147 },\n  { 0x01d5, 0x0150 },\n  { 0x01d8, 0x0158 },\n  { 0x01d9, 0x016e },\n  { 0x01db, 0x0170 },\n  { 0x01de, 0x0162 },\n  { 0x01e0, 0x0155 },\n  { 0x01e3, 0x0103 },\n  { 0x01e5, 0x013a },\n  { 0x01e6, 0x0107 },\n  { 0x01e8, 0x010d },\n  { 0x01ea, 0x0119 },\n  { 0x01ec, 0x011b },\n  { 0x01ef, 0x010f },\n  { 0x01f0, 0x0111 },\n  { 0x01f1, 0x0144 },\n  { 0x01f2, 0x0148 },\n  { 0x01f5, 0x0151 },\n  { 0x01f8, 0x0159 },\n  { 0x01f9, 0x016f },\n  { 0x01fb, 0x0171 },\n  { 0x01fe, 0x0163 },\n  { 0x01ff, 0x02d9 },\n  { 0x02a1, 0x0126 },\n  { 0x02a6, 0x0124 },\n  { 0x02a9, 0x0130 },\n  { 0x02ab, 0x011e },\n  { 0x02ac, 0x0134 },\n  { 0x02b1, 0x0127 },\n  { 0x02b6, 0x0125 },\n  { 0x02b9, 0x0131 },\n  { 0x02bb, 0x011f },\n  { 0x02bc, 0x0135 },\n  { 0x02c5, 0x010a },\n  { 0x02c6, 0x0108 },\n  { 0x02d5, 0x0120 },\n  { 0x02d8, 0x011c },\n  { 0x02dd, 0x016c },\n  { 0x02de, 0x015c },\n  { 0x02e5, 0x010b },\n  { 0x02e6, 0x0109 },\n  { 0x02f5, 0x0121 },\n  { 0x02f8, 0x011d },\n  { 0x02fd, 0x016d },\n  { 0x02fe, 0x015d },\n  { 0x03a2, 0x0138 },\n  { 0x03a3, 0x0156 },\n  { 0x03a5, 0x0128 },\n  { 0x03a6, 0x013b },\n  { 0x03aa, 0x0112 },\n  { 0x03ab, 0x0122 },\n  { 0x03ac, 0x0166 },\n  { 0x03b3, 0x0157 },\n  { 0x03b5, 0x0129 },\n  { 0x03b6, 0x013c },\n  { 0x03ba, 0x0113 },\n  { 0x03bb, 0x0123 },\n  { 0x03bc, 0x0167 },\n  { 0x03bd, 0x014a },\n  { 0x03bf, 0x014b },\n  { 0x03c0, 0x0100 },\n  { 0x03c7, 0x012e },\n  { 0x03cc, 0x0116 },\n  { 0x03cf, 0x012a },\n  { 0x03d1, 0x0145 },\n  { 0x03d2, 0x014c },\n  { 0x03d3, 0x0136 },\n  { 0x03d9, 0x0172 },\n  { 0x03dd, 0x0168 },\n  { 0x03de, 0x016a },\n  { 0x03e0, 0x0101 },\n  { 0x03e7, 0x012f },\n  { 0x03ec, 0x0117 },\n  { 0x03ef, 0x012b },\n  { 0x03f1, 0x0146 },\n  { 0x03f2, 0x014d },\n  { 0x03f3, 0x0137 },\n  { 0x03f9, 0x0173 },\n  { 0x03fd, 0x0169 },\n  { 0x03fe, 0x016b },\n  { 0x047e, 0x203e },\n  { 0x04a1, 0x3002 },\n  { 0x04a2, 0x300c },\n  { 0x04a3, 0x300d },\n  { 0x04a4, 0x3001 },\n  { 0x04a5, 0x30fb },\n  { 0x04a6, 0x30f2 },\n  { 0x04a7, 0x30a1 },\n  { 0x04a8, 0x30a3 },\n  { 0x04a9, 0x30a5 },\n  { 0x04aa, 0x30a7 },\n  { 0x04ab, 0x30a9 },\n  { 0x04ac, 0x30e3 },\n  { 0x04ad, 0x30e5 },\n  { 0x04ae, 0x30e7 },\n  { 0x04af, 0x30c3 },\n  { 0x04b0, 0x30fc },\n  { 0x04b1, 0x30a2 },\n  { 0x04b2, 0x30a4 },\n  { 0x04b3, 0x30a6 },\n  { 0x04b4, 0x30a8 },\n  { 0x04b5, 0x30aa },\n  { 0x04b6, 0x30ab },\n  { 0x04b7, 0x30ad },\n  { 0x04b8, 0x30af },\n  { 0x04b9, 0x30b1 },\n  { 0x04ba, 0x30b3 },\n  { 0x04bb, 0x30b5 },\n  { 0x04bc, 0x30b7 },\n  { 0x04bd, 0x30b9 },\n  { 0x04be, 0x30bb },\n  { 0x04bf, 0x30bd },\n  { 0x04c0, 0x30bf },\n  { 0x04c1, 0x30c1 },\n  { 0x04c2, 0x30c4 },\n  { 0x04c3, 0x30c6 },\n  { 0x04c4, 0x30c8 },\n  { 0x04c5, 0x30ca },\n  { 0x04c6, 0x30cb },\n  { 0x04c7, 0x30cc },\n  { 0x04c8, 0x30cd },\n  { 0x04c9, 0x30ce },\n  { 0x04ca, 0x30cf },\n  { 0x04cb, 0x30d2 },\n  { 0x04cc, 0x30d5 },\n  { 0x04cd, 0x30d8 },\n  { 0x04ce, 0x30db },\n  { 0x04cf, 0x30de },\n  { 0x04d0, 0x30df },\n  { 0x04d1, 0x30e0 },\n  { 0x04d2, 0x30e1 },\n  { 0x04d3, 0x30e2 },\n  { 0x04d4, 0x30e4 },\n  { 0x04d5, 0x30e6 },\n  { 0x04d6, 0x30e8 },\n  { 0x04d7, 0x30e9 },\n  { 0x04d8, 0x30ea },\n  { 0x04d9, 0x30eb },\n  { 0x04da, 0x30ec },\n  { 0x04db, 0x30ed },\n  { 0x04dc, 0x30ef },\n  { 0x04dd, 0x30f3 },\n  { 0x04de, 0x309b },\n  { 0x04df, 0x309c },\n  { 0x05ac, 0x060c },\n  { 0x05bb, 0x061b },\n  { 0x05bf, 0x061f },\n  { 0x05c1, 0x0621 },\n  { 0x05c2, 0x0622 },\n  { 0x05c3, 0x0623 },\n  { 0x05c4, 0x0624 },\n  { 0x05c5, 0x0625 },\n  { 0x05c6, 0x0626 },\n  { 0x05c7, 0x0627 },\n  { 0x05c8, 0x0628 },\n  { 0x05c9, 0x0629 },\n  { 0x05ca, 0x062a },\n  { 0x05cb, 0x062b },\n  { 0x05cc, 0x062c },\n  { 0x05cd, 0x062d },\n  { 0x05ce, 0x062e },\n  { 0x05cf, 0x062f },\n  { 0x05d0, 0x0630 },\n  { 0x05d1, 0x0631 },\n  { 0x05d2, 0x0632 },\n  { 0x05d3, 0x0633 },\n  { 0x05d4, 0x0634 },\n  { 0x05d5, 0x0635 },\n  { 0x05d6, 0x0636 },\n  { 0x05d7, 0x0637 },\n  { 0x05d8, 0x0638 },\n  { 0x05d9, 0x0639 },\n  { 0x05da, 0x063a },\n  { 0x05e0, 0x0640 },\n  { 0x05e1, 0x0641 },\n  { 0x05e2, 0x0642 },\n  { 0x05e3, 0x0643 },\n  { 0x05e4, 0x0644 },\n  { 0x05e5, 0x0645 },\n  { 0x05e6, 0x0646 },\n  { 0x05e7, 0x0647 },\n  { 0x05e8, 0x0648 },\n  { 0x05e9, 0x0649 },\n  { 0x05ea, 0x064a },\n  { 0x05eb, 0x064b },\n  { 0x05ec, 0x064c },\n  { 0x05ed, 0x064d },\n  { 0x05ee, 0x064e },\n  { 0x05ef, 0x064f },\n  { 0x05f0, 0x0650 },\n  { 0x05f1, 0x0651 },\n  { 0x05f2, 0x0652 },\n  { 0x06a1, 0x0452 },\n  { 0x06a2, 0x0453 },\n  { 0x06a3, 0x0451 },\n  { 0x06a4, 0x0454 },\n  { 0x06a5, 0x0455 },\n  { 0x06a6, 0x0456 },\n  { 0x06a7, 0x0457 },\n  { 0x06a8, 0x0458 },\n  { 0x06a9, 0x0459 },\n  { 0x06aa, 0x045a },\n  { 0x06ab, 0x045b },\n  { 0x06ac, 0x045c },\n  { 0x06ae, 0x045e },\n  { 0x06af, 0x045f },\n  { 0x06b0, 0x2116 },\n  { 0x06b1, 0x0402 },\n  { 0x06b2, 0x0403 },\n  { 0x06b3, 0x0401 },\n  { 0x06b4, 0x0404 },\n  { 0x06b5, 0x0405 },\n  { 0x06b6, 0x0406 },\n  { 0x06b7, 0x0407 },\n  { 0x06b8, 0x0408 },\n  { 0x06b9, 0x0409 },\n  { 0x06ba, 0x040a },\n  { 0x06bb, 0x040b },\n  { 0x06bc, 0x040c },\n  { 0x06be, 0x040e },\n  { 0x06bf, 0x040f },\n  { 0x06c0, 0x044e },\n  { 0x06c1, 0x0430 },\n  { 0x06c2, 0x0431 },\n  { 0x06c3, 0x0446 },\n  { 0x06c4, 0x0434 },\n  { 0x06c5, 0x0435 },\n  { 0x06c6, 0x0444 },\n  { 0x06c7, 0x0433 },\n  { 0x06c8, 0x0445 },\n  { 0x06c9, 0x0438 },\n  { 0x06ca, 0x0439 },\n  { 0x06cb, 0x043a },\n  { 0x06cc, 0x043b },\n  { 0x06cd, 0x043c },\n  { 0x06ce, 0x043d },\n  { 0x06cf, 0x043e },\n  { 0x06d0, 0x043f },\n  { 0x06d1, 0x044f },\n  { 0x06d2, 0x0440 },\n  { 0x06d3, 0x0441 },\n  { 0x06d4, 0x0442 },\n  { 0x06d5, 0x0443 },\n  { 0x06d6, 0x0436 },\n  { 0x06d7, 0x0432 },\n  { 0x06d8, 0x044c },\n  { 0x06d9, 0x044b },\n  { 0x06da, 0x0437 },\n  { 0x06db, 0x0448 },\n  { 0x06dc, 0x044d },\n  { 0x06dd, 0x0449 },\n  { 0x06de, 0x0447 },\n  { 0x06df, 0x044a },\n  { 0x06e0, 0x042e },\n  { 0x06e1, 0x0410 },\n  { 0x06e2, 0x0411 },\n  { 0x06e3, 0x0426 },\n  { 0x06e4, 0x0414 },\n  { 0x06e5, 0x0415 },\n  { 0x06e6, 0x0424 },\n  { 0x06e7, 0x0413 },\n  { 0x06e8, 0x0425 },\n  { 0x06e9, 0x0418 },\n  { 0x06ea, 0x0419 },\n  { 0x06eb, 0x041a },\n  { 0x06ec, 0x041b },\n  { 0x06ed, 0x041c },\n  { 0x06ee, 0x041d },\n  { 0x06ef, 0x041e },\n  { 0x06f0, 0x041f },\n  { 0x06f1, 0x042f },\n  { 0x06f2, 0x0420 },\n  { 0x06f3, 0x0421 },\n  { 0x06f4, 0x0422 },\n  { 0x06f5, 0x0423 },\n  { 0x06f6, 0x0416 },\n  { 0x06f7, 0x0412 },\n  { 0x06f8, 0x042c },\n  { 0x06f9, 0x042b },\n  { 0x06fa, 0x0417 },\n  { 0x06fb, 0x0428 },\n  { 0x06fc, 0x042d },\n  { 0x06fd, 0x0429 },\n  { 0x06fe, 0x0427 },\n  { 0x06ff, 0x042a },\n  { 0x07a1, 0x0386 },\n  { 0x07a2, 0x0388 },\n  { 0x07a3, 0x0389 },\n  { 0x07a4, 0x038a },\n  { 0x07a5, 0x03aa },\n  { 0x07a7, 0x038c },\n  { 0x07a8, 0x038e },\n  { 0x07a9, 0x03ab },\n  { 0x07ab, 0x038f },\n  { 0x07ae, 0x0385 },\n  { 0x07af, 0x2015 },\n  { 0x07b1, 0x03ac },\n  { 0x07b2, 0x03ad },\n  { 0x07b3, 0x03ae },\n  { 0x07b4, 0x03af },\n  { 0x07b5, 0x03ca },\n  { 0x07b6, 0x0390 },\n  { 0x07b7, 0x03cc },\n  { 0x07b8, 0x03cd },\n  { 0x07b9, 0x03cb },\n  { 0x07ba, 0x03b0 },\n  { 0x07bb, 0x03ce },\n  { 0x07c1, 0x0391 },\n  { 0x07c2, 0x0392 },\n  { 0x07c3, 0x0393 },\n  { 0x07c4, 0x0394 },\n  { 0x07c5, 0x0395 },\n  { 0x07c6, 0x0396 },\n  { 0x07c7, 0x0397 },\n  { 0x07c8, 0x0398 },\n  { 0x07c9, 0x0399 },\n  { 0x07ca, 0x039a },\n  { 0x07cb, 0x039b },\n  { 0x07cc, 0x039c },\n  { 0x07cd, 0x039d },\n  { 0x07ce, 0x039e },\n  { 0x07cf, 0x039f },\n  { 0x07d0, 0x03a0 },\n  { 0x07d1, 0x03a1 },\n  { 0x07d2, 0x03a3 },\n  { 0x07d4, 0x03a4 },\n  { 0x07d5, 0x03a5 },\n  { 0x07d6, 0x03a6 },\n  { 0x07d7, 0x03a7 },\n  { 0x07d8, 0x03a8 },\n  { 0x07d9, 0x03a9 },\n  { 0x07e1, 0x03b1 },\n  { 0x07e2, 0x03b2 },\n  { 0x07e3, 0x03b3 },\n  { 0x07e4, 0x03b4 },\n  { 0x07e5, 0x03b5 },\n  { 0x07e6, 0x03b6 },\n  { 0x07e7, 0x03b7 },\n  { 0x07e8, 0x03b8 },\n  { 0x07e9, 0x03b9 },\n  { 0x07ea, 0x03ba },\n  { 0x07eb, 0x03bb },\n  { 0x07ec, 0x03bc },\n  { 0x07ed, 0x03bd },\n  { 0x07ee, 0x03be },\n  { 0x07ef, 0x03bf },\n  { 0x07f0, 0x03c0 },\n  { 0x07f1, 0x03c1 },\n  { 0x07f2, 0x03c3 },\n  { 0x07f3, 0x03c2 },\n  { 0x07f4, 0x03c4 },\n  { 0x07f5, 0x03c5 },\n  { 0x07f6, 0x03c6 },\n  { 0x07f7, 0x03c7 },\n  { 0x07f8, 0x03c8 },\n  { 0x07f9, 0x03c9 },\n  { 0x08a1, 0x23b7 },\n  { 0x08a2, 0x250c },\n  { 0x08a3, 0x2500 },\n  { 0x08a4, 0x2320 },\n  { 0x08a5, 0x2321 },\n  { 0x08a6, 0x2502 },\n  { 0x08a7, 0x23a1 },\n  { 0x08a8, 0x23a3 },\n  { 0x08a9, 0x23a4 },\n  { 0x08aa, 0x23a6 },\n  { 0x08ab, 0x239b },\n  { 0x08ac, 0x239d },\n  { 0x08ad, 0x239e },\n  { 0x08ae, 0x23a0 },\n  { 0x08af, 0x23a8 },\n  { 0x08b0, 0x23ac },\n  { 0x08bc, 0x2264 },\n  { 0x08bd, 0x2260 },\n  { 0x08be, 0x2265 },\n  { 0x08bf, 0x222b },\n  { 0x08c0, 0x2234 },\n  { 0x08c1, 0x221d },\n  { 0x08c2, 0x221e },\n  { 0x08c5, 0x2207 },\n  { 0x08c8, 0x223c },\n  { 0x08c9, 0x2243 },\n  { 0x08cd, 0x21d4 },\n  { 0x08ce, 0x21d2 },\n  { 0x08cf, 0x2261 },\n  { 0x08d6, 0x221a },\n  { 0x08da, 0x2282 },\n  { 0x08db, 0x2283 },\n  { 0x08dc, 0x2229 },\n  { 0x08dd, 0x222a },\n  { 0x08de, 0x2227 },\n  { 0x08df, 0x2228 },\n  { 0x08ef, 0x2202 },\n  { 0x08f6, 0x0192 },\n  { 0x08fb, 0x2190 },\n  { 0x08fc, 0x2191 },\n  { 0x08fd, 0x2192 },\n  { 0x08fe, 0x2193 },\n  { 0x09e0, 0x25c6 },\n  { 0x09e1, 0x2592 },\n  { 0x09e2, 0x2409 },\n  { 0x09e3, 0x240c },\n  { 0x09e4, 0x240d },\n  { 0x09e5, 0x240a },\n  { 0x09e8, 0x2424 },\n  { 0x09e9, 0x240b },\n  { 0x09ea, 0x2518 },\n  { 0x09eb, 0x2510 },\n  { 0x09ec, 0x250c },\n  { 0x09ed, 0x2514 },\n  { 0x09ee, 0x253c },\n  { 0x09ef, 0x23ba },\n  { 0x09f0, 0x23bb },\n  { 0x09f1, 0x2500 },\n  { 0x09f2, 0x23bc },\n  { 0x09f3, 0x23bd },\n  { 0x09f4, 0x251c },\n  { 0x09f5, 0x2524 },\n  { 0x09f6, 0x2534 },\n  { 0x09f7, 0x252c },\n  { 0x09f8, 0x2502 },\n  { 0x0aa1, 0x2003 },\n  { 0x0aa2, 0x2002 },\n  { 0x0aa3, 0x2004 },\n  { 0x0aa4, 0x2005 },\n  { 0x0aa5, 0x2007 },\n  { 0x0aa6, 0x2008 },\n  { 0x0aa7, 0x2009 },\n  { 0x0aa8, 0x200a },\n  { 0x0aa9, 0x2014 },\n  { 0x0aaa, 0x2013 },\n  { 0x0aae, 0x2026 },\n  { 0x0aaf, 0x2025 },\n  { 0x0ab0, 0x2153 },\n  { 0x0ab1, 0x2154 },\n  { 0x0ab2, 0x2155 },\n  { 0x0ab3, 0x2156 },\n  { 0x0ab4, 0x2157 },\n  { 0x0ab5, 0x2158 },\n  { 0x0ab6, 0x2159 },\n  { 0x0ab7, 0x215a },\n  { 0x0ab8, 0x2105 },\n  { 0x0abb, 0x2012 },\n  { 0x0abc, 0x2329 },\n  { 0x0abe, 0x232a },\n  { 0x0ac3, 0x215b },\n  { 0x0ac4, 0x215c },\n  { 0x0ac5, 0x215d },\n  { 0x0ac6, 0x215e },\n  { 0x0ac9, 0x2122 },\n  { 0x0aca, 0x2613 },\n  { 0x0acc, 0x25c1 },\n  { 0x0acd, 0x25b7 },\n  { 0x0ace, 0x25cb },\n  { 0x0acf, 0x25af },\n  { 0x0ad0, 0x2018 },\n  { 0x0ad1, 0x2019 },\n  { 0x0ad2, 0x201c },\n  { 0x0ad3, 0x201d },\n  { 0x0ad4, 0x211e },\n  { 0x0ad6, 0x2032 },\n  { 0x0ad7, 0x2033 },\n  { 0x0ad9, 0x271d },\n  { 0x0adb, 0x25ac },\n  { 0x0adc, 0x25c0 },\n  { 0x0add, 0x25b6 },\n  { 0x0ade, 0x25cf },\n  { 0x0adf, 0x25ae },\n  { 0x0ae0, 0x25e6 },\n  { 0x0ae1, 0x25ab },\n  { 0x0ae2, 0x25ad },\n  { 0x0ae3, 0x25b3 },\n  { 0x0ae4, 0x25bd },\n  { 0x0ae5, 0x2606 },\n  { 0x0ae6, 0x2022 },\n  { 0x0ae7, 0x25aa },\n  { 0x0ae8, 0x25b2 },\n  { 0x0ae9, 0x25bc },\n  { 0x0aea, 0x261c },\n  { 0x0aeb, 0x261e },\n  { 0x0aec, 0x2663 },\n  { 0x0aed, 0x2666 },\n  { 0x0aee, 0x2665 },\n  { 0x0af0, 0x2720 },\n  { 0x0af1, 0x2020 },\n  { 0x0af2, 0x2021 },\n  { 0x0af3, 0x2713 },\n  { 0x0af4, 0x2717 },\n  { 0x0af5, 0x266f },\n  { 0x0af6, 0x266d },\n  { 0x0af7, 0x2642 },\n  { 0x0af8, 0x2640 },\n  { 0x0af9, 0x260e },\n  { 0x0afa, 0x2315 },\n  { 0x0afb, 0x2117 },\n  { 0x0afc, 0x2038 },\n  { 0x0afd, 0x201a },\n  { 0x0afe, 0x201e },\n  { 0x0ba3, 0x003c },\n  { 0x0ba6, 0x003e },\n  { 0x0ba8, 0x2228 },\n  { 0x0ba9, 0x2227 },\n  { 0x0bc0, 0x00af },\n  { 0x0bc2, 0x22a5 },\n  { 0x0bc3, 0x2229 },\n  { 0x0bc4, 0x230a },\n  { 0x0bc6, 0x005f },\n  { 0x0bca, 0x2218 },\n  { 0x0bcc, 0x2395 },\n  { 0x0bce, 0x22a4 },\n  { 0x0bcf, 0x25cb },\n  { 0x0bd3, 0x2308 },\n  { 0x0bd6, 0x222a },\n  { 0x0bd8, 0x2283 },\n  { 0x0bda, 0x2282 },\n  { 0x0bdc, 0x22a2 },\n  { 0x0bfc, 0x22a3 },\n  { 0x0cdf, 0x2017 },\n  { 0x0ce0, 0x05d0 },\n  { 0x0ce1, 0x05d1 },\n  { 0x0ce2, 0x05d2 },\n  { 0x0ce3, 0x05d3 },\n  { 0x0ce4, 0x05d4 },\n  { 0x0ce5, 0x05d5 },\n  { 0x0ce6, 0x05d6 },\n  { 0x0ce7, 0x05d7 },\n  { 0x0ce8, 0x05d8 },\n  { 0x0ce9, 0x05d9 },\n  { 0x0cea, 0x05da },\n  { 0x0ceb, 0x05db },\n  { 0x0cec, 0x05dc },\n  { 0x0ced, 0x05dd },\n  { 0x0cee, 0x05de },\n  { 0x0cef, 0x05df },\n  { 0x0cf0, 0x05e0 },\n  { 0x0cf1, 0x05e1 },\n  { 0x0cf2, 0x05e2 },\n  { 0x0cf3, 0x05e3 },\n  { 0x0cf4, 0x05e4 },\n  { 0x0cf5, 0x05e5 },\n  { 0x0cf6, 0x05e6 },\n  { 0x0cf7, 0x05e7 },\n  { 0x0cf8, 0x05e8 },\n  { 0x0cf9, 0x05e9 },\n  { 0x0cfa, 0x05ea },\n  { 0x0da1, 0x0e01 },\n  { 0x0da2, 0x0e02 },\n  { 0x0da3, 0x0e03 },\n  { 0x0da4, 0x0e04 },\n  { 0x0da5, 0x0e05 },\n  { 0x0da6, 0x0e06 },\n  { 0x0da7, 0x0e07 },\n  { 0x0da8, 0x0e08 },\n  { 0x0da9, 0x0e09 },\n  { 0x0daa, 0x0e0a },\n  { 0x0dab, 0x0e0b },\n  { 0x0dac, 0x0e0c },\n  { 0x0dad, 0x0e0d },\n  { 0x0dae, 0x0e0e },\n  { 0x0daf, 0x0e0f },\n  { 0x0db0, 0x0e10 },\n  { 0x0db1, 0x0e11 },\n  { 0x0db2, 0x0e12 },\n  { 0x0db3, 0x0e13 },\n  { 0x0db4, 0x0e14 },\n  { 0x0db5, 0x0e15 },\n  { 0x0db6, 0x0e16 },\n  { 0x0db7, 0x0e17 },\n  { 0x0db8, 0x0e18 },\n  { 0x0db9, 0x0e19 },\n  { 0x0dba, 0x0e1a },\n  { 0x0dbb, 0x0e1b },\n  { 0x0dbc, 0x0e1c },\n  { 0x0dbd, 0x0e1d },\n  { 0x0dbe, 0x0e1e },\n  { 0x0dbf, 0x0e1f },\n  { 0x0dc0, 0x0e20 },\n  { 0x0dc1, 0x0e21 },\n  { 0x0dc2, 0x0e22 },\n  { 0x0dc3, 0x0e23 },\n  { 0x0dc4, 0x0e24 },\n  { 0x0dc5, 0x0e25 },\n  { 0x0dc6, 0x0e26 },\n  { 0x0dc7, 0x0e27 },\n  { 0x0dc8, 0x0e28 },\n  { 0x0dc9, 0x0e29 },\n  { 0x0dca, 0x0e2a },\n  { 0x0dcb, 0x0e2b },\n  { 0x0dcc, 0x0e2c },\n  { 0x0dcd, 0x0e2d },\n  { 0x0dce, 0x0e2e },\n  { 0x0dcf, 0x0e2f },\n  { 0x0dd0, 0x0e30 },\n  { 0x0dd1, 0x0e31 },\n  { 0x0dd2, 0x0e32 },\n  { 0x0dd3, 0x0e33 },\n  { 0x0dd4, 0x0e34 },\n  { 0x0dd5, 0x0e35 },\n  { 0x0dd6, 0x0e36 },\n  { 0x0dd7, 0x0e37 },\n  { 0x0dd8, 0x0e38 },\n  { 0x0dd9, 0x0e39 },\n  { 0x0dda, 0x0e3a },\n  { 0x0ddf, 0x0e3f },\n  { 0x0de0, 0x0e40 },\n  { 0x0de1, 0x0e41 },\n  { 0x0de2, 0x0e42 },\n  { 0x0de3, 0x0e43 },\n  { 0x0de4, 0x0e44 },\n  { 0x0de5, 0x0e45 },\n  { 0x0de6, 0x0e46 },\n  { 0x0de7, 0x0e47 },\n  { 0x0de8, 0x0e48 },\n  { 0x0de9, 0x0e49 },\n  { 0x0dea, 0x0e4a },\n  { 0x0deb, 0x0e4b },\n  { 0x0dec, 0x0e4c },\n  { 0x0ded, 0x0e4d },\n  { 0x0df0, 0x0e50 },\n  { 0x0df1, 0x0e51 },\n  { 0x0df2, 0x0e52 },\n  { 0x0df3, 0x0e53 },\n  { 0x0df4, 0x0e54 },\n  { 0x0df5, 0x0e55 },\n  { 0x0df6, 0x0e56 },\n  { 0x0df7, 0x0e57 },\n  { 0x0df8, 0x0e58 },\n  { 0x0df9, 0x0e59 },\n  { 0x0ea1, 0x3131 },\n  { 0x0ea2, 0x3132 },\n  { 0x0ea3, 0x3133 },\n  { 0x0ea4, 0x3134 },\n  { 0x0ea5, 0x3135 },\n  { 0x0ea6, 0x3136 },\n  { 0x0ea7, 0x3137 },\n  { 0x0ea8, 0x3138 },\n  { 0x0ea9, 0x3139 },\n  { 0x0eaa, 0x313a },\n  { 0x0eab, 0x313b },\n  { 0x0eac, 0x313c },\n  { 0x0ead, 0x313d },\n  { 0x0eae, 0x313e },\n  { 0x0eaf, 0x313f },\n  { 0x0eb0, 0x3140 },\n  { 0x0eb1, 0x3141 },\n  { 0x0eb2, 0x3142 },\n  { 0x0eb3, 0x3143 },\n  { 0x0eb4, 0x3144 },\n  { 0x0eb5, 0x3145 },\n  { 0x0eb6, 0x3146 },\n  { 0x0eb7, 0x3147 },\n  { 0x0eb8, 0x3148 },\n  { 0x0eb9, 0x3149 },\n  { 0x0eba, 0x314a },\n  { 0x0ebb, 0x314b },\n  { 0x0ebc, 0x314c },\n  { 0x0ebd, 0x314d },\n  { 0x0ebe, 0x314e },\n  { 0x0ebf, 0x314f },\n  { 0x0ec0, 0x3150 },\n  { 0x0ec1, 0x3151 },\n  { 0x0ec2, 0x3152 },\n  { 0x0ec3, 0x3153 },\n  { 0x0ec4, 0x3154 },\n  { 0x0ec5, 0x3155 },\n  { 0x0ec6, 0x3156 },\n  { 0x0ec7, 0x3157 },\n  { 0x0ec8, 0x3158 },\n  { 0x0ec9, 0x3159 },\n  { 0x0eca, 0x315a },\n  { 0x0ecb, 0x315b },\n  { 0x0ecc, 0x315c },\n  { 0x0ecd, 0x315d },\n  { 0x0ece, 0x315e },\n  { 0x0ecf, 0x315f },\n  { 0x0ed0, 0x3160 },\n  { 0x0ed1, 0x3161 },\n  { 0x0ed2, 0x3162 },\n  { 0x0ed3, 0x3163 },\n  { 0x0ed4, 0x11a8 },\n  { 0x0ed5, 0x11a9 },\n  { 0x0ed6, 0x11aa },\n  { 0x0ed7, 0x11ab },\n  { 0x0ed8, 0x11ac },\n  { 0x0ed9, 0x11ad },\n  { 0x0eda, 0x11ae },\n  { 0x0edb, 0x11af },\n  { 0x0edc, 0x11b0 },\n  { 0x0edd, 0x11b1 },\n  { 0x0ede, 0x11b2 },\n  { 0x0edf, 0x11b3 },\n  { 0x0ee0, 0x11b4 },\n  { 0x0ee1, 0x11b5 },\n  { 0x0ee2, 0x11b6 },\n  { 0x0ee3, 0x11b7 },\n  { 0x0ee4, 0x11b8 },\n  { 0x0ee5, 0x11b9 },\n  { 0x0ee6, 0x11ba },\n  { 0x0ee7, 0x11bb },\n  { 0x0ee8, 0x11bc },\n  { 0x0ee9, 0x11bd },\n  { 0x0eea, 0x11be },\n  { 0x0eeb, 0x11bf },\n  { 0x0eec, 0x11c0 },\n  { 0x0eed, 0x11c1 },\n  { 0x0eee, 0x11c2 },\n  { 0x0eef, 0x316d },\n  { 0x0ef0, 0x3171 },\n  { 0x0ef1, 0x3178 },\n  { 0x0ef2, 0x317f },\n  { 0x0ef3, 0x3181 },\n  { 0x0ef4, 0x3184 },\n  { 0x0ef5, 0x3186 },\n  { 0x0ef6, 0x318d },\n  { 0x0ef7, 0x318e },\n  { 0x0ef8, 0x11eb },\n  { 0x0ef9, 0x11f0 },\n  { 0x0efa, 0x11f9 },\n  { 0x0eff, 0x20a9 },\n  { 0x13a4, 0x20ac },\n  { 0x13bc, 0x0152 },\n  { 0x13bd, 0x0153 },\n  { 0x13be, 0x0178 },\n  { 0x20ac, 0x20ac },\n  { 0xfe50,    '`' },\n  { 0xfe51, 0x00b4 },\n  { 0xfe52,    '^' },\n  { 0xfe53,    '~' },\n  { 0xfe54, 0x00af },\n  { 0xfe55, 0x02d8 },\n  { 0xfe56, 0x02d9 },\n  { 0xfe57, 0x00a8 },\n  { 0xfe58, 0x02da },\n  { 0xfe59, 0x02dd },\n  { 0xfe5a, 0x02c7 },\n  { 0xfe5b, 0x00b8 },\n  { 0xfe5c, 0x02db },\n  { 0xfe5d, 0x037a },\n  { 0xfe5e, 0x309b },\n  { 0xfe5f, 0x309c },\n  { 0xfe63,    '/' },\n  { 0xfe64, 0x02bc },\n  { 0xfe65, 0x02bd },\n  { 0xfe66, 0x02f5 },\n  { 0xfe67, 0x02f3 },\n  { 0xfe68, 0x02cd },\n  { 0xfe69, 0xa788 },\n  { 0xfe6a, 0x02f7 },\n  { 0xfe6e,    ',' },\n  { 0xfe6f, 0x00a4 },\n  { 0xfe80,    'a' }, // XK_dead_a\n  { 0xfe81,    'A' }, // XK_dead_A\n  { 0xfe82,    'e' }, // XK_dead_e\n  { 0xfe83,    'E' }, // XK_dead_E\n  { 0xfe84,    'i' }, // XK_dead_i\n  { 0xfe85,    'I' }, // XK_dead_I\n  { 0xfe86,    'o' }, // XK_dead_o\n  { 0xfe87,    'O' }, // XK_dead_O\n  { 0xfe88,    'u' }, // XK_dead_u\n  { 0xfe89,    'U' }, // XK_dead_U\n  { 0xfe8a, 0x0259 },\n  { 0xfe8b, 0x018f },\n  { 0xfe8c, 0x00b5 },\n  { 0xfe90,    '_' },\n  { 0xfe91, 0x02c8 },\n  { 0xfe92, 0x02cc },\n  { 0xff80 /*XKB_KEY_KP_Space*/,     ' ' },\n  { 0xff95 /*XKB_KEY_KP_7*/, 0x0037 },\n  { 0xff96 /*XKB_KEY_KP_4*/, 0x0034 },\n  { 0xff97 /*XKB_KEY_KP_8*/, 0x0038 },\n  { 0xff98 /*XKB_KEY_KP_6*/, 0x0036 },\n  { 0xff99 /*XKB_KEY_KP_2*/, 0x0032 },\n  { 0xff9a /*XKB_KEY_KP_9*/, 0x0039 },\n  { 0xff9b /*XKB_KEY_KP_3*/, 0x0033 },\n  { 0xff9c /*XKB_KEY_KP_1*/, 0x0031 },\n  { 0xff9d /*XKB_KEY_KP_5*/, 0x0035 },\n  { 0xff9e /*XKB_KEY_KP_0*/, 0x0030 },\n  { 0xffaa /*XKB_KEY_KP_Multiply*/,  '*' },\n  { 0xffab /*XKB_KEY_KP_Add*/,       '+' },\n  { 0xffac /*XKB_KEY_KP_Separator*/, ',' },\n  { 0xffad /*XKB_KEY_KP_Subtract*/,  '-' },\n  { 0xffae /*XKB_KEY_KP_Decimal*/,   '.' },\n  { 0xffaf /*XKB_KEY_KP_Divide*/,    '/' },\n  { 0xffb0 /*XKB_KEY_KP_0*/, 0x0030 },\n  { 0xffb1 /*XKB_KEY_KP_1*/, 0x0031 },\n  { 0xffb2 /*XKB_KEY_KP_2*/, 0x0032 },\n  { 0xffb3 /*XKB_KEY_KP_3*/, 0x0033 },\n  { 0xffb4 /*XKB_KEY_KP_4*/, 0x0034 },\n  { 0xffb5 /*XKB_KEY_KP_5*/, 0x0035 },\n  { 0xffb6 /*XKB_KEY_KP_6*/, 0x0036 },\n  { 0xffb7 /*XKB_KEY_KP_7*/, 0x0037 },\n  { 0xffb8 /*XKB_KEY_KP_8*/, 0x0038 },\n  { 0xffb9 /*XKB_KEY_KP_9*/, 0x0039 },\n  { 0xffbd /*XKB_KEY_KP_Equal*/,     '=' }\n};\n\n\n//////////////////////////////////////////////////////////////////////////\n//////                       GLFW internal API                      //////\n//////////////////////////////////////////////////////////////////////////\n\n// Convert XKB KeySym to Unicode\n//\nlong _glfwKeySym2Unicode(unsigned int keysym)\n{\n    int min = 0;\n    int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;\n    int mid;\n\n    // First check for Latin-1 characters (1:1 mapping)\n    if ((keysym >= 0x0020 && keysym <= 0x007e) ||\n        (keysym >= 0x00a0 && keysym <= 0x00ff))\n    {\n        return keysym;\n    }\n\n    // Also check for directly encoded 24-bit UCS characters\n    if ((keysym & 0xff000000) == 0x01000000)\n        return keysym & 0x00ffffff;\n\n    // Binary search in table\n    while (max >= min)\n    {\n        mid = (min + max) / 2;\n        if (keysymtab[mid].keysym < keysym)\n            min = mid + 1;\n        else if (keysymtab[mid].keysym > keysym)\n            max = mid - 1;\n        else\n            return keysymtab[mid].ucs;\n    }\n\n    // No matching Unicode value found\n    return -1;\n}\n\n"
  },
  {
    "path": "external/GLFW/src/xkb_unicode.h",
    "content": "//========================================================================\n// GLFW 3.3 Linux - www.glfw.org\n//------------------------------------------------------------------------\n// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\nlong _glfwKeySym2Unicode(unsigned int keysym);\n\n"
  },
  {
    "path": "external/GLFW/tests/CMakeLists.txt",
    "content": "\nlink_libraries(glfw)\n\ninclude_directories(${glfw_INCLUDE_DIRS} \"${GLFW_SOURCE_DIR}/deps\")\n\nif (MATH_LIBRARY)\n    link_libraries(\"${MATH_LIBRARY}\")\nendif()\n\nif (MSVC)\n    add_definitions(-D_CRT_SECURE_NO_WARNINGS)\nendif()\n\nset(GLAD \"${GLFW_SOURCE_DIR}/deps/glad/glad.h\"\n         \"${GLFW_SOURCE_DIR}/deps/glad.c\")\nset(GETOPT \"${GLFW_SOURCE_DIR}/deps/getopt.h\"\n           \"${GLFW_SOURCE_DIR}/deps/getopt.c\")\nset(TINYCTHREAD \"${GLFW_SOURCE_DIR}/deps/tinycthread.h\"\n                \"${GLFW_SOURCE_DIR}/deps/tinycthread.c\")\n\nadd_executable(clipboard clipboard.c ${GETOPT} ${GLAD})\nadd_executable(events events.c ${GETOPT} ${GLAD})\nadd_executable(msaa msaa.c ${GETOPT} ${GLAD})\nadd_executable(glfwinfo glfwinfo.c ${GETOPT} ${GLAD})\nadd_executable(iconify iconify.c ${GETOPT} ${GLAD})\nadd_executable(monitors monitors.c ${GETOPT} ${GLAD})\nadd_executable(reopen reopen.c ${GLAD})\nadd_executable(cursor cursor.c ${GLAD})\n\nadd_executable(empty WIN32 MACOSX_BUNDLE empty.c ${TINYCTHREAD} ${GLAD})\nadd_executable(gamma WIN32 MACOSX_BUNDLE gamma.c ${GLAD})\nadd_executable(icon WIN32 MACOSX_BUNDLE icon.c ${GLAD})\nadd_executable(inputlag WIN32 MACOSX_BUNDLE inputlag.c ${GETOPT} ${GLAD})\nadd_executable(joysticks WIN32 MACOSX_BUNDLE joysticks.c ${GLAD})\nadd_executable(sharing WIN32 MACOSX_BUNDLE sharing.c ${GETOPT} ${GLAD})\nadd_executable(tearing WIN32 MACOSX_BUNDLE tearing.c ${GETOPT} ${GLAD})\nadd_executable(threads WIN32 MACOSX_BUNDLE threads.c ${TINYCTHREAD} ${GLAD})\nadd_executable(timeout WIN32 MACOSX_BUNDLE timeout.c ${GLAD})\nadd_executable(title WIN32 MACOSX_BUNDLE title.c ${GLAD})\nadd_executable(windows WIN32 MACOSX_BUNDLE windows.c ${GETOPT} ${GLAD})\n\ntarget_link_libraries(empty \"${CMAKE_THREAD_LIBS_INIT}\")\ntarget_link_libraries(threads \"${CMAKE_THREAD_LIBS_INIT}\")\nif (RT_LIBRARY)\n    target_link_libraries(empty \"${RT_LIBRARY}\")\n    target_link_libraries(threads \"${RT_LIBRARY}\")\nendif()\n\nset(WINDOWS_BINARIES empty gamma icon inputlag joysticks sharing tearing threads\n                     timeout title windows)\nset(CONSOLE_BINARIES clipboard events msaa glfwinfo iconify monitors reopen\n                     cursor)\n\nif (VULKAN_FOUND)\n    add_executable(vulkan WIN32 vulkan.c ${ICON})\n    target_include_directories(vulkan PRIVATE \"${VULKAN_INCLUDE_DIR}\")\n    if (GLFW_VULKAN_STATIC)\n        target_link_libraries(vulkan \"${VULKAN_STATIC_LIBRARY}\" ${GLFW_VULKAN_DEPS})\n    else()\n        target_link_libraries(vulkan \"${VULKAN_LIBRARY}\")\n    endif()\n    list(APPEND WINDOWS_BINARIES vulkan)\nendif()\n\nset_target_properties(${WINDOWS_BINARIES} ${CONSOLE_BINARIES} PROPERTIES\n                      FOLDER \"GLFW3/Tests\")\n\nif (MSVC)\n    # Tell MSVC to use main instead of WinMain for Windows subsystem executables\n    set_target_properties(${WINDOWS_BINARIES} ${CONSOLE_BINARIES} PROPERTIES\n                          LINK_FLAGS \"/ENTRY:mainCRTStartup\")\nendif()\n\nif (APPLE)\n    set_target_properties(empty PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Empty Event\")\n    set_target_properties(gamma PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Gamma\")\n    set_target_properties(inputlag PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Input Lag\")\n    set_target_properties(joysticks PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Joysticks\")\n    set_target_properties(sharing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Sharing\")\n    set_target_properties(tearing PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Tearing\")\n    set_target_properties(threads PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Threads\")\n    set_target_properties(timeout PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Timeout\")\n    set_target_properties(title PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Title\")\n    set_target_properties(windows PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME \"Windows\")\n\n    set_target_properties(${WINDOWS_BINARIES} ${CONSOLE_BINARIES} PROPERTIES\n                          MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION}\n                          MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION_FULL}\n                          MACOSX_BUNDLE_INFO_PLIST \"${GLFW_SOURCE_DIR}/CMake/MacOSXBundleInfo.plist.in\")\nendif()\n\n"
  },
  {
    "path": "external/GLFW/tests/clipboard.c",
    "content": "//========================================================================\n// Clipboard test program\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This program is used to test the clipboard functionality.\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"getopt.h\"\n\n#if defined(__APPLE__)\n #define MODIFIER GLFW_MOD_SUPER\n#else\n #define MODIFIER GLFW_MOD_CONTROL\n#endif\n\nstatic void usage(void)\n{\n    printf(\"Usage: clipboard [-h]\\n\");\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, GLFW_TRUE);\n            break;\n\n        case GLFW_KEY_V:\n            if (mods == MODIFIER)\n            {\n                const char* string;\n\n                string = glfwGetClipboardString(window);\n                if (string)\n                    printf(\"Clipboard contains \\\"%s\\\"\\n\", string);\n                else\n                    printf(\"Clipboard does not contain a string\\n\");\n            }\n            break;\n\n        case GLFW_KEY_C:\n            if (mods == MODIFIER)\n            {\n                const char* string = \"Hello GLFW World!\";\n                glfwSetClipboardString(window, string);\n                printf(\"Setting clipboard to \\\"%s\\\"\\n\", string);\n            }\n            break;\n    }\n}\n\nstatic void framebuffer_size_callback(GLFWwindow* window, int width, int height)\n{\n    glViewport(0, 0, width, height);\n}\n\nint main(int argc, char** argv)\n{\n    int ch;\n    GLFWwindow* window;\n\n    while ((ch = getopt(argc, argv, \"h\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n\n            default:\n                usage();\n                exit(EXIT_FAILURE);\n        }\n    }\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n    {\n        fprintf(stderr, \"Failed to initialize GLFW\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    window = glfwCreateWindow(200, 200, \"Clipboard Test\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n\n        fprintf(stderr, \"Failed to open GLFW window\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    glfwSetKeyCallback(window, key_callback);\n    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);\n\n    glClearColor(0.5f, 0.5f, 0.5f, 0);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        glClear(GL_COLOR_BUFFER_BIT);\n\n        glfwSwapBuffers(window);\n        glfwWaitEvents();\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/cursor.c",
    "content": "//========================================================================\n// Cursor & input mode tests\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test provides an interface to the cursor image and cursor mode\n// parts of the API.\n//\n// Custom cursor image generation by urraka.\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#if defined(_MSC_VER)\n // Make MS math.h define M_PI\n #define _USE_MATH_DEFINES\n#endif\n\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"linmath.h\"\n\n#define CURSOR_FRAME_COUNT 60\n\nstatic const char* vertex_shader_text =\n\"#version 110\\n\"\n\"uniform mat4 MVP;\\n\"\n\"attribute vec2 vPos;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = MVP * vec4(vPos, 0.0, 1.0);\\n\"\n\"}\\n\";\n\nstatic const char* fragment_shader_text =\n\"#version 110\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = vec4(1.0);\\n\"\n\"}\\n\";\n\nstatic double cursor_x;\nstatic double cursor_y;\nstatic int swap_interval = 1;\nstatic int wait_events = GLFW_TRUE;\nstatic int animate_cursor = GLFW_FALSE;\nstatic int track_cursor = GLFW_FALSE;\nstatic GLFWcursor* standard_cursors[6];\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic float star(int x, int y, float t)\n{\n    const float c = 64 / 2.f;\n\n    const float i = (0.25f * (float) sin(2.f * M_PI * t) + 0.75f);\n    const float k = 64 * 0.046875f * i;\n\n    const float dist = (float) sqrt((x - c) * (x - c) + (y - c) * (y - c));\n\n    const float salpha = 1.f - dist / c;\n    const float xalpha = (float) x == c ? c : k / (float) fabs(x - c);\n    const float yalpha = (float) y == c ? c : k / (float) fabs(y - c);\n\n    return (float) fmax(0.f, fmin(1.f, i * salpha * 0.2f + salpha * xalpha * yalpha));\n}\n\nstatic GLFWcursor* create_cursor_frame(float t)\n{\n    int i = 0, x, y;\n    unsigned char buffer[64 * 64 * 4];\n    const GLFWimage image = { 64, 64, buffer };\n\n    for (y = 0;  y < image.width;  y++)\n    {\n        for (x = 0;  x < image.height;  x++)\n        {\n            buffer[i++] = 255;\n            buffer[i++] = 255;\n            buffer[i++] = 255;\n            buffer[i++] = (unsigned char) (255 * star(x, y, t));\n        }\n    }\n\n    return glfwCreateCursor(&image, image.width / 2, image.height / 2);\n}\n\nstatic void cursor_position_callback(GLFWwindow* window, double x, double y)\n{\n    printf(\"%0.3f: Cursor position: %f %f (%+f %+f)\\n\",\n           glfwGetTime(),\n           x, y, x - cursor_x, y - cursor_y);\n\n    cursor_x = x;\n    cursor_y = y;\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_A:\n        {\n            animate_cursor = !animate_cursor;\n            if (!animate_cursor)\n                glfwSetCursor(window, NULL);\n\n            break;\n        }\n\n        case GLFW_KEY_ESCAPE:\n        {\n            if (glfwGetInputMode(window, GLFW_CURSOR) != GLFW_CURSOR_DISABLED)\n            {\n                glfwSetWindowShouldClose(window, GLFW_TRUE);\n                break;\n            }\n\n            /* FALLTHROUGH */\n        }\n\n        case GLFW_KEY_N:\n            glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);\n            printf(\"(( cursor is normal ))\\n\");\n            break;\n\n        case GLFW_KEY_D:\n            glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);\n            printf(\"(( cursor is disabled ))\\n\");\n            break;\n\n        case GLFW_KEY_H:\n            glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);\n            printf(\"(( cursor is hidden ))\\n\");\n            break;\n\n        case GLFW_KEY_SPACE:\n            swap_interval = 1 - swap_interval;\n            printf(\"(( swap interval: %i ))\\n\", swap_interval);\n            glfwSwapInterval(swap_interval);\n            break;\n\n        case GLFW_KEY_W:\n            wait_events = !wait_events;\n            printf(\"(( %sing for events ))\\n\", wait_events ? \"wait\" : \"poll\");\n            break;\n\n        case GLFW_KEY_T:\n            track_cursor = !track_cursor;\n            break;\n\n        case GLFW_KEY_0:\n            glfwSetCursor(window, NULL);\n            break;\n\n        case GLFW_KEY_1:\n            glfwSetCursor(window, standard_cursors[0]);\n            break;\n\n        case GLFW_KEY_2:\n            glfwSetCursor(window, standard_cursors[1]);\n            break;\n\n        case GLFW_KEY_3:\n            glfwSetCursor(window, standard_cursors[2]);\n            break;\n\n        case GLFW_KEY_4:\n            glfwSetCursor(window, standard_cursors[3]);\n            break;\n\n        case GLFW_KEY_5:\n            glfwSetCursor(window, standard_cursors[4]);\n            break;\n\n        case GLFW_KEY_6:\n            glfwSetCursor(window, standard_cursors[5]);\n            break;\n    }\n}\n\nint main(void)\n{\n    int i;\n    GLFWwindow* window;\n    GLFWcursor* star_cursors[CURSOR_FRAME_COUNT];\n    GLFWcursor* current_frame = NULL;\n    GLuint vertex_buffer, vertex_shader, fragment_shader, program;\n    GLint mvp_location, vpos_location;\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    for (i = 0;  i < CURSOR_FRAME_COUNT;  i++)\n    {\n        star_cursors[i] = create_cursor_frame(i / (float) CURSOR_FRAME_COUNT);\n        if (!star_cursors[i])\n        {\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n    }\n\n    for (i = 0;  i < sizeof(standard_cursors) / sizeof(standard_cursors[0]);  i++)\n    {\n        const int shapes[] = {\n            GLFW_ARROW_CURSOR,\n            GLFW_IBEAM_CURSOR,\n            GLFW_CROSSHAIR_CURSOR,\n            GLFW_HAND_CURSOR,\n            GLFW_HRESIZE_CURSOR,\n            GLFW_VRESIZE_CURSOR\n        };\n\n        standard_cursors[i] = glfwCreateStandardCursor(shapes[i]);\n        if (!standard_cursors[i])\n        {\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n    }\n\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\n\n    window = glfwCreateWindow(640, 480, \"Cursor Test\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n\n    glGenBuffers(1, &vertex_buffer);\n    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n\n    vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);\n    glCompileShader(vertex_shader);\n\n    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);\n    glCompileShader(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    mvp_location = glGetUniformLocation(program, \"MVP\");\n    vpos_location = glGetAttribLocation(program, \"vPos\");\n\n    glEnableVertexAttribArray(vpos_location);\n    glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,\n                          sizeof(vec2), (void*) 0);\n    glUseProgram(program);\n\n    glfwGetCursorPos(window, &cursor_x, &cursor_y);\n    printf(\"Cursor position: %f %f\\n\", cursor_x, cursor_y);\n\n    glfwSetCursorPosCallback(window, cursor_position_callback);\n    glfwSetKeyCallback(window, key_callback);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        glClear(GL_COLOR_BUFFER_BIT);\n\n        if (track_cursor)\n        {\n            int wnd_width, wnd_height, fb_width, fb_height;\n            float scale;\n            vec2 vertices[4];\n            mat4x4 mvp;\n\n            glfwGetWindowSize(window, &wnd_width, &wnd_height);\n            glfwGetFramebufferSize(window, &fb_width, &fb_height);\n\n            glViewport(0, 0, fb_width, fb_height);\n\n            scale = (float) fb_width / (float) wnd_width;\n            vertices[0][0] = 0.f;\n            vertices[0][1] = (float) (fb_height - cursor_y * scale);\n            vertices[1][0] = (float) fb_width;\n            vertices[1][1] = (float) (fb_height - cursor_y * scale);\n            vertices[2][0] = (float) (cursor_x * scale);\n            vertices[2][1] = 0.f;\n            vertices[3][0] = (float) (cursor_x * scale);\n            vertices[3][1] = (float) fb_height;\n\n            glBufferData(GL_ARRAY_BUFFER,\n                         sizeof(vertices),\n                         vertices,\n                         GL_STREAM_DRAW);\n\n            mat4x4_ortho(mvp, 0.f, (float) fb_width, 0.f, (float) fb_height, 0.f, 1.f);\n            glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);\n\n            glDrawArrays(GL_LINES, 0, 4);\n        }\n\n        glfwSwapBuffers(window);\n\n        if (animate_cursor)\n        {\n            const int i = (int) (glfwGetTime() * 30.0) % CURSOR_FRAME_COUNT;\n            if (current_frame != star_cursors[i])\n            {\n                glfwSetCursor(window, star_cursors[i]);\n                current_frame = star_cursors[i];\n            }\n        }\n        else\n            current_frame = NULL;\n\n        if (wait_events)\n        {\n            if (animate_cursor)\n                glfwWaitEventsTimeout(1.0 / 30.0);\n            else\n                glfwWaitEvents();\n        }\n        else\n            glfwPollEvents();\n\n        // Workaround for an issue with msvcrt and mintty\n        fflush(stdout);\n    }\n\n    glfwDestroyWindow(window);\n\n    for (i = 0;  i < CURSOR_FRAME_COUNT;  i++)\n        glfwDestroyCursor(star_cursors[i]);\n\n    for (i = 0;  i < sizeof(standard_cursors) / sizeof(standard_cursors[0]);  i++)\n        glfwDestroyCursor(standard_cursors[i]);\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/empty.c",
    "content": "//========================================================================\n// Empty event test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test is intended to verify that posting of empty events works\n//\n//========================================================================\n\n#include \"tinycthread.h\"\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic volatile int running = GLFW_TRUE;\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic int thread_main(void* data)\n{\n    struct timespec time;\n\n    while (running)\n    {\n        clock_gettime(CLOCK_REALTIME, &time);\n        time.tv_sec += 1;\n        thrd_sleep(&time, NULL);\n\n        glfwPostEmptyEvent();\n    }\n\n    return 0;\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\nstatic float nrand(void)\n{\n    return (float) rand() / (float) RAND_MAX;\n}\n\nint main(void)\n{\n    int result;\n    thrd_t thread;\n    GLFWwindow* window;\n\n    srand((unsigned int) time(NULL));\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    window = glfwCreateWindow(640, 480, \"Empty Event Test\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSetKeyCallback(window, key_callback);\n\n    if (thrd_create(&thread, thread_main, NULL) != thrd_success)\n    {\n        fprintf(stderr, \"Failed to create secondary thread\\n\");\n\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    while (running)\n    {\n        int width, height;\n        float r = nrand(), g = nrand(), b = nrand();\n        float l = (float) sqrt(r * r + g * g + b * b);\n\n        glfwGetFramebufferSize(window, &width, &height);\n\n        glViewport(0, 0, width, height);\n        glClearColor(r / l, g / l, b / l, 1.f);\n        glClear(GL_COLOR_BUFFER_BIT);\n        glfwSwapBuffers(window);\n\n        glfwWaitEvents();\n\n        if (glfwWindowShouldClose(window))\n            running = GLFW_FALSE;\n    }\n\n    glfwHideWindow(window);\n    thrd_join(thread, &result);\n    glfwDestroyWindow(window);\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/events.c",
    "content": "//========================================================================\n// Event linter (event spewer)\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test hooks every available callback and outputs their arguments\n//\n// Log messages go to stdout, error messages to stderr\n//\n// Every event also gets a (sequential) number to aid discussion of logs\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <ctype.h>\n#include <string.h>\n#include <locale.h>\n\n#include \"getopt.h\"\n\n// Event index\nstatic unsigned int counter = 0;\n\ntypedef struct\n{\n    GLFWwindow* window;\n    int number;\n    int closeable;\n} Slot;\n\nstatic void usage(void)\n{\n    printf(\"Usage: events [-f] [-h] [-n WINDOWS]\\n\");\n    printf(\"Options:\\n\");\n    printf(\"  -f use full screen\\n\");\n    printf(\"  -h show this help\\n\");\n    printf(\"  -n the number of windows to create\\n\");\n}\n\nstatic const char* get_key_name(int key)\n{\n    switch (key)\n    {\n        // Printable keys\n        case GLFW_KEY_A:            return \"A\";\n        case GLFW_KEY_B:            return \"B\";\n        case GLFW_KEY_C:            return \"C\";\n        case GLFW_KEY_D:            return \"D\";\n        case GLFW_KEY_E:            return \"E\";\n        case GLFW_KEY_F:            return \"F\";\n        case GLFW_KEY_G:            return \"G\";\n        case GLFW_KEY_H:            return \"H\";\n        case GLFW_KEY_I:            return \"I\";\n        case GLFW_KEY_J:            return \"J\";\n        case GLFW_KEY_K:            return \"K\";\n        case GLFW_KEY_L:            return \"L\";\n        case GLFW_KEY_M:            return \"M\";\n        case GLFW_KEY_N:            return \"N\";\n        case GLFW_KEY_O:            return \"O\";\n        case GLFW_KEY_P:            return \"P\";\n        case GLFW_KEY_Q:            return \"Q\";\n        case GLFW_KEY_R:            return \"R\";\n        case GLFW_KEY_S:            return \"S\";\n        case GLFW_KEY_T:            return \"T\";\n        case GLFW_KEY_U:            return \"U\";\n        case GLFW_KEY_V:            return \"V\";\n        case GLFW_KEY_W:            return \"W\";\n        case GLFW_KEY_X:            return \"X\";\n        case GLFW_KEY_Y:            return \"Y\";\n        case GLFW_KEY_Z:            return \"Z\";\n        case GLFW_KEY_1:            return \"1\";\n        case GLFW_KEY_2:            return \"2\";\n        case GLFW_KEY_3:            return \"3\";\n        case GLFW_KEY_4:            return \"4\";\n        case GLFW_KEY_5:            return \"5\";\n        case GLFW_KEY_6:            return \"6\";\n        case GLFW_KEY_7:            return \"7\";\n        case GLFW_KEY_8:            return \"8\";\n        case GLFW_KEY_9:            return \"9\";\n        case GLFW_KEY_0:            return \"0\";\n        case GLFW_KEY_SPACE:        return \"SPACE\";\n        case GLFW_KEY_MINUS:        return \"MINUS\";\n        case GLFW_KEY_EQUAL:        return \"EQUAL\";\n        case GLFW_KEY_LEFT_BRACKET: return \"LEFT BRACKET\";\n        case GLFW_KEY_RIGHT_BRACKET: return \"RIGHT BRACKET\";\n        case GLFW_KEY_BACKSLASH:    return \"BACKSLASH\";\n        case GLFW_KEY_SEMICOLON:    return \"SEMICOLON\";\n        case GLFW_KEY_APOSTROPHE:   return \"APOSTROPHE\";\n        case GLFW_KEY_GRAVE_ACCENT: return \"GRAVE ACCENT\";\n        case GLFW_KEY_COMMA:        return \"COMMA\";\n        case GLFW_KEY_PERIOD:       return \"PERIOD\";\n        case GLFW_KEY_SLASH:        return \"SLASH\";\n        case GLFW_KEY_WORLD_1:      return \"WORLD 1\";\n        case GLFW_KEY_WORLD_2:      return \"WORLD 2\";\n\n        // Function keys\n        case GLFW_KEY_ESCAPE:       return \"ESCAPE\";\n        case GLFW_KEY_F1:           return \"F1\";\n        case GLFW_KEY_F2:           return \"F2\";\n        case GLFW_KEY_F3:           return \"F3\";\n        case GLFW_KEY_F4:           return \"F4\";\n        case GLFW_KEY_F5:           return \"F5\";\n        case GLFW_KEY_F6:           return \"F6\";\n        case GLFW_KEY_F7:           return \"F7\";\n        case GLFW_KEY_F8:           return \"F8\";\n        case GLFW_KEY_F9:           return \"F9\";\n        case GLFW_KEY_F10:          return \"F10\";\n        case GLFW_KEY_F11:          return \"F11\";\n        case GLFW_KEY_F12:          return \"F12\";\n        case GLFW_KEY_F13:          return \"F13\";\n        case GLFW_KEY_F14:          return \"F14\";\n        case GLFW_KEY_F15:          return \"F15\";\n        case GLFW_KEY_F16:          return \"F16\";\n        case GLFW_KEY_F17:          return \"F17\";\n        case GLFW_KEY_F18:          return \"F18\";\n        case GLFW_KEY_F19:          return \"F19\";\n        case GLFW_KEY_F20:          return \"F20\";\n        case GLFW_KEY_F21:          return \"F21\";\n        case GLFW_KEY_F22:          return \"F22\";\n        case GLFW_KEY_F23:          return \"F23\";\n        case GLFW_KEY_F24:          return \"F24\";\n        case GLFW_KEY_F25:          return \"F25\";\n        case GLFW_KEY_UP:           return \"UP\";\n        case GLFW_KEY_DOWN:         return \"DOWN\";\n        case GLFW_KEY_LEFT:         return \"LEFT\";\n        case GLFW_KEY_RIGHT:        return \"RIGHT\";\n        case GLFW_KEY_LEFT_SHIFT:   return \"LEFT SHIFT\";\n        case GLFW_KEY_RIGHT_SHIFT:  return \"RIGHT SHIFT\";\n        case GLFW_KEY_LEFT_CONTROL: return \"LEFT CONTROL\";\n        case GLFW_KEY_RIGHT_CONTROL: return \"RIGHT CONTROL\";\n        case GLFW_KEY_LEFT_ALT:     return \"LEFT ALT\";\n        case GLFW_KEY_RIGHT_ALT:    return \"RIGHT ALT\";\n        case GLFW_KEY_TAB:          return \"TAB\";\n        case GLFW_KEY_ENTER:        return \"ENTER\";\n        case GLFW_KEY_BACKSPACE:    return \"BACKSPACE\";\n        case GLFW_KEY_INSERT:       return \"INSERT\";\n        case GLFW_KEY_DELETE:       return \"DELETE\";\n        case GLFW_KEY_PAGE_UP:      return \"PAGE UP\";\n        case GLFW_KEY_PAGE_DOWN:    return \"PAGE DOWN\";\n        case GLFW_KEY_HOME:         return \"HOME\";\n        case GLFW_KEY_END:          return \"END\";\n        case GLFW_KEY_KP_0:         return \"KEYPAD 0\";\n        case GLFW_KEY_KP_1:         return \"KEYPAD 1\";\n        case GLFW_KEY_KP_2:         return \"KEYPAD 2\";\n        case GLFW_KEY_KP_3:         return \"KEYPAD 3\";\n        case GLFW_KEY_KP_4:         return \"KEYPAD 4\";\n        case GLFW_KEY_KP_5:         return \"KEYPAD 5\";\n        case GLFW_KEY_KP_6:         return \"KEYPAD 6\";\n        case GLFW_KEY_KP_7:         return \"KEYPAD 7\";\n        case GLFW_KEY_KP_8:         return \"KEYPAD 8\";\n        case GLFW_KEY_KP_9:         return \"KEYPAD 9\";\n        case GLFW_KEY_KP_DIVIDE:    return \"KEYPAD DIVIDE\";\n        case GLFW_KEY_KP_MULTIPLY:  return \"KEYPAD MULTPLY\";\n        case GLFW_KEY_KP_SUBTRACT:  return \"KEYPAD SUBTRACT\";\n        case GLFW_KEY_KP_ADD:       return \"KEYPAD ADD\";\n        case GLFW_KEY_KP_DECIMAL:   return \"KEYPAD DECIMAL\";\n        case GLFW_KEY_KP_EQUAL:     return \"KEYPAD EQUAL\";\n        case GLFW_KEY_KP_ENTER:     return \"KEYPAD ENTER\";\n        case GLFW_KEY_PRINT_SCREEN: return \"PRINT SCREEN\";\n        case GLFW_KEY_NUM_LOCK:     return \"NUM LOCK\";\n        case GLFW_KEY_CAPS_LOCK:    return \"CAPS LOCK\";\n        case GLFW_KEY_SCROLL_LOCK:  return \"SCROLL LOCK\";\n        case GLFW_KEY_PAUSE:        return \"PAUSE\";\n        case GLFW_KEY_LEFT_SUPER:   return \"LEFT SUPER\";\n        case GLFW_KEY_RIGHT_SUPER:  return \"RIGHT SUPER\";\n        case GLFW_KEY_MENU:         return \"MENU\";\n\n        default:                    return \"UNKNOWN\";\n    }\n}\n\nstatic const char* get_action_name(int action)\n{\n    switch (action)\n    {\n        case GLFW_PRESS:\n            return \"pressed\";\n        case GLFW_RELEASE:\n            return \"released\";\n        case GLFW_REPEAT:\n            return \"repeated\";\n    }\n\n    return \"caused unknown action\";\n}\n\nstatic const char* get_button_name(int button)\n{\n    switch (button)\n    {\n        case GLFW_MOUSE_BUTTON_LEFT:\n            return \"left\";\n        case GLFW_MOUSE_BUTTON_RIGHT:\n            return \"right\";\n        case GLFW_MOUSE_BUTTON_MIDDLE:\n            return \"middle\";\n        default:\n        {\n            static char name[16];\n            snprintf(name, sizeof(name), \"%i\", button);\n            return name;\n        }\n    }\n}\n\nstatic const char* get_mods_name(int mods)\n{\n    static char name[512];\n\n    if (mods == 0)\n        return \" no mods\";\n\n    name[0] = '\\0';\n\n    if (mods & GLFW_MOD_SHIFT)\n        strcat(name, \" shift\");\n    if (mods & GLFW_MOD_CONTROL)\n        strcat(name, \" control\");\n    if (mods & GLFW_MOD_ALT)\n        strcat(name, \" alt\");\n    if (mods & GLFW_MOD_SUPER)\n        strcat(name, \" super\");\n\n    return name;\n}\n\nstatic const char* get_character_string(int codepoint)\n{\n    // This assumes UTF-8, which is stupid\n    static char result[6 + 1];\n\n    int length = wctomb(result, codepoint);\n    if (length == -1)\n        length = 0;\n\n    result[length] = '\\0';\n    return result;\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void window_pos_callback(GLFWwindow* window, int x, int y)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Window position: %i %i\\n\",\n           counter++, slot->number, glfwGetTime(), x, y);\n}\n\nstatic void window_size_callback(GLFWwindow* window, int width, int height)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Window size: %i %i\\n\",\n           counter++, slot->number, glfwGetTime(), width, height);\n}\n\nstatic void framebuffer_size_callback(GLFWwindow* window, int width, int height)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Framebuffer size: %i %i\\n\",\n           counter++, slot->number, glfwGetTime(), width, height);\n\n    glViewport(0, 0, width, height);\n}\n\nstatic void window_close_callback(GLFWwindow* window)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Window close\\n\",\n           counter++, slot->number, glfwGetTime());\n\n    glfwSetWindowShouldClose(window, slot->closeable);\n}\n\nstatic void window_refresh_callback(GLFWwindow* window)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Window refresh\\n\",\n           counter++, slot->number, glfwGetTime());\n\n    glfwMakeContextCurrent(window);\n    glClear(GL_COLOR_BUFFER_BIT);\n    glfwSwapBuffers(window);\n}\n\nstatic void window_focus_callback(GLFWwindow* window, int focused)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Window %s\\n\",\n           counter++, slot->number, glfwGetTime(),\n           focused ? \"focused\" : \"defocused\");\n}\n\nstatic void window_iconify_callback(GLFWwindow* window, int iconified)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Window was %s\\n\",\n           counter++, slot->number, glfwGetTime(),\n           iconified ? \"iconified\" : \"uniconified\");\n}\n\nstatic void window_maximize_callback(GLFWwindow* window, int maximized)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Window was %s\\n\",\n           counter++, slot->number, glfwGetTime(),\n           maximized ? \"maximized\" : \"unmaximized\");\n}\n\nstatic void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Mouse button %i (%s) (with%s) was %s\\n\",\n           counter++, slot->number, glfwGetTime(), button,\n           get_button_name(button),\n           get_mods_name(mods),\n           get_action_name(action));\n}\n\nstatic void cursor_position_callback(GLFWwindow* window, double x, double y)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Cursor position: %f %f\\n\",\n           counter++, slot->number, glfwGetTime(), x, y);\n}\n\nstatic void cursor_enter_callback(GLFWwindow* window, int entered)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Cursor %s window\\n\",\n           counter++, slot->number, glfwGetTime(),\n           entered ? \"entered\" : \"left\");\n}\n\nstatic void scroll_callback(GLFWwindow* window, double x, double y)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Scroll: %0.3f %0.3f\\n\",\n           counter++, slot->number, glfwGetTime(), x, y);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    const char* name = glfwGetKeyName(key, scancode);\n\n    if (name)\n    {\n        printf(\"%08x to %i at %0.3f: Key 0x%04x Scancode 0x%04x (%s) (%s) (with%s) was %s\\n\",\n               counter++, slot->number, glfwGetTime(), key, scancode,\n               get_key_name(key),\n               name,\n               get_mods_name(mods),\n               get_action_name(action));\n    }\n    else\n    {\n        printf(\"%08x to %i at %0.3f: Key 0x%04x Scancode 0x%04x (%s) (with%s) was %s\\n\",\n               counter++, slot->number, glfwGetTime(), key, scancode,\n               get_key_name(key),\n               get_mods_name(mods),\n               get_action_name(action));\n    }\n\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_C:\n        {\n            slot->closeable = !slot->closeable;\n\n            printf(\"(( closing %s ))\\n\", slot->closeable ? \"enabled\" : \"disabled\");\n            break;\n        }\n    }\n}\n\nstatic void char_callback(GLFWwindow* window, unsigned int codepoint)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Character 0x%08x (%s) input\\n\",\n           counter++, slot->number, glfwGetTime(), codepoint,\n           get_character_string(codepoint));\n}\n\nstatic void char_mods_callback(GLFWwindow* window, unsigned int codepoint, int mods)\n{\n    Slot* slot = glfwGetWindowUserPointer(window);\n    printf(\"%08x to %i at %0.3f: Character 0x%08x (%s) with modifiers (with%s) input\\n\",\n            counter++, slot->number, glfwGetTime(), codepoint,\n            get_character_string(codepoint),\n            get_mods_name(mods));\n}\n\nstatic void drop_callback(GLFWwindow* window, int count, const char** paths)\n{\n    int i;\n    Slot* slot = glfwGetWindowUserPointer(window);\n\n    printf(\"%08x to %i at %0.3f: Drop input\\n\",\n           counter++, slot->number, glfwGetTime());\n\n    for (i = 0;  i < count;  i++)\n        printf(\"  %i: \\\"%s\\\"\\n\", i, paths[i]);\n}\n\nstatic void monitor_callback(GLFWmonitor* monitor, int event)\n{\n    if (event == GLFW_CONNECTED)\n    {\n        int x, y, widthMM, heightMM;\n        const GLFWvidmode* mode = glfwGetVideoMode(monitor);\n\n        glfwGetMonitorPos(monitor, &x, &y);\n        glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM);\n\n        printf(\"%08x at %0.3f: Monitor %s (%ix%i at %ix%i, %ix%i mm) was connected\\n\",\n               counter++,\n               glfwGetTime(),\n               glfwGetMonitorName(monitor),\n               mode->width, mode->height,\n               x, y,\n               widthMM, heightMM);\n    }\n    else if (event == GLFW_DISCONNECTED)\n    {\n        printf(\"%08x at %0.3f: Monitor %s was disconnected\\n\",\n               counter++,\n               glfwGetTime(),\n               glfwGetMonitorName(monitor));\n    }\n}\n\nstatic void joystick_callback(int jid, int event)\n{\n    if (event == GLFW_CONNECTED)\n    {\n        int axisCount, buttonCount, hatCount;\n\n        glfwGetJoystickAxes(jid, &axisCount);\n        glfwGetJoystickButtons(jid, &buttonCount);\n        glfwGetJoystickHats(jid, &hatCount);\n\n        printf(\"%08x at %0.3f: Joystick %i (%s) was connected with %i axes, %i buttons, and %i hats\\n\",\n               counter++, glfwGetTime(),\n               jid,\n               glfwGetJoystickName(jid),\n               axisCount,\n               buttonCount,\n               hatCount);\n    }\n    else\n    {\n        printf(\"%08x at %0.3f: Joystick %i was disconnected\\n\",\n               counter++, glfwGetTime(), jid);\n    }\n}\n\nint main(int argc, char** argv)\n{\n    Slot* slots;\n    GLFWmonitor* monitor = NULL;\n    int ch, i, width, height, count = 1;\n\n    setlocale(LC_ALL, \"\");\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    printf(\"Library initialized\\n\");\n\n    glfwSetMonitorCallback(monitor_callback);\n    glfwSetJoystickCallback(joystick_callback);\n\n    while ((ch = getopt(argc, argv, \"hfn:\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n\n            case 'f':\n                monitor = glfwGetPrimaryMonitor();\n                break;\n\n            case 'n':\n                count = (int) strtol(optarg, NULL, 10);\n                break;\n\n            default:\n                usage();\n                exit(EXIT_FAILURE);\n        }\n    }\n\n    if (monitor)\n    {\n        const GLFWvidmode* mode = glfwGetVideoMode(monitor);\n\n        glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);\n        glfwWindowHint(GLFW_RED_BITS, mode->redBits);\n        glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);\n        glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);\n\n        width = mode->width;\n        height = mode->height;\n    }\n    else\n    {\n        width  = 640;\n        height = 480;\n    }\n\n    if (!count)\n    {\n        fprintf(stderr, \"Invalid user\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    slots = calloc(count, sizeof(Slot));\n\n    for (i = 0;  i < count;  i++)\n    {\n        char title[128];\n\n        slots[i].closeable = GLFW_TRUE;\n        slots[i].number = i + 1;\n\n        snprintf(title, sizeof(title), \"Event Linter (Window %i)\", slots[i].number);\n\n        if (monitor)\n        {\n            printf(\"Creating full screen window %i (%ix%i on %s)\\n\",\n                   slots[i].number,\n                   width, height,\n                   glfwGetMonitorName(monitor));\n        }\n        else\n        {\n            printf(\"Creating windowed mode window %i (%ix%i)\\n\",\n                   slots[i].number,\n                   width, height);\n        }\n\n        slots[i].window = glfwCreateWindow(width, height, title, monitor, NULL);\n        if (!slots[i].window)\n        {\n            free(slots);\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n\n        glfwSetWindowUserPointer(slots[i].window, slots + i);\n\n        glfwSetWindowPosCallback(slots[i].window, window_pos_callback);\n        glfwSetWindowSizeCallback(slots[i].window, window_size_callback);\n        glfwSetFramebufferSizeCallback(slots[i].window, framebuffer_size_callback);\n        glfwSetWindowCloseCallback(slots[i].window, window_close_callback);\n        glfwSetWindowRefreshCallback(slots[i].window, window_refresh_callback);\n        glfwSetWindowFocusCallback(slots[i].window, window_focus_callback);\n        glfwSetWindowIconifyCallback(slots[i].window, window_iconify_callback);\n        glfwSetWindowMaximizeCallback(slots[i].window, window_maximize_callback);\n        glfwSetMouseButtonCallback(slots[i].window, mouse_button_callback);\n        glfwSetCursorPosCallback(slots[i].window, cursor_position_callback);\n        glfwSetCursorEnterCallback(slots[i].window, cursor_enter_callback);\n        glfwSetScrollCallback(slots[i].window, scroll_callback);\n        glfwSetKeyCallback(slots[i].window, key_callback);\n        glfwSetCharCallback(slots[i].window, char_callback);\n        glfwSetCharModsCallback(slots[i].window, char_mods_callback);\n        glfwSetDropCallback(slots[i].window, drop_callback);\n\n        glfwMakeContextCurrent(slots[i].window);\n        gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n        glfwSwapInterval(1);\n    }\n\n    printf(\"Main loop starting\\n\");\n\n    for (;;)\n    {\n        for (i = 0;  i < count;  i++)\n        {\n            if (glfwWindowShouldClose(slots[i].window))\n                break;\n        }\n\n        if (i < count)\n            break;\n\n        glfwWaitEvents();\n\n        // Workaround for an issue with msvcrt and mintty\n        fflush(stdout);\n    }\n\n    free(slots);\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/gamma.c",
    "content": "//========================================================================\n// Gamma correction test program\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This program is used to test the gamma correction functionality for\n// both full screen and windowed mode windows\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#define NK_IMPLEMENTATION\n#define NK_INCLUDE_FIXED_TYPES\n#define NK_INCLUDE_FONT_BAKING\n#define NK_INCLUDE_DEFAULT_FONT\n#define NK_INCLUDE_DEFAULT_ALLOCATOR\n#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n#define NK_INCLUDE_STANDARD_VARARGS\n#include <nuklear.h>\n\n#define NK_GLFW_GL2_IMPLEMENTATION\n#include <nuklear_glfw_gl2.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action == GLFW_PRESS && key == GLFW_KEY_ESCAPE)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\nstatic void chart_ramp_array(struct nk_context* nk,\n                             struct nk_color color,\n                             int count, unsigned short int* values)\n{\n    if (nk_chart_begin_colored(nk, NK_CHART_LINES,\n                               color, nk_rgb(255, 255, 255),\n                               count, 0, 65535))\n    {\n        int i;\n        for (i = 0;  i < count;  i++)\n        {\n            char buffer[1024];\n            if (nk_chart_push(nk, values[i]))\n            {\n                snprintf(buffer, sizeof(buffer), \"#%u: %u (%0.5f) \",\n                         i, values[i], values[i] / 65535.f);\n                nk_tooltip(nk, buffer);\n            }\n        }\n\n        nk_chart_end(nk);\n    }\n}\n\nint main(int argc, char** argv)\n{\n    GLFWmonitor* monitor = NULL;\n    GLFWwindow* window;\n    struct nk_context* nk;\n    struct nk_font_atlas* atlas;\n    float gamma_value = 1.f;\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    monitor = glfwGetPrimaryMonitor();\n\n    window = glfwCreateWindow(800, 400, \"Gamma Test\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    nk = nk_glfw3_init(window, NK_GLFW3_INSTALL_CALLBACKS);\n    nk_glfw3_font_stash_begin(&atlas);\n    nk_glfw3_font_stash_end();\n\n    glfwSetKeyCallback(window, key_callback);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        int width, height;\n        struct nk_rect area;\n\n        glfwGetWindowSize(window, &width, &height);\n        area = nk_rect(0.f, 0.f, (float) width, (float) height);\n\n        glClear(GL_COLOR_BUFFER_BIT);\n        nk_glfw3_new_frame();\n        if (nk_begin(nk, \"\", area, 0))\n        {\n            const GLFWgammaramp* ramp = glfwGetGammaRamp(monitor);\n            nk_window_set_bounds(nk, area);\n\n            nk_layout_row_dynamic(nk, 30, 2);\n            if (nk_slider_float(nk, 0.1f, &gamma_value, 5.f, 0.1f))\n                glfwSetGamma(monitor, gamma_value);\n            nk_labelf(nk, NK_TEXT_LEFT, \"%0.1f\", gamma_value);\n\n            nk_layout_row_dynamic(nk, height - 60.f, 3);\n            chart_ramp_array(nk, nk_rgb(255, 0, 0), ramp->size, ramp->red);\n            chart_ramp_array(nk, nk_rgb(0, 255, 0), ramp->size, ramp->green);\n            chart_ramp_array(nk, nk_rgb(0,0,  255), ramp->size, ramp->blue);\n        }\n\n        nk_end(nk);\n        nk_glfw3_render(NK_ANTI_ALIASING_ON);\n\n        glfwSwapBuffers(window);\n        glfwWaitEventsTimeout(1.0);\n    }\n\n    nk_glfw3_shutdown();\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/glfwinfo.c",
    "content": "//========================================================================\n// Context creation and information tool\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n\n#define VK_NO_PROTOTYPES\n#include <vulkan/vulkan.h>\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"getopt.h\"\n\n#ifdef _MSC_VER\n#define strcasecmp(x, y) _stricmp(x, y)\n#endif\n\n#define API_NAME_OPENGL     \"gl\"\n#define API_NAME_OPENGL_ES  \"es\"\n\n#define API_NAME_NATIVE     \"native\"\n#define API_NAME_EGL        \"egl\"\n#define API_NAME_OSMESA     \"osmesa\"\n\n#define PROFILE_NAME_CORE   \"core\"\n#define PROFILE_NAME_COMPAT \"compat\"\n\n#define STRATEGY_NAME_NONE  \"none\"\n#define STRATEGY_NAME_LOSE  \"lose\"\n\n#define BEHAVIOR_NAME_NONE  \"none\"\n#define BEHAVIOR_NAME_FLUSH \"flush\"\n\nstatic void usage(void)\n{\n    printf(\"Usage: glfwinfo [OPTION]...\\n\");\n    printf(\"Options:\\n\");\n    printf(\"  -a, --client-api=API      the client API to use (\"\n                                        API_NAME_OPENGL \" or \"\n                                        API_NAME_OPENGL_ES \")\\n\");\n    printf(\"  -b, --behavior=BEHAVIOR   the release behavior to use (\"\n                                        BEHAVIOR_NAME_NONE \" or \"\n                                        BEHAVIOR_NAME_FLUSH \")\\n\");\n    printf(\"  -c, --context-api=API     the context creation API to use (\"\n                                        API_NAME_NATIVE \" or \"\n                                        API_NAME_EGL \" or \"\n                                        API_NAME_OSMESA \")\\n\");\n    printf(\"  -d, --debug               request a debug context\\n\");\n    printf(\"  -f, --forward             require a forward-compatible context\\n\");\n    printf(\"  -h, --help                show this help\\n\");\n    printf(\"  -l, --list-extensions     list all Vulkan and client API extensions\\n\");\n    printf(\"      --list-layers         list all Vulkan layers\\n\");\n    printf(\"  -m, --major=MAJOR         the major number of the required \"\n                                        \"client API version\\n\");\n    printf(\"  -n, --minor=MINOR         the minor number of the required \"\n                                        \"client API version\\n\");\n    printf(\"  -p, --profile=PROFILE     the OpenGL profile to use (\"\n                                        PROFILE_NAME_CORE \" or \"\n                                        PROFILE_NAME_COMPAT \")\\n\");\n    printf(\"  -s, --robustness=STRATEGY the robustness strategy to use (\"\n                                        STRATEGY_NAME_NONE \" or \"\n                                        STRATEGY_NAME_LOSE \")\\n\");\n    printf(\"  -v, --version             print version information\\n\");\n    printf(\"      --red-bits=N          the number of red bits to request\\n\");\n    printf(\"      --green-bits=N        the number of green bits to request\\n\");\n    printf(\"      --blue-bits=N         the number of blue bits to request\\n\");\n    printf(\"      --alpha-bits=N        the number of alpha bits to request\\n\");\n    printf(\"      --depth-bits=N        the number of depth bits to request\\n\");\n    printf(\"      --stencil-bits=N      the number of stencil bits to request\\n\");\n    printf(\"      --accum-red-bits=N    the number of red bits to request\\n\");\n    printf(\"      --accum-green-bits=N  the number of green bits to request\\n\");\n    printf(\"      --accum-blue-bits=N   the number of blue bits to request\\n\");\n    printf(\"      --accum-alpha-bits=N  the number of alpha bits to request\\n\");\n    printf(\"      --aux-buffers=N       the number of aux buffers to request\\n\");\n    printf(\"      --samples=N           the number of MSAA samples to request\\n\");\n    printf(\"      --stereo              request stereo rendering\\n\");\n    printf(\"      --srgb                request an sRGB capable framebuffer\\n\");\n    printf(\"      --singlebuffer        request single-buffering\\n\");\n    printf(\"      --no-error            request a context that does not emit errors\\n\");\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic const char* get_device_type_name(VkPhysicalDeviceType type)\n{\n    if (type == VK_PHYSICAL_DEVICE_TYPE_OTHER)\n        return \"other\";\n    else if (type == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU)\n        return \"integrated GPU\";\n    else if (type == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU)\n        return \"discrete GPU\";\n    else if (type == VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU)\n        return \"virtual GPU\";\n    else if (type == VK_PHYSICAL_DEVICE_TYPE_CPU)\n        return \"CPU\";\n\n    return \"unknown\";\n}\n\nstatic const char* get_api_name(int api)\n{\n    if (api == GLFW_OPENGL_API)\n        return \"OpenGL\";\n    else if (api == GLFW_OPENGL_ES_API)\n        return \"OpenGL ES\";\n\n    return \"Unknown API\";\n}\n\nstatic const char* get_profile_name_gl(GLint mask)\n{\n    if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT)\n        return PROFILE_NAME_COMPAT;\n    if (mask & GL_CONTEXT_CORE_PROFILE_BIT)\n        return PROFILE_NAME_CORE;\n\n    return \"unknown\";\n}\n\nstatic const char* get_profile_name_glfw(int profile)\n{\n    if (profile == GLFW_OPENGL_COMPAT_PROFILE)\n        return PROFILE_NAME_COMPAT;\n    if (profile == GLFW_OPENGL_CORE_PROFILE)\n        return PROFILE_NAME_CORE;\n\n    return \"unknown\";\n}\n\nstatic const char* get_strategy_name_gl(GLint strategy)\n{\n    if (strategy == GL_LOSE_CONTEXT_ON_RESET_ARB)\n        return STRATEGY_NAME_LOSE;\n    if (strategy == GL_NO_RESET_NOTIFICATION_ARB)\n        return STRATEGY_NAME_NONE;\n\n    return \"unknown\";\n}\n\nstatic const char* get_strategy_name_glfw(int strategy)\n{\n    if (strategy == GLFW_LOSE_CONTEXT_ON_RESET)\n        return STRATEGY_NAME_LOSE;\n    if (strategy == GLFW_NO_RESET_NOTIFICATION)\n        return STRATEGY_NAME_NONE;\n\n    return \"unknown\";\n}\n\nstatic void list_context_extensions(int client, int major, int minor)\n{\n    int i;\n    GLint count;\n    const GLubyte* extensions;\n\n    printf(\"%s context extensions:\\n\", get_api_name(client));\n\n    if (client == GLFW_OPENGL_API && major > 2)\n    {\n        glGetIntegerv(GL_NUM_EXTENSIONS, &count);\n\n        for (i = 0;  i < count;  i++)\n            printf(\" %s\\n\", (const char*) glGetStringi(GL_EXTENSIONS, i));\n    }\n    else\n    {\n        extensions = glGetString(GL_EXTENSIONS);\n        while (*extensions != '\\0')\n        {\n            putchar(' ');\n\n            while (*extensions != '\\0' && *extensions != ' ')\n            {\n                putchar(*extensions);\n                extensions++;\n            }\n\n            while (*extensions == ' ')\n                extensions++;\n\n            putchar('\\n');\n        }\n    }\n}\n\nstatic void list_vulkan_instance_extensions(void)\n{\n    uint32_t i, ep_count = 0;\n    VkExtensionProperties* ep;\n    PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties =\n        (PFN_vkEnumerateInstanceExtensionProperties)\n        glfwGetInstanceProcAddress(NULL, \"vkEnumerateInstanceExtensionProperties\");\n\n    printf(\"Vulkan instance extensions:\\n\");\n\n    if (vkEnumerateInstanceExtensionProperties(NULL, &ep_count, NULL) != VK_SUCCESS)\n        return;\n\n    ep = calloc(ep_count, sizeof(VkExtensionProperties));\n\n    if (vkEnumerateInstanceExtensionProperties(NULL, &ep_count, ep) != VK_SUCCESS)\n    {\n        free(ep);\n        return;\n    }\n\n    for (i = 0;  i < ep_count;  i++)\n        printf(\" %s (v%u)\\n\", ep[i].extensionName, ep[i].specVersion);\n\n    free(ep);\n}\n\nstatic void list_vulkan_instance_layers(void)\n{\n    uint32_t i, lp_count = 0;\n    VkLayerProperties* lp;\n    PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties =\n        (PFN_vkEnumerateInstanceLayerProperties)\n        glfwGetInstanceProcAddress(NULL, \"vkEnumerateInstanceLayerProperties\");\n\n    printf(\"Vulkan instance layers:\\n\");\n\n    if (vkEnumerateInstanceLayerProperties(&lp_count, NULL) != VK_SUCCESS)\n        return;\n\n    lp = calloc(lp_count, sizeof(VkLayerProperties));\n\n    if (vkEnumerateInstanceLayerProperties(&lp_count, lp) != VK_SUCCESS)\n    {\n        free(lp);\n        return;\n    }\n\n    for (i = 0;  i < lp_count;  i++)\n    {\n        printf(\" %s (v%u) \\\"%s\\\"\\n\",\n               lp[i].layerName,\n               lp[i].specVersion >> 22,\n               lp[i].description);\n    }\n\n    free(lp);\n}\n\nstatic void list_vulkan_device_extensions(VkInstance instance, VkPhysicalDevice device)\n{\n    uint32_t i, ep_count;\n    VkExtensionProperties* ep;\n    PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties =\n        (PFN_vkEnumerateDeviceExtensionProperties)\n        glfwGetInstanceProcAddress(instance, \"vkEnumerateDeviceExtensionProperties\");\n\n    printf(\"Vulkan device extensions:\\n\");\n\n    if (vkEnumerateDeviceExtensionProperties(device, NULL, &ep_count, NULL) != VK_SUCCESS)\n        return;\n\n    ep = calloc(ep_count, sizeof(VkExtensionProperties));\n\n    if (vkEnumerateDeviceExtensionProperties(device, NULL, &ep_count, ep) != VK_SUCCESS)\n    {\n        free(ep);\n        return;\n    }\n\n    for (i = 0;  i < ep_count;  i++)\n        printf(\" %s (v%u)\\n\", ep[i].extensionName, ep[i].specVersion);\n\n    free(ep);\n}\n\nstatic void list_vulkan_device_layers(VkInstance instance, VkPhysicalDevice device)\n{\n    uint32_t i, lp_count;\n    VkLayerProperties* lp;\n    PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties =\n        (PFN_vkEnumerateDeviceLayerProperties)\n        glfwGetInstanceProcAddress(instance, \"vkEnumerateDeviceLayerProperties\");\n\n    printf(\"Vulkan device layers:\\n\");\n\n    if (vkEnumerateDeviceLayerProperties(device, &lp_count, NULL) != VK_SUCCESS)\n        return;\n\n    lp = calloc(lp_count, sizeof(VkLayerProperties));\n\n    if (vkEnumerateDeviceLayerProperties(device, &lp_count, lp) != VK_SUCCESS)\n    {\n        free(lp);\n        return;\n    }\n\n    for (i = 0;  i < lp_count;  i++)\n    {\n        printf(\" %s (v%u) \\\"%s\\\"\\n\",\n               lp[i].layerName,\n               lp[i].specVersion >> 22,\n               lp[i].description);\n    }\n\n    free(lp);\n}\n\nstatic int valid_version(void)\n{\n    int major, minor, revision;\n    glfwGetVersion(&major, &minor, &revision);\n\n    if (major != GLFW_VERSION_MAJOR)\n    {\n        printf(\"*** ERROR: GLFW major version mismatch! ***\\n\");\n        return GLFW_FALSE;\n    }\n\n    if (minor != GLFW_VERSION_MINOR || revision != GLFW_VERSION_REVISION)\n        printf(\"*** WARNING: GLFW version mismatch! ***\\n\");\n\n    return GLFW_TRUE;\n}\n\nstatic void print_version(void)\n{\n    int major, minor, revision;\n    glfwGetVersion(&major, &minor, &revision);\n\n    printf(\"GLFW header version: %u.%u.%u\\n\",\n           GLFW_VERSION_MAJOR,\n           GLFW_VERSION_MINOR,\n           GLFW_VERSION_REVISION);\n    printf(\"GLFW library version: %u.%u.%u\\n\", major, minor, revision);\n    printf(\"GLFW library version string: \\\"%s\\\"\\n\", glfwGetVersionString());\n}\n\nint main(int argc, char** argv)\n{\n    int ch, client, major, minor, revision, profile;\n    GLint redbits, greenbits, bluebits, alphabits, depthbits, stencilbits;\n    int list_extensions = GLFW_FALSE, list_layers = GLFW_FALSE;\n    GLenum error;\n    GLFWwindow* window;\n\n    enum { CLIENT, CONTEXT, BEHAVIOR, DEBUG, FORWARD, HELP, EXTENSIONS, LAYERS,\n           MAJOR, MINOR, PROFILE, ROBUSTNESS, VERSION,\n           REDBITS, GREENBITS, BLUEBITS, ALPHABITS, DEPTHBITS, STENCILBITS,\n           ACCUMREDBITS, ACCUMGREENBITS, ACCUMBLUEBITS, ACCUMALPHABITS,\n           AUXBUFFERS, SAMPLES, STEREO, SRGB, SINGLEBUFFER, NOERROR_SRSLY };\n    const struct option options[] =\n    {\n        { \"behavior\",         1, NULL, BEHAVIOR },\n        { \"client-api\",       1, NULL, CLIENT },\n        { \"context-api\",      1, NULL, CONTEXT },\n        { \"debug\",            0, NULL, DEBUG },\n        { \"forward\",          0, NULL, FORWARD },\n        { \"help\",             0, NULL, HELP },\n        { \"list-extensions\",  0, NULL, EXTENSIONS },\n        { \"list-layers\",      0, NULL, LAYERS },\n        { \"major\",            1, NULL, MAJOR },\n        { \"minor\",            1, NULL, MINOR },\n        { \"profile\",          1, NULL, PROFILE },\n        { \"robustness\",       1, NULL, ROBUSTNESS },\n        { \"version\",          0, NULL, VERSION },\n        { \"red-bits\",         1, NULL, REDBITS },\n        { \"green-bits\",       1, NULL, GREENBITS },\n        { \"blue-bits\",        1, NULL, BLUEBITS },\n        { \"alpha-bits\",       1, NULL, ALPHABITS },\n        { \"depth-bits\",       1, NULL, DEPTHBITS },\n        { \"stencil-bits\",     1, NULL, STENCILBITS },\n        { \"accum-red-bits\",   1, NULL, ACCUMREDBITS },\n        { \"accum-green-bits\", 1, NULL, ACCUMGREENBITS },\n        { \"accum-blue-bits\",  1, NULL, ACCUMBLUEBITS },\n        { \"accum-alpha-bits\", 1, NULL, ACCUMALPHABITS },\n        { \"aux-buffers\",      1, NULL, AUXBUFFERS },\n        { \"samples\",          1, NULL, SAMPLES },\n        { \"stereo\",           0, NULL, STEREO },\n        { \"srgb\",             0, NULL, SRGB },\n        { \"singlebuffer\",     0, NULL, SINGLEBUFFER },\n        { \"no-error\",         0, NULL, NOERROR_SRSLY },\n        { NULL, 0, NULL, 0 }\n    };\n\n    // Initialize GLFW and create window\n\n    if (!valid_version())\n        exit(EXIT_FAILURE);\n\n    glfwSetErrorCallback(error_callback);\n\n    glfwInitHint(GLFW_COCOA_MENUBAR, GLFW_FALSE);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    while ((ch = getopt_long(argc, argv, \"a:b:c:dfhlm:n:p:s:v\", options, NULL)) != -1)\n    {\n        switch (ch)\n        {\n            case 'a':\n            case CLIENT:\n                if (strcasecmp(optarg, API_NAME_OPENGL) == 0)\n                    glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API);\n                else if (strcasecmp(optarg, API_NAME_OPENGL_ES) == 0)\n                    glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);\n                else\n                {\n                    usage();\n                    exit(EXIT_FAILURE);\n                }\n                break;\n            case 'b':\n            case BEHAVIOR:\n                if (strcasecmp(optarg, BEHAVIOR_NAME_NONE) == 0)\n                {\n                    glfwWindowHint(GLFW_CONTEXT_RELEASE_BEHAVIOR,\n                                   GLFW_RELEASE_BEHAVIOR_NONE);\n                }\n                else if (strcasecmp(optarg, BEHAVIOR_NAME_FLUSH) == 0)\n                {\n                    glfwWindowHint(GLFW_CONTEXT_RELEASE_BEHAVIOR,\n                                   GLFW_RELEASE_BEHAVIOR_FLUSH);\n                }\n                else\n                {\n                    usage();\n                    exit(EXIT_FAILURE);\n                }\n                break;\n            case 'c':\n            case CONTEXT:\n                if (strcasecmp(optarg, API_NAME_NATIVE) == 0)\n                    glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_NATIVE_CONTEXT_API);\n                else if (strcasecmp(optarg, API_NAME_EGL) == 0)\n                    glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_EGL_CONTEXT_API);\n                else if (strcasecmp(optarg, API_NAME_OSMESA) == 0)\n                    glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_OSMESA_CONTEXT_API);\n                else\n                {\n                    usage();\n                    exit(EXIT_FAILURE);\n                }\n                break;\n            case 'd':\n            case DEBUG:\n                glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE);\n                break;\n            case 'f':\n            case FORWARD:\n                glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);\n                break;\n            case 'h':\n            case HELP:\n                usage();\n                exit(EXIT_SUCCESS);\n            case 'l':\n            case EXTENSIONS:\n                list_extensions = GLFW_TRUE;\n                break;\n            case LAYERS:\n                list_layers = GLFW_TRUE;\n                break;\n            case 'm':\n            case MAJOR:\n                glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, atoi(optarg));\n                break;\n            case 'n':\n            case MINOR:\n                glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, atoi(optarg));\n                break;\n            case 'p':\n            case PROFILE:\n                if (strcasecmp(optarg, PROFILE_NAME_CORE) == 0)\n                {\n                    glfwWindowHint(GLFW_OPENGL_PROFILE,\n                                   GLFW_OPENGL_CORE_PROFILE);\n                }\n                else if (strcasecmp(optarg, PROFILE_NAME_COMPAT) == 0)\n                {\n                    glfwWindowHint(GLFW_OPENGL_PROFILE,\n                                   GLFW_OPENGL_COMPAT_PROFILE);\n                }\n                else\n                {\n                    usage();\n                    exit(EXIT_FAILURE);\n                }\n                break;\n            case 's':\n            case ROBUSTNESS:\n                if (strcasecmp(optarg, STRATEGY_NAME_NONE) == 0)\n                {\n                    glfwWindowHint(GLFW_CONTEXT_ROBUSTNESS,\n                                   GLFW_NO_RESET_NOTIFICATION);\n                }\n                else if (strcasecmp(optarg, STRATEGY_NAME_LOSE) == 0)\n                {\n                    glfwWindowHint(GLFW_CONTEXT_ROBUSTNESS,\n                                   GLFW_LOSE_CONTEXT_ON_RESET);\n                }\n                else\n                {\n                    usage();\n                    exit(EXIT_FAILURE);\n                }\n                break;\n            case 'v':\n            case VERSION:\n                print_version();\n                exit(EXIT_SUCCESS);\n            case REDBITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_RED_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_RED_BITS, atoi(optarg));\n                break;\n            case GREENBITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_GREEN_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_GREEN_BITS, atoi(optarg));\n                break;\n            case BLUEBITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_BLUE_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_BLUE_BITS, atoi(optarg));\n                break;\n            case ALPHABITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_ALPHA_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_ALPHA_BITS, atoi(optarg));\n                break;\n            case DEPTHBITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_DEPTH_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_DEPTH_BITS, atoi(optarg));\n                break;\n            case STENCILBITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_STENCIL_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_STENCIL_BITS, atoi(optarg));\n                break;\n            case ACCUMREDBITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_ACCUM_RED_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_ACCUM_RED_BITS, atoi(optarg));\n                break;\n            case ACCUMGREENBITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_ACCUM_GREEN_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_ACCUM_GREEN_BITS, atoi(optarg));\n                break;\n            case ACCUMBLUEBITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_ACCUM_BLUE_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_ACCUM_BLUE_BITS, atoi(optarg));\n                break;\n            case ACCUMALPHABITS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_ACCUM_ALPHA_BITS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_ACCUM_ALPHA_BITS, atoi(optarg));\n                break;\n            case AUXBUFFERS:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_AUX_BUFFERS, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_AUX_BUFFERS, atoi(optarg));\n                break;\n            case SAMPLES:\n                if (strcmp(optarg, \"-\") == 0)\n                    glfwWindowHint(GLFW_SAMPLES, GLFW_DONT_CARE);\n                else\n                    glfwWindowHint(GLFW_SAMPLES, atoi(optarg));\n                break;\n            case STEREO:\n                glfwWindowHint(GLFW_STEREO, GLFW_TRUE);\n                break;\n            case SRGB:\n                glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE);\n                break;\n            case SINGLEBUFFER:\n                glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_FALSE);\n                break;\n            case NOERROR_SRSLY:\n                glfwWindowHint(GLFW_CONTEXT_NO_ERROR, GLFW_TRUE);\n                break;\n            default:\n                usage();\n                exit(EXIT_FAILURE);\n        }\n    }\n\n    print_version();\n\n    glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);\n\n    window = glfwCreateWindow(200, 200, \"Version\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n\n    error = glGetError();\n    if (error != GL_NO_ERROR)\n        printf(\"*** OpenGL error after make current: 0x%08x ***\\n\", error);\n\n    // Report client API version\n\n    client = glfwGetWindowAttrib(window, GLFW_CLIENT_API);\n    major = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR);\n    minor = glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MINOR);\n    revision = glfwGetWindowAttrib(window, GLFW_CONTEXT_REVISION);\n    profile = glfwGetWindowAttrib(window, GLFW_OPENGL_PROFILE);\n\n    printf(\"%s context version string: \\\"%s\\\"\\n\",\n           get_api_name(client),\n           glGetString(GL_VERSION));\n\n    printf(\"%s context version parsed by GLFW: %u.%u.%u\\n\",\n           get_api_name(client),\n           major, minor, revision);\n\n    // Report client API context properties\n\n    if (client == GLFW_OPENGL_API)\n    {\n        if (major >= 3)\n        {\n            GLint flags;\n\n            glGetIntegerv(GL_CONTEXT_FLAGS, &flags);\n            printf(\"%s context flags (0x%08x):\", get_api_name(client), flags);\n\n            if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT)\n                printf(\" forward-compatible\");\n            if (flags & 2/*GL_CONTEXT_FLAG_DEBUG_BIT*/)\n                printf(\" debug\");\n            if (flags & GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB)\n                printf(\" robustness\");\n            if (flags & 8/*GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR*/)\n                printf(\" no-error\");\n            putchar('\\n');\n\n            printf(\"%s context flags parsed by GLFW:\", get_api_name(client));\n\n            if (glfwGetWindowAttrib(window, GLFW_OPENGL_FORWARD_COMPAT))\n                printf(\" forward-compatible\");\n            if (glfwGetWindowAttrib(window, GLFW_OPENGL_DEBUG_CONTEXT))\n                printf(\" debug\");\n            if (glfwGetWindowAttrib(window, GLFW_CONTEXT_ROBUSTNESS) == GLFW_LOSE_CONTEXT_ON_RESET)\n                printf(\" robustness\");\n            if (glfwGetWindowAttrib(window, GLFW_CONTEXT_NO_ERROR))\n                printf(\" no-error\");\n            putchar('\\n');\n        }\n\n        if (major >= 4 || (major == 3 && minor >= 2))\n        {\n            GLint mask;\n            glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);\n\n            printf(\"%s profile mask (0x%08x): %s\\n\",\n                   get_api_name(client),\n                   mask,\n                   get_profile_name_gl(mask));\n\n            printf(\"%s profile mask parsed by GLFW: %s\\n\",\n                   get_api_name(client),\n                   get_profile_name_glfw(profile));\n        }\n\n        if (GLAD_GL_ARB_robustness)\n        {\n            const int robustness = glfwGetWindowAttrib(window, GLFW_CONTEXT_ROBUSTNESS);\n            GLint strategy;\n            glGetIntegerv(GL_RESET_NOTIFICATION_STRATEGY_ARB, &strategy);\n\n            printf(\"%s robustness strategy (0x%08x): %s\\n\",\n                   get_api_name(client),\n                   strategy,\n                   get_strategy_name_gl(strategy));\n\n            printf(\"%s robustness strategy parsed by GLFW: %s\\n\",\n                   get_api_name(client),\n                   get_strategy_name_glfw(robustness));\n        }\n    }\n\n    printf(\"%s context renderer string: \\\"%s\\\"\\n\",\n           get_api_name(client),\n           glGetString(GL_RENDERER));\n    printf(\"%s context vendor string: \\\"%s\\\"\\n\",\n           get_api_name(client),\n           glGetString(GL_VENDOR));\n\n    if (major >= 2)\n    {\n        printf(\"%s context shading language version: \\\"%s\\\"\\n\",\n               get_api_name(client),\n               glGetString(GL_SHADING_LANGUAGE_VERSION));\n    }\n\n    printf(\"%s framebuffer:\\n\", get_api_name(client));\n\n    if (client == GLFW_OPENGL_API && profile == GLFW_OPENGL_CORE_PROFILE)\n    {\n        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,\n                                              GL_BACK_LEFT,\n                                              GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE,\n                                              &redbits);\n        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,\n                                              GL_BACK_LEFT,\n                                              GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,\n                                              &greenbits);\n        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,\n                                              GL_BACK_LEFT,\n                                              GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE,\n                                              &bluebits);\n        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,\n                                              GL_BACK_LEFT,\n                                              GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,\n                                              &alphabits);\n        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,\n                                              GL_DEPTH,\n                                              GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE,\n                                              &depthbits);\n        glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,\n                                              GL_STENCIL,\n                                              GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE,\n                                              &stencilbits);\n    }\n    else\n    {\n        glGetIntegerv(GL_RED_BITS, &redbits);\n        glGetIntegerv(GL_GREEN_BITS, &greenbits);\n        glGetIntegerv(GL_BLUE_BITS, &bluebits);\n        glGetIntegerv(GL_ALPHA_BITS, &alphabits);\n        glGetIntegerv(GL_DEPTH_BITS, &depthbits);\n        glGetIntegerv(GL_STENCIL_BITS, &stencilbits);\n    }\n\n    printf(\" red: %u green: %u blue: %u alpha: %u depth: %u stencil: %u\\n\",\n           redbits, greenbits, bluebits, alphabits, depthbits, stencilbits);\n\n    if (client == GLFW_OPENGL_ES_API ||\n        GLAD_GL_ARB_multisample ||\n        major > 1 || minor >= 3)\n    {\n        GLint samples, samplebuffers;\n        glGetIntegerv(GL_SAMPLES, &samples);\n        glGetIntegerv(GL_SAMPLE_BUFFERS, &samplebuffers);\n\n        printf(\" samples: %u sample buffers: %u\\n\", samples, samplebuffers);\n    }\n\n    if (client == GLFW_OPENGL_API && profile != GLFW_OPENGL_CORE_PROFILE)\n    {\n        GLint accumredbits, accumgreenbits, accumbluebits, accumalphabits;\n        GLint auxbuffers;\n\n        glGetIntegerv(GL_ACCUM_RED_BITS, &accumredbits);\n        glGetIntegerv(GL_ACCUM_GREEN_BITS, &accumgreenbits);\n        glGetIntegerv(GL_ACCUM_BLUE_BITS, &accumbluebits);\n        glGetIntegerv(GL_ACCUM_ALPHA_BITS, &accumalphabits);\n        glGetIntegerv(GL_AUX_BUFFERS, &auxbuffers);\n\n        printf(\" accum red: %u accum green: %u accum blue: %u accum alpha: %u aux buffers: %u\\n\",\n               accumredbits, accumgreenbits, accumbluebits, accumalphabits, auxbuffers);\n    }\n\n    if (list_extensions)\n        list_context_extensions(client, major, minor);\n\n    printf(\"Vulkan loader: %s\\n\",\n           glfwVulkanSupported() ? \"available\" : \"missing\");\n\n    if (glfwVulkanSupported())\n    {\n        uint32_t i, re_count, pd_count;\n        const char** re;\n        VkApplicationInfo ai = {0};\n        VkInstanceCreateInfo ici = {0};\n        VkInstance instance;\n        VkPhysicalDevice* pd;\n        PFN_vkCreateInstance vkCreateInstance = (PFN_vkCreateInstance)\n            glfwGetInstanceProcAddress(NULL, \"vkCreateInstance\");\n        PFN_vkDestroyInstance vkDestroyInstance;\n        PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;\n        PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;\n\n        re = glfwGetRequiredInstanceExtensions(&re_count);\n\n        printf(\"Vulkan required instance extensions:\");\n        if (re)\n        {\n            for (i = 0;  i < re_count;  i++)\n                printf(\" %s\", re[i]);\n            putchar('\\n');\n        }\n        else\n            printf(\" missing\\n\");\n\n        if (list_extensions)\n            list_vulkan_instance_extensions();\n\n        if (list_layers)\n            list_vulkan_instance_layers();\n\n        ai.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;\n        ai.pApplicationName = \"glfwinfo\";\n        ai.applicationVersion = GLFW_VERSION_MAJOR;\n        ai.pEngineName = \"GLFW\";\n        ai.engineVersion = GLFW_VERSION_MAJOR;\n        ai.apiVersion = VK_API_VERSION_1_0;\n\n        ici.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;\n        ici.pApplicationInfo = &ai;\n        ici.enabledExtensionCount = re_count;\n        ici.ppEnabledExtensionNames = re;\n\n        if (vkCreateInstance(&ici, NULL, &instance) != VK_SUCCESS)\n        {\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n\n        vkDestroyInstance = (PFN_vkDestroyInstance)\n            glfwGetInstanceProcAddress(instance, \"vkDestroyInstance\");\n        vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)\n            glfwGetInstanceProcAddress(instance, \"vkEnumeratePhysicalDevices\");\n        vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)\n            glfwGetInstanceProcAddress(instance, \"vkGetPhysicalDeviceProperties\");\n\n        if (vkEnumeratePhysicalDevices(instance, &pd_count, NULL) != VK_SUCCESS)\n        {\n            vkDestroyInstance(instance, NULL);\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n\n        pd = calloc(pd_count, sizeof(VkPhysicalDevice));\n\n        if (vkEnumeratePhysicalDevices(instance, &pd_count, pd) != VK_SUCCESS)\n        {\n            free(pd);\n            vkDestroyInstance(instance, NULL);\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n\n        for (i = 0;  i < pd_count;  i++)\n        {\n            VkPhysicalDeviceProperties pdp;\n\n            vkGetPhysicalDeviceProperties(pd[i], &pdp);\n\n            printf(\"Vulkan %s device: \\\"%s\\\"\\n\",\n                   get_device_type_name(pdp.deviceType),\n                   pdp.deviceName);\n\n            if (list_extensions)\n                list_vulkan_device_extensions(instance, pd[i]);\n\n            if (list_layers)\n                list_vulkan_device_layers(instance, pd[i]);\n        }\n\n        free(pd);\n        vkDestroyInstance(instance, NULL);\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/icon.c",
    "content": "//========================================================================\n// Window icon test program\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This program is used to test the icon feature.\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n// a simple glfw logo\nconst char* const logo[] =\n{\n    \"................\",\n    \"................\",\n    \"...0000..0......\",\n    \"...0.....0......\",\n    \"...0.00..0......\",\n    \"...0..0..0......\",\n    \"...0000..0000...\",\n    \"................\",\n    \"................\",\n    \"...000..0...0...\",\n    \"...0....0...0...\",\n    \"...000..0.0.0...\",\n    \"...0....0.0.0...\",\n    \"...0....00000...\",\n    \"................\",\n    \"................\"\n};\n\nconst unsigned char icon_colors[5][4] =\n{\n    {   0,   0,   0, 255 }, // black\n    { 255,   0,   0, 255 }, // red\n    {   0, 255,   0, 255 }, // green\n    {   0,   0, 255, 255 }, // blue\n    { 255, 255, 255, 255 }  // white\n};\n\nstatic int cur_icon_color = 0;\n\nstatic void set_icon(GLFWwindow* window, int icon_color)\n{\n    int x, y;\n    unsigned char pixels[16 * 16 * 4];\n    unsigned char* target = pixels;\n    GLFWimage img = { 16, 16, pixels };\n\n    for (y = 0;  y < img.width;  y++)\n    {\n        for (x = 0;  x < img.height;  x++)\n        {\n            if (logo[y][x] == '0')\n                memcpy(target, icon_colors[icon_color], 4);\n            else\n                memset(target, 0, 4);\n\n            target += 4;\n        }\n    }\n\n    glfwSetWindowIcon(window, 1, &img);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, GLFW_TRUE);\n            break;\n        case GLFW_KEY_SPACE:\n            cur_icon_color = (cur_icon_color + 1) % 5;\n            set_icon(window, cur_icon_color);\n            break;\n        case GLFW_KEY_X:\n            glfwSetWindowIcon(window, 0, NULL);\n            break;\n    }\n}\n\nint main(int argc, char** argv)\n{\n    GLFWwindow* window;\n\n    if (!glfwInit())\n    {\n        fprintf(stderr, \"Failed to initialize GLFW\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    window = glfwCreateWindow(200, 200, \"Window Icon\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n\n        fprintf(stderr, \"Failed to open GLFW window\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n\n    glfwSetKeyCallback(window, key_callback);\n    set_icon(window, cur_icon_color);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        glClear(GL_COLOR_BUFFER_BIT);\n        glfwSwapBuffers(window);\n        glfwWaitEvents();\n    }\n\n    glfwDestroyWindow(window);\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/iconify.c",
    "content": "//========================================================================\n// Iconify/restore test program\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This program is used to test the iconify/restore functionality for\n// both full screen and windowed mode windows\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"getopt.h\"\n\nstatic int windowed_xpos, windowed_ypos, windowed_width, windowed_height;\n\nstatic void usage(void)\n{\n    printf(\"Usage: iconify [-h] [-f [-a] [-n]]\\n\");\n    printf(\"Options:\\n\");\n    printf(\"  -a create windows for all monitors\\n\");\n    printf(\"  -f create full screen window(s)\\n\");\n    printf(\"  -h show this help\\n\");\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    printf(\"%0.2f Key %s\\n\",\n           glfwGetTime(),\n           action == GLFW_PRESS ? \"pressed\" : \"released\");\n\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_I:\n            glfwIconifyWindow(window);\n            break;\n        case GLFW_KEY_M:\n            glfwMaximizeWindow(window);\n            break;\n        case GLFW_KEY_R:\n            glfwRestoreWindow(window);\n            break;\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, GLFW_TRUE);\n            break;\n        case GLFW_KEY_A:\n            glfwSetWindowAttrib(window, GLFW_AUTO_ICONIFY, !glfwGetWindowAttrib(window, GLFW_AUTO_ICONIFY));\n            break;\n        case GLFW_KEY_B:\n            glfwSetWindowAttrib(window, GLFW_RESIZABLE, !glfwGetWindowAttrib(window, GLFW_RESIZABLE));\n            break;\n        case GLFW_KEY_D:\n            glfwSetWindowAttrib(window, GLFW_DECORATED, !glfwGetWindowAttrib(window, GLFW_DECORATED));\n            break;\n        case GLFW_KEY_F:\n            glfwSetWindowAttrib(window, GLFW_FLOATING, !glfwGetWindowAttrib(window, GLFW_FLOATING));\n            break;\n        case GLFW_KEY_F11:\n        case GLFW_KEY_ENTER:\n        {\n            if (mods != GLFW_MOD_ALT)\n                return;\n\n            if (glfwGetWindowMonitor(window))\n            {\n                glfwSetWindowMonitor(window, NULL,\n                                     windowed_xpos, windowed_ypos,\n                                     windowed_width, windowed_height,\n                                     0);\n            }\n            else\n            {\n                GLFWmonitor* monitor = glfwGetPrimaryMonitor();\n                if (monitor)\n                {\n                    const GLFWvidmode* mode = glfwGetVideoMode(monitor);\n                    glfwGetWindowPos(window, &windowed_xpos, &windowed_ypos);\n                    glfwGetWindowSize(window, &windowed_width, &windowed_height);\n                    glfwSetWindowMonitor(window, monitor,\n                                         0, 0, mode->width, mode->height,\n                                         mode->refreshRate);\n                }\n            }\n\n            break;\n        }\n    }\n}\n\nstatic void window_size_callback(GLFWwindow* window, int width, int height)\n{\n    printf(\"%0.2f Window resized to %ix%i\\n\", glfwGetTime(), width, height);\n}\n\nstatic void framebuffer_size_callback(GLFWwindow* window, int width, int height)\n{\n    printf(\"%0.2f Framebuffer resized to %ix%i\\n\", glfwGetTime(), width, height);\n\n    glViewport(0, 0, width, height);\n}\n\nstatic void window_focus_callback(GLFWwindow* window, int focused)\n{\n    printf(\"%0.2f Window %s\\n\",\n           glfwGetTime(),\n           focused ? \"focused\" : \"defocused\");\n}\n\nstatic void window_iconify_callback(GLFWwindow* window, int iconified)\n{\n    printf(\"%0.2f Window %s\\n\",\n           glfwGetTime(),\n           iconified ? \"iconified\" : \"uniconified\");\n}\n\nstatic void window_maximize_callback(GLFWwindow* window, int maximized)\n{\n    printf(\"%0.2f Window %s\\n\",\n           glfwGetTime(),\n           maximized ? \"maximized\" : \"unmaximized\");\n}\n\nstatic void window_refresh_callback(GLFWwindow* window)\n{\n    printf(\"%0.2f Window refresh\\n\", glfwGetTime());\n\n    glfwMakeContextCurrent(window);\n\n    glClear(GL_COLOR_BUFFER_BIT);\n    glfwSwapBuffers(window);\n}\n\nstatic GLFWwindow* create_window(GLFWmonitor* monitor)\n{\n    int width, height;\n    GLFWwindow* window;\n\n    if (monitor)\n    {\n        const GLFWvidmode* mode = glfwGetVideoMode(monitor);\n\n        glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);\n        glfwWindowHint(GLFW_RED_BITS, mode->redBits);\n        glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);\n        glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);\n\n        width = mode->width;\n        height = mode->height;\n    }\n    else\n    {\n        width = 640;\n        height = 480;\n    }\n\n    window = glfwCreateWindow(width, height, \"Iconify\", monitor, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n\n    return window;\n}\n\nint main(int argc, char** argv)\n{\n    int ch, i, window_count;\n    int fullscreen = GLFW_FALSE, all_monitors = GLFW_FALSE;\n    GLFWwindow** windows;\n\n    while ((ch = getopt(argc, argv, \"afhn\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'a':\n                all_monitors = GLFW_TRUE;\n                break;\n\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n\n            case 'f':\n                fullscreen = GLFW_TRUE;\n                break;\n\n            default:\n                usage();\n                exit(EXIT_FAILURE);\n        }\n    }\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    if (fullscreen && all_monitors)\n    {\n        int monitor_count;\n        GLFWmonitor** monitors = glfwGetMonitors(&monitor_count);\n\n        window_count = monitor_count;\n        windows = calloc(window_count, sizeof(GLFWwindow*));\n\n        for (i = 0;  i < monitor_count;  i++)\n        {\n            windows[i] = create_window(monitors[i]);\n            if (!windows[i])\n                break;\n        }\n    }\n    else\n    {\n        GLFWmonitor* monitor = NULL;\n\n        if (fullscreen)\n            monitor = glfwGetPrimaryMonitor();\n\n        window_count = 1;\n        windows = calloc(window_count, sizeof(GLFWwindow*));\n        windows[0] = create_window(monitor);\n    }\n\n    for (i = 0;  i < window_count;  i++)\n    {\n        glfwSetKeyCallback(windows[i], key_callback);\n        glfwSetFramebufferSizeCallback(windows[i], framebuffer_size_callback);\n        glfwSetWindowSizeCallback(windows[i], window_size_callback);\n        glfwSetWindowFocusCallback(windows[i], window_focus_callback);\n        glfwSetWindowIconifyCallback(windows[i], window_iconify_callback);\n        glfwSetWindowMaximizeCallback(windows[i], window_maximize_callback);\n        glfwSetWindowRefreshCallback(windows[i], window_refresh_callback);\n\n        window_refresh_callback(windows[i]);\n\n        printf(\"Window is %s and %s\\n\",\n            glfwGetWindowAttrib(windows[i], GLFW_ICONIFIED) ? \"iconified\" : \"restored\",\n            glfwGetWindowAttrib(windows[i], GLFW_FOCUSED) ? \"focused\" : \"defocused\");\n    }\n\n    for (;;)\n    {\n        glfwWaitEvents();\n\n        for (i = 0;  i < window_count;  i++)\n        {\n            if (glfwWindowShouldClose(windows[i]))\n                break;\n        }\n\n        if (i < window_count)\n            break;\n\n        // Workaround for an issue with msvcrt and mintty\n        fflush(stdout);\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/inputlag.c",
    "content": "//========================================================================\n// Input lag test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test renders a marker at the cursor position reported by GLFW to\n// check how much it lags behind the hardware mouse cursor\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#define NK_IMPLEMENTATION\n#define NK_INCLUDE_FIXED_TYPES\n#define NK_INCLUDE_FONT_BAKING\n#define NK_INCLUDE_DEFAULT_FONT\n#define NK_INCLUDE_DEFAULT_ALLOCATOR\n#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n#define NK_INCLUDE_STANDARD_VARARGS\n#include <nuklear.h>\n\n#define NK_GLFW_GL2_IMPLEMENTATION\n#include <nuklear_glfw_gl2.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"getopt.h\"\n\nvoid usage(void)\n{\n    printf(\"Usage: inputlag [-h] [-f]\\n\");\n    printf(\"Options:\\n\");\n    printf(\"  -f create full screen window\\n\");\n    printf(\"  -h show this help\\n\");\n}\n\nstruct nk_vec2 cursor_new, cursor_pos, cursor_vel;\nenum { cursor_sync_query, cursor_input_message } cursor_method = cursor_sync_query;\n\nvoid sample_input(GLFWwindow* window)\n{\n    float a = .25; // exponential smoothing factor\n\n    if (cursor_method == cursor_sync_query) {\n        double x, y;\n        glfwGetCursorPos(window, &x, &y);\n        cursor_new.x = (float) x;\n        cursor_new.y = (float) y;\n    }\n\n    cursor_vel.x = (cursor_new.x - cursor_pos.x) * a + cursor_vel.x * (1 - a);\n    cursor_vel.y = (cursor_new.y - cursor_pos.y) * a + cursor_vel.y * (1 - a);\n    cursor_pos = cursor_new;\n}\n\nvoid cursor_pos_callback(GLFWwindow* window, double xpos, double ypos)\n{\n    cursor_new.x = (float) xpos;\n    cursor_new.y = (float) ypos;\n}\n\nint enable_vsync = nk_true;\n\nvoid update_vsync()\n{\n    glfwSwapInterval(enable_vsync == nk_true ? 1 : 0);\n}\n\nint swap_clear = nk_false;\nint swap_finish = nk_true;\nint swap_occlusion_query = nk_false;\nint swap_read_pixels = nk_false;\nGLuint occlusion_query;\n\nvoid swap_buffers(GLFWwindow* window)\n{\n    glfwSwapBuffers(window);\n\n    if (swap_clear)\n        glClear(GL_COLOR_BUFFER_BIT);\n\n    if (swap_finish)\n        glFinish();\n\n    if (swap_occlusion_query) {\n        GLint occlusion_result;\n        if (!occlusion_query)\n            glGenQueries(1, &occlusion_query);\n        glBeginQuery(GL_SAMPLES_PASSED, occlusion_query);\n        glBegin(GL_POINTS);\n        glVertex2f(0, 0);\n        glEnd();\n        glEndQuery(GL_SAMPLES_PASSED);\n        glGetQueryObjectiv(occlusion_query, GL_QUERY_RESULT, &occlusion_result);\n    }\n\n    if (swap_read_pixels) {\n        unsigned char rgba[4];\n        glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, rgba);\n    }\n}\n\nvoid error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nvoid key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, 1);\n            break;\n    }\n}\n\nvoid draw_marker(struct nk_command_buffer* canvas, int lead, struct nk_vec2 pos)\n{\n    struct nk_color colors[4] = { nk_rgb(255,0,0), nk_rgb(255,255,0), nk_rgb(0,255,0), nk_rgb(0,96,255) };\n    struct nk_rect rect = { -5 + pos.x, -5 + pos.y, 10, 10 };\n    nk_fill_circle(canvas, rect, colors[lead]);\n}\n\nint main(int argc, char** argv)\n{\n    int ch, width, height;\n    unsigned long frame_count = 0;\n    double last_time, current_time;\n    double frame_rate = 0;\n    int fullscreen = GLFW_FALSE;\n    GLFWmonitor* monitor = NULL;\n    GLFWwindow* window;\n    struct nk_context* nk;\n    struct nk_font_atlas* atlas;\n\n    int show_forecasts = nk_true;\n\n    while ((ch = getopt(argc, argv, \"fh\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n\n            case 'f':\n                fullscreen = GLFW_TRUE;\n                break;\n        }\n    }\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    if (fullscreen)\n    {\n        const GLFWvidmode* mode;\n\n        monitor = glfwGetPrimaryMonitor();\n        mode = glfwGetVideoMode(monitor);\n\n        width = mode->width;\n        height = mode->height;\n    }\n    else\n    {\n        width = 640;\n        height = 480;\n    }\n\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\n\n    window = glfwCreateWindow(width, height, \"Input lag test\", monitor, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    update_vsync();\n\n    last_time = glfwGetTime();\n\n    nk = nk_glfw3_init(window, NK_GLFW3_INSTALL_CALLBACKS);\n    nk_glfw3_font_stash_begin(&atlas);\n    nk_glfw3_font_stash_end();\n\n    glfwSetKeyCallback(window, key_callback);\n    glfwSetCursorPosCallback(window, cursor_pos_callback);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        int width, height;\n        struct nk_rect area;\n\n        glfwPollEvents();\n        sample_input(window);\n\n        glfwGetWindowSize(window, &width, &height);\n        area = nk_rect(0.f, 0.f, (float) width, (float) height);\n\n        glClear(GL_COLOR_BUFFER_BIT);\n        nk_glfw3_new_frame();\n        if (nk_begin(nk, \"\", area, 0))\n        {\n            nk_flags align_left = NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE;\n            struct nk_command_buffer *canvas = nk_window_get_canvas(nk);\n            int lead;\n\n            for (lead = show_forecasts ? 3 : 0; lead >= 0; lead--)\n                draw_marker(canvas, lead, nk_vec2(cursor_pos.x + cursor_vel.x * lead,\n                                                  cursor_pos.y + cursor_vel.y * lead));\n\n            // print instructions\n            nk_layout_row_dynamic(nk, 20, 1);\n            nk_label(nk, \"Move mouse uniformly and check marker under cursor:\", align_left);\n            for (lead = 0; lead <= 3; lead++) {\n                nk_layout_row_begin(nk, NK_STATIC, 12, 2);\n                nk_layout_row_push(nk, 25);\n                draw_marker(canvas, lead, nk_layout_space_to_screen(nk, nk_vec2(20, 5)));\n                nk_label(nk, \"\", 0);\n                nk_layout_row_push(nk, 500);\n                if (lead == 0)\n                    nk_label(nk, \"- current cursor position (no input lag)\", align_left);\n                else\n                    nk_labelf(nk, align_left, \"- %d-frame forecast (input lag is %d frame)\", lead, lead);\n                nk_layout_row_end(nk);\n            }\n\n            nk_layout_row_dynamic(nk, 20, 1);\n\n            nk_checkbox_label(nk, \"Show forecasts\", &show_forecasts);\n            nk_label(nk, \"Input method:\", align_left);\n            if (nk_option_label(nk, \"glfwGetCursorPos (sync query)\", cursor_method == cursor_sync_query))\n                cursor_method = cursor_sync_query;\n            if (nk_option_label(nk, \"glfwSetCursorPosCallback (latest input message)\", cursor_method == cursor_input_message))\n                cursor_method = cursor_input_message;\n\n            nk_label(nk, \"\", 0); // separator\n\n            nk_value_float(nk, \"FPS\", (float) frame_rate);\n            if (nk_checkbox_label(nk, \"Enable vsync\", &enable_vsync))\n                update_vsync();\n\n            nk_label(nk, \"\", 0); // separator\n\n            nk_label(nk, \"After swap:\", align_left);\n            nk_checkbox_label(nk, \"glClear\", &swap_clear);\n            nk_checkbox_label(nk, \"glFinish\", &swap_finish);\n            nk_checkbox_label(nk, \"draw with occlusion query\", &swap_occlusion_query);\n            nk_checkbox_label(nk, \"glReadPixels\", &swap_read_pixels);\n        }\n\n        nk_end(nk);\n        nk_glfw3_render(NK_ANTI_ALIASING_ON);\n\n        swap_buffers(window);\n\n        frame_count++;\n\n        current_time = glfwGetTime();\n        if (current_time - last_time > 1.0)\n        {\n            frame_rate = frame_count / (current_time - last_time);\n            frame_count = 0;\n            last_time = current_time;\n        }\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/joysticks.c",
    "content": "//========================================================================\n// Joystick input test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test displays the state of every button and axis of every connected\n// joystick and/or gamepad\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#define NK_IMPLEMENTATION\n#define NK_INCLUDE_FIXED_TYPES\n#define NK_INCLUDE_FONT_BAKING\n#define NK_INCLUDE_DEFAULT_FONT\n#define NK_INCLUDE_DEFAULT_ALLOCATOR\n#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT\n#define NK_INCLUDE_STANDARD_VARARGS\n#define NK_BUTTON_TRIGGER_ON_RELEASE\n#include <nuklear.h>\n\n#define NK_GLFW_GL2_IMPLEMENTATION\n#include <nuklear_glfw_gl2.h>\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#ifdef _MSC_VER\n#define strdup(x) _strdup(x)\n#endif\n\nstatic GLFWwindow* window;\nstatic int joysticks[GLFW_JOYSTICK_LAST + 1];\nstatic int joystick_count = 0;\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void joystick_callback(int jid, int event)\n{\n    if (event == GLFW_CONNECTED)\n        joysticks[joystick_count++] = jid;\n    else if (event == GLFW_DISCONNECTED)\n    {\n        int i;\n\n        for (i = 0;  i < joystick_count;  i++)\n        {\n            if (joysticks[i] == jid)\n                break;\n        }\n\n        for (i = i + 1;  i < joystick_count;  i++)\n            joysticks[i - 1] = joysticks[i];\n\n        joystick_count--;\n    }\n\n    if (!glfwGetWindowAttrib(window, GLFW_FOCUSED))\n        glfwRequestWindowAttention(window);\n}\n\nstatic const char* joystick_label(int jid)\n{\n    static char label[1024];\n    snprintf(label, sizeof(label), \"%i: %s\", jid + 1, glfwGetJoystickName(jid));\n    return label;\n}\n\nstatic void hat_widget(struct nk_context* nk, unsigned char state)\n{\n    float radius;\n    struct nk_rect area;\n    struct nk_vec2 center;\n\n    if (nk_widget(&area, nk) == NK_WIDGET_INVALID)\n        return;\n\n    center = nk_vec2(area.x + area.w / 2.f, area.y + area.h / 2.f);\n    radius = NK_MIN(area.w, area.h) / 2.f;\n\n    nk_stroke_circle(nk_window_get_canvas(nk),\n                     nk_rect(center.x - radius,\n                             center.y - radius,\n                             radius * 2.f,\n                             radius * 2.f),\n                     1.f,\n                     nk_rgb(175, 175, 175));\n\n    if (state)\n    {\n        const float angles[] =\n        {\n            0.f,           0.f,\n            NK_PI * 1.5f,  NK_PI * 1.75f,\n            NK_PI,         0.f,\n            NK_PI * 1.25f, 0.f,\n            NK_PI * 0.5f,  NK_PI * 0.25f,\n            0.f,           0.f,\n            NK_PI * 0.75f, 0.f,\n        };\n        const float cosa = nk_cos(angles[state]);\n        const float sina = nk_sin(angles[state]);\n        const struct nk_vec2 p0 = nk_vec2(0.f, -radius);\n        const struct nk_vec2 p1 = nk_vec2( radius / 2.f, -radius / 3.f);\n        const struct nk_vec2 p2 = nk_vec2(-radius / 2.f, -radius / 3.f);\n\n        nk_fill_triangle(nk_window_get_canvas(nk),\n                            center.x + cosa * p0.x + sina * p0.y,\n                            center.y + cosa * p0.y - sina * p0.x,\n                            center.x + cosa * p1.x + sina * p1.y,\n                            center.y + cosa * p1.y - sina * p1.x,\n                            center.x + cosa * p2.x + sina * p2.y,\n                            center.y + cosa * p2.y - sina * p2.x,\n                            nk_rgb(175, 175, 175));\n    }\n}\n\nint main(void)\n{\n    int jid, hat_buttons = GLFW_FALSE;\n    struct nk_context* nk;\n    struct nk_font_atlas* atlas;\n\n    memset(joysticks, 0, sizeof(joysticks));\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    window = glfwCreateWindow(800, 600, \"Joystick Test\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    nk = nk_glfw3_init(window, NK_GLFW3_INSTALL_CALLBACKS);\n    nk_glfw3_font_stash_begin(&atlas);\n    nk_glfw3_font_stash_end();\n\n    for (jid = GLFW_JOYSTICK_1;  jid <= GLFW_JOYSTICK_LAST;  jid++)\n    {\n        if (glfwJoystickPresent(jid))\n            joysticks[joystick_count++] = jid;\n    }\n\n    glfwSetJoystickCallback(joystick_callback);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        int i, width, height;\n\n        glfwGetWindowSize(window, &width, &height);\n\n        glClear(GL_COLOR_BUFFER_BIT);\n        nk_glfw3_new_frame();\n\n        if (nk_begin(nk,\n                     \"Joysticks\",\n                     nk_rect(width - 200.f, 0.f, 200.f, (float) height),\n                     NK_WINDOW_MINIMIZABLE |\n                     NK_WINDOW_TITLE))\n        {\n            nk_layout_row_dynamic(nk, 30, 1);\n\n            nk_checkbox_label(nk, \"Hat buttons\", &hat_buttons);\n\n            if (joystick_count)\n            {\n                for (i = 0;  i < joystick_count;  i++)\n                {\n                    if (nk_button_label(nk, joystick_label(joysticks[i])))\n                        nk_window_set_focus(nk, joystick_label(joysticks[i]));\n                }\n            }\n            else\n                nk_label(nk, \"No joysticks connected\", NK_TEXT_LEFT);\n        }\n\n        nk_end(nk);\n\n        for (i = 0;  i < joystick_count;  i++)\n        {\n            if (nk_begin(nk,\n                         joystick_label(joysticks[i]),\n                         nk_rect(i * 20.f, i * 20.f, 550.f, 570.f),\n                         NK_WINDOW_BORDER |\n                         NK_WINDOW_MOVABLE |\n                         NK_WINDOW_SCALABLE |\n                         NK_WINDOW_MINIMIZABLE |\n                         NK_WINDOW_TITLE))\n            {\n                int j, axis_count, button_count, hat_count;\n                const float* axes;\n                const unsigned char* buttons;\n                const unsigned char* hats;\n                GLFWgamepadstate state;\n\n                nk_layout_row_dynamic(nk, 30, 1);\n                nk_labelf(nk, NK_TEXT_LEFT, \"Hardware GUID %s\",\n                          glfwGetJoystickGUID(joysticks[i]));\n                nk_label(nk, \"Joystick state\", NK_TEXT_LEFT);\n\n                axes = glfwGetJoystickAxes(joysticks[i], &axis_count);\n                buttons = glfwGetJoystickButtons(joysticks[i], &button_count);\n                hats = glfwGetJoystickHats(joysticks[i], &hat_count);\n\n                if (!hat_buttons)\n                    button_count -= hat_count * 4;\n\n                for (j = 0;  j < axis_count;  j++)\n                    nk_slide_float(nk, -1.f, axes[j], 1.f, 0.1f);\n\n                nk_layout_row_dynamic(nk, 30, 12);\n\n                for (j = 0;  j < button_count;  j++)\n                {\n                    char name[16];\n                    snprintf(name, sizeof(name), \"%i\", j + 1);\n                    nk_select_label(nk, name, NK_TEXT_CENTERED, buttons[j]);\n                }\n\n                nk_layout_row_dynamic(nk, 30, 8);\n\n                for (j = 0;  j < hat_count;  j++)\n                    hat_widget(nk, hats[j]);\n\n                nk_layout_row_dynamic(nk, 30, 1);\n\n                if (glfwGetGamepadState(joysticks[i], &state))\n                {\n                    int hat = 0;\n                    const char* names[GLFW_GAMEPAD_BUTTON_LAST + 1 - 4] =\n                    {\n                        \"A\", \"B\", \"X\", \"Y\",\n                        \"LB\", \"RB\",\n                        \"Back\", \"Start\", \"Guide\",\n                        \"LT\", \"RT\",\n                    };\n\n                    nk_labelf(nk, NK_TEXT_LEFT,\n                              \"Gamepad state: %s\",\n                              glfwGetGamepadName(joysticks[i]));\n\n                    nk_layout_row_dynamic(nk, 30, 2);\n\n                    for (j = 0;  j <= GLFW_GAMEPAD_AXIS_LAST;  j++)\n                        nk_slide_float(nk, -1.f, state.axes[j], 1.f, 0.1f);\n\n                    nk_layout_row_dynamic(nk, 30, GLFW_GAMEPAD_BUTTON_LAST + 1 - 4);\n\n                    for (j = 0;  j <= GLFW_GAMEPAD_BUTTON_LAST - 4;  j++)\n                        nk_select_label(nk, names[j], NK_TEXT_CENTERED, state.buttons[j]);\n\n                    if (state.buttons[GLFW_GAMEPAD_BUTTON_DPAD_UP])\n                        hat |= GLFW_HAT_UP;\n                    if (state.buttons[GLFW_GAMEPAD_BUTTON_DPAD_RIGHT])\n                        hat |= GLFW_HAT_RIGHT;\n                    if (state.buttons[GLFW_GAMEPAD_BUTTON_DPAD_DOWN])\n                        hat |= GLFW_HAT_DOWN;\n                    if (state.buttons[GLFW_GAMEPAD_BUTTON_DPAD_LEFT])\n                        hat |= GLFW_HAT_LEFT;\n\n                    nk_layout_row_dynamic(nk, 30, 8);\n                    hat_widget(nk, hat);\n                }\n                else\n                    nk_label(nk, \"Joystick has no gamepad mapping\", NK_TEXT_LEFT);\n            }\n\n            nk_end(nk);\n        }\n\n        nk_glfw3_render(NK_ANTI_ALIASING_ON);\n\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/monitors.c",
    "content": "//========================================================================\n// Monitor information tool\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test prints monitor and video mode information or verifies video\n// modes\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"getopt.h\"\n\nenum Mode\n{\n    LIST_MODE,\n    TEST_MODE\n};\n\nstatic void usage(void)\n{\n    printf(\"Usage: monitors [-t]\\n\");\n    printf(\"       monitors -h\\n\");\n}\n\nstatic int euclid(int a, int b)\n{\n    return b ? euclid(b, a % b) : a;\n}\n\nstatic const char* format_mode(const GLFWvidmode* mode)\n{\n    static char buffer[512];\n    const int gcd = euclid(mode->width, mode->height);\n\n    snprintf(buffer,\n             sizeof(buffer),\n             \"%i x %i x %i (%i:%i) (%i %i %i) %i Hz\",\n             mode->width, mode->height,\n             mode->redBits + mode->greenBits + mode->blueBits,\n             mode->width / gcd, mode->height / gcd,\n             mode->redBits, mode->greenBits, mode->blueBits,\n             mode->refreshRate);\n\n    buffer[sizeof(buffer) - 1] = '\\0';\n    return buffer;\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void framebuffer_size_callback(GLFWwindow* window, int width, int height)\n{\n    printf(\"Framebuffer resized to %ix%i\\n\", width, height);\n\n    glViewport(0, 0, width, height);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key == GLFW_KEY_ESCAPE)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\nstatic void list_modes(GLFWmonitor* monitor)\n{\n    int count, x, y, widthMM, heightMM, i;\n    const GLFWvidmode* mode = glfwGetVideoMode(monitor);\n    const GLFWvidmode* modes = glfwGetVideoModes(monitor, &count);\n\n    glfwGetMonitorPos(monitor, &x, &y);\n    glfwGetMonitorPhysicalSize(monitor, &widthMM, &heightMM);\n\n    printf(\"Name: %s (%s)\\n\",\n           glfwGetMonitorName(monitor),\n           glfwGetPrimaryMonitor() == monitor ? \"primary\" : \"secondary\");\n    printf(\"Current mode: %s\\n\", format_mode(mode));\n    printf(\"Virtual position: %i %i\\n\", x, y);\n\n    printf(\"Physical size: %i x %i mm (%0.2f dpi)\\n\",\n           widthMM, heightMM, mode->width * 25.4f / widthMM);\n\n    printf(\"Modes:\\n\");\n\n    for (i = 0;  i < count;  i++)\n    {\n        printf(\"%3u: %s\", (unsigned int) i, format_mode(modes + i));\n\n        if (memcmp(mode, modes + i, sizeof(GLFWvidmode)) == 0)\n            printf(\" (current mode)\");\n\n        putchar('\\n');\n    }\n}\n\nstatic void test_modes(GLFWmonitor* monitor)\n{\n    int i, count;\n    GLFWwindow* window;\n    const GLFWvidmode* modes = glfwGetVideoModes(monitor, &count);\n\n    for (i = 0;  i < count;  i++)\n    {\n        const GLFWvidmode* mode = modes + i;\n        GLFWvidmode current;\n\n        glfwWindowHint(GLFW_RED_BITS, mode->redBits);\n        glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);\n        glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);\n        glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);\n\n        printf(\"Testing mode %u on monitor %s: %s\\n\",\n               (unsigned int) i,\n               glfwGetMonitorName(monitor),\n               format_mode(mode));\n\n        window = glfwCreateWindow(mode->width, mode->height,\n                                  \"Video Mode Test\",\n                                  glfwGetPrimaryMonitor(),\n                                  NULL);\n        if (!window)\n        {\n            printf(\"Failed to enter mode %u: %s\\n\",\n                   (unsigned int) i,\n                   format_mode(mode));\n            continue;\n        }\n\n        glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);\n        glfwSetKeyCallback(window, key_callback);\n\n        glfwMakeContextCurrent(window);\n        gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n        glfwSwapInterval(1);\n\n        glfwSetTime(0.0);\n\n        while (glfwGetTime() < 5.0)\n        {\n            glClear(GL_COLOR_BUFFER_BIT);\n            glfwSwapBuffers(window);\n            glfwPollEvents();\n\n            if (glfwWindowShouldClose(window))\n            {\n                printf(\"User terminated program\\n\");\n\n                glfwTerminate();\n                exit(EXIT_SUCCESS);\n            }\n        }\n\n        glGetIntegerv(GL_RED_BITS, &current.redBits);\n        glGetIntegerv(GL_GREEN_BITS, &current.greenBits);\n        glGetIntegerv(GL_BLUE_BITS, &current.blueBits);\n\n        glfwGetWindowSize(window, &current.width, &current.height);\n\n        if (current.redBits != mode->redBits ||\n            current.greenBits != mode->greenBits ||\n            current.blueBits != mode->blueBits)\n        {\n            printf(\"*** Color bit mismatch: (%i %i %i) instead of (%i %i %i)\\n\",\n                   current.redBits, current.greenBits, current.blueBits,\n                   mode->redBits, mode->greenBits, mode->blueBits);\n        }\n\n        if (current.width != mode->width || current.height != mode->height)\n        {\n            printf(\"*** Size mismatch: %ix%i instead of %ix%i\\n\",\n                   current.width, current.height,\n                   mode->width, mode->height);\n        }\n\n        printf(\"Closing window\\n\");\n\n        glfwDestroyWindow(window);\n        window = NULL;\n\n        glfwPollEvents();\n    }\n}\n\nint main(int argc, char** argv)\n{\n    int ch, i, count, mode = LIST_MODE;\n    GLFWmonitor** monitors;\n\n    while ((ch = getopt(argc, argv, \"th\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n            case 't':\n                mode = TEST_MODE;\n                break;\n            default:\n                usage();\n                exit(EXIT_FAILURE);\n        }\n    }\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    monitors = glfwGetMonitors(&count);\n\n    for (i = 0;  i < count;  i++)\n    {\n        if (mode == LIST_MODE)\n            list_modes(monitors[i]);\n        else if (mode == TEST_MODE)\n            test_modes(monitors[i]);\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/msaa.c",
    "content": "//========================================================================\n// Multisample anti-aliasing test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test renders two high contrast, slowly rotating quads, one aliased\n// and one (hopefully) anti-aliased, thus allowing for visual verification\n// of whether MSAA is indeed enabled\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#if defined(_MSC_VER)\n // Make MS math.h define M_PI\n #define _USE_MATH_DEFINES\n#endif\n\n#include \"linmath.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"getopt.h\"\n\nstatic const vec2 vertices[4] =\n{\n    { -0.6f, -0.6f },\n    {  0.6f, -0.6f },\n    {  0.6f,  0.6f },\n    { -0.6f,  0.6f }\n};\n\nstatic const char* vertex_shader_text =\n\"#version 110\\n\"\n\"uniform mat4 MVP;\\n\"\n\"attribute vec2 vPos;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = MVP * vec4(vPos, 0.0, 1.0);\\n\"\n\"}\\n\";\n\nstatic const char* fragment_shader_text =\n\"#version 110\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = vec4(1.0);\\n\"\n\"}\\n\";\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_SPACE:\n            glfwSetTime(0.0);\n            break;\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, GLFW_TRUE);\n            break;\n    }\n}\n\nstatic void usage(void)\n{\n    printf(\"Usage: msaa [-h] [-s SAMPLES]\\n\");\n}\n\nint main(int argc, char** argv)\n{\n    int ch, samples = 4;\n    GLFWwindow* window;\n    GLuint vertex_buffer, vertex_shader, fragment_shader, program;\n    GLint mvp_location, vpos_location;\n\n    while ((ch = getopt(argc, argv, \"hs:\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n            case 's':\n                samples = atoi(optarg);\n                break;\n            default:\n                usage();\n                exit(EXIT_FAILURE);\n        }\n    }\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    if (samples)\n        printf(\"Requesting MSAA with %i samples\\n\", samples);\n    else\n        printf(\"Requesting that MSAA not be available\\n\");\n\n    glfwWindowHint(GLFW_SAMPLES, samples);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\n\n    window = glfwCreateWindow(800, 400, \"Aliasing Detector\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwSetKeyCallback(window, key_callback);\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    glGetIntegerv(GL_SAMPLES, &samples);\n    if (samples)\n        printf(\"Context reports MSAA is available with %i samples\\n\", samples);\n    else\n        printf(\"Context reports MSAA is unavailable\\n\");\n\n    glGenBuffers(1, &vertex_buffer);\n    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);\n\n    vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);\n    glCompileShader(vertex_shader);\n\n    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);\n    glCompileShader(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    mvp_location = glGetUniformLocation(program, \"MVP\");\n    vpos_location = glGetAttribLocation(program, \"vPos\");\n\n    glEnableVertexAttribArray(vpos_location);\n    glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,\n                          sizeof(vertices[0]), (void*) 0);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        float ratio;\n        int width, height;\n        mat4x4 m, p, mvp;\n        const double angle = glfwGetTime() * M_PI / 180.0;\n\n        glfwGetFramebufferSize(window, &width, &height);\n        ratio = width / (float) height;\n\n        glViewport(0, 0, width, height);\n        glClear(GL_COLOR_BUFFER_BIT);\n\n        glUseProgram(program);\n\n        mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 0.f, 1.f);\n\n        mat4x4_translate(m, -1.f, 0.f, 0.f);\n        mat4x4_rotate_Z(m, m, (float) angle);\n        mat4x4_mul(mvp, p, m);\n\n        glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);\n        glDisable(GL_MULTISAMPLE);\n        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);\n\n        mat4x4_translate(m, 1.f, 0.f, 0.f);\n        mat4x4_rotate_Z(m, m, (float) angle);\n        mat4x4_mul(mvp, p, m);\n\n        glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);\n        glEnable(GL_MULTISAMPLE);\n        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);\n\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n\n    glfwDestroyWindow(window);\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/reopen.c",
    "content": "//========================================================================\n// Window re-opener (open/close stress test)\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test came about as the result of bug #1262773\n//\n// It closes and re-opens the GLFW window every five seconds, alternating\n// between windowed and full screen mode\n//\n// It also times and logs opening and closing actions and attempts to separate\n// user initiated window closing from its own\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <time.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"linmath.h\"\n\nstatic const char* vertex_shader_text =\n\"#version 110\\n\"\n\"uniform mat4 MVP;\\n\"\n\"attribute vec2 vPos;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = MVP * vec4(vPos, 0.0, 1.0);\\n\"\n\"}\\n\";\n\nstatic const char* fragment_shader_text =\n\"#version 110\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = vec4(1.0);\\n\"\n\"}\\n\";\n\nstatic const vec2 vertices[4] =\n{\n    { -0.5f, -0.5f },\n    {  0.5f, -0.5f },\n    {  0.5f,  0.5f },\n    { -0.5f,  0.5f }\n};\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void window_close_callback(GLFWwindow* window)\n{\n    printf(\"Close callback triggered\\n\");\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_Q:\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, GLFW_TRUE);\n            break;\n    }\n}\n\nstatic void close_window(GLFWwindow* window)\n{\n    double base = glfwGetTime();\n    glfwDestroyWindow(window);\n    printf(\"Closing window took %0.3f seconds\\n\", glfwGetTime() - base);\n}\n\nint main(int argc, char** argv)\n{\n    int count = 0;\n    double base;\n    GLFWwindow* window;\n\n    srand((unsigned int) time(NULL));\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\n\n    for (;;)\n    {\n        int width, height;\n        GLFWmonitor* monitor = NULL;\n        GLuint vertex_shader, fragment_shader, program, vertex_buffer;\n        GLint mvp_location, vpos_location;\n\n        if (count & 1)\n        {\n            int monitorCount;\n            GLFWmonitor** monitors = glfwGetMonitors(&monitorCount);\n            monitor = monitors[rand() % monitorCount];\n        }\n\n        if (monitor)\n        {\n            const GLFWvidmode* mode = glfwGetVideoMode(monitor);\n            width = mode->width;\n            height = mode->height;\n        }\n        else\n        {\n            width = 640;\n            height = 480;\n        }\n\n        base = glfwGetTime();\n\n        window = glfwCreateWindow(width, height, \"Window Re-opener\", monitor, NULL);\n        if (!window)\n        {\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n\n        if (monitor)\n        {\n            printf(\"Opening full screen window on monitor %s took %0.3f seconds\\n\",\n                   glfwGetMonitorName(monitor),\n                   glfwGetTime() - base);\n        }\n        else\n        {\n            printf(\"Opening regular window took %0.3f seconds\\n\",\n                   glfwGetTime() - base);\n        }\n\n        glfwSetWindowCloseCallback(window, window_close_callback);\n        glfwSetKeyCallback(window, key_callback);\n\n        glfwMakeContextCurrent(window);\n        gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n        glfwSwapInterval(1);\n\n        vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n        glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);\n        glCompileShader(vertex_shader);\n\n        fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n        glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);\n        glCompileShader(fragment_shader);\n\n        program = glCreateProgram();\n        glAttachShader(program, vertex_shader);\n        glAttachShader(program, fragment_shader);\n        glLinkProgram(program);\n\n        mvp_location = glGetUniformLocation(program, \"MVP\");\n        vpos_location = glGetAttribLocation(program, \"vPos\");\n\n        glGenBuffers(1, &vertex_buffer);\n        glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);\n\n        glEnableVertexAttribArray(vpos_location);\n        glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,\n                              sizeof(vertices[0]), (void*) 0);\n\n        glfwSetTime(0.0);\n\n        while (glfwGetTime() < 5.0)\n        {\n            float ratio;\n            int width, height;\n            mat4x4 m, p, mvp;\n\n            glfwGetFramebufferSize(window, &width, &height);\n            ratio = width / (float) height;\n\n            glViewport(0, 0, width, height);\n            glClear(GL_COLOR_BUFFER_BIT);\n\n            mat4x4_ortho(p, -ratio, ratio, -1.f, 1.f, 0.f, 1.f);\n\n            mat4x4_identity(m);\n            mat4x4_rotate_Z(m, m, (float) glfwGetTime());\n            mat4x4_mul(mvp, p, m);\n\n            glUseProgram(program);\n            glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);\n            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);\n\n            glfwSwapBuffers(window);\n            glfwPollEvents();\n\n            if (glfwWindowShouldClose(window))\n            {\n                close_window(window);\n                printf(\"User closed window\\n\");\n\n                glfwTerminate();\n                exit(EXIT_SUCCESS);\n            }\n        }\n\n        printf(\"Closing window\\n\");\n        close_window(window);\n\n        count++;\n    }\n\n    glfwTerminate();\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/sharing.c",
    "content": "//========================================================================\n// Context sharing test program\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This program is used to test sharing of objects between contexts\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <time.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"getopt.h\"\n#include \"linmath.h\"\n\nstatic const char* vertex_shader_text =\n\"#version 110\\n\"\n\"uniform mat4 MVP;\\n\"\n\"attribute vec2 vPos;\\n\"\n\"varying vec2 texcoord;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = MVP * vec4(vPos, 0.0, 1.0);\\n\"\n\"    texcoord = vPos;\\n\"\n\"}\\n\";\n\nstatic const char* fragment_shader_text =\n\"#version 110\\n\"\n\"uniform sampler2D texture;\\n\"\n\"uniform vec3 color;\\n\"\n\"varying vec2 texcoord;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = vec4(color * texture2D(texture, texcoord).rgb, 1.0);\\n\"\n\"}\\n\";\n\nstatic const vec2 vertices[4] =\n{\n    { 0.f, 0.f },\n    { 1.f, 0.f },\n    { 1.f, 1.f },\n    { 0.f, 1.f }\n};\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nvoid APIENTRY debug_callback(GLenum source,\n                             GLenum type,\n                             GLuint id,\n                             GLenum severity,\n                             GLsizei length,\n                             const GLchar* message,\n                             const void* user)\n{\n    fprintf(stderr, \"Error: %s\\n\", message);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action == GLFW_PRESS && key == GLFW_KEY_ESCAPE)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\nint main(int argc, char** argv)\n{\n    int ch;\n    GLFWwindow* windows[2];\n    GLuint texture, program, vertex_buffer;\n    GLint mvp_location, vpos_location, color_location, texture_location;\n\n    srand((unsigned int) time(NULL));\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    while ((ch = getopt(argc, argv, \"d\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'd':\n                glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE);\n                break;\n        }\n    }\n\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\n\n    windows[0] = glfwCreateWindow(400, 400, \"First\", NULL, NULL);\n    if (!windows[0])\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwSetKeyCallback(windows[0], key_callback);\n\n    glfwMakeContextCurrent(windows[0]);\n\n    // Only enable vsync for the first of the windows to be swapped to\n    // avoid waiting out the interval for each window\n    glfwSwapInterval(1);\n\n    // The contexts are created with the same APIs so the function\n    // pointers should be re-usable between them\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n\n    if (GLAD_GL_KHR_debug)\n    {\n        glDebugMessageCallback(debug_callback, NULL);\n        glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);\n    }\n\n    // Create the OpenGL objects inside the first context, created above\n    // All objects will be shared with the second context, created below\n    {\n        int x, y;\n        char pixels[16 * 16];\n        GLuint vertex_shader, fragment_shader;\n\n        glGenTextures(1, &texture);\n        glBindTexture(GL_TEXTURE_2D, texture);\n\n        for (y = 0;  y < 16;  y++)\n        {\n            for (x = 0;  x < 16;  x++)\n                pixels[y * 16 + x] = rand() % 256;\n        }\n\n        glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 16, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\n        vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n        glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);\n        glCompileShader(vertex_shader);\n\n        fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n        glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);\n        glCompileShader(fragment_shader);\n\n        program = glCreateProgram();\n        glAttachShader(program, vertex_shader);\n        glAttachShader(program, fragment_shader);\n        glLinkProgram(program);\n\n        mvp_location = glGetUniformLocation(program, \"MVP\");\n        color_location = glGetUniformLocation(program, \"color\");\n        texture_location = glGetUniformLocation(program, \"texture\");\n        vpos_location = glGetAttribLocation(program, \"vPos\");\n\n        glGenBuffers(1, &vertex_buffer);\n        glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);\n    }\n\n    glUseProgram(program);\n    glUniform1i(texture_location, 0);\n\n    glEnable(GL_TEXTURE_2D);\n    glBindTexture(GL_TEXTURE_2D, texture);\n\n    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n    glEnableVertexAttribArray(vpos_location);\n    glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,\n                          sizeof(vertices[0]), (void*) 0);\n\n    windows[1] = glfwCreateWindow(400, 400, \"Second\", NULL, windows[0]);\n    if (!windows[1])\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    // Place the second window to the right of the first\n    {\n        int xpos, ypos, left, right, width;\n\n        glfwGetWindowSize(windows[0], &width, NULL);\n        glfwGetWindowFrameSize(windows[0], &left, NULL, &right, NULL);\n        glfwGetWindowPos(windows[0], &xpos, &ypos);\n\n        glfwSetWindowPos(windows[1], xpos + width + left + right, ypos);\n    }\n\n    glfwSetKeyCallback(windows[1], key_callback);\n\n    glfwMakeContextCurrent(windows[1]);\n\n    // While objects are shared, the global context state is not and will\n    // need to be set up for each context\n\n    glUseProgram(program);\n\n    glEnable(GL_TEXTURE_2D);\n    glBindTexture(GL_TEXTURE_2D, texture);\n\n    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n    glEnableVertexAttribArray(vpos_location);\n    glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,\n                          sizeof(vertices[0]), (void*) 0);\n\n    while (!glfwWindowShouldClose(windows[0]) &&\n           !glfwWindowShouldClose(windows[1]))\n    {\n        int i;\n        const vec3 colors[2] =\n        {\n            { 0.3f, 0.4f, 1.f },\n            { 0.8f, 0.4f, 1.f }\n        };\n\n        for (i = 0;  i < 2;  i++)\n        {\n            int width, height;\n            mat4x4 mvp;\n\n            glfwGetFramebufferSize(windows[i], &width, &height);\n            glfwMakeContextCurrent(windows[i]);\n\n            glViewport(0, 0, width, height);\n\n            mat4x4_ortho(mvp, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f);\n            glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);\n            glUniform3fv(color_location, 1, colors[i]);\n            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);\n\n            glfwSwapBuffers(windows[i]);\n        }\n\n        glfwWaitEvents();\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/tearing.c",
    "content": "//========================================================================\n// Vsync enabling test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test renders a high contrast, horizontally moving bar, allowing for\n// visual verification of whether the set swap interval is indeed obeyed\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\n#include \"linmath.h\"\n#include \"getopt.h\"\n\nstatic const struct\n{\n    float x, y;\n} vertices[4] =\n{\n    { -0.25f, -1.f },\n    {  0.25f, -1.f },\n    {  0.25f,  1.f },\n    { -0.25f,  1.f }\n};\n\nstatic const char* vertex_shader_text =\n\"#version 110\\n\"\n\"uniform mat4 MVP;\\n\"\n\"attribute vec2 vPos;\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_Position = MVP * vec4(vPos, 0.0, 1.0);\\n\"\n\"}\\n\";\n\nstatic const char* fragment_shader_text =\n\"#version 110\\n\"\n\"void main()\\n\"\n\"{\\n\"\n\"    gl_FragColor = vec4(1.0);\\n\"\n\"}\\n\";\n\nstatic int swap_tear;\nstatic int swap_interval;\nstatic double frame_rate;\n\nstatic void usage(void)\n{\n    printf(\"Usage: tearing [-h] [-f]\\n\");\n    printf(\"Options:\\n\");\n    printf(\"  -f create full screen window\\n\");\n    printf(\"  -h show this help\\n\");\n}\n\nstatic void update_window_title(GLFWwindow* window)\n{\n    char title[256];\n\n    snprintf(title, sizeof(title), \"Tearing detector (interval %i%s, %0.1f Hz)\",\n             swap_interval,\n             (swap_tear && swap_interval < 0) ? \" (swap tear)\" : \"\",\n             frame_rate);\n\n    glfwSetWindowTitle(window, title);\n}\n\nstatic void set_swap_interval(GLFWwindow* window, int interval)\n{\n    swap_interval = interval;\n    glfwSwapInterval(swap_interval);\n    update_window_title(window);\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void framebuffer_size_callback(GLFWwindow* window, int width, int height)\n{\n    glViewport(0, 0, width, height);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_UP:\n        {\n            if (swap_interval + 1 > swap_interval)\n                set_swap_interval(window, swap_interval + 1);\n            break;\n        }\n\n        case GLFW_KEY_DOWN:\n        {\n            if (swap_tear)\n            {\n                if (swap_interval - 1 < swap_interval)\n                    set_swap_interval(window, swap_interval - 1);\n            }\n            else\n            {\n                if (swap_interval - 1 >= 0)\n                    set_swap_interval(window, swap_interval - 1);\n            }\n            break;\n        }\n\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, 1);\n            break;\n    }\n}\n\nint main(int argc, char** argv)\n{\n    int ch, width, height;\n    unsigned long frame_count = 0;\n    double last_time, current_time;\n    int fullscreen = GLFW_FALSE;\n    GLFWmonitor* monitor = NULL;\n    GLFWwindow* window;\n    GLuint vertex_buffer, vertex_shader, fragment_shader, program;\n    GLint mvp_location, vpos_location;\n\n    while ((ch = getopt(argc, argv, \"fh\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n\n            case 'f':\n                fullscreen = GLFW_TRUE;\n                break;\n        }\n    }\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    if (fullscreen)\n    {\n        const GLFWvidmode* mode;\n\n        monitor = glfwGetPrimaryMonitor();\n        mode = glfwGetVideoMode(monitor);\n\n        glfwWindowHint(GLFW_RED_BITS, mode->redBits);\n        glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);\n        glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);\n        glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);\n\n        width = mode->width;\n        height = mode->height;\n    }\n    else\n    {\n        width = 640;\n        height = 480;\n    }\n\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);\n\n    window = glfwCreateWindow(width, height, \"\", monitor, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    set_swap_interval(window, 0);\n\n    last_time = glfwGetTime();\n    frame_rate = 0.0;\n    swap_tear = (glfwExtensionSupported(\"WGL_EXT_swap_control_tear\") ||\n                 glfwExtensionSupported(\"GLX_EXT_swap_control_tear\"));\n\n    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);\n    glfwSetKeyCallback(window, key_callback);\n\n    glGenBuffers(1, &vertex_buffer);\n    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);\n    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);\n\n    vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);\n    glCompileShader(vertex_shader);\n\n    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);\n    glCompileShader(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    mvp_location = glGetUniformLocation(program, \"MVP\");\n    vpos_location = glGetAttribLocation(program, \"vPos\");\n\n    glEnableVertexAttribArray(vpos_location);\n    glVertexAttribPointer(vpos_location, 2, GL_FLOAT, GL_FALSE,\n                          sizeof(vertices[0]), (void*) 0);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        mat4x4 m, p, mvp;\n        float position = cosf((float) glfwGetTime() * 4.f) * 0.75f;\n\n        glClear(GL_COLOR_BUFFER_BIT);\n\n        mat4x4_ortho(p, -1.f, 1.f, -1.f, 1.f, 0.f, 1.f);\n        mat4x4_translate(m, position, 0.f, 0.f);\n        mat4x4_mul(mvp, p, m);\n\n        glUseProgram(program);\n        glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp);\n        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);\n\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n\n        frame_count++;\n\n        current_time = glfwGetTime();\n        if (current_time - last_time > 1.0)\n        {\n            frame_rate = frame_count / (current_time - last_time);\n            frame_count = 0;\n            last_time = current_time;\n            update_window_title(window);\n        }\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/threads.c",
    "content": "//========================================================================\n// Multi-threading test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test is intended to verify whether the OpenGL context part of\n// the GLFW API is able to be used from multiple threads\n//\n//========================================================================\n\n#include \"tinycthread.h\"\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\ntypedef struct\n{\n    GLFWwindow* window;\n    const char* title;\n    float r, g, b;\n    thrd_t id;\n} Thread;\n\nstatic volatile int running = GLFW_TRUE;\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\nstatic int thread_main(void* data)\n{\n    const Thread* thread = data;\n\n    glfwMakeContextCurrent(thread->window);\n    glfwSwapInterval(1);\n\n    while (running)\n    {\n        const float v = (float) fabs(sin(glfwGetTime() * 2.f));\n        glClearColor(thread->r * v, thread->g * v, thread->b * v, 0.f);\n\n        glClear(GL_COLOR_BUFFER_BIT);\n        glfwSwapBuffers(thread->window);\n    }\n\n    glfwMakeContextCurrent(NULL);\n    return 0;\n}\n\nint main(void)\n{\n    int i, result;\n    Thread threads[] =\n    {\n        { NULL, \"Red\", 1.f, 0.f, 0.f, 0 },\n        { NULL, \"Green\", 0.f, 1.f, 0.f, 0 },\n        { NULL, \"Blue\", 0.f, 0.f, 1.f, 0 }\n    };\n    const int count = sizeof(threads) / sizeof(Thread);\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);\n\n    for (i = 0;  i < count;  i++)\n    {\n        threads[i].window = glfwCreateWindow(200, 200,\n                                             threads[i].title,\n                                             NULL, NULL);\n        if (!threads[i].window)\n        {\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n\n        glfwSetKeyCallback(threads[i].window, key_callback);\n\n        glfwSetWindowPos(threads[i].window, 200 + 250 * i, 200);\n        glfwShowWindow(threads[i].window);\n    }\n\n    glfwMakeContextCurrent(threads[0].window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwMakeContextCurrent(NULL);\n\n    for (i = 0;  i < count;  i++)\n    {\n        if (thrd_create(&threads[i].id, thread_main, threads + i) !=\n            thrd_success)\n        {\n            fprintf(stderr, \"Failed to create secondary thread\\n\");\n\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n    }\n\n    while (running)\n    {\n        glfwWaitEvents();\n\n        for (i = 0;  i < count;  i++)\n        {\n            if (glfwWindowShouldClose(threads[i].window))\n                running = GLFW_FALSE;\n        }\n    }\n\n    for (i = 0;  i < count;  i++)\n        glfwHideWindow(threads[i].window);\n\n    for (i = 0;  i < count;  i++)\n        thrd_join(threads[i].id, &result);\n\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/timeout.c",
    "content": "//========================================================================\n// Event wait timeout test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test is intended to verify that waiting for events with timeout works\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <time.h>\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\nstatic float nrand(void)\n{\n    return (float) rand() / (float) RAND_MAX;\n}\n\nint main(void)\n{\n    GLFWwindow* window;\n\n    srand((unsigned int) time(NULL));\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    window = glfwCreateWindow(640, 480, \"Event Wait Timeout Test\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSetKeyCallback(window, key_callback);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        int width, height;\n        float r = nrand(), g = nrand(), b = nrand();\n        float l = (float) sqrt(r * r + g * g + b * b);\n\n        glfwGetFramebufferSize(window, &width, &height);\n\n        glViewport(0, 0, width, height);\n        glClearColor(r / l, g / l, b / l, 1.f);\n        glClear(GL_COLOR_BUFFER_BIT);\n        glfwSwapBuffers(window);\n\n        glfwWaitEventsTimeout(1.0);\n    }\n\n    glfwDestroyWindow(window);\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/title.c",
    "content": "//========================================================================\n// UTF-8 window title test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test sets a UTF-8 window title\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void framebuffer_size_callback(GLFWwindow* window, int width, int height)\n{\n    glViewport(0, 0, width, height);\n}\n\nint main(void)\n{\n    GLFWwindow* window;\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    window = glfwCreateWindow(400, 400, \"English 日本語 русский язык 官話\", NULL, NULL);\n    if (!window)\n    {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n\n    glfwMakeContextCurrent(window);\n    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n    glfwSwapInterval(1);\n\n    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);\n\n    while (!glfwWindowShouldClose(window))\n    {\n        glClear(GL_COLOR_BUFFER_BIT);\n        glfwSwapBuffers(window);\n        glfwWaitEvents();\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/vulkan.c",
    "content": "/*\n * Copyright (c) 2015-2016 The Khronos Group Inc.\n * Copyright (c) 2015-2016 Valve Corporation\n * Copyright (c) 2015-2016 LunarG, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Author: Chia-I Wu <olvaffe@gmail.com>\n * Author: Cody Northrop <cody@lunarg.com>\n * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>\n * Author: Ian Elliott <ian@LunarG.com>\n * Author: Jon Ashburn <jon@lunarg.com>\n * Author: Piers Daniell <pdaniell@nvidia.com>\n * Author: Gwan-gyeong Mun <elongbug@gmail.com>\n * Porter: Camilla Löwy <elmindreda@glfw.org>\n */\n/*\n * Draw a textured triangle with depth testing.  This is written against Intel\n * ICD.  It does not do state transition nor object memory binding like it\n * should.  It also does no error checking.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdbool.h>\n#include <assert.h>\n#include <signal.h>\n\n#ifdef _WIN32\n#include <windows.h>\n#endif\n\n#define GLFW_INCLUDE_NONE\n#define GLFW_INCLUDE_VULKAN\n#include <GLFW/glfw3.h>\n\n#define DEMO_TEXTURE_COUNT 1\n#define VERTEX_BUFFER_BIND_ID 0\n#define APP_SHORT_NAME \"tri\"\n#define APP_LONG_NAME \"The Vulkan Triangle Demo Program\"\n\n#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))\n\n#if defined(NDEBUG) && defined(__GNUC__)\n#define U_ASSERT_ONLY __attribute__((unused))\n#else\n#define U_ASSERT_ONLY\n#endif\n\n#define ERR_EXIT(err_msg, err_class)                                           \\\n    do {                                                                       \\\n        printf(err_msg);                                                       \\\n        fflush(stdout);                                                        \\\n        exit(1);                                                               \\\n    } while (0)\n\n#define GET_INSTANCE_PROC_ADDR(inst, entrypoint)                               \\\n    {                                                                          \\\n        demo->fp##entrypoint =                                                 \\\n            (PFN_vk##entrypoint)vkGetInstanceProcAddr(inst, \"vk\" #entrypoint); \\\n        if (demo->fp##entrypoint == NULL) {                                    \\\n            ERR_EXIT(\"vkGetInstanceProcAddr failed to find vk\" #entrypoint,    \\\n                     \"vkGetInstanceProcAddr Failure\");                         \\\n        }                                                                      \\\n    }\n\n#define GET_DEVICE_PROC_ADDR(dev, entrypoint)                                  \\\n    {                                                                          \\\n        demo->fp##entrypoint =                                                 \\\n            (PFN_vk##entrypoint)vkGetDeviceProcAddr(dev, \"vk\" #entrypoint);    \\\n        if (demo->fp##entrypoint == NULL) {                                    \\\n            ERR_EXIT(\"vkGetDeviceProcAddr failed to find vk\" #entrypoint,      \\\n                     \"vkGetDeviceProcAddr Failure\");                           \\\n        }                                                                      \\\n    }\n\nstatic const char fragShaderCode[] = {\n    0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00,\n    0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,\n    0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,\n    0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00,\n    0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,\n    0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00,\n    0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00,\n    0x02, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00,\n    0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x65, 0x70, 0x61, 0x72,\n    0x61, 0x74, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6f,\n    0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00,\n    0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69,\n    0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f,\n    0x34, 0x32, 0x30, 0x70, 0x61, 0x63, 0x6b, 0x00, 0x05, 0x00, 0x04, 0x00,\n    0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,\n    0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00, 0x75, 0x46, 0x72, 0x61,\n    0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00,\n    0x0d, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x00, 0x05, 0x00, 0x05, 0x00,\n    0x11, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64,\n    0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00,\n    0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,\n    0x0d, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00,\n    0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00,\n    0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,\n    0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00,\n    0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,\n    0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,\n    0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,\n    0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,\n    0x03, 0x00, 0x00, 0x00, 0x19, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x00, 0x00,\n    0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00,\n    0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,\n    0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x17, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,\n    0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00,\n    0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,\n    0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,\n    0x05, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00,\n    0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,\n    0x0f, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,\n    0x57, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,\n    0x0e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,\n    0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00,\n    0x38, 0x00, 0x01, 0x00\n};\n\nstatic const char vertShaderCode[] = {\n    0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00,\n    0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,\n    0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,\n    0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,\n    0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,\n    0x17, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,\n    0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00,\n    0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73,\n    0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x64,\n    0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x00, 0x00,\n    0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73,\n    0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75,\n    0x61, 0x67, 0x65, 0x5f, 0x34, 0x32, 0x30, 0x70, 0x61, 0x63, 0x6b, 0x00,\n    0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e,\n    0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00,\n    0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00, 0x00, 0x00, 0x00,\n    0x05, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72,\n    0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x11, 0x00, 0x00, 0x00,\n    0x67, 0x6c, 0x5f, 0x50, 0x65, 0x72, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,\n    0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x11, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74,\n    0x69, 0x6f, 0x6e, 0x00, 0x06, 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x00,\n    0x01, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74,\n    0x53, 0x69, 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x07, 0x00,\n    0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x43,\n    0x6c, 0x69, 0x70, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x00,\n    0x05, 0x00, 0x03, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x05, 0x00, 0x03, 0x00, 0x17, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x73, 0x00,\n    0x05, 0x00, 0x05, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x56,\n    0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x00, 0x05, 0x00, 0x06, 0x00,\n    0x1d, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61,\n    0x6e, 0x63, 0x65, 0x49, 0x44, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,\n    0x09, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x47, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,\n    0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x48, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,\n    0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,\n    0x03, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x11, 0x00, 0x00, 0x00,\n    0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00,\n    0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,\n    0x1c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,\n    0x47, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,\n    0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,\n    0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n    0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,\n    0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,\n    0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,\n    0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,\n    0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,\n    0x20, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,\n    0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,\n    0x0d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,\n    0x15, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00,\n    0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00,\n    0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,\n    0x1e, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,\n    0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,\n    0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,\n    0x3b, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,\n    0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,\n    0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,\n    0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x20, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x0d, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00,\n    0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,\n    0x19, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,\n    0x20, 0x00, 0x04, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x14, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x1b, 0x00, 0x00, 0x00,\n    0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,\n    0x1b, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n    0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,\n    0x05, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,\n    0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,\n    0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,\n    0x0d, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,\n    0x41, 0x00, 0x05, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,\n    0x13, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,\n    0x1a, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00,\n    0x38, 0x00, 0x01, 0x00\n};\n\nstruct texture_object {\n    VkSampler sampler;\n\n    VkImage image;\n    VkImageLayout imageLayout;\n\n    VkDeviceMemory mem;\n    VkImageView view;\n    int32_t tex_width, tex_height;\n};\n\nstatic int validation_error = 0;\n\nVKAPI_ATTR VkBool32 VKAPI_CALL\nBreakCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,\n              uint64_t srcObject, size_t location, int32_t msgCode,\n              const char *pLayerPrefix, const char *pMsg,\n              void *pUserData) {\n#ifdef _WIN32\n    DebugBreak();\n#else\n    raise(SIGTRAP);\n#endif\n\n    return false;\n}\n\ntypedef struct {\n    VkImage image;\n    VkCommandBuffer cmd;\n    VkImageView view;\n} SwapchainBuffers;\n\nstruct demo {\n    GLFWwindow* window;\n    VkSurfaceKHR surface;\n    bool use_staging_buffer;\n\n    VkInstance inst;\n    VkPhysicalDevice gpu;\n    VkDevice device;\n    VkQueue queue;\n    VkPhysicalDeviceProperties gpu_props;\n    VkPhysicalDeviceFeatures gpu_features;\n    VkQueueFamilyProperties *queue_props;\n    uint32_t graphics_queue_node_index;\n\n    uint32_t enabled_extension_count;\n    uint32_t enabled_layer_count;\n    const char *extension_names[64];\n    const char *enabled_layers[64];\n\n    int width, height;\n    VkFormat format;\n    VkColorSpaceKHR color_space;\n\n    PFN_vkGetPhysicalDeviceSurfaceSupportKHR\n        fpGetPhysicalDeviceSurfaceSupportKHR;\n    PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR\n        fpGetPhysicalDeviceSurfaceCapabilitiesKHR;\n    PFN_vkGetPhysicalDeviceSurfaceFormatsKHR\n        fpGetPhysicalDeviceSurfaceFormatsKHR;\n    PFN_vkGetPhysicalDeviceSurfacePresentModesKHR\n        fpGetPhysicalDeviceSurfacePresentModesKHR;\n    PFN_vkCreateSwapchainKHR fpCreateSwapchainKHR;\n    PFN_vkDestroySwapchainKHR fpDestroySwapchainKHR;\n    PFN_vkGetSwapchainImagesKHR fpGetSwapchainImagesKHR;\n    PFN_vkAcquireNextImageKHR fpAcquireNextImageKHR;\n    PFN_vkQueuePresentKHR fpQueuePresentKHR;\n    uint32_t swapchainImageCount;\n    VkSwapchainKHR swapchain;\n    SwapchainBuffers *buffers;\n\n    VkCommandPool cmd_pool;\n\n    struct {\n        VkFormat format;\n\n        VkImage image;\n        VkDeviceMemory mem;\n        VkImageView view;\n    } depth;\n\n    struct texture_object textures[DEMO_TEXTURE_COUNT];\n\n    struct {\n        VkBuffer buf;\n        VkDeviceMemory mem;\n\n        VkPipelineVertexInputStateCreateInfo vi;\n        VkVertexInputBindingDescription vi_bindings[1];\n        VkVertexInputAttributeDescription vi_attrs[2];\n    } vertices;\n\n    VkCommandBuffer setup_cmd; // Command Buffer for initialization commands\n    VkCommandBuffer draw_cmd;  // Command Buffer for drawing commands\n    VkPipelineLayout pipeline_layout;\n    VkDescriptorSetLayout desc_layout;\n    VkPipelineCache pipelineCache;\n    VkRenderPass render_pass;\n    VkPipeline pipeline;\n\n    VkShaderModule vert_shader_module;\n    VkShaderModule frag_shader_module;\n\n    VkDescriptorPool desc_pool;\n    VkDescriptorSet desc_set;\n\n    VkFramebuffer *framebuffers;\n\n    VkPhysicalDeviceMemoryProperties memory_properties;\n\n    int32_t curFrame;\n    int32_t frameCount;\n    bool validate;\n    bool use_break;\n    PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallback;\n    PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallback;\n    VkDebugReportCallbackEXT msg_callback;\n    PFN_vkDebugReportMessageEXT DebugReportMessage;\n\n    float depthStencil;\n    float depthIncrement;\n\n    uint32_t current_buffer;\n    uint32_t queue_count;\n};\n\nVKAPI_ATTR VkBool32 VKAPI_CALL\ndbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,\n    uint64_t srcObject, size_t location, int32_t msgCode,\n    const char *pLayerPrefix, const char *pMsg, void *pUserData) {\n    char *message = (char *)malloc(strlen(pMsg) + 100);\n\n    assert(message);\n\n    validation_error = 1;\n\n    if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {\n        sprintf(message, \"ERROR: [%s] Code %d : %s\", pLayerPrefix, msgCode,\n            pMsg);\n    } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) {\n        sprintf(message, \"WARNING: [%s] Code %d : %s\", pLayerPrefix, msgCode,\n            pMsg);\n    } else {\n        return false;\n    }\n\n    printf(\"%s\\n\", message);\n    fflush(stdout);\n    free(message);\n\n    /*\n    * false indicates that layer should not bail-out of an\n    * API call that had validation failures. This may mean that the\n    * app dies inside the driver due to invalid parameter(s).\n    * That's what would happen without validation layers, so we'll\n    * keep that behavior here.\n    */\n    return false;\n}\n\n// Forward declaration:\nstatic void demo_resize(struct demo *demo);\n\nstatic bool memory_type_from_properties(struct demo *demo, uint32_t typeBits,\n                                        VkFlags requirements_mask,\n                                        uint32_t *typeIndex) {\n    uint32_t i;\n    // Search memtypes to find first index with those properties\n    for (i = 0; i < VK_MAX_MEMORY_TYPES; i++) {\n        if ((typeBits & 1) == 1) {\n            // Type is available, does it match user properties?\n            if ((demo->memory_properties.memoryTypes[i].propertyFlags &\n                 requirements_mask) == requirements_mask) {\n                *typeIndex = i;\n                return true;\n            }\n        }\n        typeBits >>= 1;\n    }\n    // No memory types matched, return failure\n    return false;\n}\n\nstatic void demo_flush_init_cmd(struct demo *demo) {\n    VkResult U_ASSERT_ONLY err;\n\n    if (demo->setup_cmd == VK_NULL_HANDLE)\n        return;\n\n    err = vkEndCommandBuffer(demo->setup_cmd);\n    assert(!err);\n\n    const VkCommandBuffer cmd_bufs[] = {demo->setup_cmd};\n    VkFence nullFence = {VK_NULL_HANDLE};\n    VkSubmitInfo submit_info = {.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,\n                                .pNext = NULL,\n                                .waitSemaphoreCount = 0,\n                                .pWaitSemaphores = NULL,\n                                .pWaitDstStageMask = NULL,\n                                .commandBufferCount = 1,\n                                .pCommandBuffers = cmd_bufs,\n                                .signalSemaphoreCount = 0,\n                                .pSignalSemaphores = NULL};\n\n    err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);\n    assert(!err);\n\n    err = vkQueueWaitIdle(demo->queue);\n    assert(!err);\n\n    vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, cmd_bufs);\n    demo->setup_cmd = VK_NULL_HANDLE;\n}\n\nstatic void demo_set_image_layout(struct demo *demo, VkImage image,\n                                  VkImageAspectFlags aspectMask,\n                                  VkImageLayout old_image_layout,\n                                  VkImageLayout new_image_layout,\n                                  VkAccessFlagBits srcAccessMask) {\n\n    VkResult U_ASSERT_ONLY err;\n\n    if (demo->setup_cmd == VK_NULL_HANDLE) {\n        const VkCommandBufferAllocateInfo cmd = {\n            .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,\n            .pNext = NULL,\n            .commandPool = demo->cmd_pool,\n            .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,\n            .commandBufferCount = 1,\n        };\n\n        err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->setup_cmd);\n        assert(!err);\n\n        VkCommandBufferBeginInfo cmd_buf_info = {\n            .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,\n            .pNext = NULL,\n            .flags = 0,\n            .pInheritanceInfo = NULL,\n        };\n        err = vkBeginCommandBuffer(demo->setup_cmd, &cmd_buf_info);\n        assert(!err);\n    }\n\n    VkImageMemoryBarrier image_memory_barrier = {\n        .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,\n        .pNext = NULL,\n        .srcAccessMask = srcAccessMask,\n        .dstAccessMask = 0,\n        .oldLayout = old_image_layout,\n        .newLayout = new_image_layout,\n        .image = image,\n        .subresourceRange = {aspectMask, 0, 1, 0, 1}};\n\n    if (new_image_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {\n        /* Make sure anything that was copying from this image has completed */\n        image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n    }\n\n    if (new_image_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {\n        image_memory_barrier.dstAccessMask =\n            VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n    }\n\n    if (new_image_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {\n        image_memory_barrier.dstAccessMask =\n            VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;\n    }\n\n    if (new_image_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {\n        /* Make sure any Copy or CPU writes to image are flushed */\n        image_memory_barrier.dstAccessMask =\n            VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;\n    }\n\n    VkImageMemoryBarrier *pmemory_barrier = &image_memory_barrier;\n\n    VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;\n    VkPipelineStageFlags dest_stages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;\n\n    vkCmdPipelineBarrier(demo->setup_cmd, src_stages, dest_stages, 0, 0, NULL,\n                         0, NULL, 1, pmemory_barrier);\n}\n\nstatic void demo_draw_build_cmd(struct demo *demo) {\n    const VkCommandBufferBeginInfo cmd_buf_info = {\n        .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,\n        .pNext = NULL,\n        .flags = 0,\n        .pInheritanceInfo = NULL,\n    };\n    const VkClearValue clear_values[2] = {\n            [0] = {.color.float32 = {0.2f, 0.2f, 0.2f, 0.2f}},\n            [1] = {.depthStencil = {demo->depthStencil, 0}},\n    };\n    const VkRenderPassBeginInfo rp_begin = {\n        .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,\n        .pNext = NULL,\n        .renderPass = demo->render_pass,\n        .framebuffer = demo->framebuffers[demo->current_buffer],\n        .renderArea.offset.x = 0,\n        .renderArea.offset.y = 0,\n        .renderArea.extent.width = demo->width,\n        .renderArea.extent.height = demo->height,\n        .clearValueCount = 2,\n        .pClearValues = clear_values,\n    };\n    VkResult U_ASSERT_ONLY err;\n\n    err = vkBeginCommandBuffer(demo->draw_cmd, &cmd_buf_info);\n    assert(!err);\n\n    // We can use LAYOUT_UNDEFINED as a wildcard here because we don't care what\n    // happens to the previous contents of the image\n    VkImageMemoryBarrier image_memory_barrier = {\n        .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,\n        .pNext = NULL,\n        .srcAccessMask = 0,\n        .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,\n        .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED,\n        .newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n        .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,\n        .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,\n        .image = demo->buffers[demo->current_buffer].image,\n        .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};\n\n    vkCmdPipelineBarrier(demo->draw_cmd, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,\n                         VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 0,\n                         NULL, 1, &image_memory_barrier);\n    vkCmdBeginRenderPass(demo->draw_cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);\n    vkCmdBindPipeline(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,\n                      demo->pipeline);\n    vkCmdBindDescriptorSets(demo->draw_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,\n                            demo->pipeline_layout, 0, 1, &demo->desc_set, 0,\n                            NULL);\n\n    VkViewport viewport;\n    memset(&viewport, 0, sizeof(viewport));\n    viewport.height = (float)demo->height;\n    viewport.width = (float)demo->width;\n    viewport.minDepth = (float)0.0f;\n    viewport.maxDepth = (float)1.0f;\n    vkCmdSetViewport(demo->draw_cmd, 0, 1, &viewport);\n\n    VkRect2D scissor;\n    memset(&scissor, 0, sizeof(scissor));\n    scissor.extent.width = demo->width;\n    scissor.extent.height = demo->height;\n    scissor.offset.x = 0;\n    scissor.offset.y = 0;\n    vkCmdSetScissor(demo->draw_cmd, 0, 1, &scissor);\n\n    VkDeviceSize offsets[1] = {0};\n    vkCmdBindVertexBuffers(demo->draw_cmd, VERTEX_BUFFER_BIND_ID, 1,\n                           &demo->vertices.buf, offsets);\n\n    vkCmdDraw(demo->draw_cmd, 3, 1, 0, 0);\n    vkCmdEndRenderPass(demo->draw_cmd);\n\n    VkImageMemoryBarrier prePresentBarrier = {\n        .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,\n        .pNext = NULL,\n        .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,\n        .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT,\n        .oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n        .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,\n        .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,\n        .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,\n        .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};\n\n    prePresentBarrier.image = demo->buffers[demo->current_buffer].image;\n    VkImageMemoryBarrier *pmemory_barrier = &prePresentBarrier;\n    vkCmdPipelineBarrier(demo->draw_cmd, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,\n                         VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 0,\n                         NULL, 1, pmemory_barrier);\n\n    err = vkEndCommandBuffer(demo->draw_cmd);\n    assert(!err);\n}\n\nstatic void demo_draw(struct demo *demo) {\n    VkResult U_ASSERT_ONLY err;\n    VkSemaphore imageAcquiredSemaphore, drawCompleteSemaphore;\n    VkSemaphoreCreateInfo semaphoreCreateInfo = {\n        .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,\n        .pNext = NULL,\n        .flags = 0,\n    };\n\n    err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,\n                            NULL, &imageAcquiredSemaphore);\n    assert(!err);\n\n    err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,\n                            NULL, &drawCompleteSemaphore);\n    assert(!err);\n\n    // Get the index of the next available swapchain image:\n    err = demo->fpAcquireNextImageKHR(demo->device, demo->swapchain, UINT64_MAX,\n                                      imageAcquiredSemaphore,\n                                      (VkFence)0, // TODO: Show use of fence\n                                      &demo->current_buffer);\n    if (err == VK_ERROR_OUT_OF_DATE_KHR) {\n        // demo->swapchain is out of date (e.g. the window was resized) and\n        // must be recreated:\n        demo_resize(demo);\n        demo_draw(demo);\n        vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);\n        vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);\n        return;\n    } else if (err == VK_SUBOPTIMAL_KHR) {\n        // demo->swapchain is not as optimal as it could be, but the platform's\n        // presentation engine will still present the image correctly.\n    } else {\n        assert(!err);\n    }\n\n    demo_flush_init_cmd(demo);\n\n    // Wait for the present complete semaphore to be signaled to ensure\n    // that the image won't be rendered to until the presentation\n    // engine has fully released ownership to the application, and it is\n    // okay to render to the image.\n\n    demo_draw_build_cmd(demo);\n    VkFence nullFence = VK_NULL_HANDLE;\n    VkPipelineStageFlags pipe_stage_flags =\n        VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;\n    VkSubmitInfo submit_info = {.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,\n                                .pNext = NULL,\n                                .waitSemaphoreCount = 1,\n                                .pWaitSemaphores = &imageAcquiredSemaphore,\n                                .pWaitDstStageMask = &pipe_stage_flags,\n                                .commandBufferCount = 1,\n                                .pCommandBuffers = &demo->draw_cmd,\n                                .signalSemaphoreCount = 1,\n                                .pSignalSemaphores = &drawCompleteSemaphore};\n\n    err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);\n    assert(!err);\n\n    VkPresentInfoKHR present = {\n        .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,\n        .pNext = NULL,\n        .waitSemaphoreCount = 1,\n        .pWaitSemaphores = &drawCompleteSemaphore,\n        .swapchainCount = 1,\n        .pSwapchains = &demo->swapchain,\n        .pImageIndices = &demo->current_buffer,\n    };\n\n    err = demo->fpQueuePresentKHR(demo->queue, &present);\n    if (err == VK_ERROR_OUT_OF_DATE_KHR) {\n        // demo->swapchain is out of date (e.g. the window was resized) and\n        // must be recreated:\n        demo_resize(demo);\n    } else if (err == VK_SUBOPTIMAL_KHR) {\n        // demo->swapchain is not as optimal as it could be, but the platform's\n        // presentation engine will still present the image correctly.\n    } else {\n        assert(!err);\n    }\n\n    err = vkQueueWaitIdle(demo->queue);\n    assert(err == VK_SUCCESS);\n\n    vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);\n    vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);\n}\n\nstatic void demo_prepare_buffers(struct demo *demo) {\n    VkResult U_ASSERT_ONLY err;\n    VkSwapchainKHR oldSwapchain = demo->swapchain;\n\n    // Check the surface capabilities and formats\n    VkSurfaceCapabilitiesKHR surfCapabilities;\n    err = demo->fpGetPhysicalDeviceSurfaceCapabilitiesKHR(\n        demo->gpu, demo->surface, &surfCapabilities);\n    assert(!err);\n\n    uint32_t presentModeCount;\n    err = demo->fpGetPhysicalDeviceSurfacePresentModesKHR(\n        demo->gpu, demo->surface, &presentModeCount, NULL);\n    assert(!err);\n    VkPresentModeKHR *presentModes =\n        (VkPresentModeKHR *)malloc(presentModeCount * sizeof(VkPresentModeKHR));\n    assert(presentModes);\n    err = demo->fpGetPhysicalDeviceSurfacePresentModesKHR(\n        demo->gpu, demo->surface, &presentModeCount, presentModes);\n    assert(!err);\n\n    VkExtent2D swapchainExtent;\n    // width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF.\n    if (surfCapabilities.currentExtent.width == 0xFFFFFFFF) {\n        // If the surface size is undefined, the size is set to the size\n        // of the images requested, which must fit within the minimum and\n        // maximum values.\n        swapchainExtent.width = demo->width;\n        swapchainExtent.height = demo->height;\n\n        if (swapchainExtent.width < surfCapabilities.minImageExtent.width) {\n            swapchainExtent.width = surfCapabilities.minImageExtent.width;\n        } else if (swapchainExtent.width > surfCapabilities.maxImageExtent.width) {\n            swapchainExtent.width = surfCapabilities.maxImageExtent.width;\n        }\n        \n        if (swapchainExtent.height < surfCapabilities.minImageExtent.height) {\n            swapchainExtent.height = surfCapabilities.minImageExtent.height;\n        } else if (swapchainExtent.height > surfCapabilities.maxImageExtent.height) {\n            swapchainExtent.height = surfCapabilities.maxImageExtent.height;\n        }\n    } else {\n        // If the surface size is defined, the swap chain size must match\n        swapchainExtent = surfCapabilities.currentExtent;\n        demo->width = surfCapabilities.currentExtent.width;\n        demo->height = surfCapabilities.currentExtent.height;\n    }\n\n    VkPresentModeKHR swapchainPresentMode = VK_PRESENT_MODE_FIFO_KHR;\n\n    // Determine the number of VkImage's to use in the swap chain.\n    // Application desires to only acquire 1 image at a time (which is\n    // \"surfCapabilities.minImageCount\").\n    uint32_t desiredNumOfSwapchainImages = surfCapabilities.minImageCount;\n    // If maxImageCount is 0, we can ask for as many images as we want;\n    // otherwise we're limited to maxImageCount\n    if ((surfCapabilities.maxImageCount > 0) &&\n        (desiredNumOfSwapchainImages > surfCapabilities.maxImageCount)) {\n        // Application must settle for fewer images than desired:\n        desiredNumOfSwapchainImages = surfCapabilities.maxImageCount;\n    }\n\n    VkSurfaceTransformFlagsKHR preTransform;\n    if (surfCapabilities.supportedTransforms &\n        VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) {\n        preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;\n    } else {\n        preTransform = surfCapabilities.currentTransform;\n    }\n\n    const VkSwapchainCreateInfoKHR swapchain = {\n        .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,\n        .pNext = NULL,\n        .surface = demo->surface,\n        .minImageCount = desiredNumOfSwapchainImages,\n        .imageFormat = demo->format,\n        .imageColorSpace = demo->color_space,\n        .imageExtent =\n            {\n             .width = swapchainExtent.width, .height = swapchainExtent.height,\n            },\n        .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,\n        .preTransform = preTransform,\n        .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,\n        .imageArrayLayers = 1,\n        .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,\n        .queueFamilyIndexCount = 0,\n        .pQueueFamilyIndices = NULL,\n        .presentMode = swapchainPresentMode,\n        .oldSwapchain = oldSwapchain,\n        .clipped = true,\n    };\n    uint32_t i;\n\n    err = demo->fpCreateSwapchainKHR(demo->device, &swapchain, NULL,\n                                     &demo->swapchain);\n    assert(!err);\n\n    // If we just re-created an existing swapchain, we should destroy the old\n    // swapchain at this point.\n    // Note: destroying the swapchain also cleans up all its associated\n    // presentable images once the platform is done with them.\n    if (oldSwapchain != VK_NULL_HANDLE) {\n        demo->fpDestroySwapchainKHR(demo->device, oldSwapchain, NULL);\n    }\n\n    err = demo->fpGetSwapchainImagesKHR(demo->device, demo->swapchain,\n                                        &demo->swapchainImageCount, NULL);\n    assert(!err);\n\n    VkImage *swapchainImages =\n        (VkImage *)malloc(demo->swapchainImageCount * sizeof(VkImage));\n    assert(swapchainImages);\n    err = demo->fpGetSwapchainImagesKHR(demo->device, demo->swapchain,\n                                        &demo->swapchainImageCount,\n                                        swapchainImages);\n    assert(!err);\n\n    demo->buffers = (SwapchainBuffers *)malloc(sizeof(SwapchainBuffers) *\n                                               demo->swapchainImageCount);\n    assert(demo->buffers);\n\n    for (i = 0; i < demo->swapchainImageCount; i++) {\n        VkImageViewCreateInfo color_attachment_view = {\n            .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,\n            .pNext = NULL,\n            .format = demo->format,\n            .components =\n                {\n                 .r = VK_COMPONENT_SWIZZLE_R,\n                 .g = VK_COMPONENT_SWIZZLE_G,\n                 .b = VK_COMPONENT_SWIZZLE_B,\n                 .a = VK_COMPONENT_SWIZZLE_A,\n                },\n            .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,\n                                 .baseMipLevel = 0,\n                                 .levelCount = 1,\n                                 .baseArrayLayer = 0,\n                                 .layerCount = 1},\n            .viewType = VK_IMAGE_VIEW_TYPE_2D,\n            .flags = 0,\n        };\n\n        demo->buffers[i].image = swapchainImages[i];\n\n        color_attachment_view.image = demo->buffers[i].image;\n\n        err = vkCreateImageView(demo->device, &color_attachment_view, NULL,\n                                &demo->buffers[i].view);\n        assert(!err);\n    }\n\n    demo->current_buffer = 0;\n\n    if (NULL != presentModes) {\n        free(presentModes);\n    }\n}\n\nstatic void demo_prepare_depth(struct demo *demo) {\n    const VkFormat depth_format = VK_FORMAT_D16_UNORM;\n    const VkImageCreateInfo image = {\n        .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,\n        .pNext = NULL,\n        .imageType = VK_IMAGE_TYPE_2D,\n        .format = depth_format,\n        .extent = {demo->width, demo->height, 1},\n        .mipLevels = 1,\n        .arrayLayers = 1,\n        .samples = VK_SAMPLE_COUNT_1_BIT,\n        .tiling = VK_IMAGE_TILING_OPTIMAL,\n        .usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,\n        .flags = 0,\n    };\n    VkMemoryAllocateInfo mem_alloc = {\n        .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,\n        .pNext = NULL,\n        .allocationSize = 0,\n        .memoryTypeIndex = 0,\n    };\n    VkImageViewCreateInfo view = {\n        .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,\n        .pNext = NULL,\n        .image = VK_NULL_HANDLE,\n        .format = depth_format,\n        .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT,\n                             .baseMipLevel = 0,\n                             .levelCount = 1,\n                             .baseArrayLayer = 0,\n                             .layerCount = 1},\n        .flags = 0,\n        .viewType = VK_IMAGE_VIEW_TYPE_2D,\n    };\n\n    VkMemoryRequirements mem_reqs;\n    VkResult U_ASSERT_ONLY err;\n    bool U_ASSERT_ONLY pass;\n\n    demo->depth.format = depth_format;\n\n    /* create image */\n    err = vkCreateImage(demo->device, &image, NULL, &demo->depth.image);\n    assert(!err);\n\n    /* get memory requirements for this object */\n    vkGetImageMemoryRequirements(demo->device, demo->depth.image, &mem_reqs);\n\n    /* select memory size and type */\n    mem_alloc.allocationSize = mem_reqs.size;\n    pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits,\n                                       0, /* No requirements */\n                                       &mem_alloc.memoryTypeIndex);\n    assert(pass);\n\n    /* allocate memory */\n    err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &demo->depth.mem);\n    assert(!err);\n\n    /* bind memory */\n    err =\n        vkBindImageMemory(demo->device, demo->depth.image, demo->depth.mem, 0);\n    assert(!err);\n\n    demo_set_image_layout(demo, demo->depth.image, VK_IMAGE_ASPECT_DEPTH_BIT,\n                          VK_IMAGE_LAYOUT_UNDEFINED,\n                          VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,\n                          0);\n\n    /* create image view */\n    view.image = demo->depth.image;\n    err = vkCreateImageView(demo->device, &view, NULL, &demo->depth.view);\n    assert(!err);\n}\n\nstatic void\ndemo_prepare_texture_image(struct demo *demo, const uint32_t *tex_colors,\n                           struct texture_object *tex_obj, VkImageTiling tiling,\n                           VkImageUsageFlags usage, VkFlags required_props) {\n    const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;\n    const int32_t tex_width = 2;\n    const int32_t tex_height = 2;\n    VkResult U_ASSERT_ONLY err;\n    bool U_ASSERT_ONLY pass;\n\n    tex_obj->tex_width = tex_width;\n    tex_obj->tex_height = tex_height;\n\n    const VkImageCreateInfo image_create_info = {\n        .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,\n        .pNext = NULL,\n        .imageType = VK_IMAGE_TYPE_2D,\n        .format = tex_format,\n        .extent = {tex_width, tex_height, 1},\n        .mipLevels = 1,\n        .arrayLayers = 1,\n        .samples = VK_SAMPLE_COUNT_1_BIT,\n        .tiling = tiling,\n        .usage = usage,\n        .flags = 0,\n        .initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED\n    };\n    VkMemoryAllocateInfo mem_alloc = {\n        .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,\n        .pNext = NULL,\n        .allocationSize = 0,\n        .memoryTypeIndex = 0,\n    };\n\n    VkMemoryRequirements mem_reqs;\n\n    err =\n        vkCreateImage(demo->device, &image_create_info, NULL, &tex_obj->image);\n    assert(!err);\n\n    vkGetImageMemoryRequirements(demo->device, tex_obj->image, &mem_reqs);\n\n    mem_alloc.allocationSize = mem_reqs.size;\n    pass =\n        memory_type_from_properties(demo, mem_reqs.memoryTypeBits,\n                                    required_props, &mem_alloc.memoryTypeIndex);\n    assert(pass);\n\n    /* allocate memory */\n    err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &tex_obj->mem);\n    assert(!err);\n\n    /* bind memory */\n    err = vkBindImageMemory(demo->device, tex_obj->image, tex_obj->mem, 0);\n    assert(!err);\n\n    if (required_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {\n        const VkImageSubresource subres = {\n            .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,\n            .mipLevel = 0,\n            .arrayLayer = 0,\n        };\n        VkSubresourceLayout layout;\n        void *data;\n        int32_t x, y;\n\n        vkGetImageSubresourceLayout(demo->device, tex_obj->image, &subres,\n                                    &layout);\n\n        err = vkMapMemory(demo->device, tex_obj->mem, 0,\n                          mem_alloc.allocationSize, 0, &data);\n        assert(!err);\n\n        for (y = 0; y < tex_height; y++) {\n            uint32_t *row = (uint32_t *)((char *)data + layout.rowPitch * y);\n            for (x = 0; x < tex_width; x++)\n                row[x] = tex_colors[(x & 1) ^ (y & 1)];\n        }\n\n        vkUnmapMemory(demo->device, tex_obj->mem);\n    }\n\n    tex_obj->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n    demo_set_image_layout(demo, tex_obj->image, VK_IMAGE_ASPECT_COLOR_BIT,\n                          VK_IMAGE_LAYOUT_PREINITIALIZED, tex_obj->imageLayout,\n                          VK_ACCESS_HOST_WRITE_BIT);\n    /* setting the image layout does not reference the actual memory so no need\n     * to add a mem ref */\n}\n\nstatic void demo_destroy_texture_image(struct demo *demo,\n                                       struct texture_object *tex_obj) {\n    /* clean up staging resources */\n    vkDestroyImage(demo->device, tex_obj->image, NULL);\n    vkFreeMemory(demo->device, tex_obj->mem, NULL);\n}\n\nstatic void demo_prepare_textures(struct demo *demo) {\n    const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;\n    VkFormatProperties props;\n    const uint32_t tex_colors[DEMO_TEXTURE_COUNT][2] = {\n        {0xffff0000, 0xff00ff00},\n    };\n    uint32_t i;\n    VkResult U_ASSERT_ONLY err;\n\n    vkGetPhysicalDeviceFormatProperties(demo->gpu, tex_format, &props);\n\n    for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {\n        if ((props.linearTilingFeatures &\n             VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) &&\n            !demo->use_staging_buffer) {\n            /* Device can texture using linear textures */\n            demo_prepare_texture_image(\n                demo, tex_colors[i], &demo->textures[i], VK_IMAGE_TILING_LINEAR,\n                VK_IMAGE_USAGE_SAMPLED_BIT,\n                VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |\n                    VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);\n        } else if (props.optimalTilingFeatures &\n                   VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {\n            /* Must use staging buffer to copy linear texture to optimized */\n            struct texture_object staging_texture;\n\n            memset(&staging_texture, 0, sizeof(staging_texture));\n            demo_prepare_texture_image(\n                demo, tex_colors[i], &staging_texture, VK_IMAGE_TILING_LINEAR,\n                VK_IMAGE_USAGE_TRANSFER_SRC_BIT,\n                VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |\n                    VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);\n\n            demo_prepare_texture_image(\n                demo, tex_colors[i], &demo->textures[i],\n                VK_IMAGE_TILING_OPTIMAL,\n                (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),\n                VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);\n\n            demo_set_image_layout(demo, staging_texture.image,\n                                  VK_IMAGE_ASPECT_COLOR_BIT,\n                                  staging_texture.imageLayout,\n                                  VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,\n                                  0);\n\n            demo_set_image_layout(demo, demo->textures[i].image,\n                                  VK_IMAGE_ASPECT_COLOR_BIT,\n                                  demo->textures[i].imageLayout,\n                                  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n                                  0);\n\n            VkImageCopy copy_region = {\n                .srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1},\n                .srcOffset = {0, 0, 0},\n                .dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1},\n                .dstOffset = {0, 0, 0},\n                .extent = {staging_texture.tex_width,\n                           staging_texture.tex_height, 1},\n            };\n            vkCmdCopyImage(\n                demo->setup_cmd, staging_texture.image,\n                VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, demo->textures[i].image,\n                VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);\n\n            demo_set_image_layout(demo, demo->textures[i].image,\n                                  VK_IMAGE_ASPECT_COLOR_BIT,\n                                  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n                                  demo->textures[i].imageLayout,\n                                  0);\n\n            demo_flush_init_cmd(demo);\n\n            demo_destroy_texture_image(demo, &staging_texture);\n        } else {\n            /* Can't support VK_FORMAT_B8G8R8A8_UNORM !? */\n            assert(!\"No support for B8G8R8A8_UNORM as texture image format\");\n        }\n\n        const VkSamplerCreateInfo sampler = {\n            .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,\n            .pNext = NULL,\n            .magFilter = VK_FILTER_NEAREST,\n            .minFilter = VK_FILTER_NEAREST,\n            .mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST,\n            .addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT,\n            .addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT,\n            .addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT,\n            .mipLodBias = 0.0f,\n            .anisotropyEnable = VK_FALSE,\n            .maxAnisotropy = 1,\n            .compareOp = VK_COMPARE_OP_NEVER,\n            .minLod = 0.0f,\n            .maxLod = 0.0f,\n            .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,\n            .unnormalizedCoordinates = VK_FALSE,\n        };\n        VkImageViewCreateInfo view = {\n            .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,\n            .pNext = NULL,\n            .image = VK_NULL_HANDLE,\n            .viewType = VK_IMAGE_VIEW_TYPE_2D,\n            .format = tex_format,\n            .components =\n                {\n                 VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G,\n                 VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A,\n                },\n            .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},\n            .flags = 0,\n        };\n\n        /* create sampler */\n        err = vkCreateSampler(demo->device, &sampler, NULL,\n                              &demo->textures[i].sampler);\n        assert(!err);\n\n        /* create image view */\n        view.image = demo->textures[i].image;\n        err = vkCreateImageView(demo->device, &view, NULL,\n                                &demo->textures[i].view);\n        assert(!err);\n    }\n}\n\nstatic void demo_prepare_vertices(struct demo *demo) {\n    // clang-format off\n    const float vb[3][5] = {\n        /*      position             texcoord */\n        { -1.0f, -1.0f,  0.25f,     0.0f, 0.0f },\n        {  1.0f, -1.0f,  0.25f,     1.0f, 0.0f },\n        {  0.0f,  1.0f,  1.0f,      0.5f, 1.0f },\n    };\n    // clang-format on\n    const VkBufferCreateInfo buf_info = {\n        .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,\n        .pNext = NULL,\n        .size = sizeof(vb),\n        .usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,\n        .flags = 0,\n    };\n    VkMemoryAllocateInfo mem_alloc = {\n        .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,\n        .pNext = NULL,\n        .allocationSize = 0,\n        .memoryTypeIndex = 0,\n    };\n    VkMemoryRequirements mem_reqs;\n    VkResult U_ASSERT_ONLY err;\n    bool U_ASSERT_ONLY pass;\n    void *data;\n\n    memset(&demo->vertices, 0, sizeof(demo->vertices));\n\n    err = vkCreateBuffer(demo->device, &buf_info, NULL, &demo->vertices.buf);\n    assert(!err);\n\n    vkGetBufferMemoryRequirements(demo->device, demo->vertices.buf, &mem_reqs);\n    assert(!err);\n\n    mem_alloc.allocationSize = mem_reqs.size;\n    pass = memory_type_from_properties(demo, mem_reqs.memoryTypeBits,\n                                       VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |\n                                           VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,\n                                       &mem_alloc.memoryTypeIndex);\n    assert(pass);\n\n    err = vkAllocateMemory(demo->device, &mem_alloc, NULL, &demo->vertices.mem);\n    assert(!err);\n\n    err = vkMapMemory(demo->device, demo->vertices.mem, 0,\n                      mem_alloc.allocationSize, 0, &data);\n    assert(!err);\n\n    memcpy(data, vb, sizeof(vb));\n\n    vkUnmapMemory(demo->device, demo->vertices.mem);\n\n    err = vkBindBufferMemory(demo->device, demo->vertices.buf,\n                             demo->vertices.mem, 0);\n    assert(!err);\n\n    demo->vertices.vi.sType =\n        VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n    demo->vertices.vi.pNext = NULL;\n    demo->vertices.vi.vertexBindingDescriptionCount = 1;\n    demo->vertices.vi.pVertexBindingDescriptions = demo->vertices.vi_bindings;\n    demo->vertices.vi.vertexAttributeDescriptionCount = 2;\n    demo->vertices.vi.pVertexAttributeDescriptions = demo->vertices.vi_attrs;\n\n    demo->vertices.vi_bindings[0].binding = VERTEX_BUFFER_BIND_ID;\n    demo->vertices.vi_bindings[0].stride = sizeof(vb[0]);\n    demo->vertices.vi_bindings[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;\n\n    demo->vertices.vi_attrs[0].binding = VERTEX_BUFFER_BIND_ID;\n    demo->vertices.vi_attrs[0].location = 0;\n    demo->vertices.vi_attrs[0].format = VK_FORMAT_R32G32B32_SFLOAT;\n    demo->vertices.vi_attrs[0].offset = 0;\n\n    demo->vertices.vi_attrs[1].binding = VERTEX_BUFFER_BIND_ID;\n    demo->vertices.vi_attrs[1].location = 1;\n    demo->vertices.vi_attrs[1].format = VK_FORMAT_R32G32_SFLOAT;\n    demo->vertices.vi_attrs[1].offset = sizeof(float) * 3;\n}\n\nstatic void demo_prepare_descriptor_layout(struct demo *demo) {\n    const VkDescriptorSetLayoutBinding layout_binding = {\n        .binding = 0,\n        .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,\n        .descriptorCount = DEMO_TEXTURE_COUNT,\n        .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,\n        .pImmutableSamplers = NULL,\n    };\n    const VkDescriptorSetLayoutCreateInfo descriptor_layout = {\n        .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,\n        .pNext = NULL,\n        .bindingCount = 1,\n        .pBindings = &layout_binding,\n    };\n    VkResult U_ASSERT_ONLY err;\n\n    err = vkCreateDescriptorSetLayout(demo->device, &descriptor_layout, NULL,\n                                      &demo->desc_layout);\n    assert(!err);\n\n    const VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {\n        .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,\n        .pNext = NULL,\n        .setLayoutCount = 1,\n        .pSetLayouts = &demo->desc_layout,\n    };\n\n    err = vkCreatePipelineLayout(demo->device, &pPipelineLayoutCreateInfo, NULL,\n                                 &demo->pipeline_layout);\n    assert(!err);\n}\n\nstatic void demo_prepare_render_pass(struct demo *demo) {\n    const VkAttachmentDescription attachments[2] = {\n            [0] =\n                {\n                 .format = demo->format,\n                 .samples = VK_SAMPLE_COUNT_1_BIT,\n                 .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,\n                 .storeOp = VK_ATTACHMENT_STORE_OP_STORE,\n                 .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,\n                 .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,\n                 .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n                 .finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n                },\n            [1] =\n                {\n                 .format = demo->depth.format,\n                 .samples = VK_SAMPLE_COUNT_1_BIT,\n                 .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,\n                 .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,\n                 .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,\n                 .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,\n                 .initialLayout =\n                     VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,\n                 .finalLayout =\n                     VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,\n                },\n    };\n    const VkAttachmentReference color_reference = {\n        .attachment = 0, .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n    };\n    const VkAttachmentReference depth_reference = {\n        .attachment = 1,\n        .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,\n    };\n    const VkSubpassDescription subpass = {\n        .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,\n        .flags = 0,\n        .inputAttachmentCount = 0,\n        .pInputAttachments = NULL,\n        .colorAttachmentCount = 1,\n        .pColorAttachments = &color_reference,\n        .pResolveAttachments = NULL,\n        .pDepthStencilAttachment = &depth_reference,\n        .preserveAttachmentCount = 0,\n        .pPreserveAttachments = NULL,\n    };\n    const VkRenderPassCreateInfo rp_info = {\n        .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,\n        .pNext = NULL,\n        .attachmentCount = 2,\n        .pAttachments = attachments,\n        .subpassCount = 1,\n        .pSubpasses = &subpass,\n        .dependencyCount = 0,\n        .pDependencies = NULL,\n    };\n    VkResult U_ASSERT_ONLY err;\n\n    err = vkCreateRenderPass(demo->device, &rp_info, NULL, &demo->render_pass);\n    assert(!err);\n}\n\nstatic VkShaderModule\ndemo_prepare_shader_module(struct demo *demo, const void *code, size_t size) {\n    VkShaderModuleCreateInfo moduleCreateInfo;\n    VkShaderModule module;\n    VkResult U_ASSERT_ONLY err;\n\n    moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n    moduleCreateInfo.pNext = NULL;\n\n    moduleCreateInfo.codeSize = size;\n    moduleCreateInfo.pCode = code;\n    moduleCreateInfo.flags = 0;\n    err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module);\n    assert(!err);\n\n    return module;\n}\n\nstatic VkShaderModule demo_prepare_vs(struct demo *demo) {\n    size_t size = sizeof(vertShaderCode);\n\n    demo->vert_shader_module =\n        demo_prepare_shader_module(demo, vertShaderCode, size);\n\n    return demo->vert_shader_module;\n}\n\nstatic VkShaderModule demo_prepare_fs(struct demo *demo) {\n    size_t size = sizeof(fragShaderCode);\n\n    demo->frag_shader_module =\n        demo_prepare_shader_module(demo, fragShaderCode, size);\n\n    return demo->frag_shader_module;\n}\n\nstatic void demo_prepare_pipeline(struct demo *demo) {\n    VkGraphicsPipelineCreateInfo pipeline;\n    VkPipelineCacheCreateInfo pipelineCache;\n\n    VkPipelineVertexInputStateCreateInfo vi;\n    VkPipelineInputAssemblyStateCreateInfo ia;\n    VkPipelineRasterizationStateCreateInfo rs;\n    VkPipelineColorBlendStateCreateInfo cb;\n    VkPipelineDepthStencilStateCreateInfo ds;\n    VkPipelineViewportStateCreateInfo vp;\n    VkPipelineMultisampleStateCreateInfo ms;\n    VkDynamicState dynamicStateEnables[VK_DYNAMIC_STATE_RANGE_SIZE];\n    VkPipelineDynamicStateCreateInfo dynamicState;\n\n    VkResult U_ASSERT_ONLY err;\n\n    memset(dynamicStateEnables, 0, sizeof dynamicStateEnables);\n    memset(&dynamicState, 0, sizeof dynamicState);\n    dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n    dynamicState.pDynamicStates = dynamicStateEnables;\n\n    memset(&pipeline, 0, sizeof(pipeline));\n    pipeline.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n    pipeline.layout = demo->pipeline_layout;\n\n    vi = demo->vertices.vi;\n\n    memset(&ia, 0, sizeof(ia));\n    ia.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n    ia.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;\n\n    memset(&rs, 0, sizeof(rs));\n    rs.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n    rs.polygonMode = VK_POLYGON_MODE_FILL;\n    rs.cullMode = VK_CULL_MODE_BACK_BIT;\n    rs.frontFace = VK_FRONT_FACE_CLOCKWISE;\n    rs.depthClampEnable = VK_FALSE;\n    rs.rasterizerDiscardEnable = VK_FALSE;\n    rs.depthBiasEnable = VK_FALSE;\n    rs.lineWidth = 1.0f;\n\n    memset(&cb, 0, sizeof(cb));\n    cb.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n    VkPipelineColorBlendAttachmentState att_state[1];\n    memset(att_state, 0, sizeof(att_state));\n    att_state[0].colorWriteMask = 0xf;\n    att_state[0].blendEnable = VK_FALSE;\n    cb.attachmentCount = 1;\n    cb.pAttachments = att_state;\n\n    memset(&vp, 0, sizeof(vp));\n    vp.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n    vp.viewportCount = 1;\n    dynamicStateEnables[dynamicState.dynamicStateCount++] =\n        VK_DYNAMIC_STATE_VIEWPORT;\n    vp.scissorCount = 1;\n    dynamicStateEnables[dynamicState.dynamicStateCount++] =\n        VK_DYNAMIC_STATE_SCISSOR;\n\n    memset(&ds, 0, sizeof(ds));\n    ds.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;\n    ds.depthTestEnable = VK_TRUE;\n    ds.depthWriteEnable = VK_TRUE;\n    ds.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL;\n    ds.depthBoundsTestEnable = VK_FALSE;\n    ds.back.failOp = VK_STENCIL_OP_KEEP;\n    ds.back.passOp = VK_STENCIL_OP_KEEP;\n    ds.back.compareOp = VK_COMPARE_OP_ALWAYS;\n    ds.stencilTestEnable = VK_FALSE;\n    ds.front = ds.back;\n\n    memset(&ms, 0, sizeof(ms));\n    ms.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n    ms.pSampleMask = NULL;\n    ms.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;\n\n    // Two stages: vs and fs\n    pipeline.stageCount = 2;\n    VkPipelineShaderStageCreateInfo shaderStages[2];\n    memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));\n\n    shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n    shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;\n    shaderStages[0].module = demo_prepare_vs(demo);\n    shaderStages[0].pName = \"main\";\n\n    shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n    shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;\n    shaderStages[1].module = demo_prepare_fs(demo);\n    shaderStages[1].pName = \"main\";\n\n    pipeline.pVertexInputState = &vi;\n    pipeline.pInputAssemblyState = &ia;\n    pipeline.pRasterizationState = &rs;\n    pipeline.pColorBlendState = &cb;\n    pipeline.pMultisampleState = &ms;\n    pipeline.pViewportState = &vp;\n    pipeline.pDepthStencilState = &ds;\n    pipeline.pStages = shaderStages;\n    pipeline.renderPass = demo->render_pass;\n    pipeline.pDynamicState = &dynamicState;\n\n    memset(&pipelineCache, 0, sizeof(pipelineCache));\n    pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;\n\n    err = vkCreatePipelineCache(demo->device, &pipelineCache, NULL,\n                                &demo->pipelineCache);\n    assert(!err);\n    err = vkCreateGraphicsPipelines(demo->device, demo->pipelineCache, 1,\n                                    &pipeline, NULL, &demo->pipeline);\n    assert(!err);\n\n    vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL);\n\n    vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL);\n    vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL);\n}\n\nstatic void demo_prepare_descriptor_pool(struct demo *demo) {\n    const VkDescriptorPoolSize type_count = {\n        .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,\n        .descriptorCount = DEMO_TEXTURE_COUNT,\n    };\n    const VkDescriptorPoolCreateInfo descriptor_pool = {\n        .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,\n        .pNext = NULL,\n        .maxSets = 1,\n        .poolSizeCount = 1,\n        .pPoolSizes = &type_count,\n    };\n    VkResult U_ASSERT_ONLY err;\n\n    err = vkCreateDescriptorPool(demo->device, &descriptor_pool, NULL,\n                                 &demo->desc_pool);\n    assert(!err);\n}\n\nstatic void demo_prepare_descriptor_set(struct demo *demo) {\n    VkDescriptorImageInfo tex_descs[DEMO_TEXTURE_COUNT];\n    VkWriteDescriptorSet write;\n    VkResult U_ASSERT_ONLY err;\n    uint32_t i;\n\n    VkDescriptorSetAllocateInfo alloc_info = {\n        .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,\n        .pNext = NULL,\n        .descriptorPool = demo->desc_pool,\n        .descriptorSetCount = 1,\n        .pSetLayouts = &demo->desc_layout};\n    err = vkAllocateDescriptorSets(demo->device, &alloc_info, &demo->desc_set);\n    assert(!err);\n\n    memset(&tex_descs, 0, sizeof(tex_descs));\n    for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {\n        tex_descs[i].sampler = demo->textures[i].sampler;\n        tex_descs[i].imageView = demo->textures[i].view;\n        tex_descs[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL;\n    }\n\n    memset(&write, 0, sizeof(write));\n    write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    write.dstSet = demo->desc_set;\n    write.descriptorCount = DEMO_TEXTURE_COUNT;\n    write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n    write.pImageInfo = tex_descs;\n\n    vkUpdateDescriptorSets(demo->device, 1, &write, 0, NULL);\n}\n\nstatic void demo_prepare_framebuffers(struct demo *demo) {\n    VkImageView attachments[2];\n    attachments[1] = demo->depth.view;\n\n    const VkFramebufferCreateInfo fb_info = {\n        .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,\n        .pNext = NULL,\n        .renderPass = demo->render_pass,\n        .attachmentCount = 2,\n        .pAttachments = attachments,\n        .width = demo->width,\n        .height = demo->height,\n        .layers = 1,\n    };\n    VkResult U_ASSERT_ONLY err;\n    uint32_t i;\n\n    demo->framebuffers = (VkFramebuffer *)malloc(demo->swapchainImageCount *\n                                                 sizeof(VkFramebuffer));\n    assert(demo->framebuffers);\n\n    for (i = 0; i < demo->swapchainImageCount; i++) {\n        attachments[0] = demo->buffers[i].view;\n        err = vkCreateFramebuffer(demo->device, &fb_info, NULL,\n                                  &demo->framebuffers[i]);\n        assert(!err);\n    }\n}\n\nstatic void demo_prepare(struct demo *demo) {\n    VkResult U_ASSERT_ONLY err;\n\n    const VkCommandPoolCreateInfo cmd_pool_info = {\n        .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,\n        .pNext = NULL,\n        .queueFamilyIndex = demo->graphics_queue_node_index,\n        .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,\n    };\n    err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL,\n                              &demo->cmd_pool);\n    assert(!err);\n\n    const VkCommandBufferAllocateInfo cmd = {\n        .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,\n        .pNext = NULL,\n        .commandPool = demo->cmd_pool,\n        .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,\n        .commandBufferCount = 1,\n    };\n    err = vkAllocateCommandBuffers(demo->device, &cmd, &demo->draw_cmd);\n    assert(!err);\n\n    demo_prepare_buffers(demo);\n    demo_prepare_depth(demo);\n    demo_prepare_textures(demo);\n    demo_prepare_vertices(demo);\n    demo_prepare_descriptor_layout(demo);\n    demo_prepare_render_pass(demo);\n    demo_prepare_pipeline(demo);\n\n    demo_prepare_descriptor_pool(demo);\n    demo_prepare_descriptor_set(demo);\n\n    demo_prepare_framebuffers(demo);\n}\n\nstatic void demo_error_callback(int error, const char* description) {\n    printf(\"GLFW error: %s\\n\", description);\n    fflush(stdout);\n}\n\nstatic void demo_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)\n        glfwSetWindowShouldClose(window, GLFW_TRUE);\n}\n\nstatic void demo_refresh_callback(GLFWwindow* window) {\n    struct demo* demo = glfwGetWindowUserPointer(window);\n    demo_draw(demo);\n}\n\nstatic void demo_resize_callback(GLFWwindow* window, int width, int height) {\n    struct demo* demo = glfwGetWindowUserPointer(window);\n    demo->width = width;\n    demo->height = height;\n    demo_resize(demo);\n}\n\nstatic void demo_run(struct demo *demo) {\n    while (!glfwWindowShouldClose(demo->window)) {\n        glfwPollEvents();\n\n        demo_draw(demo);\n\n        if (demo->depthStencil > 0.99f)\n            demo->depthIncrement = -0.001f;\n        if (demo->depthStencil < 0.8f)\n            demo->depthIncrement = 0.001f;\n\n        demo->depthStencil += demo->depthIncrement;\n\n        // Wait for work to finish before updating MVP.\n        vkDeviceWaitIdle(demo->device);\n        demo->curFrame++;\n        if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount)\n            glfwSetWindowShouldClose(demo->window, GLFW_TRUE);\n    }\n}\n\nstatic void demo_create_window(struct demo *demo) {\n    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);\n\n    demo->window = glfwCreateWindow(demo->width,\n                                    demo->height,\n                                    APP_LONG_NAME,\n                                    NULL,\n                                    NULL);\n    if (!demo->window) {\n        // It didn't work, so try to give a useful error:\n        printf(\"Cannot create a window in which to draw!\\n\");\n        fflush(stdout);\n        exit(1);\n    }\n\n    glfwSetWindowUserPointer(demo->window, demo);\n    glfwSetWindowRefreshCallback(demo->window, demo_refresh_callback);\n    glfwSetFramebufferSizeCallback(demo->window, demo_resize_callback);\n    glfwSetKeyCallback(demo->window, demo_key_callback);\n}\n\n/*\n * Return 1 (true) if all layer names specified in check_names\n * can be found in given layer properties.\n */\nstatic VkBool32 demo_check_layers(uint32_t check_count, const char **check_names,\n                                  uint32_t layer_count,\n                                  VkLayerProperties *layers) {\n    uint32_t i, j;\n    for (i = 0; i < check_count; i++) {\n        VkBool32 found = 0;\n        for (j = 0; j < layer_count; j++) {\n            if (!strcmp(check_names[i], layers[j].layerName)) {\n                found = 1;\n                break;\n            }\n        }\n        if (!found) {\n            fprintf(stderr, \"Cannot find layer: %s\\n\", check_names[i]);\n            return 0;\n        }\n    }\n    return 1;\n}\n\nstatic void demo_init_vk(struct demo *demo) {\n    VkResult err;\n    uint32_t i = 0;\n    uint32_t required_extension_count = 0;\n    uint32_t instance_extension_count = 0;\n    uint32_t instance_layer_count = 0;\n    uint32_t validation_layer_count = 0;\n    const char **required_extensions = NULL;\n    const char **instance_validation_layers = NULL;\n    demo->enabled_extension_count = 0;\n    demo->enabled_layer_count = 0;\n\n    char *instance_validation_layers_alt1[] = {\n        \"VK_LAYER_LUNARG_standard_validation\"\n    };\n\n    char *instance_validation_layers_alt2[] = {\n        \"VK_LAYER_GOOGLE_threading\",       \"VK_LAYER_LUNARG_parameter_validation\",\n        \"VK_LAYER_LUNARG_object_tracker\",  \"VK_LAYER_LUNARG_image\",\n        \"VK_LAYER_LUNARG_core_validation\", \"VK_LAYER_LUNARG_swapchain\",\n        \"VK_LAYER_GOOGLE_unique_objects\"\n    };\n\n    /* Look for validation layers */\n    VkBool32 validation_found = 0;\n    if (demo->validate) {\n\n        err = vkEnumerateInstanceLayerProperties(&instance_layer_count, NULL);\n        assert(!err);\n\n        instance_validation_layers = (const char**) instance_validation_layers_alt1;\n        if (instance_layer_count > 0) {\n            VkLayerProperties *instance_layers =\n                    malloc(sizeof (VkLayerProperties) * instance_layer_count);\n            err = vkEnumerateInstanceLayerProperties(&instance_layer_count,\n                    instance_layers);\n            assert(!err);\n\n\n            validation_found = demo_check_layers(\n                    ARRAY_SIZE(instance_validation_layers_alt1),\n                    instance_validation_layers, instance_layer_count,\n                    instance_layers);\n            if (validation_found) {\n                demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt1);\n                demo->enabled_layers[0] = \"VK_LAYER_LUNARG_standard_validation\";\n                validation_layer_count = 1;\n            } else {\n                // use alternative set of validation layers\n                instance_validation_layers =\n                    (const char**) instance_validation_layers_alt2;\n                demo->enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt2);\n                validation_found = demo_check_layers(\n                    ARRAY_SIZE(instance_validation_layers_alt2),\n                    instance_validation_layers, instance_layer_count,\n                    instance_layers);\n                validation_layer_count =\n                    ARRAY_SIZE(instance_validation_layers_alt2);\n                for (i = 0; i < validation_layer_count; i++) {\n                    demo->enabled_layers[i] = instance_validation_layers[i];\n                }\n            }\n            free(instance_layers);\n        }\n\n        if (!validation_found) {\n            ERR_EXIT(\"vkEnumerateInstanceLayerProperties failed to find \"\n                    \"required validation layer.\\n\\n\"\n                    \"Please look at the Getting Started guide for additional \"\n                    \"information.\\n\",\n                    \"vkCreateInstance Failure\");\n        }\n    }\n\n    /* Look for instance extensions */\n    required_extensions = glfwGetRequiredInstanceExtensions(&required_extension_count);\n    if (!required_extensions) {\n        ERR_EXIT(\"glfwGetRequiredInstanceExtensions failed to find the \"\n                 \"platform surface extensions.\\n\\nDo you have a compatible \"\n                 \"Vulkan installable client driver (ICD) installed?\\nPlease \"\n                 \"look at the Getting Started guide for additional \"\n                 \"information.\\n\",\n                 \"vkCreateInstance Failure\");\n    }\n\n    for (i = 0; i < required_extension_count; i++) {\n        demo->extension_names[demo->enabled_extension_count++] = required_extensions[i];\n        assert(demo->enabled_extension_count < 64);\n    }\n\n    err = vkEnumerateInstanceExtensionProperties(\n        NULL, &instance_extension_count, NULL);\n    assert(!err);\n\n    if (instance_extension_count > 0) {\n        VkExtensionProperties *instance_extensions =\n            malloc(sizeof(VkExtensionProperties) * instance_extension_count);\n        err = vkEnumerateInstanceExtensionProperties(\n            NULL, &instance_extension_count, instance_extensions);\n        assert(!err);\n        for (i = 0; i < instance_extension_count; i++) {\n            if (!strcmp(VK_EXT_DEBUG_REPORT_EXTENSION_NAME,\n                        instance_extensions[i].extensionName)) {\n                if (demo->validate) {\n                    demo->extension_names[demo->enabled_extension_count++] =\n                        VK_EXT_DEBUG_REPORT_EXTENSION_NAME;\n                }\n            }\n            assert(demo->enabled_extension_count < 64);\n        }\n\n        free(instance_extensions);\n    }\n\n    const VkApplicationInfo app = {\n        .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,\n        .pNext = NULL,\n        .pApplicationName = APP_SHORT_NAME,\n        .applicationVersion = 0,\n        .pEngineName = APP_SHORT_NAME,\n        .engineVersion = 0,\n        .apiVersion = VK_API_VERSION_1_0,\n    };\n    VkInstanceCreateInfo inst_info = {\n        .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,\n        .pNext = NULL,\n        .pApplicationInfo = &app,\n        .enabledLayerCount = demo->enabled_layer_count,\n        .ppEnabledLayerNames = (const char *const *)instance_validation_layers,\n        .enabledExtensionCount = demo->enabled_extension_count,\n        .ppEnabledExtensionNames = (const char *const *)demo->extension_names,\n    };\n\n    uint32_t gpu_count;\n\n    err = vkCreateInstance(&inst_info, NULL, &demo->inst);\n    if (err == VK_ERROR_INCOMPATIBLE_DRIVER) {\n        ERR_EXIT(\"Cannot find a compatible Vulkan installable client driver \"\n                 \"(ICD).\\n\\nPlease look at the Getting Started guide for \"\n                 \"additional information.\\n\",\n                 \"vkCreateInstance Failure\");\n    } else if (err == VK_ERROR_EXTENSION_NOT_PRESENT) {\n        ERR_EXIT(\"Cannot find a specified extension library\"\n                 \".\\nMake sure your layers path is set appropriately\\n\",\n                 \"vkCreateInstance Failure\");\n    } else if (err) {\n        ERR_EXIT(\"vkCreateInstance failed.\\n\\nDo you have a compatible Vulkan \"\n                 \"installable client driver (ICD) installed?\\nPlease look at \"\n                 \"the Getting Started guide for additional information.\\n\",\n                 \"vkCreateInstance Failure\");\n    }\n\n    /* Make initial call to query gpu_count, then second call for gpu info*/\n    err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, NULL);\n    assert(!err && gpu_count > 0);\n\n    if (gpu_count > 0) {\n        VkPhysicalDevice *physical_devices =\n            malloc(sizeof(VkPhysicalDevice) * gpu_count);\n        err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count,\n                                         physical_devices);\n        assert(!err);\n        /* For tri demo we just grab the first physical device */\n        demo->gpu = physical_devices[0];\n        free(physical_devices);\n    } else {\n        ERR_EXIT(\"vkEnumeratePhysicalDevices reported zero accessible devices.\"\n                 \"\\n\\nDo you have a compatible Vulkan installable client\"\n                 \" driver (ICD) installed?\\nPlease look at the Getting Started\"\n                 \" guide for additional information.\\n\",\n                 \"vkEnumeratePhysicalDevices Failure\");\n    }\n\n    /* Look for device extensions */\n    uint32_t device_extension_count = 0;\n    VkBool32 swapchainExtFound = 0;\n    demo->enabled_extension_count = 0;\n\n    err = vkEnumerateDeviceExtensionProperties(demo->gpu, NULL,\n                                               &device_extension_count, NULL);\n    assert(!err);\n\n    if (device_extension_count > 0) {\n        VkExtensionProperties *device_extensions =\n                malloc(sizeof(VkExtensionProperties) * device_extension_count);\n        err = vkEnumerateDeviceExtensionProperties(\n            demo->gpu, NULL, &device_extension_count, device_extensions);\n        assert(!err);\n\n        for (i = 0; i < device_extension_count; i++) {\n            if (!strcmp(VK_KHR_SWAPCHAIN_EXTENSION_NAME,\n                        device_extensions[i].extensionName)) {\n                swapchainExtFound = 1;\n                demo->extension_names[demo->enabled_extension_count++] =\n                    VK_KHR_SWAPCHAIN_EXTENSION_NAME;\n            }\n            assert(demo->enabled_extension_count < 64);\n        }\n\n        free(device_extensions);\n    }\n\n    if (!swapchainExtFound) {\n        ERR_EXIT(\"vkEnumerateDeviceExtensionProperties failed to find \"\n                 \"the \" VK_KHR_SWAPCHAIN_EXTENSION_NAME\n                 \" extension.\\n\\nDo you have a compatible \"\n                 \"Vulkan installable client driver (ICD) installed?\\nPlease \"\n                 \"look at the Getting Started guide for additional \"\n                 \"information.\\n\",\n                 \"vkCreateInstance Failure\");\n    }\n\n    if (demo->validate) {\n        demo->CreateDebugReportCallback =\n            (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(\n                demo->inst, \"vkCreateDebugReportCallbackEXT\");\n        demo->DestroyDebugReportCallback =\n            (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(\n                demo->inst, \"vkDestroyDebugReportCallbackEXT\");\n        if (!demo->CreateDebugReportCallback) {\n            ERR_EXIT(\n                \"GetProcAddr: Unable to find vkCreateDebugReportCallbackEXT\\n\",\n                \"vkGetProcAddr Failure\");\n        }\n        if (!demo->DestroyDebugReportCallback) {\n            ERR_EXIT(\n                \"GetProcAddr: Unable to find vkDestroyDebugReportCallbackEXT\\n\",\n                \"vkGetProcAddr Failure\");\n        }\n        demo->DebugReportMessage =\n            (PFN_vkDebugReportMessageEXT)vkGetInstanceProcAddr(\n                demo->inst, \"vkDebugReportMessageEXT\");\n        if (!demo->DebugReportMessage) {\n            ERR_EXIT(\"GetProcAddr: Unable to find vkDebugReportMessageEXT\\n\",\n                     \"vkGetProcAddr Failure\");\n        }\n\n        VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;\n        dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;\n        dbgCreateInfo.flags =\n            VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;\n        dbgCreateInfo.pfnCallback = demo->use_break ? BreakCallback : dbgFunc;\n        dbgCreateInfo.pUserData = demo;\n        dbgCreateInfo.pNext = NULL;\n        err = demo->CreateDebugReportCallback(demo->inst, &dbgCreateInfo, NULL,\n                                              &demo->msg_callback);\n        switch (err) {\n        case VK_SUCCESS:\n            break;\n        case VK_ERROR_OUT_OF_HOST_MEMORY:\n            ERR_EXIT(\"CreateDebugReportCallback: out of host memory\\n\",\n                     \"CreateDebugReportCallback Failure\");\n            break;\n        default:\n            ERR_EXIT(\"CreateDebugReportCallback: unknown failure\\n\",\n                     \"CreateDebugReportCallback Failure\");\n            break;\n        }\n    }\n\n    // Having these GIPA queries of device extension entry points both\n    // BEFORE and AFTER vkCreateDevice is a good test for the loader\n    GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceCapabilitiesKHR);\n    GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceFormatsKHR);\n    GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfacePresentModesKHR);\n    GET_INSTANCE_PROC_ADDR(demo->inst, GetPhysicalDeviceSurfaceSupportKHR);\n\n    vkGetPhysicalDeviceProperties(demo->gpu, &demo->gpu_props);\n\n    // Query with NULL data to get count\n    vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count,\n                                             NULL);\n\n    demo->queue_props = (VkQueueFamilyProperties *)malloc(\n        demo->queue_count * sizeof(VkQueueFamilyProperties));\n    vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count,\n                                             demo->queue_props);\n    assert(demo->queue_count >= 1);\n\n    vkGetPhysicalDeviceFeatures(demo->gpu, &demo->gpu_features);\n\n    // Graphics queue and MemMgr queue can be separate.\n    // TODO: Add support for separate queues, including synchronization,\n    //       and appropriate tracking for QueueSubmit\n}\n\nstatic void demo_init_device(struct demo *demo) {\n    VkResult U_ASSERT_ONLY err;\n\n    float queue_priorities[1] = {0.0};\n    const VkDeviceQueueCreateInfo queue = {\n        .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,\n        .pNext = NULL,\n        .queueFamilyIndex = demo->graphics_queue_node_index,\n        .queueCount = 1,\n        .pQueuePriorities = queue_priorities};\n\n\n    VkPhysicalDeviceFeatures features;\n    memset(&features, 0, sizeof(features));\n    if (demo->gpu_features.shaderClipDistance) {\n        features.shaderClipDistance = VK_TRUE;\n    }\n\n    VkDeviceCreateInfo device = {\n        .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,\n        .pNext = NULL,\n        .queueCreateInfoCount = 1,\n        .pQueueCreateInfos = &queue,\n        .enabledLayerCount = 0,\n        .ppEnabledLayerNames = NULL,\n        .enabledExtensionCount = demo->enabled_extension_count,\n        .ppEnabledExtensionNames = (const char *const *)demo->extension_names,\n        .pEnabledFeatures = &features,\n    };\n\n    err = vkCreateDevice(demo->gpu, &device, NULL, &demo->device);\n    assert(!err);\n\n    GET_DEVICE_PROC_ADDR(demo->device, CreateSwapchainKHR);\n    GET_DEVICE_PROC_ADDR(demo->device, DestroySwapchainKHR);\n    GET_DEVICE_PROC_ADDR(demo->device, GetSwapchainImagesKHR);\n    GET_DEVICE_PROC_ADDR(demo->device, AcquireNextImageKHR);\n    GET_DEVICE_PROC_ADDR(demo->device, QueuePresentKHR);\n}\n\nstatic void demo_init_vk_swapchain(struct demo *demo) {\n    VkResult U_ASSERT_ONLY err;\n    uint32_t i;\n\n    // Create a WSI surface for the window:\n    glfwCreateWindowSurface(demo->inst, demo->window, NULL, &demo->surface);\n\n    // Iterate over each queue to learn whether it supports presenting:\n    VkBool32 *supportsPresent =\n        (VkBool32 *)malloc(demo->queue_count * sizeof(VkBool32));\n    for (i = 0; i < demo->queue_count; i++) {\n        demo->fpGetPhysicalDeviceSurfaceSupportKHR(demo->gpu, i, demo->surface,\n                                                   &supportsPresent[i]);\n    }\n\n    // Search for a graphics and a present queue in the array of queue\n    // families, try to find one that supports both\n    uint32_t graphicsQueueNodeIndex = UINT32_MAX;\n    uint32_t presentQueueNodeIndex = UINT32_MAX;\n    for (i = 0; i < demo->queue_count; i++) {\n        if ((demo->queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) {\n            if (graphicsQueueNodeIndex == UINT32_MAX) {\n                graphicsQueueNodeIndex = i;\n            }\n\n            if (supportsPresent[i] == VK_TRUE) {\n                graphicsQueueNodeIndex = i;\n                presentQueueNodeIndex = i;\n                break;\n            }\n        }\n    }\n    if (presentQueueNodeIndex == UINT32_MAX) {\n        // If didn't find a queue that supports both graphics and present, then\n        // find a separate present queue.\n        for (i = 0; i < demo->queue_count; ++i) {\n            if (supportsPresent[i] == VK_TRUE) {\n                presentQueueNodeIndex = i;\n                break;\n            }\n        }\n    }\n    free(supportsPresent);\n\n    // Generate error if could not find both a graphics and a present queue\n    if (graphicsQueueNodeIndex == UINT32_MAX ||\n        presentQueueNodeIndex == UINT32_MAX) {\n        ERR_EXIT(\"Could not find a graphics and a present queue\\n\",\n                 \"Swapchain Initialization Failure\");\n    }\n\n    // TODO: Add support for separate queues, including presentation,\n    //       synchronization, and appropriate tracking for QueueSubmit.\n    // NOTE: While it is possible for an application to use a separate graphics\n    //       and a present queues, this demo program assumes it is only using\n    //       one:\n    if (graphicsQueueNodeIndex != presentQueueNodeIndex) {\n        ERR_EXIT(\"Could not find a common graphics and a present queue\\n\",\n                 \"Swapchain Initialization Failure\");\n    }\n\n    demo->graphics_queue_node_index = graphicsQueueNodeIndex;\n\n    demo_init_device(demo);\n\n    vkGetDeviceQueue(demo->device, demo->graphics_queue_node_index, 0,\n                     &demo->queue);\n\n    // Get the list of VkFormat's that are supported:\n    uint32_t formatCount;\n    err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface,\n                                                     &formatCount, NULL);\n    assert(!err);\n    VkSurfaceFormatKHR *surfFormats =\n        (VkSurfaceFormatKHR *)malloc(formatCount * sizeof(VkSurfaceFormatKHR));\n    err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface,\n                                                     &formatCount, surfFormats);\n    assert(!err);\n    // If the format list includes just one entry of VK_FORMAT_UNDEFINED,\n    // the surface has no preferred format.  Otherwise, at least one\n    // supported format will be returned.\n    if (formatCount == 1 && surfFormats[0].format == VK_FORMAT_UNDEFINED) {\n        demo->format = VK_FORMAT_B8G8R8A8_UNORM;\n    } else {\n        assert(formatCount >= 1);\n        demo->format = surfFormats[0].format;\n    }\n    demo->color_space = surfFormats[0].colorSpace;\n\n    demo->curFrame = 0;\n\n    // Get Memory information and properties\n    vkGetPhysicalDeviceMemoryProperties(demo->gpu, &demo->memory_properties);\n}\n\nstatic void demo_init_connection(struct demo *demo) {\n    glfwSetErrorCallback(demo_error_callback);\n\n    if (!glfwInit()) {\n        printf(\"Cannot initialize GLFW.\\nExiting ...\\n\");\n        fflush(stdout);\n        exit(1);\n    }\n\n    if (!glfwVulkanSupported()) {\n        printf(\"GLFW failed to find the Vulkan loader.\\nExiting ...\\n\");\n        fflush(stdout);\n        exit(1);\n    }\n}\n\nstatic void demo_init(struct demo *demo, const int argc, const char *argv[])\n{\n    int i;\n    memset(demo, 0, sizeof(*demo));\n    demo->frameCount = INT32_MAX;\n\n    for (i = 1; i < argc; i++) {\n        if (strcmp(argv[i], \"--use_staging\") == 0) {\n            demo->use_staging_buffer = true;\n            continue;\n        }\n        if (strcmp(argv[i], \"--break\") == 0) {\n            demo->use_break = true;\n            continue;\n        }\n        if (strcmp(argv[i], \"--validate\") == 0) {\n            demo->validate = true;\n            continue;\n        }\n        if (strcmp(argv[i], \"--c\") == 0 && demo->frameCount == INT32_MAX &&\n            i < argc - 1 && sscanf(argv[i + 1], \"%d\", &demo->frameCount) == 1 &&\n            demo->frameCount >= 0) {\n            i++;\n            continue;\n        }\n\n        fprintf(stderr, \"Usage:\\n  %s [--use_staging] [--validate] [--break] \"\n                        \"[--c <framecount>]\\n\",\n                APP_SHORT_NAME);\n        fflush(stderr);\n        exit(1);\n    }\n\n    demo_init_connection(demo);\n    demo_init_vk(demo);\n\n    demo->width = 300;\n    demo->height = 300;\n    demo->depthStencil = 1.0;\n    demo->depthIncrement = -0.01f;\n}\n\nstatic void demo_cleanup(struct demo *demo) {\n    uint32_t i;\n\n    for (i = 0; i < demo->swapchainImageCount; i++) {\n        vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);\n    }\n    free(demo->framebuffers);\n    vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);\n\n    if (demo->setup_cmd) {\n        vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->setup_cmd);\n    }\n    vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->draw_cmd);\n    vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);\n\n    vkDestroyPipeline(demo->device, demo->pipeline, NULL);\n    vkDestroyRenderPass(demo->device, demo->render_pass, NULL);\n    vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);\n    vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);\n\n    vkDestroyBuffer(demo->device, demo->vertices.buf, NULL);\n    vkFreeMemory(demo->device, demo->vertices.mem, NULL);\n\n    for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {\n        vkDestroyImageView(demo->device, demo->textures[i].view, NULL);\n        vkDestroyImage(demo->device, demo->textures[i].image, NULL);\n        vkFreeMemory(demo->device, demo->textures[i].mem, NULL);\n        vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);\n    }\n\n    for (i = 0; i < demo->swapchainImageCount; i++) {\n        vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);\n    }\n\n    vkDestroyImageView(demo->device, demo->depth.view, NULL);\n    vkDestroyImage(demo->device, demo->depth.image, NULL);\n    vkFreeMemory(demo->device, demo->depth.mem, NULL);\n\n    demo->fpDestroySwapchainKHR(demo->device, demo->swapchain, NULL);\n    free(demo->buffers);\n\n    vkDestroyDevice(demo->device, NULL);\n    if (demo->validate) {\n        demo->DestroyDebugReportCallback(demo->inst, demo->msg_callback, NULL);\n    }\n    vkDestroySurfaceKHR(demo->inst, demo->surface, NULL);\n    vkDestroyInstance(demo->inst, NULL);\n\n    free(demo->queue_props);\n\n    glfwDestroyWindow(demo->window);\n    glfwTerminate();\n}\n\nstatic void demo_resize(struct demo *demo) {\n    uint32_t i;\n\n    // In order to properly resize the window, we must re-create the swapchain\n    // AND redo the command buffers, etc.\n    //\n    // First, perform part of the demo_cleanup() function:\n\n    for (i = 0; i < demo->swapchainImageCount; i++) {\n        vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);\n    }\n    free(demo->framebuffers);\n    vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);\n\n    if (demo->setup_cmd) {\n        vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->setup_cmd);\n    }\n    vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->draw_cmd);\n    vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);\n\n    vkDestroyPipeline(demo->device, demo->pipeline, NULL);\n    vkDestroyRenderPass(demo->device, demo->render_pass, NULL);\n    vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);\n    vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);\n\n    vkDestroyBuffer(demo->device, demo->vertices.buf, NULL);\n    vkFreeMemory(demo->device, demo->vertices.mem, NULL);\n\n    for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {\n        vkDestroyImageView(demo->device, demo->textures[i].view, NULL);\n        vkDestroyImage(demo->device, demo->textures[i].image, NULL);\n        vkFreeMemory(demo->device, demo->textures[i].mem, NULL);\n        vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);\n    }\n\n    for (i = 0; i < demo->swapchainImageCount; i++) {\n        vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);\n    }\n\n    vkDestroyImageView(demo->device, demo->depth.view, NULL);\n    vkDestroyImage(demo->device, demo->depth.image, NULL);\n    vkFreeMemory(demo->device, demo->depth.mem, NULL);\n\n    free(demo->buffers);\n\n    // Second, re-perform the demo_prepare() function, which will re-create the\n    // swapchain:\n    demo_prepare(demo);\n}\n\nint main(const int argc, const char *argv[]) {\n    struct demo demo;\n\n    demo_init(&demo, argc, argv);\n    demo_create_window(&demo);\n    demo_init_vk_swapchain(&demo);\n\n    demo_prepare(&demo);\n    demo_run(&demo);\n\n    demo_cleanup(&demo);\n\n    return validation_error;\n}\n\n"
  },
  {
    "path": "external/GLFW/tests/windows.c",
    "content": "//========================================================================\n// Simple multi-window test\n// Copyright (c) Camilla Löwy <elmindreda@glfw.org>\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//    claim that you wrote the original software. If you use this software\n//    in a product, an acknowledgment in the product documentation would\n//    be appreciated but is not required.\n//\n// 2. Altered source versions must be plainly marked as such, and must not\n//    be misrepresented as being the original software.\n//\n// 3. This notice may not be removed or altered from any source\n//    distribution.\n//\n//========================================================================\n//\n// This test creates four windows and clears each in a different color\n//\n//========================================================================\n\n#include <glad/glad.h>\n#include <GLFW/glfw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"getopt.h\"\n\nstatic const char* titles[] =\n{\n    \"Red\",\n    \"Green\",\n    \"Blue\",\n    \"Yellow\"\n};\n\nstatic const struct\n{\n    float r, g, b;\n} colors[] =\n{\n    { 0.95f, 0.32f, 0.11f },\n    { 0.50f, 0.80f, 0.16f },\n    {   0.f, 0.68f, 0.94f },\n    { 0.98f, 0.74f, 0.04f }\n};\n\nstatic void usage(void)\n{\n    printf(\"Usage: windows [-h] [-b]\\n\");\n    printf(\"Options:\\n\");\n    printf(\"  -b create decorated windows\\n\");\n    printf(\"  -h show this help\\n\");\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error: %s\\n\", description);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)\n{\n    if (action != GLFW_PRESS)\n        return;\n\n    switch (key)\n    {\n        case GLFW_KEY_SPACE:\n        {\n            int xpos, ypos;\n            glfwGetWindowPos(window, &xpos, &ypos);\n            glfwSetWindowPos(window, xpos, ypos);\n            break;\n        }\n\n        case GLFW_KEY_ESCAPE:\n            glfwSetWindowShouldClose(window, GLFW_TRUE);\n            break;\n    }\n}\n\nint main(int argc, char** argv)\n{\n    int i, ch;\n    int decorated = GLFW_FALSE;\n    int running = GLFW_TRUE;\n    GLFWwindow* windows[4];\n\n    while ((ch = getopt(argc, argv, \"bh\")) != -1)\n    {\n        switch (ch)\n        {\n            case 'b':\n                decorated = GLFW_TRUE;\n                break;\n            case 'h':\n                usage();\n                exit(EXIT_SUCCESS);\n            default:\n                usage();\n                exit(EXIT_FAILURE);\n        }\n    }\n\n    glfwSetErrorCallback(error_callback);\n\n    if (!glfwInit())\n        exit(EXIT_FAILURE);\n\n    glfwWindowHint(GLFW_DECORATED, decorated);\n    glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);\n\n    for (i = 0;  i < 4;  i++)\n    {\n        int left, top, right, bottom;\n\n        windows[i] = glfwCreateWindow(200, 200, titles[i], NULL, NULL);\n        if (!windows[i])\n        {\n            glfwTerminate();\n            exit(EXIT_FAILURE);\n        }\n\n        glfwSetKeyCallback(windows[i], key_callback);\n\n        glfwMakeContextCurrent(windows[i]);\n        gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);\n        glClearColor(colors[i].r, colors[i].g, colors[i].b, 1.f);\n\n        glfwGetWindowFrameSize(windows[i], &left, &top, &right, &bottom);\n        glfwSetWindowPos(windows[i],\n                         100 + (i & 1) * (200 + left + right),\n                         100 + (i >> 1) * (200 + top + bottom));\n    }\n\n    for (i = 0;  i < 4;  i++)\n        glfwShowWindow(windows[i]);\n\n    while (running)\n    {\n        for (i = 0;  i < 4;  i++)\n        {\n            glfwMakeContextCurrent(windows[i]);\n            glClear(GL_COLOR_BUFFER_BIT);\n            glfwSwapBuffers(windows[i]);\n\n            if (glfwWindowShouldClose(windows[i]))\n                running = GLFW_FALSE;\n        }\n\n        glfwWaitEvents();\n    }\n\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "external/glm/.appveyor.yml",
    "content": "clone_folder: c:\\dev\\glm-cmake\n\nos:\n  - Visual Studio 2013\n  - Visual Studio 2017\n\nplatform:\n  - x86\n  - x86_64\n\nbuild_script:\n- cmake --version\n- md build_pure_11\n- cd build_pure_11\n- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_LANG_EXTENSIONS=ON -DGLM_TEST_FORCE_PURE=ON ..\n- cmake -E time cmake --build . --config Debug\n- cmake -E time cmake --build . --config Release\n- cd ..\n- md build_simd_11\n- cd build_simd_11\n- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_LANG_EXTENSIONS=ON ..\n- cmake -E time cmake --build . --config Debug\n- cmake -E time cmake --build . --config Release\n- cd ..\n- md build_pure_98\n- cd build_pure_98\n- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_98=ON -DGLM_TEST_FORCE_PURE=ON ..\n- cmake -E time cmake --build . --config Debug\n- cmake -E time cmake --build . --config Release\n- cd ..\n- md build_simd_98\n- cd build_simd_98\n- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_98=ON ..\n- cmake -E time cmake --build . --config Debug\n- cmake -E time cmake --build . --config Release\n- cd ..\n"
  },
  {
    "path": "external/glm/.gitignore",
    "content": "# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic libraries\n*.so\n*.dylib\n*.dll\n\n# Fortran module files\n*.mod\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n*.lib\n\n# Executables\n*.exe\n*.out\n*.app\n\n# CMake\nCMakeCache.txt\nCMakeFiles\ncmake_install.cmake\ninstall_manifest.txt\n*.cmake\n# ^ May need to add future .cmake files as exceptions\n\n# Test logs\nTesting/*\n\n# Test input\ntest/gtc/*.dds\n\n# Project Files\nMakefile\n*.cbp\n*.user\n\n# Misc.\n*.log\n\n# local build(s)\nbuild*\n\n/.vs\n/CMakeSettings.json\n"
  },
  {
    "path": "external/glm/.travis.yml",
    "content": "language: cpp\n\nos:\n  - linux\n  - osx\n\nmatrix:\n  include:\n    - compiler: gcc\n      addons:\n        apt:\n          sources:\n            - ubuntu-toolchain-r-test\n          packages:\n            - g++-4.9\n      env: COMPILER=g++-4.9\n    - compiler: gcc\n      addons:\n        apt:\n          sources:\n            - ubuntu-toolchain-r-test\n          packages:\n            - g++-7\n      env: COMPILER=g++-7\n    - compiler: clang\n      addons:\n        apt:\n          sources:\n            - ubuntu-toolchain-r-test\n            - llvm-toolchain-precise-3.6\n          packages:\n            - clang-3.6\n      env: COMPILER=clang++-3.6\n    - compiler: clang\n      addons:\n        apt:\n          sources:\n            - llvm-toolchain-trusty-4.0\n          packages:\n            - clang-4.0\n      env: COMPILER=clang++-4.0\ncompiler:\n  - clang\n\nbefore_script: \n\nscript:\n- cmake --version\n- mkdir ./build_pure_11\n- cd ./build_pure_11\n- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Release -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_11=ON -DGLM_TEST_FORCE_PURE=ON ..\n- cmake -E time cmake --build .\n- ctest\n- cd ..\n- mkdir ./build_pure_98\n- cd ./build_pure_98\n- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Release -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_98=ON -DGLM_TEST_FORCE_PURE=ON ..\n- cmake --build .\n- ctest\n- cd ..\n- mkdir ./build_pure_11_debug\n- cd ./build_pure_11_debug\n- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Debug -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_11=ON -DGLM_TEST_FORCE_PURE=ON ..\n- cmake -E time cmake --build .\n- ctest\n- cd ..\n- mkdir ./build_pure_98_debug\n- cd ./build_pure_98_debug\n- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Debug -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_98=ON -DGLM_TEST_FORCE_PURE=ON ..\n- cmake -E time cmake --build .\n- ctest\n- cd ..\n- mkdir ./build_simd_11\n- cd ./build_simd_11\n- if [[ $TRAVIS_OS_NAME == 'osx' ]]; then cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Release -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_11=ON -DGLM_TEST_ENABLE_SIMD_SSE3=ON ..; else cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Release -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_11=ON -DGLM_TEST_ENABLE_SIMD_AVX=ON ..; fi\n- cmake -E time cmake --build .\n- ctest\n- cd ..\n- mkdir ./build_simd_98\n- cd ./build_simd_98\n- if [[ $TRAVIS_OS_NAME == 'osx' ]]; then cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Release -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_98=ON -DGLM_TEST_ENABLE_SIMD_SSE3=ON ..; else cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Release -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_98=ON -DGLM_TEST_ENABLE_SIMD_AVX=ON ..; fi\n- cmake -E time cmake --build .\n- ctest\n- cd ..\n- mkdir ./build_simd_11_debug\n- cd ./build_simd_11_debug\n- if [[ $TRAVIS_OS_NAME == 'osx' ]]; then cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Debug -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_11=ON -DGLM_TEST_ENABLE_SIMD_SSE3=ON ..; else cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Debug -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_11=ON -DGLM_TEST_ENABLE_SIMD_AVX=ON ..; fi\n- cmake -E time cmake --build .\n- ctest\n- cd ..\n- mkdir ./build_simd_98_debug\n- cd ./build_simd_98_debug\n- if [[ $TRAVIS_OS_NAME == 'osx' ]]; then cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Debug -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_98=ON -DGLM_TEST_ENABLE_SIMD_SSE3=ON ..; else cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_BUILD_TYPE=Debug -DGLM_TEST_ENABLE=ON -DGLM_TEST_ENABLE_CXX_98=ON -DGLM_TEST_ENABLE_SIMD_AVX=ON ..; fi\n- cmake -E time cmake --build .\n- ctest\n- cd ..\n\n\n\n\n"
  },
  {
    "path": "external/glm/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.2 FATAL_ERROR)\ncmake_policy(VERSION 3.2)\n\nset(GLM_VERSION \"0.9.9\")\nproject(glm VERSION ${GLM_VERSION} LANGUAGES CXX)\n\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake\")\n\ninclude(GNUInstallDirs)\ninclude(CMakePackageConfigHelpers)\n\nenable_testing()\n\noption(GLM_STATIC_LIBRARY_ENABLE \"GLM static library\" OFF)\nif(GLM_STATIC_LIBRARY_ENABLE)\n\tmessage(STATUS \"GLM is a header only library, no need to build it. Set the option GLM_STATIC_LIBRARY_ENABLE with ON to build an optional static library\")\nendif()\n\noption(GLM_DYNAMIC_LIBRARY_ENABLE \"GLM dynamic library\" OFF)\nif(GLM_DYNAMIC_LIBRARY_ENABLE)\n\tmessage(STATUS \"GLM is a header only library, no need to build it. Set the option GLM_DYNAMIC_LIBRARY_ENABLE with ON to build an optional dynamic library\")\nendif()\n\noption(GLM_TEST_ENABLE \"GLM test\" OFF)\nif(NOT GLM_TEST_ENABLE)\n\tmessage(STATUS \"GLM is a header only library, no need to build it. Set the option GLM_TEST_ENABLE with ON to build and run the test bench\")\nendif()\n\noption(GLM_TEST_ENABLE_CXX_98 \"Enable C++ 98\" OFF)\noption(GLM_TEST_ENABLE_CXX_11 \"Enable C++ 11\" OFF)\noption(GLM_TEST_ENABLE_CXX_14 \"Enable C++ 14\" OFF)\noption(GLM_TEST_ENABLE_CXX_17 \"Enable C++ 17\" OFF)\n\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\nif(GLM_TEST_ENABLE_CXX_17)\n\tset(CMAKE_CXX_STANDARD 17)\n\tmessage(STATUS \"GLM: Build with C++17 features\")\n\nelseif(GLM_TEST_ENABLE_CXX_14)\n\tset(CMAKE_CXX_STANDARD 14)\n\tmessage(STATUS \"GLM: Build with C++14 features\")\n\nelseif(GLM_TEST_ENABLE_CXX_11)\n\tset(CMAKE_CXX_STANDARD 11)\n\tmessage(STATUS \"GLM: Build with C++11 features\")\n\nelseif(GLM_TEST_ENABLE_CXX_98)\n\tset(CMAKE_CXX_STANDARD 98)\n\tmessage(STATUS \"GLM: Build with C++98 features\")\nendif()\n\noption(GLM_TEST_ENABLE_LANG_EXTENSIONS \"Enable language extensions\" OFF)\n\nif(GLM_TEST_ENABLE_LANG_EXTENSIONS)\n\tset(CMAKE_CXX_EXTENSIONS ON)\n\n\tmessage(STATUS \"GLM: Build with C++ language extensions\")\nelse()\n\tset(CMAKE_CXX_EXTENSIONS OFF)\nendif()\n\noption(GLM_TEST_ENABLE_FAST_MATH \"Enable fast math optimizations\" OFF)\nif(GLM_TEST_ENABLE_FAST_MATH)\n\tmessage(STATUS \"GLM: Build with fast math optimizations\")\n\n\tif((CMAKE_CXX_COMPILER_ID MATCHES \"Clang\") OR (CMAKE_CXX_COMPILER_ID MATCHES \"GNU\"))\n\t\tadd_compile_options(-ffast-math)\n\n\telseif(CMAKE_CXX_COMPILER_ID MATCHES \"MSVC\")\n\t\tadd_compile_options(/fp:fast)\n\tendif()\nelse()\n\tif(CMAKE_CXX_COMPILER_ID MATCHES \"MSVC\")\n\t\tadd_compile_options(/fp:precise)\n\tendif()\nendif()\n\noption(GLM_TEST_ENABLE_SIMD_SSE2 \"Enable SSE2 optimizations\" OFF)\noption(GLM_TEST_ENABLE_SIMD_SSE3 \"Enable SSE3 optimizations\" OFF)\noption(GLM_TEST_ENABLE_SIMD_AVX \"Enable AVX optimizations\" OFF)\noption(GLM_TEST_ENABLE_SIMD_AVX2 \"Enable AVX2 optimizations\" OFF)\noption(GLM_TEST_FORCE_PURE \"Force 'pure' instructions\" OFF)\n\nif(GLM_TEST_FORCE_PURE)\n\tadd_definitions(-DGLM_FORCE_PURE)\n\n\tif(CMAKE_CXX_COMPILER_ID MATCHES \"GNU\")\n\t\tadd_compile_options(-mfpmath=387)\n\tendif()\n\tmessage(STATUS \"GLM: No SIMD instruction set\")\n\nelseif(GLM_TEST_ENABLE_SIMD_AVX2)\n\tif((CMAKE_CXX_COMPILER_ID MATCHES \"GNU\") OR (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\"))\n\t\tadd_compile_options(-mavx2)\n\telseif(CMAKE_CXX_COMPILER_ID MATCHES \"Intel\")\n\t\tadd_compile_options(/QxAVX2)\n\telseif(CMAKE_CXX_COMPILER_ID MATCHES \"MSVC\")\n\t\tadd_compile_options(/arch:AVX2)\n\tendif()\n\tmessage(STATUS \"GLM: AVX2 instruction set\")\n\nelseif(GLM_TEST_ENABLE_SIMD_AVX)\n\tif((CMAKE_CXX_COMPILER_ID MATCHES \"GNU\") OR (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\"))\n\t\tadd_compile_options(-mavx)\n\telseif(CMAKE_CXX_COMPILER_ID MATCHES \"Intel\")\n\t\tadd_compile_options(/QxAVX)\n\telseif(CMAKE_CXX_COMPILER_ID MATCHES \"MSVC\")\n\t\tadd_compile_options(/arch:AVX)\n\tendif()\n\tmessage(STATUS \"GLM: AVX instruction set\")\n\nelseif(GLM_TEST_ENABLE_SIMD_SSE3)\n\tif((CMAKE_CXX_COMPILER_ID MATCHES \"GNU\") OR (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\"))\n\t\tadd_compile_options(-msse3)\n\telseif(CMAKE_CXX_COMPILER_ID MATCHES \"Intel\")\n\t\tadd_compile_options(/QxSSE3)\n\telseif((CMAKE_CXX_COMPILER_ID MATCHES \"MSVC\") AND NOT CMAKE_CL_64)\n\t\tadd_compile_options(/arch:SSE2) # VC doesn't support /arch:SSE3\n\tendif()\n\tmessage(STATUS \"GLM: SSE3 instruction set\")\n\nelseif(GLM_TEST_ENABLE_SIMD_SSE2)\n\tif((CMAKE_CXX_COMPILER_ID MATCHES \"GNU\") OR (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\"))\n\t\tadd_compile_options(-msse2)\n\telseif(CMAKE_CXX_COMPILER_ID MATCHES \"Intel\")\n\t\tadd_compile_options(/QxSSE2)\n\telseif((CMAKE_CXX_COMPILER_ID MATCHES \"MSVC\") AND NOT CMAKE_CL_64)\n\t\tadd_compile_options(/arch:SSE2)\n\tendif()\n\tmessage(STATUS \"GLM: SSE2 instruction set\")\nendif()\n\n# Compiler and default options\n\nif(CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n\tmessage(\"GLM: Clang - ${CMAKE_CXX_COMPILER_ID} compiler\")\n\n\tadd_compile_options(-Werror -Weverything)\n\tadd_compile_options(-Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-c++11-long-long -Wno-padded -Wno-gnu-anonymous-struct -Wno-nested-anon-types)\n\tadd_compile_options(-Wno-undefined-reinterpret-cast -Wno-sign-conversion -Wno-unused-variable -Wno-missing-prototypes -Wno-unreachable-code -Wno-missing-variable-declarations -Wno-sign-compare -Wno-global-constructors -Wno-unused-macros -Wno-format-nonliteral)\n\nelseif(CMAKE_CXX_COMPILER_ID MATCHES \"GNU\")\n\tmessage(\"GLM: GCC - ${CMAKE_CXX_COMPILER_ID} compiler\")\n\n\tadd_compile_options(-O2)\n\tadd_compile_options(-Wno-long-long)\n\nelseif(CMAKE_CXX_COMPILER_ID MATCHES \"Intel\")\n\tmessage(\"GLM: Intel - ${CMAKE_CXX_COMPILER_ID} compiler\")\n\nelseif(CMAKE_CXX_COMPILER_ID MATCHES \"MSVC\")\n\tmessage(\"GLM: Visual C++ - ${CMAKE_CXX_COMPILER_ID} compiler\")\n\n\tadd_compile_options(/FAs /W4 /WX)\n\tadd_compile_options(/wd4309 /wd4324 /wd4389 /wd4127 /wd4267 /wd4146 /wd4201 /wd4464 /wd4514 /wd4701 /wd4820 /wd4365)\n\tadd_definitions(-D_CRT_SECURE_NO_WARNINGS)\nendif()\n\ninclude_directories(\"${PROJECT_SOURCE_DIR}\")\n\nadd_subdirectory(glm)\nadd_subdirectory(test)\n\noption(GLM_INSTALL_ENABLE \"GLM install\" ON)\n\nset(GLM_INSTALL_CONFIGDIR \"${CMAKE_INSTALL_LIBDIR}/cmake/glm\")\nif (GLM_INSTALL_ENABLE)\n\tinstall(DIRECTORY glm DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})\nendif()\n\nwrite_basic_package_version_file(\"${CMAKE_CURRENT_BINARY_DIR}/glmConfigVersion.cmake\" VERSION ${GLM_VERSION} COMPATIBILITY AnyNewerVersion)\n\n# build tree package config\nconfigure_file(cmake/glmBuildConfig.cmake.in glmConfig.cmake @ONLY)\n\n# install tree package config\nconfigure_package_config_file(\n\tcmake/glmConfig.cmake.in\n\t${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake\n\tINSTALL_DESTINATION ${GLM_INSTALL_CONFIGDIR}\n\tPATH_VARS CMAKE_INSTALL_INCLUDEDIR\n\tNO_CHECK_REQUIRED_COMPONENTS_MACRO)\n\nif(GLM_INSTALL_ENABLE)\n\tinstall(FILES\n\t\t\"${CMAKE_CURRENT_BINARY_DIR}/${GLM_INSTALL_CONFIGDIR}/glmConfig.cmake\"\n\t\t\"${CMAKE_CURRENT_BINARY_DIR}/glmConfigVersion.cmake\"\n\t\tDESTINATION ${GLM_INSTALL_CONFIGDIR})\nendif()\n\nadd_library(glm INTERFACE)\ntarget_include_directories(glm INTERFACE\n\t$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>\n\t$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)\ninstall(TARGETS glm EXPORT glmTargets)\n\nexport(EXPORT glmTargets FILE \"${CMAKE_CURRENT_BINARY_DIR}/glmTargets.cmake\")\n\nif(GLM_INSTALL_ENABLE)\n\tinstall(EXPORT glmTargets FILE glmTargets.cmake DESTINATION ${GLM_INSTALL_CONFIGDIR})\nendif()\n\n# build pkg-config file\nconfigure_file(\"./cmake/glm.pc.in\" \"glm.pc\" @ONLY)\n\n# install pkg-config file\nif (GLM_INSTALL_ENABLE)\n\tinstall(FILES \"${CMAKE_CURRENT_BINARY_DIR}/glm.pc\" DESTINATION \"${CMAKE_INSTALL_LIBDIR}/pkgconfig\")\nendif()\n\nexport(PACKAGE glm)\n\nif(NOT TARGET uninstall)\n\tconfigure_file(\n\t\t${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in\n\t\t${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake\n\t\tIMMEDIATE @ONLY)\n\n\tadd_custom_target(uninstall\n\t\tCOMMAND ${CMAKE_COMMAND} -P\n\t\t${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)\nendif()\n"
  },
  {
    "path": "external/glm/cmake/glm.pc.in",
    "content": "prefix=@CMAKE_INSTALL_PREFIX@\nincludedir=${prefix}/include\n\nName: GLM\nDescription: OpenGL Mathematics\nVersion: @GLM_VERSION@\nCflags: -I${includedir}\n"
  },
  {
    "path": "external/glm/cmake/glmBuildConfig.cmake.in",
    "content": "set(GLM_VERSION \"@GLM_VERSION@\")\nset(GLM_INCLUDE_DIRS \"@CMAKE_CURRENT_SOURCE_DIR@\")\n\nif (NOT CMAKE_VERSION VERSION_LESS \"3.0\")\n    include(\"${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake\")\nendif()\n"
  },
  {
    "path": "external/glm/cmake/glmConfig.cmake.in",
    "content": "set(GLM_VERSION \"@GLM_VERSION@\")\n\n@PACKAGE_INIT@\n\nset_and_check(GLM_INCLUDE_DIRS \"@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@\")\n\nif (NOT CMAKE_VERSION VERSION_LESS \"3.0\")\n    include(\"${CMAKE_CURRENT_LIST_DIR}/glmTargets.cmake\")\nendif()\n"
  },
  {
    "path": "external/glm/cmake_uninstall.cmake.in",
    "content": "if(NOT EXISTS \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\")\n  message(FATAL_ERROR \"Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\")\nendif(NOT EXISTS \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\")\n\nif (NOT DEFINED CMAKE_INSTALL_PREFIX)\n  set (CMAKE_INSTALL_PREFIX \"@CMAKE_INSTALL_PREFIX@\")\nendif ()\n message(${CMAKE_INSTALL_PREFIX})\n\nfile(READ \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\" files)\nstring(REGEX REPLACE \"\\n\" \";\" files \"${files}\")\nforeach(file ${files})\n  message(STATUS \"Uninstalling $ENV{DESTDIR}${file}\")\n  if(IS_SYMLINK \"$ENV{DESTDIR}${file}\" OR EXISTS \"$ENV{DESTDIR}${file}\")\n    exec_program(\n      \"@CMAKE_COMMAND@\" ARGS \"-E remove \\\"$ENV{DESTDIR}${file}\\\"\"\n      OUTPUT_VARIABLE rm_out\n      RETURN_VALUE rm_retval\n      )\n    if(NOT \"${rm_retval}\" STREQUAL 0)\n      message(FATAL_ERROR \"Problem when removing $ENV{DESTDIR}${file}\")\n    endif(NOT \"${rm_retval}\" STREQUAL 0)\n  else(IS_SYMLINK \"$ENV{DESTDIR}${file}\" OR EXISTS \"$ENV{DESTDIR}${file}\")\n    message(STATUS \"File $ENV{DESTDIR}${file} does not exist.\")\n  endif(IS_SYMLINK \"$ENV{DESTDIR}${file}\" OR EXISTS \"$ENV{DESTDIR}${file}\")\nendforeach(file)\n"
  },
  {
    "path": "external/glm/doc/api/a00001.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _features.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_features.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00001_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00001_source.html\">_features.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00001_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _features.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_features.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00001.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"comment\">// #define GLM_CXX98_EXCEPTIONS</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"comment\">// #define GLM_CXX98_RTTI</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;</div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"comment\">// #define GLM_CXX11_RVALUE_REFERENCES</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"comment\">// Rvalue references - GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"comment\">// GLM_CXX11_TRAILING_RETURN</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"comment\">// Rvalue references for *this - GCC not supported</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"comment\">// GLM_CXX11_NONSTATIC_MEMBER_INIT</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"comment\">// Initialization of class objects by rvalues - GCC any</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"comment\">// GLM_CXX11_NONSTATIC_MEMBER_INIT</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"comment\">// Non-static data member initializers - GCC 4.7</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"comment\">// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"comment\">// #define GLM_CXX11_VARIADIC_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"comment\">// Variadic templates - GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"comment\">// Extending variadic template template parameters - GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"comment\">// #define GLM_CXX11_GENERALIZED_INITIALIZERS</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"comment\">// Initializer lists - GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"comment\">// #define GLM_CXX11_STATIC_ASSERT </span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"comment\">// Static assertions - GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"comment\">// #define GLM_CXX11_AUTO_TYPE</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"comment\">// auto-typed variables - GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"comment\">// #define GLM_CXX11_AUTO_TYPE</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;<span class=\"comment\">// Multi-declarator auto - GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1737.pdf</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"comment\">// #define GLM_CXX11_AUTO_TYPE</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"comment\">// Removal of auto as a storage-class specifier - GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"comment\">// #define GLM_CXX11_AUTO_TYPE</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"comment\">// New function declarator syntax - GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"comment\">// #define GLM_CXX11_LAMBDAS</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;<span class=\"comment\">// New wording for C++0x lambdas - GCC 4.5</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"comment\">// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"comment\">// #define GLM_CXX11_DECLTYPE</span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;<span class=\"comment\">// Declared type of an expression - GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"comment\">// Right angle brackets - GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;<span class=\"comment\">// Default template arguments for function templates    DR226   GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226</span></div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;<span class=\"comment\">// Solving the SFINAE problem for expressions   DR339   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;<span class=\"comment\">// #define GLM_CXX11_ALIAS_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;<span class=\"comment\">// Template aliases     N2258   GCC 4.7</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;<span class=\"comment\">// Extern templates     N1987   Yes</span></div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;<span class=\"comment\">// #define GLM_CXX11_NULLPTR</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;<span class=\"comment\">// Null pointer constant        N2431   GCC 4.6</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;<span class=\"comment\">// #define GLM_CXX11_STRONG_ENUMS</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;<span class=\"comment\">// Strongly-typed enums N2347   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf</span></div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;<span class=\"comment\">// Forward declarations for enums       N2764   GCC 4.6</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf</span></div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"comment\">// Generalized attributes       N2761   GCC 4.8</span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;<span class=\"comment\">// Generalized constant expressions     N2235   GCC 4.6</span></div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;<span class=\"comment\">// Alignment support    N2341   GCC 4.8</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;<span class=\"comment\">// #define GLM_CXX11_DELEGATING_CONSTRUCTORS</span></div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;<span class=\"comment\">// Delegating constructors      N1986   GCC 4.7</span></div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf</span></div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;<span class=\"comment\">// Inheriting constructors      N2540   GCC 4.8</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;<span class=\"comment\">// #define GLM_CXX11_EXPLICIT_CONVERSIONS</span></div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;<span class=\"comment\">// Explicit conversion operators        N2437   GCC 4.5</span></div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;<span class=\"comment\">// New character types  N2249   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html</span></div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;<span class=\"comment\">// Unicode string literals      N2442   GCC 4.5</span></div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm</span></div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;<span class=\"comment\">// Raw string literals  N2442   GCC 4.5</span></div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm</span></div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;<span class=\"comment\">// Universal character name literals    N2170   GCC 4.5</span></div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html</span></div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;<span class=\"comment\">// #define GLM_CXX11_USER_LITERALS</span></div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;<span class=\"comment\">// User-defined literals                N2765   GCC 4.7</span></div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf</span></div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;<span class=\"comment\">// Standard Layout Types        N2342   GCC 4.5</span></div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm</span></div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;<span class=\"comment\">// #define GLM_CXX11_DEFAULTED_FUNCTIONS</span></div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;<span class=\"comment\">// #define GLM_CXX11_DELETED_FUNCTIONS</span></div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;<span class=\"comment\">// Defaulted and deleted functions      N2346   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm</span></div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;<span class=\"comment\">// Extended friend declarations N1791   GCC 4.7</span></div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf</span></div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;<span class=\"comment\">// Extending sizeof     N2253   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html</span></div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;<span class=\"comment\">// #define GLM_CXX11_INLINE_NAMESPACES</span></div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;<span class=\"comment\">// Inline namespaces    N2535   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;<span class=\"comment\">// #define GLM_CXX11_UNRESTRICTED_UNIONS</span></div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;<span class=\"comment\">// Unrestricted unions  N2544   GCC 4.6</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf</span></div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;<span class=\"comment\">// #define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS</span></div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;<span class=\"comment\">// Local and unnamed types as template arguments        N2657   GCC 4.5</span></div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm</span></div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;<span class=\"comment\">// #define GLM_CXX11_RANGE_FOR</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;<span class=\"comment\">// Range-based for      N2930   GCC 4.6</span></div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;<span class=\"comment\">// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html</span></div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;<span class=\"comment\">// #define GLM_CXX11_OVERRIDE_CONTROL</span></div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;<span class=\"comment\">// Explicit virtual overrides   N2928 N3206 N3272       GCC 4.7</span></div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;<span class=\"comment\">// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm</span></div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm</span></div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm</span></div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;<span class=\"comment\">// Minimal support for garbage collection and reachability-based leak detection N2670   No</span></div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm</span></div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;<span class=\"comment\">// #define GLM_CXX11_NOEXCEPT</span></div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;<span class=\"comment\">// Allowing move constructors to throw [noexcept]       N3050   GCC 4.6 (core language only)</span></div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html</span></div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;<span class=\"comment\">// Defining move special member functions       N3053   GCC 4.6</span></div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html</span></div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;<span class=\"comment\">// Sequence points      N2239   Yes</span></div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html</span></div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;<span class=\"comment\">// Atomic operations    N2427   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html</span></div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;<span class=\"comment\">// Strong Compare and Exchange  N2748   GCC 4.5</span></div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html</span></div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;<span class=\"comment\">// Bidirectional Fences N2752   GCC 4.8</span></div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm</span></div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;<span class=\"comment\">// Memory model N2429   GCC 4.8</span></div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm</span></div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;<span class=\"comment\">// Data-dependency ordering: atomics and memory model   N2664   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm</span></div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;<span class=\"comment\">// Propagating exceptions       N2179   GCC 4.4</span></div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html</span></div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;<span class=\"comment\">// Abandoning a process and at_quick_exit       N2440   GCC 4.8</span></div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm</span></div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;<span class=\"comment\">// Allow atomics use in signal handlers N2547   Yes</span></div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm</span></div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;<span class=\"comment\">// Thread-local storage N2659   GCC 4.8</span></div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm</span></div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;<span class=\"comment\">// Dynamic initialization and destruction with concurrency      N2660   GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm</span></div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;<span class=\"comment\">// __func__ predefined identifier       N2340   GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm</span></div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;<span class=\"comment\">// C99 preprocessor     N1653   GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm</span></div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;<span class=\"comment\">// long long    N1811   GCC 4.3</span></div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf</span></div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;<span class=\"comment\">// </span></div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;<span class=\"comment\">// Extended integral types      N1988   Yes</span></div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;<span class=\"comment\">// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf</span></div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;<span class=\"preprocessor\">#if(GLM_COMPILER &amp; GLM_COMPILER_GCC)</span></div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;</div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;<span class=\"preprocessor\">#       define GLM_CXX11_STATIC_ASSERT</span></div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;<span class=\"preprocessor\">#elif(GLM_COMPILER &amp; GLM_COMPILER_CLANG)</span></div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_exceptions))</span></div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX98_EXCEPTIONS</span></div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_rtti))</span></div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX98_RTTI</span></div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_access_control_sfinae))</span></div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_ACCESS_CONTROL_SFINAE</span></div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_alias_templates))</span></div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_ALIAS_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_alignas))</span></div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_ALIGNAS</span></div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_attributes))</span></div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_ATTRIBUTES</span></div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_constexpr))</span></div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_CONSTEXPR</span></div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_decltype))</span></div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_DECLTYPE</span></div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_default_function_template_args))</span></div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS</span></div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_defaulted_functions))</span></div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_DEFAULTED_FUNCTIONS</span></div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_delegating_constructors))</span></div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_DELEGATING_CONSTRUCTORS</span></div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;</div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_deleted_functions))</span></div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_DELETED_FUNCTIONS</span></div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_explicit_conversions))</span></div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_EXPLICIT_CONVERSIONS</span></div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;</div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_generalized_initializers))</span></div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_GENERALIZED_INITIALIZERS</span></div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;</div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_implicit_moves))</span></div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_IMPLICIT_MOVES</span></div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_inheriting_constructors))</span></div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_INHERITING_CONSTRUCTORS</span></div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;</div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_inline_namespaces))</span></div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_INLINE_NAMESPACES</span></div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;</div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_lambdas))</span></div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_LAMBDAS</span></div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_local_type_template_args))</span></div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS</span></div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_noexcept))</span></div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_NOEXCEPT</span></div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_nonstatic_member_init))</span></div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_NONSTATIC_MEMBER_INIT</span></div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_nullptr))</span></div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_NULLPTR</span></div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_override_control))</span></div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_OVERRIDE_CONTROL</span></div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_reference_qualified_functions))</span></div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_REFERENCE_QUALIFIED_FUNCTIONS</span></div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_range_for))</span></div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_RANGE_FOR</span></div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_raw_string_literals))</span></div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_RAW_STRING_LITERALS</span></div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_rvalue_references))</span></div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_RVALUE_REFERENCES</span></div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_static_assert))</span></div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_STATIC_ASSERT</span></div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;</div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_auto_type))</span></div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_AUTO_TYPE</span></div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;</div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_strong_enums))</span></div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_STRONG_ENUMS</span></div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_trailing_return))</span></div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_TRAILING_RETURN</span></div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_unicode_literals))</span></div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_UNICODE_LITERALS</span></div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;</div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_unrestricted_unions))</span></div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_UNRESTRICTED_UNIONS</span></div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_user_literals))</span></div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_USER_LITERALS</span></div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;</div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;<span class=\"preprocessor\">#       if(__has_feature(cxx_variadic_templates))</span></div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;<span class=\"preprocessor\">#               define GLM_CXX11_VARIADIC_TEMPLATES</span></div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;</div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;<span class=\"preprocessor\">#endif//(GLM_COMPILER &amp; GLM_COMPILER_CLANG)</span></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00002.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _fixes.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_fixes.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00002_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00002_source.html\">_fixes.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00002_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _fixes.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_fixes.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00002.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &lt;cmath&gt;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#ifdef max</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#undef max</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#ifdef min</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#undef min</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#ifdef isnan</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#undef isnan</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#ifdef isinf</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#undef isinf</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#ifdef log2</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#undef log2</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00003.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _noise.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_noise.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00003_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00003_source.html\">_noise.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00003_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _noise.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_noise.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00003.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;../common.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        GLM_FUNC_QUALIFIER T mod289(T <span class=\"keyword\">const</span>&amp; x)</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;                <span class=\"keywordflow\">return</span> x - <a class=\"code\" href=\"a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d\">floor</a>(x * (static_cast&lt;T&gt;(1.0) / static_cast&lt;T&gt;(289.0))) * <span class=\"keyword\">static_cast&lt;</span>T<span class=\"keyword\">&gt;</span>(289.0);</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;        GLM_FUNC_QUALIFIER T permute(T <span class=\"keyword\">const</span>&amp; x)</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;                <span class=\"keywordflow\">return</span> mod289(((x * static_cast&lt;T&gt;(34)) + static_cast&lt;T&gt;(1)) * x);</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;2, T, Q&gt; permute(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; x)</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;                <span class=\"keywordflow\">return</span> mod289(((x * static_cast&lt;T&gt;(34)) + static_cast&lt;T&gt;(1)) * x);</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;3, T, Q&gt; permute(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x)</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                <span class=\"keywordflow\">return</span> mod289(((x * static_cast&lt;T&gt;(34)) + static_cast&lt;T&gt;(1)) * x);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;4, T, Q&gt; permute(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; x)</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                <span class=\"keywordflow\">return</span> mod289(((x * static_cast&lt;T&gt;(34)) + static_cast&lt;T&gt;(1)) * x);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_QUALIFIER T taylorInvSqrt(T <span class=\"keyword\">const</span>&amp; r)</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                <span class=\"keywordflow\">return</span> T(1.79284291400159) - T(0.85373472095314) * r;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;2, T, Q&gt; taylorInvSqrt(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; r)</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                <span class=\"keywordflow\">return</span> T(1.79284291400159) - T(0.85373472095314) * r;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;3, T, Q&gt; taylorInvSqrt(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; r)</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                <span class=\"keywordflow\">return</span> T(1.79284291400159) - T(0.85373472095314) * r;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;4, T, Q&gt; taylorInvSqrt(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; r)</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                <span class=\"keywordflow\">return</span> T(1.79284291400159) - T(0.85373472095314) * r;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;2, T, Q&gt; fade(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; t)</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                <span class=\"keywordflow\">return</span> (t * t * t) * (t * (t * T(6) - T(15)) + T(10));</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;3, T, Q&gt; fade(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; t)</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                <span class=\"keywordflow\">return</span> (t * t * t) * (t * (t * T(6) - T(15)) + T(10));</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        GLM_FUNC_QUALIFIER vec&lt;4, T, Q&gt; fade(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; t)</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                <span class=\"keywordflow\">return</span> (t * t * t) * (t * (t * T(6) - T(15)) + T(10));</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00140_html_gaa9d0742639e85b29c7c5de11cfd6840d\"><div class=\"ttname\"><a href=\"a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d\">glm::floor</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; floor(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a value equal to the nearest integer that is less then or equal to x. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00004.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _swizzle.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_swizzle.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00004_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00004_source.html\">_swizzle.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00004_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _swizzle.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_swizzle.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00004.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;        <span class=\"comment\">// Internal class for implementing swizzle operators</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keywordtype\">int</span> N&gt;</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;        <span class=\"keyword\">struct </span>_swizzle_base0</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;        <span class=\"keyword\">protected</span>:</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;                GLM_FUNC_QUALIFIER T&amp; elem(<span class=\"keywordtype\">size_t</span> i){ <span class=\"keywordflow\">return</span> (reinterpret_cast&lt;T*&gt;(_buffer))[i]; }</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;                GLM_FUNC_QUALIFIER T <span class=\"keyword\">const</span>&amp; elem(<span class=\"keywordtype\">size_t</span> i)<span class=\"keyword\"> const</span>{ <span class=\"keywordflow\">return</span> (reinterpret_cast&lt;const T*&gt;(_buffer))[i]; }</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;                <span class=\"comment\">// Use an opaque buffer to *ensure* the compiler doesn&#39;t call a constructor.</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"comment\">// The size 1 buffer is assumed to aligned to the actual members so that the</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"comment\">// elem() </span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keywordtype\">char</span>    _buffer[1];</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> N, <span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2, <span class=\"keywordtype\">int</span> E3, <span class=\"keywordtype\">bool</span> Aligned&gt;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">struct </span>_swizzle_base1 : <span class=\"keyword\">public</span> _swizzle_base0&lt;T, N&gt;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">bool</span> Aligned&gt;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;        <span class=\"keyword\">struct </span>_swizzle_base1&lt;2, T, Q, E0,E1,-1,-2, Aligned&gt; : <span class=\"keyword\">public</span> _swizzle_base0&lt;T, 2&gt;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                GLM_FUNC_QUALIFIER vec&lt;2, T, Q&gt; operator ()()<span class=\"keyword\">  const </span>{ <span class=\"keywordflow\">return</span> vec&lt;2, T, Q&gt;(this-&gt;elem(E0), this-&gt;elem(E1)); }</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2, <span class=\"keywordtype\">bool</span> Aligned&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">struct </span>_swizzle_base1&lt;3, T, Q, E0,E1,E2,-1, Aligned&gt; : <span class=\"keyword\">public</span> _swizzle_base0&lt;T, 3&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                GLM_FUNC_QUALIFIER vec&lt;3, T, Q&gt; operator ()()<span class=\"keyword\">  const </span>{ <span class=\"keywordflow\">return</span> vec&lt;3, T, Q&gt;(this-&gt;elem(E0), this-&gt;elem(E1), this-&gt;elem(E2)); }</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2, <span class=\"keywordtype\">int</span> E3, <span class=\"keywordtype\">bool</span> Aligned&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">struct </span>_swizzle_base1&lt;4, T, Q, E0,E1,E2,E3, Aligned&gt; : <span class=\"keyword\">public</span> _swizzle_base0&lt;T, 4&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        { </div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_QUALIFIER vec&lt;4, T, Q&gt; operator ()()<span class=\"keyword\">  const </span>{ <span class=\"keywordflow\">return</span> vec&lt;4, T, Q&gt;(this-&gt;elem(E0), this-&gt;elem(E1), this-&gt;elem(E2), this-&gt;elem(E3)); }</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"comment\">// Internal class for implementing swizzle operators</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        <span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"comment\">                Template parameters:</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"comment\">                T                       = type of scalar values (e.g. float, double)</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"comment\">                N                       = number of components in the vector (e.g. 3)</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"comment\">                E0...3          = what index the n-th element of this swizzle refers to in the unswizzled vec</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"comment\">                DUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used to specialize swizzles</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"comment\">                        containing duplicate elements so that they cannot be used as r-values).            </span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"comment\">        */</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> N, <span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2, <span class=\"keywordtype\">int</span> E3, <span class=\"keywordtype\">int</span> DUPLICATE_ELEMENTS&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">struct </span>_swizzle_base2 : <span class=\"keyword\">public</span> _swizzle_base1&lt;N, T, Q, E0,E1,E2,E3, detail::is_aligned&lt;Q&gt;::value&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                GLM_FUNC_QUALIFIER _swizzle_base2&amp; operator= (<span class=\"keyword\">const</span> T&amp; t)</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                        <span class=\"keywordflow\">for</span> (<span class=\"keywordtype\">int</span> i = 0; i &lt; N; ++i)</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                                (*<span class=\"keyword\">this</span>)[i] = t;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                        <span class=\"keywordflow\">return</span> *<span class=\"keyword\">this</span>;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                GLM_FUNC_QUALIFIER _swizzle_base2&amp; operator= (vec&lt;N, T, Q&gt; <span class=\"keyword\">const</span>&amp; that)</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                        <span class=\"keyword\">struct </span>op { </div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator() (T&amp; <a class=\"code\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>, T&amp; t) { e = t; } </div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                        _apply_op(that, op());</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                        <span class=\"keywordflow\">return</span> *<span class=\"keyword\">this</span>;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator -= (vec&lt;N, T, Q&gt; <span class=\"keyword\">const</span>&amp; that)</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                        <span class=\"keyword\">struct </span>op { </div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator() (T&amp; <a class=\"code\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>, T&amp; t) { e -= t; } </div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                        _apply_op(that, op());</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator += (vec&lt;N, T, Q&gt; <span class=\"keyword\">const</span>&amp; that)</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                        <span class=\"keyword\">struct </span>op { </div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator() (T&amp; <a class=\"code\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>, T&amp; t) { e += t; } </div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                        _apply_op(that, op());</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator *= (vec&lt;N, T, Q&gt; <span class=\"keyword\">const</span>&amp; that)</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                        <span class=\"keyword\">struct </span>op { </div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator() (T&amp; <a class=\"code\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>, T&amp; t) { e *= t; } </div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                        _apply_op(that, op());</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator /= (vec&lt;N, T, Q&gt; <span class=\"keyword\">const</span>&amp; that)</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                        <span class=\"keyword\">struct </span>op { </div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> operator() (T&amp; <a class=\"code\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>, T&amp; t) { e /= t; } </div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                        _apply_op(that, op());</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                GLM_FUNC_QUALIFIER T&amp; operator[](<span class=\"keywordtype\">size_t</span> i)</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                        <span class=\"keyword\">const</span> <span class=\"keywordtype\">int</span> offset_dst[4] = { E0, E1, E2, E3 };</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                        <span class=\"keywordflow\">return</span> this-&gt;elem(offset_dst[i]);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                GLM_FUNC_QUALIFIER T operator[](<span class=\"keywordtype\">size_t</span> i)<span class=\"keyword\"> const</span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;<span class=\"keyword\">                </span>{</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;                        <span class=\"keyword\">const</span> <span class=\"keywordtype\">int</span> offset_dst[4] = { E0, E1, E2, E3 };</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                        <span class=\"keywordflow\">return</span> this-&gt;elem(offset_dst[i]);</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"keyword\">protected</span>:</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keywordtype\">void</span> _apply_op(vec&lt;N, T, Q&gt; <span class=\"keyword\">const</span>&amp; that, U op)</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;                        <span class=\"comment\">// Make a copy of the data in this == &amp;that.</span></div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;                        <span class=\"comment\">// The copier should optimize out the copy in cases where the function is</span></div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                        <span class=\"comment\">// properly inlined and the copy is not necessary.</span></div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                        T t[N];</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                        <span class=\"keywordflow\">for</span> (<span class=\"keywordtype\">int</span> i = 0; i &lt; N; ++i)</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                                t[i] = that[i];</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                        <span class=\"keywordflow\">for</span> (<span class=\"keywordtype\">int</span> i = 0; i &lt; N; ++i)</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;                                op( (*<span class=\"keyword\">this</span>)[i], t[i] );</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        <span class=\"comment\">// Specialization for swizzles containing duplicate elements.  These cannot be modified.</span></div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> N, <span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2, <span class=\"keywordtype\">int</span> E3&gt;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        <span class=\"keyword\">struct </span>_swizzle_base2&lt;N, T, Q, E0,E1,E2,E3, 1&gt; : <span class=\"keyword\">public</span> _swizzle_base1&lt;N, T, Q, E0,E1,E2,E3, detail::is_aligned&lt;Q&gt;::value&gt;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;                <span class=\"keyword\">struct </span>Stub {};</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                GLM_FUNC_QUALIFIER _swizzle_base2&amp; operator= (Stub <span class=\"keyword\">const</span>&amp;) { <span class=\"keywordflow\">return</span> *<span class=\"keyword\">this</span>; }</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;                GLM_FUNC_QUALIFIER T operator[]  (<span class=\"keywordtype\">size_t</span> i)<span class=\"keyword\"> const</span></div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;<span class=\"keyword\">                </span>{</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                        <span class=\"keyword\">const</span> <span class=\"keywordtype\">int</span> offset_dst[4] = { E0, E1, E2, E3 };</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;                        <span class=\"keywordflow\">return</span> this-&gt;elem(offset_dst[i]);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> N, <span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2, <span class=\"keywordtype\">int</span> E3&gt;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        <span class=\"keyword\">struct </span>_swizzle : <span class=\"keyword\">public</span> _swizzle_base2&lt;N, T, Q, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;                <span class=\"keyword\">typedef</span> _swizzle_base2&lt;N, T, Q, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)&gt; base_type;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;                <span class=\"keyword\">using</span> base_type::operator=;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">operator</span> vec&lt;N, T, Q&gt; () <span class=\"keyword\">const</span> { <span class=\"keywordflow\">return</span> (*<span class=\"keyword\">this</span>)(); }</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;<span class=\"comment\">// To prevent the C++ syntax from getting entirely overwhelming, define some alias macros</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_TEMPLATE1   template&lt;int N, typename T, qualifier Q, int E0, int E1, int E2, int E3&gt;</span></div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_TEMPLATE2   template&lt;int N, typename T, qualifier Q, int E0, int E1, int E2, int E3, int F0, int F1, int F2, int F3&gt;</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_TYPE1       _swizzle&lt;N, T, Q, E0, E1, E2, E3&gt;</span></div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_TYPE2       _swizzle&lt;N, T, Q, F0, F1, F2, F3&gt;</span></div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;<span class=\"comment\">// Wrapper for a binary operator (e.g. u.yy + v.zy)</span></div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND)                 \\</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE2                                                          \\</span></div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER vec&lt;N, T, Q&gt; operator OPERAND ( const GLM_SWIZZLE_TYPE1&amp; a, const GLM_SWIZZLE_TYPE2&amp; b)  \\</span></div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;<span class=\"preprocessor\">        {                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;<span class=\"preprocessor\">                return a() OPERAND b();                                                     \\</span></div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;<span class=\"preprocessor\">        }                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                          \\</span></div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER vec&lt;N, T, Q&gt; operator OPERAND ( const GLM_SWIZZLE_TYPE1&amp; a, const vec&lt;N, T, Q&gt;&amp; b)                   \\</span></div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;<span class=\"preprocessor\">        {                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;<span class=\"preprocessor\">                return a() OPERAND b;                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;<span class=\"preprocessor\">        }                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                          \\</span></div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER vec&lt;N, T, Q&gt; operator OPERAND ( const vec&lt;N, T, Q&gt;&amp; a, const GLM_SWIZZLE_TYPE1&amp; b)                   \\</span></div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;<span class=\"preprocessor\">        {                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;<span class=\"preprocessor\">                return a OPERAND b();                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;<span class=\"comment\">// Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz)</span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND)                 \\</span></div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                          \\</span></div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER vec&lt;N, T, Q&gt; operator OPERAND ( const GLM_SWIZZLE_TYPE1&amp; a, const T&amp; b)                   \\</span></div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;<span class=\"preprocessor\">        {                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;<span class=\"preprocessor\">                return a() OPERAND b;                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;<span class=\"preprocessor\">        }                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                          \\</span></div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER vec&lt;N, T, Q&gt; operator OPERAND ( const T&amp; a, const GLM_SWIZZLE_TYPE1&amp; b)                   \\</span></div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;<span class=\"preprocessor\">        {                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;<span class=\"preprocessor\">                return a OPERAND b();                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;<span class=\"comment\">// Macro for wrapping a function taking one argument (e.g. abs())</span></div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION)                          \\</span></div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                          \\</span></div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1&amp; a)  \\</span></div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;<span class=\"preprocessor\">        {                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a());                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;<span class=\"comment\">// Macro for wrapping a function taking two vector arguments (e.g. dot()).</span></div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION)                                                      \\</span></div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE2                                                                                      \\</span></div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1&amp; a, const GLM_SWIZZLE_TYPE2&amp; b) \\</span></div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;<span class=\"preprocessor\">        {                                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a(), b());                                                                              \\</span></div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;<span class=\"preprocessor\">        }                                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                                                      \\</span></div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1&amp; a, const GLM_SWIZZLE_TYPE1&amp; b) \\</span></div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;<span class=\"preprocessor\">        {                                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a(), b());                                                                              \\</span></div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;<span class=\"preprocessor\">        }                                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                                                      \\</span></div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1&amp; a, const typename V&amp; b)         \\</span></div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;<span class=\"preprocessor\">        {                                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a(), b);                                                                                \\</span></div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;<span class=\"preprocessor\">        }                                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                                                      \\</span></div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V&amp; a, const GLM_SWIZZLE_TYPE1&amp; b)                  \\</span></div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;<span class=\"preprocessor\">        {                                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a, b());                                                                                \\</span></div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;<span class=\"preprocessor\">        } </span></div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;<span class=\"comment\">// Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g. mix()).</span></div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION)                                                             \\</span></div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE2                                                                                                    \\</span></div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1&amp; a, const GLM_SWIZZLE_TYPE2&amp; b, const T&amp; c)   \\</span></div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;<span class=\"preprocessor\">        {                                                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a(), b(), c);                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;<span class=\"preprocessor\">        }                                                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                                                                    \\</span></div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1&amp; a, const GLM_SWIZZLE_TYPE1&amp; b, const T&amp; c)   \\</span></div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;<span class=\"preprocessor\">        {                                                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a(), b(), c);                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;<span class=\"preprocessor\">        }                                                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                                                                    \\</span></div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1&amp; a, const typename S0::vec_type&amp; b, const T&amp; c)\\</span></div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;<span class=\"preprocessor\">        {                                                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a(), b, c);                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;<span class=\"preprocessor\">        }                                                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_TEMPLATE1                                                                                                    \\</span></div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;<span class=\"preprocessor\">        GLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V&amp; a, const GLM_SWIZZLE_TYPE1&amp; b, const T&amp; c)           \\</span></div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;<span class=\"preprocessor\">        {                                                                                                                         \\</span></div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;<span class=\"preprocessor\">                return FUNCTION(a, b(), c);                                                                                           \\</span></div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;<span class=\"preprocessor\">        } </span></div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160; </div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;}<span class=\"comment\">//namespace detail </span></div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;        <span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;                GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-)</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;                GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*)</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;                GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+)</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;                GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-)</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;                GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*)</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;                GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/)</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;        <span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        <span class=\"comment\">// Swizzles are distinct types from the unswizzled type.  The below macros will</span></div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;        <span class=\"comment\">// provide template specializations for the swizzle types for the given functions</span></div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;        <span class=\"comment\">// so that the compiler does not have any ambiguity to choosing how to handle</span></div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        <span class=\"comment\">// the function.</span></div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;        <span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;        <span class=\"comment\">// The alternative is to use the operator()() when calling the function in order</span></div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;        <span class=\"comment\">// to explicitly convert the swizzled type to the unswizzled type.</span></div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;        <span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;</div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    abs);</span></div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    acos);</span></div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    acosh);</span></div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    all);</span></div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    any);</span></div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_2_ARGS(value_type,  dot);</span></div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type,    cross);</span></div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type,    step);    </span></div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;        <span class=\"comment\">//GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix);</span></div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;}</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE2_2_MEMBERS(T, Q, E0,E1) \\</span></div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2, T, Q, 0,0,-1,-2&gt; E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2, T, Q, 0,1,-1,-2&gt; E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2, T, Q, 1,0,-1,-2&gt; E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2, T, Q, 1,1,-1,-2&gt; E1 ## E1; }; </span></div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE2_3_MEMBERS(T, Q, E0,E1) \\</span></div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3,T, Q, 0,0,0,-1&gt; E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3,T, Q, 0,0,1,-1&gt; E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3,T, Q, 0,1,0,-1&gt; E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3,T, Q, 0,1,1,-1&gt; E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3,T, Q, 1,0,0,-1&gt; E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3,T, Q, 1,0,1,-1&gt; E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3,T, Q, 1,1,0,-1&gt; E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3,T, Q, 1,1,1,-1&gt; E1 ## E1 ## E1; };  </span></div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE2_4_MEMBERS(T, Q, E0,E1) \\</span></div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,0,0&gt; E0 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,0,1&gt; E0 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,1,0&gt; E0 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,1,1&gt; E0 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,0,0&gt; E0 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,0,1&gt; E0 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,1,0&gt; E0 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,1,1&gt; E0 ## E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,0,0&gt; E1 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,0,1&gt; E1 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,1,0&gt; E1 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,1,1&gt; E1 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,0,0&gt; E1 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,0,1&gt; E1 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,1,0&gt; E1 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,1,1&gt; E1 ## E1 ## E1 ## E1; };</span></div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE3_2_MEMBERS(T, Q, E0,E1,E2) \\</span></div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 0,0,-1,-2&gt; E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 0,1,-1,-2&gt; E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 0,2,-1,-2&gt; E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 1,0,-1,-2&gt; E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 1,1,-1,-2&gt; E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 1,2,-1,-2&gt; E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 2,0,-1,-2&gt; E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 2,1,-1,-2&gt; E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 2,2,-1,-2&gt; E2 ## E2; };</span></div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE3_3_MEMBERS(T, Q ,E0,E1,E2) \\</span></div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,0,0,-1&gt; E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,0,1,-1&gt; E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,0,2,-1&gt; E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,1,0,-1&gt; E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,1,1,-1&gt; E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,1,2,-1&gt; E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,2,0,-1&gt; E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,2,1,-1&gt; E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,2,2,-1&gt; E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,0,0,-1&gt; E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,0,1,-1&gt; E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,0,2,-1&gt; E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,1,0,-1&gt; E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,1,1,-1&gt; E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,1,2,-1&gt; E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,2,0,-1&gt; E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,2,1,-1&gt; E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,2,2,-1&gt; E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,0,0,-1&gt; E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,0,1,-1&gt; E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,0,2,-1&gt; E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,1,0,-1&gt; E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,1,1,-1&gt; E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,1,2,-1&gt; E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,2,0,-1&gt; E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,2,1,-1&gt; E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,2,2,-1&gt; E2 ## E2 ## E2; };</span></div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;</div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE3_4_MEMBERS(T, Q, E0,E1,E2) \\</span></div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,0,0&gt; E0 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,0,1&gt; E0 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,0,2&gt; E0 ## E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,1,0&gt; E0 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,1,1&gt; E0 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,1,2&gt; E0 ## E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,2,0&gt; E0 ## E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,2,1&gt; E0 ## E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,0,2,2&gt; E0 ## E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,0,0&gt; E0 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,0,1&gt; E0 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,0,2&gt; E0 ## E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,1,0&gt; E0 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,1,1&gt; E0 ## E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,1,2&gt; E0 ## E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,2,0&gt; E0 ## E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,2,1&gt; E0 ## E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,1,2,2&gt; E0 ## E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,0,0&gt; E0 ## E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,0,1&gt; E0 ## E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,0,2&gt; E0 ## E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,1,0&gt; E0 ## E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,1,1&gt; E0 ## E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,1,2&gt; E0 ## E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,2,0&gt; E0 ## E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,2,1&gt; E0 ## E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 0,2,2,2&gt; E0 ## E2 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,0,0&gt; E1 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,0,1&gt; E1 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,0,2&gt; E1 ## E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,1,0&gt; E1 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,1,1&gt; E1 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,1,2&gt; E1 ## E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,2,0&gt; E1 ## E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,2,1&gt; E1 ## E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,0,2,2&gt; E1 ## E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,0,0&gt; E1 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,0,1&gt; E1 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,0,2&gt; E1 ## E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,1,0&gt; E1 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,1,1&gt; E1 ## E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,1,2&gt; E1 ## E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,2,0&gt; E1 ## E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,2,1&gt; E1 ## E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,1,2,2&gt; E1 ## E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,0,0&gt; E1 ## E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,0,1&gt; E1 ## E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,0,2&gt; E1 ## E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,1,0&gt; E1 ## E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,1,1&gt; E1 ## E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,1,2&gt; E1 ## E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,2,0&gt; E1 ## E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,2,1&gt; E1 ## E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 1,2,2,2&gt; E1 ## E2 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,0,0&gt; E2 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,0,1&gt; E2 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,0,2&gt; E2 ## E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,1,0&gt; E2 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,1,1&gt; E2 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,1,2&gt; E2 ## E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,2,0&gt; E2 ## E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,2,1&gt; E2 ## E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,0,2,2&gt; E2 ## E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,0,0&gt; E2 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,0,1&gt; E2 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\">  439</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,0,2&gt; E2 ## E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,1,0&gt; E2 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,1,1&gt; E2 ## E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,1,2&gt; E2 ## E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\">  443</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,2,0&gt; E2 ## E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,2,1&gt; E2 ## E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,1,2,2&gt; E2 ## E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,0,0&gt; E2 ## E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,0,1&gt; E2 ## E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,0,2&gt; E2 ## E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,1,0&gt; E2 ## E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,1,1&gt; E2 ## E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,1,2&gt; E2 ## E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,2,0&gt; E2 ## E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,2,1&gt; E2 ## E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4,T, Q, 2,2,2,2&gt; E2 ## E2 ## E2 ## E2; }; </span></div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;</div>\n<div class=\"line\"><a name=\"l00456\"></a><span class=\"lineno\">  456</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE4_2_MEMBERS(T, Q, E0,E1,E2,E3) \\</span></div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\">  457</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 0,0,-1,-2&gt; E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 0,1,-1,-2&gt; E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 0,2,-1,-2&gt; E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 0,3,-1,-2&gt; E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00461\"></a><span class=\"lineno\">  461</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 1,0,-1,-2&gt; E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\">  462</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 1,1,-1,-2&gt; E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 1,2,-1,-2&gt; E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 1,3,-1,-2&gt; E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00465\"></a><span class=\"lineno\">  465</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 2,0,-1,-2&gt; E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00466\"></a><span class=\"lineno\">  466</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 2,1,-1,-2&gt; E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\">  467</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 2,2,-1,-2&gt; E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 2,3,-1,-2&gt; E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 3,0,-1,-2&gt; E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 3,1,-1,-2&gt; E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\">  471</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 3,2,-1,-2&gt; E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;2,T, Q, 3,3,-1,-2&gt; E3 ## E3; }; </span></div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;</div>\n<div class=\"line\"><a name=\"l00474\"></a><span class=\"lineno\">  474</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE4_3_MEMBERS(T, Q, E0,E1,E2,E3) \\</span></div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\">  475</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,0,0,-1&gt; E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,0,1,-1&gt; E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00477\"></a><span class=\"lineno\">  477</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,0,2,-1&gt; E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\">  478</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,0,3,-1&gt; E0 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,1,0,-1&gt; E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,1,1,-1&gt; E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,1,2,-1&gt; E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,1,3,-1&gt; E0 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00483\"></a><span class=\"lineno\">  483</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,2,0,-1&gt; E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\">  484</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,2,1,-1&gt; E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,2,2,-1&gt; E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00486\"></a><span class=\"lineno\">  486</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,2,3,-1&gt; E0 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00487\"></a><span class=\"lineno\">  487</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,3,0,-1&gt; E0 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00488\"></a><span class=\"lineno\">  488</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,3,1,-1&gt; E0 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\">  489</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,3,2,-1&gt; E0 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 0,3,3,-1&gt; E0 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,0,0,-1&gt; E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,0,1,-1&gt; E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00493\"></a><span class=\"lineno\">  493</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,0,2,-1&gt; E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00494\"></a><span class=\"lineno\">  494</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,0,3,-1&gt; E1 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,1,0,-1&gt; E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,1,1,-1&gt; E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\">  497</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,1,2,-1&gt; E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,1,3,-1&gt; E1 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,2,0,-1&gt; E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00500\"></a><span class=\"lineno\">  500</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,2,1,-1&gt; E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,2,2,-1&gt; E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,2,3,-1&gt; E1 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,3,0,-1&gt; E1 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,3,1,-1&gt; E1 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,3,2,-1&gt; E1 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 1,3,3,-1&gt; E1 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00507\"></a><span class=\"lineno\">  507</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,0,0,-1&gt; E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00508\"></a><span class=\"lineno\">  508</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,0,1,-1&gt; E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,0,2,-1&gt; E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00510\"></a><span class=\"lineno\">  510</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,0,3,-1&gt; E2 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00511\"></a><span class=\"lineno\">  511</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,1,0,-1&gt; E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,1,1,-1&gt; E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,1,2,-1&gt; E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\">  514</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,1,3,-1&gt; E2 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,2,0,-1&gt; E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00516\"></a><span class=\"lineno\">  516</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,2,1,-1&gt; E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\">  517</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,2,2,-1&gt; E2 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,2,3,-1&gt; E2 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,3,0,-1&gt; E2 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\">  520</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,3,1,-1&gt; E2 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\">  521</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,3,2,-1&gt; E2 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 2,3,3,-1&gt; E2 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\">  523</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,0,0,-1&gt; E3 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00524\"></a><span class=\"lineno\">  524</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,0,1,-1&gt; E3 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00525\"></a><span class=\"lineno\">  525</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,0,2,-1&gt; E3 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,0,3,-1&gt; E3 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,1,0,-1&gt; E3 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00528\"></a><span class=\"lineno\">  528</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,1,1,-1&gt; E3 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,1,2,-1&gt; E3 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,1,3,-1&gt; E3 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,2,0,-1&gt; E3 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,2,1,-1&gt; E3 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\">  533</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,2,2,-1&gt; E3 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,2,3,-1&gt; E3 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,3,0,-1&gt; E3 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00536\"></a><span class=\"lineno\">  536</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,3,1,-1&gt; E3 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00537\"></a><span class=\"lineno\">  537</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,3,2,-1&gt; E3 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00538\"></a><span class=\"lineno\">  538</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;3, T, Q, 3,3,3,-1&gt; E3 ## E3 ## E3; };  </span></div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;</div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE4_4_MEMBERS(T, Q, E0,E1,E2,E3) \\</span></div>\n<div class=\"line\"><a name=\"l00541\"></a><span class=\"lineno\">  541</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,0,0&gt; E0 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00542\"></a><span class=\"lineno\">  542</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,0,1&gt; E0 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,0,2&gt; E0 ## E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,0,3&gt; E0 ## E0 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00545\"></a><span class=\"lineno\">  545</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,1,0&gt; E0 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00546\"></a><span class=\"lineno\">  546</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,1,1&gt; E0 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,1,2&gt; E0 ## E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,1,3&gt; E0 ## E0 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\">  549</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,2,0&gt; E0 ## E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\">  550</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,2,1&gt; E0 ## E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,2,2&gt; E0 ## E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,2,3&gt; E0 ## E0 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,3,0&gt; E0 ## E0 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00554\"></a><span class=\"lineno\">  554</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,3,1&gt; E0 ## E0 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00555\"></a><span class=\"lineno\">  555</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,3,2&gt; E0 ## E0 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,0,3,3&gt; E0 ## E0 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,0,0&gt; E0 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00558\"></a><span class=\"lineno\">  558</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,0,1&gt; E0 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00559\"></a><span class=\"lineno\">  559</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,0,2&gt; E0 ## E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,0,3&gt; E0 ## E1 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,1,0&gt; E0 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00562\"></a><span class=\"lineno\">  562</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,1,1&gt; E0 ## E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00563\"></a><span class=\"lineno\">  563</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,1,2&gt; E0 ## E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,1,3&gt; E0 ## E1 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,2,0&gt; E0 ## E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00566\"></a><span class=\"lineno\">  566</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,2,1&gt; E0 ## E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00567\"></a><span class=\"lineno\">  567</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,2,2&gt; E0 ## E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,2,3&gt; E0 ## E1 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,3,0&gt; E0 ## E1 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,3,1&gt; E0 ## E1 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00571\"></a><span class=\"lineno\">  571</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,3,2&gt; E0 ## E1 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00572\"></a><span class=\"lineno\">  572</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,1,3,3&gt; E0 ## E1 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,0,0&gt; E0 ## E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,0,1&gt; E0 ## E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00575\"></a><span class=\"lineno\">  575</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,0,2&gt; E0 ## E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00576\"></a><span class=\"lineno\">  576</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,0,3&gt; E0 ## E2 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,1,0&gt; E0 ## E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,1,1&gt; E0 ## E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00579\"></a><span class=\"lineno\">  579</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,1,2&gt; E0 ## E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00580\"></a><span class=\"lineno\">  580</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,1,3&gt; E0 ## E2 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,2,0&gt; E0 ## E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,2,1&gt; E0 ## E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00583\"></a><span class=\"lineno\">  583</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,2,2&gt; E0 ## E2 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00584\"></a><span class=\"lineno\">  584</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,2,3&gt; E0 ## E2 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00585\"></a><span class=\"lineno\">  585</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,3,0&gt; E0 ## E2 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\">  586</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,3,1&gt; E0 ## E2 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00587\"></a><span class=\"lineno\">  587</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,3,2&gt; E0 ## E2 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00588\"></a><span class=\"lineno\">  588</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,2,3,3&gt; E0 ## E2 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\">  589</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,0,0&gt; E0 ## E3 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,0,1&gt; E0 ## E3 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00591\"></a><span class=\"lineno\">  591</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,0,2&gt; E0 ## E3 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00592\"></a><span class=\"lineno\">  592</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,0,3&gt; E0 ## E3 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,1,0&gt; E0 ## E3 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,1,1&gt; E0 ## E3 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\">  595</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,1,2&gt; E0 ## E3 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00596\"></a><span class=\"lineno\">  596</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,1,3&gt; E0 ## E3 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00597\"></a><span class=\"lineno\">  597</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,2,0&gt; E0 ## E3 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\">  598</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,2,1&gt; E0 ## E3 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,2,2&gt; E0 ## E3 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,2,3&gt; E0 ## E3 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00601\"></a><span class=\"lineno\">  601</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,3,0&gt; E0 ## E3 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,3,1&gt; E0 ## E3 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00603\"></a><span class=\"lineno\">  603</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,3,2&gt; E0 ## E3 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00604\"></a><span class=\"lineno\">  604</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 0,3,3,3&gt; E0 ## E3 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00605\"></a><span class=\"lineno\">  605</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,0,0&gt; E1 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00606\"></a><span class=\"lineno\">  606</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,0,1&gt; E1 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00607\"></a><span class=\"lineno\">  607</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,0,2&gt; E1 ## E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,0,3&gt; E1 ## E0 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00609\"></a><span class=\"lineno\">  609</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,1,0&gt; E1 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00610\"></a><span class=\"lineno\">  610</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,1,1&gt; E1 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00611\"></a><span class=\"lineno\">  611</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,1,2&gt; E1 ## E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00612\"></a><span class=\"lineno\">  612</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,1,3&gt; E1 ## E0 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00613\"></a><span class=\"lineno\">  613</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,2,0&gt; E1 ## E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00614\"></a><span class=\"lineno\">  614</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,2,1&gt; E1 ## E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00615\"></a><span class=\"lineno\">  615</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,2,2&gt; E1 ## E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,2,3&gt; E1 ## E0 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00617\"></a><span class=\"lineno\">  617</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,3,0&gt; E1 ## E0 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00618\"></a><span class=\"lineno\">  618</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,3,1&gt; E1 ## E0 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00619\"></a><span class=\"lineno\">  619</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,3,2&gt; E1 ## E0 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,0,3,3&gt; E1 ## E0 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00621\"></a><span class=\"lineno\">  621</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,0,0&gt; E1 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00622\"></a><span class=\"lineno\">  622</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,0,1&gt; E1 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00623\"></a><span class=\"lineno\">  623</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,0,2&gt; E1 ## E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00624\"></a><span class=\"lineno\">  624</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,0,3&gt; E1 ## E1 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00625\"></a><span class=\"lineno\">  625</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,1,0&gt; E1 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00626\"></a><span class=\"lineno\">  626</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,1,1&gt; E1 ## E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00627\"></a><span class=\"lineno\">  627</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,1,2&gt; E1 ## E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00628\"></a><span class=\"lineno\">  628</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,1,3&gt; E1 ## E1 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00629\"></a><span class=\"lineno\">  629</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,2,0&gt; E1 ## E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00630\"></a><span class=\"lineno\">  630</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,2,1&gt; E1 ## E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00631\"></a><span class=\"lineno\">  631</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,2,2&gt; E1 ## E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,2,3&gt; E1 ## E1 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00633\"></a><span class=\"lineno\">  633</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,3,0&gt; E1 ## E1 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00634\"></a><span class=\"lineno\">  634</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,3,1&gt; E1 ## E1 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00635\"></a><span class=\"lineno\">  635</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,3,2&gt; E1 ## E1 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00636\"></a><span class=\"lineno\">  636</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,1,3,3&gt; E1 ## E1 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,0,0&gt; E1 ## E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00638\"></a><span class=\"lineno\">  638</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,0,1&gt; E1 ## E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00639\"></a><span class=\"lineno\">  639</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,0,2&gt; E1 ## E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00640\"></a><span class=\"lineno\">  640</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,0,3&gt; E1 ## E2 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00641\"></a><span class=\"lineno\">  641</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,1,0&gt; E1 ## E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00642\"></a><span class=\"lineno\">  642</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,1,1&gt; E1 ## E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00643\"></a><span class=\"lineno\">  643</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,1,2&gt; E1 ## E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00644\"></a><span class=\"lineno\">  644</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,1,3&gt; E1 ## E2 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,2,0&gt; E1 ## E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00646\"></a><span class=\"lineno\">  646</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,2,1&gt; E1 ## E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00647\"></a><span class=\"lineno\">  647</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,2,2&gt; E1 ## E2 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00648\"></a><span class=\"lineno\">  648</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,2,3&gt; E1 ## E2 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00649\"></a><span class=\"lineno\">  649</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,3,0&gt; E1 ## E2 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00650\"></a><span class=\"lineno\">  650</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,3,1&gt; E1 ## E2 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00651\"></a><span class=\"lineno\">  651</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,3,2&gt; E1 ## E2 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00652\"></a><span class=\"lineno\">  652</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,2,3,3&gt; E1 ## E2 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00653\"></a><span class=\"lineno\">  653</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,0,0&gt; E1 ## E3 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,0,1&gt; E1 ## E3 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00655\"></a><span class=\"lineno\">  655</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,0,2&gt; E1 ## E3 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00656\"></a><span class=\"lineno\">  656</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,0,3&gt; E1 ## E3 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00657\"></a><span class=\"lineno\">  657</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,1,0&gt; E1 ## E3 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00658\"></a><span class=\"lineno\">  658</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,1,1&gt; E1 ## E3 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00659\"></a><span class=\"lineno\">  659</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,1,2&gt; E1 ## E3 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00660\"></a><span class=\"lineno\">  660</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,1,3&gt; E1 ## E3 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00661\"></a><span class=\"lineno\">  661</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,2,0&gt; E1 ## E3 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,2,1&gt; E1 ## E3 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00663\"></a><span class=\"lineno\">  663</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,2,2&gt; E1 ## E3 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00664\"></a><span class=\"lineno\">  664</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,2,3&gt; E1 ## E3 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00665\"></a><span class=\"lineno\">  665</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,3,0&gt; E1 ## E3 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00666\"></a><span class=\"lineno\">  666</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,3,1&gt; E1 ## E3 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00667\"></a><span class=\"lineno\">  667</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,3,2&gt; E1 ## E3 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00668\"></a><span class=\"lineno\">  668</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 1,3,3,3&gt; E1 ## E3 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00669\"></a><span class=\"lineno\">  669</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,0,0&gt; E2 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00670\"></a><span class=\"lineno\">  670</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,0,1&gt; E2 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\">  671</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,0,2&gt; E2 ## E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00672\"></a><span class=\"lineno\">  672</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,0,3&gt; E2 ## E0 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00673\"></a><span class=\"lineno\">  673</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,1,0&gt; E2 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00674\"></a><span class=\"lineno\">  674</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,1,1&gt; E2 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,1,2&gt; E2 ## E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00676\"></a><span class=\"lineno\">  676</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,1,3&gt; E2 ## E0 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00677\"></a><span class=\"lineno\">  677</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,2,0&gt; E2 ## E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00678\"></a><span class=\"lineno\">  678</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,2,1&gt; E2 ## E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00679\"></a><span class=\"lineno\">  679</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,2,2&gt; E2 ## E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,2,3&gt; E2 ## E0 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,3,0&gt; E2 ## E0 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00682\"></a><span class=\"lineno\">  682</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,3,1&gt; E2 ## E0 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00683\"></a><span class=\"lineno\">  683</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,3,2&gt; E2 ## E0 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00684\"></a><span class=\"lineno\">  684</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,0,3,3&gt; E2 ## E0 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00685\"></a><span class=\"lineno\">  685</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,0,0&gt; E2 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00686\"></a><span class=\"lineno\">  686</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,0,1&gt; E2 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00687\"></a><span class=\"lineno\">  687</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,0,2&gt; E2 ## E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00688\"></a><span class=\"lineno\">  688</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,0,3&gt; E2 ## E1 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00689\"></a><span class=\"lineno\">  689</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,1,0&gt; E2 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00690\"></a><span class=\"lineno\">  690</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,1,1&gt; E2 ## E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00691\"></a><span class=\"lineno\">  691</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,1,2&gt; E2 ## E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\">  692</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,1,3&gt; E2 ## E1 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00693\"></a><span class=\"lineno\">  693</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,2,0&gt; E2 ## E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00694\"></a><span class=\"lineno\">  694</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,2,1&gt; E2 ## E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00695\"></a><span class=\"lineno\">  695</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,2,2&gt; E2 ## E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00696\"></a><span class=\"lineno\">  696</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,2,3&gt; E2 ## E1 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00697\"></a><span class=\"lineno\">  697</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,3,0&gt; E2 ## E1 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00698\"></a><span class=\"lineno\">  698</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,3,1&gt; E2 ## E1 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00699\"></a><span class=\"lineno\">  699</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,3,2&gt; E2 ## E1 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00700\"></a><span class=\"lineno\">  700</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,1,3,3&gt; E2 ## E1 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00701\"></a><span class=\"lineno\">  701</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,0,0&gt; E2 ## E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00702\"></a><span class=\"lineno\">  702</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,0,1&gt; E2 ## E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00703\"></a><span class=\"lineno\">  703</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,0,2&gt; E2 ## E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00704\"></a><span class=\"lineno\">  704</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,0,3&gt; E2 ## E2 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00705\"></a><span class=\"lineno\">  705</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,1,0&gt; E2 ## E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00706\"></a><span class=\"lineno\">  706</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,1,1&gt; E2 ## E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00707\"></a><span class=\"lineno\">  707</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,1,2&gt; E2 ## E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00708\"></a><span class=\"lineno\">  708</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,1,3&gt; E2 ## E2 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00709\"></a><span class=\"lineno\">  709</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,2,0&gt; E2 ## E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00710\"></a><span class=\"lineno\">  710</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,2,1&gt; E2 ## E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00711\"></a><span class=\"lineno\">  711</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,2,2&gt; E2 ## E2 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00712\"></a><span class=\"lineno\">  712</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,2,3&gt; E2 ## E2 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00713\"></a><span class=\"lineno\">  713</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,3,0&gt; E2 ## E2 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00714\"></a><span class=\"lineno\">  714</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,3,1&gt; E2 ## E2 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00715\"></a><span class=\"lineno\">  715</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,3,2&gt; E2 ## E2 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00716\"></a><span class=\"lineno\">  716</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,2,3,3&gt; E2 ## E2 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00717\"></a><span class=\"lineno\">  717</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,0,0&gt; E2 ## E3 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00718\"></a><span class=\"lineno\">  718</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,0,1&gt; E2 ## E3 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00719\"></a><span class=\"lineno\">  719</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,0,2&gt; E2 ## E3 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00720\"></a><span class=\"lineno\">  720</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,0,3&gt; E2 ## E3 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00721\"></a><span class=\"lineno\">  721</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,1,0&gt; E2 ## E3 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00722\"></a><span class=\"lineno\">  722</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,1,1&gt; E2 ## E3 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00723\"></a><span class=\"lineno\">  723</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,1,2&gt; E2 ## E3 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00724\"></a><span class=\"lineno\">  724</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,1,3&gt; E2 ## E3 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00725\"></a><span class=\"lineno\">  725</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,2,0&gt; E2 ## E3 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00726\"></a><span class=\"lineno\">  726</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,2,1&gt; E2 ## E3 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,2,2&gt; E2 ## E3 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00728\"></a><span class=\"lineno\">  728</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,2,3&gt; E2 ## E3 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00729\"></a><span class=\"lineno\">  729</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,3,0&gt; E2 ## E3 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00730\"></a><span class=\"lineno\">  730</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,3,1&gt; E2 ## E3 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00731\"></a><span class=\"lineno\">  731</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,3,2&gt; E2 ## E3 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00732\"></a><span class=\"lineno\">  732</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 2,3,3,3&gt; E2 ## E3 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00733\"></a><span class=\"lineno\">  733</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,0,0&gt; E3 ## E0 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00734\"></a><span class=\"lineno\">  734</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,0,1&gt; E3 ## E0 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00735\"></a><span class=\"lineno\">  735</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,0,2&gt; E3 ## E0 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00736\"></a><span class=\"lineno\">  736</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,0,3&gt; E3 ## E0 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00737\"></a><span class=\"lineno\">  737</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,1,0&gt; E3 ## E0 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00738\"></a><span class=\"lineno\">  738</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,1,1&gt; E3 ## E0 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00739\"></a><span class=\"lineno\">  739</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,1,2&gt; E3 ## E0 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00740\"></a><span class=\"lineno\">  740</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,1,3&gt; E3 ## E0 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00741\"></a><span class=\"lineno\">  741</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,2,0&gt; E3 ## E0 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00742\"></a><span class=\"lineno\">  742</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,2,1&gt; E3 ## E0 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00743\"></a><span class=\"lineno\">  743</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,2,2&gt; E3 ## E0 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00744\"></a><span class=\"lineno\">  744</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,2,3&gt; E3 ## E0 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00745\"></a><span class=\"lineno\">  745</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,3,0&gt; E3 ## E0 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00746\"></a><span class=\"lineno\">  746</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,3,1&gt; E3 ## E0 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00747\"></a><span class=\"lineno\">  747</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,3,2&gt; E3 ## E0 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00748\"></a><span class=\"lineno\">  748</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,0,3,3&gt; E3 ## E0 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00749\"></a><span class=\"lineno\">  749</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,0,0&gt; E3 ## E1 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00750\"></a><span class=\"lineno\">  750</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,0,1&gt; E3 ## E1 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00751\"></a><span class=\"lineno\">  751</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,0,2&gt; E3 ## E1 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00752\"></a><span class=\"lineno\">  752</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,0,3&gt; E3 ## E1 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00753\"></a><span class=\"lineno\">  753</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,1,0&gt; E3 ## E1 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00754\"></a><span class=\"lineno\">  754</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,1,1&gt; E3 ## E1 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00755\"></a><span class=\"lineno\">  755</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,1,2&gt; E3 ## E1 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00756\"></a><span class=\"lineno\">  756</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,1,3&gt; E3 ## E1 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00757\"></a><span class=\"lineno\">  757</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,2,0&gt; E3 ## E1 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00758\"></a><span class=\"lineno\">  758</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,2,1&gt; E3 ## E1 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00759\"></a><span class=\"lineno\">  759</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,2,2&gt; E3 ## E1 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00760\"></a><span class=\"lineno\">  760</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,2,3&gt; E3 ## E1 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00761\"></a><span class=\"lineno\">  761</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,3,0&gt; E3 ## E1 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00762\"></a><span class=\"lineno\">  762</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,3,1&gt; E3 ## E1 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00763\"></a><span class=\"lineno\">  763</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,3,2&gt; E3 ## E1 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00764\"></a><span class=\"lineno\">  764</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,1,3,3&gt; E3 ## E1 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00765\"></a><span class=\"lineno\">  765</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,0,0&gt; E3 ## E2 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00766\"></a><span class=\"lineno\">  766</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,0,1&gt; E3 ## E2 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00767\"></a><span class=\"lineno\">  767</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,0,2&gt; E3 ## E2 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00768\"></a><span class=\"lineno\">  768</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,0,3&gt; E3 ## E2 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00769\"></a><span class=\"lineno\">  769</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,1,0&gt; E3 ## E2 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00770\"></a><span class=\"lineno\">  770</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,1,1&gt; E3 ## E2 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00771\"></a><span class=\"lineno\">  771</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,1,2&gt; E3 ## E2 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00772\"></a><span class=\"lineno\">  772</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,1,3&gt; E3 ## E2 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00773\"></a><span class=\"lineno\">  773</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,2,0&gt; E3 ## E2 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00774\"></a><span class=\"lineno\">  774</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,2,1&gt; E3 ## E2 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00775\"></a><span class=\"lineno\">  775</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,2,2&gt; E3 ## E2 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00776\"></a><span class=\"lineno\">  776</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,2,3&gt; E3 ## E2 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00777\"></a><span class=\"lineno\">  777</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,3,0&gt; E3 ## E2 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00778\"></a><span class=\"lineno\">  778</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,3,1&gt; E3 ## E2 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00779\"></a><span class=\"lineno\">  779</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,3,2&gt; E3 ## E2 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00780\"></a><span class=\"lineno\">  780</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,2,3,3&gt; E3 ## E2 ## E3 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00781\"></a><span class=\"lineno\">  781</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,0,0&gt; E3 ## E3 ## E0 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00782\"></a><span class=\"lineno\">  782</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,0,1&gt; E3 ## E3 ## E0 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00783\"></a><span class=\"lineno\">  783</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,0,2&gt; E3 ## E3 ## E0 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00784\"></a><span class=\"lineno\">  784</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,0,3&gt; E3 ## E3 ## E0 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00785\"></a><span class=\"lineno\">  785</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,1,0&gt; E3 ## E3 ## E1 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00786\"></a><span class=\"lineno\">  786</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,1,1&gt; E3 ## E3 ## E1 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00787\"></a><span class=\"lineno\">  787</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,1,2&gt; E3 ## E3 ## E1 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00788\"></a><span class=\"lineno\">  788</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,1,3&gt; E3 ## E3 ## E1 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00789\"></a><span class=\"lineno\">  789</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,2,0&gt; E3 ## E3 ## E2 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00790\"></a><span class=\"lineno\">  790</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,2,1&gt; E3 ## E3 ## E2 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00791\"></a><span class=\"lineno\">  791</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,2,2&gt; E3 ## E3 ## E2 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00792\"></a><span class=\"lineno\">  792</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,2,3&gt; E3 ## E3 ## E2 ## E3; }; \\</span></div>\n<div class=\"line\"><a name=\"l00793\"></a><span class=\"lineno\">  793</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,3,0&gt; E3 ## E3 ## E3 ## E0; }; \\</span></div>\n<div class=\"line\"><a name=\"l00794\"></a><span class=\"lineno\">  794</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,3,1&gt; E3 ## E3 ## E3 ## E1; }; \\</span></div>\n<div class=\"line\"><a name=\"l00795\"></a><span class=\"lineno\">  795</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,3,2&gt; E3 ## E3 ## E3 ## E2; }; \\</span></div>\n<div class=\"line\"><a name=\"l00796\"></a><span class=\"lineno\">  796</span>&#160;<span class=\"preprocessor\">        struct { detail::_swizzle&lt;4, T, Q, 3,3,3,3&gt; E3 ## E3 ## E3 ## E3; };</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00151_html_ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><div class=\"ttname\"><a href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">glm::e</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType e()</div><div class=\"ttdoc\">Return e constant. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00005.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _swizzle_func.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_swizzle_func.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00005_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00005_source.html\">_swizzle_func.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00005_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _swizzle_func.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_swizzle_func.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00005.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, CONST, A, B)   \\</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">        vec&lt;2, T, Q&gt; A ## B() CONST                                                     \\</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">        {                                                                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">                return vec&lt;2, T, Q&gt;(this-&gt;A, this-&gt;B);                  \\</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, CONST, A, B, C)                \\</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">        vec&lt;3, T, Q&gt; A ## B ## C() CONST                                                        \\</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">        {                                                                                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">                return vec&lt;3, T, Q&gt;(this-&gt;A, this-&gt;B, this-&gt;C);                 \\</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, CONST, A, B, C, D)                                     \\</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">        vec&lt;4, T, Q&gt; A ## B ## C ## D() CONST                                                                   \\</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">        {                                                                                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">                return vec&lt;4, T, Q&gt;(this-&gt;A, this-&gt;B, this-&gt;C, this-&gt;D);                        \\</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(T, P, L, CONST, A, B)    \\</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">        template&lt;typename T&gt;                                                                            \\</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">        vec&lt;L, T, Q&gt; vec&lt;L, T, Q&gt;::A ## B() CONST                                       \\</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">        {                                                                                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">                return vec&lt;2, T, Q&gt;(this-&gt;A, this-&gt;B);                                  \\</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(T, P, L, CONST, A, B, C)         \\</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">        template&lt;typename T&gt;                                                                                    \\</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">        vec&lt;3, T, Q&gt; vec&lt;L, T, Q&gt;::A ## B ## C() CONST                                  \\</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">        {                                                                                                                               \\</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">                return vec&lt;3, T, Q&gt;(this-&gt;A, this-&gt;B, this-&gt;C);                         \\</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(T, P, L, CONST, A, B, C, D)              \\</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"preprocessor\">        template&lt;typename T&gt;                                                                                            \\</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">        vec&lt;4, T, Q&gt; vec&lt;L, T, Q&gt;::A ## B ## C ## D() CONST                                     \\</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">        {                                                                                                                                       \\</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">                return vec&lt;4, T, Q&gt;(this-&gt;A, this-&gt;B, this-&gt;C, this-&gt;D);                \\</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"preprocessor\">#define GLM_MUTABLE</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, B, A)</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(T, P) \\</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, x, y) \\</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, r, g) \\</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, s, t)</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B)</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, B, A)</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C)</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, P) \\</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, x, y, z) \\</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, r, g, b) \\</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, s, t, p)</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, C)</span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, B)</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, C, A)</span></div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D)</span></div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(T, P) \\</span></div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, x, y, z, w) \\</span></div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, r, g, b, a) \\</span></div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, s, t, p, q)</span></div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B)</span></div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B)</span></div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B)</span></div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B)</span></div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P)                     \\</span></div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, x, y)  \\</span></div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, r, g)  \\</span></div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, s, t)</span></div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C)</span></div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C)</span></div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C)</span></div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C)</span></div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P) \\</span></div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, x, y, z) \\</span></div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, r, g, b) \\</span></div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, s, t, p)</span></div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;</div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, D)</span></div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, D)</span></div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\">  439</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\">  443</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00456\"></a><span class=\"lineno\">  456</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\">  457</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00461\"></a><span class=\"lineno\">  461</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\">  462</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00465\"></a><span class=\"lineno\">  465</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00466\"></a><span class=\"lineno\">  466</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\">  467</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\">  471</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00474\"></a><span class=\"lineno\">  474</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\">  475</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00477\"></a><span class=\"lineno\">  477</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\">  478</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00483\"></a><span class=\"lineno\">  483</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\">  484</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00486\"></a><span class=\"lineno\">  486</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00487\"></a><span class=\"lineno\">  487</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00488\"></a><span class=\"lineno\">  488</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\">  489</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00493\"></a><span class=\"lineno\">  493</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00494\"></a><span class=\"lineno\">  494</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\">  497</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00500\"></a><span class=\"lineno\">  500</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00507\"></a><span class=\"lineno\">  507</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00508\"></a><span class=\"lineno\">  508</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00510\"></a><span class=\"lineno\">  510</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00511\"></a><span class=\"lineno\">  511</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\">  514</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00516\"></a><span class=\"lineno\">  516</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\">  517</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\">  520</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\">  521</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\">  523</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00524\"></a><span class=\"lineno\">  524</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00525\"></a><span class=\"lineno\">  525</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00528\"></a><span class=\"lineno\">  528</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\">  533</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00536\"></a><span class=\"lineno\">  536</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00537\"></a><span class=\"lineno\">  537</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00538\"></a><span class=\"lineno\">  538</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00541\"></a><span class=\"lineno\">  541</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00542\"></a><span class=\"lineno\">  542</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00545\"></a><span class=\"lineno\">  545</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00546\"></a><span class=\"lineno\">  546</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\">  549</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\">  550</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00554\"></a><span class=\"lineno\">  554</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00555\"></a><span class=\"lineno\">  555</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00558\"></a><span class=\"lineno\">  558</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00559\"></a><span class=\"lineno\">  559</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00562\"></a><span class=\"lineno\">  562</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00563\"></a><span class=\"lineno\">  563</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00566\"></a><span class=\"lineno\">  566</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00567\"></a><span class=\"lineno\">  567</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00571\"></a><span class=\"lineno\">  571</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00572\"></a><span class=\"lineno\">  572</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00575\"></a><span class=\"lineno\">  575</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00576\"></a><span class=\"lineno\">  576</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00579\"></a><span class=\"lineno\">  579</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00580\"></a><span class=\"lineno\">  580</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00583\"></a><span class=\"lineno\">  583</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00584\"></a><span class=\"lineno\">  584</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00585\"></a><span class=\"lineno\">  585</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\">  586</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00587\"></a><span class=\"lineno\">  587</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00588\"></a><span class=\"lineno\">  588</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\">  589</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00591\"></a><span class=\"lineno\">  591</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00592\"></a><span class=\"lineno\">  592</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\">  595</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00596\"></a><span class=\"lineno\">  596</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00597\"></a><span class=\"lineno\">  597</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\">  598</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00601\"></a><span class=\"lineno\">  601</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00603\"></a><span class=\"lineno\">  603</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00604\"></a><span class=\"lineno\">  604</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00605\"></a><span class=\"lineno\">  605</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00606\"></a><span class=\"lineno\">  606</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00607\"></a><span class=\"lineno\">  607</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00609\"></a><span class=\"lineno\">  609</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00610\"></a><span class=\"lineno\">  610</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00611\"></a><span class=\"lineno\">  611</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00612\"></a><span class=\"lineno\">  612</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00613\"></a><span class=\"lineno\">  613</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00614\"></a><span class=\"lineno\">  614</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00615\"></a><span class=\"lineno\">  615</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00617\"></a><span class=\"lineno\">  617</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00618\"></a><span class=\"lineno\">  618</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00619\"></a><span class=\"lineno\">  619</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00621\"></a><span class=\"lineno\">  621</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00622\"></a><span class=\"lineno\">  622</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00623\"></a><span class=\"lineno\">  623</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00624\"></a><span class=\"lineno\">  624</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00625\"></a><span class=\"lineno\">  625</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00626\"></a><span class=\"lineno\">  626</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00627\"></a><span class=\"lineno\">  627</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00628\"></a><span class=\"lineno\">  628</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00629\"></a><span class=\"lineno\">  629</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00630\"></a><span class=\"lineno\">  630</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00631\"></a><span class=\"lineno\">  631</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00633\"></a><span class=\"lineno\">  633</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00634\"></a><span class=\"lineno\">  634</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00635\"></a><span class=\"lineno\">  635</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00636\"></a><span class=\"lineno\">  636</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00638\"></a><span class=\"lineno\">  638</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00639\"></a><span class=\"lineno\">  639</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00640\"></a><span class=\"lineno\">  640</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00641\"></a><span class=\"lineno\">  641</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00642\"></a><span class=\"lineno\">  642</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00643\"></a><span class=\"lineno\">  643</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00644\"></a><span class=\"lineno\">  644</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00646\"></a><span class=\"lineno\">  646</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00647\"></a><span class=\"lineno\">  647</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00648\"></a><span class=\"lineno\">  648</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00649\"></a><span class=\"lineno\">  649</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00650\"></a><span class=\"lineno\">  650</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00651\"></a><span class=\"lineno\">  651</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00652\"></a><span class=\"lineno\">  652</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00653\"></a><span class=\"lineno\">  653</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00655\"></a><span class=\"lineno\">  655</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00656\"></a><span class=\"lineno\">  656</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00657\"></a><span class=\"lineno\">  657</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00658\"></a><span class=\"lineno\">  658</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, D) \\</span></div>\n<div class=\"line\"><a name=\"l00659\"></a><span class=\"lineno\">  659</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, A) \\</span></div>\n<div class=\"line\"><a name=\"l00660\"></a><span class=\"lineno\">  660</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, B) \\</span></div>\n<div class=\"line\"><a name=\"l00661\"></a><span class=\"lineno\">  661</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, C) \\</span></div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, D) \\</span></div>\n<div class=\"line\"><a name=\"l00663\"></a><span class=\"lineno\">  663</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, A) \\</span></div>\n<div class=\"line\"><a name=\"l00664\"></a><span class=\"lineno\">  664</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, B) \\</span></div>\n<div class=\"line\"><a name=\"l00665\"></a><span class=\"lineno\">  665</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, C) \\</span></div>\n<div class=\"line\"><a name=\"l00666\"></a><span class=\"lineno\">  666</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, D) \\</span></div>\n<div class=\"line\"><a name=\"l00667\"></a><span class=\"lineno\">  667</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, A) \\</span></div>\n<div class=\"line\"><a name=\"l00668\"></a><span class=\"lineno\">  668</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, B) \\</span></div>\n<div class=\"line\"><a name=\"l00669\"></a><span class=\"lineno\">  669</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, C) \\</span></div>\n<div class=\"line\"><a name=\"l00670\"></a><span class=\"lineno\">  670</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\">  671</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, A) \\</span></div>\n<div class=\"line\"><a name=\"l00672\"></a><span class=\"lineno\">  672</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, B) \\</span></div>\n<div class=\"line\"><a name=\"l00673\"></a><span class=\"lineno\">  673</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, C) \\</span></div>\n<div class=\"line\"><a name=\"l00674\"></a><span class=\"lineno\">  674</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, D)</span></div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;</div>\n<div class=\"line\"><a name=\"l00676\"></a><span class=\"lineno\">  676</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00677\"></a><span class=\"lineno\">  677</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00678\"></a><span class=\"lineno\">  678</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\</span></div>\n<div class=\"line\"><a name=\"l00679\"></a><span class=\"lineno\">  679</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D)</span></div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;</div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P) \\</span></div>\n<div class=\"line\"><a name=\"l00682\"></a><span class=\"lineno\">  682</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, x, y, z, w) \\</span></div>\n<div class=\"line\"><a name=\"l00683\"></a><span class=\"lineno\">  683</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, r, g, b, a) \\</span></div>\n<div class=\"line\"><a name=\"l00684\"></a><span class=\"lineno\">  684</span>&#160;<span class=\"preprocessor\">        GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, s, t, p, q)</span></div>\n<div class=\"line\"><a name=\"l00685\"></a><span class=\"lineno\">  685</span>&#160;</div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00006.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _vectorize.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_vectorize.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00006_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00006_source.html\">_vectorize.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00006_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: _vectorize.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">_vectorize.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00006.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00121.html\">type_vec1.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">type_vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">type_vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">type_vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">struct </span>functor1{};</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        <span class=\"keyword\">struct </span>functor1&lt;1, R, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;1, R, Q&gt; call(R (*Func) (T x), vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;1, R, Q&gt;(Func(v.x));</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">struct </span>functor1&lt;2, R, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;2, R, Q&gt; call(R (*Func) (T x), vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;2, R, Q&gt;(Func(v.x), Func(v.y));</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">struct </span>functor1&lt;3, R, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;3, R, Q&gt; call(R (*Func) (T x), vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;3, R, Q&gt;(Func(v.x), Func(v.y), Func(v.z));</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">struct </span>functor1&lt;4, R, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;4, R, Q&gt; call(R (*Func) (T x), vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;4, R, Q&gt;(Func(v.x), Func(v.y), Func(v.z), Func(v.w));</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">struct </span>functor2{};</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">struct </span>functor2&lt;1, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;1, T, Q&gt; call(T (*Func) (T x, T y), vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; b)</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;1, T, Q&gt;(Func(a.x, b.x));</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        <span class=\"keyword\">struct </span>functor2&lt;2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;2, T, Q&gt; call(T (*Func) (T x, T y), vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; b)</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;2, T, Q&gt;(Func(a.x, b.x), Func(a.y, b.y));</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        <span class=\"keyword\">struct </span>functor2&lt;3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;3, T, Q&gt; call(T (*Func) (T x, T y), vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; b)</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;3, T, Q&gt;(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z));</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        <span class=\"keyword\">struct </span>functor2&lt;4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;4, T, Q&gt; call(T (*Func) (T x, T y), vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; b)</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;4, T, Q&gt;(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w));</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        <span class=\"keyword\">struct </span>functor2_vec_sca{};</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;        <span class=\"keyword\">struct </span>functor2_vec_sca&lt;1, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;1, T, Q&gt; call(T (*Func) (T x, T y), vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, T b)</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;1, T, Q&gt;(Func(a.x, b));</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        <span class=\"keyword\">struct </span>functor2_vec_sca&lt;2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;2, T, Q&gt; call(T (*Func) (T x, T y), vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, T b)</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;2, T, Q&gt;(Func(a.x, b), Func(a.y, b));</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"keyword\">struct </span>functor2_vec_sca&lt;3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;3, T, Q&gt; call(T (*Func) (T x, T y), vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, T b)</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;3, T, Q&gt;(Func(a.x, b), Func(a.y, b), Func(a.z, b));</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        <span class=\"keyword\">struct </span>functor2_vec_sca&lt;4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> vec&lt;4, T, Q&gt; call(T (*Func) (T x, T y), vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, T b)</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                        <span class=\"keywordflow\">return</span> vec&lt;4, T, Q&gt;(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b));</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00121_html\"><div class=\"ttname\"><a href=\"a00121.html\">type_vec1.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00007.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: associated_min_max.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">associated_min_max.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00169.html\">GLM_GTX_associated_min_max</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00007_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga7d9c8785230c8db60f72ec8975f1ba45\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:ga7d9c8785230c8db60f72ec8975f1ba45\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga7d9c8785230c8db60f72ec8975f1ba45\">associatedMax</a> (T x, U a, T y, U b)</td></tr>\n<tr class=\"memdesc:ga7d9c8785230c8db60f72ec8975f1ba45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga7d9c8785230c8db60f72ec8975f1ba45\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7d9c8785230c8db60f72ec8975f1ba45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5c6758bc50aa7fbe700f87123a045aad\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5c6758bc50aa7fbe700f87123a045aad\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga5c6758bc50aa7fbe700f87123a045aad\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:ga5c6758bc50aa7fbe700f87123a045aad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga5c6758bc50aa7fbe700f87123a045aad\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5c6758bc50aa7fbe700f87123a045aad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0d169d6ce26b03248df175f39005d77f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0d169d6ce26b03248df175f39005d77f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga0d169d6ce26b03248df175f39005d77f\">associatedMax</a> (T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:ga0d169d6ce26b03248df175f39005d77f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga0d169d6ce26b03248df175f39005d77f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0d169d6ce26b03248df175f39005d77f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4086269afabcb81dd7ded33cb3448653\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4086269afabcb81dd7ded33cb3448653\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga4086269afabcb81dd7ded33cb3448653\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b)</td></tr>\n<tr class=\"memdesc:ga4086269afabcb81dd7ded33cb3448653\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga4086269afabcb81dd7ded33cb3448653\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4086269afabcb81dd7ded33cb3448653\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec891e363d91abbf3a4443cf2f652209\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:gaec891e363d91abbf3a4443cf2f652209\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gaec891e363d91abbf3a4443cf2f652209\">associatedMax</a> (T x, U a, T y, U b, T z, U c)</td></tr>\n<tr class=\"memdesc:gaec891e363d91abbf3a4443cf2f652209\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#gaec891e363d91abbf3a4443cf2f652209\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec891e363d91abbf3a4443cf2f652209\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab84fdc35016a31e8cd0cbb8296bddf7c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab84fdc35016a31e8cd0cbb8296bddf7c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gab84fdc35016a31e8cd0cbb8296bddf7c\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c)</td></tr>\n<tr class=\"memdesc:gab84fdc35016a31e8cd0cbb8296bddf7c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#gab84fdc35016a31e8cd0cbb8296bddf7c\">More...</a><br /></td></tr>\n<tr class=\"separator:gab84fdc35016a31e8cd0cbb8296bddf7c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadd2a2002f4f2144bbc39eb2336dd2fba\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadd2a2002f4f2144bbc39eb2336dd2fba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gadd2a2002f4f2144bbc39eb2336dd2fba\">associatedMax</a> (T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c)</td></tr>\n<tr class=\"memdesc:gadd2a2002f4f2144bbc39eb2336dd2fba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#gadd2a2002f4f2144bbc39eb2336dd2fba\">More...</a><br /></td></tr>\n<tr class=\"separator:gadd2a2002f4f2144bbc39eb2336dd2fba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga19f59d1141a51a3b2108a9807af78f7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga19f59d1141a51a3b2108a9807af78f7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga19f59d1141a51a3b2108a9807af78f7f\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c)</td></tr>\n<tr class=\"memdesc:ga19f59d1141a51a3b2108a9807af78f7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#ga19f59d1141a51a3b2108a9807af78f7f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga19f59d1141a51a3b2108a9807af78f7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3038ffcb43eaa6af75897a99a5047ccc\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:ga3038ffcb43eaa6af75897a99a5047ccc\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga3038ffcb43eaa6af75897a99a5047ccc\">associatedMax</a> (T x, U a, T y, U b, T z, U c, T w, U d)</td></tr>\n<tr class=\"memdesc:ga3038ffcb43eaa6af75897a99a5047ccc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga3038ffcb43eaa6af75897a99a5047ccc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3038ffcb43eaa6af75897a99a5047ccc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c, vec&lt; L, T, Q &gt; const &amp;w, vec&lt; L, U, Q &gt; const &amp;d)</td></tr>\n<tr class=\"memdesc:gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga11477c2c4b5b0bfd1b72b29df3725a9d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga11477c2c4b5b0bfd1b72b29df3725a9d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga11477c2c4b5b0bfd1b72b29df3725a9d\">associatedMax</a> (T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c, T w, vec&lt; L, U, Q &gt; const &amp;d)</td></tr>\n<tr class=\"memdesc:ga11477c2c4b5b0bfd1b72b29df3725a9d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga11477c2c4b5b0bfd1b72b29df3725a9d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga11477c2c4b5b0bfd1b72b29df3725a9d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab9c3dd74cac899d2c625b5767ea3b3fb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab9c3dd74cac899d2c625b5767ea3b3fb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)</td></tr>\n<tr class=\"memdesc:gab9c3dd74cac899d2c625b5767ea3b3fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">More...</a><br /></td></tr>\n<tr class=\"separator:gab9c3dd74cac899d2c625b5767ea3b3fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc01bd272359572fc28437ae214a02df\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacc01bd272359572fc28437ae214a02df\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gacc01bd272359572fc28437ae214a02df\">associatedMin</a> (T x, U a, T y, U b)</td></tr>\n<tr class=\"memdesc:gacc01bd272359572fc28437ae214a02df\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#gacc01bd272359572fc28437ae214a02df\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc01bd272359572fc28437ae214a02df\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac2f0dff90948f2e44386a5eafd941d1c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac2f0dff90948f2e44386a5eafd941d1c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gac2f0dff90948f2e44386a5eafd941d1c\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:gac2f0dff90948f2e44386a5eafd941d1c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#gac2f0dff90948f2e44386a5eafd941d1c\">More...</a><br /></td></tr>\n<tr class=\"separator:gac2f0dff90948f2e44386a5eafd941d1c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacfec519c820331d023ef53a511749319\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacfec519c820331d023ef53a511749319\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gacfec519c820331d023ef53a511749319\">associatedMin</a> (T x, const vec&lt; L, U, Q &gt; &amp;a, T y, const vec&lt; L, U, Q &gt; &amp;b)</td></tr>\n<tr class=\"memdesc:gacfec519c820331d023ef53a511749319\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#gacfec519c820331d023ef53a511749319\">More...</a><br /></td></tr>\n<tr class=\"separator:gacfec519c820331d023ef53a511749319\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4757c7cab2d809124a8525d0a9deeb37\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4757c7cab2d809124a8525d0a9deeb37\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga4757c7cab2d809124a8525d0a9deeb37\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b)</td></tr>\n<tr class=\"memdesc:ga4757c7cab2d809124a8525d0a9deeb37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga4757c7cab2d809124a8525d0a9deeb37\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4757c7cab2d809124a8525d0a9deeb37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0aa8f86259a26d839d34a3577a923fc\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:gad0aa8f86259a26d839d34a3577a923fc\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gad0aa8f86259a26d839d34a3577a923fc\">associatedMin</a> (T x, U a, T y, U b, T z, U c)</td></tr>\n<tr class=\"memdesc:gad0aa8f86259a26d839d34a3577a923fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#gad0aa8f86259a26d839d34a3577a923fc\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0aa8f86259a26d839d34a3577a923fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga723e5411cebc7ffbd5c81ffeec61127d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga723e5411cebc7ffbd5c81ffeec61127d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga723e5411cebc7ffbd5c81ffeec61127d\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c)</td></tr>\n<tr class=\"memdesc:ga723e5411cebc7ffbd5c81ffeec61127d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#ga723e5411cebc7ffbd5c81ffeec61127d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga723e5411cebc7ffbd5c81ffeec61127d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga432224ebe2085eaa2b63a077ecbbbff6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:ga432224ebe2085eaa2b63a077ecbbbff6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga432224ebe2085eaa2b63a077ecbbbff6\">associatedMin</a> (T x, U a, T y, U b, T z, U c, T w, U d)</td></tr>\n<tr class=\"memdesc:ga432224ebe2085eaa2b63a077ecbbbff6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga432224ebe2085eaa2b63a077ecbbbff6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga432224ebe2085eaa2b63a077ecbbbff6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga66b08118bc88f0494bcacb7cdb940556\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga66b08118bc88f0494bcacb7cdb940556\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga66b08118bc88f0494bcacb7cdb940556\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c, vec&lt; L, T, Q &gt; const &amp;w, vec&lt; L, U, Q &gt; const &amp;d)</td></tr>\n<tr class=\"memdesc:ga66b08118bc88f0494bcacb7cdb940556\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga66b08118bc88f0494bcacb7cdb940556\">More...</a><br /></td></tr>\n<tr class=\"separator:ga66b08118bc88f0494bcacb7cdb940556\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78c28fde1a7080fb7420bd88e68c6c68\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga78c28fde1a7080fb7420bd88e68c6c68\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga78c28fde1a7080fb7420bd88e68c6c68\">associatedMin</a> (T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c, T w, vec&lt; L, U, Q &gt; const &amp;d)</td></tr>\n<tr class=\"memdesc:ga78c28fde1a7080fb7420bd88e68c6c68\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga78c28fde1a7080fb7420bd88e68c6c68\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78c28fde1a7080fb7420bd88e68c6c68\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2db7e351994baee78540a562d4bb6d3b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2db7e351994baee78540a562d4bb6d3b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)</td></tr>\n<tr class=\"memdesc:ga2db7e351994baee78540a562d4bb6d3b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2db7e351994baee78540a562d4bb6d3b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00169.html\">GLM_GTX_associated_min_max</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_extented_min_max (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00007_source.html\">associated_min_max.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00007_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: associated_min_max.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">associated_min_max.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00007.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GTX_associated_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_associated_min_max extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL U <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(T x, U a, T y, U b);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL vec&lt;2, U, Q&gt; <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b);</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                T x, <span class=\"keyword\">const</span> vec&lt;L, U, Q&gt;&amp; a,</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                T y, <span class=\"keyword\">const</span> vec&lt;L, U, Q&gt;&amp; b);</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, U a,</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, U b);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        GLM_FUNC_DECL U <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                T x, U a,</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                T y, U b,</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                T z, U c);</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b,</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; z, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; c);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;        GLM_FUNC_DECL U <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                T x, U a,</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                T y, U b,</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                T z, U c,</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                T w, U d);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b,</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; z, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; c,</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; w, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; d);</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                T x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                T y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b,</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                T z, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; c,</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                T w, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; d);</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a>(</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, U a,</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, U b,</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; z, U c,</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; w, U d);</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        GLM_FUNC_DECL U <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(T x, U a, T y, U b);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        GLM_FUNC_DECL vec&lt;2, U, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b);</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                T x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                T y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, U a,</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, U b);</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL U <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                T x, U a,</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                T y, U b,</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;                T z, U c);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b,</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; z, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; c);</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                T x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;                T y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b,</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                T z, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; c);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, U a,</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, U b,</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; z, U c);</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        GLM_FUNC_DECL U <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                T x, U a,</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                T y, U b,</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                T z, U c,</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;                T w, U d);</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b,</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; z, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; c,</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; w, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; d);</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;                T x, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a,</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;                T y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; b,</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;                T z, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; c,</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;                T w, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; d);</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;        GLM_FUNC_DECL vec&lt;L, U, Q&gt; <a class=\"code\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a>(</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, U a,</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, U b,</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; z, U c,</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; w, U d);</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;<span class=\"preprocessor\">#include &quot;associated_min_max.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00169_html_gab9c3dd74cac899d2c625b5767ea3b3fb\"><div class=\"ttname\"><a href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">glm::associatedMax</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, U, Q &gt; associatedMax(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)</div><div class=\"ttdoc\">Maximum comparison between 4 variables and returns 4 associated variable values. </div></div>\n<div class=\"ttc\" id=\"a00169_html_ga2db7e351994baee78540a562d4bb6d3b\"><div class=\"ttname\"><a href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">glm::associatedMin</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, U, Q &gt; associatedMin(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)</div><div class=\"ttdoc\">Minimum comparison between 4 variables and returns 4 associated variable values. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00008.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: bit.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">bit.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00170.html\">GLM_GTX_bit</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00008_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0dcc8fe7c3d3ad60dea409281efa3d05\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga0dcc8fe7c3d3ad60dea409281efa3d05\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga0dcc8fe7c3d3ad60dea409281efa3d05\">highestBitValue</a> (genIUType Value)</td></tr>\n<tr class=\"separator:ga0dcc8fe7c3d3ad60dea409281efa3d05\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga898ef075ccf809a1e480faab48fe96bf\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga898ef075ccf809a1e480faab48fe96bf\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga898ef075ccf809a1e480faab48fe96bf\">highestBitValue</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga898ef075ccf809a1e480faab48fe96bf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Find the highest bit set to 1 in a integer variable and return its value.  <a href=\"a00170.html#ga898ef075ccf809a1e480faab48fe96bf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga898ef075ccf809a1e480faab48fe96bf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ff6568089f3a9b67f5c30918855fc6f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga2ff6568089f3a9b67f5c30918855fc6f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga2ff6568089f3a9b67f5c30918855fc6f\">lowestBitValue</a> (genIUType Value)</td></tr>\n<tr class=\"separator:ga2ff6568089f3a9b67f5c30918855fc6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8cda2459871f574a0aecbe702ac93291\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga8cda2459871f574a0aecbe702ac93291\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga8cda2459871f574a0aecbe702ac93291\">powerOfTwoAbove</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:ga8cda2459871f574a0aecbe702ac93291\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just higher the input value.  <a href=\"a00170.html#ga8cda2459871f574a0aecbe702ac93291\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8cda2459871f574a0aecbe702ac93291\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2bbded187c5febfefc1e524ba31b3fab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2bbded187c5febfefc1e524ba31b3fab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga2bbded187c5febfefc1e524ba31b3fab\">powerOfTwoAbove</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga2bbded187c5febfefc1e524ba31b3fab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just higher the input value.  <a href=\"a00170.html#ga2bbded187c5febfefc1e524ba31b3fab\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2bbded187c5febfefc1e524ba31b3fab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3de7df63c589325101a2817a56f8e29d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga3de7df63c589325101a2817a56f8e29d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga3de7df63c589325101a2817a56f8e29d\">powerOfTwoBelow</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:ga3de7df63c589325101a2817a56f8e29d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just lower the input value.  <a href=\"a00170.html#ga3de7df63c589325101a2817a56f8e29d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3de7df63c589325101a2817a56f8e29d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf78ddcc4152c051b2a21e68fecb10980\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf78ddcc4152c051b2a21e68fecb10980\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#gaf78ddcc4152c051b2a21e68fecb10980\">powerOfTwoBelow</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:gaf78ddcc4152c051b2a21e68fecb10980\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just lower the input value.  <a href=\"a00170.html#gaf78ddcc4152c051b2a21e68fecb10980\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf78ddcc4152c051b2a21e68fecb10980\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f65973a5d2ea38c719e6a663149ead9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga5f65973a5d2ea38c719e6a663149ead9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga5f65973a5d2ea38c719e6a663149ead9\">powerOfTwoNearest</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:ga5f65973a5d2ea38c719e6a663149ead9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is the closet to the input value.  <a href=\"a00170.html#ga5f65973a5d2ea38c719e6a663149ead9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f65973a5d2ea38c719e6a663149ead9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac87e65d11e16c3d6b91c3bcfaef7da0b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac87e65d11e16c3d6b91c3bcfaef7da0b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b\">powerOfTwoNearest</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:gac87e65d11e16c3d6b91c3bcfaef7da0b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is the closet to the input value.  <a href=\"a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b\">More...</a><br /></td></tr>\n<tr class=\"separator:gac87e65d11e16c3d6b91c3bcfaef7da0b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00170.html\">GLM_GTX_bit</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00008_source.html\">bit.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00008_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: bit.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">bit.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00008.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/bitfield.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_bit is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_bit extension is deprecated, include GLM_GTC_bitfield and GLM_GTC_integer instead&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00170.html#ga898ef075ccf809a1e480faab48fe96bf\">highestBitValue</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00170.html#ga2ff6568089f3a9b67f5c30918855fc6f\">lowestBitValue</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00170.html#ga898ef075ccf809a1e480faab48fe96bf\">highestBitValue</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_DEPRECATED GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00170.html#ga2bbded187c5febfefc1e524ba31b3fab\">powerOfTwoAbove</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        GLM_DEPRECATED GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00170.html#ga2bbded187c5febfefc1e524ba31b3fab\">powerOfTwoAbove</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        GLM_DEPRECATED GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00170.html#gaf78ddcc4152c051b2a21e68fecb10980\">powerOfTwoBelow</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        GLM_DEPRECATED GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00170.html#gaf78ddcc4152c051b2a21e68fecb10980\">powerOfTwoBelow</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        GLM_DEPRECATED GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b\">powerOfTwoNearest</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;        GLM_DEPRECATED GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b\">powerOfTwoNearest</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"preprocessor\">#include &quot;bit.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;</div>\n<div class=\"ttc\" id=\"a00170_html_ga2ff6568089f3a9b67f5c30918855fc6f\"><div class=\"ttname\"><a href=\"a00170.html#ga2ff6568089f3a9b67f5c30918855fc6f\">glm::lowestBitValue</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genIUType lowestBitValue(genIUType Value)</div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00170_html_ga2bbded187c5febfefc1e524ba31b3fab\"><div class=\"ttname\"><a href=\"a00170.html#ga2bbded187c5febfefc1e524ba31b3fab\">glm::powerOfTwoAbove</a></div><div class=\"ttdeci\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt; powerOfTwoAbove(vec&lt; L, T, Q &gt; const &amp;value)</div><div class=\"ttdoc\">Return the power of two number which value is just higher the input value. </div></div>\n<div class=\"ttc\" id=\"a00170_html_gaf78ddcc4152c051b2a21e68fecb10980\"><div class=\"ttname\"><a href=\"a00170.html#gaf78ddcc4152c051b2a21e68fecb10980\">glm::powerOfTwoBelow</a></div><div class=\"ttdeci\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt; powerOfTwoBelow(vec&lt; L, T, Q &gt; const &amp;value)</div><div class=\"ttdoc\">Return the power of two number which value is just lower the input value. </div></div>\n<div class=\"ttc\" id=\"a00170_html_ga898ef075ccf809a1e480faab48fe96bf\"><div class=\"ttname\"><a href=\"a00170.html#ga898ef075ccf809a1e480faab48fe96bf\">glm::highestBitValue</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; highestBitValue(vec&lt; L, T, Q &gt; const &amp;value)</div><div class=\"ttdoc\">Find the highest bit set to 1 in a integer variable and return its value. </div></div>\n<div class=\"ttc\" id=\"a00170_html_gac87e65d11e16c3d6b91c3bcfaef7da0b\"><div class=\"ttname\"><a href=\"a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b\">glm::powerOfTwoNearest</a></div><div class=\"ttdeci\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt; powerOfTwoNearest(vec&lt; L, T, Q &gt; const &amp;value)</div><div class=\"ttdoc\">Return the power of two number which value is the closet to the input value. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00009.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: bitfield.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">bitfield.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00149.html\">GLM_GTC_bitfield</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00009_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga46f9295abe3b5c7658f5b13c7f819f0a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga46f9295abe3b5c7658f5b13c7f819f0a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga46f9295abe3b5c7658f5b13c7f819f0a\">bitfieldFillOne</a> (genIUType Value, int FirstBit, int BitCount)</td></tr>\n<tr class=\"memdesc:ga46f9295abe3b5c7658f5b13c7f819f0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set to 1 a range of bits.  <a href=\"a00149.html#ga46f9295abe3b5c7658f5b13c7f819f0a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga46f9295abe3b5c7658f5b13c7f819f0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e96dd1f0a4bc892f063251ed118c0c1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3e96dd1f0a4bc892f063251ed118c0c1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1\">bitfieldFillOne</a> (vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)</td></tr>\n<tr class=\"memdesc:ga3e96dd1f0a4bc892f063251ed118c0c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set to 1 a range of bits.  <a href=\"a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e96dd1f0a4bc892f063251ed118c0c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga697b86998b7d74ee0a69d8e9f8819fee\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga697b86998b7d74ee0a69d8e9f8819fee\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga697b86998b7d74ee0a69d8e9f8819fee\">bitfieldFillZero</a> (genIUType Value, int FirstBit, int BitCount)</td></tr>\n<tr class=\"memdesc:ga697b86998b7d74ee0a69d8e9f8819fee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set to 0 a range of bits.  <a href=\"a00149.html#ga697b86998b7d74ee0a69d8e9f8819fee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga697b86998b7d74ee0a69d8e9f8819fee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0d16c9acef4be79ea9b47c082a0cf7c2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0d16c9acef4be79ea9b47c082a0cf7c2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2\">bitfieldFillZero</a> (vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)</td></tr>\n<tr class=\"memdesc:ga0d16c9acef4be79ea9b47c082a0cf7c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set to 0 a range of bits.  <a href=\"a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0d16c9acef4be79ea9b47c082a0cf7c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga24cad0069f9a0450abd80b3e89501adf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga24cad0069f9a0450abd80b3e89501adf\">bitfieldInterleave</a> (int8 x, int8 y)</td></tr>\n<tr class=\"memdesc:ga24cad0069f9a0450abd80b3e89501adf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#ga24cad0069f9a0450abd80b3e89501adf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga24cad0069f9a0450abd80b3e89501adf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9a4976a529aec2cee56525e1165da484\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga9a4976a529aec2cee56525e1165da484\">bitfieldInterleave</a> (uint8 x, uint8 y)</td></tr>\n<tr class=\"memdesc:ga9a4976a529aec2cee56525e1165da484\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#ga9a4976a529aec2cee56525e1165da484\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9a4976a529aec2cee56525e1165da484\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac51c33a394593f0631fa3aa5bb778809\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gac51c33a394593f0631fa3aa5bb778809\">bitfieldInterleave</a> (int16 x, int16 y)</td></tr>\n<tr class=\"memdesc:gac51c33a394593f0631fa3aa5bb778809\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#gac51c33a394593f0631fa3aa5bb778809\">More...</a><br /></td></tr>\n<tr class=\"separator:gac51c33a394593f0631fa3aa5bb778809\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga94f3646a5667f4be56f8dcf3310e963f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga94f3646a5667f4be56f8dcf3310e963f\">bitfieldInterleave</a> (uint16 x, uint16 y)</td></tr>\n<tr class=\"memdesc:ga94f3646a5667f4be56f8dcf3310e963f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#ga94f3646a5667f4be56f8dcf3310e963f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga94f3646a5667f4be56f8dcf3310e963f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebb756a24a0784e3d6fba8bd011ab77a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gaebb756a24a0784e3d6fba8bd011ab77a\">bitfieldInterleave</a> (int32 x, int32 y)</td></tr>\n<tr class=\"memdesc:gaebb756a24a0784e3d6fba8bd011ab77a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#gaebb756a24a0784e3d6fba8bd011ab77a\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebb756a24a0784e3d6fba8bd011ab77a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2f1e2b3fe699e7d897ae38b2115ddcbd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga2f1e2b3fe699e7d897ae38b2115ddcbd\">bitfieldInterleave</a> (uint32 x, uint32 y)</td></tr>\n<tr class=\"memdesc:ga2f1e2b3fe699e7d897ae38b2115ddcbd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#ga2f1e2b3fe699e7d897ae38b2115ddcbd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2f1e2b3fe699e7d897ae38b2115ddcbd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8fdb724dccd4a07d57efc01147102137\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga8fdb724dccd4a07d57efc01147102137\">bitfieldInterleave</a> (int8 x, int8 y, int8 z)</td></tr>\n<tr class=\"memdesc:ga8fdb724dccd4a07d57efc01147102137\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#ga8fdb724dccd4a07d57efc01147102137\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8fdb724dccd4a07d57efc01147102137\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9fc2a0dd5dcf8b00e113f272a5feca93\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga9fc2a0dd5dcf8b00e113f272a5feca93\">bitfieldInterleave</a> (uint8 x, uint8 y, uint8 z)</td></tr>\n<tr class=\"memdesc:ga9fc2a0dd5dcf8b00e113f272a5feca93\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#ga9fc2a0dd5dcf8b00e113f272a5feca93\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9fc2a0dd5dcf8b00e113f272a5feca93\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa901c36a842fa5d126ea650549f17b24\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gaa901c36a842fa5d126ea650549f17b24\">bitfieldInterleave</a> (int16 x, int16 y, int16 z)</td></tr>\n<tr class=\"memdesc:gaa901c36a842fa5d126ea650549f17b24\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#gaa901c36a842fa5d126ea650549f17b24\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa901c36a842fa5d126ea650549f17b24\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3afd6d38881fe3948c53d4214d2197fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga3afd6d38881fe3948c53d4214d2197fd\">bitfieldInterleave</a> (uint16 x, uint16 y, uint16 z)</td></tr>\n<tr class=\"memdesc:ga3afd6d38881fe3948c53d4214d2197fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#ga3afd6d38881fe3948c53d4214d2197fd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3afd6d38881fe3948c53d4214d2197fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad2075d96a6640121edaa98ea534102ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gad2075d96a6640121edaa98ea534102ca\">bitfieldInterleave</a> (int32 x, int32 y, int32 z)</td></tr>\n<tr class=\"memdesc:gad2075d96a6640121edaa98ea534102ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#gad2075d96a6640121edaa98ea534102ca\">More...</a><br /></td></tr>\n<tr class=\"separator:gad2075d96a6640121edaa98ea534102ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab19fbc739fc0cf7247978602c36f7da8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gab19fbc739fc0cf7247978602c36f7da8\">bitfieldInterleave</a> (uint32 x, uint32 y, uint32 z)</td></tr>\n<tr class=\"memdesc:gab19fbc739fc0cf7247978602c36f7da8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#gab19fbc739fc0cf7247978602c36f7da8\">More...</a><br /></td></tr>\n<tr class=\"separator:gab19fbc739fc0cf7247978602c36f7da8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8a44ae22f5c953b296c42d067dccbe6d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga8a44ae22f5c953b296c42d067dccbe6d\">bitfieldInterleave</a> (int8 x, int8 y, int8 z, int8 w)</td></tr>\n<tr class=\"memdesc:ga8a44ae22f5c953b296c42d067dccbe6d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y, z and w.  <a href=\"a00149.html#ga8a44ae22f5c953b296c42d067dccbe6d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8a44ae22f5c953b296c42d067dccbe6d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga14bb274d54a3c26f4919dd7ed0dd0c36\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga14bb274d54a3c26f4919dd7ed0dd0c36\">bitfieldInterleave</a> (uint8 x, uint8 y, uint8 z, uint8 w)</td></tr>\n<tr class=\"memdesc:ga14bb274d54a3c26f4919dd7ed0dd0c36\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y, z and w.  <a href=\"a00149.html#ga14bb274d54a3c26f4919dd7ed0dd0c36\">More...</a><br /></td></tr>\n<tr class=\"separator:ga14bb274d54a3c26f4919dd7ed0dd0c36\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga180a63161e1319fbd5a53c84d0429c7a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga180a63161e1319fbd5a53c84d0429c7a\">bitfieldInterleave</a> (int16 x, int16 y, int16 z, int16 w)</td></tr>\n<tr class=\"memdesc:ga180a63161e1319fbd5a53c84d0429c7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y, z and w.  <a href=\"a00149.html#ga180a63161e1319fbd5a53c84d0429c7a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga180a63161e1319fbd5a53c84d0429c7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafca8768671a14c8016facccb66a89f26\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a> (uint16 x, uint16 y, uint16 z, uint16 w)</td></tr>\n<tr class=\"memdesc:gafca8768671a14c8016facccb66a89f26\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y, z and w.  <a href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">More...</a><br /></td></tr>\n<tr class=\"separator:gafca8768671a14c8016facccb66a89f26\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2eb49678a344ce1495bdb5586d9896b9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga2eb49678a344ce1495bdb5586d9896b9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga2eb49678a344ce1495bdb5586d9896b9\">bitfieldRotateLeft</a> (genIUType In, int Shift)</td></tr>\n<tr class=\"memdesc:ga2eb49678a344ce1495bdb5586d9896b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate all bits to the left.  <a href=\"a00149.html#ga2eb49678a344ce1495bdb5586d9896b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2eb49678a344ce1495bdb5586d9896b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae186317091b1a39214ebf79008d44a1e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae186317091b1a39214ebf79008d44a1e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gae186317091b1a39214ebf79008d44a1e\">bitfieldRotateLeft</a> (vec&lt; L, T, Q &gt; const &amp;In, int Shift)</td></tr>\n<tr class=\"memdesc:gae186317091b1a39214ebf79008d44a1e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate all bits to the left.  <a href=\"a00149.html#gae186317091b1a39214ebf79008d44a1e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae186317091b1a39214ebf79008d44a1e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1c33d075c5fb8bd8dbfd5092bfc851ca\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga1c33d075c5fb8bd8dbfd5092bfc851ca\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga1c33d075c5fb8bd8dbfd5092bfc851ca\">bitfieldRotateRight</a> (genIUType In, int Shift)</td></tr>\n<tr class=\"memdesc:ga1c33d075c5fb8bd8dbfd5092bfc851ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate all bits to the right.  <a href=\"a00149.html#ga1c33d075c5fb8bd8dbfd5092bfc851ca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1c33d075c5fb8bd8dbfd5092bfc851ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88\">bitfieldRotateRight</a> (vec&lt; L, T, Q &gt; const &amp;In, int Shift)</td></tr>\n<tr class=\"memdesc:ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate all bits to the right.  <a href=\"a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88\">More...</a><br /></td></tr>\n<tr class=\"separator:ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad7eba518a0b71662114571ee76939f8a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gad7eba518a0b71662114571ee76939f8a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gad7eba518a0b71662114571ee76939f8a\">mask</a> (genIUType Bits)</td></tr>\n<tr class=\"memdesc:gad7eba518a0b71662114571ee76939f8a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a mask of 'count' bits.  <a href=\"a00149.html#gad7eba518a0b71662114571ee76939f8a\">More...</a><br /></td></tr>\n<tr class=\"separator:gad7eba518a0b71662114571ee76939f8a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e64e3b922a296033b825311e7f5fff1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2e64e3b922a296033b825311e7f5fff1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga2e64e3b922a296033b825311e7f5fff1\">mask</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga2e64e3b922a296033b825311e7f5fff1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a mask of 'count' bits.  <a href=\"a00149.html#ga2e64e3b922a296033b825311e7f5fff1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e64e3b922a296033b825311e7f5fff1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00149.html\">GLM_GTC_bitfield</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00009_source.html\">bitfield.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00009_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: bitfield.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">bitfield.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00009.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_int.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/_vectorize.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_bitfield extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00149.html#ga2e64e3b922a296033b825311e7f5fff1\">mask</a>(genIUType Bits);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00149.html#ga2e64e3b922a296033b825311e7f5fff1\">mask</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88\">bitfieldRotateRight</a>(genIUType In, <span class=\"keywordtype\">int</span> Shift);</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88\">bitfieldRotateRight</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; In, <span class=\"keywordtype\">int</span> Shift);</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00149.html#gae186317091b1a39214ebf79008d44a1e\">bitfieldRotateLeft</a>(genIUType In, <span class=\"keywordtype\">int</span> Shift);</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00149.html#gae186317091b1a39214ebf79008d44a1e\">bitfieldRotateLeft</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; In, <span class=\"keywordtype\">int</span> Shift);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1\">bitfieldFillOne</a>(genIUType Value, <span class=\"keywordtype\">int</span> FirstBit, <span class=\"keywordtype\">int</span> BitCount);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1\">bitfieldFillOne</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Value, <span class=\"keywordtype\">int</span> FirstBit, <span class=\"keywordtype\">int</span> BitCount);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2\">bitfieldFillZero</a>(genIUType Value, <span class=\"keywordtype\">int</span> FirstBit, <span class=\"keywordtype\">int</span> BitCount);</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2\">bitfieldFillZero</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Value, <span class=\"keywordtype\">int</span> FirstBit, <span class=\"keywordtype\">int</span> BitCount);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        GLM_FUNC_DECL int16 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(int8 x, int8 y);</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(uint8 x, uint8 y);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        GLM_FUNC_DECL int32 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(int16 x, int16 y);</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(uint16 x, uint16 y);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        GLM_FUNC_DECL int64 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(int32 x, int32 y);</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(uint32 x, uint32 y);</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        GLM_FUNC_DECL int32 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(int8 x, int8 y, int8 z);</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(uint8 x, uint8 y, uint8 z);</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        GLM_FUNC_DECL int64 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(int16 x, int16 y, int16 z);</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(uint16 x, uint16 y, uint16 z);</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;        GLM_FUNC_DECL int64 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(int32 x, int32 y, int32 z);</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(uint32 x, uint32 y, uint32 z);</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;        GLM_FUNC_DECL int32 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(int8 x, int8 y, int8 z, int8 w);</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(uint8 x, uint8 y, uint8 z, uint8 w);</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;        GLM_FUNC_DECL int64 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(int16 x, int16 y, int16 z, int16 w);</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a>(uint16 x, uint16 y, uint16 z, uint16 w);</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;<span class=\"preprocessor\">#include &quot;bitfield.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00149_html_gafca8768671a14c8016facccb66a89f26\"><div class=\"ttname\"><a href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">glm::bitfieldInterleave</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w)</div><div class=\"ttdoc\">Interleaves the bits of x, y, z and w. </div></div>\n<div class=\"ttc\" id=\"a00149_html_ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><div class=\"ttname\"><a href=\"a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88\">glm::bitfieldRotateRight</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; bitfieldRotateRight(vec&lt; L, T, Q &gt; const &amp;In, int Shift)</div><div class=\"ttdoc\">Rotate all bits to the right. </div></div>\n<div class=\"ttc\" id=\"a00149_html_ga3e96dd1f0a4bc892f063251ed118c0c1\"><div class=\"ttname\"><a href=\"a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1\">glm::bitfieldFillOne</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; bitfieldFillOne(vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)</div><div class=\"ttdoc\">Set to 1 a range of bits. </div></div>\n<div class=\"ttc\" id=\"a00149_html_ga2e64e3b922a296033b825311e7f5fff1\"><div class=\"ttname\"><a href=\"a00149.html#ga2e64e3b922a296033b825311e7f5fff1\">glm::mask</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; mask(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a mask of &#39;count&#39; bits. </div></div>\n<div class=\"ttc\" id=\"a00149_html_ga0d16c9acef4be79ea9b47c082a0cf7c2\"><div class=\"ttname\"><a href=\"a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2\">glm::bitfieldFillZero</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; bitfieldFillZero(vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)</div><div class=\"ttdoc\">Set to 0 a range of bits. </div></div>\n<div class=\"ttc\" id=\"a00149_html_gae186317091b1a39214ebf79008d44a1e\"><div class=\"ttname\"><a href=\"a00149.html#gae186317091b1a39214ebf79008d44a1e\">glm::bitfieldRotateLeft</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; bitfieldRotateLeft(vec&lt; L, T, Q &gt; const &amp;In, int Shift)</div><div class=\"ttdoc\">Rotate all bits to the left. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00010.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: closest_point.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">closest_point.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00171.html\">GLM_GTX_closest_point</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00010_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga36529c278ef716986151d58d151d697d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga36529c278ef716986151d58d151d697d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00171.html#ga36529c278ef716986151d58d151d697d\">closestPointOnLine</a> (vec&lt; 3, T, Q &gt; const &amp;point, vec&lt; 3, T, Q &gt; const &amp;a, vec&lt; 3, T, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:ga36529c278ef716986151d58d151d697d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Find the point on a straight line which is the closet of a point.  <a href=\"a00171.html#ga36529c278ef716986151d58d151d697d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga36529c278ef716986151d58d151d697d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00171.html#ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\">closestPointOnLine</a> (vec&lt; 2, T, Q &gt; const &amp;point, vec&lt; 2, T, Q &gt; const &amp;a, vec&lt; 2, T, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2d lines work as well <br /></td></tr>\n<tr class=\"separator:ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00171.html\">GLM_GTX_closest_point</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00010_source.html\">closest_point.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00010_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: closest_point.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">closest_point.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00010.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_closest_point extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00171.html#ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\">closestPointOnLine</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; point,</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; b);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; <a class=\"code\" href=\"a00171.html#ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\">closestPointOnLine</a>(</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; point,</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; a, </div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; b); </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#include &quot;closest_point.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00171_html_ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><div class=\"ttname\"><a href=\"a00171.html#ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\">glm::closestPointOnLine</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 2, T, Q &gt; closestPointOnLine(vec&lt; 2, T, Q &gt; const &amp;point, vec&lt; 2, T, Q &gt; const &amp;a, vec&lt; 2, T, Q &gt; const &amp;b)</div><div class=\"ttdoc\">2d lines work as well </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00011.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: color_encoding.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">color_encoding.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00172.html\">GLM_GTX_color_encoding</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00011_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gad12f4f65022b2c80e33fcba2ced0dc48\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gad12f4f65022b2c80e33fcba2ced0dc48\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad12f4f65022b2c80e33fcba2ced0dc48\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html#gad12f4f65022b2c80e33fcba2ced0dc48\">convertD65XYZToD50XYZ</a> (vec&lt; 3, T, Q &gt; const &amp;ColorD65XYZ)</td></tr>\n<tr class=\"memdesc:gad12f4f65022b2c80e33fcba2ced0dc48\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a D65 YUV color to D50 YUV. <br /></td></tr>\n<tr class=\"separator:gad12f4f65022b2c80e33fcba2ced0dc48\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5265386fc3ac29e4c580d37ed470859c\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga5265386fc3ac29e4c580d37ed470859c\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5265386fc3ac29e4c580d37ed470859c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html#ga5265386fc3ac29e4c580d37ed470859c\">convertD65XYZToLinearSRGB</a> (vec&lt; 3, T, Q &gt; const &amp;ColorD65XYZ)</td></tr>\n<tr class=\"memdesc:ga5265386fc3ac29e4c580d37ed470859c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a D65 YUV color to linear sRGB. <br /></td></tr>\n<tr class=\"separator:ga5265386fc3ac29e4c580d37ed470859c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1522ba180e3d83d554a734056da031f9\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga1522ba180e3d83d554a734056da031f9\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1522ba180e3d83d554a734056da031f9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html#ga1522ba180e3d83d554a734056da031f9\">convertLinearSRGBToD50XYZ</a> (vec&lt; 3, T, Q &gt; const &amp;ColorLinearSRGB)</td></tr>\n<tr class=\"memdesc:ga1522ba180e3d83d554a734056da031f9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a linear sRGB color to D50 YUV. <br /></td></tr>\n<tr class=\"separator:ga1522ba180e3d83d554a734056da031f9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf9e130d9d4ccf51cc99317de7449f369\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaf9e130d9d4ccf51cc99317de7449f369\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf9e130d9d4ccf51cc99317de7449f369\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html#gaf9e130d9d4ccf51cc99317de7449f369\">convertLinearSRGBToD65XYZ</a> (vec&lt; 3, T, Q &gt; const &amp;ColorLinearSRGB)</td></tr>\n<tr class=\"memdesc:gaf9e130d9d4ccf51cc99317de7449f369\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a linear sRGB color to D65 YUV. <br /></td></tr>\n<tr class=\"separator:gaf9e130d9d4ccf51cc99317de7449f369\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00172.html\">GLM_GTX_color_encoding</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00172.html\" title=\"Include <glm/gtx/color_encoding.hpp> to use the features of this extension. \">GLM_GTX_color_encoding</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00011_source.html\">color_encoding.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00011_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: color_encoding.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">color_encoding.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00011.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_color_encoding extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00172.html#gaf9e130d9d4ccf51cc99317de7449f369\">convertLinearSRGBToD65XYZ</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; ColorLinearSRGB);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00172.html#ga1522ba180e3d83d554a734056da031f9\">convertLinearSRGBToD50XYZ</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; ColorLinearSRGB);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00172.html#ga5265386fc3ac29e4c580d37ed470859c\">convertD65XYZToLinearSRGB</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; ColorD65XYZ);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00172.html#gad12f4f65022b2c80e33fcba2ced0dc48\">convertD65XYZToD50XYZ</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; ColorD65XYZ);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">#include &quot;color_encoding.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00172_html_ga1522ba180e3d83d554a734056da031f9\"><div class=\"ttname\"><a href=\"a00172.html#ga1522ba180e3d83d554a734056da031f9\">glm::convertLinearSRGBToD50XYZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; convertLinearSRGBToD50XYZ(vec&lt; 3, T, Q &gt; const &amp;ColorLinearSRGB)</div><div class=\"ttdoc\">Convert a linear sRGB color to D50 YUV. </div></div>\n<div class=\"ttc\" id=\"a00172_html_ga5265386fc3ac29e4c580d37ed470859c\"><div class=\"ttname\"><a href=\"a00172.html#ga5265386fc3ac29e4c580d37ed470859c\">glm::convertD65XYZToLinearSRGB</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; convertD65XYZToLinearSRGB(vec&lt; 3, T, Q &gt; const &amp;ColorD65XYZ)</div><div class=\"ttdoc\">Convert a D65 YUV color to linear sRGB. </div></div>\n<div class=\"ttc\" id=\"a00172_html_gad12f4f65022b2c80e33fcba2ced0dc48\"><div class=\"ttname\"><a href=\"a00172.html#gad12f4f65022b2c80e33fcba2ced0dc48\">glm::convertD65XYZToD50XYZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; convertD65XYZToD50XYZ(vec&lt; 3, T, Q &gt; const &amp;ColorD65XYZ)</div><div class=\"ttdoc\">Convert a D65 YUV color to D50 YUV. </div></div>\n<div class=\"ttc\" id=\"a00172_html_gaf9e130d9d4ccf51cc99317de7449f369\"><div class=\"ttname\"><a href=\"a00172.html#gaf9e130d9d4ccf51cc99317de7449f369\">glm::convertLinearSRGBToD65XYZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; convertLinearSRGBToD65XYZ(vec&lt; 3, T, Q &gt; const &amp;ColorLinearSRGB)</div><div class=\"ttdoc\">Convert a linear sRGB color to D65 YUV. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00012.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: color_space.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/color_space.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00150.html\">GLM_GTC_color_space</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00012_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga42239e7b3da900f7ef37cec7e2476579\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga42239e7b3da900f7ef37cec7e2476579\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html#ga42239e7b3da900f7ef37cec7e2476579\">convertLinearToSRGB</a> (vec&lt; L, T, Q &gt; const &amp;ColorLinear)</td></tr>\n<tr class=\"memdesc:ga42239e7b3da900f7ef37cec7e2476579\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a linear color to sRGB color using a standard gamma correction.  <a href=\"a00150.html#ga42239e7b3da900f7ef37cec7e2476579\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42239e7b3da900f7ef37cec7e2476579\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaace0a21167d13d26116c283009af57f6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaace0a21167d13d26116c283009af57f6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html#gaace0a21167d13d26116c283009af57f6\">convertLinearToSRGB</a> (vec&lt; L, T, Q &gt; const &amp;ColorLinear, T Gamma)</td></tr>\n<tr class=\"memdesc:gaace0a21167d13d26116c283009af57f6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a linear color to sRGB color using a custom gamma correction.  <a href=\"a00150.html#gaace0a21167d13d26116c283009af57f6\">More...</a><br /></td></tr>\n<tr class=\"separator:gaace0a21167d13d26116c283009af57f6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16c798b7a226b2c3079dedc55083d187\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga16c798b7a226b2c3079dedc55083d187\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html#ga16c798b7a226b2c3079dedc55083d187\">convertSRGBToLinear</a> (vec&lt; L, T, Q &gt; const &amp;ColorSRGB)</td></tr>\n<tr class=\"memdesc:ga16c798b7a226b2c3079dedc55083d187\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a sRGB color to linear color using a standard gamma correction.  <a href=\"a00150.html#ga16c798b7a226b2c3079dedc55083d187\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16c798b7a226b2c3079dedc55083d187\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1b91f27a9726c9cb403f9fee6e2e200\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gad1b91f27a9726c9cb403f9fee6e2e200\"></a>\ntemplate&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad1b91f27a9726c9cb403f9fee6e2e200\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html#gad1b91f27a9726c9cb403f9fee6e2e200\">convertSRGBToLinear</a> (vec&lt; L, T, Q &gt; const &amp;ColorSRGB, T Gamma)</td></tr>\n<tr class=\"memdesc:gad1b91f27a9726c9cb403f9fee6e2e200\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a sRGB color to linear color using a custom gamma correction. <br /></td></tr>\n<tr class=\"separator:gad1b91f27a9726c9cb403f9fee6e2e200\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00150.html\">GLM_GTC_color_space</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00150.html\" title=\"Include <glm/gtc/color_space.hpp> to use the features of this extension. \">GLM_GTC_color_space</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00012_source.html\">gtc/color_space.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00012_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: color_space.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/color_space.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00012.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../exponential.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_color_space extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00150.html#gaace0a21167d13d26116c283009af57f6\">convertLinearToSRGB</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; ColorLinear);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00150.html#gaace0a21167d13d26116c283009af57f6\">convertLinearToSRGB</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; ColorLinear, T Gamma);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00150.html#gad1b91f27a9726c9cb403f9fee6e2e200\">convertSRGBToLinear</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; ColorSRGB);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"comment\">// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00150.html#gad1b91f27a9726c9cb403f9fee6e2e200\">convertSRGBToLinear</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; ColorSRGB, T Gamma);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"preprocessor\">#include &quot;color_space.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00150_html_gaace0a21167d13d26116c283009af57f6\"><div class=\"ttname\"><a href=\"a00150.html#gaace0a21167d13d26116c283009af57f6\">glm::convertLinearToSRGB</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; convertLinearToSRGB(vec&lt; L, T, Q &gt; const &amp;ColorLinear, T Gamma)</div><div class=\"ttdoc\">Convert a linear color to sRGB color using a custom gamma correction. </div></div>\n<div class=\"ttc\" id=\"a00150_html_gad1b91f27a9726c9cb403f9fee6e2e200\"><div class=\"ttname\"><a href=\"a00150.html#gad1b91f27a9726c9cb403f9fee6e2e200\">glm::convertSRGBToLinear</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; convertSRGBToLinear(vec&lt; L, T, Q &gt; const &amp;ColorSRGB, T Gamma)</div><div class=\"ttdoc\">Convert a sRGB color to linear color using a custom gamma correction. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00013.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: color_space.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/color_space.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00173.html\">GLM_GTX_color_space</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00013_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga789802bec2d4fe0f9741c731b4a8a7d8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga789802bec2d4fe0f9741c731b4a8a7d8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#ga789802bec2d4fe0f9741c731b4a8a7d8\">hsvColor</a> (vec&lt; 3, T, Q &gt; const &amp;rgbValue)</td></tr>\n<tr class=\"memdesc:ga789802bec2d4fe0f9741c731b4a8a7d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a color from RGB color space to its color in HSV color space.  <a href=\"a00173.html#ga789802bec2d4fe0f9741c731b4a8a7d8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga789802bec2d4fe0f9741c731b4a8a7d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad028e0a4f1a9c812b39439b746295b34\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad028e0a4f1a9c812b39439b746295b34\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#gad028e0a4f1a9c812b39439b746295b34\">luminosity</a> (vec&lt; 3, T, Q &gt; const &amp;color)</td></tr>\n<tr class=\"memdesc:gad028e0a4f1a9c812b39439b746295b34\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals.  <a href=\"a00173.html#gad028e0a4f1a9c812b39439b746295b34\">More...</a><br /></td></tr>\n<tr class=\"separator:gad028e0a4f1a9c812b39439b746295b34\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f9193be46f45f0655c05a0cdca006db\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5f9193be46f45f0655c05a0cdca006db\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">rgbColor</a> (vec&lt; 3, T, Q &gt; const &amp;hsvValue)</td></tr>\n<tr class=\"memdesc:ga5f9193be46f45f0655c05a0cdca006db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a color from HSV color space to its color in RGB color space.  <a href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f9193be46f45f0655c05a0cdca006db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga01a97152b44e1550edcac60bd849e884\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga01a97152b44e1550edcac60bd849e884\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#ga01a97152b44e1550edcac60bd849e884\">saturation</a> (T const s)</td></tr>\n<tr class=\"memdesc:ga01a97152b44e1550edcac60bd849e884\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a saturation matrix.  <a href=\"a00173.html#ga01a97152b44e1550edcac60bd849e884\">More...</a><br /></td></tr>\n<tr class=\"separator:ga01a97152b44e1550edcac60bd849e884\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2156cea600e90148ece5bc96fd6db43a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2156cea600e90148ece5bc96fd6db43a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#ga2156cea600e90148ece5bc96fd6db43a\">saturation</a> (T const s, vec&lt; 3, T, Q &gt; const &amp;color)</td></tr>\n<tr class=\"memdesc:ga2156cea600e90148ece5bc96fd6db43a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modify the saturation of a color.  <a href=\"a00173.html#ga2156cea600e90148ece5bc96fd6db43a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2156cea600e90148ece5bc96fd6db43a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaba0eacee0736dae860e9371cc1ae4785\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaba0eacee0736dae860e9371cc1ae4785\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#gaba0eacee0736dae860e9371cc1ae4785\">saturation</a> (T const s, vec&lt; 4, T, Q &gt; const &amp;color)</td></tr>\n<tr class=\"memdesc:gaba0eacee0736dae860e9371cc1ae4785\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modify the saturation of a color.  <a href=\"a00173.html#gaba0eacee0736dae860e9371cc1ae4785\">More...</a><br /></td></tr>\n<tr class=\"separator:gaba0eacee0736dae860e9371cc1ae4785\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00173.html\">GLM_GTX_color_space</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00013_source.html\">gtx/color_space.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00013_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: color_space.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/color_space.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00013.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_color_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_color_space extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">rgbColor</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; hsvValue);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00173.html#ga789802bec2d4fe0f9741c731b4a8a7d8\">hsvColor</a>(</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; rgbValue);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00173.html#gaba0eacee0736dae860e9371cc1ae4785\">saturation</a>(</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                T <span class=\"keyword\">const</span> s);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00173.html#gaba0eacee0736dae860e9371cc1ae4785\">saturation</a>(</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                T <span class=\"keyword\">const</span> s,</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; color);</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00173.html#gaba0eacee0736dae860e9371cc1ae4785\">saturation</a>(</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                T <span class=\"keyword\">const</span> s,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; color);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00173.html#gad028e0a4f1a9c812b39439b746295b34\">luminosity</a>(</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; color);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;<span class=\"preprocessor\">#include &quot;color_space.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00173_html_gaba0eacee0736dae860e9371cc1ae4785\"><div class=\"ttname\"><a href=\"a00173.html#gaba0eacee0736dae860e9371cc1ae4785\">glm::saturation</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt; saturation(T const s, vec&lt; 4, T, Q &gt; const &amp;color)</div><div class=\"ttdoc\">Modify the saturation of a color. </div></div>\n<div class=\"ttc\" id=\"a00173_html_ga5f9193be46f45f0655c05a0cdca006db\"><div class=\"ttname\"><a href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">glm::rgbColor</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; rgbColor(vec&lt; 3, T, Q &gt; const &amp;hsvValue)</div><div class=\"ttdoc\">Converts a color from HSV color space to its color in RGB color space. </div></div>\n<div class=\"ttc\" id=\"a00173_html_ga789802bec2d4fe0f9741c731b4a8a7d8\"><div class=\"ttname\"><a href=\"a00173.html#ga789802bec2d4fe0f9741c731b4a8a7d8\">glm::hsvColor</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; hsvColor(vec&lt; 3, T, Q &gt; const &amp;rgbValue)</div><div class=\"ttdoc\">Converts a color from RGB color space to its color in HSV color space. </div></div>\n<div class=\"ttc\" id=\"a00173_html_gad028e0a4f1a9c812b39439b746295b34\"><div class=\"ttname\"><a href=\"a00173.html#gad028e0a4f1a9c812b39439b746295b34\">glm::luminosity</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T luminosity(vec&lt; 3, T, Q &gt; const &amp;color)</div><div class=\"ttdoc\">Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00014.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: color_space_YCoCg.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">color_space_YCoCg.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00174.html\">GLM_GTX_color_space_YCoCg</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00014_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0606353ec2a9b9eaa84f1b02ec391bc5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0606353ec2a9b9eaa84f1b02ec391bc5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html#ga0606353ec2a9b9eaa84f1b02ec391bc5\">rgb2YCoCg</a> (vec&lt; 3, T, Q &gt; const &amp;rgbColor)</td></tr>\n<tr class=\"memdesc:ga0606353ec2a9b9eaa84f1b02ec391bc5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a color from RGB color space to YCoCg color space.  <a href=\"a00174.html#ga0606353ec2a9b9eaa84f1b02ec391bc5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0606353ec2a9b9eaa84f1b02ec391bc5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0389772e44ca0fd2ba4a79bdd8efe898\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0389772e44ca0fd2ba4a79bdd8efe898\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html#ga0389772e44ca0fd2ba4a79bdd8efe898\">rgb2YCoCgR</a> (vec&lt; 3, T, Q &gt; const &amp;rgbColor)</td></tr>\n<tr class=\"memdesc:ga0389772e44ca0fd2ba4a79bdd8efe898\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a color from RGB color space to YCoCgR color space.  <a href=\"a00174.html#ga0389772e44ca0fd2ba4a79bdd8efe898\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0389772e44ca0fd2ba4a79bdd8efe898\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga163596b804c7241810b2534a99eb1343\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga163596b804c7241810b2534a99eb1343\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html#ga163596b804c7241810b2534a99eb1343\">YCoCg2rgb</a> (vec&lt; 3, T, Q &gt; const &amp;YCoCgColor)</td></tr>\n<tr class=\"memdesc:ga163596b804c7241810b2534a99eb1343\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a color from YCoCg color space to RGB color space.  <a href=\"a00174.html#ga163596b804c7241810b2534a99eb1343\">More...</a><br /></td></tr>\n<tr class=\"separator:ga163596b804c7241810b2534a99eb1343\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf8d30574c8576838097d8e20c295384a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf8d30574c8576838097d8e20c295384a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html#gaf8d30574c8576838097d8e20c295384a\">YCoCgR2rgb</a> (vec&lt; 3, T, Q &gt; const &amp;YCoCgColor)</td></tr>\n<tr class=\"memdesc:gaf8d30574c8576838097d8e20c295384a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a color from YCoCgR color space to RGB color space.  <a href=\"a00174.html#gaf8d30574c8576838097d8e20c295384a\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf8d30574c8576838097d8e20c295384a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00174.html\">GLM_GTX_color_space_YCoCg</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00014_source.html\">color_space_YCoCg.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00014_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: color_space_YCoCg.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">color_space_YCoCg.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00014.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_color_space_YCoCg is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_color_space_YCoCg extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00174.html#ga0606353ec2a9b9eaa84f1b02ec391bc5\">rgb2YCoCg</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">rgbColor</a>);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00174.html#ga163596b804c7241810b2534a99eb1343\">YCoCg2rgb</a>(</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; YCoCgColor);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00174.html#ga0389772e44ca0fd2ba4a79bdd8efe898\">rgb2YCoCgR</a>(</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">rgbColor</a>);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00174.html#gaf8d30574c8576838097d8e20c295384a\">YCoCgR2rgb</a>(</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; YCoCgColor);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">#include &quot;color_space_YCoCg.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00174_html_ga0389772e44ca0fd2ba4a79bdd8efe898\"><div class=\"ttname\"><a href=\"a00174.html#ga0389772e44ca0fd2ba4a79bdd8efe898\">glm::rgb2YCoCgR</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; rgb2YCoCgR(vec&lt; 3, T, Q &gt; const &amp;rgbColor)</div><div class=\"ttdoc\">Convert a color from RGB color space to YCoCgR color space. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00174_html_ga163596b804c7241810b2534a99eb1343\"><div class=\"ttname\"><a href=\"a00174.html#ga163596b804c7241810b2534a99eb1343\">glm::YCoCg2rgb</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; YCoCg2rgb(vec&lt; 3, T, Q &gt; const &amp;YCoCgColor)</div><div class=\"ttdoc\">Convert a color from YCoCg color space to RGB color space. </div></div>\n<div class=\"ttc\" id=\"a00174_html_gaf8d30574c8576838097d8e20c295384a\"><div class=\"ttname\"><a href=\"a00174.html#gaf8d30574c8576838097d8e20c295384a\">glm::YCoCgR2rgb</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; YCoCgR2rgb(vec&lt; 3, T, Q &gt; const &amp;YCoCgColor)</div><div class=\"ttdoc\">Convert a color from YCoCgR color space to RGB color space. </div></div>\n<div class=\"ttc\" id=\"a00173_html_ga5f9193be46f45f0655c05a0cdca006db\"><div class=\"ttname\"><a href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">glm::rgbColor</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; rgbColor(vec&lt; 3, T, Q &gt; const &amp;hsvValue)</div><div class=\"ttdoc\">Converts a color from HSV color space to its color in RGB color space. </div></div>\n<div class=\"ttc\" id=\"a00174_html_ga0606353ec2a9b9eaa84f1b02ec391bc5\"><div class=\"ttname\"><a href=\"a00174.html#ga0606353ec2a9b9eaa84f1b02ec391bc5\">glm::rgb2YCoCg</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; rgb2YCoCg(vec&lt; 3, T, Q &gt; const &amp;rgbColor)</div><div class=\"ttdoc\">Convert a color from RGB color space to YCoCg color space. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00015.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: common.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">common.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00015_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga693d77696ff36572a0da79efec965acd\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga693d77696ff36572a0da79efec965acd\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga693d77696ff36572a0da79efec965acd\">abs</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga693d77696ff36572a0da79efec965acd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x if x &gt;= 0; otherwise, it returns -x.  <a href=\"a00140.html#ga693d77696ff36572a0da79efec965acd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga693d77696ff36572a0da79efec965acd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga3e141c9738c73d3e581efa471dba8b4c\">abs</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x if x &gt;= 0; otherwise, it returns -x.  <a href=\"a00140.html#ga3e141c9738c73d3e581efa471dba8b4c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gafb9d2a645a23aca12d4d6de0104b7657\">ceil</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer that is greater than or equal to x.  <a href=\"a00140.html#gafb9d2a645a23aca12d4d6de0104b7657\">More...</a><br /></td></tr>\n<tr class=\"separator:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">clamp</a> (genType x, genType minVal, genType maxVal)</td></tr>\n<tr class=\"memdesc:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gabff13e6547edac08f52b4133ff4bf183\">clamp</a> (vec&lt; L, T, Q &gt; const &amp;x, T minVal, T maxVal)</td></tr>\n<tr class=\"memdesc:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00140.html#gabff13e6547edac08f52b4133ff4bf183\">More...</a><br /></td></tr>\n<tr class=\"separator:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga748333282a6f2f87762c0a4739c8c364\">clamp</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;minVal, vec&lt; L, T, Q &gt; const &amp;maxVal)</td></tr>\n<tr class=\"memdesc:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00140.html#ga748333282a6f2f87762c0a4739c8c364\">More...</a><br /></td></tr>\n<tr class=\"separator:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga1425c1c3160ec51214b03a0469a3013d\">floatBitsToInt</a> (float const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a signed integer value representing the encoding of a floating-point value.  <a href=\"a00140.html#ga1425c1c3160ec51214b03a0469a3013d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">floatBitsToInt</a> (vec&lt; L, float, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a signed integer value representing the encoding of a floating-point value.  <a href=\"a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga70e0271c34af52f3100c7960e18c3f2b\">floatBitsToUint</a> (float const &amp;v)</td></tr>\n<tr class=\"memdesc:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a unsigned integer value representing the encoding of a floating-point value.  <a href=\"a00140.html#ga70e0271c34af52f3100c7960e18c3f2b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">floatBitsToUint</a> (vec&lt; L, float, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a unsigned integer value representing the encoding of a floating-point value.  <a href=\"a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d\">floor</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer that is less then or equal to x.  <a href=\"a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gad0f444d4b81cc53c3b6edf5aa25078c2\">fma</a> (genType const &amp;a, genType const &amp;b, genType const &amp;c)</td></tr>\n<tr class=\"memdesc:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Computes and returns a * b + c.  <a href=\"a00140.html#gad0f444d4b81cc53c3b6edf5aa25078c2\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga8ba89e40e55ae5cdf228548f9b7639c7\">fract</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return x - floor(x).  <a href=\"a00140.html#ga8ba89e40e55ae5cdf228548f9b7639c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2df623004f634b440d61e018d62c751b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2df623004f634b440d61e018d62c751b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga2df623004f634b440d61e018d62c751b\">fract</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga2df623004f634b440d61e018d62c751b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return x - floor(x).  <a href=\"a00140.html#ga2df623004f634b440d61e018d62c751b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2df623004f634b440d61e018d62c751b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType , typename genIType &gt; </td></tr>\n<tr class=\"memitem:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga20620e83544d1a988857a3bc4ebe0e1d\">frexp</a> (genType const &amp;x, genIType &amp;exp)</td></tr>\n<tr class=\"memdesc:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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)  <a href=\"a00140.html#ga20620e83544d1a988857a3bc4ebe0e1d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga4fb7c21c2dce064b26fd9ccdaf9adcd4\">intBitsToFloat</a> (int const &amp;v)</td></tr>\n<tr class=\"memdesc:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a signed integer encoding of a floating-point value.  <a href=\"a00140.html#ga4fb7c21c2dce064b26fd9ccdaf9adcd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, float, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">intBitsToFloat</a> (vec&lt; L, int, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a signed integer encoding of a floating-point value.  <a href=\"a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2885587c23a106301f20443896365b62\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2885587c23a106301f20443896365b62\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga2885587c23a106301f20443896365b62\">isinf</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga2885587c23a106301f20443896365b62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a positive infinity or negative infinity representation in the underlying implementation's set of floating point representations.  <a href=\"a00140.html#ga2885587c23a106301f20443896365b62\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2885587c23a106301f20443896365b62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga29ef934c00306490de837b4746b4e14d\">isnan</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga29ef934c00306490de837b4746b4e14d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a NaN (not a number) representation in the underlying implementation's set of floating point representations.  <a href=\"a00140.html#ga29ef934c00306490de837b4746b4e14d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52e319d7289b849ec92055abd4830533\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType , typename genIType &gt; </td></tr>\n<tr class=\"memitem:ga52e319d7289b849ec92055abd4830533\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga52e319d7289b849ec92055abd4830533\">ldexp</a> (genType const &amp;x, genIType const &amp;exp)</td></tr>\n<tr class=\"memdesc:ga52e319d7289b849ec92055abd4830533\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a floating-point number from x and the corresponding integral exponent of two in exp, returning: significand * exp(2, exponent)  <a href=\"a00140.html#ga52e319d7289b849ec92055abd4830533\">More...</a><br /></td></tr>\n<tr class=\"separator:ga52e319d7289b849ec92055abd4830533\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga98caa7f95a94c86a86ebce893a45326c\">max</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00140.html#ga98caa7f95a94c86a86ebce893a45326c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gae8b0964d30deabd0867b8d7ac44f067e\">max</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00140.html#gae8b0964d30deabd0867b8d7ac44f067e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad48b723358c68d45477c22ff0101985e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad48b723358c68d45477c22ff0101985e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gad48b723358c68d45477c22ff0101985e\">max</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gad48b723358c68d45477c22ff0101985e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00140.html#gad48b723358c68d45477c22ff0101985e\">More...</a><br /></td></tr>\n<tr class=\"separator:gad48b723358c68d45477c22ff0101985e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga2c2bde1cec025b7ddff83c74a1113719\">min</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00140.html#ga2c2bde1cec025b7ddff83c74a1113719\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2d274e8b537c173dba983331a2620736\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2d274e8b537c173dba983331a2620736\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga2d274e8b537c173dba983331a2620736\">min</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:ga2d274e8b537c173dba983331a2620736\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00140.html#ga2d274e8b537c173dba983331a2620736\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2d274e8b537c173dba983331a2620736\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478\">min</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478\">More...</a><br /></td></tr>\n<tr class=\"separator:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genTypeT , typename genTypeU &gt; </td></tr>\n<tr class=\"memitem:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genTypeT&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a> (genTypeT x, genTypeT y, genTypeU a)</td></tr>\n<tr class=\"memdesc:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga12201563ef902e3b07e0d1d7656efdb1\">mod</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00140.html#ga12201563ef902e3b07e0d1d7656efdb1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gad32bcde4977c7a42c80468f4061a1f55\">mod</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00140.html#gad32bcde4977c7a42c80468f4061a1f55\">More...</a><br /></td></tr>\n<tr class=\"separator:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">mod</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga85e33f139b8db1b39b590a5713b9e679\">modf</a> (genType x, genType &amp;i)</td></tr>\n<tr class=\"memdesc:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the fractional part of x and sets i to the integer part (as a whole number floating point value).  <a href=\"a00140.html#ga85e33f139b8db1b39b590a5713b9e679\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gafa03aca8c4713e1cc892aa92ca135a7e\">round</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00140.html#gafa03aca8c4713e1cc892aa92ca135a7e\">More...</a><br /></td></tr>\n<tr class=\"separator:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga76b81785045a057989a84d99aeeb1578\">roundEven</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga76b81785045a057989a84d99aeeb1578\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00140.html#ga76b81785045a057989a84d99aeeb1578\">More...</a><br /></td></tr>\n<tr class=\"separator:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga1e2e5cfff800056540e32f6c9b604b28\">sign</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 1.0 if x &gt; 0, 0.0 if x == 0, or -1.0 if x &lt; 0.  <a href=\"a00140.html#ga1e2e5cfff800056540e32f6c9b604b28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga562edf7eca082cc5b7a0aaf180436daf\">smoothstep</a> (genType edge0, genType edge1, genType x)</td></tr>\n<tr class=\"memdesc:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt;= edge0 and 1.0 if x &gt;= edge1 and performs smooth Hermite interpolation between 0 and 1 when edge0 &lt; x &lt; edge1.  <a href=\"a00140.html#ga562edf7eca082cc5b7a0aaf180436daf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga015a1261ff23e12650211aa872863cce\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga015a1261ff23e12650211aa872863cce\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga015a1261ff23e12650211aa872863cce\">step</a> (genType edge, genType x)</td></tr>\n<tr class=\"memdesc:ga015a1261ff23e12650211aa872863cce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0 for each component of a genType.  <a href=\"a00140.html#ga015a1261ff23e12650211aa872863cce\">More...</a><br /></td></tr>\n<tr class=\"separator:ga015a1261ff23e12650211aa872863cce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga8f9a911a48ef244b51654eaefc81c551\">step</a> (T edge, vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0.  <a href=\"a00140.html#ga8f9a911a48ef244b51654eaefc81c551\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">step</a> (vec&lt; L, T, Q &gt; const &amp;edge, vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0.  <a href=\"a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gaf9375e3e06173271d49e6ffa3a334259\">trunc</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x whose absolute value is not larger than the absolute value of x.  <a href=\"a00140.html#gaf9375e3e06173271d49e6ffa3a334259\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gab2bae0d15dcdca6093f88f76b3975d97\">uintBitsToFloat</a> (uint const &amp;v)</td></tr>\n<tr class=\"memdesc:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value.  <a href=\"a00140.html#gab2bae0d15dcdca6093f88f76b3975d97\">More...</a><br /></td></tr>\n<tr class=\"separator:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, float, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga97f46b5f7b42fe44482e13356eb394ae\">uintBitsToFloat</a> (vec&lt; L, uint, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value.  <a href=\"a00140.html#ga97f46b5f7b42fe44482e13356eb394ae\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00015_source.html\">common.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00015_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: common.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">common.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00015.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00082.html\">detail/qualifier.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00106.html\">detail/type_int.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00002.html\">detail/_fixes.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga3e141c9738c73d3e581efa471dba8b4c\">abs</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga3e141c9738c73d3e581efa471dba8b4c\">abs</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga1e2e5cfff800056540e32f6c9b604b28\">sign</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d\">floor</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#gaf9375e3e06173271d49e6ffa3a334259\">trunc</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#gafa03aca8c4713e1cc892aa92ca135a7e\">round</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga76b81785045a057989a84d99aeeb1578\">roundEven</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#gafb9d2a645a23aca12d4d6de0104b7657\">ceil</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga2df623004f634b440d61e018d62c751b\">fract</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga2df623004f634b440d61e018d62c751b\">fract</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">mod</a>(genType x, genType y);</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">mod</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, T y);</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">mod</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga85e33f139b8db1b39b590a5713b9e679\">modf</a>(genType x, genType&amp; i);</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478\">min</a>(genType x, genType y);</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478\">min</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, T y);</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478\">min</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#gad48b723358c68d45477c22ff0101985e\">max</a>(genType x, genType y);</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#gad48b723358c68d45477c22ff0101985e\">max</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, T y);</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#gad48b723358c68d45477c22ff0101985e\">max</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga748333282a6f2f87762c0a4739c8c364\">clamp</a>(genType x, genType minVal, genType maxVal);</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga748333282a6f2f87762c0a4739c8c364\">clamp</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, T minVal, T maxVal);</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga748333282a6f2f87762c0a4739c8c364\">clamp</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; minVal, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; maxVal);</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;</div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genTypeT, <span class=\"keyword\">typename</span> genTypeU&gt;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;        GLM_FUNC_DECL genTypeT <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(genTypeT x, genTypeT y, genTypeU a);</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;</div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;L, U, Q&gt; <span class=\"keyword\">const</span>&amp; a);</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, U a);</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">step</a>(genType edge, genType x);</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">step</a>(T edge, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;</div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">step</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; edge, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga562edf7eca082cc5b7a0aaf180436daf\">smoothstep</a>(genType edge0, genType edge1, genType x);</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;</div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga562edf7eca082cc5b7a0aaf180436daf\">smoothstep</a>(T edge0, T edge1, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00140.html#ga562edf7eca082cc5b7a0aaf180436daf\">smoothstep</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; edge0, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; edge1, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;</div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00140.html#ga29ef934c00306490de837b4746b4e14d\">isnan</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;</div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00140.html#ga2885587c23a106301f20443896365b62\">isinf</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;</div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">floatBitsToInt</a>(<span class=\"keywordtype\">float</span> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;</div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;        GLM_FUNC_DECL vec&lt;L, int, Q&gt; <a class=\"code\" href=\"a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">floatBitsToInt</a>(vec&lt;L, float, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;</div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">floatBitsToUint</a>(<span class=\"keywordtype\">float</span> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;</div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00456\"></a><span class=\"lineno\">  456</span>&#160;        GLM_FUNC_DECL vec&lt;L, uint, Q&gt; <a class=\"code\" href=\"a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">floatBitsToUint</a>(vec&lt;L, float, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\">  457</span>&#160;</div>\n<div class=\"line\"><a name=\"l00466\"></a><span class=\"lineno\">  466</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">float</span> <a class=\"code\" href=\"a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">intBitsToFloat</a>(<span class=\"keywordtype\">int</span> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\">  467</span>&#160;</div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;        GLM_FUNC_DECL vec&lt;L, float, Q&gt; <a class=\"code\" href=\"a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">intBitsToFloat</a>(vec&lt;L, int, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;</div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">float</span> <a class=\"code\" href=\"a00140.html#ga97f46b5f7b42fe44482e13356eb394ae\">uintBitsToFloat</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;</div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;        GLM_FUNC_DECL vec&lt;L, float, Q&gt; <a class=\"code\" href=\"a00140.html#ga97f46b5f7b42fe44482e13356eb394ae\">uintBitsToFloat</a>(vec&lt;L, uint, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;</div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#gad0f444d4b81cc53c3b6edf5aa25078c2\">fma</a>(genType <span class=\"keyword\">const</span>&amp; a, genType <span class=\"keyword\">const</span>&amp; b, genType <span class=\"keyword\">const</span>&amp; c);</div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\">  514</span>&#160;</div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType, <span class=\"keyword\">typename</span> genIType&gt;</div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga20620e83544d1a988857a3bc4ebe0e1d\">frexp</a>(genType <span class=\"keyword\">const</span>&amp; x, genIType&amp; <a class=\"code\" href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">exp</a>);</div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;</div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType, <span class=\"keyword\">typename</span> genIType&gt;</div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00140.html#ga52e319d7289b849ec92055abd4830533\">ldexp</a>(genType <span class=\"keyword\">const</span>&amp; x, genIType <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">exp</a>);</div>\n<div class=\"line\"><a name=\"l00545\"></a><span class=\"lineno\">  545</span>&#160;</div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;</div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\">  549</span>&#160;<span class=\"preprocessor\">#include &quot;detail/func_common.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\">  550</span>&#160;</div>\n<div class=\"ttc\" id=\"a00140_html_ga1e2e5cfff800056540e32f6c9b604b28\"><div class=\"ttname\"><a href=\"a00140.html#ga1e2e5cfff800056540e32f6c9b604b28\">glm::sign</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; sign(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga76b81785045a057989a84d99aeeb1578\"><div class=\"ttname\"><a href=\"a00140.html#ga76b81785045a057989a84d99aeeb1578\">glm::roundEven</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; roundEven(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a value equal to the nearest integer to x. </div></div>\n<div class=\"ttc\" id=\"a00140_html_gaf9375e3e06173271d49e6ffa3a334259\"><div class=\"ttname\"><a href=\"a00140.html#gaf9375e3e06173271d49e6ffa3a334259\">glm::trunc</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; trunc(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a value equal to the nearest integer to x whose absolute value is not larger than the absolut...</div></div>\n<div class=\"ttc\" id=\"a00140_html_ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><div class=\"ttname\"><a href=\"a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">glm::intBitsToFloat</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, float, Q &gt; intBitsToFloat(vec&lt; L, int, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns a floating-point value corresponding to a signed integer encoding of a floating-point value...</div></div>\n<div class=\"ttc\" id=\"a00140_html_gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><div class=\"ttname\"><a href=\"a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">glm::step</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; step(vec&lt; L, T, Q &gt; const &amp;edge, vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns 0.0 if x < edge, otherwise it returns 1.0. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00140_html_gafa03aca8c4713e1cc892aa92ca135a7e\"><div class=\"ttname\"><a href=\"a00140.html#gafa03aca8c4713e1cc892aa92ca135a7e\">glm::round</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; round(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a value equal to the nearest integer to x. </div></div>\n<div class=\"ttc\" id=\"a00082_html\"><div class=\"ttname\"><a href=\"a00082.html\">qualifier.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00140_html_gaa9d0742639e85b29c7c5de11cfd6840d\"><div class=\"ttname\"><a href=\"a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d\">glm::floor</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; floor(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a value equal to the nearest integer that is less then or equal to x. </div></div>\n<div class=\"ttc\" id=\"a00106_html\"><div class=\"ttname\"><a href=\"a00106.html\">type_int.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga97f46b5f7b42fe44482e13356eb394ae\"><div class=\"ttname\"><a href=\"a00140.html#ga97f46b5f7b42fe44482e13356eb394ae\">glm::uintBitsToFloat</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, float, Q &gt; uintBitsToFloat(vec&lt; L, uint, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value...</div></div>\n<div class=\"ttc\" id=\"a00140_html_gafb9d2a645a23aca12d4d6de0104b7657\"><div class=\"ttname\"><a href=\"a00140.html#gafb9d2a645a23aca12d4d6de0104b7657\">glm::ceil</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; ceil(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a value equal to the nearest integer that is greater than or equal to x. </div></div>\n<div class=\"ttc\" id=\"a00140_html_gad0f444d4b81cc53c3b6edf5aa25078c2\"><div class=\"ttname\"><a href=\"a00140.html#gad0f444d4b81cc53c3b6edf5aa25078c2\">glm::fma</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType fma(genType const &amp;a, genType const &amp;b, genType const &amp;c)</div><div class=\"ttdoc\">Computes and returns a * b + c. </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga99f7d62f78ac5ea3b49bae715c9488ed\"><div class=\"ttname\"><a href=\"a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">glm::floatBitsToInt</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, int, Q &gt; floatBitsToInt(vec&lt; L, float, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns a signed integer value representing the encoding of a floating-point value. </div></div>\n<div class=\"ttc\" id=\"a00141_html_ga071566cadc7505455e611f2a0353f4d4\"><div class=\"ttname\"><a href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">glm::exp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; exp(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the natural exponentiation of x, i.e., e^x. </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga49418ba4c8a60fbbb5d57b705f3e26db\"><div class=\"ttname\"><a href=\"a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">glm::floatBitsToUint</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt; floatBitsToUint(vec&lt; L, float, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns a unsigned integer value representing the encoding of a floating-point value. </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga2885587c23a106301f20443896365b62\"><div class=\"ttname\"><a href=\"a00140.html#ga2885587c23a106301f20443896365b62\">glm::isinf</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; isinf(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns true if x holds a positive infinity or negative infinity representation in the underlying imp...</div></div>\n<div class=\"ttc\" id=\"a00140_html_gad48b723358c68d45477c22ff0101985e\"><div class=\"ttname\"><a href=\"a00140.html#gad48b723358c68d45477c22ff0101985e\">glm::max</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; max(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns y if x < y; otherwise, it returns x. </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga5f8acc481ba553dc0e6be1aedf1ee61c\"><div class=\"ttname\"><a href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">glm::mod</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; mod(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Modulus. </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga52e319d7289b849ec92055abd4830533\"><div class=\"ttname\"><a href=\"a00140.html#ga52e319d7289b849ec92055abd4830533\">glm::ldexp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType ldexp(genType const &amp;x, genIType const &amp;exp)</div><div class=\"ttdoc\">Builds a floating-point number from x and the corresponding integral exponent of two in exp...</div></div>\n<div class=\"ttc\" id=\"a00140_html_ga8e93f374aae27d1a88b921860351f8d4\"><div class=\"ttname\"><a href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a)</div><div class=\"ttdoc\">If genTypeU is a floating scalar or vector: Returns x * (1.0 - a) + y * a, i.e., the linear blend of ...</div></div>\n<div class=\"ttc\" id=\"a00140_html_ga734a374ca5c808e7bd9f74b6acfd7478\"><div class=\"ttname\"><a href=\"a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478\">glm::min</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; min(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns y if y < x; otherwise, it returns x. </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga85e33f139b8db1b39b590a5713b9e679\"><div class=\"ttname\"><a href=\"a00140.html#ga85e33f139b8db1b39b590a5713b9e679\">glm::modf</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType modf(genType x, genType &amp;i)</div><div class=\"ttdoc\">Returns the fractional part of x and sets i to the integer part (as a whole number floating point val...</div></div>\n<div class=\"ttc\" id=\"a00140_html_ga3e141c9738c73d3e581efa471dba8b4c\"><div class=\"ttname\"><a href=\"a00140.html#ga3e141c9738c73d3e581efa471dba8b4c\">glm::abs</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; abs(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns x if x >= 0; otherwise, it returns -x. </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga562edf7eca082cc5b7a0aaf180436daf\"><div class=\"ttname\"><a href=\"a00140.html#ga562edf7eca082cc5b7a0aaf180436daf\">glm::smoothstep</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType smoothstep(genType edge0, genType edge1, genType x)</div><div class=\"ttdoc\">Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and performs smooth Hermite interpolation between 0 a...</div></div>\n<div class=\"ttc\" id=\"a00140_html_ga29ef934c00306490de837b4746b4e14d\"><div class=\"ttname\"><a href=\"a00140.html#ga29ef934c00306490de837b4746b4e14d\">glm::isnan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; isnan(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns true if x holds a NaN (not a number) representation in the underlying implementation&#39;s set of...</div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00002_html\"><div class=\"ttname\"><a href=\"a00002.html\">_fixes.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga91ad9478d81a7aaf2593e8d9c3d06a14\"><div class=\"ttname\"><a href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">glm::uint</a></div><div class=\"ttdeci\">unsigned int uint</div><div class=\"ttdoc\">Unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00288\">type_int.hpp:288</a></div></div>\n<div class=\"ttc\" id=\"a00140_html_ga20620e83544d1a988857a3bc4ebe0e1d\"><div class=\"ttname\"><a href=\"a00140.html#ga20620e83544d1a988857a3bc4ebe0e1d\">glm::frexp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType frexp(genType const &amp;x, genIType &amp;exp)</div><div class=\"ttdoc\">Splits x into a floating-point significand in the range [0.5, 1.0) and an integral exponent of two...</div></div>\n<div class=\"ttc\" id=\"a00140_html_ga2df623004f634b440d61e018d62c751b\"><div class=\"ttname\"><a href=\"a00140.html#ga2df623004f634b440d61e018d62c751b\">glm::fract</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fract(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Return x - floor(x). </div></div>\n<div class=\"ttc\" id=\"a00140_html_ga748333282a6f2f87762c0a4739c8c364\"><div class=\"ttname\"><a href=\"a00140.html#ga748333282a6f2f87762c0a4739c8c364\">glm::clamp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; clamp(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;minVal, vec&lt; L, T, Q &gt; const &amp;maxVal)</div><div class=\"ttdoc\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal an...</div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00016.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: common.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/common.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00175.html\">GLM_GTX_common</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00016_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gae5e80425df9833164ad469e83b475fb4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae5e80425df9833164ad469e83b475fb4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00175.html#gae5e80425df9833164ad469e83b475fb4\">fmod</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gae5e80425df9833164ad469e83b475fb4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Similar to 'mod' but with a different rounding and integer support.  <a href=\"a00175.html#gae5e80425df9833164ad469e83b475fb4\">More...</a><br /></td></tr>\n<tr class=\"separator:gae5e80425df9833164ad469e83b475fb4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74aa7c7462245d83bd5a9edf9c6c2d91\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga74aa7c7462245d83bd5a9edf9c6c2d91\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::bool_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00175.html#ga74aa7c7462245d83bd5a9edf9c6c2d91\">isdenormal</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga74aa7c7462245d83bd5a9edf9c6c2d91\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x is a denormalized number Numbers whose absolute value is too small to be represented in the normal format are represented in an alternate, denormalized format.  <a href=\"a00175.html#ga74aa7c7462245d83bd5a9edf9c6c2d91\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74aa7c7462245d83bd5a9edf9c6c2d91\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00175.html\">GLM_GTX_common</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00016_source.html\">gtx/common.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00016_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: common.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/common.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00016.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependencies:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/vec1.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_common is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_common extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> genType::bool_type <a class=\"code\" href=\"a00175.html#ga74aa7c7462245d83bd5a9edf9c6c2d91\">isdenormal</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00175.html#gae5e80425df9833164ad469e83b475fb4\">fmod</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"preprocessor\">#include &quot;common.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00175_html_gae5e80425df9833164ad469e83b475fb4\"><div class=\"ttname\"><a href=\"a00175.html#gae5e80425df9833164ad469e83b475fb4\">glm::fmod</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fmod(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Similar to &#39;mod&#39; but with a different rounding and integer support. </div></div>\n<div class=\"ttc\" id=\"a00175_html_ga74aa7c7462245d83bd5a9edf9c6c2d91\"><div class=\"ttname\"><a href=\"a00175.html#ga74aa7c7462245d83bd5a9edf9c6c2d91\">glm::isdenormal</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType::bool_type isdenormal(genType const &amp;x)</div><div class=\"ttdoc\">Returns true if x is a denormalized number Numbers whose absolute value is too small to be represente...</div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00017.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: compatibility.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a> &#124;\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">compatibility.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00176.html\">GLM_GTX_compatibility</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00017_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gaddcd7aa2e30e61af5b38660613d3979e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaddcd7aa2e30e61af5b38660613d3979e\"></a>\ntypedef bool&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaddcd7aa2e30e61af5b38660613d3979e\">bool1</a></td></tr>\n<tr class=\"memdesc:gaddcd7aa2e30e61af5b38660613d3979e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean type with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaddcd7aa2e30e61af5b38660613d3979e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f895c936f0c29c8729afbbf22806090\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7f895c936f0c29c8729afbbf22806090\"></a>\ntypedef bool&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga7f895c936f0c29c8729afbbf22806090\">bool1x1</a></td></tr>\n<tr class=\"memdesc:ga7f895c936f0c29c8729afbbf22806090\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga7f895c936f0c29c8729afbbf22806090\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa09ab65ec9c3c54305ff502e2b1fe6d9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa09ab65ec9c3c54305ff502e2b1fe6d9\"></a>\ntypedef vec&lt; 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaa09ab65ec9c3c54305ff502e2b1fe6d9\">bool2</a></td></tr>\n<tr class=\"memdesc:gaa09ab65ec9c3c54305ff502e2b1fe6d9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean type with 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaa09ab65ec9c3c54305ff502e2b1fe6d9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadb3703955e513632f98ba12fe051ba3e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gadb3703955e513632f98ba12fe051ba3e\"></a>\ntypedef mat&lt; 2, 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gadb3703955e513632f98ba12fe051ba3e\">bool2x2</a></td></tr>\n<tr class=\"memdesc:gadb3703955e513632f98ba12fe051ba3e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gadb3703955e513632f98ba12fe051ba3e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ae6ee155d0f90cb1ae5b6c4546738a0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9ae6ee155d0f90cb1ae5b6c4546738a0\"></a>\ntypedef mat&lt; 2, 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga9ae6ee155d0f90cb1ae5b6c4546738a0\">bool2x3</a></td></tr>\n<tr class=\"memdesc:ga9ae6ee155d0f90cb1ae5b6c4546738a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga9ae6ee155d0f90cb1ae5b6c4546738a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d7fa65be8e8e4ad6d920b45c44e471f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4d7fa65be8e8e4ad6d920b45c44e471f\"></a>\ntypedef mat&lt; 2, 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4d7fa65be8e8e4ad6d920b45c44e471f\">bool2x4</a></td></tr>\n<tr class=\"memdesc:ga4d7fa65be8e8e4ad6d920b45c44e471f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga4d7fa65be8e8e4ad6d920b45c44e471f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99629f818737f342204071ef8296b2ed\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga99629f818737f342204071ef8296b2ed\"></a>\ntypedef vec&lt; 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga99629f818737f342204071ef8296b2ed\">bool3</a></td></tr>\n<tr class=\"memdesc:ga99629f818737f342204071ef8296b2ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean type with 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga99629f818737f342204071ef8296b2ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7d7311f7e0fa8b6163d96dab033a755\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac7d7311f7e0fa8b6163d96dab033a755\"></a>\ntypedef mat&lt; 3, 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac7d7311f7e0fa8b6163d96dab033a755\">bool3x2</a></td></tr>\n<tr class=\"memdesc:gac7d7311f7e0fa8b6163d96dab033a755\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gac7d7311f7e0fa8b6163d96dab033a755\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c97b99aac3e302053ffb58aace9033c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6c97b99aac3e302053ffb58aace9033c\"></a>\ntypedef mat&lt; 3, 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga6c97b99aac3e302053ffb58aace9033c\">bool3x3</a></td></tr>\n<tr class=\"memdesc:ga6c97b99aac3e302053ffb58aace9033c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga6c97b99aac3e302053ffb58aace9033c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae7d6b679463d37d6c527d478fb470fdf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae7d6b679463d37d6c527d478fb470fdf\"></a>\ntypedef mat&lt; 3, 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gae7d6b679463d37d6c527d478fb470fdf\">bool3x4</a></td></tr>\n<tr class=\"memdesc:gae7d6b679463d37d6c527d478fb470fdf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gae7d6b679463d37d6c527d478fb470fdf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga13c3200b82708f73faac6d7f09ec91a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga13c3200b82708f73faac6d7f09ec91a3\"></a>\ntypedef vec&lt; 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga13c3200b82708f73faac6d7f09ec91a3\">bool4</a></td></tr>\n<tr class=\"memdesc:ga13c3200b82708f73faac6d7f09ec91a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean type with 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga13c3200b82708f73faac6d7f09ec91a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ed830f52408b2f83c085063a3eaf1d0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9ed830f52408b2f83c085063a3eaf1d0\"></a>\ntypedef mat&lt; 4, 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga9ed830f52408b2f83c085063a3eaf1d0\">bool4x2</a></td></tr>\n<tr class=\"memdesc:ga9ed830f52408b2f83c085063a3eaf1d0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga9ed830f52408b2f83c085063a3eaf1d0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0f5dc7f22c2065b1b06d57f1c0658fe\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad0f5dc7f22c2065b1b06d57f1c0658fe\"></a>\ntypedef mat&lt; 4, 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gad0f5dc7f22c2065b1b06d57f1c0658fe\">bool4x3</a></td></tr>\n<tr class=\"memdesc:gad0f5dc7f22c2065b1b06d57f1c0658fe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gad0f5dc7f22c2065b1b06d57f1c0658fe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7d2a7d13986602ae2896bfaa394235d4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7d2a7d13986602ae2896bfaa394235d4\"></a>\ntypedef mat&lt; 4, 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga7d2a7d13986602ae2896bfaa394235d4\">bool4x4</a></td></tr>\n<tr class=\"memdesc:ga7d2a7d13986602ae2896bfaa394235d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga7d2a7d13986602ae2896bfaa394235d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20b861a9b6e2a300323671c57a02525b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga20b861a9b6e2a300323671c57a02525b\"></a>\ntypedef double&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga20b861a9b6e2a300323671c57a02525b\">double1</a></td></tr>\n<tr class=\"memdesc:ga20b861a9b6e2a300323671c57a02525b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga20b861a9b6e2a300323671c57a02525b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga45f16a4dd0db1f199afaed9fd12fe9a8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga45f16a4dd0db1f199afaed9fd12fe9a8\"></a>\ntypedef double&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga45f16a4dd0db1f199afaed9fd12fe9a8\">double1x1</a></td></tr>\n<tr class=\"memdesc:ga45f16a4dd0db1f199afaed9fd12fe9a8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga45f16a4dd0db1f199afaed9fd12fe9a8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31b729b04facccda73f07ed26958b3c2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga31b729b04facccda73f07ed26958b3c2\"></a>\ntypedef vec&lt; 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga31b729b04facccda73f07ed26958b3c2\">double2</a></td></tr>\n<tr class=\"memdesc:ga31b729b04facccda73f07ed26958b3c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga31b729b04facccda73f07ed26958b3c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae57d0201096834d25f2b91b319e7cdbd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae57d0201096834d25f2b91b319e7cdbd\"></a>\ntypedef mat&lt; 2, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gae57d0201096834d25f2b91b319e7cdbd\">double2x2</a></td></tr>\n<tr class=\"memdesc:gae57d0201096834d25f2b91b319e7cdbd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gae57d0201096834d25f2b91b319e7cdbd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3655bc324008553ca61f39952d0b2d08\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3655bc324008553ca61f39952d0b2d08\"></a>\ntypedef mat&lt; 2, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga3655bc324008553ca61f39952d0b2d08\">double2x3</a></td></tr>\n<tr class=\"memdesc:ga3655bc324008553ca61f39952d0b2d08\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga3655bc324008553ca61f39952d0b2d08\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacd33061fc64a7b2dcfd7322c49d9557a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gacd33061fc64a7b2dcfd7322c49d9557a\"></a>\ntypedef mat&lt; 2, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gacd33061fc64a7b2dcfd7322c49d9557a\">double2x4</a></td></tr>\n<tr class=\"memdesc:gacd33061fc64a7b2dcfd7322c49d9557a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gacd33061fc64a7b2dcfd7322c49d9557a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3d8b9028a1053a44a98902cd1c389472\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3d8b9028a1053a44a98902cd1c389472\"></a>\ntypedef vec&lt; 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga3d8b9028a1053a44a98902cd1c389472\">double3</a></td></tr>\n<tr class=\"memdesc:ga3d8b9028a1053a44a98902cd1c389472\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga3d8b9028a1053a44a98902cd1c389472\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5ec08fc39c9d783dfcc488be240fe975\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5ec08fc39c9d783dfcc488be240fe975\"></a>\ntypedef mat&lt; 3, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga5ec08fc39c9d783dfcc488be240fe975\">double3x2</a></td></tr>\n<tr class=\"memdesc:ga5ec08fc39c9d783dfcc488be240fe975\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga5ec08fc39c9d783dfcc488be240fe975\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4bad5bb20c6ddaecfe4006c93841d180\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4bad5bb20c6ddaecfe4006c93841d180\"></a>\ntypedef mat&lt; 3, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4bad5bb20c6ddaecfe4006c93841d180\">double3x3</a></td></tr>\n<tr class=\"memdesc:ga4bad5bb20c6ddaecfe4006c93841d180\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga4bad5bb20c6ddaecfe4006c93841d180\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ef022e453d663d70aec414b2a80f756\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga2ef022e453d663d70aec414b2a80f756\"></a>\ntypedef mat&lt; 3, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga2ef022e453d663d70aec414b2a80f756\">double3x4</a></td></tr>\n<tr class=\"memdesc:ga2ef022e453d663d70aec414b2a80f756\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga2ef022e453d663d70aec414b2a80f756\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf92f58af24f35617518aeb3d4f63fda6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf92f58af24f35617518aeb3d4f63fda6\"></a>\ntypedef vec&lt; 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaf92f58af24f35617518aeb3d4f63fda6\">double4</a></td></tr>\n<tr class=\"memdesc:gaf92f58af24f35617518aeb3d4f63fda6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaf92f58af24f35617518aeb3d4f63fda6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabca29ccceea53669618b751aae0ba83d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabca29ccceea53669618b751aae0ba83d\"></a>\ntypedef mat&lt; 4, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gabca29ccceea53669618b751aae0ba83d\">double4x2</a></td></tr>\n<tr class=\"memdesc:gabca29ccceea53669618b751aae0ba83d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gabca29ccceea53669618b751aae0ba83d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafad66a02ccd360c86d6ab9ff9cfbc19c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafad66a02ccd360c86d6ab9ff9cfbc19c\"></a>\ntypedef mat&lt; 4, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gafad66a02ccd360c86d6ab9ff9cfbc19c\">double4x3</a></td></tr>\n<tr class=\"memdesc:gafad66a02ccd360c86d6ab9ff9cfbc19c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gafad66a02ccd360c86d6ab9ff9cfbc19c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaab541bed2e788e4537852a2492860806\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaab541bed2e788e4537852a2492860806\"></a>\ntypedef mat&lt; 4, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaab541bed2e788e4537852a2492860806\">double4x4</a></td></tr>\n<tr class=\"memdesc:gaab541bed2e788e4537852a2492860806\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaab541bed2e788e4537852a2492860806\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5208d01f6c6fbcb7bb55d610b9c0ead\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf5208d01f6c6fbcb7bb55d610b9c0ead\"></a>\ntypedef float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaf5208d01f6c6fbcb7bb55d610b9c0ead\">float1</a></td></tr>\n<tr class=\"memdesc:gaf5208d01f6c6fbcb7bb55d610b9c0ead\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaf5208d01f6c6fbcb7bb55d610b9c0ead\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73720b8dc4620835b17f74d428f98c0c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga73720b8dc4620835b17f74d428f98c0c\"></a>\ntypedef float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga73720b8dc4620835b17f74d428f98c0c\">float1x1</a></td></tr>\n<tr class=\"memdesc:ga73720b8dc4620835b17f74d428f98c0c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga73720b8dc4620835b17f74d428f98c0c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga02d3c013982c183906c61d74aa3166ce\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga02d3c013982c183906c61d74aa3166ce\"></a>\ntypedef vec&lt; 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga02d3c013982c183906c61d74aa3166ce\">float2</a></td></tr>\n<tr class=\"memdesc:ga02d3c013982c183906c61d74aa3166ce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga02d3c013982c183906c61d74aa3166ce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga33d43ecbb60a85a1366ff83f8a0ec85f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga33d43ecbb60a85a1366ff83f8a0ec85f\"></a>\ntypedef mat&lt; 2, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga33d43ecbb60a85a1366ff83f8a0ec85f\">float2x2</a></td></tr>\n<tr class=\"memdesc:ga33d43ecbb60a85a1366ff83f8a0ec85f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga33d43ecbb60a85a1366ff83f8a0ec85f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga939b0cff15cee3030f75c1b2e36f89fe\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga939b0cff15cee3030f75c1b2e36f89fe\"></a>\ntypedef mat&lt; 2, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga939b0cff15cee3030f75c1b2e36f89fe\">float2x3</a></td></tr>\n<tr class=\"memdesc:ga939b0cff15cee3030f75c1b2e36f89fe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga939b0cff15cee3030f75c1b2e36f89fe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafec3cfd901ab334a92e0242b8f2269b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafec3cfd901ab334a92e0242b8f2269b4\"></a>\ntypedef mat&lt; 2, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gafec3cfd901ab334a92e0242b8f2269b4\">float2x4</a></td></tr>\n<tr class=\"memdesc:gafec3cfd901ab334a92e0242b8f2269b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gafec3cfd901ab334a92e0242b8f2269b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga821ff110fc8533a053cbfcc93e078cc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga821ff110fc8533a053cbfcc93e078cc0\"></a>\ntypedef vec&lt; 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga821ff110fc8533a053cbfcc93e078cc0\">float3</a></td></tr>\n<tr class=\"memdesc:ga821ff110fc8533a053cbfcc93e078cc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga821ff110fc8533a053cbfcc93e078cc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa6c69f04ba95f3faedf95dae874de576\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa6c69f04ba95f3faedf95dae874de576\"></a>\ntypedef mat&lt; 3, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaa6c69f04ba95f3faedf95dae874de576\">float3x2</a></td></tr>\n<tr class=\"memdesc:gaa6c69f04ba95f3faedf95dae874de576\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaa6c69f04ba95f3faedf95dae874de576\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6ceb5d38a58becdf420026e12a6562f3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6ceb5d38a58becdf420026e12a6562f3\"></a>\ntypedef mat&lt; 3, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga6ceb5d38a58becdf420026e12a6562f3\">float3x3</a></td></tr>\n<tr class=\"memdesc:ga6ceb5d38a58becdf420026e12a6562f3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga6ceb5d38a58becdf420026e12a6562f3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d2679c321b793ca3784fe0315bb5332\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4d2679c321b793ca3784fe0315bb5332\"></a>\ntypedef mat&lt; 3, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4d2679c321b793ca3784fe0315bb5332\">float3x4</a></td></tr>\n<tr class=\"memdesc:ga4d2679c321b793ca3784fe0315bb5332\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga4d2679c321b793ca3784fe0315bb5332\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae2da7345087db3815a25d8837a727ef1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae2da7345087db3815a25d8837a727ef1\"></a>\ntypedef vec&lt; 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gae2da7345087db3815a25d8837a727ef1\">float4</a></td></tr>\n<tr class=\"memdesc:gae2da7345087db3815a25d8837a727ef1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gae2da7345087db3815a25d8837a727ef1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga308b9af0c221145bcfe9bfc129d9098e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga308b9af0c221145bcfe9bfc129d9098e\"></a>\ntypedef mat&lt; 4, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga308b9af0c221145bcfe9bfc129d9098e\">float4x2</a></td></tr>\n<tr class=\"memdesc:ga308b9af0c221145bcfe9bfc129d9098e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga308b9af0c221145bcfe9bfc129d9098e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac0a51b4812038aa81d73ffcc37f741ac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac0a51b4812038aa81d73ffcc37f741ac\"></a>\ntypedef mat&lt; 4, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac0a51b4812038aa81d73ffcc37f741ac\">float4x3</a></td></tr>\n<tr class=\"memdesc:gac0a51b4812038aa81d73ffcc37f741ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gac0a51b4812038aa81d73ffcc37f741ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad3051649b3715d828a4ab92cdae7c3bf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad3051649b3715d828a4ab92cdae7c3bf\"></a>\ntypedef mat&lt; 4, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gad3051649b3715d828a4ab92cdae7c3bf\">float4x4</a></td></tr>\n<tr class=\"memdesc:gad3051649b3715d828a4ab92cdae7c3bf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gad3051649b3715d828a4ab92cdae7c3bf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0670a2111b5e4a6410bd027fa0232fc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0670a2111b5e4a6410bd027fa0232fc3\"></a>\ntypedef int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga0670a2111b5e4a6410bd027fa0232fc3\">int1</a></td></tr>\n<tr class=\"memdesc:ga0670a2111b5e4a6410bd027fa0232fc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer vector with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga0670a2111b5e4a6410bd027fa0232fc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga056ffe02d3a45af626f8e62221881c7a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga056ffe02d3a45af626f8e62221881c7a\"></a>\ntypedef int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga056ffe02d3a45af626f8e62221881c7a\">int1x1</a></td></tr>\n<tr class=\"memdesc:ga056ffe02d3a45af626f8e62221881c7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga056ffe02d3a45af626f8e62221881c7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafe3a8fd56354caafe24bfe1b1e3ad22a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafe3a8fd56354caafe24bfe1b1e3ad22a\"></a>\ntypedef vec&lt; 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gafe3a8fd56354caafe24bfe1b1e3ad22a\">int2</a></td></tr>\n<tr class=\"memdesc:gafe3a8fd56354caafe24bfe1b1e3ad22a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer vector with 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gafe3a8fd56354caafe24bfe1b1e3ad22a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4e5ce477c15836b21e3c42daac68554d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4e5ce477c15836b21e3c42daac68554d\"></a>\ntypedef mat&lt; 2, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4e5ce477c15836b21e3c42daac68554d\">int2x2</a></td></tr>\n<tr class=\"memdesc:ga4e5ce477c15836b21e3c42daac68554d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga4e5ce477c15836b21e3c42daac68554d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga197ded5ad8354f6b6fb91189d7a269b3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga197ded5ad8354f6b6fb91189d7a269b3\"></a>\ntypedef mat&lt; 2, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga197ded5ad8354f6b6fb91189d7a269b3\">int2x3</a></td></tr>\n<tr class=\"memdesc:ga197ded5ad8354f6b6fb91189d7a269b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga197ded5ad8354f6b6fb91189d7a269b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2749d59a7fddbac44f34ba78e57ef807\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga2749d59a7fddbac44f34ba78e57ef807\"></a>\ntypedef mat&lt; 2, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga2749d59a7fddbac44f34ba78e57ef807\">int2x4</a></td></tr>\n<tr class=\"memdesc:ga2749d59a7fddbac44f34ba78e57ef807\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga2749d59a7fddbac44f34ba78e57ef807\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga909c38a425f215a50c847145d7da09f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga909c38a425f215a50c847145d7da09f0\"></a>\ntypedef vec&lt; 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga909c38a425f215a50c847145d7da09f0\">int3</a></td></tr>\n<tr class=\"memdesc:ga909c38a425f215a50c847145d7da09f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer vector with 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga909c38a425f215a50c847145d7da09f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4cbe16a92cf3664376c7a2fc5126aa8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa4cbe16a92cf3664376c7a2fc5126aa8\"></a>\ntypedef mat&lt; 3, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaa4cbe16a92cf3664376c7a2fc5126aa8\">int3x2</a></td></tr>\n<tr class=\"memdesc:gaa4cbe16a92cf3664376c7a2fc5126aa8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaa4cbe16a92cf3664376c7a2fc5126aa8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga15c9649286f0bf431bdf9b3509580048\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga15c9649286f0bf431bdf9b3509580048\"></a>\ntypedef mat&lt; 3, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga15c9649286f0bf431bdf9b3509580048\">int3x3</a></td></tr>\n<tr class=\"memdesc:ga15c9649286f0bf431bdf9b3509580048\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga15c9649286f0bf431bdf9b3509580048\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaacac46ddc7d15d0f9529d05c92946a0f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaacac46ddc7d15d0f9529d05c92946a0f\"></a>\ntypedef mat&lt; 3, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaacac46ddc7d15d0f9529d05c92946a0f\">int3x4</a></td></tr>\n<tr class=\"memdesc:gaacac46ddc7d15d0f9529d05c92946a0f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaacac46ddc7d15d0f9529d05c92946a0f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaecdef18c819c205aeee9f94dc93de56a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaecdef18c819c205aeee9f94dc93de56a\"></a>\ntypedef vec&lt; 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaecdef18c819c205aeee9f94dc93de56a\">int4</a></td></tr>\n<tr class=\"memdesc:gaecdef18c819c205aeee9f94dc93de56a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer vector with 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaecdef18c819c205aeee9f94dc93de56a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97a39dd9bc7d572810d80b8467cbffa1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga97a39dd9bc7d572810d80b8467cbffa1\"></a>\ntypedef mat&lt; 4, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga97a39dd9bc7d572810d80b8467cbffa1\">int4x2</a></td></tr>\n<tr class=\"memdesc:ga97a39dd9bc7d572810d80b8467cbffa1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga97a39dd9bc7d572810d80b8467cbffa1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae4a2c53f14aeec9a17c2b81142b7e82d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae4a2c53f14aeec9a17c2b81142b7e82d\"></a>\ntypedef mat&lt; 4, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gae4a2c53f14aeec9a17c2b81142b7e82d\">int4x3</a></td></tr>\n<tr class=\"memdesc:gae4a2c53f14aeec9a17c2b81142b7e82d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gae4a2c53f14aeec9a17c2b81142b7e82d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04dee1552424198b8f58b377c2ee00d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga04dee1552424198b8f58b377c2ee00d8\"></a>\ntypedef mat&lt; 4, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga04dee1552424198b8f58b377c2ee00d8\">int4x4</a></td></tr>\n<tr class=\"memdesc:ga04dee1552424198b8f58b377c2ee00d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga04dee1552424198b8f58b377c2ee00d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gac63011205bf6d0be82589dc56dd26708\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gac63011205bf6d0be82589dc56dd26708\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac63011205bf6d0be82589dc56dd26708\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac63011205bf6d0be82589dc56dd26708\">atan2</a> (T x, T y)</td></tr>\n<tr class=\"memdesc:gac63011205bf6d0be82589dc56dd26708\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gac63011205bf6d0be82589dc56dd26708\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga83bc41bd6f89113ee8006576b12bfc50\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga83bc41bd6f89113ee8006576b12bfc50\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga83bc41bd6f89113ee8006576b12bfc50\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga83bc41bd6f89113ee8006576b12bfc50\">atan2</a> (const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y)</td></tr>\n<tr class=\"memdesc:ga83bc41bd6f89113ee8006576b12bfc50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga83bc41bd6f89113ee8006576b12bfc50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac39314f5087e7e51e592897cabbc1927\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gac39314f5087e7e51e592897cabbc1927\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac39314f5087e7e51e592897cabbc1927\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac39314f5087e7e51e592897cabbc1927\">atan2</a> (const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y)</td></tr>\n<tr class=\"memdesc:gac39314f5087e7e51e592897cabbc1927\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gac39314f5087e7e51e592897cabbc1927\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaba86c28da7bf5bdac64fecf7d56e8ff3\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaba86c28da7bf5bdac64fecf7d56e8ff3\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaba86c28da7bf5bdac64fecf7d56e8ff3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3\">atan2</a> (const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y)</td></tr>\n<tr class=\"memdesc:gaba86c28da7bf5bdac64fecf7d56e8ff3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaba86c28da7bf5bdac64fecf7d56e8ff3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4b04dcd3526996d68c1bfe17bfc8657\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaf4b04dcd3526996d68c1bfe17bfc8657\"></a>\ntemplate&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaf4b04dcd3526996d68c1bfe17bfc8657\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaf4b04dcd3526996d68c1bfe17bfc8657\">isfinite</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf4b04dcd3526996d68c1bfe17bfc8657\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaf4b04dcd3526996d68c1bfe17bfc8657\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac3b12b8ac3014418fe53c299478b6603\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gac3b12b8ac3014418fe53c299478b6603\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac3b12b8ac3014418fe53c299478b6603\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 1, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac3b12b8ac3014418fe53c299478b6603\">isfinite</a> (const vec&lt; 1, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:gac3b12b8ac3014418fe53c299478b6603\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gac3b12b8ac3014418fe53c299478b6603\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e76dc3e406ce6a4155c2b12a2e4b084\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga8e76dc3e406ce6a4155c2b12a2e4b084\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8e76dc3e406ce6a4155c2b12a2e4b084\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga8e76dc3e406ce6a4155c2b12a2e4b084\">isfinite</a> (const vec&lt; 2, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga8e76dc3e406ce6a4155c2b12a2e4b084\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga8e76dc3e406ce6a4155c2b12a2e4b084\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga929ef27f896d902c1771a2e5e150fc97\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga929ef27f896d902c1771a2e5e150fc97\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga929ef27f896d902c1771a2e5e150fc97\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga929ef27f896d902c1771a2e5e150fc97\">isfinite</a> (const vec&lt; 3, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga929ef27f896d902c1771a2e5e150fc97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga929ef27f896d902c1771a2e5e150fc97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga19925badbe10ce61df1d0de00be0b5ad\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga19925badbe10ce61df1d0de00be0b5ad\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga19925badbe10ce61df1d0de00be0b5ad\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga19925badbe10ce61df1d0de00be0b5ad\">isfinite</a> (const vec&lt; 4, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga19925badbe10ce61df1d0de00be0b5ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga19925badbe10ce61df1d0de00be0b5ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5494ba3a95ea6594c86fc75236886864\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga5494ba3a95ea6594c86fc75236886864\"></a>\ntemplate&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga5494ba3a95ea6594c86fc75236886864\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga5494ba3a95ea6594c86fc75236886864\">lerp</a> (T x, T y, T a)</td></tr>\n<tr class=\"memdesc:ga5494ba3a95ea6594c86fc75236886864\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga5494ba3a95ea6594c86fc75236886864\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa551c0a0e16d2d4608e49f7696df897f\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaa551c0a0e16d2d4608e49f7696df897f\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa551c0a0e16d2d4608e49f7696df897f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaa551c0a0e16d2d4608e49f7696df897f\">lerp</a> (const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y, T a)</td></tr>\n<tr class=\"memdesc:gaa551c0a0e16d2d4608e49f7696df897f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaa551c0a0e16d2d4608e49f7696df897f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga44a8b5fd776320f1713413dec959b32a\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga44a8b5fd776320f1713413dec959b32a\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga44a8b5fd776320f1713413dec959b32a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga44a8b5fd776320f1713413dec959b32a\">lerp</a> (const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y, T a)</td></tr>\n<tr class=\"memdesc:ga44a8b5fd776320f1713413dec959b32a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga44a8b5fd776320f1713413dec959b32a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga89ac8e000199292ec7875519d27e214b\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga89ac8e000199292ec7875519d27e214b\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga89ac8e000199292ec7875519d27e214b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga89ac8e000199292ec7875519d27e214b\">lerp</a> (const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, T a)</td></tr>\n<tr class=\"memdesc:ga89ac8e000199292ec7875519d27e214b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga89ac8e000199292ec7875519d27e214b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf68de5baf72d16135368b8ef4f841604\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaf68de5baf72d16135368b8ef4f841604\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf68de5baf72d16135368b8ef4f841604\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaf68de5baf72d16135368b8ef4f841604\">lerp</a> (const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y, const vec&lt; 2, T, Q &gt; &amp;a)</td></tr>\n<tr class=\"memdesc:gaf68de5baf72d16135368b8ef4f841604\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaf68de5baf72d16135368b8ef4f841604\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4ae1a616c8540a2649eab8e0cd051bb3\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga4ae1a616c8540a2649eab8e0cd051bb3\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4ae1a616c8540a2649eab8e0cd051bb3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4ae1a616c8540a2649eab8e0cd051bb3\">lerp</a> (const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y, const vec&lt; 3, T, Q &gt; &amp;a)</td></tr>\n<tr class=\"memdesc:ga4ae1a616c8540a2649eab8e0cd051bb3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga4ae1a616c8540a2649eab8e0cd051bb3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab5477ab69c40de4db5d58d3359529724\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gab5477ab69c40de4db5d58d3359529724\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab5477ab69c40de4db5d58d3359529724\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a> (const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, const vec&lt; 4, T, Q &gt; &amp;a)</td></tr>\n<tr class=\"memdesc:gab5477ab69c40de4db5d58d3359529724\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gab5477ab69c40de4db5d58d3359529724\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0fd09e616d122bc2ed9726682ffd44b7\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga0fd09e616d122bc2ed9726682ffd44b7\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0fd09e616d122bc2ed9726682ffd44b7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga0fd09e616d122bc2ed9726682ffd44b7\">saturate</a> (T x)</td></tr>\n<tr class=\"memdesc:ga0fd09e616d122bc2ed9726682ffd44b7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga0fd09e616d122bc2ed9726682ffd44b7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaee97b8001c794a78a44f5d59f62a8aba\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaee97b8001c794a78a44f5d59f62a8aba\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaee97b8001c794a78a44f5d59f62a8aba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaee97b8001c794a78a44f5d59f62a8aba\">saturate</a> (const vec&lt; 2, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:gaee97b8001c794a78a44f5d59f62a8aba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaee97b8001c794a78a44f5d59f62a8aba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39bfe3a421286ee31680d45c31ccc161\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga39bfe3a421286ee31680d45c31ccc161\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga39bfe3a421286ee31680d45c31ccc161\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga39bfe3a421286ee31680d45c31ccc161\">saturate</a> (const vec&lt; 3, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga39bfe3a421286ee31680d45c31ccc161\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga39bfe3a421286ee31680d45c31ccc161\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga356f8c3a7e7d6376d3d4b0a026407183\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga356f8c3a7e7d6376d3d4b0a026407183\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga356f8c3a7e7d6376d3d4b0a026407183\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183\">saturate</a> (const vec&lt; 4, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga356f8c3a7e7d6376d3d4b0a026407183\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga356f8c3a7e7d6376d3d4b0a026407183\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00176.html\">GLM_GTX_compatibility</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00017_source.html\">compatibility.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00017_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: compatibility.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">compatibility.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00017.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_compatibility is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_compatibility extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#       include &lt;cfloat&gt;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#elif GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#       include &lt;cmath&gt;</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#       if(GLM_PLATFORM &amp; GLM_PLATFORM_ANDROID)</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#               undef isfinite</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#endif//GLM_COMPILER</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga5494ba3a95ea6594c86fc75236886864\">   41</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt; GLM_FUNC_QUALIFIER T <a class=\"code\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a>(T x, T y, T a){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(x, y, a);}                                                                                                                                                                     </div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaa551c0a0e16d2d4608e49f7696df897f\">   42</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;2, T, Q&gt; <a class=\"code\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a>(<span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; y, T a){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(x, y, a);}                                                 </div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga44a8b5fd776320f1713413dec959b32a\">   44</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a>(<span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; y, T a){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(x, y, a);}                                                 </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga89ac8e000199292ec7875519d27e214b\">   45</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a>(<span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; y, T a){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(x, y, a);}                                                 </div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaf68de5baf72d16135368b8ef4f841604\">   46</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;2, T, Q&gt; <a class=\"code\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a>(<span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; y, <span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; a){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(x, y, a);}       </div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga4ae1a616c8540a2649eab8e0cd051bb3\">   47</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a>(<span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; y, <span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; a){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(x, y, a);}       </div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">   48</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a>(<span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; y, <span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; a){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a>(x, y, a);}       </div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga0fd09e616d122bc2ed9726682ffd44b7\">   50</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER T <a class=\"code\" href=\"a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183\">saturate</a>(T x){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">clamp</a>(x, T(0), T(1));}                                                                                                              </div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaee97b8001c794a78a44f5d59f62a8aba\">   51</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;2, T, Q&gt; <a class=\"code\" href=\"a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183\">saturate</a>(<span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; x){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">clamp</a>(x, T(0), T(1));}                                 </div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga39bfe3a421286ee31680d45c31ccc161\">   52</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183\">saturate</a>(<span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; x){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">clamp</a>(x, T(0), T(1));}                                 </div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183\">   53</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183\">saturate</a>(<span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; x){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">clamp</a>(x, T(0), T(1));}                                 </div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gac63011205bf6d0be82589dc56dd26708\">   55</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER T <a class=\"code\" href=\"a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3\">atan2</a>(T x, T y){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">atan</a>(x, y);}                                                                                                                              </div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga83bc41bd6f89113ee8006576b12bfc50\">   56</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;2, T, Q&gt; <a class=\"code\" href=\"a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3\">atan2</a>(<span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; y){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">atan</a>(x, y);}       </div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gac39314f5087e7e51e592897cabbc1927\">   57</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3\">atan2</a>(<span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; y){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">atan</a>(x, y);}       </div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3\">   58</a></span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_QUALIFIER vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3\">atan2</a>(<span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; x, <span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; y){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">atan</a>(x, y);}       </div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00176.html#ga19925badbe10ce61df1d0de00be0b5ad\">isfinite</a>(genType <span class=\"keyword\">const</span>&amp; x);                                                                                       </div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_DECL vec&lt;1, bool, Q&gt; <a class=\"code\" href=\"a00176.html#ga19925badbe10ce61df1d0de00be0b5ad\">isfinite</a>(<span class=\"keyword\">const</span> vec&lt;1, T, Q&gt;&amp; x);                                </div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_DECL vec&lt;2, bool, Q&gt; <a class=\"code\" href=\"a00176.html#ga19925badbe10ce61df1d0de00be0b5ad\">isfinite</a>(<span class=\"keyword\">const</span> vec&lt;2, T, Q&gt;&amp; x);                                </div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_DECL vec&lt;3, bool, Q&gt; <a class=\"code\" href=\"a00176.html#ga19925badbe10ce61df1d0de00be0b5ad\">isfinite</a>(<span class=\"keyword\">const</span> vec&lt;3, T, Q&gt;&amp; x);                                </div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00176.html#ga19925badbe10ce61df1d0de00be0b5ad\">isfinite</a>(<span class=\"keyword\">const</span> vec&lt;4, T, Q&gt;&amp; x);                                </div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaddcd7aa2e30e61af5b38660613d3979e\">   66</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">bool</span>                                            <a class=\"code\" href=\"a00176.html#gaddcd7aa2e30e61af5b38660613d3979e\">bool1</a>;                  </div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaa09ab65ec9c3c54305ff502e2b1fe6d9\">   67</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, highp&gt;                     <a class=\"code\" href=\"a00176.html#gaa09ab65ec9c3c54305ff502e2b1fe6d9\">bool2</a>;                  </div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga99629f818737f342204071ef8296b2ed\">   68</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, highp&gt;                     <a class=\"code\" href=\"a00176.html#ga99629f818737f342204071ef8296b2ed\">bool3</a>;                  </div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga13c3200b82708f73faac6d7f09ec91a3\">   69</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, highp&gt;                     <a class=\"code\" href=\"a00176.html#ga13c3200b82708f73faac6d7f09ec91a3\">bool4</a>;                  </div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga7f895c936f0c29c8729afbbf22806090\">   71</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">bool</span>                                            <a class=\"code\" href=\"a00176.html#ga7f895c936f0c29c8729afbbf22806090\">bool1x1</a>;                </div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gadb3703955e513632f98ba12fe051ba3e\">   72</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#gadb3703955e513632f98ba12fe051ba3e\">bool2x2</a>;                </div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga9ae6ee155d0f90cb1ae5b6c4546738a0\">   73</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#ga9ae6ee155d0f90cb1ae5b6c4546738a0\">bool2x3</a>;                </div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga4d7fa65be8e8e4ad6d920b45c44e471f\">   74</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#ga4d7fa65be8e8e4ad6d920b45c44e471f\">bool2x4</a>;                </div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gac7d7311f7e0fa8b6163d96dab033a755\">   75</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#gac7d7311f7e0fa8b6163d96dab033a755\">bool3x2</a>;                </div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga6c97b99aac3e302053ffb58aace9033c\">   76</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#ga6c97b99aac3e302053ffb58aace9033c\">bool3x3</a>;                </div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gae7d6b679463d37d6c527d478fb470fdf\">   77</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#gae7d6b679463d37d6c527d478fb470fdf\">bool3x4</a>;                </div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga9ed830f52408b2f83c085063a3eaf1d0\">   78</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#ga9ed830f52408b2f83c085063a3eaf1d0\">bool4x2</a>;                </div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gad0f5dc7f22c2065b1b06d57f1c0658fe\">   79</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#gad0f5dc7f22c2065b1b06d57f1c0658fe\">bool4x3</a>;                </div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga7d2a7d13986602ae2896bfaa394235d4\">   80</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, bool, highp&gt;          <a class=\"code\" href=\"a00176.html#ga7d2a7d13986602ae2896bfaa394235d4\">bool4x4</a>;                </div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga0670a2111b5e4a6410bd027fa0232fc3\">   82</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">int</span>                                                     <a class=\"code\" href=\"a00176.html#ga0670a2111b5e4a6410bd027fa0232fc3\">int1</a>;                   </div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gafe3a8fd56354caafe24bfe1b1e3ad22a\">   83</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, highp&gt;                      <a class=\"code\" href=\"a00176.html#gafe3a8fd56354caafe24bfe1b1e3ad22a\">int2</a>;                   </div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga909c38a425f215a50c847145d7da09f0\">   84</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, highp&gt;                      <a class=\"code\" href=\"a00176.html#ga909c38a425f215a50c847145d7da09f0\">int3</a>;                   </div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaecdef18c819c205aeee9f94dc93de56a\">   85</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, highp&gt;                      <a class=\"code\" href=\"a00176.html#gaecdef18c819c205aeee9f94dc93de56a\">int4</a>;                   </div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga056ffe02d3a45af626f8e62221881c7a\">   87</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">int</span>                                                     <a class=\"code\" href=\"a00176.html#ga056ffe02d3a45af626f8e62221881c7a\">int1x1</a>;                 </div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga4e5ce477c15836b21e3c42daac68554d\">   88</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, int, highp&gt;           <a class=\"code\" href=\"a00176.html#ga4e5ce477c15836b21e3c42daac68554d\">int2x2</a>;                 </div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga197ded5ad8354f6b6fb91189d7a269b3\">   89</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, int, highp&gt;           <a class=\"code\" href=\"a00176.html#ga197ded5ad8354f6b6fb91189d7a269b3\">int2x3</a>;                 </div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga2749d59a7fddbac44f34ba78e57ef807\">   90</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, int, highp&gt;           <a class=\"code\" href=\"a00176.html#ga2749d59a7fddbac44f34ba78e57ef807\">int2x4</a>;                 </div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaa4cbe16a92cf3664376c7a2fc5126aa8\">   91</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, int, highp&gt;           <a class=\"code\" href=\"a00176.html#gaa4cbe16a92cf3664376c7a2fc5126aa8\">int3x2</a>;                 </div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga15c9649286f0bf431bdf9b3509580048\">   92</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, int, highp&gt;           <a class=\"code\" href=\"a00176.html#ga15c9649286f0bf431bdf9b3509580048\">int3x3</a>;                 </div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaacac46ddc7d15d0f9529d05c92946a0f\">   93</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, int, highp&gt;           <a class=\"code\" href=\"a00176.html#gaacac46ddc7d15d0f9529d05c92946a0f\">int3x4</a>;                 </div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga97a39dd9bc7d572810d80b8467cbffa1\">   94</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, int, highp&gt;           <a class=\"code\" href=\"a00176.html#ga97a39dd9bc7d572810d80b8467cbffa1\">int4x2</a>;                 </div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gae4a2c53f14aeec9a17c2b81142b7e82d\">   95</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, int, highp&gt;           <a class=\"code\" href=\"a00176.html#gae4a2c53f14aeec9a17c2b81142b7e82d\">int4x3</a>;                 </div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga04dee1552424198b8f58b377c2ee00d8\">   96</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, int, highp&gt;           <a class=\"code\" href=\"a00176.html#ga04dee1552424198b8f58b377c2ee00d8\">int4x4</a>;                 </div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaf5208d01f6c6fbcb7bb55d610b9c0ead\">   98</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">float</span>                                           <a class=\"code\" href=\"a00176.html#gaf5208d01f6c6fbcb7bb55d610b9c0ead\">float1</a>;                 </div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga02d3c013982c183906c61d74aa3166ce\">   99</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, highp&gt;            <a class=\"code\" href=\"a00176.html#ga02d3c013982c183906c61d74aa3166ce\">float2</a>;                 </div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga821ff110fc8533a053cbfcc93e078cc0\">  100</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, highp&gt;            <a class=\"code\" href=\"a00176.html#ga821ff110fc8533a053cbfcc93e078cc0\">float3</a>;                 </div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gae2da7345087db3815a25d8837a727ef1\">  101</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, highp&gt;            <a class=\"code\" href=\"a00176.html#gae2da7345087db3815a25d8837a727ef1\">float4</a>;                 </div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga73720b8dc4620835b17f74d428f98c0c\">  103</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">float</span>                                           <a class=\"code\" href=\"a00176.html#ga73720b8dc4620835b17f74d428f98c0c\">float1x1</a>;               </div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga33d43ecbb60a85a1366ff83f8a0ec85f\">  104</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, highp&gt;         <a class=\"code\" href=\"a00176.html#ga33d43ecbb60a85a1366ff83f8a0ec85f\">float2x2</a>;               </div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga939b0cff15cee3030f75c1b2e36f89fe\">  105</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, float, highp&gt;         <a class=\"code\" href=\"a00176.html#ga939b0cff15cee3030f75c1b2e36f89fe\">float2x3</a>;               </div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gafec3cfd901ab334a92e0242b8f2269b4\">  106</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, float, highp&gt;         <a class=\"code\" href=\"a00176.html#gafec3cfd901ab334a92e0242b8f2269b4\">float2x4</a>;               </div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaa6c69f04ba95f3faedf95dae874de576\">  107</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, float, highp&gt;         <a class=\"code\" href=\"a00176.html#gaa6c69f04ba95f3faedf95dae874de576\">float3x2</a>;               </div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga6ceb5d38a58becdf420026e12a6562f3\">  108</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, highp&gt;         <a class=\"code\" href=\"a00176.html#ga6ceb5d38a58becdf420026e12a6562f3\">float3x3</a>;               </div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga4d2679c321b793ca3784fe0315bb5332\">  109</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, float, highp&gt;         <a class=\"code\" href=\"a00176.html#ga4d2679c321b793ca3784fe0315bb5332\">float3x4</a>;               </div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga308b9af0c221145bcfe9bfc129d9098e\">  110</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, float, highp&gt;         <a class=\"code\" href=\"a00176.html#ga308b9af0c221145bcfe9bfc129d9098e\">float4x2</a>;               </div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gac0a51b4812038aa81d73ffcc37f741ac\">  111</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, float, highp&gt;         <a class=\"code\" href=\"a00176.html#gac0a51b4812038aa81d73ffcc37f741ac\">float4x3</a>;               </div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gad3051649b3715d828a4ab92cdae7c3bf\">  112</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, highp&gt;         <a class=\"code\" href=\"a00176.html#gad3051649b3715d828a4ab92cdae7c3bf\">float4x4</a>;               </div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga20b861a9b6e2a300323671c57a02525b\">  114</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">double</span>                                          <a class=\"code\" href=\"a00176.html#ga20b861a9b6e2a300323671c57a02525b\">double1</a>;                </div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga31b729b04facccda73f07ed26958b3c2\">  115</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, highp&gt;           <a class=\"code\" href=\"a00176.html#ga31b729b04facccda73f07ed26958b3c2\">double2</a>;                </div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga3d8b9028a1053a44a98902cd1c389472\">  116</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, highp&gt;           <a class=\"code\" href=\"a00176.html#ga3d8b9028a1053a44a98902cd1c389472\">double3</a>;                </div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaf92f58af24f35617518aeb3d4f63fda6\">  117</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, highp&gt;           <a class=\"code\" href=\"a00176.html#gaf92f58af24f35617518aeb3d4f63fda6\">double4</a>;                </div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga45f16a4dd0db1f199afaed9fd12fe9a8\">  119</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">double</span>                                          <a class=\"code\" href=\"a00176.html#ga45f16a4dd0db1f199afaed9fd12fe9a8\">double1x1</a>;              </div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gae57d0201096834d25f2b91b319e7cdbd\">  120</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, double, highp&gt;                <a class=\"code\" href=\"a00176.html#gae57d0201096834d25f2b91b319e7cdbd\">double2x2</a>;              </div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga3655bc324008553ca61f39952d0b2d08\">  121</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, double, highp&gt;                <a class=\"code\" href=\"a00176.html#ga3655bc324008553ca61f39952d0b2d08\">double2x3</a>;              </div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gacd33061fc64a7b2dcfd7322c49d9557a\">  122</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, double, highp&gt;                <a class=\"code\" href=\"a00176.html#gacd33061fc64a7b2dcfd7322c49d9557a\">double2x4</a>;              </div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga5ec08fc39c9d783dfcc488be240fe975\">  123</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, double, highp&gt;                <a class=\"code\" href=\"a00176.html#ga5ec08fc39c9d783dfcc488be240fe975\">double3x2</a>;              </div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga4bad5bb20c6ddaecfe4006c93841d180\">  124</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, double, highp&gt;                <a class=\"code\" href=\"a00176.html#ga4bad5bb20c6ddaecfe4006c93841d180\">double3x3</a>;              </div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#ga2ef022e453d663d70aec414b2a80f756\">  125</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, double, highp&gt;                <a class=\"code\" href=\"a00176.html#ga2ef022e453d663d70aec414b2a80f756\">double3x4</a>;              </div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gabca29ccceea53669618b751aae0ba83d\">  126</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, double, highp&gt;                <a class=\"code\" href=\"a00176.html#gabca29ccceea53669618b751aae0ba83d\">double4x2</a>;              </div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gafad66a02ccd360c86d6ab9ff9cfbc19c\">  127</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, double, highp&gt;                <a class=\"code\" href=\"a00176.html#gafad66a02ccd360c86d6ab9ff9cfbc19c\">double4x3</a>;              </div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00176.html#gaab541bed2e788e4537852a2492860806\">  128</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, double, highp&gt;                <a class=\"code\" href=\"a00176.html#gaab541bed2e788e4537852a2492860806\">double4x4</a>;              </div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;<span class=\"preprocessor\">#include &quot;compatibility.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00176_html_ga2749d59a7fddbac44f34ba78e57ef807\"><div class=\"ttname\"><a href=\"a00176.html#ga2749d59a7fddbac44f34ba78e57ef807\">glm::int2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, int, highp &gt; int2x4</div><div class=\"ttdoc\">integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00090\">compatibility.hpp:90</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga6ceb5d38a58becdf420026e12a6562f3\"><div class=\"ttname\"><a href=\"a00176.html#ga6ceb5d38a58becdf420026e12a6562f3\">glm::float3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, highp &gt; float3x3</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00108\">compatibility.hpp:108</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gaa4cbe16a92cf3664376c7a2fc5126aa8\"><div class=\"ttname\"><a href=\"a00176.html#gaa4cbe16a92cf3664376c7a2fc5126aa8\">glm::int3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, int, highp &gt; int3x2</div><div class=\"ttdoc\">integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00091\">compatibility.hpp:91</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga056ffe02d3a45af626f8e62221881c7a\"><div class=\"ttname\"><a href=\"a00176.html#ga056ffe02d3a45af626f8e62221881c7a\">glm::int1x1</a></div><div class=\"ttdeci\">int int1x1</div><div class=\"ttdoc\">integer matrix with 1 component. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00087\">compatibility.hpp:87</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gad3051649b3715d828a4ab92cdae7c3bf\"><div class=\"ttname\"><a href=\"a00176.html#gad3051649b3715d828a4ab92cdae7c3bf\">glm::float4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, highp &gt; float4x4</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00112\">compatibility.hpp:112</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga4bad5bb20c6ddaecfe4006c93841d180\"><div class=\"ttname\"><a href=\"a00176.html#ga4bad5bb20c6ddaecfe4006c93841d180\">glm::double3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, double, highp &gt; double3x3</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00124\">compatibility.hpp:124</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga4e5ce477c15836b21e3c42daac68554d\"><div class=\"ttname\"><a href=\"a00176.html#ga4e5ce477c15836b21e3c42daac68554d\">glm::int2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, int, highp &gt; int2x2</div><div class=\"ttdoc\">integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00088\">compatibility.hpp:88</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga3d8b9028a1053a44a98902cd1c389472\"><div class=\"ttname\"><a href=\"a00176.html#ga3d8b9028a1053a44a98902cd1c389472\">glm::double3</a></div><div class=\"ttdeci\">vec&lt; 3, double, highp &gt; double3</div><div class=\"ttdoc\">double-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00116\">compatibility.hpp:116</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga0670a2111b5e4a6410bd027fa0232fc3\"><div class=\"ttname\"><a href=\"a00176.html#ga0670a2111b5e4a6410bd027fa0232fc3\">glm::int1</a></div><div class=\"ttdeci\">int int1</div><div class=\"ttdoc\">integer vector with 1 component. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00082\">compatibility.hpp:82</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gaddcd7aa2e30e61af5b38660613d3979e\"><div class=\"ttname\"><a href=\"a00176.html#gaddcd7aa2e30e61af5b38660613d3979e\">glm::bool1</a></div><div class=\"ttdeci\">bool bool1</div><div class=\"ttdoc\">boolean type with 1 component. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00066\">compatibility.hpp:66</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga31b729b04facccda73f07ed26958b3c2\"><div class=\"ttname\"><a href=\"a00176.html#ga31b729b04facccda73f07ed26958b3c2\">glm::double2</a></div><div class=\"ttdeci\">vec&lt; 2, double, highp &gt; double2</div><div class=\"ttdoc\">double-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00115\">compatibility.hpp:115</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga9ae6ee155d0f90cb1ae5b6c4546738a0\"><div class=\"ttname\"><a href=\"a00176.html#ga9ae6ee155d0f90cb1ae5b6c4546738a0\">glm::bool2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, bool, highp &gt; bool2x3</div><div class=\"ttdoc\">boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00073\">compatibility.hpp:73</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga7d2a7d13986602ae2896bfaa394235d4\"><div class=\"ttname\"><a href=\"a00176.html#ga7d2a7d13986602ae2896bfaa394235d4\">glm::bool4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, bool, highp &gt; bool4x4</div><div class=\"ttdoc\">boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00080\">compatibility.hpp:80</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gab5477ab69c40de4db5d58d3359529724\"><div class=\"ttname\"><a href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">glm::lerp</a></div><div class=\"ttdeci\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt; lerp(const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, const vec&lt; 4, T, Q &gt; &amp;a)</div><div class=\"ttdoc\">Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using v...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00048\">compatibility.hpp:48</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga02d3c013982c183906c61d74aa3166ce\"><div class=\"ttname\"><a href=\"a00176.html#ga02d3c013982c183906c61d74aa3166ce\">glm::float2</a></div><div class=\"ttdeci\">vec&lt; 2, float, highp &gt; float2</div><div class=\"ttdoc\">single-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00099\">compatibility.hpp:99</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga7f895c936f0c29c8729afbbf22806090\"><div class=\"ttname\"><a href=\"a00176.html#ga7f895c936f0c29c8729afbbf22806090\">glm::bool1x1</a></div><div class=\"ttdeci\">bool bool1x1</div><div class=\"ttdoc\">boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00071\">compatibility.hpp:71</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga9ed830f52408b2f83c085063a3eaf1d0\"><div class=\"ttname\"><a href=\"a00176.html#ga9ed830f52408b2f83c085063a3eaf1d0\">glm::bool4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, bool, highp &gt; bool4x2</div><div class=\"ttdoc\">boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00078\">compatibility.hpp:78</a></div></div>\n<div class=\"ttc\" id=\"a00232_html_gac61629f3a4aa14057e7a8cae002291db\"><div class=\"ttname\"><a href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">glm::atan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; atan(vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Arc tangent. </div></div>\n<div class=\"ttc\" id=\"a00176_html_gac0a51b4812038aa81d73ffcc37f741ac\"><div class=\"ttname\"><a href=\"a00176.html#gac0a51b4812038aa81d73ffcc37f741ac\">glm::float4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, float, highp &gt; float4x3</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00111\">compatibility.hpp:111</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga939b0cff15cee3030f75c1b2e36f89fe\"><div class=\"ttname\"><a href=\"a00176.html#ga939b0cff15cee3030f75c1b2e36f89fe\">glm::float2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, float, highp &gt; float2x3</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00105\">compatibility.hpp:105</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga99629f818737f342204071ef8296b2ed\"><div class=\"ttname\"><a href=\"a00176.html#ga99629f818737f342204071ef8296b2ed\">glm::bool3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, highp &gt; bool3</div><div class=\"ttdoc\">boolean type with 3 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00068\">compatibility.hpp:68</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga33d43ecbb60a85a1366ff83f8a0ec85f\"><div class=\"ttname\"><a href=\"a00176.html#ga33d43ecbb60a85a1366ff83f8a0ec85f\">glm::float2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, highp &gt; float2x2</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00104\">compatibility.hpp:104</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga13c3200b82708f73faac6d7f09ec91a3\"><div class=\"ttname\"><a href=\"a00176.html#ga13c3200b82708f73faac6d7f09ec91a3\">glm::bool4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, highp &gt; bool4</div><div class=\"ttdoc\">boolean type with 4 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00069\">compatibility.hpp:69</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gae2da7345087db3815a25d8837a727ef1\"><div class=\"ttname\"><a href=\"a00176.html#gae2da7345087db3815a25d8837a727ef1\">glm::float4</a></div><div class=\"ttdeci\">vec&lt; 4, float, highp &gt; float4</div><div class=\"ttdoc\">single-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00101\">compatibility.hpp:101</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga2ef022e453d663d70aec414b2a80f756\"><div class=\"ttname\"><a href=\"a00176.html#ga2ef022e453d663d70aec414b2a80f756\">glm::double3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, double, highp &gt; double3x4</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00125\">compatibility.hpp:125</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga45f16a4dd0db1f199afaed9fd12fe9a8\"><div class=\"ttname\"><a href=\"a00176.html#ga45f16a4dd0db1f199afaed9fd12fe9a8\">glm::double1x1</a></div><div class=\"ttdeci\">double double1x1</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00119\">compatibility.hpp:119</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gacd33061fc64a7b2dcfd7322c49d9557a\"><div class=\"ttname\"><a href=\"a00176.html#gacd33061fc64a7b2dcfd7322c49d9557a\">glm::double2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, double, highp &gt; double2x4</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00122\">compatibility.hpp:122</a></div></div>\n<div class=\"ttc\" id=\"a00140_html_ga93bce26c7d80d30a62f5c508f8498a6c\"><div class=\"ttname\"><a href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">glm::clamp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType clamp(genType x, genType minVal, genType maxVal)</div><div class=\"ttdoc\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal an...</div></div>\n<div class=\"ttc\" id=\"a00176_html_gaa6c69f04ba95f3faedf95dae874de576\"><div class=\"ttname\"><a href=\"a00176.html#gaa6c69f04ba95f3faedf95dae874de576\">glm::float3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, float, highp &gt; float3x2</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00107\">compatibility.hpp:107</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga5ec08fc39c9d783dfcc488be240fe975\"><div class=\"ttname\"><a href=\"a00176.html#ga5ec08fc39c9d783dfcc488be240fe975\">glm::double3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, double, highp &gt; double3x2</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00123\">compatibility.hpp:123</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gaacac46ddc7d15d0f9529d05c92946a0f\"><div class=\"ttname\"><a href=\"a00176.html#gaacac46ddc7d15d0f9529d05c92946a0f\">glm::int3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, int, highp &gt; int3x4</div><div class=\"ttdoc\">integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00093\">compatibility.hpp:93</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gaecdef18c819c205aeee9f94dc93de56a\"><div class=\"ttname\"><a href=\"a00176.html#gaecdef18c819c205aeee9f94dc93de56a\">glm::int4</a></div><div class=\"ttdeci\">vec&lt; 4, int, highp &gt; int4</div><div class=\"ttdoc\">integer vector with 4 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00085\">compatibility.hpp:85</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga3655bc324008553ca61f39952d0b2d08\"><div class=\"ttname\"><a href=\"a00176.html#ga3655bc324008553ca61f39952d0b2d08\">glm::double2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, double, highp &gt; double2x3</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00121\">compatibility.hpp:121</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga4d7fa65be8e8e4ad6d920b45c44e471f\"><div class=\"ttname\"><a href=\"a00176.html#ga4d7fa65be8e8e4ad6d920b45c44e471f\">glm::bool2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, bool, highp &gt; bool2x4</div><div class=\"ttdoc\">boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00074\">compatibility.hpp:74</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga308b9af0c221145bcfe9bfc129d9098e\"><div class=\"ttname\"><a href=\"a00176.html#ga308b9af0c221145bcfe9bfc129d9098e\">glm::float4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, float, highp &gt; float4x2</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00110\">compatibility.hpp:110</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gabca29ccceea53669618b751aae0ba83d\"><div class=\"ttname\"><a href=\"a00176.html#gabca29ccceea53669618b751aae0ba83d\">glm::double4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, double, highp &gt; double4x2</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00126\">compatibility.hpp:126</a></div></div>\n<div class=\"ttc\" id=\"a00140_html_ga8e93f374aae27d1a88b921860351f8d4\"><div class=\"ttname\"><a href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a)</div><div class=\"ttdoc\">If genTypeU is a floating scalar or vector: Returns x * (1.0 - a) + y * a, i.e., the linear blend of ...</div></div>\n<div class=\"ttc\" id=\"a00176_html_gae57d0201096834d25f2b91b319e7cdbd\"><div class=\"ttname\"><a href=\"a00176.html#gae57d0201096834d25f2b91b319e7cdbd\">glm::double2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, double, highp &gt; double2x2</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00120\">compatibility.hpp:120</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gadb3703955e513632f98ba12fe051ba3e\"><div class=\"ttname\"><a href=\"a00176.html#gadb3703955e513632f98ba12fe051ba3e\">glm::bool2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, bool, highp &gt; bool2x2</div><div class=\"ttdoc\">boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00072\">compatibility.hpp:72</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gad0f5dc7f22c2065b1b06d57f1c0658fe\"><div class=\"ttname\"><a href=\"a00176.html#gad0f5dc7f22c2065b1b06d57f1c0658fe\">glm::bool4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, bool, highp &gt; bool4x3</div><div class=\"ttdoc\">boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00079\">compatibility.hpp:79</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga04dee1552424198b8f58b377c2ee00d8\"><div class=\"ttname\"><a href=\"a00176.html#ga04dee1552424198b8f58b377c2ee00d8\">glm::int4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, int, highp &gt; int4x4</div><div class=\"ttdoc\">integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00096\">compatibility.hpp:96</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga19925badbe10ce61df1d0de00be0b5ad\"><div class=\"ttname\"><a href=\"a00176.html#ga19925badbe10ce61df1d0de00be0b5ad\">glm::isfinite</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; isfinite(const vec&lt; 4, T, Q &gt; &amp;x)</div><div class=\"ttdoc\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)...</div></div>\n<div class=\"ttc\" id=\"a00176_html_gaba86c28da7bf5bdac64fecf7d56e8ff3\"><div class=\"ttname\"><a href=\"a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3\">glm::atan2</a></div><div class=\"ttdeci\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt; atan2(const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y)</div><div class=\"ttdoc\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what q...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00058\">compatibility.hpp:58</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gafe3a8fd56354caafe24bfe1b1e3ad22a\"><div class=\"ttname\"><a href=\"a00176.html#gafe3a8fd56354caafe24bfe1b1e3ad22a\">glm::int2</a></div><div class=\"ttdeci\">vec&lt; 2, int, highp &gt; int2</div><div class=\"ttdoc\">integer vector with 2 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00083\">compatibility.hpp:83</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gac7d7311f7e0fa8b6163d96dab033a755\"><div class=\"ttname\"><a href=\"a00176.html#gac7d7311f7e0fa8b6163d96dab033a755\">glm::bool3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, bool, highp &gt; bool3x2</div><div class=\"ttdoc\">boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00075\">compatibility.hpp:75</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gafad66a02ccd360c86d6ab9ff9cfbc19c\"><div class=\"ttname\"><a href=\"a00176.html#gafad66a02ccd360c86d6ab9ff9cfbc19c\">glm::double4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, double, highp &gt; double4x3</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00127\">compatibility.hpp:127</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga356f8c3a7e7d6376d3d4b0a026407183\"><div class=\"ttname\"><a href=\"a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183\">glm::saturate</a></div><div class=\"ttdeci\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt; saturate(const vec&lt; 4, T, Q &gt; &amp;x)</div><div class=\"ttdoc\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00053\">compatibility.hpp:53</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga20b861a9b6e2a300323671c57a02525b\"><div class=\"ttname\"><a href=\"a00176.html#ga20b861a9b6e2a300323671c57a02525b\">glm::double1</a></div><div class=\"ttdeci\">double double1</div><div class=\"ttdoc\">double-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00114\">compatibility.hpp:114</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gafec3cfd901ab334a92e0242b8f2269b4\"><div class=\"ttname\"><a href=\"a00176.html#gafec3cfd901ab334a92e0242b8f2269b4\">glm::float2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, float, highp &gt; float2x4</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00106\">compatibility.hpp:106</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga97a39dd9bc7d572810d80b8467cbffa1\"><div class=\"ttname\"><a href=\"a00176.html#ga97a39dd9bc7d572810d80b8467cbffa1\">glm::int4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, int, highp &gt; int4x2</div><div class=\"ttdoc\">integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00094\">compatibility.hpp:94</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga909c38a425f215a50c847145d7da09f0\"><div class=\"ttname\"><a href=\"a00176.html#ga909c38a425f215a50c847145d7da09f0\">glm::int3</a></div><div class=\"ttdeci\">vec&lt; 3, int, highp &gt; int3</div><div class=\"ttdoc\">integer vector with 3 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00084\">compatibility.hpp:84</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gaab541bed2e788e4537852a2492860806\"><div class=\"ttname\"><a href=\"a00176.html#gaab541bed2e788e4537852a2492860806\">glm::double4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, double, highp &gt; double4x4</div><div class=\"ttdoc\">double-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00128\">compatibility.hpp:128</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gae4a2c53f14aeec9a17c2b81142b7e82d\"><div class=\"ttname\"><a href=\"a00176.html#gae4a2c53f14aeec9a17c2b81142b7e82d\">glm::int4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, int, highp &gt; int4x3</div><div class=\"ttdoc\">integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00095\">compatibility.hpp:95</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga4d2679c321b793ca3784fe0315bb5332\"><div class=\"ttname\"><a href=\"a00176.html#ga4d2679c321b793ca3784fe0315bb5332\">glm::float3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, float, highp &gt; float3x4</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00109\">compatibility.hpp:109</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gaa09ab65ec9c3c54305ff502e2b1fe6d9\"><div class=\"ttname\"><a href=\"a00176.html#gaa09ab65ec9c3c54305ff502e2b1fe6d9\">glm::bool2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, highp &gt; bool2</div><div class=\"ttdoc\">boolean type with 2 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00067\">compatibility.hpp:67</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga15c9649286f0bf431bdf9b3509580048\"><div class=\"ttname\"><a href=\"a00176.html#ga15c9649286f0bf431bdf9b3509580048\">glm::int3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, int, highp &gt; int3x3</div><div class=\"ttdoc\">integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00092\">compatibility.hpp:92</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gaf92f58af24f35617518aeb3d4f63fda6\"><div class=\"ttname\"><a href=\"a00176.html#gaf92f58af24f35617518aeb3d4f63fda6\">glm::double4</a></div><div class=\"ttdeci\">vec&lt; 4, double, highp &gt; double4</div><div class=\"ttdoc\">double-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00117\">compatibility.hpp:117</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gae7d6b679463d37d6c527d478fb470fdf\"><div class=\"ttname\"><a href=\"a00176.html#gae7d6b679463d37d6c527d478fb470fdf\">glm::bool3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, bool, highp &gt; bool3x4</div><div class=\"ttdoc\">boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00077\">compatibility.hpp:77</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_gaf5208d01f6c6fbcb7bb55d610b9c0ead\"><div class=\"ttname\"><a href=\"a00176.html#gaf5208d01f6c6fbcb7bb55d610b9c0ead\">glm::float1</a></div><div class=\"ttdeci\">float float1</div><div class=\"ttdoc\">single-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00098\">compatibility.hpp:98</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga73720b8dc4620835b17f74d428f98c0c\"><div class=\"ttname\"><a href=\"a00176.html#ga73720b8dc4620835b17f74d428f98c0c\">glm::float1x1</a></div><div class=\"ttdeci\">float float1x1</div><div class=\"ttdoc\">single-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00103\">compatibility.hpp:103</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga197ded5ad8354f6b6fb91189d7a269b3\"><div class=\"ttname\"><a href=\"a00176.html#ga197ded5ad8354f6b6fb91189d7a269b3\">glm::int2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, int, highp &gt; int2x3</div><div class=\"ttdoc\">integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00089\">compatibility.hpp:89</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga6c97b99aac3e302053ffb58aace9033c\"><div class=\"ttname\"><a href=\"a00176.html#ga6c97b99aac3e302053ffb58aace9033c\">glm::bool3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, bool, highp &gt; bool3x3</div><div class=\"ttdoc\">boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00076\">compatibility.hpp:76</a></div></div>\n<div class=\"ttc\" id=\"a00176_html_ga821ff110fc8533a053cbfcc93e078cc0\"><div class=\"ttname\"><a href=\"a00176.html#ga821ff110fc8533a053cbfcc93e078cc0\">glm::float3</a></div><div class=\"ttdeci\">vec&lt; 3, float, highp &gt; float3</div><div class=\"ttdoc\">single-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00017_source.html#l00100\">compatibility.hpp:100</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00018.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: component_wise.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">component_wise.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00177.html\">GLM_GTX_component_wise</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00018_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaf71833350e15e74d31cbf8a3e7f27051\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaf71833350e15e74d31cbf8a3e7f27051\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#gaf71833350e15e74d31cbf8a3e7f27051\">compAdd</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf71833350e15e74d31cbf8a3e7f27051\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Add all vector components together.  <a href=\"a00177.html#gaf71833350e15e74d31cbf8a3e7f27051\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf71833350e15e74d31cbf8a3e7f27051\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabfa4bb19298c8c73d4217ba759c496b6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gabfa4bb19298c8c73d4217ba759c496b6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#gabfa4bb19298c8c73d4217ba759c496b6\">compMax</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:gabfa4bb19298c8c73d4217ba759c496b6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Find the maximum value between single vector components.  <a href=\"a00177.html#gabfa4bb19298c8c73d4217ba759c496b6\">More...</a><br /></td></tr>\n<tr class=\"separator:gabfa4bb19298c8c73d4217ba759c496b6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab5d0832b5c7bb01b8d7395973bfb1425\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gab5d0832b5c7bb01b8d7395973bfb1425\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#gab5d0832b5c7bb01b8d7395973bfb1425\">compMin</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:gab5d0832b5c7bb01b8d7395973bfb1425\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Find the minimum value between single vector components.  <a href=\"a00177.html#gab5d0832b5c7bb01b8d7395973bfb1425\">More...</a><br /></td></tr>\n<tr class=\"separator:gab5d0832b5c7bb01b8d7395973bfb1425\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8ab88024197202c9479d33bdc5a8a5d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae8ab88024197202c9479d33bdc5a8a5d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#gae8ab88024197202c9479d33bdc5a8a5d\">compMul</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:gae8ab88024197202c9479d33bdc5a8a5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Multiply all vector components together.  <a href=\"a00177.html#gae8ab88024197202c9479d33bdc5a8a5d\">More...</a><br /></td></tr>\n<tr class=\"separator:gae8ab88024197202c9479d33bdc5a8a5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f2b81ada8515875e58cb1667b6b9908\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename floatType , length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8f2b81ada8515875e58cb1667b6b9908\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#ga8f2b81ada8515875e58cb1667b6b9908\">compNormalize</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga8f2b81ada8515875e58cb1667b6b9908\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert an integer vector to a normalized float vector.  <a href=\"a00177.html#ga8f2b81ada8515875e58cb1667b6b9908\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f2b81ada8515875e58cb1667b6b9908\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga80abc2980d65d675f435d178c36880eb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename floatType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga80abc2980d65d675f435d178c36880eb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#ga80abc2980d65d675f435d178c36880eb\">compScale</a> (vec&lt; L, floatType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga80abc2980d65d675f435d178c36880eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a normalized float vector to an integer vector.  <a href=\"a00177.html#ga80abc2980d65d675f435d178c36880eb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga80abc2980d65d675f435d178c36880eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00177.html\">GLM_GTX_component_wise</a> </p>\n<dl class=\"section date\"><dt>Date</dt><dd>2007-05-21 / 2011-06-07 </dd></dl>\n<dl class=\"section author\"><dt>Author</dt><dd>Christophe Riccio</dd></dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00018_source.html\">component_wise.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00018_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: component_wise.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">component_wise.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00018.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_component_wise is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_component_wise extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> <span class=\"keywordtype\">float</span>Type, length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        GLM_FUNC_DECL vec&lt;L, floatType, Q&gt; <a class=\"code\" href=\"a00177.html#ga8f2b81ada8515875e58cb1667b6b9908\">compNormalize</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> <span class=\"keywordtype\">float</span>Type, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00177.html#ga80abc2980d65d675f435d178c36880eb\">compScale</a>(vec&lt;L, floatType, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> genType::value_type <a class=\"code\" href=\"a00177.html#gaf71833350e15e74d31cbf8a3e7f27051\">compAdd</a>(genType <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> genType::value_type <a class=\"code\" href=\"a00177.html#gae8ab88024197202c9479d33bdc5a8a5d\">compMul</a>(genType <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> genType::value_type <a class=\"code\" href=\"a00177.html#gab5d0832b5c7bb01b8d7395973bfb1425\">compMin</a>(genType <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> genType::value_type <a class=\"code\" href=\"a00177.html#gabfa4bb19298c8c73d4217ba759c496b6\">compMax</a>(genType <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\">#include &quot;component_wise.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00177_html_ga80abc2980d65d675f435d178c36880eb\"><div class=\"ttname\"><a href=\"a00177.html#ga80abc2980d65d675f435d178c36880eb\">glm::compScale</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; compScale(vec&lt; L, floatType, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Convert a normalized float vector to an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00177_html_gabfa4bb19298c8c73d4217ba759c496b6\"><div class=\"ttname\"><a href=\"a00177.html#gabfa4bb19298c8c73d4217ba759c496b6\">glm::compMax</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType::value_type compMax(genType const &amp;v)</div><div class=\"ttdoc\">Find the maximum value between single vector components. </div></div>\n<div class=\"ttc\" id=\"a00177_html_gaf71833350e15e74d31cbf8a3e7f27051\"><div class=\"ttname\"><a href=\"a00177.html#gaf71833350e15e74d31cbf8a3e7f27051\">glm::compAdd</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType::value_type compAdd(genType const &amp;v)</div><div class=\"ttdoc\">Add all vector components together. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00177_html_gae8ab88024197202c9479d33bdc5a8a5d\"><div class=\"ttname\"><a href=\"a00177.html#gae8ab88024197202c9479d33bdc5a8a5d\">glm::compMul</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType::value_type compMul(genType const &amp;v)</div><div class=\"ttdoc\">Multiply all vector components together. </div></div>\n<div class=\"ttc\" id=\"a00177_html_ga8f2b81ada8515875e58cb1667b6b9908\"><div class=\"ttname\"><a href=\"a00177.html#ga8f2b81ada8515875e58cb1667b6b9908\">glm::compNormalize</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt; compNormalize(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Convert an integer vector to a normalized float vector. </div></div>\n<div class=\"ttc\" id=\"a00177_html_gab5d0832b5c7bb01b8d7395973bfb1425\"><div class=\"ttname\"><a href=\"a00177.html#gab5d0832b5c7bb01b8d7395973bfb1425\">glm::compMin</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType::value_type compMin(genType const &amp;v)</div><div class=\"ttdoc\">Find the minimum value between single vector components. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00019_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: compute_vector_relational.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">compute_vector_relational.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00002\"></a><span class=\"lineno\">    2</span>&#160;</div>\n<div class=\"line\"><a name=\"l00003\"></a><span class=\"lineno\">    3</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &lt;cstring&gt;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;</div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;        template &lt;typename T, bool isFloat = std::numeric_limits&lt;T&gt;::is_iec559&gt;</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;        <span class=\"keyword\">struct </span>compute_equal</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> call(T a, T b)</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;                        <span class=\"keywordflow\">return</span> a == b;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;        <span class=\"keyword\">struct </span>compute_equal&lt;T, true&gt;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                GLM_FUNC_QUALIFIER <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> call(T a, T b)</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                        <span class=\"keywordflow\">return</span> std::memcmp(&amp;a, &amp;b, <span class=\"keyword\">sizeof</span>(T)) == 0;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00020.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: constants.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">constants.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00151.html\">GLM_GTC_constants</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00020_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a> ()</td></tr>\n<tr class=\"memdesc:ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return e constant.  <a href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a1e57fc5592b69cfae84174cbfc9429\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2a1e57fc5592b69cfae84174cbfc9429\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a> ()</td></tr>\n<tr class=\"memdesc:ga2a1e57fc5592b69cfae84174cbfc9429\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the epsilon constant for floating point types.  <a href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2a1e57fc5592b69cfae84174cbfc9429\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad8fe2e6f90bce9d829e9723b649fbd42\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad8fe2e6f90bce9d829e9723b649fbd42\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gad8fe2e6f90bce9d829e9723b649fbd42\">euler</a> ()</td></tr>\n<tr class=\"memdesc:gad8fe2e6f90bce9d829e9723b649fbd42\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return Euler's constant.  <a href=\"a00151.html#gad8fe2e6f90bce9d829e9723b649fbd42\">More...</a><br /></td></tr>\n<tr class=\"separator:gad8fe2e6f90bce9d829e9723b649fbd42\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga753950e5140e4ea6a88e4a18ba61dc09\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga753950e5140e4ea6a88e4a18ba61dc09\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga753950e5140e4ea6a88e4a18ba61dc09\">four_over_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga753950e5140e4ea6a88e4a18ba61dc09\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 4 / pi.  <a href=\"a00151.html#ga753950e5140e4ea6a88e4a18ba61dc09\">More...</a><br /></td></tr>\n<tr class=\"separator:ga753950e5140e4ea6a88e4a18ba61dc09\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga748cf8642830657c5b7eae04d0a80899\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga748cf8642830657c5b7eae04d0a80899\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga748cf8642830657c5b7eae04d0a80899\">golden_ratio</a> ()</td></tr>\n<tr class=\"memdesc:ga748cf8642830657c5b7eae04d0a80899\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the golden ratio constant.  <a href=\"a00151.html#ga748cf8642830657c5b7eae04d0a80899\">More...</a><br /></td></tr>\n<tr class=\"separator:ga748cf8642830657c5b7eae04d0a80899\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c36b41d462e45641faf7d7938948bac\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga0c36b41d462e45641faf7d7938948bac\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga0c36b41d462e45641faf7d7938948bac\">half_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga0c36b41d462e45641faf7d7938948bac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return pi / 2.  <a href=\"a00151.html#ga0c36b41d462e45641faf7d7938948bac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0c36b41d462e45641faf7d7938948bac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaca94292c839ed31a405ab7a81ae7e850\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaca94292c839ed31a405ab7a81ae7e850\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gaca94292c839ed31a405ab7a81ae7e850\">ln_ln_two</a> ()</td></tr>\n<tr class=\"memdesc:gaca94292c839ed31a405ab7a81ae7e850\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return ln(ln(2)).  <a href=\"a00151.html#gaca94292c839ed31a405ab7a81ae7e850\">More...</a><br /></td></tr>\n<tr class=\"separator:gaca94292c839ed31a405ab7a81ae7e850\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf97ebc6c059ffd788e6c4946f71ef66c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaf97ebc6c059ffd788e6c4946f71ef66c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gaf97ebc6c059ffd788e6c4946f71ef66c\">ln_ten</a> ()</td></tr>\n<tr class=\"memdesc:gaf97ebc6c059ffd788e6c4946f71ef66c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return ln(10).  <a href=\"a00151.html#gaf97ebc6c059ffd788e6c4946f71ef66c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf97ebc6c059ffd788e6c4946f71ef66c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga24f4d27765678116f41a2f336ab7975c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga24f4d27765678116f41a2f336ab7975c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga24f4d27765678116f41a2f336ab7975c\">ln_two</a> ()</td></tr>\n<tr class=\"memdesc:ga24f4d27765678116f41a2f336ab7975c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return ln(2).  <a href=\"a00151.html#ga24f4d27765678116f41a2f336ab7975c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga24f4d27765678116f41a2f336ab7975c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39c2fb227631ca25894326529bdd1ee5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga39c2fb227631ca25894326529bdd1ee5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga39c2fb227631ca25894326529bdd1ee5\">one</a> ()</td></tr>\n<tr class=\"memdesc:ga39c2fb227631ca25894326529bdd1ee5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1.  <a href=\"a00151.html#ga39c2fb227631ca25894326529bdd1ee5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga39c2fb227631ca25894326529bdd1ee5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga555150da2b06d23c8738981d5013e0eb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga555150da2b06d23c8738981d5013e0eb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga555150da2b06d23c8738981d5013e0eb\">one_over_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga555150da2b06d23c8738981d5013e0eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1 / pi.  <a href=\"a00151.html#ga555150da2b06d23c8738981d5013e0eb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga555150da2b06d23c8738981d5013e0eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga788fa23a0939bac4d1d0205fb4f35818\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga788fa23a0939bac4d1d0205fb4f35818\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga788fa23a0939bac4d1d0205fb4f35818\">one_over_root_two</a> ()</td></tr>\n<tr class=\"memdesc:ga788fa23a0939bac4d1d0205fb4f35818\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1 / sqrt(2).  <a href=\"a00151.html#ga788fa23a0939bac4d1d0205fb4f35818\">More...</a><br /></td></tr>\n<tr class=\"separator:ga788fa23a0939bac4d1d0205fb4f35818\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7c922b427986cbb2e4c6ac69874eefbc\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga7c922b427986cbb2e4c6ac69874eefbc\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga7c922b427986cbb2e4c6ac69874eefbc\">one_over_two_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga7c922b427986cbb2e4c6ac69874eefbc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1 / (pi * 2).  <a href=\"a00151.html#ga7c922b427986cbb2e4c6ac69874eefbc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7c922b427986cbb2e4c6ac69874eefbc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga94bafeb2a0f23ab6450fed1f98ee4e45\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga94bafeb2a0f23ab6450fed1f98ee4e45\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga94bafeb2a0f23ab6450fed1f98ee4e45\">pi</a> ()</td></tr>\n<tr class=\"memdesc:ga94bafeb2a0f23ab6450fed1f98ee4e45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the pi constant.  <a href=\"a00151.html#ga94bafeb2a0f23ab6450fed1f98ee4e45\">More...</a><br /></td></tr>\n<tr class=\"separator:ga94bafeb2a0f23ab6450fed1f98ee4e45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3c9df42bd73c519a995c43f0f99e77e0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga3c9df42bd73c519a995c43f0f99e77e0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga3c9df42bd73c519a995c43f0f99e77e0\">quarter_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga3c9df42bd73c519a995c43f0f99e77e0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return pi / 4.  <a href=\"a00151.html#ga3c9df42bd73c519a995c43f0f99e77e0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3c9df42bd73c519a995c43f0f99e77e0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae9ebbded75b53d4faeb1e4ef8b3347a2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae9ebbded75b53d4faeb1e4ef8b3347a2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gae9ebbded75b53d4faeb1e4ef8b3347a2\">root_five</a> ()</td></tr>\n<tr class=\"memdesc:gae9ebbded75b53d4faeb1e4ef8b3347a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(5).  <a href=\"a00151.html#gae9ebbded75b53d4faeb1e4ef8b3347a2\">More...</a><br /></td></tr>\n<tr class=\"separator:gae9ebbded75b53d4faeb1e4ef8b3347a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4e276cb823cc5e612d4f89ed99c75039\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4e276cb823cc5e612d4f89ed99c75039\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga4e276cb823cc5e612d4f89ed99c75039\">root_half_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga4e276cb823cc5e612d4f89ed99c75039\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(pi / 2).  <a href=\"a00151.html#ga4e276cb823cc5e612d4f89ed99c75039\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4e276cb823cc5e612d4f89ed99c75039\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4129412e96b33707a77c1a07652e23e2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4129412e96b33707a77c1a07652e23e2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga4129412e96b33707a77c1a07652e23e2\">root_ln_four</a> ()</td></tr>\n<tr class=\"memdesc:ga4129412e96b33707a77c1a07652e23e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(ln(4)).  <a href=\"a00151.html#ga4129412e96b33707a77c1a07652e23e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4129412e96b33707a77c1a07652e23e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga261380796b2cd496f68d2cf1d08b8eb9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga261380796b2cd496f68d2cf1d08b8eb9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga261380796b2cd496f68d2cf1d08b8eb9\">root_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga261380796b2cd496f68d2cf1d08b8eb9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return square root of pi.  <a href=\"a00151.html#ga261380796b2cd496f68d2cf1d08b8eb9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga261380796b2cd496f68d2cf1d08b8eb9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f286be4abe88be1eed7d2a9f6cb193e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4f286be4abe88be1eed7d2a9f6cb193e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga4f286be4abe88be1eed7d2a9f6cb193e\">root_three</a> ()</td></tr>\n<tr class=\"memdesc:ga4f286be4abe88be1eed7d2a9f6cb193e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(3).  <a href=\"a00151.html#ga4f286be4abe88be1eed7d2a9f6cb193e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f286be4abe88be1eed7d2a9f6cb193e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74e607d29020f100c0d0dc46ce2ca950\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga74e607d29020f100c0d0dc46ce2ca950\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga74e607d29020f100c0d0dc46ce2ca950\">root_two</a> ()</td></tr>\n<tr class=\"memdesc:ga74e607d29020f100c0d0dc46ce2ca950\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(2).  <a href=\"a00151.html#ga74e607d29020f100c0d0dc46ce2ca950\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74e607d29020f100c0d0dc46ce2ca950\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2bcedc575039fe0cd765742f8bbb0bd3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2bcedc575039fe0cd765742f8bbb0bd3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga2bcedc575039fe0cd765742f8bbb0bd3\">root_two_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga2bcedc575039fe0cd765742f8bbb0bd3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(2 * pi).  <a href=\"a00151.html#ga2bcedc575039fe0cd765742f8bbb0bd3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2bcedc575039fe0cd765742f8bbb0bd3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3077c6311010a214b69ddc8214ec13b5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga3077c6311010a214b69ddc8214ec13b5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga3077c6311010a214b69ddc8214ec13b5\">third</a> ()</td></tr>\n<tr class=\"memdesc:ga3077c6311010a214b69ddc8214ec13b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1 / 3.  <a href=\"a00151.html#ga3077c6311010a214b69ddc8214ec13b5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3077c6311010a214b69ddc8214ec13b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae94950df74b0ce382b1fc1d978ef7394\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae94950df74b0ce382b1fc1d978ef7394\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gae94950df74b0ce382b1fc1d978ef7394\">three_over_two_pi</a> ()</td></tr>\n<tr class=\"memdesc:gae94950df74b0ce382b1fc1d978ef7394\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return pi / 2 * 3.  <a href=\"a00151.html#gae94950df74b0ce382b1fc1d978ef7394\">More...</a><br /></td></tr>\n<tr class=\"separator:gae94950df74b0ce382b1fc1d978ef7394\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74eadc8a211253079683219a3ea0462a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga74eadc8a211253079683219a3ea0462a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga74eadc8a211253079683219a3ea0462a\">two_over_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga74eadc8a211253079683219a3ea0462a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 2 / pi.  <a href=\"a00151.html#ga74eadc8a211253079683219a3ea0462a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74eadc8a211253079683219a3ea0462a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5827301817640843cf02026a8d493894\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga5827301817640843cf02026a8d493894\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga5827301817640843cf02026a8d493894\">two_over_root_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga5827301817640843cf02026a8d493894\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 2 / sqrt(pi).  <a href=\"a00151.html#ga5827301817640843cf02026a8d493894\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5827301817640843cf02026a8d493894\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa5276a4617566abcfe49286f40e3a256\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa5276a4617566abcfe49286f40e3a256\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gaa5276a4617566abcfe49286f40e3a256\">two_pi</a> ()</td></tr>\n<tr class=\"memdesc:gaa5276a4617566abcfe49286f40e3a256\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return pi * 2.  <a href=\"a00151.html#gaa5276a4617566abcfe49286f40e3a256\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa5276a4617566abcfe49286f40e3a256\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9b4d2f4322edcf63a6737b92a29dd1f5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9b4d2f4322edcf63a6737b92a29dd1f5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga9b4d2f4322edcf63a6737b92a29dd1f5\">two_thirds</a> ()</td></tr>\n<tr class=\"memdesc:ga9b4d2f4322edcf63a6737b92a29dd1f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 2 / 3.  <a href=\"a00151.html#ga9b4d2f4322edcf63a6737b92a29dd1f5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9b4d2f4322edcf63a6737b92a29dd1f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga788f5a421fc0f40a1296ebc094cbaa8a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga788f5a421fc0f40a1296ebc094cbaa8a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga788f5a421fc0f40a1296ebc094cbaa8a\">zero</a> ()</td></tr>\n<tr class=\"memdesc:ga788f5a421fc0f40a1296ebc094cbaa8a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 0.  <a href=\"a00151.html#ga788f5a421fc0f40a1296ebc094cbaa8a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga788f5a421fc0f40a1296ebc094cbaa8a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00151.html\">GLM_GTC_constants</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00020_source.html\">constants.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00020_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: constants.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">constants.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00020.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_constants extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>();</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga788f5a421fc0f40a1296ebc094cbaa8a\">zero</a>();</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga39c2fb227631ca25894326529bdd1ee5\">one</a>();</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga94bafeb2a0f23ab6450fed1f98ee4e45\">pi</a>();</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#gaa5276a4617566abcfe49286f40e3a256\">two_pi</a>();</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga261380796b2cd496f68d2cf1d08b8eb9\">root_pi</a>();</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga0c36b41d462e45641faf7d7938948bac\">half_pi</a>();</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#gae94950df74b0ce382b1fc1d978ef7394\">three_over_two_pi</a>();</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga3c9df42bd73c519a995c43f0f99e77e0\">quarter_pi</a>();</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga555150da2b06d23c8738981d5013e0eb\">one_over_pi</a>();</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga7c922b427986cbb2e4c6ac69874eefbc\">one_over_two_pi</a>();</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga74eadc8a211253079683219a3ea0462a\">two_over_pi</a>();</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga753950e5140e4ea6a88e4a18ba61dc09\">four_over_pi</a>();</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga5827301817640843cf02026a8d493894\">two_over_root_pi</a>();</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga788fa23a0939bac4d1d0205fb4f35818\">one_over_root_two</a>();</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga4e276cb823cc5e612d4f89ed99c75039\">root_half_pi</a>();</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga2bcedc575039fe0cd765742f8bbb0bd3\">root_two_pi</a>();</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga4129412e96b33707a77c1a07652e23e2\">root_ln_four</a>();</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>();</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#gad8fe2e6f90bce9d829e9723b649fbd42\">euler</a>();</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga74e607d29020f100c0d0dc46ce2ca950\">root_two</a>();</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga4f286be4abe88be1eed7d2a9f6cb193e\">root_three</a>();</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#gae9ebbded75b53d4faeb1e4ef8b3347a2\">root_five</a>();</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga24f4d27765678116f41a2f336ab7975c\">ln_two</a>();</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#gaf97ebc6c059ffd788e6c4946f71ef66c\">ln_ten</a>();</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#gaca94292c839ed31a405ab7a81ae7e850\">ln_ln_two</a>();</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga3077c6311010a214b69ddc8214ec13b5\">third</a>();</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga9b4d2f4322edcf63a6737b92a29dd1f5\">two_thirds</a>();</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR genType <a class=\"code\" href=\"a00151.html#ga748cf8642830657c5b7eae04d0a80899\">golden_ratio</a>();</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;<span class=\"preprocessor\">#include &quot;constants.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00151_html_ga74e607d29020f100c0d0dc46ce2ca950\"><div class=\"ttname\"><a href=\"a00151.html#ga74e607d29020f100c0d0dc46ce2ca950\">glm::root_two</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType root_two()</div><div class=\"ttdoc\">Return sqrt(2). </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga9b4d2f4322edcf63a6737b92a29dd1f5\"><div class=\"ttname\"><a href=\"a00151.html#ga9b4d2f4322edcf63a6737b92a29dd1f5\">glm::two_thirds</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType two_thirds()</div><div class=\"ttdoc\">Return 2 / 3. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga2a1e57fc5592b69cfae84174cbfc9429\"><div class=\"ttname\"><a href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">glm::epsilon</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()</div><div class=\"ttdoc\">Return the epsilon constant for floating point types. </div></div>\n<div class=\"ttc\" id=\"a00151_html_gad8fe2e6f90bce9d829e9723b649fbd42\"><div class=\"ttname\"><a href=\"a00151.html#gad8fe2e6f90bce9d829e9723b649fbd42\">glm::euler</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType euler()</div><div class=\"ttdoc\">Return Euler&#39;s constant. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga74eadc8a211253079683219a3ea0462a\"><div class=\"ttname\"><a href=\"a00151.html#ga74eadc8a211253079683219a3ea0462a\">glm::two_over_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_pi()</div><div class=\"ttdoc\">Return 2 / pi. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00151_html_ga24f4d27765678116f41a2f336ab7975c\"><div class=\"ttname\"><a href=\"a00151.html#ga24f4d27765678116f41a2f336ab7975c\">glm::ln_two</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType ln_two()</div><div class=\"ttdoc\">Return ln(2). </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga5827301817640843cf02026a8d493894\"><div class=\"ttname\"><a href=\"a00151.html#ga5827301817640843cf02026a8d493894\">glm::two_over_root_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_root_pi()</div><div class=\"ttdoc\">Return 2 / sqrt(pi). </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga788fa23a0939bac4d1d0205fb4f35818\"><div class=\"ttname\"><a href=\"a00151.html#ga788fa23a0939bac4d1d0205fb4f35818\">glm::one_over_root_two</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_root_two()</div><div class=\"ttdoc\">Return 1 / sqrt(2). </div></div>\n<div class=\"ttc\" id=\"a00151_html_gaca94292c839ed31a405ab7a81ae7e850\"><div class=\"ttname\"><a href=\"a00151.html#gaca94292c839ed31a405ab7a81ae7e850\">glm::ln_ln_two</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ln_two()</div><div class=\"ttdoc\">Return ln(ln(2)). </div></div>\n<div class=\"ttc\" id=\"a00151_html_gaa5276a4617566abcfe49286f40e3a256\"><div class=\"ttname\"><a href=\"a00151.html#gaa5276a4617566abcfe49286f40e3a256\">glm::two_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType two_pi()</div><div class=\"ttdoc\">Return pi * 2. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga753950e5140e4ea6a88e4a18ba61dc09\"><div class=\"ttname\"><a href=\"a00151.html#ga753950e5140e4ea6a88e4a18ba61dc09\">glm::four_over_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType four_over_pi()</div><div class=\"ttdoc\">Return 4 / pi. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga261380796b2cd496f68d2cf1d08b8eb9\"><div class=\"ttname\"><a href=\"a00151.html#ga261380796b2cd496f68d2cf1d08b8eb9\">glm::root_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType root_pi()</div><div class=\"ttdoc\">Return square root of pi. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga3c9df42bd73c519a995c43f0f99e77e0\"><div class=\"ttname\"><a href=\"a00151.html#ga3c9df42bd73c519a995c43f0f99e77e0\">glm::quarter_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType quarter_pi()</div><div class=\"ttdoc\">Return pi / 4. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga39c2fb227631ca25894326529bdd1ee5\"><div class=\"ttname\"><a href=\"a00151.html#ga39c2fb227631ca25894326529bdd1ee5\">glm::one</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType one()</div><div class=\"ttdoc\">Return 1. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga0c36b41d462e45641faf7d7938948bac\"><div class=\"ttname\"><a href=\"a00151.html#ga0c36b41d462e45641faf7d7938948bac\">glm::half_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType half_pi()</div><div class=\"ttdoc\">Return pi / 2. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga4f286be4abe88be1eed7d2a9f6cb193e\"><div class=\"ttname\"><a href=\"a00151.html#ga4f286be4abe88be1eed7d2a9f6cb193e\">glm::root_three</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType root_three()</div><div class=\"ttdoc\">Return sqrt(3). </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga4129412e96b33707a77c1a07652e23e2\"><div class=\"ttname\"><a href=\"a00151.html#ga4129412e96b33707a77c1a07652e23e2\">glm::root_ln_four</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType root_ln_four()</div><div class=\"ttdoc\">Return sqrt(ln(4)). </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga555150da2b06d23c8738981d5013e0eb\"><div class=\"ttname\"><a href=\"a00151.html#ga555150da2b06d23c8738981d5013e0eb\">glm::one_over_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_pi()</div><div class=\"ttdoc\">Return 1 / pi. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga7c922b427986cbb2e4c6ac69874eefbc\"><div class=\"ttname\"><a href=\"a00151.html#ga7c922b427986cbb2e4c6ac69874eefbc\">glm::one_over_two_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_two_pi()</div><div class=\"ttdoc\">Return 1 / (pi * 2). </div></div>\n<div class=\"ttc\" id=\"a00151_html_gae9ebbded75b53d4faeb1e4ef8b3347a2\"><div class=\"ttname\"><a href=\"a00151.html#gae9ebbded75b53d4faeb1e4ef8b3347a2\">glm::root_five</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType root_five()</div><div class=\"ttdoc\">Return sqrt(5). </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga2bcedc575039fe0cd765742f8bbb0bd3\"><div class=\"ttname\"><a href=\"a00151.html#ga2bcedc575039fe0cd765742f8bbb0bd3\">glm::root_two_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType root_two_pi()</div><div class=\"ttdoc\">Return sqrt(2 * pi). </div></div>\n<div class=\"ttc\" id=\"a00151_html_gaf97ebc6c059ffd788e6c4946f71ef66c\"><div class=\"ttname\"><a href=\"a00151.html#gaf97ebc6c059ffd788e6c4946f71ef66c\">glm::ln_ten</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ten()</div><div class=\"ttdoc\">Return ln(10). </div></div>\n<div class=\"ttc\" id=\"a00151_html_gae94950df74b0ce382b1fc1d978ef7394\"><div class=\"ttname\"><a href=\"a00151.html#gae94950df74b0ce382b1fc1d978ef7394\">glm::three_over_two_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType three_over_two_pi()</div><div class=\"ttdoc\">Return pi / 2 * 3. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga94bafeb2a0f23ab6450fed1f98ee4e45\"><div class=\"ttname\"><a href=\"a00151.html#ga94bafeb2a0f23ab6450fed1f98ee4e45\">glm::pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType pi()</div><div class=\"ttdoc\">Return the pi constant. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga788f5a421fc0f40a1296ebc094cbaa8a\"><div class=\"ttname\"><a href=\"a00151.html#ga788f5a421fc0f40a1296ebc094cbaa8a\">glm::zero</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType zero()</div><div class=\"ttdoc\">Return 0. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga748cf8642830657c5b7eae04d0a80899\"><div class=\"ttname\"><a href=\"a00151.html#ga748cf8642830657c5b7eae04d0a80899\">glm::golden_ratio</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType golden_ratio()</div><div class=\"ttdoc\">Return the golden ratio constant. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga3077c6311010a214b69ddc8214ec13b5\"><div class=\"ttname\"><a href=\"a00151.html#ga3077c6311010a214b69ddc8214ec13b5\">glm::third</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType third()</div><div class=\"ttdoc\">Return 1 / 3. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><div class=\"ttname\"><a href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">glm::e</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType e()</div><div class=\"ttdoc\">Return e constant. </div></div>\n<div class=\"ttc\" id=\"a00151_html_ga4e276cb823cc5e612d4f89ed99c75039\"><div class=\"ttname\"><a href=\"a00151.html#ga4e276cb823cc5e612d4f89ed99c75039\">glm::root_half_pi</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType root_half_pi()</div><div class=\"ttdoc\">Return sqrt(pi / 2). </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00021.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: dual_quaternion.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a> &#124;\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">dual_quaternion.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00178.html\">GLM_GTX_dual_quaternion</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00021_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga3d71f98d84ba59dfe4e369fde4714cd6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ddualquat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">ddualquat</a></td></tr>\n<tr class=\"memdesc:ga3d71f98d84ba59dfe4e369fde4714cd6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of default double-qualifier floating-point numbers.  <a href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3d71f98d84ba59dfe4e369fde4714cd6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae93abee0c979902fbec6a7bee0f6fae1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_fdualquat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">dualquat</a></td></tr>\n<tr class=\"memdesc:gae93abee0c979902fbec6a7bee0f6fae1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of floating-point numbers.  <a href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">More...</a><br /></td></tr>\n<tr class=\"separator:gae93abee0c979902fbec6a7bee0f6fae1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga237c2b9b42c9a930e49de5840ae0f930\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_fdualquat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">fdualquat</a></td></tr>\n<tr class=\"memdesc:ga237c2b9b42c9a930e49de5840ae0f930\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of single-qualifier floating-point numbers.  <a href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">More...</a><br /></td></tr>\n<tr class=\"separator:ga237c2b9b42c9a930e49de5840ae0f930\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f67eafa7197d7a668dad5105a463d2a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga8f67eafa7197d7a668dad5105a463d2a\">highp_ddualquat</a></td></tr>\n<tr class=\"memdesc:ga8f67eafa7197d7a668dad5105a463d2a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of high double-qualifier floating-point numbers.  <a href=\"a00178.html#ga8f67eafa7197d7a668dad5105a463d2a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f67eafa7197d7a668dad5105a463d2a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ef5bf1da52a9d4932335a517086ceaf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf\">highp_dualquat</a></td></tr>\n<tr class=\"memdesc:ga9ef5bf1da52a9d4932335a517086ceaf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of high single-qualifier floating-point numbers.  <a href=\"a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9ef5bf1da52a9d4932335a517086ceaf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4c4e55e9c99dc57b299ed590968da564\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga4c4e55e9c99dc57b299ed590968da564\">highp_fdualquat</a></td></tr>\n<tr class=\"memdesc:ga4c4e55e9c99dc57b299ed590968da564\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of high single-qualifier floating-point numbers.  <a href=\"a00178.html#ga4c4e55e9c99dc57b299ed590968da564\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4c4e55e9c99dc57b299ed590968da564\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab4c5103338af3dac7e0fbc86895a3f1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a\">lowp_ddualquat</a></td></tr>\n<tr class=\"memdesc:gab4c5103338af3dac7e0fbc86895a3f1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of low double-qualifier floating-point numbers.  <a href=\"a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a\">More...</a><br /></td></tr>\n<tr class=\"separator:gab4c5103338af3dac7e0fbc86895a3f1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade05d29ebd4deea0f883d0e1bb4169aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa\">lowp_dualquat</a></td></tr>\n<tr class=\"memdesc:gade05d29ebd4deea0f883d0e1bb4169aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of low single-qualifier floating-point numbers.  <a href=\"a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa\">More...</a><br /></td></tr>\n<tr class=\"separator:gade05d29ebd4deea0f883d0e1bb4169aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa38f671be25a7f3b136a452a8bb42860\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gaa38f671be25a7f3b136a452a8bb42860\">lowp_fdualquat</a></td></tr>\n<tr class=\"memdesc:gaa38f671be25a7f3b136a452a8bb42860\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of low single-qualifier floating-point numbers.  <a href=\"a00178.html#gaa38f671be25a7f3b136a452a8bb42860\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa38f671be25a7f3b136a452a8bb42860\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0fb11e48e2d16348ccb06a25213641b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga0fb11e48e2d16348ccb06a25213641b4\">mediump_ddualquat</a></td></tr>\n<tr class=\"memdesc:ga0fb11e48e2d16348ccb06a25213641b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of medium double-qualifier floating-point numbers.  <a href=\"a00178.html#ga0fb11e48e2d16348ccb06a25213641b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0fb11e48e2d16348ccb06a25213641b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7aeb54c167712b38f2178a1be2360ad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gaa7aeb54c167712b38f2178a1be2360ad\">mediump_dualquat</a></td></tr>\n<tr class=\"memdesc:gaa7aeb54c167712b38f2178a1be2360ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of medium single-qualifier floating-point numbers.  <a href=\"a00178.html#gaa7aeb54c167712b38f2178a1be2360ad\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7aeb54c167712b38f2178a1be2360ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4a6b594ff7e81150d8143001367a9431\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga4a6b594ff7e81150d8143001367a9431\">mediump_fdualquat</a></td></tr>\n<tr class=\"memdesc:ga4a6b594ff7e81150d8143001367a9431\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of medium single-qualifier floating-point numbers.  <a href=\"a00178.html#ga4a6b594ff7e81150d8143001367a9431\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4a6b594ff7e81150d8143001367a9431\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0b35c0e30df8a875dbaa751e0bd800e0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0b35c0e30df8a875dbaa751e0bd800e0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga0b35c0e30df8a875dbaa751e0bd800e0\">dual_quat_identity</a> ()</td></tr>\n<tr class=\"memdesc:ga0b35c0e30df8a875dbaa751e0bd800e0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates an identity dual quaternion.  <a href=\"a00178.html#ga0b35c0e30df8a875dbaa751e0bd800e0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0b35c0e30df8a875dbaa751e0bd800e0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac4064ff813759740201765350eac4236\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac4064ff813759740201765350eac4236\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gac4064ff813759740201765350eac4236\">dualquat_cast</a> (mat&lt; 2, 4, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gac4064ff813759740201765350eac4236\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion.  <a href=\"a00178.html#gac4064ff813759740201765350eac4236\">More...</a><br /></td></tr>\n<tr class=\"separator:gac4064ff813759740201765350eac4236\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91025ebdca0f4ea54da08497b00e8c84\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga91025ebdca0f4ea54da08497b00e8c84\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga91025ebdca0f4ea54da08497b00e8c84\">dualquat_cast</a> (mat&lt; 3, 4, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga91025ebdca0f4ea54da08497b00e8c84\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion.  <a href=\"a00178.html#ga91025ebdca0f4ea54da08497b00e8c84\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91025ebdca0f4ea54da08497b00e8c84\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga070f521a953f6461af4ab4cf8ccbf27e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga070f521a953f6461af4ab4cf8ccbf27e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga070f521a953f6461af4ab4cf8ccbf27e\">inverse</a> (tdualquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga070f521a953f6461af4ab4cf8ccbf27e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the q inverse.  <a href=\"a00178.html#ga070f521a953f6461af4ab4cf8ccbf27e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga070f521a953f6461af4ab4cf8ccbf27e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gace8380112d16d33f520839cb35a4d173\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gace8380112d16d33f520839cb35a4d173\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gace8380112d16d33f520839cb35a4d173\">lerp</a> (tdualquat&lt; T, Q &gt; const &amp;x, tdualquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</td></tr>\n<tr class=\"memdesc:gace8380112d16d33f520839cb35a4d173\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the linear interpolation of two dual quaternion.  <a href=\"a00178.html#gace8380112d16d33f520839cb35a4d173\">More...</a><br /></td></tr>\n<tr class=\"separator:gace8380112d16d33f520839cb35a4d173\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae99d143b37f9cad4cd9285571aab685a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae99d143b37f9cad4cd9285571aab685a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gae99d143b37f9cad4cd9285571aab685a\">mat2x4_cast</a> (tdualquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae99d143b37f9cad4cd9285571aab685a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 2 * 4 matrix.  <a href=\"a00178.html#gae99d143b37f9cad4cd9285571aab685a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae99d143b37f9cad4cd9285571aab685a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf59f5bb69620d2891c3795c6f2639179\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf59f5bb69620d2891c3795c6f2639179\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gaf59f5bb69620d2891c3795c6f2639179\">mat3x4_cast</a> (tdualquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf59f5bb69620d2891c3795c6f2639179\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 3 * 4 matrix.  <a href=\"a00178.html#gaf59f5bb69620d2891c3795c6f2639179\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf59f5bb69620d2891c3795c6f2639179\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga299b8641509606b1958ffa104a162cfe\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga299b8641509606b1958ffa104a162cfe\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga299b8641509606b1958ffa104a162cfe\">normalize</a> (tdualquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga299b8641509606b1958ffa104a162cfe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the normalized quaternion.  <a href=\"a00178.html#ga299b8641509606b1958ffa104a162cfe\">More...</a><br /></td></tr>\n<tr class=\"separator:ga299b8641509606b1958ffa104a162cfe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00178.html\">GLM_GTX_dual_quaternion</a> </p>\n<dl class=\"section author\"><dt>Author</dt><dd>Maksim Vorobiev (<a href=\"#\" onclick=\"location.href='mai'+'lto:'+'mso'+'me'+'one'+'@g'+'mai'+'l.'+'com'; return false;\">msome<span style=\"display: none;\">.nosp@m.</span>one@<span style=\"display: none;\">.nosp@m.</span>gmail<span style=\"display: none;\">.nosp@m.</span>.com</a>)</dd></dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00021_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: dual_quaternion.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">dual_quaternion.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00021.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/constants.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_dual_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_dual_quaternion extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        <span class=\"keyword\">struct </span>tdualquat</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                <span class=\"comment\">// -- Implementation detail --</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                <span class=\"keyword\">typedef</span> glm::tquat&lt;T, Q&gt; part_type;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                <span class=\"comment\">// -- Data --</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                glm::tquat&lt;T, Q&gt; real, dual;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                <span class=\"comment\">// -- Component accesses --</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>(){<span class=\"keywordflow\">return</span> 2;}</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                GLM_FUNC_DECL part_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                GLM_FUNC_DECL part_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                <span class=\"comment\">// -- Implicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tdualquat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat&lt;T, Q&gt; const&amp; d) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat&lt;T, P&gt; const&amp; d);</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                <span class=\"comment\">// -- Explicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat&lt;T, Q&gt; const&amp; real);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat&lt;T, Q&gt; const&amp; <a class=\"code\" href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">orientation</a>, vec&lt;3, T, Q&gt; const&amp; translation);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat&lt;T, Q&gt; const&amp; real, tquat&lt;T, Q&gt; const&amp; dual);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                <span class=\"comment\">// -- Conversion constructors --</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tdualquat(tdualquat&lt;U, P&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT tdualquat(mat&lt;2, 4, T, Q&gt; const&amp; holder_mat);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT tdualquat(mat&lt;3, 4, T, Q&gt; const&amp; aug_mat);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL tdualquat&lt;T, Q&gt; &amp; operator=(tdualquat&lt;T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                GLM_FUNC_DECL tdualquat&lt;T, Q&gt; &amp; operator=(tdualquat&lt;U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL tdualquat&lt;T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                GLM_FUNC_DECL tdualquat&lt;T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        <span class=\"comment\">// -- Unary bit operators --</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; operator+(tdualquat&lt;T, Q&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; operator-(tdualquat&lt;T, Q&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; operator+(tdualquat&lt;T, Q&gt; const&amp; q, tdualquat&lt;T, Q&gt; const&amp; p);</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; operator*(tdualquat&lt;T, Q&gt; const&amp; q, tdualquat&lt;T, Q&gt; const&amp; p);</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(tdualquat&lt;T, Q&gt; const&amp; q, vec&lt;3, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(vec&lt;3, T, Q&gt; const&amp; v, tdualquat&lt;T, Q&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(tdualquat&lt;T, Q&gt; const&amp; q, vec&lt;4, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(vec&lt;4, T, Q&gt; const&amp; v, tdualquat&lt;T, Q&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; operator*(tdualquat&lt;T, Q&gt; const&amp; q, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; operator*(T const&amp; s, tdualquat&lt;T, Q&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; operator/(tdualquat&lt;T, Q&gt; const&amp; q, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(tdualquat&lt;T, Q&gt; const&amp; q1, tdualquat&lt;T, Q&gt; const&amp; q2);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(tdualquat&lt;T, Q&gt; const&amp; q1, tdualquat&lt;T, Q&gt; const&amp; q2);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        template &lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; <a class=\"code\" href=\"a00178.html#ga0b35c0e30df8a875dbaa751e0bd800e0\">dual_quat_identity</a>();</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; <a class=\"code\" href=\"a00178.html#ga299b8641509606b1958ffa104a162cfe\">normalize</a>(tdualquat&lt;T, Q&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; <a class=\"code\" href=\"a00178.html#gace8380112d16d33f520839cb35a4d173\">lerp</a>(tdualquat&lt;T, Q&gt; const&amp; x, tdualquat&lt;T, Q&gt; const&amp; y, T const&amp; a);</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; <a class=\"code\" href=\"a00178.html#ga070f521a953f6461af4ab4cf8ccbf27e\">inverse</a>(tdualquat&lt;T, Q&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; <a class=\"code\" href=\"a00178.html#gae99d143b37f9cad4cd9285571aab685a\">mat2x4_cast</a>(tdualquat&lt;T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; <a class=\"code\" href=\"a00178.html#gaf59f5bb69620d2891c3795c6f2639179\">mat3x4_cast</a>(tdualquat&lt;T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; <a class=\"code\" href=\"a00178.html#ga91025ebdca0f4ea54da08497b00e8c84\">dualquat_cast</a>(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        GLM_FUNC_DECL tdualquat&lt;T, Q&gt; <a class=\"code\" href=\"a00178.html#ga91025ebdca0f4ea54da08497b00e8c84\">dualquat_cast</a>(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa\">  187</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">float</span>, lowp&gt;          <a class=\"code\" href=\"a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa\">lowp_dualquat</a>;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#gaa7aeb54c167712b38f2178a1be2360ad\">  192</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">float</span>, mediump&gt;       <a class=\"code\" href=\"a00178.html#gaa7aeb54c167712b38f2178a1be2360ad\">mediump_dualquat</a>;</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf\">  197</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">float</span>, highp&gt;         <a class=\"code\" href=\"a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf\">highp_dualquat</a>;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#gaa38f671be25a7f3b136a452a8bb42860\">  203</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">float</span>, lowp&gt;          <a class=\"code\" href=\"a00178.html#gaa38f671be25a7f3b136a452a8bb42860\">lowp_fdualquat</a>;</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#ga4a6b594ff7e81150d8143001367a9431\">  208</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">float</span>, mediump&gt;       <a class=\"code\" href=\"a00178.html#ga4a6b594ff7e81150d8143001367a9431\">mediump_fdualquat</a>;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#ga4c4e55e9c99dc57b299ed590968da564\">  213</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">float</span>, highp&gt;         <a class=\"code\" href=\"a00178.html#ga4c4e55e9c99dc57b299ed590968da564\">highp_fdualquat</a>;</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a\">  219</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">double</span>, lowp&gt;         <a class=\"code\" href=\"a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a\">lowp_ddualquat</a>;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#ga0fb11e48e2d16348ccb06a25213641b4\">  224</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">double</span>, mediump&gt;      <a class=\"code\" href=\"a00178.html#ga0fb11e48e2d16348ccb06a25213641b4\">mediump_ddualquat</a>;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#ga8f67eafa7197d7a668dad5105a463d2a\">  229</a></span>&#160;        typedef tdualquat&lt;<span class=\"keywordtype\">double</span>, highp&gt;        <a class=\"code\" href=\"a00178.html#ga8f67eafa7197d7a668dad5105a463d2a\">highp_ddualquat</a>;</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;<span class=\"preprocessor\">#if(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;        <span class=\"keyword\">typedef</span> highp_fdualquat                 <a class=\"code\" href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">dualquat</a>;</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">  241</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_fdualquat                 <a class=\"code\" href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">fdualquat</a>;</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;        <span class=\"keyword\">typedef</span> highp_fdualquat                 <a class=\"code\" href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">dualquat</a>;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;        <span class=\"keyword\">typedef</span> highp_fdualquat                 <a class=\"code\" href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">fdualquat</a>;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;        <span class=\"keyword\">typedef</span> mediump_fdualquat               <a class=\"code\" href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">dualquat</a>;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;        <span class=\"keyword\">typedef</span> mediump_fdualquat               <a class=\"code\" href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">fdualquat</a>;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;        <span class=\"keyword\">typedef</span> lowp_fdualquat                  <a class=\"code\" href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">dualquat</a>;</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;        <span class=\"keyword\">typedef</span> lowp_fdualquat                  <a class=\"code\" href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">fdualquat</a>;</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM error: multiple default precision requested for single-precision floating-point types&quot;</span></div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;<span class=\"preprocessor\">#if(!defined(GLM_PRECISION_HIGHP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;        <span class=\"keyword\">typedef</span> highp_ddualquat                 <a class=\"code\" href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">ddualquat</a>;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_HIGHP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;        <span class=\"keyword\">typedef</span> highp_ddualquat                 <a class=\"code\" href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">ddualquat</a>;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) &amp;&amp; defined(GLM_PRECISION_MEDIUMP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;        <span class=\"keyword\">typedef</span> mediump_ddualquat               <a class=\"code\" href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">ddualquat</a>;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_DOUBLE) &amp;&amp; defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;        <span class=\"keyword\">typedef</span> lowp_ddualquat                  <a class=\"code\" href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">ddualquat</a>;</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM error: Multiple default precision requested for double-precision floating-point types&quot;</span></div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;<span class=\"preprocessor\">#include &quot;dual_quaternion.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00178_html_gae93abee0c979902fbec6a7bee0f6fae1\"><div class=\"ttname\"><a href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">glm::dualquat</a></div><div class=\"ttdeci\">highp_fdualquat dualquat</div><div class=\"ttdoc\">Dual-quaternion of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00236\">dual_quaternion.hpp:236</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_ga91025ebdca0f4ea54da08497b00e8c84\"><div class=\"ttname\"><a href=\"a00178.html#ga91025ebdca0f4ea54da08497b00e8c84\">glm::dualquat_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt; dualquat_cast(mat&lt; 3, 4, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion. </div></div>\n<div class=\"ttc\" id=\"a00178_html_ga4a6b594ff7e81150d8143001367a9431\"><div class=\"ttname\"><a href=\"a00178.html#ga4a6b594ff7e81150d8143001367a9431\">glm::mediump_fdualquat</a></div><div class=\"ttdeci\">tdualquat&lt; float, mediump &gt; mediump_fdualquat</div><div class=\"ttdoc\">Dual-quaternion of medium single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00208\">dual_quaternion.hpp:208</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_gae99d143b37f9cad4cd9285571aab685a\"><div class=\"ttname\"><a href=\"a00178.html#gae99d143b37f9cad4cd9285571aab685a\">glm::mat2x4_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 4, T, Q &gt; mat2x4_cast(tdualquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a quaternion to a 2 * 4 matrix. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_gab4c5103338af3dac7e0fbc86895a3f1a\"><div class=\"ttname\"><a href=\"a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a\">glm::lowp_ddualquat</a></div><div class=\"ttdeci\">tdualquat&lt; double, lowp &gt; lowp_ddualquat</div><div class=\"ttdoc\">Dual-quaternion of low double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00219\">dual_quaternion.hpp:219</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_gaf59f5bb69620d2891c3795c6f2639179\"><div class=\"ttname\"><a href=\"a00178.html#gaf59f5bb69620d2891c3795c6f2639179\">glm::mat3x4_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 4, T, Q &gt; mat3x4_cast(tdualquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a quaternion to a 3 * 4 matrix. </div></div>\n<div class=\"ttc\" id=\"a00216_html_ga1a32fceb71962e6160e8af295c91930a\"><div class=\"ttname\"><a href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">glm::orientation</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; orientation(vec&lt; 3, T, Q &gt; const &amp;Normal, vec&lt; 3, T, Q &gt; const &amp;Up)</div><div class=\"ttdoc\">Build a rotation matrix from a normal and a up vector. </div></div>\n<div class=\"ttc\" id=\"a00178_html_ga9ef5bf1da52a9d4932335a517086ceaf\"><div class=\"ttname\"><a href=\"a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf\">glm::highp_dualquat</a></div><div class=\"ttdeci\">tdualquat&lt; float, highp &gt; highp_dualquat</div><div class=\"ttdoc\">Dual-quaternion of high single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00197\">dual_quaternion.hpp:197</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_gade05d29ebd4deea0f883d0e1bb4169aa\"><div class=\"ttname\"><a href=\"a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa\">glm::lowp_dualquat</a></div><div class=\"ttdeci\">tdualquat&lt; float, lowp &gt; lowp_dualquat</div><div class=\"ttdoc\">Dual-quaternion of low single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00187\">dual_quaternion.hpp:187</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_ga237c2b9b42c9a930e49de5840ae0f930\"><div class=\"ttname\"><a href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">glm::fdualquat</a></div><div class=\"ttdeci\">highp_fdualquat fdualquat</div><div class=\"ttdoc\">Dual-quaternion of single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00241\">dual_quaternion.hpp:241</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_ga8f67eafa7197d7a668dad5105a463d2a\"><div class=\"ttname\"><a href=\"a00178.html#ga8f67eafa7197d7a668dad5105a463d2a\">glm::highp_ddualquat</a></div><div class=\"ttdeci\">tdualquat&lt; double, highp &gt; highp_ddualquat</div><div class=\"ttdoc\">Dual-quaternion of high double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00229\">dual_quaternion.hpp:229</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_ga4c4e55e9c99dc57b299ed590968da564\"><div class=\"ttname\"><a href=\"a00178.html#ga4c4e55e9c99dc57b299ed590968da564\">glm::highp_fdualquat</a></div><div class=\"ttdeci\">tdualquat&lt; float, highp &gt; highp_fdualquat</div><div class=\"ttdoc\">Dual-quaternion of high single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00213\">dual_quaternion.hpp:213</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_gace8380112d16d33f520839cb35a4d173\"><div class=\"ttname\"><a href=\"a00178.html#gace8380112d16d33f520839cb35a4d173\">glm::lerp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt; lerp(tdualquat&lt; T, Q &gt; const &amp;x, tdualquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</div><div class=\"ttdoc\">Returns the linear interpolation of two dual quaternion. </div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00178_html_ga3d71f98d84ba59dfe4e369fde4714cd6\"><div class=\"ttname\"><a href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">glm::ddualquat</a></div><div class=\"ttdeci\">highp_ddualquat ddualquat</div><div class=\"ttdoc\">Dual-quaternion of default double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00260\">dual_quaternion.hpp:260</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_gaa7aeb54c167712b38f2178a1be2360ad\"><div class=\"ttname\"><a href=\"a00178.html#gaa7aeb54c167712b38f2178a1be2360ad\">glm::mediump_dualquat</a></div><div class=\"ttdeci\">tdualquat&lt; float, mediump &gt; mediump_dualquat</div><div class=\"ttdoc\">Dual-quaternion of medium single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00192\">dual_quaternion.hpp:192</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_ga0fb11e48e2d16348ccb06a25213641b4\"><div class=\"ttname\"><a href=\"a00178.html#ga0fb11e48e2d16348ccb06a25213641b4\">glm::mediump_ddualquat</a></div><div class=\"ttdeci\">tdualquat&lt; double, mediump &gt; mediump_ddualquat</div><div class=\"ttdoc\">Dual-quaternion of medium double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00224\">dual_quaternion.hpp:224</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_ga0b35c0e30df8a875dbaa751e0bd800e0\"><div class=\"ttname\"><a href=\"a00178.html#ga0b35c0e30df8a875dbaa751e0bd800e0\">glm::dual_quat_identity</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt; dual_quat_identity()</div><div class=\"ttdoc\">Creates an identity dual quaternion. </div></div>\n<div class=\"ttc\" id=\"a00178_html_ga070f521a953f6461af4ab4cf8ccbf27e\"><div class=\"ttname\"><a href=\"a00178.html#ga070f521a953f6461af4ab4cf8ccbf27e\">glm::inverse</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt; inverse(tdualquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns the q inverse. </div></div>\n<div class=\"ttc\" id=\"a00178_html_gaa38f671be25a7f3b136a452a8bb42860\"><div class=\"ttname\"><a href=\"a00178.html#gaa38f671be25a7f3b136a452a8bb42860\">glm::lowp_fdualquat</a></div><div class=\"ttdeci\">tdualquat&lt; float, lowp &gt; lowp_fdualquat</div><div class=\"ttdoc\">Dual-quaternion of low single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00021_source.html#l00203\">dual_quaternion.hpp:203</a></div></div>\n<div class=\"ttc\" id=\"a00178_html_ga299b8641509606b1958ffa104a162cfe\"><div class=\"ttname\"><a href=\"a00178.html#ga299b8641509606b1958ffa104a162cfe\">glm::normalize</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt; normalize(tdualquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns the normalized quaternion. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00022.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: epsilon.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">epsilon.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00152.html\">GLM_GTC_epsilon</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00022_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga91b417866cafadd076004778217a1844\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga91b417866cafadd076004778217a1844\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html#ga91b417866cafadd076004778217a1844\">epsilonEqual</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga91b417866cafadd076004778217a1844\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of |x - y| &lt; epsilon.  <a href=\"a00152.html#ga91b417866cafadd076004778217a1844\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91b417866cafadd076004778217a1844\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7f227999ca09e7ca994e8b35aba47bb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa7f227999ca09e7ca994e8b35aba47bb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb\">epsilonEqual</a> (genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaa7f227999ca09e7ca994e8b35aba47bb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of |x - y| &lt; epsilon.  <a href=\"a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7f227999ca09e7ca994e8b35aba47bb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf840d33b9a5261ec78dcd5125743b025\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf840d33b9a5261ec78dcd5125743b025\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html#gaf840d33b9a5261ec78dcd5125743b025\">epsilonNotEqual</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaf840d33b9a5261ec78dcd5125743b025\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of |x - y| &lt; epsilon.  <a href=\"a00152.html#gaf840d33b9a5261ec78dcd5125743b025\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf840d33b9a5261ec78dcd5125743b025\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga50a92103fb0cbd796908e1bf20c79aaf\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga50a92103fb0cbd796908e1bf20c79aaf\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf\">epsilonNotEqual</a> (genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga50a92103fb0cbd796908e1bf20c79aaf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of |x - y| &gt;= epsilon.  <a href=\"a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50a92103fb0cbd796908e1bf20c79aaf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00152.html\">GLM_GTC_epsilon</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00022_source.html\">epsilon.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00022_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: epsilon.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">epsilon.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00022.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_epsilon extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb\">epsilonEqual</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb\">epsilonEqual</a>(genType <span class=\"keyword\">const</span>&amp; x, genType <span class=\"keyword\">const</span>&amp; y, genType <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf\">epsilonNotEqual</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf\">epsilonNotEqual</a>(genType <span class=\"keyword\">const</span>&amp; x, genType <span class=\"keyword\">const</span>&amp; y, genType <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">#include &quot;epsilon.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00151_html_ga2a1e57fc5592b69cfae84174cbfc9429\"><div class=\"ttname\"><a href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">glm::epsilon</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()</div><div class=\"ttdoc\">Return the epsilon constant for floating point types. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00152_html_gaa7f227999ca09e7ca994e8b35aba47bb\"><div class=\"ttname\"><a href=\"a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb\">glm::epsilonEqual</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool epsilonEqual(genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)</div><div class=\"ttdoc\">Returns the component-wise comparison of |x - y| < epsilon. </div></div>\n<div class=\"ttc\" id=\"a00152_html_ga50a92103fb0cbd796908e1bf20c79aaf\"><div class=\"ttname\"><a href=\"a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf\">glm::epsilonNotEqual</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool epsilonNotEqual(genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)</div><div class=\"ttdoc\">Returns the component-wise comparison of |x - y| >= epsilon. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00023.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: euler_angles.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">euler_angles.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00179.html\">GLM_GTX_euler_angles</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00023_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gafba6282e4ed3ff8b5c75331abfba3489\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gafba6282e4ed3ff8b5c75331abfba3489\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gafba6282e4ed3ff8b5c75331abfba3489\">eulerAngleX</a> (T const &amp;angleX)</td></tr>\n<tr class=\"memdesc:gafba6282e4ed3ff8b5c75331abfba3489\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X.  <a href=\"a00179.html#gafba6282e4ed3ff8b5c75331abfba3489\">More...</a><br /></td></tr>\n<tr class=\"separator:gafba6282e4ed3ff8b5c75331abfba3489\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga64036577ee17a2d24be0dbc05881d4e2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga64036577ee17a2d24be0dbc05881d4e2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga64036577ee17a2d24be0dbc05881d4e2\">eulerAngleXY</a> (T const &amp;angleX, T const &amp;angleY)</td></tr>\n<tr class=\"memdesc:ga64036577ee17a2d24be0dbc05881d4e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y).  <a href=\"a00179.html#ga64036577ee17a2d24be0dbc05881d4e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga64036577ee17a2d24be0dbc05881d4e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1975e0f0e9bed7f716dc9946da2ab645\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga1975e0f0e9bed7f716dc9946da2ab645\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga1975e0f0e9bed7f716dc9946da2ab645\">eulerAngleXYZ</a> (T const &amp;t1, T const &amp;t2, T const &amp;t3)</td></tr>\n<tr class=\"memdesc:ga1975e0f0e9bed7f716dc9946da2ab645\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z).  <a href=\"a00179.html#ga1975e0f0e9bed7f716dc9946da2ab645\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1975e0f0e9bed7f716dc9946da2ab645\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa39bd323c65c2fc0a1508be33a237ce9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaa39bd323c65c2fc0a1508be33a237ce9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gaa39bd323c65c2fc0a1508be33a237ce9\">eulerAngleXZ</a> (T const &amp;angleX, T const &amp;angleZ)</td></tr>\n<tr class=\"memdesc:gaa39bd323c65c2fc0a1508be33a237ce9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z).  <a href=\"a00179.html#gaa39bd323c65c2fc0a1508be33a237ce9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa39bd323c65c2fc0a1508be33a237ce9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab84bf4746805fd69b8ecbb230e3974c5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gab84bf4746805fd69b8ecbb230e3974c5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gab84bf4746805fd69b8ecbb230e3974c5\">eulerAngleY</a> (T const &amp;angleY)</td></tr>\n<tr class=\"memdesc:gab84bf4746805fd69b8ecbb230e3974c5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y.  <a href=\"a00179.html#gab84bf4746805fd69b8ecbb230e3974c5\">More...</a><br /></td></tr>\n<tr class=\"separator:gab84bf4746805fd69b8ecbb230e3974c5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga4f57e6dd25c3cffbbd4daa6ef3f4486d\">eulerAngleYX</a> (T const &amp;angleY, T const &amp;angleX)</td></tr>\n<tr class=\"memdesc:ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X).  <a href=\"a00179.html#ga4f57e6dd25c3cffbbd4daa6ef3f4486d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab8ba99a9814f6d9edf417b6c6d5b0c10\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gab8ba99a9814f6d9edf417b6c6d5b0c10\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gab8ba99a9814f6d9edf417b6c6d5b0c10\">eulerAngleYXZ</a> (T const &amp;yaw, T const &amp;pitch, T const &amp;roll)</td></tr>\n<tr class=\"memdesc:gab8ba99a9814f6d9edf417b6c6d5b0c10\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).  <a href=\"a00179.html#gab8ba99a9814f6d9edf417b6c6d5b0c10\">More...</a><br /></td></tr>\n<tr class=\"separator:gab8ba99a9814f6d9edf417b6c6d5b0c10\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga220379e10ac8cca55e275f0c9018fed9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga220379e10ac8cca55e275f0c9018fed9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga220379e10ac8cca55e275f0c9018fed9\">eulerAngleYZ</a> (T const &amp;angleY, T const &amp;angleZ)</td></tr>\n<tr class=\"memdesc:ga220379e10ac8cca55e275f0c9018fed9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z).  <a href=\"a00179.html#ga220379e10ac8cca55e275f0c9018fed9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga220379e10ac8cca55e275f0c9018fed9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5b3935248bb6c3ec6b0d9297d406e251\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga5b3935248bb6c3ec6b0d9297d406e251\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga5b3935248bb6c3ec6b0d9297d406e251\">eulerAngleZ</a> (T const &amp;angleZ)</td></tr>\n<tr class=\"memdesc:ga5b3935248bb6c3ec6b0d9297d406e251\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z.  <a href=\"a00179.html#ga5b3935248bb6c3ec6b0d9297d406e251\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5b3935248bb6c3ec6b0d9297d406e251\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga483903115cd4059228961046a28d69b5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga483903115cd4059228961046a28d69b5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga483903115cd4059228961046a28d69b5\">eulerAngleZX</a> (T const &amp;angle, T const &amp;angleX)</td></tr>\n<tr class=\"memdesc:ga483903115cd4059228961046a28d69b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X).  <a href=\"a00179.html#ga483903115cd4059228961046a28d69b5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga483903115cd4059228961046a28d69b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga400b2bd5984999efab663f3a68e1d020\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga400b2bd5984999efab663f3a68e1d020\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga400b2bd5984999efab663f3a68e1d020\">eulerAngleZY</a> (T const &amp;angleZ, T const &amp;angleY)</td></tr>\n<tr class=\"memdesc:ga400b2bd5984999efab663f3a68e1d020\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y).  <a href=\"a00179.html#ga400b2bd5984999efab663f3a68e1d020\">More...</a><br /></td></tr>\n<tr class=\"separator:ga400b2bd5984999efab663f3a68e1d020\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacea701562f778c1da4d3a0a1cf091000\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gacea701562f778c1da4d3a0a1cf091000\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gacea701562f778c1da4d3a0a1cf091000\">extractEulerAngleXYZ</a> (mat&lt; 4, 4, T, defaultp &gt; const &amp;M, T &amp;t1, T &amp;t2, T &amp;t3)</td></tr>\n<tr class=\"memdesc:gacea701562f778c1da4d3a0a1cf091000\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extracts the (X * Y * Z) Euler angles from the rotation matrix M.  <a href=\"a00179.html#gacea701562f778c1da4d3a0a1cf091000\">More...</a><br /></td></tr>\n<tr class=\"separator:gacea701562f778c1da4d3a0a1cf091000\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae16738a9f1887cf4e4db6a124637608d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae16738a9f1887cf4e4db6a124637608d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gae16738a9f1887cf4e4db6a124637608d\">orientate2</a> (T const &amp;angle)</td></tr>\n<tr class=\"memdesc:gae16738a9f1887cf4e4db6a124637608d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 2D 2 * 2 rotation matrix from an euler angle.  <a href=\"a00179.html#gae16738a9f1887cf4e4db6a124637608d\">More...</a><br /></td></tr>\n<tr class=\"separator:gae16738a9f1887cf4e4db6a124637608d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ca98668a5786f19c7b38299ebbc9b4c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga7ca98668a5786f19c7b38299ebbc9b4c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga7ca98668a5786f19c7b38299ebbc9b4c\">orientate3</a> (T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga7ca98668a5786f19c7b38299ebbc9b4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle.  <a href=\"a00179.html#ga7ca98668a5786f19c7b38299ebbc9b4c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ca98668a5786f19c7b38299ebbc9b4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7238c8e15c7720e3ca6a45ab151eeabb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7238c8e15c7720e3ca6a45ab151eeabb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb\">orientate3</a> (vec&lt; 3, T, Q &gt; const &amp;angles)</td></tr>\n<tr class=\"memdesc:ga7238c8e15c7720e3ca6a45ab151eeabb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z).  <a href=\"a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7238c8e15c7720e3ca6a45ab151eeabb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4a044653f71a4ecec68e0b623382b48a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4a044653f71a4ecec68e0b623382b48a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga4a044653f71a4ecec68e0b623382b48a\">orientate4</a> (vec&lt; 3, T, Q &gt; const &amp;angles)</td></tr>\n<tr class=\"memdesc:ga4a044653f71a4ecec68e0b623382b48a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).  <a href=\"a00179.html#ga4a044653f71a4ecec68e0b623382b48a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4a044653f71a4ecec68e0b623382b48a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae6aa26ccb020d281b449619e419a609e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae6aa26ccb020d281b449619e419a609e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gae6aa26ccb020d281b449619e419a609e\">yawPitchRoll</a> (T const &amp;yaw, T const &amp;pitch, T const &amp;roll)</td></tr>\n<tr class=\"memdesc:gae6aa26ccb020d281b449619e419a609e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).  <a href=\"a00179.html#gae6aa26ccb020d281b449619e419a609e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae6aa26ccb020d281b449619e419a609e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00179.html\">GLM_GTX_euler_angles</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00023_source.html\">euler_angles.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00023_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: euler_angles.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">euler_angles.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00023.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_euler_angles is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_euler_angles extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#gafba6282e4ed3ff8b5c75331abfba3489\">eulerAngleX</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleX);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#gab84bf4746805fd69b8ecbb230e3974c5\">eulerAngleY</a>(</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleY);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#ga5b3935248bb6c3ec6b0d9297d406e251\">eulerAngleZ</a>(</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleZ);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#ga64036577ee17a2d24be0dbc05881d4e2\">eulerAngleXY</a>(</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleX,</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleY);</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#ga4f57e6dd25c3cffbbd4daa6ef3f4486d\">eulerAngleYX</a>(</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleY,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleX);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#gaa39bd323c65c2fc0a1508be33a237ce9\">eulerAngleXZ</a>(</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleX,</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleZ);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#ga483903115cd4059228961046a28d69b5\">eulerAngleZX</a>(</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>,</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleX);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#ga220379e10ac8cca55e275f0c9018fed9\">eulerAngleYZ</a>(</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleY,</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleZ);</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#ga400b2bd5984999efab663f3a68e1d020\">eulerAngleZY</a>(</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleZ,</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                T <span class=\"keyword\">const</span>&amp; angleY);</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;    <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;    GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#ga1975e0f0e9bed7f716dc9946da2ab645\">eulerAngleXYZ</a>(</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        T <span class=\"keyword\">const</span>&amp; t1,</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;        T <span class=\"keyword\">const</span>&amp; t2,</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;        T <span class=\"keyword\">const</span>&amp; t3);</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;    </div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#gab8ba99a9814f6d9edf417b6c6d5b0c10\">eulerAngleYXZ</a>(</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">yaw</a>,</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">pitch</a>,</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">roll</a>);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;    </div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#gae6aa26ccb020d281b449619e419a609e\">yawPitchRoll</a>(</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">yaw</a>,</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">pitch</a>,</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">roll</a>);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#gae16738a9f1887cf4e4db6a124637608d\">orientate2</a>(T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, defaultp&gt; <a class=\"code\" href=\"a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb\">orientate3</a>(T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb\">orientate3</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; angles);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00179.html#ga4a044653f71a4ecec68e0b623382b48a\">orientate4</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; angles);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;    <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;    GLM_FUNC_DECL <span class=\"keywordtype\">void</span> <a class=\"code\" href=\"a00179.html#gacea701562f778c1da4d3a0a1cf091000\">extractEulerAngleXYZ</a>(mat&lt;4, 4, T, defaultp&gt; <span class=\"keyword\">const</span>&amp; M,</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;                                            T &amp; t1,</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                                            T &amp; t2,</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                                            T &amp; t3);</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;    </div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;<span class=\"preprocessor\">#include &quot;euler_angles.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00179_html_gaa39bd323c65c2fc0a1508be33a237ce9\"><div class=\"ttname\"><a href=\"a00179.html#gaa39bd323c65c2fc0a1508be33a237ce9\">glm::eulerAngleXZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleXZ(T const &amp;angleX, T const &amp;angleZ)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z). </div></div>\n<div class=\"ttc\" id=\"a00179_html_gae16738a9f1887cf4e4db6a124637608d\"><div class=\"ttname\"><a href=\"a00179.html#gae16738a9f1887cf4e4db6a124637608d\">glm::orientate2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt; orientate2(T const &amp;angle)</div><div class=\"ttdoc\">Creates a 2D 2 * 2 rotation matrix from an euler angle. </div></div>\n<div class=\"ttc\" id=\"a00179_html_ga7238c8e15c7720e3ca6a45ab151eeabb\"><div class=\"ttname\"><a href=\"a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb\">glm::orientate3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; orientate3(vec&lt; 3, T, Q &gt; const &amp;angles)</div><div class=\"ttdoc\">Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z). </div></div>\n<div class=\"ttc\" id=\"a00179_html_ga64036577ee17a2d24be0dbc05881d4e2\"><div class=\"ttname\"><a href=\"a00179.html#ga64036577ee17a2d24be0dbc05881d4e2\">glm::eulerAngleXY</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleXY(T const &amp;angleX, T const &amp;angleY)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y). </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00179_html_ga4a044653f71a4ecec68e0b623382b48a\"><div class=\"ttname\"><a href=\"a00179.html#ga4a044653f71a4ecec68e0b623382b48a\">glm::orientate4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; orientate4(vec&lt; 3, T, Q &gt; const &amp;angles)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). </div></div>\n<div class=\"ttc\" id=\"a00179_html_gafba6282e4ed3ff8b5c75331abfba3489\"><div class=\"ttname\"><a href=\"a00179.html#gafba6282e4ed3ff8b5c75331abfba3489\">glm::eulerAngleX</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleX(T const &amp;angleX)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X. </div></div>\n<div class=\"ttc\" id=\"a00179_html_ga220379e10ac8cca55e275f0c9018fed9\"><div class=\"ttname\"><a href=\"a00179.html#ga220379e10ac8cca55e275f0c9018fed9\">glm::eulerAngleYZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleYZ(T const &amp;angleY, T const &amp;angleZ)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z). </div></div>\n<div class=\"ttc\" id=\"a00179_html_gab84bf4746805fd69b8ecbb230e3974c5\"><div class=\"ttname\"><a href=\"a00179.html#gab84bf4746805fd69b8ecbb230e3974c5\">glm::eulerAngleY</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleY(T const &amp;angleY)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y. </div></div>\n<div class=\"ttc\" id=\"a00179_html_ga5b3935248bb6c3ec6b0d9297d406e251\"><div class=\"ttname\"><a href=\"a00179.html#ga5b3935248bb6c3ec6b0d9297d406e251\">glm::eulerAngleZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleZ(T const &amp;angleZ)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z. </div></div>\n<div class=\"ttc\" id=\"a00179_html_gae6aa26ccb020d281b449619e419a609e\"><div class=\"ttname\"><a href=\"a00179.html#gae6aa26ccb020d281b449619e419a609e\">glm::yawPitchRoll</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; yawPitchRoll(T const &amp;yaw, T const &amp;pitch, T const &amp;roll)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). </div></div>\n<div class=\"ttc\" id=\"a00179_html_gab8ba99a9814f6d9edf417b6c6d5b0c10\"><div class=\"ttname\"><a href=\"a00179.html#gab8ba99a9814f6d9edf417b6c6d5b0c10\">glm::eulerAngleYXZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleYXZ(T const &amp;yaw, T const &amp;pitch, T const &amp;roll)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). </div></div>\n<div class=\"ttc\" id=\"a00179_html_gacea701562f778c1da4d3a0a1cf091000\"><div class=\"ttname\"><a href=\"a00179.html#gacea701562f778c1da4d3a0a1cf091000\">glm::extractEulerAngleXYZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL void extractEulerAngleXYZ(mat&lt; 4, 4, T, defaultp &gt; const &amp;M, T &amp;t1, T &amp;t2, T &amp;t3)</div><div class=\"ttdoc\">Extracts the (X * Y * Z) Euler angles from the rotation matrix M. </div></div>\n<div class=\"ttc\" id=\"a00179_html_ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><div class=\"ttname\"><a href=\"a00179.html#ga4f57e6dd25c3cffbbd4daa6ef3f4486d\">glm::eulerAngleYX</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleYX(T const &amp;angleY, T const &amp;angleX)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X). </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga9bd78e5fe153d07e39fb4c83e73dba73\"><div class=\"ttname\"><a href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">glm::pitch</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T pitch(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns pitch value of euler angles expressed in radians. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga53feffeb4001b99e36e216522e465e9e\"><div class=\"ttname\"><a href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">glm::yaw</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T yaw(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns yaw value of euler angles expressed in radians. </div></div>\n<div class=\"ttc\" id=\"a00179_html_ga483903115cd4059228961046a28d69b5\"><div class=\"ttname\"><a href=\"a00179.html#ga483903115cd4059228961046a28d69b5\">glm::eulerAngleZX</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleZX(T const &amp;angle, T const &amp;angleX)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X). </div></div>\n<div class=\"ttc\" id=\"a00179_html_ga1975e0f0e9bed7f716dc9946da2ab645\"><div class=\"ttname\"><a href=\"a00179.html#ga1975e0f0e9bed7f716dc9946da2ab645\">glm::eulerAngleXYZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleXYZ(T const &amp;t1, T const &amp;t2, T const &amp;t3)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z). </div></div>\n<div class=\"ttc\" id=\"a00179_html_ga400b2bd5984999efab663f3a68e1d020\"><div class=\"ttname\"><a href=\"a00179.html#ga400b2bd5984999efab663f3a68e1d020\">glm::eulerAngleZY</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; eulerAngleZY(T const &amp;angleZ, T const &amp;angleY)</div><div class=\"ttdoc\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y). </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga3ff93afbd9cc29f2ad217f2228e8a95b\"><div class=\"ttname\"><a href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">glm::roll</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T roll(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns roll value of euler angles expressed in radians. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00024.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: exponential.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">exponential.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00024_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga071566cadc7505455e611f2a0353f4d4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga071566cadc7505455e611f2a0353f4d4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">exp</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga071566cadc7505455e611f2a0353f4d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the natural exponentiation of x, i.e., e^x.  <a href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga071566cadc7505455e611f2a0353f4d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaff17ace6b579a03bf223ed4d1ed2cd16\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaff17ace6b579a03bf223ed4d1ed2cd16\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#gaff17ace6b579a03bf223ed4d1ed2cd16\">exp2</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaff17ace6b579a03bf223ed4d1ed2cd16\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 2 raised to the v power.  <a href=\"a00141.html#gaff17ace6b579a03bf223ed4d1ed2cd16\">More...</a><br /></td></tr>\n<tr class=\"separator:gaff17ace6b579a03bf223ed4d1ed2cd16\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga523dd6bd0ad9f75ae2d24c8e4b017b7a\">inversesqrt</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the reciprocal of the positive square root of v.  <a href=\"a00141.html#ga523dd6bd0ad9f75ae2d24c8e4b017b7a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga918c9f3fd086ce20e6760c903bd30fa9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga918c9f3fd086ce20e6760c903bd30fa9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga918c9f3fd086ce20e6760c903bd30fa9\">log</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga918c9f3fd086ce20e6760c903bd30fa9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the natural logarithm of v, i.e., returns the value y which satisfies the equation x = e^y.  <a href=\"a00141.html#ga918c9f3fd086ce20e6760c903bd30fa9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga918c9f3fd086ce20e6760c903bd30fa9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga82831c7d9cca777cebedfe03a19c8d75\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga82831c7d9cca777cebedfe03a19c8d75\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga82831c7d9cca777cebedfe03a19c8d75\">log2</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga82831c7d9cca777cebedfe03a19c8d75\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the base 2 log of x, i.e., returns the value y, which satisfies the equation x = 2 ^ y.  <a href=\"a00141.html#ga82831c7d9cca777cebedfe03a19c8d75\">More...</a><br /></td></tr>\n<tr class=\"separator:ga82831c7d9cca777cebedfe03a19c8d75\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2254981952d4f333b900a6bf5167a6c4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2254981952d4f333b900a6bf5167a6c4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga2254981952d4f333b900a6bf5167a6c4\">pow</a> (vec&lt; L, T, Q &gt; const &amp;base, vec&lt; L, T, Q &gt; const &amp;exponent)</td></tr>\n<tr class=\"memdesc:ga2254981952d4f333b900a6bf5167a6c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 'base' raised to the power 'exponent'.  <a href=\"a00141.html#ga2254981952d4f333b900a6bf5167a6c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2254981952d4f333b900a6bf5167a6c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa83e5f1648b7ccdf33b87c07c76cb77c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa83e5f1648b7ccdf33b87c07c76cb77c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#gaa83e5f1648b7ccdf33b87c07c76cb77c\">sqrt</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa83e5f1648b7ccdf33b87c07c76cb77c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the positive square root of v.  <a href=\"a00141.html#gaa83e5f1648b7ccdf33b87c07c76cb77c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa83e5f1648b7ccdf33b87c07c76cb77c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00024_source.html\">exponential.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00024_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: exponential.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">exponential.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00024.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00121.html\">detail/type_vec1.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">detail/type_vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">detail/type_vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">detail/type_vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &lt;cmath&gt;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00141.html#ga2254981952d4f333b900a6bf5167a6c4\">pow</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; base, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; exponent);</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">exp</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00141.html#ga918c9f3fd086ce20e6760c903bd30fa9\">log</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00141.html#gaff17ace6b579a03bf223ed4d1ed2cd16\">exp2</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00141.html#ga82831c7d9cca777cebedfe03a19c8d75\">log2</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00141.html#gaa83e5f1648b7ccdf33b87c07c76cb77c\">sqrt</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00141.html#ga523dd6bd0ad9f75ae2d24c8e4b017b7a\">inversesqrt</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;<span class=\"preprocessor\">#include &quot;detail/func_exponential.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00121_html\"><div class=\"ttname\"><a href=\"a00121.html\">type_vec1.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00141_html_ga82831c7d9cca777cebedfe03a19c8d75\"><div class=\"ttname\"><a href=\"a00141.html#ga82831c7d9cca777cebedfe03a19c8d75\">glm::log2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; log2(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the base 2 log of x, i.e., returns the value y, which satisfies the equation x = 2 ^ y...</div></div>\n<div class=\"ttc\" id=\"a00141_html_ga071566cadc7505455e611f2a0353f4d4\"><div class=\"ttname\"><a href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">glm::exp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; exp(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the natural exponentiation of x, i.e., e^x. </div></div>\n<div class=\"ttc\" id=\"a00141_html_ga2254981952d4f333b900a6bf5167a6c4\"><div class=\"ttname\"><a href=\"a00141.html#ga2254981952d4f333b900a6bf5167a6c4\">glm::pow</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; pow(vec&lt; L, T, Q &gt; const &amp;base, vec&lt; L, T, Q &gt; const &amp;exponent)</div><div class=\"ttdoc\">Returns &#39;base&#39; raised to the power &#39;exponent&#39;. </div></div>\n<div class=\"ttc\" id=\"a00141_html_ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><div class=\"ttname\"><a href=\"a00141.html#ga523dd6bd0ad9f75ae2d24c8e4b017b7a\">glm::inversesqrt</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; inversesqrt(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the reciprocal of the positive square root of v. </div></div>\n<div class=\"ttc\" id=\"a00141_html_gaa83e5f1648b7ccdf33b87c07c76cb77c\"><div class=\"ttname\"><a href=\"a00141.html#gaa83e5f1648b7ccdf33b87c07c76cb77c\">glm::sqrt</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; sqrt(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the positive square root of v. </div></div>\n<div class=\"ttc\" id=\"a00141_html_gaff17ace6b579a03bf223ed4d1ed2cd16\"><div class=\"ttname\"><a href=\"a00141.html#gaff17ace6b579a03bf223ed4d1ed2cd16\">glm::exp2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; exp2(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns 2 raised to the v power. </div></div>\n<div class=\"ttc\" id=\"a00141_html_ga918c9f3fd086ce20e6760c903bd30fa9\"><div class=\"ttname\"><a href=\"a00141.html#ga918c9f3fd086ce20e6760c903bd30fa9\">glm::log</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; log(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the natural logarithm of v, i.e., returns the value y which satisfies the equation x = e^y...</div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00025.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: ext.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">ext.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a> (Dependence)  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00025_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> (Dependence) </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00025_source.html\">ext.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00025_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: ext.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">ext.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00025.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;</div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;</div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00035.html\">glm.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_EXT_INCLUDED_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_EXT_INCLUDED_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: All extensions included (not recommanded)&quot;)</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00009.html\">./gtc/bitfield.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00012.html\">./gtc/color_space.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00020.html\">./gtc/constants.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00022.html\">./gtc/epsilon.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00039.html\">./gtc/integer.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00056.html\">./gtc/matrix_access.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00060.html\">./gtc/matrix_integer.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00062.html\">./gtc/matrix_inverse.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00066.html\">./gtc/matrix_transform.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00069.html\">./gtc/noise.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00076.html\">./gtc/packing.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00083.html\">./gtc/quaternion.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00085.html\">./gtc/random.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00088.html\">./gtc/reciprocal.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00091.html\">./gtc/round.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"comment\">//#include &quot;./gtc/type_aligned.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00117.html\">./gtc/type_precision.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00118.html\">./gtc/type_ptr.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00125.html\">./gtc/ulp.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00126.html\">./gtc/vec1.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#       include &quot;<a class=\"code\" href=\"a00101.html\">./gtc/type_aligned.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">#ifdef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00007.html\">./gtx/associated_min_max.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00008.html\">./gtx/bit.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00010.html\">./gtx/closest_point.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00011.html\">./gtx/color_encoding.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00013.html\">./gtx/color_space.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00014.html\">./gtx/color_space_YCoCg.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00017.html\">./gtx/compatibility.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00018.html\">./gtx/component_wise.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00021.html\">./gtx/dual_quaternion.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00023.html\">./gtx/euler_angles.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00026.html\">./gtx/extend.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00027.html\">./gtx/extended_min_max.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00029.html\">./gtx/fast_exponential.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00030.html\">./gtx/fast_square_root.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00031.html\">./gtx/fast_trigonometry.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00032.html\">./gtx/functions.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00036.html\">./gtx/gradient_paint.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00037.html\">./gtx/handed_coordinate_space.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00040.html\">./gtx/integer.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00042.html\">./gtx/intersect.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00044.html\">./gtx/log_base.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00057.html\">./gtx/matrix_cross_product.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00061.html\">./gtx/matrix_interpolation.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00063.html\">./gtx/matrix_major_storage.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00064.html\">./gtx/matrix_operation.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00065.html\">./gtx/matrix_query.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00068.html\">./gtx/mixed_product.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00070.html\">./gtx/norm.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00071.html\">./gtx/normal.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00072.html\">./gtx/normalize_dot.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00073.html\">./gtx/number_precision.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00074.html\">./gtx/optimum_pow.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00075.html\">./gtx/orthonormalize.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00079.html\">./gtx/perpendicular.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00080.html\">./gtx/polar_coordinates.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00081.html\">./gtx/projection.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00084.html\">./gtx/quaternion.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00087.html\">./gtx/raw_data.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00090.html\">./gtx/rotate_vector.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00095.html\">./gtx/spline.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00096.html\">./gtx/std_based_type.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;<span class=\"preprocessor\">#if !(GLM_COMPILER &amp; GLM_COMPILER_CUDA)</span></div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;<span class=\"preprocessor\">#       include &quot;<a class=\"code\" href=\"a00097.html\">./gtx/string_cast.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00098.html\">./gtx/transform.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00099.html\">./gtx/transform2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00130.html\">./gtx/vec_swizzle.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00131.html\">./gtx/vector_angle.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00132.html\">./gtx/vector_query.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00134.html\">./gtx/wrap.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_TEMPLATE_ALIASES</span></div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;<span class=\"preprocessor\">#       include &quot;<a class=\"code\" href=\"a00092.html\">./gtx/scalar_multiplication.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_RANGE_FOR</span></div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"preprocessor\">#       include &quot;<a class=\"code\" href=\"a00086.html\">./gtx/range.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;<span class=\"preprocessor\">#endif//GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"ttc\" id=\"a00022_html\"><div class=\"ttname\"><a href=\"a00022.html\">epsilon.hpp</a></div><div class=\"ttdoc\">GLM_GTC_epsilon </div></div>\n<div class=\"ttc\" id=\"a00010_html\"><div class=\"ttname\"><a href=\"a00010.html\">closest_point.hpp</a></div><div class=\"ttdoc\">GLM_GTX_closest_point </div></div>\n<div class=\"ttc\" id=\"a00068_html\"><div class=\"ttname\"><a href=\"a00068.html\">mixed_product.hpp</a></div><div class=\"ttdoc\">GLM_GTX_mixed_producte </div></div>\n<div class=\"ttc\" id=\"a00039_html\"><div class=\"ttname\"><a href=\"a00039.html\">integer.hpp</a></div><div class=\"ttdoc\">GLM_GTC_integer </div></div>\n<div class=\"ttc\" id=\"a00091_html\"><div class=\"ttname\"><a href=\"a00091.html\">round.hpp</a></div><div class=\"ttdoc\">GLM_GTC_round </div></div>\n<div class=\"ttc\" id=\"a00056_html\"><div class=\"ttname\"><a href=\"a00056.html\">matrix_access.hpp</a></div><div class=\"ttdoc\">GLM_GTC_matrix_access </div></div>\n<div class=\"ttc\" id=\"a00027_html\"><div class=\"ttname\"><a href=\"a00027.html\">extended_min_max.hpp</a></div><div class=\"ttdoc\">GLM_GTX_extented_min_max </div></div>\n<div class=\"ttc\" id=\"a00044_html\"><div class=\"ttname\"><a href=\"a00044.html\">log_base.hpp</a></div><div class=\"ttdoc\">GLM_GTX_log_base </div></div>\n<div class=\"ttc\" id=\"a00042_html\"><div class=\"ttname\"><a href=\"a00042.html\">intersect.hpp</a></div><div class=\"ttdoc\">GLM_GTX_intersect </div></div>\n<div class=\"ttc\" id=\"a00030_html\"><div class=\"ttname\"><a href=\"a00030.html\">fast_square_root.hpp</a></div><div class=\"ttdoc\">GLM_GTX_fast_square_root </div></div>\n<div class=\"ttc\" id=\"a00130_html\"><div class=\"ttname\"><a href=\"a00130.html\">vec_swizzle.hpp</a></div><div class=\"ttdoc\">GLM_GTX_vec_swizzle </div></div>\n<div class=\"ttc\" id=\"a00088_html\"><div class=\"ttname\"><a href=\"a00088.html\">reciprocal.hpp</a></div><div class=\"ttdoc\">GLM_GTC_reciprocal </div></div>\n<div class=\"ttc\" id=\"a00101_html\"><div class=\"ttname\"><a href=\"a00101.html\">type_aligned.hpp</a></div><div class=\"ttdoc\">GLM_GTC_type_aligned </div></div>\n<div class=\"ttc\" id=\"a00076_html\"><div class=\"ttname\"><a href=\"a00076.html\">packing.hpp</a></div><div class=\"ttdoc\">GLM_GTC_packing </div></div>\n<div class=\"ttc\" id=\"a00064_html\"><div class=\"ttname\"><a href=\"a00064.html\">matrix_operation.hpp</a></div><div class=\"ttdoc\">GLM_GTX_matrix_operation </div></div>\n<div class=\"ttc\" id=\"a00035_html\"><div class=\"ttname\"><a href=\"a00035.html\">glm.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00062_html\"><div class=\"ttname\"><a href=\"a00062.html\">matrix_inverse.hpp</a></div><div class=\"ttdoc\">GLM_GTC_matrix_inverse </div></div>\n<div class=\"ttc\" id=\"a00023_html\"><div class=\"ttname\"><a href=\"a00023.html\">euler_angles.hpp</a></div><div class=\"ttdoc\">GLM_GTX_euler_angles </div></div>\n<div class=\"ttc\" id=\"a00021_html\"><div class=\"ttname\"><a href=\"a00021.html\">dual_quaternion.hpp</a></div><div class=\"ttdoc\">GLM_GTX_dual_quaternion </div></div>\n<div class=\"ttc\" id=\"a00079_html\"><div class=\"ttname\"><a href=\"a00079.html\">perpendicular.hpp</a></div><div class=\"ttdoc\">GLM_GTX_perpendicular </div></div>\n<div class=\"ttc\" id=\"a00096_html\"><div class=\"ttname\"><a href=\"a00096.html\">std_based_type.hpp</a></div><div class=\"ttdoc\">GLM_GTX_std_based_type </div></div>\n<div class=\"ttc\" id=\"a00084_html\"><div class=\"ttname\"><a href=\"a00084.html\">quaternion.hpp</a></div><div class=\"ttdoc\">GLM_GTX_quaternion </div></div>\n<div class=\"ttc\" id=\"a00018_html\"><div class=\"ttname\"><a href=\"a00018.html\">component_wise.hpp</a></div><div class=\"ttdoc\">GLM_GTX_component_wise </div></div>\n<div class=\"ttc\" id=\"a00118_html\"><div class=\"ttname\"><a href=\"a00118.html\">type_ptr.hpp</a></div><div class=\"ttdoc\">GLM_GTC_type_ptr </div></div>\n<div class=\"ttc\" id=\"a00070_html\"><div class=\"ttname\"><a href=\"a00070.html\">norm.hpp</a></div><div class=\"ttdoc\">GLM_GTX_norm </div></div>\n<div class=\"ttc\" id=\"a00099_html\"><div class=\"ttname\"><a href=\"a00099.html\">transform2.hpp</a></div><div class=\"ttdoc\">GLM_GTX_transform2 </div></div>\n<div class=\"ttc\" id=\"a00087_html\"><div class=\"ttname\"><a href=\"a00087.html\">raw_data.hpp</a></div><div class=\"ttdoc\">GLM_GTX_raw_data </div></div>\n<div class=\"ttc\" id=\"a00075_html\"><div class=\"ttname\"><a href=\"a00075.html\">orthonormalize.hpp</a></div><div class=\"ttdoc\">GLM_GTX_orthonormalize </div></div>\n<div class=\"ttc\" id=\"a00063_html\"><div class=\"ttname\"><a href=\"a00063.html\">matrix_major_storage.hpp</a></div><div class=\"ttdoc\">GLM_GTX_matrix_major_storage </div></div>\n<div class=\"ttc\" id=\"a00009_html\"><div class=\"ttname\"><a href=\"a00009.html\">bitfield.hpp</a></div><div class=\"ttdoc\">GLM_GTC_bitfield </div></div>\n<div class=\"ttc\" id=\"a00090_html\"><div class=\"ttname\"><a href=\"a00090.html\">rotate_vector.hpp</a></div><div class=\"ttdoc\">GLM_GTX_rotate_vector </div></div>\n<div class=\"ttc\" id=\"a00061_html\"><div class=\"ttname\"><a href=\"a00061.html\">matrix_interpolation.hpp</a></div><div class=\"ttdoc\">GLM_GTX_matrix_interpolation </div></div>\n<div class=\"ttc\" id=\"a00026_html\"><div class=\"ttname\"><a href=\"a00026.html\">extend.hpp</a></div><div class=\"ttdoc\">GLM_GTX_extend </div></div>\n<div class=\"ttc\" id=\"a00126_html\"><div class=\"ttname\"><a href=\"a00126.html\">vec1.hpp</a></div><div class=\"ttdoc\">GLM_GTC_vec1 </div></div>\n<div class=\"ttc\" id=\"a00014_html\"><div class=\"ttname\"><a href=\"a00014.html\">color_space_YCoCg.hpp</a></div><div class=\"ttdoc\">GLM_GTX_color_space_YCoCg </div></div>\n<div class=\"ttc\" id=\"a00012_html\"><div class=\"ttname\"><a href=\"a00012.html\">color_space.hpp</a></div><div class=\"ttdoc\">GLM_GTC_color_space </div></div>\n<div class=\"ttc\" id=\"a00095_html\"><div class=\"ttname\"><a href=\"a00095.html\">spline.hpp</a></div><div class=\"ttdoc\">GLM_GTX_spline </div></div>\n<div class=\"ttc\" id=\"a00083_html\"><div class=\"ttname\"><a href=\"a00083.html\">quaternion.hpp</a></div><div class=\"ttdoc\">GLM_GTC_quaternion </div></div>\n<div class=\"ttc\" id=\"a00029_html\"><div class=\"ttname\"><a href=\"a00029.html\">fast_exponential.hpp</a></div><div class=\"ttdoc\">GLM_GTX_fast_exponential </div></div>\n<div class=\"ttc\" id=\"a00081_html\"><div class=\"ttname\"><a href=\"a00081.html\">projection.hpp</a></div><div class=\"ttdoc\">GLM_GTX_projection </div></div>\n<div class=\"ttc\" id=\"a00017_html\"><div class=\"ttname\"><a href=\"a00017.html\">compatibility.hpp</a></div><div class=\"ttdoc\">GLM_GTX_compatibility </div></div>\n<div class=\"ttc\" id=\"a00117_html\"><div class=\"ttname\"><a href=\"a00117.html\">type_precision.hpp</a></div><div class=\"ttdoc\">GLM_GTC_type_precision </div></div>\n<div class=\"ttc\" id=\"a00134_html\"><div class=\"ttname\"><a href=\"a00134.html\">wrap.hpp</a></div><div class=\"ttdoc\">GLM_GTX_wrap </div></div>\n<div class=\"ttc\" id=\"a00032_html\"><div class=\"ttname\"><a href=\"a00032.html\">functions.hpp</a></div><div class=\"ttdoc\">GLM_GTX_functions </div></div>\n<div class=\"ttc\" id=\"a00132_html\"><div class=\"ttname\"><a href=\"a00132.html\">vector_query.hpp</a></div><div class=\"ttdoc\">GLM_GTX_vector_query </div></div>\n<div class=\"ttc\" id=\"a00020_html\"><div class=\"ttname\"><a href=\"a00020.html\">constants.hpp</a></div><div class=\"ttdoc\">GLM_GTC_constants </div></div>\n<div class=\"ttc\" id=\"a00066_html\"><div class=\"ttname\"><a href=\"a00066.html\">matrix_transform.hpp</a></div><div class=\"ttdoc\">GLM_GTC_matrix_transform </div></div>\n<div class=\"ttc\" id=\"a00037_html\"><div class=\"ttname\"><a href=\"a00037.html\">handed_coordinate_space.hpp</a></div><div class=\"ttdoc\">GLM_GTX_handed_coordinate_space </div></div>\n<div class=\"ttc\" id=\"a00125_html\"><div class=\"ttname\"><a href=\"a00125.html\">ulp.hpp</a></div><div class=\"ttdoc\">GLM_GTC_ulp </div></div>\n<div class=\"ttc\" id=\"a00013_html\"><div class=\"ttname\"><a href=\"a00013.html\">color_space.hpp</a></div><div class=\"ttdoc\">GLM_GTX_color_space </div></div>\n<div class=\"ttc\" id=\"a00040_html\"><div class=\"ttname\"><a href=\"a00040.html\">integer.hpp</a></div><div class=\"ttdoc\">GLM_GTX_integer </div></div>\n<div class=\"ttc\" id=\"a00011_html\"><div class=\"ttname\"><a href=\"a00011.html\">color_encoding.hpp</a></div><div class=\"ttdoc\">GLM_GTX_color_encoding </div></div>\n<div class=\"ttc\" id=\"a00098_html\"><div class=\"ttname\"><a href=\"a00098.html\">transform.hpp</a></div><div class=\"ttdoc\">GLM_GTX_transform </div></div>\n<div class=\"ttc\" id=\"a00069_html\"><div class=\"ttname\"><a href=\"a00069.html\">noise.hpp</a></div><div class=\"ttdoc\">GLM_GTC_noise </div></div>\n<div class=\"ttc\" id=\"a00086_html\"><div class=\"ttname\"><a href=\"a00086.html\">range.hpp</a></div><div class=\"ttdoc\">GLM_GTX_range </div></div>\n<div class=\"ttc\" id=\"a00057_html\"><div class=\"ttname\"><a href=\"a00057.html\">matrix_cross_product.hpp</a></div><div class=\"ttdoc\">GLM_GTX_matrix_cross_product </div></div>\n<div class=\"ttc\" id=\"a00074_html\"><div class=\"ttname\"><a href=\"a00074.html\">optimum_pow.hpp</a></div><div class=\"ttdoc\">GLM_GTX_optimum_pow </div></div>\n<div class=\"ttc\" id=\"a00072_html\"><div class=\"ttname\"><a href=\"a00072.html\">normalize_dot.hpp</a></div><div class=\"ttdoc\">GLM_GTX_normalize_dot </div></div>\n<div class=\"ttc\" id=\"a00008_html\"><div class=\"ttname\"><a href=\"a00008.html\">bit.hpp</a></div><div class=\"ttdoc\">GLM_GTX_bit </div></div>\n<div class=\"ttc\" id=\"a00060_html\"><div class=\"ttname\"><a href=\"a00060.html\">matrix_integer.hpp</a></div><div class=\"ttdoc\">GLM_GTC_matrix_integer </div></div>\n<div class=\"ttc\" id=\"a00031_html\"><div class=\"ttname\"><a href=\"a00031.html\">fast_trigonometry.hpp</a></div><div class=\"ttdoc\">GLM_GTX_fast_trigonometry </div></div>\n<div class=\"ttc\" id=\"a00131_html\"><div class=\"ttname\"><a href=\"a00131.html\">vector_angle.hpp</a></div><div class=\"ttdoc\">GLM_GTX_vector_angle </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00065_html\"><div class=\"ttname\"><a href=\"a00065.html\">matrix_query.hpp</a></div><div class=\"ttdoc\">GLM_GTX_matrix_query </div></div>\n<div class=\"ttc\" id=\"a00092_html\"><div class=\"ttname\"><a href=\"a00092.html\">scalar_multiplication.hpp</a></div><div class=\"ttdoc\">Experimental extensions </div></div>\n<div class=\"ttc\" id=\"a00080_html\"><div class=\"ttname\"><a href=\"a00080.html\">polar_coordinates.hpp</a></div><div class=\"ttdoc\">GLM_GTX_polar_coordinates </div></div>\n<div class=\"ttc\" id=\"a00097_html\"><div class=\"ttname\"><a href=\"a00097.html\">string_cast.hpp</a></div><div class=\"ttdoc\">GLM_GTX_string_cast </div></div>\n<div class=\"ttc\" id=\"a00085_html\"><div class=\"ttname\"><a href=\"a00085.html\">random.hpp</a></div><div class=\"ttdoc\">GLM_GTC_random </div></div>\n<div class=\"ttc\" id=\"a00073_html\"><div class=\"ttname\"><a href=\"a00073.html\">number_precision.hpp</a></div><div class=\"ttdoc\">GLM_GTX_number_precision </div></div>\n<div class=\"ttc\" id=\"a00071_html\"><div class=\"ttname\"><a href=\"a00071.html\">normal.hpp</a></div><div class=\"ttdoc\">GLM_GTX_normal </div></div>\n<div class=\"ttc\" id=\"a00036_html\"><div class=\"ttname\"><a href=\"a00036.html\">gradient_paint.hpp</a></div><div class=\"ttdoc\">GLM_GTX_gradient_paint </div></div>\n<div class=\"ttc\" id=\"a00007_html\"><div class=\"ttname\"><a href=\"a00007.html\">associated_min_max.hpp</a></div><div class=\"ttdoc\">GLM_GTX_associated_min_max </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00026.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: extend.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">extend.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00180.html\">GLM_GTX_extend</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00026_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8140caae613b0f847ab0d7175dc03a37\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8140caae613b0f847ab0d7175dc03a37\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00180.html#ga8140caae613b0f847ab0d7175dc03a37\">extend</a> (genType const &amp;Origin, genType const &amp;Source, typename genType::value_type const Length)</td></tr>\n<tr class=\"memdesc:ga8140caae613b0f847ab0d7175dc03a37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extends of Length the Origin position using the (Source - Origin) direction.  <a href=\"a00180.html#ga8140caae613b0f847ab0d7175dc03a37\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8140caae613b0f847ab0d7175dc03a37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00180.html\">GLM_GTX_extend</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00026_source.html\">extend.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00026_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: extend.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">extend.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00026.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_extend extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00180.html#ga8140caae613b0f847ab0d7175dc03a37\">extend</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                genType <span class=\"keyword\">const</span>&amp; Origin, </div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                genType <span class=\"keyword\">const</span>&amp; Source, </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                <span class=\"keyword\">typename</span> genType::value_type <span class=\"keyword\">const</span> Length);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">#include &quot;extend.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00180_html_ga8140caae613b0f847ab0d7175dc03a37\"><div class=\"ttname\"><a href=\"a00180.html#ga8140caae613b0f847ab0d7175dc03a37\">glm::extend</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType extend(genType const &amp;Origin, genType const &amp;Source, typename genType::value_type const Length)</div><div class=\"ttdoc\">Extends of Length the Origin position using the (Source - Origin) direction. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00027.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: extended_min_max.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">extended_min_max.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00181.html\">GLM_GTX_extented_min_max</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00027_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga04991ccb9865c4c4e58488cfb209ce69\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga04991ccb9865c4c4e58488cfb209ce69\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga04991ccb9865c4c4e58488cfb209ce69\">max</a> (T const &amp;x, T const &amp;y, T const &amp;z)</td></tr>\n<tr class=\"memdesc:ga04991ccb9865c4c4e58488cfb209ce69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 3 inputs.  <a href=\"a00181.html#ga04991ccb9865c4c4e58488cfb209ce69\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04991ccb9865c4c4e58488cfb209ce69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1b7bbe5c91de4924835ea3e14530744\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:gae1b7bbe5c91de4924835ea3e14530744\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#gae1b7bbe5c91de4924835ea3e14530744\">max</a> (C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z)</td></tr>\n<tr class=\"memdesc:gae1b7bbe5c91de4924835ea3e14530744\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 3 inputs.  <a href=\"a00181.html#gae1b7bbe5c91de4924835ea3e14530744\">More...</a><br /></td></tr>\n<tr class=\"separator:gae1b7bbe5c91de4924835ea3e14530744\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf832e9d4ab4826b2dda2fda25935a3a4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:gaf832e9d4ab4826b2dda2fda25935a3a4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#gaf832e9d4ab4826b2dda2fda25935a3a4\">max</a> (C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z)</td></tr>\n<tr class=\"memdesc:gaf832e9d4ab4826b2dda2fda25935a3a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 3 inputs.  <a href=\"a00181.html#gaf832e9d4ab4826b2dda2fda25935a3a4\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf832e9d4ab4826b2dda2fda25935a3a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78e04a0cef1c4863fcae1a2130500d87\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga78e04a0cef1c4863fcae1a2130500d87\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga78e04a0cef1c4863fcae1a2130500d87\">max</a> (T const &amp;x, T const &amp;y, T const &amp;z, T const &amp;w)</td></tr>\n<tr class=\"memdesc:ga78e04a0cef1c4863fcae1a2130500d87\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 4 inputs.  <a href=\"a00181.html#ga78e04a0cef1c4863fcae1a2130500d87\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78e04a0cef1c4863fcae1a2130500d87\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7cca8b53cfda402040494cdf40fbdf4a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga7cca8b53cfda402040494cdf40fbdf4a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga7cca8b53cfda402040494cdf40fbdf4a\">max</a> (C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z, typename C&lt; T &gt;::T const &amp;w)</td></tr>\n<tr class=\"memdesc:ga7cca8b53cfda402040494cdf40fbdf4a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 4 inputs.  <a href=\"a00181.html#ga7cca8b53cfda402040494cdf40fbdf4a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7cca8b53cfda402040494cdf40fbdf4a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaacffbc466c2d08c140b181e7fd8a4858\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:gaacffbc466c2d08c140b181e7fd8a4858\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">max</a> (C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)</td></tr>\n<tr class=\"memdesc:gaacffbc466c2d08c140b181e7fd8a4858\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 4 inputs.  <a href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">More...</a><br /></td></tr>\n<tr class=\"separator:gaacffbc466c2d08c140b181e7fd8a4858\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga713d3f9b3e76312c0d314e0c8611a6a6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga713d3f9b3e76312c0d314e0c8611a6a6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga713d3f9b3e76312c0d314e0c8611a6a6\">min</a> (T const &amp;x, T const &amp;y, T const &amp;z)</td></tr>\n<tr class=\"memdesc:ga713d3f9b3e76312c0d314e0c8611a6a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 3 inputs.  <a href=\"a00181.html#ga713d3f9b3e76312c0d314e0c8611a6a6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga713d3f9b3e76312c0d314e0c8611a6a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74d1a96e7cdbac40f6d35142d3bcbbd4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga74d1a96e7cdbac40f6d35142d3bcbbd4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga74d1a96e7cdbac40f6d35142d3bcbbd4\">min</a> (C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z)</td></tr>\n<tr class=\"memdesc:ga74d1a96e7cdbac40f6d35142d3bcbbd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 3 inputs.  <a href=\"a00181.html#ga74d1a96e7cdbac40f6d35142d3bcbbd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74d1a96e7cdbac40f6d35142d3bcbbd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga42b5c3fc027fd3d9a50d2ccc9126d9f0\">min</a> (C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z)</td></tr>\n<tr class=\"memdesc:ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 3 inputs.  <a href=\"a00181.html#ga42b5c3fc027fd3d9a50d2ccc9126d9f0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga95466987024d03039607f09e69813d69\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga95466987024d03039607f09e69813d69\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga95466987024d03039607f09e69813d69\">min</a> (T const &amp;x, T const &amp;y, T const &amp;z, T const &amp;w)</td></tr>\n<tr class=\"memdesc:ga95466987024d03039607f09e69813d69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 4 inputs.  <a href=\"a00181.html#ga95466987024d03039607f09e69813d69\">More...</a><br /></td></tr>\n<tr class=\"separator:ga95466987024d03039607f09e69813d69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4fe35dd31dd0c45693c9b60b830b8d47\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga4fe35dd31dd0c45693c9b60b830b8d47\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga4fe35dd31dd0c45693c9b60b830b8d47\">min</a> (C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z, typename C&lt; T &gt;::T const &amp;w)</td></tr>\n<tr class=\"memdesc:ga4fe35dd31dd0c45693c9b60b830b8d47\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 4 inputs.  <a href=\"a00181.html#ga4fe35dd31dd0c45693c9b60b830b8d47\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4fe35dd31dd0c45693c9b60b830b8d47\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7471ea4159eed8dd9ea4ac5d46c2fead\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga7471ea4159eed8dd9ea4ac5d46c2fead\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">min</a> (C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)</td></tr>\n<tr class=\"memdesc:ga7471ea4159eed8dd9ea4ac5d46c2fead\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 4 inputs.  <a href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7471ea4159eed8dd9ea4ac5d46c2fead\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00181.html\">GLM_GTX_extented_min_max</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00027_source.html\">extended_min_max.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00027_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: extended_min_max.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">extended_min_max.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00027.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_extented_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_extented_min_max extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">min</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                T <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                T <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                T <span class=\"keyword\">const</span>&amp; z);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>C&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        GLM_FUNC_DECL C&lt;T&gt; <a class=\"code\" href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">min</a>(</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; z);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>C&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL C&lt;T&gt; <a class=\"code\" href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">min</a>(</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; z);</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">min</a>(</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                T <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                T <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                T <span class=\"keyword\">const</span>&amp; z, </div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                T <span class=\"keyword\">const</span>&amp; w);</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>C&gt;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        GLM_FUNC_DECL C&lt;T&gt; <a class=\"code\" href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">min</a>(</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; z, </div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; w);</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>C&gt;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        GLM_FUNC_DECL C&lt;T&gt; <a class=\"code\" href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">min</a>(</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; z,</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; w);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">max</a>(</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                T <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                T <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                T <span class=\"keyword\">const</span>&amp; z);</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>C&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        GLM_FUNC_DECL C&lt;T&gt; <a class=\"code\" href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">max</a>(</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; z);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>C&gt;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        GLM_FUNC_DECL C&lt;T&gt; <a class=\"code\" href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">max</a>(</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; z);</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">max</a>(</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                T <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                T <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                T <span class=\"keyword\">const</span>&amp; z, </div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                T <span class=\"keyword\">const</span>&amp; w);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>C&gt;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        GLM_FUNC_DECL C&lt;T&gt; <a class=\"code\" href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">max</a>(</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; z, </div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                <span class=\"keyword\">typename</span> C&lt;T&gt;::T <span class=\"keyword\">const</span>&amp; w);</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>C&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        GLM_FUNC_DECL C&lt;T&gt; <a class=\"code\" href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">max</a>(</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; x, </div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; y, </div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; z, </div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                C&lt;T&gt; <span class=\"keyword\">const</span>&amp; w);</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;<span class=\"preprocessor\">#include &quot;extended_min_max.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00181_html_ga7471ea4159eed8dd9ea4ac5d46c2fead\"><div class=\"ttname\"><a href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">glm::min</a></div><div class=\"ttdeci\">GLM_FUNC_DECL C&lt; T &gt; min(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)</div><div class=\"ttdoc\">Return the minimum component-wise values of 4 inputs. </div></div>\n<div class=\"ttc\" id=\"a00181_html_gaacffbc466c2d08c140b181e7fd8a4858\"><div class=\"ttname\"><a href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">glm::max</a></div><div class=\"ttdeci\">GLM_FUNC_DECL C&lt; T &gt; max(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)</div><div class=\"ttdoc\">Return the maximum component-wise values of 4 inputs. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00028.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: exterior_product.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">exterior_product.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00182.html\">GLM_GTX_exterior_product</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00028_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gac36e72b934ea6a9dd313772d7e78fa93\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac36e72b934ea6a9dd313772d7e78fa93\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00182.html#gac36e72b934ea6a9dd313772d7e78fa93\">cross</a> (vec&lt; 2, T, Q &gt; const &amp;v, vec&lt; 2, T, Q &gt; const &amp;u)</td></tr>\n<tr class=\"memdesc:gac36e72b934ea6a9dd313772d7e78fa93\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the cross product of x and y.  <a href=\"a00182.html#gac36e72b934ea6a9dd313772d7e78fa93\">More...</a><br /></td></tr>\n<tr class=\"separator:gac36e72b934ea6a9dd313772d7e78fa93\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00182.html\">GLM_GTX_exterior_product</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00182.html\" title=\"Include <glm/gtx/exterior_product.hpp> to use the features of this extension. \">GLM_GTX_exterior_product</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00028_source.html\">exterior_product.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00028_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: exterior_product.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">exterior_product.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00028.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_exterior_product extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00182.html#gac36e72b934ea6a9dd313772d7e78fa93\">cross</a>(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; u);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#include &quot;exterior_product.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00182_html_gac36e72b934ea6a9dd313772d7e78fa93\"><div class=\"ttname\"><a href=\"a00182.html#gac36e72b934ea6a9dd313772d7e78fa93\">glm::cross</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T cross(vec&lt; 2, T, Q &gt; const &amp;v, vec&lt; 2, T, Q &gt; const &amp;u)</div><div class=\"ttdoc\">Returns the cross product of x and y. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00029.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: fast_exponential.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">fast_exponential.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00183.html\">GLM_GTX_fast_exponential</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00029_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaa3180ac8f96ab37ab96e0cacaf608e10\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaa3180ac8f96ab37ab96e0cacaf608e10\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#gaa3180ac8f96ab37ab96e0cacaf608e10\">fastExp</a> (T x)</td></tr>\n<tr class=\"memdesc:gaa3180ac8f96ab37ab96e0cacaf608e10\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp function but less accurate.  <a href=\"a00183.html#gaa3180ac8f96ab37ab96e0cacaf608e10\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa3180ac8f96ab37ab96e0cacaf608e10\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ba6153aec6bd74628f8b00530aa8d58\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3ba6153aec6bd74628f8b00530aa8d58\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58\">fastExp</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3ba6153aec6bd74628f8b00530aa8d58\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp function but less accurate.  <a href=\"a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ba6153aec6bd74628f8b00530aa8d58\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0af50585955eb14c60bb286297fabab2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0af50585955eb14c60bb286297fabab2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga0af50585955eb14c60bb286297fabab2\">fastExp2</a> (T x)</td></tr>\n<tr class=\"memdesc:ga0af50585955eb14c60bb286297fabab2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp2 function but less accurate.  <a href=\"a00183.html#ga0af50585955eb14c60bb286297fabab2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0af50585955eb14c60bb286297fabab2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacaaed8b67d20d244b7de217e7816c1b6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacaaed8b67d20d244b7de217e7816c1b6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#gacaaed8b67d20d244b7de217e7816c1b6\">fastExp2</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gacaaed8b67d20d244b7de217e7816c1b6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp2 function but less accurate.  <a href=\"a00183.html#gacaaed8b67d20d244b7de217e7816c1b6\">More...</a><br /></td></tr>\n<tr class=\"separator:gacaaed8b67d20d244b7de217e7816c1b6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1bdc97b7f96a600e29c753f1cd4388a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae1bdc97b7f96a600e29c753f1cd4388a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#gae1bdc97b7f96a600e29c753f1cd4388a\">fastLog</a> (T x)</td></tr>\n<tr class=\"memdesc:gae1bdc97b7f96a600e29c753f1cd4388a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common log function but less accurate.  <a href=\"a00183.html#gae1bdc97b7f96a600e29c753f1cd4388a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae1bdc97b7f96a600e29c753f1cd4388a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga937256993a7219e73f186bb348fe6be8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga937256993a7219e73f186bb348fe6be8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga937256993a7219e73f186bb348fe6be8\">fastLog</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga937256993a7219e73f186bb348fe6be8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp2 function but less accurate.  <a href=\"a00183.html#ga937256993a7219e73f186bb348fe6be8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga937256993a7219e73f186bb348fe6be8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e98118685f6dc9e05fbb13dd5e5234e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga6e98118685f6dc9e05fbb13dd5e5234e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga6e98118685f6dc9e05fbb13dd5e5234e\">fastLog2</a> (T x)</td></tr>\n<tr class=\"memdesc:ga6e98118685f6dc9e05fbb13dd5e5234e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common log2 function but less accurate.  <a href=\"a00183.html#ga6e98118685f6dc9e05fbb13dd5e5234e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e98118685f6dc9e05fbb13dd5e5234e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7562043539194ccc24649f8475bc5584\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7562043539194ccc24649f8475bc5584\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga7562043539194ccc24649f8475bc5584\">fastLog2</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga7562043539194ccc24649f8475bc5584\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common log2 function but less accurate.  <a href=\"a00183.html#ga7562043539194ccc24649f8475bc5584\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7562043539194ccc24649f8475bc5584\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5340e98a11fcbbd936ba6e983a154d50\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga5340e98a11fcbbd936ba6e983a154d50\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga5340e98a11fcbbd936ba6e983a154d50\">fastPow</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga5340e98a11fcbbd936ba6e983a154d50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common pow function but less accurate.  <a href=\"a00183.html#ga5340e98a11fcbbd936ba6e983a154d50\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5340e98a11fcbbd936ba6e983a154d50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga15325a8ed2d1c4ed2412c4b3b3927aa2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga15325a8ed2d1c4ed2412c4b3b3927aa2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga15325a8ed2d1c4ed2412c4b3b3927aa2\">fastPow</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga15325a8ed2d1c4ed2412c4b3b3927aa2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common pow function but less accurate.  <a href=\"a00183.html#ga15325a8ed2d1c4ed2412c4b3b3927aa2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga15325a8ed2d1c4ed2412c4b3b3927aa2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f2562db9c3e02ae76169c36b086c3f6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genTypeT , typename genTypeU &gt; </td></tr>\n<tr class=\"memitem:ga7f2562db9c3e02ae76169c36b086c3f6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genTypeT&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga7f2562db9c3e02ae76169c36b086c3f6\">fastPow</a> (genTypeT x, genTypeU y)</td></tr>\n<tr class=\"memdesc:ga7f2562db9c3e02ae76169c36b086c3f6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common pow function but less accurate.  <a href=\"a00183.html#ga7f2562db9c3e02ae76169c36b086c3f6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f2562db9c3e02ae76169c36b086c3f6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1abe488c0829da5b9de70ac64aeaa7e5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1abe488c0829da5b9de70ac64aeaa7e5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">fastPow</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga1abe488c0829da5b9de70ac64aeaa7e5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common pow function but less accurate.  <a href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1abe488c0829da5b9de70ac64aeaa7e5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00183.html\">GLM_GTX_fast_exponential</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_half_float (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00029_source.html\">fast_exponential.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00029_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: fast_exponential.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">fast_exponential.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00029.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_fast_exponential is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_fast_exponential extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">fastPow</a>(genType x, genType y);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">fastPow</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genTypeT, <span class=\"keyword\">typename</span> genTypeU&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL genTypeT <a class=\"code\" href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">fastPow</a>(genTypeT x, genTypeU y);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">fastPow</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58\">fastExp</a>(T x);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58\">fastExp</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00183.html#ga937256993a7219e73f186bb348fe6be8\">fastLog</a>(T x);</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00183.html#ga937256993a7219e73f186bb348fe6be8\">fastLog</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00183.html#gacaaed8b67d20d244b7de217e7816c1b6\">fastExp2</a>(T x);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00183.html#gacaaed8b67d20d244b7de217e7816c1b6\">fastExp2</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00183.html#ga7562043539194ccc24649f8475bc5584\">fastLog2</a>(T x);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00183.html#ga7562043539194ccc24649f8475bc5584\">fastLog2</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;<span class=\"preprocessor\">#include &quot;fast_exponential.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00183_html_ga7562043539194ccc24649f8475bc5584\"><div class=\"ttname\"><a href=\"a00183.html#ga7562043539194ccc24649f8475bc5584\">glm::fastLog2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fastLog2(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Faster than the common log2 function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00183_html_ga1abe488c0829da5b9de70ac64aeaa7e5\"><div class=\"ttname\"><a href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">glm::fastPow</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fastPow(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Faster than the common pow function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00183_html_gacaaed8b67d20d244b7de217e7816c1b6\"><div class=\"ttname\"><a href=\"a00183.html#gacaaed8b67d20d244b7de217e7816c1b6\">glm::fastExp2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fastExp2(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Faster than the common exp2 function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00183_html_ga3ba6153aec6bd74628f8b00530aa8d58\"><div class=\"ttname\"><a href=\"a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58\">glm::fastExp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fastExp(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Faster than the common exp function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00183_html_ga937256993a7219e73f186bb348fe6be8\"><div class=\"ttname\"><a href=\"a00183.html#ga937256993a7219e73f186bb348fe6be8\">glm::fastLog</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fastLog(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Faster than the common exp2 function but less accurate. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00030.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: fast_square_root.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">fast_square_root.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00184.html\">GLM_GTX_fast_square_root</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00030_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaac333418d0c4e0cc6d3d219ed606c238\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaac333418d0c4e0cc6d3d219ed606c238\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#gaac333418d0c4e0cc6d3d219ed606c238\">fastDistance</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:gaac333418d0c4e0cc6d3d219ed606c238\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common distance function but less accurate.  <a href=\"a00184.html#gaac333418d0c4e0cc6d3d219ed606c238\">More...</a><br /></td></tr>\n<tr class=\"separator:gaac333418d0c4e0cc6d3d219ed606c238\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42d3e771fa7cb3c60d828e315829df19\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga42d3e771fa7cb3c60d828e315829df19\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga42d3e771fa7cb3c60d828e315829df19\">fastDistance</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga42d3e771fa7cb3c60d828e315829df19\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common distance function but less accurate.  <a href=\"a00184.html#ga42d3e771fa7cb3c60d828e315829df19\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42d3e771fa7cb3c60d828e315829df19\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f081b14d9c7035c8714eba5f7f75a8f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga7f081b14d9c7035c8714eba5f7f75a8f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga7f081b14d9c7035c8714eba5f7f75a8f\">fastInverseSqrt</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga7f081b14d9c7035c8714eba5f7f75a8f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common inversesqrt function but less accurate.  <a href=\"a00184.html#ga7f081b14d9c7035c8714eba5f7f75a8f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f081b14d9c7035c8714eba5f7f75a8f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadcd7be12b1e5ee182141359d4c45dd24\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadcd7be12b1e5ee182141359d4c45dd24\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#gadcd7be12b1e5ee182141359d4c45dd24\">fastInverseSqrt</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gadcd7be12b1e5ee182141359d4c45dd24\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common inversesqrt function but less accurate.  <a href=\"a00184.html#gadcd7be12b1e5ee182141359d4c45dd24\">More...</a><br /></td></tr>\n<tr class=\"separator:gadcd7be12b1e5ee182141359d4c45dd24\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafe697d6287719538346bbdf8b1367c59\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gafe697d6287719538346bbdf8b1367c59\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#gafe697d6287719538346bbdf8b1367c59\">fastLength</a> (genType x)</td></tr>\n<tr class=\"memdesc:gafe697d6287719538346bbdf8b1367c59\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common length function but less accurate.  <a href=\"a00184.html#gafe697d6287719538346bbdf8b1367c59\">More...</a><br /></td></tr>\n<tr class=\"separator:gafe697d6287719538346bbdf8b1367c59\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga90f66be92ef61e705c005e7b3209edb8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga90f66be92ef61e705c005e7b3209edb8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga90f66be92ef61e705c005e7b3209edb8\">fastLength</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga90f66be92ef61e705c005e7b3209edb8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common length function but less accurate.  <a href=\"a00184.html#ga90f66be92ef61e705c005e7b3209edb8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga90f66be92ef61e705c005e7b3209edb8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b02c1d6e0c754144e2f1e110bf9f16c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga3b02c1d6e0c754144e2f1e110bf9f16c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga3b02c1d6e0c754144e2f1e110bf9f16c\">fastNormalize</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3b02c1d6e0c754144e2f1e110bf9f16c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common normalize function but less accurate.  <a href=\"a00184.html#ga3b02c1d6e0c754144e2f1e110bf9f16c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b02c1d6e0c754144e2f1e110bf9f16c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c460e9414a50b2fc455c8f64c86cdc9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6c460e9414a50b2fc455c8f64c86cdc9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga6c460e9414a50b2fc455c8f64c86cdc9\">fastSqrt</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga6c460e9414a50b2fc455c8f64c86cdc9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common sqrt function but less accurate.  <a href=\"a00184.html#ga6c460e9414a50b2fc455c8f64c86cdc9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c460e9414a50b2fc455c8f64c86cdc9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae83f0c03614f73eae5478c5b6274ee6d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae83f0c03614f73eae5478c5b6274ee6d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#gae83f0c03614f73eae5478c5b6274ee6d\">fastSqrt</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae83f0c03614f73eae5478c5b6274ee6d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common sqrt function but less accurate.  <a href=\"a00184.html#gae83f0c03614f73eae5478c5b6274ee6d\">More...</a><br /></td></tr>\n<tr class=\"separator:gae83f0c03614f73eae5478c5b6274ee6d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00184.html\">GLM_GTX_fast_square_root</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00030_source.html\">fast_square_root.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00030_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: fast_square_root.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">fast_square_root.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00030.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../common.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../exponential.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../geometric.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_fast_square_root is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_fast_square_root extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00184.html#gae83f0c03614f73eae5478c5b6274ee6d\">fastSqrt</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00184.html#gae83f0c03614f73eae5478c5b6274ee6d\">fastSqrt</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00184.html#gadcd7be12b1e5ee182141359d4c45dd24\">fastInverseSqrt</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00184.html#gadcd7be12b1e5ee182141359d4c45dd24\">fastInverseSqrt</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00184.html#ga90f66be92ef61e705c005e7b3209edb8\">fastLength</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00184.html#ga90f66be92ef61e705c005e7b3209edb8\">fastLength</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00184.html#ga42d3e771fa7cb3c60d828e315829df19\">fastDistance</a>(genType x, genType y);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00184.html#ga42d3e771fa7cb3c60d828e315829df19\">fastDistance</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00184.html#ga3b02c1d6e0c754144e2f1e110bf9f16c\">fastNormalize</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"preprocessor\">#include &quot;fast_square_root.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00184_html_ga90f66be92ef61e705c005e7b3209edb8\"><div class=\"ttname\"><a href=\"a00184.html#ga90f66be92ef61e705c005e7b3209edb8\">glm::fastLength</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastLength(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Faster than the common length function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00184_html_gae83f0c03614f73eae5478c5b6274ee6d\"><div class=\"ttname\"><a href=\"a00184.html#gae83f0c03614f73eae5478c5b6274ee6d\">glm::fastSqrt</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fastSqrt(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Faster than the common sqrt function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00184_html_ga3b02c1d6e0c754144e2f1e110bf9f16c\"><div class=\"ttname\"><a href=\"a00184.html#ga3b02c1d6e0c754144e2f1e110bf9f16c\">glm::fastNormalize</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType fastNormalize(genType const &amp;x)</div><div class=\"ttdoc\">Faster than the common normalize function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00184_html_gadcd7be12b1e5ee182141359d4c45dd24\"><div class=\"ttname\"><a href=\"a00184.html#gadcd7be12b1e5ee182141359d4c45dd24\">glm::fastInverseSqrt</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; fastInverseSqrt(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Faster than the common inversesqrt function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00184_html_ga42d3e771fa7cb3c60d828e315829df19\"><div class=\"ttname\"><a href=\"a00184.html#ga42d3e771fa7cb3c60d828e315829df19\">glm::fastDistance</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastDistance(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Faster than the common distance function but less accurate. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00031.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: fast_trigonometry.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">fast_trigonometry.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00185.html\">GLM_GTX_fast_trigonometry</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00031_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga9721d63356e5d94fdc4b393a426ab26b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga9721d63356e5d94fdc4b393a426ab26b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga9721d63356e5d94fdc4b393a426ab26b\">fastAcos</a> (T angle)</td></tr>\n<tr class=\"memdesc:ga9721d63356e5d94fdc4b393a426ab26b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common acos function but less accurate.  <a href=\"a00185.html#ga9721d63356e5d94fdc4b393a426ab26b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9721d63356e5d94fdc4b393a426ab26b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga562cb62c51fbfe7fac7db0bce706b81f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga562cb62c51fbfe7fac7db0bce706b81f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga562cb62c51fbfe7fac7db0bce706b81f\">fastAsin</a> (T angle)</td></tr>\n<tr class=\"memdesc:ga562cb62c51fbfe7fac7db0bce706b81f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common asin function but less accurate.  <a href=\"a00185.html#ga562cb62c51fbfe7fac7db0bce706b81f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga562cb62c51fbfe7fac7db0bce706b81f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8d197c6ef564f5e5d59af3b3f8adcc2c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga8d197c6ef564f5e5d59af3b3f8adcc2c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga8d197c6ef564f5e5d59af3b3f8adcc2c\">fastAtan</a> (T y, T x)</td></tr>\n<tr class=\"memdesc:ga8d197c6ef564f5e5d59af3b3f8adcc2c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common atan function but less accurate.  <a href=\"a00185.html#ga8d197c6ef564f5e5d59af3b3f8adcc2c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8d197c6ef564f5e5d59af3b3f8adcc2c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae25de86a968490ff56856fa425ec9d30\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae25de86a968490ff56856fa425ec9d30\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#gae25de86a968490ff56856fa425ec9d30\">fastAtan</a> (T angle)</td></tr>\n<tr class=\"memdesc:gae25de86a968490ff56856fa425ec9d30\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common atan function but less accurate.  <a href=\"a00185.html#gae25de86a968490ff56856fa425ec9d30\">More...</a><br /></td></tr>\n<tr class=\"separator:gae25de86a968490ff56856fa425ec9d30\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab34c8b45c23c0165a64dcecfcc3b302a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gab34c8b45c23c0165a64dcecfcc3b302a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#gab34c8b45c23c0165a64dcecfcc3b302a\">fastCos</a> (T angle)</td></tr>\n<tr class=\"memdesc:gab34c8b45c23c0165a64dcecfcc3b302a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common cos function but less accurate.  <a href=\"a00185.html#gab34c8b45c23c0165a64dcecfcc3b302a\">More...</a><br /></td></tr>\n<tr class=\"separator:gab34c8b45c23c0165a64dcecfcc3b302a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0aab3257bb3b628d10a1e0483e2c6915\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0aab3257bb3b628d10a1e0483e2c6915\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga0aab3257bb3b628d10a1e0483e2c6915\">fastSin</a> (T angle)</td></tr>\n<tr class=\"memdesc:ga0aab3257bb3b628d10a1e0483e2c6915\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common sin function but less accurate.  <a href=\"a00185.html#ga0aab3257bb3b628d10a1e0483e2c6915\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0aab3257bb3b628d10a1e0483e2c6915\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf29b9c1101a10007b4f79ee89df27ba2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaf29b9c1101a10007b4f79ee89df27ba2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#gaf29b9c1101a10007b4f79ee89df27ba2\">fastTan</a> (T angle)</td></tr>\n<tr class=\"memdesc:gaf29b9c1101a10007b4f79ee89df27ba2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common tan function but less accurate.  <a href=\"a00185.html#gaf29b9c1101a10007b4f79ee89df27ba2\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf29b9c1101a10007b4f79ee89df27ba2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga069527c6dbd64f53435b8ebc4878b473\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga069527c6dbd64f53435b8ebc4878b473\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga069527c6dbd64f53435b8ebc4878b473\">wrapAngle</a> (T angle)</td></tr>\n<tr class=\"memdesc:ga069527c6dbd64f53435b8ebc4878b473\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Wrap an angle to [0 2pi[ From GLM_GTX_fast_trigonometry extension.  <a href=\"a00185.html#ga069527c6dbd64f53435b8ebc4878b473\">More...</a><br /></td></tr>\n<tr class=\"separator:ga069527c6dbd64f53435b8ebc4878b473\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00185.html\">GLM_GTX_fast_trigonometry</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00031_source.html\">fast_trigonometry.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00031_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: fast_trigonometry.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">fast_trigonometry.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00031.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/constants.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_fast_trigonometry is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_fast_trigonometry extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt; </div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00185.html#ga069527c6dbd64f53435b8ebc4878b473\">wrapAngle</a>(T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00185.html#ga0aab3257bb3b628d10a1e0483e2c6915\">fastSin</a>(T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt; </div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00185.html#gab34c8b45c23c0165a64dcecfcc3b302a\">fastCos</a>(T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt; </div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00185.html#gaf29b9c1101a10007b4f79ee89df27ba2\">fastTan</a>(T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt; </div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00185.html#ga562cb62c51fbfe7fac7db0bce706b81f\">fastAsin</a>(T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt; </div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00185.html#ga9721d63356e5d94fdc4b393a426ab26b\">fastAcos</a>(T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt; </div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00185.html#gae25de86a968490ff56856fa425ec9d30\">fastAtan</a>(T y, T x);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt; </div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00185.html#gae25de86a968490ff56856fa425ec9d30\">fastAtan</a>(T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;<span class=\"preprocessor\">#include &quot;fast_trigonometry.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00185_html_gab34c8b45c23c0165a64dcecfcc3b302a\"><div class=\"ttname\"><a href=\"a00185.html#gab34c8b45c23c0165a64dcecfcc3b302a\">glm::fastCos</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastCos(T angle)</div><div class=\"ttdoc\">Faster than the common cos function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00185_html_ga069527c6dbd64f53435b8ebc4878b473\"><div class=\"ttname\"><a href=\"a00185.html#ga069527c6dbd64f53435b8ebc4878b473\">glm::wrapAngle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T wrapAngle(T angle)</div><div class=\"ttdoc\">Wrap an angle to [0 2pi[ From GLM_GTX_fast_trigonometry extension. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00185_html_ga0aab3257bb3b628d10a1e0483e2c6915\"><div class=\"ttname\"><a href=\"a00185.html#ga0aab3257bb3b628d10a1e0483e2c6915\">glm::fastSin</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastSin(T angle)</div><div class=\"ttdoc\">Faster than the common sin function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00185_html_ga9721d63356e5d94fdc4b393a426ab26b\"><div class=\"ttname\"><a href=\"a00185.html#ga9721d63356e5d94fdc4b393a426ab26b\">glm::fastAcos</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastAcos(T angle)</div><div class=\"ttdoc\">Faster than the common acos function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00185_html_ga562cb62c51fbfe7fac7db0bce706b81f\"><div class=\"ttname\"><a href=\"a00185.html#ga562cb62c51fbfe7fac7db0bce706b81f\">glm::fastAsin</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastAsin(T angle)</div><div class=\"ttdoc\">Faster than the common asin function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00185_html_gae25de86a968490ff56856fa425ec9d30\"><div class=\"ttname\"><a href=\"a00185.html#gae25de86a968490ff56856fa425ec9d30\">glm::fastAtan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastAtan(T angle)</div><div class=\"ttdoc\">Faster than the common atan function but less accurate. </div></div>\n<div class=\"ttc\" id=\"a00185_html_gaf29b9c1101a10007b4f79ee89df27ba2\"><div class=\"ttname\"><a href=\"a00185.html#gaf29b9c1101a10007b4f79ee89df27ba2\">glm::fastTan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastTan(T angle)</div><div class=\"ttdoc\">Faster than the common tan function but less accurate. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00032.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: functions.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">functions.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00186.html\">GLM_GTX_functions</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00032_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0b50b197ff74261a0fad90f4b8d24702\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0b50b197ff74261a0fad90f4b8d24702\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00186.html#ga0b50b197ff74261a0fad90f4b8d24702\">gauss</a> (T x, T ExpectedValue, T StandardDeviation)</td></tr>\n<tr class=\"memdesc:ga0b50b197ff74261a0fad90f4b8d24702\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1D gauss function  <a href=\"a00186.html#ga0b50b197ff74261a0fad90f4b8d24702\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0b50b197ff74261a0fad90f4b8d24702\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad19ec8754a83c0b9a8dc16b7e60705ab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad19ec8754a83c0b9a8dc16b7e60705ab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab\">gauss</a> (vec&lt; 2, T, Q &gt; const &amp;Coord, vec&lt; 2, T, Q &gt; const &amp;ExpectedValue, vec&lt; 2, T, Q &gt; const &amp;StandardDeviation)</td></tr>\n<tr class=\"memdesc:gad19ec8754a83c0b9a8dc16b7e60705ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2D gauss function  <a href=\"a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gad19ec8754a83c0b9a8dc16b7e60705ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00186.html\">GLM_GTX_functions</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00032_source.html\">functions.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00032_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: functions.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">functions.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00032.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_functions extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab\">gauss</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                T x,</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                T ExpectedValue,</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                T StandardDeviation);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab\">gauss</a>(</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; Coord,</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; ExpectedValue,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; StandardDeviation);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#include &quot;functions.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00186_html_gad19ec8754a83c0b9a8dc16b7e60705ab\"><div class=\"ttname\"><a href=\"a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab\">glm::gauss</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T gauss(vec&lt; 2, T, Q &gt; const &amp;Coord, vec&lt; 2, T, Q &gt; const &amp;ExpectedValue, vec&lt; 2, T, Q &gt; const &amp;StandardDeviation)</div><div class=\"ttdoc\">2D gauss function </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00033.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: fwd.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">fwd.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00033_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:af62ed3862b7f5db4da71756a7b1367be\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dquat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>dquat</b></td></tr>\n<tr class=\"memdesc:af62ed3862b7f5db4da71756a7b1367be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of default double-qualifier floating-point numbers.  <a href=\"a00135.html#af62ed3862b7f5db4da71756a7b1367be\">More...</a><br /></td></tr>\n<tr class=\"separator:af62ed3862b7f5db4da71756a7b1367be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float32_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a></td></tr>\n<tr class=\"memdesc:gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 32 bit single-qualifier floating-point scalar.  <a href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">More...</a><br /></td></tr>\n<tr class=\"separator:gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab12383ed6ac7595ed6fde4d266c58425\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">f32mat2</a></td></tr>\n<tr class=\"memdesc:gab12383ed6ac7595ed6fde4d266c58425\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">More...</a><br /></td></tr>\n<tr class=\"separator:gab12383ed6ac7595ed6fde4d266c58425\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04100c76f7d55a0dd0983ccf05142bff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a></td></tr>\n<tr class=\"memdesc:ga04100c76f7d55a0dd0983ccf05142bff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04100c76f7d55a0dd0983ccf05142bff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab256cdab5eb582e426d749ae77b5b566\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">f32mat2x3</a></td></tr>\n<tr class=\"memdesc:gab256cdab5eb582e426d749ae77b5b566\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x3 matrix.  <a href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">More...</a><br /></td></tr>\n<tr class=\"separator:gab256cdab5eb582e426d749ae77b5b566\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf512b74c4400b68f9fdf9388b3d6aac8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">f32mat2x4</a></td></tr>\n<tr class=\"memdesc:gaf512b74c4400b68f9fdf9388b3d6aac8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x4 matrix.  <a href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf512b74c4400b68f9fdf9388b3d6aac8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga856f3905ee7cc2e4890a8a1d56c150be\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">f32mat3</a></td></tr>\n<tr class=\"memdesc:ga856f3905ee7cc2e4890a8a1d56c150be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">More...</a><br /></td></tr>\n<tr class=\"separator:ga856f3905ee7cc2e4890a8a1d56c150be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1320a08e14fdff3821241eefab6947e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">f32mat3x2</a></td></tr>\n<tr class=\"memdesc:ga1320a08e14fdff3821241eefab6947e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x2 matrix.  <a href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1320a08e14fdff3821241eefab6947e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga65261fa8a21045c8646ddff114a56174\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a></td></tr>\n<tr class=\"memdesc:ga65261fa8a21045c8646ddff114a56174\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">More...</a><br /></td></tr>\n<tr class=\"separator:ga65261fa8a21045c8646ddff114a56174\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab90ade28222f8b861d5ceaf81a3a7f5d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">f32mat3x4</a></td></tr>\n<tr class=\"memdesc:gab90ade28222f8b861d5ceaf81a3a7f5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x4 matrix.  <a href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">More...</a><br /></td></tr>\n<tr class=\"separator:gab90ade28222f8b861d5ceaf81a3a7f5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99d1b85ff99956b33da7e9992aad129a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">f32mat4</a></td></tr>\n<tr class=\"memdesc:ga99d1b85ff99956b33da7e9992aad129a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99d1b85ff99956b33da7e9992aad129a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b32ca1e57a4ef91babbc3d35a34ea20\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">f32mat4x2</a></td></tr>\n<tr class=\"memdesc:ga3b32ca1e57a4ef91babbc3d35a34ea20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x2 matrix.  <a href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b32ca1e57a4ef91babbc3d35a34ea20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga239b96198771b7add8eea7e6b59840c0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">f32mat4x3</a></td></tr>\n<tr class=\"memdesc:ga239b96198771b7add8eea7e6b59840c0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x3 matrix.  <a href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga239b96198771b7add8eea7e6b59840c0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaee4da0e9fbd8cfa2f89cb80889719dc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a></td></tr>\n<tr class=\"memdesc:gaee4da0e9fbd8cfa2f89cb80889719dc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaee4da0e9fbd8cfa2f89cb80889719dc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6966c0cb4673928c9c9da2e91006d2c0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">f32quat</a></td></tr>\n<tr class=\"memdesc:ga6966c0cb4673928c9c9da2e91006d2c0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point quaternion.  <a href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6966c0cb4673928c9c9da2e91006d2c0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga701f32ab5b3fb06996b41f5c0d643805\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">f32vec1</a></td></tr>\n<tr class=\"memdesc:ga701f32ab5b3fb06996b41f5c0d643805\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 1 components.  <a href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">More...</a><br /></td></tr>\n<tr class=\"separator:ga701f32ab5b3fb06996b41f5c0d643805\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5d6c70e080409a76a257dc55bd8ea2c8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">f32vec2</a></td></tr>\n<tr class=\"memdesc:ga5d6c70e080409a76a257dc55bd8ea2c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 2 components.  <a href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5d6c70e080409a76a257dc55bd8ea2c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaea5c4518e175162e306d2c2b5ef5ac79\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">f32vec3</a></td></tr>\n<tr class=\"memdesc:gaea5c4518e175162e306d2c2b5ef5ac79\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 3 components.  <a href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">More...</a><br /></td></tr>\n<tr class=\"separator:gaea5c4518e175162e306d2c2b5ef5ac79\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31c6ca0e074a44007f49a9a3720b18c8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">f32vec4</a></td></tr>\n<tr class=\"memdesc:ga31c6ca0e074a44007f49a9a3720b18c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 4 components.  <a href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31c6ca0e074a44007f49a9a3720b18c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1d794d240091678f602e8de225b8d8c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float64_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a></td></tr>\n<tr class=\"memdesc:ga1d794d240091678f602e8de225b8d8c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 64 bit double-qualifier floating-point scalar.  <a href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1d794d240091678f602e8de225b8d8c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad9771450a54785d13080cdde0fe20c1d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f64mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">f64mat2</a></td></tr>\n<tr class=\"memdesc:gad9771450a54785d13080cdde0fe20c1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">More...</a><br /></td></tr>\n<tr class=\"separator:gad9771450a54785d13080cdde0fe20c1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ec7c4c79e303c053e30729a95fb2c37\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a></td></tr>\n<tr class=\"memdesc:ga9ec7c4c79e303c053e30729a95fb2c37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9ec7c4c79e303c053e30729a95fb2c37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3ab5719fc4c1e966631dbbcba8d412a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">f64mat2x3</a></td></tr>\n<tr class=\"memdesc:gae3ab5719fc4c1e966631dbbcba8d412a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 2x3 matrix.  <a href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae3ab5719fc4c1e966631dbbcba8d412a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac87278e0c702ba8afff76316d4eeb769\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">f64mat2x4</a></td></tr>\n<tr class=\"memdesc:gac87278e0c702ba8afff76316d4eeb769\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 2x4 matrix.  <a href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">More...</a><br /></td></tr>\n<tr class=\"separator:gac87278e0c702ba8afff76316d4eeb769\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9b69181efbf8f37ae934f135137b29c0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f64mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">f64mat3</a></td></tr>\n<tr class=\"memdesc:ga9b69181efbf8f37ae934f135137b29c0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9b69181efbf8f37ae934f135137b29c0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2473d8bf3f4abf967c4d0e18175be6f7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">f64mat3x2</a></td></tr>\n<tr class=\"memdesc:ga2473d8bf3f4abf967c4d0e18175be6f7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 3x2 matrix.  <a href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2473d8bf3f4abf967c4d0e18175be6f7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga916c1aed91cf91f7b41399ebe7c6e185\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a></td></tr>\n<tr class=\"memdesc:ga916c1aed91cf91f7b41399ebe7c6e185\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">More...</a><br /></td></tr>\n<tr class=\"separator:ga916c1aed91cf91f7b41399ebe7c6e185\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaab239fa9e35b65a67cbaa6ac082f3675\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">f64mat3x4</a></td></tr>\n<tr class=\"memdesc:gaab239fa9e35b65a67cbaa6ac082f3675\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 3x4 matrix.  <a href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">More...</a><br /></td></tr>\n<tr class=\"separator:gaab239fa9e35b65a67cbaa6ac082f3675\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0ecd3f4952536e5ef12702b44d2626fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f64mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">f64mat4</a></td></tr>\n<tr class=\"memdesc:ga0ecd3f4952536e5ef12702b44d2626fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0ecd3f4952536e5ef12702b44d2626fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab7daf79d6bc06a68bea1c6f5e11b5512\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">f64mat4x2</a></td></tr>\n<tr class=\"memdesc:gab7daf79d6bc06a68bea1c6f5e11b5512\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 4x2 matrix.  <a href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">More...</a><br /></td></tr>\n<tr class=\"separator:gab7daf79d6bc06a68bea1c6f5e11b5512\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e2e66ffbe341a80bc005ba2b9552110\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">f64mat4x3</a></td></tr>\n<tr class=\"memdesc:ga3e2e66ffbe341a80bc005ba2b9552110\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 4x3 matrix.  <a href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e2e66ffbe341a80bc005ba2b9552110\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae52e2b7077a9ff928a06ab5ce600b81e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a></td></tr>\n<tr class=\"memdesc:gae52e2b7077a9ff928a06ab5ce600b81e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae52e2b7077a9ff928a06ab5ce600b81e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga14c583bd625eda8cf4935a14d5dd544d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">f64quat</a></td></tr>\n<tr class=\"memdesc:ga14c583bd625eda8cf4935a14d5dd544d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point quaternion.  <a href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga14c583bd625eda8cf4935a14d5dd544d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade502df1ce14f837fae7f60a03ddb9b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">f64vec1</a></td></tr>\n<tr class=\"memdesc:gade502df1ce14f837fae7f60a03ddb9b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point vector of 1 components.  <a href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">More...</a><br /></td></tr>\n<tr class=\"separator:gade502df1ce14f837fae7f60a03ddb9b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadc4e1594f9555d919131ee02b17822a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">f64vec2</a></td></tr>\n<tr class=\"memdesc:gadc4e1594f9555d919131ee02b17822a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point vector of 2 components.  <a href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">More...</a><br /></td></tr>\n<tr class=\"separator:gadc4e1594f9555d919131ee02b17822a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7a1ddca75c5f629173bf4772db7a635\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">f64vec3</a></td></tr>\n<tr class=\"memdesc:gaa7a1ddca75c5f629173bf4772db7a635\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point vector of 3 components.  <a href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7a1ddca75c5f629173bf4772db7a635\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga66e92e57260bdb910609b9a56bf83e97\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">f64vec4</a></td></tr>\n<tr class=\"memdesc:ga66e92e57260bdb910609b9a56bf83e97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point vector of 4 components.  <a href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">More...</a><br /></td></tr>\n<tr class=\"separator:ga66e92e57260bdb910609b9a56bf83e97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41d579d81c3d98edd0532244fa02da77\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float32_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">float32_t</a></td></tr>\n<tr class=\"memdesc:ga41d579d81c3d98edd0532244fa02da77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 32 bit single-qualifier floating-point scalar.  <a href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41d579d81c3d98edd0532244fa02da77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6957c7b22f405683bb276554ca40dc37\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float64_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">float64_t</a></td></tr>\n<tr class=\"memdesc:ga6957c7b22f405683bb276554ca40dc37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 64 bit double-qualifier floating-point scalar.  <a href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6957c7b22f405683bb276554ca40dc37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4541dc2feb2a31d6ecb5a303f3dd3280\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef fmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">fmat2</a></td></tr>\n<tr class=\"memdesc:ga4541dc2feb2a31d6ecb5a303f3dd3280\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4541dc2feb2a31d6ecb5a303f3dd3280\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3350c93c3275298f940a42875388e4b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a></td></tr>\n<tr class=\"memdesc:ga3350c93c3275298f940a42875388e4b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3350c93c3275298f940a42875388e4b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga55a2d2a8eb09b5633668257eb3cad453\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">fmat2x3</a></td></tr>\n<tr class=\"memdesc:ga55a2d2a8eb09b5633668257eb3cad453\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x3 matrix.  <a href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">More...</a><br /></td></tr>\n<tr class=\"separator:ga55a2d2a8eb09b5633668257eb3cad453\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga681381f19f11c9e5ee45cda2c56937ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">fmat2x4</a></td></tr>\n<tr class=\"memdesc:ga681381f19f11c9e5ee45cda2c56937ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x4 matrix.  <a href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga681381f19f11c9e5ee45cda2c56937ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga253d453c20e037730023fea0215cb6f6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef fmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">fmat3</a></td></tr>\n<tr class=\"memdesc:ga253d453c20e037730023fea0215cb6f6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga253d453c20e037730023fea0215cb6f6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6af54d70d9beb0a7ef992a879e86b04f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">fmat3x2</a></td></tr>\n<tr class=\"memdesc:ga6af54d70d9beb0a7ef992a879e86b04f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x2 matrix.  <a href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6af54d70d9beb0a7ef992a879e86b04f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa07c86650253672a19dbfb898f3265b8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a></td></tr>\n<tr class=\"memdesc:gaa07c86650253672a19dbfb898f3265b8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa07c86650253672a19dbfb898f3265b8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga44e158af77a670ee1b58c03cda9e1619\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">fmat3x4</a></td></tr>\n<tr class=\"memdesc:ga44e158af77a670ee1b58c03cda9e1619\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x4 matrix.  <a href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">More...</a><br /></td></tr>\n<tr class=\"separator:ga44e158af77a670ee1b58c03cda9e1619\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8cb400c0f4438f2640035d7b9824a0ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef fmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">fmat4</a></td></tr>\n<tr class=\"memdesc:ga8cb400c0f4438f2640035d7b9824a0ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8cb400c0f4438f2640035d7b9824a0ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8c8aa45aafcc23238edb1d5aeb801774\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">fmat4x2</a></td></tr>\n<tr class=\"memdesc:ga8c8aa45aafcc23238edb1d5aeb801774\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x2 matrix.  <a href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8c8aa45aafcc23238edb1d5aeb801774\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4295048a78bdf46b8a7de77ec665b497\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">fmat4x3</a></td></tr>\n<tr class=\"memdesc:ga4295048a78bdf46b8a7de77ec665b497\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x3 matrix.  <a href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4295048a78bdf46b8a7de77ec665b497\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad01cc6479bde1fd1870f13d3ed9530b3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a></td></tr>\n<tr class=\"memdesc:gad01cc6479bde1fd1870f13d3ed9530b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">More...</a><br /></td></tr>\n<tr class=\"separator:gad01cc6479bde1fd1870f13d3ed9530b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af31dbba5cedde97099c8e30b9661edf0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>fquat</b></td></tr>\n<tr class=\"memdesc:af31dbba5cedde97099c8e30b9661edf0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of default single-qualifier floating-point numbers.  <a href=\"a00135.html#af31dbba5cedde97099c8e30b9661edf0\">More...</a><br /></td></tr>\n<tr class=\"separator:af31dbba5cedde97099c8e30b9661edf0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98b9ed43cf8c5cf1d354b23c7df9119f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">fvec1</a></td></tr>\n<tr class=\"memdesc:ga98b9ed43cf8c5cf1d354b23c7df9119f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 1 components.  <a href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga98b9ed43cf8c5cf1d354b23c7df9119f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga24273aa02abaecaab7f160bac437a339\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">fvec2</a></td></tr>\n<tr class=\"memdesc:ga24273aa02abaecaab7f160bac437a339\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 2 components.  <a href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">More...</a><br /></td></tr>\n<tr class=\"separator:ga24273aa02abaecaab7f160bac437a339\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga89930533646b30d021759298aa6bf04a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">fvec3</a></td></tr>\n<tr class=\"memdesc:ga89930533646b30d021759298aa6bf04a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 3 components.  <a href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga89930533646b30d021759298aa6bf04a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga713c796c54875cf4092d42ff9d9096b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">fvec4</a></td></tr>\n<tr class=\"memdesc:ga713c796c54875cf4092d42ff9d9096b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 4 components.  <a href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga713c796c54875cf4092d42ff9d9096b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a30d694434c136946d9f98c8baa3d40a1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_dquat</b></td></tr>\n<tr class=\"memdesc:a30d694434c136946d9f98c8baa3d40a1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of high double-qualifier floating-point numbers.  <a href=\"a00135.html#a30d694434c136946d9f98c8baa3d40a1\">More...</a><br /></td></tr>\n<tr class=\"separator:a30d694434c136946d9f98c8baa3d40a1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6906e1ef0b34064b4b675489c5c38725\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32</b></td></tr>\n<tr class=\"memdesc:a6906e1ef0b34064b4b675489c5c38725\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#a6906e1ef0b34064b4b675489c5c38725\">More...</a><br /></td></tr>\n<tr class=\"separator:a6906e1ef0b34064b4b675489c5c38725\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a298f7d4d273678d0282812368da27fda\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat2</b></td></tr>\n<tr class=\"memdesc:a298f7d4d273678d0282812368da27fda\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a298f7d4d273678d0282812368da27fda\">More...</a><br /></td></tr>\n<tr class=\"separator:a298f7d4d273678d0282812368da27fda\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a053ea062756f357573bb8b1ce5a4a1cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat2x2</b></td></tr>\n<tr class=\"memdesc:a053ea062756f357573bb8b1ce5a4a1cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a053ea062756f357573bb8b1ce5a4a1cf\">More...</a><br /></td></tr>\n<tr class=\"separator:a053ea062756f357573bb8b1ce5a4a1cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aad01f64e6f975b5919040c43a22a0b20\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat2x3</b></td></tr>\n<tr class=\"memdesc:aad01f64e6f975b5919040c43a22a0b20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#aad01f64e6f975b5919040c43a22a0b20\">More...</a><br /></td></tr>\n<tr class=\"separator:aad01f64e6f975b5919040c43a22a0b20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7bcbe49ddc3a975c5e3c9e7a06d5524e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat2x4</b></td></tr>\n<tr class=\"memdesc:a7bcbe49ddc3a975c5e3c9e7a06d5524e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#a7bcbe49ddc3a975c5e3c9e7a06d5524e\">More...</a><br /></td></tr>\n<tr class=\"separator:a7bcbe49ddc3a975c5e3c9e7a06d5524e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a24f9ef3263b1638564713892cc37981f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat3</b></td></tr>\n<tr class=\"memdesc:a24f9ef3263b1638564713892cc37981f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a24f9ef3263b1638564713892cc37981f\">More...</a><br /></td></tr>\n<tr class=\"separator:a24f9ef3263b1638564713892cc37981f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af4c059dfb91d1caf95fbe50e46f0377c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat3x2</b></td></tr>\n<tr class=\"memdesc:af4c059dfb91d1caf95fbe50e46f0377c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#af4c059dfb91d1caf95fbe50e46f0377c\">More...</a><br /></td></tr>\n<tr class=\"separator:af4c059dfb91d1caf95fbe50e46f0377c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af66b4ab8e8032755d4ee4ac638b12a75\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat3x3</b></td></tr>\n<tr class=\"memdesc:af66b4ab8e8032755d4ee4ac638b12a75\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#af66b4ab8e8032755d4ee4ac638b12a75\">More...</a><br /></td></tr>\n<tr class=\"separator:af66b4ab8e8032755d4ee4ac638b12a75\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5b0567aea134701aff4125c37d1be6c8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat3x4</b></td></tr>\n<tr class=\"memdesc:a5b0567aea134701aff4125c37d1be6c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#a5b0567aea134701aff4125c37d1be6c8\">More...</a><br /></td></tr>\n<tr class=\"separator:a5b0567aea134701aff4125c37d1be6c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a14c90ca49885723f51d06e295587236f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat4</b></td></tr>\n<tr class=\"memdesc:a14c90ca49885723f51d06e295587236f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a14c90ca49885723f51d06e295587236f\">More...</a><br /></td></tr>\n<tr class=\"separator:a14c90ca49885723f51d06e295587236f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a183bb20a6117e5a28ec8e50c98c91a0a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat4x2</b></td></tr>\n<tr class=\"memdesc:a183bb20a6117e5a28ec8e50c98c91a0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#a183bb20a6117e5a28ec8e50c98c91a0a\">More...</a><br /></td></tr>\n<tr class=\"separator:a183bb20a6117e5a28ec8e50c98c91a0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a558be577a009614d6f99e39a450bf983\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat4x3</b></td></tr>\n<tr class=\"memdesc:a558be577a009614d6f99e39a450bf983\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#a558be577a009614d6f99e39a450bf983\">More...</a><br /></td></tr>\n<tr class=\"separator:a558be577a009614d6f99e39a450bf983\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a52fbf71549aa23b420445de745b138d1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32mat4x4</b></td></tr>\n<tr class=\"memdesc:a52fbf71549aa23b420445de745b138d1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a52fbf71549aa23b420445de745b138d1\">More...</a><br /></td></tr>\n<tr class=\"separator:a52fbf71549aa23b420445de745b138d1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abe379321f08ebc6fc89563908f3e4cda\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32quat</b></td></tr>\n<tr class=\"memdesc:abe379321f08ebc6fc89563908f3e4cda\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point quaternion.  <a href=\"a00135.html#abe379321f08ebc6fc89563908f3e4cda\">More...</a><br /></td></tr>\n<tr class=\"separator:abe379321f08ebc6fc89563908f3e4cda\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a878d48910852b2b51477441c0a50d913\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32vec1</b></td></tr>\n<tr class=\"memdesc:a878d48910852b2b51477441c0a50d913\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#a878d48910852b2b51477441c0a50d913\">More...</a><br /></td></tr>\n<tr class=\"separator:a878d48910852b2b51477441c0a50d913\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae06c7bde47804ad5a1e79f976eb57bfc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32vec2</b></td></tr>\n<tr class=\"memdesc:ae06c7bde47804ad5a1e79f976eb57bfc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#ae06c7bde47804ad5a1e79f976eb57bfc\">More...</a><br /></td></tr>\n<tr class=\"separator:ae06c7bde47804ad5a1e79f976eb57bfc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a81b525cfd0aac2cc993f796239a94dd7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32vec3</b></td></tr>\n<tr class=\"memdesc:a81b525cfd0aac2cc993f796239a94dd7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#a81b525cfd0aac2cc993f796239a94dd7\">More...</a><br /></td></tr>\n<tr class=\"separator:a81b525cfd0aac2cc993f796239a94dd7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a32f0f8fe5958a8fad012c22184f15e50\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f32vec4</b></td></tr>\n<tr class=\"memdesc:a32f0f8fe5958a8fad012c22184f15e50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#a32f0f8fe5958a8fad012c22184f15e50\">More...</a><br /></td></tr>\n<tr class=\"separator:a32f0f8fe5958a8fad012c22184f15e50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a51d5266017d88f62737c1973923a7cf4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64</b></td></tr>\n<tr class=\"memdesc:a51d5266017d88f62737c1973923a7cf4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#a51d5266017d88f62737c1973923a7cf4\">More...</a><br /></td></tr>\n<tr class=\"separator:a51d5266017d88f62737c1973923a7cf4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af7adb92ce8de0afaff01436b039fd924\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat2</b></td></tr>\n<tr class=\"memdesc:af7adb92ce8de0afaff01436b039fd924\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#af7adb92ce8de0afaff01436b039fd924\">More...</a><br /></td></tr>\n<tr class=\"separator:af7adb92ce8de0afaff01436b039fd924\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8dd9681083b57326e49d4e0be9d3cf30\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat2x2</b></td></tr>\n<tr class=\"memdesc:a8dd9681083b57326e49d4e0be9d3cf30\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a8dd9681083b57326e49d4e0be9d3cf30\">More...</a><br /></td></tr>\n<tr class=\"separator:a8dd9681083b57326e49d4e0be9d3cf30\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae89f1ae453a8abccf00da0439deb6e35\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat2x3</b></td></tr>\n<tr class=\"memdesc:ae89f1ae453a8abccf00da0439deb6e35\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#ae89f1ae453a8abccf00da0439deb6e35\">More...</a><br /></td></tr>\n<tr class=\"separator:ae89f1ae453a8abccf00da0439deb6e35\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a985ce399c5d3924868ae5cb8dbbf0915\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat2x4</b></td></tr>\n<tr class=\"memdesc:a985ce399c5d3924868ae5cb8dbbf0915\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#a985ce399c5d3924868ae5cb8dbbf0915\">More...</a><br /></td></tr>\n<tr class=\"separator:a985ce399c5d3924868ae5cb8dbbf0915\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a609bf0ace941d6ab1bb2f9522a04e546\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat3</b></td></tr>\n<tr class=\"memdesc:a609bf0ace941d6ab1bb2f9522a04e546\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a609bf0ace941d6ab1bb2f9522a04e546\">More...</a><br /></td></tr>\n<tr class=\"separator:a609bf0ace941d6ab1bb2f9522a04e546\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad8a34f6b88e9bacd7b192164da455657\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat3x2</b></td></tr>\n<tr class=\"memdesc:ad8a34f6b88e9bacd7b192164da455657\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#ad8a34f6b88e9bacd7b192164da455657\">More...</a><br /></td></tr>\n<tr class=\"separator:ad8a34f6b88e9bacd7b192164da455657\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a132aba33dea285599452ef6a2f045002\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat3x3</b></td></tr>\n<tr class=\"memdesc:a132aba33dea285599452ef6a2f045002\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a132aba33dea285599452ef6a2f045002\">More...</a><br /></td></tr>\n<tr class=\"separator:a132aba33dea285599452ef6a2f045002\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4e634cae0584b624224748222273fca6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat3x4</b></td></tr>\n<tr class=\"memdesc:a4e634cae0584b624224748222273fca6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#a4e634cae0584b624224748222273fca6\">More...</a><br /></td></tr>\n<tr class=\"separator:a4e634cae0584b624224748222273fca6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad308e0ed27d64daa4213fb257fcbd5a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat4</b></td></tr>\n<tr class=\"memdesc:ad308e0ed27d64daa4213fb257fcbd5a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#ad308e0ed27d64daa4213fb257fcbd5a5\">More...</a><br /></td></tr>\n<tr class=\"separator:ad308e0ed27d64daa4213fb257fcbd5a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae9521beaec5e67f8421dec700d588b6b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat4x2</b></td></tr>\n<tr class=\"memdesc:ae9521beaec5e67f8421dec700d588b6b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#ae9521beaec5e67f8421dec700d588b6b\">More...</a><br /></td></tr>\n<tr class=\"separator:ae9521beaec5e67f8421dec700d588b6b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa260a056dd4b0687ee36a8766f04ef35\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat4x3</b></td></tr>\n<tr class=\"memdesc:aa260a056dd4b0687ee36a8766f04ef35\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#aa260a056dd4b0687ee36a8766f04ef35\">More...</a><br /></td></tr>\n<tr class=\"separator:aa260a056dd4b0687ee36a8766f04ef35\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac921aad74de704c399e0a790cd6f1d70\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64mat4x4</b></td></tr>\n<tr class=\"memdesc:ac921aad74de704c399e0a790cd6f1d70\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#ac921aad74de704c399e0a790cd6f1d70\">More...</a><br /></td></tr>\n<tr class=\"separator:ac921aad74de704c399e0a790cd6f1d70\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab51c057647a12b62a8a6a855ece8d167\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64quat</b></td></tr>\n<tr class=\"memdesc:ab51c057647a12b62a8a6a855ece8d167\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point quaternion.  <a href=\"a00135.html#ab51c057647a12b62a8a6a855ece8d167\">More...</a><br /></td></tr>\n<tr class=\"separator:ab51c057647a12b62a8a6a855ece8d167\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abed63acf511417c9fdb21079e9360959\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64vec1</b></td></tr>\n<tr class=\"memdesc:abed63acf511417c9fdb21079e9360959\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#abed63acf511417c9fdb21079e9360959\">More...</a><br /></td></tr>\n<tr class=\"separator:abed63acf511417c9fdb21079e9360959\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a9bc71fd98d32abf668dbd55f2e96940d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64vec2</b></td></tr>\n<tr class=\"memdesc:a9bc71fd98d32abf668dbd55f2e96940d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#a9bc71fd98d32abf668dbd55f2e96940d\">More...</a><br /></td></tr>\n<tr class=\"separator:a9bc71fd98d32abf668dbd55f2e96940d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae51dd3e4ef181e303e2ef9cf418a61bb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64vec3</b></td></tr>\n<tr class=\"memdesc:ae51dd3e4ef181e303e2ef9cf418a61bb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#ae51dd3e4ef181e303e2ef9cf418a61bb\">More...</a><br /></td></tr>\n<tr class=\"separator:ae51dd3e4ef181e303e2ef9cf418a61bb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6d46e84b2a8eac688525a3c601f2b5ed\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, f64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_f64vec4</b></td></tr>\n<tr class=\"memdesc:a6d46e84b2a8eac688525a3c601f2b5ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High double-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#a6d46e84b2a8eac688525a3c601f2b5ed\">More...</a><br /></td></tr>\n<tr class=\"separator:a6d46e84b2a8eac688525a3c601f2b5ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:adde4415e846cff13c6cb74a6fe73d01e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_float32</b></td></tr>\n<tr class=\"memdesc:adde4415e846cff13c6cb74a6fe73d01e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#adde4415e846cff13c6cb74a6fe73d01e\">More...</a><br /></td></tr>\n<tr class=\"separator:adde4415e846cff13c6cb74a6fe73d01e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a52ccfbf2e504ae2e5abcf2ad93b4f4a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_float32_t</b></td></tr>\n<tr class=\"memdesc:a52ccfbf2e504ae2e5abcf2ad93b4f4a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#a52ccfbf2e504ae2e5abcf2ad93b4f4a2\">More...</a><br /></td></tr>\n<tr class=\"separator:a52ccfbf2e504ae2e5abcf2ad93b4f4a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae9b1ba717a8b1e9a7b028ac98d9998d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_float64</b></td></tr>\n<tr class=\"memdesc:ae9b1ba717a8b1e9a7b028ac98d9998d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#ae9b1ba717a8b1e9a7b028ac98d9998d3\">More...</a><br /></td></tr>\n<tr class=\"separator:ae9b1ba717a8b1e9a7b028ac98d9998d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a982f41429168a9f2d557500008b0ec22\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_float64_t</b></td></tr>\n<tr class=\"memdesc:a982f41429168a9f2d557500008b0ec22\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#a982f41429168a9f2d557500008b0ec22\">More...</a><br /></td></tr>\n<tr class=\"separator:a982f41429168a9f2d557500008b0ec22\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae98c88d9a7befa9b5877f49176225535\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_fmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat2</b></td></tr>\n<tr class=\"memdesc:ae98c88d9a7befa9b5877f49176225535\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#ae98c88d9a7befa9b5877f49176225535\">More...</a><br /></td></tr>\n<tr class=\"separator:ae98c88d9a7befa9b5877f49176225535\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a535437b7f73d8fe0fb0113ede66ec9cb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat2x2</b></td></tr>\n<tr class=\"memdesc:a535437b7f73d8fe0fb0113ede66ec9cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a535437b7f73d8fe0fb0113ede66ec9cb\">More...</a><br /></td></tr>\n<tr class=\"separator:a535437b7f73d8fe0fb0113ede66ec9cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a1fb172a15fa39511defbd93774e7218d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat2x3</b></td></tr>\n<tr class=\"memdesc:a1fb172a15fa39511defbd93774e7218d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#a1fb172a15fa39511defbd93774e7218d\">More...</a><br /></td></tr>\n<tr class=\"separator:a1fb172a15fa39511defbd93774e7218d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a41d86f9fd2096b2e10b848ebbe4097e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat2x4</b></td></tr>\n<tr class=\"memdesc:a41d86f9fd2096b2e10b848ebbe4097e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#a41d86f9fd2096b2e10b848ebbe4097e9\">More...</a><br /></td></tr>\n<tr class=\"separator:a41d86f9fd2096b2e10b848ebbe4097e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aed2dc69e0d507d4191092dbd44b3eb75\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_fmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat3</b></td></tr>\n<tr class=\"memdesc:aed2dc69e0d507d4191092dbd44b3eb75\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#aed2dc69e0d507d4191092dbd44b3eb75\">More...</a><br /></td></tr>\n<tr class=\"separator:aed2dc69e0d507d4191092dbd44b3eb75\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a80870377de8b23144eae8c1a7ebebf63\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat3x2</b></td></tr>\n<tr class=\"memdesc:a80870377de8b23144eae8c1a7ebebf63\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#a80870377de8b23144eae8c1a7ebebf63\">More...</a><br /></td></tr>\n<tr class=\"separator:a80870377de8b23144eae8c1a7ebebf63\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad247f15ff4c2fc013acd6bcf38688a82\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat3x3</b></td></tr>\n<tr class=\"memdesc:ad247f15ff4c2fc013acd6bcf38688a82\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#ad247f15ff4c2fc013acd6bcf38688a82\">More...</a><br /></td></tr>\n<tr class=\"separator:ad247f15ff4c2fc013acd6bcf38688a82\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7d2107369a51bb6bef5d8142c554e7f8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat3x4</b></td></tr>\n<tr class=\"memdesc:a7d2107369a51bb6bef5d8142c554e7f8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#a7d2107369a51bb6bef5d8142c554e7f8\">More...</a><br /></td></tr>\n<tr class=\"separator:a7d2107369a51bb6bef5d8142c554e7f8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abf28443ce0cc0959077ec39b21f32c39\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_fmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat4</b></td></tr>\n<tr class=\"memdesc:abf28443ce0cc0959077ec39b21f32c39\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#abf28443ce0cc0959077ec39b21f32c39\">More...</a><br /></td></tr>\n<tr class=\"separator:abf28443ce0cc0959077ec39b21f32c39\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a16aa2ea44903e47ac5b41c682a857325\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat4x2</b></td></tr>\n<tr class=\"memdesc:a16aa2ea44903e47ac5b41c682a857325\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#a16aa2ea44903e47ac5b41c682a857325\">More...</a><br /></td></tr>\n<tr class=\"separator:a16aa2ea44903e47ac5b41c682a857325\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad72b21a4942cd337de0670cd90e047c8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat4x3</b></td></tr>\n<tr class=\"memdesc:ad72b21a4942cd337de0670cd90e047c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#ad72b21a4942cd337de0670cd90e047c8\">More...</a><br /></td></tr>\n<tr class=\"separator:ad72b21a4942cd337de0670cd90e047c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac0e7690e26a23822595e533ce30a48c1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fmat4x4</b></td></tr>\n<tr class=\"memdesc:ac0e7690e26a23822595e533ce30a48c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#ac0e7690e26a23822595e533ce30a48c1\">More...</a><br /></td></tr>\n<tr class=\"separator:ac0e7690e26a23822595e533ce30a48c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a9d8bda24be0d5c66b38ceda1a193f0c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fquat</b></td></tr>\n<tr class=\"memdesc:a9d8bda24be0d5c66b38ceda1a193f0c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of high single-qualifier floating-point numbers.  <a href=\"a00135.html#a9d8bda24be0d5c66b38ceda1a193f0c9\">More...</a><br /></td></tr>\n<tr class=\"separator:a9d8bda24be0d5c66b38ceda1a193f0c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac9e7d033cbf254d97f03f5800e459901\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fvec1</b></td></tr>\n<tr class=\"memdesc:ac9e7d033cbf254d97f03f5800e459901\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#ac9e7d033cbf254d97f03f5800e459901\">More...</a><br /></td></tr>\n<tr class=\"separator:ac9e7d033cbf254d97f03f5800e459901\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa3ebd30f95a804dd198f329f98c3750d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fvec2</b></td></tr>\n<tr class=\"memdesc:aa3ebd30f95a804dd198f329f98c3750d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High Single-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#aa3ebd30f95a804dd198f329f98c3750d\">More...</a><br /></td></tr>\n<tr class=\"separator:aa3ebd30f95a804dd198f329f98c3750d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac2361fe340bcd81a8c75f7a51b5c6bea\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fvec3</b></td></tr>\n<tr class=\"memdesc:ac2361fe340bcd81a8c75f7a51b5c6bea\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High Single-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#ac2361fe340bcd81a8c75f7a51b5c6bea\">More...</a><br /></td></tr>\n<tr class=\"separator:ac2361fe340bcd81a8c75f7a51b5c6bea\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a91a7f5c6b78bf819d2edd63b6b56e7cc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_fvec4</b></td></tr>\n<tr class=\"memdesc:a91a7f5c6b78bf819d2edd63b6b56e7cc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High Single-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#a91a7f5c6b78bf819d2edd63b6b56e7cc\">More...</a><br /></td></tr>\n<tr class=\"separator:a91a7f5c6b78bf819d2edd63b6b56e7cc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0336abc2604dd2c20c30e036454b64f8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">highp_i16</a></td></tr>\n<tr class=\"memdesc:ga0336abc2604dd2c20c30e036454b64f8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0336abc2604dd2c20c30e036454b64f8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a281f5ac0397fde02fc5d3b10fc4d852d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i16, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i16vec1</b></td></tr>\n<tr class=\"memdesc:a281f5ac0397fde02fc5d3b10fc4d852d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer scalar type.  <a href=\"a00135.html#a281f5ac0397fde02fc5d3b10fc4d852d\">More...</a><br /></td></tr>\n<tr class=\"separator:a281f5ac0397fde02fc5d3b10fc4d852d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af6b9ee13b5c8d4120f797f21790261fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i16, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i16vec2</b></td></tr>\n<tr class=\"memdesc:af6b9ee13b5c8d4120f797f21790261fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer vector of 2 components type.  <a href=\"a00135.html#af6b9ee13b5c8d4120f797f21790261fc\">More...</a><br /></td></tr>\n<tr class=\"separator:af6b9ee13b5c8d4120f797f21790261fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a69c12e3f139400cceb0249ab35202f78\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i16, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i16vec3</b></td></tr>\n<tr class=\"memdesc:a69c12e3f139400cceb0249ab35202f78\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer vector of 3 components type.  <a href=\"a00135.html#a69c12e3f139400cceb0249ab35202f78\">More...</a><br /></td></tr>\n<tr class=\"separator:a69c12e3f139400cceb0249ab35202f78\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a58b427a2b6f6b7dd5fd590c629fa87fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i16, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i16vec4</b></td></tr>\n<tr class=\"memdesc:a58b427a2b6f6b7dd5fd590c629fa87fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer vector of 4 components type.  <a href=\"a00135.html#a58b427a2b6f6b7dd5fd590c629fa87fc\">More...</a><br /></td></tr>\n<tr class=\"separator:a58b427a2b6f6b7dd5fd590c629fa87fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga727675ac6b5d2fc699520e0059735e25\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">highp_i32</a></td></tr>\n<tr class=\"memdesc:ga727675ac6b5d2fc699520e0059735e25\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">More...</a><br /></td></tr>\n<tr class=\"separator:ga727675ac6b5d2fc699520e0059735e25\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6a9d71cc62745302f70422b7dc98755c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i32vec1</b></td></tr>\n<tr class=\"memdesc:a6a9d71cc62745302f70422b7dc98755c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer scalar type.  <a href=\"a00135.html#a6a9d71cc62745302f70422b7dc98755c\">More...</a><br /></td></tr>\n<tr class=\"separator:a6a9d71cc62745302f70422b7dc98755c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa9b4579f8e6f3d9b649a965bcb785530\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i32vec2</b></td></tr>\n<tr class=\"memdesc:aa9b4579f8e6f3d9b649a965bcb785530\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer vector of 2 components type.  <a href=\"a00135.html#aa9b4579f8e6f3d9b649a965bcb785530\">More...</a><br /></td></tr>\n<tr class=\"separator:aa9b4579f8e6f3d9b649a965bcb785530\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a31e070ea3bdee623e6e18a61ba5718b1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i32vec3</b></td></tr>\n<tr class=\"memdesc:a31e070ea3bdee623e6e18a61ba5718b1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer vector of 3 components type.  <a href=\"a00135.html#a31e070ea3bdee623e6e18a61ba5718b1\">More...</a><br /></td></tr>\n<tr class=\"separator:a31e070ea3bdee623e6e18a61ba5718b1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:adf70eaaa230aeed5a4c9f4c9c5c55902\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i32vec4</b></td></tr>\n<tr class=\"memdesc:adf70eaaa230aeed5a4c9f4c9c5c55902\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer vector of 4 components type.  <a href=\"a00135.html#adf70eaaa230aeed5a4c9f4c9c5c55902\">More...</a><br /></td></tr>\n<tr class=\"separator:adf70eaaa230aeed5a4c9f4c9c5c55902\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac25db6d2b1e2a0f351b77ba3409ac4cd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">highp_i64</a></td></tr>\n<tr class=\"memdesc:gac25db6d2b1e2a0f351b77ba3409ac4cd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer type.  <a href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">More...</a><br /></td></tr>\n<tr class=\"separator:gac25db6d2b1e2a0f351b77ba3409ac4cd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aed3fbfa95db495a0b09b9af1351811d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i64vec1</b></td></tr>\n<tr class=\"memdesc:aed3fbfa95db495a0b09b9af1351811d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer scalar type.  <a href=\"a00135.html#aed3fbfa95db495a0b09b9af1351811d8\">More...</a><br /></td></tr>\n<tr class=\"separator:aed3fbfa95db495a0b09b9af1351811d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a42b51e30531f914957e9a53eb3dfdd1e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i64vec2</b></td></tr>\n<tr class=\"memdesc:a42b51e30531f914957e9a53eb3dfdd1e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer vector of 2 components type.  <a href=\"a00135.html#a42b51e30531f914957e9a53eb3dfdd1e\">More...</a><br /></td></tr>\n<tr class=\"separator:a42b51e30531f914957e9a53eb3dfdd1e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab5664074968b608f29d4fee79759abb7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i64vec3</b></td></tr>\n<tr class=\"memdesc:ab5664074968b608f29d4fee79759abb7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer vector of 3 components type.  <a href=\"a00135.html#ab5664074968b608f29d4fee79759abb7\">More...</a><br /></td></tr>\n<tr class=\"separator:ab5664074968b608f29d4fee79759abb7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a9c934565585564da4454e331dbf8d24d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i64vec4</b></td></tr>\n<tr class=\"memdesc:a9c934565585564da4454e331dbf8d24d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer vector of 4 components type.  <a href=\"a00135.html#a9c934565585564da4454e331dbf8d24d\">More...</a><br /></td></tr>\n<tr class=\"separator:a9c934565585564da4454e331dbf8d24d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb88796f2d08ef253d0345aff20c3aee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">highp_i8</a></td></tr>\n<tr class=\"memdesc:gacb88796f2d08ef253d0345aff20c3aee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer type.  <a href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">More...</a><br /></td></tr>\n<tr class=\"separator:gacb88796f2d08ef253d0345aff20c3aee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a480eb7819eb0a2f93f662d99231f2fd0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i8, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i8vec1</b></td></tr>\n<tr class=\"memdesc:a480eb7819eb0a2f93f662d99231f2fd0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer scalar type.  <a href=\"a00135.html#a480eb7819eb0a2f93f662d99231f2fd0\">More...</a><br /></td></tr>\n<tr class=\"separator:a480eb7819eb0a2f93f662d99231f2fd0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aebde2a61c0ed34ee5b98894cd5356128\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i8, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i8vec2</b></td></tr>\n<tr class=\"memdesc:aebde2a61c0ed34ee5b98894cd5356128\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer vector of 2 components type.  <a href=\"a00135.html#aebde2a61c0ed34ee5b98894cd5356128\">More...</a><br /></td></tr>\n<tr class=\"separator:aebde2a61c0ed34ee5b98894cd5356128\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a75a222e797525b66432971973e72f2a1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i8, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i8vec3</b></td></tr>\n<tr class=\"memdesc:a75a222e797525b66432971973e72f2a1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer vector of 3 components type.  <a href=\"a00135.html#a75a222e797525b66432971973e72f2a1\">More...</a><br /></td></tr>\n<tr class=\"separator:a75a222e797525b66432971973e72f2a1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6f1744d181e45e8a16bab641e4082c52\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i8, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_i8vec4</b></td></tr>\n<tr class=\"memdesc:a6f1744d181e45e8a16bab641e4082c52\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer vector of 4 components type.  <a href=\"a00135.html#a6f1744d181e45e8a16bab641e4082c52\">More...</a><br /></td></tr>\n<tr class=\"separator:a6f1744d181e45e8a16bab641e4082c52\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5fde0fa4a3852a9dd5d637a92ee74718\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">highp_int16</a></td></tr>\n<tr class=\"memdesc:ga5fde0fa4a3852a9dd5d637a92ee74718\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5fde0fa4a3852a9dd5d637a92ee74718\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacaea06d0a79ef3172e887a7a6ba434ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">highp_int16_t</a></td></tr>\n<tr class=\"memdesc:gacaea06d0a79ef3172e887a7a6ba434ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer type.  <a href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">More...</a><br /></td></tr>\n<tr class=\"separator:gacaea06d0a79ef3172e887a7a6ba434ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga84ed04b4e0de18c977e932d617e7c223\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">highp_int32</a></td></tr>\n<tr class=\"memdesc:ga84ed04b4e0de18c977e932d617e7c223\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">More...</a><br /></td></tr>\n<tr class=\"separator:ga84ed04b4e0de18c977e932d617e7c223\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">highp_int32_t</a></td></tr>\n<tr class=\"memdesc:ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit signed integer type.  <a href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga226a8d52b4e3f77aaa6231135e886aac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">highp_int64</a></td></tr>\n<tr class=\"memdesc:ga226a8d52b4e3f77aaa6231135e886aac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga226a8d52b4e3f77aaa6231135e886aac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73c6abb280a45feeff60f9accaee91f3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">highp_int64_t</a></td></tr>\n<tr class=\"memdesc:ga73c6abb280a45feeff60f9accaee91f3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73c6abb280a45feeff60f9accaee91f3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0549c902a96a7164e4ac858d5f39dbf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">highp_int8</a></td></tr>\n<tr class=\"memdesc:gad0549c902a96a7164e4ac858d5f39dbf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer type.  <a href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0549c902a96a7164e4ac858d5f39dbf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1085c50dd8fbeb5e7e609b1c127492a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">highp_int8_t</a></td></tr>\n<tr class=\"memdesc:ga1085c50dd8fbeb5e7e609b1c127492a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1085c50dd8fbeb5e7e609b1c127492a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aefe60e46b0d012d98067425ad2e6cbc1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_quat</b></td></tr>\n<tr class=\"memdesc:aefe60e46b0d012d98067425ad2e6cbc1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of high single-qualifier floating-point numbers.  <a href=\"a00135.html#aefe60e46b0d012d98067425ad2e6cbc1\">More...</a><br /></td></tr>\n<tr class=\"separator:aefe60e46b0d012d98067425ad2e6cbc1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e62c883d13f47015f3b70ed88751369\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">highp_u16</a></td></tr>\n<tr class=\"memdesc:ga8e62c883d13f47015f3b70ed88751369\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e62c883d13f47015f3b70ed88751369\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a9c7c19467b69d9e716cee4e6db07bbbe\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u16, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u16vec1</b></td></tr>\n<tr class=\"memdesc:a9c7c19467b69d9e716cee4e6db07bbbe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer scalar type.  <a href=\"a00135.html#a9c7c19467b69d9e716cee4e6db07bbbe\">More...</a><br /></td></tr>\n<tr class=\"separator:a9c7c19467b69d9e716cee4e6db07bbbe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af23e07145c984d7d4e7dbcbdfe198079\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u16, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u16vec2</b></td></tr>\n<tr class=\"memdesc:af23e07145c984d7d4e7dbcbdfe198079\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#af23e07145c984d7d4e7dbcbdfe198079\">More...</a><br /></td></tr>\n<tr class=\"separator:af23e07145c984d7d4e7dbcbdfe198079\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abc8d788f442af7a875bbcc3a34b3f148\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u16, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u16vec3</b></td></tr>\n<tr class=\"memdesc:abc8d788f442af7a875bbcc3a34b3f148\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#abc8d788f442af7a875bbcc3a34b3f148\">More...</a><br /></td></tr>\n<tr class=\"separator:abc8d788f442af7a875bbcc3a34b3f148\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a65565f0185ec66ee3dcbe8c86ae067c2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u16, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u16vec4</b></td></tr>\n<tr class=\"memdesc:a65565f0185ec66ee3dcbe8c86ae067c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a65565f0185ec66ee3dcbe8c86ae067c2\">More...</a><br /></td></tr>\n<tr class=\"separator:a65565f0185ec66ee3dcbe8c86ae067c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a6f1929464dcc680b16381a4ee5f2cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">highp_u32</a></td></tr>\n<tr class=\"memdesc:ga7a6f1929464dcc680b16381a4ee5f2cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a6f1929464dcc680b16381a4ee5f2cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a0e35a565b9036bfc3989f5e23a0792e3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u32vec1</b></td></tr>\n<tr class=\"memdesc:a0e35a565b9036bfc3989f5e23a0792e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer scalar type.  <a href=\"a00135.html#a0e35a565b9036bfc3989f5e23a0792e3\">More...</a><br /></td></tr>\n<tr class=\"separator:a0e35a565b9036bfc3989f5e23a0792e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2f256334f83fba4c2d219e414b51df6c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u32vec2</b></td></tr>\n<tr class=\"memdesc:a2f256334f83fba4c2d219e414b51df6c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#a2f256334f83fba4c2d219e414b51df6c\">More...</a><br /></td></tr>\n<tr class=\"separator:a2f256334f83fba4c2d219e414b51df6c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af14d7a50502464e7cbfa074f24684cb1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u32vec3</b></td></tr>\n<tr class=\"memdesc:af14d7a50502464e7cbfa074f24684cb1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#af14d7a50502464e7cbfa074f24684cb1\">More...</a><br /></td></tr>\n<tr class=\"separator:af14d7a50502464e7cbfa074f24684cb1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a22166f0da65038b447f3c5e534fff1c2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u32, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u32vec4</b></td></tr>\n<tr class=\"memdesc:a22166f0da65038b447f3c5e534fff1c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a22166f0da65038b447f3c5e534fff1c2\">More...</a><br /></td></tr>\n<tr class=\"separator:a22166f0da65038b447f3c5e534fff1c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c181fdf06a309691999926b6690c969\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">highp_u64</a></td></tr>\n<tr class=\"memdesc:ga0c181fdf06a309691999926b6690c969\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0c181fdf06a309691999926b6690c969\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a166e910061cffde5806e46c780500bae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u64vec1</b></td></tr>\n<tr class=\"memdesc:a166e910061cffde5806e46c780500bae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer scalar type.  <a href=\"a00135.html#a166e910061cffde5806e46c780500bae\">More...</a><br /></td></tr>\n<tr class=\"separator:a166e910061cffde5806e46c780500bae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4f7d7ffe2f4cbea29994df28eed24ec1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u64vec2</b></td></tr>\n<tr class=\"memdesc:a4f7d7ffe2f4cbea29994df28eed24ec1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#a4f7d7ffe2f4cbea29994df28eed24ec1\">More...</a><br /></td></tr>\n<tr class=\"separator:a4f7d7ffe2f4cbea29994df28eed24ec1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a60c239c170a2702c31ec5f6aac0ea2be\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u64vec3</b></td></tr>\n<tr class=\"memdesc:a60c239c170a2702c31ec5f6aac0ea2be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#a60c239c170a2702c31ec5f6aac0ea2be\">More...</a><br /></td></tr>\n<tr class=\"separator:a60c239c170a2702c31ec5f6aac0ea2be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6114db40d59d37baf66624dd62cec582\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u64, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u64vec4</b></td></tr>\n<tr class=\"memdesc:a6114db40d59d37baf66624dd62cec582\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a6114db40d59d37baf66624dd62cec582\">More...</a><br /></td></tr>\n<tr class=\"separator:a6114db40d59d37baf66624dd62cec582\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacd1259f3a9e8d2a9df5be2d74322ef9c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">highp_u8</a></td></tr>\n<tr class=\"memdesc:gacd1259f3a9e8d2a9df5be2d74322ef9c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">More...</a><br /></td></tr>\n<tr class=\"separator:gacd1259f3a9e8d2a9df5be2d74322ef9c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:afacff57f5bce76f2eddef204afa44e60\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u8, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u8vec1</b></td></tr>\n<tr class=\"memdesc:afacff57f5bce76f2eddef204afa44e60\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer scalar type.  <a href=\"a00135.html#afacff57f5bce76f2eddef204afa44e60\">More...</a><br /></td></tr>\n<tr class=\"separator:afacff57f5bce76f2eddef204afa44e60\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:acff22a35cb1179d382303922935ee686\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u8, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u8vec2</b></td></tr>\n<tr class=\"memdesc:acff22a35cb1179d382303922935ee686\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#acff22a35cb1179d382303922935ee686\">More...</a><br /></td></tr>\n<tr class=\"separator:acff22a35cb1179d382303922935ee686\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a80a58d9a2e5889f0076717c22e65e35f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u8, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u8vec3</b></td></tr>\n<tr class=\"memdesc:a80a58d9a2e5889f0076717c22e65e35f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#a80a58d9a2e5889f0076717c22e65e35f\">More...</a><br /></td></tr>\n<tr class=\"separator:a80a58d9a2e5889f0076717c22e65e35f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7d93e1f07759801c8f7ed74fb9526e79\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u8, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_u8vec4</b></td></tr>\n<tr class=\"memdesc:a7d93e1f07759801c8f7ed74fb9526e79\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a7d93e1f07759801c8f7ed74fb9526e79\">More...</a><br /></td></tr>\n<tr class=\"separator:a7d93e1f07759801c8f7ed74fb9526e79\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga746dc6da204f5622e395f492997dbf57\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">highp_uint16</a></td></tr>\n<tr class=\"memdesc:ga746dc6da204f5622e395f492997dbf57\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">More...</a><br /></td></tr>\n<tr class=\"separator:ga746dc6da204f5622e395f492997dbf57\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacf54c3330ef60aa3d16cb676c7bcb8c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">highp_uint16_t</a></td></tr>\n<tr class=\"memdesc:gacf54c3330ef60aa3d16cb676c7bcb8c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">More...</a><br /></td></tr>\n<tr class=\"separator:gacf54c3330ef60aa3d16cb676c7bcb8c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga256b12b650c3f2fb86878fd1c5db8bc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">highp_uint32</a></td></tr>\n<tr class=\"memdesc:ga256b12b650c3f2fb86878fd1c5db8bc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga256b12b650c3f2fb86878fd1c5db8bc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae978599c9711ac263ba732d4ac225b0e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">highp_uint32_t</a></td></tr>\n<tr class=\"memdesc:gae978599c9711ac263ba732d4ac225b0e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae978599c9711ac263ba732d4ac225b0e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">highp_uint64</a></td></tr>\n<tr class=\"memdesc:gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa46172d7dc1c7ffe3e78107ff88adf08\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">highp_uint64_t</a></td></tr>\n<tr class=\"memdesc:gaa46172d7dc1c7ffe3e78107ff88adf08\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa46172d7dc1c7ffe3e78107ff88adf08\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97432f9979e73e66567361fd01e4cffb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">highp_uint8</a></td></tr>\n<tr class=\"memdesc:ga97432f9979e73e66567361fd01e4cffb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97432f9979e73e66567361fd01e4cffb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac4e00a26a2adb5f2c0a7096810df29e5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">highp_uint8_t</a></td></tr>\n<tr class=\"memdesc:gac4e00a26a2adb5f2c0a7096810df29e5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">More...</a><br /></td></tr>\n<tr class=\"separator:gac4e00a26a2adb5f2c0a7096810df29e5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8f81d4fc98bf6a4de7da0332242c1841\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_vec1</b></td></tr>\n<tr class=\"memdesc:a8f81d4fc98bf6a4de7da0332242c1841\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#a8f81d4fc98bf6a4de7da0332242c1841\">More...</a><br /></td></tr>\n<tr class=\"separator:a8f81d4fc98bf6a4de7da0332242c1841\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ab5fe184343d394fb6c2723c3ee3699\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">i16</a></td></tr>\n<tr class=\"memdesc:ga3ab5fe184343d394fb6c2723c3ee3699\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit signed integer type.  <a href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ab5fe184343d394fb6c2723c3ee3699\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafe730798732aa7b0647096a004db1b1c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i16vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">i16vec1</a></td></tr>\n<tr class=\"memdesc:gafe730798732aa7b0647096a004db1b1c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer scalar type.  <a href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">More...</a><br /></td></tr>\n<tr class=\"separator:gafe730798732aa7b0647096a004db1b1c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2996630ba7b10535af8e065cf326f761\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i16vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a></td></tr>\n<tr class=\"memdesc:ga2996630ba7b10535af8e065cf326f761\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer vector of 2 components type.  <a href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2996630ba7b10535af8e065cf326f761\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae9c90a867a6026b1f6eab00456f3fb8b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i16vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">i16vec3</a></td></tr>\n<tr class=\"memdesc:gae9c90a867a6026b1f6eab00456f3fb8b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer vector of 3 components type.  <a href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">More...</a><br /></td></tr>\n<tr class=\"separator:gae9c90a867a6026b1f6eab00456f3fb8b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga550831bfc26d1e0101c1cb3d79938c06\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i16vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a></td></tr>\n<tr class=\"memdesc:ga550831bfc26d1e0101c1cb3d79938c06\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer vector of 4 components type.  <a href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">More...</a><br /></td></tr>\n<tr class=\"separator:ga550831bfc26d1e0101c1cb3d79938c06\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga96faea43ac5f875d2d3ffbf8d213e3eb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">i32</a></td></tr>\n<tr class=\"memdesc:ga96faea43ac5f875d2d3ffbf8d213e3eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit signed integer type.  <a href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96faea43ac5f875d2d3ffbf8d213e3eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i32vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a></td></tr>\n<tr class=\"memdesc:ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer scalar type.  <a href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b44026374982dcd1e52d22bac99247e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a></td></tr>\n<tr class=\"memdesc:ga8b44026374982dcd1e52d22bac99247e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer vector of 2 components type.  <a href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b44026374982dcd1e52d22bac99247e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f526b5cccef126a2ebcf9bdd890394e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i32vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a></td></tr>\n<tr class=\"memdesc:ga7f526b5cccef126a2ebcf9bdd890394e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer vector of 3 components type.  <a href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f526b5cccef126a2ebcf9bdd890394e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga866a05905c49912309ed1fa5f5980e61\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i32vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a></td></tr>\n<tr class=\"memdesc:ga866a05905c49912309ed1fa5f5980e61\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer vector of 4 components type.  <a href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">More...</a><br /></td></tr>\n<tr class=\"separator:ga866a05905c49912309ed1fa5f5980e61\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadb997e409103d4da18abd837e636a496\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">i64</a></td></tr>\n<tr class=\"memdesc:gadb997e409103d4da18abd837e636a496\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit signed integer type.  <a href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">More...</a><br /></td></tr>\n<tr class=\"separator:gadb997e409103d4da18abd837e636a496\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b65767f8b5aed1bd1cf86c541662b50\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i64vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">i64vec1</a></td></tr>\n<tr class=\"memdesc:ga2b65767f8b5aed1bd1cf86c541662b50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer scalar type.  <a href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b65767f8b5aed1bd1cf86c541662b50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga48310188e1d0c616bf8d78c92447523b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i64vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">i64vec2</a></td></tr>\n<tr class=\"memdesc:ga48310188e1d0c616bf8d78c92447523b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer vector of 2 components type.  <a href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga48310188e1d0c616bf8d78c92447523b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga667948cfe6fb3d6606c750729ec49f77\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i64vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">i64vec3</a></td></tr>\n<tr class=\"memdesc:ga667948cfe6fb3d6606c750729ec49f77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer vector of 3 components type.  <a href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">More...</a><br /></td></tr>\n<tr class=\"separator:ga667948cfe6fb3d6606c750729ec49f77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4e31c3d9de067029efeb161a44b0232\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i64vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">i64vec4</a></td></tr>\n<tr class=\"memdesc:gaa4e31c3d9de067029efeb161a44b0232\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer vector of 4 components type.  <a href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa4e31c3d9de067029efeb161a44b0232\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga302ec977b0c0c3ea245b6c9275495355\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">i8</a></td></tr>\n<tr class=\"memdesc:ga302ec977b0c0c3ea245b6c9275495355\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit signed integer type.  <a href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">More...</a><br /></td></tr>\n<tr class=\"separator:ga302ec977b0c0c3ea245b6c9275495355\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7e80d927ff0a3861ced68dfff8a4020b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i8vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">i8vec1</a></td></tr>\n<tr class=\"memdesc:ga7e80d927ff0a3861ced68dfff8a4020b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer scalar type.  <a href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7e80d927ff0a3861ced68dfff8a4020b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad06935764d78f43f9d542c784c2212ec\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i8vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a></td></tr>\n<tr class=\"memdesc:gad06935764d78f43f9d542c784c2212ec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer vector of 2 components type.  <a href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">More...</a><br /></td></tr>\n<tr class=\"separator:gad06935764d78f43f9d542c784c2212ec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5a08d36cf7917cd19d081a603d0eae3e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i8vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">i8vec3</a></td></tr>\n<tr class=\"memdesc:ga5a08d36cf7917cd19d081a603d0eae3e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer vector of 3 components type.  <a href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5a08d36cf7917cd19d081a603d0eae3e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4177a44206121dabc8c4ff1c0f544574\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i8vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a></td></tr>\n<tr class=\"memdesc:ga4177a44206121dabc8c4ff1c0f544574\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer vector of 4 components type.  <a href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4177a44206121dabc8c4ff1c0f544574\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8f5e3e964ca2ae240adc2c0d74adede\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">int16_t</a></td></tr>\n<tr class=\"memdesc:gae8f5e3e964ca2ae240adc2c0d74adede\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit signed integer type.  <a href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">More...</a><br /></td></tr>\n<tr class=\"separator:gae8f5e3e964ca2ae240adc2c0d74adede\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga042ef09ff2f0cb24a36f541bcb3a3710\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">int32_t</a></td></tr>\n<tr class=\"memdesc:ga042ef09ff2f0cb24a36f541bcb3a3710\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit signed integer type.  <a href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">More...</a><br /></td></tr>\n<tr class=\"separator:ga042ef09ff2f0cb24a36f541bcb3a3710\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga322a7d7d2c2c68994dc872a33de63c61\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">int64_t</a></td></tr>\n<tr class=\"memdesc:ga322a7d7d2c2c68994dc872a33de63c61\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit signed integer type.  <a href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">More...</a><br /></td></tr>\n<tr class=\"separator:ga322a7d7d2c2c68994dc872a33de63c61\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4bf09d8838a86866b39ee6e109341645\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">int8_t</a></td></tr>\n<tr class=\"memdesc:ga4bf09d8838a86866b39ee6e109341645\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit signed integer type.  <a href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4bf09d8838a86866b39ee6e109341645\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5bb5330eb0f9cf0f8135c5f6ab07b96c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_dquat</b></td></tr>\n<tr class=\"memdesc:a5bb5330eb0f9cf0f8135c5f6ab07b96c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of low double-qualifier floating-point numbers.  <a href=\"a00135.html#a5bb5330eb0f9cf0f8135c5f6ab07b96c\">More...</a><br /></td></tr>\n<tr class=\"separator:a5bb5330eb0f9cf0f8135c5f6ab07b96c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aeea53879fc327293cf3352a409b7867b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32</b></td></tr>\n<tr class=\"memdesc:aeea53879fc327293cf3352a409b7867b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#aeea53879fc327293cf3352a409b7867b\">More...</a><br /></td></tr>\n<tr class=\"separator:aeea53879fc327293cf3352a409b7867b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a52409bc6d4a2ce3421526c069220d685\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat2</b></td></tr>\n<tr class=\"memdesc:a52409bc6d4a2ce3421526c069220d685\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a52409bc6d4a2ce3421526c069220d685\">More...</a><br /></td></tr>\n<tr class=\"separator:a52409bc6d4a2ce3421526c069220d685\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2e74b0a6ae20edb6fb89f6f74c8d2de5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat2x2</b></td></tr>\n<tr class=\"memdesc:a2e74b0a6ae20edb6fb89f6f74c8d2de5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a2e74b0a6ae20edb6fb89f6f74c8d2de5\">More...</a><br /></td></tr>\n<tr class=\"separator:a2e74b0a6ae20edb6fb89f6f74c8d2de5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a54d5bc29078c02fb1e34dfc658e7b501\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat2x3</b></td></tr>\n<tr class=\"memdesc:a54d5bc29078c02fb1e34dfc658e7b501\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#a54d5bc29078c02fb1e34dfc658e7b501\">More...</a><br /></td></tr>\n<tr class=\"separator:a54d5bc29078c02fb1e34dfc658e7b501\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00876c1e5e3951ffd350fa3d49330346\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat2x4</b></td></tr>\n<tr class=\"memdesc:a00876c1e5e3951ffd350fa3d49330346\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#a00876c1e5e3951ffd350fa3d49330346\">More...</a><br /></td></tr>\n<tr class=\"separator:a00876c1e5e3951ffd350fa3d49330346\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4187f89f196505b40e63f516139511e5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat3</b></td></tr>\n<tr class=\"memdesc:a4187f89f196505b40e63f516139511e5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a4187f89f196505b40e63f516139511e5\">More...</a><br /></td></tr>\n<tr class=\"separator:a4187f89f196505b40e63f516139511e5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:acc852d6ed1a38f0a36bae1f1ae06fd61\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat3x2</b></td></tr>\n<tr class=\"memdesc:acc852d6ed1a38f0a36bae1f1ae06fd61\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#acc852d6ed1a38f0a36bae1f1ae06fd61\">More...</a><br /></td></tr>\n<tr class=\"separator:acc852d6ed1a38f0a36bae1f1ae06fd61\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2390ebc7999b0bee29f975e51e2bafad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat3x3</b></td></tr>\n<tr class=\"memdesc:a2390ebc7999b0bee29f975e51e2bafad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a2390ebc7999b0bee29f975e51e2bafad\">More...</a><br /></td></tr>\n<tr class=\"separator:a2390ebc7999b0bee29f975e51e2bafad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a0a3feb863e781340e38c3b0d5c587c57\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat3x4</b></td></tr>\n<tr class=\"memdesc:a0a3feb863e781340e38c3b0d5c587c57\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#a0a3feb863e781340e38c3b0d5c587c57\">More...</a><br /></td></tr>\n<tr class=\"separator:a0a3feb863e781340e38c3b0d5c587c57\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a766aed2871e6173a81011a877f398f04\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat4</b></td></tr>\n<tr class=\"memdesc:a766aed2871e6173a81011a877f398f04\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a766aed2871e6173a81011a877f398f04\">More...</a><br /></td></tr>\n<tr class=\"separator:a766aed2871e6173a81011a877f398f04\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a87eef0ef87ca860ad719c470acf7edbc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat4x2</b></td></tr>\n<tr class=\"memdesc:a87eef0ef87ca860ad719c470acf7edbc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#a87eef0ef87ca860ad719c470acf7edbc\">More...</a><br /></td></tr>\n<tr class=\"separator:a87eef0ef87ca860ad719c470acf7edbc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a724374f1484083f422f8fef52c42c5da\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat4x3</b></td></tr>\n<tr class=\"memdesc:a724374f1484083f422f8fef52c42c5da\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#a724374f1484083f422f8fef52c42c5da\">More...</a><br /></td></tr>\n<tr class=\"separator:a724374f1484083f422f8fef52c42c5da\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8320ead03cbcdf107e1f465ed1d72c2d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32mat4x4</b></td></tr>\n<tr class=\"memdesc:a8320ead03cbcdf107e1f465ed1d72c2d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a8320ead03cbcdf107e1f465ed1d72c2d\">More...</a><br /></td></tr>\n<tr class=\"separator:a8320ead03cbcdf107e1f465ed1d72c2d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa27d7ca08ddd62647ce00b1981ac3967\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32quat</b></td></tr>\n<tr class=\"memdesc:aa27d7ca08ddd62647ce00b1981ac3967\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point quaternion.  <a href=\"a00135.html#aa27d7ca08ddd62647ce00b1981ac3967\">More...</a><br /></td></tr>\n<tr class=\"separator:aa27d7ca08ddd62647ce00b1981ac3967\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a007b0de55b96ac9ae30c894224904e59\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32vec1</b></td></tr>\n<tr class=\"memdesc:a007b0de55b96ac9ae30c894224904e59\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#a007b0de55b96ac9ae30c894224904e59\">More...</a><br /></td></tr>\n<tr class=\"separator:a007b0de55b96ac9ae30c894224904e59\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a66d3a7edcf4ca1d6f0b4c9c179ace4df\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32vec2</b></td></tr>\n<tr class=\"memdesc:a66d3a7edcf4ca1d6f0b4c9c179ace4df\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#a66d3a7edcf4ca1d6f0b4c9c179ace4df\">More...</a><br /></td></tr>\n<tr class=\"separator:a66d3a7edcf4ca1d6f0b4c9c179ace4df\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a68d4fd775456fdf828b4f39bc51ec8fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32vec3</b></td></tr>\n<tr class=\"memdesc:a68d4fd775456fdf828b4f39bc51ec8fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#a68d4fd775456fdf828b4f39bc51ec8fd\">More...</a><br /></td></tr>\n<tr class=\"separator:a68d4fd775456fdf828b4f39bc51ec8fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a9f4fc7d01a3fcc08d852313acecafef6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f32vec4</b></td></tr>\n<tr class=\"memdesc:a9f4fc7d01a3fcc08d852313acecafef6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#a9f4fc7d01a3fcc08d852313acecafef6\">More...</a><br /></td></tr>\n<tr class=\"separator:a9f4fc7d01a3fcc08d852313acecafef6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abc7a97c07cbfac8e35eb5e63beb4b679\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64</b></td></tr>\n<tr class=\"memdesc:abc7a97c07cbfac8e35eb5e63beb4b679\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#abc7a97c07cbfac8e35eb5e63beb4b679\">More...</a><br /></td></tr>\n<tr class=\"separator:abc7a97c07cbfac8e35eb5e63beb4b679\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:afc730f6b4242763b0eda0ffa25150292\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_f64mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat2</b></td></tr>\n<tr class=\"memdesc:afc730f6b4242763b0eda0ffa25150292\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#afc730f6b4242763b0eda0ffa25150292\">More...</a><br /></td></tr>\n<tr class=\"separator:afc730f6b4242763b0eda0ffa25150292\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8da424a27e4a704eff36d61acd38ff3d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat2x2</b></td></tr>\n<tr class=\"memdesc:a8da424a27e4a704eff36d61acd38ff3d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a8da424a27e4a704eff36d61acd38ff3d\">More...</a><br /></td></tr>\n<tr class=\"separator:a8da424a27e4a704eff36d61acd38ff3d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a634f50bac052cc4841a4a8c15fbf4f8f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat2x3</b></td></tr>\n<tr class=\"memdesc:a634f50bac052cc4841a4a8c15fbf4f8f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#a634f50bac052cc4841a4a8c15fbf4f8f\">More...</a><br /></td></tr>\n<tr class=\"separator:a634f50bac052cc4841a4a8c15fbf4f8f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab7a37ec55da975a17bc65b15664dcea3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat2x4</b></td></tr>\n<tr class=\"memdesc:ab7a37ec55da975a17bc65b15664dcea3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#ab7a37ec55da975a17bc65b15664dcea3\">More...</a><br /></td></tr>\n<tr class=\"separator:ab7a37ec55da975a17bc65b15664dcea3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a58119a41d143ebaea0df70fe882e8a40\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_f64mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat3</b></td></tr>\n<tr class=\"memdesc:a58119a41d143ebaea0df70fe882e8a40\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a58119a41d143ebaea0df70fe882e8a40\">More...</a><br /></td></tr>\n<tr class=\"separator:a58119a41d143ebaea0df70fe882e8a40\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a662de5955d14e3dda31c64c4b9addcbd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat3x2</b></td></tr>\n<tr class=\"memdesc:a662de5955d14e3dda31c64c4b9addcbd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#a662de5955d14e3dda31c64c4b9addcbd\">More...</a><br /></td></tr>\n<tr class=\"separator:a662de5955d14e3dda31c64c4b9addcbd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab276acb1d3dc5686943dc826a3f9b9c6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat3x3</b></td></tr>\n<tr class=\"memdesc:ab276acb1d3dc5686943dc826a3f9b9c6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#ab276acb1d3dc5686943dc826a3f9b9c6\">More...</a><br /></td></tr>\n<tr class=\"separator:ab276acb1d3dc5686943dc826a3f9b9c6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aad195a0fc8433c5466df25ae8e89bbd7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat3x4</b></td></tr>\n<tr class=\"memdesc:aad195a0fc8433c5466df25ae8e89bbd7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#aad195a0fc8433c5466df25ae8e89bbd7\">More...</a><br /></td></tr>\n<tr class=\"separator:aad195a0fc8433c5466df25ae8e89bbd7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7451266e67794bd1125163502bc4a570\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_f64mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat4</b></td></tr>\n<tr class=\"memdesc:a7451266e67794bd1125163502bc4a570\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a7451266e67794bd1125163502bc4a570\">More...</a><br /></td></tr>\n<tr class=\"separator:a7451266e67794bd1125163502bc4a570\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:acbac8a2ba10d431a7ed30a0cd1396163\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat4x2</b></td></tr>\n<tr class=\"memdesc:acbac8a2ba10d431a7ed30a0cd1396163\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#acbac8a2ba10d431a7ed30a0cd1396163\">More...</a><br /></td></tr>\n<tr class=\"separator:acbac8a2ba10d431a7ed30a0cd1396163\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7cd8056a1a906335b8fe72a3b5aa6b5e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat4x3</b></td></tr>\n<tr class=\"memdesc:a7cd8056a1a906335b8fe72a3b5aa6b5e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#a7cd8056a1a906335b8fe72a3b5aa6b5e\">More...</a><br /></td></tr>\n<tr class=\"separator:a7cd8056a1a906335b8fe72a3b5aa6b5e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a312e176eb6a38c65fc8d52b24b65bd2e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64mat4x4</b></td></tr>\n<tr class=\"memdesc:a312e176eb6a38c65fc8d52b24b65bd2e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a312e176eb6a38c65fc8d52b24b65bd2e\">More...</a><br /></td></tr>\n<tr class=\"separator:a312e176eb6a38c65fc8d52b24b65bd2e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac1a96856970fd9b3dfb5a57146ee9de7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64quat</b></td></tr>\n<tr class=\"memdesc:ac1a96856970fd9b3dfb5a57146ee9de7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point quaternion.  <a href=\"a00135.html#ac1a96856970fd9b3dfb5a57146ee9de7\">More...</a><br /></td></tr>\n<tr class=\"separator:ac1a96856970fd9b3dfb5a57146ee9de7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5dc903b9b566c4c2cdcba25565ac2439\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64vec1</b></td></tr>\n<tr class=\"memdesc:a5dc903b9b566c4c2cdcba25565ac2439\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#a5dc903b9b566c4c2cdcba25565ac2439\">More...</a><br /></td></tr>\n<tr class=\"separator:a5dc903b9b566c4c2cdcba25565ac2439\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aece02105465aab2993c70e3b3c04014f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64vec2</b></td></tr>\n<tr class=\"memdesc:aece02105465aab2993c70e3b3c04014f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#aece02105465aab2993c70e3b3c04014f\">More...</a><br /></td></tr>\n<tr class=\"separator:aece02105465aab2993c70e3b3c04014f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5e80303fbacdc40dfbda63cb13219e81\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64vec3</b></td></tr>\n<tr class=\"memdesc:a5e80303fbacdc40dfbda63cb13219e81\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#a5e80303fbacdc40dfbda63cb13219e81\">More...</a><br /></td></tr>\n<tr class=\"separator:a5e80303fbacdc40dfbda63cb13219e81\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:afff858dc0711ac913df6768b29dac8c8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, f64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_f64vec4</b></td></tr>\n<tr class=\"memdesc:afff858dc0711ac913df6768b29dac8c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low double-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#afff858dc0711ac913df6768b29dac8c8\">More...</a><br /></td></tr>\n<tr class=\"separator:afff858dc0711ac913df6768b29dac8c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8234cea5c12583310da0fdfe62657638\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_float32</b></td></tr>\n<tr class=\"memdesc:a8234cea5c12583310da0fdfe62657638\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#a8234cea5c12583310da0fdfe62657638\">More...</a><br /></td></tr>\n<tr class=\"separator:a8234cea5c12583310da0fdfe62657638\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7a32491c689d3ff33652770868187f27\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_float32_t</b></td></tr>\n<tr class=\"memdesc:a7a32491c689d3ff33652770868187f27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#a7a32491c689d3ff33652770868187f27\">More...</a><br /></td></tr>\n<tr class=\"separator:a7a32491c689d3ff33652770868187f27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a60503f200138a07e57c737abfa57f5f6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_float64</b></td></tr>\n<tr class=\"memdesc:a60503f200138a07e57c737abfa57f5f6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#a60503f200138a07e57c737abfa57f5f6\">More...</a><br /></td></tr>\n<tr class=\"separator:a60503f200138a07e57c737abfa57f5f6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a49a3b5a4f1565687927b5edb23f0b35e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_float64_t</b></td></tr>\n<tr class=\"memdesc:a49a3b5a4f1565687927b5edb23f0b35e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#a49a3b5a4f1565687927b5edb23f0b35e\">More...</a><br /></td></tr>\n<tr class=\"separator:a49a3b5a4f1565687927b5edb23f0b35e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5bba0ce31210e274f73efacd3364c03f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_fmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat2</b></td></tr>\n<tr class=\"memdesc:a5bba0ce31210e274f73efacd3364c03f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a5bba0ce31210e274f73efacd3364c03f\">More...</a><br /></td></tr>\n<tr class=\"separator:a5bba0ce31210e274f73efacd3364c03f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad0248be06c3db6cd726ddae65b35d0c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat2x2</b></td></tr>\n<tr class=\"memdesc:ad0248be06c3db6cd726ddae65b35d0c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#ad0248be06c3db6cd726ddae65b35d0c9\">More...</a><br /></td></tr>\n<tr class=\"separator:ad0248be06c3db6cd726ddae65b35d0c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8ab377ba382b3bf58c1e78400da2ebfa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat2x3</b></td></tr>\n<tr class=\"memdesc:a8ab377ba382b3bf58c1e78400da2ebfa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#a8ab377ba382b3bf58c1e78400da2ebfa\">More...</a><br /></td></tr>\n<tr class=\"separator:a8ab377ba382b3bf58c1e78400da2ebfa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2dd4bea030deae0d1a17b5126c639e95\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat2x4</b></td></tr>\n<tr class=\"memdesc:a2dd4bea030deae0d1a17b5126c639e95\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#a2dd4bea030deae0d1a17b5126c639e95\">More...</a><br /></td></tr>\n<tr class=\"separator:a2dd4bea030deae0d1a17b5126c639e95\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a83079315e230e8f39728f4bf0d2f9a9b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_fmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat3</b></td></tr>\n<tr class=\"memdesc:a83079315e230e8f39728f4bf0d2f9a9b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a83079315e230e8f39728f4bf0d2f9a9b\">More...</a><br /></td></tr>\n<tr class=\"separator:a83079315e230e8f39728f4bf0d2f9a9b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7ca8774bb56c621a00465a01ed5c382a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat3x2</b></td></tr>\n<tr class=\"memdesc:a7ca8774bb56c621a00465a01ed5c382a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#a7ca8774bb56c621a00465a01ed5c382a\">More...</a><br /></td></tr>\n<tr class=\"separator:a7ca8774bb56c621a00465a01ed5c382a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac50cc5f75cddb8b5f814322825a786e2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat3x3</b></td></tr>\n<tr class=\"memdesc:ac50cc5f75cddb8b5f814322825a786e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#ac50cc5f75cddb8b5f814322825a786e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ac50cc5f75cddb8b5f814322825a786e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5a46b17968e56089f3ff9e62575aee11\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat3x4</b></td></tr>\n<tr class=\"memdesc:a5a46b17968e56089f3ff9e62575aee11\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#a5a46b17968e56089f3ff9e62575aee11\">More...</a><br /></td></tr>\n<tr class=\"separator:a5a46b17968e56089f3ff9e62575aee11\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5803cb9ae26399762d8bba9e0b2fc09f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_fmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat4</b></td></tr>\n<tr class=\"memdesc:a5803cb9ae26399762d8bba9e0b2fc09f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a5803cb9ae26399762d8bba9e0b2fc09f\">More...</a><br /></td></tr>\n<tr class=\"separator:a5803cb9ae26399762d8bba9e0b2fc09f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab420ff09c2bd9617cbc8d84439a83401\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat4x2</b></td></tr>\n<tr class=\"memdesc:ab420ff09c2bd9617cbc8d84439a83401\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#ab420ff09c2bd9617cbc8d84439a83401\">More...</a><br /></td></tr>\n<tr class=\"separator:ab420ff09c2bd9617cbc8d84439a83401\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af8be28c95a9c85574551d1a41c371127\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat4x3</b></td></tr>\n<tr class=\"memdesc:af8be28c95a9c85574551d1a41c371127\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#af8be28c95a9c85574551d1a41c371127\">More...</a><br /></td></tr>\n<tr class=\"separator:af8be28c95a9c85574551d1a41c371127\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2b018ddd2e449839dcd13f80fafbfc6a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fmat4x4</b></td></tr>\n<tr class=\"memdesc:a2b018ddd2e449839dcd13f80fafbfc6a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a2b018ddd2e449839dcd13f80fafbfc6a\">More...</a><br /></td></tr>\n<tr class=\"separator:a2b018ddd2e449839dcd13f80fafbfc6a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:afc9fc7b43c89cb6d7c989d427c3ec5a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fquat</b></td></tr>\n<tr class=\"memdesc:afc9fc7b43c89cb6d7c989d427c3ec5a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of low single-qualifier floating-point numbers.  <a href=\"a00135.html#afc9fc7b43c89cb6d7c989d427c3ec5a3\">More...</a><br /></td></tr>\n<tr class=\"separator:afc9fc7b43c89cb6d7c989d427c3ec5a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:adee31daa260d175eced78e419ea8c116\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fvec1</b></td></tr>\n<tr class=\"memdesc:adee31daa260d175eced78e419ea8c116\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#adee31daa260d175eced78e419ea8c116\">More...</a><br /></td></tr>\n<tr class=\"separator:adee31daa260d175eced78e419ea8c116\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a07d55c4d852e8c3ddc6135d5268a6fa3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fvec2</b></td></tr>\n<tr class=\"memdesc:a07d55c4d852e8c3ddc6135d5268a6fa3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#a07d55c4d852e8c3ddc6135d5268a6fa3\">More...</a><br /></td></tr>\n<tr class=\"separator:a07d55c4d852e8c3ddc6135d5268a6fa3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa7a8bc9a5602fc27a44e293dd38232aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fvec3</b></td></tr>\n<tr class=\"memdesc:aa7a8bc9a5602fc27a44e293dd38232aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#aa7a8bc9a5602fc27a44e293dd38232aa\">More...</a><br /></td></tr>\n<tr class=\"separator:aa7a8bc9a5602fc27a44e293dd38232aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a147b798529b1bfaa2363c7fe0500b1fa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_fvec4</b></td></tr>\n<tr class=\"memdesc:a147b798529b1bfaa2363c7fe0500b1fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#a147b798529b1bfaa2363c7fe0500b1fa\">More...</a><br /></td></tr>\n<tr class=\"separator:a147b798529b1bfaa2363c7fe0500b1fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga392b673fd10847bfb78fb808c6cf8ff7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">lowp_i16</a></td></tr>\n<tr class=\"memdesc:ga392b673fd10847bfb78fb808c6cf8ff7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga392b673fd10847bfb78fb808c6cf8ff7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a35cb450097c8652846300c642e070aaf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i16, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i16vec1</b></td></tr>\n<tr class=\"memdesc:a35cb450097c8652846300c642e070aaf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer scalar type.  <a href=\"a00135.html#a35cb450097c8652846300c642e070aaf\">More...</a><br /></td></tr>\n<tr class=\"separator:a35cb450097c8652846300c642e070aaf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab6fda34d0a5b09db70cab79e976795b2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i16, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i16vec2</b></td></tr>\n<tr class=\"memdesc:ab6fda34d0a5b09db70cab79e976795b2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer vector of 2 components type.  <a href=\"a00135.html#ab6fda34d0a5b09db70cab79e976795b2\">More...</a><br /></td></tr>\n<tr class=\"separator:ab6fda34d0a5b09db70cab79e976795b2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a619898d016b130dc8c4fcc8ded124394\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i16, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i16vec3</b></td></tr>\n<tr class=\"memdesc:a619898d016b130dc8c4fcc8ded124394\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer vector of 3 components type.  <a href=\"a00135.html#a619898d016b130dc8c4fcc8ded124394\">More...</a><br /></td></tr>\n<tr class=\"separator:a619898d016b130dc8c4fcc8ded124394\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac37e170379114ec188266e006d5cb6ba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i16, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i16vec4</b></td></tr>\n<tr class=\"memdesc:ac37e170379114ec188266e006d5cb6ba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer vector of 4 components type.  <a href=\"a00135.html#ac37e170379114ec188266e006d5cb6ba\">More...</a><br /></td></tr>\n<tr class=\"separator:ac37e170379114ec188266e006d5cb6ba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">lowp_i32</a></td></tr>\n<tr class=\"memdesc:ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae31ac3608cf643ceffd6554874bec4a0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i32vec1</b></td></tr>\n<tr class=\"memdesc:ae31ac3608cf643ceffd6554874bec4a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer scalar type.  <a href=\"a00135.html#ae31ac3608cf643ceffd6554874bec4a0\">More...</a><br /></td></tr>\n<tr class=\"separator:ae31ac3608cf643ceffd6554874bec4a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a867a3c2d99ab369a454167d2c0a24dbd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i32vec2</b></td></tr>\n<tr class=\"memdesc:a867a3c2d99ab369a454167d2c0a24dbd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer vector of 2 components type.  <a href=\"a00135.html#a867a3c2d99ab369a454167d2c0a24dbd\">More...</a><br /></td></tr>\n<tr class=\"separator:a867a3c2d99ab369a454167d2c0a24dbd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5fe17c87ede1b1b4d92454cff4da076d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i32vec3</b></td></tr>\n<tr class=\"memdesc:a5fe17c87ede1b1b4d92454cff4da076d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer vector of 3 components type.  <a href=\"a00135.html#a5fe17c87ede1b1b4d92454cff4da076d\">More...</a><br /></td></tr>\n<tr class=\"separator:a5fe17c87ede1b1b4d92454cff4da076d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac9b2eb4296ffe50a32eacca9ed932c08\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i32vec4</b></td></tr>\n<tr class=\"memdesc:ac9b2eb4296ffe50a32eacca9ed932c08\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer vector of 4 components type.  <a href=\"a00135.html#ac9b2eb4296ffe50a32eacca9ed932c08\">More...</a><br /></td></tr>\n<tr class=\"separator:ac9b2eb4296ffe50a32eacca9ed932c08\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga354736e0c645099cd44c42fb2f87c2b8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">lowp_i64</a></td></tr>\n<tr class=\"memdesc:ga354736e0c645099cd44c42fb2f87c2b8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga354736e0c645099cd44c42fb2f87c2b8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af1db4c5bca68e72a3e8403482bf22389\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i64vec1</b></td></tr>\n<tr class=\"memdesc:af1db4c5bca68e72a3e8403482bf22389\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer scalar type.  <a href=\"a00135.html#af1db4c5bca68e72a3e8403482bf22389\">More...</a><br /></td></tr>\n<tr class=\"separator:af1db4c5bca68e72a3e8403482bf22389\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a189430fffe882d6bb7bc66446e04b4e8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i64vec2</b></td></tr>\n<tr class=\"memdesc:a189430fffe882d6bb7bc66446e04b4e8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer vector of 2 components type.  <a href=\"a00135.html#a189430fffe882d6bb7bc66446e04b4e8\">More...</a><br /></td></tr>\n<tr class=\"separator:a189430fffe882d6bb7bc66446e04b4e8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5a4f12b0fe908c63e77e6f98a0b8b4db\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i64vec3</b></td></tr>\n<tr class=\"memdesc:a5a4f12b0fe908c63e77e6f98a0b8b4db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer vector of 3 components type.  <a href=\"a00135.html#a5a4f12b0fe908c63e77e6f98a0b8b4db\">More...</a><br /></td></tr>\n<tr class=\"separator:a5a4f12b0fe908c63e77e6f98a0b8b4db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad372f2c3baa924502eeb0f675515d859\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i64vec4</b></td></tr>\n<tr class=\"memdesc:ad372f2c3baa924502eeb0f675515d859\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer vector of 4 components type.  <a href=\"a00135.html#ad372f2c3baa924502eeb0f675515d859\">More...</a><br /></td></tr>\n<tr class=\"separator:ad372f2c3baa924502eeb0f675515d859\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga552a6bde5e75984efb0f863278da2e54\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">lowp_i8</a></td></tr>\n<tr class=\"memdesc:ga552a6bde5e75984efb0f863278da2e54\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">More...</a><br /></td></tr>\n<tr class=\"separator:ga552a6bde5e75984efb0f863278da2e54\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a403069ab1bb1711206c2e0a7da8bab4b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i8, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i8vec1</b></td></tr>\n<tr class=\"memdesc:a403069ab1bb1711206c2e0a7da8bab4b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer scalar type.  <a href=\"a00135.html#a403069ab1bb1711206c2e0a7da8bab4b\">More...</a><br /></td></tr>\n<tr class=\"separator:a403069ab1bb1711206c2e0a7da8bab4b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab541aabe4f924d61dccdccdb7174dff6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i8, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i8vec2</b></td></tr>\n<tr class=\"memdesc:ab541aabe4f924d61dccdccdb7174dff6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer vector of 2 components type.  <a href=\"a00135.html#ab541aabe4f924d61dccdccdb7174dff6\">More...</a><br /></td></tr>\n<tr class=\"separator:ab541aabe4f924d61dccdccdb7174dff6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a9bcafcae06b23b1cdff3496fc29c8e08\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i8, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i8vec3</b></td></tr>\n<tr class=\"memdesc:a9bcafcae06b23b1cdff3496fc29c8e08\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer vector of 3 components type.  <a href=\"a00135.html#a9bcafcae06b23b1cdff3496fc29c8e08\">More...</a><br /></td></tr>\n<tr class=\"separator:a9bcafcae06b23b1cdff3496fc29c8e08\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8520d6344ca31c77b33a187b34751e46\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i8, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_i8vec4</b></td></tr>\n<tr class=\"memdesc:a8520d6344ca31c77b33a187b34751e46\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer vector of 4 components type.  <a href=\"a00135.html#a8520d6344ca31c77b33a187b34751e46\">More...</a><br /></td></tr>\n<tr class=\"separator:a8520d6344ca31c77b33a187b34751e46\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga698e36b01167fc0f037889334dce8def\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">lowp_int16</a></td></tr>\n<tr class=\"memdesc:ga698e36b01167fc0f037889334dce8def\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">More...</a><br /></td></tr>\n<tr class=\"separator:ga698e36b01167fc0f037889334dce8def\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b2cd8d31eb345b2d641d9261c38db1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">lowp_int16_t</a></td></tr>\n<tr class=\"memdesc:ga8b2cd8d31eb345b2d641d9261c38db1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b2cd8d31eb345b2d641d9261c38db1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga864aabca5f3296e176e0c3ed9cc16b02\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">lowp_int32</a></td></tr>\n<tr class=\"memdesc:ga864aabca5f3296e176e0c3ed9cc16b02\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">More...</a><br /></td></tr>\n<tr class=\"separator:ga864aabca5f3296e176e0c3ed9cc16b02\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0350631d35ff800e6133ac6243b13cbc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">lowp_int32_t</a></td></tr>\n<tr class=\"memdesc:ga0350631d35ff800e6133ac6243b13cbc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0350631d35ff800e6133ac6243b13cbc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf645b1a60203b39c0207baff5e3d8c3c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">lowp_int64</a></td></tr>\n<tr class=\"memdesc:gaf645b1a60203b39c0207baff5e3d8c3c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer type.  <a href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf645b1a60203b39c0207baff5e3d8c3c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebf341fc4a5be233f7dde962c2e33847\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">lowp_int64_t</a></td></tr>\n<tr class=\"memdesc:gaebf341fc4a5be233f7dde962c2e33847\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer type.  <a href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebf341fc4a5be233f7dde962c2e33847\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga760bcf26fdb23a2c3ecad3c928a19ae6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">lowp_int8</a></td></tr>\n<tr class=\"memdesc:ga760bcf26fdb23a2c3ecad3c928a19ae6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga760bcf26fdb23a2c3ecad3c928a19ae6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga119c41d73fe9977358174eb3ac1035a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">lowp_int8_t</a></td></tr>\n<tr class=\"memdesc:ga119c41d73fe9977358174eb3ac1035a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga119c41d73fe9977358174eb3ac1035a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa2d7af2016aba4edc1a14fed266317d2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_quat</b></td></tr>\n<tr class=\"memdesc:aa2d7af2016aba4edc1a14fed266317d2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of low single-qualifier floating-point numbers.  <a href=\"a00135.html#aa2d7af2016aba4edc1a14fed266317d2\">More...</a><br /></td></tr>\n<tr class=\"separator:aa2d7af2016aba4edc1a14fed266317d2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga504ce1631cb2ac02fcf1d44d8c2aa126\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">lowp_u16</a></td></tr>\n<tr class=\"memdesc:ga504ce1631cb2ac02fcf1d44d8c2aa126\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">More...</a><br /></td></tr>\n<tr class=\"separator:ga504ce1631cb2ac02fcf1d44d8c2aa126\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad53275e220d2108ea76330a799fd59fb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u16, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u16vec1</b></td></tr>\n<tr class=\"memdesc:ad53275e220d2108ea76330a799fd59fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer scalar type.  <a href=\"a00135.html#ad53275e220d2108ea76330a799fd59fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ad53275e220d2108ea76330a799fd59fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae76a0c47f57ae07f6adc6b710a89d514\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u16, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u16vec2</b></td></tr>\n<tr class=\"memdesc:ae76a0c47f57ae07f6adc6b710a89d514\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#ae76a0c47f57ae07f6adc6b710a89d514\">More...</a><br /></td></tr>\n<tr class=\"separator:ae76a0c47f57ae07f6adc6b710a89d514\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a96fc32abfbed164a93570de97e8ed4c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u16, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u16vec3</b></td></tr>\n<tr class=\"memdesc:a96fc32abfbed164a93570de97e8ed4c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#a96fc32abfbed164a93570de97e8ed4c9\">More...</a><br /></td></tr>\n<tr class=\"separator:a96fc32abfbed164a93570de97e8ed4c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:affb7f1d89d4ce9e98af052839832c25f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u16, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u16vec4</b></td></tr>\n<tr class=\"memdesc:affb7f1d89d4ce9e98af052839832c25f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#affb7f1d89d4ce9e98af052839832c25f\">More...</a><br /></td></tr>\n<tr class=\"separator:affb7f1d89d4ce9e98af052839832c25f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f072ada9552e1e480bbb3b1acde5250\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">lowp_u32</a></td></tr>\n<tr class=\"memdesc:ga4f072ada9552e1e480bbb3b1acde5250\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f072ada9552e1e480bbb3b1acde5250\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abed3be8dfdc4a0df4bf3271dbd7344c4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u32vec1</b></td></tr>\n<tr class=\"memdesc:abed3be8dfdc4a0df4bf3271dbd7344c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer scalar type.  <a href=\"a00135.html#abed3be8dfdc4a0df4bf3271dbd7344c4\">More...</a><br /></td></tr>\n<tr class=\"separator:abed3be8dfdc4a0df4bf3271dbd7344c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af7e286e81347011e257ee779524e73b9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u32vec2</b></td></tr>\n<tr class=\"memdesc:af7e286e81347011e257ee779524e73b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#af7e286e81347011e257ee779524e73b9\">More...</a><br /></td></tr>\n<tr class=\"separator:af7e286e81347011e257ee779524e73b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad3ad390560a671b1f676fbf03cd3aa15\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u32vec3</b></td></tr>\n<tr class=\"memdesc:ad3ad390560a671b1f676fbf03cd3aa15\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#ad3ad390560a671b1f676fbf03cd3aa15\">More...</a><br /></td></tr>\n<tr class=\"separator:ad3ad390560a671b1f676fbf03cd3aa15\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4502885718742aa238c36a312c3f3f20\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u32, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u32vec4</b></td></tr>\n<tr class=\"memdesc:a4502885718742aa238c36a312c3f3f20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a4502885718742aa238c36a312c3f3f20\">More...</a><br /></td></tr>\n<tr class=\"separator:a4502885718742aa238c36a312c3f3f20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30069d1f02b19599cbfadf98c23ac6ed\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">lowp_u64</a></td></tr>\n<tr class=\"memdesc:ga30069d1f02b19599cbfadf98c23ac6ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30069d1f02b19599cbfadf98c23ac6ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:acafbb652cc39ca82894d031f804a098e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u64vec1</b></td></tr>\n<tr class=\"memdesc:acafbb652cc39ca82894d031f804a098e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer scalar type.  <a href=\"a00135.html#acafbb652cc39ca82894d031f804a098e\">More...</a><br /></td></tr>\n<tr class=\"separator:acafbb652cc39ca82894d031f804a098e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab55e3c00b02e94ea3ee2b05c11f76bec\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u64vec2</b></td></tr>\n<tr class=\"memdesc:ab55e3c00b02e94ea3ee2b05c11f76bec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#ab55e3c00b02e94ea3ee2b05c11f76bec\">More...</a><br /></td></tr>\n<tr class=\"separator:ab55e3c00b02e94ea3ee2b05c11f76bec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:afd28c50babd185bc781463d8f45230e2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u64vec3</b></td></tr>\n<tr class=\"memdesc:afd28c50babd185bc781463d8f45230e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#afd28c50babd185bc781463d8f45230e2\">More...</a><br /></td></tr>\n<tr class=\"separator:afd28c50babd185bc781463d8f45230e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ade060f834fd7fec401f16851a3b75aa4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u64, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u64vec4</b></td></tr>\n<tr class=\"memdesc:ade060f834fd7fec401f16851a3b75aa4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#ade060f834fd7fec401f16851a3b75aa4\">More...</a><br /></td></tr>\n<tr class=\"separator:ade060f834fd7fec401f16851a3b75aa4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b09f03da7ac43055c68a349d5445083\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">lowp_u8</a></td></tr>\n<tr class=\"memdesc:ga1b09f03da7ac43055c68a349d5445083\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b09f03da7ac43055c68a349d5445083\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a3399832fb958accfbd8c7e15503e366b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u8, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u8vec1</b></td></tr>\n<tr class=\"memdesc:a3399832fb958accfbd8c7e15503e366b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer scalar type.  <a href=\"a00135.html#a3399832fb958accfbd8c7e15503e366b\">More...</a><br /></td></tr>\n<tr class=\"separator:a3399832fb958accfbd8c7e15503e366b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aebda17b8d59bc45298eecf81b9b82804\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u8, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u8vec2</b></td></tr>\n<tr class=\"memdesc:aebda17b8d59bc45298eecf81b9b82804\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#aebda17b8d59bc45298eecf81b9b82804\">More...</a><br /></td></tr>\n<tr class=\"separator:aebda17b8d59bc45298eecf81b9b82804\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6c21b07a951dbc0645922ca85947818a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u8, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u8vec3</b></td></tr>\n<tr class=\"memdesc:a6c21b07a951dbc0645922ca85947818a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#a6c21b07a951dbc0645922ca85947818a\">More...</a><br /></td></tr>\n<tr class=\"separator:a6c21b07a951dbc0645922ca85947818a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a3804ccaad2675aaa2aaf97bc0feb2766\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u8, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_u8vec4</b></td></tr>\n<tr class=\"memdesc:a3804ccaad2675aaa2aaf97bc0feb2766\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a3804ccaad2675aaa2aaf97bc0feb2766\">More...</a><br /></td></tr>\n<tr class=\"separator:a3804ccaad2675aaa2aaf97bc0feb2766\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad68bfd9f881856fc863a6ebca0b67f78\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">lowp_uint16</a></td></tr>\n<tr class=\"memdesc:gad68bfd9f881856fc863a6ebca0b67f78\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">More...</a><br /></td></tr>\n<tr class=\"separator:gad68bfd9f881856fc863a6ebca0b67f78\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91c4815f93177eb423362fd296a87e9f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">lowp_uint16_t</a></td></tr>\n<tr class=\"memdesc:ga91c4815f93177eb423362fd296a87e9f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91c4815f93177eb423362fd296a87e9f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa6a5b461bbf5fe20982472aa51896d4b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">lowp_uint32</a></td></tr>\n<tr class=\"memdesc:gaa6a5b461bbf5fe20982472aa51896d4b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa6a5b461bbf5fe20982472aa51896d4b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf1b735b4b1145174f4e4167d13778f9b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">lowp_uint32_t</a></td></tr>\n<tr class=\"memdesc:gaf1b735b4b1145174f4e4167d13778f9b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf1b735b4b1145174f4e4167d13778f9b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa212b805736a759998e312cbdd550fae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">lowp_uint64</a></td></tr>\n<tr class=\"memdesc:gaa212b805736a759998e312cbdd550fae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa212b805736a759998e312cbdd550fae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8dd3a3281ae5c970ffe0c41d538aa153\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">lowp_uint64_t</a></td></tr>\n<tr class=\"memdesc:ga8dd3a3281ae5c970ffe0c41d538aa153\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8dd3a3281ae5c970ffe0c41d538aa153\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf49470869e9be2c059629b250619804e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">lowp_uint8</a></td></tr>\n<tr class=\"memdesc:gaf49470869e9be2c059629b250619804e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf49470869e9be2c059629b250619804e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga667b2ece2b258be898812dc2177995d1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">lowp_uint8_t</a></td></tr>\n<tr class=\"memdesc:ga667b2ece2b258be898812dc2177995d1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga667b2ece2b258be898812dc2177995d1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8931ec76b5c0c310ed8d96dfdeb6b4c1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_vec1</b></td></tr>\n<tr class=\"memdesc:a8931ec76b5c0c310ed8d96dfdeb6b4c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#a8931ec76b5c0c310ed8d96dfdeb6b4c1\">More...</a><br /></td></tr>\n<tr class=\"separator:a8931ec76b5c0c310ed8d96dfdeb6b4c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a51178c7b0d10cc540c01ad4cf0ece261\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_dquat</b></td></tr>\n<tr class=\"memdesc:a51178c7b0d10cc540c01ad4cf0ece261\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of medium double-qualifier floating-point numbers.  <a href=\"a00135.html#a51178c7b0d10cc540c01ad4cf0ece261\">More...</a><br /></td></tr>\n<tr class=\"separator:a51178c7b0d10cc540c01ad4cf0ece261\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a3b27fcd9eaa2757f0aaf6b0ce0d85c80\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32</b></td></tr>\n<tr class=\"memdesc:a3b27fcd9eaa2757f0aaf6b0ce0d85c80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#a3b27fcd9eaa2757f0aaf6b0ce0d85c80\">More...</a><br /></td></tr>\n<tr class=\"separator:a3b27fcd9eaa2757f0aaf6b0ce0d85c80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af9020c6176a75bc84828ab01ea7dac25\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat2</b></td></tr>\n<tr class=\"memdesc:af9020c6176a75bc84828ab01ea7dac25\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#af9020c6176a75bc84828ab01ea7dac25\">More...</a><br /></td></tr>\n<tr class=\"separator:af9020c6176a75bc84828ab01ea7dac25\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8601f26dc9d639059563cb4ad868d346\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat2x2</b></td></tr>\n<tr class=\"memdesc:a8601f26dc9d639059563cb4ad868d346\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a8601f26dc9d639059563cb4ad868d346\">More...</a><br /></td></tr>\n<tr class=\"separator:a8601f26dc9d639059563cb4ad868d346\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a49908fb344d849e6980b39945cde7cac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat2x3</b></td></tr>\n<tr class=\"memdesc:a49908fb344d849e6980b39945cde7cac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#a49908fb344d849e6980b39945cde7cac\">More...</a><br /></td></tr>\n<tr class=\"separator:a49908fb344d849e6980b39945cde7cac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aacdb838204129f0701fe237c5273a190\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat2x4</b></td></tr>\n<tr class=\"memdesc:aacdb838204129f0701fe237c5273a190\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#aacdb838204129f0701fe237c5273a190\">More...</a><br /></td></tr>\n<tr class=\"separator:aacdb838204129f0701fe237c5273a190\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aaaf878d0d7bfc0aac054fe269a886ca8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat3</b></td></tr>\n<tr class=\"memdesc:aaaf878d0d7bfc0aac054fe269a886ca8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#aaaf878d0d7bfc0aac054fe269a886ca8\">More...</a><br /></td></tr>\n<tr class=\"separator:aaaf878d0d7bfc0aac054fe269a886ca8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7bc7f96ebdae827f5df8d4909f17aff3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat3x2</b></td></tr>\n<tr class=\"memdesc:a7bc7f96ebdae827f5df8d4909f17aff3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#a7bc7f96ebdae827f5df8d4909f17aff3\">More...</a><br /></td></tr>\n<tr class=\"separator:a7bc7f96ebdae827f5df8d4909f17aff3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab0044a58b49b729dd4c1841b5a892492\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat3x3</b></td></tr>\n<tr class=\"memdesc:ab0044a58b49b729dd4c1841b5a892492\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#ab0044a58b49b729dd4c1841b5a892492\">More...</a><br /></td></tr>\n<tr class=\"separator:ab0044a58b49b729dd4c1841b5a892492\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aaab9e12adba56314b568dc57d9c1c87e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat3x4</b></td></tr>\n<tr class=\"memdesc:aaab9e12adba56314b568dc57d9c1c87e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#aaab9e12adba56314b568dc57d9c1c87e\">More...</a><br /></td></tr>\n<tr class=\"separator:aaab9e12adba56314b568dc57d9c1c87e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4491baaebbc46a20f1cb5da985576bf4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat4</b></td></tr>\n<tr class=\"memdesc:a4491baaebbc46a20f1cb5da985576bf4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a4491baaebbc46a20f1cb5da985576bf4\">More...</a><br /></td></tr>\n<tr class=\"separator:a4491baaebbc46a20f1cb5da985576bf4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad35a931292a21b81940e68df3be90dba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat4x2</b></td></tr>\n<tr class=\"memdesc:ad35a931292a21b81940e68df3be90dba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#ad35a931292a21b81940e68df3be90dba\">More...</a><br /></td></tr>\n<tr class=\"separator:ad35a931292a21b81940e68df3be90dba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4522e3fdfd80a4aed258743b8023ef20\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat4x3</b></td></tr>\n<tr class=\"memdesc:a4522e3fdfd80a4aed258743b8023ef20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#a4522e3fdfd80a4aed258743b8023ef20\">More...</a><br /></td></tr>\n<tr class=\"separator:a4522e3fdfd80a4aed258743b8023ef20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ada44179ec7acc53ee8df79c3de445370\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32mat4x4</b></td></tr>\n<tr class=\"memdesc:ada44179ec7acc53ee8df79c3de445370\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#ada44179ec7acc53ee8df79c3de445370\">More...</a><br /></td></tr>\n<tr class=\"separator:ada44179ec7acc53ee8df79c3de445370\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abcc1b172969e868108974c92c09ba2e4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32quat</b></td></tr>\n<tr class=\"memdesc:abcc1b172969e868108974c92c09ba2e4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point quaternion.  <a href=\"a00135.html#abcc1b172969e868108974c92c09ba2e4\">More...</a><br /></td></tr>\n<tr class=\"separator:abcc1b172969e868108974c92c09ba2e4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab93f2db6d7ce00e1ec9f410a7ca1379e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32vec1</b></td></tr>\n<tr class=\"memdesc:ab93f2db6d7ce00e1ec9f410a7ca1379e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#ab93f2db6d7ce00e1ec9f410a7ca1379e\">More...</a><br /></td></tr>\n<tr class=\"separator:ab93f2db6d7ce00e1ec9f410a7ca1379e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a829f18ab648902bb03a702b5105a896b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32vec2</b></td></tr>\n<tr class=\"memdesc:a829f18ab648902bb03a702b5105a896b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#a829f18ab648902bb03a702b5105a896b\">More...</a><br /></td></tr>\n<tr class=\"separator:a829f18ab648902bb03a702b5105a896b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a33ab08e3a409b02a0a547440305227e5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32vec3</b></td></tr>\n<tr class=\"memdesc:a33ab08e3a409b02a0a547440305227e5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#a33ab08e3a409b02a0a547440305227e5\">More...</a><br /></td></tr>\n<tr class=\"separator:a33ab08e3a409b02a0a547440305227e5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5dd479c1facf7574e52beb109d9ae2fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f32vec4</b></td></tr>\n<tr class=\"memdesc:a5dd479c1facf7574e52beb109d9ae2fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#a5dd479c1facf7574e52beb109d9ae2fc\">More...</a><br /></td></tr>\n<tr class=\"separator:a5dd479c1facf7574e52beb109d9ae2fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6d40381d78472553f878f66e443feeef\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64</b></td></tr>\n<tr class=\"memdesc:a6d40381d78472553f878f66e443feeef\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#a6d40381d78472553f878f66e443feeef\">More...</a><br /></td></tr>\n<tr class=\"separator:a6d40381d78472553f878f66e443feeef\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac1281da5ded55047e8892b0e1f1ae965\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_f64mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat2</b></td></tr>\n<tr class=\"memdesc:ac1281da5ded55047e8892b0e1f1ae965\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#ac1281da5ded55047e8892b0e1f1ae965\">More...</a><br /></td></tr>\n<tr class=\"separator:ac1281da5ded55047e8892b0e1f1ae965\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac8acf86efc31ce88298c787fb7aa3749\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat2x2</b></td></tr>\n<tr class=\"memdesc:ac8acf86efc31ce88298c787fb7aa3749\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#ac8acf86efc31ce88298c787fb7aa3749\">More...</a><br /></td></tr>\n<tr class=\"separator:ac8acf86efc31ce88298c787fb7aa3749\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a1cd784e5f1c708ea2192c547456adbaa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat2x3</b></td></tr>\n<tr class=\"memdesc:a1cd784e5f1c708ea2192c547456adbaa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#a1cd784e5f1c708ea2192c547456adbaa\">More...</a><br /></td></tr>\n<tr class=\"separator:a1cd784e5f1c708ea2192c547456adbaa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a298b7ab316d307ef759c634fa969e437\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat2x4</b></td></tr>\n<tr class=\"memdesc:a298b7ab316d307ef759c634fa969e437\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#a298b7ab316d307ef759c634fa969e437\">More...</a><br /></td></tr>\n<tr class=\"separator:a298b7ab316d307ef759c634fa969e437\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad35fb67eb1d03c5a514f0bd7aed1c776\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_f64mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat3</b></td></tr>\n<tr class=\"memdesc:ad35fb67eb1d03c5a514f0bd7aed1c776\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#ad35fb67eb1d03c5a514f0bd7aed1c776\">More...</a><br /></td></tr>\n<tr class=\"separator:ad35fb67eb1d03c5a514f0bd7aed1c776\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4c579df19ee25f80729a3b86f288593a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat3x2</b></td></tr>\n<tr class=\"memdesc:a4c579df19ee25f80729a3b86f288593a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#a4c579df19ee25f80729a3b86f288593a\">More...</a><br /></td></tr>\n<tr class=\"separator:a4c579df19ee25f80729a3b86f288593a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a51cb322c98db6c7f0fda937ab16f9f45\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat3x3</b></td></tr>\n<tr class=\"memdesc:a51cb322c98db6c7f0fda937ab16f9f45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a51cb322c98db6c7f0fda937ab16f9f45\">More...</a><br /></td></tr>\n<tr class=\"separator:a51cb322c98db6c7f0fda937ab16f9f45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4f1a9b7b1276ea3c8dd8174f294976b5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat3x4</b></td></tr>\n<tr class=\"memdesc:a4f1a9b7b1276ea3c8dd8174f294976b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#a4f1a9b7b1276ea3c8dd8174f294976b5\">More...</a><br /></td></tr>\n<tr class=\"separator:a4f1a9b7b1276ea3c8dd8174f294976b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa805ef691c711dc41e2776cfb67f5cf5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_f64mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat4</b></td></tr>\n<tr class=\"memdesc:aa805ef691c711dc41e2776cfb67f5cf5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#aa805ef691c711dc41e2776cfb67f5cf5\">More...</a><br /></td></tr>\n<tr class=\"separator:aa805ef691c711dc41e2776cfb67f5cf5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a51b85884ddaeaee00873666251f91f24\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat4x2</b></td></tr>\n<tr class=\"memdesc:a51b85884ddaeaee00873666251f91f24\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#a51b85884ddaeaee00873666251f91f24\">More...</a><br /></td></tr>\n<tr class=\"separator:a51b85884ddaeaee00873666251f91f24\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a3d7653dfae1908d6fca566b4607c7a4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat4x3</b></td></tr>\n<tr class=\"memdesc:a3d7653dfae1908d6fca566b4607c7a4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#a3d7653dfae1908d6fca566b4607c7a4c\">More...</a><br /></td></tr>\n<tr class=\"separator:a3d7653dfae1908d6fca566b4607c7a4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6d49dfc1b3efe97d27130d986260693b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64mat4x4</b></td></tr>\n<tr class=\"memdesc:a6d49dfc1b3efe97d27130d986260693b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#a6d49dfc1b3efe97d27130d986260693b\">More...</a><br /></td></tr>\n<tr class=\"separator:a6d49dfc1b3efe97d27130d986260693b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a06275695b922e1b4f068379ee53d17f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64quat</b></td></tr>\n<tr class=\"memdesc:a06275695b922e1b4f068379ee53d17f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point quaternion.  <a href=\"a00135.html#a06275695b922e1b4f068379ee53d17f5\">More...</a><br /></td></tr>\n<tr class=\"separator:a06275695b922e1b4f068379ee53d17f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2f40029c92793ff37ec24281ef78e25b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64vec1</b></td></tr>\n<tr class=\"memdesc:a2f40029c92793ff37ec24281ef78e25b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#a2f40029c92793ff37ec24281ef78e25b\">More...</a><br /></td></tr>\n<tr class=\"separator:a2f40029c92793ff37ec24281ef78e25b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a45b5123aa081e584495670b4cef7b85f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64vec2</b></td></tr>\n<tr class=\"memdesc:a45b5123aa081e584495670b4cef7b85f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#a45b5123aa081e584495670b4cef7b85f\">More...</a><br /></td></tr>\n<tr class=\"separator:a45b5123aa081e584495670b4cef7b85f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a82e363c015a23c14a607a43920cf481a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64vec3</b></td></tr>\n<tr class=\"memdesc:a82e363c015a23c14a607a43920cf481a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#a82e363c015a23c14a607a43920cf481a\">More...</a><br /></td></tr>\n<tr class=\"separator:a82e363c015a23c14a607a43920cf481a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac546fa81b12a4086c8f01a96c9e37b75\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, f64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_f64vec4</b></td></tr>\n<tr class=\"memdesc:ac546fa81b12a4086c8f01a96c9e37b75\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium double-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#ac546fa81b12a4086c8f01a96c9e37b75\">More...</a><br /></td></tr>\n<tr class=\"separator:ac546fa81b12a4086c8f01a96c9e37b75\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a9a90f18a9d062cd5b8046cbb59ef7296\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_float32</b></td></tr>\n<tr class=\"memdesc:a9a90f18a9d062cd5b8046cbb59ef7296\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#a9a90f18a9d062cd5b8046cbb59ef7296\">More...</a><br /></td></tr>\n<tr class=\"separator:a9a90f18a9d062cd5b8046cbb59ef7296\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8a3a6b5ac1518e864900bdbf6983b54e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_float32_t</b></td></tr>\n<tr class=\"memdesc:a8a3a6b5ac1518e864900bdbf6983b54e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium 32 bit single-qualifier floating-point scalar.  <a href=\"a00135.html#a8a3a6b5ac1518e864900bdbf6983b54e\">More...</a><br /></td></tr>\n<tr class=\"separator:a8a3a6b5ac1518e864900bdbf6983b54e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a729f6f704ff850a84819c09daf22bf96\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_float64</b></td></tr>\n<tr class=\"memdesc:a729f6f704ff850a84819c09daf22bf96\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#a729f6f704ff850a84819c09daf22bf96\">More...</a><br /></td></tr>\n<tr class=\"separator:a729f6f704ff850a84819c09daf22bf96\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a0cd2f21770615d0b0c46daa9a820f2e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::float64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_float64_t</b></td></tr>\n<tr class=\"memdesc:a0cd2f21770615d0b0c46daa9a820f2e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium 64 bit double-qualifier floating-point scalar.  <a href=\"a00135.html#a0cd2f21770615d0b0c46daa9a820f2e9\">More...</a><br /></td></tr>\n<tr class=\"separator:a0cd2f21770615d0b0c46daa9a820f2e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a74e9133378fd0b4da8ac0bc0876702ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_fmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat2</b></td></tr>\n<tr class=\"memdesc:a74e9133378fd0b4da8ac0bc0876702ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a74e9133378fd0b4da8ac0bc0876702ff\">More...</a><br /></td></tr>\n<tr class=\"separator:a74e9133378fd0b4da8ac0bc0876702ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a648617160ee03b5850cea1e160cd13a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat2x2</b></td></tr>\n<tr class=\"memdesc:a648617160ee03b5850cea1e160cd13a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 1x1 matrix.  <a href=\"a00135.html#a648617160ee03b5850cea1e160cd13a3\">More...</a><br /></td></tr>\n<tr class=\"separator:a648617160ee03b5850cea1e160cd13a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:addc5e6a1fe4db579e6688e536a2adcef\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat2x3</b></td></tr>\n<tr class=\"memdesc:addc5e6a1fe4db579e6688e536a2adcef\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 2x3 matrix.  <a href=\"a00135.html#addc5e6a1fe4db579e6688e536a2adcef\">More...</a><br /></td></tr>\n<tr class=\"separator:addc5e6a1fe4db579e6688e536a2adcef\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abd0e11f5d01052c1d30ede13fd82f8cb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat2x4</b></td></tr>\n<tr class=\"memdesc:abd0e11f5d01052c1d30ede13fd82f8cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 2x4 matrix.  <a href=\"a00135.html#abd0e11f5d01052c1d30ede13fd82f8cb\">More...</a><br /></td></tr>\n<tr class=\"separator:abd0e11f5d01052c1d30ede13fd82f8cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a80823dfad5dba98512c76af498343847\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_fmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat3</b></td></tr>\n<tr class=\"memdesc:a80823dfad5dba98512c76af498343847\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a80823dfad5dba98512c76af498343847\">More...</a><br /></td></tr>\n<tr class=\"separator:a80823dfad5dba98512c76af498343847\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad3e487ca23df99cbf2cfcf3091c1d634\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat3x2</b></td></tr>\n<tr class=\"memdesc:ad3e487ca23df99cbf2cfcf3091c1d634\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 3x2 matrix.  <a href=\"a00135.html#ad3e487ca23df99cbf2cfcf3091c1d634\">More...</a><br /></td></tr>\n<tr class=\"separator:ad3e487ca23df99cbf2cfcf3091c1d634\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5f9e7704fd348615defeb38ed9ce7b0e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat3x3</b></td></tr>\n<tr class=\"memdesc:a5f9e7704fd348615defeb38ed9ce7b0e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 3x3 matrix.  <a href=\"a00135.html#a5f9e7704fd348615defeb38ed9ce7b0e\">More...</a><br /></td></tr>\n<tr class=\"separator:a5f9e7704fd348615defeb38ed9ce7b0e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2b07612d43388842f0134874224c348d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat3x4</b></td></tr>\n<tr class=\"memdesc:a2b07612d43388842f0134874224c348d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 3x4 matrix.  <a href=\"a00135.html#a2b07612d43388842f0134874224c348d\">More...</a><br /></td></tr>\n<tr class=\"separator:a2b07612d43388842f0134874224c348d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac1c38778c0b5a1263f07753c05a4f7b9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_fmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat4</b></td></tr>\n<tr class=\"memdesc:ac1c38778c0b5a1263f07753c05a4f7b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#ac1c38778c0b5a1263f07753c05a4f7b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ac1c38778c0b5a1263f07753c05a4f7b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a28c7deb5f1e4085169bc4011020492a9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat4x2</b></td></tr>\n<tr class=\"memdesc:a28c7deb5f1e4085169bc4011020492a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 4x2 matrix.  <a href=\"a00135.html#a28c7deb5f1e4085169bc4011020492a9\">More...</a><br /></td></tr>\n<tr class=\"separator:a28c7deb5f1e4085169bc4011020492a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a90166101c4e5da625287e3a8fffcfa60\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat4x3</b></td></tr>\n<tr class=\"memdesc:a90166101c4e5da625287e3a8fffcfa60\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 4x3 matrix.  <a href=\"a00135.html#a90166101c4e5da625287e3a8fffcfa60\">More...</a><br /></td></tr>\n<tr class=\"separator:a90166101c4e5da625287e3a8fffcfa60\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:adc89b0cbe813d2a01d930d60ee2dd515\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, f32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fmat4x4</b></td></tr>\n<tr class=\"memdesc:adc89b0cbe813d2a01d930d60ee2dd515\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point 4x4 matrix.  <a href=\"a00135.html#adc89b0cbe813d2a01d930d60ee2dd515\">More...</a><br /></td></tr>\n<tr class=\"separator:adc89b0cbe813d2a01d930d60ee2dd515\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4001f0bde084c58673e6e62116e90702\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fquat</b></td></tr>\n<tr class=\"memdesc:a4001f0bde084c58673e6e62116e90702\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of medium single-qualifier floating-point numbers.  <a href=\"a00135.html#a4001f0bde084c58673e6e62116e90702\">More...</a><br /></td></tr>\n<tr class=\"separator:a4001f0bde084c58673e6e62116e90702\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af63fb78713d9ee3c2e0d458b68f5849f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fvec1</b></td></tr>\n<tr class=\"memdesc:af63fb78713d9ee3c2e0d458b68f5849f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#af63fb78713d9ee3c2e0d458b68f5849f\">More...</a><br /></td></tr>\n<tr class=\"separator:af63fb78713d9ee3c2e0d458b68f5849f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2033f3966ba6d7d84642dd5e21cab152\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fvec2</b></td></tr>\n<tr class=\"memdesc:a2033f3966ba6d7d84642dd5e21cab152\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium Single-qualifier floating-point vector of 2 components.  <a href=\"a00135.html#a2033f3966ba6d7d84642dd5e21cab152\">More...</a><br /></td></tr>\n<tr class=\"separator:a2033f3966ba6d7d84642dd5e21cab152\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a0dfce4a314bd498c28dded1edb1fce3c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fvec3</b></td></tr>\n<tr class=\"memdesc:a0dfce4a314bd498c28dded1edb1fce3c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium Single-qualifier floating-point vector of 3 components.  <a href=\"a00135.html#a0dfce4a314bd498c28dded1edb1fce3c\">More...</a><br /></td></tr>\n<tr class=\"separator:a0dfce4a314bd498c28dded1edb1fce3c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a0971e3e5a4ea1d6c0ccce49d005533c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_fvec4</b></td></tr>\n<tr class=\"memdesc:a0971e3e5a4ea1d6c0ccce49d005533c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium Single-qualifier floating-point vector of 4 components.  <a href=\"a00135.html#a0971e3e5a4ea1d6c0ccce49d005533c7\">More...</a><br /></td></tr>\n<tr class=\"separator:a0971e3e5a4ea1d6c0ccce49d005533c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga62a17cddeb4dffb4e18fe3aea23f051a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">mediump_i16</a></td></tr>\n<tr class=\"memdesc:ga62a17cddeb4dffb4e18fe3aea23f051a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga62a17cddeb4dffb4e18fe3aea23f051a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a3f67f9a4efc62a4d1200380341ba5772\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i16, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i16vec1</b></td></tr>\n<tr class=\"memdesc:a3f67f9a4efc62a4d1200380341ba5772\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer scalar type.  <a href=\"a00135.html#a3f67f9a4efc62a4d1200380341ba5772\">More...</a><br /></td></tr>\n<tr class=\"separator:a3f67f9a4efc62a4d1200380341ba5772\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:afdd6c57148d08d083218d09334ebdbcd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i16, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i16vec2</b></td></tr>\n<tr class=\"memdesc:afdd6c57148d08d083218d09334ebdbcd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer vector of 2 components type.  <a href=\"a00135.html#afdd6c57148d08d083218d09334ebdbcd\">More...</a><br /></td></tr>\n<tr class=\"separator:afdd6c57148d08d083218d09334ebdbcd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab0ce092731065316f0727bcee0b91c71\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i16, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i16vec3</b></td></tr>\n<tr class=\"memdesc:ab0ce092731065316f0727bcee0b91c71\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer vector of 3 components type.  <a href=\"a00135.html#ab0ce092731065316f0727bcee0b91c71\">More...</a><br /></td></tr>\n<tr class=\"separator:ab0ce092731065316f0727bcee0b91c71\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ad8a7eaf49c0a2a605e50ec6155df7af7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i16, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i16vec4</b></td></tr>\n<tr class=\"memdesc:ad8a7eaf49c0a2a605e50ec6155df7af7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer vector of 4 components type.  <a href=\"a00135.html#ad8a7eaf49c0a2a605e50ec6155df7af7\">More...</a><br /></td></tr>\n<tr class=\"separator:ad8a7eaf49c0a2a605e50ec6155df7af7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5e94bf2a20af7601787c154751dc2e1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">mediump_i32</a></td></tr>\n<tr class=\"memdesc:gaf5e94bf2a20af7601787c154751dc2e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer type.  <a href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf5e94bf2a20af7601787c154751dc2e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a46a57f71e430637559097a732b550a7e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i32vec1</b></td></tr>\n<tr class=\"memdesc:a46a57f71e430637559097a732b550a7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer scalar type.  <a href=\"a00135.html#a46a57f71e430637559097a732b550a7e\">More...</a><br /></td></tr>\n<tr class=\"separator:a46a57f71e430637559097a732b550a7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a20bf224bd4f8a24ecc4ed2004a40c219\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i32vec2</b></td></tr>\n<tr class=\"memdesc:a20bf224bd4f8a24ecc4ed2004a40c219\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer vector of 2 components type.  <a href=\"a00135.html#a20bf224bd4f8a24ecc4ed2004a40c219\">More...</a><br /></td></tr>\n<tr class=\"separator:a20bf224bd4f8a24ecc4ed2004a40c219\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a13a221b910aa9eb1b04ca1c86e81015a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i32vec3</b></td></tr>\n<tr class=\"memdesc:a13a221b910aa9eb1b04ca1c86e81015a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer vector of 3 components type.  <a href=\"a00135.html#a13a221b910aa9eb1b04ca1c86e81015a\">More...</a><br /></td></tr>\n<tr class=\"separator:a13a221b910aa9eb1b04ca1c86e81015a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6addd4dfee87fc09ab9525e3d07db4c8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i32vec4</b></td></tr>\n<tr class=\"memdesc:a6addd4dfee87fc09ab9525e3d07db4c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer vector of 4 components type.  <a href=\"a00135.html#a6addd4dfee87fc09ab9525e3d07db4c8\">More...</a><br /></td></tr>\n<tr class=\"separator:a6addd4dfee87fc09ab9525e3d07db4c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ebcb1f6d8d8387253de8bccb058d77f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">mediump_i64</a></td></tr>\n<tr class=\"memdesc:ga3ebcb1f6d8d8387253de8bccb058d77f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ebcb1f6d8d8387253de8bccb058d77f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a23d239bdf6bfd05d9b6d57cc4c3961a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i64vec1</b></td></tr>\n<tr class=\"memdesc:a23d239bdf6bfd05d9b6d57cc4c3961a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer scalar type.  <a href=\"a00135.html#a23d239bdf6bfd05d9b6d57cc4c3961a2\">More...</a><br /></td></tr>\n<tr class=\"separator:a23d239bdf6bfd05d9b6d57cc4c3961a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aad1b4dda8f6d4d977f0bb916d0c8e996\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i64vec2</b></td></tr>\n<tr class=\"memdesc:aad1b4dda8f6d4d977f0bb916d0c8e996\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer vector of 2 components type.  <a href=\"a00135.html#aad1b4dda8f6d4d977f0bb916d0c8e996\">More...</a><br /></td></tr>\n<tr class=\"separator:aad1b4dda8f6d4d977f0bb916d0c8e996\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:afcd7821c0745fd7e79f23e00551fec95\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i64vec3</b></td></tr>\n<tr class=\"memdesc:afcd7821c0745fd7e79f23e00551fec95\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer vector of 3 components type.  <a href=\"a00135.html#afcd7821c0745fd7e79f23e00551fec95\">More...</a><br /></td></tr>\n<tr class=\"separator:afcd7821c0745fd7e79f23e00551fec95\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:affe539cf2a2f0c884648c0f6c0944c50\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i64vec4</b></td></tr>\n<tr class=\"memdesc:affe539cf2a2f0c884648c0f6c0944c50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer vector of 4 components type.  <a href=\"a00135.html#affe539cf2a2f0c884648c0f6c0944c50\">More...</a><br /></td></tr>\n<tr class=\"separator:affe539cf2a2f0c884648c0f6c0944c50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacf1ded173e1e2d049c511d095b259e21\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">mediump_i8</a></td></tr>\n<tr class=\"memdesc:gacf1ded173e1e2d049c511d095b259e21\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer type.  <a href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">More...</a><br /></td></tr>\n<tr class=\"separator:gacf1ded173e1e2d049c511d095b259e21\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa0758c716c0f22c2f578ff4807ca5761\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, i8, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i8vec1</b></td></tr>\n<tr class=\"memdesc:aa0758c716c0f22c2f578ff4807ca5761\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer scalar type.  <a href=\"a00135.html#aa0758c716c0f22c2f578ff4807ca5761\">More...</a><br /></td></tr>\n<tr class=\"separator:aa0758c716c0f22c2f578ff4807ca5761\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae73ceb033eb94c8ae48455e6dbb6ff5a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, i8, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i8vec2</b></td></tr>\n<tr class=\"memdesc:ae73ceb033eb94c8ae48455e6dbb6ff5a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer vector of 2 components type.  <a href=\"a00135.html#ae73ceb033eb94c8ae48455e6dbb6ff5a\">More...</a><br /></td></tr>\n<tr class=\"separator:ae73ceb033eb94c8ae48455e6dbb6ff5a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af91120183247e82ce085ea74e52ffa0f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, i8, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i8vec3</b></td></tr>\n<tr class=\"memdesc:af91120183247e82ce085ea74e52ffa0f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer vector of 3 components type.  <a href=\"a00135.html#af91120183247e82ce085ea74e52ffa0f\">More...</a><br /></td></tr>\n<tr class=\"separator:af91120183247e82ce085ea74e52ffa0f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abdb3d5defd67bcefac9e7ab8b2dccc89\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, i8, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_i8vec4</b></td></tr>\n<tr class=\"memdesc:abdb3d5defd67bcefac9e7ab8b2dccc89\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer vector of 4 components type.  <a href=\"a00135.html#abdb3d5defd67bcefac9e7ab8b2dccc89\">More...</a><br /></td></tr>\n<tr class=\"separator:abdb3d5defd67bcefac9e7ab8b2dccc89\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadff3608baa4b5bd3ed28f95c1c2c345d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">mediump_int16</a></td></tr>\n<tr class=\"memdesc:gadff3608baa4b5bd3ed28f95c1c2c345d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer type.  <a href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">More...</a><br /></td></tr>\n<tr class=\"separator:gadff3608baa4b5bd3ed28f95c1c2c345d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga80e72fe94c88498537e8158ba7591c54\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">mediump_int16_t</a></td></tr>\n<tr class=\"memdesc:ga80e72fe94c88498537e8158ba7591c54\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">More...</a><br /></td></tr>\n<tr class=\"separator:ga80e72fe94c88498537e8158ba7591c54\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5244cef85d6e870e240c76428a262ae8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">mediump_int32</a></td></tr>\n<tr class=\"memdesc:ga5244cef85d6e870e240c76428a262ae8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5244cef85d6e870e240c76428a262ae8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga26fc7ced1ad7ca5024f1c973c8dc9180\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">mediump_int32_t</a></td></tr>\n<tr class=\"memdesc:ga26fc7ced1ad7ca5024f1c973c8dc9180\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">More...</a><br /></td></tr>\n<tr class=\"separator:ga26fc7ced1ad7ca5024f1c973c8dc9180\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b968f2b86a0442a89c7359171e1d866\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">mediump_int64</a></td></tr>\n<tr class=\"memdesc:ga7b968f2b86a0442a89c7359171e1d866\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7b968f2b86a0442a89c7359171e1d866\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac3bc41bcac61d1ba8f02a6f68ce23f64\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">mediump_int64_t</a></td></tr>\n<tr class=\"memdesc:gac3bc41bcac61d1ba8f02a6f68ce23f64\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer type.  <a href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">More...</a><br /></td></tr>\n<tr class=\"separator:gac3bc41bcac61d1ba8f02a6f68ce23f64\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6fbd69cbdaa44345bff923a2cf63de7e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">mediump_int8</a></td></tr>\n<tr class=\"memdesc:ga6fbd69cbdaa44345bff923a2cf63de7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6fbd69cbdaa44345bff923a2cf63de7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d7b3789ecb932c26430009478cac7ae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">mediump_int8_t</a></td></tr>\n<tr class=\"memdesc:ga6d7b3789ecb932c26430009478cac7ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d7b3789ecb932c26430009478cac7ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af519098b37a0cfefa5886647dc38e508\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tquat&lt; float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_quat</b></td></tr>\n<tr class=\"memdesc:af519098b37a0cfefa5886647dc38e508\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of medium single-qualifier floating-point numbers.  <a href=\"a00135.html#af519098b37a0cfefa5886647dc38e508\">More...</a><br /></td></tr>\n<tr class=\"separator:af519098b37a0cfefa5886647dc38e508\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9df98857be695d5a30cb30f5bfa38a80\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">mediump_u16</a></td></tr>\n<tr class=\"memdesc:ga9df98857be695d5a30cb30f5bfa38a80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9df98857be695d5a30cb30f5bfa38a80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abd62ebdb8a7f780ea9d002f93d73cd16\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u16, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u16vec1</b></td></tr>\n<tr class=\"memdesc:abd62ebdb8a7f780ea9d002f93d73cd16\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer scalar type.  <a href=\"a00135.html#abd62ebdb8a7f780ea9d002f93d73cd16\">More...</a><br /></td></tr>\n<tr class=\"separator:abd62ebdb8a7f780ea9d002f93d73cd16\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2f4da667d9bf0c8365836720f1c02b61\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u16, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u16vec2</b></td></tr>\n<tr class=\"memdesc:a2f4da667d9bf0c8365836720f1c02b61\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#a2f4da667d9bf0c8365836720f1c02b61\">More...</a><br /></td></tr>\n<tr class=\"separator:a2f4da667d9bf0c8365836720f1c02b61\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a7178db7293000e519d3e4a649f1c01cd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u16, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u16vec3</b></td></tr>\n<tr class=\"memdesc:a7178db7293000e519d3e4a649f1c01cd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#a7178db7293000e519d3e4a649f1c01cd\">More...</a><br /></td></tr>\n<tr class=\"separator:a7178db7293000e519d3e4a649f1c01cd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a6a785586eb278fe499f2fce83d551559\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u16, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u16vec4</b></td></tr>\n<tr class=\"memdesc:a6a785586eb278fe499f2fce83d551559\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a6a785586eb278fe499f2fce83d551559\">More...</a><br /></td></tr>\n<tr class=\"separator:a6a785586eb278fe499f2fce83d551559\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1bd0e914158bf03135f8a317de6debe9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">mediump_u32</a></td></tr>\n<tr class=\"memdesc:ga1bd0e914158bf03135f8a317de6debe9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1bd0e914158bf03135f8a317de6debe9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a8a11ccd2e38f674bbf3c2d1afc232aee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u32vec1</b></td></tr>\n<tr class=\"memdesc:a8a11ccd2e38f674bbf3c2d1afc232aee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer scalar type.  <a href=\"a00135.html#a8a11ccd2e38f674bbf3c2d1afc232aee\">More...</a><br /></td></tr>\n<tr class=\"separator:a8a11ccd2e38f674bbf3c2d1afc232aee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a94f74851fce338549c705b5f0d601c4f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u32vec2</b></td></tr>\n<tr class=\"memdesc:a94f74851fce338549c705b5f0d601c4f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#a94f74851fce338549c705b5f0d601c4f\">More...</a><br /></td></tr>\n<tr class=\"separator:a94f74851fce338549c705b5f0d601c4f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a012c24c8fc69707b90260474c70275a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u32vec3</b></td></tr>\n<tr class=\"memdesc:a012c24c8fc69707b90260474c70275a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#a012c24c8fc69707b90260474c70275a2\">More...</a><br /></td></tr>\n<tr class=\"separator:a012c24c8fc69707b90260474c70275a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a5d43ee8b5dbaa06c327b03b83682598a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u32, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u32vec4</b></td></tr>\n<tr class=\"memdesc:a5d43ee8b5dbaa06c327b03b83682598a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a5d43ee8b5dbaa06c327b03b83682598a\">More...</a><br /></td></tr>\n<tr class=\"separator:a5d43ee8b5dbaa06c327b03b83682598a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2af9490085ae3bdf36a544e9dd073610\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">mediump_u64</a></td></tr>\n<tr class=\"memdesc:ga2af9490085ae3bdf36a544e9dd073610\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2af9490085ae3bdf36a544e9dd073610\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:afbd4776e70eda301355c06ff769b2d04\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u64vec1</b></td></tr>\n<tr class=\"memdesc:afbd4776e70eda301355c06ff769b2d04\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer scalar type.  <a href=\"a00135.html#afbd4776e70eda301355c06ff769b2d04\">More...</a><br /></td></tr>\n<tr class=\"separator:afbd4776e70eda301355c06ff769b2d04\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a14dd6e9d4d9f55c7bcf7ba8bf3268c75\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u64vec2</b></td></tr>\n<tr class=\"memdesc:a14dd6e9d4d9f55c7bcf7ba8bf3268c75\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#a14dd6e9d4d9f55c7bcf7ba8bf3268c75\">More...</a><br /></td></tr>\n<tr class=\"separator:a14dd6e9d4d9f55c7bcf7ba8bf3268c75\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab0dcadd9e64417b6fde88ef09f376bdd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u64vec3</b></td></tr>\n<tr class=\"memdesc:ab0dcadd9e64417b6fde88ef09f376bdd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#ab0dcadd9e64417b6fde88ef09f376bdd\">More...</a><br /></td></tr>\n<tr class=\"separator:ab0dcadd9e64417b6fde88ef09f376bdd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a32f8801df8488727e7d76dfe02544c18\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u64, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u64vec4</b></td></tr>\n<tr class=\"memdesc:a32f8801df8488727e7d76dfe02544c18\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#a32f8801df8488727e7d76dfe02544c18\">More...</a><br /></td></tr>\n<tr class=\"separator:a32f8801df8488727e7d76dfe02544c18\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1213a22bbb9e4107f07eaa4956f8281\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">mediump_u8</a></td></tr>\n<tr class=\"memdesc:gad1213a22bbb9e4107f07eaa4956f8281\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">More...</a><br /></td></tr>\n<tr class=\"separator:gad1213a22bbb9e4107f07eaa4956f8281\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a734fe52b4edc77618a3f7561c3a55447\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, u8, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u8vec1</b></td></tr>\n<tr class=\"memdesc:a734fe52b4edc77618a3f7561c3a55447\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer scalar type.  <a href=\"a00135.html#a734fe52b4edc77618a3f7561c3a55447\">More...</a><br /></td></tr>\n<tr class=\"separator:a734fe52b4edc77618a3f7561c3a55447\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac1bc6eb091772e8aec66530389048ade\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, u8, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u8vec2</b></td></tr>\n<tr class=\"memdesc:ac1bc6eb091772e8aec66530389048ade\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer vector of 2 components type.  <a href=\"a00135.html#ac1bc6eb091772e8aec66530389048ade\">More...</a><br /></td></tr>\n<tr class=\"separator:ac1bc6eb091772e8aec66530389048ade\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae0551d0a6c1bcf4438e7fc3ee3dcb97b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, u8, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u8vec3</b></td></tr>\n<tr class=\"memdesc:ae0551d0a6c1bcf4438e7fc3ee3dcb97b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer vector of 3 components type.  <a href=\"a00135.html#ae0551d0a6c1bcf4438e7fc3ee3dcb97b\">More...</a><br /></td></tr>\n<tr class=\"separator:ae0551d0a6c1bcf4438e7fc3ee3dcb97b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aa7f5dd02b60b07242c979e08c6e034bb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, u8, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_u8vec4</b></td></tr>\n<tr class=\"memdesc:aa7f5dd02b60b07242c979e08c6e034bb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer vector of 4 components type.  <a href=\"a00135.html#aa7f5dd02b60b07242c979e08c6e034bb\">More...</a><br /></td></tr>\n<tr class=\"separator:aa7f5dd02b60b07242c979e08c6e034bb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2885a6c89916911e418c06bb76b9bdbb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">mediump_uint16</a></td></tr>\n<tr class=\"memdesc:ga2885a6c89916911e418c06bb76b9bdbb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2885a6c89916911e418c06bb76b9bdbb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3963b1050fc65a383ee28e3f827b6e3e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">mediump_uint16_t</a></td></tr>\n<tr class=\"memdesc:ga3963b1050fc65a383ee28e3f827b6e3e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3963b1050fc65a383ee28e3f827b6e3e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga34dd5ec1988c443bae80f1b20a8ade5f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">mediump_uint32</a></td></tr>\n<tr class=\"memdesc:ga34dd5ec1988c443bae80f1b20a8ade5f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga34dd5ec1988c443bae80f1b20a8ade5f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4dae276fd29623950de14a6ca2586b5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">mediump_uint32_t</a></td></tr>\n<tr class=\"memdesc:gaf4dae276fd29623950de14a6ca2586b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4dae276fd29623950de14a6ca2586b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30652709815ad9404272a31957daa59e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">mediump_uint64</a></td></tr>\n<tr class=\"memdesc:ga30652709815ad9404272a31957daa59e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30652709815ad9404272a31957daa59e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9b170dd4a8f38448a2dc93987c7875e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">mediump_uint64_t</a></td></tr>\n<tr class=\"memdesc:ga9b170dd4a8f38448a2dc93987c7875e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9b170dd4a8f38448a2dc93987c7875e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">mediump_uint8</a></td></tr>\n<tr class=\"memdesc:ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadfe65c78231039e90507770db50c98c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">mediump_uint8_t</a></td></tr>\n<tr class=\"memdesc:gadfe65c78231039e90507770db50c98c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">More...</a><br /></td></tr>\n<tr class=\"separator:gadfe65c78231039e90507770db50c98c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac9bd33e4fdd9fce967a9f4a5e5ab70b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_vec1</b></td></tr>\n<tr class=\"memdesc:ac9bd33e4fdd9fce967a9f4a5e5ab70b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium single-qualifier floating-point vector of 1 component.  <a href=\"a00135.html#ac9bd33e4fdd9fce967a9f4a5e5ab70b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ac9bd33e4fdd9fce967a9f4a5e5ab70b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a2fad291f6402e228d28779df175ba37a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"a2fad291f6402e228d28779df175ba37a\"></a>\ntypedef highp_quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>quat</b></td></tr>\n<tr class=\"memdesc:a2fad291f6402e228d28779df175ba37a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion of default single-qualifier floating-point numbers. <br /></td></tr>\n<tr class=\"separator:a2fad291f6402e228d28779df175ba37a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa2d7acc0adb536fab71fe261232a40ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">u16</a></td></tr>\n<tr class=\"memdesc:gaa2d7acc0adb536fab71fe261232a40ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit unsigned integer type.  <a href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa2d7acc0adb536fab71fe261232a40ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u16vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">u16vec1</a></td></tr>\n<tr class=\"memdesc:ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer scalar type.  <a href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a78447eb9d66a114b193f4a25899c16\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u16vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a></td></tr>\n<tr class=\"memdesc:ga2a78447eb9d66a114b193f4a25899c16\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer vector of 2 components type.  <a href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2a78447eb9d66a114b193f4a25899c16\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1c522ca821c27b862fe51cf4024b064b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u16vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">u16vec3</a></td></tr>\n<tr class=\"memdesc:ga1c522ca821c27b862fe51cf4024b064b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer vector of 3 components type.  <a href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1c522ca821c27b862fe51cf4024b064b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga529496d75775fb656a07993ea9af2450\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u16vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a></td></tr>\n<tr class=\"memdesc:ga529496d75775fb656a07993ea9af2450\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer vector of 4 components type.  <a href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">More...</a><br /></td></tr>\n<tr class=\"separator:ga529496d75775fb656a07993ea9af2450\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8165913e068444f7842302d40ba897b9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">u32</a></td></tr>\n<tr class=\"memdesc:ga8165913e068444f7842302d40ba897b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit unsigned integer type.  <a href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8165913e068444f7842302d40ba897b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae627372cfd5f20dd87db490387b71195\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u32vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a></td></tr>\n<tr class=\"memdesc:gae627372cfd5f20dd87db490387b71195\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer scalar type.  <a href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">More...</a><br /></td></tr>\n<tr class=\"separator:gae627372cfd5f20dd87db490387b71195\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a266e46ee218d0c680f12b35c500cc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a></td></tr>\n<tr class=\"memdesc:ga2a266e46ee218d0c680f12b35c500cc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer vector of 2 components type.  <a href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2a266e46ee218d0c680f12b35c500cc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae267358ff2a41d156d97f5762630235a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u32vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a></td></tr>\n<tr class=\"memdesc:gae267358ff2a41d156d97f5762630235a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer vector of 3 components type.  <a href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae267358ff2a41d156d97f5762630235a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31cef34e4cd04840c54741ff2f7005f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u32vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a></td></tr>\n<tr class=\"memdesc:ga31cef34e4cd04840c54741ff2f7005f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer vector of 4 components type.  <a href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31cef34e4cd04840c54741ff2f7005f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf3f312156984c365e9f65620354da70b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">u64</a></td></tr>\n<tr class=\"memdesc:gaf3f312156984c365e9f65620354da70b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit unsigned integer type.  <a href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf3f312156984c365e9f65620354da70b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf09f3ca4b671a4a4f84505eb4cc865fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u64vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">u64vec1</a></td></tr>\n<tr class=\"memdesc:gaf09f3ca4b671a4a4f84505eb4cc865fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer scalar type.  <a href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf09f3ca4b671a4a4f84505eb4cc865fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaef3824ed4fe435a019c5b9dddf53fec5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u64vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">u64vec2</a></td></tr>\n<tr class=\"memdesc:gaef3824ed4fe435a019c5b9dddf53fec5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer vector of 2 components type.  <a href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">More...</a><br /></td></tr>\n<tr class=\"separator:gaef3824ed4fe435a019c5b9dddf53fec5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga489b89ba93d4f7b3934df78debc52276\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u64vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">u64vec3</a></td></tr>\n<tr class=\"memdesc:ga489b89ba93d4f7b3934df78debc52276\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer vector of 3 components type.  <a href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">More...</a><br /></td></tr>\n<tr class=\"separator:ga489b89ba93d4f7b3934df78debc52276\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3945dd6515d4498cb603e65ff867ab03\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u64vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">u64vec4</a></td></tr>\n<tr class=\"memdesc:ga3945dd6515d4498cb603e65ff867ab03\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer vector of 4 components type.  <a href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3945dd6515d4498cb603e65ff867ab03\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaecc7082561fc9028b844b6cf3d305d36\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">u8</a></td></tr>\n<tr class=\"memdesc:gaecc7082561fc9028b844b6cf3d305d36\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit unsigned integer type.  <a href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">More...</a><br /></td></tr>\n<tr class=\"separator:gaecc7082561fc9028b844b6cf3d305d36\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga29b349e037f0b24320b4548a143daee2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u8vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">u8vec1</a></td></tr>\n<tr class=\"memdesc:ga29b349e037f0b24320b4548a143daee2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer scalar type.  <a href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga29b349e037f0b24320b4548a143daee2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga518b8d948a6b4ddb72f84d5c3b7b6611\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u8vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a></td></tr>\n<tr class=\"memdesc:ga518b8d948a6b4ddb72f84d5c3b7b6611\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer vector of 2 components type.  <a href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">More...</a><br /></td></tr>\n<tr class=\"separator:ga518b8d948a6b4ddb72f84d5c3b7b6611\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7c5706f6bbe5282e5598acf7e7b377e2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u8vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">u8vec3</a></td></tr>\n<tr class=\"memdesc:ga7c5706f6bbe5282e5598acf7e7b377e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer vector of 3 components type.  <a href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7c5706f6bbe5282e5598acf7e7b377e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20779a61de2fd526a17f12fe53ec46b1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u8vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a></td></tr>\n<tr class=\"memdesc:ga20779a61de2fd526a17f12fe53ec46b1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer vector of 4 components type.  <a href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20779a61de2fd526a17f12fe53ec46b1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91f91f411080c37730856ff5887f5bcf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">uint16_t</a></td></tr>\n<tr class=\"memdesc:ga91f91f411080c37730856ff5887f5bcf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit unsigned integer type.  <a href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91f91f411080c37730856ff5887f5bcf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2171d9dc1fefb1c82e2817f45b622eac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">uint32_t</a></td></tr>\n<tr class=\"memdesc:ga2171d9dc1fefb1c82e2817f45b622eac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit unsigned integer type.  <a href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2171d9dc1fefb1c82e2817f45b622eac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3999d3e7ff22025c16ddb601e14dfdee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">uint64_t</a></td></tr>\n<tr class=\"memdesc:ga3999d3e7ff22025c16ddb601e14dfdee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit unsigned integer type.  <a href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3999d3e7ff22025c16ddb601e14dfdee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga28d97808322d3c92186e4a0c067d7e8e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">uint8_t</a></td></tr>\n<tr class=\"memdesc:ga28d97808322d3c92186e4a0c067d7e8e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit unsigned integer type.  <a href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga28d97808322d3c92186e4a0c067d7e8e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00033_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: fwd.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">fwd.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00033.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00106.html\">detail/type_int.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00103.html\">detail/type_float.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00120.html\">detail/type_vec.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">detail/type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"comment\">// GLM_GTC_quaternion</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; <span class=\"keyword\">struct </span>tquat;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;float, lowp&gt;              lowp_quat;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;float, mediump&gt;   mediump_quat;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;float, highp&gt;             highp_quat;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">typedef</span> highp_quat                      quat;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        <span class=\"keyword\">typedef</span> mediump_quat            quat;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">typedef</span> lowp_quat                       quat;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">typedef</span> highp_quat                      quat;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        <span class=\"keyword\">typedef</span> lowp_quat                       lowp_fquat;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">typedef</span> mediump_quat            mediump_fquat;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">typedef</span> highp_quat                      highp_fquat;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">typedef</span> quat                            fquat;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;double, lowp&gt;             lowp_dquat;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;double, mediump&gt;  mediump_dquat;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;double, highp&gt;    highp_dquat;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        <span class=\"keyword\">typedef</span> highp_dquat                     dquat;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) &amp;&amp; defined(GLM_PRECISION_MEDIUMP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dquat           dquat;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_DOUBLE) &amp;&amp; defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dquat                      dquat;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_DOUBLE) &amp;&amp; !defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;        <span class=\"keyword\">typedef</span> highp_dquat                     dquat;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"comment\">// GLM_GTC_precision</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">  102</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">lowp_int8</a>;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">  106</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">lowp_int16</a>;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">  110</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">lowp_int32</a>;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">  114</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">lowp_int64</a>;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">  118</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">lowp_int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">  122</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">lowp_int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">  126</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">lowp_int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">  130</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">lowp_int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">  134</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">lowp_i8</a>;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">  138</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">lowp_i16</a>;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">  142</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">lowp_i32</a>;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">  146</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">lowp_i64</a>;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">  150</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">mediump_int8</a>;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">  154</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">mediump_int16</a>;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">  158</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">mediump_int32</a>;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">  162</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">mediump_int64</a>;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">  166</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">mediump_int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">  170</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">mediump_int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">  174</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">mediump_int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">  178</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">mediump_int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">  182</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">mediump_i8</a>;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">  186</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">mediump_i16</a>;</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">  190</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">mediump_i32</a>;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">  194</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">mediump_i64</a>;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">  198</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">highp_int8</a>;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">  202</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">highp_int16</a>;</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">  206</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">highp_int32</a>;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">  210</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">highp_int64</a>;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">  214</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">highp_int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">  218</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">highp_int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">  222</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">highp_int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">  226</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">highp_int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">  230</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">highp_i8</a>;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">  234</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">highp_i16</a>;</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">  238</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">highp_i32</a>;</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">  242</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">highp_i64</a>;</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>;</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;</div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a>;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_EXTENDED_INTEGER_TYPE</span></div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">std::int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">std::int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">std::int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">std::int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">  274</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;</div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">  278</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">  282</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;</div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">  287</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">i8</a>;</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">  291</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">i16</a>;</div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">  295</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">i32</a>;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">  299</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">i64</a>;</div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i8, lowp&gt; lowp_i8vec1;</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i8, lowp&gt; lowp_i8vec2;</div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i8, lowp&gt; lowp_i8vec3;</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i8, lowp&gt; lowp_i8vec4;</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i8, mediump&gt; mediump_i8vec1;</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i8, mediump&gt; mediump_i8vec2;</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i8, mediump&gt; mediump_i8vec3;</div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i8, mediump&gt; mediump_i8vec4;</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i8, highp&gt; highp_i8vec1;</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i8, highp&gt; highp_i8vec2;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i8, highp&gt; highp_i8vec3;</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i8, highp&gt; highp_i8vec4;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i8vec1                             <a class=\"code\" href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">i8vec1</a>;</div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i8vec2                             <a class=\"code\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a>;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i8vec3                             <a class=\"code\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">i8vec3</a>;</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i8vec4                             <a class=\"code\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a>;</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i8vec1                  <a class=\"code\" href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">i8vec1</a>;</div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i8vec2                  <a class=\"code\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a>;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i8vec3                  <a class=\"code\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">i8vec3</a>;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i8vec4                  <a class=\"code\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a>; </div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;        <span class=\"keyword\">typedef</span> highp_i8vec1                    <a class=\"code\" href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">i8vec1</a>;</div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">  370</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i8vec2                    <a class=\"code\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a>;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">  374</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i8vec3                    <a class=\"code\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">i8vec3</a>;</div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">  378</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i8vec4                    <a class=\"code\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a>;</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i16, lowp&gt;               lowp_i16vec1;</div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i16, lowp&gt;               lowp_i16vec2;</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i16, lowp&gt;               lowp_i16vec3;</div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i16, lowp&gt;               lowp_i16vec4;</div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i16, mediump&gt;            mediump_i16vec1;</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i16, mediump&gt;            mediump_i16vec2;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i16, mediump&gt;            mediump_i16vec3;</div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i16, mediump&gt;            mediump_i16vec4;</div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i16, highp&gt;              highp_i16vec1;</div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i16, highp&gt;              highp_i16vec2;</div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i16, highp&gt;              highp_i16vec3;</div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i16, highp&gt;              highp_i16vec4;</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i16vec1                    <a class=\"code\" href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">i16vec1</a>;</div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i16vec2                    <a class=\"code\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a>;</div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i16vec3                    <a class=\"code\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">i16vec3</a>;</div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i16vec4                    <a class=\"code\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a>;</div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\">  439</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i16vec1                 <a class=\"code\" href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">i16vec1</a>;</div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i16vec2                 <a class=\"code\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a>;</div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i16vec3                 <a class=\"code\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">i16vec3</a>;</div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i16vec4                 <a class=\"code\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a>;</div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\">  443</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;        <span class=\"keyword\">typedef</span> highp_i16vec1                   <a class=\"code\" href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">i16vec1</a>;</div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">  450</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i16vec2                   <a class=\"code\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a>;</div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">  454</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i16vec3                   <a class=\"code\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">i16vec3</a>;</div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">  458</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i16vec4                   <a class=\"code\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a>;</div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;</div>\n<div class=\"line\"><a name=\"l00461\"></a><span class=\"lineno\">  461</span>&#160;</div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i32, lowp&gt;               lowp_i32vec1;</div>\n<div class=\"line\"><a name=\"l00465\"></a><span class=\"lineno\">  465</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i32, lowp&gt;               lowp_i32vec2;</div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i32, lowp&gt;               lowp_i32vec3;</div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i32, lowp&gt;               lowp_i32vec4;</div>\n<div class=\"line\"><a name=\"l00477\"></a><span class=\"lineno\">  477</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\">  478</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i32, mediump&gt;            mediump_i32vec1;</div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i32, mediump&gt;            mediump_i32vec2;</div>\n<div class=\"line\"><a name=\"l00486\"></a><span class=\"lineno\">  486</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\">  489</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i32, mediump&gt;            mediump_i32vec3;</div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00493\"></a><span class=\"lineno\">  493</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i32, mediump&gt;            mediump_i32vec4;</div>\n<div class=\"line\"><a name=\"l00494\"></a><span class=\"lineno\">  494</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i32, highp&gt;              highp_i32vec1;</div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i32, highp&gt;              highp_i32vec2;</div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i32, highp&gt;              highp_i32vec3;</div>\n<div class=\"line\"><a name=\"l00507\"></a><span class=\"lineno\">  507</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00510\"></a><span class=\"lineno\">  510</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i32, highp&gt;              highp_i32vec4;</div>\n<div class=\"line\"><a name=\"l00511\"></a><span class=\"lineno\">  511</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i32vec1                    <a class=\"code\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\">  514</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i32vec2                    <a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i32vec3                    <a class=\"code\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00516\"></a><span class=\"lineno\">  516</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i32vec4                    <a class=\"code\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\">  517</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i32vec1                 <a class=\"code\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i32vec2                 <a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\">  520</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i32vec3                 <a class=\"code\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\">  521</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i32vec4                 <a class=\"code\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\">  523</span>&#160;        <span class=\"keyword\">typedef</span> highp_i32vec1                   <a class=\"code\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">  529</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i32vec2                   <a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">  533</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i32vec3                   <a class=\"code\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00537\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">  537</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i32vec4                   <a class=\"code\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00538\"></a><span class=\"lineno\">  538</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;</div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;</div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i32, lowp&gt;               lowp_i32vec1;</div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i32, lowp&gt;               lowp_i32vec2;</div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i32, lowp&gt;               lowp_i32vec3;</div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00555\"></a><span class=\"lineno\">  555</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i32, lowp&gt;               lowp_i32vec4;</div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i32, mediump&gt;            mediump_i32vec1;</div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i32, mediump&gt;            mediump_i32vec2;</div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i32, mediump&gt;            mediump_i32vec3;</div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00572\"></a><span class=\"lineno\">  572</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i32, mediump&gt;            mediump_i32vec4;</div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i32, highp&gt;              highp_i32vec1;</div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i32, highp&gt;              highp_i32vec2;</div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00585\"></a><span class=\"lineno\">  585</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i32, highp&gt;              highp_i32vec3;</div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\">  586</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\">  589</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i32, highp&gt;              highp_i32vec4;</div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00591\"></a><span class=\"lineno\">  591</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00592\"></a><span class=\"lineno\">  592</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i32vec1                    <a class=\"code\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i32vec2                    <a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i32vec3                    <a class=\"code\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\">  595</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i32vec4                    <a class=\"code\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00596\"></a><span class=\"lineno\">  596</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00597\"></a><span class=\"lineno\">  597</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i32vec1                 <a class=\"code\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\">  598</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i32vec2                 <a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i32vec3                 <a class=\"code\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i32vec4                 <a class=\"code\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00601\"></a><span class=\"lineno\">  601</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;        <span class=\"keyword\">typedef</span> highp_i32vec1                   <a class=\"code\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00605\"></a><span class=\"lineno\">  605</span>&#160;</div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;        <span class=\"keyword\">typedef</span> highp_i32vec2                   <a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00609\"></a><span class=\"lineno\">  609</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00612\"></a><span class=\"lineno\">  612</span>&#160;        <span class=\"keyword\">typedef</span> highp_i32vec3                   <a class=\"code\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00613\"></a><span class=\"lineno\">  613</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;        <span class=\"keyword\">typedef</span> highp_i32vec4                   <a class=\"code\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00617\"></a><span class=\"lineno\">  617</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00618\"></a><span class=\"lineno\">  618</span>&#160;</div>\n<div class=\"line\"><a name=\"l00619\"></a><span class=\"lineno\">  619</span>&#160;</div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00623\"></a><span class=\"lineno\">  623</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i64, lowp&gt;               lowp_i64vec1;</div>\n<div class=\"line\"><a name=\"l00624\"></a><span class=\"lineno\">  624</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00627\"></a><span class=\"lineno\">  627</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i64, lowp&gt;               lowp_i64vec2;</div>\n<div class=\"line\"><a name=\"l00628\"></a><span class=\"lineno\">  628</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00631\"></a><span class=\"lineno\">  631</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i64, lowp&gt;               lowp_i64vec3;</div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00635\"></a><span class=\"lineno\">  635</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i64, lowp&gt;               lowp_i64vec4;</div>\n<div class=\"line\"><a name=\"l00636\"></a><span class=\"lineno\">  636</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00640\"></a><span class=\"lineno\">  640</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i64, mediump&gt;            mediump_i64vec1;</div>\n<div class=\"line\"><a name=\"l00641\"></a><span class=\"lineno\">  641</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00644\"></a><span class=\"lineno\">  644</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i64, mediump&gt;            mediump_i64vec2;</div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00648\"></a><span class=\"lineno\">  648</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i64, mediump&gt;            mediump_i64vec3;</div>\n<div class=\"line\"><a name=\"l00649\"></a><span class=\"lineno\">  649</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00652\"></a><span class=\"lineno\">  652</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i64, mediump&gt;            mediump_i64vec4;</div>\n<div class=\"line\"><a name=\"l00653\"></a><span class=\"lineno\">  653</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00657\"></a><span class=\"lineno\">  657</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i64, highp&gt;              highp_i64vec1;</div>\n<div class=\"line\"><a name=\"l00658\"></a><span class=\"lineno\">  658</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00661\"></a><span class=\"lineno\">  661</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i64, highp&gt;              highp_i64vec2;</div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00665\"></a><span class=\"lineno\">  665</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i64, highp&gt;              highp_i64vec3;</div>\n<div class=\"line\"><a name=\"l00666\"></a><span class=\"lineno\">  666</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00669\"></a><span class=\"lineno\">  669</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i64, highp&gt;              highp_i64vec4;</div>\n<div class=\"line\"><a name=\"l00670\"></a><span class=\"lineno\">  670</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\">  671</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00672\"></a><span class=\"lineno\">  672</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i64vec1                    <a class=\"code\" href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">i64vec1</a>;</div>\n<div class=\"line\"><a name=\"l00673\"></a><span class=\"lineno\">  673</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i64vec2                    <a class=\"code\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">i64vec2</a>;</div>\n<div class=\"line\"><a name=\"l00674\"></a><span class=\"lineno\">  674</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i64vec3                    <a class=\"code\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">i64vec3</a>;</div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;        <span class=\"keyword\">typedef</span> lowp_i64vec4                    <a class=\"code\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">i64vec4</a>;</div>\n<div class=\"line\"><a name=\"l00676\"></a><span class=\"lineno\">  676</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00677\"></a><span class=\"lineno\">  677</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i64vec1                 <a class=\"code\" href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">i64vec1</a>;</div>\n<div class=\"line\"><a name=\"l00678\"></a><span class=\"lineno\">  678</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i64vec2                 <a class=\"code\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">i64vec2</a>;</div>\n<div class=\"line\"><a name=\"l00679\"></a><span class=\"lineno\">  679</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i64vec3                 <a class=\"code\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">i64vec3</a>;</div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;        <span class=\"keyword\">typedef</span> mediump_i64vec4                 <a class=\"code\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">i64vec4</a>;</div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00682\"></a><span class=\"lineno\">  682</span>&#160;        <span class=\"keyword\">typedef</span> highp_i64vec1                   <a class=\"code\" href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">i64vec1</a>;</div>\n<div class=\"line\"><a name=\"l00685\"></a><span class=\"lineno\">  685</span>&#160;</div>\n<div class=\"line\"><a name=\"l00688\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">  688</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i64vec2                   <a class=\"code\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">i64vec2</a>;</div>\n<div class=\"line\"><a name=\"l00689\"></a><span class=\"lineno\">  689</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">  692</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i64vec3                   <a class=\"code\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">i64vec3</a>;</div>\n<div class=\"line\"><a name=\"l00693\"></a><span class=\"lineno\">  693</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00696\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">  696</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_i64vec4                   <a class=\"code\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">i64vec4</a>;</div>\n<div class=\"line\"><a name=\"l00697\"></a><span class=\"lineno\">  697</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00698\"></a><span class=\"lineno\">  698</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00699\"></a><span class=\"lineno\">  699</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00701\"></a><span class=\"lineno\">  701</span>&#160;        <span class=\"comment\">// Unsigned int vector types</span></div>\n<div class=\"line\"><a name=\"l00702\"></a><span class=\"lineno\">  702</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00705\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">  705</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">lowp_uint8</a>;</div>\n<div class=\"line\"><a name=\"l00706\"></a><span class=\"lineno\">  706</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00709\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">  709</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">lowp_uint16</a>;</div>\n<div class=\"line\"><a name=\"l00710\"></a><span class=\"lineno\">  710</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00713\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">  713</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">lowp_uint32</a>;</div>\n<div class=\"line\"><a name=\"l00714\"></a><span class=\"lineno\">  714</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00717\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">  717</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">lowp_uint64</a>;</div>\n<div class=\"line\"><a name=\"l00718\"></a><span class=\"lineno\">  718</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00719\"></a><span class=\"lineno\">  719</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00722\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">  722</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">lowp_uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00723\"></a><span class=\"lineno\">  723</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00726\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">  726</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">lowp_uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00730\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">  730</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">lowp_uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00731\"></a><span class=\"lineno\">  731</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00734\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">  734</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">lowp_uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00735\"></a><span class=\"lineno\">  735</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00736\"></a><span class=\"lineno\">  736</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00739\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">  739</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">lowp_u8</a>;</div>\n<div class=\"line\"><a name=\"l00740\"></a><span class=\"lineno\">  740</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00743\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">  743</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">lowp_u16</a>;</div>\n<div class=\"line\"><a name=\"l00744\"></a><span class=\"lineno\">  744</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00747\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">  747</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">lowp_u32</a>;</div>\n<div class=\"line\"><a name=\"l00748\"></a><span class=\"lineno\">  748</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00751\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">  751</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">lowp_u64</a>;</div>\n<div class=\"line\"><a name=\"l00752\"></a><span class=\"lineno\">  752</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00753\"></a><span class=\"lineno\">  753</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00754\"></a><span class=\"lineno\">  754</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00757\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">  757</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">mediump_uint8</a>;</div>\n<div class=\"line\"><a name=\"l00758\"></a><span class=\"lineno\">  758</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00761\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">  761</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">mediump_uint16</a>;</div>\n<div class=\"line\"><a name=\"l00762\"></a><span class=\"lineno\">  762</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00765\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">  765</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">mediump_uint32</a>;</div>\n<div class=\"line\"><a name=\"l00766\"></a><span class=\"lineno\">  766</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00769\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">  769</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">mediump_uint64</a>;</div>\n<div class=\"line\"><a name=\"l00770\"></a><span class=\"lineno\">  770</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00773\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">  773</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">mediump_uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00774\"></a><span class=\"lineno\">  774</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00777\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">  777</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">mediump_uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00778\"></a><span class=\"lineno\">  778</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00781\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">  781</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">mediump_uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00782\"></a><span class=\"lineno\">  782</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00785\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">  785</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">mediump_uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00786\"></a><span class=\"lineno\">  786</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00789\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">  789</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">mediump_u8</a>;</div>\n<div class=\"line\"><a name=\"l00790\"></a><span class=\"lineno\">  790</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00793\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">  793</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">mediump_u16</a>;</div>\n<div class=\"line\"><a name=\"l00794\"></a><span class=\"lineno\">  794</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00797\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">  797</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">mediump_u32</a>;</div>\n<div class=\"line\"><a name=\"l00798\"></a><span class=\"lineno\">  798</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00801\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">  801</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">mediump_u64</a>;</div>\n<div class=\"line\"><a name=\"l00802\"></a><span class=\"lineno\">  802</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00803\"></a><span class=\"lineno\">  803</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00804\"></a><span class=\"lineno\">  804</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00807\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">  807</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">highp_uint8</a>;</div>\n<div class=\"line\"><a name=\"l00808\"></a><span class=\"lineno\">  808</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00811\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">  811</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">highp_uint16</a>;</div>\n<div class=\"line\"><a name=\"l00812\"></a><span class=\"lineno\">  812</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00815\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">  815</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">highp_uint32</a>;</div>\n<div class=\"line\"><a name=\"l00816\"></a><span class=\"lineno\">  816</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00819\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">  819</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">highp_uint64</a>;</div>\n<div class=\"line\"><a name=\"l00820\"></a><span class=\"lineno\">  820</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00823\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">  823</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">highp_uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00824\"></a><span class=\"lineno\">  824</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00827\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">  827</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">highp_uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00828\"></a><span class=\"lineno\">  828</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00831\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">  831</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">highp_uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00832\"></a><span class=\"lineno\">  832</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00835\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">  835</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">highp_uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00836\"></a><span class=\"lineno\">  836</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00839\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">  839</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">highp_u8</a>;</div>\n<div class=\"line\"><a name=\"l00840\"></a><span class=\"lineno\">  840</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00843\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">  843</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">highp_u16</a>;</div>\n<div class=\"line\"><a name=\"l00844\"></a><span class=\"lineno\">  844</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00847\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">  847</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">highp_u32</a>;</div>\n<div class=\"line\"><a name=\"l00848\"></a><span class=\"lineno\">  848</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00851\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">  851</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">highp_u64</a>;</div>\n<div class=\"line\"><a name=\"l00852\"></a><span class=\"lineno\">  852</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00853\"></a><span class=\"lineno\">  853</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00854\"></a><span class=\"lineno\">  854</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00857\"></a><span class=\"lineno\">  857</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>;</div>\n<div class=\"line\"><a name=\"l00858\"></a><span class=\"lineno\">  858</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00861\"></a><span class=\"lineno\">  861</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>;</div>\n<div class=\"line\"><a name=\"l00862\"></a><span class=\"lineno\">  862</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00865\"></a><span class=\"lineno\">  865</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>;</div>\n<div class=\"line\"><a name=\"l00866\"></a><span class=\"lineno\">  866</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00869\"></a><span class=\"lineno\">  869</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00870\"></a><span class=\"lineno\">  870</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00871\"></a><span class=\"lineno\">  871</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_EXTENDED_INTEGER_TYPE</span></div>\n<div class=\"line\"><a name=\"l00872\"></a><span class=\"lineno\">  872</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">std::uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00873\"></a><span class=\"lineno\">  873</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">std::uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00874\"></a><span class=\"lineno\">  874</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">std::uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00875\"></a><span class=\"lineno\">  875</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">std::uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00876\"></a><span class=\"lineno\">  876</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00877\"></a><span class=\"lineno\">  877</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00880\"></a><span class=\"lineno\">  880</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00883\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">  883</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00884\"></a><span class=\"lineno\">  884</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00887\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">  887</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00888\"></a><span class=\"lineno\">  888</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00891\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">  891</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00892\"></a><span class=\"lineno\">  892</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00893\"></a><span class=\"lineno\">  893</span>&#160;</div>\n<div class=\"line\"><a name=\"l00896\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">  896</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">u8</a>;</div>\n<div class=\"line\"><a name=\"l00897\"></a><span class=\"lineno\">  897</span>&#160;</div>\n<div class=\"line\"><a name=\"l00900\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">  900</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">u16</a>;</div>\n<div class=\"line\"><a name=\"l00901\"></a><span class=\"lineno\">  901</span>&#160;</div>\n<div class=\"line\"><a name=\"l00904\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">  904</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">u32</a>;</div>\n<div class=\"line\"><a name=\"l00905\"></a><span class=\"lineno\">  905</span>&#160;</div>\n<div class=\"line\"><a name=\"l00908\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">  908</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">u64</a>;</div>\n<div class=\"line\"><a name=\"l00909\"></a><span class=\"lineno\">  909</span>&#160;</div>\n<div class=\"line\"><a name=\"l00910\"></a><span class=\"lineno\">  910</span>&#160;</div>\n<div class=\"line\"><a name=\"l00911\"></a><span class=\"lineno\">  911</span>&#160;</div>\n<div class=\"line\"><a name=\"l00914\"></a><span class=\"lineno\">  914</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u8, lowp&gt; lowp_u8vec1;</div>\n<div class=\"line\"><a name=\"l00915\"></a><span class=\"lineno\">  915</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00918\"></a><span class=\"lineno\">  918</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u8, lowp&gt; lowp_u8vec2;</div>\n<div class=\"line\"><a name=\"l00919\"></a><span class=\"lineno\">  919</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00922\"></a><span class=\"lineno\">  922</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u8, lowp&gt; lowp_u8vec3;</div>\n<div class=\"line\"><a name=\"l00923\"></a><span class=\"lineno\">  923</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00926\"></a><span class=\"lineno\">  926</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u8, lowp&gt; lowp_u8vec4;</div>\n<div class=\"line\"><a name=\"l00927\"></a><span class=\"lineno\">  927</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00928\"></a><span class=\"lineno\">  928</span>&#160;</div>\n<div class=\"line\"><a name=\"l00931\"></a><span class=\"lineno\">  931</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u8, mediump&gt; mediump_u8vec1;</div>\n<div class=\"line\"><a name=\"l00932\"></a><span class=\"lineno\">  932</span>&#160;</div>\n<div class=\"line\"><a name=\"l00935\"></a><span class=\"lineno\">  935</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u8, mediump&gt; mediump_u8vec2;</div>\n<div class=\"line\"><a name=\"l00936\"></a><span class=\"lineno\">  936</span>&#160;</div>\n<div class=\"line\"><a name=\"l00939\"></a><span class=\"lineno\">  939</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u8, mediump&gt; mediump_u8vec3;</div>\n<div class=\"line\"><a name=\"l00940\"></a><span class=\"lineno\">  940</span>&#160;</div>\n<div class=\"line\"><a name=\"l00943\"></a><span class=\"lineno\">  943</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u8, mediump&gt; mediump_u8vec4;</div>\n<div class=\"line\"><a name=\"l00944\"></a><span class=\"lineno\">  944</span>&#160;</div>\n<div class=\"line\"><a name=\"l00945\"></a><span class=\"lineno\">  945</span>&#160;</div>\n<div class=\"line\"><a name=\"l00948\"></a><span class=\"lineno\">  948</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u8, highp&gt; highp_u8vec1;</div>\n<div class=\"line\"><a name=\"l00949\"></a><span class=\"lineno\">  949</span>&#160;</div>\n<div class=\"line\"><a name=\"l00952\"></a><span class=\"lineno\">  952</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u8, highp&gt; highp_u8vec2;</div>\n<div class=\"line\"><a name=\"l00953\"></a><span class=\"lineno\">  953</span>&#160;</div>\n<div class=\"line\"><a name=\"l00956\"></a><span class=\"lineno\">  956</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u8, highp&gt; highp_u8vec3;</div>\n<div class=\"line\"><a name=\"l00957\"></a><span class=\"lineno\">  957</span>&#160;</div>\n<div class=\"line\"><a name=\"l00960\"></a><span class=\"lineno\">  960</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u8, highp&gt; highp_u8vec4;</div>\n<div class=\"line\"><a name=\"l00961\"></a><span class=\"lineno\">  961</span>&#160;</div>\n<div class=\"line\"><a name=\"l00962\"></a><span class=\"lineno\">  962</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00963\"></a><span class=\"lineno\">  963</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u8vec1                             <a class=\"code\" href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">u8vec1</a>;</div>\n<div class=\"line\"><a name=\"l00964\"></a><span class=\"lineno\">  964</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u8vec2                             <a class=\"code\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a>;</div>\n<div class=\"line\"><a name=\"l00965\"></a><span class=\"lineno\">  965</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u8vec3                             <a class=\"code\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">u8vec3</a>;</div>\n<div class=\"line\"><a name=\"l00966\"></a><span class=\"lineno\">  966</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u8vec4                             <a class=\"code\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a>;</div>\n<div class=\"line\"><a name=\"l00967\"></a><span class=\"lineno\">  967</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00968\"></a><span class=\"lineno\">  968</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u8vec1                  <a class=\"code\" href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">u8vec1</a>;</div>\n<div class=\"line\"><a name=\"l00969\"></a><span class=\"lineno\">  969</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u8vec2                  <a class=\"code\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a>;</div>\n<div class=\"line\"><a name=\"l00970\"></a><span class=\"lineno\">  970</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u8vec3                  <a class=\"code\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">u8vec3</a>;</div>\n<div class=\"line\"><a name=\"l00971\"></a><span class=\"lineno\">  971</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u8vec4                  <a class=\"code\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a>; </div>\n<div class=\"line\"><a name=\"l00972\"></a><span class=\"lineno\">  972</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00973\"></a><span class=\"lineno\">  973</span>&#160;        <span class=\"keyword\">typedef</span> highp_u8vec1                    <a class=\"code\" href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">u8vec1</a>;</div>\n<div class=\"line\"><a name=\"l00976\"></a><span class=\"lineno\">  976</span>&#160;</div>\n<div class=\"line\"><a name=\"l00979\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">  979</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u8vec2                    <a class=\"code\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a>;</div>\n<div class=\"line\"><a name=\"l00980\"></a><span class=\"lineno\">  980</span>&#160;</div>\n<div class=\"line\"><a name=\"l00983\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">  983</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u8vec3                    <a class=\"code\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">u8vec3</a>;</div>\n<div class=\"line\"><a name=\"l00984\"></a><span class=\"lineno\">  984</span>&#160;</div>\n<div class=\"line\"><a name=\"l00987\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">  987</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u8vec4                    <a class=\"code\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a>;</div>\n<div class=\"line\"><a name=\"l00988\"></a><span class=\"lineno\">  988</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00989\"></a><span class=\"lineno\">  989</span>&#160;</div>\n<div class=\"line\"><a name=\"l00990\"></a><span class=\"lineno\">  990</span>&#160;</div>\n<div class=\"line\"><a name=\"l00993\"></a><span class=\"lineno\">  993</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u16, lowp&gt;               lowp_u16vec1;</div>\n<div class=\"line\"><a name=\"l00994\"></a><span class=\"lineno\">  994</span>&#160;</div>\n<div class=\"line\"><a name=\"l00997\"></a><span class=\"lineno\">  997</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u16, lowp&gt;               lowp_u16vec2;</div>\n<div class=\"line\"><a name=\"l00998\"></a><span class=\"lineno\">  998</span>&#160;</div>\n<div class=\"line\"><a name=\"l01001\"></a><span class=\"lineno\"> 1001</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u16, lowp&gt;               lowp_u16vec3;</div>\n<div class=\"line\"><a name=\"l01002\"></a><span class=\"lineno\"> 1002</span>&#160;</div>\n<div class=\"line\"><a name=\"l01005\"></a><span class=\"lineno\"> 1005</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u16, lowp&gt;               lowp_u16vec4;</div>\n<div class=\"line\"><a name=\"l01006\"></a><span class=\"lineno\"> 1006</span>&#160;</div>\n<div class=\"line\"><a name=\"l01007\"></a><span class=\"lineno\"> 1007</span>&#160;</div>\n<div class=\"line\"><a name=\"l01010\"></a><span class=\"lineno\"> 1010</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u16, mediump&gt;            mediump_u16vec1;</div>\n<div class=\"line\"><a name=\"l01011\"></a><span class=\"lineno\"> 1011</span>&#160;</div>\n<div class=\"line\"><a name=\"l01014\"></a><span class=\"lineno\"> 1014</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u16, mediump&gt;            mediump_u16vec2;</div>\n<div class=\"line\"><a name=\"l01015\"></a><span class=\"lineno\"> 1015</span>&#160;</div>\n<div class=\"line\"><a name=\"l01018\"></a><span class=\"lineno\"> 1018</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u16, mediump&gt;            mediump_u16vec3;</div>\n<div class=\"line\"><a name=\"l01019\"></a><span class=\"lineno\"> 1019</span>&#160;</div>\n<div class=\"line\"><a name=\"l01022\"></a><span class=\"lineno\"> 1022</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u16, mediump&gt;            mediump_u16vec4;</div>\n<div class=\"line\"><a name=\"l01023\"></a><span class=\"lineno\"> 1023</span>&#160;</div>\n<div class=\"line\"><a name=\"l01024\"></a><span class=\"lineno\"> 1024</span>&#160;</div>\n<div class=\"line\"><a name=\"l01027\"></a><span class=\"lineno\"> 1027</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u16, highp&gt;              highp_u16vec1;</div>\n<div class=\"line\"><a name=\"l01028\"></a><span class=\"lineno\"> 1028</span>&#160;</div>\n<div class=\"line\"><a name=\"l01031\"></a><span class=\"lineno\"> 1031</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u16, highp&gt;              highp_u16vec2;</div>\n<div class=\"line\"><a name=\"l01032\"></a><span class=\"lineno\"> 1032</span>&#160;</div>\n<div class=\"line\"><a name=\"l01035\"></a><span class=\"lineno\"> 1035</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u16, highp&gt;              highp_u16vec3;</div>\n<div class=\"line\"><a name=\"l01036\"></a><span class=\"lineno\"> 1036</span>&#160;</div>\n<div class=\"line\"><a name=\"l01039\"></a><span class=\"lineno\"> 1039</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u16, highp&gt;              highp_u16vec4;</div>\n<div class=\"line\"><a name=\"l01040\"></a><span class=\"lineno\"> 1040</span>&#160;</div>\n<div class=\"line\"><a name=\"l01041\"></a><span class=\"lineno\"> 1041</span>&#160;</div>\n<div class=\"line\"><a name=\"l01042\"></a><span class=\"lineno\"> 1042</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l01043\"></a><span class=\"lineno\"> 1043</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u16vec1                    <a class=\"code\" href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">u16vec1</a>;</div>\n<div class=\"line\"><a name=\"l01044\"></a><span class=\"lineno\"> 1044</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u16vec2                    <a class=\"code\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a>;</div>\n<div class=\"line\"><a name=\"l01045\"></a><span class=\"lineno\"> 1045</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u16vec3                    <a class=\"code\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">u16vec3</a>;</div>\n<div class=\"line\"><a name=\"l01046\"></a><span class=\"lineno\"> 1046</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u16vec4                    <a class=\"code\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a>;</div>\n<div class=\"line\"><a name=\"l01047\"></a><span class=\"lineno\"> 1047</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l01048\"></a><span class=\"lineno\"> 1048</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u16vec1                 <a class=\"code\" href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">u16vec1</a>;</div>\n<div class=\"line\"><a name=\"l01049\"></a><span class=\"lineno\"> 1049</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u16vec2                 <a class=\"code\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a>;</div>\n<div class=\"line\"><a name=\"l01050\"></a><span class=\"lineno\"> 1050</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u16vec3                 <a class=\"code\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">u16vec3</a>;</div>\n<div class=\"line\"><a name=\"l01051\"></a><span class=\"lineno\"> 1051</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u16vec4                 <a class=\"code\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a>;</div>\n<div class=\"line\"><a name=\"l01052\"></a><span class=\"lineno\"> 1052</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l01053\"></a><span class=\"lineno\"> 1053</span>&#160;        <span class=\"keyword\">typedef</span> highp_u16vec1                   <a class=\"code\" href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">u16vec1</a>;</div>\n<div class=\"line\"><a name=\"l01056\"></a><span class=\"lineno\"> 1056</span>&#160;</div>\n<div class=\"line\"><a name=\"l01059\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\"> 1059</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u16vec2                   <a class=\"code\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a>;</div>\n<div class=\"line\"><a name=\"l01060\"></a><span class=\"lineno\"> 1060</span>&#160;</div>\n<div class=\"line\"><a name=\"l01063\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\"> 1063</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u16vec3                   <a class=\"code\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">u16vec3</a>;</div>\n<div class=\"line\"><a name=\"l01064\"></a><span class=\"lineno\"> 1064</span>&#160;</div>\n<div class=\"line\"><a name=\"l01067\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\"> 1067</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u16vec4                   <a class=\"code\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a>;</div>\n<div class=\"line\"><a name=\"l01068\"></a><span class=\"lineno\"> 1068</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l01069\"></a><span class=\"lineno\"> 1069</span>&#160;</div>\n<div class=\"line\"><a name=\"l01070\"></a><span class=\"lineno\"> 1070</span>&#160;</div>\n<div class=\"line\"><a name=\"l01073\"></a><span class=\"lineno\"> 1073</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u32, lowp&gt;               lowp_u32vec1;</div>\n<div class=\"line\"><a name=\"l01074\"></a><span class=\"lineno\"> 1074</span>&#160;</div>\n<div class=\"line\"><a name=\"l01077\"></a><span class=\"lineno\"> 1077</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u32, lowp&gt;               lowp_u32vec2;</div>\n<div class=\"line\"><a name=\"l01078\"></a><span class=\"lineno\"> 1078</span>&#160;</div>\n<div class=\"line\"><a name=\"l01081\"></a><span class=\"lineno\"> 1081</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u32, lowp&gt;               lowp_u32vec3;</div>\n<div class=\"line\"><a name=\"l01082\"></a><span class=\"lineno\"> 1082</span>&#160;</div>\n<div class=\"line\"><a name=\"l01085\"></a><span class=\"lineno\"> 1085</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u32, lowp&gt;               lowp_u32vec4;</div>\n<div class=\"line\"><a name=\"l01086\"></a><span class=\"lineno\"> 1086</span>&#160;</div>\n<div class=\"line\"><a name=\"l01087\"></a><span class=\"lineno\"> 1087</span>&#160;</div>\n<div class=\"line\"><a name=\"l01090\"></a><span class=\"lineno\"> 1090</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u32, mediump&gt;            mediump_u32vec1;</div>\n<div class=\"line\"><a name=\"l01091\"></a><span class=\"lineno\"> 1091</span>&#160;</div>\n<div class=\"line\"><a name=\"l01094\"></a><span class=\"lineno\"> 1094</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u32, mediump&gt;            mediump_u32vec2;</div>\n<div class=\"line\"><a name=\"l01095\"></a><span class=\"lineno\"> 1095</span>&#160;</div>\n<div class=\"line\"><a name=\"l01098\"></a><span class=\"lineno\"> 1098</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u32, mediump&gt;            mediump_u32vec3;</div>\n<div class=\"line\"><a name=\"l01099\"></a><span class=\"lineno\"> 1099</span>&#160;</div>\n<div class=\"line\"><a name=\"l01102\"></a><span class=\"lineno\"> 1102</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u32, mediump&gt;            mediump_u32vec4;</div>\n<div class=\"line\"><a name=\"l01103\"></a><span class=\"lineno\"> 1103</span>&#160;</div>\n<div class=\"line\"><a name=\"l01104\"></a><span class=\"lineno\"> 1104</span>&#160;</div>\n<div class=\"line\"><a name=\"l01107\"></a><span class=\"lineno\"> 1107</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u32, highp&gt;              highp_u32vec1;</div>\n<div class=\"line\"><a name=\"l01108\"></a><span class=\"lineno\"> 1108</span>&#160;</div>\n<div class=\"line\"><a name=\"l01111\"></a><span class=\"lineno\"> 1111</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u32, highp&gt;              highp_u32vec2;</div>\n<div class=\"line\"><a name=\"l01112\"></a><span class=\"lineno\"> 1112</span>&#160;</div>\n<div class=\"line\"><a name=\"l01115\"></a><span class=\"lineno\"> 1115</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u32, highp&gt;              highp_u32vec3;</div>\n<div class=\"line\"><a name=\"l01116\"></a><span class=\"lineno\"> 1116</span>&#160;</div>\n<div class=\"line\"><a name=\"l01119\"></a><span class=\"lineno\"> 1119</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u32, highp&gt;              highp_u32vec4;</div>\n<div class=\"line\"><a name=\"l01120\"></a><span class=\"lineno\"> 1120</span>&#160;</div>\n<div class=\"line\"><a name=\"l01121\"></a><span class=\"lineno\"> 1121</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l01122\"></a><span class=\"lineno\"> 1122</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u32vec1                    <a class=\"code\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>;</div>\n<div class=\"line\"><a name=\"l01123\"></a><span class=\"lineno\"> 1123</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u32vec2                    <a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>;</div>\n<div class=\"line\"><a name=\"l01124\"></a><span class=\"lineno\"> 1124</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u32vec3                    <a class=\"code\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>;</div>\n<div class=\"line\"><a name=\"l01125\"></a><span class=\"lineno\"> 1125</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u32vec4                    <a class=\"code\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>;</div>\n<div class=\"line\"><a name=\"l01126\"></a><span class=\"lineno\"> 1126</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l01127\"></a><span class=\"lineno\"> 1127</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u32vec1                 <a class=\"code\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>;</div>\n<div class=\"line\"><a name=\"l01128\"></a><span class=\"lineno\"> 1128</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u32vec2                 <a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>;</div>\n<div class=\"line\"><a name=\"l01129\"></a><span class=\"lineno\"> 1129</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u32vec3                 <a class=\"code\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>;</div>\n<div class=\"line\"><a name=\"l01130\"></a><span class=\"lineno\"> 1130</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u32vec4                 <a class=\"code\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>;</div>\n<div class=\"line\"><a name=\"l01131\"></a><span class=\"lineno\"> 1131</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l01132\"></a><span class=\"lineno\"> 1132</span>&#160;        <span class=\"keyword\">typedef</span> highp_u32vec1                   <a class=\"code\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>;</div>\n<div class=\"line\"><a name=\"l01135\"></a><span class=\"lineno\"> 1135</span>&#160;</div>\n<div class=\"line\"><a name=\"l01138\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\"> 1138</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u32vec2                   <a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>;</div>\n<div class=\"line\"><a name=\"l01139\"></a><span class=\"lineno\"> 1139</span>&#160;</div>\n<div class=\"line\"><a name=\"l01142\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\"> 1142</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u32vec3                   <a class=\"code\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>;</div>\n<div class=\"line\"><a name=\"l01143\"></a><span class=\"lineno\"> 1143</span>&#160;</div>\n<div class=\"line\"><a name=\"l01146\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\"> 1146</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u32vec4                   <a class=\"code\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>;</div>\n<div class=\"line\"><a name=\"l01147\"></a><span class=\"lineno\"> 1147</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l01148\"></a><span class=\"lineno\"> 1148</span>&#160;</div>\n<div class=\"line\"><a name=\"l01149\"></a><span class=\"lineno\"> 1149</span>&#160;</div>\n<div class=\"line\"><a name=\"l01152\"></a><span class=\"lineno\"> 1152</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u32, lowp&gt;               lowp_u32vec1;</div>\n<div class=\"line\"><a name=\"l01153\"></a><span class=\"lineno\"> 1153</span>&#160;</div>\n<div class=\"line\"><a name=\"l01156\"></a><span class=\"lineno\"> 1156</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u32, lowp&gt;               lowp_u32vec2;</div>\n<div class=\"line\"><a name=\"l01157\"></a><span class=\"lineno\"> 1157</span>&#160;</div>\n<div class=\"line\"><a name=\"l01160\"></a><span class=\"lineno\"> 1160</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u32, lowp&gt;               lowp_u32vec3;</div>\n<div class=\"line\"><a name=\"l01161\"></a><span class=\"lineno\"> 1161</span>&#160;</div>\n<div class=\"line\"><a name=\"l01164\"></a><span class=\"lineno\"> 1164</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u32, lowp&gt;               lowp_u32vec4;</div>\n<div class=\"line\"><a name=\"l01165\"></a><span class=\"lineno\"> 1165</span>&#160;</div>\n<div class=\"line\"><a name=\"l01166\"></a><span class=\"lineno\"> 1166</span>&#160;</div>\n<div class=\"line\"><a name=\"l01169\"></a><span class=\"lineno\"> 1169</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u32, mediump&gt;            mediump_u32vec1;</div>\n<div class=\"line\"><a name=\"l01170\"></a><span class=\"lineno\"> 1170</span>&#160;</div>\n<div class=\"line\"><a name=\"l01173\"></a><span class=\"lineno\"> 1173</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u32, mediump&gt;            mediump_u32vec2;</div>\n<div class=\"line\"><a name=\"l01174\"></a><span class=\"lineno\"> 1174</span>&#160;</div>\n<div class=\"line\"><a name=\"l01177\"></a><span class=\"lineno\"> 1177</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u32, mediump&gt;            mediump_u32vec3;</div>\n<div class=\"line\"><a name=\"l01178\"></a><span class=\"lineno\"> 1178</span>&#160;</div>\n<div class=\"line\"><a name=\"l01181\"></a><span class=\"lineno\"> 1181</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u32, mediump&gt;            mediump_u32vec4;</div>\n<div class=\"line\"><a name=\"l01182\"></a><span class=\"lineno\"> 1182</span>&#160;</div>\n<div class=\"line\"><a name=\"l01183\"></a><span class=\"lineno\"> 1183</span>&#160;</div>\n<div class=\"line\"><a name=\"l01186\"></a><span class=\"lineno\"> 1186</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u32, highp&gt;              highp_u32vec1;</div>\n<div class=\"line\"><a name=\"l01187\"></a><span class=\"lineno\"> 1187</span>&#160;</div>\n<div class=\"line\"><a name=\"l01190\"></a><span class=\"lineno\"> 1190</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u32, highp&gt;              highp_u32vec2;</div>\n<div class=\"line\"><a name=\"l01191\"></a><span class=\"lineno\"> 1191</span>&#160;</div>\n<div class=\"line\"><a name=\"l01194\"></a><span class=\"lineno\"> 1194</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u32, highp&gt;              highp_u32vec3;</div>\n<div class=\"line\"><a name=\"l01195\"></a><span class=\"lineno\"> 1195</span>&#160;</div>\n<div class=\"line\"><a name=\"l01198\"></a><span class=\"lineno\"> 1198</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u32, highp&gt;              highp_u32vec4;</div>\n<div class=\"line\"><a name=\"l01199\"></a><span class=\"lineno\"> 1199</span>&#160;</div>\n<div class=\"line\"><a name=\"l01200\"></a><span class=\"lineno\"> 1200</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l01201\"></a><span class=\"lineno\"> 1201</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u32vec1                    <a class=\"code\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>;</div>\n<div class=\"line\"><a name=\"l01202\"></a><span class=\"lineno\"> 1202</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u32vec2                    <a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>;</div>\n<div class=\"line\"><a name=\"l01203\"></a><span class=\"lineno\"> 1203</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u32vec3                    <a class=\"code\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>;</div>\n<div class=\"line\"><a name=\"l01204\"></a><span class=\"lineno\"> 1204</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u32vec4                    <a class=\"code\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>;</div>\n<div class=\"line\"><a name=\"l01205\"></a><span class=\"lineno\"> 1205</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l01206\"></a><span class=\"lineno\"> 1206</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u32vec1                 <a class=\"code\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>;</div>\n<div class=\"line\"><a name=\"l01207\"></a><span class=\"lineno\"> 1207</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u32vec2                 <a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>;</div>\n<div class=\"line\"><a name=\"l01208\"></a><span class=\"lineno\"> 1208</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u32vec3                 <a class=\"code\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>;</div>\n<div class=\"line\"><a name=\"l01209\"></a><span class=\"lineno\"> 1209</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u32vec4                 <a class=\"code\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>;</div>\n<div class=\"line\"><a name=\"l01210\"></a><span class=\"lineno\"> 1210</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l01211\"></a><span class=\"lineno\"> 1211</span>&#160;        <span class=\"keyword\">typedef</span> highp_u32vec1                   <a class=\"code\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>;</div>\n<div class=\"line\"><a name=\"l01214\"></a><span class=\"lineno\"> 1214</span>&#160;</div>\n<div class=\"line\"><a name=\"l01217\"></a><span class=\"lineno\"> 1217</span>&#160;        <span class=\"keyword\">typedef</span> highp_u32vec2                   <a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>;</div>\n<div class=\"line\"><a name=\"l01218\"></a><span class=\"lineno\"> 1218</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01221\"></a><span class=\"lineno\"> 1221</span>&#160;        <span class=\"keyword\">typedef</span> highp_u32vec3                   <a class=\"code\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>;</div>\n<div class=\"line\"><a name=\"l01222\"></a><span class=\"lineno\"> 1222</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01225\"></a><span class=\"lineno\"> 1225</span>&#160;        <span class=\"keyword\">typedef</span> highp_u32vec4                   <a class=\"code\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>;</div>\n<div class=\"line\"><a name=\"l01226\"></a><span class=\"lineno\"> 1226</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l01227\"></a><span class=\"lineno\"> 1227</span>&#160;</div>\n<div class=\"line\"><a name=\"l01228\"></a><span class=\"lineno\"> 1228</span>&#160;</div>\n<div class=\"line\"><a name=\"l01229\"></a><span class=\"lineno\"> 1229</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01232\"></a><span class=\"lineno\"> 1232</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u64, lowp&gt;               lowp_u64vec1;</div>\n<div class=\"line\"><a name=\"l01233\"></a><span class=\"lineno\"> 1233</span>&#160;</div>\n<div class=\"line\"><a name=\"l01236\"></a><span class=\"lineno\"> 1236</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u64, lowp&gt;               lowp_u64vec2;</div>\n<div class=\"line\"><a name=\"l01237\"></a><span class=\"lineno\"> 1237</span>&#160;</div>\n<div class=\"line\"><a name=\"l01240\"></a><span class=\"lineno\"> 1240</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u64, lowp&gt;               lowp_u64vec3;</div>\n<div class=\"line\"><a name=\"l01241\"></a><span class=\"lineno\"> 1241</span>&#160;</div>\n<div class=\"line\"><a name=\"l01244\"></a><span class=\"lineno\"> 1244</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u64, lowp&gt;               lowp_u64vec4;</div>\n<div class=\"line\"><a name=\"l01245\"></a><span class=\"lineno\"> 1245</span>&#160;</div>\n<div class=\"line\"><a name=\"l01246\"></a><span class=\"lineno\"> 1246</span>&#160;</div>\n<div class=\"line\"><a name=\"l01249\"></a><span class=\"lineno\"> 1249</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u64, mediump&gt;            mediump_u64vec1;</div>\n<div class=\"line\"><a name=\"l01250\"></a><span class=\"lineno\"> 1250</span>&#160;</div>\n<div class=\"line\"><a name=\"l01253\"></a><span class=\"lineno\"> 1253</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u64, mediump&gt;            mediump_u64vec2;</div>\n<div class=\"line\"><a name=\"l01254\"></a><span class=\"lineno\"> 1254</span>&#160;</div>\n<div class=\"line\"><a name=\"l01257\"></a><span class=\"lineno\"> 1257</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u64, mediump&gt;            mediump_u64vec3;</div>\n<div class=\"line\"><a name=\"l01258\"></a><span class=\"lineno\"> 1258</span>&#160;</div>\n<div class=\"line\"><a name=\"l01261\"></a><span class=\"lineno\"> 1261</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u64, mediump&gt;            mediump_u64vec4;</div>\n<div class=\"line\"><a name=\"l01262\"></a><span class=\"lineno\"> 1262</span>&#160;</div>\n<div class=\"line\"><a name=\"l01263\"></a><span class=\"lineno\"> 1263</span>&#160;</div>\n<div class=\"line\"><a name=\"l01266\"></a><span class=\"lineno\"> 1266</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u64, highp&gt;              highp_u64vec1;</div>\n<div class=\"line\"><a name=\"l01267\"></a><span class=\"lineno\"> 1267</span>&#160;</div>\n<div class=\"line\"><a name=\"l01270\"></a><span class=\"lineno\"> 1270</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u64, highp&gt;              highp_u64vec2;</div>\n<div class=\"line\"><a name=\"l01271\"></a><span class=\"lineno\"> 1271</span>&#160;</div>\n<div class=\"line\"><a name=\"l01274\"></a><span class=\"lineno\"> 1274</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u64, highp&gt;              highp_u64vec3;</div>\n<div class=\"line\"><a name=\"l01275\"></a><span class=\"lineno\"> 1275</span>&#160;</div>\n<div class=\"line\"><a name=\"l01278\"></a><span class=\"lineno\"> 1278</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u64, highp&gt;              highp_u64vec4;</div>\n<div class=\"line\"><a name=\"l01279\"></a><span class=\"lineno\"> 1279</span>&#160;</div>\n<div class=\"line\"><a name=\"l01280\"></a><span class=\"lineno\"> 1280</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l01281\"></a><span class=\"lineno\"> 1281</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u64vec1                    <a class=\"code\" href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">u64vec1</a>;</div>\n<div class=\"line\"><a name=\"l01282\"></a><span class=\"lineno\"> 1282</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u64vec2                    <a class=\"code\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">u64vec2</a>;</div>\n<div class=\"line\"><a name=\"l01283\"></a><span class=\"lineno\"> 1283</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u64vec3                    <a class=\"code\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">u64vec3</a>;</div>\n<div class=\"line\"><a name=\"l01284\"></a><span class=\"lineno\"> 1284</span>&#160;        <span class=\"keyword\">typedef</span> lowp_u64vec4                    <a class=\"code\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">u64vec4</a>;</div>\n<div class=\"line\"><a name=\"l01285\"></a><span class=\"lineno\"> 1285</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_UINT))</span></div>\n<div class=\"line\"><a name=\"l01286\"></a><span class=\"lineno\"> 1286</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u64vec1                 <a class=\"code\" href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">u64vec1</a>;</div>\n<div class=\"line\"><a name=\"l01287\"></a><span class=\"lineno\"> 1287</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u64vec2                 <a class=\"code\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">u64vec2</a>;</div>\n<div class=\"line\"><a name=\"l01288\"></a><span class=\"lineno\"> 1288</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u64vec3                 <a class=\"code\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">u64vec3</a>;</div>\n<div class=\"line\"><a name=\"l01289\"></a><span class=\"lineno\"> 1289</span>&#160;        <span class=\"keyword\">typedef</span> mediump_u64vec4                 <a class=\"code\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">u64vec4</a>;</div>\n<div class=\"line\"><a name=\"l01290\"></a><span class=\"lineno\"> 1290</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l01291\"></a><span class=\"lineno\"> 1291</span>&#160;        <span class=\"keyword\">typedef</span> highp_u64vec1                   <a class=\"code\" href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">u64vec1</a>;</div>\n<div class=\"line\"><a name=\"l01294\"></a><span class=\"lineno\"> 1294</span>&#160;</div>\n<div class=\"line\"><a name=\"l01297\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\"> 1297</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u64vec2                   <a class=\"code\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">u64vec2</a>;</div>\n<div class=\"line\"><a name=\"l01298\"></a><span class=\"lineno\"> 1298</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01301\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\"> 1301</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u64vec3                   <a class=\"code\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">u64vec3</a>;</div>\n<div class=\"line\"><a name=\"l01302\"></a><span class=\"lineno\"> 1302</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01305\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\"> 1305</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_u64vec4                   <a class=\"code\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">u64vec4</a>;</div>\n<div class=\"line\"><a name=\"l01306\"></a><span class=\"lineno\"> 1306</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l01307\"></a><span class=\"lineno\"> 1307</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01308\"></a><span class=\"lineno\"> 1308</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01310\"></a><span class=\"lineno\"> 1310</span>&#160;        <span class=\"comment\">// Float vector types</span></div>\n<div class=\"line\"><a name=\"l01311\"></a><span class=\"lineno\"> 1311</span>&#160;</div>\n<div class=\"line\"><a name=\"l01314\"></a><span class=\"lineno\"> 1314</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 lowp_float32;</div>\n<div class=\"line\"><a name=\"l01315\"></a><span class=\"lineno\"> 1315</span>&#160;</div>\n<div class=\"line\"><a name=\"l01318\"></a><span class=\"lineno\"> 1318</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 lowp_float64;</div>\n<div class=\"line\"><a name=\"l01319\"></a><span class=\"lineno\"> 1319</span>&#160;</div>\n<div class=\"line\"><a name=\"l01322\"></a><span class=\"lineno\"> 1322</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 lowp_float32_t;</div>\n<div class=\"line\"><a name=\"l01323\"></a><span class=\"lineno\"> 1323</span>&#160;</div>\n<div class=\"line\"><a name=\"l01326\"></a><span class=\"lineno\"> 1326</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 lowp_float64_t;</div>\n<div class=\"line\"><a name=\"l01327\"></a><span class=\"lineno\"> 1327</span>&#160;</div>\n<div class=\"line\"><a name=\"l01330\"></a><span class=\"lineno\"> 1330</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a> lowp_f32;</div>\n<div class=\"line\"><a name=\"l01331\"></a><span class=\"lineno\"> 1331</span>&#160;</div>\n<div class=\"line\"><a name=\"l01334\"></a><span class=\"lineno\"> 1334</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a> lowp_f64;</div>\n<div class=\"line\"><a name=\"l01335\"></a><span class=\"lineno\"> 1335</span>&#160;</div>\n<div class=\"line\"><a name=\"l01338\"></a><span class=\"lineno\"> 1338</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 lowp_float32;</div>\n<div class=\"line\"><a name=\"l01339\"></a><span class=\"lineno\"> 1339</span>&#160;</div>\n<div class=\"line\"><a name=\"l01342\"></a><span class=\"lineno\"> 1342</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 lowp_float64;</div>\n<div class=\"line\"><a name=\"l01343\"></a><span class=\"lineno\"> 1343</span>&#160;</div>\n<div class=\"line\"><a name=\"l01346\"></a><span class=\"lineno\"> 1346</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 lowp_float32_t;</div>\n<div class=\"line\"><a name=\"l01347\"></a><span class=\"lineno\"> 1347</span>&#160;</div>\n<div class=\"line\"><a name=\"l01350\"></a><span class=\"lineno\"> 1350</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 lowp_float64_t;</div>\n<div class=\"line\"><a name=\"l01351\"></a><span class=\"lineno\"> 1351</span>&#160;</div>\n<div class=\"line\"><a name=\"l01354\"></a><span class=\"lineno\"> 1354</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a> lowp_f32;</div>\n<div class=\"line\"><a name=\"l01355\"></a><span class=\"lineno\"> 1355</span>&#160;</div>\n<div class=\"line\"><a name=\"l01358\"></a><span class=\"lineno\"> 1358</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a> lowp_f64;</div>\n<div class=\"line\"><a name=\"l01359\"></a><span class=\"lineno\"> 1359</span>&#160;</div>\n<div class=\"line\"><a name=\"l01360\"></a><span class=\"lineno\"> 1360</span>&#160;</div>\n<div class=\"line\"><a name=\"l01363\"></a><span class=\"lineno\"> 1363</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 lowp_float32;</div>\n<div class=\"line\"><a name=\"l01364\"></a><span class=\"lineno\"> 1364</span>&#160;</div>\n<div class=\"line\"><a name=\"l01367\"></a><span class=\"lineno\"> 1367</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 lowp_float64;</div>\n<div class=\"line\"><a name=\"l01368\"></a><span class=\"lineno\"> 1368</span>&#160;</div>\n<div class=\"line\"><a name=\"l01371\"></a><span class=\"lineno\"> 1371</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 lowp_float32_t;</div>\n<div class=\"line\"><a name=\"l01372\"></a><span class=\"lineno\"> 1372</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01375\"></a><span class=\"lineno\"> 1375</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 lowp_float64_t;</div>\n<div class=\"line\"><a name=\"l01376\"></a><span class=\"lineno\"> 1376</span>&#160;</div>\n<div class=\"line\"><a name=\"l01379\"></a><span class=\"lineno\"> 1379</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a> lowp_f32;</div>\n<div class=\"line\"><a name=\"l01380\"></a><span class=\"lineno\"> 1380</span>&#160;</div>\n<div class=\"line\"><a name=\"l01383\"></a><span class=\"lineno\"> 1383</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a> lowp_f64;</div>\n<div class=\"line\"><a name=\"l01384\"></a><span class=\"lineno\"> 1384</span>&#160;</div>\n<div class=\"line\"><a name=\"l01385\"></a><span class=\"lineno\"> 1385</span>&#160;</div>\n<div class=\"line\"><a name=\"l01388\"></a><span class=\"lineno\"> 1388</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 mediump_float32;</div>\n<div class=\"line\"><a name=\"l01389\"></a><span class=\"lineno\"> 1389</span>&#160;</div>\n<div class=\"line\"><a name=\"l01392\"></a><span class=\"lineno\"> 1392</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 mediump_float64;</div>\n<div class=\"line\"><a name=\"l01393\"></a><span class=\"lineno\"> 1393</span>&#160;</div>\n<div class=\"line\"><a name=\"l01396\"></a><span class=\"lineno\"> 1396</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 mediump_float32_t;</div>\n<div class=\"line\"><a name=\"l01397\"></a><span class=\"lineno\"> 1397</span>&#160;</div>\n<div class=\"line\"><a name=\"l01400\"></a><span class=\"lineno\"> 1400</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 mediump_float64_t;</div>\n<div class=\"line\"><a name=\"l01401\"></a><span class=\"lineno\"> 1401</span>&#160;</div>\n<div class=\"line\"><a name=\"l01404\"></a><span class=\"lineno\"> 1404</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a> mediump_f32;</div>\n<div class=\"line\"><a name=\"l01405\"></a><span class=\"lineno\"> 1405</span>&#160;</div>\n<div class=\"line\"><a name=\"l01408\"></a><span class=\"lineno\"> 1408</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a> mediump_f64;</div>\n<div class=\"line\"><a name=\"l01409\"></a><span class=\"lineno\"> 1409</span>&#160;</div>\n<div class=\"line\"><a name=\"l01410\"></a><span class=\"lineno\"> 1410</span>&#160;</div>\n<div class=\"line\"><a name=\"l01413\"></a><span class=\"lineno\"> 1413</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 highp_float32;</div>\n<div class=\"line\"><a name=\"l01414\"></a><span class=\"lineno\"> 1414</span>&#160;</div>\n<div class=\"line\"><a name=\"l01417\"></a><span class=\"lineno\"> 1417</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 highp_float64;</div>\n<div class=\"line\"><a name=\"l01418\"></a><span class=\"lineno\"> 1418</span>&#160;</div>\n<div class=\"line\"><a name=\"l01421\"></a><span class=\"lineno\"> 1421</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 highp_float32_t;</div>\n<div class=\"line\"><a name=\"l01422\"></a><span class=\"lineno\"> 1422</span>&#160;</div>\n<div class=\"line\"><a name=\"l01425\"></a><span class=\"lineno\"> 1425</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 highp_float64_t;</div>\n<div class=\"line\"><a name=\"l01426\"></a><span class=\"lineno\"> 1426</span>&#160;</div>\n<div class=\"line\"><a name=\"l01429\"></a><span class=\"lineno\"> 1429</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a> highp_f32;</div>\n<div class=\"line\"><a name=\"l01430\"></a><span class=\"lineno\"> 1430</span>&#160;</div>\n<div class=\"line\"><a name=\"l01433\"></a><span class=\"lineno\"> 1433</span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a> highp_f64;</div>\n<div class=\"line\"><a name=\"l01434\"></a><span class=\"lineno\"> 1434</span>&#160;</div>\n<div class=\"line\"><a name=\"l01435\"></a><span class=\"lineno\"> 1435</span>&#160;</div>\n<div class=\"line\"><a name=\"l01436\"></a><span class=\"lineno\"> 1436</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l01437\"></a><span class=\"lineno\"> 1437</span>&#160;        <span class=\"keyword\">typedef</span> lowp_float32 <a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a>;</div>\n<div class=\"line\"><a name=\"l01440\"></a><span class=\"lineno\"> 1440</span>&#160;</div>\n<div class=\"line\"><a name=\"l01443\"></a><span class=\"lineno\"> 1443</span>&#160;        <span class=\"keyword\">typedef</span> lowp_float64 <a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a>;</div>\n<div class=\"line\"><a name=\"l01444\"></a><span class=\"lineno\"> 1444</span>&#160;</div>\n<div class=\"line\"><a name=\"l01447\"></a><span class=\"lineno\"> 1447</span>&#160;        <span class=\"keyword\">typedef</span> lowp_float32_t <a class=\"code\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">float32_t</a>;</div>\n<div class=\"line\"><a name=\"l01448\"></a><span class=\"lineno\"> 1448</span>&#160;</div>\n<div class=\"line\"><a name=\"l01451\"></a><span class=\"lineno\"> 1451</span>&#160;        <span class=\"keyword\">typedef</span> lowp_float64_t <a class=\"code\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">float64_t</a>;</div>\n<div class=\"line\"><a name=\"l01452\"></a><span class=\"lineno\"> 1452</span>&#160;</div>\n<div class=\"line\"><a name=\"l01455\"></a><span class=\"lineno\"> 1455</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32 <a class=\"code\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a>;</div>\n<div class=\"line\"><a name=\"l01456\"></a><span class=\"lineno\"> 1456</span>&#160;</div>\n<div class=\"line\"><a name=\"l01459\"></a><span class=\"lineno\"> 1459</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64 <a class=\"code\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a>;</div>\n<div class=\"line\"><a name=\"l01460\"></a><span class=\"lineno\"> 1460</span>&#160;</div>\n<div class=\"line\"><a name=\"l01461\"></a><span class=\"lineno\"> 1461</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l01462\"></a><span class=\"lineno\"> 1462</span>&#160;</div>\n<div class=\"line\"><a name=\"l01465\"></a><span class=\"lineno\"> 1465</span>&#160;        <span class=\"keyword\">typedef</span> mediump_float32 float32;</div>\n<div class=\"line\"><a name=\"l01466\"></a><span class=\"lineno\"> 1466</span>&#160;</div>\n<div class=\"line\"><a name=\"l01469\"></a><span class=\"lineno\"> 1469</span>&#160;        <span class=\"keyword\">typedef</span> mediump_float64 float64;</div>\n<div class=\"line\"><a name=\"l01470\"></a><span class=\"lineno\"> 1470</span>&#160;</div>\n<div class=\"line\"><a name=\"l01473\"></a><span class=\"lineno\"> 1473</span>&#160;        <span class=\"keyword\">typedef</span> mediump_float32 <a class=\"code\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">float32_t</a>;</div>\n<div class=\"line\"><a name=\"l01474\"></a><span class=\"lineno\"> 1474</span>&#160;</div>\n<div class=\"line\"><a name=\"l01477\"></a><span class=\"lineno\"> 1477</span>&#160;        <span class=\"keyword\">typedef</span> mediump_float64 <a class=\"code\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">float64_t</a>;</div>\n<div class=\"line\"><a name=\"l01478\"></a><span class=\"lineno\"> 1478</span>&#160;</div>\n<div class=\"line\"><a name=\"l01481\"></a><span class=\"lineno\"> 1481</span>&#160;        <span class=\"keyword\">typedef</span> mediump_float32 <a class=\"code\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a>;</div>\n<div class=\"line\"><a name=\"l01482\"></a><span class=\"lineno\"> 1482</span>&#160;</div>\n<div class=\"line\"><a name=\"l01485\"></a><span class=\"lineno\"> 1485</span>&#160;        <span class=\"keyword\">typedef</span> mediump_float64 <a class=\"code\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a>;</div>\n<div class=\"line\"><a name=\"l01486\"></a><span class=\"lineno\"> 1486</span>&#160;</div>\n<div class=\"line\"><a name=\"l01487\"></a><span class=\"lineno\"> 1487</span>&#160;<span class=\"preprocessor\">#else//(defined(GLM_PRECISION_HIGHP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l01488\"></a><span class=\"lineno\"> 1488</span>&#160;</div>\n<div class=\"line\"><a name=\"l01491\"></a><span class=\"lineno\"> 1491</span>&#160;        <span class=\"keyword\">typedef</span> highp_float32 float32;</div>\n<div class=\"line\"><a name=\"l01492\"></a><span class=\"lineno\"> 1492</span>&#160;</div>\n<div class=\"line\"><a name=\"l01495\"></a><span class=\"lineno\"> 1495</span>&#160;        <span class=\"keyword\">typedef</span> highp_float64 float64;</div>\n<div class=\"line\"><a name=\"l01496\"></a><span class=\"lineno\"> 1496</span>&#160;</div>\n<div class=\"line\"><a name=\"l01499\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\"> 1499</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_float32_t <a class=\"code\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">float32_t</a>;</div>\n<div class=\"line\"><a name=\"l01500\"></a><span class=\"lineno\"> 1500</span>&#160;</div>\n<div class=\"line\"><a name=\"l01503\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\"> 1503</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_float64_t <a class=\"code\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">float64_t</a>;</div>\n<div class=\"line\"><a name=\"l01504\"></a><span class=\"lineno\"> 1504</span>&#160;</div>\n<div class=\"line\"><a name=\"l01507\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"> 1507</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_float32_t <a class=\"code\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a>;</div>\n<div class=\"line\"><a name=\"l01508\"></a><span class=\"lineno\"> 1508</span>&#160;</div>\n<div class=\"line\"><a name=\"l01511\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\"> 1511</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_float64_t <a class=\"code\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a>;</div>\n<div class=\"line\"><a name=\"l01512\"></a><span class=\"lineno\"> 1512</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l01513\"></a><span class=\"lineno\"> 1513</span>&#160;</div>\n<div class=\"line\"><a name=\"l01514\"></a><span class=\"lineno\"> 1514</span>&#160;</div>\n<div class=\"line\"><a name=\"l01517\"></a><span class=\"lineno\"> 1517</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, lowp&gt; lowp_vec1;</div>\n<div class=\"line\"><a name=\"l01518\"></a><span class=\"lineno\"> 1518</span>&#160;</div>\n<div class=\"line\"><a name=\"l01521\"></a><span class=\"lineno\"> 1521</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, lowp&gt; <a class=\"code\" href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">lowp_vec2</a>;</div>\n<div class=\"line\"><a name=\"l01522\"></a><span class=\"lineno\"> 1522</span>&#160;</div>\n<div class=\"line\"><a name=\"l01525\"></a><span class=\"lineno\"> 1525</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, lowp&gt; <a class=\"code\" href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">lowp_vec3</a>;</div>\n<div class=\"line\"><a name=\"l01526\"></a><span class=\"lineno\"> 1526</span>&#160;</div>\n<div class=\"line\"><a name=\"l01529\"></a><span class=\"lineno\"> 1529</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, lowp&gt; <a class=\"code\" href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">lowp_vec4</a>;</div>\n<div class=\"line\"><a name=\"l01530\"></a><span class=\"lineno\"> 1530</span>&#160;</div>\n<div class=\"line\"><a name=\"l01533\"></a><span class=\"lineno\"> 1533</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, lowp&gt; lowp_fvec1;</div>\n<div class=\"line\"><a name=\"l01534\"></a><span class=\"lineno\"> 1534</span>&#160;</div>\n<div class=\"line\"><a name=\"l01537\"></a><span class=\"lineno\"> 1537</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, lowp&gt; lowp_fvec2;</div>\n<div class=\"line\"><a name=\"l01538\"></a><span class=\"lineno\"> 1538</span>&#160;</div>\n<div class=\"line\"><a name=\"l01541\"></a><span class=\"lineno\"> 1541</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, lowp&gt; lowp_fvec3;</div>\n<div class=\"line\"><a name=\"l01542\"></a><span class=\"lineno\"> 1542</span>&#160;</div>\n<div class=\"line\"><a name=\"l01545\"></a><span class=\"lineno\"> 1545</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, lowp&gt; lowp_fvec4;</div>\n<div class=\"line\"><a name=\"l01546\"></a><span class=\"lineno\"> 1546</span>&#160;</div>\n<div class=\"line\"><a name=\"l01547\"></a><span class=\"lineno\"> 1547</span>&#160;</div>\n<div class=\"line\"><a name=\"l01550\"></a><span class=\"lineno\"> 1550</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, mediump&gt; mediump_vec1;</div>\n<div class=\"line\"><a name=\"l01551\"></a><span class=\"lineno\"> 1551</span>&#160;</div>\n<div class=\"line\"><a name=\"l01554\"></a><span class=\"lineno\"> 1554</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, mediump&gt; <a class=\"code\" href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">mediump_vec2</a>;</div>\n<div class=\"line\"><a name=\"l01555\"></a><span class=\"lineno\"> 1555</span>&#160;</div>\n<div class=\"line\"><a name=\"l01558\"></a><span class=\"lineno\"> 1558</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, mediump&gt; <a class=\"code\" href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">mediump_vec3</a>;</div>\n<div class=\"line\"><a name=\"l01559\"></a><span class=\"lineno\"> 1559</span>&#160;</div>\n<div class=\"line\"><a name=\"l01562\"></a><span class=\"lineno\"> 1562</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, mediump&gt; <a class=\"code\" href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">mediump_vec4</a>;</div>\n<div class=\"line\"><a name=\"l01563\"></a><span class=\"lineno\"> 1563</span>&#160;</div>\n<div class=\"line\"><a name=\"l01566\"></a><span class=\"lineno\"> 1566</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, mediump&gt; mediump_fvec1;</div>\n<div class=\"line\"><a name=\"l01567\"></a><span class=\"lineno\"> 1567</span>&#160;</div>\n<div class=\"line\"><a name=\"l01570\"></a><span class=\"lineno\"> 1570</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, mediump&gt; mediump_fvec2;</div>\n<div class=\"line\"><a name=\"l01571\"></a><span class=\"lineno\"> 1571</span>&#160;</div>\n<div class=\"line\"><a name=\"l01574\"></a><span class=\"lineno\"> 1574</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, mediump&gt; mediump_fvec3;</div>\n<div class=\"line\"><a name=\"l01575\"></a><span class=\"lineno\"> 1575</span>&#160;</div>\n<div class=\"line\"><a name=\"l01578\"></a><span class=\"lineno\"> 1578</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, mediump&gt; mediump_fvec4;</div>\n<div class=\"line\"><a name=\"l01579\"></a><span class=\"lineno\"> 1579</span>&#160;</div>\n<div class=\"line\"><a name=\"l01580\"></a><span class=\"lineno\"> 1580</span>&#160;</div>\n<div class=\"line\"><a name=\"l01583\"></a><span class=\"lineno\"> 1583</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, highp&gt; highp_vec1;</div>\n<div class=\"line\"><a name=\"l01584\"></a><span class=\"lineno\"> 1584</span>&#160;</div>\n<div class=\"line\"><a name=\"l01587\"></a><span class=\"lineno\"> 1587</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, highp&gt; <a class=\"code\" href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">highp_vec2</a>;</div>\n<div class=\"line\"><a name=\"l01588\"></a><span class=\"lineno\"> 1588</span>&#160;</div>\n<div class=\"line\"><a name=\"l01591\"></a><span class=\"lineno\"> 1591</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, highp&gt; <a class=\"code\" href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">highp_vec3</a>;</div>\n<div class=\"line\"><a name=\"l01592\"></a><span class=\"lineno\"> 1592</span>&#160;</div>\n<div class=\"line\"><a name=\"l01595\"></a><span class=\"lineno\"> 1595</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, highp&gt; <a class=\"code\" href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">highp_vec4</a>;</div>\n<div class=\"line\"><a name=\"l01596\"></a><span class=\"lineno\"> 1596</span>&#160;</div>\n<div class=\"line\"><a name=\"l01599\"></a><span class=\"lineno\"> 1599</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, highp&gt; highp_fvec1;</div>\n<div class=\"line\"><a name=\"l01600\"></a><span class=\"lineno\"> 1600</span>&#160;</div>\n<div class=\"line\"><a name=\"l01603\"></a><span class=\"lineno\"> 1603</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, highp&gt; highp_fvec2;</div>\n<div class=\"line\"><a name=\"l01604\"></a><span class=\"lineno\"> 1604</span>&#160;</div>\n<div class=\"line\"><a name=\"l01607\"></a><span class=\"lineno\"> 1607</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, highp&gt; highp_fvec3;</div>\n<div class=\"line\"><a name=\"l01608\"></a><span class=\"lineno\"> 1608</span>&#160;</div>\n<div class=\"line\"><a name=\"l01611\"></a><span class=\"lineno\"> 1611</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, highp&gt; highp_fvec4;</div>\n<div class=\"line\"><a name=\"l01612\"></a><span class=\"lineno\"> 1612</span>&#160;</div>\n<div class=\"line\"><a name=\"l01613\"></a><span class=\"lineno\"> 1613</span>&#160;</div>\n<div class=\"line\"><a name=\"l01616\"></a><span class=\"lineno\"> 1616</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, f32, lowp&gt; lowp_f32vec1;</div>\n<div class=\"line\"><a name=\"l01617\"></a><span class=\"lineno\"> 1617</span>&#160;</div>\n<div class=\"line\"><a name=\"l01620\"></a><span class=\"lineno\"> 1620</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, f32, lowp&gt; lowp_f32vec2;</div>\n<div class=\"line\"><a name=\"l01621\"></a><span class=\"lineno\"> 1621</span>&#160;</div>\n<div class=\"line\"><a name=\"l01624\"></a><span class=\"lineno\"> 1624</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, f32, lowp&gt; lowp_f32vec3;</div>\n<div class=\"line\"><a name=\"l01625\"></a><span class=\"lineno\"> 1625</span>&#160;</div>\n<div class=\"line\"><a name=\"l01628\"></a><span class=\"lineno\"> 1628</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, f32, lowp&gt; lowp_f32vec4;</div>\n<div class=\"line\"><a name=\"l01629\"></a><span class=\"lineno\"> 1629</span>&#160;</div>\n<div class=\"line\"><a name=\"l01632\"></a><span class=\"lineno\"> 1632</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, f32, mediump&gt; mediump_f32vec1;</div>\n<div class=\"line\"><a name=\"l01633\"></a><span class=\"lineno\"> 1633</span>&#160;</div>\n<div class=\"line\"><a name=\"l01636\"></a><span class=\"lineno\"> 1636</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, f32, mediump&gt; mediump_f32vec2;</div>\n<div class=\"line\"><a name=\"l01637\"></a><span class=\"lineno\"> 1637</span>&#160;</div>\n<div class=\"line\"><a name=\"l01640\"></a><span class=\"lineno\"> 1640</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, f32, mediump&gt; mediump_f32vec3;</div>\n<div class=\"line\"><a name=\"l01641\"></a><span class=\"lineno\"> 1641</span>&#160;</div>\n<div class=\"line\"><a name=\"l01644\"></a><span class=\"lineno\"> 1644</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, f32, mediump&gt; mediump_f32vec4;</div>\n<div class=\"line\"><a name=\"l01645\"></a><span class=\"lineno\"> 1645</span>&#160;</div>\n<div class=\"line\"><a name=\"l01648\"></a><span class=\"lineno\"> 1648</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, f32, highp&gt; highp_f32vec1;</div>\n<div class=\"line\"><a name=\"l01649\"></a><span class=\"lineno\"> 1649</span>&#160;</div>\n<div class=\"line\"><a name=\"l01652\"></a><span class=\"lineno\"> 1652</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, f32, highp&gt; highp_f32vec2;</div>\n<div class=\"line\"><a name=\"l01653\"></a><span class=\"lineno\"> 1653</span>&#160;</div>\n<div class=\"line\"><a name=\"l01656\"></a><span class=\"lineno\"> 1656</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, f32, highp&gt; highp_f32vec3;</div>\n<div class=\"line\"><a name=\"l01657\"></a><span class=\"lineno\"> 1657</span>&#160;</div>\n<div class=\"line\"><a name=\"l01660\"></a><span class=\"lineno\"> 1660</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, f32, highp&gt; highp_f32vec4;</div>\n<div class=\"line\"><a name=\"l01661\"></a><span class=\"lineno\"> 1661</span>&#160;</div>\n<div class=\"line\"><a name=\"l01662\"></a><span class=\"lineno\"> 1662</span>&#160;</div>\n<div class=\"line\"><a name=\"l01665\"></a><span class=\"lineno\"> 1665</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, f64, lowp&gt; lowp_f64vec1;</div>\n<div class=\"line\"><a name=\"l01666\"></a><span class=\"lineno\"> 1666</span>&#160;</div>\n<div class=\"line\"><a name=\"l01669\"></a><span class=\"lineno\"> 1669</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, f64, lowp&gt; lowp_f64vec2;</div>\n<div class=\"line\"><a name=\"l01670\"></a><span class=\"lineno\"> 1670</span>&#160;</div>\n<div class=\"line\"><a name=\"l01673\"></a><span class=\"lineno\"> 1673</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, f64, lowp&gt; lowp_f64vec3;</div>\n<div class=\"line\"><a name=\"l01674\"></a><span class=\"lineno\"> 1674</span>&#160;</div>\n<div class=\"line\"><a name=\"l01677\"></a><span class=\"lineno\"> 1677</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, f64, lowp&gt; lowp_f64vec4;</div>\n<div class=\"line\"><a name=\"l01678\"></a><span class=\"lineno\"> 1678</span>&#160;</div>\n<div class=\"line\"><a name=\"l01681\"></a><span class=\"lineno\"> 1681</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, f64, mediump&gt; mediump_f64vec1;</div>\n<div class=\"line\"><a name=\"l01682\"></a><span class=\"lineno\"> 1682</span>&#160;</div>\n<div class=\"line\"><a name=\"l01685\"></a><span class=\"lineno\"> 1685</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, f64, mediump&gt; mediump_f64vec2;</div>\n<div class=\"line\"><a name=\"l01686\"></a><span class=\"lineno\"> 1686</span>&#160;</div>\n<div class=\"line\"><a name=\"l01689\"></a><span class=\"lineno\"> 1689</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, f64, mediump&gt; mediump_f64vec3;</div>\n<div class=\"line\"><a name=\"l01690\"></a><span class=\"lineno\"> 1690</span>&#160;</div>\n<div class=\"line\"><a name=\"l01693\"></a><span class=\"lineno\"> 1693</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, f64, mediump&gt; mediump_f64vec4;</div>\n<div class=\"line\"><a name=\"l01694\"></a><span class=\"lineno\"> 1694</span>&#160;</div>\n<div class=\"line\"><a name=\"l01697\"></a><span class=\"lineno\"> 1697</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, f64, highp&gt; highp_f64vec1;</div>\n<div class=\"line\"><a name=\"l01698\"></a><span class=\"lineno\"> 1698</span>&#160;</div>\n<div class=\"line\"><a name=\"l01701\"></a><span class=\"lineno\"> 1701</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, f64, highp&gt; highp_f64vec2;</div>\n<div class=\"line\"><a name=\"l01702\"></a><span class=\"lineno\"> 1702</span>&#160;</div>\n<div class=\"line\"><a name=\"l01705\"></a><span class=\"lineno\"> 1705</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, f64, highp&gt; highp_f64vec3;</div>\n<div class=\"line\"><a name=\"l01706\"></a><span class=\"lineno\"> 1706</span>&#160;</div>\n<div class=\"line\"><a name=\"l01709\"></a><span class=\"lineno\"> 1709</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, f64, highp&gt; highp_f64vec4;</div>\n<div class=\"line\"><a name=\"l01710\"></a><span class=\"lineno\"> 1710</span>&#160;</div>\n<div class=\"line\"><a name=\"l01711\"></a><span class=\"lineno\"> 1711</span>&#160;</div>\n<div class=\"line\"><a name=\"l01713\"></a><span class=\"lineno\"> 1713</span>&#160;        <span class=\"comment\">// Float matrix types</span></div>\n<div class=\"line\"><a name=\"l01714\"></a><span class=\"lineno\"> 1714</span>&#160;</div>\n<div class=\"line\"><a name=\"l01717\"></a><span class=\"lineno\"> 1717</span>&#160;        <span class=\"comment\">//typedef lowp_f32 lowp_fmat1x1;</span></div>\n<div class=\"line\"><a name=\"l01718\"></a><span class=\"lineno\"> 1718</span>&#160;</div>\n<div class=\"line\"><a name=\"l01721\"></a><span class=\"lineno\"> 1721</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, lowp&gt; lowp_fmat2x2;</div>\n<div class=\"line\"><a name=\"l01722\"></a><span class=\"lineno\"> 1722</span>&#160;</div>\n<div class=\"line\"><a name=\"l01725\"></a><span class=\"lineno\"> 1725</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f32, lowp&gt; lowp_fmat2x3;</div>\n<div class=\"line\"><a name=\"l01726\"></a><span class=\"lineno\"> 1726</span>&#160;</div>\n<div class=\"line\"><a name=\"l01729\"></a><span class=\"lineno\"> 1729</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f32, lowp&gt; lowp_fmat2x4;</div>\n<div class=\"line\"><a name=\"l01730\"></a><span class=\"lineno\"> 1730</span>&#160;</div>\n<div class=\"line\"><a name=\"l01733\"></a><span class=\"lineno\"> 1733</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f32, lowp&gt; lowp_fmat3x2;</div>\n<div class=\"line\"><a name=\"l01734\"></a><span class=\"lineno\"> 1734</span>&#160;</div>\n<div class=\"line\"><a name=\"l01737\"></a><span class=\"lineno\"> 1737</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, lowp&gt; lowp_fmat3x3;</div>\n<div class=\"line\"><a name=\"l01738\"></a><span class=\"lineno\"> 1738</span>&#160;</div>\n<div class=\"line\"><a name=\"l01741\"></a><span class=\"lineno\"> 1741</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f32, lowp&gt; lowp_fmat3x4;</div>\n<div class=\"line\"><a name=\"l01742\"></a><span class=\"lineno\"> 1742</span>&#160;</div>\n<div class=\"line\"><a name=\"l01745\"></a><span class=\"lineno\"> 1745</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f32, lowp&gt; lowp_fmat4x2;</div>\n<div class=\"line\"><a name=\"l01746\"></a><span class=\"lineno\"> 1746</span>&#160;</div>\n<div class=\"line\"><a name=\"l01749\"></a><span class=\"lineno\"> 1749</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f32, lowp&gt; lowp_fmat4x3;</div>\n<div class=\"line\"><a name=\"l01750\"></a><span class=\"lineno\"> 1750</span>&#160;</div>\n<div class=\"line\"><a name=\"l01753\"></a><span class=\"lineno\"> 1753</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, lowp&gt; lowp_fmat4x4;</div>\n<div class=\"line\"><a name=\"l01754\"></a><span class=\"lineno\"> 1754</span>&#160;</div>\n<div class=\"line\"><a name=\"l01757\"></a><span class=\"lineno\"> 1757</span>&#160;        <span class=\"comment\">//typedef lowp_fmat1x1 lowp_fmat1;</span></div>\n<div class=\"line\"><a name=\"l01758\"></a><span class=\"lineno\"> 1758</span>&#160;</div>\n<div class=\"line\"><a name=\"l01761\"></a><span class=\"lineno\"> 1761</span>&#160;        <span class=\"keyword\">typedef</span> lowp_fmat2x2 lowp_fmat2;</div>\n<div class=\"line\"><a name=\"l01762\"></a><span class=\"lineno\"> 1762</span>&#160;</div>\n<div class=\"line\"><a name=\"l01765\"></a><span class=\"lineno\"> 1765</span>&#160;        <span class=\"keyword\">typedef</span> lowp_fmat3x3 lowp_fmat3;</div>\n<div class=\"line\"><a name=\"l01766\"></a><span class=\"lineno\"> 1766</span>&#160;</div>\n<div class=\"line\"><a name=\"l01769\"></a><span class=\"lineno\"> 1769</span>&#160;        <span class=\"keyword\">typedef</span> lowp_fmat4x4 lowp_fmat4;</div>\n<div class=\"line\"><a name=\"l01770\"></a><span class=\"lineno\"> 1770</span>&#160;</div>\n<div class=\"line\"><a name=\"l01771\"></a><span class=\"lineno\"> 1771</span>&#160;</div>\n<div class=\"line\"><a name=\"l01774\"></a><span class=\"lineno\"> 1774</span>&#160;        <span class=\"comment\">//typedef mediump_f32 mediump_fmat1x1;</span></div>\n<div class=\"line\"><a name=\"l01775\"></a><span class=\"lineno\"> 1775</span>&#160;</div>\n<div class=\"line\"><a name=\"l01778\"></a><span class=\"lineno\"> 1778</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, mediump&gt; mediump_fmat2x2;</div>\n<div class=\"line\"><a name=\"l01779\"></a><span class=\"lineno\"> 1779</span>&#160;</div>\n<div class=\"line\"><a name=\"l01782\"></a><span class=\"lineno\"> 1782</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f32, mediump&gt; mediump_fmat2x3;</div>\n<div class=\"line\"><a name=\"l01783\"></a><span class=\"lineno\"> 1783</span>&#160;</div>\n<div class=\"line\"><a name=\"l01786\"></a><span class=\"lineno\"> 1786</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f32, mediump&gt; mediump_fmat2x4;</div>\n<div class=\"line\"><a name=\"l01787\"></a><span class=\"lineno\"> 1787</span>&#160;</div>\n<div class=\"line\"><a name=\"l01790\"></a><span class=\"lineno\"> 1790</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f32, mediump&gt; mediump_fmat3x2;</div>\n<div class=\"line\"><a name=\"l01791\"></a><span class=\"lineno\"> 1791</span>&#160;</div>\n<div class=\"line\"><a name=\"l01794\"></a><span class=\"lineno\"> 1794</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, mediump&gt; mediump_fmat3x3;</div>\n<div class=\"line\"><a name=\"l01795\"></a><span class=\"lineno\"> 1795</span>&#160;</div>\n<div class=\"line\"><a name=\"l01798\"></a><span class=\"lineno\"> 1798</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f32, mediump&gt; mediump_fmat3x4;</div>\n<div class=\"line\"><a name=\"l01799\"></a><span class=\"lineno\"> 1799</span>&#160;</div>\n<div class=\"line\"><a name=\"l01802\"></a><span class=\"lineno\"> 1802</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f32, mediump&gt; mediump_fmat4x2;</div>\n<div class=\"line\"><a name=\"l01803\"></a><span class=\"lineno\"> 1803</span>&#160;</div>\n<div class=\"line\"><a name=\"l01806\"></a><span class=\"lineno\"> 1806</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f32, mediump&gt; mediump_fmat4x3;</div>\n<div class=\"line\"><a name=\"l01807\"></a><span class=\"lineno\"> 1807</span>&#160;</div>\n<div class=\"line\"><a name=\"l01810\"></a><span class=\"lineno\"> 1810</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, mediump&gt; mediump_fmat4x4;</div>\n<div class=\"line\"><a name=\"l01811\"></a><span class=\"lineno\"> 1811</span>&#160;</div>\n<div class=\"line\"><a name=\"l01814\"></a><span class=\"lineno\"> 1814</span>&#160;        <span class=\"comment\">//typedef mediump_fmat1x1 mediump_fmat1;</span></div>\n<div class=\"line\"><a name=\"l01815\"></a><span class=\"lineno\"> 1815</span>&#160;</div>\n<div class=\"line\"><a name=\"l01818\"></a><span class=\"lineno\"> 1818</span>&#160;        <span class=\"keyword\">typedef</span> mediump_fmat2x2 mediump_fmat2;</div>\n<div class=\"line\"><a name=\"l01819\"></a><span class=\"lineno\"> 1819</span>&#160;</div>\n<div class=\"line\"><a name=\"l01822\"></a><span class=\"lineno\"> 1822</span>&#160;        <span class=\"keyword\">typedef</span> mediump_fmat3x3 mediump_fmat3;</div>\n<div class=\"line\"><a name=\"l01823\"></a><span class=\"lineno\"> 1823</span>&#160;</div>\n<div class=\"line\"><a name=\"l01826\"></a><span class=\"lineno\"> 1826</span>&#160;        <span class=\"keyword\">typedef</span> mediump_fmat4x4 mediump_fmat4;</div>\n<div class=\"line\"><a name=\"l01827\"></a><span class=\"lineno\"> 1827</span>&#160;</div>\n<div class=\"line\"><a name=\"l01828\"></a><span class=\"lineno\"> 1828</span>&#160;</div>\n<div class=\"line\"><a name=\"l01831\"></a><span class=\"lineno\"> 1831</span>&#160;        <span class=\"comment\">//typedef highp_f32 highp_fmat1x1;</span></div>\n<div class=\"line\"><a name=\"l01832\"></a><span class=\"lineno\"> 1832</span>&#160;</div>\n<div class=\"line\"><a name=\"l01835\"></a><span class=\"lineno\"> 1835</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, highp&gt; highp_fmat2x2;</div>\n<div class=\"line\"><a name=\"l01836\"></a><span class=\"lineno\"> 1836</span>&#160;</div>\n<div class=\"line\"><a name=\"l01839\"></a><span class=\"lineno\"> 1839</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f32, highp&gt; highp_fmat2x3;</div>\n<div class=\"line\"><a name=\"l01840\"></a><span class=\"lineno\"> 1840</span>&#160;</div>\n<div class=\"line\"><a name=\"l01843\"></a><span class=\"lineno\"> 1843</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f32, highp&gt; highp_fmat2x4;</div>\n<div class=\"line\"><a name=\"l01844\"></a><span class=\"lineno\"> 1844</span>&#160;</div>\n<div class=\"line\"><a name=\"l01847\"></a><span class=\"lineno\"> 1847</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f32, highp&gt; highp_fmat3x2;</div>\n<div class=\"line\"><a name=\"l01848\"></a><span class=\"lineno\"> 1848</span>&#160;</div>\n<div class=\"line\"><a name=\"l01851\"></a><span class=\"lineno\"> 1851</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, highp&gt; highp_fmat3x3;</div>\n<div class=\"line\"><a name=\"l01852\"></a><span class=\"lineno\"> 1852</span>&#160;</div>\n<div class=\"line\"><a name=\"l01855\"></a><span class=\"lineno\"> 1855</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f32, highp&gt; highp_fmat3x4;</div>\n<div class=\"line\"><a name=\"l01856\"></a><span class=\"lineno\"> 1856</span>&#160;</div>\n<div class=\"line\"><a name=\"l01859\"></a><span class=\"lineno\"> 1859</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f32, highp&gt; highp_fmat4x2;</div>\n<div class=\"line\"><a name=\"l01860\"></a><span class=\"lineno\"> 1860</span>&#160;</div>\n<div class=\"line\"><a name=\"l01863\"></a><span class=\"lineno\"> 1863</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f32, highp&gt; highp_fmat4x3;</div>\n<div class=\"line\"><a name=\"l01864\"></a><span class=\"lineno\"> 1864</span>&#160;</div>\n<div class=\"line\"><a name=\"l01867\"></a><span class=\"lineno\"> 1867</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, highp&gt; highp_fmat4x4;</div>\n<div class=\"line\"><a name=\"l01868\"></a><span class=\"lineno\"> 1868</span>&#160;</div>\n<div class=\"line\"><a name=\"l01871\"></a><span class=\"lineno\"> 1871</span>&#160;        <span class=\"comment\">//typedef highp_fmat1x1 highp_fmat1;</span></div>\n<div class=\"line\"><a name=\"l01872\"></a><span class=\"lineno\"> 1872</span>&#160;</div>\n<div class=\"line\"><a name=\"l01875\"></a><span class=\"lineno\"> 1875</span>&#160;        <span class=\"keyword\">typedef</span> highp_fmat2x2 highp_fmat2;</div>\n<div class=\"line\"><a name=\"l01876\"></a><span class=\"lineno\"> 1876</span>&#160;</div>\n<div class=\"line\"><a name=\"l01879\"></a><span class=\"lineno\"> 1879</span>&#160;        <span class=\"keyword\">typedef</span> highp_fmat3x3 highp_fmat3;</div>\n<div class=\"line\"><a name=\"l01880\"></a><span class=\"lineno\"> 1880</span>&#160;        </div>\n<div class=\"line\"><a name=\"l01883\"></a><span class=\"lineno\"> 1883</span>&#160;        <span class=\"keyword\">typedef</span> highp_fmat4x4 highp_fmat4;</div>\n<div class=\"line\"><a name=\"l01884\"></a><span class=\"lineno\"> 1884</span>&#160;</div>\n<div class=\"line\"><a name=\"l01885\"></a><span class=\"lineno\"> 1885</span>&#160;</div>\n<div class=\"line\"><a name=\"l01888\"></a><span class=\"lineno\"> 1888</span>&#160;        <span class=\"comment\">//typedef f32 lowp_f32mat1x1;</span></div>\n<div class=\"line\"><a name=\"l01889\"></a><span class=\"lineno\"> 1889</span>&#160;</div>\n<div class=\"line\"><a name=\"l01892\"></a><span class=\"lineno\"> 1892</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, lowp&gt; lowp_f32mat2x2;</div>\n<div class=\"line\"><a name=\"l01893\"></a><span class=\"lineno\"> 1893</span>&#160;</div>\n<div class=\"line\"><a name=\"l01896\"></a><span class=\"lineno\"> 1896</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f32, lowp&gt; lowp_f32mat2x3;</div>\n<div class=\"line\"><a name=\"l01897\"></a><span class=\"lineno\"> 1897</span>&#160;</div>\n<div class=\"line\"><a name=\"l01900\"></a><span class=\"lineno\"> 1900</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f32, lowp&gt; lowp_f32mat2x4;</div>\n<div class=\"line\"><a name=\"l01901\"></a><span class=\"lineno\"> 1901</span>&#160;</div>\n<div class=\"line\"><a name=\"l01904\"></a><span class=\"lineno\"> 1904</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f32, lowp&gt; lowp_f32mat3x2;</div>\n<div class=\"line\"><a name=\"l01905\"></a><span class=\"lineno\"> 1905</span>&#160;</div>\n<div class=\"line\"><a name=\"l01908\"></a><span class=\"lineno\"> 1908</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, lowp&gt; lowp_f32mat3x3;</div>\n<div class=\"line\"><a name=\"l01909\"></a><span class=\"lineno\"> 1909</span>&#160;</div>\n<div class=\"line\"><a name=\"l01912\"></a><span class=\"lineno\"> 1912</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f32, lowp&gt; lowp_f32mat3x4;</div>\n<div class=\"line\"><a name=\"l01913\"></a><span class=\"lineno\"> 1913</span>&#160;</div>\n<div class=\"line\"><a name=\"l01916\"></a><span class=\"lineno\"> 1916</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f32, lowp&gt; lowp_f32mat4x2;</div>\n<div class=\"line\"><a name=\"l01917\"></a><span class=\"lineno\"> 1917</span>&#160;</div>\n<div class=\"line\"><a name=\"l01920\"></a><span class=\"lineno\"> 1920</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f32, lowp&gt; lowp_f32mat4x3;</div>\n<div class=\"line\"><a name=\"l01921\"></a><span class=\"lineno\"> 1921</span>&#160;</div>\n<div class=\"line\"><a name=\"l01924\"></a><span class=\"lineno\"> 1924</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, lowp&gt; lowp_f32mat4x4;</div>\n<div class=\"line\"><a name=\"l01925\"></a><span class=\"lineno\"> 1925</span>&#160;</div>\n<div class=\"line\"><a name=\"l01928\"></a><span class=\"lineno\"> 1928</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f32, lowp&gt; lowp_f32mat1;</span></div>\n<div class=\"line\"><a name=\"l01929\"></a><span class=\"lineno\"> 1929</span>&#160;</div>\n<div class=\"line\"><a name=\"l01932\"></a><span class=\"lineno\"> 1932</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2x2 lowp_f32mat2;</div>\n<div class=\"line\"><a name=\"l01933\"></a><span class=\"lineno\"> 1933</span>&#160;</div>\n<div class=\"line\"><a name=\"l01936\"></a><span class=\"lineno\"> 1936</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3x3 lowp_f32mat3;</div>\n<div class=\"line\"><a name=\"l01937\"></a><span class=\"lineno\"> 1937</span>&#160;</div>\n<div class=\"line\"><a name=\"l01940\"></a><span class=\"lineno\"> 1940</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4x4 lowp_f32mat4;</div>\n<div class=\"line\"><a name=\"l01941\"></a><span class=\"lineno\"> 1941</span>&#160;</div>\n<div class=\"line\"><a name=\"l01942\"></a><span class=\"lineno\"> 1942</span>&#160;</div>\n<div class=\"line\"><a name=\"l01945\"></a><span class=\"lineno\"> 1945</span>&#160;        <span class=\"comment\">//typedef f32 mediump_f32mat1x1;</span></div>\n<div class=\"line\"><a name=\"l01946\"></a><span class=\"lineno\"> 1946</span>&#160;</div>\n<div class=\"line\"><a name=\"l01949\"></a><span class=\"lineno\"> 1949</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, mediump&gt; mediump_f32mat2x2;</div>\n<div class=\"line\"><a name=\"l01950\"></a><span class=\"lineno\"> 1950</span>&#160;</div>\n<div class=\"line\"><a name=\"l01953\"></a><span class=\"lineno\"> 1953</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f32, mediump&gt; mediump_f32mat2x3;</div>\n<div class=\"line\"><a name=\"l01954\"></a><span class=\"lineno\"> 1954</span>&#160;</div>\n<div class=\"line\"><a name=\"l01957\"></a><span class=\"lineno\"> 1957</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f32, mediump&gt; mediump_f32mat2x4;</div>\n<div class=\"line\"><a name=\"l01958\"></a><span class=\"lineno\"> 1958</span>&#160;</div>\n<div class=\"line\"><a name=\"l01961\"></a><span class=\"lineno\"> 1961</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f32, mediump&gt; mediump_f32mat3x2;</div>\n<div class=\"line\"><a name=\"l01962\"></a><span class=\"lineno\"> 1962</span>&#160;</div>\n<div class=\"line\"><a name=\"l01965\"></a><span class=\"lineno\"> 1965</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, mediump&gt; mediump_f32mat3x3;</div>\n<div class=\"line\"><a name=\"l01966\"></a><span class=\"lineno\"> 1966</span>&#160;</div>\n<div class=\"line\"><a name=\"l01969\"></a><span class=\"lineno\"> 1969</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f32, mediump&gt; mediump_f32mat3x4;</div>\n<div class=\"line\"><a name=\"l01970\"></a><span class=\"lineno\"> 1970</span>&#160;</div>\n<div class=\"line\"><a name=\"l01973\"></a><span class=\"lineno\"> 1973</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f32, mediump&gt; mediump_f32mat4x2;</div>\n<div class=\"line\"><a name=\"l01974\"></a><span class=\"lineno\"> 1974</span>&#160;</div>\n<div class=\"line\"><a name=\"l01977\"></a><span class=\"lineno\"> 1977</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f32, mediump&gt; mediump_f32mat4x3;</div>\n<div class=\"line\"><a name=\"l01978\"></a><span class=\"lineno\"> 1978</span>&#160;</div>\n<div class=\"line\"><a name=\"l01981\"></a><span class=\"lineno\"> 1981</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, mediump&gt; mediump_f32mat4x4;</div>\n<div class=\"line\"><a name=\"l01982\"></a><span class=\"lineno\"> 1982</span>&#160;</div>\n<div class=\"line\"><a name=\"l01985\"></a><span class=\"lineno\"> 1985</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f32, mediump&gt; f32mat1;</span></div>\n<div class=\"line\"><a name=\"l01986\"></a><span class=\"lineno\"> 1986</span>&#160;</div>\n<div class=\"line\"><a name=\"l01989\"></a><span class=\"lineno\"> 1989</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2x2 mediump_f32mat2;</div>\n<div class=\"line\"><a name=\"l01990\"></a><span class=\"lineno\"> 1990</span>&#160;</div>\n<div class=\"line\"><a name=\"l01993\"></a><span class=\"lineno\"> 1993</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3x3 mediump_f32mat3;</div>\n<div class=\"line\"><a name=\"l01994\"></a><span class=\"lineno\"> 1994</span>&#160;</div>\n<div class=\"line\"><a name=\"l01997\"></a><span class=\"lineno\"> 1997</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4x4 mediump_f32mat4;</div>\n<div class=\"line\"><a name=\"l01998\"></a><span class=\"lineno\"> 1998</span>&#160;</div>\n<div class=\"line\"><a name=\"l01999\"></a><span class=\"lineno\"> 1999</span>&#160;</div>\n<div class=\"line\"><a name=\"l02002\"></a><span class=\"lineno\"> 2002</span>&#160;        <span class=\"comment\">//typedef f32 highp_f32mat1x1;</span></div>\n<div class=\"line\"><a name=\"l02003\"></a><span class=\"lineno\"> 2003</span>&#160;</div>\n<div class=\"line\"><a name=\"l02006\"></a><span class=\"lineno\"> 2006</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, highp&gt; highp_f32mat2x2;</div>\n<div class=\"line\"><a name=\"l02007\"></a><span class=\"lineno\"> 2007</span>&#160;</div>\n<div class=\"line\"><a name=\"l02010\"></a><span class=\"lineno\"> 2010</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f32, highp&gt; highp_f32mat2x3;</div>\n<div class=\"line\"><a name=\"l02011\"></a><span class=\"lineno\"> 2011</span>&#160;</div>\n<div class=\"line\"><a name=\"l02014\"></a><span class=\"lineno\"> 2014</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f32, highp&gt; highp_f32mat2x4;</div>\n<div class=\"line\"><a name=\"l02015\"></a><span class=\"lineno\"> 2015</span>&#160;</div>\n<div class=\"line\"><a name=\"l02018\"></a><span class=\"lineno\"> 2018</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f32, highp&gt; highp_f32mat3x2;</div>\n<div class=\"line\"><a name=\"l02019\"></a><span class=\"lineno\"> 2019</span>&#160;</div>\n<div class=\"line\"><a name=\"l02022\"></a><span class=\"lineno\"> 2022</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, highp&gt; highp_f32mat3x3;</div>\n<div class=\"line\"><a name=\"l02023\"></a><span class=\"lineno\"> 2023</span>&#160;</div>\n<div class=\"line\"><a name=\"l02026\"></a><span class=\"lineno\"> 2026</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f32, highp&gt; highp_f32mat3x4;</div>\n<div class=\"line\"><a name=\"l02027\"></a><span class=\"lineno\"> 2027</span>&#160;</div>\n<div class=\"line\"><a name=\"l02030\"></a><span class=\"lineno\"> 2030</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f32, highp&gt; highp_f32mat4x2;</div>\n<div class=\"line\"><a name=\"l02031\"></a><span class=\"lineno\"> 2031</span>&#160;</div>\n<div class=\"line\"><a name=\"l02034\"></a><span class=\"lineno\"> 2034</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f32, highp&gt; highp_f32mat4x3;</div>\n<div class=\"line\"><a name=\"l02035\"></a><span class=\"lineno\"> 2035</span>&#160;</div>\n<div class=\"line\"><a name=\"l02038\"></a><span class=\"lineno\"> 2038</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, highp&gt; highp_f32mat4x4;</div>\n<div class=\"line\"><a name=\"l02039\"></a><span class=\"lineno\"> 2039</span>&#160;</div>\n<div class=\"line\"><a name=\"l02042\"></a><span class=\"lineno\"> 2042</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f32, highp&gt; f32mat1;</span></div>\n<div class=\"line\"><a name=\"l02043\"></a><span class=\"lineno\"> 2043</span>&#160;</div>\n<div class=\"line\"><a name=\"l02046\"></a><span class=\"lineno\"> 2046</span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat2x2 highp_f32mat2;</div>\n<div class=\"line\"><a name=\"l02047\"></a><span class=\"lineno\"> 2047</span>&#160;</div>\n<div class=\"line\"><a name=\"l02050\"></a><span class=\"lineno\"> 2050</span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat3x3 highp_f32mat3;</div>\n<div class=\"line\"><a name=\"l02051\"></a><span class=\"lineno\"> 2051</span>&#160;</div>\n<div class=\"line\"><a name=\"l02054\"></a><span class=\"lineno\"> 2054</span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat4x4 highp_f32mat4;</div>\n<div class=\"line\"><a name=\"l02055\"></a><span class=\"lineno\"> 2055</span>&#160;</div>\n<div class=\"line\"><a name=\"l02056\"></a><span class=\"lineno\"> 2056</span>&#160;</div>\n<div class=\"line\"><a name=\"l02059\"></a><span class=\"lineno\"> 2059</span>&#160;        <span class=\"comment\">//typedef f64 lowp_f64mat1x1;</span></div>\n<div class=\"line\"><a name=\"l02060\"></a><span class=\"lineno\"> 2060</span>&#160;</div>\n<div class=\"line\"><a name=\"l02063\"></a><span class=\"lineno\"> 2063</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f64, lowp&gt; lowp_f64mat2x2;</div>\n<div class=\"line\"><a name=\"l02064\"></a><span class=\"lineno\"> 2064</span>&#160;</div>\n<div class=\"line\"><a name=\"l02067\"></a><span class=\"lineno\"> 2067</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f64, lowp&gt; lowp_f64mat2x3;</div>\n<div class=\"line\"><a name=\"l02068\"></a><span class=\"lineno\"> 2068</span>&#160;</div>\n<div class=\"line\"><a name=\"l02071\"></a><span class=\"lineno\"> 2071</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f64, lowp&gt; lowp_f64mat2x4;</div>\n<div class=\"line\"><a name=\"l02072\"></a><span class=\"lineno\"> 2072</span>&#160;</div>\n<div class=\"line\"><a name=\"l02075\"></a><span class=\"lineno\"> 2075</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f64, lowp&gt; lowp_f64mat3x2;</div>\n<div class=\"line\"><a name=\"l02076\"></a><span class=\"lineno\"> 2076</span>&#160;</div>\n<div class=\"line\"><a name=\"l02079\"></a><span class=\"lineno\"> 2079</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f64, lowp&gt; lowp_f64mat3x3;</div>\n<div class=\"line\"><a name=\"l02080\"></a><span class=\"lineno\"> 2080</span>&#160;</div>\n<div class=\"line\"><a name=\"l02083\"></a><span class=\"lineno\"> 2083</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f64, lowp&gt; lowp_f64mat3x4;</div>\n<div class=\"line\"><a name=\"l02084\"></a><span class=\"lineno\"> 2084</span>&#160;</div>\n<div class=\"line\"><a name=\"l02087\"></a><span class=\"lineno\"> 2087</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f64, lowp&gt; lowp_f64mat4x2;</div>\n<div class=\"line\"><a name=\"l02088\"></a><span class=\"lineno\"> 2088</span>&#160;</div>\n<div class=\"line\"><a name=\"l02091\"></a><span class=\"lineno\"> 2091</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f64, lowp&gt; lowp_f64mat4x3;</div>\n<div class=\"line\"><a name=\"l02092\"></a><span class=\"lineno\"> 2092</span>&#160;        </div>\n<div class=\"line\"><a name=\"l02095\"></a><span class=\"lineno\"> 2095</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f64, lowp&gt; lowp_f64mat4x4;</div>\n<div class=\"line\"><a name=\"l02096\"></a><span class=\"lineno\"> 2096</span>&#160;</div>\n<div class=\"line\"><a name=\"l02099\"></a><span class=\"lineno\"> 2099</span>&#160;        <span class=\"comment\">//typedef lowp_f64mat1x1 lowp_f64mat1;</span></div>\n<div class=\"line\"><a name=\"l02100\"></a><span class=\"lineno\"> 2100</span>&#160;</div>\n<div class=\"line\"><a name=\"l02103\"></a><span class=\"lineno\"> 2103</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat2x2 lowp_f64mat2;</div>\n<div class=\"line\"><a name=\"l02104\"></a><span class=\"lineno\"> 2104</span>&#160;</div>\n<div class=\"line\"><a name=\"l02107\"></a><span class=\"lineno\"> 2107</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat3x3 lowp_f64mat3;</div>\n<div class=\"line\"><a name=\"l02108\"></a><span class=\"lineno\"> 2108</span>&#160;</div>\n<div class=\"line\"><a name=\"l02111\"></a><span class=\"lineno\"> 2111</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat4x4 lowp_f64mat4;</div>\n<div class=\"line\"><a name=\"l02112\"></a><span class=\"lineno\"> 2112</span>&#160;</div>\n<div class=\"line\"><a name=\"l02113\"></a><span class=\"lineno\"> 2113</span>&#160;</div>\n<div class=\"line\"><a name=\"l02116\"></a><span class=\"lineno\"> 2116</span>&#160;        <span class=\"comment\">//typedef f64 Highp_f64mat1x1;</span></div>\n<div class=\"line\"><a name=\"l02117\"></a><span class=\"lineno\"> 2117</span>&#160;</div>\n<div class=\"line\"><a name=\"l02120\"></a><span class=\"lineno\"> 2120</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f64, mediump&gt; mediump_f64mat2x2;</div>\n<div class=\"line\"><a name=\"l02121\"></a><span class=\"lineno\"> 2121</span>&#160;</div>\n<div class=\"line\"><a name=\"l02124\"></a><span class=\"lineno\"> 2124</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f64, mediump&gt; mediump_f64mat2x3;</div>\n<div class=\"line\"><a name=\"l02125\"></a><span class=\"lineno\"> 2125</span>&#160;</div>\n<div class=\"line\"><a name=\"l02128\"></a><span class=\"lineno\"> 2128</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f64, mediump&gt; mediump_f64mat2x4;</div>\n<div class=\"line\"><a name=\"l02129\"></a><span class=\"lineno\"> 2129</span>&#160;</div>\n<div class=\"line\"><a name=\"l02132\"></a><span class=\"lineno\"> 2132</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f64, mediump&gt; mediump_f64mat3x2;</div>\n<div class=\"line\"><a name=\"l02133\"></a><span class=\"lineno\"> 2133</span>&#160;</div>\n<div class=\"line\"><a name=\"l02136\"></a><span class=\"lineno\"> 2136</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f64, mediump&gt; mediump_f64mat3x3;</div>\n<div class=\"line\"><a name=\"l02137\"></a><span class=\"lineno\"> 2137</span>&#160;</div>\n<div class=\"line\"><a name=\"l02140\"></a><span class=\"lineno\"> 2140</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f64, mediump&gt; mediump_f64mat3x4;</div>\n<div class=\"line\"><a name=\"l02141\"></a><span class=\"lineno\"> 2141</span>&#160;</div>\n<div class=\"line\"><a name=\"l02144\"></a><span class=\"lineno\"> 2144</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f64, mediump&gt; mediump_f64mat4x2;</div>\n<div class=\"line\"><a name=\"l02145\"></a><span class=\"lineno\"> 2145</span>&#160;</div>\n<div class=\"line\"><a name=\"l02148\"></a><span class=\"lineno\"> 2148</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f64, mediump&gt; mediump_f64mat4x3;</div>\n<div class=\"line\"><a name=\"l02149\"></a><span class=\"lineno\"> 2149</span>&#160;</div>\n<div class=\"line\"><a name=\"l02152\"></a><span class=\"lineno\"> 2152</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f64, mediump&gt; mediump_f64mat4x4;</div>\n<div class=\"line\"><a name=\"l02153\"></a><span class=\"lineno\"> 2153</span>&#160;</div>\n<div class=\"line\"><a name=\"l02156\"></a><span class=\"lineno\"> 2156</span>&#160;        <span class=\"comment\">//typedef mediump_f64mat1x1 mediump_f64mat1;</span></div>\n<div class=\"line\"><a name=\"l02157\"></a><span class=\"lineno\"> 2157</span>&#160;</div>\n<div class=\"line\"><a name=\"l02160\"></a><span class=\"lineno\"> 2160</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat2x2 mediump_f64mat2;</div>\n<div class=\"line\"><a name=\"l02161\"></a><span class=\"lineno\"> 2161</span>&#160;</div>\n<div class=\"line\"><a name=\"l02164\"></a><span class=\"lineno\"> 2164</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat3x3 mediump_f64mat3;</div>\n<div class=\"line\"><a name=\"l02165\"></a><span class=\"lineno\"> 2165</span>&#160;</div>\n<div class=\"line\"><a name=\"l02168\"></a><span class=\"lineno\"> 2168</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat4x4 mediump_f64mat4;</div>\n<div class=\"line\"><a name=\"l02169\"></a><span class=\"lineno\"> 2169</span>&#160;</div>\n<div class=\"line\"><a name=\"l02172\"></a><span class=\"lineno\"> 2172</span>&#160;        <span class=\"comment\">//typedef f64 highp_f64mat1x1;</span></div>\n<div class=\"line\"><a name=\"l02173\"></a><span class=\"lineno\"> 2173</span>&#160;</div>\n<div class=\"line\"><a name=\"l02176\"></a><span class=\"lineno\"> 2176</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f64, highp&gt; highp_f64mat2x2;</div>\n<div class=\"line\"><a name=\"l02177\"></a><span class=\"lineno\"> 2177</span>&#160;</div>\n<div class=\"line\"><a name=\"l02180\"></a><span class=\"lineno\"> 2180</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f64, highp&gt; highp_f64mat2x3;</div>\n<div class=\"line\"><a name=\"l02181\"></a><span class=\"lineno\"> 2181</span>&#160;</div>\n<div class=\"line\"><a name=\"l02184\"></a><span class=\"lineno\"> 2184</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f64, highp&gt; highp_f64mat2x4;</div>\n<div class=\"line\"><a name=\"l02185\"></a><span class=\"lineno\"> 2185</span>&#160;</div>\n<div class=\"line\"><a name=\"l02188\"></a><span class=\"lineno\"> 2188</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f64, highp&gt; highp_f64mat3x2;</div>\n<div class=\"line\"><a name=\"l02189\"></a><span class=\"lineno\"> 2189</span>&#160;</div>\n<div class=\"line\"><a name=\"l02192\"></a><span class=\"lineno\"> 2192</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f64, highp&gt; highp_f64mat3x3;</div>\n<div class=\"line\"><a name=\"l02193\"></a><span class=\"lineno\"> 2193</span>&#160;</div>\n<div class=\"line\"><a name=\"l02196\"></a><span class=\"lineno\"> 2196</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f64, highp&gt; highp_f64mat3x4;</div>\n<div class=\"line\"><a name=\"l02197\"></a><span class=\"lineno\"> 2197</span>&#160;</div>\n<div class=\"line\"><a name=\"l02200\"></a><span class=\"lineno\"> 2200</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f64, highp&gt; highp_f64mat4x2;</div>\n<div class=\"line\"><a name=\"l02201\"></a><span class=\"lineno\"> 2201</span>&#160;</div>\n<div class=\"line\"><a name=\"l02204\"></a><span class=\"lineno\"> 2204</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f64, highp&gt; highp_f64mat4x3;</div>\n<div class=\"line\"><a name=\"l02205\"></a><span class=\"lineno\"> 2205</span>&#160;</div>\n<div class=\"line\"><a name=\"l02208\"></a><span class=\"lineno\"> 2208</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f64, highp&gt; highp_f64mat4x4;</div>\n<div class=\"line\"><a name=\"l02209\"></a><span class=\"lineno\"> 2209</span>&#160;</div>\n<div class=\"line\"><a name=\"l02212\"></a><span class=\"lineno\"> 2212</span>&#160;        <span class=\"comment\">//typedef highp_f64mat1x1 highp_f64mat1;</span></div>\n<div class=\"line\"><a name=\"l02213\"></a><span class=\"lineno\"> 2213</span>&#160;</div>\n<div class=\"line\"><a name=\"l02216\"></a><span class=\"lineno\"> 2216</span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat2x2 highp_f64mat2;</div>\n<div class=\"line\"><a name=\"l02217\"></a><span class=\"lineno\"> 2217</span>&#160;</div>\n<div class=\"line\"><a name=\"l02220\"></a><span class=\"lineno\"> 2220</span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat3x3 highp_f64mat3;</div>\n<div class=\"line\"><a name=\"l02221\"></a><span class=\"lineno\"> 2221</span>&#160;</div>\n<div class=\"line\"><a name=\"l02224\"></a><span class=\"lineno\"> 2224</span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat4x4 highp_f64mat4;</div>\n<div class=\"line\"><a name=\"l02225\"></a><span class=\"lineno\"> 2225</span>&#160;</div>\n<div class=\"line\"><a name=\"l02227\"></a><span class=\"lineno\"> 2227</span>&#160;        <span class=\"comment\">// Quaternion types</span></div>\n<div class=\"line\"><a name=\"l02228\"></a><span class=\"lineno\"> 2228</span>&#160;</div>\n<div class=\"line\"><a name=\"l02231\"></a><span class=\"lineno\"> 2231</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;f32, lowp&gt; lowp_f32quat;</div>\n<div class=\"line\"><a name=\"l02232\"></a><span class=\"lineno\"> 2232</span>&#160;</div>\n<div class=\"line\"><a name=\"l02235\"></a><span class=\"lineno\"> 2235</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;f64, lowp&gt; lowp_f64quat;</div>\n<div class=\"line\"><a name=\"l02236\"></a><span class=\"lineno\"> 2236</span>&#160;</div>\n<div class=\"line\"><a name=\"l02239\"></a><span class=\"lineno\"> 2239</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;f32, mediump&gt; mediump_f32quat;</div>\n<div class=\"line\"><a name=\"l02240\"></a><span class=\"lineno\"> 2240</span>&#160;</div>\n<div class=\"line\"><a name=\"l02243\"></a><span class=\"lineno\"> 2243</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;f64, mediump&gt; mediump_f64quat;</div>\n<div class=\"line\"><a name=\"l02244\"></a><span class=\"lineno\"> 2244</span>&#160;</div>\n<div class=\"line\"><a name=\"l02247\"></a><span class=\"lineno\"> 2247</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;f32, highp&gt; highp_f32quat;</div>\n<div class=\"line\"><a name=\"l02248\"></a><span class=\"lineno\"> 2248</span>&#160;</div>\n<div class=\"line\"><a name=\"l02251\"></a><span class=\"lineno\"> 2251</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;f64, highp&gt; highp_f64quat;</div>\n<div class=\"line\"><a name=\"l02252\"></a><span class=\"lineno\"> 2252</span>&#160;</div>\n<div class=\"line\"><a name=\"l02253\"></a><span class=\"lineno\"> 2253</span>&#160;</div>\n<div class=\"line\"><a name=\"l02254\"></a><span class=\"lineno\"> 2254</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l02255\"></a><span class=\"lineno\"> 2255</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32vec1                    <a class=\"code\" href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">fvec1</a>;</div>\n<div class=\"line\"><a name=\"l02256\"></a><span class=\"lineno\"> 2256</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32vec2                    <a class=\"code\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">fvec2</a>;</div>\n<div class=\"line\"><a name=\"l02257\"></a><span class=\"lineno\"> 2257</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32vec3                    <a class=\"code\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">fvec3</a>;</div>\n<div class=\"line\"><a name=\"l02258\"></a><span class=\"lineno\"> 2258</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32vec4                    <a class=\"code\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">fvec4</a>;</div>\n<div class=\"line\"><a name=\"l02259\"></a><span class=\"lineno\"> 2259</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2                    <a class=\"code\" href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">fmat2</a>;</div>\n<div class=\"line\"><a name=\"l02260\"></a><span class=\"lineno\"> 2260</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3                    <a class=\"code\" href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">fmat3</a>;</div>\n<div class=\"line\"><a name=\"l02261\"></a><span class=\"lineno\"> 2261</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4                    <a class=\"code\" href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">fmat4</a>;</div>\n<div class=\"line\"><a name=\"l02262\"></a><span class=\"lineno\"> 2262</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2x2                  <a class=\"code\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02263\"></a><span class=\"lineno\"> 2263</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3x2                  <a class=\"code\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">fmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02264\"></a><span class=\"lineno\"> 2264</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4x2                  <a class=\"code\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">fmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02265\"></a><span class=\"lineno\"> 2265</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2x3                  <a class=\"code\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">fmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02266\"></a><span class=\"lineno\"> 2266</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3x3                  <a class=\"code\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02267\"></a><span class=\"lineno\"> 2267</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4x3                  <a class=\"code\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">fmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02268\"></a><span class=\"lineno\"> 2268</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2x4                  <a class=\"code\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">fmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02269\"></a><span class=\"lineno\"> 2269</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3x4                  <a class=\"code\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">fmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02270\"></a><span class=\"lineno\"> 2270</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4x4                  <a class=\"code\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02271\"></a><span class=\"lineno\"> 2271</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32quat                    fquat;</div>\n<div class=\"line\"><a name=\"l02272\"></a><span class=\"lineno\"> 2272</span>&#160;</div>\n<div class=\"line\"><a name=\"l02273\"></a><span class=\"lineno\"> 2273</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32vec1                    <a class=\"code\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">f32vec1</a>;</div>\n<div class=\"line\"><a name=\"l02274\"></a><span class=\"lineno\"> 2274</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32vec2                    <a class=\"code\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">f32vec2</a>;</div>\n<div class=\"line\"><a name=\"l02275\"></a><span class=\"lineno\"> 2275</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32vec3                    <a class=\"code\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">f32vec3</a>;</div>\n<div class=\"line\"><a name=\"l02276\"></a><span class=\"lineno\"> 2276</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32vec4                    <a class=\"code\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">f32vec4</a>;</div>\n<div class=\"line\"><a name=\"l02277\"></a><span class=\"lineno\"> 2277</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2                    <a class=\"code\" href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">f32mat2</a>;</div>\n<div class=\"line\"><a name=\"l02278\"></a><span class=\"lineno\"> 2278</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3                    <a class=\"code\" href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">f32mat3</a>;</div>\n<div class=\"line\"><a name=\"l02279\"></a><span class=\"lineno\"> 2279</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4                    <a class=\"code\" href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">f32mat4</a>;</div>\n<div class=\"line\"><a name=\"l02280\"></a><span class=\"lineno\"> 2280</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2x2                  <a class=\"code\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02281\"></a><span class=\"lineno\"> 2281</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3x2                  <a class=\"code\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">f32mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02282\"></a><span class=\"lineno\"> 2282</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4x2                  <a class=\"code\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">f32mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02283\"></a><span class=\"lineno\"> 2283</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2x3                  <a class=\"code\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">f32mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02284\"></a><span class=\"lineno\"> 2284</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3x3                  <a class=\"code\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02285\"></a><span class=\"lineno\"> 2285</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4x3                  <a class=\"code\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">f32mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02286\"></a><span class=\"lineno\"> 2286</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat2x4                  <a class=\"code\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">f32mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02287\"></a><span class=\"lineno\"> 2287</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat3x4                  <a class=\"code\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">f32mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02288\"></a><span class=\"lineno\"> 2288</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32mat4x4                  <a class=\"code\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02289\"></a><span class=\"lineno\"> 2289</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f32quat                    <a class=\"code\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">f32quat</a>;</div>\n<div class=\"line\"><a name=\"l02290\"></a><span class=\"lineno\"> 2290</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l02291\"></a><span class=\"lineno\"> 2291</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32vec1                 <a class=\"code\" href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">fvec1</a>;</div>\n<div class=\"line\"><a name=\"l02292\"></a><span class=\"lineno\"> 2292</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32vec2                 <a class=\"code\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">fvec2</a>;</div>\n<div class=\"line\"><a name=\"l02293\"></a><span class=\"lineno\"> 2293</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32vec3                 <a class=\"code\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">fvec3</a>;</div>\n<div class=\"line\"><a name=\"l02294\"></a><span class=\"lineno\"> 2294</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32vec4                 <a class=\"code\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">fvec4</a>;</div>\n<div class=\"line\"><a name=\"l02295\"></a><span class=\"lineno\"> 2295</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2                 <a class=\"code\" href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">fmat2</a>;</div>\n<div class=\"line\"><a name=\"l02296\"></a><span class=\"lineno\"> 2296</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3                 <a class=\"code\" href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">fmat3</a>;</div>\n<div class=\"line\"><a name=\"l02297\"></a><span class=\"lineno\"> 2297</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4                 <a class=\"code\" href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">fmat4</a>;</div>\n<div class=\"line\"><a name=\"l02298\"></a><span class=\"lineno\"> 2298</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2x2               <a class=\"code\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02299\"></a><span class=\"lineno\"> 2299</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3x2               <a class=\"code\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">fmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02300\"></a><span class=\"lineno\"> 2300</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4x2               <a class=\"code\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">fmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02301\"></a><span class=\"lineno\"> 2301</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2x3               <a class=\"code\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">fmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02302\"></a><span class=\"lineno\"> 2302</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3x3               <a class=\"code\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02303\"></a><span class=\"lineno\"> 2303</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4x3               <a class=\"code\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">fmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02304\"></a><span class=\"lineno\"> 2304</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2x4               <a class=\"code\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">fmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02305\"></a><span class=\"lineno\"> 2305</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3x4               <a class=\"code\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">fmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02306\"></a><span class=\"lineno\"> 2306</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4x4               <a class=\"code\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02307\"></a><span class=\"lineno\"> 2307</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32quat                 fquat;</div>\n<div class=\"line\"><a name=\"l02308\"></a><span class=\"lineno\"> 2308</span>&#160;</div>\n<div class=\"line\"><a name=\"l02309\"></a><span class=\"lineno\"> 2309</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32vec1                 <a class=\"code\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">f32vec1</a>;</div>\n<div class=\"line\"><a name=\"l02310\"></a><span class=\"lineno\"> 2310</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32vec2                 <a class=\"code\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">f32vec2</a>;</div>\n<div class=\"line\"><a name=\"l02311\"></a><span class=\"lineno\"> 2311</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32vec3                 <a class=\"code\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">f32vec3</a>;</div>\n<div class=\"line\"><a name=\"l02312\"></a><span class=\"lineno\"> 2312</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32vec4                 <a class=\"code\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">f32vec4</a>;</div>\n<div class=\"line\"><a name=\"l02313\"></a><span class=\"lineno\"> 2313</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2                 <a class=\"code\" href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">f32mat2</a>;</div>\n<div class=\"line\"><a name=\"l02314\"></a><span class=\"lineno\"> 2314</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3                 <a class=\"code\" href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">f32mat3</a>;</div>\n<div class=\"line\"><a name=\"l02315\"></a><span class=\"lineno\"> 2315</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4                 <a class=\"code\" href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">f32mat4</a>;</div>\n<div class=\"line\"><a name=\"l02316\"></a><span class=\"lineno\"> 2316</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2x2               <a class=\"code\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02317\"></a><span class=\"lineno\"> 2317</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3x2               <a class=\"code\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">f32mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02318\"></a><span class=\"lineno\"> 2318</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4x2               <a class=\"code\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">f32mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02319\"></a><span class=\"lineno\"> 2319</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2x3               <a class=\"code\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">f32mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02320\"></a><span class=\"lineno\"> 2320</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3x3               <a class=\"code\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02321\"></a><span class=\"lineno\"> 2321</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4x3               <a class=\"code\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">f32mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02322\"></a><span class=\"lineno\"> 2322</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat2x4               <a class=\"code\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">f32mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02323\"></a><span class=\"lineno\"> 2323</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat3x4               <a class=\"code\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">f32mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02324\"></a><span class=\"lineno\"> 2324</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32mat4x4               <a class=\"code\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02325\"></a><span class=\"lineno\"> 2325</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f32quat                 <a class=\"code\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">f32quat</a>;</div>\n<div class=\"line\"><a name=\"l02326\"></a><span class=\"lineno\"> 2326</span>&#160;<span class=\"preprocessor\">#else//if(defined(GLM_PRECISION_HIGHP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l02327\"></a><span class=\"lineno\"> 2327</span>&#160;        <span class=\"keyword\">typedef</span> highp_f32vec1                   <a class=\"code\" href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">fvec1</a>;</div>\n<div class=\"line\"><a name=\"l02330\"></a><span class=\"lineno\"> 2330</span>&#160;</div>\n<div class=\"line\"><a name=\"l02333\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\"> 2333</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32vec2                   <a class=\"code\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">fvec2</a>;</div>\n<div class=\"line\"><a name=\"l02334\"></a><span class=\"lineno\"> 2334</span>&#160;</div>\n<div class=\"line\"><a name=\"l02337\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\"> 2337</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32vec3                   <a class=\"code\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">fvec3</a>;</div>\n<div class=\"line\"><a name=\"l02338\"></a><span class=\"lineno\"> 2338</span>&#160;</div>\n<div class=\"line\"><a name=\"l02341\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\"> 2341</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32vec4                   <a class=\"code\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">fvec4</a>;</div>\n<div class=\"line\"><a name=\"l02342\"></a><span class=\"lineno\"> 2342</span>&#160;</div>\n<div class=\"line\"><a name=\"l02345\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\"> 2345</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat2x2                 <a class=\"code\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02346\"></a><span class=\"lineno\"> 2346</span>&#160;</div>\n<div class=\"line\"><a name=\"l02349\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\"> 2349</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat2x3                 <a class=\"code\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">fmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02350\"></a><span class=\"lineno\"> 2350</span>&#160;</div>\n<div class=\"line\"><a name=\"l02353\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\"> 2353</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat2x4                 <a class=\"code\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">fmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02354\"></a><span class=\"lineno\"> 2354</span>&#160;</div>\n<div class=\"line\"><a name=\"l02357\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\"> 2357</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat3x2                 <a class=\"code\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">fmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02358\"></a><span class=\"lineno\"> 2358</span>&#160;</div>\n<div class=\"line\"><a name=\"l02361\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\"> 2361</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat3x3                 <a class=\"code\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02362\"></a><span class=\"lineno\"> 2362</span>&#160;</div>\n<div class=\"line\"><a name=\"l02365\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\"> 2365</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat3x4                 <a class=\"code\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">fmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02366\"></a><span class=\"lineno\"> 2366</span>&#160;</div>\n<div class=\"line\"><a name=\"l02369\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\"> 2369</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat4x2                 <a class=\"code\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">fmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02370\"></a><span class=\"lineno\"> 2370</span>&#160;</div>\n<div class=\"line\"><a name=\"l02373\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\"> 2373</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat4x3                 <a class=\"code\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">fmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02374\"></a><span class=\"lineno\"> 2374</span>&#160;</div>\n<div class=\"line\"><a name=\"l02377\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\"> 2377</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat4x4                 <a class=\"code\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02378\"></a><span class=\"lineno\"> 2378</span>&#160;        </div>\n<div class=\"line\"><a name=\"l02381\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\"> 2381</a></span>&#160;        <span class=\"keyword\">typedef</span> fmat2x2                                 <a class=\"code\" href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">fmat2</a>;</div>\n<div class=\"line\"><a name=\"l02382\"></a><span class=\"lineno\"> 2382</span>&#160;</div>\n<div class=\"line\"><a name=\"l02385\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\"> 2385</a></span>&#160;        <span class=\"keyword\">typedef</span> fmat3x3                                 <a class=\"code\" href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">fmat3</a>;</div>\n<div class=\"line\"><a name=\"l02386\"></a><span class=\"lineno\"> 2386</span>&#160;</div>\n<div class=\"line\"><a name=\"l02389\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\"> 2389</a></span>&#160;        <span class=\"keyword\">typedef</span> fmat4x4                                 <a class=\"code\" href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">fmat4</a>;</div>\n<div class=\"line\"><a name=\"l02390\"></a><span class=\"lineno\"> 2390</span>&#160;</div>\n<div class=\"line\"><a name=\"l02393\"></a><span class=\"lineno\"> 2393</span>&#160;        <span class=\"keyword\">typedef</span> highp_fquat                             fquat;</div>\n<div class=\"line\"><a name=\"l02394\"></a><span class=\"lineno\"> 2394</span>&#160;        </div>\n<div class=\"line\"><a name=\"l02395\"></a><span class=\"lineno\"> 2395</span>&#160;</div>\n<div class=\"line\"><a name=\"l02396\"></a><span class=\"lineno\"> 2396</span>&#160;</div>\n<div class=\"line\"><a name=\"l02399\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\"> 2399</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32vec1                   <a class=\"code\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">f32vec1</a>;</div>\n<div class=\"line\"><a name=\"l02400\"></a><span class=\"lineno\"> 2400</span>&#160;</div>\n<div class=\"line\"><a name=\"l02403\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\"> 2403</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32vec2                   <a class=\"code\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">f32vec2</a>;</div>\n<div class=\"line\"><a name=\"l02404\"></a><span class=\"lineno\"> 2404</span>&#160;</div>\n<div class=\"line\"><a name=\"l02407\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\"> 2407</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32vec3                   <a class=\"code\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">f32vec3</a>;</div>\n<div class=\"line\"><a name=\"l02408\"></a><span class=\"lineno\"> 2408</span>&#160;</div>\n<div class=\"line\"><a name=\"l02411\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\"> 2411</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32vec4                   <a class=\"code\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">f32vec4</a>;</div>\n<div class=\"line\"><a name=\"l02412\"></a><span class=\"lineno\"> 2412</span>&#160;</div>\n<div class=\"line\"><a name=\"l02415\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\"> 2415</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat2x2                 <a class=\"code\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02416\"></a><span class=\"lineno\"> 2416</span>&#160;</div>\n<div class=\"line\"><a name=\"l02419\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\"> 2419</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat2x3                 <a class=\"code\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">f32mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02420\"></a><span class=\"lineno\"> 2420</span>&#160;</div>\n<div class=\"line\"><a name=\"l02423\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\"> 2423</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat2x4                 <a class=\"code\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">f32mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02424\"></a><span class=\"lineno\"> 2424</span>&#160;</div>\n<div class=\"line\"><a name=\"l02427\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\"> 2427</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat3x2                 <a class=\"code\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">f32mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02428\"></a><span class=\"lineno\"> 2428</span>&#160;</div>\n<div class=\"line\"><a name=\"l02431\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\"> 2431</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat3x3                 <a class=\"code\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02432\"></a><span class=\"lineno\"> 2432</span>&#160;</div>\n<div class=\"line\"><a name=\"l02435\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\"> 2435</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat3x4                 <a class=\"code\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">f32mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02436\"></a><span class=\"lineno\"> 2436</span>&#160;</div>\n<div class=\"line\"><a name=\"l02439\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\"> 2439</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat4x2                 <a class=\"code\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">f32mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02440\"></a><span class=\"lineno\"> 2440</span>&#160;</div>\n<div class=\"line\"><a name=\"l02443\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\"> 2443</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat4x3                 <a class=\"code\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">f32mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02444\"></a><span class=\"lineno\"> 2444</span>&#160;</div>\n<div class=\"line\"><a name=\"l02447\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\"> 2447</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32mat4x4                 <a class=\"code\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02448\"></a><span class=\"lineno\"> 2448</span>&#160;</div>\n<div class=\"line\"><a name=\"l02451\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\"> 2451</a></span>&#160;        <span class=\"keyword\">typedef</span> f32mat2x2                               <a class=\"code\" href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">f32mat2</a>;</div>\n<div class=\"line\"><a name=\"l02452\"></a><span class=\"lineno\"> 2452</span>&#160;</div>\n<div class=\"line\"><a name=\"l02455\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\"> 2455</a></span>&#160;        <span class=\"keyword\">typedef</span> f32mat3x3                               <a class=\"code\" href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">f32mat3</a>;</div>\n<div class=\"line\"><a name=\"l02456\"></a><span class=\"lineno\"> 2456</span>&#160;</div>\n<div class=\"line\"><a name=\"l02459\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\"> 2459</a></span>&#160;        <span class=\"keyword\">typedef</span> f32mat4x4                               <a class=\"code\" href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">f32mat4</a>;</div>\n<div class=\"line\"><a name=\"l02460\"></a><span class=\"lineno\"> 2460</span>&#160;</div>\n<div class=\"line\"><a name=\"l02463\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\"> 2463</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f32quat                   <a class=\"code\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">f32quat</a>;</div>\n<div class=\"line\"><a name=\"l02464\"></a><span class=\"lineno\"> 2464</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l02465\"></a><span class=\"lineno\"> 2465</span>&#160;</div>\n<div class=\"line\"><a name=\"l02466\"></a><span class=\"lineno\"> 2466</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l02467\"></a><span class=\"lineno\"> 2467</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64vec1                    <a class=\"code\" href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">f64vec1</a>;</div>\n<div class=\"line\"><a name=\"l02468\"></a><span class=\"lineno\"> 2468</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64vec2                    <a class=\"code\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">f64vec2</a>;</div>\n<div class=\"line\"><a name=\"l02469\"></a><span class=\"lineno\"> 2469</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64vec3                    <a class=\"code\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">f64vec3</a>;</div>\n<div class=\"line\"><a name=\"l02470\"></a><span class=\"lineno\"> 2470</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64vec4                    <a class=\"code\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">f64vec4</a>;</div>\n<div class=\"line\"><a name=\"l02471\"></a><span class=\"lineno\"> 2471</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat2                    <a class=\"code\" href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">f64mat2</a>;</div>\n<div class=\"line\"><a name=\"l02472\"></a><span class=\"lineno\"> 2472</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat3                    <a class=\"code\" href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">f64mat3</a>;</div>\n<div class=\"line\"><a name=\"l02473\"></a><span class=\"lineno\"> 2473</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat4                    <a class=\"code\" href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">f64mat4</a>;</div>\n<div class=\"line\"><a name=\"l02474\"></a><span class=\"lineno\"> 2474</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat2x2                  <a class=\"code\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02475\"></a><span class=\"lineno\"> 2475</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat3x2                  <a class=\"code\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">f64mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02476\"></a><span class=\"lineno\"> 2476</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat4x2                  <a class=\"code\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">f64mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02477\"></a><span class=\"lineno\"> 2477</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat2x3                  <a class=\"code\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">f64mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02478\"></a><span class=\"lineno\"> 2478</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat3x3                  <a class=\"code\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02479\"></a><span class=\"lineno\"> 2479</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat4x3                  <a class=\"code\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">f64mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02480\"></a><span class=\"lineno\"> 2480</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat2x4                  <a class=\"code\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">f64mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02481\"></a><span class=\"lineno\"> 2481</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat3x4                  <a class=\"code\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">f64mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02482\"></a><span class=\"lineno\"> 2482</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64mat4x4                  <a class=\"code\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02483\"></a><span class=\"lineno\"> 2483</span>&#160;        <span class=\"keyword\">typedef</span> lowp_f64quat                    <a class=\"code\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">f64quat</a>;</div>\n<div class=\"line\"><a name=\"l02484\"></a><span class=\"lineno\"> 2484</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l02485\"></a><span class=\"lineno\"> 2485</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64vec1                 <a class=\"code\" href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">f64vec1</a>;</div>\n<div class=\"line\"><a name=\"l02486\"></a><span class=\"lineno\"> 2486</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64vec2                 <a class=\"code\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">f64vec2</a>;</div>\n<div class=\"line\"><a name=\"l02487\"></a><span class=\"lineno\"> 2487</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64vec3                 <a class=\"code\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">f64vec3</a>;</div>\n<div class=\"line\"><a name=\"l02488\"></a><span class=\"lineno\"> 2488</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64vec4                 <a class=\"code\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">f64vec4</a>;</div>\n<div class=\"line\"><a name=\"l02489\"></a><span class=\"lineno\"> 2489</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat2                 <a class=\"code\" href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">f64mat2</a>;</div>\n<div class=\"line\"><a name=\"l02490\"></a><span class=\"lineno\"> 2490</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat3                 <a class=\"code\" href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">f64mat3</a>;</div>\n<div class=\"line\"><a name=\"l02491\"></a><span class=\"lineno\"> 2491</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat4                 <a class=\"code\" href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">f64mat4</a>;</div>\n<div class=\"line\"><a name=\"l02492\"></a><span class=\"lineno\"> 2492</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat2x2               <a class=\"code\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02493\"></a><span class=\"lineno\"> 2493</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat3x2               <a class=\"code\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">f64mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02494\"></a><span class=\"lineno\"> 2494</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat4x2               <a class=\"code\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">f64mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02495\"></a><span class=\"lineno\"> 2495</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat2x3               <a class=\"code\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">f64mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02496\"></a><span class=\"lineno\"> 2496</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat3x3               <a class=\"code\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02497\"></a><span class=\"lineno\"> 2497</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat4x3               <a class=\"code\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">f64mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02498\"></a><span class=\"lineno\"> 2498</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat2x4               <a class=\"code\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">f64mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02499\"></a><span class=\"lineno\"> 2499</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat3x4               <a class=\"code\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">f64mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02500\"></a><span class=\"lineno\"> 2500</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64mat4x4               <a class=\"code\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02501\"></a><span class=\"lineno\"> 2501</span>&#160;        <span class=\"keyword\">typedef</span> mediump_f64quat                 <a class=\"code\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">f64quat</a>;</div>\n<div class=\"line\"><a name=\"l02502\"></a><span class=\"lineno\"> 2502</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l02503\"></a><span class=\"lineno\"> 2503</span>&#160;        <span class=\"keyword\">typedef</span> highp_f64vec1                   <a class=\"code\" href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">f64vec1</a>;</div>\n<div class=\"line\"><a name=\"l02506\"></a><span class=\"lineno\"> 2506</span>&#160;</div>\n<div class=\"line\"><a name=\"l02509\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\"> 2509</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64vec2                   <a class=\"code\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">f64vec2</a>;</div>\n<div class=\"line\"><a name=\"l02510\"></a><span class=\"lineno\"> 2510</span>&#160;</div>\n<div class=\"line\"><a name=\"l02513\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\"> 2513</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64vec3                   <a class=\"code\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">f64vec3</a>;</div>\n<div class=\"line\"><a name=\"l02514\"></a><span class=\"lineno\"> 2514</span>&#160;</div>\n<div class=\"line\"><a name=\"l02517\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\"> 2517</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64vec4                   <a class=\"code\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">f64vec4</a>;</div>\n<div class=\"line\"><a name=\"l02518\"></a><span class=\"lineno\"> 2518</span>&#160;</div>\n<div class=\"line\"><a name=\"l02521\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\"> 2521</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat2x2                 <a class=\"code\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l02522\"></a><span class=\"lineno\"> 2522</span>&#160;</div>\n<div class=\"line\"><a name=\"l02525\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\"> 2525</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat2x3                 <a class=\"code\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">f64mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l02526\"></a><span class=\"lineno\"> 2526</span>&#160;</div>\n<div class=\"line\"><a name=\"l02529\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\"> 2529</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat2x4                 <a class=\"code\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">f64mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l02530\"></a><span class=\"lineno\"> 2530</span>&#160;</div>\n<div class=\"line\"><a name=\"l02533\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\"> 2533</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat3x2                 <a class=\"code\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">f64mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l02534\"></a><span class=\"lineno\"> 2534</span>&#160;</div>\n<div class=\"line\"><a name=\"l02537\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\"> 2537</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat3x3                 <a class=\"code\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l02538\"></a><span class=\"lineno\"> 2538</span>&#160;</div>\n<div class=\"line\"><a name=\"l02541\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\"> 2541</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat3x4                 <a class=\"code\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">f64mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l02542\"></a><span class=\"lineno\"> 2542</span>&#160;</div>\n<div class=\"line\"><a name=\"l02545\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\"> 2545</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat4x2                 <a class=\"code\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">f64mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l02546\"></a><span class=\"lineno\"> 2546</span>&#160;</div>\n<div class=\"line\"><a name=\"l02549\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\"> 2549</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat4x3                 <a class=\"code\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">f64mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l02550\"></a><span class=\"lineno\"> 2550</span>&#160;</div>\n<div class=\"line\"><a name=\"l02553\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\"> 2553</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64mat4x4                 <a class=\"code\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l02554\"></a><span class=\"lineno\"> 2554</span>&#160;</div>\n<div class=\"line\"><a name=\"l02557\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\"> 2557</a></span>&#160;        <span class=\"keyword\">typedef</span> f64mat2x2                               <a class=\"code\" href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">f64mat2</a>;</div>\n<div class=\"line\"><a name=\"l02558\"></a><span class=\"lineno\"> 2558</span>&#160;</div>\n<div class=\"line\"><a name=\"l02561\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\"> 2561</a></span>&#160;        <span class=\"keyword\">typedef</span> f64mat3x3                               <a class=\"code\" href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">f64mat3</a>;</div>\n<div class=\"line\"><a name=\"l02562\"></a><span class=\"lineno\"> 2562</span>&#160;</div>\n<div class=\"line\"><a name=\"l02565\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\"> 2565</a></span>&#160;        <span class=\"keyword\">typedef</span> f64mat4x4                               <a class=\"code\" href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">f64mat4</a>;</div>\n<div class=\"line\"><a name=\"l02566\"></a><span class=\"lineno\"> 2566</span>&#160;</div>\n<div class=\"line\"><a name=\"l02569\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\"> 2569</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_f64quat                   <a class=\"code\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">f64quat</a>;</div>\n<div class=\"line\"><a name=\"l02570\"></a><span class=\"lineno\"> 2570</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l02571\"></a><span class=\"lineno\"> 2571</span>&#160;</div>\n<div class=\"line\"><a name=\"l02572\"></a><span class=\"lineno\"> 2572</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00165_html_gaea5c4518e175162e306d2c2b5ef5ac79\"><div class=\"ttname\"><a href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">glm::f32vec3</a></div><div class=\"ttdeci\">highp_f32vec3 f32vec3</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02407\">fwd.hpp:2407</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadc4e1594f9555d919131ee02b17822a2\"><div class=\"ttname\"><a href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">glm::f64vec2</a></div><div class=\"ttdeci\">highp_f64vec2 f64vec2</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02509\">fwd.hpp:2509</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga727675ac6b5d2fc699520e0059735e25\"><div class=\"ttname\"><a href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">glm::highp_i32</a></div><div class=\"ttdeci\">detail::int32 highp_i32</div><div class=\"ttdoc\">High qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00238\">fwd.hpp:238</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa6a5b461bbf5fe20982472aa51896d4b\"><div class=\"ttname\"><a href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">glm::lowp_uint32</a></div><div class=\"ttdeci\">detail::uint32 lowp_uint32</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00713\">fwd.hpp:713</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9df98857be695d5a30cb30f5bfa38a80\"><div class=\"ttname\"><a href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">glm::mediump_u16</a></div><div class=\"ttdeci\">detail::uint16 mediump_u16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00793\">fwd.hpp:793</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2af9490085ae3bdf36a544e9dd073610\"><div class=\"ttname\"><a href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">glm::mediump_u64</a></div><div class=\"ttdeci\">detail::uint64 mediump_u64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00801\">fwd.hpp:801</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf49470869e9be2c059629b250619804e\"><div class=\"ttname\"><a href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">glm::lowp_uint8</a></div><div class=\"ttdeci\">detail::uint8 lowp_uint8</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00705\">fwd.hpp:705</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6fbd69cbdaa44345bff923a2cf63de7e\"><div class=\"ttname\"><a href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">glm::mediump_int8</a></div><div class=\"ttdeci\">detail::int8 mediump_int8</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00150\">fwd.hpp:150</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga5c6978d3ffba06738416a33083853fc0\"><div class=\"ttname\"><a href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">glm::mediump_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, mediump &gt; mediump_vec4</div><div class=\"ttdoc\">4 components vector of medium single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00358\">type_vec.hpp:358</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7a6f1929464dcc680b16381a4ee5f2cf\"><div class=\"ttname\"><a href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">glm::highp_u32</a></div><div class=\"ttdeci\">detail::uint32 highp_u32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00847\">fwd.hpp:847</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad68bfd9f881856fc863a6ebca0b67f78\"><div class=\"ttname\"><a href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">glm::lowp_uint16</a></div><div class=\"ttdeci\">detail::uint16 lowp_uint16</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00709\">fwd.hpp:709</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gade502df1ce14f837fae7f60a03ddb9b0\"><div class=\"ttname\"><a href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">glm::f64vec1</a></div><div class=\"ttdeci\">highp_f64vec1 f64vec1</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02505\">fwd.hpp:2505</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga302041c186d0d028bea31b711fe16759\"><div class=\"ttname\"><a href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">glm::int16</a></div><div class=\"ttdeci\">detail::int16 int16</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00207\">type_int.hpp:207</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga239b96198771b7add8eea7e6b59840c0\"><div class=\"ttname\"><a href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">glm::f32mat4x3</a></div><div class=\"ttdeci\">highp_f32mat4x3 f32mat4x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02443\">fwd.hpp:2443</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga256b12b650c3f2fb86878fd1c5db8bc3\"><div class=\"ttname\"><a href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">glm::highp_uint32</a></div><div class=\"ttdeci\">detail::uint32 highp_uint32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00815\">fwd.hpp:815</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad3c127f8bf8d7d4e738037c257abb5b1\"><div class=\"ttname\"><a href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">glm::float32</a></div><div class=\"ttdeci\">float float32</div><div class=\"ttdoc\">Default 32 bit single-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00103_source.html#l00055\">type_float.hpp:55</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae3ab5719fc4c1e966631dbbcba8d412a\"><div class=\"ttname\"><a href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">glm::f64mat2x3</a></div><div class=\"ttdeci\">highp_f64mat2x3 f64mat2x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02525\">fwd.hpp:2525</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaab239fa9e35b65a67cbaa6ac082f3675\"><div class=\"ttname\"><a href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">glm::f64mat3x4</a></div><div class=\"ttdeci\">highp_f64mat3x4 f64mat3x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02541\">fwd.hpp:2541</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1c522ca821c27b862fe51cf4024b064b\"><div class=\"ttname\"><a href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">glm::u16vec3</a></div><div class=\"ttdeci\">highp_u16vec3 u16vec3</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01063\">fwd.hpp:1063</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac25db6d2b1e2a0f351b77ba3409ac4cd\"><div class=\"ttname\"><a href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">glm::highp_i64</a></div><div class=\"ttdeci\">detail::int64 highp_i64</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00242\">fwd.hpp:242</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga73c6abb280a45feeff60f9accaee91f3\"><div class=\"ttname\"><a href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">glm::highp_int64_t</a></div><div class=\"ttdeci\">detail::int64 highp_int64_t</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00226\">fwd.hpp:226</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadfe65c78231039e90507770db50c98c7\"><div class=\"ttname\"><a href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">glm::mediump_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 mediump_uint8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00773\">fwd.hpp:773</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1b09f03da7ac43055c68a349d5445083\"><div class=\"ttname\"><a href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">glm::lowp_u8</a></div><div class=\"ttdeci\">detail::uint8 lowp_u8</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00739\">fwd.hpp:739</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf5e94bf2a20af7601787c154751dc2e1\"><div class=\"ttname\"><a href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">glm::mediump_i32</a></div><div class=\"ttdeci\">detail::int32 mediump_i32</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00190\">fwd.hpp:190</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga28d97808322d3c92186e4a0c067d7e8e\"><div class=\"ttname\"><a href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">glm::uint8_t</a></div><div class=\"ttdeci\">detail::uint8 uint8_t</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00879\">fwd.hpp:879</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6af54d70d9beb0a7ef992a879e86b04f\"><div class=\"ttname\"><a href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">glm::fmat3x2</a></div><div class=\"ttdeci\">highp_f32mat3x2 fmat3x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02357\">fwd.hpp:2357</a></div></div>\n<div class=\"ttc\" id=\"a00103_html\"><div class=\"ttname\"><a href=\"a00103.html\">type_float.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga701f32ab5b3fb06996b41f5c0d643805\"><div class=\"ttname\"><a href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">glm::f32vec1</a></div><div class=\"ttdeci\">highp_f32vec1 f32vec1</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02399\">fwd.hpp:2399</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga713c796c54875cf4092d42ff9d9096b0\"><div class=\"ttname\"><a href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">glm::fvec4</a></div><div class=\"ttdeci\">highp_f32vec4 fvec4</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02341\">fwd.hpp:2341</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacb88796f2d08ef253d0345aff20c3aee\"><div class=\"ttname\"><a href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">glm::highp_i8</a></div><div class=\"ttdeci\">detail::int8 highp_i8</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00230\">fwd.hpp:230</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga322a7d7d2c2c68994dc872a33de63c61\"><div class=\"ttname\"><a href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">glm::int64_t</a></div><div class=\"ttdeci\">detail::int64 int64_t</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00282\">fwd.hpp:282</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7f526b5cccef126a2ebcf9bdd890394e\"><div class=\"ttname\"><a href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">glm::i32vec3</a></div><div class=\"ttdeci\">highp_i32vec3 i32vec3</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00533\">fwd.hpp:533</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf1b735b4b1145174f4e4167d13778f9b\"><div class=\"ttname\"><a href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">glm::lowp_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 lowp_uint32_t</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00730\">fwd.hpp:730</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab630f76c26b50298187f7889104d4b9c\"><div class=\"ttname\"><a href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">glm::uint64</a></div><div class=\"ttdeci\">detail::uint64 uint64</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00214\">type_int.hpp:214</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaff5189f97f9e842d9636a0f240001b2e\"><div class=\"ttname\"><a href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">glm::int64</a></div><div class=\"ttdeci\">detail::int64 int64</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00209\">type_int.hpp:209</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7b968f2b86a0442a89c7359171e1d866\"><div class=\"ttname\"><a href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">glm::mediump_int64</a></div><div class=\"ttdeci\">detail::int64 mediump_int64</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00162\">fwd.hpp:162</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4f072ada9552e1e480bbb3b1acde5250\"><div class=\"ttname\"><a href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">glm::lowp_u32</a></div><div class=\"ttdeci\">detail::uint32 lowp_u32</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00747\">fwd.hpp:747</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4177a44206121dabc8c4ff1c0f544574\"><div class=\"ttname\"><a href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">glm::i8vec4</a></div><div class=\"ttdeci\">highp_i8vec4 i8vec4</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00378\">fwd.hpp:378</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5fde0fa4a3852a9dd5d637a92ee74718\"><div class=\"ttname\"><a href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">glm::highp_int16</a></div><div class=\"ttdeci\">detail::int16 highp_int16</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00202\">fwd.hpp:202</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8c8aa45aafcc23238edb1d5aeb801774\"><div class=\"ttname\"><a href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">glm::fmat4x2</a></div><div class=\"ttdeci\">highp_f32mat4x2 fmat4x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02369\">fwd.hpp:2369</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac87278e0c702ba8afff76316d4eeb769\"><div class=\"ttname\"><a href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">glm::f64mat2x4</a></div><div class=\"ttdeci\">highp_f64mat2x4 f64mat2x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02529\">fwd.hpp:2529</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1bd0e914158bf03135f8a317de6debe9\"><div class=\"ttname\"><a href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">glm::mediump_u32</a></div><div class=\"ttdeci\">detail::uint32 mediump_u32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00797\">fwd.hpp:797</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga41c6189f6485c2825d60fdc835b3a2b0\"><div class=\"ttname\"><a href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">glm::int8</a></div><div class=\"ttdeci\">detail::int8 int8</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00206\">type_int.hpp:206</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gad281decae52948b82feb3a9db8f63a7b\"><div class=\"ttname\"><a href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">glm::highp_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, highp &gt; highp_vec4</div><div class=\"ttdoc\">4 components vector of high single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00352\">type_vec.hpp:352</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9b170dd4a8f38448a2dc93987c7875e9\"><div class=\"ttname\"><a href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">glm::mediump_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 mediump_uint64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00785\">fwd.hpp:785</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2a78447eb9d66a114b193f4a25899c16\"><div class=\"ttname\"><a href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">glm::u16vec2</a></div><div class=\"ttdeci\">highp_u16vec2 u16vec2</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01059\">fwd.hpp:1059</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga65261fa8a21045c8646ddff114a56174\"><div class=\"ttname\"><a href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">glm::f32mat3x3</a></div><div class=\"ttdeci\">highp_f32mat3x3 f32mat3x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02431\">fwd.hpp:2431</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae267358ff2a41d156d97f5762630235a\"><div class=\"ttname\"><a href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">glm::u32vec3</a></div><div class=\"ttdeci\">highp_u32vec3 u32vec3</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01142\">fwd.hpp:1142</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0ecd3f4952536e5ef12702b44d2626fc\"><div class=\"ttname\"><a href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">glm::f64mat4</a></div><div class=\"ttdeci\">f64mat4x4 f64mat4</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02565\">fwd.hpp:2565</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacd1259f3a9e8d2a9df5be2d74322ef9c\"><div class=\"ttname\"><a href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">glm::highp_u8</a></div><div class=\"ttdeci\">detail::uint8 highp_u8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00839\">fwd.hpp:839</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9b69181efbf8f37ae934f135137b29c0\"><div class=\"ttname\"><a href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">glm::f64mat3</a></div><div class=\"ttdeci\">f64mat3x3 f64mat3</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02561\">fwd.hpp:2561</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3945dd6515d4498cb603e65ff867ab03\"><div class=\"ttname\"><a href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">glm::u64vec4</a></div><div class=\"ttdeci\">highp_u64vec4 u64vec4</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01305\">fwd.hpp:1305</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae627372cfd5f20dd87db490387b71195\"><div class=\"ttname\"><a href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">glm::u32vec1</a></div><div class=\"ttdeci\">highp_u32vec1 u32vec1</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01134\">fwd.hpp:1134</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf645b1a60203b39c0207baff5e3d8c3c\"><div class=\"ttname\"><a href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">glm::lowp_int64</a></div><div class=\"ttdeci\">detail::int64 lowp_int64</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00114\">fwd.hpp:114</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga529496d75775fb656a07993ea9af2450\"><div class=\"ttname\"><a href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">glm::u16vec4</a></div><div class=\"ttdeci\">highp_u16vec4 u16vec4</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01067\">fwd.hpp:1067</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2473d8bf3f4abf967c4d0e18175be6f7\"><div class=\"ttname\"><a href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">glm::f64mat3x2</a></div><div class=\"ttdeci\">highp_f64mat3x2 f64mat3x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02533\">fwd.hpp:2533</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadff3608baa4b5bd3ed28f95c1c2c345d\"><div class=\"ttname\"><a href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">glm::mediump_int16</a></div><div class=\"ttdeci\">detail::int16 mediump_int16</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00154\">fwd.hpp:154</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga36475e31b1992cfde54c1a6f5a148865\"><div class=\"ttname\"><a href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">glm::uint8</a></div><div class=\"ttdeci\">detail::uint8 uint8</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00211\">type_int.hpp:211</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga29b349e037f0b24320b4548a143daee2\"><div class=\"ttname\"><a href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">glm::u8vec1</a></div><div class=\"ttdeci\">highp_u8vec1 u8vec1</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00975\">fwd.hpp:975</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga31cef34e4cd04840c54741ff2f7005f0\"><div class=\"ttname\"><a href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">glm::u32vec4</a></div><div class=\"ttdeci\">highp_u32vec4 u32vec4</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01146\">fwd.hpp:1146</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3ebcb1f6d8d8387253de8bccb058d77f\"><div class=\"ttname\"><a href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">glm::mediump_i64</a></div><div class=\"ttdeci\">detail::int64 mediump_i64</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00194\">fwd.hpp:194</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad9771450a54785d13080cdde0fe20c1d\"><div class=\"ttname\"><a href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">glm::f64mat2</a></div><div class=\"ttdeci\">f64mat2x2 f64mat2</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02557\">fwd.hpp:2557</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacf1ded173e1e2d049c511d095b259e21\"><div class=\"ttname\"><a href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">glm::mediump_i8</a></div><div class=\"ttdeci\">detail::int8 mediump_i8</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00182\">fwd.hpp:182</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga80e72fe94c88498537e8158ba7591c54\"><div class=\"ttname\"><a href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">glm::mediump_int16_t</a></div><div class=\"ttdeci\">detail::int16 mediump_int16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00170\">fwd.hpp:170</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga552a6bde5e75984efb0f863278da2e54\"><div class=\"ttname\"><a href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">glm::lowp_i8</a></div><div class=\"ttdeci\">detail::int8 lowp_i8</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00134\">fwd.hpp:134</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga44e158af77a670ee1b58c03cda9e1619\"><div class=\"ttname\"><a href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">glm::fmat3x4</a></div><div class=\"ttdeci\">highp_f32mat3x4 fmat3x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02365\">fwd.hpp:2365</a></div></div>\n<div class=\"ttc\" id=\"a00106_html\"><div class=\"ttname\"><a href=\"a00106.html\">type_int.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga504ce1631cb2ac02fcf1d44d8c2aa126\"><div class=\"ttname\"><a href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">glm::lowp_u16</a></div><div class=\"ttdeci\">detail::uint16 lowp_u16</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00743\">fwd.hpp:743</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga489b89ba93d4f7b3934df78debc52276\"><div class=\"ttname\"><a href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">glm::u64vec3</a></div><div class=\"ttdeci\">highp_u64vec3 u64vec3</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01301\">fwd.hpp:1301</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga354736e0c645099cd44c42fb2f87c2b8\"><div class=\"ttname\"><a href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">glm::lowp_i64</a></div><div class=\"ttdeci\">detail::int64 lowp_i64</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00146\">fwd.hpp:146</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa212b805736a759998e312cbdd550fae\"><div class=\"ttname\"><a href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">glm::lowp_uint64</a></div><div class=\"ttdeci\">detail::uint64 lowp_uint64</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00717\">fwd.hpp:717</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5a08d36cf7917cd19d081a603d0eae3e\"><div class=\"ttname\"><a href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">glm::i8vec3</a></div><div class=\"ttdeci\">highp_i8vec3 i8vec3</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00374\">fwd.hpp:374</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga24273aa02abaecaab7f160bac437a339\"><div class=\"ttname\"><a href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">glm::fvec2</a></div><div class=\"ttdeci\">highp_f32vec2 fvec2</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02333\">fwd.hpp:2333</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga89930533646b30d021759298aa6bf04a\"><div class=\"ttname\"><a href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">glm::fvec3</a></div><div class=\"ttdeci\">highp_f32vec3 fvec3</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02337\">fwd.hpp:2337</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3963b1050fc65a383ee28e3f827b6e3e\"><div class=\"ttname\"><a href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">glm::mediump_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 mediump_uint16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00777\">fwd.hpp:777</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga30e8baef5d56d5c166872a2bc00f36e9\"><div class=\"ttname\"><a href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">glm::lowp_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, lowp &gt; lowp_vec2</div><div class=\"ttdoc\">2 components vector of low single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00150\">type_vec.hpp:150</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2996630ba7b10535af8e065cf326f761\"><div class=\"ttname\"><a href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">glm::i16vec2</a></div><div class=\"ttdeci\">highp_i16vec2 i16vec2</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00450\">fwd.hpp:450</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga91c4815f93177eb423362fd296a87e9f\"><div class=\"ttname\"><a href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">glm::lowp_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 lowp_uint16_t</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00726\">fwd.hpp:726</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab256cdab5eb582e426d749ae77b5b566\"><div class=\"ttname\"><a href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">glm::f32mat2x3</a></div><div class=\"ttdeci\">highp_f32mat2x3 f32mat2x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02419\">fwd.hpp:2419</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga84ed04b4e0de18c977e932d617e7c223\"><div class=\"ttname\"><a href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">glm::highp_int32</a></div><div class=\"ttdeci\">detail::int32 highp_int32</div><div class=\"ttdoc\">High qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00206\">fwd.hpp:206</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga34dd5ec1988c443bae80f1b20a8ade5f\"><div class=\"ttname\"><a href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">glm::mediump_uint32</a></div><div class=\"ttdeci\">detail::uint32 mediump_uint32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00765\">fwd.hpp:765</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7e80d927ff0a3861ced68dfff8a4020b\"><div class=\"ttname\"><a href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">glm::i8vec1</a></div><div class=\"ttdeci\">highp_i8vec1 i8vec1</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00366\">fwd.hpp:366</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga868e8e4470a3ef97c7ee3032bf90dc79\"><div class=\"ttname\"><a href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">glm::lowp_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, lowp &gt; lowp_vec3</div><div class=\"ttdoc\">3 components vector of low single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00260\">type_vec.hpp:260</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga41d579d81c3d98edd0532244fa02da77\"><div class=\"ttname\"><a href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">glm::float32_t</a></div><div class=\"ttdeci\">highp_float32_t float32_t</div><div class=\"ttdoc\">Default 32 bit single-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01499\">fwd.hpp:1499</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2171d9dc1fefb1c82e2817f45b622eac\"><div class=\"ttname\"><a href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">glm::uint32_t</a></div><div class=\"ttdeci\">detail::uint32 uint32_t</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00887\">fwd.hpp:887</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga916c1aed91cf91f7b41399ebe7c6e185\"><div class=\"ttname\"><a href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">glm::f64mat3x3</a></div><div class=\"ttdeci\">highp_f64mat3x3 f64mat3x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02537\">fwd.hpp:2537</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8df669f4e7698dfe0c0354d92578d74f\"><div class=\"ttname\"><a href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">glm::int32</a></div><div class=\"ttdeci\">detail::int32 int32</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00208\">type_int.hpp:208</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3999d3e7ff22025c16ddb601e14dfdee\"><div class=\"ttname\"><a href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">glm::uint64_t</a></div><div class=\"ttdeci\">detail::uint64 uint64_t</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00891\">fwd.hpp:891</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><div class=\"ttname\"><a href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">glm::lowp_i32</a></div><div class=\"ttdeci\">detail::int32 lowp_i32</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00142\">fwd.hpp:142</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0336abc2604dd2c20c30e036454b64f8\"><div class=\"ttname\"><a href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">glm::highp_i16</a></div><div class=\"ttdeci\">detail::int16 highp_i16</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00234\">fwd.hpp:234</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa07c86650253672a19dbfb898f3265b8\"><div class=\"ttname\"><a href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">glm::fmat3x3</a></div><div class=\"ttdeci\">highp_f32mat3x3 fmat3x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02361\">fwd.hpp:2361</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaca61dfaccbf2f58f2d8063a4e76b44a9\"><div class=\"ttname\"><a href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">glm::highp_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, highp &gt; highp_vec3</div><div class=\"ttdoc\">3 components vector of high single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00246\">type_vec.hpp:246</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga30069d1f02b19599cbfadf98c23ac6ed\"><div class=\"ttname\"><a href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">glm::lowp_u64</a></div><div class=\"ttdeci\">detail::uint64 lowp_u64</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00751\">fwd.hpp:751</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><div class=\"ttname\"><a href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">glm::u16vec1</a></div><div class=\"ttdeci\">highp_u16vec1 u16vec1</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01055\">fwd.hpp:1055</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaef3824ed4fe435a019c5b9dddf53fec5\"><div class=\"ttname\"><a href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">glm::u64vec2</a></div><div class=\"ttdeci\">highp_u64vec2 u64vec2</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01297\">fwd.hpp:1297</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga14c583bd625eda8cf4935a14d5dd544d\"><div class=\"ttname\"><a href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">glm::f64quat</a></div><div class=\"ttdeci\">highp_f64quat f64quat</div><div class=\"ttdoc\">Default double-qualifier floating-point quaternion. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02569\">fwd.hpp:2569</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga20779a61de2fd526a17f12fe53ec46b1\"><div class=\"ttname\"><a href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">glm::u8vec4</a></div><div class=\"ttdeci\">highp_u8vec4 u8vec4</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00987\">fwd.hpp:987</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4541dc2feb2a31d6ecb5a303f3dd3280\"><div class=\"ttname\"><a href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">glm::fmat2</a></div><div class=\"ttdeci\">fmat2x2 fmat2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02381\">fwd.hpp:2381</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga31c6ca0e074a44007f49a9a3720b18c8\"><div class=\"ttname\"><a href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">glm::f32vec4</a></div><div class=\"ttdeci\">highp_f32vec4 f32vec4</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02411\">fwd.hpp:2411</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga681381f19f11c9e5ee45cda2c56937ff\"><div class=\"ttname\"><a href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">glm::fmat2x4</a></div><div class=\"ttdeci\">highp_f32mat2x4 fmat2x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02353\">fwd.hpp:2353</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab7daf79d6bc06a68bea1c6f5e11b5512\"><div class=\"ttname\"><a href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">glm::f64mat4x2</a></div><div class=\"ttdeci\">highp_f64mat4x2 f64mat4x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02545\">fwd.hpp:2545</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3350c93c3275298f940a42875388e4b4\"><div class=\"ttname\"><a href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">glm::fmat2x2</a></div><div class=\"ttdeci\">highp_f32mat2x2 fmat2x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02345\">fwd.hpp:2345</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga91f91f411080c37730856ff5887f5bcf\"><div class=\"ttname\"><a href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">glm::uint16_t</a></div><div class=\"ttdeci\">detail::uint16 uint16_t</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00883\">fwd.hpp:883</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac4e00a26a2adb5f2c0a7096810df29e5\"><div class=\"ttname\"><a href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">glm::highp_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 highp_uint8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00823\">fwd.hpp:823</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gabc61976261c406520c7a8e4d946dc3f0\"><div class=\"ttname\"><a href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">glm::mediump_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, mediump &gt; mediump_vec2</div><div class=\"ttdoc\">2 components vector of medium single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00143\">type_vec.hpp:143</a></div></div>\n<div class=\"ttc\" id=\"a00120_html\"><div class=\"ttname\"><a href=\"a00120.html\">type_vec.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6966c0cb4673928c9c9da2e91006d2c0\"><div class=\"ttname\"><a href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">glm::f32quat</a></div><div class=\"ttdeci\">highp_f32quat f32quat</div><div class=\"ttdoc\">Default single-qualifier floating-point quaternion. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02463\">fwd.hpp:2463</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9ec7c4c79e303c053e30729a95fb2c37\"><div class=\"ttname\"><a href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">glm::f64mat2x2</a></div><div class=\"ttdeci\">highp_f64mat2x2 f64mat2x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02521\">fwd.hpp:2521</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab5596d48586414c91ccb270962dc14d3\"><div class=\"ttname\"><a href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">glm::float64</a></div><div class=\"ttdeci\">double float64</div><div class=\"ttdoc\">Default 64 bit double-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00103_source.html#l00056\">type_float.hpp:56</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><div class=\"ttname\"><a href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">glm::i32vec1</a></div><div class=\"ttdeci\">highp_i32vec1 i32vec1</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00525\">fwd.hpp:525</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga62a17cddeb4dffb4e18fe3aea23f051a\"><div class=\"ttname\"><a href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">glm::mediump_i16</a></div><div class=\"ttdeci\">detail::int16 mediump_i16</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00186\">fwd.hpp:186</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad0549c902a96a7164e4ac858d5f39dbf\"><div class=\"ttname\"><a href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">glm::highp_int8</a></div><div class=\"ttdeci\">detail::int8 highp_int8</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00198\">fwd.hpp:198</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gace3acb313c800552a9411953eb8b2ed7\"><div class=\"ttname\"><a href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">glm::lowp_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, lowp &gt; lowp_vec4</div><div class=\"ttdoc\">4 components vector of low single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00364\">type_vec.hpp:364</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaebf341fc4a5be233f7dde962c2e33847\"><div class=\"ttname\"><a href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">glm::lowp_int64_t</a></div><div class=\"ttdeci\">detail::int64 lowp_int64_t</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00130\">fwd.hpp:130</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2b65767f8b5aed1bd1cf86c541662b50\"><div class=\"ttname\"><a href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">glm::i64vec1</a></div><div class=\"ttdeci\">highp_i64vec1 i64vec1</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00684\">fwd.hpp:684</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga97432f9979e73e66567361fd01e4cffb\"><div class=\"ttname\"><a href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">glm::highp_uint8</a></div><div class=\"ttdeci\">detail::uint8 highp_uint8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00807\">fwd.hpp:807</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3e2e66ffbe341a80bc005ba2b9552110\"><div class=\"ttname\"><a href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">glm::f64mat4x3</a></div><div class=\"ttdeci\">highp_f64mat4x3 f64mat4x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02549\">fwd.hpp:2549</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5d6c70e080409a76a257dc55bd8ea2c8\"><div class=\"ttname\"><a href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">glm::f32vec2</a></div><div class=\"ttdeci\">highp_f32vec2 f32vec2</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02403\">fwd.hpp:2403</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga2384e263df19f1404b733016eff78fca\"><div class=\"ttname\"><a href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">glm::mediump_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, mediump &gt; mediump_vec3</div><div class=\"ttdoc\">3 components vector of medium single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00253\">type_vec.hpp:253</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gafe730798732aa7b0647096a004db1b1c\"><div class=\"ttname\"><a href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">glm::i16vec1</a></div><div class=\"ttdeci\">highp_i16vec1 i16vec1</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00446\">fwd.hpp:446</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga667948cfe6fb3d6606c750729ec49f77\"><div class=\"ttname\"><a href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">glm::i64vec3</a></div><div class=\"ttdeci\">highp_i64vec3 i64vec3</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00692\">fwd.hpp:692</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga866a05905c49912309ed1fa5f5980e61\"><div class=\"ttname\"><a href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">glm::i32vec4</a></div><div class=\"ttdeci\">highp_i32vec4 i32vec4</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00537\">fwd.hpp:537</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga04100c76f7d55a0dd0983ccf05142bff\"><div class=\"ttname\"><a href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">glm::f32mat2x2</a></div><div class=\"ttdeci\">highp_f32mat2x2 f32mat2x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02415\">fwd.hpp:2415</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga55a2d2a8eb09b5633668257eb3cad453\"><div class=\"ttname\"><a href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">glm::fmat2x3</a></div><div class=\"ttdeci\">highp_f32mat2x3 fmat2x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02349\">fwd.hpp:2349</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga30652709815ad9404272a31957daa59e\"><div class=\"ttname\"><a href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">glm::mediump_uint64</a></div><div class=\"ttdeci\">detail::uint64 mediump_uint64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00769\">fwd.hpp:769</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga13471cbbe74e4303a57f3743d007b74d\"><div class=\"ttname\"><a href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">glm::uint16</a></div><div class=\"ttdeci\">detail::uint16 uint16</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00212\">type_int.hpp:212</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad01cc6479bde1fd1870f13d3ed9530b3\"><div class=\"ttname\"><a href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">glm::fmat4x4</a></div><div class=\"ttdeci\">highp_f32mat4x4 fmat4x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02377\">fwd.hpp:2377</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8b2cd8d31eb345b2d641d9261c38db1a\"><div class=\"ttname\"><a href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">glm::lowp_int16_t</a></div><div class=\"ttdeci\">detail::int16 lowp_int16_t</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00122\">fwd.hpp:122</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3b32ca1e57a4ef91babbc3d35a34ea20\"><div class=\"ttname\"><a href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">glm::f32mat4x2</a></div><div class=\"ttdeci\">highp_f32mat4x2 f32mat4x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02439\">fwd.hpp:2439</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga26fc7ced1ad7ca5024f1c973c8dc9180\"><div class=\"ttname\"><a href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">glm::mediump_int32_t</a></div><div class=\"ttdeci\">detail::int32 mediump_int32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00174\">fwd.hpp:174</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0350631d35ff800e6133ac6243b13cbc\"><div class=\"ttname\"><a href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">glm::lowp_int32_t</a></div><div class=\"ttdeci\">detail::int32 lowp_int32_t</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00126\">fwd.hpp:126</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa46172d7dc1c7ffe3e78107ff88adf08\"><div class=\"ttname\"><a href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">glm::highp_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 highp_uint64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00835\">fwd.hpp:835</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab12383ed6ac7595ed6fde4d266c58425\"><div class=\"ttname\"><a href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">glm::f32mat2</a></div><div class=\"ttdeci\">f32mat2x2 f32mat2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02451\">fwd.hpp:2451</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><div class=\"ttname\"><a href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">glm::f32</a></div><div class=\"ttdeci\">highp_float32_t f32</div><div class=\"ttdoc\">Default 32 bit single-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01507\">fwd.hpp:1507</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa7a1ddca75c5f629173bf4772db7a635\"><div class=\"ttname\"><a href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">glm::f64vec3</a></div><div class=\"ttdeci\">highp_f64vec3 f64vec3</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02513\">fwd.hpp:2513</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaecc7082561fc9028b844b6cf3d305d36\"><div class=\"ttname\"><a href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">glm::u8</a></div><div class=\"ttdeci\">detail::uint8 u8</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00896\">fwd.hpp:896</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga119c41d73fe9977358174eb3ac1035a3\"><div class=\"ttname\"><a href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">glm::lowp_int8_t</a></div><div class=\"ttdeci\">detail::int8 lowp_int8_t</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00118\">fwd.hpp:118</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacf54c3330ef60aa3d16cb676c7bcb8c7\"><div class=\"ttname\"><a href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">glm::highp_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 highp_uint16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00827\">fwd.hpp:827</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga302ec977b0c0c3ea245b6c9275495355\"><div class=\"ttname\"><a href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">glm::i8</a></div><div class=\"ttdeci\">detail::int8 i8</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00287\">fwd.hpp:287</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad06935764d78f43f9d542c784c2212ec\"><div class=\"ttname\"><a href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">glm::i8vec2</a></div><div class=\"ttdeci\">highp_i8vec2 i8vec2</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00370\">fwd.hpp:370</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0c181fdf06a309691999926b6690c969\"><div class=\"ttname\"><a href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">glm::highp_u64</a></div><div class=\"ttdeci\">detail::uint64 highp_u64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00851\">fwd.hpp:851</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga253d453c20e037730023fea0215cb6f6\"><div class=\"ttname\"><a href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">glm::fmat3</a></div><div class=\"ttdeci\">fmat3x3 fmat3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02385\">fwd.hpp:2385</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae8f5e3e964ca2ae240adc2c0d74adede\"><div class=\"ttname\"><a href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">glm::int16_t</a></div><div class=\"ttdeci\">detail::int16 int16_t</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00274\">fwd.hpp:274</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga698e36b01167fc0f037889334dce8def\"><div class=\"ttname\"><a href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">glm::lowp_int16</a></div><div class=\"ttdeci\">detail::int16 lowp_int16</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00106\">fwd.hpp:106</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8dd3a3281ae5c970ffe0c41d538aa153\"><div class=\"ttname\"><a href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">glm::lowp_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 lowp_uint64_t</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00734\">fwd.hpp:734</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf09f3ca4b671a4a4f84505eb4cc865fd\"><div class=\"ttname\"><a href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">glm::u64vec1</a></div><div class=\"ttdeci\">highp_u64vec1 u64vec1</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01293\">fwd.hpp:1293</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga66e92e57260bdb910609b9a56bf83e97\"><div class=\"ttname\"><a href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">glm::f64vec4</a></div><div class=\"ttdeci\">highp_f64vec4 f64vec4</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02517\">fwd.hpp:2517</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga550831bfc26d1e0101c1cb3d79938c06\"><div class=\"ttname\"><a href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">glm::i16vec4</a></div><div class=\"ttdeci\">highp_i16vec4 i16vec4</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00458\">fwd.hpp:458</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae9c90a867a6026b1f6eab00456f3fb8b\"><div class=\"ttname\"><a href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">glm::i16vec3</a></div><div class=\"ttdeci\">highp_i16vec3 i16vec3</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00454\">fwd.hpp:454</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><div class=\"ttname\"><a href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">glm::highp_int32_t</a></div><div class=\"ttdeci\">detail::int32 highp_int32_t</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00222\">fwd.hpp:222</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae52e2b7077a9ff928a06ab5ce600b81e\"><div class=\"ttname\"><a href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">glm::f64mat4x4</a></div><div class=\"ttdeci\">highp_f64mat4x4 f64mat4x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02553\">fwd.hpp:2553</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga864aabca5f3296e176e0c3ed9cc16b02\"><div class=\"ttname\"><a href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">glm::lowp_int32</a></div><div class=\"ttdeci\">detail::int32 lowp_int32</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00110\">fwd.hpp:110</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5244cef85d6e870e240c76428a262ae8\"><div class=\"ttname\"><a href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">glm::mediump_int32</a></div><div class=\"ttdeci\">detail::int32 mediump_int32</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00158\">fwd.hpp:158</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga48310188e1d0c616bf8d78c92447523b\"><div class=\"ttname\"><a href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">glm::i64vec2</a></div><div class=\"ttdeci\">highp_i64vec2 i64vec2</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00688\">fwd.hpp:688</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad1213a22bbb9e4107f07eaa4956f8281\"><div class=\"ttname\"><a href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">glm::mediump_u8</a></div><div class=\"ttdeci\">detail::uint8 mediump_u8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00789\">fwd.hpp:789</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6d7b3789ecb932c26430009478cac7ae\"><div class=\"ttname\"><a href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">glm::mediump_int8_t</a></div><div class=\"ttdeci\">detail::int8 mediump_int8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00166\">fwd.hpp:166</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga746dc6da204f5622e395f492997dbf57\"><div class=\"ttname\"><a href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">glm::highp_uint16</a></div><div class=\"ttdeci\">detail::uint16 highp_uint16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00811\">fwd.hpp:811</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae978599c9711ac263ba732d4ac225b0e\"><div class=\"ttname\"><a href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">glm::highp_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 highp_uint32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00831\">fwd.hpp:831</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga518b8d948a6b4ddb72f84d5c3b7b6611\"><div class=\"ttname\"><a href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">glm::u8vec2</a></div><div class=\"ttdeci\">highp_u8vec2 u8vec2</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00979\">fwd.hpp:979</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4bf09d8838a86866b39ee6e109341645\"><div class=\"ttname\"><a href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">glm::int8_t</a></div><div class=\"ttdeci\">detail::int8 int8_t</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00270\">fwd.hpp:270</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaa92c1954d71b1e7914874bd787b43d1c\"><div class=\"ttname\"><a href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">glm::highp_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, highp &gt; highp_vec2</div><div class=\"ttdoc\">2 components vector of high single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00136\">type_vec.hpp:136</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa4e31c3d9de067029efeb161a44b0232\"><div class=\"ttname\"><a href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">glm::i64vec4</a></div><div class=\"ttdeci\">highp_i64vec4 i64vec4</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00696\">fwd.hpp:696</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga98b9ed43cf8c5cf1d354b23c7df9119f\"><div class=\"ttname\"><a href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">glm::fvec1</a></div><div class=\"ttdeci\">highp_f32vec1 fvec1</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02329\">fwd.hpp:2329</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8165913e068444f7842302d40ba897b9\"><div class=\"ttname\"><a href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">glm::u32</a></div><div class=\"ttdeci\">detail::uint32 u32</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00904\">fwd.hpp:904</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8e62c883d13f47015f3b70ed88751369\"><div class=\"ttname\"><a href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">glm::highp_u16</a></div><div class=\"ttdeci\">detail::uint16 highp_u16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00843\">fwd.hpp:843</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5fa3ddcab56c789bc272ff5651faa12d\"><div class=\"ttname\"><a href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">glm::uint32</a></div><div class=\"ttdeci\">detail::uint32 uint32</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00213\">type_int.hpp:213</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf3f312156984c365e9f65620354da70b\"><div class=\"ttname\"><a href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">glm::u64</a></div><div class=\"ttdeci\">detail::uint64 u64</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00908\">fwd.hpp:908</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8cb400c0f4438f2640035d7b9824a0ca\"><div class=\"ttname\"><a href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">glm::fmat4</a></div><div class=\"ttdeci\">fmat4x4 fmat4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02389\">fwd.hpp:2389</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaee4da0e9fbd8cfa2f89cb80889719dc3\"><div class=\"ttname\"><a href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">glm::f32mat4x4</a></div><div class=\"ttdeci\">highp_f32mat4x4 f32mat4x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02447\">fwd.hpp:2447</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga96faea43ac5f875d2d3ffbf8d213e3eb\"><div class=\"ttname\"><a href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">glm::i32</a></div><div class=\"ttdeci\">detail::int32 i32</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00295\">fwd.hpp:295</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab90ade28222f8b861d5ceaf81a3a7f5d\"><div class=\"ttname\"><a href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">glm::f32mat3x4</a></div><div class=\"ttdeci\">highp_f32mat3x4 f32mat3x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02435\">fwd.hpp:2435</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3ab5fe184343d394fb6c2723c3ee3699\"><div class=\"ttname\"><a href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">glm::i16</a></div><div class=\"ttdeci\">detail::int16 i16</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00291\">fwd.hpp:291</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga392b673fd10847bfb78fb808c6cf8ff7\"><div class=\"ttname\"><a href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">glm::lowp_i16</a></div><div class=\"ttdeci\">detail::int16 lowp_i16</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00138\">fwd.hpp:138</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga667b2ece2b258be898812dc2177995d1\"><div class=\"ttname\"><a href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">glm::lowp_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 lowp_uint8_t</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00722\">fwd.hpp:722</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2a266e46ee218d0c680f12b35c500cc0\"><div class=\"ttname\"><a href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">glm::u32vec2</a></div><div class=\"ttdeci\">highp_u32vec2 u32vec2</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01138\">fwd.hpp:1138</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2885a6c89916911e418c06bb76b9bdbb\"><div class=\"ttname\"><a href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">glm::mediump_uint16</a></div><div class=\"ttdeci\">detail::uint16 mediump_uint16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00761\">fwd.hpp:761</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga226a8d52b4e3f77aaa6231135e886aac\"><div class=\"ttname\"><a href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">glm::highp_int64</a></div><div class=\"ttdeci\">detail::int64 highp_int64</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00210\">fwd.hpp:210</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf512b74c4400b68f9fdf9388b3d6aac8\"><div class=\"ttname\"><a href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">glm::f32mat2x4</a></div><div class=\"ttdeci\">highp_f32mat2x4 f32mat2x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02423\">fwd.hpp:2423</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga856f3905ee7cc2e4890a8a1d56c150be\"><div class=\"ttname\"><a href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">glm::f32mat3</a></div><div class=\"ttdeci\">f32mat3x3 f32mat3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02455\">fwd.hpp:2455</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga042ef09ff2f0cb24a36f541bcb3a3710\"><div class=\"ttname\"><a href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">glm::int32_t</a></div><div class=\"ttdeci\">detail::int32 int32_t</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00278\">fwd.hpp:278</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacaea06d0a79ef3172e887a7a6ba434ff\"><div class=\"ttname\"><a href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">glm::highp_int16_t</a></div><div class=\"ttdeci\">detail::int16 highp_int16_t</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00218\">fwd.hpp:218</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga760bcf26fdb23a2c3ecad3c928a19ae6\"><div class=\"ttname\"><a href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">glm::lowp_int8</a></div><div class=\"ttdeci\">detail::int8 lowp_int8</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00102\">fwd.hpp:102</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1085c50dd8fbeb5e7e609b1c127492a5\"><div class=\"ttname\"><a href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">glm::highp_int8_t</a></div><div class=\"ttdeci\">detail::int8 highp_int8_t</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00214\">fwd.hpp:214</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8b44026374982dcd1e52d22bac99247e\"><div class=\"ttname\"><a href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">glm::i32vec2</a></div><div class=\"ttdeci\">highp_i32vec2 i32vec2</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00529\">fwd.hpp:529</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4295048a78bdf46b8a7de77ec665b497\"><div class=\"ttname\"><a href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">glm::fmat4x3</a></div><div class=\"ttdeci\">highp_f32mat4x3 fmat4x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02373\">fwd.hpp:2373</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1320a08e14fdff3821241eefab6947e9\"><div class=\"ttname\"><a href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">glm::f32mat3x2</a></div><div class=\"ttdeci\">highp_f32mat3x2 f32mat3x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02427\">fwd.hpp:2427</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><div class=\"ttname\"><a href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">glm::highp_uint64</a></div><div class=\"ttdeci\">detail::uint64 highp_uint64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00819\">fwd.hpp:819</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadb997e409103d4da18abd837e636a496\"><div class=\"ttname\"><a href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">glm::i64</a></div><div class=\"ttdeci\">detail::int64 i64</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00299\">fwd.hpp:299</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga99d1b85ff99956b33da7e9992aad129a\"><div class=\"ttname\"><a href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">glm::f32mat4</a></div><div class=\"ttdeci\">f32mat4x4 f32mat4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02459\">fwd.hpp:2459</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac3bc41bcac61d1ba8f02a6f68ce23f64\"><div class=\"ttname\"><a href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">glm::mediump_int64_t</a></div><div class=\"ttdeci\">detail::int64 mediump_int64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00178\">fwd.hpp:178</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa2d7acc0adb536fab71fe261232a40ff\"><div class=\"ttname\"><a href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">glm::u16</a></div><div class=\"ttdeci\">detail::uint16 u16</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00900\">fwd.hpp:900</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1d794d240091678f602e8de225b8d8c9\"><div class=\"ttname\"><a href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">glm::f64</a></div><div class=\"ttdeci\">highp_float64_t f64</div><div class=\"ttdoc\">Default 64 bit double-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01511\">fwd.hpp:1511</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf4dae276fd29623950de14a6ca2586b5\"><div class=\"ttname\"><a href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">glm::mediump_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 mediump_uint32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00781\">fwd.hpp:781</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><div class=\"ttname\"><a href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">glm::mediump_uint8</a></div><div class=\"ttdeci\">detail::uint8 mediump_uint8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00757\">fwd.hpp:757</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6957c7b22f405683bb276554ca40dc37\"><div class=\"ttname\"><a href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">glm::float64_t</a></div><div class=\"ttdeci\">highp_float64_t float64_t</div><div class=\"ttdoc\">Default 64 bit double-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01503\">fwd.hpp:1503</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7c5706f6bbe5282e5598acf7e7b377e2\"><div class=\"ttname\"><a href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">glm::u8vec3</a></div><div class=\"ttdeci\">highp_u8vec3 u8vec3</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00983\">fwd.hpp:983</a></div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00034.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: geometric.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">geometric.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00034_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaeeec0794212fe84fc9d261de067c9587\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaeeec0794212fe84fc9d261de067c9587\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#gaeeec0794212fe84fc9d261de067c9587\">cross</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gaeeec0794212fe84fc9d261de067c9587\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the cross product of x and y.  <a href=\"a00142.html#gaeeec0794212fe84fc9d261de067c9587\">More...</a><br /></td></tr>\n<tr class=\"separator:gaeeec0794212fe84fc9d261de067c9587\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa68de6c53e20dfb2dac2d20197562e3f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa68de6c53e20dfb2dac2d20197562e3f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f\">distance</a> (vec&lt; L, T, Q &gt; const &amp;p0, vec&lt; L, T, Q &gt; const &amp;p1)</td></tr>\n<tr class=\"memdesc:gaa68de6c53e20dfb2dac2d20197562e3f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).  <a href=\"a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa68de6c53e20dfb2dac2d20197562e3f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#gaad6c5d9d39bdc0bf43baf1b22e147a0a\">dot</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the dot product of x and y, i.e., result = x * y.  <a href=\"a00142.html#gaad6c5d9d39bdc0bf43baf1b22e147a0a\">More...</a><br /></td></tr>\n<tr class=\"separator:gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7aed0a36c738169402404a3a5d54e43b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7aed0a36c738169402404a3a5d54e43b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga7aed0a36c738169402404a3a5d54e43b\">faceforward</a> (vec&lt; L, T, Q &gt; const &amp;N, vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;Nref)</td></tr>\n<tr class=\"memdesc:ga7aed0a36c738169402404a3a5d54e43b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">If dot(Nref, I) &lt; 0.0, return N, otherwise, return -N.  <a href=\"a00142.html#ga7aed0a36c738169402404a3a5d54e43b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7aed0a36c738169402404a3a5d54e43b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0cdabbb000834d994a1d6dc56f8f5263\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0cdabbb000834d994a1d6dc56f8f5263\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga0cdabbb000834d994a1d6dc56f8f5263\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the length of x, i.e., sqrt(x * x).  <a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0cdabbb000834d994a1d6dc56f8f5263\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b8d3dcae77870781392ed2902cce597\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3b8d3dcae77870781392ed2902cce597\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga3b8d3dcae77870781392ed2902cce597\">normalize</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3b8d3dcae77870781392ed2902cce597\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a vector in the same direction as x but with length of 1.  <a href=\"a00142.html#ga3b8d3dcae77870781392ed2902cce597\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b8d3dcae77870781392ed2902cce597\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5631dd1d5618de5450b1ea3cf3e94905\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5631dd1d5618de5450b1ea3cf3e94905\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga5631dd1d5618de5450b1ea3cf3e94905\">reflect</a> (vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;N)</td></tr>\n<tr class=\"memdesc:ga5631dd1d5618de5450b1ea3cf3e94905\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">For the incident vector I and surface orientation N, returns the reflection direction : result = I - 2.0 * dot(N, I) * N.  <a href=\"a00142.html#ga5631dd1d5618de5450b1ea3cf3e94905\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5631dd1d5618de5450b1ea3cf3e94905\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga01da3dff9e2ef6b9d4915c3047e22b74\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga01da3dff9e2ef6b9d4915c3047e22b74\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga01da3dff9e2ef6b9d4915c3047e22b74\">refract</a> (vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;N, T eta)</td></tr>\n<tr class=\"memdesc:ga01da3dff9e2ef6b9d4915c3047e22b74\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">For the incident vector I and surface normal N, and the ratio of indices of refraction eta, return the refraction vector.  <a href=\"a00142.html#ga01da3dff9e2ef6b9d4915c3047e22b74\">More...</a><br /></td></tr>\n<tr class=\"separator:ga01da3dff9e2ef6b9d4915c3047e22b74\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00034_source.html\">geometric.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00034_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: geometric.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">geometric.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00034.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">detail/type_vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f\">distance</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; p0, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; p1);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00142.html#gaad6c5d9d39bdc0bf43baf1b22e147a0a\">dot</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00142.html#gaeeec0794212fe84fc9d261de067c9587\">cross</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00142.html#ga3b8d3dcae77870781392ed2902cce597\">normalize</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00142.html#ga7aed0a36c738169402404a3a5d54e43b\">faceforward</a>(</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; N,</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; I,</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Nref);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00142.html#ga5631dd1d5618de5450b1ea3cf3e94905\">reflect</a>(</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; I,</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; N);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00142.html#ga01da3dff9e2ef6b9d4915c3047e22b74\">refract</a>(</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; I,</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; N,</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                T eta);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;<span class=\"preprocessor\">#include &quot;detail/func_geometric.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00142_html_gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><div class=\"ttname\"><a href=\"a00142.html#gaad6c5d9d39bdc0bf43baf1b22e147a0a\">glm::dot</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T dot(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the dot product of x and y, i.e., result = x * y. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga7aed0a36c738169402404a3a5d54e43b\"><div class=\"ttname\"><a href=\"a00142.html#ga7aed0a36c738169402404a3a5d54e43b\">glm::faceforward</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; faceforward(vec&lt; L, T, Q &gt; const &amp;N, vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;Nref)</div><div class=\"ttdoc\">If dot(Nref, I) < 0.0, return N, otherwise, return -N. </div></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00142_html_gaeeec0794212fe84fc9d261de067c9587\"><div class=\"ttname\"><a href=\"a00142.html#gaeeec0794212fe84fc9d261de067c9587\">glm::cross</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; cross(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the cross product of x and y. </div></div>\n<div class=\"ttc\" id=\"a00142_html_gaa68de6c53e20dfb2dac2d20197562e3f\"><div class=\"ttname\"><a href=\"a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f\">glm::distance</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T distance(vec&lt; L, T, Q &gt; const &amp;p0, vec&lt; L, T, Q &gt; const &amp;p1)</div><div class=\"ttdoc\">Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). </div></div>\n<div class=\"ttc\" id=\"a00142_html_ga01da3dff9e2ef6b9d4915c3047e22b74\"><div class=\"ttname\"><a href=\"a00142.html#ga01da3dff9e2ef6b9d4915c3047e22b74\">glm::refract</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; refract(vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;N, T eta)</div><div class=\"ttdoc\">For the incident vector I and surface normal N, and the ratio of indices of refraction eta...</div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00142_html_ga5631dd1d5618de5450b1ea3cf3e94905\"><div class=\"ttname\"><a href=\"a00142.html#ga5631dd1d5618de5450b1ea3cf3e94905\">glm::reflect</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; reflect(vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;N)</div><div class=\"ttdoc\">For the incident vector I and surface orientation N, returns the reflection direction : result = I - ...</div></div>\n<div class=\"ttc\" id=\"a00142_html_ga3b8d3dcae77870781392ed2902cce597\"><div class=\"ttname\"><a href=\"a00142.html#ga3b8d3dcae77870781392ed2902cce597\">glm::normalize</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; normalize(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a vector in the same direction as x but with length of 1. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00035.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: glm.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">glm.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00035_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00035_source.html\">glm.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00035_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: glm.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">glm.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00035.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00002.html\">detail/_fixes.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;<span class=\"preprocessor\">#include &lt;cmath&gt;</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;<span class=\"preprocessor\">#include &lt;climits&gt;</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;<span class=\"preprocessor\">#include &lt;cfloat&gt;</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;<span class=\"preprocessor\">#include &lt;cassert&gt;</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00033.html\">fwd.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_CORE_INCLUDED_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_CORE_INCLUDED_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: Core library included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00127.html\">vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00128.html\">vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00129.html\">vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00046.html\">mat2x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00047.html\">mat2x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00048.html\">mat2x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00049.html\">mat3x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00050.html\">mat3x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00051.html\">mat3x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00052.html\">mat4x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00053.html\">mat4x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00054.html\">mat4x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00100.html\">trigonometric.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00024.html\">exponential.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00015.html\">common.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00077.html\">packing.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00034.html\">geometric.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00055.html\">matrix.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;<span class=\"preprocessor\">#include &quot;vector_relational.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00041.html\">integer.hpp</a>&quot;</span></div>\n<div class=\"ttc\" id=\"a00024_html\"><div class=\"ttname\"><a href=\"a00024.html\">exponential.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00127_html\"><div class=\"ttname\"><a href=\"a00127.html\">vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00015_html\"><div class=\"ttname\"><a href=\"a00015.html\">common.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00047_html\"><div class=\"ttname\"><a href=\"a00047.html\">mat2x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00050_html\"><div class=\"ttname\"><a href=\"a00050.html\">mat3x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00055_html\"><div class=\"ttname\"><a href=\"a00055.html\">matrix.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00041_html\"><div class=\"ttname\"><a href=\"a00041.html\">integer.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00100_html\"><div class=\"ttname\"><a href=\"a00100.html\">trigonometric.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00129_html\"><div class=\"ttname\"><a href=\"a00129.html\">vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00046_html\"><div class=\"ttname\"><a href=\"a00046.html\">mat2x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00034_html\"><div class=\"ttname\"><a href=\"a00034.html\">geometric.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00049_html\"><div class=\"ttname\"><a href=\"a00049.html\">mat3x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00054_html\"><div class=\"ttname\"><a href=\"a00054.html\">mat4x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00052_html\"><div class=\"ttname\"><a href=\"a00052.html\">mat4x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00033_html\"><div class=\"ttname\"><a href=\"a00033.html\">fwd.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00077_html\"><div class=\"ttname\"><a href=\"a00077.html\">packing.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00053_html\"><div class=\"ttname\"><a href=\"a00053.html\">mat4x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00128_html\"><div class=\"ttname\"><a href=\"a00128.html\">vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00051_html\"><div class=\"ttname\"><a href=\"a00051.html\">mat3x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00002_html\"><div class=\"ttname\"><a href=\"a00002.html\">_fixes.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00048_html\"><div class=\"ttname\"><a href=\"a00048.html\">mat2x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00036.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: gradient_paint.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gradient_paint.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00187.html\">GLM_GTX_gradient_paint</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00036_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga849241df1e55129b8ce9476200307419\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga849241df1e55129b8ce9476200307419\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00187.html#ga849241df1e55129b8ce9476200307419\">linearGradient</a> (vec&lt; 2, T, Q &gt; const &amp;Point0, vec&lt; 2, T, Q &gt; const &amp;Point1, vec&lt; 2, T, Q &gt; const &amp;Position)</td></tr>\n<tr class=\"memdesc:ga849241df1e55129b8ce9476200307419\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a color from a linear gradient.  <a href=\"a00187.html#ga849241df1e55129b8ce9476200307419\">More...</a><br /></td></tr>\n<tr class=\"separator:ga849241df1e55129b8ce9476200307419\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaecb1e93de4cbe0758b882812d4da294\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaaecb1e93de4cbe0758b882812d4da294\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00187.html#gaaecb1e93de4cbe0758b882812d4da294\">radialGradient</a> (vec&lt; 2, T, Q &gt; const &amp;Center, T const &amp;Radius, vec&lt; 2, T, Q &gt; const &amp;Focal, vec&lt; 2, T, Q &gt; const &amp;Position)</td></tr>\n<tr class=\"memdesc:gaaecb1e93de4cbe0758b882812d4da294\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a color from a radial gradient.  <a href=\"a00187.html#gaaecb1e93de4cbe0758b882812d4da294\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaecb1e93de4cbe0758b882812d4da294\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00187.html\">GLM_GTX_gradient_paint</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00207.html\" title=\"Include <glm/gtx/optimum_pow.hpp> to use the features of this extension. \">GLM_GTX_optimum_pow</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00036_source.html\">gradient_paint.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00036_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: gradient_paint.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gradient_paint.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00036.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/optimum_pow.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_gradient_paint is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_gradient_paint extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00187.html#gaaecb1e93de4cbe0758b882812d4da294\">radialGradient</a>(</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; Center,</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                T <span class=\"keyword\">const</span>&amp; Radius,</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; Focal,</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; Position);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00187.html#ga849241df1e55129b8ce9476200307419\">linearGradient</a>(</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; Point0,</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; Point1,</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; Position);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"preprocessor\">#include &quot;gradient_paint.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00187_html_gaaecb1e93de4cbe0758b882812d4da294\"><div class=\"ttname\"><a href=\"a00187.html#gaaecb1e93de4cbe0758b882812d4da294\">glm::radialGradient</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T radialGradient(vec&lt; 2, T, Q &gt; const &amp;Center, T const &amp;Radius, vec&lt; 2, T, Q &gt; const &amp;Focal, vec&lt; 2, T, Q &gt; const &amp;Position)</div><div class=\"ttdoc\">Return a color from a radial gradient. </div></div>\n<div class=\"ttc\" id=\"a00187_html_ga849241df1e55129b8ce9476200307419\"><div class=\"ttname\"><a href=\"a00187.html#ga849241df1e55129b8ce9476200307419\">glm::linearGradient</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T linearGradient(vec&lt; 2, T, Q &gt; const &amp;Point0, vec&lt; 2, T, Q &gt; const &amp;Point1, vec&lt; 2, T, Q &gt; const &amp;Position)</div><div class=\"ttdoc\">Return a color from a linear gradient. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00037.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: handed_coordinate_space.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">handed_coordinate_space.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00188.html\">GLM_GTX_handed_coordinate_space</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00037_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga6f1bad193b9a3b048543d1935cf04dd3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6f1bad193b9a3b048543d1935cf04dd3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00188.html#ga6f1bad193b9a3b048543d1935cf04dd3\">leftHanded</a> (vec&lt; 3, T, Q &gt; const &amp;tangent, vec&lt; 3, T, Q &gt; const &amp;binormal, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga6f1bad193b9a3b048543d1935cf04dd3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return if a trihedron left handed or not.  <a href=\"a00188.html#ga6f1bad193b9a3b048543d1935cf04dd3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6f1bad193b9a3b048543d1935cf04dd3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99386a5ab5491871b947076e21699cc8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga99386a5ab5491871b947076e21699cc8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00188.html#ga99386a5ab5491871b947076e21699cc8\">rightHanded</a> (vec&lt; 3, T, Q &gt; const &amp;tangent, vec&lt; 3, T, Q &gt; const &amp;binormal, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga99386a5ab5491871b947076e21699cc8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return if a trihedron right handed or not.  <a href=\"a00188.html#ga99386a5ab5491871b947076e21699cc8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99386a5ab5491871b947076e21699cc8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00188.html\">GLM_GTX_handed_coordinate_space</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00037_source.html\">handed_coordinate_space.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00037_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: handed_coordinate_space.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">handed_coordinate_space.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00037.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_handed_coordinate_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_handed_coordinate_space extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00188.html#ga99386a5ab5491871b947076e21699cc8\">rightHanded</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; tangent,</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; binormal,</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; normal);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00188.html#ga6f1bad193b9a3b048543d1935cf04dd3\">leftHanded</a>(</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; tangent,</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; binormal,</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; normal);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">#include &quot;handed_coordinate_space.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00188_html_ga99386a5ab5491871b947076e21699cc8\"><div class=\"ttname\"><a href=\"a00188.html#ga99386a5ab5491871b947076e21699cc8\">glm::rightHanded</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool rightHanded(vec&lt; 3, T, Q &gt; const &amp;tangent, vec&lt; 3, T, Q &gt; const &amp;binormal, vec&lt; 3, T, Q &gt; const &amp;normal)</div><div class=\"ttdoc\">Return if a trihedron right handed or not. </div></div>\n<div class=\"ttc\" id=\"a00188_html_ga6f1bad193b9a3b048543d1935cf04dd3\"><div class=\"ttname\"><a href=\"a00188.html#ga6f1bad193b9a3b048543d1935cf04dd3\">glm::leftHanded</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool leftHanded(vec&lt; 3, T, Q &gt; const &amp;tangent, vec&lt; 3, T, Q &gt; const &amp;binormal, vec&lt; 3, T, Q &gt; const &amp;normal)</div><div class=\"ttdoc\">Return if a trihedron left handed or not. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00038.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: hash.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">hash.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00189.html\">GLM_GTX_hash</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00038_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00189.html\">GLM_GTX_hash</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00038_source.html\">hash.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00038_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: hash.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">hash.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00038.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_hash is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &lt;functional&gt;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/vec1.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/dual_quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#if !GLM_HAS_CXX11_STL</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM_GTX_hash requires C++11 standard library support&quot;</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00139.html\">std</a></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::vec&lt;1, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::vec&lt;2, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::vec&lt;3, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::vec&lt;4, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::tquat&lt;T,P&gt;&gt;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::tdualquat&lt;T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::tdualquat&lt;T,P&gt; <span class=\"keyword\">const</span>&amp; q) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;2, 2, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;2, 2, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;2, 3, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;2, 3, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;2, 4, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;2, 4, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;3, 2, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;3, 2, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;3, 3, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;3, 3, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;3, 4, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;3, 4, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;4, 2, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;4, 2, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;4, 3, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;4, 3, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        <span class=\"keyword\">struct </span>hash&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::mat&lt;4, 4, T,P&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                GLM_FUNC_DECL <span class=\"keywordtype\">size_t</span> operator()(glm::mat&lt;4, 4, T,P&gt; <span class=\"keyword\">const</span>&amp; m) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;} <span class=\"comment\">// namespace std</span></div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;<span class=\"preprocessor\">#include &quot;hash.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00139_html\"><div class=\"ttname\"><a href=\"a00139.html\">std</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00038_source.html#l00045\">hash.hpp:45</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00039.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: integer.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/integer.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00153.html\">GLM_GTC_integer</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00039_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga57824268ebe13a922f1d69a5d37f637f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga57824268ebe13a922f1d69a5d37f637f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html#ga57824268ebe13a922f1d69a5d37f637f\">iround</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga57824268ebe13a922f1d69a5d37f637f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00153.html#ga57824268ebe13a922f1d69a5d37f637f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga57824268ebe13a922f1d69a5d37f637f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bd682e74bfacb005c735305207ec417\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga9bd682e74bfacb005c735305207ec417\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html#ga9bd682e74bfacb005c735305207ec417\">log2</a> (genIUType x)</td></tr>\n<tr class=\"memdesc:ga9bd682e74bfacb005c735305207ec417\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the log2 of x for integer values.  <a href=\"a00153.html#ga9bd682e74bfacb005c735305207ec417\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9bd682e74bfacb005c735305207ec417\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga75c6fd2a143fc44e5f7b871abad539e0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga75c6fd2a143fc44e5f7b871abad539e0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0\">mod</a> (genIUType x, genIUType y)</td></tr>\n<tr class=\"memdesc:ga75c6fd2a143fc44e5f7b871abad539e0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga75c6fd2a143fc44e5f7b871abad539e0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gad32bcde4977c7a42c80468f4061a1f55\">mod</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00140.html#gad32bcde4977c7a42c80468f4061a1f55\">More...</a><br /></td></tr>\n<tr class=\"separator:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">mod</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6715b9d573972a0f7763d30d45bcaec4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6715b9d573972a0f7763d30d45bcaec4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html#ga6715b9d573972a0f7763d30d45bcaec4\">uround</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga6715b9d573972a0f7763d30d45bcaec4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00153.html#ga6715b9d573972a0f7763d30d45bcaec4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6715b9d573972a0f7763d30d45bcaec4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00153.html\">GLM_GTC_integer</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00153.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00039_source.html\">gtc/integer.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00039_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: integer.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/integer.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00039.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../common.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../integer.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../exponential.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_integer extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00153.html#ga9bd682e74bfacb005c735305207ec417\">log2</a>(genIUType x);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0\">mod</a>(genIUType x, genIUType y);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0\">mod</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, T y);</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0\">mod</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        GLM_FUNC_DECL vec&lt;L, int, Q&gt; <a class=\"code\" href=\"a00153.html#ga57824268ebe13a922f1d69a5d37f637f\">iround</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        GLM_FUNC_DECL vec&lt;L, uint, Q&gt; <a class=\"code\" href=\"a00153.html#ga6715b9d573972a0f7763d30d45bcaec4\">uround</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"preprocessor\">#include &quot;integer.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00153_html_ga6715b9d573972a0f7763d30d45bcaec4\"><div class=\"ttname\"><a href=\"a00153.html#ga6715b9d573972a0f7763d30d45bcaec4\">glm::uround</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt; uround(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a value equal to the nearest integer to x. </div></div>\n<div class=\"ttc\" id=\"a00153_html_ga75c6fd2a143fc44e5f7b871abad539e0\"><div class=\"ttname\"><a href=\"a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0\">glm::mod</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genIUType mod(genIUType x, genIUType y)</div><div class=\"ttdoc\">Modulus. </div></div>\n<div class=\"ttc\" id=\"a00153_html_ga9bd682e74bfacb005c735305207ec417\"><div class=\"ttname\"><a href=\"a00153.html#ga9bd682e74bfacb005c735305207ec417\">glm::log2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genIUType log2(genIUType x)</div><div class=\"ttdoc\">Returns the log2 of x for integer values. </div></div>\n<div class=\"ttc\" id=\"a00153_html_ga57824268ebe13a922f1d69a5d37f637f\"><div class=\"ttname\"><a href=\"a00153.html#ga57824268ebe13a922f1d69a5d37f637f\">glm::iround</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, int, Q &gt; iround(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns a value equal to the nearest integer to x. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00040.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: integer.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a> &#124;\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/integer.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00190.html\">GLM_GTX_integer</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00040_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gada7e83fdfe943aba4f1d5bf80cb66f40\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef signed int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40\">sint</a></td></tr>\n<tr class=\"memdesc:gada7e83fdfe943aba4f1d5bf80cb66f40\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32bit signed integer.  <a href=\"a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40\">More...</a><br /></td></tr>\n<tr class=\"separator:gada7e83fdfe943aba4f1d5bf80cb66f40\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8cbd3120905f398ec321b5d1836e08fb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8cbd3120905f398ec321b5d1836e08fb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga8cbd3120905f398ec321b5d1836e08fb\">factorial</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8cbd3120905f398ec321b5d1836e08fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the factorial value of a number (!12 max, integer only) From GLM_GTX_integer extension.  <a href=\"a00190.html#ga8cbd3120905f398ec321b5d1836e08fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8cbd3120905f398ec321b5d1836e08fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7011b4e1c1e1ed492149b028feacc00e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL unsigned int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga7011b4e1c1e1ed492149b028feacc00e\">floor_log2</a> (unsigned int x)</td></tr>\n<tr class=\"memdesc:ga7011b4e1c1e1ed492149b028feacc00e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the floor log2 of x.  <a href=\"a00190.html#ga7011b4e1c1e1ed492149b028feacc00e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7011b4e1c1e1ed492149b028feacc00e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabfbb41531ab7ad8d06fc176edfba785\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#gaabfbb41531ab7ad8d06fc176edfba785\">mod</a> (int x, int y)</td></tr>\n<tr class=\"memdesc:gaabfbb41531ab7ad8d06fc176edfba785\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00190.html#gaabfbb41531ab7ad8d06fc176edfba785\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabfbb41531ab7ad8d06fc176edfba785\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga63fc8d63e7da1706439233b386ba8b6f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga63fc8d63e7da1706439233b386ba8b6f\">mod</a> (uint x, uint y)</td></tr>\n<tr class=\"memdesc:ga63fc8d63e7da1706439233b386ba8b6f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00190.html#ga63fc8d63e7da1706439233b386ba8b6f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga63fc8d63e7da1706439233b386ba8b6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78dff8bdb361bf0061194c93e003d189\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga78dff8bdb361bf0061194c93e003d189\">nlz</a> (uint x)</td></tr>\n<tr class=\"memdesc:ga78dff8bdb361bf0061194c93e003d189\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the number of leading zeros.  <a href=\"a00190.html#ga78dff8bdb361bf0061194c93e003d189\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78dff8bdb361bf0061194c93e003d189\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga465016030a81d513fa2fac881ebdaa83\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga465016030a81d513fa2fac881ebdaa83\">pow</a> (int x, uint y)</td></tr>\n<tr class=\"memdesc:ga465016030a81d513fa2fac881ebdaa83\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the y power.  <a href=\"a00190.html#ga465016030a81d513fa2fac881ebdaa83\">More...</a><br /></td></tr>\n<tr class=\"separator:ga465016030a81d513fa2fac881ebdaa83\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga998e5ee915d3769255519e2fbaa2bbf0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0\">pow</a> (uint x, uint y)</td></tr>\n<tr class=\"memdesc:ga998e5ee915d3769255519e2fbaa2bbf0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the y power.  <a href=\"a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga998e5ee915d3769255519e2fbaa2bbf0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ce36693a75879ccd9bb10167cfa722d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga7ce36693a75879ccd9bb10167cfa722d\">sqrt</a> (int x)</td></tr>\n<tr class=\"memdesc:ga7ce36693a75879ccd9bb10167cfa722d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the positive square root of x.  <a href=\"a00190.html#ga7ce36693a75879ccd9bb10167cfa722d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ce36693a75879ccd9bb10167cfa722d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1975d318978d6dacf78b6444fa5ed7bc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc\">sqrt</a> (uint x)</td></tr>\n<tr class=\"memdesc:ga1975d318978d6dacf78b6444fa5ed7bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the positive square root of x.  <a href=\"a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1975d318978d6dacf78b6444fa5ed7bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00190.html\">GLM_GTX_integer</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00040_source.html\">gtx/integer.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00040_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: integer.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/integer.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00040.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/integer.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_integer is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_integer extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0\">pow</a>(<span class=\"keywordtype\">int</span> x, <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> y);</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc\">sqrt</a>(<span class=\"keywordtype\">int</span> x);</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00190.html#ga7011b4e1c1e1ed492149b028feacc00e\">floor_log2</a>(<span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span> x);</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00190.html#ga63fc8d63e7da1706439233b386ba8b6f\">mod</a>(<span class=\"keywordtype\">int</span> x, <span class=\"keywordtype\">int</span> y);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00190.html#ga8cbd3120905f398ec321b5d1836e08fb\">factorial</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40\">   55</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">int</span>                                      <a class=\"code\" href=\"a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40\">sint</a>;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0\">pow</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> x, <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> y);</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc\">sqrt</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> x);</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00190.html#ga63fc8d63e7da1706439233b386ba8b6f\">mod</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> x, <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> y);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00190.html#ga78dff8bdb361bf0061194c93e003d189\">nlz</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> x);</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\">#include &quot;integer.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00190_html_ga8cbd3120905f398ec321b5d1836e08fb\"><div class=\"ttname\"><a href=\"a00190.html#ga8cbd3120905f398ec321b5d1836e08fb\">glm::factorial</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType factorial(genType const &amp;x)</div><div class=\"ttdoc\">Return the factorial value of a number (!12 max, integer only) From GLM_GTX_integer extension...</div></div>\n<div class=\"ttc\" id=\"a00190_html_ga1975d318978d6dacf78b6444fa5ed7bc\"><div class=\"ttname\"><a href=\"a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc\">glm::sqrt</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint sqrt(uint x)</div><div class=\"ttdoc\">Returns the positive square root of x. </div></div>\n<div class=\"ttc\" id=\"a00190_html_ga63fc8d63e7da1706439233b386ba8b6f\"><div class=\"ttname\"><a href=\"a00190.html#ga63fc8d63e7da1706439233b386ba8b6f\">glm::mod</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint mod(uint x, uint y)</div><div class=\"ttdoc\">Modulus. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00190_html_ga7011b4e1c1e1ed492149b028feacc00e\"><div class=\"ttname\"><a href=\"a00190.html#ga7011b4e1c1e1ed492149b028feacc00e\">glm::floor_log2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL unsigned int floor_log2(unsigned int x)</div><div class=\"ttdoc\">Returns the floor log2 of x. </div></div>\n<div class=\"ttc\" id=\"a00190_html_gada7e83fdfe943aba4f1d5bf80cb66f40\"><div class=\"ttname\"><a href=\"a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40\">glm::sint</a></div><div class=\"ttdeci\">signed int sint</div><div class=\"ttdoc\">32bit signed integer. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00040_source.html#l00055\">gtx/integer.hpp:55</a></div></div>\n<div class=\"ttc\" id=\"a00190_html_ga998e5ee915d3769255519e2fbaa2bbf0\"><div class=\"ttname\"><a href=\"a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0\">glm::pow</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint pow(uint x, uint y)</div><div class=\"ttdoc\">Returns x raised to the y power. </div></div>\n<div class=\"ttc\" id=\"a00190_html_ga78dff8bdb361bf0061194c93e003d189\"><div class=\"ttname\"><a href=\"a00190.html#ga78dff8bdb361bf0061194c93e003d189\">glm::nlz</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint nlz(uint x)</div><div class=\"ttdoc\">Returns the number of leading zeros. </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga91ad9478d81a7aaf2593e8d9c3d06a14\"><div class=\"ttname\"><a href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">glm::uint</a></div><div class=\"ttdeci\">unsigned int uint</div><div class=\"ttdoc\">Unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00288\">type_int.hpp:288</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00041.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: integer.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">integer.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00041_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga44abfe3379e11cbd29425a843420d0d6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga44abfe3379e11cbd29425a843420d0d6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga44abfe3379e11cbd29425a843420d0d6\">bitCount</a> (genType v)</td></tr>\n<tr class=\"memdesc:ga44abfe3379e11cbd29425a843420d0d6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the number of bits set to 1 in the binary representation of value.  <a href=\"a00229.html#ga44abfe3379e11cbd29425a843420d0d6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga44abfe3379e11cbd29425a843420d0d6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5\">bitCount</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the number of bits set to 1 in the binary representation of value.  <a href=\"a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5\">More...</a><br /></td></tr>\n<tr class=\"separator:gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga346b25ab11e793e91a4a69c8aa6819f2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga346b25ab11e793e91a4a69c8aa6819f2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga346b25ab11e793e91a4a69c8aa6819f2\">bitfieldExtract</a> (vec&lt; L, T, Q &gt; const &amp;Value, int Offset, int Bits)</td></tr>\n<tr class=\"memdesc:ga346b25ab11e793e91a4a69c8aa6819f2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extracts bits [offset, offset + bits - 1] from value, returning them in the least significant bits of the result.  <a href=\"a00229.html#ga346b25ab11e793e91a4a69c8aa6819f2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga346b25ab11e793e91a4a69c8aa6819f2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e82992340d421fadb61a473df699b20\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2e82992340d421fadb61a473df699b20\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga2e82992340d421fadb61a473df699b20\">bitfieldInsert</a> (vec&lt; L, T, Q &gt; const &amp;Base, vec&lt; L, T, Q &gt; const &amp;Insert, int Offset, int Bits)</td></tr>\n<tr class=\"memdesc:ga2e82992340d421fadb61a473df699b20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the insertion the bits least-significant bits of insert into base.  <a href=\"a00229.html#ga2e82992340d421fadb61a473df699b20\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e82992340d421fadb61a473df699b20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga750a1d92464489b7711dee67aa3441b6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga750a1d92464489b7711dee67aa3441b6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga750a1d92464489b7711dee67aa3441b6\">bitfieldReverse</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga750a1d92464489b7711dee67aa3441b6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the reversal of the bits of value.  <a href=\"a00229.html#ga750a1d92464489b7711dee67aa3441b6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga750a1d92464489b7711dee67aa3441b6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf74c4d969fa34ab8acb9d390f5ca5274\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gaf74c4d969fa34ab8acb9d390f5ca5274\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gaf74c4d969fa34ab8acb9d390f5ca5274\">findLSB</a> (genIUType x)</td></tr>\n<tr class=\"memdesc:gaf74c4d969fa34ab8acb9d390f5ca5274\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the bit number of the least significant bit set to 1 in the binary representation of value.  <a href=\"a00229.html#gaf74c4d969fa34ab8acb9d390f5ca5274\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf74c4d969fa34ab8acb9d390f5ca5274\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4454c0331d6369888c28ab677f4810c7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4454c0331d6369888c28ab677f4810c7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga4454c0331d6369888c28ab677f4810c7\">findLSB</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga4454c0331d6369888c28ab677f4810c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the bit number of the least significant bit set to 1 in the binary representation of value.  <a href=\"a00229.html#ga4454c0331d6369888c28ab677f4810c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4454c0331d6369888c28ab677f4810c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7e4a794d766861c70bc961630f8ef621\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga7e4a794d766861c70bc961630f8ef621\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga7e4a794d766861c70bc961630f8ef621\">findMSB</a> (genIUType x)</td></tr>\n<tr class=\"memdesc:ga7e4a794d766861c70bc961630f8ef621\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the bit number of the most significant bit in the binary representation of value.  <a href=\"a00229.html#ga7e4a794d766861c70bc961630f8ef621\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7e4a794d766861c70bc961630f8ef621\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39ac4d52028bb6ab08db5ad6562c2872\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga39ac4d52028bb6ab08db5ad6562c2872\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872\">findMSB</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga39ac4d52028bb6ab08db5ad6562c2872\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the bit number of the most significant bit in the binary representation of value.  <a href=\"a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872\">More...</a><br /></td></tr>\n<tr class=\"separator:ga39ac4d52028bb6ab08db5ad6562c2872\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac0c510a70e852f57594a9141848642e3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac0c510a70e852f57594a9141848642e3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gac0c510a70e852f57594a9141848642e3\">imulExtended</a> (vec&lt; L, int, Q &gt; const &amp;x, vec&lt; L, int, Q &gt; const &amp;y, vec&lt; L, int, Q &gt; &amp;msb, vec&lt; L, int, Q &gt; &amp;lsb)</td></tr>\n<tr class=\"memdesc:gac0c510a70e852f57594a9141848642e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Multiplies 32-bit integers x and y, producing a 64-bit result.  <a href=\"a00229.html#gac0c510a70e852f57594a9141848642e3\">More...</a><br /></td></tr>\n<tr class=\"separator:gac0c510a70e852f57594a9141848642e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaedcec48743632dff6786bcc492074b1b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaedcec48743632dff6786bcc492074b1b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gaedcec48743632dff6786bcc492074b1b\">uaddCarry</a> (vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;carry)</td></tr>\n<tr class=\"memdesc:gaedcec48743632dff6786bcc492074b1b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Adds 32-bit unsigned integer x and y, returning the sum modulo pow(2, 32).  <a href=\"a00229.html#gaedcec48743632dff6786bcc492074b1b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaedcec48743632dff6786bcc492074b1b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga732e2fb56db57ea541c7e5c92b7121be\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga732e2fb56db57ea541c7e5c92b7121be\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga732e2fb56db57ea541c7e5c92b7121be\">umulExtended</a> (vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;msb, vec&lt; L, uint, Q &gt; &amp;lsb)</td></tr>\n<tr class=\"memdesc:ga732e2fb56db57ea541c7e5c92b7121be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Multiplies 32-bit integers x and y, producing a 64-bit result.  <a href=\"a00229.html#ga732e2fb56db57ea541c7e5c92b7121be\">More...</a><br /></td></tr>\n<tr class=\"separator:ga732e2fb56db57ea541c7e5c92b7121be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3316ba1229ad9b9f09480833321b053\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae3316ba1229ad9b9f09480833321b053\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gae3316ba1229ad9b9f09480833321b053\">usubBorrow</a> (vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;borrow)</td></tr>\n<tr class=\"memdesc:gae3316ba1229ad9b9f09480833321b053\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Subtracts the 32-bit unsigned integer y from x, returning the difference if non-negative, or pow(2, 32) plus the difference otherwise.  <a href=\"a00229.html#gae3316ba1229ad9b9f09480833321b053\">More...</a><br /></td></tr>\n<tr class=\"separator:gae3316ba1229ad9b9f09480833321b053\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00041_source.html\">integer.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00041_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: integer.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">integer.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00041.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00082.html\">detail/qualifier.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00015.html\">common.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;vector_relational.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL vec&lt;L, uint, Q&gt; <a class=\"code\" href=\"a00229.html#gaedcec48743632dff6786bcc492074b1b\">uaddCarry</a>(</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                vec&lt;L, uint, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                vec&lt;L, uint, Q&gt; <span class=\"keyword\">const</span>&amp; y,</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                vec&lt;L, uint, Q&gt; &amp; carry);</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL vec&lt;L, uint, Q&gt; <a class=\"code\" href=\"a00229.html#gae3316ba1229ad9b9f09480833321b053\">usubBorrow</a>(</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                vec&lt;L, uint, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                vec&lt;L, uint, Q&gt; <span class=\"keyword\">const</span>&amp; y,</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                vec&lt;L, uint, Q&gt; &amp; borrow);</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">void</span> <a class=\"code\" href=\"a00229.html#ga732e2fb56db57ea541c7e5c92b7121be\">umulExtended</a>(</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                vec&lt;L, uint, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                vec&lt;L, uint, Q&gt; <span class=\"keyword\">const</span>&amp; y,</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                vec&lt;L, uint, Q&gt; &amp; msb,</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                vec&lt;L, uint, Q&gt; &amp; lsb);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">void</span> <a class=\"code\" href=\"a00229.html#gac0c510a70e852f57594a9141848642e3\">imulExtended</a>(</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                vec&lt;L, int, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                vec&lt;L, int, Q&gt; <span class=\"keyword\">const</span>&amp; y,</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                vec&lt;L, int, Q&gt; &amp; msb,</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                vec&lt;L, int, Q&gt; &amp; lsb);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00229.html#ga346b25ab11e793e91a4a69c8aa6819f2\">bitfieldExtract</a>(</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Value,</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                <span class=\"keywordtype\">int</span> Offset,</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                <span class=\"keywordtype\">int</span> Bits);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00229.html#ga2e82992340d421fadb61a473df699b20\">bitfieldInsert</a>(</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Base,</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Insert,</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                <span class=\"keywordtype\">int</span> Offset,</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                <span class=\"keywordtype\">int</span> Bits);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00229.html#ga750a1d92464489b7711dee67aa3441b6\">bitfieldReverse</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5\">bitCount</a>(genType v);</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        GLM_FUNC_DECL vec&lt;L, int, Q&gt; <a class=\"code\" href=\"a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5\">bitCount</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00229.html#ga4454c0331d6369888c28ab677f4810c7\">findLSB</a>(genIUType x);</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        GLM_FUNC_DECL vec&lt;L, int, Q&gt; <a class=\"code\" href=\"a00229.html#ga4454c0331d6369888c28ab677f4810c7\">findLSB</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872\">findMSB</a>(genIUType x);</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;        GLM_FUNC_DECL vec&lt;L, int, Q&gt; <a class=\"code\" href=\"a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872\">findMSB</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;<span class=\"preprocessor\">#include &quot;detail/func_integer.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00229_html_ga39ac4d52028bb6ab08db5ad6562c2872\"><div class=\"ttname\"><a href=\"a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872\">glm::findMSB</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, int, Q &gt; findMSB(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the bit number of the most significant bit in the binary representation of value...</div></div>\n<div class=\"ttc\" id=\"a00229_html_ga750a1d92464489b7711dee67aa3441b6\"><div class=\"ttname\"><a href=\"a00229.html#ga750a1d92464489b7711dee67aa3441b6\">glm::bitfieldReverse</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; bitfieldReverse(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the reversal of the bits of value. </div></div>\n<div class=\"ttc\" id=\"a00229_html_gac0c510a70e852f57594a9141848642e3\"><div class=\"ttname\"><a href=\"a00229.html#gac0c510a70e852f57594a9141848642e3\">glm::imulExtended</a></div><div class=\"ttdeci\">GLM_FUNC_DECL void imulExtended(vec&lt; L, int, Q &gt; const &amp;x, vec&lt; L, int, Q &gt; const &amp;y, vec&lt; L, int, Q &gt; &amp;msb, vec&lt; L, int, Q &gt; &amp;lsb)</div><div class=\"ttdoc\">Multiplies 32-bit integers x and y, producing a 64-bit result. </div></div>\n<div class=\"ttc\" id=\"a00015_html\"><div class=\"ttname\"><a href=\"a00015.html\">common.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00229_html_gaedcec48743632dff6786bcc492074b1b\"><div class=\"ttname\"><a href=\"a00229.html#gaedcec48743632dff6786bcc492074b1b\">glm::uaddCarry</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt; uaddCarry(vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;carry)</div><div class=\"ttdoc\">Adds 32-bit unsigned integer x and y, returning the sum modulo pow(2, 32). </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00229_html_ga4454c0331d6369888c28ab677f4810c7\"><div class=\"ttname\"><a href=\"a00229.html#ga4454c0331d6369888c28ab677f4810c7\">glm::findLSB</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, int, Q &gt; findLSB(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the bit number of the least significant bit set to 1 in the binary representation of value...</div></div>\n<div class=\"ttc\" id=\"a00082_html\"><div class=\"ttname\"><a href=\"a00082.html\">qualifier.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00229_html_gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><div class=\"ttname\"><a href=\"a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5\">glm::bitCount</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, int, Q &gt; bitCount(vec&lt; L, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the number of bits set to 1 in the binary representation of value. </div></div>\n<div class=\"ttc\" id=\"a00229_html_ga2e82992340d421fadb61a473df699b20\"><div class=\"ttname\"><a href=\"a00229.html#ga2e82992340d421fadb61a473df699b20\">glm::bitfieldInsert</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; bitfieldInsert(vec&lt; L, T, Q &gt; const &amp;Base, vec&lt; L, T, Q &gt; const &amp;Insert, int Offset, int Bits)</div><div class=\"ttdoc\">Returns the insertion the bits least-significant bits of insert into base. </div></div>\n<div class=\"ttc\" id=\"a00229_html_ga346b25ab11e793e91a4a69c8aa6819f2\"><div class=\"ttname\"><a href=\"a00229.html#ga346b25ab11e793e91a4a69c8aa6819f2\">glm::bitfieldExtract</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; bitfieldExtract(vec&lt; L, T, Q &gt; const &amp;Value, int Offset, int Bits)</div><div class=\"ttdoc\">Extracts bits [offset, offset + bits - 1] from value, returning them in the least significant bits of...</div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00229_html_gae3316ba1229ad9b9f09480833321b053\"><div class=\"ttname\"><a href=\"a00229.html#gae3316ba1229ad9b9f09480833321b053\">glm::usubBorrow</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt; usubBorrow(vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;borrow)</div><div class=\"ttdoc\">Subtracts the 32-bit unsigned integer y from x, returning the difference if non-negative, or pow(2, 32) plus the difference otherwise. </div></div>\n<div class=\"ttc\" id=\"a00229_html_ga732e2fb56db57ea541c7e5c92b7121be\"><div class=\"ttname\"><a href=\"a00229.html#ga732e2fb56db57ea541c7e5c92b7121be\">glm::umulExtended</a></div><div class=\"ttdeci\">GLM_FUNC_DECL void umulExtended(vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;msb, vec&lt; L, uint, Q &gt; &amp;lsb)</div><div class=\"ttdoc\">Multiplies 32-bit integers x and y, producing a 64-bit result. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00042.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: intersect.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">intersect.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00191.html\">GLM_GTX_intersect</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00042_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\">intersectLineSphere</a> (genType const &amp;point0, genType const &amp;point1, genType const &amp;sphereCenter, typename genType::value_type sphereRadius, genType &amp;intersectionPosition1, genType &amp;intersectionNormal1, genType &amp;intersectionPosition2=genType(), genType &amp;intersectionNormal2=genType())</td></tr>\n<tr class=\"memdesc:ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a line and a sphere.  <a href=\"a00191.html#ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9d29b9b3acb504d43986502f42740df4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9d29b9b3acb504d43986502f42740df4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#ga9d29b9b3acb504d43986502f42740df4\">intersectLineTriangle</a> (genType const &amp;orig, genType const &amp;dir, genType const &amp;vert0, genType const &amp;vert1, genType const &amp;vert2, genType &amp;position)</td></tr>\n<tr class=\"memdesc:ga9d29b9b3acb504d43986502f42740df4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a line and a triangle.  <a href=\"a00191.html#ga9d29b9b3acb504d43986502f42740df4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9d29b9b3acb504d43986502f42740df4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad3697a9700ea379739a667ea02573488\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad3697a9700ea379739a667ea02573488\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#gad3697a9700ea379739a667ea02573488\">intersectRayPlane</a> (genType const &amp;orig, genType const &amp;dir, genType const &amp;planeOrig, genType const &amp;planeNormal, typename genType::value_type &amp;intersectionDistance)</td></tr>\n<tr class=\"memdesc:gad3697a9700ea379739a667ea02573488\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a ray and a plane.  <a href=\"a00191.html#gad3697a9700ea379739a667ea02573488\">More...</a><br /></td></tr>\n<tr class=\"separator:gad3697a9700ea379739a667ea02573488\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac88f8cd84c4bcb5b947d56acbbcfa56e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gac88f8cd84c4bcb5b947d56acbbcfa56e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#gac88f8cd84c4bcb5b947d56acbbcfa56e\">intersectRaySphere</a> (genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, typename genType::value_type const sphereRadiusSquered, typename genType::value_type &amp;intersectionDistance)</td></tr>\n<tr class=\"memdesc:gac88f8cd84c4bcb5b947d56acbbcfa56e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection distance of a ray and a sphere.  <a href=\"a00191.html#gac88f8cd84c4bcb5b947d56acbbcfa56e\">More...</a><br /></td></tr>\n<tr class=\"separator:gac88f8cd84c4bcb5b947d56acbbcfa56e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad28c00515b823b579c608aafa1100c1d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad28c00515b823b579c608aafa1100c1d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#gad28c00515b823b579c608aafa1100c1d\">intersectRaySphere</a> (genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, const typename genType::value_type sphereRadius, genType &amp;intersectionPosition, genType &amp;intersectionNormal)</td></tr>\n<tr class=\"memdesc:gad28c00515b823b579c608aafa1100c1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a ray and a sphere.  <a href=\"a00191.html#gad28c00515b823b579c608aafa1100c1d\">More...</a><br /></td></tr>\n<tr class=\"separator:gad28c00515b823b579c608aafa1100c1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga62e2b3c67ff9e95c04e39383920a9c27\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga62e2b3c67ff9e95c04e39383920a9c27\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#ga62e2b3c67ff9e95c04e39383920a9c27\">intersectRayTriangle</a> (vec&lt; 3, T, Q &gt; const &amp;orig, vec&lt; 3, T, Q &gt; const &amp;dir, vec&lt; 3, T, Q &gt; const &amp;v0, vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; &amp;baryPosition, T &amp;distance)</td></tr>\n<tr class=\"memdesc:ga62e2b3c67ff9e95c04e39383920a9c27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a ray and a triangle.  <a href=\"a00191.html#ga62e2b3c67ff9e95c04e39383920a9c27\">More...</a><br /></td></tr>\n<tr class=\"separator:ga62e2b3c67ff9e95c04e39383920a9c27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00191.html\">GLM_GTX_intersect</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00171.html\" title=\"Include <glm/gtx/closest_point.hpp> to use the features of this extension. \">GLM_GTX_closest_point</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00042_source.html\">intersect.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00042_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: intersect.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">intersect.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00042.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &lt;cfloat&gt;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../geometric.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/closest_point.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/vector_query.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_closest_point extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00191.html#gad3697a9700ea379739a667ea02573488\">intersectRayPlane</a>(</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                genType <span class=\"keyword\">const</span>&amp; orig, genType <span class=\"keyword\">const</span>&amp; dir,</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                genType <span class=\"keyword\">const</span>&amp; planeOrig, genType <span class=\"keyword\">const</span>&amp; planeNormal,</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                <span class=\"keyword\">typename</span> genType::value_type &amp; intersectionDistance);</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00191.html#ga62e2b3c67ff9e95c04e39383920a9c27\">intersectRayTriangle</a>(</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; orig, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; dir,</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v0, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2,</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                vec&lt;3, T, Q&gt;&amp; baryPosition, T&amp; <a class=\"code\" href=\"a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f\">distance</a>);</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00191.html#ga9d29b9b3acb504d43986502f42740df4\">intersectLineTriangle</a>(</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                genType <span class=\"keyword\">const</span>&amp; orig, genType <span class=\"keyword\">const</span>&amp; dir,</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                genType <span class=\"keyword\">const</span>&amp; vert0, genType <span class=\"keyword\">const</span>&amp; vert1, genType <span class=\"keyword\">const</span>&amp; vert2,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                genType &amp; position);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00191.html#gad28c00515b823b579c608aafa1100c1d\">intersectRaySphere</a>(</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                genType <span class=\"keyword\">const</span>&amp; rayStarting, genType <span class=\"keyword\">const</span>&amp; rayNormalizedDirection,</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                genType <span class=\"keyword\">const</span>&amp; sphereCenter, <span class=\"keyword\">typename</span> genType::value_type <span class=\"keyword\">const</span> sphereRadiusSquered,</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                <span class=\"keyword\">typename</span> genType::value_type &amp; intersectionDistance);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00191.html#gad28c00515b823b579c608aafa1100c1d\">intersectRaySphere</a>(</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                genType <span class=\"keyword\">const</span>&amp; rayStarting, genType <span class=\"keyword\">const</span>&amp; rayNormalizedDirection,</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                genType <span class=\"keyword\">const</span>&amp; sphereCenter, <span class=\"keyword\">const</span> <span class=\"keyword\">typename</span> genType::value_type sphereRadius,</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                genType &amp; intersectionPosition, genType &amp; intersectionNormal);</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00191.html#ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\">intersectLineSphere</a>(</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                genType <span class=\"keyword\">const</span>&amp; point0, genType <span class=\"keyword\">const</span>&amp; point1,</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                genType <span class=\"keyword\">const</span>&amp; sphereCenter, <span class=\"keyword\">typename</span> genType::value_type sphereRadius,</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                genType &amp; intersectionPosition1, genType &amp; intersectionNormal1, </div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                genType &amp; intersectionPosition2 = genType(), genType &amp; intersectionNormal2 = genType());</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"preprocessor\">#include &quot;intersect.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00191_html_gad28c00515b823b579c608aafa1100c1d\"><div class=\"ttname\"><a href=\"a00191.html#gad28c00515b823b579c608aafa1100c1d\">glm::intersectRaySphere</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool intersectRaySphere(genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, const typename genType::value_type sphereRadius, genType &amp;intersectionPosition, genType &amp;intersectionNormal)</div><div class=\"ttdoc\">Compute the intersection of a ray and a sphere. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00191_html_ga9d29b9b3acb504d43986502f42740df4\"><div class=\"ttname\"><a href=\"a00191.html#ga9d29b9b3acb504d43986502f42740df4\">glm::intersectLineTriangle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool intersectLineTriangle(genType const &amp;orig, genType const &amp;dir, genType const &amp;vert0, genType const &amp;vert1, genType const &amp;vert2, genType &amp;position)</div><div class=\"ttdoc\">Compute the intersection of a line and a triangle. </div></div>\n<div class=\"ttc\" id=\"a00191_html_ga62e2b3c67ff9e95c04e39383920a9c27\"><div class=\"ttname\"><a href=\"a00191.html#ga62e2b3c67ff9e95c04e39383920a9c27\">glm::intersectRayTriangle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool intersectRayTriangle(vec&lt; 3, T, Q &gt; const &amp;orig, vec&lt; 3, T, Q &gt; const &amp;dir, vec&lt; 3, T, Q &gt; const &amp;v0, vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; &amp;baryPosition, T &amp;distance)</div><div class=\"ttdoc\">Compute the intersection of a ray and a triangle. </div></div>\n<div class=\"ttc\" id=\"a00191_html_gad3697a9700ea379739a667ea02573488\"><div class=\"ttname\"><a href=\"a00191.html#gad3697a9700ea379739a667ea02573488\">glm::intersectRayPlane</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool intersectRayPlane(genType const &amp;orig, genType const &amp;dir, genType const &amp;planeOrig, genType const &amp;planeNormal, typename genType::value_type &amp;intersectionDistance)</div><div class=\"ttdoc\">Compute the intersection of a ray and a plane. </div></div>\n<div class=\"ttc\" id=\"a00142_html_gaa68de6c53e20dfb2dac2d20197562e3f\"><div class=\"ttname\"><a href=\"a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f\">glm::distance</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T distance(vec&lt; L, T, Q &gt; const &amp;p0, vec&lt; L, T, Q &gt; const &amp;p1)</div><div class=\"ttdoc\">Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). </div></div>\n<div class=\"ttc\" id=\"a00191_html_ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><div class=\"ttname\"><a href=\"a00191.html#ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\">glm::intersectLineSphere</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool intersectLineSphere(genType const &amp;point0, genType const &amp;point1, genType const &amp;sphereCenter, typename genType::value_type sphereRadius, genType &amp;intersectionPosition1, genType &amp;intersectionNormal1, genType &amp;intersectionPosition2=genType(), genType &amp;intersectionNormal2=genType())</div><div class=\"ttdoc\">Compute the intersection of a line and a sphere. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00043.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: io.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">io.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00192.html\">GLM_GTX_io</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00043_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00192.html\">GLM_GTX_io</a> </p>\n<dl class=\"section author\"><dt>Author</dt><dd>Jan P Springer (<a href=\"#\" onclick=\"location.href='mai'+'lto:'+'reg'+'ni'+'rps'+'j@'+'gma'+'il'+'.co'+'m'; return false;\">regni<span style=\"display: none;\">.nosp@m.</span>rpsj<span style=\"display: none;\">.nosp@m.</span>@gmai<span style=\"display: none;\">.nosp@m.</span>l.co<span style=\"display: none;\">.nosp@m.</span>m</a>)</dd></dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00154.html\" title=\"Include <glm/gtc/matrix_access.hpp> to use the features of this extension. \">GLM_GTC_matrix_access</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00043_source.html\">io.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00043_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: io.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">io.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00043.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_io is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\"># pragma message(&quot;GLM: GLM_GTX_io extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#include &lt;iosfwd&gt;</span>  <span class=\"comment\">// std::basic_ostream&lt;&gt; (fwd)</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#include &lt;locale&gt;</span>  <span class=\"comment\">// std::locale, std::locale::facet, std::locale::id</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#include &lt;utility&gt;</span> <span class=\"comment\">// std::pair&lt;&gt;</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <span class=\"keyword\">namespace </span>io</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                <span class=\"keyword\">enum</span> order_type { column_major, row_major};</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy&gt;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                <span class=\"keyword\">class </span>format_punct : <span class=\"keyword\">public</span> std::locale::facet</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                        <span class=\"keyword\">typedef</span> CTy char_type;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                        <span class=\"keyword\">static</span> std::locale::id id;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                        <span class=\"keywordtype\">bool</span>       formatted;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                        <span class=\"keywordtype\">unsigned</span>   precision;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                        <span class=\"keywordtype\">unsigned</span>   width;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                        char_type  separator;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        char_type  delim_left;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        char_type  delim_right;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                        char_type  space;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                        char_type  newline;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                        order_type order;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> format_punct(<span class=\"keywordtype\">size_t</span> a = 0);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> format_punct(format_punct <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr = std::<span class=\"keywordtype\">char</span>_traits&lt;CTy&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                <span class=\"keyword\">class </span>basic_state_saver {</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> basic_state_saver(std::basic_ios&lt;CTy,CTr&gt;&amp;);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                        GLM_FUNC_DECL ~basic_state_saver();</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                        typedef ::std::basic_ios&lt;CTy,CTr&gt;      state_type;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keyword\">typename</span> state_type::char_type char_type;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                        typedef ::std::ios_base::fmtflags      flags_type;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                        typedef ::std::streamsize              streamsize_type;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                        typedef ::std::locale <span class=\"keyword\">const</span>            locale_type;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                        state_type&amp;     state_;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                        flags_type      flags_;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                        streamsize_type precision_;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                        streamsize_type width_;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                        char_type       fill_;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                        locale_type     locale_;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                        GLM_FUNC_DECL basic_state_saver&amp; operator=(basic_state_saver <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                <span class=\"keyword\">typedef</span> basic_state_saver&lt;char&gt;     state_saver;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                <span class=\"keyword\">typedef</span> basic_state_saver&lt;wchar_t&gt; wstate_saver;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr = std::<span class=\"keywordtype\">char</span>_traits&lt;CTy&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                <span class=\"keyword\">class </span>basic_format_saver</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> basic_format_saver(std::basic_ios&lt;CTy,CTr&gt;&amp;);</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                        GLM_FUNC_DECL ~basic_format_saver();</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;                        basic_state_saver&lt;CTy&gt; <span class=\"keyword\">const</span> bss_;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                        GLM_FUNC_DECL basic_format_saver&amp; operator=(basic_format_saver <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                <span class=\"keyword\">typedef</span> basic_format_saver&lt;char&gt;     format_saver;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;                <span class=\"keyword\">typedef</span> basic_format_saver&lt;wchar_t&gt; wformat_saver;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                <span class=\"keyword\">struct </span>precision</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                        <span class=\"keywordtype\">unsigned</span> value;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> precision(<span class=\"keywordtype\">unsigned</span>);</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;                <span class=\"keyword\">struct </span>width</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                        <span class=\"keywordtype\">unsigned</span> value;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> width(<span class=\"keywordtype\">unsigned</span>);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy&gt;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;                <span class=\"keyword\">struct </span>delimeter</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                        CTy value[3];</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> delimeter(CTy <span class=\"comment\">/* left */</span>, CTy <span class=\"comment\">/* right */</span>, CTy <span class=\"comment\">/* separator */</span> = <span class=\"charliteral\">&#39;,&#39;</span>);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;                <span class=\"keyword\">struct </span>order</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                        order_type value;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> order(order_type);</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;                <span class=\"comment\">// functions, inlined (inline)</span></div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> FTy, <span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr&gt;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;                FTy <span class=\"keyword\">const</span>&amp; get_facet(std::basic_ios&lt;CTy,CTr&gt;&amp;);</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> FTy, <span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;                std::basic_ios&lt;CTy,CTr&gt;&amp; formatted(std::basic_ios&lt;CTy,CTr&gt;&amp;);</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> FTy, <span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr&gt;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;                std::basic_ios&lt;CTy,CTr&gt;&amp; unformattet(std::basic_ios&lt;CTy,CTr&gt;&amp;);</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr&gt;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                std::basic_ostream&lt;CTy, CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy, CTr&gt;&amp;, precision <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                std::basic_ostream&lt;CTy, CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy, CTr&gt;&amp;, width <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr&gt;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;                std::basic_ostream&lt;CTy, CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy, CTr&gt;&amp;, delimeter&lt;CTy&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr&gt;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;                std::basic_ostream&lt;CTy, CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy, CTr&gt;&amp;, order <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        }<span class=\"comment\">//namespace io</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;2, 2, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;2, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;2, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;3, 2, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;3, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;4, 2, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;4, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt;&amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt;&amp;, mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;  <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> CTy, <span class=\"keyword\">typename</span> CTr, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;        GLM_FUNC_DECL std::basic_ostream&lt;CTy,CTr&gt; &amp; operator&lt;&lt;(std::basic_ostream&lt;CTy,CTr&gt; &amp;,</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;                                                         std::pair&lt;mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>, mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&gt; <span class=\"keyword\">const</span>&amp;);</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;<span class=\"preprocessor\">#include &quot;io.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00044.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: log_base.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">log_base.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00193.html\">GLM_GTX_log_base</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00044_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga60a7b0a401da660869946b2b77c710c9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga60a7b0a401da660869946b2b77c710c9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00193.html#ga60a7b0a401da660869946b2b77c710c9\">log</a> (genType const &amp;x, genType const &amp;base)</td></tr>\n<tr class=\"memdesc:ga60a7b0a401da660869946b2b77c710c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Logarithm for any base.  <a href=\"a00193.html#ga60a7b0a401da660869946b2b77c710c9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga60a7b0a401da660869946b2b77c710c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04ef803a24f3d4f8c67dbccb33b0fce0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga04ef803a24f3d4f8c67dbccb33b0fce0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00193.html#ga04ef803a24f3d4f8c67dbccb33b0fce0\">sign</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;base)</td></tr>\n<tr class=\"memdesc:ga04ef803a24f3d4f8c67dbccb33b0fce0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Logarithm for any base.  <a href=\"a00193.html#ga04ef803a24f3d4f8c67dbccb33b0fce0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04ef803a24f3d4f8c67dbccb33b0fce0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00193.html\">GLM_GTX_log_base</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00044_source.html\">log_base.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00044_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: log_base.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">log_base.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00044.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_log_base is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_log_base extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00193.html#ga60a7b0a401da660869946b2b77c710c9\">log</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                genType <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                genType <span class=\"keyword\">const</span>&amp; base);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00193.html#ga04ef803a24f3d4f8c67dbccb33b0fce0\">sign</a>(</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; base);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"preprocessor\">#include &quot;log_base.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00193_html_ga04ef803a24f3d4f8c67dbccb33b0fce0\"><div class=\"ttname\"><a href=\"a00193.html#ga04ef803a24f3d4f8c67dbccb33b0fce0\">glm::sign</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; sign(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;base)</div><div class=\"ttdoc\">Logarithm for any base. </div></div>\n<div class=\"ttc\" id=\"a00193_html_ga60a7b0a401da660869946b2b77c710c9\"><div class=\"ttname\"><a href=\"a00193.html#ga60a7b0a401da660869946b2b77c710c9\">glm::log</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType log(genType const &amp;x, genType const &amp;base)</div><div class=\"ttdoc\">Logarithm for any base. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00045_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: man.doxy Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_48eca2e6cf73effdec262031e861eeb0.html\">doc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">man.doxy</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;<span class=\"preprocessor\"># Doxyfile 1.8.10</span></div>\n<div class=\"line\"><a name=\"l00002\"></a><span class=\"lineno\">    2</span>&#160;</div>\n<div class=\"line\"><a name=\"l00003\"></a><span class=\"lineno\">    3</span>&#160;<span class=\"preprocessor\"># This file describes the settings to be used by the documentation system</span></div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\"># doxygen (www.doxygen.org) for a project.</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\"># All text after a double hash (##) is considered a comment and is placed in</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\"># front of the TAG it is preceding.</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\"># All text after a single hash (#) is considered a comment and will be ignored.</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\"># The format is:</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\"># TAG = value [value, ...]</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\"># For lists, items can also be appended using:</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\"># TAG += value [value, ...]</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\"># Values that contain spaces should be placed between quotes (\\&quot; \\&quot;).</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\"># Project related configuration options</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\"># This tag specifies the encoding used for all characters in the config file</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\"># that follow. The default is UTF-8 which is also the encoding used for all text</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\"># before the first occurrence of this tag. Doxygen uses libiconv (or the iconv</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\"># built into libc) for the transcoding. See http://www.gnu.org/software/libiconv</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\"># for the list of possible encodings.</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\"># The default value is: UTF-8.</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;DOXYFILE_ENCODING      = UTF-8</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\"># The PROJECT_NAME tag is a single word (or a sequence of words surrounded by</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\"># double-quotes, unless you are using Doxywizard) that should identify the</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\"># project for which the documentation is generated. This name is used in the</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\"># title of most generated pages and in a few other places.</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\"># The default value is: My Project.</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;PROJECT_NAME           = <span class=\"stringliteral\">&quot;0.9.9 API documenation&quot;</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\"># The PROJECT_NUMBER tag can be used to enter a project or revision number. This</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\"># could be handy for archiving the generated documentation or if some version</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"preprocessor\"># control system is used.</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;PROJECT_NUMBER         = </div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\"># Using the PROJECT_BRIEF tag one can provide an optional one line description</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;<span class=\"preprocessor\"># for a project that appears at the top of each page and should give viewer a</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"preprocessor\"># quick idea about the purpose of the project. Keep the description short.</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;PROJECT_BRIEF          = </div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\"># With the PROJECT_LOGO tag one can specify a logo or an icon that is included</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\"># in the documentation. The maximum height of the logo should not exceed 55</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\"># pixels and the maximum width should not exceed 200 pixels. Doxygen will copy</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"preprocessor\"># the logo to the output directory.</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;PROJECT_LOGO           = G:/Source/G-Truc/<a class=\"code\" href=\"a00135.html\">glm</a>/doc/manual/logo-mini.png</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"preprocessor\"># The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"preprocessor\"># into which the generated documentation will be written. If a relative path is</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;<span class=\"preprocessor\"># entered, it will be relative to the location where doxygen was started. If</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"preprocessor\"># left blank the current directory will be used.</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;OUTPUT_DIRECTORY       = .</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"preprocessor\"># directories (in 2 levels) under the output directory of each output format and</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\"># will distribute the generated files over these directories. Enabling this</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"preprocessor\"># option can be useful when feeding doxygen a huge amount of source files, where</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\"># putting all generated files in the same directory would otherwise causes</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\"># performance problems for the file system.</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;CREATE_SUBDIRS         = NO</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"preprocessor\"># If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII</span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;<span class=\"preprocessor\"># characters to appear in the names of generated files. If set to NO, non-ASCII</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"preprocessor\"># characters will be escaped, for example _xE3_x81_x84 will be used for Unicode</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\"># U+3044.</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;ALLOW_UNICODE_NAMES    = NO</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"preprocessor\"># The OUTPUT_LANGUAGE tag is used to specify the language in which all</span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;<span class=\"preprocessor\"># documentation generated by doxygen is written. Doxygen will use this</span></div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;<span class=\"preprocessor\"># information to generate all constant output in the proper language.</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;<span class=\"preprocessor\"># Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,</span></div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;<span class=\"preprocessor\"># Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;<span class=\"preprocessor\"># Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;<span class=\"preprocessor\"># Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;<span class=\"preprocessor\"># Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,</span></div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;<span class=\"preprocessor\"># Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;<span class=\"preprocessor\"># Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;<span class=\"preprocessor\"># Ukrainian and Vietnamese.</span></div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"preprocessor\"># The default value is: English.</span></div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;OUTPUT_LANGUAGE        = English</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;<span class=\"preprocessor\"># If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member</span></div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"preprocessor\"># descriptions after the members that are listed in the file and class</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"preprocessor\"># documentation (similar to Javadoc). Set to NO to disable this.</span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;BRIEF_MEMBER_DESC      = YES</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;<span class=\"preprocessor\"># If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;<span class=\"preprocessor\"># description of a member or function before the detailed description</span></div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;<span class=\"preprocessor\"># Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;<span class=\"preprocessor\"># brief descriptions will be completely suppressed.</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;REPEAT_BRIEF           = YES</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;<span class=\"preprocessor\"># This tag implements a quasi-intelligent brief description abbreviator that is</span></div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;<span class=\"preprocessor\"># used to form the text in various listings. Each string in this list, if found</span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;<span class=\"preprocessor\"># as the leading text of the brief description, will be stripped from the text</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;<span class=\"preprocessor\"># and the result, after processing the whole list, is used as the annotated</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;<span class=\"preprocessor\"># text. Otherwise, the brief description is used as-is. If left blank, the</span></div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;<span class=\"preprocessor\"># following values are used ($name is automatically replaced with the name of</span></div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;<span class=\"preprocessor\"># the entity):The $name class, The $name widget, The $name file, is, provides,</span></div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;<span class=\"preprocessor\"># specifies, contains, represents, a, an and the.</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;ABBREVIATE_BRIEF       = <span class=\"stringliteral\">&quot;The $name class       &quot;</span> \\</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                         <span class=\"stringliteral\">&quot;The $name widget       &quot;</span> \\</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;                         <span class=\"stringliteral\">&quot;The $name file       &quot;</span> \\</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;                         is \\</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                         provides \\</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                         specifies \\</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                         contains \\</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                         represents \\</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                         a \\</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;                         an \\</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                         the</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;<span class=\"preprocessor\"># If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then</span></div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;<span class=\"preprocessor\"># doxygen will generate a detailed section even if there is only a brief</span></div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;<span class=\"preprocessor\"># description.</span></div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;ALWAYS_DETAILED_SEC    = NO</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;<span class=\"preprocessor\"># If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all</span></div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;<span class=\"preprocessor\"># inherited members of a class in the documentation of that class as if those</span></div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;<span class=\"preprocessor\"># members were ordinary class members. Constructors, destructors and assignment</span></div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;<span class=\"preprocessor\"># operators of the base classes will not be shown.</span></div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;INLINE_INHERITED_MEMB  = NO</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;<span class=\"preprocessor\"># If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path</span></div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;<span class=\"preprocessor\"># before files name in the file list and in the header files. If set to NO the</span></div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;<span class=\"preprocessor\"># shortest path that makes the file name unique will be used</span></div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;FULL_PATH_NAMES        = NO</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;<span class=\"preprocessor\"># The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.</span></div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;<span class=\"preprocessor\"># Stripping is only done if one of the specified strings matches the left-hand</span></div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;<span class=\"preprocessor\"># part of the path. The tag can be used to show relative paths in the file list.</span></div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;<span class=\"preprocessor\"># If left blank the directory from which doxygen is run is used as the path to</span></div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;<span class=\"preprocessor\"># strip.</span></div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;<span class=\"preprocessor\"># Note that you can specify absolute paths here, but also relative paths, which</span></div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;<span class=\"preprocessor\"># will be relative from the directory where doxygen is started.</span></div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;<span class=\"preprocessor\"># This tag requires that the tag FULL_PATH_NAMES is set to YES.</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;STRIP_FROM_PATH        = <span class=\"stringliteral\">&quot;C:/Documents and Settings/Groove/       &quot;</span></div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;<span class=\"preprocessor\"># The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the</span></div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;<span class=\"preprocessor\"># path mentioned in the documentation of a class, which tells the reader which</span></div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;<span class=\"preprocessor\"># header file to include in order to use a class. If left blank only the name of</span></div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;<span class=\"preprocessor\"># the header file containing the class definition is used. Otherwise one should</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;<span class=\"preprocessor\"># specify the list of include paths that are normally passed to the compiler</span></div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;<span class=\"preprocessor\"># using the -I flag.</span></div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;STRIP_FROM_INC_PATH    = </div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;<span class=\"preprocessor\"># If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but</span></div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;<span class=\"preprocessor\"># less readable) file names. This can be useful is your file systems doesn&#39;t</span></div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;<span class=\"preprocessor\"># support long names like on DOS, Mac, or CD-ROM.</span></div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;SHORT_NAMES            = YES</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;<span class=\"preprocessor\"># If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the</span></div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;<span class=\"preprocessor\"># first line (until the first dot) of a Javadoc-style comment as the brief</span></div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;<span class=\"preprocessor\"># description. If set to NO, the Javadoc-style will behave just like regular Qt-</span></div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;<span class=\"preprocessor\"># style comments (thus requiring an explicit @brief command for a brief</span></div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;<span class=\"preprocessor\"># description.)</span></div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;JAVADOC_AUTOBRIEF      = YES</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;<span class=\"preprocessor\"># If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first</span></div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;<span class=\"preprocessor\"># line (until the first dot) of a Qt-style comment as the brief description. If</span></div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;<span class=\"preprocessor\"># set to NO, the Qt-style will behave just like regular Qt-style comments (thus</span></div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;<span class=\"preprocessor\"># requiring an explicit \\brief command for a brief description.)</span></div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;QT_AUTOBRIEF           = NO</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;<span class=\"preprocessor\"># The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a</span></div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;<span class=\"preprocessor\"># multi-line C++ special comment block (i.e. a block of </span></div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;<span class=\"preprocessor\"># a brief description. This used to be the default behavior. The new default is</span></div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;<span class=\"preprocessor\"># to treat a multi-line C++ comment block as a detailed description. Set this</span></div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;<span class=\"preprocessor\"># tag to YES if you prefer the old behavior instead.</span></div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;<span class=\"preprocessor\"># Note that setting this tag to YES also means that rational rose comments are</span></div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;<span class=\"preprocessor\"># not recognized any more.</span></div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;MULTILINE_CPP_IS_BRIEF = NO</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;<span class=\"preprocessor\"># If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the</span></div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;<span class=\"preprocessor\"># documentation from any documented member that it re-implements.</span></div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;INHERIT_DOCS           = YES</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;<span class=\"preprocessor\"># If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new</span></div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;<span class=\"preprocessor\"># page for each member. If set to NO, the documentation of a member will be part</span></div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;<span class=\"preprocessor\"># of the file/class/namespace that contains it.</span></div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;SEPARATE_MEMBER_PAGES  = NO</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;<span class=\"preprocessor\"># The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen</span></div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;<span class=\"preprocessor\"># uses this value to replace tabs by spaces in code fragments.</span></div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;<span class=\"preprocessor\"># Minimum value: 1, maximum value: 16, default value: 4.</span></div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;TAB_SIZE               = 8</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;<span class=\"preprocessor\"># This tag can be used to specify a number of aliases that act as commands in</span></div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;<span class=\"preprocessor\"># the documentation. An alias has the form:</span></div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;<span class=\"preprocessor\"># name=value</span></div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;<span class=\"preprocessor\"># For example adding</span></div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;<span class=\"preprocessor\"># &quot;sideeffect=@par Side Effects:\\n&quot;</span></div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;<span class=\"preprocessor\"># will allow you to put the command \\sideeffect (or @sideeffect) in the</span></div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;<span class=\"preprocessor\"># documentation, which will result in a user-defined paragraph with heading</span></div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;<span class=\"preprocessor\"># &quot;Side Effects:&quot;. You can put \\n&#39;s in the value part of an alias to insert</span></div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;<span class=\"preprocessor\"># newlines.</span></div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;ALIASES                = </div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;<span class=\"preprocessor\"># This tag can be used to specify a number of word-keyword mappings (TCL only).</span></div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;<span class=\"preprocessor\"># A mapping has the form &quot;name=value&quot;. For example adding &quot;class=itcl::class&quot;</span></div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;<span class=\"preprocessor\"># will allow you to use the command class in the itcl::class meaning.</span></div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;TCL_SUBST              = </div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;<span class=\"preprocessor\"># Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources</span></div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;<span class=\"preprocessor\"># only. Doxygen will then generate output that is more tailored for C. For</span></div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;<span class=\"preprocessor\"># instance, some of the names that are used will be different. The list of all</span></div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;<span class=\"preprocessor\"># members will be omitted, etc.</span></div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;OPTIMIZE_OUTPUT_FOR_C  = NO</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;<span class=\"preprocessor\"># Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or</span></div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;<span class=\"preprocessor\"># Python sources only. Doxygen will then generate output that is more tailored</span></div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;<span class=\"preprocessor\"># for that language. For instance, namespaces will be presented as packages,</span></div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;<span class=\"preprocessor\"># qualified scopes will look different, etc.</span></div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;OPTIMIZE_OUTPUT_JAVA   = NO</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;<span class=\"preprocessor\"># Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran</span></div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;<span class=\"preprocessor\"># sources. Doxygen will then generate output that is tailored for Fortran.</span></div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;OPTIMIZE_FOR_FORTRAN   = NO</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;<span class=\"preprocessor\"># Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL</span></div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;<span class=\"preprocessor\"># sources. Doxygen will then generate output that is tailored for VHDL.</span></div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;OPTIMIZE_OUTPUT_VHDL   = NO</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;<span class=\"preprocessor\"># Doxygen selects the parser to use depending on the extension of the files it</span></div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;<span class=\"preprocessor\"># parses. With this tag you can assign which parser to use for a given</span></div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;<span class=\"preprocessor\"># extension. Doxygen has a built-in mapping, but you can override or extend it</span></div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;<span class=\"preprocessor\"># using this tag. The format is ext=language, where ext is a file extension, and</span></div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;<span class=\"preprocessor\"># language is one of the parsers supported by doxygen: IDL, Java, Javascript,</span></div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;<span class=\"preprocessor\"># C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:</span></div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;<span class=\"preprocessor\"># FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:</span></div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;<span class=\"preprocessor\"># Fortran. In the later case the parser tries to guess whether the code is fixed</span></div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;<span class=\"preprocessor\"># or free formatted code, this is the default for Fortran type files), VHDL. For</span></div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;<span class=\"preprocessor\"># instance to make doxygen treat .inc files as Fortran files (default is PHP),</span></div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;<span class=\"preprocessor\"># and .f files as C (default is Fortran), use: inc=Fortran f=C.</span></div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;<span class=\"preprocessor\"># Note: For files without extension you can use no_extension as a placeholder.</span></div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;<span class=\"preprocessor\"># Note that for custom extensions you also need to set FILE_PATTERNS otherwise</span></div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;<span class=\"preprocessor\"># the files are not read by doxygen.</span></div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;EXTENSION_MAPPING      = </div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;<span class=\"preprocessor\"># If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments</span></div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;<span class=\"preprocessor\"># according to the Markdown format, which allows for more readable</span></div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;<span class=\"preprocessor\"># documentation. See http://daringfireball.net/projects/markdown/ for details.</span></div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;<span class=\"preprocessor\"># The output of markdown processing is further processed by doxygen, so you can</span></div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;<span class=\"preprocessor\"># mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in</span></div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;<span class=\"preprocessor\"># case of backward compatibilities issues.</span></div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;MARKDOWN_SUPPORT       = YES</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;<span class=\"preprocessor\"># When enabled doxygen tries to link words that correspond to documented</span></div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;<span class=\"preprocessor\"># classes, or namespaces to their corresponding documentation. Such a link can</span></div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;<span class=\"preprocessor\"># be prevented in individual cases by putting a % sign in front of the word or</span></div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;<span class=\"preprocessor\"># globally by setting AUTOLINK_SUPPORT to NO.</span></div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;</div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;AUTOLINK_SUPPORT       = YES</div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;<span class=\"preprocessor\"># If you use STL classes (i.e. std::string, std::vector, etc.) but do not want</span></div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;<span class=\"preprocessor\"># to include (a tag file for) the STL sources as input, then you should set this</span></div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;<span class=\"preprocessor\"># tag to YES in order to let doxygen match functions declarations and</span></div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;<span class=\"preprocessor\"># definitions whose arguments contain STL classes (e.g. func(std::string);</span></div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;<span class=\"preprocessor\"># versus func(std::string) {}). This also make the inheritance and collaboration</span></div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;<span class=\"preprocessor\"># diagrams that involve STL classes more complete and accurate.</span></div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;BUILTIN_STL_SUPPORT    = NO</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;<span class=\"preprocessor\"># If you use Microsoft&#39;s C++/CLI language, you should set this option to YES to</span></div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;<span class=\"preprocessor\"># enable parsing support.</span></div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;</div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;CPP_CLI_SUPPORT        = NO</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;<span class=\"preprocessor\"># Set the SIP_SUPPORT tag to YES if your project consists of sip (see:</span></div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;<span class=\"preprocessor\"># http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen</span></div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;<span class=\"preprocessor\"># will parse them like normal C++ but will assume all classes use public instead</span></div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;<span class=\"preprocessor\"># of private inheritance when no explicit protection keyword is present.</span></div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;SIP_SUPPORT            = NO</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;<span class=\"preprocessor\"># For Microsoft&#39;s IDL there are propget and propput attributes to indicate</span></div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;<span class=\"preprocessor\"># getter and setter methods for a property. Setting this option to YES will make</span></div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;<span class=\"preprocessor\"># doxygen to replace the get and set methods by a property in the documentation.</span></div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;<span class=\"preprocessor\"># This will only work if the methods are indeed getting or setting a simple</span></div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;<span class=\"preprocessor\"># type. If this is not the case, or you want to show the methods anyway, you</span></div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;<span class=\"preprocessor\"># should set this option to NO.</span></div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;</div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;IDL_PROPERTY_SUPPORT   = YES</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;<span class=\"preprocessor\"># If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC</span></div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;<span class=\"preprocessor\"># tag is set to YES then doxygen will reuse the documentation of the first</span></div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;<span class=\"preprocessor\"># member in the group (if any) for the other members of the group. By default</span></div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;<span class=\"preprocessor\"># all members of a group must be documented explicitly.</span></div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;DISTRIBUTE_GROUP_DOC   = NO</div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;<span class=\"preprocessor\"># If one adds a struct or class to a group and this option is enabled, then also</span></div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;<span class=\"preprocessor\"># any nested class or struct is added to the same group. By default this option</span></div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;<span class=\"preprocessor\"># is disabled and one has to add nested compounds explicitly via \\ingroup.</span></div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;GROUP_NESTED_COMPOUNDS = NO</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;</div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;<span class=\"preprocessor\"># Set the SUBGROUPING tag to YES to allow class member groups of the same type</span></div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;<span class=\"preprocessor\"># (for instance a group of public functions) to be put as a subgroup of that</span></div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;<span class=\"preprocessor\"># type (e.g. under the Public Functions section). Set it to NO to prevent</span></div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;<span class=\"preprocessor\"># subgrouping. Alternatively, this can be done per class using the</span></div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;<span class=\"preprocessor\"># \\nosubgrouping command.</span></div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;SUBGROUPING            = NO</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;<span class=\"preprocessor\"># When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions</span></div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;<span class=\"preprocessor\"># are shown inside the group in which they are included (e.g. using \\ingroup)</span></div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;<span class=\"preprocessor\"># instead of on a separate page (for HTML and Man pages) or section (for LaTeX</span></div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;<span class=\"preprocessor\"># and RTF).</span></div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;<span class=\"preprocessor\"># Note that this feature does not work in combination with</span></div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;<span class=\"preprocessor\"># SEPARATE_MEMBER_PAGES.</span></div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;INLINE_GROUPED_CLASSES = NO</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;<span class=\"preprocessor\"># When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions</span></div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;<span class=\"preprocessor\"># with only public data fields or simple typedef fields will be shown inline in</span></div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;<span class=\"preprocessor\"># the documentation of the scope in which they are defined (i.e. file,</span></div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;<span class=\"preprocessor\"># namespace, or group documentation), provided this scope is documented. If set</span></div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;<span class=\"preprocessor\"># to NO, structs, classes, and unions are shown on a separate page (for HTML and</span></div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;<span class=\"preprocessor\"># Man pages) or section (for LaTeX and RTF).</span></div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;</div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;INLINE_SIMPLE_STRUCTS  = NO</div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;</div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;<span class=\"preprocessor\"># When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or</span></div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;<span class=\"preprocessor\"># enum is documented as struct, union, or enum with the name of the typedef. So</span></div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;<span class=\"preprocessor\"># typedef struct TypeS {} TypeT, will appear in the documentation as a struct</span></div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;<span class=\"preprocessor\"># with name TypeT. When disabled the typedef will appear as a member of a file,</span></div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;<span class=\"preprocessor\"># namespace, or class. And the struct will be named TypeS. This can typically be</span></div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;<span class=\"preprocessor\"># useful for C code in case the coding convention dictates that all compound</span></div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;<span class=\"preprocessor\"># types are typedef&#39;ed and only the typedef is referenced, never the tag name.</span></div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;TYPEDEF_HIDES_STRUCT   = NO</div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;</div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;<span class=\"preprocessor\"># The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This</span></div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;<span class=\"preprocessor\"># cache is used to resolve symbols given their name and scope. Since this can be</span></div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;<span class=\"preprocessor\"># an expensive process and often the same symbol appears multiple times in the</span></div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;<span class=\"preprocessor\"># code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small</span></div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;<span class=\"preprocessor\"># doxygen will become slower. If the cache is too large, memory is wasted. The</span></div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;<span class=\"preprocessor\"># cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range</span></div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;<span class=\"preprocessor\"># is 0..9, the default is 0, corresponding to a cache size of 2^16=65536</span></div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;<span class=\"preprocessor\"># symbols. At the end of a run doxygen will report the cache usage and suggest</span></div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;<span class=\"preprocessor\"># the optimal cache size from a speed point of view.</span></div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;<span class=\"preprocessor\"># Minimum value: 0, maximum value: 9, default value: 0.</span></div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;</div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;LOOKUP_CACHE_SIZE      = 0</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;<span class=\"preprocessor\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;<span class=\"preprocessor\"># Build related configuration options</span></div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;<span class=\"preprocessor\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;</div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;<span class=\"preprocessor\"># If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in</span></div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;<span class=\"preprocessor\"># documentation are documented, even if no documentation was available. Private</span></div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;<span class=\"preprocessor\"># class members and static file members will be hidden unless the</span></div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;<span class=\"preprocessor\"># EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.</span></div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;<span class=\"preprocessor\"># Note: This will also disable the warnings about undocumented members that are</span></div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;<span class=\"preprocessor\"># normally produced when WARNINGS is set to YES.</span></div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;EXTRACT_ALL            = NO</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;<span class=\"preprocessor\"># If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will</span></div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;<span class=\"preprocessor\"># be included in the documentation.</span></div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;</div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;EXTRACT_PRIVATE        = NO</div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;</div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;<span class=\"preprocessor\"># If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal</span></div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;<span class=\"preprocessor\"># scope will be included in the documentation.</span></div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\">  439</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;</div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;EXTRACT_PACKAGE        = NO</div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;</div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\">  443</span>&#160;<span class=\"preprocessor\"># If the EXTRACT_STATIC tag is set to YES, all static members of a file will be</span></div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;<span class=\"preprocessor\"># included in the documentation.</span></div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;</div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;EXTRACT_STATIC         = YES</div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;</div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;<span class=\"preprocessor\"># If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined</span></div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;<span class=\"preprocessor\"># locally in source files will be included in the documentation. If set to NO,</span></div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;<span class=\"preprocessor\"># only classes defined in header files are included. Does not have any effect</span></div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;<span class=\"preprocessor\"># for Java sources.</span></div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;</div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;EXTRACT_LOCAL_CLASSES  = NO</div>\n<div class=\"line\"><a name=\"l00456\"></a><span class=\"lineno\">  456</span>&#160;</div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\">  457</span>&#160;<span class=\"preprocessor\"># This flag is only useful for Objective-C code. If set to YES, local methods,</span></div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;<span class=\"preprocessor\"># which are defined in the implementation section but not in the interface are</span></div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;<span class=\"preprocessor\"># included in the documentation. If set to NO, only methods in the interface are</span></div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;<span class=\"preprocessor\"># included.</span></div>\n<div class=\"line\"><a name=\"l00461\"></a><span class=\"lineno\">  461</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\">  462</span>&#160;</div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;EXTRACT_LOCAL_METHODS  = NO</div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;</div>\n<div class=\"line\"><a name=\"l00465\"></a><span class=\"lineno\">  465</span>&#160;<span class=\"preprocessor\"># If this flag is set to YES, the members of anonymous namespaces will be</span></div>\n<div class=\"line\"><a name=\"l00466\"></a><span class=\"lineno\">  466</span>&#160;<span class=\"preprocessor\"># extracted and appear in the documentation as a namespace called</span></div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\">  467</span>&#160;<span class=\"preprocessor\"># &#39;anonymous_namespace{file}&#39;, where file will be replaced with the base name of</span></div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;<span class=\"preprocessor\"># the file that contains the anonymous namespace. By default anonymous namespace</span></div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;<span class=\"preprocessor\"># are hidden.</span></div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\">  471</span>&#160;</div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;EXTRACT_ANON_NSPACES   = NO</div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;</div>\n<div class=\"line\"><a name=\"l00474\"></a><span class=\"lineno\">  474</span>&#160;<span class=\"preprocessor\"># If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all</span></div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\">  475</span>&#160;<span class=\"preprocessor\"># undocumented members inside documented classes or files. If set to NO these</span></div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;<span class=\"preprocessor\"># members will be included in the various overviews, but no documentation</span></div>\n<div class=\"line\"><a name=\"l00477\"></a><span class=\"lineno\">  477</span>&#160;<span class=\"preprocessor\"># section is generated. This option has no effect if EXTRACT_ALL is enabled.</span></div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\">  478</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;</div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;HIDE_UNDOC_MEMBERS     = YES</div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;</div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;<span class=\"preprocessor\"># If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all</span></div>\n<div class=\"line\"><a name=\"l00483\"></a><span class=\"lineno\">  483</span>&#160;<span class=\"preprocessor\"># undocumented classes that are normally visible in the class hierarchy. If set</span></div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\">  484</span>&#160;<span class=\"preprocessor\"># to NO, these classes will be included in the various overviews. This option</span></div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;<span class=\"preprocessor\"># has no effect if EXTRACT_ALL is enabled.</span></div>\n<div class=\"line\"><a name=\"l00486\"></a><span class=\"lineno\">  486</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00487\"></a><span class=\"lineno\">  487</span>&#160;</div>\n<div class=\"line\"><a name=\"l00488\"></a><span class=\"lineno\">  488</span>&#160;HIDE_UNDOC_CLASSES     = YES</div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\">  489</span>&#160;</div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;<span class=\"preprocessor\"># If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend</span></div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;<span class=\"preprocessor\"># (class|struct|union) declarations. If set to NO, these declarations will be</span></div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;<span class=\"preprocessor\"># included in the documentation.</span></div>\n<div class=\"line\"><a name=\"l00493\"></a><span class=\"lineno\">  493</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00494\"></a><span class=\"lineno\">  494</span>&#160;</div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;HIDE_FRIEND_COMPOUNDS  = YES</div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;</div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\">  497</span>&#160;<span class=\"preprocessor\"># If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any</span></div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;<span class=\"preprocessor\"># documentation blocks found inside the body of a function. If set to NO, these</span></div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;<span class=\"preprocessor\"># blocks will be appended to the function&#39;s detailed documentation block.</span></div>\n<div class=\"line\"><a name=\"l00500\"></a><span class=\"lineno\">  500</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;</div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;HIDE_IN_BODY_DOCS      = YES</div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;</div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;<span class=\"preprocessor\"># The INTERNAL_DOCS tag determines if documentation that is typed after a</span></div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;<span class=\"preprocessor\"># \\internal command is included. If the tag is set to NO then the documentation</span></div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;<span class=\"preprocessor\"># will be excluded. Set it to YES to include the internal documentation.</span></div>\n<div class=\"line\"><a name=\"l00507\"></a><span class=\"lineno\">  507</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00508\"></a><span class=\"lineno\">  508</span>&#160;</div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;INTERNAL_DOCS          = NO</div>\n<div class=\"line\"><a name=\"l00510\"></a><span class=\"lineno\">  510</span>&#160;</div>\n<div class=\"line\"><a name=\"l00511\"></a><span class=\"lineno\">  511</span>&#160;<span class=\"preprocessor\"># If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file</span></div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;<span class=\"preprocessor\"># names in lower-case letters. If set to YES, upper-case letters are also</span></div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;<span class=\"preprocessor\"># allowed. This is useful if you have classes or files whose names only differ</span></div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\">  514</span>&#160;<span class=\"preprocessor\"># in case and if your file system supports case sensitive file names. Windows</span></div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;<span class=\"preprocessor\"># and Mac users are advised to set this option to NO.</span></div>\n<div class=\"line\"><a name=\"l00516\"></a><span class=\"lineno\">  516</span>&#160;<span class=\"preprocessor\"># The default value is: system dependent.</span></div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\">  517</span>&#160;</div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;CASE_SENSE_NAMES       = YES</div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;</div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\">  520</span>&#160;<span class=\"preprocessor\"># If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with</span></div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\">  521</span>&#160;<span class=\"preprocessor\"># their full class and namespace scopes in the documentation. If set to YES, the</span></div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;<span class=\"preprocessor\"># scope will be hidden.</span></div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\">  523</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00524\"></a><span class=\"lineno\">  524</span>&#160;</div>\n<div class=\"line\"><a name=\"l00525\"></a><span class=\"lineno\">  525</span>&#160;HIDE_SCOPE_NAMES       = YES</div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;</div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;<span class=\"preprocessor\"># If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will</span></div>\n<div class=\"line\"><a name=\"l00528\"></a><span class=\"lineno\">  528</span>&#160;<span class=\"preprocessor\"># append additional text to a page&#39;s title, such as Class Reference. If set to</span></div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;<span class=\"preprocessor\"># YES the compound reference will be hidden.</span></div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;</div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;HIDE_COMPOUND_REFERENCE= NO</div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\">  533</span>&#160;</div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;<span class=\"preprocessor\"># If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of</span></div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;<span class=\"preprocessor\"># the files that are included by a file in the documentation of that file.</span></div>\n<div class=\"line\"><a name=\"l00536\"></a><span class=\"lineno\">  536</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00537\"></a><span class=\"lineno\">  537</span>&#160;</div>\n<div class=\"line\"><a name=\"l00538\"></a><span class=\"lineno\">  538</span>&#160;SHOW_INCLUDE_FILES     = NO</div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;</div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;<span class=\"preprocessor\"># If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each</span></div>\n<div class=\"line\"><a name=\"l00541\"></a><span class=\"lineno\">  541</span>&#160;<span class=\"preprocessor\"># grouped member an include statement to the documentation, telling the reader</span></div>\n<div class=\"line\"><a name=\"l00542\"></a><span class=\"lineno\">  542</span>&#160;<span class=\"preprocessor\"># which file to include in order to use the member.</span></div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;</div>\n<div class=\"line\"><a name=\"l00545\"></a><span class=\"lineno\">  545</span>&#160;SHOW_GROUPED_MEMB_INC  = NO</div>\n<div class=\"line\"><a name=\"l00546\"></a><span class=\"lineno\">  546</span>&#160;</div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;<span class=\"preprocessor\"># If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include</span></div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;<span class=\"preprocessor\"># files with double quotes in the documentation rather than with sharp brackets.</span></div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\">  549</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\">  550</span>&#160;</div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;FORCE_LOCAL_INCLUDES   = NO</div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;</div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;<span class=\"preprocessor\"># If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the</span></div>\n<div class=\"line\"><a name=\"l00554\"></a><span class=\"lineno\">  554</span>&#160;<span class=\"preprocessor\"># documentation for inline members.</span></div>\n<div class=\"line\"><a name=\"l00555\"></a><span class=\"lineno\">  555</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;</div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;INLINE_INFO            = NO</div>\n<div class=\"line\"><a name=\"l00558\"></a><span class=\"lineno\">  558</span>&#160;</div>\n<div class=\"line\"><a name=\"l00559\"></a><span class=\"lineno\">  559</span>&#160;<span class=\"preprocessor\"># If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the</span></div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;<span class=\"preprocessor\"># (detailed) documentation of file and class members alphabetically by member</span></div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;<span class=\"preprocessor\"># name. If set to NO, the members will appear in declaration order.</span></div>\n<div class=\"line\"><a name=\"l00562\"></a><span class=\"lineno\">  562</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00563\"></a><span class=\"lineno\">  563</span>&#160;</div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;SORT_MEMBER_DOCS       = YES</div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;</div>\n<div class=\"line\"><a name=\"l00566\"></a><span class=\"lineno\">  566</span>&#160;<span class=\"preprocessor\"># If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief</span></div>\n<div class=\"line\"><a name=\"l00567\"></a><span class=\"lineno\">  567</span>&#160;<span class=\"preprocessor\"># descriptions of file, namespace and class members alphabetically by member</span></div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;<span class=\"preprocessor\"># name. If set to NO, the members will appear in declaration order. Note that</span></div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;<span class=\"preprocessor\"># this will also influence the order of the classes in the class list.</span></div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00571\"></a><span class=\"lineno\">  571</span>&#160;</div>\n<div class=\"line\"><a name=\"l00572\"></a><span class=\"lineno\">  572</span>&#160;SORT_BRIEF_DOCS        = YES</div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;</div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;<span class=\"preprocessor\"># If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the</span></div>\n<div class=\"line\"><a name=\"l00575\"></a><span class=\"lineno\">  575</span>&#160;<span class=\"preprocessor\"># (brief and detailed) documentation of class members so that constructors and</span></div>\n<div class=\"line\"><a name=\"l00576\"></a><span class=\"lineno\">  576</span>&#160;<span class=\"preprocessor\"># destructors are listed first. If set to NO the constructors will appear in the</span></div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;<span class=\"preprocessor\"># respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.</span></div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;<span class=\"preprocessor\"># Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief</span></div>\n<div class=\"line\"><a name=\"l00579\"></a><span class=\"lineno\">  579</span>&#160;<span class=\"preprocessor\"># member documentation.</span></div>\n<div class=\"line\"><a name=\"l00580\"></a><span class=\"lineno\">  580</span>&#160;<span class=\"preprocessor\"># Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting</span></div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;<span class=\"preprocessor\"># detailed member documentation.</span></div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00583\"></a><span class=\"lineno\">  583</span>&#160;</div>\n<div class=\"line\"><a name=\"l00584\"></a><span class=\"lineno\">  584</span>&#160;SORT_MEMBERS_CTORS_1ST = NO</div>\n<div class=\"line\"><a name=\"l00585\"></a><span class=\"lineno\">  585</span>&#160;</div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\">  586</span>&#160;<span class=\"preprocessor\"># If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy</span></div>\n<div class=\"line\"><a name=\"l00587\"></a><span class=\"lineno\">  587</span>&#160;<span class=\"preprocessor\"># of group names into alphabetical order. If set to NO the group names will</span></div>\n<div class=\"line\"><a name=\"l00588\"></a><span class=\"lineno\">  588</span>&#160;<span class=\"preprocessor\"># appear in their defined order.</span></div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\">  589</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;</div>\n<div class=\"line\"><a name=\"l00591\"></a><span class=\"lineno\">  591</span>&#160;SORT_GROUP_NAMES       = NO</div>\n<div class=\"line\"><a name=\"l00592\"></a><span class=\"lineno\">  592</span>&#160;</div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;<span class=\"preprocessor\"># If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by</span></div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;<span class=\"preprocessor\"># fully-qualified names, including namespaces. If set to NO, the class list will</span></div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\">  595</span>&#160;<span class=\"preprocessor\"># be sorted only by class name, not including the namespace part.</span></div>\n<div class=\"line\"><a name=\"l00596\"></a><span class=\"lineno\">  596</span>&#160;<span class=\"preprocessor\"># Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.</span></div>\n<div class=\"line\"><a name=\"l00597\"></a><span class=\"lineno\">  597</span>&#160;<span class=\"preprocessor\"># Note: This option applies only to the class list, not to the alphabetical</span></div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\">  598</span>&#160;<span class=\"preprocessor\"># list.</span></div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;</div>\n<div class=\"line\"><a name=\"l00601\"></a><span class=\"lineno\">  601</span>&#160;SORT_BY_SCOPE_NAME     = YES</div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;</div>\n<div class=\"line\"><a name=\"l00603\"></a><span class=\"lineno\">  603</span>&#160;<span class=\"preprocessor\"># If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper</span></div>\n<div class=\"line\"><a name=\"l00604\"></a><span class=\"lineno\">  604</span>&#160;<span class=\"preprocessor\"># type resolution of all parameters of a function it will reject a match between</span></div>\n<div class=\"line\"><a name=\"l00605\"></a><span class=\"lineno\">  605</span>&#160;<span class=\"preprocessor\"># the prototype and the implementation of a member function even if there is</span></div>\n<div class=\"line\"><a name=\"l00606\"></a><span class=\"lineno\">  606</span>&#160;<span class=\"preprocessor\"># only one candidate or it is obvious which candidate to choose by doing a</span></div>\n<div class=\"line\"><a name=\"l00607\"></a><span class=\"lineno\">  607</span>&#160;<span class=\"preprocessor\"># simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still</span></div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;<span class=\"preprocessor\"># accept a match between prototype and implementation in such cases.</span></div>\n<div class=\"line\"><a name=\"l00609\"></a><span class=\"lineno\">  609</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00610\"></a><span class=\"lineno\">  610</span>&#160;</div>\n<div class=\"line\"><a name=\"l00611\"></a><span class=\"lineno\">  611</span>&#160;STRICT_PROTO_MATCHING  = NO</div>\n<div class=\"line\"><a name=\"l00612\"></a><span class=\"lineno\">  612</span>&#160;</div>\n<div class=\"line\"><a name=\"l00613\"></a><span class=\"lineno\">  613</span>&#160;<span class=\"preprocessor\"># The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo</span></div>\n<div class=\"line\"><a name=\"l00614\"></a><span class=\"lineno\">  614</span>&#160;<span class=\"preprocessor\"># list. This list is created by putting \\todo commands in the documentation.</span></div>\n<div class=\"line\"><a name=\"l00615\"></a><span class=\"lineno\">  615</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;</div>\n<div class=\"line\"><a name=\"l00617\"></a><span class=\"lineno\">  617</span>&#160;GENERATE_TODOLIST      = YES</div>\n<div class=\"line\"><a name=\"l00618\"></a><span class=\"lineno\">  618</span>&#160;</div>\n<div class=\"line\"><a name=\"l00619\"></a><span class=\"lineno\">  619</span>&#160;<span class=\"preprocessor\"># The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test</span></div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;<span class=\"preprocessor\"># list. This list is created by putting \\test commands in the documentation.</span></div>\n<div class=\"line\"><a name=\"l00621\"></a><span class=\"lineno\">  621</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00622\"></a><span class=\"lineno\">  622</span>&#160;</div>\n<div class=\"line\"><a name=\"l00623\"></a><span class=\"lineno\">  623</span>&#160;GENERATE_TESTLIST      = YES</div>\n<div class=\"line\"><a name=\"l00624\"></a><span class=\"lineno\">  624</span>&#160;</div>\n<div class=\"line\"><a name=\"l00625\"></a><span class=\"lineno\">  625</span>&#160;<span class=\"preprocessor\"># The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug</span></div>\n<div class=\"line\"><a name=\"l00626\"></a><span class=\"lineno\">  626</span>&#160;<span class=\"preprocessor\"># list. This list is created by putting \\bug commands in the documentation.</span></div>\n<div class=\"line\"><a name=\"l00627\"></a><span class=\"lineno\">  627</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00628\"></a><span class=\"lineno\">  628</span>&#160;</div>\n<div class=\"line\"><a name=\"l00629\"></a><span class=\"lineno\">  629</span>&#160;GENERATE_BUGLIST       = YES</div>\n<div class=\"line\"><a name=\"l00630\"></a><span class=\"lineno\">  630</span>&#160;</div>\n<div class=\"line\"><a name=\"l00631\"></a><span class=\"lineno\">  631</span>&#160;<span class=\"preprocessor\"># The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)</span></div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;<span class=\"preprocessor\"># the deprecated list. This list is created by putting \\deprecated commands in</span></div>\n<div class=\"line\"><a name=\"l00633\"></a><span class=\"lineno\">  633</span>&#160;<span class=\"preprocessor\"># the documentation.</span></div>\n<div class=\"line\"><a name=\"l00634\"></a><span class=\"lineno\">  634</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00635\"></a><span class=\"lineno\">  635</span>&#160;</div>\n<div class=\"line\"><a name=\"l00636\"></a><span class=\"lineno\">  636</span>&#160;GENERATE_DEPRECATEDLIST= YES</div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;</div>\n<div class=\"line\"><a name=\"l00638\"></a><span class=\"lineno\">  638</span>&#160;<span class=\"preprocessor\"># The ENABLED_SECTIONS tag can be used to enable conditional documentation</span></div>\n<div class=\"line\"><a name=\"l00639\"></a><span class=\"lineno\">  639</span>&#160;<span class=\"preprocessor\"># sections, marked by \\if &lt;section_label&gt; ... \\endif and \\cond &lt;section_label&gt;</span></div>\n<div class=\"line\"><a name=\"l00640\"></a><span class=\"lineno\">  640</span>&#160;<span class=\"preprocessor\"># ... \\endcond blocks.</span></div>\n<div class=\"line\"><a name=\"l00641\"></a><span class=\"lineno\">  641</span>&#160;</div>\n<div class=\"line\"><a name=\"l00642\"></a><span class=\"lineno\">  642</span>&#160;ENABLED_SECTIONS       = </div>\n<div class=\"line\"><a name=\"l00643\"></a><span class=\"lineno\">  643</span>&#160;</div>\n<div class=\"line\"><a name=\"l00644\"></a><span class=\"lineno\">  644</span>&#160;<span class=\"preprocessor\"># The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the</span></div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;<span class=\"preprocessor\"># initial value of a variable or macro / define can have for it to appear in the</span></div>\n<div class=\"line\"><a name=\"l00646\"></a><span class=\"lineno\">  646</span>&#160;<span class=\"preprocessor\"># documentation. If the initializer consists of more lines than specified here</span></div>\n<div class=\"line\"><a name=\"l00647\"></a><span class=\"lineno\">  647</span>&#160;<span class=\"preprocessor\"># it will be hidden. Use a value of 0 to hide initializers completely. The</span></div>\n<div class=\"line\"><a name=\"l00648\"></a><span class=\"lineno\">  648</span>&#160;<span class=\"preprocessor\"># appearance of the value of individual variables and macros / defines can be</span></div>\n<div class=\"line\"><a name=\"l00649\"></a><span class=\"lineno\">  649</span>&#160;<span class=\"preprocessor\"># controlled using \\showinitializer or \\hideinitializer command in the</span></div>\n<div class=\"line\"><a name=\"l00650\"></a><span class=\"lineno\">  650</span>&#160;<span class=\"preprocessor\"># documentation regardless of this setting.</span></div>\n<div class=\"line\"><a name=\"l00651\"></a><span class=\"lineno\">  651</span>&#160;<span class=\"preprocessor\"># Minimum value: 0, maximum value: 10000, default value: 30.</span></div>\n<div class=\"line\"><a name=\"l00652\"></a><span class=\"lineno\">  652</span>&#160;</div>\n<div class=\"line\"><a name=\"l00653\"></a><span class=\"lineno\">  653</span>&#160;MAX_INITIALIZER_LINES  = 30</div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;</div>\n<div class=\"line\"><a name=\"l00655\"></a><span class=\"lineno\">  655</span>&#160;<span class=\"preprocessor\"># Set the SHOW_USED_FILES tag to NO to disable the list of files generated at</span></div>\n<div class=\"line\"><a name=\"l00656\"></a><span class=\"lineno\">  656</span>&#160;<span class=\"preprocessor\"># the bottom of the documentation of classes and structs. If set to YES, the</span></div>\n<div class=\"line\"><a name=\"l00657\"></a><span class=\"lineno\">  657</span>&#160;<span class=\"preprocessor\"># list will mention the files that were used to generate the documentation.</span></div>\n<div class=\"line\"><a name=\"l00658\"></a><span class=\"lineno\">  658</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00659\"></a><span class=\"lineno\">  659</span>&#160;</div>\n<div class=\"line\"><a name=\"l00660\"></a><span class=\"lineno\">  660</span>&#160;SHOW_USED_FILES        = NO</div>\n<div class=\"line\"><a name=\"l00661\"></a><span class=\"lineno\">  661</span>&#160;</div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;<span class=\"preprocessor\"># Set the SHOW_FILES tag to NO to disable the generation of the Files page. This</span></div>\n<div class=\"line\"><a name=\"l00663\"></a><span class=\"lineno\">  663</span>&#160;<span class=\"preprocessor\"># will remove the Files entry from the Quick Index and from the Folder Tree View</span></div>\n<div class=\"line\"><a name=\"l00664\"></a><span class=\"lineno\">  664</span>&#160;<span class=\"preprocessor\"># (if specified).</span></div>\n<div class=\"line\"><a name=\"l00665\"></a><span class=\"lineno\">  665</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00666\"></a><span class=\"lineno\">  666</span>&#160;</div>\n<div class=\"line\"><a name=\"l00667\"></a><span class=\"lineno\">  667</span>&#160;SHOW_FILES             = YES</div>\n<div class=\"line\"><a name=\"l00668\"></a><span class=\"lineno\">  668</span>&#160;</div>\n<div class=\"line\"><a name=\"l00669\"></a><span class=\"lineno\">  669</span>&#160;<span class=\"preprocessor\"># Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces</span></div>\n<div class=\"line\"><a name=\"l00670\"></a><span class=\"lineno\">  670</span>&#160;<span class=\"preprocessor\"># page. This will remove the Namespaces entry from the Quick Index and from the</span></div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\">  671</span>&#160;<span class=\"preprocessor\"># Folder Tree View (if specified).</span></div>\n<div class=\"line\"><a name=\"l00672\"></a><span class=\"lineno\">  672</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00673\"></a><span class=\"lineno\">  673</span>&#160;</div>\n<div class=\"line\"><a name=\"l00674\"></a><span class=\"lineno\">  674</span>&#160;SHOW_NAMESPACES        = YES</div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;</div>\n<div class=\"line\"><a name=\"l00676\"></a><span class=\"lineno\">  676</span>&#160;<span class=\"preprocessor\"># The FILE_VERSION_FILTER tag can be used to specify a program or script that</span></div>\n<div class=\"line\"><a name=\"l00677\"></a><span class=\"lineno\">  677</span>&#160;<span class=\"preprocessor\"># doxygen should invoke to get the current version for each file (typically from</span></div>\n<div class=\"line\"><a name=\"l00678\"></a><span class=\"lineno\">  678</span>&#160;<span class=\"preprocessor\"># the version control system). Doxygen will invoke the program by executing (via</span></div>\n<div class=\"line\"><a name=\"l00679\"></a><span class=\"lineno\">  679</span>&#160;<span class=\"preprocessor\"># popen()) the command command input-file, where command is the value of the</span></div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;<span class=\"preprocessor\"># FILE_VERSION_FILTER tag, and input-file is the name of an input file provided</span></div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;<span class=\"preprocessor\"># by doxygen. Whatever the program writes to standard output is used as the file</span></div>\n<div class=\"line\"><a name=\"l00682\"></a><span class=\"lineno\">  682</span>&#160;<span class=\"preprocessor\"># version. For an example see the documentation.</span></div>\n<div class=\"line\"><a name=\"l00683\"></a><span class=\"lineno\">  683</span>&#160;</div>\n<div class=\"line\"><a name=\"l00684\"></a><span class=\"lineno\">  684</span>&#160;FILE_VERSION_FILTER    = </div>\n<div class=\"line\"><a name=\"l00685\"></a><span class=\"lineno\">  685</span>&#160;</div>\n<div class=\"line\"><a name=\"l00686\"></a><span class=\"lineno\">  686</span>&#160;<span class=\"preprocessor\"># The LAYOUT_FILE tag can be used to specify a layout file which will be parsed</span></div>\n<div class=\"line\"><a name=\"l00687\"></a><span class=\"lineno\">  687</span>&#160;<span class=\"preprocessor\"># by doxygen. The layout file controls the global structure of the generated</span></div>\n<div class=\"line\"><a name=\"l00688\"></a><span class=\"lineno\">  688</span>&#160;<span class=\"preprocessor\"># output files in an output format independent way. To create the layout file</span></div>\n<div class=\"line\"><a name=\"l00689\"></a><span class=\"lineno\">  689</span>&#160;<span class=\"preprocessor\"># that represents doxygen&#39;s defaults, run doxygen with the -l option. You can</span></div>\n<div class=\"line\"><a name=\"l00690\"></a><span class=\"lineno\">  690</span>&#160;<span class=\"preprocessor\"># optionally specify a file name after the option, if omitted DoxygenLayout.xml</span></div>\n<div class=\"line\"><a name=\"l00691\"></a><span class=\"lineno\">  691</span>&#160;<span class=\"preprocessor\"># will be used as the name of the layout file.</span></div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\">  692</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00693\"></a><span class=\"lineno\">  693</span>&#160;<span class=\"preprocessor\"># Note that if you run doxygen from a directory containing a file called</span></div>\n<div class=\"line\"><a name=\"l00694\"></a><span class=\"lineno\">  694</span>&#160;<span class=\"preprocessor\"># DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE</span></div>\n<div class=\"line\"><a name=\"l00695\"></a><span class=\"lineno\">  695</span>&#160;<span class=\"preprocessor\"># tag is left empty.</span></div>\n<div class=\"line\"><a name=\"l00696\"></a><span class=\"lineno\">  696</span>&#160;</div>\n<div class=\"line\"><a name=\"l00697\"></a><span class=\"lineno\">  697</span>&#160;LAYOUT_FILE            = </div>\n<div class=\"line\"><a name=\"l00698\"></a><span class=\"lineno\">  698</span>&#160;</div>\n<div class=\"line\"><a name=\"l00699\"></a><span class=\"lineno\">  699</span>&#160;<span class=\"preprocessor\"># The CITE_BIB_FILES tag can be used to specify one or more bib files containing</span></div>\n<div class=\"line\"><a name=\"l00700\"></a><span class=\"lineno\">  700</span>&#160;<span class=\"preprocessor\"># the reference definitions. This must be a list of .bib files. The .bib</span></div>\n<div class=\"line\"><a name=\"l00701\"></a><span class=\"lineno\">  701</span>&#160;<span class=\"preprocessor\"># extension is automatically appended if omitted. This requires the bibtex tool</span></div>\n<div class=\"line\"><a name=\"l00702\"></a><span class=\"lineno\">  702</span>&#160;<span class=\"preprocessor\"># to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.</span></div>\n<div class=\"line\"><a name=\"l00703\"></a><span class=\"lineno\">  703</span>&#160;<span class=\"preprocessor\"># For LaTeX the style of the bibliography can be controlled using</span></div>\n<div class=\"line\"><a name=\"l00704\"></a><span class=\"lineno\">  704</span>&#160;<span class=\"preprocessor\"># LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the</span></div>\n<div class=\"line\"><a name=\"l00705\"></a><span class=\"lineno\">  705</span>&#160;<span class=\"preprocessor\"># search path. See also \\cite for info how to create references.</span></div>\n<div class=\"line\"><a name=\"l00706\"></a><span class=\"lineno\">  706</span>&#160;</div>\n<div class=\"line\"><a name=\"l00707\"></a><span class=\"lineno\">  707</span>&#160;CITE_BIB_FILES         = </div>\n<div class=\"line\"><a name=\"l00708\"></a><span class=\"lineno\">  708</span>&#160;</div>\n<div class=\"line\"><a name=\"l00709\"></a><span class=\"lineno\">  709</span>&#160;<span class=\"preprocessor\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00710\"></a><span class=\"lineno\">  710</span>&#160;<span class=\"preprocessor\"># Configuration options related to warning and progress messages</span></div>\n<div class=\"line\"><a name=\"l00711\"></a><span class=\"lineno\">  711</span>&#160;<span class=\"preprocessor\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00712\"></a><span class=\"lineno\">  712</span>&#160;</div>\n<div class=\"line\"><a name=\"l00713\"></a><span class=\"lineno\">  713</span>&#160;<span class=\"preprocessor\"># The QUIET tag can be used to turn on/off the messages that are generated to</span></div>\n<div class=\"line\"><a name=\"l00714\"></a><span class=\"lineno\">  714</span>&#160;<span class=\"preprocessor\"># standard output by doxygen. If QUIET is set to YES this implies that the</span></div>\n<div class=\"line\"><a name=\"l00715\"></a><span class=\"lineno\">  715</span>&#160;<span class=\"preprocessor\"># messages are off.</span></div>\n<div class=\"line\"><a name=\"l00716\"></a><span class=\"lineno\">  716</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00717\"></a><span class=\"lineno\">  717</span>&#160;</div>\n<div class=\"line\"><a name=\"l00718\"></a><span class=\"lineno\">  718</span>&#160;QUIET                  = NO</div>\n<div class=\"line\"><a name=\"l00719\"></a><span class=\"lineno\">  719</span>&#160;</div>\n<div class=\"line\"><a name=\"l00720\"></a><span class=\"lineno\">  720</span>&#160;<span class=\"preprocessor\"># The WARNINGS tag can be used to turn on/off the warning messages that are</span></div>\n<div class=\"line\"><a name=\"l00721\"></a><span class=\"lineno\">  721</span>&#160;<span class=\"preprocessor\"># generated to standard error (stderr) by doxygen. If WARNINGS is set to YES</span></div>\n<div class=\"line\"><a name=\"l00722\"></a><span class=\"lineno\">  722</span>&#160;<span class=\"preprocessor\"># this implies that the warnings are on.</span></div>\n<div class=\"line\"><a name=\"l00723\"></a><span class=\"lineno\">  723</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00724\"></a><span class=\"lineno\">  724</span>&#160;<span class=\"preprocessor\"># Tip: Turn warnings on while writing the documentation.</span></div>\n<div class=\"line\"><a name=\"l00725\"></a><span class=\"lineno\">  725</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00726\"></a><span class=\"lineno\">  726</span>&#160;</div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;WARNINGS               = YES</div>\n<div class=\"line\"><a name=\"l00728\"></a><span class=\"lineno\">  728</span>&#160;</div>\n<div class=\"line\"><a name=\"l00729\"></a><span class=\"lineno\">  729</span>&#160;<span class=\"preprocessor\"># If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate</span></div>\n<div class=\"line\"><a name=\"l00730\"></a><span class=\"lineno\">  730</span>&#160;<span class=\"preprocessor\"># warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag</span></div>\n<div class=\"line\"><a name=\"l00731\"></a><span class=\"lineno\">  731</span>&#160;<span class=\"preprocessor\"># will automatically be disabled.</span></div>\n<div class=\"line\"><a name=\"l00732\"></a><span class=\"lineno\">  732</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00733\"></a><span class=\"lineno\">  733</span>&#160;</div>\n<div class=\"line\"><a name=\"l00734\"></a><span class=\"lineno\">  734</span>&#160;WARN_IF_UNDOCUMENTED   = YES</div>\n<div class=\"line\"><a name=\"l00735\"></a><span class=\"lineno\">  735</span>&#160;</div>\n<div class=\"line\"><a name=\"l00736\"></a><span class=\"lineno\">  736</span>&#160;<span class=\"preprocessor\"># If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for</span></div>\n<div class=\"line\"><a name=\"l00737\"></a><span class=\"lineno\">  737</span>&#160;<span class=\"preprocessor\"># potential errors in the documentation, such as not documenting some parameters</span></div>\n<div class=\"line\"><a name=\"l00738\"></a><span class=\"lineno\">  738</span>&#160;<span class=\"preprocessor\"># in a documented function, or documenting parameters that don&#39;t exist or using</span></div>\n<div class=\"line\"><a name=\"l00739\"></a><span class=\"lineno\">  739</span>&#160;<span class=\"preprocessor\"># markup commands wrongly.</span></div>\n<div class=\"line\"><a name=\"l00740\"></a><span class=\"lineno\">  740</span>&#160;<span class=\"preprocessor\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00741\"></a><span class=\"lineno\">  741</span>&#160;</div>\n<div class=\"line\"><a name=\"l00742\"></a><span class=\"lineno\">  742</span>&#160;WARN_IF_DOC_ERROR      = YES</div>\n<div class=\"line\"><a name=\"l00743\"></a><span class=\"lineno\">  743</span>&#160;</div>\n<div class=\"line\"><a name=\"l00744\"></a><span class=\"lineno\">  744</span>&#160;<span class=\"preprocessor\"># This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that</span></div>\n<div class=\"line\"><a name=\"l00745\"></a><span class=\"lineno\">  745</span>&#160;<span class=\"preprocessor\"># are documented, but have no documentation for their parameters or return</span></div>\n<div class=\"line\"><a name=\"l00746\"></a><span class=\"lineno\">  746</span>&#160;<span class=\"preprocessor\"># value. If set to NO, doxygen will only warn about wrong or incomplete</span></div>\n<div class=\"line\"><a name=\"l00747\"></a><span class=\"lineno\">  747</span>&#160;<span class=\"preprocessor\"># parameter documentation, but not about the absence of documentation.</span></div>\n<div class=\"line\"><a name=\"l00748\"></a><span class=\"lineno\">  748</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00749\"></a><span class=\"lineno\">  749</span>&#160;</div>\n<div class=\"line\"><a name=\"l00750\"></a><span class=\"lineno\">  750</span>&#160;WARN_NO_PARAMDOC       = NO</div>\n<div class=\"line\"><a name=\"l00751\"></a><span class=\"lineno\">  751</span>&#160;</div>\n<div class=\"line\"><a name=\"l00752\"></a><span class=\"lineno\">  752</span>&#160;<span class=\"preprocessor\"># The WARN_FORMAT tag determines the format of the warning messages that doxygen</span></div>\n<div class=\"line\"><a name=\"l00753\"></a><span class=\"lineno\">  753</span>&#160;<span class=\"preprocessor\"># can produce. The string should contain the $file, $line, and $text tags, which</span></div>\n<div class=\"line\"><a name=\"l00754\"></a><span class=\"lineno\">  754</span>&#160;<span class=\"preprocessor\"># will be replaced by the file and line number from which the warning originated</span></div>\n<div class=\"line\"><a name=\"l00755\"></a><span class=\"lineno\">  755</span>&#160;<span class=\"preprocessor\"># and the warning text. Optionally the format may contain $version, which will</span></div>\n<div class=\"line\"><a name=\"l00756\"></a><span class=\"lineno\">  756</span>&#160;<span class=\"preprocessor\"># be replaced by the version of the file (if it could be obtained via</span></div>\n<div class=\"line\"><a name=\"l00757\"></a><span class=\"lineno\">  757</span>&#160;<span class=\"preprocessor\"># FILE_VERSION_FILTER)</span></div>\n<div class=\"line\"><a name=\"l00758\"></a><span class=\"lineno\">  758</span>&#160;<span class=\"preprocessor\"># The default value is: $file:$line: $text.</span></div>\n<div class=\"line\"><a name=\"l00759\"></a><span class=\"lineno\">  759</span>&#160;</div>\n<div class=\"line\"><a name=\"l00760\"></a><span class=\"lineno\">  760</span>&#160;WARN_FORMAT            = <span class=\"stringliteral\">&quot;$file:$line: $text&quot;</span></div>\n<div class=\"line\"><a name=\"l00761\"></a><span class=\"lineno\">  761</span>&#160;</div>\n<div class=\"line\"><a name=\"l00762\"></a><span class=\"lineno\">  762</span>&#160;<span class=\"preprocessor\"># The WARN_LOGFILE tag can be used to specify a file to which warning and error</span></div>\n<div class=\"line\"><a name=\"l00763\"></a><span class=\"lineno\">  763</span>&#160;<span class=\"preprocessor\"># messages should be written. If left blank the output is written to standard</span></div>\n<div class=\"line\"><a name=\"l00764\"></a><span class=\"lineno\">  764</span>&#160;<span class=\"preprocessor\"># error (stderr).</span></div>\n<div class=\"line\"><a name=\"l00765\"></a><span class=\"lineno\">  765</span>&#160;</div>\n<div class=\"line\"><a name=\"l00766\"></a><span class=\"lineno\">  766</span>&#160;WARN_LOGFILE           = </div>\n<div class=\"line\"><a name=\"l00767\"></a><span class=\"lineno\">  767</span>&#160;</div>\n<div class=\"line\"><a name=\"l00768\"></a><span class=\"lineno\">  768</span>&#160;<span class=\"preprocessor\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00769\"></a><span class=\"lineno\">  769</span>&#160;<span class=\"preprocessor\"># Configuration options related to the input files</span></div>\n<div class=\"line\"><a name=\"l00770\"></a><span class=\"lineno\">  770</span>&#160;<span class=\"preprocessor\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00771\"></a><span class=\"lineno\">  771</span>&#160;</div>\n<div class=\"line\"><a name=\"l00772\"></a><span class=\"lineno\">  772</span>&#160;<span class=\"preprocessor\"># The INPUT tag is used to specify the files and/or directories that contain</span></div>\n<div class=\"line\"><a name=\"l00773\"></a><span class=\"lineno\">  773</span>&#160;<span class=\"preprocessor\"># documented source files. You may enter file names like myfile.cpp or</span></div>\n<div class=\"line\"><a name=\"l00774\"></a><span class=\"lineno\">  774</span>&#160;<span class=\"preprocessor\"># directories like /usr/src/myproject. Separate the files or directories with</span></div>\n<div class=\"line\"><a name=\"l00775\"></a><span class=\"lineno\">  775</span>&#160;<span class=\"preprocessor\"># spaces. See also FILE_PATTERNS and EXTENSION_MAPPING</span></div>\n<div class=\"line\"><a name=\"l00776\"></a><span class=\"lineno\">  776</span>&#160;<span class=\"preprocessor\"># Note: If this tag is empty the current directory is searched.</span></div>\n<div class=\"line\"><a name=\"l00777\"></a><span class=\"lineno\">  777</span>&#160;</div>\n<div class=\"line\"><a name=\"l00778\"></a><span class=\"lineno\">  778</span>&#160;INPUT                  = ../<a class=\"code\" href=\"a00135.html\">glm</a> \\</div>\n<div class=\"line\"><a name=\"l00779\"></a><span class=\"lineno\">  779</span>&#160;                         .</div>\n<div class=\"line\"><a name=\"l00780\"></a><span class=\"lineno\">  780</span>&#160;</div>\n<div class=\"line\"><a name=\"l00781\"></a><span class=\"lineno\">  781</span>&#160;# This tag can be used to specify the character encoding of the source files</div>\n<div class=\"line\"><a name=\"l00782\"></a><span class=\"lineno\">  782</span>&#160;<span class=\"preprocessor\"># that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses</span></div>\n<div class=\"line\"><a name=\"l00783\"></a><span class=\"lineno\">  783</span>&#160;<span class=\"preprocessor\"># libiconv (or the iconv built into libc) for the transcoding. See the libiconv</span></div>\n<div class=\"line\"><a name=\"l00784\"></a><span class=\"lineno\">  784</span>&#160;<span class=\"preprocessor\"># documentation (see: http://www.gnu.org/software/libiconv) for the list of</span></div>\n<div class=\"line\"><a name=\"l00785\"></a><span class=\"lineno\">  785</span>&#160;<span class=\"preprocessor\"># possible encodings.</span></div>\n<div class=\"line\"><a name=\"l00786\"></a><span class=\"lineno\">  786</span>&#160;<span class=\"preprocessor\"># The default value is: UTF-8.</span></div>\n<div class=\"line\"><a name=\"l00787\"></a><span class=\"lineno\">  787</span>&#160;</div>\n<div class=\"line\"><a name=\"l00788\"></a><span class=\"lineno\">  788</span>&#160;INPUT_ENCODING         = UTF-8</div>\n<div class=\"line\"><a name=\"l00789\"></a><span class=\"lineno\">  789</span>&#160;</div>\n<div class=\"line\"><a name=\"l00790\"></a><span class=\"lineno\">  790</span>&#160;<span class=\"preprocessor\"># If the value of the INPUT tag contains directories, you can use the</span></div>\n<div class=\"line\"><a name=\"l00791\"></a><span class=\"lineno\">  791</span>&#160;<span class=\"preprocessor\"># FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and</span></div>\n<div class=\"line\"><a name=\"l00792\"></a><span class=\"lineno\">  792</span>&#160;<span class=\"preprocessor\"># *.h) to filter out the source-files in the directories.</span></div>\n<div class=\"line\"><a name=\"l00793\"></a><span class=\"lineno\">  793</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00794\"></a><span class=\"lineno\">  794</span>&#160;<span class=\"preprocessor\"># Note that for custom extensions or not directly supported extensions you also</span></div>\n<div class=\"line\"><a name=\"l00795\"></a><span class=\"lineno\">  795</span>&#160;<span class=\"preprocessor\"># need to set EXTENSION_MAPPING for the extension otherwise the files are not</span></div>\n<div class=\"line\"><a name=\"l00796\"></a><span class=\"lineno\">  796</span>&#160;<span class=\"preprocessor\"># read by doxygen.</span></div>\n<div class=\"line\"><a name=\"l00797\"></a><span class=\"lineno\">  797</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00798\"></a><span class=\"lineno\">  798</span>&#160;<span class=\"preprocessor\"># If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,</span></div>\n<div class=\"line\"><a name=\"l00799\"></a><span class=\"lineno\">  799</span>&#160;<span class=\"preprocessor\"># *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,</span></div>\n<div class=\"line\"><a name=\"l00800\"></a><span class=\"lineno\">  800</span>&#160;<span class=\"preprocessor\"># *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,</span></div>\n<div class=\"line\"><a name=\"l00801\"></a><span class=\"lineno\">  801</span>&#160;<span class=\"preprocessor\"># *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd,</span></div>\n<div class=\"line\"><a name=\"l00802\"></a><span class=\"lineno\">  802</span>&#160;<span class=\"preprocessor\"># *.vhdl, *.ucf, *.qsf, *.as and *.js.</span></div>\n<div class=\"line\"><a name=\"l00803\"></a><span class=\"lineno\">  803</span>&#160;</div>\n<div class=\"line\"><a name=\"l00804\"></a><span class=\"lineno\">  804</span>&#160;FILE_PATTERNS          = *.hpp \\</div>\n<div class=\"line\"><a name=\"l00805\"></a><span class=\"lineno\">  805</span>&#160;                         *.doxy</div>\n<div class=\"line\"><a name=\"l00806\"></a><span class=\"lineno\">  806</span>&#160;</div>\n<div class=\"line\"><a name=\"l00807\"></a><span class=\"lineno\">  807</span>&#160;<span class=\"preprocessor\"># The RECURSIVE tag can be used to specify whether or not subdirectories should</span></div>\n<div class=\"line\"><a name=\"l00808\"></a><span class=\"lineno\">  808</span>&#160;<span class=\"preprocessor\"># be searched for input files as well.</span></div>\n<div class=\"line\"><a name=\"l00809\"></a><span class=\"lineno\">  809</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00810\"></a><span class=\"lineno\">  810</span>&#160;</div>\n<div class=\"line\"><a name=\"l00811\"></a><span class=\"lineno\">  811</span>&#160;RECURSIVE              = YES</div>\n<div class=\"line\"><a name=\"l00812\"></a><span class=\"lineno\">  812</span>&#160;</div>\n<div class=\"line\"><a name=\"l00813\"></a><span class=\"lineno\">  813</span>&#160;<span class=\"preprocessor\"># The EXCLUDE tag can be used to specify files and/or directories that should be</span></div>\n<div class=\"line\"><a name=\"l00814\"></a><span class=\"lineno\">  814</span>&#160;<span class=\"preprocessor\"># excluded from the INPUT source files. This way you can easily exclude a</span></div>\n<div class=\"line\"><a name=\"l00815\"></a><span class=\"lineno\">  815</span>&#160;<span class=\"preprocessor\"># subdirectory from a directory tree whose root is specified with the INPUT tag.</span></div>\n<div class=\"line\"><a name=\"l00816\"></a><span class=\"lineno\">  816</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00817\"></a><span class=\"lineno\">  817</span>&#160;<span class=\"preprocessor\"># Note that relative paths are relative to the directory from which doxygen is</span></div>\n<div class=\"line\"><a name=\"l00818\"></a><span class=\"lineno\">  818</span>&#160;<span class=\"preprocessor\"># run.</span></div>\n<div class=\"line\"><a name=\"l00819\"></a><span class=\"lineno\">  819</span>&#160;</div>\n<div class=\"line\"><a name=\"l00820\"></a><span class=\"lineno\">  820</span>&#160;EXCLUDE                = </div>\n<div class=\"line\"><a name=\"l00821\"></a><span class=\"lineno\">  821</span>&#160;</div>\n<div class=\"line\"><a name=\"l00822\"></a><span class=\"lineno\">  822</span>&#160;<span class=\"preprocessor\"># The EXCLUDE_SYMLINKS tag can be used to select whether or not files or</span></div>\n<div class=\"line\"><a name=\"l00823\"></a><span class=\"lineno\">  823</span>&#160;<span class=\"preprocessor\"># directories that are symbolic links (a Unix file system feature) are excluded</span></div>\n<div class=\"line\"><a name=\"l00824\"></a><span class=\"lineno\">  824</span>&#160;<span class=\"preprocessor\"># from the input.</span></div>\n<div class=\"line\"><a name=\"l00825\"></a><span class=\"lineno\">  825</span>&#160;<span class=\"preprocessor\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00826\"></a><span class=\"lineno\">  826</span>&#160;</div>\n<div class=\"line\"><a name=\"l00827\"></a><span class=\"lineno\">  827</span>&#160;EXCLUDE_SYMLINKS       = NO</div>\n<div class=\"line\"><a name=\"l00828\"></a><span class=\"lineno\">  828</span>&#160;</div>\n<div class=\"line\"><a name=\"l00829\"></a><span class=\"lineno\">  829</span>&#160;<span class=\"preprocessor\"># If the value of the INPUT tag contains directories, you can use the</span></div>\n<div class=\"line\"><a name=\"l00830\"></a><span class=\"lineno\">  830</span>&#160;<span class=\"preprocessor\"># EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude</span></div>\n<div class=\"line\"><a name=\"l00831\"></a><span class=\"lineno\">  831</span>&#160;<span class=\"preprocessor\"># certain files from those directories.</span></div>\n<div class=\"line\"><a name=\"l00832\"></a><span class=\"lineno\">  832</span>&#160;<span class=\"preprocessor\">#</span></div>\n<div class=\"line\"><a name=\"l00833\"></a><span class=\"lineno\">  833</span>&#160;<span class=\"preprocessor\"># Note that the wildcards are matched against the file with absolute path, so to</span></div>\n<div class=\"line\"><a name=\"l00834\"></a><span class=\"lineno\">  834</span>&#160;<span class=\"preprocessor\"># exclude all test directories for example use the pattern */test</span><span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00835\"></a><span class=\"lineno\">  835</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00836\"></a><span class=\"lineno\">  836</span>&#160;<span class=\"comment\">EXCLUDE_PATTERNS       = </span></div>\n<div class=\"line\"><a name=\"l00837\"></a><span class=\"lineno\">  837</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00838\"></a><span class=\"lineno\">  838</span>&#160;<span class=\"comment\"># The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names</span></div>\n<div class=\"line\"><a name=\"l00839\"></a><span class=\"lineno\">  839</span>&#160;<span class=\"comment\"># (namespaces, classes, functions, etc.) that should be excluded from the</span></div>\n<div class=\"line\"><a name=\"l00840\"></a><span class=\"lineno\">  840</span>&#160;<span class=\"comment\"># output. The symbol name can be a fully qualified name, a word, or if the</span></div>\n<div class=\"line\"><a name=\"l00841\"></a><span class=\"lineno\">  841</span>&#160;<span class=\"comment\"># wildcard * is used, a substring. Examples: ANamespace, AClass,</span></div>\n<div class=\"line\"><a name=\"l00842\"></a><span class=\"lineno\">  842</span>&#160;<span class=\"comment\"># AClass::ANamespace, ANamespace::*Test</span></div>\n<div class=\"line\"><a name=\"l00843\"></a><span class=\"lineno\">  843</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l00844\"></a><span class=\"lineno\">  844</span>&#160;<span class=\"comment\"># Note that the wildcards are matched against the file with absolute path, so to</span></div>\n<div class=\"line\"><a name=\"l00845\"></a><span class=\"lineno\">  845</span>&#160;<span class=\"comment\"># exclude all test directories use the pattern */</span><span class=\"preprocessor\">test</span><span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00846\"></a><span class=\"lineno\">  846</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00847\"></a><span class=\"lineno\">  847</span>&#160;<span class=\"comment\">EXCLUDE_SYMBOLS        = </span></div>\n<div class=\"line\"><a name=\"l00848\"></a><span class=\"lineno\">  848</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00849\"></a><span class=\"lineno\">  849</span>&#160;<span class=\"comment\"># The EXAMPLE_PATH tag can be used to specify one or more files or directories</span></div>\n<div class=\"line\"><a name=\"l00850\"></a><span class=\"lineno\">  850</span>&#160;<span class=\"comment\"># that contain example code fragments that are included (see the \\include</span></div>\n<div class=\"line\"><a name=\"l00851\"></a><span class=\"lineno\">  851</span>&#160;<span class=\"comment\"># command).</span></div>\n<div class=\"line\"><a name=\"l00852\"></a><span class=\"lineno\">  852</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00853\"></a><span class=\"lineno\">  853</span>&#160;<span class=\"comment\">EXAMPLE_PATH           = </span></div>\n<div class=\"line\"><a name=\"l00854\"></a><span class=\"lineno\">  854</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00855\"></a><span class=\"lineno\">  855</span>&#160;<span class=\"comment\"># If the value of the EXAMPLE_PATH tag contains directories, you can use the</span></div>\n<div class=\"line\"><a name=\"l00856\"></a><span class=\"lineno\">  856</span>&#160;<span class=\"comment\"># EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and</span></div>\n<div class=\"line\"><a name=\"l00857\"></a><span class=\"lineno\">  857</span>&#160;<span class=\"comment\"># *.h) to filter out the source-files in the directories. If left blank all</span></div>\n<div class=\"line\"><a name=\"l00858\"></a><span class=\"lineno\">  858</span>&#160;<span class=\"comment\"># files are included.</span></div>\n<div class=\"line\"><a name=\"l00859\"></a><span class=\"lineno\">  859</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00860\"></a><span class=\"lineno\">  860</span>&#160;<span class=\"comment\">EXAMPLE_PATTERNS       = *</span></div>\n<div class=\"line\"><a name=\"l00861\"></a><span class=\"lineno\">  861</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00862\"></a><span class=\"lineno\">  862</span>&#160;<span class=\"comment\"># If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be</span></div>\n<div class=\"line\"><a name=\"l00863\"></a><span class=\"lineno\">  863</span>&#160;<span class=\"comment\"># searched for input files to be used with the \\include or \\dontinclude commands</span></div>\n<div class=\"line\"><a name=\"l00864\"></a><span class=\"lineno\">  864</span>&#160;<span class=\"comment\"># irrespective of the value of the RECURSIVE tag.</span></div>\n<div class=\"line\"><a name=\"l00865\"></a><span class=\"lineno\">  865</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00866\"></a><span class=\"lineno\">  866</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00867\"></a><span class=\"lineno\">  867</span>&#160;<span class=\"comment\">EXAMPLE_RECURSIVE      = NO</span></div>\n<div class=\"line\"><a name=\"l00868\"></a><span class=\"lineno\">  868</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00869\"></a><span class=\"lineno\">  869</span>&#160;<span class=\"comment\"># The IMAGE_PATH tag can be used to specify one or more files or directories</span></div>\n<div class=\"line\"><a name=\"l00870\"></a><span class=\"lineno\">  870</span>&#160;<span class=\"comment\"># that contain images that are to be included in the documentation (see the</span></div>\n<div class=\"line\"><a name=\"l00871\"></a><span class=\"lineno\">  871</span>&#160;<span class=\"comment\"># \\image command).</span></div>\n<div class=\"line\"><a name=\"l00872\"></a><span class=\"lineno\">  872</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00873\"></a><span class=\"lineno\">  873</span>&#160;<span class=\"comment\">IMAGE_PATH             = </span></div>\n<div class=\"line\"><a name=\"l00874\"></a><span class=\"lineno\">  874</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00875\"></a><span class=\"lineno\">  875</span>&#160;<span class=\"comment\"># The INPUT_FILTER tag can be used to specify a program that doxygen should</span></div>\n<div class=\"line\"><a name=\"l00876\"></a><span class=\"lineno\">  876</span>&#160;<span class=\"comment\"># invoke to filter for each input file. Doxygen will invoke the filter program</span></div>\n<div class=\"line\"><a name=\"l00877\"></a><span class=\"lineno\">  877</span>&#160;<span class=\"comment\"># by executing (via popen()) the command:</span></div>\n<div class=\"line\"><a name=\"l00878\"></a><span class=\"lineno\">  878</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l00879\"></a><span class=\"lineno\">  879</span>&#160;<span class=\"comment\"># &lt;filter&gt; &lt;input-file&gt;</span></div>\n<div class=\"line\"><a name=\"l00880\"></a><span class=\"lineno\">  880</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l00881\"></a><span class=\"lineno\">  881</span>&#160;<span class=\"comment\"># where &lt;filter&gt; is the value of the INPUT_FILTER tag, and &lt;input-file&gt; is the</span></div>\n<div class=\"line\"><a name=\"l00882\"></a><span class=\"lineno\">  882</span>&#160;<span class=\"comment\"># name of an input file. Doxygen will then use the output that the filter</span></div>\n<div class=\"line\"><a name=\"l00883\"></a><span class=\"lineno\">  883</span>&#160;<span class=\"comment\"># program writes to standard output. If FILTER_PATTERNS is specified, this tag</span></div>\n<div class=\"line\"><a name=\"l00884\"></a><span class=\"lineno\">  884</span>&#160;<span class=\"comment\"># will be ignored.</span></div>\n<div class=\"line\"><a name=\"l00885\"></a><span class=\"lineno\">  885</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l00886\"></a><span class=\"lineno\">  886</span>&#160;<span class=\"comment\"># Note that the filter must not add or remove lines; it is applied before the</span></div>\n<div class=\"line\"><a name=\"l00887\"></a><span class=\"lineno\">  887</span>&#160;<span class=\"comment\"># code is scanned, but not when the output code is generated. If lines are added</span></div>\n<div class=\"line\"><a name=\"l00888\"></a><span class=\"lineno\">  888</span>&#160;<span class=\"comment\"># or removed, the anchors will not be placed correctly.</span></div>\n<div class=\"line\"><a name=\"l00889\"></a><span class=\"lineno\">  889</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00890\"></a><span class=\"lineno\">  890</span>&#160;<span class=\"comment\">INPUT_FILTER           = </span></div>\n<div class=\"line\"><a name=\"l00891\"></a><span class=\"lineno\">  891</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00892\"></a><span class=\"lineno\">  892</span>&#160;<span class=\"comment\"># The FILTER_PATTERNS tag can be used to specify filters on a per file pattern</span></div>\n<div class=\"line\"><a name=\"l00893\"></a><span class=\"lineno\">  893</span>&#160;<span class=\"comment\"># basis. Doxygen will compare the file name with each pattern and apply the</span></div>\n<div class=\"line\"><a name=\"l00894\"></a><span class=\"lineno\">  894</span>&#160;<span class=\"comment\"># filter if there is a match. The filters are a list of the form: pattern=filter</span></div>\n<div class=\"line\"><a name=\"l00895\"></a><span class=\"lineno\">  895</span>&#160;<span class=\"comment\"># (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how</span></div>\n<div class=\"line\"><a name=\"l00896\"></a><span class=\"lineno\">  896</span>&#160;<span class=\"comment\"># filters are used. If the FILTER_PATTERNS tag is empty or if none of the</span></div>\n<div class=\"line\"><a name=\"l00897\"></a><span class=\"lineno\">  897</span>&#160;<span class=\"comment\"># patterns match the file name, INPUT_FILTER is applied.</span></div>\n<div class=\"line\"><a name=\"l00898\"></a><span class=\"lineno\">  898</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00899\"></a><span class=\"lineno\">  899</span>&#160;<span class=\"comment\">FILTER_PATTERNS        = </span></div>\n<div class=\"line\"><a name=\"l00900\"></a><span class=\"lineno\">  900</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00901\"></a><span class=\"lineno\">  901</span>&#160;<span class=\"comment\"># If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using</span></div>\n<div class=\"line\"><a name=\"l00902\"></a><span class=\"lineno\">  902</span>&#160;<span class=\"comment\"># INPUT_FILTER) will also be used to filter the input files that are used for</span></div>\n<div class=\"line\"><a name=\"l00903\"></a><span class=\"lineno\">  903</span>&#160;<span class=\"comment\"># producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).</span></div>\n<div class=\"line\"><a name=\"l00904\"></a><span class=\"lineno\">  904</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00905\"></a><span class=\"lineno\">  905</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00906\"></a><span class=\"lineno\">  906</span>&#160;<span class=\"comment\">FILTER_SOURCE_FILES    = NO</span></div>\n<div class=\"line\"><a name=\"l00907\"></a><span class=\"lineno\">  907</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00908\"></a><span class=\"lineno\">  908</span>&#160;<span class=\"comment\"># The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file</span></div>\n<div class=\"line\"><a name=\"l00909\"></a><span class=\"lineno\">  909</span>&#160;<span class=\"comment\"># pattern. A pattern will override the setting for FILTER_PATTERN (if any) and</span></div>\n<div class=\"line\"><a name=\"l00910\"></a><span class=\"lineno\">  910</span>&#160;<span class=\"comment\"># it is also possible to disable source filtering for a specific pattern using</span></div>\n<div class=\"line\"><a name=\"l00911\"></a><span class=\"lineno\">  911</span>&#160;<span class=\"comment\"># *.ext= (so without naming a filter).</span></div>\n<div class=\"line\"><a name=\"l00912\"></a><span class=\"lineno\">  912</span>&#160;<span class=\"comment\"># This tag requires that the tag FILTER_SOURCE_FILES is set to YES.</span></div>\n<div class=\"line\"><a name=\"l00913\"></a><span class=\"lineno\">  913</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00914\"></a><span class=\"lineno\">  914</span>&#160;<span class=\"comment\">FILTER_SOURCE_PATTERNS = </span></div>\n<div class=\"line\"><a name=\"l00915\"></a><span class=\"lineno\">  915</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00916\"></a><span class=\"lineno\">  916</span>&#160;<span class=\"comment\"># If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that</span></div>\n<div class=\"line\"><a name=\"l00917\"></a><span class=\"lineno\">  917</span>&#160;<span class=\"comment\"># is part of the input, its contents will be placed on the main page</span></div>\n<div class=\"line\"><a name=\"l00918\"></a><span class=\"lineno\">  918</span>&#160;<span class=\"comment\"># (index.html). This can be useful if you have a project on for instance GitHub</span></div>\n<div class=\"line\"><a name=\"l00919\"></a><span class=\"lineno\">  919</span>&#160;<span class=\"comment\"># and want to reuse the introduction page also for the doxygen output.</span></div>\n<div class=\"line\"><a name=\"l00920\"></a><span class=\"lineno\">  920</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00921\"></a><span class=\"lineno\">  921</span>&#160;<span class=\"comment\">USE_MDFILE_AS_MAINPAGE = </span></div>\n<div class=\"line\"><a name=\"l00922\"></a><span class=\"lineno\">  922</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00923\"></a><span class=\"lineno\">  923</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00924\"></a><span class=\"lineno\">  924</span>&#160;<span class=\"comment\"># Configuration options related to source browsing</span></div>\n<div class=\"line\"><a name=\"l00925\"></a><span class=\"lineno\">  925</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l00926\"></a><span class=\"lineno\">  926</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00927\"></a><span class=\"lineno\">  927</span>&#160;<span class=\"comment\"># If the SOURCE_BROWSER tag is set to YES then a list of source files will be</span></div>\n<div class=\"line\"><a name=\"l00928\"></a><span class=\"lineno\">  928</span>&#160;<span class=\"comment\"># generated. Documented entities will be cross-referenced with these sources.</span></div>\n<div class=\"line\"><a name=\"l00929\"></a><span class=\"lineno\">  929</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l00930\"></a><span class=\"lineno\">  930</span>&#160;<span class=\"comment\"># Note: To get rid of all source code in the generated output, make sure that</span></div>\n<div class=\"line\"><a name=\"l00931\"></a><span class=\"lineno\">  931</span>&#160;<span class=\"comment\"># also VERBATIM_HEADERS is set to NO.</span></div>\n<div class=\"line\"><a name=\"l00932\"></a><span class=\"lineno\">  932</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00933\"></a><span class=\"lineno\">  933</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00934\"></a><span class=\"lineno\">  934</span>&#160;<span class=\"comment\">SOURCE_BROWSER         = YES</span></div>\n<div class=\"line\"><a name=\"l00935\"></a><span class=\"lineno\">  935</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00936\"></a><span class=\"lineno\">  936</span>&#160;<span class=\"comment\"># Setting the INLINE_SOURCES tag to YES will include the body of functions,</span></div>\n<div class=\"line\"><a name=\"l00937\"></a><span class=\"lineno\">  937</span>&#160;<span class=\"comment\"># classes and enums directly into the documentation.</span></div>\n<div class=\"line\"><a name=\"l00938\"></a><span class=\"lineno\">  938</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00939\"></a><span class=\"lineno\">  939</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00940\"></a><span class=\"lineno\">  940</span>&#160;<span class=\"comment\">INLINE_SOURCES         = NO</span></div>\n<div class=\"line\"><a name=\"l00941\"></a><span class=\"lineno\">  941</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00942\"></a><span class=\"lineno\">  942</span>&#160;<span class=\"comment\"># Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any</span></div>\n<div class=\"line\"><a name=\"l00943\"></a><span class=\"lineno\">  943</span>&#160;<span class=\"comment\"># special comment blocks from generated source code fragments. Normal C, C++ and</span></div>\n<div class=\"line\"><a name=\"l00944\"></a><span class=\"lineno\">  944</span>&#160;<span class=\"comment\"># Fortran comments will always remain visible.</span></div>\n<div class=\"line\"><a name=\"l00945\"></a><span class=\"lineno\">  945</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00946\"></a><span class=\"lineno\">  946</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00947\"></a><span class=\"lineno\">  947</span>&#160;<span class=\"comment\">STRIP_CODE_COMMENTS    = YES</span></div>\n<div class=\"line\"><a name=\"l00948\"></a><span class=\"lineno\">  948</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00949\"></a><span class=\"lineno\">  949</span>&#160;<span class=\"comment\"># If the REFERENCED_BY_RELATION tag is set to YES then for each documented</span></div>\n<div class=\"line\"><a name=\"l00950\"></a><span class=\"lineno\">  950</span>&#160;<span class=\"comment\"># function all documented functions referencing it will be listed.</span></div>\n<div class=\"line\"><a name=\"l00951\"></a><span class=\"lineno\">  951</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00952\"></a><span class=\"lineno\">  952</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00953\"></a><span class=\"lineno\">  953</span>&#160;<span class=\"comment\">REFERENCED_BY_RELATION = YES</span></div>\n<div class=\"line\"><a name=\"l00954\"></a><span class=\"lineno\">  954</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00955\"></a><span class=\"lineno\">  955</span>&#160;<span class=\"comment\"># If the REFERENCES_RELATION tag is set to YES then for each documented function</span></div>\n<div class=\"line\"><a name=\"l00956\"></a><span class=\"lineno\">  956</span>&#160;<span class=\"comment\"># all documented entities called/used by that function will be listed.</span></div>\n<div class=\"line\"><a name=\"l00957\"></a><span class=\"lineno\">  957</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00958\"></a><span class=\"lineno\">  958</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00959\"></a><span class=\"lineno\">  959</span>&#160;<span class=\"comment\">REFERENCES_RELATION    = YES</span></div>\n<div class=\"line\"><a name=\"l00960\"></a><span class=\"lineno\">  960</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00961\"></a><span class=\"lineno\">  961</span>&#160;<span class=\"comment\"># If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set</span></div>\n<div class=\"line\"><a name=\"l00962\"></a><span class=\"lineno\">  962</span>&#160;<span class=\"comment\"># to YES then the hyperlinks from functions in REFERENCES_RELATION and</span></div>\n<div class=\"line\"><a name=\"l00963\"></a><span class=\"lineno\">  963</span>&#160;<span class=\"comment\"># REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will</span></div>\n<div class=\"line\"><a name=\"l00964\"></a><span class=\"lineno\">  964</span>&#160;<span class=\"comment\"># link to the documentation.</span></div>\n<div class=\"line\"><a name=\"l00965\"></a><span class=\"lineno\">  965</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00966\"></a><span class=\"lineno\">  966</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00967\"></a><span class=\"lineno\">  967</span>&#160;<span class=\"comment\">REFERENCES_LINK_SOURCE = YES</span></div>\n<div class=\"line\"><a name=\"l00968\"></a><span class=\"lineno\">  968</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00969\"></a><span class=\"lineno\">  969</span>&#160;<span class=\"comment\"># If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the</span></div>\n<div class=\"line\"><a name=\"l00970\"></a><span class=\"lineno\">  970</span>&#160;<span class=\"comment\"># source code will show a tooltip with additional information such as prototype,</span></div>\n<div class=\"line\"><a name=\"l00971\"></a><span class=\"lineno\">  971</span>&#160;<span class=\"comment\"># brief description and links to the definition and documentation. Since this</span></div>\n<div class=\"line\"><a name=\"l00972\"></a><span class=\"lineno\">  972</span>&#160;<span class=\"comment\"># will make the HTML file larger and loading of large files a bit slower, you</span></div>\n<div class=\"line\"><a name=\"l00973\"></a><span class=\"lineno\">  973</span>&#160;<span class=\"comment\"># can opt to disable this feature.</span></div>\n<div class=\"line\"><a name=\"l00974\"></a><span class=\"lineno\">  974</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l00975\"></a><span class=\"lineno\">  975</span>&#160;<span class=\"comment\"># This tag requires that the tag SOURCE_BROWSER is set to YES.</span></div>\n<div class=\"line\"><a name=\"l00976\"></a><span class=\"lineno\">  976</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00977\"></a><span class=\"lineno\">  977</span>&#160;<span class=\"comment\">SOURCE_TOOLTIPS        = YES</span></div>\n<div class=\"line\"><a name=\"l00978\"></a><span class=\"lineno\">  978</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00979\"></a><span class=\"lineno\">  979</span>&#160;<span class=\"comment\"># If the USE_HTAGS tag is set to YES then the references to source code will</span></div>\n<div class=\"line\"><a name=\"l00980\"></a><span class=\"lineno\">  980</span>&#160;<span class=\"comment\"># point to the HTML generated by the htags(1) tool instead of doxygen built-in</span></div>\n<div class=\"line\"><a name=\"l00981\"></a><span class=\"lineno\">  981</span>&#160;<span class=\"comment\"># source browser. The htags tool is part of GNU&#39;s global source tagging system</span></div>\n<div class=\"line\"><a name=\"l00982\"></a><span class=\"lineno\">  982</span>&#160;<span class=\"comment\"># (see http://www.gnu.org/software/global/global.html). You will need version</span></div>\n<div class=\"line\"><a name=\"l00983\"></a><span class=\"lineno\">  983</span>&#160;<span class=\"comment\"># 4.8.6 or higher.</span></div>\n<div class=\"line\"><a name=\"l00984\"></a><span class=\"lineno\">  984</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l00985\"></a><span class=\"lineno\">  985</span>&#160;<span class=\"comment\"># To use it do the following:</span></div>\n<div class=\"line\"><a name=\"l00986\"></a><span class=\"lineno\">  986</span>&#160;<span class=\"comment\"># - Install the latest version of global</span></div>\n<div class=\"line\"><a name=\"l00987\"></a><span class=\"lineno\">  987</span>&#160;<span class=\"comment\"># - Enable SOURCE_BROWSER and USE_HTAGS in the config file</span></div>\n<div class=\"line\"><a name=\"l00988\"></a><span class=\"lineno\">  988</span>&#160;<span class=\"comment\"># - Make sure the INPUT points to the root of the source tree</span></div>\n<div class=\"line\"><a name=\"l00989\"></a><span class=\"lineno\">  989</span>&#160;<span class=\"comment\"># - Run doxygen as normal</span></div>\n<div class=\"line\"><a name=\"l00990\"></a><span class=\"lineno\">  990</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l00991\"></a><span class=\"lineno\">  991</span>&#160;<span class=\"comment\"># Doxygen will invoke htags (and that will in turn invoke gtags), so these</span></div>\n<div class=\"line\"><a name=\"l00992\"></a><span class=\"lineno\">  992</span>&#160;<span class=\"comment\"># tools must be available from the command line (i.e. in the search path).</span></div>\n<div class=\"line\"><a name=\"l00993\"></a><span class=\"lineno\">  993</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l00994\"></a><span class=\"lineno\">  994</span>&#160;<span class=\"comment\"># The result: instead of the source browser generated by doxygen, the links to</span></div>\n<div class=\"line\"><a name=\"l00995\"></a><span class=\"lineno\">  995</span>&#160;<span class=\"comment\"># source code will now point to the output of htags.</span></div>\n<div class=\"line\"><a name=\"l00996\"></a><span class=\"lineno\">  996</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l00997\"></a><span class=\"lineno\">  997</span>&#160;<span class=\"comment\"># This tag requires that the tag SOURCE_BROWSER is set to YES.</span></div>\n<div class=\"line\"><a name=\"l00998\"></a><span class=\"lineno\">  998</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00999\"></a><span class=\"lineno\">  999</span>&#160;<span class=\"comment\">USE_HTAGS              = NO</span></div>\n<div class=\"line\"><a name=\"l01000\"></a><span class=\"lineno\"> 1000</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01001\"></a><span class=\"lineno\"> 1001</span>&#160;<span class=\"comment\"># If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a</span></div>\n<div class=\"line\"><a name=\"l01002\"></a><span class=\"lineno\"> 1002</span>&#160;<span class=\"comment\"># verbatim copy of the header file for each class for which an include is</span></div>\n<div class=\"line\"><a name=\"l01003\"></a><span class=\"lineno\"> 1003</span>&#160;<span class=\"comment\"># specified. Set to NO to disable this.</span></div>\n<div class=\"line\"><a name=\"l01004\"></a><span class=\"lineno\"> 1004</span>&#160;<span class=\"comment\"># See also: Section \\class.</span></div>\n<div class=\"line\"><a name=\"l01005\"></a><span class=\"lineno\"> 1005</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01006\"></a><span class=\"lineno\"> 1006</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01007\"></a><span class=\"lineno\"> 1007</span>&#160;<span class=\"comment\">VERBATIM_HEADERS       = YES</span></div>\n<div class=\"line\"><a name=\"l01008\"></a><span class=\"lineno\"> 1008</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01009\"></a><span class=\"lineno\"> 1009</span>&#160;<span class=\"comment\"># If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the</span></div>\n<div class=\"line\"><a name=\"l01010\"></a><span class=\"lineno\"> 1010</span>&#160;<span class=\"comment\"># clang parser (see: http://clang.llvm.org/) for more accurate parsing at the</span></div>\n<div class=\"line\"><a name=\"l01011\"></a><span class=\"lineno\"> 1011</span>&#160;<span class=\"comment\"># cost of reduced performance. This can be particularly helpful with template</span></div>\n<div class=\"line\"><a name=\"l01012\"></a><span class=\"lineno\"> 1012</span>&#160;<span class=\"comment\"># rich C++ code for which doxygen&#39;s built-in parser lacks the necessary type</span></div>\n<div class=\"line\"><a name=\"l01013\"></a><span class=\"lineno\"> 1013</span>&#160;<span class=\"comment\"># information.</span></div>\n<div class=\"line\"><a name=\"l01014\"></a><span class=\"lineno\"> 1014</span>&#160;<span class=\"comment\"># Note: The availability of this option depends on whether or not doxygen was</span></div>\n<div class=\"line\"><a name=\"l01015\"></a><span class=\"lineno\"> 1015</span>&#160;<span class=\"comment\"># compiled with the --with-libclang option.</span></div>\n<div class=\"line\"><a name=\"l01016\"></a><span class=\"lineno\"> 1016</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01017\"></a><span class=\"lineno\"> 1017</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01018\"></a><span class=\"lineno\"> 1018</span>&#160;<span class=\"comment\">CLANG_ASSISTED_PARSING = NO</span></div>\n<div class=\"line\"><a name=\"l01019\"></a><span class=\"lineno\"> 1019</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01020\"></a><span class=\"lineno\"> 1020</span>&#160;<span class=\"comment\"># If clang assisted parsing is enabled you can provide the compiler with command</span></div>\n<div class=\"line\"><a name=\"l01021\"></a><span class=\"lineno\"> 1021</span>&#160;<span class=\"comment\"># line options that you would normally use when invoking the compiler. Note that</span></div>\n<div class=\"line\"><a name=\"l01022\"></a><span class=\"lineno\"> 1022</span>&#160;<span class=\"comment\"># the include paths will already be set by doxygen for the files and directories</span></div>\n<div class=\"line\"><a name=\"l01023\"></a><span class=\"lineno\"> 1023</span>&#160;<span class=\"comment\"># specified with INPUT and INCLUDE_PATH.</span></div>\n<div class=\"line\"><a name=\"l01024\"></a><span class=\"lineno\"> 1024</span>&#160;<span class=\"comment\"># This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01025\"></a><span class=\"lineno\"> 1025</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01026\"></a><span class=\"lineno\"> 1026</span>&#160;<span class=\"comment\">CLANG_OPTIONS          = </span></div>\n<div class=\"line\"><a name=\"l01027\"></a><span class=\"lineno\"> 1027</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01028\"></a><span class=\"lineno\"> 1028</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01029\"></a><span class=\"lineno\"> 1029</span>&#160;<span class=\"comment\"># Configuration options related to the alphabetical class index</span></div>\n<div class=\"line\"><a name=\"l01030\"></a><span class=\"lineno\"> 1030</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01031\"></a><span class=\"lineno\"> 1031</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01032\"></a><span class=\"lineno\"> 1032</span>&#160;<span class=\"comment\"># If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all</span></div>\n<div class=\"line\"><a name=\"l01033\"></a><span class=\"lineno\"> 1033</span>&#160;<span class=\"comment\"># compounds will be generated. Enable this if the project contains a lot of</span></div>\n<div class=\"line\"><a name=\"l01034\"></a><span class=\"lineno\"> 1034</span>&#160;<span class=\"comment\"># classes, structs, unions or interfaces.</span></div>\n<div class=\"line\"><a name=\"l01035\"></a><span class=\"lineno\"> 1035</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01036\"></a><span class=\"lineno\"> 1036</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01037\"></a><span class=\"lineno\"> 1037</span>&#160;<span class=\"comment\">ALPHABETICAL_INDEX     = NO</span></div>\n<div class=\"line\"><a name=\"l01038\"></a><span class=\"lineno\"> 1038</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01039\"></a><span class=\"lineno\"> 1039</span>&#160;<span class=\"comment\"># The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in</span></div>\n<div class=\"line\"><a name=\"l01040\"></a><span class=\"lineno\"> 1040</span>&#160;<span class=\"comment\"># which the alphabetical index list will be split.</span></div>\n<div class=\"line\"><a name=\"l01041\"></a><span class=\"lineno\"> 1041</span>&#160;<span class=\"comment\"># Minimum value: 1, maximum value: 20, default value: 5.</span></div>\n<div class=\"line\"><a name=\"l01042\"></a><span class=\"lineno\"> 1042</span>&#160;<span class=\"comment\"># This tag requires that the tag ALPHABETICAL_INDEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01043\"></a><span class=\"lineno\"> 1043</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01044\"></a><span class=\"lineno\"> 1044</span>&#160;<span class=\"comment\">COLS_IN_ALPHA_INDEX    = 5</span></div>\n<div class=\"line\"><a name=\"l01045\"></a><span class=\"lineno\"> 1045</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01046\"></a><span class=\"lineno\"> 1046</span>&#160;<span class=\"comment\"># In case all classes in a project start with a common prefix, all classes will</span></div>\n<div class=\"line\"><a name=\"l01047\"></a><span class=\"lineno\"> 1047</span>&#160;<span class=\"comment\"># be put under the same header in the alphabetical index. The IGNORE_PREFIX tag</span></div>\n<div class=\"line\"><a name=\"l01048\"></a><span class=\"lineno\"> 1048</span>&#160;<span class=\"comment\"># can be used to specify a prefix (or a list of prefixes) that should be ignored</span></div>\n<div class=\"line\"><a name=\"l01049\"></a><span class=\"lineno\"> 1049</span>&#160;<span class=\"comment\"># while generating the index headers.</span></div>\n<div class=\"line\"><a name=\"l01050\"></a><span class=\"lineno\"> 1050</span>&#160;<span class=\"comment\"># This tag requires that the tag ALPHABETICAL_INDEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01051\"></a><span class=\"lineno\"> 1051</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01052\"></a><span class=\"lineno\"> 1052</span>&#160;<span class=\"comment\">IGNORE_PREFIX          = </span></div>\n<div class=\"line\"><a name=\"l01053\"></a><span class=\"lineno\"> 1053</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01054\"></a><span class=\"lineno\"> 1054</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01055\"></a><span class=\"lineno\"> 1055</span>&#160;<span class=\"comment\"># Configuration options related to the HTML output</span></div>\n<div class=\"line\"><a name=\"l01056\"></a><span class=\"lineno\"> 1056</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01057\"></a><span class=\"lineno\"> 1057</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01058\"></a><span class=\"lineno\"> 1058</span>&#160;<span class=\"comment\"># If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output</span></div>\n<div class=\"line\"><a name=\"l01059\"></a><span class=\"lineno\"> 1059</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01060\"></a><span class=\"lineno\"> 1060</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01061\"></a><span class=\"lineno\"> 1061</span>&#160;<span class=\"comment\">GENERATE_HTML          = YES</span></div>\n<div class=\"line\"><a name=\"l01062\"></a><span class=\"lineno\"> 1062</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01063\"></a><span class=\"lineno\"> 1063</span>&#160;<span class=\"comment\"># The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a</span></div>\n<div class=\"line\"><a name=\"l01064\"></a><span class=\"lineno\"> 1064</span>&#160;<span class=\"comment\"># relative path is entered the value of OUTPUT_DIRECTORY will be put in front of</span></div>\n<div class=\"line\"><a name=\"l01065\"></a><span class=\"lineno\"> 1065</span>&#160;<span class=\"comment\"># it.</span></div>\n<div class=\"line\"><a name=\"l01066\"></a><span class=\"lineno\"> 1066</span>&#160;<span class=\"comment\"># The default directory is: html.</span></div>\n<div class=\"line\"><a name=\"l01067\"></a><span class=\"lineno\"> 1067</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01068\"></a><span class=\"lineno\"> 1068</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01069\"></a><span class=\"lineno\"> 1069</span>&#160;<span class=\"comment\">HTML_OUTPUT            = html</span></div>\n<div class=\"line\"><a name=\"l01070\"></a><span class=\"lineno\"> 1070</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01071\"></a><span class=\"lineno\"> 1071</span>&#160;<span class=\"comment\"># The HTML_FILE_EXTENSION tag can be used to specify the file extension for each</span></div>\n<div class=\"line\"><a name=\"l01072\"></a><span class=\"lineno\"> 1072</span>&#160;<span class=\"comment\"># generated HTML page (for example: .htm, .php, .asp).</span></div>\n<div class=\"line\"><a name=\"l01073\"></a><span class=\"lineno\"> 1073</span>&#160;<span class=\"comment\"># The default value is: .html.</span></div>\n<div class=\"line\"><a name=\"l01074\"></a><span class=\"lineno\"> 1074</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01075\"></a><span class=\"lineno\"> 1075</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01076\"></a><span class=\"lineno\"> 1076</span>&#160;<span class=\"comment\">HTML_FILE_EXTENSION    = .html</span></div>\n<div class=\"line\"><a name=\"l01077\"></a><span class=\"lineno\"> 1077</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01078\"></a><span class=\"lineno\"> 1078</span>&#160;<span class=\"comment\"># The HTML_HEADER tag can be used to specify a user-defined HTML header file for</span></div>\n<div class=\"line\"><a name=\"l01079\"></a><span class=\"lineno\"> 1079</span>&#160;<span class=\"comment\"># each generated HTML page. If the tag is left blank doxygen will generate a</span></div>\n<div class=\"line\"><a name=\"l01080\"></a><span class=\"lineno\"> 1080</span>&#160;<span class=\"comment\"># standard header.</span></div>\n<div class=\"line\"><a name=\"l01081\"></a><span class=\"lineno\"> 1081</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01082\"></a><span class=\"lineno\"> 1082</span>&#160;<span class=\"comment\"># To get valid HTML the header file that includes any scripts and style sheets</span></div>\n<div class=\"line\"><a name=\"l01083\"></a><span class=\"lineno\"> 1083</span>&#160;<span class=\"comment\"># that doxygen needs, which is dependent on the configuration options used (e.g.</span></div>\n<div class=\"line\"><a name=\"l01084\"></a><span class=\"lineno\"> 1084</span>&#160;<span class=\"comment\"># the setting GENERATE_TREEVIEW). It is highly recommended to start with a</span></div>\n<div class=\"line\"><a name=\"l01085\"></a><span class=\"lineno\"> 1085</span>&#160;<span class=\"comment\"># default header using</span></div>\n<div class=\"line\"><a name=\"l01086\"></a><span class=\"lineno\"> 1086</span>&#160;<span class=\"comment\"># doxygen -w html new_header.html new_footer.html new_stylesheet.css</span></div>\n<div class=\"line\"><a name=\"l01087\"></a><span class=\"lineno\"> 1087</span>&#160;<span class=\"comment\"># YourConfigFile</span></div>\n<div class=\"line\"><a name=\"l01088\"></a><span class=\"lineno\"> 1088</span>&#160;<span class=\"comment\"># and then modify the file new_header.html. See also section &quot;Doxygen usage&quot;</span></div>\n<div class=\"line\"><a name=\"l01089\"></a><span class=\"lineno\"> 1089</span>&#160;<span class=\"comment\"># for information on how to generate the default header that doxygen normally</span></div>\n<div class=\"line\"><a name=\"l01090\"></a><span class=\"lineno\"> 1090</span>&#160;<span class=\"comment\"># uses.</span></div>\n<div class=\"line\"><a name=\"l01091\"></a><span class=\"lineno\"> 1091</span>&#160;<span class=\"comment\"># Note: The header is subject to change so you typically have to regenerate the</span></div>\n<div class=\"line\"><a name=\"l01092\"></a><span class=\"lineno\"> 1092</span>&#160;<span class=\"comment\"># default header when upgrading to a newer version of doxygen. For a description</span></div>\n<div class=\"line\"><a name=\"l01093\"></a><span class=\"lineno\"> 1093</span>&#160;<span class=\"comment\"># of the possible markers and block names see the documentation.</span></div>\n<div class=\"line\"><a name=\"l01094\"></a><span class=\"lineno\"> 1094</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01095\"></a><span class=\"lineno\"> 1095</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01096\"></a><span class=\"lineno\"> 1096</span>&#160;<span class=\"comment\">HTML_HEADER            = </span></div>\n<div class=\"line\"><a name=\"l01097\"></a><span class=\"lineno\"> 1097</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01098\"></a><span class=\"lineno\"> 1098</span>&#160;<span class=\"comment\"># The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each</span></div>\n<div class=\"line\"><a name=\"l01099\"></a><span class=\"lineno\"> 1099</span>&#160;<span class=\"comment\"># generated HTML page. If the tag is left blank doxygen will generate a standard</span></div>\n<div class=\"line\"><a name=\"l01100\"></a><span class=\"lineno\"> 1100</span>&#160;<span class=\"comment\"># footer. See HTML_HEADER for more information on how to generate a default</span></div>\n<div class=\"line\"><a name=\"l01101\"></a><span class=\"lineno\"> 1101</span>&#160;<span class=\"comment\"># footer and what special commands can be used inside the footer. See also</span></div>\n<div class=\"line\"><a name=\"l01102\"></a><span class=\"lineno\"> 1102</span>&#160;<span class=\"comment\"># section &quot;Doxygen usage&quot; for information on how to generate the default footer</span></div>\n<div class=\"line\"><a name=\"l01103\"></a><span class=\"lineno\"> 1103</span>&#160;<span class=\"comment\"># that doxygen normally uses.</span></div>\n<div class=\"line\"><a name=\"l01104\"></a><span class=\"lineno\"> 1104</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01105\"></a><span class=\"lineno\"> 1105</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01106\"></a><span class=\"lineno\"> 1106</span>&#160;<span class=\"comment\">HTML_FOOTER            = </span></div>\n<div class=\"line\"><a name=\"l01107\"></a><span class=\"lineno\"> 1107</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01108\"></a><span class=\"lineno\"> 1108</span>&#160;<span class=\"comment\"># The HTML_STYLESHEET tag can be used to specify a user-defined cascading style</span></div>\n<div class=\"line\"><a name=\"l01109\"></a><span class=\"lineno\"> 1109</span>&#160;<span class=\"comment\"># sheet that is used by each HTML page. It can be used to fine-tune the look of</span></div>\n<div class=\"line\"><a name=\"l01110\"></a><span class=\"lineno\"> 1110</span>&#160;<span class=\"comment\"># the HTML output. If left blank doxygen will generate a default style sheet.</span></div>\n<div class=\"line\"><a name=\"l01111\"></a><span class=\"lineno\"> 1111</span>&#160;<span class=\"comment\"># See also section &quot;Doxygen usage&quot; for information on how to generate the style</span></div>\n<div class=\"line\"><a name=\"l01112\"></a><span class=\"lineno\"> 1112</span>&#160;<span class=\"comment\"># sheet that doxygen normally uses.</span></div>\n<div class=\"line\"><a name=\"l01113\"></a><span class=\"lineno\"> 1113</span>&#160;<span class=\"comment\"># Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as</span></div>\n<div class=\"line\"><a name=\"l01114\"></a><span class=\"lineno\"> 1114</span>&#160;<span class=\"comment\"># it is more robust and this tag (HTML_STYLESHEET) will in the future become</span></div>\n<div class=\"line\"><a name=\"l01115\"></a><span class=\"lineno\"> 1115</span>&#160;<span class=\"comment\"># obsolete.</span></div>\n<div class=\"line\"><a name=\"l01116\"></a><span class=\"lineno\"> 1116</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01117\"></a><span class=\"lineno\"> 1117</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01118\"></a><span class=\"lineno\"> 1118</span>&#160;<span class=\"comment\">HTML_STYLESHEET        = </span></div>\n<div class=\"line\"><a name=\"l01119\"></a><span class=\"lineno\"> 1119</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01120\"></a><span class=\"lineno\"> 1120</span>&#160;<span class=\"comment\"># The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined</span></div>\n<div class=\"line\"><a name=\"l01121\"></a><span class=\"lineno\"> 1121</span>&#160;<span class=\"comment\"># cascading style sheets that are included after the standard style sheets</span></div>\n<div class=\"line\"><a name=\"l01122\"></a><span class=\"lineno\"> 1122</span>&#160;<span class=\"comment\"># created by doxygen. Using this option one can overrule certain style aspects.</span></div>\n<div class=\"line\"><a name=\"l01123\"></a><span class=\"lineno\"> 1123</span>&#160;<span class=\"comment\"># This is preferred over using HTML_STYLESHEET since it does not replace the</span></div>\n<div class=\"line\"><a name=\"l01124\"></a><span class=\"lineno\"> 1124</span>&#160;<span class=\"comment\"># standard style sheet and is therefore more robust against future updates.</span></div>\n<div class=\"line\"><a name=\"l01125\"></a><span class=\"lineno\"> 1125</span>&#160;<span class=\"comment\"># Doxygen will copy the style sheet files to the output directory.</span></div>\n<div class=\"line\"><a name=\"l01126\"></a><span class=\"lineno\"> 1126</span>&#160;<span class=\"comment\"># Note: The order of the extra style sheet files is of importance (e.g. the last</span></div>\n<div class=\"line\"><a name=\"l01127\"></a><span class=\"lineno\"> 1127</span>&#160;<span class=\"comment\"># style sheet in the list overrules the setting of the previous ones in the</span></div>\n<div class=\"line\"><a name=\"l01128\"></a><span class=\"lineno\"> 1128</span>&#160;<span class=\"comment\"># list). For an example see the documentation.</span></div>\n<div class=\"line\"><a name=\"l01129\"></a><span class=\"lineno\"> 1129</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01130\"></a><span class=\"lineno\"> 1130</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01131\"></a><span class=\"lineno\"> 1131</span>&#160;<span class=\"comment\">HTML_EXTRA_STYLESHEET  = </span></div>\n<div class=\"line\"><a name=\"l01132\"></a><span class=\"lineno\"> 1132</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01133\"></a><span class=\"lineno\"> 1133</span>&#160;<span class=\"comment\"># The HTML_EXTRA_FILES tag can be used to specify one or more extra images or</span></div>\n<div class=\"line\"><a name=\"l01134\"></a><span class=\"lineno\"> 1134</span>&#160;<span class=\"comment\"># other source files which should be copied to the HTML output directory. Note</span></div>\n<div class=\"line\"><a name=\"l01135\"></a><span class=\"lineno\"> 1135</span>&#160;<span class=\"comment\"># that these files will be copied to the base HTML output directory. Use the</span></div>\n<div class=\"line\"><a name=\"l01136\"></a><span class=\"lineno\"> 1136</span>&#160;<span class=\"comment\"># $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these</span></div>\n<div class=\"line\"><a name=\"l01137\"></a><span class=\"lineno\"> 1137</span>&#160;<span class=\"comment\"># files. In the HTML_STYLESHEET file, use the file name only. Also note that the</span></div>\n<div class=\"line\"><a name=\"l01138\"></a><span class=\"lineno\"> 1138</span>&#160;<span class=\"comment\"># files will be copied as-is; there are no commands or markers available.</span></div>\n<div class=\"line\"><a name=\"l01139\"></a><span class=\"lineno\"> 1139</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01140\"></a><span class=\"lineno\"> 1140</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01141\"></a><span class=\"lineno\"> 1141</span>&#160;<span class=\"comment\">HTML_EXTRA_FILES       = </span></div>\n<div class=\"line\"><a name=\"l01142\"></a><span class=\"lineno\"> 1142</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01143\"></a><span class=\"lineno\"> 1143</span>&#160;<span class=\"comment\"># The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen</span></div>\n<div class=\"line\"><a name=\"l01144\"></a><span class=\"lineno\"> 1144</span>&#160;<span class=\"comment\"># will adjust the colors in the style sheet and background images according to</span></div>\n<div class=\"line\"><a name=\"l01145\"></a><span class=\"lineno\"> 1145</span>&#160;<span class=\"comment\"># this color. Hue is specified as an angle on a colorwheel, see</span></div>\n<div class=\"line\"><a name=\"l01146\"></a><span class=\"lineno\"> 1146</span>&#160;<span class=\"comment\"># http://en.wikipedia.org/wiki/Hue for more information. For instance the value</span></div>\n<div class=\"line\"><a name=\"l01147\"></a><span class=\"lineno\"> 1147</span>&#160;<span class=\"comment\"># 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300</span></div>\n<div class=\"line\"><a name=\"l01148\"></a><span class=\"lineno\"> 1148</span>&#160;<span class=\"comment\"># purple, and 360 is red again.</span></div>\n<div class=\"line\"><a name=\"l01149\"></a><span class=\"lineno\"> 1149</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 359, default value: 220.</span></div>\n<div class=\"line\"><a name=\"l01150\"></a><span class=\"lineno\"> 1150</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01151\"></a><span class=\"lineno\"> 1151</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01152\"></a><span class=\"lineno\"> 1152</span>&#160;<span class=\"comment\">HTML_COLORSTYLE_HUE    = 220</span></div>\n<div class=\"line\"><a name=\"l01153\"></a><span class=\"lineno\"> 1153</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01154\"></a><span class=\"lineno\"> 1154</span>&#160;<span class=\"comment\"># The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors</span></div>\n<div class=\"line\"><a name=\"l01155\"></a><span class=\"lineno\"> 1155</span>&#160;<span class=\"comment\"># in the HTML output. For a value of 0 the output will use grayscales only. A</span></div>\n<div class=\"line\"><a name=\"l01156\"></a><span class=\"lineno\"> 1156</span>&#160;<span class=\"comment\"># value of 255 will produce the most vivid colors.</span></div>\n<div class=\"line\"><a name=\"l01157\"></a><span class=\"lineno\"> 1157</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 255, default value: 100.</span></div>\n<div class=\"line\"><a name=\"l01158\"></a><span class=\"lineno\"> 1158</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01159\"></a><span class=\"lineno\"> 1159</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01160\"></a><span class=\"lineno\"> 1160</span>&#160;<span class=\"comment\">HTML_COLORSTYLE_SAT    = 100</span></div>\n<div class=\"line\"><a name=\"l01161\"></a><span class=\"lineno\"> 1161</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01162\"></a><span class=\"lineno\"> 1162</span>&#160;<span class=\"comment\"># The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the</span></div>\n<div class=\"line\"><a name=\"l01163\"></a><span class=\"lineno\"> 1163</span>&#160;<span class=\"comment\"># luminance component of the colors in the HTML output. Values below 100</span></div>\n<div class=\"line\"><a name=\"l01164\"></a><span class=\"lineno\"> 1164</span>&#160;<span class=\"comment\"># gradually make the output lighter, whereas values above 100 make the output</span></div>\n<div class=\"line\"><a name=\"l01165\"></a><span class=\"lineno\"> 1165</span>&#160;<span class=\"comment\"># darker. The value divided by 100 is the actual gamma applied, so 80 represents</span></div>\n<div class=\"line\"><a name=\"l01166\"></a><span class=\"lineno\"> 1166</span>&#160;<span class=\"comment\"># a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not</span></div>\n<div class=\"line\"><a name=\"l01167\"></a><span class=\"lineno\"> 1167</span>&#160;<span class=\"comment\"># change the gamma.</span></div>\n<div class=\"line\"><a name=\"l01168\"></a><span class=\"lineno\"> 1168</span>&#160;<span class=\"comment\"># Minimum value: 40, maximum value: 240, default value: 80.</span></div>\n<div class=\"line\"><a name=\"l01169\"></a><span class=\"lineno\"> 1169</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01170\"></a><span class=\"lineno\"> 1170</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01171\"></a><span class=\"lineno\"> 1171</span>&#160;<span class=\"comment\">HTML_COLORSTYLE_GAMMA  = 80</span></div>\n<div class=\"line\"><a name=\"l01172\"></a><span class=\"lineno\"> 1172</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01173\"></a><span class=\"lineno\"> 1173</span>&#160;<span class=\"comment\"># If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML</span></div>\n<div class=\"line\"><a name=\"l01174\"></a><span class=\"lineno\"> 1174</span>&#160;<span class=\"comment\"># page will contain the date and time when the page was generated. Setting this</span></div>\n<div class=\"line\"><a name=\"l01175\"></a><span class=\"lineno\"> 1175</span>&#160;<span class=\"comment\"># to YES can help to show when doxygen was last run and thus if the</span></div>\n<div class=\"line\"><a name=\"l01176\"></a><span class=\"lineno\"> 1176</span>&#160;<span class=\"comment\"># documentation is up to date.</span></div>\n<div class=\"line\"><a name=\"l01177\"></a><span class=\"lineno\"> 1177</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01178\"></a><span class=\"lineno\"> 1178</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01179\"></a><span class=\"lineno\"> 1179</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01180\"></a><span class=\"lineno\"> 1180</span>&#160;<span class=\"comment\">HTML_TIMESTAMP         = NO</span></div>\n<div class=\"line\"><a name=\"l01181\"></a><span class=\"lineno\"> 1181</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01182\"></a><span class=\"lineno\"> 1182</span>&#160;<span class=\"comment\"># If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML</span></div>\n<div class=\"line\"><a name=\"l01183\"></a><span class=\"lineno\"> 1183</span>&#160;<span class=\"comment\"># documentation will contain sections that can be hidden and shown after the</span></div>\n<div class=\"line\"><a name=\"l01184\"></a><span class=\"lineno\"> 1184</span>&#160;<span class=\"comment\"># page has loaded.</span></div>\n<div class=\"line\"><a name=\"l01185\"></a><span class=\"lineno\"> 1185</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01186\"></a><span class=\"lineno\"> 1186</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01187\"></a><span class=\"lineno\"> 1187</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01188\"></a><span class=\"lineno\"> 1188</span>&#160;<span class=\"comment\">HTML_DYNAMIC_SECTIONS  = NO</span></div>\n<div class=\"line\"><a name=\"l01189\"></a><span class=\"lineno\"> 1189</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01190\"></a><span class=\"lineno\"> 1190</span>&#160;<span class=\"comment\"># With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries</span></div>\n<div class=\"line\"><a name=\"l01191\"></a><span class=\"lineno\"> 1191</span>&#160;<span class=\"comment\"># shown in the various tree structured indices initially; the user can expand</span></div>\n<div class=\"line\"><a name=\"l01192\"></a><span class=\"lineno\"> 1192</span>&#160;<span class=\"comment\"># and collapse entries dynamically later on. Doxygen will expand the tree to</span></div>\n<div class=\"line\"><a name=\"l01193\"></a><span class=\"lineno\"> 1193</span>&#160;<span class=\"comment\"># such a level that at most the specified number of entries are visible (unless</span></div>\n<div class=\"line\"><a name=\"l01194\"></a><span class=\"lineno\"> 1194</span>&#160;<span class=\"comment\"># a fully collapsed tree already exceeds this amount). So setting the number of</span></div>\n<div class=\"line\"><a name=\"l01195\"></a><span class=\"lineno\"> 1195</span>&#160;<span class=\"comment\"># entries 1 will produce a full collapsed tree by default. 0 is a special value</span></div>\n<div class=\"line\"><a name=\"l01196\"></a><span class=\"lineno\"> 1196</span>&#160;<span class=\"comment\"># representing an infinite number of entries and will result in a full expanded</span></div>\n<div class=\"line\"><a name=\"l01197\"></a><span class=\"lineno\"> 1197</span>&#160;<span class=\"comment\"># tree by default.</span></div>\n<div class=\"line\"><a name=\"l01198\"></a><span class=\"lineno\"> 1198</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 9999, default value: 100.</span></div>\n<div class=\"line\"><a name=\"l01199\"></a><span class=\"lineno\"> 1199</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01200\"></a><span class=\"lineno\"> 1200</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01201\"></a><span class=\"lineno\"> 1201</span>&#160;<span class=\"comment\">HTML_INDEX_NUM_ENTRIES = 100</span></div>\n<div class=\"line\"><a name=\"l01202\"></a><span class=\"lineno\"> 1202</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01203\"></a><span class=\"lineno\"> 1203</span>&#160;<span class=\"comment\"># If the GENERATE_DOCSET tag is set to YES, additional index files will be</span></div>\n<div class=\"line\"><a name=\"l01204\"></a><span class=\"lineno\"> 1204</span>&#160;<span class=\"comment\"># generated that can be used as input for Apple&#39;s Xcode 3 integrated development</span></div>\n<div class=\"line\"><a name=\"l01205\"></a><span class=\"lineno\"> 1205</span>&#160;<span class=\"comment\"># environment (see: http://developer.apple.com/tools/xcode/), introduced with</span></div>\n<div class=\"line\"><a name=\"l01206\"></a><span class=\"lineno\"> 1206</span>&#160;<span class=\"comment\"># OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a</span></div>\n<div class=\"line\"><a name=\"l01207\"></a><span class=\"lineno\"> 1207</span>&#160;<span class=\"comment\"># Makefile in the HTML output directory. Running make will produce the docset in</span></div>\n<div class=\"line\"><a name=\"l01208\"></a><span class=\"lineno\"> 1208</span>&#160;<span class=\"comment\"># that directory and running make install will install the docset in</span></div>\n<div class=\"line\"><a name=\"l01209\"></a><span class=\"lineno\"> 1209</span>&#160;<span class=\"comment\"># ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at</span></div>\n<div class=\"line\"><a name=\"l01210\"></a><span class=\"lineno\"> 1210</span>&#160;<span class=\"comment\"># startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html</span></div>\n<div class=\"line\"><a name=\"l01211\"></a><span class=\"lineno\"> 1211</span>&#160;<span class=\"comment\"># for more information.</span></div>\n<div class=\"line\"><a name=\"l01212\"></a><span class=\"lineno\"> 1212</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01213\"></a><span class=\"lineno\"> 1213</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01214\"></a><span class=\"lineno\"> 1214</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01215\"></a><span class=\"lineno\"> 1215</span>&#160;<span class=\"comment\">GENERATE_DOCSET        = NO</span></div>\n<div class=\"line\"><a name=\"l01216\"></a><span class=\"lineno\"> 1216</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01217\"></a><span class=\"lineno\"> 1217</span>&#160;<span class=\"comment\"># This tag determines the name of the docset feed. A documentation feed provides</span></div>\n<div class=\"line\"><a name=\"l01218\"></a><span class=\"lineno\"> 1218</span>&#160;<span class=\"comment\"># an umbrella under which multiple documentation sets from a single provider</span></div>\n<div class=\"line\"><a name=\"l01219\"></a><span class=\"lineno\"> 1219</span>&#160;<span class=\"comment\"># (such as a company or product suite) can be grouped.</span></div>\n<div class=\"line\"><a name=\"l01220\"></a><span class=\"lineno\"> 1220</span>&#160;<span class=\"comment\"># The default value is: Doxygen generated docs.</span></div>\n<div class=\"line\"><a name=\"l01221\"></a><span class=\"lineno\"> 1221</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_DOCSET is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01222\"></a><span class=\"lineno\"> 1222</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01223\"></a><span class=\"lineno\"> 1223</span>&#160;<span class=\"comment\">DOCSET_FEEDNAME        = &quot;Doxygen generated docs&quot;</span></div>\n<div class=\"line\"><a name=\"l01224\"></a><span class=\"lineno\"> 1224</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01225\"></a><span class=\"lineno\"> 1225</span>&#160;<span class=\"comment\"># This tag specifies a string that should uniquely identify the documentation</span></div>\n<div class=\"line\"><a name=\"l01226\"></a><span class=\"lineno\"> 1226</span>&#160;<span class=\"comment\"># set bundle. This should be a reverse domain-name style string, e.g.</span></div>\n<div class=\"line\"><a name=\"l01227\"></a><span class=\"lineno\"> 1227</span>&#160;<span class=\"comment\"># com.mycompany.MyDocSet. Doxygen will append .docset to the name.</span></div>\n<div class=\"line\"><a name=\"l01228\"></a><span class=\"lineno\"> 1228</span>&#160;<span class=\"comment\"># The default value is: org.doxygen.Project.</span></div>\n<div class=\"line\"><a name=\"l01229\"></a><span class=\"lineno\"> 1229</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_DOCSET is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01230\"></a><span class=\"lineno\"> 1230</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01231\"></a><span class=\"lineno\"> 1231</span>&#160;<span class=\"comment\">DOCSET_BUNDLE_ID       = org.doxygen.Project</span></div>\n<div class=\"line\"><a name=\"l01232\"></a><span class=\"lineno\"> 1232</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01233\"></a><span class=\"lineno\"> 1233</span>&#160;<span class=\"comment\"># The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify</span></div>\n<div class=\"line\"><a name=\"l01234\"></a><span class=\"lineno\"> 1234</span>&#160;<span class=\"comment\"># the documentation publisher. This should be a reverse domain-name style</span></div>\n<div class=\"line\"><a name=\"l01235\"></a><span class=\"lineno\"> 1235</span>&#160;<span class=\"comment\"># string, e.g. com.mycompany.MyDocSet.documentation.</span></div>\n<div class=\"line\"><a name=\"l01236\"></a><span class=\"lineno\"> 1236</span>&#160;<span class=\"comment\"># The default value is: org.doxygen.Publisher.</span></div>\n<div class=\"line\"><a name=\"l01237\"></a><span class=\"lineno\"> 1237</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_DOCSET is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01238\"></a><span class=\"lineno\"> 1238</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01239\"></a><span class=\"lineno\"> 1239</span>&#160;<span class=\"comment\">DOCSET_PUBLISHER_ID    = org.doxygen.Publisher</span></div>\n<div class=\"line\"><a name=\"l01240\"></a><span class=\"lineno\"> 1240</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01241\"></a><span class=\"lineno\"> 1241</span>&#160;<span class=\"comment\"># The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.</span></div>\n<div class=\"line\"><a name=\"l01242\"></a><span class=\"lineno\"> 1242</span>&#160;<span class=\"comment\"># The default value is: Publisher.</span></div>\n<div class=\"line\"><a name=\"l01243\"></a><span class=\"lineno\"> 1243</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_DOCSET is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01244\"></a><span class=\"lineno\"> 1244</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01245\"></a><span class=\"lineno\"> 1245</span>&#160;<span class=\"comment\">DOCSET_PUBLISHER_NAME  = Publisher</span></div>\n<div class=\"line\"><a name=\"l01246\"></a><span class=\"lineno\"> 1246</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01247\"></a><span class=\"lineno\"> 1247</span>&#160;<span class=\"comment\"># If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three</span></div>\n<div class=\"line\"><a name=\"l01248\"></a><span class=\"lineno\"> 1248</span>&#160;<span class=\"comment\"># additional HTML index files: index.hhp, index.hhc, and index.hhk. The</span></div>\n<div class=\"line\"><a name=\"l01249\"></a><span class=\"lineno\"> 1249</span>&#160;<span class=\"comment\"># index.hhp is a project file that can be read by Microsoft&#39;s HTML Help Workshop</span></div>\n<div class=\"line\"><a name=\"l01250\"></a><span class=\"lineno\"> 1250</span>&#160;<span class=\"comment\"># (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on</span></div>\n<div class=\"line\"><a name=\"l01251\"></a><span class=\"lineno\"> 1251</span>&#160;<span class=\"comment\"># Windows.</span></div>\n<div class=\"line\"><a name=\"l01252\"></a><span class=\"lineno\"> 1252</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01253\"></a><span class=\"lineno\"> 1253</span>&#160;<span class=\"comment\"># The HTML Help Workshop contains a compiler that can convert all HTML output</span></div>\n<div class=\"line\"><a name=\"l01254\"></a><span class=\"lineno\"> 1254</span>&#160;<span class=\"comment\"># generated by doxygen into a single compiled HTML file (.chm). Compiled HTML</span></div>\n<div class=\"line\"><a name=\"l01255\"></a><span class=\"lineno\"> 1255</span>&#160;<span class=\"comment\"># files are now used as the Windows 98 help format, and will replace the old</span></div>\n<div class=\"line\"><a name=\"l01256\"></a><span class=\"lineno\"> 1256</span>&#160;<span class=\"comment\"># Windows help format (.hlp) on all Windows platforms in the future. Compressed</span></div>\n<div class=\"line\"><a name=\"l01257\"></a><span class=\"lineno\"> 1257</span>&#160;<span class=\"comment\"># HTML files also contain an index, a table of contents, and you can search for</span></div>\n<div class=\"line\"><a name=\"l01258\"></a><span class=\"lineno\"> 1258</span>&#160;<span class=\"comment\"># words in the documentation. The HTML workshop also contains a viewer for</span></div>\n<div class=\"line\"><a name=\"l01259\"></a><span class=\"lineno\"> 1259</span>&#160;<span class=\"comment\"># compressed HTML files.</span></div>\n<div class=\"line\"><a name=\"l01260\"></a><span class=\"lineno\"> 1260</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01261\"></a><span class=\"lineno\"> 1261</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01262\"></a><span class=\"lineno\"> 1262</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01263\"></a><span class=\"lineno\"> 1263</span>&#160;<span class=\"comment\">GENERATE_HTMLHELP      = NO</span></div>\n<div class=\"line\"><a name=\"l01264\"></a><span class=\"lineno\"> 1264</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01265\"></a><span class=\"lineno\"> 1265</span>&#160;<span class=\"comment\"># The CHM_FILE tag can be used to specify the file name of the resulting .chm</span></div>\n<div class=\"line\"><a name=\"l01266\"></a><span class=\"lineno\"> 1266</span>&#160;<span class=\"comment\"># file. You can add a path in front of the file if the result should not be</span></div>\n<div class=\"line\"><a name=\"l01267\"></a><span class=\"lineno\"> 1267</span>&#160;<span class=\"comment\"># written to the html output directory.</span></div>\n<div class=\"line\"><a name=\"l01268\"></a><span class=\"lineno\"> 1268</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTMLHELP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01269\"></a><span class=\"lineno\"> 1269</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01270\"></a><span class=\"lineno\"> 1270</span>&#160;<span class=\"comment\">CHM_FILE               = </span></div>\n<div class=\"line\"><a name=\"l01271\"></a><span class=\"lineno\"> 1271</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01272\"></a><span class=\"lineno\"> 1272</span>&#160;<span class=\"comment\"># The HHC_LOCATION tag can be used to specify the location (absolute path</span></div>\n<div class=\"line\"><a name=\"l01273\"></a><span class=\"lineno\"> 1273</span>&#160;<span class=\"comment\"># including file name) of the HTML help compiler (hhc.exe). If non-empty,</span></div>\n<div class=\"line\"><a name=\"l01274\"></a><span class=\"lineno\"> 1274</span>&#160;<span class=\"comment\"># doxygen will try to run the HTML help compiler on the generated index.hhp.</span></div>\n<div class=\"line\"><a name=\"l01275\"></a><span class=\"lineno\"> 1275</span>&#160;<span class=\"comment\"># The file has to be specified with full path.</span></div>\n<div class=\"line\"><a name=\"l01276\"></a><span class=\"lineno\"> 1276</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTMLHELP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01277\"></a><span class=\"lineno\"> 1277</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01278\"></a><span class=\"lineno\"> 1278</span>&#160;<span class=\"comment\">HHC_LOCATION           = </span></div>\n<div class=\"line\"><a name=\"l01279\"></a><span class=\"lineno\"> 1279</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01280\"></a><span class=\"lineno\"> 1280</span>&#160;<span class=\"comment\"># The GENERATE_CHI flag controls if a separate .chi index file is generated</span></div>\n<div class=\"line\"><a name=\"l01281\"></a><span class=\"lineno\"> 1281</span>&#160;<span class=\"comment\"># (YES) or that it should be included in the master .chm file (NO).</span></div>\n<div class=\"line\"><a name=\"l01282\"></a><span class=\"lineno\"> 1282</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01283\"></a><span class=\"lineno\"> 1283</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTMLHELP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01284\"></a><span class=\"lineno\"> 1284</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01285\"></a><span class=\"lineno\"> 1285</span>&#160;<span class=\"comment\">GENERATE_CHI           = NO</span></div>\n<div class=\"line\"><a name=\"l01286\"></a><span class=\"lineno\"> 1286</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01287\"></a><span class=\"lineno\"> 1287</span>&#160;<span class=\"comment\"># The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)</span></div>\n<div class=\"line\"><a name=\"l01288\"></a><span class=\"lineno\"> 1288</span>&#160;<span class=\"comment\"># and project file content.</span></div>\n<div class=\"line\"><a name=\"l01289\"></a><span class=\"lineno\"> 1289</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTMLHELP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01290\"></a><span class=\"lineno\"> 1290</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01291\"></a><span class=\"lineno\"> 1291</span>&#160;<span class=\"comment\">CHM_INDEX_ENCODING     = </span></div>\n<div class=\"line\"><a name=\"l01292\"></a><span class=\"lineno\"> 1292</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01293\"></a><span class=\"lineno\"> 1293</span>&#160;<span class=\"comment\"># The BINARY_TOC flag controls whether a binary table of contents is generated</span></div>\n<div class=\"line\"><a name=\"l01294\"></a><span class=\"lineno\"> 1294</span>&#160;<span class=\"comment\"># (YES) or a normal table of contents (NO) in the .chm file. Furthermore it</span></div>\n<div class=\"line\"><a name=\"l01295\"></a><span class=\"lineno\"> 1295</span>&#160;<span class=\"comment\"># enables the Previous and Next buttons.</span></div>\n<div class=\"line\"><a name=\"l01296\"></a><span class=\"lineno\"> 1296</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01297\"></a><span class=\"lineno\"> 1297</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTMLHELP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01298\"></a><span class=\"lineno\"> 1298</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01299\"></a><span class=\"lineno\"> 1299</span>&#160;<span class=\"comment\">BINARY_TOC             = NO</span></div>\n<div class=\"line\"><a name=\"l01300\"></a><span class=\"lineno\"> 1300</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01301\"></a><span class=\"lineno\"> 1301</span>&#160;<span class=\"comment\"># The TOC_EXPAND flag can be set to YES to add extra items for group members to</span></div>\n<div class=\"line\"><a name=\"l01302\"></a><span class=\"lineno\"> 1302</span>&#160;<span class=\"comment\"># the table of contents of the HTML help documentation and to the tree view.</span></div>\n<div class=\"line\"><a name=\"l01303\"></a><span class=\"lineno\"> 1303</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01304\"></a><span class=\"lineno\"> 1304</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTMLHELP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01305\"></a><span class=\"lineno\"> 1305</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01306\"></a><span class=\"lineno\"> 1306</span>&#160;<span class=\"comment\">TOC_EXPAND             = NO</span></div>\n<div class=\"line\"><a name=\"l01307\"></a><span class=\"lineno\"> 1307</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01308\"></a><span class=\"lineno\"> 1308</span>&#160;<span class=\"comment\"># If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and</span></div>\n<div class=\"line\"><a name=\"l01309\"></a><span class=\"lineno\"> 1309</span>&#160;<span class=\"comment\"># QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that</span></div>\n<div class=\"line\"><a name=\"l01310\"></a><span class=\"lineno\"> 1310</span>&#160;<span class=\"comment\"># can be used as input for Qt&#39;s qhelpgenerator to generate a Qt Compressed Help</span></div>\n<div class=\"line\"><a name=\"l01311\"></a><span class=\"lineno\"> 1311</span>&#160;<span class=\"comment\"># (.qch) of the generated HTML documentation.</span></div>\n<div class=\"line\"><a name=\"l01312\"></a><span class=\"lineno\"> 1312</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01313\"></a><span class=\"lineno\"> 1313</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01314\"></a><span class=\"lineno\"> 1314</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01315\"></a><span class=\"lineno\"> 1315</span>&#160;<span class=\"comment\">GENERATE_QHP           = NO</span></div>\n<div class=\"line\"><a name=\"l01316\"></a><span class=\"lineno\"> 1316</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01317\"></a><span class=\"lineno\"> 1317</span>&#160;<span class=\"comment\"># If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify</span></div>\n<div class=\"line\"><a name=\"l01318\"></a><span class=\"lineno\"> 1318</span>&#160;<span class=\"comment\"># the file name of the resulting .qch file. The path specified is relative to</span></div>\n<div class=\"line\"><a name=\"l01319\"></a><span class=\"lineno\"> 1319</span>&#160;<span class=\"comment\"># the HTML output folder.</span></div>\n<div class=\"line\"><a name=\"l01320\"></a><span class=\"lineno\"> 1320</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_QHP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01321\"></a><span class=\"lineno\"> 1321</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01322\"></a><span class=\"lineno\"> 1322</span>&#160;<span class=\"comment\">QCH_FILE               = </span></div>\n<div class=\"line\"><a name=\"l01323\"></a><span class=\"lineno\"> 1323</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01324\"></a><span class=\"lineno\"> 1324</span>&#160;<span class=\"comment\"># The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help</span></div>\n<div class=\"line\"><a name=\"l01325\"></a><span class=\"lineno\"> 1325</span>&#160;<span class=\"comment\"># Project output. For more information please see Qt Help Project / Namespace</span></div>\n<div class=\"line\"><a name=\"l01326\"></a><span class=\"lineno\"> 1326</span>&#160;<span class=\"comment\"># (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).</span></div>\n<div class=\"line\"><a name=\"l01327\"></a><span class=\"lineno\"> 1327</span>&#160;<span class=\"comment\"># The default value is: org.doxygen.Project.</span></div>\n<div class=\"line\"><a name=\"l01328\"></a><span class=\"lineno\"> 1328</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_QHP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01329\"></a><span class=\"lineno\"> 1329</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01330\"></a><span class=\"lineno\"> 1330</span>&#160;<span class=\"comment\">QHP_NAMESPACE          = org.doxygen.Project</span></div>\n<div class=\"line\"><a name=\"l01331\"></a><span class=\"lineno\"> 1331</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01332\"></a><span class=\"lineno\"> 1332</span>&#160;<span class=\"comment\"># The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt</span></div>\n<div class=\"line\"><a name=\"l01333\"></a><span class=\"lineno\"> 1333</span>&#160;<span class=\"comment\"># Help Project output. For more information please see Qt Help Project / Virtual</span></div>\n<div class=\"line\"><a name=\"l01334\"></a><span class=\"lineno\"> 1334</span>&#160;<span class=\"comment\"># Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-</span></div>\n<div class=\"line\"><a name=\"l01335\"></a><span class=\"lineno\"> 1335</span>&#160;<span class=\"comment\"># folders).</span></div>\n<div class=\"line\"><a name=\"l01336\"></a><span class=\"lineno\"> 1336</span>&#160;<span class=\"comment\"># The default value is: doc.</span></div>\n<div class=\"line\"><a name=\"l01337\"></a><span class=\"lineno\"> 1337</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_QHP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01338\"></a><span class=\"lineno\"> 1338</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01339\"></a><span class=\"lineno\"> 1339</span>&#160;<span class=\"comment\">QHP_VIRTUAL_FOLDER     = doc</span></div>\n<div class=\"line\"><a name=\"l01340\"></a><span class=\"lineno\"> 1340</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01341\"></a><span class=\"lineno\"> 1341</span>&#160;<span class=\"comment\"># If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom</span></div>\n<div class=\"line\"><a name=\"l01342\"></a><span class=\"lineno\"> 1342</span>&#160;<span class=\"comment\"># filter to add. For more information please see Qt Help Project / Custom</span></div>\n<div class=\"line\"><a name=\"l01343\"></a><span class=\"lineno\"> 1343</span>&#160;<span class=\"comment\"># Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-</span></div>\n<div class=\"line\"><a name=\"l01344\"></a><span class=\"lineno\"> 1344</span>&#160;<span class=\"comment\"># filters).</span></div>\n<div class=\"line\"><a name=\"l01345\"></a><span class=\"lineno\"> 1345</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_QHP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01346\"></a><span class=\"lineno\"> 1346</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01347\"></a><span class=\"lineno\"> 1347</span>&#160;<span class=\"comment\">QHP_CUST_FILTER_NAME   = </span></div>\n<div class=\"line\"><a name=\"l01348\"></a><span class=\"lineno\"> 1348</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01349\"></a><span class=\"lineno\"> 1349</span>&#160;<span class=\"comment\"># The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the</span></div>\n<div class=\"line\"><a name=\"l01350\"></a><span class=\"lineno\"> 1350</span>&#160;<span class=\"comment\"># custom filter to add. For more information please see Qt Help Project / Custom</span></div>\n<div class=\"line\"><a name=\"l01351\"></a><span class=\"lineno\"> 1351</span>&#160;<span class=\"comment\"># Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-</span></div>\n<div class=\"line\"><a name=\"l01352\"></a><span class=\"lineno\"> 1352</span>&#160;<span class=\"comment\"># filters).</span></div>\n<div class=\"line\"><a name=\"l01353\"></a><span class=\"lineno\"> 1353</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_QHP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01354\"></a><span class=\"lineno\"> 1354</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01355\"></a><span class=\"lineno\"> 1355</span>&#160;<span class=\"comment\">QHP_CUST_FILTER_ATTRS  = </span></div>\n<div class=\"line\"><a name=\"l01356\"></a><span class=\"lineno\"> 1356</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01357\"></a><span class=\"lineno\"> 1357</span>&#160;<span class=\"comment\"># The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this</span></div>\n<div class=\"line\"><a name=\"l01358\"></a><span class=\"lineno\"> 1358</span>&#160;<span class=\"comment\"># project&#39;s filter section matches. Qt Help Project / Filter Attributes (see:</span></div>\n<div class=\"line\"><a name=\"l01359\"></a><span class=\"lineno\"> 1359</span>&#160;<span class=\"comment\"># http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).</span></div>\n<div class=\"line\"><a name=\"l01360\"></a><span class=\"lineno\"> 1360</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_QHP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01361\"></a><span class=\"lineno\"> 1361</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01362\"></a><span class=\"lineno\"> 1362</span>&#160;<span class=\"comment\">QHP_SECT_FILTER_ATTRS  = </span></div>\n<div class=\"line\"><a name=\"l01363\"></a><span class=\"lineno\"> 1363</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01364\"></a><span class=\"lineno\"> 1364</span>&#160;<span class=\"comment\"># The QHG_LOCATION tag can be used to specify the location of Qt&#39;s</span></div>\n<div class=\"line\"><a name=\"l01365\"></a><span class=\"lineno\"> 1365</span>&#160;<span class=\"comment\"># qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the</span></div>\n<div class=\"line\"><a name=\"l01366\"></a><span class=\"lineno\"> 1366</span>&#160;<span class=\"comment\"># generated .qhp file.</span></div>\n<div class=\"line\"><a name=\"l01367\"></a><span class=\"lineno\"> 1367</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_QHP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01368\"></a><span class=\"lineno\"> 1368</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01369\"></a><span class=\"lineno\"> 1369</span>&#160;<span class=\"comment\">QHG_LOCATION           = </span></div>\n<div class=\"line\"><a name=\"l01370\"></a><span class=\"lineno\"> 1370</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01371\"></a><span class=\"lineno\"> 1371</span>&#160;<span class=\"comment\"># If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be</span></div>\n<div class=\"line\"><a name=\"l01372\"></a><span class=\"lineno\"> 1372</span>&#160;<span class=\"comment\"># generated, together with the HTML files, they form an Eclipse help plugin. To</span></div>\n<div class=\"line\"><a name=\"l01373\"></a><span class=\"lineno\"> 1373</span>&#160;<span class=\"comment\"># install this plugin and make it available under the help contents menu in</span></div>\n<div class=\"line\"><a name=\"l01374\"></a><span class=\"lineno\"> 1374</span>&#160;<span class=\"comment\"># Eclipse, the contents of the directory containing the HTML and XML files needs</span></div>\n<div class=\"line\"><a name=\"l01375\"></a><span class=\"lineno\"> 1375</span>&#160;<span class=\"comment\"># to be copied into the plugins directory of eclipse. The name of the directory</span></div>\n<div class=\"line\"><a name=\"l01376\"></a><span class=\"lineno\"> 1376</span>&#160;<span class=\"comment\"># within the plugins directory should be the same as the ECLIPSE_DOC_ID value.</span></div>\n<div class=\"line\"><a name=\"l01377\"></a><span class=\"lineno\"> 1377</span>&#160;<span class=\"comment\"># After copying Eclipse needs to be restarted before the help appears.</span></div>\n<div class=\"line\"><a name=\"l01378\"></a><span class=\"lineno\"> 1378</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01379\"></a><span class=\"lineno\"> 1379</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01380\"></a><span class=\"lineno\"> 1380</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01381\"></a><span class=\"lineno\"> 1381</span>&#160;<span class=\"comment\">GENERATE_ECLIPSEHELP   = NO</span></div>\n<div class=\"line\"><a name=\"l01382\"></a><span class=\"lineno\"> 1382</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01383\"></a><span class=\"lineno\"> 1383</span>&#160;<span class=\"comment\"># A unique identifier for the Eclipse help plugin. When installing the plugin</span></div>\n<div class=\"line\"><a name=\"l01384\"></a><span class=\"lineno\"> 1384</span>&#160;<span class=\"comment\"># the directory name containing the HTML and XML files should also have this</span></div>\n<div class=\"line\"><a name=\"l01385\"></a><span class=\"lineno\"> 1385</span>&#160;<span class=\"comment\"># name. Each documentation set should have its own identifier.</span></div>\n<div class=\"line\"><a name=\"l01386\"></a><span class=\"lineno\"> 1386</span>&#160;<span class=\"comment\"># The default value is: org.doxygen.Project.</span></div>\n<div class=\"line\"><a name=\"l01387\"></a><span class=\"lineno\"> 1387</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01388\"></a><span class=\"lineno\"> 1388</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01389\"></a><span class=\"lineno\"> 1389</span>&#160;<span class=\"comment\">ECLIPSE_DOC_ID         = org.doxygen.Project</span></div>\n<div class=\"line\"><a name=\"l01390\"></a><span class=\"lineno\"> 1390</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01391\"></a><span class=\"lineno\"> 1391</span>&#160;<span class=\"comment\"># If you want full control over the layout of the generated HTML pages it might</span></div>\n<div class=\"line\"><a name=\"l01392\"></a><span class=\"lineno\"> 1392</span>&#160;<span class=\"comment\"># be necessary to disable the index and replace it with your own. The</span></div>\n<div class=\"line\"><a name=\"l01393\"></a><span class=\"lineno\"> 1393</span>&#160;<span class=\"comment\"># DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top</span></div>\n<div class=\"line\"><a name=\"l01394\"></a><span class=\"lineno\"> 1394</span>&#160;<span class=\"comment\"># of each HTML page. A value of NO enables the index and the value YES disables</span></div>\n<div class=\"line\"><a name=\"l01395\"></a><span class=\"lineno\"> 1395</span>&#160;<span class=\"comment\"># it. Since the tabs in the index contain the same information as the navigation</span></div>\n<div class=\"line\"><a name=\"l01396\"></a><span class=\"lineno\"> 1396</span>&#160;<span class=\"comment\"># tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.</span></div>\n<div class=\"line\"><a name=\"l01397\"></a><span class=\"lineno\"> 1397</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01398\"></a><span class=\"lineno\"> 1398</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01399\"></a><span class=\"lineno\"> 1399</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01400\"></a><span class=\"lineno\"> 1400</span>&#160;<span class=\"comment\">DISABLE_INDEX          = NO</span></div>\n<div class=\"line\"><a name=\"l01401\"></a><span class=\"lineno\"> 1401</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01402\"></a><span class=\"lineno\"> 1402</span>&#160;<span class=\"comment\"># The GENERATE_TREEVIEW tag is used to specify whether a tree-like index</span></div>\n<div class=\"line\"><a name=\"l01403\"></a><span class=\"lineno\"> 1403</span>&#160;<span class=\"comment\"># structure should be generated to display hierarchical information. If the tag</span></div>\n<div class=\"line\"><a name=\"l01404\"></a><span class=\"lineno\"> 1404</span>&#160;<span class=\"comment\"># value is set to YES, a side panel will be generated containing a tree-like</span></div>\n<div class=\"line\"><a name=\"l01405\"></a><span class=\"lineno\"> 1405</span>&#160;<span class=\"comment\"># index structure (just like the one that is generated for HTML Help). For this</span></div>\n<div class=\"line\"><a name=\"l01406\"></a><span class=\"lineno\"> 1406</span>&#160;<span class=\"comment\"># to work a browser that supports JavaScript, DHTML, CSS and frames is required</span></div>\n<div class=\"line\"><a name=\"l01407\"></a><span class=\"lineno\"> 1407</span>&#160;<span class=\"comment\"># (i.e. any modern browser). Windows users are probably better off using the</span></div>\n<div class=\"line\"><a name=\"l01408\"></a><span class=\"lineno\"> 1408</span>&#160;<span class=\"comment\"># HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can</span></div>\n<div class=\"line\"><a name=\"l01409\"></a><span class=\"lineno\"> 1409</span>&#160;<span class=\"comment\"># further fine-tune the look of the index. As an example, the default style</span></div>\n<div class=\"line\"><a name=\"l01410\"></a><span class=\"lineno\"> 1410</span>&#160;<span class=\"comment\"># sheet generated by doxygen has an example that shows how to put an image at</span></div>\n<div class=\"line\"><a name=\"l01411\"></a><span class=\"lineno\"> 1411</span>&#160;<span class=\"comment\"># the root of the tree instead of the PROJECT_NAME. Since the tree basically has</span></div>\n<div class=\"line\"><a name=\"l01412\"></a><span class=\"lineno\"> 1412</span>&#160;<span class=\"comment\"># the same information as the tab index, you could consider setting</span></div>\n<div class=\"line\"><a name=\"l01413\"></a><span class=\"lineno\"> 1413</span>&#160;<span class=\"comment\"># DISABLE_INDEX to YES when enabling this option.</span></div>\n<div class=\"line\"><a name=\"l01414\"></a><span class=\"lineno\"> 1414</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01415\"></a><span class=\"lineno\"> 1415</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01416\"></a><span class=\"lineno\"> 1416</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01417\"></a><span class=\"lineno\"> 1417</span>&#160;<span class=\"comment\">GENERATE_TREEVIEW      = NO</span></div>\n<div class=\"line\"><a name=\"l01418\"></a><span class=\"lineno\"> 1418</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01419\"></a><span class=\"lineno\"> 1419</span>&#160;<span class=\"comment\"># The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that</span></div>\n<div class=\"line\"><a name=\"l01420\"></a><span class=\"lineno\"> 1420</span>&#160;<span class=\"comment\"># doxygen will group on one line in the generated HTML documentation.</span></div>\n<div class=\"line\"><a name=\"l01421\"></a><span class=\"lineno\"> 1421</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01422\"></a><span class=\"lineno\"> 1422</span>&#160;<span class=\"comment\"># Note that a value of 0 will completely suppress the enum values from appearing</span></div>\n<div class=\"line\"><a name=\"l01423\"></a><span class=\"lineno\"> 1423</span>&#160;<span class=\"comment\"># in the overview section.</span></div>\n<div class=\"line\"><a name=\"l01424\"></a><span class=\"lineno\"> 1424</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 20, default value: 4.</span></div>\n<div class=\"line\"><a name=\"l01425\"></a><span class=\"lineno\"> 1425</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01426\"></a><span class=\"lineno\"> 1426</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01427\"></a><span class=\"lineno\"> 1427</span>&#160;<span class=\"comment\">ENUM_VALUES_PER_LINE   = 4</span></div>\n<div class=\"line\"><a name=\"l01428\"></a><span class=\"lineno\"> 1428</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01429\"></a><span class=\"lineno\"> 1429</span>&#160;<span class=\"comment\"># If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used</span></div>\n<div class=\"line\"><a name=\"l01430\"></a><span class=\"lineno\"> 1430</span>&#160;<span class=\"comment\"># to set the initial width (in pixels) of the frame in which the tree is shown.</span></div>\n<div class=\"line\"><a name=\"l01431\"></a><span class=\"lineno\"> 1431</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 1500, default value: 250.</span></div>\n<div class=\"line\"><a name=\"l01432\"></a><span class=\"lineno\"> 1432</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01433\"></a><span class=\"lineno\"> 1433</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01434\"></a><span class=\"lineno\"> 1434</span>&#160;<span class=\"comment\">TREEVIEW_WIDTH         = 250</span></div>\n<div class=\"line\"><a name=\"l01435\"></a><span class=\"lineno\"> 1435</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01436\"></a><span class=\"lineno\"> 1436</span>&#160;<span class=\"comment\"># If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to</span></div>\n<div class=\"line\"><a name=\"l01437\"></a><span class=\"lineno\"> 1437</span>&#160;<span class=\"comment\"># external symbols imported via tag files in a separate window.</span></div>\n<div class=\"line\"><a name=\"l01438\"></a><span class=\"lineno\"> 1438</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01439\"></a><span class=\"lineno\"> 1439</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01440\"></a><span class=\"lineno\"> 1440</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01441\"></a><span class=\"lineno\"> 1441</span>&#160;<span class=\"comment\">EXT_LINKS_IN_WINDOW    = NO</span></div>\n<div class=\"line\"><a name=\"l01442\"></a><span class=\"lineno\"> 1442</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01443\"></a><span class=\"lineno\"> 1443</span>&#160;<span class=\"comment\"># Use this tag to change the font size of LaTeX formulas included as images in</span></div>\n<div class=\"line\"><a name=\"l01444\"></a><span class=\"lineno\"> 1444</span>&#160;<span class=\"comment\"># the HTML documentation. When you change the font size after a successful</span></div>\n<div class=\"line\"><a name=\"l01445\"></a><span class=\"lineno\"> 1445</span>&#160;<span class=\"comment\"># doxygen run you need to manually remove any form_*.png images from the HTML</span></div>\n<div class=\"line\"><a name=\"l01446\"></a><span class=\"lineno\"> 1446</span>&#160;<span class=\"comment\"># output directory to force them to be regenerated.</span></div>\n<div class=\"line\"><a name=\"l01447\"></a><span class=\"lineno\"> 1447</span>&#160;<span class=\"comment\"># Minimum value: 8, maximum value: 50, default value: 10.</span></div>\n<div class=\"line\"><a name=\"l01448\"></a><span class=\"lineno\"> 1448</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01449\"></a><span class=\"lineno\"> 1449</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01450\"></a><span class=\"lineno\"> 1450</span>&#160;<span class=\"comment\">FORMULA_FONTSIZE       = 10</span></div>\n<div class=\"line\"><a name=\"l01451\"></a><span class=\"lineno\"> 1451</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01452\"></a><span class=\"lineno\"> 1452</span>&#160;<span class=\"comment\"># Use the FORMULA_TRANPARENT tag to determine whether or not the images</span></div>\n<div class=\"line\"><a name=\"l01453\"></a><span class=\"lineno\"> 1453</span>&#160;<span class=\"comment\"># generated for formulas are transparent PNGs. Transparent PNGs are not</span></div>\n<div class=\"line\"><a name=\"l01454\"></a><span class=\"lineno\"> 1454</span>&#160;<span class=\"comment\"># supported properly for IE 6.0, but are supported on all modern browsers.</span></div>\n<div class=\"line\"><a name=\"l01455\"></a><span class=\"lineno\"> 1455</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01456\"></a><span class=\"lineno\"> 1456</span>&#160;<span class=\"comment\"># Note that when changing this option you need to delete any form_*.png files in</span></div>\n<div class=\"line\"><a name=\"l01457\"></a><span class=\"lineno\"> 1457</span>&#160;<span class=\"comment\"># the HTML output directory before the changes have effect.</span></div>\n<div class=\"line\"><a name=\"l01458\"></a><span class=\"lineno\"> 1458</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01459\"></a><span class=\"lineno\"> 1459</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01460\"></a><span class=\"lineno\"> 1460</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01461\"></a><span class=\"lineno\"> 1461</span>&#160;<span class=\"comment\">FORMULA_TRANSPARENT    = YES</span></div>\n<div class=\"line\"><a name=\"l01462\"></a><span class=\"lineno\"> 1462</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01463\"></a><span class=\"lineno\"> 1463</span>&#160;<span class=\"comment\"># Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see</span></div>\n<div class=\"line\"><a name=\"l01464\"></a><span class=\"lineno\"> 1464</span>&#160;<span class=\"comment\"># http://www.mathjax.org) which uses client side Javascript for the rendering</span></div>\n<div class=\"line\"><a name=\"l01465\"></a><span class=\"lineno\"> 1465</span>&#160;<span class=\"comment\"># instead of using pre-rendered bitmaps. Use this if you do not have LaTeX</span></div>\n<div class=\"line\"><a name=\"l01466\"></a><span class=\"lineno\"> 1466</span>&#160;<span class=\"comment\"># installed or if you want to formulas look prettier in the HTML output. When</span></div>\n<div class=\"line\"><a name=\"l01467\"></a><span class=\"lineno\"> 1467</span>&#160;<span class=\"comment\"># enabled you may also need to install MathJax separately and configure the path</span></div>\n<div class=\"line\"><a name=\"l01468\"></a><span class=\"lineno\"> 1468</span>&#160;<span class=\"comment\"># to it using the MATHJAX_RELPATH option.</span></div>\n<div class=\"line\"><a name=\"l01469\"></a><span class=\"lineno\"> 1469</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01470\"></a><span class=\"lineno\"> 1470</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01471\"></a><span class=\"lineno\"> 1471</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01472\"></a><span class=\"lineno\"> 1472</span>&#160;<span class=\"comment\">USE_MATHJAX            = NO</span></div>\n<div class=\"line\"><a name=\"l01473\"></a><span class=\"lineno\"> 1473</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01474\"></a><span class=\"lineno\"> 1474</span>&#160;<span class=\"comment\"># When MathJax is enabled you can set the default output format to be used for</span></div>\n<div class=\"line\"><a name=\"l01475\"></a><span class=\"lineno\"> 1475</span>&#160;<span class=\"comment\"># the MathJax output. See the MathJax site (see:</span></div>\n<div class=\"line\"><a name=\"l01476\"></a><span class=\"lineno\"> 1476</span>&#160;<span class=\"comment\"># http://docs.mathjax.org/en/latest/output.html) for more details.</span></div>\n<div class=\"line\"><a name=\"l01477\"></a><span class=\"lineno\"> 1477</span>&#160;<span class=\"comment\"># Possible values are: HTML-CSS (which is slower, but has the best</span></div>\n<div class=\"line\"><a name=\"l01478\"></a><span class=\"lineno\"> 1478</span>&#160;<span class=\"comment\"># compatibility), NativeMML (i.e. MathML) and SVG.</span></div>\n<div class=\"line\"><a name=\"l01479\"></a><span class=\"lineno\"> 1479</span>&#160;<span class=\"comment\"># The default value is: HTML-CSS.</span></div>\n<div class=\"line\"><a name=\"l01480\"></a><span class=\"lineno\"> 1480</span>&#160;<span class=\"comment\"># This tag requires that the tag USE_MATHJAX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01481\"></a><span class=\"lineno\"> 1481</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01482\"></a><span class=\"lineno\"> 1482</span>&#160;<span class=\"comment\">MATHJAX_FORMAT         = HTML-CSS</span></div>\n<div class=\"line\"><a name=\"l01483\"></a><span class=\"lineno\"> 1483</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01484\"></a><span class=\"lineno\"> 1484</span>&#160;<span class=\"comment\"># When MathJax is enabled you need to specify the location relative to the HTML</span></div>\n<div class=\"line\"><a name=\"l01485\"></a><span class=\"lineno\"> 1485</span>&#160;<span class=\"comment\"># output directory using the MATHJAX_RELPATH option. The destination directory</span></div>\n<div class=\"line\"><a name=\"l01486\"></a><span class=\"lineno\"> 1486</span>&#160;<span class=\"comment\"># should contain the MathJax.js script. For instance, if the mathjax directory</span></div>\n<div class=\"line\"><a name=\"l01487\"></a><span class=\"lineno\"> 1487</span>&#160;<span class=\"comment\"># is located at the same level as the HTML output directory, then</span></div>\n<div class=\"line\"><a name=\"l01488\"></a><span class=\"lineno\"> 1488</span>&#160;<span class=\"comment\"># MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax</span></div>\n<div class=\"line\"><a name=\"l01489\"></a><span class=\"lineno\"> 1489</span>&#160;<span class=\"comment\"># Content Delivery Network so you can quickly see the result without installing</span></div>\n<div class=\"line\"><a name=\"l01490\"></a><span class=\"lineno\"> 1490</span>&#160;<span class=\"comment\"># MathJax. However, it is strongly recommended to install a local copy of</span></div>\n<div class=\"line\"><a name=\"l01491\"></a><span class=\"lineno\"> 1491</span>&#160;<span class=\"comment\"># MathJax from http://www.mathjax.org before deployment.</span></div>\n<div class=\"line\"><a name=\"l01492\"></a><span class=\"lineno\"> 1492</span>&#160;<span class=\"comment\"># The default value is: http://cdn.mathjax.org/mathjax/latest.</span></div>\n<div class=\"line\"><a name=\"l01493\"></a><span class=\"lineno\"> 1493</span>&#160;<span class=\"comment\"># This tag requires that the tag USE_MATHJAX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01494\"></a><span class=\"lineno\"> 1494</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01495\"></a><span class=\"lineno\"> 1495</span>&#160;<span class=\"comment\">MATHJAX_RELPATH        = http://www.mathjax.org/mathjax</span></div>\n<div class=\"line\"><a name=\"l01496\"></a><span class=\"lineno\"> 1496</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01497\"></a><span class=\"lineno\"> 1497</span>&#160;<span class=\"comment\"># The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax</span></div>\n<div class=\"line\"><a name=\"l01498\"></a><span class=\"lineno\"> 1498</span>&#160;<span class=\"comment\"># extension names that should be enabled during MathJax rendering. For example</span></div>\n<div class=\"line\"><a name=\"l01499\"></a><span class=\"lineno\"> 1499</span>&#160;<span class=\"comment\"># MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols</span></div>\n<div class=\"line\"><a name=\"l01500\"></a><span class=\"lineno\"> 1500</span>&#160;<span class=\"comment\"># This tag requires that the tag USE_MATHJAX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01501\"></a><span class=\"lineno\"> 1501</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01502\"></a><span class=\"lineno\"> 1502</span>&#160;<span class=\"comment\">MATHJAX_EXTENSIONS     = </span></div>\n<div class=\"line\"><a name=\"l01503\"></a><span class=\"lineno\"> 1503</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01504\"></a><span class=\"lineno\"> 1504</span>&#160;<span class=\"comment\"># The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces</span></div>\n<div class=\"line\"><a name=\"l01505\"></a><span class=\"lineno\"> 1505</span>&#160;<span class=\"comment\"># of code that will be used on startup of the MathJax code. See the MathJax site</span></div>\n<div class=\"line\"><a name=\"l01506\"></a><span class=\"lineno\"> 1506</span>&#160;<span class=\"comment\"># (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an</span></div>\n<div class=\"line\"><a name=\"l01507\"></a><span class=\"lineno\"> 1507</span>&#160;<span class=\"comment\"># example see the documentation.</span></div>\n<div class=\"line\"><a name=\"l01508\"></a><span class=\"lineno\"> 1508</span>&#160;<span class=\"comment\"># This tag requires that the tag USE_MATHJAX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01509\"></a><span class=\"lineno\"> 1509</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01510\"></a><span class=\"lineno\"> 1510</span>&#160;<span class=\"comment\">MATHJAX_CODEFILE       = </span></div>\n<div class=\"line\"><a name=\"l01511\"></a><span class=\"lineno\"> 1511</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01512\"></a><span class=\"lineno\"> 1512</span>&#160;<span class=\"comment\"># When the SEARCHENGINE tag is enabled doxygen will generate a search box for</span></div>\n<div class=\"line\"><a name=\"l01513\"></a><span class=\"lineno\"> 1513</span>&#160;<span class=\"comment\"># the HTML output. The underlying search engine uses javascript and DHTML and</span></div>\n<div class=\"line\"><a name=\"l01514\"></a><span class=\"lineno\"> 1514</span>&#160;<span class=\"comment\"># should work on any modern browser. Note that when using HTML help</span></div>\n<div class=\"line\"><a name=\"l01515\"></a><span class=\"lineno\"> 1515</span>&#160;<span class=\"comment\"># (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)</span></div>\n<div class=\"line\"><a name=\"l01516\"></a><span class=\"lineno\"> 1516</span>&#160;<span class=\"comment\"># there is already a search function so this one should typically be disabled.</span></div>\n<div class=\"line\"><a name=\"l01517\"></a><span class=\"lineno\"> 1517</span>&#160;<span class=\"comment\"># For large projects the javascript based search engine can be slow, then</span></div>\n<div class=\"line\"><a name=\"l01518\"></a><span class=\"lineno\"> 1518</span>&#160;<span class=\"comment\"># enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to</span></div>\n<div class=\"line\"><a name=\"l01519\"></a><span class=\"lineno\"> 1519</span>&#160;<span class=\"comment\"># search using the keyboard; to jump to the search box use &lt;access key&gt; + S</span></div>\n<div class=\"line\"><a name=\"l01520\"></a><span class=\"lineno\"> 1520</span>&#160;<span class=\"comment\"># (what the &lt;access key&gt; is depends on the OS and browser, but it is typically</span></div>\n<div class=\"line\"><a name=\"l01521\"></a><span class=\"lineno\"> 1521</span>&#160;<span class=\"comment\"># &lt;CTRL&gt;, &lt;ALT&gt;/&lt;option&gt;, or both). Inside the search box use the &lt;cursor down</span></div>\n<div class=\"line\"><a name=\"l01522\"></a><span class=\"lineno\"> 1522</span>&#160;<span class=\"comment\"># key&gt; to jump into the search results window, the results can be navigated</span></div>\n<div class=\"line\"><a name=\"l01523\"></a><span class=\"lineno\"> 1523</span>&#160;<span class=\"comment\"># using the &lt;cursor keys&gt;. Press &lt;Enter&gt; to select an item or &lt;escape&gt; to cancel</span></div>\n<div class=\"line\"><a name=\"l01524\"></a><span class=\"lineno\"> 1524</span>&#160;<span class=\"comment\"># the search. The filter options can be selected when the cursor is inside the</span></div>\n<div class=\"line\"><a name=\"l01525\"></a><span class=\"lineno\"> 1525</span>&#160;<span class=\"comment\"># search box by pressing &lt;Shift&gt;+&lt;cursor down&gt;. Also here use the &lt;cursor keys&gt;</span></div>\n<div class=\"line\"><a name=\"l01526\"></a><span class=\"lineno\"> 1526</span>&#160;<span class=\"comment\"># to select a filter and &lt;Enter&gt; or &lt;escape&gt; to activate or cancel the filter</span></div>\n<div class=\"line\"><a name=\"l01527\"></a><span class=\"lineno\"> 1527</span>&#160;<span class=\"comment\"># option.</span></div>\n<div class=\"line\"><a name=\"l01528\"></a><span class=\"lineno\"> 1528</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01529\"></a><span class=\"lineno\"> 1529</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_HTML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01530\"></a><span class=\"lineno\"> 1530</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01531\"></a><span class=\"lineno\"> 1531</span>&#160;<span class=\"comment\">SEARCHENGINE           = YES</span></div>\n<div class=\"line\"><a name=\"l01532\"></a><span class=\"lineno\"> 1532</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01533\"></a><span class=\"lineno\"> 1533</span>&#160;<span class=\"comment\"># When the SERVER_BASED_SEARCH tag is enabled the search engine will be</span></div>\n<div class=\"line\"><a name=\"l01534\"></a><span class=\"lineno\"> 1534</span>&#160;<span class=\"comment\"># implemented using a web server instead of a web client using Javascript. There</span></div>\n<div class=\"line\"><a name=\"l01535\"></a><span class=\"lineno\"> 1535</span>&#160;<span class=\"comment\"># are two flavors of web server based searching depending on the EXTERNAL_SEARCH</span></div>\n<div class=\"line\"><a name=\"l01536\"></a><span class=\"lineno\"> 1536</span>&#160;<span class=\"comment\"># setting. When disabled, doxygen will generate a PHP script for searching and</span></div>\n<div class=\"line\"><a name=\"l01537\"></a><span class=\"lineno\"> 1537</span>&#160;<span class=\"comment\"># an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing</span></div>\n<div class=\"line\"><a name=\"l01538\"></a><span class=\"lineno\"> 1538</span>&#160;<span class=\"comment\"># and searching needs to be provided by external tools. See the section</span></div>\n<div class=\"line\"><a name=\"l01539\"></a><span class=\"lineno\"> 1539</span>&#160;<span class=\"comment\"># &quot;External Indexing and Searching&quot; for details.</span></div>\n<div class=\"line\"><a name=\"l01540\"></a><span class=\"lineno\"> 1540</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01541\"></a><span class=\"lineno\"> 1541</span>&#160;<span class=\"comment\"># This tag requires that the tag SEARCHENGINE is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01542\"></a><span class=\"lineno\"> 1542</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01543\"></a><span class=\"lineno\"> 1543</span>&#160;<span class=\"comment\">SERVER_BASED_SEARCH    = NO</span></div>\n<div class=\"line\"><a name=\"l01544\"></a><span class=\"lineno\"> 1544</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01545\"></a><span class=\"lineno\"> 1545</span>&#160;<span class=\"comment\"># When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP</span></div>\n<div class=\"line\"><a name=\"l01546\"></a><span class=\"lineno\"> 1546</span>&#160;<span class=\"comment\"># script for searching. Instead the search results are written to an XML file</span></div>\n<div class=\"line\"><a name=\"l01547\"></a><span class=\"lineno\"> 1547</span>&#160;<span class=\"comment\"># which needs to be processed by an external indexer. Doxygen will invoke an</span></div>\n<div class=\"line\"><a name=\"l01548\"></a><span class=\"lineno\"> 1548</span>&#160;<span class=\"comment\"># external search engine pointed to by the SEARCHENGINE_URL option to obtain the</span></div>\n<div class=\"line\"><a name=\"l01549\"></a><span class=\"lineno\"> 1549</span>&#160;<span class=\"comment\"># search results.</span></div>\n<div class=\"line\"><a name=\"l01550\"></a><span class=\"lineno\"> 1550</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01551\"></a><span class=\"lineno\"> 1551</span>&#160;<span class=\"comment\"># Doxygen ships with an example indexer (doxyindexer) and search engine</span></div>\n<div class=\"line\"><a name=\"l01552\"></a><span class=\"lineno\"> 1552</span>&#160;<span class=\"comment\"># (doxysearch.cgi) which are based on the open source search engine library</span></div>\n<div class=\"line\"><a name=\"l01553\"></a><span class=\"lineno\"> 1553</span>&#160;<span class=\"comment\"># Xapian (see: http://xapian.org/).</span></div>\n<div class=\"line\"><a name=\"l01554\"></a><span class=\"lineno\"> 1554</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01555\"></a><span class=\"lineno\"> 1555</span>&#160;<span class=\"comment\"># See the section &quot;External Indexing and Searching&quot; for details.</span></div>\n<div class=\"line\"><a name=\"l01556\"></a><span class=\"lineno\"> 1556</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01557\"></a><span class=\"lineno\"> 1557</span>&#160;<span class=\"comment\"># This tag requires that the tag SEARCHENGINE is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01558\"></a><span class=\"lineno\"> 1558</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01559\"></a><span class=\"lineno\"> 1559</span>&#160;<span class=\"comment\">EXTERNAL_SEARCH        = NO</span></div>\n<div class=\"line\"><a name=\"l01560\"></a><span class=\"lineno\"> 1560</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01561\"></a><span class=\"lineno\"> 1561</span>&#160;<span class=\"comment\"># The SEARCHENGINE_URL should point to a search engine hosted by a web server</span></div>\n<div class=\"line\"><a name=\"l01562\"></a><span class=\"lineno\"> 1562</span>&#160;<span class=\"comment\"># which will return the search results when EXTERNAL_SEARCH is enabled.</span></div>\n<div class=\"line\"><a name=\"l01563\"></a><span class=\"lineno\"> 1563</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01564\"></a><span class=\"lineno\"> 1564</span>&#160;<span class=\"comment\"># Doxygen ships with an example indexer (doxyindexer) and search engine</span></div>\n<div class=\"line\"><a name=\"l01565\"></a><span class=\"lineno\"> 1565</span>&#160;<span class=\"comment\"># (doxysearch.cgi) which are based on the open source search engine library</span></div>\n<div class=\"line\"><a name=\"l01566\"></a><span class=\"lineno\"> 1566</span>&#160;<span class=\"comment\"># Xapian (see: http://xapian.org/). See the section &quot;External Indexing and</span></div>\n<div class=\"line\"><a name=\"l01567\"></a><span class=\"lineno\"> 1567</span>&#160;<span class=\"comment\"># Searching&quot; for details.</span></div>\n<div class=\"line\"><a name=\"l01568\"></a><span class=\"lineno\"> 1568</span>&#160;<span class=\"comment\"># This tag requires that the tag SEARCHENGINE is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01569\"></a><span class=\"lineno\"> 1569</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01570\"></a><span class=\"lineno\"> 1570</span>&#160;<span class=\"comment\">SEARCHENGINE_URL       = </span></div>\n<div class=\"line\"><a name=\"l01571\"></a><span class=\"lineno\"> 1571</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01572\"></a><span class=\"lineno\"> 1572</span>&#160;<span class=\"comment\"># When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed</span></div>\n<div class=\"line\"><a name=\"l01573\"></a><span class=\"lineno\"> 1573</span>&#160;<span class=\"comment\"># search data is written to a file for indexing by an external tool. With the</span></div>\n<div class=\"line\"><a name=\"l01574\"></a><span class=\"lineno\"> 1574</span>&#160;<span class=\"comment\"># SEARCHDATA_FILE tag the name of this file can be specified.</span></div>\n<div class=\"line\"><a name=\"l01575\"></a><span class=\"lineno\"> 1575</span>&#160;<span class=\"comment\"># The default file is: searchdata.xml.</span></div>\n<div class=\"line\"><a name=\"l01576\"></a><span class=\"lineno\"> 1576</span>&#160;<span class=\"comment\"># This tag requires that the tag SEARCHENGINE is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01577\"></a><span class=\"lineno\"> 1577</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01578\"></a><span class=\"lineno\"> 1578</span>&#160;<span class=\"comment\">SEARCHDATA_FILE        = searchdata.xml</span></div>\n<div class=\"line\"><a name=\"l01579\"></a><span class=\"lineno\"> 1579</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01580\"></a><span class=\"lineno\"> 1580</span>&#160;<span class=\"comment\"># When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the</span></div>\n<div class=\"line\"><a name=\"l01581\"></a><span class=\"lineno\"> 1581</span>&#160;<span class=\"comment\"># EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is</span></div>\n<div class=\"line\"><a name=\"l01582\"></a><span class=\"lineno\"> 1582</span>&#160;<span class=\"comment\"># useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple</span></div>\n<div class=\"line\"><a name=\"l01583\"></a><span class=\"lineno\"> 1583</span>&#160;<span class=\"comment\"># projects and redirect the results back to the right project.</span></div>\n<div class=\"line\"><a name=\"l01584\"></a><span class=\"lineno\"> 1584</span>&#160;<span class=\"comment\"># This tag requires that the tag SEARCHENGINE is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01585\"></a><span class=\"lineno\"> 1585</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01586\"></a><span class=\"lineno\"> 1586</span>&#160;<span class=\"comment\">EXTERNAL_SEARCH_ID     = </span></div>\n<div class=\"line\"><a name=\"l01587\"></a><span class=\"lineno\"> 1587</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01588\"></a><span class=\"lineno\"> 1588</span>&#160;<span class=\"comment\"># The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen</span></div>\n<div class=\"line\"><a name=\"l01589\"></a><span class=\"lineno\"> 1589</span>&#160;<span class=\"comment\"># projects other than the one defined by this configuration file, but that are</span></div>\n<div class=\"line\"><a name=\"l01590\"></a><span class=\"lineno\"> 1590</span>&#160;<span class=\"comment\"># all added to the same external search index. Each project needs to have a</span></div>\n<div class=\"line\"><a name=\"l01591\"></a><span class=\"lineno\"> 1591</span>&#160;<span class=\"comment\"># unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of</span></div>\n<div class=\"line\"><a name=\"l01592\"></a><span class=\"lineno\"> 1592</span>&#160;<span class=\"comment\"># to a relative location where the documentation can be found. The format is:</span></div>\n<div class=\"line\"><a name=\"l01593\"></a><span class=\"lineno\"> 1593</span>&#160;<span class=\"comment\"># EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...</span></div>\n<div class=\"line\"><a name=\"l01594\"></a><span class=\"lineno\"> 1594</span>&#160;<span class=\"comment\"># This tag requires that the tag SEARCHENGINE is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01595\"></a><span class=\"lineno\"> 1595</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01596\"></a><span class=\"lineno\"> 1596</span>&#160;<span class=\"comment\">EXTRA_SEARCH_MAPPINGS  = </span></div>\n<div class=\"line\"><a name=\"l01597\"></a><span class=\"lineno\"> 1597</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01598\"></a><span class=\"lineno\"> 1598</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01599\"></a><span class=\"lineno\"> 1599</span>&#160;<span class=\"comment\"># Configuration options related to the LaTeX output</span></div>\n<div class=\"line\"><a name=\"l01600\"></a><span class=\"lineno\"> 1600</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01601\"></a><span class=\"lineno\"> 1601</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01602\"></a><span class=\"lineno\"> 1602</span>&#160;<span class=\"comment\"># If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.</span></div>\n<div class=\"line\"><a name=\"l01603\"></a><span class=\"lineno\"> 1603</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01604\"></a><span class=\"lineno\"> 1604</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01605\"></a><span class=\"lineno\"> 1605</span>&#160;<span class=\"comment\">GENERATE_LATEX         = NO</span></div>\n<div class=\"line\"><a name=\"l01606\"></a><span class=\"lineno\"> 1606</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01607\"></a><span class=\"lineno\"> 1607</span>&#160;<span class=\"comment\"># The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a</span></div>\n<div class=\"line\"><a name=\"l01608\"></a><span class=\"lineno\"> 1608</span>&#160;<span class=\"comment\"># relative path is entered the value of OUTPUT_DIRECTORY will be put in front of</span></div>\n<div class=\"line\"><a name=\"l01609\"></a><span class=\"lineno\"> 1609</span>&#160;<span class=\"comment\"># it.</span></div>\n<div class=\"line\"><a name=\"l01610\"></a><span class=\"lineno\"> 1610</span>&#160;<span class=\"comment\"># The default directory is: latex.</span></div>\n<div class=\"line\"><a name=\"l01611\"></a><span class=\"lineno\"> 1611</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01612\"></a><span class=\"lineno\"> 1612</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01613\"></a><span class=\"lineno\"> 1613</span>&#160;<span class=\"comment\">LATEX_OUTPUT           = latex</span></div>\n<div class=\"line\"><a name=\"l01614\"></a><span class=\"lineno\"> 1614</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01615\"></a><span class=\"lineno\"> 1615</span>&#160;<span class=\"comment\"># The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be</span></div>\n<div class=\"line\"><a name=\"l01616\"></a><span class=\"lineno\"> 1616</span>&#160;<span class=\"comment\"># invoked.</span></div>\n<div class=\"line\"><a name=\"l01617\"></a><span class=\"lineno\"> 1617</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01618\"></a><span class=\"lineno\"> 1618</span>&#160;<span class=\"comment\"># Note that when enabling USE_PDFLATEX this option is only used for generating</span></div>\n<div class=\"line\"><a name=\"l01619\"></a><span class=\"lineno\"> 1619</span>&#160;<span class=\"comment\"># bitmaps for formulas in the HTML output, but not in the Makefile that is</span></div>\n<div class=\"line\"><a name=\"l01620\"></a><span class=\"lineno\"> 1620</span>&#160;<span class=\"comment\"># written to the output directory.</span></div>\n<div class=\"line\"><a name=\"l01621\"></a><span class=\"lineno\"> 1621</span>&#160;<span class=\"comment\"># The default file is: latex.</span></div>\n<div class=\"line\"><a name=\"l01622\"></a><span class=\"lineno\"> 1622</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01623\"></a><span class=\"lineno\"> 1623</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01624\"></a><span class=\"lineno\"> 1624</span>&#160;<span class=\"comment\">LATEX_CMD_NAME         = latex</span></div>\n<div class=\"line\"><a name=\"l01625\"></a><span class=\"lineno\"> 1625</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01626\"></a><span class=\"lineno\"> 1626</span>&#160;<span class=\"comment\"># The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate</span></div>\n<div class=\"line\"><a name=\"l01627\"></a><span class=\"lineno\"> 1627</span>&#160;<span class=\"comment\"># index for LaTeX.</span></div>\n<div class=\"line\"><a name=\"l01628\"></a><span class=\"lineno\"> 1628</span>&#160;<span class=\"comment\"># The default file is: makeindex.</span></div>\n<div class=\"line\"><a name=\"l01629\"></a><span class=\"lineno\"> 1629</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01630\"></a><span class=\"lineno\"> 1630</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01631\"></a><span class=\"lineno\"> 1631</span>&#160;<span class=\"comment\">MAKEINDEX_CMD_NAME     = makeindex</span></div>\n<div class=\"line\"><a name=\"l01632\"></a><span class=\"lineno\"> 1632</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01633\"></a><span class=\"lineno\"> 1633</span>&#160;<span class=\"comment\"># If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX</span></div>\n<div class=\"line\"><a name=\"l01634\"></a><span class=\"lineno\"> 1634</span>&#160;<span class=\"comment\"># documents. This may be useful for small projects and may help to save some</span></div>\n<div class=\"line\"><a name=\"l01635\"></a><span class=\"lineno\"> 1635</span>&#160;<span class=\"comment\"># trees in general.</span></div>\n<div class=\"line\"><a name=\"l01636\"></a><span class=\"lineno\"> 1636</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01637\"></a><span class=\"lineno\"> 1637</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01638\"></a><span class=\"lineno\"> 1638</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01639\"></a><span class=\"lineno\"> 1639</span>&#160;<span class=\"comment\">COMPACT_LATEX          = NO</span></div>\n<div class=\"line\"><a name=\"l01640\"></a><span class=\"lineno\"> 1640</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01641\"></a><span class=\"lineno\"> 1641</span>&#160;<span class=\"comment\"># The PAPER_TYPE tag can be used to set the paper type that is used by the</span></div>\n<div class=\"line\"><a name=\"l01642\"></a><span class=\"lineno\"> 1642</span>&#160;<span class=\"comment\"># printer.</span></div>\n<div class=\"line\"><a name=\"l01643\"></a><span class=\"lineno\"> 1643</span>&#160;<span class=\"comment\"># Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x</span></div>\n<div class=\"line\"><a name=\"l01644\"></a><span class=\"lineno\"> 1644</span>&#160;<span class=\"comment\"># 14 inches) and executive (7.25 x 10.5 inches).</span></div>\n<div class=\"line\"><a name=\"l01645\"></a><span class=\"lineno\"> 1645</span>&#160;<span class=\"comment\"># The default value is: a4.</span></div>\n<div class=\"line\"><a name=\"l01646\"></a><span class=\"lineno\"> 1646</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01647\"></a><span class=\"lineno\"> 1647</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01648\"></a><span class=\"lineno\"> 1648</span>&#160;<span class=\"comment\">PAPER_TYPE             = a4wide</span></div>\n<div class=\"line\"><a name=\"l01649\"></a><span class=\"lineno\"> 1649</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01650\"></a><span class=\"lineno\"> 1650</span>&#160;<span class=\"comment\"># The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names</span></div>\n<div class=\"line\"><a name=\"l01651\"></a><span class=\"lineno\"> 1651</span>&#160;<span class=\"comment\"># that should be included in the LaTeX output. The package can be specified just</span></div>\n<div class=\"line\"><a name=\"l01652\"></a><span class=\"lineno\"> 1652</span>&#160;<span class=\"comment\"># by its name or with the correct syntax as to be used with the LaTeX</span></div>\n<div class=\"line\"><a name=\"l01653\"></a><span class=\"lineno\"> 1653</span>&#160;<span class=\"comment\"># \\usepackage command. To get the times font for instance you can specify :</span></div>\n<div class=\"line\"><a name=\"l01654\"></a><span class=\"lineno\"> 1654</span>&#160;<span class=\"comment\"># EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}</span></div>\n<div class=\"line\"><a name=\"l01655\"></a><span class=\"lineno\"> 1655</span>&#160;<span class=\"comment\"># To use the option intlimits with the amsmath package you can specify:</span></div>\n<div class=\"line\"><a name=\"l01656\"></a><span class=\"lineno\"> 1656</span>&#160;<span class=\"comment\"># EXTRA_PACKAGES=[intlimits]{amsmath}</span></div>\n<div class=\"line\"><a name=\"l01657\"></a><span class=\"lineno\"> 1657</span>&#160;<span class=\"comment\"># If left blank no extra packages will be included.</span></div>\n<div class=\"line\"><a name=\"l01658\"></a><span class=\"lineno\"> 1658</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01659\"></a><span class=\"lineno\"> 1659</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01660\"></a><span class=\"lineno\"> 1660</span>&#160;<span class=\"comment\">EXTRA_PACKAGES         = </span></div>\n<div class=\"line\"><a name=\"l01661\"></a><span class=\"lineno\"> 1661</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01662\"></a><span class=\"lineno\"> 1662</span>&#160;<span class=\"comment\"># The LATEX_HEADER tag can be used to specify a personal LaTeX header for the</span></div>\n<div class=\"line\"><a name=\"l01663\"></a><span class=\"lineno\"> 1663</span>&#160;<span class=\"comment\"># generated LaTeX document. The header should contain everything until the first</span></div>\n<div class=\"line\"><a name=\"l01664\"></a><span class=\"lineno\"> 1664</span>&#160;<span class=\"comment\"># chapter. If it is left blank doxygen will generate a standard header. See</span></div>\n<div class=\"line\"><a name=\"l01665\"></a><span class=\"lineno\"> 1665</span>&#160;<span class=\"comment\"># section &quot;Doxygen usage&quot; for information on how to let doxygen write the</span></div>\n<div class=\"line\"><a name=\"l01666\"></a><span class=\"lineno\"> 1666</span>&#160;<span class=\"comment\"># default header to a separate file.</span></div>\n<div class=\"line\"><a name=\"l01667\"></a><span class=\"lineno\"> 1667</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01668\"></a><span class=\"lineno\"> 1668</span>&#160;<span class=\"comment\"># Note: Only use a user-defined header if you know what you are doing! The</span></div>\n<div class=\"line\"><a name=\"l01669\"></a><span class=\"lineno\"> 1669</span>&#160;<span class=\"comment\"># following commands have a special meaning inside the header: $title,</span></div>\n<div class=\"line\"><a name=\"l01670\"></a><span class=\"lineno\"> 1670</span>&#160;<span class=\"comment\"># $datetime, $date, $doxygenversion, $projectname, $projectnumber,</span></div>\n<div class=\"line\"><a name=\"l01671\"></a><span class=\"lineno\"> 1671</span>&#160;<span class=\"comment\"># $projectbrief, $projectlogo. Doxygen will replace $title with the empty</span></div>\n<div class=\"line\"><a name=\"l01672\"></a><span class=\"lineno\"> 1672</span>&#160;<span class=\"comment\"># string, for the replacement values of the other commands the user is referred</span></div>\n<div class=\"line\"><a name=\"l01673\"></a><span class=\"lineno\"> 1673</span>&#160;<span class=\"comment\"># to HTML_HEADER.</span></div>\n<div class=\"line\"><a name=\"l01674\"></a><span class=\"lineno\"> 1674</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01675\"></a><span class=\"lineno\"> 1675</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01676\"></a><span class=\"lineno\"> 1676</span>&#160;<span class=\"comment\">LATEX_HEADER           = </span></div>\n<div class=\"line\"><a name=\"l01677\"></a><span class=\"lineno\"> 1677</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01678\"></a><span class=\"lineno\"> 1678</span>&#160;<span class=\"comment\"># The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the</span></div>\n<div class=\"line\"><a name=\"l01679\"></a><span class=\"lineno\"> 1679</span>&#160;<span class=\"comment\"># generated LaTeX document. The footer should contain everything after the last</span></div>\n<div class=\"line\"><a name=\"l01680\"></a><span class=\"lineno\"> 1680</span>&#160;<span class=\"comment\"># chapter. If it is left blank doxygen will generate a standard footer. See</span></div>\n<div class=\"line\"><a name=\"l01681\"></a><span class=\"lineno\"> 1681</span>&#160;<span class=\"comment\"># LATEX_HEADER for more information on how to generate a default footer and what</span></div>\n<div class=\"line\"><a name=\"l01682\"></a><span class=\"lineno\"> 1682</span>&#160;<span class=\"comment\"># special commands can be used inside the footer.</span></div>\n<div class=\"line\"><a name=\"l01683\"></a><span class=\"lineno\"> 1683</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01684\"></a><span class=\"lineno\"> 1684</span>&#160;<span class=\"comment\"># Note: Only use a user-defined footer if you know what you are doing!</span></div>\n<div class=\"line\"><a name=\"l01685\"></a><span class=\"lineno\"> 1685</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01686\"></a><span class=\"lineno\"> 1686</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01687\"></a><span class=\"lineno\"> 1687</span>&#160;<span class=\"comment\">LATEX_FOOTER           = </span></div>\n<div class=\"line\"><a name=\"l01688\"></a><span class=\"lineno\"> 1688</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01689\"></a><span class=\"lineno\"> 1689</span>&#160;<span class=\"comment\"># The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined</span></div>\n<div class=\"line\"><a name=\"l01690\"></a><span class=\"lineno\"> 1690</span>&#160;<span class=\"comment\"># LaTeX style sheets that are included after the standard style sheets created</span></div>\n<div class=\"line\"><a name=\"l01691\"></a><span class=\"lineno\"> 1691</span>&#160;<span class=\"comment\"># by doxygen. Using this option one can overrule certain style aspects. Doxygen</span></div>\n<div class=\"line\"><a name=\"l01692\"></a><span class=\"lineno\"> 1692</span>&#160;<span class=\"comment\"># will copy the style sheet files to the output directory.</span></div>\n<div class=\"line\"><a name=\"l01693\"></a><span class=\"lineno\"> 1693</span>&#160;<span class=\"comment\"># Note: The order of the extra style sheet files is of importance (e.g. the last</span></div>\n<div class=\"line\"><a name=\"l01694\"></a><span class=\"lineno\"> 1694</span>&#160;<span class=\"comment\"># style sheet in the list overrules the setting of the previous ones in the</span></div>\n<div class=\"line\"><a name=\"l01695\"></a><span class=\"lineno\"> 1695</span>&#160;<span class=\"comment\"># list).</span></div>\n<div class=\"line\"><a name=\"l01696\"></a><span class=\"lineno\"> 1696</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01697\"></a><span class=\"lineno\"> 1697</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01698\"></a><span class=\"lineno\"> 1698</span>&#160;<span class=\"comment\">LATEX_EXTRA_STYLESHEET = </span></div>\n<div class=\"line\"><a name=\"l01699\"></a><span class=\"lineno\"> 1699</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01700\"></a><span class=\"lineno\"> 1700</span>&#160;<span class=\"comment\"># The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or</span></div>\n<div class=\"line\"><a name=\"l01701\"></a><span class=\"lineno\"> 1701</span>&#160;<span class=\"comment\"># other source files which should be copied to the LATEX_OUTPUT output</span></div>\n<div class=\"line\"><a name=\"l01702\"></a><span class=\"lineno\"> 1702</span>&#160;<span class=\"comment\"># directory. Note that the files will be copied as-is; there are no commands or</span></div>\n<div class=\"line\"><a name=\"l01703\"></a><span class=\"lineno\"> 1703</span>&#160;<span class=\"comment\"># markers available.</span></div>\n<div class=\"line\"><a name=\"l01704\"></a><span class=\"lineno\"> 1704</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01705\"></a><span class=\"lineno\"> 1705</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01706\"></a><span class=\"lineno\"> 1706</span>&#160;<span class=\"comment\">LATEX_EXTRA_FILES      = </span></div>\n<div class=\"line\"><a name=\"l01707\"></a><span class=\"lineno\"> 1707</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01708\"></a><span class=\"lineno\"> 1708</span>&#160;<span class=\"comment\"># If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is</span></div>\n<div class=\"line\"><a name=\"l01709\"></a><span class=\"lineno\"> 1709</span>&#160;<span class=\"comment\"># prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will</span></div>\n<div class=\"line\"><a name=\"l01710\"></a><span class=\"lineno\"> 1710</span>&#160;<span class=\"comment\"># contain links (just like the HTML output) instead of page references. This</span></div>\n<div class=\"line\"><a name=\"l01711\"></a><span class=\"lineno\"> 1711</span>&#160;<span class=\"comment\"># makes the output suitable for online browsing using a PDF viewer.</span></div>\n<div class=\"line\"><a name=\"l01712\"></a><span class=\"lineno\"> 1712</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01713\"></a><span class=\"lineno\"> 1713</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01714\"></a><span class=\"lineno\"> 1714</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01715\"></a><span class=\"lineno\"> 1715</span>&#160;<span class=\"comment\">PDF_HYPERLINKS         = NO</span></div>\n<div class=\"line\"><a name=\"l01716\"></a><span class=\"lineno\"> 1716</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01717\"></a><span class=\"lineno\"> 1717</span>&#160;<span class=\"comment\"># If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate</span></div>\n<div class=\"line\"><a name=\"l01718\"></a><span class=\"lineno\"> 1718</span>&#160;<span class=\"comment\"># the PDF file directly from the LaTeX files. Set this option to YES, to get a</span></div>\n<div class=\"line\"><a name=\"l01719\"></a><span class=\"lineno\"> 1719</span>&#160;<span class=\"comment\"># higher quality PDF documentation.</span></div>\n<div class=\"line\"><a name=\"l01720\"></a><span class=\"lineno\"> 1720</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01721\"></a><span class=\"lineno\"> 1721</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01722\"></a><span class=\"lineno\"> 1722</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01723\"></a><span class=\"lineno\"> 1723</span>&#160;<span class=\"comment\">USE_PDFLATEX           = YES</span></div>\n<div class=\"line\"><a name=\"l01724\"></a><span class=\"lineno\"> 1724</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01725\"></a><span class=\"lineno\"> 1725</span>&#160;<span class=\"comment\"># If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode</span></div>\n<div class=\"line\"><a name=\"l01726\"></a><span class=\"lineno\"> 1726</span>&#160;<span class=\"comment\"># command to the generated LaTeX files. This will instruct LaTeX to keep running</span></div>\n<div class=\"line\"><a name=\"l01727\"></a><span class=\"lineno\"> 1727</span>&#160;<span class=\"comment\"># if errors occur, instead of asking the user for help. This option is also used</span></div>\n<div class=\"line\"><a name=\"l01728\"></a><span class=\"lineno\"> 1728</span>&#160;<span class=\"comment\"># when generating formulas in HTML.</span></div>\n<div class=\"line\"><a name=\"l01729\"></a><span class=\"lineno\"> 1729</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01730\"></a><span class=\"lineno\"> 1730</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01731\"></a><span class=\"lineno\"> 1731</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01732\"></a><span class=\"lineno\"> 1732</span>&#160;<span class=\"comment\">LATEX_BATCHMODE        = NO</span></div>\n<div class=\"line\"><a name=\"l01733\"></a><span class=\"lineno\"> 1733</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01734\"></a><span class=\"lineno\"> 1734</span>&#160;<span class=\"comment\"># If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the</span></div>\n<div class=\"line\"><a name=\"l01735\"></a><span class=\"lineno\"> 1735</span>&#160;<span class=\"comment\"># index chapters (such as File Index, Compound Index, etc.) in the output.</span></div>\n<div class=\"line\"><a name=\"l01736\"></a><span class=\"lineno\"> 1736</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01737\"></a><span class=\"lineno\"> 1737</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01738\"></a><span class=\"lineno\"> 1738</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01739\"></a><span class=\"lineno\"> 1739</span>&#160;<span class=\"comment\">LATEX_HIDE_INDICES     = NO</span></div>\n<div class=\"line\"><a name=\"l01740\"></a><span class=\"lineno\"> 1740</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01741\"></a><span class=\"lineno\"> 1741</span>&#160;<span class=\"comment\"># If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source</span></div>\n<div class=\"line\"><a name=\"l01742\"></a><span class=\"lineno\"> 1742</span>&#160;<span class=\"comment\"># code with syntax highlighting in the LaTeX output.</span></div>\n<div class=\"line\"><a name=\"l01743\"></a><span class=\"lineno\"> 1743</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01744\"></a><span class=\"lineno\"> 1744</span>&#160;<span class=\"comment\"># Note that which sources are shown also depends on other settings such as</span></div>\n<div class=\"line\"><a name=\"l01745\"></a><span class=\"lineno\"> 1745</span>&#160;<span class=\"comment\"># SOURCE_BROWSER.</span></div>\n<div class=\"line\"><a name=\"l01746\"></a><span class=\"lineno\"> 1746</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01747\"></a><span class=\"lineno\"> 1747</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01748\"></a><span class=\"lineno\"> 1748</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01749\"></a><span class=\"lineno\"> 1749</span>&#160;<span class=\"comment\">LATEX_SOURCE_CODE      = NO</span></div>\n<div class=\"line\"><a name=\"l01750\"></a><span class=\"lineno\"> 1750</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01751\"></a><span class=\"lineno\"> 1751</span>&#160;<span class=\"comment\"># The LATEX_BIB_STYLE tag can be used to specify the style to use for the</span></div>\n<div class=\"line\"><a name=\"l01752\"></a><span class=\"lineno\"> 1752</span>&#160;<span class=\"comment\"># bibliography, e.g. plainnat, or ieeetr. See</span></div>\n<div class=\"line\"><a name=\"l01753\"></a><span class=\"lineno\"> 1753</span>&#160;<span class=\"comment\"># http://en.wikipedia.org/wiki/BibTeX and \\cite for more info.</span></div>\n<div class=\"line\"><a name=\"l01754\"></a><span class=\"lineno\"> 1754</span>&#160;<span class=\"comment\"># The default value is: plain.</span></div>\n<div class=\"line\"><a name=\"l01755\"></a><span class=\"lineno\"> 1755</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_LATEX is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01756\"></a><span class=\"lineno\"> 1756</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01757\"></a><span class=\"lineno\"> 1757</span>&#160;<span class=\"comment\">LATEX_BIB_STYLE        = plain</span></div>\n<div class=\"line\"><a name=\"l01758\"></a><span class=\"lineno\"> 1758</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01759\"></a><span class=\"lineno\"> 1759</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01760\"></a><span class=\"lineno\"> 1760</span>&#160;<span class=\"comment\"># Configuration options related to the RTF output</span></div>\n<div class=\"line\"><a name=\"l01761\"></a><span class=\"lineno\"> 1761</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01762\"></a><span class=\"lineno\"> 1762</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01763\"></a><span class=\"lineno\"> 1763</span>&#160;<span class=\"comment\"># If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The</span></div>\n<div class=\"line\"><a name=\"l01764\"></a><span class=\"lineno\"> 1764</span>&#160;<span class=\"comment\"># RTF output is optimized for Word 97 and may not look too pretty with other RTF</span></div>\n<div class=\"line\"><a name=\"l01765\"></a><span class=\"lineno\"> 1765</span>&#160;<span class=\"comment\"># readers/editors.</span></div>\n<div class=\"line\"><a name=\"l01766\"></a><span class=\"lineno\"> 1766</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01767\"></a><span class=\"lineno\"> 1767</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01768\"></a><span class=\"lineno\"> 1768</span>&#160;<span class=\"comment\">GENERATE_RTF           = NO</span></div>\n<div class=\"line\"><a name=\"l01769\"></a><span class=\"lineno\"> 1769</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01770\"></a><span class=\"lineno\"> 1770</span>&#160;<span class=\"comment\"># The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a</span></div>\n<div class=\"line\"><a name=\"l01771\"></a><span class=\"lineno\"> 1771</span>&#160;<span class=\"comment\"># relative path is entered the value of OUTPUT_DIRECTORY will be put in front of</span></div>\n<div class=\"line\"><a name=\"l01772\"></a><span class=\"lineno\"> 1772</span>&#160;<span class=\"comment\"># it.</span></div>\n<div class=\"line\"><a name=\"l01773\"></a><span class=\"lineno\"> 1773</span>&#160;<span class=\"comment\"># The default directory is: rtf.</span></div>\n<div class=\"line\"><a name=\"l01774\"></a><span class=\"lineno\"> 1774</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_RTF is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01775\"></a><span class=\"lineno\"> 1775</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01776\"></a><span class=\"lineno\"> 1776</span>&#160;<span class=\"comment\">RTF_OUTPUT             = glm.rtf</span></div>\n<div class=\"line\"><a name=\"l01777\"></a><span class=\"lineno\"> 1777</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01778\"></a><span class=\"lineno\"> 1778</span>&#160;<span class=\"comment\"># If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF</span></div>\n<div class=\"line\"><a name=\"l01779\"></a><span class=\"lineno\"> 1779</span>&#160;<span class=\"comment\"># documents. This may be useful for small projects and may help to save some</span></div>\n<div class=\"line\"><a name=\"l01780\"></a><span class=\"lineno\"> 1780</span>&#160;<span class=\"comment\"># trees in general.</span></div>\n<div class=\"line\"><a name=\"l01781\"></a><span class=\"lineno\"> 1781</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01782\"></a><span class=\"lineno\"> 1782</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_RTF is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01783\"></a><span class=\"lineno\"> 1783</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01784\"></a><span class=\"lineno\"> 1784</span>&#160;<span class=\"comment\">COMPACT_RTF            = NO</span></div>\n<div class=\"line\"><a name=\"l01785\"></a><span class=\"lineno\"> 1785</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01786\"></a><span class=\"lineno\"> 1786</span>&#160;<span class=\"comment\"># If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will</span></div>\n<div class=\"line\"><a name=\"l01787\"></a><span class=\"lineno\"> 1787</span>&#160;<span class=\"comment\"># contain hyperlink fields. The RTF file will contain links (just like the HTML</span></div>\n<div class=\"line\"><a name=\"l01788\"></a><span class=\"lineno\"> 1788</span>&#160;<span class=\"comment\"># output) instead of page references. This makes the output suitable for online</span></div>\n<div class=\"line\"><a name=\"l01789\"></a><span class=\"lineno\"> 1789</span>&#160;<span class=\"comment\"># browsing using Word or some other Word compatible readers that support those</span></div>\n<div class=\"line\"><a name=\"l01790\"></a><span class=\"lineno\"> 1790</span>&#160;<span class=\"comment\"># fields.</span></div>\n<div class=\"line\"><a name=\"l01791\"></a><span class=\"lineno\"> 1791</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01792\"></a><span class=\"lineno\"> 1792</span>&#160;<span class=\"comment\"># Note: WordPad (write) and others do not support links.</span></div>\n<div class=\"line\"><a name=\"l01793\"></a><span class=\"lineno\"> 1793</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01794\"></a><span class=\"lineno\"> 1794</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_RTF is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01795\"></a><span class=\"lineno\"> 1795</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01796\"></a><span class=\"lineno\"> 1796</span>&#160;<span class=\"comment\">RTF_HYPERLINKS         = YES</span></div>\n<div class=\"line\"><a name=\"l01797\"></a><span class=\"lineno\"> 1797</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01798\"></a><span class=\"lineno\"> 1798</span>&#160;<span class=\"comment\"># Load stylesheet definitions from file. Syntax is similar to doxygen&#39;s config</span></div>\n<div class=\"line\"><a name=\"l01799\"></a><span class=\"lineno\"> 1799</span>&#160;<span class=\"comment\"># file, i.e. a series of assignments. You only have to provide replacements,</span></div>\n<div class=\"line\"><a name=\"l01800\"></a><span class=\"lineno\"> 1800</span>&#160;<span class=\"comment\"># missing definitions are set to their default value.</span></div>\n<div class=\"line\"><a name=\"l01801\"></a><span class=\"lineno\"> 1801</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01802\"></a><span class=\"lineno\"> 1802</span>&#160;<span class=\"comment\"># See also section &quot;Doxygen usage&quot; for information on how to generate the</span></div>\n<div class=\"line\"><a name=\"l01803\"></a><span class=\"lineno\"> 1803</span>&#160;<span class=\"comment\"># default style sheet that doxygen normally uses.</span></div>\n<div class=\"line\"><a name=\"l01804\"></a><span class=\"lineno\"> 1804</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_RTF is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01805\"></a><span class=\"lineno\"> 1805</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01806\"></a><span class=\"lineno\"> 1806</span>&#160;<span class=\"comment\">RTF_STYLESHEET_FILE    = </span></div>\n<div class=\"line\"><a name=\"l01807\"></a><span class=\"lineno\"> 1807</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01808\"></a><span class=\"lineno\"> 1808</span>&#160;<span class=\"comment\"># Set optional variables used in the generation of an RTF document. Syntax is</span></div>\n<div class=\"line\"><a name=\"l01809\"></a><span class=\"lineno\"> 1809</span>&#160;<span class=\"comment\"># similar to doxygen&#39;s config file. A template extensions file can be generated</span></div>\n<div class=\"line\"><a name=\"l01810\"></a><span class=\"lineno\"> 1810</span>&#160;<span class=\"comment\"># using doxygen -e rtf extensionFile.</span></div>\n<div class=\"line\"><a name=\"l01811\"></a><span class=\"lineno\"> 1811</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_RTF is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01812\"></a><span class=\"lineno\"> 1812</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01813\"></a><span class=\"lineno\"> 1813</span>&#160;<span class=\"comment\">RTF_EXTENSIONS_FILE    = </span></div>\n<div class=\"line\"><a name=\"l01814\"></a><span class=\"lineno\"> 1814</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01815\"></a><span class=\"lineno\"> 1815</span>&#160;<span class=\"comment\"># If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code</span></div>\n<div class=\"line\"><a name=\"l01816\"></a><span class=\"lineno\"> 1816</span>&#160;<span class=\"comment\"># with syntax highlighting in the RTF output.</span></div>\n<div class=\"line\"><a name=\"l01817\"></a><span class=\"lineno\"> 1817</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01818\"></a><span class=\"lineno\"> 1818</span>&#160;<span class=\"comment\"># Note that which sources are shown also depends on other settings such as</span></div>\n<div class=\"line\"><a name=\"l01819\"></a><span class=\"lineno\"> 1819</span>&#160;<span class=\"comment\"># SOURCE_BROWSER.</span></div>\n<div class=\"line\"><a name=\"l01820\"></a><span class=\"lineno\"> 1820</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01821\"></a><span class=\"lineno\"> 1821</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_RTF is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01822\"></a><span class=\"lineno\"> 1822</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01823\"></a><span class=\"lineno\"> 1823</span>&#160;<span class=\"comment\">RTF_SOURCE_CODE        = NO</span></div>\n<div class=\"line\"><a name=\"l01824\"></a><span class=\"lineno\"> 1824</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01825\"></a><span class=\"lineno\"> 1825</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01826\"></a><span class=\"lineno\"> 1826</span>&#160;<span class=\"comment\"># Configuration options related to the man page output</span></div>\n<div class=\"line\"><a name=\"l01827\"></a><span class=\"lineno\"> 1827</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01828\"></a><span class=\"lineno\"> 1828</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01829\"></a><span class=\"lineno\"> 1829</span>&#160;<span class=\"comment\"># If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for</span></div>\n<div class=\"line\"><a name=\"l01830\"></a><span class=\"lineno\"> 1830</span>&#160;<span class=\"comment\"># classes and files.</span></div>\n<div class=\"line\"><a name=\"l01831\"></a><span class=\"lineno\"> 1831</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01832\"></a><span class=\"lineno\"> 1832</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01833\"></a><span class=\"lineno\"> 1833</span>&#160;<span class=\"comment\">GENERATE_MAN           = NO</span></div>\n<div class=\"line\"><a name=\"l01834\"></a><span class=\"lineno\"> 1834</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01835\"></a><span class=\"lineno\"> 1835</span>&#160;<span class=\"comment\"># The MAN_OUTPUT tag is used to specify where the man pages will be put. If a</span></div>\n<div class=\"line\"><a name=\"l01836\"></a><span class=\"lineno\"> 1836</span>&#160;<span class=\"comment\"># relative path is entered the value of OUTPUT_DIRECTORY will be put in front of</span></div>\n<div class=\"line\"><a name=\"l01837\"></a><span class=\"lineno\"> 1837</span>&#160;<span class=\"comment\"># it. A directory man3 will be created inside the directory specified by</span></div>\n<div class=\"line\"><a name=\"l01838\"></a><span class=\"lineno\"> 1838</span>&#160;<span class=\"comment\"># MAN_OUTPUT.</span></div>\n<div class=\"line\"><a name=\"l01839\"></a><span class=\"lineno\"> 1839</span>&#160;<span class=\"comment\"># The default directory is: man.</span></div>\n<div class=\"line\"><a name=\"l01840\"></a><span class=\"lineno\"> 1840</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_MAN is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01841\"></a><span class=\"lineno\"> 1841</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01842\"></a><span class=\"lineno\"> 1842</span>&#160;<span class=\"comment\">MAN_OUTPUT             = man</span></div>\n<div class=\"line\"><a name=\"l01843\"></a><span class=\"lineno\"> 1843</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01844\"></a><span class=\"lineno\"> 1844</span>&#160;<span class=\"comment\"># The MAN_EXTENSION tag determines the extension that is added to the generated</span></div>\n<div class=\"line\"><a name=\"l01845\"></a><span class=\"lineno\"> 1845</span>&#160;<span class=\"comment\"># man pages. In case the manual section does not start with a number, the number</span></div>\n<div class=\"line\"><a name=\"l01846\"></a><span class=\"lineno\"> 1846</span>&#160;<span class=\"comment\"># 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is</span></div>\n<div class=\"line\"><a name=\"l01847\"></a><span class=\"lineno\"> 1847</span>&#160;<span class=\"comment\"># optional.</span></div>\n<div class=\"line\"><a name=\"l01848\"></a><span class=\"lineno\"> 1848</span>&#160;<span class=\"comment\"># The default value is: .3.</span></div>\n<div class=\"line\"><a name=\"l01849\"></a><span class=\"lineno\"> 1849</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_MAN is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01850\"></a><span class=\"lineno\"> 1850</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01851\"></a><span class=\"lineno\"> 1851</span>&#160;<span class=\"comment\">MAN_EXTENSION          = .3</span></div>\n<div class=\"line\"><a name=\"l01852\"></a><span class=\"lineno\"> 1852</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01853\"></a><span class=\"lineno\"> 1853</span>&#160;<span class=\"comment\"># The MAN_SUBDIR tag determines the name of the directory created within</span></div>\n<div class=\"line\"><a name=\"l01854\"></a><span class=\"lineno\"> 1854</span>&#160;<span class=\"comment\"># MAN_OUTPUT in which the man pages are placed. If defaults to man followed by</span></div>\n<div class=\"line\"><a name=\"l01855\"></a><span class=\"lineno\"> 1855</span>&#160;<span class=\"comment\"># MAN_EXTENSION with the initial . removed.</span></div>\n<div class=\"line\"><a name=\"l01856\"></a><span class=\"lineno\"> 1856</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_MAN is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01857\"></a><span class=\"lineno\"> 1857</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01858\"></a><span class=\"lineno\"> 1858</span>&#160;<span class=\"comment\">MAN_SUBDIR             = </span></div>\n<div class=\"line\"><a name=\"l01859\"></a><span class=\"lineno\"> 1859</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01860\"></a><span class=\"lineno\"> 1860</span>&#160;<span class=\"comment\"># If the MAN_LINKS tag is set to YES and doxygen generates man output, then it</span></div>\n<div class=\"line\"><a name=\"l01861\"></a><span class=\"lineno\"> 1861</span>&#160;<span class=\"comment\"># will generate one additional man file for each entity documented in the real</span></div>\n<div class=\"line\"><a name=\"l01862\"></a><span class=\"lineno\"> 1862</span>&#160;<span class=\"comment\"># man page(s). These additional files only source the real man page, but without</span></div>\n<div class=\"line\"><a name=\"l01863\"></a><span class=\"lineno\"> 1863</span>&#160;<span class=\"comment\"># them the man command would be unable to find the correct page.</span></div>\n<div class=\"line\"><a name=\"l01864\"></a><span class=\"lineno\"> 1864</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01865\"></a><span class=\"lineno\"> 1865</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_MAN is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01866\"></a><span class=\"lineno\"> 1866</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01867\"></a><span class=\"lineno\"> 1867</span>&#160;<span class=\"comment\">MAN_LINKS              = NO</span></div>\n<div class=\"line\"><a name=\"l01868\"></a><span class=\"lineno\"> 1868</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01869\"></a><span class=\"lineno\"> 1869</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01870\"></a><span class=\"lineno\"> 1870</span>&#160;<span class=\"comment\"># Configuration options related to the XML output</span></div>\n<div class=\"line\"><a name=\"l01871\"></a><span class=\"lineno\"> 1871</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01872\"></a><span class=\"lineno\"> 1872</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01873\"></a><span class=\"lineno\"> 1873</span>&#160;<span class=\"comment\"># If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that</span></div>\n<div class=\"line\"><a name=\"l01874\"></a><span class=\"lineno\"> 1874</span>&#160;<span class=\"comment\"># captures the structure of the code including all documentation.</span></div>\n<div class=\"line\"><a name=\"l01875\"></a><span class=\"lineno\"> 1875</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01876\"></a><span class=\"lineno\"> 1876</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01877\"></a><span class=\"lineno\"> 1877</span>&#160;<span class=\"comment\">GENERATE_XML           = NO</span></div>\n<div class=\"line\"><a name=\"l01878\"></a><span class=\"lineno\"> 1878</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01879\"></a><span class=\"lineno\"> 1879</span>&#160;<span class=\"comment\"># The XML_OUTPUT tag is used to specify where the XML pages will be put. If a</span></div>\n<div class=\"line\"><a name=\"l01880\"></a><span class=\"lineno\"> 1880</span>&#160;<span class=\"comment\"># relative path is entered the value of OUTPUT_DIRECTORY will be put in front of</span></div>\n<div class=\"line\"><a name=\"l01881\"></a><span class=\"lineno\"> 1881</span>&#160;<span class=\"comment\"># it.</span></div>\n<div class=\"line\"><a name=\"l01882\"></a><span class=\"lineno\"> 1882</span>&#160;<span class=\"comment\"># The default directory is: xml.</span></div>\n<div class=\"line\"><a name=\"l01883\"></a><span class=\"lineno\"> 1883</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_XML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01884\"></a><span class=\"lineno\"> 1884</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01885\"></a><span class=\"lineno\"> 1885</span>&#160;<span class=\"comment\">XML_OUTPUT             = xml</span></div>\n<div class=\"line\"><a name=\"l01886\"></a><span class=\"lineno\"> 1886</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01887\"></a><span class=\"lineno\"> 1887</span>&#160;<span class=\"comment\"># If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program</span></div>\n<div class=\"line\"><a name=\"l01888\"></a><span class=\"lineno\"> 1888</span>&#160;<span class=\"comment\"># listings (including syntax highlighting and cross-referencing information) to</span></div>\n<div class=\"line\"><a name=\"l01889\"></a><span class=\"lineno\"> 1889</span>&#160;<span class=\"comment\"># the XML output. Note that enabling this will significantly increase the size</span></div>\n<div class=\"line\"><a name=\"l01890\"></a><span class=\"lineno\"> 1890</span>&#160;<span class=\"comment\"># of the XML output.</span></div>\n<div class=\"line\"><a name=\"l01891\"></a><span class=\"lineno\"> 1891</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01892\"></a><span class=\"lineno\"> 1892</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_XML is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01893\"></a><span class=\"lineno\"> 1893</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01894\"></a><span class=\"lineno\"> 1894</span>&#160;<span class=\"comment\">XML_PROGRAMLISTING     = YES</span></div>\n<div class=\"line\"><a name=\"l01895\"></a><span class=\"lineno\"> 1895</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01896\"></a><span class=\"lineno\"> 1896</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01897\"></a><span class=\"lineno\"> 1897</span>&#160;<span class=\"comment\"># Configuration options related to the DOCBOOK output</span></div>\n<div class=\"line\"><a name=\"l01898\"></a><span class=\"lineno\"> 1898</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01899\"></a><span class=\"lineno\"> 1899</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01900\"></a><span class=\"lineno\"> 1900</span>&#160;<span class=\"comment\"># If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files</span></div>\n<div class=\"line\"><a name=\"l01901\"></a><span class=\"lineno\"> 1901</span>&#160;<span class=\"comment\"># that can be used to generate PDF.</span></div>\n<div class=\"line\"><a name=\"l01902\"></a><span class=\"lineno\"> 1902</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01903\"></a><span class=\"lineno\"> 1903</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01904\"></a><span class=\"lineno\"> 1904</span>&#160;<span class=\"comment\">GENERATE_DOCBOOK       = NO</span></div>\n<div class=\"line\"><a name=\"l01905\"></a><span class=\"lineno\"> 1905</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01906\"></a><span class=\"lineno\"> 1906</span>&#160;<span class=\"comment\"># The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.</span></div>\n<div class=\"line\"><a name=\"l01907\"></a><span class=\"lineno\"> 1907</span>&#160;<span class=\"comment\"># If a relative path is entered the value of OUTPUT_DIRECTORY will be put in</span></div>\n<div class=\"line\"><a name=\"l01908\"></a><span class=\"lineno\"> 1908</span>&#160;<span class=\"comment\"># front of it.</span></div>\n<div class=\"line\"><a name=\"l01909\"></a><span class=\"lineno\"> 1909</span>&#160;<span class=\"comment\"># The default directory is: docbook.</span></div>\n<div class=\"line\"><a name=\"l01910\"></a><span class=\"lineno\"> 1910</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_DOCBOOK is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01911\"></a><span class=\"lineno\"> 1911</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01912\"></a><span class=\"lineno\"> 1912</span>&#160;<span class=\"comment\">DOCBOOK_OUTPUT         = docbook</span></div>\n<div class=\"line\"><a name=\"l01913\"></a><span class=\"lineno\"> 1913</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01914\"></a><span class=\"lineno\"> 1914</span>&#160;<span class=\"comment\"># If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the</span></div>\n<div class=\"line\"><a name=\"l01915\"></a><span class=\"lineno\"> 1915</span>&#160;<span class=\"comment\"># program listings (including syntax highlighting and cross-referencing</span></div>\n<div class=\"line\"><a name=\"l01916\"></a><span class=\"lineno\"> 1916</span>&#160;<span class=\"comment\"># information) to the DOCBOOK output. Note that enabling this will significantly</span></div>\n<div class=\"line\"><a name=\"l01917\"></a><span class=\"lineno\"> 1917</span>&#160;<span class=\"comment\"># increase the size of the DOCBOOK output.</span></div>\n<div class=\"line\"><a name=\"l01918\"></a><span class=\"lineno\"> 1918</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01919\"></a><span class=\"lineno\"> 1919</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_DOCBOOK is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01920\"></a><span class=\"lineno\"> 1920</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01921\"></a><span class=\"lineno\"> 1921</span>&#160;<span class=\"comment\">DOCBOOK_PROGRAMLISTING = NO</span></div>\n<div class=\"line\"><a name=\"l01922\"></a><span class=\"lineno\"> 1922</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01923\"></a><span class=\"lineno\"> 1923</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01924\"></a><span class=\"lineno\"> 1924</span>&#160;<span class=\"comment\"># Configuration options for the AutoGen Definitions output</span></div>\n<div class=\"line\"><a name=\"l01925\"></a><span class=\"lineno\"> 1925</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01926\"></a><span class=\"lineno\"> 1926</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01927\"></a><span class=\"lineno\"> 1927</span>&#160;<span class=\"comment\"># If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an</span></div>\n<div class=\"line\"><a name=\"l01928\"></a><span class=\"lineno\"> 1928</span>&#160;<span class=\"comment\"># AutoGen Definitions (see http://autogen.sf.net) file that captures the</span></div>\n<div class=\"line\"><a name=\"l01929\"></a><span class=\"lineno\"> 1929</span>&#160;<span class=\"comment\"># structure of the code including all documentation. Note that this feature is</span></div>\n<div class=\"line\"><a name=\"l01930\"></a><span class=\"lineno\"> 1930</span>&#160;<span class=\"comment\"># still experimental and incomplete at the moment.</span></div>\n<div class=\"line\"><a name=\"l01931\"></a><span class=\"lineno\"> 1931</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01932\"></a><span class=\"lineno\"> 1932</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01933\"></a><span class=\"lineno\"> 1933</span>&#160;<span class=\"comment\">GENERATE_AUTOGEN_DEF   = NO</span></div>\n<div class=\"line\"><a name=\"l01934\"></a><span class=\"lineno\"> 1934</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01935\"></a><span class=\"lineno\"> 1935</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01936\"></a><span class=\"lineno\"> 1936</span>&#160;<span class=\"comment\"># Configuration options related to the Perl module output</span></div>\n<div class=\"line\"><a name=\"l01937\"></a><span class=\"lineno\"> 1937</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01938\"></a><span class=\"lineno\"> 1938</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01939\"></a><span class=\"lineno\"> 1939</span>&#160;<span class=\"comment\"># If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module</span></div>\n<div class=\"line\"><a name=\"l01940\"></a><span class=\"lineno\"> 1940</span>&#160;<span class=\"comment\"># file that captures the structure of the code including all documentation.</span></div>\n<div class=\"line\"><a name=\"l01941\"></a><span class=\"lineno\"> 1941</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l01942\"></a><span class=\"lineno\"> 1942</span>&#160;<span class=\"comment\"># Note that this feature is still experimental and incomplete at the moment.</span></div>\n<div class=\"line\"><a name=\"l01943\"></a><span class=\"lineno\"> 1943</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01944\"></a><span class=\"lineno\"> 1944</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01945\"></a><span class=\"lineno\"> 1945</span>&#160;<span class=\"comment\">GENERATE_PERLMOD       = NO</span></div>\n<div class=\"line\"><a name=\"l01946\"></a><span class=\"lineno\"> 1946</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01947\"></a><span class=\"lineno\"> 1947</span>&#160;<span class=\"comment\"># If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary</span></div>\n<div class=\"line\"><a name=\"l01948\"></a><span class=\"lineno\"> 1948</span>&#160;<span class=\"comment\"># Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI</span></div>\n<div class=\"line\"><a name=\"l01949\"></a><span class=\"lineno\"> 1949</span>&#160;<span class=\"comment\"># output from the Perl module output.</span></div>\n<div class=\"line\"><a name=\"l01950\"></a><span class=\"lineno\"> 1950</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01951\"></a><span class=\"lineno\"> 1951</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_PERLMOD is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01952\"></a><span class=\"lineno\"> 1952</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01953\"></a><span class=\"lineno\"> 1953</span>&#160;<span class=\"comment\">PERLMOD_LATEX          = NO</span></div>\n<div class=\"line\"><a name=\"l01954\"></a><span class=\"lineno\"> 1954</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01955\"></a><span class=\"lineno\"> 1955</span>&#160;<span class=\"comment\"># If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely</span></div>\n<div class=\"line\"><a name=\"l01956\"></a><span class=\"lineno\"> 1956</span>&#160;<span class=\"comment\"># formatted so it can be parsed by a human reader. This is useful if you want to</span></div>\n<div class=\"line\"><a name=\"l01957\"></a><span class=\"lineno\"> 1957</span>&#160;<span class=\"comment\"># understand what is going on. On the other hand, if this tag is set to NO, the</span></div>\n<div class=\"line\"><a name=\"l01958\"></a><span class=\"lineno\"> 1958</span>&#160;<span class=\"comment\"># size of the Perl module output will be much smaller and Perl will parse it</span></div>\n<div class=\"line\"><a name=\"l01959\"></a><span class=\"lineno\"> 1959</span>&#160;<span class=\"comment\"># just the same.</span></div>\n<div class=\"line\"><a name=\"l01960\"></a><span class=\"lineno\"> 1960</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01961\"></a><span class=\"lineno\"> 1961</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_PERLMOD is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01962\"></a><span class=\"lineno\"> 1962</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01963\"></a><span class=\"lineno\"> 1963</span>&#160;<span class=\"comment\">PERLMOD_PRETTY         = YES</span></div>\n<div class=\"line\"><a name=\"l01964\"></a><span class=\"lineno\"> 1964</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01965\"></a><span class=\"lineno\"> 1965</span>&#160;<span class=\"comment\"># The names of the make variables in the generated doxyrules.make file are</span></div>\n<div class=\"line\"><a name=\"l01966\"></a><span class=\"lineno\"> 1966</span>&#160;<span class=\"comment\"># prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful</span></div>\n<div class=\"line\"><a name=\"l01967\"></a><span class=\"lineno\"> 1967</span>&#160;<span class=\"comment\"># so different doxyrules.make files included by the same Makefile don&#39;t</span></div>\n<div class=\"line\"><a name=\"l01968\"></a><span class=\"lineno\"> 1968</span>&#160;<span class=\"comment\"># overwrite each other&#39;s variables.</span></div>\n<div class=\"line\"><a name=\"l01969\"></a><span class=\"lineno\"> 1969</span>&#160;<span class=\"comment\"># This tag requires that the tag GENERATE_PERLMOD is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01970\"></a><span class=\"lineno\"> 1970</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01971\"></a><span class=\"lineno\"> 1971</span>&#160;<span class=\"comment\">PERLMOD_MAKEVAR_PREFIX = </span></div>\n<div class=\"line\"><a name=\"l01972\"></a><span class=\"lineno\"> 1972</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01973\"></a><span class=\"lineno\"> 1973</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01974\"></a><span class=\"lineno\"> 1974</span>&#160;<span class=\"comment\"># Configuration options related to the preprocessor</span></div>\n<div class=\"line\"><a name=\"l01975\"></a><span class=\"lineno\"> 1975</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l01976\"></a><span class=\"lineno\"> 1976</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01977\"></a><span class=\"lineno\"> 1977</span>&#160;<span class=\"comment\"># If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all</span></div>\n<div class=\"line\"><a name=\"l01978\"></a><span class=\"lineno\"> 1978</span>&#160;<span class=\"comment\"># C-preprocessor directives found in the sources and include files.</span></div>\n<div class=\"line\"><a name=\"l01979\"></a><span class=\"lineno\"> 1979</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l01980\"></a><span class=\"lineno\"> 1980</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01981\"></a><span class=\"lineno\"> 1981</span>&#160;<span class=\"comment\">ENABLE_PREPROCESSING   = YES</span></div>\n<div class=\"line\"><a name=\"l01982\"></a><span class=\"lineno\"> 1982</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01983\"></a><span class=\"lineno\"> 1983</span>&#160;<span class=\"comment\"># If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names</span></div>\n<div class=\"line\"><a name=\"l01984\"></a><span class=\"lineno\"> 1984</span>&#160;<span class=\"comment\"># in the source code. If set to NO, only conditional compilation will be</span></div>\n<div class=\"line\"><a name=\"l01985\"></a><span class=\"lineno\"> 1985</span>&#160;<span class=\"comment\"># performed. Macro expansion can be done in a controlled way by setting</span></div>\n<div class=\"line\"><a name=\"l01986\"></a><span class=\"lineno\"> 1986</span>&#160;<span class=\"comment\"># EXPAND_ONLY_PREDEF to YES.</span></div>\n<div class=\"line\"><a name=\"l01987\"></a><span class=\"lineno\"> 1987</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01988\"></a><span class=\"lineno\"> 1988</span>&#160;<span class=\"comment\"># This tag requires that the tag ENABLE_PREPROCESSING is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01989\"></a><span class=\"lineno\"> 1989</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01990\"></a><span class=\"lineno\"> 1990</span>&#160;<span class=\"comment\">MACRO_EXPANSION        = NO</span></div>\n<div class=\"line\"><a name=\"l01991\"></a><span class=\"lineno\"> 1991</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01992\"></a><span class=\"lineno\"> 1992</span>&#160;<span class=\"comment\"># If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then</span></div>\n<div class=\"line\"><a name=\"l01993\"></a><span class=\"lineno\"> 1993</span>&#160;<span class=\"comment\"># the macro expansion is limited to the macros specified with the PREDEFINED and</span></div>\n<div class=\"line\"><a name=\"l01994\"></a><span class=\"lineno\"> 1994</span>&#160;<span class=\"comment\"># EXPAND_AS_DEFINED tags.</span></div>\n<div class=\"line\"><a name=\"l01995\"></a><span class=\"lineno\"> 1995</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l01996\"></a><span class=\"lineno\"> 1996</span>&#160;<span class=\"comment\"># This tag requires that the tag ENABLE_PREPROCESSING is set to YES.</span></div>\n<div class=\"line\"><a name=\"l01997\"></a><span class=\"lineno\"> 1997</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l01998\"></a><span class=\"lineno\"> 1998</span>&#160;<span class=\"comment\">EXPAND_ONLY_PREDEF     = NO</span></div>\n<div class=\"line\"><a name=\"l01999\"></a><span class=\"lineno\"> 1999</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02000\"></a><span class=\"lineno\"> 2000</span>&#160;<span class=\"comment\"># If the SEARCH_INCLUDES tag is set to YES, the include files in the</span></div>\n<div class=\"line\"><a name=\"l02001\"></a><span class=\"lineno\"> 2001</span>&#160;<span class=\"comment\"># INCLUDE_PATH will be searched if a #include is found.</span></div>\n<div class=\"line\"><a name=\"l02002\"></a><span class=\"lineno\"> 2002</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02003\"></a><span class=\"lineno\"> 2003</span>&#160;<span class=\"comment\"># This tag requires that the tag ENABLE_PREPROCESSING is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02004\"></a><span class=\"lineno\"> 2004</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02005\"></a><span class=\"lineno\"> 2005</span>&#160;<span class=\"comment\">SEARCH_INCLUDES        = YES</span></div>\n<div class=\"line\"><a name=\"l02006\"></a><span class=\"lineno\"> 2006</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02007\"></a><span class=\"lineno\"> 2007</span>&#160;<span class=\"comment\"># The INCLUDE_PATH tag can be used to specify one or more directories that</span></div>\n<div class=\"line\"><a name=\"l02008\"></a><span class=\"lineno\"> 2008</span>&#160;<span class=\"comment\"># contain include files that are not input files but should be processed by the</span></div>\n<div class=\"line\"><a name=\"l02009\"></a><span class=\"lineno\"> 2009</span>&#160;<span class=\"comment\"># preprocessor.</span></div>\n<div class=\"line\"><a name=\"l02010\"></a><span class=\"lineno\"> 2010</span>&#160;<span class=\"comment\"># This tag requires that the tag SEARCH_INCLUDES is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02011\"></a><span class=\"lineno\"> 2011</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02012\"></a><span class=\"lineno\"> 2012</span>&#160;<span class=\"comment\">INCLUDE_PATH           = </span></div>\n<div class=\"line\"><a name=\"l02013\"></a><span class=\"lineno\"> 2013</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02014\"></a><span class=\"lineno\"> 2014</span>&#160;<span class=\"comment\"># You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard</span></div>\n<div class=\"line\"><a name=\"l02015\"></a><span class=\"lineno\"> 2015</span>&#160;<span class=\"comment\"># patterns (like *.h and *.hpp) to filter out the header-files in the</span></div>\n<div class=\"line\"><a name=\"l02016\"></a><span class=\"lineno\"> 2016</span>&#160;<span class=\"comment\"># directories. If left blank, the patterns specified with FILE_PATTERNS will be</span></div>\n<div class=\"line\"><a name=\"l02017\"></a><span class=\"lineno\"> 2017</span>&#160;<span class=\"comment\"># used.</span></div>\n<div class=\"line\"><a name=\"l02018\"></a><span class=\"lineno\"> 2018</span>&#160;<span class=\"comment\"># This tag requires that the tag ENABLE_PREPROCESSING is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02019\"></a><span class=\"lineno\"> 2019</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02020\"></a><span class=\"lineno\"> 2020</span>&#160;<span class=\"comment\">INCLUDE_FILE_PATTERNS  = </span></div>\n<div class=\"line\"><a name=\"l02021\"></a><span class=\"lineno\"> 2021</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02022\"></a><span class=\"lineno\"> 2022</span>&#160;<span class=\"comment\"># The PREDEFINED tag can be used to specify one or more macro names that are</span></div>\n<div class=\"line\"><a name=\"l02023\"></a><span class=\"lineno\"> 2023</span>&#160;<span class=\"comment\"># defined before the preprocessor is started (similar to the -D option of e.g.</span></div>\n<div class=\"line\"><a name=\"l02024\"></a><span class=\"lineno\"> 2024</span>&#160;<span class=\"comment\"># gcc). The argument of the tag is a list of macros of the form: name or</span></div>\n<div class=\"line\"><a name=\"l02025\"></a><span class=\"lineno\"> 2025</span>&#160;<span class=\"comment\"># name=definition (no spaces). If the definition and the &quot;=&quot; are omitted, &quot;=1&quot;</span></div>\n<div class=\"line\"><a name=\"l02026\"></a><span class=\"lineno\"> 2026</span>&#160;<span class=\"comment\"># is assumed. To prevent a macro definition from being undefined via #undef or</span></div>\n<div class=\"line\"><a name=\"l02027\"></a><span class=\"lineno\"> 2027</span>&#160;<span class=\"comment\"># recursively expanded use the := operator instead of the = operator.</span></div>\n<div class=\"line\"><a name=\"l02028\"></a><span class=\"lineno\"> 2028</span>&#160;<span class=\"comment\"># This tag requires that the tag ENABLE_PREPROCESSING is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02029\"></a><span class=\"lineno\"> 2029</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02030\"></a><span class=\"lineno\"> 2030</span>&#160;<span class=\"comment\">PREDEFINED             = </span></div>\n<div class=\"line\"><a name=\"l02031\"></a><span class=\"lineno\"> 2031</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02032\"></a><span class=\"lineno\"> 2032</span>&#160;<span class=\"comment\"># If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this</span></div>\n<div class=\"line\"><a name=\"l02033\"></a><span class=\"lineno\"> 2033</span>&#160;<span class=\"comment\"># tag can be used to specify a list of macro names that should be expanded. The</span></div>\n<div class=\"line\"><a name=\"l02034\"></a><span class=\"lineno\"> 2034</span>&#160;<span class=\"comment\"># macro definition that is found in the sources will be used. Use the PREDEFINED</span></div>\n<div class=\"line\"><a name=\"l02035\"></a><span class=\"lineno\"> 2035</span>&#160;<span class=\"comment\"># tag if you want to use a different macro definition that overrules the</span></div>\n<div class=\"line\"><a name=\"l02036\"></a><span class=\"lineno\"> 2036</span>&#160;<span class=\"comment\"># definition found in the source code.</span></div>\n<div class=\"line\"><a name=\"l02037\"></a><span class=\"lineno\"> 2037</span>&#160;<span class=\"comment\"># This tag requires that the tag ENABLE_PREPROCESSING is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02038\"></a><span class=\"lineno\"> 2038</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02039\"></a><span class=\"lineno\"> 2039</span>&#160;<span class=\"comment\">EXPAND_AS_DEFINED      = </span></div>\n<div class=\"line\"><a name=\"l02040\"></a><span class=\"lineno\"> 2040</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02041\"></a><span class=\"lineno\"> 2041</span>&#160;<span class=\"comment\"># If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen&#39;s preprocessor will</span></div>\n<div class=\"line\"><a name=\"l02042\"></a><span class=\"lineno\"> 2042</span>&#160;<span class=\"comment\"># remove all references to function-like macros that are alone on a line, have</span></div>\n<div class=\"line\"><a name=\"l02043\"></a><span class=\"lineno\"> 2043</span>&#160;<span class=\"comment\"># an all uppercase name, and do not end with a semicolon. Such function macros</span></div>\n<div class=\"line\"><a name=\"l02044\"></a><span class=\"lineno\"> 2044</span>&#160;<span class=\"comment\"># are typically used for boiler-plate code, and will confuse the parser if not</span></div>\n<div class=\"line\"><a name=\"l02045\"></a><span class=\"lineno\"> 2045</span>&#160;<span class=\"comment\"># removed.</span></div>\n<div class=\"line\"><a name=\"l02046\"></a><span class=\"lineno\"> 2046</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02047\"></a><span class=\"lineno\"> 2047</span>&#160;<span class=\"comment\"># This tag requires that the tag ENABLE_PREPROCESSING is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02048\"></a><span class=\"lineno\"> 2048</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02049\"></a><span class=\"lineno\"> 2049</span>&#160;<span class=\"comment\">SKIP_FUNCTION_MACROS   = YES</span></div>\n<div class=\"line\"><a name=\"l02050\"></a><span class=\"lineno\"> 2050</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02051\"></a><span class=\"lineno\"> 2051</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l02052\"></a><span class=\"lineno\"> 2052</span>&#160;<span class=\"comment\"># Configuration options related to external references</span></div>\n<div class=\"line\"><a name=\"l02053\"></a><span class=\"lineno\"> 2053</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l02054\"></a><span class=\"lineno\"> 2054</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02055\"></a><span class=\"lineno\"> 2055</span>&#160;<span class=\"comment\"># The TAGFILES tag can be used to specify one or more tag files. For each tag</span></div>\n<div class=\"line\"><a name=\"l02056\"></a><span class=\"lineno\"> 2056</span>&#160;<span class=\"comment\"># file the location of the external documentation should be added. The format of</span></div>\n<div class=\"line\"><a name=\"l02057\"></a><span class=\"lineno\"> 2057</span>&#160;<span class=\"comment\"># a tag file without this location is as follows:</span></div>\n<div class=\"line\"><a name=\"l02058\"></a><span class=\"lineno\"> 2058</span>&#160;<span class=\"comment\"># TAGFILES = file1 file2 ...</span></div>\n<div class=\"line\"><a name=\"l02059\"></a><span class=\"lineno\"> 2059</span>&#160;<span class=\"comment\"># Adding location for the tag files is done as follows:</span></div>\n<div class=\"line\"><a name=\"l02060\"></a><span class=\"lineno\"> 2060</span>&#160;<span class=\"comment\"># TAGFILES = file1=loc1 &quot;file2 = loc2&quot; ...</span></div>\n<div class=\"line\"><a name=\"l02061\"></a><span class=\"lineno\"> 2061</span>&#160;<span class=\"comment\"># where loc1 and loc2 can be relative or absolute paths or URLs. See the</span></div>\n<div class=\"line\"><a name=\"l02062\"></a><span class=\"lineno\"> 2062</span>&#160;<span class=\"comment\"># section &quot;Linking to external documentation&quot; for more information about the use</span></div>\n<div class=\"line\"><a name=\"l02063\"></a><span class=\"lineno\"> 2063</span>&#160;<span class=\"comment\"># of tag files.</span></div>\n<div class=\"line\"><a name=\"l02064\"></a><span class=\"lineno\"> 2064</span>&#160;<span class=\"comment\"># Note: Each tag file must have a unique name (where the name does NOT include</span></div>\n<div class=\"line\"><a name=\"l02065\"></a><span class=\"lineno\"> 2065</span>&#160;<span class=\"comment\"># the path). If a tag file is not located in the directory in which doxygen is</span></div>\n<div class=\"line\"><a name=\"l02066\"></a><span class=\"lineno\"> 2066</span>&#160;<span class=\"comment\"># run, you must also specify the path to the tagfile here.</span></div>\n<div class=\"line\"><a name=\"l02067\"></a><span class=\"lineno\"> 2067</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02068\"></a><span class=\"lineno\"> 2068</span>&#160;<span class=\"comment\">TAGFILES               = </span></div>\n<div class=\"line\"><a name=\"l02069\"></a><span class=\"lineno\"> 2069</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02070\"></a><span class=\"lineno\"> 2070</span>&#160;<span class=\"comment\"># When a file name is specified after GENERATE_TAGFILE, doxygen will create a</span></div>\n<div class=\"line\"><a name=\"l02071\"></a><span class=\"lineno\"> 2071</span>&#160;<span class=\"comment\"># tag file that is based on the input files it reads. See section &quot;Linking to</span></div>\n<div class=\"line\"><a name=\"l02072\"></a><span class=\"lineno\"> 2072</span>&#160;<span class=\"comment\"># external documentation&quot; for more information about the usage of tag files.</span></div>\n<div class=\"line\"><a name=\"l02073\"></a><span class=\"lineno\"> 2073</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02074\"></a><span class=\"lineno\"> 2074</span>&#160;<span class=\"comment\">GENERATE_TAGFILE       = </span></div>\n<div class=\"line\"><a name=\"l02075\"></a><span class=\"lineno\"> 2075</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02076\"></a><span class=\"lineno\"> 2076</span>&#160;<span class=\"comment\"># If the ALLEXTERNALS tag is set to YES, all external class will be listed in</span></div>\n<div class=\"line\"><a name=\"l02077\"></a><span class=\"lineno\"> 2077</span>&#160;<span class=\"comment\"># the class index. If set to NO, only the inherited external classes will be</span></div>\n<div class=\"line\"><a name=\"l02078\"></a><span class=\"lineno\"> 2078</span>&#160;<span class=\"comment\"># listed.</span></div>\n<div class=\"line\"><a name=\"l02079\"></a><span class=\"lineno\"> 2079</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02080\"></a><span class=\"lineno\"> 2080</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02081\"></a><span class=\"lineno\"> 2081</span>&#160;<span class=\"comment\">ALLEXTERNALS           = NO</span></div>\n<div class=\"line\"><a name=\"l02082\"></a><span class=\"lineno\"> 2082</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02083\"></a><span class=\"lineno\"> 2083</span>&#160;<span class=\"comment\"># If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed</span></div>\n<div class=\"line\"><a name=\"l02084\"></a><span class=\"lineno\"> 2084</span>&#160;<span class=\"comment\"># in the modules index. If set to NO, only the current project&#39;s groups will be</span></div>\n<div class=\"line\"><a name=\"l02085\"></a><span class=\"lineno\"> 2085</span>&#160;<span class=\"comment\"># listed.</span></div>\n<div class=\"line\"><a name=\"l02086\"></a><span class=\"lineno\"> 2086</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02087\"></a><span class=\"lineno\"> 2087</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02088\"></a><span class=\"lineno\"> 2088</span>&#160;<span class=\"comment\">EXTERNAL_GROUPS        = YES</span></div>\n<div class=\"line\"><a name=\"l02089\"></a><span class=\"lineno\"> 2089</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02090\"></a><span class=\"lineno\"> 2090</span>&#160;<span class=\"comment\"># If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in</span></div>\n<div class=\"line\"><a name=\"l02091\"></a><span class=\"lineno\"> 2091</span>&#160;<span class=\"comment\"># the related pages index. If set to NO, only the current project&#39;s pages will</span></div>\n<div class=\"line\"><a name=\"l02092\"></a><span class=\"lineno\"> 2092</span>&#160;<span class=\"comment\"># be listed.</span></div>\n<div class=\"line\"><a name=\"l02093\"></a><span class=\"lineno\"> 2093</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02094\"></a><span class=\"lineno\"> 2094</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02095\"></a><span class=\"lineno\"> 2095</span>&#160;<span class=\"comment\">EXTERNAL_PAGES         = YES</span></div>\n<div class=\"line\"><a name=\"l02096\"></a><span class=\"lineno\"> 2096</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02097\"></a><span class=\"lineno\"> 2097</span>&#160;<span class=\"comment\"># The PERL_PATH should be the absolute path and name of the perl script</span></div>\n<div class=\"line\"><a name=\"l02098\"></a><span class=\"lineno\"> 2098</span>&#160;<span class=\"comment\"># interpreter (i.e. the result of &#39;which perl&#39;).</span></div>\n<div class=\"line\"><a name=\"l02099\"></a><span class=\"lineno\"> 2099</span>&#160;<span class=\"comment\"># The default file (with absolute path) is: /usr/bin/perl.</span></div>\n<div class=\"line\"><a name=\"l02100\"></a><span class=\"lineno\"> 2100</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02101\"></a><span class=\"lineno\"> 2101</span>&#160;<span class=\"comment\">PERL_PATH              = /usr/bin/perl</span></div>\n<div class=\"line\"><a name=\"l02102\"></a><span class=\"lineno\"> 2102</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02103\"></a><span class=\"lineno\"> 2103</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l02104\"></a><span class=\"lineno\"> 2104</span>&#160;<span class=\"comment\"># Configuration options related to the dot tool</span></div>\n<div class=\"line\"><a name=\"l02105\"></a><span class=\"lineno\"> 2105</span>&#160;<span class=\"comment\">#---------------------------------------------------------------------------</span></div>\n<div class=\"line\"><a name=\"l02106\"></a><span class=\"lineno\"> 2106</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02107\"></a><span class=\"lineno\"> 2107</span>&#160;<span class=\"comment\"># If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram</span></div>\n<div class=\"line\"><a name=\"l02108\"></a><span class=\"lineno\"> 2108</span>&#160;<span class=\"comment\"># (in HTML and LaTeX) for classes with base or super classes. Setting the tag to</span></div>\n<div class=\"line\"><a name=\"l02109\"></a><span class=\"lineno\"> 2109</span>&#160;<span class=\"comment\"># NO turns the diagrams off. Note that this option also works with HAVE_DOT</span></div>\n<div class=\"line\"><a name=\"l02110\"></a><span class=\"lineno\"> 2110</span>&#160;<span class=\"comment\"># disabled, but it is recommended to install and use dot, since it yields more</span></div>\n<div class=\"line\"><a name=\"l02111\"></a><span class=\"lineno\"> 2111</span>&#160;<span class=\"comment\"># powerful graphs.</span></div>\n<div class=\"line\"><a name=\"l02112\"></a><span class=\"lineno\"> 2112</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02113\"></a><span class=\"lineno\"> 2113</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02114\"></a><span class=\"lineno\"> 2114</span>&#160;<span class=\"comment\">CLASS_DIAGRAMS         = YES</span></div>\n<div class=\"line\"><a name=\"l02115\"></a><span class=\"lineno\"> 2115</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02116\"></a><span class=\"lineno\"> 2116</span>&#160;<span class=\"comment\"># You can define message sequence charts within doxygen comments using the \\msc</span></div>\n<div class=\"line\"><a name=\"l02117\"></a><span class=\"lineno\"> 2117</span>&#160;<span class=\"comment\"># command. Doxygen will then run the mscgen tool (see:</span></div>\n<div class=\"line\"><a name=\"l02118\"></a><span class=\"lineno\"> 2118</span>&#160;<span class=\"comment\"># http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the</span></div>\n<div class=\"line\"><a name=\"l02119\"></a><span class=\"lineno\"> 2119</span>&#160;<span class=\"comment\"># documentation. The MSCGEN_PATH tag allows you to specify the directory where</span></div>\n<div class=\"line\"><a name=\"l02120\"></a><span class=\"lineno\"> 2120</span>&#160;<span class=\"comment\"># the mscgen tool resides. If left empty the tool is assumed to be found in the</span></div>\n<div class=\"line\"><a name=\"l02121\"></a><span class=\"lineno\"> 2121</span>&#160;<span class=\"comment\"># default search path.</span></div>\n<div class=\"line\"><a name=\"l02122\"></a><span class=\"lineno\"> 2122</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02123\"></a><span class=\"lineno\"> 2123</span>&#160;<span class=\"comment\">MSCGEN_PATH            = </span></div>\n<div class=\"line\"><a name=\"l02124\"></a><span class=\"lineno\"> 2124</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02125\"></a><span class=\"lineno\"> 2125</span>&#160;<span class=\"comment\"># You can include diagrams made with dia in doxygen documentation. Doxygen will</span></div>\n<div class=\"line\"><a name=\"l02126\"></a><span class=\"lineno\"> 2126</span>&#160;<span class=\"comment\"># then run dia to produce the diagram and insert it in the documentation. The</span></div>\n<div class=\"line\"><a name=\"l02127\"></a><span class=\"lineno\"> 2127</span>&#160;<span class=\"comment\"># DIA_PATH tag allows you to specify the directory where the dia binary resides.</span></div>\n<div class=\"line\"><a name=\"l02128\"></a><span class=\"lineno\"> 2128</span>&#160;<span class=\"comment\"># If left empty dia is assumed to be found in the default search path.</span></div>\n<div class=\"line\"><a name=\"l02129\"></a><span class=\"lineno\"> 2129</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02130\"></a><span class=\"lineno\"> 2130</span>&#160;<span class=\"comment\">DIA_PATH               = </span></div>\n<div class=\"line\"><a name=\"l02131\"></a><span class=\"lineno\"> 2131</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02132\"></a><span class=\"lineno\"> 2132</span>&#160;<span class=\"comment\"># If set to YES the inheritance and collaboration graphs will hide inheritance</span></div>\n<div class=\"line\"><a name=\"l02133\"></a><span class=\"lineno\"> 2133</span>&#160;<span class=\"comment\"># and usage relations if the target is undocumented or is not a class.</span></div>\n<div class=\"line\"><a name=\"l02134\"></a><span class=\"lineno\"> 2134</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02135\"></a><span class=\"lineno\"> 2135</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02136\"></a><span class=\"lineno\"> 2136</span>&#160;<span class=\"comment\">HIDE_UNDOC_RELATIONS   = YES</span></div>\n<div class=\"line\"><a name=\"l02137\"></a><span class=\"lineno\"> 2137</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02138\"></a><span class=\"lineno\"> 2138</span>&#160;<span class=\"comment\"># If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is</span></div>\n<div class=\"line\"><a name=\"l02139\"></a><span class=\"lineno\"> 2139</span>&#160;<span class=\"comment\"># available from the path. This tool is part of Graphviz (see:</span></div>\n<div class=\"line\"><a name=\"l02140\"></a><span class=\"lineno\"> 2140</span>&#160;<span class=\"comment\"># http://www.graphviz.org/), a graph visualization toolkit from AT&amp;T and Lucent</span></div>\n<div class=\"line\"><a name=\"l02141\"></a><span class=\"lineno\"> 2141</span>&#160;<span class=\"comment\"># Bell Labs. The other options in this section have no effect if this option is</span></div>\n<div class=\"line\"><a name=\"l02142\"></a><span class=\"lineno\"> 2142</span>&#160;<span class=\"comment\"># set to NO</span></div>\n<div class=\"line\"><a name=\"l02143\"></a><span class=\"lineno\"> 2143</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02144\"></a><span class=\"lineno\"> 2144</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02145\"></a><span class=\"lineno\"> 2145</span>&#160;<span class=\"comment\">HAVE_DOT               = NO</span></div>\n<div class=\"line\"><a name=\"l02146\"></a><span class=\"lineno\"> 2146</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02147\"></a><span class=\"lineno\"> 2147</span>&#160;<span class=\"comment\"># The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed</span></div>\n<div class=\"line\"><a name=\"l02148\"></a><span class=\"lineno\"> 2148</span>&#160;<span class=\"comment\"># to run in parallel. When set to 0 doxygen will base this on the number of</span></div>\n<div class=\"line\"><a name=\"l02149\"></a><span class=\"lineno\"> 2149</span>&#160;<span class=\"comment\"># processors available in the system. You can set it explicitly to a value</span></div>\n<div class=\"line\"><a name=\"l02150\"></a><span class=\"lineno\"> 2150</span>&#160;<span class=\"comment\"># larger than 0 to get control over the balance between CPU load and processing</span></div>\n<div class=\"line\"><a name=\"l02151\"></a><span class=\"lineno\"> 2151</span>&#160;<span class=\"comment\"># speed.</span></div>\n<div class=\"line\"><a name=\"l02152\"></a><span class=\"lineno\"> 2152</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 32, default value: 0.</span></div>\n<div class=\"line\"><a name=\"l02153\"></a><span class=\"lineno\"> 2153</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02154\"></a><span class=\"lineno\"> 2154</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02155\"></a><span class=\"lineno\"> 2155</span>&#160;<span class=\"comment\">DOT_NUM_THREADS        = 0</span></div>\n<div class=\"line\"><a name=\"l02156\"></a><span class=\"lineno\"> 2156</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02157\"></a><span class=\"lineno\"> 2157</span>&#160;<span class=\"comment\"># When you want a differently looking font in the dot files that doxygen</span></div>\n<div class=\"line\"><a name=\"l02158\"></a><span class=\"lineno\"> 2158</span>&#160;<span class=\"comment\"># generates you can specify the font name using DOT_FONTNAME. You need to make</span></div>\n<div class=\"line\"><a name=\"l02159\"></a><span class=\"lineno\"> 2159</span>&#160;<span class=\"comment\"># sure dot is able to find the font, which can be done by putting it in a</span></div>\n<div class=\"line\"><a name=\"l02160\"></a><span class=\"lineno\"> 2160</span>&#160;<span class=\"comment\"># standard location or by setting the DOTFONTPATH environment variable or by</span></div>\n<div class=\"line\"><a name=\"l02161\"></a><span class=\"lineno\"> 2161</span>&#160;<span class=\"comment\"># setting DOT_FONTPATH to the directory containing the font.</span></div>\n<div class=\"line\"><a name=\"l02162\"></a><span class=\"lineno\"> 2162</span>&#160;<span class=\"comment\"># The default value is: Helvetica.</span></div>\n<div class=\"line\"><a name=\"l02163\"></a><span class=\"lineno\"> 2163</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02164\"></a><span class=\"lineno\"> 2164</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02165\"></a><span class=\"lineno\"> 2165</span>&#160;<span class=\"comment\">DOT_FONTNAME           = Helvetica</span></div>\n<div class=\"line\"><a name=\"l02166\"></a><span class=\"lineno\"> 2166</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02167\"></a><span class=\"lineno\"> 2167</span>&#160;<span class=\"comment\"># The DOT_FONTSIZE tag can be used to set the size (in points) of the font of</span></div>\n<div class=\"line\"><a name=\"l02168\"></a><span class=\"lineno\"> 2168</span>&#160;<span class=\"comment\"># dot graphs.</span></div>\n<div class=\"line\"><a name=\"l02169\"></a><span class=\"lineno\"> 2169</span>&#160;<span class=\"comment\"># Minimum value: 4, maximum value: 24, default value: 10.</span></div>\n<div class=\"line\"><a name=\"l02170\"></a><span class=\"lineno\"> 2170</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02171\"></a><span class=\"lineno\"> 2171</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02172\"></a><span class=\"lineno\"> 2172</span>&#160;<span class=\"comment\">DOT_FONTSIZE           = 10</span></div>\n<div class=\"line\"><a name=\"l02173\"></a><span class=\"lineno\"> 2173</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02174\"></a><span class=\"lineno\"> 2174</span>&#160;<span class=\"comment\"># By default doxygen will tell dot to use the default font as specified with</span></div>\n<div class=\"line\"><a name=\"l02175\"></a><span class=\"lineno\"> 2175</span>&#160;<span class=\"comment\"># DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set</span></div>\n<div class=\"line\"><a name=\"l02176\"></a><span class=\"lineno\"> 2176</span>&#160;<span class=\"comment\"># the path where dot can find it using this tag.</span></div>\n<div class=\"line\"><a name=\"l02177\"></a><span class=\"lineno\"> 2177</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02178\"></a><span class=\"lineno\"> 2178</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02179\"></a><span class=\"lineno\"> 2179</span>&#160;<span class=\"comment\">DOT_FONTPATH           = </span></div>\n<div class=\"line\"><a name=\"l02180\"></a><span class=\"lineno\"> 2180</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02181\"></a><span class=\"lineno\"> 2181</span>&#160;<span class=\"comment\"># If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for</span></div>\n<div class=\"line\"><a name=\"l02182\"></a><span class=\"lineno\"> 2182</span>&#160;<span class=\"comment\"># each documented class showing the direct and indirect inheritance relations.</span></div>\n<div class=\"line\"><a name=\"l02183\"></a><span class=\"lineno\"> 2183</span>&#160;<span class=\"comment\"># Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.</span></div>\n<div class=\"line\"><a name=\"l02184\"></a><span class=\"lineno\"> 2184</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02185\"></a><span class=\"lineno\"> 2185</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02186\"></a><span class=\"lineno\"> 2186</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02187\"></a><span class=\"lineno\"> 2187</span>&#160;<span class=\"comment\">CLASS_GRAPH            = YES</span></div>\n<div class=\"line\"><a name=\"l02188\"></a><span class=\"lineno\"> 2188</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02189\"></a><span class=\"lineno\"> 2189</span>&#160;<span class=\"comment\"># If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a</span></div>\n<div class=\"line\"><a name=\"l02190\"></a><span class=\"lineno\"> 2190</span>&#160;<span class=\"comment\"># graph for each documented class showing the direct and indirect implementation</span></div>\n<div class=\"line\"><a name=\"l02191\"></a><span class=\"lineno\"> 2191</span>&#160;<span class=\"comment\"># dependencies (inheritance, containment, and class references variables) of the</span></div>\n<div class=\"line\"><a name=\"l02192\"></a><span class=\"lineno\"> 2192</span>&#160;<span class=\"comment\"># class with other documented classes.</span></div>\n<div class=\"line\"><a name=\"l02193\"></a><span class=\"lineno\"> 2193</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02194\"></a><span class=\"lineno\"> 2194</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02195\"></a><span class=\"lineno\"> 2195</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02196\"></a><span class=\"lineno\"> 2196</span>&#160;<span class=\"comment\">COLLABORATION_GRAPH    = YES</span></div>\n<div class=\"line\"><a name=\"l02197\"></a><span class=\"lineno\"> 2197</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02198\"></a><span class=\"lineno\"> 2198</span>&#160;<span class=\"comment\"># If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for</span></div>\n<div class=\"line\"><a name=\"l02199\"></a><span class=\"lineno\"> 2199</span>&#160;<span class=\"comment\"># groups, showing the direct groups dependencies.</span></div>\n<div class=\"line\"><a name=\"l02200\"></a><span class=\"lineno\"> 2200</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02201\"></a><span class=\"lineno\"> 2201</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02202\"></a><span class=\"lineno\"> 2202</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02203\"></a><span class=\"lineno\"> 2203</span>&#160;<span class=\"comment\">GROUP_GRAPHS           = YES</span></div>\n<div class=\"line\"><a name=\"l02204\"></a><span class=\"lineno\"> 2204</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02205\"></a><span class=\"lineno\"> 2205</span>&#160;<span class=\"comment\"># If the UML_LOOK tag is set to YES, doxygen will generate inheritance and</span></div>\n<div class=\"line\"><a name=\"l02206\"></a><span class=\"lineno\"> 2206</span>&#160;<span class=\"comment\"># collaboration diagrams in a style similar to the OMG&#39;s Unified Modeling</span></div>\n<div class=\"line\"><a name=\"l02207\"></a><span class=\"lineno\"> 2207</span>&#160;<span class=\"comment\"># Language.</span></div>\n<div class=\"line\"><a name=\"l02208\"></a><span class=\"lineno\"> 2208</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02209\"></a><span class=\"lineno\"> 2209</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02210\"></a><span class=\"lineno\"> 2210</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02211\"></a><span class=\"lineno\"> 2211</span>&#160;<span class=\"comment\">UML_LOOK               = NO</span></div>\n<div class=\"line\"><a name=\"l02212\"></a><span class=\"lineno\"> 2212</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02213\"></a><span class=\"lineno\"> 2213</span>&#160;<span class=\"comment\"># If the UML_LOOK tag is enabled, the fields and methods are shown inside the</span></div>\n<div class=\"line\"><a name=\"l02214\"></a><span class=\"lineno\"> 2214</span>&#160;<span class=\"comment\"># class node. If there are many fields or methods and many nodes the graph may</span></div>\n<div class=\"line\"><a name=\"l02215\"></a><span class=\"lineno\"> 2215</span>&#160;<span class=\"comment\"># become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the</span></div>\n<div class=\"line\"><a name=\"l02216\"></a><span class=\"lineno\"> 2216</span>&#160;<span class=\"comment\"># number of items for each type to make the size more manageable. Set this to 0</span></div>\n<div class=\"line\"><a name=\"l02217\"></a><span class=\"lineno\"> 2217</span>&#160;<span class=\"comment\"># for no limit. Note that the threshold may be exceeded by 50% before the limit</span></div>\n<div class=\"line\"><a name=\"l02218\"></a><span class=\"lineno\"> 2218</span>&#160;<span class=\"comment\"># is enforced. So when you set the threshold to 10, up to 15 fields may appear,</span></div>\n<div class=\"line\"><a name=\"l02219\"></a><span class=\"lineno\"> 2219</span>&#160;<span class=\"comment\"># but if the number exceeds 15, the total amount of fields shown is limited to</span></div>\n<div class=\"line\"><a name=\"l02220\"></a><span class=\"lineno\"> 2220</span>&#160;<span class=\"comment\"># 10.</span></div>\n<div class=\"line\"><a name=\"l02221\"></a><span class=\"lineno\"> 2221</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 100, default value: 10.</span></div>\n<div class=\"line\"><a name=\"l02222\"></a><span class=\"lineno\"> 2222</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02223\"></a><span class=\"lineno\"> 2223</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02224\"></a><span class=\"lineno\"> 2224</span>&#160;<span class=\"comment\">UML_LIMIT_NUM_FIELDS   = 10</span></div>\n<div class=\"line\"><a name=\"l02225\"></a><span class=\"lineno\"> 2225</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02226\"></a><span class=\"lineno\"> 2226</span>&#160;<span class=\"comment\"># If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and</span></div>\n<div class=\"line\"><a name=\"l02227\"></a><span class=\"lineno\"> 2227</span>&#160;<span class=\"comment\"># collaboration graphs will show the relations between templates and their</span></div>\n<div class=\"line\"><a name=\"l02228\"></a><span class=\"lineno\"> 2228</span>&#160;<span class=\"comment\"># instances.</span></div>\n<div class=\"line\"><a name=\"l02229\"></a><span class=\"lineno\"> 2229</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02230\"></a><span class=\"lineno\"> 2230</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02231\"></a><span class=\"lineno\"> 2231</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02232\"></a><span class=\"lineno\"> 2232</span>&#160;<span class=\"comment\">TEMPLATE_RELATIONS     = NO</span></div>\n<div class=\"line\"><a name=\"l02233\"></a><span class=\"lineno\"> 2233</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02234\"></a><span class=\"lineno\"> 2234</span>&#160;<span class=\"comment\"># If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to</span></div>\n<div class=\"line\"><a name=\"l02235\"></a><span class=\"lineno\"> 2235</span>&#160;<span class=\"comment\"># YES then doxygen will generate a graph for each documented file showing the</span></div>\n<div class=\"line\"><a name=\"l02236\"></a><span class=\"lineno\"> 2236</span>&#160;<span class=\"comment\"># direct and indirect include dependencies of the file with other documented</span></div>\n<div class=\"line\"><a name=\"l02237\"></a><span class=\"lineno\"> 2237</span>&#160;<span class=\"comment\"># files.</span></div>\n<div class=\"line\"><a name=\"l02238\"></a><span class=\"lineno\"> 2238</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02239\"></a><span class=\"lineno\"> 2239</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02240\"></a><span class=\"lineno\"> 2240</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02241\"></a><span class=\"lineno\"> 2241</span>&#160;<span class=\"comment\">INCLUDE_GRAPH          = YES</span></div>\n<div class=\"line\"><a name=\"l02242\"></a><span class=\"lineno\"> 2242</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02243\"></a><span class=\"lineno\"> 2243</span>&#160;<span class=\"comment\"># If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are</span></div>\n<div class=\"line\"><a name=\"l02244\"></a><span class=\"lineno\"> 2244</span>&#160;<span class=\"comment\"># set to YES then doxygen will generate a graph for each documented file showing</span></div>\n<div class=\"line\"><a name=\"l02245\"></a><span class=\"lineno\"> 2245</span>&#160;<span class=\"comment\"># the direct and indirect include dependencies of the file with other documented</span></div>\n<div class=\"line\"><a name=\"l02246\"></a><span class=\"lineno\"> 2246</span>&#160;<span class=\"comment\"># files.</span></div>\n<div class=\"line\"><a name=\"l02247\"></a><span class=\"lineno\"> 2247</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02248\"></a><span class=\"lineno\"> 2248</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02249\"></a><span class=\"lineno\"> 2249</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02250\"></a><span class=\"lineno\"> 2250</span>&#160;<span class=\"comment\">INCLUDED_BY_GRAPH      = YES</span></div>\n<div class=\"line\"><a name=\"l02251\"></a><span class=\"lineno\"> 2251</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02252\"></a><span class=\"lineno\"> 2252</span>&#160;<span class=\"comment\"># If the CALL_GRAPH tag is set to YES then doxygen will generate a call</span></div>\n<div class=\"line\"><a name=\"l02253\"></a><span class=\"lineno\"> 2253</span>&#160;<span class=\"comment\"># dependency graph for every global function or class method.</span></div>\n<div class=\"line\"><a name=\"l02254\"></a><span class=\"lineno\"> 2254</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l02255\"></a><span class=\"lineno\"> 2255</span>&#160;<span class=\"comment\"># Note that enabling this option will significantly increase the time of a run.</span></div>\n<div class=\"line\"><a name=\"l02256\"></a><span class=\"lineno\"> 2256</span>&#160;<span class=\"comment\"># So in most cases it will be better to enable call graphs for selected</span></div>\n<div class=\"line\"><a name=\"l02257\"></a><span class=\"lineno\"> 2257</span>&#160;<span class=\"comment\"># functions only using the \\callgraph command. Disabling a call graph can be</span></div>\n<div class=\"line\"><a name=\"l02258\"></a><span class=\"lineno\"> 2258</span>&#160;<span class=\"comment\"># accomplished by means of the command \\hidecallgraph.</span></div>\n<div class=\"line\"><a name=\"l02259\"></a><span class=\"lineno\"> 2259</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02260\"></a><span class=\"lineno\"> 2260</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02261\"></a><span class=\"lineno\"> 2261</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02262\"></a><span class=\"lineno\"> 2262</span>&#160;<span class=\"comment\">CALL_GRAPH             = YES</span></div>\n<div class=\"line\"><a name=\"l02263\"></a><span class=\"lineno\"> 2263</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02264\"></a><span class=\"lineno\"> 2264</span>&#160;<span class=\"comment\"># If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller</span></div>\n<div class=\"line\"><a name=\"l02265\"></a><span class=\"lineno\"> 2265</span>&#160;<span class=\"comment\"># dependency graph for every global function or class method.</span></div>\n<div class=\"line\"><a name=\"l02266\"></a><span class=\"lineno\"> 2266</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l02267\"></a><span class=\"lineno\"> 2267</span>&#160;<span class=\"comment\"># Note that enabling this option will significantly increase the time of a run.</span></div>\n<div class=\"line\"><a name=\"l02268\"></a><span class=\"lineno\"> 2268</span>&#160;<span class=\"comment\"># So in most cases it will be better to enable caller graphs for selected</span></div>\n<div class=\"line\"><a name=\"l02269\"></a><span class=\"lineno\"> 2269</span>&#160;<span class=\"comment\"># functions only using the \\callergraph command. Disabling a caller graph can be</span></div>\n<div class=\"line\"><a name=\"l02270\"></a><span class=\"lineno\"> 2270</span>&#160;<span class=\"comment\"># accomplished by means of the command \\hidecallergraph.</span></div>\n<div class=\"line\"><a name=\"l02271\"></a><span class=\"lineno\"> 2271</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02272\"></a><span class=\"lineno\"> 2272</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02273\"></a><span class=\"lineno\"> 2273</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02274\"></a><span class=\"lineno\"> 2274</span>&#160;<span class=\"comment\">CALLER_GRAPH           = YES</span></div>\n<div class=\"line\"><a name=\"l02275\"></a><span class=\"lineno\"> 2275</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02276\"></a><span class=\"lineno\"> 2276</span>&#160;<span class=\"comment\"># If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical</span></div>\n<div class=\"line\"><a name=\"l02277\"></a><span class=\"lineno\"> 2277</span>&#160;<span class=\"comment\"># hierarchy of all classes instead of a textual one.</span></div>\n<div class=\"line\"><a name=\"l02278\"></a><span class=\"lineno\"> 2278</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02279\"></a><span class=\"lineno\"> 2279</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02280\"></a><span class=\"lineno\"> 2280</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02281\"></a><span class=\"lineno\"> 2281</span>&#160;<span class=\"comment\">GRAPHICAL_HIERARCHY    = YES</span></div>\n<div class=\"line\"><a name=\"l02282\"></a><span class=\"lineno\"> 2282</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02283\"></a><span class=\"lineno\"> 2283</span>&#160;<span class=\"comment\"># If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the</span></div>\n<div class=\"line\"><a name=\"l02284\"></a><span class=\"lineno\"> 2284</span>&#160;<span class=\"comment\"># dependencies a directory has on other directories in a graphical way. The</span></div>\n<div class=\"line\"><a name=\"l02285\"></a><span class=\"lineno\"> 2285</span>&#160;<span class=\"comment\"># dependency relations are determined by the #include relations between the</span></div>\n<div class=\"line\"><a name=\"l02286\"></a><span class=\"lineno\"> 2286</span>&#160;<span class=\"comment\"># files in the directories.</span></div>\n<div class=\"line\"><a name=\"l02287\"></a><span class=\"lineno\"> 2287</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02288\"></a><span class=\"lineno\"> 2288</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02289\"></a><span class=\"lineno\"> 2289</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02290\"></a><span class=\"lineno\"> 2290</span>&#160;<span class=\"comment\">DIRECTORY_GRAPH        = YES</span></div>\n<div class=\"line\"><a name=\"l02291\"></a><span class=\"lineno\"> 2291</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02292\"></a><span class=\"lineno\"> 2292</span>&#160;<span class=\"comment\"># The DOT_IMAGE_FORMAT tag can be used to set the image format of the images</span></div>\n<div class=\"line\"><a name=\"l02293\"></a><span class=\"lineno\"> 2293</span>&#160;<span class=\"comment\"># generated by dot. For an explanation of the image formats see the section</span></div>\n<div class=\"line\"><a name=\"l02294\"></a><span class=\"lineno\"> 2294</span>&#160;<span class=\"comment\"># output formats in the documentation of the dot tool (Graphviz (see:</span></div>\n<div class=\"line\"><a name=\"l02295\"></a><span class=\"lineno\"> 2295</span>&#160;<span class=\"comment\"># http://www.graphviz.org/)).</span></div>\n<div class=\"line\"><a name=\"l02296\"></a><span class=\"lineno\"> 2296</span>&#160;<span class=\"comment\"># Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order</span></div>\n<div class=\"line\"><a name=\"l02297\"></a><span class=\"lineno\"> 2297</span>&#160;<span class=\"comment\"># to make the SVG files visible in IE 9+ (other browsers do not have this</span></div>\n<div class=\"line\"><a name=\"l02298\"></a><span class=\"lineno\"> 2298</span>&#160;<span class=\"comment\"># requirement).</span></div>\n<div class=\"line\"><a name=\"l02299\"></a><span class=\"lineno\"> 2299</span>&#160;<span class=\"comment\"># Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,</span></div>\n<div class=\"line\"><a name=\"l02300\"></a><span class=\"lineno\"> 2300</span>&#160;<span class=\"comment\"># png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and</span></div>\n<div class=\"line\"><a name=\"l02301\"></a><span class=\"lineno\"> 2301</span>&#160;<span class=\"comment\"># png:gdiplus:gdiplus.</span></div>\n<div class=\"line\"><a name=\"l02302\"></a><span class=\"lineno\"> 2302</span>&#160;<span class=\"comment\"># The default value is: png.</span></div>\n<div class=\"line\"><a name=\"l02303\"></a><span class=\"lineno\"> 2303</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02304\"></a><span class=\"lineno\"> 2304</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02305\"></a><span class=\"lineno\"> 2305</span>&#160;<span class=\"comment\">DOT_IMAGE_FORMAT       = png</span></div>\n<div class=\"line\"><a name=\"l02306\"></a><span class=\"lineno\"> 2306</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02307\"></a><span class=\"lineno\"> 2307</span>&#160;<span class=\"comment\"># If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to</span></div>\n<div class=\"line\"><a name=\"l02308\"></a><span class=\"lineno\"> 2308</span>&#160;<span class=\"comment\"># enable generation of interactive SVG images that allow zooming and panning.</span></div>\n<div class=\"line\"><a name=\"l02309\"></a><span class=\"lineno\"> 2309</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l02310\"></a><span class=\"lineno\"> 2310</span>&#160;<span class=\"comment\"># Note that this requires a modern browser other than Internet Explorer. Tested</span></div>\n<div class=\"line\"><a name=\"l02311\"></a><span class=\"lineno\"> 2311</span>&#160;<span class=\"comment\"># and working are Firefox, Chrome, Safari, and Opera.</span></div>\n<div class=\"line\"><a name=\"l02312\"></a><span class=\"lineno\"> 2312</span>&#160;<span class=\"comment\"># Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make</span></div>\n<div class=\"line\"><a name=\"l02313\"></a><span class=\"lineno\"> 2313</span>&#160;<span class=\"comment\"># the SVG files visible. Older versions of IE do not have SVG support.</span></div>\n<div class=\"line\"><a name=\"l02314\"></a><span class=\"lineno\"> 2314</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02315\"></a><span class=\"lineno\"> 2315</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02316\"></a><span class=\"lineno\"> 2316</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02317\"></a><span class=\"lineno\"> 2317</span>&#160;<span class=\"comment\">INTERACTIVE_SVG        = NO</span></div>\n<div class=\"line\"><a name=\"l02318\"></a><span class=\"lineno\"> 2318</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02319\"></a><span class=\"lineno\"> 2319</span>&#160;<span class=\"comment\"># The DOT_PATH tag can be used to specify the path where the dot tool can be</span></div>\n<div class=\"line\"><a name=\"l02320\"></a><span class=\"lineno\"> 2320</span>&#160;<span class=\"comment\"># found. If left blank, it is assumed the dot tool can be found in the path.</span></div>\n<div class=\"line\"><a name=\"l02321\"></a><span class=\"lineno\"> 2321</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02322\"></a><span class=\"lineno\"> 2322</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02323\"></a><span class=\"lineno\"> 2323</span>&#160;<span class=\"comment\">DOT_PATH               = </span></div>\n<div class=\"line\"><a name=\"l02324\"></a><span class=\"lineno\"> 2324</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02325\"></a><span class=\"lineno\"> 2325</span>&#160;<span class=\"comment\"># The DOTFILE_DIRS tag can be used to specify one or more directories that</span></div>\n<div class=\"line\"><a name=\"l02326\"></a><span class=\"lineno\"> 2326</span>&#160;<span class=\"comment\"># contain dot files that are included in the documentation (see the \\dotfile</span></div>\n<div class=\"line\"><a name=\"l02327\"></a><span class=\"lineno\"> 2327</span>&#160;<span class=\"comment\"># command).</span></div>\n<div class=\"line\"><a name=\"l02328\"></a><span class=\"lineno\"> 2328</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02329\"></a><span class=\"lineno\"> 2329</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02330\"></a><span class=\"lineno\"> 2330</span>&#160;<span class=\"comment\">DOTFILE_DIRS           = </span></div>\n<div class=\"line\"><a name=\"l02331\"></a><span class=\"lineno\"> 2331</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02332\"></a><span class=\"lineno\"> 2332</span>&#160;<span class=\"comment\"># The MSCFILE_DIRS tag can be used to specify one or more directories that</span></div>\n<div class=\"line\"><a name=\"l02333\"></a><span class=\"lineno\"> 2333</span>&#160;<span class=\"comment\"># contain msc files that are included in the documentation (see the \\mscfile</span></div>\n<div class=\"line\"><a name=\"l02334\"></a><span class=\"lineno\"> 2334</span>&#160;<span class=\"comment\"># command).</span></div>\n<div class=\"line\"><a name=\"l02335\"></a><span class=\"lineno\"> 2335</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02336\"></a><span class=\"lineno\"> 2336</span>&#160;<span class=\"comment\">MSCFILE_DIRS           = </span></div>\n<div class=\"line\"><a name=\"l02337\"></a><span class=\"lineno\"> 2337</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02338\"></a><span class=\"lineno\"> 2338</span>&#160;<span class=\"comment\"># The DIAFILE_DIRS tag can be used to specify one or more directories that</span></div>\n<div class=\"line\"><a name=\"l02339\"></a><span class=\"lineno\"> 2339</span>&#160;<span class=\"comment\"># contain dia files that are included in the documentation (see the \\diafile</span></div>\n<div class=\"line\"><a name=\"l02340\"></a><span class=\"lineno\"> 2340</span>&#160;<span class=\"comment\"># command).</span></div>\n<div class=\"line\"><a name=\"l02341\"></a><span class=\"lineno\"> 2341</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02342\"></a><span class=\"lineno\"> 2342</span>&#160;<span class=\"comment\">DIAFILE_DIRS           = </span></div>\n<div class=\"line\"><a name=\"l02343\"></a><span class=\"lineno\"> 2343</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02344\"></a><span class=\"lineno\"> 2344</span>&#160;<span class=\"comment\"># When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the</span></div>\n<div class=\"line\"><a name=\"l02345\"></a><span class=\"lineno\"> 2345</span>&#160;<span class=\"comment\"># path where java can find the plantuml.jar file. If left blank, it is assumed</span></div>\n<div class=\"line\"><a name=\"l02346\"></a><span class=\"lineno\"> 2346</span>&#160;<span class=\"comment\"># PlantUML is not used or called during a preprocessing step. Doxygen will</span></div>\n<div class=\"line\"><a name=\"l02347\"></a><span class=\"lineno\"> 2347</span>&#160;<span class=\"comment\"># generate a warning when it encounters a \\startuml command in this case and</span></div>\n<div class=\"line\"><a name=\"l02348\"></a><span class=\"lineno\"> 2348</span>&#160;<span class=\"comment\"># will not generate output for the diagram.</span></div>\n<div class=\"line\"><a name=\"l02349\"></a><span class=\"lineno\"> 2349</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02350\"></a><span class=\"lineno\"> 2350</span>&#160;<span class=\"comment\">PLANTUML_JAR_PATH      = </span></div>\n<div class=\"line\"><a name=\"l02351\"></a><span class=\"lineno\"> 2351</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02352\"></a><span class=\"lineno\"> 2352</span>&#160;<span class=\"comment\"># When using plantuml, the specified paths are searched for files specified by</span></div>\n<div class=\"line\"><a name=\"l02353\"></a><span class=\"lineno\"> 2353</span>&#160;<span class=\"comment\"># the !include statement in a plantuml block.</span></div>\n<div class=\"line\"><a name=\"l02354\"></a><span class=\"lineno\"> 2354</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02355\"></a><span class=\"lineno\"> 2355</span>&#160;<span class=\"comment\">PLANTUML_INCLUDE_PATH  = </span></div>\n<div class=\"line\"><a name=\"l02356\"></a><span class=\"lineno\"> 2356</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02357\"></a><span class=\"lineno\"> 2357</span>&#160;<span class=\"comment\"># The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes</span></div>\n<div class=\"line\"><a name=\"l02358\"></a><span class=\"lineno\"> 2358</span>&#160;<span class=\"comment\"># that will be shown in the graph. If the number of nodes in a graph becomes</span></div>\n<div class=\"line\"><a name=\"l02359\"></a><span class=\"lineno\"> 2359</span>&#160;<span class=\"comment\"># larger than this value, doxygen will truncate the graph, which is visualized</span></div>\n<div class=\"line\"><a name=\"l02360\"></a><span class=\"lineno\"> 2360</span>&#160;<span class=\"comment\"># by representing a node as a red box. Note that doxygen if the number of direct</span></div>\n<div class=\"line\"><a name=\"l02361\"></a><span class=\"lineno\"> 2361</span>&#160;<span class=\"comment\"># children of the root node in a graph is already larger than</span></div>\n<div class=\"line\"><a name=\"l02362\"></a><span class=\"lineno\"> 2362</span>&#160;<span class=\"comment\"># DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that</span></div>\n<div class=\"line\"><a name=\"l02363\"></a><span class=\"lineno\"> 2363</span>&#160;<span class=\"comment\"># the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.</span></div>\n<div class=\"line\"><a name=\"l02364\"></a><span class=\"lineno\"> 2364</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 10000, default value: 50.</span></div>\n<div class=\"line\"><a name=\"l02365\"></a><span class=\"lineno\"> 2365</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02366\"></a><span class=\"lineno\"> 2366</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02367\"></a><span class=\"lineno\"> 2367</span>&#160;<span class=\"comment\">DOT_GRAPH_MAX_NODES    = 50</span></div>\n<div class=\"line\"><a name=\"l02368\"></a><span class=\"lineno\"> 2368</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02369\"></a><span class=\"lineno\"> 2369</span>&#160;<span class=\"comment\"># The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs</span></div>\n<div class=\"line\"><a name=\"l02370\"></a><span class=\"lineno\"> 2370</span>&#160;<span class=\"comment\"># generated by dot. A depth value of 3 means that only nodes reachable from the</span></div>\n<div class=\"line\"><a name=\"l02371\"></a><span class=\"lineno\"> 2371</span>&#160;<span class=\"comment\"># root by following a path via at most 3 edges will be shown. Nodes that lay</span></div>\n<div class=\"line\"><a name=\"l02372\"></a><span class=\"lineno\"> 2372</span>&#160;<span class=\"comment\"># further from the root node will be omitted. Note that setting this option to 1</span></div>\n<div class=\"line\"><a name=\"l02373\"></a><span class=\"lineno\"> 2373</span>&#160;<span class=\"comment\"># or 2 may greatly reduce the computation time needed for large code bases. Also</span></div>\n<div class=\"line\"><a name=\"l02374\"></a><span class=\"lineno\"> 2374</span>&#160;<span class=\"comment\"># note that the size of a graph can be further restricted by</span></div>\n<div class=\"line\"><a name=\"l02375\"></a><span class=\"lineno\"> 2375</span>&#160;<span class=\"comment\"># DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.</span></div>\n<div class=\"line\"><a name=\"l02376\"></a><span class=\"lineno\"> 2376</span>&#160;<span class=\"comment\"># Minimum value: 0, maximum value: 1000, default value: 0.</span></div>\n<div class=\"line\"><a name=\"l02377\"></a><span class=\"lineno\"> 2377</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02378\"></a><span class=\"lineno\"> 2378</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02379\"></a><span class=\"lineno\"> 2379</span>&#160;<span class=\"comment\">MAX_DOT_GRAPH_DEPTH    = 1000</span></div>\n<div class=\"line\"><a name=\"l02380\"></a><span class=\"lineno\"> 2380</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02381\"></a><span class=\"lineno\"> 2381</span>&#160;<span class=\"comment\"># Set the DOT_TRANSPARENT tag to YES to generate images with a transparent</span></div>\n<div class=\"line\"><a name=\"l02382\"></a><span class=\"lineno\"> 2382</span>&#160;<span class=\"comment\"># background. This is disabled by default, because dot on Windows does not seem</span></div>\n<div class=\"line\"><a name=\"l02383\"></a><span class=\"lineno\"> 2383</span>&#160;<span class=\"comment\"># to support this out of the box.</span></div>\n<div class=\"line\"><a name=\"l02384\"></a><span class=\"lineno\"> 2384</span>&#160;<span class=\"comment\">#</span></div>\n<div class=\"line\"><a name=\"l02385\"></a><span class=\"lineno\"> 2385</span>&#160;<span class=\"comment\"># Warning: Depending on the platform used, enabling this option may lead to</span></div>\n<div class=\"line\"><a name=\"l02386\"></a><span class=\"lineno\"> 2386</span>&#160;<span class=\"comment\"># badly anti-aliased labels on the edges of a graph (i.e. they become hard to</span></div>\n<div class=\"line\"><a name=\"l02387\"></a><span class=\"lineno\"> 2387</span>&#160;<span class=\"comment\"># read).</span></div>\n<div class=\"line\"><a name=\"l02388\"></a><span class=\"lineno\"> 2388</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02389\"></a><span class=\"lineno\"> 2389</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02390\"></a><span class=\"lineno\"> 2390</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02391\"></a><span class=\"lineno\"> 2391</span>&#160;<span class=\"comment\">DOT_TRANSPARENT        = NO</span></div>\n<div class=\"line\"><a name=\"l02392\"></a><span class=\"lineno\"> 2392</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02393\"></a><span class=\"lineno\"> 2393</span>&#160;<span class=\"comment\"># Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output</span></div>\n<div class=\"line\"><a name=\"l02394\"></a><span class=\"lineno\"> 2394</span>&#160;<span class=\"comment\"># files in one run (i.e. multiple -o and -T options on the command line). This</span></div>\n<div class=\"line\"><a name=\"l02395\"></a><span class=\"lineno\"> 2395</span>&#160;<span class=\"comment\"># makes dot run faster, but since only newer versions of dot (&gt;1.8.10) support</span></div>\n<div class=\"line\"><a name=\"l02396\"></a><span class=\"lineno\"> 2396</span>&#160;<span class=\"comment\"># this, this feature is disabled by default.</span></div>\n<div class=\"line\"><a name=\"l02397\"></a><span class=\"lineno\"> 2397</span>&#160;<span class=\"comment\"># The default value is: NO.</span></div>\n<div class=\"line\"><a name=\"l02398\"></a><span class=\"lineno\"> 2398</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02399\"></a><span class=\"lineno\"> 2399</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02400\"></a><span class=\"lineno\"> 2400</span>&#160;<span class=\"comment\">DOT_MULTI_TARGETS      = NO</span></div>\n<div class=\"line\"><a name=\"l02401\"></a><span class=\"lineno\"> 2401</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02402\"></a><span class=\"lineno\"> 2402</span>&#160;<span class=\"comment\"># If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page</span></div>\n<div class=\"line\"><a name=\"l02403\"></a><span class=\"lineno\"> 2403</span>&#160;<span class=\"comment\"># explaining the meaning of the various boxes and arrows in the dot generated</span></div>\n<div class=\"line\"><a name=\"l02404\"></a><span class=\"lineno\"> 2404</span>&#160;<span class=\"comment\"># graphs.</span></div>\n<div class=\"line\"><a name=\"l02405\"></a><span class=\"lineno\"> 2405</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02406\"></a><span class=\"lineno\"> 2406</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02407\"></a><span class=\"lineno\"> 2407</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02408\"></a><span class=\"lineno\"> 2408</span>&#160;<span class=\"comment\">GENERATE_LEGEND        = YES</span></div>\n<div class=\"line\"><a name=\"l02409\"></a><span class=\"lineno\"> 2409</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02410\"></a><span class=\"lineno\"> 2410</span>&#160;<span class=\"comment\"># If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot</span></div>\n<div class=\"line\"><a name=\"l02411\"></a><span class=\"lineno\"> 2411</span>&#160;<span class=\"comment\"># files that are used to generate the various graphs.</span></div>\n<div class=\"line\"><a name=\"l02412\"></a><span class=\"lineno\"> 2412</span>&#160;<span class=\"comment\"># The default value is: YES.</span></div>\n<div class=\"line\"><a name=\"l02413\"></a><span class=\"lineno\"> 2413</span>&#160;<span class=\"comment\"># This tag requires that the tag HAVE_DOT is set to YES.</span></div>\n<div class=\"line\"><a name=\"l02414\"></a><span class=\"lineno\"> 2414</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l02415\"></a><span class=\"lineno\"> 2415</span>&#160;<span class=\"comment\">DOT_CLEANUP            = YES</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00046.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat2x2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat2x2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00046_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00046_source.html\">mat2x2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00046_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat2x2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat2x2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00046.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00108.html\">detail/type_mat2x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">lowp_mat2</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">mediump_mat2</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">highp_mat2</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">lowp_mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">mediump_mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, highp&gt;         <a class=\"code\" href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">highp_mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00145_html_ga993bdd19989dc1f4d09f664a2ee74cb5\"><div class=\"ttname\"><a href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">glm::lowp_mat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, lowp &gt; lowp_mat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00059\">type_mat.hpp:59</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga08bba677ef7b2809ac0061fa9a3db854\"><div class=\"ttname\"><a href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">glm::lowp_mat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, lowp &gt; lowp_mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00038\">type_mat.hpp:38</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gabb2ee47d6bffb6d6363b34a7c61c8229\"><div class=\"ttname\"><a href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">glm::highp_mat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, highp &gt; highp_mat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00073\">type_mat.hpp:73</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga4fcceff924fa2dc1f3d5217f68c5f81a\"><div class=\"ttname\"><a href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">glm::highp_mat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, highp &gt; highp_mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00052\">type_mat.hpp:52</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaf1beb3328c79fece7dcc34c5b05b57a0\"><div class=\"ttname\"><a href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">glm::mediump_mat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, mediump &gt; mediump_mat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00066\">type_mat.hpp:66</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga83fe5281ac0a3d153226b903badd415b\"><div class=\"ttname\"><a href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">glm::mediump_mat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, mediump &gt; mediump_mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00045\">type_mat.hpp:45</a></div></div>\n<div class=\"ttc\" id=\"a00108_html\"><div class=\"ttname\"><a href=\"a00108.html\">type_mat2x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00047.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat2x3.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat2x3.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00047_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00047_source.html\">mat2x3.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00047_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat2x3.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat2x3.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00047.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00109.html\">detail/type_mat2x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">lowp_mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">mediump_mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">highp_mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"ttc\" id=\"a00145_html_ga0bda8ba50fa930ef29d4fa91a85f229a\"><div class=\"ttname\"><a href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">glm::mediump_mat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, float, mediump &gt; mediump_mat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00092\">type_mat.hpp:92</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00109_html\"><div class=\"ttname\"><a href=\"a00109.html\">type_mat2x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga441b8e3402eefca108b40f3d22a1baa9\"><div class=\"ttname\"><a href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">glm::highp_mat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, float, highp &gt; highp_mat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00099\">type_mat.hpp:99</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga083089177b89ae9166d8d251a90f4b8b\"><div class=\"ttname\"><a href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">glm::lowp_mat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, float, lowp &gt; lowp_mat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00085\">type_mat.hpp:85</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00048.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat2x4.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat2x4.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00048_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00048_source.html\">mat2x4.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00048_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat2x4.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat2x4.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00048.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00110.html\">detail/type_mat2x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">lowp_mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">mediump_mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">highp_mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00110_html\"><div class=\"ttname\"><a href=\"a00110.html\">type_mat2x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga3b030d815c7c9f77c3c47e708863fd62\"><div class=\"ttname\"><a href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">glm::highp_mat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, float, highp &gt; highp_mat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00125\">type_mat.hpp:125</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaa190a86a477360f02508191a6549efc3\"><div class=\"ttname\"><a href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">glm::mediump_mat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, float, mediump &gt; mediump_mat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00118\">type_mat.hpp:118</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gae6e9638a6d1cadbd22f27c02998ebbf8\"><div class=\"ttname\"><a href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">glm::lowp_mat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, float, lowp &gt; lowp_mat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00111\">type_mat.hpp:111</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00049.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat3x2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat3x2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00049_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00049_source.html\">mat3x2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00049_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat3x2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat3x2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00049.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00111.html\">detail/type_mat3x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">lowp_mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">mediump_mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">highp_mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;}<span class=\"comment\">//namespace</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga66a044feff0a17b1bf275bc8d200e514\"><div class=\"ttname\"><a href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">glm::mediump_mat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, float, mediump &gt; mediump_mat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00144\">type_mat.hpp:144</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga12276a2b151d87c039134c388b5a3746\"><div class=\"ttname\"><a href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">glm::highp_mat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, float, highp &gt; highp_mat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00151\">type_mat.hpp:151</a></div></div>\n<div class=\"ttc\" id=\"a00111_html\"><div class=\"ttname\"><a href=\"a00111.html\">type_mat3x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga10f0f2108800a543f22d90ecf4b40d01\"><div class=\"ttname\"><a href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">glm::lowp_mat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, float, lowp &gt; lowp_mat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00137\">type_mat.hpp:137</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00050.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat3x3.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat3x3.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00050_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00050_source.html\">mat3x3.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00050_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat3x3.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat3x3.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00050.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00112.html\">detail/type_mat3x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">lowp_mat3</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">mediump_mat3</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">highp_mat3</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">lowp_mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">mediump_mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">highp_mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00145_html_gad31f8a0097ff6c22b92cf855dfffc575\"><div class=\"ttname\"><a href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">glm::mediump_mat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, mediump &gt; mediump_mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00170\">type_mat.hpp:170</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga9f30904176d75657930fa4383618f968\"><div class=\"ttname\"><a href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">glm::highp_mat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, highp &gt; highp_mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00177\">type_mat.hpp:177</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga1e4b7727038383e0103b138c66a65039\"><div class=\"ttname\"><a href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">glm::lowp_mat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, lowp &gt; lowp_mat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00184\">type_mat.hpp:184</a></div></div>\n<div class=\"ttc\" id=\"a00112_html\"><div class=\"ttname\"><a href=\"a00112.html\">type_mat3x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga2c78fa1875926e5c6684ae1f8b49092a\"><div class=\"ttname\"><a href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">glm::mediump_mat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, mediump &gt; mediump_mat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00191\">type_mat.hpp:191</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gacc4e277672e9f7b3cde23a4a3bd24fc9\"><div class=\"ttname\"><a href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">glm::lowp_mat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, lowp &gt; lowp_mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00163\">type_mat.hpp:163</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga1b33e2669c291268ac4b1c9c296d2dc3\"><div class=\"ttname\"><a href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">glm::highp_mat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, highp &gt; highp_mat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00198\">type_mat.hpp:198</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00051.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat3x4.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat3x4.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00051_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00051_source.html\">mat3x4.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00051_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat3x4.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat3x4.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00051.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00113.html\">detail/type_mat3x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">lowp_mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">mediump_mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, float, highp&gt;         <a class=\"code\" href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">highp_mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga5bcf41dd2acbace9ed7ae4326cb45e6e\"><div class=\"ttname\"><a href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">glm::mediump_mat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, float, mediump &gt; mediump_mat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00217\">type_mat.hpp:217</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gabb55c60d8c7fb400bf2ed511251ca394\"><div class=\"ttname\"><a href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">glm::highp_mat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, float, highp &gt; highp_mat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00224\">type_mat.hpp:224</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga42a7c3c9eafb869c000b4388913ce0c7\"><div class=\"ttname\"><a href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">glm::lowp_mat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, float, lowp &gt; lowp_mat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00210\">type_mat.hpp:210</a></div></div>\n<div class=\"ttc\" id=\"a00113_html\"><div class=\"ttname\"><a href=\"a00113.html\">type_mat3x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00052.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat4x2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat4x2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00052_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00052_source.html\">mat4x2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00052_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat4x2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat4x2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00052.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00114.html\">detail/type_mat4x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">lowp_mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">mediump_mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">highp_mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00145_html_ga9839115cb8be9524f0621caf4bb29665\"><div class=\"ttname\"><a href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">glm::lowp_mat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, float, lowp &gt; lowp_mat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00236\">type_mat.hpp:236</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00114_html\"><div class=\"ttname\"><a href=\"a00114.html\">type_mat4x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga39ba2335320534c19db435a27d8bb765\"><div class=\"ttname\"><a href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">glm::highp_mat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, float, highp &gt; highp_mat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00250\">type_mat.hpp:250</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaced6ccfdae150c4465be59c0b15f4d9e\"><div class=\"ttname\"><a href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">glm::mediump_mat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, float, mediump &gt; mediump_mat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00243\">type_mat.hpp:243</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00053.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat4x3.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat4x3.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00053_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00053_source.html\">mat4x3.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00053_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat4x3.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat4x3.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00053.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00115.html\">detail/type_mat4x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">lowp_mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">mediump_mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, float, highp&gt;         <a class=\"code\" href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">highp_mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00115_html\"><div class=\"ttname\"><a href=\"a00115.html\">type_mat4x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_gaf93a24b2e1c4a6f556fbcc796ec90e63\"><div class=\"ttname\"><a href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">glm::highp_mat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, float, highp &gt; highp_mat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00276\">type_mat.hpp:276</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga7eb333327f0b261237b540496137d55e\"><div class=\"ttname\"><a href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">glm::lowp_mat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, float, lowp &gt; lowp_mat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00262\">type_mat.hpp:262</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga1bab99cd9c4edd4bffdab662609b0961\"><div class=\"ttname\"><a href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">glm::mediump_mat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, float, mediump &gt; mediump_mat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00269\">type_mat.hpp:269</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00054.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat4x4.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat4x4.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00054_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00054_source.html\">mat4x4.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00054_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mat4x4.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mat4x4.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00054.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00116.html\">detail/type_mat4x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">lowp_mat4</a>;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">mediump_mat4</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">highp_mat4</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">lowp_mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, mediump&gt;               <a class=\"code\" href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">mediump_mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">highp_mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00145_html_ga0f910a2c5bf1c3fd153c4bc13cefee58\"><div class=\"ttname\"><a href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">glm::mediump_mat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, mediump &gt; mediump_mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00296\">type_mat.hpp:296</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga005facdef4caac0ef7435eee609c7e46\"><div class=\"ttname\"><a href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">glm::mediump_mat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, mediump &gt; mediump_mat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00317\">type_mat.hpp:317</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga332149037f33cec9d9b583e11c3c8524\"><div class=\"ttname\"><a href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">glm::highp_mat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, highp &gt; highp_mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00303\">type_mat.hpp:303</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga73e2f3bcae71b05736f2c962f98565a1\"><div class=\"ttname\"><a href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">glm::lowp_mat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, lowp &gt; lowp_mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00289\">type_mat.hpp:289</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga8378facff06c21d2092a9a13c9ef0a0b\"><div class=\"ttname\"><a href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">glm::lowp_mat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, lowp &gt; lowp_mat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00310\">type_mat.hpp:310</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga989736bc5e50330ef3ab13d34bebc66f\"><div class=\"ttname\"><a href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">glm::highp_mat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, highp &gt; highp_mat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00324\">type_mat.hpp:324</a></div></div>\n<div class=\"ttc\" id=\"a00116_html\"><div class=\"ttname\"><a href=\"a00116.html\">type_mat4x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00055.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00055_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gad7928795124768e058f99dce270f5c8d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad7928795124768e058f99dce270f5c8d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gad7928795124768e058f99dce270f5c8d\">determinant</a> (mat&lt; C, R, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gad7928795124768e058f99dce270f5c8d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the determinant of a squared matrix.  <a href=\"a00230.html#gad7928795124768e058f99dce270f5c8d\">More...</a><br /></td></tr>\n<tr class=\"separator:gad7928795124768e058f99dce270f5c8d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">inverse</a> (mat&lt; C, R, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the inverse of a squared matrix.  <a href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf14569404c779fedca98d0b9b8e58c1f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf14569404c779fedca98d0b9b8e58c1f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gaf14569404c779fedca98d0b9b8e58c1f\">matrixCompMult</a> (mat&lt; C, R, T, Q &gt; const &amp;x, mat&lt; C, R, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gaf14569404c779fedca98d0b9b8e58c1f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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].  <a href=\"a00230.html#gaf14569404c779fedca98d0b9b8e58c1f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf14569404c779fedca98d0b9b8e58c1f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac29fb7bae75a8e4c1b74cbbf85520e50\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac29fb7bae75a8e4c1b74cbbf85520e50\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL detail::outerProduct_trait&lt; C, R, T, Q &gt;::type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gac29fb7bae75a8e4c1b74cbbf85520e50\">outerProduct</a> (vec&lt; C, T, Q &gt; const &amp;c, vec&lt; R, T, Q &gt; const &amp;r)</td></tr>\n<tr class=\"memdesc:gac29fb7bae75a8e4c1b74cbbf85520e50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00230.html#gac29fb7bae75a8e4c1b74cbbf85520e50\">More...</a><br /></td></tr>\n<tr class=\"separator:gac29fb7bae75a8e4c1b74cbbf85520e50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae679d841da8ce9dbcc6c2d454f15bc35\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae679d841da8ce9dbcc6c2d454f15bc35\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;::transpose_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gae679d841da8ce9dbcc6c2d454f15bc35\">transpose</a> (mat&lt; C, R, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae679d841da8ce9dbcc6c2d454f15bc35\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the transposed matrix of x.  <a href=\"a00230.html#gae679d841da8ce9dbcc6c2d454f15bc35\">More...</a><br /></td></tr>\n<tr class=\"separator:gae679d841da8ce9dbcc6c2d454f15bc35\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00055_source.html\">matrix.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00055_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00055.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00082.html\">detail/qualifier.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">detail/type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00127.html\">vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00128.html\">vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00129.html\">vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00046.html\">mat2x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00047.html\">mat2x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00048.html\">mat2x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00049.html\">mat3x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00050.html\">mat3x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00051.html\">mat3x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00052.html\">mat4x2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00053.html\">mat4x3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00054.html\">mat4x4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a> {</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        <span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;2, 2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;2, 2, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;2, 3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;3, 2, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;2, 4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;4, 2, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;3, 2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;2, 3, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;3, 3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;3, 3, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;3, 4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;4, 3, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;4, 2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;2, 4, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;4, 3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;3, 4, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                <span class=\"keyword\">struct </span>outerProduct_trait&lt;4, 4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                        <span class=\"keyword\">typedef</span> mat&lt;4, 4, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        }<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        GLM_FUNC_DECL mat&lt;C, R, T, Q&gt; <a class=\"code\" href=\"a00230.html#gaf14569404c779fedca98d0b9b8e58c1f\">matrixCompMult</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> detail::outerProduct_trait&lt;C, R, T, Q&gt;::type <a class=\"code\" href=\"a00230.html#gac29fb7bae75a8e4c1b74cbbf85520e50\">outerProduct</a>(vec&lt;C, T, Q&gt; <span class=\"keyword\">const</span>&amp; c, vec&lt;R, T, Q&gt; <span class=\"keyword\">const</span>&amp; r);</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> mat&lt;C, R, T, Q&gt;::transpose_type <a class=\"code\" href=\"a00230.html#gae679d841da8ce9dbcc6c2d454f15bc35\">transpose</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00230.html#gad7928795124768e058f99dce270f5c8d\">determinant</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        GLM_FUNC_DECL mat&lt;C, R, T, Q&gt; <a class=\"code\" href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">inverse</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;<span class=\"preprocessor\">#include &quot;detail/func_matrix.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00127_html\"><div class=\"ttname\"><a href=\"a00127.html\">vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00047_html\"><div class=\"ttname\"><a href=\"a00047.html\">mat2x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00230_html_gacc53488cd254cbe33d1b505a72ef3719\"><div class=\"ttname\"><a href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">glm::inverse</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt; inverse(mat&lt; C, R, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Return the inverse of a squared matrix. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00050_html\"><div class=\"ttname\"><a href=\"a00050.html\">mat3x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00082_html\"><div class=\"ttname\"><a href=\"a00082.html\">qualifier.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00129_html\"><div class=\"ttname\"><a href=\"a00129.html\">vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00046_html\"><div class=\"ttname\"><a href=\"a00046.html\">mat2x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00230_html_gac29fb7bae75a8e4c1b74cbbf85520e50\"><div class=\"ttname\"><a href=\"a00230.html#gac29fb7bae75a8e4c1b74cbbf85520e50\">glm::outerProduct</a></div><div class=\"ttdeci\">GLM_FUNC_DECL detail::outerProduct_trait&lt; C, R, T, Q &gt;::type outerProduct(vec&lt; C, T, Q &gt; const &amp;c, vec&lt; R, T, Q &gt; const &amp;r)</div><div class=\"ttdoc\">Treats the first parameter c as a column vector and the second parameter r as a row vector and does a...</div></div>\n<div class=\"ttc\" id=\"a00049_html\"><div class=\"ttname\"><a href=\"a00049.html\">mat3x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00054_html\"><div class=\"ttname\"><a href=\"a00054.html\">mat4x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00052_html\"><div class=\"ttname\"><a href=\"a00052.html\">mat4x2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00230_html_gaf14569404c779fedca98d0b9b8e58c1f\"><div class=\"ttname\"><a href=\"a00230.html#gaf14569404c779fedca98d0b9b8e58c1f\">glm::matrixCompMult</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt; matrixCompMult(mat&lt; C, R, T, Q &gt; const &amp;x, mat&lt; C, R, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Multiply matrix x by matrix y component-wise, i.e., result[i][j] is the scalar product of x[i][j] and...</div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00230_html_gad7928795124768e058f99dce270f5c8d\"><div class=\"ttname\"><a href=\"a00230.html#gad7928795124768e058f99dce270f5c8d\">glm::determinant</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T determinant(mat&lt; C, R, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Return the determinant of a squared matrix. </div></div>\n<div class=\"ttc\" id=\"a00053_html\"><div class=\"ttname\"><a href=\"a00053.html\">mat4x3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00230_html_gae679d841da8ce9dbcc6c2d454f15bc35\"><div class=\"ttname\"><a href=\"a00230.html#gae679d841da8ce9dbcc6c2d454f15bc35\">glm::transpose</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;::transpose_type transpose(mat&lt; C, R, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the transposed matrix of x. </div></div>\n<div class=\"ttc\" id=\"a00128_html\"><div class=\"ttname\"><a href=\"a00128.html\">vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00051_html\"><div class=\"ttname\"><a href=\"a00051.html\">mat3x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00048_html\"><div class=\"ttname\"><a href=\"a00048.html\">mat2x4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00056.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_access.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_access.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00154.html\">GLM_GTC_matrix_access</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00056_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga96022eb0d3fae39d89fc7a954e59b374\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga96022eb0d3fae39d89fc7a954e59b374\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::col_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html#ga96022eb0d3fae39d89fc7a954e59b374\">column</a> (genType const &amp;m, length_t index)</td></tr>\n<tr class=\"memdesc:ga96022eb0d3fae39d89fc7a954e59b374\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Get a specific column of a matrix.  <a href=\"a00154.html#ga96022eb0d3fae39d89fc7a954e59b374\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96022eb0d3fae39d89fc7a954e59b374\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9e757377523890e8b80c5843dbe4dd15\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9e757377523890e8b80c5843dbe4dd15\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html#ga9e757377523890e8b80c5843dbe4dd15\">column</a> (genType const &amp;m, length_t index, typename genType::col_type const &amp;x)</td></tr>\n<tr class=\"memdesc:ga9e757377523890e8b80c5843dbe4dd15\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set a specific column to a matrix.  <a href=\"a00154.html#ga9e757377523890e8b80c5843dbe4dd15\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9e757377523890e8b80c5843dbe4dd15\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga259e5ebd0f31ec3f83440f8cae7f5dba\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga259e5ebd0f31ec3f83440f8cae7f5dba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::row_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html#ga259e5ebd0f31ec3f83440f8cae7f5dba\">row</a> (genType const &amp;m, length_t index)</td></tr>\n<tr class=\"memdesc:ga259e5ebd0f31ec3f83440f8cae7f5dba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Get a specific row of a matrix.  <a href=\"a00154.html#ga259e5ebd0f31ec3f83440f8cae7f5dba\">More...</a><br /></td></tr>\n<tr class=\"separator:ga259e5ebd0f31ec3f83440f8cae7f5dba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaadcc64829aadf4103477679e48c7594f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaadcc64829aadf4103477679e48c7594f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html#gaadcc64829aadf4103477679e48c7594f\">row</a> (genType const &amp;m, length_t index, typename genType::row_type const &amp;x)</td></tr>\n<tr class=\"memdesc:gaadcc64829aadf4103477679e48c7594f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set a specific row to a matrix.  <a href=\"a00154.html#gaadcc64829aadf4103477679e48c7594f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaadcc64829aadf4103477679e48c7594f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00154.html\">GLM_GTC_matrix_access</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00056_source.html\">matrix_access.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00056_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_access.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_access.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00056.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_matrix_access extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> genType::row_type <a class=\"code\" href=\"a00154.html#gaadcc64829aadf4103477679e48c7594f\">row</a>(</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                genType <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;                length_t index);</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00154.html#gaadcc64829aadf4103477679e48c7594f\">row</a>(</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                genType <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                length_t index,</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                <span class=\"keyword\">typename</span> genType::row_type <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> genType::col_type <a class=\"code\" href=\"a00154.html#ga9e757377523890e8b80c5843dbe4dd15\">column</a>(</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                genType <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                length_t index);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00154.html#ga9e757377523890e8b80c5843dbe4dd15\">column</a>(</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                genType <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                length_t index,</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                <span class=\"keyword\">typename</span> genType::col_type <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_access.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00154_html_gaadcc64829aadf4103477679e48c7594f\"><div class=\"ttname\"><a href=\"a00154.html#gaadcc64829aadf4103477679e48c7594f\">glm::row</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType row(genType const &amp;m, length_t index, typename genType::row_type const &amp;x)</div><div class=\"ttdoc\">Set a specific row to a matrix. </div></div>\n<div class=\"ttc\" id=\"a00154_html_ga9e757377523890e8b80c5843dbe4dd15\"><div class=\"ttname\"><a href=\"a00154.html#ga9e757377523890e8b80c5843dbe4dd15\">glm::column</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType column(genType const &amp;m, length_t index, typename genType::col_type const &amp;x)</div><div class=\"ttdoc\">Set a specific column to a matrix. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00057.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_cross_product.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_cross_product.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00194.html\">GLM_GTX_matrix_cross_product</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00057_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga5802386bb4c37b3332a3b6fd8b6960ff\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5802386bb4c37b3332a3b6fd8b6960ff\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00194.html#ga5802386bb4c37b3332a3b6fd8b6960ff\">matrixCross3</a> (vec&lt; 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga5802386bb4c37b3332a3b6fd8b6960ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a cross product matrix.  <a href=\"a00194.html#ga5802386bb4c37b3332a3b6fd8b6960ff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5802386bb4c37b3332a3b6fd8b6960ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20057fff91ddafa102934adb25458cde\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga20057fff91ddafa102934adb25458cde\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00194.html#ga20057fff91ddafa102934adb25458cde\">matrixCross4</a> (vec&lt; 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga20057fff91ddafa102934adb25458cde\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a cross product matrix.  <a href=\"a00194.html#ga20057fff91ddafa102934adb25458cde\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20057fff91ddafa102934adb25458cde\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00194.html\">GLM_GTX_matrix_cross_product</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_extented_min_max (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00057_source.html\">matrix_cross_product.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00057_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_cross_product.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_cross_product.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00057.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_matrix_cross_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_matrix_cross_product extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00194.html#ga5802386bb4c37b3332a3b6fd8b6960ff\">matrixCross3</a>(</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00194.html#ga20057fff91ddafa102934adb25458cde\">matrixCross4</a>(</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_cross_product.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00194_html_ga20057fff91ddafa102934adb25458cde\"><div class=\"ttname\"><a href=\"a00194.html#ga20057fff91ddafa102934adb25458cde\">glm::matrixCross4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; matrixCross4(vec&lt; 3, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Build a cross product matrix. </div></div>\n<div class=\"ttc\" id=\"a00194_html_ga5802386bb4c37b3332a3b6fd8b6960ff\"><div class=\"ttname\"><a href=\"a00194.html#ga5802386bb4c37b3332a3b6fd8b6960ff\">glm::matrixCross3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; matrixCross3(vec&lt; 3, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Build a cross product matrix. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00058.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_decompose.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_decompose.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00195.html\">GLM_GTX_matrix_decompose</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00058_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga91185463739c855d602596907a9994bc\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga91185463739c855d602596907a9994bc\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00195.html#ga91185463739c855d602596907a9994bc\">decompose</a> (mat&lt; 4, 4, T, Q &gt; const &amp;modelMatrix, vec&lt; 3, T, Q &gt; &amp;scale, tquat&lt; T, Q &gt; &amp;orientation, vec&lt; 3, T, Q &gt; &amp;translation, vec&lt; 3, T, Q &gt; &amp;skew, vec&lt; 4, T, Q &gt; &amp;perspective)</td></tr>\n<tr class=\"memdesc:ga91185463739c855d602596907a9994bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Decomposes a model matrix to translations, rotation and scale components.  <a href=\"a00195.html#ga91185463739c855d602596907a9994bc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91185463739c855d602596907a9994bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00195.html\">GLM_GTX_matrix_decompose</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00058_source.html\">matrix_decompose.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00058_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_decompose.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_decompose.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00058.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../geometric.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/matrix_transform.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_matrix_decompose is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_matrix_decompose extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00195.html#ga91185463739c855d602596907a9994bc\">decompose</a>(</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; modelMatrix,</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                vec&lt;3, T, Q&gt; &amp; <a class=\"code\" href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">scale</a>, tquat&lt;T, Q&gt; &amp; <a class=\"code\" href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">orientation</a>, vec&lt;3, T, Q&gt; &amp; translation, vec&lt;3, T, Q&gt; &amp; skew, vec&lt;4, T, Q&gt; &amp; <a class=\"code\" href=\"a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787\">perspective</a>);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_decompose.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00195_html_ga91185463739c855d602596907a9994bc\"><div class=\"ttname\"><a href=\"a00195.html#ga91185463739c855d602596907a9994bc\">glm::decompose</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool decompose(mat&lt; 4, 4, T, Q &gt; const &amp;modelMatrix, vec&lt; 3, T, Q &gt; &amp;scale, tquat&lt; T, Q &gt; &amp;orientation, vec&lt; 3, T, Q &gt; &amp;translation, vec&lt; 3, T, Q &gt; &amp;skew, vec&lt; 4, T, Q &gt; &amp;perspective)</div><div class=\"ttdoc\">Decomposes a model matrix to translations, rotation and scale components. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00157_html_ga05051adbee603fb3c5095d8cf5cc229b\"><div class=\"ttname\"><a href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">glm::scale</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; scale(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Builds a scale 4 * 4 matrix created from 3 scalars. </div></div>\n<div class=\"ttc\" id=\"a00216_html_ga1a32fceb71962e6160e8af295c91930a\"><div class=\"ttname\"><a href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">glm::orientation</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; orientation(vec&lt; 3, T, Q &gt; const &amp;Normal, vec&lt; 3, T, Q &gt; const &amp;Up)</div><div class=\"ttdoc\">Build a rotation matrix from a normal and a up vector. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga747c8cf99458663dd7ad1bb3a2f07787\"><div class=\"ttname\"><a href=\"a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787\">glm::perspective</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; perspective(T fovy, T aspect, T near, T far)</div><div class=\"ttdoc\">Creates a matrix for a symetric perspective-view frustum based on the default handedness. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00059.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_factorisation.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_factorisation.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00196.html\">GLM_GTX_matrix_factorisation</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00059_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaf39f4e5f78eb29c1a90277d45b9b3feb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf39f4e5f78eb29c1a90277d45b9b3feb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html#gaf39f4e5f78eb29c1a90277d45b9b3feb\">fliplr</a> (mat&lt; C, R, T, Q &gt; const &amp;in)</td></tr>\n<tr class=\"memdesc:gaf39f4e5f78eb29c1a90277d45b9b3feb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Flips the matrix columns right and left.  <a href=\"a00196.html#gaf39f4e5f78eb29c1a90277d45b9b3feb\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf39f4e5f78eb29c1a90277d45b9b3feb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85003371f0ba97380dd25e8905de1870\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga85003371f0ba97380dd25e8905de1870\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html#ga85003371f0ba97380dd25e8905de1870\">flipud</a> (mat&lt; C, R, T, Q &gt; const &amp;in)</td></tr>\n<tr class=\"memdesc:ga85003371f0ba97380dd25e8905de1870\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Flips the matrix rows up and down.  <a href=\"a00196.html#ga85003371f0ba97380dd25e8905de1870\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85003371f0ba97380dd25e8905de1870\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac62d7bfc8dc661e616620d70552cd566\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac62d7bfc8dc661e616620d70552cd566\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html#gac62d7bfc8dc661e616620d70552cd566\">qr_decompose</a> (mat&lt; C, R, T, Q &gt; const &amp;in, mat&lt;(C&lt; R?C:R), R, T, Q &gt; &amp;q, mat&lt; C,(C&lt; R?C:R), T, Q &gt; &amp;r)</td></tr>\n<tr class=\"memdesc:gac62d7bfc8dc661e616620d70552cd566\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Performs QR factorisation of a matrix.  <a href=\"a00196.html#gac62d7bfc8dc661e616620d70552cd566\">More...</a><br /></td></tr>\n<tr class=\"separator:gac62d7bfc8dc661e616620d70552cd566\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga82874e2ebe891ba35ac21d9993873758\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga82874e2ebe891ba35ac21d9993873758\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html#ga82874e2ebe891ba35ac21d9993873758\">rq_decompose</a> (mat&lt; C, R, T, Q &gt; const &amp;in, mat&lt;(C&lt; R?C:R), R, T, Q &gt; &amp;r, mat&lt; C,(C&lt; R?C:R), T, Q &gt; &amp;q)</td></tr>\n<tr class=\"memdesc:ga82874e2ebe891ba35ac21d9993873758\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Performs RQ factorisation of a matrix.  <a href=\"a00196.html#ga82874e2ebe891ba35ac21d9993873758\">More...</a><br /></td></tr>\n<tr class=\"separator:ga82874e2ebe891ba35ac21d9993873758\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00196.html\">GLM_GTX_matrix_factorisation</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00059_source.html\">matrix_factorisation.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00059_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_factorisation.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_factorisation.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00059.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_matrix_factorisation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_matrix_factorisation extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"comment\">Suggestions:</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"comment\"> - Move helper functions flipud and fliplr to another file: They may be helpful in more general circumstances.</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"comment\"> - Implement other types of matrix factorisation, such as: QL and LQ, L(D)U, eigendecompositions, etc...</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"comment\">*/</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span> &lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL mat&lt;C, R, T, Q&gt; <a class=\"code\" href=\"a00196.html#ga85003371f0ba97380dd25e8905de1870\">flipud</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; in);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span> &lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL mat&lt;C, R, T, Q&gt; <a class=\"code\" href=\"a00196.html#gaf39f4e5f78eb29c1a90277d45b9b3feb\">fliplr</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; in);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span> &lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">void</span> <a class=\"code\" href=\"a00196.html#gac62d7bfc8dc661e616620d70552cd566\">qr_decompose</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; in, mat&lt;(C &lt; R ? C : R), R, T, Q&gt;&amp; q, mat&lt;C, (C &lt; R ? C : R), T, Q&gt;&amp; r);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">template</span> &lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">void</span> <a class=\"code\" href=\"a00196.html#ga82874e2ebe891ba35ac21d9993873758\">rq_decompose</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; in, mat&lt;(C &lt; R ? C : R), R, T, Q&gt;&amp; r, mat&lt;C, (C &lt; R ? C : R), T, Q&gt;&amp; q);</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;}</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_factorisation.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00196_html_gaf39f4e5f78eb29c1a90277d45b9b3feb\"><div class=\"ttname\"><a href=\"a00196.html#gaf39f4e5f78eb29c1a90277d45b9b3feb\">glm::fliplr</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt; fliplr(mat&lt; C, R, T, Q &gt; const &amp;in)</div><div class=\"ttdoc\">Flips the matrix columns right and left. </div></div>\n<div class=\"ttc\" id=\"a00196_html_ga82874e2ebe891ba35ac21d9993873758\"><div class=\"ttname\"><a href=\"a00196.html#ga82874e2ebe891ba35ac21d9993873758\">glm::rq_decompose</a></div><div class=\"ttdeci\">GLM_FUNC_DECL void rq_decompose(mat&lt; C, R, T, Q &gt; const &amp;in, mat&lt;(C&lt; R?C:R), R, T, Q &gt; &amp;r, mat&lt; C,(C&lt; R?C:R), T, Q &gt; &amp;q)</div><div class=\"ttdoc\">Performs RQ factorisation of a matrix. </div></div>\n<div class=\"ttc\" id=\"a00196_html_ga85003371f0ba97380dd25e8905de1870\"><div class=\"ttname\"><a href=\"a00196.html#ga85003371f0ba97380dd25e8905de1870\">glm::flipud</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt; flipud(mat&lt; C, R, T, Q &gt; const &amp;in)</div><div class=\"ttdoc\">Flips the matrix rows up and down. </div></div>\n<div class=\"ttc\" id=\"a00196_html_gac62d7bfc8dc661e616620d70552cd566\"><div class=\"ttname\"><a href=\"a00196.html#gac62d7bfc8dc661e616620d70552cd566\">glm::qr_decompose</a></div><div class=\"ttdeci\">GLM_FUNC_DECL void qr_decompose(mat&lt; C, R, T, Q &gt; const &amp;in, mat&lt;(C&lt; R?C:R), R, T, Q &gt; &amp;q, mat&lt; C,(C&lt; R?C:R), T, Q &gt; &amp;r)</div><div class=\"ttdoc\">Performs QR factorisation of a matrix. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00060.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_integer.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_integer.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00155.html\">GLM_GTC_matrix_integer</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00060_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga8499cc3b016003f835314c1c756e9db9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8499cc3b016003f835314c1c756e9db9\">highp_imat2</a></td></tr>\n<tr class=\"memdesc:ga8499cc3b016003f835314c1c756e9db9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#ga8499cc3b016003f835314c1c756e9db9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8499cc3b016003f835314c1c756e9db9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa389e2d1c3b10941cae870bc0aeba5b3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3\">highp_imat2x2</a></td></tr>\n<tr class=\"memdesc:gaa389e2d1c3b10941cae870bc0aeba5b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa389e2d1c3b10941cae870bc0aeba5b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaba49d890e06c9444795f5a133fbf1336\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaba49d890e06c9444795f5a133fbf1336\">highp_imat2x3</a></td></tr>\n<tr class=\"memdesc:gaba49d890e06c9444795f5a133fbf1336\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 2x3 matrix.  <a href=\"a00155.html#gaba49d890e06c9444795f5a133fbf1336\">More...</a><br /></td></tr>\n<tr class=\"separator:gaba49d890e06c9444795f5a133fbf1336\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga05a970fd4366dad6c8a0be676b1eae5b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b\">highp_imat2x4</a></td></tr>\n<tr class=\"memdesc:ga05a970fd4366dad6c8a0be676b1eae5b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 2x4 matrix.  <a href=\"a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga05a970fd4366dad6c8a0be676b1eae5b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaca4506a3efa679eff7c006d9826291fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaca4506a3efa679eff7c006d9826291fd\">highp_imat3</a></td></tr>\n<tr class=\"memdesc:gaca4506a3efa679eff7c006d9826291fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#gaca4506a3efa679eff7c006d9826291fd\">More...</a><br /></td></tr>\n<tr class=\"separator:gaca4506a3efa679eff7c006d9826291fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91c671c3ff9706c2393e78b22fd84bcb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb\">highp_imat3x2</a></td></tr>\n<tr class=\"memdesc:ga91c671c3ff9706c2393e78b22fd84bcb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 3x2 matrix.  <a href=\"a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91c671c3ff9706c2393e78b22fd84bcb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga07d7b7173e2a6f843ff5f1c615a95b41\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41\">highp_imat3x3</a></td></tr>\n<tr class=\"memdesc:ga07d7b7173e2a6f843ff5f1c615a95b41\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41\">More...</a><br /></td></tr>\n<tr class=\"separator:ga07d7b7173e2a6f843ff5f1c615a95b41\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga53008f580be99018a17b357b5a4ffc0d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga53008f580be99018a17b357b5a4ffc0d\">highp_imat3x4</a></td></tr>\n<tr class=\"memdesc:ga53008f580be99018a17b357b5a4ffc0d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 3x4 matrix.  <a href=\"a00155.html#ga53008f580be99018a17b357b5a4ffc0d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga53008f580be99018a17b357b5a4ffc0d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7cfb09b34e0fcf73eaf6512d6483ef56\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56\">highp_imat4</a></td></tr>\n<tr class=\"memdesc:ga7cfb09b34e0fcf73eaf6512d6483ef56\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7cfb09b34e0fcf73eaf6512d6483ef56\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1858820fb292cae396408b2034407f72\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1858820fb292cae396408b2034407f72\">highp_imat4x2</a></td></tr>\n<tr class=\"memdesc:ga1858820fb292cae396408b2034407f72\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 4x2 matrix.  <a href=\"a00155.html#ga1858820fb292cae396408b2034407f72\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1858820fb292cae396408b2034407f72\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6be0b80ae74bb309bc5b964d93d68fc5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5\">highp_imat4x3</a></td></tr>\n<tr class=\"memdesc:ga6be0b80ae74bb309bc5b964d93d68fc5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 4x3 matrix.  <a href=\"a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6be0b80ae74bb309bc5b964d93d68fc5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c783ee6f8f040ab37df2f70392c8b44\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44\">highp_imat4x4</a></td></tr>\n<tr class=\"memdesc:ga2c783ee6f8f040ab37df2f70392c8b44\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c783ee6f8f040ab37df2f70392c8b44\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42cbce64c4c1cd121b8437daa6e110de\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga42cbce64c4c1cd121b8437daa6e110de\">highp_umat2</a></td></tr>\n<tr class=\"memdesc:ga42cbce64c4c1cd121b8437daa6e110de\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga42cbce64c4c1cd121b8437daa6e110de\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42cbce64c4c1cd121b8437daa6e110de\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5337b7bc95f9cbac08a0c00b3f936b28\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28\">highp_umat2x2</a></td></tr>\n<tr class=\"memdesc:ga5337b7bc95f9cbac08a0c00b3f936b28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5337b7bc95f9cbac08a0c00b3f936b28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga90718c7128320b24b52f9ea70e643ad4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga90718c7128320b24b52f9ea70e643ad4\">highp_umat2x3</a></td></tr>\n<tr class=\"memdesc:ga90718c7128320b24b52f9ea70e643ad4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 2x3 matrix.  <a href=\"a00155.html#ga90718c7128320b24b52f9ea70e643ad4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga90718c7128320b24b52f9ea70e643ad4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadca0a4724b4a6f56a2355b6f6e19248b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b\">highp_umat2x4</a></td></tr>\n<tr class=\"memdesc:gadca0a4724b4a6f56a2355b6f6e19248b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 2x4 matrix.  <a href=\"a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b\">More...</a><br /></td></tr>\n<tr class=\"separator:gadca0a4724b4a6f56a2355b6f6e19248b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa1143120339b7d2d469d327662e8a172\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa1143120339b7d2d469d327662e8a172\">highp_umat3</a></td></tr>\n<tr class=\"memdesc:gaa1143120339b7d2d469d327662e8a172\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#gaa1143120339b7d2d469d327662e8a172\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa1143120339b7d2d469d327662e8a172\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga844a5da2e7fc03fc7cccc7f1b70809c4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4\">highp_umat3x2</a></td></tr>\n<tr class=\"memdesc:ga844a5da2e7fc03fc7cccc7f1b70809c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 3x2 matrix.  <a href=\"a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga844a5da2e7fc03fc7cccc7f1b70809c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f7d41c36b980774a4d2e7c1647fb4b2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2\">highp_umat3x3</a></td></tr>\n<tr class=\"memdesc:ga1f7d41c36b980774a4d2e7c1647fb4b2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f7d41c36b980774a4d2e7c1647fb4b2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga25ee15c323924f2d0fe9896d329e5086\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga25ee15c323924f2d0fe9896d329e5086\">highp_umat3x4</a></td></tr>\n<tr class=\"memdesc:ga25ee15c323924f2d0fe9896d329e5086\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 3x4 matrix.  <a href=\"a00155.html#ga25ee15c323924f2d0fe9896d329e5086\">More...</a><br /></td></tr>\n<tr class=\"separator:ga25ee15c323924f2d0fe9896d329e5086\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf665e4e78c2cc32a54ab40325738f9c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9\">highp_umat4</a></td></tr>\n<tr class=\"memdesc:gaf665e4e78c2cc32a54ab40325738f9c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf665e4e78c2cc32a54ab40325738f9c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae69eb82ec08b0dc9bf2ead2a339ff801\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801\">highp_umat4x2</a></td></tr>\n<tr class=\"memdesc:gae69eb82ec08b0dc9bf2ead2a339ff801\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 4x2 matrix.  <a href=\"a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801\">More...</a><br /></td></tr>\n<tr class=\"separator:gae69eb82ec08b0dc9bf2ead2a339ff801\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga45a8163d02c43216252056b0c120f3a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga45a8163d02c43216252056b0c120f3a5\">highp_umat4x3</a></td></tr>\n<tr class=\"memdesc:ga45a8163d02c43216252056b0c120f3a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 4x3 matrix.  <a href=\"a00155.html#ga45a8163d02c43216252056b0c120f3a5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga45a8163d02c43216252056b0c120f3a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6a56cbb769aed334c95241664415f9ba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6a56cbb769aed334c95241664415f9ba\">highp_umat4x4</a></td></tr>\n<tr class=\"memdesc:ga6a56cbb769aed334c95241664415f9ba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#ga6a56cbb769aed334c95241664415f9ba\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6a56cbb769aed334c95241664415f9ba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabe04f9948d4a213bb1c20137de03e01\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">imat2</a></td></tr>\n<tr class=\"memdesc:gaabe04f9948d4a213bb1c20137de03e01\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 2x2 matrix.  <a href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabe04f9948d4a213bb1c20137de03e01\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4732a240522ad9bc28144fda2fc14ec\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">imat2x2</a></td></tr>\n<tr class=\"memdesc:gaa4732a240522ad9bc28144fda2fc14ec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 2x2 matrix.  <a href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa4732a240522ad9bc28144fda2fc14ec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3f42dd3d5d94a0fd5706f7ec8dd0c605\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">imat2x3</a></td></tr>\n<tr class=\"memdesc:ga3f42dd3d5d94a0fd5706f7ec8dd0c605\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 2x3 matrix.  <a href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3f42dd3d5d94a0fd5706f7ec8dd0c605\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9d8faafdca42583d67e792dd038fc668\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">imat2x4</a></td></tr>\n<tr class=\"memdesc:ga9d8faafdca42583d67e792dd038fc668\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 2x4 matrix.  <a href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9d8faafdca42583d67e792dd038fc668\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga038f68437155ffa3c2583a15264a8195\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">imat3</a></td></tr>\n<tr class=\"memdesc:ga038f68437155ffa3c2583a15264a8195\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 3x3 matrix.  <a href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">More...</a><br /></td></tr>\n<tr class=\"separator:ga038f68437155ffa3c2583a15264a8195\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b33bbe4f12c060892bd3cc8d4cd737f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">imat3x2</a></td></tr>\n<tr class=\"memdesc:ga7b33bbe4f12c060892bd3cc8d4cd737f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 3x2 matrix.  <a href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7b33bbe4f12c060892bd3cc8d4cd737f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6aacc960f62e8f7d2fe9d32d5050e7a4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">imat3x3</a></td></tr>\n<tr class=\"memdesc:ga6aacc960f62e8f7d2fe9d32d5050e7a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 3x3 matrix.  <a href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6aacc960f62e8f7d2fe9d32d5050e7a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e9ce23496d8b08dfc302d4039694b58\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">imat3x4</a></td></tr>\n<tr class=\"memdesc:ga6e9ce23496d8b08dfc302d4039694b58\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 3x4 matrix.  <a href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e9ce23496d8b08dfc302d4039694b58\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga96b0d26a33b81bb6a60ca0f39682f7eb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">imat4</a></td></tr>\n<tr class=\"memdesc:ga96b0d26a33b81bb6a60ca0f39682f7eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 4x4 matrix.  <a href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96b0d26a33b81bb6a60ca0f39682f7eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8ce7ef51d8b2c1901fa5414deccbc3fa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">imat4x2</a></td></tr>\n<tr class=\"memdesc:ga8ce7ef51d8b2c1901fa5414deccbc3fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 4x2 matrix.  <a href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8ce7ef51d8b2c1901fa5414deccbc3fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga705ee0bf49d6c3de4404ce2481bf0df5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">imat4x3</a></td></tr>\n<tr class=\"memdesc:ga705ee0bf49d6c3de4404ce2481bf0df5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 4x3 matrix.  <a href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga705ee0bf49d6c3de4404ce2481bf0df5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga43ed5e4f475b6f4cad7cba78f29c405b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">imat4x4</a></td></tr>\n<tr class=\"memdesc:ga43ed5e4f475b6f4cad7cba78f29c405b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 4x4 matrix.  <a href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga43ed5e4f475b6f4cad7cba78f29c405b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0bff0be804142bb16d441aec0a7962e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa0bff0be804142bb16d441aec0a7962e\">lowp_imat2</a></td></tr>\n<tr class=\"memdesc:gaa0bff0be804142bb16d441aec0a7962e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#gaa0bff0be804142bb16d441aec0a7962e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0bff0be804142bb16d441aec0a7962e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga92b95b679975d408645547ab45a8dcd8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga92b95b679975d408645547ab45a8dcd8\">lowp_imat2x2</a></td></tr>\n<tr class=\"memdesc:ga92b95b679975d408645547ab45a8dcd8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#ga92b95b679975d408645547ab45a8dcd8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga92b95b679975d408645547ab45a8dcd8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8c9e7a388f8e7c52f1e6857dee8afb65\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65\">lowp_imat2x3</a></td></tr>\n<tr class=\"memdesc:ga8c9e7a388f8e7c52f1e6857dee8afb65\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 2x3 matrix.  <a href=\"a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8c9e7a388f8e7c52f1e6857dee8afb65\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9cc13bd1f8dd2933e9fa31fe3f70e16e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e\">lowp_imat2x4</a></td></tr>\n<tr class=\"memdesc:ga9cc13bd1f8dd2933e9fa31fe3f70e16e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 2x4 matrix.  <a href=\"a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9cc13bd1f8dd2933e9fa31fe3f70e16e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga69bfe668f4170379fc1f35d82b060c43\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga69bfe668f4170379fc1f35d82b060c43\">lowp_imat3</a></td></tr>\n<tr class=\"memdesc:ga69bfe668f4170379fc1f35d82b060c43\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#ga69bfe668f4170379fc1f35d82b060c43\">More...</a><br /></td></tr>\n<tr class=\"separator:ga69bfe668f4170379fc1f35d82b060c43\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga33db8f27491d30906cd37c0d86b3f432\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga33db8f27491d30906cd37c0d86b3f432\">lowp_imat3x2</a></td></tr>\n<tr class=\"memdesc:ga33db8f27491d30906cd37c0d86b3f432\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 3x2 matrix.  <a href=\"a00155.html#ga33db8f27491d30906cd37c0d86b3f432\">More...</a><br /></td></tr>\n<tr class=\"separator:ga33db8f27491d30906cd37c0d86b3f432\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga664f061df00020048c3f8530329ace45\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga664f061df00020048c3f8530329ace45\">lowp_imat3x3</a></td></tr>\n<tr class=\"memdesc:ga664f061df00020048c3f8530329ace45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#ga664f061df00020048c3f8530329ace45\">More...</a><br /></td></tr>\n<tr class=\"separator:ga664f061df00020048c3f8530329ace45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9273faab33623d944af4080befbb2c80\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga9273faab33623d944af4080befbb2c80\">lowp_imat3x4</a></td></tr>\n<tr class=\"memdesc:ga9273faab33623d944af4080befbb2c80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 3x4 matrix.  <a href=\"a00155.html#ga9273faab33623d944af4080befbb2c80\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9273faab33623d944af4080befbb2c80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1e77f7270cad461ca4fcb4c3ec2e98c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c\">lowp_imat4</a></td></tr>\n<tr class=\"memdesc:gad1e77f7270cad461ca4fcb4c3ec2e98c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c\">More...</a><br /></td></tr>\n<tr class=\"separator:gad1e77f7270cad461ca4fcb4c3ec2e98c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga26ec1a2ba08a1488f5f05336858a0f09\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09\">lowp_imat4x2</a></td></tr>\n<tr class=\"memdesc:ga26ec1a2ba08a1488f5f05336858a0f09\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 4x2 matrix.  <a href=\"a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09\">More...</a><br /></td></tr>\n<tr class=\"separator:ga26ec1a2ba08a1488f5f05336858a0f09\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f40483a3ae634ead8ad22272c543a33\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8f40483a3ae634ead8ad22272c543a33\">lowp_imat4x3</a></td></tr>\n<tr class=\"memdesc:ga8f40483a3ae634ead8ad22272c543a33\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 4x3 matrix.  <a href=\"a00155.html#ga8f40483a3ae634ead8ad22272c543a33\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f40483a3ae634ead8ad22272c543a33\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf65677e53ac8e31a107399340d5e2451\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf65677e53ac8e31a107399340d5e2451\">lowp_imat4x4</a></td></tr>\n<tr class=\"memdesc:gaf65677e53ac8e31a107399340d5e2451\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#gaf65677e53ac8e31a107399340d5e2451\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf65677e53ac8e31a107399340d5e2451\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2fba702d990437fc88ff3f3a76846ee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf2fba702d990437fc88ff3f3a76846ee\">lowp_umat2</a></td></tr>\n<tr class=\"memdesc:gaf2fba702d990437fc88ff3f3a76846ee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#gaf2fba702d990437fc88ff3f3a76846ee\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2fba702d990437fc88ff3f3a76846ee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b2e9d89745f7175051284e54c81d81c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga7b2e9d89745f7175051284e54c81d81c\">lowp_umat2x2</a></td></tr>\n<tr class=\"memdesc:ga7b2e9d89745f7175051284e54c81d81c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga7b2e9d89745f7175051284e54c81d81c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7b2e9d89745f7175051284e54c81d81c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3072f90fd86f17a862e21589fbb14c0f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga3072f90fd86f17a862e21589fbb14c0f\">lowp_umat2x3</a></td></tr>\n<tr class=\"memdesc:ga3072f90fd86f17a862e21589fbb14c0f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 2x3 matrix.  <a href=\"a00155.html#ga3072f90fd86f17a862e21589fbb14c0f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3072f90fd86f17a862e21589fbb14c0f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8bb45fec4bd77bd81b4ae7eb961a270d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d\">lowp_umat2x4</a></td></tr>\n<tr class=\"memdesc:ga8bb45fec4bd77bd81b4ae7eb961a270d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 2x4 matrix.  <a href=\"a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8bb45fec4bd77bd81b4ae7eb961a270d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf1145f72bcdd590f5808c4bc170c2924\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf1145f72bcdd590f5808c4bc170c2924\">lowp_umat3</a></td></tr>\n<tr class=\"memdesc:gaf1145f72bcdd590f5808c4bc170c2924\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#gaf1145f72bcdd590f5808c4bc170c2924\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf1145f72bcdd590f5808c4bc170c2924\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga56ea68c6a6cba8d8c21d17bb14e69c6b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b\">lowp_umat3x2</a></td></tr>\n<tr class=\"memdesc:ga56ea68c6a6cba8d8c21d17bb14e69c6b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 3x2 matrix.  <a href=\"a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga56ea68c6a6cba8d8c21d17bb14e69c6b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f660a39a395cc14f018f985e7dfbeb5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5\">lowp_umat3x3</a></td></tr>\n<tr class=\"memdesc:ga4f660a39a395cc14f018f985e7dfbeb5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f660a39a395cc14f018f985e7dfbeb5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec3d624306bd59649f021864709d56b5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaec3d624306bd59649f021864709d56b5\">lowp_umat3x4</a></td></tr>\n<tr class=\"memdesc:gaec3d624306bd59649f021864709d56b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 3x4 matrix.  <a href=\"a00155.html#gaec3d624306bd59649f021864709d56b5\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec3d624306bd59649f021864709d56b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac092c6105827bf9ea080db38074b78eb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gac092c6105827bf9ea080db38074b78eb\">lowp_umat4</a></td></tr>\n<tr class=\"memdesc:gac092c6105827bf9ea080db38074b78eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#gac092c6105827bf9ea080db38074b78eb\">More...</a><br /></td></tr>\n<tr class=\"separator:gac092c6105827bf9ea080db38074b78eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7716c2b210d141846f1ac4e774adef5e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga7716c2b210d141846f1ac4e774adef5e\">lowp_umat4x2</a></td></tr>\n<tr class=\"memdesc:ga7716c2b210d141846f1ac4e774adef5e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 4x2 matrix.  <a href=\"a00155.html#ga7716c2b210d141846f1ac4e774adef5e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7716c2b210d141846f1ac4e774adef5e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09ab33a2636f5f43f7fae29cfbc20fff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff\">lowp_umat4x3</a></td></tr>\n<tr class=\"memdesc:ga09ab33a2636f5f43f7fae29cfbc20fff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 4x3 matrix.  <a href=\"a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga09ab33a2636f5f43f7fae29cfbc20fff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga10aafc66cf1a0ece336b1c5ae13d0cc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0\">lowp_umat4x4</a></td></tr>\n<tr class=\"memdesc:ga10aafc66cf1a0ece336b1c5ae13d0cc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga10aafc66cf1a0ece336b1c5ae13d0cc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20f4cc7ab23e2aa1f4db9fdb5496d378\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378\">mediump_imat2</a></td></tr>\n<tr class=\"memdesc:ga20f4cc7ab23e2aa1f4db9fdb5496d378\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20f4cc7ab23e2aa1f4db9fdb5496d378\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b2aeb11a329940721dda9583e71f856\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga4b2aeb11a329940721dda9583e71f856\">mediump_imat2x2</a></td></tr>\n<tr class=\"memdesc:ga4b2aeb11a329940721dda9583e71f856\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#ga4b2aeb11a329940721dda9583e71f856\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b2aeb11a329940721dda9583e71f856\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74362470ba99843ac70aee5ac38cc674\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga74362470ba99843ac70aee5ac38cc674\">mediump_imat2x3</a></td></tr>\n<tr class=\"memdesc:ga74362470ba99843ac70aee5ac38cc674\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 2x3 matrix.  <a href=\"a00155.html#ga74362470ba99843ac70aee5ac38cc674\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74362470ba99843ac70aee5ac38cc674\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8da25cd380ba30fc5b68a4687deb3e09\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09\">mediump_imat2x4</a></td></tr>\n<tr class=\"memdesc:ga8da25cd380ba30fc5b68a4687deb3e09\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 2x4 matrix.  <a href=\"a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8da25cd380ba30fc5b68a4687deb3e09\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c63bdc736efd3466e0730de0251cb71\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6c63bdc736efd3466e0730de0251cb71\">mediump_imat3</a></td></tr>\n<tr class=\"memdesc:ga6c63bdc736efd3466e0730de0251cb71\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#ga6c63bdc736efd3466e0730de0251cb71\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c63bdc736efd3466e0730de0251cb71\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac0b4e42d648fb3eaf4bb88da82ecc809\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809\">mediump_imat3x2</a></td></tr>\n<tr class=\"memdesc:gac0b4e42d648fb3eaf4bb88da82ecc809\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 3x2 matrix.  <a href=\"a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809\">More...</a><br /></td></tr>\n<tr class=\"separator:gac0b4e42d648fb3eaf4bb88da82ecc809\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad99cc2aad8fc57f068cfa7719dbbea12\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12\">mediump_imat3x3</a></td></tr>\n<tr class=\"memdesc:gad99cc2aad8fc57f068cfa7719dbbea12\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12\">More...</a><br /></td></tr>\n<tr class=\"separator:gad99cc2aad8fc57f068cfa7719dbbea12\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga67689a518b181a26540bc44a163525cd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga67689a518b181a26540bc44a163525cd\">mediump_imat3x4</a></td></tr>\n<tr class=\"memdesc:ga67689a518b181a26540bc44a163525cd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 3x4 matrix.  <a href=\"a00155.html#ga67689a518b181a26540bc44a163525cd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga67689a518b181a26540bc44a163525cd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf348552978553630d2a00b78eb887ced\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf348552978553630d2a00b78eb887ced\">mediump_imat4</a></td></tr>\n<tr class=\"memdesc:gaf348552978553630d2a00b78eb887ced\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#gaf348552978553630d2a00b78eb887ced\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf348552978553630d2a00b78eb887ced\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b2d35816f7103f0f4c82dd2f27571fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc\">mediump_imat4x2</a></td></tr>\n<tr class=\"memdesc:ga8b2d35816f7103f0f4c82dd2f27571fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 4x2 matrix.  <a href=\"a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b2d35816f7103f0f4c82dd2f27571fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5b10acc696759e03f6ab918f4467e94c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga5b10acc696759e03f6ab918f4467e94c\">mediump_imat4x3</a></td></tr>\n<tr class=\"memdesc:ga5b10acc696759e03f6ab918f4467e94c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 4x3 matrix.  <a href=\"a00155.html#ga5b10acc696759e03f6ab918f4467e94c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5b10acc696759e03f6ab918f4467e94c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2596869d154dec1180beadbb9df80501\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga2596869d154dec1180beadbb9df80501\">mediump_imat4x4</a></td></tr>\n<tr class=\"memdesc:ga2596869d154dec1180beadbb9df80501\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#ga2596869d154dec1180beadbb9df80501\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2596869d154dec1180beadbb9df80501\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga43041378b3410ea951b7de0dfd2bc7ee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee\">mediump_umat2</a></td></tr>\n<tr class=\"memdesc:ga43041378b3410ea951b7de0dfd2bc7ee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga43041378b3410ea951b7de0dfd2bc7ee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b209b1b751f041422137e3c065dfa98\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga3b209b1b751f041422137e3c065dfa98\">mediump_umat2x2</a></td></tr>\n<tr class=\"memdesc:ga3b209b1b751f041422137e3c065dfa98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga3b209b1b751f041422137e3c065dfa98\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b209b1b751f041422137e3c065dfa98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaee2c1f13b41f4c92ea5b3efe367a1306\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306\">mediump_umat2x3</a></td></tr>\n<tr class=\"memdesc:gaee2c1f13b41f4c92ea5b3efe367a1306\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 2x3 matrix.  <a href=\"a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306\">More...</a><br /></td></tr>\n<tr class=\"separator:gaee2c1f13b41f4c92ea5b3efe367a1306\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1317ddca16d01e119a40b7f0ee85f95\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gae1317ddca16d01e119a40b7f0ee85f95\">mediump_umat2x4</a></td></tr>\n<tr class=\"memdesc:gae1317ddca16d01e119a40b7f0ee85f95\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 2x4 matrix.  <a href=\"a00155.html#gae1317ddca16d01e119a40b7f0ee85f95\">More...</a><br /></td></tr>\n<tr class=\"separator:gae1317ddca16d01e119a40b7f0ee85f95\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1730dbe3c67801f53520b06d1aa0a34a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a\">mediump_umat3</a></td></tr>\n<tr class=\"memdesc:ga1730dbe3c67801f53520b06d1aa0a34a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1730dbe3c67801f53520b06d1aa0a34a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaadc28bfdc8ebca81ae85121b11994970\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaadc28bfdc8ebca81ae85121b11994970\">mediump_umat3x2</a></td></tr>\n<tr class=\"memdesc:gaadc28bfdc8ebca81ae85121b11994970\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 3x2 matrix.  <a href=\"a00155.html#gaadc28bfdc8ebca81ae85121b11994970\">More...</a><br /></td></tr>\n<tr class=\"separator:gaadc28bfdc8ebca81ae85121b11994970\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga48f2fc38d3f7fab3cfbc961278ced53d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d\">mediump_umat3x3</a></td></tr>\n<tr class=\"memdesc:ga48f2fc38d3f7fab3cfbc961278ced53d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga48f2fc38d3f7fab3cfbc961278ced53d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78009a1e4ca64217e46b418535e52546\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga78009a1e4ca64217e46b418535e52546\">mediump_umat3x4</a></td></tr>\n<tr class=\"memdesc:ga78009a1e4ca64217e46b418535e52546\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 3x4 matrix.  <a href=\"a00155.html#ga78009a1e4ca64217e46b418535e52546\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78009a1e4ca64217e46b418535e52546\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5087c2beb26a11d9af87432e554cf9d1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga5087c2beb26a11d9af87432e554cf9d1\">mediump_umat4</a></td></tr>\n<tr class=\"memdesc:ga5087c2beb26a11d9af87432e554cf9d1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#ga5087c2beb26a11d9af87432e554cf9d1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5087c2beb26a11d9af87432e554cf9d1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf35aefd81cc13718f6b059623f7425fa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf35aefd81cc13718f6b059623f7425fa\">mediump_umat4x2</a></td></tr>\n<tr class=\"memdesc:gaf35aefd81cc13718f6b059623f7425fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 4x2 matrix.  <a href=\"a00155.html#gaf35aefd81cc13718f6b059623f7425fa\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf35aefd81cc13718f6b059623f7425fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4e1bed14fbc7f4b376aaed064f89f0fb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb\">mediump_umat4x3</a></td></tr>\n<tr class=\"memdesc:ga4e1bed14fbc7f4b376aaed064f89f0fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 4x3 matrix.  <a href=\"a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4e1bed14fbc7f4b376aaed064f89f0fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9428fc8430dc552aad920653f822ef3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa9428fc8430dc552aad920653f822ef3\">mediump_umat4x4</a></td></tr>\n<tr class=\"memdesc:gaa9428fc8430dc552aad920653f822ef3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#gaa9428fc8430dc552aad920653f822ef3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9428fc8430dc552aad920653f822ef3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4cae85566f900debf930c41944b64691\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">umat2</a></td></tr>\n<tr class=\"memdesc:ga4cae85566f900debf930c41944b64691\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4cae85566f900debf930c41944b64691\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabf8acdd33ce8951051edbca5200898aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">umat2x2</a></td></tr>\n<tr class=\"memdesc:gabf8acdd33ce8951051edbca5200898aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 2x2 matrix.  <a href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">More...</a><br /></td></tr>\n<tr class=\"separator:gabf8acdd33ce8951051edbca5200898aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1870da7578d5022b973a83155d386ab3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">umat2x3</a></td></tr>\n<tr class=\"memdesc:ga1870da7578d5022b973a83155d386ab3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 2x3 matrix.  <a href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1870da7578d5022b973a83155d386ab3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga57936a3998e992370e59a223e0ee4fd4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">umat2x4</a></td></tr>\n<tr class=\"memdesc:ga57936a3998e992370e59a223e0ee4fd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 2x4 matrix.  <a href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga57936a3998e992370e59a223e0ee4fd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5085e3ff02abbac5e537eb7b89ab63b6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">umat3</a></td></tr>\n<tr class=\"memdesc:ga5085e3ff02abbac5e537eb7b89ab63b6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5085e3ff02abbac5e537eb7b89ab63b6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9cd7fa637a4a6788337f45231fad9e1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">umat3x2</a></td></tr>\n<tr class=\"memdesc:ga9cd7fa637a4a6788337f45231fad9e1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 3x2 matrix.  <a href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9cd7fa637a4a6788337f45231fad9e1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f2cfcf3357db0cdf31fcb15e3c6bafb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">umat3x3</a></td></tr>\n<tr class=\"memdesc:ga1f2cfcf3357db0cdf31fcb15e3c6bafb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f2cfcf3357db0cdf31fcb15e3c6bafb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae7c78ff3fc4309605ab0fa186c8d48ba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">umat3x4</a></td></tr>\n<tr class=\"memdesc:gae7c78ff3fc4309605ab0fa186c8d48ba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 3x4 matrix.  <a href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">More...</a><br /></td></tr>\n<tr class=\"separator:gae7c78ff3fc4309605ab0fa186c8d48ba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga38bc7bb6494e344185df596deeb4544c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">umat4</a></td></tr>\n<tr class=\"memdesc:ga38bc7bb6494e344185df596deeb4544c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 4x4 matrix.  <a href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga38bc7bb6494e344185df596deeb4544c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70fa2d05896aa83cbc8c07672a429b53\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">umat4x2</a></td></tr>\n<tr class=\"memdesc:ga70fa2d05896aa83cbc8c07672a429b53\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 4x2 matrix.  <a href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">More...</a><br /></td></tr>\n<tr class=\"separator:ga70fa2d05896aa83cbc8c07672a429b53\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga87581417945411f75cb31dd6ca1dba98\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">umat4x3</a></td></tr>\n<tr class=\"memdesc:ga87581417945411f75cb31dd6ca1dba98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 4x3 matrix.  <a href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">More...</a><br /></td></tr>\n<tr class=\"separator:ga87581417945411f75cb31dd6ca1dba98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf72e6d399c42985db6872c50f53d7eb8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">umat4x4</a></td></tr>\n<tr class=\"memdesc:gaf72e6d399c42985db6872c50f53d7eb8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 4x4 matrix.  <a href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf72e6d399c42985db6872c50f53d7eb8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00155.html\">GLM_GTC_matrix_integer</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00060_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_integer.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_integer.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00060.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_matrix_integer extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga8499cc3b016003f835314c1c756e9db9\">   37</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga8499cc3b016003f835314c1c756e9db9\">highp_imat2</a>;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaca4506a3efa679eff7c006d9826291fd\">   41</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#gaca4506a3efa679eff7c006d9826291fd\">highp_imat3</a>;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56\">   45</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56\">highp_imat4</a>;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3\">   49</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3\">highp_imat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaba49d890e06c9444795f5a133fbf1336\">   53</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#gaba49d890e06c9444795f5a133fbf1336\">highp_imat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b\">   57</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b\">highp_imat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb\">   61</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb\">highp_imat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41\">   65</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41\">highp_imat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga53008f580be99018a17b357b5a4ffc0d\">   69</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga53008f580be99018a17b357b5a4ffc0d\">highp_imat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga1858820fb292cae396408b2034407f72\">   73</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga1858820fb292cae396408b2034407f72\">highp_imat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5\">   77</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5\">highp_imat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44\">   81</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, int, highp&gt;                           <a class=\"code\" href=\"a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44\">highp_imat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378\">   86</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378\">mediump_imat2</a>;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga6c63bdc736efd3466e0730de0251cb71\">   90</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga6c63bdc736efd3466e0730de0251cb71\">mediump_imat3</a>;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaf348552978553630d2a00b78eb887ced\">   94</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#gaf348552978553630d2a00b78eb887ced\">mediump_imat4</a>;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga4b2aeb11a329940721dda9583e71f856\">   99</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga4b2aeb11a329940721dda9583e71f856\">mediump_imat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga74362470ba99843ac70aee5ac38cc674\">  103</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga74362470ba99843ac70aee5ac38cc674\">mediump_imat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09\">  107</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09\">mediump_imat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809\">  111</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809\">mediump_imat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12\">  115</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12\">mediump_imat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga67689a518b181a26540bc44a163525cd\">  119</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga67689a518b181a26540bc44a163525cd\">mediump_imat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc\">  123</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc\">mediump_imat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga5b10acc696759e03f6ab918f4467e94c\">  127</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga5b10acc696759e03f6ab918f4467e94c\">mediump_imat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga2596869d154dec1180beadbb9df80501\">  131</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, int, mediump&gt;                 <a class=\"code\" href=\"a00155.html#ga2596869d154dec1180beadbb9df80501\">mediump_imat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaa0bff0be804142bb16d441aec0a7962e\">  136</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#gaa0bff0be804142bb16d441aec0a7962e\">lowp_imat2</a>;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga69bfe668f4170379fc1f35d82b060c43\">  140</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga69bfe668f4170379fc1f35d82b060c43\">lowp_imat3</a>;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c\">  144</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c\">lowp_imat4</a>;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga92b95b679975d408645547ab45a8dcd8\">  149</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga92b95b679975d408645547ab45a8dcd8\">lowp_imat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65\">  153</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65\">lowp_imat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e\">  157</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e\">lowp_imat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga33db8f27491d30906cd37c0d86b3f432\">  161</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga33db8f27491d30906cd37c0d86b3f432\">lowp_imat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga664f061df00020048c3f8530329ace45\">  165</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga664f061df00020048c3f8530329ace45\">lowp_imat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga9273faab33623d944af4080befbb2c80\">  169</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga9273faab33623d944af4080befbb2c80\">lowp_imat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09\">  173</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09\">lowp_imat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga8f40483a3ae634ead8ad22272c543a33\">  177</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#ga8f40483a3ae634ead8ad22272c543a33\">lowp_imat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaf65677e53ac8e31a107399340d5e2451\">  181</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, int, lowp&gt;                            <a class=\"code\" href=\"a00155.html#gaf65677e53ac8e31a107399340d5e2451\">lowp_imat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga42cbce64c4c1cd121b8437daa6e110de\">  186</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#ga42cbce64c4c1cd121b8437daa6e110de\">highp_umat2</a>;    </div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaa1143120339b7d2d469d327662e8a172\">  190</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#gaa1143120339b7d2d469d327662e8a172\">highp_umat3</a>;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9\">  194</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9\">highp_umat4</a>;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28\">  198</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28\">highp_umat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga90718c7128320b24b52f9ea70e643ad4\">  202</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#ga90718c7128320b24b52f9ea70e643ad4\">highp_umat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b\">  206</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b\">highp_umat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4\">  210</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4\">highp_umat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2\">  214</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2\">highp_umat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga25ee15c323924f2d0fe9896d329e5086\">  218</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#ga25ee15c323924f2d0fe9896d329e5086\">highp_umat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801\">  222</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801\">highp_umat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga45a8163d02c43216252056b0c120f3a5\">  226</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#ga45a8163d02c43216252056b0c120f3a5\">highp_umat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga6a56cbb769aed334c95241664415f9ba\">  230</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, uint, highp&gt;                          <a class=\"code\" href=\"a00155.html#ga6a56cbb769aed334c95241664415f9ba\">highp_umat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee\">  235</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee\">mediump_umat2</a>;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a\">  239</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a\">mediump_umat3</a>;</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga5087c2beb26a11d9af87432e554cf9d1\">  243</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#ga5087c2beb26a11d9af87432e554cf9d1\">mediump_umat4</a>;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga3b209b1b751f041422137e3c065dfa98\">  248</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#ga3b209b1b751f041422137e3c065dfa98\">mediump_umat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306\">  252</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306\">mediump_umat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gae1317ddca16d01e119a40b7f0ee85f95\">  256</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#gae1317ddca16d01e119a40b7f0ee85f95\">mediump_umat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaadc28bfdc8ebca81ae85121b11994970\">  260</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#gaadc28bfdc8ebca81ae85121b11994970\">mediump_umat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d\">  264</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d\">mediump_umat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga78009a1e4ca64217e46b418535e52546\">  268</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#ga78009a1e4ca64217e46b418535e52546\">mediump_umat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaf35aefd81cc13718f6b059623f7425fa\">  272</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#gaf35aefd81cc13718f6b059623f7425fa\">mediump_umat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb\">  276</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb\">mediump_umat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaa9428fc8430dc552aad920653f822ef3\">  280</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, uint, mediump&gt;                        <a class=\"code\" href=\"a00155.html#gaa9428fc8430dc552aad920653f822ef3\">mediump_umat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaf2fba702d990437fc88ff3f3a76846ee\">  285</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#gaf2fba702d990437fc88ff3f3a76846ee\">lowp_umat2</a>;</div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaf1145f72bcdd590f5808c4bc170c2924\">  289</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#gaf1145f72bcdd590f5808c4bc170c2924\">lowp_umat3</a>;</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gac092c6105827bf9ea080db38074b78eb\">  293</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#gac092c6105827bf9ea080db38074b78eb\">lowp_umat4</a>;</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga7b2e9d89745f7175051284e54c81d81c\">  298</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#ga7b2e9d89745f7175051284e54c81d81c\">lowp_umat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga3072f90fd86f17a862e21589fbb14c0f\">  302</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#ga3072f90fd86f17a862e21589fbb14c0f\">lowp_umat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d\">  306</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d\">lowp_umat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;</div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b\">  310</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b\">lowp_umat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5\">  314</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5\">lowp_umat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaec3d624306bd59649f021864709d56b5\">  318</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#gaec3d624306bd59649f021864709d56b5\">lowp_umat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga7716c2b210d141846f1ac4e774adef5e\">  322</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#ga7716c2b210d141846f1ac4e774adef5e\">lowp_umat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff\">  326</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff\">lowp_umat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0\">  330</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, uint, lowp&gt;                           <a class=\"code\" href=\"a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0\">lowp_umat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;</div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_INT))</span></div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat2                                                             <a class=\"code\" href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">imat2</a>;</div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat3                                                             <a class=\"code\" href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">imat3</a>;</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat4                                                             <a class=\"code\" href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">imat4</a>;</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat2x2                                                   <a class=\"code\" href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">imat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat2x3                                                   <a class=\"code\" href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">imat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat2x4                                                   <a class=\"code\" href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">imat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat3x2                                                   <a class=\"code\" href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">imat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat3x3                                                   <a class=\"code\" href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">imat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat3x4                                                   <a class=\"code\" href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">imat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat4x2                                                   <a class=\"code\" href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">imat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat4x3                                                   <a class=\"code\" href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">imat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;        <span class=\"keyword\">typedef</span> highp_imat4x4                                                   <a class=\"code\" href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">imat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat2                                                              <a class=\"code\" href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">imat2</a>;</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat3                                                              <a class=\"code\" href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">imat3</a>;</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat4                                                              <a class=\"code\" href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">imat4</a>;</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat2x2                                                    <a class=\"code\" href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">imat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat2x3                                                    <a class=\"code\" href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">imat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat2x4                                                    <a class=\"code\" href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">imat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat3x2                                                    <a class=\"code\" href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">imat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat3x3                                                    <a class=\"code\" href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">imat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat3x4                                                    <a class=\"code\" href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">imat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat4x2                                                    <a class=\"code\" href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">imat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat4x3                                                    <a class=\"code\" href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">imat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;        <span class=\"keyword\">typedef</span> lowp_imat4x4                                                    <a class=\"code\" href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">imat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;<span class=\"preprocessor\">#else //if(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">  362</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat2                                                   <a class=\"code\" href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">imat2</a>;</div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;</div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">  366</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat3                                                   <a class=\"code\" href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">imat3</a>;</div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">  370</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat4                                                   <a class=\"code\" href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">imat4</a>;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">  374</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat2x2                                                 <a class=\"code\" href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">imat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">  378</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat2x3                                                 <a class=\"code\" href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">imat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">  382</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat2x4                                                 <a class=\"code\" href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">imat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;</div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">  386</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat3x2                                                 <a class=\"code\" href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">imat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;</div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">  390</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat3x3                                                 <a class=\"code\" href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">imat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">  394</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat3x4                                                 <a class=\"code\" href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">imat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;</div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">  398</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat4x2                                                 <a class=\"code\" href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">imat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">  402</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat4x3                                                 <a class=\"code\" href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">imat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">  406</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_imat4x4                                                 <a class=\"code\" href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">imat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;</div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat2                                                             <a class=\"code\" href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">umat2</a>;</div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat3                                                             <a class=\"code\" href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">umat3</a>;</div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat4                                                             <a class=\"code\" href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">umat4</a>;</div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat2x2                                                   <a class=\"code\" href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">umat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat2x3                                                   <a class=\"code\" href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">umat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat2x4                                                   <a class=\"code\" href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">umat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat3x2                                                   <a class=\"code\" href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">umat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat3x3                                                   <a class=\"code\" href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">umat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat3x4                                                   <a class=\"code\" href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">umat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat4x2                                                   <a class=\"code\" href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">umat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat4x3                                                   <a class=\"code\" href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">umat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;        <span class=\"keyword\">typedef</span> highp_umat4x4                                                   <a class=\"code\" href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">umat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat2                                                              <a class=\"code\" href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">umat2</a>;</div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat3                                                              <a class=\"code\" href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">umat3</a>;</div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat4                                                              <a class=\"code\" href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">umat4</a>;</div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat2x2                                                    <a class=\"code\" href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">umat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat2x3                                                    <a class=\"code\" href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">umat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat2x4                                                    <a class=\"code\" href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">umat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat3x2                                                    <a class=\"code\" href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">umat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat3x3                                                    <a class=\"code\" href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">umat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat3x4                                                    <a class=\"code\" href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">umat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat4x2                                                    <a class=\"code\" href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">umat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat4x3                                                    <a class=\"code\" href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">umat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;        <span class=\"keyword\">typedef</span> lowp_umat4x4                                                    <a class=\"code\" href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">umat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;<span class=\"preprocessor\">#else //if(defined(GLM_PRECISION_MEDIUMP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">  439</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat2                                                   <a class=\"code\" href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">umat2</a>;</div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;</div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">  443</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat3                                                   <a class=\"code\" href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">umat3</a>;</div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;</div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">  447</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat4                                                   <a class=\"code\" href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">umat4</a>;</div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;</div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">  451</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat2x2                                                 <a class=\"code\" href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">umat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;</div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">  455</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat2x3                                                 <a class=\"code\" href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">umat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00456\"></a><span class=\"lineno\">  456</span>&#160;</div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">  459</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat2x4                                                 <a class=\"code\" href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">umat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;</div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">  463</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat3x2                                                 <a class=\"code\" href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">umat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;</div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">  467</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat3x3                                                 <a class=\"code\" href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">umat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;</div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">  471</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat3x4                                                 <a class=\"code\" href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">umat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;</div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">  475</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat4x2                                                 <a class=\"code\" href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">umat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;</div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">  479</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat4x3                                                 <a class=\"code\" href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">umat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;</div>\n<div class=\"line\"><a name=\"l00483\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">  483</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_umat4x4                                                 <a class=\"code\" href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">umat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\">  484</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;</div>\n<div class=\"line\"><a name=\"l00487\"></a><span class=\"lineno\">  487</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00155_html_gac092c6105827bf9ea080db38074b78eb\"><div class=\"ttname\"><a href=\"a00155.html#gac092c6105827bf9ea080db38074b78eb\">glm::lowp_umat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, uint, lowp &gt; lowp_umat4</div><div class=\"ttdoc\">Low-qualifier unsigned integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00293\">matrix_integer.hpp:293</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga70fa2d05896aa83cbc8c07672a429b53\"><div class=\"ttname\"><a href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">glm::umat4x2</a></div><div class=\"ttdeci\">mediump_umat4x2 umat4x2</div><div class=\"ttdoc\">Unsigned integer 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00475\">matrix_integer.hpp:475</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga20f4cc7ab23e2aa1f4db9fdb5496d378\"><div class=\"ttname\"><a href=\"a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378\">glm::mediump_imat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, int, mediump &gt; mediump_imat2</div><div class=\"ttdoc\">Medium-qualifier signed integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00086\">matrix_integer.hpp:86</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga6be0b80ae74bb309bc5b964d93d68fc5\"><div class=\"ttname\"><a href=\"a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5\">glm::highp_imat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, int, highp &gt; highp_imat4x3</div><div class=\"ttdoc\">High-qualifier signed integer 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00077\">matrix_integer.hpp:77</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga91c671c3ff9706c2393e78b22fd84bcb\"><div class=\"ttname\"><a href=\"a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb\">glm::highp_imat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, int, highp &gt; highp_imat3x2</div><div class=\"ttdoc\">High-qualifier signed integer 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00061\">matrix_integer.hpp:61</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga92b95b679975d408645547ab45a8dcd8\"><div class=\"ttname\"><a href=\"a00155.html#ga92b95b679975d408645547ab45a8dcd8\">glm::lowp_imat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, int, lowp &gt; lowp_imat2x2</div><div class=\"ttdoc\">Low-qualifier signed integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00149\">matrix_integer.hpp:149</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga56ea68c6a6cba8d8c21d17bb14e69c6b\"><div class=\"ttname\"><a href=\"a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b\">glm::lowp_umat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, uint, lowp &gt; lowp_umat3x2</div><div class=\"ttdoc\">Low-qualifier unsigned integer 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00310\">matrix_integer.hpp:310</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaf35aefd81cc13718f6b059623f7425fa\"><div class=\"ttname\"><a href=\"a00155.html#gaf35aefd81cc13718f6b059623f7425fa\">glm::mediump_umat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, uint, mediump &gt; mediump_umat4x2</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00272\">matrix_integer.hpp:272</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga57936a3998e992370e59a223e0ee4fd4\"><div class=\"ttname\"><a href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">glm::umat2x4</a></div><div class=\"ttdeci\">mediump_umat2x4 umat2x4</div><div class=\"ttdoc\">Unsigned integer 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00459\">matrix_integer.hpp:459</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga9273faab33623d944af4080befbb2c80\"><div class=\"ttname\"><a href=\"a00155.html#ga9273faab33623d944af4080befbb2c80\">glm::lowp_imat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, int, lowp &gt; lowp_imat3x4</div><div class=\"ttdoc\">Low-qualifier signed integer 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00169\">matrix_integer.hpp:169</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga74362470ba99843ac70aee5ac38cc674\"><div class=\"ttname\"><a href=\"a00155.html#ga74362470ba99843ac70aee5ac38cc674\">glm::mediump_imat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, int, mediump &gt; mediump_imat2x3</div><div class=\"ttdoc\">Medium-qualifier signed integer 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00103\">matrix_integer.hpp:103</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga1730dbe3c67801f53520b06d1aa0a34a\"><div class=\"ttname\"><a href=\"a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a\">glm::mediump_umat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, uint, mediump &gt; mediump_umat3</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00239\">matrix_integer.hpp:239</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaf2fba702d990437fc88ff3f3a76846ee\"><div class=\"ttname\"><a href=\"a00155.html#gaf2fba702d990437fc88ff3f3a76846ee\">glm::lowp_umat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, uint, lowp &gt; lowp_umat2</div><div class=\"ttdoc\">Low-qualifier unsigned integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00285\">matrix_integer.hpp:285</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gae1317ddca16d01e119a40b7f0ee85f95\"><div class=\"ttname\"><a href=\"a00155.html#gae1317ddca16d01e119a40b7f0ee85f95\">glm::mediump_umat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, uint, mediump &gt; mediump_umat2x4</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00256\">matrix_integer.hpp:256</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga05a970fd4366dad6c8a0be676b1eae5b\"><div class=\"ttname\"><a href=\"a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b\">glm::highp_imat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, int, highp &gt; highp_imat2x4</div><div class=\"ttdoc\">High-qualifier signed integer 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00057\">matrix_integer.hpp:57</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga87581417945411f75cb31dd6ca1dba98\"><div class=\"ttname\"><a href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">glm::umat4x3</a></div><div class=\"ttdeci\">mediump_umat4x3 umat4x3</div><div class=\"ttdoc\">Unsigned integer 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00479\">matrix_integer.hpp:479</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga8ce7ef51d8b2c1901fa5414deccbc3fa\"><div class=\"ttname\"><a href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">glm::imat4x2</a></div><div class=\"ttdeci\">mediump_imat4x2 imat4x2</div><div class=\"ttdoc\">Signed integer 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00398\">matrix_integer.hpp:398</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga4f660a39a395cc14f018f985e7dfbeb5\"><div class=\"ttname\"><a href=\"a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5\">glm::lowp_umat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, uint, lowp &gt; lowp_umat3x3</div><div class=\"ttdoc\">Low-qualifier unsigned integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00314\">matrix_integer.hpp:314</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaadc28bfdc8ebca81ae85121b11994970\"><div class=\"ttname\"><a href=\"a00155.html#gaadc28bfdc8ebca81ae85121b11994970\">glm::mediump_umat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, uint, mediump &gt; mediump_umat3x2</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00260\">matrix_integer.hpp:260</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga2596869d154dec1180beadbb9df80501\"><div class=\"ttname\"><a href=\"a00155.html#ga2596869d154dec1180beadbb9df80501\">glm::mediump_imat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, int, mediump &gt; mediump_imat4x4</div><div class=\"ttdoc\">Medium-qualifier signed integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00131\">matrix_integer.hpp:131</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga9cd7fa637a4a6788337f45231fad9e1a\"><div class=\"ttname\"><a href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">glm::umat3x2</a></div><div class=\"ttdeci\">mediump_umat3x2 umat3x2</div><div class=\"ttdoc\">Unsigned integer 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00463\">matrix_integer.hpp:463</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gae7c78ff3fc4309605ab0fa186c8d48ba\"><div class=\"ttname\"><a href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">glm::umat3x4</a></div><div class=\"ttdeci\">mediump_umat3x4 umat3x4</div><div class=\"ttdoc\">Unsigned integer 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00471\">matrix_integer.hpp:471</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga6e9ce23496d8b08dfc302d4039694b58\"><div class=\"ttname\"><a href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">glm::imat3x4</a></div><div class=\"ttdeci\">mediump_imat3x4 imat3x4</div><div class=\"ttdoc\">Signed integer 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00394\">matrix_integer.hpp:394</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaee2c1f13b41f4c92ea5b3efe367a1306\"><div class=\"ttname\"><a href=\"a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306\">glm::mediump_umat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, uint, mediump &gt; mediump_umat2x3</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00252\">matrix_integer.hpp:252</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga43041378b3410ea951b7de0dfd2bc7ee\"><div class=\"ttname\"><a href=\"a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee\">glm::mediump_umat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, uint, mediump &gt; mediump_umat2</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00235\">matrix_integer.hpp:235</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga43ed5e4f475b6f4cad7cba78f29c405b\"><div class=\"ttname\"><a href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">glm::imat4x4</a></div><div class=\"ttdeci\">mediump_imat4x4 imat4x4</div><div class=\"ttdoc\">Signed integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00406\">matrix_integer.hpp:406</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gabf8acdd33ce8951051edbca5200898aa\"><div class=\"ttname\"><a href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">glm::umat2x2</a></div><div class=\"ttdeci\">mediump_umat2x2 umat2x2</div><div class=\"ttdoc\">Unsigned integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00451\">matrix_integer.hpp:451</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga67689a518b181a26540bc44a163525cd\"><div class=\"ttname\"><a href=\"a00155.html#ga67689a518b181a26540bc44a163525cd\">glm::mediump_imat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, int, mediump &gt; mediump_imat3x4</div><div class=\"ttdoc\">Medium-qualifier signed integer 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00119\">matrix_integer.hpp:119</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaa9428fc8430dc552aad920653f822ef3\"><div class=\"ttname\"><a href=\"a00155.html#gaa9428fc8430dc552aad920653f822ef3\">glm::mediump_umat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, uint, mediump &gt; mediump_umat4x4</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00280\">matrix_integer.hpp:280</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga705ee0bf49d6c3de4404ce2481bf0df5\"><div class=\"ttname\"><a href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">glm::imat4x3</a></div><div class=\"ttdeci\">mediump_imat4x3 imat4x3</div><div class=\"ttdoc\">Signed integer 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00402\">matrix_integer.hpp:402</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gae69eb82ec08b0dc9bf2ead2a339ff801\"><div class=\"ttname\"><a href=\"a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801\">glm::highp_umat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, uint, highp &gt; highp_umat4x2</div><div class=\"ttdoc\">High-qualifier unsigned integer 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00222\">matrix_integer.hpp:222</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gac0b4e42d648fb3eaf4bb88da82ecc809\"><div class=\"ttname\"><a href=\"a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809\">glm::mediump_imat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, int, mediump &gt; mediump_imat3x2</div><div class=\"ttdoc\">Medium-qualifier signed integer 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00111\">matrix_integer.hpp:111</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga1870da7578d5022b973a83155d386ab3\"><div class=\"ttname\"><a href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">glm::umat2x3</a></div><div class=\"ttdeci\">mediump_umat2x3 umat2x3</div><div class=\"ttdoc\">Unsigned integer 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00455\">matrix_integer.hpp:455</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga5337b7bc95f9cbac08a0c00b3f936b28\"><div class=\"ttname\"><a href=\"a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28\">glm::highp_umat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, uint, highp &gt; highp_umat2x2</div><div class=\"ttdoc\">High-qualifier unsigned integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00198\">matrix_integer.hpp:198</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga9d8faafdca42583d67e792dd038fc668\"><div class=\"ttname\"><a href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">glm::imat2x4</a></div><div class=\"ttdeci\">mediump_imat2x4 imat2x4</div><div class=\"ttdoc\">Signed integer 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00382\">matrix_integer.hpp:382</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga48f2fc38d3f7fab3cfbc961278ced53d\"><div class=\"ttname\"><a href=\"a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d\">glm::mediump_umat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, uint, mediump &gt; mediump_umat3x3</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00264\">matrix_integer.hpp:264</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga8b2d35816f7103f0f4c82dd2f27571fc\"><div class=\"ttname\"><a href=\"a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc\">glm::mediump_imat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, int, mediump &gt; mediump_imat4x2</div><div class=\"ttdoc\">Medium-qualifier signed integer 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00123\">matrix_integer.hpp:123</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga664f061df00020048c3f8530329ace45\"><div class=\"ttname\"><a href=\"a00155.html#ga664f061df00020048c3f8530329ace45\">glm::lowp_imat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, int, lowp &gt; lowp_imat3x3</div><div class=\"ttdoc\">Low-qualifier signed integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00165\">matrix_integer.hpp:165</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gadca0a4724b4a6f56a2355b6f6e19248b\"><div class=\"ttname\"><a href=\"a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b\">glm::highp_umat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, uint, highp &gt; highp_umat2x4</div><div class=\"ttdoc\">High-qualifier unsigned integer 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00206\">matrix_integer.hpp:206</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga38bc7bb6494e344185df596deeb4544c\"><div class=\"ttname\"><a href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">glm::umat4</a></div><div class=\"ttdeci\">mediump_umat4 umat4</div><div class=\"ttdoc\">Unsigned integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00447\">matrix_integer.hpp:447</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga5b10acc696759e03f6ab918f4467e94c\"><div class=\"ttname\"><a href=\"a00155.html#ga5b10acc696759e03f6ab918f4467e94c\">glm::mediump_imat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, int, mediump &gt; mediump_imat4x3</div><div class=\"ttdoc\">Medium-qualifier signed integer 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00127\">matrix_integer.hpp:127</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga2c783ee6f8f040ab37df2f70392c8b44\"><div class=\"ttname\"><a href=\"a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44\">glm::highp_imat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, int, highp &gt; highp_imat4x4</div><div class=\"ttdoc\">High-qualifier signed integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00081\">matrix_integer.hpp:81</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga78009a1e4ca64217e46b418535e52546\"><div class=\"ttname\"><a href=\"a00155.html#ga78009a1e4ca64217e46b418535e52546\">glm::mediump_umat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, uint, mediump &gt; mediump_umat3x4</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00268\">matrix_integer.hpp:268</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga8499cc3b016003f835314c1c756e9db9\"><div class=\"ttname\"><a href=\"a00155.html#ga8499cc3b016003f835314c1c756e9db9\">glm::highp_imat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, int, highp &gt; highp_imat2</div><div class=\"ttdoc\">High-qualifier signed integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00037\">matrix_integer.hpp:37</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga6a56cbb769aed334c95241664415f9ba\"><div class=\"ttname\"><a href=\"a00155.html#ga6a56cbb769aed334c95241664415f9ba\">glm::highp_umat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, uint, highp &gt; highp_umat4x4</div><div class=\"ttdoc\">High-qualifier unsigned integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00230\">matrix_integer.hpp:230</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga33db8f27491d30906cd37c0d86b3f432\"><div class=\"ttname\"><a href=\"a00155.html#ga33db8f27491d30906cd37c0d86b3f432\">glm::lowp_imat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, int, lowp &gt; lowp_imat3x2</div><div class=\"ttdoc\">Low-qualifier signed integer 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00161\">matrix_integer.hpp:161</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaa4732a240522ad9bc28144fda2fc14ec\"><div class=\"ttname\"><a href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">glm::imat2x2</a></div><div class=\"ttdeci\">mediump_imat2x2 imat2x2</div><div class=\"ttdoc\">Signed integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00374\">matrix_integer.hpp:374</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga7b33bbe4f12c060892bd3cc8d4cd737f\"><div class=\"ttname\"><a href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">glm::imat3x2</a></div><div class=\"ttdeci\">mediump_imat3x2 imat3x2</div><div class=\"ttdoc\">Signed integer 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00386\">matrix_integer.hpp:386</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaba49d890e06c9444795f5a133fbf1336\"><div class=\"ttname\"><a href=\"a00155.html#gaba49d890e06c9444795f5a133fbf1336\">glm::highp_imat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, int, highp &gt; highp_imat2x3</div><div class=\"ttdoc\">High-qualifier signed integer 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00053\">matrix_integer.hpp:53</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga9cc13bd1f8dd2933e9fa31fe3f70e16e\"><div class=\"ttname\"><a href=\"a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e\">glm::lowp_imat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, int, lowp &gt; lowp_imat2x4</div><div class=\"ttdoc\">Low-qualifier signed integer 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00157\">matrix_integer.hpp:157</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaabe04f9948d4a213bb1c20137de03e01\"><div class=\"ttname\"><a href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">glm::imat2</a></div><div class=\"ttdeci\">mediump_imat2 imat2</div><div class=\"ttdoc\">Signed integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00362\">matrix_integer.hpp:362</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga844a5da2e7fc03fc7cccc7f1b70809c4\"><div class=\"ttname\"><a href=\"a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4\">glm::highp_umat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, uint, highp &gt; highp_umat3x2</div><div class=\"ttdoc\">High-qualifier unsigned integer 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00210\">matrix_integer.hpp:210</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga3b209b1b751f041422137e3c065dfa98\"><div class=\"ttname\"><a href=\"a00155.html#ga3b209b1b751f041422137e3c065dfa98\">glm::mediump_umat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, uint, mediump &gt; mediump_umat2x2</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00248\">matrix_integer.hpp:248</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga42cbce64c4c1cd121b8437daa6e110de\"><div class=\"ttname\"><a href=\"a00155.html#ga42cbce64c4c1cd121b8437daa6e110de\">glm::highp_umat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, uint, highp &gt; highp_umat2</div><div class=\"ttdoc\">High-qualifier unsigned integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00186\">matrix_integer.hpp:186</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaa389e2d1c3b10941cae870bc0aeba5b3\"><div class=\"ttname\"><a href=\"a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3\">glm::highp_imat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, int, highp &gt; highp_imat2x2</div><div class=\"ttdoc\">High-qualifier signed integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00049\">matrix_integer.hpp:49</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaf665e4e78c2cc32a54ab40325738f9c9\"><div class=\"ttname\"><a href=\"a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9\">glm::highp_umat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, uint, highp &gt; highp_umat4</div><div class=\"ttdoc\">High-qualifier unsigned integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00194\">matrix_integer.hpp:194</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaa0bff0be804142bb16d441aec0a7962e\"><div class=\"ttname\"><a href=\"a00155.html#gaa0bff0be804142bb16d441aec0a7962e\">glm::lowp_imat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, int, lowp &gt; lowp_imat2</div><div class=\"ttdoc\">Low-qualifier signed integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00136\">matrix_integer.hpp:136</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga1f2cfcf3357db0cdf31fcb15e3c6bafb\"><div class=\"ttname\"><a href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">glm::umat3x3</a></div><div class=\"ttdeci\">mediump_umat3x3 umat3x3</div><div class=\"ttdoc\">Unsigned integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00467\">matrix_integer.hpp:467</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaf348552978553630d2a00b78eb887ced\"><div class=\"ttname\"><a href=\"a00155.html#gaf348552978553630d2a00b78eb887ced\">glm::mediump_imat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, int, mediump &gt; mediump_imat4</div><div class=\"ttdoc\">Medium-qualifier signed integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00094\">matrix_integer.hpp:94</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga4e1bed14fbc7f4b376aaed064f89f0fb\"><div class=\"ttname\"><a href=\"a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb\">glm::mediump_umat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, uint, mediump &gt; mediump_umat4x3</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00276\">matrix_integer.hpp:276</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga90718c7128320b24b52f9ea70e643ad4\"><div class=\"ttname\"><a href=\"a00155.html#ga90718c7128320b24b52f9ea70e643ad4\">glm::highp_umat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, uint, highp &gt; highp_umat2x3</div><div class=\"ttdoc\">High-qualifier unsigned integer 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00202\">matrix_integer.hpp:202</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaec3d624306bd59649f021864709d56b5\"><div class=\"ttname\"><a href=\"a00155.html#gaec3d624306bd59649f021864709d56b5\">glm::lowp_umat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, uint, lowp &gt; lowp_umat3x4</div><div class=\"ttdoc\">Low-qualifier unsigned integer 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00318\">matrix_integer.hpp:318</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gad99cc2aad8fc57f068cfa7719dbbea12\"><div class=\"ttname\"><a href=\"a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12\">glm::mediump_imat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, int, mediump &gt; mediump_imat3x3</div><div class=\"ttdoc\">Medium-qualifier signed integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00115\">matrix_integer.hpp:115</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga6c63bdc736efd3466e0730de0251cb71\"><div class=\"ttname\"><a href=\"a00155.html#ga6c63bdc736efd3466e0730de0251cb71\">glm::mediump_imat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, int, mediump &gt; mediump_imat3</div><div class=\"ttdoc\">Medium-qualifier signed integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00090\">matrix_integer.hpp:90</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga25ee15c323924f2d0fe9896d329e5086\"><div class=\"ttname\"><a href=\"a00155.html#ga25ee15c323924f2d0fe9896d329e5086\">glm::highp_umat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, uint, highp &gt; highp_umat3x4</div><div class=\"ttdoc\">High-qualifier unsigned integer 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00218\">matrix_integer.hpp:218</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga7716c2b210d141846f1ac4e774adef5e\"><div class=\"ttname\"><a href=\"a00155.html#ga7716c2b210d141846f1ac4e774adef5e\">glm::lowp_umat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, uint, lowp &gt; lowp_umat4x2</div><div class=\"ttdoc\">Low-qualifier unsigned integer 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00322\">matrix_integer.hpp:322</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga038f68437155ffa3c2583a15264a8195\"><div class=\"ttname\"><a href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">glm::imat3</a></div><div class=\"ttdeci\">mediump_imat3 imat3</div><div class=\"ttdoc\">Signed integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00366\">matrix_integer.hpp:366</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga3f42dd3d5d94a0fd5706f7ec8dd0c605\"><div class=\"ttname\"><a href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">glm::imat2x3</a></div><div class=\"ttdeci\">mediump_imat2x3 imat2x3</div><div class=\"ttdoc\">Signed integer 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00378\">matrix_integer.hpp:378</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaf1145f72bcdd590f5808c4bc170c2924\"><div class=\"ttname\"><a href=\"a00155.html#gaf1145f72bcdd590f5808c4bc170c2924\">glm::lowp_umat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, uint, lowp &gt; lowp_umat3</div><div class=\"ttdoc\">Low-qualifier unsigned integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00289\">matrix_integer.hpp:289</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga5085e3ff02abbac5e537eb7b89ab63b6\"><div class=\"ttname\"><a href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">glm::umat3</a></div><div class=\"ttdeci\">mediump_umat3 umat3</div><div class=\"ttdoc\">Unsigned integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00443\">matrix_integer.hpp:443</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga07d7b7173e2a6f843ff5f1c615a95b41\"><div class=\"ttname\"><a href=\"a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41\">glm::highp_imat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, int, highp &gt; highp_imat3x3</div><div class=\"ttdoc\">High-qualifier signed integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00065\">matrix_integer.hpp:65</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga4cae85566f900debf930c41944b64691\"><div class=\"ttname\"><a href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">glm::umat2</a></div><div class=\"ttdeci\">mediump_umat2 umat2</div><div class=\"ttdoc\">Unsigned integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00439\">matrix_integer.hpp:439</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga8c9e7a388f8e7c52f1e6857dee8afb65\"><div class=\"ttname\"><a href=\"a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65\">glm::lowp_imat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, int, lowp &gt; lowp_imat2x3</div><div class=\"ttdoc\">Low-qualifier signed integer 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00153\">matrix_integer.hpp:153</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga53008f580be99018a17b357b5a4ffc0d\"><div class=\"ttname\"><a href=\"a00155.html#ga53008f580be99018a17b357b5a4ffc0d\">glm::highp_imat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, int, highp &gt; highp_imat3x4</div><div class=\"ttdoc\">High-qualifier signed integer 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00069\">matrix_integer.hpp:69</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gad1e77f7270cad461ca4fcb4c3ec2e98c\"><div class=\"ttname\"><a href=\"a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c\">glm::lowp_imat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, int, lowp &gt; lowp_imat4</div><div class=\"ttdoc\">Low-qualifier signed integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00144\">matrix_integer.hpp:144</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaf72e6d399c42985db6872c50f53d7eb8\"><div class=\"ttname\"><a href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">glm::umat4x4</a></div><div class=\"ttdeci\">mediump_umat4x4 umat4x4</div><div class=\"ttdoc\">Unsigned integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00483\">matrix_integer.hpp:483</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga96b0d26a33b81bb6a60ca0f39682f7eb\"><div class=\"ttname\"><a href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">glm::imat4</a></div><div class=\"ttdeci\">mediump_imat4 imat4</div><div class=\"ttdoc\">Signed integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00370\">matrix_integer.hpp:370</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga8f40483a3ae634ead8ad22272c543a33\"><div class=\"ttname\"><a href=\"a00155.html#ga8f40483a3ae634ead8ad22272c543a33\">glm::lowp_imat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, int, lowp &gt; lowp_imat4x3</div><div class=\"ttdoc\">Low-qualifier signed integer 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00177\">matrix_integer.hpp:177</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga45a8163d02c43216252056b0c120f3a5\"><div class=\"ttname\"><a href=\"a00155.html#ga45a8163d02c43216252056b0c120f3a5\">glm::highp_umat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, uint, highp &gt; highp_umat4x3</div><div class=\"ttdoc\">High-qualifier unsigned integer 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00226\">matrix_integer.hpp:226</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga3072f90fd86f17a862e21589fbb14c0f\"><div class=\"ttname\"><a href=\"a00155.html#ga3072f90fd86f17a862e21589fbb14c0f\">glm::lowp_umat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, uint, lowp &gt; lowp_umat2x3</div><div class=\"ttdoc\">Low-qualifier unsigned integer 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00302\">matrix_integer.hpp:302</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga8bb45fec4bd77bd81b4ae7eb961a270d\"><div class=\"ttname\"><a href=\"a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d\">glm::lowp_umat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, uint, lowp &gt; lowp_umat2x4</div><div class=\"ttdoc\">Low-qualifier unsigned integer 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00306\">matrix_integer.hpp:306</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaf65677e53ac8e31a107399340d5e2451\"><div class=\"ttname\"><a href=\"a00155.html#gaf65677e53ac8e31a107399340d5e2451\">glm::lowp_imat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, int, lowp &gt; lowp_imat4x4</div><div class=\"ttdoc\">Low-qualifier signed integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00181\">matrix_integer.hpp:181</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga1f7d41c36b980774a4d2e7c1647fb4b2\"><div class=\"ttname\"><a href=\"a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2\">glm::highp_umat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, uint, highp &gt; highp_umat3x3</div><div class=\"ttdoc\">High-qualifier unsigned integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00214\">matrix_integer.hpp:214</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga69bfe668f4170379fc1f35d82b060c43\"><div class=\"ttname\"><a href=\"a00155.html#ga69bfe668f4170379fc1f35d82b060c43\">glm::lowp_imat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, int, lowp &gt; lowp_imat3</div><div class=\"ttdoc\">Low-qualifier signed integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00140\">matrix_integer.hpp:140</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga26ec1a2ba08a1488f5f05336858a0f09\"><div class=\"ttname\"><a href=\"a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09\">glm::lowp_imat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, int, lowp &gt; lowp_imat4x2</div><div class=\"ttdoc\">Low-qualifier signed integer 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00173\">matrix_integer.hpp:173</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaa1143120339b7d2d469d327662e8a172\"><div class=\"ttname\"><a href=\"a00155.html#gaa1143120339b7d2d469d327662e8a172\">glm::highp_umat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, uint, highp &gt; highp_umat3</div><div class=\"ttdoc\">High-qualifier unsigned integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00190\">matrix_integer.hpp:190</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga4b2aeb11a329940721dda9583e71f856\"><div class=\"ttname\"><a href=\"a00155.html#ga4b2aeb11a329940721dda9583e71f856\">glm::mediump_imat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, int, mediump &gt; mediump_imat2x2</div><div class=\"ttdoc\">Medium-qualifier signed integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00099\">matrix_integer.hpp:99</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga6aacc960f62e8f7d2fe9d32d5050e7a4\"><div class=\"ttname\"><a href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">glm::imat3x3</a></div><div class=\"ttdeci\">mediump_imat3x3 imat3x3</div><div class=\"ttdoc\">Signed integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00390\">matrix_integer.hpp:390</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga1858820fb292cae396408b2034407f72\"><div class=\"ttname\"><a href=\"a00155.html#ga1858820fb292cae396408b2034407f72\">glm::highp_imat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, int, highp &gt; highp_imat4x2</div><div class=\"ttdoc\">High-qualifier signed integer 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00073\">matrix_integer.hpp:73</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_gaca4506a3efa679eff7c006d9826291fd\"><div class=\"ttname\"><a href=\"a00155.html#gaca4506a3efa679eff7c006d9826291fd\">glm::highp_imat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, int, highp &gt; highp_imat3</div><div class=\"ttdoc\">High-qualifier signed integer 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00041\">matrix_integer.hpp:41</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga7cfb09b34e0fcf73eaf6512d6483ef56\"><div class=\"ttname\"><a href=\"a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56\">glm::highp_imat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, int, highp &gt; highp_imat4</div><div class=\"ttdoc\">High-qualifier signed integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00045\">matrix_integer.hpp:45</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga10aafc66cf1a0ece336b1c5ae13d0cc0\"><div class=\"ttname\"><a href=\"a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0\">glm::lowp_umat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, uint, lowp &gt; lowp_umat4x4</div><div class=\"ttdoc\">Low-qualifier unsigned integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00330\">matrix_integer.hpp:330</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga8da25cd380ba30fc5b68a4687deb3e09\"><div class=\"ttname\"><a href=\"a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09\">glm::mediump_imat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, int, mediump &gt; mediump_imat2x4</div><div class=\"ttdoc\">Medium-qualifier signed integer 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00107\">matrix_integer.hpp:107</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga7b2e9d89745f7175051284e54c81d81c\"><div class=\"ttname\"><a href=\"a00155.html#ga7b2e9d89745f7175051284e54c81d81c\">glm::lowp_umat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, uint, lowp &gt; lowp_umat2x2</div><div class=\"ttdoc\">Low-qualifier unsigned integer 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00298\">matrix_integer.hpp:298</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga09ab33a2636f5f43f7fae29cfbc20fff\"><div class=\"ttname\"><a href=\"a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff\">glm::lowp_umat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, uint, lowp &gt; lowp_umat4x3</div><div class=\"ttdoc\">Low-qualifier unsigned integer 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00326\">matrix_integer.hpp:326</a></div></div>\n<div class=\"ttc\" id=\"a00155_html_ga5087c2beb26a11d9af87432e554cf9d1\"><div class=\"ttname\"><a href=\"a00155.html#ga5087c2beb26a11d9af87432e554cf9d1\">glm::mediump_umat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, uint, mediump &gt; mediump_umat4</div><div class=\"ttdoc\">Medium-qualifier unsigned integer 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00060_source.html#l00243\">matrix_integer.hpp:243</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00061.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_interpolation.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_interpolation.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00197.html\">GLM_GTX_matrix_interpolation</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00061_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga97f160158906ea89676f56cc4697ec98\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga97f160158906ea89676f56cc4697ec98\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html#ga97f160158906ea89676f56cc4697ec98\">axisAngle</a> (mat&lt; 4, 4, T, Q &gt; const &amp;mat, vec&lt; 3, T, Q &gt; &amp;axis, T &amp;angle)</td></tr>\n<tr class=\"memdesc:ga97f160158906ea89676f56cc4697ec98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Get the axis and angle of the rotation from a matrix.  <a href=\"a00197.html#ga97f160158906ea89676f56cc4697ec98\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97f160158906ea89676f56cc4697ec98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga992a5db71893ed1ba6ebac99f0f69831\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga992a5db71893ed1ba6ebac99f0f69831\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html#ga992a5db71893ed1ba6ebac99f0f69831\">axisAngleMatrix</a> (vec&lt; 3, T, Q &gt; const &amp;axis, T const angle)</td></tr>\n<tr class=\"memdesc:ga992a5db71893ed1ba6ebac99f0f69831\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from axis and angle.  <a href=\"a00197.html#ga992a5db71893ed1ba6ebac99f0f69831\">More...</a><br /></td></tr>\n<tr class=\"separator:ga992a5db71893ed1ba6ebac99f0f69831\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8834d4499a1a52fcf531b4506f0b5f67\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8834d4499a1a52fcf531b4506f0b5f67\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html#ga8834d4499a1a52fcf531b4506f0b5f67\">extractMatrixRotation</a> (mat&lt; 4, 4, T, Q &gt; const &amp;mat)</td></tr>\n<tr class=\"memdesc:ga8834d4499a1a52fcf531b4506f0b5f67\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extracts the rotation part of a matrix.  <a href=\"a00197.html#ga8834d4499a1a52fcf531b4506f0b5f67\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8834d4499a1a52fcf531b4506f0b5f67\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad5fc63a2e084000b39f6508ab07421a5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad5fc63a2e084000b39f6508ab07421a5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html#gad5fc63a2e084000b39f6508ab07421a5\">interpolate</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m1, mat&lt; 4, 4, T, Q &gt; const &amp;m2, T const delta)</td></tr>\n<tr class=\"memdesc:gad5fc63a2e084000b39f6508ab07421a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a interpolation of 4 * 4 matrixes.  <a href=\"a00197.html#gad5fc63a2e084000b39f6508ab07421a5\">More...</a><br /></td></tr>\n<tr class=\"separator:gad5fc63a2e084000b39f6508ab07421a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00197.html\">GLM_GTX_matrix_interpolation</a> </p>\n<dl class=\"section author\"><dt>Author</dt><dd>Ghenadii Ursachi (<a href=\"#\" onclick=\"location.href='mai'+'lto:'+'the'+'.a'+'ste'+'ro'+'th@'+'gm'+'ail'+'.c'+'om'; return false;\">the.a<span style=\"display: none;\">.nosp@m.</span>ster<span style=\"display: none;\">.nosp@m.</span>oth@g<span style=\"display: none;\">.nosp@m.</span>mail<span style=\"display: none;\">.nosp@m.</span>.com</a>)</dd></dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00061_source.html\">matrix_interpolation.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00061_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_interpolation.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_interpolation.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00061.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_matrix_interpolation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_matrix_interpolation extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">void</span> <a class=\"code\" href=\"a00197.html#ga97f160158906ea89676f56cc4697ec98\">axisAngle</a>(</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; mat,</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                vec&lt;3, T, Q&gt; &amp; <a class=\"code\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a>,</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                T &amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00197.html#ga992a5db71893ed1ba6ebac99f0f69831\">axisAngleMatrix</a>(</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a>,</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                T <span class=\"keyword\">const</span> <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00197.html#ga8834d4499a1a52fcf531b4506f0b5f67\">extractMatrixRotation</a>(</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; mat);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00197.html#gad5fc63a2e084000b39f6508ab07421a5\">interpolate</a>(</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m1,</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m2,</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                T <span class=\"keyword\">const</span> delta);</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_interpolation.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00197_html_ga97f160158906ea89676f56cc4697ec98\"><div class=\"ttname\"><a href=\"a00197.html#ga97f160158906ea89676f56cc4697ec98\">glm::axisAngle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL void axisAngle(mat&lt; 4, 4, T, Q &gt; const &amp;mat, vec&lt; 3, T, Q &gt; &amp;axis, T &amp;angle)</div><div class=\"ttdoc\">Get the axis and angle of the rotation from a matrix. </div></div>\n<div class=\"ttc\" id=\"a00197_html_gad5fc63a2e084000b39f6508ab07421a5\"><div class=\"ttname\"><a href=\"a00197.html#gad5fc63a2e084000b39f6508ab07421a5\">glm::interpolate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; interpolate(mat&lt; 4, 4, T, Q &gt; const &amp;m1, mat&lt; 4, 4, T, Q &gt; const &amp;m2, T const delta)</div><div class=\"ttdoc\">Build a interpolation of 4 * 4 matrixes. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaf2707d3081789ce097daaa6e54d5287\"><div class=\"ttname\"><a href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">glm::axis</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; axis(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the q rotation axis. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00197_html_ga8834d4499a1a52fcf531b4506f0b5f67\"><div class=\"ttname\"><a href=\"a00197.html#ga8834d4499a1a52fcf531b4506f0b5f67\">glm::extractMatrixRotation</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; extractMatrixRotation(mat&lt; 4, 4, T, Q &gt; const &amp;mat)</div><div class=\"ttdoc\">Extracts the rotation part of a matrix. </div></div>\n<div class=\"ttc\" id=\"a00197_html_ga992a5db71893ed1ba6ebac99f0f69831\"><div class=\"ttname\"><a href=\"a00197.html#ga992a5db71893ed1ba6ebac99f0f69831\">glm::axisAngleMatrix</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; axisAngleMatrix(vec&lt; 3, T, Q &gt; const &amp;axis, T const angle)</div><div class=\"ttdoc\">Build a matrix from axis and angle. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00062.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_inverse.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_inverse.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00156.html\">GLM_GTC_matrix_inverse</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00062_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gae0fcc5fc8783291f9702272de428fa0e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae0fcc5fc8783291f9702272de428fa0e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00156.html#gae0fcc5fc8783291f9702272de428fa0e\">affineInverse</a> (genType const &amp;m)</td></tr>\n<tr class=\"memdesc:gae0fcc5fc8783291f9702272de428fa0e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Fast matrix inverse for affine matrix.  <a href=\"a00156.html#gae0fcc5fc8783291f9702272de428fa0e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae0fcc5fc8783291f9702272de428fa0e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab213cd0e3ead5f316d583f99d6312008\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gab213cd0e3ead5f316d583f99d6312008\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00156.html#gab213cd0e3ead5f316d583f99d6312008\">inverseTranspose</a> (genType const &amp;m)</td></tr>\n<tr class=\"memdesc:gab213cd0e3ead5f316d583f99d6312008\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the inverse transpose of a matrix.  <a href=\"a00156.html#gab213cd0e3ead5f316d583f99d6312008\">More...</a><br /></td></tr>\n<tr class=\"separator:gab213cd0e3ead5f316d583f99d6312008\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00156.html\">GLM_GTC_matrix_inverse</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00062_source.html\">matrix_inverse.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00062_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_inverse.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_inverse.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00062.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../matrix.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_matrix_inverse extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00156.html#gae0fcc5fc8783291f9702272de428fa0e\">affineInverse</a>(genType <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00156.html#gab213cd0e3ead5f316d583f99d6312008\">inverseTranspose</a>(genType <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_inverse.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00156_html_gab213cd0e3ead5f316d583f99d6312008\"><div class=\"ttname\"><a href=\"a00156.html#gab213cd0e3ead5f316d583f99d6312008\">glm::inverseTranspose</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType inverseTranspose(genType const &amp;m)</div><div class=\"ttdoc\">Compute the inverse transpose of a matrix. </div></div>\n<div class=\"ttc\" id=\"a00156_html_gae0fcc5fc8783291f9702272de428fa0e\"><div class=\"ttname\"><a href=\"a00156.html#gae0fcc5fc8783291f9702272de428fa0e\">glm::affineInverse</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType affineInverse(genType const &amp;m)</div><div class=\"ttdoc\">Fast matrix inverse for affine matrix. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00063.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_major_storage.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_major_storage.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00198.html\">GLM_GTX_matrix_major_storage</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00063_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaaff72f11286e59a4a88ed21a347f284c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaaff72f11286e59a4a88ed21a347f284c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaaff72f11286e59a4a88ed21a347f284c\">colMajor2</a> (vec&lt; 2, T, Q &gt; const &amp;v1, vec&lt; 2, T, Q &gt; const &amp;v2)</td></tr>\n<tr class=\"memdesc:gaaff72f11286e59a4a88ed21a347f284c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from column vectors.  <a href=\"a00198.html#gaaff72f11286e59a4a88ed21a347f284c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaff72f11286e59a4a88ed21a347f284c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafc25fd44196c92b1397b127aec1281ab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafc25fd44196c92b1397b127aec1281ab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gafc25fd44196c92b1397b127aec1281ab\">colMajor2</a> (mat&lt; 2, 2, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gafc25fd44196c92b1397b127aec1281ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from other matrix.  <a href=\"a00198.html#gafc25fd44196c92b1397b127aec1281ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gafc25fd44196c92b1397b127aec1281ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1e25b72b085087740c92f5c70f3b051f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1e25b72b085087740c92f5c70f3b051f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#ga1e25b72b085087740c92f5c70f3b051f\">colMajor3</a> (vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)</td></tr>\n<tr class=\"memdesc:ga1e25b72b085087740c92f5c70f3b051f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from column vectors.  <a href=\"a00198.html#ga1e25b72b085087740c92f5c70f3b051f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e25b72b085087740c92f5c70f3b051f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga86bd0656e787bb7f217607572590af27\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga86bd0656e787bb7f217607572590af27\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#ga86bd0656e787bb7f217607572590af27\">colMajor3</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:ga86bd0656e787bb7f217607572590af27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from other matrix.  <a href=\"a00198.html#ga86bd0656e787bb7f217607572590af27\">More...</a><br /></td></tr>\n<tr class=\"separator:ga86bd0656e787bb7f217607572590af27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4aa6c7e17bfce41a6c13bf6469fab05\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf4aa6c7e17bfce41a6c13bf6469fab05\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaf4aa6c7e17bfce41a6c13bf6469fab05\">colMajor4</a> (vec&lt; 4, T, Q &gt; const &amp;v1, vec&lt; 4, T, Q &gt; const &amp;v2, vec&lt; 4, T, Q &gt; const &amp;v3, vec&lt; 4, T, Q &gt; const &amp;v4)</td></tr>\n<tr class=\"memdesc:gaf4aa6c7e17bfce41a6c13bf6469fab05\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from column vectors.  <a href=\"a00198.html#gaf4aa6c7e17bfce41a6c13bf6469fab05\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4aa6c7e17bfce41a6c13bf6469fab05\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3\">colMajor4</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from other matrix.  <a href=\"a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\">rowMajor2</a> (vec&lt; 2, T, Q &gt; const &amp;v1, vec&lt; 2, T, Q &gt; const &amp;v2)</td></tr>\n<tr class=\"memdesc:gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from row vectors.  <a href=\"a00198.html#gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf66c75ed69ca9e87462550708c2c6726\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf66c75ed69ca9e87462550708c2c6726\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaf66c75ed69ca9e87462550708c2c6726\">rowMajor2</a> (mat&lt; 2, 2, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gaf66c75ed69ca9e87462550708c2c6726\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from other matrix.  <a href=\"a00198.html#gaf66c75ed69ca9e87462550708c2c6726\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf66c75ed69ca9e87462550708c2c6726\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ae46497493339f745754e40f438442e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2ae46497493339f745754e40f438442e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#ga2ae46497493339f745754e40f438442e\">rowMajor3</a> (vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)</td></tr>\n<tr class=\"memdesc:ga2ae46497493339f745754e40f438442e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from row vectors.  <a href=\"a00198.html#ga2ae46497493339f745754e40f438442e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2ae46497493339f745754e40f438442e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77\">rowMajor3</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from other matrix.  <a href=\"a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77\">More...</a><br /></td></tr>\n<tr class=\"separator:gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#ga9636cd6bbe2c32a8d0c03ffb8b1ef284\">rowMajor4</a> (vec&lt; 4, T, Q &gt; const &amp;v1, vec&lt; 4, T, Q &gt; const &amp;v2, vec&lt; 4, T, Q &gt; const &amp;v3, vec&lt; 4, T, Q &gt; const &amp;v4)</td></tr>\n<tr class=\"memdesc:ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from row vectors.  <a href=\"a00198.html#ga9636cd6bbe2c32a8d0c03ffb8b1ef284\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac92ad1c2acdf18d3eb7be45a32f9566b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac92ad1c2acdf18d3eb7be45a32f9566b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b\">rowMajor4</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gac92ad1c2acdf18d3eb7be45a32f9566b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from other matrix.  <a href=\"a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b\">More...</a><br /></td></tr>\n<tr class=\"separator:gac92ad1c2acdf18d3eb7be45a32f9566b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00198.html\">GLM_GTX_matrix_major_storage</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_extented_min_max (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00063_source.html\">matrix_major_storage.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00063_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_major_storage.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_major_storage.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00063.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_matrix_major_storage is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_matrix_major_storage extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; <a class=\"code\" href=\"a00198.html#gaf66c75ed69ca9e87462550708c2c6726\">rowMajor2</a>(</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; <a class=\"code\" href=\"a00198.html#gaf66c75ed69ca9e87462550708c2c6726\">rowMajor2</a>(</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                mat&lt;2, 2, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77\">rowMajor3</a>(</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2, </div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v3);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77\">rowMajor3</a>(</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b\">rowMajor4</a>(</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2,</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v3, </div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v4);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b\">rowMajor4</a>(</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; <a class=\"code\" href=\"a00198.html#gafc25fd44196c92b1397b127aec1281ab\">colMajor2</a>(</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; <a class=\"code\" href=\"a00198.html#gafc25fd44196c92b1397b127aec1281ab\">colMajor2</a>(</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                mat&lt;2, 2, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00198.html#ga86bd0656e787bb7f217607572590af27\">colMajor3</a>(</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2, </div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v3);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00198.html#ga86bd0656e787bb7f217607572590af27\">colMajor3</a>(</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3\">colMajor4</a>(</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2, </div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v3, </div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v4);</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;                                </div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3\">colMajor4</a>(</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_major_storage.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00198_html_gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><div class=\"ttname\"><a href=\"a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77\">glm::rowMajor3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; rowMajor3(mat&lt; 3, 3, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Build a row major matrix from other matrix. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00198_html_gac92ad1c2acdf18d3eb7be45a32f9566b\"><div class=\"ttname\"><a href=\"a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b\">glm::rowMajor4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; rowMajor4(mat&lt; 4, 4, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Build a row major matrix from other matrix. </div></div>\n<div class=\"ttc\" id=\"a00198_html_gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><div class=\"ttname\"><a href=\"a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3\">glm::colMajor4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; colMajor4(mat&lt; 4, 4, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Build a column major matrix from other matrix. </div></div>\n<div class=\"ttc\" id=\"a00198_html_gafc25fd44196c92b1397b127aec1281ab\"><div class=\"ttname\"><a href=\"a00198.html#gafc25fd44196c92b1397b127aec1281ab\">glm::colMajor2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt; colMajor2(mat&lt; 2, 2, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Build a column major matrix from other matrix. </div></div>\n<div class=\"ttc\" id=\"a00198_html_ga86bd0656e787bb7f217607572590af27\"><div class=\"ttname\"><a href=\"a00198.html#ga86bd0656e787bb7f217607572590af27\">glm::colMajor3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; colMajor3(mat&lt; 3, 3, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Build a column major matrix from other matrix. </div></div>\n<div class=\"ttc\" id=\"a00198_html_gaf66c75ed69ca9e87462550708c2c6726\"><div class=\"ttname\"><a href=\"a00198.html#gaf66c75ed69ca9e87462550708c2c6726\">glm::rowMajor2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt; rowMajor2(mat&lt; 2, 2, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Build a row major matrix from other matrix. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00064.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_operation.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_operation.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00199.html\">GLM_GTX_matrix_operation</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00064_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga58a32a2beeb2478dae2a721368cdd4ac\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga58a32a2beeb2478dae2a721368cdd4ac\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga58a32a2beeb2478dae2a721368cdd4ac\">diagonal2x2</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga58a32a2beeb2478dae2a721368cdd4ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga58a32a2beeb2478dae2a721368cdd4ac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga58a32a2beeb2478dae2a721368cdd4ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab69f900206a430e2875a5a073851e175\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab69f900206a430e2875a5a073851e175\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#gab69f900206a430e2875a5a073851e175\">diagonal2x3</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gab69f900206a430e2875a5a073851e175\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#gab69f900206a430e2875a5a073851e175\">More...</a><br /></td></tr>\n<tr class=\"separator:gab69f900206a430e2875a5a073851e175\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30b4dbfed60a919d66acc8a63bcdc549\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga30b4dbfed60a919d66acc8a63bcdc549\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga30b4dbfed60a919d66acc8a63bcdc549\">diagonal2x4</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga30b4dbfed60a919d66acc8a63bcdc549\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga30b4dbfed60a919d66acc8a63bcdc549\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30b4dbfed60a919d66acc8a63bcdc549\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga832c805d5130d28ad76236958d15b47d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga832c805d5130d28ad76236958d15b47d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga832c805d5130d28ad76236958d15b47d\">diagonal3x2</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga832c805d5130d28ad76236958d15b47d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga832c805d5130d28ad76236958d15b47d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga832c805d5130d28ad76236958d15b47d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5487ff9cdbc8e04d594adef1bcb16ee0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5487ff9cdbc8e04d594adef1bcb16ee0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga5487ff9cdbc8e04d594adef1bcb16ee0\">diagonal3x3</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga5487ff9cdbc8e04d594adef1bcb16ee0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga5487ff9cdbc8e04d594adef1bcb16ee0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5487ff9cdbc8e04d594adef1bcb16ee0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad7551139cff0c4208d27f0ad3437833e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad7551139cff0c4208d27f0ad3437833e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#gad7551139cff0c4208d27f0ad3437833e\">diagonal3x4</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gad7551139cff0c4208d27f0ad3437833e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#gad7551139cff0c4208d27f0ad3437833e\">More...</a><br /></td></tr>\n<tr class=\"separator:gad7551139cff0c4208d27f0ad3437833e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb8969e6543ba775c6638161a37ac330\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacb8969e6543ba775c6638161a37ac330\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#gacb8969e6543ba775c6638161a37ac330\">diagonal4x2</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gacb8969e6543ba775c6638161a37ac330\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#gacb8969e6543ba775c6638161a37ac330\">More...</a><br /></td></tr>\n<tr class=\"separator:gacb8969e6543ba775c6638161a37ac330\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae235def5049d6740f0028433f5e13f90\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae235def5049d6740f0028433f5e13f90\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#gae235def5049d6740f0028433f5e13f90\">diagonal4x3</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gae235def5049d6740f0028433f5e13f90\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#gae235def5049d6740f0028433f5e13f90\">More...</a><br /></td></tr>\n<tr class=\"separator:gae235def5049d6740f0028433f5e13f90\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0b4cd8dea436791b072356231ee8578f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0b4cd8dea436791b072356231ee8578f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga0b4cd8dea436791b072356231ee8578f\">diagonal4x4</a> (vec&lt; 4, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga0b4cd8dea436791b072356231ee8578f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga0b4cd8dea436791b072356231ee8578f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0b4cd8dea436791b072356231ee8578f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00199.html\">GLM_GTX_matrix_operation</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00064_source.html\">matrix_operation.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00064_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_operation.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_operation.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00064.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_matrix_operation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_matrix_operation extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; <a class=\"code\" href=\"a00199.html#ga58a32a2beeb2478dae2a721368cdd4ac\">diagonal2x2</a>(</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; <a class=\"code\" href=\"a00199.html#gab69f900206a430e2875a5a073851e175\">diagonal2x3</a>(</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; <a class=\"code\" href=\"a00199.html#ga30b4dbfed60a919d66acc8a63bcdc549\">diagonal2x4</a>(</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; <a class=\"code\" href=\"a00199.html#ga832c805d5130d28ad76236958d15b47d\">diagonal3x2</a>(</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00199.html#ga5487ff9cdbc8e04d594adef1bcb16ee0\">diagonal3x3</a>(</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; <a class=\"code\" href=\"a00199.html#gad7551139cff0c4208d27f0ad3437833e\">diagonal3x4</a>(</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; <a class=\"code\" href=\"a00199.html#gacb8969e6543ba775c6638161a37ac330\">diagonal4x2</a>(</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; <a class=\"code\" href=\"a00199.html#gae235def5049d6740f0028433f5e13f90\">diagonal4x3</a>(</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00199.html#ga0b4cd8dea436791b072356231ee8578f\">diagonal4x4</a>(</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_operation.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00199_html_gae235def5049d6740f0028433f5e13f90\"><div class=\"ttname\"><a href=\"a00199.html#gae235def5049d6740f0028433f5e13f90\">glm::diagonal4x3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 3, T, Q &gt; diagonal4x3(vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n<div class=\"ttc\" id=\"a00199_html_ga5487ff9cdbc8e04d594adef1bcb16ee0\"><div class=\"ttname\"><a href=\"a00199.html#ga5487ff9cdbc8e04d594adef1bcb16ee0\">glm::diagonal3x3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; diagonal3x3(vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n<div class=\"ttc\" id=\"a00199_html_gab69f900206a430e2875a5a073851e175\"><div class=\"ttname\"><a href=\"a00199.html#gab69f900206a430e2875a5a073851e175\">glm::diagonal2x3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 3, T, Q &gt; diagonal2x3(vec&lt; 2, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n<div class=\"ttc\" id=\"a00199_html_gad7551139cff0c4208d27f0ad3437833e\"><div class=\"ttname\"><a href=\"a00199.html#gad7551139cff0c4208d27f0ad3437833e\">glm::diagonal3x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 4, T, Q &gt; diagonal3x4(vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n<div class=\"ttc\" id=\"a00199_html_ga0b4cd8dea436791b072356231ee8578f\"><div class=\"ttname\"><a href=\"a00199.html#ga0b4cd8dea436791b072356231ee8578f\">glm::diagonal4x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; diagonal4x4(vec&lt; 4, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n<div class=\"ttc\" id=\"a00199_html_ga832c805d5130d28ad76236958d15b47d\"><div class=\"ttname\"><a href=\"a00199.html#ga832c805d5130d28ad76236958d15b47d\">glm::diagonal3x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 2, T, Q &gt; diagonal3x2(vec&lt; 2, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n<div class=\"ttc\" id=\"a00199_html_ga58a32a2beeb2478dae2a721368cdd4ac\"><div class=\"ttname\"><a href=\"a00199.html#ga58a32a2beeb2478dae2a721368cdd4ac\">glm::diagonal2x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt; diagonal2x2(vec&lt; 2, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n<div class=\"ttc\" id=\"a00199_html_ga30b4dbfed60a919d66acc8a63bcdc549\"><div class=\"ttname\"><a href=\"a00199.html#ga30b4dbfed60a919d66acc8a63bcdc549\">glm::diagonal2x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 4, T, Q &gt; diagonal2x4(vec&lt; 2, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n<div class=\"ttc\" id=\"a00199_html_gacb8969e6543ba775c6638161a37ac330\"><div class=\"ttname\"><a href=\"a00199.html#gacb8969e6543ba775c6638161a37ac330\">glm::diagonal4x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 2, T, Q &gt; diagonal4x2(vec&lt; 2, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Build a diagonal matrix. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00065.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_query.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_query.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00200.html\">GLM_GTX_matrix_query</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00065_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaee935d145581c82e82b154ccfd78ad91\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q, template&lt; length_t, length_t, typename, qualifier &gt; class matType&gt; </td></tr>\n<tr class=\"memitem:gaee935d145581c82e82b154ccfd78ad91\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#gaee935d145581c82e82b154ccfd78ad91\">isIdentity</a> (matType&lt; C, R, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaee935d145581c82e82b154ccfd78ad91\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is an identity matrix.  <a href=\"a00200.html#gaee935d145581c82e82b154ccfd78ad91\">More...</a><br /></td></tr>\n<tr class=\"separator:gaee935d145581c82e82b154ccfd78ad91\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae785af56f47ce220a1609f7f84aa077a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae785af56f47ce220a1609f7f84aa077a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#gae785af56f47ce220a1609f7f84aa077a\">isNormalized</a> (mat&lt; 2, 2, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gae785af56f47ce220a1609f7f84aa077a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is a normalized matrix.  <a href=\"a00200.html#gae785af56f47ce220a1609f7f84aa077a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae785af56f47ce220a1609f7f84aa077a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa068311695f28f5f555f5f746a6a66fb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa068311695f28f5f555f5f746a6a66fb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#gaa068311695f28f5f555f5f746a6a66fb\">isNormalized</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaa068311695f28f5f555f5f746a6a66fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is a normalized matrix.  <a href=\"a00200.html#gaa068311695f28f5f555f5f746a6a66fb\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa068311695f28f5f555f5f746a6a66fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d9bb4d0465df49fedfad79adc6ce4ad\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4d9bb4d0465df49fedfad79adc6ce4ad\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad\">isNormalized</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga4d9bb4d0465df49fedfad79adc6ce4ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is a normalized matrix.  <a href=\"a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4d9bb4d0465df49fedfad79adc6ce4ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9790ec222ce948c0ff0d8ce927340dba\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9790ec222ce948c0ff0d8ce927340dba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#ga9790ec222ce948c0ff0d8ce927340dba\">isNull</a> (mat&lt; 2, 2, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga9790ec222ce948c0ff0d8ce927340dba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix a null matrix.  <a href=\"a00200.html#ga9790ec222ce948c0ff0d8ce927340dba\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9790ec222ce948c0ff0d8ce927340dba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae14501c6b14ccda6014cc5350080103d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae14501c6b14ccda6014cc5350080103d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#gae14501c6b14ccda6014cc5350080103d\">isNull</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gae14501c6b14ccda6014cc5350080103d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix a null matrix.  <a href=\"a00200.html#gae14501c6b14ccda6014cc5350080103d\">More...</a><br /></td></tr>\n<tr class=\"separator:gae14501c6b14ccda6014cc5350080103d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b98bb30a9fefa7cdea5f1dcddba677b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2b98bb30a9fefa7cdea5f1dcddba677b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b\">isNull</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga2b98bb30a9fefa7cdea5f1dcddba677b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is a null matrix.  <a href=\"a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b98bb30a9fefa7cdea5f1dcddba677b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga58f3289f74dcab653387dd78ad93ca40\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q, template&lt; length_t, length_t, typename, qualifier &gt; class matType&gt; </td></tr>\n<tr class=\"memitem:ga58f3289f74dcab653387dd78ad93ca40\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#ga58f3289f74dcab653387dd78ad93ca40\">isOrthogonal</a> (matType&lt; C, R, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga58f3289f74dcab653387dd78ad93ca40\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is an orthonormalized matrix.  <a href=\"a00200.html#ga58f3289f74dcab653387dd78ad93ca40\">More...</a><br /></td></tr>\n<tr class=\"separator:ga58f3289f74dcab653387dd78ad93ca40\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00200.html\">GLM_GTX_matrix_query</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00227.html\" title=\"Include <glm/gtx/vector_query.hpp> to use the features of this extension. \">GLM_GTX_vector_query</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00065_source.html\">matrix_query.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00065_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_query.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_query.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00065.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/vector_query.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_matrix_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_matrix_query extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b\">isNull</a>(mat&lt;2, 2, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b\">isNull</a>(mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b\">isNull</a>(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        </div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keyword\">template</span>&lt;length_t, length_t, <span class=\"keyword\">typename</span>, qualifier&gt; <span class=\"keyword\">class </span>matType&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00200.html#gaee935d145581c82e82b154ccfd78ad91\">isIdentity</a>(matType&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad\">isNormalized</a>(mat&lt;2, 2, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad\">isNormalized</a>(mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad\">isNormalized</a>(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keyword\">template</span>&lt;length_t, length_t, <span class=\"keyword\">typename</span>, qualifier&gt; <span class=\"keyword\">class </span>matType&gt;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00200.html#ga58f3289f74dcab653387dd78ad93ca40\">isOrthogonal</a>(matType&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_query.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00151_html_ga2a1e57fc5592b69cfae84174cbfc9429\"><div class=\"ttname\"><a href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">glm::epsilon</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()</div><div class=\"ttdoc\">Return the epsilon constant for floating point types. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00200_html_ga2b98bb30a9fefa7cdea5f1dcddba677b\"><div class=\"ttname\"><a href=\"a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b\">glm::isNull</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool isNull(mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)</div><div class=\"ttdoc\">Return whether a matrix is a null matrix. </div></div>\n<div class=\"ttc\" id=\"a00200_html_ga58f3289f74dcab653387dd78ad93ca40\"><div class=\"ttname\"><a href=\"a00200.html#ga58f3289f74dcab653387dd78ad93ca40\">glm::isOrthogonal</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool isOrthogonal(matType&lt; C, R, T, Q &gt; const &amp;m, T const &amp;epsilon)</div><div class=\"ttdoc\">Return whether a matrix is an orthonormalized matrix. </div></div>\n<div class=\"ttc\" id=\"a00200_html_gaee935d145581c82e82b154ccfd78ad91\"><div class=\"ttname\"><a href=\"a00200.html#gaee935d145581c82e82b154ccfd78ad91\">glm::isIdentity</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool isIdentity(matType&lt; C, R, T, Q &gt; const &amp;m, T const &amp;epsilon)</div><div class=\"ttdoc\">Return whether a matrix is an identity matrix. </div></div>\n<div class=\"ttc\" id=\"a00200_html_ga4d9bb4d0465df49fedfad79adc6ce4ad\"><div class=\"ttname\"><a href=\"a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad\">glm::isNormalized</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool isNormalized(mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)</div><div class=\"ttdoc\">Return whether a matrix is a normalized matrix. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00066.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_transform.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_transform.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00157.html\">GLM_GTC_matrix_transform</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00066_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0bcd4542e0affc63a0b8c08fcb839ea9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0bcd4542e0affc63a0b8c08fcb839ea9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga0bcd4542e0affc63a0b8c08fcb839ea9\">frustum</a> (T left, T right, T bottom, T top, T near, T far)</td></tr>\n<tr class=\"memdesc:ga0bcd4542e0affc63a0b8c08fcb839ea9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a frustum matrix with default handedness.  <a href=\"a00157.html#ga0bcd4542e0affc63a0b8c08fcb839ea9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0bcd4542e0affc63a0b8c08fcb839ea9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae4277c37f61d81da01bc9db14ea90296\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae4277c37f61d81da01bc9db14ea90296\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gae4277c37f61d81da01bc9db14ea90296\">frustumLH</a> (T left, T right, T bottom, T top, T near, T far)</td></tr>\n<tr class=\"memdesc:gae4277c37f61d81da01bc9db14ea90296\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a left handed frustum matrix.  <a href=\"a00157.html#gae4277c37f61d81da01bc9db14ea90296\">More...</a><br /></td></tr>\n<tr class=\"separator:gae4277c37f61d81da01bc9db14ea90296\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4366ab45880c6c5f8b3e8c371ca4b136\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga4366ab45880c6c5f8b3e8c371ca4b136\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga4366ab45880c6c5f8b3e8c371ca4b136\">frustumRH</a> (T left, T right, T bottom, T top, T near, T far)</td></tr>\n<tr class=\"memdesc:ga4366ab45880c6c5f8b3e8c371ca4b136\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a right handed frustum matrix.  <a href=\"a00157.html#ga4366ab45880c6c5f8b3e8c371ca4b136\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4366ab45880c6c5f8b3e8c371ca4b136\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga44fa38a18349450325cae2661bb115ca\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga44fa38a18349450325cae2661bb115ca\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga44fa38a18349450325cae2661bb115ca\">infinitePerspective</a> (T fovy, T aspect, T near)</td></tr>\n<tr class=\"memdesc:ga44fa38a18349450325cae2661bb115ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default handedness.  <a href=\"a00157.html#ga44fa38a18349450325cae2661bb115ca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga44fa38a18349450325cae2661bb115ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3201b30f5b3ea0f933246d87bfb992a9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga3201b30f5b3ea0f933246d87bfb992a9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga3201b30f5b3ea0f933246d87bfb992a9\">infinitePerspectiveLH</a> (T fovy, T aspect, T near)</td></tr>\n<tr class=\"memdesc:ga3201b30f5b3ea0f933246d87bfb992a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite.  <a href=\"a00157.html#ga3201b30f5b3ea0f933246d87bfb992a9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3201b30f5b3ea0f933246d87bfb992a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99672ffe5714ef478dab2437255fe7e1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga99672ffe5714ef478dab2437255fe7e1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga99672ffe5714ef478dab2437255fe7e1\">infinitePerspectiveRH</a> (T fovy, T aspect, T near)</td></tr>\n<tr class=\"memdesc:ga99672ffe5714ef478dab2437255fe7e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite.  <a href=\"a00157.html#ga99672ffe5714ef478dab2437255fe7e1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99672ffe5714ef478dab2437255fe7e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa64aa951a0e99136bba9008d2b59c78e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa64aa951a0e99136bba9008d2b59c78e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaa64aa951a0e99136bba9008d2b59c78e\">lookAt</a> (vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:gaa64aa951a0e99136bba9008d2b59c78e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a look at view matrix based on the default handedness.  <a href=\"a00157.html#gaa64aa951a0e99136bba9008d2b59c78e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa64aa951a0e99136bba9008d2b59c78e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab2c09e25b0a16d3a9d89cc85bbae41b0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab2c09e25b0a16d3a9d89cc85bbae41b0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gab2c09e25b0a16d3a9d89cc85bbae41b0\">lookAtLH</a> (vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:gab2c09e25b0a16d3a9d89cc85bbae41b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a left handed look at view matrix.  <a href=\"a00157.html#gab2c09e25b0a16d3a9d89cc85bbae41b0\">More...</a><br /></td></tr>\n<tr class=\"separator:gab2c09e25b0a16d3a9d89cc85bbae41b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacfa12c8889c754846bc20c65d9b5c701\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacfa12c8889c754846bc20c65d9b5c701\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gacfa12c8889c754846bc20c65d9b5c701\">lookAtRH</a> (vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:gacfa12c8889c754846bc20c65d9b5c701\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a right handed look at view matrix.  <a href=\"a00157.html#gacfa12c8889c754846bc20c65d9b5c701\">More...</a><br /></td></tr>\n<tr class=\"separator:gacfa12c8889c754846bc20c65d9b5c701\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6615d8a9d39432e279c4575313ecb456\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga6615d8a9d39432e279c4575313ecb456\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga6615d8a9d39432e279c4575313ecb456\">ortho</a> (T left, T right, T bottom, T top, T zNear, T zFar)</td></tr>\n<tr class=\"memdesc:ga6615d8a9d39432e279c4575313ecb456\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for an orthographic parallel viewing volume, using the default handedness.  <a href=\"a00157.html#ga6615d8a9d39432e279c4575313ecb456\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6615d8a9d39432e279c4575313ecb456\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae5b6b40ed882cd56cd7cb97701909c06\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae5b6b40ed882cd56cd7cb97701909c06\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gae5b6b40ed882cd56cd7cb97701909c06\">ortho</a> (T left, T right, T bottom, T top)</td></tr>\n<tr class=\"memdesc:gae5b6b40ed882cd56cd7cb97701909c06\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for projecting two-dimensional coordinates onto the screen.  <a href=\"a00157.html#gae5b6b40ed882cd56cd7cb97701909c06\">More...</a><br /></td></tr>\n<tr class=\"separator:gae5b6b40ed882cd56cd7cb97701909c06\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad122a79aadaa5529cec4ac197203db7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gad122a79aadaa5529cec4ac197203db7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gad122a79aadaa5529cec4ac197203db7f\">orthoLH</a> (T left, T right, T bottom, T top, T zNear, T zFar)</td></tr>\n<tr class=\"memdesc:gad122a79aadaa5529cec4ac197203db7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for an orthographic parallel viewing volume, using left-handedness.  <a href=\"a00157.html#gad122a79aadaa5529cec4ac197203db7f\">More...</a><br /></td></tr>\n<tr class=\"separator:gad122a79aadaa5529cec4ac197203db7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16264c9b838edeb9dd1de7a1010a13a4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga16264c9b838edeb9dd1de7a1010a13a4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga16264c9b838edeb9dd1de7a1010a13a4\">orthoRH</a> (T left, T right, T bottom, T top, T zNear, T zFar)</td></tr>\n<tr class=\"memdesc:ga16264c9b838edeb9dd1de7a1010a13a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for an orthographic parallel viewing volume, using right-handedness.  <a href=\"a00157.html#ga16264c9b838edeb9dd1de7a1010a13a4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16264c9b838edeb9dd1de7a1010a13a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga747c8cf99458663dd7ad1bb3a2f07787\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga747c8cf99458663dd7ad1bb3a2f07787\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787\">perspective</a> (T fovy, T aspect, T near, T far)</td></tr>\n<tr class=\"memdesc:ga747c8cf99458663dd7ad1bb3a2f07787\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a symetric perspective-view frustum based on the default handedness.  <a href=\"a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787\">More...</a><br /></td></tr>\n<tr class=\"separator:ga747c8cf99458663dd7ad1bb3a2f07787\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebd02240fd36e85ad754f02ddd9a560d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaebd02240fd36e85ad754f02ddd9a560d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaebd02240fd36e85ad754f02ddd9a560d\">perspectiveFov</a> (T fov, T width, T height, T near, T far)</td></tr>\n<tr class=\"memdesc:gaebd02240fd36e85ad754f02ddd9a560d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a perspective projection matrix based on a field of view and the default handedness.  <a href=\"a00157.html#gaebd02240fd36e85ad754f02ddd9a560d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebd02240fd36e85ad754f02ddd9a560d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6aebe16c164bd8e52554cbe0304ef4aa\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga6aebe16c164bd8e52554cbe0304ef4aa\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga6aebe16c164bd8e52554cbe0304ef4aa\">perspectiveFovLH</a> (T fov, T width, T height, T near, T far)</td></tr>\n<tr class=\"memdesc:ga6aebe16c164bd8e52554cbe0304ef4aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a left handed perspective projection matrix based on a field of view.  <a href=\"a00157.html#ga6aebe16c164bd8e52554cbe0304ef4aa\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6aebe16c164bd8e52554cbe0304ef4aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf32bf563f28379c68554a44ee60c6a85\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaf32bf563f28379c68554a44ee60c6a85\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaf32bf563f28379c68554a44ee60c6a85\">perspectiveFovRH</a> (T fov, T width, T height, T near, T far)</td></tr>\n<tr class=\"memdesc:gaf32bf563f28379c68554a44ee60c6a85\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a right handed perspective projection matrix based on a field of view.  <a href=\"a00157.html#gaf32bf563f28379c68554a44ee60c6a85\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf32bf563f28379c68554a44ee60c6a85\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bd34951dc7022ac256fcb51d7f6fc2f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga9bd34951dc7022ac256fcb51d7f6fc2f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga9bd34951dc7022ac256fcb51d7f6fc2f\">perspectiveLH</a> (T fovy, T aspect, T near, T far)</td></tr>\n<tr class=\"memdesc:ga9bd34951dc7022ac256fcb51d7f6fc2f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a left handed, symetric perspective-view frustum.  <a href=\"a00157.html#ga9bd34951dc7022ac256fcb51d7f6fc2f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9bd34951dc7022ac256fcb51d7f6fc2f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga26b88757fbd90601b80768a7e1ad3aa1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga26b88757fbd90601b80768a7e1ad3aa1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga26b88757fbd90601b80768a7e1ad3aa1\">perspectiveRH</a> (T fovy, T aspect, T near, T far)</td></tr>\n<tr class=\"memdesc:ga26b88757fbd90601b80768a7e1ad3aa1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a right handed, symetric perspective-view frustum.  <a href=\"a00157.html#ga26b88757fbd90601b80768a7e1ad3aa1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga26b88757fbd90601b80768a7e1ad3aa1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q, typename U &gt; </td></tr>\n<tr class=\"memitem:gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaf6b21eadb7ac2ecbbe258a9a233b4c82\">pickMatrix</a> (vec&lt; 2, T, Q &gt; const &amp;center, vec&lt; 2, T, Q &gt; const &amp;delta, vec&lt; 4, U, Q &gt; const &amp;viewport)</td></tr>\n<tr class=\"memdesc:gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Define a picking region.  <a href=\"a00157.html#gaf6b21eadb7ac2ecbbe258a9a233b4c82\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf36e96033f456659e6705472a06b6e11\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf36e96033f456659e6705472a06b6e11\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaf36e96033f456659e6705472a06b6e11\">project</a> (vec&lt; 3, T, Q &gt; const &amp;obj, mat&lt; 4, 4, T, Q &gt; const &amp;model, mat&lt; 4, 4, T, Q &gt; const &amp;proj, vec&lt; 4, U, Q &gt; const &amp;viewport)</td></tr>\n<tr class=\"memdesc:gaf36e96033f456659e6705472a06b6e11\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates.  <a href=\"a00157.html#gaf36e96033f456659e6705472a06b6e11\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf36e96033f456659e6705472a06b6e11\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaee9e865eaa9776370996da2940873fd4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaee9e865eaa9776370996da2940873fd4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaee9e865eaa9776370996da2940873fd4\">rotate</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:gaee9e865eaa9776370996da2940873fd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a rotation 4 * 4 matrix created from an axis vector and an angle.  <a href=\"a00157.html#gaee9e865eaa9776370996da2940873fd4\">More...</a><br /></td></tr>\n<tr class=\"separator:gaee9e865eaa9776370996da2940873fd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga05051adbee603fb3c5095d8cf5cc229b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga05051adbee603fb3c5095d8cf5cc229b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">scale</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga05051adbee603fb3c5095d8cf5cc229b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a scale 4 * 4 matrix created from 3 scalars.  <a href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga05051adbee603fb3c5095d8cf5cc229b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1a4ecc4ad82652b8fb14dcb087879284\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1a4ecc4ad82652b8fb14dcb087879284\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284\">translate</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1a4ecc4ad82652b8fb14dcb087879284\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a translation 4 * 4 matrix created from a vector of 3 components.  <a href=\"a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a4ecc4ad82652b8fb14dcb087879284\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaaeacc04a2a6f4b18c5899d37e7bb3ef9\">tweakedInfinitePerspective</a> (T fovy, T aspect, T near)</td></tr>\n<tr class=\"memdesc:gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping.  <a href=\"a00157.html#gaaeacc04a2a6f4b18c5899d37e7bb3ef9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5b3c85ff6737030a1d2214474ffa7a8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaf5b3c85ff6737030a1d2214474ffa7a8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8\">tweakedInfinitePerspective</a> (T fovy, T aspect, T near, T ep)</td></tr>\n<tr class=\"memdesc:gaf5b3c85ff6737030a1d2214474ffa7a8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping.  <a href=\"a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf5b3c85ff6737030a1d2214474ffa7a8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga36641e5d60f994e01c3d8f56b10263d2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga36641e5d60f994e01c3d8f56b10263d2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga36641e5d60f994e01c3d8f56b10263d2\">unProject</a> (vec&lt; 3, T, Q &gt; const &amp;win, mat&lt; 4, 4, T, Q &gt; const &amp;model, mat&lt; 4, 4, T, Q &gt; const &amp;proj, vec&lt; 4, U, Q &gt; const &amp;viewport)</td></tr>\n<tr class=\"memdesc:ga36641e5d60f994e01c3d8f56b10263d2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Map the specified window coordinates (win.x, win.y, win.z) into object coordinates.  <a href=\"a00157.html#ga36641e5d60f994e01c3d8f56b10263d2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga36641e5d60f994e01c3d8f56b10263d2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00157.html\">GLM_GTC_matrix_transform</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00221.html\" title=\"Include <glm/gtx/transform.hpp> to use the features of this extension. \">GLM_GTX_transform</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00222.html\" title=\"Include <glm/gtx/transform2.hpp> to use the features of this extension. \">GLM_GTX_transform2</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00066_source.html\">matrix_transform.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00066_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_transform.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_transform.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00066.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/constants.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_matrix_transform extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284\">translate</a>(</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00157.html#gaee9e865eaa9776370996da2940873fd4\">rotate</a>(</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>,</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a>);</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">scale</a>(</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#gae5b6b40ed882cd56cd7cb97701909c06\">ortho</a>(</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                T left,</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                T right,</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                T bottom,</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                T top,</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                T zNear,</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                T zFar);</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#gad122a79aadaa5529cec4ac197203db7f\">orthoLH</a>(</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;                T left,</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                T right,</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                T bottom,</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;                T top,</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                T zNear,</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                T zFar);</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga16264c9b838edeb9dd1de7a1010a13a4\">orthoRH</a>(</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                T left,</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;                T right,</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                T bottom,</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;                T top,</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                T zNear,</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                T zFar);</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#gae5b6b40ed882cd56cd7cb97701909c06\">ortho</a>(</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                T left,</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;                T right,</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;                T bottom,</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;                T top);</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga0bcd4542e0affc63a0b8c08fcb839ea9\">frustum</a>(</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                T left,</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;                T right,</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                T bottom,</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;                T top,</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#gae4277c37f61d81da01bc9db14ea90296\">frustumLH</a>(</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;                T left,</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;                T right,</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;                T bottom,</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                T top,</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga4366ab45880c6c5f8b3e8c371ca4b136\">frustumRH</a>(</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;                T left,</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;                T right,</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;                T bottom,</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;                T top,</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787\">perspective</a>(</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;                T fovy,</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                T aspect,</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga26b88757fbd90601b80768a7e1ad3aa1\">perspectiveRH</a>(</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;                T fovy,</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;                T aspect,</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga9bd34951dc7022ac256fcb51d7f6fc2f\">perspectiveLH</a>(</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;                T fovy,</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;                T aspect,</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#gaebd02240fd36e85ad754f02ddd9a560d\">perspectiveFov</a>(</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;                T fov,</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;                T width,</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;                T height,</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#gaf32bf563f28379c68554a44ee60c6a85\">perspectiveFovRH</a>(</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;                T fov,</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;                T width,</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;                T height,</div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;</div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga6aebe16c164bd8e52554cbe0304ef4aa\">perspectiveFovLH</a>(</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;                T fov,</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;                T width,</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;                T height,</div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;                T near,</div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;                T far);</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga44fa38a18349450325cae2661bb115ca\">infinitePerspective</a>(</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;                T fovy, T aspect, T near);</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga3201b30f5b3ea0f933246d87bfb992a9\">infinitePerspectiveLH</a>(</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;                T fovy, T aspect, T near);</div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#ga99672ffe5714ef478dab2437255fe7e1\">infinitePerspectiveRH</a>(</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;                T fovy, T aspect, T near);</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8\">tweakedInfinitePerspective</a>(</div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;                T fovy, T aspect, T near);</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8\">tweakedInfinitePerspective</a>(</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;                T fovy, T aspect, T near, T ep);</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00157.html#gaf36e96033f456659e6705472a06b6e11\">project</a>(</div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; obj,</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; model,</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">proj</a>,</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;                vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; viewport);</div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> U, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00157.html#ga36641e5d60f994e01c3d8f56b10263d2\">unProject</a>(</div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; win,</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; model,</div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">proj</a>,</div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;                vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; viewport);</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;</div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q, <span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00157.html#gaf6b21eadb7ac2ecbbe258a9a233b4c82\">pickMatrix</a>(</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; center,</div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; delta,</div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;                vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; viewport);</div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;</div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00157.html#gaa64aa951a0e99136bba9008d2b59c78e\">lookAt</a>(</div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; eye,</div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; center,</div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; up);</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;</div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00157.html#gacfa12c8889c754846bc20c65d9b5c701\">lookAtRH</a>(</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; eye,</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; center,</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; up);</div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;</div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00157.html#gab2c09e25b0a16d3a9d89cc85bbae41b0\">lookAtLH</a>(</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; eye,</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; center,</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; up);</div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;</div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_transform.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00157_html_ga36641e5d60f994e01c3d8f56b10263d2\"><div class=\"ttname\"><a href=\"a00157.html#ga36641e5d60f994e01c3d8f56b10263d2\">glm::unProject</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; unProject(vec&lt; 3, T, Q &gt; const &amp;win, mat&lt; 4, 4, T, Q &gt; const &amp;model, mat&lt; 4, 4, T, Q &gt; const &amp;proj, vec&lt; 4, U, Q &gt; const &amp;viewport)</div><div class=\"ttdoc\">Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga6aebe16c164bd8e52554cbe0304ef4aa\"><div class=\"ttname\"><a href=\"a00157.html#ga6aebe16c164bd8e52554cbe0304ef4aa\">glm::perspectiveFovLH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; perspectiveFovLH(T fov, T width, T height, T near, T far)</div><div class=\"ttdoc\">Builds a left handed perspective projection matrix based on a field of view. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga44fa38a18349450325cae2661bb115ca\"><div class=\"ttname\"><a href=\"a00157.html#ga44fa38a18349450325cae2661bb115ca\">glm::infinitePerspective</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; infinitePerspective(T fovy, T aspect, T near)</div><div class=\"ttdoc\">Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default han...</div></div>\n<div class=\"ttc\" id=\"a00157_html_gaee9e865eaa9776370996da2940873fd4\"><div class=\"ttname\"><a href=\"a00157.html#gaee9e865eaa9776370996da2940873fd4\">glm::rotate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; rotate(mat&lt; 4, 4, T, Q &gt; const &amp;m, T angle, vec&lt; 3, T, Q &gt; const &amp;axis)</div><div class=\"ttdoc\">Builds a rotation 4 * 4 matrix created from an axis vector and an angle. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga3201b30f5b3ea0f933246d87bfb992a9\"><div class=\"ttname\"><a href=\"a00157.html#ga3201b30f5b3ea0f933246d87bfb992a9\">glm::infinitePerspectiveLH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; infinitePerspectiveLH(T fovy, T aspect, T near)</div><div class=\"ttdoc\">Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite...</div></div>\n<div class=\"ttc\" id=\"a00157_html_gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><div class=\"ttname\"><a href=\"a00157.html#gaf6b21eadb7ac2ecbbe258a9a233b4c82\">glm::pickMatrix</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; pickMatrix(vec&lt; 2, T, Q &gt; const &amp;center, vec&lt; 2, T, Q &gt; const &amp;delta, vec&lt; 4, U, Q &gt; const &amp;viewport)</div><div class=\"ttdoc\">Define a picking region. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gaf32bf563f28379c68554a44ee60c6a85\"><div class=\"ttname\"><a href=\"a00157.html#gaf32bf563f28379c68554a44ee60c6a85\">glm::perspectiveFovRH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; perspectiveFovRH(T fov, T width, T height, T near, T far)</div><div class=\"ttdoc\">Builds a right handed perspective projection matrix based on a field of view. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga0bcd4542e0affc63a0b8c08fcb839ea9\"><div class=\"ttname\"><a href=\"a00157.html#ga0bcd4542e0affc63a0b8c08fcb839ea9\">glm::frustum</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; frustum(T left, T right, T bottom, T top, T near, T far)</div><div class=\"ttdoc\">Creates a frustum matrix with default handedness. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00157_html_ga4366ab45880c6c5f8b3e8c371ca4b136\"><div class=\"ttname\"><a href=\"a00157.html#ga4366ab45880c6c5f8b3e8c371ca4b136\">glm::frustumRH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; frustumRH(T left, T right, T bottom, T top, T near, T far)</div><div class=\"ttdoc\">Creates a right handed frustum matrix. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga05051adbee603fb3c5095d8cf5cc229b\"><div class=\"ttname\"><a href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">glm::scale</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; scale(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Builds a scale 4 * 4 matrix created from 3 scalars. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga99672ffe5714ef478dab2437255fe7e1\"><div class=\"ttname\"><a href=\"a00157.html#ga99672ffe5714ef478dab2437255fe7e1\">glm::infinitePerspectiveRH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; infinitePerspectiveRH(T fovy, T aspect, T near)</div><div class=\"ttdoc\">Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite...</div></div>\n<div class=\"ttc\" id=\"a00157_html_gacfa12c8889c754846bc20c65d9b5c701\"><div class=\"ttname\"><a href=\"a00157.html#gacfa12c8889c754846bc20c65d9b5c701\">glm::lookAtRH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; lookAtRH(vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</div><div class=\"ttdoc\">Build a right handed look at view matrix. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga16264c9b838edeb9dd1de7a1010a13a4\"><div class=\"ttname\"><a href=\"a00157.html#ga16264c9b838edeb9dd1de7a1010a13a4\">glm::orthoRH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; orthoRH(T left, T right, T bottom, T top, T zNear, T zFar)</div><div class=\"ttdoc\">Creates a matrix for an orthographic parallel viewing volume, using right-handedness. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaf2707d3081789ce097daaa6e54d5287\"><div class=\"ttname\"><a href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">glm::axis</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; axis(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the q rotation axis. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga26b88757fbd90601b80768a7e1ad3aa1\"><div class=\"ttname\"><a href=\"a00157.html#ga26b88757fbd90601b80768a7e1ad3aa1\">glm::perspectiveRH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; perspectiveRH(T fovy, T aspect, T near, T far)</div><div class=\"ttdoc\">Creates a matrix for a right handed, symetric perspective-view frustum. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gaebd02240fd36e85ad754f02ddd9a560d\"><div class=\"ttname\"><a href=\"a00157.html#gaebd02240fd36e85ad754f02ddd9a560d\">glm::perspectiveFov</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; perspectiveFov(T fov, T width, T height, T near, T far)</div><div class=\"ttdoc\">Builds a perspective projection matrix based on a field of view and the default handedness. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gab2c09e25b0a16d3a9d89cc85bbae41b0\"><div class=\"ttname\"><a href=\"a00157.html#gab2c09e25b0a16d3a9d89cc85bbae41b0\">glm::lookAtLH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; lookAtLH(vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</div><div class=\"ttdoc\">Build a left handed look at view matrix. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga9bd34951dc7022ac256fcb51d7f6fc2f\"><div class=\"ttname\"><a href=\"a00157.html#ga9bd34951dc7022ac256fcb51d7f6fc2f\">glm::perspectiveLH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; perspectiveLH(T fovy, T aspect, T near, T far)</div><div class=\"ttdoc\">Creates a matrix for a left handed, symetric perspective-view frustum. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gae4277c37f61d81da01bc9db14ea90296\"><div class=\"ttname\"><a href=\"a00157.html#gae4277c37f61d81da01bc9db14ea90296\">glm::frustumLH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; frustumLH(T left, T right, T bottom, T top, T near, T far)</div><div class=\"ttdoc\">Creates a left handed frustum matrix. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gaa64aa951a0e99136bba9008d2b59c78e\"><div class=\"ttname\"><a href=\"a00157.html#gaa64aa951a0e99136bba9008d2b59c78e\">glm::lookAt</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; lookAt(vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</div><div class=\"ttdoc\">Build a look at view matrix based on the default handedness. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gad122a79aadaa5529cec4ac197203db7f\"><div class=\"ttname\"><a href=\"a00157.html#gad122a79aadaa5529cec4ac197203db7f\">glm::orthoLH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; orthoLH(T left, T right, T bottom, T top, T zNear, T zFar)</div><div class=\"ttdoc\">Creates a matrix for an orthographic parallel viewing volume, using left-handedness. </div></div>\n<div class=\"ttc\" id=\"a00211_html_ga58384b7170801dd513de46f87c7fb00e\"><div class=\"ttname\"><a href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">glm::proj</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType proj(genType const &amp;x, genType const &amp;Normal)</div><div class=\"ttdoc\">Projects x on Normal. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gae5b6b40ed882cd56cd7cb97701909c06\"><div class=\"ttname\"><a href=\"a00157.html#gae5b6b40ed882cd56cd7cb97701909c06\">glm::ortho</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; ortho(T left, T right, T bottom, T top)</div><div class=\"ttdoc\">Creates a matrix for projecting two-dimensional coordinates onto the screen. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gaf36e96033f456659e6705472a06b6e11\"><div class=\"ttname\"><a href=\"a00157.html#gaf36e96033f456659e6705472a06b6e11\">glm::project</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; project(vec&lt; 3, T, Q &gt; const &amp;obj, mat&lt; 4, 4, T, Q &gt; const &amp;model, mat&lt; 4, 4, T, Q &gt; const &amp;proj, vec&lt; 4, U, Q &gt; const &amp;viewport)</div><div class=\"ttdoc\">Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga747c8cf99458663dd7ad1bb3a2f07787\"><div class=\"ttname\"><a href=\"a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787\">glm::perspective</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; perspective(T fovy, T aspect, T near, T far)</div><div class=\"ttdoc\">Creates a matrix for a symetric perspective-view frustum based on the default handedness. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga1a4ecc4ad82652b8fb14dcb087879284\"><div class=\"ttname\"><a href=\"a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284\">glm::translate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; translate(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Builds a translation 4 * 4 matrix created from a vector of 3 components. </div></div>\n<div class=\"ttc\" id=\"a00157_html_gaf5b3c85ff6737030a1d2214474ffa7a8\"><div class=\"ttname\"><a href=\"a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8\">glm::tweakedInfinitePerspective</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; tweakedInfinitePerspective(T fovy, T aspect, T near, T ep)</div><div class=\"ttdoc\">Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics har...</div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00067.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_transform_2d.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_transform_2d.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00201.html\">GLM_GTX_matrix_transform_2d</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00067_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gad5c84a4932a758f385a87098ce1b1660\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad5c84a4932a758f385a87098ce1b1660\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#gad5c84a4932a758f385a87098ce1b1660\">rotate</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T angle)</td></tr>\n<tr class=\"memdesc:gad5c84a4932a758f385a87098ce1b1660\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a rotation 3 * 3 matrix created from an angle.  <a href=\"a00201.html#gad5c84a4932a758f385a87098ce1b1660\">More...</a><br /></td></tr>\n<tr class=\"separator:gad5c84a4932a758f385a87098ce1b1660\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadb47d2ad2bd984b213e8ff7d9cd8154e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadb47d2ad2bd984b213e8ff7d9cd8154e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#gadb47d2ad2bd984b213e8ff7d9cd8154e\">scale</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gadb47d2ad2bd984b213e8ff7d9cd8154e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a scale 3 * 3 matrix created from a vector of 2 components.  <a href=\"a00201.html#gadb47d2ad2bd984b213e8ff7d9cd8154e\">More...</a><br /></td></tr>\n<tr class=\"separator:gadb47d2ad2bd984b213e8ff7d9cd8154e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a118ece5db1e2022112b954846012af\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2a118ece5db1e2022112b954846012af\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#ga2a118ece5db1e2022112b954846012af\">shearX</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T y)</td></tr>\n<tr class=\"memdesc:ga2a118ece5db1e2022112b954846012af\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix.  <a href=\"a00201.html#ga2a118ece5db1e2022112b954846012af\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2a118ece5db1e2022112b954846012af\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga717f1833369c1ac4a40e4ac015af885e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga717f1833369c1ac4a40e4ac015af885e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#ga717f1833369c1ac4a40e4ac015af885e\">shearY</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T x)</td></tr>\n<tr class=\"memdesc:ga717f1833369c1ac4a40e4ac015af885e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a vertical (parallel to the y axis) shear 3 * 3 matrix.  <a href=\"a00201.html#ga717f1833369c1ac4a40e4ac015af885e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga717f1833369c1ac4a40e4ac015af885e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4573ae47c80938aa9053ef6a33755ab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf4573ae47c80938aa9053ef6a33755ab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#gaf4573ae47c80938aa9053ef6a33755ab\">translate</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf4573ae47c80938aa9053ef6a33755ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a translation 3 * 3 matrix created from a vector of 2 components.  <a href=\"a00201.html#gaf4573ae47c80938aa9053ef6a33755ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4573ae47c80938aa9053ef6a33755ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00201.html\">GLM_GTX_matrix_transform_2d</a> </p>\n<dl class=\"section author\"><dt>Author</dt><dd>Miguel Ángel Pérez Martínez</dd></dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00067_source.html\">matrix_transform_2d.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00067_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: matrix_transform_2d.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">matrix_transform_2d.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00067.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_matrix_transform_2d is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_matrix_transform_2d extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00201.html#gaf4573ae47c80938aa9053ef6a33755ab\">translate</a>(</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00201.html#gad5c84a4932a758f385a87098ce1b1660\">rotate</a>(</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00201.html#gadb47d2ad2bd984b213e8ff7d9cd8154e\">scale</a>(</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00201.html#ga2a118ece5db1e2022112b954846012af\">shearX</a>(</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                T y);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00201.html#ga717f1833369c1ac4a40e4ac015af885e\">shearY</a>(</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                T x);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"preprocessor\">#include &quot;matrix_transform_2d.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00201_html_gaf4573ae47c80938aa9053ef6a33755ab\"><div class=\"ttname\"><a href=\"a00201.html#gaf4573ae47c80938aa9053ef6a33755ab\">glm::translate</a></div><div class=\"ttdeci\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt; translate(mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Builds a translation 3 * 3 matrix created from a vector of 2 components. </div></div>\n<div class=\"ttc\" id=\"a00201_html_ga2a118ece5db1e2022112b954846012af\"><div class=\"ttname\"><a href=\"a00201.html#ga2a118ece5db1e2022112b954846012af\">glm::shearX</a></div><div class=\"ttdeci\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt; shearX(mat&lt; 3, 3, T, Q &gt; const &amp;m, T y)</div><div class=\"ttdoc\">Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix. </div></div>\n<div class=\"ttc\" id=\"a00201_html_gad5c84a4932a758f385a87098ce1b1660\"><div class=\"ttname\"><a href=\"a00201.html#gad5c84a4932a758f385a87098ce1b1660\">glm::rotate</a></div><div class=\"ttdeci\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt; rotate(mat&lt; 3, 3, T, Q &gt; const &amp;m, T angle)</div><div class=\"ttdoc\">Builds a rotation 3 * 3 matrix created from an angle. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00201_html_gadb47d2ad2bd984b213e8ff7d9cd8154e\"><div class=\"ttname\"><a href=\"a00201.html#gadb47d2ad2bd984b213e8ff7d9cd8154e\">glm::scale</a></div><div class=\"ttdeci\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt; scale(mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Builds a scale 3 * 3 matrix created from a vector of 2 components. </div></div>\n<div class=\"ttc\" id=\"a00201_html_ga717f1833369c1ac4a40e4ac015af885e\"><div class=\"ttname\"><a href=\"a00201.html#ga717f1833369c1ac4a40e4ac015af885e\">glm::shearY</a></div><div class=\"ttdeci\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt; shearY(mat&lt; 3, 3, T, Q &gt; const &amp;m, T x)</div><div class=\"ttdoc\">Builds a vertical (parallel to the y axis) shear 3 * 3 matrix. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00068.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mixed_product.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">mixed_product.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00202.html\">GLM_GTX_mixed_producte</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00068_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gab3c6048fbb67f7243b088a4fee48d020\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gab3c6048fbb67f7243b088a4fee48d020\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab3c6048fbb67f7243b088a4fee48d020\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00202.html#gab3c6048fbb67f7243b088a4fee48d020\">mixedProduct</a> (vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)</td></tr>\n<tr class=\"memdesc:gab3c6048fbb67f7243b088a4fee48d020\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Mixed product of 3 vectors (from GLM_GTX_mixed_product extension) <br /></td></tr>\n<tr class=\"separator:gab3c6048fbb67f7243b088a4fee48d020\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00202.html\">GLM_GTX_mixed_producte</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00068_source.html\">mixed_product.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00068_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: mixed_product.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">mixed_product.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00068.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_mixed_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_mixed_product extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00202.html#gab3c6048fbb67f7243b088a4fee48d020\">mixedProduct</a>(</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2, </div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v3);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#include &quot;mixed_product.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00202_html_gab3c6048fbb67f7243b088a4fee48d020\"><div class=\"ttname\"><a href=\"a00202.html#gab3c6048fbb67f7243b088a4fee48d020\">glm::mixedProduct</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T mixedProduct(vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)</div><div class=\"ttdoc\">Mixed product of 3 vectors (from GLM_GTX_mixed_product extension) </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00069.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: noise.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">noise.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00158.html\">GLM_GTC_noise</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00069_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga1e043ce3b51510e9bc4469227cefc38a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1e043ce3b51510e9bc4469227cefc38a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00158.html#ga1e043ce3b51510e9bc4469227cefc38a\">perlin</a> (vec&lt; L, T, Q &gt; const &amp;p)</td></tr>\n<tr class=\"memdesc:ga1e043ce3b51510e9bc4469227cefc38a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Classic perlin noise.  <a href=\"a00158.html#ga1e043ce3b51510e9bc4469227cefc38a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e043ce3b51510e9bc4469227cefc38a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac270edc54c5fc52f5985a45f940bb103\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac270edc54c5fc52f5985a45f940bb103\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00158.html#gac270edc54c5fc52f5985a45f940bb103\">perlin</a> (vec&lt; L, T, Q &gt; const &amp;p, vec&lt; L, T, Q &gt; const &amp;rep)</td></tr>\n<tr class=\"memdesc:gac270edc54c5fc52f5985a45f940bb103\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Periodic perlin noise.  <a href=\"a00158.html#gac270edc54c5fc52f5985a45f940bb103\">More...</a><br /></td></tr>\n<tr class=\"separator:gac270edc54c5fc52f5985a45f940bb103\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8122468c69015ff397349a7dcc638b27\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8122468c69015ff397349a7dcc638b27\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00158.html#ga8122468c69015ff397349a7dcc638b27\">simplex</a> (vec&lt; L, T, Q &gt; const &amp;p)</td></tr>\n<tr class=\"memdesc:ga8122468c69015ff397349a7dcc638b27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simplex noise.  <a href=\"a00158.html#ga8122468c69015ff397349a7dcc638b27\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8122468c69015ff397349a7dcc638b27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00158.html\">GLM_GTC_noise</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00069_source.html\">noise.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00069_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: noise.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">noise.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00069.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/_noise.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;../geometric.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;../common.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#include &quot;../vector_relational.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_noise extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00158.html#gac270edc54c5fc52f5985a45f940bb103\">perlin</a>(</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; p);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00158.html#gac270edc54c5fc52f5985a45f940bb103\">perlin</a>(</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; p,</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; rep);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00158.html#ga8122468c69015ff397349a7dcc638b27\">simplex</a>(</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; p);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"preprocessor\">#include &quot;noise.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00158_html_gac270edc54c5fc52f5985a45f940bb103\"><div class=\"ttname\"><a href=\"a00158.html#gac270edc54c5fc52f5985a45f940bb103\">glm::perlin</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T perlin(vec&lt; L, T, Q &gt; const &amp;p, vec&lt; L, T, Q &gt; const &amp;rep)</div><div class=\"ttdoc\">Periodic perlin noise. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00158_html_ga8122468c69015ff397349a7dcc638b27\"><div class=\"ttname\"><a href=\"a00158.html#ga8122468c69015ff397349a7dcc638b27\">glm::simplex</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T simplex(vec&lt; L, T, Q &gt; const &amp;p)</div><div class=\"ttdoc\">Simplex noise. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00070.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: norm.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">norm.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00203.html\">GLM_GTX_norm</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00070_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga85660f1b79f66c09c7b5a6f80e68c89f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga85660f1b79f66c09c7b5a6f80e68c89f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#ga85660f1b79f66c09c7b5a6f80e68c89f\">distance2</a> (vec&lt; L, T, Q &gt; const &amp;p0, vec&lt; L, T, Q &gt; const &amp;p1)</td></tr>\n<tr class=\"memdesc:ga85660f1b79f66c09c7b5a6f80e68c89f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the squared distance between p0 and p1, i.e., length2(p0 - p1).  <a href=\"a00203.html#ga85660f1b79f66c09c7b5a6f80e68c89f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85660f1b79f66c09c7b5a6f80e68c89f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae2fc0b2aa967bebfd6a244700bff6997\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae2fc0b2aa967bebfd6a244700bff6997\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#gae2fc0b2aa967bebfd6a244700bff6997\">l1Norm</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gae2fc0b2aa967bebfd6a244700bff6997\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L1 norm between x and y.  <a href=\"a00203.html#gae2fc0b2aa967bebfd6a244700bff6997\">More...</a><br /></td></tr>\n<tr class=\"separator:gae2fc0b2aa967bebfd6a244700bff6997\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1a7491e2037ceeb37f83ce41addfc0be\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1a7491e2037ceeb37f83ce41addfc0be\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be\">l1Norm</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1a7491e2037ceeb37f83ce41addfc0be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L1 norm of v.  <a href=\"a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a7491e2037ceeb37f83ce41addfc0be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41340b2ef40a9307ab0f137181565168\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga41340b2ef40a9307ab0f137181565168\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#ga41340b2ef40a9307ab0f137181565168\">l2Norm</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga41340b2ef40a9307ab0f137181565168\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L2 norm between x and y.  <a href=\"a00203.html#ga41340b2ef40a9307ab0f137181565168\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41340b2ef40a9307ab0f137181565168\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae288bde8f0e41fb4ed62e65137b18cba\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae288bde8f0e41fb4ed62e65137b18cba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#gae288bde8f0e41fb4ed62e65137b18cba\">l2Norm</a> (vec&lt; 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae288bde8f0e41fb4ed62e65137b18cba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L2 norm of v.  <a href=\"a00203.html#gae288bde8f0e41fb4ed62e65137b18cba\">More...</a><br /></td></tr>\n<tr class=\"separator:gae288bde8f0e41fb4ed62e65137b18cba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8d1789651050adb7024917984b41c3de\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8d1789651050adb7024917984b41c3de\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#ga8d1789651050adb7024917984b41c3de\">length2</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8d1789651050adb7024917984b41c3de\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the squared length of x.  <a href=\"a00203.html#ga8d1789651050adb7024917984b41c3de\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8d1789651050adb7024917984b41c3de\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacad23d30497eb16f67709f2375d1f66a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacad23d30497eb16f67709f2375d1f66a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#gacad23d30497eb16f67709f2375d1f66a\">lxNorm</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, unsigned int Depth)</td></tr>\n<tr class=\"memdesc:gacad23d30497eb16f67709f2375d1f66a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L norm between x and y.  <a href=\"a00203.html#gacad23d30497eb16f67709f2375d1f66a\">More...</a><br /></td></tr>\n<tr class=\"separator:gacad23d30497eb16f67709f2375d1f66a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac61b6d81d796d6eb4d4183396a19ab91\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac61b6d81d796d6eb4d4183396a19ab91\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#gac61b6d81d796d6eb4d4183396a19ab91\">lxNorm</a> (vec&lt; 3, T, Q &gt; const &amp;x, unsigned int Depth)</td></tr>\n<tr class=\"memdesc:gac61b6d81d796d6eb4d4183396a19ab91\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L norm of v.  <a href=\"a00203.html#gac61b6d81d796d6eb4d4183396a19ab91\">More...</a><br /></td></tr>\n<tr class=\"separator:gac61b6d81d796d6eb4d4183396a19ab91\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00203.html\">GLM_GTX_norm</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00070_source.html\">norm.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00070_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: norm.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">norm.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00070.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../geometric.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_norm is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_norm extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00203.html#ga8d1789651050adb7024917984b41c3de\">length2</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00203.html#ga85660f1b79f66c09c7b5a6f80e68c89f\">distance2</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; p0, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; p1);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be\">l1Norm</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be\">l1Norm</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00203.html#gae288bde8f0e41fb4ed62e65137b18cba\">l2Norm</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00203.html#gae288bde8f0e41fb4ed62e65137b18cba\">l2Norm</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00203.html#gac61b6d81d796d6eb4d4183396a19ab91\">lxNorm</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span> Depth);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00203.html#gac61b6d81d796d6eb4d4183396a19ab91\">lxNorm</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span> Depth);</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\">#include &quot;norm.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00203_html_gae288bde8f0e41fb4ed62e65137b18cba\"><div class=\"ttname\"><a href=\"a00203.html#gae288bde8f0e41fb4ed62e65137b18cba\">glm::l2Norm</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T l2Norm(vec&lt; 3, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the L2 norm of v. </div></div>\n<div class=\"ttc\" id=\"a00203_html_gac61b6d81d796d6eb4d4183396a19ab91\"><div class=\"ttname\"><a href=\"a00203.html#gac61b6d81d796d6eb4d4183396a19ab91\">glm::lxNorm</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T lxNorm(vec&lt; 3, T, Q &gt; const &amp;x, unsigned int Depth)</div><div class=\"ttdoc\">Returns the L norm of v. </div></div>\n<div class=\"ttc\" id=\"a00203_html_ga8d1789651050adb7024917984b41c3de\"><div class=\"ttname\"><a href=\"a00203.html#ga8d1789651050adb7024917984b41c3de\">glm::length2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length2(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the squared length of x. </div></div>\n<div class=\"ttc\" id=\"a00203_html_ga1a7491e2037ceeb37f83ce41addfc0be\"><div class=\"ttname\"><a href=\"a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be\">glm::l1Norm</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T l1Norm(vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the L1 norm of v. </div></div>\n<div class=\"ttc\" id=\"a00203_html_ga85660f1b79f66c09c7b5a6f80e68c89f\"><div class=\"ttname\"><a href=\"a00203.html#ga85660f1b79f66c09c7b5a6f80e68c89f\">glm::distance2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T distance2(vec&lt; L, T, Q &gt; const &amp;p0, vec&lt; L, T, Q &gt; const &amp;p1)</div><div class=\"ttdoc\">Returns the squared distance between p0 and p1, i.e., length2(p0 - p1). </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00071.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: normal.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">normal.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00204.html\">GLM_GTX_normal</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00071_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaff1cb5496925dfa7962df457772a7f35\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaff1cb5496925dfa7962df457772a7f35\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00204.html#gaff1cb5496925dfa7962df457772a7f35\">triangleNormal</a> (vec&lt; 3, T, Q &gt; const &amp;p1, vec&lt; 3, T, Q &gt; const &amp;p2, vec&lt; 3, T, Q &gt; const &amp;p3)</td></tr>\n<tr class=\"memdesc:gaff1cb5496925dfa7962df457772a7f35\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Computes triangle normal from triangle points.  <a href=\"a00204.html#gaff1cb5496925dfa7962df457772a7f35\">More...</a><br /></td></tr>\n<tr class=\"separator:gaff1cb5496925dfa7962df457772a7f35\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00204.html\">GLM_GTX_normal</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_extented_min_max (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00071_source.html\">normal.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00071_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: normal.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">normal.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00071.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_normal is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_normal extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00204.html#gaff1cb5496925dfa7962df457772a7f35\">triangleNormal</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; p1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; p2, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; p3);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#include &quot;normal.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00204_html_gaff1cb5496925dfa7962df457772a7f35\"><div class=\"ttname\"><a href=\"a00204.html#gaff1cb5496925dfa7962df457772a7f35\">glm::triangleNormal</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; triangleNormal(vec&lt; 3, T, Q &gt; const &amp;p1, vec&lt; 3, T, Q &gt; const &amp;p2, vec&lt; 3, T, Q &gt; const &amp;p3)</div><div class=\"ttdoc\">Computes triangle normal from triangle points. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00072.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: normalize_dot.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">normalize_dot.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00205.html\">GLM_GTX_normalize_dot</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00072_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga2746fb9b5bd22b06b2f7c8babba5de9e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2746fb9b5bd22b06b2f7c8babba5de9e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00205.html#ga2746fb9b5bd22b06b2f7c8babba5de9e\">fastNormalizeDot</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga2746fb9b5bd22b06b2f7c8babba5de9e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Normalize parameters and returns the dot product of x and y.  <a href=\"a00205.html#ga2746fb9b5bd22b06b2f7c8babba5de9e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2746fb9b5bd22b06b2f7c8babba5de9e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb140a2b903115d318c8b0a2fb5a5daa\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacb140a2b903115d318c8b0a2fb5a5daa\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00205.html#gacb140a2b903115d318c8b0a2fb5a5daa\">normalizeDot</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gacb140a2b903115d318c8b0a2fb5a5daa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Normalize parameters and returns the dot product of x and y.  <a href=\"a00205.html#gacb140a2b903115d318c8b0a2fb5a5daa\">More...</a><br /></td></tr>\n<tr class=\"separator:gacb140a2b903115d318c8b0a2fb5a5daa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00205.html\">GLM_GTX_normalize_dot</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00072_source.html\">normalize_dot.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00072_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: normalize_dot.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">normalize_dot.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00072.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/fast_square_root.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_normalize_dot is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_normalize_dot extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00205.html#gacb140a2b903115d318c8b0a2fb5a5daa\">normalizeDot</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00205.html#ga2746fb9b5bd22b06b2f7c8babba5de9e\">fastNormalizeDot</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#include &quot;normalize_dot.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00205_html_ga2746fb9b5bd22b06b2f7c8babba5de9e\"><div class=\"ttname\"><a href=\"a00205.html#ga2746fb9b5bd22b06b2f7c8babba5de9e\">glm::fastNormalizeDot</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T fastNormalizeDot(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Normalize parameters and returns the dot product of x and y. </div></div>\n<div class=\"ttc\" id=\"a00205_html_gacb140a2b903115d318c8b0a2fb5a5daa\"><div class=\"ttname\"><a href=\"a00205.html#gacb140a2b903115d318c8b0a2fb5a5daa\">glm::normalizeDot</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T normalizeDot(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Normalize parameters and returns the dot product of x and y. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00073.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: number_precision.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">number_precision.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00206.html\">GLM_GTX_number_precision</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00073_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga145ad477a2a3e152855511c3b52469a6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga145ad477a2a3e152855511c3b52469a6\"></a>\ntypedef f32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga145ad477a2a3e152855511c3b52469a6\">f32mat1</a></td></tr>\n<tr class=\"memdesc:ga145ad477a2a3e152855511c3b52469a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga145ad477a2a3e152855511c3b52469a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac88c6a4dbfc380aa26e3adbbade36348\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac88c6a4dbfc380aa26e3adbbade36348\"></a>\ntypedef f32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#gac88c6a4dbfc380aa26e3adbbade36348\">f32mat1x1</a></td></tr>\n<tr class=\"memdesc:gac88c6a4dbfc380aa26e3adbbade36348\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:gac88c6a4dbfc380aa26e3adbbade36348\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga07f8d7348eb7ae059a84c118fdfeb943\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga07f8d7348eb7ae059a84c118fdfeb943\"></a>\ntypedef f32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga07f8d7348eb7ae059a84c118fdfeb943\">f32vec1</a></td></tr>\n<tr class=\"memdesc:ga07f8d7348eb7ae059a84c118fdfeb943\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga07f8d7348eb7ae059a84c118fdfeb943\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga59bfa589419b5265d01314fcecd33435\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga59bfa589419b5265d01314fcecd33435\"></a>\ntypedef f64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga59bfa589419b5265d01314fcecd33435\">f64mat1</a></td></tr>\n<tr class=\"memdesc:ga59bfa589419b5265d01314fcecd33435\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga59bfa589419b5265d01314fcecd33435\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga448eeb08d0b7d8c43a8b292c981955fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga448eeb08d0b7d8c43a8b292c981955fd\"></a>\ntypedef f64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga448eeb08d0b7d8c43a8b292c981955fd\">f64mat1x1</a></td></tr>\n<tr class=\"memdesc:ga448eeb08d0b7d8c43a8b292c981955fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga448eeb08d0b7d8c43a8b292c981955fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae5987a61b8c03d5c432a9e62f0b3efe1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae5987a61b8c03d5c432a9e62f0b3efe1\"></a>\ntypedef f64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#gae5987a61b8c03d5c432a9e62f0b3efe1\">f64vec1</a></td></tr>\n<tr class=\"memdesc:gae5987a61b8c03d5c432a9e62f0b3efe1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:gae5987a61b8c03d5c432a9e62f0b3efe1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52cc069a92e126c3a8dcde93424d2ef0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga52cc069a92e126c3a8dcde93424d2ef0\"></a>\ntypedef u16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga52cc069a92e126c3a8dcde93424d2ef0\">u16vec1</a></td></tr>\n<tr class=\"memdesc:ga52cc069a92e126c3a8dcde93424d2ef0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16bit unsigned integer scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga52cc069a92e126c3a8dcde93424d2ef0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"></a>\ntypedef u32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga9bbc1e14aea65cba5e2dcfef6a67d9f3\">u32vec1</a></td></tr>\n<tr class=\"memdesc:ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32bit unsigned integer scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga818de170e2584ab037130f2881925974\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga818de170e2584ab037130f2881925974\"></a>\ntypedef u64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga818de170e2584ab037130f2881925974\">u64vec1</a></td></tr>\n<tr class=\"memdesc:ga818de170e2584ab037130f2881925974\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64bit unsigned integer scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga818de170e2584ab037130f2881925974\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5853fe457f4c8a6bc09343d0e9833980\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5853fe457f4c8a6bc09343d0e9833980\"></a>\ntypedef u8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga5853fe457f4c8a6bc09343d0e9833980\">u8vec1</a></td></tr>\n<tr class=\"memdesc:ga5853fe457f4c8a6bc09343d0e9833980\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8bit unsigned integer scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga5853fe457f4c8a6bc09343d0e9833980\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00206.html\">GLM_GTX_number_precision</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00073_source.html\">number_precision.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00073_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: number_precision.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">number_precision.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00073.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/type_precision.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_number_precision is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_number_precision extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"keyword\">namespace </span>gtx</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"comment\">// Unsigned int vector types </span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#ga5853fe457f4c8a6bc09343d0e9833980\">   38</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">u8</a>                      <a class=\"code\" href=\"a00206.html#ga5853fe457f4c8a6bc09343d0e9833980\">u8vec1</a>;         </div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#ga52cc069a92e126c3a8dcde93424d2ef0\">   39</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">u16</a>                     <a class=\"code\" href=\"a00206.html#ga52cc069a92e126c3a8dcde93424d2ef0\">u16vec1</a>;    </div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#ga9bbc1e14aea65cba5e2dcfef6a67d9f3\">   40</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">u32</a>                     <a class=\"code\" href=\"a00206.html#ga9bbc1e14aea65cba5e2dcfef6a67d9f3\">u32vec1</a>;    </div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#ga818de170e2584ab037130f2881925974\">   41</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">u64</a>                     <a class=\"code\" href=\"a00206.html#ga818de170e2584ab037130f2881925974\">u64vec1</a>;    </div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"comment\">// Float vector types </span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#ga07f8d7348eb7ae059a84c118fdfeb943\">   46</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a>                     <a class=\"code\" href=\"a00206.html#ga07f8d7348eb7ae059a84c118fdfeb943\">f32vec1</a>;    </div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#gae5987a61b8c03d5c432a9e62f0b3efe1\">   47</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a>                     <a class=\"code\" href=\"a00206.html#gae5987a61b8c03d5c432a9e62f0b3efe1\">f64vec1</a>;    </div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"comment\">// Float matrix types </span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#ga145ad477a2a3e152855511c3b52469a6\">   52</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a>                     <a class=\"code\" href=\"a00206.html#ga145ad477a2a3e152855511c3b52469a6\">f32mat1</a>;        </div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#gac88c6a4dbfc380aa26e3adbbade36348\">   53</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a>                     <a class=\"code\" href=\"a00206.html#gac88c6a4dbfc380aa26e3adbbade36348\">f32mat1x1</a>;      </div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#ga59bfa589419b5265d01314fcecd33435\">   54</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a>                     <a class=\"code\" href=\"a00206.html#ga59bfa589419b5265d01314fcecd33435\">f64mat1</a>;        </div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00206.html#ga448eeb08d0b7d8c43a8b292c981955fd\">   55</a></span>&#160;        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a>                     <a class=\"code\" href=\"a00206.html#ga448eeb08d0b7d8c43a8b292c981955fd\">f64mat1x1</a>;      </div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;}<span class=\"comment\">//namespace gtx</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"preprocessor\">#include &quot;number_precision.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00206_html_ga818de170e2584ab037130f2881925974\"><div class=\"ttname\"><a href=\"a00206.html#ga818de170e2584ab037130f2881925974\">glm::gtx::u64vec1</a></div><div class=\"ttdeci\">u64 u64vec1</div><div class=\"ttdoc\">64bit unsigned integer scalar. (from GLM_GTX_number_precision extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00041\">number_precision.hpp:41</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_ga145ad477a2a3e152855511c3b52469a6\"><div class=\"ttname\"><a href=\"a00206.html#ga145ad477a2a3e152855511c3b52469a6\">glm::gtx::f32mat1</a></div><div class=\"ttdeci\">f32 f32mat1</div><div class=\"ttdoc\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00052\">number_precision.hpp:52</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_ga07f8d7348eb7ae059a84c118fdfeb943\"><div class=\"ttname\"><a href=\"a00206.html#ga07f8d7348eb7ae059a84c118fdfeb943\">glm::gtx::f32vec1</a></div><div class=\"ttdeci\">f32 f32vec1</div><div class=\"ttdoc\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00046\">number_precision.hpp:46</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_ga448eeb08d0b7d8c43a8b292c981955fd\"><div class=\"ttname\"><a href=\"a00206.html#ga448eeb08d0b7d8c43a8b292c981955fd\">glm::gtx::f64mat1x1</a></div><div class=\"ttdeci\">f64 f64mat1x1</div><div class=\"ttdoc\">Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00055\">number_precision.hpp:55</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"><div class=\"ttname\"><a href=\"a00206.html#ga9bbc1e14aea65cba5e2dcfef6a67d9f3\">glm::gtx::u32vec1</a></div><div class=\"ttdeci\">u32 u32vec1</div><div class=\"ttdoc\">32bit unsigned integer scalar. (from GLM_GTX_number_precision extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00040\">number_precision.hpp:40</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_ga5853fe457f4c8a6bc09343d0e9833980\"><div class=\"ttname\"><a href=\"a00206.html#ga5853fe457f4c8a6bc09343d0e9833980\">glm::gtx::u8vec1</a></div><div class=\"ttdeci\">u8 u8vec1</div><div class=\"ttdoc\">8bit unsigned integer scalar. (from GLM_GTX_number_precision extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00038\">number_precision.hpp:38</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_ga52cc069a92e126c3a8dcde93424d2ef0\"><div class=\"ttname\"><a href=\"a00206.html#ga52cc069a92e126c3a8dcde93424d2ef0\">glm::gtx::u16vec1</a></div><div class=\"ttdeci\">u16 u16vec1</div><div class=\"ttdoc\">16bit unsigned integer scalar. (from GLM_GTX_number_precision extension) </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00039\">number_precision.hpp:39</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><div class=\"ttname\"><a href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">glm::f32</a></div><div class=\"ttdeci\">highp_float32_t f32</div><div class=\"ttdoc\">Default 32 bit single-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01507\">fwd.hpp:1507</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaecc7082561fc9028b844b6cf3d305d36\"><div class=\"ttname\"><a href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">glm::u8</a></div><div class=\"ttdeci\">detail::uint8 u8</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00896\">fwd.hpp:896</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8165913e068444f7842302d40ba897b9\"><div class=\"ttname\"><a href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">glm::u32</a></div><div class=\"ttdeci\">detail::uint32 u32</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00904\">fwd.hpp:904</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_ga59bfa589419b5265d01314fcecd33435\"><div class=\"ttname\"><a href=\"a00206.html#ga59bfa589419b5265d01314fcecd33435\">glm::gtx::f64mat1</a></div><div class=\"ttdeci\">f64 f64mat1</div><div class=\"ttdoc\">Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00054\">number_precision.hpp:54</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_gae5987a61b8c03d5c432a9e62f0b3efe1\"><div class=\"ttname\"><a href=\"a00206.html#gae5987a61b8c03d5c432a9e62f0b3efe1\">glm::gtx::f64vec1</a></div><div class=\"ttdeci\">f64 f64vec1</div><div class=\"ttdoc\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00047\">number_precision.hpp:47</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf3f312156984c365e9f65620354da70b\"><div class=\"ttname\"><a href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">glm::u64</a></div><div class=\"ttdeci\">detail::uint64 u64</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00908\">fwd.hpp:908</a></div></div>\n<div class=\"ttc\" id=\"a00206_html_gac88c6a4dbfc380aa26e3adbbade36348\"><div class=\"ttname\"><a href=\"a00206.html#gac88c6a4dbfc380aa26e3adbbade36348\">glm::gtx::f32mat1x1</a></div><div class=\"ttdeci\">f32 f32mat1x1</div><div class=\"ttdoc\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00073_source.html#l00053\">number_precision.hpp:53</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa2d7acc0adb536fab71fe261232a40ff\"><div class=\"ttname\"><a href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">glm::u16</a></div><div class=\"ttdeci\">detail::uint16 u16</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00900\">fwd.hpp:900</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1d794d240091678f602e8de225b8d8c9\"><div class=\"ttname\"><a href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">glm::f64</a></div><div class=\"ttdeci\">highp_float64_t f64</div><div class=\"ttdoc\">Default 64 bit double-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01511\">fwd.hpp:1511</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00074.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: optimum_pow.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">optimum_pow.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00207.html\">GLM_GTX_optimum_pow</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00074_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga19aaff3213bf23bdec3ef124ace237e9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga19aaff3213bf23bdec3ef124ace237e9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00207.html#ga19aaff3213bf23bdec3ef124ace237e9\">pow2</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga19aaff3213bf23bdec3ef124ace237e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the power of 2.  <a href=\"a00207.html#ga19aaff3213bf23bdec3ef124ace237e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga19aaff3213bf23bdec3ef124ace237e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga35689d03cd434d6ea819f1942d3bf82e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga35689d03cd434d6ea819f1942d3bf82e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00207.html#ga35689d03cd434d6ea819f1942d3bf82e\">pow3</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga35689d03cd434d6ea819f1942d3bf82e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the power of 3.  <a href=\"a00207.html#ga35689d03cd434d6ea819f1942d3bf82e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga35689d03cd434d6ea819f1942d3bf82e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacef0968763026e180e53e735007dbf5a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gacef0968763026e180e53e735007dbf5a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00207.html#gacef0968763026e180e53e735007dbf5a\">pow4</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:gacef0968763026e180e53e735007dbf5a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the power of 4.  <a href=\"a00207.html#gacef0968763026e180e53e735007dbf5a\">More...</a><br /></td></tr>\n<tr class=\"separator:gacef0968763026e180e53e735007dbf5a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00207.html\">GLM_GTX_optimum_pow</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00074_source.html\">optimum_pow.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00074_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: optimum_pow.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">optimum_pow.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00074.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_optimum_pow is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_optimum_pow extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span>gtx</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00207.html#ga19aaff3213bf23bdec3ef124ace237e9\">pow2</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00207.html#ga35689d03cd434d6ea819f1942d3bf82e\">pow3</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00207.html#gacef0968763026e180e53e735007dbf5a\">pow4</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;}<span class=\"comment\">//namespace gtx</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"preprocessor\">#include &quot;optimum_pow.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00207_html_gacef0968763026e180e53e735007dbf5a\"><div class=\"ttname\"><a href=\"a00207.html#gacef0968763026e180e53e735007dbf5a\">glm::gtx::pow4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType pow4(genType const &amp;x)</div><div class=\"ttdoc\">Returns x raised to the power of 4. </div></div>\n<div class=\"ttc\" id=\"a00207_html_ga19aaff3213bf23bdec3ef124ace237e9\"><div class=\"ttname\"><a href=\"a00207.html#ga19aaff3213bf23bdec3ef124ace237e9\">glm::gtx::pow2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType pow2(genType const &amp;x)</div><div class=\"ttdoc\">Returns x raised to the power of 2. </div></div>\n<div class=\"ttc\" id=\"a00207_html_ga35689d03cd434d6ea819f1942d3bf82e\"><div class=\"ttname\"><a href=\"a00207.html#ga35689d03cd434d6ea819f1942d3bf82e\">glm::gtx::pow3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType pow3(genType const &amp;x)</div><div class=\"ttdoc\">Returns x raised to the power of 3. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00075.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: orthonormalize.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">orthonormalize.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00208.html\">GLM_GTX_orthonormalize</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00075_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga4cab5d698e6e2eccea30c8e81c74371f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4cab5d698e6e2eccea30c8e81c74371f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00208.html#ga4cab5d698e6e2eccea30c8e81c74371f\">orthonormalize</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:ga4cab5d698e6e2eccea30c8e81c74371f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the orthonormalized matrix of m.  <a href=\"a00208.html#ga4cab5d698e6e2eccea30c8e81c74371f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4cab5d698e6e2eccea30c8e81c74371f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac3bc7ef498815026bc3d361ae0b7138e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac3bc7ef498815026bc3d361ae0b7138e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00208.html#gac3bc7ef498815026bc3d361ae0b7138e\">orthonormalize</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gac3bc7ef498815026bc3d361ae0b7138e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Orthonormalizes x according y.  <a href=\"a00208.html#gac3bc7ef498815026bc3d361ae0b7138e\">More...</a><br /></td></tr>\n<tr class=\"separator:gac3bc7ef498815026bc3d361ae0b7138e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00208.html\">GLM_GTX_orthonormalize</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_extented_min_max (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00075_source.html\">orthonormalize.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00075_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: orthonormalize.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">orthonormalize.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00075.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../geometric.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_orthonormalize is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_orthonormalize extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00208.html#gac3bc7ef498815026bc3d361ae0b7138e\">orthonormalize</a>(mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00208.html#gac3bc7ef498815026bc3d361ae0b7138e\">orthonormalize</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#include &quot;orthonormalize.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00208_html_gac3bc7ef498815026bc3d361ae0b7138e\"><div class=\"ttname\"><a href=\"a00208.html#gac3bc7ef498815026bc3d361ae0b7138e\">glm::orthonormalize</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; orthonormalize(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Orthonormalizes x according y. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00076.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: packing.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/packing.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00159.html\">GLM_GTC_packing</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00076_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga4944ad465ff950e926d49621f916c78d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga4944ad465ff950e926d49621f916c78d\">packF2x11_1x10</a> (vec3 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga4944ad465ff950e926d49621f916c78d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values.  <a href=\"a00159.html#ga4944ad465ff950e926d49621f916c78d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4944ad465ff950e926d49621f916c78d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3f648fc205467792dc6d8c59c748f8a6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga3f648fc205467792dc6d8c59c748f8a6\">packF3x9_E1x5</a> (vec3 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga3f648fc205467792dc6d8c59c748f8a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values.  <a href=\"a00159.html#ga3f648fc205467792dc6d8c59c748f8a6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3f648fc205467792dc6d8c59c748f8a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2d8bbce673ebc04831c1fb05c47f5251\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2d8bbce673ebc04831c1fb05c47f5251\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint16, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2d8bbce673ebc04831c1fb05c47f5251\">packHalf</a> (vec&lt; L, float, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga2d8bbce673ebc04831c1fb05c47f5251\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer vector obtained by converting the components of a floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification.  <a href=\"a00159.html#ga2d8bbce673ebc04831c1fb05c47f5251\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2d8bbce673ebc04831c1fb05c47f5251\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga43f2093b6ff192a79058ff7834fc3528\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga43f2093b6ff192a79058ff7834fc3528\">packHalf1x16</a> (float v)</td></tr>\n<tr class=\"memdesc:ga43f2093b6ff192a79058ff7834fc3528\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer obtained by converting the components of a floating-point scalar to the 16-bit floating-point representation found in the OpenGL Specification, and then packing this 16-bit value into a 16-bit unsigned integer.  <a href=\"a00159.html#ga43f2093b6ff192a79058ff7834fc3528\">More...</a><br /></td></tr>\n<tr class=\"separator:ga43f2093b6ff192a79058ff7834fc3528\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafe2f7b39caf8f5ec555e1c059ec530e6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gafe2f7b39caf8f5ec555e1c059ec530e6\">packHalf4x16</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gafe2f7b39caf8f5ec555e1c059ec530e6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer obtained by converting the components of a four-component floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification, and then packing these four 16-bit values into a 64-bit unsigned integer.  <a href=\"a00159.html#gafe2f7b39caf8f5ec555e1c059ec530e6\">More...</a><br /></td></tr>\n<tr class=\"separator:gafe2f7b39caf8f5ec555e1c059ec530e6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga06ecb6afb902dba45419008171db9023\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga06ecb6afb902dba45419008171db9023\">packI3x10_1x2</a> (ivec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga06ecb6afb902dba45419008171db9023\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer obtained by converting the components of a four-component signed integer vector to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification, and then packing these four values into a 32-bit unsigned integer.  <a href=\"a00159.html#ga06ecb6afb902dba45419008171db9023\">More...</a><br /></td></tr>\n<tr class=\"separator:ga06ecb6afb902dba45419008171db9023\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3644163cf3a47bf1d4af1f4b03013a7e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga3644163cf3a47bf1d4af1f4b03013a7e\">packInt2x16</a> (i16vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga3644163cf3a47bf1d4af1f4b03013a7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga3644163cf3a47bf1d4af1f4b03013a7e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3644163cf3a47bf1d4af1f4b03013a7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1e4c8a9e67d86b61a6eec86703a827a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gad1e4c8a9e67d86b61a6eec86703a827a\">packInt2x32</a> (i32vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:gad1e4c8a9e67d86b61a6eec86703a827a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#gad1e4c8a9e67d86b61a6eec86703a827a\">More...</a><br /></td></tr>\n<tr class=\"separator:gad1e4c8a9e67d86b61a6eec86703a827a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8884b1f2292414f36d59ef3be5d62914\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga8884b1f2292414f36d59ef3be5d62914\">packInt2x8</a> (i8vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga8884b1f2292414f36d59ef3be5d62914\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga8884b1f2292414f36d59ef3be5d62914\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8884b1f2292414f36d59ef3be5d62914\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1989f093a27ae69cf9207145be48b3d7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga1989f093a27ae69cf9207145be48b3d7\">packInt4x16</a> (i16vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1989f093a27ae69cf9207145be48b3d7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga1989f093a27ae69cf9207145be48b3d7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1989f093a27ae69cf9207145be48b3d7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2238401d5ce2aaade1a44ba19709072\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaf2238401d5ce2aaade1a44ba19709072\">packInt4x8</a> (i8vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf2238401d5ce2aaade1a44ba19709072\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#gaf2238401d5ce2aaade1a44ba19709072\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2238401d5ce2aaade1a44ba19709072\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0466daf4c90f76cc64b3f105ce727295\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0466daf4c90f76cc64b3f105ce727295\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga0466daf4c90f76cc64b3f105ce727295\">packRGBM</a> (vec&lt; 3, T, Q &gt; const &amp;rgb)</td></tr>\n<tr class=\"memdesc:ga0466daf4c90f76cc64b3f105ce727295\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer vector obtained by converting the components of a floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification.  <a href=\"a00159.html#ga0466daf4c90f76cc64b3f105ce727295\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0466daf4c90f76cc64b3f105ce727295\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa54b5855a750d6aeb12c1c902f5939b8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename intType , length_t L, typename floatType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa54b5855a750d6aeb12c1c902f5939b8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, intType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaa54b5855a750d6aeb12c1c902f5939b8\">packSnorm</a> (vec&lt; L, floatType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa54b5855a750d6aeb12c1c902f5939b8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into signed integer values.  <a href=\"a00159.html#gaa54b5855a750d6aeb12c1c902f5939b8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa54b5855a750d6aeb12c1c902f5939b8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab22f8bcfdb5fc65af4701b25f143c1af\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab22f8bcfdb5fc65af4701b25f143c1af\">packSnorm1x16</a> (float v)</td></tr>\n<tr class=\"memdesc:gab22f8bcfdb5fc65af4701b25f143c1af\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the normalized floating-point value v into 16-bit integer value.  <a href=\"a00159.html#gab22f8bcfdb5fc65af4701b25f143c1af\">More...</a><br /></td></tr>\n<tr class=\"separator:gab22f8bcfdb5fc65af4701b25f143c1af\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3592e0795e62aaa1865b3a10496a7a1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gae3592e0795e62aaa1865b3a10496a7a1\">packSnorm1x8</a> (float s)</td></tr>\n<tr class=\"memdesc:gae3592e0795e62aaa1865b3a10496a7a1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the normalized floating-point value v into 8-bit integer value.  <a href=\"a00159.html#gae3592e0795e62aaa1865b3a10496a7a1\">More...</a><br /></td></tr>\n<tr class=\"separator:gae3592e0795e62aaa1865b3a10496a7a1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6be3cfb2cce3702f03e91bbeb5286d7e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga6be3cfb2cce3702f03e91bbeb5286d7e\">packSnorm2x8</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga6be3cfb2cce3702f03e91bbeb5286d7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8-bit integer values.  <a href=\"a00159.html#ga6be3cfb2cce3702f03e91bbeb5286d7e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6be3cfb2cce3702f03e91bbeb5286d7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab997545661877d2c7362a5084d3897d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab997545661877d2c7362a5084d3897d3\">packSnorm3x10_1x2</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gab997545661877d2c7362a5084d3897d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the first three components of the normalized floating-point value v into 10-bit signed integer values.  <a href=\"a00159.html#gab997545661877d2c7362a5084d3897d3\">More...</a><br /></td></tr>\n<tr class=\"separator:gab997545661877d2c7362a5084d3897d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga358943934d21da947d5bcc88c2ab7832\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga358943934d21da947d5bcc88c2ab7832\">packSnorm4x16</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga358943934d21da947d5bcc88c2ab7832\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 16-bit integer values.  <a href=\"a00159.html#ga358943934d21da947d5bcc88c2ab7832\">More...</a><br /></td></tr>\n<tr class=\"separator:ga358943934d21da947d5bcc88c2ab7832\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gada3d88d59f0f458f9c51a9fd359a4bc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gada3d88d59f0f458f9c51a9fd359a4bc0\">packU3x10_1x2</a> (uvec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gada3d88d59f0f458f9c51a9fd359a4bc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification, and then packing these four values into a 32-bit unsigned integer.  <a href=\"a00159.html#gada3d88d59f0f458f9c51a9fd359a4bc0\">More...</a><br /></td></tr>\n<tr class=\"separator:gada3d88d59f0f458f9c51a9fd359a4bc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5eecc9e8cbaf51ac6cf57501e670ee19\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga5eecc9e8cbaf51ac6cf57501e670ee19\">packUint2x16</a> (u16vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga5eecc9e8cbaf51ac6cf57501e670ee19\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga5eecc9e8cbaf51ac6cf57501e670ee19\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5eecc9e8cbaf51ac6cf57501e670ee19\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa864081097b86e83d8e4a4d79c382b22\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaa864081097b86e83d8e4a4d79c382b22\">packUint2x32</a> (u32vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa864081097b86e83d8e4a4d79c382b22\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#gaa864081097b86e83d8e4a4d79c382b22\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa864081097b86e83d8e4a4d79c382b22\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3c3c9fb53ae7823b10fa083909357590\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga3c3c9fb53ae7823b10fa083909357590\">packUint2x8</a> (u8vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga3c3c9fb53ae7823b10fa083909357590\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga3c3c9fb53ae7823b10fa083909357590\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3c3c9fb53ae7823b10fa083909357590\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ceb62cca347d8ace42ee90317a3f1f9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2ceb62cca347d8ace42ee90317a3f1f9\">packUint4x16</a> (u16vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga2ceb62cca347d8ace42ee90317a3f1f9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga2ceb62cca347d8ace42ee90317a3f1f9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2ceb62cca347d8ace42ee90317a3f1f9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0fe2f09aeb403cd66c1a062f58861ab\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaa0fe2f09aeb403cd66c1a062f58861ab\">packUint4x8</a> (u8vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa0fe2f09aeb403cd66c1a062f58861ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#gaa0fe2f09aeb403cd66c1a062f58861ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0fe2f09aeb403cd66c1a062f58861ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename uintType , length_t L, typename floatType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uintType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaccd3f27e6ba5163eb7aa9bc8ff96251a\">packUnorm</a> (vec&lt; L, floatType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#gaccd3f27e6ba5163eb7aa9bc8ff96251a\">More...</a><br /></td></tr>\n<tr class=\"separator:gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9f82737bf2a44bedff1d286b76837886\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga9f82737bf2a44bedff1d286b76837886\">packUnorm1x16</a> (float v)</td></tr>\n<tr class=\"memdesc:ga9f82737bf2a44bedff1d286b76837886\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the normalized floating-point value v into a 16-bit integer value.  <a href=\"a00159.html#ga9f82737bf2a44bedff1d286b76837886\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9f82737bf2a44bedff1d286b76837886\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga768e0337dd6246773f14aa0a421fe9a8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga768e0337dd6246773f14aa0a421fe9a8\">packUnorm1x5_1x6_1x5</a> (vec3 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga768e0337dd6246773f14aa0a421fe9a8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#ga768e0337dd6246773f14aa0a421fe9a8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga768e0337dd6246773f14aa0a421fe9a8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b2fa60df3460403817d28b082ee0736\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga4b2fa60df3460403817d28b082ee0736\">packUnorm1x8</a> (float v)</td></tr>\n<tr class=\"memdesc:ga4b2fa60df3460403817d28b082ee0736\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the normalized floating-point value v into a 8-bit integer value.  <a href=\"a00159.html#ga4b2fa60df3460403817d28b082ee0736\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b2fa60df3460403817d28b082ee0736\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f9abdb50f9be1aa1c14912504a0d98d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga7f9abdb50f9be1aa1c14912504a0d98d\">packUnorm2x3_1x2</a> (vec3 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga7f9abdb50f9be1aa1c14912504a0d98d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#ga7f9abdb50f9be1aa1c14912504a0d98d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f9abdb50f9be1aa1c14912504a0d98d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab6bbd5be3b8e6db538ecb33a7844481c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab6bbd5be3b8e6db538ecb33a7844481c\">packUnorm2x4</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:gab6bbd5be3b8e6db538ecb33a7844481c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#gab6bbd5be3b8e6db538ecb33a7844481c\">More...</a><br /></td></tr>\n<tr class=\"separator:gab6bbd5be3b8e6db538ecb33a7844481c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9a666b1c688ab54100061ed06526de6e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga9a666b1c688ab54100061ed06526de6e\">packUnorm2x8</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga9a666b1c688ab54100061ed06526de6e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8-bit integer values.  <a href=\"a00159.html#ga9a666b1c688ab54100061ed06526de6e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9a666b1c688ab54100061ed06526de6e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8a1ee625d2707c60530fb3fca2980b19\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga8a1ee625d2707c60530fb3fca2980b19\">packUnorm3x10_1x2</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga8a1ee625d2707c60530fb3fca2980b19\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the first three components of the normalized floating-point value v into 10-bit unsigned integer values.  <a href=\"a00159.html#ga8a1ee625d2707c60530fb3fca2980b19\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8a1ee625d2707c60530fb3fca2980b19\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec4112086d7fb133bea104a7c237de52\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaec4112086d7fb133bea104a7c237de52\">packUnorm3x5_1x1</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaec4112086d7fb133bea104a7c237de52\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#gaec4112086d7fb133bea104a7c237de52\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec4112086d7fb133bea104a7c237de52\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f63c264e7ab63264e2b2a99fd393897\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga1f63c264e7ab63264e2b2a99fd393897\">packUnorm4x16</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1f63c264e7ab63264e2b2a99fd393897\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 16-bit integer values.  <a href=\"a00159.html#ga1f63c264e7ab63264e2b2a99fd393897\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f63c264e7ab63264e2b2a99fd393897\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad3e7e3ce521513584a53aedc5f9765c1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gad3e7e3ce521513584a53aedc5f9765c1\">packUnorm4x4</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gad3e7e3ce521513584a53aedc5f9765c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#gad3e7e3ce521513584a53aedc5f9765c1\">More...</a><br /></td></tr>\n<tr class=\"separator:gad3e7e3ce521513584a53aedc5f9765c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b1fd1e854705b1345e98409e0a25e50\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2b1fd1e854705b1345e98409e0a25e50\">unpackF2x11_1x10</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga2b1fd1e854705b1345e98409e0a25e50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value .  <a href=\"a00159.html#ga2b1fd1e854705b1345e98409e0a25e50\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b1fd1e854705b1345e98409e0a25e50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab9e60ebe3ad3eeced6a9ec6eb876d74e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab9e60ebe3ad3eeced6a9ec6eb876d74e\">unpackF3x9_E1x5</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:gab9e60ebe3ad3eeced6a9ec6eb876d74e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value .  <a href=\"a00159.html#gab9e60ebe3ad3eeced6a9ec6eb876d74e\">More...</a><br /></td></tr>\n<tr class=\"separator:gab9e60ebe3ad3eeced6a9ec6eb876d74e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30d6b2f1806315bcd6047131f547d33b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga30d6b2f1806315bcd6047131f547d33b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, float, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga30d6b2f1806315bcd6047131f547d33b\">unpackHalf</a> (vec&lt; L, uint16, Q &gt; const &amp;p)</td></tr>\n<tr class=\"memdesc:ga30d6b2f1806315bcd6047131f547d33b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values.  <a href=\"a00159.html#ga30d6b2f1806315bcd6047131f547d33b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30d6b2f1806315bcd6047131f547d33b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac37dedaba24b00adb4ec6e8f92c19dbf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gac37dedaba24b00adb4ec6e8f92c19dbf\">unpackHalf1x16</a> (uint16 v)</td></tr>\n<tr class=\"memdesc:gac37dedaba24b00adb4ec6e8f92c19dbf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into a 16-bit value, interpreted as a 16-bit floating-point number according to the OpenGL Specification, and converting it to 32-bit floating-point values.  <a href=\"a00159.html#gac37dedaba24b00adb4ec6e8f92c19dbf\">More...</a><br /></td></tr>\n<tr class=\"separator:gac37dedaba24b00adb4ec6e8f92c19dbf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga57dfc41b2eb20b0ac00efae7d9c49dcd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga57dfc41b2eb20b0ac00efae7d9c49dcd\">unpackHalf4x16</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:ga57dfc41b2eb20b0ac00efae7d9c49dcd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigned integer into four 16-bit values, interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, and converting them to 32-bit floating-point values.  <a href=\"a00159.html#ga57dfc41b2eb20b0ac00efae7d9c49dcd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga57dfc41b2eb20b0ac00efae7d9c49dcd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9a05330e5490be0908d3b117d82aff56\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL ivec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga9a05330e5490be0908d3b117d82aff56\">unpackI3x10_1x2</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga9a05330e5490be0908d3b117d82aff56\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers.  <a href=\"a00159.html#ga9a05330e5490be0908d3b117d82aff56\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9a05330e5490be0908d3b117d82aff56\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaccde055882918a3175de82f4ca8b7d8e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i16vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaccde055882918a3175de82f4ca8b7d8e\">unpackInt2x16</a> (int p)</td></tr>\n<tr class=\"memdesc:gaccde055882918a3175de82f4ca8b7d8e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gaccde055882918a3175de82f4ca8b7d8e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaccde055882918a3175de82f4ca8b7d8e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab297c0bfd38433524791eb0584d8f08d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab297c0bfd38433524791eb0584d8f08d\">unpackInt2x32</a> (int64 p)</td></tr>\n<tr class=\"memdesc:gab297c0bfd38433524791eb0584d8f08d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gab297c0bfd38433524791eb0584d8f08d\">More...</a><br /></td></tr>\n<tr class=\"separator:gab297c0bfd38433524791eb0584d8f08d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab0c59f1e259fca9e68adb2207a6b665e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i8vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab0c59f1e259fca9e68adb2207a6b665e\">unpackInt2x8</a> (int16 p)</td></tr>\n<tr class=\"memdesc:gab0c59f1e259fca9e68adb2207a6b665e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gab0c59f1e259fca9e68adb2207a6b665e\">More...</a><br /></td></tr>\n<tr class=\"separator:gab0c59f1e259fca9e68adb2207a6b665e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52c154a9b232b62c22517a700cc0c78c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i16vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga52c154a9b232b62c22517a700cc0c78c\">unpackInt4x16</a> (int64 p)</td></tr>\n<tr class=\"memdesc:ga52c154a9b232b62c22517a700cc0c78c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#ga52c154a9b232b62c22517a700cc0c78c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga52c154a9b232b62c22517a700cc0c78c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1cd8d2038cdd33a860801aa155a26221\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i8vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga1cd8d2038cdd33a860801aa155a26221\">unpackInt4x8</a> (int32 p)</td></tr>\n<tr class=\"memdesc:ga1cd8d2038cdd33a860801aa155a26221\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#ga1cd8d2038cdd33a860801aa155a26221\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1cd8d2038cdd33a860801aa155a26221\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5c1ec97894b05ea21a05aea4f0204a02\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5c1ec97894b05ea21a05aea4f0204a02\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga5c1ec97894b05ea21a05aea4f0204a02\">unpackRGBM</a> (vec&lt; 4, T, Q &gt; const &amp;rgbm)</td></tr>\n<tr class=\"memdesc:ga5c1ec97894b05ea21a05aea4f0204a02\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values.  <a href=\"a00159.html#ga5c1ec97894b05ea21a05aea4f0204a02\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5c1ec97894b05ea21a05aea4f0204a02\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d49b31e5c3f9df8e1f99ab62b999482\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename floatType , length_t L, typename intType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6d49b31e5c3f9df8e1f99ab62b999482\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga6d49b31e5c3f9df8e1f99ab62b999482\">unpackSnorm</a> (vec&lt; L, intType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga6d49b31e5c3f9df8e1f99ab62b999482\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga6d49b31e5c3f9df8e1f99ab62b999482\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d49b31e5c3f9df8e1f99ab62b999482\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga96dd15002370627a443c835ab03a766c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga96dd15002370627a443c835ab03a766c\">unpackSnorm1x16</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga96dd15002370627a443c835ab03a766c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers.  <a href=\"a00159.html#ga96dd15002370627a443c835ab03a766c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96dd15002370627a443c835ab03a766c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4851ff86678aa1c7ace9d67846894285\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga4851ff86678aa1c7ace9d67846894285\">unpackSnorm1x8</a> (uint8 p)</td></tr>\n<tr class=\"memdesc:ga4851ff86678aa1c7ace9d67846894285\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers.  <a href=\"a00159.html#ga4851ff86678aa1c7ace9d67846894285\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4851ff86678aa1c7ace9d67846894285\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b128e89be449fc71336968a66bf6e1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga8b128e89be449fc71336968a66bf6e1a\">unpackSnorm2x8</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga8b128e89be449fc71336968a66bf6e1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers.  <a href=\"a00159.html#ga8b128e89be449fc71336968a66bf6e1a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b128e89be449fc71336968a66bf6e1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a4fbf79be9740e3c57737bc2af05e5b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga7a4fbf79be9740e3c57737bc2af05e5b\">unpackSnorm3x10_1x2</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga7a4fbf79be9740e3c57737bc2af05e5b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers.  <a href=\"a00159.html#ga7a4fbf79be9740e3c57737bc2af05e5b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a4fbf79be9740e3c57737bc2af05e5b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaddf9c353528fe896106f7181219c7f4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaaddf9c353528fe896106f7181219c7f4\">unpackSnorm4x16</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:gaaddf9c353528fe896106f7181219c7f4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers.  <a href=\"a00159.html#gaaddf9c353528fe896106f7181219c7f4\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaddf9c353528fe896106f7181219c7f4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga48df3042a7d079767f5891a1bfd8a60a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga48df3042a7d079767f5891a1bfd8a60a\">unpackU3x10_1x2</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga48df3042a7d079767f5891a1bfd8a60a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers.  <a href=\"a00159.html#ga48df3042a7d079767f5891a1bfd8a60a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga48df3042a7d079767f5891a1bfd8a60a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga035bbbeab7ec2b28c0529757395b645b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u16vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga035bbbeab7ec2b28c0529757395b645b\">unpackUint2x16</a> (uint p)</td></tr>\n<tr class=\"memdesc:ga035bbbeab7ec2b28c0529757395b645b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#ga035bbbeab7ec2b28c0529757395b645b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga035bbbeab7ec2b28c0529757395b645b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf942ff11b65e83eb5f77e68329ebc6ab\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaf942ff11b65e83eb5f77e68329ebc6ab\">unpackUint2x32</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:gaf942ff11b65e83eb5f77e68329ebc6ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gaf942ff11b65e83eb5f77e68329ebc6ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf942ff11b65e83eb5f77e68329ebc6ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7600a6c71784b637a410869d2a5adcd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u8vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaa7600a6c71784b637a410869d2a5adcd\">unpackUint2x8</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:gaa7600a6c71784b637a410869d2a5adcd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gaa7600a6c71784b637a410869d2a5adcd\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7600a6c71784b637a410869d2a5adcd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab173834ef14cfc23a96a959f3ff4b8dc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u16vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab173834ef14cfc23a96a959f3ff4b8dc\">unpackUint4x16</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:gab173834ef14cfc23a96a959f3ff4b8dc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gab173834ef14cfc23a96a959f3ff4b8dc\">More...</a><br /></td></tr>\n<tr class=\"separator:gab173834ef14cfc23a96a959f3ff4b8dc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf6dc0e4341810a641c7ed08f10e335d1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u8vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaf6dc0e4341810a641c7ed08f10e335d1\">unpackUint4x8</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:gaf6dc0e4341810a641c7ed08f10e335d1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gaf6dc0e4341810a641c7ed08f10e335d1\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf6dc0e4341810a641c7ed08f10e335d1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename floatType , length_t L, typename uintType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga3e6ac9178b59f0b1b2f7599f2183eb7f\">unpackUnorm</a> (vec&lt; L, uintType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga3e6ac9178b59f0b1b2f7599f2183eb7f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga83d34160a5cb7bcb5339823210fc7501\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga83d34160a5cb7bcb5339823210fc7501\">unpackUnorm1x16</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga83d34160a5cb7bcb5339823210fc7501\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers.  <a href=\"a00159.html#ga83d34160a5cb7bcb5339823210fc7501\">More...</a><br /></td></tr>\n<tr class=\"separator:ga83d34160a5cb7bcb5339823210fc7501\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab3bc08ecfc0f3339be93fb2b3b56d88a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab3bc08ecfc0f3339be93fb2b3b56d88a\">unpackUnorm1x5_1x6_1x5</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:gab3bc08ecfc0f3339be93fb2b3b56d88a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#gab3bc08ecfc0f3339be93fb2b3b56d88a\">More...</a><br /></td></tr>\n<tr class=\"separator:gab3bc08ecfc0f3339be93fb2b3b56d88a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1319207e30874fb4931a9ee913983ee1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga1319207e30874fb4931a9ee913983ee1\">unpackUnorm1x8</a> (uint8 p)</td></tr>\n<tr class=\"memdesc:ga1319207e30874fb4931a9ee913983ee1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a single 8-bit integer to a normalized floating-point value.  <a href=\"a00159.html#ga1319207e30874fb4931a9ee913983ee1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1319207e30874fb4931a9ee913983ee1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6abd5a9014df3b5ce4059008d2491260\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga6abd5a9014df3b5ce4059008d2491260\">unpackUnorm2x3_1x2</a> (uint8 p)</td></tr>\n<tr class=\"memdesc:ga6abd5a9014df3b5ce4059008d2491260\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga6abd5a9014df3b5ce4059008d2491260\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6abd5a9014df3b5ce4059008d2491260\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e50476132fe5f27f08e273d9c70d85b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2e50476132fe5f27f08e273d9c70d85b\">unpackUnorm2x4</a> (uint8 p)</td></tr>\n<tr class=\"memdesc:ga2e50476132fe5f27f08e273d9c70d85b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga2e50476132fe5f27f08e273d9c70d85b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e50476132fe5f27f08e273d9c70d85b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga637cbe3913dd95c6e7b4c99c61bd611f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga637cbe3913dd95c6e7b4c99c61bd611f\">unpackUnorm2x8</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga637cbe3913dd95c6e7b4c99c61bd611f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers.  <a href=\"a00159.html#ga637cbe3913dd95c6e7b4c99c61bd611f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga637cbe3913dd95c6e7b4c99c61bd611f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5156d3060355fe332865da2c7f78815f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga5156d3060355fe332865da2c7f78815f\">unpackUnorm3x10_1x2</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga5156d3060355fe332865da2c7f78815f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers.  <a href=\"a00159.html#ga5156d3060355fe332865da2c7f78815f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5156d3060355fe332865da2c7f78815f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5ff95ff5bc16f396432ab67243dbae4d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga5ff95ff5bc16f396432ab67243dbae4d\">unpackUnorm3x5_1x1</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga5ff95ff5bc16f396432ab67243dbae4d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga5ff95ff5bc16f396432ab67243dbae4d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5ff95ff5bc16f396432ab67243dbae4d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ae149c5d2473ac1e5f347bb654a242d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2ae149c5d2473ac1e5f347bb654a242d\">unpackUnorm4x16</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:ga2ae149c5d2473ac1e5f347bb654a242d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers.  <a href=\"a00159.html#ga2ae149c5d2473ac1e5f347bb654a242d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2ae149c5d2473ac1e5f347bb654a242d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac58ee89d0e224bb6df5e8bbb18843a2d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gac58ee89d0e224bb6df5e8bbb18843a2d\">unpackUnorm4x4</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:gac58ee89d0e224bb6df5e8bbb18843a2d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#gac58ee89d0e224bb6df5e8bbb18843a2d\">More...</a><br /></td></tr>\n<tr class=\"separator:gac58ee89d0e224bb6df5e8bbb18843a2d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00159.html\">GLM_GTC_packing</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00076_source.html\">gtc/packing.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00076_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: packing.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/packing.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00076.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00117.html\">type_precision.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_packing extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        GLM_FUNC_DECL uint8 <a class=\"code\" href=\"a00159.html#ga4b2fa60df3460403817d28b082ee0736\">packUnorm1x8</a>(<span class=\"keywordtype\">float</span> v);</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">float</span> <a class=\"code\" href=\"a00159.html#ga1319207e30874fb4931a9ee913983ee1\">unpackUnorm1x8</a>(uint8 p);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#ga9a666b1c688ab54100061ed06526de6e\">packUnorm2x8</a>(<a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <a class=\"code\" href=\"a00159.html#ga637cbe3913dd95c6e7b4c99c61bd611f\">unpackUnorm2x8</a>(uint16 p);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;        GLM_FUNC_DECL uint8 <a class=\"code\" href=\"a00159.html#gae3592e0795e62aaa1865b3a10496a7a1\">packSnorm1x8</a>(<span class=\"keywordtype\">float</span> s);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">float</span> <a class=\"code\" href=\"a00159.html#ga4851ff86678aa1c7ace9d67846894285\">unpackSnorm1x8</a>(uint8 p);</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#ga6be3cfb2cce3702f03e91bbeb5286d7e\">packSnorm2x8</a>(<a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <a class=\"code\" href=\"a00159.html#ga8b128e89be449fc71336968a66bf6e1a\">unpackSnorm2x8</a>(uint16 p);</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#ga9f82737bf2a44bedff1d286b76837886\">packUnorm1x16</a>(<span class=\"keywordtype\">float</span> v);</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">float</span> <a class=\"code\" href=\"a00159.html#ga83d34160a5cb7bcb5339823210fc7501\">unpackUnorm1x16</a>(uint16 p);</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00159.html#ga1f63c264e7ab63264e2b2a99fd393897\">packUnorm4x16</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00159.html#ga2ae149c5d2473ac1e5f347bb654a242d\">unpackUnorm4x16</a>(uint64 p);</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#gab22f8bcfdb5fc65af4701b25f143c1af\">packSnorm1x16</a>(<span class=\"keywordtype\">float</span> v);</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">float</span> <a class=\"code\" href=\"a00159.html#ga96dd15002370627a443c835ab03a766c\">unpackSnorm1x16</a>(uint16 p);</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00159.html#ga358943934d21da947d5bcc88c2ab7832\">packSnorm4x16</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00159.html#gaaddf9c353528fe896106f7181219c7f4\">unpackSnorm4x16</a>(uint64 p);</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#ga43f2093b6ff192a79058ff7834fc3528\">packHalf1x16</a>(<span class=\"keywordtype\">float</span> v);</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">float</span> <a class=\"code\" href=\"a00159.html#gac37dedaba24b00adb4ec6e8f92c19dbf\">unpackHalf1x16</a>(uint16 v);</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;</div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00159.html#gafe2f7b39caf8f5ec555e1c059ec530e6\">packHalf4x16</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00159.html#ga57dfc41b2eb20b0ac00efae7d9c49dcd\">unpackHalf4x16</a>(uint64 p);</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00159.html#ga06ecb6afb902dba45419008171db9023\">packI3x10_1x2</a>(<a class=\"code\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a> <a class=\"code\" href=\"a00159.html#ga9a05330e5490be0908d3b117d82aff56\">unpackI3x10_1x2</a>(uint32 p);</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00159.html#gada3d88d59f0f458f9c51a9fd359a4bc0\">packU3x10_1x2</a>(<a class=\"code\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a> <a class=\"code\" href=\"a00159.html#ga48df3042a7d079767f5891a1bfd8a60a\">unpackU3x10_1x2</a>(uint32 p);</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00159.html#gab997545661877d2c7362a5084d3897d3\">packSnorm3x10_1x2</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;</div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00159.html#ga7a4fbf79be9740e3c57737bc2af05e5b\">unpackSnorm3x10_1x2</a>(uint32 p);</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00159.html#ga8a1ee625d2707c60530fb3fca2980b19\">packUnorm3x10_1x2</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;</div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00159.html#ga5156d3060355fe332865da2c7f78815f\">unpackUnorm3x10_1x2</a>(uint32 p);</div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00159.html#ga4944ad465ff950e926d49621f916c78d\">packF2x11_1x10</a>(<a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;</div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> <a class=\"code\" href=\"a00159.html#ga2b1fd1e854705b1345e98409e0a25e50\">unpackF2x11_1x10</a>(uint32 p);</div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;</div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;</div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00159.html#ga3f648fc205467792dc6d8c59c748f8a6\">packF3x9_E1x5</a>(<a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;</div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> <a class=\"code\" href=\"a00159.html#gab9e60ebe3ad3eeced6a9ec6eb876d74e\">unpackF3x9_E1x5</a>(uint32 p);</div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\">  471</span>&#160;</div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00159.html#ga0466daf4c90f76cc64b3f105ce727295\">packRGBM</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; rgb);</div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;</div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00159.html#ga5c1ec97894b05ea21a05aea4f0204a02\">unpackRGBM</a>(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; rgbm);</div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;</div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;        GLM_FUNC_DECL vec&lt;L, uint16, Q&gt; <a class=\"code\" href=\"a00159.html#ga2d8bbce673ebc04831c1fb05c47f5251\">packHalf</a>(vec&lt;L, float, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;</div>\n<div class=\"line\"><a name=\"l00511\"></a><span class=\"lineno\">  511</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;        GLM_FUNC_DECL vec&lt;L, float, Q&gt; <a class=\"code\" href=\"a00159.html#ga30d6b2f1806315bcd6047131f547d33b\">unpackHalf</a>(vec&lt;L, uint16, Q&gt; <span class=\"keyword\">const</span>&amp; p);</div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;</div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> u<span class=\"keywordtype\">int</span>Type, length_t L, <span class=\"keyword\">typename</span> <span class=\"keywordtype\">float</span>Type, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;        GLM_FUNC_DECL vec&lt;L, uintType, Q&gt; <a class=\"code\" href=\"a00159.html#gaccd3f27e6ba5163eb7aa9bc8ff96251a\">packUnorm</a>(vec&lt;L, floatType, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\">  520</span>&#160;</div>\n<div class=\"line\"><a name=\"l00525\"></a><span class=\"lineno\">  525</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> <span class=\"keywordtype\">float</span>Type, length_t L, <span class=\"keyword\">typename</span> u<span class=\"keywordtype\">int</span>Type, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;        GLM_FUNC_DECL vec&lt;L, floatType, Q&gt; <a class=\"code\" href=\"a00159.html#ga3e6ac9178b59f0b1b2f7599f2183eb7f\">unpackUnorm</a>(vec&lt;L, uintType, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;</div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> <span class=\"keywordtype\">int</span>Type, length_t L, <span class=\"keyword\">typename</span> <span class=\"keywordtype\">float</span>Type, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\">  533</span>&#160;        GLM_FUNC_DECL vec&lt;L, intType, Q&gt; <a class=\"code\" href=\"a00159.html#gaa54b5855a750d6aeb12c1c902f5939b8\">packSnorm</a>(vec&lt;L, floatType, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;</div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> <span class=\"keywordtype\">float</span>Type, length_t L, <span class=\"keyword\">typename</span> <span class=\"keywordtype\">int</span>Type, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;        GLM_FUNC_DECL vec&lt;L, floatType, Q&gt; <a class=\"code\" href=\"a00159.html#ga6d49b31e5c3f9df8e1f99ab62b999482\">unpackSnorm</a>(vec&lt;L, intType, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00541\"></a><span class=\"lineno\">  541</span>&#160;</div>\n<div class=\"line\"><a name=\"l00546\"></a><span class=\"lineno\">  546</span>&#160;        GLM_FUNC_DECL uint8 <a class=\"code\" href=\"a00159.html#gab6bbd5be3b8e6db538ecb33a7844481c\">packUnorm2x4</a>(<a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;</div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <a class=\"code\" href=\"a00159.html#ga2e50476132fe5f27f08e273d9c70d85b\">unpackUnorm2x4</a>(uint8 p);</div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;</div>\n<div class=\"line\"><a name=\"l00558\"></a><span class=\"lineno\">  558</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#gad3e7e3ce521513584a53aedc5f9765c1\">packUnorm4x4</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00559\"></a><span class=\"lineno\">  559</span>&#160;</div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00159.html#gac58ee89d0e224bb6df5e8bbb18843a2d\">unpackUnorm4x4</a>(uint16 p);</div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;</div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#ga768e0337dd6246773f14aa0a421fe9a8\">packUnorm1x5_1x6_1x5</a>(<a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00571\"></a><span class=\"lineno\">  571</span>&#160;</div>\n<div class=\"line\"><a name=\"l00576\"></a><span class=\"lineno\">  576</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> <a class=\"code\" href=\"a00159.html#gab3bc08ecfc0f3339be93fb2b3b56d88a\">unpackUnorm1x5_1x6_1x5</a>(uint16 p);</div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;</div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#gaec4112086d7fb133bea104a7c237de52\">packUnorm3x5_1x1</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00583\"></a><span class=\"lineno\">  583</span>&#160;</div>\n<div class=\"line\"><a name=\"l00588\"></a><span class=\"lineno\">  588</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00159.html#ga5ff95ff5bc16f396432ab67243dbae4d\">unpackUnorm3x5_1x1</a>(uint16 p);</div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\">  589</span>&#160;</div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;        GLM_FUNC_DECL uint8 <a class=\"code\" href=\"a00159.html#ga7f9abdb50f9be1aa1c14912504a0d98d\">packUnorm2x3_1x2</a>(<a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\">  595</span>&#160;</div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> <a class=\"code\" href=\"a00159.html#ga6abd5a9014df3b5ce4059008d2491260\">unpackUnorm2x3_1x2</a>(uint8 p);</div>\n<div class=\"line\"><a name=\"l00601\"></a><span class=\"lineno\">  601</span>&#160;</div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;</div>\n<div class=\"line\"><a name=\"l00603\"></a><span class=\"lineno\">  603</span>&#160;</div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;        GLM_FUNC_DECL int16 <a class=\"code\" href=\"a00159.html#ga8884b1f2292414f36d59ef3be5d62914\">packInt2x8</a>(<a class=\"code\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00609\"></a><span class=\"lineno\">  609</span>&#160;</div>\n<div class=\"line\"><a name=\"l00614\"></a><span class=\"lineno\">  614</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a> <a class=\"code\" href=\"a00159.html#gab0c59f1e259fca9e68adb2207a6b665e\">unpackInt2x8</a>(int16 p);</div>\n<div class=\"line\"><a name=\"l00615\"></a><span class=\"lineno\">  615</span>&#160;</div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;        GLM_FUNC_DECL uint16 <a class=\"code\" href=\"a00159.html#ga3c3c9fb53ae7823b10fa083909357590\">packUint2x8</a>(<a class=\"code\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00621\"></a><span class=\"lineno\">  621</span>&#160;</div>\n<div class=\"line\"><a name=\"l00626\"></a><span class=\"lineno\">  626</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a> <a class=\"code\" href=\"a00159.html#gaa7600a6c71784b637a410869d2a5adcd\">unpackUint2x8</a>(uint16 p);</div>\n<div class=\"line\"><a name=\"l00627\"></a><span class=\"lineno\">  627</span>&#160;</div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;        GLM_FUNC_DECL int32 <a class=\"code\" href=\"a00159.html#gaf2238401d5ce2aaade1a44ba19709072\">packInt4x8</a>(<a class=\"code\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00633\"></a><span class=\"lineno\">  633</span>&#160;</div>\n<div class=\"line\"><a name=\"l00638\"></a><span class=\"lineno\">  638</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a> <a class=\"code\" href=\"a00159.html#ga1cd8d2038cdd33a860801aa155a26221\">unpackInt4x8</a>(int32 p);</div>\n<div class=\"line\"><a name=\"l00639\"></a><span class=\"lineno\">  639</span>&#160;</div>\n<div class=\"line\"><a name=\"l00644\"></a><span class=\"lineno\">  644</span>&#160;        GLM_FUNC_DECL uint32 <a class=\"code\" href=\"a00159.html#gaa0fe2f09aeb403cd66c1a062f58861ab\">packUint4x8</a>(<a class=\"code\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;</div>\n<div class=\"line\"><a name=\"l00650\"></a><span class=\"lineno\">  650</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a> <a class=\"code\" href=\"a00159.html#gaf6dc0e4341810a641c7ed08f10e335d1\">unpackUint4x8</a>(uint32 p);</div>\n<div class=\"line\"><a name=\"l00651\"></a><span class=\"lineno\">  651</span>&#160;</div>\n<div class=\"line\"><a name=\"l00656\"></a><span class=\"lineno\">  656</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">int</span> <a class=\"code\" href=\"a00159.html#ga3644163cf3a47bf1d4af1f4b03013a7e\">packInt2x16</a>(<a class=\"code\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00657\"></a><span class=\"lineno\">  657</span>&#160;</div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a> <a class=\"code\" href=\"a00159.html#gaccde055882918a3175de82f4ca8b7d8e\">unpackInt2x16</a>(<span class=\"keywordtype\">int</span> p);</div>\n<div class=\"line\"><a name=\"l00663\"></a><span class=\"lineno\">  663</span>&#160;</div>\n<div class=\"line\"><a name=\"l00668\"></a><span class=\"lineno\">  668</span>&#160;        GLM_FUNC_DECL int64 <a class=\"code\" href=\"a00159.html#ga1989f093a27ae69cf9207145be48b3d7\">packInt4x16</a>(<a class=\"code\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00669\"></a><span class=\"lineno\">  669</span>&#160;</div>\n<div class=\"line\"><a name=\"l00674\"></a><span class=\"lineno\">  674</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a> <a class=\"code\" href=\"a00159.html#ga52c154a9b232b62c22517a700cc0c78c\">unpackInt4x16</a>(int64 p);</div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;</div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00159.html#ga5eecc9e8cbaf51ac6cf57501e670ee19\">packUint2x16</a>(<a class=\"code\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;</div>\n<div class=\"line\"><a name=\"l00686\"></a><span class=\"lineno\">  686</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a> <a class=\"code\" href=\"a00159.html#ga035bbbeab7ec2b28c0529757395b645b\">unpackUint2x16</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> p);</div>\n<div class=\"line\"><a name=\"l00687\"></a><span class=\"lineno\">  687</span>&#160;</div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\">  692</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00159.html#ga2ceb62cca347d8ace42ee90317a3f1f9\">packUint4x16</a>(<a class=\"code\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00693\"></a><span class=\"lineno\">  693</span>&#160;</div>\n<div class=\"line\"><a name=\"l00698\"></a><span class=\"lineno\">  698</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a> <a class=\"code\" href=\"a00159.html#gab173834ef14cfc23a96a959f3ff4b8dc\">unpackUint4x16</a>(uint64 p);</div>\n<div class=\"line\"><a name=\"l00699\"></a><span class=\"lineno\">  699</span>&#160;</div>\n<div class=\"line\"><a name=\"l00704\"></a><span class=\"lineno\">  704</span>&#160;        GLM_FUNC_DECL int64 <a class=\"code\" href=\"a00159.html#gad1e4c8a9e67d86b61a6eec86703a827a\">packInt2x32</a>(<a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00705\"></a><span class=\"lineno\">  705</span>&#160;</div>\n<div class=\"line\"><a name=\"l00710\"></a><span class=\"lineno\">  710</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a> <a class=\"code\" href=\"a00159.html#gab297c0bfd38433524791eb0584d8f08d\">unpackInt2x32</a>(int64 p);</div>\n<div class=\"line\"><a name=\"l00711\"></a><span class=\"lineno\">  711</span>&#160;</div>\n<div class=\"line\"><a name=\"l00716\"></a><span class=\"lineno\">  716</span>&#160;        GLM_FUNC_DECL uint64 <a class=\"code\" href=\"a00159.html#gaa864081097b86e83d8e4a4d79c382b22\">packUint2x32</a>(<a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00717\"></a><span class=\"lineno\">  717</span>&#160;</div>\n<div class=\"line\"><a name=\"l00722\"></a><span class=\"lineno\">  722</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a> <a class=\"code\" href=\"a00159.html#gaf942ff11b65e83eb5f77e68329ebc6ab\">unpackUint2x32</a>(uint64 p);</div>\n<div class=\"line\"><a name=\"l00723\"></a><span class=\"lineno\">  723</span>&#160;</div>\n<div class=\"line\"><a name=\"l00724\"></a><span class=\"lineno\">  724</span>&#160;</div>\n<div class=\"line\"><a name=\"l00726\"></a><span class=\"lineno\">  726</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;</div>\n<div class=\"line\"><a name=\"l00728\"></a><span class=\"lineno\">  728</span>&#160;<span class=\"preprocessor\">#include &quot;packing.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00159_html_ga8a1ee625d2707c60530fb3fca2980b19\"><div class=\"ttname\"><a href=\"a00159.html#ga8a1ee625d2707c60530fb3fca2980b19\">glm::packUnorm3x10_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const &amp;v)</div><div class=\"ttdoc\">First, converts the first three components of the normalized floating-point value v into 10-bit unsig...</div></div>\n<div class=\"ttc\" id=\"a00144_html_gaaa26c41d168dc00be0fe55f4d0a34224\"><div class=\"ttname\"><a href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">glm::ivec4</a></div><div class=\"ttdeci\">highp_ivec4 ivec4</div><div class=\"ttdoc\">4 components vector of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00521\">type_vec.hpp:521</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga7a4fbf79be9740e3c57737bc2af05e5b\"><div class=\"ttname\"><a href=\"a00159.html#ga7a4fbf79be9740e3c57737bc2af05e5b\">glm::unpackSnorm3x10_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackSnorm3x10_1x2(uint32 p)</div><div class=\"ttdoc\">First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga4944ad465ff950e926d49621f916c78d\"><div class=\"ttname\"><a href=\"a00159.html#ga4944ad465ff950e926d49621f916c78d\">glm::packF2x11_1x10</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const &amp;v)</div><div class=\"ttdoc\">First, converts the first two components of the normalized floating-point value v into 11-bit signles...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga2e50476132fe5f27f08e273d9c70d85b\"><div class=\"ttname\"><a href=\"a00159.html#ga2e50476132fe5f27f08e273d9c70d85b\">glm::unpackUnorm2x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec2 unpackUnorm2x4(uint8 p)</div><div class=\"ttdoc\">Convert a packed integer to a normalized floating-point vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga637cbe3913dd95c6e7b4c99c61bd611f\"><div class=\"ttname\"><a href=\"a00159.html#ga637cbe3913dd95c6e7b4c99c61bd611f\">glm::unpackUnorm2x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec2 unpackUnorm2x8(uint16 p)</div><div class=\"ttdoc\">First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gaa7600a6c71784b637a410869d2a5adcd\"><div class=\"ttname\"><a href=\"a00159.html#gaa7600a6c71784b637a410869d2a5adcd\">glm::unpackUint2x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL u8vec2 unpackUint2x8(uint16 p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gada3d88d59f0f458f9c51a9fd359a4bc0\"><div class=\"ttname\"><a href=\"a00159.html#gada3d88d59f0f458f9c51a9fd359a4bc0\">glm::packU3x10_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const &amp;v)</div><div class=\"ttdoc\">Returns an unsigned integer obtained by converting the components of a four-component unsigned intege...</div></div>\n<div class=\"ttc\" id=\"a00159_html_gaccde055882918a3175de82f4ca8b7d8e\"><div class=\"ttname\"><a href=\"a00159.html#gaccde055882918a3175de82f4ca8b7d8e\">glm::unpackInt2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL i16vec2 unpackInt2x16(int p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00144_html_ga09d0200e8ff86391d8804b4fefd5f1da\"><div class=\"ttname\"><a href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">glm::vec2</a></div><div class=\"ttdeci\">highp_vec2 vec2</div><div class=\"ttdoc\">2 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00457\">type_vec.hpp:457</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga4b2fa60df3460403817d28b082ee0736\"><div class=\"ttname\"><a href=\"a00159.html#ga4b2fa60df3460403817d28b082ee0736\">glm::packUnorm1x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint8 packUnorm1x8(float v)</div><div class=\"ttdoc\">First, converts the normalized floating-point value v into a 8-bit integer value. ...</div></div>\n<div class=\"ttc\" id=\"a00159_html_gac58ee89d0e224bb6df5e8bbb18843a2d\"><div class=\"ttname\"><a href=\"a00159.html#gac58ee89d0e224bb6df5e8bbb18843a2d\">glm::unpackUnorm4x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackUnorm4x4(uint16 p)</div><div class=\"ttdoc\">Convert a packed integer to a normalized floating-point vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga7f9abdb50f9be1aa1c14912504a0d98d\"><div class=\"ttname\"><a href=\"a00159.html#ga7f9abdb50f9be1aa1c14912504a0d98d\">glm::packUnorm2x3_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint8 packUnorm2x3_1x2(vec3 const &amp;v)</div><div class=\"ttdoc\">Convert each component of the normalized floating-point vector into unsigned integer values...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga3f648fc205467792dc6d8c59c748f8a6\"><div class=\"ttname\"><a href=\"a00159.html#ga3f648fc205467792dc6d8c59c748f8a6\">glm::packF3x9_E1x5</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint32 packF3x9_E1x5(vec3 const &amp;v)</div><div class=\"ttdoc\">First, converts the first two components of the normalized floating-point value v into 11-bit signles...</div></div>\n<div class=\"ttc\" id=\"a00159_html_gae3592e0795e62aaa1865b3a10496a7a1\"><div class=\"ttname\"><a href=\"a00159.html#gae3592e0795e62aaa1865b3a10496a7a1\">glm::packSnorm1x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint8 packSnorm1x8(float s)</div><div class=\"ttdoc\">First, converts the normalized floating-point value v into 8-bit integer value. </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4177a44206121dabc8c4ff1c0f544574\"><div class=\"ttname\"><a href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">glm::i8vec4</a></div><div class=\"ttdeci\">highp_i8vec4 i8vec4</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00378\">fwd.hpp:378</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_gaf6dc0e4341810a641c7ed08f10e335d1\"><div class=\"ttname\"><a href=\"a00159.html#gaf6dc0e4341810a641c7ed08f10e335d1\">glm::unpackUint4x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL u8vec4 unpackUint4x8(uint32 p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2a78447eb9d66a114b193f4a25899c16\"><div class=\"ttname\"><a href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">glm::u16vec2</a></div><div class=\"ttdeci\">highp_u16vec2 u16vec2</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01059\">fwd.hpp:1059</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga0466daf4c90f76cc64b3f105ce727295\"><div class=\"ttname\"><a href=\"a00159.html#ga0466daf4c90f76cc64b3f105ce727295\">glm::packRGBM</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt; packRGBM(vec&lt; 3, T, Q &gt; const &amp;rgb)</div><div class=\"ttdoc\">Returns an unsigned integer vector obtained by converting the components of a floating-point vector t...</div></div>\n<div class=\"ttc\" id=\"a00165_html_ga529496d75775fb656a07993ea9af2450\"><div class=\"ttname\"><a href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">glm::u16vec4</a></div><div class=\"ttdeci\">highp_u16vec4 u16vec4</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01067\">fwd.hpp:1067</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga3644163cf3a47bf1d4af1f4b03013a7e\"><div class=\"ttname\"><a href=\"a00159.html#ga3644163cf3a47bf1d4af1f4b03013a7e\">glm::packInt2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL int packInt2x16(i16vec2 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><div class=\"ttname\"><a href=\"a00159.html#ga3e6ac9178b59f0b1b2f7599f2183eb7f\">glm::unpackUnorm</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt; unpackUnorm(vec&lt; L, uintType, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Convert a packed integer to a normalized floating-point vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga5156d3060355fe332865da2c7f78815f\"><div class=\"ttname\"><a href=\"a00159.html#ga5156d3060355fe332865da2c7f78815f\">glm::unpackUnorm3x10_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackUnorm3x10_1x2(uint32 p)</div><div class=\"ttdoc\">First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga2b1fd1e854705b1345e98409e0a25e50\"><div class=\"ttname\"><a href=\"a00159.html#ga2b1fd1e854705b1345e98409e0a25e50\">glm::unpackF2x11_1x10</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec3 unpackF2x11_1x10(uint32 p)</div><div class=\"ttdoc\">First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and ...</div></div>\n<div class=\"ttc\" id=\"a00159_html_gafe2f7b39caf8f5ec555e1c059ec530e6\"><div class=\"ttname\"><a href=\"a00159.html#gafe2f7b39caf8f5ec555e1c059ec530e6\">glm::packHalf4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint64 packHalf4x16(vec4 const &amp;v)</div><div class=\"ttdoc\">Returns an unsigned integer obtained by converting the components of a four-component floating-point ...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga2d8bbce673ebc04831c1fb05c47f5251\"><div class=\"ttname\"><a href=\"a00159.html#ga2d8bbce673ebc04831c1fb05c47f5251\">glm::packHalf</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, uint16, Q &gt; packHalf(vec&lt; L, float, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns an unsigned integer vector obtained by converting the components of a floating-point vector t...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga3c3c9fb53ae7823b10fa083909357590\"><div class=\"ttname\"><a href=\"a00159.html#ga3c3c9fb53ae7823b10fa083909357590\">glm::packUint2x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packUint2x8(u8vec2 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga035bbbeab7ec2b28c0529757395b645b\"><div class=\"ttname\"><a href=\"a00159.html#ga035bbbeab7ec2b28c0529757395b645b\">glm::unpackUint2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL u16vec2 unpackUint2x16(uint p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga9f82737bf2a44bedff1d286b76837886\"><div class=\"ttname\"><a href=\"a00159.html#ga9f82737bf2a44bedff1d286b76837886\">glm::packUnorm1x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packUnorm1x16(float v)</div><div class=\"ttdoc\">First, converts the normalized floating-point value v into a 16-bit integer value. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gab173834ef14cfc23a96a959f3ff4b8dc\"><div class=\"ttname\"><a href=\"a00159.html#gab173834ef14cfc23a96a959f3ff4b8dc\">glm::unpackUint4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL u16vec4 unpackUint4x16(uint64 p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00144_html_gafbab23070ca47932487d25332adc7d7c\"><div class=\"ttname\"><a href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a></div><div class=\"ttdeci\">highp_vec4 vec4</div><div class=\"ttdoc\">4 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00467\">type_vec.hpp:467</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga6d49b31e5c3f9df8e1f99ab62b999482\"><div class=\"ttname\"><a href=\"a00159.html#ga6d49b31e5c3f9df8e1f99ab62b999482\">glm::unpackSnorm</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt; unpackSnorm(vec&lt; L, intType, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Convert a packed integer to a normalized floating-point vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga57dfc41b2eb20b0ac00efae7d9c49dcd\"><div class=\"ttname\"><a href=\"a00159.html#ga57dfc41b2eb20b0ac00efae7d9c49dcd\">glm::unpackHalf4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackHalf4x16(uint64 p)</div><div class=\"ttdoc\">Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigne...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga9a05330e5490be0908d3b117d82aff56\"><div class=\"ttname\"><a href=\"a00159.html#ga9a05330e5490be0908d3b117d82aff56\">glm::unpackI3x10_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL ivec4 unpackI3x10_1x2(uint32 p)</div><div class=\"ttdoc\">Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers...</div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2996630ba7b10535af8e065cf326f761\"><div class=\"ttname\"><a href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">glm::i16vec2</a></div><div class=\"ttdeci\">highp_i16vec2 i16vec2</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00450\">fwd.hpp:450</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_gac37dedaba24b00adb4ec6e8f92c19dbf\"><div class=\"ttname\"><a href=\"a00159.html#gac37dedaba24b00adb4ec6e8f92c19dbf\">glm::unpackHalf1x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL float unpackHalf1x16(uint16 v)</div><div class=\"ttdoc\">Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into ...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga4851ff86678aa1c7ace9d67846894285\"><div class=\"ttname\"><a href=\"a00159.html#ga4851ff86678aa1c7ace9d67846894285\">glm::unpackSnorm1x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL float unpackSnorm1x8(uint8 p)</div><div class=\"ttdoc\">First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga5eecc9e8cbaf51ac6cf57501e670ee19\"><div class=\"ttname\"><a href=\"a00159.html#ga5eecc9e8cbaf51ac6cf57501e670ee19\">glm::packUint2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint packUint2x16(u16vec2 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga48df3042a7d079767f5891a1bfd8a60a\"><div class=\"ttname\"><a href=\"a00159.html#ga48df3042a7d079767f5891a1bfd8a60a\">glm::unpackU3x10_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uvec4 unpackU3x10_1x2(uint32 p)</div><div class=\"ttdoc\">Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga43f2093b6ff192a79058ff7834fc3528\"><div class=\"ttname\"><a href=\"a00159.html#ga43f2093b6ff192a79058ff7834fc3528\">glm::packHalf1x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packHalf1x16(float v)</div><div class=\"ttdoc\">Returns an unsigned integer obtained by converting the components of a floating-point scalar to the 1...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga52c154a9b232b62c22517a700cc0c78c\"><div class=\"ttname\"><a href=\"a00159.html#ga52c154a9b232b62c22517a700cc0c78c\">glm::unpackInt4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL i16vec4 unpackInt4x16(int64 p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gab0c59f1e259fca9e68adb2207a6b665e\"><div class=\"ttname\"><a href=\"a00159.html#gab0c59f1e259fca9e68adb2207a6b665e\">glm::unpackInt2x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL i8vec2 unpackInt2x8(int16 p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gaa54b5855a750d6aeb12c1c902f5939b8\"><div class=\"ttname\"><a href=\"a00159.html#gaa54b5855a750d6aeb12c1c902f5939b8\">glm::packSnorm</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, intType, Q &gt; packSnorm(vec&lt; L, floatType, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Convert each component of the normalized floating-point vector into signed integer values...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga30d6b2f1806315bcd6047131f547d33b\"><div class=\"ttname\"><a href=\"a00159.html#ga30d6b2f1806315bcd6047131f547d33b\">glm::unpackHalf</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, float, Q &gt; unpackHalf(vec&lt; L, uint16, Q &gt; const &amp;p)</div><div class=\"ttdoc\">Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bi...</div></div>\n<div class=\"ttc\" id=\"a00159_html_gab9e60ebe3ad3eeced6a9ec6eb876d74e\"><div class=\"ttname\"><a href=\"a00159.html#gab9e60ebe3ad3eeced6a9ec6eb876d74e\">glm::unpackF3x9_E1x5</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec3 unpackF3x9_E1x5(uint32 p)</div><div class=\"ttdoc\">First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and ...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga2ae149c5d2473ac1e5f347bb654a242d\"><div class=\"ttname\"><a href=\"a00159.html#ga2ae149c5d2473ac1e5f347bb654a242d\">glm::unpackUnorm4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackUnorm4x16(uint64 p)</div><div class=\"ttdoc\">First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers. </div></div>\n<div class=\"ttc\" id=\"a00117_html\"><div class=\"ttname\"><a href=\"a00117.html\">type_precision.hpp</a></div><div class=\"ttdoc\">GLM_GTC_type_precision </div></div>\n<div class=\"ttc\" id=\"a00159_html_gab297c0bfd38433524791eb0584d8f08d\"><div class=\"ttname\"><a href=\"a00159.html#gab297c0bfd38433524791eb0584d8f08d\">glm::unpackInt2x32</a></div><div class=\"ttdeci\">GLM_FUNC_DECL i32vec2 unpackInt2x32(int64 p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga5ff95ff5bc16f396432ab67243dbae4d\"><div class=\"ttname\"><a href=\"a00159.html#ga5ff95ff5bc16f396432ab67243dbae4d\">glm::unpackUnorm3x5_1x1</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackUnorm3x5_1x1(uint16 p)</div><div class=\"ttdoc\">Convert a packed integer to a normalized floating-point vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gab6bbd5be3b8e6db538ecb33a7844481c\"><div class=\"ttname\"><a href=\"a00159.html#gab6bbd5be3b8e6db538ecb33a7844481c\">glm::packUnorm2x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint8 packUnorm2x4(vec2 const &amp;v)</div><div class=\"ttdoc\">Convert each component of the normalized floating-point vector into unsigned integer values...</div></div>\n<div class=\"ttc\" id=\"a00165_html_ga20779a61de2fd526a17f12fe53ec46b1\"><div class=\"ttname\"><a href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">glm::u8vec4</a></div><div class=\"ttdeci\">highp_u8vec4 u8vec4</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00987\">fwd.hpp:987</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga5c1ec97894b05ea21a05aea4f0204a02\"><div class=\"ttname\"><a href=\"a00159.html#ga5c1ec97894b05ea21a05aea4f0204a02\">glm::unpackRGBM</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; unpackRGBM(vec&lt; 4, T, Q &gt; const &amp;rgbm)</div><div class=\"ttdoc\">Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bi...</div></div>\n<div class=\"ttc\" id=\"a00159_html_gaaddf9c353528fe896106f7181219c7f4\"><div class=\"ttname\"><a href=\"a00159.html#gaaddf9c353528fe896106f7181219c7f4\">glm::unpackSnorm4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackSnorm4x16(uint64 p)</div><div class=\"ttdoc\">First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga6be3cfb2cce3702f03e91bbeb5286d7e\"><div class=\"ttname\"><a href=\"a00159.html#ga6be3cfb2cce3702f03e91bbeb5286d7e\">glm::packSnorm2x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packSnorm2x8(vec2 const &amp;v)</div><div class=\"ttdoc\">First, converts each component of the normalized floating-point value v into 8-bit integer values...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga83d34160a5cb7bcb5339823210fc7501\"><div class=\"ttname\"><a href=\"a00159.html#ga83d34160a5cb7bcb5339823210fc7501\">glm::unpackUnorm1x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL float unpackUnorm1x16(uint16 p)</div><div class=\"ttdoc\">First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga1f63c264e7ab63264e2b2a99fd393897\"><div class=\"ttname\"><a href=\"a00159.html#ga1f63c264e7ab63264e2b2a99fd393897\">glm::packUnorm4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint64 packUnorm4x16(vec4 const &amp;v)</div><div class=\"ttdoc\">First, converts each component of the normalized floating-point value v into 16-bit integer values...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga9a666b1c688ab54100061ed06526de6e\"><div class=\"ttname\"><a href=\"a00159.html#ga9a666b1c688ab54100061ed06526de6e\">glm::packUnorm2x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packUnorm2x8(vec2 const &amp;v)</div><div class=\"ttdoc\">First, converts each component of the normalized floating-point value v into 8-bit integer values...</div></div>\n<div class=\"ttc\" id=\"a00144_html_gaa8ea2429bb3cb41a715258a447f39897\"><div class=\"ttname\"><a href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">glm::vec3</a></div><div class=\"ttdeci\">highp_vec3 vec3</div><div class=\"ttdoc\">3 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00462\">type_vec.hpp:462</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga96dd15002370627a443c835ab03a766c\"><div class=\"ttname\"><a href=\"a00159.html#ga96dd15002370627a443c835ab03a766c\">glm::unpackSnorm1x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL float unpackSnorm1x16(uint16 p)</div><div class=\"ttdoc\">First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers. </div></div>\n<div class=\"ttc\" id=\"a00144_html_gaa7c3a0e7ae50c34c3290415c115f251e\"><div class=\"ttname\"><a href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">glm::uvec4</a></div><div class=\"ttdeci\">highp_uvec4 uvec4</div><div class=\"ttdoc\">4 components vector of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00548\">type_vec.hpp:548</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_gaa864081097b86e83d8e4a4d79c382b22\"><div class=\"ttname\"><a href=\"a00159.html#gaa864081097b86e83d8e4a4d79c382b22\">glm::packUint2x32</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint64 packUint2x32(u32vec2 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gaec4112086d7fb133bea104a7c237de52\"><div class=\"ttname\"><a href=\"a00159.html#gaec4112086d7fb133bea104a7c237de52\">glm::packUnorm3x5_1x1</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packUnorm3x5_1x1(vec4 const &amp;v)</div><div class=\"ttdoc\">Convert each component of the normalized floating-point vector into unsigned integer values...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga1319207e30874fb4931a9ee913983ee1\"><div class=\"ttname\"><a href=\"a00159.html#ga1319207e30874fb4931a9ee913983ee1\">glm::unpackUnorm1x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL float unpackUnorm1x8(uint8 p)</div><div class=\"ttdoc\">Convert a single 8-bit integer to a normalized floating-point value. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gad3e7e3ce521513584a53aedc5f9765c1\"><div class=\"ttname\"><a href=\"a00159.html#gad3e7e3ce521513584a53aedc5f9765c1\">glm::packUnorm4x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packUnorm4x4(vec4 const &amp;v)</div><div class=\"ttdoc\">Convert each component of the normalized floating-point vector into unsigned integer values...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga1989f093a27ae69cf9207145be48b3d7\"><div class=\"ttname\"><a href=\"a00159.html#ga1989f093a27ae69cf9207145be48b3d7\">glm::packInt4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL int64 packInt4x16(i16vec4 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gaa0fe2f09aeb403cd66c1a062f58861ab\"><div class=\"ttname\"><a href=\"a00159.html#gaa0fe2f09aeb403cd66c1a062f58861ab\">glm::packUint4x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint32 packUint4x8(u8vec4 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00165_html_gad06935764d78f43f9d542c784c2212ec\"><div class=\"ttname\"><a href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">glm::i8vec2</a></div><div class=\"ttdeci\">highp_i8vec2 i8vec2</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00370\">fwd.hpp:370</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_gab997545661877d2c7362a5084d3897d3\"><div class=\"ttname\"><a href=\"a00159.html#gab997545661877d2c7362a5084d3897d3\">glm::packSnorm3x10_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const &amp;v)</div><div class=\"ttdoc\">First, converts the first three components of the normalized floating-point value v into 10-bit signe...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga8b128e89be449fc71336968a66bf6e1a\"><div class=\"ttname\"><a href=\"a00159.html#ga8b128e89be449fc71336968a66bf6e1a\">glm::unpackSnorm2x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec2 unpackSnorm2x8(uint16 p)</div><div class=\"ttdoc\">First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers. </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga550831bfc26d1e0101c1cb3d79938c06\"><div class=\"ttname\"><a href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">glm::i16vec4</a></div><div class=\"ttdeci\">highp_i16vec4 i16vec4</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00458\">fwd.hpp:458</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga1cd8d2038cdd33a860801aa155a26221\"><div class=\"ttname\"><a href=\"a00159.html#ga1cd8d2038cdd33a860801aa155a26221\">glm::unpackInt4x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL i8vec4 unpackInt4x8(int32 p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><div class=\"ttname\"><a href=\"a00159.html#gaccd3f27e6ba5163eb7aa9bc8ff96251a\">glm::packUnorm</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, uintType, Q &gt; packUnorm(vec&lt; L, floatType, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Convert each component of the normalized floating-point vector into unsigned integer values...</div></div>\n<div class=\"ttc\" id=\"a00159_html_ga6abd5a9014df3b5ce4059008d2491260\"><div class=\"ttname\"><a href=\"a00159.html#ga6abd5a9014df3b5ce4059008d2491260\">glm::unpackUnorm2x3_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec3 unpackUnorm2x3_1x2(uint8 p)</div><div class=\"ttdoc\">Convert a packed integer to a normalized floating-point vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga768e0337dd6246773f14aa0a421fe9a8\"><div class=\"ttname\"><a href=\"a00159.html#ga768e0337dd6246773f14aa0a421fe9a8\">glm::packUnorm1x5_1x6_1x5</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packUnorm1x5_1x6_1x5(vec3 const &amp;v)</div><div class=\"ttdoc\">Convert each component of the normalized floating-point vector into unsigned integer values...</div></div>\n<div class=\"ttc\" id=\"a00159_html_gaf2238401d5ce2aaade1a44ba19709072\"><div class=\"ttname\"><a href=\"a00159.html#gaf2238401d5ce2aaade1a44ba19709072\">glm::packInt4x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL int32 packInt4x8(i8vec4 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga518b8d948a6b4ddb72f84d5c3b7b6611\"><div class=\"ttname\"><a href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">glm::u8vec2</a></div><div class=\"ttdeci\">highp_u8vec2 u8vec2</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00979\">fwd.hpp:979</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_gad1e4c8a9e67d86b61a6eec86703a827a\"><div class=\"ttname\"><a href=\"a00159.html#gad1e4c8a9e67d86b61a6eec86703a827a\">glm::packInt2x32</a></div><div class=\"ttdeci\">GLM_FUNC_DECL int64 packInt2x32(i32vec2 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga06ecb6afb902dba45419008171db9023\"><div class=\"ttname\"><a href=\"a00159.html#ga06ecb6afb902dba45419008171db9023\">glm::packI3x10_1x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const &amp;v)</div><div class=\"ttdoc\">Returns an unsigned integer obtained by converting the components of a four-component signed integer ...</div></div>\n<div class=\"ttc\" id=\"a00159_html_gaf942ff11b65e83eb5f77e68329ebc6ab\"><div class=\"ttname\"><a href=\"a00159.html#gaf942ff11b65e83eb5f77e68329ebc6ab\">glm::unpackUint2x32</a></div><div class=\"ttdeci\">GLM_FUNC_DECL u32vec2 unpackUint2x32(uint64 p)</div><div class=\"ttdoc\">Convert a packed integer into an integer vector. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga358943934d21da947d5bcc88c2ab7832\"><div class=\"ttname\"><a href=\"a00159.html#ga358943934d21da947d5bcc88c2ab7832\">glm::packSnorm4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint64 packSnorm4x16(vec4 const &amp;v)</div><div class=\"ttdoc\">First, converts each component of the normalized floating-point value v into 16-bit integer values...</div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2a266e46ee218d0c680f12b35c500cc0\"><div class=\"ttname\"><a href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">glm::u32vec2</a></div><div class=\"ttdeci\">highp_u32vec2 u32vec2</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01138\">fwd.hpp:1138</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_ga2ceb62cca347d8ace42ee90317a3f1f9\"><div class=\"ttname\"><a href=\"a00159.html#ga2ceb62cca347d8ace42ee90317a3f1f9\">glm::packUint4x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint64 packUint4x16(u16vec4 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8b44026374982dcd1e52d22bac99247e\"><div class=\"ttname\"><a href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">glm::i32vec2</a></div><div class=\"ttdeci\">highp_i32vec2 i32vec2</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00529\">fwd.hpp:529</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_gab22f8bcfdb5fc65af4701b25f143c1af\"><div class=\"ttname\"><a href=\"a00159.html#gab22f8bcfdb5fc65af4701b25f143c1af\">glm::packSnorm1x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint16 packSnorm1x16(float v)</div><div class=\"ttdoc\">First, converts the normalized floating-point value v into 16-bit integer value. </div></div>\n<div class=\"ttc\" id=\"a00159_html_ga8884b1f2292414f36d59ef3be5d62914\"><div class=\"ttname\"><a href=\"a00159.html#ga8884b1f2292414f36d59ef3be5d62914\">glm::packInt2x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL int16 packInt2x8(i8vec2 const &amp;v)</div><div class=\"ttdoc\">Convert each component from an integer vector into a packed unsigned integer. </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga91ad9478d81a7aaf2593e8d9c3d06a14\"><div class=\"ttname\"><a href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">glm::uint</a></div><div class=\"ttdeci\">unsigned int uint</div><div class=\"ttdoc\">Unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00288\">type_int.hpp:288</a></div></div>\n<div class=\"ttc\" id=\"a00159_html_gab3bc08ecfc0f3339be93fb2b3b56d88a\"><div class=\"ttname\"><a href=\"a00159.html#gab3bc08ecfc0f3339be93fb2b3b56d88a\">glm::unpackUnorm1x5_1x6_1x5</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec3 unpackUnorm1x5_1x6_1x5(uint16 p)</div><div class=\"ttdoc\">Convert a packed integer to a normalized floating-point vector. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00077.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: packing.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">packing.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00077_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaa916ca426b2bb0343ba17e3753e245c2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL double&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#gaa916ca426b2bb0343ba17e3753e245c2\">packDouble2x32</a> (uvec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa916ca426b2bb0343ba17e3753e245c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a double-qualifier value obtained by packing the components of v into a 64-bit value.  <a href=\"a00231.html#gaa916ca426b2bb0343ba17e3753e245c2\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa916ca426b2bb0343ba17e3753e245c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20f134b07db3a3d3a38efb2617388c92\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga20f134b07db3a3d3a38efb2617388c92\">packHalf2x16</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga20f134b07db3a3d3a38efb2617388c92\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#ga20f134b07db3a3d3a38efb2617388c92\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20f134b07db3a3d3a38efb2617388c92\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga977ab172da5494e5ac63e952afacfbe2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga977ab172da5494e5ac63e952afacfbe2\">packSnorm2x16</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga977ab172da5494e5ac63e952afacfbe2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.  <a href=\"a00231.html#ga977ab172da5494e5ac63e952afacfbe2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga977ab172da5494e5ac63e952afacfbe2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85e8f17627516445026ab7a9c2e3531a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga85e8f17627516445026ab7a9c2e3531a\">packSnorm4x8</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga85e8f17627516445026ab7a9c2e3531a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.  <a href=\"a00231.html#ga85e8f17627516445026ab7a9c2e3531a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85e8f17627516445026ab7a9c2e3531a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0e2d107039fe608a209497af867b85fb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga0e2d107039fe608a209497af867b85fb\">packUnorm2x16</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga0e2d107039fe608a209497af867b85fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.  <a href=\"a00231.html#ga0e2d107039fe608a209497af867b85fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0e2d107039fe608a209497af867b85fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf7d2f7341a9eeb4a436929d6f9ad08f2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#gaf7d2f7341a9eeb4a436929d6f9ad08f2\">packUnorm4x8</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf7d2f7341a9eeb4a436929d6f9ad08f2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.  <a href=\"a00231.html#gaf7d2f7341a9eeb4a436929d6f9ad08f2\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf7d2f7341a9eeb4a436929d6f9ad08f2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f4296dc5f12f0aa67ac05b8bb322483\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga5f4296dc5f12f0aa67ac05b8bb322483\">unpackDouble2x32</a> (double v)</td></tr>\n<tr class=\"memdesc:ga5f4296dc5f12f0aa67ac05b8bb322483\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a two-component unsigned integer vector representation of v.  <a href=\"a00231.html#ga5f4296dc5f12f0aa67ac05b8bb322483\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f4296dc5f12f0aa67ac05b8bb322483\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf59b52e6b28da9335322c4ae19b5d745\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#gaf59b52e6b28da9335322c4ae19b5d745\">unpackHalf2x16</a> (uint v)</td></tr>\n<tr class=\"memdesc:gaf59b52e6b28da9335322c4ae19b5d745\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#gaf59b52e6b28da9335322c4ae19b5d745\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf59b52e6b28da9335322c4ae19b5d745\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacd8f8971a3fe28418be0d0fa1f786b38\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#gacd8f8971a3fe28418be0d0fa1f786b38\">unpackSnorm2x16</a> (uint p)</td></tr>\n<tr class=\"memdesc:gacd8f8971a3fe28418be0d0fa1f786b38\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#gacd8f8971a3fe28418be0d0fa1f786b38\">More...</a><br /></td></tr>\n<tr class=\"separator:gacd8f8971a3fe28418be0d0fa1f786b38\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2db488646d48b7c43d3218954523fe82\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga2db488646d48b7c43d3218954523fe82\">unpackSnorm4x8</a> (uint p)</td></tr>\n<tr class=\"memdesc:ga2db488646d48b7c43d3218954523fe82\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#ga2db488646d48b7c43d3218954523fe82\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2db488646d48b7c43d3218954523fe82\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f66188e5d65afeb9ffba1ad971e4007\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga1f66188e5d65afeb9ffba1ad971e4007\">unpackUnorm2x16</a> (uint p)</td></tr>\n<tr class=\"memdesc:ga1f66188e5d65afeb9ffba1ad971e4007\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#ga1f66188e5d65afeb9ffba1ad971e4007\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f66188e5d65afeb9ffba1ad971e4007\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f903259150b67e9466f5f8edffcd197\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga7f903259150b67e9466f5f8edffcd197\">unpackUnorm4x8</a> (uint p)</td></tr>\n<tr class=\"memdesc:ga7f903259150b67e9466f5f8edffcd197\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#ga7f903259150b67e9466f5f8edffcd197\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f903259150b67e9466f5f8edffcd197\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><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> </dd>\n<dd>\n<a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00077_source.html\">packing.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00077_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: packing.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">packing.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00077.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">detail/type_vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">detail/type_vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00231.html#ga0e2d107039fe608a209497af867b85fb\">packUnorm2x16</a>(<a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00231.html#ga977ab172da5494e5ac63e952afacfbe2\">packSnorm2x16</a>(<a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00231.html#gaf7d2f7341a9eeb4a436929d6f9ad08f2\">packUnorm4x8</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00231.html#ga85e8f17627516445026ab7a9c2e3531a\">packSnorm4x8</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <a class=\"code\" href=\"a00231.html#ga1f66188e5d65afeb9ffba1ad971e4007\">unpackUnorm2x16</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> p);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <a class=\"code\" href=\"a00231.html#gacd8f8971a3fe28418be0d0fa1f786b38\">unpackSnorm2x16</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> p);</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00231.html#ga7f903259150b67e9466f5f8edffcd197\">unpackUnorm4x8</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> p);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> <a class=\"code\" href=\"a00231.html#ga2db488646d48b7c43d3218954523fe82\">unpackSnorm4x8</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> p);</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">double</span> <a class=\"code\" href=\"a00231.html#gaa916ca426b2bb0343ba17e3753e245c2\">packDouble2x32</a>(<a class=\"code\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a> <a class=\"code\" href=\"a00231.html#ga5f4296dc5f12f0aa67ac05b8bb322483\">unpackDouble2x32</a>(<span class=\"keywordtype\">double</span> v);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00231.html#ga20f134b07db3a3d3a38efb2617388c92\">packHalf2x16</a>(<a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> <a class=\"code\" href=\"a00231.html#gaf59b52e6b28da9335322c4ae19b5d745\">unpackHalf2x16</a>(<a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> v);</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;<span class=\"preprocessor\">#include &quot;detail/func_packing.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00231_html_ga7f903259150b67e9466f5f8edffcd197\"><div class=\"ttname\"><a href=\"a00231.html#ga7f903259150b67e9466f5f8edffcd197\">glm::unpackUnorm4x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackUnorm4x8(uint p)</div><div class=\"ttdoc\">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. </div></div>\n<div class=\"ttc\" id=\"a00144_html_ga09d0200e8ff86391d8804b4fefd5f1da\"><div class=\"ttname\"><a href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">glm::vec2</a></div><div class=\"ttdeci\">highp_vec2 vec2</div><div class=\"ttdoc\">2 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00457\">type_vec.hpp:457</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00231_html_gacd8f8971a3fe28418be0d0fa1f786b38\"><div class=\"ttname\"><a href=\"a00231.html#gacd8f8971a3fe28418be0d0fa1f786b38\">glm::unpackSnorm2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec2 unpackSnorm2x16(uint p)</div><div class=\"ttdoc\">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. </div></div>\n<div class=\"ttc\" id=\"a00231_html_gaf7d2f7341a9eeb4a436929d6f9ad08f2\"><div class=\"ttname\"><a href=\"a00231.html#gaf7d2f7341a9eeb4a436929d6f9ad08f2\">glm::packUnorm4x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint packUnorm4x8(vec4 const &amp;v)</div><div class=\"ttdoc\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer val...</div></div>\n<div class=\"ttc\" id=\"a00144_html_gafbab23070ca47932487d25332adc7d7c\"><div class=\"ttname\"><a href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a></div><div class=\"ttdeci\">highp_vec4 vec4</div><div class=\"ttdoc\">4 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00467\">type_vec.hpp:467</a></div></div>\n<div class=\"ttc\" id=\"a00231_html_ga5f4296dc5f12f0aa67ac05b8bb322483\"><div class=\"ttname\"><a href=\"a00231.html#ga5f4296dc5f12f0aa67ac05b8bb322483\">glm::unpackDouble2x32</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uvec2 unpackDouble2x32(double v)</div><div class=\"ttdoc\">Returns a two-component unsigned integer vector representation of v. </div></div>\n<div class=\"ttc\" id=\"a00231_html_ga20f134b07db3a3d3a38efb2617388c92\"><div class=\"ttname\"><a href=\"a00231.html#ga20f134b07db3a3d3a38efb2617388c92\">glm::packHalf2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint packHalf2x16(vec2 const &amp;v)</div><div class=\"ttdoc\">Returns an unsigned integer obtained by converting the components of a two-component floating-point v...</div></div>\n<div class=\"ttc\" id=\"a00231_html_ga85e8f17627516445026ab7a9c2e3531a\"><div class=\"ttname\"><a href=\"a00231.html#ga85e8f17627516445026ab7a9c2e3531a\">glm::packSnorm4x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint packSnorm4x8(vec4 const &amp;v)</div><div class=\"ttdoc\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer val...</div></div>\n<div class=\"ttc\" id=\"a00231_html_gaa916ca426b2bb0343ba17e3753e245c2\"><div class=\"ttname\"><a href=\"a00231.html#gaa916ca426b2bb0343ba17e3753e245c2\">glm::packDouble2x32</a></div><div class=\"ttdeci\">GLM_FUNC_DECL double packDouble2x32(uvec2 const &amp;v)</div><div class=\"ttdoc\">Returns a double-qualifier value obtained by packing the components of v into a 64-bit value...</div></div>\n<div class=\"ttc\" id=\"a00231_html_ga2db488646d48b7c43d3218954523fe82\"><div class=\"ttname\"><a href=\"a00231.html#ga2db488646d48b7c43d3218954523fe82\">glm::unpackSnorm4x8</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec4 unpackSnorm4x8(uint p)</div><div class=\"ttdoc\">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. </div></div>\n<div class=\"ttc\" id=\"a00231_html_gaf59b52e6b28da9335322c4ae19b5d745\"><div class=\"ttname\"><a href=\"a00231.html#gaf59b52e6b28da9335322c4ae19b5d745\">glm::unpackHalf2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec2 unpackHalf2x16(uint v)</div><div class=\"ttdoc\">Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned...</div></div>\n<div class=\"ttc\" id=\"a00231_html_ga1f66188e5d65afeb9ffba1ad971e4007\"><div class=\"ttname\"><a href=\"a00231.html#ga1f66188e5d65afeb9ffba1ad971e4007\">glm::unpackUnorm2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec2 unpackUnorm2x16(uint p)</div><div class=\"ttdoc\">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. </div></div>\n<div class=\"ttc\" id=\"a00144_html_ga9bcffa2d49f28d16f680757b5c0e7c84\"><div class=\"ttname\"><a href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">glm::uvec2</a></div><div class=\"ttdeci\">highp_uvec2 uvec2</div><div class=\"ttdoc\">2 components vector of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00538\">type_vec.hpp:538</a></div></div>\n<div class=\"ttc\" id=\"a00231_html_ga977ab172da5494e5ac63e952afacfbe2\"><div class=\"ttname\"><a href=\"a00231.html#ga977ab172da5494e5ac63e952afacfbe2\">glm::packSnorm2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint packSnorm2x16(vec2 const &amp;v)</div><div class=\"ttdoc\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer val...</div></div>\n<div class=\"ttc\" id=\"a00145_html_ga91ad9478d81a7aaf2593e8d9c3d06a14\"><div class=\"ttname\"><a href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">glm::uint</a></div><div class=\"ttdeci\">unsigned int uint</div><div class=\"ttdoc\">Unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00288\">type_int.hpp:288</a></div></div>\n<div class=\"ttc\" id=\"a00231_html_ga0e2d107039fe608a209497af867b85fb\"><div class=\"ttname\"><a href=\"a00231.html#ga0e2d107039fe608a209497af867b85fb\">glm::packUnorm2x16</a></div><div class=\"ttdeci\">GLM_FUNC_DECL uint packUnorm2x16(vec2 const &amp;v)</div><div class=\"ttdoc\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer val...</div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00078.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: perpendicular.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">perpendicular.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00208.html\">GLM_GTX_perpendicular</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00078_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00208.html#ga264cfc4e180cf9b852e943b35089003c\">perp</a> (genType const &amp;x, genType const &amp;Normal)</td></tr>\n<tr class=\"memdesc:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Projects x a perpendicular axis of Normal.  <a href=\"a00208.html#ga264cfc4e180cf9b852e943b35089003c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00208.html\">GLM_GTX_perpendicular</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00142.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00210.html\" title=\"Include <glm/gtx/projection.hpp> to use the features of this extension. \">GLM_GTX_projection</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00078_source.html\">perpendicular.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00078_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: pages.doxy Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_48eca2e6cf73effdec262031e861eeb0.html\">doc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">pages.doxy</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"fragment\"></div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00079.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: perpendicular.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">perpendicular.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00209.html\">GLM_GTX_perpendicular</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00079_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00209.html#ga264cfc4e180cf9b852e943b35089003c\">perp</a> (genType const &amp;x, genType const &amp;Normal)</td></tr>\n<tr class=\"memdesc:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Projects x a perpendicular axis of Normal.  <a href=\"a00209.html#ga264cfc4e180cf9b852e943b35089003c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00209.html\">GLM_GTX_perpendicular</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00211.html\" title=\"Include <glm/gtx/projection.hpp> to use the features of this extension. \">GLM_GTX_projection</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00079_source.html\">perpendicular.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00079_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: perpendicular.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">perpendicular.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00079.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/projection.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_perpendicular is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_perpendicular extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00209.html#ga264cfc4e180cf9b852e943b35089003c\">perp</a>(genType <span class=\"keyword\">const</span>&amp; x, genType <span class=\"keyword\">const</span>&amp; Normal);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#include &quot;perpendicular.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00209_html_ga264cfc4e180cf9b852e943b35089003c\"><div class=\"ttname\"><a href=\"a00209.html#ga264cfc4e180cf9b852e943b35089003c\">glm::perp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType perp(genType const &amp;x, genType const &amp;Normal)</div><div class=\"ttdoc\">Projects x a perpendicular axis of Normal. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00080.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: polar_coordinates.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">polar_coordinates.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00210.html\">GLM_GTX_polar_coordinates</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00080_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga1821d5b3324201e60a9e2823d0b5d0c8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1821d5b3324201e60a9e2823d0b5d0c8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8\">euclidean</a> (vec&lt; 2, T, Q &gt; const &amp;polar)</td></tr>\n<tr class=\"memdesc:ga1821d5b3324201e60a9e2823d0b5d0c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert Polar to Euclidean coordinates.  <a href=\"a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1821d5b3324201e60a9e2823d0b5d0c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab83ac2c0e55b684b06b6c46c28b1590d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab83ac2c0e55b684b06b6c46c28b1590d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d\">polar</a> (vec&lt; 3, T, Q &gt; const &amp;euclidean)</td></tr>\n<tr class=\"memdesc:gab83ac2c0e55b684b06b6c46c28b1590d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude.  <a href=\"a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d\">More...</a><br /></td></tr>\n<tr class=\"separator:gab83ac2c0e55b684b06b6c46c28b1590d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00210.html\">GLM_GTX_polar_coordinates</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00080_source.html\">polar_coordinates.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00080_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: polar_coordinates.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">polar_coordinates.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00080.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_polar_coordinates is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_polar_coordinates extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d\">polar</a>(</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8\">euclidean</a>);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8\">euclidean</a>(</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d\">polar</a>);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"preprocessor\">#include &quot;polar_coordinates.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00210_html_gab83ac2c0e55b684b06b6c46c28b1590d\"><div class=\"ttname\"><a href=\"a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d\">glm::polar</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; polar(vec&lt; 3, T, Q &gt; const &amp;euclidean)</div><div class=\"ttdoc\">Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude...</div></div>\n<div class=\"ttc\" id=\"a00210_html_ga1821d5b3324201e60a9e2823d0b5d0c8\"><div class=\"ttname\"><a href=\"a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8\">glm::euclidean</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; euclidean(vec&lt; 2, T, Q &gt; const &amp;polar)</div><div class=\"ttdoc\">Convert Polar to Euclidean coordinates. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00081.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: projection.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">projection.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00211.html\">GLM_GTX_projection</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00081_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga58384b7170801dd513de46f87c7fb00e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga58384b7170801dd513de46f87c7fb00e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">proj</a> (genType const &amp;x, genType const &amp;Normal)</td></tr>\n<tr class=\"memdesc:ga58384b7170801dd513de46f87c7fb00e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Projects x on Normal.  <a href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga58384b7170801dd513de46f87c7fb00e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00211.html\">GLM_GTX_projection</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00081_source.html\">projection.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00081_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: projection.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">projection.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00081.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../geometric.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_projection is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_projection extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">proj</a>(genType <span class=\"keyword\">const</span>&amp; x, genType <span class=\"keyword\">const</span>&amp; Normal);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">#include &quot;projection.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00211_html_ga58384b7170801dd513de46f87c7fb00e\"><div class=\"ttname\"><a href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">glm::proj</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType proj(genType const &amp;x, genType const &amp;Normal)</div><div class=\"ttdoc\">Projects x on Normal. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00082.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: qualifier.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#enum-members\">Enumerations</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">qualifier.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00082_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"enum-members\"></a>\nEnumerations</h2></td></tr>\n<tr class=\"memitem:a0bc7635511f4d420057d709a9bcc0c4d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"a0bc7635511f4d420057d709a9bcc0c4d\"></a>enum &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>qualifier</b> { <br />\n&#160;&#160;<b>packed_highp</b>, \n<b>packed_mediump</b>, \n<b>packed_lowp</b>, \n<b>highp</b> = packed_highp, \n<br />\n&#160;&#160;<b>mediump</b> = packed_mediump, \n<b>lowp</b> = packed_lowp, \n<b>packed</b> = packed_highp\n<br />\n }<tr class=\"memdesc:a0bc7635511f4d420057d709a9bcc0c4d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Qualify GLM types in term of alignment (packed, aligned) and precision in term of ULPs (lowp, mediump, highp) <br /></td></tr>\n<tr class=\"separator:a0bc7635511f4d420057d709a9bcc0c4d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00082_source.html\">qualifier.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00082_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: qualifier.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">qualifier.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00082.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;        <span class=\"keyword\">enum</span> qualifier</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;                packed_highp, </div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;                packed_mediump, </div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;                packed_lowp, </div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                        aligned_highp, </div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                        aligned_mediump, </div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                        aligned_lowp, <span class=\"comment\">// ///&lt; Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs to maximize performance</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                        aligned = aligned_highp, </div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                highp = packed_highp, </div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                mediump = packed_mediump, </div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;                lowp = packed_lowp, </div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                packed = packed_highp, </div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_ALIGNED_TYPE &amp;&amp; defined(GLM_FORCE_ALIGNED)</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                        defaultp = aligned_highp</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;                        defaultp = highp</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">struct </span>vec;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">struct </span>mat;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">template</span>&lt;glm::qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        <span class=\"keyword\">struct </span>is_aligned</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"keywordtype\">bool</span> value = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#       if GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                <span class=\"keyword\">struct </span>is_aligned&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::aligned_lowp&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                        <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"keywordtype\">bool</span> value = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                <span class=\"keyword\">struct </span>is_aligned&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::aligned_mediump&gt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                        <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"keywordtype\">bool</span> value = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                <span class=\"keyword\">struct </span>is_aligned&lt;<a class=\"code\" href=\"a00135.html\">glm</a>::aligned_highp&gt;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                        <span class=\"keyword\">static</span> <span class=\"keyword\">const</span> <span class=\"keywordtype\">bool</span> value = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00083.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: quaternion.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/quaternion.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00160.html\">GLM_GTC_quaternion</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00083_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaaee6c856cae3217d274a240238cb6373\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaaee6c856cae3217d274a240238cb6373\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaaee6c856cae3217d274a240238cb6373\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the quaternion rotation angle.  <a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaee6c856cae3217d274a240238cb6373\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga93856b8bfcdd5b9a164248df3149476c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga93856b8bfcdd5b9a164248df3149476c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga93856b8bfcdd5b9a164248df3149476c\">angleAxis</a> (T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:ga93856b8bfcdd5b9a164248df3149476c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a quaternion from an angle and a normalized axis.  <a href=\"a00160.html#ga93856b8bfcdd5b9a164248df3149476c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga93856b8bfcdd5b9a164248df3149476c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaf2707d3081789ce097daaa6e54d5287\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaaf2707d3081789ce097daaa6e54d5287\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaaf2707d3081789ce097daaa6e54d5287\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the q rotation axis.  <a href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaf2707d3081789ce097daaa6e54d5287\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac40833db608deda477f018767b9a1cad\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac40833db608deda477f018767b9a1cad\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gac40833db608deda477f018767b9a1cad\">conjugate</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gac40833db608deda477f018767b9a1cad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the q conjugate.  <a href=\"a00160.html#gac40833db608deda477f018767b9a1cad\">More...</a><br /></td></tr>\n<tr class=\"separator:gac40833db608deda477f018767b9a1cad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab219911644fdc694e7d275cfcf35bfca\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab219911644fdc694e7d275cfcf35bfca\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gab219911644fdc694e7d275cfcf35bfca\">dot</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gab219911644fdc694e7d275cfcf35bfca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...  <a href=\"a00160.html#gab219911644fdc694e7d275cfcf35bfca\">More...</a><br /></td></tr>\n<tr class=\"separator:gab219911644fdc694e7d275cfcf35bfca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga22089a76bfb7b45b4c34961bb715e2df\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga22089a76bfb7b45b4c34961bb715e2df\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga22089a76bfb7b45b4c34961bb715e2df\">equal</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga22089a76bfb7b45b4c34961bb715e2df\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x == y.  <a href=\"a00160.html#ga22089a76bfb7b45b4c34961bb715e2df\">More...</a><br /></td></tr>\n<tr class=\"separator:ga22089a76bfb7b45b4c34961bb715e2df\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf21424fa62e03de8b11c2b776c17d7a3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf21424fa62e03de8b11c2b776c17d7a3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3\">eulerAngles</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf21424fa62e03de8b11c2b776c17d7a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns euler angles, pitch as x, yaw as y, roll as z.  <a href=\"a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf21424fa62e03de8b11c2b776c17d7a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3f2720e2d77ec39186415f85ecd9cad0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3f2720e2d77ec39186415f85ecd9cad0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga3f2720e2d77ec39186415f85ecd9cad0\">greaterThan</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga3f2720e2d77ec39186415f85ecd9cad0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &gt; y.  <a href=\"a00160.html#ga3f2720e2d77ec39186415f85ecd9cad0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3f2720e2d77ec39186415f85ecd9cad0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga293cb3175d9ad290deaf50984716fd44\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga293cb3175d9ad290deaf50984716fd44\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga293cb3175d9ad290deaf50984716fd44\">greaterThanEqual</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga293cb3175d9ad290deaf50984716fd44\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &gt;= y.  <a href=\"a00160.html#ga293cb3175d9ad290deaf50984716fd44\">More...</a><br /></td></tr>\n<tr class=\"separator:ga293cb3175d9ad290deaf50984716fd44\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadc59b59ce71daa5586a64a6acf36c072\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadc59b59ce71daa5586a64a6acf36c072\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gadc59b59ce71daa5586a64a6acf36c072\">inverse</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gadc59b59ce71daa5586a64a6acf36c072\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the q inverse.  <a href=\"a00160.html#gadc59b59ce71daa5586a64a6acf36c072\">More...</a><br /></td></tr>\n<tr class=\"separator:gadc59b59ce71daa5586a64a6acf36c072\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga139abc0f7f89553e341f8be95bf8d3cb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga139abc0f7f89553e341f8be95bf8d3cb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga139abc0f7f89553e341f8be95bf8d3cb\">isinf</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga139abc0f7f89553e341f8be95bf8d3cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a positive infinity or negative infinity representation in the underlying implementation's set of floating point representations.  <a href=\"a00160.html#ga139abc0f7f89553e341f8be95bf8d3cb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga139abc0f7f89553e341f8be95bf8d3cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31f4378ab97985177e208f4f4f8b1fd3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga31f4378ab97985177e208f4f4f8b1fd3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga31f4378ab97985177e208f4f4f8b1fd3\">isnan</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga31f4378ab97985177e208f4f4f8b1fd3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a NaN (not a number) representation in the underlying implementation's set of floating point representations.  <a href=\"a00160.html#ga31f4378ab97985177e208f4f4f8b1fd3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31f4378ab97985177e208f4f4f8b1fd3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab33f82f8d1c9223d335aab752a126855\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab33f82f8d1c9223d335aab752a126855\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gab33f82f8d1c9223d335aab752a126855\">length</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gab33f82f8d1c9223d335aab752a126855\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the length of the quaternion.  <a href=\"a00160.html#gab33f82f8d1c9223d335aab752a126855\">More...</a><br /></td></tr>\n<tr class=\"separator:gab33f82f8d1c9223d335aab752a126855\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabc58e7013ef63d6df69c28c14afd0c01\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabc58e7013ef63d6df69c28c14afd0c01\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gabc58e7013ef63d6df69c28c14afd0c01\">lerp</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</td></tr>\n<tr class=\"memdesc:gabc58e7013ef63d6df69c28c14afd0c01\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Linear interpolation of two quaternions.  <a href=\"a00160.html#gabc58e7013ef63d6df69c28c14afd0c01\">More...</a><br /></td></tr>\n<tr class=\"separator:gabc58e7013ef63d6df69c28c14afd0c01\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga627487c769e33f4b9f318f271b75802c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga627487c769e33f4b9f318f271b75802c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga627487c769e33f4b9f318f271b75802c\">lessThan</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga627487c769e33f4b9f318f271b75802c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison result of x &lt; y.  <a href=\"a00160.html#ga627487c769e33f4b9f318f271b75802c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga627487c769e33f4b9f318f271b75802c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga9e84617bb109bf2eb7f30d7f4ba07ad4\">lessThanEqual</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &lt;= y.  <a href=\"a00160.html#ga9e84617bb109bf2eb7f30d7f4ba07ad4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e88f15c94effe737c876d21ea0db101\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6e88f15c94effe737c876d21ea0db101\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">mat3_cast</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga6e88f15c94effe737c876d21ea0db101\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 3 * 3 matrix.  <a href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e88f15c94effe737c876d21ea0db101\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e2085f17cd5aae423c04536524f11b3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8e2085f17cd5aae423c04536524f11b3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">mat4_cast</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8e2085f17cd5aae423c04536524f11b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 4 * 4 matrix.  <a href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e2085f17cd5aae423c04536524f11b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c31ccbb8548b2b24226901e602dfc0a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6c31ccbb8548b2b24226901e602dfc0a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga6c31ccbb8548b2b24226901e602dfc0a\">mix</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</td></tr>\n<tr class=\"memdesc:ga6c31ccbb8548b2b24226901e602dfc0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Spherical linear interpolation of two quaternions.  <a href=\"a00160.html#ga6c31ccbb8548b2b24226901e602dfc0a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c31ccbb8548b2b24226901e602dfc0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad4f3769e33c18d1897d1857c1f8da864\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad4f3769e33c18d1897d1857c1f8da864\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gad4f3769e33c18d1897d1857c1f8da864\">normalize</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gad4f3769e33c18d1897d1857c1f8da864\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the normalized quaternion.  <a href=\"a00160.html#gad4f3769e33c18d1897d1857c1f8da864\">More...</a><br /></td></tr>\n<tr class=\"separator:gad4f3769e33c18d1897d1857c1f8da864\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9494ec3489041958a240963a8a0ac9a0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9494ec3489041958a240963a8a0ac9a0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga9494ec3489041958a240963a8a0ac9a0\">notEqual</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga9494ec3489041958a240963a8a0ac9a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x != y.  <a href=\"a00160.html#ga9494ec3489041958a240963a8a0ac9a0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9494ec3489041958a240963a8a0ac9a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bd78e5fe153d07e39fb4c83e73dba73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9bd78e5fe153d07e39fb4c83e73dba73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">pitch</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga9bd78e5fe153d07e39fb4c83e73dba73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns pitch value of euler angles expressed in radians.  <a href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9bd78e5fe153d07e39fb4c83e73dba73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga03e023aec9acd561a28594bbc8a3abf6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga03e023aec9acd561a28594bbc8a3abf6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">quat_cast</a> (mat&lt; 3, 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga03e023aec9acd561a28594bbc8a3abf6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 3 * 3 matrix to a quaternion.  <a href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga03e023aec9acd561a28594bbc8a3abf6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga50bb9aecf42fdab04e16039ab6a81c60\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga50bb9aecf42fdab04e16039ab6a81c60\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60\">quat_cast</a> (mat&lt; 4, 4, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga50bb9aecf42fdab04e16039ab6a81c60\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 4 * 4 matrix to a quaternion.  <a href=\"a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50bb9aecf42fdab04e16039ab6a81c60\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ff93afbd9cc29f2ad217f2228e8a95b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3ff93afbd9cc29f2ad217f2228e8a95b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">roll</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3ff93afbd9cc29f2ad217f2228e8a95b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns roll value of euler angles expressed in radians.  <a href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ff93afbd9cc29f2ad217f2228e8a95b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga21c6e3b6104c9b8116a35ddf2ac4d358\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga21c6e3b6104c9b8116a35ddf2ac4d358\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga21c6e3b6104c9b8116a35ddf2ac4d358\">rotate</a> (tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:ga21c6e3b6104c9b8116a35ddf2ac4d358\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotates a quaternion from a vector of 3 components axis and an angle.  <a href=\"a00160.html#ga21c6e3b6104c9b8116a35ddf2ac4d358\">More...</a><br /></td></tr>\n<tr class=\"separator:ga21c6e3b6104c9b8116a35ddf2ac4d358\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3796542dac06014d541d67ebd5f2a88a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3796542dac06014d541d67ebd5f2a88a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga3796542dac06014d541d67ebd5f2a88a\">slerp</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</td></tr>\n<tr class=\"memdesc:ga3796542dac06014d541d67ebd5f2a88a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Spherical linear interpolation of two quaternions.  <a href=\"a00160.html#ga3796542dac06014d541d67ebd5f2a88a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3796542dac06014d541d67ebd5f2a88a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga53feffeb4001b99e36e216522e465e9e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga53feffeb4001b99e36e216522e465e9e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">yaw</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga53feffeb4001b99e36e216522e465e9e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns yaw value of euler angles expressed in radians.  <a href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga53feffeb4001b99e36e216522e465e9e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00160.html\">GLM_GTC_quaternion</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00083_source.html\">gtc/quaternion.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00083_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: quaternion.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/quaternion.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00083.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/constants.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_quaternion extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">struct </span>tquat</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                <span class=\"comment\">// -- Implementation detail --</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                <span class=\"keyword\">typedef</span> tquat&lt;T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                <span class=\"comment\">// -- Data --</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic ignored &quot;-Wpedantic&quot;</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wgnu-anonymous-struct&quot;</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wnested-anon-types&quot;</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                        <span class=\"keyword\">union</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                                <span class=\"keyword\">struct </span>{ T x, y, z, w;};</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                                <span class=\"keyword\">typename</span> detail::storage&lt;T, sizeof(T) * 4, detail::is_aligned&lt;Q&gt;::value&gt;::type data;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                        T x, y, z, w;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                <span class=\"comment\">// -- Component accesses --</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00160.html#gab33f82f8d1c9223d335aab752a126855\">length</a>(){<span class=\"keywordflow\">return</span> 4;}</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                GLM_FUNC_DECL T &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                GLM_FUNC_DECL T <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                <span class=\"comment\">// -- Implicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tquat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat&lt;T, Q&gt; const&amp; q) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat&lt;T, P&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                <span class=\"comment\">// -- Explicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tquat(T s, vec&lt;3, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR tquat(T w, T x, T y, T z);</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                <span class=\"comment\">// -- Conversion constructors --</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tquat(tquat&lt;U, P&gt; const&amp; q);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_EXPLICIT_CONVERSION_OPERATORS</span></div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> <span class=\"keyword\">operator</span> mat&lt;3, 3, T, Q&gt;();</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                        GLM_FUNC_DECL <span class=\"keyword\">explicit</span> <span class=\"keyword\">operator</span> mat&lt;4, 4, T, Q&gt;();</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                GLM_FUNC_DECL tquat(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; u, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT tquat(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3\">eulerAngles</a>);</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT tquat(mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT tquat(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                GLM_FUNC_DECL tquat&lt;T, Q&gt; &amp; operator=(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                GLM_FUNC_DECL tquat&lt;T, Q&gt; &amp; operator=(tquat&lt;U, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;                GLM_FUNC_DECL tquat&lt;T, Q&gt; &amp; operator+=(tquat&lt;U, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;                GLM_FUNC_DECL tquat&lt;T, Q&gt; &amp; operator-=(tquat&lt;U, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                GLM_FUNC_DECL tquat&lt;T, Q&gt; &amp; operator*=(tquat&lt;U, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                GLM_FUNC_DECL tquat&lt;T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                GLM_FUNC_DECL tquat&lt;T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        <span class=\"comment\">// -- Unary bit operators --</span></div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; operator+(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; operator-(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; operator+(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; p);</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; operator*(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; p);</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; operator*(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q, T <span class=\"keyword\">const</span>&amp; s);</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; operator*(T <span class=\"keyword\">const</span>&amp; s, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; operator/(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q, T <span class=\"keyword\">const</span>&amp; s);</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q1, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q2);</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q1, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q2);</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00160.html#gab33f82f8d1c9223d335aab752a126855\">length</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#gad4f3769e33c18d1897d1857c1f8da864\">normalize</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00160.html#gab219911644fdc694e7d275cfcf35bfca\">dot</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#ga6c31ccbb8548b2b24226901e602dfc0a\">mix</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y, T a);</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#gabc58e7013ef63d6df69c28c14afd0c01\">lerp</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y, T a);</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#ga3796542dac06014d541d67ebd5f2a88a\">slerp</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y, T a);</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#gac40833db608deda477f018767b9a1cad\">conjugate</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#gadc59b59ce71daa5586a64a6acf36c072\">inverse</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#ga21c6e3b6104c9b8116a35ddf2ac4d358\">rotate</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a>);</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3\">eulerAngles</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">roll</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">pitch</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">yaw</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">mat3_cast</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;</div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">mat4_cast</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;</div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60\">quat_cast</a>(mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;</div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60\">quat_cast</a>(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00160.html#ga93856b8bfcdd5b9a164248df3149476c\">angleAxis</a>(T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a>);</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00160.html#ga627487c769e33f4b9f318f271b75802c\">lessThan</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00160.html#ga9e84617bb109bf2eb7f30d7f4ba07ad4\">lessThanEqual</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00160.html#ga3f2720e2d77ec39186415f85ecd9cad0\">greaterThan</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;</div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00160.html#ga293cb3175d9ad290deaf50984716fd44\">greaterThanEqual</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00160.html#ga22089a76bfb7b45b4c34961bb715e2df\">equal</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00160.html#ga9494ec3489041958a240963a8a0ac9a0\">notEqual</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x, tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00160.html#ga31f4378ab97985177e208f4f4f8b1fd3\">isnan</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;</div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; <a class=\"code\" href=\"a00160.html#ga139abc0f7f89553e341f8be95bf8d3cb\">isinf</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;</div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;<span class=\"preprocessor\">#include &quot;quaternion.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00160_html_ga6e88f15c94effe737c876d21ea0db101\"><div class=\"ttname\"><a href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">glm::mat3_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; mat3_cast(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a quaternion to a 3 * 3 matrix. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00160_html_gadc59b59ce71daa5586a64a6acf36c072\"><div class=\"ttname\"><a href=\"a00160.html#gadc59b59ce71daa5586a64a6acf36c072\">glm::inverse</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; inverse(tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns the q inverse. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga9494ec3489041958a240963a8a0ac9a0\"><div class=\"ttname\"><a href=\"a00160.html#ga9494ec3489041958a240963a8a0ac9a0\">glm::notEqual</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; notEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x != y. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga8e2085f17cd5aae423c04536524f11b3\"><div class=\"ttname\"><a href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">glm::mat4_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; mat4_cast(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a quaternion to a 4 * 4 matrix. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga627487c769e33f4b9f318f271b75802c\"><div class=\"ttname\"><a href=\"a00160.html#ga627487c769e33f4b9f318f271b75802c\">glm::lessThan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; lessThan(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison result of x < y. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gabc58e7013ef63d6df69c28c14afd0c01\"><div class=\"ttname\"><a href=\"a00160.html#gabc58e7013ef63d6df69c28c14afd0c01\">glm::lerp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; lerp(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</div><div class=\"ttdoc\">Linear interpolation of two quaternions. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaf2707d3081789ce097daaa6e54d5287\"><div class=\"ttname\"><a href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">glm::axis</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; axis(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the q rotation axis. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga93856b8bfcdd5b9a164248df3149476c\"><div class=\"ttname\"><a href=\"a00160.html#ga93856b8bfcdd5b9a164248df3149476c\">glm::angleAxis</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; angleAxis(T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</div><div class=\"ttdoc\">Build a quaternion from an angle and a normalized axis. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gad4f3769e33c18d1897d1857c1f8da864\"><div class=\"ttname\"><a href=\"a00160.html#gad4f3769e33c18d1897d1857c1f8da864\">glm::normalize</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; normalize(tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns the normalized quaternion. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga293cb3175d9ad290deaf50984716fd44\"><div class=\"ttname\"><a href=\"a00160.html#ga293cb3175d9ad290deaf50984716fd44\">glm::greaterThanEqual</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; greaterThanEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x >= y. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga139abc0f7f89553e341f8be95bf8d3cb\"><div class=\"ttname\"><a href=\"a00160.html#ga139abc0f7f89553e341f8be95bf8d3cb\">glm::isinf</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; isinf(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns true if x holds a positive infinity or negative infinity representation in the underlying imp...</div></div>\n<div class=\"ttc\" id=\"a00160_html_gac40833db608deda477f018767b9a1cad\"><div class=\"ttname\"><a href=\"a00160.html#gac40833db608deda477f018767b9a1cad\">glm::conjugate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; conjugate(tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns the q conjugate. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga50bb9aecf42fdab04e16039ab6a81c60\"><div class=\"ttname\"><a href=\"a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60\">glm::quat_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; quat_cast(mat&lt; 4, 4, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a 4 * 4 matrix to a quaternion. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga3f2720e2d77ec39186415f85ecd9cad0\"><div class=\"ttname\"><a href=\"a00160.html#ga3f2720e2d77ec39186415f85ecd9cad0\">glm::greaterThan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; greaterThan(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x > y. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga9bd78e5fe153d07e39fb4c83e73dba73\"><div class=\"ttname\"><a href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">glm::pitch</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T pitch(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns pitch value of euler angles expressed in radians. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga21c6e3b6104c9b8116a35ddf2ac4d358\"><div class=\"ttname\"><a href=\"a00160.html#ga21c6e3b6104c9b8116a35ddf2ac4d358\">glm::rotate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; rotate(tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</div><div class=\"ttdoc\">Rotates a quaternion from a vector of 3 components axis and an angle. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaf21424fa62e03de8b11c2b776c17d7a3\"><div class=\"ttname\"><a href=\"a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3\">glm::eulerAngles</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; eulerAngles(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns euler angles, pitch as x, yaw as y, roll as z. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga53feffeb4001b99e36e216522e465e9e\"><div class=\"ttname\"><a href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">glm::yaw</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T yaw(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns yaw value of euler angles expressed in radians. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gab33f82f8d1c9223d335aab752a126855\"><div class=\"ttname\"><a href=\"a00160.html#gab33f82f8d1c9223d335aab752a126855\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns the length of the quaternion. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga22089a76bfb7b45b4c34961bb715e2df\"><div class=\"ttname\"><a href=\"a00160.html#ga22089a76bfb7b45b4c34961bb715e2df\">glm::equal</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; equal(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x == y. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga6c31ccbb8548b2b24226901e602dfc0a\"><div class=\"ttname\"><a href=\"a00160.html#ga6c31ccbb8548b2b24226901e602dfc0a\">glm::mix</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; mix(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</div><div class=\"ttdoc\">Spherical linear interpolation of two quaternions. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><div class=\"ttname\"><a href=\"a00160.html#ga9e84617bb109bf2eb7f30d7f4ba07ad4\">glm::lessThanEqual</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; lessThanEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x <= y. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gab219911644fdc694e7d275cfcf35bfca\"><div class=\"ttname\"><a href=\"a00160.html#gab219911644fdc694e7d275cfcf35bfca\">glm::dot</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T dot(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga3796542dac06014d541d67ebd5f2a88a\"><div class=\"ttname\"><a href=\"a00160.html#ga3796542dac06014d541d67ebd5f2a88a\">glm::slerp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; slerp(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</div><div class=\"ttdoc\">Spherical linear interpolation of two quaternions. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga31f4378ab97985177e208f4f4f8b1fd3\"><div class=\"ttname\"><a href=\"a00160.html#ga31f4378ab97985177e208f4f4f8b1fd3\">glm::isnan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt; isnan(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns true if x holds a NaN (not a number) representation in the underlying implementation&#39;s set of...</div></div>\n<div class=\"ttc\" id=\"a00160_html_ga3ff93afbd9cc29f2ad217f2228e8a95b\"><div class=\"ttname\"><a href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">glm::roll</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T roll(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns roll value of euler angles expressed in radians. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00084.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: quaternion.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/quaternion.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00212.html\">GLM_GTX_quaternion</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00084_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8639615408166d0dddda1b91a940b338\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8639615408166d0dddda1b91a940b338\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga8639615408166d0dddda1b91a940b338\">cross</a> (tquat&lt; T, Q &gt; const &amp;q, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga8639615408166d0dddda1b91a940b338\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute a cross product between a quaternion and a vector.  <a href=\"a00212.html#ga8639615408166d0dddda1b91a940b338\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8639615408166d0dddda1b91a940b338\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa75ca5654e0dc3b61c05db091f7d46ce\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa75ca5654e0dc3b61c05db091f7d46ce\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce\">cross</a> (vec&lt; 3, T, Q &gt; const &amp;v, tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gaa75ca5654e0dc3b61c05db091f7d46ce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute a cross product between a vector and a quaternion.  <a href=\"a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa75ca5654e0dc3b61c05db091f7d46ce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga72275e87ce62dc75a06d39a6c049835c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga72275e87ce62dc75a06d39a6c049835c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga72275e87ce62dc75a06d39a6c049835c\">exp</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga72275e87ce62dc75a06d39a6c049835c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a exp of a quaternion.  <a href=\"a00212.html#ga72275e87ce62dc75a06d39a6c049835c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga72275e87ce62dc75a06d39a6c049835c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga312385d0a8caa24c1daaa1d00ce4c2d3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga312385d0a8caa24c1daaa1d00ce4c2d3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga312385d0a8caa24c1daaa1d00ce4c2d3\">extractRealComponent</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga312385d0a8caa24c1daaa1d00ce4c2d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extract the real component of a quaternion.  <a href=\"a00212.html#ga312385d0a8caa24c1daaa1d00ce4c2d3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga312385d0a8caa24c1daaa1d00ce4c2d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac5c77bc74dfc750aaf271d68f271bf2b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac5c77bc74dfc750aaf271d68f271bf2b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gac5c77bc74dfc750aaf271d68f271bf2b\">fastMix</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</td></tr>\n<tr class=\"memdesc:gac5c77bc74dfc750aaf271d68f271bf2b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion normalized linear interpolation.  <a href=\"a00212.html#gac5c77bc74dfc750aaf271d68f271bf2b\">More...</a><br /></td></tr>\n<tr class=\"separator:gac5c77bc74dfc750aaf271d68f271bf2b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac9be2084562a52ae8923813233563a28\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac9be2084562a52ae8923813233563a28\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gac9be2084562a52ae8923813233563a28\">intermediate</a> (tquat&lt; T, Q &gt; const &amp;prev, tquat&lt; T, Q &gt; const &amp;curr, tquat&lt; T, Q &gt; const &amp;next)</td></tr>\n<tr class=\"memdesc:gac9be2084562a52ae8923813233563a28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an intermediate control point for squad interpolation.  <a href=\"a00212.html#gac9be2084562a52ae8923813233563a28\">More...</a><br /></td></tr>\n<tr class=\"separator:gac9be2084562a52ae8923813233563a28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga229bacc3051770b030042fe266f7b0cb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga229bacc3051770b030042fe266f7b0cb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga229bacc3051770b030042fe266f7b0cb\">length2</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga229bacc3051770b030042fe266f7b0cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the squared length of x.  <a href=\"a00212.html#ga229bacc3051770b030042fe266f7b0cb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga229bacc3051770b030042fe266f7b0cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaad510f1a4ea26994b341c094ec4f4eed\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaad510f1a4ea26994b341c094ec4f4eed\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gaad510f1a4ea26994b341c094ec4f4eed\">log</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gaad510f1a4ea26994b341c094ec4f4eed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a log of a quaternion.  <a href=\"a00212.html#gaad510f1a4ea26994b341c094ec4f4eed\">More...</a><br /></td></tr>\n<tr class=\"separator:gaad510f1a4ea26994b341c094ec4f4eed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad382fc37392d537aecf2245a4597d8a3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad382fc37392d537aecf2245a4597d8a3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gad382fc37392d537aecf2245a4597d8a3\">pow</a> (tquat&lt; T, Q &gt; const &amp;x, T const &amp;y)</td></tr>\n<tr class=\"memdesc:gad382fc37392d537aecf2245a4597d8a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the y power.  <a href=\"a00212.html#gad382fc37392d537aecf2245a4597d8a3\">More...</a><br /></td></tr>\n<tr class=\"separator:gad382fc37392d537aecf2245a4597d8a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga40788ce1d74fac29fa000af893a3ceb5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga40788ce1d74fac29fa000af893a3ceb5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga40788ce1d74fac29fa000af893a3ceb5\">quat_identity</a> ()</td></tr>\n<tr class=\"memdesc:ga40788ce1d74fac29fa000af893a3ceb5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Create an identity quaternion.  <a href=\"a00212.html#ga40788ce1d74fac29fa000af893a3ceb5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga40788ce1d74fac29fa000af893a3ceb5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga668d9ec9964ced2b455d416677e1e8b9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga668d9ec9964ced2b455d416677e1e8b9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga668d9ec9964ced2b455d416677e1e8b9\">quatLookAt</a> (vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:ga668d9ec9964ced2b455d416677e1e8b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a look at quaternion based on the default handedness.  <a href=\"a00212.html#ga668d9ec9964ced2b455d416677e1e8b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga668d9ec9964ced2b455d416677e1e8b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6f1b3fba52fcab952d0ab523177ff443\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6f1b3fba52fcab952d0ab523177ff443\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga6f1b3fba52fcab952d0ab523177ff443\">quatLookAtLH</a> (vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:ga6f1b3fba52fcab952d0ab523177ff443\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a left-handed look at quaternion.  <a href=\"a00212.html#ga6f1b3fba52fcab952d0ab523177ff443\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6f1b3fba52fcab952d0ab523177ff443\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad30cbeb78315773b6d18d9d1c1c75b77\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad30cbeb78315773b6d18d9d1c1c75b77\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gad30cbeb78315773b6d18d9d1c1c75b77\">quatLookAtRH</a> (vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:gad30cbeb78315773b6d18d9d1c1c75b77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a right-handed look at quaternion.  <a href=\"a00212.html#gad30cbeb78315773b6d18d9d1c1c75b77\">More...</a><br /></td></tr>\n<tr class=\"separator:gad30cbeb78315773b6d18d9d1c1c75b77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49730f975e7f0ee3862a20b767aba583\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga49730f975e7f0ee3862a20b767aba583\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga49730f975e7f0ee3862a20b767aba583\">rotate</a> (tquat&lt; T, Q &gt; const &amp;q, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga49730f975e7f0ee3862a20b767aba583\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns quarternion square root.  <a href=\"a00212.html#ga49730f975e7f0ee3862a20b767aba583\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49730f975e7f0ee3862a20b767aba583\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97a5f8af1d63056b85a53ac28042fe77\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga97a5f8af1d63056b85a53ac28042fe77\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga97a5f8af1d63056b85a53ac28042fe77\">rotate</a> (tquat&lt; T, Q &gt; const &amp;q, vec&lt; 4, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga97a5f8af1d63056b85a53ac28042fe77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotates a 4 components vector by a quaternion.  <a href=\"a00212.html#ga97a5f8af1d63056b85a53ac28042fe77\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97a5f8af1d63056b85a53ac28042fe77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5a729f33cbd904c9ca14cdf25d0a07e4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5a729f33cbd904c9ca14cdf25d0a07e4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga5a729f33cbd904c9ca14cdf25d0a07e4\">rotation</a> (vec&lt; 3, T, Q &gt; const &amp;orig, vec&lt; 3, T, Q &gt; const &amp;dest)</td></tr>\n<tr class=\"memdesc:ga5a729f33cbd904c9ca14cdf25d0a07e4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the rotation between two vectors.  <a href=\"a00212.html#ga5a729f33cbd904c9ca14cdf25d0a07e4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5a729f33cbd904c9ca14cdf25d0a07e4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf0ad63ac791b1f9a587e363837c2d538\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf0ad63ac791b1f9a587e363837c2d538\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gaf0ad63ac791b1f9a587e363837c2d538\">shortMix</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</td></tr>\n<tr class=\"memdesc:gaf0ad63ac791b1f9a587e363837c2d538\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion interpolation using the rotation short path.  <a href=\"a00212.html#gaf0ad63ac791b1f9a587e363837c2d538\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf0ad63ac791b1f9a587e363837c2d538\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacfcb16619e166e672c4672aff50a565c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacfcb16619e166e672c4672aff50a565c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gacfcb16619e166e672c4672aff50a565c\">squad</a> (tquat&lt; T, Q &gt; const &amp;q1, tquat&lt; T, Q &gt; const &amp;q2, tquat&lt; T, Q &gt; const &amp;s1, tquat&lt; T, Q &gt; const &amp;s2, T const &amp;h)</td></tr>\n<tr class=\"memdesc:gacfcb16619e166e672c4672aff50a565c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute a point on a path according squad equation.  <a href=\"a00212.html#gacfcb16619e166e672c4672aff50a565c\">More...</a><br /></td></tr>\n<tr class=\"separator:gacfcb16619e166e672c4672aff50a565c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga433955cb703d982427fb53b540d02f3d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga433955cb703d982427fb53b540d02f3d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga433955cb703d982427fb53b540d02f3d\">toMat3</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga433955cb703d982427fb53b540d02f3d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 3 * 3 matrix.  <a href=\"a00212.html#ga433955cb703d982427fb53b540d02f3d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga433955cb703d982427fb53b540d02f3d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fa0fb798c2715148e2e0358442bf895\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1fa0fb798c2715148e2e0358442bf895\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga1fa0fb798c2715148e2e0358442bf895\">toMat4</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga1fa0fb798c2715148e2e0358442bf895\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 4 * 4 matrix.  <a href=\"a00212.html#ga1fa0fb798c2715148e2e0358442bf895\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1fa0fb798c2715148e2e0358442bf895\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae9be791077b7a612d9092a922bd13f86\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae9be791077b7a612d9092a922bd13f86\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gae9be791077b7a612d9092a922bd13f86\">toQuat</a> (mat&lt; 3, 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae9be791077b7a612d9092a922bd13f86\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 3 * 3 matrix to a quaternion.  <a href=\"a00212.html#gae9be791077b7a612d9092a922bd13f86\">More...</a><br /></td></tr>\n<tr class=\"separator:gae9be791077b7a612d9092a922bd13f86\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c0a178ac9c7d23e1a6848045d83aa54\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6c0a178ac9c7d23e1a6848045d83aa54\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54\">toQuat</a> (mat&lt; 4, 4, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga6c0a178ac9c7d23e1a6848045d83aa54\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 4 * 4 matrix to a quaternion.  <a href=\"a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c0a178ac9c7d23e1a6848045d83aa54\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00212.html\">GLM_GTX_quaternion</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_extented_min_max (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00084_source.html\">gtx/quaternion.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00084_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: quaternion.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/quaternion.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00084.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/constants.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/norm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_quaternion extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#ga40788ce1d74fac29fa000af893a3ceb5\">quat_identity</a>();</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce\">cross</a>(</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q,</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce\">cross</a>(</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#gacfcb16619e166e672c4672aff50a565c\">squad</a>(</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q1,</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q2,</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; s1,</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; s2,</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                T <span class=\"keyword\">const</span>&amp; h);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#gac9be2084562a52ae8923813233563a28\">intermediate</a>(</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; prev,</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; curr,</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; next);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#ga72275e87ce62dc75a06d39a6c049835c\">exp</a>(</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#gaad510f1a4ea26994b341c094ec4f4eed\">log</a>(</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#gad382fc37392d537aecf2245a4597d8a3\">pow</a>(</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                T <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        <span class=\"comment\">//template&lt;typename T, qualifier Q&gt;</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        <span class=\"comment\">//tquat&lt;T, Q&gt; sqrt(</span></div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        <span class=\"comment\">//      tquat&lt;T, Q&gt; const&amp; q);</span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00212.html#ga97a5f8af1d63056b85a53ac28042fe77\">rotate</a>(</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q,</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00212.html#ga97a5f8af1d63056b85a53ac28042fe77\">rotate</a>(</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q,</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00212.html#ga312385d0a8caa24c1daaa1d00ce4c2d3\">extractRealComponent</a>(</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00212.html#ga433955cb703d982427fb53b540d02f3d\">  134</a></span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00212.html#ga433955cb703d982427fb53b540d02f3d\">toMat3</a>(</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">mat3_cast</a>(x);}</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00212.html#ga1fa0fb798c2715148e2e0358442bf895\">  141</a></span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00212.html#ga1fa0fb798c2715148e2e0358442bf895\">toMat4</a>(</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">mat4_cast</a>(x);}</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00212.html#gae9be791077b7a612d9092a922bd13f86\">  148</a></span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54\">toQuat</a>(</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;                mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">quat_cast</a>(x);}</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54\">  155</a></span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54\">toQuat</a>(</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; x){<span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">quat_cast</a>(x);}</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#gaf0ad63ac791b1f9a587e363837c2d538\">shortMix</a>(</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y,</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;                T <span class=\"keyword\">const</span>&amp; a);</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#gac5c77bc74dfc750aaf271d68f271bf2b\">fastMix</a>(</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; y,</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                T <span class=\"keyword\">const</span>&amp; a);</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#ga5a729f33cbd904c9ca14cdf25d0a07e4\">rotation</a>(</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; orig, </div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; dest);</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#ga668d9ec9964ced2b455d416677e1e8b9\">quatLookAt</a>(</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; direction,</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; up);</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#gad30cbeb78315773b6d18d9d1c1c75b77\">quatLookAtRH</a>(</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; direction,</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; up);</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00212.html#ga6f1b3fba52fcab952d0ab523177ff443\">quatLookAtLH</a>(</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; direction,</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; up);</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00212.html#ga229bacc3051770b030042fe266f7b0cb\">length2</a>(tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q);</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;<span class=\"preprocessor\">#include &quot;quaternion.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00212_html_gaf0ad63ac791b1f9a587e363837c2d538\"><div class=\"ttname\"><a href=\"a00212.html#gaf0ad63ac791b1f9a587e363837c2d538\">glm::shortMix</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; shortMix(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</div><div class=\"ttdoc\">Quaternion interpolation using the rotation short path. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga6e88f15c94effe737c876d21ea0db101\"><div class=\"ttname\"><a href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">glm::mat3_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; mat3_cast(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a quaternion to a 3 * 3 matrix. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga312385d0a8caa24c1daaa1d00ce4c2d3\"><div class=\"ttname\"><a href=\"a00212.html#ga312385d0a8caa24c1daaa1d00ce4c2d3\">glm::extractRealComponent</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T extractRealComponent(tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Extract the real component of a quaternion. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga668d9ec9964ced2b455d416677e1e8b9\"><div class=\"ttname\"><a href=\"a00212.html#ga668d9ec9964ced2b455d416677e1e8b9\">glm::quatLookAt</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; quatLookAt(vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</div><div class=\"ttdoc\">Build a look at quaternion based on the default handedness. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga72275e87ce62dc75a06d39a6c049835c\"><div class=\"ttname\"><a href=\"a00212.html#ga72275e87ce62dc75a06d39a6c049835c\">glm::exp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; exp(tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns a exp of a quaternion. </div></div>\n<div class=\"ttc\" id=\"a00212_html_gac5c77bc74dfc750aaf271d68f271bf2b\"><div class=\"ttname\"><a href=\"a00212.html#gac5c77bc74dfc750aaf271d68f271bf2b\">glm::fastMix</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; fastMix(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</div><div class=\"ttdoc\">Quaternion normalized linear interpolation. </div></div>\n<div class=\"ttc\" id=\"a00212_html_gac9be2084562a52ae8923813233563a28\"><div class=\"ttname\"><a href=\"a00212.html#gac9be2084562a52ae8923813233563a28\">glm::intermediate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; intermediate(tquat&lt; T, Q &gt; const &amp;prev, tquat&lt; T, Q &gt; const &amp;curr, tquat&lt; T, Q &gt; const &amp;next)</div><div class=\"ttdoc\">Returns an intermediate control point for squad interpolation. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga6f1b3fba52fcab952d0ab523177ff443\"><div class=\"ttname\"><a href=\"a00212.html#ga6f1b3fba52fcab952d0ab523177ff443\">glm::quatLookAtLH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; quatLookAtLH(vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</div><div class=\"ttdoc\">Build a left-handed look at quaternion. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00160_html_ga03e023aec9acd561a28594bbc8a3abf6\"><div class=\"ttname\"><a href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">glm::quat_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; quat_cast(mat&lt; 3, 3, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a 3 * 3 matrix to a quaternion. </div></div>\n<div class=\"ttc\" id=\"a00160_html_ga8e2085f17cd5aae423c04536524f11b3\"><div class=\"ttname\"><a href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">glm::mat4_cast</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; mat4_cast(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a quaternion to a 4 * 4 matrix. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga40788ce1d74fac29fa000af893a3ceb5\"><div class=\"ttname\"><a href=\"a00212.html#ga40788ce1d74fac29fa000af893a3ceb5\">glm::quat_identity</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; quat_identity()</div><div class=\"ttdoc\">Create an identity quaternion. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga6c0a178ac9c7d23e1a6848045d83aa54\"><div class=\"ttname\"><a href=\"a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54\">glm::toQuat</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; toQuat(mat&lt; 4, 4, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a 4 * 4 matrix to a quaternion. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00084_source.html#l00155\">gtx/quaternion.hpp:155</a></div></div>\n<div class=\"ttc\" id=\"a00212_html_gaa75ca5654e0dc3b61c05db091f7d46ce\"><div class=\"ttname\"><a href=\"a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce\">glm::cross</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; cross(vec&lt; 3, T, Q &gt; const &amp;v, tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Compute a cross product between a vector and a quaternion. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga5a729f33cbd904c9ca14cdf25d0a07e4\"><div class=\"ttname\"><a href=\"a00212.html#ga5a729f33cbd904c9ca14cdf25d0a07e4\">glm::rotation</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; rotation(vec&lt; 3, T, Q &gt; const &amp;orig, vec&lt; 3, T, Q &gt; const &amp;dest)</div><div class=\"ttdoc\">Compute the rotation between two vectors. </div></div>\n<div class=\"ttc\" id=\"a00212_html_gad30cbeb78315773b6d18d9d1c1c75b77\"><div class=\"ttname\"><a href=\"a00212.html#gad30cbeb78315773b6d18d9d1c1c75b77\">glm::quatLookAtRH</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; quatLookAtRH(vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</div><div class=\"ttdoc\">Build a right-handed look at quaternion. </div></div>\n<div class=\"ttc\" id=\"a00212_html_gacfcb16619e166e672c4672aff50a565c\"><div class=\"ttname\"><a href=\"a00212.html#gacfcb16619e166e672c4672aff50a565c\">glm::squad</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; squad(tquat&lt; T, Q &gt; const &amp;q1, tquat&lt; T, Q &gt; const &amp;q2, tquat&lt; T, Q &gt; const &amp;s1, tquat&lt; T, Q &gt; const &amp;s2, T const &amp;h)</div><div class=\"ttdoc\">Compute a point on a path according squad equation. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga1fa0fb798c2715148e2e0358442bf895\"><div class=\"ttname\"><a href=\"a00212.html#ga1fa0fb798c2715148e2e0358442bf895\">glm::toMat4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; toMat4(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a quaternion to a 4 * 4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00084_source.html#l00141\">gtx/quaternion.hpp:141</a></div></div>\n<div class=\"ttc\" id=\"a00212_html_ga97a5f8af1d63056b85a53ac28042fe77\"><div class=\"ttname\"><a href=\"a00212.html#ga97a5f8af1d63056b85a53ac28042fe77\">glm::rotate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt; rotate(tquat&lt; T, Q &gt; const &amp;q, vec&lt; 4, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Rotates a 4 components vector by a quaternion. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga229bacc3051770b030042fe266f7b0cb\"><div class=\"ttname\"><a href=\"a00212.html#ga229bacc3051770b030042fe266f7b0cb\">glm::length2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length2(tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns the squared length of x. </div></div>\n<div class=\"ttc\" id=\"a00212_html_ga433955cb703d982427fb53b540d02f3d\"><div class=\"ttname\"><a href=\"a00212.html#ga433955cb703d982427fb53b540d02f3d\">glm::toMat3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; toMat3(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Converts a quaternion to a 3 * 3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00084_source.html#l00134\">gtx/quaternion.hpp:134</a></div></div>\n<div class=\"ttc\" id=\"a00212_html_gaad510f1a4ea26994b341c094ec4f4eed\"><div class=\"ttname\"><a href=\"a00212.html#gaad510f1a4ea26994b341c094ec4f4eed\">glm::log</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; log(tquat&lt; T, Q &gt; const &amp;q)</div><div class=\"ttdoc\">Returns a log of a quaternion. </div></div>\n<div class=\"ttc\" id=\"a00212_html_gad382fc37392d537aecf2245a4597d8a3\"><div class=\"ttname\"><a href=\"a00212.html#gad382fc37392d537aecf2245a4597d8a3\">glm::pow</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; pow(tquat&lt; T, Q &gt; const &amp;x, T const &amp;y)</div><div class=\"ttdoc\">Returns x raised to the y power. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00085.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: random.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">random.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00161.html\">GLM_GTC_random</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00085_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga7c53b7797f3147af68a11c767679fa3f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga7c53b7797f3147af68a11c767679fa3f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga7c53b7797f3147af68a11c767679fa3f\">ballRand</a> (T Radius)</td></tr>\n<tr class=\"memdesc:ga7c53b7797f3147af68a11c767679fa3f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius.  <a href=\"a00161.html#ga7c53b7797f3147af68a11c767679fa3f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7c53b7797f3147af68a11c767679fa3f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9dd05c36025088fae25b97c869e88517\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga9dd05c36025088fae25b97c869e88517\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga9dd05c36025088fae25b97c869e88517\">circularRand</a> (T Radius)</td></tr>\n<tr class=\"memdesc:ga9dd05c36025088fae25b97c869e88517\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius.  <a href=\"a00161.html#ga9dd05c36025088fae25b97c869e88517\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9dd05c36025088fae25b97c869e88517\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#gaa0b18071f3f97dbf8bcf6f53c6fe5f73\">diskRand</a> (T Radius)</td></tr>\n<tr class=\"memdesc:gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius.  <a href=\"a00161.html#gaa0b18071f3f97dbf8bcf6f53c6fe5f73\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5193a83e49e4fdc5652c084711083574\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga5193a83e49e4fdc5652c084711083574\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga5193a83e49e4fdc5652c084711083574\">gaussRand</a> (genType Mean, genType Deviation)</td></tr>\n<tr class=\"memdesc:ga5193a83e49e4fdc5652c084711083574\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate random numbers in the interval [Min, Max], according a gaussian distribution.  <a href=\"a00161.html#ga5193a83e49e4fdc5652c084711083574\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5193a83e49e4fdc5652c084711083574\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04e241ab88374a477a2c2ceadd2fa03d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga04e241ab88374a477a2c2ceadd2fa03d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga04e241ab88374a477a2c2ceadd2fa03d\">linearRand</a> (genType Min, genType Max)</td></tr>\n<tr class=\"memdesc:ga04e241ab88374a477a2c2ceadd2fa03d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate random numbers in the interval [Min, Max], according a linear distribution.  <a href=\"a00161.html#ga04e241ab88374a477a2c2ceadd2fa03d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04e241ab88374a477a2c2ceadd2fa03d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga94731130c298a9ff5e5025fdee6d97a0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga94731130c298a9ff5e5025fdee6d97a0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga94731130c298a9ff5e5025fdee6d97a0\">linearRand</a> (vec&lt; L, T, Q &gt; const &amp;Min, vec&lt; L, T, Q &gt; const &amp;Max)</td></tr>\n<tr class=\"memdesc:ga94731130c298a9ff5e5025fdee6d97a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate random numbers in the interval [Min, Max], according a linear distribution.  <a href=\"a00161.html#ga94731130c298a9ff5e5025fdee6d97a0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga94731130c298a9ff5e5025fdee6d97a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga22f90fcaccdf001c516ca90f6428e138\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga22f90fcaccdf001c516ca90f6428e138\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga22f90fcaccdf001c516ca90f6428e138\">sphericalRand</a> (T Radius)</td></tr>\n<tr class=\"memdesc:ga22f90fcaccdf001c516ca90f6428e138\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius.  <a href=\"a00161.html#ga22f90fcaccdf001c516ca90f6428e138\">More...</a><br /></td></tr>\n<tr class=\"separator:ga22f90fcaccdf001c516ca90f6428e138\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00161.html\">GLM_GTC_random</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_random (extended) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00085_source.html\">random.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00085_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: random.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">random.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00085.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_random extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00161.html#ga94731130c298a9ff5e5025fdee6d97a0\">linearRand</a>(genType Min, genType Max);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00161.html#ga94731130c298a9ff5e5025fdee6d97a0\">linearRand</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Min, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Max);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00161.html#ga5193a83e49e4fdc5652c084711083574\">gaussRand</a>(genType Mean, genType Deviation);</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, defaultp&gt; <a class=\"code\" href=\"a00161.html#ga9dd05c36025088fae25b97c869e88517\">circularRand</a>(T Radius);</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, defaultp&gt; <a class=\"code\" href=\"a00161.html#ga22f90fcaccdf001c516ca90f6428e138\">sphericalRand</a>(T Radius);</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, defaultp&gt; <a class=\"code\" href=\"a00161.html#gaa0b18071f3f97dbf8bcf6f53c6fe5f73\">diskRand</a>(T Radius);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, defaultp&gt; <a class=\"code\" href=\"a00161.html#ga7c53b7797f3147af68a11c767679fa3f\">ballRand</a>(T Radius);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"preprocessor\">#include &quot;random.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00161_html_ga7c53b7797f3147af68a11c767679fa3f\"><div class=\"ttname\"><a href=\"a00161.html#ga7c53b7797f3147af68a11c767679fa3f\">glm::ballRand</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt; ballRand(T Radius)</div><div class=\"ttdoc\">Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of...</div></div>\n<div class=\"ttc\" id=\"a00161_html_ga9dd05c36025088fae25b97c869e88517\"><div class=\"ttname\"><a href=\"a00161.html#ga9dd05c36025088fae25b97c869e88517\">glm::circularRand</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt; circularRand(T Radius)</div><div class=\"ttdoc\">Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius...</div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00161_html_ga5193a83e49e4fdc5652c084711083574\"><div class=\"ttname\"><a href=\"a00161.html#ga5193a83e49e4fdc5652c084711083574\">glm::gaussRand</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType gaussRand(genType Mean, genType Deviation)</div><div class=\"ttdoc\">Generate random numbers in the interval [Min, Max], according a gaussian distribution. </div></div>\n<div class=\"ttc\" id=\"a00161_html_ga22f90fcaccdf001c516ca90f6428e138\"><div class=\"ttname\"><a href=\"a00161.html#ga22f90fcaccdf001c516ca90f6428e138\">glm::sphericalRand</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt; sphericalRand(T Radius)</div><div class=\"ttdoc\">Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius...</div></div>\n<div class=\"ttc\" id=\"a00161_html_gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><div class=\"ttname\"><a href=\"a00161.html#gaa0b18071f3f97dbf8bcf6f53c6fe5f73\">glm::diskRand</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt; diskRand(T Radius)</div><div class=\"ttdoc\">Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a...</div></div>\n<div class=\"ttc\" id=\"a00161_html_ga94731130c298a9ff5e5025fdee6d97a0\"><div class=\"ttname\"><a href=\"a00161.html#ga94731130c298a9ff5e5025fdee6d97a0\">glm::linearRand</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; linearRand(vec&lt; L, T, Q &gt; const &amp;Min, vec&lt; L, T, Q &gt; const &amp;Max)</div><div class=\"ttdoc\">Generate random numbers in the interval [Min, Max], according a linear distribution. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00086.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: range.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">range.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00213.html\">GLM_GTX_range</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00086_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00213.html\">GLM_GTX_range</a> </p>\n<dl class=\"section author\"><dt>Author</dt><dd>Joshua Moerman </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00086_source.html\">range.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00086_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: range.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">range.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00086.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_range is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if !GLM_HAS_RANGE_FOR</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM_GTX_range requires C++11 suppport or &#39;range for&#39;&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/type_ptr.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/vec1.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">inline</span> length_t components(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                <span class=\"keywordflow\">return</span> v.length();</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        <span class=\"keyword\">inline</span> length_t components(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                <span class=\"keywordflow\">return</span> v.length();</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        <span class=\"keyword\">inline</span> length_t components(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                <span class=\"keywordflow\">return</span> v.length();</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">inline</span> length_t components(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                <span class=\"keywordflow\">return</span> v.length();</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"keyword\">inline</span> length_t components(genType <span class=\"keyword\">const</span>&amp; m)</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                <span class=\"keywordflow\">return</span> m.length() * m[0].length();</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">inline</span> <span class=\"keyword\">typename</span> genType::value_type <span class=\"keyword\">const</span> * begin(genType <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                <span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">value_ptr</a>(v);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        <span class=\"keyword\">inline</span> <span class=\"keyword\">typename</span> genType::value_type <span class=\"keyword\">const</span> * end(genType <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                <span class=\"keywordflow\">return</span> begin(v) + components(v);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;        <span class=\"keyword\">inline</span> <span class=\"keyword\">typename</span> genType::value_type * begin(genType&amp; v)</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                <span class=\"keywordflow\">return</span> <a class=\"code\" href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">value_ptr</a>(v);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        <span class=\"keyword\">inline</span> <span class=\"keyword\">typename</span> genType::value_type * end(genType&amp; v)</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                <span class=\"keywordflow\">return</span> begin(v) + components(v);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00166_html_ga1c64669e1ba1160ad9386e43dc57569a\"><div class=\"ttname\"><a href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">glm::value_ptr</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType::value_type const * value_ptr(genType const &amp;v)</div><div class=\"ttdoc\">Return the constant address to the data of the input parameter. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00087.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: raw_data.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">raw_data.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00214.html\">GLM_GTX_raw_data</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00087_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga3005cb0d839d546c616becfa6602c607\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html#ga3005cb0d839d546c616becfa6602c607\">byte</a></td></tr>\n<tr class=\"memdesc:ga3005cb0d839d546c616becfa6602c607\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Type for byte numbers.  <a href=\"a00214.html#ga3005cb0d839d546c616becfa6602c607\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3005cb0d839d546c616becfa6602c607\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga86e46fff9f80ae33893d8d697f2ca98a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a\">dword</a></td></tr>\n<tr class=\"memdesc:ga86e46fff9f80ae33893d8d697f2ca98a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Type for dword numbers.  <a href=\"a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga86e46fff9f80ae33893d8d697f2ca98a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4021754ffb8e5ef14c75802b15657714\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html#ga4021754ffb8e5ef14c75802b15657714\">qword</a></td></tr>\n<tr class=\"memdesc:ga4021754ffb8e5ef14c75802b15657714\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Type for qword numbers.  <a href=\"a00214.html#ga4021754ffb8e5ef14c75802b15657714\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4021754ffb8e5ef14c75802b15657714\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16e9fea0ef1e6c4ef472d3d1731c49a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5\">word</a></td></tr>\n<tr class=\"memdesc:ga16e9fea0ef1e6c4ef472d3d1731c49a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Type for word numbers.  <a href=\"a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16e9fea0ef1e6c4ef472d3d1731c49a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00214.html\">GLM_GTX_raw_data</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00087_source.html\">raw_data.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00087_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: raw_data.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">raw_data.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00087.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_int.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_raw_data is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_raw_data extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00214.html#ga3005cb0d839d546c616becfa6602c607\">   34</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8           <a class=\"code\" href=\"a00214.html#ga3005cb0d839d546c616becfa6602c607\">byte</a>;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5\">   38</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16          <a class=\"code\" href=\"a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5\">word</a>;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a\">   42</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32          <a class=\"code\" href=\"a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a\">dword</a>;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00214.html#ga4021754ffb8e5ef14c75802b15657714\">   46</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64          <a class=\"code\" href=\"a00214.html#ga4021754ffb8e5ef14c75802b15657714\">qword</a>;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#include &quot;raw_data.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00214_html_ga86e46fff9f80ae33893d8d697f2ca98a\"><div class=\"ttname\"><a href=\"a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a\">glm::dword</a></div><div class=\"ttdeci\">detail::uint32 dword</div><div class=\"ttdoc\">Type for dword numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00087_source.html#l00042\">raw_data.hpp:42</a></div></div>\n<div class=\"ttc\" id=\"a00214_html_ga4021754ffb8e5ef14c75802b15657714\"><div class=\"ttname\"><a href=\"a00214.html#ga4021754ffb8e5ef14c75802b15657714\">glm::qword</a></div><div class=\"ttdeci\">detail::uint64 qword</div><div class=\"ttdoc\">Type for qword numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00087_source.html#l00046\">raw_data.hpp:46</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00214_html_ga3005cb0d839d546c616becfa6602c607\"><div class=\"ttname\"><a href=\"a00214.html#ga3005cb0d839d546c616becfa6602c607\">glm::byte</a></div><div class=\"ttdeci\">detail::uint8 byte</div><div class=\"ttdoc\">Type for byte numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00087_source.html#l00034\">raw_data.hpp:34</a></div></div>\n<div class=\"ttc\" id=\"a00214_html_ga16e9fea0ef1e6c4ef472d3d1731c49a5\"><div class=\"ttname\"><a href=\"a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5\">glm::word</a></div><div class=\"ttdeci\">detail::uint16 word</div><div class=\"ttdoc\">Type for word numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00087_source.html#l00038\">raw_data.hpp:38</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00088.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: reciprocal.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">reciprocal.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00162.html\">GLM_GTC_reciprocal</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00088_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaeadfb9c9d71093f7865b2ba2ca8d104d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaeadfb9c9d71093f7865b2ba2ca8d104d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#gaeadfb9c9d71093f7865b2ba2ca8d104d\">acot</a> (genType x)</td></tr>\n<tr class=\"memdesc:gaeadfb9c9d71093f7865b2ba2ca8d104d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse cotangent function.  <a href=\"a00162.html#gaeadfb9c9d71093f7865b2ba2ca8d104d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaeadfb9c9d71093f7865b2ba2ca8d104d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafaca98a7100170db8841f446282debfa\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gafaca98a7100170db8841f446282debfa\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#gafaca98a7100170db8841f446282debfa\">acoth</a> (genType x)</td></tr>\n<tr class=\"memdesc:gafaca98a7100170db8841f446282debfa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse cotangent hyperbolic function.  <a href=\"a00162.html#gafaca98a7100170db8841f446282debfa\">More...</a><br /></td></tr>\n<tr class=\"separator:gafaca98a7100170db8841f446282debfa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b4bed91476b9b915e76b4a30236d330\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga1b4bed91476b9b915e76b4a30236d330\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga1b4bed91476b9b915e76b4a30236d330\">acsc</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga1b4bed91476b9b915e76b4a30236d330\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse cosecant function.  <a href=\"a00162.html#ga1b4bed91476b9b915e76b4a30236d330\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b4bed91476b9b915e76b4a30236d330\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b50aa5e5afc7e19ec113ab91596c576\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4b50aa5e5afc7e19ec113ab91596c576\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga4b50aa5e5afc7e19ec113ab91596c576\">acsch</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga4b50aa5e5afc7e19ec113ab91596c576\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse cosecant hyperbolic function.  <a href=\"a00162.html#ga4b50aa5e5afc7e19ec113ab91596c576\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b50aa5e5afc7e19ec113ab91596c576\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c5b7f962c2c9ff684e6d2de48db1f10\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2c5b7f962c2c9ff684e6d2de48db1f10\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga2c5b7f962c2c9ff684e6d2de48db1f10\">asec</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga2c5b7f962c2c9ff684e6d2de48db1f10\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse secant function.  <a href=\"a00162.html#ga2c5b7f962c2c9ff684e6d2de48db1f10\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c5b7f962c2c9ff684e6d2de48db1f10\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec7586dccfe431f850d006f3824b8ca6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaec7586dccfe431f850d006f3824b8ca6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#gaec7586dccfe431f850d006f3824b8ca6\">asech</a> (genType x)</td></tr>\n<tr class=\"memdesc:gaec7586dccfe431f850d006f3824b8ca6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse secant hyperbolic function.  <a href=\"a00162.html#gaec7586dccfe431f850d006f3824b8ca6\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec7586dccfe431f850d006f3824b8ca6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3a7b517a95bbd3ad74da3aea87a66314\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga3a7b517a95bbd3ad74da3aea87a66314\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga3a7b517a95bbd3ad74da3aea87a66314\">cot</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga3a7b517a95bbd3ad74da3aea87a66314\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Cotangent function.  <a href=\"a00162.html#ga3a7b517a95bbd3ad74da3aea87a66314\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3a7b517a95bbd3ad74da3aea87a66314\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6b8b770eb7198e4dea59d52e6db81442\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6b8b770eb7198e4dea59d52e6db81442\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga6b8b770eb7198e4dea59d52e6db81442\">coth</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga6b8b770eb7198e4dea59d52e6db81442\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Cotangent hyperbolic function.  <a href=\"a00162.html#ga6b8b770eb7198e4dea59d52e6db81442\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6b8b770eb7198e4dea59d52e6db81442\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga59dd0005b6474eea48af743b4f14ebbb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga59dd0005b6474eea48af743b4f14ebbb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga59dd0005b6474eea48af743b4f14ebbb\">csc</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga59dd0005b6474eea48af743b4f14ebbb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Cosecant function.  <a href=\"a00162.html#ga59dd0005b6474eea48af743b4f14ebbb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga59dd0005b6474eea48af743b4f14ebbb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d95843ff3ca6472ab399ba171d290a0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6d95843ff3ca6472ab399ba171d290a0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga6d95843ff3ca6472ab399ba171d290a0\">csch</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga6d95843ff3ca6472ab399ba171d290a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Cosecant hyperbolic function.  <a href=\"a00162.html#ga6d95843ff3ca6472ab399ba171d290a0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d95843ff3ca6472ab399ba171d290a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae4bcbebee670c5ea155f0777b3acbd84\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae4bcbebee670c5ea155f0777b3acbd84\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#gae4bcbebee670c5ea155f0777b3acbd84\">sec</a> (genType angle)</td></tr>\n<tr class=\"memdesc:gae4bcbebee670c5ea155f0777b3acbd84\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Secant function.  <a href=\"a00162.html#gae4bcbebee670c5ea155f0777b3acbd84\">More...</a><br /></td></tr>\n<tr class=\"separator:gae4bcbebee670c5ea155f0777b3acbd84\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9a5cfd1e7170104a7b33863b1b75e5ae\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9a5cfd1e7170104a7b33863b1b75e5ae\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga9a5cfd1e7170104a7b33863b1b75e5ae\">sech</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga9a5cfd1e7170104a7b33863b1b75e5ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Secant hyperbolic function.  <a href=\"a00162.html#ga9a5cfd1e7170104a7b33863b1b75e5ae\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9a5cfd1e7170104a7b33863b1b75e5ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00162.html\">GLM_GTC_reciprocal</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00088_source.html\">reciprocal.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00088_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: reciprocal.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">reciprocal.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00088.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_reciprocal extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#gae4bcbebee670c5ea155f0777b3acbd84\">sec</a>(genType <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#ga59dd0005b6474eea48af743b4f14ebbb\">csc</a>(genType <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#ga3a7b517a95bbd3ad74da3aea87a66314\">cot</a>(genType <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#ga2c5b7f962c2c9ff684e6d2de48db1f10\">asec</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#ga1b4bed91476b9b915e76b4a30236d330\">acsc</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#gaeadfb9c9d71093f7865b2ba2ca8d104d\">acot</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#ga9a5cfd1e7170104a7b33863b1b75e5ae\">sech</a>(genType <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#ga6d95843ff3ca6472ab399ba171d290a0\">csch</a>(genType <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#ga6b8b770eb7198e4dea59d52e6db81442\">coth</a>(genType <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#gaec7586dccfe431f850d006f3824b8ca6\">asech</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#ga4b50aa5e5afc7e19ec113ab91596c576\">acsch</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00162.html#gafaca98a7100170db8841f446282debfa\">acoth</a>(genType x);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;<span class=\"preprocessor\">#include &quot;reciprocal.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00162_html_gae4bcbebee670c5ea155f0777b3acbd84\"><div class=\"ttname\"><a href=\"a00162.html#gae4bcbebee670c5ea155f0777b3acbd84\">glm::sec</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType sec(genType angle)</div><div class=\"ttdoc\">Secant function. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00162_html_gafaca98a7100170db8841f446282debfa\"><div class=\"ttname\"><a href=\"a00162.html#gafaca98a7100170db8841f446282debfa\">glm::acoth</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType acoth(genType x)</div><div class=\"ttdoc\">Inverse cotangent hyperbolic function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_ga2c5b7f962c2c9ff684e6d2de48db1f10\"><div class=\"ttname\"><a href=\"a00162.html#ga2c5b7f962c2c9ff684e6d2de48db1f10\">glm::asec</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType asec(genType x)</div><div class=\"ttdoc\">Inverse secant function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_ga1b4bed91476b9b915e76b4a30236d330\"><div class=\"ttname\"><a href=\"a00162.html#ga1b4bed91476b9b915e76b4a30236d330\">glm::acsc</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType acsc(genType x)</div><div class=\"ttdoc\">Inverse cosecant function. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00162_html_ga59dd0005b6474eea48af743b4f14ebbb\"><div class=\"ttname\"><a href=\"a00162.html#ga59dd0005b6474eea48af743b4f14ebbb\">glm::csc</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType csc(genType angle)</div><div class=\"ttdoc\">Cosecant function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_ga6d95843ff3ca6472ab399ba171d290a0\"><div class=\"ttname\"><a href=\"a00162.html#ga6d95843ff3ca6472ab399ba171d290a0\">glm::csch</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType csch(genType angle)</div><div class=\"ttdoc\">Cosecant hyperbolic function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_ga6b8b770eb7198e4dea59d52e6db81442\"><div class=\"ttname\"><a href=\"a00162.html#ga6b8b770eb7198e4dea59d52e6db81442\">glm::coth</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType coth(genType angle)</div><div class=\"ttdoc\">Cotangent hyperbolic function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_ga4b50aa5e5afc7e19ec113ab91596c576\"><div class=\"ttname\"><a href=\"a00162.html#ga4b50aa5e5afc7e19ec113ab91596c576\">glm::acsch</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType acsch(genType x)</div><div class=\"ttdoc\">Inverse cosecant hyperbolic function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_ga9a5cfd1e7170104a7b33863b1b75e5ae\"><div class=\"ttname\"><a href=\"a00162.html#ga9a5cfd1e7170104a7b33863b1b75e5ae\">glm::sech</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType sech(genType angle)</div><div class=\"ttdoc\">Secant hyperbolic function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_gaeadfb9c9d71093f7865b2ba2ca8d104d\"><div class=\"ttname\"><a href=\"a00162.html#gaeadfb9c9d71093f7865b2ba2ca8d104d\">glm::acot</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType acot(genType x)</div><div class=\"ttdoc\">Inverse cotangent function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_ga3a7b517a95bbd3ad74da3aea87a66314\"><div class=\"ttname\"><a href=\"a00162.html#ga3a7b517a95bbd3ad74da3aea87a66314\">glm::cot</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType cot(genType angle)</div><div class=\"ttdoc\">Cotangent function. </div></div>\n<div class=\"ttc\" id=\"a00162_html_gaec7586dccfe431f850d006f3824b8ca6\"><div class=\"ttname\"><a href=\"a00162.html#gaec7586dccfe431f850d006f3824b8ca6\">glm::asech</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType asech(genType x)</div><div class=\"ttdoc\">Inverse secant hyperbolic function. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00089.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: rotate_normalized_axis.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">rotate_normalized_axis.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00215.html\">GLM_GTX_rotate_normalized_axis</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00089_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga50efd7ebca0f7a603bb3cc11e34c708d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga50efd7ebca0f7a603bb3cc11e34c708d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00215.html#ga50efd7ebca0f7a603bb3cc11e34c708d\">rotateNormalizedAxis</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:ga50efd7ebca0f7a603bb3cc11e34c708d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a rotation 4 * 4 matrix created from a normalized axis and an angle.  <a href=\"a00215.html#ga50efd7ebca0f7a603bb3cc11e34c708d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50efd7ebca0f7a603bb3cc11e34c708d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad5bb8a155ee52fd349b88cec3a843600\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad5bb8a155ee52fd349b88cec3a843600\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00215.html#gad5bb8a155ee52fd349b88cec3a843600\">rotateNormalizedAxis</a> (tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:gad5bb8a155ee52fd349b88cec3a843600\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotates a quaternion from a vector of 3 components normalized axis and an angle.  <a href=\"a00215.html#gad5bb8a155ee52fd349b88cec3a843600\">More...</a><br /></td></tr>\n<tr class=\"separator:gad5bb8a155ee52fd349b88cec3a843600\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00215.html\">GLM_GTX_rotate_normalized_axis</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00089_source.html\">rotate_normalized_axis.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00089_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: rotate_normalized_axis.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">rotate_normalized_axis.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00089.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/epsilon.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_rotate_normalized_axis is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_rotate_normalized_axis extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00215.html#gad5bb8a155ee52fd349b88cec3a843600\">rotateNormalizedAxis</a>(</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m,</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>,</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a>);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        GLM_FUNC_DECL tquat&lt;T, Q&gt; <a class=\"code\" href=\"a00215.html#gad5bb8a155ee52fd349b88cec3a843600\">rotateNormalizedAxis</a>(</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                tquat&lt;T, Q&gt; <span class=\"keyword\">const</span>&amp; q,</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>,</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a>);</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">#include &quot;rotate_normalized_axis.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00215_html_gad5bb8a155ee52fd349b88cec3a843600\"><div class=\"ttname\"><a href=\"a00215.html#gad5bb8a155ee52fd349b88cec3a843600\">glm::rotateNormalizedAxis</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, Q &gt; rotateNormalizedAxis(tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</div><div class=\"ttdoc\">Rotates a quaternion from a vector of 3 components normalized axis and an angle. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaf2707d3081789ce097daaa6e54d5287\"><div class=\"ttname\"><a href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">glm::axis</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; axis(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the q rotation axis. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00090.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: rotate_vector.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">rotate_vector.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00216.html\">GLM_GTX_rotate_vector</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00090_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga1a32fceb71962e6160e8af295c91930a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1a32fceb71962e6160e8af295c91930a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">orientation</a> (vec&lt; 3, T, Q &gt; const &amp;Normal, vec&lt; 3, T, Q &gt; const &amp;Up)</td></tr>\n<tr class=\"memdesc:ga1a32fceb71962e6160e8af295c91930a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a rotation matrix from a normal and a up vector.  <a href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a32fceb71962e6160e8af295c91930a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab64a67b52ff4f86c3ba16595a5a25af6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab64a67b52ff4f86c3ba16595a5a25af6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#gab64a67b52ff4f86c3ba16595a5a25af6\">rotate</a> (vec&lt; 2, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:gab64a67b52ff4f86c3ba16595a5a25af6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a two dimensional vector.  <a href=\"a00216.html#gab64a67b52ff4f86c3ba16595a5a25af6\">More...</a><br /></td></tr>\n<tr class=\"separator:gab64a67b52ff4f86c3ba16595a5a25af6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ba501ef83d1a009a17ac774cc560f21\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1ba501ef83d1a009a17ac774cc560f21\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga1ba501ef83d1a009a17ac774cc560f21\">rotate</a> (vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga1ba501ef83d1a009a17ac774cc560f21\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a three dimensional vector around an axis.  <a href=\"a00216.html#ga1ba501ef83d1a009a17ac774cc560f21\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1ba501ef83d1a009a17ac774cc560f21\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1005f1267ed9c57faa3f24cf6873b961\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1005f1267ed9c57faa3f24cf6873b961\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga1005f1267ed9c57faa3f24cf6873b961\">rotate</a> (vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga1005f1267ed9c57faa3f24cf6873b961\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a four dimensional vector around an axis.  <a href=\"a00216.html#ga1005f1267ed9c57faa3f24cf6873b961\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1005f1267ed9c57faa3f24cf6873b961\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga059fdbdba4cca35cdff172a9d0d0afc9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga059fdbdba4cca35cdff172a9d0d0afc9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga059fdbdba4cca35cdff172a9d0d0afc9\">rotateX</a> (vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga059fdbdba4cca35cdff172a9d0d0afc9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a three dimensional vector around the X axis.  <a href=\"a00216.html#ga059fdbdba4cca35cdff172a9d0d0afc9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga059fdbdba4cca35cdff172a9d0d0afc9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4333b1ea8ebf1bd52bc3801a7617398a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4333b1ea8ebf1bd52bc3801a7617398a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a\">rotateX</a> (vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga4333b1ea8ebf1bd52bc3801a7617398a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a four dimensional vector around the X axis.  <a href=\"a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4333b1ea8ebf1bd52bc3801a7617398a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebdc8b054ace27d9f62e054531c6f44d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaebdc8b054ace27d9f62e054531c6f44d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#gaebdc8b054ace27d9f62e054531c6f44d\">rotateY</a> (vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:gaebdc8b054ace27d9f62e054531c6f44d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a three dimensional vector around the Y axis.  <a href=\"a00216.html#gaebdc8b054ace27d9f62e054531c6f44d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebdc8b054ace27d9f62e054531c6f44d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ce3db0867b7f8efd878ee34f95a623b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3ce3db0867b7f8efd878ee34f95a623b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b\">rotateY</a> (vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga3ce3db0867b7f8efd878ee34f95a623b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a four dimensional vector around the Y axis.  <a href=\"a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ce3db0867b7f8efd878ee34f95a623b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5a048838a03f6249acbacb4dbacf79c4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5a048838a03f6249acbacb4dbacf79c4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga5a048838a03f6249acbacb4dbacf79c4\">rotateZ</a> (vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga5a048838a03f6249acbacb4dbacf79c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a three dimensional vector around the Z axis.  <a href=\"a00216.html#ga5a048838a03f6249acbacb4dbacf79c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5a048838a03f6249acbacb4dbacf79c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga923b75c6448161053768822d880702e6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga923b75c6448161053768822d880702e6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga923b75c6448161053768822d880702e6\">rotateZ</a> (vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga923b75c6448161053768822d880702e6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a four dimensional vector around the Z axis.  <a href=\"a00216.html#ga923b75c6448161053768822d880702e6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga923b75c6448161053768822d880702e6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b11b18ce824174ea1a5a69ea14e2cee\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8b11b18ce824174ea1a5a69ea14e2cee\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga8b11b18ce824174ea1a5a69ea14e2cee\">slerp</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, T const &amp;a)</td></tr>\n<tr class=\"memdesc:ga8b11b18ce824174ea1a5a69ea14e2cee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns Spherical interpolation between two vectors.  <a href=\"a00216.html#ga8b11b18ce824174ea1a5a69ea14e2cee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b11b18ce824174ea1a5a69ea14e2cee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00216.html\">GLM_GTX_rotate_vector</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00221.html\" title=\"Include <glm/gtx/transform.hpp> to use the features of this extension. \">GLM_GTX_transform</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00090_source.html\">rotate_vector.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00090_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: rotate_vector.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">rotate_vector.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00090.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/transform.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_rotate_vector is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_rotate_vector extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga8b11b18ce824174ea1a5a69ea14e2cee\">slerp</a>(</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x,</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; y,</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                T <span class=\"keyword\">const</span>&amp; a);</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga1005f1267ed9c57faa3f24cf6873b961\">rotate</a>(</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga1005f1267ed9c57faa3f24cf6873b961\">rotate</a>(</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>,</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; normal);</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga1005f1267ed9c57faa3f24cf6873b961\">rotate</a>(</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>,</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; normal);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a\">rotateX</a>(</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b\">rotateY</a>(</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga923b75c6448161053768822d880702e6\">rotateZ</a>(</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a\">rotateX</a>(</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b\">rotateY</a>(</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga923b75c6448161053768822d880702e6\">rotateZ</a>(</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v,</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;                T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">orientation</a>(</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; Normal,</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; Up);</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;<span class=\"preprocessor\">#include &quot;rotate_vector.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00216_html_ga3ce3db0867b7f8efd878ee34f95a623b\"><div class=\"ttname\"><a href=\"a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b\">glm::rotateY</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt; rotateY(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</div><div class=\"ttdoc\">Rotate a four dimensional vector around the Y axis. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00216_html_ga1a32fceb71962e6160e8af295c91930a\"><div class=\"ttname\"><a href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">glm::orientation</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; orientation(vec&lt; 3, T, Q &gt; const &amp;Normal, vec&lt; 3, T, Q &gt; const &amp;Up)</div><div class=\"ttdoc\">Build a rotation matrix from a normal and a up vector. </div></div>\n<div class=\"ttc\" id=\"a00216_html_ga8b11b18ce824174ea1a5a69ea14e2cee\"><div class=\"ttname\"><a href=\"a00216.html#ga8b11b18ce824174ea1a5a69ea14e2cee\">glm::slerp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt; slerp(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, T const &amp;a)</div><div class=\"ttdoc\">Returns Spherical interpolation between two vectors. </div></div>\n<div class=\"ttc\" id=\"a00216_html_ga923b75c6448161053768822d880702e6\"><div class=\"ttname\"><a href=\"a00216.html#ga923b75c6448161053768822d880702e6\">glm::rotateZ</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt; rotateZ(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</div><div class=\"ttdoc\">Rotate a four dimensional vector around the Z axis. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00216_html_ga1005f1267ed9c57faa3f24cf6873b961\"><div class=\"ttname\"><a href=\"a00216.html#ga1005f1267ed9c57faa3f24cf6873b961\">glm::rotate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt; rotate(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)</div><div class=\"ttdoc\">Rotate a four dimensional vector around an axis. </div></div>\n<div class=\"ttc\" id=\"a00216_html_ga4333b1ea8ebf1bd52bc3801a7617398a\"><div class=\"ttname\"><a href=\"a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a\">glm::rotateX</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt; rotateX(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</div><div class=\"ttdoc\">Rotate a four dimensional vector around the X axis. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00091.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: round.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">round.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00163.html\">GLM_GTC_round</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00091_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gac84898c466e609cdd2e81d9ba907d9e8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gac84898c466e609cdd2e81d9ba907d9e8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gac84898c466e609cdd2e81d9ba907d9e8\">ceilMultiple</a> (genType Source, genType Multiple)</td></tr>\n<tr class=\"memdesc:gac84898c466e609cdd2e81d9ba907d9e8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Higher multiple number of Source.  <a href=\"a00163.html#gac84898c466e609cdd2e81d9ba907d9e8\">More...</a><br /></td></tr>\n<tr class=\"separator:gac84898c466e609cdd2e81d9ba907d9e8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga073227936f36f9102cd3a8aa45871b26\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga073227936f36f9102cd3a8aa45871b26\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga073227936f36f9102cd3a8aa45871b26\">ceilMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</td></tr>\n<tr class=\"memdesc:ga073227936f36f9102cd3a8aa45871b26\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Higher multiple number of Source.  <a href=\"a00163.html#ga073227936f36f9102cd3a8aa45871b26\">More...</a><br /></td></tr>\n<tr class=\"separator:ga073227936f36f9102cd3a8aa45871b26\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa73c7690c787086fa3ac1c312264acab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gaa73c7690c787086fa3ac1c312264acab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gaa73c7690c787086fa3ac1c312264acab\">ceilPowerOfTwo</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:gaa73c7690c787086fa3ac1c312264acab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just higher the input value, round up to a power of two.  <a href=\"a00163.html#gaa73c7690c787086fa3ac1c312264acab\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa73c7690c787086fa3ac1c312264acab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac46c061058771cb31c467ef673d12c80\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac46c061058771cb31c467ef673d12c80\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gac46c061058771cb31c467ef673d12c80\">ceilPowerOfTwo</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:gac46c061058771cb31c467ef673d12c80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just higher the input value, round up to a power of two.  <a href=\"a00163.html#gac46c061058771cb31c467ef673d12c80\">More...</a><br /></td></tr>\n<tr class=\"separator:gac46c061058771cb31c467ef673d12c80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9eafb9dbedf84e5cece65c2fe9d5631d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9eafb9dbedf84e5cece65c2fe9d5631d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga9eafb9dbedf84e5cece65c2fe9d5631d\">floorMultiple</a> (genType Source, genType Multiple)</td></tr>\n<tr class=\"memdesc:ga9eafb9dbedf84e5cece65c2fe9d5631d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Lower multiple number of Source.  <a href=\"a00163.html#ga9eafb9dbedf84e5cece65c2fe9d5631d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9eafb9dbedf84e5cece65c2fe9d5631d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b6d6bcdf0641b54cb539104c224885b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2b6d6bcdf0641b54cb539104c224885b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga2b6d6bcdf0641b54cb539104c224885b\">floorMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</td></tr>\n<tr class=\"memdesc:ga2b6d6bcdf0641b54cb539104c224885b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Lower multiple number of Source.  <a href=\"a00163.html#ga2b6d6bcdf0641b54cb539104c224885b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b6d6bcdf0641b54cb539104c224885b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac80f6519c31baae10d8d7bea6735d1fa\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gac80f6519c31baae10d8d7bea6735d1fa\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gac80f6519c31baae10d8d7bea6735d1fa\">floorPowerOfTwo</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:gac80f6519c31baae10d8d7bea6735d1fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just lower the input value, round down to a power of two.  <a href=\"a00163.html#gac80f6519c31baae10d8d7bea6735d1fa\">More...</a><br /></td></tr>\n<tr class=\"separator:gac80f6519c31baae10d8d7bea6735d1fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6ebfea889605abf6629c7589e0cb2e28\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6ebfea889605abf6629c7589e0cb2e28\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga6ebfea889605abf6629c7589e0cb2e28\">floorPowerOfTwo</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga6ebfea889605abf6629c7589e0cb2e28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just lower the input value, round down to a power of two.  <a href=\"a00163.html#ga6ebfea889605abf6629c7589e0cb2e28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6ebfea889605abf6629c7589e0cb2e28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf7444a7b2eb524f373463ceba76b9326\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gaf7444a7b2eb524f373463ceba76b9326\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gaf7444a7b2eb524f373463ceba76b9326\">isMultiple</a> (genIUType Value, genIUType Multiple)</td></tr>\n<tr class=\"memdesc:gaf7444a7b2eb524f373463ceba76b9326\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the 'Value' is a multiple of 'Multiple'.  <a href=\"a00163.html#gaf7444a7b2eb524f373463ceba76b9326\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf7444a7b2eb524f373463ceba76b9326\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga908a61945ecb235817a9a87b249d4b2d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga908a61945ecb235817a9a87b249d4b2d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga908a61945ecb235817a9a87b249d4b2d\">isMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Value, T Multiple)</td></tr>\n<tr class=\"memdesc:ga908a61945ecb235817a9a87b249d4b2d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the 'Value' is a multiple of 'Multiple'.  <a href=\"a00163.html#ga908a61945ecb235817a9a87b249d4b2d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga908a61945ecb235817a9a87b249d4b2d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12b5f07c3ed46acc6838f159ca6ef368\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga12b5f07c3ed46acc6838f159ca6ef368\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368\">isMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Value, vec&lt; L, T, Q &gt; const &amp;Multiple)</td></tr>\n<tr class=\"memdesc:ga12b5f07c3ed46acc6838f159ca6ef368\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the 'Value' is a multiple of 'Multiple'.  <a href=\"a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12b5f07c3ed46acc6838f159ca6ef368\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebf826fbb6e0a70eeaab0792d89b25ec\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gaebf826fbb6e0a70eeaab0792d89b25ec\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gaebf826fbb6e0a70eeaab0792d89b25ec\">isPowerOfTwo</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:gaebf826fbb6e0a70eeaab0792d89b25ec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the value is a power of two number.  <a href=\"a00163.html#gaebf826fbb6e0a70eeaab0792d89b25ec\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebf826fbb6e0a70eeaab0792d89b25ec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga866a7bbd725d7d40b5d433d02bf70f17\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga866a7bbd725d7d40b5d433d02bf70f17\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17\">isPowerOfTwo</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga866a7bbd725d7d40b5d433d02bf70f17\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the value is a power of two number.  <a href=\"a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17\">More...</a><br /></td></tr>\n<tr class=\"separator:ga866a7bbd725d7d40b5d433d02bf70f17\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6739d1de04b2cea7c78675b365644bce\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6739d1de04b2cea7c78675b365644bce\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga6739d1de04b2cea7c78675b365644bce\">roundMultiple</a> (genType Source, genType Multiple)</td></tr>\n<tr class=\"memdesc:ga6739d1de04b2cea7c78675b365644bce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Lower multiple number of Source.  <a href=\"a00163.html#ga6739d1de04b2cea7c78675b365644bce\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6739d1de04b2cea7c78675b365644bce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga812d27fa1a60c48dc111d67da26b1455\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga812d27fa1a60c48dc111d67da26b1455\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga812d27fa1a60c48dc111d67da26b1455\">roundMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</td></tr>\n<tr class=\"memdesc:ga812d27fa1a60c48dc111d67da26b1455\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Lower multiple number of Source.  <a href=\"a00163.html#ga812d27fa1a60c48dc111d67da26b1455\">More...</a><br /></td></tr>\n<tr class=\"separator:ga812d27fa1a60c48dc111d67da26b1455\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d24a9e3abe3e6a908661b43acb8efe0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga6d24a9e3abe3e6a908661b43acb8efe0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga6d24a9e3abe3e6a908661b43acb8efe0\">roundPowerOfTwo</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:ga6d24a9e3abe3e6a908661b43acb8efe0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is the closet to the input value.  <a href=\"a00163.html#ga6d24a9e3abe3e6a908661b43acb8efe0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d24a9e3abe3e6a908661b43acb8efe0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6\">roundPowerOfTwo</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is the closet to the input value.  <a href=\"a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00163.html\">GLM_GTC_round</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00091_source.html\">round.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00091_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: round.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">round.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00091.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/_vectorize.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../vector_relational.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../common.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_integer extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17\">isPowerOfTwo</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17\">isPowerOfTwo</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00163.html#gac46c061058771cb31c467ef673d12c80\">ceilPowerOfTwo</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00163.html#gac46c061058771cb31c467ef673d12c80\">ceilPowerOfTwo</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00163.html#ga6ebfea889605abf6629c7589e0cb2e28\">floorPowerOfTwo</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00163.html#ga6ebfea889605abf6629c7589e0cb2e28\">floorPowerOfTwo</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        GLM_FUNC_DECL genIUType <a class=\"code\" href=\"a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6\">roundPowerOfTwo</a>(genIUType Value);</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6\">roundPowerOfTwo</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genIUType&gt;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368\">isMultiple</a>(genIUType Value, genIUType Multiple);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368\">isMultiple</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Value, T Multiple);</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368\">isMultiple</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Value, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Multiple);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00163.html#ga073227936f36f9102cd3a8aa45871b26\">ceilMultiple</a>(genType Source, genType Multiple);</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00163.html#ga073227936f36f9102cd3a8aa45871b26\">ceilMultiple</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Source, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Multiple);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00163.html#ga2b6d6bcdf0641b54cb539104c224885b\">floorMultiple</a>(genType Source, genType Multiple);</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00163.html#ga2b6d6bcdf0641b54cb539104c224885b\">floorMultiple</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Source, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Multiple);</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00163.html#ga812d27fa1a60c48dc111d67da26b1455\">roundMultiple</a>(genType Source, genType Multiple);</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00163.html#ga812d27fa1a60c48dc111d67da26b1455\">roundMultiple</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Source, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; Multiple);</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;<span class=\"preprocessor\">#include &quot;round.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00163_html_ga812d27fa1a60c48dc111d67da26b1455\"><div class=\"ttname\"><a href=\"a00163.html#ga812d27fa1a60c48dc111d67da26b1455\">glm::roundMultiple</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; roundMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</div><div class=\"ttdoc\">Lower multiple number of Source. </div></div>\n<div class=\"ttc\" id=\"a00163_html_ga12b5f07c3ed46acc6838f159ca6ef368\"><div class=\"ttname\"><a href=\"a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368\">glm::isMultiple</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; isMultiple(vec&lt; L, T, Q &gt; const &amp;Value, vec&lt; L, T, Q &gt; const &amp;Multiple)</div><div class=\"ttdoc\">Return true if the &#39;Value&#39; is a multiple of &#39;Multiple&#39;. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00163_html_gac46c061058771cb31c467ef673d12c80\"><div class=\"ttname\"><a href=\"a00163.html#gac46c061058771cb31c467ef673d12c80\">glm::ceilPowerOfTwo</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; ceilPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)</div><div class=\"ttdoc\">Return the power of two number which value is just higher the input value, round up to a power of two...</div></div>\n<div class=\"ttc\" id=\"a00163_html_ga6ebfea889605abf6629c7589e0cb2e28\"><div class=\"ttname\"><a href=\"a00163.html#ga6ebfea889605abf6629c7589e0cb2e28\">glm::floorPowerOfTwo</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; floorPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)</div><div class=\"ttdoc\">Return the power of two number which value is just lower the input value, round down to a power of tw...</div></div>\n<div class=\"ttc\" id=\"a00163_html_ga866a7bbd725d7d40b5d433d02bf70f17\"><div class=\"ttname\"><a href=\"a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17\">glm::isPowerOfTwo</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; isPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)</div><div class=\"ttdoc\">Return true if the value is a power of two number. </div></div>\n<div class=\"ttc\" id=\"a00163_html_ga073227936f36f9102cd3a8aa45871b26\"><div class=\"ttname\"><a href=\"a00163.html#ga073227936f36f9102cd3a8aa45871b26\">glm::ceilMultiple</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; ceilMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</div><div class=\"ttdoc\">Higher multiple number of Source. </div></div>\n<div class=\"ttc\" id=\"a00163_html_ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><div class=\"ttname\"><a href=\"a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6\">glm::roundPowerOfTwo</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; roundPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)</div><div class=\"ttdoc\">Return the power of two number which value is the closet to the input value. </div></div>\n<div class=\"ttc\" id=\"a00163_html_ga2b6d6bcdf0641b54cb539104c224885b\"><div class=\"ttname\"><a href=\"a00163.html#ga2b6d6bcdf0641b54cb539104c224885b\">glm::floorMultiple</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; floorMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</div><div class=\"ttdoc\">Lower multiple number of Source. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00092.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: scalar_multiplication.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">scalar_multiplication.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00148.html\">Experimental extensions</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00092_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00148.html\">Experimental extensions</a> </p>\n<dl class=\"section author\"><dt>Author</dt><dd>Joshua Moerman</dd></dl>\n<p>Include &lt;<a class=\"el\" href=\"a00092.html\" title=\"Experimental extensions \">glm/gtx/scalar_multiplication.hpp</a>&gt; to use the features of this extension.</p>\n<p>Enables scalar multiplication for all types</p>\n<p>Since GLSL is very strict about types, the following (often used) combinations do not work: double * vec4 int * vec4 vec4 / int So we'll fix that! Of course \"float * vec4\" should remain the same (hence the enable_if magic) </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00092_source.html\">scalar_multiplication.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00092_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: scalar_multiplication.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">scalar_multiplication.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00092.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_scalar_multiplication is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if !GLM_HAS_TEMPLATE_ALIASES &amp;&amp; !(GLM_COMPILER &amp; GLM_COMPILER_GCC)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM_GTX_scalar_multiplication requires C++11 support or alias templates and if not support for GCC&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#include &lt;type_traits&gt;</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, <span class=\"keyword\">typename</span> Vec&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        <span class=\"keyword\">using</span> return_type_scalar_multiplication = <span class=\"keyword\">typename</span> std::enable_if&lt;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                !std::is_same&lt;T, float&gt;::value       <span class=\"comment\">// T may not be a float</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                &amp;&amp; std::is_arithmetic&lt;T&gt;::value, Vec <span class=\"comment\">// But it may be an int or double (no vec3 or mat3, ...)</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        &gt;::type;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#define GLM_IMPLEMENT_SCAL_MULT(Vec) \\</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">        template&lt;typename T&gt; \\</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">        return_type_scalar_multiplication&lt;T, Vec&gt; \\</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;<span class=\"preprocessor\">        operator*(T const&amp; s, Vec rh){ \\</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"preprocessor\">                return rh *= static_cast&lt;float&gt;(s); \\</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;<span class=\"preprocessor\">        } \\</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">         \\</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"preprocessor\">        template&lt;typename T&gt; \\</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">        return_type_scalar_multiplication&lt;T, Vec&gt; \\</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">        operator*(Vec lh, T const&amp; s){ \\</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">                return lh *= static_cast&lt;float&gt;(s); \\</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"preprocessor\">        } \\</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"preprocessor\">         \\</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"preprocessor\">        template&lt;typename T&gt; \\</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"preprocessor\">        return_type_scalar_multiplication&lt;T, Vec&gt; \\</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"preprocessor\">        operator/(Vec lh, T const&amp; s){ \\</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"preprocessor\">                return lh *= 1.0f / s; \\</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;<span class=\"preprocessor\">        }</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a>)</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a>)</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a>)</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">mat2</a>)</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#gafb063d734266e92915d87f8943560471\">mat2x3</a>)</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">mat2x4</a>)</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">mat3x2</a>)</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">mat3</a>)</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">mat3x4</a>)</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">mat4x2</a>)</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">mat4x3</a>)</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;GLM_IMPLEMENT_SCAL_MULT(<a class=\"code\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">mat4</a>)</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;<span class=\"preprocessor\">#undef GLM_IMPLEMENT_SCAL_MULT</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;} <span class=\"comment\">// namespace glm</span></div>\n<div class=\"ttc\" id=\"a00144_html_ga4d2ac1a80c36fb5a1d15914035f792ac\"><div class=\"ttname\"><a href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">glm::mat2x4</a></div><div class=\"ttdeci\">highp_mat2x4 mat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00368\">type_mat.hpp:368</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga7876e0c3e3fcc3e2f4c0462c152e87cf\"><div class=\"ttname\"><a href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">glm::mat3x4</a></div><div class=\"ttdeci\">highp_mat3x4 mat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00383\">type_mat.hpp:383</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga6dd3ec98a548755676267e59142911f8\"><div class=\"ttname\"><a href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">glm::mat3</a></div><div class=\"ttdeci\">mat3x3 mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00410\">type_mat.hpp:410</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga09d0200e8ff86391d8804b4fefd5f1da\"><div class=\"ttname\"><a href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">glm::vec2</a></div><div class=\"ttdeci\">highp_vec2 vec2</div><div class=\"ttdoc\">2 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00457\">type_vec.hpp:457</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gafb063d734266e92915d87f8943560471\"><div class=\"ttname\"><a href=\"a00144.html#gafb063d734266e92915d87f8943560471\">glm::mat2x3</a></div><div class=\"ttdeci\">highp_mat2x3 mat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00363\">type_mat.hpp:363</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga3839ca29d011a80ff3ede7f22ba602a4\"><div class=\"ttname\"><a href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">glm::mat3x2</a></div><div class=\"ttdeci\">highp_mat3x2 mat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00373\">type_mat.hpp:373</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gade0eb47c01f79384a6f38017ede17446\"><div class=\"ttname\"><a href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">glm::mat4</a></div><div class=\"ttdeci\">mat4x4 mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00415\">type_mat.hpp:415</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga6e30cfba068ebc3c71fe1f8b3110e450\"><div class=\"ttname\"><a href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">glm::mat2</a></div><div class=\"ttdeci\">mat2x2 mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00405\">type_mat.hpp:405</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gafbab23070ca47932487d25332adc7d7c\"><div class=\"ttname\"><a href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a></div><div class=\"ttdeci\">highp_vec4 vec4</div><div class=\"ttdoc\">4 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00467\">type_vec.hpp:467</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaa8ea2429bb3cb41a715258a447f39897\"><div class=\"ttname\"><a href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">glm::vec3</a></div><div class=\"ttdeci\">highp_vec3 vec3</div><div class=\"ttdoc\">3 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00462\">type_vec.hpp:462</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga1b3f6a5cbc17362141f9781262ed838f\"><div class=\"ttname\"><a href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">glm::mat4x2</a></div><div class=\"ttdeci\">highp_mat4x2 mat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00388\">type_mat.hpp:388</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gacd9ff3b943b3d8bda4f4b388320420fd\"><div class=\"ttname\"><a href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">glm::mat4x3</a></div><div class=\"ttdeci\">highp_mat4x3 mat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00393\">type_mat.hpp:393</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00093.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: scalar_relational.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">scalar_relational.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00217.html\">GLM_GTX_scalar_relational</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00093_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00217.html\">GLM_GTX_scalar_relational</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00093_source.html\">scalar_relational.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00093_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: scalar_relational.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">scalar_relational.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00093.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_extend extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#include &quot;scalar_relational.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00094.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: setup.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">setup.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00094_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00094_source.html\">setup.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00094_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: setup.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">setup.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00094.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#ifndef GLM_SETUP_INCLUDED</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#define GLM_VERSION_MAJOR                       0</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#define GLM_VERSION_MINOR                       9</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#define GLM_VERSION_PATCH                       9</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#define GLM_VERSION_REVISION            0</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#define GLM_VERSION                                     990</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#define GLM_SETUP_INCLUDED GLM_VERSION</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#if defined(GLM_FORCE_SWIZZLE) &amp;&amp; defined(GLM_FORCE_UNRESTRICTED_GENTYPE)</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#       error &quot;Both GLM_FORCE_SWIZZLE and GLM_FORCE_UNRESTRICTED_GENTYPE can&#39;t be defined at the same time&quot;</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &lt;cassert&gt;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"comment\">// Messages</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#define GLM_MESSAGES_ENABLED 1</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#define GLM_MESSAGES_DISABLE 0</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#if defined(GLM_FORCE_MESSAGES)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGES GLM_MESSAGES_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGES GLM_MESSAGES_DISABLE</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"comment\">// Detect the platform</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#include &quot;../simd/platform.h&quot;</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"comment\">// Version</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_VERSION_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_VERSION_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">#       pragma message (&quot;GLM: version 0.9.9.0&quot;)</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;<span class=\"comment\">// Report compiler detection</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_COMPILER_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_COMPILER_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#       if GLM_COMPILER &amp; GLM_COMPILER_CUDA</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: CUDA compiler detected&quot;)</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Visual C++ compiler detected&quot;)</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Clang compiler detected&quot;)</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_INTEL</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Intel Compiler detected&quot;)</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: GCC compiler detected&quot;)</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Compiler not detected&quot;)</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"comment\">// Build model</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\">#if defined(__arch64__) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__)</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">#       define GLM_MODEL        GLM_MODEL_64</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\">#elif defined(__i386__) || defined(__ppc__)</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;<span class=\"preprocessor\">#       define GLM_MODEL        GLM_MODEL_32</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;<span class=\"preprocessor\">#       define GLM_MODEL        GLM_MODEL_32</span></div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"preprocessor\">#endif//</span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"preprocessor\">#if !defined(GLM_MODEL) &amp;&amp; GLM_COMPILER != 0</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message.&quot;</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;<span class=\"preprocessor\">#endif//GLM_MODEL</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_MODEL_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_MODEL_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"preprocessor\">#       if(GLM_MODEL == GLM_MODEL_64)</span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: 64 bits model&quot;)</span></div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;<span class=\"preprocessor\">#       elif(GLM_MODEL == GLM_MODEL_32)</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: 32 bits model&quot;)</span></div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;<span class=\"preprocessor\">#       endif//GLM_MODEL</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_ARCH_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_ARCH_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;<span class=\"preprocessor\">#       if(GLM_ARCH == GLM_ARCH_PURE)</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Platform independent code&quot;)</span></div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_AVX2)</span></div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: AVX2 instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_AVX)</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: AVX instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_SSE42)</span></div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: SSE4.2 instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_SSE41)</span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: SSE4.1 instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_SSSE3)</span></div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: SSSE3 instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_SSE3)</span></div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: SSE3 instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_SSE2)</span></div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: SSE2 instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_X86)</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: x86 instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_NEON)</span></div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: NEON instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_ARM)</span></div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: ARM instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_MIPS)</span></div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: MIPS instruction set&quot;)</span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;<span class=\"preprocessor\">#       elif(GLM_ARCH == GLM_ARCH_PPC)</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: PowerPC architechture&quot;)</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;<span class=\"preprocessor\">#       endif//GLM_ARCH</span></div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;<span class=\"comment\">// C++ Version</span></div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;<span class=\"comment\">// User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14</span></div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX98_FLAG                     (1 &lt;&lt; 1)</span></div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX03_FLAG                     (1 &lt;&lt; 2)</span></div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX0X_FLAG                     (1 &lt;&lt; 3)</span></div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX11_FLAG                     (1 &lt;&lt; 4)</span></div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX1Y_FLAG                     (1 &lt;&lt; 5)</span></div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX14_FLAG                     (1 &lt;&lt; 6)</span></div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX1Z_FLAG                     (1 &lt;&lt; 7)</span></div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXXMS_FLAG                     (1 &lt;&lt; 8)</span></div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXXGNU_FLAG            (1 &lt;&lt; 9)</span></div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX98                  GLM_LANG_CXX98_FLAG</span></div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX03                  (GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX0X                  (GLM_LANG_CXX03 | GLM_LANG_CXX0X_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX11                  (GLM_LANG_CXX0X | GLM_LANG_CXX11_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX1Y                  (GLM_LANG_CXX11 | GLM_LANG_CXX1Y_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX14                  (GLM_LANG_CXX1Y | GLM_LANG_CXX14_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXX1Z                  (GLM_LANG_CXX14 | GLM_LANG_CXX1Z_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXXMS                  GLM_LANG_CXXMS_FLAG</span></div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;<span class=\"preprocessor\">#define GLM_LANG_CXXGNU                 GLM_LANG_CXXGNU_FLAG</span></div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;<span class=\"preprocessor\">#if defined(GLM_FORCE_CXX14)</span></div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;<span class=\"preprocessor\">#       if((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &lt;= GLM_COMPILER_GCC50)) || ((GLM_COMPILER &amp; GLM_COMPILER_CLANG) &amp;&amp; (GLM_COMPILER &lt;= GLM_COMPILER_CLANG34))</span></div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;<span class=\"preprocessor\">#                       pragma message(&quot;GLM: Using GLM_FORCE_CXX14 with a compiler that doesn&#39;t fully support C++14&quot;)</span></div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;<span class=\"preprocessor\">#                       pragma message(&quot;GLM: Using GLM_FORCE_CXX14 but there is no known version of Visual C++ compiler that fully supports C++14&quot;)</span></div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_INTEL</span></div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;<span class=\"preprocessor\">#                       pragma message(&quot;GLM: Using GLM_FORCE_CXX14 but there is no known version of ICC compiler that fully supports C++14&quot;)</span></div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;<span class=\"preprocessor\">#       define GLM_LANG GLM_LANG_CXX14</span></div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;<span class=\"preprocessor\">#       define GLM_LANG_STL11_FORCED</span></div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;<span class=\"preprocessor\">#elif defined(GLM_FORCE_CXX11)</span></div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;<span class=\"preprocessor\">#       if((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &lt;= GLM_COMPILER_GCC48)) || ((GLM_COMPILER &amp; GLM_COMPILER_CLANG) &amp;&amp; (GLM_COMPILER &lt;= GLM_COMPILER_CLANG33))</span></div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;<span class=\"preprocessor\">#                       pragma message(&quot;GLM: Using GLM_FORCE_CXX11 with a compiler that doesn&#39;t fully support C++11&quot;)</span></div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;<span class=\"preprocessor\">#                       pragma message(&quot;GLM: Using GLM_FORCE_CXX11 but there is no known version of Visual C++ compiler that fully supports C++11&quot;)</span></div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_INTEL</span></div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;<span class=\"preprocessor\">#                       pragma message(&quot;GLM: Using GLM_FORCE_CXX11 but there is no known version of ICC compiler that fully supports C++11&quot;)</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;<span class=\"preprocessor\">#       define GLM_LANG GLM_LANG_CXX11</span></div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;<span class=\"preprocessor\">#       define GLM_LANG_STL11_FORCED</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;<span class=\"preprocessor\">#elif defined(GLM_FORCE_CXX03)</span></div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;<span class=\"preprocessor\">#       define GLM_LANG GLM_LANG_CXX03</span></div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;<span class=\"preprocessor\">#elif defined(GLM_FORCE_CXX98)</span></div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;<span class=\"preprocessor\">#       define GLM_LANG GLM_LANG_CXX98</span></div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;<span class=\"preprocessor\">#       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;<span class=\"preprocessor\">#               if __cplusplus &gt;= 201402L // GLM_COMPILER_CLANG34 + -std=c++14</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX14</span></div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;<span class=\"preprocessor\">#               elif __has_feature(cxx_decltype_auto) &amp;&amp; __has_feature(cxx_aggregate_nsdmi) // GLM_COMPILER_CLANG33 + -std=c++1y</span></div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX1Y</span></div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;<span class=\"preprocessor\">#               elif __cplusplus &gt;= 201103L // GLM_COMPILER_CLANG33 + -std=c++11</span></div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX11</span></div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;<span class=\"preprocessor\">#               elif __has_feature(cxx_static_assert) // GLM_COMPILER_CLANG29 + -std=c++11</span></div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX0X</span></div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;<span class=\"preprocessor\">#               elif __cplusplus &gt;= 199711L</span></div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX98</span></div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX</span></div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;<span class=\"preprocessor\">#               if __cplusplus &gt;= 201402L</span></div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX14</span></div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;<span class=\"preprocessor\">#               elif __cplusplus &gt;= 201103L</span></div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX11</span></div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;<span class=\"preprocessor\">#               elif defined(__GXX_EXPERIMENTAL_CXX0X__)</span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX0X</span></div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX98</span></div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;<span class=\"preprocessor\">#               ifdef _MSC_EXTENSIONS</span></div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;<span class=\"preprocessor\">#                       if __cplusplus &gt;= 201402L</span></div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;<span class=\"preprocessor\">#                               define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_CXXMS_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;<span class=\"preprocessor\">#                       elif __cplusplus &gt;= 201103L</span></div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;<span class=\"preprocessor\">#                               define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_CXXMS_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;<span class=\"preprocessor\">#                       else</span></div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;<span class=\"preprocessor\">#                               define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_CXXMS_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;<span class=\"preprocessor\">#                       if __cplusplus &gt;= 201402L</span></div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;<span class=\"preprocessor\">#                               define GLM_LANG GLM_LANG_CXX14</span></div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;<span class=\"preprocessor\">#                       elif __cplusplus &gt;= 201103L</span></div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;<span class=\"preprocessor\">#                               define GLM_LANG GLM_LANG_CXX11</span></div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;<span class=\"preprocessor\">#                       else</span></div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;<span class=\"preprocessor\">#                               define GLM_LANG GLM_LANG_CXX0X</span></div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_INTEL</span></div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;<span class=\"preprocessor\">#               ifdef _MSC_EXTENSIONS</span></div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;<span class=\"preprocessor\">#                       define GLM_MSC_EXT GLM_LANG_CXXMS_FLAG</span></div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;<span class=\"preprocessor\">#                       define GLM_MSC_EXT 0</span></div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;<span class=\"preprocessor\">#               if __cplusplus &gt;= 201402L</span></div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG (GLM_LANG_CXX14 | GLM_MSC_EXT)</span></div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;<span class=\"preprocessor\">#               elif __cplusplus &gt;= 201103L</span></div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG (GLM_LANG_CXX11 | GLM_MSC_EXT)</span></div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;<span class=\"preprocessor\">#               elif __INTEL_CXX11_MODE__</span></div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG (GLM_LANG_CXX0X | GLM_MSC_EXT)</span></div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;<span class=\"preprocessor\">#               elif __cplusplus &gt;= 199711L</span></div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG (GLM_LANG_CXX98 | GLM_MSC_EXT)</span></div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG (GLM_LANG_CXX | GLM_MSC_EXT)</span></div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_CUDA</span></div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;<span class=\"preprocessor\">#               ifdef _MSC_EXTENSIONS</span></div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;<span class=\"preprocessor\">#                       define GLM_MSC_EXT GLM_LANG_CXXMS_FLAG</span></div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;<span class=\"preprocessor\">#                       define GLM_MSC_EXT 0</span></div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;<span class=\"preprocessor\">#               if GLM_COMPILER &gt;= GLM_COMPILER_CUDA75</span></div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG (GLM_LANG_CXX0X | GLM_MSC_EXT)</span></div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG (GLM_LANG_CXX98 | GLM_MSC_EXT)</span></div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;<span class=\"preprocessor\">#       else // Unknown compiler</span></div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;<span class=\"preprocessor\">#               if __cplusplus &gt;= 201402L</span></div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX14</span></div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;<span class=\"preprocessor\">#               elif __cplusplus &gt;= 201103L</span></div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX11</span></div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;<span class=\"preprocessor\">#               elif __cplusplus &gt;= 199711L</span></div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX98</span></div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;<span class=\"preprocessor\">#                       define GLM_LANG GLM_LANG_CXX // Good luck with that!</span></div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;<span class=\"preprocessor\">#               ifndef GLM_FORCE_PURE</span></div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;<span class=\"preprocessor\">#                       define GLM_FORCE_PURE</span></div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_LANG_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_LANG_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;<span class=\"preprocessor\">#       if GLM_LANG &amp; GLM_LANG_CXX1Z_FLAG</span></div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: C++1z&quot;)</span></div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;<span class=\"preprocessor\">#       elif GLM_LANG &amp; GLM_LANG_CXX14_FLAG</span></div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: C++14&quot;)</span></div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;<span class=\"preprocessor\">#       elif GLM_LANG &amp; GLM_LANG_CXX1Y_FLAG</span></div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: C++1y&quot;)</span></div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;<span class=\"preprocessor\">#       elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: C++11&quot;)</span></div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;<span class=\"preprocessor\">#       elif GLM_LANG &amp; GLM_LANG_CXX0X_FLAG</span></div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: C++0x&quot;)</span></div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;<span class=\"preprocessor\">#       elif GLM_LANG &amp; GLM_LANG_CXX03_FLAG</span></div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: C++03&quot;)</span></div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;<span class=\"preprocessor\">#       elif GLM_LANG &amp; GLM_LANG_CXX98_FLAG</span></div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: C++98&quot;)</span></div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: C++ language undetected&quot;)</span></div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;<span class=\"preprocessor\">#       endif//GLM_LANG</span></div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;<span class=\"preprocessor\">#       if GLM_LANG &amp; (GLM_LANG_CXXGNU_FLAG | GLM_LANG_CXXMS_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Language extensions enabled&quot;)</span></div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;<span class=\"preprocessor\">#       endif//GLM_LANG</span></div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;<span class=\"comment\">// Has of C++ features</span></div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;</div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;<span class=\"comment\">// http://clang.llvm.org/cxx_status.html</span></div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;<span class=\"comment\">// http://gcc.gnu.org/projects/cxx0x.html</span></div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;<span class=\"comment\">// http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.120).aspx</span></div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;<span class=\"comment\">// Android has multiple STLs but C++11 STL detection doesn&#39;t always work #284 #564</span></div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;<span class=\"preprocessor\">#if GLM_PLATFORM == GLM_PLATFORM_ANDROID &amp;&amp; !defined(GLM_LANG_STL11_FORCED)</span></div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_CXX11_STL 0</span></div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;<span class=\"preprocessor\">#elif GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;<span class=\"preprocessor\">#       if (defined(_LIBCPP_VERSION) &amp;&amp; GLM_LANG &amp; GLM_LANG_CXX11_FLAG) || defined(GLM_LANG_STL11_FORCED)</span></div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;<span class=\"preprocessor\">#               define GLM_HAS_CXX11_STL 1</span></div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;<span class=\"preprocessor\">#               define GLM_HAS_CXX11_STL 0</span></div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_CXX11_STL ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_GCC48)) || \\</span></div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC12)) || \\</span></div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;<span class=\"preprocessor\">                ((GLM_PLATFORM != GLM_PLATFORM_WINDOWS) &amp;&amp; (GLM_COMPILER &amp; GLM_COMPILER_INTEL) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_INTEL15))))</span></div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;<span class=\"comment\">// N1720</span></div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_STATIC_ASSERT __has_feature(cxx_static_assert)</span></div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_STATIC_ASSERT 1</span></div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_STATIC_ASSERT ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA)) || \\</span></div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC))))</span></div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;</div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;<span class=\"comment\">// N1988</span></div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;<span class=\"preprocessor\">#if GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_EXTENDED_INTEGER_TYPE 1</span></div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_EXTENDED_INTEGER_TYPE (\\</span></div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;<span class=\"preprocessor\">                ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (GLM_COMPILER &amp; GLM_COMPILER_VC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;<span class=\"preprocessor\">                ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (GLM_COMPILER &amp; GLM_COMPILER_CUDA)) || \\</span></div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;<span class=\"preprocessor\">                ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (GLM_COMPILER &amp; GLM_COMPILER_GCC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;<span class=\"preprocessor\">                ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (GLM_COMPILER &amp; GLM_COMPILER_CLANG)))</span></div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;<span class=\"comment\">// N2235</span></div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_CONSTEXPR __has_feature(cxx_constexpr)</span></div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR</span></div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_CONSTEXPR 1</span></div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR</span></div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_CONSTEXPR ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC15)) || \\</span></div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_GCC48)))) // GCC 4.6 support constexpr but there is a compiler bug causing a crash</span></div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_CONSTEXPR_PARTIAL (GLM_HAS_CONSTEXPR || ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC14)))</span></div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;<span class=\"comment\">// N2672</span></div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_INITIALIZER_LISTS __has_feature(cxx_generalized_initializers)</span></div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_INITIALIZER_LISTS 1</span></div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_INITIALIZER_LISTS ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC12)) || \\</span></div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_CUDA75))))</span></div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;<span class=\"comment\">// N2544 Unrestricted unions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf</span></div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions)</span></div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; (GLM_LANG_CXX11_FLAG | GLM_LANG_CXXMS_FLAG)</span></div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_UNRESTRICTED_UNIONS 1</span></div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_UNRESTRICTED_UNIONS (GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_LANG &amp; GLM_LANG_CXXMS_FLAG)) || \\</span></div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_CUDA75)) || \\</span></div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_GCC46)))</span></div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;<span class=\"comment\">// N2346</span></div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;<span class=\"preprocessor\">#if defined(GLM_FORCE_UNRESTRICTED_GENTYPE)</span></div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_DEFAULTED_FUNCTIONS 0</span></div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;<span class=\"preprocessor\">#elif GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_DEFAULTED_FUNCTIONS __has_feature(cxx_defaulted_functions)</span></div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_DEFAULTED_FUNCTIONS 1</span></div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_DEFAULTED_FUNCTIONS ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC12)) || \\</span></div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_INTEL)) || \\</span></div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;<span class=\"preprocessor\">                (GLM_COMPILER &amp; GLM_COMPILER_CUDA)))</span></div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;</div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;<span class=\"comment\">// N2118</span></div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_RVALUE_REFERENCES __has_feature(cxx_rvalue_references)</span></div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_RVALUE_REFERENCES 1</span></div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_RVALUE_REFERENCES ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA))))</span></div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;</div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;<span class=\"comment\">// N2437 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf</span></div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS __has_feature(cxx_explicit_conversions)</span></div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS 1</span></div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_INTEL) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_INTEL14)) || \\</span></div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC12)) || \\</span></div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA))))</span></div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;</div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;<span class=\"comment\">// N2258 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf</span></div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_TEMPLATE_ALIASES __has_feature(cxx_alias_templates)</span></div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_TEMPLATE_ALIASES 1</span></div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_TEMPLATE_ALIASES ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_INTEL)) || \\</span></div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_GCC47)) || \\</span></div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC12)) || \\</span></div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA))))</span></div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;<span class=\"comment\">// N2930 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html</span></div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_RANGE_FOR __has_feature(cxx_range_for)</span></div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_RANGE_FOR 1</span></div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_RANGE_FOR ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_GCC46)) || \\</span></div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_INTEL)) || \\</span></div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC)) || \\</span></div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA))))</span></div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;<span class=\"comment\">// N2341 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf</span></div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_ALIGNOF __has_feature(c_alignof)</span></div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;<span class=\"preprocessor\">#elif GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_ALIGNOF 1</span></div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_ALIGNOF ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_GCC48)) || \\</span></div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\">  439</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_INTEL) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_INTEL15)) || \\</span></div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC14)) || \\</span></div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_CUDA70))))</span></div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\">  443</span>&#160;</div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;<span class=\"preprocessor\">#define GLM_HAS_ONLY_XYZW ((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &lt; GLM_COMPILER_GCC46))</span></div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_ONLY_XYZW</span></div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GCC older than 4.6 has a bug presenting the use of rgba and stpq components&quot;)</span></div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;</div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;<span class=\"preprocessor\">#if GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_ASSIGNABLE 1</span></div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_ASSIGNABLE ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC15)) || \\</span></div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_GCC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_GCC49))))</span></div>\n<div class=\"line\"><a name=\"l00456\"></a><span class=\"lineno\">  456</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\">  457</span>&#160;</div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;<span class=\"preprocessor\">#define GLM_HAS_TRIVIAL_QUERIES 0</span></div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;</div>\n<div class=\"line\"><a name=\"l00461\"></a><span class=\"lineno\">  461</span>&#160;<span class=\"comment\">//</span></div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\">  462</span>&#160;<span class=\"preprocessor\">#if GLM_LANG &amp; GLM_LANG_CXX11_FLAG</span></div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_MAKE_SIGNED 1</span></div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00465\"></a><span class=\"lineno\">  465</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_MAKE_SIGNED ((GLM_LANG &amp; GLM_LANG_CXX0X_FLAG) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00466\"></a><span class=\"lineno\">  466</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC12)) || \\</span></div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\">  467</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_CUDA))))</span></div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;</div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;<span class=\"preprocessor\">#if GLM_ARCH == GLM_ARCH_PURE</span></div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\">  471</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_BITSCAN_WINDOWS 0</span></div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_BITSCAN_WINDOWS ((GLM_PLATFORM &amp; GLM_PLATFORM_WINDOWS) &amp;&amp; (\\</span></div>\n<div class=\"line\"><a name=\"l00474\"></a><span class=\"lineno\">  474</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_INTEL)) || \\</span></div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\">  475</span>&#160;<span class=\"preprocessor\">                ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &gt;= GLM_COMPILER_VC14) &amp;&amp; (GLM_ARCH &amp; GLM_ARCH_X86_BIT))))</span></div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00477\"></a><span class=\"lineno\">  477</span>&#160;</div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\">  478</span>&#160;<span class=\"comment\">// OpenMP</span></div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;<span class=\"preprocessor\">#ifdef _OPENMP</span></div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;<span class=\"preprocessor\">#       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;<span class=\"preprocessor\">#               if GLM_COMPILER &gt;= GLM_COMPILER_GCC61</span></div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;<span class=\"preprocessor\">#                       define GLM_HAS_OPENMP 45</span></div>\n<div class=\"line\"><a name=\"l00483\"></a><span class=\"lineno\">  483</span>&#160;<span class=\"preprocessor\">#               elif GLM_COMPILER &gt;= GLM_COMPILER_GCC49</span></div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\">  484</span>&#160;<span class=\"preprocessor\">#                       define GLM_HAS_OPENMP 40</span></div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;<span class=\"preprocessor\">#               elif GLM_COMPILER &gt;= GLM_COMPILER_GCC47</span></div>\n<div class=\"line\"><a name=\"l00486\"></a><span class=\"lineno\">  486</span>&#160;<span class=\"preprocessor\">#                       define GLM_HAS_OPENMP 31</span></div>\n<div class=\"line\"><a name=\"l00487\"></a><span class=\"lineno\">  487</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00488\"></a><span class=\"lineno\">  488</span>&#160;<span class=\"preprocessor\">#                       define GLM_HAS_OPENMP 0</span></div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\">  489</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;<span class=\"preprocessor\">#               if GLM_COMPILER &gt;= GLM_COMPILER_CLANG38</span></div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;<span class=\"preprocessor\">#                       define GLM_HAS_OPENMP 31</span></div>\n<div class=\"line\"><a name=\"l00493\"></a><span class=\"lineno\">  493</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00494\"></a><span class=\"lineno\">  494</span>&#160;<span class=\"preprocessor\">#                       define GLM_HAS_OPENMP 0</span></div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\">  497</span>&#160;<span class=\"preprocessor\">#               define GLM_HAS_OPENMP 20</span></div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_INTEL</span></div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;<span class=\"preprocessor\">#               if GLM_COMPILER &gt;= GLM_COMPILER_INTEL16</span></div>\n<div class=\"line\"><a name=\"l00500\"></a><span class=\"lineno\">  500</span>&#160;<span class=\"preprocessor\">#                       define GLM_HAS_OPENMP 40</span></div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;<span class=\"preprocessor\">#                       define GLM_HAS_OPENMP 0</span></div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;<span class=\"preprocessor\">#               define GLM_HAS_OPENMP 0</span></div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00507\"></a><span class=\"lineno\">  507</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00508\"></a><span class=\"lineno\">  508</span>&#160;<span class=\"preprocessor\">#       define GLM_HAS_OPENMP 0</span></div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00510\"></a><span class=\"lineno\">  510</span>&#160;</div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;<span class=\"comment\">// Static assert</span></div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;</div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\">  514</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_STATIC_ASSERT</span></div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;<span class=\"preprocessor\">#       define GLM_STATIC_ASSERT(x, message) static_assert(x, message)</span></div>\n<div class=\"line\"><a name=\"l00516\"></a><span class=\"lineno\">  516</span>&#160;<span class=\"preprocessor\">#elif GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\">  517</span>&#160;<span class=\"preprocessor\">#       define GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1]</span></div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;<span class=\"preprocessor\">#       define GLM_STATIC_ASSERT(x, message)</span></div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\">  520</span>&#160;<span class=\"preprocessor\">#       define GLM_STATIC_ASSERT_NULL</span></div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\">  521</span>&#160;<span class=\"preprocessor\">#endif//GLM_LANG</span></div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;</div>\n<div class=\"line\"><a name=\"l00524\"></a><span class=\"lineno\">  524</span>&#160;<span class=\"comment\">// Qualifiers</span></div>\n<div class=\"line\"><a name=\"l00525\"></a><span class=\"lineno\">  525</span>&#160;</div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_CUDA</span></div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;<span class=\"preprocessor\">#       define GLM_CUDA_FUNC_DEF __device__ __host__</span></div>\n<div class=\"line\"><a name=\"l00528\"></a><span class=\"lineno\">  528</span>&#160;<span class=\"preprocessor\">#       define GLM_CUDA_FUNC_DECL __device__ __host__</span></div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;<span class=\"preprocessor\">#       define GLM_CUDA_FUNC_DEF</span></div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;<span class=\"preprocessor\">#       define GLM_CUDA_FUNC_DECL</span></div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\">  533</span>&#160;</div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;<span class=\"preprocessor\">#if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;<span class=\"preprocessor\">#       define GLM_VAR_USED __attribute__ ((unused))</span></div>\n<div class=\"line\"><a name=\"l00536\"></a><span class=\"lineno\">  536</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00537\"></a><span class=\"lineno\">  537</span>&#160;<span class=\"preprocessor\">#       define GLM_VAR_USED</span></div>\n<div class=\"line\"><a name=\"l00538\"></a><span class=\"lineno\">  538</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;</div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;<span class=\"preprocessor\">#if defined(GLM_FORCE_INLINE)</span></div>\n<div class=\"line\"><a name=\"l00541\"></a><span class=\"lineno\">  541</span>&#160;<span class=\"preprocessor\">#       if GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00542\"></a><span class=\"lineno\">  542</span>&#160;<span class=\"preprocessor\">#               define GLM_INLINE __forceinline</span></div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;<span class=\"preprocessor\">#               define GLM_NEVER_INLINE __declspec((noinline))</span></div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)</span></div>\n<div class=\"line\"><a name=\"l00545\"></a><span class=\"lineno\">  545</span>&#160;<span class=\"preprocessor\">#               define GLM_INLINE inline __attribute__((__always_inline__))</span></div>\n<div class=\"line\"><a name=\"l00546\"></a><span class=\"lineno\">  546</span>&#160;<span class=\"preprocessor\">#               define GLM_NEVER_INLINE __attribute__((__noinline__))</span></div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;<span class=\"preprocessor\">#       elif GLM_COMPILER &amp; GLM_COMPILER_CUDA</span></div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;<span class=\"preprocessor\">#               define GLM_INLINE __forceinline__</span></div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\">  549</span>&#160;<span class=\"preprocessor\">#               define GLM_NEVER_INLINE __noinline__</span></div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\">  550</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;<span class=\"preprocessor\">#               define GLM_INLINE inline</span></div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;<span class=\"preprocessor\">#               define GLM_NEVER_INLINE</span></div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;<span class=\"preprocessor\">#       endif//GLM_COMPILER</span></div>\n<div class=\"line\"><a name=\"l00554\"></a><span class=\"lineno\">  554</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00555\"></a><span class=\"lineno\">  555</span>&#160;<span class=\"preprocessor\">#       define GLM_INLINE inline</span></div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;<span class=\"preprocessor\">#       define GLM_NEVER_INLINE</span></div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;<span class=\"preprocessor\">#endif//defined(GLM_FORCE_INLINE)</span></div>\n<div class=\"line\"><a name=\"l00558\"></a><span class=\"lineno\">  558</span>&#160;</div>\n<div class=\"line\"><a name=\"l00559\"></a><span class=\"lineno\">  559</span>&#160;<span class=\"preprocessor\">#define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL</span></div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;<span class=\"preprocessor\">#define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE</span></div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;</div>\n<div class=\"line\"><a name=\"l00563\"></a><span class=\"lineno\">  563</span>&#160;<span class=\"comment\">// Swizzle operators</span></div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;</div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;<span class=\"comment\">// User defines: GLM_FORCE_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00566\"></a><span class=\"lineno\">  566</span>&#160;</div>\n<div class=\"line\"><a name=\"l00567\"></a><span class=\"lineno\">  567</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_ENABLED 1</span></div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;<span class=\"preprocessor\">#define GLM_SWIZZLE_DISABLE 0</span></div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;</div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;<span class=\"preprocessor\">#if defined(GLM_FORCE_SWIZZLE)</span></div>\n<div class=\"line\"><a name=\"l00571\"></a><span class=\"lineno\">  571</span>&#160;<span class=\"preprocessor\">#       define GLM_SWIZZLE GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00572\"></a><span class=\"lineno\">  572</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;<span class=\"preprocessor\">#       define GLM_SWIZZLE GLM_SWIZZLE_DISABLE</span></div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00575\"></a><span class=\"lineno\">  575</span>&#160;</div>\n<div class=\"line\"><a name=\"l00576\"></a><span class=\"lineno\">  576</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_SWIZZLE_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_SWIZZLE_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;<span class=\"preprocessor\">#       if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00579\"></a><span class=\"lineno\">  579</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Swizzling operators enabled&quot;)</span></div>\n<div class=\"line\"><a name=\"l00580\"></a><span class=\"lineno\">  580</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Swizzling operators disabled, #define GLM_SWIZZLE to enable swizzle operators&quot;)</span></div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00583\"></a><span class=\"lineno\">  583</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00584\"></a><span class=\"lineno\">  584</span>&#160;</div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\">  586</span>&#160;<span class=\"comment\">// Allows using not basic types as genType</span></div>\n<div class=\"line\"><a name=\"l00587\"></a><span class=\"lineno\">  587</span>&#160;</div>\n<div class=\"line\"><a name=\"l00588\"></a><span class=\"lineno\">  588</span>&#160;<span class=\"comment\">// #define GLM_FORCE_UNRESTRICTED_GENTYPE</span></div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\">  589</span>&#160;</div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;<span class=\"preprocessor\">#ifdef GLM_FORCE_UNRESTRICTED_GENTYPE</span></div>\n<div class=\"line\"><a name=\"l00591\"></a><span class=\"lineno\">  591</span>&#160;<span class=\"preprocessor\">#       define GLM_UNRESTRICTED_GENTYPE 1</span></div>\n<div class=\"line\"><a name=\"l00592\"></a><span class=\"lineno\">  592</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;<span class=\"preprocessor\">#       define GLM_UNRESTRICTED_GENTYPE 0</span></div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\">  595</span>&#160;</div>\n<div class=\"line\"><a name=\"l00596\"></a><span class=\"lineno\">  596</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_UNRESTRICTED_GENTYPE_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00597\"></a><span class=\"lineno\">  597</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_UNRESTRICTED_GENTYPE_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\">  598</span>&#160;<span class=\"preprocessor\">#       ifdef GLM_FORCE_UNRESTRICTED_GENTYPE</span></div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Use unrestricted genType&quot;)</span></div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00601\"></a><span class=\"lineno\">  601</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;</div>\n<div class=\"line\"><a name=\"l00604\"></a><span class=\"lineno\">  604</span>&#160;<span class=\"comment\">// Clip control</span></div>\n<div class=\"line\"><a name=\"l00605\"></a><span class=\"lineno\">  605</span>&#160;</div>\n<div class=\"line\"><a name=\"l00606\"></a><span class=\"lineno\">  606</span>&#160;<span class=\"preprocessor\">#define GLM_DEPTH_ZERO_TO_ONE                           0x00000001</span></div>\n<div class=\"line\"><a name=\"l00607\"></a><span class=\"lineno\">  607</span>&#160;<span class=\"preprocessor\">#define GLM_DEPTH_NEGATIVE_ONE_TO_ONE           0x00000002</span></div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;</div>\n<div class=\"line\"><a name=\"l00609\"></a><span class=\"lineno\">  609</span>&#160;<span class=\"preprocessor\">#ifdef GLM_FORCE_DEPTH_ZERO_TO_ONE</span></div>\n<div class=\"line\"><a name=\"l00610\"></a><span class=\"lineno\">  610</span>&#160;<span class=\"preprocessor\">#       define GLM_DEPTH_CLIP_SPACE GLM_DEPTH_ZERO_TO_ONE</span></div>\n<div class=\"line\"><a name=\"l00611\"></a><span class=\"lineno\">  611</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00612\"></a><span class=\"lineno\">  612</span>&#160;<span class=\"preprocessor\">#       define GLM_DEPTH_CLIP_SPACE GLM_DEPTH_NEGATIVE_ONE_TO_ONE</span></div>\n<div class=\"line\"><a name=\"l00613\"></a><span class=\"lineno\">  613</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00614\"></a><span class=\"lineno\">  614</span>&#160;</div>\n<div class=\"line\"><a name=\"l00615\"></a><span class=\"lineno\">  615</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_DEPTH_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_DEPTH_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00617\"></a><span class=\"lineno\">  617</span>&#160;<span class=\"preprocessor\">#       if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE</span></div>\n<div class=\"line\"><a name=\"l00618\"></a><span class=\"lineno\">  618</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Depth clip space: Zero to one&quot;)</span></div>\n<div class=\"line\"><a name=\"l00619\"></a><span class=\"lineno\">  619</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Depth clip space: negative one to one&quot;)</span></div>\n<div class=\"line\"><a name=\"l00621\"></a><span class=\"lineno\">  621</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00622\"></a><span class=\"lineno\">  622</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00623\"></a><span class=\"lineno\">  623</span>&#160;</div>\n<div class=\"line\"><a name=\"l00625\"></a><span class=\"lineno\">  625</span>&#160;<span class=\"comment\">// Coordinate system, define GLM_FORCE_LEFT_HANDED before including GLM</span></div>\n<div class=\"line\"><a name=\"l00626\"></a><span class=\"lineno\">  626</span>&#160;<span class=\"comment\">// to use left handed coordinate system by default.</span></div>\n<div class=\"line\"><a name=\"l00627\"></a><span class=\"lineno\">  627</span>&#160;</div>\n<div class=\"line\"><a name=\"l00628\"></a><span class=\"lineno\">  628</span>&#160;<span class=\"preprocessor\">#define GLM_LEFT_HANDED                         0x00000001      // For DirectX, Metal, Vulkan</span></div>\n<div class=\"line\"><a name=\"l00629\"></a><span class=\"lineno\">  629</span>&#160;<span class=\"preprocessor\">#define GLM_RIGHT_HANDED                        0x00000002      // For OpenGL, default in GLM</span></div>\n<div class=\"line\"><a name=\"l00630\"></a><span class=\"lineno\">  630</span>&#160;</div>\n<div class=\"line\"><a name=\"l00631\"></a><span class=\"lineno\">  631</span>&#160;<span class=\"preprocessor\">#ifdef GLM_FORCE_LEFT_HANDED</span></div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;<span class=\"preprocessor\">#       define GLM_COORDINATE_SYSTEM GLM_LEFT_HANDED</span></div>\n<div class=\"line\"><a name=\"l00633\"></a><span class=\"lineno\">  633</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00634\"></a><span class=\"lineno\">  634</span>&#160;<span class=\"preprocessor\">#       define GLM_COORDINATE_SYSTEM GLM_RIGHT_HANDED</span></div>\n<div class=\"line\"><a name=\"l00635\"></a><span class=\"lineno\">  635</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00636\"></a><span class=\"lineno\">  636</span>&#160;</div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_HANDED_DISPLAYED)</span></div>\n<div class=\"line\"><a name=\"l00638\"></a><span class=\"lineno\">  638</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_HANDED_DISPLAYED</span></div>\n<div class=\"line\"><a name=\"l00639\"></a><span class=\"lineno\">  639</span>&#160;<span class=\"preprocessor\">#       if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED</span></div>\n<div class=\"line\"><a name=\"l00640\"></a><span class=\"lineno\">  640</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Coordinate system: left handed&quot;)</span></div>\n<div class=\"line\"><a name=\"l00641\"></a><span class=\"lineno\">  641</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00642\"></a><span class=\"lineno\">  642</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: Coordinate system: right handed&quot;)</span></div>\n<div class=\"line\"><a name=\"l00643\"></a><span class=\"lineno\">  643</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00644\"></a><span class=\"lineno\">  644</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;</div>\n<div class=\"line\"><a name=\"l00647\"></a><span class=\"lineno\">  647</span>&#160;<span class=\"comment\">// Qualifiers</span></div>\n<div class=\"line\"><a name=\"l00648\"></a><span class=\"lineno\">  648</span>&#160;</div>\n<div class=\"line\"><a name=\"l00649\"></a><span class=\"lineno\">  649</span>&#160;<span class=\"preprocessor\">#if (GLM_COMPILER &amp; GLM_COMPILER_VC) || ((GLM_COMPILER &amp; GLM_COMPILER_INTEL) &amp;&amp; (GLM_PLATFORM &amp; GLM_PLATFORM_WINDOWS))</span></div>\n<div class=\"line\"><a name=\"l00650\"></a><span class=\"lineno\">  650</span>&#160;<span class=\"preprocessor\">#       define GLM_DEPRECATED __declspec(deprecated)</span></div>\n<div class=\"line\"><a name=\"l00651\"></a><span class=\"lineno\">  651</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGN(x) __declspec(align(x))</span></div>\n<div class=\"line\"><a name=\"l00652\"></a><span class=\"lineno\">  652</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGNED_STRUCT(x) struct __declspec(align(x))</span></div>\n<div class=\"line\"><a name=\"l00653\"></a><span class=\"lineno\">  653</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef __declspec(align(alignment)) type name</span></div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;<span class=\"preprocessor\">#       define GLM_RESTRICT_FUNC __declspec(restrict)</span></div>\n<div class=\"line\"><a name=\"l00655\"></a><span class=\"lineno\">  655</span>&#160;<span class=\"preprocessor\">#       define GLM_RESTRICT __restrict</span></div>\n<div class=\"line\"><a name=\"l00656\"></a><span class=\"lineno\">  656</span>&#160;<span class=\"preprocessor\">#       if GLM_COMPILER &gt;= GLM_COMPILER_VC12</span></div>\n<div class=\"line\"><a name=\"l00657\"></a><span class=\"lineno\">  657</span>&#160;<span class=\"preprocessor\">#               define GLM_VECTOR_CALL __vectorcall</span></div>\n<div class=\"line\"><a name=\"l00658\"></a><span class=\"lineno\">  658</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00659\"></a><span class=\"lineno\">  659</span>&#160;<span class=\"preprocessor\">#               define GLM_VECTOR_CALL</span></div>\n<div class=\"line\"><a name=\"l00660\"></a><span class=\"lineno\">  660</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00661\"></a><span class=\"lineno\">  661</span>&#160;<span class=\"preprocessor\">#elif GLM_COMPILER &amp; (GLM_COMPILER_GCC | GLM_COMPILER_CLANG | GLM_COMPILER_INTEL)</span></div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;<span class=\"preprocessor\">#       define GLM_DEPRECATED __attribute__((__deprecated__))</span></div>\n<div class=\"line\"><a name=\"l00663\"></a><span class=\"lineno\">  663</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGN(x) __attribute__((aligned(x)))</span></div>\n<div class=\"line\"><a name=\"l00664\"></a><span class=\"lineno\">  664</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x)))</span></div>\n<div class=\"line\"><a name=\"l00665\"></a><span class=\"lineno\">  665</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __attribute__((aligned(alignment)))</span></div>\n<div class=\"line\"><a name=\"l00666\"></a><span class=\"lineno\">  666</span>&#160;<span class=\"preprocessor\">#       define GLM_RESTRICT_FUNC __restrict__</span></div>\n<div class=\"line\"><a name=\"l00667\"></a><span class=\"lineno\">  667</span>&#160;<span class=\"preprocessor\">#       define GLM_RESTRICT __restrict__</span></div>\n<div class=\"line\"><a name=\"l00668\"></a><span class=\"lineno\">  668</span>&#160;<span class=\"preprocessor\">#       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00669\"></a><span class=\"lineno\">  669</span>&#160;<span class=\"preprocessor\">#               if GLM_COMPILER &gt;= GLM_COMPILER_CLANG37</span></div>\n<div class=\"line\"><a name=\"l00670\"></a><span class=\"lineno\">  670</span>&#160;<span class=\"preprocessor\">#                       define GLM_VECTOR_CALL __vectorcall</span></div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\">  671</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00672\"></a><span class=\"lineno\">  672</span>&#160;<span class=\"preprocessor\">#                       define GLM_VECTOR_CALL</span></div>\n<div class=\"line\"><a name=\"l00673\"></a><span class=\"lineno\">  673</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00674\"></a><span class=\"lineno\">  674</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;<span class=\"preprocessor\">#               define GLM_VECTOR_CALL</span></div>\n<div class=\"line\"><a name=\"l00676\"></a><span class=\"lineno\">  676</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00677\"></a><span class=\"lineno\">  677</span>&#160;<span class=\"preprocessor\">#elif GLM_COMPILER &amp; GLM_COMPILER_CUDA</span></div>\n<div class=\"line\"><a name=\"l00678\"></a><span class=\"lineno\">  678</span>&#160;<span class=\"preprocessor\">#       define GLM_DEPRECATED</span></div>\n<div class=\"line\"><a name=\"l00679\"></a><span class=\"lineno\">  679</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGN(x) __align__(x)</span></div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGNED_STRUCT(x) struct __align__(x)</span></div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __align__(x)</span></div>\n<div class=\"line\"><a name=\"l00682\"></a><span class=\"lineno\">  682</span>&#160;<span class=\"preprocessor\">#       define GLM_RESTRICT_FUNC __restrict__</span></div>\n<div class=\"line\"><a name=\"l00683\"></a><span class=\"lineno\">  683</span>&#160;<span class=\"preprocessor\">#       define GLM_RESTRICT __restrict__</span></div>\n<div class=\"line\"><a name=\"l00684\"></a><span class=\"lineno\">  684</span>&#160;<span class=\"preprocessor\">#       define GLM_VECTOR_CALL</span></div>\n<div class=\"line\"><a name=\"l00685\"></a><span class=\"lineno\">  685</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00686\"></a><span class=\"lineno\">  686</span>&#160;<span class=\"preprocessor\">#       define GLM_DEPRECATED</span></div>\n<div class=\"line\"><a name=\"l00687\"></a><span class=\"lineno\">  687</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGN</span></div>\n<div class=\"line\"><a name=\"l00688\"></a><span class=\"lineno\">  688</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGNED_STRUCT(x) struct</span></div>\n<div class=\"line\"><a name=\"l00689\"></a><span class=\"lineno\">  689</span>&#160;<span class=\"preprocessor\">#       define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name</span></div>\n<div class=\"line\"><a name=\"l00690\"></a><span class=\"lineno\">  690</span>&#160;<span class=\"preprocessor\">#       define GLM_RESTRICT_FUNC</span></div>\n<div class=\"line\"><a name=\"l00691\"></a><span class=\"lineno\">  691</span>&#160;<span class=\"preprocessor\">#       define GLM_RESTRICT</span></div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\">  692</span>&#160;<span class=\"preprocessor\">#       define GLM_VECTOR_CALL</span></div>\n<div class=\"line\"><a name=\"l00693\"></a><span class=\"lineno\">  693</span>&#160;<span class=\"preprocessor\">#endif//GLM_COMPILER</span></div>\n<div class=\"line\"><a name=\"l00694\"></a><span class=\"lineno\">  694</span>&#160;</div>\n<div class=\"line\"><a name=\"l00695\"></a><span class=\"lineno\">  695</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_DEFAULTED_FUNCTIONS</span></div>\n<div class=\"line\"><a name=\"l00696\"></a><span class=\"lineno\">  696</span>&#160;<span class=\"preprocessor\">#       define GLM_DEFAULT = default</span></div>\n<div class=\"line\"><a name=\"l00697\"></a><span class=\"lineno\">  697</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00698\"></a><span class=\"lineno\">  698</span>&#160;<span class=\"preprocessor\">#       define GLM_DEFAULT</span></div>\n<div class=\"line\"><a name=\"l00699\"></a><span class=\"lineno\">  699</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00700\"></a><span class=\"lineno\">  700</span>&#160;</div>\n<div class=\"line\"><a name=\"l00701\"></a><span class=\"lineno\">  701</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_CONSTEXPR || GLM_HAS_CONSTEXPR_PARTIAL</span></div>\n<div class=\"line\"><a name=\"l00702\"></a><span class=\"lineno\">  702</span>&#160;<span class=\"preprocessor\">#       define GLM_CONSTEXPR constexpr</span></div>\n<div class=\"line\"><a name=\"l00703\"></a><span class=\"lineno\">  703</span>&#160;<span class=\"preprocessor\">#       if ((GLM_COMPILER &amp; GLM_COMPILER_VC) &amp;&amp; (GLM_COMPILER &lt;= GLM_COMPILER_VC14)) // Visual C++ has a bug #594 https://github.com/g-truc/glm/issues/594</span></div>\n<div class=\"line\"><a name=\"l00704\"></a><span class=\"lineno\">  704</span>&#160;<span class=\"preprocessor\">#               define GLM_CONSTEXPR_CTOR</span></div>\n<div class=\"line\"><a name=\"l00705\"></a><span class=\"lineno\">  705</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00706\"></a><span class=\"lineno\">  706</span>&#160;<span class=\"preprocessor\">#               define GLM_CONSTEXPR_CTOR constexpr</span></div>\n<div class=\"line\"><a name=\"l00707\"></a><span class=\"lineno\">  707</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00708\"></a><span class=\"lineno\">  708</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00709\"></a><span class=\"lineno\">  709</span>&#160;<span class=\"preprocessor\">#       define GLM_CONSTEXPR</span></div>\n<div class=\"line\"><a name=\"l00710\"></a><span class=\"lineno\">  710</span>&#160;<span class=\"preprocessor\">#       define GLM_CONSTEXPR_CTOR</span></div>\n<div class=\"line\"><a name=\"l00711\"></a><span class=\"lineno\">  711</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00712\"></a><span class=\"lineno\">  712</span>&#160;</div>\n<div class=\"line\"><a name=\"l00713\"></a><span class=\"lineno\">  713</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_CONSTEXPR</span></div>\n<div class=\"line\"><a name=\"l00714\"></a><span class=\"lineno\">  714</span>&#160;<span class=\"preprocessor\">#       define GLM_RELAXED_CONSTEXPR constexpr</span></div>\n<div class=\"line\"><a name=\"l00715\"></a><span class=\"lineno\">  715</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00716\"></a><span class=\"lineno\">  716</span>&#160;<span class=\"preprocessor\">#       define GLM_RELAXED_CONSTEXPR const</span></div>\n<div class=\"line\"><a name=\"l00717\"></a><span class=\"lineno\">  717</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00718\"></a><span class=\"lineno\">  718</span>&#160;</div>\n<div class=\"line\"><a name=\"l00719\"></a><span class=\"lineno\">  719</span>&#160;<span class=\"preprocessor\">#if GLM_ARCH == GLM_ARCH_PURE</span></div>\n<div class=\"line\"><a name=\"l00720\"></a><span class=\"lineno\">  720</span>&#160;<span class=\"preprocessor\">#       define GLM_CONSTEXPR_SIMD GLM_CONSTEXPR_CTOR</span></div>\n<div class=\"line\"><a name=\"l00721\"></a><span class=\"lineno\">  721</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00722\"></a><span class=\"lineno\">  722</span>&#160;<span class=\"preprocessor\">#       define GLM_CONSTEXPR_SIMD</span></div>\n<div class=\"line\"><a name=\"l00723\"></a><span class=\"lineno\">  723</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00724\"></a><span class=\"lineno\">  724</span>&#160;</div>\n<div class=\"line\"><a name=\"l00725\"></a><span class=\"lineno\">  725</span>&#160;<span class=\"preprocessor\">#ifdef GLM_FORCE_EXPLICIT_CTOR</span></div>\n<div class=\"line\"><a name=\"l00726\"></a><span class=\"lineno\">  726</span>&#160;<span class=\"preprocessor\">#       define GLM_EXPLICIT explicit</span></div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00728\"></a><span class=\"lineno\">  728</span>&#160;<span class=\"preprocessor\">#       define GLM_EXPLICIT</span></div>\n<div class=\"line\"><a name=\"l00729\"></a><span class=\"lineno\">  729</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00730\"></a><span class=\"lineno\">  730</span>&#160;</div>\n<div class=\"line\"><a name=\"l00732\"></a><span class=\"lineno\">  732</span>&#160;</div>\n<div class=\"line\"><a name=\"l00733\"></a><span class=\"lineno\">  733</span>&#160;<span class=\"preprocessor\">#define GLM_HAS_ALIGNED_TYPE GLM_HAS_UNRESTRICTED_UNIONS</span></div>\n<div class=\"line\"><a name=\"l00734\"></a><span class=\"lineno\">  734</span>&#160;</div>\n<div class=\"line\"><a name=\"l00736\"></a><span class=\"lineno\">  736</span>&#160;<span class=\"comment\">// Length type: all length functions returns a length_t type.</span></div>\n<div class=\"line\"><a name=\"l00737\"></a><span class=\"lineno\">  737</span>&#160;<span class=\"comment\">// When GLM_FORCE_SIZE_T_LENGTH is defined, length_t is a typedef of size_t otherwise</span></div>\n<div class=\"line\"><a name=\"l00738\"></a><span class=\"lineno\">  738</span>&#160;<span class=\"comment\">// length_t is a typedef of int like GLSL defines it.</span></div>\n<div class=\"line\"><a name=\"l00739\"></a><span class=\"lineno\">  739</span>&#160;</div>\n<div class=\"line\"><a name=\"l00740\"></a><span class=\"lineno\">  740</span>&#160;<span class=\"comment\">// User define: GLM_FORCE_SIZE_T_LENGTH</span></div>\n<div class=\"line\"><a name=\"l00741\"></a><span class=\"lineno\">  741</span>&#160;</div>\n<div class=\"line\"><a name=\"l00742\"></a><span class=\"lineno\">  742</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00743\"></a><span class=\"lineno\">  743</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00744\"></a><span class=\"lineno\">  744</span>&#160;        <span class=\"keyword\">using</span> std::size_t;</div>\n<div class=\"line\"><a name=\"l00745\"></a><span class=\"lineno\">  745</span>&#160;<span class=\"preprocessor\">#       if defined(GLM_FORCE_SIZE_T_LENGTH)</span></div>\n<div class=\"line\"><a name=\"l00746\"></a><span class=\"lineno\">  746</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">size_t</span> length_t;</div>\n<div class=\"line\"><a name=\"l00747\"></a><span class=\"lineno\">  747</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00748\"></a><span class=\"lineno\">  748</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">int</span> length_t;</div>\n<div class=\"line\"><a name=\"l00749\"></a><span class=\"lineno\">  749</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00750\"></a><span class=\"lineno\">  750</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00751\"></a><span class=\"lineno\">  751</span>&#160;</div>\n<div class=\"line\"><a name=\"l00752\"></a><span class=\"lineno\">  752</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_MESSAGE_FORCE_SIZE_T_LENGTH)</span></div>\n<div class=\"line\"><a name=\"l00753\"></a><span class=\"lineno\">  753</span>&#160;<span class=\"preprocessor\">#       define GLM_MESSAGE_FORCE_SIZE_T_LENGTH</span></div>\n<div class=\"line\"><a name=\"l00754\"></a><span class=\"lineno\">  754</span>&#160;<span class=\"preprocessor\">#       if defined GLM_FORCE_SIZE_T_LENGTH</span></div>\n<div class=\"line\"><a name=\"l00755\"></a><span class=\"lineno\">  755</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: .length() returns glm::length_t, a typedef of std::size_t&quot;)</span></div>\n<div class=\"line\"><a name=\"l00756\"></a><span class=\"lineno\">  756</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00757\"></a><span class=\"lineno\">  757</span>&#160;<span class=\"preprocessor\">#               pragma message(&quot;GLM: .length() returns glm::length_t, a typedef of int following the GLSL specification&quot;)</span></div>\n<div class=\"line\"><a name=\"l00758\"></a><span class=\"lineno\">  758</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00759\"></a><span class=\"lineno\">  759</span>&#160;<span class=\"preprocessor\">#endif//GLM_MESSAGES</span></div>\n<div class=\"line\"><a name=\"l00760\"></a><span class=\"lineno\">  760</span>&#160;</div>\n<div class=\"line\"><a name=\"l00762\"></a><span class=\"lineno\">  762</span>&#160;<span class=\"comment\">// countof</span></div>\n<div class=\"line\"><a name=\"l00763\"></a><span class=\"lineno\">  763</span>&#160;</div>\n<div class=\"line\"><a name=\"l00764\"></a><span class=\"lineno\">  764</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_CONSTEXPR_PARTIAL</span></div>\n<div class=\"line\"><a name=\"l00765\"></a><span class=\"lineno\">  765</span>&#160;        <span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00766\"></a><span class=\"lineno\">  766</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00767\"></a><span class=\"lineno\">  767</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, std::<span class=\"keywordtype\">size_t</span> N&gt;</div>\n<div class=\"line\"><a name=\"l00768\"></a><span class=\"lineno\">  768</span>&#160;                constexpr std::size_t countof(T <span class=\"keyword\">const</span> (&amp;)[N])</div>\n<div class=\"line\"><a name=\"l00769\"></a><span class=\"lineno\">  769</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00770\"></a><span class=\"lineno\">  770</span>&#160;                        <span class=\"keywordflow\">return</span> N;</div>\n<div class=\"line\"><a name=\"l00771\"></a><span class=\"lineno\">  771</span>&#160;                }</div>\n<div class=\"line\"><a name=\"l00772\"></a><span class=\"lineno\">  772</span>&#160;        }<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00773\"></a><span class=\"lineno\">  773</span>&#160;<span class=\"preprocessor\">#       define GLM_COUNTOF(arr) glm::countof(arr)</span></div>\n<div class=\"line\"><a name=\"l00774\"></a><span class=\"lineno\">  774</span>&#160;<span class=\"preprocessor\">#elif defined(_MSC_VER)</span></div>\n<div class=\"line\"><a name=\"l00775\"></a><span class=\"lineno\">  775</span>&#160;<span class=\"preprocessor\">#       define GLM_COUNTOF(arr) _countof(arr)</span></div>\n<div class=\"line\"><a name=\"l00776\"></a><span class=\"lineno\">  776</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00777\"></a><span class=\"lineno\">  777</span>&#160;<span class=\"preprocessor\">#       define GLM_COUNTOF(arr) sizeof(arr) / sizeof(arr[0])</span></div>\n<div class=\"line\"><a name=\"l00778\"></a><span class=\"lineno\">  778</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00779\"></a><span class=\"lineno\">  779</span>&#160;</div>\n<div class=\"line\"><a name=\"l00781\"></a><span class=\"lineno\">  781</span>&#160;<span class=\"comment\">// Check inclusions of different versions of GLM</span></div>\n<div class=\"line\"><a name=\"l00782\"></a><span class=\"lineno\">  782</span>&#160;</div>\n<div class=\"line\"><a name=\"l00783\"></a><span class=\"lineno\">  783</span>&#160;<span class=\"preprocessor\">#elif ((GLM_SETUP_INCLUDED != GLM_VERSION) &amp;&amp; !defined(GLM_FORCE_IGNORE_VERSION))       </span></div>\n<div class=\"line\"><a name=\"l00784\"></a><span class=\"lineno\">  784</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM error: A different version of GLM is already included. Define GLM_FORCE_IGNORE_VERSION before including GLM headers to ignore this error.&quot;</span></div>\n<div class=\"line\"><a name=\"l00785\"></a><span class=\"lineno\">  785</span>&#160;<span class=\"preprocessor\">#elif GLM_SETUP_INCLUDED == GLM_VERSION</span></div>\n<div class=\"line\"><a name=\"l00786\"></a><span class=\"lineno\">  786</span>&#160;</div>\n<div class=\"line\"><a name=\"l00787\"></a><span class=\"lineno\">  787</span>&#160;<span class=\"preprocessor\">#endif//GLM_SETUP_INCLUDED</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00095.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: spline.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">spline.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00218.html\">GLM_GTX_spline</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00095_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8119c04f8210fd0d292757565cd6918d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8119c04f8210fd0d292757565cd6918d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00218.html#ga8119c04f8210fd0d292757565cd6918d\">catmullRom</a> (genType const &amp;v1, genType const &amp;v2, genType const &amp;v3, genType const &amp;v4, typename genType::value_type const &amp;s)</td></tr>\n<tr class=\"memdesc:ga8119c04f8210fd0d292757565cd6918d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a point from a catmull rom curve.  <a href=\"a00218.html#ga8119c04f8210fd0d292757565cd6918d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8119c04f8210fd0d292757565cd6918d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6b867eb52e2fc933d2e0bf26aabc9a70\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6b867eb52e2fc933d2e0bf26aabc9a70\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00218.html#ga6b867eb52e2fc933d2e0bf26aabc9a70\">cubic</a> (genType const &amp;v1, genType const &amp;v2, genType const &amp;v3, genType const &amp;v4, typename genType::value_type const &amp;s)</td></tr>\n<tr class=\"memdesc:ga6b867eb52e2fc933d2e0bf26aabc9a70\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a point from a cubic curve.  <a href=\"a00218.html#ga6b867eb52e2fc933d2e0bf26aabc9a70\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6b867eb52e2fc933d2e0bf26aabc9a70\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa69e143f6374d32f934a8edeaa50bac9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa69e143f6374d32f934a8edeaa50bac9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00218.html#gaa69e143f6374d32f934a8edeaa50bac9\">hermite</a> (genType const &amp;v1, genType const &amp;t1, genType const &amp;v2, genType const &amp;t2, typename genType::value_type const &amp;s)</td></tr>\n<tr class=\"memdesc:gaa69e143f6374d32f934a8edeaa50bac9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a point from a hermite curve.  <a href=\"a00218.html#gaa69e143f6374d32f934a8edeaa50bac9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa69e143f6374d32f934a8edeaa50bac9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00218.html\">GLM_GTX_spline</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00095_source.html\">spline.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00095_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: spline.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">spline.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00095.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/optimum_pow.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_spline is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_spline extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00218.html#ga8119c04f8210fd0d292757565cd6918d\">catmullRom</a>(</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v2, </div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v3, </div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v4, </div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                <span class=\"keyword\">typename</span> genType::value_type <span class=\"keyword\">const</span>&amp; s);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00218.html#gaa69e143f6374d32f934a8edeaa50bac9\">hermite</a>(</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                genType <span class=\"keyword\">const</span>&amp; t1, </div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v2, </div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                genType <span class=\"keyword\">const</span>&amp; t2, </div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                <span class=\"keyword\">typename</span> genType::value_type <span class=\"keyword\">const</span>&amp; s);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt; </div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00218.html#ga6b867eb52e2fc933d2e0bf26aabc9a70\">cubic</a>(</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v1, </div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v2, </div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v3, </div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                genType <span class=\"keyword\">const</span>&amp; v4, </div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                <span class=\"keyword\">typename</span> genType::value_type <span class=\"keyword\">const</span>&amp; s);</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#include &quot;spline.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00218_html_gaa69e143f6374d32f934a8edeaa50bac9\"><div class=\"ttname\"><a href=\"a00218.html#gaa69e143f6374d32f934a8edeaa50bac9\">glm::hermite</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType hermite(genType const &amp;v1, genType const &amp;t1, genType const &amp;v2, genType const &amp;t2, typename genType::value_type const &amp;s)</div><div class=\"ttdoc\">Return a point from a hermite curve. </div></div>\n<div class=\"ttc\" id=\"a00218_html_ga6b867eb52e2fc933d2e0bf26aabc9a70\"><div class=\"ttname\"><a href=\"a00218.html#ga6b867eb52e2fc933d2e0bf26aabc9a70\">glm::cubic</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType cubic(genType const &amp;v1, genType const &amp;v2, genType const &amp;v3, genType const &amp;v4, typename genType::value_type const &amp;s)</div><div class=\"ttdoc\">Return a point from a cubic curve. </div></div>\n<div class=\"ttc\" id=\"a00218_html_ga8119c04f8210fd0d292757565cd6918d\"><div class=\"ttname\"><a href=\"a00218.html#ga8119c04f8210fd0d292757565cd6918d\">glm::catmullRom</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType catmullRom(genType const &amp;v1, genType const &amp;v2, genType const &amp;v3, genType const &amp;v4, typename genType::value_type const &amp;s)</div><div class=\"ttdoc\">Return a point from a catmull rom curve. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00096.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: std_based_type.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">std_based_type.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00219.html\">GLM_GTX_std_based_type</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00096_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gaeb877ac8f9a3703961736c1c5072cf68\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gaeb877ac8f9a3703961736c1c5072cf68\">size1</a></td></tr>\n<tr class=\"memdesc:gaeb877ac8f9a3703961736c1c5072cf68\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of one std::size_t component.  <a href=\"a00219.html#gaeb877ac8f9a3703961736c1c5072cf68\">More...</a><br /></td></tr>\n<tr class=\"separator:gaeb877ac8f9a3703961736c1c5072cf68\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaf6accc57f5aa50447ba7310ce3f0d6f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f\">size1_t</a></td></tr>\n<tr class=\"memdesc:gaaf6accc57f5aa50447ba7310ce3f0d6f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of one std::size_t component.  <a href=\"a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaf6accc57f5aa50447ba7310ce3f0d6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1bfe8c4975ff282bce41be2bacd524fe\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe\">size2</a></td></tr>\n<tr class=\"memdesc:ga1bfe8c4975ff282bce41be2bacd524fe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of two std::size_t components.  <a href=\"a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1bfe8c4975ff282bce41be2bacd524fe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5976c25657d4e2b5f73f39364c3845d6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#ga5976c25657d4e2b5f73f39364c3845d6\">size2_t</a></td></tr>\n<tr class=\"memdesc:ga5976c25657d4e2b5f73f39364c3845d6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of two std::size_t components.  <a href=\"a00219.html#ga5976c25657d4e2b5f73f39364c3845d6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5976c25657d4e2b5f73f39364c3845d6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1c72956d0359b0db332c6c8774d3b04\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gae1c72956d0359b0db332c6c8774d3b04\">size3</a></td></tr>\n<tr class=\"memdesc:gae1c72956d0359b0db332c6c8774d3b04\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of three std::size_t components.  <a href=\"a00219.html#gae1c72956d0359b0db332c6c8774d3b04\">More...</a><br /></td></tr>\n<tr class=\"separator:gae1c72956d0359b0db332c6c8774d3b04\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2654983c60d641fd3808e65a8dfad8d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gaf2654983c60d641fd3808e65a8dfad8d\">size3_t</a></td></tr>\n<tr class=\"memdesc:gaf2654983c60d641fd3808e65a8dfad8d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of three std::size_t components.  <a href=\"a00219.html#gaf2654983c60d641fd3808e65a8dfad8d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2654983c60d641fd3808e65a8dfad8d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3a19dde617beaf8ce3cfc2ac5064e9aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa\">size4</a></td></tr>\n<tr class=\"memdesc:ga3a19dde617beaf8ce3cfc2ac5064e9aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of four std::size_t components.  <a href=\"a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3a19dde617beaf8ce3cfc2ac5064e9aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa423efcea63675a2df26990dbcb58656\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gaa423efcea63675a2df26990dbcb58656\">size4_t</a></td></tr>\n<tr class=\"memdesc:gaa423efcea63675a2df26990dbcb58656\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of four std::size_t components.  <a href=\"a00219.html#gaa423efcea63675a2df26990dbcb58656\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa423efcea63675a2df26990dbcb58656\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00219.html\">GLM_GTX_std_based_type</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\ngtx_extented_min_max (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00096_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: std_based_type.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">std_based_type.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00096.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &lt;cstdlib&gt;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_std_based_type is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_std_based_type extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00219.html#gaeb877ac8f9a3703961736c1c5072cf68\">   35</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, std::size_t, defaultp&gt;           <a class=\"code\" href=\"a00219.html#gaeb877ac8f9a3703961736c1c5072cf68\">size1</a>;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe\">   39</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, std::size_t, defaultp&gt;           <a class=\"code\" href=\"a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe\">size2</a>;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00219.html#gae1c72956d0359b0db332c6c8774d3b04\">   43</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, std::size_t, defaultp&gt;           <a class=\"code\" href=\"a00219.html#gae1c72956d0359b0db332c6c8774d3b04\">size3</a>;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa\">   47</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, std::size_t, defaultp&gt;           <a class=\"code\" href=\"a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa\">size4</a>;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f\">   51</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, std::size_t, defaultp&gt;           <a class=\"code\" href=\"a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f\">size1_t</a>;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00219.html#ga5976c25657d4e2b5f73f39364c3845d6\">   55</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, std::size_t, defaultp&gt;           <a class=\"code\" href=\"a00219.html#ga5976c25657d4e2b5f73f39364c3845d6\">size2_t</a>;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00219.html#gaf2654983c60d641fd3808e65a8dfad8d\">   59</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, std::size_t, defaultp&gt;           <a class=\"code\" href=\"a00219.html#gaf2654983c60d641fd3808e65a8dfad8d\">size3_t</a>;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00219.html#gaa423efcea63675a2df26990dbcb58656\">   63</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, std::size_t, defaultp&gt;           <a class=\"code\" href=\"a00219.html#gaa423efcea63675a2df26990dbcb58656\">size4_t</a>;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">#include &quot;std_based_type.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00219_html_gaf2654983c60d641fd3808e65a8dfad8d\"><div class=\"ttname\"><a href=\"a00219.html#gaf2654983c60d641fd3808e65a8dfad8d\">glm::size3_t</a></div><div class=\"ttdeci\">vec&lt; 3, std::size_t, defaultp &gt; size3_t</div><div class=\"ttdoc\">Vector type based of three std::size_t components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00096_source.html#l00059\">std_based_type.hpp:59</a></div></div>\n<div class=\"ttc\" id=\"a00219_html_ga1bfe8c4975ff282bce41be2bacd524fe\"><div class=\"ttname\"><a href=\"a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe\">glm::size2</a></div><div class=\"ttdeci\">vec&lt; 2, std::size_t, defaultp &gt; size2</div><div class=\"ttdoc\">Vector type based of two std::size_t components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00096_source.html#l00039\">std_based_type.hpp:39</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00219_html_gaa423efcea63675a2df26990dbcb58656\"><div class=\"ttname\"><a href=\"a00219.html#gaa423efcea63675a2df26990dbcb58656\">glm::size4_t</a></div><div class=\"ttdeci\">vec&lt; 4, std::size_t, defaultp &gt; size4_t</div><div class=\"ttdoc\">Vector type based of four std::size_t components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00096_source.html#l00063\">std_based_type.hpp:63</a></div></div>\n<div class=\"ttc\" id=\"a00219_html_gaeb877ac8f9a3703961736c1c5072cf68\"><div class=\"ttname\"><a href=\"a00219.html#gaeb877ac8f9a3703961736c1c5072cf68\">glm::size1</a></div><div class=\"ttdeci\">vec&lt; 1, std::size_t, defaultp &gt; size1</div><div class=\"ttdoc\">Vector type based of one std::size_t component. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00096_source.html#l00035\">std_based_type.hpp:35</a></div></div>\n<div class=\"ttc\" id=\"a00219_html_ga5976c25657d4e2b5f73f39364c3845d6\"><div class=\"ttname\"><a href=\"a00219.html#ga5976c25657d4e2b5f73f39364c3845d6\">glm::size2_t</a></div><div class=\"ttdeci\">vec&lt; 2, std::size_t, defaultp &gt; size2_t</div><div class=\"ttdoc\">Vector type based of two std::size_t components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00096_source.html#l00055\">std_based_type.hpp:55</a></div></div>\n<div class=\"ttc\" id=\"a00219_html_gae1c72956d0359b0db332c6c8774d3b04\"><div class=\"ttname\"><a href=\"a00219.html#gae1c72956d0359b0db332c6c8774d3b04\">glm::size3</a></div><div class=\"ttdeci\">vec&lt; 3, std::size_t, defaultp &gt; size3</div><div class=\"ttdoc\">Vector type based of three std::size_t components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00096_source.html#l00043\">std_based_type.hpp:43</a></div></div>\n<div class=\"ttc\" id=\"a00219_html_ga3a19dde617beaf8ce3cfc2ac5064e9aa\"><div class=\"ttname\"><a href=\"a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa\">glm::size4</a></div><div class=\"ttdeci\">vec&lt; 4, std::size_t, defaultp &gt; size4</div><div class=\"ttdoc\">Vector type based of four std::size_t components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00096_source.html#l00047\">std_based_type.hpp:47</a></div></div>\n<div class=\"ttc\" id=\"a00219_html_gaaf6accc57f5aa50447ba7310ce3f0d6f\"><div class=\"ttname\"><a href=\"a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f\">glm::size1_t</a></div><div class=\"ttdeci\">vec&lt; 1, std::size_t, defaultp &gt; size1_t</div><div class=\"ttdoc\">Vector type based of one std::size_t component. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00096_source.html#l00051\">std_based_type.hpp:51</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00097.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: string_cast.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">string_cast.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00220.html\">GLM_GTX_string_cast</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00097_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8f0dced1fd45e67e2d77e80ab93c7af5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8f0dced1fd45e67e2d77e80ab93c7af5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL std::string&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00220.html#ga8f0dced1fd45e67e2d77e80ab93c7af5\">to_string</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8f0dced1fd45e67e2d77e80ab93c7af5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Create a string from a GLM vector or matrix typed variable.  <a href=\"a00220.html#ga8f0dced1fd45e67e2d77e80ab93c7af5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f0dced1fd45e67e2d77e80ab93c7af5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00220.html\">GLM_GTX_string_cast</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00190.html\" title=\"Include <glm/gtx/integer.hpp> to use the features of this extension. \">GLM_GTX_integer</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00097_source.html\">string_cast.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00097_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: string_cast.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">string_cast.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00097.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/type_precision.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/dual_quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &lt;string&gt;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#include &lt;cmath&gt;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_string_cast is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#if(GLM_COMPILER &amp; GLM_COMPILER_CUDA)</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM_GTX_string_cast is not supported on CUDA compiler&quot;</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_string_cast extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL std::string <a class=\"code\" href=\"a00220.html#ga8f0dced1fd45e67e2d77e80ab93c7af5\">to_string</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"preprocessor\">#include &quot;string_cast.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00220_html_ga8f0dced1fd45e67e2d77e80ab93c7af5\"><div class=\"ttname\"><a href=\"a00220.html#ga8f0dced1fd45e67e2d77e80ab93c7af5\">glm::to_string</a></div><div class=\"ttdeci\">GLM_FUNC_DECL std::string to_string(genType const &amp;x)</div><div class=\"ttdoc\">Create a string from a GLM vector or matrix typed variable. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00098.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: transform.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">transform.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00221.html\">GLM_GTX_transform</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00098_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaf599be4c0e9d99be1f9cddba79b6018b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf599be4c0e9d99be1f9cddba79b6018b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00221.html#gaf599be4c0e9d99be1f9cddba79b6018b\">rotate</a> (T angle, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf599be4c0e9d99be1f9cddba79b6018b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians.  <a href=\"a00221.html#gaf599be4c0e9d99be1f9cddba79b6018b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf599be4c0e9d99be1f9cddba79b6018b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafbeefee8fec884d566e4ada0049174d7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafbeefee8fec884d566e4ada0049174d7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00221.html#gafbeefee8fec884d566e4ada0049174d7\">scale</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gafbeefee8fec884d566e4ada0049174d7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components.  <a href=\"a00221.html#gafbeefee8fec884d566e4ada0049174d7\">More...</a><br /></td></tr>\n<tr class=\"separator:gafbeefee8fec884d566e4ada0049174d7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga309a30e652e58c396e2c3d4db3ee7658\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga309a30e652e58c396e2c3d4db3ee7658\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00221.html#ga309a30e652e58c396e2c3d4db3ee7658\">translate</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga309a30e652e58c396e2c3d4db3ee7658\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars.  <a href=\"a00221.html#ga309a30e652e58c396e2c3d4db3ee7658\">More...</a><br /></td></tr>\n<tr class=\"separator:ga309a30e652e58c396e2c3d4db3ee7658\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00221.html\">GLM_GTX_transform</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00221.html\" title=\"Include <glm/gtx/transform.hpp> to use the features of this extension. \">GLM_GTX_transform</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00222.html\" title=\"Include <glm/gtx/transform2.hpp> to use the features of this extension. \">GLM_GTX_transform2</a> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00098_source.html\">transform.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00098_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: transform.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">transform.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00098.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/matrix_transform.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_transform is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_transform extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00221.html#ga309a30e652e58c396e2c3d4db3ee7658\">translate</a>(</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00221.html#gaf599be4c0e9d99be1f9cddba79b6018b\">rotate</a>(</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                T <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>, </div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00221.html#gafbeefee8fec884d566e4ada0049174d7\">scale</a>(</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">#include &quot;transform.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00221_html_ga309a30e652e58c396e2c3d4db3ee7658\"><div class=\"ttname\"><a href=\"a00221.html#ga309a30e652e58c396e2c3d4db3ee7658\">glm::translate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; translate(vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars. </div></div>\n<div class=\"ttc\" id=\"a00221_html_gafbeefee8fec884d566e4ada0049174d7\"><div class=\"ttname\"><a href=\"a00221.html#gafbeefee8fec884d566e4ada0049174d7\">glm::scale</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; scale(vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00221_html_gaf599be4c0e9d99be1f9cddba79b6018b\"><div class=\"ttname\"><a href=\"a00221.html#gaf599be4c0e9d99be1f9cddba79b6018b\">glm::rotate</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; rotate(T angle, vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians...</div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00099.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: transform2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">transform2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00222.html\">GLM_GTX_transform2</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00099_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga5b992a0cdc8298054edb68e228f0d93e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5b992a0cdc8298054edb68e228f0d93e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#ga5b992a0cdc8298054edb68e228f0d93e\">proj2D</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga5b992a0cdc8298054edb68e228f0d93e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build planar projection matrix along normal axis.  <a href=\"a00222.html#ga5b992a0cdc8298054edb68e228f0d93e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5b992a0cdc8298054edb68e228f0d93e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa2b7f4f15b98f697caede11bef50509e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa2b7f4f15b98f697caede11bef50509e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gaa2b7f4f15b98f697caede11bef50509e\">proj3D</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:gaa2b7f4f15b98f697caede11bef50509e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build planar projection matrix along normal axis.  <a href=\"a00222.html#gaa2b7f4f15b98f697caede11bef50509e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa2b7f4f15b98f697caede11bef50509e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabf249498b236e62c983d90d30d63c99c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabf249498b236e62c983d90d30d63c99c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gabf249498b236e62c983d90d30d63c99c\">scaleBias</a> (T scale, T bias)</td></tr>\n<tr class=\"memdesc:gabf249498b236e62c983d90d30d63c99c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a scale bias matrix.  <a href=\"a00222.html#gabf249498b236e62c983d90d30d63c99c\">More...</a><br /></td></tr>\n<tr class=\"separator:gabf249498b236e62c983d90d30d63c99c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae2bdd91a76759fecfbaef97e3020aa8e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae2bdd91a76759fecfbaef97e3020aa8e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e\">scaleBias</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T scale, T bias)</td></tr>\n<tr class=\"memdesc:gae2bdd91a76759fecfbaef97e3020aa8e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a scale bias matrix.  <a href=\"a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae2bdd91a76759fecfbaef97e3020aa8e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabf714b8a358181572b32a45555f71948\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabf714b8a358181572b32a45555f71948\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gabf714b8a358181572b32a45555f71948\">shearX2D</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T y)</td></tr>\n<tr class=\"memdesc:gabf714b8a358181572b32a45555f71948\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on X axis.  <a href=\"a00222.html#gabf714b8a358181572b32a45555f71948\">More...</a><br /></td></tr>\n<tr class=\"separator:gabf714b8a358181572b32a45555f71948\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73e867c6cd4d700fe2054437e56106c4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga73e867c6cd4d700fe2054437e56106c4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#ga73e867c6cd4d700fe2054437e56106c4\">shearX3D</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T y, T z)</td></tr>\n<tr class=\"memdesc:ga73e867c6cd4d700fe2054437e56106c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on X axis From GLM_GTX_transform2 extension.  <a href=\"a00222.html#ga73e867c6cd4d700fe2054437e56106c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73e867c6cd4d700fe2054437e56106c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7998d0763d9181550c77e8af09a182c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac7998d0763d9181550c77e8af09a182c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gac7998d0763d9181550c77e8af09a182c\">shearY2D</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T x)</td></tr>\n<tr class=\"memdesc:gac7998d0763d9181550c77e8af09a182c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on Y axis.  <a href=\"a00222.html#gac7998d0763d9181550c77e8af09a182c\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7998d0763d9181550c77e8af09a182c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade5bb65ffcb513973db1a1314fb5cfac\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gade5bb65ffcb513973db1a1314fb5cfac\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gade5bb65ffcb513973db1a1314fb5cfac\">shearY3D</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T x, T z)</td></tr>\n<tr class=\"memdesc:gade5bb65ffcb513973db1a1314fb5cfac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on Y axis.  <a href=\"a00222.html#gade5bb65ffcb513973db1a1314fb5cfac\">More...</a><br /></td></tr>\n<tr class=\"separator:gade5bb65ffcb513973db1a1314fb5cfac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6591e0a3a9d2c9c0b6577bb4dace0255\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6591e0a3a9d2c9c0b6577bb4dace0255\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#ga6591e0a3a9d2c9c0b6577bb4dace0255\">shearZ3D</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T x, T y)</td></tr>\n<tr class=\"memdesc:ga6591e0a3a9d2c9c0b6577bb4dace0255\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on Z axis.  <a href=\"a00222.html#ga6591e0a3a9d2c9c0b6577bb4dace0255\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6591e0a3a9d2c9c0b6577bb4dace0255\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00222.html\">GLM_GTX_transform2</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00221.html\" title=\"Include <glm/gtx/transform.hpp> to use the features of this extension. \">GLM_GTX_transform</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00099_source.html\">transform2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00099_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: transform2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">transform2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00099.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/transform.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_transform2 is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_transform2 extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00222.html#gabf714b8a358181572b32a45555f71948\">shearX2D</a>(mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T y);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00222.html#gac7998d0763d9181550c77e8af09a182c\">shearY2D</a>(mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T x);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00222.html#ga73e867c6cd4d700fe2054437e56106c4\">shearX3D</a>(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T y, T z);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00222.html#gade5bb65ffcb513973db1a1314fb5cfac\">shearY3D</a>(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T x, T z);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00222.html#ga6591e0a3a9d2c9c0b6577bb4dace0255\">shearZ3D</a>(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T x, T y);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"comment\">//template&lt;typename T&gt; GLM_FUNC_QUALIFIER mat&lt;4, 4, T, Q&gt; shear(const mat&lt;4, 4, T, Q&gt; &amp; m, shearPlane, planePoint, angle)</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"comment\">// Identity + tan(angle) * cross(Normal, OnPlaneVector)     0</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"comment\">// - dot(PointOnPlane, normal) * OnPlaneVector              1</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        <span class=\"comment\">// Reflect functions seem to don&#39;t work</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"comment\">//template&lt;typename T&gt; mat&lt;3, 3, T, Q&gt; reflect2D(const mat&lt;3, 3, T, Q&gt; &amp; m, const vec&lt;3, T, Q&gt;&amp; normal){return reflect2DGTX(m, normal);}                                                                        //!&lt; \\brief Build a reflection matrix (from GLM_GTX_transform2 extension)</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"comment\">//template&lt;typename T&gt; mat&lt;4, 4, T, Q&gt; reflect3D(const mat&lt;4, 4, T, Q&gt; &amp; m, const vec&lt;3, T, Q&gt;&amp; normal){return reflect3DGTX(m, normal);}                                                                        //!&lt; \\brief Build a reflection matrix (from GLM_GTX_transform2 extension)</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; <a class=\"code\" href=\"a00222.html#ga5b992a0cdc8298054edb68e228f0d93e\">proj2D</a>(mat&lt;3, 3, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; normal);</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00222.html#gaa2b7f4f15b98f697caede11bef50509e\">proj3D</a>(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span> &amp; m, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; normal);</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e\">scaleBias</a>(T <a class=\"code\" href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">scale</a>, T bias);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; <a class=\"code\" href=\"a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e\">scaleBias</a>(mat&lt;4, 4, T, Q&gt; <span class=\"keyword\">const</span>&amp; m, T <a class=\"code\" href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">scale</a>, T bias);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;<span class=\"preprocessor\">#include &quot;transform2.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00222_html_gaa2b7f4f15b98f697caede11bef50509e\"><div class=\"ttname\"><a href=\"a00222.html#gaa2b7f4f15b98f697caede11bef50509e\">glm::proj3D</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; proj3D(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;normal)</div><div class=\"ttdoc\">Build planar projection matrix along normal axis. </div></div>\n<div class=\"ttc\" id=\"a00222_html_gabf714b8a358181572b32a45555f71948\"><div class=\"ttname\"><a href=\"a00222.html#gabf714b8a358181572b32a45555f71948\">glm::shearX2D</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; shearX2D(mat&lt; 3, 3, T, Q &gt; const &amp;m, T y)</div><div class=\"ttdoc\">Transforms a matrix with a shearing on X axis. </div></div>\n<div class=\"ttc\" id=\"a00222_html_ga73e867c6cd4d700fe2054437e56106c4\"><div class=\"ttname\"><a href=\"a00222.html#ga73e867c6cd4d700fe2054437e56106c4\">glm::shearX3D</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; shearX3D(mat&lt; 4, 4, T, Q &gt; const &amp;m, T y, T z)</div><div class=\"ttdoc\">Transforms a matrix with a shearing on X axis From GLM_GTX_transform2 extension. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00222_html_gae2bdd91a76759fecfbaef97e3020aa8e\"><div class=\"ttname\"><a href=\"a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e\">glm::scaleBias</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; scaleBias(mat&lt; 4, 4, T, Q &gt; const &amp;m, T scale, T bias)</div><div class=\"ttdoc\">Build a scale bias matrix. </div></div>\n<div class=\"ttc\" id=\"a00157_html_ga05051adbee603fb3c5095d8cf5cc229b\"><div class=\"ttname\"><a href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">glm::scale</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; scale(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Builds a scale 4 * 4 matrix created from 3 scalars. </div></div>\n<div class=\"ttc\" id=\"a00222_html_gade5bb65ffcb513973db1a1314fb5cfac\"><div class=\"ttname\"><a href=\"a00222.html#gade5bb65ffcb513973db1a1314fb5cfac\">glm::shearY3D</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; shearY3D(mat&lt; 4, 4, T, Q &gt; const &amp;m, T x, T z)</div><div class=\"ttdoc\">Transforms a matrix with a shearing on Y axis. </div></div>\n<div class=\"ttc\" id=\"a00222_html_ga5b992a0cdc8298054edb68e228f0d93e\"><div class=\"ttname\"><a href=\"a00222.html#ga5b992a0cdc8298054edb68e228f0d93e\">glm::proj2D</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; proj2D(mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;normal)</div><div class=\"ttdoc\">Build planar projection matrix along normal axis. </div></div>\n<div class=\"ttc\" id=\"a00222_html_gac7998d0763d9181550c77e8af09a182c\"><div class=\"ttname\"><a href=\"a00222.html#gac7998d0763d9181550c77e8af09a182c\">glm::shearY2D</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt; shearY2D(mat&lt; 3, 3, T, Q &gt; const &amp;m, T x)</div><div class=\"ttdoc\">Transforms a matrix with a shearing on Y axis. </div></div>\n<div class=\"ttc\" id=\"a00222_html_ga6591e0a3a9d2c9c0b6577bb4dace0255\"><div class=\"ttname\"><a href=\"a00222.html#ga6591e0a3a9d2c9c0b6577bb4dace0255\">glm::shearZ3D</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt; shearZ3D(mat&lt; 4, 4, T, Q &gt; const &amp;m, T x, T y)</div><div class=\"ttdoc\">Transforms a matrix with a shearing on Z axis. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00100.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: trigonometric.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">trigonometric.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00100_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gacc9b092df8257c68f19c9053703e2563\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacc9b092df8257c68f19c9053703e2563\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gacc9b092df8257c68f19c9053703e2563\">acos</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gacc9b092df8257c68f19c9053703e2563\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc cosine.  <a href=\"a00232.html#gacc9b092df8257c68f19c9053703e2563\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc9b092df8257c68f19c9053703e2563\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga858f35dc66fd2688f20c52b5f25be76a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga858f35dc66fd2688f20c52b5f25be76a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga858f35dc66fd2688f20c52b5f25be76a\">acosh</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga858f35dc66fd2688f20c52b5f25be76a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc hyperbolic cosine; returns the non-negative inverse of cosh.  <a href=\"a00232.html#ga858f35dc66fd2688f20c52b5f25be76a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga858f35dc66fd2688f20c52b5f25be76a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0552d2df4865fa8c3d7cfc3ec2caac73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0552d2df4865fa8c3d7cfc3ec2caac73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga0552d2df4865fa8c3d7cfc3ec2caac73\">asin</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga0552d2df4865fa8c3d7cfc3ec2caac73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc sine.  <a href=\"a00232.html#ga0552d2df4865fa8c3d7cfc3ec2caac73\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0552d2df4865fa8c3d7cfc3ec2caac73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ef16b501ee859fddde88e22192a5950\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3ef16b501ee859fddde88e22192a5950\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga3ef16b501ee859fddde88e22192a5950\">asinh</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3ef16b501ee859fddde88e22192a5950\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc hyperbolic sine; returns the inverse of sinh.  <a href=\"a00232.html#ga3ef16b501ee859fddde88e22192a5950\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ef16b501ee859fddde88e22192a5950\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac61629f3a4aa14057e7a8cae002291db\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac61629f3a4aa14057e7a8cae002291db\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">atan</a> (vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gac61629f3a4aa14057e7a8cae002291db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent.  <a href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">More...</a><br /></td></tr>\n<tr class=\"separator:gac61629f3a4aa14057e7a8cae002291db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5229f087eaccbc466f1c609ce3107b95\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5229f087eaccbc466f1c609ce3107b95\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga5229f087eaccbc466f1c609ce3107b95\">atan</a> (vec&lt; L, T, Q &gt; const &amp;y_over_x)</td></tr>\n<tr class=\"memdesc:ga5229f087eaccbc466f1c609ce3107b95\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent.  <a href=\"a00232.html#ga5229f087eaccbc466f1c609ce3107b95\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5229f087eaccbc466f1c609ce3107b95\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabc925650e618357d07da255531658b87\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabc925650e618357d07da255531658b87\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gabc925650e618357d07da255531658b87\">atanh</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gabc925650e618357d07da255531658b87\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc hyperbolic tangent; returns the inverse of tanh.  <a href=\"a00232.html#gabc925650e618357d07da255531658b87\">More...</a><br /></td></tr>\n<tr class=\"separator:gabc925650e618357d07da255531658b87\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6a41efc740e3b3c937447d3a6284130e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6a41efc740e3b3c937447d3a6284130e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga6a41efc740e3b3c937447d3a6284130e\">cos</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga6a41efc740e3b3c937447d3a6284130e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">The standard trigonometric cosine function.  <a href=\"a00232.html#ga6a41efc740e3b3c937447d3a6284130e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6a41efc740e3b3c937447d3a6284130e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4e260e372742c5f517aca196cf1e62b3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4e260e372742c5f517aca196cf1e62b3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga4e260e372742c5f517aca196cf1e62b3\">cosh</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga4e260e372742c5f517aca196cf1e62b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2.  <a href=\"a00232.html#ga4e260e372742c5f517aca196cf1e62b3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4e260e372742c5f517aca196cf1e62b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8faec9e303538065911ba8b3caf7326b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8faec9e303538065911ba8b3caf7326b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga8faec9e303538065911ba8b3caf7326b\">degrees</a> (vec&lt; L, T, Q &gt; const &amp;radians)</td></tr>\n<tr class=\"memdesc:ga8faec9e303538065911ba8b3caf7326b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts radians to degrees and returns the result.  <a href=\"a00232.html#ga8faec9e303538065911ba8b3caf7326b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8faec9e303538065911ba8b3caf7326b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e1db4862c5e25afd553930e2fdd6a68\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6e1db4862c5e25afd553930e2fdd6a68\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68\">radians</a> (vec&lt; L, T, Q &gt; const &amp;degrees)</td></tr>\n<tr class=\"memdesc:ga6e1db4862c5e25afd553930e2fdd6a68\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts degrees to radians and returns the result.  <a href=\"a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e1db4862c5e25afd553930e2fdd6a68\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga29747fd108cb7292ae5a284f69691a69\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga29747fd108cb7292ae5a284f69691a69\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga29747fd108cb7292ae5a284f69691a69\">sin</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga29747fd108cb7292ae5a284f69691a69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">The standard trigonometric sine function.  <a href=\"a00232.html#ga29747fd108cb7292ae5a284f69691a69\">More...</a><br /></td></tr>\n<tr class=\"separator:ga29747fd108cb7292ae5a284f69691a69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7c39ff21809e281552b4dbe46f4a39d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac7c39ff21809e281552b4dbe46f4a39d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gac7c39ff21809e281552b4dbe46f4a39d\">sinh</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:gac7c39ff21809e281552b4dbe46f4a39d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2.  <a href=\"a00232.html#gac7c39ff21809e281552b4dbe46f4a39d\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7c39ff21809e281552b4dbe46f4a39d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga293a34cfb9f0115cc606b4a97c84f11f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga293a34cfb9f0115cc606b4a97c84f11f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga293a34cfb9f0115cc606b4a97c84f11f\">tan</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga293a34cfb9f0115cc606b4a97c84f11f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">The standard trigonometric tangent function.  <a href=\"a00232.html#ga293a34cfb9f0115cc606b4a97c84f11f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga293a34cfb9f0115cc606b4a97c84f11f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\">tanh</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the hyperbolic tangent function, sinh(angle) / cosh(angle)  <a href=\"a00232.html#gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><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> </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00100_source.html\">trigonometric.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00100_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: trigonometric.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">trigonometric.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00100.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00082.html\">detail/qualifier.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68\">radians</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00232.html#ga8faec9e303538065911ba8b3caf7326b\">degrees</a>);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        GLM_FUNC_DECL GLM_CONSTEXPR vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga8faec9e303538065911ba8b3caf7326b\">degrees</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68\">radians</a>);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga29747fd108cb7292ae5a284f69691a69\">sin</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga6a41efc740e3b3c937447d3a6284130e\">cos</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga293a34cfb9f0115cc606b4a97c84f11f\">tan</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga0552d2df4865fa8c3d7cfc3ec2caac73\">asin</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#gacc9b092df8257c68f19c9053703e2563\">acos</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga5229f087eaccbc466f1c609ce3107b95\">atan</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga5229f087eaccbc466f1c609ce3107b95\">atan</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y_over_x);</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#gac7c39ff21809e281552b4dbe46f4a39d\">sinh</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga4e260e372742c5f517aca196cf1e62b3\">cosh</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\">tanh</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a>);</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga3ef16b501ee859fddde88e22192a5950\">asinh</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#ga858f35dc66fd2688f20c52b5f25be76a\">acosh</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;        GLM_FUNC_DECL vec&lt;L, T, Q&gt; <a class=\"code\" href=\"a00232.html#gabc925650e618357d07da255531658b87\">atanh</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;<span class=\"preprocessor\">#include &quot;detail/func_trigonometric.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00232_html_ga6e1db4862c5e25afd553930e2fdd6a68\"><div class=\"ttname\"><a href=\"a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68\">glm::radians</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR vec&lt; L, T, Q &gt; radians(vec&lt; L, T, Q &gt; const &amp;degrees)</div><div class=\"ttdoc\">Converts degrees to radians and returns the result. </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga4e260e372742c5f517aca196cf1e62b3\"><div class=\"ttname\"><a href=\"a00232.html#ga4e260e372742c5f517aca196cf1e62b3\">glm::cosh</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; cosh(vec&lt; L, T, Q &gt; const &amp;angle)</div><div class=\"ttdoc\">Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2. </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga3ef16b501ee859fddde88e22192a5950\"><div class=\"ttname\"><a href=\"a00232.html#ga3ef16b501ee859fddde88e22192a5950\">glm::asinh</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; asinh(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Arc hyperbolic sine; returns the inverse of sinh. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00232_html_gabc925650e618357d07da255531658b87\"><div class=\"ttname\"><a href=\"a00232.html#gabc925650e618357d07da255531658b87\">glm::atanh</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; atanh(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Arc hyperbolic tangent; returns the inverse of tanh. </div></div>\n<div class=\"ttc\" id=\"a00232_html_gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><div class=\"ttname\"><a href=\"a00232.html#gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\">glm::tanh</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; tanh(vec&lt; L, T, Q &gt; const &amp;angle)</div><div class=\"ttdoc\">Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) </div></div>\n<div class=\"ttc\" id=\"a00082_html\"><div class=\"ttname\"><a href=\"a00082.html\">qualifier.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga29747fd108cb7292ae5a284f69691a69\"><div class=\"ttname\"><a href=\"a00232.html#ga29747fd108cb7292ae5a284f69691a69\">glm::sin</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; sin(vec&lt; L, T, Q &gt; const &amp;angle)</div><div class=\"ttdoc\">The standard trigonometric sine function. </div></div>\n<div class=\"ttc\" id=\"a00232_html_gacc9b092df8257c68f19c9053703e2563\"><div class=\"ttname\"><a href=\"a00232.html#gacc9b092df8257c68f19c9053703e2563\">glm::acos</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; acos(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Arc cosine. </div></div>\n<div class=\"ttc\" id=\"a00160_html_gaaee6c856cae3217d274a240238cb6373\"><div class=\"ttname\"><a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(tquat&lt; T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the quaternion rotation angle. </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga858f35dc66fd2688f20c52b5f25be76a\"><div class=\"ttname\"><a href=\"a00232.html#ga858f35dc66fd2688f20c52b5f25be76a\">glm::acosh</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; acosh(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Arc hyperbolic cosine; returns the non-negative inverse of cosh. </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga5229f087eaccbc466f1c609ce3107b95\"><div class=\"ttname\"><a href=\"a00232.html#ga5229f087eaccbc466f1c609ce3107b95\">glm::atan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; atan(vec&lt; L, T, Q &gt; const &amp;y_over_x)</div><div class=\"ttdoc\">Arc tangent. </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga6a41efc740e3b3c937447d3a6284130e\"><div class=\"ttname\"><a href=\"a00232.html#ga6a41efc740e3b3c937447d3a6284130e\">glm::cos</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; cos(vec&lt; L, T, Q &gt; const &amp;angle)</div><div class=\"ttdoc\">The standard trigonometric cosine function. </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga8faec9e303538065911ba8b3caf7326b\"><div class=\"ttname\"><a href=\"a00232.html#ga8faec9e303538065911ba8b3caf7326b\">glm::degrees</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR vec&lt; L, T, Q &gt; degrees(vec&lt; L, T, Q &gt; const &amp;radians)</div><div class=\"ttdoc\">Converts radians to degrees and returns the result. </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga293a34cfb9f0115cc606b4a97c84f11f\"><div class=\"ttname\"><a href=\"a00232.html#ga293a34cfb9f0115cc606b4a97c84f11f\">glm::tan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; tan(vec&lt; L, T, Q &gt; const &amp;angle)</div><div class=\"ttdoc\">The standard trigonometric tangent function. </div></div>\n<div class=\"ttc\" id=\"a00232_html_ga0552d2df4865fa8c3d7cfc3ec2caac73\"><div class=\"ttname\"><a href=\"a00232.html#ga0552d2df4865fa8c3d7cfc3ec2caac73\">glm::asin</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; asin(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Arc sine. </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00232_html_gac7c39ff21809e281552b4dbe46f4a39d\"><div class=\"ttname\"><a href=\"a00232.html#gac7c39ff21809e281552b4dbe46f4a39d\">glm::sinh</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; sinh(vec&lt; L, T, Q &gt; const &amp;angle)</div><div class=\"ttdoc\">Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00101.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_aligned.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/type_aligned.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00164.html\">GLM_GTC_type_aligned</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00101_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga780a35f764020f553a9601a3fcdcd059\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga780a35f764020f553a9601a3fcdcd059\"></a>\ntypedef aligned_highp_bvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga780a35f764020f553a9601a3fcdcd059\">aligned_bvec1</a></td></tr>\n<tr class=\"memdesc:ga780a35f764020f553a9601a3fcdcd059\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga780a35f764020f553a9601a3fcdcd059\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae766b317c5afec852bfb3d74a3c54bc8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae766b317c5afec852bfb3d74a3c54bc8\"></a>\ntypedef aligned_highp_bvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae766b317c5afec852bfb3d74a3c54bc8\">aligned_bvec2</a></td></tr>\n<tr class=\"memdesc:gae766b317c5afec852bfb3d74a3c54bc8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae766b317c5afec852bfb3d74a3c54bc8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1964ba70d15915e5b710926decbb3cb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae1964ba70d15915e5b710926decbb3cb\"></a>\ntypedef aligned_highp_bvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae1964ba70d15915e5b710926decbb3cb\">aligned_bvec3</a></td></tr>\n<tr class=\"memdesc:gae1964ba70d15915e5b710926decbb3cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae1964ba70d15915e5b710926decbb3cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae164a1f7879f828bc35e50b79d786b05\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae164a1f7879f828bc35e50b79d786b05\"></a>\ntypedef aligned_highp_bvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae164a1f7879f828bc35e50b79d786b05\">aligned_bvec4</a></td></tr>\n<tr class=\"memdesc:gae164a1f7879f828bc35e50b79d786b05\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae164a1f7879f828bc35e50b79d786b05\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4974f46ae5a19415d91316960a53617a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4974f46ae5a19415d91316960a53617a\"></a>\ntypedef aligned_highp_dvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">aligned_dvec1</a></td></tr>\n<tr class=\"memdesc:ga4974f46ae5a19415d91316960a53617a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga4974f46ae5a19415d91316960a53617a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga18d859f87122b2b3b2992ffe86dbebc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga18d859f87122b2b3b2992ffe86dbebc0\"></a>\ntypedef aligned_highp_dvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">aligned_dvec2</a></td></tr>\n<tr class=\"memdesc:ga18d859f87122b2b3b2992ffe86dbebc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga18d859f87122b2b3b2992ffe86dbebc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa37869eea77d28419b2fb0ff70b69bf0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa37869eea77d28419b2fb0ff70b69bf0\"></a>\ntypedef aligned_highp_dvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">aligned_dvec3</a></td></tr>\n<tr class=\"memdesc:gaa37869eea77d28419b2fb0ff70b69bf0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:gaa37869eea77d28419b2fb0ff70b69bf0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8a9f0a4795ccc442fa9901845026f9f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8a9f0a4795ccc442fa9901845026f9f5\"></a>\ntypedef aligned_highp_dvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">aligned_dvec4</a></td></tr>\n<tr class=\"memdesc:ga8a9f0a4795ccc442fa9901845026f9f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga8a9f0a4795ccc442fa9901845026f9f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga862843a45b01c35ffe4d44c47ea774ad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga862843a45b01c35ffe4d44c47ea774ad\"></a>\ntypedef vec&lt; 1, bool, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga862843a45b01c35ffe4d44c47ea774ad\">aligned_highp_bvec1</a></td></tr>\n<tr class=\"memdesc:ga862843a45b01c35ffe4d44c47ea774ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga862843a45b01c35ffe4d44c47ea774ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0731b593c5e33559954c80f8687e76c6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0731b593c5e33559954c80f8687e76c6\"></a>\ntypedef vec&lt; 2, bool, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0731b593c5e33559954c80f8687e76c6\">aligned_highp_bvec2</a></td></tr>\n<tr class=\"memdesc:ga0731b593c5e33559954c80f8687e76c6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga0731b593c5e33559954c80f8687e76c6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0913bdf048d0cb74af1d2512aec675bc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0913bdf048d0cb74af1d2512aec675bc\"></a>\ntypedef vec&lt; 3, bool, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0913bdf048d0cb74af1d2512aec675bc\">aligned_highp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga0913bdf048d0cb74af1d2512aec675bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga0913bdf048d0cb74af1d2512aec675bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9df1d0c425852cf63a57e533b7a83f4f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9df1d0c425852cf63a57e533b7a83f4f\"></a>\ntypedef vec&lt; 4, bool, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga9df1d0c425852cf63a57e533b7a83f4f\">aligned_highp_bvec4</a></td></tr>\n<tr class=\"memdesc:ga9df1d0c425852cf63a57e533b7a83f4f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga9df1d0c425852cf63a57e533b7a83f4f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf0448b0f7ceb8273f7eda3a92205eefc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf0448b0f7ceb8273f7eda3a92205eefc\"></a>\ntypedef vec&lt; 1, double, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaf0448b0f7ceb8273f7eda3a92205eefc\">aligned_highp_dvec1</a></td></tr>\n<tr class=\"memdesc:gaf0448b0f7ceb8273f7eda3a92205eefc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gaf0448b0f7ceb8273f7eda3a92205eefc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab173a333e6b7ce153ceba66ac4a321cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab173a333e6b7ce153ceba66ac4a321cf\"></a>\ntypedef vec&lt; 2, double, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab173a333e6b7ce153ceba66ac4a321cf\">aligned_highp_dvec2</a></td></tr>\n<tr class=\"memdesc:gab173a333e6b7ce153ceba66ac4a321cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab173a333e6b7ce153ceba66ac4a321cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae94ef61edfa047d05bc69b6065fc42ba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae94ef61edfa047d05bc69b6065fc42ba\"></a>\ntypedef vec&lt; 3, double, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae94ef61edfa047d05bc69b6065fc42ba\">aligned_highp_dvec3</a></td></tr>\n<tr class=\"memdesc:gae94ef61edfa047d05bc69b6065fc42ba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gae94ef61edfa047d05bc69b6065fc42ba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8fad35c5677f228e261fe541f15363a4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8fad35c5677f228e261fe541f15363a4\"></a>\ntypedef vec&lt; 4, double, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8fad35c5677f228e261fe541f15363a4\">aligned_highp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga8fad35c5677f228e261fe541f15363a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga8fad35c5677f228e261fe541f15363a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad63b8c5b4dc0500d54d7414ef555178f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad63b8c5b4dc0500d54d7414ef555178f\"></a>\ntypedef vec&lt; 1, int, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad63b8c5b4dc0500d54d7414ef555178f\">aligned_highp_ivec1</a></td></tr>\n<tr class=\"memdesc:gad63b8c5b4dc0500d54d7414ef555178f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gad63b8c5b4dc0500d54d7414ef555178f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41563650f36cb7f479e080de21e08418\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga41563650f36cb7f479e080de21e08418\"></a>\ntypedef vec&lt; 2, int, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga41563650f36cb7f479e080de21e08418\">aligned_highp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga41563650f36cb7f479e080de21e08418\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga41563650f36cb7f479e080de21e08418\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6eca5170bb35eac90b4972590fd31a06\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6eca5170bb35eac90b4972590fd31a06\"></a>\ntypedef vec&lt; 3, int, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6eca5170bb35eac90b4972590fd31a06\">aligned_highp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga6eca5170bb35eac90b4972590fd31a06\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga6eca5170bb35eac90b4972590fd31a06\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31bfa801e1579fdba752ec3f7a45ec91\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga31bfa801e1579fdba752ec3f7a45ec91\"></a>\ntypedef vec&lt; 4, int, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga31bfa801e1579fdba752ec3f7a45ec91\">aligned_highp_ivec4</a></td></tr>\n<tr class=\"memdesc:ga31bfa801e1579fdba752ec3f7a45ec91\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga31bfa801e1579fdba752ec3f7a45ec91\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5b80e28396c6ef7d32c6fd18df498451\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5b80e28396c6ef7d32c6fd18df498451\"></a>\ntypedef vec&lt; 1, uint, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5b80e28396c6ef7d32c6fd18df498451\">aligned_highp_uvec1</a></td></tr>\n<tr class=\"memdesc:ga5b80e28396c6ef7d32c6fd18df498451\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga5b80e28396c6ef7d32c6fd18df498451\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04db692662a4908beeaf5a5ba6e19483\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga04db692662a4908beeaf5a5ba6e19483\"></a>\ntypedef vec&lt; 2, uint, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga04db692662a4908beeaf5a5ba6e19483\">aligned_highp_uvec2</a></td></tr>\n<tr class=\"memdesc:ga04db692662a4908beeaf5a5ba6e19483\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga04db692662a4908beeaf5a5ba6e19483\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga073fd6e8b241afade6d8afbd676b2667\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga073fd6e8b241afade6d8afbd676b2667\"></a>\ntypedef vec&lt; 3, uint, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga073fd6e8b241afade6d8afbd676b2667\">aligned_highp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga073fd6e8b241afade6d8afbd676b2667\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga073fd6e8b241afade6d8afbd676b2667\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabdd60462042859f876c17c7346c732a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabdd60462042859f876c17c7346c732a5\"></a>\ntypedef vec&lt; 4, uint, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gabdd60462042859f876c17c7346c732a5\">aligned_highp_uvec4</a></td></tr>\n<tr class=\"memdesc:gabdd60462042859f876c17c7346c732a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gabdd60462042859f876c17c7346c732a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d0bd70d5fac49b800546d608b707513\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4d0bd70d5fac49b800546d608b707513\"></a>\ntypedef vec&lt; 1, float, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga4d0bd70d5fac49b800546d608b707513\">aligned_highp_vec1</a></td></tr>\n<tr class=\"memdesc:ga4d0bd70d5fac49b800546d608b707513\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga4d0bd70d5fac49b800546d608b707513\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac9f8482dde741fb6bab7248b81a45465\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac9f8482dde741fb6bab7248b81a45465\"></a>\ntypedef vec&lt; 2, float, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gac9f8482dde741fb6bab7248b81a45465\">aligned_highp_vec2</a></td></tr>\n<tr class=\"memdesc:gac9f8482dde741fb6bab7248b81a45465\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gac9f8482dde741fb6bab7248b81a45465\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga65415d2d68c9cc0ca554524a8f5510b2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga65415d2d68c9cc0ca554524a8f5510b2\"></a>\ntypedef vec&lt; 3, float, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga65415d2d68c9cc0ca554524a8f5510b2\">aligned_highp_vec3</a></td></tr>\n<tr class=\"memdesc:ga65415d2d68c9cc0ca554524a8f5510b2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga65415d2d68c9cc0ca554524a8f5510b2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7cb26d354dd69d23849c34c4fba88da9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7cb26d354dd69d23849c34c4fba88da9\"></a>\ntypedef vec&lt; 4, float, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7cb26d354dd69d23849c34c4fba88da9\">aligned_highp_vec4</a></td></tr>\n<tr class=\"memdesc:ga7cb26d354dd69d23849c34c4fba88da9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga7cb26d354dd69d23849c34c4fba88da9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga76298aed82a439063c3d55980c84aa0b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga76298aed82a439063c3d55980c84aa0b\"></a>\ntypedef aligned_highp_ivec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">aligned_ivec1</a></td></tr>\n<tr class=\"memdesc:ga76298aed82a439063c3d55980c84aa0b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga76298aed82a439063c3d55980c84aa0b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae4f38fd2c86cee6940986197777b3ca4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae4f38fd2c86cee6940986197777b3ca4\"></a>\ntypedef aligned_highp_ivec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">aligned_ivec2</a></td></tr>\n<tr class=\"memdesc:gae4f38fd2c86cee6940986197777b3ca4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gae4f38fd2c86cee6940986197777b3ca4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga32794322d294e5ace7fed4a61896f270\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga32794322d294e5ace7fed4a61896f270\"></a>\ntypedef aligned_highp_ivec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">aligned_ivec3</a></td></tr>\n<tr class=\"memdesc:ga32794322d294e5ace7fed4a61896f270\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga32794322d294e5ace7fed4a61896f270\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f79eae5927c9033d84617e49f6f34e4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7f79eae5927c9033d84617e49f6f34e4\"></a>\ntypedef aligned_highp_ivec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">aligned_ivec4</a></td></tr>\n<tr class=\"memdesc:ga7f79eae5927c9033d84617e49f6f34e4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga7f79eae5927c9033d84617e49f6f34e4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac6036449ab1c4abf8efe1ea00fcdd1c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac6036449ab1c4abf8efe1ea00fcdd1c9\"></a>\ntypedef vec&lt; 1, bool, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gac6036449ab1c4abf8efe1ea00fcdd1c9\">aligned_lowp_bvec1</a></td></tr>\n<tr class=\"memdesc:gac6036449ab1c4abf8efe1ea00fcdd1c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gac6036449ab1c4abf8efe1ea00fcdd1c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga59fadcd3835646e419372ae8b43c5d37\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga59fadcd3835646e419372ae8b43c5d37\"></a>\ntypedef vec&lt; 2, bool, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga59fadcd3835646e419372ae8b43c5d37\">aligned_lowp_bvec2</a></td></tr>\n<tr class=\"memdesc:ga59fadcd3835646e419372ae8b43c5d37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga59fadcd3835646e419372ae8b43c5d37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga83aab4d191053f169c93a3e364f2e118\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga83aab4d191053f169c93a3e364f2e118\"></a>\ntypedef vec&lt; 3, bool, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga83aab4d191053f169c93a3e364f2e118\">aligned_lowp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga83aab4d191053f169c93a3e364f2e118\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga83aab4d191053f169c93a3e364f2e118\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7a76555ee4853614e5755181a8dd54e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa7a76555ee4853614e5755181a8dd54e\"></a>\ntypedef vec&lt; 4, bool, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaa7a76555ee4853614e5755181a8dd54e\">aligned_lowp_bvec4</a></td></tr>\n<tr class=\"memdesc:gaa7a76555ee4853614e5755181a8dd54e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gaa7a76555ee4853614e5755181a8dd54e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f8a2cc5a686e52b1615761f4978ca62\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7f8a2cc5a686e52b1615761f4978ca62\"></a>\ntypedef vec&lt; 1, double, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7f8a2cc5a686e52b1615761f4978ca62\">aligned_lowp_dvec1</a></td></tr>\n<tr class=\"memdesc:ga7f8a2cc5a686e52b1615761f4978ca62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga7f8a2cc5a686e52b1615761f4978ca62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0e37cff4a43cca866101f0a35f01db6d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0e37cff4a43cca866101f0a35f01db6d\"></a>\ntypedef vec&lt; 2, double, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0e37cff4a43cca866101f0a35f01db6d\">aligned_lowp_dvec2</a></td></tr>\n<tr class=\"memdesc:ga0e37cff4a43cca866101f0a35f01db6d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga0e37cff4a43cca866101f0a35f01db6d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab9e669c4efd52d3347fc6d5f6b20fd59\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab9e669c4efd52d3347fc6d5f6b20fd59\"></a>\ntypedef vec&lt; 3, double, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab9e669c4efd52d3347fc6d5f6b20fd59\">aligned_lowp_dvec3</a></td></tr>\n<tr class=\"memdesc:gab9e669c4efd52d3347fc6d5f6b20fd59\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab9e669c4efd52d3347fc6d5f6b20fd59\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga226f5ec7a953cea559c16fe3aff9924f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga226f5ec7a953cea559c16fe3aff9924f\"></a>\ntypedef vec&lt; 4, double, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga226f5ec7a953cea559c16fe3aff9924f\">aligned_lowp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga226f5ec7a953cea559c16fe3aff9924f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga226f5ec7a953cea559c16fe3aff9924f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1101d3a82b2e3f5f8828bd8f3adab3e1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1101d3a82b2e3f5f8828bd8f3adab3e1\"></a>\ntypedef vec&lt; 1, int, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1101d3a82b2e3f5f8828bd8f3adab3e1\">aligned_lowp_ivec1</a></td></tr>\n<tr class=\"memdesc:ga1101d3a82b2e3f5f8828bd8f3adab3e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga1101d3a82b2e3f5f8828bd8f3adab3e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga44c4accad582cfbd7226a19b83b0cadc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga44c4accad582cfbd7226a19b83b0cadc\"></a>\ntypedef vec&lt; 2, int, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga44c4accad582cfbd7226a19b83b0cadc\">aligned_lowp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga44c4accad582cfbd7226a19b83b0cadc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga44c4accad582cfbd7226a19b83b0cadc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga65663f10a02e52cedcddbcfe36ddf38d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga65663f10a02e52cedcddbcfe36ddf38d\"></a>\ntypedef vec&lt; 3, int, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga65663f10a02e52cedcddbcfe36ddf38d\">aligned_lowp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga65663f10a02e52cedcddbcfe36ddf38d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga65663f10a02e52cedcddbcfe36ddf38d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaae92fcec8b2e0328ffbeac31cc4fc419\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaae92fcec8b2e0328ffbeac31cc4fc419\"></a>\ntypedef vec&lt; 4, int, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaae92fcec8b2e0328ffbeac31cc4fc419\">aligned_lowp_ivec4</a></td></tr>\n<tr class=\"memdesc:gaae92fcec8b2e0328ffbeac31cc4fc419\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gaae92fcec8b2e0328ffbeac31cc4fc419\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad09b93acc43c43423408d17a64f6d7ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad09b93acc43c43423408d17a64f6d7ca\"></a>\ntypedef vec&lt; 1, uint, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad09b93acc43c43423408d17a64f6d7ca\">aligned_lowp_uvec1</a></td></tr>\n<tr class=\"memdesc:gad09b93acc43c43423408d17a64f6d7ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gad09b93acc43c43423408d17a64f6d7ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6f94fcd28dde906fc6cad5f742b55c1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6f94fcd28dde906fc6cad5f742b55c1a\"></a>\ntypedef vec&lt; 2, uint, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6f94fcd28dde906fc6cad5f742b55c1a\">aligned_lowp_uvec2</a></td></tr>\n<tr class=\"memdesc:ga6f94fcd28dde906fc6cad5f742b55c1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga6f94fcd28dde906fc6cad5f742b55c1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9e9f006970b1a00862e3e6e599eedd4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9e9f006970b1a00862e3e6e599eedd4c\"></a>\ntypedef vec&lt; 3, uint, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga9e9f006970b1a00862e3e6e599eedd4c\">aligned_lowp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga9e9f006970b1a00862e3e6e599eedd4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga9e9f006970b1a00862e3e6e599eedd4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga46b1b0b9eb8625a5d69137bd66cd13dc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga46b1b0b9eb8625a5d69137bd66cd13dc\"></a>\ntypedef vec&lt; 4, uint, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga46b1b0b9eb8625a5d69137bd66cd13dc\">aligned_lowp_uvec4</a></td></tr>\n<tr class=\"memdesc:ga46b1b0b9eb8625a5d69137bd66cd13dc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga46b1b0b9eb8625a5d69137bd66cd13dc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab34aee3d5e121c543fea11d2c50ecc43\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab34aee3d5e121c543fea11d2c50ecc43\"></a>\ntypedef vec&lt; 1, float, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab34aee3d5e121c543fea11d2c50ecc43\">aligned_lowp_vec1</a></td></tr>\n<tr class=\"memdesc:gab34aee3d5e121c543fea11d2c50ecc43\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab34aee3d5e121c543fea11d2c50ecc43\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga53ac5d252317f1fa43c2ef921857bf13\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga53ac5d252317f1fa43c2ef921857bf13\"></a>\ntypedef vec&lt; 2, float, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga53ac5d252317f1fa43c2ef921857bf13\">aligned_lowp_vec2</a></td></tr>\n<tr class=\"memdesc:ga53ac5d252317f1fa43c2ef921857bf13\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga53ac5d252317f1fa43c2ef921857bf13\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98f0b5cd65fce164ff1367c2a3b3aa1e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga98f0b5cd65fce164ff1367c2a3b3aa1e\"></a>\ntypedef vec&lt; 3, float, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga98f0b5cd65fce164ff1367c2a3b3aa1e\">aligned_lowp_vec3</a></td></tr>\n<tr class=\"memdesc:ga98f0b5cd65fce164ff1367c2a3b3aa1e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga98f0b5cd65fce164ff1367c2a3b3aa1e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga82f7275d6102593a69ce38cdad680409\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga82f7275d6102593a69ce38cdad680409\"></a>\ntypedef vec&lt; 4, float, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga82f7275d6102593a69ce38cdad680409\">aligned_lowp_vec4</a></td></tr>\n<tr class=\"memdesc:ga82f7275d6102593a69ce38cdad680409\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga82f7275d6102593a69ce38cdad680409\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadd3b8bd71a758f7fb0da8e525156f34e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gadd3b8bd71a758f7fb0da8e525156f34e\"></a>\ntypedef vec&lt; 1, bool, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gadd3b8bd71a758f7fb0da8e525156f34e\">aligned_mediump_bvec1</a></td></tr>\n<tr class=\"memdesc:gadd3b8bd71a758f7fb0da8e525156f34e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gadd3b8bd71a758f7fb0da8e525156f34e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb183eb5e67ec0d0ea5a016cba962810\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gacb183eb5e67ec0d0ea5a016cba962810\"></a>\ntypedef vec&lt; 2, bool, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gacb183eb5e67ec0d0ea5a016cba962810\">aligned_mediump_bvec2</a></td></tr>\n<tr class=\"memdesc:gacb183eb5e67ec0d0ea5a016cba962810\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gacb183eb5e67ec0d0ea5a016cba962810\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacfa4a542f1b20a5b63ad702dfb6fd587\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gacfa4a542f1b20a5b63ad702dfb6fd587\"></a>\ntypedef vec&lt; 3, bool, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gacfa4a542f1b20a5b63ad702dfb6fd587\">aligned_mediump_bvec3</a></td></tr>\n<tr class=\"memdesc:gacfa4a542f1b20a5b63ad702dfb6fd587\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gacfa4a542f1b20a5b63ad702dfb6fd587\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91bc1f513bb9b0fd60281d57ded9a48c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga91bc1f513bb9b0fd60281d57ded9a48c\"></a>\ntypedef vec&lt; 4, bool, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga91bc1f513bb9b0fd60281d57ded9a48c\">aligned_mediump_bvec4</a></td></tr>\n<tr class=\"memdesc:ga91bc1f513bb9b0fd60281d57ded9a48c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga91bc1f513bb9b0fd60281d57ded9a48c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7180b685c581adb224406a7f831608e3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7180b685c581adb224406a7f831608e3\"></a>\ntypedef vec&lt; 1, double, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7180b685c581adb224406a7f831608e3\">aligned_mediump_dvec1</a></td></tr>\n<tr class=\"memdesc:ga7180b685c581adb224406a7f831608e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga7180b685c581adb224406a7f831608e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9af1eabe22f569e70d9893be72eda0f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9af1eabe22f569e70d9893be72eda0f5\"></a>\ntypedef vec&lt; 2, double, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga9af1eabe22f569e70d9893be72eda0f5\">aligned_mediump_dvec2</a></td></tr>\n<tr class=\"memdesc:ga9af1eabe22f569e70d9893be72eda0f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga9af1eabe22f569e70d9893be72eda0f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga058e7ddab1428e47f2197bdd3a5a6953\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga058e7ddab1428e47f2197bdd3a5a6953\"></a>\ntypedef vec&lt; 3, double, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga058e7ddab1428e47f2197bdd3a5a6953\">aligned_mediump_dvec3</a></td></tr>\n<tr class=\"memdesc:ga058e7ddab1428e47f2197bdd3a5a6953\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga058e7ddab1428e47f2197bdd3a5a6953\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaffd747ea2aea1e69c2ecb04e68521b21\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaffd747ea2aea1e69c2ecb04e68521b21\"></a>\ntypedef vec&lt; 4, double, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaffd747ea2aea1e69c2ecb04e68521b21\">aligned_mediump_dvec4</a></td></tr>\n<tr class=\"memdesc:gaffd747ea2aea1e69c2ecb04e68521b21\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gaffd747ea2aea1e69c2ecb04e68521b21\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20e63dd980b81af10cadbbe219316650\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga20e63dd980b81af10cadbbe219316650\"></a>\ntypedef vec&lt; 1, int, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga20e63dd980b81af10cadbbe219316650\">aligned_mediump_ivec1</a></td></tr>\n<tr class=\"memdesc:ga20e63dd980b81af10cadbbe219316650\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga20e63dd980b81af10cadbbe219316650\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaea13d89d49daca2c796aeaa82fc2c2f2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaea13d89d49daca2c796aeaa82fc2c2f2\"></a>\ntypedef vec&lt; 2, int, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaea13d89d49daca2c796aeaa82fc2c2f2\">aligned_mediump_ivec2</a></td></tr>\n<tr class=\"memdesc:gaea13d89d49daca2c796aeaa82fc2c2f2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gaea13d89d49daca2c796aeaa82fc2c2f2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabbf0f15e9c3d9868e43241ad018f82bd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabbf0f15e9c3d9868e43241ad018f82bd\"></a>\ntypedef vec&lt; 3, int, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gabbf0f15e9c3d9868e43241ad018f82bd\">aligned_mediump_ivec3</a></td></tr>\n<tr class=\"memdesc:gabbf0f15e9c3d9868e43241ad018f82bd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gabbf0f15e9c3d9868e43241ad018f82bd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6099dd7878d0a78101a4250d8cd2d736\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6099dd7878d0a78101a4250d8cd2d736\"></a>\ntypedef vec&lt; 4, int, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6099dd7878d0a78101a4250d8cd2d736\">aligned_mediump_ivec4</a></td></tr>\n<tr class=\"memdesc:ga6099dd7878d0a78101a4250d8cd2d736\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga6099dd7878d0a78101a4250d8cd2d736\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb78126ea2eb779b41c7511128ff1283\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gacb78126ea2eb779b41c7511128ff1283\"></a>\ntypedef vec&lt; 1, uint, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gacb78126ea2eb779b41c7511128ff1283\">aligned_mediump_uvec1</a></td></tr>\n<tr class=\"memdesc:gacb78126ea2eb779b41c7511128ff1283\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gacb78126ea2eb779b41c7511128ff1283\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga081d53e0a71443d0b68ea61c870f9adc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga081d53e0a71443d0b68ea61c870f9adc\"></a>\ntypedef vec&lt; 2, uint, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga081d53e0a71443d0b68ea61c870f9adc\">aligned_mediump_uvec2</a></td></tr>\n<tr class=\"memdesc:ga081d53e0a71443d0b68ea61c870f9adc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga081d53e0a71443d0b68ea61c870f9adc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad6fc921bdde2bdbc7e09b028e1e9b379\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad6fc921bdde2bdbc7e09b028e1e9b379\"></a>\ntypedef vec&lt; 3, uint, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad6fc921bdde2bdbc7e09b028e1e9b379\">aligned_mediump_uvec3</a></td></tr>\n<tr class=\"memdesc:gad6fc921bdde2bdbc7e09b028e1e9b379\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gad6fc921bdde2bdbc7e09b028e1e9b379\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73ea0c1ba31580e107d21270883f51fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga73ea0c1ba31580e107d21270883f51fc\"></a>\ntypedef vec&lt; 4, uint, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga73ea0c1ba31580e107d21270883f51fc\">aligned_mediump_uvec4</a></td></tr>\n<tr class=\"memdesc:ga73ea0c1ba31580e107d21270883f51fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga73ea0c1ba31580e107d21270883f51fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6b797eec76fa471e300158f3453b3b2e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6b797eec76fa471e300158f3453b3b2e\"></a>\ntypedef vec&lt; 1, float, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6b797eec76fa471e300158f3453b3b2e\">aligned_mediump_vec1</a></td></tr>\n<tr class=\"memdesc:ga6b797eec76fa471e300158f3453b3b2e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga6b797eec76fa471e300158f3453b3b2e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga026a55ddbf2bafb1432f1157a2708616\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga026a55ddbf2bafb1432f1157a2708616\"></a>\ntypedef vec&lt; 2, float, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga026a55ddbf2bafb1432f1157a2708616\">aligned_mediump_vec2</a></td></tr>\n<tr class=\"memdesc:ga026a55ddbf2bafb1432f1157a2708616\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga026a55ddbf2bafb1432f1157a2708616\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3a25e494173f6a64637b08a1b50a2132\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3a25e494173f6a64637b08a1b50a2132\"></a>\ntypedef vec&lt; 3, float, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3a25e494173f6a64637b08a1b50a2132\">aligned_mediump_vec3</a></td></tr>\n<tr class=\"memdesc:ga3a25e494173f6a64637b08a1b50a2132\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga3a25e494173f6a64637b08a1b50a2132\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga320d1c661cff2ef214eb50241f2928b2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga320d1c661cff2ef214eb50241f2928b2\"></a>\ntypedef vec&lt; 4, float, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga320d1c661cff2ef214eb50241f2928b2\">aligned_mediump_vec4</a></td></tr>\n<tr class=\"memdesc:ga320d1c661cff2ef214eb50241f2928b2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga320d1c661cff2ef214eb50241f2928b2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ff8ed402c93d280ff0597c1c5e7c548\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1ff8ed402c93d280ff0597c1c5e7c548\"></a>\ntypedef aligned_highp_uvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">aligned_uvec1</a></td></tr>\n<tr class=\"memdesc:ga1ff8ed402c93d280ff0597c1c5e7c548\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga1ff8ed402c93d280ff0597c1c5e7c548\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga074137e3be58528d67041c223d49f398\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga074137e3be58528d67041c223d49f398\"></a>\ntypedef aligned_highp_uvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">aligned_uvec2</a></td></tr>\n<tr class=\"memdesc:ga074137e3be58528d67041c223d49f398\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga074137e3be58528d67041c223d49f398\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a8d9c3046f89d854eb758adfa0811c0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga2a8d9c3046f89d854eb758adfa0811c0\"></a>\ntypedef aligned_highp_uvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">aligned_uvec3</a></td></tr>\n<tr class=\"memdesc:ga2a8d9c3046f89d854eb758adfa0811c0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga2a8d9c3046f89d854eb758adfa0811c0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabf842c45eea186170c267a328e3f3b7d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabf842c45eea186170c267a328e3f3b7d\"></a>\ntypedef aligned_highp_uvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">aligned_uvec4</a></td></tr>\n<tr class=\"memdesc:gabf842c45eea186170c267a328e3f3b7d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gabf842c45eea186170c267a328e3f3b7d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga05e6d4c908965d04191c2070a8d0a65e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga05e6d4c908965d04191c2070a8d0a65e\"></a>\ntypedef aligned_highp_vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">aligned_vec1</a></td></tr>\n<tr class=\"memdesc:ga05e6d4c908965d04191c2070a8d0a65e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga05e6d4c908965d04191c2070a8d0a65e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0682462f8096a226773e20fac993cde5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0682462f8096a226773e20fac993cde5\"></a>\ntypedef aligned_highp_vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">aligned_vec2</a></td></tr>\n<tr class=\"memdesc:ga0682462f8096a226773e20fac993cde5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga0682462f8096a226773e20fac993cde5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7cf643b66664e0cd3c48759ae66c2bd0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7cf643b66664e0cd3c48759ae66c2bd0\"></a>\ntypedef aligned_highp_vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">aligned_vec3</a></td></tr>\n<tr class=\"memdesc:ga7cf643b66664e0cd3c48759ae66c2bd0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga7cf643b66664e0cd3c48759ae66c2bd0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85d89e83cb8137e1be1446de8c3b643a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga85d89e83cb8137e1be1446de8c3b643a\"></a>\ntypedef aligned_highp_vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">aligned_vec4</a></td></tr>\n<tr class=\"memdesc:ga85d89e83cb8137e1be1446de8c3b643a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga85d89e83cb8137e1be1446de8c3b643a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga88632cea9008ac0ac1388e94e804a53c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga88632cea9008ac0ac1388e94e804a53c\"></a>\ntypedef packed_highp_bvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga88632cea9008ac0ac1388e94e804a53c\">packed_bvec1</a></td></tr>\n<tr class=\"memdesc:ga88632cea9008ac0ac1388e94e804a53c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga88632cea9008ac0ac1388e94e804a53c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab85245913eaa40ab82adabcae37086cb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab85245913eaa40ab82adabcae37086cb\"></a>\ntypedef packed_highp_bvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab85245913eaa40ab82adabcae37086cb\">packed_bvec2</a></td></tr>\n<tr class=\"memdesc:gab85245913eaa40ab82adabcae37086cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gab85245913eaa40ab82adabcae37086cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c48f9417f649e27f3fb0c9f733a18bd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0c48f9417f649e27f3fb0c9f733a18bd\"></a>\ntypedef packed_highp_bvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0c48f9417f649e27f3fb0c9f733a18bd\">packed_bvec3</a></td></tr>\n<tr class=\"memdesc:ga0c48f9417f649e27f3fb0c9f733a18bd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga0c48f9417f649e27f3fb0c9f733a18bd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3180d7db84a74c402157df3bbc0ae3ed\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3180d7db84a74c402157df3bbc0ae3ed\"></a>\ntypedef packed_highp_bvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3180d7db84a74c402157df3bbc0ae3ed\">packed_bvec4</a></td></tr>\n<tr class=\"memdesc:ga3180d7db84a74c402157df3bbc0ae3ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga3180d7db84a74c402157df3bbc0ae3ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga532f0c940649b1ee303acd572fc35531\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga532f0c940649b1ee303acd572fc35531\"></a>\ntypedef packed_highp_dvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga532f0c940649b1ee303acd572fc35531\">packed_dvec1</a></td></tr>\n<tr class=\"memdesc:ga532f0c940649b1ee303acd572fc35531\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga532f0c940649b1ee303acd572fc35531\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5c194b11fbda636f2ab20c3bd0079196\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5c194b11fbda636f2ab20c3bd0079196\"></a>\ntypedef packed_highp_dvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5c194b11fbda636f2ab20c3bd0079196\">packed_dvec2</a></td></tr>\n<tr class=\"memdesc:ga5c194b11fbda636f2ab20c3bd0079196\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga5c194b11fbda636f2ab20c3bd0079196\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0581ea552d86b2b5de7a2804bed80e72\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0581ea552d86b2b5de7a2804bed80e72\"></a>\ntypedef packed_highp_dvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0581ea552d86b2b5de7a2804bed80e72\">packed_dvec3</a></td></tr>\n<tr class=\"memdesc:ga0581ea552d86b2b5de7a2804bed80e72\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga0581ea552d86b2b5de7a2804bed80e72\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8a9b181f9dc813ad6e125a52b14b935\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae8a9b181f9dc813ad6e125a52b14b935\"></a>\ntypedef packed_highp_dvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae8a9b181f9dc813ad6e125a52b14b935\">packed_dvec4</a></td></tr>\n<tr class=\"memdesc:gae8a9b181f9dc813ad6e125a52b14b935\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:gae8a9b181f9dc813ad6e125a52b14b935\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga439e97795314b81cd15abd4e5c2e6e7a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga439e97795314b81cd15abd4e5c2e6e7a\"></a>\ntypedef vec&lt; 1, bool, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga439e97795314b81cd15abd4e5c2e6e7a\">packed_highp_bvec1</a></td></tr>\n<tr class=\"memdesc:ga439e97795314b81cd15abd4e5c2e6e7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga439e97795314b81cd15abd4e5c2e6e7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad791d671f4fcf1ed1ea41f752916b70a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad791d671f4fcf1ed1ea41f752916b70a\"></a>\ntypedef vec&lt; 2, bool, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad791d671f4fcf1ed1ea41f752916b70a\">packed_highp_bvec2</a></td></tr>\n<tr class=\"memdesc:gad791d671f4fcf1ed1ea41f752916b70a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gad791d671f4fcf1ed1ea41f752916b70a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6a5a3250b57dfadc66735bc72911437f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6a5a3250b57dfadc66735bc72911437f\"></a>\ntypedef vec&lt; 3, bool, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6a5a3250b57dfadc66735bc72911437f\">packed_highp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga6a5a3250b57dfadc66735bc72911437f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga6a5a3250b57dfadc66735bc72911437f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09f517d88b996ef1b2f42fd54222b82d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga09f517d88b996ef1b2f42fd54222b82d\"></a>\ntypedef vec&lt; 4, bool, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga09f517d88b996ef1b2f42fd54222b82d\">packed_highp_bvec4</a></td></tr>\n<tr class=\"memdesc:ga09f517d88b996ef1b2f42fd54222b82d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga09f517d88b996ef1b2f42fd54222b82d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab472b2d917b5e6efd76e8c7dbfbbf9f1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab472b2d917b5e6efd76e8c7dbfbbf9f1\"></a>\ntypedef vec&lt; 1, double, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab472b2d917b5e6efd76e8c7dbfbbf9f1\">packed_highp_dvec1</a></td></tr>\n<tr class=\"memdesc:gab472b2d917b5e6efd76e8c7dbfbbf9f1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab472b2d917b5e6efd76e8c7dbfbbf9f1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5b2dc48fa19b684d207d69c6b145eb63\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5b2dc48fa19b684d207d69c6b145eb63\"></a>\ntypedef vec&lt; 2, double, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5b2dc48fa19b684d207d69c6b145eb63\">packed_highp_dvec2</a></td></tr>\n<tr class=\"memdesc:ga5b2dc48fa19b684d207d69c6b145eb63\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga5b2dc48fa19b684d207d69c6b145eb63\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaac6b356ef00154da41aaae7d1549193\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaaac6b356ef00154da41aaae7d1549193\"></a>\ntypedef vec&lt; 3, double, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaaac6b356ef00154da41aaae7d1549193\">packed_highp_dvec3</a></td></tr>\n<tr class=\"memdesc:gaaac6b356ef00154da41aaae7d1549193\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gaaac6b356ef00154da41aaae7d1549193\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga81b5368fe485e2630aa9b44832d592e7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga81b5368fe485e2630aa9b44832d592e7\"></a>\ntypedef vec&lt; 4, double, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga81b5368fe485e2630aa9b44832d592e7\">packed_highp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga81b5368fe485e2630aa9b44832d592e7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga81b5368fe485e2630aa9b44832d592e7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7245acc887a5438f46fd85fdf076bb3b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7245acc887a5438f46fd85fdf076bb3b\"></a>\ntypedef vec&lt; 1, int, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7245acc887a5438f46fd85fdf076bb3b\">packed_highp_ivec1</a></td></tr>\n<tr class=\"memdesc:ga7245acc887a5438f46fd85fdf076bb3b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga7245acc887a5438f46fd85fdf076bb3b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga54f368ec6b514a5aa4f28d40e6f93ef7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga54f368ec6b514a5aa4f28d40e6f93ef7\"></a>\ntypedef vec&lt; 2, int, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga54f368ec6b514a5aa4f28d40e6f93ef7\">packed_highp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga54f368ec6b514a5aa4f28d40e6f93ef7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga54f368ec6b514a5aa4f28d40e6f93ef7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga865a9c7bb22434b1b8c5ac31e164b628\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga865a9c7bb22434b1b8c5ac31e164b628\"></a>\ntypedef vec&lt; 3, int, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga865a9c7bb22434b1b8c5ac31e164b628\">packed_highp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga865a9c7bb22434b1b8c5ac31e164b628\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga865a9c7bb22434b1b8c5ac31e164b628\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad6f1b4e3a51c2c051814b60d5d1b8895\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad6f1b4e3a51c2c051814b60d5d1b8895\"></a>\ntypedef vec&lt; 4, int, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad6f1b4e3a51c2c051814b60d5d1b8895\">packed_highp_ivec4</a></td></tr>\n<tr class=\"memdesc:gad6f1b4e3a51c2c051814b60d5d1b8895\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gad6f1b4e3a51c2c051814b60d5d1b8895\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8c32b53f628a3616aa5061e58d66fe74\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8c32b53f628a3616aa5061e58d66fe74\"></a>\ntypedef vec&lt; 1, uint, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8c32b53f628a3616aa5061e58d66fe74\">packed_highp_uvec1</a></td></tr>\n<tr class=\"memdesc:ga8c32b53f628a3616aa5061e58d66fe74\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga8c32b53f628a3616aa5061e58d66fe74\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab704d4fb15f6f96d70e363d5db7060cd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab704d4fb15f6f96d70e363d5db7060cd\"></a>\ntypedef vec&lt; 2, uint, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab704d4fb15f6f96d70e363d5db7060cd\">packed_highp_uvec2</a></td></tr>\n<tr class=\"memdesc:gab704d4fb15f6f96d70e363d5db7060cd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gab704d4fb15f6f96d70e363d5db7060cd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0b570da473fec4619db5aa0dce5133b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0b570da473fec4619db5aa0dce5133b0\"></a>\ntypedef vec&lt; 3, uint, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0b570da473fec4619db5aa0dce5133b0\">packed_highp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga0b570da473fec4619db5aa0dce5133b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga0b570da473fec4619db5aa0dce5133b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa582f38c82aef61dea7aaedf15bb06a6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa582f38c82aef61dea7aaedf15bb06a6\"></a>\ntypedef vec&lt; 4, uint, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaa582f38c82aef61dea7aaedf15bb06a6\">packed_highp_uvec4</a></td></tr>\n<tr class=\"memdesc:gaa582f38c82aef61dea7aaedf15bb06a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gaa582f38c82aef61dea7aaedf15bb06a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga56473759d2702ee19ab7f91d0017fa70\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga56473759d2702ee19ab7f91d0017fa70\"></a>\ntypedef vec&lt; 1, float, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga56473759d2702ee19ab7f91d0017fa70\">packed_highp_vec1</a></td></tr>\n<tr class=\"memdesc:ga56473759d2702ee19ab7f91d0017fa70\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga56473759d2702ee19ab7f91d0017fa70\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6b8b9475e7c3b16aed13edbc460bbc4d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6b8b9475e7c3b16aed13edbc460bbc4d\"></a>\ntypedef vec&lt; 2, float, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6b8b9475e7c3b16aed13edbc460bbc4d\">packed_highp_vec2</a></td></tr>\n<tr class=\"memdesc:ga6b8b9475e7c3b16aed13edbc460bbc4d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga6b8b9475e7c3b16aed13edbc460bbc4d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3815661df0e2de79beff8168c09adf1e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3815661df0e2de79beff8168c09adf1e\"></a>\ntypedef vec&lt; 3, float, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3815661df0e2de79beff8168c09adf1e\">packed_highp_vec3</a></td></tr>\n<tr class=\"memdesc:ga3815661df0e2de79beff8168c09adf1e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga3815661df0e2de79beff8168c09adf1e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4015f36bf5a5adb6ac5d45beed959867\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4015f36bf5a5adb6ac5d45beed959867\"></a>\ntypedef vec&lt; 4, float, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga4015f36bf5a5adb6ac5d45beed959867\">packed_highp_vec4</a></td></tr>\n<tr class=\"memdesc:ga4015f36bf5a5adb6ac5d45beed959867\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga4015f36bf5a5adb6ac5d45beed959867\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga11581a06fc7bf941fa4d4b6aca29812c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga11581a06fc7bf941fa4d4b6aca29812c\"></a>\ntypedef packed_highp_ivec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga11581a06fc7bf941fa4d4b6aca29812c\">packed_ivec1</a></td></tr>\n<tr class=\"memdesc:ga11581a06fc7bf941fa4d4b6aca29812c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga11581a06fc7bf941fa4d4b6aca29812c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fe4c5f56b8087d773aa90dc88a257a7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1fe4c5f56b8087d773aa90dc88a257a7\"></a>\ntypedef packed_highp_ivec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1fe4c5f56b8087d773aa90dc88a257a7\">packed_ivec2</a></td></tr>\n<tr class=\"memdesc:ga1fe4c5f56b8087d773aa90dc88a257a7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga1fe4c5f56b8087d773aa90dc88a257a7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae157682a7847161787951ba1db4cf325\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae157682a7847161787951ba1db4cf325\"></a>\ntypedef packed_highp_ivec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae157682a7847161787951ba1db4cf325\">packed_ivec3</a></td></tr>\n<tr class=\"memdesc:gae157682a7847161787951ba1db4cf325\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gae157682a7847161787951ba1db4cf325\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac228b70372abd561340d5f926a7c1778\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac228b70372abd561340d5f926a7c1778\"></a>\ntypedef packed_highp_ivec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gac228b70372abd561340d5f926a7c1778\">packed_ivec4</a></td></tr>\n<tr class=\"memdesc:gac228b70372abd561340d5f926a7c1778\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gac228b70372abd561340d5f926a7c1778\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3c8750f53259ece334d3aa3b3649a40\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae3c8750f53259ece334d3aa3b3649a40\"></a>\ntypedef vec&lt; 1, bool, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae3c8750f53259ece334d3aa3b3649a40\">packed_lowp_bvec1</a></td></tr>\n<tr class=\"memdesc:gae3c8750f53259ece334d3aa3b3649a40\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae3c8750f53259ece334d3aa3b3649a40\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac969befedbda69eb78d4e23f751fdbee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac969befedbda69eb78d4e23f751fdbee\"></a>\ntypedef vec&lt; 2, bool, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gac969befedbda69eb78d4e23f751fdbee\">packed_lowp_bvec2</a></td></tr>\n<tr class=\"memdesc:gac969befedbda69eb78d4e23f751fdbee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gac969befedbda69eb78d4e23f751fdbee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7c20adbe1409e3fe4544677a7f6fe954\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7c20adbe1409e3fe4544677a7f6fe954\"></a>\ntypedef vec&lt; 3, bool, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7c20adbe1409e3fe4544677a7f6fe954\">packed_lowp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga7c20adbe1409e3fe4544677a7f6fe954\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga7c20adbe1409e3fe4544677a7f6fe954\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae473587cff3092edc0877fc691c26a0b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae473587cff3092edc0877fc691c26a0b\"></a>\ntypedef vec&lt; 4, bool, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae473587cff3092edc0877fc691c26a0b\">packed_lowp_bvec4</a></td></tr>\n<tr class=\"memdesc:gae473587cff3092edc0877fc691c26a0b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae473587cff3092edc0877fc691c26a0b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga054050e9d4e78d81db0e6d1573b1c624\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga054050e9d4e78d81db0e6d1573b1c624\"></a>\ntypedef vec&lt; 1, double, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga054050e9d4e78d81db0e6d1573b1c624\">packed_lowp_dvec1</a></td></tr>\n<tr class=\"memdesc:ga054050e9d4e78d81db0e6d1573b1c624\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga054050e9d4e78d81db0e6d1573b1c624\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadc19938ddb204bfcb4d9ef35b1e2bf93\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gadc19938ddb204bfcb4d9ef35b1e2bf93\"></a>\ntypedef vec&lt; 2, double, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gadc19938ddb204bfcb4d9ef35b1e2bf93\">packed_lowp_dvec2</a></td></tr>\n<tr class=\"memdesc:gadc19938ddb204bfcb4d9ef35b1e2bf93\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gadc19938ddb204bfcb4d9ef35b1e2bf93\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9189210cabd6651a5e14a4c46fb20598\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9189210cabd6651a5e14a4c46fb20598\"></a>\ntypedef vec&lt; 3, double, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga9189210cabd6651a5e14a4c46fb20598\">packed_lowp_dvec3</a></td></tr>\n<tr class=\"memdesc:ga9189210cabd6651a5e14a4c46fb20598\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga9189210cabd6651a5e14a4c46fb20598\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga262dafd0c001c3a38d1cc91d024ca738\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga262dafd0c001c3a38d1cc91d024ca738\"></a>\ntypedef vec&lt; 4, double, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga262dafd0c001c3a38d1cc91d024ca738\">packed_lowp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga262dafd0c001c3a38d1cc91d024ca738\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga262dafd0c001c3a38d1cc91d024ca738\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf22b77f1cf3e73b8b1dddfe7f959357c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf22b77f1cf3e73b8b1dddfe7f959357c\"></a>\ntypedef vec&lt; 1, int, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaf22b77f1cf3e73b8b1dddfe7f959357c\">packed_lowp_ivec1</a></td></tr>\n<tr class=\"memdesc:gaf22b77f1cf3e73b8b1dddfe7f959357c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gaf22b77f1cf3e73b8b1dddfe7f959357c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52635859f5ef660ab999d22c11b7867f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga52635859f5ef660ab999d22c11b7867f\"></a>\ntypedef vec&lt; 2, int, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga52635859f5ef660ab999d22c11b7867f\">packed_lowp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga52635859f5ef660ab999d22c11b7867f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga52635859f5ef660ab999d22c11b7867f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98c9d122a959e9f3ce10a5623c310f5d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga98c9d122a959e9f3ce10a5623c310f5d\"></a>\ntypedef vec&lt; 3, int, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga98c9d122a959e9f3ce10a5623c310f5d\">packed_lowp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga98c9d122a959e9f3ce10a5623c310f5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga98c9d122a959e9f3ce10a5623c310f5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga931731b8ae3b54c7ecc221509dae96bc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga931731b8ae3b54c7ecc221509dae96bc\"></a>\ntypedef vec&lt; 4, int, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga931731b8ae3b54c7ecc221509dae96bc\">packed_lowp_ivec4</a></td></tr>\n<tr class=\"memdesc:ga931731b8ae3b54c7ecc221509dae96bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga931731b8ae3b54c7ecc221509dae96bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf111fed760ecce16cb1988807569bee5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf111fed760ecce16cb1988807569bee5\"></a>\ntypedef vec&lt; 1, uint, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaf111fed760ecce16cb1988807569bee5\">packed_lowp_uvec1</a></td></tr>\n<tr class=\"memdesc:gaf111fed760ecce16cb1988807569bee5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gaf111fed760ecce16cb1988807569bee5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga958210fe245a75b058325d367c951132\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga958210fe245a75b058325d367c951132\"></a>\ntypedef vec&lt; 2, uint, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga958210fe245a75b058325d367c951132\">packed_lowp_uvec2</a></td></tr>\n<tr class=\"memdesc:ga958210fe245a75b058325d367c951132\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga958210fe245a75b058325d367c951132\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga576a3f8372197a56a79dee1c8280f485\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga576a3f8372197a56a79dee1c8280f485\"></a>\ntypedef vec&lt; 3, uint, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga576a3f8372197a56a79dee1c8280f485\">packed_lowp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga576a3f8372197a56a79dee1c8280f485\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga576a3f8372197a56a79dee1c8280f485\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafdd97922b4a2a42cd0c99a13877ff4da\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafdd97922b4a2a42cd0c99a13877ff4da\"></a>\ntypedef vec&lt; 4, uint, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gafdd97922b4a2a42cd0c99a13877ff4da\">packed_lowp_uvec4</a></td></tr>\n<tr class=\"memdesc:gafdd97922b4a2a42cd0c99a13877ff4da\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gafdd97922b4a2a42cd0c99a13877ff4da\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0a6198fe64166a6a61084d43c71518a9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0a6198fe64166a6a61084d43c71518a9\"></a>\ntypedef vec&lt; 1, float, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0a6198fe64166a6a61084d43c71518a9\">packed_lowp_vec1</a></td></tr>\n<tr class=\"memdesc:ga0a6198fe64166a6a61084d43c71518a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga0a6198fe64166a6a61084d43c71518a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafbf1c2cce307c5594b165819ed83bf5d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafbf1c2cce307c5594b165819ed83bf5d\"></a>\ntypedef vec&lt; 2, float, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gafbf1c2cce307c5594b165819ed83bf5d\">packed_lowp_vec2</a></td></tr>\n<tr class=\"memdesc:gafbf1c2cce307c5594b165819ed83bf5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gafbf1c2cce307c5594b165819ed83bf5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3a30c137c1f8cce478c28eab0427a570\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3a30c137c1f8cce478c28eab0427a570\"></a>\ntypedef vec&lt; 3, float, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3a30c137c1f8cce478c28eab0427a570\">packed_lowp_vec3</a></td></tr>\n<tr class=\"memdesc:ga3a30c137c1f8cce478c28eab0427a570\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga3a30c137c1f8cce478c28eab0427a570\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3cc94fb8de80bbd8a4aa7a5b206d304a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3cc94fb8de80bbd8a4aa7a5b206d304a\"></a>\ntypedef vec&lt; 4, float, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3cc94fb8de80bbd8a4aa7a5b206d304a\">packed_lowp_vec4</a></td></tr>\n<tr class=\"memdesc:ga3cc94fb8de80bbd8a4aa7a5b206d304a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga3cc94fb8de80bbd8a4aa7a5b206d304a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5546d828d63010a8f9cf81161ad0275a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5546d828d63010a8f9cf81161ad0275a\"></a>\ntypedef vec&lt; 1, bool, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5546d828d63010a8f9cf81161ad0275a\">packed_mediump_bvec1</a></td></tr>\n<tr class=\"memdesc:ga5546d828d63010a8f9cf81161ad0275a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga5546d828d63010a8f9cf81161ad0275a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab4c6414a59539e66a242ad4cf4b476b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab4c6414a59539e66a242ad4cf4b476b4\"></a>\ntypedef vec&lt; 2, bool, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab4c6414a59539e66a242ad4cf4b476b4\">packed_mediump_bvec2</a></td></tr>\n<tr class=\"memdesc:gab4c6414a59539e66a242ad4cf4b476b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gab4c6414a59539e66a242ad4cf4b476b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70147763edff3fe96b03a0b98d6339a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga70147763edff3fe96b03a0b98d6339a2\"></a>\ntypedef vec&lt; 3, bool, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga70147763edff3fe96b03a0b98d6339a2\">packed_mediump_bvec3</a></td></tr>\n<tr class=\"memdesc:ga70147763edff3fe96b03a0b98d6339a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga70147763edff3fe96b03a0b98d6339a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b1620f259595b9da47a6374fc44588a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7b1620f259595b9da47a6374fc44588a\"></a>\ntypedef vec&lt; 4, bool, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7b1620f259595b9da47a6374fc44588a\">packed_mediump_bvec4</a></td></tr>\n<tr class=\"memdesc:ga7b1620f259595b9da47a6374fc44588a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga7b1620f259595b9da47a6374fc44588a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8920e90ea9c01d9c97e604a938ce2cbd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8920e90ea9c01d9c97e604a938ce2cbd\"></a>\ntypedef vec&lt; 1, double, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8920e90ea9c01d9c97e604a938ce2cbd\">packed_mediump_dvec1</a></td></tr>\n<tr class=\"memdesc:ga8920e90ea9c01d9c97e604a938ce2cbd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga8920e90ea9c01d9c97e604a938ce2cbd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c754a783b6fcf80374c013371c4dae9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0c754a783b6fcf80374c013371c4dae9\"></a>\ntypedef vec&lt; 2, double, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0c754a783b6fcf80374c013371c4dae9\">packed_mediump_dvec2</a></td></tr>\n<tr class=\"memdesc:ga0c754a783b6fcf80374c013371c4dae9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga0c754a783b6fcf80374c013371c4dae9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f18ada6f7cdd8c46db33ba987280fc4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1f18ada6f7cdd8c46db33ba987280fc4\"></a>\ntypedef vec&lt; 3, double, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1f18ada6f7cdd8c46db33ba987280fc4\">packed_mediump_dvec3</a></td></tr>\n<tr class=\"memdesc:ga1f18ada6f7cdd8c46db33ba987280fc4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga1f18ada6f7cdd8c46db33ba987280fc4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga568b850f1116b667043533cf77826968\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga568b850f1116b667043533cf77826968\"></a>\ntypedef vec&lt; 4, double, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga568b850f1116b667043533cf77826968\">packed_mediump_dvec4</a></td></tr>\n<tr class=\"memdesc:ga568b850f1116b667043533cf77826968\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga568b850f1116b667043533cf77826968\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09507ef020a49517a7bcd50438f05056\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga09507ef020a49517a7bcd50438f05056\"></a>\ntypedef vec&lt; 1, int, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga09507ef020a49517a7bcd50438f05056\">packed_mediump_ivec1</a></td></tr>\n<tr class=\"memdesc:ga09507ef020a49517a7bcd50438f05056\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga09507ef020a49517a7bcd50438f05056\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaa891048dddef4627df33809ec726219\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaaa891048dddef4627df33809ec726219\"></a>\ntypedef vec&lt; 2, int, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaaa891048dddef4627df33809ec726219\">packed_mediump_ivec2</a></td></tr>\n<tr class=\"memdesc:gaaa891048dddef4627df33809ec726219\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gaaa891048dddef4627df33809ec726219\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga06f26d54dca30994eb1fdadb8e69f4a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga06f26d54dca30994eb1fdadb8e69f4a2\"></a>\ntypedef vec&lt; 3, int, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga06f26d54dca30994eb1fdadb8e69f4a2\">packed_mediump_ivec3</a></td></tr>\n<tr class=\"memdesc:ga06f26d54dca30994eb1fdadb8e69f4a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga06f26d54dca30994eb1fdadb8e69f4a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70130dc8ed9c966ec2a221ce586d45d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga70130dc8ed9c966ec2a221ce586d45d8\"></a>\ntypedef vec&lt; 4, int, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga70130dc8ed9c966ec2a221ce586d45d8\">packed_mediump_ivec4</a></td></tr>\n<tr class=\"memdesc:ga70130dc8ed9c966ec2a221ce586d45d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga70130dc8ed9c966ec2a221ce586d45d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c29fb42bab9a4f9b66bc60b2e514a34\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga2c29fb42bab9a4f9b66bc60b2e514a34\"></a>\ntypedef vec&lt; 1, uint, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga2c29fb42bab9a4f9b66bc60b2e514a34\">packed_mediump_uvec1</a></td></tr>\n<tr class=\"memdesc:ga2c29fb42bab9a4f9b66bc60b2e514a34\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga2c29fb42bab9a4f9b66bc60b2e514a34\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa1f95690a78dc12e39da32943243aeef\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa1f95690a78dc12e39da32943243aeef\"></a>\ntypedef vec&lt; 2, uint, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaa1f95690a78dc12e39da32943243aeef\">packed_mediump_uvec2</a></td></tr>\n<tr class=\"memdesc:gaa1f95690a78dc12e39da32943243aeef\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gaa1f95690a78dc12e39da32943243aeef\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ea2bbdbcb0a69242f6d884663c1b0ab\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1ea2bbdbcb0a69242f6d884663c1b0ab\"></a>\ntypedef vec&lt; 3, uint, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1ea2bbdbcb0a69242f6d884663c1b0ab\">packed_mediump_uvec3</a></td></tr>\n<tr class=\"memdesc:ga1ea2bbdbcb0a69242f6d884663c1b0ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga1ea2bbdbcb0a69242f6d884663c1b0ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga63a73be86a4f07ea7a7499ab0bfebe45\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga63a73be86a4f07ea7a7499ab0bfebe45\"></a>\ntypedef vec&lt; 4, uint, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga63a73be86a4f07ea7a7499ab0bfebe45\">packed_mediump_uvec4</a></td></tr>\n<tr class=\"memdesc:ga63a73be86a4f07ea7a7499ab0bfebe45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga63a73be86a4f07ea7a7499ab0bfebe45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga71d63cead1e113fca0bcdaaa33aad050\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga71d63cead1e113fca0bcdaaa33aad050\"></a>\ntypedef vec&lt; 1, float, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga71d63cead1e113fca0bcdaaa33aad050\">packed_mediump_vec1</a></td></tr>\n<tr class=\"memdesc:ga71d63cead1e113fca0bcdaaa33aad050\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga71d63cead1e113fca0bcdaaa33aad050\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6844c6f4691d1bf67673240850430948\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6844c6f4691d1bf67673240850430948\"></a>\ntypedef vec&lt; 2, float, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6844c6f4691d1bf67673240850430948\">packed_mediump_vec2</a></td></tr>\n<tr class=\"memdesc:ga6844c6f4691d1bf67673240850430948\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga6844c6f4691d1bf67673240850430948\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab0eb771b708c5b2205d9b14dd1434fd8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab0eb771b708c5b2205d9b14dd1434fd8\"></a>\ntypedef vec&lt; 3, float, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab0eb771b708c5b2205d9b14dd1434fd8\">packed_mediump_vec3</a></td></tr>\n<tr class=\"memdesc:gab0eb771b708c5b2205d9b14dd1434fd8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab0eb771b708c5b2205d9b14dd1434fd8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga68c9bb24f387b312bae6a0a68e74d95e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga68c9bb24f387b312bae6a0a68e74d95e\"></a>\ntypedef vec&lt; 4, float, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga68c9bb24f387b312bae6a0a68e74d95e\">packed_mediump_vec4</a></td></tr>\n<tr class=\"memdesc:ga68c9bb24f387b312bae6a0a68e74d95e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga68c9bb24f387b312bae6a0a68e74d95e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5621493caac01bdd22ab6be4416b0314\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5621493caac01bdd22ab6be4416b0314\"></a>\ntypedef packed_highp_uvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5621493caac01bdd22ab6be4416b0314\">packed_uvec1</a></td></tr>\n<tr class=\"memdesc:ga5621493caac01bdd22ab6be4416b0314\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga5621493caac01bdd22ab6be4416b0314\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabcc33efb4d5e83b8fe4706360e75b932\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabcc33efb4d5e83b8fe4706360e75b932\"></a>\ntypedef packed_highp_uvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gabcc33efb4d5e83b8fe4706360e75b932\">packed_uvec2</a></td></tr>\n<tr class=\"memdesc:gabcc33efb4d5e83b8fe4706360e75b932\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gabcc33efb4d5e83b8fe4706360e75b932\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab96804e99e3a72a35740fec690c79617\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab96804e99e3a72a35740fec690c79617\"></a>\ntypedef packed_highp_uvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab96804e99e3a72a35740fec690c79617\">packed_uvec3</a></td></tr>\n<tr class=\"memdesc:gab96804e99e3a72a35740fec690c79617\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gab96804e99e3a72a35740fec690c79617\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"></a>\ntypedef packed_highp_uvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8e5d92e84ebdbe2480cf96bc17d6e2f2\">packed_uvec4</a></td></tr>\n<tr class=\"memdesc:ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga14741e3d9da9ae83765389927f837331\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga14741e3d9da9ae83765389927f837331\"></a>\ntypedef packed_highp_vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga14741e3d9da9ae83765389927f837331\">packed_vec1</a></td></tr>\n<tr class=\"memdesc:ga14741e3d9da9ae83765389927f837331\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga14741e3d9da9ae83765389927f837331\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3254defa5a8f0ae4b02b45fedba84a66\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3254defa5a8f0ae4b02b45fedba84a66\"></a>\ntypedef packed_highp_vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66\">packed_vec2</a></td></tr>\n<tr class=\"memdesc:ga3254defa5a8f0ae4b02b45fedba84a66\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga3254defa5a8f0ae4b02b45fedba84a66\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaccccd090e185450caa28b5b63ad4e8f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaccccd090e185450caa28b5b63ad4e8f0\"></a>\ntypedef packed_highp_vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaccccd090e185450caa28b5b63ad4e8f0\">packed_vec3</a></td></tr>\n<tr class=\"memdesc:gaccccd090e185450caa28b5b63ad4e8f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:gaccccd090e185450caa28b5b63ad4e8f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga37a0e0bf653169b581c5eea3d547fa5d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga37a0e0bf653169b581c5eea3d547fa5d\"></a>\ntypedef packed_highp_vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d\">packed_vec4</a></td></tr>\n<tr class=\"memdesc:ga37a0e0bf653169b581c5eea3d547fa5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga37a0e0bf653169b581c5eea3d547fa5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00164.html\">GLM_GTC_type_aligned</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00101_source.html\">gtc/type_aligned.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00101_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_aligned.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtc/type_aligned.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00101.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#if !GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: Aligned types are not supported on this platform&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\"># pragma message(&quot;GLM: GLM_GTC_type_aligned extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/vec1.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"comment\">// -- *vec1 --</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga4d0bd70d5fac49b800546d608b707513\">   35</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, aligned_highp&gt;    <a class=\"code\" href=\"a00164.html#ga4d0bd70d5fac49b800546d608b707513\">aligned_highp_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga6b797eec76fa471e300158f3453b3b2e\">   38</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, aligned_mediump&gt;  <a class=\"code\" href=\"a00164.html#ga6b797eec76fa471e300158f3453b3b2e\">aligned_mediump_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab34aee3d5e121c543fea11d2c50ecc43\">   41</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, aligned_lowp&gt;             <a class=\"code\" href=\"a00164.html#gab34aee3d5e121c543fea11d2c50ecc43\">aligned_lowp_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaf0448b0f7ceb8273f7eda3a92205eefc\">   44</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, aligned_highp&gt;   <a class=\"code\" href=\"a00164.html#gaf0448b0f7ceb8273f7eda3a92205eefc\">aligned_highp_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga7180b685c581adb224406a7f831608e3\">   47</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, aligned_mediump&gt; <a class=\"code\" href=\"a00164.html#ga7180b685c581adb224406a7f831608e3\">aligned_mediump_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga7f8a2cc5a686e52b1615761f4978ca62\">   50</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, aligned_lowp&gt;    <a class=\"code\" href=\"a00164.html#ga7f8a2cc5a686e52b1615761f4978ca62\">aligned_lowp_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gad63b8c5b4dc0500d54d7414ef555178f\">   53</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, aligned_highp&gt;              <a class=\"code\" href=\"a00164.html#gad63b8c5b4dc0500d54d7414ef555178f\">aligned_highp_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga20e63dd980b81af10cadbbe219316650\">   56</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, aligned_mediump&gt;    <a class=\"code\" href=\"a00164.html#ga20e63dd980b81af10cadbbe219316650\">aligned_mediump_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga1101d3a82b2e3f5f8828bd8f3adab3e1\">   59</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, aligned_lowp&gt;               <a class=\"code\" href=\"a00164.html#ga1101d3a82b2e3f5f8828bd8f3adab3e1\">aligned_lowp_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga5b80e28396c6ef7d32c6fd18df498451\">   62</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, aligned_highp&gt;             <a class=\"code\" href=\"a00164.html#ga5b80e28396c6ef7d32c6fd18df498451\">aligned_highp_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gacb78126ea2eb779b41c7511128ff1283\">   65</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, aligned_mediump&gt;   <a class=\"code\" href=\"a00164.html#gacb78126ea2eb779b41c7511128ff1283\">aligned_mediump_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gad09b93acc43c43423408d17a64f6d7ca\">   68</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, aligned_lowp&gt;              <a class=\"code\" href=\"a00164.html#gad09b93acc43c43423408d17a64f6d7ca\">aligned_lowp_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga862843a45b01c35ffe4d44c47ea774ad\">   71</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, aligned_highp&gt;             <a class=\"code\" href=\"a00164.html#ga862843a45b01c35ffe4d44c47ea774ad\">aligned_highp_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gadd3b8bd71a758f7fb0da8e525156f34e\">   74</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, aligned_mediump&gt;   <a class=\"code\" href=\"a00164.html#gadd3b8bd71a758f7fb0da8e525156f34e\">aligned_mediump_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gac6036449ab1c4abf8efe1ea00fcdd1c9\">   77</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, aligned_lowp&gt;              <a class=\"code\" href=\"a00164.html#gac6036449ab1c4abf8efe1ea00fcdd1c9\">aligned_lowp_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga56473759d2702ee19ab7f91d0017fa70\">   80</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, packed_highp&gt;             <a class=\"code\" href=\"a00164.html#ga56473759d2702ee19ab7f91d0017fa70\">packed_highp_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga71d63cead1e113fca0bcdaaa33aad050\">   83</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, packed_mediump&gt;   <a class=\"code\" href=\"a00164.html#ga71d63cead1e113fca0bcdaaa33aad050\">packed_mediump_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0a6198fe64166a6a61084d43c71518a9\">   86</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, packed_lowp&gt;              <a class=\"code\" href=\"a00164.html#ga0a6198fe64166a6a61084d43c71518a9\">packed_lowp_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab472b2d917b5e6efd76e8c7dbfbbf9f1\">   89</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, packed_highp&gt;    <a class=\"code\" href=\"a00164.html#gab472b2d917b5e6efd76e8c7dbfbbf9f1\">packed_highp_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga8920e90ea9c01d9c97e604a938ce2cbd\">   92</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, packed_mediump&gt;  <a class=\"code\" href=\"a00164.html#ga8920e90ea9c01d9c97e604a938ce2cbd\">packed_mediump_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga054050e9d4e78d81db0e6d1573b1c624\">   95</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, packed_lowp&gt;             <a class=\"code\" href=\"a00164.html#ga054050e9d4e78d81db0e6d1573b1c624\">packed_lowp_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga7245acc887a5438f46fd85fdf076bb3b\">   98</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, packed_highp&gt;               <a class=\"code\" href=\"a00164.html#ga7245acc887a5438f46fd85fdf076bb3b\">packed_highp_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga09507ef020a49517a7bcd50438f05056\">  101</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, packed_mediump&gt;             <a class=\"code\" href=\"a00164.html#ga09507ef020a49517a7bcd50438f05056\">packed_mediump_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaf22b77f1cf3e73b8b1dddfe7f959357c\">  104</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, packed_lowp&gt;                <a class=\"code\" href=\"a00164.html#gaf22b77f1cf3e73b8b1dddfe7f959357c\">packed_lowp_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga8c32b53f628a3616aa5061e58d66fe74\">  107</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, packed_highp&gt;              <a class=\"code\" href=\"a00164.html#ga8c32b53f628a3616aa5061e58d66fe74\">packed_highp_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga2c29fb42bab9a4f9b66bc60b2e514a34\">  110</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, packed_mediump&gt;    <a class=\"code\" href=\"a00164.html#ga2c29fb42bab9a4f9b66bc60b2e514a34\">packed_mediump_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaf111fed760ecce16cb1988807569bee5\">  113</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, packed_lowp&gt;               <a class=\"code\" href=\"a00164.html#gaf111fed760ecce16cb1988807569bee5\">packed_lowp_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga439e97795314b81cd15abd4e5c2e6e7a\">  116</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, packed_highp&gt;              <a class=\"code\" href=\"a00164.html#ga439e97795314b81cd15abd4e5c2e6e7a\">packed_highp_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga5546d828d63010a8f9cf81161ad0275a\">  119</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, packed_mediump&gt;    <a class=\"code\" href=\"a00164.html#ga5546d828d63010a8f9cf81161ad0275a\">packed_mediump_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae3c8750f53259ece334d3aa3b3649a40\">  122</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, packed_lowp&gt;               <a class=\"code\" href=\"a00164.html#gae3c8750f53259ece334d3aa3b3649a40\">packed_lowp_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"comment\">// -- *vec2 --</span></div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gac9f8482dde741fb6bab7248b81a45465\">  127</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, aligned_highp&gt;    <a class=\"code\" href=\"a00164.html#gac9f8482dde741fb6bab7248b81a45465\">aligned_highp_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga026a55ddbf2bafb1432f1157a2708616\">  130</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, aligned_mediump&gt;  <a class=\"code\" href=\"a00164.html#ga026a55ddbf2bafb1432f1157a2708616\">aligned_mediump_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga53ac5d252317f1fa43c2ef921857bf13\">  133</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, aligned_lowp&gt;             <a class=\"code\" href=\"a00164.html#ga53ac5d252317f1fa43c2ef921857bf13\">aligned_lowp_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab173a333e6b7ce153ceba66ac4a321cf\">  136</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, aligned_highp&gt;   <a class=\"code\" href=\"a00164.html#gab173a333e6b7ce153ceba66ac4a321cf\">aligned_highp_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga9af1eabe22f569e70d9893be72eda0f5\">  139</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, aligned_mediump&gt; <a class=\"code\" href=\"a00164.html#ga9af1eabe22f569e70d9893be72eda0f5\">aligned_mediump_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0e37cff4a43cca866101f0a35f01db6d\">  142</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, aligned_lowp&gt;    <a class=\"code\" href=\"a00164.html#ga0e37cff4a43cca866101f0a35f01db6d\">aligned_lowp_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga41563650f36cb7f479e080de21e08418\">  145</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, aligned_highp&gt;              <a class=\"code\" href=\"a00164.html#ga41563650f36cb7f479e080de21e08418\">aligned_highp_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaea13d89d49daca2c796aeaa82fc2c2f2\">  148</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, aligned_mediump&gt;    <a class=\"code\" href=\"a00164.html#gaea13d89d49daca2c796aeaa82fc2c2f2\">aligned_mediump_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga44c4accad582cfbd7226a19b83b0cadc\">  151</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, aligned_lowp&gt;               <a class=\"code\" href=\"a00164.html#ga44c4accad582cfbd7226a19b83b0cadc\">aligned_lowp_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga04db692662a4908beeaf5a5ba6e19483\">  154</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, aligned_highp&gt;             <a class=\"code\" href=\"a00164.html#ga04db692662a4908beeaf5a5ba6e19483\">aligned_highp_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga081d53e0a71443d0b68ea61c870f9adc\">  157</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, aligned_mediump&gt;   <a class=\"code\" href=\"a00164.html#ga081d53e0a71443d0b68ea61c870f9adc\">aligned_mediump_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga6f94fcd28dde906fc6cad5f742b55c1a\">  160</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, aligned_lowp&gt;              <a class=\"code\" href=\"a00164.html#ga6f94fcd28dde906fc6cad5f742b55c1a\">aligned_lowp_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0731b593c5e33559954c80f8687e76c6\">  163</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, aligned_highp&gt;             <a class=\"code\" href=\"a00164.html#ga0731b593c5e33559954c80f8687e76c6\">aligned_highp_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gacb183eb5e67ec0d0ea5a016cba962810\">  166</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, aligned_mediump&gt;   <a class=\"code\" href=\"a00164.html#gacb183eb5e67ec0d0ea5a016cba962810\">aligned_mediump_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga59fadcd3835646e419372ae8b43c5d37\">  169</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, aligned_lowp&gt;              <a class=\"code\" href=\"a00164.html#ga59fadcd3835646e419372ae8b43c5d37\">aligned_lowp_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga6b8b9475e7c3b16aed13edbc460bbc4d\">  172</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, packed_highp&gt;             <a class=\"code\" href=\"a00164.html#ga6b8b9475e7c3b16aed13edbc460bbc4d\">packed_highp_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga6844c6f4691d1bf67673240850430948\">  175</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, packed_mediump&gt;   <a class=\"code\" href=\"a00164.html#ga6844c6f4691d1bf67673240850430948\">packed_mediump_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gafbf1c2cce307c5594b165819ed83bf5d\">  178</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, packed_lowp&gt;              <a class=\"code\" href=\"a00164.html#gafbf1c2cce307c5594b165819ed83bf5d\">packed_lowp_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga5b2dc48fa19b684d207d69c6b145eb63\">  181</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, packed_highp&gt;    <a class=\"code\" href=\"a00164.html#ga5b2dc48fa19b684d207d69c6b145eb63\">packed_highp_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0c754a783b6fcf80374c013371c4dae9\">  184</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, packed_mediump&gt;  <a class=\"code\" href=\"a00164.html#ga0c754a783b6fcf80374c013371c4dae9\">packed_mediump_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gadc19938ddb204bfcb4d9ef35b1e2bf93\">  187</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, packed_lowp&gt;             <a class=\"code\" href=\"a00164.html#gadc19938ddb204bfcb4d9ef35b1e2bf93\">packed_lowp_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga54f368ec6b514a5aa4f28d40e6f93ef7\">  190</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, packed_highp&gt;               <a class=\"code\" href=\"a00164.html#ga54f368ec6b514a5aa4f28d40e6f93ef7\">packed_highp_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaaa891048dddef4627df33809ec726219\">  193</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, packed_mediump&gt;             <a class=\"code\" href=\"a00164.html#gaaa891048dddef4627df33809ec726219\">packed_mediump_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga52635859f5ef660ab999d22c11b7867f\">  196</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, packed_lowp&gt;                <a class=\"code\" href=\"a00164.html#ga52635859f5ef660ab999d22c11b7867f\">packed_lowp_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab704d4fb15f6f96d70e363d5db7060cd\">  199</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, packed_highp&gt;              <a class=\"code\" href=\"a00164.html#gab704d4fb15f6f96d70e363d5db7060cd\">packed_highp_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaa1f95690a78dc12e39da32943243aeef\">  202</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, packed_mediump&gt;    <a class=\"code\" href=\"a00164.html#gaa1f95690a78dc12e39da32943243aeef\">packed_mediump_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga958210fe245a75b058325d367c951132\">  205</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, packed_lowp&gt;               <a class=\"code\" href=\"a00164.html#ga958210fe245a75b058325d367c951132\">packed_lowp_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gad791d671f4fcf1ed1ea41f752916b70a\">  208</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, packed_highp&gt;              <a class=\"code\" href=\"a00164.html#gad791d671f4fcf1ed1ea41f752916b70a\">packed_highp_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab4c6414a59539e66a242ad4cf4b476b4\">  211</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, packed_mediump&gt;    <a class=\"code\" href=\"a00164.html#gab4c6414a59539e66a242ad4cf4b476b4\">packed_mediump_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gac969befedbda69eb78d4e23f751fdbee\">  214</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, packed_lowp&gt;               <a class=\"code\" href=\"a00164.html#gac969befedbda69eb78d4e23f751fdbee\">packed_lowp_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;        <span class=\"comment\">// -- *vec3 --</span></div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga65415d2d68c9cc0ca554524a8f5510b2\">  219</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, aligned_highp&gt;    <a class=\"code\" href=\"a00164.html#ga65415d2d68c9cc0ca554524a8f5510b2\">aligned_highp_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga3a25e494173f6a64637b08a1b50a2132\">  222</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, aligned_mediump&gt;  <a class=\"code\" href=\"a00164.html#ga3a25e494173f6a64637b08a1b50a2132\">aligned_mediump_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga98f0b5cd65fce164ff1367c2a3b3aa1e\">  225</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, aligned_lowp&gt;             <a class=\"code\" href=\"a00164.html#ga98f0b5cd65fce164ff1367c2a3b3aa1e\">aligned_lowp_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae94ef61edfa047d05bc69b6065fc42ba\">  228</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, aligned_highp&gt;   <a class=\"code\" href=\"a00164.html#gae94ef61edfa047d05bc69b6065fc42ba\">aligned_highp_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga058e7ddab1428e47f2197bdd3a5a6953\">  231</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, aligned_mediump&gt; <a class=\"code\" href=\"a00164.html#ga058e7ddab1428e47f2197bdd3a5a6953\">aligned_mediump_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab9e669c4efd52d3347fc6d5f6b20fd59\">  234</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, aligned_lowp&gt;    <a class=\"code\" href=\"a00164.html#gab9e669c4efd52d3347fc6d5f6b20fd59\">aligned_lowp_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga6eca5170bb35eac90b4972590fd31a06\">  237</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, aligned_highp&gt;              <a class=\"code\" href=\"a00164.html#ga6eca5170bb35eac90b4972590fd31a06\">aligned_highp_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gabbf0f15e9c3d9868e43241ad018f82bd\">  240</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, aligned_mediump&gt;    <a class=\"code\" href=\"a00164.html#gabbf0f15e9c3d9868e43241ad018f82bd\">aligned_mediump_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga65663f10a02e52cedcddbcfe36ddf38d\">  243</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, aligned_lowp&gt;               <a class=\"code\" href=\"a00164.html#ga65663f10a02e52cedcddbcfe36ddf38d\">aligned_lowp_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga073fd6e8b241afade6d8afbd676b2667\">  246</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, aligned_highp&gt;             <a class=\"code\" href=\"a00164.html#ga073fd6e8b241afade6d8afbd676b2667\">aligned_highp_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gad6fc921bdde2bdbc7e09b028e1e9b379\">  249</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, aligned_mediump&gt;   <a class=\"code\" href=\"a00164.html#gad6fc921bdde2bdbc7e09b028e1e9b379\">aligned_mediump_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga9e9f006970b1a00862e3e6e599eedd4c\">  252</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, aligned_lowp&gt;              <a class=\"code\" href=\"a00164.html#ga9e9f006970b1a00862e3e6e599eedd4c\">aligned_lowp_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0913bdf048d0cb74af1d2512aec675bc\">  255</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, aligned_highp&gt;             <a class=\"code\" href=\"a00164.html#ga0913bdf048d0cb74af1d2512aec675bc\">aligned_highp_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gacfa4a542f1b20a5b63ad702dfb6fd587\">  258</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, aligned_mediump&gt;   <a class=\"code\" href=\"a00164.html#gacfa4a542f1b20a5b63ad702dfb6fd587\">aligned_mediump_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga83aab4d191053f169c93a3e364f2e118\">  261</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, aligned_lowp&gt;              <a class=\"code\" href=\"a00164.html#ga83aab4d191053f169c93a3e364f2e118\">aligned_lowp_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga3815661df0e2de79beff8168c09adf1e\">  264</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, packed_highp&gt;             <a class=\"code\" href=\"a00164.html#ga3815661df0e2de79beff8168c09adf1e\">packed_highp_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab0eb771b708c5b2205d9b14dd1434fd8\">  267</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, packed_mediump&gt;   <a class=\"code\" href=\"a00164.html#gab0eb771b708c5b2205d9b14dd1434fd8\">packed_mediump_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga3a30c137c1f8cce478c28eab0427a570\">  270</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, packed_lowp&gt;              <a class=\"code\" href=\"a00164.html#ga3a30c137c1f8cce478c28eab0427a570\">packed_lowp_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaaac6b356ef00154da41aaae7d1549193\">  273</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, packed_highp&gt;    <a class=\"code\" href=\"a00164.html#gaaac6b356ef00154da41aaae7d1549193\">packed_highp_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga1f18ada6f7cdd8c46db33ba987280fc4\">  276</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, packed_mediump&gt;  <a class=\"code\" href=\"a00164.html#ga1f18ada6f7cdd8c46db33ba987280fc4\">packed_mediump_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga9189210cabd6651a5e14a4c46fb20598\">  279</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, packed_lowp&gt;             <a class=\"code\" href=\"a00164.html#ga9189210cabd6651a5e14a4c46fb20598\">packed_lowp_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga865a9c7bb22434b1b8c5ac31e164b628\">  282</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, packed_highp&gt;               <a class=\"code\" href=\"a00164.html#ga865a9c7bb22434b1b8c5ac31e164b628\">packed_highp_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga06f26d54dca30994eb1fdadb8e69f4a2\">  285</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, packed_mediump&gt;             <a class=\"code\" href=\"a00164.html#ga06f26d54dca30994eb1fdadb8e69f4a2\">packed_mediump_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga98c9d122a959e9f3ce10a5623c310f5d\">  288</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, packed_lowp&gt;                <a class=\"code\" href=\"a00164.html#ga98c9d122a959e9f3ce10a5623c310f5d\">packed_lowp_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;</div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0b570da473fec4619db5aa0dce5133b0\">  291</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, packed_highp&gt;              <a class=\"code\" href=\"a00164.html#ga0b570da473fec4619db5aa0dce5133b0\">packed_highp_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga1ea2bbdbcb0a69242f6d884663c1b0ab\">  294</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, packed_mediump&gt;    <a class=\"code\" href=\"a00164.html#ga1ea2bbdbcb0a69242f6d884663c1b0ab\">packed_mediump_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga576a3f8372197a56a79dee1c8280f485\">  297</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, packed_lowp&gt;               <a class=\"code\" href=\"a00164.html#ga576a3f8372197a56a79dee1c8280f485\">packed_lowp_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;</div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga6a5a3250b57dfadc66735bc72911437f\">  300</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, packed_highp&gt;              <a class=\"code\" href=\"a00164.html#ga6a5a3250b57dfadc66735bc72911437f\">packed_highp_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;</div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga70147763edff3fe96b03a0b98d6339a2\">  303</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, packed_mediump&gt;    <a class=\"code\" href=\"a00164.html#ga70147763edff3fe96b03a0b98d6339a2\">packed_mediump_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga7c20adbe1409e3fe4544677a7f6fe954\">  306</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, packed_lowp&gt;               <a class=\"code\" href=\"a00164.html#ga7c20adbe1409e3fe4544677a7f6fe954\">packed_lowp_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;</div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;        <span class=\"comment\">// -- *vec4 --</span></div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;</div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga7cb26d354dd69d23849c34c4fba88da9\">  311</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, aligned_highp&gt;    <a class=\"code\" href=\"a00164.html#ga7cb26d354dd69d23849c34c4fba88da9\">aligned_highp_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga320d1c661cff2ef214eb50241f2928b2\">  314</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, aligned_mediump&gt;  <a class=\"code\" href=\"a00164.html#ga320d1c661cff2ef214eb50241f2928b2\">aligned_mediump_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga82f7275d6102593a69ce38cdad680409\">  317</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, aligned_lowp&gt;             <a class=\"code\" href=\"a00164.html#ga82f7275d6102593a69ce38cdad680409\">aligned_lowp_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;</div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga8fad35c5677f228e261fe541f15363a4\">  320</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, aligned_highp&gt;   <a class=\"code\" href=\"a00164.html#ga8fad35c5677f228e261fe541f15363a4\">aligned_highp_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaffd747ea2aea1e69c2ecb04e68521b21\">  323</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, aligned_mediump&gt; <a class=\"code\" href=\"a00164.html#gaffd747ea2aea1e69c2ecb04e68521b21\">aligned_mediump_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga226f5ec7a953cea559c16fe3aff9924f\">  326</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, aligned_lowp&gt;    <a class=\"code\" href=\"a00164.html#ga226f5ec7a953cea559c16fe3aff9924f\">aligned_lowp_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga31bfa801e1579fdba752ec3f7a45ec91\">  329</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, aligned_highp&gt;              <a class=\"code\" href=\"a00164.html#ga31bfa801e1579fdba752ec3f7a45ec91\">aligned_highp_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga6099dd7878d0a78101a4250d8cd2d736\">  332</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, aligned_mediump&gt;    <a class=\"code\" href=\"a00164.html#ga6099dd7878d0a78101a4250d8cd2d736\">aligned_mediump_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaae92fcec8b2e0328ffbeac31cc4fc419\">  335</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, aligned_lowp&gt;               <a class=\"code\" href=\"a00164.html#gaae92fcec8b2e0328ffbeac31cc4fc419\">aligned_lowp_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gabdd60462042859f876c17c7346c732a5\">  338</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, aligned_highp&gt;             <a class=\"code\" href=\"a00164.html#gabdd60462042859f876c17c7346c732a5\">aligned_highp_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga73ea0c1ba31580e107d21270883f51fc\">  341</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, aligned_mediump&gt;   <a class=\"code\" href=\"a00164.html#ga73ea0c1ba31580e107d21270883f51fc\">aligned_mediump_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga46b1b0b9eb8625a5d69137bd66cd13dc\">  344</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, aligned_lowp&gt;              <a class=\"code\" href=\"a00164.html#ga46b1b0b9eb8625a5d69137bd66cd13dc\">aligned_lowp_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga9df1d0c425852cf63a57e533b7a83f4f\">  347</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, aligned_highp&gt;             <a class=\"code\" href=\"a00164.html#ga9df1d0c425852cf63a57e533b7a83f4f\">aligned_highp_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga91bc1f513bb9b0fd60281d57ded9a48c\">  350</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, aligned_mediump&gt;   <a class=\"code\" href=\"a00164.html#ga91bc1f513bb9b0fd60281d57ded9a48c\">aligned_mediump_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaa7a76555ee4853614e5755181a8dd54e\">  353</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, aligned_lowp&gt;              <a class=\"code\" href=\"a00164.html#gaa7a76555ee4853614e5755181a8dd54e\">aligned_lowp_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga4015f36bf5a5adb6ac5d45beed959867\">  356</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, packed_highp&gt;             <a class=\"code\" href=\"a00164.html#ga4015f36bf5a5adb6ac5d45beed959867\">packed_highp_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;</div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga68c9bb24f387b312bae6a0a68e74d95e\">  359</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, packed_mediump&gt;   <a class=\"code\" href=\"a00164.html#ga68c9bb24f387b312bae6a0a68e74d95e\">packed_mediump_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga3cc94fb8de80bbd8a4aa7a5b206d304a\">  362</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, packed_lowp&gt;              <a class=\"code\" href=\"a00164.html#ga3cc94fb8de80bbd8a4aa7a5b206d304a\">packed_lowp_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga81b5368fe485e2630aa9b44832d592e7\">  365</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, packed_highp&gt;    <a class=\"code\" href=\"a00164.html#ga81b5368fe485e2630aa9b44832d592e7\">packed_highp_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;</div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga568b850f1116b667043533cf77826968\">  368</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, packed_mediump&gt;  <a class=\"code\" href=\"a00164.html#ga568b850f1116b667043533cf77826968\">packed_mediump_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga262dafd0c001c3a38d1cc91d024ca738\">  371</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, packed_lowp&gt;             <a class=\"code\" href=\"a00164.html#ga262dafd0c001c3a38d1cc91d024ca738\">packed_lowp_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gad6f1b4e3a51c2c051814b60d5d1b8895\">  374</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, packed_highp&gt;               <a class=\"code\" href=\"a00164.html#gad6f1b4e3a51c2c051814b60d5d1b8895\">packed_highp_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga70130dc8ed9c966ec2a221ce586d45d8\">  377</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, packed_mediump&gt;             <a class=\"code\" href=\"a00164.html#ga70130dc8ed9c966ec2a221ce586d45d8\">packed_mediump_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;</div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga931731b8ae3b54c7ecc221509dae96bc\">  380</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, packed_lowp&gt;                <a class=\"code\" href=\"a00164.html#ga931731b8ae3b54c7ecc221509dae96bc\">packed_lowp_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaa582f38c82aef61dea7aaedf15bb06a6\">  383</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, packed_highp&gt;              <a class=\"code\" href=\"a00164.html#gaa582f38c82aef61dea7aaedf15bb06a6\">packed_highp_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;</div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga63a73be86a4f07ea7a7499ab0bfebe45\">  386</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, packed_mediump&gt;    <a class=\"code\" href=\"a00164.html#ga63a73be86a4f07ea7a7499ab0bfebe45\">packed_mediump_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gafdd97922b4a2a42cd0c99a13877ff4da\">  389</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, packed_lowp&gt;               <a class=\"code\" href=\"a00164.html#gafdd97922b4a2a42cd0c99a13877ff4da\">packed_lowp_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;</div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga09f517d88b996ef1b2f42fd54222b82d\">  392</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, packed_highp&gt;              <a class=\"code\" href=\"a00164.html#ga09f517d88b996ef1b2f42fd54222b82d\">packed_highp_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;</div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga7b1620f259595b9da47a6374fc44588a\">  395</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, packed_mediump&gt;    <a class=\"code\" href=\"a00164.html#ga7b1620f259595b9da47a6374fc44588a\">packed_mediump_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;</div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae473587cff3092edc0877fc691c26a0b\">  398</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, packed_lowp&gt;               <a class=\"code\" href=\"a00164.html#gae473587cff3092edc0877fc691c26a0b\">packed_lowp_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;</div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;        <span class=\"comment\">// -- default --</span></div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_vec1                       <a class=\"code\" href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">aligned_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_vec2                       <a class=\"code\" href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">aligned_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_vec3                       <a class=\"code\" href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">aligned_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_vec4                       <a class=\"code\" href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">aligned_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;        <span class=\"keyword\">typedef</span> packed_lowp_vec1                        <a class=\"code\" href=\"a00164.html#ga14741e3d9da9ae83765389927f837331\">packed_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;        <span class=\"keyword\">typedef</span> packed_lowp_vec2                        <a class=\"code\" href=\"a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66\">packed_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;        <span class=\"keyword\">typedef</span> packed_lowp_vec3                        <a class=\"code\" href=\"a00164.html#gaccccd090e185450caa28b5b63ad4e8f0\">packed_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;        <span class=\"keyword\">typedef</span> packed_lowp_vec4                        <a class=\"code\" href=\"a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d\">packed_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_vec1            <a class=\"code\" href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">aligned_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_vec2            <a class=\"code\" href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">aligned_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_vec3            <a class=\"code\" href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">aligned_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_vec4            <a class=\"code\" href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">aligned_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;        <span class=\"keyword\">typedef</span> packed_mediump_vec1                     <a class=\"code\" href=\"a00164.html#ga14741e3d9da9ae83765389927f837331\">packed_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;        <span class=\"keyword\">typedef</span> packed_mediump_vec2                     <a class=\"code\" href=\"a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66\">packed_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;        <span class=\"keyword\">typedef</span> packed_mediump_vec3                     <a class=\"code\" href=\"a00164.html#gaccccd090e185450caa28b5b63ad4e8f0\">packed_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;        <span class=\"keyword\">typedef</span> packed_mediump_vec4                     <a class=\"code\" href=\"a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d\">packed_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_FLOAT)</span></div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_vec1                      <a class=\"code\" href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">aligned_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;</div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">  425</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_vec2                      <a class=\"code\" href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">aligned_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;</div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">  428</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_vec3                      <a class=\"code\" href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">aligned_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">  431</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_vec4                      <a class=\"code\" href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">aligned_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga14741e3d9da9ae83765389927f837331\">  434</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_vec1                       <a class=\"code\" href=\"a00164.html#ga14741e3d9da9ae83765389927f837331\">packed_vec1</a>;</div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;</div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66\">  437</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_vec2                       <a class=\"code\" href=\"a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66\">packed_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;</div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaccccd090e185450caa28b5b63ad4e8f0\">  440</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_vec3                       <a class=\"code\" href=\"a00164.html#gaccccd090e185450caa28b5b63ad4e8f0\">packed_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;</div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d\">  443</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_vec4                       <a class=\"code\" href=\"a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d\">packed_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;</div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_dvec1                      <a class=\"code\" href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">aligned_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_dvec2                      <a class=\"code\" href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">aligned_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_dvec3                      <a class=\"code\" href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">aligned_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_dvec4                      <a class=\"code\" href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">aligned_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;        <span class=\"keyword\">typedef</span> packed_lowp_dvec1                       <a class=\"code\" href=\"a00164.html#ga532f0c940649b1ee303acd572fc35531\">packed_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;        <span class=\"keyword\">typedef</span> packed_lowp_dvec2                       <a class=\"code\" href=\"a00164.html#ga5c194b11fbda636f2ab20c3bd0079196\">packed_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;        <span class=\"keyword\">typedef</span> packed_lowp_dvec3                       <a class=\"code\" href=\"a00164.html#ga0581ea552d86b2b5de7a2804bed80e72\">packed_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;        <span class=\"keyword\">typedef</span> packed_lowp_dvec4                       <a class=\"code\" href=\"a00164.html#gae8a9b181f9dc813ad6e125a52b14b935\">packed_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00456\"></a><span class=\"lineno\">  456</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_dvec1           <a class=\"code\" href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">aligned_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\">  457</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_dvec2           <a class=\"code\" href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">aligned_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_dvec3           <a class=\"code\" href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">aligned_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_dvec4           <a class=\"code\" href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">aligned_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;        <span class=\"keyword\">typedef</span> packed_mediump_dvec1            <a class=\"code\" href=\"a00164.html#ga532f0c940649b1ee303acd572fc35531\">packed_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00461\"></a><span class=\"lineno\">  461</span>&#160;        <span class=\"keyword\">typedef</span> packed_mediump_dvec2            <a class=\"code\" href=\"a00164.html#ga5c194b11fbda636f2ab20c3bd0079196\">packed_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\">  462</span>&#160;        <span class=\"keyword\">typedef</span> packed_mediump_dvec3            <a class=\"code\" href=\"a00164.html#ga0581ea552d86b2b5de7a2804bed80e72\">packed_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;        <span class=\"keyword\">typedef</span> packed_mediump_dvec4            <a class=\"code\" href=\"a00164.html#gae8a9b181f9dc813ad6e125a52b14b935\">packed_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_DOUBLE)</span></div>\n<div class=\"line\"><a name=\"l00465\"></a><span class=\"lineno\">  465</span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_dvec1                     <a class=\"code\" href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">aligned_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\">  467</span>&#160;</div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">  469</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_dvec2                     <a class=\"code\" href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">aligned_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;</div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">  472</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_dvec3                     <a class=\"code\" href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">aligned_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;</div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">  475</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_dvec4                     <a class=\"code\" href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">aligned_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;</div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga532f0c940649b1ee303acd572fc35531\">  478</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_dvec1                      <a class=\"code\" href=\"a00164.html#ga532f0c940649b1ee303acd572fc35531\">packed_dvec1</a>;</div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;</div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga5c194b11fbda636f2ab20c3bd0079196\">  481</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_dvec2                      <a class=\"code\" href=\"a00164.html#ga5c194b11fbda636f2ab20c3bd0079196\">packed_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;</div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0581ea552d86b2b5de7a2804bed80e72\">  484</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_dvec3                      <a class=\"code\" href=\"a00164.html#ga0581ea552d86b2b5de7a2804bed80e72\">packed_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;</div>\n<div class=\"line\"><a name=\"l00487\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae8a9b181f9dc813ad6e125a52b14b935\">  487</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_dvec4                      <a class=\"code\" href=\"a00164.html#gae8a9b181f9dc813ad6e125a52b14b935\">packed_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00488\"></a><span class=\"lineno\">  488</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\">  489</span>&#160;</div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_ivec1                      <a class=\"code\" href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">aligned_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_ivec2                      <a class=\"code\" href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">aligned_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00493\"></a><span class=\"lineno\">  493</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_ivec3                      <a class=\"code\" href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">aligned_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00494\"></a><span class=\"lineno\">  494</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_ivec4                      <a class=\"code\" href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">aligned_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_ivec1           <a class=\"code\" href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">aligned_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\">  497</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_ivec2           <a class=\"code\" href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">aligned_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_ivec3           <a class=\"code\" href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">aligned_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_ivec4           <a class=\"code\" href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">aligned_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00500\"></a><span class=\"lineno\">  500</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_INT)</span></div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_ivec1                     <a class=\"code\" href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">aligned_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;</div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">  505</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_ivec2                     <a class=\"code\" href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">aligned_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;</div>\n<div class=\"line\"><a name=\"l00508\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">  508</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_ivec3                     <a class=\"code\" href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">aligned_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;</div>\n<div class=\"line\"><a name=\"l00511\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">  511</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_ivec4                     <a class=\"code\" href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">aligned_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;</div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga11581a06fc7bf941fa4d4b6aca29812c\">  514</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_ivec1                      <a class=\"code\" href=\"a00164.html#ga11581a06fc7bf941fa4d4b6aca29812c\">packed_ivec1</a>;</div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;</div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga1fe4c5f56b8087d773aa90dc88a257a7\">  517</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_ivec2                      <a class=\"code\" href=\"a00164.html#ga1fe4c5f56b8087d773aa90dc88a257a7\">packed_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;</div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae157682a7847161787951ba1db4cf325\">  520</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_ivec3                      <a class=\"code\" href=\"a00164.html#gae157682a7847161787951ba1db4cf325\">packed_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\">  521</span>&#160;</div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gac228b70372abd561340d5f926a7c1778\">  523</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_ivec4                      <a class=\"code\" href=\"a00164.html#gac228b70372abd561340d5f926a7c1778\">packed_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00524\"></a><span class=\"lineno\">  524</span>&#160;</div>\n<div class=\"line\"><a name=\"l00525\"></a><span class=\"lineno\">  525</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;</div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;        <span class=\"comment\">// -- Unsigned integer definition --</span></div>\n<div class=\"line\"><a name=\"l00528\"></a><span class=\"lineno\">  528</span>&#160;</div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_uvec1                      <a class=\"code\" href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">aligned_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_uvec2                      <a class=\"code\" href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">aligned_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_uvec3                      <a class=\"code\" href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">aligned_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\">  533</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_uvec4                      <a class=\"code\" href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">aligned_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_uvec1           <a class=\"code\" href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">aligned_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00536\"></a><span class=\"lineno\">  536</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_uvec2           <a class=\"code\" href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">aligned_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00537\"></a><span class=\"lineno\">  537</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_uvec3           <a class=\"code\" href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">aligned_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00538\"></a><span class=\"lineno\">  538</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_uvec4           <a class=\"code\" href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">aligned_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_UINT)</span></div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_uvec1                     <a class=\"code\" href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">aligned_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00542\"></a><span class=\"lineno\">  542</span>&#160;</div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">  544</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_uvec2                     <a class=\"code\" href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">aligned_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00545\"></a><span class=\"lineno\">  545</span>&#160;</div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">  547</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_uvec3                     <a class=\"code\" href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">aligned_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;</div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">  550</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_uvec4                     <a class=\"code\" href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">aligned_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;</div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga5621493caac01bdd22ab6be4416b0314\">  553</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_uvec1                      <a class=\"code\" href=\"a00164.html#ga5621493caac01bdd22ab6be4416b0314\">packed_uvec1</a>;</div>\n<div class=\"line\"><a name=\"l00554\"></a><span class=\"lineno\">  554</span>&#160;</div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gabcc33efb4d5e83b8fe4706360e75b932\">  556</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_uvec2                      <a class=\"code\" href=\"a00164.html#gabcc33efb4d5e83b8fe4706360e75b932\">packed_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;</div>\n<div class=\"line\"><a name=\"l00559\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab96804e99e3a72a35740fec690c79617\">  559</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_uvec3                      <a class=\"code\" href=\"a00164.html#gab96804e99e3a72a35740fec690c79617\">packed_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;</div>\n<div class=\"line\"><a name=\"l00562\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga8e5d92e84ebdbe2480cf96bc17d6e2f2\">  562</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_uvec4                      <a class=\"code\" href=\"a00164.html#ga8e5d92e84ebdbe2480cf96bc17d6e2f2\">packed_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00563\"></a><span class=\"lineno\">  563</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;</div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_BOOL))</span></div>\n<div class=\"line\"><a name=\"l00566\"></a><span class=\"lineno\">  566</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_bvec1                      <a class=\"code\" href=\"a00164.html#ga780a35f764020f553a9601a3fcdcd059\">aligned_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00567\"></a><span class=\"lineno\">  567</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_bvec2                      <a class=\"code\" href=\"a00164.html#gae766b317c5afec852bfb3d74a3c54bc8\">aligned_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_bvec3                      <a class=\"code\" href=\"a00164.html#gae1964ba70d15915e5b710926decbb3cb\">aligned_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;        <span class=\"keyword\">typedef</span> aligned_lowp_bvec4                      <a class=\"code\" href=\"a00164.html#gae164a1f7879f828bc35e50b79d786b05\">aligned_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_BOOL))</span></div>\n<div class=\"line\"><a name=\"l00571\"></a><span class=\"lineno\">  571</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_bvec1           <a class=\"code\" href=\"a00164.html#ga780a35f764020f553a9601a3fcdcd059\">aligned_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00572\"></a><span class=\"lineno\">  572</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_bvec2           <a class=\"code\" href=\"a00164.html#gae766b317c5afec852bfb3d74a3c54bc8\">aligned_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_bvec3           <a class=\"code\" href=\"a00164.html#gae1964ba70d15915e5b710926decbb3cb\">aligned_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;        <span class=\"keyword\">typedef</span> aligned_mediump_bvec4           <a class=\"code\" href=\"a00164.html#gae164a1f7879f828bc35e50b79d786b05\">aligned_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00575\"></a><span class=\"lineno\">  575</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_BOOL)</span></div>\n<div class=\"line\"><a name=\"l00576\"></a><span class=\"lineno\">  576</span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_bvec1                     <a class=\"code\" href=\"a00164.html#ga780a35f764020f553a9601a3fcdcd059\">aligned_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;</div>\n<div class=\"line\"><a name=\"l00580\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae766b317c5afec852bfb3d74a3c54bc8\">  580</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_bvec2                     <a class=\"code\" href=\"a00164.html#gae766b317c5afec852bfb3d74a3c54bc8\">aligned_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;</div>\n<div class=\"line\"><a name=\"l00583\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae1964ba70d15915e5b710926decbb3cb\">  583</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_bvec3                     <a class=\"code\" href=\"a00164.html#gae1964ba70d15915e5b710926decbb3cb\">aligned_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00584\"></a><span class=\"lineno\">  584</span>&#160;</div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gae164a1f7879f828bc35e50b79d786b05\">  586</a></span>&#160;        <span class=\"keyword\">typedef</span> aligned_highp_bvec4                     <a class=\"code\" href=\"a00164.html#gae164a1f7879f828bc35e50b79d786b05\">aligned_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00587\"></a><span class=\"lineno\">  587</span>&#160;</div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga88632cea9008ac0ac1388e94e804a53c\">  589</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_bvec1                      <a class=\"code\" href=\"a00164.html#ga88632cea9008ac0ac1388e94e804a53c\">packed_bvec1</a>;</div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;</div>\n<div class=\"line\"><a name=\"l00592\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#gab85245913eaa40ab82adabcae37086cb\">  592</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_bvec2                      <a class=\"code\" href=\"a00164.html#gab85245913eaa40ab82adabcae37086cb\">packed_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;</div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga0c48f9417f649e27f3fb0c9f733a18bd\">  595</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_bvec3                      <a class=\"code\" href=\"a00164.html#ga0c48f9417f649e27f3fb0c9f733a18bd\">packed_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00596\"></a><span class=\"lineno\">  596</span>&#160;</div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00164.html#ga3180d7db84a74c402157df3bbc0ae3ed\">  598</a></span>&#160;        <span class=\"keyword\">typedef</span> packed_highp_bvec4                      <a class=\"code\" href=\"a00164.html#ga3180d7db84a74c402157df3bbc0ae3ed\">packed_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;</div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00164_html_ga3254defa5a8f0ae4b02b45fedba84a66\"><div class=\"ttname\"><a href=\"a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66\">glm::packed_vec2</a></div><div class=\"ttdeci\">packed_highp_vec2 packed_vec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of single-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00437\">gtc/type_aligned.hpp:437</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga780a35f764020f553a9601a3fcdcd059\"><div class=\"ttname\"><a href=\"a00164.html#ga780a35f764020f553a9601a3fcdcd059\">glm::aligned_bvec1</a></div><div class=\"ttdeci\">aligned_highp_bvec1 aligned_bvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00577\">gtc/type_aligned.hpp:577</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga9df1d0c425852cf63a57e533b7a83f4f\"><div class=\"ttname\"><a href=\"a00164.html#ga9df1d0c425852cf63a57e533b7a83f4f\">glm::aligned_highp_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, aligned_highp &gt; aligned_highp_bvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00347\">gtc/type_aligned.hpp:347</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7b1620f259595b9da47a6374fc44588a\"><div class=\"ttname\"><a href=\"a00164.html#ga7b1620f259595b9da47a6374fc44588a\">glm::packed_mediump_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, packed_mediump &gt; packed_mediump_bvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00395\">gtc/type_aligned.hpp:395</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga73ea0c1ba31580e107d21270883f51fc\"><div class=\"ttname\"><a href=\"a00164.html#ga73ea0c1ba31580e107d21270883f51fc\">glm::aligned_mediump_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, aligned_mediump &gt; aligned_mediump_uvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00341\">gtc/type_aligned.hpp:341</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7f8a2cc5a686e52b1615761f4978ca62\"><div class=\"ttname\"><a href=\"a00164.html#ga7f8a2cc5a686e52b1615761f4978ca62\">glm::aligned_lowp_dvec1</a></div><div class=\"ttdeci\">vec&lt; 1, double, aligned_lowp &gt; aligned_lowp_dvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of double-precision floating-point numbers using low precision a...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00050\">gtc/type_aligned.hpp:50</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga1ff8ed402c93d280ff0597c1c5e7c548\"><div class=\"ttname\"><a href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">glm::aligned_uvec1</a></div><div class=\"ttdeci\">aligned_highp_uvec1 aligned_uvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00541\">gtc/type_aligned.hpp:541</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga958210fe245a75b058325d367c951132\"><div class=\"ttname\"><a href=\"a00164.html#ga958210fe245a75b058325d367c951132\">glm::packed_lowp_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, packed_lowp &gt; packed_lowp_uvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00205\">gtc/type_aligned.hpp:205</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga8a9f0a4795ccc442fa9901845026f9f5\"><div class=\"ttname\"><a href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">glm::aligned_dvec4</a></div><div class=\"ttdeci\">aligned_highp_dvec4 aligned_dvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of double-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00475\">gtc/type_aligned.hpp:475</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga41563650f36cb7f479e080de21e08418\"><div class=\"ttname\"><a href=\"a00164.html#ga41563650f36cb7f479e080de21e08418\">glm::aligned_highp_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, aligned_highp &gt; aligned_highp_ivec2</div><div class=\"ttdoc\">2 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00145\">gtc/type_aligned.hpp:145</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae94ef61edfa047d05bc69b6065fc42ba\"><div class=\"ttname\"><a href=\"a00164.html#gae94ef61edfa047d05bc69b6065fc42ba\">glm::aligned_highp_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, aligned_highp &gt; aligned_highp_dvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of double-precision floating-point numbers using high precision...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00228\">gtc/type_aligned.hpp:228</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab704d4fb15f6f96d70e363d5db7060cd\"><div class=\"ttname\"><a href=\"a00164.html#gab704d4fb15f6f96d70e363d5db7060cd\">glm::packed_highp_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, packed_highp &gt; packed_highp_uvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00199\">gtc/type_aligned.hpp:199</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gac6036449ab1c4abf8efe1ea00fcdd1c9\"><div class=\"ttname\"><a href=\"a00164.html#gac6036449ab1c4abf8efe1ea00fcdd1c9\">glm::aligned_lowp_bvec1</a></div><div class=\"ttdeci\">vec&lt; 1, bool, aligned_lowp &gt; aligned_lowp_bvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00077\">gtc/type_aligned.hpp:77</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaf111fed760ecce16cb1988807569bee5\"><div class=\"ttname\"><a href=\"a00164.html#gaf111fed760ecce16cb1988807569bee5\">glm::packed_lowp_uvec1</a></div><div class=\"ttdeci\">vec&lt; 1, uint, packed_lowp &gt; packed_lowp_uvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00113\">gtc/type_aligned.hpp:113</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga058e7ddab1428e47f2197bdd3a5a6953\"><div class=\"ttname\"><a href=\"a00164.html#ga058e7ddab1428e47f2197bdd3a5a6953\">glm::aligned_mediump_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, aligned_mediump &gt; aligned_mediump_dvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of double-precision floating-point numbers using medium precisi...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00231\">gtc/type_aligned.hpp:231</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga44c4accad582cfbd7226a19b83b0cadc\"><div class=\"ttname\"><a href=\"a00164.html#ga44c4accad582cfbd7226a19b83b0cadc\">glm::aligned_lowp_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, aligned_lowp &gt; aligned_lowp_ivec2</div><div class=\"ttdoc\">2 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00151\">gtc/type_aligned.hpp:151</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga8920e90ea9c01d9c97e604a938ce2cbd\"><div class=\"ttname\"><a href=\"a00164.html#ga8920e90ea9c01d9c97e604a938ce2cbd\">glm::packed_mediump_dvec1</a></div><div class=\"ttdeci\">vec&lt; 1, double, packed_mediump &gt; packed_mediump_dvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of double-precision floating-point numbers using medium p...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00092\">gtc/type_aligned.hpp:92</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga865a9c7bb22434b1b8c5ac31e164b628\"><div class=\"ttname\"><a href=\"a00164.html#ga865a9c7bb22434b1b8c5ac31e164b628\">glm::packed_highp_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, packed_highp &gt; packed_highp_ivec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00282\">gtc/type_aligned.hpp:282</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga4015f36bf5a5adb6ac5d45beed959867\"><div class=\"ttname\"><a href=\"a00164.html#ga4015f36bf5a5adb6ac5d45beed959867\">glm::packed_highp_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, packed_highp &gt; packed_highp_vec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of single-precision floating-point numbers using high pr...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00356\">gtc/type_aligned.hpp:356</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga56473759d2702ee19ab7f91d0017fa70\"><div class=\"ttname\"><a href=\"a00164.html#ga56473759d2702ee19ab7f91d0017fa70\">glm::packed_highp_vec1</a></div><div class=\"ttdeci\">vec&lt; 1, float, packed_highp &gt; packed_highp_vec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of single-precision floating-point numbers using high pre...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00080\">gtc/type_aligned.hpp:80</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga3a30c137c1f8cce478c28eab0427a570\"><div class=\"ttname\"><a href=\"a00164.html#ga3a30c137c1f8cce478c28eab0427a570\">glm::packed_lowp_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, packed_lowp &gt; packed_lowp_vec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of single-precision floating-point numbers using low pre...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00270\">gtc/type_aligned.hpp:270</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gacb78126ea2eb779b41c7511128ff1283\"><div class=\"ttname\"><a href=\"a00164.html#gacb78126ea2eb779b41c7511128ff1283\">glm::aligned_mediump_uvec1</a></div><div class=\"ttdeci\">vec&lt; 1, uint, aligned_mediump &gt; aligned_mediump_uvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00065\">gtc/type_aligned.hpp:65</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaaac6b356ef00154da41aaae7d1549193\"><div class=\"ttname\"><a href=\"a00164.html#gaaac6b356ef00154da41aaae7d1549193\">glm::packed_highp_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, packed_highp &gt; packed_highp_dvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of double-precision floating-point numbers using high pr...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00273\">gtc/type_aligned.hpp:273</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"><div class=\"ttname\"><a href=\"a00164.html#ga8e5d92e84ebdbe2480cf96bc17d6e2f2\">glm::packed_uvec4</a></div><div class=\"ttdeci\">packed_highp_uvec4 packed_uvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00562\">gtc/type_aligned.hpp:562</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga65415d2d68c9cc0ca554524a8f5510b2\"><div class=\"ttname\"><a href=\"a00164.html#ga65415d2d68c9cc0ca554524a8f5510b2\">glm::aligned_highp_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, aligned_highp &gt; aligned_highp_vec3</div><div class=\"ttdoc\">3 components vector aligned in memory of single-precision floating-point numbers using high precision...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00219\">gtc/type_aligned.hpp:219</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga6a5a3250b57dfadc66735bc72911437f\"><div class=\"ttname\"><a href=\"a00164.html#ga6a5a3250b57dfadc66735bc72911437f\">glm::packed_highp_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, packed_highp &gt; packed_highp_bvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00300\">gtc/type_aligned.hpp:300</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga2a8d9c3046f89d854eb758adfa0811c0\"><div class=\"ttname\"><a href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">glm::aligned_uvec3</a></div><div class=\"ttdeci\">aligned_highp_uvec3 aligned_uvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00547\">gtc/type_aligned.hpp:547</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0c48f9417f649e27f3fb0c9f733a18bd\"><div class=\"ttname\"><a href=\"a00164.html#ga0c48f9417f649e27f3fb0c9f733a18bd\">glm::packed_bvec3</a></div><div class=\"ttdeci\">packed_highp_bvec3 packed_bvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00595\">gtc/type_aligned.hpp:595</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaa37869eea77d28419b2fb0ff70b69bf0\"><div class=\"ttname\"><a href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">glm::aligned_dvec3</a></div><div class=\"ttdeci\">aligned_highp_dvec3 aligned_dvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of double-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00472\">gtc/type_aligned.hpp:472</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga5b80e28396c6ef7d32c6fd18df498451\"><div class=\"ttname\"><a href=\"a00164.html#ga5b80e28396c6ef7d32c6fd18df498451\">glm::aligned_highp_uvec1</a></div><div class=\"ttdeci\">vec&lt; 1, uint, aligned_highp &gt; aligned_highp_uvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00062\">gtc/type_aligned.hpp:62</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga20e63dd980b81af10cadbbe219316650\"><div class=\"ttname\"><a href=\"a00164.html#ga20e63dd980b81af10cadbbe219316650\">glm::aligned_mediump_ivec1</a></div><div class=\"ttdeci\">vec&lt; 1, int, aligned_mediump &gt; aligned_mediump_ivec1</div><div class=\"ttdoc\">1 component vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00056\">gtc/type_aligned.hpp:56</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaf0448b0f7ceb8273f7eda3a92205eefc\"><div class=\"ttname\"><a href=\"a00164.html#gaf0448b0f7ceb8273f7eda3a92205eefc\">glm::aligned_highp_dvec1</a></div><div class=\"ttdeci\">vec&lt; 1, double, aligned_highp &gt; aligned_highp_dvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of double-precision floating-point numbers using high precision ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00044\">gtc/type_aligned.hpp:44</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga532f0c940649b1ee303acd572fc35531\"><div class=\"ttname\"><a href=\"a00164.html#ga532f0c940649b1ee303acd572fc35531\">glm::packed_dvec1</a></div><div class=\"ttdeci\">packed_highp_dvec1 packed_dvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of double-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00478\">gtc/type_aligned.hpp:478</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga04db692662a4908beeaf5a5ba6e19483\"><div class=\"ttname\"><a href=\"a00164.html#ga04db692662a4908beeaf5a5ba6e19483\">glm::aligned_highp_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, aligned_highp &gt; aligned_highp_uvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00154\">gtc/type_aligned.hpp:154</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaae92fcec8b2e0328ffbeac31cc4fc419\"><div class=\"ttname\"><a href=\"a00164.html#gaae92fcec8b2e0328ffbeac31cc4fc419\">glm::aligned_lowp_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, aligned_lowp &gt; aligned_lowp_ivec4</div><div class=\"ttdoc\">4 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00335\">gtc/type_aligned.hpp:335</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0682462f8096a226773e20fac993cde5\"><div class=\"ttname\"><a href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">glm::aligned_vec2</a></div><div class=\"ttdeci\">aligned_highp_vec2 aligned_vec2</div><div class=\"ttdoc\">2 components vector aligned in memory of single-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00425\">gtc/type_aligned.hpp:425</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga4d0bd70d5fac49b800546d608b707513\"><div class=\"ttname\"><a href=\"a00164.html#ga4d0bd70d5fac49b800546d608b707513\">glm::aligned_highp_vec1</a></div><div class=\"ttdeci\">vec&lt; 1, float, aligned_highp &gt; aligned_highp_vec1</div><div class=\"ttdoc\">1 component vector aligned in memory of single-precision floating-point numbers using high precision ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00035\">gtc/type_aligned.hpp:35</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaffd747ea2aea1e69c2ecb04e68521b21\"><div class=\"ttname\"><a href=\"a00164.html#gaffd747ea2aea1e69c2ecb04e68521b21\">glm::aligned_mediump_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, aligned_mediump &gt; aligned_mediump_dvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of double-precision floating-point numbers using medium precisi...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00323\">gtc/type_aligned.hpp:323</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gad09b93acc43c43423408d17a64f6d7ca\"><div class=\"ttname\"><a href=\"a00164.html#gad09b93acc43c43423408d17a64f6d7ca\">glm::aligned_lowp_uvec1</a></div><div class=\"ttdeci\">vec&lt; 1, uint, aligned_lowp &gt; aligned_lowp_uvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00068\">gtc/type_aligned.hpp:68</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab472b2d917b5e6efd76e8c7dbfbbf9f1\"><div class=\"ttname\"><a href=\"a00164.html#gab472b2d917b5e6efd76e8c7dbfbbf9f1\">glm::packed_highp_dvec1</a></div><div class=\"ttdeci\">vec&lt; 1, double, packed_highp &gt; packed_highp_dvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of double-precision floating-point numbers using high pre...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00089\">gtc/type_aligned.hpp:89</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga3815661df0e2de79beff8168c09adf1e\"><div class=\"ttname\"><a href=\"a00164.html#ga3815661df0e2de79beff8168c09adf1e\">glm::packed_highp_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, packed_highp &gt; packed_highp_vec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of single-precision floating-point numbers using high pr...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00264\">gtc/type_aligned.hpp:264</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga6844c6f4691d1bf67673240850430948\"><div class=\"ttname\"><a href=\"a00164.html#ga6844c6f4691d1bf67673240850430948\">glm::packed_mediump_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, packed_mediump &gt; packed_mediump_vec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of single-precision floating-point numbers using medium ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00175\">gtc/type_aligned.hpp:175</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0731b593c5e33559954c80f8687e76c6\"><div class=\"ttname\"><a href=\"a00164.html#ga0731b593c5e33559954c80f8687e76c6\">glm::aligned_highp_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, aligned_highp &gt; aligned_highp_bvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00163\">gtc/type_aligned.hpp:163</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga05e6d4c908965d04191c2070a8d0a65e\"><div class=\"ttname\"><a href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">glm::aligned_vec1</a></div><div class=\"ttdeci\">aligned_highp_vec1 aligned_vec1</div><div class=\"ttdoc\">1 component vector aligned in memory of single-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00422\">gtc/type_aligned.hpp:422</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga65663f10a02e52cedcddbcfe36ddf38d\"><div class=\"ttname\"><a href=\"a00164.html#ga65663f10a02e52cedcddbcfe36ddf38d\">glm::aligned_lowp_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, aligned_lowp &gt; aligned_lowp_ivec3</div><div class=\"ttdoc\">3 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00243\">gtc/type_aligned.hpp:243</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gabf842c45eea186170c267a328e3f3b7d\"><div class=\"ttname\"><a href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">glm::aligned_uvec4</a></div><div class=\"ttdeci\">aligned_highp_uvec4 aligned_uvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00550\">gtc/type_aligned.hpp:550</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7245acc887a5438f46fd85fdf076bb3b\"><div class=\"ttname\"><a href=\"a00164.html#ga7245acc887a5438f46fd85fdf076bb3b\">glm::packed_highp_ivec1</a></div><div class=\"ttdeci\">vec&lt; 1, int, packed_highp &gt; packed_highp_ivec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00098\">gtc/type_aligned.hpp:98</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gad6fc921bdde2bdbc7e09b028e1e9b379\"><div class=\"ttname\"><a href=\"a00164.html#gad6fc921bdde2bdbc7e09b028e1e9b379\">glm::aligned_mediump_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, aligned_mediump &gt; aligned_mediump_uvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00249\">gtc/type_aligned.hpp:249</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7180b685c581adb224406a7f831608e3\"><div class=\"ttname\"><a href=\"a00164.html#ga7180b685c581adb224406a7f831608e3\">glm::aligned_mediump_dvec1</a></div><div class=\"ttdeci\">vec&lt; 1, double, aligned_mediump &gt; aligned_mediump_dvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of double-precision floating-point numbers using medium precisio...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00047\">gtc/type_aligned.hpp:47</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga70147763edff3fe96b03a0b98d6339a2\"><div class=\"ttname\"><a href=\"a00164.html#ga70147763edff3fe96b03a0b98d6339a2\">glm::packed_mediump_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, packed_mediump &gt; packed_mediump_bvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00303\">gtc/type_aligned.hpp:303</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga9189210cabd6651a5e14a4c46fb20598\"><div class=\"ttname\"><a href=\"a00164.html#ga9189210cabd6651a5e14a4c46fb20598\">glm::packed_lowp_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, packed_lowp &gt; packed_lowp_dvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of double-precision floating-point numbers using low pre...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00279\">gtc/type_aligned.hpp:279</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga3cc94fb8de80bbd8a4aa7a5b206d304a\"><div class=\"ttname\"><a href=\"a00164.html#ga3cc94fb8de80bbd8a4aa7a5b206d304a\">glm::packed_lowp_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, packed_lowp &gt; packed_lowp_vec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of single-precision floating-point numbers using low pre...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00362\">gtc/type_aligned.hpp:362</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gacb183eb5e67ec0d0ea5a016cba962810\"><div class=\"ttname\"><a href=\"a00164.html#gacb183eb5e67ec0d0ea5a016cba962810\">glm::aligned_mediump_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, aligned_mediump &gt; aligned_mediump_bvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00166\">gtc/type_aligned.hpp:166</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga439e97795314b81cd15abd4e5c2e6e7a\"><div class=\"ttname\"><a href=\"a00164.html#ga439e97795314b81cd15abd4e5c2e6e7a\">glm::packed_highp_bvec1</a></div><div class=\"ttdeci\">vec&lt; 1, bool, packed_highp &gt; packed_highp_bvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00116\">gtc/type_aligned.hpp:116</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga83aab4d191053f169c93a3e364f2e118\"><div class=\"ttname\"><a href=\"a00164.html#ga83aab4d191053f169c93a3e364f2e118\">glm::aligned_lowp_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, aligned_lowp &gt; aligned_lowp_bvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00261\">gtc/type_aligned.hpp:261</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab4c6414a59539e66a242ad4cf4b476b4\"><div class=\"ttname\"><a href=\"a00164.html#gab4c6414a59539e66a242ad4cf4b476b4\">glm::packed_mediump_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, packed_mediump &gt; packed_mediump_bvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00211\">gtc/type_aligned.hpp:211</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga81b5368fe485e2630aa9b44832d592e7\"><div class=\"ttname\"><a href=\"a00164.html#ga81b5368fe485e2630aa9b44832d592e7\">glm::packed_highp_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, packed_highp &gt; packed_highp_dvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of double-precision floating-point numbers using high pr...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00365\">gtc/type_aligned.hpp:365</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7f79eae5927c9033d84617e49f6f34e4\"><div class=\"ttname\"><a href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">glm::aligned_ivec4</a></div><div class=\"ttdeci\">aligned_highp_ivec4 aligned_ivec4</div><div class=\"ttdoc\">4 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00511\">gtc/type_aligned.hpp:511</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga06f26d54dca30994eb1fdadb8e69f4a2\"><div class=\"ttname\"><a href=\"a00164.html#ga06f26d54dca30994eb1fdadb8e69f4a2\">glm::packed_mediump_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, packed_mediump &gt; packed_mediump_ivec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00285\">gtc/type_aligned.hpp:285</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga14741e3d9da9ae83765389927f837331\"><div class=\"ttname\"><a href=\"a00164.html#ga14741e3d9da9ae83765389927f837331\">glm::packed_vec1</a></div><div class=\"ttdeci\">packed_highp_vec1 packed_vec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of single-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00434\">gtc/type_aligned.hpp:434</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga081d53e0a71443d0b68ea61c870f9adc\"><div class=\"ttname\"><a href=\"a00164.html#ga081d53e0a71443d0b68ea61c870f9adc\">glm::aligned_mediump_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, aligned_mediump &gt; aligned_mediump_uvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00157\">gtc/type_aligned.hpp:157</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga54f368ec6b514a5aa4f28d40e6f93ef7\"><div class=\"ttname\"><a href=\"a00164.html#ga54f368ec6b514a5aa4f28d40e6f93ef7\">glm::packed_highp_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, packed_highp &gt; packed_highp_ivec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00190\">gtc/type_aligned.hpp:190</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga82f7275d6102593a69ce38cdad680409\"><div class=\"ttname\"><a href=\"a00164.html#ga82f7275d6102593a69ce38cdad680409\">glm::aligned_lowp_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, aligned_lowp &gt; aligned_lowp_vec4</div><div class=\"ttdoc\">4 components vector aligned in memory of single-precision floating-point numbers using low precision ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00317\">gtc/type_aligned.hpp:317</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga98c9d122a959e9f3ce10a5623c310f5d\"><div class=\"ttname\"><a href=\"a00164.html#ga98c9d122a959e9f3ce10a5623c310f5d\">glm::packed_lowp_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, packed_lowp &gt; packed_lowp_ivec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00288\">gtc/type_aligned.hpp:288</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0e37cff4a43cca866101f0a35f01db6d\"><div class=\"ttname\"><a href=\"a00164.html#ga0e37cff4a43cca866101f0a35f01db6d\">glm::aligned_lowp_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, aligned_lowp &gt; aligned_lowp_dvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of double-precision floating-point numbers using low precision ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00142\">gtc/type_aligned.hpp:142</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaf22b77f1cf3e73b8b1dddfe7f959357c\"><div class=\"ttname\"><a href=\"a00164.html#gaf22b77f1cf3e73b8b1dddfe7f959357c\">glm::packed_lowp_ivec1</a></div><div class=\"ttdeci\">vec&lt; 1, int, packed_lowp &gt; packed_lowp_ivec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00104\">gtc/type_aligned.hpp:104</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga31bfa801e1579fdba752ec3f7a45ec91\"><div class=\"ttname\"><a href=\"a00164.html#ga31bfa801e1579fdba752ec3f7a45ec91\">glm::aligned_highp_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, aligned_highp &gt; aligned_highp_ivec4</div><div class=\"ttdoc\">4 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00329\">gtc/type_aligned.hpp:329</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gad791d671f4fcf1ed1ea41f752916b70a\"><div class=\"ttname\"><a href=\"a00164.html#gad791d671f4fcf1ed1ea41f752916b70a\">glm::packed_highp_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, packed_highp &gt; packed_highp_bvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00208\">gtc/type_aligned.hpp:208</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga46b1b0b9eb8625a5d69137bd66cd13dc\"><div class=\"ttname\"><a href=\"a00164.html#ga46b1b0b9eb8625a5d69137bd66cd13dc\">glm::aligned_lowp_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, aligned_lowp &gt; aligned_lowp_uvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00344\">gtc/type_aligned.hpp:344</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae1964ba70d15915e5b710926decbb3cb\"><div class=\"ttname\"><a href=\"a00164.html#gae1964ba70d15915e5b710926decbb3cb\">glm::aligned_bvec3</a></div><div class=\"ttdeci\">aligned_highp_bvec3 aligned_bvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00583\">gtc/type_aligned.hpp:583</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaea13d89d49daca2c796aeaa82fc2c2f2\"><div class=\"ttname\"><a href=\"a00164.html#gaea13d89d49daca2c796aeaa82fc2c2f2\">glm::aligned_mediump_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, aligned_mediump &gt; aligned_mediump_ivec2</div><div class=\"ttdoc\">2 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00148\">gtc/type_aligned.hpp:148</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga226f5ec7a953cea559c16fe3aff9924f\"><div class=\"ttname\"><a href=\"a00164.html#ga226f5ec7a953cea559c16fe3aff9924f\">glm::aligned_lowp_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, aligned_lowp &gt; aligned_lowp_dvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of double-precision floating-point numbers using low precision ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00326\">gtc/type_aligned.hpp:326</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga37a0e0bf653169b581c5eea3d547fa5d\"><div class=\"ttname\"><a href=\"a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d\">glm::packed_vec4</a></div><div class=\"ttdeci\">packed_highp_vec4 packed_vec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of single-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00443\">gtc/type_aligned.hpp:443</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab34aee3d5e121c543fea11d2c50ecc43\"><div class=\"ttname\"><a href=\"a00164.html#gab34aee3d5e121c543fea11d2c50ecc43\">glm::aligned_lowp_vec1</a></div><div class=\"ttdeci\">vec&lt; 1, float, aligned_lowp &gt; aligned_lowp_vec1</div><div class=\"ttdoc\">1 component vector aligned in memory of single-precision floating-point numbers using low precision a...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00041\">gtc/type_aligned.hpp:41</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga9af1eabe22f569e70d9893be72eda0f5\"><div class=\"ttname\"><a href=\"a00164.html#ga9af1eabe22f569e70d9893be72eda0f5\">glm::aligned_mediump_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, aligned_mediump &gt; aligned_mediump_dvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of double-precision floating-point numbers using medium precisi...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00139\">gtc/type_aligned.hpp:139</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae3c8750f53259ece334d3aa3b3649a40\"><div class=\"ttname\"><a href=\"a00164.html#gae3c8750f53259ece334d3aa3b3649a40\">glm::packed_lowp_bvec1</a></div><div class=\"ttdeci\">vec&lt; 1, bool, packed_lowp &gt; packed_lowp_bvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00122\">gtc/type_aligned.hpp:122</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga6b8b9475e7c3b16aed13edbc460bbc4d\"><div class=\"ttname\"><a href=\"a00164.html#ga6b8b9475e7c3b16aed13edbc460bbc4d\">glm::packed_highp_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, packed_highp &gt; packed_highp_vec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of single-precision floating-point numbers using high pr...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00172\">gtc/type_aligned.hpp:172</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab173a333e6b7ce153ceba66ac4a321cf\"><div class=\"ttname\"><a href=\"a00164.html#gab173a333e6b7ce153ceba66ac4a321cf\">glm::aligned_highp_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, aligned_highp &gt; aligned_highp_dvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of double-precision floating-point numbers using high precision...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00136\">gtc/type_aligned.hpp:136</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga32794322d294e5ace7fed4a61896f270\"><div class=\"ttname\"><a href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">glm::aligned_ivec3</a></div><div class=\"ttdeci\">aligned_highp_ivec3 aligned_ivec3</div><div class=\"ttdoc\">3 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00508\">gtc/type_aligned.hpp:508</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga262dafd0c001c3a38d1cc91d024ca738\"><div class=\"ttname\"><a href=\"a00164.html#ga262dafd0c001c3a38d1cc91d024ca738\">glm::packed_lowp_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, packed_lowp &gt; packed_lowp_dvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of double-precision floating-point numbers using low pre...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00371\">gtc/type_aligned.hpp:371</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gabdd60462042859f876c17c7346c732a5\"><div class=\"ttname\"><a href=\"a00164.html#gabdd60462042859f876c17c7346c732a5\">glm::aligned_highp_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, aligned_highp &gt; aligned_highp_uvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00338\">gtc/type_aligned.hpp:338</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga4974f46ae5a19415d91316960a53617a\"><div class=\"ttname\"><a href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">glm::aligned_dvec1</a></div><div class=\"ttdeci\">aligned_highp_dvec1 aligned_dvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of double-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00466\">gtc/type_aligned.hpp:466</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7cf643b66664e0cd3c48759ae66c2bd0\"><div class=\"ttname\"><a href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">glm::aligned_vec3</a></div><div class=\"ttdeci\">aligned_highp_vec3 aligned_vec3</div><div class=\"ttdoc\">3 components vector aligned in memory of single-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00428\">gtc/type_aligned.hpp:428</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gadc19938ddb204bfcb4d9ef35b1e2bf93\"><div class=\"ttname\"><a href=\"a00164.html#gadc19938ddb204bfcb4d9ef35b1e2bf93\">glm::packed_lowp_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, packed_lowp &gt; packed_lowp_dvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of double-precision floating-point numbers using low pre...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00187\">gtc/type_aligned.hpp:187</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga98f0b5cd65fce164ff1367c2a3b3aa1e\"><div class=\"ttname\"><a href=\"a00164.html#ga98f0b5cd65fce164ff1367c2a3b3aa1e\">glm::aligned_lowp_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, aligned_lowp &gt; aligned_lowp_vec3</div><div class=\"ttdoc\">3 components vector aligned in memory of single-precision floating-point numbers using low precision ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00225\">gtc/type_aligned.hpp:225</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae473587cff3092edc0877fc691c26a0b\"><div class=\"ttname\"><a href=\"a00164.html#gae473587cff3092edc0877fc691c26a0b\">glm::packed_lowp_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, packed_lowp &gt; packed_lowp_bvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00398\">gtc/type_aligned.hpp:398</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gadd3b8bd71a758f7fb0da8e525156f34e\"><div class=\"ttname\"><a href=\"a00164.html#gadd3b8bd71a758f7fb0da8e525156f34e\">glm::aligned_mediump_bvec1</a></div><div class=\"ttdeci\">vec&lt; 1, bool, aligned_mediump &gt; aligned_mediump_bvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00074\">gtc/type_aligned.hpp:74</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga85d89e83cb8137e1be1446de8c3b643a\"><div class=\"ttname\"><a href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">glm::aligned_vec4</a></div><div class=\"ttdeci\">aligned_highp_vec4 aligned_vec4</div><div class=\"ttdoc\">4 components vector aligned in memory of single-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00431\">gtc/type_aligned.hpp:431</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab85245913eaa40ab82adabcae37086cb\"><div class=\"ttname\"><a href=\"a00164.html#gab85245913eaa40ab82adabcae37086cb\">glm::packed_bvec2</a></div><div class=\"ttdeci\">packed_highp_bvec2 packed_bvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00592\">gtc/type_aligned.hpp:592</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga63a73be86a4f07ea7a7499ab0bfebe45\"><div class=\"ttname\"><a href=\"a00164.html#ga63a73be86a4f07ea7a7499ab0bfebe45\">glm::packed_mediump_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, packed_mediump &gt; packed_mediump_uvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00386\">gtc/type_aligned.hpp:386</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaa582f38c82aef61dea7aaedf15bb06a6\"><div class=\"ttname\"><a href=\"a00164.html#gaa582f38c82aef61dea7aaedf15bb06a6\">glm::packed_highp_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, packed_highp &gt; packed_highp_uvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00383\">gtc/type_aligned.hpp:383</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaccccd090e185450caa28b5b63ad4e8f0\"><div class=\"ttname\"><a href=\"a00164.html#gaccccd090e185450caa28b5b63ad4e8f0\">glm::packed_vec3</a></div><div class=\"ttdeci\">packed_highp_vec3 packed_vec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of single-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00440\">gtc/type_aligned.hpp:440</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaaa891048dddef4627df33809ec726219\"><div class=\"ttname\"><a href=\"a00164.html#gaaa891048dddef4627df33809ec726219\">glm::packed_mediump_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, packed_mediump &gt; packed_mediump_ivec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00193\">gtc/type_aligned.hpp:193</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab0eb771b708c5b2205d9b14dd1434fd8\"><div class=\"ttname\"><a href=\"a00164.html#gab0eb771b708c5b2205d9b14dd1434fd8\">glm::packed_mediump_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, packed_mediump &gt; packed_mediump_vec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of single-precision floating-point numbers using medium ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00267\">gtc/type_aligned.hpp:267</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga073fd6e8b241afade6d8afbd676b2667\"><div class=\"ttname\"><a href=\"a00164.html#ga073fd6e8b241afade6d8afbd676b2667\">glm::aligned_highp_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, aligned_highp &gt; aligned_highp_uvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00246\">gtc/type_aligned.hpp:246</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gabcc33efb4d5e83b8fe4706360e75b932\"><div class=\"ttname\"><a href=\"a00164.html#gabcc33efb4d5e83b8fe4706360e75b932\">glm::packed_uvec2</a></div><div class=\"ttdeci\">packed_highp_uvec2 packed_uvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00556\">gtc/type_aligned.hpp:556</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gac969befedbda69eb78d4e23f751fdbee\"><div class=\"ttname\"><a href=\"a00164.html#gac969befedbda69eb78d4e23f751fdbee\">glm::packed_lowp_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, packed_lowp &gt; packed_lowp_bvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00214\">gtc/type_aligned.hpp:214</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga320d1c661cff2ef214eb50241f2928b2\"><div class=\"ttname\"><a href=\"a00164.html#ga320d1c661cff2ef214eb50241f2928b2\">glm::aligned_mediump_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, aligned_mediump &gt; aligned_mediump_vec4</div><div class=\"ttdoc\">4 components vector aligned in memory of single-precision floating-point numbers using medium precisi...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00314\">gtc/type_aligned.hpp:314</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga054050e9d4e78d81db0e6d1573b1c624\"><div class=\"ttname\"><a href=\"a00164.html#ga054050e9d4e78d81db0e6d1573b1c624\">glm::packed_lowp_dvec1</a></div><div class=\"ttdeci\">vec&lt; 1, double, packed_lowp &gt; packed_lowp_dvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of double-precision floating-point numbers using low prec...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00095\">gtc/type_aligned.hpp:95</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga6eca5170bb35eac90b4972590fd31a06\"><div class=\"ttname\"><a href=\"a00164.html#ga6eca5170bb35eac90b4972590fd31a06\">glm::aligned_highp_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, aligned_highp &gt; aligned_highp_ivec3</div><div class=\"ttdoc\">3 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00237\">gtc/type_aligned.hpp:237</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7c20adbe1409e3fe4544677a7f6fe954\"><div class=\"ttname\"><a href=\"a00164.html#ga7c20adbe1409e3fe4544677a7f6fe954\">glm::packed_lowp_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, packed_lowp &gt; packed_lowp_bvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00306\">gtc/type_aligned.hpp:306</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga862843a45b01c35ffe4d44c47ea774ad\"><div class=\"ttname\"><a href=\"a00164.html#ga862843a45b01c35ffe4d44c47ea774ad\">glm::aligned_highp_bvec1</a></div><div class=\"ttdeci\">vec&lt; 1, bool, aligned_highp &gt; aligned_highp_bvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00071\">gtc/type_aligned.hpp:71</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga71d63cead1e113fca0bcdaaa33aad050\"><div class=\"ttname\"><a href=\"a00164.html#ga71d63cead1e113fca0bcdaaa33aad050\">glm::packed_mediump_vec1</a></div><div class=\"ttdeci\">vec&lt; 1, float, packed_mediump &gt; packed_mediump_vec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of single-precision floating-point numbers using medium p...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00083\">gtc/type_aligned.hpp:83</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga3180d7db84a74c402157df3bbc0ae3ed\"><div class=\"ttname\"><a href=\"a00164.html#ga3180d7db84a74c402157df3bbc0ae3ed\">glm::packed_bvec4</a></div><div class=\"ttdeci\">packed_highp_bvec4 packed_bvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00598\">gtc/type_aligned.hpp:598</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae4f38fd2c86cee6940986197777b3ca4\"><div class=\"ttname\"><a href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">glm::aligned_ivec2</a></div><div class=\"ttdeci\">aligned_highp_ivec2 aligned_ivec2</div><div class=\"ttdoc\">2 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00505\">gtc/type_aligned.hpp:505</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gafdd97922b4a2a42cd0c99a13877ff4da\"><div class=\"ttname\"><a href=\"a00164.html#gafdd97922b4a2a42cd0c99a13877ff4da\">glm::packed_lowp_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, packed_lowp &gt; packed_lowp_uvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00389\">gtc/type_aligned.hpp:389</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga568b850f1116b667043533cf77826968\"><div class=\"ttname\"><a href=\"a00164.html#ga568b850f1116b667043533cf77826968\">glm::packed_mediump_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, packed_mediump &gt; packed_mediump_dvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of double-precision floating-point numbers using medium ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00368\">gtc/type_aligned.hpp:368</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0581ea552d86b2b5de7a2804bed80e72\"><div class=\"ttname\"><a href=\"a00164.html#ga0581ea552d86b2b5de7a2804bed80e72\">glm::packed_dvec3</a></div><div class=\"ttdeci\">packed_highp_dvec3 packed_dvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of double-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00484\">gtc/type_aligned.hpp:484</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga2c29fb42bab9a4f9b66bc60b2e514a34\"><div class=\"ttname\"><a href=\"a00164.html#ga2c29fb42bab9a4f9b66bc60b2e514a34\">glm::packed_mediump_uvec1</a></div><div class=\"ttdeci\">vec&lt; 1, uint, packed_mediump &gt; packed_mediump_uvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00110\">gtc/type_aligned.hpp:110</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga59fadcd3835646e419372ae8b43c5d37\"><div class=\"ttname\"><a href=\"a00164.html#ga59fadcd3835646e419372ae8b43c5d37\">glm::aligned_lowp_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, aligned_lowp &gt; aligned_lowp_bvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00169\">gtc/type_aligned.hpp:169</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab96804e99e3a72a35740fec690c79617\"><div class=\"ttname\"><a href=\"a00164.html#gab96804e99e3a72a35740fec690c79617\">glm::packed_uvec3</a></div><div class=\"ttdeci\">packed_highp_uvec3 packed_uvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00559\">gtc/type_aligned.hpp:559</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae766b317c5afec852bfb3d74a3c54bc8\"><div class=\"ttname\"><a href=\"a00164.html#gae766b317c5afec852bfb3d74a3c54bc8\">glm::aligned_bvec2</a></div><div class=\"ttdeci\">aligned_highp_bvec2 aligned_bvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00580\">gtc/type_aligned.hpp:580</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0a6198fe64166a6a61084d43c71518a9\"><div class=\"ttname\"><a href=\"a00164.html#ga0a6198fe64166a6a61084d43c71518a9\">glm::packed_lowp_vec1</a></div><div class=\"ttdeci\">vec&lt; 1, float, packed_lowp &gt; packed_lowp_vec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of single-precision floating-point numbers using low prec...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00086\">gtc/type_aligned.hpp:86</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga5546d828d63010a8f9cf81161ad0275a\"><div class=\"ttname\"><a href=\"a00164.html#ga5546d828d63010a8f9cf81161ad0275a\">glm::packed_mediump_bvec1</a></div><div class=\"ttdeci\">vec&lt; 1, bool, packed_mediump &gt; packed_mediump_bvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00119\">gtc/type_aligned.hpp:119</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae164a1f7879f828bc35e50b79d786b05\"><div class=\"ttname\"><a href=\"a00164.html#gae164a1f7879f828bc35e50b79d786b05\">glm::aligned_bvec4</a></div><div class=\"ttdeci\">aligned_highp_bvec4 aligned_bvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00586\">gtc/type_aligned.hpp:586</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0b570da473fec4619db5aa0dce5133b0\"><div class=\"ttname\"><a href=\"a00164.html#ga0b570da473fec4619db5aa0dce5133b0\">glm::packed_highp_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, packed_highp &gt; packed_highp_uvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00291\">gtc/type_aligned.hpp:291</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga70130dc8ed9c966ec2a221ce586d45d8\"><div class=\"ttname\"><a href=\"a00164.html#ga70130dc8ed9c966ec2a221ce586d45d8\">glm::packed_mediump_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, packed_mediump &gt; packed_mediump_ivec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00377\">gtc/type_aligned.hpp:377</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga09507ef020a49517a7bcd50438f05056\"><div class=\"ttname\"><a href=\"a00164.html#ga09507ef020a49517a7bcd50438f05056\">glm::packed_mediump_ivec1</a></div><div class=\"ttdeci\">vec&lt; 1, int, packed_mediump &gt; packed_mediump_ivec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00101\">gtc/type_aligned.hpp:101</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga026a55ddbf2bafb1432f1157a2708616\"><div class=\"ttname\"><a href=\"a00164.html#ga026a55ddbf2bafb1432f1157a2708616\">glm::aligned_mediump_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, aligned_mediump &gt; aligned_mediump_vec2</div><div class=\"ttdoc\">2 components vector aligned in memory of single-precision floating-point numbers using medium precisi...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00130\">gtc/type_aligned.hpp:130</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga76298aed82a439063c3d55980c84aa0b\"><div class=\"ttname\"><a href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">glm::aligned_ivec1</a></div><div class=\"ttdeci\">aligned_highp_ivec1 aligned_ivec1</div><div class=\"ttdoc\">1 component vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00502\">gtc/type_aligned.hpp:502</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga576a3f8372197a56a79dee1c8280f485\"><div class=\"ttname\"><a href=\"a00164.html#ga576a3f8372197a56a79dee1c8280f485\">glm::packed_lowp_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, packed_lowp &gt; packed_lowp_uvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00297\">gtc/type_aligned.hpp:297</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0913bdf048d0cb74af1d2512aec675bc\"><div class=\"ttname\"><a href=\"a00164.html#ga0913bdf048d0cb74af1d2512aec675bc\">glm::aligned_highp_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, aligned_highp &gt; aligned_highp_bvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00255\">gtc/type_aligned.hpp:255</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga18d859f87122b2b3b2992ffe86dbebc0\"><div class=\"ttname\"><a href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">glm::aligned_dvec2</a></div><div class=\"ttdeci\">aligned_highp_dvec2 aligned_dvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of double-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00469\">gtc/type_aligned.hpp:469</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga074137e3be58528d67041c223d49f398\"><div class=\"ttname\"><a href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">glm::aligned_uvec2</a></div><div class=\"ttdeci\">aligned_highp_uvec2 aligned_uvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00544\">gtc/type_aligned.hpp:544</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga5c194b11fbda636f2ab20c3bd0079196\"><div class=\"ttname\"><a href=\"a00164.html#ga5c194b11fbda636f2ab20c3bd0079196\">glm::packed_dvec2</a></div><div class=\"ttdeci\">packed_highp_dvec2 packed_dvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of double-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00481\">gtc/type_aligned.hpp:481</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga88632cea9008ac0ac1388e94e804a53c\"><div class=\"ttname\"><a href=\"a00164.html#ga88632cea9008ac0ac1388e94e804a53c\">glm::packed_bvec1</a></div><div class=\"ttdeci\">packed_highp_bvec1 packed_bvec1</div><div class=\"ttdoc\">1 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00589\">gtc/type_aligned.hpp:589</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga1101d3a82b2e3f5f8828bd8f3adab3e1\"><div class=\"ttname\"><a href=\"a00164.html#ga1101d3a82b2e3f5f8828bd8f3adab3e1\">glm::aligned_lowp_ivec1</a></div><div class=\"ttdeci\">vec&lt; 1, int, aligned_lowp &gt; aligned_lowp_ivec1</div><div class=\"ttdoc\">1 component vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00059\">gtc/type_aligned.hpp:59</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga5b2dc48fa19b684d207d69c6b145eb63\"><div class=\"ttname\"><a href=\"a00164.html#ga5b2dc48fa19b684d207d69c6b145eb63\">glm::packed_highp_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, packed_highp &gt; packed_highp_dvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of double-precision floating-point numbers using high pr...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00181\">gtc/type_aligned.hpp:181</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga91bc1f513bb9b0fd60281d57ded9a48c\"><div class=\"ttname\"><a href=\"a00164.html#ga91bc1f513bb9b0fd60281d57ded9a48c\">glm::aligned_mediump_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, aligned_mediump &gt; aligned_mediump_bvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00350\">gtc/type_aligned.hpp:350</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gacfa4a542f1b20a5b63ad702dfb6fd587\"><div class=\"ttname\"><a href=\"a00164.html#gacfa4a542f1b20a5b63ad702dfb6fd587\">glm::aligned_mediump_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, aligned_mediump &gt; aligned_mediump_bvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00258\">gtc/type_aligned.hpp:258</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga09f517d88b996ef1b2f42fd54222b82d\"><div class=\"ttname\"><a href=\"a00164.html#ga09f517d88b996ef1b2f42fd54222b82d\">glm::packed_highp_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, packed_highp &gt; packed_highp_bvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00392\">gtc/type_aligned.hpp:392</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga68c9bb24f387b312bae6a0a68e74d95e\"><div class=\"ttname\"><a href=\"a00164.html#ga68c9bb24f387b312bae6a0a68e74d95e\">glm::packed_mediump_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, packed_mediump &gt; packed_mediump_vec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of single-precision floating-point numbers using medium ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00359\">gtc/type_aligned.hpp:359</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga6f94fcd28dde906fc6cad5f742b55c1a\"><div class=\"ttname\"><a href=\"a00164.html#ga6f94fcd28dde906fc6cad5f742b55c1a\">glm::aligned_lowp_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, aligned_lowp &gt; aligned_lowp_uvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00160\">gtc/type_aligned.hpp:160</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gac228b70372abd561340d5f926a7c1778\"><div class=\"ttname\"><a href=\"a00164.html#gac228b70372abd561340d5f926a7c1778\">glm::packed_ivec4</a></div><div class=\"ttdeci\">packed_highp_ivec4 packed_ivec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00523\">gtc/type_aligned.hpp:523</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga52635859f5ef660ab999d22c11b7867f\"><div class=\"ttname\"><a href=\"a00164.html#ga52635859f5ef660ab999d22c11b7867f\">glm::packed_lowp_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, packed_lowp &gt; packed_lowp_ivec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00196\">gtc/type_aligned.hpp:196</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaa1f95690a78dc12e39da32943243aeef\"><div class=\"ttname\"><a href=\"a00164.html#gaa1f95690a78dc12e39da32943243aeef\">glm::packed_mediump_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, packed_mediump &gt; packed_mediump_uvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00202\">gtc/type_aligned.hpp:202</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaa7a76555ee4853614e5755181a8dd54e\"><div class=\"ttname\"><a href=\"a00164.html#gaa7a76555ee4853614e5755181a8dd54e\">glm::aligned_lowp_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, aligned_lowp &gt; aligned_lowp_bvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of bool values. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00353\">gtc/type_aligned.hpp:353</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga53ac5d252317f1fa43c2ef921857bf13\"><div class=\"ttname\"><a href=\"a00164.html#ga53ac5d252317f1fa43c2ef921857bf13\">glm::aligned_lowp_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, aligned_lowp &gt; aligned_lowp_vec2</div><div class=\"ttdoc\">2 components vector aligned in memory of single-precision floating-point numbers using low precision ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00133\">gtc/type_aligned.hpp:133</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga6099dd7878d0a78101a4250d8cd2d736\"><div class=\"ttname\"><a href=\"a00164.html#ga6099dd7878d0a78101a4250d8cd2d736\">glm::aligned_mediump_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, aligned_mediump &gt; aligned_mediump_ivec4</div><div class=\"ttdoc\">4 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00332\">gtc/type_aligned.hpp:332</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga8c32b53f628a3616aa5061e58d66fe74\"><div class=\"ttname\"><a href=\"a00164.html#ga8c32b53f628a3616aa5061e58d66fe74\">glm::packed_highp_uvec1</a></div><div class=\"ttdeci\">vec&lt; 1, uint, packed_highp &gt; packed_highp_uvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00107\">gtc/type_aligned.hpp:107</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gad6f1b4e3a51c2c051814b60d5d1b8895\"><div class=\"ttname\"><a href=\"a00164.html#gad6f1b4e3a51c2c051814b60d5d1b8895\">glm::packed_highp_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, packed_highp &gt; packed_highp_ivec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00374\">gtc/type_aligned.hpp:374</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga5621493caac01bdd22ab6be4416b0314\"><div class=\"ttname\"><a href=\"a00164.html#ga5621493caac01bdd22ab6be4416b0314\">glm::packed_uvec1</a></div><div class=\"ttdeci\">packed_highp_uvec1 packed_uvec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00553\">gtc/type_aligned.hpp:553</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gac9f8482dde741fb6bab7248b81a45465\"><div class=\"ttname\"><a href=\"a00164.html#gac9f8482dde741fb6bab7248b81a45465\">glm::aligned_highp_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, aligned_highp &gt; aligned_highp_vec2</div><div class=\"ttdoc\">2 components vector aligned in memory of single-precision floating-point numbers using high precision...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00127\">gtc/type_aligned.hpp:127</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga931731b8ae3b54c7ecc221509dae96bc\"><div class=\"ttname\"><a href=\"a00164.html#ga931731b8ae3b54c7ecc221509dae96bc\">glm::packed_lowp_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, packed_lowp &gt; packed_lowp_ivec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00380\">gtc/type_aligned.hpp:380</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gafbf1c2cce307c5594b165819ed83bf5d\"><div class=\"ttname\"><a href=\"a00164.html#gafbf1c2cce307c5594b165819ed83bf5d\">glm::packed_lowp_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, packed_lowp &gt; packed_lowp_vec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of single-precision floating-point numbers using low pre...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00178\">gtc/type_aligned.hpp:178</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga8fad35c5677f228e261fe541f15363a4\"><div class=\"ttname\"><a href=\"a00164.html#ga8fad35c5677f228e261fe541f15363a4\">glm::aligned_highp_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, aligned_highp &gt; aligned_highp_dvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of double-precision floating-point numbers using high precision...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00320\">gtc/type_aligned.hpp:320</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga1fe4c5f56b8087d773aa90dc88a257a7\"><div class=\"ttname\"><a href=\"a00164.html#ga1fe4c5f56b8087d773aa90dc88a257a7\">glm::packed_ivec2</a></div><div class=\"ttdeci\">packed_highp_ivec2 packed_ivec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00517\">gtc/type_aligned.hpp:517</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga1f18ada6f7cdd8c46db33ba987280fc4\"><div class=\"ttname\"><a href=\"a00164.html#ga1f18ada6f7cdd8c46db33ba987280fc4\">glm::packed_mediump_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, packed_mediump &gt; packed_mediump_dvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of double-precision floating-point numbers using medium ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00276\">gtc/type_aligned.hpp:276</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga11581a06fc7bf941fa4d4b6aca29812c\"><div class=\"ttname\"><a href=\"a00164.html#ga11581a06fc7bf941fa4d4b6aca29812c\">glm::packed_ivec1</a></div><div class=\"ttdeci\">packed_highp_ivec1 packed_ivec1</div><div class=\"ttdoc\">1 component vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00514\">gtc/type_aligned.hpp:514</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0c754a783b6fcf80374c013371c4dae9\"><div class=\"ttname\"><a href=\"a00164.html#ga0c754a783b6fcf80374c013371c4dae9\">glm::packed_mediump_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, packed_mediump &gt; packed_mediump_dvec2</div><div class=\"ttdoc\">2 components vector tightly packed in memory of double-precision floating-point numbers using medium ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00184\">gtc/type_aligned.hpp:184</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7cb26d354dd69d23849c34c4fba88da9\"><div class=\"ttname\"><a href=\"a00164.html#ga7cb26d354dd69d23849c34c4fba88da9\">glm::aligned_highp_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, aligned_highp &gt; aligned_highp_vec4</div><div class=\"ttdoc\">4 components vector aligned in memory of single-precision floating-point numbers using high precision...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00311\">gtc/type_aligned.hpp:311</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga6b797eec76fa471e300158f3453b3b2e\"><div class=\"ttname\"><a href=\"a00164.html#ga6b797eec76fa471e300158f3453b3b2e\">glm::aligned_mediump_vec1</a></div><div class=\"ttdeci\">vec&lt; 1, float, aligned_mediump &gt; aligned_mediump_vec1</div><div class=\"ttdoc\">1 component vector aligned in memory of single-precision floating-point numbers using medium precisio...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00038\">gtc/type_aligned.hpp:38</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gad63b8c5b4dc0500d54d7414ef555178f\"><div class=\"ttname\"><a href=\"a00164.html#gad63b8c5b4dc0500d54d7414ef555178f\">glm::aligned_highp_ivec1</a></div><div class=\"ttdeci\">vec&lt; 1, int, aligned_highp &gt; aligned_highp_ivec1</div><div class=\"ttdoc\">1 component vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00053\">gtc/type_aligned.hpp:53</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga3a25e494173f6a64637b08a1b50a2132\"><div class=\"ttname\"><a href=\"a00164.html#ga3a25e494173f6a64637b08a1b50a2132\">glm::aligned_mediump_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, aligned_mediump &gt; aligned_mediump_vec3</div><div class=\"ttdoc\">3 components vector aligned in memory of single-precision floating-point numbers using medium precisi...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00222\">gtc/type_aligned.hpp:222</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gabbf0f15e9c3d9868e43241ad018f82bd\"><div class=\"ttname\"><a href=\"a00164.html#gabbf0f15e9c3d9868e43241ad018f82bd\">glm::aligned_mediump_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, aligned_mediump &gt; aligned_mediump_ivec3</div><div class=\"ttdoc\">3 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00240\">gtc/type_aligned.hpp:240</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae8a9b181f9dc813ad6e125a52b14b935\"><div class=\"ttname\"><a href=\"a00164.html#gae8a9b181f9dc813ad6e125a52b14b935\">glm::packed_dvec4</a></div><div class=\"ttdeci\">packed_highp_dvec4 packed_dvec4</div><div class=\"ttdoc\">4 components vector tightly packed in memory of double-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00487\">gtc/type_aligned.hpp:487</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga1ea2bbdbcb0a69242f6d884663c1b0ab\"><div class=\"ttname\"><a href=\"a00164.html#ga1ea2bbdbcb0a69242f6d884663c1b0ab\">glm::packed_mediump_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, packed_mediump &gt; packed_mediump_uvec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00294\">gtc/type_aligned.hpp:294</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga9e9f006970b1a00862e3e6e599eedd4c\"><div class=\"ttname\"><a href=\"a00164.html#ga9e9f006970b1a00862e3e6e599eedd4c\">glm::aligned_lowp_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, aligned_lowp &gt; aligned_lowp_uvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00252\">gtc/type_aligned.hpp:252</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae157682a7847161787951ba1db4cf325\"><div class=\"ttname\"><a href=\"a00164.html#gae157682a7847161787951ba1db4cf325\">glm::packed_ivec3</a></div><div class=\"ttdeci\">packed_highp_ivec3 packed_ivec3</div><div class=\"ttdoc\">3 components vector tightly packed in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00520\">gtc/type_aligned.hpp:520</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gab9e669c4efd52d3347fc6d5f6b20fd59\"><div class=\"ttname\"><a href=\"a00164.html#gab9e669c4efd52d3347fc6d5f6b20fd59\">glm::aligned_lowp_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, aligned_lowp &gt; aligned_lowp_dvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of double-precision floating-point numbers using low precision ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00234\">gtc/type_aligned.hpp:234</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00102.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_aligned.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/type_aligned.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00223.html\">GLM_GTX_type_aligned</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00102_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gab5cd5c5fad228b25c782084f1cc30114\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab5cd5c5fad228b25c782084f1cc30114\">GLM_ALIGNED_TYPEDEF</a> (lowp_int8, aligned_lowp_int8, 1)</td></tr>\n<tr class=\"memdesc:gab5cd5c5fad228b25c782084f1cc30114\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gab5cd5c5fad228b25c782084f1cc30114\">More...</a><br /></td></tr>\n<tr class=\"separator:gab5cd5c5fad228b25c782084f1cc30114\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5bb5dd895ef625c1b113f2cf400186b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5bb5dd895ef625c1b113f2cf400186b0\">GLM_ALIGNED_TYPEDEF</a> (lowp_int16, aligned_lowp_int16, 2)</td></tr>\n<tr class=\"memdesc:ga5bb5dd895ef625c1b113f2cf400186b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga5bb5dd895ef625c1b113f2cf400186b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5bb5dd895ef625c1b113f2cf400186b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac6efa54cf7c6c86f7158922abdb1a430\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac6efa54cf7c6c86f7158922abdb1a430\">GLM_ALIGNED_TYPEDEF</a> (lowp_int32, aligned_lowp_int32, 4)</td></tr>\n<tr class=\"memdesc:gac6efa54cf7c6c86f7158922abdb1a430\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gac6efa54cf7c6c86f7158922abdb1a430\">More...</a><br /></td></tr>\n<tr class=\"separator:gac6efa54cf7c6c86f7158922abdb1a430\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6612eb77c8607048e7552279a11eeb5f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6612eb77c8607048e7552279a11eeb5f\">GLM_ALIGNED_TYPEDEF</a> (lowp_int64, aligned_lowp_int64, 8)</td></tr>\n<tr class=\"memdesc:ga6612eb77c8607048e7552279a11eeb5f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga6612eb77c8607048e7552279a11eeb5f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6612eb77c8607048e7552279a11eeb5f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ddc1848ff2223026db8968ce0c97497\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7ddc1848ff2223026db8968ce0c97497\">GLM_ALIGNED_TYPEDEF</a> (lowp_int8_t, aligned_lowp_int8_t, 1)</td></tr>\n<tr class=\"memdesc:ga7ddc1848ff2223026db8968ce0c97497\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga7ddc1848ff2223026db8968ce0c97497\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ddc1848ff2223026db8968ce0c97497\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga22240dd9458b0f8c11fbcc4f48714f68\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga22240dd9458b0f8c11fbcc4f48714f68\">GLM_ALIGNED_TYPEDEF</a> (lowp_int16_t, aligned_lowp_int16_t, 2)</td></tr>\n<tr class=\"memdesc:ga22240dd9458b0f8c11fbcc4f48714f68\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga22240dd9458b0f8c11fbcc4f48714f68\">More...</a><br /></td></tr>\n<tr class=\"separator:ga22240dd9458b0f8c11fbcc4f48714f68\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8130ea381d76a2cc34a93ccbb6cf487d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8130ea381d76a2cc34a93ccbb6cf487d\">GLM_ALIGNED_TYPEDEF</a> (lowp_int32_t, aligned_lowp_int32_t, 4)</td></tr>\n<tr class=\"memdesc:ga8130ea381d76a2cc34a93ccbb6cf487d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga8130ea381d76a2cc34a93ccbb6cf487d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8130ea381d76a2cc34a93ccbb6cf487d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ccb60f3215d293fd62b33b31ed0e7be\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7ccb60f3215d293fd62b33b31ed0e7be\">GLM_ALIGNED_TYPEDEF</a> (lowp_int64_t, aligned_lowp_int64_t, 8)</td></tr>\n<tr class=\"memdesc:ga7ccb60f3215d293fd62b33b31ed0e7be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga7ccb60f3215d293fd62b33b31ed0e7be\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ccb60f3215d293fd62b33b31ed0e7be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac20d508d2ef5cc95ad3daf083c57ec2a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac20d508d2ef5cc95ad3daf083c57ec2a\">GLM_ALIGNED_TYPEDEF</a> (lowp_i8, aligned_lowp_i8, 1)</td></tr>\n<tr class=\"memdesc:gac20d508d2ef5cc95ad3daf083c57ec2a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gac20d508d2ef5cc95ad3daf083c57ec2a\">More...</a><br /></td></tr>\n<tr class=\"separator:gac20d508d2ef5cc95ad3daf083c57ec2a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga50257b48069a31d0c8d9c1f644d267de\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga50257b48069a31d0c8d9c1f644d267de\">GLM_ALIGNED_TYPEDEF</a> (lowp_i16, aligned_lowp_i16, 2)</td></tr>\n<tr class=\"memdesc:ga50257b48069a31d0c8d9c1f644d267de\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga50257b48069a31d0c8d9c1f644d267de\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50257b48069a31d0c8d9c1f644d267de\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa07e98e67b7a3435c0746018c7a2a839\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa07e98e67b7a3435c0746018c7a2a839\">GLM_ALIGNED_TYPEDEF</a> (lowp_i32, aligned_lowp_i32, 4)</td></tr>\n<tr class=\"memdesc:gaa07e98e67b7a3435c0746018c7a2a839\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gaa07e98e67b7a3435c0746018c7a2a839\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa07e98e67b7a3435c0746018c7a2a839\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga62601fc6f8ca298b77285bedf03faffd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga62601fc6f8ca298b77285bedf03faffd\">GLM_ALIGNED_TYPEDEF</a> (lowp_i64, aligned_lowp_i64, 8)</td></tr>\n<tr class=\"memdesc:ga62601fc6f8ca298b77285bedf03faffd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga62601fc6f8ca298b77285bedf03faffd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga62601fc6f8ca298b77285bedf03faffd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac8cff825951aeb54dd846037113c72db\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac8cff825951aeb54dd846037113c72db\">GLM_ALIGNED_TYPEDEF</a> (mediump_int8, aligned_mediump_int8, 1)</td></tr>\n<tr class=\"memdesc:gac8cff825951aeb54dd846037113c72db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gac8cff825951aeb54dd846037113c72db\">More...</a><br /></td></tr>\n<tr class=\"separator:gac8cff825951aeb54dd846037113c72db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78f443d88f438575a62b5df497cdf66b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga78f443d88f438575a62b5df497cdf66b\">GLM_ALIGNED_TYPEDEF</a> (mediump_int16, aligned_mediump_int16, 2)</td></tr>\n<tr class=\"memdesc:ga78f443d88f438575a62b5df497cdf66b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga78f443d88f438575a62b5df497cdf66b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78f443d88f438575a62b5df497cdf66b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0680cd3b5d4e8006985fb41a4f9b57af\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0680cd3b5d4e8006985fb41a4f9b57af\">GLM_ALIGNED_TYPEDEF</a> (mediump_int32, aligned_mediump_int32, 4)</td></tr>\n<tr class=\"memdesc:ga0680cd3b5d4e8006985fb41a4f9b57af\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga0680cd3b5d4e8006985fb41a4f9b57af\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0680cd3b5d4e8006985fb41a4f9b57af\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad9e5babb1dd3e3531b42c37bf25dd951\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad9e5babb1dd3e3531b42c37bf25dd951\">GLM_ALIGNED_TYPEDEF</a> (mediump_int64, aligned_mediump_int64, 8)</td></tr>\n<tr class=\"memdesc:gad9e5babb1dd3e3531b42c37bf25dd951\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#gad9e5babb1dd3e3531b42c37bf25dd951\">More...</a><br /></td></tr>\n<tr class=\"separator:gad9e5babb1dd3e3531b42c37bf25dd951\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga353fd9fa8a9ad952fcabd0d53ad9a6dd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga353fd9fa8a9ad952fcabd0d53ad9a6dd\">GLM_ALIGNED_TYPEDEF</a> (mediump_int8_t, aligned_mediump_int8_t, 1)</td></tr>\n<tr class=\"memdesc:ga353fd9fa8a9ad952fcabd0d53ad9a6dd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga353fd9fa8a9ad952fcabd0d53ad9a6dd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga353fd9fa8a9ad952fcabd0d53ad9a6dd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2196442c0e5c5e8c77842de388c42521\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2196442c0e5c5e8c77842de388c42521\">GLM_ALIGNED_TYPEDEF</a> (mediump_int16_t, aligned_mediump_int16_t, 2)</td></tr>\n<tr class=\"memdesc:ga2196442c0e5c5e8c77842de388c42521\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga2196442c0e5c5e8c77842de388c42521\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2196442c0e5c5e8c77842de388c42521\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1284488189daf897cf095c5eefad9744\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1284488189daf897cf095c5eefad9744\">GLM_ALIGNED_TYPEDEF</a> (mediump_int32_t, aligned_mediump_int32_t, 4)</td></tr>\n<tr class=\"memdesc:ga1284488189daf897cf095c5eefad9744\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga1284488189daf897cf095c5eefad9744\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1284488189daf897cf095c5eefad9744\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73fdc86a539808af58808b7c60a1c4d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga73fdc86a539808af58808b7c60a1c4d8\">GLM_ALIGNED_TYPEDEF</a> (mediump_int64_t, aligned_mediump_int64_t, 8)</td></tr>\n<tr class=\"memdesc:ga73fdc86a539808af58808b7c60a1c4d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga73fdc86a539808af58808b7c60a1c4d8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73fdc86a539808af58808b7c60a1c4d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafafeea923e1983262c972e2b83922d3b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafafeea923e1983262c972e2b83922d3b\">GLM_ALIGNED_TYPEDEF</a> (mediump_i8, aligned_mediump_i8, 1)</td></tr>\n<tr class=\"memdesc:gafafeea923e1983262c972e2b83922d3b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gafafeea923e1983262c972e2b83922d3b\">More...</a><br /></td></tr>\n<tr class=\"separator:gafafeea923e1983262c972e2b83922d3b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\">GLM_ALIGNED_TYPEDEF</a> (mediump_i16, aligned_mediump_i16, 2)</td></tr>\n<tr class=\"memdesc:ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga63b882e29170d428463d99c3d630acc6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga63b882e29170d428463d99c3d630acc6\">GLM_ALIGNED_TYPEDEF</a> (mediump_i32, aligned_mediump_i32, 4)</td></tr>\n<tr class=\"memdesc:ga63b882e29170d428463d99c3d630acc6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga63b882e29170d428463d99c3d630acc6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga63b882e29170d428463d99c3d630acc6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b20507bb048c1edea2d441cc953e6f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8b20507bb048c1edea2d441cc953e6f0\">GLM_ALIGNED_TYPEDEF</a> (mediump_i64, aligned_mediump_i64, 8)</td></tr>\n<tr class=\"memdesc:ga8b20507bb048c1edea2d441cc953e6f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga8b20507bb048c1edea2d441cc953e6f0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b20507bb048c1edea2d441cc953e6f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga56c5ca60813027b603c7b61425a0479d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga56c5ca60813027b603c7b61425a0479d\">GLM_ALIGNED_TYPEDEF</a> (highp_int8, aligned_highp_int8, 1)</td></tr>\n<tr class=\"memdesc:ga56c5ca60813027b603c7b61425a0479d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga56c5ca60813027b603c7b61425a0479d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga56c5ca60813027b603c7b61425a0479d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a751b3aff24c0259f4a7357c2969089\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7a751b3aff24c0259f4a7357c2969089\">GLM_ALIGNED_TYPEDEF</a> (highp_int16, aligned_highp_int16, 2)</td></tr>\n<tr class=\"memdesc:ga7a751b3aff24c0259f4a7357c2969089\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga7a751b3aff24c0259f4a7357c2969089\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a751b3aff24c0259f4a7357c2969089\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70cd2144351c556469ee6119e59971fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga70cd2144351c556469ee6119e59971fc\">GLM_ALIGNED_TYPEDEF</a> (highp_int32, aligned_highp_int32, 4)</td></tr>\n<tr class=\"memdesc:ga70cd2144351c556469ee6119e59971fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga70cd2144351c556469ee6119e59971fc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga70cd2144351c556469ee6119e59971fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga46bbf08dc004d8c433041e0b5018a5d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga46bbf08dc004d8c433041e0b5018a5d3\">GLM_ALIGNED_TYPEDEF</a> (highp_int64, aligned_highp_int64, 8)</td></tr>\n<tr class=\"memdesc:ga46bbf08dc004d8c433041e0b5018a5d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga46bbf08dc004d8c433041e0b5018a5d3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga46bbf08dc004d8c433041e0b5018a5d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab3e10c77a20d1abad2de1c561c7a5c18\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab3e10c77a20d1abad2de1c561c7a5c18\">GLM_ALIGNED_TYPEDEF</a> (highp_int8_t, aligned_highp_int8_t, 1)</td></tr>\n<tr class=\"memdesc:gab3e10c77a20d1abad2de1c561c7a5c18\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gab3e10c77a20d1abad2de1c561c7a5c18\">More...</a><br /></td></tr>\n<tr class=\"separator:gab3e10c77a20d1abad2de1c561c7a5c18\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga968f30319ebeaca9ebcd3a25a8e139fb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga968f30319ebeaca9ebcd3a25a8e139fb\">GLM_ALIGNED_TYPEDEF</a> (highp_int16_t, aligned_highp_int16_t, 2)</td></tr>\n<tr class=\"memdesc:ga968f30319ebeaca9ebcd3a25a8e139fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga968f30319ebeaca9ebcd3a25a8e139fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga968f30319ebeaca9ebcd3a25a8e139fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaae773c28e6390c6aa76f5b678b7098a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaae773c28e6390c6aa76f5b678b7098a3\">GLM_ALIGNED_TYPEDEF</a> (highp_int32_t, aligned_highp_int32_t, 4)</td></tr>\n<tr class=\"memdesc:gaae773c28e6390c6aa76f5b678b7098a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gaae773c28e6390c6aa76f5b678b7098a3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaae773c28e6390c6aa76f5b678b7098a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga790cfff1ca39d0ed696ffed980809311\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga790cfff1ca39d0ed696ffed980809311\">GLM_ALIGNED_TYPEDEF</a> (highp_int64_t, aligned_highp_int64_t, 8)</td></tr>\n<tr class=\"memdesc:ga790cfff1ca39d0ed696ffed980809311\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga790cfff1ca39d0ed696ffed980809311\">More...</a><br /></td></tr>\n<tr class=\"separator:ga790cfff1ca39d0ed696ffed980809311\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8265b91eb23c120a9b0c3e381bc37b96\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8265b91eb23c120a9b0c3e381bc37b96\">GLM_ALIGNED_TYPEDEF</a> (highp_i8, aligned_highp_i8, 1)</td></tr>\n<tr class=\"memdesc:ga8265b91eb23c120a9b0c3e381bc37b96\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga8265b91eb23c120a9b0c3e381bc37b96\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8265b91eb23c120a9b0c3e381bc37b96\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae6d384de17588d8edb894fbe06e0d410\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gae6d384de17588d8edb894fbe06e0d410\">GLM_ALIGNED_TYPEDEF</a> (highp_i16, aligned_highp_i16, 2)</td></tr>\n<tr class=\"memdesc:gae6d384de17588d8edb894fbe06e0d410\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#gae6d384de17588d8edb894fbe06e0d410\">More...</a><br /></td></tr>\n<tr class=\"separator:gae6d384de17588d8edb894fbe06e0d410\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9c8172b745ee03fc5b2b91c350c2922f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9c8172b745ee03fc5b2b91c350c2922f\">GLM_ALIGNED_TYPEDEF</a> (highp_i32, aligned_highp_i32, 4)</td></tr>\n<tr class=\"memdesc:ga9c8172b745ee03fc5b2b91c350c2922f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga9c8172b745ee03fc5b2b91c350c2922f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9c8172b745ee03fc5b2b91c350c2922f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga77e0dff12aa4020ddc3f8cabbea7b2e6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga77e0dff12aa4020ddc3f8cabbea7b2e6\">GLM_ALIGNED_TYPEDEF</a> (highp_i64, aligned_highp_i64, 8)</td></tr>\n<tr class=\"memdesc:ga77e0dff12aa4020ddc3f8cabbea7b2e6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga77e0dff12aa4020ddc3f8cabbea7b2e6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga77e0dff12aa4020ddc3f8cabbea7b2e6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabd82b9faa9d4d618dbbe0fc8a1efee63\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabd82b9faa9d4d618dbbe0fc8a1efee63\">GLM_ALIGNED_TYPEDEF</a> (int8, aligned_int8, 1)</td></tr>\n<tr class=\"memdesc:gabd82b9faa9d4d618dbbe0fc8a1efee63\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gabd82b9faa9d4d618dbbe0fc8a1efee63\">More...</a><br /></td></tr>\n<tr class=\"separator:gabd82b9faa9d4d618dbbe0fc8a1efee63\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga285649744560be21000cfd81bbb5d507\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga285649744560be21000cfd81bbb5d507\">GLM_ALIGNED_TYPEDEF</a> (int16, aligned_int16, 2)</td></tr>\n<tr class=\"memdesc:ga285649744560be21000cfd81bbb5d507\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga285649744560be21000cfd81bbb5d507\">More...</a><br /></td></tr>\n<tr class=\"separator:ga285649744560be21000cfd81bbb5d507\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga07732da630b2deda428ce95c0ecaf3ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga07732da630b2deda428ce95c0ecaf3ff\">GLM_ALIGNED_TYPEDEF</a> (int32, aligned_int32, 4)</td></tr>\n<tr class=\"memdesc:ga07732da630b2deda428ce95c0ecaf3ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga07732da630b2deda428ce95c0ecaf3ff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga07732da630b2deda428ce95c0ecaf3ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1a8da2a8c51f69c07a2e7f473aa420f4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1a8da2a8c51f69c07a2e7f473aa420f4\">GLM_ALIGNED_TYPEDEF</a> (int64, aligned_int64, 8)</td></tr>\n<tr class=\"memdesc:ga1a8da2a8c51f69c07a2e7f473aa420f4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga1a8da2a8c51f69c07a2e7f473aa420f4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a8da2a8c51f69c07a2e7f473aa420f4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga848aedf13e2d9738acf0bb482c590174\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga848aedf13e2d9738acf0bb482c590174\">GLM_ALIGNED_TYPEDEF</a> (int8_t, aligned_int8_t, 1)</td></tr>\n<tr class=\"memdesc:ga848aedf13e2d9738acf0bb482c590174\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga848aedf13e2d9738acf0bb482c590174\">More...</a><br /></td></tr>\n<tr class=\"separator:ga848aedf13e2d9738acf0bb482c590174\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafd2803d39049dd45a37a63931e25d943\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafd2803d39049dd45a37a63931e25d943\">GLM_ALIGNED_TYPEDEF</a> (int16_t, aligned_int16_t, 2)</td></tr>\n<tr class=\"memdesc:gafd2803d39049dd45a37a63931e25d943\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#gafd2803d39049dd45a37a63931e25d943\">More...</a><br /></td></tr>\n<tr class=\"separator:gafd2803d39049dd45a37a63931e25d943\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae553b33349d6da832cf0724f1e024094\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gae553b33349d6da832cf0724f1e024094\">GLM_ALIGNED_TYPEDEF</a> (int32_t, aligned_int32_t, 4)</td></tr>\n<tr class=\"memdesc:gae553b33349d6da832cf0724f1e024094\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gae553b33349d6da832cf0724f1e024094\">More...</a><br /></td></tr>\n<tr class=\"separator:gae553b33349d6da832cf0724f1e024094\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16d223a2b3409e812e1d3bd87f0e9e5c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga16d223a2b3409e812e1d3bd87f0e9e5c\">GLM_ALIGNED_TYPEDEF</a> (int64_t, aligned_int64_t, 8)</td></tr>\n<tr class=\"memdesc:ga16d223a2b3409e812e1d3bd87f0e9e5c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga16d223a2b3409e812e1d3bd87f0e9e5c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16d223a2b3409e812e1d3bd87f0e9e5c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2de065d2ddfdb366bcd0febca79ae2ad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2de065d2ddfdb366bcd0febca79ae2ad\">GLM_ALIGNED_TYPEDEF</a> (i8, aligned_i8, 1)</td></tr>\n<tr class=\"memdesc:ga2de065d2ddfdb366bcd0febca79ae2ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga2de065d2ddfdb366bcd0febca79ae2ad\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2de065d2ddfdb366bcd0febca79ae2ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabd786bdc20a11c8cb05c92c8212e28d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabd786bdc20a11c8cb05c92c8212e28d3\">GLM_ALIGNED_TYPEDEF</a> (i16, aligned_i16, 2)</td></tr>\n<tr class=\"memdesc:gabd786bdc20a11c8cb05c92c8212e28d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#gabd786bdc20a11c8cb05c92c8212e28d3\">More...</a><br /></td></tr>\n<tr class=\"separator:gabd786bdc20a11c8cb05c92c8212e28d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad4aefe56691cdb640c72f0d46d3fb532\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad4aefe56691cdb640c72f0d46d3fb532\">GLM_ALIGNED_TYPEDEF</a> (i32, aligned_i32, 4)</td></tr>\n<tr class=\"memdesc:gad4aefe56691cdb640c72f0d46d3fb532\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gad4aefe56691cdb640c72f0d46d3fb532\">More...</a><br /></td></tr>\n<tr class=\"separator:gad4aefe56691cdb640c72f0d46d3fb532\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8fe9745f7de24a8394518152ff9fccdc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8fe9745f7de24a8394518152ff9fccdc\">GLM_ALIGNED_TYPEDEF</a> (i64, aligned_i64, 8)</td></tr>\n<tr class=\"memdesc:ga8fe9745f7de24a8394518152ff9fccdc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga8fe9745f7de24a8394518152ff9fccdc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8fe9745f7de24a8394518152ff9fccdc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaad735483450099f7f882d4e3a3569bd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaaad735483450099f7f882d4e3a3569bd\">GLM_ALIGNED_TYPEDEF</a> (ivec1, aligned_ivec1, 4)</td></tr>\n<tr class=\"memdesc:gaaad735483450099f7f882d4e3a3569bd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gaaad735483450099f7f882d4e3a3569bd\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaad735483450099f7f882d4e3a3569bd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7b6f823802edbd6edbaf70ea25bf068\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac7b6f823802edbd6edbaf70ea25bf068\">GLM_ALIGNED_TYPEDEF</a> (ivec2, aligned_ivec2, 8)</td></tr>\n<tr class=\"memdesc:gac7b6f823802edbd6edbaf70ea25bf068\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#gac7b6f823802edbd6edbaf70ea25bf068\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7b6f823802edbd6edbaf70ea25bf068\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e235bcd2b8029613f25b8d40a2d3ef7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga3e235bcd2b8029613f25b8d40a2d3ef7\">GLM_ALIGNED_TYPEDEF</a> (ivec3, aligned_ivec3, 16)</td></tr>\n<tr class=\"memdesc:ga3e235bcd2b8029613f25b8d40a2d3ef7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#ga3e235bcd2b8029613f25b8d40a2d3ef7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e235bcd2b8029613f25b8d40a2d3ef7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga50d8a9523968c77f8325b4c9bfbff41e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga50d8a9523968c77f8325b4c9bfbff41e\">GLM_ALIGNED_TYPEDEF</a> (ivec4, aligned_ivec4, 16)</td></tr>\n<tr class=\"memdesc:ga50d8a9523968c77f8325b4c9bfbff41e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#ga50d8a9523968c77f8325b4c9bfbff41e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50d8a9523968c77f8325b4c9bfbff41e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ec20fdfb729c702032da9378c79679f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9ec20fdfb729c702032da9378c79679f\">GLM_ALIGNED_TYPEDEF</a> (i8vec1, aligned_i8vec1, 1)</td></tr>\n<tr class=\"memdesc:ga9ec20fdfb729c702032da9378c79679f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga9ec20fdfb729c702032da9378c79679f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9ec20fdfb729c702032da9378c79679f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga25b3fe1d9e8d0a5e86c1949c1acd8131\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga25b3fe1d9e8d0a5e86c1949c1acd8131\">GLM_ALIGNED_TYPEDEF</a> (i8vec2, aligned_i8vec2, 2)</td></tr>\n<tr class=\"memdesc:ga25b3fe1d9e8d0a5e86c1949c1acd8131\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#ga25b3fe1d9e8d0a5e86c1949c1acd8131\">More...</a><br /></td></tr>\n<tr class=\"separator:ga25b3fe1d9e8d0a5e86c1949c1acd8131\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2958f907719d94d8109b562540c910e2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2958f907719d94d8109b562540c910e2\">GLM_ALIGNED_TYPEDEF</a> (i8vec3, aligned_i8vec3, 4)</td></tr>\n<tr class=\"memdesc:ga2958f907719d94d8109b562540c910e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#ga2958f907719d94d8109b562540c910e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2958f907719d94d8109b562540c910e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fe6fc032a978f1c845fac9aa0668714\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1fe6fc032a978f1c845fac9aa0668714\">GLM_ALIGNED_TYPEDEF</a> (i8vec4, aligned_i8vec4, 4)</td></tr>\n<tr class=\"memdesc:ga1fe6fc032a978f1c845fac9aa0668714\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#ga1fe6fc032a978f1c845fac9aa0668714\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1fe6fc032a978f1c845fac9aa0668714\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4161e7a496dc96972254143fe873e55\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa4161e7a496dc96972254143fe873e55\">GLM_ALIGNED_TYPEDEF</a> (i16vec1, aligned_i16vec1, 2)</td></tr>\n<tr class=\"memdesc:gaa4161e7a496dc96972254143fe873e55\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#gaa4161e7a496dc96972254143fe873e55\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa4161e7a496dc96972254143fe873e55\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9d7cb211ccda69b1c22ddeeb0f3e7aba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9d7cb211ccda69b1c22ddeeb0f3e7aba\">GLM_ALIGNED_TYPEDEF</a> (i16vec2, aligned_i16vec2, 4)</td></tr>\n<tr class=\"memdesc:ga9d7cb211ccda69b1c22ddeeb0f3e7aba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#ga9d7cb211ccda69b1c22ddeeb0f3e7aba\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9d7cb211ccda69b1c22ddeeb0f3e7aba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaee91dd2ab34423bcc11072ef6bd0f02\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaaee91dd2ab34423bcc11072ef6bd0f02\">GLM_ALIGNED_TYPEDEF</a> (i16vec3, aligned_i16vec3, 8)</td></tr>\n<tr class=\"memdesc:gaaee91dd2ab34423bcc11072ef6bd0f02\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#gaaee91dd2ab34423bcc11072ef6bd0f02\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaee91dd2ab34423bcc11072ef6bd0f02\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49f047ccaa8b31fad9f26c67bf9b3510\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga49f047ccaa8b31fad9f26c67bf9b3510\">GLM_ALIGNED_TYPEDEF</a> (i16vec4, aligned_i16vec4, 8)</td></tr>\n<tr class=\"memdesc:ga49f047ccaa8b31fad9f26c67bf9b3510\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#ga49f047ccaa8b31fad9f26c67bf9b3510\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49f047ccaa8b31fad9f26c67bf9b3510\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga904e9c2436bb099397c0823506a0771f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga904e9c2436bb099397c0823506a0771f\">GLM_ALIGNED_TYPEDEF</a> (i32vec1, aligned_i32vec1, 4)</td></tr>\n<tr class=\"memdesc:ga904e9c2436bb099397c0823506a0771f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga904e9c2436bb099397c0823506a0771f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga904e9c2436bb099397c0823506a0771f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf90651cf2f5e7ee2b11cfdc5a6749534\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf90651cf2f5e7ee2b11cfdc5a6749534\">GLM_ALIGNED_TYPEDEF</a> (i32vec2, aligned_i32vec2, 8)</td></tr>\n<tr class=\"memdesc:gaf90651cf2f5e7ee2b11cfdc5a6749534\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#gaf90651cf2f5e7ee2b11cfdc5a6749534\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf90651cf2f5e7ee2b11cfdc5a6749534\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7354a4ead8cb17868aec36b9c30d6010\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7354a4ead8cb17868aec36b9c30d6010\">GLM_ALIGNED_TYPEDEF</a> (i32vec3, aligned_i32vec3, 16)</td></tr>\n<tr class=\"memdesc:ga7354a4ead8cb17868aec36b9c30d6010\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#ga7354a4ead8cb17868aec36b9c30d6010\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7354a4ead8cb17868aec36b9c30d6010\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad2ecbdea18732163e2636e27b37981ee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad2ecbdea18732163e2636e27b37981ee\">GLM_ALIGNED_TYPEDEF</a> (i32vec4, aligned_i32vec4, 16)</td></tr>\n<tr class=\"memdesc:gad2ecbdea18732163e2636e27b37981ee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#gad2ecbdea18732163e2636e27b37981ee\">More...</a><br /></td></tr>\n<tr class=\"separator:gad2ecbdea18732163e2636e27b37981ee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga965b1c9aa1800e93d4abc2eb2b5afcbf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga965b1c9aa1800e93d4abc2eb2b5afcbf\">GLM_ALIGNED_TYPEDEF</a> (i64vec1, aligned_i64vec1, 8)</td></tr>\n<tr class=\"memdesc:ga965b1c9aa1800e93d4abc2eb2b5afcbf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga965b1c9aa1800e93d4abc2eb2b5afcbf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga965b1c9aa1800e93d4abc2eb2b5afcbf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f9e9c2ea2768675dff9bae5cde2d829\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1f9e9c2ea2768675dff9bae5cde2d829\">GLM_ALIGNED_TYPEDEF</a> (i64vec2, aligned_i64vec2, 16)</td></tr>\n<tr class=\"memdesc:ga1f9e9c2ea2768675dff9bae5cde2d829\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#ga1f9e9c2ea2768675dff9bae5cde2d829\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f9e9c2ea2768675dff9bae5cde2d829\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad77c317b7d942322cd5be4c8127b3187\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad77c317b7d942322cd5be4c8127b3187\">GLM_ALIGNED_TYPEDEF</a> (i64vec3, aligned_i64vec3, 32)</td></tr>\n<tr class=\"memdesc:gad77c317b7d942322cd5be4c8127b3187\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#gad77c317b7d942322cd5be4c8127b3187\">More...</a><br /></td></tr>\n<tr class=\"separator:gad77c317b7d942322cd5be4c8127b3187\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga716f8ea809bdb11b5b542d8b71aeb04f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga716f8ea809bdb11b5b542d8b71aeb04f\">GLM_ALIGNED_TYPEDEF</a> (i64vec4, aligned_i64vec4, 32)</td></tr>\n<tr class=\"memdesc:ga716f8ea809bdb11b5b542d8b71aeb04f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#ga716f8ea809bdb11b5b542d8b71aeb04f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga716f8ea809bdb11b5b542d8b71aeb04f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad46f8e9082d5878b1bc04f9c1471cdaa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad46f8e9082d5878b1bc04f9c1471cdaa\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint8, aligned_lowp_uint8, 1)</td></tr>\n<tr class=\"memdesc:gad46f8e9082d5878b1bc04f9c1471cdaa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gad46f8e9082d5878b1bc04f9c1471cdaa\">More...</a><br /></td></tr>\n<tr class=\"separator:gad46f8e9082d5878b1bc04f9c1471cdaa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1246094581af624aca6c7499aaabf801\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1246094581af624aca6c7499aaabf801\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint16, aligned_lowp_uint16, 2)</td></tr>\n<tr class=\"memdesc:ga1246094581af624aca6c7499aaabf801\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga1246094581af624aca6c7499aaabf801\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1246094581af624aca6c7499aaabf801\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a5009a1d0196bbf21dd7518f61f0249\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7a5009a1d0196bbf21dd7518f61f0249\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint32, aligned_lowp_uint32, 4)</td></tr>\n<tr class=\"memdesc:ga7a5009a1d0196bbf21dd7518f61f0249\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga7a5009a1d0196bbf21dd7518f61f0249\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a5009a1d0196bbf21dd7518f61f0249\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga45213fd18b3bb1df391671afefe4d1e7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga45213fd18b3bb1df391671afefe4d1e7\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint64, aligned_lowp_uint64, 8)</td></tr>\n<tr class=\"memdesc:ga45213fd18b3bb1df391671afefe4d1e7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga45213fd18b3bb1df391671afefe4d1e7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga45213fd18b3bb1df391671afefe4d1e7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0ba26b4e3fd9ecbc25358efd68d8a4ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0ba26b4e3fd9ecbc25358efd68d8a4ca\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint8_t, aligned_lowp_uint8_t, 1)</td></tr>\n<tr class=\"memdesc:ga0ba26b4e3fd9ecbc25358efd68d8a4ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga0ba26b4e3fd9ecbc25358efd68d8a4ca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0ba26b4e3fd9ecbc25358efd68d8a4ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2b58f5fb6d4ec8ce7b76221d3af43e1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf2b58f5fb6d4ec8ce7b76221d3af43e1\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint16_t, aligned_lowp_uint16_t, 2)</td></tr>\n<tr class=\"memdesc:gaf2b58f5fb6d4ec8ce7b76221d3af43e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaf2b58f5fb6d4ec8ce7b76221d3af43e1\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2b58f5fb6d4ec8ce7b76221d3af43e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadc246401847dcba155f0699425e49dcd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gadc246401847dcba155f0699425e49dcd\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint32_t, aligned_lowp_uint32_t, 4)</td></tr>\n<tr class=\"memdesc:gadc246401847dcba155f0699425e49dcd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gadc246401847dcba155f0699425e49dcd\">More...</a><br /></td></tr>\n<tr class=\"separator:gadc246401847dcba155f0699425e49dcd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaace64bddf51a9def01498da9a94fb01c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaace64bddf51a9def01498da9a94fb01c\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint64_t, aligned_lowp_uint64_t, 8)</td></tr>\n<tr class=\"memdesc:gaace64bddf51a9def01498da9a94fb01c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaace64bddf51a9def01498da9a94fb01c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaace64bddf51a9def01498da9a94fb01c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad7bb97c29d664bd86ffb1bed4abc5534\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad7bb97c29d664bd86ffb1bed4abc5534\">GLM_ALIGNED_TYPEDEF</a> (lowp_u8, aligned_lowp_u8, 1)</td></tr>\n<tr class=\"memdesc:gad7bb97c29d664bd86ffb1bed4abc5534\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gad7bb97c29d664bd86ffb1bed4abc5534\">More...</a><br /></td></tr>\n<tr class=\"separator:gad7bb97c29d664bd86ffb1bed4abc5534\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga404bba7785130e0b1384d695a9450b28\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga404bba7785130e0b1384d695a9450b28\">GLM_ALIGNED_TYPEDEF</a> (lowp_u16, aligned_lowp_u16, 2)</td></tr>\n<tr class=\"memdesc:ga404bba7785130e0b1384d695a9450b28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga404bba7785130e0b1384d695a9450b28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga404bba7785130e0b1384d695a9450b28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31ba41fd896257536958ec6080203d2a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga31ba41fd896257536958ec6080203d2a\">GLM_ALIGNED_TYPEDEF</a> (lowp_u32, aligned_lowp_u32, 4)</td></tr>\n<tr class=\"memdesc:ga31ba41fd896257536958ec6080203d2a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga31ba41fd896257536958ec6080203d2a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31ba41fd896257536958ec6080203d2a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacca5f13627f57b3505676e40a6e43e5e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gacca5f13627f57b3505676e40a6e43e5e\">GLM_ALIGNED_TYPEDEF</a> (lowp_u64, aligned_lowp_u64, 8)</td></tr>\n<tr class=\"memdesc:gacca5f13627f57b3505676e40a6e43e5e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gacca5f13627f57b3505676e40a6e43e5e\">More...</a><br /></td></tr>\n<tr class=\"separator:gacca5f13627f57b3505676e40a6e43e5e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5faf1d3e70bf33174dd7f3d01d5b883b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5faf1d3e70bf33174dd7f3d01d5b883b\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint8, aligned_mediump_uint8, 1)</td></tr>\n<tr class=\"memdesc:ga5faf1d3e70bf33174dd7f3d01d5b883b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga5faf1d3e70bf33174dd7f3d01d5b883b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5faf1d3e70bf33174dd7f3d01d5b883b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga727e2bf2c433bb3b0182605860a48363\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga727e2bf2c433bb3b0182605860a48363\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint16, aligned_mediump_uint16, 2)</td></tr>\n<tr class=\"memdesc:ga727e2bf2c433bb3b0182605860a48363\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga727e2bf2c433bb3b0182605860a48363\">More...</a><br /></td></tr>\n<tr class=\"separator:ga727e2bf2c433bb3b0182605860a48363\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12566ca66d5962dadb4a5eb4c74e891e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga12566ca66d5962dadb4a5eb4c74e891e\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint32, aligned_mediump_uint32, 4)</td></tr>\n<tr class=\"memdesc:ga12566ca66d5962dadb4a5eb4c74e891e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga12566ca66d5962dadb4a5eb4c74e891e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12566ca66d5962dadb4a5eb4c74e891e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b66a97a8acaa35c5a377b947318c6bc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7b66a97a8acaa35c5a377b947318c6bc\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint64, aligned_mediump_uint64, 8)</td></tr>\n<tr class=\"memdesc:ga7b66a97a8acaa35c5a377b947318c6bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga7b66a97a8acaa35c5a377b947318c6bc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7b66a97a8acaa35c5a377b947318c6bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9cde002439b74fa66120a16a9f55fcc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa9cde002439b74fa66120a16a9f55fcc\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint8_t, aligned_mediump_uint8_t, 1)</td></tr>\n<tr class=\"memdesc:gaa9cde002439b74fa66120a16a9f55fcc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaa9cde002439b74fa66120a16a9f55fcc\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9cde002439b74fa66120a16a9f55fcc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ca98c67f7d1e975f7c5202f1da1df1f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1ca98c67f7d1e975f7c5202f1da1df1f\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint16_t, aligned_mediump_uint16_t, 2)</td></tr>\n<tr class=\"memdesc:ga1ca98c67f7d1e975f7c5202f1da1df1f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga1ca98c67f7d1e975f7c5202f1da1df1f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1ca98c67f7d1e975f7c5202f1da1df1f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1dc8bc6199d785f235576948d80a597c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1dc8bc6199d785f235576948d80a597c\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint32_t, aligned_mediump_uint32_t, 4)</td></tr>\n<tr class=\"memdesc:ga1dc8bc6199d785f235576948d80a597c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga1dc8bc6199d785f235576948d80a597c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1dc8bc6199d785f235576948d80a597c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad14a0f2ec93519682b73d70b8e401d81\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad14a0f2ec93519682b73d70b8e401d81\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint64_t, aligned_mediump_uint64_t, 8)</td></tr>\n<tr class=\"memdesc:gad14a0f2ec93519682b73d70b8e401d81\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gad14a0f2ec93519682b73d70b8e401d81\">More...</a><br /></td></tr>\n<tr class=\"separator:gad14a0f2ec93519682b73d70b8e401d81\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gada8b996eb6526dc1ead813bd49539d1b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gada8b996eb6526dc1ead813bd49539d1b\">GLM_ALIGNED_TYPEDEF</a> (mediump_u8, aligned_mediump_u8, 1)</td></tr>\n<tr class=\"memdesc:gada8b996eb6526dc1ead813bd49539d1b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gada8b996eb6526dc1ead813bd49539d1b\">More...</a><br /></td></tr>\n<tr class=\"separator:gada8b996eb6526dc1ead813bd49539d1b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga28948f6bfb52b42deb9d73ae1ea8d8b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga28948f6bfb52b42deb9d73ae1ea8d8b0\">GLM_ALIGNED_TYPEDEF</a> (mediump_u16, aligned_mediump_u16, 2)</td></tr>\n<tr class=\"memdesc:ga28948f6bfb52b42deb9d73ae1ea8d8b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga28948f6bfb52b42deb9d73ae1ea8d8b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga28948f6bfb52b42deb9d73ae1ea8d8b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad6a7c0b5630f89d3f1c5b4ef2919bb4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad6a7c0b5630f89d3f1c5b4ef2919bb4c\">GLM_ALIGNED_TYPEDEF</a> (mediump_u32, aligned_mediump_u32, 4)</td></tr>\n<tr class=\"memdesc:gad6a7c0b5630f89d3f1c5b4ef2919bb4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gad6a7c0b5630f89d3f1c5b4ef2919bb4c\">More...</a><br /></td></tr>\n<tr class=\"separator:gad6a7c0b5630f89d3f1c5b4ef2919bb4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0fc531cbaa972ac3a0b86d21ef4a7fa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa0fc531cbaa972ac3a0b86d21ef4a7fa\">GLM_ALIGNED_TYPEDEF</a> (mediump_u64, aligned_mediump_u64, 8)</td></tr>\n<tr class=\"memdesc:gaa0fc531cbaa972ac3a0b86d21ef4a7fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaa0fc531cbaa972ac3a0b86d21ef4a7fa\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0fc531cbaa972ac3a0b86d21ef4a7fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0ee829f7b754b262bbfe6317c0d678ac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0ee829f7b754b262bbfe6317c0d678ac\">GLM_ALIGNED_TYPEDEF</a> (highp_uint8, aligned_highp_uint8, 1)</td></tr>\n<tr class=\"memdesc:ga0ee829f7b754b262bbfe6317c0d678ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga0ee829f7b754b262bbfe6317c0d678ac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0ee829f7b754b262bbfe6317c0d678ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga447848a817a626cae08cedc9778b331c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga447848a817a626cae08cedc9778b331c\">GLM_ALIGNED_TYPEDEF</a> (highp_uint16, aligned_highp_uint16, 2)</td></tr>\n<tr class=\"memdesc:ga447848a817a626cae08cedc9778b331c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga447848a817a626cae08cedc9778b331c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga447848a817a626cae08cedc9778b331c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6027ae13b2734f542a6e7beee11b8820\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6027ae13b2734f542a6e7beee11b8820\">GLM_ALIGNED_TYPEDEF</a> (highp_uint32, aligned_highp_uint32, 4)</td></tr>\n<tr class=\"memdesc:ga6027ae13b2734f542a6e7beee11b8820\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga6027ae13b2734f542a6e7beee11b8820\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6027ae13b2734f542a6e7beee11b8820\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2aca46c8608c95ef991ee4c332acde5f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2aca46c8608c95ef991ee4c332acde5f\">GLM_ALIGNED_TYPEDEF</a> (highp_uint64, aligned_highp_uint64, 8)</td></tr>\n<tr class=\"memdesc:ga2aca46c8608c95ef991ee4c332acde5f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga2aca46c8608c95ef991ee4c332acde5f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2aca46c8608c95ef991ee4c332acde5f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaff50b10dd1c48be324fdaffd18e2c7ea\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaff50b10dd1c48be324fdaffd18e2c7ea\">GLM_ALIGNED_TYPEDEF</a> (highp_uint8_t, aligned_highp_uint8_t, 1)</td></tr>\n<tr class=\"memdesc:gaff50b10dd1c48be324fdaffd18e2c7ea\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaff50b10dd1c48be324fdaffd18e2c7ea\">More...</a><br /></td></tr>\n<tr class=\"separator:gaff50b10dd1c48be324fdaffd18e2c7ea\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9fc4421dbb833d5461e6d4e59dcfde55\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9fc4421dbb833d5461e6d4e59dcfde55\">GLM_ALIGNED_TYPEDEF</a> (highp_uint16_t, aligned_highp_uint16_t, 2)</td></tr>\n<tr class=\"memdesc:ga9fc4421dbb833d5461e6d4e59dcfde55\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga9fc4421dbb833d5461e6d4e59dcfde55\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9fc4421dbb833d5461e6d4e59dcfde55\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga329f1e2b94b33ba5e3918197030bcf03\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga329f1e2b94b33ba5e3918197030bcf03\">GLM_ALIGNED_TYPEDEF</a> (highp_uint32_t, aligned_highp_uint32_t, 4)</td></tr>\n<tr class=\"memdesc:ga329f1e2b94b33ba5e3918197030bcf03\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga329f1e2b94b33ba5e3918197030bcf03\">More...</a><br /></td></tr>\n<tr class=\"separator:ga329f1e2b94b33ba5e3918197030bcf03\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga71e646f7e301aa422328194162c9c998\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga71e646f7e301aa422328194162c9c998\">GLM_ALIGNED_TYPEDEF</a> (highp_uint64_t, aligned_highp_uint64_t, 8)</td></tr>\n<tr class=\"memdesc:ga71e646f7e301aa422328194162c9c998\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga71e646f7e301aa422328194162c9c998\">More...</a><br /></td></tr>\n<tr class=\"separator:ga71e646f7e301aa422328194162c9c998\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8942e09f479489441a7a5004c6d8cb66\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8942e09f479489441a7a5004c6d8cb66\">GLM_ALIGNED_TYPEDEF</a> (highp_u8, aligned_highp_u8, 1)</td></tr>\n<tr class=\"memdesc:ga8942e09f479489441a7a5004c6d8cb66\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga8942e09f479489441a7a5004c6d8cb66\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8942e09f479489441a7a5004c6d8cb66\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaab32497d6e4db16ee439dbedd64c5865\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaab32497d6e4db16ee439dbedd64c5865\">GLM_ALIGNED_TYPEDEF</a> (highp_u16, aligned_highp_u16, 2)</td></tr>\n<tr class=\"memdesc:gaab32497d6e4db16ee439dbedd64c5865\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaab32497d6e4db16ee439dbedd64c5865\">More...</a><br /></td></tr>\n<tr class=\"separator:gaab32497d6e4db16ee439dbedd64c5865\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaadbb34952eca8e3d7fe122c3e167742\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaaadbb34952eca8e3d7fe122c3e167742\">GLM_ALIGNED_TYPEDEF</a> (highp_u32, aligned_highp_u32, 4)</td></tr>\n<tr class=\"memdesc:gaaadbb34952eca8e3d7fe122c3e167742\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaaadbb34952eca8e3d7fe122c3e167742\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaadbb34952eca8e3d7fe122c3e167742\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga92024d27c74a3650afb55ec8e024ed25\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga92024d27c74a3650afb55ec8e024ed25\">GLM_ALIGNED_TYPEDEF</a> (highp_u64, aligned_highp_u64, 8)</td></tr>\n<tr class=\"memdesc:ga92024d27c74a3650afb55ec8e024ed25\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga92024d27c74a3650afb55ec8e024ed25\">More...</a><br /></td></tr>\n<tr class=\"separator:ga92024d27c74a3650afb55ec8e024ed25\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabde1d0b4072df35453db76075ab896a6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabde1d0b4072df35453db76075ab896a6\">GLM_ALIGNED_TYPEDEF</a> (uint8, aligned_uint8, 1)</td></tr>\n<tr class=\"memdesc:gabde1d0b4072df35453db76075ab896a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gabde1d0b4072df35453db76075ab896a6\">More...</a><br /></td></tr>\n<tr class=\"separator:gabde1d0b4072df35453db76075ab896a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga06c296c9e398b294c8c9dd2a7693dcbb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga06c296c9e398b294c8c9dd2a7693dcbb\">GLM_ALIGNED_TYPEDEF</a> (uint16, aligned_uint16, 2)</td></tr>\n<tr class=\"memdesc:ga06c296c9e398b294c8c9dd2a7693dcbb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga06c296c9e398b294c8c9dd2a7693dcbb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga06c296c9e398b294c8c9dd2a7693dcbb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacf1744488c96ebd33c9f36ad33b2010a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gacf1744488c96ebd33c9f36ad33b2010a\">GLM_ALIGNED_TYPEDEF</a> (uint32, aligned_uint32, 4)</td></tr>\n<tr class=\"memdesc:gacf1744488c96ebd33c9f36ad33b2010a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gacf1744488c96ebd33c9f36ad33b2010a\">More...</a><br /></td></tr>\n<tr class=\"separator:gacf1744488c96ebd33c9f36ad33b2010a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3328061a64c20ba59d5f9da24c2cd059\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga3328061a64c20ba59d5f9da24c2cd059\">GLM_ALIGNED_TYPEDEF</a> (uint64, aligned_uint64, 8)</td></tr>\n<tr class=\"memdesc:ga3328061a64c20ba59d5f9da24c2cd059\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga3328061a64c20ba59d5f9da24c2cd059\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3328061a64c20ba59d5f9da24c2cd059\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf6ced36f13bae57f377bafa6f5fcc299\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf6ced36f13bae57f377bafa6f5fcc299\">GLM_ALIGNED_TYPEDEF</a> (uint8_t, aligned_uint8_t, 1)</td></tr>\n<tr class=\"memdesc:gaf6ced36f13bae57f377bafa6f5fcc299\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaf6ced36f13bae57f377bafa6f5fcc299\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf6ced36f13bae57f377bafa6f5fcc299\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafbc7fb7847bfc78a339d1d371c915c73\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafbc7fb7847bfc78a339d1d371c915c73\">GLM_ALIGNED_TYPEDEF</a> (uint16_t, aligned_uint16_t, 2)</td></tr>\n<tr class=\"memdesc:gafbc7fb7847bfc78a339d1d371c915c73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gafbc7fb7847bfc78a339d1d371c915c73\">More...</a><br /></td></tr>\n<tr class=\"separator:gafbc7fb7847bfc78a339d1d371c915c73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa86bc56a73fd8120b1121b5f5e6245ae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa86bc56a73fd8120b1121b5f5e6245ae\">GLM_ALIGNED_TYPEDEF</a> (uint32_t, aligned_uint32_t, 4)</td></tr>\n<tr class=\"memdesc:gaa86bc56a73fd8120b1121b5f5e6245ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaa86bc56a73fd8120b1121b5f5e6245ae\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa86bc56a73fd8120b1121b5f5e6245ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga68c0b9e669060d0eb5ab8c3ddeb483d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga68c0b9e669060d0eb5ab8c3ddeb483d8\">GLM_ALIGNED_TYPEDEF</a> (uint64_t, aligned_uint64_t, 8)</td></tr>\n<tr class=\"memdesc:ga68c0b9e669060d0eb5ab8c3ddeb483d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga68c0b9e669060d0eb5ab8c3ddeb483d8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga68c0b9e669060d0eb5ab8c3ddeb483d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f3bab577daf3343e99cc005134bce86\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga4f3bab577daf3343e99cc005134bce86\">GLM_ALIGNED_TYPEDEF</a> (u8, aligned_u8, 1)</td></tr>\n<tr class=\"memdesc:ga4f3bab577daf3343e99cc005134bce86\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga4f3bab577daf3343e99cc005134bce86\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f3bab577daf3343e99cc005134bce86\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga13a2391339d0790d43b76d00a7611c4f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga13a2391339d0790d43b76d00a7611c4f\">GLM_ALIGNED_TYPEDEF</a> (u16, aligned_u16, 2)</td></tr>\n<tr class=\"memdesc:ga13a2391339d0790d43b76d00a7611c4f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga13a2391339d0790d43b76d00a7611c4f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga13a2391339d0790d43b76d00a7611c4f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga197570e03acbc3d18ab698e342971e8f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga197570e03acbc3d18ab698e342971e8f\">GLM_ALIGNED_TYPEDEF</a> (u32, aligned_u32, 4)</td></tr>\n<tr class=\"memdesc:ga197570e03acbc3d18ab698e342971e8f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga197570e03acbc3d18ab698e342971e8f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga197570e03acbc3d18ab698e342971e8f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0f033b21e145a1faa32c62ede5878993\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0f033b21e145a1faa32c62ede5878993\">GLM_ALIGNED_TYPEDEF</a> (u64, aligned_u64, 8)</td></tr>\n<tr class=\"memdesc:ga0f033b21e145a1faa32c62ede5878993\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga0f033b21e145a1faa32c62ede5878993\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0f033b21e145a1faa32c62ede5878993\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga509af83527f5cd512e9a7873590663aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga509af83527f5cd512e9a7873590663aa\">GLM_ALIGNED_TYPEDEF</a> (uvec1, aligned_uvec1, 4)</td></tr>\n<tr class=\"memdesc:ga509af83527f5cd512e9a7873590663aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga509af83527f5cd512e9a7873590663aa\">More...</a><br /></td></tr>\n<tr class=\"separator:ga509af83527f5cd512e9a7873590663aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga94e86186978c502c6dc0c0d9c4a30679\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga94e86186978c502c6dc0c0d9c4a30679\">GLM_ALIGNED_TYPEDEF</a> (uvec2, aligned_uvec2, 8)</td></tr>\n<tr class=\"memdesc:ga94e86186978c502c6dc0c0d9c4a30679\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#ga94e86186978c502c6dc0c0d9c4a30679\">More...</a><br /></td></tr>\n<tr class=\"separator:ga94e86186978c502c6dc0c0d9c4a30679\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5cec574686a7f3c8ed24bb195c5e2d0a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5cec574686a7f3c8ed24bb195c5e2d0a\">GLM_ALIGNED_TYPEDEF</a> (uvec3, aligned_uvec3, 16)</td></tr>\n<tr class=\"memdesc:ga5cec574686a7f3c8ed24bb195c5e2d0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#ga5cec574686a7f3c8ed24bb195c5e2d0a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5cec574686a7f3c8ed24bb195c5e2d0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga47edfdcee9c89b1ebdaf20450323b1d4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga47edfdcee9c89b1ebdaf20450323b1d4\">GLM_ALIGNED_TYPEDEF</a> (uvec4, aligned_uvec4, 16)</td></tr>\n<tr class=\"memdesc:ga47edfdcee9c89b1ebdaf20450323b1d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#ga47edfdcee9c89b1ebdaf20450323b1d4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga47edfdcee9c89b1ebdaf20450323b1d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5611d6718e3a00096918a64192e73a45\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5611d6718e3a00096918a64192e73a45\">GLM_ALIGNED_TYPEDEF</a> (u8vec1, aligned_u8vec1, 1)</td></tr>\n<tr class=\"memdesc:ga5611d6718e3a00096918a64192e73a45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga5611d6718e3a00096918a64192e73a45\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5611d6718e3a00096918a64192e73a45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga19837e6f72b60d994a805ef564c6c326\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga19837e6f72b60d994a805ef564c6c326\">GLM_ALIGNED_TYPEDEF</a> (u8vec2, aligned_u8vec2, 2)</td></tr>\n<tr class=\"memdesc:ga19837e6f72b60d994a805ef564c6c326\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#ga19837e6f72b60d994a805ef564c6c326\">More...</a><br /></td></tr>\n<tr class=\"separator:ga19837e6f72b60d994a805ef564c6c326\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9740cf8e34f068049b42a2753f9601c2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9740cf8e34f068049b42a2753f9601c2\">GLM_ALIGNED_TYPEDEF</a> (u8vec3, aligned_u8vec3, 4)</td></tr>\n<tr class=\"memdesc:ga9740cf8e34f068049b42a2753f9601c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#ga9740cf8e34f068049b42a2753f9601c2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9740cf8e34f068049b42a2753f9601c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b8588bb221448f5541a858903822a57\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8b8588bb221448f5541a858903822a57\">GLM_ALIGNED_TYPEDEF</a> (u8vec4, aligned_u8vec4, 4)</td></tr>\n<tr class=\"memdesc:ga8b8588bb221448f5541a858903822a57\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#ga8b8588bb221448f5541a858903822a57\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b8588bb221448f5541a858903822a57\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga991abe990c16de26b2129d6bc2f4c051\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga991abe990c16de26b2129d6bc2f4c051\">GLM_ALIGNED_TYPEDEF</a> (u16vec1, aligned_u16vec1, 2)</td></tr>\n<tr class=\"memdesc:ga991abe990c16de26b2129d6bc2f4c051\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga991abe990c16de26b2129d6bc2f4c051\">More...</a><br /></td></tr>\n<tr class=\"separator:ga991abe990c16de26b2129d6bc2f4c051\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac01bb9fc32a1cd76c2b80d030f71df4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac01bb9fc32a1cd76c2b80d030f71df4c\">GLM_ALIGNED_TYPEDEF</a> (u16vec2, aligned_u16vec2, 4)</td></tr>\n<tr class=\"memdesc:gac01bb9fc32a1cd76c2b80d030f71df4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#gac01bb9fc32a1cd76c2b80d030f71df4c\">More...</a><br /></td></tr>\n<tr class=\"separator:gac01bb9fc32a1cd76c2b80d030f71df4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09540dbca093793a36a8997e0d4bee77\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga09540dbca093793a36a8997e0d4bee77\">GLM_ALIGNED_TYPEDEF</a> (u16vec3, aligned_u16vec3, 8)</td></tr>\n<tr class=\"memdesc:ga09540dbca093793a36a8997e0d4bee77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#ga09540dbca093793a36a8997e0d4bee77\">More...</a><br /></td></tr>\n<tr class=\"separator:ga09540dbca093793a36a8997e0d4bee77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaecafb5996f5a44f57e34d29c8670741e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaecafb5996f5a44f57e34d29c8670741e\">GLM_ALIGNED_TYPEDEF</a> (u16vec4, aligned_u16vec4, 8)</td></tr>\n<tr class=\"memdesc:gaecafb5996f5a44f57e34d29c8670741e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#gaecafb5996f5a44f57e34d29c8670741e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaecafb5996f5a44f57e34d29c8670741e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac6b161a04d2f8408fe1c9d857e8daac0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac6b161a04d2f8408fe1c9d857e8daac0\">GLM_ALIGNED_TYPEDEF</a> (u32vec1, aligned_u32vec1, 4)</td></tr>\n<tr class=\"memdesc:gac6b161a04d2f8408fe1c9d857e8daac0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gac6b161a04d2f8408fe1c9d857e8daac0\">More...</a><br /></td></tr>\n<tr class=\"separator:gac6b161a04d2f8408fe1c9d857e8daac0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fa0dfc8feb0fa17dab2acd43e05342b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1fa0dfc8feb0fa17dab2acd43e05342b\">GLM_ALIGNED_TYPEDEF</a> (u32vec2, aligned_u32vec2, 8)</td></tr>\n<tr class=\"memdesc:ga1fa0dfc8feb0fa17dab2acd43e05342b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#ga1fa0dfc8feb0fa17dab2acd43e05342b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1fa0dfc8feb0fa17dab2acd43e05342b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0019500abbfa9c66eff61ca75eaaed94\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0019500abbfa9c66eff61ca75eaaed94\">GLM_ALIGNED_TYPEDEF</a> (u32vec3, aligned_u32vec3, 16)</td></tr>\n<tr class=\"memdesc:ga0019500abbfa9c66eff61ca75eaaed94\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#ga0019500abbfa9c66eff61ca75eaaed94\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0019500abbfa9c66eff61ca75eaaed94\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga14fd29d01dae7b08a04e9facbcc18824\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga14fd29d01dae7b08a04e9facbcc18824\">GLM_ALIGNED_TYPEDEF</a> (u32vec4, aligned_u32vec4, 16)</td></tr>\n<tr class=\"memdesc:ga14fd29d01dae7b08a04e9facbcc18824\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#ga14fd29d01dae7b08a04e9facbcc18824\">More...</a><br /></td></tr>\n<tr class=\"separator:ga14fd29d01dae7b08a04e9facbcc18824\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab253845f534a67136f9619843cade903\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab253845f534a67136f9619843cade903\">GLM_ALIGNED_TYPEDEF</a> (u64vec1, aligned_u64vec1, 8)</td></tr>\n<tr class=\"memdesc:gab253845f534a67136f9619843cade903\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gab253845f534a67136f9619843cade903\">More...</a><br /></td></tr>\n<tr class=\"separator:gab253845f534a67136f9619843cade903\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga929427a7627940cdf3304f9c050b677d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga929427a7627940cdf3304f9c050b677d\">GLM_ALIGNED_TYPEDEF</a> (u64vec2, aligned_u64vec2, 16)</td></tr>\n<tr class=\"memdesc:ga929427a7627940cdf3304f9c050b677d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#ga929427a7627940cdf3304f9c050b677d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga929427a7627940cdf3304f9c050b677d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae373b6c04fdf9879f33d63e6949c037e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gae373b6c04fdf9879f33d63e6949c037e\">GLM_ALIGNED_TYPEDEF</a> (u64vec3, aligned_u64vec3, 32)</td></tr>\n<tr class=\"memdesc:gae373b6c04fdf9879f33d63e6949c037e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#gae373b6c04fdf9879f33d63e6949c037e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae373b6c04fdf9879f33d63e6949c037e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga53a8a03dca2015baec4584f45b8e9cdc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga53a8a03dca2015baec4584f45b8e9cdc\">GLM_ALIGNED_TYPEDEF</a> (u64vec4, aligned_u64vec4, 32)</td></tr>\n<tr class=\"memdesc:ga53a8a03dca2015baec4584f45b8e9cdc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#ga53a8a03dca2015baec4584f45b8e9cdc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga53a8a03dca2015baec4584f45b8e9cdc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab3301bae94ef5bf59fbdd9a24e7d2a01\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab3301bae94ef5bf59fbdd9a24e7d2a01\">GLM_ALIGNED_TYPEDEF</a> (float32, aligned_float32, 4)</td></tr>\n<tr class=\"memdesc:gab3301bae94ef5bf59fbdd9a24e7d2a01\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit single-qualifier floating-point aligned scalar.  <a href=\"a00223.html#gab3301bae94ef5bf59fbdd9a24e7d2a01\">More...</a><br /></td></tr>\n<tr class=\"separator:gab3301bae94ef5bf59fbdd9a24e7d2a01\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga75930684ff2233171c573e603f216162\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga75930684ff2233171c573e603f216162\">GLM_ALIGNED_TYPEDEF</a> (float64, aligned_float64, 8)</td></tr>\n<tr class=\"memdesc:ga75930684ff2233171c573e603f216162\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit double-qualifier floating-point aligned scalar.  <a href=\"a00223.html#ga75930684ff2233171c573e603f216162\">More...</a><br /></td></tr>\n<tr class=\"separator:ga75930684ff2233171c573e603f216162\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gada9b0bea273d3ae0286f891533b9568f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gada9b0bea273d3ae0286f891533b9568f\">GLM_ALIGNED_TYPEDEF</a> (float32_t, aligned_float32_t, 4)</td></tr>\n<tr class=\"memdesc:gada9b0bea273d3ae0286f891533b9568f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit single-qualifier floating-point aligned scalar.  <a href=\"a00223.html#gada9b0bea273d3ae0286f891533b9568f\">More...</a><br /></td></tr>\n<tr class=\"separator:gada9b0bea273d3ae0286f891533b9568f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e3a2d83b131336219a0f4c7cbba2a48\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6e3a2d83b131336219a0f4c7cbba2a48\">GLM_ALIGNED_TYPEDEF</a> (float64_t, aligned_float64_t, 8)</td></tr>\n<tr class=\"memdesc:ga6e3a2d83b131336219a0f4c7cbba2a48\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit double-qualifier floating-point aligned scalar.  <a href=\"a00223.html#ga6e3a2d83b131336219a0f4c7cbba2a48\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e3a2d83b131336219a0f4c7cbba2a48\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadbce23b9f23d77bb3884e289a574ebd5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gadbce23b9f23d77bb3884e289a574ebd5\">GLM_ALIGNED_TYPEDEF</a> (float32, aligned_f32, 4)</td></tr>\n<tr class=\"memdesc:gadbce23b9f23d77bb3884e289a574ebd5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit single-qualifier floating-point aligned scalar.  <a href=\"a00223.html#gadbce23b9f23d77bb3884e289a574ebd5\">More...</a><br /></td></tr>\n<tr class=\"separator:gadbce23b9f23d77bb3884e289a574ebd5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4deaa0dea930c393d55e7a4352b0a20\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa4deaa0dea930c393d55e7a4352b0a20\">GLM_ALIGNED_TYPEDEF</a> (float64, aligned_f64, 8)</td></tr>\n<tr class=\"memdesc:gaa4deaa0dea930c393d55e7a4352b0a20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit double-qualifier floating-point aligned scalar.  <a href=\"a00223.html#gaa4deaa0dea930c393d55e7a4352b0a20\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa4deaa0dea930c393d55e7a4352b0a20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga81bc497b2bfc6f80bab690c6ee28f0f9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga81bc497b2bfc6f80bab690c6ee28f0f9\">GLM_ALIGNED_TYPEDEF</a> (vec1, aligned_vec1, 4)</td></tr>\n<tr class=\"memdesc:ga81bc497b2bfc6f80bab690c6ee28f0f9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#ga81bc497b2bfc6f80bab690c6ee28f0f9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga81bc497b2bfc6f80bab690c6ee28f0f9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gada3e8f783e9d4b90006695a16c39d4d4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gada3e8f783e9d4b90006695a16c39d4d4\">GLM_ALIGNED_TYPEDEF</a> (vec2, aligned_vec2, 8)</td></tr>\n<tr class=\"memdesc:gada3e8f783e9d4b90006695a16c39d4d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#gada3e8f783e9d4b90006695a16c39d4d4\">More...</a><br /></td></tr>\n<tr class=\"separator:gada3e8f783e9d4b90006695a16c39d4d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab8d081fac3a38d6f55fa552f32168d32\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab8d081fac3a38d6f55fa552f32168d32\">GLM_ALIGNED_TYPEDEF</a> (vec3, aligned_vec3, 16)</td></tr>\n<tr class=\"memdesc:gab8d081fac3a38d6f55fa552f32168d32\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#gab8d081fac3a38d6f55fa552f32168d32\">More...</a><br /></td></tr>\n<tr class=\"separator:gab8d081fac3a38d6f55fa552f32168d32\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12fe7b9769c964c5b48dcfd8b7f40198\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga12fe7b9769c964c5b48dcfd8b7f40198\">GLM_ALIGNED_TYPEDEF</a> (vec4, aligned_vec4, 16)</td></tr>\n<tr class=\"memdesc:ga12fe7b9769c964c5b48dcfd8b7f40198\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga12fe7b9769c964c5b48dcfd8b7f40198\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12fe7b9769c964c5b48dcfd8b7f40198\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaefab04611c7f8fe1fd9be3071efea6cc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaefab04611c7f8fe1fd9be3071efea6cc\">GLM_ALIGNED_TYPEDEF</a> (fvec1, aligned_fvec1, 4)</td></tr>\n<tr class=\"memdesc:gaefab04611c7f8fe1fd9be3071efea6cc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#gaefab04611c7f8fe1fd9be3071efea6cc\">More...</a><br /></td></tr>\n<tr class=\"separator:gaefab04611c7f8fe1fd9be3071efea6cc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2543c05ba19b3bd19d45b1227390c5b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2543c05ba19b3bd19d45b1227390c5b4\">GLM_ALIGNED_TYPEDEF</a> (fvec2, aligned_fvec2, 8)</td></tr>\n<tr class=\"memdesc:ga2543c05ba19b3bd19d45b1227390c5b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#ga2543c05ba19b3bd19d45b1227390c5b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2543c05ba19b3bd19d45b1227390c5b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga009afd727fd657ef33a18754d6d28f60\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga009afd727fd657ef33a18754d6d28f60\">GLM_ALIGNED_TYPEDEF</a> (fvec3, aligned_fvec3, 16)</td></tr>\n<tr class=\"memdesc:ga009afd727fd657ef33a18754d6d28f60\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#ga009afd727fd657ef33a18754d6d28f60\">More...</a><br /></td></tr>\n<tr class=\"separator:ga009afd727fd657ef33a18754d6d28f60\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2f26177e74bfb301a3d0e02ec3c3ef53\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2f26177e74bfb301a3d0e02ec3c3ef53\">GLM_ALIGNED_TYPEDEF</a> (fvec4, aligned_fvec4, 16)</td></tr>\n<tr class=\"memdesc:ga2f26177e74bfb301a3d0e02ec3c3ef53\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga2f26177e74bfb301a3d0e02ec3c3ef53\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2f26177e74bfb301a3d0e02ec3c3ef53\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga309f495a1d6b75ddf195b674b65cb1e4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga309f495a1d6b75ddf195b674b65cb1e4\">GLM_ALIGNED_TYPEDEF</a> (f32vec1, aligned_f32vec1, 4)</td></tr>\n<tr class=\"memdesc:ga309f495a1d6b75ddf195b674b65cb1e4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#ga309f495a1d6b75ddf195b674b65cb1e4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga309f495a1d6b75ddf195b674b65cb1e4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5e185865a2217d0cd47187644683a8c3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5e185865a2217d0cd47187644683a8c3\">GLM_ALIGNED_TYPEDEF</a> (f32vec2, aligned_f32vec2, 8)</td></tr>\n<tr class=\"memdesc:ga5e185865a2217d0cd47187644683a8c3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#ga5e185865a2217d0cd47187644683a8c3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5e185865a2217d0cd47187644683a8c3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade4458b27b039b9ca34f8ec049f3115a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gade4458b27b039b9ca34f8ec049f3115a\">GLM_ALIGNED_TYPEDEF</a> (f32vec3, aligned_f32vec3, 16)</td></tr>\n<tr class=\"memdesc:gade4458b27b039b9ca34f8ec049f3115a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#gade4458b27b039b9ca34f8ec049f3115a\">More...</a><br /></td></tr>\n<tr class=\"separator:gade4458b27b039b9ca34f8ec049f3115a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\">GLM_ALIGNED_TYPEDEF</a> (f32vec4, aligned_f32vec4, 16)</td></tr>\n<tr class=\"memdesc:ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e0f35fa0c626285a8bad41707e7316c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga3e0f35fa0c626285a8bad41707e7316c\">GLM_ALIGNED_TYPEDEF</a> (dvec1, aligned_dvec1, 8)</td></tr>\n<tr class=\"memdesc:ga3e0f35fa0c626285a8bad41707e7316c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#ga3e0f35fa0c626285a8bad41707e7316c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e0f35fa0c626285a8bad41707e7316c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78bfec2f185d1d365ea0a9ef1e3d45b8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga78bfec2f185d1d365ea0a9ef1e3d45b8\">GLM_ALIGNED_TYPEDEF</a> (dvec2, aligned_dvec2, 16)</td></tr>\n<tr class=\"memdesc:ga78bfec2f185d1d365ea0a9ef1e3d45b8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#ga78bfec2f185d1d365ea0a9ef1e3d45b8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78bfec2f185d1d365ea0a9ef1e3d45b8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga01fe6fee6db5df580b6724a7e681f069\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga01fe6fee6db5df580b6724a7e681f069\">GLM_ALIGNED_TYPEDEF</a> (dvec3, aligned_dvec3, 32)</td></tr>\n<tr class=\"memdesc:ga01fe6fee6db5df580b6724a7e681f069\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#ga01fe6fee6db5df580b6724a7e681f069\">More...</a><br /></td></tr>\n<tr class=\"separator:ga01fe6fee6db5df580b6724a7e681f069\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga687d5b8f551d5af32425c0b2fba15e99\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga687d5b8f551d5af32425c0b2fba15e99\">GLM_ALIGNED_TYPEDEF</a> (dvec4, aligned_dvec4, 32)</td></tr>\n<tr class=\"memdesc:ga687d5b8f551d5af32425c0b2fba15e99\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga687d5b8f551d5af32425c0b2fba15e99\">More...</a><br /></td></tr>\n<tr class=\"separator:ga687d5b8f551d5af32425c0b2fba15e99\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e842371d46842ff8f1813419ba49d0f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8e842371d46842ff8f1813419ba49d0f\">GLM_ALIGNED_TYPEDEF</a> (f64vec1, aligned_f64vec1, 8)</td></tr>\n<tr class=\"memdesc:ga8e842371d46842ff8f1813419ba49d0f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#ga8e842371d46842ff8f1813419ba49d0f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e842371d46842ff8f1813419ba49d0f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga32814aa0f19316b43134fc25f2aad2b9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga32814aa0f19316b43134fc25f2aad2b9\">GLM_ALIGNED_TYPEDEF</a> (f64vec2, aligned_f64vec2, 16)</td></tr>\n<tr class=\"memdesc:ga32814aa0f19316b43134fc25f2aad2b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#ga32814aa0f19316b43134fc25f2aad2b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga32814aa0f19316b43134fc25f2aad2b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf3d3bbc1e93909b689123b085e177a14\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf3d3bbc1e93909b689123b085e177a14\">GLM_ALIGNED_TYPEDEF</a> (f64vec3, aligned_f64vec3, 32)</td></tr>\n<tr class=\"memdesc:gaf3d3bbc1e93909b689123b085e177a14\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#gaf3d3bbc1e93909b689123b085e177a14\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf3d3bbc1e93909b689123b085e177a14\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga804c654cead1139bd250f90f9bb01fad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga804c654cead1139bd250f90f9bb01fad\">GLM_ALIGNED_TYPEDEF</a> (f64vec4, aligned_f64vec4, 32)</td></tr>\n<tr class=\"memdesc:ga804c654cead1139bd250f90f9bb01fad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga804c654cead1139bd250f90f9bb01fad\">More...</a><br /></td></tr>\n<tr class=\"separator:ga804c654cead1139bd250f90f9bb01fad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafed7d010235a3aa7ea2f88646858f2ae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafed7d010235a3aa7ea2f88646858f2ae\">GLM_ALIGNED_TYPEDEF</a> (mat2, aligned_mat2, 16)</td></tr>\n<tr class=\"memdesc:gafed7d010235a3aa7ea2f88646858f2ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#gafed7d010235a3aa7ea2f88646858f2ae\">More...</a><br /></td></tr>\n<tr class=\"separator:gafed7d010235a3aa7ea2f88646858f2ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga17f911ee7b78ca6d1b91c4ab51ddb73c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga17f911ee7b78ca6d1b91c4ab51ddb73c\">GLM_ALIGNED_TYPEDEF</a> (mat3, aligned_mat3, 16)</td></tr>\n<tr class=\"memdesc:ga17f911ee7b78ca6d1b91c4ab51ddb73c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#ga17f911ee7b78ca6d1b91c4ab51ddb73c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga17f911ee7b78ca6d1b91c4ab51ddb73c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31940e6012b72110e26fdb0f54805033\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga31940e6012b72110e26fdb0f54805033\">GLM_ALIGNED_TYPEDEF</a> (mat4, aligned_mat4, 16)</td></tr>\n<tr class=\"memdesc:ga31940e6012b72110e26fdb0f54805033\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#ga31940e6012b72110e26fdb0f54805033\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31940e6012b72110e26fdb0f54805033\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga01de96cd0b541c52d2b4a3faf65822e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga01de96cd0b541c52d2b4a3faf65822e9\">GLM_ALIGNED_TYPEDEF</a> (mat2x2, aligned_mat2x2, 16)</td></tr>\n<tr class=\"memdesc:ga01de96cd0b541c52d2b4a3faf65822e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga01de96cd0b541c52d2b4a3faf65822e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga01de96cd0b541c52d2b4a3faf65822e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac88a191b004bd341e64fc53b5a4d00e3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac88a191b004bd341e64fc53b5a4d00e3\">GLM_ALIGNED_TYPEDEF</a> (mat3x3, aligned_mat3x3, 16)</td></tr>\n<tr class=\"memdesc:gac88a191b004bd341e64fc53b5a4d00e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#gac88a191b004bd341e64fc53b5a4d00e3\">More...</a><br /></td></tr>\n<tr class=\"separator:gac88a191b004bd341e64fc53b5a4d00e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabe8c745fa2ced44a600a6e3f19991161\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabe8c745fa2ced44a600a6e3f19991161\">GLM_ALIGNED_TYPEDEF</a> (mat4x4, aligned_mat4x4, 16)</td></tr>\n<tr class=\"memdesc:gabe8c745fa2ced44a600a6e3f19991161\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#gabe8c745fa2ced44a600a6e3f19991161\">More...</a><br /></td></tr>\n<tr class=\"separator:gabe8c745fa2ced44a600a6e3f19991161\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga719da577361541a4c43a2dd1d0e361e1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga719da577361541a4c43a2dd1d0e361e1\">GLM_ALIGNED_TYPEDEF</a> (fmat2x2, aligned_fmat2, 16)</td></tr>\n<tr class=\"memdesc:ga719da577361541a4c43a2dd1d0e361e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga719da577361541a4c43a2dd1d0e361e1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga719da577361541a4c43a2dd1d0e361e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e7ee4f541e1d7db66cd1a224caacafb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6e7ee4f541e1d7db66cd1a224caacafb\">GLM_ALIGNED_TYPEDEF</a> (fmat3x3, aligned_fmat3, 16)</td></tr>\n<tr class=\"memdesc:ga6e7ee4f541e1d7db66cd1a224caacafb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#ga6e7ee4f541e1d7db66cd1a224caacafb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e7ee4f541e1d7db66cd1a224caacafb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae5d672d359f2a39f63f98c7975057486\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gae5d672d359f2a39f63f98c7975057486\">GLM_ALIGNED_TYPEDEF</a> (fmat4x4, aligned_fmat4, 16)</td></tr>\n<tr class=\"memdesc:gae5d672d359f2a39f63f98c7975057486\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#gae5d672d359f2a39f63f98c7975057486\">More...</a><br /></td></tr>\n<tr class=\"separator:gae5d672d359f2a39f63f98c7975057486\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6fa2df037dbfc5fe8c8e0b4db8a34953\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6fa2df037dbfc5fe8c8e0b4db8a34953\">GLM_ALIGNED_TYPEDEF</a> (fmat2x2, aligned_fmat2x2, 16)</td></tr>\n<tr class=\"memdesc:ga6fa2df037dbfc5fe8c8e0b4db8a34953\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga6fa2df037dbfc5fe8c8e0b4db8a34953\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6fa2df037dbfc5fe8c8e0b4db8a34953\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0743b4f4f69a3227b82ff58f6abbad62\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0743b4f4f69a3227b82ff58f6abbad62\">GLM_ALIGNED_TYPEDEF</a> (fmat2x3, aligned_fmat2x3, 16)</td></tr>\n<tr class=\"memdesc:ga0743b4f4f69a3227b82ff58f6abbad62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 2x3 matrix.  <a href=\"a00223.html#ga0743b4f4f69a3227b82ff58f6abbad62\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0743b4f4f69a3227b82ff58f6abbad62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1a76b325fdf70f961d835edd182c63dd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1a76b325fdf70f961d835edd182c63dd\">GLM_ALIGNED_TYPEDEF</a> (fmat2x4, aligned_fmat2x4, 16)</td></tr>\n<tr class=\"memdesc:ga1a76b325fdf70f961d835edd182c63dd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 2x4 matrix.  <a href=\"a00223.html#ga1a76b325fdf70f961d835edd182c63dd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a76b325fdf70f961d835edd182c63dd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b4e181cd041ba28c3163e7b8074aef0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga4b4e181cd041ba28c3163e7b8074aef0\">GLM_ALIGNED_TYPEDEF</a> (fmat3x2, aligned_fmat3x2, 16)</td></tr>\n<tr class=\"memdesc:ga4b4e181cd041ba28c3163e7b8074aef0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x2 matrix.  <a href=\"a00223.html#ga4b4e181cd041ba28c3163e7b8074aef0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b4e181cd041ba28c3163e7b8074aef0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga27b13f465abc8a40705698145e222c3f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga27b13f465abc8a40705698145e222c3f\">GLM_ALIGNED_TYPEDEF</a> (fmat3x3, aligned_fmat3x3, 16)</td></tr>\n<tr class=\"memdesc:ga27b13f465abc8a40705698145e222c3f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#ga27b13f465abc8a40705698145e222c3f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga27b13f465abc8a40705698145e222c3f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2608d19cc275830a6f8c0b6405625a4f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2608d19cc275830a6f8c0b6405625a4f\">GLM_ALIGNED_TYPEDEF</a> (fmat3x4, aligned_fmat3x4, 16)</td></tr>\n<tr class=\"memdesc:ga2608d19cc275830a6f8c0b6405625a4f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x4 matrix.  <a href=\"a00223.html#ga2608d19cc275830a6f8c0b6405625a4f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2608d19cc275830a6f8c0b6405625a4f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga93f09768241358a287c4cca538f1f7e7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga93f09768241358a287c4cca538f1f7e7\">GLM_ALIGNED_TYPEDEF</a> (fmat4x2, aligned_fmat4x2, 16)</td></tr>\n<tr class=\"memdesc:ga93f09768241358a287c4cca538f1f7e7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x2 matrix.  <a href=\"a00223.html#ga93f09768241358a287c4cca538f1f7e7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga93f09768241358a287c4cca538f1f7e7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7c117e3ecca089e10247b1d41d88aff9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7c117e3ecca089e10247b1d41d88aff9\">GLM_ALIGNED_TYPEDEF</a> (fmat4x3, aligned_fmat4x3, 16)</td></tr>\n<tr class=\"memdesc:ga7c117e3ecca089e10247b1d41d88aff9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x3 matrix.  <a href=\"a00223.html#ga7c117e3ecca089e10247b1d41d88aff9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7c117e3ecca089e10247b1d41d88aff9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga07c75cd04ba42dc37fa3e105f89455c5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga07c75cd04ba42dc37fa3e105f89455c5\">GLM_ALIGNED_TYPEDEF</a> (fmat4x4, aligned_fmat4x4, 16)</td></tr>\n<tr class=\"memdesc:ga07c75cd04ba42dc37fa3e105f89455c5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#ga07c75cd04ba42dc37fa3e105f89455c5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga07c75cd04ba42dc37fa3e105f89455c5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga65ff0d690a34a4d7f46f9b2eb51525ee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga65ff0d690a34a4d7f46f9b2eb51525ee\">GLM_ALIGNED_TYPEDEF</a> (f32mat2x2, aligned_f32mat2, 16)</td></tr>\n<tr class=\"memdesc:ga65ff0d690a34a4d7f46f9b2eb51525ee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga65ff0d690a34a4d7f46f9b2eb51525ee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga65ff0d690a34a4d7f46f9b2eb51525ee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadd8ddbe2bf65ccede865ba2f510176dc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gadd8ddbe2bf65ccede865ba2f510176dc\">GLM_ALIGNED_TYPEDEF</a> (f32mat3x3, aligned_f32mat3, 16)</td></tr>\n<tr class=\"memdesc:gadd8ddbe2bf65ccede865ba2f510176dc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#gadd8ddbe2bf65ccede865ba2f510176dc\">More...</a><br /></td></tr>\n<tr class=\"separator:gadd8ddbe2bf65ccede865ba2f510176dc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf18dbff14bf13d3ff540c517659ec045\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf18dbff14bf13d3ff540c517659ec045\">GLM_ALIGNED_TYPEDEF</a> (f32mat4x4, aligned_f32mat4, 16)</td></tr>\n<tr class=\"memdesc:gaf18dbff14bf13d3ff540c517659ec045\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#gaf18dbff14bf13d3ff540c517659ec045\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf18dbff14bf13d3ff540c517659ec045\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga66339f6139bf7ff19e245beb33f61cc8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga66339f6139bf7ff19e245beb33f61cc8\">GLM_ALIGNED_TYPEDEF</a> (f32mat2x2, aligned_f32mat2x2, 16)</td></tr>\n<tr class=\"memdesc:ga66339f6139bf7ff19e245beb33f61cc8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga66339f6139bf7ff19e245beb33f61cc8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga66339f6139bf7ff19e245beb33f61cc8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1558a48b3934011b52612809f443e46d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1558a48b3934011b52612809f443e46d\">GLM_ALIGNED_TYPEDEF</a> (f32mat2x3, aligned_f32mat2x3, 16)</td></tr>\n<tr class=\"memdesc:ga1558a48b3934011b52612809f443e46d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 2x3 matrix.  <a href=\"a00223.html#ga1558a48b3934011b52612809f443e46d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1558a48b3934011b52612809f443e46d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa52e5732daa62851627021ad551c7680\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa52e5732daa62851627021ad551c7680\">GLM_ALIGNED_TYPEDEF</a> (f32mat2x4, aligned_f32mat2x4, 16)</td></tr>\n<tr class=\"memdesc:gaa52e5732daa62851627021ad551c7680\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 2x4 matrix.  <a href=\"a00223.html#gaa52e5732daa62851627021ad551c7680\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa52e5732daa62851627021ad551c7680\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac09663c42566bcb58d23c6781ac4e85a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac09663c42566bcb58d23c6781ac4e85a\">GLM_ALIGNED_TYPEDEF</a> (f32mat3x2, aligned_f32mat3x2, 16)</td></tr>\n<tr class=\"memdesc:gac09663c42566bcb58d23c6781ac4e85a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x2 matrix.  <a href=\"a00223.html#gac09663c42566bcb58d23c6781ac4e85a\">More...</a><br /></td></tr>\n<tr class=\"separator:gac09663c42566bcb58d23c6781ac4e85a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3f510999e59e1b309113e1d561162b29\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga3f510999e59e1b309113e1d561162b29\">GLM_ALIGNED_TYPEDEF</a> (f32mat3x3, aligned_f32mat3x3, 16)</td></tr>\n<tr class=\"memdesc:ga3f510999e59e1b309113e1d561162b29\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#ga3f510999e59e1b309113e1d561162b29\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3f510999e59e1b309113e1d561162b29\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c9c94f0c89cd71ce56551db6cf4aaec\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2c9c94f0c89cd71ce56551db6cf4aaec\">GLM_ALIGNED_TYPEDEF</a> (f32mat3x4, aligned_f32mat3x4, 16)</td></tr>\n<tr class=\"memdesc:ga2c9c94f0c89cd71ce56551db6cf4aaec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x4 matrix.  <a href=\"a00223.html#ga2c9c94f0c89cd71ce56551db6cf4aaec\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c9c94f0c89cd71ce56551db6cf4aaec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99ce8274c750fbfdf0e70c95946a2875\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga99ce8274c750fbfdf0e70c95946a2875\">GLM_ALIGNED_TYPEDEF</a> (f32mat4x2, aligned_f32mat4x2, 16)</td></tr>\n<tr class=\"memdesc:ga99ce8274c750fbfdf0e70c95946a2875\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x2 matrix.  <a href=\"a00223.html#ga99ce8274c750fbfdf0e70c95946a2875\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99ce8274c750fbfdf0e70c95946a2875\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9476ef66790239df53dbe66f3989c3b5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9476ef66790239df53dbe66f3989c3b5\">GLM_ALIGNED_TYPEDEF</a> (f32mat4x3, aligned_f32mat4x3, 16)</td></tr>\n<tr class=\"memdesc:ga9476ef66790239df53dbe66f3989c3b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x3 matrix.  <a href=\"a00223.html#ga9476ef66790239df53dbe66f3989c3b5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9476ef66790239df53dbe66f3989c3b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc429b3b0b49921e12713b6d31e14e1d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gacc429b3b0b49921e12713b6d31e14e1d\">GLM_ALIGNED_TYPEDEF</a> (f32mat4x4, aligned_f32mat4x4, 16)</td></tr>\n<tr class=\"memdesc:gacc429b3b0b49921e12713b6d31e14e1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#gacc429b3b0b49921e12713b6d31e14e1d\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc429b3b0b49921e12713b6d31e14e1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga88f6c6fa06e6e64479763e69444669cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga88f6c6fa06e6e64479763e69444669cf\">GLM_ALIGNED_TYPEDEF</a> (f64mat2x2, aligned_f64mat2, 32)</td></tr>\n<tr class=\"memdesc:ga88f6c6fa06e6e64479763e69444669cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga88f6c6fa06e6e64479763e69444669cf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga88f6c6fa06e6e64479763e69444669cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaae8e4639c991e64754145ab8e4c32083\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaae8e4639c991e64754145ab8e4c32083\">GLM_ALIGNED_TYPEDEF</a> (f64mat3x3, aligned_f64mat3, 32)</td></tr>\n<tr class=\"memdesc:gaae8e4639c991e64754145ab8e4c32083\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#gaae8e4639c991e64754145ab8e4c32083\">More...</a><br /></td></tr>\n<tr class=\"separator:gaae8e4639c991e64754145ab8e4c32083\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e9094f3feb3b5b49d0f83683a101fde\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6e9094f3feb3b5b49d0f83683a101fde\">GLM_ALIGNED_TYPEDEF</a> (f64mat4x4, aligned_f64mat4, 32)</td></tr>\n<tr class=\"memdesc:ga6e9094f3feb3b5b49d0f83683a101fde\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#ga6e9094f3feb3b5b49d0f83683a101fde\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e9094f3feb3b5b49d0f83683a101fde\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadbd2c639c03de1c3e9591b5a39f65559\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gadbd2c639c03de1c3e9591b5a39f65559\">GLM_ALIGNED_TYPEDEF</a> (f64mat2x2, aligned_f64mat2x2, 32)</td></tr>\n<tr class=\"memdesc:gadbd2c639c03de1c3e9591b5a39f65559\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#gadbd2c639c03de1c3e9591b5a39f65559\">More...</a><br /></td></tr>\n<tr class=\"separator:gadbd2c639c03de1c3e9591b5a39f65559\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab059d7b9fe2094acc563b7223987499f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab059d7b9fe2094acc563b7223987499f\">GLM_ALIGNED_TYPEDEF</a> (f64mat2x3, aligned_f64mat2x3, 32)</td></tr>\n<tr class=\"memdesc:gab059d7b9fe2094acc563b7223987499f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 2x3 matrix.  <a href=\"a00223.html#gab059d7b9fe2094acc563b7223987499f\">More...</a><br /></td></tr>\n<tr class=\"separator:gab059d7b9fe2094acc563b7223987499f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabbc811d1c52ed2b8cfcaff1378f75c69\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabbc811d1c52ed2b8cfcaff1378f75c69\">GLM_ALIGNED_TYPEDEF</a> (f64mat2x4, aligned_f64mat2x4, 32)</td></tr>\n<tr class=\"memdesc:gabbc811d1c52ed2b8cfcaff1378f75c69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 2x4 matrix.  <a href=\"a00223.html#gabbc811d1c52ed2b8cfcaff1378f75c69\">More...</a><br /></td></tr>\n<tr class=\"separator:gabbc811d1c52ed2b8cfcaff1378f75c69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ddf5212777734d2fd841a84439f3bdf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9ddf5212777734d2fd841a84439f3bdf\">GLM_ALIGNED_TYPEDEF</a> (f64mat3x2, aligned_f64mat3x2, 32)</td></tr>\n<tr class=\"memdesc:ga9ddf5212777734d2fd841a84439f3bdf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 3x2 matrix.  <a href=\"a00223.html#ga9ddf5212777734d2fd841a84439f3bdf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9ddf5212777734d2fd841a84439f3bdf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1dda32ed09f94bfcf0a7d8edfb6cf13\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad1dda32ed09f94bfcf0a7d8edfb6cf13\">GLM_ALIGNED_TYPEDEF</a> (f64mat3x3, aligned_f64mat3x3, 32)</td></tr>\n<tr class=\"memdesc:gad1dda32ed09f94bfcf0a7d8edfb6cf13\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#gad1dda32ed09f94bfcf0a7d8edfb6cf13\">More...</a><br /></td></tr>\n<tr class=\"separator:gad1dda32ed09f94bfcf0a7d8edfb6cf13\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5875e0fa72f07e271e7931811cbbf31a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5875e0fa72f07e271e7931811cbbf31a\">GLM_ALIGNED_TYPEDEF</a> (f64mat3x4, aligned_f64mat3x4, 32)</td></tr>\n<tr class=\"memdesc:ga5875e0fa72f07e271e7931811cbbf31a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 3x4 matrix.  <a href=\"a00223.html#ga5875e0fa72f07e271e7931811cbbf31a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5875e0fa72f07e271e7931811cbbf31a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41e82cd6ac07f912ba2a2d45799dcf0d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga41e82cd6ac07f912ba2a2d45799dcf0d\">GLM_ALIGNED_TYPEDEF</a> (f64mat4x2, aligned_f64mat4x2, 32)</td></tr>\n<tr class=\"memdesc:ga41e82cd6ac07f912ba2a2d45799dcf0d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 4x2 matrix.  <a href=\"a00223.html#ga41e82cd6ac07f912ba2a2d45799dcf0d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41e82cd6ac07f912ba2a2d45799dcf0d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0892638d6ba773043b3d63d1d092622e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0892638d6ba773043b3d63d1d092622e\">GLM_ALIGNED_TYPEDEF</a> (f64mat4x3, aligned_f64mat4x3, 32)</td></tr>\n<tr class=\"memdesc:ga0892638d6ba773043b3d63d1d092622e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 4x3 matrix.  <a href=\"a00223.html#ga0892638d6ba773043b3d63d1d092622e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0892638d6ba773043b3d63d1d092622e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga912a16432608b822f1e13607529934c1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga912a16432608b822f1e13607529934c1\">GLM_ALIGNED_TYPEDEF</a> (f64mat4x4, aligned_f64mat4x4, 32)</td></tr>\n<tr class=\"memdesc:ga912a16432608b822f1e13607529934c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#ga912a16432608b822f1e13607529934c1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga912a16432608b822f1e13607529934c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafd945a8ea86b042aba410e0560df9a3d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafd945a8ea86b042aba410e0560df9a3d\">GLM_ALIGNED_TYPEDEF</a> (quat, aligned_quat, 16)</td></tr>\n<tr class=\"memdesc:gafd945a8ea86b042aba410e0560df9a3d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#gafd945a8ea86b042aba410e0560df9a3d\">More...</a><br /></td></tr>\n<tr class=\"separator:gafd945a8ea86b042aba410e0560df9a3d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad8c4bfacff70e57dc8303634c8bfce35\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad8c4bfacff70e57dc8303634c8bfce35\">GLM_ALIGNED_TYPEDEF</a> (fquat, aligned_fquat, 16)</td></tr>\n<tr class=\"memdesc:gad8c4bfacff70e57dc8303634c8bfce35\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#gad8c4bfacff70e57dc8303634c8bfce35\">More...</a><br /></td></tr>\n<tr class=\"separator:gad8c4bfacff70e57dc8303634c8bfce35\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabc28c84a3288b697605d4688686f9a9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaabc28c84a3288b697605d4688686f9a9\">GLM_ALIGNED_TYPEDEF</a> (dquat, aligned_dquat, 32)</td></tr>\n<tr class=\"memdesc:gaabc28c84a3288b697605d4688686f9a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#gaabc28c84a3288b697605d4688686f9a9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabc28c84a3288b697605d4688686f9a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ed8aeb5ca67fade269a46105f1bf273\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1ed8aeb5ca67fade269a46105f1bf273\">GLM_ALIGNED_TYPEDEF</a> (f32quat, aligned_f32quat, 16)</td></tr>\n<tr class=\"memdesc:ga1ed8aeb5ca67fade269a46105f1bf273\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#ga1ed8aeb5ca67fade269a46105f1bf273\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1ed8aeb5ca67fade269a46105f1bf273\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga95cc03b8b475993fa50e05e38e203303\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a> (f64quat, aligned_f64quat, 32)</td></tr>\n<tr class=\"memdesc:ga95cc03b8b475993fa50e05e38e203303\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">More...</a><br /></td></tr>\n<tr class=\"separator:ga95cc03b8b475993fa50e05e38e203303\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00223.html\">GLM_GTX_type_aligned</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00102_source.html\">gtx/type_aligned.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00102_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_aligned.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtx/type_aligned.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00102.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/type_precision.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_type_aligned is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_type_aligned extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        <span class=\"comment\">// Signed int vector types </span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">lowp_int8</a>, aligned_lowp_int8, 1);</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">lowp_int16</a>, aligned_lowp_int16, 2);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">lowp_int32</a>, aligned_lowp_int32, 4);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">lowp_int64</a>, aligned_lowp_int64, 8);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">lowp_int8_t</a>, aligned_lowp_int8_t, 1);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">lowp_int16_t</a>, aligned_lowp_int16_t, 2);</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">lowp_int32_t</a>, aligned_lowp_int32_t, 4);</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">lowp_int64_t</a>, aligned_lowp_int64_t, 8);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">lowp_i8</a>, aligned_lowp_i8, 1);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">lowp_i16</a>, aligned_lowp_i16, 2);</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">lowp_i32</a>, aligned_lowp_i32, 4);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">lowp_i64</a>, aligned_lowp_i64, 8);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">mediump_int8</a>, aligned_mediump_int8, 1);</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">mediump_int16</a>, aligned_mediump_int16, 2);</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">mediump_int32</a>, aligned_mediump_int32, 4);</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">mediump_int64</a>, aligned_mediump_int64, 8);</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">mediump_int8_t</a>, aligned_mediump_int8_t, 1);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">mediump_int16_t</a>, aligned_mediump_int16_t, 2);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">mediump_int32_t</a>, aligned_mediump_int32_t, 4);</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">mediump_int64_t</a>, aligned_mediump_int64_t, 8);</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">mediump_i8</a>, aligned_mediump_i8, 1);</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">mediump_i16</a>, aligned_mediump_i16, 2);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">mediump_i32</a>, aligned_mediump_i32, 4);</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">mediump_i64</a>, aligned_mediump_i64, 8);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">highp_int8</a>, aligned_highp_int8, 1);</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">highp_int16</a>, aligned_highp_int16, 2);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">highp_int32</a>, aligned_highp_int32, 4);</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">highp_int64</a>, aligned_highp_int64, 8);</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">highp_int8_t</a>, aligned_highp_int8_t, 1);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">highp_int16_t</a>, aligned_highp_int16_t, 2);</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">highp_int32_t</a>, aligned_highp_int32_t, 4);</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">highp_int64_t</a>, aligned_highp_int64_t, 8);</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">highp_i8</a>, aligned_highp_i8, 1);</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">highp_i16</a>, aligned_highp_i16, 2);</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">highp_i32</a>, aligned_highp_i32, 4);</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">highp_i64</a>, aligned_highp_i64, 8);</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(int8, aligned_int8, 1);</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(int16, aligned_int16, 2);</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(int32, aligned_int32, 4);</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(int64, aligned_int64, 8);</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">int8_t</a>, aligned_int8_t, 1);</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">int16_t</a>, aligned_int16_t, 2);</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">int32_t</a>, aligned_int32_t, 4);</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;</div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">int64_t</a>, aligned_int64_t, 8);</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">i8</a>, aligned_i8, 1);</div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">i16</a>, aligned_i16, 2);</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">i32</a>, aligned_i32, 4);</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">i64</a>, aligned_i64, 8);</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(ivec1, <a class=\"code\" href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">aligned_ivec1</a>, 4);</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">ivec2</a>, <a class=\"code\" href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">aligned_ivec2</a>, 8);</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">ivec3</a>, <a class=\"code\" href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">aligned_ivec3</a>, 16);</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a>, <a class=\"code\" href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">aligned_ivec4</a>, 16);</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">i8vec1</a>, aligned_i8vec1, 1);</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a>, aligned_i8vec2, 2);</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">i8vec3</a>, aligned_i8vec3, 4);</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a>, aligned_i8vec4, 4);</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">i16vec1</a>, aligned_i16vec1, 2);</div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a>, aligned_i16vec2, 4);</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">i16vec3</a>, aligned_i16vec3, 8);</div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a>, aligned_i16vec4, 8);</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;</div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>, aligned_i32vec1, 4);</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>, aligned_i32vec2, 8);</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>, aligned_i32vec3, 16);</div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>, aligned_i32vec4, 16);</div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;</div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;</div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">i64vec1</a>, aligned_i64vec1, 8);</div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">i64vec2</a>, aligned_i64vec2, 16);</div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;</div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">i64vec3</a>, aligned_i64vec3, 32);</div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">i64vec4</a>, aligned_i64vec4, 32);</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;</div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;        <span class=\"comment\">// Unsigned int vector types</span></div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;</div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">lowp_uint8</a>, aligned_lowp_uint8, 1);</div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">lowp_uint16</a>, aligned_lowp_uint16, 2);</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">lowp_uint32</a>, aligned_lowp_uint32, 4);</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;</div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">lowp_uint64</a>, aligned_lowp_uint64, 8);</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">lowp_uint8_t</a>, aligned_lowp_uint8_t, 1);</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">lowp_uint16_t</a>, aligned_lowp_uint16_t, 2);</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">lowp_uint32_t</a>, aligned_lowp_uint32_t, 4);</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;</div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">lowp_uint64_t</a>, aligned_lowp_uint64_t, 8);</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">lowp_u8</a>, aligned_lowp_u8, 1);</div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;</div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">lowp_u16</a>, aligned_lowp_u16, 2);</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;</div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">lowp_u32</a>, aligned_lowp_u32, 4);</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">lowp_u64</a>, aligned_lowp_u64, 8);</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">mediump_uint8</a>, aligned_mediump_uint8, 1);</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;</div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">mediump_uint16</a>, aligned_mediump_uint16, 2);</div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;</div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">mediump_uint32</a>, aligned_mediump_uint32, 4);</div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">mediump_uint64</a>, aligned_mediump_uint64, 8);</div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;</div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;</div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">mediump_uint8_t</a>, aligned_mediump_uint8_t, 1);</div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;</div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">mediump_uint16_t</a>, aligned_mediump_uint16_t, 2);</div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;</div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">mediump_uint32_t</a>, aligned_mediump_uint32_t, 4);</div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;</div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">mediump_uint64_t</a>, aligned_mediump_uint64_t, 8);</div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;</div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">mediump_u8</a>, aligned_mediump_u8, 1);</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;</div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">mediump_u16</a>, aligned_mediump_u16, 2);</div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;</div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">mediump_u32</a>, aligned_mediump_u32, 4);</div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;</div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">mediump_u64</a>, aligned_mediump_u64, 8);</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;</div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">highp_uint8</a>, aligned_highp_uint8, 1);</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;</div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">highp_uint16</a>, aligned_highp_uint16, 2);</div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;</div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">highp_uint32</a>, aligned_highp_uint32, 4);</div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;</div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">highp_uint64</a>, aligned_highp_uint64, 8);</div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;</div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;</div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">highp_uint8_t</a>, aligned_highp_uint8_t, 1);</div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;</div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">highp_uint16_t</a>, aligned_highp_uint16_t, 2);</div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;</div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">highp_uint32_t</a>, aligned_highp_uint32_t, 4);</div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;</div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\">  462</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">highp_uint64_t</a>, aligned_highp_uint64_t, 8);</div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;</div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;</div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\">  467</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">highp_u8</a>, aligned_highp_u8, 1);</div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;</div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\">  471</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">highp_u16</a>, aligned_highp_u16, 2);</div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;</div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\">  475</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">highp_u32</a>, aligned_highp_u32, 4);</div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;</div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">highp_u64</a>, aligned_highp_u64, 8);</div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;</div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;</div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\">  484</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(uint8, aligned_uint8, 1);</div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;</div>\n<div class=\"line\"><a name=\"l00488\"></a><span class=\"lineno\">  488</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(uint16, aligned_uint16, 2);</div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\">  489</span>&#160;</div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(uint32, aligned_uint32, 4);</div>\n<div class=\"line\"><a name=\"l00493\"></a><span class=\"lineno\">  493</span>&#160;</div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(uint64, aligned_uint64, 8);</div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\">  497</span>&#160;</div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;</div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">uint8_t</a>, aligned_uint8_t, 1);</div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;</div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">uint16_t</a>, aligned_uint16_t, 2);</div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;</div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">uint32_t</a>, aligned_uint32_t, 4);</div>\n<div class=\"line\"><a name=\"l00510\"></a><span class=\"lineno\">  510</span>&#160;</div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">uint64_t</a>, aligned_uint64_t, 8);</div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\">  514</span>&#160;</div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;</div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">u8</a>, aligned_u8, 1);</div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;</div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">u16</a>, aligned_u16, 2);</div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\">  523</span>&#160;</div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">u32</a>, aligned_u32, 4);</div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;</div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">u64</a>, aligned_u64, 8);</div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;</div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;</div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(uvec1, <a class=\"code\" href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">aligned_uvec1</a>, 4);</div>\n<div class=\"line\"><a name=\"l00536\"></a><span class=\"lineno\">  536</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a>, <a class=\"code\" href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">aligned_uvec2</a>, 8);</div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;</div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">uvec3</a>, <a class=\"code\" href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">aligned_uvec3</a>, 16);</div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;</div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a>, <a class=\"code\" href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">aligned_uvec4</a>, 16);</div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;</div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\">  549</span>&#160;</div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">u8vec1</a>, aligned_u8vec1, 1);</div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;</div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a>, aligned_u8vec2, 2);</div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;</div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">u8vec3</a>, aligned_u8vec3, 4);</div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;</div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a>, aligned_u8vec4, 4);</div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;</div>\n<div class=\"line\"><a name=\"l00566\"></a><span class=\"lineno\">  566</span>&#160;</div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">u16vec1</a>, aligned_u16vec1, 2);</div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a>, aligned_u16vec2, 4);</div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;</div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">u16vec3</a>, aligned_u16vec3, 8);</div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;</div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a>, aligned_u16vec4, 8);</div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;</div>\n<div class=\"line\"><a name=\"l00583\"></a><span class=\"lineno\">  583</span>&#160;</div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\">  586</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>, aligned_u32vec1, 4);</div>\n<div class=\"line\"><a name=\"l00587\"></a><span class=\"lineno\">  587</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>, aligned_u32vec2, 8);</div>\n<div class=\"line\"><a name=\"l00591\"></a><span class=\"lineno\">  591</span>&#160;</div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>, aligned_u32vec3, 16);</div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\">  595</span>&#160;</div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\">  598</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>, aligned_u32vec4, 16);</div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;</div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;</div>\n<div class=\"line\"><a name=\"l00603\"></a><span class=\"lineno\">  603</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">u64vec1</a>, aligned_u64vec1, 8);</div>\n<div class=\"line\"><a name=\"l00604\"></a><span class=\"lineno\">  604</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00607\"></a><span class=\"lineno\">  607</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">u64vec2</a>, aligned_u64vec2, 16);</div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;</div>\n<div class=\"line\"><a name=\"l00611\"></a><span class=\"lineno\">  611</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">u64vec3</a>, aligned_u64vec3, 32);</div>\n<div class=\"line\"><a name=\"l00612\"></a><span class=\"lineno\">  612</span>&#160;</div>\n<div class=\"line\"><a name=\"l00615\"></a><span class=\"lineno\">  615</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">u64vec4</a>, aligned_u64vec4, 32);</div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;</div>\n<div class=\"line\"><a name=\"l00617\"></a><span class=\"lineno\">  617</span>&#160;</div>\n<div class=\"line\"><a name=\"l00619\"></a><span class=\"lineno\">  619</span>&#160;        <span class=\"comment\">// Float vector types</span></div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;</div>\n<div class=\"line\"><a name=\"l00623\"></a><span class=\"lineno\">  623</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(float32, aligned_float32, 4);</div>\n<div class=\"line\"><a name=\"l00624\"></a><span class=\"lineno\">  624</span>&#160;</div>\n<div class=\"line\"><a name=\"l00627\"></a><span class=\"lineno\">  627</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(float64, aligned_float64, 8);</div>\n<div class=\"line\"><a name=\"l00628\"></a><span class=\"lineno\">  628</span>&#160;</div>\n<div class=\"line\"><a name=\"l00629\"></a><span class=\"lineno\">  629</span>&#160;</div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">float32_t</a>, aligned_float32_t, 4);</div>\n<div class=\"line\"><a name=\"l00633\"></a><span class=\"lineno\">  633</span>&#160;</div>\n<div class=\"line\"><a name=\"l00636\"></a><span class=\"lineno\">  636</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">float64_t</a>, aligned_float64_t, 8);</div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;</div>\n<div class=\"line\"><a name=\"l00638\"></a><span class=\"lineno\">  638</span>&#160;</div>\n<div class=\"line\"><a name=\"l00641\"></a><span class=\"lineno\">  641</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(float32, aligned_f32, 4);</div>\n<div class=\"line\"><a name=\"l00642\"></a><span class=\"lineno\">  642</span>&#160;</div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(float64, aligned_f64, 8);</div>\n<div class=\"line\"><a name=\"l00646\"></a><span class=\"lineno\">  646</span>&#160;</div>\n<div class=\"line\"><a name=\"l00647\"></a><span class=\"lineno\">  647</span>&#160;</div>\n<div class=\"line\"><a name=\"l00650\"></a><span class=\"lineno\">  650</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(vec1, <a class=\"code\" href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">aligned_vec1</a>, 4);</div>\n<div class=\"line\"><a name=\"l00651\"></a><span class=\"lineno\">  651</span>&#160;</div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a>, <a class=\"code\" href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">aligned_vec2</a>, 8);</div>\n<div class=\"line\"><a name=\"l00655\"></a><span class=\"lineno\">  655</span>&#160;</div>\n<div class=\"line\"><a name=\"l00658\"></a><span class=\"lineno\">  658</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a>, <a class=\"code\" href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">aligned_vec3</a>, 16);</div>\n<div class=\"line\"><a name=\"l00659\"></a><span class=\"lineno\">  659</span>&#160;</div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a>, <a class=\"code\" href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">aligned_vec4</a>, 16);</div>\n<div class=\"line\"><a name=\"l00663\"></a><span class=\"lineno\">  663</span>&#160;</div>\n<div class=\"line\"><a name=\"l00664\"></a><span class=\"lineno\">  664</span>&#160;</div>\n<div class=\"line\"><a name=\"l00667\"></a><span class=\"lineno\">  667</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">fvec1</a>, aligned_fvec1, 4);</div>\n<div class=\"line\"><a name=\"l00668\"></a><span class=\"lineno\">  668</span>&#160;</div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\">  671</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">fvec2</a>, aligned_fvec2, 8);</div>\n<div class=\"line\"><a name=\"l00672\"></a><span class=\"lineno\">  672</span>&#160;</div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">fvec3</a>, aligned_fvec3, 16);</div>\n<div class=\"line\"><a name=\"l00676\"></a><span class=\"lineno\">  676</span>&#160;</div>\n<div class=\"line\"><a name=\"l00679\"></a><span class=\"lineno\">  679</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">fvec4</a>, aligned_fvec4, 16);</div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;</div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00684\"></a><span class=\"lineno\">  684</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">f32vec1</a>, aligned_f32vec1, 4);</div>\n<div class=\"line\"><a name=\"l00685\"></a><span class=\"lineno\">  685</span>&#160;</div>\n<div class=\"line\"><a name=\"l00688\"></a><span class=\"lineno\">  688</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">f32vec2</a>, aligned_f32vec2, 8);</div>\n<div class=\"line\"><a name=\"l00689\"></a><span class=\"lineno\">  689</span>&#160;</div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\">  692</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">f32vec3</a>, aligned_f32vec3, 16);</div>\n<div class=\"line\"><a name=\"l00693\"></a><span class=\"lineno\">  693</span>&#160;</div>\n<div class=\"line\"><a name=\"l00696\"></a><span class=\"lineno\">  696</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">f32vec4</a>, aligned_f32vec4, 16);</div>\n<div class=\"line\"><a name=\"l00697\"></a><span class=\"lineno\">  697</span>&#160;</div>\n<div class=\"line\"><a name=\"l00698\"></a><span class=\"lineno\">  698</span>&#160;</div>\n<div class=\"line\"><a name=\"l00701\"></a><span class=\"lineno\">  701</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(dvec1, <a class=\"code\" href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">aligned_dvec1</a>, 8);</div>\n<div class=\"line\"><a name=\"l00702\"></a><span class=\"lineno\">  702</span>&#160;</div>\n<div class=\"line\"><a name=\"l00705\"></a><span class=\"lineno\">  705</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">dvec2</a>, <a class=\"code\" href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">aligned_dvec2</a>, 16);</div>\n<div class=\"line\"><a name=\"l00706\"></a><span class=\"lineno\">  706</span>&#160;</div>\n<div class=\"line\"><a name=\"l00709\"></a><span class=\"lineno\">  709</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">dvec3</a>, <a class=\"code\" href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">aligned_dvec3</a>, 32);</div>\n<div class=\"line\"><a name=\"l00710\"></a><span class=\"lineno\">  710</span>&#160;</div>\n<div class=\"line\"><a name=\"l00713\"></a><span class=\"lineno\">  713</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">dvec4</a>, <a class=\"code\" href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">aligned_dvec4</a>, 32);</div>\n<div class=\"line\"><a name=\"l00714\"></a><span class=\"lineno\">  714</span>&#160;</div>\n<div class=\"line\"><a name=\"l00715\"></a><span class=\"lineno\">  715</span>&#160;</div>\n<div class=\"line\"><a name=\"l00718\"></a><span class=\"lineno\">  718</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">f64vec1</a>, aligned_f64vec1, 8);</div>\n<div class=\"line\"><a name=\"l00719\"></a><span class=\"lineno\">  719</span>&#160;</div>\n<div class=\"line\"><a name=\"l00722\"></a><span class=\"lineno\">  722</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">f64vec2</a>, aligned_f64vec2, 16);</div>\n<div class=\"line\"><a name=\"l00723\"></a><span class=\"lineno\">  723</span>&#160;</div>\n<div class=\"line\"><a name=\"l00726\"></a><span class=\"lineno\">  726</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">f64vec3</a>, aligned_f64vec3, 32);</div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;</div>\n<div class=\"line\"><a name=\"l00730\"></a><span class=\"lineno\">  730</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">f64vec4</a>, aligned_f64vec4, 32);</div>\n<div class=\"line\"><a name=\"l00731\"></a><span class=\"lineno\">  731</span>&#160;</div>\n<div class=\"line\"><a name=\"l00732\"></a><span class=\"lineno\">  732</span>&#160;</div>\n<div class=\"line\"><a name=\"l00734\"></a><span class=\"lineno\">  734</span>&#160;        <span class=\"comment\">// Float matrix types </span></div>\n<div class=\"line\"><a name=\"l00735\"></a><span class=\"lineno\">  735</span>&#160;</div>\n<div class=\"line\"><a name=\"l00738\"></a><span class=\"lineno\">  738</span>&#160;        <span class=\"comment\">//typedef detail::tmat1&lt;f32&gt; mat1;</span></div>\n<div class=\"line\"><a name=\"l00739\"></a><span class=\"lineno\">  739</span>&#160;</div>\n<div class=\"line\"><a name=\"l00742\"></a><span class=\"lineno\">  742</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">mat2</a>, aligned_mat2, 16);</div>\n<div class=\"line\"><a name=\"l00743\"></a><span class=\"lineno\">  743</span>&#160;</div>\n<div class=\"line\"><a name=\"l00746\"></a><span class=\"lineno\">  746</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">mat3</a>, aligned_mat3, 16);</div>\n<div class=\"line\"><a name=\"l00747\"></a><span class=\"lineno\">  747</span>&#160;</div>\n<div class=\"line\"><a name=\"l00750\"></a><span class=\"lineno\">  750</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">mat4</a>, aligned_mat4, 16);</div>\n<div class=\"line\"><a name=\"l00751\"></a><span class=\"lineno\">  751</span>&#160;</div>\n<div class=\"line\"><a name=\"l00752\"></a><span class=\"lineno\">  752</span>&#160;</div>\n<div class=\"line\"><a name=\"l00755\"></a><span class=\"lineno\">  755</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f32&gt; mat1;</span></div>\n<div class=\"line\"><a name=\"l00756\"></a><span class=\"lineno\">  756</span>&#160;</div>\n<div class=\"line\"><a name=\"l00759\"></a><span class=\"lineno\">  759</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">mat2x2</a>, aligned_mat2x2, 16);</div>\n<div class=\"line\"><a name=\"l00760\"></a><span class=\"lineno\">  760</span>&#160;</div>\n<div class=\"line\"><a name=\"l00763\"></a><span class=\"lineno\">  763</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">mat3x3</a>, aligned_mat3x3, 16);</div>\n<div class=\"line\"><a name=\"l00764\"></a><span class=\"lineno\">  764</span>&#160;</div>\n<div class=\"line\"><a name=\"l00767\"></a><span class=\"lineno\">  767</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">mat4x4</a>, aligned_mat4x4, 16);</div>\n<div class=\"line\"><a name=\"l00768\"></a><span class=\"lineno\">  768</span>&#160;</div>\n<div class=\"line\"><a name=\"l00769\"></a><span class=\"lineno\">  769</span>&#160;</div>\n<div class=\"line\"><a name=\"l00772\"></a><span class=\"lineno\">  772</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f32&gt; fmat1;</span></div>\n<div class=\"line\"><a name=\"l00773\"></a><span class=\"lineno\">  773</span>&#160;</div>\n<div class=\"line\"><a name=\"l00776\"></a><span class=\"lineno\">  776</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a>, aligned_fmat2, 16);</div>\n<div class=\"line\"><a name=\"l00777\"></a><span class=\"lineno\">  777</span>&#160;</div>\n<div class=\"line\"><a name=\"l00780\"></a><span class=\"lineno\">  780</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a>, aligned_fmat3, 16);</div>\n<div class=\"line\"><a name=\"l00781\"></a><span class=\"lineno\">  781</span>&#160;</div>\n<div class=\"line\"><a name=\"l00784\"></a><span class=\"lineno\">  784</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a>, aligned_fmat4, 16);</div>\n<div class=\"line\"><a name=\"l00785\"></a><span class=\"lineno\">  785</span>&#160;</div>\n<div class=\"line\"><a name=\"l00786\"></a><span class=\"lineno\">  786</span>&#160;</div>\n<div class=\"line\"><a name=\"l00789\"></a><span class=\"lineno\">  789</span>&#160;        <span class=\"comment\">//typedef f32 fmat1x1;</span></div>\n<div class=\"line\"><a name=\"l00790\"></a><span class=\"lineno\">  790</span>&#160;</div>\n<div class=\"line\"><a name=\"l00793\"></a><span class=\"lineno\">  793</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a>, aligned_fmat2x2, 16);</div>\n<div class=\"line\"><a name=\"l00794\"></a><span class=\"lineno\">  794</span>&#160;</div>\n<div class=\"line\"><a name=\"l00797\"></a><span class=\"lineno\">  797</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">fmat2x3</a>, aligned_fmat2x3, 16);</div>\n<div class=\"line\"><a name=\"l00798\"></a><span class=\"lineno\">  798</span>&#160;</div>\n<div class=\"line\"><a name=\"l00801\"></a><span class=\"lineno\">  801</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">fmat2x4</a>, aligned_fmat2x4, 16);</div>\n<div class=\"line\"><a name=\"l00802\"></a><span class=\"lineno\">  802</span>&#160;</div>\n<div class=\"line\"><a name=\"l00805\"></a><span class=\"lineno\">  805</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">fmat3x2</a>, aligned_fmat3x2, 16);</div>\n<div class=\"line\"><a name=\"l00806\"></a><span class=\"lineno\">  806</span>&#160;</div>\n<div class=\"line\"><a name=\"l00809\"></a><span class=\"lineno\">  809</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a>, aligned_fmat3x3, 16);</div>\n<div class=\"line\"><a name=\"l00810\"></a><span class=\"lineno\">  810</span>&#160;</div>\n<div class=\"line\"><a name=\"l00813\"></a><span class=\"lineno\">  813</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">fmat3x4</a>, aligned_fmat3x4, 16);</div>\n<div class=\"line\"><a name=\"l00814\"></a><span class=\"lineno\">  814</span>&#160;</div>\n<div class=\"line\"><a name=\"l00817\"></a><span class=\"lineno\">  817</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">fmat4x2</a>, aligned_fmat4x2, 16);</div>\n<div class=\"line\"><a name=\"l00818\"></a><span class=\"lineno\">  818</span>&#160;</div>\n<div class=\"line\"><a name=\"l00821\"></a><span class=\"lineno\">  821</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">fmat4x3</a>, aligned_fmat4x3, 16);</div>\n<div class=\"line\"><a name=\"l00822\"></a><span class=\"lineno\">  822</span>&#160;</div>\n<div class=\"line\"><a name=\"l00825\"></a><span class=\"lineno\">  825</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a>, aligned_fmat4x4, 16);</div>\n<div class=\"line\"><a name=\"l00826\"></a><span class=\"lineno\">  826</span>&#160;</div>\n<div class=\"line\"><a name=\"l00827\"></a><span class=\"lineno\">  827</span>&#160;</div>\n<div class=\"line\"><a name=\"l00830\"></a><span class=\"lineno\">  830</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f32, defaultp&gt; f32mat1;</span></div>\n<div class=\"line\"><a name=\"l00831\"></a><span class=\"lineno\">  831</span>&#160;</div>\n<div class=\"line\"><a name=\"l00834\"></a><span class=\"lineno\">  834</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a>, aligned_f32mat2, 16);</div>\n<div class=\"line\"><a name=\"l00835\"></a><span class=\"lineno\">  835</span>&#160;</div>\n<div class=\"line\"><a name=\"l00838\"></a><span class=\"lineno\">  838</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a>, aligned_f32mat3, 16);</div>\n<div class=\"line\"><a name=\"l00839\"></a><span class=\"lineno\">  839</span>&#160;</div>\n<div class=\"line\"><a name=\"l00842\"></a><span class=\"lineno\">  842</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a>, aligned_f32mat4, 16);</div>\n<div class=\"line\"><a name=\"l00843\"></a><span class=\"lineno\">  843</span>&#160;</div>\n<div class=\"line\"><a name=\"l00844\"></a><span class=\"lineno\">  844</span>&#160;</div>\n<div class=\"line\"><a name=\"l00847\"></a><span class=\"lineno\">  847</span>&#160;        <span class=\"comment\">//typedef f32 f32mat1x1;</span></div>\n<div class=\"line\"><a name=\"l00848\"></a><span class=\"lineno\">  848</span>&#160;</div>\n<div class=\"line\"><a name=\"l00851\"></a><span class=\"lineno\">  851</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a>, aligned_f32mat2x2, 16);</div>\n<div class=\"line\"><a name=\"l00852\"></a><span class=\"lineno\">  852</span>&#160;</div>\n<div class=\"line\"><a name=\"l00855\"></a><span class=\"lineno\">  855</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">f32mat2x3</a>, aligned_f32mat2x3, 16);</div>\n<div class=\"line\"><a name=\"l00856\"></a><span class=\"lineno\">  856</span>&#160;</div>\n<div class=\"line\"><a name=\"l00859\"></a><span class=\"lineno\">  859</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">f32mat2x4</a>, aligned_f32mat2x4, 16);</div>\n<div class=\"line\"><a name=\"l00860\"></a><span class=\"lineno\">  860</span>&#160;</div>\n<div class=\"line\"><a name=\"l00863\"></a><span class=\"lineno\">  863</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">f32mat3x2</a>, aligned_f32mat3x2, 16);</div>\n<div class=\"line\"><a name=\"l00864\"></a><span class=\"lineno\">  864</span>&#160;</div>\n<div class=\"line\"><a name=\"l00867\"></a><span class=\"lineno\">  867</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a>, aligned_f32mat3x3, 16);</div>\n<div class=\"line\"><a name=\"l00868\"></a><span class=\"lineno\">  868</span>&#160;</div>\n<div class=\"line\"><a name=\"l00871\"></a><span class=\"lineno\">  871</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">f32mat3x4</a>, aligned_f32mat3x4, 16);</div>\n<div class=\"line\"><a name=\"l00872\"></a><span class=\"lineno\">  872</span>&#160;</div>\n<div class=\"line\"><a name=\"l00875\"></a><span class=\"lineno\">  875</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">f32mat4x2</a>, aligned_f32mat4x2, 16);</div>\n<div class=\"line\"><a name=\"l00876\"></a><span class=\"lineno\">  876</span>&#160;</div>\n<div class=\"line\"><a name=\"l00879\"></a><span class=\"lineno\">  879</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">f32mat4x3</a>, aligned_f32mat4x3, 16);</div>\n<div class=\"line\"><a name=\"l00880\"></a><span class=\"lineno\">  880</span>&#160;</div>\n<div class=\"line\"><a name=\"l00883\"></a><span class=\"lineno\">  883</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a>, aligned_f32mat4x4, 16);</div>\n<div class=\"line\"><a name=\"l00884\"></a><span class=\"lineno\">  884</span>&#160;</div>\n<div class=\"line\"><a name=\"l00885\"></a><span class=\"lineno\">  885</span>&#160;</div>\n<div class=\"line\"><a name=\"l00888\"></a><span class=\"lineno\">  888</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f64, defaultp&gt; f64mat1;</span></div>\n<div class=\"line\"><a name=\"l00889\"></a><span class=\"lineno\">  889</span>&#160;</div>\n<div class=\"line\"><a name=\"l00892\"></a><span class=\"lineno\">  892</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a>, aligned_f64mat2, 32);</div>\n<div class=\"line\"><a name=\"l00893\"></a><span class=\"lineno\">  893</span>&#160;</div>\n<div class=\"line\"><a name=\"l00896\"></a><span class=\"lineno\">  896</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a>, aligned_f64mat3, 32);</div>\n<div class=\"line\"><a name=\"l00897\"></a><span class=\"lineno\">  897</span>&#160;</div>\n<div class=\"line\"><a name=\"l00900\"></a><span class=\"lineno\">  900</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a>, aligned_f64mat4, 32);</div>\n<div class=\"line\"><a name=\"l00901\"></a><span class=\"lineno\">  901</span>&#160;</div>\n<div class=\"line\"><a name=\"l00902\"></a><span class=\"lineno\">  902</span>&#160;</div>\n<div class=\"line\"><a name=\"l00905\"></a><span class=\"lineno\">  905</span>&#160;        <span class=\"comment\">//typedef f64 f64mat1x1;</span></div>\n<div class=\"line\"><a name=\"l00906\"></a><span class=\"lineno\">  906</span>&#160;</div>\n<div class=\"line\"><a name=\"l00909\"></a><span class=\"lineno\">  909</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a>, aligned_f64mat2x2, 32);</div>\n<div class=\"line\"><a name=\"l00910\"></a><span class=\"lineno\">  910</span>&#160;</div>\n<div class=\"line\"><a name=\"l00913\"></a><span class=\"lineno\">  913</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">f64mat2x3</a>, aligned_f64mat2x3, 32);</div>\n<div class=\"line\"><a name=\"l00914\"></a><span class=\"lineno\">  914</span>&#160;</div>\n<div class=\"line\"><a name=\"l00917\"></a><span class=\"lineno\">  917</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">f64mat2x4</a>, aligned_f64mat2x4, 32);</div>\n<div class=\"line\"><a name=\"l00918\"></a><span class=\"lineno\">  918</span>&#160;</div>\n<div class=\"line\"><a name=\"l00921\"></a><span class=\"lineno\">  921</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">f64mat3x2</a>, aligned_f64mat3x2, 32);</div>\n<div class=\"line\"><a name=\"l00922\"></a><span class=\"lineno\">  922</span>&#160;</div>\n<div class=\"line\"><a name=\"l00925\"></a><span class=\"lineno\">  925</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a>, aligned_f64mat3x3, 32);</div>\n<div class=\"line\"><a name=\"l00926\"></a><span class=\"lineno\">  926</span>&#160;</div>\n<div class=\"line\"><a name=\"l00929\"></a><span class=\"lineno\">  929</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">f64mat3x4</a>, aligned_f64mat3x4, 32);</div>\n<div class=\"line\"><a name=\"l00930\"></a><span class=\"lineno\">  930</span>&#160;</div>\n<div class=\"line\"><a name=\"l00933\"></a><span class=\"lineno\">  933</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">f64mat4x2</a>, aligned_f64mat4x2, 32);</div>\n<div class=\"line\"><a name=\"l00934\"></a><span class=\"lineno\">  934</span>&#160;</div>\n<div class=\"line\"><a name=\"l00937\"></a><span class=\"lineno\">  937</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">f64mat4x3</a>, aligned_f64mat4x3, 32);</div>\n<div class=\"line\"><a name=\"l00938\"></a><span class=\"lineno\">  938</span>&#160;</div>\n<div class=\"line\"><a name=\"l00941\"></a><span class=\"lineno\">  941</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a>, aligned_f64mat4x4, 32);</div>\n<div class=\"line\"><a name=\"l00942\"></a><span class=\"lineno\">  942</span>&#160;</div>\n<div class=\"line\"><a name=\"l00943\"></a><span class=\"lineno\">  943</span>&#160;</div>\n<div class=\"line\"><a name=\"l00945\"></a><span class=\"lineno\">  945</span>&#160;        <span class=\"comment\">// Quaternion types</span></div>\n<div class=\"line\"><a name=\"l00946\"></a><span class=\"lineno\">  946</span>&#160;</div>\n<div class=\"line\"><a name=\"l00949\"></a><span class=\"lineno\">  949</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(quat, aligned_quat, 16);</div>\n<div class=\"line\"><a name=\"l00950\"></a><span class=\"lineno\">  950</span>&#160;</div>\n<div class=\"line\"><a name=\"l00953\"></a><span class=\"lineno\">  953</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(fquat, aligned_fquat, 16);</div>\n<div class=\"line\"><a name=\"l00954\"></a><span class=\"lineno\">  954</span>&#160;</div>\n<div class=\"line\"><a name=\"l00957\"></a><span class=\"lineno\">  957</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(dquat, aligned_dquat, 32);</div>\n<div class=\"line\"><a name=\"l00958\"></a><span class=\"lineno\">  958</span>&#160;</div>\n<div class=\"line\"><a name=\"l00961\"></a><span class=\"lineno\">  961</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">f32quat</a>, aligned_f32quat, 16);</div>\n<div class=\"line\"><a name=\"l00962\"></a><span class=\"lineno\">  962</span>&#160;</div>\n<div class=\"line\"><a name=\"l00965\"></a><span class=\"lineno\">  965</span>&#160;        <a class=\"code\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a>(<a class=\"code\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">f64quat</a>, aligned_f64quat, 32);</div>\n<div class=\"line\"><a name=\"l00966\"></a><span class=\"lineno\">  966</span>&#160;</div>\n<div class=\"line\"><a name=\"l00968\"></a><span class=\"lineno\">  968</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00969\"></a><span class=\"lineno\">  969</span>&#160;</div>\n<div class=\"line\"><a name=\"l00970\"></a><span class=\"lineno\">  970</span>&#160;<span class=\"preprocessor\">#include &quot;type_aligned.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00165_html_gaea5c4518e175162e306d2c2b5ef5ac79\"><div class=\"ttname\"><a href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">glm::f32vec3</a></div><div class=\"ttdeci\">highp_f32vec3 f32vec3</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02407\">fwd.hpp:2407</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadc4e1594f9555d919131ee02b17822a2\"><div class=\"ttname\"><a href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">glm::f64vec2</a></div><div class=\"ttdeci\">highp_f64vec2 f64vec2</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02509\">fwd.hpp:2509</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga727675ac6b5d2fc699520e0059735e25\"><div class=\"ttname\"><a href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">glm::highp_i32</a></div><div class=\"ttdeci\">detail::int32 highp_i32</div><div class=\"ttdoc\">High qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00238\">fwd.hpp:238</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaaa26c41d168dc00be0fe55f4d0a34224\"><div class=\"ttname\"><a href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">glm::ivec4</a></div><div class=\"ttdeci\">highp_ivec4 ivec4</div><div class=\"ttdoc\">4 components vector of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00521\">type_vec.hpp:521</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa6a5b461bbf5fe20982472aa51896d4b\"><div class=\"ttname\"><a href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">glm::lowp_uint32</a></div><div class=\"ttdeci\">detail::uint32 lowp_uint32</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00713\">fwd.hpp:713</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9df98857be695d5a30cb30f5bfa38a80\"><div class=\"ttname\"><a href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">glm::mediump_u16</a></div><div class=\"ttdeci\">detail::uint16 mediump_u16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00793\">fwd.hpp:793</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2af9490085ae3bdf36a544e9dd073610\"><div class=\"ttname\"><a href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">glm::mediump_u64</a></div><div class=\"ttdeci\">detail::uint64 mediump_u64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00801\">fwd.hpp:801</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf49470869e9be2c059629b250619804e\"><div class=\"ttname\"><a href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">glm::lowp_uint8</a></div><div class=\"ttdeci\">detail::uint8 lowp_uint8</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00705\">fwd.hpp:705</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga1ff8ed402c93d280ff0597c1c5e7c548\"><div class=\"ttname\"><a href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">glm::aligned_uvec1</a></div><div class=\"ttdeci\">aligned_highp_uvec1 aligned_uvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00541\">gtc/type_aligned.hpp:541</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6fbd69cbdaa44345bff923a2cf63de7e\"><div class=\"ttname\"><a href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">glm::mediump_int8</a></div><div class=\"ttdeci\">detail::int8 mediump_int8</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00150\">fwd.hpp:150</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7a6f1929464dcc680b16381a4ee5f2cf\"><div class=\"ttname\"><a href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">glm::highp_u32</a></div><div class=\"ttdeci\">detail::uint32 highp_u32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00847\">fwd.hpp:847</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad68bfd9f881856fc863a6ebca0b67f78\"><div class=\"ttname\"><a href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">glm::lowp_uint16</a></div><div class=\"ttdeci\">detail::uint16 lowp_uint16</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00709\">fwd.hpp:709</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gade502df1ce14f837fae7f60a03ddb9b0\"><div class=\"ttname\"><a href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">glm::f64vec1</a></div><div class=\"ttdeci\">highp_f64vec1 f64vec1</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02505\">fwd.hpp:2505</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga8a9f0a4795ccc442fa9901845026f9f5\"><div class=\"ttname\"><a href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">glm::aligned_dvec4</a></div><div class=\"ttdeci\">aligned_highp_dvec4 aligned_dvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of double-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00475\">gtc/type_aligned.hpp:475</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga34aee73784bcc247d426250540c1911c\"><div class=\"ttname\"><a href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">glm::ivec3</a></div><div class=\"ttdeci\">highp_ivec3 ivec3</div><div class=\"ttdoc\">3 components vector of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00516\">type_vec.hpp:516</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga239b96198771b7add8eea7e6b59840c0\"><div class=\"ttname\"><a href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">glm::f32mat4x3</a></div><div class=\"ttdeci\">highp_f32mat4x3 f32mat4x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02443\">fwd.hpp:2443</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga0c84b211a5730357b63c6d2e4fb696d5\"><div class=\"ttname\"><a href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">glm::mat2x2</a></div><div class=\"ttdeci\">highp_mat2x2 mat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00358\">type_mat.hpp:358</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga256b12b650c3f2fb86878fd1c5db8bc3\"><div class=\"ttname\"><a href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">glm::highp_uint32</a></div><div class=\"ttdeci\">detail::uint32 highp_uint32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00815\">fwd.hpp:815</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae3ab5719fc4c1e966631dbbcba8d412a\"><div class=\"ttname\"><a href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">glm::f64mat2x3</a></div><div class=\"ttdeci\">highp_f64mat2x3 f64mat2x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02525\">fwd.hpp:2525</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaab239fa9e35b65a67cbaa6ac082f3675\"><div class=\"ttname\"><a href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">glm::f64mat3x4</a></div><div class=\"ttdeci\">highp_f64mat3x4 f64mat3x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02541\">fwd.hpp:2541</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1c522ca821c27b862fe51cf4024b064b\"><div class=\"ttname\"><a href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">glm::u16vec3</a></div><div class=\"ttdeci\">highp_u16vec3 u16vec3</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01063\">fwd.hpp:1063</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac25db6d2b1e2a0f351b77ba3409ac4cd\"><div class=\"ttname\"><a href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">glm::highp_i64</a></div><div class=\"ttdeci\">detail::int64 highp_i64</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00242\">fwd.hpp:242</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga73c6abb280a45feeff60f9accaee91f3\"><div class=\"ttname\"><a href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">glm::highp_int64_t</a></div><div class=\"ttdeci\">detail::int64 highp_int64_t</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00226\">fwd.hpp:226</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadfe65c78231039e90507770db50c98c7\"><div class=\"ttname\"><a href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">glm::mediump_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 mediump_uint8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00773\">fwd.hpp:773</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1b09f03da7ac43055c68a349d5445083\"><div class=\"ttname\"><a href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">glm::lowp_u8</a></div><div class=\"ttdeci\">detail::uint8 lowp_u8</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00739\">fwd.hpp:739</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf5e94bf2a20af7601787c154751dc2e1\"><div class=\"ttname\"><a href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">glm::mediump_i32</a></div><div class=\"ttdeci\">detail::int32 mediump_i32</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00190\">fwd.hpp:190</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga28d97808322d3c92186e4a0c067d7e8e\"><div class=\"ttname\"><a href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">glm::uint8_t</a></div><div class=\"ttdeci\">detail::uint8 uint8_t</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00879\">fwd.hpp:879</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6af54d70d9beb0a7ef992a879e86b04f\"><div class=\"ttname\"><a href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">glm::fmat3x2</a></div><div class=\"ttdeci\">highp_f32mat3x2 fmat3x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02357\">fwd.hpp:2357</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga6dd3ec98a548755676267e59142911f8\"><div class=\"ttname\"><a href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">glm::mat3</a></div><div class=\"ttdeci\">mat3x3 mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00410\">type_mat.hpp:410</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga701f32ab5b3fb06996b41f5c0d643805\"><div class=\"ttname\"><a href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">glm::f32vec1</a></div><div class=\"ttdeci\">highp_f32vec1 f32vec1</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02399\">fwd.hpp:2399</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga713c796c54875cf4092d42ff9d9096b0\"><div class=\"ttname\"><a href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">glm::fvec4</a></div><div class=\"ttdeci\">highp_f32vec4 fvec4</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02341\">fwd.hpp:2341</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacb88796f2d08ef253d0345aff20c3aee\"><div class=\"ttname\"><a href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">glm::highp_i8</a></div><div class=\"ttdeci\">detail::int8 highp_i8</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00230\">fwd.hpp:230</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga09d0200e8ff86391d8804b4fefd5f1da\"><div class=\"ttname\"><a href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">glm::vec2</a></div><div class=\"ttdeci\">highp_vec2 vec2</div><div class=\"ttdoc\">2 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00457\">type_vec.hpp:457</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga322a7d7d2c2c68994dc872a33de63c61\"><div class=\"ttname\"><a href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">glm::int64_t</a></div><div class=\"ttdeci\">detail::int64 int64_t</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00282\">fwd.hpp:282</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7f526b5cccef126a2ebcf9bdd890394e\"><div class=\"ttname\"><a href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">glm::i32vec3</a></div><div class=\"ttdeci\">highp_i32vec3 i32vec3</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00533\">fwd.hpp:533</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf1b735b4b1145174f4e4167d13778f9b\"><div class=\"ttname\"><a href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">glm::lowp_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 lowp_uint32_t</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00730\">fwd.hpp:730</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga2a8d9c3046f89d854eb758adfa0811c0\"><div class=\"ttname\"><a href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">glm::aligned_uvec3</a></div><div class=\"ttdeci\">aligned_highp_uvec3 aligned_uvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00547\">gtc/type_aligned.hpp:547</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gaa37869eea77d28419b2fb0ff70b69bf0\"><div class=\"ttname\"><a href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">glm::aligned_dvec3</a></div><div class=\"ttdeci\">aligned_highp_dvec3 aligned_dvec3</div><div class=\"ttdoc\">3 components vector aligned in memory of double-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00472\">gtc/type_aligned.hpp:472</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7b968f2b86a0442a89c7359171e1d866\"><div class=\"ttname\"><a href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">glm::mediump_int64</a></div><div class=\"ttdeci\">detail::int64 mediump_int64</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00162\">fwd.hpp:162</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4f072ada9552e1e480bbb3b1acde5250\"><div class=\"ttname\"><a href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">glm::lowp_u32</a></div><div class=\"ttdeci\">detail::uint32 lowp_u32</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00747\">fwd.hpp:747</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4177a44206121dabc8c4ff1c0f544574\"><div class=\"ttname\"><a href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">glm::i8vec4</a></div><div class=\"ttdeci\">highp_i8vec4 i8vec4</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00378\">fwd.hpp:378</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga0682462f8096a226773e20fac993cde5\"><div class=\"ttname\"><a href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">glm::aligned_vec2</a></div><div class=\"ttdeci\">aligned_highp_vec2 aligned_vec2</div><div class=\"ttdoc\">2 components vector aligned in memory of single-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00425\">gtc/type_aligned.hpp:425</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5fde0fa4a3852a9dd5d637a92ee74718\"><div class=\"ttname\"><a href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">glm::highp_int16</a></div><div class=\"ttdeci\">detail::int16 highp_int16</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00202\">fwd.hpp:202</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8c8aa45aafcc23238edb1d5aeb801774\"><div class=\"ttname\"><a href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">glm::fmat4x2</a></div><div class=\"ttdeci\">highp_f32mat4x2 fmat4x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02369\">fwd.hpp:2369</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac87278e0c702ba8afff76316d4eeb769\"><div class=\"ttname\"><a href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">glm::f64mat2x4</a></div><div class=\"ttdeci\">highp_f64mat2x4 f64mat2x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02529\">fwd.hpp:2529</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1bd0e914158bf03135f8a317de6debe9\"><div class=\"ttname\"><a href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">glm::mediump_u32</a></div><div class=\"ttdeci\">detail::uint32 mediump_u32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00797\">fwd.hpp:797</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9b170dd4a8f38448a2dc93987c7875e9\"><div class=\"ttname\"><a href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">glm::mediump_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 mediump_uint64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00785\">fwd.hpp:785</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2a78447eb9d66a114b193f4a25899c16\"><div class=\"ttname\"><a href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">glm::u16vec2</a></div><div class=\"ttdeci\">highp_u16vec2 u16vec2</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01059\">fwd.hpp:1059</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga65261fa8a21045c8646ddff114a56174\"><div class=\"ttname\"><a href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">glm::f32mat3x3</a></div><div class=\"ttdeci\">highp_f32mat3x3 f32mat3x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02431\">fwd.hpp:2431</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae267358ff2a41d156d97f5762630235a\"><div class=\"ttname\"><a href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">glm::u32vec3</a></div><div class=\"ttdeci\">highp_u32vec3 u32vec3</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01142\">fwd.hpp:1142</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga05e6d4c908965d04191c2070a8d0a65e\"><div class=\"ttname\"><a href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">glm::aligned_vec1</a></div><div class=\"ttdeci\">aligned_highp_vec1 aligned_vec1</div><div class=\"ttdoc\">1 component vector aligned in memory of single-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00422\">gtc/type_aligned.hpp:422</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacd1259f3a9e8d2a9df5be2d74322ef9c\"><div class=\"ttname\"><a href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">glm::highp_u8</a></div><div class=\"ttdeci\">detail::uint8 highp_u8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00839\">fwd.hpp:839</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3945dd6515d4498cb603e65ff867ab03\"><div class=\"ttname\"><a href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">glm::u64vec4</a></div><div class=\"ttdeci\">highp_u64vec4 u64vec4</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01305\">fwd.hpp:1305</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae627372cfd5f20dd87db490387b71195\"><div class=\"ttname\"><a href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">glm::u32vec1</a></div><div class=\"ttdeci\">highp_u32vec1 u32vec1</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01134\">fwd.hpp:1134</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf645b1a60203b39c0207baff5e3d8c3c\"><div class=\"ttname\"><a href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">glm::lowp_int64</a></div><div class=\"ttdeci\">detail::int64 lowp_int64</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00114\">fwd.hpp:114</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga529496d75775fb656a07993ea9af2450\"><div class=\"ttname\"><a href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">glm::u16vec4</a></div><div class=\"ttdeci\">highp_u16vec4 u16vec4</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01067\">fwd.hpp:1067</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gabf842c45eea186170c267a328e3f3b7d\"><div class=\"ttname\"><a href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">glm::aligned_uvec4</a></div><div class=\"ttdeci\">aligned_highp_uvec4 aligned_uvec4</div><div class=\"ttdoc\">4 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00550\">gtc/type_aligned.hpp:550</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2473d8bf3f4abf967c4d0e18175be6f7\"><div class=\"ttname\"><a href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">glm::f64mat3x2</a></div><div class=\"ttdeci\">highp_f64mat3x2 f64mat3x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02533\">fwd.hpp:2533</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadff3608baa4b5bd3ed28f95c1c2c345d\"><div class=\"ttname\"><a href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">glm::mediump_int16</a></div><div class=\"ttdeci\">detail::int16 mediump_int16</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00154\">fwd.hpp:154</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga29b349e037f0b24320b4548a143daee2\"><div class=\"ttname\"><a href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">glm::u8vec1</a></div><div class=\"ttdeci\">highp_u8vec1 u8vec1</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00975\">fwd.hpp:975</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga31cef34e4cd04840c54741ff2f7005f0\"><div class=\"ttname\"><a href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">glm::u32vec4</a></div><div class=\"ttdeci\">highp_u32vec4 u32vec4</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01146\">fwd.hpp:1146</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3ebcb1f6d8d8387253de8bccb058d77f\"><div class=\"ttname\"><a href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">glm::mediump_i64</a></div><div class=\"ttdeci\">detail::int64 mediump_i64</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00194\">fwd.hpp:194</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacf1ded173e1e2d049c511d095b259e21\"><div class=\"ttname\"><a href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">glm::mediump_i8</a></div><div class=\"ttdeci\">detail::int8 mediump_i8</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00182\">fwd.hpp:182</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7f79eae5927c9033d84617e49f6f34e4\"><div class=\"ttname\"><a href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">glm::aligned_ivec4</a></div><div class=\"ttdeci\">aligned_highp_ivec4 aligned_ivec4</div><div class=\"ttdoc\">4 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00511\">gtc/type_aligned.hpp:511</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga80e72fe94c88498537e8158ba7591c54\"><div class=\"ttname\"><a href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">glm::mediump_int16_t</a></div><div class=\"ttdeci\">detail::int16 mediump_int16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00170\">fwd.hpp:170</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga552a6bde5e75984efb0f863278da2e54\"><div class=\"ttname\"><a href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">glm::lowp_i8</a></div><div class=\"ttdeci\">detail::int8 lowp_i8</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00134\">fwd.hpp:134</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga44e158af77a670ee1b58c03cda9e1619\"><div class=\"ttname\"><a href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">glm::fmat3x4</a></div><div class=\"ttdeci\">highp_f32mat3x4 fmat3x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02365\">fwd.hpp:2365</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gade0eb47c01f79384a6f38017ede17446\"><div class=\"ttname\"><a href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">glm::mat4</a></div><div class=\"ttdeci\">mat4x4 mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00415\">type_mat.hpp:415</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga504ce1631cb2ac02fcf1d44d8c2aa126\"><div class=\"ttname\"><a href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">glm::lowp_u16</a></div><div class=\"ttdeci\">detail::uint16 lowp_u16</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00743\">fwd.hpp:743</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga489b89ba93d4f7b3934df78debc52276\"><div class=\"ttname\"><a href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">glm::u64vec3</a></div><div class=\"ttdeci\">highp_u64vec3 u64vec3</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01301\">fwd.hpp:1301</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga354736e0c645099cd44c42fb2f87c2b8\"><div class=\"ttname\"><a href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">glm::lowp_i64</a></div><div class=\"ttdeci\">detail::int64 lowp_i64</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00146\">fwd.hpp:146</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga6e30cfba068ebc3c71fe1f8b3110e450\"><div class=\"ttname\"><a href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">glm::mat2</a></div><div class=\"ttdeci\">mat2x2 mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00405\">type_mat.hpp:405</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa212b805736a759998e312cbdd550fae\"><div class=\"ttname\"><a href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">glm::lowp_uint64</a></div><div class=\"ttdeci\">detail::uint64 lowp_uint64</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00717\">fwd.hpp:717</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gafbab23070ca47932487d25332adc7d7c\"><div class=\"ttname\"><a href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a></div><div class=\"ttdeci\">highp_vec4 vec4</div><div class=\"ttdoc\">4 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00467\">type_vec.hpp:467</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5a08d36cf7917cd19d081a603d0eae3e\"><div class=\"ttname\"><a href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">glm::i8vec3</a></div><div class=\"ttdeci\">highp_i8vec3 i8vec3</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00374\">fwd.hpp:374</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga24273aa02abaecaab7f160bac437a339\"><div class=\"ttname\"><a href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">glm::fvec2</a></div><div class=\"ttdeci\">highp_f32vec2 fvec2</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02333\">fwd.hpp:2333</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga89930533646b30d021759298aa6bf04a\"><div class=\"ttname\"><a href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">glm::fvec3</a></div><div class=\"ttdeci\">highp_f32vec3 fvec3</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02337\">fwd.hpp:2337</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3963b1050fc65a383ee28e3f827b6e3e\"><div class=\"ttname\"><a href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">glm::mediump_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 mediump_uint16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00777\">fwd.hpp:777</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2996630ba7b10535af8e065cf326f761\"><div class=\"ttname\"><a href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">glm::i16vec2</a></div><div class=\"ttdeci\">highp_i16vec2 i16vec2</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00450\">fwd.hpp:450</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga91c4815f93177eb423362fd296a87e9f\"><div class=\"ttname\"><a href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">glm::lowp_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 lowp_uint16_t</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00726\">fwd.hpp:726</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga089315d5a0c20ac6eaa17a854bbd2e81\"><div class=\"ttname\"><a href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">glm::mat4x4</a></div><div class=\"ttdeci\">highp_mat4x4 mat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00398\">type_mat.hpp:398</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab256cdab5eb582e426d749ae77b5b566\"><div class=\"ttname\"><a href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">glm::f32mat2x3</a></div><div class=\"ttdeci\">highp_f32mat2x3 f32mat2x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02419\">fwd.hpp:2419</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga84ed04b4e0de18c977e932d617e7c223\"><div class=\"ttname\"><a href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">glm::highp_int32</a></div><div class=\"ttdeci\">detail::int32 highp_int32</div><div class=\"ttdoc\">High qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00206\">fwd.hpp:206</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga34dd5ec1988c443bae80f1b20a8ade5f\"><div class=\"ttname\"><a href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">glm::mediump_uint32</a></div><div class=\"ttdeci\">detail::uint32 mediump_uint32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00765\">fwd.hpp:765</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7e80d927ff0a3861ced68dfff8a4020b\"><div class=\"ttname\"><a href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">glm::i8vec1</a></div><div class=\"ttdeci\">highp_i8vec1 i8vec1</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00366\">fwd.hpp:366</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga41d579d81c3d98edd0532244fa02da77\"><div class=\"ttname\"><a href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">glm::float32_t</a></div><div class=\"ttdeci\">highp_float32_t float32_t</div><div class=\"ttdoc\">Default 32 bit single-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01499\">fwd.hpp:1499</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga32794322d294e5ace7fed4a61896f270\"><div class=\"ttname\"><a href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">glm::aligned_ivec3</a></div><div class=\"ttdeci\">aligned_highp_ivec3 aligned_ivec3</div><div class=\"ttdoc\">3 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00508\">gtc/type_aligned.hpp:508</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga4974f46ae5a19415d91316960a53617a\"><div class=\"ttname\"><a href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">glm::aligned_dvec1</a></div><div class=\"ttdeci\">aligned_highp_dvec1 aligned_dvec1</div><div class=\"ttdoc\">1 component vector aligned in memory of double-precision floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00466\">gtc/type_aligned.hpp:466</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga7cf643b66664e0cd3c48759ae66c2bd0\"><div class=\"ttname\"><a href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">glm::aligned_vec3</a></div><div class=\"ttdeci\">aligned_highp_vec3 aligned_vec3</div><div class=\"ttdoc\">3 components vector aligned in memory of single-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00428\">gtc/type_aligned.hpp:428</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2171d9dc1fefb1c82e2817f45b622eac\"><div class=\"ttname\"><a href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">glm::uint32_t</a></div><div class=\"ttdeci\">detail::uint32 uint32_t</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00887\">fwd.hpp:887</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gabebd0c7e3c5cd337d95c313c5e8b8db4\"><div class=\"ttname\"><a href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">glm::dvec3</a></div><div class=\"ttdeci\">highp_dvec3 dvec3</div><div class=\"ttdoc\">3 components vector of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00489\">type_vec.hpp:489</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga85d89e83cb8137e1be1446de8c3b643a\"><div class=\"ttname\"><a href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">glm::aligned_vec4</a></div><div class=\"ttdeci\">aligned_highp_vec4 aligned_vec4</div><div class=\"ttdoc\">4 components vector aligned in memory of single-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00431\">gtc/type_aligned.hpp:431</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga916c1aed91cf91f7b41399ebe7c6e185\"><div class=\"ttname\"><a href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">glm::f64mat3x3</a></div><div class=\"ttdeci\">highp_f64mat3x3 f64mat3x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02537\">fwd.hpp:2537</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3999d3e7ff22025c16ddb601e14dfdee\"><div class=\"ttname\"><a href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">glm::uint64_t</a></div><div class=\"ttdeci\">detail::uint64 uint64_t</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00891\">fwd.hpp:891</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><div class=\"ttname\"><a href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">glm::lowp_i32</a></div><div class=\"ttdeci\">detail::int32 lowp_i32</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00142\">fwd.hpp:142</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0336abc2604dd2c20c30e036454b64f8\"><div class=\"ttname\"><a href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">glm::highp_i16</a></div><div class=\"ttdeci\">detail::int16 highp_i16</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00234\">fwd.hpp:234</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa07c86650253672a19dbfb898f3265b8\"><div class=\"ttname\"><a href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">glm::fmat3x3</a></div><div class=\"ttdeci\">highp_f32mat3x3 fmat3x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02361\">fwd.hpp:2361</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga30069d1f02b19599cbfadf98c23ac6ed\"><div class=\"ttname\"><a href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">glm::lowp_u64</a></div><div class=\"ttdeci\">detail::uint64 lowp_u64</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00751\">fwd.hpp:751</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><div class=\"ttname\"><a href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">glm::u16vec1</a></div><div class=\"ttdeci\">highp_u16vec1 u16vec1</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01055\">fwd.hpp:1055</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaef3824ed4fe435a019c5b9dddf53fec5\"><div class=\"ttname\"><a href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">glm::u64vec2</a></div><div class=\"ttdeci\">highp_u64vec2 u64vec2</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01297\">fwd.hpp:1297</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga14c583bd625eda8cf4935a14d5dd544d\"><div class=\"ttname\"><a href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">glm::f64quat</a></div><div class=\"ttdeci\">highp_f64quat f64quat</div><div class=\"ttdoc\">Default double-qualifier floating-point quaternion. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02569\">fwd.hpp:2569</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga20779a61de2fd526a17f12fe53ec46b1\"><div class=\"ttname\"><a href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">glm::u8vec4</a></div><div class=\"ttdeci\">highp_u8vec4 u8vec4</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00987\">fwd.hpp:987</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga31c6ca0e074a44007f49a9a3720b18c8\"><div class=\"ttname\"><a href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">glm::f32vec4</a></div><div class=\"ttdeci\">highp_f32vec4 f32vec4</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02411\">fwd.hpp:2411</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga681381f19f11c9e5ee45cda2c56937ff\"><div class=\"ttname\"><a href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">glm::fmat2x4</a></div><div class=\"ttdeci\">highp_f32mat2x4 fmat2x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02353\">fwd.hpp:2353</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab7daf79d6bc06a68bea1c6f5e11b5512\"><div class=\"ttname\"><a href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">glm::f64mat4x2</a></div><div class=\"ttdeci\">highp_f64mat4x2 f64mat4x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02545\">fwd.hpp:2545</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gae85537b672ffe0b3218cbdf1823e1c72\"><div class=\"ttname\"><a href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">glm::uvec3</a></div><div class=\"ttdeci\">highp_uvec3 uvec3</div><div class=\"ttdoc\">3 components vector of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00543\">type_vec.hpp:543</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3350c93c3275298f940a42875388e4b4\"><div class=\"ttname\"><a href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">glm::fmat2x2</a></div><div class=\"ttdeci\">highp_f32mat2x2 fmat2x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02345\">fwd.hpp:2345</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga91f91f411080c37730856ff5887f5bcf\"><div class=\"ttname\"><a href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">glm::uint16_t</a></div><div class=\"ttdeci\">detail::uint16 uint16_t</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00883\">fwd.hpp:883</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac4e00a26a2adb5f2c0a7096810df29e5\"><div class=\"ttname\"><a href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">glm::highp_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 highp_uint8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00823\">fwd.hpp:823</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6966c0cb4673928c9c9da2e91006d2c0\"><div class=\"ttname\"><a href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">glm::f32quat</a></div><div class=\"ttdeci\">highp_f32quat f32quat</div><div class=\"ttdoc\">Default single-qualifier floating-point quaternion. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02463\">fwd.hpp:2463</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9ec7c4c79e303c053e30729a95fb2c37\"><div class=\"ttname\"><a href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">glm::f64mat2x2</a></div><div class=\"ttdeci\">highp_f64mat2x2 f64mat2x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02521\">fwd.hpp:2521</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaa8ea2429bb3cb41a715258a447f39897\"><div class=\"ttname\"><a href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">glm::vec3</a></div><div class=\"ttdeci\">highp_vec3 vec3</div><div class=\"ttdoc\">3 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00462\">type_vec.hpp:462</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><div class=\"ttname\"><a href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">glm::i32vec1</a></div><div class=\"ttdeci\">highp_i32vec1 i32vec1</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00525\">fwd.hpp:525</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga62a17cddeb4dffb4e18fe3aea23f051a\"><div class=\"ttname\"><a href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">glm::mediump_i16</a></div><div class=\"ttdeci\">detail::int16 mediump_i16</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00186\">fwd.hpp:186</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga15ade901680b29b78c1f9d1796db6e0e\"><div class=\"ttname\"><a href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">glm::dvec2</a></div><div class=\"ttdeci\">highp_dvec2 dvec2</div><div class=\"ttdoc\">2 components vector of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00484\">type_vec.hpp:484</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad0549c902a96a7164e4ac858d5f39dbf\"><div class=\"ttname\"><a href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">glm::highp_int8</a></div><div class=\"ttdeci\">detail::int8 highp_int8</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00198\">fwd.hpp:198</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaebf341fc4a5be233f7dde962c2e33847\"><div class=\"ttname\"><a href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">glm::lowp_int64_t</a></div><div class=\"ttdeci\">detail::int64 lowp_int64_t</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00130\">fwd.hpp:130</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga378921b6a07bcdad946858b340f69ab1\"><div class=\"ttname\"><a href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">glm::mat3x3</a></div><div class=\"ttdeci\">highp_mat3x3 mat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00378\">type_mat.hpp:378</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2b65767f8b5aed1bd1cf86c541662b50\"><div class=\"ttname\"><a href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">glm::i64vec1</a></div><div class=\"ttdeci\">highp_i64vec1 i64vec1</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00684\">fwd.hpp:684</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga97432f9979e73e66567361fd01e4cffb\"><div class=\"ttname\"><a href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">glm::highp_uint8</a></div><div class=\"ttdeci\">detail::uint8 highp_uint8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00807\">fwd.hpp:807</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3e2e66ffbe341a80bc005ba2b9552110\"><div class=\"ttname\"><a href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">glm::f64mat4x3</a></div><div class=\"ttdeci\">highp_f64mat4x3 f64mat4x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02549\">fwd.hpp:2549</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5d6c70e080409a76a257dc55bd8ea2c8\"><div class=\"ttname\"><a href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">glm::f32vec2</a></div><div class=\"ttdeci\">highp_f32vec2 f32vec2</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02403\">fwd.hpp:2403</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_gae4f38fd2c86cee6940986197777b3ca4\"><div class=\"ttname\"><a href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">glm::aligned_ivec2</a></div><div class=\"ttdeci\">aligned_highp_ivec2 aligned_ivec2</div><div class=\"ttdoc\">2 components vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00505\">gtc/type_aligned.hpp:505</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gafe730798732aa7b0647096a004db1b1c\"><div class=\"ttname\"><a href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">glm::i16vec1</a></div><div class=\"ttdeci\">highp_i16vec1 i16vec1</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00446\">fwd.hpp:446</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaa7c3a0e7ae50c34c3290415c115f251e\"><div class=\"ttname\"><a href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">glm::uvec4</a></div><div class=\"ttdeci\">highp_uvec4 uvec4</div><div class=\"ttdoc\">4 components vector of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00548\">type_vec.hpp:548</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga667948cfe6fb3d6606c750729ec49f77\"><div class=\"ttname\"><a href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">glm::i64vec3</a></div><div class=\"ttdeci\">highp_i64vec3 i64vec3</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00692\">fwd.hpp:692</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga866a05905c49912309ed1fa5f5980e61\"><div class=\"ttname\"><a href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">glm::i32vec4</a></div><div class=\"ttdeci\">highp_i32vec4 i32vec4</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00537\">fwd.hpp:537</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga04100c76f7d55a0dd0983ccf05142bff\"><div class=\"ttname\"><a href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">glm::f32mat2x2</a></div><div class=\"ttdeci\">highp_f32mat2x2 f32mat2x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02415\">fwd.hpp:2415</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga55a2d2a8eb09b5633668257eb3cad453\"><div class=\"ttname\"><a href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">glm::fmat2x3</a></div><div class=\"ttdeci\">highp_f32mat2x3 fmat2x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02349\">fwd.hpp:2349</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga30652709815ad9404272a31957daa59e\"><div class=\"ttname\"><a href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">glm::mediump_uint64</a></div><div class=\"ttdeci\">detail::uint64 mediump_uint64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00769\">fwd.hpp:769</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad01cc6479bde1fd1870f13d3ed9530b3\"><div class=\"ttname\"><a href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">glm::fmat4x4</a></div><div class=\"ttdeci\">highp_f32mat4x4 fmat4x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02377\">fwd.hpp:2377</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8b2cd8d31eb345b2d641d9261c38db1a\"><div class=\"ttname\"><a href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">glm::lowp_int16_t</a></div><div class=\"ttdeci\">detail::int16 lowp_int16_t</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00122\">fwd.hpp:122</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3b32ca1e57a4ef91babbc3d35a34ea20\"><div class=\"ttname\"><a href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">glm::f32mat4x2</a></div><div class=\"ttdeci\">highp_f32mat4x2 f32mat4x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02439\">fwd.hpp:2439</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga26fc7ced1ad7ca5024f1c973c8dc9180\"><div class=\"ttname\"><a href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">glm::mediump_int32_t</a></div><div class=\"ttdeci\">detail::int32 mediump_int32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00174\">fwd.hpp:174</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0350631d35ff800e6133ac6243b13cbc\"><div class=\"ttname\"><a href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">glm::lowp_int32_t</a></div><div class=\"ttdeci\">detail::int32 lowp_int32_t</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00126\">fwd.hpp:126</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa46172d7dc1c7ffe3e78107ff88adf08\"><div class=\"ttname\"><a href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">glm::highp_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 highp_uint64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00835\">fwd.hpp:835</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga9bcffa2d49f28d16f680757b5c0e7c84\"><div class=\"ttname\"><a href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">glm::uvec2</a></div><div class=\"ttdeci\">highp_uvec2 uvec2</div><div class=\"ttdoc\">2 components vector of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00538\">type_vec.hpp:538</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa7a1ddca75c5f629173bf4772db7a635\"><div class=\"ttname\"><a href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">glm::f64vec3</a></div><div class=\"ttdeci\">highp_f64vec3 f64vec3</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02513\">fwd.hpp:2513</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaecc7082561fc9028b844b6cf3d305d36\"><div class=\"ttname\"><a href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">glm::u8</a></div><div class=\"ttdeci\">detail::uint8 u8</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00896\">fwd.hpp:896</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga119c41d73fe9977358174eb3ac1035a3\"><div class=\"ttname\"><a href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">glm::lowp_int8_t</a></div><div class=\"ttdeci\">detail::int8 lowp_int8_t</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00118\">fwd.hpp:118</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacf54c3330ef60aa3d16cb676c7bcb8c7\"><div class=\"ttname\"><a href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">glm::highp_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 highp_uint16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00827\">fwd.hpp:827</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga76298aed82a439063c3d55980c84aa0b\"><div class=\"ttname\"><a href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">glm::aligned_ivec1</a></div><div class=\"ttdeci\">aligned_highp_ivec1 aligned_ivec1</div><div class=\"ttdoc\">1 component vector aligned in memory of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00502\">gtc/type_aligned.hpp:502</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga9503f809789bda7e8852a6abde3ae5c1\"><div class=\"ttname\"><a href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">glm::dvec4</a></div><div class=\"ttdeci\">highp_dvec4 dvec4</div><div class=\"ttdoc\">4 components vector of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00494\">type_vec.hpp:494</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga302ec977b0c0c3ea245b6c9275495355\"><div class=\"ttname\"><a href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">glm::i8</a></div><div class=\"ttdeci\">detail::int8 i8</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00287\">fwd.hpp:287</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad06935764d78f43f9d542c784c2212ec\"><div class=\"ttname\"><a href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">glm::i8vec2</a></div><div class=\"ttdeci\">highp_i8vec2 i8vec2</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00370\">fwd.hpp:370</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0c181fdf06a309691999926b6690c969\"><div class=\"ttname\"><a href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">glm::highp_u64</a></div><div class=\"ttdeci\">detail::uint64 highp_u64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00851\">fwd.hpp:851</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae8f5e3e964ca2ae240adc2c0d74adede\"><div class=\"ttname\"><a href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">glm::int16_t</a></div><div class=\"ttdeci\">detail::int16 int16_t</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00274\">fwd.hpp:274</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga18d859f87122b2b3b2992ffe86dbebc0\"><div class=\"ttname\"><a href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">glm::aligned_dvec2</a></div><div class=\"ttdeci\">aligned_highp_dvec2 aligned_dvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of double-precision floating-point numbers. ...</div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00469\">gtc/type_aligned.hpp:469</a></div></div>\n<div class=\"ttc\" id=\"a00164_html_ga074137e3be58528d67041c223d49f398\"><div class=\"ttname\"><a href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">glm::aligned_uvec2</a></div><div class=\"ttdeci\">aligned_highp_uvec2 aligned_uvec2</div><div class=\"ttdoc\">2 components vector aligned in memory of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00101_source.html#l00544\">gtc/type_aligned.hpp:544</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga698e36b01167fc0f037889334dce8def\"><div class=\"ttname\"><a href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">glm::lowp_int16</a></div><div class=\"ttdeci\">detail::int16 lowp_int16</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00106\">fwd.hpp:106</a></div></div>\n<div class=\"ttc\" id=\"a00223_html_ga95cc03b8b475993fa50e05e38e203303\"><div class=\"ttname\"><a href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">glm::GLM_ALIGNED_TYPEDEF</a></div><div class=\"ttdeci\">GLM_ALIGNED_TYPEDEF(f64quat, aligned_f64quat, 32)</div><div class=\"ttdoc\">Double-qualifier floating-point aligned quaternion. </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8dd3a3281ae5c970ffe0c41d538aa153\"><div class=\"ttname\"><a href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">glm::lowp_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 lowp_uint64_t</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00734\">fwd.hpp:734</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf09f3ca4b671a4a4f84505eb4cc865fd\"><div class=\"ttname\"><a href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">glm::u64vec1</a></div><div class=\"ttdeci\">highp_u64vec1 u64vec1</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01293\">fwd.hpp:1293</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga66e92e57260bdb910609b9a56bf83e97\"><div class=\"ttname\"><a href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">glm::f64vec4</a></div><div class=\"ttdeci\">highp_f64vec4 f64vec4</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02517\">fwd.hpp:2517</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga550831bfc26d1e0101c1cb3d79938c06\"><div class=\"ttname\"><a href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">glm::i16vec4</a></div><div class=\"ttdeci\">highp_i16vec4 i16vec4</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00458\">fwd.hpp:458</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae9c90a867a6026b1f6eab00456f3fb8b\"><div class=\"ttname\"><a href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">glm::i16vec3</a></div><div class=\"ttdeci\">highp_i16vec3 i16vec3</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00454\">fwd.hpp:454</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><div class=\"ttname\"><a href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">glm::highp_int32_t</a></div><div class=\"ttdeci\">detail::int32 highp_int32_t</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00222\">fwd.hpp:222</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae52e2b7077a9ff928a06ab5ce600b81e\"><div class=\"ttname\"><a href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">glm::f64mat4x4</a></div><div class=\"ttdeci\">highp_f64mat4x4 f64mat4x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02553\">fwd.hpp:2553</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga864aabca5f3296e176e0c3ed9cc16b02\"><div class=\"ttname\"><a href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">glm::lowp_int32</a></div><div class=\"ttdeci\">detail::int32 lowp_int32</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00110\">fwd.hpp:110</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5244cef85d6e870e240c76428a262ae8\"><div class=\"ttname\"><a href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">glm::mediump_int32</a></div><div class=\"ttdeci\">detail::int32 mediump_int32</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00158\">fwd.hpp:158</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga48310188e1d0c616bf8d78c92447523b\"><div class=\"ttname\"><a href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">glm::i64vec2</a></div><div class=\"ttdeci\">highp_i64vec2 i64vec2</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00688\">fwd.hpp:688</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad1213a22bbb9e4107f07eaa4956f8281\"><div class=\"ttname\"><a href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">glm::mediump_u8</a></div><div class=\"ttdeci\">detail::uint8 mediump_u8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00789\">fwd.hpp:789</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6d7b3789ecb932c26430009478cac7ae\"><div class=\"ttname\"><a href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">glm::mediump_int8_t</a></div><div class=\"ttdeci\">detail::int8 mediump_int8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00166\">fwd.hpp:166</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga746dc6da204f5622e395f492997dbf57\"><div class=\"ttname\"><a href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">glm::highp_uint16</a></div><div class=\"ttdeci\">detail::uint16 highp_uint16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00811\">fwd.hpp:811</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae978599c9711ac263ba732d4ac225b0e\"><div class=\"ttname\"><a href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">glm::highp_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 highp_uint32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00831\">fwd.hpp:831</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga518b8d948a6b4ddb72f84d5c3b7b6611\"><div class=\"ttname\"><a href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">glm::u8vec2</a></div><div class=\"ttdeci\">highp_u8vec2 u8vec2</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00979\">fwd.hpp:979</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4bf09d8838a86866b39ee6e109341645\"><div class=\"ttname\"><a href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">glm::int8_t</a></div><div class=\"ttdeci\">detail::int8 int8_t</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00270\">fwd.hpp:270</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa4e31c3d9de067029efeb161a44b0232\"><div class=\"ttname\"><a href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">glm::i64vec4</a></div><div class=\"ttdeci\">highp_i64vec4 i64vec4</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00696\">fwd.hpp:696</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga98b9ed43cf8c5cf1d354b23c7df9119f\"><div class=\"ttname\"><a href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">glm::fvec1</a></div><div class=\"ttdeci\">highp_f32vec1 fvec1</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02329\">fwd.hpp:2329</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8165913e068444f7842302d40ba897b9\"><div class=\"ttname\"><a href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">glm::u32</a></div><div class=\"ttdeci\">detail::uint32 u32</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00904\">fwd.hpp:904</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8e62c883d13f47015f3b70ed88751369\"><div class=\"ttname\"><a href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">glm::highp_u16</a></div><div class=\"ttdeci\">detail::uint16 highp_u16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00843\">fwd.hpp:843</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf3f312156984c365e9f65620354da70b\"><div class=\"ttname\"><a href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">glm::u64</a></div><div class=\"ttdeci\">detail::uint64 u64</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00908\">fwd.hpp:908</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaee4da0e9fbd8cfa2f89cb80889719dc3\"><div class=\"ttname\"><a href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">glm::f32mat4x4</a></div><div class=\"ttdeci\">highp_f32mat4x4 f32mat4x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02447\">fwd.hpp:2447</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga96faea43ac5f875d2d3ffbf8d213e3eb\"><div class=\"ttname\"><a href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">glm::i32</a></div><div class=\"ttdeci\">detail::int32 i32</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00295\">fwd.hpp:295</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab90ade28222f8b861d5ceaf81a3a7f5d\"><div class=\"ttname\"><a href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">glm::f32mat3x4</a></div><div class=\"ttdeci\">highp_f32mat3x4 f32mat3x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02435\">fwd.hpp:2435</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3ab5fe184343d394fb6c2723c3ee3699\"><div class=\"ttname\"><a href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">glm::i16</a></div><div class=\"ttdeci\">detail::int16 i16</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00291\">fwd.hpp:291</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga392b673fd10847bfb78fb808c6cf8ff7\"><div class=\"ttname\"><a href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">glm::lowp_i16</a></div><div class=\"ttdeci\">detail::int16 lowp_i16</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00138\">fwd.hpp:138</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga667b2ece2b258be898812dc2177995d1\"><div class=\"ttname\"><a href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">glm::lowp_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 lowp_uint8_t</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00722\">fwd.hpp:722</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2a266e46ee218d0c680f12b35c500cc0\"><div class=\"ttname\"><a href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">glm::u32vec2</a></div><div class=\"ttdeci\">highp_u32vec2 u32vec2</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01138\">fwd.hpp:1138</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2885a6c89916911e418c06bb76b9bdbb\"><div class=\"ttname\"><a href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">glm::mediump_uint16</a></div><div class=\"ttdeci\">detail::uint16 mediump_uint16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00761\">fwd.hpp:761</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga226a8d52b4e3f77aaa6231135e886aac\"><div class=\"ttname\"><a href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">glm::highp_int64</a></div><div class=\"ttdeci\">detail::int64 highp_int64</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00210\">fwd.hpp:210</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf512b74c4400b68f9fdf9388b3d6aac8\"><div class=\"ttname\"><a href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">glm::f32mat2x4</a></div><div class=\"ttdeci\">highp_f32mat2x4 f32mat2x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02423\">fwd.hpp:2423</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga042ef09ff2f0cb24a36f541bcb3a3710\"><div class=\"ttname\"><a href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">glm::int32_t</a></div><div class=\"ttdeci\">detail::int32 int32_t</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00278\">fwd.hpp:278</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacaea06d0a79ef3172e887a7a6ba434ff\"><div class=\"ttname\"><a href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">glm::highp_int16_t</a></div><div class=\"ttdeci\">detail::int16 highp_int16_t</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00218\">fwd.hpp:218</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga760bcf26fdb23a2c3ecad3c928a19ae6\"><div class=\"ttname\"><a href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">glm::lowp_int8</a></div><div class=\"ttdeci\">detail::int8 lowp_int8</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00102\">fwd.hpp:102</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1085c50dd8fbeb5e7e609b1c127492a5\"><div class=\"ttname\"><a href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">glm::highp_int8_t</a></div><div class=\"ttdeci\">detail::int8 highp_int8_t</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00214\">fwd.hpp:214</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8b44026374982dcd1e52d22bac99247e\"><div class=\"ttname\"><a href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">glm::i32vec2</a></div><div class=\"ttdeci\">highp_i32vec2 i32vec2</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00529\">fwd.hpp:529</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4295048a78bdf46b8a7de77ec665b497\"><div class=\"ttname\"><a href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">glm::fmat4x3</a></div><div class=\"ttdeci\">highp_f32mat4x3 fmat4x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02373\">fwd.hpp:2373</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1320a08e14fdff3821241eefab6947e9\"><div class=\"ttname\"><a href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">glm::f32mat3x2</a></div><div class=\"ttdeci\">highp_f32mat3x2 f32mat3x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02427\">fwd.hpp:2427</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><div class=\"ttname\"><a href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">glm::highp_uint64</a></div><div class=\"ttdeci\">detail::uint64 highp_uint64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00819\">fwd.hpp:819</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadb997e409103d4da18abd837e636a496\"><div class=\"ttname\"><a href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">glm::i64</a></div><div class=\"ttdeci\">detail::int64 i64</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00299\">fwd.hpp:299</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac3bc41bcac61d1ba8f02a6f68ce23f64\"><div class=\"ttname\"><a href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">glm::mediump_int64_t</a></div><div class=\"ttdeci\">detail::int64 mediump_int64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00178\">fwd.hpp:178</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa2d7acc0adb536fab71fe261232a40ff\"><div class=\"ttname\"><a href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">glm::u16</a></div><div class=\"ttdeci\">detail::uint16 u16</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00900\">fwd.hpp:900</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf4dae276fd29623950de14a6ca2586b5\"><div class=\"ttname\"><a href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">glm::mediump_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 mediump_uint32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00781\">fwd.hpp:781</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><div class=\"ttname\"><a href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">glm::mediump_uint8</a></div><div class=\"ttdeci\">detail::uint8 mediump_uint8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00757\">fwd.hpp:757</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga2ab812bd103527e2d6c62c2e2f5ee78f\"><div class=\"ttname\"><a href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">glm::ivec2</a></div><div class=\"ttdeci\">highp_ivec2 ivec2</div><div class=\"ttdoc\">2 components vector of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00511\">type_vec.hpp:511</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6957c7b22f405683bb276554ca40dc37\"><div class=\"ttname\"><a href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">glm::float64_t</a></div><div class=\"ttdeci\">highp_float64_t float64_t</div><div class=\"ttdoc\">Default 64 bit double-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01503\">fwd.hpp:1503</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7c5706f6bbe5282e5598acf7e7b377e2\"><div class=\"ttname\"><a href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">glm::u8vec3</a></div><div class=\"ttdeci\">highp_u8vec3 u8vec3</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00983\">fwd.hpp:983</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00103.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_float.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">type_float.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00103_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gad3c127f8bf8d7d4e738037c257abb5b1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a></td></tr>\n<tr class=\"memdesc:gad3c127f8bf8d7d4e738037c257abb5b1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 32 bit single-qualifier floating-point scalar.  <a href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">More...</a><br /></td></tr>\n<tr class=\"separator:gad3c127f8bf8d7d4e738037c257abb5b1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab5596d48586414c91ccb270962dc14d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef double&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a></td></tr>\n<tr class=\"memdesc:gab5596d48586414c91ccb270962dc14d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 64 bit double-qualifier floating-point scalar.  <a href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">More...</a><br /></td></tr>\n<tr class=\"separator:gab5596d48586414c91ccb270962dc14d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e95694987ba35af6f736638be39626a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6e95694987ba35af6f736638be39626a\">highp_float</a></td></tr>\n<tr class=\"memdesc:ga6e95694987ba35af6f736638be39626a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier floating-point numbers.  <a href=\"a00145.html#ga6e95694987ba35af6f736638be39626a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e95694987ba35af6f736638be39626a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga358d69e11b1c0f6c7c469e0d39ab7fd1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_float_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1\">lowp_float</a></td></tr>\n<tr class=\"memdesc:ga358d69e11b1c0f6c7c469e0d39ab7fd1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier floating-point numbers.  <a href=\"a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga358d69e11b1c0f6c7c469e0d39ab7fd1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga280c68f537f4b1e03a00b23e62573b98\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_float_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga280c68f537f4b1e03a00b23e62573b98\">mediump_float</a></td></tr>\n<tr class=\"memdesc:ga280c68f537f4b1e03a00b23e62573b98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier floating-point numbers.  <a href=\"a00145.html#ga280c68f537f4b1e03a00b23e62573b98\">More...</a><br /></td></tr>\n<tr class=\"separator:ga280c68f537f4b1e03a00b23e62573b98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00103_source.html\">type_float.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00103_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_float.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_float.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00103.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">float</span>                           <a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a>;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">double</span>                          <a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a>;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">float</span>                           lowp_float_t;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">float</span>                           mediump_float_t;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">double</span>                          highp_float_t;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1\">   27</a></span>&#160;        <span class=\"keyword\">typedef</span> lowp_float_t            <a class=\"code\" href=\"a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1\">lowp_float</a>;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga280c68f537f4b1e03a00b23e62573b98\">   34</a></span>&#160;        <span class=\"keyword\">typedef</span> mediump_float_t         <a class=\"code\" href=\"a00145.html#ga280c68f537f4b1e03a00b23e62573b98\">mediump_float</a>;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga6e95694987ba35af6f736638be39626a\">   41</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_float_t           <a class=\"code\" href=\"a00145.html#ga6e95694987ba35af6f736638be39626a\">highp_float</a>;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">#if(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">typedef</span> mediump_float           float_t;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        <span class=\"keyword\">typedef</span> highp_float                     float_t;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        <span class=\"keyword\">typedef</span> mediump_float           float_t;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_FLOAT) &amp;&amp; defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">typedef</span> lowp_float                      float_t;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM error: multiple default precision requested for floating-point types&quot;</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">   55</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">float</span>                           <a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a>;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">   56</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">double</span>                          <a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a>;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"comment\">// check type sizes</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"preprocessor\">#ifndef GLM_STATIC_ASSERT_NULL</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">glm::float32</a>) == 4, <span class=\"stringliteral\">&quot;float32 size isn&#39;t 4 bytes on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">glm::float64</a>) == 8, <span class=\"stringliteral\">&quot;float64 size isn&#39;t 8 bytes on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;<span class=\"preprocessor\">#endif//GLM_STATIC_ASSERT_NULL</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00165_html_gad3c127f8bf8d7d4e738037c257abb5b1\"><div class=\"ttname\"><a href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">glm::float32</a></div><div class=\"ttdeci\">float float32</div><div class=\"ttdoc\">Default 32 bit single-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00103_source.html#l00055\">type_float.hpp:55</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga280c68f537f4b1e03a00b23e62573b98\"><div class=\"ttname\"><a href=\"a00145.html#ga280c68f537f4b1e03a00b23e62573b98\">glm::mediump_float</a></div><div class=\"ttdeci\">mediump_float_t mediump_float</div><div class=\"ttdoc\">Medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00103_source.html#l00034\">type_float.hpp:34</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga358d69e11b1c0f6c7c469e0d39ab7fd1\"><div class=\"ttname\"><a href=\"a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1\">glm::lowp_float</a></div><div class=\"ttdeci\">lowp_float_t lowp_float</div><div class=\"ttdoc\">Low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00103_source.html#l00027\">type_float.hpp:27</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga6e95694987ba35af6f736638be39626a\"><div class=\"ttname\"><a href=\"a00145.html#ga6e95694987ba35af6f736638be39626a\">glm::highp_float</a></div><div class=\"ttdeci\">highp_float_t highp_float</div><div class=\"ttdoc\">High qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00103_source.html#l00041\">type_float.hpp:41</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab5596d48586414c91ccb270962dc14d3\"><div class=\"ttname\"><a href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">glm::float64</a></div><div class=\"ttdeci\">double float64</div><div class=\"ttdoc\">Default 64 bit double-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00103_source.html#l00056\">type_float.hpp:56</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00104.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_gentype.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_gentype.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00104_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00104_source.html\">type_gentype.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00104_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_gentype.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_gentype.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00104.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;        <span class=\"keyword\">enum</span> profile</div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;                nice,</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;                fast,</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;                simd</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">typedef</span> std::size_t sizeType;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        <span class=\"keyword\">template</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;        &lt;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typename</span> VALTYPE, </div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>TYPE</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;        &gt;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">struct </span>genType</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                <span class=\"keyword\">enum</span> ctor{null};</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;                <span class=\"keyword\">typedef</span> VALTYPE value_type;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                <span class=\"keyword\">typedef</span> VALTYPE &amp; value_reference;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                <span class=\"keyword\">typedef</span> VALTYPE * value_pointer;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;                <span class=\"keyword\">typedef</span> VALTYPE <span class=\"keyword\">const</span> * value_const_pointer;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;bool&gt; bool_type;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                <span class=\"keyword\">typedef</span> sizeType size_type;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> is_vector();</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> is_matrix();</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;VALTYPE&gt; type;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;VALTYPE&gt; * pointer;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;VALTYPE&gt; <span class=\"keyword\">const</span> * const_pointer;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;VALTYPE&gt; <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> const_pointer_const;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;VALTYPE&gt; * <span class=\"keyword\">const</span> pointer_const;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;VALTYPE&gt; &amp; reference;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;VALTYPE&gt; <span class=\"keyword\">const</span>&amp; const_reference;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                <span class=\"keyword\">typedef</span> TYPE&lt;VALTYPE&gt; <span class=\"keyword\">const</span>&amp; param_type;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                <span class=\"comment\">// Address (Implementation details)</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                value_const_pointer value_address()<span class=\"keyword\"> const</span>{<span class=\"keywordflow\">return</span> value_pointer(<span class=\"keyword\">this</span>);}</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                value_pointer value_address(){<span class=\"keywordflow\">return</span> value_pointer(<span class=\"keyword\">this</span>);}</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"comment\">//protected:</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"comment\">//      enum kind</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        <span class=\"comment\">//      {</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"comment\">//              GEN_TYPE,</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"comment\">//              VEC_TYPE,</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"comment\">//              MAT_TYPE</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"comment\">//      };</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        <span class=\"comment\">//      typedef typename TYPE::kind kind;</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        &lt;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                <span class=\"keyword\">typename</span> VALTYPE, </div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span>&gt; <span class=\"keyword\">class </span>TYPE</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        &gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        <span class=\"keywordtype\">bool</span> genType&lt;VALTYPE, TYPE&gt;::is_vector()</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                <span class=\"keywordflow\">return</span> <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;<span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"comment\">        template&lt;typename valTypeT, unsigned int colT, unsigned int rowT, profile proT = nice&gt;</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"comment\">        class base</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;<span class=\"comment\">        {</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;<span class=\"comment\">        public:</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;<span class=\"comment\">                // Traits</span></div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;<span class=\"comment\">                typedef sizeType                                                        size_type;</span></div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;<span class=\"comment\">                typedef valTypeT                                                        value_type;</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;<span class=\"comment\">                typedef base&lt;value_type, colT, rowT&gt;            class_type;</span></div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;<span class=\"comment\">                typedef base&lt;bool, colT, rowT&gt;                          bool_type;</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;<span class=\"comment\">                typedef base&lt;value_type, rowT, 1&gt;                       col_type;</span></div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;<span class=\"comment\">                typedef base&lt;value_type, colT, 1&gt;                       row_type;</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;<span class=\"comment\">                typedef base&lt;value_type, rowT, colT&gt;            transpose_type;</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;<span class=\"comment\">                static size_type                                                        col_size();</span></div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;<span class=\"comment\">                static size_type                                                        row_size();</span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;<span class=\"comment\">                static size_type                                                        value_size();</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;<span class=\"comment\">                static bool                                                                     is_scalar();</span></div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;<span class=\"comment\">                static bool                                                                     is_vector();</span></div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;<span class=\"comment\">                static bool                                                                     is_matrix();</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;<span class=\"comment\">        private:</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;<span class=\"comment\">                // Data </span></div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;<span class=\"comment\">                col_type value[colT];           </span></div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;<span class=\"comment\">        public:</span></div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;<span class=\"comment\">                // Constructors</span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;<span class=\"comment\">                base();</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;<span class=\"comment\">                base(class_type const&amp; m);</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;<span class=\"comment\">                explicit base(T const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;<span class=\"comment\">                explicit base(value_type const * const x);</span></div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;<span class=\"comment\">                explicit base(col_type const * const x);</span></div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;<span class=\"comment\">                // Conversions</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;<span class=\"comment\">                template&lt;typename vU, uint cU, uint rU, profile pU&gt;</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;<span class=\"comment\">                explicit base(base&lt;vU, cU, rU, pU&gt; const&amp; m);</span></div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;<span class=\"comment\">                // Accesses</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;<span class=\"comment\">                col_type&amp; operator[](size_type i);</span></div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;<span class=\"comment\">                col_type const&amp; operator[](size_type i) const;</span></div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;<span class=\"comment\">                // Unary updatable operators</span></div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;<span class=\"comment\">                class_type&amp; operator=  (class_type const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;<span class=\"comment\">                class_type&amp; operator+= (T const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;<span class=\"comment\">                class_type&amp; operator+= (class_type const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;<span class=\"comment\">                class_type&amp; operator-= (T const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;<span class=\"comment\">                class_type&amp; operator-= (class_type const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;<span class=\"comment\">                class_type&amp; operator*= (T const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;<span class=\"comment\">                class_type&amp; operator*= (class_type const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;<span class=\"comment\">                class_type&amp; operator/= (T const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;<span class=\"comment\">                class_type&amp; operator/= (class_type const&amp; x);</span></div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;<span class=\"comment\">                class_type&amp; operator++ ();</span></div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;<span class=\"comment\">                class_type&amp; operator-- ();</span></div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;<span class=\"comment\">        };</span></div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;<span class=\"comment\">*/</span></div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        <span class=\"comment\">//template&lt;typename T&gt;</span></div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        <span class=\"comment\">//struct traits</span></div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        <span class=\"comment\">//{</span></div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        <span class=\"comment\">//      static const bool is_signed = false;</span></div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;        <span class=\"comment\">//      static const bool is_float = false;</span></div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        <span class=\"comment\">//      static const bool is_vector = false;</span></div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        <span class=\"comment\">//      static const bool is_matrix = false;</span></div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        <span class=\"comment\">//      static const bool is_genType = false;</span></div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        <span class=\"comment\">//      static const bool is_genIType = false;</span></div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        <span class=\"comment\">//      static const bool is_genUType = false;</span></div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        <span class=\"comment\">//};</span></div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        <span class=\"comment\">//template&lt;&gt;</span></div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        <span class=\"comment\">//struct traits&lt;half&gt;</span></div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        <span class=\"comment\">//{</span></div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        <span class=\"comment\">//      static const bool is_float = true;</span></div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        <span class=\"comment\">//      static const bool is_genType = true;</span></div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        <span class=\"comment\">//};</span></div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        <span class=\"comment\">//template&lt;&gt;</span></div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        <span class=\"comment\">//struct traits&lt;float&gt;</span></div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        <span class=\"comment\">//{</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;        <span class=\"comment\">//      static const bool is_float = true;</span></div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        <span class=\"comment\">//      static const bool is_genType = true;</span></div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        <span class=\"comment\">//};</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        <span class=\"comment\">//template&lt;&gt;</span></div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        <span class=\"comment\">//struct traits&lt;double&gt;</span></div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        <span class=\"comment\">//{</span></div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        <span class=\"comment\">//      static const bool is_float = true;</span></div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        <span class=\"comment\">//      static const bool is_genType = true;</span></div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        <span class=\"comment\">//};</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;        <span class=\"comment\">//template&lt;typename genType&gt;</span></div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;        <span class=\"comment\">//struct desc</span></div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        <span class=\"comment\">//{</span></div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;        <span class=\"comment\">//      typedef genType                                                 type;</span></div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;        <span class=\"comment\">//      typedef genType *                                               pointer;</span></div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;        <span class=\"comment\">//      typedef genType const*                                  const_pointer;</span></div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;        <span class=\"comment\">//      typedef genType const *const                    const_pointer_const;</span></div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;        <span class=\"comment\">//      typedef genType *const                                  pointer_const;</span></div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        <span class=\"comment\">//      typedef genType &amp;                                               reference;</span></div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        <span class=\"comment\">//      typedef genType const&amp;                                  const_reference;</span></div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;        <span class=\"comment\">//      typedef genType const&amp;                                  param_type;</span></div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;        <span class=\"comment\">//      typedef typename genType::value_type    value_type;</span></div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;        <span class=\"comment\">//      typedef typename genType::size_type             size_type;</span></div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;        <span class=\"comment\">//      static const typename size_type                 value_size;</span></div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;        <span class=\"comment\">//};</span></div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;        <span class=\"comment\">//template&lt;typename genType&gt;</span></div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;        <span class=\"comment\">//const typename desc&lt;genType&gt;::size_type desc&lt;genType&gt;::value_size = genType::value_size();</span></div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;<span class=\"comment\">//#include &quot;type_gentype.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00105.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_half.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_half.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00105_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00105_source.html\">type_half.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00105_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_half.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_half.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00105.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">short</span> hdata;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">float</span> toFloat32(hdata value);</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;        GLM_FUNC_DECL hdata toFloat16(<span class=\"keywordtype\">float</span> <span class=\"keyword\">const</span>&amp; value);</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;type_half.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00106.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_int.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">type_int.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00106_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gaaabe7eb044941ebf308b53a447d692dc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::highp_int_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaaabe7eb044941ebf308b53a447d692dc\">highp_int</a></td></tr>\n<tr class=\"memdesc:gaaabe7eb044941ebf308b53a447d692dc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier signed integer.  <a href=\"a00145.html#gaaabe7eb044941ebf308b53a447d692dc\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaabe7eb044941ebf308b53a447d692dc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73e8a694d7fc69143cf25161d18d1dcf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::highp_uint_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf\">highp_uint</a></td></tr>\n<tr class=\"memdesc:ga73e8a694d7fc69143cf25161d18d1dcf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier unsigned integer.  <a href=\"a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73e8a694d7fc69143cf25161d18d1dcf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga302041c186d0d028bea31b711fe16759\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a></td></tr>\n<tr class=\"memdesc:ga302041c186d0d028bea31b711fe16759\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit signed integer type.  <a href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">More...</a><br /></td></tr>\n<tr class=\"separator:ga302041c186d0d028bea31b711fe16759\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8df669f4e7698dfe0c0354d92578d74f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a></td></tr>\n<tr class=\"memdesc:ga8df669f4e7698dfe0c0354d92578d74f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit signed integer type.  <a href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8df669f4e7698dfe0c0354d92578d74f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaff5189f97f9e842d9636a0f240001b2e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a></td></tr>\n<tr class=\"memdesc:gaff5189f97f9e842d9636a0f240001b2e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit signed integer type.  <a href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaff5189f97f9e842d9636a0f240001b2e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41c6189f6485c2825d60fdc835b3a2b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a></td></tr>\n<tr class=\"memdesc:ga41c6189f6485c2825d60fdc835b3a2b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit signed integer type.  <a href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41c6189f6485c2825d60fdc835b3a2b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0fa1e32e8b3552ed63556eca51c620e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::lowp_int_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gad0fa1e32e8b3552ed63556eca51c620e\">lowp_int</a></td></tr>\n<tr class=\"memdesc:gad0fa1e32e8b3552ed63556eca51c620e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier signed integer.  <a href=\"a00145.html#gad0fa1e32e8b3552ed63556eca51c620e\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0fa1e32e8b3552ed63556eca51c620e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga25ebc60727fc8b4a1167665f9ecdca97\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::lowp_uint_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97\">lowp_uint</a></td></tr>\n<tr class=\"memdesc:ga25ebc60727fc8b4a1167665f9ecdca97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier unsigned integer.  <a href=\"a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97\">More...</a><br /></td></tr>\n<tr class=\"separator:ga25ebc60727fc8b4a1167665f9ecdca97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga212ef8f883878cb7430228a279a7d866\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::mediump_int_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga212ef8f883878cb7430228a279a7d866\">mediump_int</a></td></tr>\n<tr class=\"memdesc:ga212ef8f883878cb7430228a279a7d866\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier signed integer.  <a href=\"a00145.html#ga212ef8f883878cb7430228a279a7d866\">More...</a><br /></td></tr>\n<tr class=\"separator:ga212ef8f883878cb7430228a279a7d866\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0b7e01c52b9e5bf3369761b79b5f4f8e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::mediump_uint_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e\">mediump_uint</a></td></tr>\n<tr class=\"memdesc:ga0b7e01c52b9e5bf3369761b79b5f4f8e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier unsigned integer.  <a href=\"a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0b7e01c52b9e5bf3369761b79b5f4f8e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91ad9478d81a7aaf2593e8d9c3d06a14\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef unsigned int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a></td></tr>\n<tr class=\"memdesc:ga91ad9478d81a7aaf2593e8d9c3d06a14\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer type.  <a href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91ad9478d81a7aaf2593e8d9c3d06a14\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga13471cbbe74e4303a57f3743d007b74d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a></td></tr>\n<tr class=\"memdesc:ga13471cbbe74e4303a57f3743d007b74d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit unsigned integer type.  <a href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga13471cbbe74e4303a57f3743d007b74d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5fa3ddcab56c789bc272ff5651faa12d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a></td></tr>\n<tr class=\"memdesc:ga5fa3ddcab56c789bc272ff5651faa12d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit unsigned integer type.  <a href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5fa3ddcab56c789bc272ff5651faa12d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab630f76c26b50298187f7889104d4b9c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a></td></tr>\n<tr class=\"memdesc:gab630f76c26b50298187f7889104d4b9c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit unsigned integer type.  <a href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">More...</a><br /></td></tr>\n<tr class=\"separator:gab630f76c26b50298187f7889104d4b9c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga36475e31b1992cfde54c1a6f5a148865\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a></td></tr>\n<tr class=\"memdesc:ga36475e31b1992cfde54c1a6f5a148865\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit unsigned integer type.  <a href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">More...</a><br /></td></tr>\n<tr class=\"separator:ga36475e31b1992cfde54c1a6f5a148865\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00106_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_int.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_int.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00106.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_MAKE_SIGNED</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#       include &lt;type_traits&gt;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_EXTENDED_INTEGER_TYPE</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#       include &lt;cstdint&gt;</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#       if GLM_HAS_EXTENDED_INTEGER_TYPE</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">std::int8_t</a>                                     <a class=\"code\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">std::int16_t</a>                            <a class=\"code\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">std::int32_t</a>                            <a class=\"code\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">std::int64_t</a>                            <a class=\"code\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a>;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">std::uint8_t</a>                            <a class=\"code\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">std::uint16_t</a>                           <a class=\"code\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;                <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">std::uint32_t</a>                           <a class=\"code\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">std::uint64_t</a>                           <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#               if(defined(__STDC_VERSION__) &amp;&amp; (__STDC_VERSION__ &gt;= 199901L)) // C99 detected, 64 bit types available</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">int64_t</a>                                 sint64;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                        <span class=\"keyword\">typedef</span> <a class=\"code\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">uint64_t</a>                                <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#               elif GLM_COMPILER &amp; GLM_COMPILER_VC</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> __int64                  sint64;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> __int64                <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#               elif GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#                       pragma GCC diagnostic ignored &quot;-Wlong-long&quot;</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                        __extension__ <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">long</span> <span class=\"keywordtype\">long</span>          sint64;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                        __extension__ <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">long</span> <span class=\"keywordtype\">long</span>        <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">#               elif (GLM_COMPILER &amp; GLM_COMPILER_CLANG)</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">#                       pragma clang diagnostic ignored &quot;-Wc++11-long-long&quot;</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">long</span>     <span class=\"keywordtype\">long</span>            sint64;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">long</span> <span class=\"keywordtype\">long</span>              <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#               else//unknown compiler</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">long</span>     <span class=\"keywordtype\">long</span>            sint64;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">long</span> <span class=\"keywordtype\">long</span>              <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">#               endif//GLM_COMPILER</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">char</span>                                     <a class=\"code\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">short</span>                            <a class=\"code\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">int</span>                                      <a class=\"code\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                <span class=\"keyword\">typedef</span> sint64                                          <a class=\"code\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a>;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">char</span>                           <a class=\"code\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">short</span>                          <a class=\"code\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span>                            <a class=\"code\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                <span class=\"keyword\">typedef</span> uint64                                          <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"preprocessor\">#endif//</span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">int</span>                                              lowp_int_t;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">int</span>                                              mediump_int_t;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">signed</span> <span class=\"keywordtype\">int</span>                                              highp_int_t;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span>                                    lowp_uint_t;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span>                                    mediump_uint_t;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span>                                    highp_uint_t;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;<span class=\"preprocessor\">#       if GLM_HAS_MAKE_SIGNED</span></div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                <span class=\"keyword\">using</span> std::make_signed;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                <span class=\"keyword\">using</span> std::make_unsigned;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"preprocessor\">#       else//GLM_HAS_MAKE_SIGNED</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                <span class=\"keyword\">struct </span>make_signed</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                {};</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;char&gt;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">char</span> type;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;short&gt;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">short</span> type;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;int&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">int</span> type;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;long&gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">long</span> type;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;unsigned char&gt;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">char</span> type;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;unsigned short&gt;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">short</span> type;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;unsigned int&gt;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">int</span> type;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;unsigned long&gt;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">long</span> type;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;                {};</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;char&gt;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">char</span> type;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;short&gt;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">short</span> type;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;int&gt;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span> type;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;long&gt;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">long</span> type;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;unsigned char&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">char</span> type;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;unsigned short&gt;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">short</span> type;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;unsigned int&gt;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span> type;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;unsigned long&gt;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">long</span> type;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;long long&gt;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">long</span> <span class=\"keywordtype\">long</span> type;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;                <span class=\"keyword\">struct </span>make_signed&lt;unsigned long long&gt;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">long</span> <span class=\"keywordtype\">long</span> type;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;long long&gt;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">long</span> <span class=\"keywordtype\">long</span> type;</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;                <span class=\"keyword\">struct </span>make_unsigned&lt;unsigned long long&gt;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">long</span> <span class=\"keywordtype\">long</span> type;</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;<span class=\"preprocessor\">#       endif//GLM_HAS_MAKE_SIGNED</span></div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">  206</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int8                                    <a class=\"code\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">  207</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int16                                   <a class=\"code\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>;</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">  208</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int32                                   <a class=\"code\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">  209</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::int64                                   <a class=\"code\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a>;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">  211</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8                                   <a class=\"code\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">  212</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16                                  <a class=\"code\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">  213</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32                                  <a class=\"code\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>;</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">  214</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64                                  <a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gad0fa1e32e8b3552ed63556eca51c620e\">  224</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::lowp_int_t                              <a class=\"code\" href=\"a00145.html#gad0fa1e32e8b3552ed63556eca51c620e\">lowp_int</a>;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga212ef8f883878cb7430228a279a7d866\">  231</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::mediump_int_t                   <a class=\"code\" href=\"a00145.html#ga212ef8f883878cb7430228a279a7d866\">mediump_int</a>;</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaaabe7eb044941ebf308b53a447d692dc\">  238</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::highp_int_t                             <a class=\"code\" href=\"a00145.html#gaaabe7eb044941ebf308b53a447d692dc\">highp_int</a>;</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97\">  245</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::lowp_uint_t                             <a class=\"code\" href=\"a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97\">lowp_uint</a>;</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e\">  252</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::mediump_uint_t                  <a class=\"code\" href=\"a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e\">mediump_uint</a>;</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;</div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf\">  259</a></span>&#160;        <span class=\"keyword\">typedef</span> detail::highp_uint_t                    <a class=\"code\" href=\"a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf\">highp_uint</a>;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;<span class=\"preprocessor\">#if(!defined(GLM_PRECISION_HIGHP_INT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_INT) &amp;&amp; !defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;        <span class=\"keyword\">typedef</span> mediump_int                                     int_t;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_HIGHP_INT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_INT) &amp;&amp; !defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;        <span class=\"keyword\">typedef</span> highp_int                                       int_t;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_INT) &amp;&amp; defined(GLM_PRECISION_MEDIUMP_INT) &amp;&amp; !defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;        <span class=\"keyword\">typedef</span> mediump_int                                     int_t;</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_INT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_INT) &amp;&amp; defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        <span class=\"keyword\">typedef</span> lowp_int                                        int_t;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM error: multiple default precision requested for signed integer types&quot;</span></div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;<span class=\"preprocessor\">#if(!defined(GLM_PRECISION_HIGHP_UINT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_UINT) &amp;&amp; !defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;        <span class=\"keyword\">typedef</span> mediump_uint                            uint_t;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_HIGHP_UINT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_UINT) &amp;&amp; !defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;        <span class=\"keyword\">typedef</span> highp_uint                                      uint_t;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_UINT) &amp;&amp; defined(GLM_PRECISION_MEDIUMP_UINT) &amp;&amp; !defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        <span class=\"keyword\">typedef</span> mediump_uint                            uint_t;</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;<span class=\"preprocessor\">#elif(!defined(GLM_PRECISION_HIGHP_UINT) &amp;&amp; !defined(GLM_PRECISION_MEDIUMP_UINT) &amp;&amp; defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;        <span class=\"keyword\">typedef</span> lowp_uint                                       uint_t;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM error: multiple default precision requested for unsigned integer types&quot;</span></div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">  288</a></span>&#160;        <span class=\"keyword\">typedef</span> <span class=\"keywordtype\">unsigned</span> <span class=\"keywordtype\">int</span>                            <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;</div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;<span class=\"comment\">// check type sizes</span></div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;<span class=\"preprocessor\">#ifndef GLM_STATIC_ASSERT_NULL</span></div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">glm::int8</a>) == 1, <span class=\"stringliteral\">&quot;int8 size isn&#39;t 1 byte on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">glm::int16</a>) == 2, <span class=\"stringliteral\">&quot;int16 size isn&#39;t 2 bytes on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">glm::int32</a>) == 4, <span class=\"stringliteral\">&quot;int32 size isn&#39;t 4 bytes on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">glm::int64</a>) == 8, <span class=\"stringliteral\">&quot;int64 size isn&#39;t 8 bytes on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;</div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">glm::uint8</a>) == 1, <span class=\"stringliteral\">&quot;uint8 size isn&#39;t 1 byte on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">glm::uint16</a>) == 2, <span class=\"stringliteral\">&quot;uint16 size isn&#39;t 2 bytes on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">glm::uint32</a>) == 4, <span class=\"stringliteral\">&quot;uint32 size isn&#39;t 4 bytes on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;        GLM_STATIC_ASSERT(<span class=\"keyword\">sizeof</span>(<a class=\"code\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">glm::uint64</a>) == 8, <span class=\"stringliteral\">&quot;uint64 size isn&#39;t 8 bytes on this platform&quot;</span>);</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;<span class=\"preprocessor\">#endif//GLM_STATIC_ASSERT_NULL</span></div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00165_html_ga302041c186d0d028bea31b711fe16759\"><div class=\"ttname\"><a href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">glm::int16</a></div><div class=\"ttdeci\">detail::int16 int16</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00207\">type_int.hpp:207</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga28d97808322d3c92186e4a0c067d7e8e\"><div class=\"ttname\"><a href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">glm::uint8_t</a></div><div class=\"ttdeci\">detail::uint8 uint8_t</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00879\">fwd.hpp:879</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga322a7d7d2c2c68994dc872a33de63c61\"><div class=\"ttname\"><a href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">glm::int64_t</a></div><div class=\"ttdeci\">detail::int64 int64_t</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00282\">fwd.hpp:282</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab630f76c26b50298187f7889104d4b9c\"><div class=\"ttname\"><a href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">glm::uint64</a></div><div class=\"ttdeci\">detail::uint64 uint64</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00214\">type_int.hpp:214</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaff5189f97f9e842d9636a0f240001b2e\"><div class=\"ttname\"><a href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">glm::int64</a></div><div class=\"ttdeci\">detail::int64 int64</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00209\">type_int.hpp:209</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaaabe7eb044941ebf308b53a447d692dc\"><div class=\"ttname\"><a href=\"a00145.html#gaaabe7eb044941ebf308b53a447d692dc\">glm::highp_int</a></div><div class=\"ttdeci\">detail::highp_int_t highp_int</div><div class=\"ttdoc\">High qualifier signed integer. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00238\">type_int.hpp:238</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga41c6189f6485c2825d60fdc835b3a2b0\"><div class=\"ttname\"><a href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">glm::int8</a></div><div class=\"ttdeci\">detail::int8 int8</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00206\">type_int.hpp:206</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga36475e31b1992cfde54c1a6f5a148865\"><div class=\"ttname\"><a href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">glm::uint8</a></div><div class=\"ttdeci\">detail::uint8 uint8</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00211\">type_int.hpp:211</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga0b7e01c52b9e5bf3369761b79b5f4f8e\"><div class=\"ttname\"><a href=\"a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e\">glm::mediump_uint</a></div><div class=\"ttdeci\">detail::mediump_uint_t mediump_uint</div><div class=\"ttdoc\">Medium qualifier unsigned integer. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00252\">type_int.hpp:252</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga25ebc60727fc8b4a1167665f9ecdca97\"><div class=\"ttname\"><a href=\"a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97\">glm::lowp_uint</a></div><div class=\"ttdeci\">detail::lowp_uint_t lowp_uint</div><div class=\"ttdoc\">Low qualifier unsigned integer. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00245\">type_int.hpp:245</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2171d9dc1fefb1c82e2817f45b622eac\"><div class=\"ttname\"><a href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">glm::uint32_t</a></div><div class=\"ttdeci\">detail::uint32 uint32_t</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00887\">fwd.hpp:887</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8df669f4e7698dfe0c0354d92578d74f\"><div class=\"ttname\"><a href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">glm::int32</a></div><div class=\"ttdeci\">detail::int32 int32</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00208\">type_int.hpp:208</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3999d3e7ff22025c16ddb601e14dfdee\"><div class=\"ttname\"><a href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">glm::uint64_t</a></div><div class=\"ttdeci\">detail::uint64 uint64_t</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00891\">fwd.hpp:891</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga91f91f411080c37730856ff5887f5bcf\"><div class=\"ttname\"><a href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">glm::uint16_t</a></div><div class=\"ttdeci\">detail::uint16 uint16_t</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00883\">fwd.hpp:883</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga73e8a694d7fc69143cf25161d18d1dcf\"><div class=\"ttname\"><a href=\"a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf\">glm::highp_uint</a></div><div class=\"ttdeci\">detail::highp_uint_t highp_uint</div><div class=\"ttdoc\">High qualifier unsigned integer. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00259\">type_int.hpp:259</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga13471cbbe74e4303a57f3743d007b74d\"><div class=\"ttname\"><a href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">glm::uint16</a></div><div class=\"ttdeci\">detail::uint16 uint16</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00212\">type_int.hpp:212</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae8f5e3e964ca2ae240adc2c0d74adede\"><div class=\"ttname\"><a href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">glm::int16_t</a></div><div class=\"ttdeci\">detail::int16 int16_t</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00274\">fwd.hpp:274</a></div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4bf09d8838a86866b39ee6e109341645\"><div class=\"ttname\"><a href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">glm::int8_t</a></div><div class=\"ttdeci\">detail::int8 int8_t</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00270\">fwd.hpp:270</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5fa3ddcab56c789bc272ff5651faa12d\"><div class=\"ttname\"><a href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">glm::uint32</a></div><div class=\"ttdeci\">detail::uint32 uint32</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00213\">type_int.hpp:213</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga042ef09ff2f0cb24a36f541bcb3a3710\"><div class=\"ttname\"><a href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">glm::int32_t</a></div><div class=\"ttdeci\">detail::int32 int32_t</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00278\">fwd.hpp:278</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga91ad9478d81a7aaf2593e8d9c3d06a14\"><div class=\"ttname\"><a href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">glm::uint</a></div><div class=\"ttdeci\">unsigned int uint</div><div class=\"ttdoc\">Unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00288\">type_int.hpp:288</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gad0fa1e32e8b3552ed63556eca51c620e\"><div class=\"ttname\"><a href=\"a00145.html#gad0fa1e32e8b3552ed63556eca51c620e\">glm::lowp_int</a></div><div class=\"ttdeci\">detail::lowp_int_t lowp_int</div><div class=\"ttdoc\">Low qualifier signed integer. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00224\">type_int.hpp:224</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga212ef8f883878cb7430228a279a7d866\"><div class=\"ttname\"><a href=\"a00145.html#ga212ef8f883878cb7430228a279a7d866\">glm::mediump_int</a></div><div class=\"ttdeci\">detail::mediump_int_t mediump_int</div><div class=\"ttdoc\">Medium qualifier signed integer. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00231\">type_int.hpp:231</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00107.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a> &#124;\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00107_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gac7f51e23c8802d867f564dfd146bdb44\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gac7f51e23c8802d867f564dfd146bdb44\">dmat2</a></td></tr>\n<tr class=\"memdesc:gac7f51e23c8802d867f564dfd146bdb44\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 * 2 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gac7f51e23c8802d867f564dfd146bdb44\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7f51e23c8802d867f564dfd146bdb44\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc27b39853a2ecb538c8b3afc20c359e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">dmat2x2</a></td></tr>\n<tr class=\"memdesc:gacc27b39853a2ecb538c8b3afc20c359e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 * 2 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc27b39853a2ecb538c8b3afc20c359e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1cb3c561a32f0864733dfaf97c71f0c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">dmat2x3</a></td></tr>\n<tr class=\"memdesc:ga1cb3c561a32f0864733dfaf97c71f0c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 * 3 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1cb3c561a32f0864733dfaf97c71f0c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaddd230c88fbd6ec33242329be3a1b738\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">dmat2x4</a></td></tr>\n<tr class=\"memdesc:gaddd230c88fbd6ec33242329be3a1b738\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 * 4 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">More...</a><br /></td></tr>\n<tr class=\"separator:gaddd230c88fbd6ec33242329be3a1b738\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae174ff65e148bb7dec4bf10a63cb46ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff\">dmat3</a></td></tr>\n<tr class=\"memdesc:gae174ff65e148bb7dec4bf10a63cb46ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 * 3 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff\">More...</a><br /></td></tr>\n<tr class=\"separator:gae174ff65e148bb7dec4bf10a63cb46ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec22f44dddbdadfe5dfca68eb3457ea8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">dmat3x2</a></td></tr>\n<tr class=\"memdesc:gaec22f44dddbdadfe5dfca68eb3457ea8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 * 2 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec22f44dddbdadfe5dfca68eb3457ea8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac44263f56ff3cbf0a9cc4e2405d5ecb8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">dmat3x3</a></td></tr>\n<tr class=\"memdesc:gac44263f56ff3cbf0a9cc4e2405d5ecb8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 * 3 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">More...</a><br /></td></tr>\n<tr class=\"separator:gac44263f56ff3cbf0a9cc4e2405d5ecb8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga38d9bfca882ec542b1928cf77b5c2091\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">dmat3x4</a></td></tr>\n<tr class=\"memdesc:ga38d9bfca882ec542b1928cf77b5c2091\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 * 4 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">More...</a><br /></td></tr>\n<tr class=\"separator:ga38d9bfca882ec542b1928cf77b5c2091\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97b38ea24e9ebf58eac04a8d99dc3e27\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27\">dmat4</a></td></tr>\n<tr class=\"memdesc:ga97b38ea24e9ebf58eac04a8d99dc3e27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 * 4 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97b38ea24e9ebf58eac04a8d99dc3e27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6ddab280c735a2139133b4164b99a68a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">dmat4x2</a></td></tr>\n<tr class=\"memdesc:ga6ddab280c735a2139133b4164b99a68a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 * 2 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6ddab280c735a2139133b4164b99a68a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab6c8974496fc7c72dad09219118ba89e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">dmat4x3</a></td></tr>\n<tr class=\"memdesc:gab6c8974496fc7c72dad09219118ba89e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 * 3 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">More...</a><br /></td></tr>\n<tr class=\"separator:gab6c8974496fc7c72dad09219118ba89e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41c2da87ca627c1b2da5e895435a508e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">dmat4x4</a></td></tr>\n<tr class=\"memdesc:ga41c2da87ca627c1b2da5e895435a508e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 * 4 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41c2da87ca627c1b2da5e895435a508e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga02c6ed0185f84600c3b5001cf0db4746\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga02c6ed0185f84600c3b5001cf0db4746\">highp_dmat2</a></td></tr>\n<tr class=\"memdesc:ga02c6ed0185f84600c3b5001cf0db4746\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga02c6ed0185f84600c3b5001cf0db4746\">More...</a><br /></td></tr>\n<tr class=\"separator:ga02c6ed0185f84600c3b5001cf0db4746\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga458e8160a061147a3a2021c574b19787\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga458e8160a061147a3a2021c574b19787\">highp_dmat2x2</a></td></tr>\n<tr class=\"memdesc:ga458e8160a061147a3a2021c574b19787\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga458e8160a061147a3a2021c574b19787\">More...</a><br /></td></tr>\n<tr class=\"separator:ga458e8160a061147a3a2021c574b19787\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga60fe4ae1b320094bc2a8d977505a97f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5\">highp_dmat2x3</a></td></tr>\n<tr class=\"memdesc:ga60fe4ae1b320094bc2a8d977505a97f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga60fe4ae1b320094bc2a8d977505a97f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b4fed753f9b7c217b0401dc808e780a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga8b4fed753f9b7c217b0401dc808e780a\">highp_dmat2x4</a></td></tr>\n<tr class=\"memdesc:ga8b4fed753f9b7c217b0401dc808e780a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga8b4fed753f9b7c217b0401dc808e780a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b4fed753f9b7c217b0401dc808e780a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d8eec93e1655d7889d2ef05c3fe580a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a\">highp_dmat3</a></td></tr>\n<tr class=\"memdesc:ga6d8eec93e1655d7889d2ef05c3fe580a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d8eec93e1655d7889d2ef05c3fe580a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5922c1b5a0a4973b0256db146aa77049\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5922c1b5a0a4973b0256db146aa77049\">highp_dmat3x2</a></td></tr>\n<tr class=\"memdesc:ga5922c1b5a0a4973b0256db146aa77049\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga5922c1b5a0a4973b0256db146aa77049\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5922c1b5a0a4973b0256db146aa77049\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaca3b96f84c48db9830b5b0d4b07d1516\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516\">highp_dmat3x3</a></td></tr>\n<tr class=\"memdesc:gaca3b96f84c48db9830b5b0d4b07d1516\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516\">More...</a><br /></td></tr>\n<tr class=\"separator:gaca3b96f84c48db9830b5b0d4b07d1516\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga60cb89371783bb18003d3b2f8dbf62f8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8\">highp_dmat3x4</a></td></tr>\n<tr class=\"memdesc:ga60cb89371783bb18003d3b2f8dbf62f8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga60cb89371783bb18003d3b2f8dbf62f8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga96af41ad54c906b0ed14cbe43ca7db0d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d\">highp_dmat4</a></td></tr>\n<tr class=\"memdesc:ga96af41ad54c906b0ed14cbe43ca7db0d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96af41ad54c906b0ed14cbe43ca7db0d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad779abbdd0c7594cee515e4546d3db29\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gad779abbdd0c7594cee515e4546d3db29\">highp_dmat4x2</a></td></tr>\n<tr class=\"memdesc:gad779abbdd0c7594cee515e4546d3db29\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gad779abbdd0c7594cee515e4546d3db29\">More...</a><br /></td></tr>\n<tr class=\"separator:gad779abbdd0c7594cee515e4546d3db29\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga719750bee4022a646b006d2dda75cb76\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga719750bee4022a646b006d2dda75cb76\">highp_dmat4x3</a></td></tr>\n<tr class=\"memdesc:ga719750bee4022a646b006d2dda75cb76\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga719750bee4022a646b006d2dda75cb76\">More...</a><br /></td></tr>\n<tr class=\"separator:ga719750bee4022a646b006d2dda75cb76\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab7e154baf836679251844a5d933bd0aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gab7e154baf836679251844a5d933bd0aa\">highp_dmat4x4</a></td></tr>\n<tr class=\"memdesc:gab7e154baf836679251844a5d933bd0aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gab7e154baf836679251844a5d933bd0aa\">More...</a><br /></td></tr>\n<tr class=\"separator:gab7e154baf836679251844a5d933bd0aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4fcceff924fa2dc1f3d5217f68c5f81a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">highp_mat2</a></td></tr>\n<tr class=\"memdesc:ga4fcceff924fa2dc1f3d5217f68c5f81a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4fcceff924fa2dc1f3d5217f68c5f81a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabb2ee47d6bffb6d6363b34a7c61c8229\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">highp_mat2x2</a></td></tr>\n<tr class=\"memdesc:gabb2ee47d6bffb6d6363b34a7c61c8229\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">More...</a><br /></td></tr>\n<tr class=\"separator:gabb2ee47d6bffb6d6363b34a7c61c8229\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga441b8e3402eefca108b40f3d22a1baa9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">highp_mat2x3</a></td></tr>\n<tr class=\"memdesc:ga441b8e3402eefca108b40f3d22a1baa9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga441b8e3402eefca108b40f3d22a1baa9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b030d815c7c9f77c3c47e708863fd62\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">highp_mat2x4</a></td></tr>\n<tr class=\"memdesc:ga3b030d815c7c9f77c3c47e708863fd62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b030d815c7c9f77c3c47e708863fd62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9f30904176d75657930fa4383618f968\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">highp_mat3</a></td></tr>\n<tr class=\"memdesc:ga9f30904176d75657930fa4383618f968\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9f30904176d75657930fa4383618f968\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12276a2b151d87c039134c388b5a3746\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">highp_mat3x2</a></td></tr>\n<tr class=\"memdesc:ga12276a2b151d87c039134c388b5a3746\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12276a2b151d87c039134c388b5a3746\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b33e2669c291268ac4b1c9c296d2dc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">highp_mat3x3</a></td></tr>\n<tr class=\"memdesc:ga1b33e2669c291268ac4b1c9c296d2dc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b33e2669c291268ac4b1c9c296d2dc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabb55c60d8c7fb400bf2ed511251ca394\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">highp_mat3x4</a></td></tr>\n<tr class=\"memdesc:gabb55c60d8c7fb400bf2ed511251ca394\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">More...</a><br /></td></tr>\n<tr class=\"separator:gabb55c60d8c7fb400bf2ed511251ca394\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga332149037f33cec9d9b583e11c3c8524\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">highp_mat4</a></td></tr>\n<tr class=\"memdesc:ga332149037f33cec9d9b583e11c3c8524\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">More...</a><br /></td></tr>\n<tr class=\"separator:ga332149037f33cec9d9b583e11c3c8524\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39ba2335320534c19db435a27d8bb765\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">highp_mat4x2</a></td></tr>\n<tr class=\"memdesc:ga39ba2335320534c19db435a27d8bb765\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">More...</a><br /></td></tr>\n<tr class=\"separator:ga39ba2335320534c19db435a27d8bb765\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf93a24b2e1c4a6f556fbcc796ec90e63\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">highp_mat4x3</a></td></tr>\n<tr class=\"memdesc:gaf93a24b2e1c4a6f556fbcc796ec90e63\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf93a24b2e1c4a6f556fbcc796ec90e63\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga989736bc5e50330ef3ab13d34bebc66f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">highp_mat4x4</a></td></tr>\n<tr class=\"memdesc:ga989736bc5e50330ef3ab13d34bebc66f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga989736bc5e50330ef3ab13d34bebc66f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0dfc5624d872b189ab4a82bebca7107c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0dfc5624d872b189ab4a82bebca7107c\">lowp_dmat2</a></td></tr>\n<tr class=\"memdesc:ga0dfc5624d872b189ab4a82bebca7107c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga0dfc5624d872b189ab4a82bebca7107c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0dfc5624d872b189ab4a82bebca7107c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78e7b9e6dcadb7e8ac5562fe0263786c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c\">lowp_dmat2x2</a></td></tr>\n<tr class=\"memdesc:ga78e7b9e6dcadb7e8ac5562fe0263786c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78e7b9e6dcadb7e8ac5562fe0263786c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4450cd185006155fff0380dad2d70ec4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga4450cd185006155fff0380dad2d70ec4\">lowp_dmat2x3</a></td></tr>\n<tr class=\"memdesc:ga4450cd185006155fff0380dad2d70ec4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga4450cd185006155fff0380dad2d70ec4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4450cd185006155fff0380dad2d70ec4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49b6a11f54dcec866c0ecf17d7685165\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga49b6a11f54dcec866c0ecf17d7685165\">lowp_dmat2x4</a></td></tr>\n<tr class=\"memdesc:ga49b6a11f54dcec866c0ecf17d7685165\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga49b6a11f54dcec866c0ecf17d7685165\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49b6a11f54dcec866c0ecf17d7685165\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadffb225ac88b8a65e1e76233b8bd5768\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gadffb225ac88b8a65e1e76233b8bd5768\">lowp_dmat3</a></td></tr>\n<tr class=\"memdesc:gadffb225ac88b8a65e1e76233b8bd5768\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#gadffb225ac88b8a65e1e76233b8bd5768\">More...</a><br /></td></tr>\n<tr class=\"separator:gadffb225ac88b8a65e1e76233b8bd5768\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga02af788947516c41893c658990783fd4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga02af788947516c41893c658990783fd4\">lowp_dmat3x2</a></td></tr>\n<tr class=\"memdesc:ga02af788947516c41893c658990783fd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga02af788947516c41893c658990783fd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga02af788947516c41893c658990783fd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0bae293e714e00f23e4bbf5a6c000448\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0bae293e714e00f23e4bbf5a6c000448\">lowp_dmat3x3</a></td></tr>\n<tr class=\"memdesc:ga0bae293e714e00f23e4bbf5a6c000448\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga0bae293e714e00f23e4bbf5a6c000448\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0bae293e714e00f23e4bbf5a6c000448\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42108fc51b1c14745e6edf399c1d0150\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga42108fc51b1c14745e6edf399c1d0150\">lowp_dmat3x4</a></td></tr>\n<tr class=\"memdesc:ga42108fc51b1c14745e6edf399c1d0150\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga42108fc51b1c14745e6edf399c1d0150\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42108fc51b1c14745e6edf399c1d0150\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5d0f05a7d08f3f058110e1b79f805d7a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a\">lowp_dmat4</a></td></tr>\n<tr class=\"memdesc:ga5d0f05a7d08f3f058110e1b79f805d7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5d0f05a7d08f3f058110e1b79f805d7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3daec60b56a8d57455cb60d8328f3645\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga3daec60b56a8d57455cb60d8328f3645\">lowp_dmat4x2</a></td></tr>\n<tr class=\"memdesc:ga3daec60b56a8d57455cb60d8328f3645\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga3daec60b56a8d57455cb60d8328f3645\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3daec60b56a8d57455cb60d8328f3645\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaf5b6171d297b3a1c6c771e8b912c08d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d\">lowp_dmat4x3</a></td></tr>\n<tr class=\"memdesc:gaaf5b6171d297b3a1c6c771e8b912c08d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaf5b6171d297b3a1c6c771e8b912c08d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga843a2b7ca501078963910ea0b453f970\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga843a2b7ca501078963910ea0b453f970\">lowp_dmat4x4</a></td></tr>\n<tr class=\"memdesc:ga843a2b7ca501078963910ea0b453f970\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga843a2b7ca501078963910ea0b453f970\">More...</a><br /></td></tr>\n<tr class=\"separator:ga843a2b7ca501078963910ea0b453f970\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga08bba677ef7b2809ac0061fa9a3db854\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">lowp_mat2</a></td></tr>\n<tr class=\"memdesc:ga08bba677ef7b2809ac0061fa9a3db854\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">More...</a><br /></td></tr>\n<tr class=\"separator:ga08bba677ef7b2809ac0061fa9a3db854\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga993bdd19989dc1f4d09f664a2ee74cb5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">lowp_mat2x2</a></td></tr>\n<tr class=\"memdesc:ga993bdd19989dc1f4d09f664a2ee74cb5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga993bdd19989dc1f4d09f664a2ee74cb5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga083089177b89ae9166d8d251a90f4b8b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">lowp_mat2x3</a></td></tr>\n<tr class=\"memdesc:ga083089177b89ae9166d8d251a90f4b8b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga083089177b89ae9166d8d251a90f4b8b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae6e9638a6d1cadbd22f27c02998ebbf8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">lowp_mat2x4</a></td></tr>\n<tr class=\"memdesc:gae6e9638a6d1cadbd22f27c02998ebbf8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">More...</a><br /></td></tr>\n<tr class=\"separator:gae6e9638a6d1cadbd22f27c02998ebbf8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc4e277672e9f7b3cde23a4a3bd24fc9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">lowp_mat3</a></td></tr>\n<tr class=\"memdesc:gacc4e277672e9f7b3cde23a4a3bd24fc9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc4e277672e9f7b3cde23a4a3bd24fc9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga10f0f2108800a543f22d90ecf4b40d01\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">lowp_mat3x2</a></td></tr>\n<tr class=\"memdesc:ga10f0f2108800a543f22d90ecf4b40d01\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">More...</a><br /></td></tr>\n<tr class=\"separator:ga10f0f2108800a543f22d90ecf4b40d01\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1e4b7727038383e0103b138c66a65039\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">lowp_mat3x3</a></td></tr>\n<tr class=\"memdesc:ga1e4b7727038383e0103b138c66a65039\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e4b7727038383e0103b138c66a65039\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42a7c3c9eafb869c000b4388913ce0c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">lowp_mat3x4</a></td></tr>\n<tr class=\"memdesc:ga42a7c3c9eafb869c000b4388913ce0c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42a7c3c9eafb869c000b4388913ce0c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73e2f3bcae71b05736f2c962f98565a1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">lowp_mat4</a></td></tr>\n<tr class=\"memdesc:ga73e2f3bcae71b05736f2c962f98565a1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73e2f3bcae71b05736f2c962f98565a1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9839115cb8be9524f0621caf4bb29665\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">lowp_mat4x2</a></td></tr>\n<tr class=\"memdesc:ga9839115cb8be9524f0621caf4bb29665\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9839115cb8be9524f0621caf4bb29665\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7eb333327f0b261237b540496137d55e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">lowp_mat4x3</a></td></tr>\n<tr class=\"memdesc:ga7eb333327f0b261237b540496137d55e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7eb333327f0b261237b540496137d55e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8378facff06c21d2092a9a13c9ef0a0b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">lowp_mat4x4</a></td></tr>\n<tr class=\"memdesc:ga8378facff06c21d2092a9a13c9ef0a0b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8378facff06c21d2092a9a13c9ef0a0b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e30cfba068ebc3c71fe1f8b3110e450\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">mat2</a></td></tr>\n<tr class=\"memdesc:ga6e30cfba068ebc3c71fe1f8b3110e450\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of floating-point numbers.  <a href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e30cfba068ebc3c71fe1f8b3110e450\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c84b211a5730357b63c6d2e4fb696d5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">mat2x2</a></td></tr>\n<tr class=\"memdesc:ga0c84b211a5730357b63c6d2e4fb696d5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of floating-point numbers.  <a href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0c84b211a5730357b63c6d2e4fb696d5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafb063d734266e92915d87f8943560471\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gafb063d734266e92915d87f8943560471\">mat2x3</a></td></tr>\n<tr class=\"memdesc:gafb063d734266e92915d87f8943560471\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of floating-point numbers.  <a href=\"a00144.html#gafb063d734266e92915d87f8943560471\">More...</a><br /></td></tr>\n<tr class=\"separator:gafb063d734266e92915d87f8943560471\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d2ac1a80c36fb5a1d15914035f792ac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">mat2x4</a></td></tr>\n<tr class=\"memdesc:ga4d2ac1a80c36fb5a1d15914035f792ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of floating-point numbers.  <a href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4d2ac1a80c36fb5a1d15914035f792ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6dd3ec98a548755676267e59142911f8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">mat3</a></td></tr>\n<tr class=\"memdesc:ga6dd3ec98a548755676267e59142911f8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of floating-point numbers.  <a href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6dd3ec98a548755676267e59142911f8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3839ca29d011a80ff3ede7f22ba602a4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">mat3x2</a></td></tr>\n<tr class=\"memdesc:ga3839ca29d011a80ff3ede7f22ba602a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of floating-point numbers.  <a href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3839ca29d011a80ff3ede7f22ba602a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga378921b6a07bcdad946858b340f69ab1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">mat3x3</a></td></tr>\n<tr class=\"memdesc:ga378921b6a07bcdad946858b340f69ab1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of floating-point numbers.  <a href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga378921b6a07bcdad946858b340f69ab1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7876e0c3e3fcc3e2f4c0462c152e87cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">mat3x4</a></td></tr>\n<tr class=\"memdesc:ga7876e0c3e3fcc3e2f4c0462c152e87cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of floating-point numbers.  <a href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7876e0c3e3fcc3e2f4c0462c152e87cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade0eb47c01f79384a6f38017ede17446\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">mat4</a></td></tr>\n<tr class=\"memdesc:gade0eb47c01f79384a6f38017ede17446\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of floating-point numbers.  <a href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">More...</a><br /></td></tr>\n<tr class=\"separator:gade0eb47c01f79384a6f38017ede17446\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b3f6a5cbc17362141f9781262ed838f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">mat4x2</a></td></tr>\n<tr class=\"memdesc:ga1b3f6a5cbc17362141f9781262ed838f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of floating-point numbers.  <a href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b3f6a5cbc17362141f9781262ed838f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacd9ff3b943b3d8bda4f4b388320420fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">mat4x3</a></td></tr>\n<tr class=\"memdesc:gacd9ff3b943b3d8bda4f4b388320420fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of floating-point numbers.  <a href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">More...</a><br /></td></tr>\n<tr class=\"separator:gacd9ff3b943b3d8bda4f4b388320420fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga089315d5a0c20ac6eaa17a854bbd2e81\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">mat4x4</a></td></tr>\n<tr class=\"memdesc:ga089315d5a0c20ac6eaa17a854bbd2e81\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of floating-point numbers.  <a href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">More...</a><br /></td></tr>\n<tr class=\"separator:ga089315d5a0c20ac6eaa17a854bbd2e81\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga963689d328dfa8fcaa4aa140f2e52cd0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0\">mediump_dmat2</a></td></tr>\n<tr class=\"memdesc:ga963689d328dfa8fcaa4aa140f2e52cd0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga963689d328dfa8fcaa4aa140f2e52cd0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade27733f04b9a6f723850263ccda908b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gade27733f04b9a6f723850263ccda908b\">mediump_dmat2x2</a></td></tr>\n<tr class=\"memdesc:gade27733f04b9a6f723850263ccda908b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gade27733f04b9a6f723850263ccda908b\">More...</a><br /></td></tr>\n<tr class=\"separator:gade27733f04b9a6f723850263ccda908b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga253243e9a0e6a6235e41351f3d6fbd2e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e\">mediump_dmat2x3</a></td></tr>\n<tr class=\"memdesc:ga253243e9a0e6a6235e41351f3d6fbd2e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga253243e9a0e6a6235e41351f3d6fbd2e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6afa4f5d70f8e0dceed640a26918661b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6afa4f5d70f8e0dceed640a26918661b\">mediump_dmat2x4</a></td></tr>\n<tr class=\"memdesc:ga6afa4f5d70f8e0dceed640a26918661b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga6afa4f5d70f8e0dceed640a26918661b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6afa4f5d70f8e0dceed640a26918661b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5418e9669f0673640a2fbdeb261aff50\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5418e9669f0673640a2fbdeb261aff50\">mediump_dmat3</a></td></tr>\n<tr class=\"memdesc:ga5418e9669f0673640a2fbdeb261aff50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga5418e9669f0673640a2fbdeb261aff50\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5418e9669f0673640a2fbdeb261aff50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2196f803d3b4e1f920acef5b32ab41c4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4\">mediump_dmat3x2</a></td></tr>\n<tr class=\"memdesc:ga2196f803d3b4e1f920acef5b32ab41c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2196f803d3b4e1f920acef5b32ab41c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafee0cf7585d59b2485e42e8aae4714ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gafee0cf7585d59b2485e42e8aae4714ca\">mediump_dmat3x3</a></td></tr>\n<tr class=\"memdesc:gafee0cf7585d59b2485e42e8aae4714ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gafee0cf7585d59b2485e42e8aae4714ca\">More...</a><br /></td></tr>\n<tr class=\"separator:gafee0cf7585d59b2485e42e8aae4714ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9e0578807bf8880cea8336dfdb666d69\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga9e0578807bf8880cea8336dfdb666d69\">mediump_dmat3x4</a></td></tr>\n<tr class=\"memdesc:ga9e0578807bf8880cea8336dfdb666d69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga9e0578807bf8880cea8336dfdb666d69\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9e0578807bf8880cea8336dfdb666d69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafaf455c1dff11cb8f3c86467ac27a461\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gafaf455c1dff11cb8f3c86467ac27a461\">mediump_dmat4</a></td></tr>\n<tr class=\"memdesc:gafaf455c1dff11cb8f3c86467ac27a461\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gafaf455c1dff11cb8f3c86467ac27a461\">More...</a><br /></td></tr>\n<tr class=\"separator:gafaf455c1dff11cb8f3c86467ac27a461\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04b32b7cbfddf0f02a8b442f8b376680\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680\">mediump_dmat4x2</a></td></tr>\n<tr class=\"memdesc:ga04b32b7cbfddf0f02a8b442f8b376680\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04b32b7cbfddf0f02a8b442f8b376680\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga002d912d086a3eaa5425a6c4ca468fea\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga002d912d086a3eaa5425a6c4ca468fea\">mediump_dmat4x3</a></td></tr>\n<tr class=\"memdesc:ga002d912d086a3eaa5425a6c4ca468fea\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga002d912d086a3eaa5425a6c4ca468fea\">More...</a><br /></td></tr>\n<tr class=\"separator:ga002d912d086a3eaa5425a6c4ca468fea\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaeac3848d29b4b47332c44c31d9bcfa2f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f\">mediump_dmat4x4</a></td></tr>\n<tr class=\"memdesc:gaeac3848d29b4b47332c44c31d9bcfa2f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaeac3848d29b4b47332c44c31d9bcfa2f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga83fe5281ac0a3d153226b903badd415b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">mediump_mat2</a></td></tr>\n<tr class=\"memdesc:ga83fe5281ac0a3d153226b903badd415b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga83fe5281ac0a3d153226b903badd415b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf1beb3328c79fece7dcc34c5b05b57a0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">mediump_mat2x2</a></td></tr>\n<tr class=\"memdesc:gaf1beb3328c79fece7dcc34c5b05b57a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf1beb3328c79fece7dcc34c5b05b57a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0bda8ba50fa930ef29d4fa91a85f229a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">mediump_mat2x3</a></td></tr>\n<tr class=\"memdesc:ga0bda8ba50fa930ef29d4fa91a85f229a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0bda8ba50fa930ef29d4fa91a85f229a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa190a86a477360f02508191a6549efc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">mediump_mat2x4</a></td></tr>\n<tr class=\"memdesc:gaa190a86a477360f02508191a6549efc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa190a86a477360f02508191a6549efc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad31f8a0097ff6c22b92cf855dfffc575\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">mediump_mat3</a></td></tr>\n<tr class=\"memdesc:gad31f8a0097ff6c22b92cf855dfffc575\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">More...</a><br /></td></tr>\n<tr class=\"separator:gad31f8a0097ff6c22b92cf855dfffc575\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga66a044feff0a17b1bf275bc8d200e514\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">mediump_mat3x2</a></td></tr>\n<tr class=\"memdesc:ga66a044feff0a17b1bf275bc8d200e514\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">More...</a><br /></td></tr>\n<tr class=\"separator:ga66a044feff0a17b1bf275bc8d200e514\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c78fa1875926e5c6684ae1f8b49092a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">mediump_mat3x3</a></td></tr>\n<tr class=\"memdesc:ga2c78fa1875926e5c6684ae1f8b49092a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c78fa1875926e5c6684ae1f8b49092a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5bcf41dd2acbace9ed7ae4326cb45e6e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">mediump_mat3x4</a></td></tr>\n<tr class=\"memdesc:ga5bcf41dd2acbace9ed7ae4326cb45e6e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5bcf41dd2acbace9ed7ae4326cb45e6e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0f910a2c5bf1c3fd153c4bc13cefee58\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">mediump_mat4</a></td></tr>\n<tr class=\"memdesc:ga0f910a2c5bf1c3fd153c4bc13cefee58\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0f910a2c5bf1c3fd153c4bc13cefee58\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaced6ccfdae150c4465be59c0b15f4d9e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">mediump_mat4x2</a></td></tr>\n<tr class=\"memdesc:gaced6ccfdae150c4465be59c0b15f4d9e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaced6ccfdae150c4465be59c0b15f4d9e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1bab99cd9c4edd4bffdab662609b0961\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">mediump_mat4x3</a></td></tr>\n<tr class=\"memdesc:ga1bab99cd9c4edd4bffdab662609b0961\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1bab99cd9c4edd4bffdab662609b0961\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga005facdef4caac0ef7435eee609c7e46\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">mediump_mat4x4</a></td></tr>\n<tr class=\"memdesc:ga005facdef4caac0ef7435eee609c7e46\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">More...</a><br /></td></tr>\n<tr class=\"separator:ga005facdef4caac0ef7435eee609c7e46\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">inverse</a> (mat&lt; C, R, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the inverse of a squared matrix.  <a href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00107_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00107.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00082.html\">qualifier.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;        <span class=\"keyword\">struct </span>outerProduct_trait{};</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_TEMPLATE_ALIASES</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat2x2 = mat&lt;2, 2, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat2x3 = mat&lt;2, 3, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat2x4 = mat&lt;2, 4, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat3x2 = mat&lt;3, 2, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat3x3 = mat&lt;3, 3, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat3x4 = mat&lt;3, 4, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat4x2 = mat&lt;4, 2, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat4x3 = mat&lt;4, 3, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tmat4x4 = mat&lt;4, 4, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif//GLM_HAS_TEMPLATE_ALIASES</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t C, length_t R, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;        GLM_FUNC_DECL mat&lt;C, R, T, Q&gt; <a class=\"code\" href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">inverse</a>(mat&lt;C, R, T, Q&gt; <span class=\"keyword\">const</span>&amp; m);</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">   38</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">lowp_mat2</a>;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">   45</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">mediump_mat2</a>;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">   52</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">highp_mat2</a>;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">   59</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">lowp_mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">   66</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">mediump_mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">   73</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, float, highp&gt;         <a class=\"code\" href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">highp_mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">   85</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">lowp_mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">   92</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">mediump_mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">   99</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">highp_mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">  111</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">lowp_mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">  118</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">mediump_mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">  125</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">highp_mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">  137</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">lowp_mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">  144</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">mediump_mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">  151</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">highp_mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">  163</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">lowp_mat3</a>;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">  170</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">mediump_mat3</a>;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">  177</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">highp_mat3</a>;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">  184</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">lowp_mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">  191</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">mediump_mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">  198</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">highp_mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">  210</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">lowp_mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">  217</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">mediump_mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">  224</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, float, highp&gt;         <a class=\"code\" href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">highp_mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">  236</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">lowp_mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">  243</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">mediump_mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">  250</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">highp_mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">  262</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">lowp_mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">  269</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">mediump_mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">  276</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, float, highp&gt;         <a class=\"code\" href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">highp_mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">  289</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">lowp_mat4</a>;</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">  296</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">mediump_mat4</a>;</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">  303</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">highp_mat4</a>;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">  310</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">lowp_mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">  317</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, mediump&gt;       <a class=\"code\" href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">mediump_mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">  324</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, float, highp&gt;         <a class=\"code\" href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">highp_mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;        <span class=\"comment\">// Float definition</span></div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat2x2                     <a class=\"code\" href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat2x3                     <a class=\"code\" href=\"a00144.html#gafb063d734266e92915d87f8943560471\">mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat2x4                     <a class=\"code\" href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat3x2                     <a class=\"code\" href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat3x3                     <a class=\"code\" href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat3x4                     <a class=\"code\" href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat4x2                     <a class=\"code\" href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat4x3                     <a class=\"code\" href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;        <span class=\"keyword\">typedef</span> lowp_mat4x4                     <a class=\"code\" href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat2x2          <a class=\"code\" href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat2x3          <a class=\"code\" href=\"a00144.html#gafb063d734266e92915d87f8943560471\">mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat2x4          <a class=\"code\" href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat3x2          <a class=\"code\" href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat3x3          <a class=\"code\" href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat3x4          <a class=\"code\" href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat4x2          <a class=\"code\" href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat4x3          <a class=\"code\" href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;        <span class=\"keyword\">typedef</span> mediump_mat4x4          <a class=\"code\" href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;<span class=\"preprocessor\">#else   </span></div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;        <span class=\"keyword\">typedef</span> highp_mat2x2                    <a class=\"code\" href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gafb063d734266e92915d87f8943560471\">  363</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_mat2x3                    <a class=\"code\" href=\"a00144.html#gafb063d734266e92915d87f8943560471\">mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">  368</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_mat2x4                    <a class=\"code\" href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">  373</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_mat3x2                    <a class=\"code\" href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">  378</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_mat3x3                    <a class=\"code\" href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">  383</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_mat3x4                    <a class=\"code\" href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">  388</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_mat4x2                    <a class=\"code\" href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">  393</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_mat4x3                    <a class=\"code\" href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">  398</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_mat4x4                    <a class=\"code\" href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">  405</a></span>&#160;        <span class=\"keyword\">typedef</span> mat2x2                                  <a class=\"code\" href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">mat2</a>;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">  410</a></span>&#160;        <span class=\"keyword\">typedef</span> mat3x3                                  <a class=\"code\" href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">mat3</a>;</div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">  415</a></span>&#160;        <span class=\"keyword\">typedef</span> mat4x4                                  <a class=\"code\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">mat4</a>;</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;        <span class=\"comment\">// Double definition</span></div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga0dfc5624d872b189ab4a82bebca7107c\">  427</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga0dfc5624d872b189ab4a82bebca7107c\">lowp_dmat2</a>;</div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0\">  433</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0\">mediump_dmat2</a>;</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga02c6ed0185f84600c3b5001cf0db4746\">  439</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga02c6ed0185f84600c3b5001cf0db4746\">highp_dmat2</a>;</div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c\">  445</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c\">lowp_dmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gade27733f04b9a6f723850263ccda908b\">  451</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#gade27733f04b9a6f723850263ccda908b\">mediump_dmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga458e8160a061147a3a2021c574b19787\">  457</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga458e8160a061147a3a2021c574b19787\">highp_dmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga4450cd185006155fff0380dad2d70ec4\">  468</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga4450cd185006155fff0380dad2d70ec4\">lowp_dmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00474\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e\">  474</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e\">mediump_dmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\">  475</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5\">  480</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5\">highp_dmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00483\"></a><span class=\"lineno\">  483</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00486\"></a><span class=\"lineno\">  486</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga49b6a11f54dcec866c0ecf17d7685165\">  491</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga49b6a11f54dcec866c0ecf17d7685165\">lowp_dmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga6afa4f5d70f8e0dceed640a26918661b\">  497</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#ga6afa4f5d70f8e0dceed640a26918661b\">mediump_dmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga8b4fed753f9b7c217b0401dc808e780a\">  503</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga8b4fed753f9b7c217b0401dc808e780a\">highp_dmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga02af788947516c41893c658990783fd4\">  514</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga02af788947516c41893c658990783fd4\">lowp_dmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4\">  520</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4\">mediump_dmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\">  521</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga5922c1b5a0a4973b0256db146aa77049\">  526</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga5922c1b5a0a4973b0256db146aa77049\">highp_dmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00537\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gadffb225ac88b8a65e1e76233b8bd5768\">  537</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, float, lowp&gt;          <a class=\"code\" href=\"a00145.html#gadffb225ac88b8a65e1e76233b8bd5768\">lowp_dmat3</a>;</div>\n<div class=\"line\"><a name=\"l00538\"></a><span class=\"lineno\">  538</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga5418e9669f0673640a2fbdeb261aff50\">  543</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#ga5418e9669f0673640a2fbdeb261aff50\">mediump_dmat3</a>;</div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a\">  549</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a\">highp_dmat3</a>;</div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\">  550</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00555\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga0bae293e714e00f23e4bbf5a6c000448\">  555</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga0bae293e714e00f23e4bbf5a6c000448\">lowp_dmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gafee0cf7585d59b2485e42e8aae4714ca\">  561</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#gafee0cf7585d59b2485e42e8aae4714ca\">mediump_dmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00562\"></a><span class=\"lineno\">  562</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00567\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516\">  567</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, double, highp&gt;                <a class=\"code\" href=\"a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516\">highp_dmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga42108fc51b1c14745e6edf399c1d0150\">  578</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga42108fc51b1c14745e6edf399c1d0150\">lowp_dmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00579\"></a><span class=\"lineno\">  579</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00584\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga9e0578807bf8880cea8336dfdb666d69\">  584</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#ga9e0578807bf8880cea8336dfdb666d69\">mediump_dmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00585\"></a><span class=\"lineno\">  585</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8\">  590</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8\">highp_dmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00591\"></a><span class=\"lineno\">  591</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00596\"></a><span class=\"lineno\">  596</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00601\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga3daec60b56a8d57455cb60d8328f3645\">  601</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga3daec60b56a8d57455cb60d8328f3645\">lowp_dmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00607\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680\">  607</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680\">mediump_dmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00613\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gad779abbdd0c7594cee515e4546d3db29\">  613</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, double, highp&gt;                <a class=\"code\" href=\"a00145.html#gad779abbdd0c7594cee515e4546d3db29\">highp_dmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00614\"></a><span class=\"lineno\">  614</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00619\"></a><span class=\"lineno\">  619</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00624\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d\">  624</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d\">lowp_dmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00625\"></a><span class=\"lineno\">  625</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00630\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga002d912d086a3eaa5425a6c4ca468fea\">  630</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#ga002d912d086a3eaa5425a6c4ca468fea\">mediump_dmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00631\"></a><span class=\"lineno\">  631</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00636\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga719750bee4022a646b006d2dda75cb76\">  636</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga719750bee4022a646b006d2dda75cb76\">highp_dmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00639\"></a><span class=\"lineno\">  639</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00642\"></a><span class=\"lineno\">  642</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00647\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a\">  647</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a\">lowp_dmat4</a>;</div>\n<div class=\"line\"><a name=\"l00648\"></a><span class=\"lineno\">  648</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00653\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gafaf455c1dff11cb8f3c86467ac27a461\">  653</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#gafaf455c1dff11cb8f3c86467ac27a461\">mediump_dmat4</a>;</div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00659\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d\">  659</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, double, highp&gt;                <a class=\"code\" href=\"a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d\">highp_dmat4</a>;</div>\n<div class=\"line\"><a name=\"l00660\"></a><span class=\"lineno\">  660</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00665\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga843a2b7ca501078963910ea0b453f970\">  665</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, double, lowp&gt;         <a class=\"code\" href=\"a00145.html#ga843a2b7ca501078963910ea0b453f970\">lowp_dmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00666\"></a><span class=\"lineno\">  666</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f\">  671</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, double, mediump&gt;      <a class=\"code\" href=\"a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f\">mediump_dmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00672\"></a><span class=\"lineno\">  672</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00677\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gab7e154baf836679251844a5d933bd0aa\">  677</a></span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, double, highp&gt;                <a class=\"code\" href=\"a00145.html#gab7e154baf836679251844a5d933bd0aa\">highp_dmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00678\"></a><span class=\"lineno\">  678</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00682\"></a><span class=\"lineno\">  682</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat2x2            <a class=\"code\" href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">dmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00683\"></a><span class=\"lineno\">  683</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat2x3            <a class=\"code\" href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">dmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00684\"></a><span class=\"lineno\">  684</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat2x4            <a class=\"code\" href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">dmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00685\"></a><span class=\"lineno\">  685</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat3x2            <a class=\"code\" href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">dmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00686\"></a><span class=\"lineno\">  686</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat3x3            <a class=\"code\" href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">dmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00687\"></a><span class=\"lineno\">  687</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat3x4            <a class=\"code\" href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">dmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00688\"></a><span class=\"lineno\">  688</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat4x2            <a class=\"code\" href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">dmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00689\"></a><span class=\"lineno\">  689</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat4x3            <a class=\"code\" href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">dmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00690\"></a><span class=\"lineno\">  690</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dmat4x4            <a class=\"code\" href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">dmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00691\"></a><span class=\"lineno\">  691</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\">  692</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat2x2         <a class=\"code\" href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">dmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00693\"></a><span class=\"lineno\">  693</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat2x3         <a class=\"code\" href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">dmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00694\"></a><span class=\"lineno\">  694</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat2x4         <a class=\"code\" href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">dmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00695\"></a><span class=\"lineno\">  695</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat3x2         <a class=\"code\" href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">dmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00696\"></a><span class=\"lineno\">  696</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat3x3         <a class=\"code\" href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">dmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00697\"></a><span class=\"lineno\">  697</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat3x4         <a class=\"code\" href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">dmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00698\"></a><span class=\"lineno\">  698</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat4x2         <a class=\"code\" href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">dmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00699\"></a><span class=\"lineno\">  699</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat4x3         <a class=\"code\" href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">dmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00700\"></a><span class=\"lineno\">  700</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dmat4x4         <a class=\"code\" href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">dmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00701\"></a><span class=\"lineno\">  701</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_DOUBLE)</span></div>\n<div class=\"line\"><a name=\"l00702\"></a><span class=\"lineno\">  702</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00706\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gac7f51e23c8802d867f564dfd146bdb44\">  706</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat2x2           <a class=\"code\" href=\"a00144.html#gac7f51e23c8802d867f564dfd146bdb44\">dmat2</a>;</div>\n<div class=\"line\"><a name=\"l00707\"></a><span class=\"lineno\">  707</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00711\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff\">  711</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat3x3           <a class=\"code\" href=\"a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff\">dmat3</a>;</div>\n<div class=\"line\"><a name=\"l00712\"></a><span class=\"lineno\">  712</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00716\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27\">  716</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat4x4           <a class=\"code\" href=\"a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27\">dmat4</a>;</div>\n<div class=\"line\"><a name=\"l00717\"></a><span class=\"lineno\">  717</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00721\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">  721</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat2x2           <a class=\"code\" href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">dmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00722\"></a><span class=\"lineno\">  722</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00726\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">  726</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat2x3           <a class=\"code\" href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">dmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00731\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">  731</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat2x4           <a class=\"code\" href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">dmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00732\"></a><span class=\"lineno\">  732</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00736\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">  736</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat3x2           <a class=\"code\" href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">dmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00737\"></a><span class=\"lineno\">  737</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00741\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">  741</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat3x3           <a class=\"code\" href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">dmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00742\"></a><span class=\"lineno\">  742</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00746\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">  746</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat3x4           <a class=\"code\" href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">dmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00747\"></a><span class=\"lineno\">  747</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00751\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">  751</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat4x2           <a class=\"code\" href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">dmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00752\"></a><span class=\"lineno\">  752</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00756\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">  756</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat4x3           <a class=\"code\" href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">dmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00757\"></a><span class=\"lineno\">  757</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00761\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">  761</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dmat4x4           <a class=\"code\" href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">dmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00762\"></a><span class=\"lineno\">  762</span>&#160;</div>\n<div class=\"line\"><a name=\"l00763\"></a><span class=\"lineno\">  763</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00764\"></a><span class=\"lineno\">  764</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00766\"></a><span class=\"lineno\">  766</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00145_html_ga3daec60b56a8d57455cb60d8328f3645\"><div class=\"ttname\"><a href=\"a00145.html#ga3daec60b56a8d57455cb60d8328f3645\">glm::lowp_dmat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, double, lowp &gt; lowp_dmat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00601\">type_mat.hpp:601</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gad31f8a0097ff6c22b92cf855dfffc575\"><div class=\"ttname\"><a href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">glm::mediump_mat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, mediump &gt; mediump_mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00170\">type_mat.hpp:170</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga0bda8ba50fa930ef29d4fa91a85f229a\"><div class=\"ttname\"><a href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">glm::mediump_mat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, float, mediump &gt; mediump_mat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00092\">type_mat.hpp:92</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga4d2ac1a80c36fb5a1d15914035f792ac\"><div class=\"ttname\"><a href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">glm::mat2x4</a></div><div class=\"ttdeci\">highp_mat2x4 mat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00368\">type_mat.hpp:368</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga38d9bfca882ec542b1928cf77b5c2091\"><div class=\"ttname\"><a href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">glm::dmat3x4</a></div><div class=\"ttdeci\">highp_dmat3x4 dmat3x4</div><div class=\"ttdoc\">3 * 4 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00746\">type_mat.hpp:746</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga0c84b211a5730357b63c6d2e4fb696d5\"><div class=\"ttname\"><a href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">glm::mat2x2</a></div><div class=\"ttdeci\">highp_mat2x2 mat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00358\">type_mat.hpp:358</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gafee0cf7585d59b2485e42e8aae4714ca\"><div class=\"ttname\"><a href=\"a00145.html#gafee0cf7585d59b2485e42e8aae4714ca\">glm::mediump_dmat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, double, mediump &gt; mediump_dmat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00561\">type_mat.hpp:561</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga7876e0c3e3fcc3e2f4c0462c152e87cf\"><div class=\"ttname\"><a href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">glm::mat3x4</a></div><div class=\"ttdeci\">highp_mat3x4 mat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00383\">type_mat.hpp:383</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga0f910a2c5bf1c3fd153c4bc13cefee58\"><div class=\"ttname\"><a href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">glm::mediump_mat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, mediump &gt; mediump_mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00296\">type_mat.hpp:296</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga993bdd19989dc1f4d09f664a2ee74cb5\"><div class=\"ttname\"><a href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">glm::lowp_mat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, lowp &gt; lowp_mat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00059\">type_mat.hpp:59</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga9f30904176d75657930fa4383618f968\"><div class=\"ttname\"><a href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">glm::highp_mat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, highp &gt; highp_mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00177\">type_mat.hpp:177</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga6dd3ec98a548755676267e59142911f8\"><div class=\"ttname\"><a href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">glm::mat3</a></div><div class=\"ttdeci\">mat3x3 mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00410\">type_mat.hpp:410</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga005facdef4caac0ef7435eee609c7e46\"><div class=\"ttname\"><a href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">glm::mediump_mat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, mediump &gt; mediump_mat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00317\">type_mat.hpp:317</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga9839115cb8be9524f0621caf4bb29665\"><div class=\"ttname\"><a href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">glm::lowp_mat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, float, lowp &gt; lowp_mat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00236\">type_mat.hpp:236</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaf93a24b2e1c4a6f556fbcc796ec90e63\"><div class=\"ttname\"><a href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">glm::highp_mat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, float, highp &gt; highp_mat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00276\">type_mat.hpp:276</a></div></div>\n<div class=\"ttc\" id=\"a00230_html_gacc53488cd254cbe33d1b505a72ef3719\"><div class=\"ttname\"><a href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">glm::inverse</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt; inverse(mat&lt; C, R, T, Q &gt; const &amp;m)</div><div class=\"ttdoc\">Return the inverse of a squared matrix. </div></div>\n<div class=\"ttc\" id=\"a00145_html_gaca3b96f84c48db9830b5b0d4b07d1516\"><div class=\"ttname\"><a href=\"a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516\">glm::highp_dmat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, double, highp &gt; highp_dmat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00567\">type_mat.hpp:567</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga97b38ea24e9ebf58eac04a8d99dc3e27\"><div class=\"ttname\"><a href=\"a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27\">glm::dmat4</a></div><div class=\"ttdeci\">highp_dmat4x4 dmat4</div><div class=\"ttdoc\">4 * 4 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00716\">type_mat.hpp:716</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga08bba677ef7b2809ac0061fa9a3db854\"><div class=\"ttname\"><a href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">glm::lowp_mat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, lowp &gt; lowp_mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00038\">type_mat.hpp:38</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gade27733f04b9a6f723850263ccda908b\"><div class=\"ttname\"><a href=\"a00145.html#gade27733f04b9a6f723850263ccda908b\">glm::mediump_dmat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, double, mediump &gt; mediump_dmat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00451\">type_mat.hpp:451</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga7eb333327f0b261237b540496137d55e\"><div class=\"ttname\"><a href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">glm::lowp_mat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, float, lowp &gt; lowp_mat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00262\">type_mat.hpp:262</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaaf5b6171d297b3a1c6c771e8b912c08d\"><div class=\"ttname\"><a href=\"a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d\">glm::lowp_dmat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, double, lowp &gt; lowp_dmat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00624\">type_mat.hpp:624</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gafb063d734266e92915d87f8943560471\"><div class=\"ttname\"><a href=\"a00144.html#gafb063d734266e92915d87f8943560471\">glm::mat2x3</a></div><div class=\"ttdeci\">highp_mat2x3 mat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00363\">type_mat.hpp:363</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga1e4b7727038383e0103b138c66a65039\"><div class=\"ttname\"><a href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">glm::lowp_mat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, lowp &gt; lowp_mat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00184\">type_mat.hpp:184</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga04b32b7cbfddf0f02a8b442f8b376680\"><div class=\"ttname\"><a href=\"a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680\">glm::mediump_dmat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, double, mediump &gt; mediump_dmat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00607\">type_mat.hpp:607</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga1cb3c561a32f0864733dfaf97c71f0c7\"><div class=\"ttname\"><a href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">glm::dmat2x3</a></div><div class=\"ttdeci\">highp_dmat2x3 dmat2x3</div><div class=\"ttdoc\">2 * 3 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00726\">type_mat.hpp:726</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga9e0578807bf8880cea8336dfdb666d69\"><div class=\"ttname\"><a href=\"a00145.html#ga9e0578807bf8880cea8336dfdb666d69\">glm::mediump_dmat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, double, mediump &gt; mediump_dmat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00584\">type_mat.hpp:584</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga5bcf41dd2acbace9ed7ae4326cb45e6e\"><div class=\"ttname\"><a href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">glm::mediump_mat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, float, mediump &gt; mediump_mat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00217\">type_mat.hpp:217</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga458e8160a061147a3a2021c574b19787\"><div class=\"ttname\"><a href=\"a00145.html#ga458e8160a061147a3a2021c574b19787\">glm::highp_dmat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, double, highp &gt; highp_dmat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00457\">type_mat.hpp:457</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga60fe4ae1b320094bc2a8d977505a97f5\"><div class=\"ttname\"><a href=\"a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5\">glm::highp_dmat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, double, highp &gt; highp_dmat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00480\">type_mat.hpp:480</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga3839ca29d011a80ff3ede7f22ba602a4\"><div class=\"ttname\"><a href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">glm::mat3x2</a></div><div class=\"ttdeci\">highp_mat3x2 mat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00373\">type_mat.hpp:373</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga5d0f05a7d08f3f058110e1b79f805d7a\"><div class=\"ttname\"><a href=\"a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a\">glm::lowp_dmat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, double, lowp &gt; lowp_dmat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00647\">type_mat.hpp:647</a></div></div>\n<div class=\"ttc\" id=\"a00082_html\"><div class=\"ttname\"><a href=\"a00082.html\">qualifier.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga0bae293e714e00f23e4bbf5a6c000448\"><div class=\"ttname\"><a href=\"a00145.html#ga0bae293e714e00f23e4bbf5a6c000448\">glm::lowp_dmat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, double, lowp &gt; lowp_dmat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00555\">type_mat.hpp:555</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga02af788947516c41893c658990783fd4\"><div class=\"ttname\"><a href=\"a00145.html#ga02af788947516c41893c658990783fd4\">glm::lowp_dmat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, double, lowp &gt; lowp_dmat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00514\">type_mat.hpp:514</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga1bab99cd9c4edd4bffdab662609b0961\"><div class=\"ttname\"><a href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">glm::mediump_mat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, float, mediump &gt; mediump_mat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00269\">type_mat.hpp:269</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga6ddab280c735a2139133b4164b99a68a\"><div class=\"ttname\"><a href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">glm::dmat4x2</a></div><div class=\"ttdeci\">highp_dmat4x2 dmat4x2</div><div class=\"ttdoc\">4 * 2 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00751\">type_mat.hpp:751</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gade0eb47c01f79384a6f38017ede17446\"><div class=\"ttname\"><a href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">glm::mat4</a></div><div class=\"ttdeci\">mat4x4 mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00415\">type_mat.hpp:415</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga6e30cfba068ebc3c71fe1f8b3110e450\"><div class=\"ttname\"><a href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">glm::mat2</a></div><div class=\"ttdeci\">mat2x2 mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00405\">type_mat.hpp:405</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga0dfc5624d872b189ab4a82bebca7107c\"><div class=\"ttname\"><a href=\"a00145.html#ga0dfc5624d872b189ab4a82bebca7107c\">glm::lowp_dmat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, double, lowp &gt; lowp_dmat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00427\">type_mat.hpp:427</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gacc27b39853a2ecb538c8b3afc20c359e\"><div class=\"ttname\"><a href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">glm::dmat2x2</a></div><div class=\"ttdeci\">highp_dmat2x2 dmat2x2</div><div class=\"ttdoc\">2 * 2 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00721\">type_mat.hpp:721</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga719750bee4022a646b006d2dda75cb76\"><div class=\"ttname\"><a href=\"a00145.html#ga719750bee4022a646b006d2dda75cb76\">glm::highp_dmat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, double, highp &gt; highp_dmat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00636\">type_mat.hpp:636</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga089315d5a0c20ac6eaa17a854bbd2e81\"><div class=\"ttname\"><a href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">glm::mat4x4</a></div><div class=\"ttdeci\">highp_mat4x4 mat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00398\">type_mat.hpp:398</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaec22f44dddbdadfe5dfca68eb3457ea8\"><div class=\"ttname\"><a href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">glm::dmat3x2</a></div><div class=\"ttdeci\">highp_dmat3x2 dmat3x2</div><div class=\"ttdoc\">3 * 2 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00736\">type_mat.hpp:736</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga60cb89371783bb18003d3b2f8dbf62f8\"><div class=\"ttname\"><a href=\"a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8\">glm::highp_dmat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, double, highp &gt; highp_dmat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00590\">type_mat.hpp:590</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga441b8e3402eefca108b40f3d22a1baa9\"><div class=\"ttname\"><a href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">glm::highp_mat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, float, highp &gt; highp_mat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00099\">type_mat.hpp:99</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga66a044feff0a17b1bf275bc8d200e514\"><div class=\"ttname\"><a href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">glm::mediump_mat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, float, mediump &gt; mediump_mat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00144\">type_mat.hpp:144</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gab7e154baf836679251844a5d933bd0aa\"><div class=\"ttname\"><a href=\"a00145.html#gab7e154baf836679251844a5d933bd0aa\">glm::highp_dmat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, double, highp &gt; highp_dmat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00677\">type_mat.hpp:677</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gafaf455c1dff11cb8f3c86467ac27a461\"><div class=\"ttname\"><a href=\"a00145.html#gafaf455c1dff11cb8f3c86467ac27a461\">glm::mediump_dmat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, double, mediump &gt; mediump_dmat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00653\">type_mat.hpp:653</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga5922c1b5a0a4973b0256db146aa77049\"><div class=\"ttname\"><a href=\"a00145.html#ga5922c1b5a0a4973b0256db146aa77049\">glm::highp_dmat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, double, highp &gt; highp_dmat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00526\">type_mat.hpp:526</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga6d8eec93e1655d7889d2ef05c3fe580a\"><div class=\"ttname\"><a href=\"a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a\">glm::highp_dmat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, double, highp &gt; highp_dmat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00549\">type_mat.hpp:549</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga02c6ed0185f84600c3b5001cf0db4746\"><div class=\"ttname\"><a href=\"a00145.html#ga02c6ed0185f84600c3b5001cf0db4746\">glm::highp_dmat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, double, highp &gt; highp_dmat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00439\">type_mat.hpp:439</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gabb2ee47d6bffb6d6363b34a7c61c8229\"><div class=\"ttname\"><a href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">glm::highp_mat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, highp &gt; highp_mat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00073\">type_mat.hpp:73</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga3b030d815c7c9f77c3c47e708863fd62\"><div class=\"ttname\"><a href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">glm::highp_mat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, float, highp &gt; highp_mat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00125\">type_mat.hpp:125</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga332149037f33cec9d9b583e11c3c8524\"><div class=\"ttname\"><a href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">glm::highp_mat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, highp &gt; highp_mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00303\">type_mat.hpp:303</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga49b6a11f54dcec866c0ecf17d7685165\"><div class=\"ttname\"><a href=\"a00145.html#ga49b6a11f54dcec866c0ecf17d7685165\">glm::lowp_dmat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, double, lowp &gt; lowp_dmat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00491\">type_mat.hpp:491</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga4fcceff924fa2dc1f3d5217f68c5f81a\"><div class=\"ttname\"><a href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">glm::highp_mat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, highp &gt; highp_mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00052\">type_mat.hpp:52</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga002d912d086a3eaa5425a6c4ca468fea\"><div class=\"ttname\"><a href=\"a00145.html#ga002d912d086a3eaa5425a6c4ca468fea\">glm::mediump_dmat4x3</a></div><div class=\"ttdeci\">mat&lt; 4, 3, double, mediump &gt; mediump_dmat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00630\">type_mat.hpp:630</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaf1beb3328c79fece7dcc34c5b05b57a0\"><div class=\"ttname\"><a href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">glm::mediump_mat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, mediump &gt; mediump_mat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00066\">type_mat.hpp:66</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gadffb225ac88b8a65e1e76233b8bd5768\"><div class=\"ttname\"><a href=\"a00145.html#gadffb225ac88b8a65e1e76233b8bd5768\">glm::lowp_dmat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, lowp &gt; lowp_dmat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00537\">type_mat.hpp:537</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gabb55c60d8c7fb400bf2ed511251ca394\"><div class=\"ttname\"><a href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">glm::highp_mat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, float, highp &gt; highp_mat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00224\">type_mat.hpp:224</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaddd230c88fbd6ec33242329be3a1b738\"><div class=\"ttname\"><a href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">glm::dmat2x4</a></div><div class=\"ttdeci\">highp_dmat2x4 dmat2x4</div><div class=\"ttdoc\">2 * 4 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00731\">type_mat.hpp:731</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga78e7b9e6dcadb7e8ac5562fe0263786c\"><div class=\"ttname\"><a href=\"a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c\">glm::lowp_dmat2x2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, double, lowp &gt; lowp_dmat2x2</div><div class=\"ttdoc\">2 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00445\">type_mat.hpp:445</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga378921b6a07bcdad946858b340f69ab1\"><div class=\"ttname\"><a href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">glm::mat3x3</a></div><div class=\"ttdeci\">highp_mat3x3 mat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00378\">type_mat.hpp:378</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga73e2f3bcae71b05736f2c962f98565a1\"><div class=\"ttname\"><a href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">glm::lowp_mat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, lowp &gt; lowp_mat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00289\">type_mat.hpp:289</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga2c78fa1875926e5c6684ae1f8b49092a\"><div class=\"ttname\"><a href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">glm::mediump_mat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, mediump &gt; mediump_mat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00191\">type_mat.hpp:191</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga39ba2335320534c19db435a27d8bb765\"><div class=\"ttname\"><a href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">glm::highp_mat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, float, highp &gt; highp_mat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00250\">type_mat.hpp:250</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga8b4fed753f9b7c217b0401dc808e780a\"><div class=\"ttname\"><a href=\"a00145.html#ga8b4fed753f9b7c217b0401dc808e780a\">glm::highp_dmat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, double, highp &gt; highp_dmat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00503\">type_mat.hpp:503</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga42a7c3c9eafb869c000b4388913ce0c7\"><div class=\"ttname\"><a href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">glm::lowp_mat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, float, lowp &gt; lowp_mat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00210\">type_mat.hpp:210</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga12276a2b151d87c039134c388b5a3746\"><div class=\"ttname\"><a href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">glm::highp_mat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, float, highp &gt; highp_mat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00151\">type_mat.hpp:151</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gac44263f56ff3cbf0a9cc4e2405d5ecb8\"><div class=\"ttname\"><a href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">glm::dmat3x3</a></div><div class=\"ttdeci\">highp_dmat3x3 dmat3x3</div><div class=\"ttdoc\">3 * 3 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00741\">type_mat.hpp:741</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga253243e9a0e6a6235e41351f3d6fbd2e\"><div class=\"ttname\"><a href=\"a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e\">glm::mediump_dmat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, double, mediump &gt; mediump_dmat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00474\">type_mat.hpp:474</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaa190a86a477360f02508191a6549efc3\"><div class=\"ttname\"><a href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">glm::mediump_mat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, float, mediump &gt; mediump_mat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00118\">type_mat.hpp:118</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaeac3848d29b4b47332c44c31d9bcfa2f\"><div class=\"ttname\"><a href=\"a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f\">glm::mediump_dmat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, double, mediump &gt; mediump_dmat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00671\">type_mat.hpp:671</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga083089177b89ae9166d8d251a90f4b8b\"><div class=\"ttname\"><a href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">glm::lowp_mat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, float, lowp &gt; lowp_mat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00085\">type_mat.hpp:85</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga83fe5281ac0a3d153226b903badd415b\"><div class=\"ttname\"><a href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">glm::mediump_mat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, float, mediump &gt; mediump_mat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00045\">type_mat.hpp:45</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gad779abbdd0c7594cee515e4546d3db29\"><div class=\"ttname\"><a href=\"a00145.html#gad779abbdd0c7594cee515e4546d3db29\">glm::highp_dmat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, double, highp &gt; highp_dmat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00613\">type_mat.hpp:613</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga96af41ad54c906b0ed14cbe43ca7db0d\"><div class=\"ttname\"><a href=\"a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d\">glm::highp_dmat4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, double, highp &gt; highp_dmat4</div><div class=\"ttdoc\">4 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00659\">type_mat.hpp:659</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga1b3f6a5cbc17362141f9781262ed838f\"><div class=\"ttname\"><a href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">glm::mat4x2</a></div><div class=\"ttdeci\">highp_mat4x2 mat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00388\">type_mat.hpp:388</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaced6ccfdae150c4465be59c0b15f4d9e\"><div class=\"ttname\"><a href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">glm::mediump_mat4x2</a></div><div class=\"ttdeci\">mat&lt; 4, 2, float, mediump &gt; mediump_mat4x2</div><div class=\"ttdoc\">4 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00243\">type_mat.hpp:243</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga4450cd185006155fff0380dad2d70ec4\"><div class=\"ttname\"><a href=\"a00145.html#ga4450cd185006155fff0380dad2d70ec4\">glm::lowp_dmat2x3</a></div><div class=\"ttdeci\">mat&lt; 2, 3, double, lowp &gt; lowp_dmat2x3</div><div class=\"ttdoc\">2 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00468\">type_mat.hpp:468</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga41c2da87ca627c1b2da5e895435a508e\"><div class=\"ttname\"><a href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">glm::dmat4x4</a></div><div class=\"ttdeci\">highp_dmat4x4 dmat4x4</div><div class=\"ttdoc\">4 * 4 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00761\">type_mat.hpp:761</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gae6e9638a6d1cadbd22f27c02998ebbf8\"><div class=\"ttname\"><a href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">glm::lowp_mat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, float, lowp &gt; lowp_mat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00111\">type_mat.hpp:111</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga8378facff06c21d2092a9a13c9ef0a0b\"><div class=\"ttname\"><a href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">glm::lowp_mat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, lowp &gt; lowp_mat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00310\">type_mat.hpp:310</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gacc4e277672e9f7b3cde23a4a3bd24fc9\"><div class=\"ttname\"><a href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">glm::lowp_mat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, lowp &gt; lowp_mat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00163\">type_mat.hpp:163</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga843a2b7ca501078963910ea0b453f970\"><div class=\"ttname\"><a href=\"a00145.html#ga843a2b7ca501078963910ea0b453f970\">glm::lowp_dmat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, double, lowp &gt; lowp_dmat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00665\">type_mat.hpp:665</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga2196f803d3b4e1f920acef5b32ab41c4\"><div class=\"ttname\"><a href=\"a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4\">glm::mediump_dmat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, double, mediump &gt; mediump_dmat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00520\">type_mat.hpp:520</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gab6c8974496fc7c72dad09219118ba89e\"><div class=\"ttname\"><a href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">glm::dmat4x3</a></div><div class=\"ttdeci\">highp_dmat4x3 dmat4x3</div><div class=\"ttdoc\">4 * 3 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00756\">type_mat.hpp:756</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga989736bc5e50330ef3ab13d34bebc66f\"><div class=\"ttname\"><a href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">glm::highp_mat4x4</a></div><div class=\"ttdeci\">mat&lt; 4, 4, float, highp &gt; highp_mat4x4</div><div class=\"ttdoc\">4 columns of 4 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00324\">type_mat.hpp:324</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga1b33e2669c291268ac4b1c9c296d2dc3\"><div class=\"ttname\"><a href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">glm::highp_mat3x3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, float, highp &gt; highp_mat3x3</div><div class=\"ttdoc\">3 columns of 3 components matrix of high qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00198\">type_mat.hpp:198</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga6afa4f5d70f8e0dceed640a26918661b\"><div class=\"ttname\"><a href=\"a00145.html#ga6afa4f5d70f8e0dceed640a26918661b\">glm::mediump_dmat2x4</a></div><div class=\"ttdeci\">mat&lt; 2, 4, double, mediump &gt; mediump_dmat2x4</div><div class=\"ttdoc\">2 columns of 4 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00497\">type_mat.hpp:497</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga5418e9669f0673640a2fbdeb261aff50\"><div class=\"ttname\"><a href=\"a00145.html#ga5418e9669f0673640a2fbdeb261aff50\">glm::mediump_dmat3</a></div><div class=\"ttdeci\">mat&lt; 3, 3, double, mediump &gt; mediump_dmat3</div><div class=\"ttdoc\">3 columns of 3 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00543\">type_mat.hpp:543</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gacd9ff3b943b3d8bda4f4b388320420fd\"><div class=\"ttname\"><a href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">glm::mat4x3</a></div><div class=\"ttdeci\">highp_mat4x3 mat4x3</div><div class=\"ttdoc\">4 columns of 3 components matrix of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00393\">type_mat.hpp:393</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gac7f51e23c8802d867f564dfd146bdb44\"><div class=\"ttname\"><a href=\"a00144.html#gac7f51e23c8802d867f564dfd146bdb44\">glm::dmat2</a></div><div class=\"ttdeci\">highp_dmat2x2 dmat2</div><div class=\"ttdoc\">2 * 2 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00706\">type_mat.hpp:706</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gae174ff65e148bb7dec4bf10a63cb46ff\"><div class=\"ttname\"><a href=\"a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff\">glm::dmat3</a></div><div class=\"ttdeci\">highp_dmat3x3 dmat3</div><div class=\"ttdoc\">3 * 3 matrix of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00711\">type_mat.hpp:711</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga963689d328dfa8fcaa4aa140f2e52cd0\"><div class=\"ttname\"><a href=\"a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0\">glm::mediump_dmat2</a></div><div class=\"ttdeci\">mat&lt; 2, 2, double, mediump &gt; mediump_dmat2</div><div class=\"ttdoc\">2 columns of 2 components matrix of medium qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00433\">type_mat.hpp:433</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga42108fc51b1c14745e6edf399c1d0150\"><div class=\"ttname\"><a href=\"a00145.html#ga42108fc51b1c14745e6edf399c1d0150\">glm::lowp_dmat3x4</a></div><div class=\"ttdeci\">mat&lt; 3, 4, double, lowp &gt; lowp_dmat3x4</div><div class=\"ttdoc\">3 columns of 4 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00578\">type_mat.hpp:578</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga10f0f2108800a543f22d90ecf4b40d01\"><div class=\"ttname\"><a href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">glm::lowp_mat3x2</a></div><div class=\"ttdeci\">mat&lt; 3, 2, float, lowp &gt; lowp_mat3x2</div><div class=\"ttdoc\">3 columns of 2 components matrix of low qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00107_source.html#l00137\">type_mat.hpp:137</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00108.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat2x2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat2x2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00108_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00108_source.html\">type_mat2x2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00108_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat2x2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat2x2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00108.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">type_vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;2, 2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;2, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;2, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;2, 2, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;2, 2, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                col_type value[2];</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>() { <span class=\"keywordflow\">return</span> 2; }</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat(mat&lt;2, 2, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                GLM_FUNC_DECL mat(mat&lt;2, 2, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                GLM_FUNC_DECL explicit mat(T scalar);</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                        T const&amp; x1, T const&amp; y1,</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T const&amp; x2, T const&amp; y2);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                        col_type const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        col_type const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                template&lt;typename U, typename V, typename M, typename N&gt;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                        U const&amp; x1, V const&amp; y1,</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                        M const&amp; x2, N const&amp; y2);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                template&lt;typename U, typename V&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                        vec&lt;2, U, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        vec&lt;2, V, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator=(mat&lt;2, 2, T, Q&gt; const&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator=(mat&lt;2, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator+=(mat&lt;2, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator-=(mat&lt;2, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator*=(mat&lt;2, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator/=(mat&lt;2, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator++ ();</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; &amp; operator-- ();</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator+(mat&lt;2, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator-(mat&lt;2, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator+(mat&lt;2, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator+(T scalar, mat&lt;2, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator+(mat&lt;2, 2, T, Q&gt; const&amp; m1, mat&lt;2, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator-(mat&lt;2, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator-(T scalar, mat&lt;2, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator-(mat&lt;2, 2, T, Q&gt; const&amp; m1, mat&lt;2, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator*(mat&lt;2, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator*(T scalar, mat&lt;2, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        GLM_FUNC_DECL typename mat&lt;2, 2, T, Q&gt;::col_type operator*(mat&lt;2, 2, T, Q&gt; const&amp; m, typename mat&lt;2, 2, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL typename mat&lt;2, 2, T, Q&gt;::row_type operator*(typename mat&lt;2, 2, T, Q&gt;::col_type const&amp; v, mat&lt;2, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator*(mat&lt;2, 2, T, Q&gt; const&amp; m1, mat&lt;2, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator*(mat&lt;2, 2, T, Q&gt; const&amp; m1, mat&lt;3, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator*(mat&lt;2, 2, T, Q&gt; const&amp; m1, mat&lt;4, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator/(mat&lt;2, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator/(T scalar, mat&lt;2, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        GLM_FUNC_DECL typename mat&lt;2, 2, T, Q&gt;::col_type operator/(mat&lt;2, 2, T, Q&gt; const&amp; m, typename mat&lt;2, 2, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        GLM_FUNC_DECL typename mat&lt;2, 2, T, Q&gt;::row_type operator/(typename mat&lt;2, 2, T, Q&gt;::col_type const&amp; v, mat&lt;2, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator/(mat&lt;2, 2, T, Q&gt; const&amp; m1, mat&lt;2, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;2, 2, T, Q&gt; const&amp; m1, mat&lt;2, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;2, 2, T, Q&gt; const&amp; m1, mat&lt;2, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;} <span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat2x2.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00109.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat2x3.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat2x3.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00109_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00109_source.html\">type_mat2x3.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00109_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat2x3.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat2x3.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00109.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">type_vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">type_vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;2, 3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;3, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;2, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;2, 3, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;3, 2, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                col_type value[2];</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>() { <span class=\"keywordflow\">return</span> 2; }</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                GLM_FUNC_DECL mat(mat&lt;2, 3, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                GLM_FUNC_DECL mat(mat&lt;2, 3, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL explicit mat(T scalar);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T x0, T y0, T z0,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                        T x1, T y1, T z1);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        col_type const&amp; v0,</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                        col_type const&amp; v1);</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                template&lt;typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2&gt;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                        X1 x1, Y1 y1, Z1 z1,</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                        X2 x2, Y2 y2, Z2 z2);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                template&lt;typename U, typename V&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        vec&lt;3, U, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        vec&lt;3, V, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator=(mat&lt;2, 3, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator=(mat&lt;2, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator+=(mat&lt;2, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator-=(mat&lt;2, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator++ ();</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; &amp; operator-- ();</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator+(mat&lt;2, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator-(mat&lt;2, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator+(mat&lt;2, 3, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator+(mat&lt;2, 3, T, Q&gt; const&amp; m1, mat&lt;2, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator-(mat&lt;2, 3, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator-(mat&lt;2, 3, T, Q&gt; const&amp; m1, mat&lt;2, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator*(mat&lt;2, 3, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator*(T scalar, mat&lt;2, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        GLM_FUNC_DECL typename mat&lt;2, 3, T, Q&gt;::col_type operator*(mat&lt;2, 3, T, Q&gt; const&amp; m, typename mat&lt;2, 3, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        GLM_FUNC_DECL typename mat&lt;2, 3, T, Q&gt;::row_type operator*(typename mat&lt;2, 3, T, Q&gt;::col_type const&amp; v, mat&lt;2, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator*(mat&lt;2, 3, T, Q&gt; const&amp; m1, mat&lt;2, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator*(mat&lt;2, 3, T, Q&gt; const&amp; m1, mat&lt;3, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator*(mat&lt;2, 3, T, Q&gt; const&amp; m1, mat&lt;4, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator/(mat&lt;2, 3, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator/(T scalar, mat&lt;2, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;2, 3, T, Q&gt; const&amp; m1, mat&lt;2, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;2, 3, T, Q&gt; const&amp; m1, mat&lt;2, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat2x3.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00110.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat2x4.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat2x4.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00110_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00110_source.html\">type_mat2x4.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00110_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat2x4.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat2x4.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00110.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">type_vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">type_vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;2, 4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;4, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;2, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;2, 4, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;4, 2, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                col_type value[2];</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>() { <span class=\"keywordflow\">return</span> 2; }</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                GLM_FUNC_DECL mat(mat&lt;2, 4, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                GLM_FUNC_DECL mat(mat&lt;2, 4, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL explicit mat(T scalar);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T x0, T y0, T z0, T w0,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                        T x1, T y1, T z1, T w1);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        col_type const&amp; v0,</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                        col_type const&amp; v1);</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                template&lt;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                        typename X1, typename Y1, typename Z1, typename W1,</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                        typename X2, typename Y2, typename Z2, typename W2&gt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                        X1 x1, Y1 y1, Z1 z1, W1 w1,</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                        X2 x2, Y2 y2, Z2 z2, W2 w2);</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                template&lt;typename U, typename V&gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                        vec&lt;4, U, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                        vec&lt;4, V, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator=(mat&lt;2, 4, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator=(mat&lt;2, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator+=(mat&lt;2, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator-=(mat&lt;2, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator++ ();</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; &amp; operator-- ();</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator+(mat&lt;2, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator-(mat&lt;2, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator+(mat&lt;2, 4, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator+(mat&lt;2, 4, T, Q&gt; const&amp; m1, mat&lt;2, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator-(mat&lt;2, 4, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator-(mat&lt;2, 4, T, Q&gt; const&amp; m1, mat&lt;2, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator*(mat&lt;2, 4, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator*(T scalar, mat&lt;2, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        GLM_FUNC_DECL typename mat&lt;2, 4, T, Q&gt;::col_type operator*(mat&lt;2, 4, T, Q&gt; const&amp; m, typename mat&lt;2, 4, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        GLM_FUNC_DECL typename mat&lt;2, 4, T, Q&gt;::row_type operator*(typename mat&lt;2, 4, T, Q&gt;::col_type const&amp; v, mat&lt;2, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator*(mat&lt;2, 4, T, Q&gt; const&amp; m1, mat&lt;4, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator*(mat&lt;2, 4, T, Q&gt; const&amp; m1, mat&lt;2, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator*(mat&lt;2, 4, T, Q&gt; const&amp; m1, mat&lt;3, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator/(mat&lt;2, 4, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator/(T scalar, mat&lt;2, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;2, 4, T, Q&gt; const&amp; m1, mat&lt;2, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;2, 4, T, Q&gt; const&amp; m1, mat&lt;2, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat2x4.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00111.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat3x2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat3x2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00111_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00111_source.html\">type_mat3x2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00111_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat3x2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat3x2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00111.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">type_vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">type_vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;3, 2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;2, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;3, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;3, 2, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;2, 3, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                col_type value[3];</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>() { <span class=\"keywordflow\">return</span> 3; }</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                GLM_FUNC_DECL mat(mat&lt;3, 2, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                GLM_FUNC_DECL mat(mat&lt;3, 2, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL explicit mat(T scalar);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T x0, T y0,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                        T x1, T y1,</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                        T x2, T y2);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                        col_type const&amp; v0,</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                        col_type const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                        col_type const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                template&lt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                        typename X1, typename Y1,</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                        typename X2, typename Y2,</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                        typename X3, typename Y3&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        X1 x1, Y1 y1,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        X2 x2, Y2 y2,</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                        X3 x3, Y3 y3);</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                template&lt;typename V1, typename V2, typename V3&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                        vec&lt;2, V1, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                        vec&lt;2, V2, Q&gt; const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                        vec&lt;2, V3, Q&gt; const&amp; v3);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator=(mat&lt;3, 2, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator=(mat&lt;3, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator+=(mat&lt;3, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator-=(mat&lt;3, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator++ ();</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; &amp; operator-- ();</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator+(mat&lt;3, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator-(mat&lt;3, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator+(mat&lt;3, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator+(mat&lt;3, 2, T, Q&gt; const&amp; m1, mat&lt;3, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator-(mat&lt;3, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator-(mat&lt;3, 2, T, Q&gt; const&amp; m1, mat&lt;3, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator*(mat&lt;3, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator*(T scalar, mat&lt;3, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        GLM_FUNC_DECL typename mat&lt;3, 2, T, Q&gt;::col_type operator*(mat&lt;3, 2, T, Q&gt; const&amp; m, typename mat&lt;3, 2, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;        GLM_FUNC_DECL typename mat&lt;3, 2, T, Q&gt;::row_type operator*(typename mat&lt;3, 2, T, Q&gt;::col_type const&amp; v, mat&lt;3, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator*(mat&lt;3, 2, T, Q&gt; const&amp; m1, mat&lt;2, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator*(mat&lt;3, 2, T, Q&gt; const&amp; m1, mat&lt;3, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator*(mat&lt;3, 2, T, Q&gt; const&amp; m1, mat&lt;4, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator/(mat&lt;3, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator/(T scalar, mat&lt;3, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;3, 2, T, Q&gt; const&amp; m1, mat&lt;3, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;3, 2, T, Q&gt; const&amp; m1, mat&lt;3, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat3x2.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00112.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat3x3.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat3x3.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00112_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00112_source.html\">type_mat3x3.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00112_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat3x3.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat3x3.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00112.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">type_vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;3, 3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;3, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;3, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;3, 3, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;3, 3, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                col_type value[3];</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>() { <span class=\"keywordflow\">return</span> 3; }</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat(mat&lt;3, 3, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                GLM_FUNC_DECL mat(mat&lt;3, 3, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                GLM_FUNC_DECL explicit mat(T scalar);</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                        T x0, T y0, T z0,</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T x1, T y1, T z1,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                        T x2, T y2, T z2);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        col_type const&amp; v0,</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                        col_type const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                        col_type const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                template&lt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                        typename X1, typename Y1, typename Z1,</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                        typename X2, typename Y2, typename Z2,</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                        typename X3, typename Y3, typename Z3&gt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                        X1 x1, Y1 y1, Z1 z1,</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        X2 x2, Y2 y2, Z2 z2,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        X3 x3, Y3 y3, Z3 z3);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                template&lt;typename V1, typename V2, typename V3&gt;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                        vec&lt;3, V1, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                        vec&lt;3, V2, Q&gt; const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                        vec&lt;3, V3, Q&gt; const&amp; v3);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator=(mat&lt;3, 3, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator=(mat&lt;3, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator+=(mat&lt;3, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator-=(mat&lt;3, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator*=(mat&lt;3, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator/=(mat&lt;3, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator++();</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; &amp; operator--();</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator+(mat&lt;3, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator-(mat&lt;3, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator+(mat&lt;3, 3, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator+(T scalar, mat&lt;3, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator+(mat&lt;3, 3, T, Q&gt; const&amp; m1, mat&lt;3, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator-(mat&lt;3, 3, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator-(T scalar, mat&lt;3, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator-(mat&lt;3, 3, T, Q&gt; const&amp; m1, mat&lt;3, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator*(mat&lt;3, 3, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator*(T scalar, mat&lt;3, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        GLM_FUNC_DECL typename mat&lt;3, 3, T, Q&gt;::col_type operator*(mat&lt;3, 3, T, Q&gt; const&amp; m, typename mat&lt;3, 3, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        GLM_FUNC_DECL typename mat&lt;3, 3, T, Q&gt;::row_type operator*(typename mat&lt;3, 3, T, Q&gt;::col_type const&amp; v, mat&lt;3, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator*(mat&lt;3, 3, T, Q&gt; const&amp; m1, mat&lt;3, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator*(mat&lt;3, 3, T, Q&gt; const&amp; m1, mat&lt;2, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator*(mat&lt;3, 3, T, Q&gt; const&amp; m1, mat&lt;4, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator/(mat&lt;3, 3, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator/(T scalar, mat&lt;3, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        GLM_FUNC_DECL typename mat&lt;3, 3, T, Q&gt;::col_type operator/(mat&lt;3, 3, T, Q&gt; const&amp; m, typename mat&lt;3, 3, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;        GLM_FUNC_DECL typename mat&lt;3, 3, T, Q&gt;::row_type operator/(typename mat&lt;3, 3, T, Q&gt;::col_type const&amp; v, mat&lt;3, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator/(mat&lt;3, 3, T, Q&gt; const&amp; m1, mat&lt;3, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;3, 3, T, Q&gt; const&amp; m1, mat&lt;3, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;3, 3, T, Q&gt; const&amp; m1, mat&lt;3, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat3x3.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00113.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat3x4.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat3x4.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00113_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00113_source.html\">type_mat3x4.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00113_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat3x4.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat3x4.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00113.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">type_vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">type_vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;3, 4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;4, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;3, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;3, 4, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;4, 3, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                col_type value[3];</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>() { <span class=\"keywordflow\">return</span> 3; }</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                GLM_FUNC_DECL mat(mat&lt;3, 4, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                GLM_FUNC_DECL mat(mat&lt;3, 4, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL explicit mat(T scalar);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T x0, T y0, T z0, T w0,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                        T x1, T y1, T z1, T w1,</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                        T x2, T y2, T z2, T w2);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                        col_type const&amp; v0,</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                        col_type const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                        col_type const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                template&lt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                        typename X1, typename Y1, typename Z1, typename W1,</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                        typename X2, typename Y2, typename Z2, typename W2,</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                        typename X3, typename Y3, typename Z3, typename W3&gt;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        X1 x1, Y1 y1, Z1 z1, W1 w1,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        X2 x2, Y2 y2, Z2 z2, W2 w2,</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                        X3 x3, Y3 y3, Z3 z3, W3 w3);</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                template&lt;typename V1, typename V2, typename V3&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                        vec&lt;4, V1, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                        vec&lt;4, V2, Q&gt; const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                        vec&lt;4, V3, Q&gt; const&amp; v3);</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator=(mat&lt;3, 4, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator=(mat&lt;3, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator+=(mat&lt;3, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator-=(mat&lt;3, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator++();</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; &amp; operator--();</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator+(mat&lt;3, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator-(mat&lt;3, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator+(mat&lt;3, 4, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator+(mat&lt;3, 4, T, Q&gt; const&amp; m1, mat&lt;3, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator-(mat&lt;3, 4, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator-(mat&lt;3, 4, T, Q&gt; const&amp; m1, mat&lt;3, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator*(mat&lt;3, 4, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator*(T scalar, mat&lt;3, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        GLM_FUNC_DECL typename mat&lt;3, 4, T, Q&gt;::col_type operator*(mat&lt;3, 4, T, Q&gt; const&amp; m, typename mat&lt;3, 4, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;        GLM_FUNC_DECL typename mat&lt;3, 4, T, Q&gt;::row_type operator*(typename mat&lt;3, 4, T, Q&gt;::col_type const&amp; v, mat&lt;3, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator*(mat&lt;3, 4, T, Q&gt; const&amp; m1,      mat&lt;4, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator*(mat&lt;3, 4, T, Q&gt; const&amp; m1, mat&lt;2, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator*(mat&lt;3, 4, T, Q&gt; const&amp; m1,      mat&lt;3, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator/(mat&lt;3, 4, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator/(T scalar, mat&lt;3, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;3, 4, T, Q&gt; const&amp; m1, mat&lt;3, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;3, 4, T, Q&gt; const&amp; m1, mat&lt;3, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat3x4.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00114.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat4x2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat4x2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00114_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00114_source.html\">type_mat4x2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00114_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat4x2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat4x2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00114.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">type_vec2.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">type_vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;4, 2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;2, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;4, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;4, 2, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;2, 4, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                col_type value[4];</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>() { <span class=\"keywordflow\">return</span> 4; }</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                GLM_FUNC_DECL mat(mat&lt;4, 2, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                GLM_FUNC_DECL mat(mat&lt;4, 2, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL explicit mat(T scalar);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T x0, T y0,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                        T x1, T y1,</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                        T x2, T y2,</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        T x3, T y3);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                        col_type const&amp; v0,</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                        col_type const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                        col_type const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                        col_type const&amp; v3);</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                template&lt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                        typename X1, typename Y1,</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                        typename X2, typename Y2,</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        typename X3, typename Y3,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        typename X4, typename Y4&gt;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                        X1 x1, Y1 y1,</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                        X2 x2, Y2 y2,</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                        X3 x3, Y3 y3,</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                        X4 x4, Y4 y4);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                template&lt;typename V1, typename V2, typename V3, typename V4&gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                        vec&lt;2, V1, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                        vec&lt;2, V2, Q&gt; const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                        vec&lt;2, V3, Q&gt; const&amp; v3,</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                        vec&lt;2, V4, Q&gt; const&amp; v4);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator=(mat&lt;4, 2, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator=(mat&lt;4, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator+=(mat&lt;4, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator-=(mat&lt;4, 2, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator++ ();</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; &amp; operator-- ();</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator+(mat&lt;4, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator-(mat&lt;4, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator+(mat&lt;4, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator+(mat&lt;4, 2, T, Q&gt; const&amp; m1, mat&lt;4, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator-(mat&lt;4, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator-(mat&lt;4, 2, T, Q&gt; const&amp; m1,      mat&lt;4, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator*(mat&lt;4, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator*(T scalar, mat&lt;4, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL typename mat&lt;4, 2, T, Q&gt;::col_type operator*(mat&lt;4, 2, T, Q&gt; const&amp; m, typename mat&lt;4, 2, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        GLM_FUNC_DECL typename mat&lt;4, 2, T, Q&gt;::row_type operator*(typename mat&lt;4, 2, T, Q&gt;::col_type const&amp; v, mat&lt;4, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; operator*(mat&lt;4, 2, T, Q&gt; const&amp; m1, mat&lt;2, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; operator*(mat&lt;4, 2, T, Q&gt; const&amp; m1, mat&lt;3, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator*(mat&lt;4, 2, T, Q&gt; const&amp; m1, mat&lt;4, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator/(mat&lt;4, 2, T, Q&gt; const&amp; m, T scalar);</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; operator/(T scalar, mat&lt;4, 2, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;4, 2, T, Q&gt; const&amp; m1, mat&lt;4, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;4, 2, T, Q&gt; const&amp; m1, mat&lt;4, 2, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat4x2.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00115.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat4x3.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat4x3.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00115_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00115_source.html\">type_mat4x3.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00115_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat4x3.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat4x3.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00115.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">type_vec3.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">type_vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;4, 3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;3, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;4, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;4, 3, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;3, 4, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                col_type value[4];</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>() { <span class=\"keywordflow\">return</span> 4; }</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                GLM_FUNC_DECL mat(mat&lt;4, 3, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                GLM_FUNC_DECL mat(mat&lt;4, 3, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL explicit mat(T const&amp; x);</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T const&amp; x0, T const&amp; y0, T const&amp; z0,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                        T const&amp; x1, T const&amp; y1, T const&amp; z1,</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                        T const&amp; x2, T const&amp; y2, T const&amp; z2,</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                        T const&amp; x3, T const&amp; y3, T const&amp; z3);</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                        col_type const&amp; v0,</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                        col_type const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                        col_type const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                        col_type const&amp; v3);</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                template&lt;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                        typename X1, typename Y1, typename Z1,</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                        typename X2, typename Y2, typename Z2,</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        typename X3, typename Y3, typename Z3,</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        typename X4, typename Y4, typename Z4&gt;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                        X1 const&amp; x1, Y1 const&amp; y1, Z1 const&amp; z1,</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                        X2 const&amp; x2, Y2 const&amp; y2, Z2 const&amp; z2,</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                        X3 const&amp; x3, Y3 const&amp; y3, Z3 const&amp; z3,</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;                        X4 const&amp; x4, Y4 const&amp; y4, Z4 const&amp; z4);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                template&lt;typename V1, typename V2, typename V3, typename V4&gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                        vec&lt;3, V1, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                        vec&lt;3, V2, Q&gt; const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                        vec&lt;3, V3, Q&gt; const&amp; v3,</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                        vec&lt;3, V4, Q&gt; const&amp; v4);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; &amp; operator=(mat&lt;4, 3, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; &amp; operator=(mat&lt;4, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; &amp; operator+=(mat&lt;4, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; &amp; operator-=(mat&lt;4, 3, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt;&amp; operator++();</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt;&amp; operator--();</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator+(mat&lt;4, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator-(mat&lt;4, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator+(mat&lt;4, 3, T, Q&gt; const&amp; m, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator+(mat&lt;4, 3, T, Q&gt; const&amp; m1, mat&lt;4, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator-(mat&lt;4, 3, T, Q&gt; const&amp; m, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator-(mat&lt;4, 3, T, Q&gt; const&amp; m1, mat&lt;4, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator*(mat&lt;4, 3, T, Q&gt; const&amp; m, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator*(T const&amp; s, mat&lt;4, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL typename mat&lt;4, 3, T, Q&gt;::col_type operator*(mat&lt;4, 3, T, Q&gt; const&amp; m, typename mat&lt;4, 3, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        GLM_FUNC_DECL typename mat&lt;4, 3, T, Q&gt;::row_type operator*(typename mat&lt;4, 3, T, Q&gt;::col_type const&amp; v, mat&lt;4, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; operator*(mat&lt;4, 3, T, Q&gt; const&amp; m1, mat&lt;2, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; operator*(mat&lt;4, 3, T, Q&gt; const&amp; m1,      mat&lt;3, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator*(mat&lt;4, 3, T, Q&gt; const&amp; m1, mat&lt;4, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator/(mat&lt;4, 3, T, Q&gt; const&amp; m, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; operator/(T const&amp; s, mat&lt;4, 3, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;4, 3, T, Q&gt; const&amp; m1, mat&lt;4, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;4, 3, T, Q&gt; const&amp; m1, mat&lt;4, 3, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat4x3.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;<span class=\"preprocessor\">#endif //GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00116.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat4x4.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat4x4.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00116_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00116_source.html\">type_mat4x4.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00116_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_mat4x4.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_mat4x4.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00116.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">type_vec4.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00107.html\">type_mat.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        <span class=\"keyword\">struct </span>mat&lt;4, 4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;4, T, Q&gt; col_type;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;4, T, Q&gt; row_type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;4, 4, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;                <span class=\"keyword\">typedef</span> mat&lt;4, 4, T, Q&gt; transpose_type;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;        <span class=\"keyword\">private</span>:</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                col_type value[4];</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        <span class=\"keyword\">public</span>:</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                <span class=\"comment\">// -- Accesses --</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>(){<span class=\"keywordflow\">return</span> 4;}</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;                GLM_FUNC_DECL col_type &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;                GLM_FUNC_DECL col_type <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                <span class=\"comment\">// -- Constructors --</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                GLM_FUNC_DECL mat() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                GLM_FUNC_DECL mat(mat&lt;4, 4, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                GLM_FUNC_DECL mat(mat&lt;4, 4, T, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                GLM_FUNC_DECL explicit mat(T const&amp; x);</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                        T const&amp; x0, T const&amp; y0, T const&amp; z0, T const&amp; w0,</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        T const&amp; x1, T const&amp; y1, T const&amp; z1, T const&amp; w1,</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                        T const&amp; x2, T const&amp; y2, T const&amp; z2, T const&amp; w2,</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                        T const&amp; x3, T const&amp; y3, T const&amp; z3, T const&amp; w3);</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                        col_type const&amp; v0,</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                        col_type const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                        col_type const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                        col_type const&amp; v3);</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                <span class=\"comment\">// -- Conversions --</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                template&lt;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                        typename X1, typename Y1, typename Z1, typename W1,</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                        typename X2, typename Y2, typename Z2, typename W2,</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                        typename X3, typename Y3, typename Z3, typename W3,</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        typename X4, typename Y4, typename Z4, typename W4&gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                        X1 const&amp; x1, Y1 const&amp; y1, Z1 const&amp; z1, W1 const&amp; w1,</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                        X2 const&amp; x2, Y2 const&amp; y2, Z2 const&amp; z2, W2 const&amp; w2,</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                        X3 const&amp; x3, Y3 const&amp; y3, Z3 const&amp; z3, W3 const&amp; w3,</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;                        X4 const&amp; x4, Y4 const&amp; y4, Z4 const&amp; z4, W4 const&amp; w4);</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                template&lt;typename V1, typename V2, typename V3, typename V4&gt;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;                GLM_FUNC_DECL mat(</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                        vec&lt;4, V1, Q&gt; const&amp; v1,</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                        vec&lt;4, V2, Q&gt; const&amp; v2,</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                        vec&lt;4, V3, Q&gt; const&amp; v3,</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                        vec&lt;4, V4, Q&gt; const&amp; v4);</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                <span class=\"comment\">// -- Matrix conversions --</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 4, U, P&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;2, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 2, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;3, 4, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                GLM_FUNC_DECL GLM_EXPLICIT mat(mat&lt;4, 3, T, Q&gt; const&amp; x);</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator=(mat&lt;4, 4, T, Q&gt; const&amp; m) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator=(mat&lt;4, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator+=(U s);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator+=(mat&lt;4, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator-=(U s);</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator-=(mat&lt;4, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator*=(U s);</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator*=(mat&lt;4, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator/=(U s);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator/=(mat&lt;4, 4, U, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator++();</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; &amp; operator--();</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator+(mat&lt;4, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator-(mat&lt;4, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator+(mat&lt;4, 4, T, Q&gt; const&amp; m, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator+(T const&amp; s, mat&lt;4, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator+(mat&lt;4, 4, T, Q&gt; const&amp; m1, mat&lt;4, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator-(mat&lt;4, 4, T, Q&gt; const&amp; m, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator-(T const&amp; s, mat&lt;4, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator-(mat&lt;4, 4, T, Q&gt; const&amp; m1,      mat&lt;4, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator*(mat&lt;4, 4, T, Q&gt; const&amp; m, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator*(T const&amp; s, mat&lt;4, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        GLM_FUNC_DECL typename mat&lt;4, 4, T, Q&gt;::col_type operator*(mat&lt;4, 4, T, Q&gt; const&amp; m, typename mat&lt;4, 4, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        GLM_FUNC_DECL typename mat&lt;4, 4, T, Q&gt;::row_type operator*(typename mat&lt;4, 4, T, Q&gt;::col_type const&amp; v, mat&lt;4, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; operator*(mat&lt;4, 4, T, Q&gt; const&amp; m1, mat&lt;2, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; operator*(mat&lt;4, 4, T, Q&gt; const&amp; m1, mat&lt;3, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator*(mat&lt;4, 4, T, Q&gt; const&amp; m1, mat&lt;4, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator/(mat&lt;4, 4, T, Q&gt; const&amp; m, T const&amp; s);</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator/(T const&amp; s, mat&lt;4, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;        GLM_FUNC_DECL typename mat&lt;4, 4, T, Q&gt;::col_type operator/(mat&lt;4, 4, T, Q&gt; const&amp; m, typename mat&lt;4, 4, T, Q&gt;::row_type const&amp; v);</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;        GLM_FUNC_DECL typename mat&lt;4, 4, T, Q&gt;::row_type operator/(typename mat&lt;4, 4, T, Q&gt;::col_type const&amp; v, mat&lt;4, 4, T, Q&gt; const&amp; m);</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; operator/(mat&lt;4, 4, T, Q&gt; const&amp; m1,      mat&lt;4, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(mat&lt;4, 4, T, Q&gt; const&amp; m1, mat&lt;4, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(mat&lt;4, 4, T, Q&gt; const&amp; m1, mat&lt;4, 4, T, Q&gt; const&amp; m2);</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;<span class=\"preprocessor\">#include &quot;type_mat4x4.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;<span class=\"preprocessor\">#endif//GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00107_html\"><div class=\"ttname\"><a href=\"a00107.html\">type_mat.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00117.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_precision.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_precision.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00165.html\">GLM_GTC_type_precision</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00117_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00165.html\">GLM_GTC_type_precision</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00117_source.html\">type_precision.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00117_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_precision.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_precision.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00117.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/vec1.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_type_precision extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;        <span class=\"comment\">// Signed int vector types </span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">lowp_int8</a>;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">lowp_int16</a>;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">lowp_int32</a>;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">lowp_int64</a>;</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">lowp_int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">lowp_int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">lowp_int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">lowp_int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">lowp_i8</a>;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">lowp_i16</a>;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">lowp_i32</a>;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">lowp_i64</a>;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">mediump_int8</a>;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">mediump_int16</a>;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">mediump_int32</a>;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">mediump_int64</a>;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">mediump_int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">mediump_int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">mediump_int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">mediump_int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">mediump_i8</a>;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">mediump_i16</a>;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">mediump_i32</a>;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">mediump_i64</a>;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">highp_int8</a>;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">highp_int16</a>;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">highp_int32</a>;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">highp_int64</a>;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">highp_int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">highp_int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">highp_int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">highp_int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">highp_i8</a>;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">highp_i16</a>;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">highp_i32</a>;</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">highp_i64</a>;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 int8;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 int16;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 int32;</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 int64;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_EXTENDED_INTEGER_TYPE</span></div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">std::int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">std::int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">std::int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">std::int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">int8_t</a>;</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">int16_t</a>;</div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">int32_t</a>;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">int64_t</a>;</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;</div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;        <span class=\"keyword\">typedef</span> detail::int8 <a class=\"code\" href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">i8</a>;</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;        <span class=\"keyword\">typedef</span> detail::int16 <a class=\"code\" href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">i16</a>;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;        <span class=\"keyword\">typedef</span> detail::int32 <a class=\"code\" href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">i32</a>;</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;        <span class=\"keyword\">typedef</span> detail::int64 <a class=\"code\" href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">i64</a>;</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i8, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">i8vec1</a>;</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i8, defaultp&gt; <a class=\"code\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a>;</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i8, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">i8vec3</a>;</div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i8, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a>;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i16, defaultp&gt; <a class=\"code\" href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">i16vec1</a>;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i16, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a>;</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i16, defaultp&gt; <a class=\"code\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">i16vec3</a>;</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i16, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a>;</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;</div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;</div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;</div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, i64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">i64vec1</a>;</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, i64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">i64vec2</a>;</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;</div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, i64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">i64vec3</a>;</div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;</div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, i64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">i64vec4</a>;</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;        <span class=\"comment\">// Unsigned int vector types</span></div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;</div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">lowp_uint8</a>;</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">lowp_uint16</a>;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">lowp_uint32</a>;</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">lowp_uint64</a>;</div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">lowp_uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">lowp_uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">lowp_uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">lowp_uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">lowp_u8</a>;</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">lowp_u16</a>;</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">lowp_u32</a>;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">lowp_u64</a>;</div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">mediump_uint8</a>;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">mediump_uint16</a>;</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">mediump_uint32</a>;</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">mediump_uint64</a>;</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;</div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">mediump_uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">mediump_uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;</div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">mediump_uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;</div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">mediump_uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;</div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">mediump_u8</a>;</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">mediump_u16</a>;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;</div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">mediump_u32</a>;</div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;</div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">mediump_u64</a>;</div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">highp_uint8</a>;</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">highp_uint16</a>;</div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;</div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">highp_uint32</a>;</div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">highp_uint64</a>;</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;</div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">highp_uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">highp_uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;</div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">highp_uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;</div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">highp_uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;</div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">highp_u8</a>;</div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">highp_u16</a>;</div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;</div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\">  457</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">highp_u32</a>;</div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;</div>\n<div class=\"line\"><a name=\"l00461\"></a><span class=\"lineno\">  461</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">highp_u64</a>;</div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\">  462</span>&#160;</div>\n<div class=\"line\"><a name=\"l00465\"></a><span class=\"lineno\">  465</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 uint8;</div>\n<div class=\"line\"><a name=\"l00466\"></a><span class=\"lineno\">  466</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 uint16;</div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;</div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 uint32;</div>\n<div class=\"line\"><a name=\"l00474\"></a><span class=\"lineno\">  474</span>&#160;</div>\n<div class=\"line\"><a name=\"l00477\"></a><span class=\"lineno\">  477</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 uint64;</div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\">  478</span>&#160;</div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_EXTENDED_INTEGER_TYPE</span></div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">std::uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">std::uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">std::uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00483\"></a><span class=\"lineno\">  483</span>&#160;        <span class=\"keyword\">using</span> <a class=\"code\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">std::uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\">  484</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">uint8_t</a>;</div>\n<div class=\"line\"><a name=\"l00488\"></a><span class=\"lineno\">  488</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">uint16_t</a>;</div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;</div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">uint32_t</a>;</div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;</div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">uint64_t</a>;</div>\n<div class=\"line\"><a name=\"l00500\"></a><span class=\"lineno\">  500</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;</div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint8 <a class=\"code\" href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">u8</a>;</div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00508\"></a><span class=\"lineno\">  508</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint16 <a class=\"code\" href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">u16</a>;</div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;</div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint32 <a class=\"code\" href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">u32</a>;</div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;</div>\n<div class=\"line\"><a name=\"l00516\"></a><span class=\"lineno\">  516</span>&#160;        <span class=\"keyword\">typedef</span> detail::uint64 <a class=\"code\" href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">u64</a>;</div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\">  517</span>&#160;</div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;</div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;</div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u8, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">u8vec1</a>;</div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\">  523</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u8, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a>;</div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;</div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u8, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">u8vec3</a>;</div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;</div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u8, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a>;</div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;</div>\n<div class=\"line\"><a name=\"l00536\"></a><span class=\"lineno\">  536</span>&#160;</div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u16, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">u16vec1</a>;</div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u16, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a>;</div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;</div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u16, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">u16vec3</a>;</div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;</div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u16, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a>;</div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;</div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;</div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;</div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;</div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;</div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;</div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, u64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">u64vec1</a>;</div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, u64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">u64vec2</a>;</div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;</div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, u64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">u64vec3</a>;</div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;</div>\n<div class=\"line\"><a name=\"l00585\"></a><span class=\"lineno\">  585</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, u64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">u64vec4</a>;</div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\">  586</span>&#160;</div>\n<div class=\"line\"><a name=\"l00587\"></a><span class=\"lineno\">  587</span>&#160;</div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\">  589</span>&#160;        <span class=\"comment\">// Float vector types</span></div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;</div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 float32;</div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;</div>\n<div class=\"line\"><a name=\"l00597\"></a><span class=\"lineno\">  597</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 float64;</div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\">  598</span>&#160;</div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;</div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;        <span class=\"keyword\">typedef</span> detail::float32 <a class=\"code\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">float32_t</a>;</div>\n<div class=\"line\"><a name=\"l00603\"></a><span class=\"lineno\">  603</span>&#160;</div>\n<div class=\"line\"><a name=\"l00606\"></a><span class=\"lineno\">  606</span>&#160;        <span class=\"keyword\">typedef</span> detail::float64 <a class=\"code\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">float64_t</a>;</div>\n<div class=\"line\"><a name=\"l00607\"></a><span class=\"lineno\">  607</span>&#160;</div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;</div>\n<div class=\"line\"><a name=\"l00611\"></a><span class=\"lineno\">  611</span>&#160;        <span class=\"keyword\">typedef</span> float32 <a class=\"code\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a>;</div>\n<div class=\"line\"><a name=\"l00612\"></a><span class=\"lineno\">  612</span>&#160;</div>\n<div class=\"line\"><a name=\"l00615\"></a><span class=\"lineno\">  615</span>&#160;        <span class=\"keyword\">typedef</span> float64 <a class=\"code\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a>;</div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;</div>\n<div class=\"line\"><a name=\"l00617\"></a><span class=\"lineno\">  617</span>&#160;</div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">fvec1</a>;</div>\n<div class=\"line\"><a name=\"l00621\"></a><span class=\"lineno\">  621</span>&#160;</div>\n<div class=\"line\"><a name=\"l00624\"></a><span class=\"lineno\">  624</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">fvec2</a>;</div>\n<div class=\"line\"><a name=\"l00625\"></a><span class=\"lineno\">  625</span>&#160;</div>\n<div class=\"line\"><a name=\"l00628\"></a><span class=\"lineno\">  628</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">fvec3</a>;</div>\n<div class=\"line\"><a name=\"l00629\"></a><span class=\"lineno\">  629</span>&#160;</div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">fvec4</a>;</div>\n<div class=\"line\"><a name=\"l00633\"></a><span class=\"lineno\">  633</span>&#160;</div>\n<div class=\"line\"><a name=\"l00634\"></a><span class=\"lineno\">  634</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">f32vec1</a>;</div>\n<div class=\"line\"><a name=\"l00638\"></a><span class=\"lineno\">  638</span>&#160;</div>\n<div class=\"line\"><a name=\"l00641\"></a><span class=\"lineno\">  641</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">f32vec2</a>;</div>\n<div class=\"line\"><a name=\"l00642\"></a><span class=\"lineno\">  642</span>&#160;</div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">f32vec3</a>;</div>\n<div class=\"line\"><a name=\"l00646\"></a><span class=\"lineno\">  646</span>&#160;</div>\n<div class=\"line\"><a name=\"l00649\"></a><span class=\"lineno\">  649</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">f32vec4</a>;</div>\n<div class=\"line\"><a name=\"l00650\"></a><span class=\"lineno\">  650</span>&#160;</div>\n<div class=\"line\"><a name=\"l00651\"></a><span class=\"lineno\">  651</span>&#160;</div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">f64vec1</a>;</div>\n<div class=\"line\"><a name=\"l00655\"></a><span class=\"lineno\">  655</span>&#160;</div>\n<div class=\"line\"><a name=\"l00658\"></a><span class=\"lineno\">  658</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">f64vec2</a>;</div>\n<div class=\"line\"><a name=\"l00659\"></a><span class=\"lineno\">  659</span>&#160;</div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">f64vec3</a>;</div>\n<div class=\"line\"><a name=\"l00663\"></a><span class=\"lineno\">  663</span>&#160;</div>\n<div class=\"line\"><a name=\"l00666\"></a><span class=\"lineno\">  666</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">f64vec4</a>;</div>\n<div class=\"line\"><a name=\"l00667\"></a><span class=\"lineno\">  667</span>&#160;</div>\n<div class=\"line\"><a name=\"l00668\"></a><span class=\"lineno\">  668</span>&#160;</div>\n<div class=\"line\"><a name=\"l00670\"></a><span class=\"lineno\">  670</span>&#160;        <span class=\"comment\">// Float matrix types </span></div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\">  671</span>&#160;</div>\n<div class=\"line\"><a name=\"l00674\"></a><span class=\"lineno\">  674</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f32&gt; fmat1;</span></div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;</div>\n<div class=\"line\"><a name=\"l00678\"></a><span class=\"lineno\">  678</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">fmat2</a>;</div>\n<div class=\"line\"><a name=\"l00679\"></a><span class=\"lineno\">  679</span>&#160;</div>\n<div class=\"line\"><a name=\"l00682\"></a><span class=\"lineno\">  682</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">fmat3</a>;</div>\n<div class=\"line\"><a name=\"l00683\"></a><span class=\"lineno\">  683</span>&#160;</div>\n<div class=\"line\"><a name=\"l00686\"></a><span class=\"lineno\">  686</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">fmat4</a>;</div>\n<div class=\"line\"><a name=\"l00687\"></a><span class=\"lineno\">  687</span>&#160;</div>\n<div class=\"line\"><a name=\"l00688\"></a><span class=\"lineno\">  688</span>&#160;</div>\n<div class=\"line\"><a name=\"l00691\"></a><span class=\"lineno\">  691</span>&#160;        <span class=\"comment\">//typedef f32 fmat1x1;</span></div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\">  692</span>&#160;</div>\n<div class=\"line\"><a name=\"l00695\"></a><span class=\"lineno\">  695</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00696\"></a><span class=\"lineno\">  696</span>&#160;</div>\n<div class=\"line\"><a name=\"l00699\"></a><span class=\"lineno\">  699</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">fmat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00700\"></a><span class=\"lineno\">  700</span>&#160;</div>\n<div class=\"line\"><a name=\"l00703\"></a><span class=\"lineno\">  703</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">fmat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00704\"></a><span class=\"lineno\">  704</span>&#160;</div>\n<div class=\"line\"><a name=\"l00707\"></a><span class=\"lineno\">  707</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">fmat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00708\"></a><span class=\"lineno\">  708</span>&#160;</div>\n<div class=\"line\"><a name=\"l00711\"></a><span class=\"lineno\">  711</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00712\"></a><span class=\"lineno\">  712</span>&#160;</div>\n<div class=\"line\"><a name=\"l00715\"></a><span class=\"lineno\">  715</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">fmat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00716\"></a><span class=\"lineno\">  716</span>&#160;</div>\n<div class=\"line\"><a name=\"l00719\"></a><span class=\"lineno\">  719</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">fmat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00720\"></a><span class=\"lineno\">  720</span>&#160;</div>\n<div class=\"line\"><a name=\"l00723\"></a><span class=\"lineno\">  723</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">fmat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00724\"></a><span class=\"lineno\">  724</span>&#160;</div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00728\"></a><span class=\"lineno\">  728</span>&#160;</div>\n<div class=\"line\"><a name=\"l00729\"></a><span class=\"lineno\">  729</span>&#160;</div>\n<div class=\"line\"><a name=\"l00732\"></a><span class=\"lineno\">  732</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f32, defaultp&gt; f32mat1;</span></div>\n<div class=\"line\"><a name=\"l00733\"></a><span class=\"lineno\">  733</span>&#160;</div>\n<div class=\"line\"><a name=\"l00736\"></a><span class=\"lineno\">  736</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">f32mat2</a>;</div>\n<div class=\"line\"><a name=\"l00737\"></a><span class=\"lineno\">  737</span>&#160;</div>\n<div class=\"line\"><a name=\"l00740\"></a><span class=\"lineno\">  740</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">f32mat3</a>;</div>\n<div class=\"line\"><a name=\"l00741\"></a><span class=\"lineno\">  741</span>&#160;</div>\n<div class=\"line\"><a name=\"l00744\"></a><span class=\"lineno\">  744</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">f32mat4</a>;</div>\n<div class=\"line\"><a name=\"l00745\"></a><span class=\"lineno\">  745</span>&#160;</div>\n<div class=\"line\"><a name=\"l00746\"></a><span class=\"lineno\">  746</span>&#160;</div>\n<div class=\"line\"><a name=\"l00749\"></a><span class=\"lineno\">  749</span>&#160;        <span class=\"comment\">//typedef f32 f32mat1x1;</span></div>\n<div class=\"line\"><a name=\"l00750\"></a><span class=\"lineno\">  750</span>&#160;</div>\n<div class=\"line\"><a name=\"l00753\"></a><span class=\"lineno\">  753</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00754\"></a><span class=\"lineno\">  754</span>&#160;</div>\n<div class=\"line\"><a name=\"l00757\"></a><span class=\"lineno\">  757</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">f32mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00758\"></a><span class=\"lineno\">  758</span>&#160;</div>\n<div class=\"line\"><a name=\"l00761\"></a><span class=\"lineno\">  761</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">f32mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00762\"></a><span class=\"lineno\">  762</span>&#160;</div>\n<div class=\"line\"><a name=\"l00765\"></a><span class=\"lineno\">  765</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">f32mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00766\"></a><span class=\"lineno\">  766</span>&#160;</div>\n<div class=\"line\"><a name=\"l00769\"></a><span class=\"lineno\">  769</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00770\"></a><span class=\"lineno\">  770</span>&#160;</div>\n<div class=\"line\"><a name=\"l00773\"></a><span class=\"lineno\">  773</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">f32mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00774\"></a><span class=\"lineno\">  774</span>&#160;</div>\n<div class=\"line\"><a name=\"l00777\"></a><span class=\"lineno\">  777</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">f32mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00778\"></a><span class=\"lineno\">  778</span>&#160;</div>\n<div class=\"line\"><a name=\"l00781\"></a><span class=\"lineno\">  781</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">f32mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00782\"></a><span class=\"lineno\">  782</span>&#160;</div>\n<div class=\"line\"><a name=\"l00785\"></a><span class=\"lineno\">  785</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00786\"></a><span class=\"lineno\">  786</span>&#160;</div>\n<div class=\"line\"><a name=\"l00787\"></a><span class=\"lineno\">  787</span>&#160;</div>\n<div class=\"line\"><a name=\"l00790\"></a><span class=\"lineno\">  790</span>&#160;        <span class=\"comment\">//typedef detail::tmat1x1&lt;f64, defaultp&gt; f64mat1;</span></div>\n<div class=\"line\"><a name=\"l00791\"></a><span class=\"lineno\">  791</span>&#160;</div>\n<div class=\"line\"><a name=\"l00794\"></a><span class=\"lineno\">  794</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">f64mat2</a>;</div>\n<div class=\"line\"><a name=\"l00795\"></a><span class=\"lineno\">  795</span>&#160;</div>\n<div class=\"line\"><a name=\"l00798\"></a><span class=\"lineno\">  798</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">f64mat3</a>;</div>\n<div class=\"line\"><a name=\"l00799\"></a><span class=\"lineno\">  799</span>&#160;</div>\n<div class=\"line\"><a name=\"l00802\"></a><span class=\"lineno\">  802</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">f64mat4</a>;</div>\n<div class=\"line\"><a name=\"l00803\"></a><span class=\"lineno\">  803</span>&#160;</div>\n<div class=\"line\"><a name=\"l00804\"></a><span class=\"lineno\">  804</span>&#160;</div>\n<div class=\"line\"><a name=\"l00807\"></a><span class=\"lineno\">  807</span>&#160;        <span class=\"comment\">//typedef f64 f64mat1x1;</span></div>\n<div class=\"line\"><a name=\"l00808\"></a><span class=\"lineno\">  808</span>&#160;</div>\n<div class=\"line\"><a name=\"l00811\"></a><span class=\"lineno\">  811</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 2, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a>;</div>\n<div class=\"line\"><a name=\"l00812\"></a><span class=\"lineno\">  812</span>&#160;</div>\n<div class=\"line\"><a name=\"l00815\"></a><span class=\"lineno\">  815</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 3, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">f64mat2x3</a>;</div>\n<div class=\"line\"><a name=\"l00816\"></a><span class=\"lineno\">  816</span>&#160;</div>\n<div class=\"line\"><a name=\"l00819\"></a><span class=\"lineno\">  819</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;2, 4, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">f64mat2x4</a>;</div>\n<div class=\"line\"><a name=\"l00820\"></a><span class=\"lineno\">  820</span>&#160;</div>\n<div class=\"line\"><a name=\"l00823\"></a><span class=\"lineno\">  823</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 2, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">f64mat3x2</a>;</div>\n<div class=\"line\"><a name=\"l00824\"></a><span class=\"lineno\">  824</span>&#160;</div>\n<div class=\"line\"><a name=\"l00827\"></a><span class=\"lineno\">  827</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 3, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a>;</div>\n<div class=\"line\"><a name=\"l00828\"></a><span class=\"lineno\">  828</span>&#160;</div>\n<div class=\"line\"><a name=\"l00831\"></a><span class=\"lineno\">  831</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;3, 4, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">f64mat3x4</a>;</div>\n<div class=\"line\"><a name=\"l00832\"></a><span class=\"lineno\">  832</span>&#160;</div>\n<div class=\"line\"><a name=\"l00835\"></a><span class=\"lineno\">  835</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 2, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">f64mat4x2</a>;</div>\n<div class=\"line\"><a name=\"l00836\"></a><span class=\"lineno\">  836</span>&#160;</div>\n<div class=\"line\"><a name=\"l00839\"></a><span class=\"lineno\">  839</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 3, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">f64mat4x3</a>;</div>\n<div class=\"line\"><a name=\"l00840\"></a><span class=\"lineno\">  840</span>&#160;</div>\n<div class=\"line\"><a name=\"l00843\"></a><span class=\"lineno\">  843</span>&#160;        <span class=\"keyword\">typedef</span> mat&lt;4, 4, f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a>;</div>\n<div class=\"line\"><a name=\"l00844\"></a><span class=\"lineno\">  844</span>&#160;</div>\n<div class=\"line\"><a name=\"l00846\"></a><span class=\"lineno\">  846</span>&#160;        <span class=\"comment\">// Quaternion types</span></div>\n<div class=\"line\"><a name=\"l00847\"></a><span class=\"lineno\">  847</span>&#160;</div>\n<div class=\"line\"><a name=\"l00850\"></a><span class=\"lineno\">  850</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;f32, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">f32quat</a>;</div>\n<div class=\"line\"><a name=\"l00851\"></a><span class=\"lineno\">  851</span>&#160;</div>\n<div class=\"line\"><a name=\"l00854\"></a><span class=\"lineno\">  854</span>&#160;        <span class=\"keyword\">typedef</span> tquat&lt;f64, defaultp&gt; <a class=\"code\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">f64quat</a>;</div>\n<div class=\"line\"><a name=\"l00855\"></a><span class=\"lineno\">  855</span>&#160;</div>\n<div class=\"line\"><a name=\"l00857\"></a><span class=\"lineno\">  857</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00858\"></a><span class=\"lineno\">  858</span>&#160;</div>\n<div class=\"line\"><a name=\"l00859\"></a><span class=\"lineno\">  859</span>&#160;<span class=\"preprocessor\">#include &quot;type_precision.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00165_html_gaea5c4518e175162e306d2c2b5ef5ac79\"><div class=\"ttname\"><a href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">glm::f32vec3</a></div><div class=\"ttdeci\">highp_f32vec3 f32vec3</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02407\">fwd.hpp:2407</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadc4e1594f9555d919131ee02b17822a2\"><div class=\"ttname\"><a href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">glm::f64vec2</a></div><div class=\"ttdeci\">highp_f64vec2 f64vec2</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02509\">fwd.hpp:2509</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga727675ac6b5d2fc699520e0059735e25\"><div class=\"ttname\"><a href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">glm::highp_i32</a></div><div class=\"ttdeci\">detail::int32 highp_i32</div><div class=\"ttdoc\">High qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00238\">fwd.hpp:238</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa6a5b461bbf5fe20982472aa51896d4b\"><div class=\"ttname\"><a href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">glm::lowp_uint32</a></div><div class=\"ttdeci\">detail::uint32 lowp_uint32</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00713\">fwd.hpp:713</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9df98857be695d5a30cb30f5bfa38a80\"><div class=\"ttname\"><a href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">glm::mediump_u16</a></div><div class=\"ttdeci\">detail::uint16 mediump_u16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00793\">fwd.hpp:793</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2af9490085ae3bdf36a544e9dd073610\"><div class=\"ttname\"><a href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">glm::mediump_u64</a></div><div class=\"ttdeci\">detail::uint64 mediump_u64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00801\">fwd.hpp:801</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf49470869e9be2c059629b250619804e\"><div class=\"ttname\"><a href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">glm::lowp_uint8</a></div><div class=\"ttdeci\">detail::uint8 lowp_uint8</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00705\">fwd.hpp:705</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6fbd69cbdaa44345bff923a2cf63de7e\"><div class=\"ttname\"><a href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">glm::mediump_int8</a></div><div class=\"ttdeci\">detail::int8 mediump_int8</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00150\">fwd.hpp:150</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7a6f1929464dcc680b16381a4ee5f2cf\"><div class=\"ttname\"><a href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">glm::highp_u32</a></div><div class=\"ttdeci\">detail::uint32 highp_u32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00847\">fwd.hpp:847</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad68bfd9f881856fc863a6ebca0b67f78\"><div class=\"ttname\"><a href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">glm::lowp_uint16</a></div><div class=\"ttdeci\">detail::uint16 lowp_uint16</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00709\">fwd.hpp:709</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gade502df1ce14f837fae7f60a03ddb9b0\"><div class=\"ttname\"><a href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">glm::f64vec1</a></div><div class=\"ttdeci\">highp_f64vec1 f64vec1</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02505\">fwd.hpp:2505</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga239b96198771b7add8eea7e6b59840c0\"><div class=\"ttname\"><a href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">glm::f32mat4x3</a></div><div class=\"ttdeci\">highp_f32mat4x3 f32mat4x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02443\">fwd.hpp:2443</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga256b12b650c3f2fb86878fd1c5db8bc3\"><div class=\"ttname\"><a href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">glm::highp_uint32</a></div><div class=\"ttdeci\">detail::uint32 highp_uint32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00815\">fwd.hpp:815</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae3ab5719fc4c1e966631dbbcba8d412a\"><div class=\"ttname\"><a href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">glm::f64mat2x3</a></div><div class=\"ttdeci\">highp_f64mat2x3 f64mat2x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02525\">fwd.hpp:2525</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaab239fa9e35b65a67cbaa6ac082f3675\"><div class=\"ttname\"><a href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">glm::f64mat3x4</a></div><div class=\"ttdeci\">highp_f64mat3x4 f64mat3x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02541\">fwd.hpp:2541</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1c522ca821c27b862fe51cf4024b064b\"><div class=\"ttname\"><a href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">glm::u16vec3</a></div><div class=\"ttdeci\">highp_u16vec3 u16vec3</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01063\">fwd.hpp:1063</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac25db6d2b1e2a0f351b77ba3409ac4cd\"><div class=\"ttname\"><a href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">glm::highp_i64</a></div><div class=\"ttdeci\">detail::int64 highp_i64</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00242\">fwd.hpp:242</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga73c6abb280a45feeff60f9accaee91f3\"><div class=\"ttname\"><a href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">glm::highp_int64_t</a></div><div class=\"ttdeci\">detail::int64 highp_int64_t</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00226\">fwd.hpp:226</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadfe65c78231039e90507770db50c98c7\"><div class=\"ttname\"><a href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">glm::mediump_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 mediump_uint8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00773\">fwd.hpp:773</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1b09f03da7ac43055c68a349d5445083\"><div class=\"ttname\"><a href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">glm::lowp_u8</a></div><div class=\"ttdeci\">detail::uint8 lowp_u8</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00739\">fwd.hpp:739</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf5e94bf2a20af7601787c154751dc2e1\"><div class=\"ttname\"><a href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">glm::mediump_i32</a></div><div class=\"ttdeci\">detail::int32 mediump_i32</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00190\">fwd.hpp:190</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga28d97808322d3c92186e4a0c067d7e8e\"><div class=\"ttname\"><a href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">glm::uint8_t</a></div><div class=\"ttdeci\">detail::uint8 uint8_t</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00879\">fwd.hpp:879</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6af54d70d9beb0a7ef992a879e86b04f\"><div class=\"ttname\"><a href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">glm::fmat3x2</a></div><div class=\"ttdeci\">highp_f32mat3x2 fmat3x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02357\">fwd.hpp:2357</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga701f32ab5b3fb06996b41f5c0d643805\"><div class=\"ttname\"><a href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">glm::f32vec1</a></div><div class=\"ttdeci\">highp_f32vec1 f32vec1</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02399\">fwd.hpp:2399</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga713c796c54875cf4092d42ff9d9096b0\"><div class=\"ttname\"><a href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">glm::fvec4</a></div><div class=\"ttdeci\">highp_f32vec4 fvec4</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02341\">fwd.hpp:2341</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacb88796f2d08ef253d0345aff20c3aee\"><div class=\"ttname\"><a href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">glm::highp_i8</a></div><div class=\"ttdeci\">detail::int8 highp_i8</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00230\">fwd.hpp:230</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga322a7d7d2c2c68994dc872a33de63c61\"><div class=\"ttname\"><a href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">glm::int64_t</a></div><div class=\"ttdeci\">detail::int64 int64_t</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00282\">fwd.hpp:282</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7f526b5cccef126a2ebcf9bdd890394e\"><div class=\"ttname\"><a href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">glm::i32vec3</a></div><div class=\"ttdeci\">highp_i32vec3 i32vec3</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00533\">fwd.hpp:533</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf1b735b4b1145174f4e4167d13778f9b\"><div class=\"ttname\"><a href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">glm::lowp_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 lowp_uint32_t</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00730\">fwd.hpp:730</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7b968f2b86a0442a89c7359171e1d866\"><div class=\"ttname\"><a href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">glm::mediump_int64</a></div><div class=\"ttdeci\">detail::int64 mediump_int64</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00162\">fwd.hpp:162</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4f072ada9552e1e480bbb3b1acde5250\"><div class=\"ttname\"><a href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">glm::lowp_u32</a></div><div class=\"ttdeci\">detail::uint32 lowp_u32</div><div class=\"ttdoc\">Low qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00747\">fwd.hpp:747</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4177a44206121dabc8c4ff1c0f544574\"><div class=\"ttname\"><a href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">glm::i8vec4</a></div><div class=\"ttdeci\">highp_i8vec4 i8vec4</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00378\">fwd.hpp:378</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5fde0fa4a3852a9dd5d637a92ee74718\"><div class=\"ttname\"><a href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">glm::highp_int16</a></div><div class=\"ttdeci\">detail::int16 highp_int16</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00202\">fwd.hpp:202</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8c8aa45aafcc23238edb1d5aeb801774\"><div class=\"ttname\"><a href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">glm::fmat4x2</a></div><div class=\"ttdeci\">highp_f32mat4x2 fmat4x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02369\">fwd.hpp:2369</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac87278e0c702ba8afff76316d4eeb769\"><div class=\"ttname\"><a href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">glm::f64mat2x4</a></div><div class=\"ttdeci\">highp_f64mat2x4 f64mat2x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02529\">fwd.hpp:2529</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1bd0e914158bf03135f8a317de6debe9\"><div class=\"ttname\"><a href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">glm::mediump_u32</a></div><div class=\"ttdeci\">detail::uint32 mediump_u32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00797\">fwd.hpp:797</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9b170dd4a8f38448a2dc93987c7875e9\"><div class=\"ttname\"><a href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">glm::mediump_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 mediump_uint64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00785\">fwd.hpp:785</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2a78447eb9d66a114b193f4a25899c16\"><div class=\"ttname\"><a href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">glm::u16vec2</a></div><div class=\"ttdeci\">highp_u16vec2 u16vec2</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01059\">fwd.hpp:1059</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga65261fa8a21045c8646ddff114a56174\"><div class=\"ttname\"><a href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">glm::f32mat3x3</a></div><div class=\"ttdeci\">highp_f32mat3x3 f32mat3x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02431\">fwd.hpp:2431</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae267358ff2a41d156d97f5762630235a\"><div class=\"ttname\"><a href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">glm::u32vec3</a></div><div class=\"ttdeci\">highp_u32vec3 u32vec3</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01142\">fwd.hpp:1142</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0ecd3f4952536e5ef12702b44d2626fc\"><div class=\"ttname\"><a href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">glm::f64mat4</a></div><div class=\"ttdeci\">f64mat4x4 f64mat4</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02565\">fwd.hpp:2565</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacd1259f3a9e8d2a9df5be2d74322ef9c\"><div class=\"ttname\"><a href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">glm::highp_u8</a></div><div class=\"ttdeci\">detail::uint8 highp_u8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00839\">fwd.hpp:839</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9b69181efbf8f37ae934f135137b29c0\"><div class=\"ttname\"><a href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">glm::f64mat3</a></div><div class=\"ttdeci\">f64mat3x3 f64mat3</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02561\">fwd.hpp:2561</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3945dd6515d4498cb603e65ff867ab03\"><div class=\"ttname\"><a href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">glm::u64vec4</a></div><div class=\"ttdeci\">highp_u64vec4 u64vec4</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01305\">fwd.hpp:1305</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae627372cfd5f20dd87db490387b71195\"><div class=\"ttname\"><a href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">glm::u32vec1</a></div><div class=\"ttdeci\">highp_u32vec1 u32vec1</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01134\">fwd.hpp:1134</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf645b1a60203b39c0207baff5e3d8c3c\"><div class=\"ttname\"><a href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">glm::lowp_int64</a></div><div class=\"ttdeci\">detail::int64 lowp_int64</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00114\">fwd.hpp:114</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga529496d75775fb656a07993ea9af2450\"><div class=\"ttname\"><a href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">glm::u16vec4</a></div><div class=\"ttdeci\">highp_u16vec4 u16vec4</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01067\">fwd.hpp:1067</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2473d8bf3f4abf967c4d0e18175be6f7\"><div class=\"ttname\"><a href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">glm::f64mat3x2</a></div><div class=\"ttdeci\">highp_f64mat3x2 f64mat3x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02533\">fwd.hpp:2533</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadff3608baa4b5bd3ed28f95c1c2c345d\"><div class=\"ttname\"><a href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">glm::mediump_int16</a></div><div class=\"ttdeci\">detail::int16 mediump_int16</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00154\">fwd.hpp:154</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga29b349e037f0b24320b4548a143daee2\"><div class=\"ttname\"><a href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">glm::u8vec1</a></div><div class=\"ttdeci\">highp_u8vec1 u8vec1</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00975\">fwd.hpp:975</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga31cef34e4cd04840c54741ff2f7005f0\"><div class=\"ttname\"><a href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">glm::u32vec4</a></div><div class=\"ttdeci\">highp_u32vec4 u32vec4</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01146\">fwd.hpp:1146</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3ebcb1f6d8d8387253de8bccb058d77f\"><div class=\"ttname\"><a href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">glm::mediump_i64</a></div><div class=\"ttdeci\">detail::int64 mediump_i64</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00194\">fwd.hpp:194</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad9771450a54785d13080cdde0fe20c1d\"><div class=\"ttname\"><a href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">glm::f64mat2</a></div><div class=\"ttdeci\">f64mat2x2 f64mat2</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02557\">fwd.hpp:2557</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacf1ded173e1e2d049c511d095b259e21\"><div class=\"ttname\"><a href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">glm::mediump_i8</a></div><div class=\"ttdeci\">detail::int8 mediump_i8</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00182\">fwd.hpp:182</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga80e72fe94c88498537e8158ba7591c54\"><div class=\"ttname\"><a href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">glm::mediump_int16_t</a></div><div class=\"ttdeci\">detail::int16 mediump_int16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00170\">fwd.hpp:170</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga552a6bde5e75984efb0f863278da2e54\"><div class=\"ttname\"><a href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">glm::lowp_i8</a></div><div class=\"ttdeci\">detail::int8 lowp_i8</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00134\">fwd.hpp:134</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga44e158af77a670ee1b58c03cda9e1619\"><div class=\"ttname\"><a href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">glm::fmat3x4</a></div><div class=\"ttdeci\">highp_f32mat3x4 fmat3x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02365\">fwd.hpp:2365</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga504ce1631cb2ac02fcf1d44d8c2aa126\"><div class=\"ttname\"><a href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">glm::lowp_u16</a></div><div class=\"ttdeci\">detail::uint16 lowp_u16</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00743\">fwd.hpp:743</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga489b89ba93d4f7b3934df78debc52276\"><div class=\"ttname\"><a href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">glm::u64vec3</a></div><div class=\"ttdeci\">highp_u64vec3 u64vec3</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01301\">fwd.hpp:1301</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga354736e0c645099cd44c42fb2f87c2b8\"><div class=\"ttname\"><a href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">glm::lowp_i64</a></div><div class=\"ttdeci\">detail::int64 lowp_i64</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00146\">fwd.hpp:146</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa212b805736a759998e312cbdd550fae\"><div class=\"ttname\"><a href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">glm::lowp_uint64</a></div><div class=\"ttdeci\">detail::uint64 lowp_uint64</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00717\">fwd.hpp:717</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5a08d36cf7917cd19d081a603d0eae3e\"><div class=\"ttname\"><a href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">glm::i8vec3</a></div><div class=\"ttdeci\">highp_i8vec3 i8vec3</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00374\">fwd.hpp:374</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga24273aa02abaecaab7f160bac437a339\"><div class=\"ttname\"><a href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">glm::fvec2</a></div><div class=\"ttdeci\">highp_f32vec2 fvec2</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02333\">fwd.hpp:2333</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga89930533646b30d021759298aa6bf04a\"><div class=\"ttname\"><a href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">glm::fvec3</a></div><div class=\"ttdeci\">highp_f32vec3 fvec3</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02337\">fwd.hpp:2337</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3963b1050fc65a383ee28e3f827b6e3e\"><div class=\"ttname\"><a href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">glm::mediump_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 mediump_uint16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00777\">fwd.hpp:777</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2996630ba7b10535af8e065cf326f761\"><div class=\"ttname\"><a href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">glm::i16vec2</a></div><div class=\"ttdeci\">highp_i16vec2 i16vec2</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00450\">fwd.hpp:450</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga91c4815f93177eb423362fd296a87e9f\"><div class=\"ttname\"><a href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">glm::lowp_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 lowp_uint16_t</div><div class=\"ttdoc\">Low qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00726\">fwd.hpp:726</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab256cdab5eb582e426d749ae77b5b566\"><div class=\"ttname\"><a href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">glm::f32mat2x3</a></div><div class=\"ttdeci\">highp_f32mat2x3 f32mat2x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02419\">fwd.hpp:2419</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga84ed04b4e0de18c977e932d617e7c223\"><div class=\"ttname\"><a href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">glm::highp_int32</a></div><div class=\"ttdeci\">detail::int32 highp_int32</div><div class=\"ttdoc\">High qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00206\">fwd.hpp:206</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga34dd5ec1988c443bae80f1b20a8ade5f\"><div class=\"ttname\"><a href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">glm::mediump_uint32</a></div><div class=\"ttdeci\">detail::uint32 mediump_uint32</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00765\">fwd.hpp:765</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7e80d927ff0a3861ced68dfff8a4020b\"><div class=\"ttname\"><a href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">glm::i8vec1</a></div><div class=\"ttdeci\">highp_i8vec1 i8vec1</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00366\">fwd.hpp:366</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga41d579d81c3d98edd0532244fa02da77\"><div class=\"ttname\"><a href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">glm::float32_t</a></div><div class=\"ttdeci\">highp_float32_t float32_t</div><div class=\"ttdoc\">Default 32 bit single-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01499\">fwd.hpp:1499</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2171d9dc1fefb1c82e2817f45b622eac\"><div class=\"ttname\"><a href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">glm::uint32_t</a></div><div class=\"ttdeci\">detail::uint32 uint32_t</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00887\">fwd.hpp:887</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga916c1aed91cf91f7b41399ebe7c6e185\"><div class=\"ttname\"><a href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">glm::f64mat3x3</a></div><div class=\"ttdeci\">highp_f64mat3x3 f64mat3x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02537\">fwd.hpp:2537</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3999d3e7ff22025c16ddb601e14dfdee\"><div class=\"ttname\"><a href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">glm::uint64_t</a></div><div class=\"ttdeci\">detail::uint64 uint64_t</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00891\">fwd.hpp:891</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><div class=\"ttname\"><a href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">glm::lowp_i32</a></div><div class=\"ttdeci\">detail::int32 lowp_i32</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00142\">fwd.hpp:142</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0336abc2604dd2c20c30e036454b64f8\"><div class=\"ttname\"><a href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">glm::highp_i16</a></div><div class=\"ttdeci\">detail::int16 highp_i16</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00234\">fwd.hpp:234</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa07c86650253672a19dbfb898f3265b8\"><div class=\"ttname\"><a href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">glm::fmat3x3</a></div><div class=\"ttdeci\">highp_f32mat3x3 fmat3x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02361\">fwd.hpp:2361</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga30069d1f02b19599cbfadf98c23ac6ed\"><div class=\"ttname\"><a href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">glm::lowp_u64</a></div><div class=\"ttdeci\">detail::uint64 lowp_u64</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00751\">fwd.hpp:751</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><div class=\"ttname\"><a href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">glm::u16vec1</a></div><div class=\"ttdeci\">highp_u16vec1 u16vec1</div><div class=\"ttdoc\">Default qualifier 16 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01055\">fwd.hpp:1055</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaef3824ed4fe435a019c5b9dddf53fec5\"><div class=\"ttname\"><a href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">glm::u64vec2</a></div><div class=\"ttdeci\">highp_u64vec2 u64vec2</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01297\">fwd.hpp:1297</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga14c583bd625eda8cf4935a14d5dd544d\"><div class=\"ttname\"><a href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">glm::f64quat</a></div><div class=\"ttdeci\">highp_f64quat f64quat</div><div class=\"ttdoc\">Default double-qualifier floating-point quaternion. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02569\">fwd.hpp:2569</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga20779a61de2fd526a17f12fe53ec46b1\"><div class=\"ttname\"><a href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">glm::u8vec4</a></div><div class=\"ttdeci\">highp_u8vec4 u8vec4</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00987\">fwd.hpp:987</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4541dc2feb2a31d6ecb5a303f3dd3280\"><div class=\"ttname\"><a href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">glm::fmat2</a></div><div class=\"ttdeci\">fmat2x2 fmat2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02381\">fwd.hpp:2381</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga31c6ca0e074a44007f49a9a3720b18c8\"><div class=\"ttname\"><a href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">glm::f32vec4</a></div><div class=\"ttdeci\">highp_f32vec4 f32vec4</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02411\">fwd.hpp:2411</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga681381f19f11c9e5ee45cda2c56937ff\"><div class=\"ttname\"><a href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">glm::fmat2x4</a></div><div class=\"ttdeci\">highp_f32mat2x4 fmat2x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02353\">fwd.hpp:2353</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab7daf79d6bc06a68bea1c6f5e11b5512\"><div class=\"ttname\"><a href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">glm::f64mat4x2</a></div><div class=\"ttdeci\">highp_f64mat4x2 f64mat4x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02545\">fwd.hpp:2545</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3350c93c3275298f940a42875388e4b4\"><div class=\"ttname\"><a href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">glm::fmat2x2</a></div><div class=\"ttdeci\">highp_f32mat2x2 fmat2x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02345\">fwd.hpp:2345</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga91f91f411080c37730856ff5887f5bcf\"><div class=\"ttname\"><a href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">glm::uint16_t</a></div><div class=\"ttdeci\">detail::uint16 uint16_t</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00883\">fwd.hpp:883</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac4e00a26a2adb5f2c0a7096810df29e5\"><div class=\"ttname\"><a href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">glm::highp_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 highp_uint8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00823\">fwd.hpp:823</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6966c0cb4673928c9c9da2e91006d2c0\"><div class=\"ttname\"><a href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">glm::f32quat</a></div><div class=\"ttdeci\">highp_f32quat f32quat</div><div class=\"ttdoc\">Default single-qualifier floating-point quaternion. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02463\">fwd.hpp:2463</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga9ec7c4c79e303c053e30729a95fb2c37\"><div class=\"ttname\"><a href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">glm::f64mat2x2</a></div><div class=\"ttdeci\">highp_f64mat2x2 f64mat2x2</div><div class=\"ttdoc\">Default double-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02521\">fwd.hpp:2521</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><div class=\"ttname\"><a href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">glm::i32vec1</a></div><div class=\"ttdeci\">highp_i32vec1 i32vec1</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00525\">fwd.hpp:525</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga62a17cddeb4dffb4e18fe3aea23f051a\"><div class=\"ttname\"><a href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">glm::mediump_i16</a></div><div class=\"ttdeci\">detail::int16 mediump_i16</div><div class=\"ttdoc\">Medium qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00186\">fwd.hpp:186</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad0549c902a96a7164e4ac858d5f39dbf\"><div class=\"ttname\"><a href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">glm::highp_int8</a></div><div class=\"ttdeci\">detail::int8 highp_int8</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00198\">fwd.hpp:198</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaebf341fc4a5be233f7dde962c2e33847\"><div class=\"ttname\"><a href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">glm::lowp_int64_t</a></div><div class=\"ttdeci\">detail::int64 lowp_int64_t</div><div class=\"ttdoc\">Low qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00130\">fwd.hpp:130</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2b65767f8b5aed1bd1cf86c541662b50\"><div class=\"ttname\"><a href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">glm::i64vec1</a></div><div class=\"ttdeci\">highp_i64vec1 i64vec1</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00684\">fwd.hpp:684</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga97432f9979e73e66567361fd01e4cffb\"><div class=\"ttname\"><a href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">glm::highp_uint8</a></div><div class=\"ttdeci\">detail::uint8 highp_uint8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00807\">fwd.hpp:807</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3e2e66ffbe341a80bc005ba2b9552110\"><div class=\"ttname\"><a href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">glm::f64mat4x3</a></div><div class=\"ttdeci\">highp_f64mat4x3 f64mat4x3</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02549\">fwd.hpp:2549</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5d6c70e080409a76a257dc55bd8ea2c8\"><div class=\"ttname\"><a href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">glm::f32vec2</a></div><div class=\"ttdeci\">highp_f32vec2 f32vec2</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 2 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02403\">fwd.hpp:2403</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gafe730798732aa7b0647096a004db1b1c\"><div class=\"ttname\"><a href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">glm::i16vec1</a></div><div class=\"ttdeci\">highp_i16vec1 i16vec1</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00446\">fwd.hpp:446</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga667948cfe6fb3d6606c750729ec49f77\"><div class=\"ttname\"><a href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">glm::i64vec3</a></div><div class=\"ttdeci\">highp_i64vec3 i64vec3</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00692\">fwd.hpp:692</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga866a05905c49912309ed1fa5f5980e61\"><div class=\"ttname\"><a href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">glm::i32vec4</a></div><div class=\"ttdeci\">highp_i32vec4 i32vec4</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00537\">fwd.hpp:537</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga04100c76f7d55a0dd0983ccf05142bff\"><div class=\"ttname\"><a href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">glm::f32mat2x2</a></div><div class=\"ttdeci\">highp_f32mat2x2 f32mat2x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02415\">fwd.hpp:2415</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga55a2d2a8eb09b5633668257eb3cad453\"><div class=\"ttname\"><a href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">glm::fmat2x3</a></div><div class=\"ttdeci\">highp_f32mat2x3 fmat2x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02349\">fwd.hpp:2349</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga30652709815ad9404272a31957daa59e\"><div class=\"ttname\"><a href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">glm::mediump_uint64</a></div><div class=\"ttdeci\">detail::uint64 mediump_uint64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00769\">fwd.hpp:769</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad01cc6479bde1fd1870f13d3ed9530b3\"><div class=\"ttname\"><a href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">glm::fmat4x4</a></div><div class=\"ttdeci\">highp_f32mat4x4 fmat4x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02377\">fwd.hpp:2377</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8b2cd8d31eb345b2d641d9261c38db1a\"><div class=\"ttname\"><a href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">glm::lowp_int16_t</a></div><div class=\"ttdeci\">detail::int16 lowp_int16_t</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00122\">fwd.hpp:122</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3b32ca1e57a4ef91babbc3d35a34ea20\"><div class=\"ttname\"><a href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">glm::f32mat4x2</a></div><div class=\"ttdeci\">highp_f32mat4x2 f32mat4x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02439\">fwd.hpp:2439</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga26fc7ced1ad7ca5024f1c973c8dc9180\"><div class=\"ttname\"><a href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">glm::mediump_int32_t</a></div><div class=\"ttdeci\">detail::int32 mediump_int32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00174\">fwd.hpp:174</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0350631d35ff800e6133ac6243b13cbc\"><div class=\"ttname\"><a href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">glm::lowp_int32_t</a></div><div class=\"ttdeci\">detail::int32 lowp_int32_t</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00126\">fwd.hpp:126</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa46172d7dc1c7ffe3e78107ff88adf08\"><div class=\"ttname\"><a href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">glm::highp_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 highp_uint64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00835\">fwd.hpp:835</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab12383ed6ac7595ed6fde4d266c58425\"><div class=\"ttname\"><a href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">glm::f32mat2</a></div><div class=\"ttdeci\">f32mat2x2 f32mat2</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02451\">fwd.hpp:2451</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><div class=\"ttname\"><a href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">glm::f32</a></div><div class=\"ttdeci\">highp_float32_t f32</div><div class=\"ttdoc\">Default 32 bit single-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01507\">fwd.hpp:1507</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa7a1ddca75c5f629173bf4772db7a635\"><div class=\"ttname\"><a href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">glm::f64vec3</a></div><div class=\"ttdeci\">highp_f64vec3 f64vec3</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 3 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02513\">fwd.hpp:2513</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaecc7082561fc9028b844b6cf3d305d36\"><div class=\"ttname\"><a href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">glm::u8</a></div><div class=\"ttdeci\">detail::uint8 u8</div><div class=\"ttdoc\">8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00896\">fwd.hpp:896</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga119c41d73fe9977358174eb3ac1035a3\"><div class=\"ttname\"><a href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">glm::lowp_int8_t</a></div><div class=\"ttdeci\">detail::int8 lowp_int8_t</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00118\">fwd.hpp:118</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacf54c3330ef60aa3d16cb676c7bcb8c7\"><div class=\"ttname\"><a href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">glm::highp_uint16_t</a></div><div class=\"ttdeci\">detail::uint16 highp_uint16_t</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00827\">fwd.hpp:827</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga302ec977b0c0c3ea245b6c9275495355\"><div class=\"ttname\"><a href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">glm::i8</a></div><div class=\"ttdeci\">detail::int8 i8</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00287\">fwd.hpp:287</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad06935764d78f43f9d542c784c2212ec\"><div class=\"ttname\"><a href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">glm::i8vec2</a></div><div class=\"ttdeci\">highp_i8vec2 i8vec2</div><div class=\"ttdoc\">Default qualifier 8 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00370\">fwd.hpp:370</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga0c181fdf06a309691999926b6690c969\"><div class=\"ttname\"><a href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">glm::highp_u64</a></div><div class=\"ttdeci\">detail::uint64 highp_u64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00851\">fwd.hpp:851</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga253d453c20e037730023fea0215cb6f6\"><div class=\"ttname\"><a href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">glm::fmat3</a></div><div class=\"ttdeci\">fmat3x3 fmat3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02385\">fwd.hpp:2385</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae8f5e3e964ca2ae240adc2c0d74adede\"><div class=\"ttname\"><a href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">glm::int16_t</a></div><div class=\"ttdeci\">detail::int16 int16_t</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00274\">fwd.hpp:274</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga698e36b01167fc0f037889334dce8def\"><div class=\"ttname\"><a href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">glm::lowp_int16</a></div><div class=\"ttdeci\">detail::int16 lowp_int16</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00106\">fwd.hpp:106</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8dd3a3281ae5c970ffe0c41d538aa153\"><div class=\"ttname\"><a href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">glm::lowp_uint64_t</a></div><div class=\"ttdeci\">detail::uint64 lowp_uint64_t</div><div class=\"ttdoc\">Low qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00734\">fwd.hpp:734</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf09f3ca4b671a4a4f84505eb4cc865fd\"><div class=\"ttname\"><a href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">glm::u64vec1</a></div><div class=\"ttdeci\">highp_u64vec1 u64vec1</div><div class=\"ttdoc\">Default qualifier 64 bit unsigned integer scalar type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01293\">fwd.hpp:1293</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga66e92e57260bdb910609b9a56bf83e97\"><div class=\"ttname\"><a href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">glm::f64vec4</a></div><div class=\"ttdeci\">highp_f64vec4 f64vec4</div><div class=\"ttdoc\">Default double-qualifier floating-point vector of 4 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02517\">fwd.hpp:2517</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga550831bfc26d1e0101c1cb3d79938c06\"><div class=\"ttname\"><a href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">glm::i16vec4</a></div><div class=\"ttdeci\">highp_i16vec4 i16vec4</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00458\">fwd.hpp:458</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae9c90a867a6026b1f6eab00456f3fb8b\"><div class=\"ttname\"><a href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">glm::i16vec3</a></div><div class=\"ttdeci\">highp_i16vec3 i16vec3</div><div class=\"ttdoc\">Default qualifier 16 bit signed integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00454\">fwd.hpp:454</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><div class=\"ttname\"><a href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">glm::highp_int32_t</a></div><div class=\"ttdeci\">detail::int32 highp_int32_t</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00222\">fwd.hpp:222</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae52e2b7077a9ff928a06ab5ce600b81e\"><div class=\"ttname\"><a href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">glm::f64mat4x4</a></div><div class=\"ttdeci\">highp_f64mat4x4 f64mat4x4</div><div class=\"ttdoc\">Default double-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02553\">fwd.hpp:2553</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga864aabca5f3296e176e0c3ed9cc16b02\"><div class=\"ttname\"><a href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">glm::lowp_int32</a></div><div class=\"ttdeci\">detail::int32 lowp_int32</div><div class=\"ttdoc\">Low qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00110\">fwd.hpp:110</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga5244cef85d6e870e240c76428a262ae8\"><div class=\"ttname\"><a href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">glm::mediump_int32</a></div><div class=\"ttdeci\">detail::int32 mediump_int32</div><div class=\"ttdoc\">Medium qualifier 32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00158\">fwd.hpp:158</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga48310188e1d0c616bf8d78c92447523b\"><div class=\"ttname\"><a href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">glm::i64vec2</a></div><div class=\"ttdeci\">highp_i64vec2 i64vec2</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00688\">fwd.hpp:688</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gad1213a22bbb9e4107f07eaa4956f8281\"><div class=\"ttname\"><a href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">glm::mediump_u8</a></div><div class=\"ttdeci\">detail::uint8 mediump_u8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00789\">fwd.hpp:789</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6d7b3789ecb932c26430009478cac7ae\"><div class=\"ttname\"><a href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">glm::mediump_int8_t</a></div><div class=\"ttdeci\">detail::int8 mediump_int8_t</div><div class=\"ttdoc\">Medium qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00166\">fwd.hpp:166</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga746dc6da204f5622e395f492997dbf57\"><div class=\"ttname\"><a href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">glm::highp_uint16</a></div><div class=\"ttdeci\">detail::uint16 highp_uint16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00811\">fwd.hpp:811</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gae978599c9711ac263ba732d4ac225b0e\"><div class=\"ttname\"><a href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">glm::highp_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 highp_uint32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00831\">fwd.hpp:831</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga518b8d948a6b4ddb72f84d5c3b7b6611\"><div class=\"ttname\"><a href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">glm::u8vec2</a></div><div class=\"ttdeci\">highp_u8vec2 u8vec2</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00979\">fwd.hpp:979</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4bf09d8838a86866b39ee6e109341645\"><div class=\"ttname\"><a href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">glm::int8_t</a></div><div class=\"ttdeci\">detail::int8 int8_t</div><div class=\"ttdoc\">8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00270\">fwd.hpp:270</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa4e31c3d9de067029efeb161a44b0232\"><div class=\"ttname\"><a href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">glm::i64vec4</a></div><div class=\"ttdeci\">highp_i64vec4 i64vec4</div><div class=\"ttdoc\">Default qualifier 64 bit signed integer vector of 4 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00696\">fwd.hpp:696</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga98b9ed43cf8c5cf1d354b23c7df9119f\"><div class=\"ttname\"><a href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">glm::fvec1</a></div><div class=\"ttdeci\">highp_f32vec1 fvec1</div><div class=\"ttdoc\">Default single-qualifier floating-point vector of 1 components. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02329\">fwd.hpp:2329</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8165913e068444f7842302d40ba897b9\"><div class=\"ttname\"><a href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">glm::u32</a></div><div class=\"ttdeci\">detail::uint32 u32</div><div class=\"ttdoc\">32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00904\">fwd.hpp:904</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8e62c883d13f47015f3b70ed88751369\"><div class=\"ttname\"><a href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">glm::highp_u16</a></div><div class=\"ttdeci\">detail::uint16 highp_u16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00843\">fwd.hpp:843</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf3f312156984c365e9f65620354da70b\"><div class=\"ttname\"><a href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">glm::u64</a></div><div class=\"ttdeci\">detail::uint64 u64</div><div class=\"ttdoc\">64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00908\">fwd.hpp:908</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8cb400c0f4438f2640035d7b9824a0ca\"><div class=\"ttname\"><a href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">glm::fmat4</a></div><div class=\"ttdeci\">fmat4x4 fmat4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02389\">fwd.hpp:2389</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaee4da0e9fbd8cfa2f89cb80889719dc3\"><div class=\"ttname\"><a href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">glm::f32mat4x4</a></div><div class=\"ttdeci\">highp_f32mat4x4 f32mat4x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02447\">fwd.hpp:2447</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga96faea43ac5f875d2d3ffbf8d213e3eb\"><div class=\"ttname\"><a href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">glm::i32</a></div><div class=\"ttdeci\">detail::int32 i32</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00295\">fwd.hpp:295</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gab90ade28222f8b861d5ceaf81a3a7f5d\"><div class=\"ttname\"><a href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">glm::f32mat3x4</a></div><div class=\"ttdeci\">highp_f32mat3x4 f32mat3x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02435\">fwd.hpp:2435</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga3ab5fe184343d394fb6c2723c3ee3699\"><div class=\"ttname\"><a href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">glm::i16</a></div><div class=\"ttdeci\">detail::int16 i16</div><div class=\"ttdoc\">16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00291\">fwd.hpp:291</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga392b673fd10847bfb78fb808c6cf8ff7\"><div class=\"ttname\"><a href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">glm::lowp_i16</a></div><div class=\"ttdeci\">detail::int16 lowp_i16</div><div class=\"ttdoc\">Low qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00138\">fwd.hpp:138</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga667b2ece2b258be898812dc2177995d1\"><div class=\"ttname\"><a href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">glm::lowp_uint8_t</a></div><div class=\"ttdeci\">detail::uint8 lowp_uint8_t</div><div class=\"ttdoc\">Low qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00722\">fwd.hpp:722</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2a266e46ee218d0c680f12b35c500cc0\"><div class=\"ttname\"><a href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">glm::u32vec2</a></div><div class=\"ttdeci\">highp_u32vec2 u32vec2</div><div class=\"ttdoc\">Default qualifier 32 bit unsigned integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01138\">fwd.hpp:1138</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga2885a6c89916911e418c06bb76b9bdbb\"><div class=\"ttname\"><a href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">glm::mediump_uint16</a></div><div class=\"ttdeci\">detail::uint16 mediump_uint16</div><div class=\"ttdoc\">Medium qualifier 16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00761\">fwd.hpp:761</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga226a8d52b4e3f77aaa6231135e886aac\"><div class=\"ttname\"><a href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">glm::highp_int64</a></div><div class=\"ttdeci\">detail::int64 highp_int64</div><div class=\"ttdoc\">High qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00210\">fwd.hpp:210</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf512b74c4400b68f9fdf9388b3d6aac8\"><div class=\"ttname\"><a href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">glm::f32mat2x4</a></div><div class=\"ttdeci\">highp_f32mat2x4 f32mat2x4</div><div class=\"ttdoc\">Default single-qualifier floating-point 2x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02423\">fwd.hpp:2423</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga856f3905ee7cc2e4890a8a1d56c150be\"><div class=\"ttname\"><a href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">glm::f32mat3</a></div><div class=\"ttdeci\">f32mat3x3 f32mat3</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02455\">fwd.hpp:2455</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga042ef09ff2f0cb24a36f541bcb3a3710\"><div class=\"ttname\"><a href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">glm::int32_t</a></div><div class=\"ttdeci\">detail::int32 int32_t</div><div class=\"ttdoc\">32 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00278\">fwd.hpp:278</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gacaea06d0a79ef3172e887a7a6ba434ff\"><div class=\"ttname\"><a href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">glm::highp_int16_t</a></div><div class=\"ttdeci\">detail::int16 highp_int16_t</div><div class=\"ttdoc\">High qualifier 16 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00218\">fwd.hpp:218</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga760bcf26fdb23a2c3ecad3c928a19ae6\"><div class=\"ttname\"><a href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">glm::lowp_int8</a></div><div class=\"ttdeci\">detail::int8 lowp_int8</div><div class=\"ttdoc\">Low qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00102\">fwd.hpp:102</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1085c50dd8fbeb5e7e609b1c127492a5\"><div class=\"ttname\"><a href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">glm::highp_int8_t</a></div><div class=\"ttdeci\">detail::int8 highp_int8_t</div><div class=\"ttdoc\">High qualifier 8 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00214\">fwd.hpp:214</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga8b44026374982dcd1e52d22bac99247e\"><div class=\"ttname\"><a href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">glm::i32vec2</a></div><div class=\"ttdeci\">highp_i32vec2 i32vec2</div><div class=\"ttdoc\">Default qualifier 32 bit signed integer vector of 2 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00529\">fwd.hpp:529</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga4295048a78bdf46b8a7de77ec665b497\"><div class=\"ttname\"><a href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">glm::fmat4x3</a></div><div class=\"ttdeci\">highp_f32mat4x3 fmat4x3</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x3 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02373\">fwd.hpp:2373</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1320a08e14fdff3821241eefab6947e9\"><div class=\"ttname\"><a href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">glm::f32mat3x2</a></div><div class=\"ttdeci\">highp_f32mat3x2 f32mat3x2</div><div class=\"ttdoc\">Default single-qualifier floating-point 3x2 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02427\">fwd.hpp:2427</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><div class=\"ttname\"><a href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">glm::highp_uint64</a></div><div class=\"ttdeci\">detail::uint64 highp_uint64</div><div class=\"ttdoc\">Medium qualifier 64 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00819\">fwd.hpp:819</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gadb997e409103d4da18abd837e636a496\"><div class=\"ttname\"><a href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">glm::i64</a></div><div class=\"ttdeci\">detail::int64 i64</div><div class=\"ttdoc\">64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00299\">fwd.hpp:299</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga99d1b85ff99956b33da7e9992aad129a\"><div class=\"ttname\"><a href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">glm::f32mat4</a></div><div class=\"ttdeci\">f32mat4x4 f32mat4</div><div class=\"ttdoc\">Default single-qualifier floating-point 4x4 matrix. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l02459\">fwd.hpp:2459</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gac3bc41bcac61d1ba8f02a6f68ce23f64\"><div class=\"ttname\"><a href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">glm::mediump_int64_t</a></div><div class=\"ttdeci\">detail::int64 mediump_int64_t</div><div class=\"ttdoc\">Medium qualifier 64 bit signed integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00178\">fwd.hpp:178</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaa2d7acc0adb536fab71fe261232a40ff\"><div class=\"ttname\"><a href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">glm::u16</a></div><div class=\"ttdeci\">detail::uint16 u16</div><div class=\"ttdoc\">16 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00900\">fwd.hpp:900</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1d794d240091678f602e8de225b8d8c9\"><div class=\"ttname\"><a href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">glm::f64</a></div><div class=\"ttdeci\">highp_float64_t f64</div><div class=\"ttdoc\">Default 64 bit double-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01511\">fwd.hpp:1511</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_gaf4dae276fd29623950de14a6ca2586b5\"><div class=\"ttname\"><a href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">glm::mediump_uint32_t</a></div><div class=\"ttdeci\">detail::uint32 mediump_uint32_t</div><div class=\"ttdoc\">Medium qualifier 32 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00781\">fwd.hpp:781</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><div class=\"ttname\"><a href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">glm::mediump_uint8</a></div><div class=\"ttdeci\">detail::uint8 mediump_uint8</div><div class=\"ttdoc\">Medium qualifier 8 bit unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00757\">fwd.hpp:757</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga6957c7b22f405683bb276554ca40dc37\"><div class=\"ttname\"><a href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">glm::float64_t</a></div><div class=\"ttdeci\">highp_float64_t float64_t</div><div class=\"ttdoc\">Default 64 bit double-qualifier floating-point scalar. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l01503\">fwd.hpp:1503</a></div></div>\n<div class=\"ttc\" id=\"a00165_html_ga7c5706f6bbe5282e5598acf7e7b377e2\"><div class=\"ttname\"><a href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">glm::u8vec3</a></div><div class=\"ttdeci\">highp_u8vec3 u8vec3</div><div class=\"ttdoc\">Default qualifier 8 bit unsigned integer vector of 3 components type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00033_source.html#l00983\">fwd.hpp:983</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00118.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_ptr.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">type_ptr.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00166.html\">GLM_GTC_type_ptr</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00118_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga04409e74dc3da251d2501acf5b4b546c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga04409e74dc3da251d2501acf5b4b546c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga04409e74dc3da251d2501acf5b4b546c\">make_mat2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga04409e74dc3da251d2501acf5b4b546c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga04409e74dc3da251d2501acf5b4b546c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04409e74dc3da251d2501acf5b4b546c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae49e1c7bcd5abec74d1c34155031f663\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae49e1c7bcd5abec74d1c34155031f663\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gae49e1c7bcd5abec74d1c34155031f663\">make_mat2x2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gae49e1c7bcd5abec74d1c34155031f663\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#gae49e1c7bcd5abec74d1c34155031f663\">More...</a><br /></td></tr>\n<tr class=\"separator:gae49e1c7bcd5abec74d1c34155031f663\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga21982104164789cf8985483aaefc25e8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga21982104164789cf8985483aaefc25e8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga21982104164789cf8985483aaefc25e8\">make_mat2x3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga21982104164789cf8985483aaefc25e8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga21982104164789cf8985483aaefc25e8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga21982104164789cf8985483aaefc25e8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga078b862c90b0e9a79ed43a58997d8388\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga078b862c90b0e9a79ed43a58997d8388\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga078b862c90b0e9a79ed43a58997d8388\">make_mat2x4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga078b862c90b0e9a79ed43a58997d8388\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga078b862c90b0e9a79ed43a58997d8388\">More...</a><br /></td></tr>\n<tr class=\"separator:ga078b862c90b0e9a79ed43a58997d8388\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga611ee7c4d4cadfc83a8fa8e1d10a170f\">make_mat3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga611ee7c4d4cadfc83a8fa8e1d10a170f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga27a24e121dc39e6857620e0f85b6e1a8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga27a24e121dc39e6857620e0f85b6e1a8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga27a24e121dc39e6857620e0f85b6e1a8\">make_mat3x2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga27a24e121dc39e6857620e0f85b6e1a8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga27a24e121dc39e6857620e0f85b6e1a8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga27a24e121dc39e6857620e0f85b6e1a8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2e8337b15c3362aaeb6e5849e1c0536\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaf2e8337b15c3362aaeb6e5849e1c0536\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gaf2e8337b15c3362aaeb6e5849e1c0536\">make_mat3x3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gaf2e8337b15c3362aaeb6e5849e1c0536\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#gaf2e8337b15c3362aaeb6e5849e1c0536\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2e8337b15c3362aaeb6e5849e1c0536\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga05dd66232aedb993e3b8e7b35eaf932b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga05dd66232aedb993e3b8e7b35eaf932b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga05dd66232aedb993e3b8e7b35eaf932b\">make_mat3x4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga05dd66232aedb993e3b8e7b35eaf932b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga05dd66232aedb993e3b8e7b35eaf932b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga05dd66232aedb993e3b8e7b35eaf932b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae7bcedb710d1446c87fd1fc93ed8ee9a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae7bcedb710d1446c87fd1fc93ed8ee9a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gae7bcedb710d1446c87fd1fc93ed8ee9a\">make_mat4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gae7bcedb710d1446c87fd1fc93ed8ee9a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#gae7bcedb710d1446c87fd1fc93ed8ee9a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae7bcedb710d1446c87fd1fc93ed8ee9a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga8b34c9b25bf3310d8ff9c828c7e2d97c\">make_mat4x2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga8b34c9b25bf3310d8ff9c828c7e2d97c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0330bf6640092d7985fac92927bbd42b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0330bf6640092d7985fac92927bbd42b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga0330bf6640092d7985fac92927bbd42b\">make_mat4x3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga0330bf6640092d7985fac92927bbd42b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga0330bf6640092d7985fac92927bbd42b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0330bf6640092d7985fac92927bbd42b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f084be30e404844bfbb4a551ac2728c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga8f084be30e404844bfbb4a551ac2728c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga8f084be30e404844bfbb4a551ac2728c\">make_mat4x4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga8f084be30e404844bfbb4a551ac2728c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga8f084be30e404844bfbb4a551ac2728c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f084be30e404844bfbb4a551ac2728c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaadafb6600af2633e4c98cc64c72f5269\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaadafb6600af2633e4c98cc64c72f5269\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gaadafb6600af2633e4c98cc64c72f5269\">make_quat</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gaadafb6600af2633e4c98cc64c72f5269\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a quaternion from a pointer.  <a href=\"a00166.html#gaadafb6600af2633e4c98cc64c72f5269\">More...</a><br /></td></tr>\n<tr class=\"separator:gaadafb6600af2633e4c98cc64c72f5269\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga81253cf7b0ebfbb1e70540c5774e6824\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga81253cf7b0ebfbb1e70540c5774e6824\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga81253cf7b0ebfbb1e70540c5774e6824\">make_vec2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga81253cf7b0ebfbb1e70540c5774e6824\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a vector from a pointer.  <a href=\"a00166.html#ga81253cf7b0ebfbb1e70540c5774e6824\">More...</a><br /></td></tr>\n<tr class=\"separator:ga81253cf7b0ebfbb1e70540c5774e6824\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad9e0d36ff489cb30c65ad1fa40351651\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gad9e0d36ff489cb30c65ad1fa40351651\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gad9e0d36ff489cb30c65ad1fa40351651\">make_vec3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gad9e0d36ff489cb30c65ad1fa40351651\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a vector from a pointer.  <a href=\"a00166.html#gad9e0d36ff489cb30c65ad1fa40351651\">More...</a><br /></td></tr>\n<tr class=\"separator:gad9e0d36ff489cb30c65ad1fa40351651\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga63f576518993efc22a969f18f80e29bb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga63f576518993efc22a969f18f80e29bb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga63f576518993efc22a969f18f80e29bb\">make_vec4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga63f576518993efc22a969f18f80e29bb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a vector from a pointer.  <a href=\"a00166.html#ga63f576518993efc22a969f18f80e29bb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga63f576518993efc22a969f18f80e29bb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1c64669e1ba1160ad9386e43dc57569a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga1c64669e1ba1160ad9386e43dc57569a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type const *&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">value_ptr</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1c64669e1ba1160ad9386e43dc57569a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the constant address to the data of the input parameter.  <a href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1c64669e1ba1160ad9386e43dc57569a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00166.html\">GLM_GTC_type_ptr</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00118_source.html\">type_ptr.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00118_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_ptr.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_ptr.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00118.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"preprocessor\">#include &quot;../vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">#include &quot;../vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#include &quot;../vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;<span class=\"preprocessor\">#include &quot;../mat2x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;<span class=\"preprocessor\">#include &quot;../mat3x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"preprocessor\">#include &quot;../mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#include &lt;cstring&gt;</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_type_ptr extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        GLM_FUNC_DECL <span class=\"keyword\">typename</span> genType::value_type <span class=\"keyword\">const</span> * <a class=\"code\" href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">value_ptr</a>(genType <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga81253cf7b0ebfbb1e70540c5774e6824\">make_vec2</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#gad9e0d36ff489cb30c65ad1fa40351651\">make_vec3</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga63f576518993efc22a969f18f80e29bb\">make_vec4</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#gae49e1c7bcd5abec74d1c34155031f663\">make_mat2x2</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        GLM_FUNC_DECL mat&lt;2, 3, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga21982104164789cf8985483aaefc25e8\">make_mat2x3</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        GLM_FUNC_DECL mat&lt;2, 4, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga078b862c90b0e9a79ed43a58997d8388\">make_mat2x4</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;        GLM_FUNC_DECL mat&lt;3, 2, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga27a24e121dc39e6857620e0f85b6e1a8\">make_mat3x2</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#gaf2e8337b15c3362aaeb6e5849e1c0536\">make_mat3x3</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        GLM_FUNC_DECL mat&lt;3, 4, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga05dd66232aedb993e3b8e7b35eaf932b\">make_mat3x4</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        GLM_FUNC_DECL mat&lt;4, 2, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga8b34c9b25bf3310d8ff9c828c7e2d97c\">make_mat4x2</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        GLM_FUNC_DECL mat&lt;4, 3, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga0330bf6640092d7985fac92927bbd42b\">make_mat4x3</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga8f084be30e404844bfbb4a551ac2728c\">make_mat4x4</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        GLM_FUNC_DECL mat&lt;2, 2, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga04409e74dc3da251d2501acf5b4b546c\">make_mat2</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        GLM_FUNC_DECL mat&lt;3, 3, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#ga611ee7c4d4cadfc83a8fa8e1d10a170f\">make_mat3</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; <a class=\"code\" href=\"a00166.html#gae7bcedb710d1446c87fd1fc93ed8ee9a\">make_mat4</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        GLM_FUNC_DECL tquat&lt;T, defaultp&gt; <a class=\"code\" href=\"a00166.html#gaadafb6600af2633e4c98cc64c72f5269\">make_quat</a>(T <span class=\"keyword\">const</span> * <span class=\"keyword\">const</span> ptr);</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;<span class=\"preprocessor\">#include &quot;type_ptr.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00166_html_gae7bcedb710d1446c87fd1fc93ed8ee9a\"><div class=\"ttname\"><a href=\"a00166.html#gae7bcedb710d1446c87fd1fc93ed8ee9a\">glm::make_mat4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; make_mat4(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga04409e74dc3da251d2501acf5b4b546c\"><div class=\"ttname\"><a href=\"a00166.html#ga04409e74dc3da251d2501acf5b4b546c\">glm::make_mat2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt; make_mat2(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga81253cf7b0ebfbb1e70540c5774e6824\"><div class=\"ttname\"><a href=\"a00166.html#ga81253cf7b0ebfbb1e70540c5774e6824\">glm::make_vec2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt; make_vec2(T const *const ptr)</div><div class=\"ttdoc\">Build a vector from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga21982104164789cf8985483aaefc25e8\"><div class=\"ttname\"><a href=\"a00166.html#ga21982104164789cf8985483aaefc25e8\">glm::make_mat2x3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 3, T, defaultp &gt; make_mat2x3(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00166_html_ga0330bf6640092d7985fac92927bbd42b\"><div class=\"ttname\"><a href=\"a00166.html#ga0330bf6640092d7985fac92927bbd42b\">glm::make_mat4x3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 3, T, defaultp &gt; make_mat4x3(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga05dd66232aedb993e3b8e7b35eaf932b\"><div class=\"ttname\"><a href=\"a00166.html#ga05dd66232aedb993e3b8e7b35eaf932b\">glm::make_mat3x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 4, T, defaultp &gt; make_mat3x4(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_gaadafb6600af2633e4c98cc64c72f5269\"><div class=\"ttname\"><a href=\"a00166.html#gaadafb6600af2633e4c98cc64c72f5269\">glm::make_quat</a></div><div class=\"ttdeci\">GLM_FUNC_DECL tquat&lt; T, defaultp &gt; make_quat(T const *const ptr)</div><div class=\"ttdoc\">Build a quaternion from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga8f084be30e404844bfbb4a551ac2728c\"><div class=\"ttname\"><a href=\"a00166.html#ga8f084be30e404844bfbb4a551ac2728c\">glm::make_mat4x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt; make_mat4x4(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga1c64669e1ba1160ad9386e43dc57569a\"><div class=\"ttname\"><a href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">glm::value_ptr</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType::value_type const * value_ptr(genType const &amp;v)</div><div class=\"ttdoc\">Return the constant address to the data of the input parameter. </div></div>\n<div class=\"ttc\" id=\"a00166_html_gaf2e8337b15c3362aaeb6e5849e1c0536\"><div class=\"ttname\"><a href=\"a00166.html#gaf2e8337b15c3362aaeb6e5849e1c0536\">glm::make_mat3x3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, defaultp &gt; make_mat3x3(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><div class=\"ttname\"><a href=\"a00166.html#ga8b34c9b25bf3310d8ff9c828c7e2d97c\">glm::make_mat4x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 4, 2, T, defaultp &gt; make_mat4x2(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga63f576518993efc22a969f18f80e29bb\"><div class=\"ttname\"><a href=\"a00166.html#ga63f576518993efc22a969f18f80e29bb\">glm::make_vec4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 4, T, defaultp &gt; make_vec4(T const *const ptr)</div><div class=\"ttdoc\">Build a vector from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_gad9e0d36ff489cb30c65ad1fa40351651\"><div class=\"ttname\"><a href=\"a00166.html#gad9e0d36ff489cb30c65ad1fa40351651\">glm::make_vec3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt; make_vec3(T const *const ptr)</div><div class=\"ttdoc\">Build a vector from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga27a24e121dc39e6857620e0f85b6e1a8\"><div class=\"ttname\"><a href=\"a00166.html#ga27a24e121dc39e6857620e0f85b6e1a8\">glm::make_mat3x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 2, T, defaultp &gt; make_mat3x2(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_gae49e1c7bcd5abec74d1c34155031f663\"><div class=\"ttname\"><a href=\"a00166.html#gae49e1c7bcd5abec74d1c34155031f663\">glm::make_mat2x2</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt; make_mat2x2(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><div class=\"ttname\"><a href=\"a00166.html#ga611ee7c4d4cadfc83a8fa8e1d10a170f\">glm::make_mat3</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 3, 3, T, defaultp &gt; make_mat3(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n<div class=\"ttc\" id=\"a00166_html_ga078b862c90b0e9a79ed43a58997d8388\"><div class=\"ttname\"><a href=\"a00166.html#ga078b862c90b0e9a79ed43a58997d8388\">glm::make_mat2x4</a></div><div class=\"ttdeci\">GLM_FUNC_DECL mat&lt; 2, 4, T, defaultp &gt; make_mat2x4(T const *const ptr)</div><div class=\"ttdoc\">Build a matrix from a pointer. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00119.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_trait.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_trait.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00224.html\">GLM_GTX_type_trait</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00119_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00224.html\">GLM_GTX_type_trait</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00119_source.html\">type_trait.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00119_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_trait.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_trait.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00119.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_type_trait is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_vec2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_vec3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_vec4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat2x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat2x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat2x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat3x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat3x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat3x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat4x2.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat4x3.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_mat4x4.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/dual_quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_type_trait extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">struct </span>type</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                <span class=\"keyword\">static</span> length_t <span class=\"keyword\">const</span> components = 0;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                <span class=\"keyword\">static</span> length_t <span class=\"keyword\">const</span> cols = 0;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                <span class=\"keyword\">static</span> length_t <span class=\"keyword\">const</span> rows = 0;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        <span class=\"keyword\">struct </span>type&lt;vec&lt;L, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;                        components = L</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;2, 2, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;                        components = 2,</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;                        cols = 2,</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                        rows = 2</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;2, 3, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                        components = 2,</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                        cols = 2,</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                        rows = 3</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;2, 4, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                        components = 2,</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                        cols = 2,</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                        rows = 4</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;3, 2, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                        components = 3,</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;                        cols = 3,</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                        rows = 2</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;3, 3, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                        components = 3,</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;                        cols = 3,</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                        rows = 3</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;3, 4, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;                        components = 3,</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;                        cols = 3,</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;                        rows = 4</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;4, 2, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;                        components = 4,</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;                        cols = 4,</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;                        rows = 2</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;4, 3, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                        components = 4,</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                        cols = 4,</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;                        rows = 3</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        <span class=\"keyword\">struct </span>type&lt;mat&lt;4, 4, T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;                        components = 4,</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;                        cols = 4,</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;                        rows = 4</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;        <span class=\"keyword\">struct </span>type&lt;tquat&lt;T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                        components = 4</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;        <span class=\"keyword\">struct </span>type&lt;tdualquat&lt;T, Q&gt; &gt;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_vec = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_mat = <span class=\"keyword\">false</span>;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;                <span class=\"keyword\">static</span> <span class=\"keywordtype\">bool</span> <span class=\"keyword\">const</span> is_quat = <span class=\"keyword\">true</span>;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;                <span class=\"keyword\">enum</span></div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;                        components = 8</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;<span class=\"preprocessor\">#include &quot;type_trait.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00120.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00120_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga0e46aaaccc5e713eac5bfbc8d6885a60\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_bvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60\">bvec2</a></td></tr>\n<tr class=\"memdesc:ga0e46aaaccc5e713eac5bfbc8d6885a60\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of boolean.  <a href=\"a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0e46aaaccc5e713eac5bfbc8d6885a60\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga150731e2a148eff8752114a0e450505e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_bvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">bvec3</a></td></tr>\n<tr class=\"memdesc:ga150731e2a148eff8752114a0e450505e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of boolean.  <a href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga150731e2a148eff8752114a0e450505e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga444e8f61bfb3a6f037d019ac6933f8c6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_bvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">bvec4</a></td></tr>\n<tr class=\"memdesc:ga444e8f61bfb3a6f037d019ac6933f8c6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of boolean.  <a href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga444e8f61bfb3a6f037d019ac6933f8c6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga15ade901680b29b78c1f9d1796db6e0e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">dvec2</a></td></tr>\n<tr class=\"memdesc:ga15ade901680b29b78c1f9d1796db6e0e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga15ade901680b29b78c1f9d1796db6e0e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabebd0c7e3c5cd337d95c313c5e8b8db4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">dvec3</a></td></tr>\n<tr class=\"memdesc:gabebd0c7e3c5cd337d95c313c5e8b8db4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of double-qualifier floating-point numbers.  <a href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">More...</a><br /></td></tr>\n<tr class=\"separator:gabebd0c7e3c5cd337d95c313c5e8b8db4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9503f809789bda7e8852a6abde3ae5c1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">dvec4</a></td></tr>\n<tr class=\"memdesc:ga9503f809789bda7e8852a6abde3ae5c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9503f809789bda7e8852a6abde3ae5c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5d7156af15f362d4007769784a38e148\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5d7156af15f362d4007769784a38e148\">highp_bvec2</a></td></tr>\n<tr class=\"memdesc:ga5d7156af15f362d4007769784a38e148\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high qualifier bool numbers.  <a href=\"a00145.html#ga5d7156af15f362d4007769784a38e148\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5d7156af15f362d4007769784a38e148\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3625991931d1c556452a2c551748730\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gae3625991931d1c556452a2c551748730\">highp_bvec3</a></td></tr>\n<tr class=\"memdesc:gae3625991931d1c556452a2c551748730\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high qualifier bool numbers.  <a href=\"a00145.html#gae3625991931d1c556452a2c551748730\">More...</a><br /></td></tr>\n<tr class=\"separator:gae3625991931d1c556452a2c551748730\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0d2929c4809a6ff51ad616bf81e16e0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0\">highp_bvec4</a></td></tr>\n<tr class=\"memdesc:gaa0d2929c4809a6ff51ad616bf81e16e0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high qualifier bool numbers.  <a href=\"a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0d2929c4809a6ff51ad616bf81e16e0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20f7155c9cdcafb74da02d0ef60629a4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4\">highp_dvec2</a></td></tr>\n<tr class=\"memdesc:ga20f7155c9cdcafb74da02d0ef60629a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high double-qualifier floating-point numbers.  <a href=\"a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20f7155c9cdcafb74da02d0ef60629a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab8a03109aebc121ef69abec50fcdd459\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gab8a03109aebc121ef69abec50fcdd459\">highp_dvec3</a></td></tr>\n<tr class=\"memdesc:gab8a03109aebc121ef69abec50fcdd459\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high double-qualifier floating-point numbers.  <a href=\"a00145.html#gab8a03109aebc121ef69abec50fcdd459\">More...</a><br /></td></tr>\n<tr class=\"separator:gab8a03109aebc121ef69abec50fcdd459\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9dfeaa53a616848ed067994a2bd18992\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga9dfeaa53a616848ed067994a2bd18992\">highp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga9dfeaa53a616848ed067994a2bd18992\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high double-qualifier floating-point numbers.  <a href=\"a00145.html#ga9dfeaa53a616848ed067994a2bd18992\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9dfeaa53a616848ed067994a2bd18992\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga23594b732ebff0ff9630ddb2a3bad659\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga23594b732ebff0ff9630ddb2a3bad659\">highp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga23594b732ebff0ff9630ddb2a3bad659\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high qualifier signed integer numbers.  <a href=\"a00145.html#ga23594b732ebff0ff9630ddb2a3bad659\">More...</a><br /></td></tr>\n<tr class=\"separator:ga23594b732ebff0ff9630ddb2a3bad659\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga24acd3b02b156bf0d67eaf17917ec4b7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7\">highp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga24acd3b02b156bf0d67eaf17917ec4b7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high qualifier signed integer numbers.  <a href=\"a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga24acd3b02b156bf0d67eaf17917ec4b7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga08f6be9d594bfc3b488e3e8b02d45518\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518\">highp_ivec4</a></td></tr>\n<tr class=\"memdesc:ga08f6be9d594bfc3b488e3e8b02d45518\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high qualifier signed integer numbers.  <a href=\"a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518\">More...</a><br /></td></tr>\n<tr class=\"separator:ga08f6be9d594bfc3b488e3e8b02d45518\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab6d886704d5c7faf85b03e4a36290546\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gab6d886704d5c7faf85b03e4a36290546\">highp_uvec2</a></td></tr>\n<tr class=\"memdesc:gab6d886704d5c7faf85b03e4a36290546\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high qualifier unsigned integer numbers.  <a href=\"a00145.html#gab6d886704d5c7faf85b03e4a36290546\">More...</a><br /></td></tr>\n<tr class=\"separator:gab6d886704d5c7faf85b03e4a36290546\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6f83c9b2aa706c9bc77587de13bf287e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e\">highp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga6f83c9b2aa706c9bc77587de13bf287e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high qualifier unsigned integer numbers.  <a href=\"a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6f83c9b2aa706c9bc77587de13bf287e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09b43516ea6fd2c617fc4bee2995316a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga09b43516ea6fd2c617fc4bee2995316a\">highp_uvec4</a></td></tr>\n<tr class=\"memdesc:ga09b43516ea6fd2c617fc4bee2995316a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high qualifier unsigned integer numbers.  <a href=\"a00145.html#ga09b43516ea6fd2c617fc4bee2995316a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga09b43516ea6fd2c617fc4bee2995316a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa92c1954d71b1e7914874bd787b43d1c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">highp_vec2</a></td></tr>\n<tr class=\"memdesc:gaa92c1954d71b1e7914874bd787b43d1c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high single-qualifier floating-point numbers.  <a href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa92c1954d71b1e7914874bd787b43d1c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaca61dfaccbf2f58f2d8063a4e76b44a9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">highp_vec3</a></td></tr>\n<tr class=\"memdesc:gaca61dfaccbf2f58f2d8063a4e76b44a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high single-qualifier floating-point numbers.  <a href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaca61dfaccbf2f58f2d8063a4e76b44a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad281decae52948b82feb3a9db8f63a7b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">highp_vec4</a></td></tr>\n<tr class=\"memdesc:gad281decae52948b82feb3a9db8f63a7b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high single-qualifier floating-point numbers.  <a href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">More...</a><br /></td></tr>\n<tr class=\"separator:gad281decae52948b82feb3a9db8f63a7b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ab812bd103527e2d6c62c2e2f5ee78f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ivec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">ivec2</a></td></tr>\n<tr class=\"memdesc:ga2ab812bd103527e2d6c62c2e2f5ee78f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of signed integer numbers.  <a href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2ab812bd103527e2d6c62c2e2f5ee78f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga34aee73784bcc247d426250540c1911c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ivec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">ivec3</a></td></tr>\n<tr class=\"memdesc:ga34aee73784bcc247d426250540c1911c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of signed integer numbers.  <a href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga34aee73784bcc247d426250540c1911c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaa26c41d168dc00be0fe55f4d0a34224\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ivec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a></td></tr>\n<tr class=\"memdesc:gaaa26c41d168dc00be0fe55f4d0a34224\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of signed integer numbers.  <a href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaa26c41d168dc00be0fe55f4d0a34224\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39fbc2447d5846af799d075a29c6e46d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, bool, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga39fbc2447d5846af799d075a29c6e46d\">lowp_bvec2</a></td></tr>\n<tr class=\"memdesc:ga39fbc2447d5846af799d075a29c6e46d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low qualifier bool numbers.  <a href=\"a00145.html#ga39fbc2447d5846af799d075a29c6e46d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga39fbc2447d5846af799d075a29c6e46d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga916d4e72701db85b64815faf06050111\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, bool, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga916d4e72701db85b64815faf06050111\">lowp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga916d4e72701db85b64815faf06050111\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low qualifier bool numbers.  <a href=\"a00145.html#ga916d4e72701db85b64815faf06050111\">More...</a><br /></td></tr>\n<tr class=\"separator:ga916d4e72701db85b64815faf06050111\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e9de03b1c11d11f18ee8da8627a28c6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, bool, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6\">lowp_bvec4</a></td></tr>\n<tr class=\"memdesc:ga2e9de03b1c11d11f18ee8da8627a28c6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low qualifier bool numbers.  <a href=\"a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e9de03b1c11d11f18ee8da8627a28c6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e7f034722aaa1895196f0381a1810f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga8e7f034722aaa1895196f0381a1810f5\">lowp_dvec2</a></td></tr>\n<tr class=\"memdesc:ga8e7f034722aaa1895196f0381a1810f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low double-qualifier floating-point numbers.  <a href=\"a00145.html#ga8e7f034722aaa1895196f0381a1810f5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e7f034722aaa1895196f0381a1810f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b6374e88079410f8b641e21bf6b77a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2b6374e88079410f8b641e21bf6b77a3\">lowp_dvec3</a></td></tr>\n<tr class=\"memdesc:ga2b6374e88079410f8b641e21bf6b77a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low double-qualifier floating-point numbers.  <a href=\"a00145.html#ga2b6374e88079410f8b641e21bf6b77a3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b6374e88079410f8b641e21bf6b77a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabcd63b91329c8213fdae89d0da6ece4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabcd63b91329c8213fdae89d0da6ece4c\">lowp_dvec4</a></td></tr>\n<tr class=\"memdesc:gabcd63b91329c8213fdae89d0da6ece4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low double-qualifier floating-point numbers.  <a href=\"a00145.html#gabcd63b91329c8213fdae89d0da6ece4c\">More...</a><br /></td></tr>\n<tr class=\"separator:gabcd63b91329c8213fdae89d0da6ece4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ce7e678655c51239b95b2089e8f0e96\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga7ce7e678655c51239b95b2089e8f0e96\">lowp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga7ce7e678655c51239b95b2089e8f0e96\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low qualifier signed integer numbers.  <a href=\"a00145.html#ga7ce7e678655c51239b95b2089e8f0e96\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ce7e678655c51239b95b2089e8f0e96\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga59ae64e8103c0ccf7117bd3bee223ad0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0\">lowp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga59ae64e8103c0ccf7117bd3bee223ad0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low qualifier signed integer numbers.  <a href=\"a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga59ae64e8103c0ccf7117bd3bee223ad0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga693ad87d8ccd440f0c0423281defeccd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga693ad87d8ccd440f0c0423281defeccd\">lowp_ivec4</a></td></tr>\n<tr class=\"memdesc:ga693ad87d8ccd440f0c0423281defeccd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low qualifier signed integer numbers.  <a href=\"a00145.html#ga693ad87d8ccd440f0c0423281defeccd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga693ad87d8ccd440f0c0423281defeccd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ab41df977e0b21c1c41a314b1011042\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga3ab41df977e0b21c1c41a314b1011042\">lowp_uvec2</a></td></tr>\n<tr class=\"memdesc:ga3ab41df977e0b21c1c41a314b1011042\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low qualifier unsigned integer numbers.  <a href=\"a00145.html#ga3ab41df977e0b21c1c41a314b1011042\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ab41df977e0b21c1c41a314b1011042\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaacab3ed11290185c279a97edc9255b98\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaacab3ed11290185c279a97edc9255b98\">lowp_uvec3</a></td></tr>\n<tr class=\"memdesc:gaacab3ed11290185c279a97edc9255b98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low qualifier unsigned integer numbers.  <a href=\"a00145.html#gaacab3ed11290185c279a97edc9255b98\">More...</a><br /></td></tr>\n<tr class=\"separator:gaacab3ed11290185c279a97edc9255b98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4cdf061bac6ded19e940e876eab9b737\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga4cdf061bac6ded19e940e876eab9b737\">lowp_uvec4</a></td></tr>\n<tr class=\"memdesc:ga4cdf061bac6ded19e940e876eab9b737\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low qualifier unsigned integer numbers.  <a href=\"a00145.html#ga4cdf061bac6ded19e940e876eab9b737\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4cdf061bac6ded19e940e876eab9b737\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30e8baef5d56d5c166872a2bc00f36e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">lowp_vec2</a></td></tr>\n<tr class=\"memdesc:ga30e8baef5d56d5c166872a2bc00f36e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low single-qualifier floating-point numbers.  <a href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30e8baef5d56d5c166872a2bc00f36e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga868e8e4470a3ef97c7ee3032bf90dc79\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">lowp_vec3</a></td></tr>\n<tr class=\"memdesc:ga868e8e4470a3ef97c7ee3032bf90dc79\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low single-qualifier floating-point numbers.  <a href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">More...</a><br /></td></tr>\n<tr class=\"separator:ga868e8e4470a3ef97c7ee3032bf90dc79\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gace3acb313c800552a9411953eb8b2ed7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">lowp_vec4</a></td></tr>\n<tr class=\"memdesc:gace3acb313c800552a9411953eb8b2ed7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low single-qualifier floating-point numbers.  <a href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">More...</a><br /></td></tr>\n<tr class=\"separator:gace3acb313c800552a9411953eb8b2ed7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6670d1a61e113c339aac7dd2ae72154b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, bool, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6670d1a61e113c339aac7dd2ae72154b\">mediump_bvec2</a></td></tr>\n<tr class=\"memdesc:ga6670d1a61e113c339aac7dd2ae72154b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium qualifier bool numbers.  <a href=\"a00145.html#ga6670d1a61e113c339aac7dd2ae72154b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6670d1a61e113c339aac7dd2ae72154b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabc19c9cf2c0994f3ded6b98f9d37005\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, bool, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005\">mediump_bvec3</a></td></tr>\n<tr class=\"memdesc:gaabc19c9cf2c0994f3ded6b98f9d37005\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium qualifier bool numbers.  <a href=\"a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabc19c9cf2c0994f3ded6b98f9d37005\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga620d6dce077134eee76e014a3e2b2661\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, bool, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga620d6dce077134eee76e014a3e2b2661\">mediump_bvec4</a></td></tr>\n<tr class=\"memdesc:ga620d6dce077134eee76e014a3e2b2661\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium qualifier bool numbers.  <a href=\"a00145.html#ga620d6dce077134eee76e014a3e2b2661\">More...</a><br /></td></tr>\n<tr class=\"separator:ga620d6dce077134eee76e014a3e2b2661\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga00b74cf6997deedd6a962e0997bc120b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga00b74cf6997deedd6a962e0997bc120b\">mediump_dvec2</a></td></tr>\n<tr class=\"memdesc:ga00b74cf6997deedd6a962e0997bc120b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium double-qualifier floating-point numbers.  <a href=\"a00145.html#ga00b74cf6997deedd6a962e0997bc120b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga00b74cf6997deedd6a962e0997bc120b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabcad2ee624723d7add5ce5bf90b6bd2a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a\">mediump_dvec3</a></td></tr>\n<tr class=\"memdesc:gabcad2ee624723d7add5ce5bf90b6bd2a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium double-qualifier floating-point numbers.  <a href=\"a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a\">More...</a><br /></td></tr>\n<tr class=\"separator:gabcad2ee624723d7add5ce5bf90b6bd2a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga072fdd19df303b9b821b6793b86c1637\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga072fdd19df303b9b821b6793b86c1637\">mediump_dvec4</a></td></tr>\n<tr class=\"memdesc:ga072fdd19df303b9b821b6793b86c1637\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium double-qualifier floating-point numbers.  <a href=\"a00145.html#ga072fdd19df303b9b821b6793b86c1637\">More...</a><br /></td></tr>\n<tr class=\"separator:ga072fdd19df303b9b821b6793b86c1637\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabd76afa066badf4489fd0fec28f9537\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaabd76afa066badf4489fd0fec28f9537\">mediump_ivec2</a></td></tr>\n<tr class=\"memdesc:gaabd76afa066badf4489fd0fec28f9537\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium qualifier signed integer numbers.  <a href=\"a00145.html#gaabd76afa066badf4489fd0fec28f9537\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabd76afa066badf4489fd0fec28f9537\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf964dcfcbb2088d13c9c321517171154\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaf964dcfcbb2088d13c9c321517171154\">mediump_ivec3</a></td></tr>\n<tr class=\"memdesc:gaf964dcfcbb2088d13c9c321517171154\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium qualifier signed integer numbers.  <a href=\"a00145.html#gaf964dcfcbb2088d13c9c321517171154\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf964dcfcbb2088d13c9c321517171154\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f89d11cd6e64c1814200f8cca083512\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga7f89d11cd6e64c1814200f8cca083512\">mediump_ivec4</a></td></tr>\n<tr class=\"memdesc:ga7f89d11cd6e64c1814200f8cca083512\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium qualifier signed integer numbers.  <a href=\"a00145.html#ga7f89d11cd6e64c1814200f8cca083512\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f89d11cd6e64c1814200f8cca083512\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2d61afc5b2e4132f72885d4a51f0081\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081\">mediump_uvec2</a></td></tr>\n<tr class=\"memdesc:gaf2d61afc5b2e4132f72885d4a51f0081\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium qualifier unsigned integer numbers.  <a href=\"a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2d61afc5b2e4132f72885d4a51f0081\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaab484fc37dddd84f767d84e38d761649\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaab484fc37dddd84f767d84e38d761649\">mediump_uvec3</a></td></tr>\n<tr class=\"memdesc:gaab484fc37dddd84f767d84e38d761649\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium qualifier unsigned integer numbers.  <a href=\"a00145.html#gaab484fc37dddd84f767d84e38d761649\">More...</a><br /></td></tr>\n<tr class=\"separator:gaab484fc37dddd84f767d84e38d761649\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9f64ab6e1618ba357966f18e3e4e6aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa\">mediump_uvec4</a></td></tr>\n<tr class=\"memdesc:gaa9f64ab6e1618ba357966f18e3e4e6aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium qualifier unsigned integer numbers.  <a href=\"a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9f64ab6e1618ba357966f18e3e4e6aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabc61976261c406520c7a8e4d946dc3f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">mediump_vec2</a></td></tr>\n<tr class=\"memdesc:gabc61976261c406520c7a8e4d946dc3f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium single-qualifier floating-point numbers.  <a href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">More...</a><br /></td></tr>\n<tr class=\"separator:gabc61976261c406520c7a8e4d946dc3f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2384e263df19f1404b733016eff78fca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">mediump_vec3</a></td></tr>\n<tr class=\"memdesc:ga2384e263df19f1404b733016eff78fca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium single-qualifier floating-point numbers.  <a href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2384e263df19f1404b733016eff78fca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5c6978d3ffba06738416a33083853fc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">mediump_vec4</a></td></tr>\n<tr class=\"memdesc:ga5c6978d3ffba06738416a33083853fc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium single-qualifier floating-point numbers.  <a href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5c6978d3ffba06738416a33083853fc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bcffa2d49f28d16f680757b5c0e7c84\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_uvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a></td></tr>\n<tr class=\"memdesc:ga9bcffa2d49f28d16f680757b5c0e7c84\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of unsigned integer numbers.  <a href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9bcffa2d49f28d16f680757b5c0e7c84\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae85537b672ffe0b3218cbdf1823e1c72\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_uvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">uvec3</a></td></tr>\n<tr class=\"memdesc:gae85537b672ffe0b3218cbdf1823e1c72\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of unsigned integer numbers.  <a href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">More...</a><br /></td></tr>\n<tr class=\"separator:gae85537b672ffe0b3218cbdf1823e1c72\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7c3a0e7ae50c34c3290415c115f251e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_uvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a></td></tr>\n<tr class=\"memdesc:gaa7c3a0e7ae50c34c3290415c115f251e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of unsigned integer numbers.  <a href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7c3a0e7ae50c34c3290415c115f251e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09d0200e8ff86391d8804b4fefd5f1da\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a></td></tr>\n<tr class=\"memdesc:ga09d0200e8ff86391d8804b4fefd5f1da\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of floating-point numbers.  <a href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">More...</a><br /></td></tr>\n<tr class=\"separator:ga09d0200e8ff86391d8804b4fefd5f1da\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa8ea2429bb3cb41a715258a447f39897\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a></td></tr>\n<tr class=\"memdesc:gaa8ea2429bb3cb41a715258a447f39897\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of floating-point numbers.  <a href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa8ea2429bb3cb41a715258a447f39897\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafbab23070ca47932487d25332adc7d7c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a></td></tr>\n<tr class=\"memdesc:gafbab23070ca47932487d25332adc7d7c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of floating-point numbers.  <a href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">More...</a><br /></td></tr>\n<tr class=\"separator:gafbab23070ca47932487d25332adc7d7c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00120_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00120.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00082.html\">qualifier.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00106.html\">type_int.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;compute_vector_relational.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;</div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a>{</div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"keyword\">namespace </span>detail</div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, std::<span class=\"keywordtype\">size_t</span> size, <span class=\"keywordtype\">bool</span> aligned&gt;</div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;        <span class=\"keyword\">struct </span>storage</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;                <span class=\"keyword\">typedef</span> <span class=\"keyword\">struct </span>type {</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;                        uint8 data[size];</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;                } type;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">        #define GLM_ALIGNED_STORAGE_TYPE_STRUCT(x) \\</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">                template&lt;typename T&gt; \\</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">                struct storage&lt;T, x, true&gt; { \\</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">                        GLM_ALIGNED_STRUCT(x) type { \\</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">                                uint8 data[x]; \\</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">                        }; \\</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">                };</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;        GLM_ALIGNED_STORAGE_TYPE_STRUCT(1)</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;        GLM_ALIGNED_STORAGE_TYPE_STRUCT(2)</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        GLM_ALIGNED_STORAGE_TYPE_STRUCT(4)</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;        GLM_ALIGNED_STORAGE_TYPE_STRUCT(8)</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        GLM_ALIGNED_STORAGE_TYPE_STRUCT(16)</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_ALIGNED_STORAGE_TYPE_STRUCT(32)</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_ALIGNED_STORAGE_TYPE_STRUCT(64)</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#       if GLM_ARCH &amp; GLM_ARCH_SSE2_BIT</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;                <span class=\"keyword\">struct </span>storage&lt;float, 16, true&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;                        <span class=\"keyword\">typedef</span> glm_vec4 type;</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                <span class=\"keyword\">struct </span>storage&lt;int, 16, true&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                        <span class=\"keyword\">typedef</span> glm_ivec4 type;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                <span class=\"keyword\">struct </span>storage&lt;unsigned int, 16, true&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                        <span class=\"keyword\">typedef</span> glm_uvec4 type;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"comment\">#       else</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"comment\">                typedef union __declspec(align(16)) glm_128</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;<span class=\"comment\">                {</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"comment\">                        unsigned __int8 data[16];</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"comment\">                } glm_128;</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;<span class=\"comment\">                template&lt;&gt;</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;<span class=\"comment\">                struct storage&lt;float, 16, true&gt;</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"comment\">                {</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"comment\">                        typedef glm_128 type;</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"comment\">                };</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"comment\">                template&lt;&gt;</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"comment\">                struct storage&lt;int, 16, true&gt;</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;<span class=\"comment\">                {</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;<span class=\"comment\">                        typedef glm_128 type;</span></div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;<span class=\"comment\">                };</span></div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"comment\"></span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;<span class=\"comment\">                template&lt;&gt;</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"comment\">                struct storage&lt;unsigned int, 16, true&gt;</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"comment\">                {</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;<span class=\"comment\">                        typedef glm_128 type;</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;<span class=\"comment\">                };</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;<span class=\"comment\">*/</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;<span class=\"preprocessor\">#       if (GLM_ARCH &amp; GLM_ARCH_AVX_BIT)</span></div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                <span class=\"keyword\">struct </span>storage&lt;double, 32, true&gt;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                        <span class=\"keyword\">typedef</span> glm_dvec4 type;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;<span class=\"preprocessor\">#       if (GLM_ARCH &amp; GLM_ARCH_AVX2_BIT)</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                <span class=\"keyword\">struct </span>storage&lt;int64, 32, true&gt;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                        <span class=\"keyword\">typedef</span> glm_i64vec4 type;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                <span class=\"keyword\">template</span>&lt;&gt;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;                <span class=\"keyword\">struct </span>storage&lt;uint64, 32, true&gt;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                {</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                        <span class=\"keyword\">typedef</span> glm_u64vec4 type;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                };</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;}<span class=\"comment\">//namespace detail</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;<span class=\"preprocessor\">#if GLM_HAS_TEMPLATE_ALIASES</span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tvec1 = vec&lt;1, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tvec2 = vec&lt;2, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tvec3 = vec&lt;3, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        <span class=\"keyword\">template</span> &lt;<span class=\"keyword\">typename</span> T, qualifier Q = defaultp&gt; <span class=\"keyword\">using</span> tvec4 = vec&lt;4, T, Q&gt;;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;<span class=\"preprocessor\">#endif//GLM_HAS_TEMPLATE_ALIASES</span></div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, highp&gt;    highp_vec1_t;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, mediump&gt;  mediump_vec1_t;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, float, lowp&gt;             lowp_vec1_t;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, highp&gt;   highp_dvec1_t;</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, mediump&gt; mediump_dvec1_t;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, double, lowp&gt;    lowp_dvec1_t;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, highp&gt;              highp_ivec1_t;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, mediump&gt;    mediump_ivec1_t;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, int, lowp&gt;               lowp_ivec1_t;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, highp&gt;             highp_uvec1_t;</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, mediump&gt;   mediump_uvec1_t;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, uint, lowp&gt;              lowp_uvec1_t;</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, highp&gt;             highp_bvec1_t;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, mediump&gt;   mediump_bvec1_t;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;1, bool, lowp&gt;              lowp_bvec1_t;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">  136</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, highp&gt;            <a class=\"code\" href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">highp_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">  143</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, mediump&gt;  <a class=\"code\" href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">mediump_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">  150</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, float, lowp&gt;             <a class=\"code\" href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">lowp_vec2</a>;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4\">  157</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, highp&gt;   <a class=\"code\" href=\"a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4\">highp_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga00b74cf6997deedd6a962e0997bc120b\">  164</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, mediump&gt; <a class=\"code\" href=\"a00145.html#ga00b74cf6997deedd6a962e0997bc120b\">mediump_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga8e7f034722aaa1895196f0381a1810f5\">  171</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, double, lowp&gt;            <a class=\"code\" href=\"a00145.html#ga8e7f034722aaa1895196f0381a1810f5\">lowp_dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga23594b732ebff0ff9630ddb2a3bad659\">  178</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, highp&gt;              <a class=\"code\" href=\"a00145.html#ga23594b732ebff0ff9630ddb2a3bad659\">highp_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaabd76afa066badf4489fd0fec28f9537\">  185</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, mediump&gt;            <a class=\"code\" href=\"a00145.html#gaabd76afa066badf4489fd0fec28f9537\">mediump_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga7ce7e678655c51239b95b2089e8f0e96\">  192</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, int, lowp&gt;               <a class=\"code\" href=\"a00145.html#ga7ce7e678655c51239b95b2089e8f0e96\">lowp_ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gab6d886704d5c7faf85b03e4a36290546\">  199</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, highp&gt;             <a class=\"code\" href=\"a00145.html#gab6d886704d5c7faf85b03e4a36290546\">highp_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081\">  206</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, mediump&gt;   <a class=\"code\" href=\"a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081\">mediump_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga3ab41df977e0b21c1c41a314b1011042\">  213</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, uint, lowp&gt;              <a class=\"code\" href=\"a00145.html#ga3ab41df977e0b21c1c41a314b1011042\">lowp_uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga5d7156af15f362d4007769784a38e148\">  220</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, highp&gt;             <a class=\"code\" href=\"a00145.html#ga5d7156af15f362d4007769784a38e148\">highp_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;</div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga6670d1a61e113c339aac7dd2ae72154b\">  227</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, mediump&gt;   <a class=\"code\" href=\"a00145.html#ga6670d1a61e113c339aac7dd2ae72154b\">mediump_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga39fbc2447d5846af799d075a29c6e46d\">  234</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;2, bool, lowp&gt;              <a class=\"code\" href=\"a00145.html#ga39fbc2447d5846af799d075a29c6e46d\">lowp_bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">  246</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, highp&gt;            <a class=\"code\" href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">highp_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">  253</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, mediump&gt;  <a class=\"code\" href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">mediump_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">  260</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, float, lowp&gt;             <a class=\"code\" href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">lowp_vec3</a>;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gab8a03109aebc121ef69abec50fcdd459\">  267</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, highp&gt;   <a class=\"code\" href=\"a00145.html#gab8a03109aebc121ef69abec50fcdd459\">highp_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a\">  274</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, mediump&gt; <a class=\"code\" href=\"a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a\">mediump_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga2b6374e88079410f8b641e21bf6b77a3\">  281</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, double, lowp&gt;            <a class=\"code\" href=\"a00145.html#ga2b6374e88079410f8b641e21bf6b77a3\">lowp_dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7\">  288</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, highp&gt;              <a class=\"code\" href=\"a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7\">highp_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaf964dcfcbb2088d13c9c321517171154\">  295</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, mediump&gt;            <a class=\"code\" href=\"a00145.html#gaf964dcfcbb2088d13c9c321517171154\">mediump_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0\">  302</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, int, lowp&gt;               <a class=\"code\" href=\"a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0\">lowp_ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;</div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e\">  309</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, highp&gt;             <a class=\"code\" href=\"a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e\">highp_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;</div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaab484fc37dddd84f767d84e38d761649\">  316</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, mediump&gt;   <a class=\"code\" href=\"a00145.html#gaab484fc37dddd84f767d84e38d761649\">mediump_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaacab3ed11290185c279a97edc9255b98\">  323</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, uint, lowp&gt;              <a class=\"code\" href=\"a00145.html#gaacab3ed11290185c279a97edc9255b98\">lowp_uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gae3625991931d1c556452a2c551748730\">  329</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, highp&gt;             <a class=\"code\" href=\"a00145.html#gae3625991931d1c556452a2c551748730\">highp_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005\">  335</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, mediump&gt;   <a class=\"code\" href=\"a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005\">mediump_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga916d4e72701db85b64815faf06050111\">  341</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;3, bool, lowp&gt;              <a class=\"code\" href=\"a00145.html#ga916d4e72701db85b64815faf06050111\">lowp_bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">  352</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, highp&gt;            <a class=\"code\" href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">highp_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">  358</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, mediump&gt;  <a class=\"code\" href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">mediump_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;</div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">  364</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, float, lowp&gt;             <a class=\"code\" href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">lowp_vec4</a>;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga9dfeaa53a616848ed067994a2bd18992\">  370</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, highp&gt;   <a class=\"code\" href=\"a00145.html#ga9dfeaa53a616848ed067994a2bd18992\">highp_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;</div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga072fdd19df303b9b821b6793b86c1637\">  376</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, mediump&gt; <a class=\"code\" href=\"a00145.html#ga072fdd19df303b9b821b6793b86c1637\">mediump_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gabcd63b91329c8213fdae89d0da6ece4c\">  382</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, double, lowp&gt;            <a class=\"code\" href=\"a00145.html#gabcd63b91329c8213fdae89d0da6ece4c\">lowp_dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;</div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518\">  388</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, highp&gt;              <a class=\"code\" href=\"a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518\">highp_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga7f89d11cd6e64c1814200f8cca083512\">  394</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, mediump&gt;            <a class=\"code\" href=\"a00145.html#ga7f89d11cd6e64c1814200f8cca083512\">mediump_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;</div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga693ad87d8ccd440f0c0423281defeccd\">  400</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, int, lowp&gt;               <a class=\"code\" href=\"a00145.html#ga693ad87d8ccd440f0c0423281defeccd\">lowp_ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga09b43516ea6fd2c617fc4bee2995316a\">  406</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, highp&gt;             <a class=\"code\" href=\"a00145.html#ga09b43516ea6fd2c617fc4bee2995316a\">highp_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;</div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa\">  412</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, mediump&gt;   <a class=\"code\" href=\"a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa\">mediump_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga4cdf061bac6ded19e940e876eab9b737\">  418</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, uint, lowp&gt;              <a class=\"code\" href=\"a00145.html#ga4cdf061bac6ded19e940e876eab9b737\">lowp_uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;</div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0\">  424</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, highp&gt;             <a class=\"code\" href=\"a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0\">highp_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga620d6dce077134eee76e014a3e2b2661\">  430</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, mediump&gt;   <a class=\"code\" href=\"a00145.html#ga620d6dce077134eee76e014a3e2b2661\">mediump_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;</div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6\">  436</a></span>&#160;        <span class=\"keyword\">typedef</span> vec&lt;4, bool, lowp&gt;              <a class=\"code\" href=\"a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6\">lowp_bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;</div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\">  439</span>&#160;</div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;</div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\">  443</span>&#160;        <span class=\"comment\">// -- Default float definition --</span></div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;</div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;        <span class=\"keyword\">typedef</span> lowp_vec2                       <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a>;</div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;        <span class=\"keyword\">typedef</span> lowp_vec3                       <a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a>;</div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;        <span class=\"keyword\">typedef</span> lowp_vec4                       <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a>;</div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;        <span class=\"keyword\">typedef</span> mediump_vec2            <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a>;</div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;        <span class=\"keyword\">typedef</span> mediump_vec3            <a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a>;</div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;        <span class=\"keyword\">typedef</span> mediump_vec4            <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a>;</div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_FLOAT)</span></div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;        <span class=\"keyword\">typedef</span> highp_vec2                      <a class=\"code\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a>;</div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;</div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">  462</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_vec3                      <a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a>;</div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;</div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">  467</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_vec4                      <a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a>;</div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;</div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;        <span class=\"comment\">// -- Default double definition --</span></div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\">  471</span>&#160;</div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dvec2                      <a class=\"code\" href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00474\"></a><span class=\"lineno\">  474</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dvec3                      <a class=\"code\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\">  475</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dvec4                      <a class=\"code\" href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00477\"></a><span class=\"lineno\">  477</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dvec2           <a class=\"code\" href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\">  478</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dvec3           <a class=\"code\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dvec4           <a class=\"code\" href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_DOUBLE)</span></div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;        <span class=\"keyword\">typedef</span> highp_dvec2                     <a class=\"code\" href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">dvec2</a>;</div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;</div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">  489</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dvec3                     <a class=\"code\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">dvec3</a>;</div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;</div>\n<div class=\"line\"><a name=\"l00494\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">  494</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_dvec4                     <a class=\"code\" href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">dvec4</a>;</div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;</div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\">  497</span>&#160;        <span class=\"comment\">// -- Signed integer definition --</span></div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;</div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00500\"></a><span class=\"lineno\">  500</span>&#160;        <span class=\"keyword\">typedef</span> lowp_ivec2                      <a class=\"code\" href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;        <span class=\"keyword\">typedef</span> lowp_ivec3                      <a class=\"code\" href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;        <span class=\"keyword\">typedef</span> lowp_ivec4                      <a class=\"code\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;        <span class=\"keyword\">typedef</span> mediump_ivec2           <a class=\"code\" href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;        <span class=\"keyword\">typedef</span> mediump_ivec3           <a class=\"code\" href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;        <span class=\"keyword\">typedef</span> mediump_ivec4           <a class=\"code\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00507\"></a><span class=\"lineno\">  507</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_INT)</span></div>\n<div class=\"line\"><a name=\"l00508\"></a><span class=\"lineno\">  508</span>&#160;        <span class=\"keyword\">typedef</span> highp_ivec2                     <a class=\"code\" href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">ivec2</a>;</div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;</div>\n<div class=\"line\"><a name=\"l00516\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">  516</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_ivec3                     <a class=\"code\" href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">ivec3</a>;</div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\">  517</span>&#160;</div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">  521</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_ivec4                     <a class=\"code\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a>;</div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\">  523</span>&#160;</div>\n<div class=\"line\"><a name=\"l00524\"></a><span class=\"lineno\">  524</span>&#160;        <span class=\"comment\">// -- Unsigned integer definition --</span></div>\n<div class=\"line\"><a name=\"l00525\"></a><span class=\"lineno\">  525</span>&#160;</div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;        <span class=\"keyword\">typedef</span> lowp_uvec2                      <a class=\"code\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00528\"></a><span class=\"lineno\">  528</span>&#160;        <span class=\"keyword\">typedef</span> lowp_uvec3                      <a class=\"code\" href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;        <span class=\"keyword\">typedef</span> lowp_uvec4                      <a class=\"code\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;        <span class=\"keyword\">typedef</span> mediump_uvec2           <a class=\"code\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;        <span class=\"keyword\">typedef</span> mediump_uvec3           <a class=\"code\" href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\">  533</span>&#160;        <span class=\"keyword\">typedef</span> mediump_uvec4           <a class=\"code\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_UINT)</span></div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;        <span class=\"keyword\">typedef</span> highp_uvec2                     <a class=\"code\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a>;</div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;</div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">  543</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_uvec3                     <a class=\"code\" href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">uvec3</a>;</div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;</div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">  548</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_uvec4                     <a class=\"code\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a>;</div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\">  549</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\">  550</span>&#160;</div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;        <span class=\"comment\">// -- Boolean definition --</span></div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;</div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_LOWP_BOOL))</span></div>\n<div class=\"line\"><a name=\"l00554\"></a><span class=\"lineno\">  554</span>&#160;        <span class=\"keyword\">typedef</span> lowp_bvec2                      <a class=\"code\" href=\"a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60\">bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00555\"></a><span class=\"lineno\">  555</span>&#160;        <span class=\"keyword\">typedef</span> lowp_bvec3                      <a class=\"code\" href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;        <span class=\"keyword\">typedef</span> lowp_bvec4                      <a class=\"code\" href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_BOOL))</span></div>\n<div class=\"line\"><a name=\"l00558\"></a><span class=\"lineno\">  558</span>&#160;        <span class=\"keyword\">typedef</span> mediump_bvec2           <a class=\"code\" href=\"a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60\">bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00559\"></a><span class=\"lineno\">  559</span>&#160;        <span class=\"keyword\">typedef</span> mediump_bvec3           <a class=\"code\" href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;        <span class=\"keyword\">typedef</span> mediump_bvec4           <a class=\"code\" href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;<span class=\"preprocessor\">#else //defined(GLM_PRECISION_HIGHP_BOOL)</span></div>\n<div class=\"line\"><a name=\"l00562\"></a><span class=\"lineno\">  562</span>&#160;        <span class=\"keyword\">typedef</span> highp_bvec2                     <a class=\"code\" href=\"a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60\">bvec2</a>;</div>\n<div class=\"line\"><a name=\"l00566\"></a><span class=\"lineno\">  566</span>&#160;</div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">  570</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_bvec3                     <a class=\"code\" href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">bvec3</a>;</div>\n<div class=\"line\"><a name=\"l00571\"></a><span class=\"lineno\">  571</span>&#160;</div>\n<div class=\"line\"><a name=\"l00575\"></a><span class=\"lineno\"><a class=\"line\" href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">  575</a></span>&#160;        <span class=\"keyword\">typedef</span> highp_bvec4                     <a class=\"code\" href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">bvec4</a>;</div>\n<div class=\"line\"><a name=\"l00576\"></a><span class=\"lineno\">  576</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;</div>\n<div class=\"line\"><a name=\"l00579\"></a><span class=\"lineno\">  579</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"ttc\" id=\"a00145_html_ga24acd3b02b156bf0d67eaf17917ec4b7\"><div class=\"ttname\"><a href=\"a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7\">glm::highp_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, highp &gt; highp_ivec3</div><div class=\"ttdoc\">3 components vector of high qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00288\">type_vec.hpp:288</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaaa26c41d168dc00be0fe55f4d0a34224\"><div class=\"ttname\"><a href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">glm::ivec4</a></div><div class=\"ttdeci\">highp_ivec4 ivec4</div><div class=\"ttdoc\">4 components vector of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00521\">type_vec.hpp:521</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gabcd63b91329c8213fdae89d0da6ece4c\"><div class=\"ttname\"><a href=\"a00145.html#gabcd63b91329c8213fdae89d0da6ece4c\">glm::lowp_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, lowp &gt; lowp_dvec4</div><div class=\"ttdoc\">4 components vector of low double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00382\">type_vec.hpp:382</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga5c6978d3ffba06738416a33083853fc0\"><div class=\"ttname\"><a href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">glm::mediump_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, mediump &gt; mediump_vec4</div><div class=\"ttdoc\">4 components vector of medium single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00358\">type_vec.hpp:358</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga693ad87d8ccd440f0c0423281defeccd\"><div class=\"ttname\"><a href=\"a00145.html#ga693ad87d8ccd440f0c0423281defeccd\">glm::lowp_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, lowp &gt; lowp_ivec4</div><div class=\"ttdoc\">4 components vector of low qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00400\">type_vec.hpp:400</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga34aee73784bcc247d426250540c1911c\"><div class=\"ttname\"><a href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">glm::ivec3</a></div><div class=\"ttdeci\">highp_ivec3 ivec3</div><div class=\"ttdoc\">3 components vector of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00516\">type_vec.hpp:516</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga444e8f61bfb3a6f037d019ac6933f8c6\"><div class=\"ttname\"><a href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">glm::bvec4</a></div><div class=\"ttdeci\">highp_bvec4 bvec4</div><div class=\"ttdoc\">4 components vector of boolean. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00575\">type_vec.hpp:575</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga2e9de03b1c11d11f18ee8da8627a28c6\"><div class=\"ttname\"><a href=\"a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6\">glm::lowp_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, lowp &gt; lowp_bvec4</div><div class=\"ttdoc\">4 components vector of low qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00436\">type_vec.hpp:436</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga7f89d11cd6e64c1814200f8cca083512\"><div class=\"ttname\"><a href=\"a00145.html#ga7f89d11cd6e64c1814200f8cca083512\">glm::mediump_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, mediump &gt; mediump_ivec4</div><div class=\"ttdoc\">4 components vector of medium qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00394\">type_vec.hpp:394</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gab6d886704d5c7faf85b03e4a36290546\"><div class=\"ttname\"><a href=\"a00145.html#gab6d886704d5c7faf85b03e4a36290546\">glm::highp_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, highp &gt; highp_uvec2</div><div class=\"ttdoc\">2 components vector of high qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00199\">type_vec.hpp:199</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaacab3ed11290185c279a97edc9255b98\"><div class=\"ttname\"><a href=\"a00145.html#gaacab3ed11290185c279a97edc9255b98\">glm::lowp_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, lowp &gt; lowp_uvec3</div><div class=\"ttdoc\">3 components vector of low qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00323\">type_vec.hpp:323</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga6f83c9b2aa706c9bc77587de13bf287e\"><div class=\"ttname\"><a href=\"a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e\">glm::highp_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, highp &gt; highp_uvec3</div><div class=\"ttdoc\">3 components vector of high qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00309\">type_vec.hpp:309</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga2b6374e88079410f8b641e21bf6b77a3\"><div class=\"ttname\"><a href=\"a00145.html#ga2b6374e88079410f8b641e21bf6b77a3\">glm::lowp_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, lowp &gt; lowp_dvec3</div><div class=\"ttdoc\">3 components vector of low double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00281\">type_vec.hpp:281</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga09d0200e8ff86391d8804b4fefd5f1da\"><div class=\"ttname\"><a href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">glm::vec2</a></div><div class=\"ttdeci\">highp_vec2 vec2</div><div class=\"ttdoc\">2 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00457\">type_vec.hpp:457</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga5d7156af15f362d4007769784a38e148\"><div class=\"ttname\"><a href=\"a00145.html#ga5d7156af15f362d4007769784a38e148\">glm::highp_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, highp &gt; highp_bvec2</div><div class=\"ttdoc\">2 components vector of high qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00220\">type_vec.hpp:220</a></div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaabc19c9cf2c0994f3ded6b98f9d37005\"><div class=\"ttname\"><a href=\"a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005\">glm::mediump_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, mediump &gt; mediump_bvec3</div><div class=\"ttdoc\">3 components vector of medium qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00335\">type_vec.hpp:335</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga08f6be9d594bfc3b488e3e8b02d45518\"><div class=\"ttname\"><a href=\"a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518\">glm::highp_ivec4</a></div><div class=\"ttdeci\">vec&lt; 4, int, highp &gt; highp_ivec4</div><div class=\"ttdoc\">4 components vector of high qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00388\">type_vec.hpp:388</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gad281decae52948b82feb3a9db8f63a7b\"><div class=\"ttname\"><a href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">glm::highp_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, highp &gt; highp_vec4</div><div class=\"ttdoc\">4 components vector of high single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00352\">type_vec.hpp:352</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaa0d2929c4809a6ff51ad616bf81e16e0\"><div class=\"ttname\"><a href=\"a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0\">glm::highp_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, highp &gt; highp_bvec4</div><div class=\"ttdoc\">4 components vector of high qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00424\">type_vec.hpp:424</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga59ae64e8103c0ccf7117bd3bee223ad0\"><div class=\"ttname\"><a href=\"a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0\">glm::lowp_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, lowp &gt; lowp_ivec3</div><div class=\"ttdoc\">3 components vector of low qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00302\">type_vec.hpp:302</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga3ab41df977e0b21c1c41a314b1011042\"><div class=\"ttname\"><a href=\"a00145.html#ga3ab41df977e0b21c1c41a314b1011042\">glm::lowp_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, lowp &gt; lowp_uvec2</div><div class=\"ttdoc\">2 components vector of low qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00213\">type_vec.hpp:213</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gabcad2ee624723d7add5ce5bf90b6bd2a\"><div class=\"ttname\"><a href=\"a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a\">glm::mediump_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, mediump &gt; mediump_dvec3</div><div class=\"ttdoc\">3 components vector of medium double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00274\">type_vec.hpp:274</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga8e7f034722aaa1895196f0381a1810f5\"><div class=\"ttname\"><a href=\"a00145.html#ga8e7f034722aaa1895196f0381a1810f5\">glm::lowp_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, lowp &gt; lowp_dvec2</div><div class=\"ttdoc\">2 components vector of low double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00171\">type_vec.hpp:171</a></div></div>\n<div class=\"ttc\" id=\"a00082_html\"><div class=\"ttname\"><a href=\"a00082.html\">qualifier.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga7ce7e678655c51239b95b2089e8f0e96\"><div class=\"ttname\"><a href=\"a00145.html#ga7ce7e678655c51239b95b2089e8f0e96\">glm::lowp_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, lowp &gt; lowp_ivec2</div><div class=\"ttdoc\">2 components vector of low qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00192\">type_vec.hpp:192</a></div></div>\n<div class=\"ttc\" id=\"a00106_html\"><div class=\"ttname\"><a href=\"a00106.html\">type_int.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga20f7155c9cdcafb74da02d0ef60629a4\"><div class=\"ttname\"><a href=\"a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4\">glm::highp_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, highp &gt; highp_dvec2</div><div class=\"ttdoc\">2 components vector of high double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00157\">type_vec.hpp:157</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga620d6dce077134eee76e014a3e2b2661\"><div class=\"ttname\"><a href=\"a00145.html#ga620d6dce077134eee76e014a3e2b2661\">glm::mediump_bvec4</a></div><div class=\"ttdeci\">vec&lt; 4, bool, mediump &gt; mediump_bvec4</div><div class=\"ttdoc\">4 components vector of medium qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00430\">type_vec.hpp:430</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gafbab23070ca47932487d25332adc7d7c\"><div class=\"ttname\"><a href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a></div><div class=\"ttdeci\">highp_vec4 vec4</div><div class=\"ttdoc\">4 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00467\">type_vec.hpp:467</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gab8a03109aebc121ef69abec50fcdd459\"><div class=\"ttname\"><a href=\"a00145.html#gab8a03109aebc121ef69abec50fcdd459\">glm::highp_dvec3</a></div><div class=\"ttdeci\">vec&lt; 3, double, highp &gt; highp_dvec3</div><div class=\"ttdoc\">3 components vector of high double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00267\">type_vec.hpp:267</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga6670d1a61e113c339aac7dd2ae72154b\"><div class=\"ttname\"><a href=\"a00145.html#ga6670d1a61e113c339aac7dd2ae72154b\">glm::mediump_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, mediump &gt; mediump_bvec2</div><div class=\"ttdoc\">2 components vector of medium qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00227\">type_vec.hpp:227</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga30e8baef5d56d5c166872a2bc00f36e9\"><div class=\"ttname\"><a href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">glm::lowp_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, lowp &gt; lowp_vec2</div><div class=\"ttdoc\">2 components vector of low single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00150\">type_vec.hpp:150</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga868e8e4470a3ef97c7ee3032bf90dc79\"><div class=\"ttname\"><a href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">glm::lowp_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, lowp &gt; lowp_vec3</div><div class=\"ttdoc\">3 components vector of low single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00260\">type_vec.hpp:260</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga39fbc2447d5846af799d075a29c6e46d\"><div class=\"ttname\"><a href=\"a00145.html#ga39fbc2447d5846af799d075a29c6e46d\">glm::lowp_bvec2</a></div><div class=\"ttdeci\">vec&lt; 2, bool, lowp &gt; lowp_bvec2</div><div class=\"ttdoc\">2 components vector of low qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00234\">type_vec.hpp:234</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gabebd0c7e3c5cd337d95c313c5e8b8db4\"><div class=\"ttname\"><a href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">glm::dvec3</a></div><div class=\"ttdeci\">highp_dvec3 dvec3</div><div class=\"ttdoc\">3 components vector of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00489\">type_vec.hpp:489</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga9dfeaa53a616848ed067994a2bd18992\"><div class=\"ttname\"><a href=\"a00145.html#ga9dfeaa53a616848ed067994a2bd18992\">glm::highp_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, highp &gt; highp_dvec4</div><div class=\"ttdoc\">4 components vector of high double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00370\">type_vec.hpp:370</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga00b74cf6997deedd6a962e0997bc120b\"><div class=\"ttname\"><a href=\"a00145.html#ga00b74cf6997deedd6a962e0997bc120b\">glm::mediump_dvec2</a></div><div class=\"ttdeci\">vec&lt; 2, double, mediump &gt; mediump_dvec2</div><div class=\"ttdoc\">2 components vector of medium double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00164\">type_vec.hpp:164</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaf964dcfcbb2088d13c9c321517171154\"><div class=\"ttname\"><a href=\"a00145.html#gaf964dcfcbb2088d13c9c321517171154\">glm::mediump_ivec3</a></div><div class=\"ttdeci\">vec&lt; 3, int, mediump &gt; mediump_ivec3</div><div class=\"ttdoc\">3 components vector of medium qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00295\">type_vec.hpp:295</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaca61dfaccbf2f58f2d8063a4e76b44a9\"><div class=\"ttname\"><a href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">glm::highp_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, highp &gt; highp_vec3</div><div class=\"ttdoc\">3 components vector of high single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00246\">type_vec.hpp:246</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga09b43516ea6fd2c617fc4bee2995316a\"><div class=\"ttname\"><a href=\"a00145.html#ga09b43516ea6fd2c617fc4bee2995316a\">glm::highp_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, highp &gt; highp_uvec4</div><div class=\"ttdoc\">4 components vector of high qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00406\">type_vec.hpp:406</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gae85537b672ffe0b3218cbdf1823e1c72\"><div class=\"ttname\"><a href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">glm::uvec3</a></div><div class=\"ttdeci\">highp_uvec3 uvec3</div><div class=\"ttdoc\">3 components vector of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00543\">type_vec.hpp:543</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gabc61976261c406520c7a8e4d946dc3f0\"><div class=\"ttname\"><a href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">glm::mediump_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, mediump &gt; mediump_vec2</div><div class=\"ttdoc\">2 components vector of medium single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00143\">type_vec.hpp:143</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaa8ea2429bb3cb41a715258a447f39897\"><div class=\"ttname\"><a href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">glm::vec3</a></div><div class=\"ttdeci\">highp_vec3 vec3</div><div class=\"ttdoc\">3 components vector of floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00462\">type_vec.hpp:462</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga15ade901680b29b78c1f9d1796db6e0e\"><div class=\"ttname\"><a href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">glm::dvec2</a></div><div class=\"ttdeci\">highp_dvec2 dvec2</div><div class=\"ttdoc\">2 components vector of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00484\">type_vec.hpp:484</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gace3acb313c800552a9411953eb8b2ed7\"><div class=\"ttname\"><a href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">glm::lowp_vec4</a></div><div class=\"ttdeci\">vec&lt; 4, float, lowp &gt; lowp_vec4</div><div class=\"ttdoc\">4 components vector of low single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00364\">type_vec.hpp:364</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga0e46aaaccc5e713eac5bfbc8d6885a60\"><div class=\"ttname\"><a href=\"a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60\">glm::bvec2</a></div><div class=\"ttdeci\">highp_bvec2 bvec2</div><div class=\"ttdoc\">2 components vector of boolean. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00565\">type_vec.hpp:565</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga2384e263df19f1404b733016eff78fca\"><div class=\"ttname\"><a href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">glm::mediump_vec3</a></div><div class=\"ttdeci\">vec&lt; 3, float, mediump &gt; mediump_vec3</div><div class=\"ttdoc\">3 components vector of medium single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00253\">type_vec.hpp:253</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaabd76afa066badf4489fd0fec28f9537\"><div class=\"ttname\"><a href=\"a00145.html#gaabd76afa066badf4489fd0fec28f9537\">glm::mediump_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, mediump &gt; mediump_ivec2</div><div class=\"ttdoc\">2 components vector of medium qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00185\">type_vec.hpp:185</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_gaa7c3a0e7ae50c34c3290415c115f251e\"><div class=\"ttname\"><a href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">glm::uvec4</a></div><div class=\"ttdeci\">highp_uvec4 uvec4</div><div class=\"ttdoc\">4 components vector of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00548\">type_vec.hpp:548</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga072fdd19df303b9b821b6793b86c1637\"><div class=\"ttname\"><a href=\"a00145.html#ga072fdd19df303b9b821b6793b86c1637\">glm::mediump_dvec4</a></div><div class=\"ttdeci\">vec&lt; 4, double, mediump &gt; mediump_dvec4</div><div class=\"ttdoc\">4 components vector of medium double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00376\">type_vec.hpp:376</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga9bcffa2d49f28d16f680757b5c0e7c84\"><div class=\"ttname\"><a href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">glm::uvec2</a></div><div class=\"ttdeci\">highp_uvec2 uvec2</div><div class=\"ttdoc\">2 components vector of unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00538\">type_vec.hpp:538</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaab484fc37dddd84f767d84e38d761649\"><div class=\"ttname\"><a href=\"a00145.html#gaab484fc37dddd84f767d84e38d761649\">glm::mediump_uvec3</a></div><div class=\"ttdeci\">vec&lt; 3, uint, mediump &gt; mediump_uvec3</div><div class=\"ttdoc\">3 components vector of medium qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00316\">type_vec.hpp:316</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gae3625991931d1c556452a2c551748730\"><div class=\"ttname\"><a href=\"a00145.html#gae3625991931d1c556452a2c551748730\">glm::highp_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, highp &gt; highp_bvec3</div><div class=\"ttdoc\">3 components vector of high qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00329\">type_vec.hpp:329</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga9503f809789bda7e8852a6abde3ae5c1\"><div class=\"ttname\"><a href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">glm::dvec4</a></div><div class=\"ttdeci\">highp_dvec4 dvec4</div><div class=\"ttdoc\">4 components vector of double-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00494\">type_vec.hpp:494</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga4cdf061bac6ded19e940e876eab9b737\"><div class=\"ttname\"><a href=\"a00145.html#ga4cdf061bac6ded19e940e876eab9b737\">glm::lowp_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, lowp &gt; lowp_uvec4</div><div class=\"ttdoc\">4 components vector of low qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00418\">type_vec.hpp:418</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga916d4e72701db85b64815faf06050111\"><div class=\"ttname\"><a href=\"a00145.html#ga916d4e72701db85b64815faf06050111\">glm::lowp_bvec3</a></div><div class=\"ttdeci\">vec&lt; 3, bool, lowp &gt; lowp_bvec3</div><div class=\"ttdoc\">3 components vector of low qualifier bool numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00341\">type_vec.hpp:341</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaa92c1954d71b1e7914874bd787b43d1c\"><div class=\"ttname\"><a href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">glm::highp_vec2</a></div><div class=\"ttdeci\">vec&lt; 2, float, highp &gt; highp_vec2</div><div class=\"ttdoc\">2 components vector of high single-qualifier floating-point numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00136\">type_vec.hpp:136</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaa9f64ab6e1618ba357966f18e3e4e6aa\"><div class=\"ttname\"><a href=\"a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa\">glm::mediump_uvec4</a></div><div class=\"ttdeci\">vec&lt; 4, uint, mediump &gt; mediump_uvec4</div><div class=\"ttdoc\">4 components vector of medium qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00412\">type_vec.hpp:412</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga150731e2a148eff8752114a0e450505e\"><div class=\"ttname\"><a href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">glm::bvec3</a></div><div class=\"ttdeci\">highp_bvec3 bvec3</div><div class=\"ttdoc\">3 components vector of boolean. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00570\">type_vec.hpp:570</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_ga23594b732ebff0ff9630ddb2a3bad659\"><div class=\"ttname\"><a href=\"a00145.html#ga23594b732ebff0ff9630ddb2a3bad659\">glm::highp_ivec2</a></div><div class=\"ttdeci\">vec&lt; 2, int, highp &gt; highp_ivec2</div><div class=\"ttdoc\">2 components vector of high qualifier signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00178\">type_vec.hpp:178</a></div></div>\n<div class=\"ttc\" id=\"a00145_html_gaf2d61afc5b2e4132f72885d4a51f0081\"><div class=\"ttname\"><a href=\"a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081\">glm::mediump_uvec2</a></div><div class=\"ttdeci\">vec&lt; 2, uint, mediump &gt; mediump_uvec2</div><div class=\"ttdoc\">2 components vector of medium qualifier unsigned integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00206\">type_vec.hpp:206</a></div></div>\n<div class=\"ttc\" id=\"a00144_html_ga2ab812bd103527e2d6c62c2e2f5ee78f\"><div class=\"ttname\"><a href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">glm::ivec2</a></div><div class=\"ttdeci\">highp_ivec2 ivec2</div><div class=\"ttdoc\">2 components vector of signed integer numbers. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00120_source.html#l00511\">type_vec.hpp:511</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00121.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec1.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec1.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00121_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00121_source.html\">type_vec1.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00121_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec1.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec1.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00121.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;../fwd.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00120.html\">type_vec.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#       if GLM_HAS_UNRESTRICTED_UNIONS</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#               include &quot;<a class=\"code\" href=\"a00004.html\">_swizzle.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#               include &quot;<a class=\"code\" href=\"a00005.html\">_swizzle_func.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#endif //GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;        <span class=\"keyword\">struct </span>vec&lt;1, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;                <span class=\"comment\">// -- Implementation detail --</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                <span class=\"keyword\">typedef</span> vec type;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;1, bool, Q&gt; bool_type;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;                <span class=\"comment\">// -- Data --</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_ONLY_XYZW</span></div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;                        T x;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#               elif GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic ignored &quot;-Wpedantic&quot;</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wgnu-anonymous-struct&quot;</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wnested-anon-types&quot;</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                        <span class=\"keyword\">union</span></div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                                T x;</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                                T r;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;                                T s;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;<span class=\"comment\">#                               if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, x)</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, r)</span></div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, s)</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, x)</span></div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, r)</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, s)</span></div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, x)</span></div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, r)</span></div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"comment\">                                        _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, s)</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;<span class=\"comment\">#                               endif//GLM_SWIZZLE*/</span></div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                        <span class=\"keyword\">union </span>{T x, r, s;};</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;<span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;<span class=\"comment\">#                       if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"comment\">                                GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, P, tvec2, tvec2, tvec3, tvec4)</span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;<span class=\"comment\">#                       endif//GLM_SWIZZLE*/</span></div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                <span class=\"comment\">// -- Component accesses --</span></div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>(){<span class=\"keywordflow\">return</span> 1;}</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;                GLM_FUNC_DECL T &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_DECL T <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;                <span class=\"comment\">// -- Implicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;1, T, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                <span class=\"comment\">// -- Explicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                <span class=\"comment\">// -- Conversion vector constructors --</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;2, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;3, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;4, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;1, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                <span class=\"comment\">// -- Swizzle constructors --</span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;<span class=\"comment\">/*</span></div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;<span class=\"comment\">#               if(GLM_HAS_UNRESTRICTED_UNIONS &amp;&amp; (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;<span class=\"comment\">                        template&lt;int E0&gt;</span></div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;<span class=\"comment\">                        GLM_FUNC_DECL tvec(detail::_swizzle&lt;1, T, Q, tvec1, E0, -1,-2,-3&gt; const&amp; that)</span></div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;<span class=\"comment\">                        {</span></div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;<span class=\"comment\">                                *this = that();</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;<span class=\"comment\">                        }</span></div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;<span class=\"comment\">#               endif//(GLM_HAS_UNRESTRICTED_UNIONS &amp;&amp; (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))</span></div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;<span class=\"comment\">*/</span></div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                GLM_FUNC_DECL vec &amp; operator=(vec const&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                GLM_FUNC_DECL vec &amp; operator=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;                GLM_FUNC_DECL vec &amp; operator+=(U scalar);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;                GLM_FUNC_DECL vec &amp; operator+=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                GLM_FUNC_DECL vec &amp; operator-=(U scalar);</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;                GLM_FUNC_DECL vec &amp; operator-=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;                GLM_FUNC_DECL vec &amp; operator*=(U scalar);</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                GLM_FUNC_DECL vec &amp; operator*=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;                GLM_FUNC_DECL vec &amp; operator/=(U scalar);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                GLM_FUNC_DECL vec &amp; operator/=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;                GLM_FUNC_DECL vec &amp; operator++();</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;                GLM_FUNC_DECL vec &amp; operator--();</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;                GLM_FUNC_DECL vec operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;                GLM_FUNC_DECL vec operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;                <span class=\"comment\">// -- Unary bit operators --</span></div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                GLM_FUNC_DECL vec &amp; operator%=(U scalar);</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                GLM_FUNC_DECL vec &amp; operator%=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;                GLM_FUNC_DECL vec &amp; operator&amp;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;                GLM_FUNC_DECL vec &amp; operator&amp;=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;                GLM_FUNC_DECL vec &amp; operator|=(U scalar);</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;                GLM_FUNC_DECL vec &amp; operator|=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;                GLM_FUNC_DECL vec &amp; operator^=(U scalar);</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;                GLM_FUNC_DECL vec &amp; operator^=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                GLM_FUNC_DECL vec &amp; operator&lt;&lt;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                GLM_FUNC_DECL vec &amp; operator&lt;&lt;=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;                GLM_FUNC_DECL vec &amp; operator&gt;&gt;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;                template&lt;typename U&gt;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;                GLM_FUNC_DECL vec &amp; operator&gt;&gt;=(vec&lt;1, U, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator+(vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator-(vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator+(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator+(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator+(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator-(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator-(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator-(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator*(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator*(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator*(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator/(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;</div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator/(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator/(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;</div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator%(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator%(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;</div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator%(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&amp;(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&amp;(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&amp;(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator|(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator|(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator|(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;</div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator^(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator^(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator^(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&lt;&lt;(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;</div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&lt;&lt;(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&lt;&lt;(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&gt;&gt;(vec&lt;1, T, Q&gt; const&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&gt;&gt;(T scalar, vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;</div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator&gt;&gt;(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;        GLM_FUNC_DECL vec&lt;1, T, Q&gt; operator~(vec&lt;1, T, Q&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;</div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;</div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;        template&lt;typename T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(vec&lt;1, T, Q&gt; const&amp; v1, vec&lt;1, T, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;</div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;        template&lt;qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;        GLM_FUNC_DECL vec&lt;1, <span class=\"keywordtype\">bool</span>, Q&gt; operator&amp;&amp;(vec&lt;1, <span class=\"keywordtype\">bool</span>, Q&gt; const&amp; v1, vec&lt;1, <span class=\"keywordtype\">bool</span>, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;        template&lt;qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;        GLM_FUNC_DECL vec&lt;1, <span class=\"keywordtype\">bool</span>, Q&gt; operator||(vec&lt;1, <span class=\"keywordtype\">bool</span>, Q&gt; const&amp; v1, vec&lt;1, <span class=\"keywordtype\">bool</span>, Q&gt; const&amp; v2);</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;<span class=\"preprocessor\">#include &quot;type_vec1.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;<span class=\"preprocessor\">#endif//GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00005_html\"><div class=\"ttname\"><a href=\"a00005.html\">_swizzle_func.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00120_html\"><div class=\"ttname\"><a href=\"a00120.html\">type_vec.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00004_html\"><div class=\"ttname\"><a href=\"a00004.html\">_swizzle.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00122.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00122_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00122_source.html\">type_vec2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00122_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00122.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00120.html\">type_vec.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#       if GLM_HAS_UNRESTRICTED_UNIONS</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#               include &quot;<a class=\"code\" href=\"a00004.html\">_swizzle.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#               include &quot;<a class=\"code\" href=\"a00005.html\">_swizzle_func.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#endif //GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        <span class=\"keyword\">struct </span>vec&lt;2, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"comment\">// -- Implementation detail --</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                <span class=\"keyword\">typedef</span> vec type;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;2, bool, Q&gt; bool_type;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                <span class=\"comment\">// -- Data --</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_ONLY_XYZW</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                        T x, y;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#               elif GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic ignored &quot;-Wpedantic&quot;</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wgnu-anonymous-struct&quot;</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wnested-anon-types&quot;</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                        <span class=\"keyword\">union</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                                <span class=\"keyword\">struct</span>{ T x, y; };</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                                <span class=\"keyword\">struct</span>{ T r, g; };</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                                <span class=\"keyword\">struct</span>{ T s, t; };</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#                               if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                                        GLM_SWIZZLE2_2_MEMBERS(T, Q, x, y)</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                                        GLM_SWIZZLE2_2_MEMBERS(T, Q, r, g)</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                                        GLM_SWIZZLE2_2_MEMBERS(T, Q, s, t)</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                                        GLM_SWIZZLE2_3_MEMBERS(T, Q, x, y)</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                                        GLM_SWIZZLE2_3_MEMBERS(T, Q, r, g)</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                                        GLM_SWIZZLE2_3_MEMBERS(T, Q, s, t)</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                                        GLM_SWIZZLE2_4_MEMBERS(T, Q, x, y)</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                                        GLM_SWIZZLE2_4_MEMBERS(T, Q, r, g)</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                                        GLM_SWIZZLE2_4_MEMBERS(T, Q, s, t)</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"preprocessor\">#                               endif//GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                        <span class=\"keyword\">union </span>{T x, r, s;};</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                        <span class=\"keyword\">union </span>{T y, g, t;};</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"preprocessor\">#                       if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                                GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P)</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"preprocessor\">#                       endif//GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                <span class=\"comment\">// -- Component accesses --</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>(){<span class=\"keywordflow\">return</span> 2;}</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_DECL T&amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL T <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                <span class=\"comment\">// -- Implicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;2, T, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                <span class=\"comment\">// -- Explicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(T x, T y);</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                <span class=\"comment\">// -- Conversion constructors --</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                template&lt;typename A, typename B&gt;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A x, B y);</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                template&lt;typename A, typename B&gt;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;1, A, Q&gt; const&amp; x, vec&lt;1, B, Q&gt; const&amp; y);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                <span class=\"comment\">// -- Conversion vector constructors --</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;3, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;4, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;2, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                <span class=\"comment\">// -- Swizzle constructors --</span></div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_UNRESTRICTED_UNIONS &amp;&amp; (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)</span></div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;                        GLM_FUNC_DECL vec(detail::_swizzle&lt;2, T, Q, E0, E1,-1,-2&gt; <span class=\"keyword\">const</span>&amp; that)</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                                *<span class=\"keyword\">this</span> = that();</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;<span class=\"preprocessor\">#               endif// GLM_HAS_UNRESTRICTED_UNIONS &amp;&amp; (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)</span></div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                GLM_FUNC_DECL vec&amp; operator=(vec <span class=\"keyword\">const</span>&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                GLM_FUNC_DECL vec&amp; operator=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;                GLM_FUNC_DECL vec&amp; operator+=(U scalar);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;                GLM_FUNC_DECL vec&amp; operator+=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                GLM_FUNC_DECL vec&amp; operator+=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;                GLM_FUNC_DECL vec&amp; operator-=(U scalar);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                GLM_FUNC_DECL vec&amp; operator-=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;                GLM_FUNC_DECL vec&amp; operator-=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;                GLM_FUNC_DECL vec&amp; operator*=(U scalar);</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;                GLM_FUNC_DECL vec&amp; operator*=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;                GLM_FUNC_DECL vec&amp; operator*=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;                GLM_FUNC_DECL vec&amp; operator/=(U scalar);</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                GLM_FUNC_DECL vec&amp; operator/=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                GLM_FUNC_DECL vec&amp; operator/=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;                GLM_FUNC_DECL vec &amp; operator++();</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;                GLM_FUNC_DECL vec &amp; operator--();</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;                GLM_FUNC_DECL vec operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;                GLM_FUNC_DECL vec operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;                <span class=\"comment\">// -- Unary bit operators --</span></div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;                GLM_FUNC_DECL vec &amp; operator%=(U scalar);</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                GLM_FUNC_DECL vec &amp; operator%=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                GLM_FUNC_DECL vec &amp; operator%=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;                GLM_FUNC_DECL vec &amp; operator&amp;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;                GLM_FUNC_DECL vec &amp; operator&amp;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;                GLM_FUNC_DECL vec &amp; operator&amp;=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;                GLM_FUNC_DECL vec &amp; operator|=(U scalar);</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;                GLM_FUNC_DECL vec &amp; operator|=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;                GLM_FUNC_DECL vec &amp; operator|=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;                GLM_FUNC_DECL vec &amp; operator^=(U scalar);</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;                GLM_FUNC_DECL vec &amp; operator^=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;                GLM_FUNC_DECL vec &amp; operator^=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;                GLM_FUNC_DECL vec &amp; operator&lt;&lt;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;                GLM_FUNC_DECL vec &amp; operator&lt;&lt;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;                GLM_FUNC_DECL vec &amp; operator&lt;&lt;=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;                GLM_FUNC_DECL vec &amp; operator&gt;&gt;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;                GLM_FUNC_DECL vec &amp; operator&gt;&gt;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt; </div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;                GLM_FUNC_DECL vec &amp; operator&gt;&gt;=(vec&lt;2, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator+(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator-(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator+(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator+(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator+(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator+(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator+(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator-(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator-(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator-(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator-(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator-(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator*(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator*(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator*(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator*(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;</div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator*(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator/(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator/(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator/(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator/(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator/(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator%(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator%(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;</div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator%(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;</div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator%(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator%(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;</div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&amp;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&amp;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&amp;(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;</div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&amp;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&amp;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;</div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator|(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;</div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator|(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;</div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator|(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;</div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator|(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;</div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator|(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator^(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;</div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator^(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;</div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator^(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator^(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;</div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator^(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&lt;&lt;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&lt;&lt;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;</div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&lt;&lt;(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;</div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&lt;&lt;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&lt;&lt;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&gt;&gt;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;</div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&gt;&gt;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&gt;&gt;(T scalar, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&gt;&gt;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;</div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator&gt;&gt;(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;</div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;        GLM_FUNC_DECL vec&lt;2, T, Q&gt; operator~(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;</div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;        <span class=\"keyword\">template</span>&lt;qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;        GLM_FUNC_DECL vec&lt;2, bool, Q&gt; operator&amp;&amp;(vec&lt;2, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;        <span class=\"keyword\">template</span>&lt;qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;        GLM_FUNC_DECL vec&lt;2, bool, Q&gt; operator||(vec&lt;2, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;2, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;</div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;<span class=\"preprocessor\">#include &quot;type_vec2.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;<span class=\"preprocessor\">#endif//GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00005_html\"><div class=\"ttname\"><a href=\"a00005.html\">_swizzle_func.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00120_html\"><div class=\"ttname\"><a href=\"a00120.html\">type_vec.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00004_html\"><div class=\"ttname\"><a href=\"a00004.html\">_swizzle.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00123.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec3.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec3.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00123_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00123_source.html\">type_vec3.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00123_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec3.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec3.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00123.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00120.html\">type_vec.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#       if GLM_HAS_UNRESTRICTED_UNIONS</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#               include &quot;<a class=\"code\" href=\"a00004.html\">_swizzle.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#               include &quot;<a class=\"code\" href=\"a00005.html\">_swizzle_func.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#endif //GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        <span class=\"keyword\">struct </span>vec&lt;3, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"comment\">// -- Implementation detail --</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                <span class=\"keyword\">typedef</span> vec type;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;3, bool, Q&gt; bool_type;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                <span class=\"comment\">// -- Data --</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_ONLY_XYZW</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                        T x, y, z;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#               elif GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic ignored &quot;-Wpedantic&quot;</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wgnu-anonymous-struct&quot;</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wnested-anon-types&quot;</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                        <span class=\"keyword\">union</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                                <span class=\"keyword\">struct</span>{ T x, y, z; };</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                                <span class=\"keyword\">struct</span>{ T r, g, b; };</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                                <span class=\"keyword\">struct</span>{ T s, t, p; };</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;<span class=\"preprocessor\">#                               if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;                                        GLM_SWIZZLE3_2_MEMBERS(T, Q, x, y, z)</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                                        GLM_SWIZZLE3_2_MEMBERS(T, Q, r, g, b)</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                                        GLM_SWIZZLE3_2_MEMBERS(T, Q, s, t, p)</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                                        GLM_SWIZZLE3_3_MEMBERS(T, Q, x, y, z)</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                                        GLM_SWIZZLE3_3_MEMBERS(T, Q, r, g, b)</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                                        GLM_SWIZZLE3_3_MEMBERS(T, Q, s, t, p)</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                                        GLM_SWIZZLE3_4_MEMBERS(T, Q, x, y, z)</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                                        GLM_SWIZZLE3_4_MEMBERS(T, Q, r, g, b)</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                                        GLM_SWIZZLE3_4_MEMBERS(T, Q, s, t, p)</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;<span class=\"preprocessor\">#                               endif//GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;                        <span class=\"keyword\">union </span>{ T x, r, s; };</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;                        <span class=\"keyword\">union </span>{ T y, g, t; };</div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                        <span class=\"keyword\">union </span>{ T z, b, p; };</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;<span class=\"preprocessor\">#                       if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                                GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P)</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;<span class=\"preprocessor\">#                       endif//GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\">#               endif//GLM_LANG</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;                <span class=\"comment\">// -- Component accesses --</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>(){<span class=\"keywordflow\">return</span> 3;}</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                GLM_FUNC_DECL T &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL T <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                <span class=\"comment\">// -- Implicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;3, T, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                <span class=\"comment\">// -- Explicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(T a, T b, T c);</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                <span class=\"comment\">// -- Conversion scalar constructors --</span></div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                template&lt;typename X, typename Y, typename Z&gt;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(X x, Y y, Z z);</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;                template&lt;typename X, typename Y, typename Z&gt;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;1, X, Q&gt; const&amp; _x, vec&lt;1, Y, Q&gt; const&amp; _y, vec&lt;1, Z, Q&gt; const&amp; _z);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                <span class=\"comment\">// -- Conversion vector constructors --</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;2, A, P&gt; const&amp; _xy, B _z);</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;2, A, P&gt; const&amp; _xy, vec&lt;1, B, P&gt; const&amp; _z);</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec&lt;2, B, P&gt; const&amp; _yz);</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;1, A, P&gt; const&amp; _x, vec&lt;2, B, P&gt; const&amp; _yz);</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;4, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;3, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                <span class=\"comment\">// -- Swizzle constructors --</span></div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_UNRESTRICTED_UNIONS &amp;&amp; (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)</span></div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2&gt;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;                        GLM_FUNC_DECL vec(detail::_swizzle&lt;3, T, Q, E0, E1, E2, -1&gt; <span class=\"keyword\">const</span>&amp; that)</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                                *<span class=\"keyword\">this</span> = that();</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;                        GLM_FUNC_DECL vec(detail::_swizzle&lt;2, T, Q, E0, E1, -1, -2&gt; <span class=\"keyword\">const</span>&amp; v, T <span class=\"keyword\">const</span>&amp; scalar)</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                                *<span class=\"keyword\">this</span> = vec(v(), scalar);</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1&gt;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                        GLM_FUNC_DECL vec(T <span class=\"keyword\">const</span>&amp; scalar, detail::_swizzle&lt;2, T, Q, E0, E1, -1, -2&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;                                *<span class=\"keyword\">this</span> = vec(scalar, v());</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;<span class=\"preprocessor\">#               endif// GLM_HAS_UNRESTRICTED_UNIONS &amp;&amp; (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)</span></div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;                GLM_FUNC_DECL vec &amp; operator=(vec <span class=\"keyword\">const</span>&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;                GLM_FUNC_DECL vec &amp; operator=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;                GLM_FUNC_DECL vec &amp; operator+=(U scalar);</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;                GLM_FUNC_DECL vec &amp; operator+=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;                GLM_FUNC_DECL vec &amp; operator+=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;                GLM_FUNC_DECL vec &amp; operator-=(U scalar);</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;                GLM_FUNC_DECL vec &amp; operator-=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;                GLM_FUNC_DECL vec &amp; operator-=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;                GLM_FUNC_DECL vec &amp; operator*=(U scalar);</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;                GLM_FUNC_DECL vec &amp; operator*=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                GLM_FUNC_DECL vec &amp; operator*=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;                GLM_FUNC_DECL vec &amp; operator/=(U scalar);</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;                GLM_FUNC_DECL vec &amp; operator/=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;                GLM_FUNC_DECL vec &amp; operator/=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;                GLM_FUNC_DECL vec &amp; operator++();</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;                GLM_FUNC_DECL vec &amp; operator--();</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;                GLM_FUNC_DECL vec operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;                GLM_FUNC_DECL vec operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;                <span class=\"comment\">// -- Unary bit operators --</span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;                GLM_FUNC_DECL vec &amp; operator%=(U scalar);</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;                GLM_FUNC_DECL vec &amp; operator%=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;                GLM_FUNC_DECL vec &amp; operator%=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;                GLM_FUNC_DECL vec &amp; operator&amp;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;                GLM_FUNC_DECL vec &amp; operator&amp;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                GLM_FUNC_DECL vec &amp; operator&amp;=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;                GLM_FUNC_DECL vec &amp; operator|=(U scalar);</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;                GLM_FUNC_DECL vec &amp; operator|=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;                GLM_FUNC_DECL vec &amp; operator|=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;                GLM_FUNC_DECL vec &amp; operator^=(U scalar);</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;                GLM_FUNC_DECL vec &amp; operator^=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;                GLM_FUNC_DECL vec &amp; operator^=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;                GLM_FUNC_DECL vec &amp; operator&lt;&lt;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;                GLM_FUNC_DECL vec &amp; operator&lt;&lt;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;                GLM_FUNC_DECL vec &amp; operator&lt;&lt;=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;                GLM_FUNC_DECL vec &amp; operator&gt;&gt;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;                GLM_FUNC_DECL vec &amp; operator&gt;&gt;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;                GLM_FUNC_DECL vec &amp; operator&gt;&gt;=(vec&lt;3, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator+(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;</div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator-(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator+(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator+(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar);</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator+(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator+(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator+(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator-(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator-(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;</div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator-(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator-(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator-(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator*(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;</div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator/(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;</div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator/(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator/(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;</div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator/(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator/(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator%(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;</div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator%(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator%(T <span class=\"keyword\">const</span>&amp; scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;</div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator%(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;</div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator%(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;</div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&amp;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, T scalar);</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;</div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&amp;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;</div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&amp;(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&amp;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;</div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&amp;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;</div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator|(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator|(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;</div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator|(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator|(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator|(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;</div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator^(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;</div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator^(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator^(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator^(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;</div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator^(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&lt;&lt;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&lt;&lt;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;</div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&lt;&lt;(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;</div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&lt;&lt;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&lt;&lt;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;</div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&gt;&gt;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;</div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&gt;&gt;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&gt;&gt;(T scalar, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&gt;&gt;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;</div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator&gt;&gt;(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;</div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt; </div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;        GLM_FUNC_DECL vec&lt;3, T, Q&gt; operator~(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;</div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;</div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;</div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;</div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;        <span class=\"keyword\">template</span>&lt;qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;        GLM_FUNC_DECL vec&lt;3, bool, Q&gt; operator&amp;&amp;(vec&lt;3, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;        <span class=\"keyword\">template</span>&lt;qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;        GLM_FUNC_DECL vec&lt;3, bool, Q&gt; operator||(vec&lt;3, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;3, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;<span class=\"preprocessor\">#include &quot;type_vec3.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;<span class=\"preprocessor\">#endif//GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00005_html\"><div class=\"ttname\"><a href=\"a00005.html\">_swizzle_func.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00120_html\"><div class=\"ttname\"><a href=\"a00120.html\">type_vec.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00004_html\"><div class=\"ttname\"><a href=\"a00004.html\">_swizzle.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00124.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec4.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec4.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00124_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00124_source.html\">type_vec4.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00124_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: type_vec4.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">type_vec4.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00124.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00120.html\">type_vec.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;<span class=\"preprocessor\">#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#       if GLM_HAS_UNRESTRICTED_UNIONS</span></div>\n<div class=\"line\"><a name=\"l00009\"></a><span class=\"lineno\">    9</span>&#160;<span class=\"preprocessor\">#               include &quot;<a class=\"code\" href=\"a00004.html\">_swizzle.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00010\"></a><span class=\"lineno\">   10</span>&#160;<span class=\"preprocessor\">#       else</span></div>\n<div class=\"line\"><a name=\"l00011\"></a><span class=\"lineno\">   11</span>&#160;<span class=\"preprocessor\">#               include &quot;<a class=\"code\" href=\"a00005.html\">_swizzle_func.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00012\"></a><span class=\"lineno\">   12</span>&#160;<span class=\"preprocessor\">#       endif</span></div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#endif //GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;<span class=\"preprocessor\">#include &lt;cstddef&gt;</span></div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;</div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;        <span class=\"keyword\">struct </span>vec&lt;4, T, Q&gt;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;        {</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;                <span class=\"comment\">// -- Implementation detail --</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;                <span class=\"keyword\">typedef</span> T value_type;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;4, T, Q&gt; type;</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                <span class=\"keyword\">typedef</span> vec&lt;4, bool, Q&gt; bool_type;</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;                <span class=\"comment\">// -- Data --</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_ONLY_XYZW</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                        T x, y, z, w;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;<span class=\"preprocessor\">#               elif GLM_HAS_ALIGNED_TYPE</span></div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic ignored &quot;-Wpedantic&quot;</span></div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic push</span></div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wgnu-anonymous-struct&quot;</span></div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic ignored &quot;-Wnested-anon-types&quot;</span></div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;                        <span class=\"keyword\">union</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;                                <span class=\"keyword\">struct </span>{ T x, y, z, w;};</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                                <span class=\"keyword\">struct </span>{ T r, g, b, a; };</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                                <span class=\"keyword\">struct </span>{ T s, t, p, q; };</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;                                <span class=\"keyword\">typename</span> detail::storage&lt;T, sizeof(T) * 4, detail::is_aligned&lt;Q&gt;::value&gt;::type data;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;<span class=\"preprocessor\">#                               if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;                                        GLM_SWIZZLE4_2_MEMBERS(T, Q, x, y, z, w)</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;                                        GLM_SWIZZLE4_2_MEMBERS(T, Q, r, g, b, a)</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;                                        GLM_SWIZZLE4_2_MEMBERS(T, Q, s, t, p, q)</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;                                        GLM_SWIZZLE4_3_MEMBERS(T, Q, x, y, z, w)</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                                        GLM_SWIZZLE4_3_MEMBERS(T, Q, r, g, b, a)</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;                                        GLM_SWIZZLE4_3_MEMBERS(T, Q, s, t, p, q)</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;                                        GLM_SWIZZLE4_4_MEMBERS(T, Q, x, y, z, w)</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;                                        GLM_SWIZZLE4_4_MEMBERS(T, Q, r, g, b, a)</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;                                        GLM_SWIZZLE4_4_MEMBERS(T, Q, s, t, p, q)</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;<span class=\"preprocessor\">#                               endif//GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                        };</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_CLANG</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#                               pragma clang diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;<span class=\"preprocessor\">#                       if GLM_COMPILER &amp; GLM_COMPILER_GCC</span></div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;<span class=\"preprocessor\">#                               pragma GCC diagnostic pop</span></div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;<span class=\"preprocessor\">#                       endif</span></div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;<span class=\"preprocessor\">#               else</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;                        <span class=\"keyword\">union </span>{ T x, r, s; };</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;                        <span class=\"keyword\">union </span>{ T y, g, t; };</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                        <span class=\"keyword\">union </span>{ T z, b, p; };</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;                        <span class=\"keyword\">union </span>{ T w, a, q; };</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;<span class=\"preprocessor\">#                       if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;                                GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P)</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;<span class=\"preprocessor\">#                       endif//GLM_SWIZZLE</span></div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;<span class=\"preprocessor\">#               endif</span></div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;                <span class=\"comment\">// -- Component accesses --</span></div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                <span class=\"keyword\">typedef</span> length_t length_type;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;                GLM_FUNC_DECL <span class=\"keyword\">static</span> GLM_CONSTEXPR length_type <a class=\"code\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a>(){<span class=\"keywordflow\">return</span> 4;}</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;                GLM_FUNC_DECL T &amp; operator[](length_type i);</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;                GLM_FUNC_DECL T <span class=\"keyword\">const</span>&amp; operator[](length_type i) <span class=\"keyword\">const</span>;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;                <span class=\"comment\">// -- Implicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec() GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(vec&lt;4, T, Q&gt; const&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;                template&lt;qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(vec&lt;4, T, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;                <span class=\"comment\">// -- Explicit basic constructors --</span></div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_SIMD explicit vec(T scalar);</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(T x, T y, T z, T w);</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;                <span class=\"comment\">// -- Conversion scalar constructors --</span></div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                template&lt;typename X, typename Y, typename Z, typename W&gt;</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(X _x, Y _y, Z _z, W _w);</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;                template&lt;typename X, typename Y, typename Z, typename W&gt;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;1, X, Q&gt; const&amp; _x, vec&lt;1, Y, Q&gt; const&amp; _Y, vec&lt;1, Z, Q&gt; const&amp; _z, vec&lt;1, W, Q&gt; const&amp; _w);</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;                <span class=\"comment\">// -- Conversion vector constructors --</span></div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;                template&lt;typename A, typename B, typename C, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;2, A, P&gt; const&amp; _xy, B _z, C _w);</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                template&lt;typename A, typename B, typename C, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;2, A, P&gt; const&amp; _xy, vec&lt;1, B, P&gt; const&amp; _z, vec&lt;1, C, P&gt; const&amp; _w);</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;                template&lt;typename A, typename B, typename C, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec&lt;2, B, P&gt; const&amp; _yz, C _w);</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                template&lt;typename A, typename B, typename C, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;1, A, P&gt; const&amp; _x, vec&lt;2, B, P&gt; const&amp; _yz, vec&lt;1, C, P&gt; const&amp; _w);</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;                template&lt;typename A, typename B, typename C, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, B _y, vec&lt;2, C, P&gt; const&amp; _zw);</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                template&lt;typename A, typename B, typename C, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;1, A, P&gt; const&amp; _x, vec&lt;1, B, P&gt; const&amp; _y, vec&lt;2, C, P&gt; const&amp; _zw);</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;3, A, P&gt; const&amp; _xyz, B _w);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;3, A, P&gt; const&amp; _xyz, vec&lt;1, B, P&gt; const&amp; _w);</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec&lt;3, B, P&gt; const&amp; _yzw);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;1, A, P&gt; const&amp; _x, vec&lt;3, B, P&gt; const&amp; _yzw);</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;                template&lt;typename A, typename B, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec&lt;2, A, P&gt; const&amp; _xy, vec&lt;2, B, P&gt; const&amp; _zw);</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;                template&lt;typename U, qualifier P&gt;</div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;                GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec&lt;4, U, P&gt; const&amp; v);</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;                <span class=\"comment\">// -- Swizzle constructors --</span></div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;<span class=\"preprocessor\">#               if GLM_HAS_UNRESTRICTED_UNIONS &amp;&amp; (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)</span></div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2, <span class=\"keywordtype\">int</span> E3&gt;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;                        GLM_FUNC_DECL vec(detail::_swizzle&lt;4, T, Q, E0, E1, E2, E3&gt; <span class=\"keyword\">const</span>&amp; that)</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;                                *<span class=\"keyword\">this</span> = that();</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> F0, <span class=\"keywordtype\">int</span> F1&gt;</div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;                        GLM_FUNC_DECL vec(detail::_swizzle&lt;2, T, Q, E0, E1, -1, -2&gt; <span class=\"keyword\">const</span>&amp; v, detail::_swizzle&lt;2, T, Q, F0, F1, -1, -2&gt; <span class=\"keyword\">const</span>&amp; u)</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;                                *<span class=\"keyword\">this</span> = vec&lt;4, T, Q&gt;(v(), u());</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1&gt;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;                        GLM_FUNC_DECL vec(T <span class=\"keyword\">const</span>&amp; x, T <span class=\"keyword\">const</span>&amp; y, detail::_swizzle&lt;2, T, Q, E0, E1, -1, -2&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;                                *<span class=\"keyword\">this</span> = vec&lt;4, T, Q&gt;(x, y, v());</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1&gt;</div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;                        GLM_FUNC_DECL vec(T <span class=\"keyword\">const</span>&amp; x, detail::_swizzle&lt;2, T, Q, E0, E1, -1, -2&gt; <span class=\"keyword\">const</span>&amp; v, T <span class=\"keyword\">const</span>&amp; w)</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                                *<span class=\"keyword\">this</span> = vec&lt;4, T, Q&gt;(x, v(), w);</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1&gt;</div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;                        GLM_FUNC_DECL vec(detail::_swizzle&lt;2, T, Q, E0, E1, -1, -2&gt; <span class=\"keyword\">const</span>&amp; v, T <span class=\"keyword\">const</span>&amp; z, T <span class=\"keyword\">const</span>&amp; w)</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;                                *<span class=\"keyword\">this</span> = vec&lt;4, T, Q&gt;(v(), z, w);</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2&gt;</div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;                        GLM_FUNC_DECL vec(detail::_swizzle&lt;3, T, Q, E0, E1, E2, -1&gt; <span class=\"keyword\">const</span>&amp; v, T <span class=\"keyword\">const</span>&amp; w)</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;                                *<span class=\"keyword\">this</span> = vec&lt;4, T, Q&gt;(v(), w);</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;                        <span class=\"keyword\">template</span>&lt;<span class=\"keywordtype\">int</span> E0, <span class=\"keywordtype\">int</span> E1, <span class=\"keywordtype\">int</span> E2&gt;</div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;                        GLM_FUNC_DECL vec(T <span class=\"keyword\">const</span>&amp; x, detail::_swizzle&lt;3, T, Q, E0, E1, E2, -1&gt; <span class=\"keyword\">const</span>&amp; v)</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;                        {</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;                                *<span class=\"keyword\">this</span> = vec&lt;4, T, Q&gt;(x, v());</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;                        }</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;<span class=\"preprocessor\">#               endif// GLM_HAS_UNRESTRICTED_UNIONS &amp;&amp; (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)</span></div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;                <span class=\"comment\">// -- Unary arithmetic operators --</span></div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator=(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v) GLM_DEFAULT;</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator+=(U scalar);</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator+=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator+=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator-=(U scalar);</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator-=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator-=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator*=(U scalar);</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator*=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator*=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator/=(U scalar);</div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator/=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt;&amp; operator/=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;</div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;                <span class=\"comment\">// -- Increment and decrement operators --</span></div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator++();</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator--();</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator++(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator--(<span class=\"keywordtype\">int</span>);</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;</div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;                <span class=\"comment\">// -- Unary bit operators --</span></div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator%=(U scalar);</div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator%=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator%=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&amp;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&amp;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&amp;=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator|=(U scalar);</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator|=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator|=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator^=(U scalar);</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator^=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator^=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&lt;&lt;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&lt;&lt;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&lt;&lt;=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&gt;&gt;=(U scalar);</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&gt;&gt;=(vec&lt;1, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;                <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> U&gt;</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;                GLM_FUNC_DECL vec&lt;4, T, Q&gt; &amp; operator&gt;&gt;=(vec&lt;4, U, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;        };</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;        <span class=\"comment\">// -- Unary operators --</span></div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;</div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator+(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;</div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator-(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        <span class=\"comment\">// -- Binary operators --</span></div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;</div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator+(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;</div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator+(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator+(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;</div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator+(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator+(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator-(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;</div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator-(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator-(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;</div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator-(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;</div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator-(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;</div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;</div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;</div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;</div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator*(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;</div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator/(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;</div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator/(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;</div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator/(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;</div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator/(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator/(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;</div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator%(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;</div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator%(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar);</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;</div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator%(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator%(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;</div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator%(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&amp;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&amp;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar);</div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;</div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&amp;(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;</div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&amp;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&amp;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;</div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator|(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;</div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator|(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar);</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator|(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator|(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;</div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator|(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;</div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator^(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;</div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator^(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar);</div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator^(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;</div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator^(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;</div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator^(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;</div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&lt;&lt;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&lt;&lt;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar);</div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;</div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&lt;&lt;(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;</div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&lt;&lt;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;</div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&lt;&lt;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&gt;&gt;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T scalar);</div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;</div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&gt;&gt;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar);</div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;</div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&gt;&gt;(T scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;</div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&gt;&gt;(vec&lt;1, T, Q&gt; <span class=\"keyword\">const</span>&amp; scalar, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator&gt;&gt;(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;</div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;        GLM_FUNC_DECL vec&lt;4, T, Q&gt; operator~(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;</div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;        <span class=\"comment\">// -- Boolean operators --</span></div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;</div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\">  439</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator==(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;</div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> operator!=(vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, T, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\">  443</span>&#160;</div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;        <span class=\"keyword\">template</span>&lt;qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; operator&amp;&amp;(vec&lt;4, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;</div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;        <span class=\"keyword\">template</span>&lt;qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;        GLM_FUNC_DECL vec&lt;4, bool, Q&gt; operator||(vec&lt;4, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v1, vec&lt;4, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v2);</div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;</div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;<span class=\"preprocessor\">#ifndef GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;<span class=\"preprocessor\">#include &quot;type_vec4.inl&quot;</span></div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;<span class=\"preprocessor\">#endif//GLM_EXTERNAL_TEMPLATE</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00142_html_ga0cdabbb000834d994a1d6dc56f8f5263\"><div class=\"ttname\"><a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">glm::length</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T length(vec&lt; L, T, Q &gt; const &amp;x)</div><div class=\"ttdoc\">Returns the length of x, i.e., sqrt(x * x). </div></div>\n<div class=\"ttc\" id=\"a00005_html\"><div class=\"ttname\"><a href=\"a00005.html\">_swizzle_func.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00120_html\"><div class=\"ttname\"><a href=\"a00120.html\">type_vec.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00004_html\"><div class=\"ttname\"><a href=\"a00004.html\">_swizzle.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00125.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: ulp.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">ulp.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00167.html\">GLM_GTC_ulp</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00125_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga2e09bd6c8b0a9c91f6f5683d68245634\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga2e09bd6c8b0a9c91f6f5683d68245634\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#ga2e09bd6c8b0a9c91f6f5683d68245634\">float_distance</a> (T const &amp;x, T const &amp;y)</td></tr>\n<tr class=\"memdesc:ga2e09bd6c8b0a9c91f6f5683d68245634\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the distance in the number of ULP between 2 scalars.  <a href=\"a00167.html#ga2e09bd6c8b0a9c91f6f5683d68245634\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e09bd6c8b0a9c91f6f5683d68245634\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga72b3223069013f336d8c31812b7ada80\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga72b3223069013f336d8c31812b7ada80\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#ga72b3223069013f336d8c31812b7ada80\">float_distance</a> (vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga72b3223069013f336d8c31812b7ada80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the distance in the number of ULP between 2 vectors.  <a href=\"a00167.html#ga72b3223069013f336d8c31812b7ada80\">More...</a><br /></td></tr>\n<tr class=\"separator:ga72b3223069013f336d8c31812b7ada80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae516ae554faa6117660828240e8bdaf0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae516ae554faa6117660828240e8bdaf0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#gae516ae554faa6117660828240e8bdaf0\">next_float</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:gae516ae554faa6117660828240e8bdaf0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the next ULP value(s) after the input value(s).  <a href=\"a00167.html#gae516ae554faa6117660828240e8bdaf0\">More...</a><br /></td></tr>\n<tr class=\"separator:gae516ae554faa6117660828240e8bdaf0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad107ec3d9697ef82032a33338a73ebdd\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad107ec3d9697ef82032a33338a73ebdd\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#gad107ec3d9697ef82032a33338a73ebdd\">next_float</a> (genType const &amp;x, uint const &amp;Distance)</td></tr>\n<tr class=\"memdesc:gad107ec3d9697ef82032a33338a73ebdd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the value(s) ULP distance after the input value(s).  <a href=\"a00167.html#gad107ec3d9697ef82032a33338a73ebdd\">More...</a><br /></td></tr>\n<tr class=\"separator:gad107ec3d9697ef82032a33338a73ebdd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2fcbb7bfbfc595712bfddc51b0715b07\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2fcbb7bfbfc595712bfddc51b0715b07\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#ga2fcbb7bfbfc595712bfddc51b0715b07\">prev_float</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga2fcbb7bfbfc595712bfddc51b0715b07\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the previous ULP value(s) before the input value(s).  <a href=\"a00167.html#ga2fcbb7bfbfc595712bfddc51b0715b07\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2fcbb7bfbfc595712bfddc51b0715b07\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa399d5b6472a70e8952f9b26ecaacdec\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa399d5b6472a70e8952f9b26ecaacdec\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec\">prev_float</a> (genType const &amp;x, uint const &amp;Distance)</td></tr>\n<tr class=\"memdesc:gaa399d5b6472a70e8952f9b26ecaacdec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the value(s) ULP distance before the input value(s).  <a href=\"a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa399d5b6472a70e8952f9b26ecaacdec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00167.html\">GLM_GTC_ulp</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00125_source.html\">ulp.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00125_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: ulp.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">ulp.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00125.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"comment\">// Dependencies</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/setup.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/qualifier.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_int.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/compute_vector_relational.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_ulp extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00167.html#gad107ec3d9697ef82032a33338a73ebdd\">next_float</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec\">prev_float</a>(genType <span class=\"keyword\">const</span>&amp; x);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00167.html#gad107ec3d9697ef82032a33338a73ebdd\">next_float</a>(genType <span class=\"keyword\">const</span>&amp; x, <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <span class=\"keyword\">const</span>&amp; Distance);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec\">prev_float</a>(genType <span class=\"keyword\">const</span>&amp; x, <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <span class=\"keyword\">const</span>&amp; Distance);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_FUNC_DECL <a class=\"code\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> <a class=\"code\" href=\"a00167.html#ga72b3223069013f336d8c31812b7ada80\">float_distance</a>(T <span class=\"keyword\">const</span>&amp; x, T <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        GLM_FUNC_DECL vec&lt;2, uint, Q&gt; <a class=\"code\" href=\"a00167.html#ga72b3223069013f336d8c31812b7ada80\">float_distance</a>(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        </div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;<span class=\"preprocessor\">#include &quot;ulp.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00167_html_gad107ec3d9697ef82032a33338a73ebdd\"><div class=\"ttname\"><a href=\"a00167.html#gad107ec3d9697ef82032a33338a73ebdd\">glm::next_float</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType next_float(genType const &amp;x, uint const &amp;Distance)</div><div class=\"ttdoc\">Return the value(s) ULP distance after the input value(s). </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00167_html_gaa399d5b6472a70e8952f9b26ecaacdec\"><div class=\"ttname\"><a href=\"a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec\">glm::prev_float</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType prev_float(genType const &amp;x, uint const &amp;Distance)</div><div class=\"ttdoc\">Return the value(s) ULP distance before the input value(s). </div></div>\n<div class=\"ttc\" id=\"a00145_html_ga91ad9478d81a7aaf2593e8d9c3d06a14\"><div class=\"ttname\"><a href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">glm::uint</a></div><div class=\"ttdeci\">unsigned int uint</div><div class=\"ttdoc\">Unsigned integer type. </div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00106_source.html#l00288\">type_int.hpp:288</a></div></div>\n<div class=\"ttc\" id=\"a00167_html_ga72b3223069013f336d8c31812b7ada80\"><div class=\"ttname\"><a href=\"a00167.html#ga72b3223069013f336d8c31812b7ada80\">glm::float_distance</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; 2, uint, Q &gt; float_distance(vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Return the distance in the number of ULP between 2 vectors. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00126.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec1.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">vec1.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00168.html\">GLM_GTC_vec1</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00126_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:a97f808440fd5411e2c46a55db01329f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_bvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>bvec1</b></td></tr>\n<tr class=\"memdesc:a97f808440fd5411e2c46a55db01329f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of boolean.  <a href=\"a00135.html#a97f808440fd5411e2c46a55db01329f0\">More...</a><br /></td></tr>\n<tr class=\"separator:a97f808440fd5411e2c46a55db01329f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:af5895ca3a2b8ff8239bdcd5d153fa5ab\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>dvec1</b></td></tr>\n<tr class=\"memdesc:af5895ca3a2b8ff8239bdcd5d153fa5ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of floating-point numbers.  <a href=\"a00135.html#af5895ca3a2b8ff8239bdcd5d153fa5ab\">More...</a><br /></td></tr>\n<tr class=\"separator:af5895ca3a2b8ff8239bdcd5d153fa5ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:abb1dfdb295030ec2965eed463009d9aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_bvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_bvec1</b></td></tr>\n<tr class=\"memdesc:abb1dfdb295030ec2965eed463009d9aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of high qualifier boolean.  <a href=\"a00135.html#abb1dfdb295030ec2965eed463009d9aa\">More...</a><br /></td></tr>\n<tr class=\"separator:abb1dfdb295030ec2965eed463009d9aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae0b25a2a5d5abf7001aecefaf0ad8d0e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_dvec1</b></td></tr>\n<tr class=\"memdesc:ae0b25a2a5d5abf7001aecefaf0ad8d0e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of high qualifier floating-point numbers.  <a href=\"a00135.html#ae0b25a2a5d5abf7001aecefaf0ad8d0e\">More...</a><br /></td></tr>\n<tr class=\"separator:ae0b25a2a5d5abf7001aecefaf0ad8d0e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aad38f7770219bb7a4b84a7d5c68d7f7d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ivec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_ivec1</b></td></tr>\n<tr class=\"memdesc:aad38f7770219bb7a4b84a7d5c68d7f7d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of high qualifier signed integer numbers.  <a href=\"a00135.html#aad38f7770219bb7a4b84a7d5c68d7f7d\">More...</a><br /></td></tr>\n<tr class=\"separator:aad38f7770219bb7a4b84a7d5c68d7f7d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae38198c95c92d34875ca31f4b7c14d27\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_uvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>highp_uvec1</b></td></tr>\n<tr class=\"memdesc:ae38198c95c92d34875ca31f4b7c14d27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of high qualifier unsigned integer numbers.  <a href=\"a00135.html#ae38198c95c92d34875ca31f4b7c14d27\">More...</a><br /></td></tr>\n<tr class=\"separator:ae38198c95c92d34875ca31f4b7c14d27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac424dc0bcb8f78bb57f5f9350a36d9b5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ivec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>ivec1</b></td></tr>\n<tr class=\"memdesc:ac424dc0bcb8f78bb57f5f9350a36d9b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of signed integer numbers.  <a href=\"a00135.html#ac424dc0bcb8f78bb57f5f9350a36d9b5\">More...</a><br /></td></tr>\n<tr class=\"separator:ac424dc0bcb8f78bb57f5f9350a36d9b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ac42347907bf39ce2adc41f764c7e6c99\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_bvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_bvec1</b></td></tr>\n<tr class=\"memdesc:ac42347907bf39ce2adc41f764c7e6c99\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of low qualifier boolean.  <a href=\"a00135.html#ac42347907bf39ce2adc41f764c7e6c99\">More...</a><br /></td></tr>\n<tr class=\"separator:ac42347907bf39ce2adc41f764c7e6c99\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a9a00665cc5ffd8bb7dea1262a421d07b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_dvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_dvec1</b></td></tr>\n<tr class=\"memdesc:a9a00665cc5ffd8bb7dea1262a421d07b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of low qualifier floating-point numbers.  <a href=\"a00135.html#a9a00665cc5ffd8bb7dea1262a421d07b\">More...</a><br /></td></tr>\n<tr class=\"separator:a9a00665cc5ffd8bb7dea1262a421d07b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a62179513d4c3d38f5f7d73756220e568\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_ivec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_ivec1</b></td></tr>\n<tr class=\"memdesc:a62179513d4c3d38f5f7d73756220e568\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of low qualifier signed integer numbers.  <a href=\"a00135.html#a62179513d4c3d38f5f7d73756220e568\">More...</a><br /></td></tr>\n<tr class=\"separator:a62179513d4c3d38f5f7d73756220e568\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ab73c0a6f4fe24ce30e808b6c4f511935\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_uvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>lowp_uvec1</b></td></tr>\n<tr class=\"memdesc:ab73c0a6f4fe24ce30e808b6c4f511935\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of low qualifier unsigned integer numbers.  <a href=\"a00135.html#ab73c0a6f4fe24ce30e808b6c4f511935\">More...</a><br /></td></tr>\n<tr class=\"separator:ab73c0a6f4fe24ce30e808b6c4f511935\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:aac363ee47ee16b0361db847c5a97e821\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_bvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_bvec1</b></td></tr>\n<tr class=\"memdesc:aac363ee47ee16b0361db847c5a97e821\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of medium qualifier boolean.  <a href=\"a00135.html#aac363ee47ee16b0361db847c5a97e821\">More...</a><br /></td></tr>\n<tr class=\"separator:aac363ee47ee16b0361db847c5a97e821\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a08d652d636a98a60782ac109f0273931\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_dvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_dvec1</b></td></tr>\n<tr class=\"memdesc:a08d652d636a98a60782ac109f0273931\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of medium qualifier floating-point numbers.  <a href=\"a00135.html#a08d652d636a98a60782ac109f0273931\">More...</a><br /></td></tr>\n<tr class=\"separator:a08d652d636a98a60782ac109f0273931\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ae2b635f944fd11622a4f23f783f0c01e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_ivec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_ivec1</b></td></tr>\n<tr class=\"memdesc:ae2b635f944fd11622a4f23f783f0c01e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of medium qualifier signed integer numbers.  <a href=\"a00135.html#ae2b635f944fd11622a4f23f783f0c01e\">More...</a><br /></td></tr>\n<tr class=\"separator:ae2b635f944fd11622a4f23f783f0c01e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a265324081f85d36db159677d8ca35fd1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_uvec1_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>mediump_uvec1</b></td></tr>\n<tr class=\"memdesc:a265324081f85d36db159677d8ca35fd1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of medium qualifier unsigned integer numbers.  <a href=\"a00135.html#a265324081f85d36db159677d8ca35fd1\">More...</a><br /></td></tr>\n<tr class=\"separator:a265324081f85d36db159677d8ca35fd1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a63e1e4312a97da0007db93d7f18d9687\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_uvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>uvec1</b></td></tr>\n<tr class=\"memdesc:a63e1e4312a97da0007db93d7f18d9687\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of unsigned integer numbers.  <a href=\"a00135.html#a63e1e4312a97da0007db93d7f18d9687\">More...</a><br /></td></tr>\n<tr class=\"separator:a63e1e4312a97da0007db93d7f18d9687\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a4df551da8fd418cf98951a3948390485\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>vec1</b></td></tr>\n<tr class=\"memdesc:a4df551da8fd418cf98951a3948390485\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector of floating-point numbers.  <a href=\"a00135.html#a4df551da8fd418cf98951a3948390485\">More...</a><br /></td></tr>\n<tr class=\"separator:a4df551da8fd418cf98951a3948390485\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00168.html\">GLM_GTC_vec1</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00126_source.html\">vec1.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00126_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec1.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec1.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00126.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../detail/type_vec1.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTC_vec1 extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;        <span class=\"keyword\">typedef</span> highp_vec1_t                    highp_vec1;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">typedef</span> mediump_vec1_t                  mediump_vec1;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">typedef</span> lowp_vec1_t                             lowp_vec1;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <span class=\"keyword\">typedef</span> highp_dvec1_t                   highp_dvec1;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dvec1_t                 mediump_dvec1;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dvec1_t                    lowp_dvec1;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;        <span class=\"keyword\">typedef</span> highp_ivec1_t                   highp_ivec1;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        <span class=\"keyword\">typedef</span> mediump_ivec1_t                 mediump_ivec1;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        <span class=\"keyword\">typedef</span> lowp_ivec1_t                    lowp_ivec1;</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;        <span class=\"keyword\">typedef</span> highp_uvec1_t                   highp_uvec1;</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        <span class=\"keyword\">typedef</span> mediump_uvec1_t                 mediump_uvec1;</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        <span class=\"keyword\">typedef</span> lowp_uvec1_t                    lowp_uvec1;</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;        <span class=\"keyword\">typedef</span> highp_bvec1_t                   highp_bvec1;</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;</div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        <span class=\"keyword\">typedef</span> mediump_bvec1_t                 mediump_bvec1;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;        <span class=\"keyword\">typedef</span> lowp_bvec1_t                    lowp_bvec1;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        <span class=\"comment\">// vec1 definition</span></div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_BOOL))</span></div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        <span class=\"keyword\">typedef</span> highp_bvec1                             bvec1;</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_BOOL))</span></div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        <span class=\"keyword\">typedef</span> mediump_bvec1                   bvec1;</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_LOWP_BOOL))</span></div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        <span class=\"keyword\">typedef</span> lowp_bvec1                              bvec1;</div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        <span class=\"keyword\">typedef</span> highp_bvec1                             bvec1;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;        <span class=\"keyword\">typedef</span> highp_vec1                              vec1;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;        <span class=\"keyword\">typedef</span> mediump_vec1                    vec1;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_LOWP_FLOAT))</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        <span class=\"keyword\">typedef</span> lowp_vec1                               vec1;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;        <span class=\"keyword\">typedef</span> highp_vec1                              vec1;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;        <span class=\"keyword\">typedef</span> highp_dvec1                             dvec1;</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;        <span class=\"keyword\">typedef</span> mediump_dvec1                   dvec1;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_LOWP_DOUBLE))</span></div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        <span class=\"keyword\">typedef</span> lowp_dvec1                              dvec1;</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        <span class=\"keyword\">typedef</span> highp_dvec1                             dvec1;</div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_INT))</span></div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        <span class=\"keyword\">typedef</span> highp_ivec1                     ivec1;</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_INT))</span></div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        <span class=\"keyword\">typedef</span> mediump_ivec1           ivec1;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_LOWP_INT))</span></div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;        <span class=\"keyword\">typedef</span> lowp_ivec1                      ivec1;</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;        <span class=\"keyword\">typedef</span> highp_ivec1                     ivec1;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;<span class=\"preprocessor\">#if(defined(GLM_PRECISION_HIGHP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;        <span class=\"keyword\">typedef</span> highp_uvec1                     uvec1;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_MEDIUMP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        <span class=\"keyword\">typedef</span> mediump_uvec1           uvec1;</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;<span class=\"preprocessor\">#elif(defined(GLM_PRECISION_LOWP_UINT))</span></div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        <span class=\"keyword\">typedef</span> lowp_uvec1                      uvec1;</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;<span class=\"preprocessor\">#else</span></div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        <span class=\"keyword\">typedef</span> highp_uvec1                     uvec1;</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;<span class=\"preprocessor\">#endif//GLM_PRECISION</span></div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;</div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;<span class=\"preprocessor\">#include &quot;vec1.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00127.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec2.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec2.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00127_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00127_source.html\">vec2.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00127_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec2.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec2.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00127.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00122.html\">detail/type_vec2.hpp</a>&quot;</span></div>\n<div class=\"ttc\" id=\"a00122_html\"><div class=\"ttname\"><a href=\"a00122.html\">type_vec2.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00128.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec3.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec3.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00128_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00128_source.html\">vec3.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00128_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec3.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec3.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00128.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00123.html\">detail/type_vec3.hpp</a>&quot;</span></div>\n<div class=\"ttc\" id=\"a00123_html\"><div class=\"ttname\"><a href=\"a00123.html\">type_vec3.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00129.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec4.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec4.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00143.html\">Core features</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00129_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00143.html\">Core features</a> </p>\n\n<p>Definition in file <a class=\"el\" href=\"a00129_source.html\">vec4.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00129_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec4.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec4.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00129.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00004\"></a><span class=\"lineno\">    4</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00005\"></a><span class=\"lineno\">    5</span>&#160;</div>\n<div class=\"line\"><a name=\"l00006\"></a><span class=\"lineno\">    6</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00007\"></a><span class=\"lineno\">    7</span>&#160;</div>\n<div class=\"line\"><a name=\"l00008\"></a><span class=\"lineno\">    8</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00124.html\">detail/type_vec4.hpp</a>&quot;</span></div>\n<div class=\"ttc\" id=\"a00124_html\"><div class=\"ttname\"><a href=\"a00124.html\">type_vec4.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00130.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec_swizzle.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec_swizzle.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00225.html\">GLM_GTX_vec_swizzle</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00130_source.html\">Go to the source code of this file.</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00225.html\">GLM_GTX_vec_swizzle</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00130_source.html\">vec_swizzle.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00130_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vec_swizzle.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vec_swizzle.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00130.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_vec_swizzle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;</div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a> {</div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;        <span class=\"comment\">// xx</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xx(<span class=\"keyword\">const</span> glm::vec&lt;1, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00033\"></a><span class=\"lineno\">   33</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00038\"></a><span class=\"lineno\">   38</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00043\"></a><span class=\"lineno\">   43</span>&#160;        <span class=\"comment\">// xy</span></div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00048\"></a><span class=\"lineno\">   48</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00058\"></a><span class=\"lineno\">   58</span>&#160;</div>\n<div class=\"line\"><a name=\"l00059\"></a><span class=\"lineno\">   59</span>&#160;        <span class=\"comment\">// xz</span></div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00063\"></a><span class=\"lineno\">   63</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00068\"></a><span class=\"lineno\">   68</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00069\"></a><span class=\"lineno\">   69</span>&#160;</div>\n<div class=\"line\"><a name=\"l00070\"></a><span class=\"lineno\">   70</span>&#160;        <span class=\"comment\">// xw</span></div>\n<div class=\"line\"><a name=\"l00071\"></a><span class=\"lineno\">   71</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00072\"></a><span class=\"lineno\">   72</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; xw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00073\"></a><span class=\"lineno\">   73</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.x, v.w);</div>\n<div class=\"line\"><a name=\"l00074\"></a><span class=\"lineno\">   74</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        <span class=\"comment\">// yx</span></div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00078\"></a><span class=\"lineno\">   78</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00079\"></a><span class=\"lineno\">   79</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00080\"></a><span class=\"lineno\">   80</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00081\"></a><span class=\"lineno\">   81</span>&#160;</div>\n<div class=\"line\"><a name=\"l00082\"></a><span class=\"lineno\">   82</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00083\"></a><span class=\"lineno\">   83</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00084\"></a><span class=\"lineno\">   84</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00088\"></a><span class=\"lineno\">   88</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00089\"></a><span class=\"lineno\">   89</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00090\"></a><span class=\"lineno\">   90</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00091\"></a><span class=\"lineno\">   91</span>&#160;</div>\n<div class=\"line\"><a name=\"l00092\"></a><span class=\"lineno\">   92</span>&#160;        <span class=\"comment\">// yy</span></div>\n<div class=\"line\"><a name=\"l00093\"></a><span class=\"lineno\">   93</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00097\"></a><span class=\"lineno\">   97</span>&#160;</div>\n<div class=\"line\"><a name=\"l00098\"></a><span class=\"lineno\">   98</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00099\"></a><span class=\"lineno\">   99</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00100\"></a><span class=\"lineno\">  100</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00101\"></a><span class=\"lineno\">  101</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00102\"></a><span class=\"lineno\">  102</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00106\"></a><span class=\"lineno\">  106</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00107\"></a><span class=\"lineno\">  107</span>&#160;</div>\n<div class=\"line\"><a name=\"l00108\"></a><span class=\"lineno\">  108</span>&#160;        <span class=\"comment\">// yz</span></div>\n<div class=\"line\"><a name=\"l00109\"></a><span class=\"lineno\">  109</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00110\"></a><span class=\"lineno\">  110</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00111\"></a><span class=\"lineno\">  111</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00112\"></a><span class=\"lineno\">  112</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00116\"></a><span class=\"lineno\">  116</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;        <span class=\"comment\">// yw</span></div>\n<div class=\"line\"><a name=\"l00120\"></a><span class=\"lineno\">  120</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00121\"></a><span class=\"lineno\">  121</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; yw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00122\"></a><span class=\"lineno\">  122</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.y, v.w);</div>\n<div class=\"line\"><a name=\"l00123\"></a><span class=\"lineno\">  123</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00124\"></a><span class=\"lineno\">  124</span>&#160;</div>\n<div class=\"line\"><a name=\"l00125\"></a><span class=\"lineno\">  125</span>&#160;        <span class=\"comment\">// zx</span></div>\n<div class=\"line\"><a name=\"l00126\"></a><span class=\"lineno\">  126</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00127\"></a><span class=\"lineno\">  127</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; zx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00128\"></a><span class=\"lineno\">  128</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00129\"></a><span class=\"lineno\">  129</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00130\"></a><span class=\"lineno\">  130</span>&#160;</div>\n<div class=\"line\"><a name=\"l00131\"></a><span class=\"lineno\">  131</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00132\"></a><span class=\"lineno\">  132</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; zx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00133\"></a><span class=\"lineno\">  133</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00134\"></a><span class=\"lineno\">  134</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00135\"></a><span class=\"lineno\">  135</span>&#160;</div>\n<div class=\"line\"><a name=\"l00136\"></a><span class=\"lineno\">  136</span>&#160;        <span class=\"comment\">// zy</span></div>\n<div class=\"line\"><a name=\"l00137\"></a><span class=\"lineno\">  137</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00138\"></a><span class=\"lineno\">  138</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; zy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00139\"></a><span class=\"lineno\">  139</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00140\"></a><span class=\"lineno\">  140</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00141\"></a><span class=\"lineno\">  141</span>&#160;</div>\n<div class=\"line\"><a name=\"l00142\"></a><span class=\"lineno\">  142</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00143\"></a><span class=\"lineno\">  143</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; zy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00144\"></a><span class=\"lineno\">  144</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00145\"></a><span class=\"lineno\">  145</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00146\"></a><span class=\"lineno\">  146</span>&#160;</div>\n<div class=\"line\"><a name=\"l00147\"></a><span class=\"lineno\">  147</span>&#160;        <span class=\"comment\">// zz</span></div>\n<div class=\"line\"><a name=\"l00148\"></a><span class=\"lineno\">  148</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00149\"></a><span class=\"lineno\">  149</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; zz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00150\"></a><span class=\"lineno\">  150</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00151\"></a><span class=\"lineno\">  151</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00152\"></a><span class=\"lineno\">  152</span>&#160;</div>\n<div class=\"line\"><a name=\"l00153\"></a><span class=\"lineno\">  153</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00154\"></a><span class=\"lineno\">  154</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; zz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00155\"></a><span class=\"lineno\">  155</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00156\"></a><span class=\"lineno\">  156</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00157\"></a><span class=\"lineno\">  157</span>&#160;</div>\n<div class=\"line\"><a name=\"l00158\"></a><span class=\"lineno\">  158</span>&#160;        <span class=\"comment\">// zw</span></div>\n<div class=\"line\"><a name=\"l00159\"></a><span class=\"lineno\">  159</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00160\"></a><span class=\"lineno\">  160</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; zw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00161\"></a><span class=\"lineno\">  161</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.z, v.w);</div>\n<div class=\"line\"><a name=\"l00162\"></a><span class=\"lineno\">  162</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00163\"></a><span class=\"lineno\">  163</span>&#160;</div>\n<div class=\"line\"><a name=\"l00164\"></a><span class=\"lineno\">  164</span>&#160;        <span class=\"comment\">// wx</span></div>\n<div class=\"line\"><a name=\"l00165\"></a><span class=\"lineno\">  165</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00166\"></a><span class=\"lineno\">  166</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; wx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00167\"></a><span class=\"lineno\">  167</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.w, v.x);</div>\n<div class=\"line\"><a name=\"l00168\"></a><span class=\"lineno\">  168</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00169\"></a><span class=\"lineno\">  169</span>&#160;</div>\n<div class=\"line\"><a name=\"l00170\"></a><span class=\"lineno\">  170</span>&#160;        <span class=\"comment\">// wy</span></div>\n<div class=\"line\"><a name=\"l00171\"></a><span class=\"lineno\">  171</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00172\"></a><span class=\"lineno\">  172</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; wy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00173\"></a><span class=\"lineno\">  173</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.w, v.y);</div>\n<div class=\"line\"><a name=\"l00174\"></a><span class=\"lineno\">  174</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00175\"></a><span class=\"lineno\">  175</span>&#160;</div>\n<div class=\"line\"><a name=\"l00176\"></a><span class=\"lineno\">  176</span>&#160;        <span class=\"comment\">// wz</span></div>\n<div class=\"line\"><a name=\"l00177\"></a><span class=\"lineno\">  177</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00178\"></a><span class=\"lineno\">  178</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; wz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00179\"></a><span class=\"lineno\">  179</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.w, v.z);</div>\n<div class=\"line\"><a name=\"l00180\"></a><span class=\"lineno\">  180</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00181\"></a><span class=\"lineno\">  181</span>&#160;</div>\n<div class=\"line\"><a name=\"l00182\"></a><span class=\"lineno\">  182</span>&#160;        <span class=\"comment\">// ww</span></div>\n<div class=\"line\"><a name=\"l00183\"></a><span class=\"lineno\">  183</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00184\"></a><span class=\"lineno\">  184</span>&#160;        GLM_INLINE glm::vec&lt;2, T, Q&gt; ww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00185\"></a><span class=\"lineno\">  185</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;2, T, Q&gt;(v.w, v.w);</div>\n<div class=\"line\"><a name=\"l00186\"></a><span class=\"lineno\">  186</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00187\"></a><span class=\"lineno\">  187</span>&#160;</div>\n<div class=\"line\"><a name=\"l00188\"></a><span class=\"lineno\">  188</span>&#160;        <span class=\"comment\">// xxx</span></div>\n<div class=\"line\"><a name=\"l00189\"></a><span class=\"lineno\">  189</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00190\"></a><span class=\"lineno\">  190</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxx(<span class=\"keyword\">const</span> glm::vec&lt;1, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00191\"></a><span class=\"lineno\">  191</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00192\"></a><span class=\"lineno\">  192</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00193\"></a><span class=\"lineno\">  193</span>&#160;</div>\n<div class=\"line\"><a name=\"l00194\"></a><span class=\"lineno\">  194</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00195\"></a><span class=\"lineno\">  195</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00196\"></a><span class=\"lineno\">  196</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00197\"></a><span class=\"lineno\">  197</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00198\"></a><span class=\"lineno\">  198</span>&#160;</div>\n<div class=\"line\"><a name=\"l00199\"></a><span class=\"lineno\">  199</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00200\"></a><span class=\"lineno\">  200</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00201\"></a><span class=\"lineno\">  201</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00202\"></a><span class=\"lineno\">  202</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00203\"></a><span class=\"lineno\">  203</span>&#160;</div>\n<div class=\"line\"><a name=\"l00204\"></a><span class=\"lineno\">  204</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00205\"></a><span class=\"lineno\">  205</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00206\"></a><span class=\"lineno\">  206</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00207\"></a><span class=\"lineno\">  207</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00208\"></a><span class=\"lineno\">  208</span>&#160;</div>\n<div class=\"line\"><a name=\"l00209\"></a><span class=\"lineno\">  209</span>&#160;        <span class=\"comment\">// xxy</span></div>\n<div class=\"line\"><a name=\"l00210\"></a><span class=\"lineno\">  210</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00211\"></a><span class=\"lineno\">  211</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00212\"></a><span class=\"lineno\">  212</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00213\"></a><span class=\"lineno\">  213</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00214\"></a><span class=\"lineno\">  214</span>&#160;</div>\n<div class=\"line\"><a name=\"l00215\"></a><span class=\"lineno\">  215</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00216\"></a><span class=\"lineno\">  216</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00217\"></a><span class=\"lineno\">  217</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00218\"></a><span class=\"lineno\">  218</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00219\"></a><span class=\"lineno\">  219</span>&#160;</div>\n<div class=\"line\"><a name=\"l00220\"></a><span class=\"lineno\">  220</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00221\"></a><span class=\"lineno\">  221</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00222\"></a><span class=\"lineno\">  222</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00223\"></a><span class=\"lineno\">  223</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00224\"></a><span class=\"lineno\">  224</span>&#160;</div>\n<div class=\"line\"><a name=\"l00225\"></a><span class=\"lineno\">  225</span>&#160;        <span class=\"comment\">// xxz</span></div>\n<div class=\"line\"><a name=\"l00226\"></a><span class=\"lineno\">  226</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00227\"></a><span class=\"lineno\">  227</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00228\"></a><span class=\"lineno\">  228</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00229\"></a><span class=\"lineno\">  229</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00230\"></a><span class=\"lineno\">  230</span>&#160;</div>\n<div class=\"line\"><a name=\"l00231\"></a><span class=\"lineno\">  231</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00232\"></a><span class=\"lineno\">  232</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00233\"></a><span class=\"lineno\">  233</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00234\"></a><span class=\"lineno\">  234</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00235\"></a><span class=\"lineno\">  235</span>&#160;</div>\n<div class=\"line\"><a name=\"l00236\"></a><span class=\"lineno\">  236</span>&#160;        <span class=\"comment\">// xxw</span></div>\n<div class=\"line\"><a name=\"l00237\"></a><span class=\"lineno\">  237</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00238\"></a><span class=\"lineno\">  238</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00239\"></a><span class=\"lineno\">  239</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l00240\"></a><span class=\"lineno\">  240</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00241\"></a><span class=\"lineno\">  241</span>&#160;</div>\n<div class=\"line\"><a name=\"l00242\"></a><span class=\"lineno\">  242</span>&#160;        <span class=\"comment\">// xyx</span></div>\n<div class=\"line\"><a name=\"l00243\"></a><span class=\"lineno\">  243</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00244\"></a><span class=\"lineno\">  244</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00245\"></a><span class=\"lineno\">  245</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00246\"></a><span class=\"lineno\">  246</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00247\"></a><span class=\"lineno\">  247</span>&#160;</div>\n<div class=\"line\"><a name=\"l00248\"></a><span class=\"lineno\">  248</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00249\"></a><span class=\"lineno\">  249</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00250\"></a><span class=\"lineno\">  250</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00251\"></a><span class=\"lineno\">  251</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00252\"></a><span class=\"lineno\">  252</span>&#160;</div>\n<div class=\"line\"><a name=\"l00253\"></a><span class=\"lineno\">  253</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00254\"></a><span class=\"lineno\">  254</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00255\"></a><span class=\"lineno\">  255</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00256\"></a><span class=\"lineno\">  256</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00257\"></a><span class=\"lineno\">  257</span>&#160;</div>\n<div class=\"line\"><a name=\"l00258\"></a><span class=\"lineno\">  258</span>&#160;        <span class=\"comment\">// xyy</span></div>\n<div class=\"line\"><a name=\"l00259\"></a><span class=\"lineno\">  259</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00260\"></a><span class=\"lineno\">  260</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00261\"></a><span class=\"lineno\">  261</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00262\"></a><span class=\"lineno\">  262</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00263\"></a><span class=\"lineno\">  263</span>&#160;</div>\n<div class=\"line\"><a name=\"l00264\"></a><span class=\"lineno\">  264</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00265\"></a><span class=\"lineno\">  265</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00266\"></a><span class=\"lineno\">  266</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00267\"></a><span class=\"lineno\">  267</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00268\"></a><span class=\"lineno\">  268</span>&#160;</div>\n<div class=\"line\"><a name=\"l00269\"></a><span class=\"lineno\">  269</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00270\"></a><span class=\"lineno\">  270</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00271\"></a><span class=\"lineno\">  271</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00272\"></a><span class=\"lineno\">  272</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00273\"></a><span class=\"lineno\">  273</span>&#160;</div>\n<div class=\"line\"><a name=\"l00274\"></a><span class=\"lineno\">  274</span>&#160;        <span class=\"comment\">// xyz</span></div>\n<div class=\"line\"><a name=\"l00275\"></a><span class=\"lineno\">  275</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00276\"></a><span class=\"lineno\">  276</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00277\"></a><span class=\"lineno\">  277</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00278\"></a><span class=\"lineno\">  278</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00279\"></a><span class=\"lineno\">  279</span>&#160;</div>\n<div class=\"line\"><a name=\"l00280\"></a><span class=\"lineno\">  280</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00281\"></a><span class=\"lineno\">  281</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00282\"></a><span class=\"lineno\">  282</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00283\"></a><span class=\"lineno\">  283</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00284\"></a><span class=\"lineno\">  284</span>&#160;</div>\n<div class=\"line\"><a name=\"l00285\"></a><span class=\"lineno\">  285</span>&#160;        <span class=\"comment\">// xyw</span></div>\n<div class=\"line\"><a name=\"l00286\"></a><span class=\"lineno\">  286</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00287\"></a><span class=\"lineno\">  287</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00288\"></a><span class=\"lineno\">  288</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l00289\"></a><span class=\"lineno\">  289</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00290\"></a><span class=\"lineno\">  290</span>&#160;</div>\n<div class=\"line\"><a name=\"l00291\"></a><span class=\"lineno\">  291</span>&#160;        <span class=\"comment\">// xzx</span></div>\n<div class=\"line\"><a name=\"l00292\"></a><span class=\"lineno\">  292</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00293\"></a><span class=\"lineno\">  293</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00294\"></a><span class=\"lineno\">  294</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00295\"></a><span class=\"lineno\">  295</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00296\"></a><span class=\"lineno\">  296</span>&#160;</div>\n<div class=\"line\"><a name=\"l00297\"></a><span class=\"lineno\">  297</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00298\"></a><span class=\"lineno\">  298</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00299\"></a><span class=\"lineno\">  299</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00300\"></a><span class=\"lineno\">  300</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00301\"></a><span class=\"lineno\">  301</span>&#160;</div>\n<div class=\"line\"><a name=\"l00302\"></a><span class=\"lineno\">  302</span>&#160;        <span class=\"comment\">// xzy</span></div>\n<div class=\"line\"><a name=\"l00303\"></a><span class=\"lineno\">  303</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00304\"></a><span class=\"lineno\">  304</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00305\"></a><span class=\"lineno\">  305</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00306\"></a><span class=\"lineno\">  306</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00307\"></a><span class=\"lineno\">  307</span>&#160;</div>\n<div class=\"line\"><a name=\"l00308\"></a><span class=\"lineno\">  308</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00309\"></a><span class=\"lineno\">  309</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00310\"></a><span class=\"lineno\">  310</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00311\"></a><span class=\"lineno\">  311</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00312\"></a><span class=\"lineno\">  312</span>&#160;</div>\n<div class=\"line\"><a name=\"l00313\"></a><span class=\"lineno\">  313</span>&#160;        <span class=\"comment\">// xzz</span></div>\n<div class=\"line\"><a name=\"l00314\"></a><span class=\"lineno\">  314</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00315\"></a><span class=\"lineno\">  315</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00316\"></a><span class=\"lineno\">  316</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00317\"></a><span class=\"lineno\">  317</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00318\"></a><span class=\"lineno\">  318</span>&#160;</div>\n<div class=\"line\"><a name=\"l00319\"></a><span class=\"lineno\">  319</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00320\"></a><span class=\"lineno\">  320</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00321\"></a><span class=\"lineno\">  321</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00322\"></a><span class=\"lineno\">  322</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00323\"></a><span class=\"lineno\">  323</span>&#160;</div>\n<div class=\"line\"><a name=\"l00324\"></a><span class=\"lineno\">  324</span>&#160;        <span class=\"comment\">// xzw</span></div>\n<div class=\"line\"><a name=\"l00325\"></a><span class=\"lineno\">  325</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00326\"></a><span class=\"lineno\">  326</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00327\"></a><span class=\"lineno\">  327</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l00328\"></a><span class=\"lineno\">  328</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00329\"></a><span class=\"lineno\">  329</span>&#160;</div>\n<div class=\"line\"><a name=\"l00330\"></a><span class=\"lineno\">  330</span>&#160;        <span class=\"comment\">// xwx</span></div>\n<div class=\"line\"><a name=\"l00331\"></a><span class=\"lineno\">  331</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00332\"></a><span class=\"lineno\">  332</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00333\"></a><span class=\"lineno\">  333</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l00334\"></a><span class=\"lineno\">  334</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00335\"></a><span class=\"lineno\">  335</span>&#160;</div>\n<div class=\"line\"><a name=\"l00336\"></a><span class=\"lineno\">  336</span>&#160;        <span class=\"comment\">// xwy</span></div>\n<div class=\"line\"><a name=\"l00337\"></a><span class=\"lineno\">  337</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00338\"></a><span class=\"lineno\">  338</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00339\"></a><span class=\"lineno\">  339</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l00340\"></a><span class=\"lineno\">  340</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00341\"></a><span class=\"lineno\">  341</span>&#160;</div>\n<div class=\"line\"><a name=\"l00342\"></a><span class=\"lineno\">  342</span>&#160;        <span class=\"comment\">// xwz</span></div>\n<div class=\"line\"><a name=\"l00343\"></a><span class=\"lineno\">  343</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00344\"></a><span class=\"lineno\">  344</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00345\"></a><span class=\"lineno\">  345</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l00346\"></a><span class=\"lineno\">  346</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00347\"></a><span class=\"lineno\">  347</span>&#160;</div>\n<div class=\"line\"><a name=\"l00348\"></a><span class=\"lineno\">  348</span>&#160;        <span class=\"comment\">// xww</span></div>\n<div class=\"line\"><a name=\"l00349\"></a><span class=\"lineno\">  349</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00350\"></a><span class=\"lineno\">  350</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; xww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00351\"></a><span class=\"lineno\">  351</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.x, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l00352\"></a><span class=\"lineno\">  352</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00353\"></a><span class=\"lineno\">  353</span>&#160;</div>\n<div class=\"line\"><a name=\"l00354\"></a><span class=\"lineno\">  354</span>&#160;        <span class=\"comment\">// yxx</span></div>\n<div class=\"line\"><a name=\"l00355\"></a><span class=\"lineno\">  355</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00356\"></a><span class=\"lineno\">  356</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00357\"></a><span class=\"lineno\">  357</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00358\"></a><span class=\"lineno\">  358</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00359\"></a><span class=\"lineno\">  359</span>&#160;</div>\n<div class=\"line\"><a name=\"l00360\"></a><span class=\"lineno\">  360</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00361\"></a><span class=\"lineno\">  361</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00362\"></a><span class=\"lineno\">  362</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00363\"></a><span class=\"lineno\">  363</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00364\"></a><span class=\"lineno\">  364</span>&#160;</div>\n<div class=\"line\"><a name=\"l00365\"></a><span class=\"lineno\">  365</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00366\"></a><span class=\"lineno\">  366</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00367\"></a><span class=\"lineno\">  367</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00368\"></a><span class=\"lineno\">  368</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00369\"></a><span class=\"lineno\">  369</span>&#160;</div>\n<div class=\"line\"><a name=\"l00370\"></a><span class=\"lineno\">  370</span>&#160;        <span class=\"comment\">// yxy</span></div>\n<div class=\"line\"><a name=\"l00371\"></a><span class=\"lineno\">  371</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00372\"></a><span class=\"lineno\">  372</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00373\"></a><span class=\"lineno\">  373</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00374\"></a><span class=\"lineno\">  374</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00375\"></a><span class=\"lineno\">  375</span>&#160;</div>\n<div class=\"line\"><a name=\"l00376\"></a><span class=\"lineno\">  376</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00377\"></a><span class=\"lineno\">  377</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00378\"></a><span class=\"lineno\">  378</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00379\"></a><span class=\"lineno\">  379</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00380\"></a><span class=\"lineno\">  380</span>&#160;</div>\n<div class=\"line\"><a name=\"l00381\"></a><span class=\"lineno\">  381</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00382\"></a><span class=\"lineno\">  382</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00383\"></a><span class=\"lineno\">  383</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00384\"></a><span class=\"lineno\">  384</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00385\"></a><span class=\"lineno\">  385</span>&#160;</div>\n<div class=\"line\"><a name=\"l00386\"></a><span class=\"lineno\">  386</span>&#160;        <span class=\"comment\">// yxz</span></div>\n<div class=\"line\"><a name=\"l00387\"></a><span class=\"lineno\">  387</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00388\"></a><span class=\"lineno\">  388</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00389\"></a><span class=\"lineno\">  389</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00390\"></a><span class=\"lineno\">  390</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00391\"></a><span class=\"lineno\">  391</span>&#160;</div>\n<div class=\"line\"><a name=\"l00392\"></a><span class=\"lineno\">  392</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00393\"></a><span class=\"lineno\">  393</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00394\"></a><span class=\"lineno\">  394</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00395\"></a><span class=\"lineno\">  395</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00396\"></a><span class=\"lineno\">  396</span>&#160;</div>\n<div class=\"line\"><a name=\"l00397\"></a><span class=\"lineno\">  397</span>&#160;        <span class=\"comment\">// yxw</span></div>\n<div class=\"line\"><a name=\"l00398\"></a><span class=\"lineno\">  398</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00399\"></a><span class=\"lineno\">  399</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00400\"></a><span class=\"lineno\">  400</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l00401\"></a><span class=\"lineno\">  401</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00402\"></a><span class=\"lineno\">  402</span>&#160;</div>\n<div class=\"line\"><a name=\"l00403\"></a><span class=\"lineno\">  403</span>&#160;        <span class=\"comment\">// yyx</span></div>\n<div class=\"line\"><a name=\"l00404\"></a><span class=\"lineno\">  404</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00405\"></a><span class=\"lineno\">  405</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00406\"></a><span class=\"lineno\">  406</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00407\"></a><span class=\"lineno\">  407</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00408\"></a><span class=\"lineno\">  408</span>&#160;</div>\n<div class=\"line\"><a name=\"l00409\"></a><span class=\"lineno\">  409</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00410\"></a><span class=\"lineno\">  410</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00411\"></a><span class=\"lineno\">  411</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00412\"></a><span class=\"lineno\">  412</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00413\"></a><span class=\"lineno\">  413</span>&#160;</div>\n<div class=\"line\"><a name=\"l00414\"></a><span class=\"lineno\">  414</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00415\"></a><span class=\"lineno\">  415</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00416\"></a><span class=\"lineno\">  416</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00417\"></a><span class=\"lineno\">  417</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00418\"></a><span class=\"lineno\">  418</span>&#160;</div>\n<div class=\"line\"><a name=\"l00419\"></a><span class=\"lineno\">  419</span>&#160;        <span class=\"comment\">// yyy</span></div>\n<div class=\"line\"><a name=\"l00420\"></a><span class=\"lineno\">  420</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00421\"></a><span class=\"lineno\">  421</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00422\"></a><span class=\"lineno\">  422</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00423\"></a><span class=\"lineno\">  423</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00424\"></a><span class=\"lineno\">  424</span>&#160;</div>\n<div class=\"line\"><a name=\"l00425\"></a><span class=\"lineno\">  425</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00426\"></a><span class=\"lineno\">  426</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00427\"></a><span class=\"lineno\">  427</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00428\"></a><span class=\"lineno\">  428</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00429\"></a><span class=\"lineno\">  429</span>&#160;</div>\n<div class=\"line\"><a name=\"l00430\"></a><span class=\"lineno\">  430</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00431\"></a><span class=\"lineno\">  431</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00432\"></a><span class=\"lineno\">  432</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00433\"></a><span class=\"lineno\">  433</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00434\"></a><span class=\"lineno\">  434</span>&#160;</div>\n<div class=\"line\"><a name=\"l00435\"></a><span class=\"lineno\">  435</span>&#160;        <span class=\"comment\">// yyz</span></div>\n<div class=\"line\"><a name=\"l00436\"></a><span class=\"lineno\">  436</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00437\"></a><span class=\"lineno\">  437</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00438\"></a><span class=\"lineno\">  438</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00439\"></a><span class=\"lineno\">  439</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00440\"></a><span class=\"lineno\">  440</span>&#160;</div>\n<div class=\"line\"><a name=\"l00441\"></a><span class=\"lineno\">  441</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00442\"></a><span class=\"lineno\">  442</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00443\"></a><span class=\"lineno\">  443</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00444\"></a><span class=\"lineno\">  444</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00445\"></a><span class=\"lineno\">  445</span>&#160;</div>\n<div class=\"line\"><a name=\"l00446\"></a><span class=\"lineno\">  446</span>&#160;        <span class=\"comment\">// yyw</span></div>\n<div class=\"line\"><a name=\"l00447\"></a><span class=\"lineno\">  447</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00448\"></a><span class=\"lineno\">  448</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00449\"></a><span class=\"lineno\">  449</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l00450\"></a><span class=\"lineno\">  450</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00451\"></a><span class=\"lineno\">  451</span>&#160;</div>\n<div class=\"line\"><a name=\"l00452\"></a><span class=\"lineno\">  452</span>&#160;        <span class=\"comment\">// yzx</span></div>\n<div class=\"line\"><a name=\"l00453\"></a><span class=\"lineno\">  453</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00454\"></a><span class=\"lineno\">  454</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00455\"></a><span class=\"lineno\">  455</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00456\"></a><span class=\"lineno\">  456</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00457\"></a><span class=\"lineno\">  457</span>&#160;</div>\n<div class=\"line\"><a name=\"l00458\"></a><span class=\"lineno\">  458</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00459\"></a><span class=\"lineno\">  459</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00460\"></a><span class=\"lineno\">  460</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00461\"></a><span class=\"lineno\">  461</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00462\"></a><span class=\"lineno\">  462</span>&#160;</div>\n<div class=\"line\"><a name=\"l00463\"></a><span class=\"lineno\">  463</span>&#160;        <span class=\"comment\">// yzy</span></div>\n<div class=\"line\"><a name=\"l00464\"></a><span class=\"lineno\">  464</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00465\"></a><span class=\"lineno\">  465</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00466\"></a><span class=\"lineno\">  466</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00467\"></a><span class=\"lineno\">  467</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00468\"></a><span class=\"lineno\">  468</span>&#160;</div>\n<div class=\"line\"><a name=\"l00469\"></a><span class=\"lineno\">  469</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00470\"></a><span class=\"lineno\">  470</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00471\"></a><span class=\"lineno\">  471</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00472\"></a><span class=\"lineno\">  472</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00473\"></a><span class=\"lineno\">  473</span>&#160;</div>\n<div class=\"line\"><a name=\"l00474\"></a><span class=\"lineno\">  474</span>&#160;        <span class=\"comment\">// yzz</span></div>\n<div class=\"line\"><a name=\"l00475\"></a><span class=\"lineno\">  475</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00476\"></a><span class=\"lineno\">  476</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00477\"></a><span class=\"lineno\">  477</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00478\"></a><span class=\"lineno\">  478</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00479\"></a><span class=\"lineno\">  479</span>&#160;</div>\n<div class=\"line\"><a name=\"l00480\"></a><span class=\"lineno\">  480</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00481\"></a><span class=\"lineno\">  481</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00482\"></a><span class=\"lineno\">  482</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00483\"></a><span class=\"lineno\">  483</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00484\"></a><span class=\"lineno\">  484</span>&#160;</div>\n<div class=\"line\"><a name=\"l00485\"></a><span class=\"lineno\">  485</span>&#160;        <span class=\"comment\">// yzw</span></div>\n<div class=\"line\"><a name=\"l00486\"></a><span class=\"lineno\">  486</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00487\"></a><span class=\"lineno\">  487</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00488\"></a><span class=\"lineno\">  488</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l00489\"></a><span class=\"lineno\">  489</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00490\"></a><span class=\"lineno\">  490</span>&#160;</div>\n<div class=\"line\"><a name=\"l00491\"></a><span class=\"lineno\">  491</span>&#160;        <span class=\"comment\">// ywx</span></div>\n<div class=\"line\"><a name=\"l00492\"></a><span class=\"lineno\">  492</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00493\"></a><span class=\"lineno\">  493</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; ywx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00494\"></a><span class=\"lineno\">  494</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l00495\"></a><span class=\"lineno\">  495</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00496\"></a><span class=\"lineno\">  496</span>&#160;</div>\n<div class=\"line\"><a name=\"l00497\"></a><span class=\"lineno\">  497</span>&#160;        <span class=\"comment\">// ywy</span></div>\n<div class=\"line\"><a name=\"l00498\"></a><span class=\"lineno\">  498</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00499\"></a><span class=\"lineno\">  499</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; ywy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00500\"></a><span class=\"lineno\">  500</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l00501\"></a><span class=\"lineno\">  501</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00502\"></a><span class=\"lineno\">  502</span>&#160;</div>\n<div class=\"line\"><a name=\"l00503\"></a><span class=\"lineno\">  503</span>&#160;        <span class=\"comment\">// ywz</span></div>\n<div class=\"line\"><a name=\"l00504\"></a><span class=\"lineno\">  504</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00505\"></a><span class=\"lineno\">  505</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; ywz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00506\"></a><span class=\"lineno\">  506</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l00507\"></a><span class=\"lineno\">  507</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00508\"></a><span class=\"lineno\">  508</span>&#160;</div>\n<div class=\"line\"><a name=\"l00509\"></a><span class=\"lineno\">  509</span>&#160;        <span class=\"comment\">// yww</span></div>\n<div class=\"line\"><a name=\"l00510\"></a><span class=\"lineno\">  510</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00511\"></a><span class=\"lineno\">  511</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; yww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00512\"></a><span class=\"lineno\">  512</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.y, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l00513\"></a><span class=\"lineno\">  513</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00514\"></a><span class=\"lineno\">  514</span>&#160;</div>\n<div class=\"line\"><a name=\"l00515\"></a><span class=\"lineno\">  515</span>&#160;        <span class=\"comment\">// zxx</span></div>\n<div class=\"line\"><a name=\"l00516\"></a><span class=\"lineno\">  516</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00517\"></a><span class=\"lineno\">  517</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00518\"></a><span class=\"lineno\">  518</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00519\"></a><span class=\"lineno\">  519</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00520\"></a><span class=\"lineno\">  520</span>&#160;</div>\n<div class=\"line\"><a name=\"l00521\"></a><span class=\"lineno\">  521</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00522\"></a><span class=\"lineno\">  522</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00523\"></a><span class=\"lineno\">  523</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00524\"></a><span class=\"lineno\">  524</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00525\"></a><span class=\"lineno\">  525</span>&#160;</div>\n<div class=\"line\"><a name=\"l00526\"></a><span class=\"lineno\">  526</span>&#160;        <span class=\"comment\">// zxy</span></div>\n<div class=\"line\"><a name=\"l00527\"></a><span class=\"lineno\">  527</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00528\"></a><span class=\"lineno\">  528</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00529\"></a><span class=\"lineno\">  529</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00530\"></a><span class=\"lineno\">  530</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00531\"></a><span class=\"lineno\">  531</span>&#160;</div>\n<div class=\"line\"><a name=\"l00532\"></a><span class=\"lineno\">  532</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00533\"></a><span class=\"lineno\">  533</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00534\"></a><span class=\"lineno\">  534</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00535\"></a><span class=\"lineno\">  535</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00536\"></a><span class=\"lineno\">  536</span>&#160;</div>\n<div class=\"line\"><a name=\"l00537\"></a><span class=\"lineno\">  537</span>&#160;        <span class=\"comment\">// zxz</span></div>\n<div class=\"line\"><a name=\"l00538\"></a><span class=\"lineno\">  538</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00539\"></a><span class=\"lineno\">  539</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00540\"></a><span class=\"lineno\">  540</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00541\"></a><span class=\"lineno\">  541</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00542\"></a><span class=\"lineno\">  542</span>&#160;</div>\n<div class=\"line\"><a name=\"l00543\"></a><span class=\"lineno\">  543</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00544\"></a><span class=\"lineno\">  544</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00545\"></a><span class=\"lineno\">  545</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00546\"></a><span class=\"lineno\">  546</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00547\"></a><span class=\"lineno\">  547</span>&#160;</div>\n<div class=\"line\"><a name=\"l00548\"></a><span class=\"lineno\">  548</span>&#160;        <span class=\"comment\">// zxw</span></div>\n<div class=\"line\"><a name=\"l00549\"></a><span class=\"lineno\">  549</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00550\"></a><span class=\"lineno\">  550</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00551\"></a><span class=\"lineno\">  551</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l00552\"></a><span class=\"lineno\">  552</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00553\"></a><span class=\"lineno\">  553</span>&#160;</div>\n<div class=\"line\"><a name=\"l00554\"></a><span class=\"lineno\">  554</span>&#160;        <span class=\"comment\">// zyx</span></div>\n<div class=\"line\"><a name=\"l00555\"></a><span class=\"lineno\">  555</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00556\"></a><span class=\"lineno\">  556</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00557\"></a><span class=\"lineno\">  557</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00558\"></a><span class=\"lineno\">  558</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00559\"></a><span class=\"lineno\">  559</span>&#160;</div>\n<div class=\"line\"><a name=\"l00560\"></a><span class=\"lineno\">  560</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00561\"></a><span class=\"lineno\">  561</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00562\"></a><span class=\"lineno\">  562</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00563\"></a><span class=\"lineno\">  563</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00564\"></a><span class=\"lineno\">  564</span>&#160;</div>\n<div class=\"line\"><a name=\"l00565\"></a><span class=\"lineno\">  565</span>&#160;        <span class=\"comment\">// zyy</span></div>\n<div class=\"line\"><a name=\"l00566\"></a><span class=\"lineno\">  566</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00567\"></a><span class=\"lineno\">  567</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00568\"></a><span class=\"lineno\">  568</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00569\"></a><span class=\"lineno\">  569</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00570\"></a><span class=\"lineno\">  570</span>&#160;</div>\n<div class=\"line\"><a name=\"l00571\"></a><span class=\"lineno\">  571</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00572\"></a><span class=\"lineno\">  572</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00573\"></a><span class=\"lineno\">  573</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00574\"></a><span class=\"lineno\">  574</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00575\"></a><span class=\"lineno\">  575</span>&#160;</div>\n<div class=\"line\"><a name=\"l00576\"></a><span class=\"lineno\">  576</span>&#160;        <span class=\"comment\">// zyz</span></div>\n<div class=\"line\"><a name=\"l00577\"></a><span class=\"lineno\">  577</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00578\"></a><span class=\"lineno\">  578</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00579\"></a><span class=\"lineno\">  579</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00580\"></a><span class=\"lineno\">  580</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00581\"></a><span class=\"lineno\">  581</span>&#160;</div>\n<div class=\"line\"><a name=\"l00582\"></a><span class=\"lineno\">  582</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00583\"></a><span class=\"lineno\">  583</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00584\"></a><span class=\"lineno\">  584</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00585\"></a><span class=\"lineno\">  585</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00586\"></a><span class=\"lineno\">  586</span>&#160;</div>\n<div class=\"line\"><a name=\"l00587\"></a><span class=\"lineno\">  587</span>&#160;        <span class=\"comment\">// zyw</span></div>\n<div class=\"line\"><a name=\"l00588\"></a><span class=\"lineno\">  588</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00589\"></a><span class=\"lineno\">  589</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00590\"></a><span class=\"lineno\">  590</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l00591\"></a><span class=\"lineno\">  591</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00592\"></a><span class=\"lineno\">  592</span>&#160;</div>\n<div class=\"line\"><a name=\"l00593\"></a><span class=\"lineno\">  593</span>&#160;        <span class=\"comment\">// zzx</span></div>\n<div class=\"line\"><a name=\"l00594\"></a><span class=\"lineno\">  594</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00595\"></a><span class=\"lineno\">  595</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00596\"></a><span class=\"lineno\">  596</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00597\"></a><span class=\"lineno\">  597</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00598\"></a><span class=\"lineno\">  598</span>&#160;</div>\n<div class=\"line\"><a name=\"l00599\"></a><span class=\"lineno\">  599</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00600\"></a><span class=\"lineno\">  600</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00601\"></a><span class=\"lineno\">  601</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00602\"></a><span class=\"lineno\">  602</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00603\"></a><span class=\"lineno\">  603</span>&#160;</div>\n<div class=\"line\"><a name=\"l00604\"></a><span class=\"lineno\">  604</span>&#160;        <span class=\"comment\">// zzy</span></div>\n<div class=\"line\"><a name=\"l00605\"></a><span class=\"lineno\">  605</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00606\"></a><span class=\"lineno\">  606</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00607\"></a><span class=\"lineno\">  607</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00608\"></a><span class=\"lineno\">  608</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00609\"></a><span class=\"lineno\">  609</span>&#160;</div>\n<div class=\"line\"><a name=\"l00610\"></a><span class=\"lineno\">  610</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00611\"></a><span class=\"lineno\">  611</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00612\"></a><span class=\"lineno\">  612</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00613\"></a><span class=\"lineno\">  613</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00614\"></a><span class=\"lineno\">  614</span>&#160;</div>\n<div class=\"line\"><a name=\"l00615\"></a><span class=\"lineno\">  615</span>&#160;        <span class=\"comment\">// zzz</span></div>\n<div class=\"line\"><a name=\"l00616\"></a><span class=\"lineno\">  616</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00617\"></a><span class=\"lineno\">  617</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00618\"></a><span class=\"lineno\">  618</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00619\"></a><span class=\"lineno\">  619</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00620\"></a><span class=\"lineno\">  620</span>&#160;</div>\n<div class=\"line\"><a name=\"l00621\"></a><span class=\"lineno\">  621</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00622\"></a><span class=\"lineno\">  622</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00623\"></a><span class=\"lineno\">  623</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00624\"></a><span class=\"lineno\">  624</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00625\"></a><span class=\"lineno\">  625</span>&#160;</div>\n<div class=\"line\"><a name=\"l00626\"></a><span class=\"lineno\">  626</span>&#160;        <span class=\"comment\">// zzw</span></div>\n<div class=\"line\"><a name=\"l00627\"></a><span class=\"lineno\">  627</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00628\"></a><span class=\"lineno\">  628</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00629\"></a><span class=\"lineno\">  629</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l00630\"></a><span class=\"lineno\">  630</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00631\"></a><span class=\"lineno\">  631</span>&#160;</div>\n<div class=\"line\"><a name=\"l00632\"></a><span class=\"lineno\">  632</span>&#160;        <span class=\"comment\">// zwx</span></div>\n<div class=\"line\"><a name=\"l00633\"></a><span class=\"lineno\">  633</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00634\"></a><span class=\"lineno\">  634</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00635\"></a><span class=\"lineno\">  635</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l00636\"></a><span class=\"lineno\">  636</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00637\"></a><span class=\"lineno\">  637</span>&#160;</div>\n<div class=\"line\"><a name=\"l00638\"></a><span class=\"lineno\">  638</span>&#160;        <span class=\"comment\">// zwy</span></div>\n<div class=\"line\"><a name=\"l00639\"></a><span class=\"lineno\">  639</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00640\"></a><span class=\"lineno\">  640</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00641\"></a><span class=\"lineno\">  641</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l00642\"></a><span class=\"lineno\">  642</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00643\"></a><span class=\"lineno\">  643</span>&#160;</div>\n<div class=\"line\"><a name=\"l00644\"></a><span class=\"lineno\">  644</span>&#160;        <span class=\"comment\">// zwz</span></div>\n<div class=\"line\"><a name=\"l00645\"></a><span class=\"lineno\">  645</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00646\"></a><span class=\"lineno\">  646</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00647\"></a><span class=\"lineno\">  647</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l00648\"></a><span class=\"lineno\">  648</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00649\"></a><span class=\"lineno\">  649</span>&#160;</div>\n<div class=\"line\"><a name=\"l00650\"></a><span class=\"lineno\">  650</span>&#160;        <span class=\"comment\">// zww</span></div>\n<div class=\"line\"><a name=\"l00651\"></a><span class=\"lineno\">  651</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00652\"></a><span class=\"lineno\">  652</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; zww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00653\"></a><span class=\"lineno\">  653</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.z, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l00654\"></a><span class=\"lineno\">  654</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00655\"></a><span class=\"lineno\">  655</span>&#160;</div>\n<div class=\"line\"><a name=\"l00656\"></a><span class=\"lineno\">  656</span>&#160;        <span class=\"comment\">// wxx</span></div>\n<div class=\"line\"><a name=\"l00657\"></a><span class=\"lineno\">  657</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00658\"></a><span class=\"lineno\">  658</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00659\"></a><span class=\"lineno\">  659</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00660\"></a><span class=\"lineno\">  660</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00661\"></a><span class=\"lineno\">  661</span>&#160;</div>\n<div class=\"line\"><a name=\"l00662\"></a><span class=\"lineno\">  662</span>&#160;        <span class=\"comment\">// wxy</span></div>\n<div class=\"line\"><a name=\"l00663\"></a><span class=\"lineno\">  663</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00664\"></a><span class=\"lineno\">  664</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00665\"></a><span class=\"lineno\">  665</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00666\"></a><span class=\"lineno\">  666</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00667\"></a><span class=\"lineno\">  667</span>&#160;</div>\n<div class=\"line\"><a name=\"l00668\"></a><span class=\"lineno\">  668</span>&#160;        <span class=\"comment\">// wxz</span></div>\n<div class=\"line\"><a name=\"l00669\"></a><span class=\"lineno\">  669</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00670\"></a><span class=\"lineno\">  670</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00671\"></a><span class=\"lineno\">  671</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00672\"></a><span class=\"lineno\">  672</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00673\"></a><span class=\"lineno\">  673</span>&#160;</div>\n<div class=\"line\"><a name=\"l00674\"></a><span class=\"lineno\">  674</span>&#160;        <span class=\"comment\">// wxw</span></div>\n<div class=\"line\"><a name=\"l00675\"></a><span class=\"lineno\">  675</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00676\"></a><span class=\"lineno\">  676</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00677\"></a><span class=\"lineno\">  677</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l00678\"></a><span class=\"lineno\">  678</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00679\"></a><span class=\"lineno\">  679</span>&#160;</div>\n<div class=\"line\"><a name=\"l00680\"></a><span class=\"lineno\">  680</span>&#160;        <span class=\"comment\">// wyx</span></div>\n<div class=\"line\"><a name=\"l00681\"></a><span class=\"lineno\">  681</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00682\"></a><span class=\"lineno\">  682</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00683\"></a><span class=\"lineno\">  683</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00684\"></a><span class=\"lineno\">  684</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00685\"></a><span class=\"lineno\">  685</span>&#160;</div>\n<div class=\"line\"><a name=\"l00686\"></a><span class=\"lineno\">  686</span>&#160;        <span class=\"comment\">// wyy</span></div>\n<div class=\"line\"><a name=\"l00687\"></a><span class=\"lineno\">  687</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00688\"></a><span class=\"lineno\">  688</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00689\"></a><span class=\"lineno\">  689</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00690\"></a><span class=\"lineno\">  690</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00691\"></a><span class=\"lineno\">  691</span>&#160;</div>\n<div class=\"line\"><a name=\"l00692\"></a><span class=\"lineno\">  692</span>&#160;        <span class=\"comment\">// wyz</span></div>\n<div class=\"line\"><a name=\"l00693\"></a><span class=\"lineno\">  693</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00694\"></a><span class=\"lineno\">  694</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00695\"></a><span class=\"lineno\">  695</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00696\"></a><span class=\"lineno\">  696</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00697\"></a><span class=\"lineno\">  697</span>&#160;</div>\n<div class=\"line\"><a name=\"l00698\"></a><span class=\"lineno\">  698</span>&#160;        <span class=\"comment\">// wyw</span></div>\n<div class=\"line\"><a name=\"l00699\"></a><span class=\"lineno\">  699</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00700\"></a><span class=\"lineno\">  700</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00701\"></a><span class=\"lineno\">  701</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l00702\"></a><span class=\"lineno\">  702</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00703\"></a><span class=\"lineno\">  703</span>&#160;</div>\n<div class=\"line\"><a name=\"l00704\"></a><span class=\"lineno\">  704</span>&#160;        <span class=\"comment\">// wzx</span></div>\n<div class=\"line\"><a name=\"l00705\"></a><span class=\"lineno\">  705</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00706\"></a><span class=\"lineno\">  706</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00707\"></a><span class=\"lineno\">  707</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00708\"></a><span class=\"lineno\">  708</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00709\"></a><span class=\"lineno\">  709</span>&#160;</div>\n<div class=\"line\"><a name=\"l00710\"></a><span class=\"lineno\">  710</span>&#160;        <span class=\"comment\">// wzy</span></div>\n<div class=\"line\"><a name=\"l00711\"></a><span class=\"lineno\">  711</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00712\"></a><span class=\"lineno\">  712</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00713\"></a><span class=\"lineno\">  713</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00714\"></a><span class=\"lineno\">  714</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00715\"></a><span class=\"lineno\">  715</span>&#160;</div>\n<div class=\"line\"><a name=\"l00716\"></a><span class=\"lineno\">  716</span>&#160;        <span class=\"comment\">// wzz</span></div>\n<div class=\"line\"><a name=\"l00717\"></a><span class=\"lineno\">  717</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00718\"></a><span class=\"lineno\">  718</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00719\"></a><span class=\"lineno\">  719</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00720\"></a><span class=\"lineno\">  720</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00721\"></a><span class=\"lineno\">  721</span>&#160;</div>\n<div class=\"line\"><a name=\"l00722\"></a><span class=\"lineno\">  722</span>&#160;        <span class=\"comment\">// wzw</span></div>\n<div class=\"line\"><a name=\"l00723\"></a><span class=\"lineno\">  723</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00724\"></a><span class=\"lineno\">  724</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00725\"></a><span class=\"lineno\">  725</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l00726\"></a><span class=\"lineno\">  726</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00727\"></a><span class=\"lineno\">  727</span>&#160;</div>\n<div class=\"line\"><a name=\"l00728\"></a><span class=\"lineno\">  728</span>&#160;        <span class=\"comment\">// wwx</span></div>\n<div class=\"line\"><a name=\"l00729\"></a><span class=\"lineno\">  729</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00730\"></a><span class=\"lineno\">  730</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00731\"></a><span class=\"lineno\">  731</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l00732\"></a><span class=\"lineno\">  732</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00733\"></a><span class=\"lineno\">  733</span>&#160;</div>\n<div class=\"line\"><a name=\"l00734\"></a><span class=\"lineno\">  734</span>&#160;        <span class=\"comment\">// wwy</span></div>\n<div class=\"line\"><a name=\"l00735\"></a><span class=\"lineno\">  735</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00736\"></a><span class=\"lineno\">  736</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00737\"></a><span class=\"lineno\">  737</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l00738\"></a><span class=\"lineno\">  738</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00739\"></a><span class=\"lineno\">  739</span>&#160;</div>\n<div class=\"line\"><a name=\"l00740\"></a><span class=\"lineno\">  740</span>&#160;        <span class=\"comment\">// wwz</span></div>\n<div class=\"line\"><a name=\"l00741\"></a><span class=\"lineno\">  741</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00742\"></a><span class=\"lineno\">  742</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; wwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00743\"></a><span class=\"lineno\">  743</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l00744\"></a><span class=\"lineno\">  744</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00745\"></a><span class=\"lineno\">  745</span>&#160;</div>\n<div class=\"line\"><a name=\"l00746\"></a><span class=\"lineno\">  746</span>&#160;        <span class=\"comment\">// www</span></div>\n<div class=\"line\"><a name=\"l00747\"></a><span class=\"lineno\">  747</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00748\"></a><span class=\"lineno\">  748</span>&#160;        GLM_INLINE glm::vec&lt;3, T, Q&gt; www(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00749\"></a><span class=\"lineno\">  749</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;3, T, Q&gt;(v.w, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l00750\"></a><span class=\"lineno\">  750</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00751\"></a><span class=\"lineno\">  751</span>&#160;</div>\n<div class=\"line\"><a name=\"l00752\"></a><span class=\"lineno\">  752</span>&#160;        <span class=\"comment\">// xxxx</span></div>\n<div class=\"line\"><a name=\"l00753\"></a><span class=\"lineno\">  753</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00754\"></a><span class=\"lineno\">  754</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxx(<span class=\"keyword\">const</span> glm::vec&lt;1, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00755\"></a><span class=\"lineno\">  755</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00756\"></a><span class=\"lineno\">  756</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00757\"></a><span class=\"lineno\">  757</span>&#160;</div>\n<div class=\"line\"><a name=\"l00758\"></a><span class=\"lineno\">  758</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00759\"></a><span class=\"lineno\">  759</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00760\"></a><span class=\"lineno\">  760</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00761\"></a><span class=\"lineno\">  761</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00762\"></a><span class=\"lineno\">  762</span>&#160;</div>\n<div class=\"line\"><a name=\"l00763\"></a><span class=\"lineno\">  763</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00764\"></a><span class=\"lineno\">  764</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00765\"></a><span class=\"lineno\">  765</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00766\"></a><span class=\"lineno\">  766</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00767\"></a><span class=\"lineno\">  767</span>&#160;</div>\n<div class=\"line\"><a name=\"l00768\"></a><span class=\"lineno\">  768</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00769\"></a><span class=\"lineno\">  769</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00770\"></a><span class=\"lineno\">  770</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00771\"></a><span class=\"lineno\">  771</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00772\"></a><span class=\"lineno\">  772</span>&#160;</div>\n<div class=\"line\"><a name=\"l00773\"></a><span class=\"lineno\">  773</span>&#160;        <span class=\"comment\">// xxxy</span></div>\n<div class=\"line\"><a name=\"l00774\"></a><span class=\"lineno\">  774</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00775\"></a><span class=\"lineno\">  775</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00776\"></a><span class=\"lineno\">  776</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00777\"></a><span class=\"lineno\">  777</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00778\"></a><span class=\"lineno\">  778</span>&#160;</div>\n<div class=\"line\"><a name=\"l00779\"></a><span class=\"lineno\">  779</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00780\"></a><span class=\"lineno\">  780</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00781\"></a><span class=\"lineno\">  781</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00782\"></a><span class=\"lineno\">  782</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00783\"></a><span class=\"lineno\">  783</span>&#160;</div>\n<div class=\"line\"><a name=\"l00784\"></a><span class=\"lineno\">  784</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00785\"></a><span class=\"lineno\">  785</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00786\"></a><span class=\"lineno\">  786</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00787\"></a><span class=\"lineno\">  787</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00788\"></a><span class=\"lineno\">  788</span>&#160;</div>\n<div class=\"line\"><a name=\"l00789\"></a><span class=\"lineno\">  789</span>&#160;        <span class=\"comment\">// xxxz</span></div>\n<div class=\"line\"><a name=\"l00790\"></a><span class=\"lineno\">  790</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00791\"></a><span class=\"lineno\">  791</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00792\"></a><span class=\"lineno\">  792</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00793\"></a><span class=\"lineno\">  793</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00794\"></a><span class=\"lineno\">  794</span>&#160;</div>\n<div class=\"line\"><a name=\"l00795\"></a><span class=\"lineno\">  795</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00796\"></a><span class=\"lineno\">  796</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00797\"></a><span class=\"lineno\">  797</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00798\"></a><span class=\"lineno\">  798</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00799\"></a><span class=\"lineno\">  799</span>&#160;</div>\n<div class=\"line\"><a name=\"l00800\"></a><span class=\"lineno\">  800</span>&#160;        <span class=\"comment\">// xxxw</span></div>\n<div class=\"line\"><a name=\"l00801\"></a><span class=\"lineno\">  801</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00802\"></a><span class=\"lineno\">  802</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00803\"></a><span class=\"lineno\">  803</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l00804\"></a><span class=\"lineno\">  804</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00805\"></a><span class=\"lineno\">  805</span>&#160;</div>\n<div class=\"line\"><a name=\"l00806\"></a><span class=\"lineno\">  806</span>&#160;        <span class=\"comment\">// xxyx</span></div>\n<div class=\"line\"><a name=\"l00807\"></a><span class=\"lineno\">  807</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00808\"></a><span class=\"lineno\">  808</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00809\"></a><span class=\"lineno\">  809</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00810\"></a><span class=\"lineno\">  810</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00811\"></a><span class=\"lineno\">  811</span>&#160;</div>\n<div class=\"line\"><a name=\"l00812\"></a><span class=\"lineno\">  812</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00813\"></a><span class=\"lineno\">  813</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00814\"></a><span class=\"lineno\">  814</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00815\"></a><span class=\"lineno\">  815</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00816\"></a><span class=\"lineno\">  816</span>&#160;</div>\n<div class=\"line\"><a name=\"l00817\"></a><span class=\"lineno\">  817</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00818\"></a><span class=\"lineno\">  818</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00819\"></a><span class=\"lineno\">  819</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00820\"></a><span class=\"lineno\">  820</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00821\"></a><span class=\"lineno\">  821</span>&#160;</div>\n<div class=\"line\"><a name=\"l00822\"></a><span class=\"lineno\">  822</span>&#160;        <span class=\"comment\">// xxyy</span></div>\n<div class=\"line\"><a name=\"l00823\"></a><span class=\"lineno\">  823</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00824\"></a><span class=\"lineno\">  824</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00825\"></a><span class=\"lineno\">  825</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00826\"></a><span class=\"lineno\">  826</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00827\"></a><span class=\"lineno\">  827</span>&#160;</div>\n<div class=\"line\"><a name=\"l00828\"></a><span class=\"lineno\">  828</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00829\"></a><span class=\"lineno\">  829</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00830\"></a><span class=\"lineno\">  830</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00831\"></a><span class=\"lineno\">  831</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00832\"></a><span class=\"lineno\">  832</span>&#160;</div>\n<div class=\"line\"><a name=\"l00833\"></a><span class=\"lineno\">  833</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00834\"></a><span class=\"lineno\">  834</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00835\"></a><span class=\"lineno\">  835</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00836\"></a><span class=\"lineno\">  836</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00837\"></a><span class=\"lineno\">  837</span>&#160;</div>\n<div class=\"line\"><a name=\"l00838\"></a><span class=\"lineno\">  838</span>&#160;        <span class=\"comment\">// xxyz</span></div>\n<div class=\"line\"><a name=\"l00839\"></a><span class=\"lineno\">  839</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00840\"></a><span class=\"lineno\">  840</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00841\"></a><span class=\"lineno\">  841</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00842\"></a><span class=\"lineno\">  842</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00843\"></a><span class=\"lineno\">  843</span>&#160;</div>\n<div class=\"line\"><a name=\"l00844\"></a><span class=\"lineno\">  844</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00845\"></a><span class=\"lineno\">  845</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00846\"></a><span class=\"lineno\">  846</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l00847\"></a><span class=\"lineno\">  847</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00848\"></a><span class=\"lineno\">  848</span>&#160;</div>\n<div class=\"line\"><a name=\"l00849\"></a><span class=\"lineno\">  849</span>&#160;        <span class=\"comment\">// xxyw</span></div>\n<div class=\"line\"><a name=\"l00850\"></a><span class=\"lineno\">  850</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00851\"></a><span class=\"lineno\">  851</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00852\"></a><span class=\"lineno\">  852</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l00853\"></a><span class=\"lineno\">  853</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00854\"></a><span class=\"lineno\">  854</span>&#160;</div>\n<div class=\"line\"><a name=\"l00855\"></a><span class=\"lineno\">  855</span>&#160;        <span class=\"comment\">// xxzx</span></div>\n<div class=\"line\"><a name=\"l00856\"></a><span class=\"lineno\">  856</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00857\"></a><span class=\"lineno\">  857</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00858\"></a><span class=\"lineno\">  858</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00859\"></a><span class=\"lineno\">  859</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00860\"></a><span class=\"lineno\">  860</span>&#160;</div>\n<div class=\"line\"><a name=\"l00861\"></a><span class=\"lineno\">  861</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00862\"></a><span class=\"lineno\">  862</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00863\"></a><span class=\"lineno\">  863</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l00864\"></a><span class=\"lineno\">  864</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00865\"></a><span class=\"lineno\">  865</span>&#160;</div>\n<div class=\"line\"><a name=\"l00866\"></a><span class=\"lineno\">  866</span>&#160;        <span class=\"comment\">// xxzy</span></div>\n<div class=\"line\"><a name=\"l00867\"></a><span class=\"lineno\">  867</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00868\"></a><span class=\"lineno\">  868</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00869\"></a><span class=\"lineno\">  869</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00870\"></a><span class=\"lineno\">  870</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00871\"></a><span class=\"lineno\">  871</span>&#160;</div>\n<div class=\"line\"><a name=\"l00872\"></a><span class=\"lineno\">  872</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00873\"></a><span class=\"lineno\">  873</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00874\"></a><span class=\"lineno\">  874</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l00875\"></a><span class=\"lineno\">  875</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00876\"></a><span class=\"lineno\">  876</span>&#160;</div>\n<div class=\"line\"><a name=\"l00877\"></a><span class=\"lineno\">  877</span>&#160;        <span class=\"comment\">// xxzz</span></div>\n<div class=\"line\"><a name=\"l00878\"></a><span class=\"lineno\">  878</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00879\"></a><span class=\"lineno\">  879</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00880\"></a><span class=\"lineno\">  880</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00881\"></a><span class=\"lineno\">  881</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00882\"></a><span class=\"lineno\">  882</span>&#160;</div>\n<div class=\"line\"><a name=\"l00883\"></a><span class=\"lineno\">  883</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00884\"></a><span class=\"lineno\">  884</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00885\"></a><span class=\"lineno\">  885</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l00886\"></a><span class=\"lineno\">  886</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00887\"></a><span class=\"lineno\">  887</span>&#160;</div>\n<div class=\"line\"><a name=\"l00888\"></a><span class=\"lineno\">  888</span>&#160;        <span class=\"comment\">// xxzw</span></div>\n<div class=\"line\"><a name=\"l00889\"></a><span class=\"lineno\">  889</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00890\"></a><span class=\"lineno\">  890</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00891\"></a><span class=\"lineno\">  891</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l00892\"></a><span class=\"lineno\">  892</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00893\"></a><span class=\"lineno\">  893</span>&#160;</div>\n<div class=\"line\"><a name=\"l00894\"></a><span class=\"lineno\">  894</span>&#160;        <span class=\"comment\">// xxwx</span></div>\n<div class=\"line\"><a name=\"l00895\"></a><span class=\"lineno\">  895</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00896\"></a><span class=\"lineno\">  896</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00897\"></a><span class=\"lineno\">  897</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l00898\"></a><span class=\"lineno\">  898</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00899\"></a><span class=\"lineno\">  899</span>&#160;</div>\n<div class=\"line\"><a name=\"l00900\"></a><span class=\"lineno\">  900</span>&#160;        <span class=\"comment\">// xxwy</span></div>\n<div class=\"line\"><a name=\"l00901\"></a><span class=\"lineno\">  901</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00902\"></a><span class=\"lineno\">  902</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00903\"></a><span class=\"lineno\">  903</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l00904\"></a><span class=\"lineno\">  904</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00905\"></a><span class=\"lineno\">  905</span>&#160;</div>\n<div class=\"line\"><a name=\"l00906\"></a><span class=\"lineno\">  906</span>&#160;        <span class=\"comment\">// xxwz</span></div>\n<div class=\"line\"><a name=\"l00907\"></a><span class=\"lineno\">  907</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00908\"></a><span class=\"lineno\">  908</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00909\"></a><span class=\"lineno\">  909</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l00910\"></a><span class=\"lineno\">  910</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00911\"></a><span class=\"lineno\">  911</span>&#160;</div>\n<div class=\"line\"><a name=\"l00912\"></a><span class=\"lineno\">  912</span>&#160;        <span class=\"comment\">// xxww</span></div>\n<div class=\"line\"><a name=\"l00913\"></a><span class=\"lineno\">  913</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00914\"></a><span class=\"lineno\">  914</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xxww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00915\"></a><span class=\"lineno\">  915</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.x, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l00916\"></a><span class=\"lineno\">  916</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00917\"></a><span class=\"lineno\">  917</span>&#160;</div>\n<div class=\"line\"><a name=\"l00918\"></a><span class=\"lineno\">  918</span>&#160;        <span class=\"comment\">// xyxx</span></div>\n<div class=\"line\"><a name=\"l00919\"></a><span class=\"lineno\">  919</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00920\"></a><span class=\"lineno\">  920</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00921\"></a><span class=\"lineno\">  921</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00922\"></a><span class=\"lineno\">  922</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00923\"></a><span class=\"lineno\">  923</span>&#160;</div>\n<div class=\"line\"><a name=\"l00924\"></a><span class=\"lineno\">  924</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00925\"></a><span class=\"lineno\">  925</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00926\"></a><span class=\"lineno\">  926</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00927\"></a><span class=\"lineno\">  927</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00928\"></a><span class=\"lineno\">  928</span>&#160;</div>\n<div class=\"line\"><a name=\"l00929\"></a><span class=\"lineno\">  929</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00930\"></a><span class=\"lineno\">  930</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00931\"></a><span class=\"lineno\">  931</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l00932\"></a><span class=\"lineno\">  932</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00933\"></a><span class=\"lineno\">  933</span>&#160;</div>\n<div class=\"line\"><a name=\"l00934\"></a><span class=\"lineno\">  934</span>&#160;        <span class=\"comment\">// xyxy</span></div>\n<div class=\"line\"><a name=\"l00935\"></a><span class=\"lineno\">  935</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00936\"></a><span class=\"lineno\">  936</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00937\"></a><span class=\"lineno\">  937</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00938\"></a><span class=\"lineno\">  938</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00939\"></a><span class=\"lineno\">  939</span>&#160;</div>\n<div class=\"line\"><a name=\"l00940\"></a><span class=\"lineno\">  940</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00941\"></a><span class=\"lineno\">  941</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00942\"></a><span class=\"lineno\">  942</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00943\"></a><span class=\"lineno\">  943</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00944\"></a><span class=\"lineno\">  944</span>&#160;</div>\n<div class=\"line\"><a name=\"l00945\"></a><span class=\"lineno\">  945</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00946\"></a><span class=\"lineno\">  946</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00947\"></a><span class=\"lineno\">  947</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l00948\"></a><span class=\"lineno\">  948</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00949\"></a><span class=\"lineno\">  949</span>&#160;</div>\n<div class=\"line\"><a name=\"l00950\"></a><span class=\"lineno\">  950</span>&#160;        <span class=\"comment\">// xyxz</span></div>\n<div class=\"line\"><a name=\"l00951\"></a><span class=\"lineno\">  951</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00952\"></a><span class=\"lineno\">  952</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00953\"></a><span class=\"lineno\">  953</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00954\"></a><span class=\"lineno\">  954</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00955\"></a><span class=\"lineno\">  955</span>&#160;</div>\n<div class=\"line\"><a name=\"l00956\"></a><span class=\"lineno\">  956</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00957\"></a><span class=\"lineno\">  957</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00958\"></a><span class=\"lineno\">  958</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l00959\"></a><span class=\"lineno\">  959</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00960\"></a><span class=\"lineno\">  960</span>&#160;</div>\n<div class=\"line\"><a name=\"l00961\"></a><span class=\"lineno\">  961</span>&#160;        <span class=\"comment\">// xyxw</span></div>\n<div class=\"line\"><a name=\"l00962\"></a><span class=\"lineno\">  962</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00963\"></a><span class=\"lineno\">  963</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00964\"></a><span class=\"lineno\">  964</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l00965\"></a><span class=\"lineno\">  965</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00966\"></a><span class=\"lineno\">  966</span>&#160;</div>\n<div class=\"line\"><a name=\"l00967\"></a><span class=\"lineno\">  967</span>&#160;        <span class=\"comment\">// xyyx</span></div>\n<div class=\"line\"><a name=\"l00968\"></a><span class=\"lineno\">  968</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00969\"></a><span class=\"lineno\">  969</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00970\"></a><span class=\"lineno\">  970</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00971\"></a><span class=\"lineno\">  971</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00972\"></a><span class=\"lineno\">  972</span>&#160;</div>\n<div class=\"line\"><a name=\"l00973\"></a><span class=\"lineno\">  973</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00974\"></a><span class=\"lineno\">  974</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00975\"></a><span class=\"lineno\">  975</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00976\"></a><span class=\"lineno\">  976</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00977\"></a><span class=\"lineno\">  977</span>&#160;</div>\n<div class=\"line\"><a name=\"l00978\"></a><span class=\"lineno\">  978</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00979\"></a><span class=\"lineno\">  979</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00980\"></a><span class=\"lineno\">  980</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l00981\"></a><span class=\"lineno\">  981</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00982\"></a><span class=\"lineno\">  982</span>&#160;</div>\n<div class=\"line\"><a name=\"l00983\"></a><span class=\"lineno\">  983</span>&#160;        <span class=\"comment\">// xyyy</span></div>\n<div class=\"line\"><a name=\"l00984\"></a><span class=\"lineno\">  984</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00985\"></a><span class=\"lineno\">  985</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00986\"></a><span class=\"lineno\">  986</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00987\"></a><span class=\"lineno\">  987</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00988\"></a><span class=\"lineno\">  988</span>&#160;</div>\n<div class=\"line\"><a name=\"l00989\"></a><span class=\"lineno\">  989</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00990\"></a><span class=\"lineno\">  990</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00991\"></a><span class=\"lineno\">  991</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00992\"></a><span class=\"lineno\">  992</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00993\"></a><span class=\"lineno\">  993</span>&#160;</div>\n<div class=\"line\"><a name=\"l00994\"></a><span class=\"lineno\">  994</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00995\"></a><span class=\"lineno\">  995</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l00996\"></a><span class=\"lineno\">  996</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l00997\"></a><span class=\"lineno\">  997</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l00998\"></a><span class=\"lineno\">  998</span>&#160;</div>\n<div class=\"line\"><a name=\"l00999\"></a><span class=\"lineno\">  999</span>&#160;        <span class=\"comment\">// xyyz</span></div>\n<div class=\"line\"><a name=\"l01000\"></a><span class=\"lineno\"> 1000</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01001\"></a><span class=\"lineno\"> 1001</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01002\"></a><span class=\"lineno\"> 1002</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01003\"></a><span class=\"lineno\"> 1003</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01004\"></a><span class=\"lineno\"> 1004</span>&#160;</div>\n<div class=\"line\"><a name=\"l01005\"></a><span class=\"lineno\"> 1005</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01006\"></a><span class=\"lineno\"> 1006</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01007\"></a><span class=\"lineno\"> 1007</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01008\"></a><span class=\"lineno\"> 1008</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01009\"></a><span class=\"lineno\"> 1009</span>&#160;</div>\n<div class=\"line\"><a name=\"l01010\"></a><span class=\"lineno\"> 1010</span>&#160;        <span class=\"comment\">// xyyw</span></div>\n<div class=\"line\"><a name=\"l01011\"></a><span class=\"lineno\"> 1011</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01012\"></a><span class=\"lineno\"> 1012</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01013\"></a><span class=\"lineno\"> 1013</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l01014\"></a><span class=\"lineno\"> 1014</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01015\"></a><span class=\"lineno\"> 1015</span>&#160;</div>\n<div class=\"line\"><a name=\"l01016\"></a><span class=\"lineno\"> 1016</span>&#160;        <span class=\"comment\">// xyzx</span></div>\n<div class=\"line\"><a name=\"l01017\"></a><span class=\"lineno\"> 1017</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01018\"></a><span class=\"lineno\"> 1018</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01019\"></a><span class=\"lineno\"> 1019</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01020\"></a><span class=\"lineno\"> 1020</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01021\"></a><span class=\"lineno\"> 1021</span>&#160;</div>\n<div class=\"line\"><a name=\"l01022\"></a><span class=\"lineno\"> 1022</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01023\"></a><span class=\"lineno\"> 1023</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01024\"></a><span class=\"lineno\"> 1024</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01025\"></a><span class=\"lineno\"> 1025</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01026\"></a><span class=\"lineno\"> 1026</span>&#160;</div>\n<div class=\"line\"><a name=\"l01027\"></a><span class=\"lineno\"> 1027</span>&#160;        <span class=\"comment\">// xyzy</span></div>\n<div class=\"line\"><a name=\"l01028\"></a><span class=\"lineno\"> 1028</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01029\"></a><span class=\"lineno\"> 1029</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01030\"></a><span class=\"lineno\"> 1030</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01031\"></a><span class=\"lineno\"> 1031</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01032\"></a><span class=\"lineno\"> 1032</span>&#160;</div>\n<div class=\"line\"><a name=\"l01033\"></a><span class=\"lineno\"> 1033</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01034\"></a><span class=\"lineno\"> 1034</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01035\"></a><span class=\"lineno\"> 1035</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01036\"></a><span class=\"lineno\"> 1036</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01037\"></a><span class=\"lineno\"> 1037</span>&#160;</div>\n<div class=\"line\"><a name=\"l01038\"></a><span class=\"lineno\"> 1038</span>&#160;        <span class=\"comment\">// xyzz</span></div>\n<div class=\"line\"><a name=\"l01039\"></a><span class=\"lineno\"> 1039</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01040\"></a><span class=\"lineno\"> 1040</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01041\"></a><span class=\"lineno\"> 1041</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01042\"></a><span class=\"lineno\"> 1042</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01043\"></a><span class=\"lineno\"> 1043</span>&#160;</div>\n<div class=\"line\"><a name=\"l01044\"></a><span class=\"lineno\"> 1044</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01045\"></a><span class=\"lineno\"> 1045</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01046\"></a><span class=\"lineno\"> 1046</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01047\"></a><span class=\"lineno\"> 1047</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01048\"></a><span class=\"lineno\"> 1048</span>&#160;</div>\n<div class=\"line\"><a name=\"l01049\"></a><span class=\"lineno\"> 1049</span>&#160;        <span class=\"comment\">// xyzw</span></div>\n<div class=\"line\"><a name=\"l01050\"></a><span class=\"lineno\"> 1050</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01051\"></a><span class=\"lineno\"> 1051</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01052\"></a><span class=\"lineno\"> 1052</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l01053\"></a><span class=\"lineno\"> 1053</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01054\"></a><span class=\"lineno\"> 1054</span>&#160;</div>\n<div class=\"line\"><a name=\"l01055\"></a><span class=\"lineno\"> 1055</span>&#160;        <span class=\"comment\">// xywx</span></div>\n<div class=\"line\"><a name=\"l01056\"></a><span class=\"lineno\"> 1056</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01057\"></a><span class=\"lineno\"> 1057</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xywx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01058\"></a><span class=\"lineno\"> 1058</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l01059\"></a><span class=\"lineno\"> 1059</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01060\"></a><span class=\"lineno\"> 1060</span>&#160;</div>\n<div class=\"line\"><a name=\"l01061\"></a><span class=\"lineno\"> 1061</span>&#160;        <span class=\"comment\">// xywy</span></div>\n<div class=\"line\"><a name=\"l01062\"></a><span class=\"lineno\"> 1062</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01063\"></a><span class=\"lineno\"> 1063</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xywy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01064\"></a><span class=\"lineno\"> 1064</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l01065\"></a><span class=\"lineno\"> 1065</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01066\"></a><span class=\"lineno\"> 1066</span>&#160;</div>\n<div class=\"line\"><a name=\"l01067\"></a><span class=\"lineno\"> 1067</span>&#160;        <span class=\"comment\">// xywz</span></div>\n<div class=\"line\"><a name=\"l01068\"></a><span class=\"lineno\"> 1068</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01069\"></a><span class=\"lineno\"> 1069</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xywz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01070\"></a><span class=\"lineno\"> 1070</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l01071\"></a><span class=\"lineno\"> 1071</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01072\"></a><span class=\"lineno\"> 1072</span>&#160;</div>\n<div class=\"line\"><a name=\"l01073\"></a><span class=\"lineno\"> 1073</span>&#160;        <span class=\"comment\">// xyww</span></div>\n<div class=\"line\"><a name=\"l01074\"></a><span class=\"lineno\"> 1074</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01075\"></a><span class=\"lineno\"> 1075</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xyww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01076\"></a><span class=\"lineno\"> 1076</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.y, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l01077\"></a><span class=\"lineno\"> 1077</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01078\"></a><span class=\"lineno\"> 1078</span>&#160;</div>\n<div class=\"line\"><a name=\"l01079\"></a><span class=\"lineno\"> 1079</span>&#160;        <span class=\"comment\">// xzxx</span></div>\n<div class=\"line\"><a name=\"l01080\"></a><span class=\"lineno\"> 1080</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01081\"></a><span class=\"lineno\"> 1081</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01082\"></a><span class=\"lineno\"> 1082</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01083\"></a><span class=\"lineno\"> 1083</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01084\"></a><span class=\"lineno\"> 1084</span>&#160;</div>\n<div class=\"line\"><a name=\"l01085\"></a><span class=\"lineno\"> 1085</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01086\"></a><span class=\"lineno\"> 1086</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01087\"></a><span class=\"lineno\"> 1087</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01088\"></a><span class=\"lineno\"> 1088</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01089\"></a><span class=\"lineno\"> 1089</span>&#160;</div>\n<div class=\"line\"><a name=\"l01090\"></a><span class=\"lineno\"> 1090</span>&#160;        <span class=\"comment\">// xzxy</span></div>\n<div class=\"line\"><a name=\"l01091\"></a><span class=\"lineno\"> 1091</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01092\"></a><span class=\"lineno\"> 1092</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01093\"></a><span class=\"lineno\"> 1093</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01094\"></a><span class=\"lineno\"> 1094</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01095\"></a><span class=\"lineno\"> 1095</span>&#160;</div>\n<div class=\"line\"><a name=\"l01096\"></a><span class=\"lineno\"> 1096</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01097\"></a><span class=\"lineno\"> 1097</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01098\"></a><span class=\"lineno\"> 1098</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01099\"></a><span class=\"lineno\"> 1099</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01100\"></a><span class=\"lineno\"> 1100</span>&#160;</div>\n<div class=\"line\"><a name=\"l01101\"></a><span class=\"lineno\"> 1101</span>&#160;        <span class=\"comment\">// xzxz</span></div>\n<div class=\"line\"><a name=\"l01102\"></a><span class=\"lineno\"> 1102</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01103\"></a><span class=\"lineno\"> 1103</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01104\"></a><span class=\"lineno\"> 1104</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01105\"></a><span class=\"lineno\"> 1105</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01106\"></a><span class=\"lineno\"> 1106</span>&#160;</div>\n<div class=\"line\"><a name=\"l01107\"></a><span class=\"lineno\"> 1107</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01108\"></a><span class=\"lineno\"> 1108</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01109\"></a><span class=\"lineno\"> 1109</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01110\"></a><span class=\"lineno\"> 1110</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01111\"></a><span class=\"lineno\"> 1111</span>&#160;</div>\n<div class=\"line\"><a name=\"l01112\"></a><span class=\"lineno\"> 1112</span>&#160;        <span class=\"comment\">// xzxw</span></div>\n<div class=\"line\"><a name=\"l01113\"></a><span class=\"lineno\"> 1113</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01114\"></a><span class=\"lineno\"> 1114</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01115\"></a><span class=\"lineno\"> 1115</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l01116\"></a><span class=\"lineno\"> 1116</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01117\"></a><span class=\"lineno\"> 1117</span>&#160;</div>\n<div class=\"line\"><a name=\"l01118\"></a><span class=\"lineno\"> 1118</span>&#160;        <span class=\"comment\">// xzyx</span></div>\n<div class=\"line\"><a name=\"l01119\"></a><span class=\"lineno\"> 1119</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01120\"></a><span class=\"lineno\"> 1120</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01121\"></a><span class=\"lineno\"> 1121</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01122\"></a><span class=\"lineno\"> 1122</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01123\"></a><span class=\"lineno\"> 1123</span>&#160;</div>\n<div class=\"line\"><a name=\"l01124\"></a><span class=\"lineno\"> 1124</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01125\"></a><span class=\"lineno\"> 1125</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01126\"></a><span class=\"lineno\"> 1126</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01127\"></a><span class=\"lineno\"> 1127</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01128\"></a><span class=\"lineno\"> 1128</span>&#160;</div>\n<div class=\"line\"><a name=\"l01129\"></a><span class=\"lineno\"> 1129</span>&#160;        <span class=\"comment\">// xzyy</span></div>\n<div class=\"line\"><a name=\"l01130\"></a><span class=\"lineno\"> 1130</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01131\"></a><span class=\"lineno\"> 1131</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01132\"></a><span class=\"lineno\"> 1132</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01133\"></a><span class=\"lineno\"> 1133</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01134\"></a><span class=\"lineno\"> 1134</span>&#160;</div>\n<div class=\"line\"><a name=\"l01135\"></a><span class=\"lineno\"> 1135</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01136\"></a><span class=\"lineno\"> 1136</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01137\"></a><span class=\"lineno\"> 1137</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01138\"></a><span class=\"lineno\"> 1138</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01139\"></a><span class=\"lineno\"> 1139</span>&#160;</div>\n<div class=\"line\"><a name=\"l01140\"></a><span class=\"lineno\"> 1140</span>&#160;        <span class=\"comment\">// xzyz</span></div>\n<div class=\"line\"><a name=\"l01141\"></a><span class=\"lineno\"> 1141</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01142\"></a><span class=\"lineno\"> 1142</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01143\"></a><span class=\"lineno\"> 1143</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01144\"></a><span class=\"lineno\"> 1144</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01145\"></a><span class=\"lineno\"> 1145</span>&#160;</div>\n<div class=\"line\"><a name=\"l01146\"></a><span class=\"lineno\"> 1146</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01147\"></a><span class=\"lineno\"> 1147</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01148\"></a><span class=\"lineno\"> 1148</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01149\"></a><span class=\"lineno\"> 1149</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01150\"></a><span class=\"lineno\"> 1150</span>&#160;</div>\n<div class=\"line\"><a name=\"l01151\"></a><span class=\"lineno\"> 1151</span>&#160;        <span class=\"comment\">// xzyw</span></div>\n<div class=\"line\"><a name=\"l01152\"></a><span class=\"lineno\"> 1152</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01153\"></a><span class=\"lineno\"> 1153</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01154\"></a><span class=\"lineno\"> 1154</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l01155\"></a><span class=\"lineno\"> 1155</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01156\"></a><span class=\"lineno\"> 1156</span>&#160;</div>\n<div class=\"line\"><a name=\"l01157\"></a><span class=\"lineno\"> 1157</span>&#160;        <span class=\"comment\">// xzzx</span></div>\n<div class=\"line\"><a name=\"l01158\"></a><span class=\"lineno\"> 1158</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01159\"></a><span class=\"lineno\"> 1159</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01160\"></a><span class=\"lineno\"> 1160</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01161\"></a><span class=\"lineno\"> 1161</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01162\"></a><span class=\"lineno\"> 1162</span>&#160;</div>\n<div class=\"line\"><a name=\"l01163\"></a><span class=\"lineno\"> 1163</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01164\"></a><span class=\"lineno\"> 1164</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01165\"></a><span class=\"lineno\"> 1165</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01166\"></a><span class=\"lineno\"> 1166</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01167\"></a><span class=\"lineno\"> 1167</span>&#160;</div>\n<div class=\"line\"><a name=\"l01168\"></a><span class=\"lineno\"> 1168</span>&#160;        <span class=\"comment\">// xzzy</span></div>\n<div class=\"line\"><a name=\"l01169\"></a><span class=\"lineno\"> 1169</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01170\"></a><span class=\"lineno\"> 1170</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01171\"></a><span class=\"lineno\"> 1171</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01172\"></a><span class=\"lineno\"> 1172</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01173\"></a><span class=\"lineno\"> 1173</span>&#160;</div>\n<div class=\"line\"><a name=\"l01174\"></a><span class=\"lineno\"> 1174</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01175\"></a><span class=\"lineno\"> 1175</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01176\"></a><span class=\"lineno\"> 1176</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01177\"></a><span class=\"lineno\"> 1177</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01178\"></a><span class=\"lineno\"> 1178</span>&#160;</div>\n<div class=\"line\"><a name=\"l01179\"></a><span class=\"lineno\"> 1179</span>&#160;        <span class=\"comment\">// xzzz</span></div>\n<div class=\"line\"><a name=\"l01180\"></a><span class=\"lineno\"> 1180</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01181\"></a><span class=\"lineno\"> 1181</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01182\"></a><span class=\"lineno\"> 1182</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01183\"></a><span class=\"lineno\"> 1183</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01184\"></a><span class=\"lineno\"> 1184</span>&#160;</div>\n<div class=\"line\"><a name=\"l01185\"></a><span class=\"lineno\"> 1185</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01186\"></a><span class=\"lineno\"> 1186</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01187\"></a><span class=\"lineno\"> 1187</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01188\"></a><span class=\"lineno\"> 1188</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01189\"></a><span class=\"lineno\"> 1189</span>&#160;</div>\n<div class=\"line\"><a name=\"l01190\"></a><span class=\"lineno\"> 1190</span>&#160;        <span class=\"comment\">// xzzw</span></div>\n<div class=\"line\"><a name=\"l01191\"></a><span class=\"lineno\"> 1191</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01192\"></a><span class=\"lineno\"> 1192</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01193\"></a><span class=\"lineno\"> 1193</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l01194\"></a><span class=\"lineno\"> 1194</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01195\"></a><span class=\"lineno\"> 1195</span>&#160;</div>\n<div class=\"line\"><a name=\"l01196\"></a><span class=\"lineno\"> 1196</span>&#160;        <span class=\"comment\">// xzwx</span></div>\n<div class=\"line\"><a name=\"l01197\"></a><span class=\"lineno\"> 1197</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01198\"></a><span class=\"lineno\"> 1198</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01199\"></a><span class=\"lineno\"> 1199</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l01200\"></a><span class=\"lineno\"> 1200</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01201\"></a><span class=\"lineno\"> 1201</span>&#160;</div>\n<div class=\"line\"><a name=\"l01202\"></a><span class=\"lineno\"> 1202</span>&#160;        <span class=\"comment\">// xzwy</span></div>\n<div class=\"line\"><a name=\"l01203\"></a><span class=\"lineno\"> 1203</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01204\"></a><span class=\"lineno\"> 1204</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01205\"></a><span class=\"lineno\"> 1205</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l01206\"></a><span class=\"lineno\"> 1206</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01207\"></a><span class=\"lineno\"> 1207</span>&#160;</div>\n<div class=\"line\"><a name=\"l01208\"></a><span class=\"lineno\"> 1208</span>&#160;        <span class=\"comment\">// xzwz</span></div>\n<div class=\"line\"><a name=\"l01209\"></a><span class=\"lineno\"> 1209</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01210\"></a><span class=\"lineno\"> 1210</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01211\"></a><span class=\"lineno\"> 1211</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l01212\"></a><span class=\"lineno\"> 1212</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01213\"></a><span class=\"lineno\"> 1213</span>&#160;</div>\n<div class=\"line\"><a name=\"l01214\"></a><span class=\"lineno\"> 1214</span>&#160;        <span class=\"comment\">// xzww</span></div>\n<div class=\"line\"><a name=\"l01215\"></a><span class=\"lineno\"> 1215</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01216\"></a><span class=\"lineno\"> 1216</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xzww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01217\"></a><span class=\"lineno\"> 1217</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.z, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l01218\"></a><span class=\"lineno\"> 1218</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01219\"></a><span class=\"lineno\"> 1219</span>&#160;</div>\n<div class=\"line\"><a name=\"l01220\"></a><span class=\"lineno\"> 1220</span>&#160;        <span class=\"comment\">// xwxx</span></div>\n<div class=\"line\"><a name=\"l01221\"></a><span class=\"lineno\"> 1221</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01222\"></a><span class=\"lineno\"> 1222</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01223\"></a><span class=\"lineno\"> 1223</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01224\"></a><span class=\"lineno\"> 1224</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01225\"></a><span class=\"lineno\"> 1225</span>&#160;</div>\n<div class=\"line\"><a name=\"l01226\"></a><span class=\"lineno\"> 1226</span>&#160;        <span class=\"comment\">// xwxy</span></div>\n<div class=\"line\"><a name=\"l01227\"></a><span class=\"lineno\"> 1227</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01228\"></a><span class=\"lineno\"> 1228</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01229\"></a><span class=\"lineno\"> 1229</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01230\"></a><span class=\"lineno\"> 1230</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01231\"></a><span class=\"lineno\"> 1231</span>&#160;</div>\n<div class=\"line\"><a name=\"l01232\"></a><span class=\"lineno\"> 1232</span>&#160;        <span class=\"comment\">// xwxz</span></div>\n<div class=\"line\"><a name=\"l01233\"></a><span class=\"lineno\"> 1233</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01234\"></a><span class=\"lineno\"> 1234</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01235\"></a><span class=\"lineno\"> 1235</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01236\"></a><span class=\"lineno\"> 1236</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01237\"></a><span class=\"lineno\"> 1237</span>&#160;</div>\n<div class=\"line\"><a name=\"l01238\"></a><span class=\"lineno\"> 1238</span>&#160;        <span class=\"comment\">// xwxw</span></div>\n<div class=\"line\"><a name=\"l01239\"></a><span class=\"lineno\"> 1239</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01240\"></a><span class=\"lineno\"> 1240</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01241\"></a><span class=\"lineno\"> 1241</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l01242\"></a><span class=\"lineno\"> 1242</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01243\"></a><span class=\"lineno\"> 1243</span>&#160;</div>\n<div class=\"line\"><a name=\"l01244\"></a><span class=\"lineno\"> 1244</span>&#160;        <span class=\"comment\">// xwyx</span></div>\n<div class=\"line\"><a name=\"l01245\"></a><span class=\"lineno\"> 1245</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01246\"></a><span class=\"lineno\"> 1246</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01247\"></a><span class=\"lineno\"> 1247</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01248\"></a><span class=\"lineno\"> 1248</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01249\"></a><span class=\"lineno\"> 1249</span>&#160;</div>\n<div class=\"line\"><a name=\"l01250\"></a><span class=\"lineno\"> 1250</span>&#160;        <span class=\"comment\">// xwyy</span></div>\n<div class=\"line\"><a name=\"l01251\"></a><span class=\"lineno\"> 1251</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01252\"></a><span class=\"lineno\"> 1252</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01253\"></a><span class=\"lineno\"> 1253</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01254\"></a><span class=\"lineno\"> 1254</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01255\"></a><span class=\"lineno\"> 1255</span>&#160;</div>\n<div class=\"line\"><a name=\"l01256\"></a><span class=\"lineno\"> 1256</span>&#160;        <span class=\"comment\">// xwyz</span></div>\n<div class=\"line\"><a name=\"l01257\"></a><span class=\"lineno\"> 1257</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01258\"></a><span class=\"lineno\"> 1258</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01259\"></a><span class=\"lineno\"> 1259</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01260\"></a><span class=\"lineno\"> 1260</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01261\"></a><span class=\"lineno\"> 1261</span>&#160;</div>\n<div class=\"line\"><a name=\"l01262\"></a><span class=\"lineno\"> 1262</span>&#160;        <span class=\"comment\">// xwyw</span></div>\n<div class=\"line\"><a name=\"l01263\"></a><span class=\"lineno\"> 1263</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01264\"></a><span class=\"lineno\"> 1264</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01265\"></a><span class=\"lineno\"> 1265</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l01266\"></a><span class=\"lineno\"> 1266</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01267\"></a><span class=\"lineno\"> 1267</span>&#160;</div>\n<div class=\"line\"><a name=\"l01268\"></a><span class=\"lineno\"> 1268</span>&#160;        <span class=\"comment\">// xwzx</span></div>\n<div class=\"line\"><a name=\"l01269\"></a><span class=\"lineno\"> 1269</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01270\"></a><span class=\"lineno\"> 1270</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01271\"></a><span class=\"lineno\"> 1271</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01272\"></a><span class=\"lineno\"> 1272</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01273\"></a><span class=\"lineno\"> 1273</span>&#160;</div>\n<div class=\"line\"><a name=\"l01274\"></a><span class=\"lineno\"> 1274</span>&#160;        <span class=\"comment\">// xwzy</span></div>\n<div class=\"line\"><a name=\"l01275\"></a><span class=\"lineno\"> 1275</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01276\"></a><span class=\"lineno\"> 1276</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01277\"></a><span class=\"lineno\"> 1277</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01278\"></a><span class=\"lineno\"> 1278</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01279\"></a><span class=\"lineno\"> 1279</span>&#160;</div>\n<div class=\"line\"><a name=\"l01280\"></a><span class=\"lineno\"> 1280</span>&#160;        <span class=\"comment\">// xwzz</span></div>\n<div class=\"line\"><a name=\"l01281\"></a><span class=\"lineno\"> 1281</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01282\"></a><span class=\"lineno\"> 1282</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01283\"></a><span class=\"lineno\"> 1283</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01284\"></a><span class=\"lineno\"> 1284</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01285\"></a><span class=\"lineno\"> 1285</span>&#160;</div>\n<div class=\"line\"><a name=\"l01286\"></a><span class=\"lineno\"> 1286</span>&#160;        <span class=\"comment\">// xwzw</span></div>\n<div class=\"line\"><a name=\"l01287\"></a><span class=\"lineno\"> 1287</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01288\"></a><span class=\"lineno\"> 1288</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01289\"></a><span class=\"lineno\"> 1289</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l01290\"></a><span class=\"lineno\"> 1290</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01291\"></a><span class=\"lineno\"> 1291</span>&#160;</div>\n<div class=\"line\"><a name=\"l01292\"></a><span class=\"lineno\"> 1292</span>&#160;        <span class=\"comment\">// xwwx</span></div>\n<div class=\"line\"><a name=\"l01293\"></a><span class=\"lineno\"> 1293</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01294\"></a><span class=\"lineno\"> 1294</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01295\"></a><span class=\"lineno\"> 1295</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l01296\"></a><span class=\"lineno\"> 1296</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01297\"></a><span class=\"lineno\"> 1297</span>&#160;</div>\n<div class=\"line\"><a name=\"l01298\"></a><span class=\"lineno\"> 1298</span>&#160;        <span class=\"comment\">// xwwy</span></div>\n<div class=\"line\"><a name=\"l01299\"></a><span class=\"lineno\"> 1299</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01300\"></a><span class=\"lineno\"> 1300</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01301\"></a><span class=\"lineno\"> 1301</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l01302\"></a><span class=\"lineno\"> 1302</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01303\"></a><span class=\"lineno\"> 1303</span>&#160;</div>\n<div class=\"line\"><a name=\"l01304\"></a><span class=\"lineno\"> 1304</span>&#160;        <span class=\"comment\">// xwwz</span></div>\n<div class=\"line\"><a name=\"l01305\"></a><span class=\"lineno\"> 1305</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01306\"></a><span class=\"lineno\"> 1306</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01307\"></a><span class=\"lineno\"> 1307</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l01308\"></a><span class=\"lineno\"> 1308</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01309\"></a><span class=\"lineno\"> 1309</span>&#160;</div>\n<div class=\"line\"><a name=\"l01310\"></a><span class=\"lineno\"> 1310</span>&#160;        <span class=\"comment\">// xwww</span></div>\n<div class=\"line\"><a name=\"l01311\"></a><span class=\"lineno\"> 1311</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01312\"></a><span class=\"lineno\"> 1312</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; xwww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01313\"></a><span class=\"lineno\"> 1313</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.x, v.w, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l01314\"></a><span class=\"lineno\"> 1314</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01315\"></a><span class=\"lineno\"> 1315</span>&#160;</div>\n<div class=\"line\"><a name=\"l01316\"></a><span class=\"lineno\"> 1316</span>&#160;        <span class=\"comment\">// yxxx</span></div>\n<div class=\"line\"><a name=\"l01317\"></a><span class=\"lineno\"> 1317</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01318\"></a><span class=\"lineno\"> 1318</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01319\"></a><span class=\"lineno\"> 1319</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01320\"></a><span class=\"lineno\"> 1320</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01321\"></a><span class=\"lineno\"> 1321</span>&#160;</div>\n<div class=\"line\"><a name=\"l01322\"></a><span class=\"lineno\"> 1322</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01323\"></a><span class=\"lineno\"> 1323</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01324\"></a><span class=\"lineno\"> 1324</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01325\"></a><span class=\"lineno\"> 1325</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01326\"></a><span class=\"lineno\"> 1326</span>&#160;</div>\n<div class=\"line\"><a name=\"l01327\"></a><span class=\"lineno\"> 1327</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01328\"></a><span class=\"lineno\"> 1328</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01329\"></a><span class=\"lineno\"> 1329</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01330\"></a><span class=\"lineno\"> 1330</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01331\"></a><span class=\"lineno\"> 1331</span>&#160;</div>\n<div class=\"line\"><a name=\"l01332\"></a><span class=\"lineno\"> 1332</span>&#160;        <span class=\"comment\">// yxxy</span></div>\n<div class=\"line\"><a name=\"l01333\"></a><span class=\"lineno\"> 1333</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01334\"></a><span class=\"lineno\"> 1334</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01335\"></a><span class=\"lineno\"> 1335</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01336\"></a><span class=\"lineno\"> 1336</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01337\"></a><span class=\"lineno\"> 1337</span>&#160;</div>\n<div class=\"line\"><a name=\"l01338\"></a><span class=\"lineno\"> 1338</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01339\"></a><span class=\"lineno\"> 1339</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01340\"></a><span class=\"lineno\"> 1340</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01341\"></a><span class=\"lineno\"> 1341</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01342\"></a><span class=\"lineno\"> 1342</span>&#160;</div>\n<div class=\"line\"><a name=\"l01343\"></a><span class=\"lineno\"> 1343</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01344\"></a><span class=\"lineno\"> 1344</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01345\"></a><span class=\"lineno\"> 1345</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01346\"></a><span class=\"lineno\"> 1346</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01347\"></a><span class=\"lineno\"> 1347</span>&#160;</div>\n<div class=\"line\"><a name=\"l01348\"></a><span class=\"lineno\"> 1348</span>&#160;        <span class=\"comment\">// yxxz</span></div>\n<div class=\"line\"><a name=\"l01349\"></a><span class=\"lineno\"> 1349</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01350\"></a><span class=\"lineno\"> 1350</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01351\"></a><span class=\"lineno\"> 1351</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01352\"></a><span class=\"lineno\"> 1352</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01353\"></a><span class=\"lineno\"> 1353</span>&#160;</div>\n<div class=\"line\"><a name=\"l01354\"></a><span class=\"lineno\"> 1354</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01355\"></a><span class=\"lineno\"> 1355</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01356\"></a><span class=\"lineno\"> 1356</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01357\"></a><span class=\"lineno\"> 1357</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01358\"></a><span class=\"lineno\"> 1358</span>&#160;</div>\n<div class=\"line\"><a name=\"l01359\"></a><span class=\"lineno\"> 1359</span>&#160;        <span class=\"comment\">// yxxw</span></div>\n<div class=\"line\"><a name=\"l01360\"></a><span class=\"lineno\"> 1360</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01361\"></a><span class=\"lineno\"> 1361</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01362\"></a><span class=\"lineno\"> 1362</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l01363\"></a><span class=\"lineno\"> 1363</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01364\"></a><span class=\"lineno\"> 1364</span>&#160;</div>\n<div class=\"line\"><a name=\"l01365\"></a><span class=\"lineno\"> 1365</span>&#160;        <span class=\"comment\">// yxyx</span></div>\n<div class=\"line\"><a name=\"l01366\"></a><span class=\"lineno\"> 1366</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01367\"></a><span class=\"lineno\"> 1367</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01368\"></a><span class=\"lineno\"> 1368</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01369\"></a><span class=\"lineno\"> 1369</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01370\"></a><span class=\"lineno\"> 1370</span>&#160;</div>\n<div class=\"line\"><a name=\"l01371\"></a><span class=\"lineno\"> 1371</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01372\"></a><span class=\"lineno\"> 1372</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01373\"></a><span class=\"lineno\"> 1373</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01374\"></a><span class=\"lineno\"> 1374</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01375\"></a><span class=\"lineno\"> 1375</span>&#160;</div>\n<div class=\"line\"><a name=\"l01376\"></a><span class=\"lineno\"> 1376</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01377\"></a><span class=\"lineno\"> 1377</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01378\"></a><span class=\"lineno\"> 1378</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01379\"></a><span class=\"lineno\"> 1379</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01380\"></a><span class=\"lineno\"> 1380</span>&#160;</div>\n<div class=\"line\"><a name=\"l01381\"></a><span class=\"lineno\"> 1381</span>&#160;        <span class=\"comment\">// yxyy</span></div>\n<div class=\"line\"><a name=\"l01382\"></a><span class=\"lineno\"> 1382</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01383\"></a><span class=\"lineno\"> 1383</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01384\"></a><span class=\"lineno\"> 1384</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01385\"></a><span class=\"lineno\"> 1385</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01386\"></a><span class=\"lineno\"> 1386</span>&#160;</div>\n<div class=\"line\"><a name=\"l01387\"></a><span class=\"lineno\"> 1387</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01388\"></a><span class=\"lineno\"> 1388</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01389\"></a><span class=\"lineno\"> 1389</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01390\"></a><span class=\"lineno\"> 1390</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01391\"></a><span class=\"lineno\"> 1391</span>&#160;</div>\n<div class=\"line\"><a name=\"l01392\"></a><span class=\"lineno\"> 1392</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01393\"></a><span class=\"lineno\"> 1393</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01394\"></a><span class=\"lineno\"> 1394</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01395\"></a><span class=\"lineno\"> 1395</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01396\"></a><span class=\"lineno\"> 1396</span>&#160;</div>\n<div class=\"line\"><a name=\"l01397\"></a><span class=\"lineno\"> 1397</span>&#160;        <span class=\"comment\">// yxyz</span></div>\n<div class=\"line\"><a name=\"l01398\"></a><span class=\"lineno\"> 1398</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01399\"></a><span class=\"lineno\"> 1399</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01400\"></a><span class=\"lineno\"> 1400</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01401\"></a><span class=\"lineno\"> 1401</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01402\"></a><span class=\"lineno\"> 1402</span>&#160;</div>\n<div class=\"line\"><a name=\"l01403\"></a><span class=\"lineno\"> 1403</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01404\"></a><span class=\"lineno\"> 1404</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01405\"></a><span class=\"lineno\"> 1405</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01406\"></a><span class=\"lineno\"> 1406</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01407\"></a><span class=\"lineno\"> 1407</span>&#160;</div>\n<div class=\"line\"><a name=\"l01408\"></a><span class=\"lineno\"> 1408</span>&#160;        <span class=\"comment\">// yxyw</span></div>\n<div class=\"line\"><a name=\"l01409\"></a><span class=\"lineno\"> 1409</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01410\"></a><span class=\"lineno\"> 1410</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01411\"></a><span class=\"lineno\"> 1411</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l01412\"></a><span class=\"lineno\"> 1412</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01413\"></a><span class=\"lineno\"> 1413</span>&#160;</div>\n<div class=\"line\"><a name=\"l01414\"></a><span class=\"lineno\"> 1414</span>&#160;        <span class=\"comment\">// yxzx</span></div>\n<div class=\"line\"><a name=\"l01415\"></a><span class=\"lineno\"> 1415</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01416\"></a><span class=\"lineno\"> 1416</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01417\"></a><span class=\"lineno\"> 1417</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01418\"></a><span class=\"lineno\"> 1418</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01419\"></a><span class=\"lineno\"> 1419</span>&#160;</div>\n<div class=\"line\"><a name=\"l01420\"></a><span class=\"lineno\"> 1420</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01421\"></a><span class=\"lineno\"> 1421</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01422\"></a><span class=\"lineno\"> 1422</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01423\"></a><span class=\"lineno\"> 1423</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01424\"></a><span class=\"lineno\"> 1424</span>&#160;</div>\n<div class=\"line\"><a name=\"l01425\"></a><span class=\"lineno\"> 1425</span>&#160;        <span class=\"comment\">// yxzy</span></div>\n<div class=\"line\"><a name=\"l01426\"></a><span class=\"lineno\"> 1426</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01427\"></a><span class=\"lineno\"> 1427</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01428\"></a><span class=\"lineno\"> 1428</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01429\"></a><span class=\"lineno\"> 1429</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01430\"></a><span class=\"lineno\"> 1430</span>&#160;</div>\n<div class=\"line\"><a name=\"l01431\"></a><span class=\"lineno\"> 1431</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01432\"></a><span class=\"lineno\"> 1432</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01433\"></a><span class=\"lineno\"> 1433</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01434\"></a><span class=\"lineno\"> 1434</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01435\"></a><span class=\"lineno\"> 1435</span>&#160;</div>\n<div class=\"line\"><a name=\"l01436\"></a><span class=\"lineno\"> 1436</span>&#160;        <span class=\"comment\">// yxzz</span></div>\n<div class=\"line\"><a name=\"l01437\"></a><span class=\"lineno\"> 1437</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01438\"></a><span class=\"lineno\"> 1438</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01439\"></a><span class=\"lineno\"> 1439</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01440\"></a><span class=\"lineno\"> 1440</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01441\"></a><span class=\"lineno\"> 1441</span>&#160;</div>\n<div class=\"line\"><a name=\"l01442\"></a><span class=\"lineno\"> 1442</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01443\"></a><span class=\"lineno\"> 1443</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01444\"></a><span class=\"lineno\"> 1444</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01445\"></a><span class=\"lineno\"> 1445</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01446\"></a><span class=\"lineno\"> 1446</span>&#160;</div>\n<div class=\"line\"><a name=\"l01447\"></a><span class=\"lineno\"> 1447</span>&#160;        <span class=\"comment\">// yxzw</span></div>\n<div class=\"line\"><a name=\"l01448\"></a><span class=\"lineno\"> 1448</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01449\"></a><span class=\"lineno\"> 1449</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01450\"></a><span class=\"lineno\"> 1450</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l01451\"></a><span class=\"lineno\"> 1451</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01452\"></a><span class=\"lineno\"> 1452</span>&#160;</div>\n<div class=\"line\"><a name=\"l01453\"></a><span class=\"lineno\"> 1453</span>&#160;        <span class=\"comment\">// yxwx</span></div>\n<div class=\"line\"><a name=\"l01454\"></a><span class=\"lineno\"> 1454</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01455\"></a><span class=\"lineno\"> 1455</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01456\"></a><span class=\"lineno\"> 1456</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l01457\"></a><span class=\"lineno\"> 1457</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01458\"></a><span class=\"lineno\"> 1458</span>&#160;</div>\n<div class=\"line\"><a name=\"l01459\"></a><span class=\"lineno\"> 1459</span>&#160;        <span class=\"comment\">// yxwy</span></div>\n<div class=\"line\"><a name=\"l01460\"></a><span class=\"lineno\"> 1460</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01461\"></a><span class=\"lineno\"> 1461</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01462\"></a><span class=\"lineno\"> 1462</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l01463\"></a><span class=\"lineno\"> 1463</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01464\"></a><span class=\"lineno\"> 1464</span>&#160;</div>\n<div class=\"line\"><a name=\"l01465\"></a><span class=\"lineno\"> 1465</span>&#160;        <span class=\"comment\">// yxwz</span></div>\n<div class=\"line\"><a name=\"l01466\"></a><span class=\"lineno\"> 1466</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01467\"></a><span class=\"lineno\"> 1467</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01468\"></a><span class=\"lineno\"> 1468</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l01469\"></a><span class=\"lineno\"> 1469</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01470\"></a><span class=\"lineno\"> 1470</span>&#160;</div>\n<div class=\"line\"><a name=\"l01471\"></a><span class=\"lineno\"> 1471</span>&#160;        <span class=\"comment\">// yxww</span></div>\n<div class=\"line\"><a name=\"l01472\"></a><span class=\"lineno\"> 1472</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01473\"></a><span class=\"lineno\"> 1473</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yxww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01474\"></a><span class=\"lineno\"> 1474</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.x, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l01475\"></a><span class=\"lineno\"> 1475</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01476\"></a><span class=\"lineno\"> 1476</span>&#160;</div>\n<div class=\"line\"><a name=\"l01477\"></a><span class=\"lineno\"> 1477</span>&#160;        <span class=\"comment\">// yyxx</span></div>\n<div class=\"line\"><a name=\"l01478\"></a><span class=\"lineno\"> 1478</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01479\"></a><span class=\"lineno\"> 1479</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01480\"></a><span class=\"lineno\"> 1480</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01481\"></a><span class=\"lineno\"> 1481</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01482\"></a><span class=\"lineno\"> 1482</span>&#160;</div>\n<div class=\"line\"><a name=\"l01483\"></a><span class=\"lineno\"> 1483</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01484\"></a><span class=\"lineno\"> 1484</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01485\"></a><span class=\"lineno\"> 1485</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01486\"></a><span class=\"lineno\"> 1486</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01487\"></a><span class=\"lineno\"> 1487</span>&#160;</div>\n<div class=\"line\"><a name=\"l01488\"></a><span class=\"lineno\"> 1488</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01489\"></a><span class=\"lineno\"> 1489</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01490\"></a><span class=\"lineno\"> 1490</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01491\"></a><span class=\"lineno\"> 1491</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01492\"></a><span class=\"lineno\"> 1492</span>&#160;</div>\n<div class=\"line\"><a name=\"l01493\"></a><span class=\"lineno\"> 1493</span>&#160;        <span class=\"comment\">// yyxy</span></div>\n<div class=\"line\"><a name=\"l01494\"></a><span class=\"lineno\"> 1494</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01495\"></a><span class=\"lineno\"> 1495</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01496\"></a><span class=\"lineno\"> 1496</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01497\"></a><span class=\"lineno\"> 1497</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01498\"></a><span class=\"lineno\"> 1498</span>&#160;</div>\n<div class=\"line\"><a name=\"l01499\"></a><span class=\"lineno\"> 1499</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01500\"></a><span class=\"lineno\"> 1500</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01501\"></a><span class=\"lineno\"> 1501</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01502\"></a><span class=\"lineno\"> 1502</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01503\"></a><span class=\"lineno\"> 1503</span>&#160;</div>\n<div class=\"line\"><a name=\"l01504\"></a><span class=\"lineno\"> 1504</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01505\"></a><span class=\"lineno\"> 1505</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01506\"></a><span class=\"lineno\"> 1506</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01507\"></a><span class=\"lineno\"> 1507</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01508\"></a><span class=\"lineno\"> 1508</span>&#160;</div>\n<div class=\"line\"><a name=\"l01509\"></a><span class=\"lineno\"> 1509</span>&#160;        <span class=\"comment\">// yyxz</span></div>\n<div class=\"line\"><a name=\"l01510\"></a><span class=\"lineno\"> 1510</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01511\"></a><span class=\"lineno\"> 1511</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01512\"></a><span class=\"lineno\"> 1512</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01513\"></a><span class=\"lineno\"> 1513</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01514\"></a><span class=\"lineno\"> 1514</span>&#160;</div>\n<div class=\"line\"><a name=\"l01515\"></a><span class=\"lineno\"> 1515</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01516\"></a><span class=\"lineno\"> 1516</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01517\"></a><span class=\"lineno\"> 1517</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01518\"></a><span class=\"lineno\"> 1518</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01519\"></a><span class=\"lineno\"> 1519</span>&#160;</div>\n<div class=\"line\"><a name=\"l01520\"></a><span class=\"lineno\"> 1520</span>&#160;        <span class=\"comment\">// yyxw</span></div>\n<div class=\"line\"><a name=\"l01521\"></a><span class=\"lineno\"> 1521</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01522\"></a><span class=\"lineno\"> 1522</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01523\"></a><span class=\"lineno\"> 1523</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l01524\"></a><span class=\"lineno\"> 1524</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01525\"></a><span class=\"lineno\"> 1525</span>&#160;</div>\n<div class=\"line\"><a name=\"l01526\"></a><span class=\"lineno\"> 1526</span>&#160;        <span class=\"comment\">// yyyx</span></div>\n<div class=\"line\"><a name=\"l01527\"></a><span class=\"lineno\"> 1527</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01528\"></a><span class=\"lineno\"> 1528</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyx(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01529\"></a><span class=\"lineno\"> 1529</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01530\"></a><span class=\"lineno\"> 1530</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01531\"></a><span class=\"lineno\"> 1531</span>&#160;</div>\n<div class=\"line\"><a name=\"l01532\"></a><span class=\"lineno\"> 1532</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01533\"></a><span class=\"lineno\"> 1533</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01534\"></a><span class=\"lineno\"> 1534</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01535\"></a><span class=\"lineno\"> 1535</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01536\"></a><span class=\"lineno\"> 1536</span>&#160;</div>\n<div class=\"line\"><a name=\"l01537\"></a><span class=\"lineno\"> 1537</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01538\"></a><span class=\"lineno\"> 1538</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01539\"></a><span class=\"lineno\"> 1539</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01540\"></a><span class=\"lineno\"> 1540</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01541\"></a><span class=\"lineno\"> 1541</span>&#160;</div>\n<div class=\"line\"><a name=\"l01542\"></a><span class=\"lineno\"> 1542</span>&#160;        <span class=\"comment\">// yyyy</span></div>\n<div class=\"line\"><a name=\"l01543\"></a><span class=\"lineno\"> 1543</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01544\"></a><span class=\"lineno\"> 1544</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyy(<span class=\"keyword\">const</span> glm::vec&lt;2, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01545\"></a><span class=\"lineno\"> 1545</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01546\"></a><span class=\"lineno\"> 1546</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01547\"></a><span class=\"lineno\"> 1547</span>&#160;</div>\n<div class=\"line\"><a name=\"l01548\"></a><span class=\"lineno\"> 1548</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01549\"></a><span class=\"lineno\"> 1549</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01550\"></a><span class=\"lineno\"> 1550</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01551\"></a><span class=\"lineno\"> 1551</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01552\"></a><span class=\"lineno\"> 1552</span>&#160;</div>\n<div class=\"line\"><a name=\"l01553\"></a><span class=\"lineno\"> 1553</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01554\"></a><span class=\"lineno\"> 1554</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01555\"></a><span class=\"lineno\"> 1555</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01556\"></a><span class=\"lineno\"> 1556</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01557\"></a><span class=\"lineno\"> 1557</span>&#160;</div>\n<div class=\"line\"><a name=\"l01558\"></a><span class=\"lineno\"> 1558</span>&#160;        <span class=\"comment\">// yyyz</span></div>\n<div class=\"line\"><a name=\"l01559\"></a><span class=\"lineno\"> 1559</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01560\"></a><span class=\"lineno\"> 1560</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01561\"></a><span class=\"lineno\"> 1561</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01562\"></a><span class=\"lineno\"> 1562</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01563\"></a><span class=\"lineno\"> 1563</span>&#160;</div>\n<div class=\"line\"><a name=\"l01564\"></a><span class=\"lineno\"> 1564</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01565\"></a><span class=\"lineno\"> 1565</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01566\"></a><span class=\"lineno\"> 1566</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01567\"></a><span class=\"lineno\"> 1567</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01568\"></a><span class=\"lineno\"> 1568</span>&#160;</div>\n<div class=\"line\"><a name=\"l01569\"></a><span class=\"lineno\"> 1569</span>&#160;        <span class=\"comment\">// yyyw</span></div>\n<div class=\"line\"><a name=\"l01570\"></a><span class=\"lineno\"> 1570</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01571\"></a><span class=\"lineno\"> 1571</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01572\"></a><span class=\"lineno\"> 1572</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l01573\"></a><span class=\"lineno\"> 1573</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01574\"></a><span class=\"lineno\"> 1574</span>&#160;</div>\n<div class=\"line\"><a name=\"l01575\"></a><span class=\"lineno\"> 1575</span>&#160;        <span class=\"comment\">// yyzx</span></div>\n<div class=\"line\"><a name=\"l01576\"></a><span class=\"lineno\"> 1576</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01577\"></a><span class=\"lineno\"> 1577</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01578\"></a><span class=\"lineno\"> 1578</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01579\"></a><span class=\"lineno\"> 1579</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01580\"></a><span class=\"lineno\"> 1580</span>&#160;</div>\n<div class=\"line\"><a name=\"l01581\"></a><span class=\"lineno\"> 1581</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01582\"></a><span class=\"lineno\"> 1582</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01583\"></a><span class=\"lineno\"> 1583</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01584\"></a><span class=\"lineno\"> 1584</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01585\"></a><span class=\"lineno\"> 1585</span>&#160;</div>\n<div class=\"line\"><a name=\"l01586\"></a><span class=\"lineno\"> 1586</span>&#160;        <span class=\"comment\">// yyzy</span></div>\n<div class=\"line\"><a name=\"l01587\"></a><span class=\"lineno\"> 1587</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01588\"></a><span class=\"lineno\"> 1588</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01589\"></a><span class=\"lineno\"> 1589</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01590\"></a><span class=\"lineno\"> 1590</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01591\"></a><span class=\"lineno\"> 1591</span>&#160;</div>\n<div class=\"line\"><a name=\"l01592\"></a><span class=\"lineno\"> 1592</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01593\"></a><span class=\"lineno\"> 1593</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01594\"></a><span class=\"lineno\"> 1594</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01595\"></a><span class=\"lineno\"> 1595</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01596\"></a><span class=\"lineno\"> 1596</span>&#160;</div>\n<div class=\"line\"><a name=\"l01597\"></a><span class=\"lineno\"> 1597</span>&#160;        <span class=\"comment\">// yyzz</span></div>\n<div class=\"line\"><a name=\"l01598\"></a><span class=\"lineno\"> 1598</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01599\"></a><span class=\"lineno\"> 1599</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01600\"></a><span class=\"lineno\"> 1600</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01601\"></a><span class=\"lineno\"> 1601</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01602\"></a><span class=\"lineno\"> 1602</span>&#160;</div>\n<div class=\"line\"><a name=\"l01603\"></a><span class=\"lineno\"> 1603</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01604\"></a><span class=\"lineno\"> 1604</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01605\"></a><span class=\"lineno\"> 1605</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01606\"></a><span class=\"lineno\"> 1606</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01607\"></a><span class=\"lineno\"> 1607</span>&#160;</div>\n<div class=\"line\"><a name=\"l01608\"></a><span class=\"lineno\"> 1608</span>&#160;        <span class=\"comment\">// yyzw</span></div>\n<div class=\"line\"><a name=\"l01609\"></a><span class=\"lineno\"> 1609</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01610\"></a><span class=\"lineno\"> 1610</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01611\"></a><span class=\"lineno\"> 1611</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l01612\"></a><span class=\"lineno\"> 1612</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01613\"></a><span class=\"lineno\"> 1613</span>&#160;</div>\n<div class=\"line\"><a name=\"l01614\"></a><span class=\"lineno\"> 1614</span>&#160;        <span class=\"comment\">// yywx</span></div>\n<div class=\"line\"><a name=\"l01615\"></a><span class=\"lineno\"> 1615</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01616\"></a><span class=\"lineno\"> 1616</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yywx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01617\"></a><span class=\"lineno\"> 1617</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l01618\"></a><span class=\"lineno\"> 1618</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01619\"></a><span class=\"lineno\"> 1619</span>&#160;</div>\n<div class=\"line\"><a name=\"l01620\"></a><span class=\"lineno\"> 1620</span>&#160;        <span class=\"comment\">// yywy</span></div>\n<div class=\"line\"><a name=\"l01621\"></a><span class=\"lineno\"> 1621</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01622\"></a><span class=\"lineno\"> 1622</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yywy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01623\"></a><span class=\"lineno\"> 1623</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l01624\"></a><span class=\"lineno\"> 1624</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01625\"></a><span class=\"lineno\"> 1625</span>&#160;</div>\n<div class=\"line\"><a name=\"l01626\"></a><span class=\"lineno\"> 1626</span>&#160;        <span class=\"comment\">// yywz</span></div>\n<div class=\"line\"><a name=\"l01627\"></a><span class=\"lineno\"> 1627</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01628\"></a><span class=\"lineno\"> 1628</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yywz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01629\"></a><span class=\"lineno\"> 1629</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l01630\"></a><span class=\"lineno\"> 1630</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01631\"></a><span class=\"lineno\"> 1631</span>&#160;</div>\n<div class=\"line\"><a name=\"l01632\"></a><span class=\"lineno\"> 1632</span>&#160;        <span class=\"comment\">// yyww</span></div>\n<div class=\"line\"><a name=\"l01633\"></a><span class=\"lineno\"> 1633</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01634\"></a><span class=\"lineno\"> 1634</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yyww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01635\"></a><span class=\"lineno\"> 1635</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.y, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l01636\"></a><span class=\"lineno\"> 1636</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01637\"></a><span class=\"lineno\"> 1637</span>&#160;</div>\n<div class=\"line\"><a name=\"l01638\"></a><span class=\"lineno\"> 1638</span>&#160;        <span class=\"comment\">// yzxx</span></div>\n<div class=\"line\"><a name=\"l01639\"></a><span class=\"lineno\"> 1639</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01640\"></a><span class=\"lineno\"> 1640</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01641\"></a><span class=\"lineno\"> 1641</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01642\"></a><span class=\"lineno\"> 1642</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01643\"></a><span class=\"lineno\"> 1643</span>&#160;</div>\n<div class=\"line\"><a name=\"l01644\"></a><span class=\"lineno\"> 1644</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01645\"></a><span class=\"lineno\"> 1645</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01646\"></a><span class=\"lineno\"> 1646</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01647\"></a><span class=\"lineno\"> 1647</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01648\"></a><span class=\"lineno\"> 1648</span>&#160;</div>\n<div class=\"line\"><a name=\"l01649\"></a><span class=\"lineno\"> 1649</span>&#160;        <span class=\"comment\">// yzxy</span></div>\n<div class=\"line\"><a name=\"l01650\"></a><span class=\"lineno\"> 1650</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01651\"></a><span class=\"lineno\"> 1651</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01652\"></a><span class=\"lineno\"> 1652</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01653\"></a><span class=\"lineno\"> 1653</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01654\"></a><span class=\"lineno\"> 1654</span>&#160;</div>\n<div class=\"line\"><a name=\"l01655\"></a><span class=\"lineno\"> 1655</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01656\"></a><span class=\"lineno\"> 1656</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01657\"></a><span class=\"lineno\"> 1657</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01658\"></a><span class=\"lineno\"> 1658</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01659\"></a><span class=\"lineno\"> 1659</span>&#160;</div>\n<div class=\"line\"><a name=\"l01660\"></a><span class=\"lineno\"> 1660</span>&#160;        <span class=\"comment\">// yzxz</span></div>\n<div class=\"line\"><a name=\"l01661\"></a><span class=\"lineno\"> 1661</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01662\"></a><span class=\"lineno\"> 1662</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01663\"></a><span class=\"lineno\"> 1663</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01664\"></a><span class=\"lineno\"> 1664</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01665\"></a><span class=\"lineno\"> 1665</span>&#160;</div>\n<div class=\"line\"><a name=\"l01666\"></a><span class=\"lineno\"> 1666</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01667\"></a><span class=\"lineno\"> 1667</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01668\"></a><span class=\"lineno\"> 1668</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01669\"></a><span class=\"lineno\"> 1669</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01670\"></a><span class=\"lineno\"> 1670</span>&#160;</div>\n<div class=\"line\"><a name=\"l01671\"></a><span class=\"lineno\"> 1671</span>&#160;        <span class=\"comment\">// yzxw</span></div>\n<div class=\"line\"><a name=\"l01672\"></a><span class=\"lineno\"> 1672</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01673\"></a><span class=\"lineno\"> 1673</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01674\"></a><span class=\"lineno\"> 1674</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l01675\"></a><span class=\"lineno\"> 1675</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01676\"></a><span class=\"lineno\"> 1676</span>&#160;</div>\n<div class=\"line\"><a name=\"l01677\"></a><span class=\"lineno\"> 1677</span>&#160;        <span class=\"comment\">// yzyx</span></div>\n<div class=\"line\"><a name=\"l01678\"></a><span class=\"lineno\"> 1678</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01679\"></a><span class=\"lineno\"> 1679</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01680\"></a><span class=\"lineno\"> 1680</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01681\"></a><span class=\"lineno\"> 1681</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01682\"></a><span class=\"lineno\"> 1682</span>&#160;</div>\n<div class=\"line\"><a name=\"l01683\"></a><span class=\"lineno\"> 1683</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01684\"></a><span class=\"lineno\"> 1684</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01685\"></a><span class=\"lineno\"> 1685</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01686\"></a><span class=\"lineno\"> 1686</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01687\"></a><span class=\"lineno\"> 1687</span>&#160;</div>\n<div class=\"line\"><a name=\"l01688\"></a><span class=\"lineno\"> 1688</span>&#160;        <span class=\"comment\">// yzyy</span></div>\n<div class=\"line\"><a name=\"l01689\"></a><span class=\"lineno\"> 1689</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01690\"></a><span class=\"lineno\"> 1690</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01691\"></a><span class=\"lineno\"> 1691</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01692\"></a><span class=\"lineno\"> 1692</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01693\"></a><span class=\"lineno\"> 1693</span>&#160;</div>\n<div class=\"line\"><a name=\"l01694\"></a><span class=\"lineno\"> 1694</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01695\"></a><span class=\"lineno\"> 1695</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01696\"></a><span class=\"lineno\"> 1696</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01697\"></a><span class=\"lineno\"> 1697</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01698\"></a><span class=\"lineno\"> 1698</span>&#160;</div>\n<div class=\"line\"><a name=\"l01699\"></a><span class=\"lineno\"> 1699</span>&#160;        <span class=\"comment\">// yzyz</span></div>\n<div class=\"line\"><a name=\"l01700\"></a><span class=\"lineno\"> 1700</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01701\"></a><span class=\"lineno\"> 1701</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01702\"></a><span class=\"lineno\"> 1702</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01703\"></a><span class=\"lineno\"> 1703</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01704\"></a><span class=\"lineno\"> 1704</span>&#160;</div>\n<div class=\"line\"><a name=\"l01705\"></a><span class=\"lineno\"> 1705</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01706\"></a><span class=\"lineno\"> 1706</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01707\"></a><span class=\"lineno\"> 1707</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01708\"></a><span class=\"lineno\"> 1708</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01709\"></a><span class=\"lineno\"> 1709</span>&#160;</div>\n<div class=\"line\"><a name=\"l01710\"></a><span class=\"lineno\"> 1710</span>&#160;        <span class=\"comment\">// yzyw</span></div>\n<div class=\"line\"><a name=\"l01711\"></a><span class=\"lineno\"> 1711</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01712\"></a><span class=\"lineno\"> 1712</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01713\"></a><span class=\"lineno\"> 1713</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l01714\"></a><span class=\"lineno\"> 1714</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01715\"></a><span class=\"lineno\"> 1715</span>&#160;</div>\n<div class=\"line\"><a name=\"l01716\"></a><span class=\"lineno\"> 1716</span>&#160;        <span class=\"comment\">// yzzx</span></div>\n<div class=\"line\"><a name=\"l01717\"></a><span class=\"lineno\"> 1717</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01718\"></a><span class=\"lineno\"> 1718</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01719\"></a><span class=\"lineno\"> 1719</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01720\"></a><span class=\"lineno\"> 1720</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01721\"></a><span class=\"lineno\"> 1721</span>&#160;</div>\n<div class=\"line\"><a name=\"l01722\"></a><span class=\"lineno\"> 1722</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01723\"></a><span class=\"lineno\"> 1723</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01724\"></a><span class=\"lineno\"> 1724</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01725\"></a><span class=\"lineno\"> 1725</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01726\"></a><span class=\"lineno\"> 1726</span>&#160;</div>\n<div class=\"line\"><a name=\"l01727\"></a><span class=\"lineno\"> 1727</span>&#160;        <span class=\"comment\">// yzzy</span></div>\n<div class=\"line\"><a name=\"l01728\"></a><span class=\"lineno\"> 1728</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01729\"></a><span class=\"lineno\"> 1729</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01730\"></a><span class=\"lineno\"> 1730</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01731\"></a><span class=\"lineno\"> 1731</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01732\"></a><span class=\"lineno\"> 1732</span>&#160;</div>\n<div class=\"line\"><a name=\"l01733\"></a><span class=\"lineno\"> 1733</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01734\"></a><span class=\"lineno\"> 1734</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01735\"></a><span class=\"lineno\"> 1735</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01736\"></a><span class=\"lineno\"> 1736</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01737\"></a><span class=\"lineno\"> 1737</span>&#160;</div>\n<div class=\"line\"><a name=\"l01738\"></a><span class=\"lineno\"> 1738</span>&#160;        <span class=\"comment\">// yzzz</span></div>\n<div class=\"line\"><a name=\"l01739\"></a><span class=\"lineno\"> 1739</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01740\"></a><span class=\"lineno\"> 1740</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01741\"></a><span class=\"lineno\"> 1741</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01742\"></a><span class=\"lineno\"> 1742</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01743\"></a><span class=\"lineno\"> 1743</span>&#160;</div>\n<div class=\"line\"><a name=\"l01744\"></a><span class=\"lineno\"> 1744</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01745\"></a><span class=\"lineno\"> 1745</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01746\"></a><span class=\"lineno\"> 1746</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01747\"></a><span class=\"lineno\"> 1747</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01748\"></a><span class=\"lineno\"> 1748</span>&#160;</div>\n<div class=\"line\"><a name=\"l01749\"></a><span class=\"lineno\"> 1749</span>&#160;        <span class=\"comment\">// yzzw</span></div>\n<div class=\"line\"><a name=\"l01750\"></a><span class=\"lineno\"> 1750</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01751\"></a><span class=\"lineno\"> 1751</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01752\"></a><span class=\"lineno\"> 1752</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l01753\"></a><span class=\"lineno\"> 1753</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01754\"></a><span class=\"lineno\"> 1754</span>&#160;</div>\n<div class=\"line\"><a name=\"l01755\"></a><span class=\"lineno\"> 1755</span>&#160;        <span class=\"comment\">// yzwx</span></div>\n<div class=\"line\"><a name=\"l01756\"></a><span class=\"lineno\"> 1756</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01757\"></a><span class=\"lineno\"> 1757</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01758\"></a><span class=\"lineno\"> 1758</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l01759\"></a><span class=\"lineno\"> 1759</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01760\"></a><span class=\"lineno\"> 1760</span>&#160;</div>\n<div class=\"line\"><a name=\"l01761\"></a><span class=\"lineno\"> 1761</span>&#160;        <span class=\"comment\">// yzwy</span></div>\n<div class=\"line\"><a name=\"l01762\"></a><span class=\"lineno\"> 1762</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01763\"></a><span class=\"lineno\"> 1763</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01764\"></a><span class=\"lineno\"> 1764</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l01765\"></a><span class=\"lineno\"> 1765</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01766\"></a><span class=\"lineno\"> 1766</span>&#160;</div>\n<div class=\"line\"><a name=\"l01767\"></a><span class=\"lineno\"> 1767</span>&#160;        <span class=\"comment\">// yzwz</span></div>\n<div class=\"line\"><a name=\"l01768\"></a><span class=\"lineno\"> 1768</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01769\"></a><span class=\"lineno\"> 1769</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01770\"></a><span class=\"lineno\"> 1770</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l01771\"></a><span class=\"lineno\"> 1771</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01772\"></a><span class=\"lineno\"> 1772</span>&#160;</div>\n<div class=\"line\"><a name=\"l01773\"></a><span class=\"lineno\"> 1773</span>&#160;        <span class=\"comment\">// yzww</span></div>\n<div class=\"line\"><a name=\"l01774\"></a><span class=\"lineno\"> 1774</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01775\"></a><span class=\"lineno\"> 1775</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; yzww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01776\"></a><span class=\"lineno\"> 1776</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.z, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l01777\"></a><span class=\"lineno\"> 1777</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01778\"></a><span class=\"lineno\"> 1778</span>&#160;</div>\n<div class=\"line\"><a name=\"l01779\"></a><span class=\"lineno\"> 1779</span>&#160;        <span class=\"comment\">// ywxx</span></div>\n<div class=\"line\"><a name=\"l01780\"></a><span class=\"lineno\"> 1780</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01781\"></a><span class=\"lineno\"> 1781</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01782\"></a><span class=\"lineno\"> 1782</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01783\"></a><span class=\"lineno\"> 1783</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01784\"></a><span class=\"lineno\"> 1784</span>&#160;</div>\n<div class=\"line\"><a name=\"l01785\"></a><span class=\"lineno\"> 1785</span>&#160;        <span class=\"comment\">// ywxy</span></div>\n<div class=\"line\"><a name=\"l01786\"></a><span class=\"lineno\"> 1786</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01787\"></a><span class=\"lineno\"> 1787</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01788\"></a><span class=\"lineno\"> 1788</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01789\"></a><span class=\"lineno\"> 1789</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01790\"></a><span class=\"lineno\"> 1790</span>&#160;</div>\n<div class=\"line\"><a name=\"l01791\"></a><span class=\"lineno\"> 1791</span>&#160;        <span class=\"comment\">// ywxz</span></div>\n<div class=\"line\"><a name=\"l01792\"></a><span class=\"lineno\"> 1792</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01793\"></a><span class=\"lineno\"> 1793</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01794\"></a><span class=\"lineno\"> 1794</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01795\"></a><span class=\"lineno\"> 1795</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01796\"></a><span class=\"lineno\"> 1796</span>&#160;</div>\n<div class=\"line\"><a name=\"l01797\"></a><span class=\"lineno\"> 1797</span>&#160;        <span class=\"comment\">// ywxw</span></div>\n<div class=\"line\"><a name=\"l01798\"></a><span class=\"lineno\"> 1798</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01799\"></a><span class=\"lineno\"> 1799</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01800\"></a><span class=\"lineno\"> 1800</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l01801\"></a><span class=\"lineno\"> 1801</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01802\"></a><span class=\"lineno\"> 1802</span>&#160;</div>\n<div class=\"line\"><a name=\"l01803\"></a><span class=\"lineno\"> 1803</span>&#160;        <span class=\"comment\">// ywyx</span></div>\n<div class=\"line\"><a name=\"l01804\"></a><span class=\"lineno\"> 1804</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01805\"></a><span class=\"lineno\"> 1805</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01806\"></a><span class=\"lineno\"> 1806</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01807\"></a><span class=\"lineno\"> 1807</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01808\"></a><span class=\"lineno\"> 1808</span>&#160;</div>\n<div class=\"line\"><a name=\"l01809\"></a><span class=\"lineno\"> 1809</span>&#160;        <span class=\"comment\">// ywyy</span></div>\n<div class=\"line\"><a name=\"l01810\"></a><span class=\"lineno\"> 1810</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01811\"></a><span class=\"lineno\"> 1811</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01812\"></a><span class=\"lineno\"> 1812</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01813\"></a><span class=\"lineno\"> 1813</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01814\"></a><span class=\"lineno\"> 1814</span>&#160;</div>\n<div class=\"line\"><a name=\"l01815\"></a><span class=\"lineno\"> 1815</span>&#160;        <span class=\"comment\">// ywyz</span></div>\n<div class=\"line\"><a name=\"l01816\"></a><span class=\"lineno\"> 1816</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01817\"></a><span class=\"lineno\"> 1817</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01818\"></a><span class=\"lineno\"> 1818</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01819\"></a><span class=\"lineno\"> 1819</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01820\"></a><span class=\"lineno\"> 1820</span>&#160;</div>\n<div class=\"line\"><a name=\"l01821\"></a><span class=\"lineno\"> 1821</span>&#160;        <span class=\"comment\">// ywyw</span></div>\n<div class=\"line\"><a name=\"l01822\"></a><span class=\"lineno\"> 1822</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01823\"></a><span class=\"lineno\"> 1823</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01824\"></a><span class=\"lineno\"> 1824</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l01825\"></a><span class=\"lineno\"> 1825</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01826\"></a><span class=\"lineno\"> 1826</span>&#160;</div>\n<div class=\"line\"><a name=\"l01827\"></a><span class=\"lineno\"> 1827</span>&#160;        <span class=\"comment\">// ywzx</span></div>\n<div class=\"line\"><a name=\"l01828\"></a><span class=\"lineno\"> 1828</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01829\"></a><span class=\"lineno\"> 1829</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01830\"></a><span class=\"lineno\"> 1830</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01831\"></a><span class=\"lineno\"> 1831</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01832\"></a><span class=\"lineno\"> 1832</span>&#160;</div>\n<div class=\"line\"><a name=\"l01833\"></a><span class=\"lineno\"> 1833</span>&#160;        <span class=\"comment\">// ywzy</span></div>\n<div class=\"line\"><a name=\"l01834\"></a><span class=\"lineno\"> 1834</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01835\"></a><span class=\"lineno\"> 1835</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01836\"></a><span class=\"lineno\"> 1836</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01837\"></a><span class=\"lineno\"> 1837</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01838\"></a><span class=\"lineno\"> 1838</span>&#160;</div>\n<div class=\"line\"><a name=\"l01839\"></a><span class=\"lineno\"> 1839</span>&#160;        <span class=\"comment\">// ywzz</span></div>\n<div class=\"line\"><a name=\"l01840\"></a><span class=\"lineno\"> 1840</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01841\"></a><span class=\"lineno\"> 1841</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01842\"></a><span class=\"lineno\"> 1842</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01843\"></a><span class=\"lineno\"> 1843</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01844\"></a><span class=\"lineno\"> 1844</span>&#160;</div>\n<div class=\"line\"><a name=\"l01845\"></a><span class=\"lineno\"> 1845</span>&#160;        <span class=\"comment\">// ywzw</span></div>\n<div class=\"line\"><a name=\"l01846\"></a><span class=\"lineno\"> 1846</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01847\"></a><span class=\"lineno\"> 1847</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01848\"></a><span class=\"lineno\"> 1848</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l01849\"></a><span class=\"lineno\"> 1849</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01850\"></a><span class=\"lineno\"> 1850</span>&#160;</div>\n<div class=\"line\"><a name=\"l01851\"></a><span class=\"lineno\"> 1851</span>&#160;        <span class=\"comment\">// ywwx</span></div>\n<div class=\"line\"><a name=\"l01852\"></a><span class=\"lineno\"> 1852</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01853\"></a><span class=\"lineno\"> 1853</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01854\"></a><span class=\"lineno\"> 1854</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l01855\"></a><span class=\"lineno\"> 1855</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01856\"></a><span class=\"lineno\"> 1856</span>&#160;</div>\n<div class=\"line\"><a name=\"l01857\"></a><span class=\"lineno\"> 1857</span>&#160;        <span class=\"comment\">// ywwy</span></div>\n<div class=\"line\"><a name=\"l01858\"></a><span class=\"lineno\"> 1858</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01859\"></a><span class=\"lineno\"> 1859</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01860\"></a><span class=\"lineno\"> 1860</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l01861\"></a><span class=\"lineno\"> 1861</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01862\"></a><span class=\"lineno\"> 1862</span>&#160;</div>\n<div class=\"line\"><a name=\"l01863\"></a><span class=\"lineno\"> 1863</span>&#160;        <span class=\"comment\">// ywwz</span></div>\n<div class=\"line\"><a name=\"l01864\"></a><span class=\"lineno\"> 1864</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01865\"></a><span class=\"lineno\"> 1865</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01866\"></a><span class=\"lineno\"> 1866</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l01867\"></a><span class=\"lineno\"> 1867</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01868\"></a><span class=\"lineno\"> 1868</span>&#160;</div>\n<div class=\"line\"><a name=\"l01869\"></a><span class=\"lineno\"> 1869</span>&#160;        <span class=\"comment\">// ywww</span></div>\n<div class=\"line\"><a name=\"l01870\"></a><span class=\"lineno\"> 1870</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01871\"></a><span class=\"lineno\"> 1871</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; ywww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01872\"></a><span class=\"lineno\"> 1872</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.y, v.w, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l01873\"></a><span class=\"lineno\"> 1873</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01874\"></a><span class=\"lineno\"> 1874</span>&#160;</div>\n<div class=\"line\"><a name=\"l01875\"></a><span class=\"lineno\"> 1875</span>&#160;        <span class=\"comment\">// zxxx</span></div>\n<div class=\"line\"><a name=\"l01876\"></a><span class=\"lineno\"> 1876</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01877\"></a><span class=\"lineno\"> 1877</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01878\"></a><span class=\"lineno\"> 1878</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01879\"></a><span class=\"lineno\"> 1879</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01880\"></a><span class=\"lineno\"> 1880</span>&#160;</div>\n<div class=\"line\"><a name=\"l01881\"></a><span class=\"lineno\"> 1881</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01882\"></a><span class=\"lineno\"> 1882</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01883\"></a><span class=\"lineno\"> 1883</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l01884\"></a><span class=\"lineno\"> 1884</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01885\"></a><span class=\"lineno\"> 1885</span>&#160;</div>\n<div class=\"line\"><a name=\"l01886\"></a><span class=\"lineno\"> 1886</span>&#160;        <span class=\"comment\">// zxxy</span></div>\n<div class=\"line\"><a name=\"l01887\"></a><span class=\"lineno\"> 1887</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01888\"></a><span class=\"lineno\"> 1888</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01889\"></a><span class=\"lineno\"> 1889</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01890\"></a><span class=\"lineno\"> 1890</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01891\"></a><span class=\"lineno\"> 1891</span>&#160;</div>\n<div class=\"line\"><a name=\"l01892\"></a><span class=\"lineno\"> 1892</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01893\"></a><span class=\"lineno\"> 1893</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01894\"></a><span class=\"lineno\"> 1894</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l01895\"></a><span class=\"lineno\"> 1895</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01896\"></a><span class=\"lineno\"> 1896</span>&#160;</div>\n<div class=\"line\"><a name=\"l01897\"></a><span class=\"lineno\"> 1897</span>&#160;        <span class=\"comment\">// zxxz</span></div>\n<div class=\"line\"><a name=\"l01898\"></a><span class=\"lineno\"> 1898</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01899\"></a><span class=\"lineno\"> 1899</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01900\"></a><span class=\"lineno\"> 1900</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01901\"></a><span class=\"lineno\"> 1901</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01902\"></a><span class=\"lineno\"> 1902</span>&#160;</div>\n<div class=\"line\"><a name=\"l01903\"></a><span class=\"lineno\"> 1903</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01904\"></a><span class=\"lineno\"> 1904</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01905\"></a><span class=\"lineno\"> 1905</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l01906\"></a><span class=\"lineno\"> 1906</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01907\"></a><span class=\"lineno\"> 1907</span>&#160;</div>\n<div class=\"line\"><a name=\"l01908\"></a><span class=\"lineno\"> 1908</span>&#160;        <span class=\"comment\">// zxxw</span></div>\n<div class=\"line\"><a name=\"l01909\"></a><span class=\"lineno\"> 1909</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01910\"></a><span class=\"lineno\"> 1910</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01911\"></a><span class=\"lineno\"> 1911</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l01912\"></a><span class=\"lineno\"> 1912</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01913\"></a><span class=\"lineno\"> 1913</span>&#160;</div>\n<div class=\"line\"><a name=\"l01914\"></a><span class=\"lineno\"> 1914</span>&#160;        <span class=\"comment\">// zxyx</span></div>\n<div class=\"line\"><a name=\"l01915\"></a><span class=\"lineno\"> 1915</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01916\"></a><span class=\"lineno\"> 1916</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01917\"></a><span class=\"lineno\"> 1917</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01918\"></a><span class=\"lineno\"> 1918</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01919\"></a><span class=\"lineno\"> 1919</span>&#160;</div>\n<div class=\"line\"><a name=\"l01920\"></a><span class=\"lineno\"> 1920</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01921\"></a><span class=\"lineno\"> 1921</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01922\"></a><span class=\"lineno\"> 1922</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l01923\"></a><span class=\"lineno\"> 1923</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01924\"></a><span class=\"lineno\"> 1924</span>&#160;</div>\n<div class=\"line\"><a name=\"l01925\"></a><span class=\"lineno\"> 1925</span>&#160;        <span class=\"comment\">// zxyy</span></div>\n<div class=\"line\"><a name=\"l01926\"></a><span class=\"lineno\"> 1926</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01927\"></a><span class=\"lineno\"> 1927</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01928\"></a><span class=\"lineno\"> 1928</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01929\"></a><span class=\"lineno\"> 1929</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01930\"></a><span class=\"lineno\"> 1930</span>&#160;</div>\n<div class=\"line\"><a name=\"l01931\"></a><span class=\"lineno\"> 1931</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01932\"></a><span class=\"lineno\"> 1932</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01933\"></a><span class=\"lineno\"> 1933</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l01934\"></a><span class=\"lineno\"> 1934</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01935\"></a><span class=\"lineno\"> 1935</span>&#160;</div>\n<div class=\"line\"><a name=\"l01936\"></a><span class=\"lineno\"> 1936</span>&#160;        <span class=\"comment\">// zxyz</span></div>\n<div class=\"line\"><a name=\"l01937\"></a><span class=\"lineno\"> 1937</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01938\"></a><span class=\"lineno\"> 1938</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01939\"></a><span class=\"lineno\"> 1939</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01940\"></a><span class=\"lineno\"> 1940</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01941\"></a><span class=\"lineno\"> 1941</span>&#160;</div>\n<div class=\"line\"><a name=\"l01942\"></a><span class=\"lineno\"> 1942</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01943\"></a><span class=\"lineno\"> 1943</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01944\"></a><span class=\"lineno\"> 1944</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l01945\"></a><span class=\"lineno\"> 1945</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01946\"></a><span class=\"lineno\"> 1946</span>&#160;</div>\n<div class=\"line\"><a name=\"l01947\"></a><span class=\"lineno\"> 1947</span>&#160;        <span class=\"comment\">// zxyw</span></div>\n<div class=\"line\"><a name=\"l01948\"></a><span class=\"lineno\"> 1948</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01949\"></a><span class=\"lineno\"> 1949</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01950\"></a><span class=\"lineno\"> 1950</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l01951\"></a><span class=\"lineno\"> 1951</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01952\"></a><span class=\"lineno\"> 1952</span>&#160;</div>\n<div class=\"line\"><a name=\"l01953\"></a><span class=\"lineno\"> 1953</span>&#160;        <span class=\"comment\">// zxzx</span></div>\n<div class=\"line\"><a name=\"l01954\"></a><span class=\"lineno\"> 1954</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01955\"></a><span class=\"lineno\"> 1955</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01956\"></a><span class=\"lineno\"> 1956</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01957\"></a><span class=\"lineno\"> 1957</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01958\"></a><span class=\"lineno\"> 1958</span>&#160;</div>\n<div class=\"line\"><a name=\"l01959\"></a><span class=\"lineno\"> 1959</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01960\"></a><span class=\"lineno\"> 1960</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01961\"></a><span class=\"lineno\"> 1961</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l01962\"></a><span class=\"lineno\"> 1962</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01963\"></a><span class=\"lineno\"> 1963</span>&#160;</div>\n<div class=\"line\"><a name=\"l01964\"></a><span class=\"lineno\"> 1964</span>&#160;        <span class=\"comment\">// zxzy</span></div>\n<div class=\"line\"><a name=\"l01965\"></a><span class=\"lineno\"> 1965</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01966\"></a><span class=\"lineno\"> 1966</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01967\"></a><span class=\"lineno\"> 1967</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01968\"></a><span class=\"lineno\"> 1968</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01969\"></a><span class=\"lineno\"> 1969</span>&#160;</div>\n<div class=\"line\"><a name=\"l01970\"></a><span class=\"lineno\"> 1970</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01971\"></a><span class=\"lineno\"> 1971</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01972\"></a><span class=\"lineno\"> 1972</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l01973\"></a><span class=\"lineno\"> 1973</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01974\"></a><span class=\"lineno\"> 1974</span>&#160;</div>\n<div class=\"line\"><a name=\"l01975\"></a><span class=\"lineno\"> 1975</span>&#160;        <span class=\"comment\">// zxzz</span></div>\n<div class=\"line\"><a name=\"l01976\"></a><span class=\"lineno\"> 1976</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01977\"></a><span class=\"lineno\"> 1977</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01978\"></a><span class=\"lineno\"> 1978</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01979\"></a><span class=\"lineno\"> 1979</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01980\"></a><span class=\"lineno\"> 1980</span>&#160;</div>\n<div class=\"line\"><a name=\"l01981\"></a><span class=\"lineno\"> 1981</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01982\"></a><span class=\"lineno\"> 1982</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01983\"></a><span class=\"lineno\"> 1983</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l01984\"></a><span class=\"lineno\"> 1984</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01985\"></a><span class=\"lineno\"> 1985</span>&#160;</div>\n<div class=\"line\"><a name=\"l01986\"></a><span class=\"lineno\"> 1986</span>&#160;        <span class=\"comment\">// zxzw</span></div>\n<div class=\"line\"><a name=\"l01987\"></a><span class=\"lineno\"> 1987</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01988\"></a><span class=\"lineno\"> 1988</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01989\"></a><span class=\"lineno\"> 1989</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l01990\"></a><span class=\"lineno\"> 1990</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01991\"></a><span class=\"lineno\"> 1991</span>&#160;</div>\n<div class=\"line\"><a name=\"l01992\"></a><span class=\"lineno\"> 1992</span>&#160;        <span class=\"comment\">// zxwx</span></div>\n<div class=\"line\"><a name=\"l01993\"></a><span class=\"lineno\"> 1993</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l01994\"></a><span class=\"lineno\"> 1994</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l01995\"></a><span class=\"lineno\"> 1995</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l01996\"></a><span class=\"lineno\"> 1996</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l01997\"></a><span class=\"lineno\"> 1997</span>&#160;</div>\n<div class=\"line\"><a name=\"l01998\"></a><span class=\"lineno\"> 1998</span>&#160;        <span class=\"comment\">// zxwy</span></div>\n<div class=\"line\"><a name=\"l01999\"></a><span class=\"lineno\"> 1999</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02000\"></a><span class=\"lineno\"> 2000</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02001\"></a><span class=\"lineno\"> 2001</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l02002\"></a><span class=\"lineno\"> 2002</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02003\"></a><span class=\"lineno\"> 2003</span>&#160;</div>\n<div class=\"line\"><a name=\"l02004\"></a><span class=\"lineno\"> 2004</span>&#160;        <span class=\"comment\">// zxwz</span></div>\n<div class=\"line\"><a name=\"l02005\"></a><span class=\"lineno\"> 2005</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02006\"></a><span class=\"lineno\"> 2006</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02007\"></a><span class=\"lineno\"> 2007</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l02008\"></a><span class=\"lineno\"> 2008</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02009\"></a><span class=\"lineno\"> 2009</span>&#160;</div>\n<div class=\"line\"><a name=\"l02010\"></a><span class=\"lineno\"> 2010</span>&#160;        <span class=\"comment\">// zxww</span></div>\n<div class=\"line\"><a name=\"l02011\"></a><span class=\"lineno\"> 2011</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02012\"></a><span class=\"lineno\"> 2012</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zxww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02013\"></a><span class=\"lineno\"> 2013</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.x, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l02014\"></a><span class=\"lineno\"> 2014</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02015\"></a><span class=\"lineno\"> 2015</span>&#160;</div>\n<div class=\"line\"><a name=\"l02016\"></a><span class=\"lineno\"> 2016</span>&#160;        <span class=\"comment\">// zyxx</span></div>\n<div class=\"line\"><a name=\"l02017\"></a><span class=\"lineno\"> 2017</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02018\"></a><span class=\"lineno\"> 2018</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02019\"></a><span class=\"lineno\"> 2019</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02020\"></a><span class=\"lineno\"> 2020</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02021\"></a><span class=\"lineno\"> 2021</span>&#160;</div>\n<div class=\"line\"><a name=\"l02022\"></a><span class=\"lineno\"> 2022</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02023\"></a><span class=\"lineno\"> 2023</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02024\"></a><span class=\"lineno\"> 2024</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02025\"></a><span class=\"lineno\"> 2025</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02026\"></a><span class=\"lineno\"> 2026</span>&#160;</div>\n<div class=\"line\"><a name=\"l02027\"></a><span class=\"lineno\"> 2027</span>&#160;        <span class=\"comment\">// zyxy</span></div>\n<div class=\"line\"><a name=\"l02028\"></a><span class=\"lineno\"> 2028</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02029\"></a><span class=\"lineno\"> 2029</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02030\"></a><span class=\"lineno\"> 2030</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02031\"></a><span class=\"lineno\"> 2031</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02032\"></a><span class=\"lineno\"> 2032</span>&#160;</div>\n<div class=\"line\"><a name=\"l02033\"></a><span class=\"lineno\"> 2033</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02034\"></a><span class=\"lineno\"> 2034</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02035\"></a><span class=\"lineno\"> 2035</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02036\"></a><span class=\"lineno\"> 2036</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02037\"></a><span class=\"lineno\"> 2037</span>&#160;</div>\n<div class=\"line\"><a name=\"l02038\"></a><span class=\"lineno\"> 2038</span>&#160;        <span class=\"comment\">// zyxz</span></div>\n<div class=\"line\"><a name=\"l02039\"></a><span class=\"lineno\"> 2039</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02040\"></a><span class=\"lineno\"> 2040</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02041\"></a><span class=\"lineno\"> 2041</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02042\"></a><span class=\"lineno\"> 2042</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02043\"></a><span class=\"lineno\"> 2043</span>&#160;</div>\n<div class=\"line\"><a name=\"l02044\"></a><span class=\"lineno\"> 2044</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02045\"></a><span class=\"lineno\"> 2045</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02046\"></a><span class=\"lineno\"> 2046</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02047\"></a><span class=\"lineno\"> 2047</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02048\"></a><span class=\"lineno\"> 2048</span>&#160;</div>\n<div class=\"line\"><a name=\"l02049\"></a><span class=\"lineno\"> 2049</span>&#160;        <span class=\"comment\">// zyxw</span></div>\n<div class=\"line\"><a name=\"l02050\"></a><span class=\"lineno\"> 2050</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02051\"></a><span class=\"lineno\"> 2051</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02052\"></a><span class=\"lineno\"> 2052</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l02053\"></a><span class=\"lineno\"> 2053</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02054\"></a><span class=\"lineno\"> 2054</span>&#160;</div>\n<div class=\"line\"><a name=\"l02055\"></a><span class=\"lineno\"> 2055</span>&#160;        <span class=\"comment\">// zyyx</span></div>\n<div class=\"line\"><a name=\"l02056\"></a><span class=\"lineno\"> 2056</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02057\"></a><span class=\"lineno\"> 2057</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02058\"></a><span class=\"lineno\"> 2058</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02059\"></a><span class=\"lineno\"> 2059</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02060\"></a><span class=\"lineno\"> 2060</span>&#160;</div>\n<div class=\"line\"><a name=\"l02061\"></a><span class=\"lineno\"> 2061</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02062\"></a><span class=\"lineno\"> 2062</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02063\"></a><span class=\"lineno\"> 2063</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02064\"></a><span class=\"lineno\"> 2064</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02065\"></a><span class=\"lineno\"> 2065</span>&#160;</div>\n<div class=\"line\"><a name=\"l02066\"></a><span class=\"lineno\"> 2066</span>&#160;        <span class=\"comment\">// zyyy</span></div>\n<div class=\"line\"><a name=\"l02067\"></a><span class=\"lineno\"> 2067</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02068\"></a><span class=\"lineno\"> 2068</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02069\"></a><span class=\"lineno\"> 2069</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02070\"></a><span class=\"lineno\"> 2070</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02071\"></a><span class=\"lineno\"> 2071</span>&#160;</div>\n<div class=\"line\"><a name=\"l02072\"></a><span class=\"lineno\"> 2072</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02073\"></a><span class=\"lineno\"> 2073</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02074\"></a><span class=\"lineno\"> 2074</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02075\"></a><span class=\"lineno\"> 2075</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02076\"></a><span class=\"lineno\"> 2076</span>&#160;</div>\n<div class=\"line\"><a name=\"l02077\"></a><span class=\"lineno\"> 2077</span>&#160;        <span class=\"comment\">// zyyz</span></div>\n<div class=\"line\"><a name=\"l02078\"></a><span class=\"lineno\"> 2078</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02079\"></a><span class=\"lineno\"> 2079</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02080\"></a><span class=\"lineno\"> 2080</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02081\"></a><span class=\"lineno\"> 2081</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02082\"></a><span class=\"lineno\"> 2082</span>&#160;</div>\n<div class=\"line\"><a name=\"l02083\"></a><span class=\"lineno\"> 2083</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02084\"></a><span class=\"lineno\"> 2084</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02085\"></a><span class=\"lineno\"> 2085</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02086\"></a><span class=\"lineno\"> 2086</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02087\"></a><span class=\"lineno\"> 2087</span>&#160;</div>\n<div class=\"line\"><a name=\"l02088\"></a><span class=\"lineno\"> 2088</span>&#160;        <span class=\"comment\">// zyyw</span></div>\n<div class=\"line\"><a name=\"l02089\"></a><span class=\"lineno\"> 2089</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02090\"></a><span class=\"lineno\"> 2090</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02091\"></a><span class=\"lineno\"> 2091</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l02092\"></a><span class=\"lineno\"> 2092</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02093\"></a><span class=\"lineno\"> 2093</span>&#160;</div>\n<div class=\"line\"><a name=\"l02094\"></a><span class=\"lineno\"> 2094</span>&#160;        <span class=\"comment\">// zyzx</span></div>\n<div class=\"line\"><a name=\"l02095\"></a><span class=\"lineno\"> 2095</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02096\"></a><span class=\"lineno\"> 2096</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02097\"></a><span class=\"lineno\"> 2097</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02098\"></a><span class=\"lineno\"> 2098</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02099\"></a><span class=\"lineno\"> 2099</span>&#160;</div>\n<div class=\"line\"><a name=\"l02100\"></a><span class=\"lineno\"> 2100</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02101\"></a><span class=\"lineno\"> 2101</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02102\"></a><span class=\"lineno\"> 2102</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02103\"></a><span class=\"lineno\"> 2103</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02104\"></a><span class=\"lineno\"> 2104</span>&#160;</div>\n<div class=\"line\"><a name=\"l02105\"></a><span class=\"lineno\"> 2105</span>&#160;        <span class=\"comment\">// zyzy</span></div>\n<div class=\"line\"><a name=\"l02106\"></a><span class=\"lineno\"> 2106</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02107\"></a><span class=\"lineno\"> 2107</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02108\"></a><span class=\"lineno\"> 2108</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02109\"></a><span class=\"lineno\"> 2109</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02110\"></a><span class=\"lineno\"> 2110</span>&#160;</div>\n<div class=\"line\"><a name=\"l02111\"></a><span class=\"lineno\"> 2111</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02112\"></a><span class=\"lineno\"> 2112</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02113\"></a><span class=\"lineno\"> 2113</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02114\"></a><span class=\"lineno\"> 2114</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02115\"></a><span class=\"lineno\"> 2115</span>&#160;</div>\n<div class=\"line\"><a name=\"l02116\"></a><span class=\"lineno\"> 2116</span>&#160;        <span class=\"comment\">// zyzz</span></div>\n<div class=\"line\"><a name=\"l02117\"></a><span class=\"lineno\"> 2117</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02118\"></a><span class=\"lineno\"> 2118</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02119\"></a><span class=\"lineno\"> 2119</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02120\"></a><span class=\"lineno\"> 2120</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02121\"></a><span class=\"lineno\"> 2121</span>&#160;</div>\n<div class=\"line\"><a name=\"l02122\"></a><span class=\"lineno\"> 2122</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02123\"></a><span class=\"lineno\"> 2123</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02124\"></a><span class=\"lineno\"> 2124</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02125\"></a><span class=\"lineno\"> 2125</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02126\"></a><span class=\"lineno\"> 2126</span>&#160;</div>\n<div class=\"line\"><a name=\"l02127\"></a><span class=\"lineno\"> 2127</span>&#160;        <span class=\"comment\">// zyzw</span></div>\n<div class=\"line\"><a name=\"l02128\"></a><span class=\"lineno\"> 2128</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02129\"></a><span class=\"lineno\"> 2129</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02130\"></a><span class=\"lineno\"> 2130</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l02131\"></a><span class=\"lineno\"> 2131</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02132\"></a><span class=\"lineno\"> 2132</span>&#160;</div>\n<div class=\"line\"><a name=\"l02133\"></a><span class=\"lineno\"> 2133</span>&#160;        <span class=\"comment\">// zywx</span></div>\n<div class=\"line\"><a name=\"l02134\"></a><span class=\"lineno\"> 2134</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02135\"></a><span class=\"lineno\"> 2135</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zywx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02136\"></a><span class=\"lineno\"> 2136</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l02137\"></a><span class=\"lineno\"> 2137</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02138\"></a><span class=\"lineno\"> 2138</span>&#160;</div>\n<div class=\"line\"><a name=\"l02139\"></a><span class=\"lineno\"> 2139</span>&#160;        <span class=\"comment\">// zywy</span></div>\n<div class=\"line\"><a name=\"l02140\"></a><span class=\"lineno\"> 2140</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02141\"></a><span class=\"lineno\"> 2141</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zywy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02142\"></a><span class=\"lineno\"> 2142</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l02143\"></a><span class=\"lineno\"> 2143</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02144\"></a><span class=\"lineno\"> 2144</span>&#160;</div>\n<div class=\"line\"><a name=\"l02145\"></a><span class=\"lineno\"> 2145</span>&#160;        <span class=\"comment\">// zywz</span></div>\n<div class=\"line\"><a name=\"l02146\"></a><span class=\"lineno\"> 2146</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02147\"></a><span class=\"lineno\"> 2147</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zywz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02148\"></a><span class=\"lineno\"> 2148</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l02149\"></a><span class=\"lineno\"> 2149</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02150\"></a><span class=\"lineno\"> 2150</span>&#160;</div>\n<div class=\"line\"><a name=\"l02151\"></a><span class=\"lineno\"> 2151</span>&#160;        <span class=\"comment\">// zyww</span></div>\n<div class=\"line\"><a name=\"l02152\"></a><span class=\"lineno\"> 2152</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02153\"></a><span class=\"lineno\"> 2153</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zyww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02154\"></a><span class=\"lineno\"> 2154</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.y, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l02155\"></a><span class=\"lineno\"> 2155</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02156\"></a><span class=\"lineno\"> 2156</span>&#160;</div>\n<div class=\"line\"><a name=\"l02157\"></a><span class=\"lineno\"> 2157</span>&#160;        <span class=\"comment\">// zzxx</span></div>\n<div class=\"line\"><a name=\"l02158\"></a><span class=\"lineno\"> 2158</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02159\"></a><span class=\"lineno\"> 2159</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzxx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02160\"></a><span class=\"lineno\"> 2160</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02161\"></a><span class=\"lineno\"> 2161</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02162\"></a><span class=\"lineno\"> 2162</span>&#160;</div>\n<div class=\"line\"><a name=\"l02163\"></a><span class=\"lineno\"> 2163</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02164\"></a><span class=\"lineno\"> 2164</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02165\"></a><span class=\"lineno\"> 2165</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02166\"></a><span class=\"lineno\"> 2166</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02167\"></a><span class=\"lineno\"> 2167</span>&#160;</div>\n<div class=\"line\"><a name=\"l02168\"></a><span class=\"lineno\"> 2168</span>&#160;        <span class=\"comment\">// zzxy</span></div>\n<div class=\"line\"><a name=\"l02169\"></a><span class=\"lineno\"> 2169</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02170\"></a><span class=\"lineno\"> 2170</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzxy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02171\"></a><span class=\"lineno\"> 2171</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02172\"></a><span class=\"lineno\"> 2172</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02173\"></a><span class=\"lineno\"> 2173</span>&#160;</div>\n<div class=\"line\"><a name=\"l02174\"></a><span class=\"lineno\"> 2174</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02175\"></a><span class=\"lineno\"> 2175</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02176\"></a><span class=\"lineno\"> 2176</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02177\"></a><span class=\"lineno\"> 2177</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02178\"></a><span class=\"lineno\"> 2178</span>&#160;</div>\n<div class=\"line\"><a name=\"l02179\"></a><span class=\"lineno\"> 2179</span>&#160;        <span class=\"comment\">// zzxz</span></div>\n<div class=\"line\"><a name=\"l02180\"></a><span class=\"lineno\"> 2180</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02181\"></a><span class=\"lineno\"> 2181</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzxz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02182\"></a><span class=\"lineno\"> 2182</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02183\"></a><span class=\"lineno\"> 2183</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02184\"></a><span class=\"lineno\"> 2184</span>&#160;</div>\n<div class=\"line\"><a name=\"l02185\"></a><span class=\"lineno\"> 2185</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02186\"></a><span class=\"lineno\"> 2186</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02187\"></a><span class=\"lineno\"> 2187</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02188\"></a><span class=\"lineno\"> 2188</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02189\"></a><span class=\"lineno\"> 2189</span>&#160;</div>\n<div class=\"line\"><a name=\"l02190\"></a><span class=\"lineno\"> 2190</span>&#160;        <span class=\"comment\">// zzxw</span></div>\n<div class=\"line\"><a name=\"l02191\"></a><span class=\"lineno\"> 2191</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02192\"></a><span class=\"lineno\"> 2192</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02193\"></a><span class=\"lineno\"> 2193</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l02194\"></a><span class=\"lineno\"> 2194</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02195\"></a><span class=\"lineno\"> 2195</span>&#160;</div>\n<div class=\"line\"><a name=\"l02196\"></a><span class=\"lineno\"> 2196</span>&#160;        <span class=\"comment\">// zzyx</span></div>\n<div class=\"line\"><a name=\"l02197\"></a><span class=\"lineno\"> 2197</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02198\"></a><span class=\"lineno\"> 2198</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzyx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02199\"></a><span class=\"lineno\"> 2199</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02200\"></a><span class=\"lineno\"> 2200</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02201\"></a><span class=\"lineno\"> 2201</span>&#160;</div>\n<div class=\"line\"><a name=\"l02202\"></a><span class=\"lineno\"> 2202</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02203\"></a><span class=\"lineno\"> 2203</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02204\"></a><span class=\"lineno\"> 2204</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02205\"></a><span class=\"lineno\"> 2205</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02206\"></a><span class=\"lineno\"> 2206</span>&#160;</div>\n<div class=\"line\"><a name=\"l02207\"></a><span class=\"lineno\"> 2207</span>&#160;        <span class=\"comment\">// zzyy</span></div>\n<div class=\"line\"><a name=\"l02208\"></a><span class=\"lineno\"> 2208</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02209\"></a><span class=\"lineno\"> 2209</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzyy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02210\"></a><span class=\"lineno\"> 2210</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02211\"></a><span class=\"lineno\"> 2211</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02212\"></a><span class=\"lineno\"> 2212</span>&#160;</div>\n<div class=\"line\"><a name=\"l02213\"></a><span class=\"lineno\"> 2213</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02214\"></a><span class=\"lineno\"> 2214</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02215\"></a><span class=\"lineno\"> 2215</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02216\"></a><span class=\"lineno\"> 2216</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02217\"></a><span class=\"lineno\"> 2217</span>&#160;</div>\n<div class=\"line\"><a name=\"l02218\"></a><span class=\"lineno\"> 2218</span>&#160;        <span class=\"comment\">// zzyz</span></div>\n<div class=\"line\"><a name=\"l02219\"></a><span class=\"lineno\"> 2219</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02220\"></a><span class=\"lineno\"> 2220</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzyz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02221\"></a><span class=\"lineno\"> 2221</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02222\"></a><span class=\"lineno\"> 2222</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02223\"></a><span class=\"lineno\"> 2223</span>&#160;</div>\n<div class=\"line\"><a name=\"l02224\"></a><span class=\"lineno\"> 2224</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02225\"></a><span class=\"lineno\"> 2225</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02226\"></a><span class=\"lineno\"> 2226</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02227\"></a><span class=\"lineno\"> 2227</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02228\"></a><span class=\"lineno\"> 2228</span>&#160;</div>\n<div class=\"line\"><a name=\"l02229\"></a><span class=\"lineno\"> 2229</span>&#160;        <span class=\"comment\">// zzyw</span></div>\n<div class=\"line\"><a name=\"l02230\"></a><span class=\"lineno\"> 2230</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02231\"></a><span class=\"lineno\"> 2231</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02232\"></a><span class=\"lineno\"> 2232</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l02233\"></a><span class=\"lineno\"> 2233</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02234\"></a><span class=\"lineno\"> 2234</span>&#160;</div>\n<div class=\"line\"><a name=\"l02235\"></a><span class=\"lineno\"> 2235</span>&#160;        <span class=\"comment\">// zzzx</span></div>\n<div class=\"line\"><a name=\"l02236\"></a><span class=\"lineno\"> 2236</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02237\"></a><span class=\"lineno\"> 2237</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzzx(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02238\"></a><span class=\"lineno\"> 2238</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02239\"></a><span class=\"lineno\"> 2239</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02240\"></a><span class=\"lineno\"> 2240</span>&#160;</div>\n<div class=\"line\"><a name=\"l02241\"></a><span class=\"lineno\"> 2241</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02242\"></a><span class=\"lineno\"> 2242</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02243\"></a><span class=\"lineno\"> 2243</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02244\"></a><span class=\"lineno\"> 2244</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02245\"></a><span class=\"lineno\"> 2245</span>&#160;</div>\n<div class=\"line\"><a name=\"l02246\"></a><span class=\"lineno\"> 2246</span>&#160;        <span class=\"comment\">// zzzy</span></div>\n<div class=\"line\"><a name=\"l02247\"></a><span class=\"lineno\"> 2247</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02248\"></a><span class=\"lineno\"> 2248</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzzy(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02249\"></a><span class=\"lineno\"> 2249</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02250\"></a><span class=\"lineno\"> 2250</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02251\"></a><span class=\"lineno\"> 2251</span>&#160;</div>\n<div class=\"line\"><a name=\"l02252\"></a><span class=\"lineno\"> 2252</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02253\"></a><span class=\"lineno\"> 2253</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02254\"></a><span class=\"lineno\"> 2254</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02255\"></a><span class=\"lineno\"> 2255</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02256\"></a><span class=\"lineno\"> 2256</span>&#160;</div>\n<div class=\"line\"><a name=\"l02257\"></a><span class=\"lineno\"> 2257</span>&#160;        <span class=\"comment\">// zzzz</span></div>\n<div class=\"line\"><a name=\"l02258\"></a><span class=\"lineno\"> 2258</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02259\"></a><span class=\"lineno\"> 2259</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzzz(<span class=\"keyword\">const</span> glm::vec&lt;3, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02260\"></a><span class=\"lineno\"> 2260</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02261\"></a><span class=\"lineno\"> 2261</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02262\"></a><span class=\"lineno\"> 2262</span>&#160;</div>\n<div class=\"line\"><a name=\"l02263\"></a><span class=\"lineno\"> 2263</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02264\"></a><span class=\"lineno\"> 2264</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02265\"></a><span class=\"lineno\"> 2265</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02266\"></a><span class=\"lineno\"> 2266</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02267\"></a><span class=\"lineno\"> 2267</span>&#160;</div>\n<div class=\"line\"><a name=\"l02268\"></a><span class=\"lineno\"> 2268</span>&#160;        <span class=\"comment\">// zzzw</span></div>\n<div class=\"line\"><a name=\"l02269\"></a><span class=\"lineno\"> 2269</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02270\"></a><span class=\"lineno\"> 2270</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02271\"></a><span class=\"lineno\"> 2271</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l02272\"></a><span class=\"lineno\"> 2272</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02273\"></a><span class=\"lineno\"> 2273</span>&#160;</div>\n<div class=\"line\"><a name=\"l02274\"></a><span class=\"lineno\"> 2274</span>&#160;        <span class=\"comment\">// zzwx</span></div>\n<div class=\"line\"><a name=\"l02275\"></a><span class=\"lineno\"> 2275</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02276\"></a><span class=\"lineno\"> 2276</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02277\"></a><span class=\"lineno\"> 2277</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l02278\"></a><span class=\"lineno\"> 2278</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02279\"></a><span class=\"lineno\"> 2279</span>&#160;</div>\n<div class=\"line\"><a name=\"l02280\"></a><span class=\"lineno\"> 2280</span>&#160;        <span class=\"comment\">// zzwy</span></div>\n<div class=\"line\"><a name=\"l02281\"></a><span class=\"lineno\"> 2281</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02282\"></a><span class=\"lineno\"> 2282</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02283\"></a><span class=\"lineno\"> 2283</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l02284\"></a><span class=\"lineno\"> 2284</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02285\"></a><span class=\"lineno\"> 2285</span>&#160;</div>\n<div class=\"line\"><a name=\"l02286\"></a><span class=\"lineno\"> 2286</span>&#160;        <span class=\"comment\">// zzwz</span></div>\n<div class=\"line\"><a name=\"l02287\"></a><span class=\"lineno\"> 2287</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02288\"></a><span class=\"lineno\"> 2288</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02289\"></a><span class=\"lineno\"> 2289</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l02290\"></a><span class=\"lineno\"> 2290</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02291\"></a><span class=\"lineno\"> 2291</span>&#160;</div>\n<div class=\"line\"><a name=\"l02292\"></a><span class=\"lineno\"> 2292</span>&#160;        <span class=\"comment\">// zzww</span></div>\n<div class=\"line\"><a name=\"l02293\"></a><span class=\"lineno\"> 2293</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02294\"></a><span class=\"lineno\"> 2294</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zzww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02295\"></a><span class=\"lineno\"> 2295</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.z, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l02296\"></a><span class=\"lineno\"> 2296</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02297\"></a><span class=\"lineno\"> 2297</span>&#160;</div>\n<div class=\"line\"><a name=\"l02298\"></a><span class=\"lineno\"> 2298</span>&#160;        <span class=\"comment\">// zwxx</span></div>\n<div class=\"line\"><a name=\"l02299\"></a><span class=\"lineno\"> 2299</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02300\"></a><span class=\"lineno\"> 2300</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02301\"></a><span class=\"lineno\"> 2301</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02302\"></a><span class=\"lineno\"> 2302</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02303\"></a><span class=\"lineno\"> 2303</span>&#160;</div>\n<div class=\"line\"><a name=\"l02304\"></a><span class=\"lineno\"> 2304</span>&#160;        <span class=\"comment\">// zwxy</span></div>\n<div class=\"line\"><a name=\"l02305\"></a><span class=\"lineno\"> 2305</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02306\"></a><span class=\"lineno\"> 2306</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02307\"></a><span class=\"lineno\"> 2307</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02308\"></a><span class=\"lineno\"> 2308</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02309\"></a><span class=\"lineno\"> 2309</span>&#160;</div>\n<div class=\"line\"><a name=\"l02310\"></a><span class=\"lineno\"> 2310</span>&#160;        <span class=\"comment\">// zwxz</span></div>\n<div class=\"line\"><a name=\"l02311\"></a><span class=\"lineno\"> 2311</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02312\"></a><span class=\"lineno\"> 2312</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02313\"></a><span class=\"lineno\"> 2313</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02314\"></a><span class=\"lineno\"> 2314</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02315\"></a><span class=\"lineno\"> 2315</span>&#160;</div>\n<div class=\"line\"><a name=\"l02316\"></a><span class=\"lineno\"> 2316</span>&#160;        <span class=\"comment\">// zwxw</span></div>\n<div class=\"line\"><a name=\"l02317\"></a><span class=\"lineno\"> 2317</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02318\"></a><span class=\"lineno\"> 2318</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02319\"></a><span class=\"lineno\"> 2319</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l02320\"></a><span class=\"lineno\"> 2320</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02321\"></a><span class=\"lineno\"> 2321</span>&#160;</div>\n<div class=\"line\"><a name=\"l02322\"></a><span class=\"lineno\"> 2322</span>&#160;        <span class=\"comment\">// zwyx</span></div>\n<div class=\"line\"><a name=\"l02323\"></a><span class=\"lineno\"> 2323</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02324\"></a><span class=\"lineno\"> 2324</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02325\"></a><span class=\"lineno\"> 2325</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02326\"></a><span class=\"lineno\"> 2326</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02327\"></a><span class=\"lineno\"> 2327</span>&#160;</div>\n<div class=\"line\"><a name=\"l02328\"></a><span class=\"lineno\"> 2328</span>&#160;        <span class=\"comment\">// zwyy</span></div>\n<div class=\"line\"><a name=\"l02329\"></a><span class=\"lineno\"> 2329</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02330\"></a><span class=\"lineno\"> 2330</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02331\"></a><span class=\"lineno\"> 2331</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02332\"></a><span class=\"lineno\"> 2332</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02333\"></a><span class=\"lineno\"> 2333</span>&#160;</div>\n<div class=\"line\"><a name=\"l02334\"></a><span class=\"lineno\"> 2334</span>&#160;        <span class=\"comment\">// zwyz</span></div>\n<div class=\"line\"><a name=\"l02335\"></a><span class=\"lineno\"> 2335</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02336\"></a><span class=\"lineno\"> 2336</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02337\"></a><span class=\"lineno\"> 2337</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02338\"></a><span class=\"lineno\"> 2338</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02339\"></a><span class=\"lineno\"> 2339</span>&#160;</div>\n<div class=\"line\"><a name=\"l02340\"></a><span class=\"lineno\"> 2340</span>&#160;        <span class=\"comment\">// zwyw</span></div>\n<div class=\"line\"><a name=\"l02341\"></a><span class=\"lineno\"> 2341</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02342\"></a><span class=\"lineno\"> 2342</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02343\"></a><span class=\"lineno\"> 2343</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l02344\"></a><span class=\"lineno\"> 2344</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02345\"></a><span class=\"lineno\"> 2345</span>&#160;</div>\n<div class=\"line\"><a name=\"l02346\"></a><span class=\"lineno\"> 2346</span>&#160;        <span class=\"comment\">// zwzx</span></div>\n<div class=\"line\"><a name=\"l02347\"></a><span class=\"lineno\"> 2347</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02348\"></a><span class=\"lineno\"> 2348</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02349\"></a><span class=\"lineno\"> 2349</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02350\"></a><span class=\"lineno\"> 2350</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02351\"></a><span class=\"lineno\"> 2351</span>&#160;</div>\n<div class=\"line\"><a name=\"l02352\"></a><span class=\"lineno\"> 2352</span>&#160;        <span class=\"comment\">// zwzy</span></div>\n<div class=\"line\"><a name=\"l02353\"></a><span class=\"lineno\"> 2353</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02354\"></a><span class=\"lineno\"> 2354</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02355\"></a><span class=\"lineno\"> 2355</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02356\"></a><span class=\"lineno\"> 2356</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02357\"></a><span class=\"lineno\"> 2357</span>&#160;</div>\n<div class=\"line\"><a name=\"l02358\"></a><span class=\"lineno\"> 2358</span>&#160;        <span class=\"comment\">// zwzz</span></div>\n<div class=\"line\"><a name=\"l02359\"></a><span class=\"lineno\"> 2359</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02360\"></a><span class=\"lineno\"> 2360</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02361\"></a><span class=\"lineno\"> 2361</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02362\"></a><span class=\"lineno\"> 2362</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02363\"></a><span class=\"lineno\"> 2363</span>&#160;</div>\n<div class=\"line\"><a name=\"l02364\"></a><span class=\"lineno\"> 2364</span>&#160;        <span class=\"comment\">// zwzw</span></div>\n<div class=\"line\"><a name=\"l02365\"></a><span class=\"lineno\"> 2365</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02366\"></a><span class=\"lineno\"> 2366</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02367\"></a><span class=\"lineno\"> 2367</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l02368\"></a><span class=\"lineno\"> 2368</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02369\"></a><span class=\"lineno\"> 2369</span>&#160;</div>\n<div class=\"line\"><a name=\"l02370\"></a><span class=\"lineno\"> 2370</span>&#160;        <span class=\"comment\">// zwwx</span></div>\n<div class=\"line\"><a name=\"l02371\"></a><span class=\"lineno\"> 2371</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02372\"></a><span class=\"lineno\"> 2372</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02373\"></a><span class=\"lineno\"> 2373</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l02374\"></a><span class=\"lineno\"> 2374</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02375\"></a><span class=\"lineno\"> 2375</span>&#160;</div>\n<div class=\"line\"><a name=\"l02376\"></a><span class=\"lineno\"> 2376</span>&#160;        <span class=\"comment\">// zwwy</span></div>\n<div class=\"line\"><a name=\"l02377\"></a><span class=\"lineno\"> 2377</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02378\"></a><span class=\"lineno\"> 2378</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02379\"></a><span class=\"lineno\"> 2379</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l02380\"></a><span class=\"lineno\"> 2380</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02381\"></a><span class=\"lineno\"> 2381</span>&#160;</div>\n<div class=\"line\"><a name=\"l02382\"></a><span class=\"lineno\"> 2382</span>&#160;        <span class=\"comment\">// zwwz</span></div>\n<div class=\"line\"><a name=\"l02383\"></a><span class=\"lineno\"> 2383</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02384\"></a><span class=\"lineno\"> 2384</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02385\"></a><span class=\"lineno\"> 2385</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l02386\"></a><span class=\"lineno\"> 2386</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02387\"></a><span class=\"lineno\"> 2387</span>&#160;</div>\n<div class=\"line\"><a name=\"l02388\"></a><span class=\"lineno\"> 2388</span>&#160;        <span class=\"comment\">// zwww</span></div>\n<div class=\"line\"><a name=\"l02389\"></a><span class=\"lineno\"> 2389</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02390\"></a><span class=\"lineno\"> 2390</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; zwww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02391\"></a><span class=\"lineno\"> 2391</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.z, v.w, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l02392\"></a><span class=\"lineno\"> 2392</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02393\"></a><span class=\"lineno\"> 2393</span>&#160;</div>\n<div class=\"line\"><a name=\"l02394\"></a><span class=\"lineno\"> 2394</span>&#160;        <span class=\"comment\">// wxxx</span></div>\n<div class=\"line\"><a name=\"l02395\"></a><span class=\"lineno\"> 2395</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02396\"></a><span class=\"lineno\"> 2396</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02397\"></a><span class=\"lineno\"> 2397</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02398\"></a><span class=\"lineno\"> 2398</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02399\"></a><span class=\"lineno\"> 2399</span>&#160;</div>\n<div class=\"line\"><a name=\"l02400\"></a><span class=\"lineno\"> 2400</span>&#160;        <span class=\"comment\">// wxxy</span></div>\n<div class=\"line\"><a name=\"l02401\"></a><span class=\"lineno\"> 2401</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02402\"></a><span class=\"lineno\"> 2402</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02403\"></a><span class=\"lineno\"> 2403</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02404\"></a><span class=\"lineno\"> 2404</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02405\"></a><span class=\"lineno\"> 2405</span>&#160;</div>\n<div class=\"line\"><a name=\"l02406\"></a><span class=\"lineno\"> 2406</span>&#160;        <span class=\"comment\">// wxxz</span></div>\n<div class=\"line\"><a name=\"l02407\"></a><span class=\"lineno\"> 2407</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02408\"></a><span class=\"lineno\"> 2408</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02409\"></a><span class=\"lineno\"> 2409</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02410\"></a><span class=\"lineno\"> 2410</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02411\"></a><span class=\"lineno\"> 2411</span>&#160;</div>\n<div class=\"line\"><a name=\"l02412\"></a><span class=\"lineno\"> 2412</span>&#160;        <span class=\"comment\">// wxxw</span></div>\n<div class=\"line\"><a name=\"l02413\"></a><span class=\"lineno\"> 2413</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02414\"></a><span class=\"lineno\"> 2414</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02415\"></a><span class=\"lineno\"> 2415</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l02416\"></a><span class=\"lineno\"> 2416</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02417\"></a><span class=\"lineno\"> 2417</span>&#160;</div>\n<div class=\"line\"><a name=\"l02418\"></a><span class=\"lineno\"> 2418</span>&#160;        <span class=\"comment\">// wxyx</span></div>\n<div class=\"line\"><a name=\"l02419\"></a><span class=\"lineno\"> 2419</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02420\"></a><span class=\"lineno\"> 2420</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02421\"></a><span class=\"lineno\"> 2421</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02422\"></a><span class=\"lineno\"> 2422</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02423\"></a><span class=\"lineno\"> 2423</span>&#160;</div>\n<div class=\"line\"><a name=\"l02424\"></a><span class=\"lineno\"> 2424</span>&#160;        <span class=\"comment\">// wxyy</span></div>\n<div class=\"line\"><a name=\"l02425\"></a><span class=\"lineno\"> 2425</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02426\"></a><span class=\"lineno\"> 2426</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02427\"></a><span class=\"lineno\"> 2427</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02428\"></a><span class=\"lineno\"> 2428</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02429\"></a><span class=\"lineno\"> 2429</span>&#160;</div>\n<div class=\"line\"><a name=\"l02430\"></a><span class=\"lineno\"> 2430</span>&#160;        <span class=\"comment\">// wxyz</span></div>\n<div class=\"line\"><a name=\"l02431\"></a><span class=\"lineno\"> 2431</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02432\"></a><span class=\"lineno\"> 2432</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02433\"></a><span class=\"lineno\"> 2433</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02434\"></a><span class=\"lineno\"> 2434</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02435\"></a><span class=\"lineno\"> 2435</span>&#160;</div>\n<div class=\"line\"><a name=\"l02436\"></a><span class=\"lineno\"> 2436</span>&#160;        <span class=\"comment\">// wxyw</span></div>\n<div class=\"line\"><a name=\"l02437\"></a><span class=\"lineno\"> 2437</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02438\"></a><span class=\"lineno\"> 2438</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02439\"></a><span class=\"lineno\"> 2439</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l02440\"></a><span class=\"lineno\"> 2440</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02441\"></a><span class=\"lineno\"> 2441</span>&#160;</div>\n<div class=\"line\"><a name=\"l02442\"></a><span class=\"lineno\"> 2442</span>&#160;        <span class=\"comment\">// wxzx</span></div>\n<div class=\"line\"><a name=\"l02443\"></a><span class=\"lineno\"> 2443</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02444\"></a><span class=\"lineno\"> 2444</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02445\"></a><span class=\"lineno\"> 2445</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02446\"></a><span class=\"lineno\"> 2446</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02447\"></a><span class=\"lineno\"> 2447</span>&#160;</div>\n<div class=\"line\"><a name=\"l02448\"></a><span class=\"lineno\"> 2448</span>&#160;        <span class=\"comment\">// wxzy</span></div>\n<div class=\"line\"><a name=\"l02449\"></a><span class=\"lineno\"> 2449</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02450\"></a><span class=\"lineno\"> 2450</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02451\"></a><span class=\"lineno\"> 2451</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02452\"></a><span class=\"lineno\"> 2452</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02453\"></a><span class=\"lineno\"> 2453</span>&#160;</div>\n<div class=\"line\"><a name=\"l02454\"></a><span class=\"lineno\"> 2454</span>&#160;        <span class=\"comment\">// wxzz</span></div>\n<div class=\"line\"><a name=\"l02455\"></a><span class=\"lineno\"> 2455</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02456\"></a><span class=\"lineno\"> 2456</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02457\"></a><span class=\"lineno\"> 2457</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02458\"></a><span class=\"lineno\"> 2458</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02459\"></a><span class=\"lineno\"> 2459</span>&#160;</div>\n<div class=\"line\"><a name=\"l02460\"></a><span class=\"lineno\"> 2460</span>&#160;        <span class=\"comment\">// wxzw</span></div>\n<div class=\"line\"><a name=\"l02461\"></a><span class=\"lineno\"> 2461</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02462\"></a><span class=\"lineno\"> 2462</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02463\"></a><span class=\"lineno\"> 2463</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l02464\"></a><span class=\"lineno\"> 2464</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02465\"></a><span class=\"lineno\"> 2465</span>&#160;</div>\n<div class=\"line\"><a name=\"l02466\"></a><span class=\"lineno\"> 2466</span>&#160;        <span class=\"comment\">// wxwx</span></div>\n<div class=\"line\"><a name=\"l02467\"></a><span class=\"lineno\"> 2467</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02468\"></a><span class=\"lineno\"> 2468</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02469\"></a><span class=\"lineno\"> 2469</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l02470\"></a><span class=\"lineno\"> 2470</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02471\"></a><span class=\"lineno\"> 2471</span>&#160;</div>\n<div class=\"line\"><a name=\"l02472\"></a><span class=\"lineno\"> 2472</span>&#160;        <span class=\"comment\">// wxwy</span></div>\n<div class=\"line\"><a name=\"l02473\"></a><span class=\"lineno\"> 2473</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02474\"></a><span class=\"lineno\"> 2474</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02475\"></a><span class=\"lineno\"> 2475</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l02476\"></a><span class=\"lineno\"> 2476</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02477\"></a><span class=\"lineno\"> 2477</span>&#160;</div>\n<div class=\"line\"><a name=\"l02478\"></a><span class=\"lineno\"> 2478</span>&#160;        <span class=\"comment\">// wxwz</span></div>\n<div class=\"line\"><a name=\"l02479\"></a><span class=\"lineno\"> 2479</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02480\"></a><span class=\"lineno\"> 2480</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02481\"></a><span class=\"lineno\"> 2481</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l02482\"></a><span class=\"lineno\"> 2482</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02483\"></a><span class=\"lineno\"> 2483</span>&#160;</div>\n<div class=\"line\"><a name=\"l02484\"></a><span class=\"lineno\"> 2484</span>&#160;        <span class=\"comment\">// wxww</span></div>\n<div class=\"line\"><a name=\"l02485\"></a><span class=\"lineno\"> 2485</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02486\"></a><span class=\"lineno\"> 2486</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wxww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02487\"></a><span class=\"lineno\"> 2487</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.x, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l02488\"></a><span class=\"lineno\"> 2488</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02489\"></a><span class=\"lineno\"> 2489</span>&#160;</div>\n<div class=\"line\"><a name=\"l02490\"></a><span class=\"lineno\"> 2490</span>&#160;        <span class=\"comment\">// wyxx</span></div>\n<div class=\"line\"><a name=\"l02491\"></a><span class=\"lineno\"> 2491</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02492\"></a><span class=\"lineno\"> 2492</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02493\"></a><span class=\"lineno\"> 2493</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02494\"></a><span class=\"lineno\"> 2494</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02495\"></a><span class=\"lineno\"> 2495</span>&#160;</div>\n<div class=\"line\"><a name=\"l02496\"></a><span class=\"lineno\"> 2496</span>&#160;        <span class=\"comment\">// wyxy</span></div>\n<div class=\"line\"><a name=\"l02497\"></a><span class=\"lineno\"> 2497</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02498\"></a><span class=\"lineno\"> 2498</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02499\"></a><span class=\"lineno\"> 2499</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02500\"></a><span class=\"lineno\"> 2500</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02501\"></a><span class=\"lineno\"> 2501</span>&#160;</div>\n<div class=\"line\"><a name=\"l02502\"></a><span class=\"lineno\"> 2502</span>&#160;        <span class=\"comment\">// wyxz</span></div>\n<div class=\"line\"><a name=\"l02503\"></a><span class=\"lineno\"> 2503</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02504\"></a><span class=\"lineno\"> 2504</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02505\"></a><span class=\"lineno\"> 2505</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02506\"></a><span class=\"lineno\"> 2506</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02507\"></a><span class=\"lineno\"> 2507</span>&#160;</div>\n<div class=\"line\"><a name=\"l02508\"></a><span class=\"lineno\"> 2508</span>&#160;        <span class=\"comment\">// wyxw</span></div>\n<div class=\"line\"><a name=\"l02509\"></a><span class=\"lineno\"> 2509</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02510\"></a><span class=\"lineno\"> 2510</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02511\"></a><span class=\"lineno\"> 2511</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l02512\"></a><span class=\"lineno\"> 2512</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02513\"></a><span class=\"lineno\"> 2513</span>&#160;</div>\n<div class=\"line\"><a name=\"l02514\"></a><span class=\"lineno\"> 2514</span>&#160;        <span class=\"comment\">// wyyx</span></div>\n<div class=\"line\"><a name=\"l02515\"></a><span class=\"lineno\"> 2515</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02516\"></a><span class=\"lineno\"> 2516</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02517\"></a><span class=\"lineno\"> 2517</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02518\"></a><span class=\"lineno\"> 2518</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02519\"></a><span class=\"lineno\"> 2519</span>&#160;</div>\n<div class=\"line\"><a name=\"l02520\"></a><span class=\"lineno\"> 2520</span>&#160;        <span class=\"comment\">// wyyy</span></div>\n<div class=\"line\"><a name=\"l02521\"></a><span class=\"lineno\"> 2521</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02522\"></a><span class=\"lineno\"> 2522</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02523\"></a><span class=\"lineno\"> 2523</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02524\"></a><span class=\"lineno\"> 2524</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02525\"></a><span class=\"lineno\"> 2525</span>&#160;</div>\n<div class=\"line\"><a name=\"l02526\"></a><span class=\"lineno\"> 2526</span>&#160;        <span class=\"comment\">// wyyz</span></div>\n<div class=\"line\"><a name=\"l02527\"></a><span class=\"lineno\"> 2527</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02528\"></a><span class=\"lineno\"> 2528</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02529\"></a><span class=\"lineno\"> 2529</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02530\"></a><span class=\"lineno\"> 2530</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02531\"></a><span class=\"lineno\"> 2531</span>&#160;</div>\n<div class=\"line\"><a name=\"l02532\"></a><span class=\"lineno\"> 2532</span>&#160;        <span class=\"comment\">// wyyw</span></div>\n<div class=\"line\"><a name=\"l02533\"></a><span class=\"lineno\"> 2533</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02534\"></a><span class=\"lineno\"> 2534</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02535\"></a><span class=\"lineno\"> 2535</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l02536\"></a><span class=\"lineno\"> 2536</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02537\"></a><span class=\"lineno\"> 2537</span>&#160;</div>\n<div class=\"line\"><a name=\"l02538\"></a><span class=\"lineno\"> 2538</span>&#160;        <span class=\"comment\">// wyzx</span></div>\n<div class=\"line\"><a name=\"l02539\"></a><span class=\"lineno\"> 2539</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02540\"></a><span class=\"lineno\"> 2540</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02541\"></a><span class=\"lineno\"> 2541</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02542\"></a><span class=\"lineno\"> 2542</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02543\"></a><span class=\"lineno\"> 2543</span>&#160;</div>\n<div class=\"line\"><a name=\"l02544\"></a><span class=\"lineno\"> 2544</span>&#160;        <span class=\"comment\">// wyzy</span></div>\n<div class=\"line\"><a name=\"l02545\"></a><span class=\"lineno\"> 2545</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02546\"></a><span class=\"lineno\"> 2546</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02547\"></a><span class=\"lineno\"> 2547</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02548\"></a><span class=\"lineno\"> 2548</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02549\"></a><span class=\"lineno\"> 2549</span>&#160;</div>\n<div class=\"line\"><a name=\"l02550\"></a><span class=\"lineno\"> 2550</span>&#160;        <span class=\"comment\">// wyzz</span></div>\n<div class=\"line\"><a name=\"l02551\"></a><span class=\"lineno\"> 2551</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02552\"></a><span class=\"lineno\"> 2552</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02553\"></a><span class=\"lineno\"> 2553</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02554\"></a><span class=\"lineno\"> 2554</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02555\"></a><span class=\"lineno\"> 2555</span>&#160;</div>\n<div class=\"line\"><a name=\"l02556\"></a><span class=\"lineno\"> 2556</span>&#160;        <span class=\"comment\">// wyzw</span></div>\n<div class=\"line\"><a name=\"l02557\"></a><span class=\"lineno\"> 2557</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02558\"></a><span class=\"lineno\"> 2558</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02559\"></a><span class=\"lineno\"> 2559</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l02560\"></a><span class=\"lineno\"> 2560</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02561\"></a><span class=\"lineno\"> 2561</span>&#160;</div>\n<div class=\"line\"><a name=\"l02562\"></a><span class=\"lineno\"> 2562</span>&#160;        <span class=\"comment\">// wywx</span></div>\n<div class=\"line\"><a name=\"l02563\"></a><span class=\"lineno\"> 2563</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02564\"></a><span class=\"lineno\"> 2564</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wywx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02565\"></a><span class=\"lineno\"> 2565</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l02566\"></a><span class=\"lineno\"> 2566</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02567\"></a><span class=\"lineno\"> 2567</span>&#160;</div>\n<div class=\"line\"><a name=\"l02568\"></a><span class=\"lineno\"> 2568</span>&#160;        <span class=\"comment\">// wywy</span></div>\n<div class=\"line\"><a name=\"l02569\"></a><span class=\"lineno\"> 2569</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02570\"></a><span class=\"lineno\"> 2570</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wywy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02571\"></a><span class=\"lineno\"> 2571</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l02572\"></a><span class=\"lineno\"> 2572</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02573\"></a><span class=\"lineno\"> 2573</span>&#160;</div>\n<div class=\"line\"><a name=\"l02574\"></a><span class=\"lineno\"> 2574</span>&#160;        <span class=\"comment\">// wywz</span></div>\n<div class=\"line\"><a name=\"l02575\"></a><span class=\"lineno\"> 2575</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02576\"></a><span class=\"lineno\"> 2576</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wywz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02577\"></a><span class=\"lineno\"> 2577</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l02578\"></a><span class=\"lineno\"> 2578</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02579\"></a><span class=\"lineno\"> 2579</span>&#160;</div>\n<div class=\"line\"><a name=\"l02580\"></a><span class=\"lineno\"> 2580</span>&#160;        <span class=\"comment\">// wyww</span></div>\n<div class=\"line\"><a name=\"l02581\"></a><span class=\"lineno\"> 2581</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02582\"></a><span class=\"lineno\"> 2582</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wyww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02583\"></a><span class=\"lineno\"> 2583</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.y, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l02584\"></a><span class=\"lineno\"> 2584</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02585\"></a><span class=\"lineno\"> 2585</span>&#160;</div>\n<div class=\"line\"><a name=\"l02586\"></a><span class=\"lineno\"> 2586</span>&#160;        <span class=\"comment\">// wzxx</span></div>\n<div class=\"line\"><a name=\"l02587\"></a><span class=\"lineno\"> 2587</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02588\"></a><span class=\"lineno\"> 2588</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02589\"></a><span class=\"lineno\"> 2589</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02590\"></a><span class=\"lineno\"> 2590</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02591\"></a><span class=\"lineno\"> 2591</span>&#160;</div>\n<div class=\"line\"><a name=\"l02592\"></a><span class=\"lineno\"> 2592</span>&#160;        <span class=\"comment\">// wzxy</span></div>\n<div class=\"line\"><a name=\"l02593\"></a><span class=\"lineno\"> 2593</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02594\"></a><span class=\"lineno\"> 2594</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02595\"></a><span class=\"lineno\"> 2595</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02596\"></a><span class=\"lineno\"> 2596</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02597\"></a><span class=\"lineno\"> 2597</span>&#160;</div>\n<div class=\"line\"><a name=\"l02598\"></a><span class=\"lineno\"> 2598</span>&#160;        <span class=\"comment\">// wzxz</span></div>\n<div class=\"line\"><a name=\"l02599\"></a><span class=\"lineno\"> 2599</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02600\"></a><span class=\"lineno\"> 2600</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02601\"></a><span class=\"lineno\"> 2601</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02602\"></a><span class=\"lineno\"> 2602</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02603\"></a><span class=\"lineno\"> 2603</span>&#160;</div>\n<div class=\"line\"><a name=\"l02604\"></a><span class=\"lineno\"> 2604</span>&#160;        <span class=\"comment\">// wzxw</span></div>\n<div class=\"line\"><a name=\"l02605\"></a><span class=\"lineno\"> 2605</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02606\"></a><span class=\"lineno\"> 2606</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02607\"></a><span class=\"lineno\"> 2607</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l02608\"></a><span class=\"lineno\"> 2608</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02609\"></a><span class=\"lineno\"> 2609</span>&#160;</div>\n<div class=\"line\"><a name=\"l02610\"></a><span class=\"lineno\"> 2610</span>&#160;        <span class=\"comment\">// wzyx</span></div>\n<div class=\"line\"><a name=\"l02611\"></a><span class=\"lineno\"> 2611</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02612\"></a><span class=\"lineno\"> 2612</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02613\"></a><span class=\"lineno\"> 2613</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02614\"></a><span class=\"lineno\"> 2614</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02615\"></a><span class=\"lineno\"> 2615</span>&#160;</div>\n<div class=\"line\"><a name=\"l02616\"></a><span class=\"lineno\"> 2616</span>&#160;        <span class=\"comment\">// wzyy</span></div>\n<div class=\"line\"><a name=\"l02617\"></a><span class=\"lineno\"> 2617</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02618\"></a><span class=\"lineno\"> 2618</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02619\"></a><span class=\"lineno\"> 2619</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02620\"></a><span class=\"lineno\"> 2620</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02621\"></a><span class=\"lineno\"> 2621</span>&#160;</div>\n<div class=\"line\"><a name=\"l02622\"></a><span class=\"lineno\"> 2622</span>&#160;        <span class=\"comment\">// wzyz</span></div>\n<div class=\"line\"><a name=\"l02623\"></a><span class=\"lineno\"> 2623</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02624\"></a><span class=\"lineno\"> 2624</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02625\"></a><span class=\"lineno\"> 2625</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02626\"></a><span class=\"lineno\"> 2626</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02627\"></a><span class=\"lineno\"> 2627</span>&#160;</div>\n<div class=\"line\"><a name=\"l02628\"></a><span class=\"lineno\"> 2628</span>&#160;        <span class=\"comment\">// wzyw</span></div>\n<div class=\"line\"><a name=\"l02629\"></a><span class=\"lineno\"> 2629</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02630\"></a><span class=\"lineno\"> 2630</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02631\"></a><span class=\"lineno\"> 2631</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l02632\"></a><span class=\"lineno\"> 2632</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02633\"></a><span class=\"lineno\"> 2633</span>&#160;</div>\n<div class=\"line\"><a name=\"l02634\"></a><span class=\"lineno\"> 2634</span>&#160;        <span class=\"comment\">// wzzx</span></div>\n<div class=\"line\"><a name=\"l02635\"></a><span class=\"lineno\"> 2635</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02636\"></a><span class=\"lineno\"> 2636</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02637\"></a><span class=\"lineno\"> 2637</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02638\"></a><span class=\"lineno\"> 2638</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02639\"></a><span class=\"lineno\"> 2639</span>&#160;</div>\n<div class=\"line\"><a name=\"l02640\"></a><span class=\"lineno\"> 2640</span>&#160;        <span class=\"comment\">// wzzy</span></div>\n<div class=\"line\"><a name=\"l02641\"></a><span class=\"lineno\"> 2641</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02642\"></a><span class=\"lineno\"> 2642</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02643\"></a><span class=\"lineno\"> 2643</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02644\"></a><span class=\"lineno\"> 2644</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02645\"></a><span class=\"lineno\"> 2645</span>&#160;</div>\n<div class=\"line\"><a name=\"l02646\"></a><span class=\"lineno\"> 2646</span>&#160;        <span class=\"comment\">// wzzz</span></div>\n<div class=\"line\"><a name=\"l02647\"></a><span class=\"lineno\"> 2647</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02648\"></a><span class=\"lineno\"> 2648</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02649\"></a><span class=\"lineno\"> 2649</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02650\"></a><span class=\"lineno\"> 2650</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02651\"></a><span class=\"lineno\"> 2651</span>&#160;</div>\n<div class=\"line\"><a name=\"l02652\"></a><span class=\"lineno\"> 2652</span>&#160;        <span class=\"comment\">// wzzw</span></div>\n<div class=\"line\"><a name=\"l02653\"></a><span class=\"lineno\"> 2653</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02654\"></a><span class=\"lineno\"> 2654</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02655\"></a><span class=\"lineno\"> 2655</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l02656\"></a><span class=\"lineno\"> 2656</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02657\"></a><span class=\"lineno\"> 2657</span>&#160;</div>\n<div class=\"line\"><a name=\"l02658\"></a><span class=\"lineno\"> 2658</span>&#160;        <span class=\"comment\">// wzwx</span></div>\n<div class=\"line\"><a name=\"l02659\"></a><span class=\"lineno\"> 2659</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02660\"></a><span class=\"lineno\"> 2660</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02661\"></a><span class=\"lineno\"> 2661</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l02662\"></a><span class=\"lineno\"> 2662</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02663\"></a><span class=\"lineno\"> 2663</span>&#160;</div>\n<div class=\"line\"><a name=\"l02664\"></a><span class=\"lineno\"> 2664</span>&#160;        <span class=\"comment\">// wzwy</span></div>\n<div class=\"line\"><a name=\"l02665\"></a><span class=\"lineno\"> 2665</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02666\"></a><span class=\"lineno\"> 2666</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02667\"></a><span class=\"lineno\"> 2667</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l02668\"></a><span class=\"lineno\"> 2668</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02669\"></a><span class=\"lineno\"> 2669</span>&#160;</div>\n<div class=\"line\"><a name=\"l02670\"></a><span class=\"lineno\"> 2670</span>&#160;        <span class=\"comment\">// wzwz</span></div>\n<div class=\"line\"><a name=\"l02671\"></a><span class=\"lineno\"> 2671</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02672\"></a><span class=\"lineno\"> 2672</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02673\"></a><span class=\"lineno\"> 2673</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l02674\"></a><span class=\"lineno\"> 2674</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02675\"></a><span class=\"lineno\"> 2675</span>&#160;</div>\n<div class=\"line\"><a name=\"l02676\"></a><span class=\"lineno\"> 2676</span>&#160;        <span class=\"comment\">// wzww</span></div>\n<div class=\"line\"><a name=\"l02677\"></a><span class=\"lineno\"> 2677</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02678\"></a><span class=\"lineno\"> 2678</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wzww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02679\"></a><span class=\"lineno\"> 2679</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.z, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l02680\"></a><span class=\"lineno\"> 2680</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02681\"></a><span class=\"lineno\"> 2681</span>&#160;</div>\n<div class=\"line\"><a name=\"l02682\"></a><span class=\"lineno\"> 2682</span>&#160;        <span class=\"comment\">// wwxx</span></div>\n<div class=\"line\"><a name=\"l02683\"></a><span class=\"lineno\"> 2683</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02684\"></a><span class=\"lineno\"> 2684</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwxx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02685\"></a><span class=\"lineno\"> 2685</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.x, v.x);</div>\n<div class=\"line\"><a name=\"l02686\"></a><span class=\"lineno\"> 2686</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02687\"></a><span class=\"lineno\"> 2687</span>&#160;</div>\n<div class=\"line\"><a name=\"l02688\"></a><span class=\"lineno\"> 2688</span>&#160;        <span class=\"comment\">// wwxy</span></div>\n<div class=\"line\"><a name=\"l02689\"></a><span class=\"lineno\"> 2689</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02690\"></a><span class=\"lineno\"> 2690</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwxy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02691\"></a><span class=\"lineno\"> 2691</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.x, v.y);</div>\n<div class=\"line\"><a name=\"l02692\"></a><span class=\"lineno\"> 2692</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02693\"></a><span class=\"lineno\"> 2693</span>&#160;</div>\n<div class=\"line\"><a name=\"l02694\"></a><span class=\"lineno\"> 2694</span>&#160;        <span class=\"comment\">// wwxz</span></div>\n<div class=\"line\"><a name=\"l02695\"></a><span class=\"lineno\"> 2695</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02696\"></a><span class=\"lineno\"> 2696</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwxz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02697\"></a><span class=\"lineno\"> 2697</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.x, v.z);</div>\n<div class=\"line\"><a name=\"l02698\"></a><span class=\"lineno\"> 2698</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02699\"></a><span class=\"lineno\"> 2699</span>&#160;</div>\n<div class=\"line\"><a name=\"l02700\"></a><span class=\"lineno\"> 2700</span>&#160;        <span class=\"comment\">// wwxw</span></div>\n<div class=\"line\"><a name=\"l02701\"></a><span class=\"lineno\"> 2701</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02702\"></a><span class=\"lineno\"> 2702</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwxw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02703\"></a><span class=\"lineno\"> 2703</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.x, v.w);</div>\n<div class=\"line\"><a name=\"l02704\"></a><span class=\"lineno\"> 2704</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02705\"></a><span class=\"lineno\"> 2705</span>&#160;</div>\n<div class=\"line\"><a name=\"l02706\"></a><span class=\"lineno\"> 2706</span>&#160;        <span class=\"comment\">// wwyx</span></div>\n<div class=\"line\"><a name=\"l02707\"></a><span class=\"lineno\"> 2707</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02708\"></a><span class=\"lineno\"> 2708</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwyx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02709\"></a><span class=\"lineno\"> 2709</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.y, v.x);</div>\n<div class=\"line\"><a name=\"l02710\"></a><span class=\"lineno\"> 2710</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02711\"></a><span class=\"lineno\"> 2711</span>&#160;</div>\n<div class=\"line\"><a name=\"l02712\"></a><span class=\"lineno\"> 2712</span>&#160;        <span class=\"comment\">// wwyy</span></div>\n<div class=\"line\"><a name=\"l02713\"></a><span class=\"lineno\"> 2713</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02714\"></a><span class=\"lineno\"> 2714</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwyy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02715\"></a><span class=\"lineno\"> 2715</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.y, v.y);</div>\n<div class=\"line\"><a name=\"l02716\"></a><span class=\"lineno\"> 2716</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02717\"></a><span class=\"lineno\"> 2717</span>&#160;</div>\n<div class=\"line\"><a name=\"l02718\"></a><span class=\"lineno\"> 2718</span>&#160;        <span class=\"comment\">// wwyz</span></div>\n<div class=\"line\"><a name=\"l02719\"></a><span class=\"lineno\"> 2719</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02720\"></a><span class=\"lineno\"> 2720</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwyz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02721\"></a><span class=\"lineno\"> 2721</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.y, v.z);</div>\n<div class=\"line\"><a name=\"l02722\"></a><span class=\"lineno\"> 2722</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02723\"></a><span class=\"lineno\"> 2723</span>&#160;</div>\n<div class=\"line\"><a name=\"l02724\"></a><span class=\"lineno\"> 2724</span>&#160;        <span class=\"comment\">// wwyw</span></div>\n<div class=\"line\"><a name=\"l02725\"></a><span class=\"lineno\"> 2725</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02726\"></a><span class=\"lineno\"> 2726</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwyw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02727\"></a><span class=\"lineno\"> 2727</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.y, v.w);</div>\n<div class=\"line\"><a name=\"l02728\"></a><span class=\"lineno\"> 2728</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02729\"></a><span class=\"lineno\"> 2729</span>&#160;</div>\n<div class=\"line\"><a name=\"l02730\"></a><span class=\"lineno\"> 2730</span>&#160;        <span class=\"comment\">// wwzx</span></div>\n<div class=\"line\"><a name=\"l02731\"></a><span class=\"lineno\"> 2731</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02732\"></a><span class=\"lineno\"> 2732</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwzx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02733\"></a><span class=\"lineno\"> 2733</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.z, v.x);</div>\n<div class=\"line\"><a name=\"l02734\"></a><span class=\"lineno\"> 2734</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02735\"></a><span class=\"lineno\"> 2735</span>&#160;</div>\n<div class=\"line\"><a name=\"l02736\"></a><span class=\"lineno\"> 2736</span>&#160;        <span class=\"comment\">// wwzy</span></div>\n<div class=\"line\"><a name=\"l02737\"></a><span class=\"lineno\"> 2737</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02738\"></a><span class=\"lineno\"> 2738</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwzy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02739\"></a><span class=\"lineno\"> 2739</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.z, v.y);</div>\n<div class=\"line\"><a name=\"l02740\"></a><span class=\"lineno\"> 2740</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02741\"></a><span class=\"lineno\"> 2741</span>&#160;</div>\n<div class=\"line\"><a name=\"l02742\"></a><span class=\"lineno\"> 2742</span>&#160;        <span class=\"comment\">// wwzz</span></div>\n<div class=\"line\"><a name=\"l02743\"></a><span class=\"lineno\"> 2743</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02744\"></a><span class=\"lineno\"> 2744</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwzz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02745\"></a><span class=\"lineno\"> 2745</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.z, v.z);</div>\n<div class=\"line\"><a name=\"l02746\"></a><span class=\"lineno\"> 2746</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02747\"></a><span class=\"lineno\"> 2747</span>&#160;</div>\n<div class=\"line\"><a name=\"l02748\"></a><span class=\"lineno\"> 2748</span>&#160;        <span class=\"comment\">// wwzw</span></div>\n<div class=\"line\"><a name=\"l02749\"></a><span class=\"lineno\"> 2749</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02750\"></a><span class=\"lineno\"> 2750</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwzw(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02751\"></a><span class=\"lineno\"> 2751</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.z, v.w);</div>\n<div class=\"line\"><a name=\"l02752\"></a><span class=\"lineno\"> 2752</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02753\"></a><span class=\"lineno\"> 2753</span>&#160;</div>\n<div class=\"line\"><a name=\"l02754\"></a><span class=\"lineno\"> 2754</span>&#160;        <span class=\"comment\">// wwwx</span></div>\n<div class=\"line\"><a name=\"l02755\"></a><span class=\"lineno\"> 2755</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02756\"></a><span class=\"lineno\"> 2756</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwwx(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02757\"></a><span class=\"lineno\"> 2757</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.w, v.x);</div>\n<div class=\"line\"><a name=\"l02758\"></a><span class=\"lineno\"> 2758</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02759\"></a><span class=\"lineno\"> 2759</span>&#160;</div>\n<div class=\"line\"><a name=\"l02760\"></a><span class=\"lineno\"> 2760</span>&#160;        <span class=\"comment\">// wwwy</span></div>\n<div class=\"line\"><a name=\"l02761\"></a><span class=\"lineno\"> 2761</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02762\"></a><span class=\"lineno\"> 2762</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwwy(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02763\"></a><span class=\"lineno\"> 2763</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.w, v.y);</div>\n<div class=\"line\"><a name=\"l02764\"></a><span class=\"lineno\"> 2764</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02765\"></a><span class=\"lineno\"> 2765</span>&#160;</div>\n<div class=\"line\"><a name=\"l02766\"></a><span class=\"lineno\"> 2766</span>&#160;        <span class=\"comment\">// wwwz</span></div>\n<div class=\"line\"><a name=\"l02767\"></a><span class=\"lineno\"> 2767</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02768\"></a><span class=\"lineno\"> 2768</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwwz(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02769\"></a><span class=\"lineno\"> 2769</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.w, v.z);</div>\n<div class=\"line\"><a name=\"l02770\"></a><span class=\"lineno\"> 2770</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02771\"></a><span class=\"lineno\"> 2771</span>&#160;</div>\n<div class=\"line\"><a name=\"l02772\"></a><span class=\"lineno\"> 2772</span>&#160;        <span class=\"comment\">// wwww</span></div>\n<div class=\"line\"><a name=\"l02773\"></a><span class=\"lineno\"> 2773</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l02774\"></a><span class=\"lineno\"> 2774</span>&#160;        GLM_INLINE glm::vec&lt;4, T, Q&gt; wwww(<span class=\"keyword\">const</span> glm::vec&lt;4, T, Q&gt; &amp;v) {</div>\n<div class=\"line\"><a name=\"l02775\"></a><span class=\"lineno\"> 2775</span>&#160;                <span class=\"keywordflow\">return</span> glm::vec&lt;4, T, Q&gt;(v.w, v.w, v.w, v.w);</div>\n<div class=\"line\"><a name=\"l02776\"></a><span class=\"lineno\"> 2776</span>&#160;        }</div>\n<div class=\"line\"><a name=\"l02777\"></a><span class=\"lineno\"> 2777</span>&#160;</div>\n<div class=\"line\"><a name=\"l02778\"></a><span class=\"lineno\"> 2778</span>&#160;}</div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00131.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vector_angle.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">vector_angle.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00226.html\">GLM_GTX_vector_angle</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00131_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga2e2917b4cb75ca3d043ac15ff88f14e1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2e2917b4cb75ca3d043ac15ff88f14e1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00226.html#ga2e2917b4cb75ca3d043ac15ff88f14e1\">angle</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga2e2917b4cb75ca3d043ac15ff88f14e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the absolute angle between two vectors.  <a href=\"a00226.html#ga2e2917b4cb75ca3d043ac15ff88f14e1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e2917b4cb75ca3d043ac15ff88f14e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9556a803dce87fe0f42fdabe4ebba1d5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9556a803dce87fe0f42fdabe4ebba1d5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00226.html#ga9556a803dce87fe0f42fdabe4ebba1d5\">orientedAngle</a> (vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga9556a803dce87fe0f42fdabe4ebba1d5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the oriented angle between two 2d vectors.  <a href=\"a00226.html#ga9556a803dce87fe0f42fdabe4ebba1d5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9556a803dce87fe0f42fdabe4ebba1d5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga706fce3d111f485839756a64f5a48553\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga706fce3d111f485839756a64f5a48553\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00226.html#ga706fce3d111f485839756a64f5a48553\">orientedAngle</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, vec&lt; 3, T, Q &gt; const &amp;ref)</td></tr>\n<tr class=\"memdesc:ga706fce3d111f485839756a64f5a48553\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the oriented angle between two 3d vectors based from a reference axis.  <a href=\"a00226.html#ga706fce3d111f485839756a64f5a48553\">More...</a><br /></td></tr>\n<tr class=\"separator:ga706fce3d111f485839756a64f5a48553\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00226.html\">GLM_GTX_vector_angle</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd>\n<dd>\n<a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> (dependence) </dd>\n<dd>\ngtx_epsilon (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00131_source.html\">vector_angle.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00131_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vector_angle.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vector_angle.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00131.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;</div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/epsilon.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/quaternion.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;../gtx/rotate_vector.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_vector_angle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_vector_angle extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00030\"></a><span class=\"lineno\">   30</span>&#160;</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00226.html#ga2e2917b4cb75ca3d043ac15ff88f14e1\">angle</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00226.html#ga706fce3d111f485839756a64f5a48553\">orientedAngle</a>(vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;2, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;        GLM_FUNC_DECL T <a class=\"code\" href=\"a00226.html#ga706fce3d111f485839756a64f5a48553\">orientedAngle</a>(vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; y, vec&lt;3, T, Q&gt; <span class=\"keyword\">const</span>&amp; ref);</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;<span class=\"preprocessor\">#include &quot;vector_angle.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00226_html_ga706fce3d111f485839756a64f5a48553\"><div class=\"ttname\"><a href=\"a00226.html#ga706fce3d111f485839756a64f5a48553\">glm::orientedAngle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T orientedAngle(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, vec&lt; 3, T, Q &gt; const &amp;ref)</div><div class=\"ttdoc\">Returns the oriented angle between two 3d vectors based from a reference axis. </div></div>\n<div class=\"ttc\" id=\"a00226_html_ga2e2917b4cb75ca3d043ac15ff88f14e1\"><div class=\"ttname\"><a href=\"a00226.html#ga2e2917b4cb75ca3d043ac15ff88f14e1\">glm::angle</a></div><div class=\"ttdeci\">GLM_FUNC_DECL T angle(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the absolute angle between two vectors. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00132.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vector_query.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">vector_query.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00227.html\">GLM_GTX_vector_query</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00132_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga13da4a787a2ff70e95d561fb19ff91b4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga13da4a787a2ff70e95d561fb19ff91b4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#ga13da4a787a2ff70e95d561fb19ff91b4\">areCollinear</a> (vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga13da4a787a2ff70e95d561fb19ff91b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether two vectors are collinears.  <a href=\"a00227.html#ga13da4a787a2ff70e95d561fb19ff91b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga13da4a787a2ff70e95d561fb19ff91b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7b95b3f798e3c293262b2bdaad47c57\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac7b95b3f798e3c293262b2bdaad47c57\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gac7b95b3f798e3c293262b2bdaad47c57\">areOrthogonal</a> (vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gac7b95b3f798e3c293262b2bdaad47c57\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether two vectors are orthogonals.  <a href=\"a00227.html#gac7b95b3f798e3c293262b2bdaad47c57\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7b95b3f798e3c293262b2bdaad47c57\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b091c3d7f9ee3b0708311c001c293e3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1b091c3d7f9ee3b0708311c001c293e3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#ga1b091c3d7f9ee3b0708311c001c293e3\">areOrthonormal</a> (vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga1b091c3d7f9ee3b0708311c001c293e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether two vectors are orthonormal.  <a href=\"a00227.html#ga1b091c3d7f9ee3b0708311c001c293e3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b091c3d7f9ee3b0708311c001c293e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf6ec1688eab7442fe96fe4941d5d4e76\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf6ec1688eab7442fe96fe4941d5d4e76\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gaf6ec1688eab7442fe96fe4941d5d4e76\">isCompNull</a> (vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaf6ec1688eab7442fe96fe4941d5d4e76\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether a each component of a vector is null.  <a href=\"a00227.html#gaf6ec1688eab7442fe96fe4941d5d4e76\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf6ec1688eab7442fe96fe4941d5d4e76\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac3c974f459fd75453134fad7ae89a39e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac3c974f459fd75453134fad7ae89a39e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gac3c974f459fd75453134fad7ae89a39e\">isNormalized</a> (vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gac3c974f459fd75453134fad7ae89a39e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether a vector is normalized.  <a href=\"a00227.html#gac3c974f459fd75453134fad7ae89a39e\">More...</a><br /></td></tr>\n<tr class=\"separator:gac3c974f459fd75453134fad7ae89a39e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab4a3637dbcb4bb42dc55caea7a1e0495\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab4a3637dbcb4bb42dc55caea7a1e0495\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gab4a3637dbcb4bb42dc55caea7a1e0495\">isNull</a> (vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gab4a3637dbcb4bb42dc55caea7a1e0495\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether a vector is null.  <a href=\"a00227.html#gab4a3637dbcb4bb42dc55caea7a1e0495\">More...</a><br /></td></tr>\n<tr class=\"separator:gab4a3637dbcb4bb42dc55caea7a1e0495\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00227.html\">GLM_GTX_vector_query</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00132_source.html\">vector_query.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00132_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vector_query.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vector_query.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00132.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &lt;cfloat&gt;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#include &lt;limits&gt;</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_vector_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;</div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_vector_query extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00029\"></a><span class=\"lineno\">   29</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00032\"></a><span class=\"lineno\">   32</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00227.html#ga13da4a787a2ff70e95d561fb19ff91b4\">areCollinear</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v0, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00227.html#gac7b95b3f798e3c293262b2bdaad47c57\">areOrthogonal</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v0, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00042\"></a><span class=\"lineno\">   42</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00227.html#gac3c974f459fd75453134fad7ae89a39e\">isNormalized</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;                </div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00227.html#gab4a3637dbcb4bb42dc55caea7a1e0495\">isNull</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00052\"></a><span class=\"lineno\">   52</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00227.html#gaf6ec1688eab7442fe96fe4941d5d4e76\">isCompNull</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00060\"></a><span class=\"lineno\">   60</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00061\"></a><span class=\"lineno\">   61</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00227.html#ga1b091c3d7f9ee3b0708311c001c293e3\">areOrthonormal</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v0, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; v1, T <span class=\"keyword\">const</span>&amp; <a class=\"code\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a>);</div>\n<div class=\"line\"><a name=\"l00062\"></a><span class=\"lineno\">   62</span>&#160;</div>\n<div class=\"line\"><a name=\"l00064\"></a><span class=\"lineno\">   64</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;<span class=\"preprocessor\">#include &quot;vector_query.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00151_html_ga2a1e57fc5592b69cfae84174cbfc9429\"><div class=\"ttname\"><a href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">glm::epsilon</a></div><div class=\"ttdeci\">GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()</div><div class=\"ttdoc\">Return the epsilon constant for floating point types. </div></div>\n<div class=\"ttc\" id=\"a00227_html_gaf6ec1688eab7442fe96fe4941d5d4e76\"><div class=\"ttname\"><a href=\"a00227.html#gaf6ec1688eab7442fe96fe4941d5d4e76\">glm::isCompNull</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; isCompNull(vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</div><div class=\"ttdoc\">Check whether a each component of a vector is null. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00227_html_gab4a3637dbcb4bb42dc55caea7a1e0495\"><div class=\"ttname\"><a href=\"a00227.html#gab4a3637dbcb4bb42dc55caea7a1e0495\">glm::isNull</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool isNull(vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</div><div class=\"ttdoc\">Check whether a vector is null. </div></div>\n<div class=\"ttc\" id=\"a00227_html_gac7b95b3f798e3c293262b2bdaad47c57\"><div class=\"ttname\"><a href=\"a00227.html#gac7b95b3f798e3c293262b2bdaad47c57\">glm::areOrthogonal</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool areOrthogonal(vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</div><div class=\"ttdoc\">Check whether two vectors are orthogonals. </div></div>\n<div class=\"ttc\" id=\"a00227_html_ga13da4a787a2ff70e95d561fb19ff91b4\"><div class=\"ttname\"><a href=\"a00227.html#ga13da4a787a2ff70e95d561fb19ff91b4\">glm::areCollinear</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool areCollinear(vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</div><div class=\"ttdoc\">Check whether two vectors are collinears. </div></div>\n<div class=\"ttc\" id=\"a00227_html_gac3c974f459fd75453134fad7ae89a39e\"><div class=\"ttname\"><a href=\"a00227.html#gac3c974f459fd75453134fad7ae89a39e\">glm::isNormalized</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool isNormalized(vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</div><div class=\"ttdoc\">Check whether a vector is normalized. </div></div>\n<div class=\"ttc\" id=\"a00227_html_ga1b091c3d7f9ee3b0708311c001c293e3\"><div class=\"ttname\"><a href=\"a00227.html#ga1b091c3d7f9ee3b0708311c001c293e3\">glm::areOrthonormal</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool areOrthonormal(vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</div><div class=\"ttdoc\">Check whether two vectors are orthonormal. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00133.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: wrap.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">wrap.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00227.html\">GLM_GTX_wrap</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00133_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#ga6c0cc6bd1d67ea1008d2592e998bad33\">clamp</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_CLAMP OpenGL wrap mode.  <a href=\"a00227.html#ga6c0cc6bd1d67ea1008d2592e998bad33\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gaa6856a0a048d2749252848da35e10c8b\">mirrorClamp</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_MIRRORED_REPEAT OpenGL wrap mode.  <a href=\"a00227.html#gaa6856a0a048d2749252848da35e10c8b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#ga16a89b0661b60d5bea85137bbae74d73\">mirrorRepeat</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_MIRROR_REPEAT OpenGL wrap mode.  <a href=\"a00227.html#ga16a89b0661b60d5bea85137bbae74d73\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#ga809650c6310ea7c42666e918c117fb6f\">repeat</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_REPEAT OpenGL wrap mode.  <a href=\"a00227.html#ga809650c6310ea7c42666e918c117fb6f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00227.html\">GLM_GTX_wrap</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00142.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00133_source.html\">wrap.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00133_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: vector_relational.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">vector_relational.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;</div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00082.html\">detail/qualifier.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#include &quot;<a class=\"code\" href=\"a00094.html\">detail/setup.hpp</a>&quot;</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00233.html#ga314be073c42278ccb6fe7a7958213824\">lessThan</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00037\"></a><span class=\"lineno\">   37</span>&#160;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00233.html#ga51bf75522dbe1fa5e7806eb9b825ab6a\">lessThanEqual</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00047\"></a><span class=\"lineno\">   47</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00056\"></a><span class=\"lineno\">   56</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00233.html#gad3a3a7d228da3754c328c9a778f6df56\">greaterThan</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00057\"></a><span class=\"lineno\">   57</span>&#160;</div>\n<div class=\"line\"><a name=\"l00065\"></a><span class=\"lineno\">   65</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00066\"></a><span class=\"lineno\">   66</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00233.html#ga271038c5290184127754bda0ae91a5bd\">greaterThanEqual</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00067\"></a><span class=\"lineno\">   67</span>&#160;</div>\n<div class=\"line\"><a name=\"l00075\"></a><span class=\"lineno\">   75</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00076\"></a><span class=\"lineno\">   76</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00233.html#ga774f9e3a93c913f1e7c215a549707d59\">equal</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00077\"></a><span class=\"lineno\">   77</span>&#160;</div>\n<div class=\"line\"><a name=\"l00085\"></a><span class=\"lineno\">   85</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, <span class=\"keyword\">typename</span> T, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00086\"></a><span class=\"lineno\">   86</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00233.html#gac5a72a973c81dc697dd8bb5d218e8251\">notEqual</a>(vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; x, vec&lt;L, T, Q&gt; <span class=\"keyword\">const</span>&amp; y);</div>\n<div class=\"line\"><a name=\"l00087\"></a><span class=\"lineno\">   87</span>&#160;</div>\n<div class=\"line\"><a name=\"l00094\"></a><span class=\"lineno\">   94</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00095\"></a><span class=\"lineno\">   95</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00233.html#gadcc289349a96ef7642b14bc151ee4ae8\">any</a>(vec&lt;L, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00096\"></a><span class=\"lineno\">   96</span>&#160;</div>\n<div class=\"line\"><a name=\"l00103\"></a><span class=\"lineno\">  103</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00104\"></a><span class=\"lineno\">  104</span>&#160;        GLM_FUNC_DECL <span class=\"keywordtype\">bool</span> <a class=\"code\" href=\"a00233.html#gab5af106b2d5675d51af84815d937384d\">all</a>(vec&lt;L, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00105\"></a><span class=\"lineno\">  105</span>&#160;</div>\n<div class=\"line\"><a name=\"l00113\"></a><span class=\"lineno\">  113</span>&#160;        <span class=\"keyword\">template</span>&lt;length_t L, qualifier Q&gt;</div>\n<div class=\"line\"><a name=\"l00114\"></a><span class=\"lineno\">  114</span>&#160;        GLM_FUNC_DECL vec&lt;L, bool, Q&gt; <a class=\"code\" href=\"a00233.html#ga464f1392c934f69a917ab8bb6eda5b09\">not_</a>(vec&lt;L, bool, Q&gt; <span class=\"keyword\">const</span>&amp; v);</div>\n<div class=\"line\"><a name=\"l00115\"></a><span class=\"lineno\">  115</span>&#160;</div>\n<div class=\"line\"><a name=\"l00117\"></a><span class=\"lineno\">  117</span>&#160;}<span class=\"comment\">//namespace glm</span></div>\n<div class=\"line\"><a name=\"l00118\"></a><span class=\"lineno\">  118</span>&#160;</div>\n<div class=\"line\"><a name=\"l00119\"></a><span class=\"lineno\">  119</span>&#160;<span class=\"preprocessor\">#include &quot;detail/func_vector_relational.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00233_html_gad3a3a7d228da3754c328c9a778f6df56\"><div class=\"ttname\"><a href=\"a00233.html#gad3a3a7d228da3754c328c9a778f6df56\">glm::greaterThan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; greaterThan(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x > y. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00082_html\"><div class=\"ttname\"><a href=\"a00082.html\">qualifier.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00233_html_ga51bf75522dbe1fa5e7806eb9b825ab6a\"><div class=\"ttname\"><a href=\"a00233.html#ga51bf75522dbe1fa5e7806eb9b825ab6a\">glm::lessThanEqual</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; lessThanEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x <= y. </div></div>\n<div class=\"ttc\" id=\"a00233_html_ga271038c5290184127754bda0ae91a5bd\"><div class=\"ttname\"><a href=\"a00233.html#ga271038c5290184127754bda0ae91a5bd\">glm::greaterThanEqual</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; greaterThanEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x >= y. </div></div>\n<div class=\"ttc\" id=\"a00233_html_gadcc289349a96ef7642b14bc151ee4ae8\"><div class=\"ttname\"><a href=\"a00233.html#gadcc289349a96ef7642b14bc151ee4ae8\">glm::any</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool any(vec&lt; L, bool, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns true if any component of x is true. </div></div>\n<div class=\"ttc\" id=\"a00233_html_ga774f9e3a93c913f1e7c215a549707d59\"><div class=\"ttname\"><a href=\"a00233.html#ga774f9e3a93c913f1e7c215a549707d59\">glm::equal</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; equal(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x == y. </div></div>\n<div class=\"ttc\" id=\"a00233_html_ga464f1392c934f69a917ab8bb6eda5b09\"><div class=\"ttname\"><a href=\"a00233.html#ga464f1392c934f69a917ab8bb6eda5b09\">glm::not_</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; not_(vec&lt; L, bool, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns the component-wise logical complement of x. </div></div>\n<div class=\"ttc\" id=\"a00233_html_ga314be073c42278ccb6fe7a7958213824\"><div class=\"ttname\"><a href=\"a00233.html#ga314be073c42278ccb6fe7a7958213824\">glm::lessThan</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; lessThan(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison result of x < y. </div></div>\n<div class=\"ttc\" id=\"a00094_html\"><div class=\"ttname\"><a href=\"a00094.html\">setup.hpp</a></div><div class=\"ttdoc\">Core features </div></div>\n<div class=\"ttc\" id=\"a00233_html_gab5af106b2d5675d51af84815d937384d\"><div class=\"ttname\"><a href=\"a00233.html#gab5af106b2d5675d51af84815d937384d\">glm::all</a></div><div class=\"ttdeci\">GLM_FUNC_DECL bool all(vec&lt; L, bool, Q &gt; const &amp;v)</div><div class=\"ttdoc\">Returns true if all components of x are true. </div></div>\n<div class=\"ttc\" id=\"a00233_html_gac5a72a973c81dc697dd8bb5d218e8251\"><div class=\"ttname\"><a href=\"a00233.html#gac5a72a973c81dc697dd8bb5d218e8251\">glm::notEqual</a></div><div class=\"ttdeci\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt; notEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</div><div class=\"ttdoc\">Returns the component-wise comparison of result x != y. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00134.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: wrap.hpp File Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">wrap.hpp File Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p><a class=\"el\" href=\"a00228.html\">GLM_GTX_wrap</a>  \n<a href=\"#details\">More...</a></p>\n\n<p><a href=\"a00134_source.html\">Go to the source code of this file.</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html#ga6c0cc6bd1d67ea1008d2592e998bad33\">clamp</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_CLAMP OpenGL wrap mode.  <a href=\"a00228.html#ga6c0cc6bd1d67ea1008d2592e998bad33\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html#gaa6856a0a048d2749252848da35e10c8b\">mirrorClamp</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_MIRRORED_REPEAT OpenGL wrap mode.  <a href=\"a00228.html#gaa6856a0a048d2749252848da35e10c8b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html#ga16a89b0661b60d5bea85137bbae74d73\">mirrorRepeat</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_MIRROR_REPEAT OpenGL wrap mode.  <a href=\"a00228.html#ga16a89b0661b60d5bea85137bbae74d73\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html#ga809650c6310ea7c42666e918c117fb6f\">repeat</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_REPEAT OpenGL wrap mode.  <a href=\"a00228.html#ga809650c6310ea7c42666e918c117fb6f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<div class=\"textblock\"><p><a class=\"el\" href=\"a00228.html\">GLM_GTX_wrap</a> </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00143.html\" title=\"Features that implement in C++ the GLSL specification as closely as possible. \">Core features</a> (dependence) </dd></dl>\n\n<p>Definition in file <a class=\"el\" href=\"a00134_source.html\">wrap.hpp</a>.</p>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00134_source.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: wrap.hpp Source File</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">wrap.hpp</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<a href=\"a00134.html\">Go to the documentation of this file.</a><div class=\"fragment\"><div class=\"line\"><a name=\"l00001\"></a><span class=\"lineno\">    1</span>&#160;</div>\n<div class=\"line\"><a name=\"l00013\"></a><span class=\"lineno\">   13</span>&#160;<span class=\"preprocessor\">#pragma once</span></div>\n<div class=\"line\"><a name=\"l00014\"></a><span class=\"lineno\">   14</span>&#160;</div>\n<div class=\"line\"><a name=\"l00015\"></a><span class=\"lineno\">   15</span>&#160;<span class=\"comment\">// Dependency:</span></div>\n<div class=\"line\"><a name=\"l00016\"></a><span class=\"lineno\">   16</span>&#160;<span class=\"preprocessor\">#include &quot;../glm.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00017\"></a><span class=\"lineno\">   17</span>&#160;<span class=\"preprocessor\">#include &quot;../gtc/vec1.hpp&quot;</span></div>\n<div class=\"line\"><a name=\"l00018\"></a><span class=\"lineno\">   18</span>&#160;</div>\n<div class=\"line\"><a name=\"l00019\"></a><span class=\"lineno\">   19</span>&#160;<span class=\"preprocessor\">#ifndef GLM_ENABLE_EXPERIMENTAL</span></div>\n<div class=\"line\"><a name=\"l00020\"></a><span class=\"lineno\">   20</span>&#160;<span class=\"preprocessor\">#       error &quot;GLM: GLM_GTX_wrap is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.&quot;</span></div>\n<div class=\"line\"><a name=\"l00021\"></a><span class=\"lineno\">   21</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00022\"></a><span class=\"lineno\">   22</span>&#160;</div>\n<div class=\"line\"><a name=\"l00023\"></a><span class=\"lineno\">   23</span>&#160;<span class=\"preprocessor\">#if GLM_MESSAGES == GLM_MESSAGES_ENABLED &amp;&amp; !defined(GLM_EXT_INCLUDED)</span></div>\n<div class=\"line\"><a name=\"l00024\"></a><span class=\"lineno\">   24</span>&#160;<span class=\"preprocessor\">#       pragma message(&quot;GLM: GLM_GTX_wrap extension included&quot;)</span></div>\n<div class=\"line\"><a name=\"l00025\"></a><span class=\"lineno\">   25</span>&#160;<span class=\"preprocessor\">#endif</span></div>\n<div class=\"line\"><a name=\"l00026\"></a><span class=\"lineno\">   26</span>&#160;</div>\n<div class=\"line\"><a name=\"l00027\"></a><span class=\"lineno\">   27</span>&#160;<span class=\"keyword\">namespace </span><a class=\"code\" href=\"a00135.html\">glm</a></div>\n<div class=\"line\"><a name=\"l00028\"></a><span class=\"lineno\">   28</span>&#160;{</div>\n<div class=\"line\"><a name=\"l00031\"></a><span class=\"lineno\">   31</span>&#160;</div>\n<div class=\"line\"><a name=\"l00034\"></a><span class=\"lineno\">   34</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00035\"></a><span class=\"lineno\">   35</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00228.html#ga6c0cc6bd1d67ea1008d2592e998bad33\">clamp</a>(genType <span class=\"keyword\">const</span>&amp; Texcoord);</div>\n<div class=\"line\"><a name=\"l00036\"></a><span class=\"lineno\">   36</span>&#160;</div>\n<div class=\"line\"><a name=\"l00039\"></a><span class=\"lineno\">   39</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00040\"></a><span class=\"lineno\">   40</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00228.html#ga809650c6310ea7c42666e918c117fb6f\">repeat</a>(genType <span class=\"keyword\">const</span>&amp; Texcoord);</div>\n<div class=\"line\"><a name=\"l00041\"></a><span class=\"lineno\">   41</span>&#160;</div>\n<div class=\"line\"><a name=\"l00044\"></a><span class=\"lineno\">   44</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00045\"></a><span class=\"lineno\">   45</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00228.html#gaa6856a0a048d2749252848da35e10c8b\">mirrorClamp</a>(genType <span class=\"keyword\">const</span>&amp; Texcoord);</div>\n<div class=\"line\"><a name=\"l00046\"></a><span class=\"lineno\">   46</span>&#160;</div>\n<div class=\"line\"><a name=\"l00049\"></a><span class=\"lineno\">   49</span>&#160;        <span class=\"keyword\">template</span>&lt;<span class=\"keyword\">typename</span> genType&gt;</div>\n<div class=\"line\"><a name=\"l00050\"></a><span class=\"lineno\">   50</span>&#160;        GLM_FUNC_DECL genType <a class=\"code\" href=\"a00228.html#ga16a89b0661b60d5bea85137bbae74d73\">mirrorRepeat</a>(genType <span class=\"keyword\">const</span>&amp; Texcoord);</div>\n<div class=\"line\"><a name=\"l00051\"></a><span class=\"lineno\">   51</span>&#160;</div>\n<div class=\"line\"><a name=\"l00053\"></a><span class=\"lineno\">   53</span>&#160;}<span class=\"comment\">// namespace glm</span></div>\n<div class=\"line\"><a name=\"l00054\"></a><span class=\"lineno\">   54</span>&#160;</div>\n<div class=\"line\"><a name=\"l00055\"></a><span class=\"lineno\">   55</span>&#160;<span class=\"preprocessor\">#include &quot;wrap.inl&quot;</span></div>\n<div class=\"ttc\" id=\"a00228_html_ga6c0cc6bd1d67ea1008d2592e998bad33\"><div class=\"ttname\"><a href=\"a00228.html#ga6c0cc6bd1d67ea1008d2592e998bad33\">glm::clamp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType clamp(genType const &amp;Texcoord)</div><div class=\"ttdoc\">Simulate GL_CLAMP OpenGL wrap mode. </div></div>\n<div class=\"ttc\" id=\"a00135_html\"><div class=\"ttname\"><a href=\"a00135.html\">glm</a></div><div class=\"ttdef\"><b>Definition:</b> <a href=\"a00015_source.html#l00020\">common.hpp:20</a></div></div>\n<div class=\"ttc\" id=\"a00228_html_ga16a89b0661b60d5bea85137bbae74d73\"><div class=\"ttname\"><a href=\"a00228.html#ga16a89b0661b60d5bea85137bbae74d73\">glm::mirrorRepeat</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType mirrorRepeat(genType const &amp;Texcoord)</div><div class=\"ttdoc\">Simulate GL_MIRROR_REPEAT OpenGL wrap mode. </div></div>\n<div class=\"ttc\" id=\"a00228_html_ga809650c6310ea7c42666e918c117fb6f\"><div class=\"ttname\"><a href=\"a00228.html#ga809650c6310ea7c42666e918c117fb6f\">glm::repeat</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType repeat(genType const &amp;Texcoord)</div><div class=\"ttdoc\">Simulate GL_REPEAT OpenGL wrap mode. </div></div>\n<div class=\"ttc\" id=\"a00228_html_gaa6856a0a048d2749252848da35e10c8b\"><div class=\"ttname\"><a href=\"a00228.html#gaa6856a0a048d2749252848da35e10c8b\">glm::mirrorClamp</a></div><div class=\"ttdeci\">GLM_FUNC_DECL genType mirrorClamp(genType const &amp;Texcoord)</div><div class=\"ttdoc\">Simulate GL_MIRRORED_REPEAT OpenGL wrap mode. </div></div>\n</div><!-- fragment --></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00139.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Common functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Common functions<div class=\"ingroups\"><a class=\"el\" href=\"a00142.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00015.html\" title=\"Core features \">glm/common.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga693d77696ff36572a0da79efec965acd\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga693d77696ff36572a0da79efec965acd\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga693d77696ff36572a0da79efec965acd\">abs</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga693d77696ff36572a0da79efec965acd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x if x &gt;= 0; otherwise, it returns -x.  <a href=\"a00139.html#ga693d77696ff36572a0da79efec965acd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga693d77696ff36572a0da79efec965acd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga3e141c9738c73d3e581efa471dba8b4c\">abs</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x if x &gt;= 0; otherwise, it returns -x.  <a href=\"a00139.html#ga3e141c9738c73d3e581efa471dba8b4c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gafb9d2a645a23aca12d4d6de0104b7657\">ceil</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer that is greater than or equal to x.  <a href=\"a00139.html#gafb9d2a645a23aca12d4d6de0104b7657\">More...</a><br /></td></tr>\n<tr class=\"separator:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga93bce26c7d80d30a62f5c508f8498a6c\">clamp</a> (genType x, genType minVal, genType maxVal)</td></tr>\n<tr class=\"memdesc:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00139.html#ga93bce26c7d80d30a62f5c508f8498a6c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gabff13e6547edac08f52b4133ff4bf183\">clamp</a> (vec&lt; L, T, Q &gt; const &amp;x, T minVal, T maxVal)</td></tr>\n<tr class=\"memdesc:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00139.html#gabff13e6547edac08f52b4133ff4bf183\">More...</a><br /></td></tr>\n<tr class=\"separator:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga748333282a6f2f87762c0a4739c8c364\">clamp</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;minVal, vec&lt; L, T, Q &gt; const &amp;maxVal)</td></tr>\n<tr class=\"memdesc:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00139.html#ga748333282a6f2f87762c0a4739c8c364\">More...</a><br /></td></tr>\n<tr class=\"separator:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga1425c1c3160ec51214b03a0469a3013d\">floatBitsToInt</a> (float const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a signed integer value representing the encoding of a floating-point value.  <a href=\"a00139.html#ga1425c1c3160ec51214b03a0469a3013d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">floatBitsToInt</a> (vec&lt; L, float, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a signed integer value representing the encoding of a floating-point value.  <a href=\"a00139.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga70e0271c34af52f3100c7960e18c3f2b\">floatBitsToUint</a> (float const &amp;v)</td></tr>\n<tr class=\"memdesc:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a unsigned integer value representing the encoding of a floating-point value.  <a href=\"a00139.html#ga70e0271c34af52f3100c7960e18c3f2b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">floatBitsToUint</a> (vec&lt; L, float, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a unsigned integer value representing the encoding of a floating-point value.  <a href=\"a00139.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gaa9d0742639e85b29c7c5de11cfd6840d\">floor</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer that is less then or equal to x.  <a href=\"a00139.html#gaa9d0742639e85b29c7c5de11cfd6840d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gad0f444d4b81cc53c3b6edf5aa25078c2\">fma</a> (genType const &amp;a, genType const &amp;b, genType const &amp;c)</td></tr>\n<tr class=\"memdesc:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Computes and returns a * b + c.  <a href=\"a00139.html#gad0f444d4b81cc53c3b6edf5aa25078c2\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga8ba89e40e55ae5cdf228548f9b7639c7\">fract</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return x - floor(x).  <a href=\"a00139.html#ga8ba89e40e55ae5cdf228548f9b7639c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2df623004f634b440d61e018d62c751b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2df623004f634b440d61e018d62c751b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga2df623004f634b440d61e018d62c751b\">fract</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga2df623004f634b440d61e018d62c751b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return x - floor(x).  <a href=\"a00139.html#ga2df623004f634b440d61e018d62c751b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2df623004f634b440d61e018d62c751b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType , typename genIType &gt; </td></tr>\n<tr class=\"memitem:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga20620e83544d1a988857a3bc4ebe0e1d\">frexp</a> (genType const &amp;x, genIType &amp;exp)</td></tr>\n<tr class=\"memdesc:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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)  <a href=\"a00139.html#ga20620e83544d1a988857a3bc4ebe0e1d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga4fb7c21c2dce064b26fd9ccdaf9adcd4\">intBitsToFloat</a> (int const &amp;v)</td></tr>\n<tr class=\"memdesc:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a signed integer encoding of a floating-point value.  <a href=\"a00139.html#ga4fb7c21c2dce064b26fd9ccdaf9adcd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, float, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">intBitsToFloat</a> (vec&lt; L, int, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a signed integer encoding of a floating-point value.  <a href=\"a00139.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2885587c23a106301f20443896365b62\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2885587c23a106301f20443896365b62\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga2885587c23a106301f20443896365b62\">isinf</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga2885587c23a106301f20443896365b62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a positive infinity or negative infinity representation in the underlying implementation's set of floating point representations.  <a href=\"a00139.html#ga2885587c23a106301f20443896365b62\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2885587c23a106301f20443896365b62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga29ef934c00306490de837b4746b4e14d\">isnan</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga29ef934c00306490de837b4746b4e14d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a NaN (not a number) representation in the underlying implementation's set of floating point representations.  <a href=\"a00139.html#ga29ef934c00306490de837b4746b4e14d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52e319d7289b849ec92055abd4830533\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType , typename genIType &gt; </td></tr>\n<tr class=\"memitem:ga52e319d7289b849ec92055abd4830533\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga52e319d7289b849ec92055abd4830533\">ldexp</a> (genType const &amp;x, genIType const &amp;exp)</td></tr>\n<tr class=\"memdesc:ga52e319d7289b849ec92055abd4830533\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a floating-point number from x and the corresponding integral exponent of two in exp, returning: significand * exp(2, exponent)  <a href=\"a00139.html#ga52e319d7289b849ec92055abd4830533\">More...</a><br /></td></tr>\n<tr class=\"separator:ga52e319d7289b849ec92055abd4830533\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga98caa7f95a94c86a86ebce893a45326c\">max</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00139.html#ga98caa7f95a94c86a86ebce893a45326c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gae8b0964d30deabd0867b8d7ac44f067e\">max</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00139.html#gae8b0964d30deabd0867b8d7ac44f067e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad48b723358c68d45477c22ff0101985e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad48b723358c68d45477c22ff0101985e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gad48b723358c68d45477c22ff0101985e\">max</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gad48b723358c68d45477c22ff0101985e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00139.html#gad48b723358c68d45477c22ff0101985e\">More...</a><br /></td></tr>\n<tr class=\"separator:gad48b723358c68d45477c22ff0101985e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga2c2bde1cec025b7ddff83c74a1113719\">min</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00139.html#ga2c2bde1cec025b7ddff83c74a1113719\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2d274e8b537c173dba983331a2620736\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2d274e8b537c173dba983331a2620736\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga2d274e8b537c173dba983331a2620736\">min</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:ga2d274e8b537c173dba983331a2620736\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00139.html#ga2d274e8b537c173dba983331a2620736\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2d274e8b537c173dba983331a2620736\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga734a374ca5c808e7bd9f74b6acfd7478\">min</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00139.html#ga734a374ca5c808e7bd9f74b6acfd7478\">More...</a><br /></td></tr>\n<tr class=\"separator:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genTypeT , typename genTypeU &gt; </td></tr>\n<tr class=\"memitem:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genTypeT&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a> (genTypeT x, genTypeT y, genTypeU a)</td></tr>\n<tr class=\"memdesc:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00139.html#ga8e93f374aae27d1a88b921860351f8d4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga12201563ef902e3b07e0d1d7656efdb1\">mod</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00139.html#ga12201563ef902e3b07e0d1d7656efdb1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gad32bcde4977c7a42c80468f4061a1f55\">mod</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00139.html#gad32bcde4977c7a42c80468f4061a1f55\">More...</a><br /></td></tr>\n<tr class=\"separator:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">mod</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00139.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga85e33f139b8db1b39b590a5713b9e679\">modf</a> (genType x, genType &amp;i)</td></tr>\n<tr class=\"memdesc:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the fractional part of x and sets i to the integer part (as a whole number floating point value).  <a href=\"a00139.html#ga85e33f139b8db1b39b590a5713b9e679\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gafa03aca8c4713e1cc892aa92ca135a7e\">round</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00139.html#gafa03aca8c4713e1cc892aa92ca135a7e\">More...</a><br /></td></tr>\n<tr class=\"separator:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga76b81785045a057989a84d99aeeb1578\">roundEven</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga76b81785045a057989a84d99aeeb1578\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00139.html#ga76b81785045a057989a84d99aeeb1578\">More...</a><br /></td></tr>\n<tr class=\"separator:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga1e2e5cfff800056540e32f6c9b604b28\">sign</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 1.0 if x &gt; 0, 0.0 if x == 0, or -1.0 if x &lt; 0.  <a href=\"a00139.html#ga1e2e5cfff800056540e32f6c9b604b28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga562edf7eca082cc5b7a0aaf180436daf\">smoothstep</a> (genType edge0, genType edge1, genType x)</td></tr>\n<tr class=\"memdesc:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt;= edge0 and 1.0 if x &gt;= edge1 and performs smooth Hermite interpolation between 0 and 1 when edge0 &lt; x &lt; edge1.  <a href=\"a00139.html#ga562edf7eca082cc5b7a0aaf180436daf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga015a1261ff23e12650211aa872863cce\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga015a1261ff23e12650211aa872863cce\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga015a1261ff23e12650211aa872863cce\">step</a> (genType edge, genType x)</td></tr>\n<tr class=\"memdesc:ga015a1261ff23e12650211aa872863cce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0 for each component of a genType.  <a href=\"a00139.html#ga015a1261ff23e12650211aa872863cce\">More...</a><br /></td></tr>\n<tr class=\"separator:ga015a1261ff23e12650211aa872863cce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga8f9a911a48ef244b51654eaefc81c551\">step</a> (T edge, vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0.  <a href=\"a00139.html#ga8f9a911a48ef244b51654eaefc81c551\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">step</a> (vec&lt; L, T, Q &gt; const &amp;edge, vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0.  <a href=\"a00139.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gaf9375e3e06173271d49e6ffa3a334259\">trunc</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x whose absolute value is not larger than the absolute value of x.  <a href=\"a00139.html#gaf9375e3e06173271d49e6ffa3a334259\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#gab2bae0d15dcdca6093f88f76b3975d97\">uintBitsToFloat</a> (uint const &amp;v)</td></tr>\n<tr class=\"memdesc:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value.  <a href=\"a00139.html#gab2bae0d15dcdca6093f88f76b3975d97\">More...</a><br /></td></tr>\n<tr class=\"separator:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, float, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00139.html#ga97f46b5f7b42fe44482e13356eb394ae\">uintBitsToFloat</a> (vec&lt; L, uint, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value.  <a href=\"a00139.html#ga97f46b5f7b42fe44482e13356eb394ae\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00015.html\" title=\"Core features \">glm/common.hpp</a>&gt; to use these core features. </p>\n<p>These all operate component-wise. The description is per component. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga693d77696ff36572a0da79efec965acd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::abs </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x if x &gt;= 0; otherwise, it returns -x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>floating-point or signed integer; scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml\">GLSL abs man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd>\n<dd>\nqualifier </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3e141c9738c73d3e581efa471dba8b4c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::abs </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x if x &gt;= 0; otherwise, it returns -x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or signed integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml\">GLSL abs man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafb9d2a645a23aca12d4d6de0104b7657\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::ceil </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer that is greater than or equal to x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml\">GLSL ceil man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga93bce26c7d80d30a62f5c508f8498a6c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::clamp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>minVal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>maxVal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer; scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n<p>Referenced by <a class=\"el\" href=\"a00017_source.html#l00050\">glm::saturate()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabff13e6547edac08f52b4133ff4bf183\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::clamp </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>minVal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>maxVal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga748333282a6f2f87762c0a4739c8c364\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::clamp </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>minVal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>maxVal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1425c1c3160ec51214b03a0469a3013d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::floatBitsToInt </td>\n          <td>(</td>\n          <td class=\"paramtype\">float const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a signed integer value representing the encoding of a floating-point value. </p>\n<p>The floating-point value's bit-level representation is preserved.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml\">GLSL floatBitsToInt man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga99f7d62f78ac5ea3b49bae715c9488ed\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, int, Q&gt; glm::floatBitsToInt </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, float, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a signed integer value representing the encoding of a floating-point value. </p>\n<p>The floatingpoint value's bit-level representation is preserved.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml\">GLSL floatBitsToInt man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga70e0271c34af52f3100c7960e18c3f2b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::floatBitsToUint </td>\n          <td>(</td>\n          <td class=\"paramtype\">float const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a unsigned integer value representing the encoding of a floating-point value. </p>\n<p>The floatingpoint value's bit-level representation is preserved.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml\">GLSL floatBitsToUint man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga49418ba4c8a60fbbb5d57b705f3e26db\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, uint, Q&gt; glm::floatBitsToUint </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, float, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a unsigned integer value representing the encoding of a floating-point value. </p>\n<p>The floatingpoint value's bit-level representation is preserved.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml\">GLSL floatBitsToUint man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa9d0742639e85b29c7c5de11cfd6840d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::floor </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer that is less then or equal to x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml\">GLSL floor man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad0f444d4b81cc53c3b6edf5aa25078c2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fma </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Computes and returns a * b + c. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml\">GLSL fma man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8ba89e40e55ae5cdf228548f9b7639c7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fract </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return x - floor(x). </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml\">GLSL fract man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2df623004f634b440d61e018d62c751b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fract </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return x - floor(x). </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml\">GLSL fract man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga20620e83544d1a988857a3bc4ebe0e1d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::frexp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genIType &amp;&#160;</td>\n          <td class=\"paramname\"><em>exp</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>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) </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml\">GLSL frexp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::intBitsToFloat </td>\n          <td>(</td>\n          <td class=\"paramtype\">int const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point value corresponding to a signed integer encoding of a floating-point value. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml\">GLSL intBitsToFloat man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, float, Q&gt; glm::intBitsToFloat </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, int, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point value corresponding to a signed integer encoding of a floating-point value. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml\">GLSL intBitsToFloat man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2885587c23a106301f20443896365b62\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::isinf </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if x holds a positive infinity or negative infinity representation in the underlying implementation's set of floating point representations. </p>\n<p>Returns false otherwise, including for implementations with no infinity representations.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml\">GLSL isinf man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga29ef934c00306490de837b4746b4e14d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::isnan </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if x holds a NaN (not a number) representation in the underlying implementation's set of floating point representations. </p>\n<p>Returns false otherwise, including for implementations with no NaN representations.</p>\n<p>/!\\ When using compiler fast math, this function may fail.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml\">GLSL isnan man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga52e319d7289b849ec92055abd4830533\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::ldexp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genIType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>exp</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a floating-point number from x and the corresponding integral exponent of two in exp, returning: significand * exp(2, exponent) </p>\n<p>If this product is too large to be represented in the floating-point type, the result is undefined.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml\">GLSL ldexp man page</a>; </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga98caa7f95a94c86a86ebce893a45326c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if x &lt; y; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer; scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae8b0964d30deabd0867b8d7ac44f067e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if x &lt; y; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad48b723358c68d45477c22ff0101985e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if x &lt; y; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2c2bde1cec025b7ddff83c74a1113719\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if y &lt; x; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer; scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2d274e8b537c173dba983331a2620736\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if y &lt; x; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga734a374ca5c808e7bd9f74b6acfd7478\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if y &lt; x; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8e93f374aae27d1a88b921860351f8d4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genTypeT glm::mix </td>\n          <td>(</td>\n          <td class=\"paramtype\">genTypeT&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genTypeT&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genTypeU&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>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. </p>\n<p>The value for a is not restricted to the range [0, 1].</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mix.xml\">GLSL mix man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a></dd></dl>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramdir\">[in]</td><td class=\"paramname\">x</td><td>Value to interpolate. </td></tr>\n    <tr><td class=\"paramdir\">[in]</td><td class=\"paramname\">y</td><td>Value to interpolate. </td></tr>\n    <tr><td class=\"paramdir\">[in]</td><td class=\"paramname\">a</td><td>Interpolant.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genTypeT</td><td>Floating point scalar or vector. </td></tr>\n    <tr><td class=\"paramname\">genTypeU</td><td>Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT.</td></tr>\n  </table>\n  </dd>\n</dl>\n<div class=\"fragment\"><div class=\"line\"><span class=\"preprocessor\">#include &lt;<a class=\"code\" href=\"a00035.html\">glm/glm.hpp</a>&gt;</span></div>\n<div class=\"line\">...</div>\n<div class=\"line\">float a;</div>\n<div class=\"line\"><span class=\"keywordtype\">bool</span> b;</div>\n<div class=\"line\"><a class=\"code\" href=\"a00143.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">glm::dvec3</a> <a class=\"code\" href=\"a00150.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>;</div>\n<div class=\"line\"><a class=\"code\" href=\"a00143.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">glm::dvec3</a> f;</div>\n<div class=\"line\"><a class=\"code\" href=\"a00143.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a> g;</div>\n<div class=\"line\"><a class=\"code\" href=\"a00143.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a> h;</div>\n<div class=\"line\">...</div>\n<div class=\"line\">glm::vec4 r = <a class=\"code\" href=\"a00139.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a>(g, h, a); <span class=\"comment\">// Interpolate with a floating-point scalar two vectors. </span></div>\n<div class=\"line\"><a class=\"code\" href=\"a00143.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a> s = <a class=\"code\" href=\"a00139.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a>(g, h, b); <span class=\"comment\">// Returns g or h;</span></div>\n<div class=\"line\"><a class=\"code\" href=\"a00143.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">glm::dvec3</a> t = <a class=\"code\" href=\"a00139.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a>(<a class=\"code\" href=\"a00150.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>, f, a); <span class=\"comment\">// Types of the third parameter is not required to match with the first and the second.</span></div>\n<div class=\"line\"><a class=\"code\" href=\"a00143.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a> u = <a class=\"code\" href=\"a00139.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a>(g, h, r); <span class=\"comment\">// Interpolations can be perform per component with a vector for the last parameter.</span></div>\n</div><!-- fragment --> \n<p>Referenced by <a class=\"el\" href=\"a00017_source.html#l00041\">glm::lerp()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga12201563ef902e3b07e0d1d7656efdb1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::mod </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x - y * floor(x / y) for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad32bcde4977c7a42c80468f4061a1f55\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; mod </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x - y * floor(x / y) for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a></dd></dl>\n<p>Returns x % y for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00152.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5f8acc481ba553dc0e6be1aedf1ee61c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; mod </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x - y * floor(x / y) for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a></dd></dl>\n<p>Returns x % y for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00152.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga85e33f139b8db1b39b590a5713b9e679\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::modf </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>i</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the fractional part of x and sets i to the integer part (as a whole number floating point value). </p>\n<p>Both the return value and the output parameter will have the same sign as x.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml\">GLSL modf man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafa03aca8c4713e1cc892aa92ca135a7e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::round </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer to x. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml\">GLSL round man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga76b81785045a057989a84d99aeeb1578\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::roundEven </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer to x. </p>\n<p>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.)</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml\">GLSL roundEven man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd>\n<dd>\n<a href=\"http://developer.amd.com/documentation/articles/pages/New-Round-to-Even-Technique.aspx\">New round to even technique</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1e2e5cfff800056540e32f6c9b604b28\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::sign </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 1.0 if x &gt; 0, 0.0 if x == 0, or -1.0 if x &lt; 0. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml\">GLSL sign man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga562edf7eca082cc5b7a0aaf180436daf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::smoothstep </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>edge0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>edge1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 0.0 if x &lt;= edge0 and 1.0 if x &gt;= edge1 and performs smooth Hermite interpolation between 0 and 1 when edge0 &lt; x &lt; edge1. </p>\n<p>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 &gt;= edge1.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml\">GLSL smoothstep man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga015a1261ff23e12650211aa872863cce\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::step </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>edge</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 0.0 if x &lt; edge, otherwise it returns 1.0 for each component of a genType. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8f9a911a48ef244b51654eaefc81c551\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::step </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>edge</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 0.0 if x &lt; edge, otherwise it returns 1.0. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf4a5fc81619c7d3e8b22f53d4a098c7f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::step </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>edge</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 0.0 if x &lt; edge, otherwise it returns 1.0. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf9375e3e06173271d49e6ffa3a334259\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::trunc </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer to x whose absolute value is not larger than the absolute value of x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml\">GLSL trunc man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab2bae0d15dcdca6093f88f76b3975d97\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::uintBitsToFloat </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml\">GLSL uintBitsToFloat man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga97f46b5f7b42fe44482e13356eb394ae\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, float, Q&gt; glm::uintBitsToFloat </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00144.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml\">GLSL uintBitsToFloat man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00140.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Common functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Common functions<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00015.html\" title=\"Core features \">glm/common.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga693d77696ff36572a0da79efec965acd\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga693d77696ff36572a0da79efec965acd\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga693d77696ff36572a0da79efec965acd\">abs</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga693d77696ff36572a0da79efec965acd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x if x &gt;= 0; otherwise, it returns -x.  <a href=\"a00140.html#ga693d77696ff36572a0da79efec965acd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga693d77696ff36572a0da79efec965acd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga3e141c9738c73d3e581efa471dba8b4c\">abs</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x if x &gt;= 0; otherwise, it returns -x.  <a href=\"a00140.html#ga3e141c9738c73d3e581efa471dba8b4c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e141c9738c73d3e581efa471dba8b4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gafb9d2a645a23aca12d4d6de0104b7657\">ceil</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer that is greater than or equal to x.  <a href=\"a00140.html#gafb9d2a645a23aca12d4d6de0104b7657\">More...</a><br /></td></tr>\n<tr class=\"separator:gafb9d2a645a23aca12d4d6de0104b7657\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">clamp</a> (genType x, genType minVal, genType maxVal)</td></tr>\n<tr class=\"memdesc:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga93bce26c7d80d30a62f5c508f8498a6c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gabff13e6547edac08f52b4133ff4bf183\">clamp</a> (vec&lt; L, T, Q &gt; const &amp;x, T minVal, T maxVal)</td></tr>\n<tr class=\"memdesc:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00140.html#gabff13e6547edac08f52b4133ff4bf183\">More...</a><br /></td></tr>\n<tr class=\"separator:gabff13e6547edac08f52b4133ff4bf183\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga748333282a6f2f87762c0a4739c8c364\">clamp</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;minVal, vec&lt; L, T, Q &gt; const &amp;maxVal)</td></tr>\n<tr class=\"memdesc:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal.  <a href=\"a00140.html#ga748333282a6f2f87762c0a4739c8c364\">More...</a><br /></td></tr>\n<tr class=\"separator:ga748333282a6f2f87762c0a4739c8c364\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga1425c1c3160ec51214b03a0469a3013d\">floatBitsToInt</a> (float const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a signed integer value representing the encoding of a floating-point value.  <a href=\"a00140.html#ga1425c1c3160ec51214b03a0469a3013d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1425c1c3160ec51214b03a0469a3013d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">floatBitsToInt</a> (vec&lt; L, float, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a signed integer value representing the encoding of a floating-point value.  <a href=\"a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99f7d62f78ac5ea3b49bae715c9488ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga70e0271c34af52f3100c7960e18c3f2b\">floatBitsToUint</a> (float const &amp;v)</td></tr>\n<tr class=\"memdesc:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a unsigned integer value representing the encoding of a floating-point value.  <a href=\"a00140.html#ga70e0271c34af52f3100c7960e18c3f2b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga70e0271c34af52f3100c7960e18c3f2b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">floatBitsToUint</a> (vec&lt; L, float, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a unsigned integer value representing the encoding of a floating-point value.  <a href=\"a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49418ba4c8a60fbbb5d57b705f3e26db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d\">floor</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer that is less then or equal to x.  <a href=\"a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9d0742639e85b29c7c5de11cfd6840d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gad0f444d4b81cc53c3b6edf5aa25078c2\">fma</a> (genType const &amp;a, genType const &amp;b, genType const &amp;c)</td></tr>\n<tr class=\"memdesc:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Computes and returns a * b + c.  <a href=\"a00140.html#gad0f444d4b81cc53c3b6edf5aa25078c2\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0f444d4b81cc53c3b6edf5aa25078c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga8ba89e40e55ae5cdf228548f9b7639c7\">fract</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return x - floor(x).  <a href=\"a00140.html#ga8ba89e40e55ae5cdf228548f9b7639c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8ba89e40e55ae5cdf228548f9b7639c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2df623004f634b440d61e018d62c751b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2df623004f634b440d61e018d62c751b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga2df623004f634b440d61e018d62c751b\">fract</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga2df623004f634b440d61e018d62c751b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return x - floor(x).  <a href=\"a00140.html#ga2df623004f634b440d61e018d62c751b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2df623004f634b440d61e018d62c751b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType , typename genIType &gt; </td></tr>\n<tr class=\"memitem:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga20620e83544d1a988857a3bc4ebe0e1d\">frexp</a> (genType const &amp;x, genIType &amp;exp)</td></tr>\n<tr class=\"memdesc:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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)  <a href=\"a00140.html#ga20620e83544d1a988857a3bc4ebe0e1d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20620e83544d1a988857a3bc4ebe0e1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga4fb7c21c2dce064b26fd9ccdaf9adcd4\">intBitsToFloat</a> (int const &amp;v)</td></tr>\n<tr class=\"memdesc:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a signed integer encoding of a floating-point value.  <a href=\"a00140.html#ga4fb7c21c2dce064b26fd9ccdaf9adcd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, float, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">intBitsToFloat</a> (vec&lt; L, int, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a signed integer encoding of a floating-point value.  <a href=\"a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2885587c23a106301f20443896365b62\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2885587c23a106301f20443896365b62\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga2885587c23a106301f20443896365b62\">isinf</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga2885587c23a106301f20443896365b62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a positive infinity or negative infinity representation in the underlying implementation's set of floating point representations.  <a href=\"a00140.html#ga2885587c23a106301f20443896365b62\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2885587c23a106301f20443896365b62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga29ef934c00306490de837b4746b4e14d\">isnan</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga29ef934c00306490de837b4746b4e14d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a NaN (not a number) representation in the underlying implementation's set of floating point representations.  <a href=\"a00140.html#ga29ef934c00306490de837b4746b4e14d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga29ef934c00306490de837b4746b4e14d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52e319d7289b849ec92055abd4830533\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType , typename genIType &gt; </td></tr>\n<tr class=\"memitem:ga52e319d7289b849ec92055abd4830533\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga52e319d7289b849ec92055abd4830533\">ldexp</a> (genType const &amp;x, genIType const &amp;exp)</td></tr>\n<tr class=\"memdesc:ga52e319d7289b849ec92055abd4830533\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a floating-point number from x and the corresponding integral exponent of two in exp, returning: significand * exp(2, exponent)  <a href=\"a00140.html#ga52e319d7289b849ec92055abd4830533\">More...</a><br /></td></tr>\n<tr class=\"separator:ga52e319d7289b849ec92055abd4830533\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga98caa7f95a94c86a86ebce893a45326c\">max</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00140.html#ga98caa7f95a94c86a86ebce893a45326c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga98caa7f95a94c86a86ebce893a45326c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gae8b0964d30deabd0867b8d7ac44f067e\">max</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00140.html#gae8b0964d30deabd0867b8d7ac44f067e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae8b0964d30deabd0867b8d7ac44f067e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad48b723358c68d45477c22ff0101985e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad48b723358c68d45477c22ff0101985e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gad48b723358c68d45477c22ff0101985e\">max</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gad48b723358c68d45477c22ff0101985e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if x &lt; y; otherwise, it returns x.  <a href=\"a00140.html#gad48b723358c68d45477c22ff0101985e\">More...</a><br /></td></tr>\n<tr class=\"separator:gad48b723358c68d45477c22ff0101985e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga2c2bde1cec025b7ddff83c74a1113719\">min</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00140.html#ga2c2bde1cec025b7ddff83c74a1113719\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c2bde1cec025b7ddff83c74a1113719\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2d274e8b537c173dba983331a2620736\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2d274e8b537c173dba983331a2620736\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga2d274e8b537c173dba983331a2620736\">min</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:ga2d274e8b537c173dba983331a2620736\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00140.html#ga2d274e8b537c173dba983331a2620736\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2d274e8b537c173dba983331a2620736\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478\">min</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns y if y &lt; x; otherwise, it returns x.  <a href=\"a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478\">More...</a><br /></td></tr>\n<tr class=\"separator:ga734a374ca5c808e7bd9f74b6acfd7478\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genTypeT , typename genTypeU &gt; </td></tr>\n<tr class=\"memitem:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genTypeT&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">mix</a> (genTypeT x, genTypeT y, genTypeU a)</td></tr>\n<tr class=\"memdesc:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e93f374aae27d1a88b921860351f8d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga12201563ef902e3b07e0d1d7656efdb1\">mod</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00140.html#ga12201563ef902e3b07e0d1d7656efdb1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12201563ef902e3b07e0d1d7656efdb1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gad32bcde4977c7a42c80468f4061a1f55\">mod</a> (vec&lt; L, T, Q &gt; const &amp;x, T y)</td></tr>\n<tr class=\"memdesc:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00140.html#gad32bcde4977c7a42c80468f4061a1f55\">More...</a><br /></td></tr>\n<tr class=\"separator:gad32bcde4977c7a42c80468f4061a1f55\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">mod</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f8acc481ba553dc0e6be1aedf1ee61c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga85e33f139b8db1b39b590a5713b9e679\">modf</a> (genType x, genType &amp;i)</td></tr>\n<tr class=\"memdesc:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the fractional part of x and sets i to the integer part (as a whole number floating point value).  <a href=\"a00140.html#ga85e33f139b8db1b39b590a5713b9e679\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85e33f139b8db1b39b590a5713b9e679\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gafa03aca8c4713e1cc892aa92ca135a7e\">round</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00140.html#gafa03aca8c4713e1cc892aa92ca135a7e\">More...</a><br /></td></tr>\n<tr class=\"separator:gafa03aca8c4713e1cc892aa92ca135a7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga76b81785045a057989a84d99aeeb1578\">roundEven</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga76b81785045a057989a84d99aeeb1578\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00140.html#ga76b81785045a057989a84d99aeeb1578\">More...</a><br /></td></tr>\n<tr class=\"separator:ga76b81785045a057989a84d99aeeb1578\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga1e2e5cfff800056540e32f6c9b604b28\">sign</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 1.0 if x &gt; 0, 0.0 if x == 0, or -1.0 if x &lt; 0.  <a href=\"a00140.html#ga1e2e5cfff800056540e32f6c9b604b28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e2e5cfff800056540e32f6c9b604b28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga562edf7eca082cc5b7a0aaf180436daf\">smoothstep</a> (genType edge0, genType edge1, genType x)</td></tr>\n<tr class=\"memdesc:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt;= edge0 and 1.0 if x &gt;= edge1 and performs smooth Hermite interpolation between 0 and 1 when edge0 &lt; x &lt; edge1.  <a href=\"a00140.html#ga562edf7eca082cc5b7a0aaf180436daf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga562edf7eca082cc5b7a0aaf180436daf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga015a1261ff23e12650211aa872863cce\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga015a1261ff23e12650211aa872863cce\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga015a1261ff23e12650211aa872863cce\">step</a> (genType edge, genType x)</td></tr>\n<tr class=\"memdesc:ga015a1261ff23e12650211aa872863cce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0 for each component of a genType.  <a href=\"a00140.html#ga015a1261ff23e12650211aa872863cce\">More...</a><br /></td></tr>\n<tr class=\"separator:ga015a1261ff23e12650211aa872863cce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga8f9a911a48ef244b51654eaefc81c551\">step</a> (T edge, vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0.  <a href=\"a00140.html#ga8f9a911a48ef244b51654eaefc81c551\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f9a911a48ef244b51654eaefc81c551\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">step</a> (vec&lt; L, T, Q &gt; const &amp;edge, vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 0.0 if x &lt; edge, otherwise it returns 1.0.  <a href=\"a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4a5fc81619c7d3e8b22f53d4a098c7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gaf9375e3e06173271d49e6ffa3a334259\">trunc</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x whose absolute value is not larger than the absolute value of x.  <a href=\"a00140.html#gaf9375e3e06173271d49e6ffa3a334259\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf9375e3e06173271d49e6ffa3a334259\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#gab2bae0d15dcdca6093f88f76b3975d97\">uintBitsToFloat</a> (uint const &amp;v)</td></tr>\n<tr class=\"memdesc:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value.  <a href=\"a00140.html#gab2bae0d15dcdca6093f88f76b3975d97\">More...</a><br /></td></tr>\n<tr class=\"separator:gab2bae0d15dcdca6093f88f76b3975d97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, float, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html#ga97f46b5f7b42fe44482e13356eb394ae\">uintBitsToFloat</a> (vec&lt; L, uint, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value.  <a href=\"a00140.html#ga97f46b5f7b42fe44482e13356eb394ae\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97f46b5f7b42fe44482e13356eb394ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00015.html\" title=\"Core features \">glm/common.hpp</a>&gt; to use these core features. </p>\n<p>These all operate component-wise. The description is per component. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga693d77696ff36572a0da79efec965acd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::abs </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x if x &gt;= 0; otherwise, it returns -x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>floating-point or signed integer; scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml\">GLSL abs man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd>\n<dd>\nqualifier </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3e141c9738c73d3e581efa471dba8b4c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::abs </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x if x &gt;= 0; otherwise, it returns -x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or signed integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml\">GLSL abs man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafb9d2a645a23aca12d4d6de0104b7657\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::ceil </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer that is greater than or equal to x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml\">GLSL ceil man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga93bce26c7d80d30a62f5c508f8498a6c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::clamp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>minVal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>maxVal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer; scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n<p>Referenced by <a class=\"el\" href=\"a00017_source.html#l00050\">glm::saturate()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabff13e6547edac08f52b4133ff4bf183\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::clamp </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>minVal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>maxVal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga748333282a6f2f87762c0a4739c8c364\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::clamp </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>minVal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>maxVal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns min(max(x, minVal), maxVal) for each component in x using the floating-point values minVal and maxVal. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1425c1c3160ec51214b03a0469a3013d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::floatBitsToInt </td>\n          <td>(</td>\n          <td class=\"paramtype\">float const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a signed integer value representing the encoding of a floating-point value. </p>\n<p>The floating-point value's bit-level representation is preserved.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml\">GLSL floatBitsToInt man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga99f7d62f78ac5ea3b49bae715c9488ed\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, int, Q&gt; glm::floatBitsToInt </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, float, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a signed integer value representing the encoding of a floating-point value. </p>\n<p>The floatingpoint value's bit-level representation is preserved.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml\">GLSL floatBitsToInt man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga70e0271c34af52f3100c7960e18c3f2b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::floatBitsToUint </td>\n          <td>(</td>\n          <td class=\"paramtype\">float const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a unsigned integer value representing the encoding of a floating-point value. </p>\n<p>The floatingpoint value's bit-level representation is preserved.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml\">GLSL floatBitsToUint man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga49418ba4c8a60fbbb5d57b705f3e26db\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, uint, Q&gt; glm::floatBitsToUint </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, float, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a unsigned integer value representing the encoding of a floating-point value. </p>\n<p>The floatingpoint value's bit-level representation is preserved.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml\">GLSL floatBitsToUint man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa9d0742639e85b29c7c5de11cfd6840d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::floor </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer that is less then or equal to x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml\">GLSL floor man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad0f444d4b81cc53c3b6edf5aa25078c2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fma </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Computes and returns a * b + c. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml\">GLSL fma man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8ba89e40e55ae5cdf228548f9b7639c7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fract </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return x - floor(x). </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml\">GLSL fract man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2df623004f634b440d61e018d62c751b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fract </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return x - floor(x). </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml\">GLSL fract man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga20620e83544d1a988857a3bc4ebe0e1d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::frexp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genIType &amp;&#160;</td>\n          <td class=\"paramname\"><em>exp</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>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) </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml\">GLSL frexp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4fb7c21c2dce064b26fd9ccdaf9adcd4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::intBitsToFloat </td>\n          <td>(</td>\n          <td class=\"paramtype\">int const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point value corresponding to a signed integer encoding of a floating-point value. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml\">GLSL intBitsToFloat man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7a0a8291a1cf3e1c2aee33030a1bd7b0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, float, Q&gt; glm::intBitsToFloat </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, int, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point value corresponding to a signed integer encoding of a floating-point value. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml\">GLSL intBitsToFloat man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2885587c23a106301f20443896365b62\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::isinf </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if x holds a positive infinity or negative infinity representation in the underlying implementation's set of floating point representations. </p>\n<p>Returns false otherwise, including for implementations with no infinity representations.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml\">GLSL isinf man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga29ef934c00306490de837b4746b4e14d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::isnan </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if x holds a NaN (not a number) representation in the underlying implementation's set of floating point representations. </p>\n<p>Returns false otherwise, including for implementations with no NaN representations.</p>\n<p>/!\\ When using compiler fast math, this function may fail.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml\">GLSL isnan man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga52e319d7289b849ec92055abd4830533\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::ldexp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genIType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>exp</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a floating-point number from x and the corresponding integral exponent of two in exp, returning: significand * exp(2, exponent) </p>\n<p>If this product is too large to be represented in the floating-point type, the result is undefined.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml\">GLSL ldexp man page</a>; </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga98caa7f95a94c86a86ebce893a45326c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if x &lt; y; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer; scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae8b0964d30deabd0867b8d7ac44f067e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if x &lt; y; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad48b723358c68d45477c22ff0101985e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if x &lt; y; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2c2bde1cec025b7ddff83c74a1113719\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if y &lt; x; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer; scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2d274e8b537c173dba983331a2620736\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if y &lt; x; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga734a374ca5c808e7bd9f74b6acfd7478\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns y if y &lt; x; otherwise, it returns x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8e93f374aae27d1a88b921860351f8d4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genTypeT glm::mix </td>\n          <td>(</td>\n          <td class=\"paramtype\">genTypeT&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genTypeT&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genTypeU&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>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. </p>\n<p>The value for a is not restricted to the range [0, 1].</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mix.xml\">GLSL mix man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a></dd></dl>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramdir\">[in]</td><td class=\"paramname\">x</td><td>Value to interpolate. </td></tr>\n    <tr><td class=\"paramdir\">[in]</td><td class=\"paramname\">y</td><td>Value to interpolate. </td></tr>\n    <tr><td class=\"paramdir\">[in]</td><td class=\"paramname\">a</td><td>Interpolant.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genTypeT</td><td>Floating point scalar or vector. </td></tr>\n    <tr><td class=\"paramname\">genTypeU</td><td>Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT.</td></tr>\n  </table>\n  </dd>\n</dl>\n<div class=\"fragment\"><div class=\"line\"><span class=\"preprocessor\">#include &lt;<a class=\"code\" href=\"a00035.html\">glm/glm.hpp</a>&gt;</span></div>\n<div class=\"line\">...</div>\n<div class=\"line\">float a;</div>\n<div class=\"line\"><span class=\"keywordtype\">bool</span> b;</div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">glm::dvec3</a> <a class=\"code\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>;</div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">glm::dvec3</a> f;</div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a> g;</div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a> h;</div>\n<div class=\"line\">...</div>\n<div class=\"line\">glm::vec4 r = <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a>(g, h, a); <span class=\"comment\">// Interpolate with a floating-point scalar two vectors. </span></div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a> s = <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a>(g, h, b); <span class=\"comment\">// Returns g or h;</span></div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">glm::dvec3</a> t = <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a>(<a class=\"code\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a>, f, a); <span class=\"comment\">// Types of the third parameter is not required to match with the first and the second.</span></div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">glm::vec4</a> u = <a class=\"code\" href=\"a00140.html#ga8e93f374aae27d1a88b921860351f8d4\">glm::mix</a>(g, h, r); <span class=\"comment\">// Interpolations can be perform per component with a vector for the last parameter.</span></div>\n</div><!-- fragment --> \n<p>Referenced by <a class=\"el\" href=\"a00017_source.html#l00041\">glm::lerp()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga12201563ef902e3b07e0d1d7656efdb1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::mod </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x - y * floor(x / y) for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad32bcde4977c7a42c80468f4061a1f55\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; mod </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x - y * floor(x / y) for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a></dd></dl>\n<p>Returns x % y for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00153.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5f8acc481ba553dc0e6be1aedf1ee61c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt; L, T, Q &gt; mod </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x - y * floor(x / y) for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a></dd></dl>\n<p>Returns x % y for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00153.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga85e33f139b8db1b39b590a5713b9e679\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::modf </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>i</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the fractional part of x and sets i to the integer part (as a whole number floating point value). </p>\n<p>Both the return value and the output parameter will have the same sign as x.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml\">GLSL modf man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafa03aca8c4713e1cc892aa92ca135a7e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::round </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer to x. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml\">GLSL round man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga76b81785045a057989a84d99aeeb1578\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::roundEven </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer to x. </p>\n<p>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.)</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml\">GLSL roundEven man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd>\n<dd>\n<a href=\"http://developer.amd.com/documentation/articles/pages/New-Round-to-Even-Technique.aspx\">New round to even technique</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1e2e5cfff800056540e32f6c9b604b28\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::sign </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 1.0 if x &gt; 0, 0.0 if x == 0, or -1.0 if x &lt; 0. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml\">GLSL sign man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga562edf7eca082cc5b7a0aaf180436daf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::smoothstep </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>edge0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>edge1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 0.0 if x &lt;= edge0 and 1.0 if x &gt;= edge1 and performs smooth Hermite interpolation between 0 and 1 when edge0 &lt; x &lt; edge1. </p>\n<p>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 &gt;= edge1.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml\">GLSL smoothstep man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga015a1261ff23e12650211aa872863cce\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::step </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>edge</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 0.0 if x &lt; edge, otherwise it returns 1.0 for each component of a genType. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8f9a911a48ef244b51654eaefc81c551\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::step </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>edge</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 0.0 if x &lt; edge, otherwise it returns 1.0. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf4a5fc81619c7d3e8b22f53d4a098c7f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::step </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>edge</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 0.0 if x &lt; edge, otherwise it returns 1.0. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf9375e3e06173271d49e6ffa3a334259\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::trunc </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer to x whose absolute value is not larger than the absolute value of x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml\">GLSL trunc man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab2bae0d15dcdca6093f88f76b3975d97\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::uintBitsToFloat </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml\">GLSL uintBitsToFloat man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga97f46b5f7b42fe44482e13356eb394ae\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, float, Q&gt; glm::uintBitsToFloat </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point value corresponding to a unsigned integer encoding of a floating-point value. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml\">GLSL uintBitsToFloat man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00141.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Exponential functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Exponential functions<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00024.html\" title=\"Core features \">glm/exponential.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga071566cadc7505455e611f2a0353f4d4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga071566cadc7505455e611f2a0353f4d4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">exp</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga071566cadc7505455e611f2a0353f4d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the natural exponentiation of x, i.e., e^x.  <a href=\"a00141.html#ga071566cadc7505455e611f2a0353f4d4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga071566cadc7505455e611f2a0353f4d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaff17ace6b579a03bf223ed4d1ed2cd16\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaff17ace6b579a03bf223ed4d1ed2cd16\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#gaff17ace6b579a03bf223ed4d1ed2cd16\">exp2</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaff17ace6b579a03bf223ed4d1ed2cd16\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 2 raised to the v power.  <a href=\"a00141.html#gaff17ace6b579a03bf223ed4d1ed2cd16\">More...</a><br /></td></tr>\n<tr class=\"separator:gaff17ace6b579a03bf223ed4d1ed2cd16\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga523dd6bd0ad9f75ae2d24c8e4b017b7a\">inversesqrt</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the reciprocal of the positive square root of v.  <a href=\"a00141.html#ga523dd6bd0ad9f75ae2d24c8e4b017b7a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga918c9f3fd086ce20e6760c903bd30fa9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga918c9f3fd086ce20e6760c903bd30fa9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga918c9f3fd086ce20e6760c903bd30fa9\">log</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga918c9f3fd086ce20e6760c903bd30fa9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the natural logarithm of v, i.e., returns the value y which satisfies the equation x = e^y.  <a href=\"a00141.html#ga918c9f3fd086ce20e6760c903bd30fa9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga918c9f3fd086ce20e6760c903bd30fa9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga82831c7d9cca777cebedfe03a19c8d75\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga82831c7d9cca777cebedfe03a19c8d75\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga82831c7d9cca777cebedfe03a19c8d75\">log2</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga82831c7d9cca777cebedfe03a19c8d75\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the base 2 log of x, i.e., returns the value y, which satisfies the equation x = 2 ^ y.  <a href=\"a00141.html#ga82831c7d9cca777cebedfe03a19c8d75\">More...</a><br /></td></tr>\n<tr class=\"separator:ga82831c7d9cca777cebedfe03a19c8d75\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2254981952d4f333b900a6bf5167a6c4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2254981952d4f333b900a6bf5167a6c4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#ga2254981952d4f333b900a6bf5167a6c4\">pow</a> (vec&lt; L, T, Q &gt; const &amp;base, vec&lt; L, T, Q &gt; const &amp;exponent)</td></tr>\n<tr class=\"memdesc:ga2254981952d4f333b900a6bf5167a6c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns 'base' raised to the power 'exponent'.  <a href=\"a00141.html#ga2254981952d4f333b900a6bf5167a6c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2254981952d4f333b900a6bf5167a6c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa83e5f1648b7ccdf33b87c07c76cb77c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa83e5f1648b7ccdf33b87c07c76cb77c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html#gaa83e5f1648b7ccdf33b87c07c76cb77c\">sqrt</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa83e5f1648b7ccdf33b87c07c76cb77c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the positive square root of v.  <a href=\"a00141.html#gaa83e5f1648b7ccdf33b87c07c76cb77c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa83e5f1648b7ccdf33b87c07c76cb77c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00024.html\" title=\"Core features \">glm/exponential.hpp</a>&gt; to use these core features. </p>\n<p>These all operate component-wise. The description is per component. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga071566cadc7505455e611f2a0353f4d4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::exp </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the natural exponentiation of x, i.e., e^x. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">v</td><td>exp function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/exp.xml\">GLSL exp man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaff17ace6b579a03bf223ed4d1ed2cd16\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::exp2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 2 raised to the v power. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">v</td><td>exp2 function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/exp2.xml\">GLSL exp2 man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga523dd6bd0ad9f75ae2d24c8e4b017b7a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::inversesqrt </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the reciprocal of the positive square root of v. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">v</td><td>inversesqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/inversesqrt.xml\">GLSL inversesqrt man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga918c9f3fd086ce20e6760c903bd30fa9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::log </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the natural logarithm of v, i.e., returns the value y which satisfies the equation x = e^y. </p>\n<p>Results are undefined if v &lt;= 0.</p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">v</td><td>log function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/log.xml\">GLSL log man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga82831c7d9cca777cebedfe03a19c8d75\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::log2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the base 2 log of x, i.e., returns the value y, which satisfies the equation x = 2 ^ y. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">v</td><td>log2 function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/log2.xml\">GLSL log2 man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2254981952d4f333b900a6bf5167a6c4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::pow </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>base</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>exponent</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns 'base' raised to the power 'exponent'. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">base</td><td>Floating point value. pow function is defined for input values of 'base' defined in the range (inf-, inf+) in the limit of the type qualifier. </td></tr>\n    <tr><td class=\"paramname\">exponent</td><td>Floating point value representing the 'exponent'.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/pow.xml\">GLSL pow man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa83e5f1648b7ccdf33b87c07c76cb77c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::sqrt </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the positive square root of v. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">v</td><td>sqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sqrt.xml\">GLSL sqrt man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00142.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Geometric functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Geometric functions<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00034.html\" title=\"Core features \">glm/geometric.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaeeec0794212fe84fc9d261de067c9587\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaeeec0794212fe84fc9d261de067c9587\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#gaeeec0794212fe84fc9d261de067c9587\">cross</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gaeeec0794212fe84fc9d261de067c9587\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the cross product of x and y.  <a href=\"a00142.html#gaeeec0794212fe84fc9d261de067c9587\">More...</a><br /></td></tr>\n<tr class=\"separator:gaeeec0794212fe84fc9d261de067c9587\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa68de6c53e20dfb2dac2d20197562e3f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa68de6c53e20dfb2dac2d20197562e3f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f\">distance</a> (vec&lt; L, T, Q &gt; const &amp;p0, vec&lt; L, T, Q &gt; const &amp;p1)</td></tr>\n<tr class=\"memdesc:gaa68de6c53e20dfb2dac2d20197562e3f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).  <a href=\"a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa68de6c53e20dfb2dac2d20197562e3f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#gaad6c5d9d39bdc0bf43baf1b22e147a0a\">dot</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the dot product of x and y, i.e., result = x * y.  <a href=\"a00142.html#gaad6c5d9d39bdc0bf43baf1b22e147a0a\">More...</a><br /></td></tr>\n<tr class=\"separator:gaad6c5d9d39bdc0bf43baf1b22e147a0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7aed0a36c738169402404a3a5d54e43b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7aed0a36c738169402404a3a5d54e43b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga7aed0a36c738169402404a3a5d54e43b\">faceforward</a> (vec&lt; L, T, Q &gt; const &amp;N, vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;Nref)</td></tr>\n<tr class=\"memdesc:ga7aed0a36c738169402404a3a5d54e43b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">If dot(Nref, I) &lt; 0.0, return N, otherwise, return -N.  <a href=\"a00142.html#ga7aed0a36c738169402404a3a5d54e43b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7aed0a36c738169402404a3a5d54e43b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0cdabbb000834d994a1d6dc56f8f5263\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0cdabbb000834d994a1d6dc56f8f5263\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">length</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga0cdabbb000834d994a1d6dc56f8f5263\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the length of x, i.e., sqrt(x * x).  <a href=\"a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0cdabbb000834d994a1d6dc56f8f5263\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b8d3dcae77870781392ed2902cce597\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3b8d3dcae77870781392ed2902cce597\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga3b8d3dcae77870781392ed2902cce597\">normalize</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3b8d3dcae77870781392ed2902cce597\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a vector in the same direction as x but with length of 1.  <a href=\"a00142.html#ga3b8d3dcae77870781392ed2902cce597\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b8d3dcae77870781392ed2902cce597\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5631dd1d5618de5450b1ea3cf3e94905\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5631dd1d5618de5450b1ea3cf3e94905\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga5631dd1d5618de5450b1ea3cf3e94905\">reflect</a> (vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;N)</td></tr>\n<tr class=\"memdesc:ga5631dd1d5618de5450b1ea3cf3e94905\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">For the incident vector I and surface orientation N, returns the reflection direction : result = I - 2.0 * dot(N, I) * N.  <a href=\"a00142.html#ga5631dd1d5618de5450b1ea3cf3e94905\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5631dd1d5618de5450b1ea3cf3e94905\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga01da3dff9e2ef6b9d4915c3047e22b74\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga01da3dff9e2ef6b9d4915c3047e22b74\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html#ga01da3dff9e2ef6b9d4915c3047e22b74\">refract</a> (vec&lt; L, T, Q &gt; const &amp;I, vec&lt; L, T, Q &gt; const &amp;N, T eta)</td></tr>\n<tr class=\"memdesc:ga01da3dff9e2ef6b9d4915c3047e22b74\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">For the incident vector I and surface normal N, and the ratio of indices of refraction eta, return the refraction vector.  <a href=\"a00142.html#ga01da3dff9e2ef6b9d4915c3047e22b74\">More...</a><br /></td></tr>\n<tr class=\"separator:ga01da3dff9e2ef6b9d4915c3047e22b74\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00034.html\" title=\"Core features \">glm/geometric.hpp</a>&gt; to use these core features. </p>\n<p>These operate on vectors as vectors, not component-wise. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaeeec0794212fe84fc9d261de067c9587\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::cross </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the cross product of x and y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cross.xml\">GLSL cross man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa68de6c53e20dfb2dac2d20197562e3f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::distance </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p1</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/distance.xml\">GLSL distance man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaad6c5d9d39bdc0bf43baf1b22e147a0a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::dot </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the dot product of x and y, i.e., result = x * y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml\">GLSL dot man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7aed0a36c738169402404a3a5d54e43b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::faceforward </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>N</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>I</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Nref</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>If dot(Nref, I) &lt; 0.0, return N, otherwise, return -N. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/faceforward.xml\">GLSL faceforward man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0cdabbb000834d994a1d6dc56f8f5263\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::length </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the length of x, i.e., sqrt(x * x). </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/length.xml\">GLSL length man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3b8d3dcae77870781392ed2902cce597\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::normalize </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a vector in the same direction as x but with length of 1. </p>\n<p>According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefined and generate an error.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/normalize.xml\">GLSL normalize man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5631dd1d5618de5450b1ea3cf3e94905\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::reflect </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>I</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>N</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>For the incident vector I and surface orientation N, returns the reflection direction : result = I - 2.0 * dot(N, I) * N. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/reflect.xml\">GLSL reflect man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga01da3dff9e2ef6b9d4915c3047e22b74\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::refract </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>I</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>N</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>eta</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>For the incident vector I and surface normal N, and the ratio of indices of refraction eta, return the refraction vector. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml\">GLSL refract man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00143.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Core features</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#groups\">Modules</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Core features</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Features that implement in C++ the GLSL specification as closely as possible.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"groups\"></a>\nModules</h2></td></tr>\n<tr class=\"memitem:a00140\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00140.html\">Common functions</a></td></tr>\n<tr class=\"memdesc:a00140\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00015.html\" title=\"Core features \">glm/common.hpp</a>&gt; to use these core features. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00141\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00141.html\">Exponential functions</a></td></tr>\n<tr class=\"memdesc:a00141\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00024.html\" title=\"Core features \">glm/exponential.hpp</a>&gt; to use these core features. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00142\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00142.html\">Geometric functions</a></td></tr>\n<tr class=\"memdesc:a00142\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00034.html\" title=\"Core features \">glm/geometric.hpp</a>&gt; to use these core features. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00144\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html\">Types</a></td></tr>\n<tr class=\"memdesc:a00144\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">The standard types defined by the specification. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00145\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html\">Precision types</a></td></tr>\n<tr class=\"memdesc:a00145\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Non-GLSL types that are used to define qualifier-based types. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00146\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00146.html\">Template types</a></td></tr>\n<tr class=\"memdesc:a00146\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">The generic template types used as the basis for the core types. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00229\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html\">Integer functions</a></td></tr>\n<tr class=\"memdesc:a00229\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00041.html\" title=\"Core features \">glm/integer.hpp</a>&gt; to use these core features. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00230\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html\">Matrix functions</a></td></tr>\n<tr class=\"memdesc:a00230\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00055.html\" title=\"Core features \">glm/matrix.hpp</a>&gt; to use these core features. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00231\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html\">Floating-Point Pack and Unpack Functions</a></td></tr>\n<tr class=\"memdesc:a00231\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00077.html\" title=\"Core features \">glm/packing.hpp</a>&gt; to use these core features. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00232\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html\">Angle and Trigonometry Functions</a></td></tr>\n<tr class=\"memdesc:a00232\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00100.html\" title=\"Core features \">glm/trigonometric.hpp</a>&gt; to use these core features. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00233\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html\">Vector Relational Functions</a></td></tr>\n<tr class=\"memdesc:a00233\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00133_source.html\">glm/vector_relational.hpp</a>&gt; to use these core features. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Features that implement in C++ the GLSL specification as closely as possible. </p>\n<p>The GLM core consists of <a class=\"el\" href=\"a00144.html\">C++ types that mirror GLSL types</a> and C++ functions that mirror the GLSL functions. It also includes <a class=\"el\" href=\"a00145.html\">a set of qualifier-based types</a> that can be used in the appropriate functions. The C++ types are all based on a basic set of <a class=\"el\" href=\"a00146.html\">template types</a>.</p>\n<p>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>.</p>\n<p>GLM core functionalities require &lt;<a class=\"el\" href=\"a00035.html\" title=\"Core features \">glm/glm.hpp</a>&gt; to be included to be used. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00144.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Types</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#groups\">Modules</a> &#124;\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Types<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>The standard types defined by the specification.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"groups\"></a>\nModules</h2></td></tr>\n<tr class=\"memitem:a00145\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html\">Precision types</a></td></tr>\n<tr class=\"memdesc:a00145\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Non-GLSL types that are used to define qualifier-based types. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga0e46aaaccc5e713eac5bfbc8d6885a60\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_bvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60\">bvec2</a></td></tr>\n<tr class=\"memdesc:ga0e46aaaccc5e713eac5bfbc8d6885a60\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of boolean.  <a href=\"a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0e46aaaccc5e713eac5bfbc8d6885a60\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga150731e2a148eff8752114a0e450505e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_bvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">bvec3</a></td></tr>\n<tr class=\"memdesc:ga150731e2a148eff8752114a0e450505e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of boolean.  <a href=\"a00144.html#ga150731e2a148eff8752114a0e450505e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga150731e2a148eff8752114a0e450505e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga444e8f61bfb3a6f037d019ac6933f8c6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_bvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">bvec4</a></td></tr>\n<tr class=\"memdesc:ga444e8f61bfb3a6f037d019ac6933f8c6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of boolean.  <a href=\"a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga444e8f61bfb3a6f037d019ac6933f8c6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7f51e23c8802d867f564dfd146bdb44\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gac7f51e23c8802d867f564dfd146bdb44\">dmat2</a></td></tr>\n<tr class=\"memdesc:gac7f51e23c8802d867f564dfd146bdb44\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 * 2 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gac7f51e23c8802d867f564dfd146bdb44\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7f51e23c8802d867f564dfd146bdb44\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc27b39853a2ecb538c8b3afc20c359e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">dmat2x2</a></td></tr>\n<tr class=\"memdesc:gacc27b39853a2ecb538c8b3afc20c359e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 * 2 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gacc27b39853a2ecb538c8b3afc20c359e\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc27b39853a2ecb538c8b3afc20c359e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1cb3c561a32f0864733dfaf97c71f0c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">dmat2x3</a></td></tr>\n<tr class=\"memdesc:ga1cb3c561a32f0864733dfaf97c71f0c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 * 3 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1cb3c561a32f0864733dfaf97c71f0c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaddd230c88fbd6ec33242329be3a1b738\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">dmat2x4</a></td></tr>\n<tr class=\"memdesc:gaddd230c88fbd6ec33242329be3a1b738\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 * 4 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gaddd230c88fbd6ec33242329be3a1b738\">More...</a><br /></td></tr>\n<tr class=\"separator:gaddd230c88fbd6ec33242329be3a1b738\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae174ff65e148bb7dec4bf10a63cb46ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff\">dmat3</a></td></tr>\n<tr class=\"memdesc:gae174ff65e148bb7dec4bf10a63cb46ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 * 3 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff\">More...</a><br /></td></tr>\n<tr class=\"separator:gae174ff65e148bb7dec4bf10a63cb46ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec22f44dddbdadfe5dfca68eb3457ea8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">dmat3x2</a></td></tr>\n<tr class=\"memdesc:gaec22f44dddbdadfe5dfca68eb3457ea8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 * 2 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec22f44dddbdadfe5dfca68eb3457ea8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac44263f56ff3cbf0a9cc4e2405d5ecb8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">dmat3x3</a></td></tr>\n<tr class=\"memdesc:gac44263f56ff3cbf0a9cc4e2405d5ecb8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 * 3 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8\">More...</a><br /></td></tr>\n<tr class=\"separator:gac44263f56ff3cbf0a9cc4e2405d5ecb8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga38d9bfca882ec542b1928cf77b5c2091\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">dmat3x4</a></td></tr>\n<tr class=\"memdesc:ga38d9bfca882ec542b1928cf77b5c2091\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 * 4 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga38d9bfca882ec542b1928cf77b5c2091\">More...</a><br /></td></tr>\n<tr class=\"separator:ga38d9bfca882ec542b1928cf77b5c2091\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97b38ea24e9ebf58eac04a8d99dc3e27\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27\">dmat4</a></td></tr>\n<tr class=\"memdesc:ga97b38ea24e9ebf58eac04a8d99dc3e27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 * 4 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97b38ea24e9ebf58eac04a8d99dc3e27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6ddab280c735a2139133b4164b99a68a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">dmat4x2</a></td></tr>\n<tr class=\"memdesc:ga6ddab280c735a2139133b4164b99a68a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 * 2 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga6ddab280c735a2139133b4164b99a68a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6ddab280c735a2139133b4164b99a68a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab6c8974496fc7c72dad09219118ba89e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">dmat4x3</a></td></tr>\n<tr class=\"memdesc:gab6c8974496fc7c72dad09219118ba89e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 * 3 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#gab6c8974496fc7c72dad09219118ba89e\">More...</a><br /></td></tr>\n<tr class=\"separator:gab6c8974496fc7c72dad09219118ba89e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41c2da87ca627c1b2da5e895435a508e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">dmat4x4</a></td></tr>\n<tr class=\"memdesc:ga41c2da87ca627c1b2da5e895435a508e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 * 4 matrix of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga41c2da87ca627c1b2da5e895435a508e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41c2da87ca627c1b2da5e895435a508e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga15ade901680b29b78c1f9d1796db6e0e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">dvec2</a></td></tr>\n<tr class=\"memdesc:ga15ade901680b29b78c1f9d1796db6e0e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga15ade901680b29b78c1f9d1796db6e0e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabebd0c7e3c5cd337d95c313c5e8b8db4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">dvec3</a></td></tr>\n<tr class=\"memdesc:gabebd0c7e3c5cd337d95c313c5e8b8db4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of double-qualifier floating-point numbers.  <a href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">More...</a><br /></td></tr>\n<tr class=\"separator:gabebd0c7e3c5cd337d95c313c5e8b8db4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9503f809789bda7e8852a6abde3ae5c1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_dvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">dvec4</a></td></tr>\n<tr class=\"memdesc:ga9503f809789bda7e8852a6abde3ae5c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of double-qualifier floating-point numbers.  <a href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9503f809789bda7e8852a6abde3ae5c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ab812bd103527e2d6c62c2e2f5ee78f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ivec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">ivec2</a></td></tr>\n<tr class=\"memdesc:ga2ab812bd103527e2d6c62c2e2f5ee78f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of signed integer numbers.  <a href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2ab812bd103527e2d6c62c2e2f5ee78f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga34aee73784bcc247d426250540c1911c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ivec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">ivec3</a></td></tr>\n<tr class=\"memdesc:ga34aee73784bcc247d426250540c1911c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of signed integer numbers.  <a href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga34aee73784bcc247d426250540c1911c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaa26c41d168dc00be0fe55f4d0a34224\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ivec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a></td></tr>\n<tr class=\"memdesc:gaaa26c41d168dc00be0fe55f4d0a34224\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of signed integer numbers.  <a href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaa26c41d168dc00be0fe55f4d0a34224\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e30cfba068ebc3c71fe1f8b3110e450\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">mat2</a></td></tr>\n<tr class=\"memdesc:ga6e30cfba068ebc3c71fe1f8b3110e450\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of floating-point numbers.  <a href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e30cfba068ebc3c71fe1f8b3110e450\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c84b211a5730357b63c6d2e4fb696d5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">mat2x2</a></td></tr>\n<tr class=\"memdesc:ga0c84b211a5730357b63c6d2e4fb696d5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of floating-point numbers.  <a href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0c84b211a5730357b63c6d2e4fb696d5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafb063d734266e92915d87f8943560471\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gafb063d734266e92915d87f8943560471\">mat2x3</a></td></tr>\n<tr class=\"memdesc:gafb063d734266e92915d87f8943560471\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of floating-point numbers.  <a href=\"a00144.html#gafb063d734266e92915d87f8943560471\">More...</a><br /></td></tr>\n<tr class=\"separator:gafb063d734266e92915d87f8943560471\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d2ac1a80c36fb5a1d15914035f792ac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">mat2x4</a></td></tr>\n<tr class=\"memdesc:ga4d2ac1a80c36fb5a1d15914035f792ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of floating-point numbers.  <a href=\"a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4d2ac1a80c36fb5a1d15914035f792ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6dd3ec98a548755676267e59142911f8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">mat3</a></td></tr>\n<tr class=\"memdesc:ga6dd3ec98a548755676267e59142911f8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of floating-point numbers.  <a href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6dd3ec98a548755676267e59142911f8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3839ca29d011a80ff3ede7f22ba602a4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">mat3x2</a></td></tr>\n<tr class=\"memdesc:ga3839ca29d011a80ff3ede7f22ba602a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of floating-point numbers.  <a href=\"a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3839ca29d011a80ff3ede7f22ba602a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga378921b6a07bcdad946858b340f69ab1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">mat3x3</a></td></tr>\n<tr class=\"memdesc:ga378921b6a07bcdad946858b340f69ab1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of floating-point numbers.  <a href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga378921b6a07bcdad946858b340f69ab1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7876e0c3e3fcc3e2f4c0462c152e87cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">mat3x4</a></td></tr>\n<tr class=\"memdesc:ga7876e0c3e3fcc3e2f4c0462c152e87cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of floating-point numbers.  <a href=\"a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7876e0c3e3fcc3e2f4c0462c152e87cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade0eb47c01f79384a6f38017ede17446\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">mat4</a></td></tr>\n<tr class=\"memdesc:gade0eb47c01f79384a6f38017ede17446\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of floating-point numbers.  <a href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">More...</a><br /></td></tr>\n<tr class=\"separator:gade0eb47c01f79384a6f38017ede17446\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b3f6a5cbc17362141f9781262ed838f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">mat4x2</a></td></tr>\n<tr class=\"memdesc:ga1b3f6a5cbc17362141f9781262ed838f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of floating-point numbers.  <a href=\"a00144.html#ga1b3f6a5cbc17362141f9781262ed838f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b3f6a5cbc17362141f9781262ed838f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacd9ff3b943b3d8bda4f4b388320420fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">mat4x3</a></td></tr>\n<tr class=\"memdesc:gacd9ff3b943b3d8bda4f4b388320420fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of floating-point numbers.  <a href=\"a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd\">More...</a><br /></td></tr>\n<tr class=\"separator:gacd9ff3b943b3d8bda4f4b388320420fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga089315d5a0c20ac6eaa17a854bbd2e81\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">mat4x4</a></td></tr>\n<tr class=\"memdesc:ga089315d5a0c20ac6eaa17a854bbd2e81\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of floating-point numbers.  <a href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">More...</a><br /></td></tr>\n<tr class=\"separator:ga089315d5a0c20ac6eaa17a854bbd2e81\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bcffa2d49f28d16f680757b5c0e7c84\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_uvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a></td></tr>\n<tr class=\"memdesc:ga9bcffa2d49f28d16f680757b5c0e7c84\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of unsigned integer numbers.  <a href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9bcffa2d49f28d16f680757b5c0e7c84\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae85537b672ffe0b3218cbdf1823e1c72\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_uvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">uvec3</a></td></tr>\n<tr class=\"memdesc:gae85537b672ffe0b3218cbdf1823e1c72\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of unsigned integer numbers.  <a href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">More...</a><br /></td></tr>\n<tr class=\"separator:gae85537b672ffe0b3218cbdf1823e1c72\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7c3a0e7ae50c34c3290415c115f251e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_uvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a></td></tr>\n<tr class=\"memdesc:gaa7c3a0e7ae50c34c3290415c115f251e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of unsigned integer numbers.  <a href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7c3a0e7ae50c34c3290415c115f251e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09d0200e8ff86391d8804b4fefd5f1da\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a></td></tr>\n<tr class=\"memdesc:ga09d0200e8ff86391d8804b4fefd5f1da\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of floating-point numbers.  <a href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">More...</a><br /></td></tr>\n<tr class=\"separator:ga09d0200e8ff86391d8804b4fefd5f1da\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa8ea2429bb3cb41a715258a447f39897\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a></td></tr>\n<tr class=\"memdesc:gaa8ea2429bb3cb41a715258a447f39897\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of floating-point numbers.  <a href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa8ea2429bb3cb41a715258a447f39897\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafbab23070ca47932487d25332adc7d7c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a></td></tr>\n<tr class=\"memdesc:gafbab23070ca47932487d25332adc7d7c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of floating-point numbers.  <a href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">More...</a><br /></td></tr>\n<tr class=\"separator:gafbab23070ca47932487d25332adc7d7c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>The standard types defined by the specification. </p>\n<p>These types are all typedefs of more generalized, template types. To see the definition of these template types, go to <a class=\"el\" href=\"a00146.html\">Template types</a>. </p>\n<h2 class=\"groupheader\">Typedef Documentation</h2>\n<a class=\"anchor\" id=\"ga0e46aaaccc5e713eac5bfbc8d6885a60\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_bvec2 bvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of boolean. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00565\">565</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga150731e2a148eff8752114a0e450505e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_bvec3 bvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of boolean. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00570\">570</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga444e8f61bfb3a6f037d019ac6933f8c6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_bvec4 bvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of boolean. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00575\">575</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac7f51e23c8802d867f564dfd146bdb44\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat2x2 dmat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 * 2 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00706\">706</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacc27b39853a2ecb538c8b3afc20c359e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat2x2 dmat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 * 2 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00721\">721</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1cb3c561a32f0864733dfaf97c71f0c7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat2x3 dmat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 * 3 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00726\">726</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaddd230c88fbd6ec33242329be3a1b738\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat2x4 dmat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 * 4 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00731\">731</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae174ff65e148bb7dec4bf10a63cb46ff\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat3x3 dmat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 * 3 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00711\">711</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaec22f44dddbdadfe5dfca68eb3457ea8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat3x2 dmat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 * 2 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00736\">736</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac44263f56ff3cbf0a9cc4e2405d5ecb8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat3x3 dmat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 * 3 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00741\">741</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga38d9bfca882ec542b1928cf77b5c2091\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat3x4 dmat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 * 4 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00746\">746</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga97b38ea24e9ebf58eac04a8d99dc3e27\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat4x4 dmat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 * 4 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00716\">716</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6ddab280c735a2139133b4164b99a68a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat4x2 dmat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 * 2 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00751\">751</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab6c8974496fc7c72dad09219118ba89e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat4x3 dmat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 * 3 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00756\">756</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga41c2da87ca627c1b2da5e895435a508e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dmat4x4 dmat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 * 4 matrix of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00761\">761</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga15ade901680b29b78c1f9d1796db6e0e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dvec2 dvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00484\">484</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabebd0c7e3c5cd337d95c313c5e8b8db4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dvec3 dvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00489\">489</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9503f809789bda7e8852a6abde3ae5c1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_dvec4 dvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00494\">494</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2ab812bd103527e2d6c62c2e2f5ee78f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_ivec2 ivec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of signed integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00511\">511</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga34aee73784bcc247d426250540c1911c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_ivec3 ivec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of signed integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00516\">516</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaa26c41d168dc00be0fe55f4d0a34224\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_ivec4 ivec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of signed integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00521\">521</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e30cfba068ebc3c71fe1f8b3110e450\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat2x2 mat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00405\">405</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0c84b211a5730357b63c6d2e4fb696d5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat2x2 mat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00358\">358</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafb063d734266e92915d87f8943560471\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat2x3 mat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 3 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00363\">363</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4d2ac1a80c36fb5a1d15914035f792ac\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat2x4 mat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 4 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00368\">368</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6dd3ec98a548755676267e59142911f8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat3x3 mat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00410\">410</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3839ca29d011a80ff3ede7f22ba602a4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat3x2 mat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 2 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00373\">373</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga378921b6a07bcdad946858b340f69ab1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat3x3 mat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00378\">378</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7876e0c3e3fcc3e2f4c0462c152e87cf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat3x4 mat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 4 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00383\">383</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gade0eb47c01f79384a6f38017ede17446\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat4x4 mat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00415\">415</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1b3f6a5cbc17362141f9781262ed838f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat4x2 mat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 2 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00388\">388</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacd9ff3b943b3d8bda4f4b388320420fd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat4x3 mat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 3 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00393\">393</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga089315d5a0c20ac6eaa17a854bbd2e81\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_mat4x4 mat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00398\">398</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9bcffa2d49f28d16f680757b5c0e7c84\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_uvec2 uvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of unsigned integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00538\">538</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae85537b672ffe0b3218cbdf1823e1c72\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_uvec3 uvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of unsigned integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00543\">543</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa7c3a0e7ae50c34c3290415c115f251e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_uvec4 uvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of unsigned integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00548\">548</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga09d0200e8ff86391d8804b4fefd5f1da\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_vec2 vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00457\">457</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa8ea2429bb3cb41a715258a447f39897\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_vec3 vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00462\">462</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafbab23070ca47932487d25332adc7d7c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_vec4 vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00467\">467</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00145.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Precision types</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Precision types<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a><a class=\"el\" href=\"a00143.html\">Core features</a> &raquo;  &#124; <a class=\"el\" href=\"a00144.html\">Types</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Non-GLSL types that are used to define qualifier-based types.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga5d7156af15f362d4007769784a38e148\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5d7156af15f362d4007769784a38e148\">highp_bvec2</a></td></tr>\n<tr class=\"memdesc:ga5d7156af15f362d4007769784a38e148\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high qualifier bool numbers.  <a href=\"a00145.html#ga5d7156af15f362d4007769784a38e148\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5d7156af15f362d4007769784a38e148\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3625991931d1c556452a2c551748730\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gae3625991931d1c556452a2c551748730\">highp_bvec3</a></td></tr>\n<tr class=\"memdesc:gae3625991931d1c556452a2c551748730\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high qualifier bool numbers.  <a href=\"a00145.html#gae3625991931d1c556452a2c551748730\">More...</a><br /></td></tr>\n<tr class=\"separator:gae3625991931d1c556452a2c551748730\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0d2929c4809a6ff51ad616bf81e16e0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0\">highp_bvec4</a></td></tr>\n<tr class=\"memdesc:gaa0d2929c4809a6ff51ad616bf81e16e0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high qualifier bool numbers.  <a href=\"a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0d2929c4809a6ff51ad616bf81e16e0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga02c6ed0185f84600c3b5001cf0db4746\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga02c6ed0185f84600c3b5001cf0db4746\">highp_dmat2</a></td></tr>\n<tr class=\"memdesc:ga02c6ed0185f84600c3b5001cf0db4746\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga02c6ed0185f84600c3b5001cf0db4746\">More...</a><br /></td></tr>\n<tr class=\"separator:ga02c6ed0185f84600c3b5001cf0db4746\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga458e8160a061147a3a2021c574b19787\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga458e8160a061147a3a2021c574b19787\">highp_dmat2x2</a></td></tr>\n<tr class=\"memdesc:ga458e8160a061147a3a2021c574b19787\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga458e8160a061147a3a2021c574b19787\">More...</a><br /></td></tr>\n<tr class=\"separator:ga458e8160a061147a3a2021c574b19787\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga60fe4ae1b320094bc2a8d977505a97f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5\">highp_dmat2x3</a></td></tr>\n<tr class=\"memdesc:ga60fe4ae1b320094bc2a8d977505a97f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga60fe4ae1b320094bc2a8d977505a97f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b4fed753f9b7c217b0401dc808e780a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga8b4fed753f9b7c217b0401dc808e780a\">highp_dmat2x4</a></td></tr>\n<tr class=\"memdesc:ga8b4fed753f9b7c217b0401dc808e780a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga8b4fed753f9b7c217b0401dc808e780a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b4fed753f9b7c217b0401dc808e780a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d8eec93e1655d7889d2ef05c3fe580a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a\">highp_dmat3</a></td></tr>\n<tr class=\"memdesc:ga6d8eec93e1655d7889d2ef05c3fe580a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d8eec93e1655d7889d2ef05c3fe580a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5922c1b5a0a4973b0256db146aa77049\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5922c1b5a0a4973b0256db146aa77049\">highp_dmat3x2</a></td></tr>\n<tr class=\"memdesc:ga5922c1b5a0a4973b0256db146aa77049\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga5922c1b5a0a4973b0256db146aa77049\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5922c1b5a0a4973b0256db146aa77049\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaca3b96f84c48db9830b5b0d4b07d1516\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516\">highp_dmat3x3</a></td></tr>\n<tr class=\"memdesc:gaca3b96f84c48db9830b5b0d4b07d1516\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516\">More...</a><br /></td></tr>\n<tr class=\"separator:gaca3b96f84c48db9830b5b0d4b07d1516\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga60cb89371783bb18003d3b2f8dbf62f8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8\">highp_dmat3x4</a></td></tr>\n<tr class=\"memdesc:ga60cb89371783bb18003d3b2f8dbf62f8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga60cb89371783bb18003d3b2f8dbf62f8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga96af41ad54c906b0ed14cbe43ca7db0d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d\">highp_dmat4</a></td></tr>\n<tr class=\"memdesc:ga96af41ad54c906b0ed14cbe43ca7db0d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96af41ad54c906b0ed14cbe43ca7db0d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad779abbdd0c7594cee515e4546d3db29\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gad779abbdd0c7594cee515e4546d3db29\">highp_dmat4x2</a></td></tr>\n<tr class=\"memdesc:gad779abbdd0c7594cee515e4546d3db29\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gad779abbdd0c7594cee515e4546d3db29\">More...</a><br /></td></tr>\n<tr class=\"separator:gad779abbdd0c7594cee515e4546d3db29\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga719750bee4022a646b006d2dda75cb76\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga719750bee4022a646b006d2dda75cb76\">highp_dmat4x3</a></td></tr>\n<tr class=\"memdesc:ga719750bee4022a646b006d2dda75cb76\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga719750bee4022a646b006d2dda75cb76\">More...</a><br /></td></tr>\n<tr class=\"separator:ga719750bee4022a646b006d2dda75cb76\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab7e154baf836679251844a5d933bd0aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gab7e154baf836679251844a5d933bd0aa\">highp_dmat4x4</a></td></tr>\n<tr class=\"memdesc:gab7e154baf836679251844a5d933bd0aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gab7e154baf836679251844a5d933bd0aa\">More...</a><br /></td></tr>\n<tr class=\"separator:gab7e154baf836679251844a5d933bd0aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20f7155c9cdcafb74da02d0ef60629a4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4\">highp_dvec2</a></td></tr>\n<tr class=\"memdesc:ga20f7155c9cdcafb74da02d0ef60629a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high double-qualifier floating-point numbers.  <a href=\"a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20f7155c9cdcafb74da02d0ef60629a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab8a03109aebc121ef69abec50fcdd459\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gab8a03109aebc121ef69abec50fcdd459\">highp_dvec3</a></td></tr>\n<tr class=\"memdesc:gab8a03109aebc121ef69abec50fcdd459\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high double-qualifier floating-point numbers.  <a href=\"a00145.html#gab8a03109aebc121ef69abec50fcdd459\">More...</a><br /></td></tr>\n<tr class=\"separator:gab8a03109aebc121ef69abec50fcdd459\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9dfeaa53a616848ed067994a2bd18992\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga9dfeaa53a616848ed067994a2bd18992\">highp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga9dfeaa53a616848ed067994a2bd18992\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high double-qualifier floating-point numbers.  <a href=\"a00145.html#ga9dfeaa53a616848ed067994a2bd18992\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9dfeaa53a616848ed067994a2bd18992\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e95694987ba35af6f736638be39626a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6e95694987ba35af6f736638be39626a\">highp_float</a></td></tr>\n<tr class=\"memdesc:ga6e95694987ba35af6f736638be39626a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier floating-point numbers.  <a href=\"a00145.html#ga6e95694987ba35af6f736638be39626a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e95694987ba35af6f736638be39626a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaabe7eb044941ebf308b53a447d692dc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::highp_int_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaaabe7eb044941ebf308b53a447d692dc\">highp_int</a></td></tr>\n<tr class=\"memdesc:gaaabe7eb044941ebf308b53a447d692dc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier signed integer.  <a href=\"a00145.html#gaaabe7eb044941ebf308b53a447d692dc\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaabe7eb044941ebf308b53a447d692dc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga23594b732ebff0ff9630ddb2a3bad659\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga23594b732ebff0ff9630ddb2a3bad659\">highp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga23594b732ebff0ff9630ddb2a3bad659\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high qualifier signed integer numbers.  <a href=\"a00145.html#ga23594b732ebff0ff9630ddb2a3bad659\">More...</a><br /></td></tr>\n<tr class=\"separator:ga23594b732ebff0ff9630ddb2a3bad659\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga24acd3b02b156bf0d67eaf17917ec4b7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7\">highp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga24acd3b02b156bf0d67eaf17917ec4b7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high qualifier signed integer numbers.  <a href=\"a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga24acd3b02b156bf0d67eaf17917ec4b7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga08f6be9d594bfc3b488e3e8b02d45518\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518\">highp_ivec4</a></td></tr>\n<tr class=\"memdesc:ga08f6be9d594bfc3b488e3e8b02d45518\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high qualifier signed integer numbers.  <a href=\"a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518\">More...</a><br /></td></tr>\n<tr class=\"separator:ga08f6be9d594bfc3b488e3e8b02d45518\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4fcceff924fa2dc1f3d5217f68c5f81a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">highp_mat2</a></td></tr>\n<tr class=\"memdesc:ga4fcceff924fa2dc1f3d5217f68c5f81a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4fcceff924fa2dc1f3d5217f68c5f81a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabb2ee47d6bffb6d6363b34a7c61c8229\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">highp_mat2x2</a></td></tr>\n<tr class=\"memdesc:gabb2ee47d6bffb6d6363b34a7c61c8229\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229\">More...</a><br /></td></tr>\n<tr class=\"separator:gabb2ee47d6bffb6d6363b34a7c61c8229\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga441b8e3402eefca108b40f3d22a1baa9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">highp_mat2x3</a></td></tr>\n<tr class=\"memdesc:ga441b8e3402eefca108b40f3d22a1baa9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga441b8e3402eefca108b40f3d22a1baa9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga441b8e3402eefca108b40f3d22a1baa9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b030d815c7c9f77c3c47e708863fd62\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">highp_mat2x4</a></td></tr>\n<tr class=\"memdesc:ga3b030d815c7c9f77c3c47e708863fd62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga3b030d815c7c9f77c3c47e708863fd62\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b030d815c7c9f77c3c47e708863fd62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9f30904176d75657930fa4383618f968\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">highp_mat3</a></td></tr>\n<tr class=\"memdesc:ga9f30904176d75657930fa4383618f968\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga9f30904176d75657930fa4383618f968\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9f30904176d75657930fa4383618f968\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12276a2b151d87c039134c388b5a3746\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">highp_mat3x2</a></td></tr>\n<tr class=\"memdesc:ga12276a2b151d87c039134c388b5a3746\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga12276a2b151d87c039134c388b5a3746\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12276a2b151d87c039134c388b5a3746\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b33e2669c291268ac4b1c9c296d2dc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">highp_mat3x3</a></td></tr>\n<tr class=\"memdesc:ga1b33e2669c291268ac4b1c9c296d2dc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b33e2669c291268ac4b1c9c296d2dc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabb55c60d8c7fb400bf2ed511251ca394\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">highp_mat3x4</a></td></tr>\n<tr class=\"memdesc:gabb55c60d8c7fb400bf2ed511251ca394\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gabb55c60d8c7fb400bf2ed511251ca394\">More...</a><br /></td></tr>\n<tr class=\"separator:gabb55c60d8c7fb400bf2ed511251ca394\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga332149037f33cec9d9b583e11c3c8524\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">highp_mat4</a></td></tr>\n<tr class=\"memdesc:ga332149037f33cec9d9b583e11c3c8524\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga332149037f33cec9d9b583e11c3c8524\">More...</a><br /></td></tr>\n<tr class=\"separator:ga332149037f33cec9d9b583e11c3c8524\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39ba2335320534c19db435a27d8bb765\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">highp_mat4x2</a></td></tr>\n<tr class=\"memdesc:ga39ba2335320534c19db435a27d8bb765\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga39ba2335320534c19db435a27d8bb765\">More...</a><br /></td></tr>\n<tr class=\"separator:ga39ba2335320534c19db435a27d8bb765\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf93a24b2e1c4a6f556fbcc796ec90e63\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">highp_mat4x3</a></td></tr>\n<tr class=\"memdesc:gaf93a24b2e1c4a6f556fbcc796ec90e63\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf93a24b2e1c4a6f556fbcc796ec90e63\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga989736bc5e50330ef3ab13d34bebc66f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">highp_mat4x4</a></td></tr>\n<tr class=\"memdesc:ga989736bc5e50330ef3ab13d34bebc66f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of high qualifier floating-point numbers.  <a href=\"a00145.html#ga989736bc5e50330ef3ab13d34bebc66f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga989736bc5e50330ef3ab13d34bebc66f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73e8a694d7fc69143cf25161d18d1dcf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::highp_uint_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf\">highp_uint</a></td></tr>\n<tr class=\"memdesc:ga73e8a694d7fc69143cf25161d18d1dcf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier unsigned integer.  <a href=\"a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73e8a694d7fc69143cf25161d18d1dcf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab6d886704d5c7faf85b03e4a36290546\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gab6d886704d5c7faf85b03e4a36290546\">highp_uvec2</a></td></tr>\n<tr class=\"memdesc:gab6d886704d5c7faf85b03e4a36290546\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high qualifier unsigned integer numbers.  <a href=\"a00145.html#gab6d886704d5c7faf85b03e4a36290546\">More...</a><br /></td></tr>\n<tr class=\"separator:gab6d886704d5c7faf85b03e4a36290546\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6f83c9b2aa706c9bc77587de13bf287e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e\">highp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga6f83c9b2aa706c9bc77587de13bf287e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high qualifier unsigned integer numbers.  <a href=\"a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6f83c9b2aa706c9bc77587de13bf287e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09b43516ea6fd2c617fc4bee2995316a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga09b43516ea6fd2c617fc4bee2995316a\">highp_uvec4</a></td></tr>\n<tr class=\"memdesc:ga09b43516ea6fd2c617fc4bee2995316a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high qualifier unsigned integer numbers.  <a href=\"a00145.html#ga09b43516ea6fd2c617fc4bee2995316a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga09b43516ea6fd2c617fc4bee2995316a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa92c1954d71b1e7914874bd787b43d1c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">highp_vec2</a></td></tr>\n<tr class=\"memdesc:gaa92c1954d71b1e7914874bd787b43d1c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of high single-qualifier floating-point numbers.  <a href=\"a00145.html#gaa92c1954d71b1e7914874bd787b43d1c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa92c1954d71b1e7914874bd787b43d1c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaca61dfaccbf2f58f2d8063a4e76b44a9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">highp_vec3</a></td></tr>\n<tr class=\"memdesc:gaca61dfaccbf2f58f2d8063a4e76b44a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of high single-qualifier floating-point numbers.  <a href=\"a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaca61dfaccbf2f58f2d8063a4e76b44a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad281decae52948b82feb3a9db8f63a7b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">highp_vec4</a></td></tr>\n<tr class=\"memdesc:gad281decae52948b82feb3a9db8f63a7b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of high single-qualifier floating-point numbers.  <a href=\"a00145.html#gad281decae52948b82feb3a9db8f63a7b\">More...</a><br /></td></tr>\n<tr class=\"separator:gad281decae52948b82feb3a9db8f63a7b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39fbc2447d5846af799d075a29c6e46d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, bool, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga39fbc2447d5846af799d075a29c6e46d\">lowp_bvec2</a></td></tr>\n<tr class=\"memdesc:ga39fbc2447d5846af799d075a29c6e46d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low qualifier bool numbers.  <a href=\"a00145.html#ga39fbc2447d5846af799d075a29c6e46d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga39fbc2447d5846af799d075a29c6e46d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga916d4e72701db85b64815faf06050111\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, bool, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga916d4e72701db85b64815faf06050111\">lowp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga916d4e72701db85b64815faf06050111\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low qualifier bool numbers.  <a href=\"a00145.html#ga916d4e72701db85b64815faf06050111\">More...</a><br /></td></tr>\n<tr class=\"separator:ga916d4e72701db85b64815faf06050111\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e9de03b1c11d11f18ee8da8627a28c6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, bool, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6\">lowp_bvec4</a></td></tr>\n<tr class=\"memdesc:ga2e9de03b1c11d11f18ee8da8627a28c6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low qualifier bool numbers.  <a href=\"a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e9de03b1c11d11f18ee8da8627a28c6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0dfc5624d872b189ab4a82bebca7107c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0dfc5624d872b189ab4a82bebca7107c\">lowp_dmat2</a></td></tr>\n<tr class=\"memdesc:ga0dfc5624d872b189ab4a82bebca7107c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga0dfc5624d872b189ab4a82bebca7107c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0dfc5624d872b189ab4a82bebca7107c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78e7b9e6dcadb7e8ac5562fe0263786c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c\">lowp_dmat2x2</a></td></tr>\n<tr class=\"memdesc:ga78e7b9e6dcadb7e8ac5562fe0263786c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78e7b9e6dcadb7e8ac5562fe0263786c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4450cd185006155fff0380dad2d70ec4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga4450cd185006155fff0380dad2d70ec4\">lowp_dmat2x3</a></td></tr>\n<tr class=\"memdesc:ga4450cd185006155fff0380dad2d70ec4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga4450cd185006155fff0380dad2d70ec4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4450cd185006155fff0380dad2d70ec4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49b6a11f54dcec866c0ecf17d7685165\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga49b6a11f54dcec866c0ecf17d7685165\">lowp_dmat2x4</a></td></tr>\n<tr class=\"memdesc:ga49b6a11f54dcec866c0ecf17d7685165\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga49b6a11f54dcec866c0ecf17d7685165\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49b6a11f54dcec866c0ecf17d7685165\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadffb225ac88b8a65e1e76233b8bd5768\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gadffb225ac88b8a65e1e76233b8bd5768\">lowp_dmat3</a></td></tr>\n<tr class=\"memdesc:gadffb225ac88b8a65e1e76233b8bd5768\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#gadffb225ac88b8a65e1e76233b8bd5768\">More...</a><br /></td></tr>\n<tr class=\"separator:gadffb225ac88b8a65e1e76233b8bd5768\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga02af788947516c41893c658990783fd4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga02af788947516c41893c658990783fd4\">lowp_dmat3x2</a></td></tr>\n<tr class=\"memdesc:ga02af788947516c41893c658990783fd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga02af788947516c41893c658990783fd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga02af788947516c41893c658990783fd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0bae293e714e00f23e4bbf5a6c000448\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0bae293e714e00f23e4bbf5a6c000448\">lowp_dmat3x3</a></td></tr>\n<tr class=\"memdesc:ga0bae293e714e00f23e4bbf5a6c000448\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga0bae293e714e00f23e4bbf5a6c000448\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0bae293e714e00f23e4bbf5a6c000448\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42108fc51b1c14745e6edf399c1d0150\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga42108fc51b1c14745e6edf399c1d0150\">lowp_dmat3x4</a></td></tr>\n<tr class=\"memdesc:ga42108fc51b1c14745e6edf399c1d0150\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga42108fc51b1c14745e6edf399c1d0150\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42108fc51b1c14745e6edf399c1d0150\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5d0f05a7d08f3f058110e1b79f805d7a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a\">lowp_dmat4</a></td></tr>\n<tr class=\"memdesc:ga5d0f05a7d08f3f058110e1b79f805d7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5d0f05a7d08f3f058110e1b79f805d7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3daec60b56a8d57455cb60d8328f3645\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga3daec60b56a8d57455cb60d8328f3645\">lowp_dmat4x2</a></td></tr>\n<tr class=\"memdesc:ga3daec60b56a8d57455cb60d8328f3645\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga3daec60b56a8d57455cb60d8328f3645\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3daec60b56a8d57455cb60d8328f3645\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaf5b6171d297b3a1c6c771e8b912c08d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d\">lowp_dmat4x3</a></td></tr>\n<tr class=\"memdesc:gaaf5b6171d297b3a1c6c771e8b912c08d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaf5b6171d297b3a1c6c771e8b912c08d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga843a2b7ca501078963910ea0b453f970\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga843a2b7ca501078963910ea0b453f970\">lowp_dmat4x4</a></td></tr>\n<tr class=\"memdesc:ga843a2b7ca501078963910ea0b453f970\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga843a2b7ca501078963910ea0b453f970\">More...</a><br /></td></tr>\n<tr class=\"separator:ga843a2b7ca501078963910ea0b453f970\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e7f034722aaa1895196f0381a1810f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga8e7f034722aaa1895196f0381a1810f5\">lowp_dvec2</a></td></tr>\n<tr class=\"memdesc:ga8e7f034722aaa1895196f0381a1810f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low double-qualifier floating-point numbers.  <a href=\"a00145.html#ga8e7f034722aaa1895196f0381a1810f5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e7f034722aaa1895196f0381a1810f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b6374e88079410f8b641e21bf6b77a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2b6374e88079410f8b641e21bf6b77a3\">lowp_dvec3</a></td></tr>\n<tr class=\"memdesc:ga2b6374e88079410f8b641e21bf6b77a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low double-qualifier floating-point numbers.  <a href=\"a00145.html#ga2b6374e88079410f8b641e21bf6b77a3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b6374e88079410f8b641e21bf6b77a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabcd63b91329c8213fdae89d0da6ece4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabcd63b91329c8213fdae89d0da6ece4c\">lowp_dvec4</a></td></tr>\n<tr class=\"memdesc:gabcd63b91329c8213fdae89d0da6ece4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low double-qualifier floating-point numbers.  <a href=\"a00145.html#gabcd63b91329c8213fdae89d0da6ece4c\">More...</a><br /></td></tr>\n<tr class=\"separator:gabcd63b91329c8213fdae89d0da6ece4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga358d69e11b1c0f6c7c469e0d39ab7fd1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef lowp_float_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1\">lowp_float</a></td></tr>\n<tr class=\"memdesc:ga358d69e11b1c0f6c7c469e0d39ab7fd1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier floating-point numbers.  <a href=\"a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga358d69e11b1c0f6c7c469e0d39ab7fd1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0fa1e32e8b3552ed63556eca51c620e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::lowp_int_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gad0fa1e32e8b3552ed63556eca51c620e\">lowp_int</a></td></tr>\n<tr class=\"memdesc:gad0fa1e32e8b3552ed63556eca51c620e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier signed integer.  <a href=\"a00145.html#gad0fa1e32e8b3552ed63556eca51c620e\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0fa1e32e8b3552ed63556eca51c620e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ce7e678655c51239b95b2089e8f0e96\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga7ce7e678655c51239b95b2089e8f0e96\">lowp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga7ce7e678655c51239b95b2089e8f0e96\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low qualifier signed integer numbers.  <a href=\"a00145.html#ga7ce7e678655c51239b95b2089e8f0e96\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ce7e678655c51239b95b2089e8f0e96\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga59ae64e8103c0ccf7117bd3bee223ad0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0\">lowp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga59ae64e8103c0ccf7117bd3bee223ad0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low qualifier signed integer numbers.  <a href=\"a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga59ae64e8103c0ccf7117bd3bee223ad0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga693ad87d8ccd440f0c0423281defeccd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga693ad87d8ccd440f0c0423281defeccd\">lowp_ivec4</a></td></tr>\n<tr class=\"memdesc:ga693ad87d8ccd440f0c0423281defeccd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low qualifier signed integer numbers.  <a href=\"a00145.html#ga693ad87d8ccd440f0c0423281defeccd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga693ad87d8ccd440f0c0423281defeccd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga08bba677ef7b2809ac0061fa9a3db854\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">lowp_mat2</a></td></tr>\n<tr class=\"memdesc:ga08bba677ef7b2809ac0061fa9a3db854\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga08bba677ef7b2809ac0061fa9a3db854\">More...</a><br /></td></tr>\n<tr class=\"separator:ga08bba677ef7b2809ac0061fa9a3db854\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga993bdd19989dc1f4d09f664a2ee74cb5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">lowp_mat2x2</a></td></tr>\n<tr class=\"memdesc:ga993bdd19989dc1f4d09f664a2ee74cb5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga993bdd19989dc1f4d09f664a2ee74cb5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga083089177b89ae9166d8d251a90f4b8b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">lowp_mat2x3</a></td></tr>\n<tr class=\"memdesc:ga083089177b89ae9166d8d251a90f4b8b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga083089177b89ae9166d8d251a90f4b8b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga083089177b89ae9166d8d251a90f4b8b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae6e9638a6d1cadbd22f27c02998ebbf8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">lowp_mat2x4</a></td></tr>\n<tr class=\"memdesc:gae6e9638a6d1cadbd22f27c02998ebbf8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8\">More...</a><br /></td></tr>\n<tr class=\"separator:gae6e9638a6d1cadbd22f27c02998ebbf8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc4e277672e9f7b3cde23a4a3bd24fc9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">lowp_mat3</a></td></tr>\n<tr class=\"memdesc:gacc4e277672e9f7b3cde23a4a3bd24fc9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc4e277672e9f7b3cde23a4a3bd24fc9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga10f0f2108800a543f22d90ecf4b40d01\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">lowp_mat3x2</a></td></tr>\n<tr class=\"memdesc:ga10f0f2108800a543f22d90ecf4b40d01\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga10f0f2108800a543f22d90ecf4b40d01\">More...</a><br /></td></tr>\n<tr class=\"separator:ga10f0f2108800a543f22d90ecf4b40d01\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1e4b7727038383e0103b138c66a65039\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">lowp_mat3x3</a></td></tr>\n<tr class=\"memdesc:ga1e4b7727038383e0103b138c66a65039\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga1e4b7727038383e0103b138c66a65039\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e4b7727038383e0103b138c66a65039\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42a7c3c9eafb869c000b4388913ce0c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">lowp_mat3x4</a></td></tr>\n<tr class=\"memdesc:ga42a7c3c9eafb869c000b4388913ce0c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42a7c3c9eafb869c000b4388913ce0c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73e2f3bcae71b05736f2c962f98565a1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">lowp_mat4</a></td></tr>\n<tr class=\"memdesc:ga73e2f3bcae71b05736f2c962f98565a1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga73e2f3bcae71b05736f2c962f98565a1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73e2f3bcae71b05736f2c962f98565a1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9839115cb8be9524f0621caf4bb29665\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">lowp_mat4x2</a></td></tr>\n<tr class=\"memdesc:ga9839115cb8be9524f0621caf4bb29665\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga9839115cb8be9524f0621caf4bb29665\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9839115cb8be9524f0621caf4bb29665\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7eb333327f0b261237b540496137d55e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">lowp_mat4x3</a></td></tr>\n<tr class=\"memdesc:ga7eb333327f0b261237b540496137d55e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga7eb333327f0b261237b540496137d55e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7eb333327f0b261237b540496137d55e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8378facff06c21d2092a9a13c9ef0a0b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">lowp_mat4x4</a></td></tr>\n<tr class=\"memdesc:ga8378facff06c21d2092a9a13c9ef0a0b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of low qualifier floating-point numbers.  <a href=\"a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8378facff06c21d2092a9a13c9ef0a0b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga25ebc60727fc8b4a1167665f9ecdca97\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::lowp_uint_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97\">lowp_uint</a></td></tr>\n<tr class=\"memdesc:ga25ebc60727fc8b4a1167665f9ecdca97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier unsigned integer.  <a href=\"a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97\">More...</a><br /></td></tr>\n<tr class=\"separator:ga25ebc60727fc8b4a1167665f9ecdca97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ab41df977e0b21c1c41a314b1011042\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga3ab41df977e0b21c1c41a314b1011042\">lowp_uvec2</a></td></tr>\n<tr class=\"memdesc:ga3ab41df977e0b21c1c41a314b1011042\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low qualifier unsigned integer numbers.  <a href=\"a00145.html#ga3ab41df977e0b21c1c41a314b1011042\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ab41df977e0b21c1c41a314b1011042\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaacab3ed11290185c279a97edc9255b98\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaacab3ed11290185c279a97edc9255b98\">lowp_uvec3</a></td></tr>\n<tr class=\"memdesc:gaacab3ed11290185c279a97edc9255b98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low qualifier unsigned integer numbers.  <a href=\"a00145.html#gaacab3ed11290185c279a97edc9255b98\">More...</a><br /></td></tr>\n<tr class=\"separator:gaacab3ed11290185c279a97edc9255b98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4cdf061bac6ded19e940e876eab9b737\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga4cdf061bac6ded19e940e876eab9b737\">lowp_uvec4</a></td></tr>\n<tr class=\"memdesc:ga4cdf061bac6ded19e940e876eab9b737\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low qualifier unsigned integer numbers.  <a href=\"a00145.html#ga4cdf061bac6ded19e940e876eab9b737\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4cdf061bac6ded19e940e876eab9b737\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30e8baef5d56d5c166872a2bc00f36e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">lowp_vec2</a></td></tr>\n<tr class=\"memdesc:ga30e8baef5d56d5c166872a2bc00f36e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of low single-qualifier floating-point numbers.  <a href=\"a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30e8baef5d56d5c166872a2bc00f36e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga868e8e4470a3ef97c7ee3032bf90dc79\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">lowp_vec3</a></td></tr>\n<tr class=\"memdesc:ga868e8e4470a3ef97c7ee3032bf90dc79\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of low single-qualifier floating-point numbers.  <a href=\"a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79\">More...</a><br /></td></tr>\n<tr class=\"separator:ga868e8e4470a3ef97c7ee3032bf90dc79\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gace3acb313c800552a9411953eb8b2ed7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">lowp_vec4</a></td></tr>\n<tr class=\"memdesc:gace3acb313c800552a9411953eb8b2ed7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of low single-qualifier floating-point numbers.  <a href=\"a00145.html#gace3acb313c800552a9411953eb8b2ed7\">More...</a><br /></td></tr>\n<tr class=\"separator:gace3acb313c800552a9411953eb8b2ed7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6670d1a61e113c339aac7dd2ae72154b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, bool, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6670d1a61e113c339aac7dd2ae72154b\">mediump_bvec2</a></td></tr>\n<tr class=\"memdesc:ga6670d1a61e113c339aac7dd2ae72154b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium qualifier bool numbers.  <a href=\"a00145.html#ga6670d1a61e113c339aac7dd2ae72154b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6670d1a61e113c339aac7dd2ae72154b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabc19c9cf2c0994f3ded6b98f9d37005\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, bool, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005\">mediump_bvec3</a></td></tr>\n<tr class=\"memdesc:gaabc19c9cf2c0994f3ded6b98f9d37005\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium qualifier bool numbers.  <a href=\"a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabc19c9cf2c0994f3ded6b98f9d37005\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga620d6dce077134eee76e014a3e2b2661\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, bool, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga620d6dce077134eee76e014a3e2b2661\">mediump_bvec4</a></td></tr>\n<tr class=\"memdesc:ga620d6dce077134eee76e014a3e2b2661\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium qualifier bool numbers.  <a href=\"a00145.html#ga620d6dce077134eee76e014a3e2b2661\">More...</a><br /></td></tr>\n<tr class=\"separator:ga620d6dce077134eee76e014a3e2b2661\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga963689d328dfa8fcaa4aa140f2e52cd0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0\">mediump_dmat2</a></td></tr>\n<tr class=\"memdesc:ga963689d328dfa8fcaa4aa140f2e52cd0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga963689d328dfa8fcaa4aa140f2e52cd0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade27733f04b9a6f723850263ccda908b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gade27733f04b9a6f723850263ccda908b\">mediump_dmat2x2</a></td></tr>\n<tr class=\"memdesc:gade27733f04b9a6f723850263ccda908b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gade27733f04b9a6f723850263ccda908b\">More...</a><br /></td></tr>\n<tr class=\"separator:gade27733f04b9a6f723850263ccda908b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga253243e9a0e6a6235e41351f3d6fbd2e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e\">mediump_dmat2x3</a></td></tr>\n<tr class=\"memdesc:ga253243e9a0e6a6235e41351f3d6fbd2e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga253243e9a0e6a6235e41351f3d6fbd2e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6afa4f5d70f8e0dceed640a26918661b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga6afa4f5d70f8e0dceed640a26918661b\">mediump_dmat2x4</a></td></tr>\n<tr class=\"memdesc:ga6afa4f5d70f8e0dceed640a26918661b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga6afa4f5d70f8e0dceed640a26918661b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6afa4f5d70f8e0dceed640a26918661b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5418e9669f0673640a2fbdeb261aff50\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5418e9669f0673640a2fbdeb261aff50\">mediump_dmat3</a></td></tr>\n<tr class=\"memdesc:ga5418e9669f0673640a2fbdeb261aff50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga5418e9669f0673640a2fbdeb261aff50\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5418e9669f0673640a2fbdeb261aff50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2196f803d3b4e1f920acef5b32ab41c4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4\">mediump_dmat3x2</a></td></tr>\n<tr class=\"memdesc:ga2196f803d3b4e1f920acef5b32ab41c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2196f803d3b4e1f920acef5b32ab41c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafee0cf7585d59b2485e42e8aae4714ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gafee0cf7585d59b2485e42e8aae4714ca\">mediump_dmat3x3</a></td></tr>\n<tr class=\"memdesc:gafee0cf7585d59b2485e42e8aae4714ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gafee0cf7585d59b2485e42e8aae4714ca\">More...</a><br /></td></tr>\n<tr class=\"separator:gafee0cf7585d59b2485e42e8aae4714ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9e0578807bf8880cea8336dfdb666d69\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga9e0578807bf8880cea8336dfdb666d69\">mediump_dmat3x4</a></td></tr>\n<tr class=\"memdesc:ga9e0578807bf8880cea8336dfdb666d69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga9e0578807bf8880cea8336dfdb666d69\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9e0578807bf8880cea8336dfdb666d69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafaf455c1dff11cb8f3c86467ac27a461\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gafaf455c1dff11cb8f3c86467ac27a461\">mediump_dmat4</a></td></tr>\n<tr class=\"memdesc:gafaf455c1dff11cb8f3c86467ac27a461\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gafaf455c1dff11cb8f3c86467ac27a461\">More...</a><br /></td></tr>\n<tr class=\"separator:gafaf455c1dff11cb8f3c86467ac27a461\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04b32b7cbfddf0f02a8b442f8b376680\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680\">mediump_dmat4x2</a></td></tr>\n<tr class=\"memdesc:ga04b32b7cbfddf0f02a8b442f8b376680\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04b32b7cbfddf0f02a8b442f8b376680\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga002d912d086a3eaa5425a6c4ca468fea\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga002d912d086a3eaa5425a6c4ca468fea\">mediump_dmat4x3</a></td></tr>\n<tr class=\"memdesc:ga002d912d086a3eaa5425a6c4ca468fea\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga002d912d086a3eaa5425a6c4ca468fea\">More...</a><br /></td></tr>\n<tr class=\"separator:ga002d912d086a3eaa5425a6c4ca468fea\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaeac3848d29b4b47332c44c31d9bcfa2f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f\">mediump_dmat4x4</a></td></tr>\n<tr class=\"memdesc:gaeac3848d29b4b47332c44c31d9bcfa2f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaeac3848d29b4b47332c44c31d9bcfa2f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga00b74cf6997deedd6a962e0997bc120b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga00b74cf6997deedd6a962e0997bc120b\">mediump_dvec2</a></td></tr>\n<tr class=\"memdesc:ga00b74cf6997deedd6a962e0997bc120b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium double-qualifier floating-point numbers.  <a href=\"a00145.html#ga00b74cf6997deedd6a962e0997bc120b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga00b74cf6997deedd6a962e0997bc120b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabcad2ee624723d7add5ce5bf90b6bd2a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a\">mediump_dvec3</a></td></tr>\n<tr class=\"memdesc:gabcad2ee624723d7add5ce5bf90b6bd2a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium double-qualifier floating-point numbers.  <a href=\"a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a\">More...</a><br /></td></tr>\n<tr class=\"separator:gabcad2ee624723d7add5ce5bf90b6bd2a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga072fdd19df303b9b821b6793b86c1637\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga072fdd19df303b9b821b6793b86c1637\">mediump_dvec4</a></td></tr>\n<tr class=\"memdesc:ga072fdd19df303b9b821b6793b86c1637\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium double-qualifier floating-point numbers.  <a href=\"a00145.html#ga072fdd19df303b9b821b6793b86c1637\">More...</a><br /></td></tr>\n<tr class=\"separator:ga072fdd19df303b9b821b6793b86c1637\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga280c68f537f4b1e03a00b23e62573b98\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_float_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga280c68f537f4b1e03a00b23e62573b98\">mediump_float</a></td></tr>\n<tr class=\"memdesc:ga280c68f537f4b1e03a00b23e62573b98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier floating-point numbers.  <a href=\"a00145.html#ga280c68f537f4b1e03a00b23e62573b98\">More...</a><br /></td></tr>\n<tr class=\"separator:ga280c68f537f4b1e03a00b23e62573b98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga212ef8f883878cb7430228a279a7d866\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::mediump_int_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga212ef8f883878cb7430228a279a7d866\">mediump_int</a></td></tr>\n<tr class=\"memdesc:ga212ef8f883878cb7430228a279a7d866\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier signed integer.  <a href=\"a00145.html#ga212ef8f883878cb7430228a279a7d866\">More...</a><br /></td></tr>\n<tr class=\"separator:ga212ef8f883878cb7430228a279a7d866\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabd76afa066badf4489fd0fec28f9537\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaabd76afa066badf4489fd0fec28f9537\">mediump_ivec2</a></td></tr>\n<tr class=\"memdesc:gaabd76afa066badf4489fd0fec28f9537\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium qualifier signed integer numbers.  <a href=\"a00145.html#gaabd76afa066badf4489fd0fec28f9537\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabd76afa066badf4489fd0fec28f9537\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf964dcfcbb2088d13c9c321517171154\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaf964dcfcbb2088d13c9c321517171154\">mediump_ivec3</a></td></tr>\n<tr class=\"memdesc:gaf964dcfcbb2088d13c9c321517171154\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium qualifier signed integer numbers.  <a href=\"a00145.html#gaf964dcfcbb2088d13c9c321517171154\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf964dcfcbb2088d13c9c321517171154\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f89d11cd6e64c1814200f8cca083512\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga7f89d11cd6e64c1814200f8cca083512\">mediump_ivec4</a></td></tr>\n<tr class=\"memdesc:ga7f89d11cd6e64c1814200f8cca083512\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium qualifier signed integer numbers.  <a href=\"a00145.html#ga7f89d11cd6e64c1814200f8cca083512\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f89d11cd6e64c1814200f8cca083512\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga83fe5281ac0a3d153226b903badd415b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">mediump_mat2</a></td></tr>\n<tr class=\"memdesc:ga83fe5281ac0a3d153226b903badd415b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga83fe5281ac0a3d153226b903badd415b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga83fe5281ac0a3d153226b903badd415b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf1beb3328c79fece7dcc34c5b05b57a0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">mediump_mat2x2</a></td></tr>\n<tr class=\"memdesc:gaf1beb3328c79fece7dcc34c5b05b57a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf1beb3328c79fece7dcc34c5b05b57a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0bda8ba50fa930ef29d4fa91a85f229a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">mediump_mat2x3</a></td></tr>\n<tr class=\"memdesc:ga0bda8ba50fa930ef29d4fa91a85f229a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0bda8ba50fa930ef29d4fa91a85f229a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa190a86a477360f02508191a6549efc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">mediump_mat2x4</a></td></tr>\n<tr class=\"memdesc:gaa190a86a477360f02508191a6549efc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gaa190a86a477360f02508191a6549efc3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa190a86a477360f02508191a6549efc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad31f8a0097ff6c22b92cf855dfffc575\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">mediump_mat3</a></td></tr>\n<tr class=\"memdesc:gad31f8a0097ff6c22b92cf855dfffc575\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gad31f8a0097ff6c22b92cf855dfffc575\">More...</a><br /></td></tr>\n<tr class=\"separator:gad31f8a0097ff6c22b92cf855dfffc575\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga66a044feff0a17b1bf275bc8d200e514\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">mediump_mat3x2</a></td></tr>\n<tr class=\"memdesc:ga66a044feff0a17b1bf275bc8d200e514\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga66a044feff0a17b1bf275bc8d200e514\">More...</a><br /></td></tr>\n<tr class=\"separator:ga66a044feff0a17b1bf275bc8d200e514\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c78fa1875926e5c6684ae1f8b49092a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">mediump_mat3x3</a></td></tr>\n<tr class=\"memdesc:ga2c78fa1875926e5c6684ae1f8b49092a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c78fa1875926e5c6684ae1f8b49092a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5bcf41dd2acbace9ed7ae4326cb45e6e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">mediump_mat3x4</a></td></tr>\n<tr class=\"memdesc:ga5bcf41dd2acbace9ed7ae4326cb45e6e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5bcf41dd2acbace9ed7ae4326cb45e6e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0f910a2c5bf1c3fd153c4bc13cefee58\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">mediump_mat4</a></td></tr>\n<tr class=\"memdesc:ga0f910a2c5bf1c3fd153c4bc13cefee58\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0f910a2c5bf1c3fd153c4bc13cefee58\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaced6ccfdae150c4465be59c0b15f4d9e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">mediump_mat4x2</a></td></tr>\n<tr class=\"memdesc:gaced6ccfdae150c4465be59c0b15f4d9e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 2 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaced6ccfdae150c4465be59c0b15f4d9e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1bab99cd9c4edd4bffdab662609b0961\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">mediump_mat4x3</a></td></tr>\n<tr class=\"memdesc:ga1bab99cd9c4edd4bffdab662609b0961\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 3 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga1bab99cd9c4edd4bffdab662609b0961\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1bab99cd9c4edd4bffdab662609b0961\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga005facdef4caac0ef7435eee609c7e46\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">mediump_mat4x4</a></td></tr>\n<tr class=\"memdesc:ga005facdef4caac0ef7435eee609c7e46\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 columns of 4 components matrix of medium qualifier floating-point numbers.  <a href=\"a00145.html#ga005facdef4caac0ef7435eee609c7e46\">More...</a><br /></td></tr>\n<tr class=\"separator:ga005facdef4caac0ef7435eee609c7e46\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0b7e01c52b9e5bf3369761b79b5f4f8e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::mediump_uint_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e\">mediump_uint</a></td></tr>\n<tr class=\"memdesc:ga0b7e01c52b9e5bf3369761b79b5f4f8e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier unsigned integer.  <a href=\"a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0b7e01c52b9e5bf3369761b79b5f4f8e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2d61afc5b2e4132f72885d4a51f0081\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081\">mediump_uvec2</a></td></tr>\n<tr class=\"memdesc:gaf2d61afc5b2e4132f72885d4a51f0081\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium qualifier unsigned integer numbers.  <a href=\"a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2d61afc5b2e4132f72885d4a51f0081\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaab484fc37dddd84f767d84e38d761649\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaab484fc37dddd84f767d84e38d761649\">mediump_uvec3</a></td></tr>\n<tr class=\"memdesc:gaab484fc37dddd84f767d84e38d761649\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium qualifier unsigned integer numbers.  <a href=\"a00145.html#gaab484fc37dddd84f767d84e38d761649\">More...</a><br /></td></tr>\n<tr class=\"separator:gaab484fc37dddd84f767d84e38d761649\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9f64ab6e1618ba357966f18e3e4e6aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa\">mediump_uvec4</a></td></tr>\n<tr class=\"memdesc:gaa9f64ab6e1618ba357966f18e3e4e6aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium qualifier unsigned integer numbers.  <a href=\"a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9f64ab6e1618ba357966f18e3e4e6aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabc61976261c406520c7a8e4d946dc3f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">mediump_vec2</a></td></tr>\n<tr class=\"memdesc:gabc61976261c406520c7a8e4d946dc3f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector of medium single-qualifier floating-point numbers.  <a href=\"a00145.html#gabc61976261c406520c7a8e4d946dc3f0\">More...</a><br /></td></tr>\n<tr class=\"separator:gabc61976261c406520c7a8e4d946dc3f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2384e263df19f1404b733016eff78fca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">mediump_vec3</a></td></tr>\n<tr class=\"memdesc:ga2384e263df19f1404b733016eff78fca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector of medium single-qualifier floating-point numbers.  <a href=\"a00145.html#ga2384e263df19f1404b733016eff78fca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2384e263df19f1404b733016eff78fca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5c6978d3ffba06738416a33083853fc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">mediump_vec4</a></td></tr>\n<tr class=\"memdesc:ga5c6978d3ffba06738416a33083853fc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector of medium single-qualifier floating-point numbers.  <a href=\"a00145.html#ga5c6978d3ffba06738416a33083853fc0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5c6978d3ffba06738416a33083853fc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91ad9478d81a7aaf2593e8d9c3d06a14\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef unsigned int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a></td></tr>\n<tr class=\"memdesc:ga91ad9478d81a7aaf2593e8d9c3d06a14\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer type.  <a href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91ad9478d81a7aaf2593e8d9c3d06a14\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Non-GLSL types that are used to define qualifier-based types. </p>\n<p>The GLSL language allows the user to define the qualifier of a particular variable. In OpenGL's GLSL, these qualifier qualifiers have no effect; they are there for compatibility with OpenGL ES's qualifier qualifiers, where they <em>do</em> have an effect.</p>\n<p>C++ has no language equivalent to qualifier qualifiers. So GLM provides the next-best thing: a number of typedefs of the <a class=\"el\" href=\"a00146.html\">Template types</a> that use a particular qualifier.</p>\n<p>None of these types make any guarantees about the actual qualifier used. </p>\n<h2 class=\"groupheader\">Typedef Documentation</h2>\n<a class=\"anchor\" id=\"ga5d7156af15f362d4007769784a38e148\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, bool, highp&gt; highp_bvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of high qualifier bool numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00220\">220</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae3625991931d1c556452a2c551748730\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, bool, highp&gt; highp_bvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of high qualifier bool numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00329\">329</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa0d2929c4809a6ff51ad616bf81e16e0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, bool, highp&gt; highp_bvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of high qualifier bool numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00424\">424</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga02c6ed0185f84600c3b5001cf0db4746\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, double, highp&gt; highp_dmat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00439\">439</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga458e8160a061147a3a2021c574b19787\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, double, highp&gt; highp_dmat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00457\">457</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga60fe4ae1b320094bc2a8d977505a97f5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, double, highp&gt; highp_dmat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 3 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00480\">480</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b4fed753f9b7c217b0401dc808e780a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, double, highp&gt; highp_dmat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 4 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00503\">503</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6d8eec93e1655d7889d2ef05c3fe580a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, double, highp&gt; highp_dmat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00549\">549</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5922c1b5a0a4973b0256db146aa77049\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, double, highp&gt; highp_dmat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 2 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00526\">526</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaca3b96f84c48db9830b5b0d4b07d1516\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, double, highp&gt; highp_dmat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00567\">567</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga60cb89371783bb18003d3b2f8dbf62f8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, double, highp&gt; highp_dmat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 4 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00590\">590</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga96af41ad54c906b0ed14cbe43ca7db0d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, double, highp&gt; highp_dmat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00659\">659</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad779abbdd0c7594cee515e4546d3db29\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, double, highp&gt; highp_dmat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 2 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00613\">613</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga719750bee4022a646b006d2dda75cb76\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, double, highp&gt; highp_dmat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 3 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00636\">636</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab7e154baf836679251844a5d933bd0aa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, double, highp&gt; highp_dmat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of high qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00677\">677</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga20f7155c9cdcafb74da02d0ef60629a4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, double, highp&gt; highp_dvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of high double-qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00157\">157</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab8a03109aebc121ef69abec50fcdd459\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, double, highp&gt; highp_dvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of high double-qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00267\">267</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9dfeaa53a616848ed067994a2bd18992\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, double, highp&gt; highp_dvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of high double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00370\">370</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e95694987ba35af6f736638be39626a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_float_t highp_float</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.4 Floats</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00103_source.html#l00041\">41</a> of file <a class=\"el\" href=\"a00103_source.html\">type_float.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaabe7eb044941ebf308b53a447d692dc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::highp_int_t highp_int</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier signed integer. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.3 Integers</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00238\">238</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga23594b732ebff0ff9630ddb2a3bad659\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, int, highp&gt; highp_ivec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of high qualifier signed integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00178\">178</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga24acd3b02b156bf0d67eaf17917ec4b7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, int, highp&gt; highp_ivec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of high qualifier signed integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00288\">288</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga08f6be9d594bfc3b488e3e8b02d45518\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, int, highp&gt; highp_ivec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of high qualifier signed integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00388\">388</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4fcceff924fa2dc1f3d5217f68c5f81a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, float, highp &gt; highp_mat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00052\">52</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabb2ee47d6bffb6d6363b34a7c61c8229\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, float, highp &gt; highp_mat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00073\">73</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga441b8e3402eefca108b40f3d22a1baa9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 3, float, highp &gt; highp_mat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 3 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00099\">99</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3b030d815c7c9f77c3c47e708863fd62\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 4, float, highp &gt; highp_mat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 4 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00125\">125</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9f30904176d75657930fa4383618f968\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, float, highp &gt; highp_mat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00177\">177</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga12276a2b151d87c039134c388b5a3746\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 2, float, highp &gt; highp_mat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 2 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00151\">151</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1b33e2669c291268ac4b1c9c296d2dc3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, float, highp &gt; highp_mat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00198\">198</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabb55c60d8c7fb400bf2ed511251ca394\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 4, float, highp &gt; highp_mat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 4 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00224\">224</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga332149037f33cec9d9b583e11c3c8524\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, float, highp &gt; highp_mat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00303\">303</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga39ba2335320534c19db435a27d8bb765\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 2, float, highp &gt; highp_mat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 2 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00250\">250</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf93a24b2e1c4a6f556fbcc796ec90e63\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 3, float, highp &gt; highp_mat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 3 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00276\">276</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga989736bc5e50330ef3ab13d34bebc66f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, float, highp &gt; highp_mat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of high qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00324\">324</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga73e8a694d7fc69143cf25161d18d1dcf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::highp_uint_t highp_uint</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier unsigned integer. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.3 Integers</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00259\">259</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab6d886704d5c7faf85b03e4a36290546\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, uint, highp&gt; highp_uvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of high qualifier unsigned integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00199\">199</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6f83c9b2aa706c9bc77587de13bf287e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, uint, highp&gt; highp_uvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of high qualifier unsigned integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00309\">309</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga09b43516ea6fd2c617fc4bee2995316a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, uint, highp&gt; highp_uvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of high qualifier unsigned integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00406\">406</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa92c1954d71b1e7914874bd787b43d1c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, float, highp &gt; highp_vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of high single-qualifier floating-point numbers. </p>\n<p>High Single-qualifier floating-point vector of 2 components.</p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00136\">136</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaca61dfaccbf2f58f2d8063a4e76b44a9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, float, highp &gt; highp_vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of high single-qualifier floating-point numbers. </p>\n<p>High Single-qualifier floating-point vector of 3 components.</p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00246\">246</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad281decae52948b82feb3a9db8f63a7b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, float, highp &gt; highp_vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of high single-qualifier floating-point numbers. </p>\n<p>High Single-qualifier floating-point vector of 4 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00352\">352</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga39fbc2447d5846af799d075a29c6e46d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, bool, lowp&gt; lowp_bvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of low qualifier bool numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00234\">234</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga916d4e72701db85b64815faf06050111\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, bool, lowp&gt; lowp_bvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of low qualifier bool numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00341\">341</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2e9de03b1c11d11f18ee8da8627a28c6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, bool, lowp&gt; lowp_bvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of low qualifier bool numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00436\">436</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0dfc5624d872b189ab4a82bebca7107c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, double, lowp&gt; lowp_dmat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00427\">427</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga78e7b9e6dcadb7e8ac5562fe0263786c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, double, lowp&gt; lowp_dmat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00445\">445</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4450cd185006155fff0380dad2d70ec4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, double, lowp&gt; lowp_dmat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 3 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00468\">468</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga49b6a11f54dcec866c0ecf17d7685165\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, double, lowp&gt; lowp_dmat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 4 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00491\">491</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadffb225ac88b8a65e1e76233b8bd5768\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, float, lowp&gt; lowp_dmat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00537\">537</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga02af788947516c41893c658990783fd4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, double, lowp&gt; lowp_dmat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 2 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00514\">514</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0bae293e714e00f23e4bbf5a6c000448\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, double, lowp&gt; lowp_dmat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00555\">555</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga42108fc51b1c14745e6edf399c1d0150\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, double, lowp&gt; lowp_dmat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 4 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00578\">578</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5d0f05a7d08f3f058110e1b79f805d7a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, double, lowp&gt; lowp_dmat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00647\">647</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3daec60b56a8d57455cb60d8328f3645\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, double, lowp&gt; lowp_dmat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 2 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00601\">601</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaf5b6171d297b3a1c6c771e8b912c08d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, double, lowp&gt; lowp_dmat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 3 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00624\">624</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga843a2b7ca501078963910ea0b453f970\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, double, lowp&gt; lowp_dmat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of low qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00665\">665</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8e7f034722aaa1895196f0381a1810f5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, double, lowp&gt; lowp_dvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of low double-qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00171\">171</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2b6374e88079410f8b641e21bf6b77a3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, double, lowp&gt; lowp_dvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of low double-qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00281\">281</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabcd63b91329c8213fdae89d0da6ece4c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, double, lowp&gt; lowp_dvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of low double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00382\">382</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga358d69e11b1c0f6c7c469e0d39ab7fd1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef lowp_float_t lowp_float</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.4 Floats</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00103_source.html#l00027\">27</a> of file <a class=\"el\" href=\"a00103_source.html\">type_float.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad0fa1e32e8b3552ed63556eca51c620e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::lowp_int_t lowp_int</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier signed integer. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.3 Integers</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00224\">224</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7ce7e678655c51239b95b2089e8f0e96\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, int, lowp&gt; lowp_ivec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of low qualifier signed integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00192\">192</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga59ae64e8103c0ccf7117bd3bee223ad0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, int, lowp&gt; lowp_ivec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of low qualifier signed integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00302\">302</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga693ad87d8ccd440f0c0423281defeccd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, int, lowp&gt; lowp_ivec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of low qualifier signed integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00400\">400</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga08bba677ef7b2809ac0061fa9a3db854\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, float, lowp &gt; lowp_mat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00038\">38</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga993bdd19989dc1f4d09f664a2ee74cb5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, float, lowp &gt; lowp_mat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00059\">59</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga083089177b89ae9166d8d251a90f4b8b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 3, float, lowp &gt; lowp_mat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 3 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00085\">85</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae6e9638a6d1cadbd22f27c02998ebbf8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 4, float, lowp &gt; lowp_mat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 4 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00111\">111</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacc4e277672e9f7b3cde23a4a3bd24fc9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, float, lowp &gt; lowp_mat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00163\">163</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga10f0f2108800a543f22d90ecf4b40d01\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 2, float, lowp &gt; lowp_mat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 2 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00137\">137</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1e4b7727038383e0103b138c66a65039\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, float, lowp &gt; lowp_mat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00184\">184</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga42a7c3c9eafb869c000b4388913ce0c7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 4, float, lowp &gt; lowp_mat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 4 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00210\">210</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga73e2f3bcae71b05736f2c962f98565a1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, float, lowp &gt; lowp_mat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00289\">289</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9839115cb8be9524f0621caf4bb29665\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 2, float, lowp &gt; lowp_mat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 2 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00236\">236</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7eb333327f0b261237b540496137d55e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 3, float, lowp &gt; lowp_mat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 3 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00262\">262</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8378facff06c21d2092a9a13c9ef0a0b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, float, lowp &gt; lowp_mat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of low qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00310\">310</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga25ebc60727fc8b4a1167665f9ecdca97\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::lowp_uint_t lowp_uint</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier unsigned integer. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.3 Integers</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00245\">245</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3ab41df977e0b21c1c41a314b1011042\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, uint, lowp&gt; lowp_uvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of low qualifier unsigned integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00213\">213</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaacab3ed11290185c279a97edc9255b98\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, uint, lowp&gt; lowp_uvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of low qualifier unsigned integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00323\">323</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4cdf061bac6ded19e940e876eab9b737\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, uint, lowp&gt; lowp_uvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of low qualifier unsigned integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00418\">418</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga30e8baef5d56d5c166872a2bc00f36e9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, float, lowp &gt; lowp_vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of low single-qualifier floating-point numbers. </p>\n<p>Low single-qualifier floating-point vector of 2 components.</p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00150\">150</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga868e8e4470a3ef97c7ee3032bf90dc79\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, float, lowp &gt; lowp_vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of low single-qualifier floating-point numbers. </p>\n<p>Low single-qualifier floating-point vector of 3 components.</p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00260\">260</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gace3acb313c800552a9411953eb8b2ed7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, float, lowp &gt; lowp_vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of low single-qualifier floating-point numbers. </p>\n<p>Low single-qualifier floating-point vector of 4 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00364\">364</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6670d1a61e113c339aac7dd2ae72154b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, bool, mediump&gt; mediump_bvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of medium qualifier bool numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00227\">227</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaabc19c9cf2c0994f3ded6b98f9d37005\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, bool, mediump&gt; mediump_bvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of medium qualifier bool numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00335\">335</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga620d6dce077134eee76e014a3e2b2661\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, bool, mediump&gt; mediump_bvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of medium qualifier bool numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00430\">430</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga963689d328dfa8fcaa4aa140f2e52cd0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, double, mediump&gt; mediump_dmat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00433\">433</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gade27733f04b9a6f723850263ccda908b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, double, mediump&gt; mediump_dmat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00451\">451</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga253243e9a0e6a6235e41351f3d6fbd2e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, double, mediump&gt; mediump_dmat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 3 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00474\">474</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6afa4f5d70f8e0dceed640a26918661b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, double, mediump&gt; mediump_dmat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 4 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00497\">497</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5418e9669f0673640a2fbdeb261aff50\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, double, mediump&gt; mediump_dmat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00543\">543</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2196f803d3b4e1f920acef5b32ab41c4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, double, mediump&gt; mediump_dmat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 2 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00520\">520</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafee0cf7585d59b2485e42e8aae4714ca\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, double, mediump&gt; mediump_dmat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00561\">561</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9e0578807bf8880cea8336dfdb666d69\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, double, mediump&gt; mediump_dmat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 4 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00584\">584</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafaf455c1dff11cb8f3c86467ac27a461\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, double, mediump&gt; mediump_dmat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00653\">653</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga04b32b7cbfddf0f02a8b442f8b376680\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, double, mediump&gt; mediump_dmat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 2 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00607\">607</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga002d912d086a3eaa5425a6c4ca468fea\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, double, mediump&gt; mediump_dmat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 3 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00630\">630</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaeac3848d29b4b47332c44c31d9bcfa2f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, double, mediump&gt; mediump_dmat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of medium qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00671\">671</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga00b74cf6997deedd6a962e0997bc120b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, double, mediump&gt; mediump_dvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of medium double-qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00164\">164</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabcad2ee624723d7add5ce5bf90b6bd2a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, double, mediump&gt; mediump_dvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of medium double-qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00274\">274</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga072fdd19df303b9b821b6793b86c1637\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, double, mediump&gt; mediump_dvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of medium double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00376\">376</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga280c68f537f4b1e03a00b23e62573b98\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_float_t mediump_float</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.4 Floats</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00103_source.html#l00034\">34</a> of file <a class=\"el\" href=\"a00103_source.html\">type_float.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga212ef8f883878cb7430228a279a7d866\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::mediump_int_t mediump_int</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier signed integer. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.3 Integers</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00231\">231</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaabd76afa066badf4489fd0fec28f9537\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, int, mediump&gt; mediump_ivec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of medium qualifier signed integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00185\">185</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf964dcfcbb2088d13c9c321517171154\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, int, mediump&gt; mediump_ivec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of medium qualifier signed integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00295\">295</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7f89d11cd6e64c1814200f8cca083512\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, int, mediump&gt; mediump_ivec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of medium qualifier signed integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00394\">394</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga83fe5281ac0a3d153226b903badd415b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, float, mediump &gt; mediump_mat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00045\">45</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf1beb3328c79fece7dcc34c5b05b57a0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, float, mediump &gt; mediump_mat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 2 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00066\">66</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0bda8ba50fa930ef29d4fa91a85f229a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 3, float, mediump &gt; mediump_mat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 3 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00092\">92</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa190a86a477360f02508191a6549efc3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 4, float, mediump &gt; mediump_mat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 columns of 4 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00118\">118</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad31f8a0097ff6c22b92cf855dfffc575\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, float, mediump &gt; mediump_mat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00170\">170</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga66a044feff0a17b1bf275bc8d200e514\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 2, float, mediump &gt; mediump_mat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 2 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00144\">144</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2c78fa1875926e5c6684ae1f8b49092a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, float, mediump &gt; mediump_mat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 3 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00191\">191</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5bcf41dd2acbace9ed7ae4326cb45e6e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 4, float, mediump &gt; mediump_mat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 columns of 4 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00217\">217</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0f910a2c5bf1c3fd153c4bc13cefee58\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, float, mediump &gt; mediump_mat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00296\">296</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaced6ccfdae150c4465be59c0b15f4d9e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 2, float, mediump &gt; mediump_mat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 2 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00243\">243</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1bab99cd9c4edd4bffdab662609b0961\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 3, float, mediump &gt; mediump_mat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 3 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00269\">269</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga005facdef4caac0ef7435eee609c7e46\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, float, mediump &gt; mediump_mat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 columns of 4 components matrix of medium qualifier floating-point numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00107_source.html#l00317\">317</a> of file <a class=\"el\" href=\"a00107_source.html\">type_mat.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0b7e01c52b9e5bf3369761b79b5f4f8e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::mediump_uint_t mediump_uint</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier unsigned integer. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.3 Integers</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00252\">252</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf2d61afc5b2e4132f72885d4a51f0081\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, uint, mediump&gt; mediump_uvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of medium qualifier unsigned integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00206\">206</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaab484fc37dddd84f767d84e38d761649\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, uint, mediump&gt; mediump_uvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of medium qualifier unsigned integer numbers. </p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00316\">316</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa9f64ab6e1618ba357966f18e3e4e6aa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, uint, mediump&gt; mediump_uvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of medium qualifier unsigned integer numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00412\">412</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabc61976261c406520c7a8e4d946dc3f0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, float, mediump &gt; mediump_vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2 components vector of medium single-qualifier floating-point numbers. </p>\n<p>Medium Single-qualifier floating-point vector of 2 components.</p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00143\">143</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2384e263df19f1404b733016eff78fca\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, float, mediump &gt; mediump_vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>3 components vector of medium single-qualifier floating-point numbers. </p>\n<p>Medium Single-qualifier floating-point vector of 3 components.</p>\n<p>There is no guarantee on the actual qualifier.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00253\">253</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5c6978d3ffba06738416a33083853fc0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, float, mediump &gt; mediump_vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>4 components vector of medium single-qualifier floating-point numbers. </p>\n<p>Medium Single-qualifier floating-point vector of 4 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> </dd>\n<dd>\n<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></dd>\n<dd>\n<a class=\"el\" href=\"a00145.html\" title=\"Non-GLSL types that are used to define qualifier-based types. \">Precision types</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00120_source.html#l00358\">358</a> of file <a class=\"el\" href=\"a00120_source.html\">type_vec.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga91ad9478d81a7aaf2593e8d9c3d06a14\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef unsigned int uint</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 4.1.3 Integers</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00288\">288</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00146.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Template types</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">Template types<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>The generic template types used as the basis for the core types.  \n<a href=\"#details\">More...</a></p>\n<p>The generic template types used as the basis for the core types. </p>\n<p>These types are all templates used to define the actual <a class=\"el\" href=\"a00144.html\">Types</a>. These templetes are implementation details of GLM types and should not be used explicitly. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00147.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Stable extensions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#groups\">Modules</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Stable extensions</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Additional features not specified by GLSL specification.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"groups\"></a>\nModules</h2></td></tr>\n<tr class=\"memitem:a00149\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html\">GLM_GTC_bitfield</a></td></tr>\n<tr class=\"memdesc:a00149\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00009.html\" title=\"GLM_GTC_bitfield \">glm/gtc/bitfield.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00150\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html\">GLM_GTC_color_space</a></td></tr>\n<tr class=\"memdesc:a00150\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00012.html\" title=\"GLM_GTC_color_space \">glm/gtc/color_space.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00151\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html\">GLM_GTC_constants</a></td></tr>\n<tr class=\"memdesc:a00151\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00020.html\" title=\"GLM_GTC_constants \">glm/gtc/constants.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00152\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html\">GLM_GTC_epsilon</a></td></tr>\n<tr class=\"memdesc:a00152\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00022.html\" title=\"GLM_GTC_epsilon \">glm/gtc/epsilon.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00153\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html\">GLM_GTC_integer</a></td></tr>\n<tr class=\"memdesc:a00153\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00039.html\" title=\"GLM_GTC_integer \">glm/gtc/integer.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00154\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html\">GLM_GTC_matrix_access</a></td></tr>\n<tr class=\"memdesc:a00154\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00056.html\" title=\"GLM_GTC_matrix_access \">glm/gtc/matrix_access.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00155\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html\">GLM_GTC_matrix_integer</a></td></tr>\n<tr class=\"memdesc:a00155\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00060.html\" title=\"GLM_GTC_matrix_integer \">glm/gtc/matrix_integer.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00156\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00156.html\">GLM_GTC_matrix_inverse</a></td></tr>\n<tr class=\"memdesc:a00156\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00060.html\" title=\"GLM_GTC_matrix_integer \">glm/gtc/matrix_integer.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00157\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html\">GLM_GTC_matrix_transform</a></td></tr>\n<tr class=\"memdesc:a00157\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00066.html\" title=\"GLM_GTC_matrix_transform \">glm/gtc/matrix_transform.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00158\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00158.html\">GLM_GTC_noise</a></td></tr>\n<tr class=\"memdesc:a00158\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00069.html\" title=\"GLM_GTC_noise \">glm/gtc/noise.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00159\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html\">GLM_GTC_packing</a></td></tr>\n<tr class=\"memdesc:a00159\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00076.html\" title=\"GLM_GTC_packing \">glm/gtc/packing.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00160\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html\">GLM_GTC_quaternion</a></td></tr>\n<tr class=\"memdesc:a00160\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00083.html\" title=\"GLM_GTC_quaternion \">glm/gtc/quaternion.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00161\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html\">GLM_GTC_random</a></td></tr>\n<tr class=\"memdesc:a00161\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00085.html\" title=\"GLM_GTC_random \">glm/gtc/random.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00162\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html\">GLM_GTC_reciprocal</a></td></tr>\n<tr class=\"memdesc:a00162\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00088.html\" title=\"GLM_GTC_reciprocal \">glm/gtc/reciprocal.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00163\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html\">GLM_GTC_round</a></td></tr>\n<tr class=\"memdesc:a00163\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00091.html\" title=\"GLM_GTC_round \">glm/gtc/round.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00164\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html\">GLM_GTC_type_aligned</a></td></tr>\n<tr class=\"memdesc:a00164\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00101.html\" title=\"GLM_GTC_type_aligned \">glm/gtc/type_aligned.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00165\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html\">GLM_GTC_type_precision</a></td></tr>\n<tr class=\"memdesc:a00165\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00117.html\" title=\"GLM_GTC_type_precision \">glm/gtc/type_precision.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00166\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html\">GLM_GTC_type_ptr</a></td></tr>\n<tr class=\"memdesc:a00166\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00118.html\" title=\"GLM_GTC_type_ptr \">glm/gtc/type_ptr.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00167\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html\">GLM_GTC_ulp</a></td></tr>\n<tr class=\"memdesc:a00167\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00125.html\" title=\"GLM_GTC_ulp \">glm/gtc/ulp.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00168\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00168.html\">GLM_GTC_vec1</a></td></tr>\n<tr class=\"memdesc:a00168\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00126.html\" title=\"GLM_GTC_vec1 \">glm/gtc/vec1.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Additional features not specified by GLSL specification. </p>\n<p>GTC extensions aim to be stable.</p>\n<p>Even if it's highly unrecommended, it's possible to include all the extensions at once by including &lt;<a class=\"el\" href=\"a00025.html\" title=\"Core features (Dependence) \">glm/ext.hpp</a>&gt;. Otherwise, each extension needs to be included a specific file. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00148.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Experimental extensions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#groups\">Modules</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Experimental extensions</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Experimental features not specified by GLSL specification.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"groups\"></a>\nModules</h2></td></tr>\n<tr class=\"memitem:a00169\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html\">GLM_GTX_associated_min_max</a></td></tr>\n<tr class=\"memdesc:a00169\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00007.html\" title=\"GLM_GTX_associated_min_max \">glm/gtx/associated_min_max.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00170\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html\">GLM_GTX_bit</a></td></tr>\n<tr class=\"memdesc:a00170\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00008.html\" title=\"GLM_GTX_bit \">glm/gtx/bit.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00171\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00171.html\">GLM_GTX_closest_point</a></td></tr>\n<tr class=\"memdesc:a00171\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00010.html\" title=\"GLM_GTX_closest_point \">glm/gtx/closest_point.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00172\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html\">GLM_GTX_color_encoding</a></td></tr>\n<tr class=\"memdesc:a00172\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00011.html\" title=\"GLM_GTX_color_encoding \">glm/gtx/color_encoding.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00173\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html\">GLM_GTX_color_space</a></td></tr>\n<tr class=\"memdesc:a00173\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00013.html\" title=\"GLM_GTX_color_space \">glm/gtx/color_space.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00174\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html\">GLM_GTX_color_space_YCoCg</a></td></tr>\n<tr class=\"memdesc:a00174\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00014.html\" title=\"GLM_GTX_color_space_YCoCg \">glm/gtx/color_space_YCoCg.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00175\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00175.html\">GLM_GTX_common</a></td></tr>\n<tr class=\"memdesc:a00175\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00016.html\" title=\"GLM_GTX_common \">glm/gtx/common.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00176\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html\">GLM_GTX_compatibility</a></td></tr>\n<tr class=\"memdesc:a00176\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00017.html\" title=\"GLM_GTX_compatibility \">glm/gtx/compatibility.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00177\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html\">GLM_GTX_component_wise</a></td></tr>\n<tr class=\"memdesc:a00177\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00018.html\" title=\"GLM_GTX_component_wise \">glm/gtx/component_wise.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00178\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html\">GLM_GTX_dual_quaternion</a></td></tr>\n<tr class=\"memdesc:a00178\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00021.html\" title=\"GLM_GTX_dual_quaternion \">glm/gtx/dual_quaternion.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00179\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html\">GLM_GTX_euler_angles</a></td></tr>\n<tr class=\"memdesc:a00179\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00023.html\" title=\"GLM_GTX_euler_angles \">glm/gtx/euler_angles.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00180\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00180.html\">GLM_GTX_extend</a></td></tr>\n<tr class=\"memdesc:a00180\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00026.html\" title=\"GLM_GTX_extend \">glm/gtx/extend.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00181\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html\">GLM_GTX_extented_min_max</a></td></tr>\n<tr class=\"memdesc:a00181\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;glm/gtx/extented_min_max.hpp&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00182\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00182.html\">GLM_GTX_exterior_product</a></td></tr>\n<tr class=\"memdesc:a00182\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00028.html\" title=\"GLM_GTX_exterior_product \">glm/gtx/exterior_product.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00183\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html\">GLM_GTX_fast_exponential</a></td></tr>\n<tr class=\"memdesc:a00183\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00029.html\" title=\"GLM_GTX_fast_exponential \">glm/gtx/fast_exponential.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00184\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html\">GLM_GTX_fast_square_root</a></td></tr>\n<tr class=\"memdesc:a00184\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00030.html\" title=\"GLM_GTX_fast_square_root \">glm/gtx/fast_square_root.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00185\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html\">GLM_GTX_fast_trigonometry</a></td></tr>\n<tr class=\"memdesc:a00185\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00031.html\" title=\"GLM_GTX_fast_trigonometry \">glm/gtx/fast_trigonometry.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00186\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00186.html\">GLM_GTX_functions</a></td></tr>\n<tr class=\"memdesc:a00186\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00032.html\" title=\"GLM_GTX_functions \">glm/gtx/functions.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00187\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00187.html\">GLM_GTX_gradient_paint</a></td></tr>\n<tr class=\"memdesc:a00187\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00036.html\" title=\"GLM_GTX_gradient_paint \">glm/gtx/gradient_paint.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00188\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00188.html\">GLM_GTX_handed_coordinate_space</a></td></tr>\n<tr class=\"memdesc:a00188\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;glm/gtx/handed_coordinate_system.hpp&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00189\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00189.html\">GLM_GTX_hash</a></td></tr>\n<tr class=\"memdesc:a00189\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00038.html\" title=\"GLM_GTX_hash \">glm/gtx/hash.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00190\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html\">GLM_GTX_integer</a></td></tr>\n<tr class=\"memdesc:a00190\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00040.html\" title=\"GLM_GTX_integer \">glm/gtx/integer.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00191\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html\">GLM_GTX_intersect</a></td></tr>\n<tr class=\"memdesc:a00191\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00042.html\" title=\"GLM_GTX_intersect \">glm/gtx/intersect.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00192\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00192.html\">GLM_GTX_io</a></td></tr>\n<tr class=\"memdesc:a00192\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00043.html\" title=\"GLM_GTX_io \">glm/gtx/io.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00193\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00193.html\">GLM_GTX_log_base</a></td></tr>\n<tr class=\"memdesc:a00193\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00044.html\" title=\"GLM_GTX_log_base \">glm/gtx/log_base.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00194\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00194.html\">GLM_GTX_matrix_cross_product</a></td></tr>\n<tr class=\"memdesc:a00194\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00057.html\" title=\"GLM_GTX_matrix_cross_product \">glm/gtx/matrix_cross_product.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00195\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00195.html\">GLM_GTX_matrix_decompose</a></td></tr>\n<tr class=\"memdesc:a00195\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00058.html\" title=\"GLM_GTX_matrix_decompose \">glm/gtx/matrix_decompose.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00196\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html\">GLM_GTX_matrix_factorisation</a></td></tr>\n<tr class=\"memdesc:a00196\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00059.html\" title=\"GLM_GTX_matrix_factorisation \">glm/gtx/matrix_factorisation.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00197\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html\">GLM_GTX_matrix_interpolation</a></td></tr>\n<tr class=\"memdesc:a00197\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00061.html\" title=\"GLM_GTX_matrix_interpolation \">glm/gtx/matrix_interpolation.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00198\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html\">GLM_GTX_matrix_major_storage</a></td></tr>\n<tr class=\"memdesc:a00198\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00063.html\" title=\"GLM_GTX_matrix_major_storage \">glm/gtx/matrix_major_storage.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00199\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html\">GLM_GTX_matrix_operation</a></td></tr>\n<tr class=\"memdesc:a00199\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00064.html\" title=\"GLM_GTX_matrix_operation \">glm/gtx/matrix_operation.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00200\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html\">GLM_GTX_matrix_query</a></td></tr>\n<tr class=\"memdesc:a00200\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00065.html\" title=\"GLM_GTX_matrix_query \">glm/gtx/matrix_query.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00201\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html\">GLM_GTX_matrix_transform_2d</a></td></tr>\n<tr class=\"memdesc:a00201\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00067.html\" title=\"GLM_GTX_matrix_transform_2d \">glm/gtx/matrix_transform_2d.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00202\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00202.html\">GLM_GTX_mixed_producte</a></td></tr>\n<tr class=\"memdesc:a00202\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00068.html\" title=\"GLM_GTX_mixed_producte \">glm/gtx/mixed_product.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00203\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html\">GLM_GTX_norm</a></td></tr>\n<tr class=\"memdesc:a00203\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00070.html\" title=\"GLM_GTX_norm \">glm/gtx/norm.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00204\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00204.html\">GLM_GTX_normal</a></td></tr>\n<tr class=\"memdesc:a00204\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00071.html\" title=\"GLM_GTX_normal \">glm/gtx/normal.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00205\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00205.html\">GLM_GTX_normalize_dot</a></td></tr>\n<tr class=\"memdesc:a00205\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;glm/gtx/normalized_dot.hpp&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00206\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html\">GLM_GTX_number_precision</a></td></tr>\n<tr class=\"memdesc:a00206\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00073.html\" title=\"GLM_GTX_number_precision \">glm/gtx/number_precision.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00207\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00207.html\">GLM_GTX_optimum_pow</a></td></tr>\n<tr class=\"memdesc:a00207\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00074.html\" title=\"GLM_GTX_optimum_pow \">glm/gtx/optimum_pow.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00208\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00208.html\">GLM_GTX_orthonormalize</a></td></tr>\n<tr class=\"memdesc:a00208\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00075.html\" title=\"GLM_GTX_orthonormalize \">glm/gtx/orthonormalize.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00209\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00209.html\">GLM_GTX_perpendicular</a></td></tr>\n<tr class=\"memdesc:a00209\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00079.html\" title=\"GLM_GTX_perpendicular \">glm/gtx/perpendicular.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00210\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00210.html\">GLM_GTX_polar_coordinates</a></td></tr>\n<tr class=\"memdesc:a00210\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00080.html\" title=\"GLM_GTX_polar_coordinates \">glm/gtx/polar_coordinates.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00211\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00211.html\">GLM_GTX_projection</a></td></tr>\n<tr class=\"memdesc:a00211\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00081.html\" title=\"GLM_GTX_projection \">glm/gtx/projection.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00212\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html\">GLM_GTX_quaternion</a></td></tr>\n<tr class=\"memdesc:a00212\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00084.html\" title=\"GLM_GTX_quaternion \">glm/gtx/quaternion.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00213\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00213.html\">GLM_GTX_range</a></td></tr>\n<tr class=\"memdesc:a00213\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00086.html\" title=\"GLM_GTX_range \">glm/gtx/range.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00214\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html\">GLM_GTX_raw_data</a></td></tr>\n<tr class=\"memdesc:a00214\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00087.html\" title=\"GLM_GTX_raw_data \">glm/gtx/raw_data.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00215\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00215.html\">GLM_GTX_rotate_normalized_axis</a></td></tr>\n<tr class=\"memdesc:a00215\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00089.html\" title=\"GLM_GTX_rotate_normalized_axis \">glm/gtx/rotate_normalized_axis.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00216\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html\">GLM_GTX_rotate_vector</a></td></tr>\n<tr class=\"memdesc:a00216\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00090.html\" title=\"GLM_GTX_rotate_vector \">glm/gtx/rotate_vector.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00217\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00217.html\">GLM_GTX_scalar_relational</a></td></tr>\n<tr class=\"memdesc:a00217\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00093.html\" title=\"GLM_GTX_scalar_relational \">glm/gtx/scalar_relational.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00218\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00218.html\">GLM_GTX_spline</a></td></tr>\n<tr class=\"memdesc:a00218\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00095.html\" title=\"GLM_GTX_spline \">glm/gtx/spline.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00219\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html\">GLM_GTX_std_based_type</a></td></tr>\n<tr class=\"memdesc:a00219\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00096.html\" title=\"GLM_GTX_std_based_type \">glm/gtx/std_based_type.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00220\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00220.html\">GLM_GTX_string_cast</a></td></tr>\n<tr class=\"memdesc:a00220\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00097.html\" title=\"GLM_GTX_string_cast \">glm/gtx/string_cast.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00221\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00221.html\">GLM_GTX_transform</a></td></tr>\n<tr class=\"memdesc:a00221\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00098.html\" title=\"GLM_GTX_transform \">glm/gtx/transform.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00222\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html\">GLM_GTX_transform2</a></td></tr>\n<tr class=\"memdesc:a00222\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00099.html\" title=\"GLM_GTX_transform2 \">glm/gtx/transform2.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00223\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html\">GLM_GTX_type_aligned</a></td></tr>\n<tr class=\"memdesc:a00223\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00102.html\" title=\"GLM_GTX_type_aligned \">glm/gtx/type_aligned.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00224\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00224.html\">GLM_GTX_type_trait</a></td></tr>\n<tr class=\"memdesc:a00224\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00119.html\" title=\"GLM_GTX_type_trait \">glm/gtx/type_trait.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00225\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00225.html\">GLM_GTX_vec_swizzle</a></td></tr>\n<tr class=\"memdesc:a00225\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00130.html\" title=\"GLM_GTX_vec_swizzle \">glm/gtx/vec_swizzle.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00226\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00226.html\">GLM_GTX_vector_angle</a></td></tr>\n<tr class=\"memdesc:a00226\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00131.html\" title=\"GLM_GTX_vector_angle \">glm/gtx/vector_angle.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00227\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html\">GLM_GTX_vector_query</a></td></tr>\n<tr class=\"memdesc:a00227\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00132.html\" title=\"GLM_GTX_vector_query \">glm/gtx/vector_query.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00228\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html\">GLM_GTX_wrap</a></td></tr>\n<tr class=\"memdesc:a00228\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Include &lt;<a class=\"el\" href=\"a00134.html\" title=\"GLM_GTX_wrap \">glm/gtx/wrap.hpp</a>&gt; to use the features of this extension. <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Experimental features not specified by GLSL specification. </p>\n<p>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.</p>\n<p>Even if it's highly unrecommended, it's possible to include all the extensions at once by including &lt;<a class=\"el\" href=\"a00025.html\" title=\"Core features (Dependence) \">glm/ext.hpp</a>&gt;. Otherwise, each extension needs to be included a specific file. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00149.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_bitfield</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_bitfield<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00009.html\" title=\"GLM_GTC_bitfield \">glm/gtc/bitfield.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga46f9295abe3b5c7658f5b13c7f819f0a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga46f9295abe3b5c7658f5b13c7f819f0a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga46f9295abe3b5c7658f5b13c7f819f0a\">bitfieldFillOne</a> (genIUType Value, int FirstBit, int BitCount)</td></tr>\n<tr class=\"memdesc:ga46f9295abe3b5c7658f5b13c7f819f0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set to 1 a range of bits.  <a href=\"a00149.html#ga46f9295abe3b5c7658f5b13c7f819f0a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga46f9295abe3b5c7658f5b13c7f819f0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e96dd1f0a4bc892f063251ed118c0c1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3e96dd1f0a4bc892f063251ed118c0c1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1\">bitfieldFillOne</a> (vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)</td></tr>\n<tr class=\"memdesc:ga3e96dd1f0a4bc892f063251ed118c0c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set to 1 a range of bits.  <a href=\"a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e96dd1f0a4bc892f063251ed118c0c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga697b86998b7d74ee0a69d8e9f8819fee\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga697b86998b7d74ee0a69d8e9f8819fee\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga697b86998b7d74ee0a69d8e9f8819fee\">bitfieldFillZero</a> (genIUType Value, int FirstBit, int BitCount)</td></tr>\n<tr class=\"memdesc:ga697b86998b7d74ee0a69d8e9f8819fee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set to 0 a range of bits.  <a href=\"a00149.html#ga697b86998b7d74ee0a69d8e9f8819fee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga697b86998b7d74ee0a69d8e9f8819fee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0d16c9acef4be79ea9b47c082a0cf7c2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0d16c9acef4be79ea9b47c082a0cf7c2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2\">bitfieldFillZero</a> (vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)</td></tr>\n<tr class=\"memdesc:ga0d16c9acef4be79ea9b47c082a0cf7c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set to 0 a range of bits.  <a href=\"a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0d16c9acef4be79ea9b47c082a0cf7c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga24cad0069f9a0450abd80b3e89501adf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga24cad0069f9a0450abd80b3e89501adf\">bitfieldInterleave</a> (int8 x, int8 y)</td></tr>\n<tr class=\"memdesc:ga24cad0069f9a0450abd80b3e89501adf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#ga24cad0069f9a0450abd80b3e89501adf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga24cad0069f9a0450abd80b3e89501adf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9a4976a529aec2cee56525e1165da484\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga9a4976a529aec2cee56525e1165da484\">bitfieldInterleave</a> (uint8 x, uint8 y)</td></tr>\n<tr class=\"memdesc:ga9a4976a529aec2cee56525e1165da484\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#ga9a4976a529aec2cee56525e1165da484\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9a4976a529aec2cee56525e1165da484\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac51c33a394593f0631fa3aa5bb778809\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gac51c33a394593f0631fa3aa5bb778809\">bitfieldInterleave</a> (int16 x, int16 y)</td></tr>\n<tr class=\"memdesc:gac51c33a394593f0631fa3aa5bb778809\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#gac51c33a394593f0631fa3aa5bb778809\">More...</a><br /></td></tr>\n<tr class=\"separator:gac51c33a394593f0631fa3aa5bb778809\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga94f3646a5667f4be56f8dcf3310e963f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga94f3646a5667f4be56f8dcf3310e963f\">bitfieldInterleave</a> (uint16 x, uint16 y)</td></tr>\n<tr class=\"memdesc:ga94f3646a5667f4be56f8dcf3310e963f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#ga94f3646a5667f4be56f8dcf3310e963f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga94f3646a5667f4be56f8dcf3310e963f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebb756a24a0784e3d6fba8bd011ab77a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gaebb756a24a0784e3d6fba8bd011ab77a\">bitfieldInterleave</a> (int32 x, int32 y)</td></tr>\n<tr class=\"memdesc:gaebb756a24a0784e3d6fba8bd011ab77a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#gaebb756a24a0784e3d6fba8bd011ab77a\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebb756a24a0784e3d6fba8bd011ab77a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2f1e2b3fe699e7d897ae38b2115ddcbd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga2f1e2b3fe699e7d897ae38b2115ddcbd\">bitfieldInterleave</a> (uint32 x, uint32 y)</td></tr>\n<tr class=\"memdesc:ga2f1e2b3fe699e7d897ae38b2115ddcbd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x and y.  <a href=\"a00149.html#ga2f1e2b3fe699e7d897ae38b2115ddcbd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2f1e2b3fe699e7d897ae38b2115ddcbd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8fdb724dccd4a07d57efc01147102137\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga8fdb724dccd4a07d57efc01147102137\">bitfieldInterleave</a> (int8 x, int8 y, int8 z)</td></tr>\n<tr class=\"memdesc:ga8fdb724dccd4a07d57efc01147102137\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#ga8fdb724dccd4a07d57efc01147102137\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8fdb724dccd4a07d57efc01147102137\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9fc2a0dd5dcf8b00e113f272a5feca93\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga9fc2a0dd5dcf8b00e113f272a5feca93\">bitfieldInterleave</a> (uint8 x, uint8 y, uint8 z)</td></tr>\n<tr class=\"memdesc:ga9fc2a0dd5dcf8b00e113f272a5feca93\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#ga9fc2a0dd5dcf8b00e113f272a5feca93\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9fc2a0dd5dcf8b00e113f272a5feca93\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa901c36a842fa5d126ea650549f17b24\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gaa901c36a842fa5d126ea650549f17b24\">bitfieldInterleave</a> (int16 x, int16 y, int16 z)</td></tr>\n<tr class=\"memdesc:gaa901c36a842fa5d126ea650549f17b24\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#gaa901c36a842fa5d126ea650549f17b24\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa901c36a842fa5d126ea650549f17b24\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3afd6d38881fe3948c53d4214d2197fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga3afd6d38881fe3948c53d4214d2197fd\">bitfieldInterleave</a> (uint16 x, uint16 y, uint16 z)</td></tr>\n<tr class=\"memdesc:ga3afd6d38881fe3948c53d4214d2197fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#ga3afd6d38881fe3948c53d4214d2197fd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3afd6d38881fe3948c53d4214d2197fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad2075d96a6640121edaa98ea534102ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gad2075d96a6640121edaa98ea534102ca\">bitfieldInterleave</a> (int32 x, int32 y, int32 z)</td></tr>\n<tr class=\"memdesc:gad2075d96a6640121edaa98ea534102ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#gad2075d96a6640121edaa98ea534102ca\">More...</a><br /></td></tr>\n<tr class=\"separator:gad2075d96a6640121edaa98ea534102ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab19fbc739fc0cf7247978602c36f7da8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gab19fbc739fc0cf7247978602c36f7da8\">bitfieldInterleave</a> (uint32 x, uint32 y, uint32 z)</td></tr>\n<tr class=\"memdesc:gab19fbc739fc0cf7247978602c36f7da8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y and z.  <a href=\"a00149.html#gab19fbc739fc0cf7247978602c36f7da8\">More...</a><br /></td></tr>\n<tr class=\"separator:gab19fbc739fc0cf7247978602c36f7da8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8a44ae22f5c953b296c42d067dccbe6d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga8a44ae22f5c953b296c42d067dccbe6d\">bitfieldInterleave</a> (int8 x, int8 y, int8 z, int8 w)</td></tr>\n<tr class=\"memdesc:ga8a44ae22f5c953b296c42d067dccbe6d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y, z and w.  <a href=\"a00149.html#ga8a44ae22f5c953b296c42d067dccbe6d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8a44ae22f5c953b296c42d067dccbe6d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga14bb274d54a3c26f4919dd7ed0dd0c36\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga14bb274d54a3c26f4919dd7ed0dd0c36\">bitfieldInterleave</a> (uint8 x, uint8 y, uint8 z, uint8 w)</td></tr>\n<tr class=\"memdesc:ga14bb274d54a3c26f4919dd7ed0dd0c36\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y, z and w.  <a href=\"a00149.html#ga14bb274d54a3c26f4919dd7ed0dd0c36\">More...</a><br /></td></tr>\n<tr class=\"separator:ga14bb274d54a3c26f4919dd7ed0dd0c36\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga180a63161e1319fbd5a53c84d0429c7a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga180a63161e1319fbd5a53c84d0429c7a\">bitfieldInterleave</a> (int16 x, int16 y, int16 z, int16 w)</td></tr>\n<tr class=\"memdesc:ga180a63161e1319fbd5a53c84d0429c7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y, z and w.  <a href=\"a00149.html#ga180a63161e1319fbd5a53c84d0429c7a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga180a63161e1319fbd5a53c84d0429c7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafca8768671a14c8016facccb66a89f26\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">bitfieldInterleave</a> (uint16 x, uint16 y, uint16 z, uint16 w)</td></tr>\n<tr class=\"memdesc:gafca8768671a14c8016facccb66a89f26\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Interleaves the bits of x, y, z and w.  <a href=\"a00149.html#gafca8768671a14c8016facccb66a89f26\">More...</a><br /></td></tr>\n<tr class=\"separator:gafca8768671a14c8016facccb66a89f26\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2eb49678a344ce1495bdb5586d9896b9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga2eb49678a344ce1495bdb5586d9896b9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga2eb49678a344ce1495bdb5586d9896b9\">bitfieldRotateLeft</a> (genIUType In, int Shift)</td></tr>\n<tr class=\"memdesc:ga2eb49678a344ce1495bdb5586d9896b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate all bits to the left.  <a href=\"a00149.html#ga2eb49678a344ce1495bdb5586d9896b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2eb49678a344ce1495bdb5586d9896b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae186317091b1a39214ebf79008d44a1e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae186317091b1a39214ebf79008d44a1e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gae186317091b1a39214ebf79008d44a1e\">bitfieldRotateLeft</a> (vec&lt; L, T, Q &gt; const &amp;In, int Shift)</td></tr>\n<tr class=\"memdesc:gae186317091b1a39214ebf79008d44a1e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate all bits to the left.  <a href=\"a00149.html#gae186317091b1a39214ebf79008d44a1e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae186317091b1a39214ebf79008d44a1e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1c33d075c5fb8bd8dbfd5092bfc851ca\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga1c33d075c5fb8bd8dbfd5092bfc851ca\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga1c33d075c5fb8bd8dbfd5092bfc851ca\">bitfieldRotateRight</a> (genIUType In, int Shift)</td></tr>\n<tr class=\"memdesc:ga1c33d075c5fb8bd8dbfd5092bfc851ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate all bits to the right.  <a href=\"a00149.html#ga1c33d075c5fb8bd8dbfd5092bfc851ca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1c33d075c5fb8bd8dbfd5092bfc851ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88\">bitfieldRotateRight</a> (vec&lt; L, T, Q &gt; const &amp;In, int Shift)</td></tr>\n<tr class=\"memdesc:ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate all bits to the right.  <a href=\"a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88\">More...</a><br /></td></tr>\n<tr class=\"separator:ga590488e1fc00a6cfe5d3bcaf93fbfe88\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad7eba518a0b71662114571ee76939f8a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gad7eba518a0b71662114571ee76939f8a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#gad7eba518a0b71662114571ee76939f8a\">mask</a> (genIUType Bits)</td></tr>\n<tr class=\"memdesc:gad7eba518a0b71662114571ee76939f8a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a mask of 'count' bits.  <a href=\"a00149.html#gad7eba518a0b71662114571ee76939f8a\">More...</a><br /></td></tr>\n<tr class=\"separator:gad7eba518a0b71662114571ee76939f8a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e64e3b922a296033b825311e7f5fff1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2e64e3b922a296033b825311e7f5fff1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00149.html#ga2e64e3b922a296033b825311e7f5fff1\">mask</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga2e64e3b922a296033b825311e7f5fff1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a mask of 'count' bits.  <a href=\"a00149.html#ga2e64e3b922a296033b825311e7f5fff1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e64e3b922a296033b825311e7f5fff1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00009.html\" title=\"GLM_GTC_bitfield \">glm/gtc/bitfield.hpp</a>&gt; to use the features of this extension. </p>\n<p>Allow to perform bit operations on integer values </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga46f9295abe3b5c7658f5b13c7f819f0a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::bitfieldFillOne </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>FirstBit</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>BitCount</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Set to 1 a range of bits. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3e96dd1f0a4bc892f063251ed118c0c1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::bitfieldFillOne </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Value</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>FirstBit</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>BitCount</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Set to 1 a range of bits. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed and unsigned integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga697b86998b7d74ee0a69d8e9f8819fee\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::bitfieldFillZero </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>FirstBit</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>BitCount</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Set to 0 a range of bits. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0d16c9acef4be79ea9b47c082a0cf7c2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::bitfieldFillZero </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Value</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>FirstBit</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>BitCount</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Set to 0 a range of bits. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed and unsigned integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga24cad0069f9a0450abd80b3e89501adf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int16 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x and y. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9a4976a529aec2cee56525e1165da484\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x and y. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac51c33a394593f0631fa3aa5bb778809\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int32 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x and y. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga94f3646a5667f4be56f8dcf3310e963f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x and y. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaebb756a24a0784e3d6fba8bd011ab77a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int64 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x and y. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2f1e2b3fe699e7d897ae38b2115ddcbd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x and y. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8fdb724dccd4a07d57efc01147102137\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int32 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y and z. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9fc2a0dd5dcf8b00e113f272a5feca93\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y and z. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa901c36a842fa5d126ea650549f17b24\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int64 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y and z. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3afd6d38881fe3948c53d4214d2197fd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y and z. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad2075d96a6640121edaa98ea534102ca\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int64 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y and z. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab19fbc739fc0cf7247978602c36f7da8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y and z. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8a44ae22f5c953b296c42d067dccbe6d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int32 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y, z and w. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga14bb274d54a3c26f4919dd7ed0dd0c36\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y, z and w. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga180a63161e1319fbd5a53c84d0429c7a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int64 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y, z and w. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafca8768671a14c8016facccb66a89f26\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::bitfieldInterleave </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Interleaves the bits of x, y, z and w. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2eb49678a344ce1495bdb5586d9896b9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::bitfieldRotateLeft </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>In</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>Shift</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate all bits to the left. </p>\n<p>All the bits dropped in the left side are inserted back on the right side.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae186317091b1a39214ebf79008d44a1e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::bitfieldRotateLeft </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>In</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>Shift</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate all bits to the left. </p>\n<p>All the bits dropped in the left side are inserted back on the right side.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed and unsigned integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1c33d075c5fb8bd8dbfd5092bfc851ca\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::bitfieldRotateRight </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>In</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>Shift</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate all bits to the right. </p>\n<p>All the bits dropped in the right side are inserted back on the left side.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga590488e1fc00a6cfe5d3bcaf93fbfe88\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::bitfieldRotateRight </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>In</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>Shift</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate all bits to the right. </p>\n<p>All the bits dropped in the right side are inserted back on the left side.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed and unsigned integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad7eba518a0b71662114571ee76939f8a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::mask </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Bits</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a mask of 'count' bits. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2e64e3b922a296033b825311e7f5fff1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::mask </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a mask of 'count' bits. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed and unsigned integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00149.html\" title=\"Include <glm/gtc/bitfield.hpp> to use the features of this extension. \">GLM_GTC_bitfield</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00150.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_color_space</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_color_space<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00012.html\" title=\"GLM_GTC_color_space \">glm/gtc/color_space.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga42239e7b3da900f7ef37cec7e2476579\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga42239e7b3da900f7ef37cec7e2476579\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html#ga42239e7b3da900f7ef37cec7e2476579\">convertLinearToSRGB</a> (vec&lt; L, T, Q &gt; const &amp;ColorLinear)</td></tr>\n<tr class=\"memdesc:ga42239e7b3da900f7ef37cec7e2476579\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a linear color to sRGB color using a standard gamma correction.  <a href=\"a00150.html#ga42239e7b3da900f7ef37cec7e2476579\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42239e7b3da900f7ef37cec7e2476579\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaace0a21167d13d26116c283009af57f6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaace0a21167d13d26116c283009af57f6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html#gaace0a21167d13d26116c283009af57f6\">convertLinearToSRGB</a> (vec&lt; L, T, Q &gt; const &amp;ColorLinear, T Gamma)</td></tr>\n<tr class=\"memdesc:gaace0a21167d13d26116c283009af57f6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a linear color to sRGB color using a custom gamma correction.  <a href=\"a00150.html#gaace0a21167d13d26116c283009af57f6\">More...</a><br /></td></tr>\n<tr class=\"separator:gaace0a21167d13d26116c283009af57f6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16c798b7a226b2c3079dedc55083d187\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga16c798b7a226b2c3079dedc55083d187\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html#ga16c798b7a226b2c3079dedc55083d187\">convertSRGBToLinear</a> (vec&lt; L, T, Q &gt; const &amp;ColorSRGB)</td></tr>\n<tr class=\"memdesc:ga16c798b7a226b2c3079dedc55083d187\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a sRGB color to linear color using a standard gamma correction.  <a href=\"a00150.html#ga16c798b7a226b2c3079dedc55083d187\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16c798b7a226b2c3079dedc55083d187\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1b91f27a9726c9cb403f9fee6e2e200\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gad1b91f27a9726c9cb403f9fee6e2e200\"></a>\ntemplate&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad1b91f27a9726c9cb403f9fee6e2e200\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00150.html#gad1b91f27a9726c9cb403f9fee6e2e200\">convertSRGBToLinear</a> (vec&lt; L, T, Q &gt; const &amp;ColorSRGB, T Gamma)</td></tr>\n<tr class=\"memdesc:gad1b91f27a9726c9cb403f9fee6e2e200\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a sRGB color to linear color using a custom gamma correction. <br /></td></tr>\n<tr class=\"separator:gad1b91f27a9726c9cb403f9fee6e2e200\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00012.html\" title=\"GLM_GTC_color_space \">glm/gtc/color_space.hpp</a>&gt; to use the features of this extension. </p>\n<p>Allow to perform bit operations on integer values </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga42239e7b3da900f7ef37cec7e2476579\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::convertLinearToSRGB </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>ColorLinear</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a linear color to sRGB color using a standard gamma correction. </p>\n<p>IEC 61966-2-1:1999 / Rec. 709 specification <a href=\"https://www.w3.org/Graphics/Color/srgb\">https://www.w3.org/Graphics/Color/srgb</a> </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaace0a21167d13d26116c283009af57f6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::convertLinearToSRGB </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>ColorLinear</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>Gamma</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a linear color to sRGB color using a custom gamma correction. </p>\n<p>IEC 61966-2-1:1999 / Rec. 709 specification <a href=\"https://www.w3.org/Graphics/Color/srgb\">https://www.w3.org/Graphics/Color/srgb</a> </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga16c798b7a226b2c3079dedc55083d187\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::convertSRGBToLinear </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>ColorSRGB</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a sRGB color to linear color using a standard gamma correction. </p>\n<p>IEC 61966-2-1:1999 / Rec. 709 specification <a href=\"https://www.w3.org/Graphics/Color/srgb\">https://www.w3.org/Graphics/Color/srgb</a> </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00151.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_constants</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_constants<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00020.html\" title=\"GLM_GTC_constants \">glm/gtc/constants.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">e</a> ()</td></tr>\n<tr class=\"memdesc:ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return e constant.  <a href=\"a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b7956eb6e2fbedfc7cf2e46e85c5139\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a1e57fc5592b69cfae84174cbfc9429\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2a1e57fc5592b69cfae84174cbfc9429\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">epsilon</a> ()</td></tr>\n<tr class=\"memdesc:ga2a1e57fc5592b69cfae84174cbfc9429\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the epsilon constant for floating point types.  <a href=\"a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2a1e57fc5592b69cfae84174cbfc9429\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad8fe2e6f90bce9d829e9723b649fbd42\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad8fe2e6f90bce9d829e9723b649fbd42\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gad8fe2e6f90bce9d829e9723b649fbd42\">euler</a> ()</td></tr>\n<tr class=\"memdesc:gad8fe2e6f90bce9d829e9723b649fbd42\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return Euler's constant.  <a href=\"a00151.html#gad8fe2e6f90bce9d829e9723b649fbd42\">More...</a><br /></td></tr>\n<tr class=\"separator:gad8fe2e6f90bce9d829e9723b649fbd42\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga753950e5140e4ea6a88e4a18ba61dc09\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga753950e5140e4ea6a88e4a18ba61dc09\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga753950e5140e4ea6a88e4a18ba61dc09\">four_over_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga753950e5140e4ea6a88e4a18ba61dc09\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 4 / pi.  <a href=\"a00151.html#ga753950e5140e4ea6a88e4a18ba61dc09\">More...</a><br /></td></tr>\n<tr class=\"separator:ga753950e5140e4ea6a88e4a18ba61dc09\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga748cf8642830657c5b7eae04d0a80899\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga748cf8642830657c5b7eae04d0a80899\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga748cf8642830657c5b7eae04d0a80899\">golden_ratio</a> ()</td></tr>\n<tr class=\"memdesc:ga748cf8642830657c5b7eae04d0a80899\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the golden ratio constant.  <a href=\"a00151.html#ga748cf8642830657c5b7eae04d0a80899\">More...</a><br /></td></tr>\n<tr class=\"separator:ga748cf8642830657c5b7eae04d0a80899\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c36b41d462e45641faf7d7938948bac\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga0c36b41d462e45641faf7d7938948bac\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga0c36b41d462e45641faf7d7938948bac\">half_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga0c36b41d462e45641faf7d7938948bac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return pi / 2.  <a href=\"a00151.html#ga0c36b41d462e45641faf7d7938948bac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0c36b41d462e45641faf7d7938948bac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaca94292c839ed31a405ab7a81ae7e850\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaca94292c839ed31a405ab7a81ae7e850\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gaca94292c839ed31a405ab7a81ae7e850\">ln_ln_two</a> ()</td></tr>\n<tr class=\"memdesc:gaca94292c839ed31a405ab7a81ae7e850\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return ln(ln(2)).  <a href=\"a00151.html#gaca94292c839ed31a405ab7a81ae7e850\">More...</a><br /></td></tr>\n<tr class=\"separator:gaca94292c839ed31a405ab7a81ae7e850\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf97ebc6c059ffd788e6c4946f71ef66c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaf97ebc6c059ffd788e6c4946f71ef66c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gaf97ebc6c059ffd788e6c4946f71ef66c\">ln_ten</a> ()</td></tr>\n<tr class=\"memdesc:gaf97ebc6c059ffd788e6c4946f71ef66c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return ln(10).  <a href=\"a00151.html#gaf97ebc6c059ffd788e6c4946f71ef66c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf97ebc6c059ffd788e6c4946f71ef66c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga24f4d27765678116f41a2f336ab7975c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga24f4d27765678116f41a2f336ab7975c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga24f4d27765678116f41a2f336ab7975c\">ln_two</a> ()</td></tr>\n<tr class=\"memdesc:ga24f4d27765678116f41a2f336ab7975c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return ln(2).  <a href=\"a00151.html#ga24f4d27765678116f41a2f336ab7975c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga24f4d27765678116f41a2f336ab7975c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39c2fb227631ca25894326529bdd1ee5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga39c2fb227631ca25894326529bdd1ee5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga39c2fb227631ca25894326529bdd1ee5\">one</a> ()</td></tr>\n<tr class=\"memdesc:ga39c2fb227631ca25894326529bdd1ee5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1.  <a href=\"a00151.html#ga39c2fb227631ca25894326529bdd1ee5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga39c2fb227631ca25894326529bdd1ee5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga555150da2b06d23c8738981d5013e0eb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga555150da2b06d23c8738981d5013e0eb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga555150da2b06d23c8738981d5013e0eb\">one_over_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga555150da2b06d23c8738981d5013e0eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1 / pi.  <a href=\"a00151.html#ga555150da2b06d23c8738981d5013e0eb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga555150da2b06d23c8738981d5013e0eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga788fa23a0939bac4d1d0205fb4f35818\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga788fa23a0939bac4d1d0205fb4f35818\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga788fa23a0939bac4d1d0205fb4f35818\">one_over_root_two</a> ()</td></tr>\n<tr class=\"memdesc:ga788fa23a0939bac4d1d0205fb4f35818\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1 / sqrt(2).  <a href=\"a00151.html#ga788fa23a0939bac4d1d0205fb4f35818\">More...</a><br /></td></tr>\n<tr class=\"separator:ga788fa23a0939bac4d1d0205fb4f35818\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7c922b427986cbb2e4c6ac69874eefbc\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga7c922b427986cbb2e4c6ac69874eefbc\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga7c922b427986cbb2e4c6ac69874eefbc\">one_over_two_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga7c922b427986cbb2e4c6ac69874eefbc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1 / (pi * 2).  <a href=\"a00151.html#ga7c922b427986cbb2e4c6ac69874eefbc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7c922b427986cbb2e4c6ac69874eefbc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga94bafeb2a0f23ab6450fed1f98ee4e45\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga94bafeb2a0f23ab6450fed1f98ee4e45\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga94bafeb2a0f23ab6450fed1f98ee4e45\">pi</a> ()</td></tr>\n<tr class=\"memdesc:ga94bafeb2a0f23ab6450fed1f98ee4e45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the pi constant.  <a href=\"a00151.html#ga94bafeb2a0f23ab6450fed1f98ee4e45\">More...</a><br /></td></tr>\n<tr class=\"separator:ga94bafeb2a0f23ab6450fed1f98ee4e45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3c9df42bd73c519a995c43f0f99e77e0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga3c9df42bd73c519a995c43f0f99e77e0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga3c9df42bd73c519a995c43f0f99e77e0\">quarter_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga3c9df42bd73c519a995c43f0f99e77e0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return pi / 4.  <a href=\"a00151.html#ga3c9df42bd73c519a995c43f0f99e77e0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3c9df42bd73c519a995c43f0f99e77e0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae9ebbded75b53d4faeb1e4ef8b3347a2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae9ebbded75b53d4faeb1e4ef8b3347a2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gae9ebbded75b53d4faeb1e4ef8b3347a2\">root_five</a> ()</td></tr>\n<tr class=\"memdesc:gae9ebbded75b53d4faeb1e4ef8b3347a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(5).  <a href=\"a00151.html#gae9ebbded75b53d4faeb1e4ef8b3347a2\">More...</a><br /></td></tr>\n<tr class=\"separator:gae9ebbded75b53d4faeb1e4ef8b3347a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4e276cb823cc5e612d4f89ed99c75039\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4e276cb823cc5e612d4f89ed99c75039\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga4e276cb823cc5e612d4f89ed99c75039\">root_half_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga4e276cb823cc5e612d4f89ed99c75039\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(pi / 2).  <a href=\"a00151.html#ga4e276cb823cc5e612d4f89ed99c75039\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4e276cb823cc5e612d4f89ed99c75039\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4129412e96b33707a77c1a07652e23e2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4129412e96b33707a77c1a07652e23e2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga4129412e96b33707a77c1a07652e23e2\">root_ln_four</a> ()</td></tr>\n<tr class=\"memdesc:ga4129412e96b33707a77c1a07652e23e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(ln(4)).  <a href=\"a00151.html#ga4129412e96b33707a77c1a07652e23e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4129412e96b33707a77c1a07652e23e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga261380796b2cd496f68d2cf1d08b8eb9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga261380796b2cd496f68d2cf1d08b8eb9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga261380796b2cd496f68d2cf1d08b8eb9\">root_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga261380796b2cd496f68d2cf1d08b8eb9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return square root of pi.  <a href=\"a00151.html#ga261380796b2cd496f68d2cf1d08b8eb9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga261380796b2cd496f68d2cf1d08b8eb9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f286be4abe88be1eed7d2a9f6cb193e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4f286be4abe88be1eed7d2a9f6cb193e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga4f286be4abe88be1eed7d2a9f6cb193e\">root_three</a> ()</td></tr>\n<tr class=\"memdesc:ga4f286be4abe88be1eed7d2a9f6cb193e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(3).  <a href=\"a00151.html#ga4f286be4abe88be1eed7d2a9f6cb193e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f286be4abe88be1eed7d2a9f6cb193e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74e607d29020f100c0d0dc46ce2ca950\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga74e607d29020f100c0d0dc46ce2ca950\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga74e607d29020f100c0d0dc46ce2ca950\">root_two</a> ()</td></tr>\n<tr class=\"memdesc:ga74e607d29020f100c0d0dc46ce2ca950\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(2).  <a href=\"a00151.html#ga74e607d29020f100c0d0dc46ce2ca950\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74e607d29020f100c0d0dc46ce2ca950\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2bcedc575039fe0cd765742f8bbb0bd3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2bcedc575039fe0cd765742f8bbb0bd3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga2bcedc575039fe0cd765742f8bbb0bd3\">root_two_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga2bcedc575039fe0cd765742f8bbb0bd3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return sqrt(2 * pi).  <a href=\"a00151.html#ga2bcedc575039fe0cd765742f8bbb0bd3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2bcedc575039fe0cd765742f8bbb0bd3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3077c6311010a214b69ddc8214ec13b5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga3077c6311010a214b69ddc8214ec13b5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga3077c6311010a214b69ddc8214ec13b5\">third</a> ()</td></tr>\n<tr class=\"memdesc:ga3077c6311010a214b69ddc8214ec13b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 1 / 3.  <a href=\"a00151.html#ga3077c6311010a214b69ddc8214ec13b5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3077c6311010a214b69ddc8214ec13b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae94950df74b0ce382b1fc1d978ef7394\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae94950df74b0ce382b1fc1d978ef7394\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gae94950df74b0ce382b1fc1d978ef7394\">three_over_two_pi</a> ()</td></tr>\n<tr class=\"memdesc:gae94950df74b0ce382b1fc1d978ef7394\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return pi / 2 * 3.  <a href=\"a00151.html#gae94950df74b0ce382b1fc1d978ef7394\">More...</a><br /></td></tr>\n<tr class=\"separator:gae94950df74b0ce382b1fc1d978ef7394\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74eadc8a211253079683219a3ea0462a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga74eadc8a211253079683219a3ea0462a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga74eadc8a211253079683219a3ea0462a\">two_over_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga74eadc8a211253079683219a3ea0462a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 2 / pi.  <a href=\"a00151.html#ga74eadc8a211253079683219a3ea0462a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74eadc8a211253079683219a3ea0462a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5827301817640843cf02026a8d493894\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga5827301817640843cf02026a8d493894\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga5827301817640843cf02026a8d493894\">two_over_root_pi</a> ()</td></tr>\n<tr class=\"memdesc:ga5827301817640843cf02026a8d493894\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 2 / sqrt(pi).  <a href=\"a00151.html#ga5827301817640843cf02026a8d493894\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5827301817640843cf02026a8d493894\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa5276a4617566abcfe49286f40e3a256\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa5276a4617566abcfe49286f40e3a256\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#gaa5276a4617566abcfe49286f40e3a256\">two_pi</a> ()</td></tr>\n<tr class=\"memdesc:gaa5276a4617566abcfe49286f40e3a256\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return pi * 2.  <a href=\"a00151.html#gaa5276a4617566abcfe49286f40e3a256\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa5276a4617566abcfe49286f40e3a256\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9b4d2f4322edcf63a6737b92a29dd1f5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9b4d2f4322edcf63a6737b92a29dd1f5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga9b4d2f4322edcf63a6737b92a29dd1f5\">two_thirds</a> ()</td></tr>\n<tr class=\"memdesc:ga9b4d2f4322edcf63a6737b92a29dd1f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 2 / 3.  <a href=\"a00151.html#ga9b4d2f4322edcf63a6737b92a29dd1f5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9b4d2f4322edcf63a6737b92a29dd1f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga788f5a421fc0f40a1296ebc094cbaa8a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga788f5a421fc0f40a1296ebc094cbaa8a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00151.html#ga788f5a421fc0f40a1296ebc094cbaa8a\">zero</a> ()</td></tr>\n<tr class=\"memdesc:ga788f5a421fc0f40a1296ebc094cbaa8a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return 0.  <a href=\"a00151.html#ga788f5a421fc0f40a1296ebc094cbaa8a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga788f5a421fc0f40a1296ebc094cbaa8a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00020.html\" title=\"GLM_GTC_constants \">glm/gtc/constants.hpp</a>&gt; to use the features of this extension. </p>\n<p>Provide a list of constants and precomputed useful values. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga4b7956eb6e2fbedfc7cf2e46e85c5139\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::e </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return e constant. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2a1e57fc5592b69cfae84174cbfc9429\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::epsilon </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the epsilon constant for floating point types. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad8fe2e6f90bce9d829e9723b649fbd42\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::euler </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return Euler's constant. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga753950e5140e4ea6a88e4a18ba61dc09\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::four_over_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 4 / pi. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga748cf8642830657c5b7eae04d0a80899\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::golden_ratio </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the golden ratio constant. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0c36b41d462e45641faf7d7938948bac\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::half_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return pi / 2. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaca94292c839ed31a405ab7a81ae7e850\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::ln_ln_two </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return ln(ln(2)). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf97ebc6c059ffd788e6c4946f71ef66c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::ln_ten </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return ln(10). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga24f4d27765678116f41a2f336ab7975c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::ln_two </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return ln(2). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga39c2fb227631ca25894326529bdd1ee5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::one </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 1. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga555150da2b06d23c8738981d5013e0eb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::one_over_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 1 / pi. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga788fa23a0939bac4d1d0205fb4f35818\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::one_over_root_two </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 1 / sqrt(2). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7c922b427986cbb2e4c6ac69874eefbc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::one_over_two_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 1 / (pi * 2). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga94bafeb2a0f23ab6450fed1f98ee4e45\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the pi constant. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3c9df42bd73c519a995c43f0f99e77e0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::quarter_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return pi / 4. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae9ebbded75b53d4faeb1e4ef8b3347a2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::root_five </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return sqrt(5). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4e276cb823cc5e612d4f89ed99c75039\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::root_half_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return sqrt(pi / 2). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4129412e96b33707a77c1a07652e23e2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::root_ln_four </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return sqrt(ln(4)). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga261380796b2cd496f68d2cf1d08b8eb9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::root_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return square root of pi. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4f286be4abe88be1eed7d2a9f6cb193e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::root_three </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return sqrt(3). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga74e607d29020f100c0d0dc46ce2ca950\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::root_two </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return sqrt(2). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2bcedc575039fe0cd765742f8bbb0bd3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::root_two_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return sqrt(2 * pi). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3077c6311010a214b69ddc8214ec13b5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::third </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 1 / 3. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae94950df74b0ce382b1fc1d978ef7394\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::three_over_two_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return pi / 2 * 3. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga74eadc8a211253079683219a3ea0462a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::two_over_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 2 / pi. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5827301817640843cf02026a8d493894\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::two_over_root_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 2 / sqrt(pi). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa5276a4617566abcfe49286f40e3a256\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::two_pi </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return pi * 2. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9b4d2f4322edcf63a6737b92a29dd1f5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::two_thirds </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 2 / 3. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga788f5a421fc0f40a1296ebc094cbaa8a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR genType glm::zero </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return 0. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00151.html\" title=\"Include <glm/gtc/constants.hpp> to use the features of this extension. \">GLM_GTC_constants</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00152.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_epsilon</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_epsilon<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00022.html\" title=\"GLM_GTC_epsilon \">glm/gtc/epsilon.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga91b417866cafadd076004778217a1844\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga91b417866cafadd076004778217a1844\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html#ga91b417866cafadd076004778217a1844\">epsilonEqual</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga91b417866cafadd076004778217a1844\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of |x - y| &lt; epsilon.  <a href=\"a00152.html#ga91b417866cafadd076004778217a1844\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91b417866cafadd076004778217a1844\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7f227999ca09e7ca994e8b35aba47bb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa7f227999ca09e7ca994e8b35aba47bb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb\">epsilonEqual</a> (genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaa7f227999ca09e7ca994e8b35aba47bb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of |x - y| &lt; epsilon.  <a href=\"a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7f227999ca09e7ca994e8b35aba47bb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf840d33b9a5261ec78dcd5125743b025\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf840d33b9a5261ec78dcd5125743b025\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html#gaf840d33b9a5261ec78dcd5125743b025\">epsilonNotEqual</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaf840d33b9a5261ec78dcd5125743b025\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of |x - y| &lt; epsilon.  <a href=\"a00152.html#gaf840d33b9a5261ec78dcd5125743b025\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf840d33b9a5261ec78dcd5125743b025\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga50a92103fb0cbd796908e1bf20c79aaf\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga50a92103fb0cbd796908e1bf20c79aaf\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf\">epsilonNotEqual</a> (genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga50a92103fb0cbd796908e1bf20c79aaf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of |x - y| &gt;= epsilon.  <a href=\"a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50a92103fb0cbd796908e1bf20c79aaf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00022.html\" title=\"GLM_GTC_epsilon \">glm/gtc/epsilon.hpp</a>&gt; to use the features of this extension. </p>\n<p>Comparison functions for a user defined epsilon values. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga91b417866cafadd076004778217a1844\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::epsilonEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of |x - y| &lt; epsilon. </p>\n<p>True if this expression is satisfied.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00152.html\" title=\"Include <glm/gtc/epsilon.hpp> to use the features of this extension. \">GLM_GTC_epsilon</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa7f227999ca09e7ca994e8b35aba47bb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::epsilonEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of |x - y| &lt; epsilon. </p>\n<p>True if this expression is satisfied.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00152.html\" title=\"Include <glm/gtc/epsilon.hpp> to use the features of this extension. \">GLM_GTC_epsilon</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf840d33b9a5261ec78dcd5125743b025\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::epsilonNotEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of |x - y| &lt; epsilon. </p>\n<p>True if this expression is not satisfied.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00152.html\" title=\"Include <glm/gtc/epsilon.hpp> to use the features of this extension. \">GLM_GTC_epsilon</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga50a92103fb0cbd796908e1bf20c79aaf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::epsilonNotEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of |x - y| &gt;= epsilon. </p>\n<p>True if this expression is not satisfied.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00152.html\" title=\"Include <glm/gtc/epsilon.hpp> to use the features of this extension. \">GLM_GTC_epsilon</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00153.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_integer</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_integer<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00039.html\" title=\"GLM_GTC_integer \">glm/gtc/integer.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga57824268ebe13a922f1d69a5d37f637f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga57824268ebe13a922f1d69a5d37f637f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html#ga57824268ebe13a922f1d69a5d37f637f\">iround</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga57824268ebe13a922f1d69a5d37f637f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00153.html#ga57824268ebe13a922f1d69a5d37f637f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga57824268ebe13a922f1d69a5d37f637f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bd682e74bfacb005c735305207ec417\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga9bd682e74bfacb005c735305207ec417\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html#ga9bd682e74bfacb005c735305207ec417\">log2</a> (genIUType x)</td></tr>\n<tr class=\"memdesc:ga9bd682e74bfacb005c735305207ec417\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the log2 of x for integer values.  <a href=\"a00153.html#ga9bd682e74bfacb005c735305207ec417\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9bd682e74bfacb005c735305207ec417\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga75c6fd2a143fc44e5f7b871abad539e0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga75c6fd2a143fc44e5f7b871abad539e0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0\">mod</a> (genIUType x, genIUType y)</td></tr>\n<tr class=\"memdesc:ga75c6fd2a143fc44e5f7b871abad539e0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga75c6fd2a143fc44e5f7b871abad539e0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6715b9d573972a0f7763d30d45bcaec4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6715b9d573972a0f7763d30d45bcaec4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00153.html#ga6715b9d573972a0f7763d30d45bcaec4\">uround</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga6715b9d573972a0f7763d30d45bcaec4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a value equal to the nearest integer to x.  <a href=\"a00153.html#ga6715b9d573972a0f7763d30d45bcaec4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6715b9d573972a0f7763d30d45bcaec4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00039.html\" title=\"GLM_GTC_integer \">glm/gtc/integer.hpp</a>&gt; to use the features of this extension. </p>\n<p>Allow to perform bit operations on integer values </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga57824268ebe13a922f1d69a5d37f637f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, int, Q&gt; glm::iround </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer to x. </p>\n<p>The fraction 0.5 will round in a direction chosen by the implementation, presumably the direction that is fastest.</p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">x</td><td>The values of the argument must be greater or equal to zero. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>floating point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml\">GLSL round man page</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00153.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9bd682e74bfacb005c735305207ec417\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::log2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the log2 of x for integer values. </p>\n<p>Can be reliably using to compute mipmap count from the texture size. </p><dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00153.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga75c6fd2a143fc44e5f7b871abad539e0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::mod </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x % y for each component in x using the floating point value y.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genIUType</td><td>Integer-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00153.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6715b9d573972a0f7763d30d45bcaec4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, uint, Q&gt; glm::uround </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a value equal to the nearest integer to x. </p>\n<p>The fraction 0.5 will round in a direction chosen by the implementation, presumably the direction that is fastest.</p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">x</td><td>The values of the argument must be greater or equal to zero. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>floating point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml\">GLSL round man page</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00153.html\" title=\"Include <glm/gtc/integer.hpp> to use the features of this extension. \">GLM_GTC_integer</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00154.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_matrix_access</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_matrix_access<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00056.html\" title=\"GLM_GTC_matrix_access \">glm/gtc/matrix_access.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga96022eb0d3fae39d89fc7a954e59b374\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga96022eb0d3fae39d89fc7a954e59b374\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::col_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html#ga96022eb0d3fae39d89fc7a954e59b374\">column</a> (genType const &amp;m, length_t index)</td></tr>\n<tr class=\"memdesc:ga96022eb0d3fae39d89fc7a954e59b374\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Get a specific column of a matrix.  <a href=\"a00154.html#ga96022eb0d3fae39d89fc7a954e59b374\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96022eb0d3fae39d89fc7a954e59b374\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9e757377523890e8b80c5843dbe4dd15\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9e757377523890e8b80c5843dbe4dd15\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html#ga9e757377523890e8b80c5843dbe4dd15\">column</a> (genType const &amp;m, length_t index, typename genType::col_type const &amp;x)</td></tr>\n<tr class=\"memdesc:ga9e757377523890e8b80c5843dbe4dd15\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set a specific column to a matrix.  <a href=\"a00154.html#ga9e757377523890e8b80c5843dbe4dd15\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9e757377523890e8b80c5843dbe4dd15\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga259e5ebd0f31ec3f83440f8cae7f5dba\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga259e5ebd0f31ec3f83440f8cae7f5dba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::row_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html#ga259e5ebd0f31ec3f83440f8cae7f5dba\">row</a> (genType const &amp;m, length_t index)</td></tr>\n<tr class=\"memdesc:ga259e5ebd0f31ec3f83440f8cae7f5dba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Get a specific row of a matrix.  <a href=\"a00154.html#ga259e5ebd0f31ec3f83440f8cae7f5dba\">More...</a><br /></td></tr>\n<tr class=\"separator:ga259e5ebd0f31ec3f83440f8cae7f5dba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaadcc64829aadf4103477679e48c7594f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaadcc64829aadf4103477679e48c7594f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00154.html#gaadcc64829aadf4103477679e48c7594f\">row</a> (genType const &amp;m, length_t index, typename genType::row_type const &amp;x)</td></tr>\n<tr class=\"memdesc:gaadcc64829aadf4103477679e48c7594f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Set a specific row to a matrix.  <a href=\"a00154.html#gaadcc64829aadf4103477679e48c7594f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaadcc64829aadf4103477679e48c7594f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00056.html\" title=\"GLM_GTC_matrix_access \">glm/gtc/matrix_access.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines functions to access rows or columns of a matrix easily. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga96022eb0d3fae39d89fc7a954e59b374\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType::col_type glm::column </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">length_t&#160;</td>\n          <td class=\"paramname\"><em>index</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Get a specific column of a matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00154.html\" title=\"Include <glm/gtc/matrix_access.hpp> to use the features of this extension. \">GLM_GTC_matrix_access</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9e757377523890e8b80c5843dbe4dd15\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::column </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">length_t&#160;</td>\n          <td class=\"paramname\"><em>index</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::col_type const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Set a specific column to a matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00154.html\" title=\"Include <glm/gtc/matrix_access.hpp> to use the features of this extension. \">GLM_GTC_matrix_access</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga259e5ebd0f31ec3f83440f8cae7f5dba\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType::row_type glm::row </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">length_t&#160;</td>\n          <td class=\"paramname\"><em>index</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Get a specific row of a matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00154.html\" title=\"Include <glm/gtc/matrix_access.hpp> to use the features of this extension. \">GLM_GTC_matrix_access</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaadcc64829aadf4103477679e48c7594f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::row </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">length_t&#160;</td>\n          <td class=\"paramname\"><em>index</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::row_type const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Set a specific row to a matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00154.html\" title=\"Include <glm/gtc/matrix_access.hpp> to use the features of this extension. \">GLM_GTC_matrix_access</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00155.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_matrix_integer</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_matrix_integer<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00060.html\" title=\"GLM_GTC_matrix_integer \">glm/gtc/matrix_integer.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga8499cc3b016003f835314c1c756e9db9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8499cc3b016003f835314c1c756e9db9\">highp_imat2</a></td></tr>\n<tr class=\"memdesc:ga8499cc3b016003f835314c1c756e9db9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#ga8499cc3b016003f835314c1c756e9db9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8499cc3b016003f835314c1c756e9db9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa389e2d1c3b10941cae870bc0aeba5b3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3\">highp_imat2x2</a></td></tr>\n<tr class=\"memdesc:gaa389e2d1c3b10941cae870bc0aeba5b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa389e2d1c3b10941cae870bc0aeba5b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaba49d890e06c9444795f5a133fbf1336\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaba49d890e06c9444795f5a133fbf1336\">highp_imat2x3</a></td></tr>\n<tr class=\"memdesc:gaba49d890e06c9444795f5a133fbf1336\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 2x3 matrix.  <a href=\"a00155.html#gaba49d890e06c9444795f5a133fbf1336\">More...</a><br /></td></tr>\n<tr class=\"separator:gaba49d890e06c9444795f5a133fbf1336\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga05a970fd4366dad6c8a0be676b1eae5b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b\">highp_imat2x4</a></td></tr>\n<tr class=\"memdesc:ga05a970fd4366dad6c8a0be676b1eae5b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 2x4 matrix.  <a href=\"a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga05a970fd4366dad6c8a0be676b1eae5b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaca4506a3efa679eff7c006d9826291fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaca4506a3efa679eff7c006d9826291fd\">highp_imat3</a></td></tr>\n<tr class=\"memdesc:gaca4506a3efa679eff7c006d9826291fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#gaca4506a3efa679eff7c006d9826291fd\">More...</a><br /></td></tr>\n<tr class=\"separator:gaca4506a3efa679eff7c006d9826291fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91c671c3ff9706c2393e78b22fd84bcb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb\">highp_imat3x2</a></td></tr>\n<tr class=\"memdesc:ga91c671c3ff9706c2393e78b22fd84bcb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 3x2 matrix.  <a href=\"a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91c671c3ff9706c2393e78b22fd84bcb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga07d7b7173e2a6f843ff5f1c615a95b41\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41\">highp_imat3x3</a></td></tr>\n<tr class=\"memdesc:ga07d7b7173e2a6f843ff5f1c615a95b41\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41\">More...</a><br /></td></tr>\n<tr class=\"separator:ga07d7b7173e2a6f843ff5f1c615a95b41\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga53008f580be99018a17b357b5a4ffc0d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga53008f580be99018a17b357b5a4ffc0d\">highp_imat3x4</a></td></tr>\n<tr class=\"memdesc:ga53008f580be99018a17b357b5a4ffc0d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 3x4 matrix.  <a href=\"a00155.html#ga53008f580be99018a17b357b5a4ffc0d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga53008f580be99018a17b357b5a4ffc0d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7cfb09b34e0fcf73eaf6512d6483ef56\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56\">highp_imat4</a></td></tr>\n<tr class=\"memdesc:ga7cfb09b34e0fcf73eaf6512d6483ef56\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7cfb09b34e0fcf73eaf6512d6483ef56\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1858820fb292cae396408b2034407f72\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1858820fb292cae396408b2034407f72\">highp_imat4x2</a></td></tr>\n<tr class=\"memdesc:ga1858820fb292cae396408b2034407f72\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 4x2 matrix.  <a href=\"a00155.html#ga1858820fb292cae396408b2034407f72\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1858820fb292cae396408b2034407f72\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6be0b80ae74bb309bc5b964d93d68fc5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5\">highp_imat4x3</a></td></tr>\n<tr class=\"memdesc:ga6be0b80ae74bb309bc5b964d93d68fc5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 4x3 matrix.  <a href=\"a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6be0b80ae74bb309bc5b964d93d68fc5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c783ee6f8f040ab37df2f70392c8b44\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44\">highp_imat4x4</a></td></tr>\n<tr class=\"memdesc:ga2c783ee6f8f040ab37df2f70392c8b44\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c783ee6f8f040ab37df2f70392c8b44\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42cbce64c4c1cd121b8437daa6e110de\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga42cbce64c4c1cd121b8437daa6e110de\">highp_umat2</a></td></tr>\n<tr class=\"memdesc:ga42cbce64c4c1cd121b8437daa6e110de\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga42cbce64c4c1cd121b8437daa6e110de\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42cbce64c4c1cd121b8437daa6e110de\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5337b7bc95f9cbac08a0c00b3f936b28\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28\">highp_umat2x2</a></td></tr>\n<tr class=\"memdesc:ga5337b7bc95f9cbac08a0c00b3f936b28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5337b7bc95f9cbac08a0c00b3f936b28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga90718c7128320b24b52f9ea70e643ad4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga90718c7128320b24b52f9ea70e643ad4\">highp_umat2x3</a></td></tr>\n<tr class=\"memdesc:ga90718c7128320b24b52f9ea70e643ad4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 2x3 matrix.  <a href=\"a00155.html#ga90718c7128320b24b52f9ea70e643ad4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga90718c7128320b24b52f9ea70e643ad4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadca0a4724b4a6f56a2355b6f6e19248b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b\">highp_umat2x4</a></td></tr>\n<tr class=\"memdesc:gadca0a4724b4a6f56a2355b6f6e19248b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 2x4 matrix.  <a href=\"a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b\">More...</a><br /></td></tr>\n<tr class=\"separator:gadca0a4724b4a6f56a2355b6f6e19248b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa1143120339b7d2d469d327662e8a172\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa1143120339b7d2d469d327662e8a172\">highp_umat3</a></td></tr>\n<tr class=\"memdesc:gaa1143120339b7d2d469d327662e8a172\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#gaa1143120339b7d2d469d327662e8a172\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa1143120339b7d2d469d327662e8a172\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga844a5da2e7fc03fc7cccc7f1b70809c4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4\">highp_umat3x2</a></td></tr>\n<tr class=\"memdesc:ga844a5da2e7fc03fc7cccc7f1b70809c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 3x2 matrix.  <a href=\"a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga844a5da2e7fc03fc7cccc7f1b70809c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f7d41c36b980774a4d2e7c1647fb4b2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2\">highp_umat3x3</a></td></tr>\n<tr class=\"memdesc:ga1f7d41c36b980774a4d2e7c1647fb4b2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f7d41c36b980774a4d2e7c1647fb4b2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga25ee15c323924f2d0fe9896d329e5086\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga25ee15c323924f2d0fe9896d329e5086\">highp_umat3x4</a></td></tr>\n<tr class=\"memdesc:ga25ee15c323924f2d0fe9896d329e5086\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 3x4 matrix.  <a href=\"a00155.html#ga25ee15c323924f2d0fe9896d329e5086\">More...</a><br /></td></tr>\n<tr class=\"separator:ga25ee15c323924f2d0fe9896d329e5086\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf665e4e78c2cc32a54ab40325738f9c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9\">highp_umat4</a></td></tr>\n<tr class=\"memdesc:gaf665e4e78c2cc32a54ab40325738f9c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf665e4e78c2cc32a54ab40325738f9c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae69eb82ec08b0dc9bf2ead2a339ff801\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801\">highp_umat4x2</a></td></tr>\n<tr class=\"memdesc:gae69eb82ec08b0dc9bf2ead2a339ff801\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 4x2 matrix.  <a href=\"a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801\">More...</a><br /></td></tr>\n<tr class=\"separator:gae69eb82ec08b0dc9bf2ead2a339ff801\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga45a8163d02c43216252056b0c120f3a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga45a8163d02c43216252056b0c120f3a5\">highp_umat4x3</a></td></tr>\n<tr class=\"memdesc:ga45a8163d02c43216252056b0c120f3a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 4x3 matrix.  <a href=\"a00155.html#ga45a8163d02c43216252056b0c120f3a5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga45a8163d02c43216252056b0c120f3a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6a56cbb769aed334c95241664415f9ba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6a56cbb769aed334c95241664415f9ba\">highp_umat4x4</a></td></tr>\n<tr class=\"memdesc:ga6a56cbb769aed334c95241664415f9ba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#ga6a56cbb769aed334c95241664415f9ba\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6a56cbb769aed334c95241664415f9ba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabe04f9948d4a213bb1c20137de03e01\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">imat2</a></td></tr>\n<tr class=\"memdesc:gaabe04f9948d4a213bb1c20137de03e01\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 2x2 matrix.  <a href=\"a00155.html#gaabe04f9948d4a213bb1c20137de03e01\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabe04f9948d4a213bb1c20137de03e01\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4732a240522ad9bc28144fda2fc14ec\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">imat2x2</a></td></tr>\n<tr class=\"memdesc:gaa4732a240522ad9bc28144fda2fc14ec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 2x2 matrix.  <a href=\"a00155.html#gaa4732a240522ad9bc28144fda2fc14ec\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa4732a240522ad9bc28144fda2fc14ec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3f42dd3d5d94a0fd5706f7ec8dd0c605\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">imat2x3</a></td></tr>\n<tr class=\"memdesc:ga3f42dd3d5d94a0fd5706f7ec8dd0c605\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 2x3 matrix.  <a href=\"a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3f42dd3d5d94a0fd5706f7ec8dd0c605\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9d8faafdca42583d67e792dd038fc668\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">imat2x4</a></td></tr>\n<tr class=\"memdesc:ga9d8faafdca42583d67e792dd038fc668\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 2x4 matrix.  <a href=\"a00155.html#ga9d8faafdca42583d67e792dd038fc668\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9d8faafdca42583d67e792dd038fc668\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga038f68437155ffa3c2583a15264a8195\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">imat3</a></td></tr>\n<tr class=\"memdesc:ga038f68437155ffa3c2583a15264a8195\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 3x3 matrix.  <a href=\"a00155.html#ga038f68437155ffa3c2583a15264a8195\">More...</a><br /></td></tr>\n<tr class=\"separator:ga038f68437155ffa3c2583a15264a8195\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b33bbe4f12c060892bd3cc8d4cd737f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">imat3x2</a></td></tr>\n<tr class=\"memdesc:ga7b33bbe4f12c060892bd3cc8d4cd737f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 3x2 matrix.  <a href=\"a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7b33bbe4f12c060892bd3cc8d4cd737f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6aacc960f62e8f7d2fe9d32d5050e7a4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">imat3x3</a></td></tr>\n<tr class=\"memdesc:ga6aacc960f62e8f7d2fe9d32d5050e7a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 3x3 matrix.  <a href=\"a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6aacc960f62e8f7d2fe9d32d5050e7a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e9ce23496d8b08dfc302d4039694b58\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">imat3x4</a></td></tr>\n<tr class=\"memdesc:ga6e9ce23496d8b08dfc302d4039694b58\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 3x4 matrix.  <a href=\"a00155.html#ga6e9ce23496d8b08dfc302d4039694b58\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e9ce23496d8b08dfc302d4039694b58\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga96b0d26a33b81bb6a60ca0f39682f7eb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">imat4</a></td></tr>\n<tr class=\"memdesc:ga96b0d26a33b81bb6a60ca0f39682f7eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 4x4 matrix.  <a href=\"a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96b0d26a33b81bb6a60ca0f39682f7eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8ce7ef51d8b2c1901fa5414deccbc3fa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">imat4x2</a></td></tr>\n<tr class=\"memdesc:ga8ce7ef51d8b2c1901fa5414deccbc3fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 4x2 matrix.  <a href=\"a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8ce7ef51d8b2c1901fa5414deccbc3fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga705ee0bf49d6c3de4404ce2481bf0df5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">imat4x3</a></td></tr>\n<tr class=\"memdesc:ga705ee0bf49d6c3de4404ce2481bf0df5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 4x3 matrix.  <a href=\"a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga705ee0bf49d6c3de4404ce2481bf0df5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga43ed5e4f475b6f4cad7cba78f29c405b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_imat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">imat4x4</a></td></tr>\n<tr class=\"memdesc:ga43ed5e4f475b6f4cad7cba78f29c405b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Signed integer 4x4 matrix.  <a href=\"a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga43ed5e4f475b6f4cad7cba78f29c405b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0bff0be804142bb16d441aec0a7962e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa0bff0be804142bb16d441aec0a7962e\">lowp_imat2</a></td></tr>\n<tr class=\"memdesc:gaa0bff0be804142bb16d441aec0a7962e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#gaa0bff0be804142bb16d441aec0a7962e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0bff0be804142bb16d441aec0a7962e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga92b95b679975d408645547ab45a8dcd8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga92b95b679975d408645547ab45a8dcd8\">lowp_imat2x2</a></td></tr>\n<tr class=\"memdesc:ga92b95b679975d408645547ab45a8dcd8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#ga92b95b679975d408645547ab45a8dcd8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga92b95b679975d408645547ab45a8dcd8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8c9e7a388f8e7c52f1e6857dee8afb65\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65\">lowp_imat2x3</a></td></tr>\n<tr class=\"memdesc:ga8c9e7a388f8e7c52f1e6857dee8afb65\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 2x3 matrix.  <a href=\"a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8c9e7a388f8e7c52f1e6857dee8afb65\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9cc13bd1f8dd2933e9fa31fe3f70e16e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e\">lowp_imat2x4</a></td></tr>\n<tr class=\"memdesc:ga9cc13bd1f8dd2933e9fa31fe3f70e16e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 2x4 matrix.  <a href=\"a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9cc13bd1f8dd2933e9fa31fe3f70e16e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga69bfe668f4170379fc1f35d82b060c43\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga69bfe668f4170379fc1f35d82b060c43\">lowp_imat3</a></td></tr>\n<tr class=\"memdesc:ga69bfe668f4170379fc1f35d82b060c43\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#ga69bfe668f4170379fc1f35d82b060c43\">More...</a><br /></td></tr>\n<tr class=\"separator:ga69bfe668f4170379fc1f35d82b060c43\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga33db8f27491d30906cd37c0d86b3f432\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga33db8f27491d30906cd37c0d86b3f432\">lowp_imat3x2</a></td></tr>\n<tr class=\"memdesc:ga33db8f27491d30906cd37c0d86b3f432\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 3x2 matrix.  <a href=\"a00155.html#ga33db8f27491d30906cd37c0d86b3f432\">More...</a><br /></td></tr>\n<tr class=\"separator:ga33db8f27491d30906cd37c0d86b3f432\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga664f061df00020048c3f8530329ace45\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga664f061df00020048c3f8530329ace45\">lowp_imat3x3</a></td></tr>\n<tr class=\"memdesc:ga664f061df00020048c3f8530329ace45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#ga664f061df00020048c3f8530329ace45\">More...</a><br /></td></tr>\n<tr class=\"separator:ga664f061df00020048c3f8530329ace45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9273faab33623d944af4080befbb2c80\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga9273faab33623d944af4080befbb2c80\">lowp_imat3x4</a></td></tr>\n<tr class=\"memdesc:ga9273faab33623d944af4080befbb2c80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 3x4 matrix.  <a href=\"a00155.html#ga9273faab33623d944af4080befbb2c80\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9273faab33623d944af4080befbb2c80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1e77f7270cad461ca4fcb4c3ec2e98c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c\">lowp_imat4</a></td></tr>\n<tr class=\"memdesc:gad1e77f7270cad461ca4fcb4c3ec2e98c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c\">More...</a><br /></td></tr>\n<tr class=\"separator:gad1e77f7270cad461ca4fcb4c3ec2e98c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga26ec1a2ba08a1488f5f05336858a0f09\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09\">lowp_imat4x2</a></td></tr>\n<tr class=\"memdesc:ga26ec1a2ba08a1488f5f05336858a0f09\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 4x2 matrix.  <a href=\"a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09\">More...</a><br /></td></tr>\n<tr class=\"separator:ga26ec1a2ba08a1488f5f05336858a0f09\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f40483a3ae634ead8ad22272c543a33\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8f40483a3ae634ead8ad22272c543a33\">lowp_imat4x3</a></td></tr>\n<tr class=\"memdesc:ga8f40483a3ae634ead8ad22272c543a33\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 4x3 matrix.  <a href=\"a00155.html#ga8f40483a3ae634ead8ad22272c543a33\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f40483a3ae634ead8ad22272c543a33\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf65677e53ac8e31a107399340d5e2451\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf65677e53ac8e31a107399340d5e2451\">lowp_imat4x4</a></td></tr>\n<tr class=\"memdesc:gaf65677e53ac8e31a107399340d5e2451\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#gaf65677e53ac8e31a107399340d5e2451\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf65677e53ac8e31a107399340d5e2451\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2fba702d990437fc88ff3f3a76846ee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf2fba702d990437fc88ff3f3a76846ee\">lowp_umat2</a></td></tr>\n<tr class=\"memdesc:gaf2fba702d990437fc88ff3f3a76846ee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#gaf2fba702d990437fc88ff3f3a76846ee\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2fba702d990437fc88ff3f3a76846ee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b2e9d89745f7175051284e54c81d81c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga7b2e9d89745f7175051284e54c81d81c\">lowp_umat2x2</a></td></tr>\n<tr class=\"memdesc:ga7b2e9d89745f7175051284e54c81d81c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga7b2e9d89745f7175051284e54c81d81c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7b2e9d89745f7175051284e54c81d81c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3072f90fd86f17a862e21589fbb14c0f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga3072f90fd86f17a862e21589fbb14c0f\">lowp_umat2x3</a></td></tr>\n<tr class=\"memdesc:ga3072f90fd86f17a862e21589fbb14c0f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 2x3 matrix.  <a href=\"a00155.html#ga3072f90fd86f17a862e21589fbb14c0f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3072f90fd86f17a862e21589fbb14c0f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8bb45fec4bd77bd81b4ae7eb961a270d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d\">lowp_umat2x4</a></td></tr>\n<tr class=\"memdesc:ga8bb45fec4bd77bd81b4ae7eb961a270d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 2x4 matrix.  <a href=\"a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8bb45fec4bd77bd81b4ae7eb961a270d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf1145f72bcdd590f5808c4bc170c2924\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf1145f72bcdd590f5808c4bc170c2924\">lowp_umat3</a></td></tr>\n<tr class=\"memdesc:gaf1145f72bcdd590f5808c4bc170c2924\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#gaf1145f72bcdd590f5808c4bc170c2924\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf1145f72bcdd590f5808c4bc170c2924\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga56ea68c6a6cba8d8c21d17bb14e69c6b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b\">lowp_umat3x2</a></td></tr>\n<tr class=\"memdesc:ga56ea68c6a6cba8d8c21d17bb14e69c6b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 3x2 matrix.  <a href=\"a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga56ea68c6a6cba8d8c21d17bb14e69c6b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f660a39a395cc14f018f985e7dfbeb5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5\">lowp_umat3x3</a></td></tr>\n<tr class=\"memdesc:ga4f660a39a395cc14f018f985e7dfbeb5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f660a39a395cc14f018f985e7dfbeb5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec3d624306bd59649f021864709d56b5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaec3d624306bd59649f021864709d56b5\">lowp_umat3x4</a></td></tr>\n<tr class=\"memdesc:gaec3d624306bd59649f021864709d56b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 3x4 matrix.  <a href=\"a00155.html#gaec3d624306bd59649f021864709d56b5\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec3d624306bd59649f021864709d56b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac092c6105827bf9ea080db38074b78eb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gac092c6105827bf9ea080db38074b78eb\">lowp_umat4</a></td></tr>\n<tr class=\"memdesc:gac092c6105827bf9ea080db38074b78eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#gac092c6105827bf9ea080db38074b78eb\">More...</a><br /></td></tr>\n<tr class=\"separator:gac092c6105827bf9ea080db38074b78eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7716c2b210d141846f1ac4e774adef5e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga7716c2b210d141846f1ac4e774adef5e\">lowp_umat4x2</a></td></tr>\n<tr class=\"memdesc:ga7716c2b210d141846f1ac4e774adef5e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 4x2 matrix.  <a href=\"a00155.html#ga7716c2b210d141846f1ac4e774adef5e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7716c2b210d141846f1ac4e774adef5e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09ab33a2636f5f43f7fae29cfbc20fff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff\">lowp_umat4x3</a></td></tr>\n<tr class=\"memdesc:ga09ab33a2636f5f43f7fae29cfbc20fff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 4x3 matrix.  <a href=\"a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga09ab33a2636f5f43f7fae29cfbc20fff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga10aafc66cf1a0ece336b1c5ae13d0cc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0\">lowp_umat4x4</a></td></tr>\n<tr class=\"memdesc:ga10aafc66cf1a0ece336b1c5ae13d0cc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga10aafc66cf1a0ece336b1c5ae13d0cc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20f4cc7ab23e2aa1f4db9fdb5496d378\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378\">mediump_imat2</a></td></tr>\n<tr class=\"memdesc:ga20f4cc7ab23e2aa1f4db9fdb5496d378\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20f4cc7ab23e2aa1f4db9fdb5496d378\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b2aeb11a329940721dda9583e71f856\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga4b2aeb11a329940721dda9583e71f856\">mediump_imat2x2</a></td></tr>\n<tr class=\"memdesc:ga4b2aeb11a329940721dda9583e71f856\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 2x2 matrix.  <a href=\"a00155.html#ga4b2aeb11a329940721dda9583e71f856\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b2aeb11a329940721dda9583e71f856\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74362470ba99843ac70aee5ac38cc674\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga74362470ba99843ac70aee5ac38cc674\">mediump_imat2x3</a></td></tr>\n<tr class=\"memdesc:ga74362470ba99843ac70aee5ac38cc674\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 2x3 matrix.  <a href=\"a00155.html#ga74362470ba99843ac70aee5ac38cc674\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74362470ba99843ac70aee5ac38cc674\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8da25cd380ba30fc5b68a4687deb3e09\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09\">mediump_imat2x4</a></td></tr>\n<tr class=\"memdesc:ga8da25cd380ba30fc5b68a4687deb3e09\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 2x4 matrix.  <a href=\"a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8da25cd380ba30fc5b68a4687deb3e09\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c63bdc736efd3466e0730de0251cb71\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga6c63bdc736efd3466e0730de0251cb71\">mediump_imat3</a></td></tr>\n<tr class=\"memdesc:ga6c63bdc736efd3466e0730de0251cb71\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#ga6c63bdc736efd3466e0730de0251cb71\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c63bdc736efd3466e0730de0251cb71\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac0b4e42d648fb3eaf4bb88da82ecc809\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809\">mediump_imat3x2</a></td></tr>\n<tr class=\"memdesc:gac0b4e42d648fb3eaf4bb88da82ecc809\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 3x2 matrix.  <a href=\"a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809\">More...</a><br /></td></tr>\n<tr class=\"separator:gac0b4e42d648fb3eaf4bb88da82ecc809\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad99cc2aad8fc57f068cfa7719dbbea12\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12\">mediump_imat3x3</a></td></tr>\n<tr class=\"memdesc:gad99cc2aad8fc57f068cfa7719dbbea12\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 3x3 matrix.  <a href=\"a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12\">More...</a><br /></td></tr>\n<tr class=\"separator:gad99cc2aad8fc57f068cfa7719dbbea12\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga67689a518b181a26540bc44a163525cd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga67689a518b181a26540bc44a163525cd\">mediump_imat3x4</a></td></tr>\n<tr class=\"memdesc:ga67689a518b181a26540bc44a163525cd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 3x4 matrix.  <a href=\"a00155.html#ga67689a518b181a26540bc44a163525cd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga67689a518b181a26540bc44a163525cd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf348552978553630d2a00b78eb887ced\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf348552978553630d2a00b78eb887ced\">mediump_imat4</a></td></tr>\n<tr class=\"memdesc:gaf348552978553630d2a00b78eb887ced\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#gaf348552978553630d2a00b78eb887ced\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf348552978553630d2a00b78eb887ced\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b2d35816f7103f0f4c82dd2f27571fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc\">mediump_imat4x2</a></td></tr>\n<tr class=\"memdesc:ga8b2d35816f7103f0f4c82dd2f27571fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 4x2 matrix.  <a href=\"a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b2d35816f7103f0f4c82dd2f27571fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5b10acc696759e03f6ab918f4467e94c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga5b10acc696759e03f6ab918f4467e94c\">mediump_imat4x3</a></td></tr>\n<tr class=\"memdesc:ga5b10acc696759e03f6ab918f4467e94c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 4x3 matrix.  <a href=\"a00155.html#ga5b10acc696759e03f6ab918f4467e94c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5b10acc696759e03f6ab918f4467e94c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2596869d154dec1180beadbb9df80501\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, int, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga2596869d154dec1180beadbb9df80501\">mediump_imat4x4</a></td></tr>\n<tr class=\"memdesc:ga2596869d154dec1180beadbb9df80501\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier signed integer 4x4 matrix.  <a href=\"a00155.html#ga2596869d154dec1180beadbb9df80501\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2596869d154dec1180beadbb9df80501\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga43041378b3410ea951b7de0dfd2bc7ee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee\">mediump_umat2</a></td></tr>\n<tr class=\"memdesc:ga43041378b3410ea951b7de0dfd2bc7ee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga43041378b3410ea951b7de0dfd2bc7ee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b209b1b751f041422137e3c065dfa98\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga3b209b1b751f041422137e3c065dfa98\">mediump_umat2x2</a></td></tr>\n<tr class=\"memdesc:ga3b209b1b751f041422137e3c065dfa98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga3b209b1b751f041422137e3c065dfa98\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b209b1b751f041422137e3c065dfa98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaee2c1f13b41f4c92ea5b3efe367a1306\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306\">mediump_umat2x3</a></td></tr>\n<tr class=\"memdesc:gaee2c1f13b41f4c92ea5b3efe367a1306\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 2x3 matrix.  <a href=\"a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306\">More...</a><br /></td></tr>\n<tr class=\"separator:gaee2c1f13b41f4c92ea5b3efe367a1306\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1317ddca16d01e119a40b7f0ee85f95\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 2, 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gae1317ddca16d01e119a40b7f0ee85f95\">mediump_umat2x4</a></td></tr>\n<tr class=\"memdesc:gae1317ddca16d01e119a40b7f0ee85f95\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 2x4 matrix.  <a href=\"a00155.html#gae1317ddca16d01e119a40b7f0ee85f95\">More...</a><br /></td></tr>\n<tr class=\"separator:gae1317ddca16d01e119a40b7f0ee85f95\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1730dbe3c67801f53520b06d1aa0a34a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a\">mediump_umat3</a></td></tr>\n<tr class=\"memdesc:ga1730dbe3c67801f53520b06d1aa0a34a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1730dbe3c67801f53520b06d1aa0a34a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaadc28bfdc8ebca81ae85121b11994970\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaadc28bfdc8ebca81ae85121b11994970\">mediump_umat3x2</a></td></tr>\n<tr class=\"memdesc:gaadc28bfdc8ebca81ae85121b11994970\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 3x2 matrix.  <a href=\"a00155.html#gaadc28bfdc8ebca81ae85121b11994970\">More...</a><br /></td></tr>\n<tr class=\"separator:gaadc28bfdc8ebca81ae85121b11994970\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga48f2fc38d3f7fab3cfbc961278ced53d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d\">mediump_umat3x3</a></td></tr>\n<tr class=\"memdesc:ga48f2fc38d3f7fab3cfbc961278ced53d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga48f2fc38d3f7fab3cfbc961278ced53d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78009a1e4ca64217e46b418535e52546\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 3, 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga78009a1e4ca64217e46b418535e52546\">mediump_umat3x4</a></td></tr>\n<tr class=\"memdesc:ga78009a1e4ca64217e46b418535e52546\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 3x4 matrix.  <a href=\"a00155.html#ga78009a1e4ca64217e46b418535e52546\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78009a1e4ca64217e46b418535e52546\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5087c2beb26a11d9af87432e554cf9d1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga5087c2beb26a11d9af87432e554cf9d1\">mediump_umat4</a></td></tr>\n<tr class=\"memdesc:ga5087c2beb26a11d9af87432e554cf9d1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#ga5087c2beb26a11d9af87432e554cf9d1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5087c2beb26a11d9af87432e554cf9d1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf35aefd81cc13718f6b059623f7425fa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 2, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf35aefd81cc13718f6b059623f7425fa\">mediump_umat4x2</a></td></tr>\n<tr class=\"memdesc:gaf35aefd81cc13718f6b059623f7425fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 4x2 matrix.  <a href=\"a00155.html#gaf35aefd81cc13718f6b059623f7425fa\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf35aefd81cc13718f6b059623f7425fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4e1bed14fbc7f4b376aaed064f89f0fb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 3, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb\">mediump_umat4x3</a></td></tr>\n<tr class=\"memdesc:ga4e1bed14fbc7f4b376aaed064f89f0fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 4x3 matrix.  <a href=\"a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4e1bed14fbc7f4b376aaed064f89f0fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9428fc8430dc552aad920653f822ef3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mat&lt; 4, 4, uint, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaa9428fc8430dc552aad920653f822ef3\">mediump_umat4x4</a></td></tr>\n<tr class=\"memdesc:gaa9428fc8430dc552aad920653f822ef3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium-qualifier unsigned integer 4x4 matrix.  <a href=\"a00155.html#gaa9428fc8430dc552aad920653f822ef3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9428fc8430dc552aad920653f822ef3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4cae85566f900debf930c41944b64691\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">umat2</a></td></tr>\n<tr class=\"memdesc:ga4cae85566f900debf930c41944b64691\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 2x2 matrix.  <a href=\"a00155.html#ga4cae85566f900debf930c41944b64691\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4cae85566f900debf930c41944b64691\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabf8acdd33ce8951051edbca5200898aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">umat2x2</a></td></tr>\n<tr class=\"memdesc:gabf8acdd33ce8951051edbca5200898aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 2x2 matrix.  <a href=\"a00155.html#gabf8acdd33ce8951051edbca5200898aa\">More...</a><br /></td></tr>\n<tr class=\"separator:gabf8acdd33ce8951051edbca5200898aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1870da7578d5022b973a83155d386ab3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">umat2x3</a></td></tr>\n<tr class=\"memdesc:ga1870da7578d5022b973a83155d386ab3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 2x3 matrix.  <a href=\"a00155.html#ga1870da7578d5022b973a83155d386ab3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1870da7578d5022b973a83155d386ab3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga57936a3998e992370e59a223e0ee4fd4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">umat2x4</a></td></tr>\n<tr class=\"memdesc:ga57936a3998e992370e59a223e0ee4fd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 2x4 matrix.  <a href=\"a00155.html#ga57936a3998e992370e59a223e0ee4fd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga57936a3998e992370e59a223e0ee4fd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5085e3ff02abbac5e537eb7b89ab63b6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">umat3</a></td></tr>\n<tr class=\"memdesc:ga5085e3ff02abbac5e537eb7b89ab63b6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5085e3ff02abbac5e537eb7b89ab63b6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9cd7fa637a4a6788337f45231fad9e1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">umat3x2</a></td></tr>\n<tr class=\"memdesc:ga9cd7fa637a4a6788337f45231fad9e1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 3x2 matrix.  <a href=\"a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9cd7fa637a4a6788337f45231fad9e1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f2cfcf3357db0cdf31fcb15e3c6bafb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">umat3x3</a></td></tr>\n<tr class=\"memdesc:ga1f2cfcf3357db0cdf31fcb15e3c6bafb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 3x3 matrix.  <a href=\"a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f2cfcf3357db0cdf31fcb15e3c6bafb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae7c78ff3fc4309605ab0fa186c8d48ba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">umat3x4</a></td></tr>\n<tr class=\"memdesc:gae7c78ff3fc4309605ab0fa186c8d48ba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 3x4 matrix.  <a href=\"a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba\">More...</a><br /></td></tr>\n<tr class=\"separator:gae7c78ff3fc4309605ab0fa186c8d48ba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga38bc7bb6494e344185df596deeb4544c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">umat4</a></td></tr>\n<tr class=\"memdesc:ga38bc7bb6494e344185df596deeb4544c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 4x4 matrix.  <a href=\"a00155.html#ga38bc7bb6494e344185df596deeb4544c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga38bc7bb6494e344185df596deeb4544c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70fa2d05896aa83cbc8c07672a429b53\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">umat4x2</a></td></tr>\n<tr class=\"memdesc:ga70fa2d05896aa83cbc8c07672a429b53\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 4x2 matrix.  <a href=\"a00155.html#ga70fa2d05896aa83cbc8c07672a429b53\">More...</a><br /></td></tr>\n<tr class=\"separator:ga70fa2d05896aa83cbc8c07672a429b53\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga87581417945411f75cb31dd6ca1dba98\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">umat4x3</a></td></tr>\n<tr class=\"memdesc:ga87581417945411f75cb31dd6ca1dba98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 4x3 matrix.  <a href=\"a00155.html#ga87581417945411f75cb31dd6ca1dba98\">More...</a><br /></td></tr>\n<tr class=\"separator:ga87581417945411f75cb31dd6ca1dba98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf72e6d399c42985db6872c50f53d7eb8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef mediump_umat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">umat4x4</a></td></tr>\n<tr class=\"memdesc:gaf72e6d399c42985db6872c50f53d7eb8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unsigned integer 4x4 matrix.  <a href=\"a00155.html#gaf72e6d399c42985db6872c50f53d7eb8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf72e6d399c42985db6872c50f53d7eb8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00060.html\" title=\"GLM_GTC_matrix_integer \">glm/gtc/matrix_integer.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines a number of matrices with integer types. </p>\n<h2 class=\"groupheader\">Typedef Documentation</h2>\n<a class=\"anchor\" id=\"ga8499cc3b016003f835314c1c756e9db9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, int, highp&gt; highp_imat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00037\">37</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa389e2d1c3b10941cae870bc0aeba5b3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, int, highp&gt; highp_imat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00049\">49</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaba49d890e06c9444795f5a133fbf1336\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, int, highp&gt; highp_imat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00053\">53</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga05a970fd4366dad6c8a0be676b1eae5b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, int, highp&gt; highp_imat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00057\">57</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaca4506a3efa679eff7c006d9826291fd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, int, highp&gt; highp_imat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00041\">41</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga91c671c3ff9706c2393e78b22fd84bcb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, int, highp&gt; highp_imat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00061\">61</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga07d7b7173e2a6f843ff5f1c615a95b41\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, int, highp&gt; highp_imat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00065\">65</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga53008f580be99018a17b357b5a4ffc0d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, int, highp&gt; highp_imat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00069\">69</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7cfb09b34e0fcf73eaf6512d6483ef56\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, int, highp&gt; highp_imat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00045\">45</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1858820fb292cae396408b2034407f72\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, int, highp&gt; highp_imat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00073\">73</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6be0b80ae74bb309bc5b964d93d68fc5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, int, highp&gt; highp_imat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00077\">77</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2c783ee6f8f040ab37df2f70392c8b44\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, int, highp&gt; highp_imat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier signed integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00081\">81</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga42cbce64c4c1cd121b8437daa6e110de\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, uint, highp&gt; highp_umat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00186\">186</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5337b7bc95f9cbac08a0c00b3f936b28\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, uint, highp&gt; highp_umat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00198\">198</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga90718c7128320b24b52f9ea70e643ad4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, uint, highp&gt; highp_umat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00202\">202</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadca0a4724b4a6f56a2355b6f6e19248b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, uint, highp&gt; highp_umat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00206\">206</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa1143120339b7d2d469d327662e8a172\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, uint, highp&gt; highp_umat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00190\">190</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga844a5da2e7fc03fc7cccc7f1b70809c4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, uint, highp&gt; highp_umat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00210\">210</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1f7d41c36b980774a4d2e7c1647fb4b2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, uint, highp&gt; highp_umat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00214\">214</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga25ee15c323924f2d0fe9896d329e5086\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, uint, highp&gt; highp_umat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00218\">218</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf665e4e78c2cc32a54ab40325738f9c9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, uint, highp&gt; highp_umat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00194\">194</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae69eb82ec08b0dc9bf2ead2a339ff801\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, uint, highp&gt; highp_umat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00222\">222</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga45a8163d02c43216252056b0c120f3a5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, uint, highp&gt; highp_umat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00226\">226</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6a56cbb769aed334c95241664415f9ba\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, uint, highp&gt; highp_umat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High-qualifier unsigned integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00230\">230</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaabe04f9948d4a213bb1c20137de03e01\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat2 imat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00362\">362</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa4732a240522ad9bc28144fda2fc14ec\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat2x2 imat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00374\">374</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3f42dd3d5d94a0fd5706f7ec8dd0c605\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat2x3 imat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00378\">378</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9d8faafdca42583d67e792dd038fc668\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat2x4 imat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00382\">382</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga038f68437155ffa3c2583a15264a8195\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat3 imat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00366\">366</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7b33bbe4f12c060892bd3cc8d4cd737f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat3x2 imat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00386\">386</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6aacc960f62e8f7d2fe9d32d5050e7a4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat3x3 imat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00390\">390</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e9ce23496d8b08dfc302d4039694b58\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat3x4 imat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00394\">394</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga96b0d26a33b81bb6a60ca0f39682f7eb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat4 imat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00370\">370</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8ce7ef51d8b2c1901fa5414deccbc3fa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat4x2 imat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00398\">398</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga705ee0bf49d6c3de4404ce2481bf0df5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat4x3 imat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00402\">402</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga43ed5e4f475b6f4cad7cba78f29c405b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_imat4x4 imat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Signed integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00406\">406</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa0bff0be804142bb16d441aec0a7962e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, int, lowp&gt; lowp_imat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00136\">136</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga92b95b679975d408645547ab45a8dcd8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, int, lowp&gt; lowp_imat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00149\">149</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8c9e7a388f8e7c52f1e6857dee8afb65\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, int, lowp&gt; lowp_imat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00153\">153</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9cc13bd1f8dd2933e9fa31fe3f70e16e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, int, lowp&gt; lowp_imat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00157\">157</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga69bfe668f4170379fc1f35d82b060c43\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, int, lowp&gt; lowp_imat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00140\">140</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga33db8f27491d30906cd37c0d86b3f432\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, int, lowp&gt; lowp_imat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00161\">161</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga664f061df00020048c3f8530329ace45\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, int, lowp&gt; lowp_imat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00165\">165</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9273faab33623d944af4080befbb2c80\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, int, lowp&gt; lowp_imat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00169\">169</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad1e77f7270cad461ca4fcb4c3ec2e98c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, int, lowp&gt; lowp_imat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00144\">144</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga26ec1a2ba08a1488f5f05336858a0f09\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, int, lowp&gt; lowp_imat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00173\">173</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8f40483a3ae634ead8ad22272c543a33\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, int, lowp&gt; lowp_imat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00177\">177</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf65677e53ac8e31a107399340d5e2451\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, int, lowp&gt; lowp_imat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier signed integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00181\">181</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf2fba702d990437fc88ff3f3a76846ee\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, uint, lowp&gt; lowp_umat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00285\">285</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7b2e9d89745f7175051284e54c81d81c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, uint, lowp&gt; lowp_umat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00298\">298</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3072f90fd86f17a862e21589fbb14c0f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, uint, lowp&gt; lowp_umat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00302\">302</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8bb45fec4bd77bd81b4ae7eb961a270d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, uint, lowp&gt; lowp_umat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00306\">306</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf1145f72bcdd590f5808c4bc170c2924\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, uint, lowp&gt; lowp_umat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00289\">289</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga56ea68c6a6cba8d8c21d17bb14e69c6b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, uint, lowp&gt; lowp_umat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00310\">310</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4f660a39a395cc14f018f985e7dfbeb5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, uint, lowp&gt; lowp_umat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00314\">314</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaec3d624306bd59649f021864709d56b5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, uint, lowp&gt; lowp_umat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00318\">318</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac092c6105827bf9ea080db38074b78eb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, uint, lowp&gt; lowp_umat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00293\">293</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7716c2b210d141846f1ac4e774adef5e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, uint, lowp&gt; lowp_umat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00322\">322</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga09ab33a2636f5f43f7fae29cfbc20fff\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, uint, lowp&gt; lowp_umat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00326\">326</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga10aafc66cf1a0ece336b1c5ae13d0cc0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, uint, lowp&gt; lowp_umat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low-qualifier unsigned integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00330\">330</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga20f4cc7ab23e2aa1f4db9fdb5496d378\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, int, mediump&gt; mediump_imat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00086\">86</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4b2aeb11a329940721dda9583e71f856\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, int, mediump&gt; mediump_imat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00099\">99</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga74362470ba99843ac70aee5ac38cc674\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, int, mediump&gt; mediump_imat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00103\">103</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8da25cd380ba30fc5b68a4687deb3e09\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, int, mediump&gt; mediump_imat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00107\">107</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6c63bdc736efd3466e0730de0251cb71\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, int, mediump&gt; mediump_imat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00090\">90</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac0b4e42d648fb3eaf4bb88da82ecc809\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, int, mediump&gt; mediump_imat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00111\">111</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad99cc2aad8fc57f068cfa7719dbbea12\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, int, mediump&gt; mediump_imat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00115\">115</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga67689a518b181a26540bc44a163525cd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, int, mediump&gt; mediump_imat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00119\">119</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf348552978553630d2a00b78eb887ced\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, int, mediump&gt; mediump_imat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00094\">94</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b2d35816f7103f0f4c82dd2f27571fc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, int, mediump&gt; mediump_imat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00123\">123</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5b10acc696759e03f6ab918f4467e94c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, int, mediump&gt; mediump_imat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00127\">127</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2596869d154dec1180beadbb9df80501\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, int, mediump&gt; mediump_imat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier signed integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00131\">131</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga43041378b3410ea951b7de0dfd2bc7ee\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, uint, mediump&gt; mediump_umat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00235\">235</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3b209b1b751f041422137e3c065dfa98\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 2, uint, mediump&gt; mediump_umat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00248\">248</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaee2c1f13b41f4c92ea5b3efe367a1306\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 3, uint, mediump&gt; mediump_umat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00252\">252</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae1317ddca16d01e119a40b7f0ee85f95\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;2, 4, uint, mediump&gt; mediump_umat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00256\">256</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1730dbe3c67801f53520b06d1aa0a34a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, uint, mediump&gt; mediump_umat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00239\">239</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaadc28bfdc8ebca81ae85121b11994970\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 2, uint, mediump&gt; mediump_umat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00260\">260</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga48f2fc38d3f7fab3cfbc961278ced53d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 3, uint, mediump&gt; mediump_umat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00264\">264</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga78009a1e4ca64217e46b418535e52546\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;3, 4, uint, mediump&gt; mediump_umat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00268\">268</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5087c2beb26a11d9af87432e554cf9d1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, uint, mediump&gt; mediump_umat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00243\">243</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf35aefd81cc13718f6b059623f7425fa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 2, uint, mediump&gt; mediump_umat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00272\">272</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4e1bed14fbc7f4b376aaed064f89f0fb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 3, uint, mediump&gt; mediump_umat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00276\">276</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa9428fc8430dc552aad920653f822ef3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt;4, 4, uint, mediump&gt; mediump_umat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium-qualifier unsigned integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00280\">280</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4cae85566f900debf930c41944b64691\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat2 umat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00439\">439</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabf8acdd33ce8951051edbca5200898aa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat2x2 umat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 2x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00451\">451</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1870da7578d5022b973a83155d386ab3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat2x3 umat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00455\">455</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga57936a3998e992370e59a223e0ee4fd4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat2x4 umat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00459\">459</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5085e3ff02abbac5e537eb7b89ab63b6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat3 umat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00443\">443</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9cd7fa637a4a6788337f45231fad9e1a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat3x2 umat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00463\">463</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1f2cfcf3357db0cdf31fcb15e3c6bafb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat3x3 umat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00467\">467</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae7c78ff3fc4309605ab0fa186c8d48ba\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat3x4 umat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00471\">471</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga38bc7bb6494e344185df596deeb4544c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat4 umat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00447\">447</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga70fa2d05896aa83cbc8c07672a429b53\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat4x2 umat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00475\">475</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga87581417945411f75cb31dd6ca1dba98\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat4x3 umat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00479\">479</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf72e6d399c42985db6872c50f53d7eb8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mediump_umat4x4 umat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unsigned integer 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00155.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_integer</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00060_source.html#l00483\">483</a> of file <a class=\"el\" href=\"a00060_source.html\">matrix_integer.hpp</a>.</p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00156.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_matrix_inverse</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_matrix_inverse<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00060.html\" title=\"GLM_GTC_matrix_integer \">glm/gtc/matrix_integer.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gae0fcc5fc8783291f9702272de428fa0e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae0fcc5fc8783291f9702272de428fa0e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00156.html#gae0fcc5fc8783291f9702272de428fa0e\">affineInverse</a> (genType const &amp;m)</td></tr>\n<tr class=\"memdesc:gae0fcc5fc8783291f9702272de428fa0e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Fast matrix inverse for affine matrix.  <a href=\"a00156.html#gae0fcc5fc8783291f9702272de428fa0e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae0fcc5fc8783291f9702272de428fa0e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab213cd0e3ead5f316d583f99d6312008\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gab213cd0e3ead5f316d583f99d6312008\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00156.html#gab213cd0e3ead5f316d583f99d6312008\">inverseTranspose</a> (genType const &amp;m)</td></tr>\n<tr class=\"memdesc:gab213cd0e3ead5f316d583f99d6312008\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the inverse transpose of a matrix.  <a href=\"a00156.html#gab213cd0e3ead5f316d583f99d6312008\">More...</a><br /></td></tr>\n<tr class=\"separator:gab213cd0e3ead5f316d583f99d6312008\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00060.html\" title=\"GLM_GTC_matrix_integer \">glm/gtc/matrix_integer.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines additional matrix inverting functions. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gae0fcc5fc8783291f9702272de428fa0e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::affineInverse </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Fast matrix inverse for affine matrix. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix to invert. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00156.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_inverse</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab213cd0e3ead5f316d583f99d6312008\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::inverseTranspose </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute the inverse transpose of a matrix. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix to invert transpose. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00156.html\" title=\"Include <glm/gtc/matrix_integer.hpp> to use the features of this extension. \">GLM_GTC_matrix_inverse</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00157.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_matrix_transform</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_matrix_transform<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00066.html\" title=\"GLM_GTC_matrix_transform \">glm/gtc/matrix_transform.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0bcd4542e0affc63a0b8c08fcb839ea9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0bcd4542e0affc63a0b8c08fcb839ea9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga0bcd4542e0affc63a0b8c08fcb839ea9\">frustum</a> (T left, T right, T bottom, T top, T near, T far)</td></tr>\n<tr class=\"memdesc:ga0bcd4542e0affc63a0b8c08fcb839ea9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a frustum matrix with default handedness.  <a href=\"a00157.html#ga0bcd4542e0affc63a0b8c08fcb839ea9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0bcd4542e0affc63a0b8c08fcb839ea9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae4277c37f61d81da01bc9db14ea90296\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae4277c37f61d81da01bc9db14ea90296\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gae4277c37f61d81da01bc9db14ea90296\">frustumLH</a> (T left, T right, T bottom, T top, T near, T far)</td></tr>\n<tr class=\"memdesc:gae4277c37f61d81da01bc9db14ea90296\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a left handed frustum matrix.  <a href=\"a00157.html#gae4277c37f61d81da01bc9db14ea90296\">More...</a><br /></td></tr>\n<tr class=\"separator:gae4277c37f61d81da01bc9db14ea90296\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4366ab45880c6c5f8b3e8c371ca4b136\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga4366ab45880c6c5f8b3e8c371ca4b136\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga4366ab45880c6c5f8b3e8c371ca4b136\">frustumRH</a> (T left, T right, T bottom, T top, T near, T far)</td></tr>\n<tr class=\"memdesc:ga4366ab45880c6c5f8b3e8c371ca4b136\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a right handed frustum matrix.  <a href=\"a00157.html#ga4366ab45880c6c5f8b3e8c371ca4b136\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4366ab45880c6c5f8b3e8c371ca4b136\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga44fa38a18349450325cae2661bb115ca\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga44fa38a18349450325cae2661bb115ca\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga44fa38a18349450325cae2661bb115ca\">infinitePerspective</a> (T fovy, T aspect, T near)</td></tr>\n<tr class=\"memdesc:ga44fa38a18349450325cae2661bb115ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default handedness.  <a href=\"a00157.html#ga44fa38a18349450325cae2661bb115ca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga44fa38a18349450325cae2661bb115ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3201b30f5b3ea0f933246d87bfb992a9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga3201b30f5b3ea0f933246d87bfb992a9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga3201b30f5b3ea0f933246d87bfb992a9\">infinitePerspectiveLH</a> (T fovy, T aspect, T near)</td></tr>\n<tr class=\"memdesc:ga3201b30f5b3ea0f933246d87bfb992a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite.  <a href=\"a00157.html#ga3201b30f5b3ea0f933246d87bfb992a9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3201b30f5b3ea0f933246d87bfb992a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99672ffe5714ef478dab2437255fe7e1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga99672ffe5714ef478dab2437255fe7e1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga99672ffe5714ef478dab2437255fe7e1\">infinitePerspectiveRH</a> (T fovy, T aspect, T near)</td></tr>\n<tr class=\"memdesc:ga99672ffe5714ef478dab2437255fe7e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite.  <a href=\"a00157.html#ga99672ffe5714ef478dab2437255fe7e1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99672ffe5714ef478dab2437255fe7e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa64aa951a0e99136bba9008d2b59c78e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa64aa951a0e99136bba9008d2b59c78e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaa64aa951a0e99136bba9008d2b59c78e\">lookAt</a> (vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:gaa64aa951a0e99136bba9008d2b59c78e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a look at view matrix based on the default handedness.  <a href=\"a00157.html#gaa64aa951a0e99136bba9008d2b59c78e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa64aa951a0e99136bba9008d2b59c78e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab2c09e25b0a16d3a9d89cc85bbae41b0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab2c09e25b0a16d3a9d89cc85bbae41b0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gab2c09e25b0a16d3a9d89cc85bbae41b0\">lookAtLH</a> (vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:gab2c09e25b0a16d3a9d89cc85bbae41b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a left handed look at view matrix.  <a href=\"a00157.html#gab2c09e25b0a16d3a9d89cc85bbae41b0\">More...</a><br /></td></tr>\n<tr class=\"separator:gab2c09e25b0a16d3a9d89cc85bbae41b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacfa12c8889c754846bc20c65d9b5c701\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacfa12c8889c754846bc20c65d9b5c701\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gacfa12c8889c754846bc20c65d9b5c701\">lookAtRH</a> (vec&lt; 3, T, Q &gt; const &amp;eye, vec&lt; 3, T, Q &gt; const &amp;center, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:gacfa12c8889c754846bc20c65d9b5c701\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a right handed look at view matrix.  <a href=\"a00157.html#gacfa12c8889c754846bc20c65d9b5c701\">More...</a><br /></td></tr>\n<tr class=\"separator:gacfa12c8889c754846bc20c65d9b5c701\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6615d8a9d39432e279c4575313ecb456\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga6615d8a9d39432e279c4575313ecb456\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga6615d8a9d39432e279c4575313ecb456\">ortho</a> (T left, T right, T bottom, T top, T zNear, T zFar)</td></tr>\n<tr class=\"memdesc:ga6615d8a9d39432e279c4575313ecb456\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for an orthographic parallel viewing volume, using the default handedness.  <a href=\"a00157.html#ga6615d8a9d39432e279c4575313ecb456\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6615d8a9d39432e279c4575313ecb456\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae5b6b40ed882cd56cd7cb97701909c06\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae5b6b40ed882cd56cd7cb97701909c06\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gae5b6b40ed882cd56cd7cb97701909c06\">ortho</a> (T left, T right, T bottom, T top)</td></tr>\n<tr class=\"memdesc:gae5b6b40ed882cd56cd7cb97701909c06\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for projecting two-dimensional coordinates onto the screen.  <a href=\"a00157.html#gae5b6b40ed882cd56cd7cb97701909c06\">More...</a><br /></td></tr>\n<tr class=\"separator:gae5b6b40ed882cd56cd7cb97701909c06\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad122a79aadaa5529cec4ac197203db7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gad122a79aadaa5529cec4ac197203db7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gad122a79aadaa5529cec4ac197203db7f\">orthoLH</a> (T left, T right, T bottom, T top, T zNear, T zFar)</td></tr>\n<tr class=\"memdesc:gad122a79aadaa5529cec4ac197203db7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for an orthographic parallel viewing volume, using left-handedness.  <a href=\"a00157.html#gad122a79aadaa5529cec4ac197203db7f\">More...</a><br /></td></tr>\n<tr class=\"separator:gad122a79aadaa5529cec4ac197203db7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16264c9b838edeb9dd1de7a1010a13a4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga16264c9b838edeb9dd1de7a1010a13a4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga16264c9b838edeb9dd1de7a1010a13a4\">orthoRH</a> (T left, T right, T bottom, T top, T zNear, T zFar)</td></tr>\n<tr class=\"memdesc:ga16264c9b838edeb9dd1de7a1010a13a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for an orthographic parallel viewing volume, using right-handedness.  <a href=\"a00157.html#ga16264c9b838edeb9dd1de7a1010a13a4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16264c9b838edeb9dd1de7a1010a13a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga747c8cf99458663dd7ad1bb3a2f07787\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga747c8cf99458663dd7ad1bb3a2f07787\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787\">perspective</a> (T fovy, T aspect, T near, T far)</td></tr>\n<tr class=\"memdesc:ga747c8cf99458663dd7ad1bb3a2f07787\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a symetric perspective-view frustum based on the default handedness.  <a href=\"a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787\">More...</a><br /></td></tr>\n<tr class=\"separator:ga747c8cf99458663dd7ad1bb3a2f07787\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebd02240fd36e85ad754f02ddd9a560d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaebd02240fd36e85ad754f02ddd9a560d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaebd02240fd36e85ad754f02ddd9a560d\">perspectiveFov</a> (T fov, T width, T height, T near, T far)</td></tr>\n<tr class=\"memdesc:gaebd02240fd36e85ad754f02ddd9a560d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a perspective projection matrix based on a field of view and the default handedness.  <a href=\"a00157.html#gaebd02240fd36e85ad754f02ddd9a560d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebd02240fd36e85ad754f02ddd9a560d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6aebe16c164bd8e52554cbe0304ef4aa\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga6aebe16c164bd8e52554cbe0304ef4aa\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga6aebe16c164bd8e52554cbe0304ef4aa\">perspectiveFovLH</a> (T fov, T width, T height, T near, T far)</td></tr>\n<tr class=\"memdesc:ga6aebe16c164bd8e52554cbe0304ef4aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a left handed perspective projection matrix based on a field of view.  <a href=\"a00157.html#ga6aebe16c164bd8e52554cbe0304ef4aa\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6aebe16c164bd8e52554cbe0304ef4aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf32bf563f28379c68554a44ee60c6a85\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaf32bf563f28379c68554a44ee60c6a85\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaf32bf563f28379c68554a44ee60c6a85\">perspectiveFovRH</a> (T fov, T width, T height, T near, T far)</td></tr>\n<tr class=\"memdesc:gaf32bf563f28379c68554a44ee60c6a85\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a right handed perspective projection matrix based on a field of view.  <a href=\"a00157.html#gaf32bf563f28379c68554a44ee60c6a85\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf32bf563f28379c68554a44ee60c6a85\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bd34951dc7022ac256fcb51d7f6fc2f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga9bd34951dc7022ac256fcb51d7f6fc2f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga9bd34951dc7022ac256fcb51d7f6fc2f\">perspectiveLH</a> (T fovy, T aspect, T near, T far)</td></tr>\n<tr class=\"memdesc:ga9bd34951dc7022ac256fcb51d7f6fc2f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a left handed, symetric perspective-view frustum.  <a href=\"a00157.html#ga9bd34951dc7022ac256fcb51d7f6fc2f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9bd34951dc7022ac256fcb51d7f6fc2f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga26b88757fbd90601b80768a7e1ad3aa1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga26b88757fbd90601b80768a7e1ad3aa1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga26b88757fbd90601b80768a7e1ad3aa1\">perspectiveRH</a> (T fovy, T aspect, T near, T far)</td></tr>\n<tr class=\"memdesc:ga26b88757fbd90601b80768a7e1ad3aa1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a right handed, symetric perspective-view frustum.  <a href=\"a00157.html#ga26b88757fbd90601b80768a7e1ad3aa1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga26b88757fbd90601b80768a7e1ad3aa1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q, typename U &gt; </td></tr>\n<tr class=\"memitem:gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaf6b21eadb7ac2ecbbe258a9a233b4c82\">pickMatrix</a> (vec&lt; 2, T, Q &gt; const &amp;center, vec&lt; 2, T, Q &gt; const &amp;delta, vec&lt; 4, U, Q &gt; const &amp;viewport)</td></tr>\n<tr class=\"memdesc:gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Define a picking region.  <a href=\"a00157.html#gaf6b21eadb7ac2ecbbe258a9a233b4c82\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf6b21eadb7ac2ecbbe258a9a233b4c82\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf36e96033f456659e6705472a06b6e11\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf36e96033f456659e6705472a06b6e11\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaf36e96033f456659e6705472a06b6e11\">project</a> (vec&lt; 3, T, Q &gt; const &amp;obj, mat&lt; 4, 4, T, Q &gt; const &amp;model, mat&lt; 4, 4, T, Q &gt; const &amp;proj, vec&lt; 4, U, Q &gt; const &amp;viewport)</td></tr>\n<tr class=\"memdesc:gaf36e96033f456659e6705472a06b6e11\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates.  <a href=\"a00157.html#gaf36e96033f456659e6705472a06b6e11\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf36e96033f456659e6705472a06b6e11\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaee9e865eaa9776370996da2940873fd4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaee9e865eaa9776370996da2940873fd4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaee9e865eaa9776370996da2940873fd4\">rotate</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:gaee9e865eaa9776370996da2940873fd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a rotation 4 * 4 matrix created from an axis vector and an angle.  <a href=\"a00157.html#gaee9e865eaa9776370996da2940873fd4\">More...</a><br /></td></tr>\n<tr class=\"separator:gaee9e865eaa9776370996da2940873fd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga05051adbee603fb3c5095d8cf5cc229b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga05051adbee603fb3c5095d8cf5cc229b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">scale</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga05051adbee603fb3c5095d8cf5cc229b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a scale 4 * 4 matrix created from 3 scalars.  <a href=\"a00157.html#ga05051adbee603fb3c5095d8cf5cc229b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga05051adbee603fb3c5095d8cf5cc229b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1a4ecc4ad82652b8fb14dcb087879284\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1a4ecc4ad82652b8fb14dcb087879284\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284\">translate</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1a4ecc4ad82652b8fb14dcb087879284\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a translation 4 * 4 matrix created from a vector of 3 components.  <a href=\"a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a4ecc4ad82652b8fb14dcb087879284\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaaeacc04a2a6f4b18c5899d37e7bb3ef9\">tweakedInfinitePerspective</a> (T fovy, T aspect, T near)</td></tr>\n<tr class=\"memdesc:gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping.  <a href=\"a00157.html#gaaeacc04a2a6f4b18c5899d37e7bb3ef9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5b3c85ff6737030a1d2214474ffa7a8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaf5b3c85ff6737030a1d2214474ffa7a8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8\">tweakedInfinitePerspective</a> (T fovy, T aspect, T near, T ep)</td></tr>\n<tr class=\"memdesc:gaf5b3c85ff6737030a1d2214474ffa7a8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping.  <a href=\"a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf5b3c85ff6737030a1d2214474ffa7a8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga36641e5d60f994e01c3d8f56b10263d2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga36641e5d60f994e01c3d8f56b10263d2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00157.html#ga36641e5d60f994e01c3d8f56b10263d2\">unProject</a> (vec&lt; 3, T, Q &gt; const &amp;win, mat&lt; 4, 4, T, Q &gt; const &amp;model, mat&lt; 4, 4, T, Q &gt; const &amp;proj, vec&lt; 4, U, Q &gt; const &amp;viewport)</td></tr>\n<tr class=\"memdesc:ga36641e5d60f994e01c3d8f56b10263d2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Map the specified window coordinates (win.x, win.y, win.z) into object coordinates.  <a href=\"a00157.html#ga36641e5d60f994e01c3d8f56b10263d2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga36641e5d60f994e01c3d8f56b10263d2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00066.html\" title=\"GLM_GTC_matrix_transform \">glm/gtc/matrix_transform.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines functions that generate common transformation matrices.</p>\n<p>The matrices generated by this extension use standard OpenGL fixed-function conventions. For example, the lookAt function generates a transform from world space into the specific eye space that the projective matrix functions (perspective, ortho, etc) are designed to expect. The OpenGL compatibility specifications defines the particular layout of this eye space. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga0bcd4542e0affc63a0b8c08fcb839ea9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::frustum </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>left</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>right</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bottom</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>top</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a frustum matrix with default handedness. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFrustum.xml\">glFrustum man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae4277c37f61d81da01bc9db14ea90296\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::frustumLH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>left</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>right</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bottom</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>top</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a left handed frustum matrix. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4366ab45880c6c5f8b3e8c371ca4b136\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::frustumRH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>left</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>right</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bottom</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>top</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a right handed frustum matrix. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga44fa38a18349450325cae2661bb115ca\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::infinitePerspective </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fovy</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>aspect</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default handedness. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fovy</td><td>Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">aspect</td><td>Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3201b30f5b3ea0f933246d87bfb992a9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::infinitePerspectiveLH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fovy</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>aspect</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fovy</td><td>Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">aspect</td><td>Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga99672ffe5714ef478dab2437255fe7e1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::infinitePerspectiveRH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fovy</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>aspect</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fovy</td><td>Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">aspect</td><td>Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa64aa951a0e99136bba9008d2b59c78e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::lookAt </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>eye</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>center</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>up</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a look at view matrix based on the default handedness. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">eye</td><td>Position of the camera </td></tr>\n    <tr><td class=\"paramname\">center</td><td>Position where the camera is looking at </td></tr>\n    <tr><td class=\"paramname\">up</td><td>Normalized up vector, how the camera is oriented. Typically (0, 0, 1) </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- frustum(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top, T const&amp; nearVal, T const&amp; farVal) frustum(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top, T const&amp; nearVal, T const&amp; farVal) </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml\">gluLookAt man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab2c09e25b0a16d3a9d89cc85bbae41b0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::lookAtLH </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>eye</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>center</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>up</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a left handed look at view matrix. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">eye</td><td>Position of the camera </td></tr>\n    <tr><td class=\"paramname\">center</td><td>Position where the camera is looking at </td></tr>\n    <tr><td class=\"paramname\">up</td><td>Normalized up vector, how the camera is oriented. Typically (0, 0, 1) </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- frustum(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top, T const&amp; nearVal, T const&amp; farVal) frustum(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top, T const&amp; nearVal, T const&amp; farVal) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacfa12c8889c754846bc20c65d9b5c701\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::lookAtRH </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>eye</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>center</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>up</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a right handed look at view matrix. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">eye</td><td>Position of the camera </td></tr>\n    <tr><td class=\"paramname\">center</td><td>Position where the camera is looking at </td></tr>\n    <tr><td class=\"paramname\">up</td><td>Normalized up vector, how the camera is oriented. Typically (0, 0, 1) </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- frustum(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top, T const&amp; nearVal, T const&amp; farVal) frustum(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top, T const&amp; nearVal, T const&amp; farVal) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6615d8a9d39432e279c4575313ecb456\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::ortho </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>left</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>right</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bottom</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>top</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>zNear</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>zFar</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for an orthographic parallel viewing volume, using the default handedness. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- glm::ortho(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top) </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml\">glOrtho man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae5b6b40ed882cd56cd7cb97701909c06\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::ortho </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>left</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>right</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bottom</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>top</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for projecting two-dimensional coordinates onto the screen. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- glm::ortho(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top, T const&amp; zNear, T const&amp; zFar) </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluOrtho2D.xml\">gluOrtho2D man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad122a79aadaa5529cec4ac197203db7f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::orthoLH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>left</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>right</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bottom</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>top</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>zNear</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>zFar</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for an orthographic parallel viewing volume, using left-handedness. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- glm::ortho(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga16264c9b838edeb9dd1de7a1010a13a4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::orthoRH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>left</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>right</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bottom</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>top</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>zNear</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>zFar</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for an orthographic parallel viewing volume, using right-handedness. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- glm::ortho(T const&amp; left, T const&amp; right, T const&amp; bottom, T const&amp; top) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga747c8cf99458663dd7ad1bb3a2f07787\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::perspective </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fovy</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>aspect</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for a symetric perspective-view frustum based on the default handedness. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fovy</td><td>Specifies the field of view angle in the y direction. Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">aspect</td><td>Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n    <tr><td class=\"paramname\">far</td><td>Specifies the distance from the viewer to the far clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPerspective.xml\">gluPerspective man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaebd02240fd36e85ad754f02ddd9a560d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::perspectiveFov </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fov</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>width</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>height</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a perspective projection matrix based on a field of view and the default handedness. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fov</td><td>Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">width</td><td>Width of the viewport </td></tr>\n    <tr><td class=\"paramname\">height</td><td>Height of the viewport </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n    <tr><td class=\"paramname\">far</td><td>Specifies the distance from the viewer to the far clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6aebe16c164bd8e52554cbe0304ef4aa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::perspectiveFovLH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fov</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>width</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>height</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a left handed perspective projection matrix based on a field of view. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fov</td><td>Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">width</td><td>Width of the viewport </td></tr>\n    <tr><td class=\"paramname\">height</td><td>Height of the viewport </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n    <tr><td class=\"paramname\">far</td><td>Specifies the distance from the viewer to the far clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf32bf563f28379c68554a44ee60c6a85\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::perspectiveFovRH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fov</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>width</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>height</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a right handed perspective projection matrix based on a field of view. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fov</td><td>Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">width</td><td>Width of the viewport </td></tr>\n    <tr><td class=\"paramname\">height</td><td>Height of the viewport </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n    <tr><td class=\"paramname\">far</td><td>Specifies the distance from the viewer to the far clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9bd34951dc7022ac256fcb51d7f6fc2f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::perspectiveLH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fovy</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>aspect</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for a left handed, symetric perspective-view frustum. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fovy</td><td>Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">aspect</td><td>Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n    <tr><td class=\"paramname\">far</td><td>Specifies the distance from the viewer to the far clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga26b88757fbd90601b80768a7e1ad3aa1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::perspectiveRH </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fovy</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>aspect</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>far</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for a right handed, symetric perspective-view frustum. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fovy</td><td>Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">aspect</td><td>Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n    <tr><td class=\"paramname\">far</td><td>Specifies the distance from the viewer to the far clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf6b21eadb7ac2ecbbe258a9a233b4c82\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::pickMatrix </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>center</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>delta</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>viewport</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Define a picking region. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">center</td><td>Specify the center of a picking region in window coordinates. </td></tr>\n    <tr><td class=\"paramname\">delta</td><td>Specify the width and height, respectively, of the picking region in window coordinates. </td></tr>\n    <tr><td class=\"paramname\">viewport</td><td>Rendering viewport </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Native type used for the computation. Currently supported: half (not recommanded), float or double. </td></tr>\n    <tr><td class=\"paramname\">U</td><td>Currently supported: Floating-point types and integer types. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPickMatrix.xml\">gluPickMatrix man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf36e96033f456659e6705472a06b6e11\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::project </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>obj</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>model</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>proj</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>viewport</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">obj</td><td>Specify the object coordinates. </td></tr>\n    <tr><td class=\"paramname\">model</td><td>Specifies the current modelview matrix </td></tr>\n    <tr><td class=\"paramname\">proj</td><td>Specifies the current projection matrix </td></tr>\n    <tr><td class=\"paramname\">viewport</td><td>Specifies the current viewport </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section return\"><dt>Returns</dt><dd>Return the computed window coordinates. </dd></dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Native type used for the computation. Currently supported: half (not recommanded), float or double. </td></tr>\n    <tr><td class=\"paramname\">U</td><td>Currently supported: Floating-point types and integer types. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml\">gluProject man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaee9e865eaa9776370996da2940873fd4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>axis</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a rotation 4 * 4 matrix created from an axis vector and an angle. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this rotation matrix. </td></tr>\n    <tr><td class=\"paramname\">angle</td><td>Rotation angle expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">axis</td><td>Rotation axis, recommended to be normalized. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Supported: half, float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- rotate(mat&lt;4, 4, T, Q&gt; const&amp; m, T angle, T x, T y, T z) </dd>\n<dd>\n- rotate(T angle, vec&lt;3, T, Q&gt; const&amp; v) </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRotate.xml\">glRotate man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga05051adbee603fb3c5095d8cf5cc229b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::scale </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a scale 4 * 4 matrix created from 3 scalars. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this scale matrix. </td></tr>\n    <tr><td class=\"paramname\">v</td><td>Ratio of scaling for each axis. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommended), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- scale(mat&lt;4, 4, T, Q&gt; const&amp; m, T x, T y, T z) </dd>\n<dd>\n- scale(vec&lt;3, T, Q&gt; const&amp; v) </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glScale.xml\">glScale man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1a4ecc4ad82652b8fb14dcb087879284\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::translate </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a translation 4 * 4 matrix created from a vector of 3 components. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this translation matrix. </td></tr>\n    <tr><td class=\"paramname\">v</td><td>Coordinates of a translation vector. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. <div class=\"fragment\"><div class=\"line\"><span class=\"preprocessor\">#include &lt;<a class=\"code\" href=\"a00035.html\">glm/glm.hpp</a>&gt;</span></div>\n<div class=\"line\"><span class=\"preprocessor\">#include &lt;<a class=\"code\" href=\"a00066.html\">glm/gtc/matrix_transform.hpp</a>&gt;</span></div>\n<div class=\"line\">...</div>\n<div class=\"line\">glm::mat4 m = <a class=\"code\" href=\"a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284\">glm::translate</a>(<a class=\"code\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">glm::mat4</a>(1.0f), <a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">glm::vec3</a>(1.0f));</div>\n<div class=\"line\"><span class=\"comment\">// m[0][0] == 1.0f, m[0][1] == 0.0f, m[0][2] == 0.0f, m[0][3] == 0.0f</span></div>\n<div class=\"line\"><span class=\"comment\">// m[1][0] == 0.0f, m[1][1] == 1.0f, m[1][2] == 0.0f, m[1][3] == 0.0f</span></div>\n<div class=\"line\"><span class=\"comment\">// m[2][0] == 0.0f, m[2][1] == 0.0f, m[2][2] == 1.0f, m[2][3] == 0.0f</span></div>\n<div class=\"line\"><span class=\"comment\">// m[3][0] == 1.0f, m[3][1] == 1.0f, m[3][2] == 1.0f, m[3][3] == 1.0f</span></div>\n</div><!-- fragment --> </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n- translate(mat&lt;4, 4, T, Q&gt; const&amp; m, T x, T y, T z) </dd>\n<dd>\n- translate(vec&lt;3, T, Q&gt; const&amp; v) </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTranslate.xml\">glTranslate man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaeacc04a2a6f4b18c5899d37e7bb3ef9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::tweakedInfinitePerspective </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fovy</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>aspect</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fovy</td><td>Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">aspect</td><td>Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf5b3c85ff6737030a1d2214474ffa7a8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::tweakedInfinitePerspective </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>fovy</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>aspect</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>near</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>ep</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">fovy</td><td>Specifies the field of view angle, in degrees, in the y direction. Expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">aspect</td><td>Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height). </td></tr>\n    <tr><td class=\"paramname\">near</td><td>Specifies the distance from the viewer to the near clipping plane (always positive). </td></tr>\n    <tr><td class=\"paramname\">ep</td><td>Epsilon </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga36641e5d60f994e01c3d8f56b10263d2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::unProject </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>win</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>model</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>proj</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>viewport</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">win</td><td>Specify the window coordinates to be mapped. </td></tr>\n    <tr><td class=\"paramname\">model</td><td>Specifies the modelview matrix </td></tr>\n    <tr><td class=\"paramname\">proj</td><td>Specifies the projection matrix </td></tr>\n    <tr><td class=\"paramname\">viewport</td><td>Specifies the viewport </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section return\"><dt>Returns</dt><dd>Returns the computed object coordinates. </dd></dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Native type used for the computation. Currently supported: half (not recommanded), float or double. </td></tr>\n    <tr><td class=\"paramname\">U</td><td>Currently supported: Floating-point types and integer types. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml\">gluUnProject man page</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00158.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_noise</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_noise<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00069.html\" title=\"GLM_GTC_noise \">glm/gtc/noise.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga1e043ce3b51510e9bc4469227cefc38a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1e043ce3b51510e9bc4469227cefc38a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00158.html#ga1e043ce3b51510e9bc4469227cefc38a\">perlin</a> (vec&lt; L, T, Q &gt; const &amp;p)</td></tr>\n<tr class=\"memdesc:ga1e043ce3b51510e9bc4469227cefc38a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Classic perlin noise.  <a href=\"a00158.html#ga1e043ce3b51510e9bc4469227cefc38a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e043ce3b51510e9bc4469227cefc38a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac270edc54c5fc52f5985a45f940bb103\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac270edc54c5fc52f5985a45f940bb103\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00158.html#gac270edc54c5fc52f5985a45f940bb103\">perlin</a> (vec&lt; L, T, Q &gt; const &amp;p, vec&lt; L, T, Q &gt; const &amp;rep)</td></tr>\n<tr class=\"memdesc:gac270edc54c5fc52f5985a45f940bb103\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Periodic perlin noise.  <a href=\"a00158.html#gac270edc54c5fc52f5985a45f940bb103\">More...</a><br /></td></tr>\n<tr class=\"separator:gac270edc54c5fc52f5985a45f940bb103\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8122468c69015ff397349a7dcc638b27\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8122468c69015ff397349a7dcc638b27\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00158.html#ga8122468c69015ff397349a7dcc638b27\">simplex</a> (vec&lt; L, T, Q &gt; const &amp;p)</td></tr>\n<tr class=\"memdesc:ga8122468c69015ff397349a7dcc638b27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simplex noise.  <a href=\"a00158.html#ga8122468c69015ff397349a7dcc638b27\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8122468c69015ff397349a7dcc638b27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00069.html\" title=\"GLM_GTC_noise \">glm/gtc/noise.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines 2D, 3D and 4D procedural noise functions Based on the work of Stefan Gustavson and Ashima Arts on \"webgl-noise\": <a href=\"https://github.com/ashima/webgl-noise\">https://github.com/ashima/webgl-noise</a> Following Stefan Gustavson's paper \"Simplex noise demystified\": <a href=\"http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\">http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf</a> </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga1e043ce3b51510e9bc4469227cefc38a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::perlin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Classic perlin noise. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00158.html\" title=\"Include <glm/gtc/noise.hpp> to use the features of this extension. \">GLM_GTC_noise</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac270edc54c5fc52f5985a45f940bb103\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::perlin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rep</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Periodic perlin noise. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00158.html\" title=\"Include <glm/gtc/noise.hpp> to use the features of this extension. \">GLM_GTC_noise</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8122468c69015ff397349a7dcc638b27\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::simplex </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Simplex noise. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00158.html\" title=\"Include <glm/gtc/noise.hpp> to use the features of this extension. \">GLM_GTC_noise</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00159.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_packing</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_packing<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00076.html\" title=\"GLM_GTC_packing \">glm/gtc/packing.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga4944ad465ff950e926d49621f916c78d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga4944ad465ff950e926d49621f916c78d\">packF2x11_1x10</a> (vec3 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga4944ad465ff950e926d49621f916c78d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values.  <a href=\"a00159.html#ga4944ad465ff950e926d49621f916c78d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4944ad465ff950e926d49621f916c78d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3f648fc205467792dc6d8c59c748f8a6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga3f648fc205467792dc6d8c59c748f8a6\">packF3x9_E1x5</a> (vec3 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga3f648fc205467792dc6d8c59c748f8a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values.  <a href=\"a00159.html#ga3f648fc205467792dc6d8c59c748f8a6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3f648fc205467792dc6d8c59c748f8a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2d8bbce673ebc04831c1fb05c47f5251\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2d8bbce673ebc04831c1fb05c47f5251\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint16, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2d8bbce673ebc04831c1fb05c47f5251\">packHalf</a> (vec&lt; L, float, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga2d8bbce673ebc04831c1fb05c47f5251\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer vector obtained by converting the components of a floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification.  <a href=\"a00159.html#ga2d8bbce673ebc04831c1fb05c47f5251\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2d8bbce673ebc04831c1fb05c47f5251\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga43f2093b6ff192a79058ff7834fc3528\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga43f2093b6ff192a79058ff7834fc3528\">packHalf1x16</a> (float v)</td></tr>\n<tr class=\"memdesc:ga43f2093b6ff192a79058ff7834fc3528\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer obtained by converting the components of a floating-point scalar to the 16-bit floating-point representation found in the OpenGL Specification, and then packing this 16-bit value into a 16-bit unsigned integer.  <a href=\"a00159.html#ga43f2093b6ff192a79058ff7834fc3528\">More...</a><br /></td></tr>\n<tr class=\"separator:ga43f2093b6ff192a79058ff7834fc3528\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafe2f7b39caf8f5ec555e1c059ec530e6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gafe2f7b39caf8f5ec555e1c059ec530e6\">packHalf4x16</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gafe2f7b39caf8f5ec555e1c059ec530e6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer obtained by converting the components of a four-component floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification, and then packing these four 16-bit values into a 64-bit unsigned integer.  <a href=\"a00159.html#gafe2f7b39caf8f5ec555e1c059ec530e6\">More...</a><br /></td></tr>\n<tr class=\"separator:gafe2f7b39caf8f5ec555e1c059ec530e6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga06ecb6afb902dba45419008171db9023\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga06ecb6afb902dba45419008171db9023\">packI3x10_1x2</a> (ivec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga06ecb6afb902dba45419008171db9023\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer obtained by converting the components of a four-component signed integer vector to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification, and then packing these four values into a 32-bit unsigned integer.  <a href=\"a00159.html#ga06ecb6afb902dba45419008171db9023\">More...</a><br /></td></tr>\n<tr class=\"separator:ga06ecb6afb902dba45419008171db9023\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3644163cf3a47bf1d4af1f4b03013a7e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga3644163cf3a47bf1d4af1f4b03013a7e\">packInt2x16</a> (i16vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga3644163cf3a47bf1d4af1f4b03013a7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga3644163cf3a47bf1d4af1f4b03013a7e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3644163cf3a47bf1d4af1f4b03013a7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1e4c8a9e67d86b61a6eec86703a827a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gad1e4c8a9e67d86b61a6eec86703a827a\">packInt2x32</a> (i32vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:gad1e4c8a9e67d86b61a6eec86703a827a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#gad1e4c8a9e67d86b61a6eec86703a827a\">More...</a><br /></td></tr>\n<tr class=\"separator:gad1e4c8a9e67d86b61a6eec86703a827a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8884b1f2292414f36d59ef3be5d62914\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga8884b1f2292414f36d59ef3be5d62914\">packInt2x8</a> (i8vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga8884b1f2292414f36d59ef3be5d62914\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga8884b1f2292414f36d59ef3be5d62914\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8884b1f2292414f36d59ef3be5d62914\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1989f093a27ae69cf9207145be48b3d7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga1989f093a27ae69cf9207145be48b3d7\">packInt4x16</a> (i16vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1989f093a27ae69cf9207145be48b3d7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga1989f093a27ae69cf9207145be48b3d7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1989f093a27ae69cf9207145be48b3d7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2238401d5ce2aaade1a44ba19709072\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaf2238401d5ce2aaade1a44ba19709072\">packInt4x8</a> (i8vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf2238401d5ce2aaade1a44ba19709072\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#gaf2238401d5ce2aaade1a44ba19709072\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2238401d5ce2aaade1a44ba19709072\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0466daf4c90f76cc64b3f105ce727295\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0466daf4c90f76cc64b3f105ce727295\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga0466daf4c90f76cc64b3f105ce727295\">packRGBM</a> (vec&lt; 3, T, Q &gt; const &amp;rgb)</td></tr>\n<tr class=\"memdesc:ga0466daf4c90f76cc64b3f105ce727295\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer vector obtained by converting the components of a floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification.  <a href=\"a00159.html#ga0466daf4c90f76cc64b3f105ce727295\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0466daf4c90f76cc64b3f105ce727295\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa54b5855a750d6aeb12c1c902f5939b8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename intType , length_t L, typename floatType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa54b5855a750d6aeb12c1c902f5939b8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, intType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaa54b5855a750d6aeb12c1c902f5939b8\">packSnorm</a> (vec&lt; L, floatType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa54b5855a750d6aeb12c1c902f5939b8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into signed integer values.  <a href=\"a00159.html#gaa54b5855a750d6aeb12c1c902f5939b8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa54b5855a750d6aeb12c1c902f5939b8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab22f8bcfdb5fc65af4701b25f143c1af\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab22f8bcfdb5fc65af4701b25f143c1af\">packSnorm1x16</a> (float v)</td></tr>\n<tr class=\"memdesc:gab22f8bcfdb5fc65af4701b25f143c1af\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the normalized floating-point value v into 16-bit integer value.  <a href=\"a00159.html#gab22f8bcfdb5fc65af4701b25f143c1af\">More...</a><br /></td></tr>\n<tr class=\"separator:gab22f8bcfdb5fc65af4701b25f143c1af\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3592e0795e62aaa1865b3a10496a7a1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gae3592e0795e62aaa1865b3a10496a7a1\">packSnorm1x8</a> (float s)</td></tr>\n<tr class=\"memdesc:gae3592e0795e62aaa1865b3a10496a7a1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the normalized floating-point value v into 8-bit integer value.  <a href=\"a00159.html#gae3592e0795e62aaa1865b3a10496a7a1\">More...</a><br /></td></tr>\n<tr class=\"separator:gae3592e0795e62aaa1865b3a10496a7a1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6be3cfb2cce3702f03e91bbeb5286d7e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga6be3cfb2cce3702f03e91bbeb5286d7e\">packSnorm2x8</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga6be3cfb2cce3702f03e91bbeb5286d7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8-bit integer values.  <a href=\"a00159.html#ga6be3cfb2cce3702f03e91bbeb5286d7e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6be3cfb2cce3702f03e91bbeb5286d7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab997545661877d2c7362a5084d3897d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab997545661877d2c7362a5084d3897d3\">packSnorm3x10_1x2</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gab997545661877d2c7362a5084d3897d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the first three components of the normalized floating-point value v into 10-bit signed integer values.  <a href=\"a00159.html#gab997545661877d2c7362a5084d3897d3\">More...</a><br /></td></tr>\n<tr class=\"separator:gab997545661877d2c7362a5084d3897d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga358943934d21da947d5bcc88c2ab7832\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga358943934d21da947d5bcc88c2ab7832\">packSnorm4x16</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga358943934d21da947d5bcc88c2ab7832\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 16-bit integer values.  <a href=\"a00159.html#ga358943934d21da947d5bcc88c2ab7832\">More...</a><br /></td></tr>\n<tr class=\"separator:ga358943934d21da947d5bcc88c2ab7832\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gada3d88d59f0f458f9c51a9fd359a4bc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gada3d88d59f0f458f9c51a9fd359a4bc0\">packU3x10_1x2</a> (uvec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gada3d88d59f0f458f9c51a9fd359a4bc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification, and then packing these four values into a 32-bit unsigned integer.  <a href=\"a00159.html#gada3d88d59f0f458f9c51a9fd359a4bc0\">More...</a><br /></td></tr>\n<tr class=\"separator:gada3d88d59f0f458f9c51a9fd359a4bc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5eecc9e8cbaf51ac6cf57501e670ee19\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga5eecc9e8cbaf51ac6cf57501e670ee19\">packUint2x16</a> (u16vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga5eecc9e8cbaf51ac6cf57501e670ee19\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga5eecc9e8cbaf51ac6cf57501e670ee19\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5eecc9e8cbaf51ac6cf57501e670ee19\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa864081097b86e83d8e4a4d79c382b22\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaa864081097b86e83d8e4a4d79c382b22\">packUint2x32</a> (u32vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa864081097b86e83d8e4a4d79c382b22\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#gaa864081097b86e83d8e4a4d79c382b22\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa864081097b86e83d8e4a4d79c382b22\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3c3c9fb53ae7823b10fa083909357590\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga3c3c9fb53ae7823b10fa083909357590\">packUint2x8</a> (u8vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga3c3c9fb53ae7823b10fa083909357590\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga3c3c9fb53ae7823b10fa083909357590\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3c3c9fb53ae7823b10fa083909357590\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ceb62cca347d8ace42ee90317a3f1f9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2ceb62cca347d8ace42ee90317a3f1f9\">packUint4x16</a> (u16vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga2ceb62cca347d8ace42ee90317a3f1f9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#ga2ceb62cca347d8ace42ee90317a3f1f9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2ceb62cca347d8ace42ee90317a3f1f9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0fe2f09aeb403cd66c1a062f58861ab\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaa0fe2f09aeb403cd66c1a062f58861ab\">packUint4x8</a> (u8vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa0fe2f09aeb403cd66c1a062f58861ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component from an integer vector into a packed unsigned integer.  <a href=\"a00159.html#gaa0fe2f09aeb403cd66c1a062f58861ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0fe2f09aeb403cd66c1a062f58861ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename uintType , length_t L, typename floatType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uintType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaccd3f27e6ba5163eb7aa9bc8ff96251a\">packUnorm</a> (vec&lt; L, floatType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#gaccd3f27e6ba5163eb7aa9bc8ff96251a\">More...</a><br /></td></tr>\n<tr class=\"separator:gaccd3f27e6ba5163eb7aa9bc8ff96251a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9f82737bf2a44bedff1d286b76837886\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga9f82737bf2a44bedff1d286b76837886\">packUnorm1x16</a> (float v)</td></tr>\n<tr class=\"memdesc:ga9f82737bf2a44bedff1d286b76837886\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the normalized floating-point value v into a 16-bit integer value.  <a href=\"a00159.html#ga9f82737bf2a44bedff1d286b76837886\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9f82737bf2a44bedff1d286b76837886\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga768e0337dd6246773f14aa0a421fe9a8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga768e0337dd6246773f14aa0a421fe9a8\">packUnorm1x5_1x6_1x5</a> (vec3 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga768e0337dd6246773f14aa0a421fe9a8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#ga768e0337dd6246773f14aa0a421fe9a8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga768e0337dd6246773f14aa0a421fe9a8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b2fa60df3460403817d28b082ee0736\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga4b2fa60df3460403817d28b082ee0736\">packUnorm1x8</a> (float v)</td></tr>\n<tr class=\"memdesc:ga4b2fa60df3460403817d28b082ee0736\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the normalized floating-point value v into a 8-bit integer value.  <a href=\"a00159.html#ga4b2fa60df3460403817d28b082ee0736\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b2fa60df3460403817d28b082ee0736\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f9abdb50f9be1aa1c14912504a0d98d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga7f9abdb50f9be1aa1c14912504a0d98d\">packUnorm2x3_1x2</a> (vec3 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga7f9abdb50f9be1aa1c14912504a0d98d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#ga7f9abdb50f9be1aa1c14912504a0d98d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f9abdb50f9be1aa1c14912504a0d98d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab6bbd5be3b8e6db538ecb33a7844481c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab6bbd5be3b8e6db538ecb33a7844481c\">packUnorm2x4</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:gab6bbd5be3b8e6db538ecb33a7844481c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#gab6bbd5be3b8e6db538ecb33a7844481c\">More...</a><br /></td></tr>\n<tr class=\"separator:gab6bbd5be3b8e6db538ecb33a7844481c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9a666b1c688ab54100061ed06526de6e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga9a666b1c688ab54100061ed06526de6e\">packUnorm2x8</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga9a666b1c688ab54100061ed06526de6e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8-bit integer values.  <a href=\"a00159.html#ga9a666b1c688ab54100061ed06526de6e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9a666b1c688ab54100061ed06526de6e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8a1ee625d2707c60530fb3fca2980b19\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga8a1ee625d2707c60530fb3fca2980b19\">packUnorm3x10_1x2</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga8a1ee625d2707c60530fb3fca2980b19\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts the first three components of the normalized floating-point value v into 10-bit unsigned integer values.  <a href=\"a00159.html#ga8a1ee625d2707c60530fb3fca2980b19\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8a1ee625d2707c60530fb3fca2980b19\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec4112086d7fb133bea104a7c237de52\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaec4112086d7fb133bea104a7c237de52\">packUnorm3x5_1x1</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaec4112086d7fb133bea104a7c237de52\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#gaec4112086d7fb133bea104a7c237de52\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec4112086d7fb133bea104a7c237de52\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f63c264e7ab63264e2b2a99fd393897\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga1f63c264e7ab63264e2b2a99fd393897\">packUnorm4x16</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1f63c264e7ab63264e2b2a99fd393897\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 16-bit integer values.  <a href=\"a00159.html#ga1f63c264e7ab63264e2b2a99fd393897\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f63c264e7ab63264e2b2a99fd393897\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad3e7e3ce521513584a53aedc5f9765c1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gad3e7e3ce521513584a53aedc5f9765c1\">packUnorm4x4</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gad3e7e3ce521513584a53aedc5f9765c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert each component of the normalized floating-point vector into unsigned integer values.  <a href=\"a00159.html#gad3e7e3ce521513584a53aedc5f9765c1\">More...</a><br /></td></tr>\n<tr class=\"separator:gad3e7e3ce521513584a53aedc5f9765c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b1fd1e854705b1345e98409e0a25e50\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2b1fd1e854705b1345e98409e0a25e50\">unpackF2x11_1x10</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga2b1fd1e854705b1345e98409e0a25e50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value .  <a href=\"a00159.html#ga2b1fd1e854705b1345e98409e0a25e50\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b1fd1e854705b1345e98409e0a25e50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab9e60ebe3ad3eeced6a9ec6eb876d74e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab9e60ebe3ad3eeced6a9ec6eb876d74e\">unpackF3x9_E1x5</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:gab9e60ebe3ad3eeced6a9ec6eb876d74e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value .  <a href=\"a00159.html#gab9e60ebe3ad3eeced6a9ec6eb876d74e\">More...</a><br /></td></tr>\n<tr class=\"separator:gab9e60ebe3ad3eeced6a9ec6eb876d74e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30d6b2f1806315bcd6047131f547d33b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga30d6b2f1806315bcd6047131f547d33b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, float, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga30d6b2f1806315bcd6047131f547d33b\">unpackHalf</a> (vec&lt; L, uint16, Q &gt; const &amp;p)</td></tr>\n<tr class=\"memdesc:ga30d6b2f1806315bcd6047131f547d33b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values.  <a href=\"a00159.html#ga30d6b2f1806315bcd6047131f547d33b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30d6b2f1806315bcd6047131f547d33b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac37dedaba24b00adb4ec6e8f92c19dbf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gac37dedaba24b00adb4ec6e8f92c19dbf\">unpackHalf1x16</a> (uint16 v)</td></tr>\n<tr class=\"memdesc:gac37dedaba24b00adb4ec6e8f92c19dbf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into a 16-bit value, interpreted as a 16-bit floating-point number according to the OpenGL Specification, and converting it to 32-bit floating-point values.  <a href=\"a00159.html#gac37dedaba24b00adb4ec6e8f92c19dbf\">More...</a><br /></td></tr>\n<tr class=\"separator:gac37dedaba24b00adb4ec6e8f92c19dbf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga57dfc41b2eb20b0ac00efae7d9c49dcd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga57dfc41b2eb20b0ac00efae7d9c49dcd\">unpackHalf4x16</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:ga57dfc41b2eb20b0ac00efae7d9c49dcd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigned integer into four 16-bit values, interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, and converting them to 32-bit floating-point values.  <a href=\"a00159.html#ga57dfc41b2eb20b0ac00efae7d9c49dcd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga57dfc41b2eb20b0ac00efae7d9c49dcd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9a05330e5490be0908d3b117d82aff56\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL ivec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga9a05330e5490be0908d3b117d82aff56\">unpackI3x10_1x2</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga9a05330e5490be0908d3b117d82aff56\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers.  <a href=\"a00159.html#ga9a05330e5490be0908d3b117d82aff56\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9a05330e5490be0908d3b117d82aff56\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaccde055882918a3175de82f4ca8b7d8e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i16vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaccde055882918a3175de82f4ca8b7d8e\">unpackInt2x16</a> (int p)</td></tr>\n<tr class=\"memdesc:gaccde055882918a3175de82f4ca8b7d8e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gaccde055882918a3175de82f4ca8b7d8e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaccde055882918a3175de82f4ca8b7d8e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab297c0bfd38433524791eb0584d8f08d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab297c0bfd38433524791eb0584d8f08d\">unpackInt2x32</a> (int64 p)</td></tr>\n<tr class=\"memdesc:gab297c0bfd38433524791eb0584d8f08d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gab297c0bfd38433524791eb0584d8f08d\">More...</a><br /></td></tr>\n<tr class=\"separator:gab297c0bfd38433524791eb0584d8f08d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab0c59f1e259fca9e68adb2207a6b665e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i8vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab0c59f1e259fca9e68adb2207a6b665e\">unpackInt2x8</a> (int16 p)</td></tr>\n<tr class=\"memdesc:gab0c59f1e259fca9e68adb2207a6b665e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gab0c59f1e259fca9e68adb2207a6b665e\">More...</a><br /></td></tr>\n<tr class=\"separator:gab0c59f1e259fca9e68adb2207a6b665e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52c154a9b232b62c22517a700cc0c78c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i16vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga52c154a9b232b62c22517a700cc0c78c\">unpackInt4x16</a> (int64 p)</td></tr>\n<tr class=\"memdesc:ga52c154a9b232b62c22517a700cc0c78c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#ga52c154a9b232b62c22517a700cc0c78c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga52c154a9b232b62c22517a700cc0c78c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1cd8d2038cdd33a860801aa155a26221\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL i8vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga1cd8d2038cdd33a860801aa155a26221\">unpackInt4x8</a> (int32 p)</td></tr>\n<tr class=\"memdesc:ga1cd8d2038cdd33a860801aa155a26221\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#ga1cd8d2038cdd33a860801aa155a26221\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1cd8d2038cdd33a860801aa155a26221\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5c1ec97894b05ea21a05aea4f0204a02\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5c1ec97894b05ea21a05aea4f0204a02\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga5c1ec97894b05ea21a05aea4f0204a02\">unpackRGBM</a> (vec&lt; 4, T, Q &gt; const &amp;rgbm)</td></tr>\n<tr class=\"memdesc:ga5c1ec97894b05ea21a05aea4f0204a02\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values.  <a href=\"a00159.html#ga5c1ec97894b05ea21a05aea4f0204a02\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5c1ec97894b05ea21a05aea4f0204a02\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d49b31e5c3f9df8e1f99ab62b999482\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename floatType , length_t L, typename intType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6d49b31e5c3f9df8e1f99ab62b999482\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga6d49b31e5c3f9df8e1f99ab62b999482\">unpackSnorm</a> (vec&lt; L, intType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga6d49b31e5c3f9df8e1f99ab62b999482\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga6d49b31e5c3f9df8e1f99ab62b999482\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d49b31e5c3f9df8e1f99ab62b999482\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga96dd15002370627a443c835ab03a766c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga96dd15002370627a443c835ab03a766c\">unpackSnorm1x16</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga96dd15002370627a443c835ab03a766c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers.  <a href=\"a00159.html#ga96dd15002370627a443c835ab03a766c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96dd15002370627a443c835ab03a766c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4851ff86678aa1c7ace9d67846894285\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga4851ff86678aa1c7ace9d67846894285\">unpackSnorm1x8</a> (uint8 p)</td></tr>\n<tr class=\"memdesc:ga4851ff86678aa1c7ace9d67846894285\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers.  <a href=\"a00159.html#ga4851ff86678aa1c7ace9d67846894285\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4851ff86678aa1c7ace9d67846894285\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b128e89be449fc71336968a66bf6e1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga8b128e89be449fc71336968a66bf6e1a\">unpackSnorm2x8</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga8b128e89be449fc71336968a66bf6e1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers.  <a href=\"a00159.html#ga8b128e89be449fc71336968a66bf6e1a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b128e89be449fc71336968a66bf6e1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a4fbf79be9740e3c57737bc2af05e5b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga7a4fbf79be9740e3c57737bc2af05e5b\">unpackSnorm3x10_1x2</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga7a4fbf79be9740e3c57737bc2af05e5b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers.  <a href=\"a00159.html#ga7a4fbf79be9740e3c57737bc2af05e5b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a4fbf79be9740e3c57737bc2af05e5b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaddf9c353528fe896106f7181219c7f4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaaddf9c353528fe896106f7181219c7f4\">unpackSnorm4x16</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:gaaddf9c353528fe896106f7181219c7f4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers.  <a href=\"a00159.html#gaaddf9c353528fe896106f7181219c7f4\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaddf9c353528fe896106f7181219c7f4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga48df3042a7d079767f5891a1bfd8a60a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga48df3042a7d079767f5891a1bfd8a60a\">unpackU3x10_1x2</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga48df3042a7d079767f5891a1bfd8a60a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers.  <a href=\"a00159.html#ga48df3042a7d079767f5891a1bfd8a60a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga48df3042a7d079767f5891a1bfd8a60a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga035bbbeab7ec2b28c0529757395b645b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u16vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga035bbbeab7ec2b28c0529757395b645b\">unpackUint2x16</a> (uint p)</td></tr>\n<tr class=\"memdesc:ga035bbbeab7ec2b28c0529757395b645b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#ga035bbbeab7ec2b28c0529757395b645b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga035bbbeab7ec2b28c0529757395b645b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf942ff11b65e83eb5f77e68329ebc6ab\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaf942ff11b65e83eb5f77e68329ebc6ab\">unpackUint2x32</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:gaf942ff11b65e83eb5f77e68329ebc6ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gaf942ff11b65e83eb5f77e68329ebc6ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf942ff11b65e83eb5f77e68329ebc6ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7600a6c71784b637a410869d2a5adcd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u8vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaa7600a6c71784b637a410869d2a5adcd\">unpackUint2x8</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:gaa7600a6c71784b637a410869d2a5adcd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gaa7600a6c71784b637a410869d2a5adcd\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7600a6c71784b637a410869d2a5adcd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab173834ef14cfc23a96a959f3ff4b8dc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u16vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab173834ef14cfc23a96a959f3ff4b8dc\">unpackUint4x16</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:gab173834ef14cfc23a96a959f3ff4b8dc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gab173834ef14cfc23a96a959f3ff4b8dc\">More...</a><br /></td></tr>\n<tr class=\"separator:gab173834ef14cfc23a96a959f3ff4b8dc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf6dc0e4341810a641c7ed08f10e335d1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL u8vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gaf6dc0e4341810a641c7ed08f10e335d1\">unpackUint4x8</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:gaf6dc0e4341810a641c7ed08f10e335d1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer into an integer vector.  <a href=\"a00159.html#gaf6dc0e4341810a641c7ed08f10e335d1\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf6dc0e4341810a641c7ed08f10e335d1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename floatType , length_t L, typename uintType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga3e6ac9178b59f0b1b2f7599f2183eb7f\">unpackUnorm</a> (vec&lt; L, uintType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga3e6ac9178b59f0b1b2f7599f2183eb7f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e6ac9178b59f0b1b2f7599f2183eb7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga83d34160a5cb7bcb5339823210fc7501\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga83d34160a5cb7bcb5339823210fc7501\">unpackUnorm1x16</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga83d34160a5cb7bcb5339823210fc7501\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers.  <a href=\"a00159.html#ga83d34160a5cb7bcb5339823210fc7501\">More...</a><br /></td></tr>\n<tr class=\"separator:ga83d34160a5cb7bcb5339823210fc7501\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab3bc08ecfc0f3339be93fb2b3b56d88a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gab3bc08ecfc0f3339be93fb2b3b56d88a\">unpackUnorm1x5_1x6_1x5</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:gab3bc08ecfc0f3339be93fb2b3b56d88a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#gab3bc08ecfc0f3339be93fb2b3b56d88a\">More...</a><br /></td></tr>\n<tr class=\"separator:gab3bc08ecfc0f3339be93fb2b3b56d88a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1319207e30874fb4931a9ee913983ee1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga1319207e30874fb4931a9ee913983ee1\">unpackUnorm1x8</a> (uint8 p)</td></tr>\n<tr class=\"memdesc:ga1319207e30874fb4931a9ee913983ee1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a single 8-bit integer to a normalized floating-point value.  <a href=\"a00159.html#ga1319207e30874fb4931a9ee913983ee1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1319207e30874fb4931a9ee913983ee1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6abd5a9014df3b5ce4059008d2491260\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga6abd5a9014df3b5ce4059008d2491260\">unpackUnorm2x3_1x2</a> (uint8 p)</td></tr>\n<tr class=\"memdesc:ga6abd5a9014df3b5ce4059008d2491260\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga6abd5a9014df3b5ce4059008d2491260\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6abd5a9014df3b5ce4059008d2491260\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e50476132fe5f27f08e273d9c70d85b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2e50476132fe5f27f08e273d9c70d85b\">unpackUnorm2x4</a> (uint8 p)</td></tr>\n<tr class=\"memdesc:ga2e50476132fe5f27f08e273d9c70d85b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga2e50476132fe5f27f08e273d9c70d85b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e50476132fe5f27f08e273d9c70d85b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga637cbe3913dd95c6e7b4c99c61bd611f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga637cbe3913dd95c6e7b4c99c61bd611f\">unpackUnorm2x8</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga637cbe3913dd95c6e7b4c99c61bd611f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers.  <a href=\"a00159.html#ga637cbe3913dd95c6e7b4c99c61bd611f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga637cbe3913dd95c6e7b4c99c61bd611f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5156d3060355fe332865da2c7f78815f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga5156d3060355fe332865da2c7f78815f\">unpackUnorm3x10_1x2</a> (uint32 p)</td></tr>\n<tr class=\"memdesc:ga5156d3060355fe332865da2c7f78815f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers.  <a href=\"a00159.html#ga5156d3060355fe332865da2c7f78815f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5156d3060355fe332865da2c7f78815f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5ff95ff5bc16f396432ab67243dbae4d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga5ff95ff5bc16f396432ab67243dbae4d\">unpackUnorm3x5_1x1</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:ga5ff95ff5bc16f396432ab67243dbae4d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#ga5ff95ff5bc16f396432ab67243dbae4d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5ff95ff5bc16f396432ab67243dbae4d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ae149c5d2473ac1e5f347bb654a242d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#ga2ae149c5d2473ac1e5f347bb654a242d\">unpackUnorm4x16</a> (uint64 p)</td></tr>\n<tr class=\"memdesc:ga2ae149c5d2473ac1e5f347bb654a242d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers.  <a href=\"a00159.html#ga2ae149c5d2473ac1e5f347bb654a242d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2ae149c5d2473ac1e5f347bb654a242d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac58ee89d0e224bb6df5e8bbb18843a2d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00159.html#gac58ee89d0e224bb6df5e8bbb18843a2d\">unpackUnorm4x4</a> (uint16 p)</td></tr>\n<tr class=\"memdesc:gac58ee89d0e224bb6df5e8bbb18843a2d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a packed integer to a normalized floating-point vector.  <a href=\"a00159.html#gac58ee89d0e224bb6df5e8bbb18843a2d\">More...</a><br /></td></tr>\n<tr class=\"separator:gac58ee89d0e224bb6df5e8bbb18843a2d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00076.html\" title=\"GLM_GTC_packing \">glm/gtc/packing.hpp</a>&gt; to use the features of this extension. </p>\n<p>This extension provides a set of function to convert vertors to packed formats. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga4944ad465ff950e926d49621f916c78d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::packF2x11_1x10 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values. </p>\n<p>Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value. Then, the results are packed into the returned 32-bit unsigned integer.</p>\n<p>The first vector component specifies the 11 least-significant bits of the result; the last component specifies the 10 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec3 unpackF2x11_1x10(uint32 const&amp; p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3f648fc205467792dc6d8c59c748f8a6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::packF3x9_E1x5 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values. </p>\n<p>Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value. Then, the results are packed into the returned 32-bit unsigned integer.</p>\n<p>The first vector component specifies the 11 least-significant bits of the result; the last component specifies the 10 most-significant bits.</p>\n<p>packF3x9_E1x5 allows encoding into RGBE / RGB9E5 format</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec3 unpackF3x9_E1x5(uint32 const&amp; p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2d8bbce673ebc04831c1fb05c47f5251\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, uint16, Q&gt; glm::packHalf </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, float, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns an unsigned integer vector obtained by converting the components of a floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification. </p>\n<p>The first vector component specifies the 16 least-significant bits of the result; the forth component specifies the 16 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec&lt;L, float, Q&gt; unpackHalf(vec&lt;L, uint16, Q&gt; const&amp; p) </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga43f2093b6ff192a79058ff7834fc3528\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packHalf1x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\">float&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns an unsigned integer obtained by converting the components of a floating-point scalar to the 16-bit floating-point representation found in the OpenGL Specification, and then packing this 16-bit value into a 16-bit unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packHalf2x16(vec2 const&amp; v) </dd>\n<dd>\nuint64 packHalf4x16(vec4 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL packHalf2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafe2f7b39caf8f5ec555e1c059ec530e6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::packHalf4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns an unsigned integer obtained by converting the components of a four-component floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification, and then packing these four 16-bit values into a 64-bit unsigned integer. </p>\n<p>The first vector component specifies the 16 least-significant bits of the result; the forth component specifies the 16 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packHalf1x16(float const&amp; v) </dd>\n<dd>\nuint32 packHalf2x16(vec2 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL packHalf2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga06ecb6afb902dba45419008171db9023\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::packI3x10_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns an unsigned integer obtained by converting the components of a four-component signed integer vector to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification, and then packing these four values into a 32-bit unsigned integer. </p>\n<p>The first vector component specifies the 10 least-significant bits of the result; the forth component specifies the 2 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packI3x10_1x2(uvec4 const&amp; v) </dd>\n<dd>\nuint32 packSnorm3x10_1x2(vec4 const&amp; v) </dd>\n<dd>\nuint32 packUnorm3x10_1x2(vec4 const&amp; v) </dd>\n<dd>\nivec4 unpackI3x10_1x2(uint32 const&amp; p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3644163cf3a47bf1d4af1f4b03013a7e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::packInt2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\ni16vec2 unpackInt2x16(int p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad1e4c8a9e67d86b61a6eec86703a827a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int64 glm::packInt2x32 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\ni32vec2 unpackInt2x32(int p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8884b1f2292414f36d59ef3be5d62914\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int16 glm::packInt2x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\ni8vec2 unpackInt2x8(int16 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1989f093a27ae69cf9207145be48b3d7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int64 glm::packInt4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\ni16vec4 unpackInt4x16(int64 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf2238401d5ce2aaade1a44ba19709072\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int32 glm::packInt4x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\ni8vec4 unpackInt4x8(int32 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0466daf4c90f76cc64b3f105ce727295\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, T, Q&gt; glm::packRGBM </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rgb</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns an unsigned integer vector obtained by converting the components of a floating-point vector to the 16-bit floating-point representation found in the OpenGL Specification. </p>\n<p>The first vector component specifies the 16 least-significant bits of the result; the forth component specifies the 16 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec&lt;3, T, Q&gt; unpackRGBM(vec&lt;4, T, Q&gt; const&amp; p) </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa54b5855a750d6aeb12c1c902f5939b8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, intType, Q&gt; glm::packSnorm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, floatType, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component of the normalized floating-point vector into signed integer values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec&lt;L, floatType, Q&gt; unpackSnorm(vec&lt;L, intType, Q&gt; const&amp; p); </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab22f8bcfdb5fc65af4701b25f143c1af\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packSnorm1x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\">float&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts the normalized floating-point value v into 16-bit integer value. </p>\n<p>Then, the results are packed into the returned 16-bit unsigned integer.</p>\n<p>The conversion to fixed point is done as follows: packSnorm1x8: round(clamp(s, -1, +1) * 32767.0)</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packSnorm2x16(vec2 const&amp; v) </dd>\n<dd>\nuint64 packSnorm4x16(vec4 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae3592e0795e62aaa1865b3a10496a7a1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint8 glm::packSnorm1x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\">float&#160;</td>\n          <td class=\"paramname\"><em>s</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts the normalized floating-point value v into 8-bit integer value. </p>\n<p>Then, the results are packed into the returned 8-bit unsigned integer.</p>\n<p>The conversion to fixed point is done as follows: packSnorm1x8: round(clamp(s, -1, +1) * 127.0)</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packSnorm2x8(vec2 const&amp; v) </dd>\n<dd>\nuint32 packSnorm4x8(vec4 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6be3cfb2cce3702f03e91bbeb5286d7e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packSnorm2x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts each component of the normalized floating-point value v into 8-bit integer values. </p>\n<p>Then, the results are packed into the returned 16-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packSnorm2x8: round(clamp(c, -1, +1) * 127.0)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint8 packSnorm1x8(float const&amp; v) </dd>\n<dd>\nuint32 packSnorm4x8(vec4 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab997545661877d2c7362a5084d3897d3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::packSnorm3x10_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts the first three components of the normalized floating-point value v into 10-bit signed integer values. </p>\n<p>Then, converts the forth component of the normalized floating-point value v into 2-bit signed integer values. Then, the results are packed into the returned 32-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packSnorm3x10_1x2(xyz): round(clamp(c, -1, +1) * 511.0) packSnorm3x10_1x2(w): round(clamp(c, -1, +1) * 1.0)</p>\n<p>The first vector component specifies the 10 least-significant bits of the result; the forth component specifies the 2 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec4 unpackSnorm3x10_1x2(uint32 const&amp; p) </dd>\n<dd>\nuint32 packUnorm3x10_1x2(vec4 const&amp; v) </dd>\n<dd>\nuint32 packU3x10_1x2(uvec4 const&amp; v) </dd>\n<dd>\nuint32 packI3x10_1x2(ivec4 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga358943934d21da947d5bcc88c2ab7832\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::packSnorm4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts each component of the normalized floating-point value v into 16-bit integer values. </p>\n<p>Then, the results are packed into the returned 64-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packSnorm2x8: round(clamp(c, -1, +1) * 32767.0)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packSnorm1x16(float const&amp; v) </dd>\n<dd>\nuint32 packSnorm2x16(vec2 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gada3d88d59f0f458f9c51a9fd359a4bc0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::packU3x10_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification, and then packing these four values into a 32-bit unsigned integer. </p>\n<p>The first vector component specifies the 10 least-significant bits of the result; the forth component specifies the 2 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packI3x10_1x2(ivec4 const&amp; v) </dd>\n<dd>\nuint32 packSnorm3x10_1x2(vec4 const&amp; v) </dd>\n<dd>\nuint32 packUnorm3x10_1x2(vec4 const&amp; v) </dd>\n<dd>\nivec4 unpackU3x10_1x2(uint32 const&amp; p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5eecc9e8cbaf51ac6cf57501e670ee19\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::packUint2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nu16vec2 unpackUint2x16(uint p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa864081097b86e83d8e4a4d79c382b22\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::packUint2x32 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nu32vec2 unpackUint2x32(int p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3c3c9fb53ae7823b10fa083909357590\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packUint2x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nu8vec2 unpackInt2x8(uint16 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2ceb62cca347d8ace42ee90317a3f1f9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::packUint4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nu16vec4 unpackUint4x16(uint64 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa0fe2f09aeb403cd66c1a062f58861ab\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::packUint4x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component from an integer vector into a packed unsigned integer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nu8vec4 unpackUint4x8(uint32 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaccd3f27e6ba5163eb7aa9bc8ff96251a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, uintType, Q&gt; glm::packUnorm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, floatType, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component of the normalized floating-point vector into unsigned integer values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec&lt;L, floatType, Q&gt; unpackUnorm(vec&lt;L, intType, Q&gt; const&amp; p); </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9f82737bf2a44bedff1d286b76837886\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packUnorm1x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\">float&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts the normalized floating-point value v into a 16-bit integer value. </p>\n<p>Then, the results are packed into the returned 16-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packUnorm1x16: round(clamp(c, 0, +1) * 65535.0)</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packSnorm1x16(float const&amp; v) </dd>\n<dd>\nuint64 packSnorm4x16(vec4 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga768e0337dd6246773f14aa0a421fe9a8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packUnorm1x5_1x6_1x5 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component of the normalized floating-point vector into unsigned integer values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec3 unpackUnorm1x5_1x6_1x5(uint16 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4b2fa60df3460403817d28b082ee0736\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint8 glm::packUnorm1x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\">float&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts the normalized floating-point value v into a 8-bit integer value. </p>\n<p>Then, the results are packed into the returned 8-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packUnorm1x8: round(clamp(c, 0, +1) * 255.0)</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packUnorm2x8(vec2 const&amp; v) </dd>\n<dd>\nuint32 packUnorm4x8(vec4 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7f9abdb50f9be1aa1c14912504a0d98d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint8 glm::packUnorm2x3_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component of the normalized floating-point vector into unsigned integer values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec3 unpackUnorm2x3_1x2(uint8 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab6bbd5be3b8e6db538ecb33a7844481c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint8 glm::packUnorm2x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component of the normalized floating-point vector into unsigned integer values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec2 unpackUnorm2x4(uint8 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9a666b1c688ab54100061ed06526de6e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packUnorm2x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts each component of the normalized floating-point value v into 8-bit integer values. </p>\n<p>Then, the results are packed into the returned 16-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packUnorm2x8: round(clamp(c, 0, +1) * 255.0)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint8 packUnorm1x8(float const&amp; v) </dd>\n<dd>\nuint32 packUnorm4x8(vec4 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8a1ee625d2707c60530fb3fca2980b19\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint32 glm::packUnorm3x10_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts the first three components of the normalized floating-point value v into 10-bit unsigned integer values. </p>\n<p>Then, converts the forth component of the normalized floating-point value v into 2-bit signed uninteger values. Then, the results are packed into the returned 32-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packUnorm3x10_1x2(xyz): round(clamp(c, 0, +1) * 1023.0) packUnorm3x10_1x2(w): round(clamp(c, 0, +1) * 3.0)</p>\n<p>The first vector component specifies the 10 least-significant bits of the result; the forth component specifies the 2 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec4 unpackUnorm3x10_1x2(uint32 const&amp; p) </dd>\n<dd>\nuint32 packUnorm3x10_1x2(vec4 const&amp; v) </dd>\n<dd>\nuint32 packU3x10_1x2(uvec4 const&amp; v) </dd>\n<dd>\nuint32 packI3x10_1x2(ivec4 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaec4112086d7fb133bea104a7c237de52\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packUnorm3x5_1x1 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component of the normalized floating-point vector into unsigned integer values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec4 unpackUnorm3x5_1x1(uint16 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1f63c264e7ab63264e2b2a99fd393897\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint64 glm::packUnorm4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts each component of the normalized floating-point value v into 16-bit integer values. </p>\n<p>Then, the results are packed into the returned 64-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packUnorm4x16: round(clamp(c, 0, +1) * 65535.0)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packUnorm1x16(float const&amp; v) </dd>\n<dd>\nuint32 packUnorm2x16(vec2 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad3e7e3ce521513584a53aedc5f9765c1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint16 glm::packUnorm4x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert each component of the normalized floating-point vector into unsigned integer values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec4 unpackUnorm4x4(uint16 p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2b1fd1e854705b1345e98409e0a25e50\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec3 glm::unpackF2x11_1x10 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned three-component vector.</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packF2x11_1x10(vec3 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab9e60ebe3ad3eeced6a9ec6eb876d74e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec3 glm::unpackF3x9_E1x5 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned three-component vector.</p>\n<p>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.</p>\n<p>unpackF3x9_E1x5 allows decoding RGBE / RGB9E5 data</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packF3x9_E1x5(vec3 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga30d6b2f1806315bcd6047131f547d33b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, float, Q&gt; glm::unpackHalf </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values. </p>\n<p>The first component of the vector is obtained from the 16 least-significant bits of v; the forth component is obtained from the 16 most-significant bits of v.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec&lt;L, uint16, Q&gt; packHalf(vec&lt;L, float, Q&gt; const&amp; v) </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac37dedaba24b00adb4ec6e8f92c19dbf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::unpackHalf1x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into a 16-bit value, interpreted as a 16-bit floating-point number according to the OpenGL Specification, and converting it to 32-bit floating-point values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec2 unpackHalf2x16(uint32 const&amp; v) </dd>\n<dd>\nvec4 unpackHalf4x16(uint64 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL unpackHalf2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga57dfc41b2eb20b0ac00efae7d9c49dcd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackHalf4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigned integer into four 16-bit values, interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, and converting them to 32-bit floating-point values. </p>\n<p>The first component of the vector is obtained from the 16 least-significant bits of v; the forth component is obtained from the 16 most-significant bits of v.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nfloat unpackHalf1x16(uint16 const&amp; v) </dd>\n<dd>\nvec2 unpackHalf2x16(uint32 const&amp; v) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL unpackHalf2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9a05330e5490be0908d3b117d82aff56\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL ivec4 glm::unpackI3x10_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packU3x10_1x2(uvec4 const&amp; v) </dd>\n<dd>\nvec4 unpackSnorm3x10_1x2(uint32 const&amp; p); </dd>\n<dd>\nuvec4 unpackI3x10_1x2(uint32 const&amp; p); </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaccde055882918a3175de82f4ca8b7d8e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL i16vec2 glm::unpackInt2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nint packInt2x16(i16vec2 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab297c0bfd38433524791eb0584d8f08d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL i32vec2 glm::unpackInt2x32 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nint packInt2x16(i32vec2 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab0c59f1e259fca9e68adb2207a6b665e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL i8vec2 glm::unpackInt2x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nint16 packInt2x8(i8vec2 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga52c154a9b232b62c22517a700cc0c78c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL i16vec4 glm::unpackInt4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nint64 packInt4x16(i16vec4 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1cd8d2038cdd33a860801aa155a26221\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL i8vec4 glm::unpackInt4x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nint32 packInt2x8(i8vec4 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5c1ec97894b05ea21a05aea4f0204a02\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::unpackRGBM </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rgbm</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values. </p>\n<p>The first component of the vector is obtained from the 16 least-significant bits of v; the forth component is obtained from the 16 most-significant bits of v.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec&lt;4, T, Q&gt; packRGBM(vec&lt;3, float, Q&gt; const&amp; v) </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6d49b31e5c3f9df8e1f99ab62b999482\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, floatType, Q&gt; glm::unpackSnorm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, intType, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer to a normalized floating-point vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec&lt;L, intType, Q&gt; packSnorm(vec&lt;L, floatType, Q&gt; const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga96dd15002370627a443c835ab03a766c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::unpackSnorm1x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned scalar.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackSnorm1x16: clamp(f / 32767.0, -1, +1)</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec2 unpackSnorm2x16(uint32 p) </dd>\n<dd>\nvec4 unpackSnorm4x16(uint64 p) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm1x16.xml\">GLSL unpackSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4851ff86678aa1c7ace9d67846894285\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::unpackSnorm1x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers. </p>\n<p>Then, the value is converted to a normalized floating-point value to generate the returned scalar.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackSnorm1x8: clamp(f / 127.0, -1, +1)</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec2 unpackSnorm2x8(uint16 p) </dd>\n<dd>\nvec4 unpackSnorm4x8(uint32 p) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL unpackSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b128e89be449fc71336968a66bf6e1a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec2 glm::unpackSnorm2x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned two-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackSnorm2x8: clamp(f / 127.0, -1, +1)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nfloat unpackSnorm1x8(uint8 p) </dd>\n<dd>\nvec4 unpackSnorm4x8(uint32 p) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL unpackSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7a4fbf79be9740e3c57737bc2af05e5b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackSnorm3x10_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackSnorm3x10_1x2(xyz): clamp(f / 511.0, -1, +1) unpackSnorm3x10_1x2(w): clamp(f / 511.0, -1, +1)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packSnorm3x10_1x2(vec4 const&amp; v) </dd>\n<dd>\nvec4 unpackUnorm3x10_1x2(uint32 const&amp; p)) </dd>\n<dd>\nuvec4 unpackI3x10_1x2(uint32 const&amp; p) </dd>\n<dd>\nuvec4 unpackU3x10_1x2(uint32 const&amp; p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaddf9c353528fe896106f7181219c7f4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackSnorm4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackSnorm4x16: clamp(f / 32767.0, -1, +1)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nfloat unpackSnorm1x16(uint16 p) </dd>\n<dd>\nvec2 unpackSnorm2x16(uint32 p) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml\">GLSL unpackSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga48df3042a7d079767f5891a1bfd8a60a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uvec4 glm::unpackU3x10_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packU3x10_1x2(uvec4 const&amp; v) </dd>\n<dd>\nvec4 unpackSnorm3x10_1x2(uint32 const&amp; p); </dd>\n<dd>\nuvec4 unpackI3x10_1x2(uint32 const&amp; p); </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga035bbbeab7ec2b28c0529757395b645b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL u16vec2 glm::unpackUint2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint packUint2x16(u16vec2 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf942ff11b65e83eb5f77e68329ebc6ab\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL u32vec2 glm::unpackUint2x32 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nint packUint2x16(u32vec2 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa7600a6c71784b637a410869d2a5adcd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL u8vec2 glm::unpackUint2x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packInt2x8(u8vec2 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab173834ef14cfc23a96a959f3ff4b8dc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL u16vec4 glm::unpackUint4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint64 packUint4x16(u16vec4 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf6dc0e4341810a641c7ed08f10e335d1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL u8vec4 glm::unpackUint4x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer into an integer vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packUint4x8(u8vec2 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3e6ac9178b59f0b1b2f7599f2183eb7f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, floatType, Q&gt; glm::unpackUnorm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, uintType, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer to a normalized floating-point vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec&lt;L, intType, Q&gt; packUnorm(vec&lt;L, floatType, Q&gt; const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga83d34160a5cb7bcb5339823210fc7501\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::unpackUnorm1x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers. </p>\n<p>Then, the value is converted to a normalized floating-point value to generate the returned scalar.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackUnorm1x16: f / 65535.0</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec2 unpackUnorm2x16(uint32 p) </dd>\n<dd>\nvec4 unpackUnorm4x16(uint64 p) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL unpackUnorm2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab3bc08ecfc0f3339be93fb2b3b56d88a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec3 glm::unpackUnorm1x5_1x6_1x5 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer to a normalized floating-point vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packUnorm1x5_1x6_1x5(vec3 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1319207e30874fb4931a9ee913983ee1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL float glm::unpackUnorm1x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a single 8-bit integer to a normalized floating-point value. </p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackUnorm4x8: f / 255.0</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nvec2 unpackUnorm2x8(uint16 p) </dd>\n<dd>\nvec4 unpackUnorm4x8(uint32 p) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL unpackUnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6abd5a9014df3b5ce4059008d2491260\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec3 glm::unpackUnorm2x3_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer to a normalized floating-point vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint8 packUnorm2x3_1x2(vec3 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2e50476132fe5f27f08e273d9c70d85b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec2 glm::unpackUnorm2x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer to a normalized floating-point vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint8 packUnorm2x4(vec2 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga637cbe3913dd95c6e7b4c99c61bd611f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec2 glm::unpackUnorm2x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned two-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackUnorm4x8: f / 255.0</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nfloat unpackUnorm1x8(uint8 v) </dd>\n<dd>\nvec4 unpackUnorm4x8(uint32 p) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL unpackUnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5156d3060355fe332865da2c7f78815f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackUnorm3x10_1x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackSnorm3x10_1x2(xyz): clamp(f / 1023.0, 0, +1) unpackSnorm3x10_1x2(w): clamp(f / 3.0, 0, +1)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint32 packSnorm3x10_1x2(vec4 const&amp; v) </dd>\n<dd>\nvec4 unpackInorm3x10_1x2(uint32 const&amp; p)) </dd>\n<dd>\nuvec4 unpackI3x10_1x2(uint32 const&amp; p) </dd>\n<dd>\nuvec4 unpackU3x10_1x2(uint32 const&amp; p) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5ff95ff5bc16f396432ab67243dbae4d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackUnorm3x5_1x1 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer to a normalized floating-point vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packUnorm3x5_1x1(vec4 const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2ae149c5d2473ac1e5f347bb654a242d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackUnorm4x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackUnormx4x16: f / 65535.0</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nfloat unpackUnorm1x16(uint16 p) </dd>\n<dd>\nvec2 unpackUnorm2x16(uint32 p) </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL unpackUnorm2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac58ee89d0e224bb6df5e8bbb18843a2d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackUnorm4x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a packed integer to a normalized floating-point vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00159.html\" title=\"Include <glm/gtc/packing.hpp> to use the features of this extension. \">GLM_GTC_packing</a> </dd>\n<dd>\nuint16 packUnorm4x4(vec4 const&amp; v) </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00160.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_quaternion</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_quaternion<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00083.html\" title=\"GLM_GTC_quaternion \">glm/gtc/quaternion.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaaee6c856cae3217d274a240238cb6373\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaaee6c856cae3217d274a240238cb6373\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">angle</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaaee6c856cae3217d274a240238cb6373\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the quaternion rotation angle.  <a href=\"a00160.html#gaaee6c856cae3217d274a240238cb6373\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaee6c856cae3217d274a240238cb6373\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga93856b8bfcdd5b9a164248df3149476c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga93856b8bfcdd5b9a164248df3149476c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga93856b8bfcdd5b9a164248df3149476c\">angleAxis</a> (T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:ga93856b8bfcdd5b9a164248df3149476c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a quaternion from an angle and a normalized axis.  <a href=\"a00160.html#ga93856b8bfcdd5b9a164248df3149476c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga93856b8bfcdd5b9a164248df3149476c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaf2707d3081789ce097daaa6e54d5287\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaaf2707d3081789ce097daaa6e54d5287\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">axis</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaaf2707d3081789ce097daaa6e54d5287\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the q rotation axis.  <a href=\"a00160.html#gaaf2707d3081789ce097daaa6e54d5287\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaf2707d3081789ce097daaa6e54d5287\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac40833db608deda477f018767b9a1cad\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac40833db608deda477f018767b9a1cad\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gac40833db608deda477f018767b9a1cad\">conjugate</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gac40833db608deda477f018767b9a1cad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the q conjugate.  <a href=\"a00160.html#gac40833db608deda477f018767b9a1cad\">More...</a><br /></td></tr>\n<tr class=\"separator:gac40833db608deda477f018767b9a1cad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab219911644fdc694e7d275cfcf35bfca\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab219911644fdc694e7d275cfcf35bfca\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gab219911644fdc694e7d275cfcf35bfca\">dot</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gab219911644fdc694e7d275cfcf35bfca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...  <a href=\"a00160.html#gab219911644fdc694e7d275cfcf35bfca\">More...</a><br /></td></tr>\n<tr class=\"separator:gab219911644fdc694e7d275cfcf35bfca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga22089a76bfb7b45b4c34961bb715e2df\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga22089a76bfb7b45b4c34961bb715e2df\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga22089a76bfb7b45b4c34961bb715e2df\">equal</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga22089a76bfb7b45b4c34961bb715e2df\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x == y.  <a href=\"a00160.html#ga22089a76bfb7b45b4c34961bb715e2df\">More...</a><br /></td></tr>\n<tr class=\"separator:ga22089a76bfb7b45b4c34961bb715e2df\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf21424fa62e03de8b11c2b776c17d7a3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf21424fa62e03de8b11c2b776c17d7a3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3\">eulerAngles</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf21424fa62e03de8b11c2b776c17d7a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns euler angles, pitch as x, yaw as y, roll as z.  <a href=\"a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf21424fa62e03de8b11c2b776c17d7a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3f2720e2d77ec39186415f85ecd9cad0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3f2720e2d77ec39186415f85ecd9cad0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga3f2720e2d77ec39186415f85ecd9cad0\">greaterThan</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga3f2720e2d77ec39186415f85ecd9cad0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &gt; y.  <a href=\"a00160.html#ga3f2720e2d77ec39186415f85ecd9cad0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3f2720e2d77ec39186415f85ecd9cad0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga293cb3175d9ad290deaf50984716fd44\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga293cb3175d9ad290deaf50984716fd44\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga293cb3175d9ad290deaf50984716fd44\">greaterThanEqual</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga293cb3175d9ad290deaf50984716fd44\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &gt;= y.  <a href=\"a00160.html#ga293cb3175d9ad290deaf50984716fd44\">More...</a><br /></td></tr>\n<tr class=\"separator:ga293cb3175d9ad290deaf50984716fd44\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadc59b59ce71daa5586a64a6acf36c072\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadc59b59ce71daa5586a64a6acf36c072\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gadc59b59ce71daa5586a64a6acf36c072\">inverse</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gadc59b59ce71daa5586a64a6acf36c072\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the q inverse.  <a href=\"a00160.html#gadc59b59ce71daa5586a64a6acf36c072\">More...</a><br /></td></tr>\n<tr class=\"separator:gadc59b59ce71daa5586a64a6acf36c072\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga139abc0f7f89553e341f8be95bf8d3cb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga139abc0f7f89553e341f8be95bf8d3cb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga139abc0f7f89553e341f8be95bf8d3cb\">isinf</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga139abc0f7f89553e341f8be95bf8d3cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a positive infinity or negative infinity representation in the underlying implementation's set of floating point representations.  <a href=\"a00160.html#ga139abc0f7f89553e341f8be95bf8d3cb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga139abc0f7f89553e341f8be95bf8d3cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31f4378ab97985177e208f4f4f8b1fd3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga31f4378ab97985177e208f4f4f8b1fd3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga31f4378ab97985177e208f4f4f8b1fd3\">isnan</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga31f4378ab97985177e208f4f4f8b1fd3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x holds a NaN (not a number) representation in the underlying implementation's set of floating point representations.  <a href=\"a00160.html#ga31f4378ab97985177e208f4f4f8b1fd3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31f4378ab97985177e208f4f4f8b1fd3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab33f82f8d1c9223d335aab752a126855\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab33f82f8d1c9223d335aab752a126855\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gab33f82f8d1c9223d335aab752a126855\">length</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gab33f82f8d1c9223d335aab752a126855\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the length of the quaternion.  <a href=\"a00160.html#gab33f82f8d1c9223d335aab752a126855\">More...</a><br /></td></tr>\n<tr class=\"separator:gab33f82f8d1c9223d335aab752a126855\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabc58e7013ef63d6df69c28c14afd0c01\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabc58e7013ef63d6df69c28c14afd0c01\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gabc58e7013ef63d6df69c28c14afd0c01\">lerp</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</td></tr>\n<tr class=\"memdesc:gabc58e7013ef63d6df69c28c14afd0c01\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Linear interpolation of two quaternions.  <a href=\"a00160.html#gabc58e7013ef63d6df69c28c14afd0c01\">More...</a><br /></td></tr>\n<tr class=\"separator:gabc58e7013ef63d6df69c28c14afd0c01\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga627487c769e33f4b9f318f271b75802c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga627487c769e33f4b9f318f271b75802c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga627487c769e33f4b9f318f271b75802c\">lessThan</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga627487c769e33f4b9f318f271b75802c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison result of x &lt; y.  <a href=\"a00160.html#ga627487c769e33f4b9f318f271b75802c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga627487c769e33f4b9f318f271b75802c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga9e84617bb109bf2eb7f30d7f4ba07ad4\">lessThanEqual</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &lt;= y.  <a href=\"a00160.html#ga9e84617bb109bf2eb7f30d7f4ba07ad4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9e84617bb109bf2eb7f30d7f4ba07ad4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e88f15c94effe737c876d21ea0db101\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6e88f15c94effe737c876d21ea0db101\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">mat3_cast</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga6e88f15c94effe737c876d21ea0db101\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 3 * 3 matrix.  <a href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e88f15c94effe737c876d21ea0db101\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e2085f17cd5aae423c04536524f11b3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8e2085f17cd5aae423c04536524f11b3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">mat4_cast</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8e2085f17cd5aae423c04536524f11b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 4 * 4 matrix.  <a href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e2085f17cd5aae423c04536524f11b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c31ccbb8548b2b24226901e602dfc0a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6c31ccbb8548b2b24226901e602dfc0a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga6c31ccbb8548b2b24226901e602dfc0a\">mix</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</td></tr>\n<tr class=\"memdesc:ga6c31ccbb8548b2b24226901e602dfc0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Spherical linear interpolation of two quaternions.  <a href=\"a00160.html#ga6c31ccbb8548b2b24226901e602dfc0a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c31ccbb8548b2b24226901e602dfc0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad4f3769e33c18d1897d1857c1f8da864\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad4f3769e33c18d1897d1857c1f8da864\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#gad4f3769e33c18d1897d1857c1f8da864\">normalize</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gad4f3769e33c18d1897d1857c1f8da864\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the normalized quaternion.  <a href=\"a00160.html#gad4f3769e33c18d1897d1857c1f8da864\">More...</a><br /></td></tr>\n<tr class=\"separator:gad4f3769e33c18d1897d1857c1f8da864\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9494ec3489041958a240963a8a0ac9a0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9494ec3489041958a240963a8a0ac9a0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga9494ec3489041958a240963a8a0ac9a0\">notEqual</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga9494ec3489041958a240963a8a0ac9a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x != y.  <a href=\"a00160.html#ga9494ec3489041958a240963a8a0ac9a0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9494ec3489041958a240963a8a0ac9a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bd78e5fe153d07e39fb4c83e73dba73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9bd78e5fe153d07e39fb4c83e73dba73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">pitch</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga9bd78e5fe153d07e39fb4c83e73dba73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns pitch value of euler angles expressed in radians.  <a href=\"a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9bd78e5fe153d07e39fb4c83e73dba73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga03e023aec9acd561a28594bbc8a3abf6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga03e023aec9acd561a28594bbc8a3abf6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">quat_cast</a> (mat&lt; 3, 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga03e023aec9acd561a28594bbc8a3abf6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 3 * 3 matrix to a quaternion.  <a href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga03e023aec9acd561a28594bbc8a3abf6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga50bb9aecf42fdab04e16039ab6a81c60\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga50bb9aecf42fdab04e16039ab6a81c60\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60\">quat_cast</a> (mat&lt; 4, 4, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga50bb9aecf42fdab04e16039ab6a81c60\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 4 * 4 matrix to a quaternion.  <a href=\"a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50bb9aecf42fdab04e16039ab6a81c60\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ff93afbd9cc29f2ad217f2228e8a95b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3ff93afbd9cc29f2ad217f2228e8a95b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">roll</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3ff93afbd9cc29f2ad217f2228e8a95b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns roll value of euler angles expressed in radians.  <a href=\"a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ff93afbd9cc29f2ad217f2228e8a95b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga21c6e3b6104c9b8116a35ddf2ac4d358\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga21c6e3b6104c9b8116a35ddf2ac4d358\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga21c6e3b6104c9b8116a35ddf2ac4d358\">rotate</a> (tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:ga21c6e3b6104c9b8116a35ddf2ac4d358\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotates a quaternion from a vector of 3 components axis and an angle.  <a href=\"a00160.html#ga21c6e3b6104c9b8116a35ddf2ac4d358\">More...</a><br /></td></tr>\n<tr class=\"separator:ga21c6e3b6104c9b8116a35ddf2ac4d358\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3796542dac06014d541d67ebd5f2a88a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3796542dac06014d541d67ebd5f2a88a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga3796542dac06014d541d67ebd5f2a88a\">slerp</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)</td></tr>\n<tr class=\"memdesc:ga3796542dac06014d541d67ebd5f2a88a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Spherical linear interpolation of two quaternions.  <a href=\"a00160.html#ga3796542dac06014d541d67ebd5f2a88a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3796542dac06014d541d67ebd5f2a88a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga53feffeb4001b99e36e216522e465e9e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga53feffeb4001b99e36e216522e465e9e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">yaw</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga53feffeb4001b99e36e216522e465e9e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns yaw value of euler angles expressed in radians.  <a href=\"a00160.html#ga53feffeb4001b99e36e216522e465e9e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga53feffeb4001b99e36e216522e465e9e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00083.html\" title=\"GLM_GTC_quaternion \">glm/gtc/quaternion.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines a templated quaternion type and several quaternion operations. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaaee6c856cae3217d274a240238cb6373\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::angle </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the quaternion rotation angle. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga93856b8bfcdd5b9a164248df3149476c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::angleAxis </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>axis</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a quaternion from an angle and a normalized axis. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">angle</td><td>Angle expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">axis</td><td>Axis of the quaternion, must be normalized. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaf2707d3081789ce097daaa6e54d5287\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::axis </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the q rotation axis. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac40833db608deda477f018767b9a1cad\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::conjugate </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the q conjugate. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab219911644fdc694e7d275cfcf35bfca\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::dot </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga22089a76bfb7b45b4c34961bb715e2df\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, bool, Q&gt; glm::equal </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x == y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf21424fa62e03de8b11c2b776c17d7a3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::eulerAngles </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns euler angles, pitch as x, yaw as y, roll as z. </p>\n<p>The result is expressed in radians.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3f2720e2d77ec39186415f85ecd9cad0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, bool, Q&gt; glm::greaterThan </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x &gt; y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga293cb3175d9ad290deaf50984716fd44\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, bool, Q&gt; glm::greaterThanEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x &gt;= y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadc59b59ce71daa5586a64a6acf36c072\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::inverse </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the q inverse. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga139abc0f7f89553e341f8be95bf8d3cb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, bool, Q&gt; glm::isinf </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if x holds a positive infinity or negative infinity representation in the underlying implementation's set of floating point representations. </p>\n<p>Returns false otherwise, including for implementations with no infinity representations.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga31f4378ab97985177e208f4f4f8b1fd3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, bool, Q&gt; glm::isnan </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if x holds a NaN (not a number) representation in the underlying implementation's set of floating point representations. </p>\n<p>Returns false otherwise, including for implementations with no NaN representations.</p>\n<p>/!\\ When using compiler fast math, this function may fail.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab33f82f8d1c9223d335aab752a126855\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::length </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the length of the quaternion. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabc58e7013ef63d6df69c28c14afd0c01\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::lerp </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Linear interpolation of two quaternions. </p>\n<p>The interpolation is oriented.</p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">x</td><td>A quaternion </td></tr>\n    <tr><td class=\"paramname\">y</td><td>A quaternion </td></tr>\n    <tr><td class=\"paramname\">a</td><td>Interpolation factor. The interpolation is defined in the range [0, 1]. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga627487c769e33f4b9f318f271b75802c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, bool, Q&gt; glm::lessThan </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison result of x &lt; y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9e84617bb109bf2eb7f30d7f4ba07ad4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, bool, Q&gt; glm::lessThanEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x &lt;= y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e88f15c94effe737c876d21ea0db101\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::mat3_cast </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a quaternion to a 3 * 3 matrix. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n<p>Referenced by <a class=\"el\" href=\"a00084_source.html#l00134\">glm::toMat3()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8e2085f17cd5aae423c04536524f11b3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::mat4_cast </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a quaternion to a 4 * 4 matrix. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n<p>Referenced by <a class=\"el\" href=\"a00084_source.html#l00141\">glm::toMat4()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6c31ccbb8548b2b24226901e602dfc0a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::mix </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Spherical linear interpolation of two quaternions. </p>\n<p>The interpolation is oriented and the rotation is performed at constant speed. For short path spherical linear interpolation, use the slerp function.</p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">x</td><td>A quaternion </td></tr>\n    <tr><td class=\"paramname\">y</td><td>A quaternion </td></tr>\n    <tr><td class=\"paramname\">a</td><td>Interpolation factor. The interpolation is defined beyond the range [0, 1]. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd>- slerp(tquat&lt;T, Q&gt; const&amp; x, tquat&lt;T, Q&gt; const&amp; y, T const&amp; a) </dd>\n<dd>\n<a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad4f3769e33c18d1897d1857c1f8da864\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::normalize </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the normalized quaternion. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9494ec3489041958a240963a8a0ac9a0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, bool, Q&gt; glm::notEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x != y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9bd78e5fe153d07e39fb4c83e73dba73\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::pitch </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns pitch value of euler angles expressed in radians. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga03e023aec9acd561a28594bbc8a3abf6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::quat_cast </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a 3 * 3 matrix to a quaternion. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n<p>Referenced by <a class=\"el\" href=\"a00084_source.html#l00148\">glm::toQuat()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga50bb9aecf42fdab04e16039ab6a81c60\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::quat_cast </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a 4 * 4 matrix to a quaternion. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3ff93afbd9cc29f2ad217f2228e8a95b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::roll </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns roll value of euler angles expressed in radians. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga21c6e3b6104c9b8116a35ddf2ac4d358\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>axis</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotates a quaternion from a vector of 3 components axis and an angle. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">q</td><td>Source orientation </td></tr>\n    <tr><td class=\"paramname\">angle</td><td>Angle expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">axis</td><td>Axis of the rotation </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3796542dac06014d541d67ebd5f2a88a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::slerp </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Spherical linear interpolation of two quaternions. </p>\n<p>The interpolation always take the short path and the rotation is performed at constant speed.</p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">x</td><td>A quaternion </td></tr>\n    <tr><td class=\"paramname\">y</td><td>A quaternion </td></tr>\n    <tr><td class=\"paramname\">a</td><td>Interpolation factor. The interpolation is defined beyond the range [0, 1]. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga53feffeb4001b99e36e216522e465e9e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::yaw </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns yaw value of euler angles expressed in radians. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00160.html\" title=\"Include <glm/gtc/quaternion.hpp> to use the features of this extension. \">GLM_GTC_quaternion</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00161.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_random</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_random<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00085.html\" title=\"GLM_GTC_random \">glm/gtc/random.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga7c53b7797f3147af68a11c767679fa3f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga7c53b7797f3147af68a11c767679fa3f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga7c53b7797f3147af68a11c767679fa3f\">ballRand</a> (T Radius)</td></tr>\n<tr class=\"memdesc:ga7c53b7797f3147af68a11c767679fa3f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius.  <a href=\"a00161.html#ga7c53b7797f3147af68a11c767679fa3f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7c53b7797f3147af68a11c767679fa3f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9dd05c36025088fae25b97c869e88517\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga9dd05c36025088fae25b97c869e88517\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga9dd05c36025088fae25b97c869e88517\">circularRand</a> (T Radius)</td></tr>\n<tr class=\"memdesc:ga9dd05c36025088fae25b97c869e88517\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius.  <a href=\"a00161.html#ga9dd05c36025088fae25b97c869e88517\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9dd05c36025088fae25b97c869e88517\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#gaa0b18071f3f97dbf8bcf6f53c6fe5f73\">diskRand</a> (T Radius)</td></tr>\n<tr class=\"memdesc:gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius.  <a href=\"a00161.html#gaa0b18071f3f97dbf8bcf6f53c6fe5f73\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5193a83e49e4fdc5652c084711083574\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga5193a83e49e4fdc5652c084711083574\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga5193a83e49e4fdc5652c084711083574\">gaussRand</a> (genType Mean, genType Deviation)</td></tr>\n<tr class=\"memdesc:ga5193a83e49e4fdc5652c084711083574\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate random numbers in the interval [Min, Max], according a gaussian distribution.  <a href=\"a00161.html#ga5193a83e49e4fdc5652c084711083574\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5193a83e49e4fdc5652c084711083574\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04e241ab88374a477a2c2ceadd2fa03d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga04e241ab88374a477a2c2ceadd2fa03d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga04e241ab88374a477a2c2ceadd2fa03d\">linearRand</a> (genType Min, genType Max)</td></tr>\n<tr class=\"memdesc:ga04e241ab88374a477a2c2ceadd2fa03d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate random numbers in the interval [Min, Max], according a linear distribution.  <a href=\"a00161.html#ga04e241ab88374a477a2c2ceadd2fa03d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04e241ab88374a477a2c2ceadd2fa03d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga94731130c298a9ff5e5025fdee6d97a0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga94731130c298a9ff5e5025fdee6d97a0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga94731130c298a9ff5e5025fdee6d97a0\">linearRand</a> (vec&lt; L, T, Q &gt; const &amp;Min, vec&lt; L, T, Q &gt; const &amp;Max)</td></tr>\n<tr class=\"memdesc:ga94731130c298a9ff5e5025fdee6d97a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate random numbers in the interval [Min, Max], according a linear distribution.  <a href=\"a00161.html#ga94731130c298a9ff5e5025fdee6d97a0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga94731130c298a9ff5e5025fdee6d97a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga22f90fcaccdf001c516ca90f6428e138\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga22f90fcaccdf001c516ca90f6428e138\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00161.html#ga22f90fcaccdf001c516ca90f6428e138\">sphericalRand</a> (T Radius)</td></tr>\n<tr class=\"memdesc:ga22f90fcaccdf001c516ca90f6428e138\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius.  <a href=\"a00161.html#ga22f90fcaccdf001c516ca90f6428e138\">More...</a><br /></td></tr>\n<tr class=\"separator:ga22f90fcaccdf001c516ca90f6428e138\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00085.html\" title=\"GLM_GTC_random \">glm/gtc/random.hpp</a>&gt; to use the features of this extension. </p>\n<p>Generate random number from various distribution methods. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga7c53b7797f3147af68a11c767679fa3f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, defaultp&gt; glm::ballRand </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>Radius</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00161.html\" title=\"Include <glm/gtc/random.hpp> to use the features of this extension. \">GLM_GTC_random</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9dd05c36025088fae25b97c869e88517\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;2, T, defaultp&gt; glm::circularRand </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>Radius</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00161.html\" title=\"Include <glm/gtc/random.hpp> to use the features of this extension. \">GLM_GTC_random</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa0b18071f3f97dbf8bcf6f53c6fe5f73\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;2, T, defaultp&gt; glm::diskRand </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>Radius</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00161.html\" title=\"Include <glm/gtc/random.hpp> to use the features of this extension. \">GLM_GTC_random</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5193a83e49e4fdc5652c084711083574\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::gaussRand </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Mean</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Deviation</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Generate random numbers in the interval [Min, Max], according a gaussian distribution. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00161.html\" title=\"Include <glm/gtc/random.hpp> to use the features of this extension. \">GLM_GTC_random</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga04e241ab88374a477a2c2ceadd2fa03d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::linearRand </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Min</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Max</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Generate random numbers in the interval [Min, Max], according a linear distribution. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">Min</td><td>Minimum value included in the sampling </td></tr>\n    <tr><td class=\"paramname\">Max</td><td>Maximum value included in the sampling </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Value type. Currently supported: float or double scalars. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00161.html\" title=\"Include <glm/gtc/random.hpp> to use the features of this extension. \">GLM_GTC_random</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga94731130c298a9ff5e5025fdee6d97a0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::linearRand </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Min</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Max</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Generate random numbers in the interval [Min, Max], according a linear distribution. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">Min</td><td>Minimum value included in the sampling </td></tr>\n    <tr><td class=\"paramname\">Max</td><td>Maximum value included in the sampling </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type. Currently supported: float or double.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00161.html\" title=\"Include <glm/gtc/random.hpp> to use the features of this extension. \">GLM_GTC_random</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga22f90fcaccdf001c516ca90f6428e138\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, defaultp&gt; glm::sphericalRand </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>Radius</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00161.html\" title=\"Include <glm/gtc/random.hpp> to use the features of this extension. \">GLM_GTC_random</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00162.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_reciprocal</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_reciprocal<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00088.html\" title=\"GLM_GTC_reciprocal \">glm/gtc/reciprocal.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaeadfb9c9d71093f7865b2ba2ca8d104d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaeadfb9c9d71093f7865b2ba2ca8d104d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#gaeadfb9c9d71093f7865b2ba2ca8d104d\">acot</a> (genType x)</td></tr>\n<tr class=\"memdesc:gaeadfb9c9d71093f7865b2ba2ca8d104d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse cotangent function.  <a href=\"a00162.html#gaeadfb9c9d71093f7865b2ba2ca8d104d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaeadfb9c9d71093f7865b2ba2ca8d104d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafaca98a7100170db8841f446282debfa\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gafaca98a7100170db8841f446282debfa\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#gafaca98a7100170db8841f446282debfa\">acoth</a> (genType x)</td></tr>\n<tr class=\"memdesc:gafaca98a7100170db8841f446282debfa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse cotangent hyperbolic function.  <a href=\"a00162.html#gafaca98a7100170db8841f446282debfa\">More...</a><br /></td></tr>\n<tr class=\"separator:gafaca98a7100170db8841f446282debfa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b4bed91476b9b915e76b4a30236d330\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga1b4bed91476b9b915e76b4a30236d330\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga1b4bed91476b9b915e76b4a30236d330\">acsc</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga1b4bed91476b9b915e76b4a30236d330\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse cosecant function.  <a href=\"a00162.html#ga1b4bed91476b9b915e76b4a30236d330\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b4bed91476b9b915e76b4a30236d330\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b50aa5e5afc7e19ec113ab91596c576\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga4b50aa5e5afc7e19ec113ab91596c576\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga4b50aa5e5afc7e19ec113ab91596c576\">acsch</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga4b50aa5e5afc7e19ec113ab91596c576\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse cosecant hyperbolic function.  <a href=\"a00162.html#ga4b50aa5e5afc7e19ec113ab91596c576\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b50aa5e5afc7e19ec113ab91596c576\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c5b7f962c2c9ff684e6d2de48db1f10\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2c5b7f962c2c9ff684e6d2de48db1f10\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga2c5b7f962c2c9ff684e6d2de48db1f10\">asec</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga2c5b7f962c2c9ff684e6d2de48db1f10\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse secant function.  <a href=\"a00162.html#ga2c5b7f962c2c9ff684e6d2de48db1f10\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c5b7f962c2c9ff684e6d2de48db1f10\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec7586dccfe431f850d006f3824b8ca6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaec7586dccfe431f850d006f3824b8ca6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#gaec7586dccfe431f850d006f3824b8ca6\">asech</a> (genType x)</td></tr>\n<tr class=\"memdesc:gaec7586dccfe431f850d006f3824b8ca6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Inverse secant hyperbolic function.  <a href=\"a00162.html#gaec7586dccfe431f850d006f3824b8ca6\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec7586dccfe431f850d006f3824b8ca6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3a7b517a95bbd3ad74da3aea87a66314\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga3a7b517a95bbd3ad74da3aea87a66314\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga3a7b517a95bbd3ad74da3aea87a66314\">cot</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga3a7b517a95bbd3ad74da3aea87a66314\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Cotangent function.  <a href=\"a00162.html#ga3a7b517a95bbd3ad74da3aea87a66314\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3a7b517a95bbd3ad74da3aea87a66314\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6b8b770eb7198e4dea59d52e6db81442\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6b8b770eb7198e4dea59d52e6db81442\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga6b8b770eb7198e4dea59d52e6db81442\">coth</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga6b8b770eb7198e4dea59d52e6db81442\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Cotangent hyperbolic function.  <a href=\"a00162.html#ga6b8b770eb7198e4dea59d52e6db81442\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6b8b770eb7198e4dea59d52e6db81442\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga59dd0005b6474eea48af743b4f14ebbb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga59dd0005b6474eea48af743b4f14ebbb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga59dd0005b6474eea48af743b4f14ebbb\">csc</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga59dd0005b6474eea48af743b4f14ebbb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Cosecant function.  <a href=\"a00162.html#ga59dd0005b6474eea48af743b4f14ebbb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga59dd0005b6474eea48af743b4f14ebbb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d95843ff3ca6472ab399ba171d290a0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6d95843ff3ca6472ab399ba171d290a0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga6d95843ff3ca6472ab399ba171d290a0\">csch</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga6d95843ff3ca6472ab399ba171d290a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Cosecant hyperbolic function.  <a href=\"a00162.html#ga6d95843ff3ca6472ab399ba171d290a0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d95843ff3ca6472ab399ba171d290a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae4bcbebee670c5ea155f0777b3acbd84\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae4bcbebee670c5ea155f0777b3acbd84\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#gae4bcbebee670c5ea155f0777b3acbd84\">sec</a> (genType angle)</td></tr>\n<tr class=\"memdesc:gae4bcbebee670c5ea155f0777b3acbd84\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Secant function.  <a href=\"a00162.html#gae4bcbebee670c5ea155f0777b3acbd84\">More...</a><br /></td></tr>\n<tr class=\"separator:gae4bcbebee670c5ea155f0777b3acbd84\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9a5cfd1e7170104a7b33863b1b75e5ae\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9a5cfd1e7170104a7b33863b1b75e5ae\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00162.html#ga9a5cfd1e7170104a7b33863b1b75e5ae\">sech</a> (genType angle)</td></tr>\n<tr class=\"memdesc:ga9a5cfd1e7170104a7b33863b1b75e5ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Secant hyperbolic function.  <a href=\"a00162.html#ga9a5cfd1e7170104a7b33863b1b75e5ae\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9a5cfd1e7170104a7b33863b1b75e5ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00088.html\" title=\"GLM_GTC_reciprocal \">glm/gtc/reciprocal.hpp</a>&gt; to use the features of this extension. </p>\n<p>Define secant, cosecant and cotangent functions. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaeadfb9c9d71093f7865b2ba2ca8d104d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::acot </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Inverse cotangent function. </p>\n<dl class=\"section return\"><dt>Returns</dt><dd>Return an angle expressed in radians. </dd></dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafaca98a7100170db8841f446282debfa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::acoth </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Inverse cotangent hyperbolic function. </p>\n<dl class=\"section return\"><dt>Returns</dt><dd>Return an angle expressed in radians. </dd></dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1b4bed91476b9b915e76b4a30236d330\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::acsc </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Inverse cosecant function. </p>\n<dl class=\"section return\"><dt>Returns</dt><dd>Return an angle expressed in radians. </dd></dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4b50aa5e5afc7e19ec113ab91596c576\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::acsch </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Inverse cosecant hyperbolic function. </p>\n<dl class=\"section return\"><dt>Returns</dt><dd>Return an angle expressed in radians. </dd></dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2c5b7f962c2c9ff684e6d2de48db1f10\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::asec </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Inverse secant function. </p>\n<dl class=\"section return\"><dt>Returns</dt><dd>Return an angle expressed in radians. </dd></dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaec7586dccfe431f850d006f3824b8ca6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::asech </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Inverse secant hyperbolic function. </p>\n<dl class=\"section return\"><dt>Returns</dt><dd>Return an angle expressed in radians. </dd></dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3a7b517a95bbd3ad74da3aea87a66314\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::cot </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Cotangent function. </p>\n<p>adjacent / opposite or 1 / tan(x)</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6b8b770eb7198e4dea59d52e6db81442\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::coth </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Cotangent hyperbolic function. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga59dd0005b6474eea48af743b4f14ebbb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::csc </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Cosecant function. </p>\n<p>hypotenuse / opposite or 1 / sin(x)</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6d95843ff3ca6472ab399ba171d290a0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::csch </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Cosecant hyperbolic function. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae4bcbebee670c5ea155f0777b3acbd84\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::sec </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Secant function. </p>\n<p>hypotenuse / adjacent or 1 / cos(x)</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9a5cfd1e7170104a7b33863b1b75e5ae\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::sech </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Secant hyperbolic function. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00162.html\" title=\"Include <glm/gtc/reciprocal.hpp> to use the features of this extension. \">GLM_GTC_reciprocal</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00163.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_round</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_round<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00091.html\" title=\"GLM_GTC_round \">glm/gtc/round.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gac84898c466e609cdd2e81d9ba907d9e8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gac84898c466e609cdd2e81d9ba907d9e8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gac84898c466e609cdd2e81d9ba907d9e8\">ceilMultiple</a> (genType Source, genType Multiple)</td></tr>\n<tr class=\"memdesc:gac84898c466e609cdd2e81d9ba907d9e8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Higher multiple number of Source.  <a href=\"a00163.html#gac84898c466e609cdd2e81d9ba907d9e8\">More...</a><br /></td></tr>\n<tr class=\"separator:gac84898c466e609cdd2e81d9ba907d9e8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga073227936f36f9102cd3a8aa45871b26\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga073227936f36f9102cd3a8aa45871b26\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga073227936f36f9102cd3a8aa45871b26\">ceilMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</td></tr>\n<tr class=\"memdesc:ga073227936f36f9102cd3a8aa45871b26\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Higher multiple number of Source.  <a href=\"a00163.html#ga073227936f36f9102cd3a8aa45871b26\">More...</a><br /></td></tr>\n<tr class=\"separator:ga073227936f36f9102cd3a8aa45871b26\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa73c7690c787086fa3ac1c312264acab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gaa73c7690c787086fa3ac1c312264acab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gaa73c7690c787086fa3ac1c312264acab\">ceilPowerOfTwo</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:gaa73c7690c787086fa3ac1c312264acab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just higher the input value, round up to a power of two.  <a href=\"a00163.html#gaa73c7690c787086fa3ac1c312264acab\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa73c7690c787086fa3ac1c312264acab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac46c061058771cb31c467ef673d12c80\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac46c061058771cb31c467ef673d12c80\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gac46c061058771cb31c467ef673d12c80\">ceilPowerOfTwo</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:gac46c061058771cb31c467ef673d12c80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just higher the input value, round up to a power of two.  <a href=\"a00163.html#gac46c061058771cb31c467ef673d12c80\">More...</a><br /></td></tr>\n<tr class=\"separator:gac46c061058771cb31c467ef673d12c80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9eafb9dbedf84e5cece65c2fe9d5631d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9eafb9dbedf84e5cece65c2fe9d5631d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga9eafb9dbedf84e5cece65c2fe9d5631d\">floorMultiple</a> (genType Source, genType Multiple)</td></tr>\n<tr class=\"memdesc:ga9eafb9dbedf84e5cece65c2fe9d5631d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Lower multiple number of Source.  <a href=\"a00163.html#ga9eafb9dbedf84e5cece65c2fe9d5631d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9eafb9dbedf84e5cece65c2fe9d5631d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b6d6bcdf0641b54cb539104c224885b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2b6d6bcdf0641b54cb539104c224885b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga2b6d6bcdf0641b54cb539104c224885b\">floorMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</td></tr>\n<tr class=\"memdesc:ga2b6d6bcdf0641b54cb539104c224885b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Lower multiple number of Source.  <a href=\"a00163.html#ga2b6d6bcdf0641b54cb539104c224885b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b6d6bcdf0641b54cb539104c224885b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac80f6519c31baae10d8d7bea6735d1fa\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gac80f6519c31baae10d8d7bea6735d1fa\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gac80f6519c31baae10d8d7bea6735d1fa\">floorPowerOfTwo</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:gac80f6519c31baae10d8d7bea6735d1fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just lower the input value, round down to a power of two.  <a href=\"a00163.html#gac80f6519c31baae10d8d7bea6735d1fa\">More...</a><br /></td></tr>\n<tr class=\"separator:gac80f6519c31baae10d8d7bea6735d1fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6ebfea889605abf6629c7589e0cb2e28\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6ebfea889605abf6629c7589e0cb2e28\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga6ebfea889605abf6629c7589e0cb2e28\">floorPowerOfTwo</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga6ebfea889605abf6629c7589e0cb2e28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just lower the input value, round down to a power of two.  <a href=\"a00163.html#ga6ebfea889605abf6629c7589e0cb2e28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6ebfea889605abf6629c7589e0cb2e28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf7444a7b2eb524f373463ceba76b9326\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gaf7444a7b2eb524f373463ceba76b9326\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gaf7444a7b2eb524f373463ceba76b9326\">isMultiple</a> (genIUType Value, genIUType Multiple)</td></tr>\n<tr class=\"memdesc:gaf7444a7b2eb524f373463ceba76b9326\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the 'Value' is a multiple of 'Multiple'.  <a href=\"a00163.html#gaf7444a7b2eb524f373463ceba76b9326\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf7444a7b2eb524f373463ceba76b9326\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga908a61945ecb235817a9a87b249d4b2d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga908a61945ecb235817a9a87b249d4b2d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga908a61945ecb235817a9a87b249d4b2d\">isMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Value, T Multiple)</td></tr>\n<tr class=\"memdesc:ga908a61945ecb235817a9a87b249d4b2d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the 'Value' is a multiple of 'Multiple'.  <a href=\"a00163.html#ga908a61945ecb235817a9a87b249d4b2d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga908a61945ecb235817a9a87b249d4b2d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12b5f07c3ed46acc6838f159ca6ef368\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga12b5f07c3ed46acc6838f159ca6ef368\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368\">isMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Value, vec&lt; L, T, Q &gt; const &amp;Multiple)</td></tr>\n<tr class=\"memdesc:ga12b5f07c3ed46acc6838f159ca6ef368\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the 'Value' is a multiple of 'Multiple'.  <a href=\"a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12b5f07c3ed46acc6838f159ca6ef368\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebf826fbb6e0a70eeaab0792d89b25ec\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gaebf826fbb6e0a70eeaab0792d89b25ec\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#gaebf826fbb6e0a70eeaab0792d89b25ec\">isPowerOfTwo</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:gaebf826fbb6e0a70eeaab0792d89b25ec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the value is a power of two number.  <a href=\"a00163.html#gaebf826fbb6e0a70eeaab0792d89b25ec\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebf826fbb6e0a70eeaab0792d89b25ec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga866a7bbd725d7d40b5d433d02bf70f17\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga866a7bbd725d7d40b5d433d02bf70f17\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17\">isPowerOfTwo</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga866a7bbd725d7d40b5d433d02bf70f17\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return true if the value is a power of two number.  <a href=\"a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17\">More...</a><br /></td></tr>\n<tr class=\"separator:ga866a7bbd725d7d40b5d433d02bf70f17\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6739d1de04b2cea7c78675b365644bce\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6739d1de04b2cea7c78675b365644bce\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga6739d1de04b2cea7c78675b365644bce\">roundMultiple</a> (genType Source, genType Multiple)</td></tr>\n<tr class=\"memdesc:ga6739d1de04b2cea7c78675b365644bce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Lower multiple number of Source.  <a href=\"a00163.html#ga6739d1de04b2cea7c78675b365644bce\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6739d1de04b2cea7c78675b365644bce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga812d27fa1a60c48dc111d67da26b1455\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga812d27fa1a60c48dc111d67da26b1455\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga812d27fa1a60c48dc111d67da26b1455\">roundMultiple</a> (vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)</td></tr>\n<tr class=\"memdesc:ga812d27fa1a60c48dc111d67da26b1455\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Lower multiple number of Source.  <a href=\"a00163.html#ga812d27fa1a60c48dc111d67da26b1455\">More...</a><br /></td></tr>\n<tr class=\"separator:ga812d27fa1a60c48dc111d67da26b1455\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d24a9e3abe3e6a908661b43acb8efe0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga6d24a9e3abe3e6a908661b43acb8efe0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga6d24a9e3abe3e6a908661b43acb8efe0\">roundPowerOfTwo</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:ga6d24a9e3abe3e6a908661b43acb8efe0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is the closet to the input value.  <a href=\"a00163.html#ga6d24a9e3abe3e6a908661b43acb8efe0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d24a9e3abe3e6a908661b43acb8efe0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6\">roundPowerOfTwo</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is the closet to the input value.  <a href=\"a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00091.html\" title=\"GLM_GTC_round \">glm/gtc/round.hpp</a>&gt; to use the features of this extension. </p>\n<p>Rounding value to specific boundings </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gac84898c466e609cdd2e81d9ba907d9e8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::ceilMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Source</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Higher multiple number of Source. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer scalar or vector types. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">Multiple</td><td>Must be a null or positive value</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga073227936f36f9102cd3a8aa45871b26\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::ceilMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Source</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Higher multiple number of Source. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">Multiple</td><td>Must be a null or positive value</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa73c7690c787086fa3ac1c312264acab\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::ceilPowerOfTwo </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is just higher the input value, round up to a power of two. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac46c061058771cb31c467ef673d12c80\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::ceilPowerOfTwo </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is just higher the input value, round up to a power of two. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9eafb9dbedf84e5cece65c2fe9d5631d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::floorMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Source</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Lower multiple number of Source. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer scalar or vector types. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">Multiple</td><td>Must be a null or positive value</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2b6d6bcdf0641b54cb539104c224885b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::floorMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Source</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Lower multiple number of Source. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">Multiple</td><td>Must be a null or positive value</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac80f6519c31baae10d8d7bea6735d1fa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::floorPowerOfTwo </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is just lower the input value, round down to a power of two. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6ebfea889605abf6629c7589e0cb2e28\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::floorPowerOfTwo </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is just lower the input value, round down to a power of two. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf7444a7b2eb524f373463ceba76b9326\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return true if the 'Value' is a multiple of 'Multiple'. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga908a61945ecb235817a9a87b249d4b2d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::isMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Value</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return true if the 'Value' is a multiple of 'Multiple'. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga12b5f07c3ed46acc6838f159ca6ef368\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::isMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Value</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return true if the 'Value' is a multiple of 'Multiple'. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaebf826fbb6e0a70eeaab0792d89b25ec\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isPowerOfTwo </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return true if the value is a power of two number. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga866a7bbd725d7d40b5d433d02bf70f17\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::isPowerOfTwo </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return true if the value is a power of two number. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6739d1de04b2cea7c78675b365644bce\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::roundMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Source</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Lower multiple number of Source. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point or integer scalar or vector types. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">Multiple</td><td>Must be a null or positive value</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga812d27fa1a60c48dc111d67da26b1455\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::roundMultiple </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Source</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Multiple</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Lower multiple number of Source. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">Multiple</td><td>Must be a null or positive value</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6d24a9e3abe3e6a908661b43acb8efe0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::roundPowerOfTwo </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is the closet to the input value. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga31bea2d2e0b9bc62bd14b60fcb10f4e6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::roundPowerOfTwo </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is the closet to the input value. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00164.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_type_aligned</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_type_aligned<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00101.html\" title=\"GLM_GTC_type_aligned \">glm/gtc/type_aligned.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga780a35f764020f553a9601a3fcdcd059\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga780a35f764020f553a9601a3fcdcd059\"></a>\ntypedef aligned_highp_bvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga780a35f764020f553a9601a3fcdcd059\">aligned_bvec1</a></td></tr>\n<tr class=\"memdesc:ga780a35f764020f553a9601a3fcdcd059\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga780a35f764020f553a9601a3fcdcd059\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae766b317c5afec852bfb3d74a3c54bc8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae766b317c5afec852bfb3d74a3c54bc8\"></a>\ntypedef aligned_highp_bvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae766b317c5afec852bfb3d74a3c54bc8\">aligned_bvec2</a></td></tr>\n<tr class=\"memdesc:gae766b317c5afec852bfb3d74a3c54bc8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae766b317c5afec852bfb3d74a3c54bc8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1964ba70d15915e5b710926decbb3cb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae1964ba70d15915e5b710926decbb3cb\"></a>\ntypedef aligned_highp_bvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae1964ba70d15915e5b710926decbb3cb\">aligned_bvec3</a></td></tr>\n<tr class=\"memdesc:gae1964ba70d15915e5b710926decbb3cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae1964ba70d15915e5b710926decbb3cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae164a1f7879f828bc35e50b79d786b05\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae164a1f7879f828bc35e50b79d786b05\"></a>\ntypedef aligned_highp_bvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae164a1f7879f828bc35e50b79d786b05\">aligned_bvec4</a></td></tr>\n<tr class=\"memdesc:gae164a1f7879f828bc35e50b79d786b05\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae164a1f7879f828bc35e50b79d786b05\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4974f46ae5a19415d91316960a53617a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4974f46ae5a19415d91316960a53617a\"></a>\ntypedef aligned_highp_dvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">aligned_dvec1</a></td></tr>\n<tr class=\"memdesc:ga4974f46ae5a19415d91316960a53617a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga4974f46ae5a19415d91316960a53617a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga18d859f87122b2b3b2992ffe86dbebc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga18d859f87122b2b3b2992ffe86dbebc0\"></a>\ntypedef aligned_highp_dvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">aligned_dvec2</a></td></tr>\n<tr class=\"memdesc:ga18d859f87122b2b3b2992ffe86dbebc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga18d859f87122b2b3b2992ffe86dbebc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa37869eea77d28419b2fb0ff70b69bf0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa37869eea77d28419b2fb0ff70b69bf0\"></a>\ntypedef aligned_highp_dvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">aligned_dvec3</a></td></tr>\n<tr class=\"memdesc:gaa37869eea77d28419b2fb0ff70b69bf0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:gaa37869eea77d28419b2fb0ff70b69bf0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8a9f0a4795ccc442fa9901845026f9f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8a9f0a4795ccc442fa9901845026f9f5\"></a>\ntypedef aligned_highp_dvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">aligned_dvec4</a></td></tr>\n<tr class=\"memdesc:ga8a9f0a4795ccc442fa9901845026f9f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga8a9f0a4795ccc442fa9901845026f9f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga862843a45b01c35ffe4d44c47ea774ad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga862843a45b01c35ffe4d44c47ea774ad\"></a>\ntypedef vec&lt; 1, bool, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga862843a45b01c35ffe4d44c47ea774ad\">aligned_highp_bvec1</a></td></tr>\n<tr class=\"memdesc:ga862843a45b01c35ffe4d44c47ea774ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga862843a45b01c35ffe4d44c47ea774ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0731b593c5e33559954c80f8687e76c6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0731b593c5e33559954c80f8687e76c6\"></a>\ntypedef vec&lt; 2, bool, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0731b593c5e33559954c80f8687e76c6\">aligned_highp_bvec2</a></td></tr>\n<tr class=\"memdesc:ga0731b593c5e33559954c80f8687e76c6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga0731b593c5e33559954c80f8687e76c6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0913bdf048d0cb74af1d2512aec675bc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0913bdf048d0cb74af1d2512aec675bc\"></a>\ntypedef vec&lt; 3, bool, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0913bdf048d0cb74af1d2512aec675bc\">aligned_highp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga0913bdf048d0cb74af1d2512aec675bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga0913bdf048d0cb74af1d2512aec675bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9df1d0c425852cf63a57e533b7a83f4f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9df1d0c425852cf63a57e533b7a83f4f\"></a>\ntypedef vec&lt; 4, bool, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga9df1d0c425852cf63a57e533b7a83f4f\">aligned_highp_bvec4</a></td></tr>\n<tr class=\"memdesc:ga9df1d0c425852cf63a57e533b7a83f4f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga9df1d0c425852cf63a57e533b7a83f4f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf0448b0f7ceb8273f7eda3a92205eefc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf0448b0f7ceb8273f7eda3a92205eefc\"></a>\ntypedef vec&lt; 1, double, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaf0448b0f7ceb8273f7eda3a92205eefc\">aligned_highp_dvec1</a></td></tr>\n<tr class=\"memdesc:gaf0448b0f7ceb8273f7eda3a92205eefc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gaf0448b0f7ceb8273f7eda3a92205eefc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab173a333e6b7ce153ceba66ac4a321cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab173a333e6b7ce153ceba66ac4a321cf\"></a>\ntypedef vec&lt; 2, double, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab173a333e6b7ce153ceba66ac4a321cf\">aligned_highp_dvec2</a></td></tr>\n<tr class=\"memdesc:gab173a333e6b7ce153ceba66ac4a321cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab173a333e6b7ce153ceba66ac4a321cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae94ef61edfa047d05bc69b6065fc42ba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae94ef61edfa047d05bc69b6065fc42ba\"></a>\ntypedef vec&lt; 3, double, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae94ef61edfa047d05bc69b6065fc42ba\">aligned_highp_dvec3</a></td></tr>\n<tr class=\"memdesc:gae94ef61edfa047d05bc69b6065fc42ba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gae94ef61edfa047d05bc69b6065fc42ba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8fad35c5677f228e261fe541f15363a4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8fad35c5677f228e261fe541f15363a4\"></a>\ntypedef vec&lt; 4, double, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8fad35c5677f228e261fe541f15363a4\">aligned_highp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga8fad35c5677f228e261fe541f15363a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga8fad35c5677f228e261fe541f15363a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad63b8c5b4dc0500d54d7414ef555178f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad63b8c5b4dc0500d54d7414ef555178f\"></a>\ntypedef vec&lt; 1, int, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad63b8c5b4dc0500d54d7414ef555178f\">aligned_highp_ivec1</a></td></tr>\n<tr class=\"memdesc:gad63b8c5b4dc0500d54d7414ef555178f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gad63b8c5b4dc0500d54d7414ef555178f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41563650f36cb7f479e080de21e08418\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga41563650f36cb7f479e080de21e08418\"></a>\ntypedef vec&lt; 2, int, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga41563650f36cb7f479e080de21e08418\">aligned_highp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga41563650f36cb7f479e080de21e08418\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga41563650f36cb7f479e080de21e08418\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6eca5170bb35eac90b4972590fd31a06\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6eca5170bb35eac90b4972590fd31a06\"></a>\ntypedef vec&lt; 3, int, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6eca5170bb35eac90b4972590fd31a06\">aligned_highp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga6eca5170bb35eac90b4972590fd31a06\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga6eca5170bb35eac90b4972590fd31a06\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31bfa801e1579fdba752ec3f7a45ec91\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga31bfa801e1579fdba752ec3f7a45ec91\"></a>\ntypedef vec&lt; 4, int, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga31bfa801e1579fdba752ec3f7a45ec91\">aligned_highp_ivec4</a></td></tr>\n<tr class=\"memdesc:ga31bfa801e1579fdba752ec3f7a45ec91\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga31bfa801e1579fdba752ec3f7a45ec91\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5b80e28396c6ef7d32c6fd18df498451\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5b80e28396c6ef7d32c6fd18df498451\"></a>\ntypedef vec&lt; 1, uint, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5b80e28396c6ef7d32c6fd18df498451\">aligned_highp_uvec1</a></td></tr>\n<tr class=\"memdesc:ga5b80e28396c6ef7d32c6fd18df498451\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga5b80e28396c6ef7d32c6fd18df498451\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04db692662a4908beeaf5a5ba6e19483\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga04db692662a4908beeaf5a5ba6e19483\"></a>\ntypedef vec&lt; 2, uint, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga04db692662a4908beeaf5a5ba6e19483\">aligned_highp_uvec2</a></td></tr>\n<tr class=\"memdesc:ga04db692662a4908beeaf5a5ba6e19483\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga04db692662a4908beeaf5a5ba6e19483\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga073fd6e8b241afade6d8afbd676b2667\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga073fd6e8b241afade6d8afbd676b2667\"></a>\ntypedef vec&lt; 3, uint, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga073fd6e8b241afade6d8afbd676b2667\">aligned_highp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga073fd6e8b241afade6d8afbd676b2667\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga073fd6e8b241afade6d8afbd676b2667\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabdd60462042859f876c17c7346c732a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabdd60462042859f876c17c7346c732a5\"></a>\ntypedef vec&lt; 4, uint, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gabdd60462042859f876c17c7346c732a5\">aligned_highp_uvec4</a></td></tr>\n<tr class=\"memdesc:gabdd60462042859f876c17c7346c732a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gabdd60462042859f876c17c7346c732a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d0bd70d5fac49b800546d608b707513\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4d0bd70d5fac49b800546d608b707513\"></a>\ntypedef vec&lt; 1, float, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga4d0bd70d5fac49b800546d608b707513\">aligned_highp_vec1</a></td></tr>\n<tr class=\"memdesc:ga4d0bd70d5fac49b800546d608b707513\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga4d0bd70d5fac49b800546d608b707513\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac9f8482dde741fb6bab7248b81a45465\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac9f8482dde741fb6bab7248b81a45465\"></a>\ntypedef vec&lt; 2, float, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gac9f8482dde741fb6bab7248b81a45465\">aligned_highp_vec2</a></td></tr>\n<tr class=\"memdesc:gac9f8482dde741fb6bab7248b81a45465\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gac9f8482dde741fb6bab7248b81a45465\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga65415d2d68c9cc0ca554524a8f5510b2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga65415d2d68c9cc0ca554524a8f5510b2\"></a>\ntypedef vec&lt; 3, float, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga65415d2d68c9cc0ca554524a8f5510b2\">aligned_highp_vec3</a></td></tr>\n<tr class=\"memdesc:ga65415d2d68c9cc0ca554524a8f5510b2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga65415d2d68c9cc0ca554524a8f5510b2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7cb26d354dd69d23849c34c4fba88da9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7cb26d354dd69d23849c34c4fba88da9\"></a>\ntypedef vec&lt; 4, float, aligned_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7cb26d354dd69d23849c34c4fba88da9\">aligned_highp_vec4</a></td></tr>\n<tr class=\"memdesc:ga7cb26d354dd69d23849c34c4fba88da9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga7cb26d354dd69d23849c34c4fba88da9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga76298aed82a439063c3d55980c84aa0b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga76298aed82a439063c3d55980c84aa0b\"></a>\ntypedef aligned_highp_ivec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">aligned_ivec1</a></td></tr>\n<tr class=\"memdesc:ga76298aed82a439063c3d55980c84aa0b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga76298aed82a439063c3d55980c84aa0b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae4f38fd2c86cee6940986197777b3ca4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae4f38fd2c86cee6940986197777b3ca4\"></a>\ntypedef aligned_highp_ivec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">aligned_ivec2</a></td></tr>\n<tr class=\"memdesc:gae4f38fd2c86cee6940986197777b3ca4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gae4f38fd2c86cee6940986197777b3ca4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga32794322d294e5ace7fed4a61896f270\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga32794322d294e5ace7fed4a61896f270\"></a>\ntypedef aligned_highp_ivec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">aligned_ivec3</a></td></tr>\n<tr class=\"memdesc:ga32794322d294e5ace7fed4a61896f270\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga32794322d294e5ace7fed4a61896f270\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f79eae5927c9033d84617e49f6f34e4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7f79eae5927c9033d84617e49f6f34e4\"></a>\ntypedef aligned_highp_ivec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">aligned_ivec4</a></td></tr>\n<tr class=\"memdesc:ga7f79eae5927c9033d84617e49f6f34e4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga7f79eae5927c9033d84617e49f6f34e4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac6036449ab1c4abf8efe1ea00fcdd1c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac6036449ab1c4abf8efe1ea00fcdd1c9\"></a>\ntypedef vec&lt; 1, bool, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gac6036449ab1c4abf8efe1ea00fcdd1c9\">aligned_lowp_bvec1</a></td></tr>\n<tr class=\"memdesc:gac6036449ab1c4abf8efe1ea00fcdd1c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gac6036449ab1c4abf8efe1ea00fcdd1c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga59fadcd3835646e419372ae8b43c5d37\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga59fadcd3835646e419372ae8b43c5d37\"></a>\ntypedef vec&lt; 2, bool, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga59fadcd3835646e419372ae8b43c5d37\">aligned_lowp_bvec2</a></td></tr>\n<tr class=\"memdesc:ga59fadcd3835646e419372ae8b43c5d37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga59fadcd3835646e419372ae8b43c5d37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga83aab4d191053f169c93a3e364f2e118\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga83aab4d191053f169c93a3e364f2e118\"></a>\ntypedef vec&lt; 3, bool, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga83aab4d191053f169c93a3e364f2e118\">aligned_lowp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga83aab4d191053f169c93a3e364f2e118\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga83aab4d191053f169c93a3e364f2e118\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7a76555ee4853614e5755181a8dd54e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa7a76555ee4853614e5755181a8dd54e\"></a>\ntypedef vec&lt; 4, bool, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaa7a76555ee4853614e5755181a8dd54e\">aligned_lowp_bvec4</a></td></tr>\n<tr class=\"memdesc:gaa7a76555ee4853614e5755181a8dd54e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gaa7a76555ee4853614e5755181a8dd54e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f8a2cc5a686e52b1615761f4978ca62\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7f8a2cc5a686e52b1615761f4978ca62\"></a>\ntypedef vec&lt; 1, double, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7f8a2cc5a686e52b1615761f4978ca62\">aligned_lowp_dvec1</a></td></tr>\n<tr class=\"memdesc:ga7f8a2cc5a686e52b1615761f4978ca62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga7f8a2cc5a686e52b1615761f4978ca62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0e37cff4a43cca866101f0a35f01db6d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0e37cff4a43cca866101f0a35f01db6d\"></a>\ntypedef vec&lt; 2, double, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0e37cff4a43cca866101f0a35f01db6d\">aligned_lowp_dvec2</a></td></tr>\n<tr class=\"memdesc:ga0e37cff4a43cca866101f0a35f01db6d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga0e37cff4a43cca866101f0a35f01db6d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab9e669c4efd52d3347fc6d5f6b20fd59\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab9e669c4efd52d3347fc6d5f6b20fd59\"></a>\ntypedef vec&lt; 3, double, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab9e669c4efd52d3347fc6d5f6b20fd59\">aligned_lowp_dvec3</a></td></tr>\n<tr class=\"memdesc:gab9e669c4efd52d3347fc6d5f6b20fd59\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab9e669c4efd52d3347fc6d5f6b20fd59\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga226f5ec7a953cea559c16fe3aff9924f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga226f5ec7a953cea559c16fe3aff9924f\"></a>\ntypedef vec&lt; 4, double, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga226f5ec7a953cea559c16fe3aff9924f\">aligned_lowp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga226f5ec7a953cea559c16fe3aff9924f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga226f5ec7a953cea559c16fe3aff9924f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1101d3a82b2e3f5f8828bd8f3adab3e1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1101d3a82b2e3f5f8828bd8f3adab3e1\"></a>\ntypedef vec&lt; 1, int, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1101d3a82b2e3f5f8828bd8f3adab3e1\">aligned_lowp_ivec1</a></td></tr>\n<tr class=\"memdesc:ga1101d3a82b2e3f5f8828bd8f3adab3e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga1101d3a82b2e3f5f8828bd8f3adab3e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga44c4accad582cfbd7226a19b83b0cadc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga44c4accad582cfbd7226a19b83b0cadc\"></a>\ntypedef vec&lt; 2, int, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga44c4accad582cfbd7226a19b83b0cadc\">aligned_lowp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga44c4accad582cfbd7226a19b83b0cadc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga44c4accad582cfbd7226a19b83b0cadc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga65663f10a02e52cedcddbcfe36ddf38d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga65663f10a02e52cedcddbcfe36ddf38d\"></a>\ntypedef vec&lt; 3, int, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga65663f10a02e52cedcddbcfe36ddf38d\">aligned_lowp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga65663f10a02e52cedcddbcfe36ddf38d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga65663f10a02e52cedcddbcfe36ddf38d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaae92fcec8b2e0328ffbeac31cc4fc419\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaae92fcec8b2e0328ffbeac31cc4fc419\"></a>\ntypedef vec&lt; 4, int, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaae92fcec8b2e0328ffbeac31cc4fc419\">aligned_lowp_ivec4</a></td></tr>\n<tr class=\"memdesc:gaae92fcec8b2e0328ffbeac31cc4fc419\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gaae92fcec8b2e0328ffbeac31cc4fc419\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad09b93acc43c43423408d17a64f6d7ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad09b93acc43c43423408d17a64f6d7ca\"></a>\ntypedef vec&lt; 1, uint, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad09b93acc43c43423408d17a64f6d7ca\">aligned_lowp_uvec1</a></td></tr>\n<tr class=\"memdesc:gad09b93acc43c43423408d17a64f6d7ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gad09b93acc43c43423408d17a64f6d7ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6f94fcd28dde906fc6cad5f742b55c1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6f94fcd28dde906fc6cad5f742b55c1a\"></a>\ntypedef vec&lt; 2, uint, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6f94fcd28dde906fc6cad5f742b55c1a\">aligned_lowp_uvec2</a></td></tr>\n<tr class=\"memdesc:ga6f94fcd28dde906fc6cad5f742b55c1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga6f94fcd28dde906fc6cad5f742b55c1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9e9f006970b1a00862e3e6e599eedd4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9e9f006970b1a00862e3e6e599eedd4c\"></a>\ntypedef vec&lt; 3, uint, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga9e9f006970b1a00862e3e6e599eedd4c\">aligned_lowp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga9e9f006970b1a00862e3e6e599eedd4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga9e9f006970b1a00862e3e6e599eedd4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga46b1b0b9eb8625a5d69137bd66cd13dc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga46b1b0b9eb8625a5d69137bd66cd13dc\"></a>\ntypedef vec&lt; 4, uint, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga46b1b0b9eb8625a5d69137bd66cd13dc\">aligned_lowp_uvec4</a></td></tr>\n<tr class=\"memdesc:ga46b1b0b9eb8625a5d69137bd66cd13dc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga46b1b0b9eb8625a5d69137bd66cd13dc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab34aee3d5e121c543fea11d2c50ecc43\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab34aee3d5e121c543fea11d2c50ecc43\"></a>\ntypedef vec&lt; 1, float, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab34aee3d5e121c543fea11d2c50ecc43\">aligned_lowp_vec1</a></td></tr>\n<tr class=\"memdesc:gab34aee3d5e121c543fea11d2c50ecc43\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab34aee3d5e121c543fea11d2c50ecc43\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga53ac5d252317f1fa43c2ef921857bf13\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga53ac5d252317f1fa43c2ef921857bf13\"></a>\ntypedef vec&lt; 2, float, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga53ac5d252317f1fa43c2ef921857bf13\">aligned_lowp_vec2</a></td></tr>\n<tr class=\"memdesc:ga53ac5d252317f1fa43c2ef921857bf13\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga53ac5d252317f1fa43c2ef921857bf13\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98f0b5cd65fce164ff1367c2a3b3aa1e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga98f0b5cd65fce164ff1367c2a3b3aa1e\"></a>\ntypedef vec&lt; 3, float, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga98f0b5cd65fce164ff1367c2a3b3aa1e\">aligned_lowp_vec3</a></td></tr>\n<tr class=\"memdesc:ga98f0b5cd65fce164ff1367c2a3b3aa1e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga98f0b5cd65fce164ff1367c2a3b3aa1e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga82f7275d6102593a69ce38cdad680409\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga82f7275d6102593a69ce38cdad680409\"></a>\ntypedef vec&lt; 4, float, aligned_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga82f7275d6102593a69ce38cdad680409\">aligned_lowp_vec4</a></td></tr>\n<tr class=\"memdesc:ga82f7275d6102593a69ce38cdad680409\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga82f7275d6102593a69ce38cdad680409\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadd3b8bd71a758f7fb0da8e525156f34e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gadd3b8bd71a758f7fb0da8e525156f34e\"></a>\ntypedef vec&lt; 1, bool, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gadd3b8bd71a758f7fb0da8e525156f34e\">aligned_mediump_bvec1</a></td></tr>\n<tr class=\"memdesc:gadd3b8bd71a758f7fb0da8e525156f34e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gadd3b8bd71a758f7fb0da8e525156f34e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb183eb5e67ec0d0ea5a016cba962810\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gacb183eb5e67ec0d0ea5a016cba962810\"></a>\ntypedef vec&lt; 2, bool, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gacb183eb5e67ec0d0ea5a016cba962810\">aligned_mediump_bvec2</a></td></tr>\n<tr class=\"memdesc:gacb183eb5e67ec0d0ea5a016cba962810\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gacb183eb5e67ec0d0ea5a016cba962810\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacfa4a542f1b20a5b63ad702dfb6fd587\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gacfa4a542f1b20a5b63ad702dfb6fd587\"></a>\ntypedef vec&lt; 3, bool, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gacfa4a542f1b20a5b63ad702dfb6fd587\">aligned_mediump_bvec3</a></td></tr>\n<tr class=\"memdesc:gacfa4a542f1b20a5b63ad702dfb6fd587\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gacfa4a542f1b20a5b63ad702dfb6fd587\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91bc1f513bb9b0fd60281d57ded9a48c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga91bc1f513bb9b0fd60281d57ded9a48c\"></a>\ntypedef vec&lt; 4, bool, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga91bc1f513bb9b0fd60281d57ded9a48c\">aligned_mediump_bvec4</a></td></tr>\n<tr class=\"memdesc:ga91bc1f513bb9b0fd60281d57ded9a48c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga91bc1f513bb9b0fd60281d57ded9a48c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7180b685c581adb224406a7f831608e3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7180b685c581adb224406a7f831608e3\"></a>\ntypedef vec&lt; 1, double, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7180b685c581adb224406a7f831608e3\">aligned_mediump_dvec1</a></td></tr>\n<tr class=\"memdesc:ga7180b685c581adb224406a7f831608e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga7180b685c581adb224406a7f831608e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9af1eabe22f569e70d9893be72eda0f5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9af1eabe22f569e70d9893be72eda0f5\"></a>\ntypedef vec&lt; 2, double, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga9af1eabe22f569e70d9893be72eda0f5\">aligned_mediump_dvec2</a></td></tr>\n<tr class=\"memdesc:ga9af1eabe22f569e70d9893be72eda0f5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga9af1eabe22f569e70d9893be72eda0f5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga058e7ddab1428e47f2197bdd3a5a6953\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga058e7ddab1428e47f2197bdd3a5a6953\"></a>\ntypedef vec&lt; 3, double, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga058e7ddab1428e47f2197bdd3a5a6953\">aligned_mediump_dvec3</a></td></tr>\n<tr class=\"memdesc:ga058e7ddab1428e47f2197bdd3a5a6953\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga058e7ddab1428e47f2197bdd3a5a6953\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaffd747ea2aea1e69c2ecb04e68521b21\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaffd747ea2aea1e69c2ecb04e68521b21\"></a>\ntypedef vec&lt; 4, double, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaffd747ea2aea1e69c2ecb04e68521b21\">aligned_mediump_dvec4</a></td></tr>\n<tr class=\"memdesc:gaffd747ea2aea1e69c2ecb04e68521b21\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gaffd747ea2aea1e69c2ecb04e68521b21\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20e63dd980b81af10cadbbe219316650\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga20e63dd980b81af10cadbbe219316650\"></a>\ntypedef vec&lt; 1, int, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga20e63dd980b81af10cadbbe219316650\">aligned_mediump_ivec1</a></td></tr>\n<tr class=\"memdesc:ga20e63dd980b81af10cadbbe219316650\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga20e63dd980b81af10cadbbe219316650\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaea13d89d49daca2c796aeaa82fc2c2f2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaea13d89d49daca2c796aeaa82fc2c2f2\"></a>\ntypedef vec&lt; 2, int, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaea13d89d49daca2c796aeaa82fc2c2f2\">aligned_mediump_ivec2</a></td></tr>\n<tr class=\"memdesc:gaea13d89d49daca2c796aeaa82fc2c2f2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gaea13d89d49daca2c796aeaa82fc2c2f2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabbf0f15e9c3d9868e43241ad018f82bd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabbf0f15e9c3d9868e43241ad018f82bd\"></a>\ntypedef vec&lt; 3, int, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gabbf0f15e9c3d9868e43241ad018f82bd\">aligned_mediump_ivec3</a></td></tr>\n<tr class=\"memdesc:gabbf0f15e9c3d9868e43241ad018f82bd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gabbf0f15e9c3d9868e43241ad018f82bd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6099dd7878d0a78101a4250d8cd2d736\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6099dd7878d0a78101a4250d8cd2d736\"></a>\ntypedef vec&lt; 4, int, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6099dd7878d0a78101a4250d8cd2d736\">aligned_mediump_ivec4</a></td></tr>\n<tr class=\"memdesc:ga6099dd7878d0a78101a4250d8cd2d736\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga6099dd7878d0a78101a4250d8cd2d736\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb78126ea2eb779b41c7511128ff1283\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gacb78126ea2eb779b41c7511128ff1283\"></a>\ntypedef vec&lt; 1, uint, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gacb78126ea2eb779b41c7511128ff1283\">aligned_mediump_uvec1</a></td></tr>\n<tr class=\"memdesc:gacb78126ea2eb779b41c7511128ff1283\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gacb78126ea2eb779b41c7511128ff1283\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga081d53e0a71443d0b68ea61c870f9adc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga081d53e0a71443d0b68ea61c870f9adc\"></a>\ntypedef vec&lt; 2, uint, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga081d53e0a71443d0b68ea61c870f9adc\">aligned_mediump_uvec2</a></td></tr>\n<tr class=\"memdesc:ga081d53e0a71443d0b68ea61c870f9adc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga081d53e0a71443d0b68ea61c870f9adc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad6fc921bdde2bdbc7e09b028e1e9b379\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad6fc921bdde2bdbc7e09b028e1e9b379\"></a>\ntypedef vec&lt; 3, uint, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad6fc921bdde2bdbc7e09b028e1e9b379\">aligned_mediump_uvec3</a></td></tr>\n<tr class=\"memdesc:gad6fc921bdde2bdbc7e09b028e1e9b379\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gad6fc921bdde2bdbc7e09b028e1e9b379\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73ea0c1ba31580e107d21270883f51fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga73ea0c1ba31580e107d21270883f51fc\"></a>\ntypedef vec&lt; 4, uint, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga73ea0c1ba31580e107d21270883f51fc\">aligned_mediump_uvec4</a></td></tr>\n<tr class=\"memdesc:ga73ea0c1ba31580e107d21270883f51fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga73ea0c1ba31580e107d21270883f51fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6b797eec76fa471e300158f3453b3b2e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6b797eec76fa471e300158f3453b3b2e\"></a>\ntypedef vec&lt; 1, float, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6b797eec76fa471e300158f3453b3b2e\">aligned_mediump_vec1</a></td></tr>\n<tr class=\"memdesc:ga6b797eec76fa471e300158f3453b3b2e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga6b797eec76fa471e300158f3453b3b2e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga026a55ddbf2bafb1432f1157a2708616\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga026a55ddbf2bafb1432f1157a2708616\"></a>\ntypedef vec&lt; 2, float, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga026a55ddbf2bafb1432f1157a2708616\">aligned_mediump_vec2</a></td></tr>\n<tr class=\"memdesc:ga026a55ddbf2bafb1432f1157a2708616\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga026a55ddbf2bafb1432f1157a2708616\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3a25e494173f6a64637b08a1b50a2132\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3a25e494173f6a64637b08a1b50a2132\"></a>\ntypedef vec&lt; 3, float, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3a25e494173f6a64637b08a1b50a2132\">aligned_mediump_vec3</a></td></tr>\n<tr class=\"memdesc:ga3a25e494173f6a64637b08a1b50a2132\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga3a25e494173f6a64637b08a1b50a2132\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga320d1c661cff2ef214eb50241f2928b2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga320d1c661cff2ef214eb50241f2928b2\"></a>\ntypedef vec&lt; 4, float, aligned_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga320d1c661cff2ef214eb50241f2928b2\">aligned_mediump_vec4</a></td></tr>\n<tr class=\"memdesc:ga320d1c661cff2ef214eb50241f2928b2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga320d1c661cff2ef214eb50241f2928b2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ff8ed402c93d280ff0597c1c5e7c548\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1ff8ed402c93d280ff0597c1c5e7c548\"></a>\ntypedef aligned_highp_uvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">aligned_uvec1</a></td></tr>\n<tr class=\"memdesc:ga1ff8ed402c93d280ff0597c1c5e7c548\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga1ff8ed402c93d280ff0597c1c5e7c548\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga074137e3be58528d67041c223d49f398\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga074137e3be58528d67041c223d49f398\"></a>\ntypedef aligned_highp_uvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">aligned_uvec2</a></td></tr>\n<tr class=\"memdesc:ga074137e3be58528d67041c223d49f398\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga074137e3be58528d67041c223d49f398\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a8d9c3046f89d854eb758adfa0811c0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga2a8d9c3046f89d854eb758adfa0811c0\"></a>\ntypedef aligned_highp_uvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">aligned_uvec3</a></td></tr>\n<tr class=\"memdesc:ga2a8d9c3046f89d854eb758adfa0811c0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga2a8d9c3046f89d854eb758adfa0811c0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabf842c45eea186170c267a328e3f3b7d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabf842c45eea186170c267a328e3f3b7d\"></a>\ntypedef aligned_highp_uvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">aligned_uvec4</a></td></tr>\n<tr class=\"memdesc:gabf842c45eea186170c267a328e3f3b7d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gabf842c45eea186170c267a328e3f3b7d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga05e6d4c908965d04191c2070a8d0a65e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga05e6d4c908965d04191c2070a8d0a65e\"></a>\ntypedef aligned_highp_vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">aligned_vec1</a></td></tr>\n<tr class=\"memdesc:ga05e6d4c908965d04191c2070a8d0a65e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector aligned in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga05e6d4c908965d04191c2070a8d0a65e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0682462f8096a226773e20fac993cde5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0682462f8096a226773e20fac993cde5\"></a>\ntypedef aligned_highp_vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">aligned_vec2</a></td></tr>\n<tr class=\"memdesc:ga0682462f8096a226773e20fac993cde5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector aligned in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga0682462f8096a226773e20fac993cde5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7cf643b66664e0cd3c48759ae66c2bd0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7cf643b66664e0cd3c48759ae66c2bd0\"></a>\ntypedef aligned_highp_vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">aligned_vec3</a></td></tr>\n<tr class=\"memdesc:ga7cf643b66664e0cd3c48759ae66c2bd0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector aligned in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga7cf643b66664e0cd3c48759ae66c2bd0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85d89e83cb8137e1be1446de8c3b643a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga85d89e83cb8137e1be1446de8c3b643a\"></a>\ntypedef aligned_highp_vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">aligned_vec4</a></td></tr>\n<tr class=\"memdesc:ga85d89e83cb8137e1be1446de8c3b643a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector aligned in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga85d89e83cb8137e1be1446de8c3b643a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga88632cea9008ac0ac1388e94e804a53c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga88632cea9008ac0ac1388e94e804a53c\"></a>\ntypedef packed_highp_bvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga88632cea9008ac0ac1388e94e804a53c\">packed_bvec1</a></td></tr>\n<tr class=\"memdesc:ga88632cea9008ac0ac1388e94e804a53c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga88632cea9008ac0ac1388e94e804a53c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab85245913eaa40ab82adabcae37086cb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab85245913eaa40ab82adabcae37086cb\"></a>\ntypedef packed_highp_bvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab85245913eaa40ab82adabcae37086cb\">packed_bvec2</a></td></tr>\n<tr class=\"memdesc:gab85245913eaa40ab82adabcae37086cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gab85245913eaa40ab82adabcae37086cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c48f9417f649e27f3fb0c9f733a18bd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0c48f9417f649e27f3fb0c9f733a18bd\"></a>\ntypedef packed_highp_bvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0c48f9417f649e27f3fb0c9f733a18bd\">packed_bvec3</a></td></tr>\n<tr class=\"memdesc:ga0c48f9417f649e27f3fb0c9f733a18bd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga0c48f9417f649e27f3fb0c9f733a18bd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3180d7db84a74c402157df3bbc0ae3ed\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3180d7db84a74c402157df3bbc0ae3ed\"></a>\ntypedef packed_highp_bvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3180d7db84a74c402157df3bbc0ae3ed\">packed_bvec4</a></td></tr>\n<tr class=\"memdesc:ga3180d7db84a74c402157df3bbc0ae3ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga3180d7db84a74c402157df3bbc0ae3ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga532f0c940649b1ee303acd572fc35531\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga532f0c940649b1ee303acd572fc35531\"></a>\ntypedef packed_highp_dvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga532f0c940649b1ee303acd572fc35531\">packed_dvec1</a></td></tr>\n<tr class=\"memdesc:ga532f0c940649b1ee303acd572fc35531\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga532f0c940649b1ee303acd572fc35531\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5c194b11fbda636f2ab20c3bd0079196\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5c194b11fbda636f2ab20c3bd0079196\"></a>\ntypedef packed_highp_dvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5c194b11fbda636f2ab20c3bd0079196\">packed_dvec2</a></td></tr>\n<tr class=\"memdesc:ga5c194b11fbda636f2ab20c3bd0079196\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga5c194b11fbda636f2ab20c3bd0079196\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0581ea552d86b2b5de7a2804bed80e72\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0581ea552d86b2b5de7a2804bed80e72\"></a>\ntypedef packed_highp_dvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0581ea552d86b2b5de7a2804bed80e72\">packed_dvec3</a></td></tr>\n<tr class=\"memdesc:ga0581ea552d86b2b5de7a2804bed80e72\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga0581ea552d86b2b5de7a2804bed80e72\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8a9b181f9dc813ad6e125a52b14b935\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae8a9b181f9dc813ad6e125a52b14b935\"></a>\ntypedef packed_highp_dvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae8a9b181f9dc813ad6e125a52b14b935\">packed_dvec4</a></td></tr>\n<tr class=\"memdesc:gae8a9b181f9dc813ad6e125a52b14b935\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of double-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:gae8a9b181f9dc813ad6e125a52b14b935\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga439e97795314b81cd15abd4e5c2e6e7a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga439e97795314b81cd15abd4e5c2e6e7a\"></a>\ntypedef vec&lt; 1, bool, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga439e97795314b81cd15abd4e5c2e6e7a\">packed_highp_bvec1</a></td></tr>\n<tr class=\"memdesc:ga439e97795314b81cd15abd4e5c2e6e7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga439e97795314b81cd15abd4e5c2e6e7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad791d671f4fcf1ed1ea41f752916b70a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad791d671f4fcf1ed1ea41f752916b70a\"></a>\ntypedef vec&lt; 2, bool, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad791d671f4fcf1ed1ea41f752916b70a\">packed_highp_bvec2</a></td></tr>\n<tr class=\"memdesc:gad791d671f4fcf1ed1ea41f752916b70a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gad791d671f4fcf1ed1ea41f752916b70a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6a5a3250b57dfadc66735bc72911437f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6a5a3250b57dfadc66735bc72911437f\"></a>\ntypedef vec&lt; 3, bool, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6a5a3250b57dfadc66735bc72911437f\">packed_highp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga6a5a3250b57dfadc66735bc72911437f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga6a5a3250b57dfadc66735bc72911437f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09f517d88b996ef1b2f42fd54222b82d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga09f517d88b996ef1b2f42fd54222b82d\"></a>\ntypedef vec&lt; 4, bool, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga09f517d88b996ef1b2f42fd54222b82d\">packed_highp_bvec4</a></td></tr>\n<tr class=\"memdesc:ga09f517d88b996ef1b2f42fd54222b82d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga09f517d88b996ef1b2f42fd54222b82d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab472b2d917b5e6efd76e8c7dbfbbf9f1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab472b2d917b5e6efd76e8c7dbfbbf9f1\"></a>\ntypedef vec&lt; 1, double, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab472b2d917b5e6efd76e8c7dbfbbf9f1\">packed_highp_dvec1</a></td></tr>\n<tr class=\"memdesc:gab472b2d917b5e6efd76e8c7dbfbbf9f1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab472b2d917b5e6efd76e8c7dbfbbf9f1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5b2dc48fa19b684d207d69c6b145eb63\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5b2dc48fa19b684d207d69c6b145eb63\"></a>\ntypedef vec&lt; 2, double, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5b2dc48fa19b684d207d69c6b145eb63\">packed_highp_dvec2</a></td></tr>\n<tr class=\"memdesc:ga5b2dc48fa19b684d207d69c6b145eb63\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga5b2dc48fa19b684d207d69c6b145eb63\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaac6b356ef00154da41aaae7d1549193\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaaac6b356ef00154da41aaae7d1549193\"></a>\ntypedef vec&lt; 3, double, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaaac6b356ef00154da41aaae7d1549193\">packed_highp_dvec3</a></td></tr>\n<tr class=\"memdesc:gaaac6b356ef00154da41aaae7d1549193\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gaaac6b356ef00154da41aaae7d1549193\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga81b5368fe485e2630aa9b44832d592e7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga81b5368fe485e2630aa9b44832d592e7\"></a>\ntypedef vec&lt; 4, double, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga81b5368fe485e2630aa9b44832d592e7\">packed_highp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga81b5368fe485e2630aa9b44832d592e7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga81b5368fe485e2630aa9b44832d592e7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7245acc887a5438f46fd85fdf076bb3b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7245acc887a5438f46fd85fdf076bb3b\"></a>\ntypedef vec&lt; 1, int, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7245acc887a5438f46fd85fdf076bb3b\">packed_highp_ivec1</a></td></tr>\n<tr class=\"memdesc:ga7245acc887a5438f46fd85fdf076bb3b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga7245acc887a5438f46fd85fdf076bb3b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga54f368ec6b514a5aa4f28d40e6f93ef7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga54f368ec6b514a5aa4f28d40e6f93ef7\"></a>\ntypedef vec&lt; 2, int, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga54f368ec6b514a5aa4f28d40e6f93ef7\">packed_highp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga54f368ec6b514a5aa4f28d40e6f93ef7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga54f368ec6b514a5aa4f28d40e6f93ef7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga865a9c7bb22434b1b8c5ac31e164b628\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga865a9c7bb22434b1b8c5ac31e164b628\"></a>\ntypedef vec&lt; 3, int, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga865a9c7bb22434b1b8c5ac31e164b628\">packed_highp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga865a9c7bb22434b1b8c5ac31e164b628\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga865a9c7bb22434b1b8c5ac31e164b628\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad6f1b4e3a51c2c051814b60d5d1b8895\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad6f1b4e3a51c2c051814b60d5d1b8895\"></a>\ntypedef vec&lt; 4, int, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gad6f1b4e3a51c2c051814b60d5d1b8895\">packed_highp_ivec4</a></td></tr>\n<tr class=\"memdesc:gad6f1b4e3a51c2c051814b60d5d1b8895\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gad6f1b4e3a51c2c051814b60d5d1b8895\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8c32b53f628a3616aa5061e58d66fe74\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8c32b53f628a3616aa5061e58d66fe74\"></a>\ntypedef vec&lt; 1, uint, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8c32b53f628a3616aa5061e58d66fe74\">packed_highp_uvec1</a></td></tr>\n<tr class=\"memdesc:ga8c32b53f628a3616aa5061e58d66fe74\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga8c32b53f628a3616aa5061e58d66fe74\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab704d4fb15f6f96d70e363d5db7060cd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab704d4fb15f6f96d70e363d5db7060cd\"></a>\ntypedef vec&lt; 2, uint, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab704d4fb15f6f96d70e363d5db7060cd\">packed_highp_uvec2</a></td></tr>\n<tr class=\"memdesc:gab704d4fb15f6f96d70e363d5db7060cd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gab704d4fb15f6f96d70e363d5db7060cd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0b570da473fec4619db5aa0dce5133b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0b570da473fec4619db5aa0dce5133b0\"></a>\ntypedef vec&lt; 3, uint, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0b570da473fec4619db5aa0dce5133b0\">packed_highp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga0b570da473fec4619db5aa0dce5133b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga0b570da473fec4619db5aa0dce5133b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa582f38c82aef61dea7aaedf15bb06a6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa582f38c82aef61dea7aaedf15bb06a6\"></a>\ntypedef vec&lt; 4, uint, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaa582f38c82aef61dea7aaedf15bb06a6\">packed_highp_uvec4</a></td></tr>\n<tr class=\"memdesc:gaa582f38c82aef61dea7aaedf15bb06a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gaa582f38c82aef61dea7aaedf15bb06a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga56473759d2702ee19ab7f91d0017fa70\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga56473759d2702ee19ab7f91d0017fa70\"></a>\ntypedef vec&lt; 1, float, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga56473759d2702ee19ab7f91d0017fa70\">packed_highp_vec1</a></td></tr>\n<tr class=\"memdesc:ga56473759d2702ee19ab7f91d0017fa70\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga56473759d2702ee19ab7f91d0017fa70\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6b8b9475e7c3b16aed13edbc460bbc4d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6b8b9475e7c3b16aed13edbc460bbc4d\"></a>\ntypedef vec&lt; 2, float, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6b8b9475e7c3b16aed13edbc460bbc4d\">packed_highp_vec2</a></td></tr>\n<tr class=\"memdesc:ga6b8b9475e7c3b16aed13edbc460bbc4d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga6b8b9475e7c3b16aed13edbc460bbc4d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3815661df0e2de79beff8168c09adf1e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3815661df0e2de79beff8168c09adf1e\"></a>\ntypedef vec&lt; 3, float, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3815661df0e2de79beff8168c09adf1e\">packed_highp_vec3</a></td></tr>\n<tr class=\"memdesc:ga3815661df0e2de79beff8168c09adf1e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga3815661df0e2de79beff8168c09adf1e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4015f36bf5a5adb6ac5d45beed959867\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4015f36bf5a5adb6ac5d45beed959867\"></a>\ntypedef vec&lt; 4, float, packed_highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga4015f36bf5a5adb6ac5d45beed959867\">packed_highp_vec4</a></td></tr>\n<tr class=\"memdesc:ga4015f36bf5a5adb6ac5d45beed959867\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga4015f36bf5a5adb6ac5d45beed959867\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga11581a06fc7bf941fa4d4b6aca29812c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga11581a06fc7bf941fa4d4b6aca29812c\"></a>\ntypedef packed_highp_ivec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga11581a06fc7bf941fa4d4b6aca29812c\">packed_ivec1</a></td></tr>\n<tr class=\"memdesc:ga11581a06fc7bf941fa4d4b6aca29812c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga11581a06fc7bf941fa4d4b6aca29812c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fe4c5f56b8087d773aa90dc88a257a7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1fe4c5f56b8087d773aa90dc88a257a7\"></a>\ntypedef packed_highp_ivec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1fe4c5f56b8087d773aa90dc88a257a7\">packed_ivec2</a></td></tr>\n<tr class=\"memdesc:ga1fe4c5f56b8087d773aa90dc88a257a7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga1fe4c5f56b8087d773aa90dc88a257a7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae157682a7847161787951ba1db4cf325\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae157682a7847161787951ba1db4cf325\"></a>\ntypedef packed_highp_ivec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae157682a7847161787951ba1db4cf325\">packed_ivec3</a></td></tr>\n<tr class=\"memdesc:gae157682a7847161787951ba1db4cf325\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gae157682a7847161787951ba1db4cf325\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac228b70372abd561340d5f926a7c1778\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac228b70372abd561340d5f926a7c1778\"></a>\ntypedef packed_highp_ivec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gac228b70372abd561340d5f926a7c1778\">packed_ivec4</a></td></tr>\n<tr class=\"memdesc:gac228b70372abd561340d5f926a7c1778\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gac228b70372abd561340d5f926a7c1778\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3c8750f53259ece334d3aa3b3649a40\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae3c8750f53259ece334d3aa3b3649a40\"></a>\ntypedef vec&lt; 1, bool, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae3c8750f53259ece334d3aa3b3649a40\">packed_lowp_bvec1</a></td></tr>\n<tr class=\"memdesc:gae3c8750f53259ece334d3aa3b3649a40\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae3c8750f53259ece334d3aa3b3649a40\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac969befedbda69eb78d4e23f751fdbee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac969befedbda69eb78d4e23f751fdbee\"></a>\ntypedef vec&lt; 2, bool, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gac969befedbda69eb78d4e23f751fdbee\">packed_lowp_bvec2</a></td></tr>\n<tr class=\"memdesc:gac969befedbda69eb78d4e23f751fdbee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gac969befedbda69eb78d4e23f751fdbee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7c20adbe1409e3fe4544677a7f6fe954\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7c20adbe1409e3fe4544677a7f6fe954\"></a>\ntypedef vec&lt; 3, bool, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7c20adbe1409e3fe4544677a7f6fe954\">packed_lowp_bvec3</a></td></tr>\n<tr class=\"memdesc:ga7c20adbe1409e3fe4544677a7f6fe954\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga7c20adbe1409e3fe4544677a7f6fe954\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae473587cff3092edc0877fc691c26a0b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae473587cff3092edc0877fc691c26a0b\"></a>\ntypedef vec&lt; 4, bool, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gae473587cff3092edc0877fc691c26a0b\">packed_lowp_bvec4</a></td></tr>\n<tr class=\"memdesc:gae473587cff3092edc0877fc691c26a0b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gae473587cff3092edc0877fc691c26a0b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga054050e9d4e78d81db0e6d1573b1c624\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga054050e9d4e78d81db0e6d1573b1c624\"></a>\ntypedef vec&lt; 1, double, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga054050e9d4e78d81db0e6d1573b1c624\">packed_lowp_dvec1</a></td></tr>\n<tr class=\"memdesc:ga054050e9d4e78d81db0e6d1573b1c624\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga054050e9d4e78d81db0e6d1573b1c624\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadc19938ddb204bfcb4d9ef35b1e2bf93\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gadc19938ddb204bfcb4d9ef35b1e2bf93\"></a>\ntypedef vec&lt; 2, double, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gadc19938ddb204bfcb4d9ef35b1e2bf93\">packed_lowp_dvec2</a></td></tr>\n<tr class=\"memdesc:gadc19938ddb204bfcb4d9ef35b1e2bf93\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gadc19938ddb204bfcb4d9ef35b1e2bf93\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9189210cabd6651a5e14a4c46fb20598\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9189210cabd6651a5e14a4c46fb20598\"></a>\ntypedef vec&lt; 3, double, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga9189210cabd6651a5e14a4c46fb20598\">packed_lowp_dvec3</a></td></tr>\n<tr class=\"memdesc:ga9189210cabd6651a5e14a4c46fb20598\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga9189210cabd6651a5e14a4c46fb20598\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga262dafd0c001c3a38d1cc91d024ca738\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga262dafd0c001c3a38d1cc91d024ca738\"></a>\ntypedef vec&lt; 4, double, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga262dafd0c001c3a38d1cc91d024ca738\">packed_lowp_dvec4</a></td></tr>\n<tr class=\"memdesc:ga262dafd0c001c3a38d1cc91d024ca738\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga262dafd0c001c3a38d1cc91d024ca738\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf22b77f1cf3e73b8b1dddfe7f959357c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf22b77f1cf3e73b8b1dddfe7f959357c\"></a>\ntypedef vec&lt; 1, int, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaf22b77f1cf3e73b8b1dddfe7f959357c\">packed_lowp_ivec1</a></td></tr>\n<tr class=\"memdesc:gaf22b77f1cf3e73b8b1dddfe7f959357c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gaf22b77f1cf3e73b8b1dddfe7f959357c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52635859f5ef660ab999d22c11b7867f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga52635859f5ef660ab999d22c11b7867f\"></a>\ntypedef vec&lt; 2, int, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga52635859f5ef660ab999d22c11b7867f\">packed_lowp_ivec2</a></td></tr>\n<tr class=\"memdesc:ga52635859f5ef660ab999d22c11b7867f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga52635859f5ef660ab999d22c11b7867f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98c9d122a959e9f3ce10a5623c310f5d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga98c9d122a959e9f3ce10a5623c310f5d\"></a>\ntypedef vec&lt; 3, int, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga98c9d122a959e9f3ce10a5623c310f5d\">packed_lowp_ivec3</a></td></tr>\n<tr class=\"memdesc:ga98c9d122a959e9f3ce10a5623c310f5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga98c9d122a959e9f3ce10a5623c310f5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga931731b8ae3b54c7ecc221509dae96bc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga931731b8ae3b54c7ecc221509dae96bc\"></a>\ntypedef vec&lt; 4, int, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga931731b8ae3b54c7ecc221509dae96bc\">packed_lowp_ivec4</a></td></tr>\n<tr class=\"memdesc:ga931731b8ae3b54c7ecc221509dae96bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga931731b8ae3b54c7ecc221509dae96bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf111fed760ecce16cb1988807569bee5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf111fed760ecce16cb1988807569bee5\"></a>\ntypedef vec&lt; 1, uint, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaf111fed760ecce16cb1988807569bee5\">packed_lowp_uvec1</a></td></tr>\n<tr class=\"memdesc:gaf111fed760ecce16cb1988807569bee5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gaf111fed760ecce16cb1988807569bee5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga958210fe245a75b058325d367c951132\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga958210fe245a75b058325d367c951132\"></a>\ntypedef vec&lt; 2, uint, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga958210fe245a75b058325d367c951132\">packed_lowp_uvec2</a></td></tr>\n<tr class=\"memdesc:ga958210fe245a75b058325d367c951132\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga958210fe245a75b058325d367c951132\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga576a3f8372197a56a79dee1c8280f485\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga576a3f8372197a56a79dee1c8280f485\"></a>\ntypedef vec&lt; 3, uint, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga576a3f8372197a56a79dee1c8280f485\">packed_lowp_uvec3</a></td></tr>\n<tr class=\"memdesc:ga576a3f8372197a56a79dee1c8280f485\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga576a3f8372197a56a79dee1c8280f485\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafdd97922b4a2a42cd0c99a13877ff4da\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafdd97922b4a2a42cd0c99a13877ff4da\"></a>\ntypedef vec&lt; 4, uint, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gafdd97922b4a2a42cd0c99a13877ff4da\">packed_lowp_uvec4</a></td></tr>\n<tr class=\"memdesc:gafdd97922b4a2a42cd0c99a13877ff4da\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gafdd97922b4a2a42cd0c99a13877ff4da\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0a6198fe64166a6a61084d43c71518a9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0a6198fe64166a6a61084d43c71518a9\"></a>\ntypedef vec&lt; 1, float, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0a6198fe64166a6a61084d43c71518a9\">packed_lowp_vec1</a></td></tr>\n<tr class=\"memdesc:ga0a6198fe64166a6a61084d43c71518a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga0a6198fe64166a6a61084d43c71518a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafbf1c2cce307c5594b165819ed83bf5d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafbf1c2cce307c5594b165819ed83bf5d\"></a>\ntypedef vec&lt; 2, float, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gafbf1c2cce307c5594b165819ed83bf5d\">packed_lowp_vec2</a></td></tr>\n<tr class=\"memdesc:gafbf1c2cce307c5594b165819ed83bf5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gafbf1c2cce307c5594b165819ed83bf5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3a30c137c1f8cce478c28eab0427a570\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3a30c137c1f8cce478c28eab0427a570\"></a>\ntypedef vec&lt; 3, float, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3a30c137c1f8cce478c28eab0427a570\">packed_lowp_vec3</a></td></tr>\n<tr class=\"memdesc:ga3a30c137c1f8cce478c28eab0427a570\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga3a30c137c1f8cce478c28eab0427a570\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3cc94fb8de80bbd8a4aa7a5b206d304a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3cc94fb8de80bbd8a4aa7a5b206d304a\"></a>\ntypedef vec&lt; 4, float, packed_lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3cc94fb8de80bbd8a4aa7a5b206d304a\">packed_lowp_vec4</a></td></tr>\n<tr class=\"memdesc:ga3cc94fb8de80bbd8a4aa7a5b206d304a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga3cc94fb8de80bbd8a4aa7a5b206d304a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5546d828d63010a8f9cf81161ad0275a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5546d828d63010a8f9cf81161ad0275a\"></a>\ntypedef vec&lt; 1, bool, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5546d828d63010a8f9cf81161ad0275a\">packed_mediump_bvec1</a></td></tr>\n<tr class=\"memdesc:ga5546d828d63010a8f9cf81161ad0275a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga5546d828d63010a8f9cf81161ad0275a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab4c6414a59539e66a242ad4cf4b476b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab4c6414a59539e66a242ad4cf4b476b4\"></a>\ntypedef vec&lt; 2, bool, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab4c6414a59539e66a242ad4cf4b476b4\">packed_mediump_bvec2</a></td></tr>\n<tr class=\"memdesc:gab4c6414a59539e66a242ad4cf4b476b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:gab4c6414a59539e66a242ad4cf4b476b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70147763edff3fe96b03a0b98d6339a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga70147763edff3fe96b03a0b98d6339a2\"></a>\ntypedef vec&lt; 3, bool, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga70147763edff3fe96b03a0b98d6339a2\">packed_mediump_bvec3</a></td></tr>\n<tr class=\"memdesc:ga70147763edff3fe96b03a0b98d6339a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga70147763edff3fe96b03a0b98d6339a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b1620f259595b9da47a6374fc44588a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7b1620f259595b9da47a6374fc44588a\"></a>\ntypedef vec&lt; 4, bool, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga7b1620f259595b9da47a6374fc44588a\">packed_mediump_bvec4</a></td></tr>\n<tr class=\"memdesc:ga7b1620f259595b9da47a6374fc44588a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of bool values. <br /></td></tr>\n<tr class=\"separator:ga7b1620f259595b9da47a6374fc44588a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8920e90ea9c01d9c97e604a938ce2cbd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8920e90ea9c01d9c97e604a938ce2cbd\"></a>\ntypedef vec&lt; 1, double, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8920e90ea9c01d9c97e604a938ce2cbd\">packed_mediump_dvec1</a></td></tr>\n<tr class=\"memdesc:ga8920e90ea9c01d9c97e604a938ce2cbd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga8920e90ea9c01d9c97e604a938ce2cbd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c754a783b6fcf80374c013371c4dae9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0c754a783b6fcf80374c013371c4dae9\"></a>\ntypedef vec&lt; 2, double, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga0c754a783b6fcf80374c013371c4dae9\">packed_mediump_dvec2</a></td></tr>\n<tr class=\"memdesc:ga0c754a783b6fcf80374c013371c4dae9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga0c754a783b6fcf80374c013371c4dae9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f18ada6f7cdd8c46db33ba987280fc4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1f18ada6f7cdd8c46db33ba987280fc4\"></a>\ntypedef vec&lt; 3, double, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1f18ada6f7cdd8c46db33ba987280fc4\">packed_mediump_dvec3</a></td></tr>\n<tr class=\"memdesc:ga1f18ada6f7cdd8c46db33ba987280fc4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga1f18ada6f7cdd8c46db33ba987280fc4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga568b850f1116b667043533cf77826968\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga568b850f1116b667043533cf77826968\"></a>\ntypedef vec&lt; 4, double, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga568b850f1116b667043533cf77826968\">packed_mediump_dvec4</a></td></tr>\n<tr class=\"memdesc:ga568b850f1116b667043533cf77826968\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga568b850f1116b667043533cf77826968\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09507ef020a49517a7bcd50438f05056\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga09507ef020a49517a7bcd50438f05056\"></a>\ntypedef vec&lt; 1, int, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga09507ef020a49517a7bcd50438f05056\">packed_mediump_ivec1</a></td></tr>\n<tr class=\"memdesc:ga09507ef020a49517a7bcd50438f05056\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga09507ef020a49517a7bcd50438f05056\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaa891048dddef4627df33809ec726219\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaaa891048dddef4627df33809ec726219\"></a>\ntypedef vec&lt; 2, int, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaaa891048dddef4627df33809ec726219\">packed_mediump_ivec2</a></td></tr>\n<tr class=\"memdesc:gaaa891048dddef4627df33809ec726219\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:gaaa891048dddef4627df33809ec726219\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga06f26d54dca30994eb1fdadb8e69f4a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga06f26d54dca30994eb1fdadb8e69f4a2\"></a>\ntypedef vec&lt; 3, int, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga06f26d54dca30994eb1fdadb8e69f4a2\">packed_mediump_ivec3</a></td></tr>\n<tr class=\"memdesc:ga06f26d54dca30994eb1fdadb8e69f4a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga06f26d54dca30994eb1fdadb8e69f4a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70130dc8ed9c966ec2a221ce586d45d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga70130dc8ed9c966ec2a221ce586d45d8\"></a>\ntypedef vec&lt; 4, int, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga70130dc8ed9c966ec2a221ce586d45d8\">packed_mediump_ivec4</a></td></tr>\n<tr class=\"memdesc:ga70130dc8ed9c966ec2a221ce586d45d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of signed integer numbers. <br /></td></tr>\n<tr class=\"separator:ga70130dc8ed9c966ec2a221ce586d45d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c29fb42bab9a4f9b66bc60b2e514a34\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga2c29fb42bab9a4f9b66bc60b2e514a34\"></a>\ntypedef vec&lt; 1, uint, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga2c29fb42bab9a4f9b66bc60b2e514a34\">packed_mediump_uvec1</a></td></tr>\n<tr class=\"memdesc:ga2c29fb42bab9a4f9b66bc60b2e514a34\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga2c29fb42bab9a4f9b66bc60b2e514a34\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa1f95690a78dc12e39da32943243aeef\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa1f95690a78dc12e39da32943243aeef\"></a>\ntypedef vec&lt; 2, uint, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaa1f95690a78dc12e39da32943243aeef\">packed_mediump_uvec2</a></td></tr>\n<tr class=\"memdesc:gaa1f95690a78dc12e39da32943243aeef\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gaa1f95690a78dc12e39da32943243aeef\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ea2bbdbcb0a69242f6d884663c1b0ab\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga1ea2bbdbcb0a69242f6d884663c1b0ab\"></a>\ntypedef vec&lt; 3, uint, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga1ea2bbdbcb0a69242f6d884663c1b0ab\">packed_mediump_uvec3</a></td></tr>\n<tr class=\"memdesc:ga1ea2bbdbcb0a69242f6d884663c1b0ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga1ea2bbdbcb0a69242f6d884663c1b0ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga63a73be86a4f07ea7a7499ab0bfebe45\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga63a73be86a4f07ea7a7499ab0bfebe45\"></a>\ntypedef vec&lt; 4, uint, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga63a73be86a4f07ea7a7499ab0bfebe45\">packed_mediump_uvec4</a></td></tr>\n<tr class=\"memdesc:ga63a73be86a4f07ea7a7499ab0bfebe45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga63a73be86a4f07ea7a7499ab0bfebe45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga71d63cead1e113fca0bcdaaa33aad050\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga71d63cead1e113fca0bcdaaa33aad050\"></a>\ntypedef vec&lt; 1, float, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga71d63cead1e113fca0bcdaaa33aad050\">packed_mediump_vec1</a></td></tr>\n<tr class=\"memdesc:ga71d63cead1e113fca0bcdaaa33aad050\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga71d63cead1e113fca0bcdaaa33aad050\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6844c6f4691d1bf67673240850430948\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6844c6f4691d1bf67673240850430948\"></a>\ntypedef vec&lt; 2, float, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga6844c6f4691d1bf67673240850430948\">packed_mediump_vec2</a></td></tr>\n<tr class=\"memdesc:ga6844c6f4691d1bf67673240850430948\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga6844c6f4691d1bf67673240850430948\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab0eb771b708c5b2205d9b14dd1434fd8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab0eb771b708c5b2205d9b14dd1434fd8\"></a>\ntypedef vec&lt; 3, float, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab0eb771b708c5b2205d9b14dd1434fd8\">packed_mediump_vec3</a></td></tr>\n<tr class=\"memdesc:gab0eb771b708c5b2205d9b14dd1434fd8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:gab0eb771b708c5b2205d9b14dd1434fd8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga68c9bb24f387b312bae6a0a68e74d95e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga68c9bb24f387b312bae6a0a68e74d95e\"></a>\ntypedef vec&lt; 4, float, packed_mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga68c9bb24f387b312bae6a0a68e74d95e\">packed_mediump_vec4</a></td></tr>\n<tr class=\"memdesc:ga68c9bb24f387b312bae6a0a68e74d95e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs. <br /></td></tr>\n<tr class=\"separator:ga68c9bb24f387b312bae6a0a68e74d95e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5621493caac01bdd22ab6be4416b0314\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5621493caac01bdd22ab6be4416b0314\"></a>\ntypedef packed_highp_uvec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga5621493caac01bdd22ab6be4416b0314\">packed_uvec1</a></td></tr>\n<tr class=\"memdesc:ga5621493caac01bdd22ab6be4416b0314\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga5621493caac01bdd22ab6be4416b0314\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabcc33efb4d5e83b8fe4706360e75b932\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabcc33efb4d5e83b8fe4706360e75b932\"></a>\ntypedef packed_highp_uvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gabcc33efb4d5e83b8fe4706360e75b932\">packed_uvec2</a></td></tr>\n<tr class=\"memdesc:gabcc33efb4d5e83b8fe4706360e75b932\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gabcc33efb4d5e83b8fe4706360e75b932\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab96804e99e3a72a35740fec690c79617\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gab96804e99e3a72a35740fec690c79617\"></a>\ntypedef packed_highp_uvec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gab96804e99e3a72a35740fec690c79617\">packed_uvec3</a></td></tr>\n<tr class=\"memdesc:gab96804e99e3a72a35740fec690c79617\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:gab96804e99e3a72a35740fec690c79617\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"></a>\ntypedef packed_highp_uvec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga8e5d92e84ebdbe2480cf96bc17d6e2f2\">packed_uvec4</a></td></tr>\n<tr class=\"memdesc:ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of unsigned integer numbers. <br /></td></tr>\n<tr class=\"separator:ga8e5d92e84ebdbe2480cf96bc17d6e2f2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga14741e3d9da9ae83765389927f837331\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga14741e3d9da9ae83765389927f837331\"></a>\ntypedef packed_highp_vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga14741e3d9da9ae83765389927f837331\">packed_vec1</a></td></tr>\n<tr class=\"memdesc:ga14741e3d9da9ae83765389927f837331\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1 component vector tightly packed in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga14741e3d9da9ae83765389927f837331\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3254defa5a8f0ae4b02b45fedba84a66\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3254defa5a8f0ae4b02b45fedba84a66\"></a>\ntypedef packed_highp_vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66\">packed_vec2</a></td></tr>\n<tr class=\"memdesc:ga3254defa5a8f0ae4b02b45fedba84a66\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2 components vector tightly packed in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga3254defa5a8f0ae4b02b45fedba84a66\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaccccd090e185450caa28b5b63ad4e8f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaccccd090e185450caa28b5b63ad4e8f0\"></a>\ntypedef packed_highp_vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#gaccccd090e185450caa28b5b63ad4e8f0\">packed_vec3</a></td></tr>\n<tr class=\"memdesc:gaccccd090e185450caa28b5b63ad4e8f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">3 components vector tightly packed in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:gaccccd090e185450caa28b5b63ad4e8f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga37a0e0bf653169b581c5eea3d547fa5d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga37a0e0bf653169b581c5eea3d547fa5d\"></a>\ntypedef packed_highp_vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d\">packed_vec4</a></td></tr>\n<tr class=\"memdesc:ga37a0e0bf653169b581c5eea3d547fa5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">4 components vector tightly packed in memory of single-precision floating-point numbers. <br /></td></tr>\n<tr class=\"separator:ga37a0e0bf653169b581c5eea3d547fa5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00101.html\" title=\"GLM_GTC_type_aligned \">glm/gtc/type_aligned.hpp</a>&gt; to use the features of this extension. </p>\n<p>Aligned types allowing SIMD optimizations of vectors and matrices types </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00165.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_type_precision</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_type_precision<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00117.html\" title=\"GLM_GTC_type_precision \">glm/gtc/type_precision.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float32_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">f32</a></td></tr>\n<tr class=\"memdesc:gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 32 bit single-qualifier floating-point scalar.  <a href=\"a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\">More...</a><br /></td></tr>\n<tr class=\"separator:gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab12383ed6ac7595ed6fde4d266c58425\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">f32mat2</a></td></tr>\n<tr class=\"memdesc:gab12383ed6ac7595ed6fde4d266c58425\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#gab12383ed6ac7595ed6fde4d266c58425\">More...</a><br /></td></tr>\n<tr class=\"separator:gab12383ed6ac7595ed6fde4d266c58425\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04100c76f7d55a0dd0983ccf05142bff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a></td></tr>\n<tr class=\"memdesc:ga04100c76f7d55a0dd0983ccf05142bff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04100c76f7d55a0dd0983ccf05142bff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab256cdab5eb582e426d749ae77b5b566\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">f32mat2x3</a></td></tr>\n<tr class=\"memdesc:gab256cdab5eb582e426d749ae77b5b566\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x3 matrix.  <a href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">More...</a><br /></td></tr>\n<tr class=\"separator:gab256cdab5eb582e426d749ae77b5b566\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf512b74c4400b68f9fdf9388b3d6aac8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">f32mat2x4</a></td></tr>\n<tr class=\"memdesc:gaf512b74c4400b68f9fdf9388b3d6aac8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x4 matrix.  <a href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf512b74c4400b68f9fdf9388b3d6aac8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga856f3905ee7cc2e4890a8a1d56c150be\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">f32mat3</a></td></tr>\n<tr class=\"memdesc:ga856f3905ee7cc2e4890a8a1d56c150be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be\">More...</a><br /></td></tr>\n<tr class=\"separator:ga856f3905ee7cc2e4890a8a1d56c150be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1320a08e14fdff3821241eefab6947e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">f32mat3x2</a></td></tr>\n<tr class=\"memdesc:ga1320a08e14fdff3821241eefab6947e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x2 matrix.  <a href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1320a08e14fdff3821241eefab6947e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga65261fa8a21045c8646ddff114a56174\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a></td></tr>\n<tr class=\"memdesc:ga65261fa8a21045c8646ddff114a56174\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">More...</a><br /></td></tr>\n<tr class=\"separator:ga65261fa8a21045c8646ddff114a56174\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab90ade28222f8b861d5ceaf81a3a7f5d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">f32mat3x4</a></td></tr>\n<tr class=\"memdesc:gab90ade28222f8b861d5ceaf81a3a7f5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x4 matrix.  <a href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">More...</a><br /></td></tr>\n<tr class=\"separator:gab90ade28222f8b861d5ceaf81a3a7f5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99d1b85ff99956b33da7e9992aad129a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">f32mat4</a></td></tr>\n<tr class=\"memdesc:ga99d1b85ff99956b33da7e9992aad129a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#ga99d1b85ff99956b33da7e9992aad129a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99d1b85ff99956b33da7e9992aad129a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b32ca1e57a4ef91babbc3d35a34ea20\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">f32mat4x2</a></td></tr>\n<tr class=\"memdesc:ga3b32ca1e57a4ef91babbc3d35a34ea20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x2 matrix.  <a href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b32ca1e57a4ef91babbc3d35a34ea20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga239b96198771b7add8eea7e6b59840c0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">f32mat4x3</a></td></tr>\n<tr class=\"memdesc:ga239b96198771b7add8eea7e6b59840c0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x3 matrix.  <a href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga239b96198771b7add8eea7e6b59840c0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaee4da0e9fbd8cfa2f89cb80889719dc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a></td></tr>\n<tr class=\"memdesc:gaee4da0e9fbd8cfa2f89cb80889719dc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaee4da0e9fbd8cfa2f89cb80889719dc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6966c0cb4673928c9c9da2e91006d2c0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">f32quat</a></td></tr>\n<tr class=\"memdesc:ga6966c0cb4673928c9c9da2e91006d2c0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point quaternion.  <a href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6966c0cb4673928c9c9da2e91006d2c0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga701f32ab5b3fb06996b41f5c0d643805\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">f32vec1</a></td></tr>\n<tr class=\"memdesc:ga701f32ab5b3fb06996b41f5c0d643805\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 1 components.  <a href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">More...</a><br /></td></tr>\n<tr class=\"separator:ga701f32ab5b3fb06996b41f5c0d643805\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5d6c70e080409a76a257dc55bd8ea2c8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">f32vec2</a></td></tr>\n<tr class=\"memdesc:ga5d6c70e080409a76a257dc55bd8ea2c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 2 components.  <a href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5d6c70e080409a76a257dc55bd8ea2c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaea5c4518e175162e306d2c2b5ef5ac79\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">f32vec3</a></td></tr>\n<tr class=\"memdesc:gaea5c4518e175162e306d2c2b5ef5ac79\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 3 components.  <a href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">More...</a><br /></td></tr>\n<tr class=\"separator:gaea5c4518e175162e306d2c2b5ef5ac79\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31c6ca0e074a44007f49a9a3720b18c8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">f32vec4</a></td></tr>\n<tr class=\"memdesc:ga31c6ca0e074a44007f49a9a3720b18c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 4 components.  <a href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31c6ca0e074a44007f49a9a3720b18c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1d794d240091678f602e8de225b8d8c9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float64_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">f64</a></td></tr>\n<tr class=\"memdesc:ga1d794d240091678f602e8de225b8d8c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 64 bit double-qualifier floating-point scalar.  <a href=\"a00165.html#ga1d794d240091678f602e8de225b8d8c9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1d794d240091678f602e8de225b8d8c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad9771450a54785d13080cdde0fe20c1d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f64mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">f64mat2</a></td></tr>\n<tr class=\"memdesc:gad9771450a54785d13080cdde0fe20c1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#gad9771450a54785d13080cdde0fe20c1d\">More...</a><br /></td></tr>\n<tr class=\"separator:gad9771450a54785d13080cdde0fe20c1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ec7c4c79e303c053e30729a95fb2c37\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a></td></tr>\n<tr class=\"memdesc:ga9ec7c4c79e303c053e30729a95fb2c37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9ec7c4c79e303c053e30729a95fb2c37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3ab5719fc4c1e966631dbbcba8d412a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">f64mat2x3</a></td></tr>\n<tr class=\"memdesc:gae3ab5719fc4c1e966631dbbcba8d412a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 2x3 matrix.  <a href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae3ab5719fc4c1e966631dbbcba8d412a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac87278e0c702ba8afff76316d4eeb769\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">f64mat2x4</a></td></tr>\n<tr class=\"memdesc:gac87278e0c702ba8afff76316d4eeb769\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 2x4 matrix.  <a href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">More...</a><br /></td></tr>\n<tr class=\"separator:gac87278e0c702ba8afff76316d4eeb769\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9b69181efbf8f37ae934f135137b29c0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f64mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">f64mat3</a></td></tr>\n<tr class=\"memdesc:ga9b69181efbf8f37ae934f135137b29c0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga9b69181efbf8f37ae934f135137b29c0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9b69181efbf8f37ae934f135137b29c0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2473d8bf3f4abf967c4d0e18175be6f7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">f64mat3x2</a></td></tr>\n<tr class=\"memdesc:ga2473d8bf3f4abf967c4d0e18175be6f7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 3x2 matrix.  <a href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2473d8bf3f4abf967c4d0e18175be6f7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga916c1aed91cf91f7b41399ebe7c6e185\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a></td></tr>\n<tr class=\"memdesc:ga916c1aed91cf91f7b41399ebe7c6e185\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">More...</a><br /></td></tr>\n<tr class=\"separator:ga916c1aed91cf91f7b41399ebe7c6e185\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaab239fa9e35b65a67cbaa6ac082f3675\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">f64mat3x4</a></td></tr>\n<tr class=\"memdesc:gaab239fa9e35b65a67cbaa6ac082f3675\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 3x4 matrix.  <a href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">More...</a><br /></td></tr>\n<tr class=\"separator:gaab239fa9e35b65a67cbaa6ac082f3675\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0ecd3f4952536e5ef12702b44d2626fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef f64mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">f64mat4</a></td></tr>\n<tr class=\"memdesc:ga0ecd3f4952536e5ef12702b44d2626fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0ecd3f4952536e5ef12702b44d2626fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab7daf79d6bc06a68bea1c6f5e11b5512\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">f64mat4x2</a></td></tr>\n<tr class=\"memdesc:gab7daf79d6bc06a68bea1c6f5e11b5512\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 4x2 matrix.  <a href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">More...</a><br /></td></tr>\n<tr class=\"separator:gab7daf79d6bc06a68bea1c6f5e11b5512\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e2e66ffbe341a80bc005ba2b9552110\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">f64mat4x3</a></td></tr>\n<tr class=\"memdesc:ga3e2e66ffbe341a80bc005ba2b9552110\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 4x3 matrix.  <a href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e2e66ffbe341a80bc005ba2b9552110\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae52e2b7077a9ff928a06ab5ce600b81e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a></td></tr>\n<tr class=\"memdesc:gae52e2b7077a9ff928a06ab5ce600b81e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae52e2b7077a9ff928a06ab5ce600b81e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga14c583bd625eda8cf4935a14d5dd544d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64quat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">f64quat</a></td></tr>\n<tr class=\"memdesc:ga14c583bd625eda8cf4935a14d5dd544d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point quaternion.  <a href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga14c583bd625eda8cf4935a14d5dd544d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade502df1ce14f837fae7f60a03ddb9b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">f64vec1</a></td></tr>\n<tr class=\"memdesc:gade502df1ce14f837fae7f60a03ddb9b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point vector of 1 components.  <a href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">More...</a><br /></td></tr>\n<tr class=\"separator:gade502df1ce14f837fae7f60a03ddb9b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadc4e1594f9555d919131ee02b17822a2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">f64vec2</a></td></tr>\n<tr class=\"memdesc:gadc4e1594f9555d919131ee02b17822a2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point vector of 2 components.  <a href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">More...</a><br /></td></tr>\n<tr class=\"separator:gadc4e1594f9555d919131ee02b17822a2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7a1ddca75c5f629173bf4772db7a635\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">f64vec3</a></td></tr>\n<tr class=\"memdesc:gaa7a1ddca75c5f629173bf4772db7a635\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point vector of 3 components.  <a href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7a1ddca75c5f629173bf4772db7a635\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga66e92e57260bdb910609b9a56bf83e97\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f64vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">f64vec4</a></td></tr>\n<tr class=\"memdesc:ga66e92e57260bdb910609b9a56bf83e97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default double-qualifier floating-point vector of 4 components.  <a href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">More...</a><br /></td></tr>\n<tr class=\"separator:ga66e92e57260bdb910609b9a56bf83e97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad3c127f8bf8d7d4e738037c257abb5b1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a></td></tr>\n<tr class=\"memdesc:gad3c127f8bf8d7d4e738037c257abb5b1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 32 bit single-qualifier floating-point scalar.  <a href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">More...</a><br /></td></tr>\n<tr class=\"separator:gad3c127f8bf8d7d4e738037c257abb5b1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41d579d81c3d98edd0532244fa02da77\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float32_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">float32_t</a></td></tr>\n<tr class=\"memdesc:ga41d579d81c3d98edd0532244fa02da77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 32 bit single-qualifier floating-point scalar.  <a href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41d579d81c3d98edd0532244fa02da77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab5596d48586414c91ccb270962dc14d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef double&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a></td></tr>\n<tr class=\"memdesc:gab5596d48586414c91ccb270962dc14d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 64 bit double-qualifier floating-point scalar.  <a href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">More...</a><br /></td></tr>\n<tr class=\"separator:gab5596d48586414c91ccb270962dc14d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6957c7b22f405683bb276554ca40dc37\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_float64_t&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">float64_t</a></td></tr>\n<tr class=\"memdesc:ga6957c7b22f405683bb276554ca40dc37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default 64 bit double-qualifier floating-point scalar.  <a href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6957c7b22f405683bb276554ca40dc37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4541dc2feb2a31d6ecb5a303f3dd3280\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef fmat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">fmat2</a></td></tr>\n<tr class=\"memdesc:ga4541dc2feb2a31d6ecb5a303f3dd3280\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4541dc2feb2a31d6ecb5a303f3dd3280\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3350c93c3275298f940a42875388e4b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a></td></tr>\n<tr class=\"memdesc:ga3350c93c3275298f940a42875388e4b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x2 matrix.  <a href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3350c93c3275298f940a42875388e4b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga55a2d2a8eb09b5633668257eb3cad453\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">fmat2x3</a></td></tr>\n<tr class=\"memdesc:ga55a2d2a8eb09b5633668257eb3cad453\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x3 matrix.  <a href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">More...</a><br /></td></tr>\n<tr class=\"separator:ga55a2d2a8eb09b5633668257eb3cad453\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga681381f19f11c9e5ee45cda2c56937ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat2x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">fmat2x4</a></td></tr>\n<tr class=\"memdesc:ga681381f19f11c9e5ee45cda2c56937ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 2x4 matrix.  <a href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga681381f19f11c9e5ee45cda2c56937ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga253d453c20e037730023fea0215cb6f6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef fmat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">fmat3</a></td></tr>\n<tr class=\"memdesc:ga253d453c20e037730023fea0215cb6f6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#ga253d453c20e037730023fea0215cb6f6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga253d453c20e037730023fea0215cb6f6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6af54d70d9beb0a7ef992a879e86b04f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">fmat3x2</a></td></tr>\n<tr class=\"memdesc:ga6af54d70d9beb0a7ef992a879e86b04f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x2 matrix.  <a href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6af54d70d9beb0a7ef992a879e86b04f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa07c86650253672a19dbfb898f3265b8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a></td></tr>\n<tr class=\"memdesc:gaa07c86650253672a19dbfb898f3265b8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x3 matrix.  <a href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa07c86650253672a19dbfb898f3265b8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga44e158af77a670ee1b58c03cda9e1619\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat3x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">fmat3x4</a></td></tr>\n<tr class=\"memdesc:ga44e158af77a670ee1b58c03cda9e1619\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 3x4 matrix.  <a href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">More...</a><br /></td></tr>\n<tr class=\"separator:ga44e158af77a670ee1b58c03cda9e1619\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8cb400c0f4438f2640035d7b9824a0ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef fmat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">fmat4</a></td></tr>\n<tr class=\"memdesc:ga8cb400c0f4438f2640035d7b9824a0ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8cb400c0f4438f2640035d7b9824a0ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8c8aa45aafcc23238edb1d5aeb801774\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">fmat4x2</a></td></tr>\n<tr class=\"memdesc:ga8c8aa45aafcc23238edb1d5aeb801774\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x2 matrix.  <a href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8c8aa45aafcc23238edb1d5aeb801774\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4295048a78bdf46b8a7de77ec665b497\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">fmat4x3</a></td></tr>\n<tr class=\"memdesc:ga4295048a78bdf46b8a7de77ec665b497\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x3 matrix.  <a href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4295048a78bdf46b8a7de77ec665b497\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad01cc6479bde1fd1870f13d3ed9530b3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32mat4x4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a></td></tr>\n<tr class=\"memdesc:gad01cc6479bde1fd1870f13d3ed9530b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point 4x4 matrix.  <a href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">More...</a><br /></td></tr>\n<tr class=\"separator:gad01cc6479bde1fd1870f13d3ed9530b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga98b9ed43cf8c5cf1d354b23c7df9119f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">fvec1</a></td></tr>\n<tr class=\"memdesc:ga98b9ed43cf8c5cf1d354b23c7df9119f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 1 components.  <a href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga98b9ed43cf8c5cf1d354b23c7df9119f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga24273aa02abaecaab7f160bac437a339\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">fvec2</a></td></tr>\n<tr class=\"memdesc:ga24273aa02abaecaab7f160bac437a339\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 2 components.  <a href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">More...</a><br /></td></tr>\n<tr class=\"separator:ga24273aa02abaecaab7f160bac437a339\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga89930533646b30d021759298aa6bf04a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">fvec3</a></td></tr>\n<tr class=\"memdesc:ga89930533646b30d021759298aa6bf04a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 3 components.  <a href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga89930533646b30d021759298aa6bf04a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga713c796c54875cf4092d42ff9d9096b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_f32vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">fvec4</a></td></tr>\n<tr class=\"memdesc:ga713c796c54875cf4092d42ff9d9096b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default single-qualifier floating-point vector of 4 components.  <a href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga713c796c54875cf4092d42ff9d9096b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0336abc2604dd2c20c30e036454b64f8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">highp_i16</a></td></tr>\n<tr class=\"memdesc:ga0336abc2604dd2c20c30e036454b64f8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0336abc2604dd2c20c30e036454b64f8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga727675ac6b5d2fc699520e0059735e25\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">highp_i32</a></td></tr>\n<tr class=\"memdesc:ga727675ac6b5d2fc699520e0059735e25\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">More...</a><br /></td></tr>\n<tr class=\"separator:ga727675ac6b5d2fc699520e0059735e25\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac25db6d2b1e2a0f351b77ba3409ac4cd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">highp_i64</a></td></tr>\n<tr class=\"memdesc:gac25db6d2b1e2a0f351b77ba3409ac4cd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer type.  <a href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">More...</a><br /></td></tr>\n<tr class=\"separator:gac25db6d2b1e2a0f351b77ba3409ac4cd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb88796f2d08ef253d0345aff20c3aee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">highp_i8</a></td></tr>\n<tr class=\"memdesc:gacb88796f2d08ef253d0345aff20c3aee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer type.  <a href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">More...</a><br /></td></tr>\n<tr class=\"separator:gacb88796f2d08ef253d0345aff20c3aee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5fde0fa4a3852a9dd5d637a92ee74718\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">highp_int16</a></td></tr>\n<tr class=\"memdesc:ga5fde0fa4a3852a9dd5d637a92ee74718\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5fde0fa4a3852a9dd5d637a92ee74718\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacaea06d0a79ef3172e887a7a6ba434ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">highp_int16_t</a></td></tr>\n<tr class=\"memdesc:gacaea06d0a79ef3172e887a7a6ba434ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer type.  <a href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">More...</a><br /></td></tr>\n<tr class=\"separator:gacaea06d0a79ef3172e887a7a6ba434ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga84ed04b4e0de18c977e932d617e7c223\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">highp_int32</a></td></tr>\n<tr class=\"memdesc:ga84ed04b4e0de18c977e932d617e7c223\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">More...</a><br /></td></tr>\n<tr class=\"separator:ga84ed04b4e0de18c977e932d617e7c223\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">highp_int32_t</a></td></tr>\n<tr class=\"memdesc:ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit signed integer type.  <a href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga226a8d52b4e3f77aaa6231135e886aac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">highp_int64</a></td></tr>\n<tr class=\"memdesc:ga226a8d52b4e3f77aaa6231135e886aac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga226a8d52b4e3f77aaa6231135e886aac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73c6abb280a45feeff60f9accaee91f3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">highp_int64_t</a></td></tr>\n<tr class=\"memdesc:ga73c6abb280a45feeff60f9accaee91f3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73c6abb280a45feeff60f9accaee91f3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0549c902a96a7164e4ac858d5f39dbf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">highp_int8</a></td></tr>\n<tr class=\"memdesc:gad0549c902a96a7164e4ac858d5f39dbf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer type.  <a href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0549c902a96a7164e4ac858d5f39dbf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1085c50dd8fbeb5e7e609b1c127492a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">highp_int8_t</a></td></tr>\n<tr class=\"memdesc:ga1085c50dd8fbeb5e7e609b1c127492a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1085c50dd8fbeb5e7e609b1c127492a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e62c883d13f47015f3b70ed88751369\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">highp_u16</a></td></tr>\n<tr class=\"memdesc:ga8e62c883d13f47015f3b70ed88751369\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e62c883d13f47015f3b70ed88751369\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a6f1929464dcc680b16381a4ee5f2cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">highp_u32</a></td></tr>\n<tr class=\"memdesc:ga7a6f1929464dcc680b16381a4ee5f2cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a6f1929464dcc680b16381a4ee5f2cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0c181fdf06a309691999926b6690c969\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">highp_u64</a></td></tr>\n<tr class=\"memdesc:ga0c181fdf06a309691999926b6690c969\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0c181fdf06a309691999926b6690c969\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacd1259f3a9e8d2a9df5be2d74322ef9c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">highp_u8</a></td></tr>\n<tr class=\"memdesc:gacd1259f3a9e8d2a9df5be2d74322ef9c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">More...</a><br /></td></tr>\n<tr class=\"separator:gacd1259f3a9e8d2a9df5be2d74322ef9c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga746dc6da204f5622e395f492997dbf57\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">highp_uint16</a></td></tr>\n<tr class=\"memdesc:ga746dc6da204f5622e395f492997dbf57\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">More...</a><br /></td></tr>\n<tr class=\"separator:ga746dc6da204f5622e395f492997dbf57\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacf54c3330ef60aa3d16cb676c7bcb8c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">highp_uint16_t</a></td></tr>\n<tr class=\"memdesc:gacf54c3330ef60aa3d16cb676c7bcb8c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">More...</a><br /></td></tr>\n<tr class=\"separator:gacf54c3330ef60aa3d16cb676c7bcb8c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga256b12b650c3f2fb86878fd1c5db8bc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">highp_uint32</a></td></tr>\n<tr class=\"memdesc:ga256b12b650c3f2fb86878fd1c5db8bc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga256b12b650c3f2fb86878fd1c5db8bc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae978599c9711ac263ba732d4ac225b0e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">highp_uint32_t</a></td></tr>\n<tr class=\"memdesc:gae978599c9711ac263ba732d4ac225b0e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae978599c9711ac263ba732d4ac225b0e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">highp_uint64</a></td></tr>\n<tr class=\"memdesc:gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa38d732f5d4a7bc42a1b43b9d3c141ce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa46172d7dc1c7ffe3e78107ff88adf08\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">highp_uint64_t</a></td></tr>\n<tr class=\"memdesc:gaa46172d7dc1c7ffe3e78107ff88adf08\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa46172d7dc1c7ffe3e78107ff88adf08\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97432f9979e73e66567361fd01e4cffb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">highp_uint8</a></td></tr>\n<tr class=\"memdesc:ga97432f9979e73e66567361fd01e4cffb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97432f9979e73e66567361fd01e4cffb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac4e00a26a2adb5f2c0a7096810df29e5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">highp_uint8_t</a></td></tr>\n<tr class=\"memdesc:gac4e00a26a2adb5f2c0a7096810df29e5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">More...</a><br /></td></tr>\n<tr class=\"separator:gac4e00a26a2adb5f2c0a7096810df29e5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ab5fe184343d394fb6c2723c3ee3699\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">i16</a></td></tr>\n<tr class=\"memdesc:ga3ab5fe184343d394fb6c2723c3ee3699\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit signed integer type.  <a href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ab5fe184343d394fb6c2723c3ee3699\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafe730798732aa7b0647096a004db1b1c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i16vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">i16vec1</a></td></tr>\n<tr class=\"memdesc:gafe730798732aa7b0647096a004db1b1c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer scalar type.  <a href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">More...</a><br /></td></tr>\n<tr class=\"separator:gafe730798732aa7b0647096a004db1b1c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2996630ba7b10535af8e065cf326f761\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i16vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a></td></tr>\n<tr class=\"memdesc:ga2996630ba7b10535af8e065cf326f761\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer vector of 2 components type.  <a href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2996630ba7b10535af8e065cf326f761\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae9c90a867a6026b1f6eab00456f3fb8b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i16vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">i16vec3</a></td></tr>\n<tr class=\"memdesc:gae9c90a867a6026b1f6eab00456f3fb8b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer vector of 3 components type.  <a href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">More...</a><br /></td></tr>\n<tr class=\"separator:gae9c90a867a6026b1f6eab00456f3fb8b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga550831bfc26d1e0101c1cb3d79938c06\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i16vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a></td></tr>\n<tr class=\"memdesc:ga550831bfc26d1e0101c1cb3d79938c06\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer vector of 4 components type.  <a href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">More...</a><br /></td></tr>\n<tr class=\"separator:ga550831bfc26d1e0101c1cb3d79938c06\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga96faea43ac5f875d2d3ffbf8d213e3eb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">i32</a></td></tr>\n<tr class=\"memdesc:ga96faea43ac5f875d2d3ffbf8d213e3eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit signed integer type.  <a href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga96faea43ac5f875d2d3ffbf8d213e3eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i32vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a></td></tr>\n<tr class=\"memdesc:ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer scalar type.  <a href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga54b8a4e0f5a7203a821bf8e9c1265bcf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b44026374982dcd1e52d22bac99247e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a></td></tr>\n<tr class=\"memdesc:ga8b44026374982dcd1e52d22bac99247e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer vector of 2 components type.  <a href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b44026374982dcd1e52d22bac99247e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f526b5cccef126a2ebcf9bdd890394e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i32vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a></td></tr>\n<tr class=\"memdesc:ga7f526b5cccef126a2ebcf9bdd890394e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer vector of 3 components type.  <a href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f526b5cccef126a2ebcf9bdd890394e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga866a05905c49912309ed1fa5f5980e61\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i32vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a></td></tr>\n<tr class=\"memdesc:ga866a05905c49912309ed1fa5f5980e61\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer vector of 4 components type.  <a href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">More...</a><br /></td></tr>\n<tr class=\"separator:ga866a05905c49912309ed1fa5f5980e61\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadb997e409103d4da18abd837e636a496\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">i64</a></td></tr>\n<tr class=\"memdesc:gadb997e409103d4da18abd837e636a496\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit signed integer type.  <a href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">More...</a><br /></td></tr>\n<tr class=\"separator:gadb997e409103d4da18abd837e636a496\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b65767f8b5aed1bd1cf86c541662b50\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i64vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">i64vec1</a></td></tr>\n<tr class=\"memdesc:ga2b65767f8b5aed1bd1cf86c541662b50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer scalar type.  <a href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b65767f8b5aed1bd1cf86c541662b50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga48310188e1d0c616bf8d78c92447523b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i64vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">i64vec2</a></td></tr>\n<tr class=\"memdesc:ga48310188e1d0c616bf8d78c92447523b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer vector of 2 components type.  <a href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga48310188e1d0c616bf8d78c92447523b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga667948cfe6fb3d6606c750729ec49f77\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i64vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">i64vec3</a></td></tr>\n<tr class=\"memdesc:ga667948cfe6fb3d6606c750729ec49f77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer vector of 3 components type.  <a href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">More...</a><br /></td></tr>\n<tr class=\"separator:ga667948cfe6fb3d6606c750729ec49f77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4e31c3d9de067029efeb161a44b0232\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i64vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">i64vec4</a></td></tr>\n<tr class=\"memdesc:gaa4e31c3d9de067029efeb161a44b0232\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer vector of 4 components type.  <a href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa4e31c3d9de067029efeb161a44b0232\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga302ec977b0c0c3ea245b6c9275495355\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">i8</a></td></tr>\n<tr class=\"memdesc:ga302ec977b0c0c3ea245b6c9275495355\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit signed integer type.  <a href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">More...</a><br /></td></tr>\n<tr class=\"separator:ga302ec977b0c0c3ea245b6c9275495355\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7e80d927ff0a3861ced68dfff8a4020b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i8vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">i8vec1</a></td></tr>\n<tr class=\"memdesc:ga7e80d927ff0a3861ced68dfff8a4020b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer scalar type.  <a href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7e80d927ff0a3861ced68dfff8a4020b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad06935764d78f43f9d542c784c2212ec\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i8vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a></td></tr>\n<tr class=\"memdesc:gad06935764d78f43f9d542c784c2212ec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer vector of 2 components type.  <a href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">More...</a><br /></td></tr>\n<tr class=\"separator:gad06935764d78f43f9d542c784c2212ec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5a08d36cf7917cd19d081a603d0eae3e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i8vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">i8vec3</a></td></tr>\n<tr class=\"memdesc:ga5a08d36cf7917cd19d081a603d0eae3e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer vector of 3 components type.  <a href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5a08d36cf7917cd19d081a603d0eae3e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4177a44206121dabc8c4ff1c0f544574\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_i8vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a></td></tr>\n<tr class=\"memdesc:ga4177a44206121dabc8c4ff1c0f544574\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer vector of 4 components type.  <a href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4177a44206121dabc8c4ff1c0f544574\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga302041c186d0d028bea31b711fe16759\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a></td></tr>\n<tr class=\"memdesc:ga302041c186d0d028bea31b711fe16759\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit signed integer type.  <a href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">More...</a><br /></td></tr>\n<tr class=\"separator:ga302041c186d0d028bea31b711fe16759\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8f5e3e964ca2ae240adc2c0d74adede\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">int16_t</a></td></tr>\n<tr class=\"memdesc:gae8f5e3e964ca2ae240adc2c0d74adede\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit signed integer type.  <a href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">More...</a><br /></td></tr>\n<tr class=\"separator:gae8f5e3e964ca2ae240adc2c0d74adede\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8df669f4e7698dfe0c0354d92578d74f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a></td></tr>\n<tr class=\"memdesc:ga8df669f4e7698dfe0c0354d92578d74f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit signed integer type.  <a href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8df669f4e7698dfe0c0354d92578d74f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga042ef09ff2f0cb24a36f541bcb3a3710\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">int32_t</a></td></tr>\n<tr class=\"memdesc:ga042ef09ff2f0cb24a36f541bcb3a3710\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit signed integer type.  <a href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">More...</a><br /></td></tr>\n<tr class=\"separator:ga042ef09ff2f0cb24a36f541bcb3a3710\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaff5189f97f9e842d9636a0f240001b2e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a></td></tr>\n<tr class=\"memdesc:gaff5189f97f9e842d9636a0f240001b2e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit signed integer type.  <a href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaff5189f97f9e842d9636a0f240001b2e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga322a7d7d2c2c68994dc872a33de63c61\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">int64_t</a></td></tr>\n<tr class=\"memdesc:ga322a7d7d2c2c68994dc872a33de63c61\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit signed integer type.  <a href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">More...</a><br /></td></tr>\n<tr class=\"separator:ga322a7d7d2c2c68994dc872a33de63c61\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41c6189f6485c2825d60fdc835b3a2b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a></td></tr>\n<tr class=\"memdesc:ga41c6189f6485c2825d60fdc835b3a2b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit signed integer type.  <a href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41c6189f6485c2825d60fdc835b3a2b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4bf09d8838a86866b39ee6e109341645\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">int8_t</a></td></tr>\n<tr class=\"memdesc:ga4bf09d8838a86866b39ee6e109341645\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit signed integer type.  <a href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4bf09d8838a86866b39ee6e109341645\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga392b673fd10847bfb78fb808c6cf8ff7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">lowp_i16</a></td></tr>\n<tr class=\"memdesc:ga392b673fd10847bfb78fb808c6cf8ff7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga392b673fd10847bfb78fb808c6cf8ff7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">lowp_i32</a></td></tr>\n<tr class=\"memdesc:ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ff73a45cea9613ebf1a9fad0b9f82ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga354736e0c645099cd44c42fb2f87c2b8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">lowp_i64</a></td></tr>\n<tr class=\"memdesc:ga354736e0c645099cd44c42fb2f87c2b8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga354736e0c645099cd44c42fb2f87c2b8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga552a6bde5e75984efb0f863278da2e54\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">lowp_i8</a></td></tr>\n<tr class=\"memdesc:ga552a6bde5e75984efb0f863278da2e54\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">More...</a><br /></td></tr>\n<tr class=\"separator:ga552a6bde5e75984efb0f863278da2e54\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga698e36b01167fc0f037889334dce8def\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">lowp_int16</a></td></tr>\n<tr class=\"memdesc:ga698e36b01167fc0f037889334dce8def\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">More...</a><br /></td></tr>\n<tr class=\"separator:ga698e36b01167fc0f037889334dce8def\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b2cd8d31eb345b2d641d9261c38db1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">lowp_int16_t</a></td></tr>\n<tr class=\"memdesc:ga8b2cd8d31eb345b2d641d9261c38db1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b2cd8d31eb345b2d641d9261c38db1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga864aabca5f3296e176e0c3ed9cc16b02\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">lowp_int32</a></td></tr>\n<tr class=\"memdesc:ga864aabca5f3296e176e0c3ed9cc16b02\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">More...</a><br /></td></tr>\n<tr class=\"separator:ga864aabca5f3296e176e0c3ed9cc16b02\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0350631d35ff800e6133ac6243b13cbc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">lowp_int32_t</a></td></tr>\n<tr class=\"memdesc:ga0350631d35ff800e6133ac6243b13cbc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0350631d35ff800e6133ac6243b13cbc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf645b1a60203b39c0207baff5e3d8c3c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">lowp_int64</a></td></tr>\n<tr class=\"memdesc:gaf645b1a60203b39c0207baff5e3d8c3c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer type.  <a href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf645b1a60203b39c0207baff5e3d8c3c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebf341fc4a5be233f7dde962c2e33847\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">lowp_int64_t</a></td></tr>\n<tr class=\"memdesc:gaebf341fc4a5be233f7dde962c2e33847\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer type.  <a href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebf341fc4a5be233f7dde962c2e33847\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga760bcf26fdb23a2c3ecad3c928a19ae6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">lowp_int8</a></td></tr>\n<tr class=\"memdesc:ga760bcf26fdb23a2c3ecad3c928a19ae6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga760bcf26fdb23a2c3ecad3c928a19ae6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga119c41d73fe9977358174eb3ac1035a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">lowp_int8_t</a></td></tr>\n<tr class=\"memdesc:ga119c41d73fe9977358174eb3ac1035a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga119c41d73fe9977358174eb3ac1035a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga504ce1631cb2ac02fcf1d44d8c2aa126\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">lowp_u16</a></td></tr>\n<tr class=\"memdesc:ga504ce1631cb2ac02fcf1d44d8c2aa126\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">More...</a><br /></td></tr>\n<tr class=\"separator:ga504ce1631cb2ac02fcf1d44d8c2aa126\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f072ada9552e1e480bbb3b1acde5250\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">lowp_u32</a></td></tr>\n<tr class=\"memdesc:ga4f072ada9552e1e480bbb3b1acde5250\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f072ada9552e1e480bbb3b1acde5250\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30069d1f02b19599cbfadf98c23ac6ed\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">lowp_u64</a></td></tr>\n<tr class=\"memdesc:ga30069d1f02b19599cbfadf98c23ac6ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30069d1f02b19599cbfadf98c23ac6ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b09f03da7ac43055c68a349d5445083\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">lowp_u8</a></td></tr>\n<tr class=\"memdesc:ga1b09f03da7ac43055c68a349d5445083\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b09f03da7ac43055c68a349d5445083\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad68bfd9f881856fc863a6ebca0b67f78\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">lowp_uint16</a></td></tr>\n<tr class=\"memdesc:gad68bfd9f881856fc863a6ebca0b67f78\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">More...</a><br /></td></tr>\n<tr class=\"separator:gad68bfd9f881856fc863a6ebca0b67f78\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91c4815f93177eb423362fd296a87e9f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">lowp_uint16_t</a></td></tr>\n<tr class=\"memdesc:ga91c4815f93177eb423362fd296a87e9f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91c4815f93177eb423362fd296a87e9f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa6a5b461bbf5fe20982472aa51896d4b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">lowp_uint32</a></td></tr>\n<tr class=\"memdesc:gaa6a5b461bbf5fe20982472aa51896d4b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa6a5b461bbf5fe20982472aa51896d4b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf1b735b4b1145174f4e4167d13778f9b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">lowp_uint32_t</a></td></tr>\n<tr class=\"memdesc:gaf1b735b4b1145174f4e4167d13778f9b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf1b735b4b1145174f4e4167d13778f9b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa212b805736a759998e312cbdd550fae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">lowp_uint64</a></td></tr>\n<tr class=\"memdesc:gaa212b805736a759998e312cbdd550fae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa212b805736a759998e312cbdd550fae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8dd3a3281ae5c970ffe0c41d538aa153\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">lowp_uint64_t</a></td></tr>\n<tr class=\"memdesc:ga8dd3a3281ae5c970ffe0c41d538aa153\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8dd3a3281ae5c970ffe0c41d538aa153\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf49470869e9be2c059629b250619804e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">lowp_uint8</a></td></tr>\n<tr class=\"memdesc:gaf49470869e9be2c059629b250619804e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf49470869e9be2c059629b250619804e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga667b2ece2b258be898812dc2177995d1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">lowp_uint8_t</a></td></tr>\n<tr class=\"memdesc:ga667b2ece2b258be898812dc2177995d1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga667b2ece2b258be898812dc2177995d1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga62a17cddeb4dffb4e18fe3aea23f051a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">mediump_i16</a></td></tr>\n<tr class=\"memdesc:ga62a17cddeb4dffb4e18fe3aea23f051a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga62a17cddeb4dffb4e18fe3aea23f051a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5e94bf2a20af7601787c154751dc2e1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">mediump_i32</a></td></tr>\n<tr class=\"memdesc:gaf5e94bf2a20af7601787c154751dc2e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer type.  <a href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf5e94bf2a20af7601787c154751dc2e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ebcb1f6d8d8387253de8bccb058d77f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">mediump_i64</a></td></tr>\n<tr class=\"memdesc:ga3ebcb1f6d8d8387253de8bccb058d77f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ebcb1f6d8d8387253de8bccb058d77f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacf1ded173e1e2d049c511d095b259e21\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">mediump_i8</a></td></tr>\n<tr class=\"memdesc:gacf1ded173e1e2d049c511d095b259e21\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer type.  <a href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">More...</a><br /></td></tr>\n<tr class=\"separator:gacf1ded173e1e2d049c511d095b259e21\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadff3608baa4b5bd3ed28f95c1c2c345d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">mediump_int16</a></td></tr>\n<tr class=\"memdesc:gadff3608baa4b5bd3ed28f95c1c2c345d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer type.  <a href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">More...</a><br /></td></tr>\n<tr class=\"separator:gadff3608baa4b5bd3ed28f95c1c2c345d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga80e72fe94c88498537e8158ba7591c54\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">mediump_int16_t</a></td></tr>\n<tr class=\"memdesc:ga80e72fe94c88498537e8158ba7591c54\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer type.  <a href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">More...</a><br /></td></tr>\n<tr class=\"separator:ga80e72fe94c88498537e8158ba7591c54\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5244cef85d6e870e240c76428a262ae8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">mediump_int32</a></td></tr>\n<tr class=\"memdesc:ga5244cef85d6e870e240c76428a262ae8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5244cef85d6e870e240c76428a262ae8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga26fc7ced1ad7ca5024f1c973c8dc9180\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">mediump_int32_t</a></td></tr>\n<tr class=\"memdesc:ga26fc7ced1ad7ca5024f1c973c8dc9180\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer type.  <a href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">More...</a><br /></td></tr>\n<tr class=\"separator:ga26fc7ced1ad7ca5024f1c973c8dc9180\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b968f2b86a0442a89c7359171e1d866\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">mediump_int64</a></td></tr>\n<tr class=\"memdesc:ga7b968f2b86a0442a89c7359171e1d866\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer type.  <a href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7b968f2b86a0442a89c7359171e1d866\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac3bc41bcac61d1ba8f02a6f68ce23f64\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">mediump_int64_t</a></td></tr>\n<tr class=\"memdesc:gac3bc41bcac61d1ba8f02a6f68ce23f64\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer type.  <a href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">More...</a><br /></td></tr>\n<tr class=\"separator:gac3bc41bcac61d1ba8f02a6f68ce23f64\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6fbd69cbdaa44345bff923a2cf63de7e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">mediump_int8</a></td></tr>\n<tr class=\"memdesc:ga6fbd69cbdaa44345bff923a2cf63de7e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6fbd69cbdaa44345bff923a2cf63de7e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6d7b3789ecb932c26430009478cac7ae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::int8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">mediump_int8_t</a></td></tr>\n<tr class=\"memdesc:ga6d7b3789ecb932c26430009478cac7ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer type.  <a href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6d7b3789ecb932c26430009478cac7ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9df98857be695d5a30cb30f5bfa38a80\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">mediump_u16</a></td></tr>\n<tr class=\"memdesc:ga9df98857be695d5a30cb30f5bfa38a80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9df98857be695d5a30cb30f5bfa38a80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1bd0e914158bf03135f8a317de6debe9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">mediump_u32</a></td></tr>\n<tr class=\"memdesc:ga1bd0e914158bf03135f8a317de6debe9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1bd0e914158bf03135f8a317de6debe9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2af9490085ae3bdf36a544e9dd073610\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">mediump_u64</a></td></tr>\n<tr class=\"memdesc:ga2af9490085ae3bdf36a544e9dd073610\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2af9490085ae3bdf36a544e9dd073610\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1213a22bbb9e4107f07eaa4956f8281\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">mediump_u8</a></td></tr>\n<tr class=\"memdesc:gad1213a22bbb9e4107f07eaa4956f8281\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">More...</a><br /></td></tr>\n<tr class=\"separator:gad1213a22bbb9e4107f07eaa4956f8281\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2885a6c89916911e418c06bb76b9bdbb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">mediump_uint16</a></td></tr>\n<tr class=\"memdesc:ga2885a6c89916911e418c06bb76b9bdbb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2885a6c89916911e418c06bb76b9bdbb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3963b1050fc65a383ee28e3f827b6e3e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">mediump_uint16_t</a></td></tr>\n<tr class=\"memdesc:ga3963b1050fc65a383ee28e3f827b6e3e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer type.  <a href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3963b1050fc65a383ee28e3f827b6e3e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga34dd5ec1988c443bae80f1b20a8ade5f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">mediump_uint32</a></td></tr>\n<tr class=\"memdesc:ga34dd5ec1988c443bae80f1b20a8ade5f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga34dd5ec1988c443bae80f1b20a8ade5f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4dae276fd29623950de14a6ca2586b5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">mediump_uint32_t</a></td></tr>\n<tr class=\"memdesc:gaf4dae276fd29623950de14a6ca2586b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer type.  <a href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4dae276fd29623950de14a6ca2586b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30652709815ad9404272a31957daa59e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">mediump_uint64</a></td></tr>\n<tr class=\"memdesc:ga30652709815ad9404272a31957daa59e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30652709815ad9404272a31957daa59e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9b170dd4a8f38448a2dc93987c7875e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">mediump_uint64_t</a></td></tr>\n<tr class=\"memdesc:ga9b170dd4a8f38448a2dc93987c7875e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer type.  <a href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9b170dd4a8f38448a2dc93987c7875e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">mediump_uint8</a></td></tr>\n<tr class=\"memdesc:ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1fa92a233b9110861cdbc8c2ccf0b5a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadfe65c78231039e90507770db50c98c7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">mediump_uint8_t</a></td></tr>\n<tr class=\"memdesc:gadfe65c78231039e90507770db50c98c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer type.  <a href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">More...</a><br /></td></tr>\n<tr class=\"separator:gadfe65c78231039e90507770db50c98c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa2d7acc0adb536fab71fe261232a40ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">u16</a></td></tr>\n<tr class=\"memdesc:gaa2d7acc0adb536fab71fe261232a40ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit unsigned integer type.  <a href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa2d7acc0adb536fab71fe261232a40ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u16vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">u16vec1</a></td></tr>\n<tr class=\"memdesc:ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer scalar type.  <a href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a78447eb9d66a114b193f4a25899c16\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u16vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a></td></tr>\n<tr class=\"memdesc:ga2a78447eb9d66a114b193f4a25899c16\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer vector of 2 components type.  <a href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2a78447eb9d66a114b193f4a25899c16\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1c522ca821c27b862fe51cf4024b064b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u16vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">u16vec3</a></td></tr>\n<tr class=\"memdesc:ga1c522ca821c27b862fe51cf4024b064b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer vector of 3 components type.  <a href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1c522ca821c27b862fe51cf4024b064b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga529496d75775fb656a07993ea9af2450\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u16vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a></td></tr>\n<tr class=\"memdesc:ga529496d75775fb656a07993ea9af2450\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer vector of 4 components type.  <a href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">More...</a><br /></td></tr>\n<tr class=\"separator:ga529496d75775fb656a07993ea9af2450\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8165913e068444f7842302d40ba897b9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">u32</a></td></tr>\n<tr class=\"memdesc:ga8165913e068444f7842302d40ba897b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit unsigned integer type.  <a href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8165913e068444f7842302d40ba897b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae627372cfd5f20dd87db490387b71195\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u32vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a></td></tr>\n<tr class=\"memdesc:gae627372cfd5f20dd87db490387b71195\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer scalar type.  <a href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">More...</a><br /></td></tr>\n<tr class=\"separator:gae627372cfd5f20dd87db490387b71195\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a266e46ee218d0c680f12b35c500cc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u32vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a></td></tr>\n<tr class=\"memdesc:ga2a266e46ee218d0c680f12b35c500cc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer vector of 2 components type.  <a href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2a266e46ee218d0c680f12b35c500cc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae267358ff2a41d156d97f5762630235a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u32vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a></td></tr>\n<tr class=\"memdesc:gae267358ff2a41d156d97f5762630235a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer vector of 3 components type.  <a href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae267358ff2a41d156d97f5762630235a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31cef34e4cd04840c54741ff2f7005f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u32vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a></td></tr>\n<tr class=\"memdesc:ga31cef34e4cd04840c54741ff2f7005f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer vector of 4 components type.  <a href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31cef34e4cd04840c54741ff2f7005f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf3f312156984c365e9f65620354da70b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">u64</a></td></tr>\n<tr class=\"memdesc:gaf3f312156984c365e9f65620354da70b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit unsigned integer type.  <a href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf3f312156984c365e9f65620354da70b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf09f3ca4b671a4a4f84505eb4cc865fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u64vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">u64vec1</a></td></tr>\n<tr class=\"memdesc:gaf09f3ca4b671a4a4f84505eb4cc865fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer scalar type.  <a href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf09f3ca4b671a4a4f84505eb4cc865fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaef3824ed4fe435a019c5b9dddf53fec5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u64vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">u64vec2</a></td></tr>\n<tr class=\"memdesc:gaef3824ed4fe435a019c5b9dddf53fec5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer vector of 2 components type.  <a href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">More...</a><br /></td></tr>\n<tr class=\"separator:gaef3824ed4fe435a019c5b9dddf53fec5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga489b89ba93d4f7b3934df78debc52276\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u64vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">u64vec3</a></td></tr>\n<tr class=\"memdesc:ga489b89ba93d4f7b3934df78debc52276\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer vector of 3 components type.  <a href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">More...</a><br /></td></tr>\n<tr class=\"separator:ga489b89ba93d4f7b3934df78debc52276\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3945dd6515d4498cb603e65ff867ab03\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u64vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">u64vec4</a></td></tr>\n<tr class=\"memdesc:ga3945dd6515d4498cb603e65ff867ab03\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer vector of 4 components type.  <a href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3945dd6515d4498cb603e65ff867ab03\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaecc7082561fc9028b844b6cf3d305d36\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">u8</a></td></tr>\n<tr class=\"memdesc:gaecc7082561fc9028b844b6cf3d305d36\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit unsigned integer type.  <a href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">More...</a><br /></td></tr>\n<tr class=\"separator:gaecc7082561fc9028b844b6cf3d305d36\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga29b349e037f0b24320b4548a143daee2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u8vec1&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">u8vec1</a></td></tr>\n<tr class=\"memdesc:ga29b349e037f0b24320b4548a143daee2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer scalar type.  <a href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga29b349e037f0b24320b4548a143daee2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga518b8d948a6b4ddb72f84d5c3b7b6611\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u8vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a></td></tr>\n<tr class=\"memdesc:ga518b8d948a6b4ddb72f84d5c3b7b6611\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer vector of 2 components type.  <a href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">More...</a><br /></td></tr>\n<tr class=\"separator:ga518b8d948a6b4ddb72f84d5c3b7b6611\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7c5706f6bbe5282e5598acf7e7b377e2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u8vec3&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">u8vec3</a></td></tr>\n<tr class=\"memdesc:ga7c5706f6bbe5282e5598acf7e7b377e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer vector of 3 components type.  <a href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7c5706f6bbe5282e5598acf7e7b377e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20779a61de2fd526a17f12fe53ec46b1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_u8vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a></td></tr>\n<tr class=\"memdesc:ga20779a61de2fd526a17f12fe53ec46b1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer vector of 4 components type.  <a href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20779a61de2fd526a17f12fe53ec46b1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga13471cbbe74e4303a57f3743d007b74d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a></td></tr>\n<tr class=\"memdesc:ga13471cbbe74e4303a57f3743d007b74d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit unsigned integer type.  <a href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga13471cbbe74e4303a57f3743d007b74d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91f91f411080c37730856ff5887f5bcf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">uint16_t</a></td></tr>\n<tr class=\"memdesc:ga91f91f411080c37730856ff5887f5bcf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16 bit unsigned integer type.  <a href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91f91f411080c37730856ff5887f5bcf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5fa3ddcab56c789bc272ff5651faa12d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a></td></tr>\n<tr class=\"memdesc:ga5fa3ddcab56c789bc272ff5651faa12d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit unsigned integer type.  <a href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5fa3ddcab56c789bc272ff5651faa12d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2171d9dc1fefb1c82e2817f45b622eac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">uint32_t</a></td></tr>\n<tr class=\"memdesc:ga2171d9dc1fefb1c82e2817f45b622eac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit unsigned integer type.  <a href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2171d9dc1fefb1c82e2817f45b622eac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab630f76c26b50298187f7889104d4b9c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a></td></tr>\n<tr class=\"memdesc:gab630f76c26b50298187f7889104d4b9c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit unsigned integer type.  <a href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">More...</a><br /></td></tr>\n<tr class=\"separator:gab630f76c26b50298187f7889104d4b9c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3999d3e7ff22025c16ddb601e14dfdee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">uint64_t</a></td></tr>\n<tr class=\"memdesc:ga3999d3e7ff22025c16ddb601e14dfdee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit unsigned integer type.  <a href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3999d3e7ff22025c16ddb601e14dfdee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga36475e31b1992cfde54c1a6f5a148865\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a></td></tr>\n<tr class=\"memdesc:ga36475e31b1992cfde54c1a6f5a148865\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit unsigned integer type.  <a href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">More...</a><br /></td></tr>\n<tr class=\"separator:ga36475e31b1992cfde54c1a6f5a148865\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga28d97808322d3c92186e4a0c067d7e8e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">uint8_t</a></td></tr>\n<tr class=\"memdesc:ga28d97808322d3c92186e4a0c067d7e8e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8 bit unsigned integer type.  <a href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga28d97808322d3c92186e4a0c067d7e8e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00117.html\" title=\"GLM_GTC_type_precision \">glm/gtc/type_precision.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines specific C++-based qualifier types.</p>\n<p><a class=\"el\" href=\"a00145.html\">Precision types</a> defines types based on GLSL's qualifier qualifiers. This extension defines types based on explicitly-sized C++ data types. </p>\n<h2 class=\"groupheader\">Typedef Documentation</h2>\n<a class=\"anchor\" id=\"gabe6a542dd6c1d5ffd847f1b9b4c9c9b7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef float32 f32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default 32 bit single-qualifier floating-point scalar. </p>\n<p>32 bit single-qualifier floating-point scalar.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01507\">1507</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab12383ed6ac7595ed6fde4d266c58425\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, f32, defaultp &gt; f32mat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 2x2 matrix. </p>\n<p>Single-qualifier floating-point 1x1 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a></dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> Single-qualifier floating-point 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02451\">2451</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga04100c76f7d55a0dd0983ccf05142bff\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, f32, defaultp &gt; f32mat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 2x2 matrix. </p>\n<p>Single-qualifier floating-point 1x1 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a></dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> Single-qualifier floating-point 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02415\">2415</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab256cdab5eb582e426d749ae77b5b566\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 3, f32, defaultp &gt; f32mat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 2x3 matrix. </p>\n<p>Single-qualifier floating-point 2x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02419\">2419</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf512b74c4400b68f9fdf9388b3d6aac8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 4, f32, defaultp &gt; f32mat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 2x4 matrix. </p>\n<p>Single-qualifier floating-point 2x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02423\">2423</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga856f3905ee7cc2e4890a8a1d56c150be\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, f32, defaultp &gt; f32mat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 3x3 matrix. </p>\n<p>Single-qualifier floating-point 3x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02455\">2455</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1320a08e14fdff3821241eefab6947e9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 2, f32, defaultp &gt; f32mat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 3x2 matrix. </p>\n<p>Single-qualifier floating-point 3x2 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02427\">2427</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga65261fa8a21045c8646ddff114a56174\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, f32, defaultp &gt; f32mat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 3x3 matrix. </p>\n<p>Single-qualifier floating-point 3x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02431\">2431</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab90ade28222f8b861d5ceaf81a3a7f5d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 4, f32, defaultp &gt; f32mat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 3x4 matrix. </p>\n<p>Single-qualifier floating-point 3x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02435\">2435</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga99d1b85ff99956b33da7e9992aad129a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, f32, defaultp &gt; f32mat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 4x4 matrix. </p>\n<p>Single-qualifier floating-point 4x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02459\">2459</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3b32ca1e57a4ef91babbc3d35a34ea20\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 2, f32, defaultp &gt; f32mat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 4x2 matrix. </p>\n<p>Single-qualifier floating-point 4x2 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02439\">2439</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga239b96198771b7add8eea7e6b59840c0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 3, f32, defaultp &gt; f32mat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 4x3 matrix. </p>\n<p>Single-qualifier floating-point 4x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02443\">2443</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaee4da0e9fbd8cfa2f89cb80889719dc3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, f32, defaultp &gt; f32mat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 4x4 matrix. </p>\n<p>Single-qualifier floating-point 4x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02447\">2447</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6966c0cb4673928c9c9da2e91006d2c0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tquat&lt; f32, defaultp &gt; f32quat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point quaternion. </p>\n<p>Single-qualifier floating-point quaternion.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02463\">2463</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga701f32ab5b3fb06996b41f5c0d643805\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, f32, defaultp &gt; f32vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point vector of 1 components. </p>\n<p>Single-qualifier floating-point vector of 1 component.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02399\">2399</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5d6c70e080409a76a257dc55bd8ea2c8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, f32, defaultp &gt; f32vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point vector of 2 components. </p>\n<p>Single-qualifier floating-point vector of 2 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02403\">2403</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaea5c4518e175162e306d2c2b5ef5ac79\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, f32, defaultp &gt; f32vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point vector of 3 components. </p>\n<p>Single-qualifier floating-point vector of 3 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02407\">2407</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga31c6ca0e074a44007f49a9a3720b18c8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, f32, defaultp &gt; f32vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point vector of 4 components. </p>\n<p>Single-qualifier floating-point vector of 4 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02411\">2411</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1d794d240091678f602e8de225b8d8c9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef float64 f64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default 64 bit double-qualifier floating-point scalar. </p>\n<p>64 bit double-qualifier floating-point scalar.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01511\">1511</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad9771450a54785d13080cdde0fe20c1d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, f64, defaultp &gt; f64mat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 2x2 matrix. </p>\n<p>Double-qualifier floating-point 1x1 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a></dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> Double-qualifier floating-point 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02557\">2557</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9ec7c4c79e303c053e30729a95fb2c37\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, f64, defaultp &gt; f64mat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 2x2 matrix. </p>\n<p>Double-qualifier floating-point 1x1 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a></dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> Double-qualifier floating-point 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02521\">2521</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae3ab5719fc4c1e966631dbbcba8d412a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 3, f64, defaultp &gt; f64mat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 2x3 matrix. </p>\n<p>Double-qualifier floating-point 2x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02525\">2525</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac87278e0c702ba8afff76316d4eeb769\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 4, f64, defaultp &gt; f64mat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 2x4 matrix. </p>\n<p>Double-qualifier floating-point 2x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02529\">2529</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9b69181efbf8f37ae934f135137b29c0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, f64, defaultp &gt; f64mat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 3x3 matrix. </p>\n<p>Double-qualifier floating-point 3x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02561\">2561</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2473d8bf3f4abf967c4d0e18175be6f7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 2, f64, defaultp &gt; f64mat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 3x2 matrix. </p>\n<p>Double-qualifier floating-point 3x2 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02533\">2533</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga916c1aed91cf91f7b41399ebe7c6e185\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, f64, defaultp &gt; f64mat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 3x3 matrix. </p>\n<p>Double-qualifier floating-point 3x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02537\">2537</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaab239fa9e35b65a67cbaa6ac082f3675\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 4, f64, defaultp &gt; f64mat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 3x4 matrix. </p>\n<p>Double-qualifier floating-point 3x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02541\">2541</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0ecd3f4952536e5ef12702b44d2626fc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, f64, defaultp &gt; f64mat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 4x4 matrix. </p>\n<p>Double-qualifier floating-point 4x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02565\">2565</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab7daf79d6bc06a68bea1c6f5e11b5512\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 2, f64, defaultp &gt; f64mat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 4x2 matrix. </p>\n<p>Double-qualifier floating-point 4x2 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02545\">2545</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3e2e66ffbe341a80bc005ba2b9552110\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 3, f64, defaultp &gt; f64mat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 4x3 matrix. </p>\n<p>Double-qualifier floating-point 4x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02549\">2549</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae52e2b7077a9ff928a06ab5ce600b81e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, f64, defaultp &gt; f64mat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point 4x4 matrix. </p>\n<p>Double-qualifier floating-point 4x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02553\">2553</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga14c583bd625eda8cf4935a14d5dd544d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tquat&lt; f64, defaultp &gt; f64quat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point quaternion. </p>\n<p>Double-qualifier floating-point quaternion.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02569\">2569</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gade502df1ce14f837fae7f60a03ddb9b0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, f64, defaultp &gt; f64vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point vector of 1 components. </p>\n<p>Double-qualifier floating-point vector of 1 component.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02505\">2505</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadc4e1594f9555d919131ee02b17822a2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, f64, defaultp &gt; f64vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point vector of 2 components. </p>\n<p>Double-qualifier floating-point vector of 2 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02509\">2509</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa7a1ddca75c5f629173bf4772db7a635\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, f64, defaultp &gt; f64vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point vector of 3 components. </p>\n<p>Double-qualifier floating-point vector of 3 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02513\">2513</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga66e92e57260bdb910609b9a56bf83e97\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, f64, defaultp &gt; f64vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default double-qualifier floating-point vector of 4 components. </p>\n<p>Double-qualifier floating-point vector of 4 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02517\">2517</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad3c127f8bf8d7d4e738037c257abb5b1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::float32 float32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default 32 bit single-qualifier floating-point scalar. </p>\n<p>32 bit single-qualifier floating-point scalar.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00103_source.html#l00055\">55</a> of file <a class=\"el\" href=\"a00103_source.html\">type_float.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga41d579d81c3d98edd0532244fa02da77\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::float32 float32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default 32 bit single-qualifier floating-point scalar. </p>\n<p>32 bit single-qualifier floating-point scalar.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01499\">1499</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab5596d48586414c91ccb270962dc14d3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::float64 float64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default 64 bit double-qualifier floating-point scalar. </p>\n<p>64 bit double-qualifier floating-point scalar.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00103_source.html#l00056\">56</a> of file <a class=\"el\" href=\"a00103_source.html\">type_float.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6957c7b22f405683bb276554ca40dc37\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::float64 float64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default 64 bit double-qualifier floating-point scalar. </p>\n<p>64 bit double-qualifier floating-point scalar.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01503\">1503</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4541dc2feb2a31d6ecb5a303f3dd3280\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, f32, defaultp &gt; fmat2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 2x2 matrix. </p>\n<p>Single-qualifier floating-point 1x1 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a></dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> Single-qualifier floating-point 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02381\">2381</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3350c93c3275298f940a42875388e4b4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 2, f32, defaultp &gt; fmat2x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 2x2 matrix. </p>\n<p>Single-qualifier floating-point 1x1 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a></dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> Single-qualifier floating-point 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02345\">2345</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga55a2d2a8eb09b5633668257eb3cad453\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 3, f32, defaultp &gt; fmat2x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 2x3 matrix. </p>\n<p>Single-qualifier floating-point 2x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02349\">2349</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga681381f19f11c9e5ee45cda2c56937ff\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 2, 4, f32, defaultp &gt; fmat2x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 2x4 matrix. </p>\n<p>Single-qualifier floating-point 2x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02353\">2353</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga253d453c20e037730023fea0215cb6f6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, f32, defaultp &gt; fmat3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 3x3 matrix. </p>\n<p>Single-qualifier floating-point 3x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02385\">2385</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6af54d70d9beb0a7ef992a879e86b04f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 2, f32, defaultp &gt; fmat3x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 3x2 matrix. </p>\n<p>Single-qualifier floating-point 3x2 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02357\">2357</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa07c86650253672a19dbfb898f3265b8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 3, f32, defaultp &gt; fmat3x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 3x3 matrix. </p>\n<p>Single-qualifier floating-point 3x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02361\">2361</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga44e158af77a670ee1b58c03cda9e1619\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 3, 4, f32, defaultp &gt; fmat3x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 3x4 matrix. </p>\n<p>Single-qualifier floating-point 3x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02365\">2365</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8cb400c0f4438f2640035d7b9824a0ca\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, f32, defaultp &gt; fmat4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 4x4 matrix. </p>\n<p>Single-qualifier floating-point 4x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02389\">2389</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8c8aa45aafcc23238edb1d5aeb801774\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 2, f32, defaultp &gt; fmat4x2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 4x2 matrix. </p>\n<p>Single-qualifier floating-point 4x2 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02369\">2369</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4295048a78bdf46b8a7de77ec665b497\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 3, f32, defaultp &gt; fmat4x3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 4x3 matrix. </p>\n<p>Single-qualifier floating-point 4x3 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02373\">2373</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad01cc6479bde1fd1870f13d3ed9530b3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef mat&lt; 4, 4, f32, defaultp &gt; fmat4x4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point 4x4 matrix. </p>\n<p>Single-qualifier floating-point 4x4 matrix.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02377\">2377</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga98b9ed43cf8c5cf1d354b23c7df9119f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, float, defaultp &gt; fvec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point vector of 1 components. </p>\n<p>Single-qualifier floating-point vector of 1 component.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02329\">2329</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga24273aa02abaecaab7f160bac437a339\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, float, defaultp &gt; fvec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point vector of 2 components. </p>\n<p>Single-qualifier floating-point vector of 2 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02333\">2333</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga89930533646b30d021759298aa6bf04a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, float, defaultp &gt; fvec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point vector of 3 components. </p>\n<p>Single-qualifier floating-point vector of 3 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02337\">2337</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga713c796c54875cf4092d42ff9d9096b0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, float, defaultp &gt; fvec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default single-qualifier floating-point vector of 4 components. </p>\n<p>Single-qualifier floating-point vector of 4 components.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l02341\">2341</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0336abc2604dd2c20c30e036454b64f8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 highp_i16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00234\">234</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga727675ac6b5d2fc699520e0059735e25\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 highp_i32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00238\">238</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac25db6d2b1e2a0f351b77ba3409ac4cd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 highp_i64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00242\">242</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacb88796f2d08ef253d0345aff20c3aee\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 highp_i8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00230\">230</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5fde0fa4a3852a9dd5d637a92ee74718\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 highp_int16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00202\">202</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacaea06d0a79ef3172e887a7a6ba434ff\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 highp_int16_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00218\">218</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga84ed04b4e0de18c977e932d617e7c223\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 highp_int32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00206\">206</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2c71c8bd9e2fe7d2e93ca250d8b6157f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 highp_int32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00222\">222</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga226a8d52b4e3f77aaa6231135e886aac\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 highp_int64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00210\">210</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga73c6abb280a45feeff60f9accaee91f3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 highp_int64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00226\">226</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad0549c902a96a7164e4ac858d5f39dbf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 highp_int8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00198\">198</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1085c50dd8fbeb5e7e609b1c127492a5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 highp_int8_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00214\">214</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8e62c883d13f47015f3b70ed88751369\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 highp_u16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer type. </p>\n<p>High qualifier 16 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00843\">843</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7a6f1929464dcc680b16381a4ee5f2cf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 highp_u32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer type. </p>\n<p>High qualifier 32 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00847\">847</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0c181fdf06a309691999926b6690c969\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 highp_u64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer type. </p>\n<p>High qualifier 64 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00851\">851</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacd1259f3a9e8d2a9df5be2d74322ef9c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 highp_u8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer type. </p>\n<p>High qualifier 8 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00839\">839</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga746dc6da204f5622e395f492997dbf57\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 highp_uint16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer type. </p>\n<p>High qualifier 16 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00811\">811</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacf54c3330ef60aa3d16cb676c7bcb8c7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 highp_uint16_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer type. </p>\n<p>High qualifier 16 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00827\">827</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga256b12b650c3f2fb86878fd1c5db8bc3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 highp_uint32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer type. </p>\n<p>High qualifier 32 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00815\">815</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae978599c9711ac263ba732d4ac225b0e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 highp_uint32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer type. </p>\n<p>High qualifier 32 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00831\">831</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa38d732f5d4a7bc42a1b43b9d3c141ce\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 highp_uint64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer type. </p>\n<p>High qualifier 64 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00819\">819</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa46172d7dc1c7ffe3e78107ff88adf08\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 highp_uint64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer type. </p>\n<p>High qualifier 64 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00835\">835</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga97432f9979e73e66567361fd01e4cffb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 highp_uint8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer type. </p>\n<p>High qualifier 8 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00807\">807</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac4e00a26a2adb5f2c0a7096810df29e5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 highp_uint8_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer type. </p>\n<p>High qualifier 8 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00823\">823</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3ab5fe184343d394fb6c2723c3ee3699\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 i16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00291\">291</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafe730798732aa7b0647096a004db1b1c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, i16, defaultp &gt; i16vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer scalar type. </p>\n<p>16 bit signed integer scalar type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00446\">446</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2996630ba7b10535af8e065cf326f761\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, i16, defaultp &gt; i16vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer vector of 2 components type. </p>\n<p>16 bit signed integer vector of 2 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00450\">450</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae9c90a867a6026b1f6eab00456f3fb8b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, i16, defaultp &gt; i16vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer vector of 3 components type. </p>\n<p>16 bit signed integer vector of 3 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00454\">454</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga550831bfc26d1e0101c1cb3d79938c06\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, i16, defaultp &gt; i16vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer vector of 4 components type. </p>\n<p>16 bit signed integer vector of 4 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00458\">458</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga96faea43ac5f875d2d3ffbf8d213e3eb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 i32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00295\">295</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga54b8a4e0f5a7203a821bf8e9c1265bcf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, i32, defaultp &gt; i32vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer scalar type. </p>\n<p>32 bit signed integer scalar type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00525\">525</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b44026374982dcd1e52d22bac99247e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, i32, defaultp &gt; i32vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer vector of 2 components type. </p>\n<p>32 bit signed integer vector of 2 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00529\">529</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7f526b5cccef126a2ebcf9bdd890394e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, i32, defaultp &gt; i32vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer vector of 3 components type. </p>\n<p>32 bit signed integer vector of 3 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00533\">533</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga866a05905c49912309ed1fa5f5980e61\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, i32, defaultp &gt; i32vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer vector of 4 components type. </p>\n<p>32 bit signed integer vector of 4 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00537\">537</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadb997e409103d4da18abd837e636a496\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 i64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00299\">299</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2b65767f8b5aed1bd1cf86c541662b50\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, i64, defaultp &gt; i64vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer scalar type. </p>\n<p>64 bit signed integer scalar type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00684\">684</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga48310188e1d0c616bf8d78c92447523b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, i64, defaultp &gt; i64vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer vector of 2 components type. </p>\n<p>64 bit signed integer vector of 2 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00688\">688</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga667948cfe6fb3d6606c750729ec49f77\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, i64, defaultp &gt; i64vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer vector of 3 components type. </p>\n<p>64 bit signed integer vector of 3 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00692\">692</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa4e31c3d9de067029efeb161a44b0232\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, i64, defaultp &gt; i64vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer vector of 4 components type. </p>\n<p>64 bit signed integer vector of 4 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00696\">696</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga302ec977b0c0c3ea245b6c9275495355\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 i8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00287\">287</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7e80d927ff0a3861ced68dfff8a4020b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, i8, defaultp &gt; i8vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer scalar type. </p>\n<p>8 bit signed integer scalar type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00366\">366</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad06935764d78f43f9d542c784c2212ec\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, i8, defaultp &gt; i8vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer vector of 2 components type. </p>\n<p>8 bit signed integer vector of 2 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00370\">370</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5a08d36cf7917cd19d081a603d0eae3e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, i8, defaultp &gt; i8vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer vector of 3 components type. </p>\n<p>8 bit signed integer vector of 3 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00374\">374</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4177a44206121dabc8c4ff1c0f544574\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, i8, defaultp &gt; i8vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer vector of 4 components type. </p>\n<p>8 bit signed integer vector of 4 components type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00378\">378</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga302041c186d0d028bea31b711fe16759\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 int16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00207\">207</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae8f5e3e964ca2ae240adc2c0d74adede\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 int16_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00274\">274</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8df669f4e7698dfe0c0354d92578d74f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 int32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00208\">208</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga042ef09ff2f0cb24a36f541bcb3a3710\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 int32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00278\">278</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaff5189f97f9e842d9636a0f240001b2e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 int64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00209\">209</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga322a7d7d2c2c68994dc872a33de63c61\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 int64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00282\">282</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga41c6189f6485c2825d60fdc835b3a2b0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 int8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00206\">206</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4bf09d8838a86866b39ee6e109341645\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 int8_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00270\">270</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga392b673fd10847bfb78fb808c6cf8ff7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 lowp_i16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00138\">138</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7ff73a45cea9613ebf1a9fad0b9f82ac\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 lowp_i32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00142\">142</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga354736e0c645099cd44c42fb2f87c2b8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 lowp_i64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00146\">146</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga552a6bde5e75984efb0f863278da2e54\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 lowp_i8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00134\">134</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga698e36b01167fc0f037889334dce8def\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 lowp_int16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00106\">106</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b2cd8d31eb345b2d641d9261c38db1a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 lowp_int16_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00122\">122</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga864aabca5f3296e176e0c3ed9cc16b02\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 lowp_int32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00110\">110</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0350631d35ff800e6133ac6243b13cbc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 lowp_int32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00126\">126</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf645b1a60203b39c0207baff5e3d8c3c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 lowp_int64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00114\">114</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaebf341fc4a5be233f7dde962c2e33847\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 lowp_int64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00130\">130</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga760bcf26fdb23a2c3ecad3c928a19ae6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 lowp_int8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00102\">102</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga119c41d73fe9977358174eb3ac1035a3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 lowp_int8_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00118\">118</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga504ce1631cb2ac02fcf1d44d8c2aa126\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 lowp_u16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00743\">743</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4f072ada9552e1e480bbb3b1acde5250\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 lowp_u32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00747\">747</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga30069d1f02b19599cbfadf98c23ac6ed\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 lowp_u64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00751\">751</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1b09f03da7ac43055c68a349d5445083\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 lowp_u8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00739\">739</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad68bfd9f881856fc863a6ebca0b67f78\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 lowp_uint16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00709\">709</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga91c4815f93177eb423362fd296a87e9f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 lowp_uint16_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00726\">726</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa6a5b461bbf5fe20982472aa51896d4b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 lowp_uint32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00713\">713</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf1b735b4b1145174f4e4167d13778f9b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 lowp_uint32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00730\">730</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa212b805736a759998e312cbdd550fae\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 lowp_uint64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00717\">717</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8dd3a3281ae5c970ffe0c41d538aa153\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 lowp_uint64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00734\">734</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf49470869e9be2c059629b250619804e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 lowp_uint8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00705\">705</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga667b2ece2b258be898812dc2177995d1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 lowp_uint8_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00722\">722</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga62a17cddeb4dffb4e18fe3aea23f051a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 mediump_i16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00186\">186</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf5e94bf2a20af7601787c154751dc2e1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 mediump_i32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00190\">190</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3ebcb1f6d8d8387253de8bccb058d77f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 mediump_i64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00194\">194</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacf1ded173e1e2d049c511d095b259e21\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 mediump_i8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00182\">182</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadff3608baa4b5bd3ed28f95c1c2c345d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 mediump_int16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00154\">154</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga80e72fe94c88498537e8158ba7591c54\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int16 mediump_int16_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00170\">170</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5244cef85d6e870e240c76428a262ae8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 mediump_int32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00158\">158</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga26fc7ced1ad7ca5024f1c973c8dc9180\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int32 mediump_int32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00174\">174</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7b968f2b86a0442a89c7359171e1d866\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 mediump_int64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00162\">162</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac3bc41bcac61d1ba8f02a6f68ce23f64\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int64 mediump_int64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00178\">178</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6fbd69cbdaa44345bff923a2cf63de7e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 mediump_int8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00150\">150</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6d7b3789ecb932c26430009478cac7ae\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::int8 mediump_int8_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit signed integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00166\">166</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9df98857be695d5a30cb30f5bfa38a80\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 mediump_u16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00793\">793</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1bd0e914158bf03135f8a317de6debe9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 mediump_u32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00797\">797</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2af9490085ae3bdf36a544e9dd073610\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 mediump_u64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00801\">801</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad1213a22bbb9e4107f07eaa4956f8281\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 mediump_u8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00789\">789</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2885a6c89916911e418c06bb76b9bdbb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 mediump_uint16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00761\">761</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3963b1050fc65a383ee28e3f827b6e3e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 mediump_uint16_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00777\">777</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga34dd5ec1988c443bae80f1b20a8ade5f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 mediump_uint32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00765\">765</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf4dae276fd29623950de14a6ca2586b5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 mediump_uint32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00781\">781</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga30652709815ad9404272a31957daa59e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 mediump_uint64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00769\">769</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9b170dd4a8f38448a2dc93987c7875e9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 mediump_uint64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00785\">785</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1fa92a233b9110861cdbc8c2ccf0b5a3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 mediump_uint8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00757\">757</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadfe65c78231039e90507770db50c98c7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 mediump_uint8_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00773\">773</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa2d7acc0adb536fab71fe261232a40ff\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 u16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>16 bit unsigned integer type. </p>\n<p>Default qualifier 16 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00900\">900</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga08c05ba8ffb19f5d14ab584e1e9e9ee5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, u16, defaultp &gt; u16vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01055\">1055</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2a78447eb9d66a114b193f4a25899c16\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, u16, defaultp &gt; u16vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01059\">1059</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1c522ca821c27b862fe51cf4024b064b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, u16, defaultp &gt; u16vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01063\">1063</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga529496d75775fb656a07993ea9af2450\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, u16, defaultp &gt; u16vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01067\">1067</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8165913e068444f7842302d40ba897b9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 u32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit unsigned integer type. </p>\n<p>Default qualifier 32 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00904\">904</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae627372cfd5f20dd87db490387b71195\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, u32, defaultp &gt; u32vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01134\">1134</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2a266e46ee218d0c680f12b35c500cc0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, u32, defaultp &gt; u32vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01138\">1138</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae267358ff2a41d156d97f5762630235a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, u32, defaultp &gt; u32vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01142\">1142</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga31cef34e4cd04840c54741ff2f7005f0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, u32, defaultp &gt; u32vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01146\">1146</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf3f312156984c365e9f65620354da70b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 u64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit unsigned integer type. </p>\n<p>Default qualifier 64 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00908\">908</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf09f3ca4b671a4a4f84505eb4cc865fd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, u64, defaultp &gt; u64vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01293\">1293</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaef3824ed4fe435a019c5b9dddf53fec5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, u64, defaultp &gt; u64vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01297\">1297</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga489b89ba93d4f7b3934df78debc52276\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, u64, defaultp &gt; u64vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01301\">1301</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3945dd6515d4498cb603e65ff867ab03\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, u64, defaultp &gt; u64vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l01305\">1305</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaecc7082561fc9028b844b6cf3d305d36\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 u8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>8 bit unsigned integer type. </p>\n<p>Default qualifier 8 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00896\">896</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga29b349e037f0b24320b4548a143daee2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 1, u8, defaultp &gt; u8vec1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00975\">975</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga518b8d948a6b4ddb72f84d5c3b7b6611\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 2, u8, defaultp &gt; u8vec2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00979\">979</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7c5706f6bbe5282e5598acf7e7b377e2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 3, u8, defaultp &gt; u8vec3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00983\">983</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga20779a61de2fd526a17f12fe53ec46b1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt; 4, u8, defaultp &gt; u8vec4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00987\">987</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga13471cbbe74e4303a57f3743d007b74d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 uint16</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>16 bit unsigned integer type. </p>\n<p>Default qualifier 16 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00212\">212</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga91f91f411080c37730856ff5887f5bcf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 uint16_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>16 bit unsigned integer type. </p>\n<p>Default qualifier 16 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00883\">883</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5fa3ddcab56c789bc272ff5651faa12d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 uint32</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit unsigned integer type. </p>\n<p>Default qualifier 32 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00213\">213</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2171d9dc1fefb1c82e2817f45b622eac\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 uint32_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit unsigned integer type. </p>\n<p>Default qualifier 32 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00887\">887</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab630f76c26b50298187f7889104d4b9c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 uint64</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit unsigned integer type. </p>\n<p>Default qualifier 64 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00214\">214</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3999d3e7ff22025c16ddb601e14dfdee\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 uint64_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit unsigned integer type. </p>\n<p>Default qualifier 64 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00891\">891</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga36475e31b1992cfde54c1a6f5a148865\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 uint8</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>8 bit unsigned integer type. </p>\n<p>Default qualifier 8 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00106_source.html#l00211\">211</a> of file <a class=\"el\" href=\"a00106_source.html\">type_int.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga28d97808322d3c92186e4a0c067d7e8e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 uint8_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>8 bit unsigned integer type. </p>\n<p>Default qualifier 8 bit unsigned integer type.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00165.html\" title=\"Include <glm/gtc/type_precision.hpp> to use the features of this extension. \">GLM_GTC_type_precision</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00033_source.html#l00879\">879</a> of file <a class=\"el\" href=\"a00033_source.html\">fwd.hpp</a>.</p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00166.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_type_ptr</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_type_ptr<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00118.html\" title=\"GLM_GTC_type_ptr \">glm/gtc/type_ptr.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga04409e74dc3da251d2501acf5b4b546c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga04409e74dc3da251d2501acf5b4b546c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga04409e74dc3da251d2501acf5b4b546c\">make_mat2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga04409e74dc3da251d2501acf5b4b546c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga04409e74dc3da251d2501acf5b4b546c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04409e74dc3da251d2501acf5b4b546c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae49e1c7bcd5abec74d1c34155031f663\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae49e1c7bcd5abec74d1c34155031f663\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gae49e1c7bcd5abec74d1c34155031f663\">make_mat2x2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gae49e1c7bcd5abec74d1c34155031f663\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#gae49e1c7bcd5abec74d1c34155031f663\">More...</a><br /></td></tr>\n<tr class=\"separator:gae49e1c7bcd5abec74d1c34155031f663\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga21982104164789cf8985483aaefc25e8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga21982104164789cf8985483aaefc25e8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga21982104164789cf8985483aaefc25e8\">make_mat2x3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga21982104164789cf8985483aaefc25e8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga21982104164789cf8985483aaefc25e8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga21982104164789cf8985483aaefc25e8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga078b862c90b0e9a79ed43a58997d8388\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga078b862c90b0e9a79ed43a58997d8388\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga078b862c90b0e9a79ed43a58997d8388\">make_mat2x4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga078b862c90b0e9a79ed43a58997d8388\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga078b862c90b0e9a79ed43a58997d8388\">More...</a><br /></td></tr>\n<tr class=\"separator:ga078b862c90b0e9a79ed43a58997d8388\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga611ee7c4d4cadfc83a8fa8e1d10a170f\">make_mat3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga611ee7c4d4cadfc83a8fa8e1d10a170f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga611ee7c4d4cadfc83a8fa8e1d10a170f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga27a24e121dc39e6857620e0f85b6e1a8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga27a24e121dc39e6857620e0f85b6e1a8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga27a24e121dc39e6857620e0f85b6e1a8\">make_mat3x2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga27a24e121dc39e6857620e0f85b6e1a8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga27a24e121dc39e6857620e0f85b6e1a8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga27a24e121dc39e6857620e0f85b6e1a8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2e8337b15c3362aaeb6e5849e1c0536\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaf2e8337b15c3362aaeb6e5849e1c0536\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gaf2e8337b15c3362aaeb6e5849e1c0536\">make_mat3x3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gaf2e8337b15c3362aaeb6e5849e1c0536\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#gaf2e8337b15c3362aaeb6e5849e1c0536\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2e8337b15c3362aaeb6e5849e1c0536\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga05dd66232aedb993e3b8e7b35eaf932b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga05dd66232aedb993e3b8e7b35eaf932b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga05dd66232aedb993e3b8e7b35eaf932b\">make_mat3x4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga05dd66232aedb993e3b8e7b35eaf932b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga05dd66232aedb993e3b8e7b35eaf932b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga05dd66232aedb993e3b8e7b35eaf932b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae7bcedb710d1446c87fd1fc93ed8ee9a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae7bcedb710d1446c87fd1fc93ed8ee9a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gae7bcedb710d1446c87fd1fc93ed8ee9a\">make_mat4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gae7bcedb710d1446c87fd1fc93ed8ee9a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#gae7bcedb710d1446c87fd1fc93ed8ee9a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae7bcedb710d1446c87fd1fc93ed8ee9a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga8b34c9b25bf3310d8ff9c828c7e2d97c\">make_mat4x2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga8b34c9b25bf3310d8ff9c828c7e2d97c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b34c9b25bf3310d8ff9c828c7e2d97c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0330bf6640092d7985fac92927bbd42b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0330bf6640092d7985fac92927bbd42b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga0330bf6640092d7985fac92927bbd42b\">make_mat4x3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga0330bf6640092d7985fac92927bbd42b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga0330bf6640092d7985fac92927bbd42b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0330bf6640092d7985fac92927bbd42b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f084be30e404844bfbb4a551ac2728c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga8f084be30e404844bfbb4a551ac2728c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga8f084be30e404844bfbb4a551ac2728c\">make_mat4x4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga8f084be30e404844bfbb4a551ac2728c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from a pointer.  <a href=\"a00166.html#ga8f084be30e404844bfbb4a551ac2728c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f084be30e404844bfbb4a551ac2728c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaadafb6600af2633e4c98cc64c72f5269\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaadafb6600af2633e4c98cc64c72f5269\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gaadafb6600af2633e4c98cc64c72f5269\">make_quat</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gaadafb6600af2633e4c98cc64c72f5269\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a quaternion from a pointer.  <a href=\"a00166.html#gaadafb6600af2633e4c98cc64c72f5269\">More...</a><br /></td></tr>\n<tr class=\"separator:gaadafb6600af2633e4c98cc64c72f5269\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga81253cf7b0ebfbb1e70540c5774e6824\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga81253cf7b0ebfbb1e70540c5774e6824\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga81253cf7b0ebfbb1e70540c5774e6824\">make_vec2</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga81253cf7b0ebfbb1e70540c5774e6824\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a vector from a pointer.  <a href=\"a00166.html#ga81253cf7b0ebfbb1e70540c5774e6824\">More...</a><br /></td></tr>\n<tr class=\"separator:ga81253cf7b0ebfbb1e70540c5774e6824\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad9e0d36ff489cb30c65ad1fa40351651\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gad9e0d36ff489cb30c65ad1fa40351651\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#gad9e0d36ff489cb30c65ad1fa40351651\">make_vec3</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:gad9e0d36ff489cb30c65ad1fa40351651\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a vector from a pointer.  <a href=\"a00166.html#gad9e0d36ff489cb30c65ad1fa40351651\">More...</a><br /></td></tr>\n<tr class=\"separator:gad9e0d36ff489cb30c65ad1fa40351651\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga63f576518993efc22a969f18f80e29bb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga63f576518993efc22a969f18f80e29bb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga63f576518993efc22a969f18f80e29bb\">make_vec4</a> (T const *const ptr)</td></tr>\n<tr class=\"memdesc:ga63f576518993efc22a969f18f80e29bb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a vector from a pointer.  <a href=\"a00166.html#ga63f576518993efc22a969f18f80e29bb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga63f576518993efc22a969f18f80e29bb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1c64669e1ba1160ad9386e43dc57569a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga1c64669e1ba1160ad9386e43dc57569a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type const *&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">value_ptr</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1c64669e1ba1160ad9386e43dc57569a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the constant address to the data of the input parameter.  <a href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1c64669e1ba1160ad9386e43dc57569a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00118.html\" title=\"GLM_GTC_type_ptr \">glm/gtc/type_ptr.hpp</a>&gt; to use the features of this extension. </p>\n<p>Handles the interaction between pointers and vector, matrix types.</p>\n<p>This extension defines an overloaded function, glm::value_ptr, which takes any of the <a class=\"el\" href=\"a00146.html\">core template types</a>. It returns a pointer to the memory layout of the object. Matrix types store their values in column-major order.</p>\n<p>This is useful for uploading data to matrices or copying data to buffer objects.</p>\n<p>Example: </p><div class=\"fragment\"><div class=\"line\"><span class=\"preprocessor\">#include &lt;<a class=\"code\" href=\"a00035.html\">glm/glm.hpp</a>&gt;</span></div>\n<div class=\"line\"><span class=\"preprocessor\">#include &lt;<a class=\"code\" href=\"a00118.html\">glm/gtc/type_ptr.hpp</a>&gt;</span></div>\n<div class=\"line\"></div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">glm::vec3</a> aVector(3);</div>\n<div class=\"line\"><a class=\"code\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">glm::mat4</a> someMatrix(1.0);</div>\n<div class=\"line\"></div>\n<div class=\"line\">glUniform3fv(uniformLoc, 1, <a class=\"code\" href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">glm::value_ptr</a>(aVector));</div>\n<div class=\"line\">glUniformMatrix4fv(uniformMatrixLoc, 1, GL_FALSE, <a class=\"code\" href=\"a00166.html#ga1c64669e1ba1160ad9386e43dc57569a\">glm::value_ptr</a>(someMatrix));</div>\n</div><!-- fragment --><p>&lt;<a class=\"el\" href=\"a00118.html\" title=\"GLM_GTC_type_ptr \">glm/gtc/type_ptr.hpp</a>&gt; need to be included to use the features of this extension. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga04409e74dc3da251d2501acf5b4b546c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 2, T, defaultp&gt; glm::make_mat2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae49e1c7bcd5abec74d1c34155031f663\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 2, T, defaultp&gt; glm::make_mat2x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga21982104164789cf8985483aaefc25e8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 3, T, defaultp&gt; glm::make_mat2x3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga078b862c90b0e9a79ed43a58997d8388\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 4, T, defaultp&gt; glm::make_mat2x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga611ee7c4d4cadfc83a8fa8e1d10a170f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, defaultp&gt; glm::make_mat3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga27a24e121dc39e6857620e0f85b6e1a8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 2, T, defaultp&gt; glm::make_mat3x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf2e8337b15c3362aaeb6e5849e1c0536\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, defaultp&gt; glm::make_mat3x3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga05dd66232aedb993e3b8e7b35eaf932b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 4, T, defaultp&gt; glm::make_mat3x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae7bcedb710d1446c87fd1fc93ed8ee9a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::make_mat4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b34c9b25bf3310d8ff9c828c7e2d97c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 2, T, defaultp&gt; glm::make_mat4x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0330bf6640092d7985fac92927bbd42b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 3, T, defaultp&gt; glm::make_mat4x3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8f084be30e404844bfbb4a551ac2728c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::make_mat4x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaadafb6600af2633e4c98cc64c72f5269\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, defaultp&gt; glm::make_quat </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a quaternion from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga81253cf7b0ebfbb1e70540c5774e6824\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;2, T, defaultp&gt; glm::make_vec2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a vector from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad9e0d36ff489cb30c65ad1fa40351651\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, defaultp&gt; glm::make_vec3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a vector from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga63f576518993efc22a969f18f80e29bb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, T, defaultp&gt; glm::make_vec4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const *const&#160;</td>\n          <td class=\"paramname\"><em>ptr</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a vector from a pointer. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1c64669e1ba1160ad9386e43dc57569a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType::value_type const* glm::value_ptr </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the constant address to the data of the input parameter. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00166.html\" title=\"Include <glm/gtc/type_ptr.hpp> to use the features of this extension. \">GLM_GTC_type_ptr</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00167.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_ulp</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_ulp<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00125.html\" title=\"GLM_GTC_ulp \">glm/gtc/ulp.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga2e09bd6c8b0a9c91f6f5683d68245634\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga2e09bd6c8b0a9c91f6f5683d68245634\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#ga2e09bd6c8b0a9c91f6f5683d68245634\">float_distance</a> (T const &amp;x, T const &amp;y)</td></tr>\n<tr class=\"memdesc:ga2e09bd6c8b0a9c91f6f5683d68245634\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the distance in the number of ULP between 2 scalars.  <a href=\"a00167.html#ga2e09bd6c8b0a9c91f6f5683d68245634\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e09bd6c8b0a9c91f6f5683d68245634\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga72b3223069013f336d8c31812b7ada80\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga72b3223069013f336d8c31812b7ada80\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#ga72b3223069013f336d8c31812b7ada80\">float_distance</a> (vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga72b3223069013f336d8c31812b7ada80\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the distance in the number of ULP between 2 vectors.  <a href=\"a00167.html#ga72b3223069013f336d8c31812b7ada80\">More...</a><br /></td></tr>\n<tr class=\"separator:ga72b3223069013f336d8c31812b7ada80\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae516ae554faa6117660828240e8bdaf0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae516ae554faa6117660828240e8bdaf0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#gae516ae554faa6117660828240e8bdaf0\">next_float</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:gae516ae554faa6117660828240e8bdaf0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the next ULP value(s) after the input value(s).  <a href=\"a00167.html#gae516ae554faa6117660828240e8bdaf0\">More...</a><br /></td></tr>\n<tr class=\"separator:gae516ae554faa6117660828240e8bdaf0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad107ec3d9697ef82032a33338a73ebdd\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad107ec3d9697ef82032a33338a73ebdd\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#gad107ec3d9697ef82032a33338a73ebdd\">next_float</a> (genType const &amp;x, uint const &amp;Distance)</td></tr>\n<tr class=\"memdesc:gad107ec3d9697ef82032a33338a73ebdd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the value(s) ULP distance after the input value(s).  <a href=\"a00167.html#gad107ec3d9697ef82032a33338a73ebdd\">More...</a><br /></td></tr>\n<tr class=\"separator:gad107ec3d9697ef82032a33338a73ebdd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2fcbb7bfbfc595712bfddc51b0715b07\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga2fcbb7bfbfc595712bfddc51b0715b07\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#ga2fcbb7bfbfc595712bfddc51b0715b07\">prev_float</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga2fcbb7bfbfc595712bfddc51b0715b07\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the previous ULP value(s) before the input value(s).  <a href=\"a00167.html#ga2fcbb7bfbfc595712bfddc51b0715b07\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2fcbb7bfbfc595712bfddc51b0715b07\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa399d5b6472a70e8952f9b26ecaacdec\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa399d5b6472a70e8952f9b26ecaacdec\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec\">prev_float</a> (genType const &amp;x, uint const &amp;Distance)</td></tr>\n<tr class=\"memdesc:gaa399d5b6472a70e8952f9b26ecaacdec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the value(s) ULP distance before the input value(s).  <a href=\"a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa399d5b6472a70e8952f9b26ecaacdec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00125.html\" title=\"GLM_GTC_ulp \">glm/gtc/ulp.hpp</a>&gt; to use the features of this extension. </p>\n<p>Allow the measurement of the accuracy of a function against a reference implementation. This extension works on floating-point data and provide results in ULP. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga2e09bd6c8b0a9c91f6f5683d68245634\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::float_distance </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the distance in the number of ULP between 2 scalars. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00167.html\" title=\"Include <glm/gtc/ulp.hpp> to use the features of this extension. \">GLM_GTC_ulp</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga72b3223069013f336d8c31812b7ada80\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;2, uint, Q&gt; glm::float_distance </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the distance in the number of ULP between 2 vectors. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00167.html\" title=\"Include <glm/gtc/ulp.hpp> to use the features of this extension. \">GLM_GTC_ulp</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae516ae554faa6117660828240e8bdaf0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::next_float </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the next ULP value(s) after the input value(s). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00167.html\" title=\"Include <glm/gtc/ulp.hpp> to use the features of this extension. \">GLM_GTC_ulp</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad107ec3d9697ef82032a33338a73ebdd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::next_float </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Distance</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the value(s) ULP distance after the input value(s). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00167.html\" title=\"Include <glm/gtc/ulp.hpp> to use the features of this extension. \">GLM_GTC_ulp</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2fcbb7bfbfc595712bfddc51b0715b07\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::prev_float </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the previous ULP value(s) before the input value(s). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00167.html\" title=\"Include <glm/gtc/ulp.hpp> to use the features of this extension. \">GLM_GTC_ulp</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa399d5b6472a70e8952f9b26ecaacdec\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::prev_float </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Distance</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the value(s) ULP distance before the input value(s). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00167.html\" title=\"Include <glm/gtc/ulp.hpp> to use the features of this extension. \">GLM_GTC_ulp</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00168.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTC_vec1</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTC_vec1<div class=\"ingroups\"><a class=\"el\" href=\"a00147.html\">Stable extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00126.html\" title=\"GLM_GTC_vec1 \">glm/gtc/vec1.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<p>Include &lt;<a class=\"el\" href=\"a00126.html\" title=\"GLM_GTC_vec1 \">glm/gtc/vec1.hpp</a>&gt; to use the features of this extension. </p>\n<p>Add vec1, ivec1, uvec1 and bvec1 types. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00169.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_associated_min_max</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_associated_min_max<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00007.html\" title=\"GLM_GTX_associated_min_max \">glm/gtx/associated_min_max.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga7d9c8785230c8db60f72ec8975f1ba45\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:ga7d9c8785230c8db60f72ec8975f1ba45\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga7d9c8785230c8db60f72ec8975f1ba45\">associatedMax</a> (T x, U a, T y, U b)</td></tr>\n<tr class=\"memdesc:ga7d9c8785230c8db60f72ec8975f1ba45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga7d9c8785230c8db60f72ec8975f1ba45\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7d9c8785230c8db60f72ec8975f1ba45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5c6758bc50aa7fbe700f87123a045aad\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5c6758bc50aa7fbe700f87123a045aad\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga5c6758bc50aa7fbe700f87123a045aad\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:ga5c6758bc50aa7fbe700f87123a045aad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga5c6758bc50aa7fbe700f87123a045aad\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5c6758bc50aa7fbe700f87123a045aad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0d169d6ce26b03248df175f39005d77f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0d169d6ce26b03248df175f39005d77f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga0d169d6ce26b03248df175f39005d77f\">associatedMax</a> (T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:ga0d169d6ce26b03248df175f39005d77f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga0d169d6ce26b03248df175f39005d77f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0d169d6ce26b03248df175f39005d77f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4086269afabcb81dd7ded33cb3448653\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4086269afabcb81dd7ded33cb3448653\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga4086269afabcb81dd7ded33cb3448653\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b)</td></tr>\n<tr class=\"memdesc:ga4086269afabcb81dd7ded33cb3448653\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga4086269afabcb81dd7ded33cb3448653\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4086269afabcb81dd7ded33cb3448653\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaec891e363d91abbf3a4443cf2f652209\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:gaec891e363d91abbf3a4443cf2f652209\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gaec891e363d91abbf3a4443cf2f652209\">associatedMax</a> (T x, U a, T y, U b, T z, U c)</td></tr>\n<tr class=\"memdesc:gaec891e363d91abbf3a4443cf2f652209\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#gaec891e363d91abbf3a4443cf2f652209\">More...</a><br /></td></tr>\n<tr class=\"separator:gaec891e363d91abbf3a4443cf2f652209\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab84fdc35016a31e8cd0cbb8296bddf7c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab84fdc35016a31e8cd0cbb8296bddf7c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gab84fdc35016a31e8cd0cbb8296bddf7c\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c)</td></tr>\n<tr class=\"memdesc:gab84fdc35016a31e8cd0cbb8296bddf7c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#gab84fdc35016a31e8cd0cbb8296bddf7c\">More...</a><br /></td></tr>\n<tr class=\"separator:gab84fdc35016a31e8cd0cbb8296bddf7c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadd2a2002f4f2144bbc39eb2336dd2fba\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadd2a2002f4f2144bbc39eb2336dd2fba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gadd2a2002f4f2144bbc39eb2336dd2fba\">associatedMax</a> (T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c)</td></tr>\n<tr class=\"memdesc:gadd2a2002f4f2144bbc39eb2336dd2fba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#gadd2a2002f4f2144bbc39eb2336dd2fba\">More...</a><br /></td></tr>\n<tr class=\"separator:gadd2a2002f4f2144bbc39eb2336dd2fba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga19f59d1141a51a3b2108a9807af78f7f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga19f59d1141a51a3b2108a9807af78f7f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga19f59d1141a51a3b2108a9807af78f7f\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c)</td></tr>\n<tr class=\"memdesc:ga19f59d1141a51a3b2108a9807af78f7f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#ga19f59d1141a51a3b2108a9807af78f7f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga19f59d1141a51a3b2108a9807af78f7f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3038ffcb43eaa6af75897a99a5047ccc\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:ga3038ffcb43eaa6af75897a99a5047ccc\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga3038ffcb43eaa6af75897a99a5047ccc\">associatedMax</a> (T x, U a, T y, U b, T z, U c, T w, U d)</td></tr>\n<tr class=\"memdesc:ga3038ffcb43eaa6af75897a99a5047ccc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga3038ffcb43eaa6af75897a99a5047ccc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3038ffcb43eaa6af75897a99a5047ccc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c, vec&lt; L, T, Q &gt; const &amp;w, vec&lt; L, U, Q &gt; const &amp;d)</td></tr>\n<tr class=\"memdesc:gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga11477c2c4b5b0bfd1b72b29df3725a9d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga11477c2c4b5b0bfd1b72b29df3725a9d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga11477c2c4b5b0bfd1b72b29df3725a9d\">associatedMax</a> (T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c, T w, vec&lt; L, U, Q &gt; const &amp;d)</td></tr>\n<tr class=\"memdesc:ga11477c2c4b5b0bfd1b72b29df3725a9d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga11477c2c4b5b0bfd1b72b29df3725a9d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga11477c2c4b5b0bfd1b72b29df3725a9d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab9c3dd74cac899d2c625b5767ea3b3fb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab9c3dd74cac899d2c625b5767ea3b3fb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">associatedMax</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)</td></tr>\n<tr class=\"memdesc:gab9c3dd74cac899d2c625b5767ea3b3fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Maximum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb\">More...</a><br /></td></tr>\n<tr class=\"separator:gab9c3dd74cac899d2c625b5767ea3b3fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc01bd272359572fc28437ae214a02df\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacc01bd272359572fc28437ae214a02df\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gacc01bd272359572fc28437ae214a02df\">associatedMin</a> (T x, U a, T y, U b)</td></tr>\n<tr class=\"memdesc:gacc01bd272359572fc28437ae214a02df\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#gacc01bd272359572fc28437ae214a02df\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc01bd272359572fc28437ae214a02df\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac2f0dff90948f2e44386a5eafd941d1c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac2f0dff90948f2e44386a5eafd941d1c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gac2f0dff90948f2e44386a5eafd941d1c\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:gac2f0dff90948f2e44386a5eafd941d1c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#gac2f0dff90948f2e44386a5eafd941d1c\">More...</a><br /></td></tr>\n<tr class=\"separator:gac2f0dff90948f2e44386a5eafd941d1c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacfec519c820331d023ef53a511749319\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacfec519c820331d023ef53a511749319\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gacfec519c820331d023ef53a511749319\">associatedMin</a> (T x, const vec&lt; L, U, Q &gt; &amp;a, T y, const vec&lt; L, U, Q &gt; &amp;b)</td></tr>\n<tr class=\"memdesc:gacfec519c820331d023ef53a511749319\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#gacfec519c820331d023ef53a511749319\">More...</a><br /></td></tr>\n<tr class=\"separator:gacfec519c820331d023ef53a511749319\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4757c7cab2d809124a8525d0a9deeb37\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4757c7cab2d809124a8525d0a9deeb37\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga4757c7cab2d809124a8525d0a9deeb37\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b)</td></tr>\n<tr class=\"memdesc:ga4757c7cab2d809124a8525d0a9deeb37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 2 variables and returns 2 associated variable values.  <a href=\"a00169.html#ga4757c7cab2d809124a8525d0a9deeb37\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4757c7cab2d809124a8525d0a9deeb37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0aa8f86259a26d839d34a3577a923fc\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:gad0aa8f86259a26d839d34a3577a923fc\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#gad0aa8f86259a26d839d34a3577a923fc\">associatedMin</a> (T x, U a, T y, U b, T z, U c)</td></tr>\n<tr class=\"memdesc:gad0aa8f86259a26d839d34a3577a923fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#gad0aa8f86259a26d839d34a3577a923fc\">More...</a><br /></td></tr>\n<tr class=\"separator:gad0aa8f86259a26d839d34a3577a923fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga723e5411cebc7ffbd5c81ffeec61127d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga723e5411cebc7ffbd5c81ffeec61127d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga723e5411cebc7ffbd5c81ffeec61127d\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c)</td></tr>\n<tr class=\"memdesc:ga723e5411cebc7ffbd5c81ffeec61127d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 3 variables and returns 3 associated variable values.  <a href=\"a00169.html#ga723e5411cebc7ffbd5c81ffeec61127d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga723e5411cebc7ffbd5c81ffeec61127d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga432224ebe2085eaa2b63a077ecbbbff6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , typename U &gt; </td></tr>\n<tr class=\"memitem:ga432224ebe2085eaa2b63a077ecbbbff6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL U&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga432224ebe2085eaa2b63a077ecbbbff6\">associatedMin</a> (T x, U a, T y, U b, T z, U c, T w, U d)</td></tr>\n<tr class=\"memdesc:ga432224ebe2085eaa2b63a077ecbbbff6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga432224ebe2085eaa2b63a077ecbbbff6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga432224ebe2085eaa2b63a077ecbbbff6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga66b08118bc88f0494bcacb7cdb940556\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga66b08118bc88f0494bcacb7cdb940556\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga66b08118bc88f0494bcacb7cdb940556\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c, vec&lt; L, T, Q &gt; const &amp;w, vec&lt; L, U, Q &gt; const &amp;d)</td></tr>\n<tr class=\"memdesc:ga66b08118bc88f0494bcacb7cdb940556\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga66b08118bc88f0494bcacb7cdb940556\">More...</a><br /></td></tr>\n<tr class=\"separator:ga66b08118bc88f0494bcacb7cdb940556\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78c28fde1a7080fb7420bd88e68c6c68\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga78c28fde1a7080fb7420bd88e68c6c68\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga78c28fde1a7080fb7420bd88e68c6c68\">associatedMin</a> (T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c, T w, vec&lt; L, U, Q &gt; const &amp;d)</td></tr>\n<tr class=\"memdesc:ga78c28fde1a7080fb7420bd88e68c6c68\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga78c28fde1a7080fb7420bd88e68c6c68\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78c28fde1a7080fb7420bd88e68c6c68\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2db7e351994baee78540a562d4bb6d3b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename U , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2db7e351994baee78540a562d4bb6d3b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, U, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">associatedMin</a> (vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)</td></tr>\n<tr class=\"memdesc:ga2db7e351994baee78540a562d4bb6d3b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Minimum comparison between 4 variables and returns 4 associated variable values.  <a href=\"a00169.html#ga2db7e351994baee78540a562d4bb6d3b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2db7e351994baee78540a562d4bb6d3b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00007.html\" title=\"GLM_GTX_associated_min_max \">glm/gtx/associated_min_max.hpp</a>&gt; to use the features of this extension. </p>\n<p>Min and max functions that return associated values not the compared onces. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga7d9c8785230c8db60f72ec8975f1ba45\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL U glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 2 variables and returns 2 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5c6758bc50aa7fbe700f87123a045aad\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;2, U, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 2 variables and returns 2 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0d169d6ce26b03248df175f39005d77f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 2 variables and returns 2 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4086269afabcb81dd7ded33cb3448653\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 2 variables and returns 2 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaec891e363d91abbf3a4443cf2f652209\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL U glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>c</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 3 variables and returns 3 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab84fdc35016a31e8cd0cbb8296bddf7c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 3 variables and returns 3 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadd2a2002f4f2144bbc39eb2336dd2fba\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 3 variables and returns 3 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga19f59d1141a51a3b2108a9807af78f7f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>c</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 3 variables and returns 3 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3038ffcb43eaa6af75897a99a5047ccc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL U glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>w</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>d</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 4 variables and returns 4 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf5ab0c428f8d1cd9e3b45fcfbf6423a6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>d</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 4 variables and returns 4 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga11477c2c4b5b0bfd1b72b29df3725a9d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>w</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>d</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 4 variables and returns 4 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab9c3dd74cac899d2c625b5767ea3b3fb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>d</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Maximum comparison between 4 variables and returns 4 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacc01bd272359572fc28437ae214a02df\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL U glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 2 variables and returns 2 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac2f0dff90948f2e44386a5eafd941d1c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;2, U, Q&gt; glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 2 variables and returns 2 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacfec519c820331d023ef53a511749319\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">const vec&lt; L, U, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">const vec&lt; L, U, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 2 variables and returns 2 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4757c7cab2d809124a8525d0a9deeb37\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 2 variables and returns 2 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad0aa8f86259a26d839d34a3577a923fc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL U glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>c</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 3 variables and returns 3 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga723e5411cebc7ffbd5c81ffeec61127d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 3 variables and returns 3 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga432224ebe2085eaa2b63a077ecbbbff6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL U glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>w</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>d</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 4 variables and returns 4 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga66b08118bc88f0494bcacb7cdb940556\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>d</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 4 variables and returns 4 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga78c28fde1a7080fb7420bd88e68c6c68\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>w</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, U, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>d</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 4 variables and returns 4 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2db7e351994baee78540a562d4bb6d3b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, U, Q&gt; glm::associatedMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>b</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">U&#160;</td>\n          <td class=\"paramname\"><em>d</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Minimum comparison between 4 variables and returns 4 associated variable values. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00169.html\" title=\"Include <glm/gtx/associated_min_max.hpp> to use the features of this extension. \">GLM_GTX_associated_min_max</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00170.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_bit</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_bit<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00008.html\" title=\"GLM_GTX_bit \">glm/gtx/bit.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0dcc8fe7c3d3ad60dea409281efa3d05\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga0dcc8fe7c3d3ad60dea409281efa3d05\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga0dcc8fe7c3d3ad60dea409281efa3d05\">highestBitValue</a> (genIUType Value)</td></tr>\n<tr class=\"separator:ga0dcc8fe7c3d3ad60dea409281efa3d05\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga898ef075ccf809a1e480faab48fe96bf\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga898ef075ccf809a1e480faab48fe96bf\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga898ef075ccf809a1e480faab48fe96bf\">highestBitValue</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga898ef075ccf809a1e480faab48fe96bf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Find the highest bit set to 1 in a integer variable and return its value.  <a href=\"a00170.html#ga898ef075ccf809a1e480faab48fe96bf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga898ef075ccf809a1e480faab48fe96bf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ff6568089f3a9b67f5c30918855fc6f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga2ff6568089f3a9b67f5c30918855fc6f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga2ff6568089f3a9b67f5c30918855fc6f\">lowestBitValue</a> (genIUType Value)</td></tr>\n<tr class=\"separator:ga2ff6568089f3a9b67f5c30918855fc6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8cda2459871f574a0aecbe702ac93291\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga8cda2459871f574a0aecbe702ac93291\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga8cda2459871f574a0aecbe702ac93291\">powerOfTwoAbove</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:ga8cda2459871f574a0aecbe702ac93291\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just higher the input value.  <a href=\"a00170.html#ga8cda2459871f574a0aecbe702ac93291\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8cda2459871f574a0aecbe702ac93291\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2bbded187c5febfefc1e524ba31b3fab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2bbded187c5febfefc1e524ba31b3fab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga2bbded187c5febfefc1e524ba31b3fab\">powerOfTwoAbove</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:ga2bbded187c5febfefc1e524ba31b3fab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just higher the input value.  <a href=\"a00170.html#ga2bbded187c5febfefc1e524ba31b3fab\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2bbded187c5febfefc1e524ba31b3fab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3de7df63c589325101a2817a56f8e29d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga3de7df63c589325101a2817a56f8e29d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga3de7df63c589325101a2817a56f8e29d\">powerOfTwoBelow</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:ga3de7df63c589325101a2817a56f8e29d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just lower the input value.  <a href=\"a00170.html#ga3de7df63c589325101a2817a56f8e29d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3de7df63c589325101a2817a56f8e29d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf78ddcc4152c051b2a21e68fecb10980\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf78ddcc4152c051b2a21e68fecb10980\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#gaf78ddcc4152c051b2a21e68fecb10980\">powerOfTwoBelow</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:gaf78ddcc4152c051b2a21e68fecb10980\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is just lower the input value.  <a href=\"a00170.html#gaf78ddcc4152c051b2a21e68fecb10980\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf78ddcc4152c051b2a21e68fecb10980\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f65973a5d2ea38c719e6a663149ead9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga5f65973a5d2ea38c719e6a663149ead9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL genIUType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#ga5f65973a5d2ea38c719e6a663149ead9\">powerOfTwoNearest</a> (genIUType Value)</td></tr>\n<tr class=\"memdesc:ga5f65973a5d2ea38c719e6a663149ead9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is the closet to the input value.  <a href=\"a00170.html#ga5f65973a5d2ea38c719e6a663149ead9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f65973a5d2ea38c719e6a663149ead9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac87e65d11e16c3d6b91c3bcfaef7da0b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac87e65d11e16c3d6b91c3bcfaef7da0b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b\">powerOfTwoNearest</a> (vec&lt; L, T, Q &gt; const &amp;value)</td></tr>\n<tr class=\"memdesc:gac87e65d11e16c3d6b91c3bcfaef7da0b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the power of two number which value is the closet to the input value.  <a href=\"a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b\">More...</a><br /></td></tr>\n<tr class=\"separator:gac87e65d11e16c3d6b91c3bcfaef7da0b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00008.html\" title=\"GLM_GTX_bit \">glm/gtx/bit.hpp</a>&gt; to use the features of this extension. </p>\n<p>Allow to perform bit operations on integer values </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga0dcc8fe7c3d3ad60dea409281efa3d05\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::highestBitValue </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga898ef075ccf809a1e480faab48fe96bf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::highestBitValue </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Find the highest bit set to 1 in a integer variable and return its value. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2ff6568089f3a9b67f5c30918855fc6f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genIUType glm::lowestBitValue </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8cda2459871f574a0aecbe702ac93291\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_DEPRECATED GLM_FUNC_DECL genIUType glm::powerOfTwoAbove </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is just higher the input value. </p>\n<p>Deprecated, use ceilPowerOfTwo from GTC_round instead</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2bbded187c5febfefc1e524ba31b3fab\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::powerOfTwoAbove </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is just higher the input value. </p>\n<p>Deprecated, use ceilPowerOfTwo from GTC_round instead</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3de7df63c589325101a2817a56f8e29d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_DEPRECATED GLM_FUNC_DECL genIUType glm::powerOfTwoBelow </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is just lower the input value. </p>\n<p>Deprecated, use floorPowerOfTwo from GTC_round instead</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf78ddcc4152c051b2a21e68fecb10980\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::powerOfTwoBelow </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is just lower the input value. </p>\n<p>Deprecated, use floorPowerOfTwo from GTC_round instead</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5f65973a5d2ea38c719e6a663149ead9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_DEPRECATED GLM_FUNC_DECL genIUType glm::powerOfTwoNearest </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>Value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is the closet to the input value. </p>\n<p>Deprecated, use roundPowerOfTwo from GTC_round instead</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac87e65d11e16c3d6b91c3bcfaef7da0b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_DEPRECATED GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::powerOfTwoNearest </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>value</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the power of two number which value is the closet to the input value. </p>\n<p>Deprecated, use roundPowerOfTwo from GTC_round instead</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00163.html\" title=\"Include <glm/gtc/round.hpp> to use the features of this extension. \">GLM_GTC_round</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00170.html\" title=\"Include <glm/gtx/bit.hpp> to use the features of this extension. \">GLM_GTX_bit</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00171.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_closest_point</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_closest_point<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00010.html\" title=\"GLM_GTX_closest_point \">glm/gtx/closest_point.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga36529c278ef716986151d58d151d697d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga36529c278ef716986151d58d151d697d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00171.html#ga36529c278ef716986151d58d151d697d\">closestPointOnLine</a> (vec&lt; 3, T, Q &gt; const &amp;point, vec&lt; 3, T, Q &gt; const &amp;a, vec&lt; 3, T, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:ga36529c278ef716986151d58d151d697d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Find the point on a straight line which is the closet of a point.  <a href=\"a00171.html#ga36529c278ef716986151d58d151d697d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga36529c278ef716986151d58d151d697d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00171.html#ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\">closestPointOnLine</a> (vec&lt; 2, T, Q &gt; const &amp;point, vec&lt; 2, T, Q &gt; const &amp;a, vec&lt; 2, T, Q &gt; const &amp;b)</td></tr>\n<tr class=\"memdesc:ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2d lines work as well <br /></td></tr>\n<tr class=\"separator:ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00010.html\" title=\"GLM_GTX_closest_point \">glm/gtx/closest_point.hpp</a>&gt; to use the features of this extension. </p>\n<p>Find the point on a straight line which is the closet of a point. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga36529c278ef716986151d58d151d697d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::closestPointOnLine </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>point</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>b</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Find the point on a straight line which is the closet of a point. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00171.html\" title=\"Include <glm/gtx/closest_point.hpp> to use the features of this extension. \">GLM_GTX_closest_point</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00172.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_color_encoding</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_color_encoding<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00011.html\" title=\"GLM_GTX_color_encoding \">glm/gtx/color_encoding.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gad12f4f65022b2c80e33fcba2ced0dc48\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gad12f4f65022b2c80e33fcba2ced0dc48\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad12f4f65022b2c80e33fcba2ced0dc48\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html#gad12f4f65022b2c80e33fcba2ced0dc48\">convertD65XYZToD50XYZ</a> (vec&lt; 3, T, Q &gt; const &amp;ColorD65XYZ)</td></tr>\n<tr class=\"memdesc:gad12f4f65022b2c80e33fcba2ced0dc48\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a D65 YUV color to D50 YUV. <br /></td></tr>\n<tr class=\"separator:gad12f4f65022b2c80e33fcba2ced0dc48\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5265386fc3ac29e4c580d37ed470859c\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga5265386fc3ac29e4c580d37ed470859c\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5265386fc3ac29e4c580d37ed470859c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html#ga5265386fc3ac29e4c580d37ed470859c\">convertD65XYZToLinearSRGB</a> (vec&lt; 3, T, Q &gt; const &amp;ColorD65XYZ)</td></tr>\n<tr class=\"memdesc:ga5265386fc3ac29e4c580d37ed470859c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a D65 YUV color to linear sRGB. <br /></td></tr>\n<tr class=\"separator:ga5265386fc3ac29e4c580d37ed470859c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1522ba180e3d83d554a734056da031f9\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga1522ba180e3d83d554a734056da031f9\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1522ba180e3d83d554a734056da031f9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html#ga1522ba180e3d83d554a734056da031f9\">convertLinearSRGBToD50XYZ</a> (vec&lt; 3, T, Q &gt; const &amp;ColorLinearSRGB)</td></tr>\n<tr class=\"memdesc:ga1522ba180e3d83d554a734056da031f9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a linear sRGB color to D50 YUV. <br /></td></tr>\n<tr class=\"separator:ga1522ba180e3d83d554a734056da031f9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf9e130d9d4ccf51cc99317de7449f369\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaf9e130d9d4ccf51cc99317de7449f369\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf9e130d9d4ccf51cc99317de7449f369\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00172.html#gaf9e130d9d4ccf51cc99317de7449f369\">convertLinearSRGBToD65XYZ</a> (vec&lt; 3, T, Q &gt; const &amp;ColorLinearSRGB)</td></tr>\n<tr class=\"memdesc:gaf9e130d9d4ccf51cc99317de7449f369\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a linear sRGB color to D65 YUV. <br /></td></tr>\n<tr class=\"separator:gaf9e130d9d4ccf51cc99317de7449f369\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00011.html\" title=\"GLM_GTX_color_encoding \">glm/gtx/color_encoding.hpp</a>&gt; to use the features of this extension. </p>\n<p>Allow to perform bit operations on integer values </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00173.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_color_space</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_color_space<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00013.html\" title=\"GLM_GTX_color_space \">glm/gtx/color_space.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga789802bec2d4fe0f9741c731b4a8a7d8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga789802bec2d4fe0f9741c731b4a8a7d8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#ga789802bec2d4fe0f9741c731b4a8a7d8\">hsvColor</a> (vec&lt; 3, T, Q &gt; const &amp;rgbValue)</td></tr>\n<tr class=\"memdesc:ga789802bec2d4fe0f9741c731b4a8a7d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a color from RGB color space to its color in HSV color space.  <a href=\"a00173.html#ga789802bec2d4fe0f9741c731b4a8a7d8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga789802bec2d4fe0f9741c731b4a8a7d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad028e0a4f1a9c812b39439b746295b34\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad028e0a4f1a9c812b39439b746295b34\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#gad028e0a4f1a9c812b39439b746295b34\">luminosity</a> (vec&lt; 3, T, Q &gt; const &amp;color)</td></tr>\n<tr class=\"memdesc:gad028e0a4f1a9c812b39439b746295b34\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals.  <a href=\"a00173.html#gad028e0a4f1a9c812b39439b746295b34\">More...</a><br /></td></tr>\n<tr class=\"separator:gad028e0a4f1a9c812b39439b746295b34\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f9193be46f45f0655c05a0cdca006db\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5f9193be46f45f0655c05a0cdca006db\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">rgbColor</a> (vec&lt; 3, T, Q &gt; const &amp;hsvValue)</td></tr>\n<tr class=\"memdesc:ga5f9193be46f45f0655c05a0cdca006db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a color from HSV color space to its color in RGB color space.  <a href=\"a00173.html#ga5f9193be46f45f0655c05a0cdca006db\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f9193be46f45f0655c05a0cdca006db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga01a97152b44e1550edcac60bd849e884\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga01a97152b44e1550edcac60bd849e884\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#ga01a97152b44e1550edcac60bd849e884\">saturation</a> (T const s)</td></tr>\n<tr class=\"memdesc:ga01a97152b44e1550edcac60bd849e884\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a saturation matrix.  <a href=\"a00173.html#ga01a97152b44e1550edcac60bd849e884\">More...</a><br /></td></tr>\n<tr class=\"separator:ga01a97152b44e1550edcac60bd849e884\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2156cea600e90148ece5bc96fd6db43a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2156cea600e90148ece5bc96fd6db43a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#ga2156cea600e90148ece5bc96fd6db43a\">saturation</a> (T const s, vec&lt; 3, T, Q &gt; const &amp;color)</td></tr>\n<tr class=\"memdesc:ga2156cea600e90148ece5bc96fd6db43a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modify the saturation of a color.  <a href=\"a00173.html#ga2156cea600e90148ece5bc96fd6db43a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2156cea600e90148ece5bc96fd6db43a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaba0eacee0736dae860e9371cc1ae4785\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaba0eacee0736dae860e9371cc1ae4785\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00173.html#gaba0eacee0736dae860e9371cc1ae4785\">saturation</a> (T const s, vec&lt; 4, T, Q &gt; const &amp;color)</td></tr>\n<tr class=\"memdesc:gaba0eacee0736dae860e9371cc1ae4785\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modify the saturation of a color.  <a href=\"a00173.html#gaba0eacee0736dae860e9371cc1ae4785\">More...</a><br /></td></tr>\n<tr class=\"separator:gaba0eacee0736dae860e9371cc1ae4785\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00013.html\" title=\"GLM_GTX_color_space \">glm/gtx/color_space.hpp</a>&gt; to use the features of this extension. </p>\n<p>Related to RGB to HSV conversions and operations. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga789802bec2d4fe0f9741c731b4a8a7d8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::hsvColor </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rgbValue</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a color from RGB color space to its color in HSV color space. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00173.html\" title=\"Include <glm/gtx/color_space.hpp> to use the features of this extension. \">GLM_GTX_color_space</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad028e0a4f1a9c812b39439b746295b34\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::luminosity </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>color</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00173.html\" title=\"Include <glm/gtx/color_space.hpp> to use the features of this extension. \">GLM_GTX_color_space</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5f9193be46f45f0655c05a0cdca006db\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::rgbColor </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>hsvValue</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a color from HSV color space to its color in RGB color space. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00173.html\" title=\"Include <glm/gtx/color_space.hpp> to use the features of this extension. \">GLM_GTX_color_space</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga01a97152b44e1550edcac60bd849e884\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::saturation </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const&#160;</td>\n          <td class=\"paramname\"><em>s</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a saturation matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00173.html\" title=\"Include <glm/gtx/color_space.hpp> to use the features of this extension. \">GLM_GTX_color_space</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2156cea600e90148ece5bc96fd6db43a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::saturation </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const&#160;</td>\n          <td class=\"paramname\"><em>s</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>color</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modify the saturation of a color. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00173.html\" title=\"Include <glm/gtx/color_space.hpp> to use the features of this extension. \">GLM_GTX_color_space</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaba0eacee0736dae860e9371cc1ae4785\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, T, Q&gt; glm::saturation </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const&#160;</td>\n          <td class=\"paramname\"><em>s</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>color</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modify the saturation of a color. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00173.html\" title=\"Include <glm/gtx/color_space.hpp> to use the features of this extension. \">GLM_GTX_color_space</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00174.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_color_space_YCoCg</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_color_space_YCoCg<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00014.html\" title=\"GLM_GTX_color_space_YCoCg \">glm/gtx/color_space_YCoCg.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0606353ec2a9b9eaa84f1b02ec391bc5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0606353ec2a9b9eaa84f1b02ec391bc5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html#ga0606353ec2a9b9eaa84f1b02ec391bc5\">rgb2YCoCg</a> (vec&lt; 3, T, Q &gt; const &amp;rgbColor)</td></tr>\n<tr class=\"memdesc:ga0606353ec2a9b9eaa84f1b02ec391bc5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a color from RGB color space to YCoCg color space.  <a href=\"a00174.html#ga0606353ec2a9b9eaa84f1b02ec391bc5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0606353ec2a9b9eaa84f1b02ec391bc5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0389772e44ca0fd2ba4a79bdd8efe898\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0389772e44ca0fd2ba4a79bdd8efe898\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html#ga0389772e44ca0fd2ba4a79bdd8efe898\">rgb2YCoCgR</a> (vec&lt; 3, T, Q &gt; const &amp;rgbColor)</td></tr>\n<tr class=\"memdesc:ga0389772e44ca0fd2ba4a79bdd8efe898\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a color from RGB color space to YCoCgR color space.  <a href=\"a00174.html#ga0389772e44ca0fd2ba4a79bdd8efe898\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0389772e44ca0fd2ba4a79bdd8efe898\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga163596b804c7241810b2534a99eb1343\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga163596b804c7241810b2534a99eb1343\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html#ga163596b804c7241810b2534a99eb1343\">YCoCg2rgb</a> (vec&lt; 3, T, Q &gt; const &amp;YCoCgColor)</td></tr>\n<tr class=\"memdesc:ga163596b804c7241810b2534a99eb1343\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a color from YCoCg color space to RGB color space.  <a href=\"a00174.html#ga163596b804c7241810b2534a99eb1343\">More...</a><br /></td></tr>\n<tr class=\"separator:ga163596b804c7241810b2534a99eb1343\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf8d30574c8576838097d8e20c295384a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf8d30574c8576838097d8e20c295384a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00174.html#gaf8d30574c8576838097d8e20c295384a\">YCoCgR2rgb</a> (vec&lt; 3, T, Q &gt; const &amp;YCoCgColor)</td></tr>\n<tr class=\"memdesc:gaf8d30574c8576838097d8e20c295384a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a color from YCoCgR color space to RGB color space.  <a href=\"a00174.html#gaf8d30574c8576838097d8e20c295384a\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf8d30574c8576838097d8e20c295384a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00014.html\" title=\"GLM_GTX_color_space_YCoCg \">glm/gtx/color_space_YCoCg.hpp</a>&gt; to use the features of this extension. </p>\n<p>RGB to YCoCg conversions and operations </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga0606353ec2a9b9eaa84f1b02ec391bc5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::rgb2YCoCg </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rgbColor</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a color from RGB color space to YCoCg color space. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00174.html\" title=\"Include <glm/gtx/color_space_YCoCg.hpp> to use the features of this extension. \">GLM_GTX_color_space_YCoCg</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0389772e44ca0fd2ba4a79bdd8efe898\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::rgb2YCoCgR </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rgbColor</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a color from RGB color space to YCoCgR color space. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>\"YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range\" </dd>\n<dd>\n<a class=\"el\" href=\"a00174.html\" title=\"Include <glm/gtx/color_space_YCoCg.hpp> to use the features of this extension. \">GLM_GTX_color_space_YCoCg</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga163596b804c7241810b2534a99eb1343\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::YCoCg2rgb </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>YCoCgColor</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a color from YCoCg color space to RGB color space. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00174.html\" title=\"Include <glm/gtx/color_space_YCoCg.hpp> to use the features of this extension. \">GLM_GTX_color_space_YCoCg</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf8d30574c8576838097d8e20c295384a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::YCoCgR2rgb </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>YCoCgColor</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a color from YCoCgR color space to RGB color space. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>\"YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range\" </dd>\n<dd>\n<a class=\"el\" href=\"a00174.html\" title=\"Include <glm/gtx/color_space_YCoCg.hpp> to use the features of this extension. \">GLM_GTX_color_space_YCoCg</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00175.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_common</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_common<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00016.html\" title=\"GLM_GTX_common \">glm/gtx/common.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gae5e80425df9833164ad469e83b475fb4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae5e80425df9833164ad469e83b475fb4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00175.html#gae5e80425df9833164ad469e83b475fb4\">fmod</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gae5e80425df9833164ad469e83b475fb4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Similar to 'mod' but with a different rounding and integer support.  <a href=\"a00175.html#gae5e80425df9833164ad469e83b475fb4\">More...</a><br /></td></tr>\n<tr class=\"separator:gae5e80425df9833164ad469e83b475fb4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74aa7c7462245d83bd5a9edf9c6c2d91\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga74aa7c7462245d83bd5a9edf9c6c2d91\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::bool_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00175.html#ga74aa7c7462245d83bd5a9edf9c6c2d91\">isdenormal</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga74aa7c7462245d83bd5a9edf9c6c2d91\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if x is a denormalized number Numbers whose absolute value is too small to be represented in the normal format are represented in an alternate, denormalized format.  <a href=\"a00175.html#ga74aa7c7462245d83bd5a9edf9c6c2d91\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74aa7c7462245d83bd5a9edf9c6c2d91\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00016.html\" title=\"GLM_GTX_common \">glm/gtx/common.hpp</a>&gt; to use the features of this extension. </p>\n<p>Provide functions to increase the compatibility with Cg and HLSL languages </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gae5e80425df9833164ad469e83b475fb4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fmod </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Similar to 'mod' but with a different rounding and integer support. </p>\n<p>Returns 'x - y * trunc(x/y)' instead of 'x - y * floor(x/y)'</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://stackoverflow.com/questions/7610631/glsl-mod-vs-hlsl-fmod\">GLSL mod vs HLSL fmod</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga74aa7c7462245d83bd5a9edf9c6c2d91\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType::bool_type glm::isdenormal </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if x is a denormalized number Numbers whose absolute value is too small to be represented in the normal format are represented in an alternate, denormalized format. </p>\n<p>This format is less precise but can represent values closer to zero.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Floating-point scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml\">GLSL isnan man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.3 Common Functions</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00176.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_compatibility</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a> &#124;\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_compatibility<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00017.html\" title=\"GLM_GTX_compatibility \">glm/gtx/compatibility.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gaddcd7aa2e30e61af5b38660613d3979e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaddcd7aa2e30e61af5b38660613d3979e\"></a>\ntypedef bool&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaddcd7aa2e30e61af5b38660613d3979e\">bool1</a></td></tr>\n<tr class=\"memdesc:gaddcd7aa2e30e61af5b38660613d3979e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean type with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaddcd7aa2e30e61af5b38660613d3979e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f895c936f0c29c8729afbbf22806090\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7f895c936f0c29c8729afbbf22806090\"></a>\ntypedef bool&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga7f895c936f0c29c8729afbbf22806090\">bool1x1</a></td></tr>\n<tr class=\"memdesc:ga7f895c936f0c29c8729afbbf22806090\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga7f895c936f0c29c8729afbbf22806090\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa09ab65ec9c3c54305ff502e2b1fe6d9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa09ab65ec9c3c54305ff502e2b1fe6d9\"></a>\ntypedef vec&lt; 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaa09ab65ec9c3c54305ff502e2b1fe6d9\">bool2</a></td></tr>\n<tr class=\"memdesc:gaa09ab65ec9c3c54305ff502e2b1fe6d9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean type with 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaa09ab65ec9c3c54305ff502e2b1fe6d9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadb3703955e513632f98ba12fe051ba3e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gadb3703955e513632f98ba12fe051ba3e\"></a>\ntypedef mat&lt; 2, 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gadb3703955e513632f98ba12fe051ba3e\">bool2x2</a></td></tr>\n<tr class=\"memdesc:gadb3703955e513632f98ba12fe051ba3e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gadb3703955e513632f98ba12fe051ba3e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ae6ee155d0f90cb1ae5b6c4546738a0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9ae6ee155d0f90cb1ae5b6c4546738a0\"></a>\ntypedef mat&lt; 2, 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga9ae6ee155d0f90cb1ae5b6c4546738a0\">bool2x3</a></td></tr>\n<tr class=\"memdesc:ga9ae6ee155d0f90cb1ae5b6c4546738a0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga9ae6ee155d0f90cb1ae5b6c4546738a0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d7fa65be8e8e4ad6d920b45c44e471f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4d7fa65be8e8e4ad6d920b45c44e471f\"></a>\ntypedef mat&lt; 2, 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4d7fa65be8e8e4ad6d920b45c44e471f\">bool2x4</a></td></tr>\n<tr class=\"memdesc:ga4d7fa65be8e8e4ad6d920b45c44e471f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga4d7fa65be8e8e4ad6d920b45c44e471f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99629f818737f342204071ef8296b2ed\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga99629f818737f342204071ef8296b2ed\"></a>\ntypedef vec&lt; 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga99629f818737f342204071ef8296b2ed\">bool3</a></td></tr>\n<tr class=\"memdesc:ga99629f818737f342204071ef8296b2ed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean type with 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga99629f818737f342204071ef8296b2ed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7d7311f7e0fa8b6163d96dab033a755\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac7d7311f7e0fa8b6163d96dab033a755\"></a>\ntypedef mat&lt; 3, 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac7d7311f7e0fa8b6163d96dab033a755\">bool3x2</a></td></tr>\n<tr class=\"memdesc:gac7d7311f7e0fa8b6163d96dab033a755\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gac7d7311f7e0fa8b6163d96dab033a755\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c97b99aac3e302053ffb58aace9033c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6c97b99aac3e302053ffb58aace9033c\"></a>\ntypedef mat&lt; 3, 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga6c97b99aac3e302053ffb58aace9033c\">bool3x3</a></td></tr>\n<tr class=\"memdesc:ga6c97b99aac3e302053ffb58aace9033c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga6c97b99aac3e302053ffb58aace9033c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae7d6b679463d37d6c527d478fb470fdf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae7d6b679463d37d6c527d478fb470fdf\"></a>\ntypedef mat&lt; 3, 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gae7d6b679463d37d6c527d478fb470fdf\">bool3x4</a></td></tr>\n<tr class=\"memdesc:gae7d6b679463d37d6c527d478fb470fdf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gae7d6b679463d37d6c527d478fb470fdf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga13c3200b82708f73faac6d7f09ec91a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga13c3200b82708f73faac6d7f09ec91a3\"></a>\ntypedef vec&lt; 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga13c3200b82708f73faac6d7f09ec91a3\">bool4</a></td></tr>\n<tr class=\"memdesc:ga13c3200b82708f73faac6d7f09ec91a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean type with 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga13c3200b82708f73faac6d7f09ec91a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ed830f52408b2f83c085063a3eaf1d0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9ed830f52408b2f83c085063a3eaf1d0\"></a>\ntypedef mat&lt; 4, 2, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga9ed830f52408b2f83c085063a3eaf1d0\">bool4x2</a></td></tr>\n<tr class=\"memdesc:ga9ed830f52408b2f83c085063a3eaf1d0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga9ed830f52408b2f83c085063a3eaf1d0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad0f5dc7f22c2065b1b06d57f1c0658fe\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad0f5dc7f22c2065b1b06d57f1c0658fe\"></a>\ntypedef mat&lt; 4, 3, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gad0f5dc7f22c2065b1b06d57f1c0658fe\">bool4x3</a></td></tr>\n<tr class=\"memdesc:gad0f5dc7f22c2065b1b06d57f1c0658fe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gad0f5dc7f22c2065b1b06d57f1c0658fe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7d2a7d13986602ae2896bfaa394235d4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga7d2a7d13986602ae2896bfaa394235d4\"></a>\ntypedef mat&lt; 4, 4, bool, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga7d2a7d13986602ae2896bfaa394235d4\">bool4x4</a></td></tr>\n<tr class=\"memdesc:ga7d2a7d13986602ae2896bfaa394235d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga7d2a7d13986602ae2896bfaa394235d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20b861a9b6e2a300323671c57a02525b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga20b861a9b6e2a300323671c57a02525b\"></a>\ntypedef double&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga20b861a9b6e2a300323671c57a02525b\">double1</a></td></tr>\n<tr class=\"memdesc:ga20b861a9b6e2a300323671c57a02525b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga20b861a9b6e2a300323671c57a02525b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga45f16a4dd0db1f199afaed9fd12fe9a8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga45f16a4dd0db1f199afaed9fd12fe9a8\"></a>\ntypedef double&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga45f16a4dd0db1f199afaed9fd12fe9a8\">double1x1</a></td></tr>\n<tr class=\"memdesc:ga45f16a4dd0db1f199afaed9fd12fe9a8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga45f16a4dd0db1f199afaed9fd12fe9a8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31b729b04facccda73f07ed26958b3c2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga31b729b04facccda73f07ed26958b3c2\"></a>\ntypedef vec&lt; 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga31b729b04facccda73f07ed26958b3c2\">double2</a></td></tr>\n<tr class=\"memdesc:ga31b729b04facccda73f07ed26958b3c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga31b729b04facccda73f07ed26958b3c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae57d0201096834d25f2b91b319e7cdbd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae57d0201096834d25f2b91b319e7cdbd\"></a>\ntypedef mat&lt; 2, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gae57d0201096834d25f2b91b319e7cdbd\">double2x2</a></td></tr>\n<tr class=\"memdesc:gae57d0201096834d25f2b91b319e7cdbd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gae57d0201096834d25f2b91b319e7cdbd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3655bc324008553ca61f39952d0b2d08\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3655bc324008553ca61f39952d0b2d08\"></a>\ntypedef mat&lt; 2, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga3655bc324008553ca61f39952d0b2d08\">double2x3</a></td></tr>\n<tr class=\"memdesc:ga3655bc324008553ca61f39952d0b2d08\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga3655bc324008553ca61f39952d0b2d08\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacd33061fc64a7b2dcfd7322c49d9557a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gacd33061fc64a7b2dcfd7322c49d9557a\"></a>\ntypedef mat&lt; 2, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gacd33061fc64a7b2dcfd7322c49d9557a\">double2x4</a></td></tr>\n<tr class=\"memdesc:gacd33061fc64a7b2dcfd7322c49d9557a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gacd33061fc64a7b2dcfd7322c49d9557a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3d8b9028a1053a44a98902cd1c389472\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga3d8b9028a1053a44a98902cd1c389472\"></a>\ntypedef vec&lt; 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga3d8b9028a1053a44a98902cd1c389472\">double3</a></td></tr>\n<tr class=\"memdesc:ga3d8b9028a1053a44a98902cd1c389472\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga3d8b9028a1053a44a98902cd1c389472\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5ec08fc39c9d783dfcc488be240fe975\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5ec08fc39c9d783dfcc488be240fe975\"></a>\ntypedef mat&lt; 3, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga5ec08fc39c9d783dfcc488be240fe975\">double3x2</a></td></tr>\n<tr class=\"memdesc:ga5ec08fc39c9d783dfcc488be240fe975\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga5ec08fc39c9d783dfcc488be240fe975\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4bad5bb20c6ddaecfe4006c93841d180\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4bad5bb20c6ddaecfe4006c93841d180\"></a>\ntypedef mat&lt; 3, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4bad5bb20c6ddaecfe4006c93841d180\">double3x3</a></td></tr>\n<tr class=\"memdesc:ga4bad5bb20c6ddaecfe4006c93841d180\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga4bad5bb20c6ddaecfe4006c93841d180\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ef022e453d663d70aec414b2a80f756\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga2ef022e453d663d70aec414b2a80f756\"></a>\ntypedef mat&lt; 3, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga2ef022e453d663d70aec414b2a80f756\">double3x4</a></td></tr>\n<tr class=\"memdesc:ga2ef022e453d663d70aec414b2a80f756\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga2ef022e453d663d70aec414b2a80f756\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf92f58af24f35617518aeb3d4f63fda6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf92f58af24f35617518aeb3d4f63fda6\"></a>\ntypedef vec&lt; 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaf92f58af24f35617518aeb3d4f63fda6\">double4</a></td></tr>\n<tr class=\"memdesc:gaf92f58af24f35617518aeb3d4f63fda6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaf92f58af24f35617518aeb3d4f63fda6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabca29ccceea53669618b751aae0ba83d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gabca29ccceea53669618b751aae0ba83d\"></a>\ntypedef mat&lt; 4, 2, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gabca29ccceea53669618b751aae0ba83d\">double4x2</a></td></tr>\n<tr class=\"memdesc:gabca29ccceea53669618b751aae0ba83d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gabca29ccceea53669618b751aae0ba83d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafad66a02ccd360c86d6ab9ff9cfbc19c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafad66a02ccd360c86d6ab9ff9cfbc19c\"></a>\ntypedef mat&lt; 4, 3, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gafad66a02ccd360c86d6ab9ff9cfbc19c\">double4x3</a></td></tr>\n<tr class=\"memdesc:gafad66a02ccd360c86d6ab9ff9cfbc19c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gafad66a02ccd360c86d6ab9ff9cfbc19c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaab541bed2e788e4537852a2492860806\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaab541bed2e788e4537852a2492860806\"></a>\ntypedef mat&lt; 4, 4, double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaab541bed2e788e4537852a2492860806\">double4x4</a></td></tr>\n<tr class=\"memdesc:gaab541bed2e788e4537852a2492860806\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">double-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaab541bed2e788e4537852a2492860806\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5208d01f6c6fbcb7bb55d610b9c0ead\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaf5208d01f6c6fbcb7bb55d610b9c0ead\"></a>\ntypedef float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaf5208d01f6c6fbcb7bb55d610b9c0ead\">float1</a></td></tr>\n<tr class=\"memdesc:gaf5208d01f6c6fbcb7bb55d610b9c0ead\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaf5208d01f6c6fbcb7bb55d610b9c0ead\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73720b8dc4620835b17f74d428f98c0c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga73720b8dc4620835b17f74d428f98c0c\"></a>\ntypedef float&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga73720b8dc4620835b17f74d428f98c0c\">float1x1</a></td></tr>\n<tr class=\"memdesc:ga73720b8dc4620835b17f74d428f98c0c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga73720b8dc4620835b17f74d428f98c0c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga02d3c013982c183906c61d74aa3166ce\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga02d3c013982c183906c61d74aa3166ce\"></a>\ntypedef vec&lt; 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga02d3c013982c183906c61d74aa3166ce\">float2</a></td></tr>\n<tr class=\"memdesc:ga02d3c013982c183906c61d74aa3166ce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga02d3c013982c183906c61d74aa3166ce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga33d43ecbb60a85a1366ff83f8a0ec85f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga33d43ecbb60a85a1366ff83f8a0ec85f\"></a>\ntypedef mat&lt; 2, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga33d43ecbb60a85a1366ff83f8a0ec85f\">float2x2</a></td></tr>\n<tr class=\"memdesc:ga33d43ecbb60a85a1366ff83f8a0ec85f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga33d43ecbb60a85a1366ff83f8a0ec85f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga939b0cff15cee3030f75c1b2e36f89fe\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga939b0cff15cee3030f75c1b2e36f89fe\"></a>\ntypedef mat&lt; 2, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga939b0cff15cee3030f75c1b2e36f89fe\">float2x3</a></td></tr>\n<tr class=\"memdesc:ga939b0cff15cee3030f75c1b2e36f89fe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga939b0cff15cee3030f75c1b2e36f89fe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafec3cfd901ab334a92e0242b8f2269b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafec3cfd901ab334a92e0242b8f2269b4\"></a>\ntypedef mat&lt; 2, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gafec3cfd901ab334a92e0242b8f2269b4\">float2x4</a></td></tr>\n<tr class=\"memdesc:gafec3cfd901ab334a92e0242b8f2269b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gafec3cfd901ab334a92e0242b8f2269b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga821ff110fc8533a053cbfcc93e078cc0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga821ff110fc8533a053cbfcc93e078cc0\"></a>\ntypedef vec&lt; 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga821ff110fc8533a053cbfcc93e078cc0\">float3</a></td></tr>\n<tr class=\"memdesc:ga821ff110fc8533a053cbfcc93e078cc0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga821ff110fc8533a053cbfcc93e078cc0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa6c69f04ba95f3faedf95dae874de576\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa6c69f04ba95f3faedf95dae874de576\"></a>\ntypedef mat&lt; 3, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaa6c69f04ba95f3faedf95dae874de576\">float3x2</a></td></tr>\n<tr class=\"memdesc:gaa6c69f04ba95f3faedf95dae874de576\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaa6c69f04ba95f3faedf95dae874de576\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6ceb5d38a58becdf420026e12a6562f3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga6ceb5d38a58becdf420026e12a6562f3\"></a>\ntypedef mat&lt; 3, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga6ceb5d38a58becdf420026e12a6562f3\">float3x3</a></td></tr>\n<tr class=\"memdesc:ga6ceb5d38a58becdf420026e12a6562f3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga6ceb5d38a58becdf420026e12a6562f3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d2679c321b793ca3784fe0315bb5332\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4d2679c321b793ca3784fe0315bb5332\"></a>\ntypedef mat&lt; 3, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4d2679c321b793ca3784fe0315bb5332\">float3x4</a></td></tr>\n<tr class=\"memdesc:ga4d2679c321b793ca3784fe0315bb5332\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga4d2679c321b793ca3784fe0315bb5332\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae2da7345087db3815a25d8837a727ef1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae2da7345087db3815a25d8837a727ef1\"></a>\ntypedef vec&lt; 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gae2da7345087db3815a25d8837a727ef1\">float4</a></td></tr>\n<tr class=\"memdesc:gae2da7345087db3815a25d8837a727ef1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gae2da7345087db3815a25d8837a727ef1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga308b9af0c221145bcfe9bfc129d9098e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga308b9af0c221145bcfe9bfc129d9098e\"></a>\ntypedef mat&lt; 4, 2, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga308b9af0c221145bcfe9bfc129d9098e\">float4x2</a></td></tr>\n<tr class=\"memdesc:ga308b9af0c221145bcfe9bfc129d9098e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga308b9af0c221145bcfe9bfc129d9098e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac0a51b4812038aa81d73ffcc37f741ac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac0a51b4812038aa81d73ffcc37f741ac\"></a>\ntypedef mat&lt; 4, 3, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac0a51b4812038aa81d73ffcc37f741ac\">float4x3</a></td></tr>\n<tr class=\"memdesc:gac0a51b4812038aa81d73ffcc37f741ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gac0a51b4812038aa81d73ffcc37f741ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad3051649b3715d828a4ab92cdae7c3bf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gad3051649b3715d828a4ab92cdae7c3bf\"></a>\ntypedef mat&lt; 4, 4, float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gad3051649b3715d828a4ab92cdae7c3bf\">float4x4</a></td></tr>\n<tr class=\"memdesc:gad3051649b3715d828a4ab92cdae7c3bf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">single-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gad3051649b3715d828a4ab92cdae7c3bf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0670a2111b5e4a6410bd027fa0232fc3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga0670a2111b5e4a6410bd027fa0232fc3\"></a>\ntypedef int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga0670a2111b5e4a6410bd027fa0232fc3\">int1</a></td></tr>\n<tr class=\"memdesc:ga0670a2111b5e4a6410bd027fa0232fc3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer vector with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga0670a2111b5e4a6410bd027fa0232fc3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga056ffe02d3a45af626f8e62221881c7a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga056ffe02d3a45af626f8e62221881c7a\"></a>\ntypedef int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga056ffe02d3a45af626f8e62221881c7a\">int1x1</a></td></tr>\n<tr class=\"memdesc:ga056ffe02d3a45af626f8e62221881c7a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 1 component. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga056ffe02d3a45af626f8e62221881c7a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafe3a8fd56354caafe24bfe1b1e3ad22a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gafe3a8fd56354caafe24bfe1b1e3ad22a\"></a>\ntypedef vec&lt; 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gafe3a8fd56354caafe24bfe1b1e3ad22a\">int2</a></td></tr>\n<tr class=\"memdesc:gafe3a8fd56354caafe24bfe1b1e3ad22a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer vector with 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gafe3a8fd56354caafe24bfe1b1e3ad22a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4e5ce477c15836b21e3c42daac68554d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga4e5ce477c15836b21e3c42daac68554d\"></a>\ntypedef mat&lt; 2, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4e5ce477c15836b21e3c42daac68554d\">int2x2</a></td></tr>\n<tr class=\"memdesc:ga4e5ce477c15836b21e3c42daac68554d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga4e5ce477c15836b21e3c42daac68554d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga197ded5ad8354f6b6fb91189d7a269b3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga197ded5ad8354f6b6fb91189d7a269b3\"></a>\ntypedef mat&lt; 2, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga197ded5ad8354f6b6fb91189d7a269b3\">int2x3</a></td></tr>\n<tr class=\"memdesc:ga197ded5ad8354f6b6fb91189d7a269b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga197ded5ad8354f6b6fb91189d7a269b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2749d59a7fddbac44f34ba78e57ef807\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga2749d59a7fddbac44f34ba78e57ef807\"></a>\ntypedef mat&lt; 2, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga2749d59a7fddbac44f34ba78e57ef807\">int2x4</a></td></tr>\n<tr class=\"memdesc:ga2749d59a7fddbac44f34ba78e57ef807\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga2749d59a7fddbac44f34ba78e57ef807\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga909c38a425f215a50c847145d7da09f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga909c38a425f215a50c847145d7da09f0\"></a>\ntypedef vec&lt; 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga909c38a425f215a50c847145d7da09f0\">int3</a></td></tr>\n<tr class=\"memdesc:ga909c38a425f215a50c847145d7da09f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer vector with 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga909c38a425f215a50c847145d7da09f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4cbe16a92cf3664376c7a2fc5126aa8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaa4cbe16a92cf3664376c7a2fc5126aa8\"></a>\ntypedef mat&lt; 3, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaa4cbe16a92cf3664376c7a2fc5126aa8\">int3x2</a></td></tr>\n<tr class=\"memdesc:gaa4cbe16a92cf3664376c7a2fc5126aa8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaa4cbe16a92cf3664376c7a2fc5126aa8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga15c9649286f0bf431bdf9b3509580048\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga15c9649286f0bf431bdf9b3509580048\"></a>\ntypedef mat&lt; 3, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga15c9649286f0bf431bdf9b3509580048\">int3x3</a></td></tr>\n<tr class=\"memdesc:ga15c9649286f0bf431bdf9b3509580048\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga15c9649286f0bf431bdf9b3509580048\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaacac46ddc7d15d0f9529d05c92946a0f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaacac46ddc7d15d0f9529d05c92946a0f\"></a>\ntypedef mat&lt; 3, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaacac46ddc7d15d0f9529d05c92946a0f\">int3x4</a></td></tr>\n<tr class=\"memdesc:gaacac46ddc7d15d0f9529d05c92946a0f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaacac46ddc7d15d0f9529d05c92946a0f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaecdef18c819c205aeee9f94dc93de56a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gaecdef18c819c205aeee9f94dc93de56a\"></a>\ntypedef vec&lt; 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaecdef18c819c205aeee9f94dc93de56a\">int4</a></td></tr>\n<tr class=\"memdesc:gaecdef18c819c205aeee9f94dc93de56a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer vector with 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gaecdef18c819c205aeee9f94dc93de56a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97a39dd9bc7d572810d80b8467cbffa1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga97a39dd9bc7d572810d80b8467cbffa1\"></a>\ntypedef mat&lt; 4, 2, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga97a39dd9bc7d572810d80b8467cbffa1\">int4x2</a></td></tr>\n<tr class=\"memdesc:ga97a39dd9bc7d572810d80b8467cbffa1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga97a39dd9bc7d572810d80b8467cbffa1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae4a2c53f14aeec9a17c2b81142b7e82d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae4a2c53f14aeec9a17c2b81142b7e82d\"></a>\ntypedef mat&lt; 4, 3, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gae4a2c53f14aeec9a17c2b81142b7e82d\">int4x3</a></td></tr>\n<tr class=\"memdesc:gae4a2c53f14aeec9a17c2b81142b7e82d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:gae4a2c53f14aeec9a17c2b81142b7e82d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04dee1552424198b8f58b377c2ee00d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga04dee1552424198b8f58b377c2ee00d8\"></a>\ntypedef mat&lt; 4, 4, int, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga04dee1552424198b8f58b377c2ee00d8\">int4x4</a></td></tr>\n<tr class=\"memdesc:ga04dee1552424198b8f58b377c2ee00d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) <br /></td></tr>\n<tr class=\"separator:ga04dee1552424198b8f58b377c2ee00d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gac63011205bf6d0be82589dc56dd26708\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gac63011205bf6d0be82589dc56dd26708\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac63011205bf6d0be82589dc56dd26708\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac63011205bf6d0be82589dc56dd26708\">atan2</a> (T x, T y)</td></tr>\n<tr class=\"memdesc:gac63011205bf6d0be82589dc56dd26708\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gac63011205bf6d0be82589dc56dd26708\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga83bc41bd6f89113ee8006576b12bfc50\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga83bc41bd6f89113ee8006576b12bfc50\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga83bc41bd6f89113ee8006576b12bfc50\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga83bc41bd6f89113ee8006576b12bfc50\">atan2</a> (const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y)</td></tr>\n<tr class=\"memdesc:ga83bc41bd6f89113ee8006576b12bfc50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga83bc41bd6f89113ee8006576b12bfc50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac39314f5087e7e51e592897cabbc1927\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gac39314f5087e7e51e592897cabbc1927\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac39314f5087e7e51e592897cabbc1927\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac39314f5087e7e51e592897cabbc1927\">atan2</a> (const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y)</td></tr>\n<tr class=\"memdesc:gac39314f5087e7e51e592897cabbc1927\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gac39314f5087e7e51e592897cabbc1927\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaba86c28da7bf5bdac64fecf7d56e8ff3\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaba86c28da7bf5bdac64fecf7d56e8ff3\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaba86c28da7bf5bdac64fecf7d56e8ff3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3\">atan2</a> (const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y)</td></tr>\n<tr class=\"memdesc:gaba86c28da7bf5bdac64fecf7d56e8ff3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaba86c28da7bf5bdac64fecf7d56e8ff3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4b04dcd3526996d68c1bfe17bfc8657\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaf4b04dcd3526996d68c1bfe17bfc8657\"></a>\ntemplate&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaf4b04dcd3526996d68c1bfe17bfc8657\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaf4b04dcd3526996d68c1bfe17bfc8657\">isfinite</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf4b04dcd3526996d68c1bfe17bfc8657\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaf4b04dcd3526996d68c1bfe17bfc8657\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac3b12b8ac3014418fe53c299478b6603\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gac3b12b8ac3014418fe53c299478b6603\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac3b12b8ac3014418fe53c299478b6603\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 1, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gac3b12b8ac3014418fe53c299478b6603\">isfinite</a> (const vec&lt; 1, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:gac3b12b8ac3014418fe53c299478b6603\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gac3b12b8ac3014418fe53c299478b6603\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e76dc3e406ce6a4155c2b12a2e4b084\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga8e76dc3e406ce6a4155c2b12a2e4b084\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8e76dc3e406ce6a4155c2b12a2e4b084\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga8e76dc3e406ce6a4155c2b12a2e4b084\">isfinite</a> (const vec&lt; 2, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga8e76dc3e406ce6a4155c2b12a2e4b084\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga8e76dc3e406ce6a4155c2b12a2e4b084\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga929ef27f896d902c1771a2e5e150fc97\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga929ef27f896d902c1771a2e5e150fc97\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga929ef27f896d902c1771a2e5e150fc97\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga929ef27f896d902c1771a2e5e150fc97\">isfinite</a> (const vec&lt; 3, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga929ef27f896d902c1771a2e5e150fc97\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga929ef27f896d902c1771a2e5e150fc97\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga19925badbe10ce61df1d0de00be0b5ad\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga19925badbe10ce61df1d0de00be0b5ad\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga19925badbe10ce61df1d0de00be0b5ad\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga19925badbe10ce61df1d0de00be0b5ad\">isfinite</a> (const vec&lt; 4, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga19925badbe10ce61df1d0de00be0b5ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga19925badbe10ce61df1d0de00be0b5ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5494ba3a95ea6594c86fc75236886864\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga5494ba3a95ea6594c86fc75236886864\"></a>\ntemplate&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga5494ba3a95ea6594c86fc75236886864\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga5494ba3a95ea6594c86fc75236886864\">lerp</a> (T x, T y, T a)</td></tr>\n<tr class=\"memdesc:ga5494ba3a95ea6594c86fc75236886864\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga5494ba3a95ea6594c86fc75236886864\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa551c0a0e16d2d4608e49f7696df897f\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaa551c0a0e16d2d4608e49f7696df897f\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa551c0a0e16d2d4608e49f7696df897f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaa551c0a0e16d2d4608e49f7696df897f\">lerp</a> (const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y, T a)</td></tr>\n<tr class=\"memdesc:gaa551c0a0e16d2d4608e49f7696df897f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaa551c0a0e16d2d4608e49f7696df897f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga44a8b5fd776320f1713413dec959b32a\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga44a8b5fd776320f1713413dec959b32a\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga44a8b5fd776320f1713413dec959b32a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga44a8b5fd776320f1713413dec959b32a\">lerp</a> (const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y, T a)</td></tr>\n<tr class=\"memdesc:ga44a8b5fd776320f1713413dec959b32a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga44a8b5fd776320f1713413dec959b32a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga89ac8e000199292ec7875519d27e214b\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga89ac8e000199292ec7875519d27e214b\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga89ac8e000199292ec7875519d27e214b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga89ac8e000199292ec7875519d27e214b\">lerp</a> (const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, T a)</td></tr>\n<tr class=\"memdesc:ga89ac8e000199292ec7875519d27e214b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga89ac8e000199292ec7875519d27e214b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf68de5baf72d16135368b8ef4f841604\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaf68de5baf72d16135368b8ef4f841604\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf68de5baf72d16135368b8ef4f841604\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaf68de5baf72d16135368b8ef4f841604\">lerp</a> (const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y, const vec&lt; 2, T, Q &gt; &amp;a)</td></tr>\n<tr class=\"memdesc:gaf68de5baf72d16135368b8ef4f841604\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaf68de5baf72d16135368b8ef4f841604\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4ae1a616c8540a2649eab8e0cd051bb3\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga4ae1a616c8540a2649eab8e0cd051bb3\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4ae1a616c8540a2649eab8e0cd051bb3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga4ae1a616c8540a2649eab8e0cd051bb3\">lerp</a> (const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y, const vec&lt; 3, T, Q &gt; &amp;a)</td></tr>\n<tr class=\"memdesc:ga4ae1a616c8540a2649eab8e0cd051bb3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga4ae1a616c8540a2649eab8e0cd051bb3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab5477ab69c40de4db5d58d3359529724\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gab5477ab69c40de4db5d58d3359529724\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab5477ab69c40de4db5d58d3359529724\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gab5477ab69c40de4db5d58d3359529724\">lerp</a> (const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, const vec&lt; 4, T, Q &gt; &amp;a)</td></tr>\n<tr class=\"memdesc:gab5477ab69c40de4db5d58d3359529724\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gab5477ab69c40de4db5d58d3359529724\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0fd09e616d122bc2ed9726682ffd44b7\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga0fd09e616d122bc2ed9726682ffd44b7\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0fd09e616d122bc2ed9726682ffd44b7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga0fd09e616d122bc2ed9726682ffd44b7\">saturate</a> (T x)</td></tr>\n<tr class=\"memdesc:ga0fd09e616d122bc2ed9726682ffd44b7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga0fd09e616d122bc2ed9726682ffd44b7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaee97b8001c794a78a44f5d59f62a8aba\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gaee97b8001c794a78a44f5d59f62a8aba\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaee97b8001c794a78a44f5d59f62a8aba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#gaee97b8001c794a78a44f5d59f62a8aba\">saturate</a> (const vec&lt; 2, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:gaee97b8001c794a78a44f5d59f62a8aba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:gaee97b8001c794a78a44f5d59f62a8aba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39bfe3a421286ee31680d45c31ccc161\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga39bfe3a421286ee31680d45c31ccc161\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga39bfe3a421286ee31680d45c31ccc161\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga39bfe3a421286ee31680d45c31ccc161\">saturate</a> (const vec&lt; 3, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga39bfe3a421286ee31680d45c31ccc161\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga39bfe3a421286ee31680d45c31ccc161\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga356f8c3a7e7d6376d3d4b0a026407183\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"ga356f8c3a7e7d6376d3d4b0a026407183\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga356f8c3a7e7d6376d3d4b0a026407183\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183\">saturate</a> (const vec&lt; 4, T, Q &gt; &amp;x)</td></tr>\n<tr class=\"memdesc:ga356f8c3a7e7d6376d3d4b0a026407183\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) <br /></td></tr>\n<tr class=\"separator:ga356f8c3a7e7d6376d3d4b0a026407183\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00017.html\" title=\"GLM_GTX_compatibility \">glm/gtx/compatibility.hpp</a>&gt; to use the features of this extension. </p>\n<p>Provide functions to increase the compatibility with Cg and HLSL languages </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00177.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_component_wise</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_component_wise<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00018.html\" title=\"GLM_GTX_component_wise \">glm/gtx/component_wise.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaf71833350e15e74d31cbf8a3e7f27051\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaf71833350e15e74d31cbf8a3e7f27051\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#gaf71833350e15e74d31cbf8a3e7f27051\">compAdd</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf71833350e15e74d31cbf8a3e7f27051\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Add all vector components together.  <a href=\"a00177.html#gaf71833350e15e74d31cbf8a3e7f27051\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf71833350e15e74d31cbf8a3e7f27051\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabfa4bb19298c8c73d4217ba759c496b6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gabfa4bb19298c8c73d4217ba759c496b6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#gabfa4bb19298c8c73d4217ba759c496b6\">compMax</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:gabfa4bb19298c8c73d4217ba759c496b6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Find the maximum value between single vector components.  <a href=\"a00177.html#gabfa4bb19298c8c73d4217ba759c496b6\">More...</a><br /></td></tr>\n<tr class=\"separator:gabfa4bb19298c8c73d4217ba759c496b6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab5d0832b5c7bb01b8d7395973bfb1425\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gab5d0832b5c7bb01b8d7395973bfb1425\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#gab5d0832b5c7bb01b8d7395973bfb1425\">compMin</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:gab5d0832b5c7bb01b8d7395973bfb1425\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Find the minimum value between single vector components.  <a href=\"a00177.html#gab5d0832b5c7bb01b8d7395973bfb1425\">More...</a><br /></td></tr>\n<tr class=\"separator:gab5d0832b5c7bb01b8d7395973bfb1425\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae8ab88024197202c9479d33bdc5a8a5d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gae8ab88024197202c9479d33bdc5a8a5d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType::value_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#gae8ab88024197202c9479d33bdc5a8a5d\">compMul</a> (genType const &amp;v)</td></tr>\n<tr class=\"memdesc:gae8ab88024197202c9479d33bdc5a8a5d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Multiply all vector components together.  <a href=\"a00177.html#gae8ab88024197202c9479d33bdc5a8a5d\">More...</a><br /></td></tr>\n<tr class=\"separator:gae8ab88024197202c9479d33bdc5a8a5d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f2b81ada8515875e58cb1667b6b9908\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename floatType , length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8f2b81ada8515875e58cb1667b6b9908\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, floatType, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#ga8f2b81ada8515875e58cb1667b6b9908\">compNormalize</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga8f2b81ada8515875e58cb1667b6b9908\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert an integer vector to a normalized float vector.  <a href=\"a00177.html#ga8f2b81ada8515875e58cb1667b6b9908\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f2b81ada8515875e58cb1667b6b9908\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga80abc2980d65d675f435d178c36880eb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , typename floatType , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga80abc2980d65d675f435d178c36880eb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00177.html#ga80abc2980d65d675f435d178c36880eb\">compScale</a> (vec&lt; L, floatType, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga80abc2980d65d675f435d178c36880eb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert a normalized float vector to an integer vector.  <a href=\"a00177.html#ga80abc2980d65d675f435d178c36880eb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga80abc2980d65d675f435d178c36880eb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00018.html\" title=\"GLM_GTX_component_wise \">glm/gtx/component_wise.hpp</a>&gt; to use the features of this extension. </p>\n<p>Operations between components of a type </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaf71833350e15e74d31cbf8a3e7f27051\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType::value_type glm::compAdd </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Add all vector components together. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00177.html\" title=\"Include <glm/gtx/component_wise.hpp> to use the features of this extension. \">GLM_GTX_component_wise</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabfa4bb19298c8c73d4217ba759c496b6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType::value_type glm::compMax </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Find the maximum value between single vector components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00177.html\" title=\"Include <glm/gtx/component_wise.hpp> to use the features of this extension. \">GLM_GTX_component_wise</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab5d0832b5c7bb01b8d7395973bfb1425\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType::value_type glm::compMin </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Find the minimum value between single vector components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00177.html\" title=\"Include <glm/gtx/component_wise.hpp> to use the features of this extension. \">GLM_GTX_component_wise</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae8ab88024197202c9479d33bdc5a8a5d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType::value_type glm::compMul </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Multiply all vector components together. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00177.html\" title=\"Include <glm/gtx/component_wise.hpp> to use the features of this extension. \">GLM_GTX_component_wise</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8f2b81ada8515875e58cb1667b6b9908\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, floatType, Q&gt; glm::compNormalize </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert an integer vector to a normalized float vector. </p>\n<p>If the parameter value type is already a floating qualifier type, the value is passed through. </p><dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00177.html\" title=\"Include <glm/gtx/component_wise.hpp> to use the features of this extension. \">GLM_GTX_component_wise</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga80abc2980d65d675f435d178c36880eb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::compScale </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, floatType, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert a normalized float vector to an integer vector. </p>\n<p>If the parameter value type is already a floating qualifier type, the value is passed through. </p><dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00177.html\" title=\"Include <glm/gtx/component_wise.hpp> to use the features of this extension. \">GLM_GTX_component_wise</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00178.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_dual_quaternion</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a> &#124;\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_dual_quaternion<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00021.html\" title=\"GLM_GTX_dual_quaternion \">glm/gtx/dual_quaternion.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga3d71f98d84ba59dfe4e369fde4714cd6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_ddualquat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">ddualquat</a></td></tr>\n<tr class=\"memdesc:ga3d71f98d84ba59dfe4e369fde4714cd6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of default double-qualifier floating-point numbers.  <a href=\"a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3d71f98d84ba59dfe4e369fde4714cd6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae93abee0c979902fbec6a7bee0f6fae1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_fdualquat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">dualquat</a></td></tr>\n<tr class=\"memdesc:gae93abee0c979902fbec6a7bee0f6fae1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of floating-point numbers.  <a href=\"a00178.html#gae93abee0c979902fbec6a7bee0f6fae1\">More...</a><br /></td></tr>\n<tr class=\"separator:gae93abee0c979902fbec6a7bee0f6fae1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga237c2b9b42c9a930e49de5840ae0f930\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef highp_fdualquat&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">fdualquat</a></td></tr>\n<tr class=\"memdesc:ga237c2b9b42c9a930e49de5840ae0f930\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of single-qualifier floating-point numbers.  <a href=\"a00178.html#ga237c2b9b42c9a930e49de5840ae0f930\">More...</a><br /></td></tr>\n<tr class=\"separator:ga237c2b9b42c9a930e49de5840ae0f930\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8f67eafa7197d7a668dad5105a463d2a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; double, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga8f67eafa7197d7a668dad5105a463d2a\">highp_ddualquat</a></td></tr>\n<tr class=\"memdesc:ga8f67eafa7197d7a668dad5105a463d2a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of high double-qualifier floating-point numbers.  <a href=\"a00178.html#ga8f67eafa7197d7a668dad5105a463d2a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f67eafa7197d7a668dad5105a463d2a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ef5bf1da52a9d4932335a517086ceaf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf\">highp_dualquat</a></td></tr>\n<tr class=\"memdesc:ga9ef5bf1da52a9d4932335a517086ceaf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of high single-qualifier floating-point numbers.  <a href=\"a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9ef5bf1da52a9d4932335a517086ceaf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4c4e55e9c99dc57b299ed590968da564\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, highp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga4c4e55e9c99dc57b299ed590968da564\">highp_fdualquat</a></td></tr>\n<tr class=\"memdesc:ga4c4e55e9c99dc57b299ed590968da564\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of high single-qualifier floating-point numbers.  <a href=\"a00178.html#ga4c4e55e9c99dc57b299ed590968da564\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4c4e55e9c99dc57b299ed590968da564\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab4c5103338af3dac7e0fbc86895a3f1a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; double, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a\">lowp_ddualquat</a></td></tr>\n<tr class=\"memdesc:gab4c5103338af3dac7e0fbc86895a3f1a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of low double-qualifier floating-point numbers.  <a href=\"a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a\">More...</a><br /></td></tr>\n<tr class=\"separator:gab4c5103338af3dac7e0fbc86895a3f1a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade05d29ebd4deea0f883d0e1bb4169aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa\">lowp_dualquat</a></td></tr>\n<tr class=\"memdesc:gade05d29ebd4deea0f883d0e1bb4169aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of low single-qualifier floating-point numbers.  <a href=\"a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa\">More...</a><br /></td></tr>\n<tr class=\"separator:gade05d29ebd4deea0f883d0e1bb4169aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa38f671be25a7f3b136a452a8bb42860\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, lowp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gaa38f671be25a7f3b136a452a8bb42860\">lowp_fdualquat</a></td></tr>\n<tr class=\"memdesc:gaa38f671be25a7f3b136a452a8bb42860\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of low single-qualifier floating-point numbers.  <a href=\"a00178.html#gaa38f671be25a7f3b136a452a8bb42860\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa38f671be25a7f3b136a452a8bb42860\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0fb11e48e2d16348ccb06a25213641b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; double, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga0fb11e48e2d16348ccb06a25213641b4\">mediump_ddualquat</a></td></tr>\n<tr class=\"memdesc:ga0fb11e48e2d16348ccb06a25213641b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of medium double-qualifier floating-point numbers.  <a href=\"a00178.html#ga0fb11e48e2d16348ccb06a25213641b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0fb11e48e2d16348ccb06a25213641b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa7aeb54c167712b38f2178a1be2360ad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gaa7aeb54c167712b38f2178a1be2360ad\">mediump_dualquat</a></td></tr>\n<tr class=\"memdesc:gaa7aeb54c167712b38f2178a1be2360ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of medium single-qualifier floating-point numbers.  <a href=\"a00178.html#gaa7aeb54c167712b38f2178a1be2360ad\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa7aeb54c167712b38f2178a1be2360ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4a6b594ff7e81150d8143001367a9431\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef tdualquat&lt; float, mediump &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga4a6b594ff7e81150d8143001367a9431\">mediump_fdualquat</a></td></tr>\n<tr class=\"memdesc:ga4a6b594ff7e81150d8143001367a9431\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Dual-quaternion of medium single-qualifier floating-point numbers.  <a href=\"a00178.html#ga4a6b594ff7e81150d8143001367a9431\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4a6b594ff7e81150d8143001367a9431\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0b35c0e30df8a875dbaa751e0bd800e0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0b35c0e30df8a875dbaa751e0bd800e0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga0b35c0e30df8a875dbaa751e0bd800e0\">dual_quat_identity</a> ()</td></tr>\n<tr class=\"memdesc:ga0b35c0e30df8a875dbaa751e0bd800e0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates an identity dual quaternion.  <a href=\"a00178.html#ga0b35c0e30df8a875dbaa751e0bd800e0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0b35c0e30df8a875dbaa751e0bd800e0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac4064ff813759740201765350eac4236\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac4064ff813759740201765350eac4236\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gac4064ff813759740201765350eac4236\">dualquat_cast</a> (mat&lt; 2, 4, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gac4064ff813759740201765350eac4236\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion.  <a href=\"a00178.html#gac4064ff813759740201765350eac4236\">More...</a><br /></td></tr>\n<tr class=\"separator:gac4064ff813759740201765350eac4236\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga91025ebdca0f4ea54da08497b00e8c84\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga91025ebdca0f4ea54da08497b00e8c84\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga91025ebdca0f4ea54da08497b00e8c84\">dualquat_cast</a> (mat&lt; 3, 4, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga91025ebdca0f4ea54da08497b00e8c84\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion.  <a href=\"a00178.html#ga91025ebdca0f4ea54da08497b00e8c84\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91025ebdca0f4ea54da08497b00e8c84\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga070f521a953f6461af4ab4cf8ccbf27e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga070f521a953f6461af4ab4cf8ccbf27e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga070f521a953f6461af4ab4cf8ccbf27e\">inverse</a> (tdualquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga070f521a953f6461af4ab4cf8ccbf27e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the q inverse.  <a href=\"a00178.html#ga070f521a953f6461af4ab4cf8ccbf27e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga070f521a953f6461af4ab4cf8ccbf27e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gace8380112d16d33f520839cb35a4d173\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gace8380112d16d33f520839cb35a4d173\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gace8380112d16d33f520839cb35a4d173\">lerp</a> (tdualquat&lt; T, Q &gt; const &amp;x, tdualquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</td></tr>\n<tr class=\"memdesc:gace8380112d16d33f520839cb35a4d173\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the linear interpolation of two dual quaternion.  <a href=\"a00178.html#gace8380112d16d33f520839cb35a4d173\">More...</a><br /></td></tr>\n<tr class=\"separator:gace8380112d16d33f520839cb35a4d173\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae99d143b37f9cad4cd9285571aab685a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae99d143b37f9cad4cd9285571aab685a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gae99d143b37f9cad4cd9285571aab685a\">mat2x4_cast</a> (tdualquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae99d143b37f9cad4cd9285571aab685a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 2 * 4 matrix.  <a href=\"a00178.html#gae99d143b37f9cad4cd9285571aab685a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae99d143b37f9cad4cd9285571aab685a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf59f5bb69620d2891c3795c6f2639179\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf59f5bb69620d2891c3795c6f2639179\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#gaf59f5bb69620d2891c3795c6f2639179\">mat3x4_cast</a> (tdualquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gaf59f5bb69620d2891c3795c6f2639179\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 3 * 4 matrix.  <a href=\"a00178.html#gaf59f5bb69620d2891c3795c6f2639179\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf59f5bb69620d2891c3795c6f2639179\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga299b8641509606b1958ffa104a162cfe\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga299b8641509606b1958ffa104a162cfe\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tdualquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00178.html#ga299b8641509606b1958ffa104a162cfe\">normalize</a> (tdualquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga299b8641509606b1958ffa104a162cfe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the normalized quaternion.  <a href=\"a00178.html#ga299b8641509606b1958ffa104a162cfe\">More...</a><br /></td></tr>\n<tr class=\"separator:ga299b8641509606b1958ffa104a162cfe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00021.html\" title=\"GLM_GTX_dual_quaternion \">glm/gtx/dual_quaternion.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines a templated dual-quaternion type and several dual-quaternion operations. </p>\n<h2 class=\"groupheader\">Typedef Documentation</h2>\n<a class=\"anchor\" id=\"ga3d71f98d84ba59dfe4e369fde4714cd6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_ddualquat ddualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of default double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00260\">260</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae93abee0c979902fbec6a7bee0f6fae1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_fdualquat dualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00236\">236</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga237c2b9b42c9a930e49de5840ae0f930\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef highp_fdualquat fdualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of single-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00241\">241</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8f67eafa7197d7a668dad5105a463d2a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;double, highp&gt; highp_ddualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of high double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00229\">229</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9ef5bf1da52a9d4932335a517086ceaf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;float, highp&gt; highp_dualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of high single-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00197\">197</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4c4e55e9c99dc57b299ed590968da564\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;float, highp&gt; highp_fdualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of high single-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00213\">213</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab4c5103338af3dac7e0fbc86895a3f1a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;double, lowp&gt; lowp_ddualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of low double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00219\">219</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gade05d29ebd4deea0f883d0e1bb4169aa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;float, lowp&gt; lowp_dualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of low single-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00187\">187</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa38f671be25a7f3b136a452a8bb42860\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;float, lowp&gt; lowp_fdualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of low single-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00203\">203</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0fb11e48e2d16348ccb06a25213641b4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;double, mediump&gt; mediump_ddualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of medium double-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00224\">224</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa7aeb54c167712b38f2178a1be2360ad\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;float, mediump&gt; mediump_dualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of medium single-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00192\">192</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4a6b594ff7e81150d8143001367a9431\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef tdualquat&lt;float, mediump&gt; mediump_fdualquat</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Dual-quaternion of medium single-qualifier floating-point numbers. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00021_source.html#l00208\">208</a> of file <a class=\"el\" href=\"a00021_source.html\">dual_quaternion.hpp</a>.</p>\n\n</div>\n</div>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga0b35c0e30df8a875dbaa751e0bd800e0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tdualquat&lt;T, Q&gt; glm::dual_quat_identity </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates an identity dual quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac4064ff813759740201765350eac4236\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tdualquat&lt;T, Q&gt; glm::dualquat_cast </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 2, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga91025ebdca0f4ea54da08497b00e8c84\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tdualquat&lt;T, Q&gt; glm::dualquat_cast </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga070f521a953f6461af4ab4cf8ccbf27e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tdualquat&lt;T, Q&gt; glm::inverse </td>\n          <td>(</td>\n          <td class=\"paramtype\">tdualquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the q inverse. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gace8380112d16d33f520839cb35a4d173\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tdualquat&lt;T, Q&gt; glm::lerp </td>\n          <td>(</td>\n          <td class=\"paramtype\">tdualquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tdualquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the linear interpolation of two dual quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtc_dual_quaternion </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae99d143b37f9cad4cd9285571aab685a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; glm::mat2x4_cast </td>\n          <td>(</td>\n          <td class=\"paramtype\">tdualquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a quaternion to a 2 * 4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf59f5bb69620d2891c3795c6f2639179\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; glm::mat3x4_cast </td>\n          <td>(</td>\n          <td class=\"paramtype\">tdualquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a quaternion to a 3 * 4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga299b8641509606b1958ffa104a162cfe\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tdualquat&lt;T, Q&gt; glm::normalize </td>\n          <td>(</td>\n          <td class=\"paramtype\">tdualquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the normalized quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00178.html\" title=\"Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension. \">GLM_GTX_dual_quaternion</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00179.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_euler_angles</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_euler_angles<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00023.html\" title=\"GLM_GTX_euler_angles \">glm/gtx/euler_angles.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gafba6282e4ed3ff8b5c75331abfba3489\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gafba6282e4ed3ff8b5c75331abfba3489\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gafba6282e4ed3ff8b5c75331abfba3489\">eulerAngleX</a> (T const &amp;angleX)</td></tr>\n<tr class=\"memdesc:gafba6282e4ed3ff8b5c75331abfba3489\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X.  <a href=\"a00179.html#gafba6282e4ed3ff8b5c75331abfba3489\">More...</a><br /></td></tr>\n<tr class=\"separator:gafba6282e4ed3ff8b5c75331abfba3489\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga64036577ee17a2d24be0dbc05881d4e2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga64036577ee17a2d24be0dbc05881d4e2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga64036577ee17a2d24be0dbc05881d4e2\">eulerAngleXY</a> (T const &amp;angleX, T const &amp;angleY)</td></tr>\n<tr class=\"memdesc:ga64036577ee17a2d24be0dbc05881d4e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y).  <a href=\"a00179.html#ga64036577ee17a2d24be0dbc05881d4e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga64036577ee17a2d24be0dbc05881d4e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1975e0f0e9bed7f716dc9946da2ab645\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga1975e0f0e9bed7f716dc9946da2ab645\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga1975e0f0e9bed7f716dc9946da2ab645\">eulerAngleXYZ</a> (T const &amp;t1, T const &amp;t2, T const &amp;t3)</td></tr>\n<tr class=\"memdesc:ga1975e0f0e9bed7f716dc9946da2ab645\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z).  <a href=\"a00179.html#ga1975e0f0e9bed7f716dc9946da2ab645\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1975e0f0e9bed7f716dc9946da2ab645\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa39bd323c65c2fc0a1508be33a237ce9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaa39bd323c65c2fc0a1508be33a237ce9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gaa39bd323c65c2fc0a1508be33a237ce9\">eulerAngleXZ</a> (T const &amp;angleX, T const &amp;angleZ)</td></tr>\n<tr class=\"memdesc:gaa39bd323c65c2fc0a1508be33a237ce9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z).  <a href=\"a00179.html#gaa39bd323c65c2fc0a1508be33a237ce9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa39bd323c65c2fc0a1508be33a237ce9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab84bf4746805fd69b8ecbb230e3974c5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gab84bf4746805fd69b8ecbb230e3974c5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gab84bf4746805fd69b8ecbb230e3974c5\">eulerAngleY</a> (T const &amp;angleY)</td></tr>\n<tr class=\"memdesc:gab84bf4746805fd69b8ecbb230e3974c5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y.  <a href=\"a00179.html#gab84bf4746805fd69b8ecbb230e3974c5\">More...</a><br /></td></tr>\n<tr class=\"separator:gab84bf4746805fd69b8ecbb230e3974c5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga4f57e6dd25c3cffbbd4daa6ef3f4486d\">eulerAngleYX</a> (T const &amp;angleY, T const &amp;angleX)</td></tr>\n<tr class=\"memdesc:ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X).  <a href=\"a00179.html#ga4f57e6dd25c3cffbbd4daa6ef3f4486d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab8ba99a9814f6d9edf417b6c6d5b0c10\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gab8ba99a9814f6d9edf417b6c6d5b0c10\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gab8ba99a9814f6d9edf417b6c6d5b0c10\">eulerAngleYXZ</a> (T const &amp;yaw, T const &amp;pitch, T const &amp;roll)</td></tr>\n<tr class=\"memdesc:gab8ba99a9814f6d9edf417b6c6d5b0c10\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).  <a href=\"a00179.html#gab8ba99a9814f6d9edf417b6c6d5b0c10\">More...</a><br /></td></tr>\n<tr class=\"separator:gab8ba99a9814f6d9edf417b6c6d5b0c10\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga220379e10ac8cca55e275f0c9018fed9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga220379e10ac8cca55e275f0c9018fed9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga220379e10ac8cca55e275f0c9018fed9\">eulerAngleYZ</a> (T const &amp;angleY, T const &amp;angleZ)</td></tr>\n<tr class=\"memdesc:ga220379e10ac8cca55e275f0c9018fed9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z).  <a href=\"a00179.html#ga220379e10ac8cca55e275f0c9018fed9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga220379e10ac8cca55e275f0c9018fed9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5b3935248bb6c3ec6b0d9297d406e251\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga5b3935248bb6c3ec6b0d9297d406e251\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga5b3935248bb6c3ec6b0d9297d406e251\">eulerAngleZ</a> (T const &amp;angleZ)</td></tr>\n<tr class=\"memdesc:ga5b3935248bb6c3ec6b0d9297d406e251\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z.  <a href=\"a00179.html#ga5b3935248bb6c3ec6b0d9297d406e251\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5b3935248bb6c3ec6b0d9297d406e251\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga483903115cd4059228961046a28d69b5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga483903115cd4059228961046a28d69b5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga483903115cd4059228961046a28d69b5\">eulerAngleZX</a> (T const &amp;angle, T const &amp;angleX)</td></tr>\n<tr class=\"memdesc:ga483903115cd4059228961046a28d69b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X).  <a href=\"a00179.html#ga483903115cd4059228961046a28d69b5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga483903115cd4059228961046a28d69b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga400b2bd5984999efab663f3a68e1d020\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga400b2bd5984999efab663f3a68e1d020\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga400b2bd5984999efab663f3a68e1d020\">eulerAngleZY</a> (T const &amp;angleZ, T const &amp;angleY)</td></tr>\n<tr class=\"memdesc:ga400b2bd5984999efab663f3a68e1d020\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y).  <a href=\"a00179.html#ga400b2bd5984999efab663f3a68e1d020\">More...</a><br /></td></tr>\n<tr class=\"separator:ga400b2bd5984999efab663f3a68e1d020\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacea701562f778c1da4d3a0a1cf091000\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gacea701562f778c1da4d3a0a1cf091000\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gacea701562f778c1da4d3a0a1cf091000\">extractEulerAngleXYZ</a> (mat&lt; 4, 4, T, defaultp &gt; const &amp;M, T &amp;t1, T &amp;t2, T &amp;t3)</td></tr>\n<tr class=\"memdesc:gacea701562f778c1da4d3a0a1cf091000\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extracts the (X * Y * Z) Euler angles from the rotation matrix M.  <a href=\"a00179.html#gacea701562f778c1da4d3a0a1cf091000\">More...</a><br /></td></tr>\n<tr class=\"separator:gacea701562f778c1da4d3a0a1cf091000\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae16738a9f1887cf4e4db6a124637608d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae16738a9f1887cf4e4db6a124637608d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gae16738a9f1887cf4e4db6a124637608d\">orientate2</a> (T const &amp;angle)</td></tr>\n<tr class=\"memdesc:gae16738a9f1887cf4e4db6a124637608d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 2D 2 * 2 rotation matrix from an euler angle.  <a href=\"a00179.html#gae16738a9f1887cf4e4db6a124637608d\">More...</a><br /></td></tr>\n<tr class=\"separator:gae16738a9f1887cf4e4db6a124637608d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ca98668a5786f19c7b38299ebbc9b4c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga7ca98668a5786f19c7b38299ebbc9b4c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga7ca98668a5786f19c7b38299ebbc9b4c\">orientate3</a> (T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga7ca98668a5786f19c7b38299ebbc9b4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle.  <a href=\"a00179.html#ga7ca98668a5786f19c7b38299ebbc9b4c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ca98668a5786f19c7b38299ebbc9b4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7238c8e15c7720e3ca6a45ab151eeabb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7238c8e15c7720e3ca6a45ab151eeabb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb\">orientate3</a> (vec&lt; 3, T, Q &gt; const &amp;angles)</td></tr>\n<tr class=\"memdesc:ga7238c8e15c7720e3ca6a45ab151eeabb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z).  <a href=\"a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7238c8e15c7720e3ca6a45ab151eeabb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4a044653f71a4ecec68e0b623382b48a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4a044653f71a4ecec68e0b623382b48a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#ga4a044653f71a4ecec68e0b623382b48a\">orientate4</a> (vec&lt; 3, T, Q &gt; const &amp;angles)</td></tr>\n<tr class=\"memdesc:ga4a044653f71a4ecec68e0b623382b48a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).  <a href=\"a00179.html#ga4a044653f71a4ecec68e0b623382b48a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4a044653f71a4ecec68e0b623382b48a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae6aa26ccb020d281b449619e419a609e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae6aa26ccb020d281b449619e419a609e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, defaultp &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00179.html#gae6aa26ccb020d281b449619e419a609e\">yawPitchRoll</a> (T const &amp;yaw, T const &amp;pitch, T const &amp;roll)</td></tr>\n<tr class=\"memdesc:gae6aa26ccb020d281b449619e419a609e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).  <a href=\"a00179.html#gae6aa26ccb020d281b449619e419a609e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae6aa26ccb020d281b449619e419a609e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00023.html\" title=\"GLM_GTX_euler_angles \">glm/gtx/euler_angles.hpp</a>&gt; to use the features of this extension. </p>\n<p>Build matrices from Euler angles. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gafba6282e4ed3ff8b5c75331abfba3489\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleX </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleX</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga64036577ee17a2d24be0dbc05881d4e2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleXY </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleX</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleY</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1975e0f0e9bed7f716dc9946da2ab645\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleXYZ </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>t1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>t2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>t3</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa39bd323c65c2fc0a1508be33a237ce9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleXZ </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleX</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleZ</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab84bf4746805fd69b8ecbb230e3974c5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleY </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleY</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4f57e6dd25c3cffbbd4daa6ef3f4486d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleYX </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleY</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleX</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab8ba99a9814f6d9edf417b6c6d5b0c10\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleYXZ </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>yaw</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>pitch</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>roll</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga220379e10ac8cca55e275f0c9018fed9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleYZ </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleY</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleZ</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5b3935248bb6c3ec6b0d9297d406e251\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleZ </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleZ</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga483903115cd4059228961046a28d69b5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleZX </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleX</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga400b2bd5984999efab663f3a68e1d020\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::eulerAngleZY </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleZ</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angleY</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacea701562f778c1da4d3a0a1cf091000\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL void glm::extractEulerAngleXYZ </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, defaultp &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>M</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T &amp;&#160;</td>\n          <td class=\"paramname\"><em>t1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T &amp;&#160;</td>\n          <td class=\"paramname\"><em>t2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T &amp;&#160;</td>\n          <td class=\"paramname\"><em>t3</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Extracts the (X * Y * Z) Euler angles from the rotation matrix M. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae16738a9f1887cf4e4db6a124637608d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 2, T, defaultp&gt; glm::orientate2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 2D 2 * 2 rotation matrix from an euler angle. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7ca98668a5786f19c7b38299ebbc9b4c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, defaultp&gt; glm::orientate3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7238c8e15c7720e3ca6a45ab151eeabb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::orientate3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angles</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4a044653f71a4ecec68e0b623382b48a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::orientate4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angles</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae6aa26ccb020d281b449619e419a609e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, defaultp&gt; glm::yawPitchRoll </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>yaw</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>pitch</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>roll</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00179.html\" title=\"Include <glm/gtx/euler_angles.hpp> to use the features of this extension. \">GLM_GTX_euler_angles</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00180.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_extend</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_extend<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00026.html\" title=\"GLM_GTX_extend \">glm/gtx/extend.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8140caae613b0f847ab0d7175dc03a37\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8140caae613b0f847ab0d7175dc03a37\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00180.html#ga8140caae613b0f847ab0d7175dc03a37\">extend</a> (genType const &amp;Origin, genType const &amp;Source, typename genType::value_type const Length)</td></tr>\n<tr class=\"memdesc:ga8140caae613b0f847ab0d7175dc03a37\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extends of Length the Origin position using the (Source - Origin) direction.  <a href=\"a00180.html#ga8140caae613b0f847ab0d7175dc03a37\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8140caae613b0f847ab0d7175dc03a37\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00026.html\" title=\"GLM_GTX_extend \">glm/gtx/extend.hpp</a>&gt; to use the features of this extension. </p>\n<p>Extend a position from a source to a position at a defined length. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga8140caae613b0f847ab0d7175dc03a37\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::extend </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Origin</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Source</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::value_type const&#160;</td>\n          <td class=\"paramname\"><em>Length</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Extends of Length the Origin position using the (Source - Origin) direction. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00180.html\" title=\"Include <glm/gtx/extend.hpp> to use the features of this extension. \">GLM_GTX_extend</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00181.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_extented_min_max</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_extented_min_max<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;glm/gtx/extented_min_max.hpp&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga04991ccb9865c4c4e58488cfb209ce69\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga04991ccb9865c4c4e58488cfb209ce69\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga04991ccb9865c4c4e58488cfb209ce69\">max</a> (T const &amp;x, T const &amp;y, T const &amp;z)</td></tr>\n<tr class=\"memdesc:ga04991ccb9865c4c4e58488cfb209ce69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 3 inputs.  <a href=\"a00181.html#ga04991ccb9865c4c4e58488cfb209ce69\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04991ccb9865c4c4e58488cfb209ce69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1b7bbe5c91de4924835ea3e14530744\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:gae1b7bbe5c91de4924835ea3e14530744\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#gae1b7bbe5c91de4924835ea3e14530744\">max</a> (C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z)</td></tr>\n<tr class=\"memdesc:gae1b7bbe5c91de4924835ea3e14530744\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 3 inputs.  <a href=\"a00181.html#gae1b7bbe5c91de4924835ea3e14530744\">More...</a><br /></td></tr>\n<tr class=\"separator:gae1b7bbe5c91de4924835ea3e14530744\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf832e9d4ab4826b2dda2fda25935a3a4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:gaf832e9d4ab4826b2dda2fda25935a3a4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#gaf832e9d4ab4826b2dda2fda25935a3a4\">max</a> (C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z)</td></tr>\n<tr class=\"memdesc:gaf832e9d4ab4826b2dda2fda25935a3a4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 3 inputs.  <a href=\"a00181.html#gaf832e9d4ab4826b2dda2fda25935a3a4\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf832e9d4ab4826b2dda2fda25935a3a4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78e04a0cef1c4863fcae1a2130500d87\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga78e04a0cef1c4863fcae1a2130500d87\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga78e04a0cef1c4863fcae1a2130500d87\">max</a> (T const &amp;x, T const &amp;y, T const &amp;z, T const &amp;w)</td></tr>\n<tr class=\"memdesc:ga78e04a0cef1c4863fcae1a2130500d87\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 4 inputs.  <a href=\"a00181.html#ga78e04a0cef1c4863fcae1a2130500d87\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78e04a0cef1c4863fcae1a2130500d87\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7cca8b53cfda402040494cdf40fbdf4a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga7cca8b53cfda402040494cdf40fbdf4a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga7cca8b53cfda402040494cdf40fbdf4a\">max</a> (C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z, typename C&lt; T &gt;::T const &amp;w)</td></tr>\n<tr class=\"memdesc:ga7cca8b53cfda402040494cdf40fbdf4a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 4 inputs.  <a href=\"a00181.html#ga7cca8b53cfda402040494cdf40fbdf4a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7cca8b53cfda402040494cdf40fbdf4a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaacffbc466c2d08c140b181e7fd8a4858\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:gaacffbc466c2d08c140b181e7fd8a4858\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">max</a> (C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)</td></tr>\n<tr class=\"memdesc:gaacffbc466c2d08c140b181e7fd8a4858\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the maximum component-wise values of 4 inputs.  <a href=\"a00181.html#gaacffbc466c2d08c140b181e7fd8a4858\">More...</a><br /></td></tr>\n<tr class=\"separator:gaacffbc466c2d08c140b181e7fd8a4858\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga713d3f9b3e76312c0d314e0c8611a6a6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga713d3f9b3e76312c0d314e0c8611a6a6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga713d3f9b3e76312c0d314e0c8611a6a6\">min</a> (T const &amp;x, T const &amp;y, T const &amp;z)</td></tr>\n<tr class=\"memdesc:ga713d3f9b3e76312c0d314e0c8611a6a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 3 inputs.  <a href=\"a00181.html#ga713d3f9b3e76312c0d314e0c8611a6a6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga713d3f9b3e76312c0d314e0c8611a6a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga74d1a96e7cdbac40f6d35142d3bcbbd4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga74d1a96e7cdbac40f6d35142d3bcbbd4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga74d1a96e7cdbac40f6d35142d3bcbbd4\">min</a> (C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z)</td></tr>\n<tr class=\"memdesc:ga74d1a96e7cdbac40f6d35142d3bcbbd4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 3 inputs.  <a href=\"a00181.html#ga74d1a96e7cdbac40f6d35142d3bcbbd4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga74d1a96e7cdbac40f6d35142d3bcbbd4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga42b5c3fc027fd3d9a50d2ccc9126d9f0\">min</a> (C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z)</td></tr>\n<tr class=\"memdesc:ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 3 inputs.  <a href=\"a00181.html#ga42b5c3fc027fd3d9a50d2ccc9126d9f0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga95466987024d03039607f09e69813d69\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga95466987024d03039607f09e69813d69\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga95466987024d03039607f09e69813d69\">min</a> (T const &amp;x, T const &amp;y, T const &amp;z, T const &amp;w)</td></tr>\n<tr class=\"memdesc:ga95466987024d03039607f09e69813d69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 4 inputs.  <a href=\"a00181.html#ga95466987024d03039607f09e69813d69\">More...</a><br /></td></tr>\n<tr class=\"separator:ga95466987024d03039607f09e69813d69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4fe35dd31dd0c45693c9b60b830b8d47\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga4fe35dd31dd0c45693c9b60b830b8d47\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga4fe35dd31dd0c45693c9b60b830b8d47\">min</a> (C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z, typename C&lt; T &gt;::T const &amp;w)</td></tr>\n<tr class=\"memdesc:ga4fe35dd31dd0c45693c9b60b830b8d47\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 4 inputs.  <a href=\"a00181.html#ga4fe35dd31dd0c45693c9b60b830b8d47\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4fe35dd31dd0c45693c9b60b830b8d47\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7471ea4159eed8dd9ea4ac5d46c2fead\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , template&lt; typename &gt; class C&gt; </td></tr>\n<tr class=\"memitem:ga7471ea4159eed8dd9ea4ac5d46c2fead\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL C&lt; T &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">min</a> (C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)</td></tr>\n<tr class=\"memdesc:ga7471ea4159eed8dd9ea4ac5d46c2fead\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the minimum component-wise values of 4 inputs.  <a href=\"a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7471ea4159eed8dd9ea4ac5d46c2fead\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;glm/gtx/extented_min_max.hpp&gt; to use the features of this extension. </p>\n<p>Min and max functions for 3 to 4 parameters. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga04991ccb9865c4c4e58488cfb209ce69\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the maximum component-wise values of 3 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae1b7bbe5c91de4924835ea3e14530744\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL C&lt;T&gt; glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the maximum component-wise values of 3 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf832e9d4ab4826b2dda2fda25935a3a4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL C&lt;T&gt; glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the maximum component-wise values of 3 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga78e04a0cef1c4863fcae1a2130500d87\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the maximum component-wise values of 4 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7cca8b53cfda402040494cdf40fbdf4a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL C&lt;T&gt; glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the maximum component-wise values of 4 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaacffbc466c2d08c140b181e7fd8a4858\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL C&lt;T&gt; glm::max </td>\n          <td>(</td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the maximum component-wise values of 4 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga713d3f9b3e76312c0d314e0c8611a6a6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the minimum component-wise values of 3 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga74d1a96e7cdbac40f6d35142d3bcbbd4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL C&lt;T&gt; glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the minimum component-wise values of 3 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga42b5c3fc027fd3d9a50d2ccc9126d9f0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL C&lt;T&gt; glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the minimum component-wise values of 3 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga95466987024d03039607f09e69813d69\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the minimum component-wise values of 4 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4fe35dd31dd0c45693c9b60b830b8d47\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL C&lt;T&gt; glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename C&lt; T &gt;::T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the minimum component-wise values of 4 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7471ea4159eed8dd9ea4ac5d46c2fead\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL C&lt;T&gt; glm::min </td>\n          <td>(</td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>z</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">C&lt; T &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>w</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the minimum component-wise values of 4 inputs. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>gtx_extented_min_max </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00182.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_exterior_product</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_exterior_product<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00028.html\" title=\"GLM_GTX_exterior_product \">glm/gtx/exterior_product.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gac36e72b934ea6a9dd313772d7e78fa93\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac36e72b934ea6a9dd313772d7e78fa93\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00182.html#gac36e72b934ea6a9dd313772d7e78fa93\">cross</a> (vec&lt; 2, T, Q &gt; const &amp;v, vec&lt; 2, T, Q &gt; const &amp;u)</td></tr>\n<tr class=\"memdesc:gac36e72b934ea6a9dd313772d7e78fa93\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the cross product of x and y.  <a href=\"a00182.html#gac36e72b934ea6a9dd313772d7e78fa93\">More...</a><br /></td></tr>\n<tr class=\"separator:gac36e72b934ea6a9dd313772d7e78fa93\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00028.html\" title=\"GLM_GTX_exterior_product \">glm/gtx/exterior_product.hpp</a>&gt; to use the features of this extension. </p>\n<p>Allow to perform bit operations on integer values </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gac36e72b934ea6a9dd313772d7e78fa93\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::cross </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>u</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the cross product of x and y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"https://en.wikipedia.org/wiki/Exterior_algebra#Cross_and_triple_products\">Exterior product</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00183.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_fast_exponential</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_fast_exponential<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00029.html\" title=\"GLM_GTX_fast_exponential \">glm/gtx/fast_exponential.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaa3180ac8f96ab37ab96e0cacaf608e10\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaa3180ac8f96ab37ab96e0cacaf608e10\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#gaa3180ac8f96ab37ab96e0cacaf608e10\">fastExp</a> (T x)</td></tr>\n<tr class=\"memdesc:gaa3180ac8f96ab37ab96e0cacaf608e10\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp function but less accurate.  <a href=\"a00183.html#gaa3180ac8f96ab37ab96e0cacaf608e10\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa3180ac8f96ab37ab96e0cacaf608e10\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ba6153aec6bd74628f8b00530aa8d58\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3ba6153aec6bd74628f8b00530aa8d58\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58\">fastExp</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3ba6153aec6bd74628f8b00530aa8d58\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp function but less accurate.  <a href=\"a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ba6153aec6bd74628f8b00530aa8d58\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0af50585955eb14c60bb286297fabab2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0af50585955eb14c60bb286297fabab2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga0af50585955eb14c60bb286297fabab2\">fastExp2</a> (T x)</td></tr>\n<tr class=\"memdesc:ga0af50585955eb14c60bb286297fabab2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp2 function but less accurate.  <a href=\"a00183.html#ga0af50585955eb14c60bb286297fabab2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0af50585955eb14c60bb286297fabab2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacaaed8b67d20d244b7de217e7816c1b6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacaaed8b67d20d244b7de217e7816c1b6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#gacaaed8b67d20d244b7de217e7816c1b6\">fastExp2</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gacaaed8b67d20d244b7de217e7816c1b6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp2 function but less accurate.  <a href=\"a00183.html#gacaaed8b67d20d244b7de217e7816c1b6\">More...</a><br /></td></tr>\n<tr class=\"separator:gacaaed8b67d20d244b7de217e7816c1b6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1bdc97b7f96a600e29c753f1cd4388a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae1bdc97b7f96a600e29c753f1cd4388a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#gae1bdc97b7f96a600e29c753f1cd4388a\">fastLog</a> (T x)</td></tr>\n<tr class=\"memdesc:gae1bdc97b7f96a600e29c753f1cd4388a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common log function but less accurate.  <a href=\"a00183.html#gae1bdc97b7f96a600e29c753f1cd4388a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae1bdc97b7f96a600e29c753f1cd4388a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga937256993a7219e73f186bb348fe6be8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga937256993a7219e73f186bb348fe6be8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga937256993a7219e73f186bb348fe6be8\">fastLog</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga937256993a7219e73f186bb348fe6be8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common exp2 function but less accurate.  <a href=\"a00183.html#ga937256993a7219e73f186bb348fe6be8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga937256993a7219e73f186bb348fe6be8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e98118685f6dc9e05fbb13dd5e5234e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga6e98118685f6dc9e05fbb13dd5e5234e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga6e98118685f6dc9e05fbb13dd5e5234e\">fastLog2</a> (T x)</td></tr>\n<tr class=\"memdesc:ga6e98118685f6dc9e05fbb13dd5e5234e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common log2 function but less accurate.  <a href=\"a00183.html#ga6e98118685f6dc9e05fbb13dd5e5234e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e98118685f6dc9e05fbb13dd5e5234e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7562043539194ccc24649f8475bc5584\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga7562043539194ccc24649f8475bc5584\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga7562043539194ccc24649f8475bc5584\">fastLog2</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga7562043539194ccc24649f8475bc5584\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common log2 function but less accurate.  <a href=\"a00183.html#ga7562043539194ccc24649f8475bc5584\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7562043539194ccc24649f8475bc5584\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5340e98a11fcbbd936ba6e983a154d50\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga5340e98a11fcbbd936ba6e983a154d50\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga5340e98a11fcbbd936ba6e983a154d50\">fastPow</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:ga5340e98a11fcbbd936ba6e983a154d50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common pow function but less accurate.  <a href=\"a00183.html#ga5340e98a11fcbbd936ba6e983a154d50\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5340e98a11fcbbd936ba6e983a154d50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga15325a8ed2d1c4ed2412c4b3b3927aa2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga15325a8ed2d1c4ed2412c4b3b3927aa2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga15325a8ed2d1c4ed2412c4b3b3927aa2\">fastPow</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga15325a8ed2d1c4ed2412c4b3b3927aa2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common pow function but less accurate.  <a href=\"a00183.html#ga15325a8ed2d1c4ed2412c4b3b3927aa2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga15325a8ed2d1c4ed2412c4b3b3927aa2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f2562db9c3e02ae76169c36b086c3f6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genTypeT , typename genTypeU &gt; </td></tr>\n<tr class=\"memitem:ga7f2562db9c3e02ae76169c36b086c3f6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genTypeT&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga7f2562db9c3e02ae76169c36b086c3f6\">fastPow</a> (genTypeT x, genTypeU y)</td></tr>\n<tr class=\"memdesc:ga7f2562db9c3e02ae76169c36b086c3f6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common pow function but less accurate.  <a href=\"a00183.html#ga7f2562db9c3e02ae76169c36b086c3f6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f2562db9c3e02ae76169c36b086c3f6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1abe488c0829da5b9de70ac64aeaa7e5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1abe488c0829da5b9de70ac64aeaa7e5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">fastPow</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga1abe488c0829da5b9de70ac64aeaa7e5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common pow function but less accurate.  <a href=\"a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1abe488c0829da5b9de70ac64aeaa7e5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00029.html\" title=\"GLM_GTX_fast_exponential \">glm/gtx/fast_exponential.hpp</a>&gt; to use the features of this extension. </p>\n<p>Fast but less accurate implementations of exponential based functions. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaa3180ac8f96ab37ab96e0cacaf608e10\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastExp </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common exp function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3ba6153aec6bd74628f8b00530aa8d58\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fastExp </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common exp function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0af50585955eb14c60bb286297fabab2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastExp2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common exp2 function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacaaed8b67d20d244b7de217e7816c1b6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fastExp2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common exp2 function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae1bdc97b7f96a600e29c753f1cd4388a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastLog </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common log function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga937256993a7219e73f186bb348fe6be8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fastLog </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common exp2 function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e98118685f6dc9e05fbb13dd5e5234e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastLog2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common log2 function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7562043539194ccc24649f8475bc5584\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fastLog2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common log2 function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5340e98a11fcbbd936ba6e983a154d50\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fastPow </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common pow function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga15325a8ed2d1c4ed2412c4b3b3927aa2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fastPow </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common pow function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7f2562db9c3e02ae76169c36b086c3f6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genTypeT glm::fastPow </td>\n          <td>(</td>\n          <td class=\"paramtype\">genTypeT&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genTypeU&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common pow function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1abe488c0829da5b9de70ac64aeaa7e5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fastPow </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common pow function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00183.html\" title=\"Include <glm/gtx/fast_exponential.hpp> to use the features of this extension. \">GLM_GTX_fast_exponential</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00184.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_fast_square_root</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_fast_square_root<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00030.html\" title=\"GLM_GTX_fast_square_root \">glm/gtx/fast_square_root.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaac333418d0c4e0cc6d3d219ed606c238\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaac333418d0c4e0cc6d3d219ed606c238\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#gaac333418d0c4e0cc6d3d219ed606c238\">fastDistance</a> (genType x, genType y)</td></tr>\n<tr class=\"memdesc:gaac333418d0c4e0cc6d3d219ed606c238\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common distance function but less accurate.  <a href=\"a00184.html#gaac333418d0c4e0cc6d3d219ed606c238\">More...</a><br /></td></tr>\n<tr class=\"separator:gaac333418d0c4e0cc6d3d219ed606c238\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga42d3e771fa7cb3c60d828e315829df19\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga42d3e771fa7cb3c60d828e315829df19\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga42d3e771fa7cb3c60d828e315829df19\">fastDistance</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga42d3e771fa7cb3c60d828e315829df19\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common distance function but less accurate.  <a href=\"a00184.html#ga42d3e771fa7cb3c60d828e315829df19\">More...</a><br /></td></tr>\n<tr class=\"separator:ga42d3e771fa7cb3c60d828e315829df19\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f081b14d9c7035c8714eba5f7f75a8f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga7f081b14d9c7035c8714eba5f7f75a8f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga7f081b14d9c7035c8714eba5f7f75a8f\">fastInverseSqrt</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga7f081b14d9c7035c8714eba5f7f75a8f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common inversesqrt function but less accurate.  <a href=\"a00184.html#ga7f081b14d9c7035c8714eba5f7f75a8f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f081b14d9c7035c8714eba5f7f75a8f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadcd7be12b1e5ee182141359d4c45dd24\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadcd7be12b1e5ee182141359d4c45dd24\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#gadcd7be12b1e5ee182141359d4c45dd24\">fastInverseSqrt</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gadcd7be12b1e5ee182141359d4c45dd24\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common inversesqrt function but less accurate.  <a href=\"a00184.html#gadcd7be12b1e5ee182141359d4c45dd24\">More...</a><br /></td></tr>\n<tr class=\"separator:gadcd7be12b1e5ee182141359d4c45dd24\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafe697d6287719538346bbdf8b1367c59\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gafe697d6287719538346bbdf8b1367c59\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#gafe697d6287719538346bbdf8b1367c59\">fastLength</a> (genType x)</td></tr>\n<tr class=\"memdesc:gafe697d6287719538346bbdf8b1367c59\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common length function but less accurate.  <a href=\"a00184.html#gafe697d6287719538346bbdf8b1367c59\">More...</a><br /></td></tr>\n<tr class=\"separator:gafe697d6287719538346bbdf8b1367c59\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga90f66be92ef61e705c005e7b3209edb8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga90f66be92ef61e705c005e7b3209edb8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga90f66be92ef61e705c005e7b3209edb8\">fastLength</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga90f66be92ef61e705c005e7b3209edb8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common length function but less accurate.  <a href=\"a00184.html#ga90f66be92ef61e705c005e7b3209edb8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga90f66be92ef61e705c005e7b3209edb8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3b02c1d6e0c754144e2f1e110bf9f16c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga3b02c1d6e0c754144e2f1e110bf9f16c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga3b02c1d6e0c754144e2f1e110bf9f16c\">fastNormalize</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3b02c1d6e0c754144e2f1e110bf9f16c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common normalize function but less accurate.  <a href=\"a00184.html#ga3b02c1d6e0c754144e2f1e110bf9f16c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3b02c1d6e0c754144e2f1e110bf9f16c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c460e9414a50b2fc455c8f64c86cdc9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6c460e9414a50b2fc455c8f64c86cdc9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#ga6c460e9414a50b2fc455c8f64c86cdc9\">fastSqrt</a> (genType x)</td></tr>\n<tr class=\"memdesc:ga6c460e9414a50b2fc455c8f64c86cdc9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common sqrt function but less accurate.  <a href=\"a00184.html#ga6c460e9414a50b2fc455c8f64c86cdc9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c460e9414a50b2fc455c8f64c86cdc9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae83f0c03614f73eae5478c5b6274ee6d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae83f0c03614f73eae5478c5b6274ee6d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00184.html#gae83f0c03614f73eae5478c5b6274ee6d\">fastSqrt</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae83f0c03614f73eae5478c5b6274ee6d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common sqrt function but less accurate.  <a href=\"a00184.html#gae83f0c03614f73eae5478c5b6274ee6d\">More...</a><br /></td></tr>\n<tr class=\"separator:gae83f0c03614f73eae5478c5b6274ee6d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00030.html\" title=\"GLM_GTX_fast_square_root \">glm/gtx/fast_square_root.hpp</a>&gt; to use the features of this extension. </p>\n<p>Fast but less accurate implementations of square root based functions.</p><ul>\n<li>Sqrt optimisation based on Newton's method, www.gamedev.net/community/forums/topic.asp?topic id=139956 </li>\n</ul>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaac333418d0c4e0cc6d3d219ed606c238\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fastDistance </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common distance function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga42d3e771fa7cb3c60d828e315829df19\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastDistance </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common distance function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7f081b14d9c7035c8714eba5f7f75a8f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fastInverseSqrt </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common inversesqrt function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadcd7be12b1e5ee182141359d4c45dd24\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fastInverseSqrt </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common inversesqrt function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafe697d6287719538346bbdf8b1367c59\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fastLength </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common length function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga90f66be92ef61e705c005e7b3209edb8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastLength </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common length function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3b02c1d6e0c754144e2f1e110bf9f16c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fastNormalize </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common normalize function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6c460e9414a50b2fc455c8f64c86cdc9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::fastSqrt </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common sqrt function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae83f0c03614f73eae5478c5b6274ee6d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::fastSqrt </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common sqrt function but less accurate. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00184.html\" title=\"Include <glm/gtx/fast_square_root.hpp> to use the features of this extension. \">GLM_GTX_fast_square_root</a> extension. </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00185.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_fast_trigonometry</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_fast_trigonometry<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00031.html\" title=\"GLM_GTX_fast_trigonometry \">glm/gtx/fast_trigonometry.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga9721d63356e5d94fdc4b393a426ab26b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga9721d63356e5d94fdc4b393a426ab26b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga9721d63356e5d94fdc4b393a426ab26b\">fastAcos</a> (T angle)</td></tr>\n<tr class=\"memdesc:ga9721d63356e5d94fdc4b393a426ab26b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common acos function but less accurate.  <a href=\"a00185.html#ga9721d63356e5d94fdc4b393a426ab26b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9721d63356e5d94fdc4b393a426ab26b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga562cb62c51fbfe7fac7db0bce706b81f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga562cb62c51fbfe7fac7db0bce706b81f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga562cb62c51fbfe7fac7db0bce706b81f\">fastAsin</a> (T angle)</td></tr>\n<tr class=\"memdesc:ga562cb62c51fbfe7fac7db0bce706b81f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common asin function but less accurate.  <a href=\"a00185.html#ga562cb62c51fbfe7fac7db0bce706b81f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga562cb62c51fbfe7fac7db0bce706b81f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8d197c6ef564f5e5d59af3b3f8adcc2c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga8d197c6ef564f5e5d59af3b3f8adcc2c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga8d197c6ef564f5e5d59af3b3f8adcc2c\">fastAtan</a> (T y, T x)</td></tr>\n<tr class=\"memdesc:ga8d197c6ef564f5e5d59af3b3f8adcc2c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common atan function but less accurate.  <a href=\"a00185.html#ga8d197c6ef564f5e5d59af3b3f8adcc2c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8d197c6ef564f5e5d59af3b3f8adcc2c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae25de86a968490ff56856fa425ec9d30\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gae25de86a968490ff56856fa425ec9d30\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#gae25de86a968490ff56856fa425ec9d30\">fastAtan</a> (T angle)</td></tr>\n<tr class=\"memdesc:gae25de86a968490ff56856fa425ec9d30\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common atan function but less accurate.  <a href=\"a00185.html#gae25de86a968490ff56856fa425ec9d30\">More...</a><br /></td></tr>\n<tr class=\"separator:gae25de86a968490ff56856fa425ec9d30\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab34c8b45c23c0165a64dcecfcc3b302a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gab34c8b45c23c0165a64dcecfcc3b302a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#gab34c8b45c23c0165a64dcecfcc3b302a\">fastCos</a> (T angle)</td></tr>\n<tr class=\"memdesc:gab34c8b45c23c0165a64dcecfcc3b302a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common cos function but less accurate.  <a href=\"a00185.html#gab34c8b45c23c0165a64dcecfcc3b302a\">More...</a><br /></td></tr>\n<tr class=\"separator:gab34c8b45c23c0165a64dcecfcc3b302a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0aab3257bb3b628d10a1e0483e2c6915\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0aab3257bb3b628d10a1e0483e2c6915\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga0aab3257bb3b628d10a1e0483e2c6915\">fastSin</a> (T angle)</td></tr>\n<tr class=\"memdesc:ga0aab3257bb3b628d10a1e0483e2c6915\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common sin function but less accurate.  <a href=\"a00185.html#ga0aab3257bb3b628d10a1e0483e2c6915\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0aab3257bb3b628d10a1e0483e2c6915\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf29b9c1101a10007b4f79ee89df27ba2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:gaf29b9c1101a10007b4f79ee89df27ba2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#gaf29b9c1101a10007b4f79ee89df27ba2\">fastTan</a> (T angle)</td></tr>\n<tr class=\"memdesc:gaf29b9c1101a10007b4f79ee89df27ba2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Faster than the common tan function but less accurate.  <a href=\"a00185.html#gaf29b9c1101a10007b4f79ee89df27ba2\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf29b9c1101a10007b4f79ee89df27ba2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga069527c6dbd64f53435b8ebc4878b473\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga069527c6dbd64f53435b8ebc4878b473\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00185.html#ga069527c6dbd64f53435b8ebc4878b473\">wrapAngle</a> (T angle)</td></tr>\n<tr class=\"memdesc:ga069527c6dbd64f53435b8ebc4878b473\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Wrap an angle to [0 2pi[ From GLM_GTX_fast_trigonometry extension.  <a href=\"a00185.html#ga069527c6dbd64f53435b8ebc4878b473\">More...</a><br /></td></tr>\n<tr class=\"separator:ga069527c6dbd64f53435b8ebc4878b473\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00031.html\" title=\"GLM_GTX_fast_trigonometry \">glm/gtx/fast_trigonometry.hpp</a>&gt; to use the features of this extension. </p>\n<p>Fast but less accurate implementations of trigonometric functions. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga9721d63356e5d94fdc4b393a426ab26b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastAcos </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common acos function but less accurate. </p>\n<p>Defined between -2pi and 2pi. From GLM_GTX_fast_trigonometry extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga562cb62c51fbfe7fac7db0bce706b81f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastAsin </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common asin function but less accurate. </p>\n<p>Defined between -2pi and 2pi. From GLM_GTX_fast_trigonometry extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8d197c6ef564f5e5d59af3b3f8adcc2c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastAtan </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common atan function but less accurate. </p>\n<p>Defined between -2pi and 2pi. From GLM_GTX_fast_trigonometry extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae25de86a968490ff56856fa425ec9d30\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastAtan </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common atan function but less accurate. </p>\n<p>Defined between -2pi and 2pi. From GLM_GTX_fast_trigonometry extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab34c8b45c23c0165a64dcecfcc3b302a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastCos </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common cos function but less accurate. </p>\n<p>From GLM_GTX_fast_trigonometry extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0aab3257bb3b628d10a1e0483e2c6915\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastSin </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common sin function but less accurate. </p>\n<p>From GLM_GTX_fast_trigonometry extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf29b9c1101a10007b4f79ee89df27ba2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastTan </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Faster than the common tan function but less accurate. </p>\n<p>Defined between -2pi and 2pi. From GLM_GTX_fast_trigonometry extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga069527c6dbd64f53435b8ebc4878b473\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::wrapAngle </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Wrap an angle to [0 2pi[ From GLM_GTX_fast_trigonometry extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00186.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_functions<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00032.html\" title=\"GLM_GTX_functions \">glm/gtx/functions.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga0b50b197ff74261a0fad90f4b8d24702\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T &gt; </td></tr>\n<tr class=\"memitem:ga0b50b197ff74261a0fad90f4b8d24702\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00186.html#ga0b50b197ff74261a0fad90f4b8d24702\">gauss</a> (T x, T ExpectedValue, T StandardDeviation)</td></tr>\n<tr class=\"memdesc:ga0b50b197ff74261a0fad90f4b8d24702\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">1D gauss function  <a href=\"a00186.html#ga0b50b197ff74261a0fad90f4b8d24702\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0b50b197ff74261a0fad90f4b8d24702\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad19ec8754a83c0b9a8dc16b7e60705ab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad19ec8754a83c0b9a8dc16b7e60705ab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab\">gauss</a> (vec&lt; 2, T, Q &gt; const &amp;Coord, vec&lt; 2, T, Q &gt; const &amp;ExpectedValue, vec&lt; 2, T, Q &gt; const &amp;StandardDeviation)</td></tr>\n<tr class=\"memdesc:gad19ec8754a83c0b9a8dc16b7e60705ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">2D gauss function  <a href=\"a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gad19ec8754a83c0b9a8dc16b7e60705ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00032.html\" title=\"GLM_GTX_functions \">glm/gtx/functions.hpp</a>&gt; to use the features of this extension. </p>\n<p>List of useful common functions. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga0b50b197ff74261a0fad90f4b8d24702\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::gauss </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>ExpectedValue</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>StandardDeviation</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>1D gauss function </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00152.html\" title=\"Include <glm/gtc/epsilon.hpp> to use the features of this extension. \">GLM_GTC_epsilon</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad19ec8754a83c0b9a8dc16b7e60705ab\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::gauss </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Coord</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>ExpectedValue</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>StandardDeviation</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>2D gauss function </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00152.html\" title=\"Include <glm/gtc/epsilon.hpp> to use the features of this extension. \">GLM_GTC_epsilon</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00187.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_gradient_paint</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_gradient_paint<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00036.html\" title=\"GLM_GTX_gradient_paint \">glm/gtx/gradient_paint.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga849241df1e55129b8ce9476200307419\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga849241df1e55129b8ce9476200307419\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00187.html#ga849241df1e55129b8ce9476200307419\">linearGradient</a> (vec&lt; 2, T, Q &gt; const &amp;Point0, vec&lt; 2, T, Q &gt; const &amp;Point1, vec&lt; 2, T, Q &gt; const &amp;Position)</td></tr>\n<tr class=\"memdesc:ga849241df1e55129b8ce9476200307419\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a color from a linear gradient.  <a href=\"a00187.html#ga849241df1e55129b8ce9476200307419\">More...</a><br /></td></tr>\n<tr class=\"separator:ga849241df1e55129b8ce9476200307419\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaecb1e93de4cbe0758b882812d4da294\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaaecb1e93de4cbe0758b882812d4da294\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00187.html#gaaecb1e93de4cbe0758b882812d4da294\">radialGradient</a> (vec&lt; 2, T, Q &gt; const &amp;Center, T const &amp;Radius, vec&lt; 2, T, Q &gt; const &amp;Focal, vec&lt; 2, T, Q &gt; const &amp;Position)</td></tr>\n<tr class=\"memdesc:gaaecb1e93de4cbe0758b882812d4da294\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a color from a radial gradient.  <a href=\"a00187.html#gaaecb1e93de4cbe0758b882812d4da294\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaecb1e93de4cbe0758b882812d4da294\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00036.html\" title=\"GLM_GTX_gradient_paint \">glm/gtx/gradient_paint.hpp</a>&gt; to use the features of this extension. </p>\n<p>Functions that return the color of procedural gradient for specific coordinates. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga849241df1e55129b8ce9476200307419\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::linearGradient </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Point0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Point1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Position</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return a color from a linear gradient. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>- <a class=\"el\" href=\"a00187.html\" title=\"Include <glm/gtx/gradient_paint.hpp> to use the features of this extension. \">GLM_GTX_gradient_paint</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaecb1e93de4cbe0758b882812d4da294\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::radialGradient </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Center</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Radius</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Focal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Position</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return a color from a radial gradient. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>- <a class=\"el\" href=\"a00187.html\" title=\"Include <glm/gtx/gradient_paint.hpp> to use the features of this extension. \">GLM_GTX_gradient_paint</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00188.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_handed_coordinate_space</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_handed_coordinate_space<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;glm/gtx/handed_coordinate_system.hpp&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga6f1bad193b9a3b048543d1935cf04dd3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6f1bad193b9a3b048543d1935cf04dd3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00188.html#ga6f1bad193b9a3b048543d1935cf04dd3\">leftHanded</a> (vec&lt; 3, T, Q &gt; const &amp;tangent, vec&lt; 3, T, Q &gt; const &amp;binormal, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga6f1bad193b9a3b048543d1935cf04dd3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return if a trihedron left handed or not.  <a href=\"a00188.html#ga6f1bad193b9a3b048543d1935cf04dd3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6f1bad193b9a3b048543d1935cf04dd3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99386a5ab5491871b947076e21699cc8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga99386a5ab5491871b947076e21699cc8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00188.html#ga99386a5ab5491871b947076e21699cc8\">rightHanded</a> (vec&lt; 3, T, Q &gt; const &amp;tangent, vec&lt; 3, T, Q &gt; const &amp;binormal, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga99386a5ab5491871b947076e21699cc8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return if a trihedron right handed or not.  <a href=\"a00188.html#ga99386a5ab5491871b947076e21699cc8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99386a5ab5491871b947076e21699cc8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;glm/gtx/handed_coordinate_system.hpp&gt; to use the features of this extension. </p>\n<p>To know if a set of three basis vectors defines a right or left-handed coordinate system. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga6f1bad193b9a3b048543d1935cf04dd3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::leftHanded </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>tangent</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>binormal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>normal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return if a trihedron left handed or not. </p>\n<p>From GLM_GTX_handed_coordinate_space extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga99386a5ab5491871b947076e21699cc8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::rightHanded </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>tangent</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>binormal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>normal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return if a trihedron right handed or not. </p>\n<p>From GLM_GTX_handed_coordinate_space extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00189.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_hash</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_hash<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00038.html\" title=\"GLM_GTX_hash \">glm/gtx/hash.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<p>Include &lt;<a class=\"el\" href=\"a00038.html\" title=\"GLM_GTX_hash \">glm/gtx/hash.hpp</a>&gt; to use the features of this extension. </p>\n<p>Add std::hash support for glm types </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00190.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_integer</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a> &#124;\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_integer<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00040.html\" title=\"GLM_GTX_integer \">glm/gtx/integer.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gada7e83fdfe943aba4f1d5bf80cb66f40\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef signed int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40\">sint</a></td></tr>\n<tr class=\"memdesc:gada7e83fdfe943aba4f1d5bf80cb66f40\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32bit signed integer.  <a href=\"a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40\">More...</a><br /></td></tr>\n<tr class=\"separator:gada7e83fdfe943aba4f1d5bf80cb66f40\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8cbd3120905f398ec321b5d1836e08fb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8cbd3120905f398ec321b5d1836e08fb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga8cbd3120905f398ec321b5d1836e08fb\">factorial</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8cbd3120905f398ec321b5d1836e08fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the factorial value of a number (!12 max, integer only) From GLM_GTX_integer extension.  <a href=\"a00190.html#ga8cbd3120905f398ec321b5d1836e08fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8cbd3120905f398ec321b5d1836e08fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7011b4e1c1e1ed492149b028feacc00e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL unsigned int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga7011b4e1c1e1ed492149b028feacc00e\">floor_log2</a> (unsigned int x)</td></tr>\n<tr class=\"memdesc:ga7011b4e1c1e1ed492149b028feacc00e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the floor log2 of x.  <a href=\"a00190.html#ga7011b4e1c1e1ed492149b028feacc00e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7011b4e1c1e1ed492149b028feacc00e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabfbb41531ab7ad8d06fc176edfba785\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#gaabfbb41531ab7ad8d06fc176edfba785\">mod</a> (int x, int y)</td></tr>\n<tr class=\"memdesc:gaabfbb41531ab7ad8d06fc176edfba785\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00190.html#gaabfbb41531ab7ad8d06fc176edfba785\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabfbb41531ab7ad8d06fc176edfba785\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga63fc8d63e7da1706439233b386ba8b6f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga63fc8d63e7da1706439233b386ba8b6f\">mod</a> (uint x, uint y)</td></tr>\n<tr class=\"memdesc:ga63fc8d63e7da1706439233b386ba8b6f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Modulus.  <a href=\"a00190.html#ga63fc8d63e7da1706439233b386ba8b6f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga63fc8d63e7da1706439233b386ba8b6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78dff8bdb361bf0061194c93e003d189\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga78dff8bdb361bf0061194c93e003d189\">nlz</a> (uint x)</td></tr>\n<tr class=\"memdesc:ga78dff8bdb361bf0061194c93e003d189\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the number of leading zeros.  <a href=\"a00190.html#ga78dff8bdb361bf0061194c93e003d189\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78dff8bdb361bf0061194c93e003d189\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga465016030a81d513fa2fac881ebdaa83\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga465016030a81d513fa2fac881ebdaa83\">pow</a> (int x, uint y)</td></tr>\n<tr class=\"memdesc:ga465016030a81d513fa2fac881ebdaa83\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the y power.  <a href=\"a00190.html#ga465016030a81d513fa2fac881ebdaa83\">More...</a><br /></td></tr>\n<tr class=\"separator:ga465016030a81d513fa2fac881ebdaa83\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga998e5ee915d3769255519e2fbaa2bbf0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0\">pow</a> (uint x, uint y)</td></tr>\n<tr class=\"memdesc:ga998e5ee915d3769255519e2fbaa2bbf0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the y power.  <a href=\"a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga998e5ee915d3769255519e2fbaa2bbf0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ce36693a75879ccd9bb10167cfa722d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga7ce36693a75879ccd9bb10167cfa722d\">sqrt</a> (int x)</td></tr>\n<tr class=\"memdesc:ga7ce36693a75879ccd9bb10167cfa722d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the positive square root of x.  <a href=\"a00190.html#ga7ce36693a75879ccd9bb10167cfa722d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ce36693a75879ccd9bb10167cfa722d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1975d318978d6dacf78b6444fa5ed7bc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc\">sqrt</a> (uint x)</td></tr>\n<tr class=\"memdesc:ga1975d318978d6dacf78b6444fa5ed7bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the positive square root of x.  <a href=\"a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1975d318978d6dacf78b6444fa5ed7bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00040.html\" title=\"GLM_GTX_integer \">glm/gtx/integer.hpp</a>&gt; to use the features of this extension. </p>\n<p>Add support for integer for core functions </p>\n<h2 class=\"groupheader\">Typedef Documentation</h2>\n<a class=\"anchor\" id=\"gada7e83fdfe943aba4f1d5bf80cb66f40\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef signed int sint</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32bit signed integer. </p>\n<p>From GLM_GTX_integer extension. </p>\n\n<p>Definition at line <a class=\"el\" href=\"a00040_source.html#l00055\">55</a> of file <a class=\"el\" href=\"a00040_source.html\">gtx/integer.hpp</a>.</p>\n\n</div>\n</div>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga8cbd3120905f398ec321b5d1836e08fb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::factorial </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the factorial value of a number (!12 max, integer only) From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7011b4e1c1e1ed492149b028feacc00e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL unsigned int glm::floor_log2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">unsigned int&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the floor log2 of x. </p>\n<p>From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaabfbb41531ab7ad8d06fc176edfba785\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::mod </td>\n          <td>(</td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x - y * floor(x / y) for each component in x using the floating point value y. From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga63fc8d63e7da1706439233b386ba8b6f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::mod </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Modulus. </p>\n<p>Returns x - y * floor(x / y) for each component in x using the floating point value y. From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga78dff8bdb361bf0061194c93e003d189\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::nlz </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the number of leading zeros. </p>\n<p>From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga465016030a81d513fa2fac881ebdaa83\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::pow </td>\n          <td>(</td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x raised to the y power. </p>\n<p>From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga998e5ee915d3769255519e2fbaa2bbf0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::pow </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x raised to the y power. </p>\n<p>From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7ce36693a75879ccd9bb10167cfa722d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::sqrt </td>\n          <td>(</td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the positive square root of x. </p>\n<p>From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1975d318978d6dacf78b6444fa5ed7bc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::sqrt </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the positive square root of x. </p>\n<p>From GLM_GTX_integer extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00191.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_intersect</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_intersect<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00042.html\" title=\"GLM_GTX_intersect \">glm/gtx/intersect.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\">intersectLineSphere</a> (genType const &amp;point0, genType const &amp;point1, genType const &amp;sphereCenter, typename genType::value_type sphereRadius, genType &amp;intersectionPosition1, genType &amp;intersectionNormal1, genType &amp;intersectionPosition2=genType(), genType &amp;intersectionNormal2=genType())</td></tr>\n<tr class=\"memdesc:ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a line and a sphere.  <a href=\"a00191.html#ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9d29b9b3acb504d43986502f42740df4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga9d29b9b3acb504d43986502f42740df4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#ga9d29b9b3acb504d43986502f42740df4\">intersectLineTriangle</a> (genType const &amp;orig, genType const &amp;dir, genType const &amp;vert0, genType const &amp;vert1, genType const &amp;vert2, genType &amp;position)</td></tr>\n<tr class=\"memdesc:ga9d29b9b3acb504d43986502f42740df4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a line and a triangle.  <a href=\"a00191.html#ga9d29b9b3acb504d43986502f42740df4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9d29b9b3acb504d43986502f42740df4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad3697a9700ea379739a667ea02573488\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad3697a9700ea379739a667ea02573488\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#gad3697a9700ea379739a667ea02573488\">intersectRayPlane</a> (genType const &amp;orig, genType const &amp;dir, genType const &amp;planeOrig, genType const &amp;planeNormal, typename genType::value_type &amp;intersectionDistance)</td></tr>\n<tr class=\"memdesc:gad3697a9700ea379739a667ea02573488\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a ray and a plane.  <a href=\"a00191.html#gad3697a9700ea379739a667ea02573488\">More...</a><br /></td></tr>\n<tr class=\"separator:gad3697a9700ea379739a667ea02573488\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac88f8cd84c4bcb5b947d56acbbcfa56e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gac88f8cd84c4bcb5b947d56acbbcfa56e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#gac88f8cd84c4bcb5b947d56acbbcfa56e\">intersectRaySphere</a> (genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, typename genType::value_type const sphereRadiusSquered, typename genType::value_type &amp;intersectionDistance)</td></tr>\n<tr class=\"memdesc:gac88f8cd84c4bcb5b947d56acbbcfa56e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection distance of a ray and a sphere.  <a href=\"a00191.html#gac88f8cd84c4bcb5b947d56acbbcfa56e\">More...</a><br /></td></tr>\n<tr class=\"separator:gac88f8cd84c4bcb5b947d56acbbcfa56e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad28c00515b823b579c608aafa1100c1d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gad28c00515b823b579c608aafa1100c1d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#gad28c00515b823b579c608aafa1100c1d\">intersectRaySphere</a> (genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, const typename genType::value_type sphereRadius, genType &amp;intersectionPosition, genType &amp;intersectionNormal)</td></tr>\n<tr class=\"memdesc:gad28c00515b823b579c608aafa1100c1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a ray and a sphere.  <a href=\"a00191.html#gad28c00515b823b579c608aafa1100c1d\">More...</a><br /></td></tr>\n<tr class=\"separator:gad28c00515b823b579c608aafa1100c1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga62e2b3c67ff9e95c04e39383920a9c27\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga62e2b3c67ff9e95c04e39383920a9c27\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00191.html#ga62e2b3c67ff9e95c04e39383920a9c27\">intersectRayTriangle</a> (vec&lt; 3, T, Q &gt; const &amp;orig, vec&lt; 3, T, Q &gt; const &amp;dir, vec&lt; 3, T, Q &gt; const &amp;v0, vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; &amp;baryPosition, T &amp;distance)</td></tr>\n<tr class=\"memdesc:ga62e2b3c67ff9e95c04e39383920a9c27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the intersection of a ray and a triangle.  <a href=\"a00191.html#ga62e2b3c67ff9e95c04e39383920a9c27\">More...</a><br /></td></tr>\n<tr class=\"separator:ga62e2b3c67ff9e95c04e39383920a9c27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00042.html\" title=\"GLM_GTX_intersect \">glm/gtx/intersect.hpp</a>&gt; to use the features of this extension. </p>\n<p>Add intersection functions </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga9c68139f3d8a4f3d7fe45f9dbc0de5b7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::intersectLineSphere </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>point0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>point1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>sphereCenter</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::value_type&#160;</td>\n          <td class=\"paramname\"><em>sphereRadius</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>intersectionPosition1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>intersectionNormal1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>intersectionPosition2</em> = <code>genType()</code>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>intersectionNormal2</em> = <code>genType()</code>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute the intersection of a line and a sphere. </p>\n<p>From GLM_GTX_intersect extension </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9d29b9b3acb504d43986502f42740df4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::intersectLineTriangle </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>orig</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>dir</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>vert0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>vert1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>vert2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>position</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute the intersection of a line and a triangle. </p>\n<p>From GLM_GTX_intersect extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad3697a9700ea379739a667ea02573488\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::intersectRayPlane </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>orig</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>dir</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>planeOrig</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>planeNormal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::value_type &amp;&#160;</td>\n          <td class=\"paramname\"><em>intersectionDistance</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute the intersection of a ray and a plane. </p>\n<p>Ray direction and plane normal must be unit length. From GLM_GTX_intersect extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac88f8cd84c4bcb5b947d56acbbcfa56e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::intersectRaySphere </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rayStarting</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rayNormalizedDirection</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>sphereCenter</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::value_type const&#160;</td>\n          <td class=\"paramname\"><em>sphereRadiusSquered</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::value_type &amp;&#160;</td>\n          <td class=\"paramname\"><em>intersectionDistance</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute the intersection distance of a ray and a sphere. </p>\n<p>The ray direction vector is unit length. From GLM_GTX_intersect extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad28c00515b823b579c608aafa1100c1d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::intersectRaySphere </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rayStarting</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>rayNormalizedDirection</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>sphereCenter</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">const typename genType::value_type&#160;</td>\n          <td class=\"paramname\"><em>sphereRadius</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>intersectionPosition</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType &amp;&#160;</td>\n          <td class=\"paramname\"><em>intersectionNormal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute the intersection of a ray and a sphere. </p>\n<p>From GLM_GTX_intersect extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga62e2b3c67ff9e95c04e39383920a9c27\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::intersectRayTriangle </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>orig</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>dir</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>baryPosition</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T &amp;&#160;</td>\n          <td class=\"paramname\"><em>distance</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute the intersection of a ray and a triangle. </p>\n<p>Based om Tomas Mller implementation <a href=\"http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/raytri/\">http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/raytri/</a> From GLM_GTX_intersect extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00192.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_io</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_io<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00043.html\" title=\"GLM_GTX_io \">glm/gtx/io.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00043.html\" title=\"GLM_GTX_io \">glm/gtx/io.hpp</a>&gt; to use the features of this extension. </p>\n<p>std::[w]ostream support for glm types</p>\n<p>std::[w]ostream support for glm types + qualifier/width/etc. manipulators based on howard hinnant's std::chrono io proposal [<a href=\"http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html\">http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html</a>] </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00193.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_log_base</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_log_base<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00044.html\" title=\"GLM_GTX_log_base \">glm/gtx/log_base.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga60a7b0a401da660869946b2b77c710c9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga60a7b0a401da660869946b2b77c710c9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00193.html#ga60a7b0a401da660869946b2b77c710c9\">log</a> (genType const &amp;x, genType const &amp;base)</td></tr>\n<tr class=\"memdesc:ga60a7b0a401da660869946b2b77c710c9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Logarithm for any base.  <a href=\"a00193.html#ga60a7b0a401da660869946b2b77c710c9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga60a7b0a401da660869946b2b77c710c9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga04ef803a24f3d4f8c67dbccb33b0fce0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga04ef803a24f3d4f8c67dbccb33b0fce0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00193.html#ga04ef803a24f3d4f8c67dbccb33b0fce0\">sign</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;base)</td></tr>\n<tr class=\"memdesc:ga04ef803a24f3d4f8c67dbccb33b0fce0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Logarithm for any base.  <a href=\"a00193.html#ga04ef803a24f3d4f8c67dbccb33b0fce0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga04ef803a24f3d4f8c67dbccb33b0fce0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00044.html\" title=\"GLM_GTX_log_base \">glm/gtx/log_base.hpp</a>&gt; to use the features of this extension. </p>\n<p>Logarithm for any base. base can be a vector or a scalar. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga60a7b0a401da660869946b2b77c710c9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::log </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>base</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Logarithm for any base. </p>\n<p>From GLM_GTX_log_base. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga04ef803a24f3d4f8c67dbccb33b0fce0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::sign </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>base</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Logarithm for any base. </p>\n<p>From GLM_GTX_log_base. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00194.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_matrix_cross_product</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_matrix_cross_product<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00057.html\" title=\"GLM_GTX_matrix_cross_product \">glm/gtx/matrix_cross_product.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga5802386bb4c37b3332a3b6fd8b6960ff\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5802386bb4c37b3332a3b6fd8b6960ff\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00194.html#ga5802386bb4c37b3332a3b6fd8b6960ff\">matrixCross3</a> (vec&lt; 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga5802386bb4c37b3332a3b6fd8b6960ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a cross product matrix.  <a href=\"a00194.html#ga5802386bb4c37b3332a3b6fd8b6960ff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5802386bb4c37b3332a3b6fd8b6960ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20057fff91ddafa102934adb25458cde\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga20057fff91ddafa102934adb25458cde\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00194.html#ga20057fff91ddafa102934adb25458cde\">matrixCross4</a> (vec&lt; 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga20057fff91ddafa102934adb25458cde\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a cross product matrix.  <a href=\"a00194.html#ga20057fff91ddafa102934adb25458cde\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20057fff91ddafa102934adb25458cde\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00057.html\" title=\"GLM_GTX_matrix_cross_product \">glm/gtx/matrix_cross_product.hpp</a>&gt; to use the features of this extension. </p>\n<p>Build cross product matrices </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga5802386bb4c37b3332a3b6fd8b6960ff\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::matrixCross3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a cross product matrix. </p>\n<p>From GLM_GTX_matrix_cross_product extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga20057fff91ddafa102934adb25458cde\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::matrixCross4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a cross product matrix. </p>\n<p>From GLM_GTX_matrix_cross_product extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00195.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_matrix_decompose</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_matrix_decompose<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00058.html\" title=\"GLM_GTX_matrix_decompose \">glm/gtx/matrix_decompose.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga91185463739c855d602596907a9994bc\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga91185463739c855d602596907a9994bc\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00195.html#ga91185463739c855d602596907a9994bc\">decompose</a> (mat&lt; 4, 4, T, Q &gt; const &amp;modelMatrix, vec&lt; 3, T, Q &gt; &amp;scale, tquat&lt; T, Q &gt; &amp;orientation, vec&lt; 3, T, Q &gt; &amp;translation, vec&lt; 3, T, Q &gt; &amp;skew, vec&lt; 4, T, Q &gt; &amp;perspective)</td></tr>\n<tr class=\"memdesc:ga91185463739c855d602596907a9994bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Decomposes a model matrix to translations, rotation and scale components.  <a href=\"a00195.html#ga91185463739c855d602596907a9994bc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga91185463739c855d602596907a9994bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00058.html\" title=\"GLM_GTX_matrix_decompose \">glm/gtx/matrix_decompose.hpp</a>&gt; to use the features of this extension. </p>\n<p>Decomposes a model matrix to translations, rotation and scale components </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga91185463739c855d602596907a9994bc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::decompose </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>modelMatrix</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>scale</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>orientation</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>translation</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>skew</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>perspective</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Decomposes a model matrix to translations, rotation and scale components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00195.html\" title=\"Include <glm/gtx/matrix_decompose.hpp> to use the features of this extension. \">GLM_GTX_matrix_decompose</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00196.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_matrix_factorisation</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_matrix_factorisation<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00059.html\" title=\"GLM_GTX_matrix_factorisation \">glm/gtx/matrix_factorisation.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaf39f4e5f78eb29c1a90277d45b9b3feb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf39f4e5f78eb29c1a90277d45b9b3feb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html#gaf39f4e5f78eb29c1a90277d45b9b3feb\">fliplr</a> (mat&lt; C, R, T, Q &gt; const &amp;in)</td></tr>\n<tr class=\"memdesc:gaf39f4e5f78eb29c1a90277d45b9b3feb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Flips the matrix columns right and left.  <a href=\"a00196.html#gaf39f4e5f78eb29c1a90277d45b9b3feb\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf39f4e5f78eb29c1a90277d45b9b3feb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85003371f0ba97380dd25e8905de1870\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga85003371f0ba97380dd25e8905de1870\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html#ga85003371f0ba97380dd25e8905de1870\">flipud</a> (mat&lt; C, R, T, Q &gt; const &amp;in)</td></tr>\n<tr class=\"memdesc:ga85003371f0ba97380dd25e8905de1870\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Flips the matrix rows up and down.  <a href=\"a00196.html#ga85003371f0ba97380dd25e8905de1870\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85003371f0ba97380dd25e8905de1870\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac62d7bfc8dc661e616620d70552cd566\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac62d7bfc8dc661e616620d70552cd566\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html#gac62d7bfc8dc661e616620d70552cd566\">qr_decompose</a> (mat&lt; C, R, T, Q &gt; const &amp;in, mat&lt;(C&lt; R?C:R), R, T, Q &gt; &amp;q, mat&lt; C,(C&lt; R?C:R), T, Q &gt; &amp;r)</td></tr>\n<tr class=\"memdesc:gac62d7bfc8dc661e616620d70552cd566\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Performs QR factorisation of a matrix.  <a href=\"a00196.html#gac62d7bfc8dc661e616620d70552cd566\">More...</a><br /></td></tr>\n<tr class=\"separator:gac62d7bfc8dc661e616620d70552cd566\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga82874e2ebe891ba35ac21d9993873758\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga82874e2ebe891ba35ac21d9993873758\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00196.html#ga82874e2ebe891ba35ac21d9993873758\">rq_decompose</a> (mat&lt; C, R, T, Q &gt; const &amp;in, mat&lt;(C&lt; R?C:R), R, T, Q &gt; &amp;r, mat&lt; C,(C&lt; R?C:R), T, Q &gt; &amp;q)</td></tr>\n<tr class=\"memdesc:ga82874e2ebe891ba35ac21d9993873758\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Performs RQ factorisation of a matrix.  <a href=\"a00196.html#ga82874e2ebe891ba35ac21d9993873758\">More...</a><br /></td></tr>\n<tr class=\"separator:ga82874e2ebe891ba35ac21d9993873758\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00059.html\" title=\"GLM_GTX_matrix_factorisation \">glm/gtx/matrix_factorisation.hpp</a>&gt; to use the features of this extension. </p>\n<p>Functions to factor matrices in various forms </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaf39f4e5f78eb29c1a90277d45b9b3feb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;C, R, T, Q&gt; glm::fliplr </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>in</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Flips the matrix columns right and left. </p>\n<p>From GLM_GTX_matrix_factorisation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga85003371f0ba97380dd25e8905de1870\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;C, R, T, Q&gt; glm::flipud </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>in</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Flips the matrix rows up and down. </p>\n<p>From GLM_GTX_matrix_factorisation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac62d7bfc8dc661e616620d70552cd566\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL void glm::qr_decompose </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>in</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Performs QR factorisation of a matrix. </p>\n<p>Returns 2 matrices, q and r, such that the columns of q are orthonormal and span the same subspace than those of the input matrix, r is an upper triangular matrix, and q*r=in. Given an n-by-m input matrix, q has dimensions min(n,m)-by-m, and r has dimensions n-by-min(n,m).</p>\n<p>From GLM_GTX_matrix_factorisation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga82874e2ebe891ba35ac21d9993873758\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL void glm::rq_decompose </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>in</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Performs RQ factorisation of a matrix. </p>\n<p>Returns 2 matrices, r and q, such that r is an upper triangular matrix, the rows of q are orthonormal and span the same subspace than those of the input matrix, and r*q=in. Note that in the context of RQ factorisation, the diagonal is seen as starting in the lower-right corner of the matrix, instead of the usual upper-left. Given an n-by-m input matrix, r has dimensions min(n,m)-by-m, and q has dimensions n-by-min(n,m).</p>\n<p>From GLM_GTX_matrix_factorisation extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00197.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_matrix_interpolation</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_matrix_interpolation<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00061.html\" title=\"GLM_GTX_matrix_interpolation \">glm/gtx/matrix_interpolation.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga97f160158906ea89676f56cc4697ec98\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga97f160158906ea89676f56cc4697ec98\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html#ga97f160158906ea89676f56cc4697ec98\">axisAngle</a> (mat&lt; 4, 4, T, Q &gt; const &amp;mat, vec&lt; 3, T, Q &gt; &amp;axis, T &amp;angle)</td></tr>\n<tr class=\"memdesc:ga97f160158906ea89676f56cc4697ec98\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Get the axis and angle of the rotation from a matrix.  <a href=\"a00197.html#ga97f160158906ea89676f56cc4697ec98\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97f160158906ea89676f56cc4697ec98\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga992a5db71893ed1ba6ebac99f0f69831\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga992a5db71893ed1ba6ebac99f0f69831\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html#ga992a5db71893ed1ba6ebac99f0f69831\">axisAngleMatrix</a> (vec&lt; 3, T, Q &gt; const &amp;axis, T const angle)</td></tr>\n<tr class=\"memdesc:ga992a5db71893ed1ba6ebac99f0f69831\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a matrix from axis and angle.  <a href=\"a00197.html#ga992a5db71893ed1ba6ebac99f0f69831\">More...</a><br /></td></tr>\n<tr class=\"separator:ga992a5db71893ed1ba6ebac99f0f69831\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8834d4499a1a52fcf531b4506f0b5f67\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8834d4499a1a52fcf531b4506f0b5f67\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html#ga8834d4499a1a52fcf531b4506f0b5f67\">extractMatrixRotation</a> (mat&lt; 4, 4, T, Q &gt; const &amp;mat)</td></tr>\n<tr class=\"memdesc:ga8834d4499a1a52fcf531b4506f0b5f67\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extracts the rotation part of a matrix.  <a href=\"a00197.html#ga8834d4499a1a52fcf531b4506f0b5f67\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8834d4499a1a52fcf531b4506f0b5f67\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad5fc63a2e084000b39f6508ab07421a5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad5fc63a2e084000b39f6508ab07421a5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00197.html#gad5fc63a2e084000b39f6508ab07421a5\">interpolate</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m1, mat&lt; 4, 4, T, Q &gt; const &amp;m2, T const delta)</td></tr>\n<tr class=\"memdesc:gad5fc63a2e084000b39f6508ab07421a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a interpolation of 4 * 4 matrixes.  <a href=\"a00197.html#gad5fc63a2e084000b39f6508ab07421a5\">More...</a><br /></td></tr>\n<tr class=\"separator:gad5fc63a2e084000b39f6508ab07421a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00061.html\" title=\"GLM_GTX_matrix_interpolation \">glm/gtx/matrix_interpolation.hpp</a>&gt; to use the features of this extension. </p>\n<p>Allows to directly interpolate two exiciting matrices. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga97f160158906ea89676f56cc4697ec98\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL void glm::axisAngle </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>mat</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>axis</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Get the axis and angle of the rotation from a matrix. </p>\n<p>From GLM_GTX_matrix_interpolation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga992a5db71893ed1ba6ebac99f0f69831\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::axisAngleMatrix </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>axis</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a matrix from axis and angle. </p>\n<p>From GLM_GTX_matrix_interpolation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8834d4499a1a52fcf531b4506f0b5f67\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::extractMatrixRotation </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>mat</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Extracts the rotation part of a matrix. </p>\n<p>From GLM_GTX_matrix_interpolation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad5fc63a2e084000b39f6508ab07421a5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::interpolate </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const&#160;</td>\n          <td class=\"paramname\"><em>delta</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a interpolation of 4 * 4 matrixes. </p>\n<p>From GLM_GTX_matrix_interpolation extension. Warning! works only with rotation and/or translation matrixes, scale will generate unexpected results. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00198.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_matrix_major_storage</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_matrix_major_storage<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00063.html\" title=\"GLM_GTX_matrix_major_storage \">glm/gtx/matrix_major_storage.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaaff72f11286e59a4a88ed21a347f284c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaaff72f11286e59a4a88ed21a347f284c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaaff72f11286e59a4a88ed21a347f284c\">colMajor2</a> (vec&lt; 2, T, Q &gt; const &amp;v1, vec&lt; 2, T, Q &gt; const &amp;v2)</td></tr>\n<tr class=\"memdesc:gaaff72f11286e59a4a88ed21a347f284c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from column vectors.  <a href=\"a00198.html#gaaff72f11286e59a4a88ed21a347f284c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaff72f11286e59a4a88ed21a347f284c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafc25fd44196c92b1397b127aec1281ab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafc25fd44196c92b1397b127aec1281ab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gafc25fd44196c92b1397b127aec1281ab\">colMajor2</a> (mat&lt; 2, 2, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gafc25fd44196c92b1397b127aec1281ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from other matrix.  <a href=\"a00198.html#gafc25fd44196c92b1397b127aec1281ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gafc25fd44196c92b1397b127aec1281ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1e25b72b085087740c92f5c70f3b051f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1e25b72b085087740c92f5c70f3b051f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#ga1e25b72b085087740c92f5c70f3b051f\">colMajor3</a> (vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)</td></tr>\n<tr class=\"memdesc:ga1e25b72b085087740c92f5c70f3b051f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from column vectors.  <a href=\"a00198.html#ga1e25b72b085087740c92f5c70f3b051f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1e25b72b085087740c92f5c70f3b051f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga86bd0656e787bb7f217607572590af27\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga86bd0656e787bb7f217607572590af27\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#ga86bd0656e787bb7f217607572590af27\">colMajor3</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:ga86bd0656e787bb7f217607572590af27\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from other matrix.  <a href=\"a00198.html#ga86bd0656e787bb7f217607572590af27\">More...</a><br /></td></tr>\n<tr class=\"separator:ga86bd0656e787bb7f217607572590af27\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4aa6c7e17bfce41a6c13bf6469fab05\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf4aa6c7e17bfce41a6c13bf6469fab05\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaf4aa6c7e17bfce41a6c13bf6469fab05\">colMajor4</a> (vec&lt; 4, T, Q &gt; const &amp;v1, vec&lt; 4, T, Q &gt; const &amp;v2, vec&lt; 4, T, Q &gt; const &amp;v3, vec&lt; 4, T, Q &gt; const &amp;v4)</td></tr>\n<tr class=\"memdesc:gaf4aa6c7e17bfce41a6c13bf6469fab05\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from column vectors.  <a href=\"a00198.html#gaf4aa6c7e17bfce41a6c13bf6469fab05\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4aa6c7e17bfce41a6c13bf6469fab05\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3\">colMajor4</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a column major matrix from other matrix.  <a href=\"a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf3f9511c366c20ba2e4a64c9e4cec2b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\">rowMajor2</a> (vec&lt; 2, T, Q &gt; const &amp;v1, vec&lt; 2, T, Q &gt; const &amp;v2)</td></tr>\n<tr class=\"memdesc:gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from row vectors.  <a href=\"a00198.html#gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf66c75ed69ca9e87462550708c2c6726\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf66c75ed69ca9e87462550708c2c6726\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gaf66c75ed69ca9e87462550708c2c6726\">rowMajor2</a> (mat&lt; 2, 2, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gaf66c75ed69ca9e87462550708c2c6726\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from other matrix.  <a href=\"a00198.html#gaf66c75ed69ca9e87462550708c2c6726\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf66c75ed69ca9e87462550708c2c6726\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2ae46497493339f745754e40f438442e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2ae46497493339f745754e40f438442e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#ga2ae46497493339f745754e40f438442e\">rowMajor3</a> (vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)</td></tr>\n<tr class=\"memdesc:ga2ae46497493339f745754e40f438442e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from row vectors.  <a href=\"a00198.html#ga2ae46497493339f745754e40f438442e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2ae46497493339f745754e40f438442e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77\">rowMajor3</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from other matrix.  <a href=\"a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77\">More...</a><br /></td></tr>\n<tr class=\"separator:gad8a3a50ab47bbe8d36cdb81d90dfcf77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#ga9636cd6bbe2c32a8d0c03ffb8b1ef284\">rowMajor4</a> (vec&lt; 4, T, Q &gt; const &amp;v1, vec&lt; 4, T, Q &gt; const &amp;v2, vec&lt; 4, T, Q &gt; const &amp;v3, vec&lt; 4, T, Q &gt; const &amp;v4)</td></tr>\n<tr class=\"memdesc:ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from row vectors.  <a href=\"a00198.html#ga9636cd6bbe2c32a8d0c03ffb8b1ef284\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac92ad1c2acdf18d3eb7be45a32f9566b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac92ad1c2acdf18d3eb7be45a32f9566b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b\">rowMajor4</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gac92ad1c2acdf18d3eb7be45a32f9566b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a row major matrix from other matrix.  <a href=\"a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b\">More...</a><br /></td></tr>\n<tr class=\"separator:gac92ad1c2acdf18d3eb7be45a32f9566b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00063.html\" title=\"GLM_GTX_matrix_major_storage \">glm/gtx/matrix_major_storage.hpp</a>&gt; to use the features of this extension. </p>\n<p>Build matrices with specific matrix order, row or column </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaaff72f11286e59a4a88ed21a347f284c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; glm::colMajor2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a column major matrix from column vectors. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafc25fd44196c92b1397b127aec1281ab\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; glm::colMajor2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 2, 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a column major matrix from other matrix. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1e25b72b085087740c92f5c70f3b051f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::colMajor3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v3</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a column major matrix from column vectors. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga86bd0656e787bb7f217607572590af27\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::colMajor3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a column major matrix from other matrix. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf4aa6c7e17bfce41a6c13bf6469fab05\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::colMajor4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v3</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v4</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a column major matrix from column vectors. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf3f9511c366c20ba2e4a64c9e4cec2b3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::colMajor4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a column major matrix from other matrix. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; glm::rowMajor2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a row major matrix from row vectors. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf66c75ed69ca9e87462550708c2c6726\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; glm::rowMajor2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 2, 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a row major matrix from other matrix. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2ae46497493339f745754e40f438442e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::rowMajor3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v3</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a row major matrix from row vectors. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad8a3a50ab47bbe8d36cdb81d90dfcf77\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::rowMajor3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a row major matrix from other matrix. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9636cd6bbe2c32a8d0c03ffb8b1ef284\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::rowMajor4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v3</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v4</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a row major matrix from row vectors. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac92ad1c2acdf18d3eb7be45a32f9566b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::rowMajor4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a row major matrix from other matrix. </p>\n<p>From GLM_GTX_matrix_major_storage extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00199.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_matrix_operation</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_matrix_operation<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00064.html\" title=\"GLM_GTX_matrix_operation \">glm/gtx/matrix_operation.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga58a32a2beeb2478dae2a721368cdd4ac\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga58a32a2beeb2478dae2a721368cdd4ac\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga58a32a2beeb2478dae2a721368cdd4ac\">diagonal2x2</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga58a32a2beeb2478dae2a721368cdd4ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga58a32a2beeb2478dae2a721368cdd4ac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga58a32a2beeb2478dae2a721368cdd4ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab69f900206a430e2875a5a073851e175\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab69f900206a430e2875a5a073851e175\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#gab69f900206a430e2875a5a073851e175\">diagonal2x3</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gab69f900206a430e2875a5a073851e175\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#gab69f900206a430e2875a5a073851e175\">More...</a><br /></td></tr>\n<tr class=\"separator:gab69f900206a430e2875a5a073851e175\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga30b4dbfed60a919d66acc8a63bcdc549\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga30b4dbfed60a919d66acc8a63bcdc549\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 2, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga30b4dbfed60a919d66acc8a63bcdc549\">diagonal2x4</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga30b4dbfed60a919d66acc8a63bcdc549\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga30b4dbfed60a919d66acc8a63bcdc549\">More...</a><br /></td></tr>\n<tr class=\"separator:ga30b4dbfed60a919d66acc8a63bcdc549\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga832c805d5130d28ad76236958d15b47d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga832c805d5130d28ad76236958d15b47d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga832c805d5130d28ad76236958d15b47d\">diagonal3x2</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga832c805d5130d28ad76236958d15b47d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga832c805d5130d28ad76236958d15b47d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga832c805d5130d28ad76236958d15b47d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5487ff9cdbc8e04d594adef1bcb16ee0\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5487ff9cdbc8e04d594adef1bcb16ee0\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga5487ff9cdbc8e04d594adef1bcb16ee0\">diagonal3x3</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga5487ff9cdbc8e04d594adef1bcb16ee0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga5487ff9cdbc8e04d594adef1bcb16ee0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5487ff9cdbc8e04d594adef1bcb16ee0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad7551139cff0c4208d27f0ad3437833e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad7551139cff0c4208d27f0ad3437833e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#gad7551139cff0c4208d27f0ad3437833e\">diagonal3x4</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gad7551139cff0c4208d27f0ad3437833e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#gad7551139cff0c4208d27f0ad3437833e\">More...</a><br /></td></tr>\n<tr class=\"separator:gad7551139cff0c4208d27f0ad3437833e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb8969e6543ba775c6638161a37ac330\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacb8969e6543ba775c6638161a37ac330\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#gacb8969e6543ba775c6638161a37ac330\">diagonal4x2</a> (vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gacb8969e6543ba775c6638161a37ac330\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#gacb8969e6543ba775c6638161a37ac330\">More...</a><br /></td></tr>\n<tr class=\"separator:gacb8969e6543ba775c6638161a37ac330\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae235def5049d6740f0028433f5e13f90\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae235def5049d6740f0028433f5e13f90\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#gae235def5049d6740f0028433f5e13f90\">diagonal4x3</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gae235def5049d6740f0028433f5e13f90\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#gae235def5049d6740f0028433f5e13f90\">More...</a><br /></td></tr>\n<tr class=\"separator:gae235def5049d6740f0028433f5e13f90\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0b4cd8dea436791b072356231ee8578f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0b4cd8dea436791b072356231ee8578f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00199.html#ga0b4cd8dea436791b072356231ee8578f\">diagonal4x4</a> (vec&lt; 4, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga0b4cd8dea436791b072356231ee8578f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a diagonal matrix.  <a href=\"a00199.html#ga0b4cd8dea436791b072356231ee8578f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0b4cd8dea436791b072356231ee8578f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00064.html\" title=\"GLM_GTX_matrix_operation \">glm/gtx/matrix_operation.hpp</a>&gt; to use the features of this extension. </p>\n<p>Build diagonal matrices from vectors. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga58a32a2beeb2478dae2a721368cdd4ac\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 2, T, Q&gt; glm::diagonal2x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab69f900206a430e2875a5a073851e175\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 3, T, Q&gt; glm::diagonal2x3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga30b4dbfed60a919d66acc8a63bcdc549\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;2, 4, T, Q&gt; glm::diagonal2x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga832c805d5130d28ad76236958d15b47d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 2, T, Q&gt; glm::diagonal3x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5487ff9cdbc8e04d594adef1bcb16ee0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::diagonal3x3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad7551139cff0c4208d27f0ad3437833e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 4, T, Q&gt; glm::diagonal3x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacb8969e6543ba775c6638161a37ac330\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 2, T, Q&gt; glm::diagonal4x2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae235def5049d6740f0028433f5e13f90\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 3, T, Q&gt; glm::diagonal4x3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0b4cd8dea436791b072356231ee8578f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::diagonal4x4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a diagonal matrix. </p>\n<p>From GLM_GTX_matrix_operation extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00200.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_matrix_query</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_matrix_query<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00065.html\" title=\"GLM_GTX_matrix_query \">glm/gtx/matrix_query.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaee935d145581c82e82b154ccfd78ad91\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q, template&lt; length_t, length_t, typename, qualifier &gt; class matType&gt; </td></tr>\n<tr class=\"memitem:gaee935d145581c82e82b154ccfd78ad91\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#gaee935d145581c82e82b154ccfd78ad91\">isIdentity</a> (matType&lt; C, R, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaee935d145581c82e82b154ccfd78ad91\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is an identity matrix.  <a href=\"a00200.html#gaee935d145581c82e82b154ccfd78ad91\">More...</a><br /></td></tr>\n<tr class=\"separator:gaee935d145581c82e82b154ccfd78ad91\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae785af56f47ce220a1609f7f84aa077a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae785af56f47ce220a1609f7f84aa077a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#gae785af56f47ce220a1609f7f84aa077a\">isNormalized</a> (mat&lt; 2, 2, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gae785af56f47ce220a1609f7f84aa077a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is a normalized matrix.  <a href=\"a00200.html#gae785af56f47ce220a1609f7f84aa077a\">More...</a><br /></td></tr>\n<tr class=\"separator:gae785af56f47ce220a1609f7f84aa077a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa068311695f28f5f555f5f746a6a66fb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa068311695f28f5f555f5f746a6a66fb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#gaa068311695f28f5f555f5f746a6a66fb\">isNormalized</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaa068311695f28f5f555f5f746a6a66fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is a normalized matrix.  <a href=\"a00200.html#gaa068311695f28f5f555f5f746a6a66fb\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa068311695f28f5f555f5f746a6a66fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4d9bb4d0465df49fedfad79adc6ce4ad\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4d9bb4d0465df49fedfad79adc6ce4ad\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad\">isNormalized</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga4d9bb4d0465df49fedfad79adc6ce4ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is a normalized matrix.  <a href=\"a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4d9bb4d0465df49fedfad79adc6ce4ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9790ec222ce948c0ff0d8ce927340dba\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9790ec222ce948c0ff0d8ce927340dba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#ga9790ec222ce948c0ff0d8ce927340dba\">isNull</a> (mat&lt; 2, 2, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga9790ec222ce948c0ff0d8ce927340dba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix a null matrix.  <a href=\"a00200.html#ga9790ec222ce948c0ff0d8ce927340dba\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9790ec222ce948c0ff0d8ce927340dba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae14501c6b14ccda6014cc5350080103d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae14501c6b14ccda6014cc5350080103d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#gae14501c6b14ccda6014cc5350080103d\">isNull</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gae14501c6b14ccda6014cc5350080103d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix a null matrix.  <a href=\"a00200.html#gae14501c6b14ccda6014cc5350080103d\">More...</a><br /></td></tr>\n<tr class=\"separator:gae14501c6b14ccda6014cc5350080103d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2b98bb30a9fefa7cdea5f1dcddba677b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2b98bb30a9fefa7cdea5f1dcddba677b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b\">isNull</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga2b98bb30a9fefa7cdea5f1dcddba677b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is a null matrix.  <a href=\"a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2b98bb30a9fefa7cdea5f1dcddba677b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga58f3289f74dcab653387dd78ad93ca40\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q, template&lt; length_t, length_t, typename, qualifier &gt; class matType&gt; </td></tr>\n<tr class=\"memitem:ga58f3289f74dcab653387dd78ad93ca40\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00200.html#ga58f3289f74dcab653387dd78ad93ca40\">isOrthogonal</a> (matType&lt; C, R, T, Q &gt; const &amp;m, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga58f3289f74dcab653387dd78ad93ca40\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return whether a matrix is an orthonormalized matrix.  <a href=\"a00200.html#ga58f3289f74dcab653387dd78ad93ca40\">More...</a><br /></td></tr>\n<tr class=\"separator:ga58f3289f74dcab653387dd78ad93ca40\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00065.html\" title=\"GLM_GTX_matrix_query \">glm/gtx/matrix_query.hpp</a>&gt; to use the features of this extension. </p>\n<p>Query to evaluate matrix properties </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaee935d145581c82e82b154ccfd78ad91\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isIdentity </td>\n          <td>(</td>\n          <td class=\"paramtype\">matType&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return whether a matrix is an identity matrix. </p>\n<p>From GLM_GTX_matrix_query extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae785af56f47ce220a1609f7f84aa077a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isNormalized </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 2, 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return whether a matrix is a normalized matrix. </p>\n<p>From GLM_GTX_matrix_query extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa068311695f28f5f555f5f746a6a66fb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isNormalized </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return whether a matrix is a normalized matrix. </p>\n<p>From GLM_GTX_matrix_query extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4d9bb4d0465df49fedfad79adc6ce4ad\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isNormalized </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return whether a matrix is a normalized matrix. </p>\n<p>From GLM_GTX_matrix_query extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9790ec222ce948c0ff0d8ce927340dba\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isNull </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 2, 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return whether a matrix a null matrix. </p>\n<p>From GLM_GTX_matrix_query extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae14501c6b14ccda6014cc5350080103d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isNull </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return whether a matrix a null matrix. </p>\n<p>From GLM_GTX_matrix_query extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2b98bb30a9fefa7cdea5f1dcddba677b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isNull </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return whether a matrix is a null matrix. </p>\n<p>From GLM_GTX_matrix_query extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga58f3289f74dcab653387dd78ad93ca40\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isOrthogonal </td>\n          <td>(</td>\n          <td class=\"paramtype\">matType&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return whether a matrix is an orthonormalized matrix. </p>\n<p>From GLM_GTX_matrix_query extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00201.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_matrix_transform_2d</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_matrix_transform_2d<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00067.html\" title=\"GLM_GTX_matrix_transform_2d \">glm/gtx/matrix_transform_2d.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gad5c84a4932a758f385a87098ce1b1660\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad5c84a4932a758f385a87098ce1b1660\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#gad5c84a4932a758f385a87098ce1b1660\">rotate</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T angle)</td></tr>\n<tr class=\"memdesc:gad5c84a4932a758f385a87098ce1b1660\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a rotation 3 * 3 matrix created from an angle.  <a href=\"a00201.html#gad5c84a4932a758f385a87098ce1b1660\">More...</a><br /></td></tr>\n<tr class=\"separator:gad5c84a4932a758f385a87098ce1b1660\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadb47d2ad2bd984b213e8ff7d9cd8154e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadb47d2ad2bd984b213e8ff7d9cd8154e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#gadb47d2ad2bd984b213e8ff7d9cd8154e\">scale</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gadb47d2ad2bd984b213e8ff7d9cd8154e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a scale 3 * 3 matrix created from a vector of 2 components.  <a href=\"a00201.html#gadb47d2ad2bd984b213e8ff7d9cd8154e\">More...</a><br /></td></tr>\n<tr class=\"separator:gadb47d2ad2bd984b213e8ff7d9cd8154e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2a118ece5db1e2022112b954846012af\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2a118ece5db1e2022112b954846012af\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#ga2a118ece5db1e2022112b954846012af\">shearX</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T y)</td></tr>\n<tr class=\"memdesc:ga2a118ece5db1e2022112b954846012af\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix.  <a href=\"a00201.html#ga2a118ece5db1e2022112b954846012af\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2a118ece5db1e2022112b954846012af\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga717f1833369c1ac4a40e4ac015af885e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga717f1833369c1ac4a40e4ac015af885e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#ga717f1833369c1ac4a40e4ac015af885e\">shearY</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T x)</td></tr>\n<tr class=\"memdesc:ga717f1833369c1ac4a40e4ac015af885e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a vertical (parallel to the y axis) shear 3 * 3 matrix.  <a href=\"a00201.html#ga717f1833369c1ac4a40e4ac015af885e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga717f1833369c1ac4a40e4ac015af885e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf4573ae47c80938aa9053ef6a33755ab\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf4573ae47c80938aa9053ef6a33755ab\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_QUALIFIER mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00201.html#gaf4573ae47c80938aa9053ef6a33755ab\">translate</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf4573ae47c80938aa9053ef6a33755ab\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a translation 3 * 3 matrix created from a vector of 2 components.  <a href=\"a00201.html#gaf4573ae47c80938aa9053ef6a33755ab\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf4573ae47c80938aa9053ef6a33755ab\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00067.html\" title=\"GLM_GTX_matrix_transform_2d \">glm/gtx/matrix_transform_2d.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines functions that generate common 2d transformation matrices. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gad5c84a4932a758f385a87098ce1b1660\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a rotation 3 * 3 matrix created from an angle. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this translation matrix. </td></tr>\n    <tr><td class=\"paramname\">angle</td><td>Rotation angle expressed in radians. </td></tr>\n  </table>\n  </dd>\n</dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadb47d2ad2bd984b213e8ff7d9cd8154e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; glm::scale </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a scale 3 * 3 matrix created from a vector of 2 components. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this translation matrix. </td></tr>\n    <tr><td class=\"paramname\">v</td><td>Coordinates of a scale vector. </td></tr>\n  </table>\n  </dd>\n</dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2a118ece5db1e2022112b954846012af\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; glm::shearX </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this translation matrix. </td></tr>\n    <tr><td class=\"paramname\">y</td><td>Shear factor. </td></tr>\n  </table>\n  </dd>\n</dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga717f1833369c1ac4a40e4ac015af885e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; glm::shearY </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a vertical (parallel to the y axis) shear 3 * 3 matrix. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this translation matrix. </td></tr>\n    <tr><td class=\"paramname\">x</td><td>Shear factor. </td></tr>\n  </table>\n  </dd>\n</dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf4573ae47c80938aa9053ef6a33755ab\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_QUALIFIER mat&lt;3, 3, T, Q&gt; glm::translate </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a translation 3 * 3 matrix created from a vector of 2 components. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this translation matrix. </td></tr>\n    <tr><td class=\"paramname\">v</td><td>Coordinates of a translation vector. </td></tr>\n  </table>\n  </dd>\n</dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00202.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_mixed_producte</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_mixed_producte<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00068.html\" title=\"GLM_GTX_mixed_producte \">glm/gtx/mixed_product.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gab3c6048fbb67f7243b088a4fee48d020\"><td class=\"memTemplParams\" colspan=\"2\"><a class=\"anchor\" id=\"gab3c6048fbb67f7243b088a4fee48d020\"></a>\ntemplate&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab3c6048fbb67f7243b088a4fee48d020\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00202.html#gab3c6048fbb67f7243b088a4fee48d020\">mixedProduct</a> (vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)</td></tr>\n<tr class=\"memdesc:gab3c6048fbb67f7243b088a4fee48d020\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Mixed product of 3 vectors (from GLM_GTX_mixed_product extension) <br /></td></tr>\n<tr class=\"separator:gab3c6048fbb67f7243b088a4fee48d020\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00068.html\" title=\"GLM_GTX_mixed_producte \">glm/gtx/mixed_product.hpp</a>&gt; to use the features of this extension. </p>\n<p>Mixed product of 3 vectors. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00203.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_norm</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_norm<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00070.html\" title=\"GLM_GTX_norm \">glm/gtx/norm.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga85660f1b79f66c09c7b5a6f80e68c89f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga85660f1b79f66c09c7b5a6f80e68c89f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#ga85660f1b79f66c09c7b5a6f80e68c89f\">distance2</a> (vec&lt; L, T, Q &gt; const &amp;p0, vec&lt; L, T, Q &gt; const &amp;p1)</td></tr>\n<tr class=\"memdesc:ga85660f1b79f66c09c7b5a6f80e68c89f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the squared distance between p0 and p1, i.e., length2(p0 - p1).  <a href=\"a00203.html#ga85660f1b79f66c09c7b5a6f80e68c89f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85660f1b79f66c09c7b5a6f80e68c89f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae2fc0b2aa967bebfd6a244700bff6997\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae2fc0b2aa967bebfd6a244700bff6997\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#gae2fc0b2aa967bebfd6a244700bff6997\">l1Norm</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gae2fc0b2aa967bebfd6a244700bff6997\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L1 norm between x and y.  <a href=\"a00203.html#gae2fc0b2aa967bebfd6a244700bff6997\">More...</a><br /></td></tr>\n<tr class=\"separator:gae2fc0b2aa967bebfd6a244700bff6997\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1a7491e2037ceeb37f83ce41addfc0be\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1a7491e2037ceeb37f83ce41addfc0be\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be\">l1Norm</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga1a7491e2037ceeb37f83ce41addfc0be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L1 norm of v.  <a href=\"a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a7491e2037ceeb37f83ce41addfc0be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41340b2ef40a9307ab0f137181565168\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga41340b2ef40a9307ab0f137181565168\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#ga41340b2ef40a9307ab0f137181565168\">l2Norm</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga41340b2ef40a9307ab0f137181565168\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L2 norm between x and y.  <a href=\"a00203.html#ga41340b2ef40a9307ab0f137181565168\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41340b2ef40a9307ab0f137181565168\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae288bde8f0e41fb4ed62e65137b18cba\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae288bde8f0e41fb4ed62e65137b18cba\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#gae288bde8f0e41fb4ed62e65137b18cba\">l2Norm</a> (vec&lt; 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae288bde8f0e41fb4ed62e65137b18cba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L2 norm of v.  <a href=\"a00203.html#gae288bde8f0e41fb4ed62e65137b18cba\">More...</a><br /></td></tr>\n<tr class=\"separator:gae288bde8f0e41fb4ed62e65137b18cba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8d1789651050adb7024917984b41c3de\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8d1789651050adb7024917984b41c3de\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#ga8d1789651050adb7024917984b41c3de\">length2</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8d1789651050adb7024917984b41c3de\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the squared length of x.  <a href=\"a00203.html#ga8d1789651050adb7024917984b41c3de\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8d1789651050adb7024917984b41c3de\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacad23d30497eb16f67709f2375d1f66a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacad23d30497eb16f67709f2375d1f66a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#gacad23d30497eb16f67709f2375d1f66a\">lxNorm</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, unsigned int Depth)</td></tr>\n<tr class=\"memdesc:gacad23d30497eb16f67709f2375d1f66a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L norm between x and y.  <a href=\"a00203.html#gacad23d30497eb16f67709f2375d1f66a\">More...</a><br /></td></tr>\n<tr class=\"separator:gacad23d30497eb16f67709f2375d1f66a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac61b6d81d796d6eb4d4183396a19ab91\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac61b6d81d796d6eb4d4183396a19ab91\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00203.html#gac61b6d81d796d6eb4d4183396a19ab91\">lxNorm</a> (vec&lt; 3, T, Q &gt; const &amp;x, unsigned int Depth)</td></tr>\n<tr class=\"memdesc:gac61b6d81d796d6eb4d4183396a19ab91\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the L norm of v.  <a href=\"a00203.html#gac61b6d81d796d6eb4d4183396a19ab91\">More...</a><br /></td></tr>\n<tr class=\"separator:gac61b6d81d796d6eb4d4183396a19ab91\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00070.html\" title=\"GLM_GTX_norm \">glm/gtx/norm.hpp</a>&gt; to use the features of this extension. </p>\n<p>Various ways to compute vector norms. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga85660f1b79f66c09c7b5a6f80e68c89f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::distance2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p1</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the squared distance between p0 and p1, i.e., length2(p0 - p1). </p>\n<p>From GLM_GTX_norm extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae2fc0b2aa967bebfd6a244700bff6997\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::l1Norm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the L1 norm between x and y. </p>\n<p>From GLM_GTX_norm extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1a7491e2037ceeb37f83ce41addfc0be\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::l1Norm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the L1 norm of v. </p>\n<p>From GLM_GTX_norm extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga41340b2ef40a9307ab0f137181565168\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::l2Norm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the L2 norm between x and y. </p>\n<p>From GLM_GTX_norm extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae288bde8f0e41fb4ed62e65137b18cba\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::l2Norm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the L2 norm of v. </p>\n<p>From GLM_GTX_norm extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8d1789651050adb7024917984b41c3de\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::length2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the squared length of x. </p>\n<p>From GLM_GTX_norm extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacad23d30497eb16f67709f2375d1f66a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::lxNorm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">unsigned int&#160;</td>\n          <td class=\"paramname\"><em>Depth</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the L norm between x and y. </p>\n<p>From GLM_GTX_norm extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac61b6d81d796d6eb4d4183396a19ab91\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::lxNorm </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">unsigned int&#160;</td>\n          <td class=\"paramname\"><em>Depth</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the L norm of v. </p>\n<p>From GLM_GTX_norm extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00204.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_normal</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_normal<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00071.html\" title=\"GLM_GTX_normal \">glm/gtx/normal.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaff1cb5496925dfa7962df457772a7f35\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaff1cb5496925dfa7962df457772a7f35\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00204.html#gaff1cb5496925dfa7962df457772a7f35\">triangleNormal</a> (vec&lt; 3, T, Q &gt; const &amp;p1, vec&lt; 3, T, Q &gt; const &amp;p2, vec&lt; 3, T, Q &gt; const &amp;p3)</td></tr>\n<tr class=\"memdesc:gaff1cb5496925dfa7962df457772a7f35\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Computes triangle normal from triangle points.  <a href=\"a00204.html#gaff1cb5496925dfa7962df457772a7f35\">More...</a><br /></td></tr>\n<tr class=\"separator:gaff1cb5496925dfa7962df457772a7f35\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00071.html\" title=\"GLM_GTX_normal \">glm/gtx/normal.hpp</a>&gt; to use the features of this extension. </p>\n<p>Compute the normal of a triangle. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaff1cb5496925dfa7962df457772a7f35\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::triangleNormal </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>p3</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Computes triangle normal from triangle points. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00204.html\" title=\"Include <glm/gtx/normal.hpp> to use the features of this extension. \">GLM_GTX_normal</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00205.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_normalize_dot</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_normalize_dot<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;glm/gtx/normalized_dot.hpp&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga2746fb9b5bd22b06b2f7c8babba5de9e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2746fb9b5bd22b06b2f7c8babba5de9e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00205.html#ga2746fb9b5bd22b06b2f7c8babba5de9e\">fastNormalizeDot</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga2746fb9b5bd22b06b2f7c8babba5de9e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Normalize parameters and returns the dot product of x and y.  <a href=\"a00205.html#ga2746fb9b5bd22b06b2f7c8babba5de9e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2746fb9b5bd22b06b2f7c8babba5de9e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacb140a2b903115d318c8b0a2fb5a5daa\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacb140a2b903115d318c8b0a2fb5a5daa\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00205.html#gacb140a2b903115d318c8b0a2fb5a5daa\">normalizeDot</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gacb140a2b903115d318c8b0a2fb5a5daa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Normalize parameters and returns the dot product of x and y.  <a href=\"a00205.html#gacb140a2b903115d318c8b0a2fb5a5daa\">More...</a><br /></td></tr>\n<tr class=\"separator:gacb140a2b903115d318c8b0a2fb5a5daa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;glm/gtx/normalized_dot.hpp&gt; to use the features of this extension. </p>\n<p>Dot product of vectors that need to be normalize with a single square root. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga2746fb9b5bd22b06b2f7c8babba5de9e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::fastNormalizeDot </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Normalize parameters and returns the dot product of x and y. </p>\n<p>Faster that dot(fastNormalize(x), fastNormalize(y)).</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00205.html\" title=\"Include <glm/gtx/normalized_dot.hpp> to use the features of this extension. \">GLM_GTX_normalize_dot</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacb140a2b903115d318c8b0a2fb5a5daa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::normalizeDot </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Normalize parameters and returns the dot product of x and y. </p>\n<p>It's faster that dot(normalize(x), normalize(y)).</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00205.html\" title=\"Include <glm/gtx/normalized_dot.hpp> to use the features of this extension. \">GLM_GTX_normalize_dot</a> extension. </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00206.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_number_precision</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_number_precision<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00073.html\" title=\"GLM_GTX_number_precision \">glm/gtx/number_precision.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga145ad477a2a3e152855511c3b52469a6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga145ad477a2a3e152855511c3b52469a6\"></a>\ntypedef f32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga145ad477a2a3e152855511c3b52469a6\">f32mat1</a></td></tr>\n<tr class=\"memdesc:ga145ad477a2a3e152855511c3b52469a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga145ad477a2a3e152855511c3b52469a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac88c6a4dbfc380aa26e3adbbade36348\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gac88c6a4dbfc380aa26e3adbbade36348\"></a>\ntypedef f32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#gac88c6a4dbfc380aa26e3adbbade36348\">f32mat1x1</a></td></tr>\n<tr class=\"memdesc:gac88c6a4dbfc380aa26e3adbbade36348\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:gac88c6a4dbfc380aa26e3adbbade36348\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga07f8d7348eb7ae059a84c118fdfeb943\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga07f8d7348eb7ae059a84c118fdfeb943\"></a>\ntypedef f32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga07f8d7348eb7ae059a84c118fdfeb943\">f32vec1</a></td></tr>\n<tr class=\"memdesc:ga07f8d7348eb7ae059a84c118fdfeb943\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga07f8d7348eb7ae059a84c118fdfeb943\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga59bfa589419b5265d01314fcecd33435\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga59bfa589419b5265d01314fcecd33435\"></a>\ntypedef f64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga59bfa589419b5265d01314fcecd33435\">f64mat1</a></td></tr>\n<tr class=\"memdesc:ga59bfa589419b5265d01314fcecd33435\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga59bfa589419b5265d01314fcecd33435\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga448eeb08d0b7d8c43a8b292c981955fd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga448eeb08d0b7d8c43a8b292c981955fd\"></a>\ntypedef f64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga448eeb08d0b7d8c43a8b292c981955fd\">f64mat1x1</a></td></tr>\n<tr class=\"memdesc:ga448eeb08d0b7d8c43a8b292c981955fd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga448eeb08d0b7d8c43a8b292c981955fd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae5987a61b8c03d5c432a9e62f0b3efe1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"gae5987a61b8c03d5c432a9e62f0b3efe1\"></a>\ntypedef f64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#gae5987a61b8c03d5c432a9e62f0b3efe1\">f64vec1</a></td></tr>\n<tr class=\"memdesc:gae5987a61b8c03d5c432a9e62f0b3efe1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:gae5987a61b8c03d5c432a9e62f0b3efe1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga52cc069a92e126c3a8dcde93424d2ef0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga52cc069a92e126c3a8dcde93424d2ef0\"></a>\ntypedef u16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga52cc069a92e126c3a8dcde93424d2ef0\">u16vec1</a></td></tr>\n<tr class=\"memdesc:ga52cc069a92e126c3a8dcde93424d2ef0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">16bit unsigned integer scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga52cc069a92e126c3a8dcde93424d2ef0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"></a>\ntypedef u32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga9bbc1e14aea65cba5e2dcfef6a67d9f3\">u32vec1</a></td></tr>\n<tr class=\"memdesc:ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32bit unsigned integer scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga9bbc1e14aea65cba5e2dcfef6a67d9f3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga818de170e2584ab037130f2881925974\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga818de170e2584ab037130f2881925974\"></a>\ntypedef u64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga818de170e2584ab037130f2881925974\">u64vec1</a></td></tr>\n<tr class=\"memdesc:ga818de170e2584ab037130f2881925974\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64bit unsigned integer scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga818de170e2584ab037130f2881925974\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5853fe457f4c8a6bc09343d0e9833980\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\"><a class=\"anchor\" id=\"ga5853fe457f4c8a6bc09343d0e9833980\"></a>\ntypedef u8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00206.html#ga5853fe457f4c8a6bc09343d0e9833980\">u8vec1</a></td></tr>\n<tr class=\"memdesc:ga5853fe457f4c8a6bc09343d0e9833980\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">8bit unsigned integer scalar. (from GLM_GTX_number_precision extension) <br /></td></tr>\n<tr class=\"separator:ga5853fe457f4c8a6bc09343d0e9833980\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00073.html\" title=\"GLM_GTX_number_precision \">glm/gtx/number_precision.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defined size types. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00207.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_optimum_pow</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_optimum_pow<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00074.html\" title=\"GLM_GTX_optimum_pow \">glm/gtx/optimum_pow.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga19aaff3213bf23bdec3ef124ace237e9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga19aaff3213bf23bdec3ef124ace237e9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00207.html#ga19aaff3213bf23bdec3ef124ace237e9\">pow2</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga19aaff3213bf23bdec3ef124ace237e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the power of 2.  <a href=\"a00207.html#ga19aaff3213bf23bdec3ef124ace237e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga19aaff3213bf23bdec3ef124ace237e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga35689d03cd434d6ea819f1942d3bf82e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga35689d03cd434d6ea819f1942d3bf82e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00207.html#ga35689d03cd434d6ea819f1942d3bf82e\">pow3</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga35689d03cd434d6ea819f1942d3bf82e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the power of 3.  <a href=\"a00207.html#ga35689d03cd434d6ea819f1942d3bf82e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga35689d03cd434d6ea819f1942d3bf82e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacef0968763026e180e53e735007dbf5a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gacef0968763026e180e53e735007dbf5a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00207.html#gacef0968763026e180e53e735007dbf5a\">pow4</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:gacef0968763026e180e53e735007dbf5a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the power of 4.  <a href=\"a00207.html#gacef0968763026e180e53e735007dbf5a\">More...</a><br /></td></tr>\n<tr class=\"separator:gacef0968763026e180e53e735007dbf5a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00074.html\" title=\"GLM_GTX_optimum_pow \">glm/gtx/optimum_pow.hpp</a>&gt; to use the features of this extension. </p>\n<p>Integer exponentiation of power functions. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga19aaff3213bf23bdec3ef124ace237e9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::gtx::pow2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x raised to the power of 2. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00207.html\" title=\"Include <glm/gtx/optimum_pow.hpp> to use the features of this extension. \">GLM_GTX_optimum_pow</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga35689d03cd434d6ea819f1942d3bf82e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::gtx::pow3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x raised to the power of 3. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00207.html\" title=\"Include <glm/gtx/optimum_pow.hpp> to use the features of this extension. \">GLM_GTX_optimum_pow</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacef0968763026e180e53e735007dbf5a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::gtx::pow4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x raised to the power of 4. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00207.html\" title=\"Include <glm/gtx/optimum_pow.hpp> to use the features of this extension. \">GLM_GTX_optimum_pow</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00208.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_orthonormalize</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_orthonormalize<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00075.html\" title=\"GLM_GTX_orthonormalize \">glm/gtx/orthonormalize.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga4cab5d698e6e2eccea30c8e81c74371f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4cab5d698e6e2eccea30c8e81c74371f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00208.html#ga4cab5d698e6e2eccea30c8e81c74371f\">orthonormalize</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:ga4cab5d698e6e2eccea30c8e81c74371f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the orthonormalized matrix of m.  <a href=\"a00208.html#ga4cab5d698e6e2eccea30c8e81c74371f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4cab5d698e6e2eccea30c8e81c74371f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac3bc7ef498815026bc3d361ae0b7138e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac3bc7ef498815026bc3d361ae0b7138e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00208.html#gac3bc7ef498815026bc3d361ae0b7138e\">orthonormalize</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gac3bc7ef498815026bc3d361ae0b7138e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Orthonormalizes x according y.  <a href=\"a00208.html#gac3bc7ef498815026bc3d361ae0b7138e\">More...</a><br /></td></tr>\n<tr class=\"separator:gac3bc7ef498815026bc3d361ae0b7138e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00075.html\" title=\"GLM_GTX_orthonormalize \">glm/gtx/orthonormalize.hpp</a>&gt; to use the features of this extension. </p>\n<p>Orthonormalize matrices. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga4cab5d698e6e2eccea30c8e81c74371f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::orthonormalize </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the orthonormalized matrix of m. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00208.html\" title=\"Include <glm/gtx/orthonormalize.hpp> to use the features of this extension. \">GLM_GTX_orthonormalize</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac3bc7ef498815026bc3d361ae0b7138e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::orthonormalize </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Orthonormalizes x according y. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00208.html\" title=\"Include <glm/gtx/orthonormalize.hpp> to use the features of this extension. \">GLM_GTX_orthonormalize</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00209.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_perpendicular</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_perpendicular<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00079.html\" title=\"GLM_GTX_perpendicular \">glm/gtx/perpendicular.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00209.html#ga264cfc4e180cf9b852e943b35089003c\">perp</a> (genType const &amp;x, genType const &amp;Normal)</td></tr>\n<tr class=\"memdesc:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Projects x a perpendicular axis of Normal.  <a href=\"a00209.html#ga264cfc4e180cf9b852e943b35089003c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga264cfc4e180cf9b852e943b35089003c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00079.html\" title=\"GLM_GTX_perpendicular \">glm/gtx/perpendicular.hpp</a>&gt; to use the features of this extension. </p>\n<p>Perpendicular of a vector from other one </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga264cfc4e180cf9b852e943b35089003c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::perp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Normal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Projects x a perpendicular axis of Normal. </p>\n<p>From GLM_GTX_perpendicular extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00210.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_polar_coordinates</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_polar_coordinates<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00080.html\" title=\"GLM_GTX_polar_coordinates \">glm/gtx/polar_coordinates.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga1821d5b3324201e60a9e2823d0b5d0c8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1821d5b3324201e60a9e2823d0b5d0c8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8\">euclidean</a> (vec&lt; 2, T, Q &gt; const &amp;polar)</td></tr>\n<tr class=\"memdesc:ga1821d5b3324201e60a9e2823d0b5d0c8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert Polar to Euclidean coordinates.  <a href=\"a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1821d5b3324201e60a9e2823d0b5d0c8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab83ac2c0e55b684b06b6c46c28b1590d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab83ac2c0e55b684b06b6c46c28b1590d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d\">polar</a> (vec&lt; 3, T, Q &gt; const &amp;euclidean)</td></tr>\n<tr class=\"memdesc:gab83ac2c0e55b684b06b6c46c28b1590d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude.  <a href=\"a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d\">More...</a><br /></td></tr>\n<tr class=\"separator:gab83ac2c0e55b684b06b6c46c28b1590d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00080.html\" title=\"GLM_GTX_polar_coordinates \">glm/gtx/polar_coordinates.hpp</a>&gt; to use the features of this extension. </p>\n<p>Conversion from Euclidean space to polar space and revert. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga1821d5b3324201e60a9e2823d0b5d0c8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::euclidean </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>polar</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert Polar to Euclidean coordinates. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00210.html\" title=\"Include <glm/gtx/polar_coordinates.hpp> to use the features of this extension. \">GLM_GTX_polar_coordinates</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab83ac2c0e55b684b06b6c46c28b1590d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::polar </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>euclidean</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00210.html\" title=\"Include <glm/gtx/polar_coordinates.hpp> to use the features of this extension. \">GLM_GTX_polar_coordinates</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00211.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_projection</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_projection<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00081.html\" title=\"GLM_GTX_projection \">glm/gtx/projection.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga58384b7170801dd513de46f87c7fb00e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga58384b7170801dd513de46f87c7fb00e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">proj</a> (genType const &amp;x, genType const &amp;Normal)</td></tr>\n<tr class=\"memdesc:ga58384b7170801dd513de46f87c7fb00e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Projects x on Normal.  <a href=\"a00211.html#ga58384b7170801dd513de46f87c7fb00e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga58384b7170801dd513de46f87c7fb00e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00081.html\" title=\"GLM_GTX_projection \">glm/gtx/projection.hpp</a>&gt; to use the features of this extension. </p>\n<p>Projection of a vector to other one </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga58384b7170801dd513de46f87c7fb00e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::proj </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Normal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Projects x on Normal. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00211.html\" title=\"Include <glm/gtx/projection.hpp> to use the features of this extension. \">GLM_GTX_projection</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00212.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_quaternion</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_quaternion<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00084.html\" title=\"GLM_GTX_quaternion \">glm/gtx/quaternion.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8639615408166d0dddda1b91a940b338\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8639615408166d0dddda1b91a940b338\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga8639615408166d0dddda1b91a940b338\">cross</a> (tquat&lt; T, Q &gt; const &amp;q, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga8639615408166d0dddda1b91a940b338\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute a cross product between a quaternion and a vector.  <a href=\"a00212.html#ga8639615408166d0dddda1b91a940b338\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8639615408166d0dddda1b91a940b338\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa75ca5654e0dc3b61c05db091f7d46ce\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa75ca5654e0dc3b61c05db091f7d46ce\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce\">cross</a> (vec&lt; 3, T, Q &gt; const &amp;v, tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gaa75ca5654e0dc3b61c05db091f7d46ce\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute a cross product between a vector and a quaternion.  <a href=\"a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa75ca5654e0dc3b61c05db091f7d46ce\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga72275e87ce62dc75a06d39a6c049835c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga72275e87ce62dc75a06d39a6c049835c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga72275e87ce62dc75a06d39a6c049835c\">exp</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga72275e87ce62dc75a06d39a6c049835c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a exp of a quaternion.  <a href=\"a00212.html#ga72275e87ce62dc75a06d39a6c049835c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga72275e87ce62dc75a06d39a6c049835c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga312385d0a8caa24c1daaa1d00ce4c2d3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga312385d0a8caa24c1daaa1d00ce4c2d3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga312385d0a8caa24c1daaa1d00ce4c2d3\">extractRealComponent</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga312385d0a8caa24c1daaa1d00ce4c2d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extract the real component of a quaternion.  <a href=\"a00212.html#ga312385d0a8caa24c1daaa1d00ce4c2d3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga312385d0a8caa24c1daaa1d00ce4c2d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac5c77bc74dfc750aaf271d68f271bf2b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac5c77bc74dfc750aaf271d68f271bf2b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gac5c77bc74dfc750aaf271d68f271bf2b\">fastMix</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</td></tr>\n<tr class=\"memdesc:gac5c77bc74dfc750aaf271d68f271bf2b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion normalized linear interpolation.  <a href=\"a00212.html#gac5c77bc74dfc750aaf271d68f271bf2b\">More...</a><br /></td></tr>\n<tr class=\"separator:gac5c77bc74dfc750aaf271d68f271bf2b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac9be2084562a52ae8923813233563a28\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac9be2084562a52ae8923813233563a28\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gac9be2084562a52ae8923813233563a28\">intermediate</a> (tquat&lt; T, Q &gt; const &amp;prev, tquat&lt; T, Q &gt; const &amp;curr, tquat&lt; T, Q &gt; const &amp;next)</td></tr>\n<tr class=\"memdesc:gac9be2084562a52ae8923813233563a28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns an intermediate control point for squad interpolation.  <a href=\"a00212.html#gac9be2084562a52ae8923813233563a28\">More...</a><br /></td></tr>\n<tr class=\"separator:gac9be2084562a52ae8923813233563a28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga229bacc3051770b030042fe266f7b0cb\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga229bacc3051770b030042fe266f7b0cb\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga229bacc3051770b030042fe266f7b0cb\">length2</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:ga229bacc3051770b030042fe266f7b0cb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the squared length of x.  <a href=\"a00212.html#ga229bacc3051770b030042fe266f7b0cb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga229bacc3051770b030042fe266f7b0cb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaad510f1a4ea26994b341c094ec4f4eed\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaad510f1a4ea26994b341c094ec4f4eed\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gaad510f1a4ea26994b341c094ec4f4eed\">log</a> (tquat&lt; T, Q &gt; const &amp;q)</td></tr>\n<tr class=\"memdesc:gaad510f1a4ea26994b341c094ec4f4eed\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a log of a quaternion.  <a href=\"a00212.html#gaad510f1a4ea26994b341c094ec4f4eed\">More...</a><br /></td></tr>\n<tr class=\"separator:gaad510f1a4ea26994b341c094ec4f4eed\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad382fc37392d537aecf2245a4597d8a3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad382fc37392d537aecf2245a4597d8a3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gad382fc37392d537aecf2245a4597d8a3\">pow</a> (tquat&lt; T, Q &gt; const &amp;x, T const &amp;y)</td></tr>\n<tr class=\"memdesc:gad382fc37392d537aecf2245a4597d8a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns x raised to the y power.  <a href=\"a00212.html#gad382fc37392d537aecf2245a4597d8a3\">More...</a><br /></td></tr>\n<tr class=\"separator:gad382fc37392d537aecf2245a4597d8a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga40788ce1d74fac29fa000af893a3ceb5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga40788ce1d74fac29fa000af893a3ceb5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga40788ce1d74fac29fa000af893a3ceb5\">quat_identity</a> ()</td></tr>\n<tr class=\"memdesc:ga40788ce1d74fac29fa000af893a3ceb5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Create an identity quaternion.  <a href=\"a00212.html#ga40788ce1d74fac29fa000af893a3ceb5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga40788ce1d74fac29fa000af893a3ceb5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga668d9ec9964ced2b455d416677e1e8b9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga668d9ec9964ced2b455d416677e1e8b9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga668d9ec9964ced2b455d416677e1e8b9\">quatLookAt</a> (vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:ga668d9ec9964ced2b455d416677e1e8b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a look at quaternion based on the default handedness.  <a href=\"a00212.html#ga668d9ec9964ced2b455d416677e1e8b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga668d9ec9964ced2b455d416677e1e8b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6f1b3fba52fcab952d0ab523177ff443\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6f1b3fba52fcab952d0ab523177ff443\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga6f1b3fba52fcab952d0ab523177ff443\">quatLookAtLH</a> (vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:ga6f1b3fba52fcab952d0ab523177ff443\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a left-handed look at quaternion.  <a href=\"a00212.html#ga6f1b3fba52fcab952d0ab523177ff443\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6f1b3fba52fcab952d0ab523177ff443\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad30cbeb78315773b6d18d9d1c1c75b77\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad30cbeb78315773b6d18d9d1c1c75b77\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gad30cbeb78315773b6d18d9d1c1c75b77\">quatLookAtRH</a> (vec&lt; 3, T, Q &gt; const &amp;direction, vec&lt; 3, T, Q &gt; const &amp;up)</td></tr>\n<tr class=\"memdesc:gad30cbeb78315773b6d18d9d1c1c75b77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a right-handed look at quaternion.  <a href=\"a00212.html#gad30cbeb78315773b6d18d9d1c1c75b77\">More...</a><br /></td></tr>\n<tr class=\"separator:gad30cbeb78315773b6d18d9d1c1c75b77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49730f975e7f0ee3862a20b767aba583\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga49730f975e7f0ee3862a20b767aba583\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga49730f975e7f0ee3862a20b767aba583\">rotate</a> (tquat&lt; T, Q &gt; const &amp;q, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga49730f975e7f0ee3862a20b767aba583\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns quarternion square root.  <a href=\"a00212.html#ga49730f975e7f0ee3862a20b767aba583\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49730f975e7f0ee3862a20b767aba583\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga97a5f8af1d63056b85a53ac28042fe77\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga97a5f8af1d63056b85a53ac28042fe77\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga97a5f8af1d63056b85a53ac28042fe77\">rotate</a> (tquat&lt; T, Q &gt; const &amp;q, vec&lt; 4, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga97a5f8af1d63056b85a53ac28042fe77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotates a 4 components vector by a quaternion.  <a href=\"a00212.html#ga97a5f8af1d63056b85a53ac28042fe77\">More...</a><br /></td></tr>\n<tr class=\"separator:ga97a5f8af1d63056b85a53ac28042fe77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5a729f33cbd904c9ca14cdf25d0a07e4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5a729f33cbd904c9ca14cdf25d0a07e4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga5a729f33cbd904c9ca14cdf25d0a07e4\">rotation</a> (vec&lt; 3, T, Q &gt; const &amp;orig, vec&lt; 3, T, Q &gt; const &amp;dest)</td></tr>\n<tr class=\"memdesc:ga5a729f33cbd904c9ca14cdf25d0a07e4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute the rotation between two vectors.  <a href=\"a00212.html#ga5a729f33cbd904c9ca14cdf25d0a07e4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5a729f33cbd904c9ca14cdf25d0a07e4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf0ad63ac791b1f9a587e363837c2d538\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf0ad63ac791b1f9a587e363837c2d538\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gaf0ad63ac791b1f9a587e363837c2d538\">shortMix</a> (tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T const &amp;a)</td></tr>\n<tr class=\"memdesc:gaf0ad63ac791b1f9a587e363837c2d538\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Quaternion interpolation using the rotation short path.  <a href=\"a00212.html#gaf0ad63ac791b1f9a587e363837c2d538\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf0ad63ac791b1f9a587e363837c2d538\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacfcb16619e166e672c4672aff50a565c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacfcb16619e166e672c4672aff50a565c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gacfcb16619e166e672c4672aff50a565c\">squad</a> (tquat&lt; T, Q &gt; const &amp;q1, tquat&lt; T, Q &gt; const &amp;q2, tquat&lt; T, Q &gt; const &amp;s1, tquat&lt; T, Q &gt; const &amp;s2, T const &amp;h)</td></tr>\n<tr class=\"memdesc:gacfcb16619e166e672c4672aff50a565c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Compute a point on a path according squad equation.  <a href=\"a00212.html#gacfcb16619e166e672c4672aff50a565c\">More...</a><br /></td></tr>\n<tr class=\"separator:gacfcb16619e166e672c4672aff50a565c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga433955cb703d982427fb53b540d02f3d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga433955cb703d982427fb53b540d02f3d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga433955cb703d982427fb53b540d02f3d\">toMat3</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga433955cb703d982427fb53b540d02f3d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 3 * 3 matrix.  <a href=\"a00212.html#ga433955cb703d982427fb53b540d02f3d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga433955cb703d982427fb53b540d02f3d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fa0fb798c2715148e2e0358442bf895\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1fa0fb798c2715148e2e0358442bf895\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga1fa0fb798c2715148e2e0358442bf895\">toMat4</a> (tquat&lt; T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga1fa0fb798c2715148e2e0358442bf895\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a quaternion to a 4 * 4 matrix.  <a href=\"a00212.html#ga1fa0fb798c2715148e2e0358442bf895\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1fa0fb798c2715148e2e0358442bf895\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae9be791077b7a612d9092a922bd13f86\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae9be791077b7a612d9092a922bd13f86\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#gae9be791077b7a612d9092a922bd13f86\">toQuat</a> (mat&lt; 3, 3, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae9be791077b7a612d9092a922bd13f86\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 3 * 3 matrix to a quaternion.  <a href=\"a00212.html#gae9be791077b7a612d9092a922bd13f86\">More...</a><br /></td></tr>\n<tr class=\"separator:gae9be791077b7a612d9092a922bd13f86\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6c0a178ac9c7d23e1a6848045d83aa54\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6c0a178ac9c7d23e1a6848045d83aa54\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54\">toQuat</a> (mat&lt; 4, 4, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga6c0a178ac9c7d23e1a6848045d83aa54\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts a 4 * 4 matrix to a quaternion.  <a href=\"a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c0a178ac9c7d23e1a6848045d83aa54\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00084.html\" title=\"GLM_GTX_quaternion \">glm/gtx/quaternion.hpp</a>&gt; to use the features of this extension. </p>\n<p>Extented quaternion types and functions </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga8639615408166d0dddda1b91a940b338\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::cross </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute a cross product between a quaternion and a vector. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa75ca5654e0dc3b61c05db091f7d46ce\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::cross </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute a cross product between a vector and a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga72275e87ce62dc75a06d39a6c049835c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::exp </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a exp of a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga312385d0a8caa24c1daaa1d00ce4c2d3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::extractRealComponent </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Extract the real component of a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac5c77bc74dfc750aaf271d68f271bf2b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::fastMix </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Quaternion normalized linear interpolation. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac9be2084562a52ae8923813233563a28\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::intermediate </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>prev</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>curr</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>next</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns an intermediate control point for squad interpolation. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga229bacc3051770b030042fe266f7b0cb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::length2 </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the squared length of x. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaad510f1a4ea26994b341c094ec4f4eed\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::log </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a log of a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad382fc37392d537aecf2245a4597d8a3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::pow </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns x raised to the y power. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga40788ce1d74fac29fa000af893a3ceb5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::quat_identity </td>\n          <td>(</td>\n          <td class=\"paramname\"></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Create an identity quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga668d9ec9964ced2b455d416677e1e8b9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::quatLookAt </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>direction</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>up</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a look at quaternion based on the default handedness. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">direction</td><td>Desired direction of the camera. </td></tr>\n    <tr><td class=\"paramname\">up</td><td>Up vector, how the camera is oriented. Typically (0, 1, 0). </td></tr>\n  </table>\n  </dd>\n</dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6f1b3fba52fcab952d0ab523177ff443\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::quatLookAtLH </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>direction</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>up</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a left-handed look at quaternion. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">direction</td><td>Desired direction onto which the +z-axis gets mapped </td></tr>\n    <tr><td class=\"paramname\">up</td><td>Up vector, how the camera is oriented. Typically (0, 1, 0). </td></tr>\n  </table>\n  </dd>\n</dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad30cbeb78315773b6d18d9d1c1c75b77\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::quatLookAtRH </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>direction</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>up</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a right-handed look at quaternion. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">direction</td><td>Desired direction of the camera. </td></tr>\n    <tr><td class=\"paramname\">up</td><td>Up vector, how the camera is oriented. Typically (0, 1, 0). </td></tr>\n  </table>\n  </dd>\n</dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga49730f975e7f0ee3862a20b767aba583\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns quarternion square root. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> Rotates a 3 components vector by a quaternion.</dd>\n<dd>\n<a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga97a5f8af1d63056b85a53ac28042fe77\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotates a 4 components vector by a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5a729f33cbd904c9ca14cdf25d0a07e4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::rotation </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>orig</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>dest</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute the rotation between two vectors. </p>\n<p>param orig vector, needs to be normalized param dest vector, needs to be normalized</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf0ad63ac791b1f9a587e363837c2d538\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::shortMix </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Quaternion interpolation using the rotation short path. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacfcb16619e166e672c4672aff50a565c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::squad </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>s1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>s2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>h</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Compute a point on a path according squad equation. </p>\n<p>q1 and q2 are control points; s1 and s2 are intermediate control points.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga433955cb703d982427fb53b540d02f3d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::toMat3 </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a quaternion to a 3 * 3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00084_source.html#l00134\">134</a> of file <a class=\"el\" href=\"a00084_source.html\">gtx/quaternion.hpp</a>.</p>\n\n<p>References <a class=\"el\" href=\"a00160.html#ga6e88f15c94effe737c876d21ea0db101\">glm::mat3_cast()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1fa0fb798c2715148e2e0358442bf895\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::toMat4 </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a quaternion to a 4 * 4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00084_source.html#l00141\">141</a> of file <a class=\"el\" href=\"a00084_source.html\">gtx/quaternion.hpp</a>.</p>\n\n<p>References <a class=\"el\" href=\"a00160.html#ga8e2085f17cd5aae423c04536524f11b3\">glm::mat4_cast()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae9be791077b7a612d9092a922bd13f86\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::toQuat </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a 3 * 3 matrix to a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00084_source.html#l00148\">148</a> of file <a class=\"el\" href=\"a00084_source.html\">gtx/quaternion.hpp</a>.</p>\n\n<p>References <a class=\"el\" href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">glm::quat_cast()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6c0a178ac9c7d23e1a6848045d83aa54\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::toQuat </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts a 4 * 4 matrix to a quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00212.html\" title=\"Include <glm/gtx/quaternion.hpp> to use the features of this extension. \">GLM_GTX_quaternion</a> </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00084_source.html#l00155\">155</a> of file <a class=\"el\" href=\"a00084_source.html\">gtx/quaternion.hpp</a>.</p>\n\n<p>References <a class=\"el\" href=\"a00160.html#ga03e023aec9acd561a28594bbc8a3abf6\">glm::quat_cast()</a>.</p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00213.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_range</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_range<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00086.html\" title=\"GLM_GTX_range \">glm/gtx/range.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00086.html\" title=\"GLM_GTX_range \">glm/gtx/range.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines begin and end for vectors and matrices. Useful for range-based for loop. The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements). </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00214.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_raw_data</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_raw_data<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00087.html\" title=\"GLM_GTX_raw_data \">glm/gtx/raw_data.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:ga3005cb0d839d546c616becfa6602c607\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint8&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html#ga3005cb0d839d546c616becfa6602c607\">byte</a></td></tr>\n<tr class=\"memdesc:ga3005cb0d839d546c616becfa6602c607\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Type for byte numbers.  <a href=\"a00214.html#ga3005cb0d839d546c616becfa6602c607\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3005cb0d839d546c616becfa6602c607\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga86e46fff9f80ae33893d8d697f2ca98a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint32&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a\">dword</a></td></tr>\n<tr class=\"memdesc:ga86e46fff9f80ae33893d8d697f2ca98a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Type for dword numbers.  <a href=\"a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga86e46fff9f80ae33893d8d697f2ca98a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4021754ffb8e5ef14c75802b15657714\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint64&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html#ga4021754ffb8e5ef14c75802b15657714\">qword</a></td></tr>\n<tr class=\"memdesc:ga4021754ffb8e5ef14c75802b15657714\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Type for qword numbers.  <a href=\"a00214.html#ga4021754ffb8e5ef14c75802b15657714\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4021754ffb8e5ef14c75802b15657714\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16e9fea0ef1e6c4ef472d3d1731c49a5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef detail::uint16&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5\">word</a></td></tr>\n<tr class=\"memdesc:ga16e9fea0ef1e6c4ef472d3d1731c49a5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Type for word numbers.  <a href=\"a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16e9fea0ef1e6c4ef472d3d1731c49a5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00087.html\" title=\"GLM_GTX_raw_data \">glm/gtx/raw_data.hpp</a>&gt; to use the features of this extension. </p>\n<p>Projection of a vector to other one </p>\n<h2 class=\"groupheader\">Typedef Documentation</h2>\n<a class=\"anchor\" id=\"ga3005cb0d839d546c616becfa6602c607\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint8 byte</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Type for byte numbers. </p>\n<p>From GLM_GTX_raw_data extension. </p>\n\n<p>Definition at line <a class=\"el\" href=\"a00087_source.html#l00034\">34</a> of file <a class=\"el\" href=\"a00087_source.html\">raw_data.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga86e46fff9f80ae33893d8d697f2ca98a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint32 dword</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Type for dword numbers. </p>\n<p>From GLM_GTX_raw_data extension. </p>\n\n<p>Definition at line <a class=\"el\" href=\"a00087_source.html#l00042\">42</a> of file <a class=\"el\" href=\"a00087_source.html\">raw_data.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4021754ffb8e5ef14c75802b15657714\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint64 qword</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Type for qword numbers. </p>\n<p>From GLM_GTX_raw_data extension. </p>\n\n<p>Definition at line <a class=\"el\" href=\"a00087_source.html#l00046\">46</a> of file <a class=\"el\" href=\"a00087_source.html\">raw_data.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga16e9fea0ef1e6c4ef472d3d1731c49a5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef detail::uint16 word</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Type for word numbers. </p>\n<p>From GLM_GTX_raw_data extension. </p>\n\n<p>Definition at line <a class=\"el\" href=\"a00087_source.html#l00038\">38</a> of file <a class=\"el\" href=\"a00087_source.html\">raw_data.hpp</a>.</p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00215.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_rotate_normalized_axis</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_rotate_normalized_axis<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00089.html\" title=\"GLM_GTX_rotate_normalized_axis \">glm/gtx/rotate_normalized_axis.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga50efd7ebca0f7a603bb3cc11e34c708d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga50efd7ebca0f7a603bb3cc11e34c708d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00215.html#ga50efd7ebca0f7a603bb3cc11e34c708d\">rotateNormalizedAxis</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:ga50efd7ebca0f7a603bb3cc11e34c708d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a rotation 4 * 4 matrix created from a normalized axis and an angle.  <a href=\"a00215.html#ga50efd7ebca0f7a603bb3cc11e34c708d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50efd7ebca0f7a603bb3cc11e34c708d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad5bb8a155ee52fd349b88cec3a843600\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad5bb8a155ee52fd349b88cec3a843600\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL tquat&lt; T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00215.html#gad5bb8a155ee52fd349b88cec3a843600\">rotateNormalizedAxis</a> (tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)</td></tr>\n<tr class=\"memdesc:gad5bb8a155ee52fd349b88cec3a843600\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotates a quaternion from a vector of 3 components normalized axis and an angle.  <a href=\"a00215.html#gad5bb8a155ee52fd349b88cec3a843600\">More...</a><br /></td></tr>\n<tr class=\"separator:gad5bb8a155ee52fd349b88cec3a843600\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00089.html\" title=\"GLM_GTX_rotate_normalized_axis \">glm/gtx/rotate_normalized_axis.hpp</a>&gt; to use the features of this extension. </p>\n<p>Quaternions and matrices rotations around normalized axis. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga50efd7ebca0f7a603bb3cc11e34c708d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::rotateNormalizedAxis </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>axis</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a rotation 4 * 4 matrix created from a normalized axis and an angle. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">m</td><td>Input matrix multiplied by this rotation matrix. </td></tr>\n    <tr><td class=\"paramname\">angle</td><td>Rotation angle expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">axis</td><td>Rotation axis, must be normalized. </td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">T</td><td>Value type used to build the matrix. Currently supported: half (not recommanded), float or double.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00215.html\" title=\"Include <glm/gtx/rotate_normalized_axis.hpp> to use the features of this extension. \">GLM_GTX_rotate_normalized_axis</a> </dd>\n<dd>\n- rotate(T angle, T x, T y, T z) </dd>\n<dd>\n- rotate(mat&lt;4, 4, T, Q&gt; const&amp; m, T angle, T x, T y, T z) </dd>\n<dd>\n- rotate(T angle, vec&lt;3, T, Q&gt; const&amp; v) </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad5bb8a155ee52fd349b88cec3a843600\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL tquat&lt;T, Q&gt; glm::rotateNormalizedAxis </td>\n          <td>(</td>\n          <td class=\"paramtype\">tquat&lt; T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>q</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>axis</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotates a quaternion from a vector of 3 components normalized axis and an angle. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">q</td><td>Source orientation </td></tr>\n    <tr><td class=\"paramname\">angle</td><td>Angle expressed in radians. </td></tr>\n    <tr><td class=\"paramname\">axis</td><td>Normalized axis of the rotation, must be normalized.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00215.html\" title=\"Include <glm/gtx/rotate_normalized_axis.hpp> to use the features of this extension. \">GLM_GTX_rotate_normalized_axis</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00216.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_rotate_vector</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_rotate_vector<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00090.html\" title=\"GLM_GTX_rotate_vector \">glm/gtx/rotate_vector.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga1a32fceb71962e6160e8af295c91930a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1a32fceb71962e6160e8af295c91930a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">orientation</a> (vec&lt; 3, T, Q &gt; const &amp;Normal, vec&lt; 3, T, Q &gt; const &amp;Up)</td></tr>\n<tr class=\"memdesc:ga1a32fceb71962e6160e8af295c91930a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a rotation matrix from a normal and a up vector.  <a href=\"a00216.html#ga1a32fceb71962e6160e8af295c91930a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a32fceb71962e6160e8af295c91930a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab64a67b52ff4f86c3ba16595a5a25af6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab64a67b52ff4f86c3ba16595a5a25af6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 2, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#gab64a67b52ff4f86c3ba16595a5a25af6\">rotate</a> (vec&lt; 2, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:gab64a67b52ff4f86c3ba16595a5a25af6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a two dimensional vector.  <a href=\"a00216.html#gab64a67b52ff4f86c3ba16595a5a25af6\">More...</a><br /></td></tr>\n<tr class=\"separator:gab64a67b52ff4f86c3ba16595a5a25af6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ba501ef83d1a009a17ac774cc560f21\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1ba501ef83d1a009a17ac774cc560f21\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga1ba501ef83d1a009a17ac774cc560f21\">rotate</a> (vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga1ba501ef83d1a009a17ac774cc560f21\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a three dimensional vector around an axis.  <a href=\"a00216.html#ga1ba501ef83d1a009a17ac774cc560f21\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1ba501ef83d1a009a17ac774cc560f21\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1005f1267ed9c57faa3f24cf6873b961\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1005f1267ed9c57faa3f24cf6873b961\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga1005f1267ed9c57faa3f24cf6873b961\">rotate</a> (vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga1005f1267ed9c57faa3f24cf6873b961\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a four dimensional vector around an axis.  <a href=\"a00216.html#ga1005f1267ed9c57faa3f24cf6873b961\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1005f1267ed9c57faa3f24cf6873b961\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga059fdbdba4cca35cdff172a9d0d0afc9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga059fdbdba4cca35cdff172a9d0d0afc9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga059fdbdba4cca35cdff172a9d0d0afc9\">rotateX</a> (vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga059fdbdba4cca35cdff172a9d0d0afc9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a three dimensional vector around the X axis.  <a href=\"a00216.html#ga059fdbdba4cca35cdff172a9d0d0afc9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga059fdbdba4cca35cdff172a9d0d0afc9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4333b1ea8ebf1bd52bc3801a7617398a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4333b1ea8ebf1bd52bc3801a7617398a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a\">rotateX</a> (vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga4333b1ea8ebf1bd52bc3801a7617398a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a four dimensional vector around the X axis.  <a href=\"a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4333b1ea8ebf1bd52bc3801a7617398a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaebdc8b054ace27d9f62e054531c6f44d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaebdc8b054ace27d9f62e054531c6f44d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#gaebdc8b054ace27d9f62e054531c6f44d\">rotateY</a> (vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:gaebdc8b054ace27d9f62e054531c6f44d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a three dimensional vector around the Y axis.  <a href=\"a00216.html#gaebdc8b054ace27d9f62e054531c6f44d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaebdc8b054ace27d9f62e054531c6f44d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ce3db0867b7f8efd878ee34f95a623b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3ce3db0867b7f8efd878ee34f95a623b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b\">rotateY</a> (vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga3ce3db0867b7f8efd878ee34f95a623b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a four dimensional vector around the Y axis.  <a href=\"a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ce3db0867b7f8efd878ee34f95a623b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5a048838a03f6249acbacb4dbacf79c4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5a048838a03f6249acbacb4dbacf79c4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga5a048838a03f6249acbacb4dbacf79c4\">rotateZ</a> (vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga5a048838a03f6249acbacb4dbacf79c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a three dimensional vector around the Z axis.  <a href=\"a00216.html#ga5a048838a03f6249acbacb4dbacf79c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5a048838a03f6249acbacb4dbacf79c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga923b75c6448161053768822d880702e6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga923b75c6448161053768822d880702e6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga923b75c6448161053768822d880702e6\">rotateZ</a> (vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga923b75c6448161053768822d880702e6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Rotate a four dimensional vector around the Z axis.  <a href=\"a00216.html#ga923b75c6448161053768822d880702e6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga923b75c6448161053768822d880702e6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b11b18ce824174ea1a5a69ea14e2cee\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8b11b18ce824174ea1a5a69ea14e2cee\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00216.html#ga8b11b18ce824174ea1a5a69ea14e2cee\">slerp</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, T const &amp;a)</td></tr>\n<tr class=\"memdesc:ga8b11b18ce824174ea1a5a69ea14e2cee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns Spherical interpolation between two vectors.  <a href=\"a00216.html#ga8b11b18ce824174ea1a5a69ea14e2cee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b11b18ce824174ea1a5a69ea14e2cee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00090.html\" title=\"GLM_GTX_rotate_vector \">glm/gtx/rotate_vector.hpp</a>&gt; to use the features of this extension. </p>\n<p>Function to directly rotate a vector </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga1a32fceb71962e6160e8af295c91930a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::orientation </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Normal</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Up</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a rotation matrix from a normal and a up vector. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab64a67b52ff4f86c3ba16595a5a25af6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;2, T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a two dimensional vector. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1ba501ef83d1a009a17ac774cc560f21\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>normal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a three dimensional vector around an axis. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1005f1267ed9c57faa3f24cf6873b961\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>normal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a four dimensional vector around an axis. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga059fdbdba4cca35cdff172a9d0d0afc9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::rotateX </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a three dimensional vector around the X axis. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4333b1ea8ebf1bd52bc3801a7617398a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, T, Q&gt; glm::rotateX </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a four dimensional vector around the X axis. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaebdc8b054ace27d9f62e054531c6f44d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::rotateY </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a three dimensional vector around the Y axis. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3ce3db0867b7f8efd878ee34f95a623b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, T, Q&gt; glm::rotateY </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a four dimensional vector around the Y axis. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5a048838a03f6249acbacb4dbacf79c4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::rotateZ </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a three dimensional vector around the Z axis. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga923b75c6448161053768822d880702e6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;4, T, Q&gt; glm::rotateZ </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Rotate a four dimensional vector around the Z axis. </p>\n<p>From GLM_GTX_rotate_vector extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b11b18ce824174ea1a5a69ea14e2cee\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;3, T, Q&gt; glm::slerp </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>a</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns Spherical interpolation between two vectors. </p>\n<dl class=\"params\"><dt>Parameters</dt><dd>\n  <table class=\"params\">\n    <tr><td class=\"paramname\">x</td><td>A first vector </td></tr>\n    <tr><td class=\"paramname\">y</td><td>A second vector </td></tr>\n    <tr><td class=\"paramname\">a</td><td>Interpolation factor. The interpolation is defined beyond the range [0, 1].</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00216.html\" title=\"Include <glm/gtx/rotate_vector.hpp> to use the features of this extension. \">GLM_GTX_rotate_vector</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00217.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_scalar_relational</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_scalar_relational<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00093.html\" title=\"GLM_GTX_scalar_relational \">glm/gtx/scalar_relational.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<p>Include &lt;<a class=\"el\" href=\"a00093.html\" title=\"GLM_GTX_scalar_relational \">glm/gtx/scalar_relational.hpp</a>&gt; to use the features of this extension. </p>\n<p>Extend a position from a source to a position at a defined length. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00218.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_spline</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_spline<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00095.html\" title=\"GLM_GTX_spline \">glm/gtx/spline.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8119c04f8210fd0d292757565cd6918d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8119c04f8210fd0d292757565cd6918d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00218.html#ga8119c04f8210fd0d292757565cd6918d\">catmullRom</a> (genType const &amp;v1, genType const &amp;v2, genType const &amp;v3, genType const &amp;v4, typename genType::value_type const &amp;s)</td></tr>\n<tr class=\"memdesc:ga8119c04f8210fd0d292757565cd6918d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a point from a catmull rom curve.  <a href=\"a00218.html#ga8119c04f8210fd0d292757565cd6918d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8119c04f8210fd0d292757565cd6918d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6b867eb52e2fc933d2e0bf26aabc9a70\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6b867eb52e2fc933d2e0bf26aabc9a70\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00218.html#ga6b867eb52e2fc933d2e0bf26aabc9a70\">cubic</a> (genType const &amp;v1, genType const &amp;v2, genType const &amp;v3, genType const &amp;v4, typename genType::value_type const &amp;s)</td></tr>\n<tr class=\"memdesc:ga6b867eb52e2fc933d2e0bf26aabc9a70\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a point from a cubic curve.  <a href=\"a00218.html#ga6b867eb52e2fc933d2e0bf26aabc9a70\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6b867eb52e2fc933d2e0bf26aabc9a70\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa69e143f6374d32f934a8edeaa50bac9\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa69e143f6374d32f934a8edeaa50bac9\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00218.html#gaa69e143f6374d32f934a8edeaa50bac9\">hermite</a> (genType const &amp;v1, genType const &amp;t1, genType const &amp;v2, genType const &amp;t2, typename genType::value_type const &amp;s)</td></tr>\n<tr class=\"memdesc:gaa69e143f6374d32f934a8edeaa50bac9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return a point from a hermite curve.  <a href=\"a00218.html#gaa69e143f6374d32f934a8edeaa50bac9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa69e143f6374d32f934a8edeaa50bac9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00095.html\" title=\"GLM_GTX_spline \">glm/gtx/spline.hpp</a>&gt; to use the features of this extension. </p>\n<p>Spline functions </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga8119c04f8210fd0d292757565cd6918d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::catmullRom </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v3</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v4</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::value_type const &amp;&#160;</td>\n          <td class=\"paramname\"><em>s</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return a point from a catmull rom curve. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00218.html\" title=\"Include <glm/gtx/spline.hpp> to use the features of this extension. \">GLM_GTX_spline</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6b867eb52e2fc933d2e0bf26aabc9a70\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::cubic </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v3</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v4</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::value_type const &amp;&#160;</td>\n          <td class=\"paramname\"><em>s</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return a point from a cubic curve. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00218.html\" title=\"Include <glm/gtx/spline.hpp> to use the features of this extension. \">GLM_GTX_spline</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa69e143f6374d32f934a8edeaa50bac9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::hermite </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>t1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>t2</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">typename genType::value_type const &amp;&#160;</td>\n          <td class=\"paramname\"><em>s</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return a point from a hermite curve. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00218.html\" title=\"Include <glm/gtx/spline.hpp> to use the features of this extension. \">GLM_GTX_spline</a> extension. </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00219.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_std_based_type</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#typedef-members\">Typedefs</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_std_based_type<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00096.html\" title=\"GLM_GTX_std_based_type \">glm/gtx/std_based_type.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"typedef-members\"></a>\nTypedefs</h2></td></tr>\n<tr class=\"memitem:gaeb877ac8f9a3703961736c1c5072cf68\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gaeb877ac8f9a3703961736c1c5072cf68\">size1</a></td></tr>\n<tr class=\"memdesc:gaeb877ac8f9a3703961736c1c5072cf68\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of one std::size_t component.  <a href=\"a00219.html#gaeb877ac8f9a3703961736c1c5072cf68\">More...</a><br /></td></tr>\n<tr class=\"separator:gaeb877ac8f9a3703961736c1c5072cf68\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaf6accc57f5aa50447ba7310ce3f0d6f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 1, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f\">size1_t</a></td></tr>\n<tr class=\"memdesc:gaaf6accc57f5aa50447ba7310ce3f0d6f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of one std::size_t component.  <a href=\"a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaf6accc57f5aa50447ba7310ce3f0d6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1bfe8c4975ff282bce41be2bacd524fe\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe\">size2</a></td></tr>\n<tr class=\"memdesc:ga1bfe8c4975ff282bce41be2bacd524fe\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of two std::size_t components.  <a href=\"a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1bfe8c4975ff282bce41be2bacd524fe\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5976c25657d4e2b5f73f39364c3845d6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 2, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#ga5976c25657d4e2b5f73f39364c3845d6\">size2_t</a></td></tr>\n<tr class=\"memdesc:ga5976c25657d4e2b5f73f39364c3845d6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of two std::size_t components.  <a href=\"a00219.html#ga5976c25657d4e2b5f73f39364c3845d6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5976c25657d4e2b5f73f39364c3845d6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae1c72956d0359b0db332c6c8774d3b04\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gae1c72956d0359b0db332c6c8774d3b04\">size3</a></td></tr>\n<tr class=\"memdesc:gae1c72956d0359b0db332c6c8774d3b04\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of three std::size_t components.  <a href=\"a00219.html#gae1c72956d0359b0db332c6c8774d3b04\">More...</a><br /></td></tr>\n<tr class=\"separator:gae1c72956d0359b0db332c6c8774d3b04\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2654983c60d641fd3808e65a8dfad8d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 3, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gaf2654983c60d641fd3808e65a8dfad8d\">size3_t</a></td></tr>\n<tr class=\"memdesc:gaf2654983c60d641fd3808e65a8dfad8d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of three std::size_t components.  <a href=\"a00219.html#gaf2654983c60d641fd3808e65a8dfad8d\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2654983c60d641fd3808e65a8dfad8d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3a19dde617beaf8ce3cfc2ac5064e9aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa\">size4</a></td></tr>\n<tr class=\"memdesc:ga3a19dde617beaf8ce3cfc2ac5064e9aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of four std::size_t components.  <a href=\"a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3a19dde617beaf8ce3cfc2ac5064e9aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa423efcea63675a2df26990dbcb58656\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">typedef vec&lt; 4, std::size_t, defaultp &gt;&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00219.html#gaa423efcea63675a2df26990dbcb58656\">size4_t</a></td></tr>\n<tr class=\"memdesc:gaa423efcea63675a2df26990dbcb58656\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Vector type based of four std::size_t components.  <a href=\"a00219.html#gaa423efcea63675a2df26990dbcb58656\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa423efcea63675a2df26990dbcb58656\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00096.html\" title=\"GLM_GTX_std_based_type \">glm/gtx/std_based_type.hpp</a>&gt; to use the features of this extension. </p>\n<p>Adds vector types based on STL value types. </p>\n<h2 class=\"groupheader\">Typedef Documentation</h2>\n<a class=\"anchor\" id=\"gaeb877ac8f9a3703961736c1c5072cf68\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;1, std::size_t, defaultp&gt; size1</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Vector type based of one std::size_t component. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>GLM_GTX_std_based_type </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00096_source.html#l00035\">35</a> of file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaf6accc57f5aa50447ba7310ce3f0d6f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;1, std::size_t, defaultp&gt; size1_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Vector type based of one std::size_t component. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>GLM_GTX_std_based_type </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00096_source.html#l00051\">51</a> of file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1bfe8c4975ff282bce41be2bacd524fe\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, std::size_t, defaultp&gt; size2</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Vector type based of two std::size_t components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>GLM_GTX_std_based_type </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00096_source.html#l00039\">39</a> of file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5976c25657d4e2b5f73f39364c3845d6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;2, std::size_t, defaultp&gt; size2_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Vector type based of two std::size_t components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>GLM_GTX_std_based_type </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00096_source.html#l00055\">55</a> of file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae1c72956d0359b0db332c6c8774d3b04\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, std::size_t, defaultp&gt; size3</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Vector type based of three std::size_t components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>GLM_GTX_std_based_type </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00096_source.html#l00043\">43</a> of file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf2654983c60d641fd3808e65a8dfad8d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;3, std::size_t, defaultp&gt; size3_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Vector type based of three std::size_t components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>GLM_GTX_std_based_type </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00096_source.html#l00059\">59</a> of file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3a19dde617beaf8ce3cfc2ac5064e9aa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, std::size_t, defaultp&gt; size4</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Vector type based of four std::size_t components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>GLM_GTX_std_based_type </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00096_source.html#l00047\">47</a> of file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa423efcea63675a2df26990dbcb58656\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">typedef vec&lt;4, std::size_t, defaultp&gt; size4_t</td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Vector type based of four std::size_t components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd>GLM_GTX_std_based_type </dd></dl>\n\n<p>Definition at line <a class=\"el\" href=\"a00096_source.html#l00063\">63</a> of file <a class=\"el\" href=\"a00096_source.html\">std_based_type.hpp</a>.</p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00220.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_string_cast</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_string_cast<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00097.html\" title=\"GLM_GTX_string_cast \">glm/gtx/string_cast.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga8f0dced1fd45e67e2d77e80ab93c7af5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga8f0dced1fd45e67e2d77e80ab93c7af5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL std::string&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00220.html#ga8f0dced1fd45e67e2d77e80ab93c7af5\">to_string</a> (genType const &amp;x)</td></tr>\n<tr class=\"memdesc:ga8f0dced1fd45e67e2d77e80ab93c7af5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Create a string from a GLM vector or matrix typed variable.  <a href=\"a00220.html#ga8f0dced1fd45e67e2d77e80ab93c7af5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8f0dced1fd45e67e2d77e80ab93c7af5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00097.html\" title=\"GLM_GTX_string_cast \">glm/gtx/string_cast.hpp</a>&gt; to use the features of this extension. </p>\n<p>Setup strings for GLM type values</p>\n<p>This extension is not supported with CUDA </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga8f0dced1fd45e67e2d77e80ab93c7af5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL std::string glm::to_string </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Create a string from a GLM vector or matrix typed variable. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00220.html\" title=\"Include <glm/gtx/string_cast.hpp> to use the features of this extension. \">GLM_GTX_string_cast</a> extension. </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00221.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_transform</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_transform<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00098.html\" title=\"GLM_GTX_transform \">glm/gtx/transform.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaf599be4c0e9d99be1f9cddba79b6018b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf599be4c0e9d99be1f9cddba79b6018b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00221.html#gaf599be4c0e9d99be1f9cddba79b6018b\">rotate</a> (T angle, vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf599be4c0e9d99be1f9cddba79b6018b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians.  <a href=\"a00221.html#gaf599be4c0e9d99be1f9cddba79b6018b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf599be4c0e9d99be1f9cddba79b6018b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafbeefee8fec884d566e4ada0049174d7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gafbeefee8fec884d566e4ada0049174d7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00221.html#gafbeefee8fec884d566e4ada0049174d7\">scale</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gafbeefee8fec884d566e4ada0049174d7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components.  <a href=\"a00221.html#gafbeefee8fec884d566e4ada0049174d7\">More...</a><br /></td></tr>\n<tr class=\"separator:gafbeefee8fec884d566e4ada0049174d7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga309a30e652e58c396e2c3d4db3ee7658\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga309a30e652e58c396e2c3d4db3ee7658\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00221.html#ga309a30e652e58c396e2c3d4db3ee7658\">translate</a> (vec&lt; 3, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga309a30e652e58c396e2c3d4db3ee7658\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars.  <a href=\"a00221.html#ga309a30e652e58c396e2c3d4db3ee7658\">More...</a><br /></td></tr>\n<tr class=\"separator:ga309a30e652e58c396e2c3d4db3ee7658\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00098.html\" title=\"GLM_GTX_transform \">glm/gtx/transform.hpp</a>&gt; to use the features of this extension. </p>\n<p>Add transformation matrices </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaf599be4c0e9d99be1f9cddba79b6018b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::rotate </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>angle</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00221.html\" title=\"Include <glm/gtx/transform.hpp> to use the features of this extension. \">GLM_GTX_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafbeefee8fec884d566e4ada0049174d7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::scale </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00221.html\" title=\"Include <glm/gtx/transform.hpp> to use the features of this extension. \">GLM_GTX_transform</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga309a30e652e58c396e2c3d4db3ee7658\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::translate </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00157.html\" title=\"Include <glm/gtc/matrix_transform.hpp> to use the features of this extension. \">GLM_GTC_matrix_transform</a> </dd>\n<dd>\n<a class=\"el\" href=\"a00221.html\" title=\"Include <glm/gtx/transform.hpp> to use the features of this extension. \">GLM_GTX_transform</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00222.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_transform2</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_transform2<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00099.html\" title=\"GLM_GTX_transform2 \">glm/gtx/transform2.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga5b992a0cdc8298054edb68e228f0d93e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5b992a0cdc8298054edb68e228f0d93e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#ga5b992a0cdc8298054edb68e228f0d93e\">proj2D</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:ga5b992a0cdc8298054edb68e228f0d93e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build planar projection matrix along normal axis.  <a href=\"a00222.html#ga5b992a0cdc8298054edb68e228f0d93e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5b992a0cdc8298054edb68e228f0d93e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa2b7f4f15b98f697caede11bef50509e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa2b7f4f15b98f697caede11bef50509e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gaa2b7f4f15b98f697caede11bef50509e\">proj3D</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;normal)</td></tr>\n<tr class=\"memdesc:gaa2b7f4f15b98f697caede11bef50509e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build planar projection matrix along normal axis.  <a href=\"a00222.html#gaa2b7f4f15b98f697caede11bef50509e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa2b7f4f15b98f697caede11bef50509e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabf249498b236e62c983d90d30d63c99c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabf249498b236e62c983d90d30d63c99c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gabf249498b236e62c983d90d30d63c99c\">scaleBias</a> (T scale, T bias)</td></tr>\n<tr class=\"memdesc:gabf249498b236e62c983d90d30d63c99c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a scale bias matrix.  <a href=\"a00222.html#gabf249498b236e62c983d90d30d63c99c\">More...</a><br /></td></tr>\n<tr class=\"separator:gabf249498b236e62c983d90d30d63c99c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae2bdd91a76759fecfbaef97e3020aa8e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae2bdd91a76759fecfbaef97e3020aa8e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e\">scaleBias</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T scale, T bias)</td></tr>\n<tr class=\"memdesc:gae2bdd91a76759fecfbaef97e3020aa8e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Build a scale bias matrix.  <a href=\"a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae2bdd91a76759fecfbaef97e3020aa8e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabf714b8a358181572b32a45555f71948\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabf714b8a358181572b32a45555f71948\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gabf714b8a358181572b32a45555f71948\">shearX2D</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T y)</td></tr>\n<tr class=\"memdesc:gabf714b8a358181572b32a45555f71948\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on X axis.  <a href=\"a00222.html#gabf714b8a358181572b32a45555f71948\">More...</a><br /></td></tr>\n<tr class=\"separator:gabf714b8a358181572b32a45555f71948\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73e867c6cd4d700fe2054437e56106c4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga73e867c6cd4d700fe2054437e56106c4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#ga73e867c6cd4d700fe2054437e56106c4\">shearX3D</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T y, T z)</td></tr>\n<tr class=\"memdesc:ga73e867c6cd4d700fe2054437e56106c4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on X axis From GLM_GTX_transform2 extension.  <a href=\"a00222.html#ga73e867c6cd4d700fe2054437e56106c4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73e867c6cd4d700fe2054437e56106c4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7998d0763d9181550c77e8af09a182c\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac7998d0763d9181550c77e8af09a182c\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 3, 3, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gac7998d0763d9181550c77e8af09a182c\">shearY2D</a> (mat&lt; 3, 3, T, Q &gt; const &amp;m, T x)</td></tr>\n<tr class=\"memdesc:gac7998d0763d9181550c77e8af09a182c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on Y axis.  <a href=\"a00222.html#gac7998d0763d9181550c77e8af09a182c\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7998d0763d9181550c77e8af09a182c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade5bb65ffcb513973db1a1314fb5cfac\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gade5bb65ffcb513973db1a1314fb5cfac\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#gade5bb65ffcb513973db1a1314fb5cfac\">shearY3D</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T x, T z)</td></tr>\n<tr class=\"memdesc:gade5bb65ffcb513973db1a1314fb5cfac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on Y axis.  <a href=\"a00222.html#gade5bb65ffcb513973db1a1314fb5cfac\">More...</a><br /></td></tr>\n<tr class=\"separator:gade5bb65ffcb513973db1a1314fb5cfac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6591e0a3a9d2c9c0b6577bb4dace0255\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6591e0a3a9d2c9c0b6577bb4dace0255\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; 4, 4, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00222.html#ga6591e0a3a9d2c9c0b6577bb4dace0255\">shearZ3D</a> (mat&lt; 4, 4, T, Q &gt; const &amp;m, T x, T y)</td></tr>\n<tr class=\"memdesc:ga6591e0a3a9d2c9c0b6577bb4dace0255\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Transforms a matrix with a shearing on Z axis.  <a href=\"a00222.html#ga6591e0a3a9d2c9c0b6577bb4dace0255\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6591e0a3a9d2c9c0b6577bb4dace0255\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00099.html\" title=\"GLM_GTX_transform2 \">glm/gtx/transform2.hpp</a>&gt; to use the features of this extension. </p>\n<p>Add extra transformation matrices </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga5b992a0cdc8298054edb68e228f0d93e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::proj2D </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>normal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build planar projection matrix along normal axis. </p>\n<p>From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa2b7f4f15b98f697caede11bef50509e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::proj3D </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>normal</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build planar projection matrix along normal axis. </p>\n<p>From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabf249498b236e62c983d90d30d63c99c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::scaleBias </td>\n          <td>(</td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>scale</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bias</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a scale bias matrix. </p>\n<p>From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae2bdd91a76759fecfbaef97e3020aa8e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::scaleBias </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>scale</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>bias</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Build a scale bias matrix. </p>\n<p>From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabf714b8a358181572b32a45555f71948\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::shearX2D </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Transforms a matrix with a shearing on X axis. </p>\n<p>From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga73e867c6cd4d700fe2054437e56106c4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::shearX3D </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Transforms a matrix with a shearing on X axis From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac7998d0763d9181550c77e8af09a182c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;3, 3, T, Q&gt; glm::shearY2D </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 3, 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Transforms a matrix with a shearing on Y axis. </p>\n<p>From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gade5bb65ffcb513973db1a1314fb5cfac\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::shearY3D </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>z</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Transforms a matrix with a shearing on Y axis. </p>\n<p>From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6591e0a3a9d2c9c0b6577bb4dace0255\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;4, 4, T, Q&gt; glm::shearZ3D </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; 4, 4, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Transforms a matrix with a shearing on Z axis. </p>\n<p>From GLM_GTX_transform2 extension. </p>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00223.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_type_aligned</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_type_aligned<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00102.html\" title=\"GLM_GTX_type_aligned \">glm/gtx/type_aligned.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gab5cd5c5fad228b25c782084f1cc30114\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab5cd5c5fad228b25c782084f1cc30114\">GLM_ALIGNED_TYPEDEF</a> (lowp_int8, aligned_lowp_int8, 1)</td></tr>\n<tr class=\"memdesc:gab5cd5c5fad228b25c782084f1cc30114\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gab5cd5c5fad228b25c782084f1cc30114\">More...</a><br /></td></tr>\n<tr class=\"separator:gab5cd5c5fad228b25c782084f1cc30114\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5bb5dd895ef625c1b113f2cf400186b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5bb5dd895ef625c1b113f2cf400186b0\">GLM_ALIGNED_TYPEDEF</a> (lowp_int16, aligned_lowp_int16, 2)</td></tr>\n<tr class=\"memdesc:ga5bb5dd895ef625c1b113f2cf400186b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga5bb5dd895ef625c1b113f2cf400186b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5bb5dd895ef625c1b113f2cf400186b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac6efa54cf7c6c86f7158922abdb1a430\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac6efa54cf7c6c86f7158922abdb1a430\">GLM_ALIGNED_TYPEDEF</a> (lowp_int32, aligned_lowp_int32, 4)</td></tr>\n<tr class=\"memdesc:gac6efa54cf7c6c86f7158922abdb1a430\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gac6efa54cf7c6c86f7158922abdb1a430\">More...</a><br /></td></tr>\n<tr class=\"separator:gac6efa54cf7c6c86f7158922abdb1a430\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6612eb77c8607048e7552279a11eeb5f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6612eb77c8607048e7552279a11eeb5f\">GLM_ALIGNED_TYPEDEF</a> (lowp_int64, aligned_lowp_int64, 8)</td></tr>\n<tr class=\"memdesc:ga6612eb77c8607048e7552279a11eeb5f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga6612eb77c8607048e7552279a11eeb5f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6612eb77c8607048e7552279a11eeb5f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ddc1848ff2223026db8968ce0c97497\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7ddc1848ff2223026db8968ce0c97497\">GLM_ALIGNED_TYPEDEF</a> (lowp_int8_t, aligned_lowp_int8_t, 1)</td></tr>\n<tr class=\"memdesc:ga7ddc1848ff2223026db8968ce0c97497\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga7ddc1848ff2223026db8968ce0c97497\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ddc1848ff2223026db8968ce0c97497\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga22240dd9458b0f8c11fbcc4f48714f68\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga22240dd9458b0f8c11fbcc4f48714f68\">GLM_ALIGNED_TYPEDEF</a> (lowp_int16_t, aligned_lowp_int16_t, 2)</td></tr>\n<tr class=\"memdesc:ga22240dd9458b0f8c11fbcc4f48714f68\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga22240dd9458b0f8c11fbcc4f48714f68\">More...</a><br /></td></tr>\n<tr class=\"separator:ga22240dd9458b0f8c11fbcc4f48714f68\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8130ea381d76a2cc34a93ccbb6cf487d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8130ea381d76a2cc34a93ccbb6cf487d\">GLM_ALIGNED_TYPEDEF</a> (lowp_int32_t, aligned_lowp_int32_t, 4)</td></tr>\n<tr class=\"memdesc:ga8130ea381d76a2cc34a93ccbb6cf487d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga8130ea381d76a2cc34a93ccbb6cf487d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8130ea381d76a2cc34a93ccbb6cf487d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7ccb60f3215d293fd62b33b31ed0e7be\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7ccb60f3215d293fd62b33b31ed0e7be\">GLM_ALIGNED_TYPEDEF</a> (lowp_int64_t, aligned_lowp_int64_t, 8)</td></tr>\n<tr class=\"memdesc:ga7ccb60f3215d293fd62b33b31ed0e7be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga7ccb60f3215d293fd62b33b31ed0e7be\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7ccb60f3215d293fd62b33b31ed0e7be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac20d508d2ef5cc95ad3daf083c57ec2a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac20d508d2ef5cc95ad3daf083c57ec2a\">GLM_ALIGNED_TYPEDEF</a> (lowp_i8, aligned_lowp_i8, 1)</td></tr>\n<tr class=\"memdesc:gac20d508d2ef5cc95ad3daf083c57ec2a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gac20d508d2ef5cc95ad3daf083c57ec2a\">More...</a><br /></td></tr>\n<tr class=\"separator:gac20d508d2ef5cc95ad3daf083c57ec2a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga50257b48069a31d0c8d9c1f644d267de\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga50257b48069a31d0c8d9c1f644d267de\">GLM_ALIGNED_TYPEDEF</a> (lowp_i16, aligned_lowp_i16, 2)</td></tr>\n<tr class=\"memdesc:ga50257b48069a31d0c8d9c1f644d267de\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga50257b48069a31d0c8d9c1f644d267de\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50257b48069a31d0c8d9c1f644d267de\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa07e98e67b7a3435c0746018c7a2a839\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa07e98e67b7a3435c0746018c7a2a839\">GLM_ALIGNED_TYPEDEF</a> (lowp_i32, aligned_lowp_i32, 4)</td></tr>\n<tr class=\"memdesc:gaa07e98e67b7a3435c0746018c7a2a839\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gaa07e98e67b7a3435c0746018c7a2a839\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa07e98e67b7a3435c0746018c7a2a839\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga62601fc6f8ca298b77285bedf03faffd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga62601fc6f8ca298b77285bedf03faffd\">GLM_ALIGNED_TYPEDEF</a> (lowp_i64, aligned_lowp_i64, 8)</td></tr>\n<tr class=\"memdesc:ga62601fc6f8ca298b77285bedf03faffd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga62601fc6f8ca298b77285bedf03faffd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga62601fc6f8ca298b77285bedf03faffd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac8cff825951aeb54dd846037113c72db\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac8cff825951aeb54dd846037113c72db\">GLM_ALIGNED_TYPEDEF</a> (mediump_int8, aligned_mediump_int8, 1)</td></tr>\n<tr class=\"memdesc:gac8cff825951aeb54dd846037113c72db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gac8cff825951aeb54dd846037113c72db\">More...</a><br /></td></tr>\n<tr class=\"separator:gac8cff825951aeb54dd846037113c72db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78f443d88f438575a62b5df497cdf66b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga78f443d88f438575a62b5df497cdf66b\">GLM_ALIGNED_TYPEDEF</a> (mediump_int16, aligned_mediump_int16, 2)</td></tr>\n<tr class=\"memdesc:ga78f443d88f438575a62b5df497cdf66b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga78f443d88f438575a62b5df497cdf66b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78f443d88f438575a62b5df497cdf66b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0680cd3b5d4e8006985fb41a4f9b57af\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0680cd3b5d4e8006985fb41a4f9b57af\">GLM_ALIGNED_TYPEDEF</a> (mediump_int32, aligned_mediump_int32, 4)</td></tr>\n<tr class=\"memdesc:ga0680cd3b5d4e8006985fb41a4f9b57af\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga0680cd3b5d4e8006985fb41a4f9b57af\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0680cd3b5d4e8006985fb41a4f9b57af\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad9e5babb1dd3e3531b42c37bf25dd951\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad9e5babb1dd3e3531b42c37bf25dd951\">GLM_ALIGNED_TYPEDEF</a> (mediump_int64, aligned_mediump_int64, 8)</td></tr>\n<tr class=\"memdesc:gad9e5babb1dd3e3531b42c37bf25dd951\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#gad9e5babb1dd3e3531b42c37bf25dd951\">More...</a><br /></td></tr>\n<tr class=\"separator:gad9e5babb1dd3e3531b42c37bf25dd951\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga353fd9fa8a9ad952fcabd0d53ad9a6dd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga353fd9fa8a9ad952fcabd0d53ad9a6dd\">GLM_ALIGNED_TYPEDEF</a> (mediump_int8_t, aligned_mediump_int8_t, 1)</td></tr>\n<tr class=\"memdesc:ga353fd9fa8a9ad952fcabd0d53ad9a6dd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga353fd9fa8a9ad952fcabd0d53ad9a6dd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga353fd9fa8a9ad952fcabd0d53ad9a6dd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2196442c0e5c5e8c77842de388c42521\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2196442c0e5c5e8c77842de388c42521\">GLM_ALIGNED_TYPEDEF</a> (mediump_int16_t, aligned_mediump_int16_t, 2)</td></tr>\n<tr class=\"memdesc:ga2196442c0e5c5e8c77842de388c42521\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga2196442c0e5c5e8c77842de388c42521\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2196442c0e5c5e8c77842de388c42521\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1284488189daf897cf095c5eefad9744\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1284488189daf897cf095c5eefad9744\">GLM_ALIGNED_TYPEDEF</a> (mediump_int32_t, aligned_mediump_int32_t, 4)</td></tr>\n<tr class=\"memdesc:ga1284488189daf897cf095c5eefad9744\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga1284488189daf897cf095c5eefad9744\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1284488189daf897cf095c5eefad9744\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga73fdc86a539808af58808b7c60a1c4d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga73fdc86a539808af58808b7c60a1c4d8\">GLM_ALIGNED_TYPEDEF</a> (mediump_int64_t, aligned_mediump_int64_t, 8)</td></tr>\n<tr class=\"memdesc:ga73fdc86a539808af58808b7c60a1c4d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga73fdc86a539808af58808b7c60a1c4d8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga73fdc86a539808af58808b7c60a1c4d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafafeea923e1983262c972e2b83922d3b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafafeea923e1983262c972e2b83922d3b\">GLM_ALIGNED_TYPEDEF</a> (mediump_i8, aligned_mediump_i8, 1)</td></tr>\n<tr class=\"memdesc:gafafeea923e1983262c972e2b83922d3b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gafafeea923e1983262c972e2b83922d3b\">More...</a><br /></td></tr>\n<tr class=\"separator:gafafeea923e1983262c972e2b83922d3b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\">GLM_ALIGNED_TYPEDEF</a> (mediump_i16, aligned_mediump_i16, 2)</td></tr>\n<tr class=\"memdesc:ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga63b882e29170d428463d99c3d630acc6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga63b882e29170d428463d99c3d630acc6\">GLM_ALIGNED_TYPEDEF</a> (mediump_i32, aligned_mediump_i32, 4)</td></tr>\n<tr class=\"memdesc:ga63b882e29170d428463d99c3d630acc6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga63b882e29170d428463d99c3d630acc6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga63b882e29170d428463d99c3d630acc6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b20507bb048c1edea2d441cc953e6f0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8b20507bb048c1edea2d441cc953e6f0\">GLM_ALIGNED_TYPEDEF</a> (mediump_i64, aligned_mediump_i64, 8)</td></tr>\n<tr class=\"memdesc:ga8b20507bb048c1edea2d441cc953e6f0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga8b20507bb048c1edea2d441cc953e6f0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b20507bb048c1edea2d441cc953e6f0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga56c5ca60813027b603c7b61425a0479d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga56c5ca60813027b603c7b61425a0479d\">GLM_ALIGNED_TYPEDEF</a> (highp_int8, aligned_highp_int8, 1)</td></tr>\n<tr class=\"memdesc:ga56c5ca60813027b603c7b61425a0479d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga56c5ca60813027b603c7b61425a0479d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga56c5ca60813027b603c7b61425a0479d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a751b3aff24c0259f4a7357c2969089\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7a751b3aff24c0259f4a7357c2969089\">GLM_ALIGNED_TYPEDEF</a> (highp_int16, aligned_highp_int16, 2)</td></tr>\n<tr class=\"memdesc:ga7a751b3aff24c0259f4a7357c2969089\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga7a751b3aff24c0259f4a7357c2969089\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a751b3aff24c0259f4a7357c2969089\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga70cd2144351c556469ee6119e59971fc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga70cd2144351c556469ee6119e59971fc\">GLM_ALIGNED_TYPEDEF</a> (highp_int32, aligned_highp_int32, 4)</td></tr>\n<tr class=\"memdesc:ga70cd2144351c556469ee6119e59971fc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga70cd2144351c556469ee6119e59971fc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga70cd2144351c556469ee6119e59971fc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga46bbf08dc004d8c433041e0b5018a5d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga46bbf08dc004d8c433041e0b5018a5d3\">GLM_ALIGNED_TYPEDEF</a> (highp_int64, aligned_highp_int64, 8)</td></tr>\n<tr class=\"memdesc:ga46bbf08dc004d8c433041e0b5018a5d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga46bbf08dc004d8c433041e0b5018a5d3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga46bbf08dc004d8c433041e0b5018a5d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab3e10c77a20d1abad2de1c561c7a5c18\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab3e10c77a20d1abad2de1c561c7a5c18\">GLM_ALIGNED_TYPEDEF</a> (highp_int8_t, aligned_highp_int8_t, 1)</td></tr>\n<tr class=\"memdesc:gab3e10c77a20d1abad2de1c561c7a5c18\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gab3e10c77a20d1abad2de1c561c7a5c18\">More...</a><br /></td></tr>\n<tr class=\"separator:gab3e10c77a20d1abad2de1c561c7a5c18\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga968f30319ebeaca9ebcd3a25a8e139fb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga968f30319ebeaca9ebcd3a25a8e139fb\">GLM_ALIGNED_TYPEDEF</a> (highp_int16_t, aligned_highp_int16_t, 2)</td></tr>\n<tr class=\"memdesc:ga968f30319ebeaca9ebcd3a25a8e139fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga968f30319ebeaca9ebcd3a25a8e139fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga968f30319ebeaca9ebcd3a25a8e139fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaae773c28e6390c6aa76f5b678b7098a3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaae773c28e6390c6aa76f5b678b7098a3\">GLM_ALIGNED_TYPEDEF</a> (highp_int32_t, aligned_highp_int32_t, 4)</td></tr>\n<tr class=\"memdesc:gaae773c28e6390c6aa76f5b678b7098a3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gaae773c28e6390c6aa76f5b678b7098a3\">More...</a><br /></td></tr>\n<tr class=\"separator:gaae773c28e6390c6aa76f5b678b7098a3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga790cfff1ca39d0ed696ffed980809311\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga790cfff1ca39d0ed696ffed980809311\">GLM_ALIGNED_TYPEDEF</a> (highp_int64_t, aligned_highp_int64_t, 8)</td></tr>\n<tr class=\"memdesc:ga790cfff1ca39d0ed696ffed980809311\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga790cfff1ca39d0ed696ffed980809311\">More...</a><br /></td></tr>\n<tr class=\"separator:ga790cfff1ca39d0ed696ffed980809311\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8265b91eb23c120a9b0c3e381bc37b96\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8265b91eb23c120a9b0c3e381bc37b96\">GLM_ALIGNED_TYPEDEF</a> (highp_i8, aligned_highp_i8, 1)</td></tr>\n<tr class=\"memdesc:ga8265b91eb23c120a9b0c3e381bc37b96\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga8265b91eb23c120a9b0c3e381bc37b96\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8265b91eb23c120a9b0c3e381bc37b96\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae6d384de17588d8edb894fbe06e0d410\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gae6d384de17588d8edb894fbe06e0d410\">GLM_ALIGNED_TYPEDEF</a> (highp_i16, aligned_highp_i16, 2)</td></tr>\n<tr class=\"memdesc:gae6d384de17588d8edb894fbe06e0d410\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#gae6d384de17588d8edb894fbe06e0d410\">More...</a><br /></td></tr>\n<tr class=\"separator:gae6d384de17588d8edb894fbe06e0d410\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9c8172b745ee03fc5b2b91c350c2922f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9c8172b745ee03fc5b2b91c350c2922f\">GLM_ALIGNED_TYPEDEF</a> (highp_i32, aligned_highp_i32, 4)</td></tr>\n<tr class=\"memdesc:ga9c8172b745ee03fc5b2b91c350c2922f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga9c8172b745ee03fc5b2b91c350c2922f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9c8172b745ee03fc5b2b91c350c2922f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga77e0dff12aa4020ddc3f8cabbea7b2e6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga77e0dff12aa4020ddc3f8cabbea7b2e6\">GLM_ALIGNED_TYPEDEF</a> (highp_i64, aligned_highp_i64, 8)</td></tr>\n<tr class=\"memdesc:ga77e0dff12aa4020ddc3f8cabbea7b2e6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga77e0dff12aa4020ddc3f8cabbea7b2e6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga77e0dff12aa4020ddc3f8cabbea7b2e6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabd82b9faa9d4d618dbbe0fc8a1efee63\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabd82b9faa9d4d618dbbe0fc8a1efee63\">GLM_ALIGNED_TYPEDEF</a> (int8, aligned_int8, 1)</td></tr>\n<tr class=\"memdesc:gabd82b9faa9d4d618dbbe0fc8a1efee63\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#gabd82b9faa9d4d618dbbe0fc8a1efee63\">More...</a><br /></td></tr>\n<tr class=\"separator:gabd82b9faa9d4d618dbbe0fc8a1efee63\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga285649744560be21000cfd81bbb5d507\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga285649744560be21000cfd81bbb5d507\">GLM_ALIGNED_TYPEDEF</a> (int16, aligned_int16, 2)</td></tr>\n<tr class=\"memdesc:ga285649744560be21000cfd81bbb5d507\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga285649744560be21000cfd81bbb5d507\">More...</a><br /></td></tr>\n<tr class=\"separator:ga285649744560be21000cfd81bbb5d507\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga07732da630b2deda428ce95c0ecaf3ff\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga07732da630b2deda428ce95c0ecaf3ff\">GLM_ALIGNED_TYPEDEF</a> (int32, aligned_int32, 4)</td></tr>\n<tr class=\"memdesc:ga07732da630b2deda428ce95c0ecaf3ff\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga07732da630b2deda428ce95c0ecaf3ff\">More...</a><br /></td></tr>\n<tr class=\"separator:ga07732da630b2deda428ce95c0ecaf3ff\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1a8da2a8c51f69c07a2e7f473aa420f4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1a8da2a8c51f69c07a2e7f473aa420f4\">GLM_ALIGNED_TYPEDEF</a> (int64, aligned_int64, 8)</td></tr>\n<tr class=\"memdesc:ga1a8da2a8c51f69c07a2e7f473aa420f4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga1a8da2a8c51f69c07a2e7f473aa420f4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a8da2a8c51f69c07a2e7f473aa420f4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga848aedf13e2d9738acf0bb482c590174\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga848aedf13e2d9738acf0bb482c590174\">GLM_ALIGNED_TYPEDEF</a> (int8_t, aligned_int8_t, 1)</td></tr>\n<tr class=\"memdesc:ga848aedf13e2d9738acf0bb482c590174\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga848aedf13e2d9738acf0bb482c590174\">More...</a><br /></td></tr>\n<tr class=\"separator:ga848aedf13e2d9738acf0bb482c590174\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafd2803d39049dd45a37a63931e25d943\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafd2803d39049dd45a37a63931e25d943\">GLM_ALIGNED_TYPEDEF</a> (int16_t, aligned_int16_t, 2)</td></tr>\n<tr class=\"memdesc:gafd2803d39049dd45a37a63931e25d943\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#gafd2803d39049dd45a37a63931e25d943\">More...</a><br /></td></tr>\n<tr class=\"separator:gafd2803d39049dd45a37a63931e25d943\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae553b33349d6da832cf0724f1e024094\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gae553b33349d6da832cf0724f1e024094\">GLM_ALIGNED_TYPEDEF</a> (int32_t, aligned_int32_t, 4)</td></tr>\n<tr class=\"memdesc:gae553b33349d6da832cf0724f1e024094\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gae553b33349d6da832cf0724f1e024094\">More...</a><br /></td></tr>\n<tr class=\"separator:gae553b33349d6da832cf0724f1e024094\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16d223a2b3409e812e1d3bd87f0e9e5c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga16d223a2b3409e812e1d3bd87f0e9e5c\">GLM_ALIGNED_TYPEDEF</a> (int64_t, aligned_int64_t, 8)</td></tr>\n<tr class=\"memdesc:ga16d223a2b3409e812e1d3bd87f0e9e5c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga16d223a2b3409e812e1d3bd87f0e9e5c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16d223a2b3409e812e1d3bd87f0e9e5c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2de065d2ddfdb366bcd0febca79ae2ad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2de065d2ddfdb366bcd0febca79ae2ad\">GLM_ALIGNED_TYPEDEF</a> (i8, aligned_i8, 1)</td></tr>\n<tr class=\"memdesc:ga2de065d2ddfdb366bcd0febca79ae2ad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga2de065d2ddfdb366bcd0febca79ae2ad\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2de065d2ddfdb366bcd0febca79ae2ad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabd786bdc20a11c8cb05c92c8212e28d3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabd786bdc20a11c8cb05c92c8212e28d3\">GLM_ALIGNED_TYPEDEF</a> (i16, aligned_i16, 2)</td></tr>\n<tr class=\"memdesc:gabd786bdc20a11c8cb05c92c8212e28d3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#gabd786bdc20a11c8cb05c92c8212e28d3\">More...</a><br /></td></tr>\n<tr class=\"separator:gabd786bdc20a11c8cb05c92c8212e28d3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad4aefe56691cdb640c72f0d46d3fb532\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad4aefe56691cdb640c72f0d46d3fb532\">GLM_ALIGNED_TYPEDEF</a> (i32, aligned_i32, 4)</td></tr>\n<tr class=\"memdesc:gad4aefe56691cdb640c72f0d46d3fb532\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gad4aefe56691cdb640c72f0d46d3fb532\">More...</a><br /></td></tr>\n<tr class=\"separator:gad4aefe56691cdb640c72f0d46d3fb532\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8fe9745f7de24a8394518152ff9fccdc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8fe9745f7de24a8394518152ff9fccdc\">GLM_ALIGNED_TYPEDEF</a> (i64, aligned_i64, 8)</td></tr>\n<tr class=\"memdesc:ga8fe9745f7de24a8394518152ff9fccdc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga8fe9745f7de24a8394518152ff9fccdc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8fe9745f7de24a8394518152ff9fccdc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaad735483450099f7f882d4e3a3569bd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaaad735483450099f7f882d4e3a3569bd\">GLM_ALIGNED_TYPEDEF</a> (ivec1, aligned_ivec1, 4)</td></tr>\n<tr class=\"memdesc:gaaad735483450099f7f882d4e3a3569bd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#gaaad735483450099f7f882d4e3a3569bd\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaad735483450099f7f882d4e3a3569bd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7b6f823802edbd6edbaf70ea25bf068\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac7b6f823802edbd6edbaf70ea25bf068\">GLM_ALIGNED_TYPEDEF</a> (ivec2, aligned_ivec2, 8)</td></tr>\n<tr class=\"memdesc:gac7b6f823802edbd6edbaf70ea25bf068\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#gac7b6f823802edbd6edbaf70ea25bf068\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7b6f823802edbd6edbaf70ea25bf068\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e235bcd2b8029613f25b8d40a2d3ef7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga3e235bcd2b8029613f25b8d40a2d3ef7\">GLM_ALIGNED_TYPEDEF</a> (ivec3, aligned_ivec3, 16)</td></tr>\n<tr class=\"memdesc:ga3e235bcd2b8029613f25b8d40a2d3ef7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#ga3e235bcd2b8029613f25b8d40a2d3ef7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e235bcd2b8029613f25b8d40a2d3ef7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga50d8a9523968c77f8325b4c9bfbff41e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga50d8a9523968c77f8325b4c9bfbff41e\">GLM_ALIGNED_TYPEDEF</a> (ivec4, aligned_ivec4, 16)</td></tr>\n<tr class=\"memdesc:ga50d8a9523968c77f8325b4c9bfbff41e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#ga50d8a9523968c77f8325b4c9bfbff41e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga50d8a9523968c77f8325b4c9bfbff41e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ec20fdfb729c702032da9378c79679f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9ec20fdfb729c702032da9378c79679f\">GLM_ALIGNED_TYPEDEF</a> (i8vec1, aligned_i8vec1, 1)</td></tr>\n<tr class=\"memdesc:ga9ec20fdfb729c702032da9378c79679f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga9ec20fdfb729c702032da9378c79679f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9ec20fdfb729c702032da9378c79679f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga25b3fe1d9e8d0a5e86c1949c1acd8131\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga25b3fe1d9e8d0a5e86c1949c1acd8131\">GLM_ALIGNED_TYPEDEF</a> (i8vec2, aligned_i8vec2, 2)</td></tr>\n<tr class=\"memdesc:ga25b3fe1d9e8d0a5e86c1949c1acd8131\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#ga25b3fe1d9e8d0a5e86c1949c1acd8131\">More...</a><br /></td></tr>\n<tr class=\"separator:ga25b3fe1d9e8d0a5e86c1949c1acd8131\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2958f907719d94d8109b562540c910e2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2958f907719d94d8109b562540c910e2\">GLM_ALIGNED_TYPEDEF</a> (i8vec3, aligned_i8vec3, 4)</td></tr>\n<tr class=\"memdesc:ga2958f907719d94d8109b562540c910e2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#ga2958f907719d94d8109b562540c910e2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2958f907719d94d8109b562540c910e2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fe6fc032a978f1c845fac9aa0668714\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1fe6fc032a978f1c845fac9aa0668714\">GLM_ALIGNED_TYPEDEF</a> (i8vec4, aligned_i8vec4, 4)</td></tr>\n<tr class=\"memdesc:ga1fe6fc032a978f1c845fac9aa0668714\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#ga1fe6fc032a978f1c845fac9aa0668714\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1fe6fc032a978f1c845fac9aa0668714\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4161e7a496dc96972254143fe873e55\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa4161e7a496dc96972254143fe873e55\">GLM_ALIGNED_TYPEDEF</a> (i16vec1, aligned_i16vec1, 2)</td></tr>\n<tr class=\"memdesc:gaa4161e7a496dc96972254143fe873e55\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned scalar type.  <a href=\"a00223.html#gaa4161e7a496dc96972254143fe873e55\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa4161e7a496dc96972254143fe873e55\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9d7cb211ccda69b1c22ddeeb0f3e7aba\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9d7cb211ccda69b1c22ddeeb0f3e7aba\">GLM_ALIGNED_TYPEDEF</a> (i16vec2, aligned_i16vec2, 4)</td></tr>\n<tr class=\"memdesc:ga9d7cb211ccda69b1c22ddeeb0f3e7aba\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#ga9d7cb211ccda69b1c22ddeeb0f3e7aba\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9d7cb211ccda69b1c22ddeeb0f3e7aba\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaee91dd2ab34423bcc11072ef6bd0f02\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaaee91dd2ab34423bcc11072ef6bd0f02\">GLM_ALIGNED_TYPEDEF</a> (i16vec3, aligned_i16vec3, 8)</td></tr>\n<tr class=\"memdesc:gaaee91dd2ab34423bcc11072ef6bd0f02\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#gaaee91dd2ab34423bcc11072ef6bd0f02\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaee91dd2ab34423bcc11072ef6bd0f02\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga49f047ccaa8b31fad9f26c67bf9b3510\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga49f047ccaa8b31fad9f26c67bf9b3510\">GLM_ALIGNED_TYPEDEF</a> (i16vec4, aligned_i16vec4, 8)</td></tr>\n<tr class=\"memdesc:ga49f047ccaa8b31fad9f26c67bf9b3510\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#ga49f047ccaa8b31fad9f26c67bf9b3510\">More...</a><br /></td></tr>\n<tr class=\"separator:ga49f047ccaa8b31fad9f26c67bf9b3510\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga904e9c2436bb099397c0823506a0771f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga904e9c2436bb099397c0823506a0771f\">GLM_ALIGNED_TYPEDEF</a> (i32vec1, aligned_i32vec1, 4)</td></tr>\n<tr class=\"memdesc:ga904e9c2436bb099397c0823506a0771f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga904e9c2436bb099397c0823506a0771f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga904e9c2436bb099397c0823506a0771f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf90651cf2f5e7ee2b11cfdc5a6749534\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf90651cf2f5e7ee2b11cfdc5a6749534\">GLM_ALIGNED_TYPEDEF</a> (i32vec2, aligned_i32vec2, 8)</td></tr>\n<tr class=\"memdesc:gaf90651cf2f5e7ee2b11cfdc5a6749534\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#gaf90651cf2f5e7ee2b11cfdc5a6749534\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf90651cf2f5e7ee2b11cfdc5a6749534\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7354a4ead8cb17868aec36b9c30d6010\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7354a4ead8cb17868aec36b9c30d6010\">GLM_ALIGNED_TYPEDEF</a> (i32vec3, aligned_i32vec3, 16)</td></tr>\n<tr class=\"memdesc:ga7354a4ead8cb17868aec36b9c30d6010\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#ga7354a4ead8cb17868aec36b9c30d6010\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7354a4ead8cb17868aec36b9c30d6010\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad2ecbdea18732163e2636e27b37981ee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad2ecbdea18732163e2636e27b37981ee\">GLM_ALIGNED_TYPEDEF</a> (i32vec4, aligned_i32vec4, 16)</td></tr>\n<tr class=\"memdesc:gad2ecbdea18732163e2636e27b37981ee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#gad2ecbdea18732163e2636e27b37981ee\">More...</a><br /></td></tr>\n<tr class=\"separator:gad2ecbdea18732163e2636e27b37981ee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga965b1c9aa1800e93d4abc2eb2b5afcbf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga965b1c9aa1800e93d4abc2eb2b5afcbf\">GLM_ALIGNED_TYPEDEF</a> (i64vec1, aligned_i64vec1, 8)</td></tr>\n<tr class=\"memdesc:ga965b1c9aa1800e93d4abc2eb2b5afcbf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned scalar type.  <a href=\"a00223.html#ga965b1c9aa1800e93d4abc2eb2b5afcbf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga965b1c9aa1800e93d4abc2eb2b5afcbf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f9e9c2ea2768675dff9bae5cde2d829\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1f9e9c2ea2768675dff9bae5cde2d829\">GLM_ALIGNED_TYPEDEF</a> (i64vec2, aligned_i64vec2, 16)</td></tr>\n<tr class=\"memdesc:ga1f9e9c2ea2768675dff9bae5cde2d829\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned vector of 2 components type.  <a href=\"a00223.html#ga1f9e9c2ea2768675dff9bae5cde2d829\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f9e9c2ea2768675dff9bae5cde2d829\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad77c317b7d942322cd5be4c8127b3187\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad77c317b7d942322cd5be4c8127b3187\">GLM_ALIGNED_TYPEDEF</a> (i64vec3, aligned_i64vec3, 32)</td></tr>\n<tr class=\"memdesc:gad77c317b7d942322cd5be4c8127b3187\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned vector of 3 components type.  <a href=\"a00223.html#gad77c317b7d942322cd5be4c8127b3187\">More...</a><br /></td></tr>\n<tr class=\"separator:gad77c317b7d942322cd5be4c8127b3187\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga716f8ea809bdb11b5b542d8b71aeb04f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga716f8ea809bdb11b5b542d8b71aeb04f\">GLM_ALIGNED_TYPEDEF</a> (i64vec4, aligned_i64vec4, 32)</td></tr>\n<tr class=\"memdesc:ga716f8ea809bdb11b5b542d8b71aeb04f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit signed integer aligned vector of 4 components type.  <a href=\"a00223.html#ga716f8ea809bdb11b5b542d8b71aeb04f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga716f8ea809bdb11b5b542d8b71aeb04f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad46f8e9082d5878b1bc04f9c1471cdaa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad46f8e9082d5878b1bc04f9c1471cdaa\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint8, aligned_lowp_uint8, 1)</td></tr>\n<tr class=\"memdesc:gad46f8e9082d5878b1bc04f9c1471cdaa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gad46f8e9082d5878b1bc04f9c1471cdaa\">More...</a><br /></td></tr>\n<tr class=\"separator:gad46f8e9082d5878b1bc04f9c1471cdaa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1246094581af624aca6c7499aaabf801\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1246094581af624aca6c7499aaabf801\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint16, aligned_lowp_uint16, 2)</td></tr>\n<tr class=\"memdesc:ga1246094581af624aca6c7499aaabf801\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga1246094581af624aca6c7499aaabf801\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1246094581af624aca6c7499aaabf801\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7a5009a1d0196bbf21dd7518f61f0249\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7a5009a1d0196bbf21dd7518f61f0249\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint32, aligned_lowp_uint32, 4)</td></tr>\n<tr class=\"memdesc:ga7a5009a1d0196bbf21dd7518f61f0249\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga7a5009a1d0196bbf21dd7518f61f0249\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7a5009a1d0196bbf21dd7518f61f0249\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga45213fd18b3bb1df391671afefe4d1e7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga45213fd18b3bb1df391671afefe4d1e7\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint64, aligned_lowp_uint64, 8)</td></tr>\n<tr class=\"memdesc:ga45213fd18b3bb1df391671afefe4d1e7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga45213fd18b3bb1df391671afefe4d1e7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga45213fd18b3bb1df391671afefe4d1e7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0ba26b4e3fd9ecbc25358efd68d8a4ca\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0ba26b4e3fd9ecbc25358efd68d8a4ca\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint8_t, aligned_lowp_uint8_t, 1)</td></tr>\n<tr class=\"memdesc:ga0ba26b4e3fd9ecbc25358efd68d8a4ca\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga0ba26b4e3fd9ecbc25358efd68d8a4ca\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0ba26b4e3fd9ecbc25358efd68d8a4ca\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf2b58f5fb6d4ec8ce7b76221d3af43e1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf2b58f5fb6d4ec8ce7b76221d3af43e1\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint16_t, aligned_lowp_uint16_t, 2)</td></tr>\n<tr class=\"memdesc:gaf2b58f5fb6d4ec8ce7b76221d3af43e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaf2b58f5fb6d4ec8ce7b76221d3af43e1\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf2b58f5fb6d4ec8ce7b76221d3af43e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadc246401847dcba155f0699425e49dcd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gadc246401847dcba155f0699425e49dcd\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint32_t, aligned_lowp_uint32_t, 4)</td></tr>\n<tr class=\"memdesc:gadc246401847dcba155f0699425e49dcd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gadc246401847dcba155f0699425e49dcd\">More...</a><br /></td></tr>\n<tr class=\"separator:gadc246401847dcba155f0699425e49dcd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaace64bddf51a9def01498da9a94fb01c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaace64bddf51a9def01498da9a94fb01c\">GLM_ALIGNED_TYPEDEF</a> (lowp_uint64_t, aligned_lowp_uint64_t, 8)</td></tr>\n<tr class=\"memdesc:gaace64bddf51a9def01498da9a94fb01c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaace64bddf51a9def01498da9a94fb01c\">More...</a><br /></td></tr>\n<tr class=\"separator:gaace64bddf51a9def01498da9a94fb01c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad7bb97c29d664bd86ffb1bed4abc5534\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad7bb97c29d664bd86ffb1bed4abc5534\">GLM_ALIGNED_TYPEDEF</a> (lowp_u8, aligned_lowp_u8, 1)</td></tr>\n<tr class=\"memdesc:gad7bb97c29d664bd86ffb1bed4abc5534\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gad7bb97c29d664bd86ffb1bed4abc5534\">More...</a><br /></td></tr>\n<tr class=\"separator:gad7bb97c29d664bd86ffb1bed4abc5534\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga404bba7785130e0b1384d695a9450b28\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga404bba7785130e0b1384d695a9450b28\">GLM_ALIGNED_TYPEDEF</a> (lowp_u16, aligned_lowp_u16, 2)</td></tr>\n<tr class=\"memdesc:ga404bba7785130e0b1384d695a9450b28\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga404bba7785130e0b1384d695a9450b28\">More...</a><br /></td></tr>\n<tr class=\"separator:ga404bba7785130e0b1384d695a9450b28\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31ba41fd896257536958ec6080203d2a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga31ba41fd896257536958ec6080203d2a\">GLM_ALIGNED_TYPEDEF</a> (lowp_u32, aligned_lowp_u32, 4)</td></tr>\n<tr class=\"memdesc:ga31ba41fd896257536958ec6080203d2a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga31ba41fd896257536958ec6080203d2a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31ba41fd896257536958ec6080203d2a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacca5f13627f57b3505676e40a6e43e5e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gacca5f13627f57b3505676e40a6e43e5e\">GLM_ALIGNED_TYPEDEF</a> (lowp_u64, aligned_lowp_u64, 8)</td></tr>\n<tr class=\"memdesc:gacca5f13627f57b3505676e40a6e43e5e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Low qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gacca5f13627f57b3505676e40a6e43e5e\">More...</a><br /></td></tr>\n<tr class=\"separator:gacca5f13627f57b3505676e40a6e43e5e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5faf1d3e70bf33174dd7f3d01d5b883b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5faf1d3e70bf33174dd7f3d01d5b883b\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint8, aligned_mediump_uint8, 1)</td></tr>\n<tr class=\"memdesc:ga5faf1d3e70bf33174dd7f3d01d5b883b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga5faf1d3e70bf33174dd7f3d01d5b883b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5faf1d3e70bf33174dd7f3d01d5b883b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga727e2bf2c433bb3b0182605860a48363\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga727e2bf2c433bb3b0182605860a48363\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint16, aligned_mediump_uint16, 2)</td></tr>\n<tr class=\"memdesc:ga727e2bf2c433bb3b0182605860a48363\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga727e2bf2c433bb3b0182605860a48363\">More...</a><br /></td></tr>\n<tr class=\"separator:ga727e2bf2c433bb3b0182605860a48363\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12566ca66d5962dadb4a5eb4c74e891e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga12566ca66d5962dadb4a5eb4c74e891e\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint32, aligned_mediump_uint32, 4)</td></tr>\n<tr class=\"memdesc:ga12566ca66d5962dadb4a5eb4c74e891e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga12566ca66d5962dadb4a5eb4c74e891e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12566ca66d5962dadb4a5eb4c74e891e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7b66a97a8acaa35c5a377b947318c6bc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7b66a97a8acaa35c5a377b947318c6bc\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint64, aligned_mediump_uint64, 8)</td></tr>\n<tr class=\"memdesc:ga7b66a97a8acaa35c5a377b947318c6bc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga7b66a97a8acaa35c5a377b947318c6bc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7b66a97a8acaa35c5a377b947318c6bc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa9cde002439b74fa66120a16a9f55fcc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa9cde002439b74fa66120a16a9f55fcc\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint8_t, aligned_mediump_uint8_t, 1)</td></tr>\n<tr class=\"memdesc:gaa9cde002439b74fa66120a16a9f55fcc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaa9cde002439b74fa66120a16a9f55fcc\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa9cde002439b74fa66120a16a9f55fcc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ca98c67f7d1e975f7c5202f1da1df1f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1ca98c67f7d1e975f7c5202f1da1df1f\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint16_t, aligned_mediump_uint16_t, 2)</td></tr>\n<tr class=\"memdesc:ga1ca98c67f7d1e975f7c5202f1da1df1f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga1ca98c67f7d1e975f7c5202f1da1df1f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1ca98c67f7d1e975f7c5202f1da1df1f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1dc8bc6199d785f235576948d80a597c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1dc8bc6199d785f235576948d80a597c\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint32_t, aligned_mediump_uint32_t, 4)</td></tr>\n<tr class=\"memdesc:ga1dc8bc6199d785f235576948d80a597c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga1dc8bc6199d785f235576948d80a597c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1dc8bc6199d785f235576948d80a597c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad14a0f2ec93519682b73d70b8e401d81\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad14a0f2ec93519682b73d70b8e401d81\">GLM_ALIGNED_TYPEDEF</a> (mediump_uint64_t, aligned_mediump_uint64_t, 8)</td></tr>\n<tr class=\"memdesc:gad14a0f2ec93519682b73d70b8e401d81\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gad14a0f2ec93519682b73d70b8e401d81\">More...</a><br /></td></tr>\n<tr class=\"separator:gad14a0f2ec93519682b73d70b8e401d81\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gada8b996eb6526dc1ead813bd49539d1b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gada8b996eb6526dc1ead813bd49539d1b\">GLM_ALIGNED_TYPEDEF</a> (mediump_u8, aligned_mediump_u8, 1)</td></tr>\n<tr class=\"memdesc:gada8b996eb6526dc1ead813bd49539d1b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gada8b996eb6526dc1ead813bd49539d1b\">More...</a><br /></td></tr>\n<tr class=\"separator:gada8b996eb6526dc1ead813bd49539d1b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga28948f6bfb52b42deb9d73ae1ea8d8b0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga28948f6bfb52b42deb9d73ae1ea8d8b0\">GLM_ALIGNED_TYPEDEF</a> (mediump_u16, aligned_mediump_u16, 2)</td></tr>\n<tr class=\"memdesc:ga28948f6bfb52b42deb9d73ae1ea8d8b0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga28948f6bfb52b42deb9d73ae1ea8d8b0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga28948f6bfb52b42deb9d73ae1ea8d8b0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad6a7c0b5630f89d3f1c5b4ef2919bb4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad6a7c0b5630f89d3f1c5b4ef2919bb4c\">GLM_ALIGNED_TYPEDEF</a> (mediump_u32, aligned_mediump_u32, 4)</td></tr>\n<tr class=\"memdesc:gad6a7c0b5630f89d3f1c5b4ef2919bb4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gad6a7c0b5630f89d3f1c5b4ef2919bb4c\">More...</a><br /></td></tr>\n<tr class=\"separator:gad6a7c0b5630f89d3f1c5b4ef2919bb4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa0fc531cbaa972ac3a0b86d21ef4a7fa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa0fc531cbaa972ac3a0b86d21ef4a7fa\">GLM_ALIGNED_TYPEDEF</a> (mediump_u64, aligned_mediump_u64, 8)</td></tr>\n<tr class=\"memdesc:gaa0fc531cbaa972ac3a0b86d21ef4a7fa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Medium qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaa0fc531cbaa972ac3a0b86d21ef4a7fa\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa0fc531cbaa972ac3a0b86d21ef4a7fa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0ee829f7b754b262bbfe6317c0d678ac\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0ee829f7b754b262bbfe6317c0d678ac\">GLM_ALIGNED_TYPEDEF</a> (highp_uint8, aligned_highp_uint8, 1)</td></tr>\n<tr class=\"memdesc:ga0ee829f7b754b262bbfe6317c0d678ac\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga0ee829f7b754b262bbfe6317c0d678ac\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0ee829f7b754b262bbfe6317c0d678ac\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga447848a817a626cae08cedc9778b331c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga447848a817a626cae08cedc9778b331c\">GLM_ALIGNED_TYPEDEF</a> (highp_uint16, aligned_highp_uint16, 2)</td></tr>\n<tr class=\"memdesc:ga447848a817a626cae08cedc9778b331c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga447848a817a626cae08cedc9778b331c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga447848a817a626cae08cedc9778b331c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6027ae13b2734f542a6e7beee11b8820\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6027ae13b2734f542a6e7beee11b8820\">GLM_ALIGNED_TYPEDEF</a> (highp_uint32, aligned_highp_uint32, 4)</td></tr>\n<tr class=\"memdesc:ga6027ae13b2734f542a6e7beee11b8820\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga6027ae13b2734f542a6e7beee11b8820\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6027ae13b2734f542a6e7beee11b8820\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2aca46c8608c95ef991ee4c332acde5f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2aca46c8608c95ef991ee4c332acde5f\">GLM_ALIGNED_TYPEDEF</a> (highp_uint64, aligned_highp_uint64, 8)</td></tr>\n<tr class=\"memdesc:ga2aca46c8608c95ef991ee4c332acde5f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga2aca46c8608c95ef991ee4c332acde5f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2aca46c8608c95ef991ee4c332acde5f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaff50b10dd1c48be324fdaffd18e2c7ea\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaff50b10dd1c48be324fdaffd18e2c7ea\">GLM_ALIGNED_TYPEDEF</a> (highp_uint8_t, aligned_highp_uint8_t, 1)</td></tr>\n<tr class=\"memdesc:gaff50b10dd1c48be324fdaffd18e2c7ea\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaff50b10dd1c48be324fdaffd18e2c7ea\">More...</a><br /></td></tr>\n<tr class=\"separator:gaff50b10dd1c48be324fdaffd18e2c7ea\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9fc4421dbb833d5461e6d4e59dcfde55\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9fc4421dbb833d5461e6d4e59dcfde55\">GLM_ALIGNED_TYPEDEF</a> (highp_uint16_t, aligned_highp_uint16_t, 2)</td></tr>\n<tr class=\"memdesc:ga9fc4421dbb833d5461e6d4e59dcfde55\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga9fc4421dbb833d5461e6d4e59dcfde55\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9fc4421dbb833d5461e6d4e59dcfde55\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga329f1e2b94b33ba5e3918197030bcf03\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga329f1e2b94b33ba5e3918197030bcf03\">GLM_ALIGNED_TYPEDEF</a> (highp_uint32_t, aligned_highp_uint32_t, 4)</td></tr>\n<tr class=\"memdesc:ga329f1e2b94b33ba5e3918197030bcf03\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga329f1e2b94b33ba5e3918197030bcf03\">More...</a><br /></td></tr>\n<tr class=\"separator:ga329f1e2b94b33ba5e3918197030bcf03\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga71e646f7e301aa422328194162c9c998\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga71e646f7e301aa422328194162c9c998\">GLM_ALIGNED_TYPEDEF</a> (highp_uint64_t, aligned_highp_uint64_t, 8)</td></tr>\n<tr class=\"memdesc:ga71e646f7e301aa422328194162c9c998\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga71e646f7e301aa422328194162c9c998\">More...</a><br /></td></tr>\n<tr class=\"separator:ga71e646f7e301aa422328194162c9c998\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8942e09f479489441a7a5004c6d8cb66\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8942e09f479489441a7a5004c6d8cb66\">GLM_ALIGNED_TYPEDEF</a> (highp_u8, aligned_highp_u8, 1)</td></tr>\n<tr class=\"memdesc:ga8942e09f479489441a7a5004c6d8cb66\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga8942e09f479489441a7a5004c6d8cb66\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8942e09f479489441a7a5004c6d8cb66\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaab32497d6e4db16ee439dbedd64c5865\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaab32497d6e4db16ee439dbedd64c5865\">GLM_ALIGNED_TYPEDEF</a> (highp_u16, aligned_highp_u16, 2)</td></tr>\n<tr class=\"memdesc:gaab32497d6e4db16ee439dbedd64c5865\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaab32497d6e4db16ee439dbedd64c5865\">More...</a><br /></td></tr>\n<tr class=\"separator:gaab32497d6e4db16ee439dbedd64c5865\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaaadbb34952eca8e3d7fe122c3e167742\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaaadbb34952eca8e3d7fe122c3e167742\">GLM_ALIGNED_TYPEDEF</a> (highp_u32, aligned_highp_u32, 4)</td></tr>\n<tr class=\"memdesc:gaaadbb34952eca8e3d7fe122c3e167742\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaaadbb34952eca8e3d7fe122c3e167742\">More...</a><br /></td></tr>\n<tr class=\"separator:gaaadbb34952eca8e3d7fe122c3e167742\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga92024d27c74a3650afb55ec8e024ed25\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga92024d27c74a3650afb55ec8e024ed25\">GLM_ALIGNED_TYPEDEF</a> (highp_u64, aligned_highp_u64, 8)</td></tr>\n<tr class=\"memdesc:ga92024d27c74a3650afb55ec8e024ed25\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">High qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga92024d27c74a3650afb55ec8e024ed25\">More...</a><br /></td></tr>\n<tr class=\"separator:ga92024d27c74a3650afb55ec8e024ed25\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabde1d0b4072df35453db76075ab896a6\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabde1d0b4072df35453db76075ab896a6\">GLM_ALIGNED_TYPEDEF</a> (uint8, aligned_uint8, 1)</td></tr>\n<tr class=\"memdesc:gabde1d0b4072df35453db76075ab896a6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gabde1d0b4072df35453db76075ab896a6\">More...</a><br /></td></tr>\n<tr class=\"separator:gabde1d0b4072df35453db76075ab896a6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga06c296c9e398b294c8c9dd2a7693dcbb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga06c296c9e398b294c8c9dd2a7693dcbb\">GLM_ALIGNED_TYPEDEF</a> (uint16, aligned_uint16, 2)</td></tr>\n<tr class=\"memdesc:ga06c296c9e398b294c8c9dd2a7693dcbb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga06c296c9e398b294c8c9dd2a7693dcbb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga06c296c9e398b294c8c9dd2a7693dcbb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacf1744488c96ebd33c9f36ad33b2010a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gacf1744488c96ebd33c9f36ad33b2010a\">GLM_ALIGNED_TYPEDEF</a> (uint32, aligned_uint32, 4)</td></tr>\n<tr class=\"memdesc:gacf1744488c96ebd33c9f36ad33b2010a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gacf1744488c96ebd33c9f36ad33b2010a\">More...</a><br /></td></tr>\n<tr class=\"separator:gacf1744488c96ebd33c9f36ad33b2010a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3328061a64c20ba59d5f9da24c2cd059\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga3328061a64c20ba59d5f9da24c2cd059\">GLM_ALIGNED_TYPEDEF</a> (uint64, aligned_uint64, 8)</td></tr>\n<tr class=\"memdesc:ga3328061a64c20ba59d5f9da24c2cd059\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga3328061a64c20ba59d5f9da24c2cd059\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3328061a64c20ba59d5f9da24c2cd059\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf6ced36f13bae57f377bafa6f5fcc299\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf6ced36f13bae57f377bafa6f5fcc299\">GLM_ALIGNED_TYPEDEF</a> (uint8_t, aligned_uint8_t, 1)</td></tr>\n<tr class=\"memdesc:gaf6ced36f13bae57f377bafa6f5fcc299\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaf6ced36f13bae57f377bafa6f5fcc299\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf6ced36f13bae57f377bafa6f5fcc299\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafbc7fb7847bfc78a339d1d371c915c73\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafbc7fb7847bfc78a339d1d371c915c73\">GLM_ALIGNED_TYPEDEF</a> (uint16_t, aligned_uint16_t, 2)</td></tr>\n<tr class=\"memdesc:gafbc7fb7847bfc78a339d1d371c915c73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gafbc7fb7847bfc78a339d1d371c915c73\">More...</a><br /></td></tr>\n<tr class=\"separator:gafbc7fb7847bfc78a339d1d371c915c73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa86bc56a73fd8120b1121b5f5e6245ae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa86bc56a73fd8120b1121b5f5e6245ae\">GLM_ALIGNED_TYPEDEF</a> (uint32_t, aligned_uint32_t, 4)</td></tr>\n<tr class=\"memdesc:gaa86bc56a73fd8120b1121b5f5e6245ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gaa86bc56a73fd8120b1121b5f5e6245ae\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa86bc56a73fd8120b1121b5f5e6245ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga68c0b9e669060d0eb5ab8c3ddeb483d8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga68c0b9e669060d0eb5ab8c3ddeb483d8\">GLM_ALIGNED_TYPEDEF</a> (uint64_t, aligned_uint64_t, 8)</td></tr>\n<tr class=\"memdesc:ga68c0b9e669060d0eb5ab8c3ddeb483d8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga68c0b9e669060d0eb5ab8c3ddeb483d8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga68c0b9e669060d0eb5ab8c3ddeb483d8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4f3bab577daf3343e99cc005134bce86\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga4f3bab577daf3343e99cc005134bce86\">GLM_ALIGNED_TYPEDEF</a> (u8, aligned_u8, 1)</td></tr>\n<tr class=\"memdesc:ga4f3bab577daf3343e99cc005134bce86\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga4f3bab577daf3343e99cc005134bce86\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4f3bab577daf3343e99cc005134bce86\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga13a2391339d0790d43b76d00a7611c4f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga13a2391339d0790d43b76d00a7611c4f\">GLM_ALIGNED_TYPEDEF</a> (u16, aligned_u16, 2)</td></tr>\n<tr class=\"memdesc:ga13a2391339d0790d43b76d00a7611c4f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga13a2391339d0790d43b76d00a7611c4f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga13a2391339d0790d43b76d00a7611c4f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga197570e03acbc3d18ab698e342971e8f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga197570e03acbc3d18ab698e342971e8f\">GLM_ALIGNED_TYPEDEF</a> (u32, aligned_u32, 4)</td></tr>\n<tr class=\"memdesc:ga197570e03acbc3d18ab698e342971e8f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga197570e03acbc3d18ab698e342971e8f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga197570e03acbc3d18ab698e342971e8f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0f033b21e145a1faa32c62ede5878993\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0f033b21e145a1faa32c62ede5878993\">GLM_ALIGNED_TYPEDEF</a> (u64, aligned_u64, 8)</td></tr>\n<tr class=\"memdesc:ga0f033b21e145a1faa32c62ede5878993\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga0f033b21e145a1faa32c62ede5878993\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0f033b21e145a1faa32c62ede5878993\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga509af83527f5cd512e9a7873590663aa\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga509af83527f5cd512e9a7873590663aa\">GLM_ALIGNED_TYPEDEF</a> (uvec1, aligned_uvec1, 4)</td></tr>\n<tr class=\"memdesc:ga509af83527f5cd512e9a7873590663aa\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga509af83527f5cd512e9a7873590663aa\">More...</a><br /></td></tr>\n<tr class=\"separator:ga509af83527f5cd512e9a7873590663aa\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga94e86186978c502c6dc0c0d9c4a30679\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga94e86186978c502c6dc0c0d9c4a30679\">GLM_ALIGNED_TYPEDEF</a> (uvec2, aligned_uvec2, 8)</td></tr>\n<tr class=\"memdesc:ga94e86186978c502c6dc0c0d9c4a30679\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#ga94e86186978c502c6dc0c0d9c4a30679\">More...</a><br /></td></tr>\n<tr class=\"separator:ga94e86186978c502c6dc0c0d9c4a30679\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5cec574686a7f3c8ed24bb195c5e2d0a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5cec574686a7f3c8ed24bb195c5e2d0a\">GLM_ALIGNED_TYPEDEF</a> (uvec3, aligned_uvec3, 16)</td></tr>\n<tr class=\"memdesc:ga5cec574686a7f3c8ed24bb195c5e2d0a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#ga5cec574686a7f3c8ed24bb195c5e2d0a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5cec574686a7f3c8ed24bb195c5e2d0a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga47edfdcee9c89b1ebdaf20450323b1d4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga47edfdcee9c89b1ebdaf20450323b1d4\">GLM_ALIGNED_TYPEDEF</a> (uvec4, aligned_uvec4, 16)</td></tr>\n<tr class=\"memdesc:ga47edfdcee9c89b1ebdaf20450323b1d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#ga47edfdcee9c89b1ebdaf20450323b1d4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga47edfdcee9c89b1ebdaf20450323b1d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5611d6718e3a00096918a64192e73a45\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5611d6718e3a00096918a64192e73a45\">GLM_ALIGNED_TYPEDEF</a> (u8vec1, aligned_u8vec1, 1)</td></tr>\n<tr class=\"memdesc:ga5611d6718e3a00096918a64192e73a45\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga5611d6718e3a00096918a64192e73a45\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5611d6718e3a00096918a64192e73a45\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga19837e6f72b60d994a805ef564c6c326\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga19837e6f72b60d994a805ef564c6c326\">GLM_ALIGNED_TYPEDEF</a> (u8vec2, aligned_u8vec2, 2)</td></tr>\n<tr class=\"memdesc:ga19837e6f72b60d994a805ef564c6c326\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#ga19837e6f72b60d994a805ef564c6c326\">More...</a><br /></td></tr>\n<tr class=\"separator:ga19837e6f72b60d994a805ef564c6c326\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9740cf8e34f068049b42a2753f9601c2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9740cf8e34f068049b42a2753f9601c2\">GLM_ALIGNED_TYPEDEF</a> (u8vec3, aligned_u8vec3, 4)</td></tr>\n<tr class=\"memdesc:ga9740cf8e34f068049b42a2753f9601c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#ga9740cf8e34f068049b42a2753f9601c2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9740cf8e34f068049b42a2753f9601c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8b8588bb221448f5541a858903822a57\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8b8588bb221448f5541a858903822a57\">GLM_ALIGNED_TYPEDEF</a> (u8vec4, aligned_u8vec4, 4)</td></tr>\n<tr class=\"memdesc:ga8b8588bb221448f5541a858903822a57\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 8 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#ga8b8588bb221448f5541a858903822a57\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8b8588bb221448f5541a858903822a57\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga991abe990c16de26b2129d6bc2f4c051\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga991abe990c16de26b2129d6bc2f4c051\">GLM_ALIGNED_TYPEDEF</a> (u16vec1, aligned_u16vec1, 2)</td></tr>\n<tr class=\"memdesc:ga991abe990c16de26b2129d6bc2f4c051\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#ga991abe990c16de26b2129d6bc2f4c051\">More...</a><br /></td></tr>\n<tr class=\"separator:ga991abe990c16de26b2129d6bc2f4c051\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac01bb9fc32a1cd76c2b80d030f71df4c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac01bb9fc32a1cd76c2b80d030f71df4c\">GLM_ALIGNED_TYPEDEF</a> (u16vec2, aligned_u16vec2, 4)</td></tr>\n<tr class=\"memdesc:gac01bb9fc32a1cd76c2b80d030f71df4c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#gac01bb9fc32a1cd76c2b80d030f71df4c\">More...</a><br /></td></tr>\n<tr class=\"separator:gac01bb9fc32a1cd76c2b80d030f71df4c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga09540dbca093793a36a8997e0d4bee77\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga09540dbca093793a36a8997e0d4bee77\">GLM_ALIGNED_TYPEDEF</a> (u16vec3, aligned_u16vec3, 8)</td></tr>\n<tr class=\"memdesc:ga09540dbca093793a36a8997e0d4bee77\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#ga09540dbca093793a36a8997e0d4bee77\">More...</a><br /></td></tr>\n<tr class=\"separator:ga09540dbca093793a36a8997e0d4bee77\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaecafb5996f5a44f57e34d29c8670741e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaecafb5996f5a44f57e34d29c8670741e\">GLM_ALIGNED_TYPEDEF</a> (u16vec4, aligned_u16vec4, 8)</td></tr>\n<tr class=\"memdesc:gaecafb5996f5a44f57e34d29c8670741e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 16 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#gaecafb5996f5a44f57e34d29c8670741e\">More...</a><br /></td></tr>\n<tr class=\"separator:gaecafb5996f5a44f57e34d29c8670741e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac6b161a04d2f8408fe1c9d857e8daac0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac6b161a04d2f8408fe1c9d857e8daac0\">GLM_ALIGNED_TYPEDEF</a> (u32vec1, aligned_u32vec1, 4)</td></tr>\n<tr class=\"memdesc:gac6b161a04d2f8408fe1c9d857e8daac0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gac6b161a04d2f8408fe1c9d857e8daac0\">More...</a><br /></td></tr>\n<tr class=\"separator:gac6b161a04d2f8408fe1c9d857e8daac0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1fa0dfc8feb0fa17dab2acd43e05342b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1fa0dfc8feb0fa17dab2acd43e05342b\">GLM_ALIGNED_TYPEDEF</a> (u32vec2, aligned_u32vec2, 8)</td></tr>\n<tr class=\"memdesc:ga1fa0dfc8feb0fa17dab2acd43e05342b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#ga1fa0dfc8feb0fa17dab2acd43e05342b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1fa0dfc8feb0fa17dab2acd43e05342b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0019500abbfa9c66eff61ca75eaaed94\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0019500abbfa9c66eff61ca75eaaed94\">GLM_ALIGNED_TYPEDEF</a> (u32vec3, aligned_u32vec3, 16)</td></tr>\n<tr class=\"memdesc:ga0019500abbfa9c66eff61ca75eaaed94\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#ga0019500abbfa9c66eff61ca75eaaed94\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0019500abbfa9c66eff61ca75eaaed94\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga14fd29d01dae7b08a04e9facbcc18824\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga14fd29d01dae7b08a04e9facbcc18824\">GLM_ALIGNED_TYPEDEF</a> (u32vec4, aligned_u32vec4, 16)</td></tr>\n<tr class=\"memdesc:ga14fd29d01dae7b08a04e9facbcc18824\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 32 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#ga14fd29d01dae7b08a04e9facbcc18824\">More...</a><br /></td></tr>\n<tr class=\"separator:ga14fd29d01dae7b08a04e9facbcc18824\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab253845f534a67136f9619843cade903\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab253845f534a67136f9619843cade903\">GLM_ALIGNED_TYPEDEF</a> (u64vec1, aligned_u64vec1, 8)</td></tr>\n<tr class=\"memdesc:gab253845f534a67136f9619843cade903\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned scalar type.  <a href=\"a00223.html#gab253845f534a67136f9619843cade903\">More...</a><br /></td></tr>\n<tr class=\"separator:gab253845f534a67136f9619843cade903\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga929427a7627940cdf3304f9c050b677d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga929427a7627940cdf3304f9c050b677d\">GLM_ALIGNED_TYPEDEF</a> (u64vec2, aligned_u64vec2, 16)</td></tr>\n<tr class=\"memdesc:ga929427a7627940cdf3304f9c050b677d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned vector of 2 components type.  <a href=\"a00223.html#ga929427a7627940cdf3304f9c050b677d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga929427a7627940cdf3304f9c050b677d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae373b6c04fdf9879f33d63e6949c037e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gae373b6c04fdf9879f33d63e6949c037e\">GLM_ALIGNED_TYPEDEF</a> (u64vec3, aligned_u64vec3, 32)</td></tr>\n<tr class=\"memdesc:gae373b6c04fdf9879f33d63e6949c037e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned vector of 3 components type.  <a href=\"a00223.html#gae373b6c04fdf9879f33d63e6949c037e\">More...</a><br /></td></tr>\n<tr class=\"separator:gae373b6c04fdf9879f33d63e6949c037e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga53a8a03dca2015baec4584f45b8e9cdc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga53a8a03dca2015baec4584f45b8e9cdc\">GLM_ALIGNED_TYPEDEF</a> (u64vec4, aligned_u64vec4, 32)</td></tr>\n<tr class=\"memdesc:ga53a8a03dca2015baec4584f45b8e9cdc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Default qualifier 64 bit unsigned integer aligned vector of 4 components type.  <a href=\"a00223.html#ga53a8a03dca2015baec4584f45b8e9cdc\">More...</a><br /></td></tr>\n<tr class=\"separator:ga53a8a03dca2015baec4584f45b8e9cdc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab3301bae94ef5bf59fbdd9a24e7d2a01\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab3301bae94ef5bf59fbdd9a24e7d2a01\">GLM_ALIGNED_TYPEDEF</a> (float32, aligned_float32, 4)</td></tr>\n<tr class=\"memdesc:gab3301bae94ef5bf59fbdd9a24e7d2a01\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit single-qualifier floating-point aligned scalar.  <a href=\"a00223.html#gab3301bae94ef5bf59fbdd9a24e7d2a01\">More...</a><br /></td></tr>\n<tr class=\"separator:gab3301bae94ef5bf59fbdd9a24e7d2a01\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga75930684ff2233171c573e603f216162\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga75930684ff2233171c573e603f216162\">GLM_ALIGNED_TYPEDEF</a> (float64, aligned_float64, 8)</td></tr>\n<tr class=\"memdesc:ga75930684ff2233171c573e603f216162\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit double-qualifier floating-point aligned scalar.  <a href=\"a00223.html#ga75930684ff2233171c573e603f216162\">More...</a><br /></td></tr>\n<tr class=\"separator:ga75930684ff2233171c573e603f216162\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gada9b0bea273d3ae0286f891533b9568f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gada9b0bea273d3ae0286f891533b9568f\">GLM_ALIGNED_TYPEDEF</a> (float32_t, aligned_float32_t, 4)</td></tr>\n<tr class=\"memdesc:gada9b0bea273d3ae0286f891533b9568f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit single-qualifier floating-point aligned scalar.  <a href=\"a00223.html#gada9b0bea273d3ae0286f891533b9568f\">More...</a><br /></td></tr>\n<tr class=\"separator:gada9b0bea273d3ae0286f891533b9568f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e3a2d83b131336219a0f4c7cbba2a48\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6e3a2d83b131336219a0f4c7cbba2a48\">GLM_ALIGNED_TYPEDEF</a> (float64_t, aligned_float64_t, 8)</td></tr>\n<tr class=\"memdesc:ga6e3a2d83b131336219a0f4c7cbba2a48\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit double-qualifier floating-point aligned scalar.  <a href=\"a00223.html#ga6e3a2d83b131336219a0f4c7cbba2a48\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e3a2d83b131336219a0f4c7cbba2a48\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadbce23b9f23d77bb3884e289a574ebd5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gadbce23b9f23d77bb3884e289a574ebd5\">GLM_ALIGNED_TYPEDEF</a> (float32, aligned_f32, 4)</td></tr>\n<tr class=\"memdesc:gadbce23b9f23d77bb3884e289a574ebd5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">32 bit single-qualifier floating-point aligned scalar.  <a href=\"a00223.html#gadbce23b9f23d77bb3884e289a574ebd5\">More...</a><br /></td></tr>\n<tr class=\"separator:gadbce23b9f23d77bb3884e289a574ebd5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa4deaa0dea930c393d55e7a4352b0a20\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa4deaa0dea930c393d55e7a4352b0a20\">GLM_ALIGNED_TYPEDEF</a> (float64, aligned_f64, 8)</td></tr>\n<tr class=\"memdesc:gaa4deaa0dea930c393d55e7a4352b0a20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">64 bit double-qualifier floating-point aligned scalar.  <a href=\"a00223.html#gaa4deaa0dea930c393d55e7a4352b0a20\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa4deaa0dea930c393d55e7a4352b0a20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga81bc497b2bfc6f80bab690c6ee28f0f9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga81bc497b2bfc6f80bab690c6ee28f0f9\">GLM_ALIGNED_TYPEDEF</a> (vec1, aligned_vec1, 4)</td></tr>\n<tr class=\"memdesc:ga81bc497b2bfc6f80bab690c6ee28f0f9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#ga81bc497b2bfc6f80bab690c6ee28f0f9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga81bc497b2bfc6f80bab690c6ee28f0f9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gada3e8f783e9d4b90006695a16c39d4d4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gada3e8f783e9d4b90006695a16c39d4d4\">GLM_ALIGNED_TYPEDEF</a> (vec2, aligned_vec2, 8)</td></tr>\n<tr class=\"memdesc:gada3e8f783e9d4b90006695a16c39d4d4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#gada3e8f783e9d4b90006695a16c39d4d4\">More...</a><br /></td></tr>\n<tr class=\"separator:gada3e8f783e9d4b90006695a16c39d4d4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab8d081fac3a38d6f55fa552f32168d32\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab8d081fac3a38d6f55fa552f32168d32\">GLM_ALIGNED_TYPEDEF</a> (vec3, aligned_vec3, 16)</td></tr>\n<tr class=\"memdesc:gab8d081fac3a38d6f55fa552f32168d32\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#gab8d081fac3a38d6f55fa552f32168d32\">More...</a><br /></td></tr>\n<tr class=\"separator:gab8d081fac3a38d6f55fa552f32168d32\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga12fe7b9769c964c5b48dcfd8b7f40198\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga12fe7b9769c964c5b48dcfd8b7f40198\">GLM_ALIGNED_TYPEDEF</a> (vec4, aligned_vec4, 16)</td></tr>\n<tr class=\"memdesc:ga12fe7b9769c964c5b48dcfd8b7f40198\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga12fe7b9769c964c5b48dcfd8b7f40198\">More...</a><br /></td></tr>\n<tr class=\"separator:ga12fe7b9769c964c5b48dcfd8b7f40198\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaefab04611c7f8fe1fd9be3071efea6cc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaefab04611c7f8fe1fd9be3071efea6cc\">GLM_ALIGNED_TYPEDEF</a> (fvec1, aligned_fvec1, 4)</td></tr>\n<tr class=\"memdesc:gaefab04611c7f8fe1fd9be3071efea6cc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#gaefab04611c7f8fe1fd9be3071efea6cc\">More...</a><br /></td></tr>\n<tr class=\"separator:gaefab04611c7f8fe1fd9be3071efea6cc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2543c05ba19b3bd19d45b1227390c5b4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2543c05ba19b3bd19d45b1227390c5b4\">GLM_ALIGNED_TYPEDEF</a> (fvec2, aligned_fvec2, 8)</td></tr>\n<tr class=\"memdesc:ga2543c05ba19b3bd19d45b1227390c5b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#ga2543c05ba19b3bd19d45b1227390c5b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2543c05ba19b3bd19d45b1227390c5b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga009afd727fd657ef33a18754d6d28f60\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga009afd727fd657ef33a18754d6d28f60\">GLM_ALIGNED_TYPEDEF</a> (fvec3, aligned_fvec3, 16)</td></tr>\n<tr class=\"memdesc:ga009afd727fd657ef33a18754d6d28f60\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#ga009afd727fd657ef33a18754d6d28f60\">More...</a><br /></td></tr>\n<tr class=\"separator:ga009afd727fd657ef33a18754d6d28f60\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2f26177e74bfb301a3d0e02ec3c3ef53\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2f26177e74bfb301a3d0e02ec3c3ef53\">GLM_ALIGNED_TYPEDEF</a> (fvec4, aligned_fvec4, 16)</td></tr>\n<tr class=\"memdesc:ga2f26177e74bfb301a3d0e02ec3c3ef53\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga2f26177e74bfb301a3d0e02ec3c3ef53\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2f26177e74bfb301a3d0e02ec3c3ef53\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga309f495a1d6b75ddf195b674b65cb1e4\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga309f495a1d6b75ddf195b674b65cb1e4\">GLM_ALIGNED_TYPEDEF</a> (f32vec1, aligned_f32vec1, 4)</td></tr>\n<tr class=\"memdesc:ga309f495a1d6b75ddf195b674b65cb1e4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#ga309f495a1d6b75ddf195b674b65cb1e4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga309f495a1d6b75ddf195b674b65cb1e4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5e185865a2217d0cd47187644683a8c3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5e185865a2217d0cd47187644683a8c3\">GLM_ALIGNED_TYPEDEF</a> (f32vec2, aligned_f32vec2, 8)</td></tr>\n<tr class=\"memdesc:ga5e185865a2217d0cd47187644683a8c3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#ga5e185865a2217d0cd47187644683a8c3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5e185865a2217d0cd47187644683a8c3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gade4458b27b039b9ca34f8ec049f3115a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gade4458b27b039b9ca34f8ec049f3115a\">GLM_ALIGNED_TYPEDEF</a> (f32vec3, aligned_f32vec3, 16)</td></tr>\n<tr class=\"memdesc:gade4458b27b039b9ca34f8ec049f3115a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#gade4458b27b039b9ca34f8ec049f3115a\">More...</a><br /></td></tr>\n<tr class=\"separator:gade4458b27b039b9ca34f8ec049f3115a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\">GLM_ALIGNED_TYPEDEF</a> (f32vec4, aligned_f32vec4, 16)</td></tr>\n<tr class=\"memdesc:ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3e0f35fa0c626285a8bad41707e7316c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga3e0f35fa0c626285a8bad41707e7316c\">GLM_ALIGNED_TYPEDEF</a> (dvec1, aligned_dvec1, 8)</td></tr>\n<tr class=\"memdesc:ga3e0f35fa0c626285a8bad41707e7316c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#ga3e0f35fa0c626285a8bad41707e7316c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3e0f35fa0c626285a8bad41707e7316c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga78bfec2f185d1d365ea0a9ef1e3d45b8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga78bfec2f185d1d365ea0a9ef1e3d45b8\">GLM_ALIGNED_TYPEDEF</a> (dvec2, aligned_dvec2, 16)</td></tr>\n<tr class=\"memdesc:ga78bfec2f185d1d365ea0a9ef1e3d45b8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#ga78bfec2f185d1d365ea0a9ef1e3d45b8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga78bfec2f185d1d365ea0a9ef1e3d45b8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga01fe6fee6db5df580b6724a7e681f069\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga01fe6fee6db5df580b6724a7e681f069\">GLM_ALIGNED_TYPEDEF</a> (dvec3, aligned_dvec3, 32)</td></tr>\n<tr class=\"memdesc:ga01fe6fee6db5df580b6724a7e681f069\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#ga01fe6fee6db5df580b6724a7e681f069\">More...</a><br /></td></tr>\n<tr class=\"separator:ga01fe6fee6db5df580b6724a7e681f069\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga687d5b8f551d5af32425c0b2fba15e99\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga687d5b8f551d5af32425c0b2fba15e99\">GLM_ALIGNED_TYPEDEF</a> (dvec4, aligned_dvec4, 32)</td></tr>\n<tr class=\"memdesc:ga687d5b8f551d5af32425c0b2fba15e99\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga687d5b8f551d5af32425c0b2fba15e99\">More...</a><br /></td></tr>\n<tr class=\"separator:ga687d5b8f551d5af32425c0b2fba15e99\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8e842371d46842ff8f1813419ba49d0f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga8e842371d46842ff8f1813419ba49d0f\">GLM_ALIGNED_TYPEDEF</a> (f64vec1, aligned_f64vec1, 8)</td></tr>\n<tr class=\"memdesc:ga8e842371d46842ff8f1813419ba49d0f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 1 component.  <a href=\"a00223.html#ga8e842371d46842ff8f1813419ba49d0f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8e842371d46842ff8f1813419ba49d0f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga32814aa0f19316b43134fc25f2aad2b9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga32814aa0f19316b43134fc25f2aad2b9\">GLM_ALIGNED_TYPEDEF</a> (f64vec2, aligned_f64vec2, 16)</td></tr>\n<tr class=\"memdesc:ga32814aa0f19316b43134fc25f2aad2b9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 2 components.  <a href=\"a00223.html#ga32814aa0f19316b43134fc25f2aad2b9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga32814aa0f19316b43134fc25f2aad2b9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf3d3bbc1e93909b689123b085e177a14\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf3d3bbc1e93909b689123b085e177a14\">GLM_ALIGNED_TYPEDEF</a> (f64vec3, aligned_f64vec3, 32)</td></tr>\n<tr class=\"memdesc:gaf3d3bbc1e93909b689123b085e177a14\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 3 components.  <a href=\"a00223.html#gaf3d3bbc1e93909b689123b085e177a14\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf3d3bbc1e93909b689123b085e177a14\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga804c654cead1139bd250f90f9bb01fad\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga804c654cead1139bd250f90f9bb01fad\">GLM_ALIGNED_TYPEDEF</a> (f64vec4, aligned_f64vec4, 32)</td></tr>\n<tr class=\"memdesc:ga804c654cead1139bd250f90f9bb01fad\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned vector of 4 components.  <a href=\"a00223.html#ga804c654cead1139bd250f90f9bb01fad\">More...</a><br /></td></tr>\n<tr class=\"separator:ga804c654cead1139bd250f90f9bb01fad\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafed7d010235a3aa7ea2f88646858f2ae\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafed7d010235a3aa7ea2f88646858f2ae\">GLM_ALIGNED_TYPEDEF</a> (mat2, aligned_mat2, 16)</td></tr>\n<tr class=\"memdesc:gafed7d010235a3aa7ea2f88646858f2ae\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#gafed7d010235a3aa7ea2f88646858f2ae\">More...</a><br /></td></tr>\n<tr class=\"separator:gafed7d010235a3aa7ea2f88646858f2ae\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga17f911ee7b78ca6d1b91c4ab51ddb73c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga17f911ee7b78ca6d1b91c4ab51ddb73c\">GLM_ALIGNED_TYPEDEF</a> (mat3, aligned_mat3, 16)</td></tr>\n<tr class=\"memdesc:ga17f911ee7b78ca6d1b91c4ab51ddb73c\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#ga17f911ee7b78ca6d1b91c4ab51ddb73c\">More...</a><br /></td></tr>\n<tr class=\"separator:ga17f911ee7b78ca6d1b91c4ab51ddb73c\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga31940e6012b72110e26fdb0f54805033\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga31940e6012b72110e26fdb0f54805033\">GLM_ALIGNED_TYPEDEF</a> (mat4, aligned_mat4, 16)</td></tr>\n<tr class=\"memdesc:ga31940e6012b72110e26fdb0f54805033\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#ga31940e6012b72110e26fdb0f54805033\">More...</a><br /></td></tr>\n<tr class=\"separator:ga31940e6012b72110e26fdb0f54805033\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga01de96cd0b541c52d2b4a3faf65822e9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga01de96cd0b541c52d2b4a3faf65822e9\">GLM_ALIGNED_TYPEDEF</a> (mat2x2, aligned_mat2x2, 16)</td></tr>\n<tr class=\"memdesc:ga01de96cd0b541c52d2b4a3faf65822e9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga01de96cd0b541c52d2b4a3faf65822e9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga01de96cd0b541c52d2b4a3faf65822e9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac88a191b004bd341e64fc53b5a4d00e3\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac88a191b004bd341e64fc53b5a4d00e3\">GLM_ALIGNED_TYPEDEF</a> (mat3x3, aligned_mat3x3, 16)</td></tr>\n<tr class=\"memdesc:gac88a191b004bd341e64fc53b5a4d00e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#gac88a191b004bd341e64fc53b5a4d00e3\">More...</a><br /></td></tr>\n<tr class=\"separator:gac88a191b004bd341e64fc53b5a4d00e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabe8c745fa2ced44a600a6e3f19991161\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabe8c745fa2ced44a600a6e3f19991161\">GLM_ALIGNED_TYPEDEF</a> (mat4x4, aligned_mat4x4, 16)</td></tr>\n<tr class=\"memdesc:gabe8c745fa2ced44a600a6e3f19991161\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#gabe8c745fa2ced44a600a6e3f19991161\">More...</a><br /></td></tr>\n<tr class=\"separator:gabe8c745fa2ced44a600a6e3f19991161\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga719da577361541a4c43a2dd1d0e361e1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga719da577361541a4c43a2dd1d0e361e1\">GLM_ALIGNED_TYPEDEF</a> (fmat2x2, aligned_fmat2, 16)</td></tr>\n<tr class=\"memdesc:ga719da577361541a4c43a2dd1d0e361e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga719da577361541a4c43a2dd1d0e361e1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga719da577361541a4c43a2dd1d0e361e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e7ee4f541e1d7db66cd1a224caacafb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6e7ee4f541e1d7db66cd1a224caacafb\">GLM_ALIGNED_TYPEDEF</a> (fmat3x3, aligned_fmat3, 16)</td></tr>\n<tr class=\"memdesc:ga6e7ee4f541e1d7db66cd1a224caacafb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#ga6e7ee4f541e1d7db66cd1a224caacafb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e7ee4f541e1d7db66cd1a224caacafb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae5d672d359f2a39f63f98c7975057486\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gae5d672d359f2a39f63f98c7975057486\">GLM_ALIGNED_TYPEDEF</a> (fmat4x4, aligned_fmat4, 16)</td></tr>\n<tr class=\"memdesc:gae5d672d359f2a39f63f98c7975057486\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#gae5d672d359f2a39f63f98c7975057486\">More...</a><br /></td></tr>\n<tr class=\"separator:gae5d672d359f2a39f63f98c7975057486\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6fa2df037dbfc5fe8c8e0b4db8a34953\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6fa2df037dbfc5fe8c8e0b4db8a34953\">GLM_ALIGNED_TYPEDEF</a> (fmat2x2, aligned_fmat2x2, 16)</td></tr>\n<tr class=\"memdesc:ga6fa2df037dbfc5fe8c8e0b4db8a34953\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga6fa2df037dbfc5fe8c8e0b4db8a34953\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6fa2df037dbfc5fe8c8e0b4db8a34953\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0743b4f4f69a3227b82ff58f6abbad62\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0743b4f4f69a3227b82ff58f6abbad62\">GLM_ALIGNED_TYPEDEF</a> (fmat2x3, aligned_fmat2x3, 16)</td></tr>\n<tr class=\"memdesc:ga0743b4f4f69a3227b82ff58f6abbad62\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 2x3 matrix.  <a href=\"a00223.html#ga0743b4f4f69a3227b82ff58f6abbad62\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0743b4f4f69a3227b82ff58f6abbad62\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1a76b325fdf70f961d835edd182c63dd\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1a76b325fdf70f961d835edd182c63dd\">GLM_ALIGNED_TYPEDEF</a> (fmat2x4, aligned_fmat2x4, 16)</td></tr>\n<tr class=\"memdesc:ga1a76b325fdf70f961d835edd182c63dd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 2x4 matrix.  <a href=\"a00223.html#ga1a76b325fdf70f961d835edd182c63dd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1a76b325fdf70f961d835edd182c63dd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4b4e181cd041ba28c3163e7b8074aef0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga4b4e181cd041ba28c3163e7b8074aef0\">GLM_ALIGNED_TYPEDEF</a> (fmat3x2, aligned_fmat3x2, 16)</td></tr>\n<tr class=\"memdesc:ga4b4e181cd041ba28c3163e7b8074aef0\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x2 matrix.  <a href=\"a00223.html#ga4b4e181cd041ba28c3163e7b8074aef0\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4b4e181cd041ba28c3163e7b8074aef0\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga27b13f465abc8a40705698145e222c3f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga27b13f465abc8a40705698145e222c3f\">GLM_ALIGNED_TYPEDEF</a> (fmat3x3, aligned_fmat3x3, 16)</td></tr>\n<tr class=\"memdesc:ga27b13f465abc8a40705698145e222c3f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#ga27b13f465abc8a40705698145e222c3f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga27b13f465abc8a40705698145e222c3f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2608d19cc275830a6f8c0b6405625a4f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2608d19cc275830a6f8c0b6405625a4f\">GLM_ALIGNED_TYPEDEF</a> (fmat3x4, aligned_fmat3x4, 16)</td></tr>\n<tr class=\"memdesc:ga2608d19cc275830a6f8c0b6405625a4f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x4 matrix.  <a href=\"a00223.html#ga2608d19cc275830a6f8c0b6405625a4f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2608d19cc275830a6f8c0b6405625a4f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga93f09768241358a287c4cca538f1f7e7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga93f09768241358a287c4cca538f1f7e7\">GLM_ALIGNED_TYPEDEF</a> (fmat4x2, aligned_fmat4x2, 16)</td></tr>\n<tr class=\"memdesc:ga93f09768241358a287c4cca538f1f7e7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x2 matrix.  <a href=\"a00223.html#ga93f09768241358a287c4cca538f1f7e7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga93f09768241358a287c4cca538f1f7e7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7c117e3ecca089e10247b1d41d88aff9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga7c117e3ecca089e10247b1d41d88aff9\">GLM_ALIGNED_TYPEDEF</a> (fmat4x3, aligned_fmat4x3, 16)</td></tr>\n<tr class=\"memdesc:ga7c117e3ecca089e10247b1d41d88aff9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x3 matrix.  <a href=\"a00223.html#ga7c117e3ecca089e10247b1d41d88aff9\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7c117e3ecca089e10247b1d41d88aff9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga07c75cd04ba42dc37fa3e105f89455c5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga07c75cd04ba42dc37fa3e105f89455c5\">GLM_ALIGNED_TYPEDEF</a> (fmat4x4, aligned_fmat4x4, 16)</td></tr>\n<tr class=\"memdesc:ga07c75cd04ba42dc37fa3e105f89455c5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#ga07c75cd04ba42dc37fa3e105f89455c5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga07c75cd04ba42dc37fa3e105f89455c5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga65ff0d690a34a4d7f46f9b2eb51525ee\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga65ff0d690a34a4d7f46f9b2eb51525ee\">GLM_ALIGNED_TYPEDEF</a> (f32mat2x2, aligned_f32mat2, 16)</td></tr>\n<tr class=\"memdesc:ga65ff0d690a34a4d7f46f9b2eb51525ee\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga65ff0d690a34a4d7f46f9b2eb51525ee\">More...</a><br /></td></tr>\n<tr class=\"separator:ga65ff0d690a34a4d7f46f9b2eb51525ee\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadd8ddbe2bf65ccede865ba2f510176dc\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gadd8ddbe2bf65ccede865ba2f510176dc\">GLM_ALIGNED_TYPEDEF</a> (f32mat3x3, aligned_f32mat3, 16)</td></tr>\n<tr class=\"memdesc:gadd8ddbe2bf65ccede865ba2f510176dc\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#gadd8ddbe2bf65ccede865ba2f510176dc\">More...</a><br /></td></tr>\n<tr class=\"separator:gadd8ddbe2bf65ccede865ba2f510176dc\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf18dbff14bf13d3ff540c517659ec045\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaf18dbff14bf13d3ff540c517659ec045\">GLM_ALIGNED_TYPEDEF</a> (f32mat4x4, aligned_f32mat4, 16)</td></tr>\n<tr class=\"memdesc:gaf18dbff14bf13d3ff540c517659ec045\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#gaf18dbff14bf13d3ff540c517659ec045\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf18dbff14bf13d3ff540c517659ec045\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga66339f6139bf7ff19e245beb33f61cc8\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga66339f6139bf7ff19e245beb33f61cc8\">GLM_ALIGNED_TYPEDEF</a> (f32mat2x2, aligned_f32mat2x2, 16)</td></tr>\n<tr class=\"memdesc:ga66339f6139bf7ff19e245beb33f61cc8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga66339f6139bf7ff19e245beb33f61cc8\">More...</a><br /></td></tr>\n<tr class=\"separator:ga66339f6139bf7ff19e245beb33f61cc8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1558a48b3934011b52612809f443e46d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1558a48b3934011b52612809f443e46d\">GLM_ALIGNED_TYPEDEF</a> (f32mat2x3, aligned_f32mat2x3, 16)</td></tr>\n<tr class=\"memdesc:ga1558a48b3934011b52612809f443e46d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 2x3 matrix.  <a href=\"a00223.html#ga1558a48b3934011b52612809f443e46d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1558a48b3934011b52612809f443e46d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa52e5732daa62851627021ad551c7680\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaa52e5732daa62851627021ad551c7680\">GLM_ALIGNED_TYPEDEF</a> (f32mat2x4, aligned_f32mat2x4, 16)</td></tr>\n<tr class=\"memdesc:gaa52e5732daa62851627021ad551c7680\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 2x4 matrix.  <a href=\"a00223.html#gaa52e5732daa62851627021ad551c7680\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa52e5732daa62851627021ad551c7680\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac09663c42566bcb58d23c6781ac4e85a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gac09663c42566bcb58d23c6781ac4e85a\">GLM_ALIGNED_TYPEDEF</a> (f32mat3x2, aligned_f32mat3x2, 16)</td></tr>\n<tr class=\"memdesc:gac09663c42566bcb58d23c6781ac4e85a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x2 matrix.  <a href=\"a00223.html#gac09663c42566bcb58d23c6781ac4e85a\">More...</a><br /></td></tr>\n<tr class=\"separator:gac09663c42566bcb58d23c6781ac4e85a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3f510999e59e1b309113e1d561162b29\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga3f510999e59e1b309113e1d561162b29\">GLM_ALIGNED_TYPEDEF</a> (f32mat3x3, aligned_f32mat3x3, 16)</td></tr>\n<tr class=\"memdesc:ga3f510999e59e1b309113e1d561162b29\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#ga3f510999e59e1b309113e1d561162b29\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3f510999e59e1b309113e1d561162b29\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2c9c94f0c89cd71ce56551db6cf4aaec\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga2c9c94f0c89cd71ce56551db6cf4aaec\">GLM_ALIGNED_TYPEDEF</a> (f32mat3x4, aligned_f32mat3x4, 16)</td></tr>\n<tr class=\"memdesc:ga2c9c94f0c89cd71ce56551db6cf4aaec\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 3x4 matrix.  <a href=\"a00223.html#ga2c9c94f0c89cd71ce56551db6cf4aaec\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2c9c94f0c89cd71ce56551db6cf4aaec\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga99ce8274c750fbfdf0e70c95946a2875\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga99ce8274c750fbfdf0e70c95946a2875\">GLM_ALIGNED_TYPEDEF</a> (f32mat4x2, aligned_f32mat4x2, 16)</td></tr>\n<tr class=\"memdesc:ga99ce8274c750fbfdf0e70c95946a2875\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x2 matrix.  <a href=\"a00223.html#ga99ce8274c750fbfdf0e70c95946a2875\">More...</a><br /></td></tr>\n<tr class=\"separator:ga99ce8274c750fbfdf0e70c95946a2875\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9476ef66790239df53dbe66f3989c3b5\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9476ef66790239df53dbe66f3989c3b5\">GLM_ALIGNED_TYPEDEF</a> (f32mat4x3, aligned_f32mat4x3, 16)</td></tr>\n<tr class=\"memdesc:ga9476ef66790239df53dbe66f3989c3b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x3 matrix.  <a href=\"a00223.html#ga9476ef66790239df53dbe66f3989c3b5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9476ef66790239df53dbe66f3989c3b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc429b3b0b49921e12713b6d31e14e1d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gacc429b3b0b49921e12713b6d31e14e1d\">GLM_ALIGNED_TYPEDEF</a> (f32mat4x4, aligned_f32mat4x4, 16)</td></tr>\n<tr class=\"memdesc:gacc429b3b0b49921e12713b6d31e14e1d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#gacc429b3b0b49921e12713b6d31e14e1d\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc429b3b0b49921e12713b6d31e14e1d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga88f6c6fa06e6e64479763e69444669cf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga88f6c6fa06e6e64479763e69444669cf\">GLM_ALIGNED_TYPEDEF</a> (f64mat2x2, aligned_f64mat2, 32)</td></tr>\n<tr class=\"memdesc:ga88f6c6fa06e6e64479763e69444669cf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#ga88f6c6fa06e6e64479763e69444669cf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga88f6c6fa06e6e64479763e69444669cf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaae8e4639c991e64754145ab8e4c32083\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaae8e4639c991e64754145ab8e4c32083\">GLM_ALIGNED_TYPEDEF</a> (f64mat3x3, aligned_f64mat3, 32)</td></tr>\n<tr class=\"memdesc:gaae8e4639c991e64754145ab8e4c32083\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#gaae8e4639c991e64754145ab8e4c32083\">More...</a><br /></td></tr>\n<tr class=\"separator:gaae8e4639c991e64754145ab8e4c32083\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e9094f3feb3b5b49d0f83683a101fde\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga6e9094f3feb3b5b49d0f83683a101fde\">GLM_ALIGNED_TYPEDEF</a> (f64mat4x4, aligned_f64mat4, 32)</td></tr>\n<tr class=\"memdesc:ga6e9094f3feb3b5b49d0f83683a101fde\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#ga6e9094f3feb3b5b49d0f83683a101fde\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e9094f3feb3b5b49d0f83683a101fde\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadbd2c639c03de1c3e9591b5a39f65559\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gadbd2c639c03de1c3e9591b5a39f65559\">GLM_ALIGNED_TYPEDEF</a> (f64mat2x2, aligned_f64mat2x2, 32)</td></tr>\n<tr class=\"memdesc:gadbd2c639c03de1c3e9591b5a39f65559\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 1x1 matrix.  <a href=\"a00223.html#gadbd2c639c03de1c3e9591b5a39f65559\">More...</a><br /></td></tr>\n<tr class=\"separator:gadbd2c639c03de1c3e9591b5a39f65559\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab059d7b9fe2094acc563b7223987499f\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gab059d7b9fe2094acc563b7223987499f\">GLM_ALIGNED_TYPEDEF</a> (f64mat2x3, aligned_f64mat2x3, 32)</td></tr>\n<tr class=\"memdesc:gab059d7b9fe2094acc563b7223987499f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 2x3 matrix.  <a href=\"a00223.html#gab059d7b9fe2094acc563b7223987499f\">More...</a><br /></td></tr>\n<tr class=\"separator:gab059d7b9fe2094acc563b7223987499f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabbc811d1c52ed2b8cfcaff1378f75c69\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gabbc811d1c52ed2b8cfcaff1378f75c69\">GLM_ALIGNED_TYPEDEF</a> (f64mat2x4, aligned_f64mat2x4, 32)</td></tr>\n<tr class=\"memdesc:gabbc811d1c52ed2b8cfcaff1378f75c69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 2x4 matrix.  <a href=\"a00223.html#gabbc811d1c52ed2b8cfcaff1378f75c69\">More...</a><br /></td></tr>\n<tr class=\"separator:gabbc811d1c52ed2b8cfcaff1378f75c69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9ddf5212777734d2fd841a84439f3bdf\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga9ddf5212777734d2fd841a84439f3bdf\">GLM_ALIGNED_TYPEDEF</a> (f64mat3x2, aligned_f64mat3x2, 32)</td></tr>\n<tr class=\"memdesc:ga9ddf5212777734d2fd841a84439f3bdf\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 3x2 matrix.  <a href=\"a00223.html#ga9ddf5212777734d2fd841a84439f3bdf\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9ddf5212777734d2fd841a84439f3bdf\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad1dda32ed09f94bfcf0a7d8edfb6cf13\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad1dda32ed09f94bfcf0a7d8edfb6cf13\">GLM_ALIGNED_TYPEDEF</a> (f64mat3x3, aligned_f64mat3x3, 32)</td></tr>\n<tr class=\"memdesc:gad1dda32ed09f94bfcf0a7d8edfb6cf13\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 3x3 matrix.  <a href=\"a00223.html#gad1dda32ed09f94bfcf0a7d8edfb6cf13\">More...</a><br /></td></tr>\n<tr class=\"separator:gad1dda32ed09f94bfcf0a7d8edfb6cf13\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5875e0fa72f07e271e7931811cbbf31a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga5875e0fa72f07e271e7931811cbbf31a\">GLM_ALIGNED_TYPEDEF</a> (f64mat3x4, aligned_f64mat3x4, 32)</td></tr>\n<tr class=\"memdesc:ga5875e0fa72f07e271e7931811cbbf31a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 3x4 matrix.  <a href=\"a00223.html#ga5875e0fa72f07e271e7931811cbbf31a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5875e0fa72f07e271e7931811cbbf31a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga41e82cd6ac07f912ba2a2d45799dcf0d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga41e82cd6ac07f912ba2a2d45799dcf0d\">GLM_ALIGNED_TYPEDEF</a> (f64mat4x2, aligned_f64mat4x2, 32)</td></tr>\n<tr class=\"memdesc:ga41e82cd6ac07f912ba2a2d45799dcf0d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 4x2 matrix.  <a href=\"a00223.html#ga41e82cd6ac07f912ba2a2d45799dcf0d\">More...</a><br /></td></tr>\n<tr class=\"separator:ga41e82cd6ac07f912ba2a2d45799dcf0d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0892638d6ba773043b3d63d1d092622e\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga0892638d6ba773043b3d63d1d092622e\">GLM_ALIGNED_TYPEDEF</a> (f64mat4x3, aligned_f64mat4x3, 32)</td></tr>\n<tr class=\"memdesc:ga0892638d6ba773043b3d63d1d092622e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 4x3 matrix.  <a href=\"a00223.html#ga0892638d6ba773043b3d63d1d092622e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0892638d6ba773043b3d63d1d092622e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga912a16432608b822f1e13607529934c1\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga912a16432608b822f1e13607529934c1\">GLM_ALIGNED_TYPEDEF</a> (f64mat4x4, aligned_f64mat4x4, 32)</td></tr>\n<tr class=\"memdesc:ga912a16432608b822f1e13607529934c1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned 4x4 matrix.  <a href=\"a00223.html#ga912a16432608b822f1e13607529934c1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga912a16432608b822f1e13607529934c1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gafd945a8ea86b042aba410e0560df9a3d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gafd945a8ea86b042aba410e0560df9a3d\">GLM_ALIGNED_TYPEDEF</a> (quat, aligned_quat, 16)</td></tr>\n<tr class=\"memdesc:gafd945a8ea86b042aba410e0560df9a3d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#gafd945a8ea86b042aba410e0560df9a3d\">More...</a><br /></td></tr>\n<tr class=\"separator:gafd945a8ea86b042aba410e0560df9a3d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad8c4bfacff70e57dc8303634c8bfce35\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gad8c4bfacff70e57dc8303634c8bfce35\">GLM_ALIGNED_TYPEDEF</a> (fquat, aligned_fquat, 16)</td></tr>\n<tr class=\"memdesc:gad8c4bfacff70e57dc8303634c8bfce35\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#gad8c4bfacff70e57dc8303634c8bfce35\">More...</a><br /></td></tr>\n<tr class=\"separator:gad8c4bfacff70e57dc8303634c8bfce35\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaabc28c84a3288b697605d4688686f9a9\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#gaabc28c84a3288b697605d4688686f9a9\">GLM_ALIGNED_TYPEDEF</a> (dquat, aligned_dquat, 32)</td></tr>\n<tr class=\"memdesc:gaabc28c84a3288b697605d4688686f9a9\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#gaabc28c84a3288b697605d4688686f9a9\">More...</a><br /></td></tr>\n<tr class=\"separator:gaabc28c84a3288b697605d4688686f9a9\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1ed8aeb5ca67fade269a46105f1bf273\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga1ed8aeb5ca67fade269a46105f1bf273\">GLM_ALIGNED_TYPEDEF</a> (f32quat, aligned_f32quat, 16)</td></tr>\n<tr class=\"memdesc:ga1ed8aeb5ca67fade269a46105f1bf273\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Single-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#ga1ed8aeb5ca67fade269a46105f1bf273\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1ed8aeb5ca67fade269a46105f1bf273\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga95cc03b8b475993fa50e05e38e203303\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">GLM_ALIGNED_TYPEDEF</a> (f64quat, aligned_f64quat, 32)</td></tr>\n<tr class=\"memdesc:ga95cc03b8b475993fa50e05e38e203303\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Double-qualifier floating-point aligned quaternion.  <a href=\"a00223.html#ga95cc03b8b475993fa50e05e38e203303\">More...</a><br /></td></tr>\n<tr class=\"separator:ga95cc03b8b475993fa50e05e38e203303\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00102.html\" title=\"GLM_GTX_type_aligned \">glm/gtx/type_aligned.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines aligned types.</p>\n<p><a class=\"el\" href=\"a00145.html\">Precision types</a> defines aligned types. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gab5cd5c5fad228b25c782084f1cc30114\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6\">lowp_int8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_int8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5bb5dd895ef625c1b113f2cf400186b0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga698e36b01167fc0f037889334dce8def\">lowp_int16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_int16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac6efa54cf7c6c86f7158922abdb1a430\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02\">lowp_int32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_int32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6612eb77c8607048e7552279a11eeb5f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c\">lowp_int64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_int64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7ddc1848ff2223026db8968ce0c97497\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga119c41d73fe9977358174eb3ac1035a3\">lowp_int8_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_int8_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga22240dd9458b0f8c11fbcc4f48714f68\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a\">lowp_int16_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_int16_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8130ea381d76a2cc34a93ccbb6cf487d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga0350631d35ff800e6133ac6243b13cbc\">lowp_int32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_int32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7ccb60f3215d293fd62b33b31ed0e7be\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaebf341fc4a5be233f7dde962c2e33847\">lowp_int64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_int64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac20d508d2ef5cc95ad3daf083c57ec2a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga552a6bde5e75984efb0f863278da2e54\">lowp_i8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_i8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga50257b48069a31d0c8d9c1f644d267de\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7\">lowp_i16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_i16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa07e98e67b7a3435c0746018c7a2a839\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac\">lowp_i32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_i32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga62601fc6f8ca298b77285bedf03faffd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga354736e0c645099cd44c42fb2f87c2b8\">lowp_i64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_i64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac8cff825951aeb54dd846037113c72db\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e\">mediump_int8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_int8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga78f443d88f438575a62b5df497cdf66b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d\">mediump_int16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_int16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0680cd3b5d4e8006985fb41a4f9b57af\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5244cef85d6e870e240c76428a262ae8\">mediump_int32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_int32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad9e5babb1dd3e3531b42c37bf25dd951\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga7b968f2b86a0442a89c7359171e1d866\">mediump_int64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_int64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga353fd9fa8a9ad952fcabd0d53ad9a6dd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga6d7b3789ecb932c26430009478cac7ae\">mediump_int8_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_int8_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2196442c0e5c5e8c77842de388c42521\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga80e72fe94c88498537e8158ba7591c54\">mediump_int16_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_int16_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1284488189daf897cf095c5eefad9744\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180\">mediump_int32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_int32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga73fdc86a539808af58808b7c60a1c4d8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64\">mediump_int64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_int64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafafeea923e1983262c972e2b83922d3b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gacf1ded173e1e2d049c511d095b259e21\">mediump_i8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_i8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4b35ca5fe8f55c9d2fe54fdb8d8896f4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a\">mediump_i16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_i16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga63b882e29170d428463d99c3d630acc6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaf5e94bf2a20af7601787c154751dc2e1\">mediump_i32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_i32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b20507bb048c1edea2d441cc953e6f0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f\">mediump_i64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_i64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga56c5ca60813027b603c7b61425a0479d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad0549c902a96a7164e4ac858d5f39dbf\">highp_int8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_int8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7a751b3aff24c0259f4a7357c2969089\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718\">highp_int16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_int16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga70cd2144351c556469ee6119e59971fc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga84ed04b4e0de18c977e932d617e7c223\">highp_int32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_int32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga46bbf08dc004d8c433041e0b5018a5d3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga226a8d52b4e3f77aaa6231135e886aac\">highp_int64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_int64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab3e10c77a20d1abad2de1c561c7a5c18\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5\">highp_int8_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_int8_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga968f30319ebeaca9ebcd3a25a8e139fb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff\">highp_int16_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_int16_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaae773c28e6390c6aa76f5b678b7098a3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f\">highp_int32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_int32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga790cfff1ca39d0ed696ffed980809311\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga73c6abb280a45feeff60f9accaee91f3\">highp_int64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_int64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8265b91eb23c120a9b0c3e381bc37b96\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gacb88796f2d08ef253d0345aff20c3aee\">highp_i8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_i8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae6d384de17588d8edb894fbe06e0d410\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga0336abc2604dd2c20c30e036454b64f8\">highp_i16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_i16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9c8172b745ee03fc5b2b91c350c2922f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga727675ac6b5d2fc699520e0059735e25\">highp_i32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_i32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga77e0dff12aa4020ddc3f8cabbea7b2e6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd\">highp_i64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_i64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabd82b9faa9d4d618dbbe0fc8a1efee63\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0\">int8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_int8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga285649744560be21000cfd81bbb5d507\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302041c186d0d028bea31b711fe16759\">int16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_int16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga07732da630b2deda428ce95c0ecaf3ff\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8df669f4e7698dfe0c0354d92578d74f\">int32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_int32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1a8da2a8c51f69c07a2e7f473aa420f4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaff5189f97f9e842d9636a0f240001b2e\">int64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_int64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga848aedf13e2d9738acf0bb482c590174\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga4bf09d8838a86866b39ee6e109341645\">int8_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_int8_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafd2803d39049dd45a37a63931e25d943\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede\">int16_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_int16_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae553b33349d6da832cf0724f1e024094\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710\">int32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_int32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga16d223a2b3409e812e1d3bd87f0e9e5c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga322a7d7d2c2c68994dc872a33de63c61\">int64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_int64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2de065d2ddfdb366bcd0febca79ae2ad\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga302ec977b0c0c3ea245b6c9275495355\">i8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabd786bdc20a11c8cb05c92c8212e28d3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699\">i16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad4aefe56691cdb640c72f0d46d3fb532\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb\">i32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8fe9745f7de24a8394518152ff9fccdc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gadb997e409103d4da18abd837e636a496\">i64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaad735483450099f7f882d4e3a3569bd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\">ivec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga76298aed82a439063c3d55980c84aa0b\">aligned_ivec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac7b6f823802edbd6edbaf70ea25bf068\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f\">ivec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#gae4f38fd2c86cee6940986197777b3ca4\">aligned_ivec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3e235bcd2b8029613f25b8d40a2d3ef7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga34aee73784bcc247d426250540c1911c\">ivec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga32794322d294e5ace7fed4a61896f270\">aligned_ivec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga50d8a9523968c77f8325b4c9bfbff41e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224\">ivec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga7f79eae5927c9033d84617e49f6f34e4\">aligned_ivec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9ec20fdfb729c702032da9378c79679f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b\">i8vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i8vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga25b3fe1d9e8d0a5e86c1949c1acd8131\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad06935764d78f43f9d542c784c2212ec\">i8vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i8vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2958f907719d94d8109b562540c910e2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e\">i8vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i8vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1fe6fc032a978f1c845fac9aa0668714\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga4177a44206121dabc8c4ff1c0f544574\">i8vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i8vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit signed integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa4161e7a496dc96972254143fe873e55\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gafe730798732aa7b0647096a004db1b1c\">i16vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i16vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9d7cb211ccda69b1c22ddeeb0f3e7aba\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2996630ba7b10535af8e065cf326f761\">i16vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i16vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaee91dd2ab34423bcc11072ef6bd0f02\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b\">i16vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i16vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga49f047ccaa8b31fad9f26c67bf9b3510\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga550831bfc26d1e0101c1cb3d79938c06\">i16vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i16vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit signed integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga904e9c2436bb099397c0823506a0771f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf\">i32vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i32vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf90651cf2f5e7ee2b11cfdc5a6749534\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8b44026374982dcd1e52d22bac99247e\">i32vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i32vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7354a4ead8cb17868aec36b9c30d6010\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e\">i32vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i32vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad2ecbdea18732163e2636e27b37981ee\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga866a05905c49912309ed1fa5f5980e61\">i32vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i32vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit signed integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga965b1c9aa1800e93d4abc2eb2b5afcbf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50\">i64vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i64vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1f9e9c2ea2768675dff9bae5cde2d829\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga48310188e1d0c616bf8d78c92447523b\">i64vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i64vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad77c317b7d942322cd5be4c8127b3187\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga667948cfe6fb3d6606c750729ec49f77\">i64vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i64vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga716f8ea809bdb11b5b542d8b71aeb04f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa4e31c3d9de067029efeb161a44b0232\">i64vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_i64vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit signed integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad46f8e9082d5878b1bc04f9c1471cdaa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaf49470869e9be2c059629b250619804e\">lowp_uint8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_uint8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1246094581af624aca6c7499aaabf801\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad68bfd9f881856fc863a6ebca0b67f78\">lowp_uint16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_uint16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7a5009a1d0196bbf21dd7518f61f0249\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b\">lowp_uint32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_uint32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga45213fd18b3bb1df391671afefe4d1e7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa212b805736a759998e312cbdd550fae\">lowp_uint64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_uint64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0ba26b4e3fd9ecbc25358efd68d8a4ca\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga667b2ece2b258be898812dc2177995d1\">lowp_uint8_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_uint8_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf2b58f5fb6d4ec8ce7b76221d3af43e1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga91c4815f93177eb423362fd296a87e9f\">lowp_uint16_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_uint16_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadc246401847dcba155f0699425e49dcd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaf1b735b4b1145174f4e4167d13778f9b\">lowp_uint32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_uint32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaace64bddf51a9def01498da9a94fb01c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153\">lowp_uint64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_uint64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad7bb97c29d664bd86ffb1bed4abc5534\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga1b09f03da7ac43055c68a349d5445083\">lowp_u8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_u8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga404bba7785130e0b1384d695a9450b28\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126\">lowp_u16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_u16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga31ba41fd896257536958ec6080203d2a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga4f072ada9552e1e480bbb3b1acde5250\">lowp_u32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_u32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacca5f13627f57b3505676e40a6e43e5e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed\">lowp_u64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_lowp_u64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Low qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5faf1d3e70bf33174dd7f3d01d5b883b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3\">mediump_uint8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_uint8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga727e2bf2c433bb3b0182605860a48363\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2885a6c89916911e418c06bb76b9bdbb\">mediump_uint16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_uint16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga12566ca66d5962dadb4a5eb4c74e891e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f\">mediump_uint32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_uint32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7b66a97a8acaa35c5a377b947318c6bc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga30652709815ad9404272a31957daa59e\">mediump_uint64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_uint64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa9cde002439b74fa66120a16a9f55fcc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gadfe65c78231039e90507770db50c98c7\">mediump_uint8_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_uint8_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1ca98c67f7d1e975f7c5202f1da1df1f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e\">mediump_uint16_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_uint16_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1dc8bc6199d785f235576948d80a597c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaf4dae276fd29623950de14a6ca2586b5\">mediump_uint32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_uint32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad14a0f2ec93519682b73d70b8e401d81\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9\">mediump_uint64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_uint64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gada8b996eb6526dc1ead813bd49539d1b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad1213a22bbb9e4107f07eaa4956f8281\">mediump_u8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_u8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga28948f6bfb52b42deb9d73ae1ea8d8b0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga9df98857be695d5a30cb30f5bfa38a80\">mediump_u16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_u16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad6a7c0b5630f89d3f1c5b4ef2919bb4c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga1bd0e914158bf03135f8a317de6debe9\">mediump_u32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_u32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa0fc531cbaa972ac3a0b86d21ef4a7fa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2af9490085ae3bdf36a544e9dd073610\">mediump_u64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mediump_u64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Medium qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0ee829f7b754b262bbfe6317c0d678ac\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga97432f9979e73e66567361fd01e4cffb\">highp_uint8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_uint8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga447848a817a626cae08cedc9778b331c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga746dc6da204f5622e395f492997dbf57\">highp_uint16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_uint16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6027ae13b2734f542a6e7beee11b8820\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3\">highp_uint32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_uint32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2aca46c8608c95ef991ee4c332acde5f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce\">highp_uint64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_uint64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaff50b10dd1c48be324fdaffd18e2c7ea\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5\">highp_uint8_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_uint8_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9fc4421dbb833d5461e6d4e59dcfde55\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7\">highp_uint16_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_uint16_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga329f1e2b94b33ba5e3918197030bcf03\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gae978599c9711ac263ba732d4ac225b0e\">highp_uint32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_uint32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga71e646f7e301aa422328194162c9c998\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08\">highp_uint64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_uint64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8942e09f479489441a7a5004c6d8cb66\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c\">highp_u8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_u8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaab32497d6e4db16ee439dbedd64c5865\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8e62c883d13f47015f3b70ed88751369\">highp_u16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_u16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaaadbb34952eca8e3d7fe122c3e167742\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf\">highp_u32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_u32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga92024d27c74a3650afb55ec8e024ed25\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga0c181fdf06a309691999926b6690c969\">highp_u64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_highp_u64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>High qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabde1d0b4072df35453db76075ab896a6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga36475e31b1992cfde54c1a6f5a148865\">uint8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_uint8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga06c296c9e398b294c8c9dd2a7693dcbb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga13471cbbe74e4303a57f3743d007b74d\">uint16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_uint16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacf1744488c96ebd33c9f36ad33b2010a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d\">uint32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_uint32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3328061a64c20ba59d5f9da24c2cd059\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab630f76c26b50298187f7889104d4b9c\">uint64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_uint64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf6ced36f13bae57f377bafa6f5fcc299\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga28d97808322d3c92186e4a0c067d7e8e\">uint8_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_uint8_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafbc7fb7847bfc78a339d1d371c915c73\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga91f91f411080c37730856ff5887f5bcf\">uint16_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_uint16_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa86bc56a73fd8120b1121b5f5e6245ae\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac\">uint32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_uint32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga68c0b9e669060d0eb5ab8c3ddeb483d8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee\">uint64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_uint64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4f3bab577daf3343e99cc005134bce86\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaecc7082561fc9028b844b6cf3d305d36\">u8</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u8&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga13a2391339d0790d43b76d00a7611c4f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa2d7acc0adb536fab71fe261232a40ff\">u16</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u16&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga197570e03acbc3d18ab698e342971e8f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8165913e068444f7842302d40ba897b9\">u32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0f033b21e145a1faa32c62ede5878993\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaf3f312156984c365e9f65620354da70b\">u64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga509af83527f5cd512e9a7873590663aa\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\">uvec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548\">aligned_uvec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga94e86186978c502c6dc0c0d9c4a30679\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga074137e3be58528d67041c223d49f398\">aligned_uvec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5cec574686a7f3c8ed24bb195c5e2d0a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gae85537b672ffe0b3218cbdf1823e1c72\">uvec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0\">aligned_uvec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga47edfdcee9c89b1ebdaf20450323b1d4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e\">uvec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#gabf842c45eea186170c267a328e3f3b7d\">aligned_uvec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5611d6718e3a00096918a64192e73a45\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga29b349e037f0b24320b4548a143daee2\">u8vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u8vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">1&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga19837e6f72b60d994a805ef564c6c326\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611\">u8vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u8vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9740cf8e34f068049b42a2753f9601c2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2\">u8vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u8vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8b8588bb221448f5541a858903822a57\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga20779a61de2fd526a17f12fe53ec46b1\">u8vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u8vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 8 bit unsigned integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga991abe990c16de26b2129d6bc2f4c051\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5\">u16vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u16vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">2&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac01bb9fc32a1cd76c2b80d030f71df4c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2a78447eb9d66a114b193f4a25899c16\">u16vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u16vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga09540dbca093793a36a8997e0d4bee77\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga1c522ca821c27b862fe51cf4024b064b\">u16vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u16vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaecafb5996f5a44f57e34d29c8670741e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga529496d75775fb656a07993ea9af2450\">u16vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u16vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 16 bit unsigned integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac6b161a04d2f8408fe1c9d857e8daac0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gae627372cfd5f20dd87db490387b71195\">u32vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u32vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1fa0dfc8feb0fa17dab2acd43e05342b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2a266e46ee218d0c680f12b35c500cc0\">u32vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u32vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0019500abbfa9c66eff61ca75eaaed94\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gae267358ff2a41d156d97f5762630235a\">u32vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u32vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga14fd29d01dae7b08a04e9facbcc18824\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga31cef34e4cd04840c54741ff2f7005f0\">u32vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u32vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 32 bit unsigned integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab253845f534a67136f9619843cade903\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd\">u64vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u64vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer aligned scalar type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga929427a7627940cdf3304f9c050b677d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5\">u64vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u64vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer aligned vector of 2 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae373b6c04fdf9879f33d63e6949c037e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga489b89ba93d4f7b3934df78debc52276\">u64vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u64vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer aligned vector of 3 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga53a8a03dca2015baec4584f45b8e9cdc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3945dd6515d4498cb603e65ff867ab03\">u64vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_u64vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Default qualifier 64 bit unsigned integer aligned vector of 4 components type. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab3301bae94ef5bf59fbdd9a24e7d2a01\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_float32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit single-qualifier floating-point aligned scalar. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga75930684ff2233171c573e603f216162\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_float64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit double-qualifier floating-point aligned scalar. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gada9b0bea273d3ae0286f891533b9568f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga41d579d81c3d98edd0532244fa02da77\">float32_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_float32_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit single-qualifier floating-point aligned scalar. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e3a2d83b131336219a0f4c7cbba2a48\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga6957c7b22f405683bb276554ca40dc37\">float64_t</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_float64_t&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit double-qualifier floating-point aligned scalar. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadbce23b9f23d77bb3884e289a574ebd5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1\">float32</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>32 bit single-qualifier floating-point aligned scalar. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa4deaa0dea930c393d55e7a4352b0a20\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab5596d48586414c91ccb270962dc14d3\">float64</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>64 bit double-qualifier floating-point aligned scalar. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga81bc497b2bfc6f80bab690c6ee28f0f9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga05e6d4c908965d04191c2070a8d0a65e\">aligned_vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 1 component. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gada3e8f783e9d4b90006695a16c39d4d4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga0682462f8096a226773e20fac993cde5\">aligned_vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 2 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab8d081fac3a38d6f55fa552f32168d32\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gaa8ea2429bb3cb41a715258a447f39897\">vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0\">aligned_vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 3 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga12fe7b9769c964c5b48dcfd8b7f40198\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga85d89e83cb8137e1be1446de8c3b643a\">aligned_vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 4 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaefab04611c7f8fe1fd9be3071efea6cc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f\">fvec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fvec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 1 component. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2543c05ba19b3bd19d45b1227390c5b4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga24273aa02abaecaab7f160bac437a339\">fvec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fvec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 2 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga009afd727fd657ef33a18754d6d28f60\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga89930533646b30d021759298aa6bf04a\">fvec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fvec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 3 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2f26177e74bfb301a3d0e02ec3c3ef53\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga713c796c54875cf4092d42ff9d9096b0\">fvec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fvec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 4 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga309f495a1d6b75ddf195b674b65cb1e4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga701f32ab5b3fb06996b41f5c0d643805\">f32vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">4&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 1 component. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5e185865a2217d0cd47187644683a8c3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8\">f32vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 2 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gade4458b27b039b9ca34f8ec049f3115a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79\">f32vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 3 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8\">f32vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned vector of 4 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3e0f35fa0c626285a8bad41707e7316c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\">dvec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga4974f46ae5a19415d91316960a53617a\">aligned_dvec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned vector of 1 component. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga78bfec2f185d1d365ea0a9ef1e3d45b8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga15ade901680b29b78c1f9d1796db6e0e\">dvec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0\">aligned_dvec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned vector of 2 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga01fe6fee6db5df580b6724a7e681f069\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4\">dvec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0\">aligned_dvec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned vector of 3 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga687d5b8f551d5af32425c0b2fba15e99\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga9503f809789bda7e8852a6abde3ae5c1\">dvec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5\">aligned_dvec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned vector of 4 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8e842371d46842ff8f1813419ba49d0f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gade502df1ce14f837fae7f60a03ddb9b0\">f64vec1</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64vec1&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">8&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned vector of 1 component. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga32814aa0f19316b43134fc25f2aad2b9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gadc4e1594f9555d919131ee02b17822a2\">f64vec2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64vec2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned vector of 2 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf3d3bbc1e93909b689123b085e177a14\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa7a1ddca75c5f629173bf4772db7a635\">f64vec3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64vec3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned vector of 3 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga804c654cead1139bd250f90f9bb01fad\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga66e92e57260bdb910609b9a56bf83e97\">f64vec4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64vec4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned vector of 4 components. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafed7d010235a3aa7ea2f88646858f2ae\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450\">mat2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mat2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 1x1 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> Single-qualifier floating-point aligned 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga17f911ee7b78ca6d1b91c4ab51ddb73c\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga6dd3ec98a548755676267e59142911f8\">mat3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mat3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga31940e6012b72110e26fdb0f54805033\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gade0eb47c01f79384a6f38017ede17446\">mat4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mat4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga01de96cd0b541c52d2b4a3faf65822e9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5\">mat2x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mat2x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 1x1 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> Single-qualifier floating-point aligned 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac88a191b004bd341e64fc53b5a4d00e3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga378921b6a07bcdad946858b340f69ab1\">mat3x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mat3x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabe8c745fa2ced44a600a6e3f19991161\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81\">mat4x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_mat4x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga719da577361541a4c43a2dd1d0e361e1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 1x1 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> Single-qualifier floating-point aligned 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e7ee4f541e1d7db66cd1a224caacafb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae5d672d359f2a39f63f98c7975057486\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6fa2df037dbfc5fe8c8e0b4db8a34953\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3350c93c3275298f940a42875388e4b4\">fmat2x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat2x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 1x1 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> Single-qualifier floating-point aligned 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0743b4f4f69a3227b82ff58f6abbad62\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga55a2d2a8eb09b5633668257eb3cad453\">fmat2x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat2x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1a76b325fdf70f961d835edd182c63dd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga681381f19f11c9e5ee45cda2c56937ff\">fmat2x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat2x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4b4e181cd041ba28c3163e7b8074aef0\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f\">fmat3x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat3x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga27b13f465abc8a40705698145e222c3f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaa07c86650253672a19dbfb898f3265b8\">fmat3x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat3x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2608d19cc275830a6f8c0b6405625a4f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga44e158af77a670ee1b58c03cda9e1619\">fmat3x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat3x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga93f09768241358a287c4cca538f1f7e7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774\">fmat4x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat4x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7c117e3ecca089e10247b1d41d88aff9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga4295048a78bdf46b8a7de77ec665b497\">fmat4x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat4x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga07c75cd04ba42dc37fa3e105f89455c5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3\">fmat4x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fmat4x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga65ff0d690a34a4d7f46f9b2eb51525ee\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 1x1 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> Single-qualifier floating-point aligned 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadd8ddbe2bf65ccede865ba2f510176dc\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf18dbff14bf13d3ff540c517659ec045\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga66339f6139bf7ff19e245beb33f61cc8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga04100c76f7d55a0dd0983ccf05142bff\">f32mat2x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat2x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 1x1 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> Single-qualifier floating-point aligned 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1558a48b3934011b52612809f443e46d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab256cdab5eb582e426d749ae77b5b566\">f32mat2x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat2x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa52e5732daa62851627021ad551c7680\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8\">f32mat2x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat2x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac09663c42566bcb58d23c6781ac4e85a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga1320a08e14fdff3821241eefab6947e9\">f32mat3x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat3x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3f510999e59e1b309113e1d561162b29\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga65261fa8a21045c8646ddff114a56174\">f32mat3x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat3x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2c9c94f0c89cd71ce56551db6cf4aaec\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d\">f32mat3x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat3x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga99ce8274c750fbfdf0e70c95946a2875\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20\">f32mat4x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat4x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9476ef66790239df53dbe66f3989c3b5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga239b96198771b7add8eea7e6b59840c0\">f32mat4x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat4x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacc429b3b0b49921e12713b6d31e14e1d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3\">f32mat4x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32mat4x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga88f6c6fa06e6e64479763e69444669cf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 1x1 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> Double-qualifier floating-point aligned 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaae8e4639c991e64754145ab8e4c32083\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e9094f3feb3b5b49d0f83683a101fde\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadbd2c639c03de1c3e9591b5a39f65559\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37\">f64mat2x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat2x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 1x1 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> Double-qualifier floating-point aligned 2x2 matrix. </dd>\n<dd>\n<a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab059d7b9fe2094acc563b7223987499f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a\">f64mat2x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat2x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 2x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabbc811d1c52ed2b8cfcaff1378f75c69\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gac87278e0c702ba8afff76316d4eeb769\">f64mat2x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat2x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 2x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9ddf5212777734d2fd841a84439f3bdf\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7\">f64mat3x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat3x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 3x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad1dda32ed09f94bfcf0a7d8edfb6cf13\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185\">f64mat3x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat3x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 3x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5875e0fa72f07e271e7931811cbbf31a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675\">f64mat3x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat3x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 3x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga41e82cd6ac07f912ba2a2d45799dcf0d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512\">f64mat4x2</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat4x2&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 4x2 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0892638d6ba773043b3d63d1d092622e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110\">f64mat4x3</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat4x3&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 4x3 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga912a16432608b822f1e13607529934c1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e\">f64mat4x4</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64mat4x4&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned 4x4 matrix. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gafd945a8ea86b042aba410e0560df9a3d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\">quat&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_quat&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad8c4bfacff70e57dc8303634c8bfce35\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\">fquat&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_fquat&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaabc28c84a3288b697605d4688686f9a9\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\">dquat&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_dquat&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1ed8aeb5ca67fade269a46105f1bf273\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0\">f32quat</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f32quat&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">16&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Single-qualifier floating-point aligned quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga95cc03b8b475993fa50e05e38e203303\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">glm::GLM_ALIGNED_TYPEDEF </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00165.html#ga14c583bd625eda8cf4935a14d5dd544d\">f64quat</a>&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">aligned_f64quat&#160;</td>\n          <td class=\"paramname\">, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">32&#160;</td>\n          <td class=\"paramname\">&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Double-qualifier floating-point aligned quaternion. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00223.html\" title=\"Include <glm/gtx/type_aligned.hpp> to use the features of this extension. \">GLM_GTX_type_aligned</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00224.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_type_trait</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_type_trait<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00119.html\" title=\"GLM_GTX_type_trait \">glm/gtx/type_trait.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00119.html\" title=\"GLM_GTX_type_trait \">glm/gtx/type_trait.hpp</a>&gt; to use the features of this extension. </p>\n<p>Defines traits for each type. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00225.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_vec_swizzle</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_vec_swizzle<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00130.html\" title=\"GLM_GTX_vec_swizzle \">glm/gtx/vec_swizzle.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<p>Include &lt;<a class=\"el\" href=\"a00130.html\" title=\"GLM_GTX_vec_swizzle \">glm/gtx/vec_swizzle.hpp</a>&gt; to use the features of this extension. </p>\n<p>Functions to perform swizzle operation. </p>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00226.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_vector_angle</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_vector_angle<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00131.html\" title=\"GLM_GTX_vector_angle \">glm/gtx/vector_angle.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga2e2917b4cb75ca3d043ac15ff88f14e1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2e2917b4cb75ca3d043ac15ff88f14e1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00226.html#ga2e2917b4cb75ca3d043ac15ff88f14e1\">angle</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga2e2917b4cb75ca3d043ac15ff88f14e1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the absolute angle between two vectors.  <a href=\"a00226.html#ga2e2917b4cb75ca3d043ac15ff88f14e1\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e2917b4cb75ca3d043ac15ff88f14e1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga9556a803dce87fe0f42fdabe4ebba1d5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga9556a803dce87fe0f42fdabe4ebba1d5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00226.html#ga9556a803dce87fe0f42fdabe4ebba1d5\">orientedAngle</a> (vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga9556a803dce87fe0f42fdabe4ebba1d5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the oriented angle between two 2d vectors.  <a href=\"a00226.html#ga9556a803dce87fe0f42fdabe4ebba1d5\">More...</a><br /></td></tr>\n<tr class=\"separator:ga9556a803dce87fe0f42fdabe4ebba1d5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga706fce3d111f485839756a64f5a48553\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga706fce3d111f485839756a64f5a48553\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00226.html#ga706fce3d111f485839756a64f5a48553\">orientedAngle</a> (vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, vec&lt; 3, T, Q &gt; const &amp;ref)</td></tr>\n<tr class=\"memdesc:ga706fce3d111f485839756a64f5a48553\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the oriented angle between two 3d vectors based from a reference axis.  <a href=\"a00226.html#ga706fce3d111f485839756a64f5a48553\">More...</a><br /></td></tr>\n<tr class=\"separator:ga706fce3d111f485839756a64f5a48553\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00131.html\" title=\"GLM_GTX_vector_angle \">glm/gtx/vector_angle.hpp</a>&gt; to use the features of this extension. </p>\n<p>Compute angle between vectors </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga2e2917b4cb75ca3d043ac15ff88f14e1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::angle </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the absolute angle between two vectors. </p>\n<p>Parameters need to be normalized. </p><dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00226.html\" title=\"Include <glm/gtx/vector_angle.hpp> to use the features of this extension. \">GLM_GTX_vector_angle</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga9556a803dce87fe0f42fdabe4ebba1d5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::orientedAngle </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 2, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the oriented angle between two 2d vectors. </p>\n<p>Parameters need to be normalized. </p><dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00226.html\" title=\"Include <glm/gtx/vector_angle.hpp> to use the features of this extension. \">GLM_GTX_vector_angle</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga706fce3d111f485839756a64f5a48553\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::orientedAngle </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; 3, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>ref</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the oriented angle between two 3d vectors based from a reference axis. </p>\n<p>Parameters need to be normalized. </p><dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00226.html\" title=\"Include <glm/gtx/vector_angle.hpp> to use the features of this extension. \">GLM_GTX_vector_angle</a> extension. </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00227.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_vector_query</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_vector_query<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00132.html\" title=\"GLM_GTX_vector_query \">glm/gtx/vector_query.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga13da4a787a2ff70e95d561fb19ff91b4\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga13da4a787a2ff70e95d561fb19ff91b4\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#ga13da4a787a2ff70e95d561fb19ff91b4\">areCollinear</a> (vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga13da4a787a2ff70e95d561fb19ff91b4\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether two vectors are collinears.  <a href=\"a00227.html#ga13da4a787a2ff70e95d561fb19ff91b4\">More...</a><br /></td></tr>\n<tr class=\"separator:ga13da4a787a2ff70e95d561fb19ff91b4\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7b95b3f798e3c293262b2bdaad47c57\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac7b95b3f798e3c293262b2bdaad47c57\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gac7b95b3f798e3c293262b2bdaad47c57\">areOrthogonal</a> (vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gac7b95b3f798e3c293262b2bdaad47c57\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether two vectors are orthogonals.  <a href=\"a00227.html#gac7b95b3f798e3c293262b2bdaad47c57\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7b95b3f798e3c293262b2bdaad47c57\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1b091c3d7f9ee3b0708311c001c293e3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga1b091c3d7f9ee3b0708311c001c293e3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#ga1b091c3d7f9ee3b0708311c001c293e3\">areOrthonormal</a> (vec&lt; L, T, Q &gt; const &amp;v0, vec&lt; L, T, Q &gt; const &amp;v1, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:ga1b091c3d7f9ee3b0708311c001c293e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether two vectors are orthonormal.  <a href=\"a00227.html#ga1b091c3d7f9ee3b0708311c001c293e3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1b091c3d7f9ee3b0708311c001c293e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf6ec1688eab7442fe96fe4941d5d4e76\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf6ec1688eab7442fe96fe4941d5d4e76\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gaf6ec1688eab7442fe96fe4941d5d4e76\">isCompNull</a> (vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gaf6ec1688eab7442fe96fe4941d5d4e76\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether a each component of a vector is null.  <a href=\"a00227.html#gaf6ec1688eab7442fe96fe4941d5d4e76\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf6ec1688eab7442fe96fe4941d5d4e76\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac3c974f459fd75453134fad7ae89a39e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac3c974f459fd75453134fad7ae89a39e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gac3c974f459fd75453134fad7ae89a39e\">isNormalized</a> (vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gac3c974f459fd75453134fad7ae89a39e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether a vector is normalized.  <a href=\"a00227.html#gac3c974f459fd75453134fad7ae89a39e\">More...</a><br /></td></tr>\n<tr class=\"separator:gac3c974f459fd75453134fad7ae89a39e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gab4a3637dbcb4bb42dc55caea7a1e0495\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab4a3637dbcb4bb42dc55caea7a1e0495\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00227.html#gab4a3637dbcb4bb42dc55caea7a1e0495\">isNull</a> (vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)</td></tr>\n<tr class=\"memdesc:gab4a3637dbcb4bb42dc55caea7a1e0495\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Check whether a vector is null.  <a href=\"a00227.html#gab4a3637dbcb4bb42dc55caea7a1e0495\">More...</a><br /></td></tr>\n<tr class=\"separator:gab4a3637dbcb4bb42dc55caea7a1e0495\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00132.html\" title=\"GLM_GTX_vector_query \">glm/gtx/vector_query.hpp</a>&gt; to use the features of this extension. </p>\n<p>Query informations of vector types </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga13da4a787a2ff70e95d561fb19ff91b4\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::areCollinear </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Check whether two vectors are collinears. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00227.html\" title=\"Include <glm/gtx/vector_query.hpp> to use the features of this extension. \">GLM_GTX_vector_query</a> extensions. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac7b95b3f798e3c293262b2bdaad47c57\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::areOrthogonal </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Check whether two vectors are orthogonals. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00227.html\" title=\"Include <glm/gtx/vector_query.hpp> to use the features of this extension. \">GLM_GTX_vector_query</a> extensions. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1b091c3d7f9ee3b0708311c001c293e3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::areOrthonormal </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v0</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v1</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Check whether two vectors are orthonormal. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00227.html\" title=\"Include <glm/gtx/vector_query.hpp> to use the features of this extension. \">GLM_GTX_vector_query</a> extensions. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf6ec1688eab7442fe96fe4941d5d4e76\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::isCompNull </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Check whether a each component of a vector is null. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00227.html\" title=\"Include <glm/gtx/vector_query.hpp> to use the features of this extension. \">GLM_GTX_vector_query</a> extensions. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac3c974f459fd75453134fad7ae89a39e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isNormalized </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Check whether a vector is normalized. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00227.html\" title=\"Include <glm/gtx/vector_query.hpp> to use the features of this extension. \">GLM_GTX_vector_query</a> extensions. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gab4a3637dbcb4bb42dc55caea7a1e0495\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::isNull </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">T const &amp;&#160;</td>\n          <td class=\"paramname\"><em>epsilon</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Check whether a vector is null. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00227.html\" title=\"Include <glm/gtx/vector_query.hpp> to use the features of this extension. \">GLM_GTX_vector_query</a> extensions. </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00228.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: GLM_GTX_wrap</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">GLM_GTX_wrap<div class=\"ingroups\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00134.html\" title=\"GLM_GTX_wrap \">glm/gtx/wrap.hpp</a>&gt; to use the features of this extension.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html#ga6c0cc6bd1d67ea1008d2592e998bad33\">clamp</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_CLAMP OpenGL wrap mode.  <a href=\"a00228.html#ga6c0cc6bd1d67ea1008d2592e998bad33\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6c0cc6bd1d67ea1008d2592e998bad33\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html#gaa6856a0a048d2749252848da35e10c8b\">mirrorClamp</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_MIRRORED_REPEAT OpenGL wrap mode.  <a href=\"a00228.html#gaa6856a0a048d2749252848da35e10c8b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa6856a0a048d2749252848da35e10c8b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html#ga16a89b0661b60d5bea85137bbae74d73\">mirrorRepeat</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_MIRROR_REPEAT OpenGL wrap mode.  <a href=\"a00228.html#ga16a89b0661b60d5bea85137bbae74d73\">More...</a><br /></td></tr>\n<tr class=\"separator:ga16a89b0661b60d5bea85137bbae74d73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL genType&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00228.html#ga809650c6310ea7c42666e918c117fb6f\">repeat</a> (genType const &amp;Texcoord)</td></tr>\n<tr class=\"memdesc:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Simulate GL_REPEAT OpenGL wrap mode.  <a href=\"a00228.html#ga809650c6310ea7c42666e918c117fb6f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga809650c6310ea7c42666e918c117fb6f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00134.html\" title=\"GLM_GTX_wrap \">glm/gtx/wrap.hpp</a>&gt; to use the features of this extension. </p>\n<p>Wrapping mode of texture coordinates. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga6c0cc6bd1d67ea1008d2592e998bad33\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::clamp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Texcoord</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Simulate GL_CLAMP OpenGL wrap mode. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00228.html\" title=\"Include <glm/gtx/wrap.hpp> to use the features of this extension. \">GLM_GTX_wrap</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa6856a0a048d2749252848da35e10c8b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::mirrorClamp </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Texcoord</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Simulate GL_MIRRORED_REPEAT OpenGL wrap mode. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00228.html\" title=\"Include <glm/gtx/wrap.hpp> to use the features of this extension. \">GLM_GTX_wrap</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga16a89b0661b60d5bea85137bbae74d73\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::mirrorRepeat </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Texcoord</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Simulate GL_MIRROR_REPEAT OpenGL wrap mode. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00228.html\" title=\"Include <glm/gtx/wrap.hpp> to use the features of this extension. \">GLM_GTX_wrap</a> extension. </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga809650c6310ea7c42666e918c117fb6f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL genType glm::repeat </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Texcoord</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Simulate GL_REPEAT OpenGL wrap mode. </p>\n<dl class=\"section see\"><dt>See also</dt><dd><a class=\"el\" href=\"a00228.html\" title=\"Include <glm/gtx/wrap.hpp> to use the features of this extension. \">GLM_GTX_wrap</a> extension. </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00229.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Integer functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Integer functions<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00041.html\" title=\"Core features \">glm/integer.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:ga44abfe3379e11cbd29425a843420d0d6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genType &gt; </td></tr>\n<tr class=\"memitem:ga44abfe3379e11cbd29425a843420d0d6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga44abfe3379e11cbd29425a843420d0d6\">bitCount</a> (genType v)</td></tr>\n<tr class=\"memdesc:ga44abfe3379e11cbd29425a843420d0d6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the number of bits set to 1 in the binary representation of value.  <a href=\"a00229.html#ga44abfe3379e11cbd29425a843420d0d6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga44abfe3379e11cbd29425a843420d0d6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5\">bitCount</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the number of bits set to 1 in the binary representation of value.  <a href=\"a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5\">More...</a><br /></td></tr>\n<tr class=\"separator:gaac7b15e40bdea8d9aa4c4cb34049f7b5\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga346b25ab11e793e91a4a69c8aa6819f2\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga346b25ab11e793e91a4a69c8aa6819f2\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga346b25ab11e793e91a4a69c8aa6819f2\">bitfieldExtract</a> (vec&lt; L, T, Q &gt; const &amp;Value, int Offset, int Bits)</td></tr>\n<tr class=\"memdesc:ga346b25ab11e793e91a4a69c8aa6819f2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Extracts bits [offset, offset + bits - 1] from value, returning them in the least significant bits of the result.  <a href=\"a00229.html#ga346b25ab11e793e91a4a69c8aa6819f2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga346b25ab11e793e91a4a69c8aa6819f2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2e82992340d421fadb61a473df699b20\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga2e82992340d421fadb61a473df699b20\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga2e82992340d421fadb61a473df699b20\">bitfieldInsert</a> (vec&lt; L, T, Q &gt; const &amp;Base, vec&lt; L, T, Q &gt; const &amp;Insert, int Offset, int Bits)</td></tr>\n<tr class=\"memdesc:ga2e82992340d421fadb61a473df699b20\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the insertion the bits least-significant bits of insert into base.  <a href=\"a00229.html#ga2e82992340d421fadb61a473df699b20\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2e82992340d421fadb61a473df699b20\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga750a1d92464489b7711dee67aa3441b6\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga750a1d92464489b7711dee67aa3441b6\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga750a1d92464489b7711dee67aa3441b6\">bitfieldReverse</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga750a1d92464489b7711dee67aa3441b6\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the reversal of the bits of value.  <a href=\"a00229.html#ga750a1d92464489b7711dee67aa3441b6\">More...</a><br /></td></tr>\n<tr class=\"separator:ga750a1d92464489b7711dee67aa3441b6\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf74c4d969fa34ab8acb9d390f5ca5274\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:gaf74c4d969fa34ab8acb9d390f5ca5274\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gaf74c4d969fa34ab8acb9d390f5ca5274\">findLSB</a> (genIUType x)</td></tr>\n<tr class=\"memdesc:gaf74c4d969fa34ab8acb9d390f5ca5274\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the bit number of the least significant bit set to 1 in the binary representation of value.  <a href=\"a00229.html#gaf74c4d969fa34ab8acb9d390f5ca5274\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf74c4d969fa34ab8acb9d390f5ca5274\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4454c0331d6369888c28ab677f4810c7\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4454c0331d6369888c28ab677f4810c7\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga4454c0331d6369888c28ab677f4810c7\">findLSB</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga4454c0331d6369888c28ab677f4810c7\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the bit number of the least significant bit set to 1 in the binary representation of value.  <a href=\"a00229.html#ga4454c0331d6369888c28ab677f4810c7\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4454c0331d6369888c28ab677f4810c7\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7e4a794d766861c70bc961630f8ef621\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;typename genIUType &gt; </td></tr>\n<tr class=\"memitem:ga7e4a794d766861c70bc961630f8ef621\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL int&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga7e4a794d766861c70bc961630f8ef621\">findMSB</a> (genIUType x)</td></tr>\n<tr class=\"memdesc:ga7e4a794d766861c70bc961630f8ef621\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the bit number of the most significant bit in the binary representation of value.  <a href=\"a00229.html#ga7e4a794d766861c70bc961630f8ef621\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7e4a794d766861c70bc961630f8ef621\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga39ac4d52028bb6ab08db5ad6562c2872\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga39ac4d52028bb6ab08db5ad6562c2872\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, int, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872\">findMSB</a> (vec&lt; L, T, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga39ac4d52028bb6ab08db5ad6562c2872\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the bit number of the most significant bit in the binary representation of value.  <a href=\"a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872\">More...</a><br /></td></tr>\n<tr class=\"separator:ga39ac4d52028bb6ab08db5ad6562c2872\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac0c510a70e852f57594a9141848642e3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac0c510a70e852f57594a9141848642e3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gac0c510a70e852f57594a9141848642e3\">imulExtended</a> (vec&lt; L, int, Q &gt; const &amp;x, vec&lt; L, int, Q &gt; const &amp;y, vec&lt; L, int, Q &gt; &amp;msb, vec&lt; L, int, Q &gt; &amp;lsb)</td></tr>\n<tr class=\"memdesc:gac0c510a70e852f57594a9141848642e3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Multiplies 32-bit integers x and y, producing a 64-bit result.  <a href=\"a00229.html#gac0c510a70e852f57594a9141848642e3\">More...</a><br /></td></tr>\n<tr class=\"separator:gac0c510a70e852f57594a9141848642e3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaedcec48743632dff6786bcc492074b1b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaedcec48743632dff6786bcc492074b1b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gaedcec48743632dff6786bcc492074b1b\">uaddCarry</a> (vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;carry)</td></tr>\n<tr class=\"memdesc:gaedcec48743632dff6786bcc492074b1b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Adds 32-bit unsigned integer x and y, returning the sum modulo pow(2, 32).  <a href=\"a00229.html#gaedcec48743632dff6786bcc492074b1b\">More...</a><br /></td></tr>\n<tr class=\"separator:gaedcec48743632dff6786bcc492074b1b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga732e2fb56db57ea541c7e5c92b7121be\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga732e2fb56db57ea541c7e5c92b7121be\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL void&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#ga732e2fb56db57ea541c7e5c92b7121be\">umulExtended</a> (vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;msb, vec&lt; L, uint, Q &gt; &amp;lsb)</td></tr>\n<tr class=\"memdesc:ga732e2fb56db57ea541c7e5c92b7121be\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Multiplies 32-bit integers x and y, producing a 64-bit result.  <a href=\"a00229.html#ga732e2fb56db57ea541c7e5c92b7121be\">More...</a><br /></td></tr>\n<tr class=\"separator:ga732e2fb56db57ea541c7e5c92b7121be\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae3316ba1229ad9b9f09480833321b053\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae3316ba1229ad9b9f09480833321b053\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, uint, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00229.html#gae3316ba1229ad9b9f09480833321b053\">usubBorrow</a> (vec&lt; L, uint, Q &gt; const &amp;x, vec&lt; L, uint, Q &gt; const &amp;y, vec&lt; L, uint, Q &gt; &amp;borrow)</td></tr>\n<tr class=\"memdesc:gae3316ba1229ad9b9f09480833321b053\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Subtracts the 32-bit unsigned integer y from x, returning the difference if non-negative, or pow(2, 32) plus the difference otherwise.  <a href=\"a00229.html#gae3316ba1229ad9b9f09480833321b053\">More...</a><br /></td></tr>\n<tr class=\"separator:gae3316ba1229ad9b9f09480833321b053\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00041.html\" title=\"Core features \">glm/integer.hpp</a>&gt; to use these core features. </p>\n<p>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. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"ga44abfe3379e11cbd29425a843420d0d6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::bitCount </td>\n          <td>(</td>\n          <td class=\"paramtype\">genType&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the number of bits set to 1 in the binary representation of value. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genType</td><td>Signed or unsigned integer scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml\">GLSL bitCount man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaac7b15e40bdea8d9aa4c4cb34049f7b5\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, int, Q&gt; glm::bitCount </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the number of bits set to 1 in the binary representation of value. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed or unsigned integer scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml\">GLSL bitCount man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga346b25ab11e793e91a4a69c8aa6819f2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::bitfieldExtract </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Value</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>Offset</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>Bits</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Extracts bits [offset, offset + bits - 1] from value, returning them in the least significant bits of the result. </p>\n<p>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.</p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed or unsigned integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldExtract.xml\">GLSL bitfieldExtract man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2e82992340d421fadb61a473df699b20\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::bitfieldInsert </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Base</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>Insert</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>Offset</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">int&#160;</td>\n          <td class=\"paramname\"><em>Bits</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the insertion the bits least-significant bits of insert into base. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed or unsigned integer scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldInsert.xml\">GLSL bitfieldInsert man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga750a1d92464489b7711dee67aa3441b6\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::bitfieldReverse </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the reversal of the bits of value. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed or unsigned integer scalar or vector types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldReverse.xml\">GLSL bitfieldReverse man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf74c4d969fa34ab8acb9d390f5ca5274\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::findLSB </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the bit number of the least significant bit set to 1 in the binary representation of value. </p>\n<p>If value is zero, -1 will be returned.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genIUType</td><td>Signed or unsigned integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml\">GLSL findLSB man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4454c0331d6369888c28ab677f4810c7\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, int, Q&gt; glm::findLSB </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the bit number of the least significant bit set to 1 in the binary representation of value. </p>\n<p>If value is zero, -1 will be returned.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed or unsigned integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml\">GLSL findLSB man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7e4a794d766861c70bc961630f8ef621\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL int glm::findMSB </td>\n          <td>(</td>\n          <td class=\"paramtype\">genIUType&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the bit number of the most significant bit in the binary representation of value. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">genIUType</td><td>Signed or unsigned integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml\">GLSL findMSB man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga39ac4d52028bb6ab08db5ad6562c2872\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, int, Q&gt; glm::findMSB </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the bit number of the most significant bit in the binary representation of value. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Signed or unsigned integer scalar types.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml\">GLSL findMSB man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac0c510a70e852f57594a9141848642e3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL void glm::imulExtended </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, int, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, int, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, int, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>msb</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, int, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>lsb</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Multiplies 32-bit integers x and y, producing a 64-bit result. </p>\n<p>The 32 least-significant bits are returned in lsb. The 32 most-significant bits are returned in msb.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/imulExtended.xml\">GLSL imulExtended man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaedcec48743632dff6786bcc492074b1b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, uint, Q&gt; glm::uaddCarry </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>carry</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Adds 32-bit unsigned integer x and y, returning the sum modulo pow(2, 32). </p>\n<p>The value carry is set to 0 if the sum was less than pow(2, 32), or to 1 otherwise.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uaddCarry.xml\">GLSL uaddCarry man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga732e2fb56db57ea541c7e5c92b7121be\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL void glm::umulExtended </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>msb</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>lsb</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Multiplies 32-bit integers x and y, producing a 64-bit result. </p>\n<p>The 32 least-significant bits are returned in lsb. The 32 most-significant bits are returned in msb.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/umulExtended.xml\">GLSL umulExtended man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae3316ba1229ad9b9f09480833321b053\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, uint, Q&gt; glm::usubBorrow </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, <a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>, Q &gt; &amp;&#160;</td>\n          <td class=\"paramname\"><em>borrow</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Subtracts the 32-bit unsigned integer y from x, returning the difference if non-negative, or pow(2, 32) plus the difference otherwise. </p>\n<p>The value borrow is set to 0 if x &gt;= y, or to 1 otherwise.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/usubBorrow.xml\">GLSL usubBorrow man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00230.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Matrix functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Matrix functions<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00055.html\" title=\"Core features \">glm/matrix.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gad7928795124768e058f99dce270f5c8d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad7928795124768e058f99dce270f5c8d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL T&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gad7928795124768e058f99dce270f5c8d\">determinant</a> (mat&lt; C, R, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gad7928795124768e058f99dce270f5c8d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the determinant of a squared matrix.  <a href=\"a00230.html#gad7928795124768e058f99dce270f5c8d\">More...</a><br /></td></tr>\n<tr class=\"separator:gad7928795124768e058f99dce270f5c8d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">inverse</a> (mat&lt; C, R, T, Q &gt; const &amp;m)</td></tr>\n<tr class=\"memdesc:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Return the inverse of a squared matrix.  <a href=\"a00230.html#gacc53488cd254cbe33d1b505a72ef3719\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc53488cd254cbe33d1b505a72ef3719\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf14569404c779fedca98d0b9b8e58c1f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaf14569404c779fedca98d0b9b8e58c1f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gaf14569404c779fedca98d0b9b8e58c1f\">matrixCompMult</a> (mat&lt; C, R, T, Q &gt; const &amp;x, mat&lt; C, R, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gaf14569404c779fedca98d0b9b8e58c1f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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].  <a href=\"a00230.html#gaf14569404c779fedca98d0b9b8e58c1f\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf14569404c779fedca98d0b9b8e58c1f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac29fb7bae75a8e4c1b74cbbf85520e50\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac29fb7bae75a8e4c1b74cbbf85520e50\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL detail::outerProduct_trait&lt; C, R, T, Q &gt;::type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gac29fb7bae75a8e4c1b74cbbf85520e50\">outerProduct</a> (vec&lt; C, T, Q &gt; const &amp;c, vec&lt; R, T, Q &gt; const &amp;r)</td></tr>\n<tr class=\"memdesc:gac29fb7bae75a8e4c1b74cbbf85520e50\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00230.html#gac29fb7bae75a8e4c1b74cbbf85520e50\">More...</a><br /></td></tr>\n<tr class=\"separator:gac29fb7bae75a8e4c1b74cbbf85520e50\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gae679d841da8ce9dbcc6c2d454f15bc35\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t C, length_t R, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gae679d841da8ce9dbcc6c2d454f15bc35\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt;::transpose_type&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00230.html#gae679d841da8ce9dbcc6c2d454f15bc35\">transpose</a> (mat&lt; C, R, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gae679d841da8ce9dbcc6c2d454f15bc35\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the transposed matrix of x.  <a href=\"a00230.html#gae679d841da8ce9dbcc6c2d454f15bc35\">More...</a><br /></td></tr>\n<tr class=\"separator:gae679d841da8ce9dbcc6c2d454f15bc35\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00055.html\" title=\"Core features \">glm/matrix.hpp</a>&gt; to use these core features. </p>\n<p>For each of the following built-in matrix functions, there is both a single-qualifier floating point version, where all arguments and return values are single qualifier, and a double-qualifier floating version, where all arguments and return values are double qualifier. Only the single-qualifier floating point version is shown. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gad7928795124768e058f99dce270f5c8d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL T glm::determinant </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the determinant of a squared matrix. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">C</td><td>Integer between 1 and 4 included that qualify the number a column </td></tr>\n    <tr><td class=\"paramname\">R</td><td>Integer between 1 and 4 included that qualify the number a row </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or signed integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml\">GLSL determinant man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacc53488cd254cbe33d1b505a72ef3719\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt; C, R, T, Q &gt; inverse </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>m</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Return the inverse of a squared matrix. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">C</td><td>Integer between 1 and 4 included that qualify the number a column </td></tr>\n    <tr><td class=\"paramname\">R</td><td>Integer between 1 and 4 included that qualify the number a row </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or signed integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml\">GLSL inverse man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf14569404c779fedca98d0b9b8e58c1f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;C, R, T, Q&gt; glm::matrixCompMult </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>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]. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">C</td><td>Integer between 1 and 4 included that qualify the number a column </td></tr>\n    <tr><td class=\"paramname\">R</td><td>Integer between 1 and 4 included that qualify the number a row </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or signed integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml\">GLSL matrixCompMult man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac29fb7bae75a8e4c1b74cbbf85520e50\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL detail::outerProduct_trait&lt;C, R, T, Q&gt;::type glm::outerProduct </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; C, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>c</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>r</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>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. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">C</td><td>Integer between 1 and 4 included that qualify the number a column </td></tr>\n    <tr><td class=\"paramname\">R</td><td>Integer between 1 and 4 included that qualify the number a row </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or signed integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/outerProduct.xml\">GLSL outerProduct man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gae679d841da8ce9dbcc6c2d454f15bc35\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL mat&lt;C, R, T, Q&gt;::transpose_type glm::transpose </td>\n          <td>(</td>\n          <td class=\"paramtype\">mat&lt; C, R, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the transposed matrix of x. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">C</td><td>Integer between 1 and 4 included that qualify the number a column </td></tr>\n    <tr><td class=\"paramname\">R</td><td>Integer between 1 and 4 included that qualify the number a row </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point or signed integer scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/transpose.xml\">GLSL transpose man page</a> </dd>\n<dd>\n<a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00231.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Floating-Point Pack and Unpack Functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Floating-Point Pack and Unpack Functions<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00077.html\" title=\"Core features \">glm/packing.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gaa916ca426b2bb0343ba17e3753e245c2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL double&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#gaa916ca426b2bb0343ba17e3753e245c2\">packDouble2x32</a> (uvec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaa916ca426b2bb0343ba17e3753e245c2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a double-qualifier value obtained by packing the components of v into a 64-bit value.  <a href=\"a00231.html#gaa916ca426b2bb0343ba17e3753e245c2\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa916ca426b2bb0343ba17e3753e245c2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga20f134b07db3a3d3a38efb2617388c92\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga20f134b07db3a3d3a38efb2617388c92\">packHalf2x16</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga20f134b07db3a3d3a38efb2617388c92\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#ga20f134b07db3a3d3a38efb2617388c92\">More...</a><br /></td></tr>\n<tr class=\"separator:ga20f134b07db3a3d3a38efb2617388c92\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga977ab172da5494e5ac63e952afacfbe2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga977ab172da5494e5ac63e952afacfbe2\">packSnorm2x16</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga977ab172da5494e5ac63e952afacfbe2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.  <a href=\"a00231.html#ga977ab172da5494e5ac63e952afacfbe2\">More...</a><br /></td></tr>\n<tr class=\"separator:ga977ab172da5494e5ac63e952afacfbe2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga85e8f17627516445026ab7a9c2e3531a\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga85e8f17627516445026ab7a9c2e3531a\">packSnorm4x8</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga85e8f17627516445026ab7a9c2e3531a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.  <a href=\"a00231.html#ga85e8f17627516445026ab7a9c2e3531a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga85e8f17627516445026ab7a9c2e3531a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0e2d107039fe608a209497af867b85fb\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga0e2d107039fe608a209497af867b85fb\">packUnorm2x16</a> (vec2 const &amp;v)</td></tr>\n<tr class=\"memdesc:ga0e2d107039fe608a209497af867b85fb\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.  <a href=\"a00231.html#ga0e2d107039fe608a209497af867b85fb\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0e2d107039fe608a209497af867b85fb\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf7d2f7341a9eeb4a436929d6f9ad08f2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uint&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#gaf7d2f7341a9eeb4a436929d6f9ad08f2\">packUnorm4x8</a> (vec4 const &amp;v)</td></tr>\n<tr class=\"memdesc:gaf7d2f7341a9eeb4a436929d6f9ad08f2\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values.  <a href=\"a00231.html#gaf7d2f7341a9eeb4a436929d6f9ad08f2\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf7d2f7341a9eeb4a436929d6f9ad08f2\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5f4296dc5f12f0aa67ac05b8bb322483\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL uvec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga5f4296dc5f12f0aa67ac05b8bb322483\">unpackDouble2x32</a> (double v)</td></tr>\n<tr class=\"memdesc:ga5f4296dc5f12f0aa67ac05b8bb322483\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns a two-component unsigned integer vector representation of v.  <a href=\"a00231.html#ga5f4296dc5f12f0aa67ac05b8bb322483\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5f4296dc5f12f0aa67ac05b8bb322483\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaf59b52e6b28da9335322c4ae19b5d745\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#gaf59b52e6b28da9335322c4ae19b5d745\">unpackHalf2x16</a> (uint v)</td></tr>\n<tr class=\"memdesc:gaf59b52e6b28da9335322c4ae19b5d745\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#gaf59b52e6b28da9335322c4ae19b5d745\">More...</a><br /></td></tr>\n<tr class=\"separator:gaf59b52e6b28da9335322c4ae19b5d745\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gacd8f8971a3fe28418be0d0fa1f786b38\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#gacd8f8971a3fe28418be0d0fa1f786b38\">unpackSnorm2x16</a> (uint p)</td></tr>\n<tr class=\"memdesc:gacd8f8971a3fe28418be0d0fa1f786b38\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#gacd8f8971a3fe28418be0d0fa1f786b38\">More...</a><br /></td></tr>\n<tr class=\"separator:gacd8f8971a3fe28418be0d0fa1f786b38\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga2db488646d48b7c43d3218954523fe82\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga2db488646d48b7c43d3218954523fe82\">unpackSnorm4x8</a> (uint p)</td></tr>\n<tr class=\"memdesc:ga2db488646d48b7c43d3218954523fe82\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#ga2db488646d48b7c43d3218954523fe82\">More...</a><br /></td></tr>\n<tr class=\"separator:ga2db488646d48b7c43d3218954523fe82\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga1f66188e5d65afeb9ffba1ad971e4007\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec2&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga1f66188e5d65afeb9ffba1ad971e4007\">unpackUnorm2x16</a> (uint p)</td></tr>\n<tr class=\"memdesc:ga1f66188e5d65afeb9ffba1ad971e4007\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#ga1f66188e5d65afeb9ffba1ad971e4007\">More...</a><br /></td></tr>\n<tr class=\"separator:ga1f66188e5d65afeb9ffba1ad971e4007\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga7f903259150b67e9466f5f8edffcd197\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec4&#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00231.html#ga7f903259150b67e9466f5f8edffcd197\">unpackUnorm4x8</a> (uint p)</td></tr>\n<tr class=\"memdesc:ga7f903259150b67e9466f5f8edffcd197\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">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.  <a href=\"a00231.html#ga7f903259150b67e9466f5f8edffcd197\">More...</a><br /></td></tr>\n<tr class=\"separator:ga7f903259150b67e9466f5f8edffcd197\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00077.html\" title=\"Core features \">glm/packing.hpp</a>&gt; to use these core features. </p>\n<p>These functions do not operate component-wise, rather as described in each case. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gaa916ca426b2bb0343ba17e3753e245c2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL double glm::packDouble2x32 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84\">uvec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a double-qualifier value obtained by packing the components of v into a 64-bit value. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packDouble2x32.xml\">GLSL packDouble2x32 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga20f134b07db3a3d3a38efb2617388c92\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::packHalf2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>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. </p>\n<p>The first vector component specifies the 16 least-significant bits of the result; the second component specifies the 16 most-significant bits.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL packHalf2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga977ab172da5494e5ac63e952afacfbe2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::packSnorm2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. </p>\n<p>Then, the results are packed into the returned 32-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packSnorm2x16: round(clamp(v, -1, +1) * 32767.0)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml\">GLSL packSnorm2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga85e8f17627516445026ab7a9c2e3531a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::packSnorm4x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. </p>\n<p>Then, the results are packed into the returned 32-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packSnorm4x8: round(clamp(c, -1, +1) * 127.0)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0e2d107039fe608a209497af867b85fb\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::packUnorm2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da\">vec2</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. </p>\n<p>Then, the results are packed into the returned 32-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packUnorm2x16: round(clamp(c, 0, +1) * 65535.0)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml\">GLSL packUnorm2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf7d2f7341a9eeb4a436929d6f9ad08f2\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uint glm::packUnorm4x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00144.html#gafbab23070ca47932487d25332adc7d7c\">vec4</a> const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. </p>\n<p>Then, the results are packed into the returned 32-bit unsigned integer.</p>\n<p>The conversion for component c of v to fixed point is done as follows: packUnorm4x8: round(clamp(c, 0, +1) * 255.0)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5f4296dc5f12f0aa67ac05b8bb322483\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL uvec2 glm::unpackDouble2x32 </td>\n          <td>(</td>\n          <td class=\"paramtype\">double&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns a two-component unsigned integer vector representation of v. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackDouble2x32.xml\">GLSL unpackDouble2x32 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaf59b52e6b28da9335322c4ae19b5d745\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec2 glm::unpackHalf2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>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. </p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL unpackHalf2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gacd8f8971a3fe28418be0d0fa1f786b38\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec2 glm::unpackSnorm2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<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. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackSnorm2x16: clamp(f / 32767.0, -1, +1)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml\">GLSL unpackSnorm2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga2db488646d48b7c43d3218954523fe82\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackSnorm4x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<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. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackSnorm4x8: clamp(f / 127.0, -1, +1)</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL unpackSnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga1f66188e5d65afeb9ffba1ad971e4007\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec2 glm::unpackUnorm2x16 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<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. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackUnorm2x16: f / 65535.0</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL unpackUnorm2x16 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga7f903259150b67e9466f5f8edffcd197\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec4 glm::unpackUnorm4x8 </td>\n          <td>(</td>\n          <td class=\"paramtype\"><a class=\"el\" href=\"a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14\">uint</a>&#160;</td>\n          <td class=\"paramname\"><em>p</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<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. </p>\n<p>Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.</p>\n<p>The conversion for unpacked fixed-point value f to floating point is done as follows: unpackUnorm4x8: f / 255.0</p>\n<p>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.</p>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL unpackUnorm4x8 man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00232.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Angle and Trigonometry Functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Angle and Trigonometry Functions<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00100.html\" title=\"Core features \">glm/trigonometric.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gacc9b092df8257c68f19c9053703e2563\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gacc9b092df8257c68f19c9053703e2563\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gacc9b092df8257c68f19c9053703e2563\">acos</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gacc9b092df8257c68f19c9053703e2563\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc cosine.  <a href=\"a00232.html#gacc9b092df8257c68f19c9053703e2563\">More...</a><br /></td></tr>\n<tr class=\"separator:gacc9b092df8257c68f19c9053703e2563\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga858f35dc66fd2688f20c52b5f25be76a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga858f35dc66fd2688f20c52b5f25be76a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga858f35dc66fd2688f20c52b5f25be76a\">acosh</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga858f35dc66fd2688f20c52b5f25be76a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc hyperbolic cosine; returns the non-negative inverse of cosh.  <a href=\"a00232.html#ga858f35dc66fd2688f20c52b5f25be76a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga858f35dc66fd2688f20c52b5f25be76a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga0552d2df4865fa8c3d7cfc3ec2caac73\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga0552d2df4865fa8c3d7cfc3ec2caac73\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga0552d2df4865fa8c3d7cfc3ec2caac73\">asin</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga0552d2df4865fa8c3d7cfc3ec2caac73\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc sine.  <a href=\"a00232.html#ga0552d2df4865fa8c3d7cfc3ec2caac73\">More...</a><br /></td></tr>\n<tr class=\"separator:ga0552d2df4865fa8c3d7cfc3ec2caac73\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga3ef16b501ee859fddde88e22192a5950\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga3ef16b501ee859fddde88e22192a5950\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga3ef16b501ee859fddde88e22192a5950\">asinh</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:ga3ef16b501ee859fddde88e22192a5950\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc hyperbolic sine; returns the inverse of sinh.  <a href=\"a00232.html#ga3ef16b501ee859fddde88e22192a5950\">More...</a><br /></td></tr>\n<tr class=\"separator:ga3ef16b501ee859fddde88e22192a5950\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac61629f3a4aa14057e7a8cae002291db\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac61629f3a4aa14057e7a8cae002291db\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">atan</a> (vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gac61629f3a4aa14057e7a8cae002291db\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent.  <a href=\"a00232.html#gac61629f3a4aa14057e7a8cae002291db\">More...</a><br /></td></tr>\n<tr class=\"separator:gac61629f3a4aa14057e7a8cae002291db\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga5229f087eaccbc466f1c609ce3107b95\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga5229f087eaccbc466f1c609ce3107b95\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga5229f087eaccbc466f1c609ce3107b95\">atan</a> (vec&lt; L, T, Q &gt; const &amp;y_over_x)</td></tr>\n<tr class=\"memdesc:ga5229f087eaccbc466f1c609ce3107b95\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc tangent.  <a href=\"a00232.html#ga5229f087eaccbc466f1c609ce3107b95\">More...</a><br /></td></tr>\n<tr class=\"separator:ga5229f087eaccbc466f1c609ce3107b95\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gabc925650e618357d07da255531658b87\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gabc925650e618357d07da255531658b87\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gabc925650e618357d07da255531658b87\">atanh</a> (vec&lt; L, T, Q &gt; const &amp;x)</td></tr>\n<tr class=\"memdesc:gabc925650e618357d07da255531658b87\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Arc hyperbolic tangent; returns the inverse of tanh.  <a href=\"a00232.html#gabc925650e618357d07da255531658b87\">More...</a><br /></td></tr>\n<tr class=\"separator:gabc925650e618357d07da255531658b87\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6a41efc740e3b3c937447d3a6284130e\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6a41efc740e3b3c937447d3a6284130e\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga6a41efc740e3b3c937447d3a6284130e\">cos</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga6a41efc740e3b3c937447d3a6284130e\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">The standard trigonometric cosine function.  <a href=\"a00232.html#ga6a41efc740e3b3c937447d3a6284130e\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6a41efc740e3b3c937447d3a6284130e\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga4e260e372742c5f517aca196cf1e62b3\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga4e260e372742c5f517aca196cf1e62b3\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga4e260e372742c5f517aca196cf1e62b3\">cosh</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga4e260e372742c5f517aca196cf1e62b3\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2.  <a href=\"a00232.html#ga4e260e372742c5f517aca196cf1e62b3\">More...</a><br /></td></tr>\n<tr class=\"separator:ga4e260e372742c5f517aca196cf1e62b3\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga8faec9e303538065911ba8b3caf7326b\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga8faec9e303538065911ba8b3caf7326b\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga8faec9e303538065911ba8b3caf7326b\">degrees</a> (vec&lt; L, T, Q &gt; const &amp;radians)</td></tr>\n<tr class=\"memdesc:ga8faec9e303538065911ba8b3caf7326b\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts radians to degrees and returns the result.  <a href=\"a00232.html#ga8faec9e303538065911ba8b3caf7326b\">More...</a><br /></td></tr>\n<tr class=\"separator:ga8faec9e303538065911ba8b3caf7326b\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga6e1db4862c5e25afd553930e2fdd6a68\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga6e1db4862c5e25afd553930e2fdd6a68\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL GLM_CONSTEXPR vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68\">radians</a> (vec&lt; L, T, Q &gt; const &amp;degrees)</td></tr>\n<tr class=\"memdesc:ga6e1db4862c5e25afd553930e2fdd6a68\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Converts degrees to radians and returns the result.  <a href=\"a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68\">More...</a><br /></td></tr>\n<tr class=\"separator:ga6e1db4862c5e25afd553930e2fdd6a68\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga29747fd108cb7292ae5a284f69691a69\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga29747fd108cb7292ae5a284f69691a69\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga29747fd108cb7292ae5a284f69691a69\">sin</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga29747fd108cb7292ae5a284f69691a69\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">The standard trigonometric sine function.  <a href=\"a00232.html#ga29747fd108cb7292ae5a284f69691a69\">More...</a><br /></td></tr>\n<tr class=\"separator:ga29747fd108cb7292ae5a284f69691a69\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac7c39ff21809e281552b4dbe46f4a39d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac7c39ff21809e281552b4dbe46f4a39d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gac7c39ff21809e281552b4dbe46f4a39d\">sinh</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:gac7c39ff21809e281552b4dbe46f4a39d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2.  <a href=\"a00232.html#gac7c39ff21809e281552b4dbe46f4a39d\">More...</a><br /></td></tr>\n<tr class=\"separator:gac7c39ff21809e281552b4dbe46f4a39d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga293a34cfb9f0115cc606b4a97c84f11f\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga293a34cfb9f0115cc606b4a97c84f11f\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#ga293a34cfb9f0115cc606b4a97c84f11f\">tan</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:ga293a34cfb9f0115cc606b4a97c84f11f\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">The standard trigonometric tangent function.  <a href=\"a00232.html#ga293a34cfb9f0115cc606b4a97c84f11f\">More...</a><br /></td></tr>\n<tr class=\"separator:ga293a34cfb9f0115cc606b4a97c84f11f\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, T, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00232.html#gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\">tanh</a> (vec&lt; L, T, Q &gt; const &amp;angle)</td></tr>\n<tr class=\"memdesc:gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the hyperbolic tangent function, sinh(angle) / cosh(angle)  <a href=\"a00232.html#gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\">More...</a><br /></td></tr>\n<tr class=\"separator:gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00100.html\" title=\"Core features \">glm/trigonometric.hpp</a>&gt; to use these core features. </p>\n<p>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.</p>\n<p>These all operate component-wise. The description is per component. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gacc9b092df8257c68f19c9053703e2563\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::acos </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Arc cosine. </p>\n<p>Returns an angle whose sine is x. The range of values returned by this function is [0, PI]. Results are undefined if |x| &gt; 1.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/acos.xml\">GLSL acos man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga858f35dc66fd2688f20c52b5f25be76a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::acosh </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Arc hyperbolic cosine; returns the non-negative inverse of cosh. </p>\n<p>Results are undefined if x &lt; 1.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/acosh.xml\">GLSL acosh man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga0552d2df4865fa8c3d7cfc3ec2caac73\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::asin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Arc sine. </p>\n<p>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| &gt; 1.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/asin.xml\">GLSL asin man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga3ef16b501ee859fddde88e22192a5950\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::asinh </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Arc hyperbolic sine; returns the inverse of sinh. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/asinh.xml\">GLSL asinh man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac61629f3a4aa14057e7a8cae002291db\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::atan </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Arc tangent. </p>\n<p>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.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml\">GLSL atan man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n<p>Referenced by <a class=\"el\" href=\"a00017_source.html#l00055\">glm::atan2()</a>.</p>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga5229f087eaccbc466f1c609ce3107b95\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::atan </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y_over_x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Arc tangent. </p>\n<p>Returns an angle whose tangent is y_over_x. The range of values returned by this function is [-PI/2, PI/2].</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml\">GLSL atan man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gabc925650e618357d07da255531658b87\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::atanh </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Arc hyperbolic tangent; returns the inverse of tanh. </p>\n<p>Results are undefined if abs(x) &gt;= 1.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atanh.xml\">GLSL atanh man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6a41efc740e3b3c937447d3a6284130e\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::cos </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>The standard trigonometric cosine function. </p>\n<p>The values returned by this function will range from [-1, 1].</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cos.xml\">GLSL cos man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga4e260e372742c5f517aca196cf1e62b3\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::cosh </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cosh.xml\">GLSL cosh man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga8faec9e303538065911ba8b3caf7326b\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR vec&lt;L, T, Q&gt; glm::degrees </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>radians</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts radians to degrees and returns the result. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml\">GLSL degrees man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga6e1db4862c5e25afd553930e2fdd6a68\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL GLM_CONSTEXPR vec&lt;L, T, Q&gt; glm::radians </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>degrees</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Converts degrees to radians and returns the result. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml\">GLSL radians man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga29747fd108cb7292ae5a284f69691a69\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::sin </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>The standard trigonometric sine function. </p>\n<p>The values returned by this function will range from [-1, 1].</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sin.xml\">GLSL sin man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac7c39ff21809e281552b4dbe46f4a39d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::sinh </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sinh.xml\">GLSL sinh man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga293a34cfb9f0115cc606b4a97c84f11f\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::tan </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>The standard trigonometric tangent function. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/tan.xml\">GLSL tan man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, T, Q&gt; glm::tanh </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>angle</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>Integer between 1 and 4 included that qualify the dimension of the vector </td></tr>\n    <tr><td class=\"paramname\">T</td><td>Floating-point scalar types </td></tr>\n    <tr><td class=\"paramname\">Q</td><td>Value from qualifier enum</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/tanh.xml\">GLSL tanh man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/a00233.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Vector Relational Functions</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"summary\">\n<a href=\"#func-members\">Functions</a>  </div>\n  <div class=\"headertitle\">\n<div class=\"title\">Vector Relational Functions<div class=\"ingroups\"><a class=\"el\" href=\"a00143.html\">Core features</a></div></div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n\n<p>Include &lt;<a class=\"el\" href=\"a00133_source.html\">glm/vector_relational.hpp</a>&gt; to use these core features.  \n<a href=\"#details\">More...</a></p>\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"func-members\"></a>\nFunctions</h2></td></tr>\n<tr class=\"memitem:gab5af106b2d5675d51af84815d937384d\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gab5af106b2d5675d51af84815d937384d\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#gab5af106b2d5675d51af84815d937384d\">all</a> (vec&lt; L, bool, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gab5af106b2d5675d51af84815d937384d\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if all components of x are true.  <a href=\"a00233.html#gab5af106b2d5675d51af84815d937384d\">More...</a><br /></td></tr>\n<tr class=\"separator:gab5af106b2d5675d51af84815d937384d\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gadcc289349a96ef7642b14bc151ee4ae8\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gadcc289349a96ef7642b14bc151ee4ae8\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL bool&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#gadcc289349a96ef7642b14bc151ee4ae8\">any</a> (vec&lt; L, bool, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:gadcc289349a96ef7642b14bc151ee4ae8\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns true if any component of x is true.  <a href=\"a00233.html#gadcc289349a96ef7642b14bc151ee4ae8\">More...</a><br /></td></tr>\n<tr class=\"separator:gadcc289349a96ef7642b14bc151ee4ae8\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga774f9e3a93c913f1e7c215a549707d59\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga774f9e3a93c913f1e7c215a549707d59\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#ga774f9e3a93c913f1e7c215a549707d59\">equal</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga774f9e3a93c913f1e7c215a549707d59\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x == y.  <a href=\"a00233.html#ga774f9e3a93c913f1e7c215a549707d59\">More...</a><br /></td></tr>\n<tr class=\"separator:ga774f9e3a93c913f1e7c215a549707d59\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gad3a3a7d228da3754c328c9a778f6df56\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gad3a3a7d228da3754c328c9a778f6df56\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#gad3a3a7d228da3754c328c9a778f6df56\">greaterThan</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gad3a3a7d228da3754c328c9a778f6df56\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &gt; y.  <a href=\"a00233.html#gad3a3a7d228da3754c328c9a778f6df56\">More...</a><br /></td></tr>\n<tr class=\"separator:gad3a3a7d228da3754c328c9a778f6df56\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga271038c5290184127754bda0ae91a5bd\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga271038c5290184127754bda0ae91a5bd\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#ga271038c5290184127754bda0ae91a5bd\">greaterThanEqual</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga271038c5290184127754bda0ae91a5bd\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &gt;= y.  <a href=\"a00233.html#ga271038c5290184127754bda0ae91a5bd\">More...</a><br /></td></tr>\n<tr class=\"separator:ga271038c5290184127754bda0ae91a5bd\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga314be073c42278ccb6fe7a7958213824\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga314be073c42278ccb6fe7a7958213824\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#ga314be073c42278ccb6fe7a7958213824\">lessThan</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga314be073c42278ccb6fe7a7958213824\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison result of x &lt; y.  <a href=\"a00233.html#ga314be073c42278ccb6fe7a7958213824\">More...</a><br /></td></tr>\n<tr class=\"separator:ga314be073c42278ccb6fe7a7958213824\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga51bf75522dbe1fa5e7806eb9b825ab6a\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga51bf75522dbe1fa5e7806eb9b825ab6a\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#ga51bf75522dbe1fa5e7806eb9b825ab6a\">lessThanEqual</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:ga51bf75522dbe1fa5e7806eb9b825ab6a\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x &lt;= y.  <a href=\"a00233.html#ga51bf75522dbe1fa5e7806eb9b825ab6a\">More...</a><br /></td></tr>\n<tr class=\"separator:ga51bf75522dbe1fa5e7806eb9b825ab6a\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:ga464f1392c934f69a917ab8bb6eda5b09\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, qualifier Q&gt; </td></tr>\n<tr class=\"memitem:ga464f1392c934f69a917ab8bb6eda5b09\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#ga464f1392c934f69a917ab8bb6eda5b09\">not_</a> (vec&lt; L, bool, Q &gt; const &amp;v)</td></tr>\n<tr class=\"memdesc:ga464f1392c934f69a917ab8bb6eda5b09\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise logical complement of x.  <a href=\"a00233.html#ga464f1392c934f69a917ab8bb6eda5b09\">More...</a><br /></td></tr>\n<tr class=\"separator:ga464f1392c934f69a917ab8bb6eda5b09\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:gac5a72a973c81dc697dd8bb5d218e8251\"><td class=\"memTemplParams\" colspan=\"2\">template&lt;length_t L, typename T , qualifier Q&gt; </td></tr>\n<tr class=\"memitem:gac5a72a973c81dc697dd8bb5d218e8251\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">GLM_FUNC_DECL vec&lt; L, bool, Q &gt;&#160;</td><td class=\"memTemplItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00233.html#gac5a72a973c81dc697dd8bb5d218e8251\">notEqual</a> (vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)</td></tr>\n<tr class=\"memdesc:gac5a72a973c81dc697dd8bb5d218e8251\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">Returns the component-wise comparison of result x != y.  <a href=\"a00233.html#gac5a72a973c81dc697dd8bb5d218e8251\">More...</a><br /></td></tr>\n<tr class=\"separator:gac5a72a973c81dc697dd8bb5d218e8251\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n<a name=\"details\" id=\"details\"></a><h2 class=\"groupheader\">Detailed Description</h2>\n<p>Include &lt;<a class=\"el\" href=\"a00133_source.html\">glm/vector_relational.hpp</a>&gt; to use these core features. </p>\n<p>Relational and equality operators (&lt;, &lt;=, &gt;, &gt;=, ==, !=) are defined to operate on scalars and produce scalar Boolean results. For vector results, use the following built-in functions.</p>\n<p>In all cases, the sizes of all the input and return vectors for any particular call must match. </p>\n<h2 class=\"groupheader\">Function Documentation</h2>\n<a class=\"anchor\" id=\"gab5af106b2d5675d51af84815d937384d\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::all </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, bool, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if all components of x are true. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/all.xml\">GLSL all man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gadcc289349a96ef7642b14bc151ee4ae8\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL bool glm::any </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, bool, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns true if any component of x is true. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/any.xml\">GLSL any man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga774f9e3a93c913f1e7c215a549707d59\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::equal </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x == y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>A floating-point, integer or bool scalar type.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/equal.xml\">GLSL equal man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gad3a3a7d228da3754c328c9a778f6df56\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::greaterThan </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x &gt; y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>A floating-point or integer scalar type.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThan.xml\">GLSL greaterThan man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga271038c5290184127754bda0ae91a5bd\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::greaterThanEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x &gt;= y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>A floating-point or integer scalar type.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThanEqual.xml\">GLSL greaterThanEqual man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga314be073c42278ccb6fe7a7958213824\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::lessThan </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison result of x &lt; y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>A floating-point or integer scalar type.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThan.xml\">GLSL lessThan man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga51bf75522dbe1fa5e7806eb9b825ab6a\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::lessThanEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x &lt;= y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>A floating-point or integer scalar type.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThanEqual.xml\">GLSL lessThanEqual man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"ga464f1392c934f69a917ab8bb6eda5b09\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::not_ </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, bool, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>v</em></td><td>)</td>\n          <td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise logical complement of x. </p>\n<p>/!\\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead.</p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/not.xml\">GLSL not man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n<a class=\"anchor\" id=\"gac5a72a973c81dc697dd8bb5d218e8251\"></a>\n<div class=\"memitem\">\n<div class=\"memproto\">\n      <table class=\"memname\">\n        <tr>\n          <td class=\"memname\">GLM_FUNC_DECL vec&lt;L, bool, Q&gt; glm::notEqual </td>\n          <td>(</td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>x</em>, </td>\n        </tr>\n        <tr>\n          <td class=\"paramkey\"></td>\n          <td></td>\n          <td class=\"paramtype\">vec&lt; L, T, Q &gt; const &amp;&#160;</td>\n          <td class=\"paramname\"><em>y</em>&#160;</td>\n        </tr>\n        <tr>\n          <td></td>\n          <td>)</td>\n          <td></td><td></td>\n        </tr>\n      </table>\n</div><div class=\"memdoc\">\n\n<p>Returns the component-wise comparison of result x != y. </p>\n<dl class=\"tparams\"><dt>Template Parameters</dt><dd>\n  <table class=\"tparams\">\n    <tr><td class=\"paramname\">L</td><td>An integer between 1 and 4 included that qualify the dimension of the vector. </td></tr>\n    <tr><td class=\"paramname\">T</td><td>A floating-point, integer or bool scalar type.</td></tr>\n  </table>\n  </dd>\n</dl>\n<dl class=\"section see\"><dt>See also</dt><dd><a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/notEqual.xml\">GLSL notEqual man page</a> </dd>\n<dd>\n<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> </dd></dl>\n\n</div>\n</div>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_304be5dfae1339a7705426c0b536faf2.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: glm Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">glm Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"subdirs\"></a>\nDirectories</h2></td></tr>\n<tr class=\"memitem:dir_da256b9dd32ba43e2eaa8a2832c37f1b\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">directory &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:dir_7997edb062bdde9a99cb6835d42b0d9d\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">directory &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:dir_e8f3c1046ba4b357711397765359cd18\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">directory &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table><table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"files\"></a>\nFiles</h2></td></tr>\n<tr class=\"memitem:a00015\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00015.html\">common.hpp</a> <a href=\"a00015_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00015\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00024\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00024.html\">exponential.hpp</a> <a href=\"a00024_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00024\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00025\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00025.html\">ext.hpp</a> <a href=\"a00025_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00025\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> (Dependence) <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00033\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00033.html\">fwd.hpp</a> <a href=\"a00033_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00033\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00034\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00034.html\">geometric.hpp</a> <a href=\"a00034_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00034\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00035\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00035.html\">glm.hpp</a> <a href=\"a00035_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00035\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00041\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00041.html\">integer.hpp</a> <a href=\"a00041_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00041\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00046\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00046.html\">mat2x2.hpp</a> <a href=\"a00046_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00046\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00047\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00047.html\">mat2x3.hpp</a> <a href=\"a00047_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00047\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00048\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00048.html\">mat2x4.hpp</a> <a href=\"a00048_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00048\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00049\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00049.html\">mat3x2.hpp</a> <a href=\"a00049_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00049\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00050\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00050.html\">mat3x3.hpp</a> <a href=\"a00050_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00050\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00051\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00051.html\">mat3x4.hpp</a> <a href=\"a00051_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00051\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00052\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00052.html\">mat4x2.hpp</a> <a href=\"a00052_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00052\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00053\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00053.html\">mat4x3.hpp</a> <a href=\"a00053_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00053\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00054\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00054.html\">mat4x4.hpp</a> <a href=\"a00054_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00054\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00055\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00055.html\">matrix.hpp</a> <a href=\"a00055_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00055\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00077\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00077.html\">packing.hpp</a> <a href=\"a00077_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00077\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00100\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00100.html\">trigonometric.hpp</a> <a href=\"a00100_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00100\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00127\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00127.html\">vec2.hpp</a> <a href=\"a00127_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00127\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00128\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00128.html\">vec3.hpp</a> <a href=\"a00128_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00128\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00129\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00129.html\">vec4.hpp</a> <a href=\"a00129_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00129\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00133\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>vector_relational.hpp</b> <a href=\"a00133_source.html\">[code]</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_45973f864e07b2505003ae343b7c8af7.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: glm Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">glm Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"subdirs\"></a>\nDirectories</h2></td></tr>\n<tr class=\"memitem:dir_48eca2e6cf73effdec262031e861eeb0\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">directory &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"dir_48eca2e6cf73effdec262031e861eeb0.html\">doc</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:dir_304be5dfae1339a7705426c0b536faf2\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">directory &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_48eca2e6cf73effdec262031e861eeb0.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: doc Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_48eca2e6cf73effdec262031e861eeb0.html\">doc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">doc Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"files\"></a>\nFiles</h2></td></tr>\n<tr class=\"memitem:a00045\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>man.doxy</b> <a href=\"a00045_source.html\">[code]</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00078\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>pages.doxy</b> <a href=\"a00078_source.html\">[code]</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_7997edb062bdde9a99cb6835d42b0d9d.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: gtc Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_7997edb062bdde9a99cb6835d42b0d9d.html\">gtc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtc Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"files\"></a>\nFiles</h2></td></tr>\n<tr class=\"memitem:a00009\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00009.html\">bitfield.hpp</a> <a href=\"a00009_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00009\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00149.html\">GLM_GTC_bitfield</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00012\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00012.html\">gtc/color_space.hpp</a> <a href=\"a00012_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00012\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00150.html\">GLM_GTC_color_space</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00020\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00020.html\">constants.hpp</a> <a href=\"a00020_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00020\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00151.html\">GLM_GTC_constants</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00022\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00022.html\">epsilon.hpp</a> <a href=\"a00022_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00022\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00152.html\">GLM_GTC_epsilon</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00039\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00039.html\">gtc/integer.hpp</a> <a href=\"a00039_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00039\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00153.html\">GLM_GTC_integer</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00056\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00056.html\">matrix_access.hpp</a> <a href=\"a00056_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00056\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00154.html\">GLM_GTC_matrix_access</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00060\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00060.html\">matrix_integer.hpp</a> <a href=\"a00060_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00060\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00155.html\">GLM_GTC_matrix_integer</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00062\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00062.html\">matrix_inverse.hpp</a> <a href=\"a00062_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00062\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00156.html\">GLM_GTC_matrix_inverse</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00066\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00066.html\">matrix_transform.hpp</a> <a href=\"a00066_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00066\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00157.html\">GLM_GTC_matrix_transform</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00069\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00069.html\">noise.hpp</a> <a href=\"a00069_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00069\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00158.html\">GLM_GTC_noise</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00076\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00076.html\">gtc/packing.hpp</a> <a href=\"a00076_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00076\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00159.html\">GLM_GTC_packing</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00083\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00083.html\">gtc/quaternion.hpp</a> <a href=\"a00083_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00083\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00160.html\">GLM_GTC_quaternion</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00085\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00085.html\">random.hpp</a> <a href=\"a00085_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00085\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00161.html\">GLM_GTC_random</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00088\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00088.html\">reciprocal.hpp</a> <a href=\"a00088_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00088\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00162.html\">GLM_GTC_reciprocal</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00091\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00091.html\">round.hpp</a> <a href=\"a00091_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00091\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00163.html\">GLM_GTC_round</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00101\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00101.html\">gtc/type_aligned.hpp</a> <a href=\"a00101_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00101\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00164.html\">GLM_GTC_type_aligned</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00117\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00117.html\">type_precision.hpp</a> <a href=\"a00117_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00117\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00165.html\">GLM_GTC_type_precision</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00118\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00118.html\">type_ptr.hpp</a> <a href=\"a00118_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00118\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00166.html\">GLM_GTC_type_ptr</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00125\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00125.html\">ulp.hpp</a> <a href=\"a00125_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00125\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00167.html\">GLM_GTC_ulp</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00126\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00126.html\">vec1.hpp</a> <a href=\"a00126_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00126\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00168.html\">GLM_GTC_vec1</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_9344afb825aed5e2f5be1d2015dde43c.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: G-Truc Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">G-Truc Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"subdirs\"></a>\nDirectories</h2></td></tr>\n<tr class=\"memitem:dir_45973f864e07b2505003ae343b7c8af7\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">directory &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_934f46a345653ef2b3014a1b37a162c1.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: G: Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">G: Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"subdirs\"></a>\nDirectories</h2></td></tr>\n<tr class=\"memitem:dir_98f7f9d41f9d3029bd68cf237526a774\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">directory &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_98f7f9d41f9d3029bd68cf237526a774.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Source Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">Source Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"subdirs\"></a>\nDirectories</h2></td></tr>\n<tr class=\"memitem:dir_9344afb825aed5e2f5be1d2015dde43c\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">directory &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_da256b9dd32ba43e2eaa8a2832c37f1b.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: detail Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_da256b9dd32ba43e2eaa8a2832c37f1b.html\">detail</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">detail Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"files\"></a>\nFiles</h2></td></tr>\n<tr class=\"memitem:a00001\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00001.html\">_features.hpp</a> <a href=\"a00001_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00001\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00002\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00002.html\">_fixes.hpp</a> <a href=\"a00002_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00002\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00003\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00003.html\">_noise.hpp</a> <a href=\"a00003_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00003\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00004\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00004.html\">_swizzle.hpp</a> <a href=\"a00004_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00004\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00005\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00005.html\">_swizzle_func.hpp</a> <a href=\"a00005_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00005\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00006\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00006.html\">_vectorize.hpp</a> <a href=\"a00006_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00006\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00019\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><b>compute_vector_relational.hpp</b> <a href=\"a00019_source.html\">[code]</a></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00082\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00082.html\">qualifier.hpp</a> <a href=\"a00082_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00082\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00094\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00094.html\">setup.hpp</a> <a href=\"a00094_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00094\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00103\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00103.html\">type_float.hpp</a> <a href=\"a00103_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00103\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00104\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00104.html\">type_gentype.hpp</a> <a href=\"a00104_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00104\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00105\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00105.html\">type_half.hpp</a> <a href=\"a00105_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00105\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00106\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00106.html\">type_int.hpp</a> <a href=\"a00106_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00106\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00107\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00107.html\">type_mat.hpp</a> <a href=\"a00107_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00107\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00108\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00108.html\">type_mat2x2.hpp</a> <a href=\"a00108_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00108\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00109\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00109.html\">type_mat2x3.hpp</a> <a href=\"a00109_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00109\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00110\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00110.html\">type_mat2x4.hpp</a> <a href=\"a00110_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00110\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00111\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00111.html\">type_mat3x2.hpp</a> <a href=\"a00111_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00111\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00112\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00112.html\">type_mat3x3.hpp</a> <a href=\"a00112_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00112\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00113\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00113.html\">type_mat3x4.hpp</a> <a href=\"a00113_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00113\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00114\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00114.html\">type_mat4x2.hpp</a> <a href=\"a00114_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00114\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00115\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00115.html\">type_mat4x3.hpp</a> <a href=\"a00115_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00115\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00116\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00116.html\">type_mat4x4.hpp</a> <a href=\"a00116_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00116\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00120\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00120.html\">type_vec.hpp</a> <a href=\"a00120_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00120\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00121\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00121.html\">type_vec1.hpp</a> <a href=\"a00121_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00121\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00122\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00122.html\">type_vec2.hpp</a> <a href=\"a00122_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00122\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00123\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00123.html\">type_vec3.hpp</a> <a href=\"a00123_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00123\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00124\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00124.html\">type_vec4.hpp</a> <a href=\"a00124_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00124\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00143.html\">Core features</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/dir_e8f3c1046ba4b357711397765359cd18.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: gtx Directory Reference</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div id=\"nav-path\" class=\"navpath\">\n  <ul>\n<li class=\"navelem\"><a class=\"el\" href=\"dir_934f46a345653ef2b3014a1b37a162c1.html\">G:</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_98f7f9d41f9d3029bd68cf237526a774.html\">Source</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_9344afb825aed5e2f5be1d2015dde43c.html\">G-Truc</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_45973f864e07b2505003ae343b7c8af7.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_304be5dfae1339a7705426c0b536faf2.html\">glm</a></li><li class=\"navelem\"><a class=\"el\" href=\"dir_e8f3c1046ba4b357711397765359cd18.html\">gtx</a></li>  </ul>\n</div>\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">gtx Directory Reference</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<table class=\"memberdecls\">\n<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\"><a name=\"files\"></a>\nFiles</h2></td></tr>\n<tr class=\"memitem:a00007\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00007.html\">associated_min_max.hpp</a> <a href=\"a00007_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00007\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00169.html\">GLM_GTX_associated_min_max</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00008\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00008.html\">bit.hpp</a> <a href=\"a00008_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00008\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00170.html\">GLM_GTX_bit</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00010\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00010.html\">closest_point.hpp</a> <a href=\"a00010_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00010\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00171.html\">GLM_GTX_closest_point</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00011\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00011.html\">color_encoding.hpp</a> <a href=\"a00011_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00011\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00172.html\">GLM_GTX_color_encoding</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00013\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00013.html\">gtx/color_space.hpp</a> <a href=\"a00013_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00013\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00173.html\">GLM_GTX_color_space</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00014\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00014.html\">color_space_YCoCg.hpp</a> <a href=\"a00014_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00014\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00174.html\">GLM_GTX_color_space_YCoCg</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00016\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00016.html\">gtx/common.hpp</a> <a href=\"a00016_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00016\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00175.html\">GLM_GTX_common</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00017\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00017.html\">compatibility.hpp</a> <a href=\"a00017_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00017\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00176.html\">GLM_GTX_compatibility</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00018\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00018.html\">component_wise.hpp</a> <a href=\"a00018_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00018\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00177.html\">GLM_GTX_component_wise</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00021\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00021.html\">dual_quaternion.hpp</a> <a href=\"a00021_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00021\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00178.html\">GLM_GTX_dual_quaternion</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00023\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00023.html\">euler_angles.hpp</a> <a href=\"a00023_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00023\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00179.html\">GLM_GTX_euler_angles</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00026\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00026.html\">extend.hpp</a> <a href=\"a00026_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00026\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00180.html\">GLM_GTX_extend</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00027\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00027.html\">extended_min_max.hpp</a> <a href=\"a00027_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00027\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00181.html\">GLM_GTX_extented_min_max</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00028\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00028.html\">exterior_product.hpp</a> <a href=\"a00028_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00028\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00182.html\">GLM_GTX_exterior_product</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00029\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00029.html\">fast_exponential.hpp</a> <a href=\"a00029_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00029\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00183.html\">GLM_GTX_fast_exponential</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00030\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00030.html\">fast_square_root.hpp</a> <a href=\"a00030_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00030\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00184.html\">GLM_GTX_fast_square_root</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00031\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00031.html\">fast_trigonometry.hpp</a> <a href=\"a00031_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00031\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00185.html\">GLM_GTX_fast_trigonometry</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00032\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00032.html\">functions.hpp</a> <a href=\"a00032_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00032\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00186.html\">GLM_GTX_functions</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00036\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00036.html\">gradient_paint.hpp</a> <a href=\"a00036_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00036\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00187.html\">GLM_GTX_gradient_paint</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00037\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00037.html\">handed_coordinate_space.hpp</a> <a href=\"a00037_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00037\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00188.html\">GLM_GTX_handed_coordinate_space</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00038\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00038.html\">hash.hpp</a> <a href=\"a00038_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00038\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00189.html\">GLM_GTX_hash</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00040\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00040.html\">gtx/integer.hpp</a> <a href=\"a00040_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00040\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00190.html\">GLM_GTX_integer</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00042\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00042.html\">intersect.hpp</a> <a href=\"a00042_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00042\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00191.html\">GLM_GTX_intersect</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00043\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00043.html\">io.hpp</a> <a href=\"a00043_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00043\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00192.html\">GLM_GTX_io</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00044\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00044.html\">log_base.hpp</a> <a href=\"a00044_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00044\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00193.html\">GLM_GTX_log_base</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00057\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00057.html\">matrix_cross_product.hpp</a> <a href=\"a00057_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00057\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00194.html\">GLM_GTX_matrix_cross_product</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00058\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00058.html\">matrix_decompose.hpp</a> <a href=\"a00058_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00058\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00195.html\">GLM_GTX_matrix_decompose</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00059\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00059.html\">matrix_factorisation.hpp</a> <a href=\"a00059_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00059\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00196.html\">GLM_GTX_matrix_factorisation</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00061\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00061.html\">matrix_interpolation.hpp</a> <a href=\"a00061_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00061\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00197.html\">GLM_GTX_matrix_interpolation</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00063\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00063.html\">matrix_major_storage.hpp</a> <a href=\"a00063_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00063\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00198.html\">GLM_GTX_matrix_major_storage</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00064\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00064.html\">matrix_operation.hpp</a> <a href=\"a00064_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00064\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00199.html\">GLM_GTX_matrix_operation</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00065\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00065.html\">matrix_query.hpp</a> <a href=\"a00065_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00065\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00200.html\">GLM_GTX_matrix_query</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00067\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00067.html\">matrix_transform_2d.hpp</a> <a href=\"a00067_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00067\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00201.html\">GLM_GTX_matrix_transform_2d</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00068\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00068.html\">mixed_product.hpp</a> <a href=\"a00068_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00068\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00202.html\">GLM_GTX_mixed_producte</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00070\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00070.html\">norm.hpp</a> <a href=\"a00070_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00070\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00203.html\">GLM_GTX_norm</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00071\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00071.html\">normal.hpp</a> <a href=\"a00071_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00071\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00204.html\">GLM_GTX_normal</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00072\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00072.html\">normalize_dot.hpp</a> <a href=\"a00072_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00072\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00205.html\">GLM_GTX_normalize_dot</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00073\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00073.html\">number_precision.hpp</a> <a href=\"a00073_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00073\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00206.html\">GLM_GTX_number_precision</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00074\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00074.html\">optimum_pow.hpp</a> <a href=\"a00074_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00074\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00207.html\">GLM_GTX_optimum_pow</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00075\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00075.html\">orthonormalize.hpp</a> <a href=\"a00075_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00075\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00208.html\">GLM_GTX_orthonormalize</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00079\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00079.html\">perpendicular.hpp</a> <a href=\"a00079_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00079\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00209.html\">GLM_GTX_perpendicular</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00080\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00080.html\">polar_coordinates.hpp</a> <a href=\"a00080_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00080\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00210.html\">GLM_GTX_polar_coordinates</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00081\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00081.html\">projection.hpp</a> <a href=\"a00081_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00081\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00211.html\">GLM_GTX_projection</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00084\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00084.html\">gtx/quaternion.hpp</a> <a href=\"a00084_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00084\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00212.html\">GLM_GTX_quaternion</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00086\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00086.html\">range.hpp</a> <a href=\"a00086_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00086\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00213.html\">GLM_GTX_range</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00087\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00087.html\">raw_data.hpp</a> <a href=\"a00087_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00087\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00214.html\">GLM_GTX_raw_data</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00089\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00089.html\">rotate_normalized_axis.hpp</a> <a href=\"a00089_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00089\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00215.html\">GLM_GTX_rotate_normalized_axis</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00090\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00090.html\">rotate_vector.hpp</a> <a href=\"a00090_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00090\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00216.html\">GLM_GTX_rotate_vector</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00092\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00092.html\">scalar_multiplication.hpp</a> <a href=\"a00092_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00092\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00093\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00093.html\">scalar_relational.hpp</a> <a href=\"a00093_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00093\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00217.html\">GLM_GTX_scalar_relational</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00095\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00095.html\">spline.hpp</a> <a href=\"a00095_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00095\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00218.html\">GLM_GTX_spline</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00096\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00096.html\">std_based_type.hpp</a> <a href=\"a00096_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00096\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00219.html\">GLM_GTX_std_based_type</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00097\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00097.html\">string_cast.hpp</a> <a href=\"a00097_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00097\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00220.html\">GLM_GTX_string_cast</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00098\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00098.html\">transform.hpp</a> <a href=\"a00098_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00098\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00221.html\">GLM_GTX_transform</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00099\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00099.html\">transform2.hpp</a> <a href=\"a00099_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00099\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00222.html\">GLM_GTX_transform2</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00102\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00102.html\">gtx/type_aligned.hpp</a> <a href=\"a00102_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00102\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00223.html\">GLM_GTX_type_aligned</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00119\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00119.html\">type_trait.hpp</a> <a href=\"a00119_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00119\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00224.html\">GLM_GTX_type_trait</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00130\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00130.html\">vec_swizzle.hpp</a> <a href=\"a00130_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00130\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00225.html\">GLM_GTX_vec_swizzle</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00131\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00131.html\">vector_angle.hpp</a> <a href=\"a00131_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00131\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00226.html\">GLM_GTX_vector_angle</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00132\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00132.html\">vector_query.hpp</a> <a href=\"a00132_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00132\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00227.html\">GLM_GTX_vector_query</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n<tr class=\"memitem:a00134\"><td class=\"memItemLeft\" align=\"right\" valign=\"top\">file &#160;</td><td class=\"memItemRight\" valign=\"bottom\"><a class=\"el\" href=\"a00134.html\">wrap.hpp</a> <a href=\"a00134_source.html\">[code]</a></td></tr>\n<tr class=\"memdesc:a00134\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\"><a class=\"el\" href=\"a00228.html\">GLM_GTX_wrap</a> <br /></td></tr>\n<tr class=\"separator:\"><td class=\"memSeparator\" colspan=\"2\">&#160;</td></tr>\n</table>\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/doxygen.css",
    "content": "/* The standard CSS for doxygen 1.8.10 */\n\nbody, table, div, p, dl {\n\tfont: 400 14px/22px Roboto,sans-serif;\n}\n\nbody\n{\n\tmargin:0px;\n\tpadding:0px;\n\tbackground-color:#bf6000;\n\tbackground-repeat:no-repeat;\n\tbackground-position:center center;\n\tbackground-attachment:fixed;\n\tmin-height:1200px;\n\toverflow:auto;\n}\n\n/* @group Heading Levels */\n\nh1.groupheader {\n\tcolor:#bf6000;\n\tfont-size: 150%;\n}\n\n.title {\n\tcolor:#bf6000;\n\tfont: 400 14px/28px Roboto,sans-serif;\n\tfont-size: 150%;\n\tfont-weight: bold;\n\tmargin: 10px 2px;\n}\n\nh2.groupheader {\n\tborder-bottom: 1px solid #bf6000;\n\tcolor:#bf6000;\n\tfont-size: 150%;\n\tfont-weight: normal;\n\tmargin-top: 1.75em;\n\tpadding-top: 8px;\n\tpadding-bottom: 4px;\n\twidth: 100%;\n}\n\nh3.groupheader {\n\tfont-size: 100%;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\t-webkit-transition: text-shadow 0.5s linear;\n\t-moz-transition: text-shadow 0.5s linear;\n\t-ms-transition: text-shadow 0.5s linear;\n\t-o-transition: text-shadow 0.5s linear;\n\ttransition: text-shadow 0.5s linear;\n\tmargin-right: 15px;\n}\n\nh1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {\n\ttext-shadow: 0 0 15px cyan;\n}\n\ndt {\n\tfont-weight: bold;\n}\n\ndiv.multicol {\n\t-moz-column-gap: 1em;\n\t-webkit-column-gap: 1em;\n\t-moz-column-count: 3;\n\t-webkit-column-count: 3;\n}\n\np.startli, p.startdd {\n\tmargin-top: 2px;\n}\n\np.starttd {\n\tmargin-top: 0px;\n}\n\np.endli {\n\tmargin-bottom: 0px;\n}\n\np.enddd {\n\tmargin-bottom: 4px;\n}\n\np.endtd {\n\tmargin-bottom: 2px;\n}\n\n/* @end */\n\ncaption {\n\tfont-weight: bold;\n}\n\nspan.legend {\n        font-size: 70%;\n        text-align: center;\n}\n\nh3.version {\n        font-size: 90%;\n        text-align: center;\n}\n\ndiv.qindex, div.navtab{\n\tbackground-color: #FFF8F0;\n\tborder: 1px solid #FF8000;\n\ttext-align: center;\n}\n\ndiv.qindex, div.navpath {\n\twidth: 100%;\n\tline-height: 140%;\n}\n\ndiv.navtab {\n\tmargin-right: 15px;\n}\n\n/* @group Link Styling */\n\na {\n\tcolor: #000000;\n\tfont-weight: normal;\n\ttext-decoration: none;\n}\n\n.contents a:visited {\n\tcolor: #606060;\n}\n\n.contents{\n\tbackground-color: #FFFFFF;\n\tpadding-top:8px;\n\tpadding-bottom:8px;\n\tpadding-left:32px; \n\tpadding-right:32px;\n\tmargin:0px;\n\tmargin-left:auto; \n\tmargin-right:auto;\n\twidth:1216px;\n\tborder-bottom-left-radius: 8px;\n\tborder-bottom-right-radius: 8px;\n}\n\na:hover {\n\ttext-decoration: underline;\n}\n\na.qindex {\n\tfont-weight: bold;\n}\n\na.qindexHL {\n\tfont-weight: bold;\n\tbackground-color: #9CAFD4;\n\tcolor: #ffffff;\n\tborder: 1px double #869DCA;\n}\n\n.contents a.qindexHL:visited {\n        color: #ffffff;\n}\n\na.el {\n\tfont-weight: bold;\n}\n\na.elRef {\n}\n\na.code, a.code:visited, a.line, a.line:visited {\n\tcolor: #4665A2; \n}\n\na.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {\n\tcolor: #4665A2; \n}\n\n/* @end */\n\ndl.el {\n\tmargin-left: -1cm;\n}\n\npre.fragment {\n        border: 1px solid #FF8000;\n        background-color: #FFF8F0;\n        padding: 4px 6px;\n        margin: 4px 8px 4px 2px;\n        overflow: auto;\n        word-wrap: break-word;\n        font-size:  9pt;\n        line-height: 125%;\n        font-family: monospace, fixed;\n        font-size: 105%;\n}\n\ndiv.fragment {\n\tpadding: 4px 6px;\n\tmargin: 4px 8px 4px 2px;\n\tbackground-color: #FFF8F0;\n\tborder: 1px solid #FF8000;\n}\n\ndiv.line {\n\tfont-family: monospace, fixed;\n\tfont-size: 13px;\n\tmin-height: 13px;\n\tline-height: 1.0;\n\ttext-wrap: unrestricted;\n\twhite-space: -moz-pre-wrap; /* Moz */\n\twhite-space: -pre-wrap;     /* Opera 4-6 */\n\twhite-space: -o-pre-wrap;   /* Opera 7 */\n\twhite-space: pre-wrap;      /* CSS3  */\n\tword-wrap: break-word;      /* IE 5.5+ */\n\ttext-indent: -53px;\n\tpadding-left: 53px;\n\tpadding-bottom: 0px;\n\tmargin: 0px;\n\t-webkit-transition-property: background-color, box-shadow;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-property: background-color, box-shadow;\n\t-moz-transition-duration: 0.5s;\n\t-ms-transition-property: background-color, box-shadow;\n\t-ms-transition-duration: 0.5s;\n\t-o-transition-property: background-color, box-shadow;\n\t-o-transition-duration: 0.5s;\n\ttransition-property: background-color, box-shadow;\n\ttransition-duration: 0.5s;\n}\n\ndiv.line.glow {\n\tbackground-color: cyan;\n\tbox-shadow: 0 0 10px cyan;\n}\n\n\nspan.lineno {\n\tpadding-right: 4px;\n\ttext-align: right;\n\tborder-right: 2px solid #0F0;\n\tbackground-color: #E8E8E8;\n\twhite-space: pre;\n}\nspan.lineno a {\n\tbackground-color: #D8D8D8;\n}\n\nspan.lineno a:hover {\n\tbackground-color: #C8C8C8;\n}\n\ndiv.ah, span.ah {\n\tbackground-color: black;\n\tfont-weight: bold;\n\tcolor: #ffffff;\n\tmargin-bottom: 3px;\n\tmargin-top: 3px;\n\tpadding: 0.2em;\n\tborder: solid thin #333;\n\tborder-radius: 0.5em;\n\t-webkit-border-radius: .5em;\n\t-moz-border-radius: .5em;\n\tbox-shadow: 2px 2px 3px #999;\n\t-webkit-box-shadow: 2px 2px 3px #999;\n\t-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n\tbackground-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));\n\tbackground-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);\n}\n\ndiv.classindex ul {\n        list-style: none;\n        padding-left: 0;\n}\n\ndiv.classindex span.ai {\n        display: inline-block;\n}\n\ndiv.groupHeader {\n\tmargin-left: 16px;\n\tmargin-top: 12px;\n\tfont-weight: bold;\n}\n\ndiv.groupText {\n\tmargin-left: 16px;\n\tfont-style: italic;\n}\n\nbody {\n\tcolor: black;\n\tmargin: 0;\n}\n\ntd.indexkey {\n\tbackground-color: #FFF8F0;\n\tfont-weight: bold;\n\tborder: 1px solid #C4CFE5;\n\tmargin: 2px 0px 2px 0;\n\tpadding: 2px 10px;\n\twhite-space: nowrap;\n\tvertical-align: top;\n}\n\ntd.indexvalue {\n\tbackground-color: #FFF8F0;\n\tborder: 1px solid #C4CFE5;\n\tpadding: 2px 10px;\n\tmargin: 2px 0px;\n}\n\ntr.memlist {\n\tbackground-color: #FFF8F0;\n}\n\np.formulaDsp {\n\ttext-align: center;\n}\n\nimg.formulaDsp {\n\t\n}\n\nimg.formulaInl {\n\tvertical-align: middle;\n}\n\ndiv.center {\n\ttext-align: center;\n\tmargin-top: 0px;\n\tmargin-bottom: 0px;\n\tpadding: 0px;\n}\n\ndiv.center img {\n\tborder: 0px;\n}\n\naddress.footer {\n\tdisplay: none;\n}\n\nimg.footer {\n\tborder: 0px;\n\tvertical-align: middle;\n}\n\n/* @group Code Colorization */\n\nspan.keyword {\n\tcolor: #008000\n}\n\nspan.keywordtype {\n\tcolor: #604020\n}\n\nspan.keywordflow {\n\tcolor: #e08000\n}\n\nspan.comment {\n\tcolor: #800000\n}\n\nspan.preprocessor {\n\tcolor: #806020\n}\n\nspan.stringliteral {\n\tcolor: #002080\n}\n\nspan.charliteral {\n\tcolor: #008080\n}\n\nspan.vhdldigit { \n\tcolor: #ff00ff \n}\n\nspan.vhdlchar { \n\tcolor: #000000 \n}\n\nspan.vhdlkeyword { \n\tcolor: #700070 \n}\n\nspan.vhdllogic { \n\tcolor: #ff0000 \n}\n\nblockquote {\n        background-color: #F7F8FB;\n        border-left: 2px solid #9CAFD4;\n        margin: 0 24px 0 4px;\n        padding: 0 12px 0 16px;\n}\n\n/* @end */\n\n/*\n.search {\n\tcolor: #003399;\n\tfont-weight: bold;\n}\n\nform.search {\n\tmargin-bottom: 0px;\n\tmargin-top: 0px;\n}\n\ninput.search {\n\tfont-size: 75%;\n\tcolor: #000080;\n\tfont-weight: normal;\n\tbackground-color: #e8eef2;\n}\n*/\n\ntd.tiny {\n\tfont-size: 75%;\n}\n\n.dirtab {\n\tpadding: 4px;\n\tborder-collapse: collapse;\n\tborder: 1px solid #FF8000;\n}\n\nth.dirtab {\n\tbackground: #EBEFF6;\n\tfont-weight: bold;\n}\n\nhr {\n\theight: 0px;\n\tborder: none;\n\tborder-top: 1px solid #4A6AAA;\n}\n\nhr.footer {\n\tdisplay: none;\n}\n\n/* @group Member Descriptions */\n\ntable.memberdecls {\n\tborder-spacing: 0px;\n\tpadding: 0px;\n}\n\n.memberdecls td, .fieldtable tr {\n\t-webkit-transition-property: background-color, box-shadow;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-property: background-color, box-shadow;\n\t-moz-transition-duration: 0.5s;\n\t-ms-transition-property: background-color, box-shadow;\n\t-ms-transition-duration: 0.5s;\n\t-o-transition-property: background-color, box-shadow;\n\t-o-transition-duration: 0.5s;\n\ttransition-property: background-color, box-shadow;\n\ttransition-duration: 0.5s;\n}\n\n.memberdecls td.glow, .fieldtable tr.glow {\n\tbackground-color: cyan;\n\tbox-shadow: 0 0 15px cyan;\n}\n\n.mdescLeft, .mdescRight,\n.memItemLeft, .memItemRight,\n.memTemplItemLeft, .memTemplItemRight, .memTemplParams {\n\tbackground-color: #FFFCF8;\n\tborder: none;\n\tmargin: 4px;\n\tpadding: 1px 0 0 8px;\n}\n\n.mdescLeft, .mdescRight {\n\tpadding: 0px 8px 4px 8px;\n\tcolor: #555;\n}\n\n.memSeparator {\n        border-bottom: 1px solid #FFF8F0;\n        line-height: 1px;\n        margin: 0px;\n        padding: 0px;\n}\n\n.memItemLeft, .memTemplItemLeft {\n        white-space: nowrap;\n}\n\n.memItemRight {\n\twidth: 100%;\n}\n\n.memTemplParams {\n\tcolor: #bf6000;\n        white-space: nowrap;\n\tfont-size: 80%;\n}\n\n/* @end */\n\n/* @group Member Details */\n\n/* Styles for detailed member documentation */\n\n.memtemplate {\n\tfont-size: 80%;\n\tcolor: #4665A2;\n\tfont-weight: normal;\n\tmargin-left: 9px;\n}\n\n.memnav {\n\tbackground-color: #FFF8F0;\n\tborder: 1px solid #FF8000;\n\ttext-align: center;\n\tmargin: 2px;\n\tmargin-right: 15px;\n\tpadding: 2px;\n}\n\n.mempage {\n\twidth: 100%;\n}\n\n.memitem {\n\tpadding: 0;\n\tmargin-bottom: 10px;\n\tmargin-right: 5px;\n        -webkit-transition: box-shadow 0.5s linear;\n        -moz-transition: box-shadow 0.5s linear;\n        -ms-transition: box-shadow 0.5s linear;\n        -o-transition: box-shadow 0.5s linear;\n        transition: box-shadow 0.5s linear;\n        display: table !important;\n        width: 100%;\n}\n\n.memitem.glow {\n         box-shadow: 0 0 15px cyan;\n}\n\n.memname {\n        font-weight: bold;\n        margin-left: 6px;\n}\n\n.memname td {\n\tvertical-align: bottom;\n}\n\n.memproto, dl.reflist dt {\n        border-top: 1px solid #bf6000;\n        border-left: 1px solid #bf6000;\n        border-right: 1px solid #bf6000;\n        padding: 6px 0px 6px 0px;\n        /*color: #253555;*/\n        font-weight: bold;\n        /*text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);*/\n        /*background-image:url('nav_f.png');*/\n        background-repeat:repeat-x;\n        background-color: #FFF8F0;\n        /* opera specific markup */\n        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n        border-top-right-radius: 4px;\n        border-top-left-radius: 4px;\n        /* firefox specific markup */\n        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n        -moz-border-radius-topright: 4px;\n        -moz-border-radius-topleft: 4px;\n        /* webkit specific markup */\n        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n        -webkit-border-top-right-radius: 4px;\n        -webkit-border-top-left-radius: 4px;\n\n}\n\n.memdoc, dl.reflist dd {\n        border-bottom: 1px solid #bf6000;      \n        border-left: 1px solid #bf6000;      \n        border-right: 1px solid #bf6000; \n        padding: 6px 10px 2px 10px;\n        border-top-width: 0;\n        background-image:url('nav_g.png');\n        background-repeat:repeat-x;\n        background-color: #FFFDFB;\n        /* opera specific markup */\n        border-bottom-left-radius: 4px;\n        border-bottom-right-radius: 4px;\n        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n        /* firefox specific markup */\n        -moz-border-radius-bottomleft: 4px;\n        -moz-border-radius-bottomright: 4px;\n        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n        /* webkit specific markup */\n        -webkit-border-bottom-left-radius: 4px;\n        -webkit-border-bottom-right-radius: 4px;\n        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n}\n\ndl.reflist dt {\n        padding: 5px;\n}\n\ndl.reflist dd {\n        margin: 0px 0px 10px 0px;\n        padding: 5px;\n}\n\n.paramkey {\n\ttext-align: right;\n}\n\n.paramtype {\n\twhite-space: nowrap;\n}\n\n.paramname {\n\tcolor: #602020;\n\twhite-space: nowrap;\n}\n.paramname em {\n\tfont-style: normal;\n}\n.paramname code {\n        line-height: 14px;\n}\n\n.params, .retval, .exception, .tparams {\n        margin-left: 0px;\n        padding-left: 0px;\n}       \n\n.params .paramname, .retval .paramname {\n        font-weight: bold;\n        vertical-align: top;\n}\n        \n.params .paramtype {\n        font-style: italic;\n        vertical-align: top;\n}       \n        \n.params .paramdir {\n        font-family: \"courier new\",courier,monospace;\n        vertical-align: top;\n}\n\ntable.mlabels {\n\tborder-spacing: 0px;\n}\n\ntd.mlabels-left {\n\twidth: 100%;\n\tpadding: 0px;\n}\n\ntd.mlabels-right {\n\tvertical-align: bottom;\n\tpadding: 0px;\n\twhite-space: nowrap;\n}\n\nspan.mlabels {\n        margin-left: 8px;\n}\n\nspan.mlabel {\n\tbackground-color: #728DC1;\n\tborder-top:1px solid #5373B4;\n\tborder-left:1px solid #5373B4;\n\tborder-right:1px solid #C4CFE5;\n\tborder-bottom:1px solid #C4CFE5;\n\ttext-shadow: none;\n\tcolor: white;\n\tmargin-right: 4px;\n\tpadding: 2px 3px;\n\tborder-radius: 3px;\n\tfont-size: 7pt;\n\twhite-space: nowrap;\n\tvertical-align: middle;\n}\n\n\n\n/* @end */\n\n/* these are for tree view inside a (index) page */\n\ndiv.directory {\n        margin: 10px 0px;\n        border-top: 1px solid #bf6000;\n        border-bottom: 1px solid #bf6000;\n        width: 100%;\n}\n\n.directory table {\n        border-collapse:collapse;\n}\n\n.directory td {\n\tmargin: 0px;\n\tpadding: 0px;\n\tvertical-align: top;\n}\n\n.directory td.entry {\n\twhite-space: nowrap;\n\tpadding-right: 6px;\n\tpadding-top: 3px;\n}\n\n.directory td.entry a {\n        outline:none;\n}\n\n.directory td.entry a img {\n        border: none;\n}\n\n.directory td.desc {\n\twidth: 100%;\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n\tpadding-top: 3px;\n\tborder-left: 1px solid rgba(0,0,0,0.05);\n}\n\n.directory tr.even {\n\tpadding-left: 6px;\n\tbackground-color: #FFFDFB;\n}\n\n.directory img {\n\tvertical-align: -30%;\n}\n\n.directory .levels {\n        white-space: nowrap;\n        width: 100%;\n        text-align: right;\n        font-size: 9pt;\n}\n\n.directory .levels span {\n\tcursor: pointer;\n\tpadding-left: 2px;\n\tpadding-right: 2px;\n\tcolor: #bf6000;\n}\n\n.arrow {\n    color: #bf6000;\n    -webkit-user-select: none;\n    -khtml-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    cursor: pointer;\n    font-size: 80%;\n    display: inline-block;\n    width: 16px;\n    height: 22px;\n}\n\n.icon {\n    font-family: Arial, Helvetica;\n    font-weight: bold;\n    font-size: 12px;\n    height: 14px;\n    width: 16px;\n    display: inline-block;\n    background-color: #bf6000;\n    color: white;\n    text-align: center;\n    border-radius: 4px;\n    margin-left: 2px;\n    margin-right: 2px;\n}\n\n.icona {\n    width: 24px;\n    height: 22px;\n    display: inline-block;\n}\n\n.iconfopen {\n    width: 24px;\n    height: 18px;\n    margin-bottom: 4px;\n    background-image:url('folderopen.png');\n    background-position: 0px -4px;\n    background-repeat: repeat-y;\n    vertical-align:top;\n    display: inline-block;\n}\n\n.iconfclosed {\n    width: 24px;\n    height: 18px;\n    margin-bottom: 4px;\n    background-image:url('folderclosed.png');\n    background-position: 0px -4px;\n    background-repeat: repeat-y;\n    vertical-align:top;\n    display: inline-block;\n}\n\n.icondoc {\n    width: 24px;\n    height: 18px;\n    margin-bottom: 4px;\n    background-image:url('doc.png');\n    background-position: 0px -4px;\n    background-repeat: repeat-y;\n    vertical-align:top;\n    display: inline-block;\n}\n\ntable.directory {\n    font: 400 14px Roboto,sans-serif;\n}\n\n/* @end */\n\ndiv.dynheader {\n\tmargin-top: 8px;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\naddress {\n\tfont-style: normal;\n\tcolor: #2A3D61;\n}\n\ntable.doxtable {\n\tborder-collapse:collapse;\n\tmargin-top: 4px;\n\tmargin-bottom: 4px;\n}\n\ntable.doxtable td, table.doxtable th {\n\tborder: 1px solid #2D4068;\n\tpadding: 3px 7px 2px;\n}\n\ntable.doxtable th {\n\tbackground-color: #374F7F;\n\tcolor: #FFFFFF;\n\tfont-size: 110%;\n\tpadding-bottom: 4px;\n\tpadding-top: 5px;\n}\n\ntable.fieldtable {\n        /*width: 100%;*/\n        margin-bottom: 10px;\n        border: 1px solid #A8B8D9;\n        border-spacing: 0px;\n        -moz-border-radius: 4px;\n        -webkit-border-radius: 4px;\n        border-radius: 4px;\n        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);\n        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);\n}\n\n.fieldtable td, .fieldtable th {\n        padding: 3px 7px 2px;\n}\n\n.fieldtable td.fieldtype, .fieldtable td.fieldname {\n        white-space: nowrap;\n        border-right: 1px solid #A8B8D9;\n        border-bottom: 1px solid #A8B8D9;\n        vertical-align: top;\n}\n\n.fieldtable td.fieldname {\n        padding-top: 3px;\n}\n\n.fieldtable td.fielddoc {\n        border-bottom: 1px solid #A8B8D9;\n        /*width: 100%;*/\n}\n\n.fieldtable td.fielddoc p:first-child {\n        margin-top: 0px;\n}       \n        \n.fieldtable td.fielddoc p:last-child {\n        margin-bottom: 2px;\n}\n\n.fieldtable tr:last-child td {\n        border-bottom: none;\n}\n\n.fieldtable th {\n        background-image:url('nav_f.png');\n        background-repeat:repeat-x;\n        background-color: #E2E8F2;\n        font-size: 90%;\n        color: #253555;\n        padding-bottom: 4px;\n        padding-top: 5px;\n        text-align:left;\n        -moz-border-radius-topleft: 4px;\n        -moz-border-radius-topright: 4px;\n        -webkit-border-top-left-radius: 4px;\n        -webkit-border-top-right-radius: 4px;\n        border-top-left-radius: 4px;\n        border-top-right-radius: 4px;\n        border-bottom: 1px solid #A8B8D9;\n}\n\n\n.tabsearch {\n\ttop: 0px;\n\tleft: 10px;\n\theight: 36px;\n\tbackground-image: url('tab_b.png');\n\tz-index: 101;\n\toverflow: hidden;\n\tfont-size: 13px;\n}\n\n.navpath ul\n{\n\tfont-size: 11px;\n\t/*background-image:url('tab_b.png');*/\n\tbackground-color: #FFF8F0;\n\tbackground-repeat:repeat-x;\n\tbackground-position: 0 -5px;\n\theight:30px;\n\tline-height:30px;\n\tcolor:#bf6000;\n\tborder:solid 0px #C2CDE4;\n\toverflow:hidden;\n\tmargin:0px;\n\tpadding:0px;\n}\n\n.navpath li\n{\n\tlist-style-type:none;\n\tfloat:left;\n\tpadding-left:10px;\n\tpadding-right:15px;\n\tbackground-image:url('bc_s.png');\n\tbackground-repeat:no-repeat;\n\tbackground-position:right;\n\tcolor:#bf6000;\n}\n\n.navpath li.navelem a\n{\n\theight:32px;\n\tdisplay:block;\n\ttext-decoration: none;\n\toutline: none;\n\tcolor: #bf6000;\n\tfont-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n\ttext-decoration: none;        \n}\n\n.navpath li.navelem a:hover\n{\n\tcolor:#6884BD;\n}\n\n.navpath li.footer\n{\n        list-style-type:none;\n        float:right;\n        padding-left:10px;\n        padding-right:15px;\n        background-image:none;\n        background-repeat:no-repeat;\n        background-position:right;\n        color:#bf6000;\n        font-size: 8pt;\n}\n\ndiv.summary\n{\n\tfloat: right;\n\tfont-size: 8pt;\n\tpadding-right: 5px;\n\twidth: 50%;\n\ttext-align: right;\n}\n\ndiv.summary a\n{\n\twhite-space: nowrap;\n}\n\ndiv.ingroups\n{\n\tfont-size: 8pt;\n\twidth: 50%;\n\ttext-align: left;\n}\n\ndiv.ingroups a\n{\n\twhite-space: nowrap;\n}\n\ndiv.header\n{\n\tbackground-repeat:repeat-x;\n\tbackground-color: #FFFCF8;\n\n\tpadding:0px;\n\tmargin:0px;\n\tmargin-left:auto; \n\tmargin-right:auto;\n\twidth:1280px;\n}\n\ndiv.headertitle\n{\n\tpadding: 5px 5px 5px 10px;\n}\n\ndl\n{\n        padding: 0 0 0 10px;\n}\n\n/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */\ndl.section\n{\n\tmargin-left: 0px;\n\tpadding-left: 0px;\n}\n\ndl.note\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #D0C000;\n}\n\ndl.warning, dl.attention\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #FF0000;\n}\n\ndl.pre, dl.post, dl.invariant\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #00D000;\n}\n\ndl.deprecated\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #505050;\n}\n\ndl.todo\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #E0C000;\n}\n\ndl.test\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #3030E0;\n}\n\ndl.bug\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #C08050;\n}\n\ndl.section dd {\n\tmargin-bottom: 6px;\n}\n\n\n#projectlogo\n{\n\ttext-align: center;\n\tvertical-align: bottom;\n\tborder-collapse: separate;\n}\n \n#projectlogo img\n{ \n\tborder: 0px none;\n}\n \n#projectalign\n{\n        vertical-align: middle;\n}\n\n#projectname\n{\n\tfont: 300% Tahoma, Arial,sans-serif;\n\tmargin: 0px;\n\tpadding: 2px 0px;\n\tcolor: #FF8000;\n}\n    \n#projectbrief\n{\n\tfont: 120% Tahoma, Arial,sans-serif;\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\n#projectnumber\n{\n\tfont: 50% Tahoma, Arial,sans-serif;\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\n#titlearea\n{\n\tpadding: 0px;\n\tmargin: 0px;\n\twidth: 100%;\n\tborder-bottom: 1px solid #5373B4;\n}\n\n.image\n{\n        text-align: center;\n}\n\n.dotgraph\n{\n        text-align: center;\n}\n\n.mscgraph\n{\n        text-align: center;\n}\n\n.diagraph\n{\n        text-align: center;\n}\n\n.caption\n{\n\tfont-weight: bold;\n}\n\ndiv.zoom\n{\n\tborder: 1px solid #90A5CE;\n}\n\ndl.citelist {\n        margin-bottom:50px;\n}\n\ndl.citelist dt {\n        color:#334975;\n        float:left;\n        font-weight:bold;\n        margin-right:10px;\n        padding:5px;\n}\n\ndl.citelist dd {\n        margin:2px 0;\n        padding:5px 0;\n}\n\ndiv.toc {\n        padding: 14px 25px;\n        background-color: #F4F6FA;\n        border: 1px solid #D8DFEE;\n        border-radius: 7px 7px 7px 7px;\n        float: right;\n        height: auto;\n        margin: 0 20px 10px 10px;\n        width: 200px;\n}\n\ndiv.toc li {\n        background: url(\"bdwn.png\") no-repeat scroll 0 5px transparent;\n        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;\n        margin-top: 5px;\n        padding-left: 10px;\n        padding-top: 2px;\n}\n\ndiv.toc h3 {\n        font: bold 12px/1.2 Arial,FreeSans,sans-serif;\n\tcolor: #4665A2;\n        border-bottom: 0 none;\n        margin: 0;\n}\n\ndiv.toc ul {\n        list-style: none outside none;\n        border: medium none;\n        padding: 0px;\n}       \n\ndiv.toc li.level1 {\n        margin-left: 0px;\n}\n\ndiv.toc li.level2 {\n        margin-left: 15px;\n}\n\ndiv.toc li.level3 {\n        margin-left: 30px;\n}\n\ndiv.toc li.level4 {\n        margin-left: 45px;\n}\n\n.inherit_header {\n\tfont-weight: bold;\n\tcolor: gray;\n\tcursor: pointer;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.inherit_header td {\n        padding: 6px 0px 2px 5px;\n}\n\n.inherit {\n        display: none;\n}\n\ntr.heading h2 {\n        margin-top: 12px;\n        margin-bottom: 4px;\n}\n\n/* tooltip related style info */\n\n.ttc {\n        position: absolute;\n        display: none;\n}\n\n#powerTip {\n\tcursor: default;\n\twhite-space: nowrap;\n\tbackground-color: white;\n\tborder: 1px solid gray;\n\tborder-radius: 4px 4px 4px 4px;\n\tbox-shadow: 1px 1px 7px gray;\n\tdisplay: none;\n\tfont-size: smaller;\n\tmax-width: 80%;\n\topacity: 0.9;\n\tpadding: 1ex 1em 1em;\n\tposition: absolute;\n\tz-index: 2147483647;\n}\n\n#powerTip div.ttdoc {\n        color: grey;\n\tfont-style: italic;\n}\n\n#powerTip div.ttname a {\n        font-weight: bold;\n}\n\n#powerTip div.ttname {\n        font-weight: bold;\n}\n\n#powerTip div.ttdeci {\n        color: #006318;\n}\n\n#powerTip div {\n        margin: 0px;\n        padding: 0px;\n        font: 12px/16px Roboto,sans-serif;\n}\n\n#powerTip:before, #powerTip:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tmargin: 0px;\n}\n\n#powerTip.n:after,  #powerTip.n:before,\n#powerTip.s:after,  #powerTip.s:before,\n#powerTip.w:after,  #powerTip.w:before,\n#powerTip.e:after,  #powerTip.e:before,\n#powerTip.ne:after, #powerTip.ne:before,\n#powerTip.se:after, #powerTip.se:before,\n#powerTip.nw:after, #powerTip.nw:before,\n#powerTip.sw:after, #powerTip.sw:before {\n\tborder: solid transparent;\n\tcontent: \" \";\n\theight: 0;\n\twidth: 0;\n\tposition: absolute;\n}\n\n#powerTip.n:after,  #powerTip.s:after,\n#powerTip.w:after,  #powerTip.e:after,\n#powerTip.nw:after, #powerTip.ne:after,\n#powerTip.sw:after, #powerTip.se:after {\n\tborder-color: rgba(255, 255, 255, 0);\n}\n\n#powerTip.n:before,  #powerTip.s:before,\n#powerTip.w:before,  #powerTip.e:before,\n#powerTip.nw:before, #powerTip.ne:before,\n#powerTip.sw:before, #powerTip.se:before {\n\tborder-color: rgba(128, 128, 128, 0);\n}\n\n#powerTip.n:after,  #powerTip.n:before,\n#powerTip.ne:after, #powerTip.ne:before,\n#powerTip.nw:after, #powerTip.nw:before {\n\ttop: 100%;\n}\n\n#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {\n\tborder-top-color: #ffffff;\n\tborder-width: 10px;\n\tmargin: 0px -10px;\n}\n#powerTip.n:before {\n\tborder-top-color: #808080;\n\tborder-width: 11px;\n\tmargin: 0px -11px;\n}\n#powerTip.n:after, #powerTip.n:before {\n\tleft: 50%;\n}\n\n#powerTip.nw:after, #powerTip.nw:before {\n\tright: 14px;\n}\n\n#powerTip.ne:after, #powerTip.ne:before {\n\tleft: 14px;\n}\n\n#powerTip.s:after,  #powerTip.s:before,\n#powerTip.se:after, #powerTip.se:before,\n#powerTip.sw:after, #powerTip.sw:before {\n\tbottom: 100%;\n}\n\n#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {\n\tborder-bottom-color: #ffffff;\n\tborder-width: 10px;\n\tmargin: 0px -10px;\n}\n\n#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {\n\tborder-bottom-color: #808080;\n\tborder-width: 11px;\n\tmargin: 0px -11px;\n}\n\n#powerTip.s:after, #powerTip.s:before {\n\tleft: 50%;\n}\n\n#powerTip.sw:after, #powerTip.sw:before {\n\tright: 14px;\n}\n\n#powerTip.se:after, #powerTip.se:before {\n\tleft: 14px;\n}\n\n#powerTip.e:after, #powerTip.e:before {\n\tleft: 100%;\n}\n#powerTip.e:after {\n\tborder-left-color: #ffffff;\n\tborder-width: 10px;\n\ttop: 50%;\n\tmargin-top: -10px;\n}\n#powerTip.e:before {\n\tborder-left-color: #808080;\n\tborder-width: 11px;\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n\n#powerTip.w:after, #powerTip.w:before {\n\tright: 100%;\n}\n#powerTip.w:after {\n\tborder-right-color: #ffffff;\n\tborder-width: 10px;\n\ttop: 50%;\n\tmargin-top: -10px;\n}\n#powerTip.w:before {\n\tborder-right-color: #808080;\n\tborder-width: 11px;\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n\n#titlearea\n{\n\tmargin: 0px;\n\tpadding-top: 8px;\n\tpadding-bottom: 8px;\n\tmargin-top: 32px;\n\twidth: 100%;\n\tborder-bottom: 0px solid #FF8000;\n\tborder-top-left-radius: 8px;\n\tborder-top-right-radius: 8px;\n\tbackground-color:#FFFFFF;\n}\n\n#top\n{\n\tmargin-left:auto; \n\tmargin-right:auto;\n\twidth:1280px;\n}\n\n@media print\n{\n  #top { display: none; }\n  #side-nav { display: none; }\n  #nav-path { display: none; }\n  body { overflow:visible; }\n  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }\n  .summary { display: none; }\n  .memitem { page-break-inside: avoid; }\n  #doc-content\n  {\n    margin-left:0 !important;\n    height:auto !important;\n    width:auto !important;\n    overflow:inherit;\n    display:inline;\n  }\n}\n\n"
  },
  {
    "path": "external/glm/doc/api/dynsections.js",
    "content": "function toggleVisibility(linkObj)\n{\n var base = $(linkObj).attr('id');\n var summary = $('#'+base+'-summary');\n var content = $('#'+base+'-content');\n var trigger = $('#'+base+'-trigger');\n var src=$(trigger).attr('src');\n if (content.is(':visible')===true) {\n   content.hide();\n   summary.show();\n   $(linkObj).addClass('closed').removeClass('opened');\n   $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');\n } else {\n   content.show();\n   summary.hide();\n   $(linkObj).removeClass('closed').addClass('opened');\n   $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');\n } \n return false;\n}\n\nfunction updateStripes()\n{\n  $('table.directory tr').\n       removeClass('even').filter(':visible:even').addClass('even');\n}\n\nfunction toggleLevel(level)\n{\n  $('table.directory tr').each(function() {\n    var l = this.id.split('_').length-1;\n    var i = $('#img'+this.id.substring(3));\n    var a = $('#arr'+this.id.substring(3));\n    if (l<level+1) {\n      i.removeClass('iconfopen iconfclosed').addClass('iconfopen');\n      a.html('&#9660;');\n      $(this).show();\n    } else if (l==level+1) {\n      i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');\n      a.html('&#9658;');\n      $(this).show();\n    } else {\n      $(this).hide();\n    }\n  });\n  updateStripes();\n}\n\nfunction toggleFolder(id)\n{\n  // the clicked row\n  var currentRow = $('#row_'+id);\n\n  // all rows after the clicked row\n  var rows = currentRow.nextAll(\"tr\");\n\n  var re = new RegExp('^row_'+id+'\\\\d+_$', \"i\"); //only one sub\n\n  // only match elements AFTER this one (can't hide elements before)\n  var childRows = rows.filter(function() { return this.id.match(re); });\n\n  // first row is visible we are HIDING\n  if (childRows.filter(':first').is(':visible')===true) {\n    // replace down arrow by right arrow for current row\n    var currentRowSpans = currentRow.find(\"span\");\n    currentRowSpans.filter(\".iconfopen\").removeClass(\"iconfopen\").addClass(\"iconfclosed\");\n    currentRowSpans.filter(\".arrow\").html('&#9658;');\n    rows.filter(\"[id^=row_\"+id+\"]\").hide(); // hide all children\n  } else { // we are SHOWING\n    // replace right arrow by down arrow for current row\n    var currentRowSpans = currentRow.find(\"span\");\n    currentRowSpans.filter(\".iconfclosed\").removeClass(\"iconfclosed\").addClass(\"iconfopen\");\n    currentRowSpans.filter(\".arrow\").html('&#9660;');\n    // replace down arrows by right arrows for child rows\n    var childRowsSpans = childRows.find(\"span\");\n    childRowsSpans.filter(\".iconfopen\").removeClass(\"iconfopen\").addClass(\"iconfclosed\");\n    childRowsSpans.filter(\".arrow\").html('&#9658;');\n    childRows.show(); //show all children\n  }\n  updateStripes();\n}\n\n\nfunction toggleInherit(id)\n{\n  var rows = $('tr.inherit.'+id);\n  var img = $('tr.inherit_header.'+id+' img');\n  var src = $(img).attr('src');\n  if (rows.filter(':first').is(':visible')===true) {\n    rows.css('display','none');\n    $(img).attr('src',src.substring(0,src.length-8)+'closed.png');\n  } else {\n    rows.css('display','table-row'); // using show() causes jump in firefox\n    $(img).attr('src',src.substring(0,src.length-10)+'open.png');\n  }\n}\n\n\n$(document).ready(function() {\n  $('.code,.codeRef').each(function() {\n    $(this).data('powertip',$('#'+$(this).attr('href').replace(/.*\\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html());\n    $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true });\n  });\n});\n"
  },
  {
    "path": "external/glm/doc/api/files.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: File List</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li class=\"current\"><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n  <div id=\"navrow2\" class=\"tabs2\">\n    <ul class=\"tablist\">\n      <li class=\"current\"><a href=\"files.html\"><span>File&#160;List</span></a></li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">File List</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"textblock\">Here is a list of all documented files with brief descriptions:</div><div class=\"directory\">\n<table class=\"directory\">\n<tr id=\"row_0_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00001_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00001.html\" target=\"_self\">_features.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_1_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00002_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00002.html\" target=\"_self\">_fixes.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_2_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00003_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00003.html\" target=\"_self\">_noise.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_3_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00004_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00004.html\" target=\"_self\">_swizzle.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_4_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00005_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00005.html\" target=\"_self\">_swizzle_func.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_5_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00006_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00006.html\" target=\"_self\">_vectorize.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_6_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00007_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00007.html\" target=\"_self\">associated_min_max.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00169.html\">GLM_GTX_associated_min_max</a> </td></tr>\n<tr id=\"row_7_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00008_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00008.html\" target=\"_self\">bit.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00170.html\">GLM_GTX_bit</a> </td></tr>\n<tr id=\"row_8_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00009_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00009.html\" target=\"_self\">bitfield.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00149.html\">GLM_GTC_bitfield</a> </td></tr>\n<tr id=\"row_9_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00010_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00010.html\" target=\"_self\">closest_point.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00171.html\">GLM_GTX_closest_point</a> </td></tr>\n<tr id=\"row_10_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00011_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00011.html\" target=\"_self\">color_encoding.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00172.html\">GLM_GTX_color_encoding</a> </td></tr>\n<tr id=\"row_11_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00012_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00012.html\" target=\"_self\">gtc/color_space.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00150.html\">GLM_GTC_color_space</a> </td></tr>\n<tr id=\"row_12_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00013_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00013.html\" target=\"_self\">gtx/color_space.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00173.html\">GLM_GTX_color_space</a> </td></tr>\n<tr id=\"row_13_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00014_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00014.html\" target=\"_self\">color_space_YCoCg.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00174.html\">GLM_GTX_color_space_YCoCg</a> </td></tr>\n<tr id=\"row_14_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00015_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00015.html\" target=\"_self\">common.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_15_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00016_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00016.html\" target=\"_self\">gtx/common.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00175.html\">GLM_GTX_common</a> </td></tr>\n<tr id=\"row_16_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00017_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00017.html\" target=\"_self\">compatibility.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00176.html\">GLM_GTX_compatibility</a> </td></tr>\n<tr id=\"row_17_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00018_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00018.html\" target=\"_self\">component_wise.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00177.html\">GLM_GTX_component_wise</a> </td></tr>\n<tr id=\"row_18_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00019_source.html\"><span class=\"icondoc\"></span></a><b>compute_vector_relational.hpp</b></td><td class=\"desc\"></td></tr>\n<tr id=\"row_19_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00020_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00020.html\" target=\"_self\">constants.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00151.html\">GLM_GTC_constants</a> </td></tr>\n<tr id=\"row_20_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00021_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00021.html\" target=\"_self\">dual_quaternion.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00178.html\">GLM_GTX_dual_quaternion</a> </td></tr>\n<tr id=\"row_21_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00022_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00022.html\" target=\"_self\">epsilon.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00152.html\">GLM_GTC_epsilon</a> </td></tr>\n<tr id=\"row_22_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00023_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00023.html\" target=\"_self\">euler_angles.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00179.html\">GLM_GTX_euler_angles</a> </td></tr>\n<tr id=\"row_23_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00024_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00024.html\" target=\"_self\">exponential.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_24_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00025_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00025.html\" target=\"_self\">ext.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> (Dependence) </td></tr>\n<tr id=\"row_25_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00026_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00026.html\" target=\"_self\">extend.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00180.html\">GLM_GTX_extend</a> </td></tr>\n<tr id=\"row_26_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00027_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00027.html\" target=\"_self\">extended_min_max.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00181.html\">GLM_GTX_extented_min_max</a> </td></tr>\n<tr id=\"row_27_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00028_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00028.html\" target=\"_self\">exterior_product.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00182.html\">GLM_GTX_exterior_product</a> </td></tr>\n<tr id=\"row_28_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00029_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00029.html\" target=\"_self\">fast_exponential.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00183.html\">GLM_GTX_fast_exponential</a> </td></tr>\n<tr id=\"row_29_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00030_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00030.html\" target=\"_self\">fast_square_root.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00184.html\">GLM_GTX_fast_square_root</a> </td></tr>\n<tr id=\"row_30_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00031_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00031.html\" target=\"_self\">fast_trigonometry.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00185.html\">GLM_GTX_fast_trigonometry</a> </td></tr>\n<tr id=\"row_31_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00032_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00032.html\" target=\"_self\">functions.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00186.html\">GLM_GTX_functions</a> </td></tr>\n<tr id=\"row_32_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00033_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00033.html\" target=\"_self\">fwd.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_33_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00034_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00034.html\" target=\"_self\">geometric.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_34_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00035_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00035.html\" target=\"_self\">glm.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_35_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00036_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00036.html\" target=\"_self\">gradient_paint.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00187.html\">GLM_GTX_gradient_paint</a> </td></tr>\n<tr id=\"row_36_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00037_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00037.html\" target=\"_self\">handed_coordinate_space.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00188.html\">GLM_GTX_handed_coordinate_space</a> </td></tr>\n<tr id=\"row_37_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00038_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00038.html\" target=\"_self\">hash.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00189.html\">GLM_GTX_hash</a> </td></tr>\n<tr id=\"row_38_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00039_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00039.html\" target=\"_self\">gtc/integer.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00153.html\">GLM_GTC_integer</a> </td></tr>\n<tr id=\"row_39_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00040_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00040.html\" target=\"_self\">gtx/integer.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00190.html\">GLM_GTX_integer</a> </td></tr>\n<tr id=\"row_40_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00041_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00041.html\" target=\"_self\">integer.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_41_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00042_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00042.html\" target=\"_self\">intersect.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00191.html\">GLM_GTX_intersect</a> </td></tr>\n<tr id=\"row_42_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00043_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00043.html\" target=\"_self\">io.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00192.html\">GLM_GTX_io</a> </td></tr>\n<tr id=\"row_43_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00044_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00044.html\" target=\"_self\">log_base.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00193.html\">GLM_GTX_log_base</a> </td></tr>\n<tr id=\"row_44_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00045_source.html\"><span class=\"icondoc\"></span></a><b>man.doxy</b></td><td class=\"desc\"></td></tr>\n<tr id=\"row_45_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00046_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00046.html\" target=\"_self\">mat2x2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_46_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00047_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00047.html\" target=\"_self\">mat2x3.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_47_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00048_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00048.html\" target=\"_self\">mat2x4.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_48_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00049_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00049.html\" target=\"_self\">mat3x2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_49_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00050_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00050.html\" target=\"_self\">mat3x3.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_50_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00051_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00051.html\" target=\"_self\">mat3x4.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_51_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00052_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00052.html\" target=\"_self\">mat4x2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_52_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00053_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00053.html\" target=\"_self\">mat4x3.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_53_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00054_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00054.html\" target=\"_self\">mat4x4.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_54_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00055_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00055.html\" target=\"_self\">matrix.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_55_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00056_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00056.html\" target=\"_self\">matrix_access.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00154.html\">GLM_GTC_matrix_access</a> </td></tr>\n<tr id=\"row_56_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00057_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00057.html\" target=\"_self\">matrix_cross_product.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00194.html\">GLM_GTX_matrix_cross_product</a> </td></tr>\n<tr id=\"row_57_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00058_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00058.html\" target=\"_self\">matrix_decompose.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00195.html\">GLM_GTX_matrix_decompose</a> </td></tr>\n<tr id=\"row_58_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00059_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00059.html\" target=\"_self\">matrix_factorisation.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00196.html\">GLM_GTX_matrix_factorisation</a> </td></tr>\n<tr id=\"row_59_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00060_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00060.html\" target=\"_self\">matrix_integer.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00155.html\">GLM_GTC_matrix_integer</a> </td></tr>\n<tr id=\"row_60_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00061_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00061.html\" target=\"_self\">matrix_interpolation.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00197.html\">GLM_GTX_matrix_interpolation</a> </td></tr>\n<tr id=\"row_61_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00062_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00062.html\" target=\"_self\">matrix_inverse.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00156.html\">GLM_GTC_matrix_inverse</a> </td></tr>\n<tr id=\"row_62_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00063_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00063.html\" target=\"_self\">matrix_major_storage.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00198.html\">GLM_GTX_matrix_major_storage</a> </td></tr>\n<tr id=\"row_63_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00064_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00064.html\" target=\"_self\">matrix_operation.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00199.html\">GLM_GTX_matrix_operation</a> </td></tr>\n<tr id=\"row_64_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00065_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00065.html\" target=\"_self\">matrix_query.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00200.html\">GLM_GTX_matrix_query</a> </td></tr>\n<tr id=\"row_65_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00066_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00066.html\" target=\"_self\">matrix_transform.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00157.html\">GLM_GTC_matrix_transform</a> </td></tr>\n<tr id=\"row_66_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00067_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00067.html\" target=\"_self\">matrix_transform_2d.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00201.html\">GLM_GTX_matrix_transform_2d</a> </td></tr>\n<tr id=\"row_67_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00068_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00068.html\" target=\"_self\">mixed_product.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00202.html\">GLM_GTX_mixed_producte</a> </td></tr>\n<tr id=\"row_68_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00069_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00069.html\" target=\"_self\">noise.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00158.html\">GLM_GTC_noise</a> </td></tr>\n<tr id=\"row_69_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00070_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00070.html\" target=\"_self\">norm.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00203.html\">GLM_GTX_norm</a> </td></tr>\n<tr id=\"row_70_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00071_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00071.html\" target=\"_self\">normal.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00204.html\">GLM_GTX_normal</a> </td></tr>\n<tr id=\"row_71_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00072_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00072.html\" target=\"_self\">normalize_dot.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00205.html\">GLM_GTX_normalize_dot</a> </td></tr>\n<tr id=\"row_72_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00073_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00073.html\" target=\"_self\">number_precision.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00206.html\">GLM_GTX_number_precision</a> </td></tr>\n<tr id=\"row_73_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00074_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00074.html\" target=\"_self\">optimum_pow.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00207.html\">GLM_GTX_optimum_pow</a> </td></tr>\n<tr id=\"row_74_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00075_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00075.html\" target=\"_self\">orthonormalize.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00208.html\">GLM_GTX_orthonormalize</a> </td></tr>\n<tr id=\"row_75_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00076_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00076.html\" target=\"_self\">gtc/packing.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00159.html\">GLM_GTC_packing</a> </td></tr>\n<tr id=\"row_76_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00077_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00077.html\" target=\"_self\">packing.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_77_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00078_source.html\"><span class=\"icondoc\"></span></a><b>pages.doxy</b></td><td class=\"desc\"></td></tr>\n<tr id=\"row_78_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00079_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00079.html\" target=\"_self\">perpendicular.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00209.html\">GLM_GTX_perpendicular</a> </td></tr>\n<tr id=\"row_79_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00080_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00080.html\" target=\"_self\">polar_coordinates.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00210.html\">GLM_GTX_polar_coordinates</a> </td></tr>\n<tr id=\"row_80_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00081_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00081.html\" target=\"_self\">projection.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00211.html\">GLM_GTX_projection</a> </td></tr>\n<tr id=\"row_81_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00082_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00082.html\" target=\"_self\">qualifier.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_82_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00083_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00083.html\" target=\"_self\">gtc/quaternion.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00160.html\">GLM_GTC_quaternion</a> </td></tr>\n<tr id=\"row_83_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00084_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00084.html\" target=\"_self\">gtx/quaternion.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00212.html\">GLM_GTX_quaternion</a> </td></tr>\n<tr id=\"row_84_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00085_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00085.html\" target=\"_self\">random.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00161.html\">GLM_GTC_random</a> </td></tr>\n<tr id=\"row_85_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00086_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00086.html\" target=\"_self\">range.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00213.html\">GLM_GTX_range</a> </td></tr>\n<tr id=\"row_86_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00087_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00087.html\" target=\"_self\">raw_data.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00214.html\">GLM_GTX_raw_data</a> </td></tr>\n<tr id=\"row_87_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00088_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00088.html\" target=\"_self\">reciprocal.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00162.html\">GLM_GTC_reciprocal</a> </td></tr>\n<tr id=\"row_88_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00089_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00089.html\" target=\"_self\">rotate_normalized_axis.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00215.html\">GLM_GTX_rotate_normalized_axis</a> </td></tr>\n<tr id=\"row_89_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00090_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00090.html\" target=\"_self\">rotate_vector.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00216.html\">GLM_GTX_rotate_vector</a> </td></tr>\n<tr id=\"row_90_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00091_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00091.html\" target=\"_self\">round.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00163.html\">GLM_GTC_round</a> </td></tr>\n<tr id=\"row_91_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00092_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00092.html\" target=\"_self\">scalar_multiplication.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00148.html\">Experimental extensions</a> </td></tr>\n<tr id=\"row_92_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00093_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00093.html\" target=\"_self\">scalar_relational.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00217.html\">GLM_GTX_scalar_relational</a> </td></tr>\n<tr id=\"row_93_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00094_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00094.html\" target=\"_self\">setup.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_94_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00095_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00095.html\" target=\"_self\">spline.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00218.html\">GLM_GTX_spline</a> </td></tr>\n<tr id=\"row_95_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00096_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00096.html\" target=\"_self\">std_based_type.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00219.html\">GLM_GTX_std_based_type</a> </td></tr>\n<tr id=\"row_96_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00097_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00097.html\" target=\"_self\">string_cast.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00220.html\">GLM_GTX_string_cast</a> </td></tr>\n<tr id=\"row_97_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00098_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00098.html\" target=\"_self\">transform.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00221.html\">GLM_GTX_transform</a> </td></tr>\n<tr id=\"row_98_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00099_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00099.html\" target=\"_self\">transform2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00222.html\">GLM_GTX_transform2</a> </td></tr>\n<tr id=\"row_99_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00100_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00100.html\" target=\"_self\">trigonometric.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_100_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00101_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00101.html\" target=\"_self\">gtc/type_aligned.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00164.html\">GLM_GTC_type_aligned</a> </td></tr>\n<tr id=\"row_101_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00102_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00102.html\" target=\"_self\">gtx/type_aligned.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00223.html\">GLM_GTX_type_aligned</a> </td></tr>\n<tr id=\"row_102_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00103_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00103.html\" target=\"_self\">type_float.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_103_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00104_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00104.html\" target=\"_self\">type_gentype.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_104_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00105_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00105.html\" target=\"_self\">type_half.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_105_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00106_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00106.html\" target=\"_self\">type_int.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_106_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00107_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00107.html\" target=\"_self\">type_mat.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_107_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00108_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00108.html\" target=\"_self\">type_mat2x2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_108_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00109_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00109.html\" target=\"_self\">type_mat2x3.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_109_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00110_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00110.html\" target=\"_self\">type_mat2x4.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_110_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00111_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00111.html\" target=\"_self\">type_mat3x2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_111_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00112_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00112.html\" target=\"_self\">type_mat3x3.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_112_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00113_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00113.html\" target=\"_self\">type_mat3x4.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_113_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00114_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00114.html\" target=\"_self\">type_mat4x2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_114_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00115_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00115.html\" target=\"_self\">type_mat4x3.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_115_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00116_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00116.html\" target=\"_self\">type_mat4x4.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_116_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00117_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00117.html\" target=\"_self\">type_precision.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00165.html\">GLM_GTC_type_precision</a> </td></tr>\n<tr id=\"row_117_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00118_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00118.html\" target=\"_self\">type_ptr.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00166.html\">GLM_GTC_type_ptr</a> </td></tr>\n<tr id=\"row_118_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00119_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00119.html\" target=\"_self\">type_trait.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00224.html\">GLM_GTX_type_trait</a> </td></tr>\n<tr id=\"row_119_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00120_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00120.html\" target=\"_self\">type_vec.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_120_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00121_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00121.html\" target=\"_self\">type_vec1.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_121_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00122_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00122.html\" target=\"_self\">type_vec2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_122_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00123_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00123.html\" target=\"_self\">type_vec3.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_123_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00124_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00124.html\" target=\"_self\">type_vec4.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_124_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00125_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00125.html\" target=\"_self\">ulp.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00167.html\">GLM_GTC_ulp</a> </td></tr>\n<tr id=\"row_125_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00126_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00126.html\" target=\"_self\">vec1.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00168.html\">GLM_GTC_vec1</a> </td></tr>\n<tr id=\"row_126_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00127_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00127.html\" target=\"_self\">vec2.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_127_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00128_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00128.html\" target=\"_self\">vec3.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_128_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00129_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00129.html\" target=\"_self\">vec4.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00143.html\">Core features</a> </td></tr>\n<tr id=\"row_129_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00130_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00130.html\" target=\"_self\">vec_swizzle.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00225.html\">GLM_GTX_vec_swizzle</a> </td></tr>\n<tr id=\"row_130_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00131_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00131.html\" target=\"_self\">vector_angle.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00226.html\">GLM_GTX_vector_angle</a> </td></tr>\n<tr id=\"row_131_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00132_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00132.html\" target=\"_self\">vector_query.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00227.html\">GLM_GTX_vector_query</a> </td></tr>\n<tr id=\"row_132_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00133_source.html\"><span class=\"icondoc\"></span></a><b>vector_relational.hpp</b></td><td class=\"desc\"></td></tr>\n<tr id=\"row_133_\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><a href=\"a00134_source.html\"><span class=\"icondoc\"></span></a><a class=\"el\" href=\"a00134.html\" target=\"_self\">wrap.hpp</a></td><td class=\"desc\"><a class=\"el\" href=\"a00228.html\">GLM_GTX_wrap</a> </td></tr>\n</table>\n</div><!-- directory -->\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/index.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: OpenGL Mathematics (GLM)</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li class=\"current\"><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">OpenGL Mathematics (GLM) </div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"textblock\"><ul>\n<li>Website: <a href=\"https://glm.g-truc.net\">glm.g-truc.net</a></li>\n<li><a href=\"modules.html\">GLM API documentation</a></li>\n<li><a href=\"https://github.com/g-truc/glm/blob/master/manual.md\">GLM Manual</a> </li>\n</ul>\n</div></div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v1.7.1\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Mon Nov 21 21:11:03 2011 -0500\n */\n(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,bM=/\\S/,bI=/^\\s+/,bE=/\\s+$/,bA=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,bN=/^[\\],:{}\\s]*$/,bW=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,bJ=/(?:^|:|,)(?:\\s*\\[)+/g,by=/(webkit)[ \\/]([\\w.]+)/,bR=/(opera)(?:.*version)?[ \\/]([\\w.]+)/,bQ=/(msie) ([\\w.]+)/,bS=/(mozilla)(?:.*? rv:([\\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+\"\").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0===\"body\"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0===\"string\"){if(b0.charAt(0)===\"<\"&&b0.charAt(b0.length-1)===\">\"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:\"\",jquery:\"1.7.1\",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3===\"find\"){b2.selector=this.selector+(this.selector?\" \":\"\")+b0}else{if(b3){b2.selector=this.selector+\".\"+b3+\"(\"+b0+\")\"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),\"slice\",bK.call(arguments).join(\",\"))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5===\"boolean\"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!==\"object\"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger(\"ready\").off(\"ready\")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks(\"once memory\");if(av.readyState===\"complete\"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener(\"DOMContentLoaded\",e,false);bb.addEventListener(\"load\",bF.ready,false)}else{if(av.attachEvent){av.attachEvent(\"onreadystatechange\",e);bb.attachEvent(\"onload\",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)===\"function\"},isArray:Array.isArray||function(b0){return bF.type(b0)===\"array\"},isWindow:function(b0){return b0&&typeof b0===\"object\"&&\"setInterval\" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||\"object\"},isPlainObject:function(b2){if(!b2||bF.type(b2)!==\"object\"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,\"constructor\")&&!bG.call(b2.constructor.prototype,\"isPrototypeOf\")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!==\"string\"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,\"@\").replace(bP,\"]\").replace(bJ,\"\"))){return(new Function(\"return \"+b0))()}bF.error(\"Invalid JSON: \"+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,\"text/xml\")}else{b0=new ActiveXObject(\"Microsoft.XMLDOM\");b0.async=\"false\";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName(\"parsererror\").length){bF.error(\"Invalid XML: \"+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb[\"eval\"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,\"ms-\").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?\"\":bO.call(b0)}:function(b0){return b0==null?\"\":b0.toString().replace(bI,\"\").replace(bE,\"\")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2===\"string\"||b2===\"function\"||b2===\"regexp\"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length===\"number\"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1===\"number\"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3===\"string\"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8===\"object\"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf(\"compatible\")<0&&bS.exec(b1)||[];return{browser:b0[1]||\"\",version:b0[2]||\"0\"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"),function(b1,b0){bx[\"[object \"+b0+\"]\"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test(\"\\xA0\")){bI=/^[\\s\\xA0]+/;bE=/[\\s\\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener(\"DOMContentLoaded\",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState===\"complete\"){av.detachEvent(\"onreadystatechange\",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll(\"left\")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH===\"array\"){bE(bI)}else{if(bH===\"function\"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks(\"once memory\"),bw=b.Callbacks(\"once memory\"),bv=b.Callbacks(\"memory\"),e=\"pending\",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,\"resolve\"],fail:[bE,\"reject\"],progress:[bD,\"notify\"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+\"With\"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+\"With\"]=bA[bz].fireWith}bB.done(function(){e=\"resolved\"},bw.disable,bv.lock).fail(function(){e=\"rejected\"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement(\"div\"),bH=av.documentElement;bv.setAttribute(\"className\",\"t\");bv.innerHTML=\"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";bI=bv.getElementsByTagName(\"*\");bF=bv.getElementsByTagName(\"a\")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement(\"select\");bx=bG.appendChild(av.createElement(\"option\"));bE=bv.getElementsByTagName(\"input\")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName(\"tbody\").length,htmlSerialize:!!bv.getElementsByTagName(\"link\").length,style:/top/.test(bF.getAttribute(\"style\")),hrefNormalized:(bF.getAttribute(\"href\")===\"/a\"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value===\"on\"),optSelected:bx.selected,getSetAttribute:bv.className!==\"t\",enctype:!!av.createElement(\"form\").enctype,html5Clone:av.createElement(\"nav\").cloneNode(true).outerHTML!==\"<:nav></:nav>\",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent(\"onclick\",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent(\"onclick\")}bE=av.createElement(\"input\");bE.value=\"t\";bE.setAttribute(\"type\",\"radio\");bJ.radioValue=bE.value===\"t\";bE.setAttribute(\"checked\",\"checked\");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML=\"\";if(bb.getComputedStyle){bA=av.createElement(\"div\");bA.style.width=\"0\";bA.style.marginRight=\"0\";bv.style.width=\"2px\";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB=\"on\"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,\"return;\");bw=(typeof bv[bB]===\"function\")}bJ[by+\"Bubbles\"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName(\"body\")[0];if(!bQ){return}bL=1;bS=\"position:absolute;top:0;left:0;width:1px;height:1px;margin:0;\";bR=\"visibility:hidden;border:0;\";e=\"style='\"+bS+\"border:5px solid #000;padding:0;'\";bP=\"<div \"+e+\"><div></div></div><table \"+e+\" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>\";bM=av.createElement(\"div\");bM.style.cssText=bR+\"width:0;height:0;position:static;top:0;margin-top:\"+bL+\"px\";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement(\"div\");bM.appendChild(bv);bv.innerHTML=\"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\";bz=bv.getElementsByTagName(\"td\");bw=(bz[0].offsetHeight===0);bz[0].style.display=\"\";bz[1].style.display=\"none\";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML=\"\";bv.style.width=bv.style.paddingLeft=\"1px\";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!==\"undefined\"){bv.style.display=\"inline\";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display=\"\";bv.innerHTML=\"<div style='width:4px;'></div>\";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position=\"fixed\";bV.style.top=\"20px\";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top=\"\";bU.style.overflow=\"hidden\";bU.style.position=\"relative\";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\\{.*\\}|\\[.*\\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:\"jQuery\"+(b.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:true,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv===\"string\",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv===\"events\";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv===\"object\"||typeof bv===\"function\"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(\" \")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute(\"classid\")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by===\"undefined\"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],\"parsedAttrs\")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf(\"data-\")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],\"parsedAttrs\",true)}}return bz}else{if(typeof by===\"object\"){return this.each(function(){b.data(this,by)})}}bB=by.split(\".\");bB[1]=bB[1]?\".\"+bB[1]:\"\";if(bA===L){bz=this.triggerHandler(\"getData\"+bB[1]+\"!\",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler(\"setData\"+bB[1]+\"!\",bD);b.data(this,by,bA);bC.triggerHandler(\"changeData\"+bB[1]+\"!\",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv=\"data-\"+bw.replace(aA,\"-$1\").toLowerCase();by=bx.getAttribute(bv);if(typeof by===\"string\"){try{by=by===\"true\"?true:by===\"false\"?false:by===\"null\"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e===\"data\"&&b.isEmptyObject(bv[e])){continue}if(e!==\"toJSON\"){return false}}return true}function bi(by,bx,bA){var bw=bx+\"defer\",bv=bx+\"queue\",e=bx+\"mark\",bz=b._data(by,bw);if(bz&&(bA===\"queue\"||!b._data(by,bv))&&(bA===\"mark\"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||\"fx\")+\"mark\";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||\"fx\";var e=bv+\"mark\",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,\"mark\")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||\"fx\")+\"queue\";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||\"fx\";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw===\"inprogress\"){bw=bv.shift()}if(bw){if(bx===\"fx\"){bv.unshift(\"inprogress\")}b._data(by,bx+\".run\",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+\"queue \"+bx+\".run\",true);bi(by,bx,\"queue\")}}});b.fn.extend({queue:function(e,bv){if(typeof e!==\"string\"){bv=e;e=\"fx\"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e===\"fx\"&&bw[0]!==\"inprogress\"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||\"fx\";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(bD,bw){if(typeof bD!==\"string\"){bw=bD;bD=L}bD=bD||\"fx\";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+\"defer\",bA=bD+\"queue\",bC=bD+\"mark\",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks(\"once memory\"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\\n\\t\\r]/g,af=/\\s+/,aU=/\\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by===\"string\"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=\" \"+bx.className+\" \";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(\" \"+bA[bB]+\" \")){bz+=bA[bB]+\" \"}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz===\"string\")||bz===L){bA=(bz||\"\").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(\" \"+by.className+\" \").replace(aP,\" \");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(\" \"+bA[bB]+\" \",\" \")}by.className=b.trim(bx)}else{by.className=\"\"}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv===\"boolean\";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw===\"string\"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?\"addClass\":\"removeClass\"](bA)}}else{if(bw===\"undefined\"||bw===\"boolean\"){if(this.className){b._data(this,\"__className__\",this.className)}this.className=this.className||bx===false?\"\":b._data(this,\"__className__\")||\"\"}}})},hasClass:function(e){var bx=\" \"+e+\" \",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(\" \"+this[bw].className+\" \").replace(aP,\" \").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&\"get\" in e&&(bv=e.get(bw,\"value\"))!==L){return bv}bv=bw.value;return typeof bv===\"string\"?bv.replace(aU,\"\"):bv==null?\"\":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=\"\"}else{if(typeof bB===\"number\"){bB+=\"\"}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?\"\":bC+\"\"})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!(\"set\" in e)||e.set(this,bB,\"value\")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type===\"select-one\";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute(\"disabled\")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,\"optgroup\"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find(\"option\").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute===\"undefined\"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&\"set\" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,\"\"+bB);return bB}}}else{if(e&&\"get\" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,\"\");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error(\"type property can't be changed\")}else{if(!b.support.radioValue&&bv===\"radio\"&&b.nodeName(e,\"input\")){var bw=e.value;e.setAttribute(\"type\",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,\"button\")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,\"button\")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\":\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",usemap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&\"set\" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&\"get\" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode(\"tabindex\");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!==\"boolean\"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!==\"\":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+\"\")}};b.attrHooks.tabindex.set=be.set;b.each([\"width\",\"height\"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===\"\"){bw.setAttribute(e,\"auto\");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===\"\"){bw=\"false\"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each([\"href\",\"src\",\"width\",\"height\"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=\"\"+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype=\"encoding\"}if(!b.support.checkOn){b.each([\"radio\",\"checkbox\"],function(){b.valHooks[this]={get:function(e){return e.getAttribute(\"value\")===null?\"on\":e.value}}})}b.each([\"radio\",\"checkbox\"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\\.]*)?(?:\\.(.+))?$/,J=/\\bhover(\\.\\S+)?\\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||\"\").toLowerCase();bv[3]=bv[3]&&new RegExp(\"(?:^|\\\\s)\"+bv[3]+\"(?:\\\\s|$)\")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv[\"class\"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,\"mouseenter$1 mouseleave$1\")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!==\"undefined\"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(\" \");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||\"\").split(\".\").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(\".\")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent(\"on\"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||\"\")).split(\" \");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp(\"(^|\\\\.)\"+bC.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH===\"**\"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,[\"events\",\"handle\"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf(\"!\")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(\".\")>=0){bx=bG.split(\".\");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv===\"object\"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(\".\");bv.namespace_re=bv.namespace?new RegExp(\"(^|\\\\.)\"+bx.join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;by=bG.indexOf(\":\")<0?\"on\"+bG:\"\";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,\"events\")||{})[bv.type]&&b._data(bH,\"handle\");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG===\"click\"&&b.nodeName(bA,\"a\"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!==\"focus\"&&bG!==\"blur\")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,\"events\")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type===\"click\")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:\"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusout\"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent(\"on\"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,\"form\")){return false}b.event.add(this,\"click._submit keypress._submit\",function(bx){var bw=bx.target,bv=b.nodeName(bw,\"input\")||b.nodeName(bw,\"button\")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,\"submit._submit\",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate(\"submit\",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,\"form\")){return false}b.event.remove(this,\"._submit\")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type===\"checkbox\"||this.type===\"radio\"){b.event.add(this,\"propertychange._change\",function(e){if(e.originalEvent.propertyName===\"checked\"){this._just_changed=true}});b.event.add(this,\"click._change\",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate(\"change\",this,e,true)}})}return false}b.event.add(this,\"beforeactivate._change\",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,\"change._change\",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate(\"change\",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!==\"radio\"&&e.type!==\"checkbox\")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,\"._change\");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:\"focusin\",blur:\"focusout\"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw===\"object\"){if(typeof e!==\"string\"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e===\"string\"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+\".\"+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw===\"object\"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e===\"function\"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||\"**\",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,\"**\"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,\"lastToggle\"+bx.guid)||0)%bw;b._data(this,\"lastToggle\"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each((\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\").split(\" \"),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2011, The Dojo Foundation\n *  Released under the MIT, BSD, and GPL Licenses.\n *  More information: http://sizzlejs.com/\n */\n(function(){var bH=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,bC=\"sizcache\"+(Math.random()+\"\").replace(\".\",\"\"),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\\\/g,bO=/\\r\\n/g,bQ=/\\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!==\"string\"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec(\"\");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]===\"~\"||bW[0]===\"+\")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=\"\"}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)===\"[object Array]\"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!==\"\\\\\"){bT[1]=(bT[1]||\"\").replace(bK,\"\");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],\"\");break}}}}if(!bW){bW=typeof e.getElementsByTagName!==\"undefined\"?e.getElementsByTagName(\"*\"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)===\"\\\\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],\"\");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR=\"\";if(e){if(e===1||e===9){if(typeof bU.textContent===\"string\"){return bU.textContent}else{if(typeof bU.innerText===\"string\"){return bU.innerText.replace(bO,\"\")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(e){return e.getAttribute(\"href\")},type:function(e){return e.getAttribute(\"type\")}},relative:{\"+\":function(bW,bR){var bT=typeof bR===\"string\",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},\">\":function(bW,bR){var bV,bU=typeof bR===\"string\",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},\"\":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR===\"string\"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e(\"parentNode\",bR,bS,bT,bU,bV)},\"~\":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR===\"string\"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e(\"previousSibling\",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!==\"undefined\"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!==\"undefined\"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute(\"name\")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!==\"undefined\"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=\" \"+bT[1].replace(bK,\"\")+\" \";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(\" \"+bV.className+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,\"\")},TAG:function(bR,e){return bR[1].replace(bK,\"\").toLowerCase()},CHILD:function(e){if(e[1]===\"nth\"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\\+|\\s*/g,\"\");var bR=/(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(e[2]===\"even\"&&\"2n\"||e[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(e[2])&&\"0n+\"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,\"\");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||\"\").replace(bK,\"\");if(bU[2]===\"~=\"){bU[4]=\" \"+bU[4]+\" \"}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]===\"not\"){if((bH.exec(bU[3])||\"\").length>1||/^\\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!==\"hidden\"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute(\"type\"),bR=bS.type;return bS.nodeName.toLowerCase()===\"input\"&&\"text\"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"radio\"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===e.type},file:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"file\"===e.type},password:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"password\"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e===\"input\"||e===\"button\")&&\"submit\"===bR.type},image:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"image\"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e===\"input\"||e===\"button\")&&\"reset\"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e===\"input\"&&\"button\"===bR.type||e===\"button\"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e===\"contains\"){return(bS.textContent||bS.innerText||bw([bS])||\"\").indexOf(bX[3])>=0}else{if(e===\"not\"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case\"only\":case\"first\":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX===\"first\"){return true}bR=bS;case\"last\":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case\"nth\":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute(\"id\")===e},TAG:function(bR,e){return(e===\"*\"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(\" \"+(bR.className||bR.getAttribute(\"class\"))+\" \").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+\"\",bU=bT[2],bR=bT[4];return e==null?bU===\"!=\":!bU&&by.attr?e!=null:bU===\"=\"?bW===bR:bU===\"*=\"?bW.indexOf(bR)>=0:bU===\"~=\"?(\" \"+bW+\" \").indexOf(bR)>=0:!bR?bW&&e!==false:bU===\"!=\"?bW!==bR:bU===\"^=\"?bW.indexOf(bR)===0:bU===\"$=\"?bW.substr(bW.length-bR.length)===bR:bU===\"|=\"?bW===bR||bW.substr(0,bR.length+1)===bR+\"-\":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return\"\\\\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\\[]*\\])(?![^\\(]*\\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+bE.match[bz].source.replace(/\\\\(\\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)===\"[object Array]\"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length===\"number\"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement(\"div\"),bS=\"script\"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML=\"<a name='\"+bS+\"'/>\";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!==\"undefined\"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!==\"undefined\"&&bT.getAttributeNode(\"id\").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!==\"undefined\"&&bV.getAttributeNode(\"id\");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement(\"div\");e.appendChild(av.createComment(\"\"));if(e.getElementsByTagName(\"*\").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]===\"*\"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML=\"<a href='#'></a>\";if(e.firstChild&&typeof e.firstChild.getAttribute!==\"undefined\"&&e.firstChild.getAttribute(\"href\")!==\"#\"){bE.attrHandle.href=function(bR){return bR.getAttribute(\"href\",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement(\"div\"),bS=\"__sizzle__\";bT.innerHTML=\"<p class='TEST'></p>\";if(bT.querySelectorAll&&bT.querySelectorAll(\".TEST\").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4===\"body\"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!==\"object\"){var bW=bV,bX=bV.getAttribute(\"id\"),bU=bX||bS,b6=bV.parentNode,b5=/^\\s*[+~]/.test(b4);if(!bX){bV.setAttribute(\"id\",bU)}else{bU=bU.replace(/'/g,\"\\\\$&\")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll(\"[id='\"+bU+\"'] \"+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute(\"id\")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement(\"div\"),\"div\"),bR=false;try{bS.call(av.documentElement,\"[test!='']:sizzle\")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement(\"div\");e.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(!e.getElementsByClassName||e.getElementsByClassName(\"e\").length===0){return}e.lastChild.className=\"e\";if(e.getElementsByClassName(\"e\").length===1){return}bE.order.splice(1,0,\"CLASS\");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!==\"undefined\"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!==\"string\"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!==\"HTML\":false};var bM=function(bS,e,bW){var bV,bX=[],bU=\"\",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,\"\")}bS=bE.relative[bS]?bS+\"*\":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[\":\"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!==\"string\"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack(\"\",\"find\",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),\"not\",e)},filter:function(e){return this.pushStack(aG(this,e,true),\"filter\",e)},is:function(e){return !!e&&(typeof e===\"string\"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!==\"string\"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,\"closest\",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e===\"string\"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e===\"string\"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,\"parentNode\")},parentsUntil:function(bv,e,bw){return b.dir(bv,\"parentNode\",bw)},next:function(e){return b.nth(e,2,\"nextSibling\")},prev:function(e){return b.nth(e,2,\"previousSibling\")},nextAll:function(e){return b.dir(e,\"nextSibling\")},prevAll:function(e){return b.dir(e,\"previousSibling\")},nextUntil:function(bv,e,bw){return b.dir(bv,\"nextSibling\",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,\"previousSibling\",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,\"iframe\")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw===\"string\"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(\",\"))}});b.extend({filter:function(bw,e,bv){if(bv){bw=\":not(\"+bw+\")\"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw===\"string\"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split(\"|\"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR=\"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",ag=/ jQuery\\d+=\"(?:\\d+|null)\"/g,ar=/^\\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,d=/<([\\w:]+)/,w=/<tbody/i,W=/<|&#?\\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp(\"<(?:\"+aR+\")\",\"i\"),o=/checked\\s*(?:[^=]|=\\s*.checked.)/i,bm=/\\/(java|ecma)script/i,aN=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,ax={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\"\",\"\"]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,\"div<div>\",\"</div>\"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!==\"object\"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,\"body\")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,\"before\",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,\"after\",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName(\"*\"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName(\"*\"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,\"\"):null}else{if(typeof bx===\"string\"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||[\"\",\"\"])[1].toLowerCase()]){bx=bx.replace(R,\"<$1></$2>\");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName(\"*\"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!==\"string\"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),\"replaceWith\",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC===\"string\"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,\"tr\");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,\"table\")?(e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?\".\":\"\")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw===\"object\"){e.outerHTML=bv.outerHTML}else{if(bw===\"input\"&&(bv.type===\"checkbox\"||bv.type===\"radio\")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw===\"option\"){e.selected=bv.defaultSelected}else{if(bw===\"input\"||bw===\"textarea\"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB===\"string\"&&bB.length<512&&bA===av&&bB.charAt(0)===\"<\"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!==\"undefined\"){return e.getElementsByTagName(\"*\")}else{if(typeof e.querySelectorAll!==\"undefined\"){return e.querySelectorAll(\"*\")}else{return[]}}}function az(e){if(e.type===\"checkbox\"||e.type===\"radio\"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||\"\").toLowerCase();if(bv===\"input\"){az(e)}else{if(bv!==\"script\"&&typeof e.getElementsByTagName!==\"undefined\"){b.grep(e.getElementsByTagName(\"input\"),az)}}}function al(e){var bv=av.createElement(\"div\");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test(\"<\"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement===\"undefined\"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz===\"number\"){bz+=\"\"}if(!bz){continue}if(typeof bz===\"string\"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,\"<$1></$2>\");var bK=(d.exec(bz)||[\"\",\"\"])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement(\"div\");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK===\"table\"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===\"<table>\"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],\"tbody\")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)===\"number\"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],\"script\")&&(!bI[bE].type||bI[bE].type.toLowerCase()===\"text/javascript\")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName(\"script\"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:\"script\"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||\"\").replace(aN,\"/*$0*/\"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\\([^)]*\\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\\d+(?:px)?$/i,bn=/^-?\\d/,I=/^([\\-+])=([\\-+.\\de]+)/,a7={position:\"absolute\",visibility:\"hidden\",display:\"block\"},an=[\"Left\",\"Right\"],a1=[\"Top\",\"Bottom\"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,\"opacity\",\"opacity\");return e===\"\"?\"1\":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{\"float\":b.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC===\"string\"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC=\"number\"}if(bD==null||bC===\"number\"&&isNaN(bD)){return}if(bC===\"number\"&&!b.cssNumber[bz]){bD+=\"px\"}if(!bE||!(\"set\" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&\"get\" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx===\"cssFloat\"){bx=\"float\"}if(e&&\"get\" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each([\"height\",\"width\"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+\"px\"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||\"\")?(parseFloat(RegExp.$1)/100)+\"\":e?\"1\":\"\"},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?\"alpha(opacity=\"+bz*100+\")\":\"\",bw=bv&&bv.filter||bx.filter||\"\";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,\"\"))===\"\"){bx.removeAttribute(\"filter\");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+\" \"+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:\"inline-block\"},function(){if(bv){e=Z(bw,\"margin-right\",\"marginRight\")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,\"-$1\").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===\"\"&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw===\"fontSize\"?\"1em\":(bv||0);bv=bx.pixelLeft+\"px\";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===\"\"?\"auto\":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw===\"width\"?by.offsetWidth:by.offsetHeight,bz=bw===\"width\"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!==\"border\"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,\"padding\"+bz[bx]))||0}if(bv===\"margin\"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,\"border\"+bz[bx]+\"Width\"))||0}}}return bA+\"px\"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,\"padding\"+bz[bx]))||0;if(bv!==\"padding\"){bA+=parseFloat(b.css(by,\"border\"+bz[bx]+\"Width\"))||0}if(bv===\"margin\"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+\"px\"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,\"display\"))===\"none\")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\\[\\]$/,bs=/\\r?\\n/g,bq=/#.*$/,aD=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\\/\\//,M=/\\?/,a6=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,q=/^(?:select|textarea)/i,h=/\\s+/,br=/([?&])_=[^&]*/,K=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=[\"*/\"]+[\"*\"];try{aE=bl.href}catch(aw){aE=av.createElement(\"a\");aE.href=\"\";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!==\"string\"){bA=by;by=\"*\"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\\+/.test(bv);if(bC){bv=bv.substr(1)||\"*\"}bB=e[bv]=e[bv]||[];bB[bC?\"unshift\":\"push\"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC===\"string\"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx[\"*\"]){bC=aW(bv,bE,bz,bD,\"*\",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!==\"string\"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(\" \");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx=\"GET\";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz===\"object\"){bz=b.param(bz,b.ajaxSettings.traditional);bx=\"POST\"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:\"html\",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b(\"<div>\").append(bD.replace(a6,\"\")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,\"\\r\\n\")}}):{name:bv.name,value:bw.replace(bs,\"\\r\\n\")}}).get()}});b.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each([\"get\",\"post\"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,\"script\")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,\"json\")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:true,async:true,accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json, text/javascript\",\"*\":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"* text\":bb.String,\"text html\":true,\"text json\":b.parseJSON,\"text xml\":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz===\"object\"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks(\"once memory\"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||\"abort\";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||\"\";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader(\"Last-Modified\"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader(\"Etag\"))){b.etag[bC]=b2}}if(bZ===304){bX=\"notmodified\";bT=true}else{try{b4=G(bD,bY);bX=\"success\";bT=true}catch(b1){bX=\"parsererror\";b3=b1}}}else{b3=bX;if(!bX||bZ){bX=\"error\";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=\"\"+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger(\"ajax\"+(bT?\"Success\":\"Error\"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger(\"ajaxComplete\",[bJ,bD]);if(!(--b.active)){b.event.trigger(\"ajaxStop\")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+\"\").replace(bq,\"\").replace(c,s[1]+\"//\");bD.dataTypes=b.trim(bD.dataType||\"*\").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]===\"http:\"?80:443))!=(s[3]||(s[1]===\"http:\"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!==\"string\"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger(\"ajaxStart\")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?\"&\":\"?\")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,\"$1_=\"+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?\"&\":\"?\")+\"_=\"+bv:\"\")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader(\"Content-Type\",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader(\"If-Modified-Since\",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader(\"If-None-Match\",b.etag[bC])}}bJ.setRequestHeader(\"Accept\",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!==\"*\"?\", \"+aV+\"; q=0.01\":\"\"):bD.accepts[\"*\"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,\"No Transport\")}else{bJ.readyState=1;if(bw){bG.trigger(\"ajaxSend\",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort(\"timeout\")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+\"=\"+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join(\"&\").replace(k,\"+\")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+\"[\"+(typeof bz===\"object\"||b.isArray(bz)?bA:\"\")+\"]\",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by===\"object\"){for(var e in by){v(bw+\"[\"+e+\"]\",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]===\"*\"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader(\"content-type\")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+\" \"+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE===\"string\"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC===\"*\"){bC=bx}else{if(bx!==\"*\"&&bx!==bC){by=bx+\" \"+bC;bF=bG[by]||bG[\"* \"+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(\" \");if(bB[0]===bx||bB[0]===\"*\"){e=bG[bB[1]+\" \"+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error(\"No conversion from \"+by.replace(\" \",\" to \"))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\\=)\\?(&|$)|\\?\\?/i;b.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){return b.expando+\"_\"+(aC++)}});b.ajaxPrefilter(\"json jsonp\",function(bD,bA,bC){var bx=bD.contentType===\"application/x-www-form-urlencoded\"&&(typeof bD.data===\"string\");if(bD.dataTypes[0]===\"jsonp\"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv=\"$1\"+bw+\"$2\";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\\?/.test(e)?\"&\":\"?\")+bD.jsonp+\"=\"+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters[\"script json\"]=function(){if(!bB){b.error(bw+\" was not called\")}return bB[0]};bD.dataTypes[0]=\"json\";return\"script\"}});b.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text script\":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter(\"script\",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type=\"GET\";e.global=false}});b.ajaxTransport(\"script\",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName(\"head\")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement(\"script\");e.async=\"async\";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,\"success\")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&(\"withCredentials\" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB[\"X-Requested-With\"]){bB[\"X-Requested-With\"]=\"XMLHttpRequest\"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=\"\"}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,a3,aH=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0(\"show\",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,\"olddisplay\")&&by===\"none\"){by=bw.style.display=\"\"}if(by===\"\"&&b.css(bw,\"display\")===\"none\"){b._data(bw,\"olddisplay\",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===\"\"||by===\"none\"){bw.style.display=b._data(bw,\"olddisplay\")||\"\"}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0(\"hide\",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,\"display\");if(by!==\"none\"&&!b._data(bw,\"olddisplay\")){b._data(bw,\"olddisplay\",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display=\"none\"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw===\"boolean\";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(\":hidden\");b(this)[by?\"show\":\"hide\"]()})}else{this.animate(a0(\"toggle\",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(\":hidden\").css(\"opacity\",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(\":hidden\"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||\"swing\"}if(bF===\"hide\"&&bI||bF===\"show\"&&!bI){return bE.complete.call(this)}if(bK&&(bB===\"height\"||bB===\"width\")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,\"display\")===\"inline\"&&b.css(this,\"float\")===\"none\"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)===\"inline\"){this.style.display=\"inline-block\"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow=\"hidden\"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,\"toggle\"+bD)||(bF===\"toggle\"?bI?\"show\":\"hide\":0);if(bA){b._data(this,\"toggle\"+bD,bA===\"show\"?\"hide\":\"show\");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?\"\":\"px\");if(bL!==\"px\"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]===\"-=\"?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,\"\")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!==\"string\"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||\"fx\",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(\".run\")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+\".run\"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0(\"show\",1),slideUp:a0(\"hide\",1),slideToggle:a0(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw===\"object\"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration===\"number\"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue=\"fx\"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv===\"auto\"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?\"\":\"px\");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,\"fxshow\"+e.prop)===L){b._data(e.elem,\"fxshow\"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,\"fxshow\"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each([\"\",\"X\",\"Y\"],function(bC,bD){bz.style[\"overflow\"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,\"fxshow\"+bA,true);b.removeData(bz,\"toggle\"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,\"opacity\",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each([\"width\",\"height\"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b(\"<\"+bx+\">\").appendTo(e),bw=bv.css(\"display\");bv.remove();if(bw===\"none\"||bw===\"\"){if(!a8){a8=av.createElement(\"iframe\");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode===\"CSS1Compat\"?\"<!doctype html>\":\"\")+\"<html><body>\");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,\"display\");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if(\"getBoundingClientRect\" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position===\"fixed\"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!==\"visible\"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position===\"relative\"||e.position===\"static\"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position===\"fixed\"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,\"marginTop\"))||0;bv+=parseFloat(b.css(e,\"marginLeft\"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,\"position\");if(bB===\"static\"){bx.style.position=\"relative\"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,\"top\"),bE=b.css(bx,\"left\"),bF=(bB===\"absolute\"||bB===\"fixed\")&&b.inArray(\"auto\",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if(\"using\" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,\"marginTop\"))||0;bx.left-=parseFloat(b.css(bw,\"marginLeft\"))||0;e.top+=parseFloat(b.css(bv[0],\"borderTopWidth\"))||0;e.left+=parseFloat(b.css(bv[0],\"borderLeftWidth\"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,\"position\")===\"static\")){e=e.offsetParent}return e})}});b.each([\"Left\",\"Top\"],function(bv,e){var bw=\"scroll\"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?(\"pageXOffset\" in by)?by[bv?\"pageYOffset\":\"pageXOffset\"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each([\"Height\",\"Width\"],function(bv,e){var bw=e.toLowerCase();b.fn[\"inner\"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,\"padding\")):this[bw]():null};b.fn[\"outer\"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?\"margin\":\"border\")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement[\"client\"+e],bx=bA.document.body;return bA.document.compatMode===\"CSS1Compat\"&&bB||bx&&bx[\"client\"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement[\"client\"+e],bA.body[\"scroll\"+e],bA.documentElement[\"scroll\"+e],bA.body[\"offset\"+e],bA.documentElement[\"offset\"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz===\"string\"?bz:bz+\"px\")}}}}});bb.jQuery=bb.$=b;if(typeof define===\"function\"&&define.amd&&define.amd.jQuery){define(\"jquery\",[],function(){return b})}})(window);/*!\n * jQuery UI 1.8.18\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI\n */\n(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:\"1.8.18\",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e===\"number\"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css(\"position\")))||(/absolute/).test(this.css(\"position\"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,\"position\",1))&&(/(auto|scroll)/).test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0)}return(/fixed/).test(this.css(\"position\"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css(\"zIndex\",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css(\"position\");if(e===\"absolute\"||e===\"relative\"||e===\"fixed\"){g=parseInt(f.css(\"zIndex\"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}});a.each([\"Width\",\"Height\"],function(g,e){var f=e===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,\"padding\"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,\"border\"+this+\"Width\",true))||0}if(n){l-=parseFloat(a.curCSS(m,\"margin\"+this,true))||0}});return l}a.fn[\"inner\"+e]=function(i){if(i===d){return k[\"inner\"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+\"px\")})};a.fn[\"outer\"+e]=function(i,l){if(typeof i!==\"number\"){return k[\"outer\"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+\"px\")})}});function c(g,e){var j=g.nodeName.toLowerCase();if(\"area\"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!==\"map\"){return false}f=a(\"img[usemap=#\"+h+\"]\")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:\"a\"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,\"visibility\")===\"hidden\"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[\":\"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,\"tabindex\")))},tabbable:function(g){var e=a.attr(g,\"tabindex\"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement(\"div\"));f.offsetHeight;a.extend(f.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart=\"onselectstart\" in f;e.removeChild(f).style.display=\"none\"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css(\"overflow\")===\"hidden\"){return false}var e=(f&&f===\"left\")?\"scrollLeft\":\"scrollTop\",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!\n * jQuery UI Widget 1.8.18\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Widget\n */\n(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler(\"remove\")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b(\"*\",this).add([this]).each(function(){try{b(this).triggerHandler(\"remove\")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(\".\")[0],j;f=f.split(\".\")[1];j=g+\"-\"+f;if(!e){e=h;h=b.Widget}b.expr[\":\"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i===\"string\",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)===\"_\"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind(\"remove.\"+this.widgetName,function(){e.destroy()});this._create();this._trigger(\"create\");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind(\".\"+this.widgetName).removeData(this.widgetName);this.widget().unbind(\".\"+this.widgetName).removeAttr(\"aria-disabled\").removeClass(this.widgetBaseClass+\"-disabled ui-state-disabled\")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f===\"string\"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e===\"disabled\"){this.widget()[f?\"addClass\":\"removeClass\"](this.widgetBaseClass+\"-disabled ui-state-disabled\").attr(\"aria-disabled\",f)}return this},enable:function(){return this._setOption(\"disabled\",false)},disable:function(){return this._setOption(\"disabled\",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!\n * jQuery UI Mouse 1.8.18\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Mouse\n *\n * Depends:\n *\tjquery.ui.widget.js\n */\n(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget(\"ui.mouse\",{options:{cancel:\":input,option\",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind(\"mousedown.\"+this.widgetName,function(e){return d._mouseDown(e)}).bind(\"click.\"+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+\".preventClickEvent\")){b.removeData(e.target,d.widgetName+\".preventClickEvent\");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind(\".\"+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel==\"string\"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+\".preventClickEvent\")){b.removeData(f.target,this.widgetName+\".preventClickEvent\")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).bind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+\".preventClickEvent\",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget(\"ui.resizable\",c.ui.mouse,{widgetEventPrefix:\"resize\",options:{alsoResize:false,animate:false,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:\"e,s,se\",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass(\"ui-resizable\");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||\"ui-resizable-helper\":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class=\"ui-wrapper\" style=\"overflow: hidden;\"></div>').css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")}));this.element=this.element.parent().data(\"resizable\",this.element.data(\"resizable\"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css(\"marginLeft\"),marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css(\"resize\");this.originalElement.css(\"resize\",\"none\");this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"}));this.originalElement.css({margin:this.originalElement.css(\"margin\")});this._proportionallyResize()}this.handles=k.handles||(!c(\".ui-resizable-handle\",this.element).length?\"e,s,se\":{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"});if(this.handles.constructor==String){if(this.handles==\"all\"){this.handles=\"n,e,s,w,se,sw,ne,nw\"}var l=this.handles.split(\",\");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e=\"ui-resizable-\"+j;var h=c('<div class=\"ui-resizable-handle '+e+'\"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if(\"se\"==j){h.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\")}this.handles[j]=\".ui-resizable-\"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=[\"padding\",/ne|nw|n/.test(n)?\"Top\":/se|sw|s/.test(n)?\"Bottom\":/^e$/.test(n)?\"Right\":\"Left\"].join(\"\");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(\".ui-resizable-handle\",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:\"se\"}});if(k.autoHide){this._handles.hide();c(this.element).addClass(\"ui-resizable-autohide\").hover(function(){if(k.disabled){return}c(this).removeClass(\"ui-resizable-autohide\");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass(\"ui-resizable-autohide\");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\").removeData(\"resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css(\"position\"),width:f.outerWidth(),height:f.outerHeight(),top:f.css(\"top\"),left:f.css(\"left\")})).remove()}this.originalElement.css(\"resize\",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(\".ui-draggable\")||(/absolute/).test(e.css(\"position\"))){e.css({position:\"absolute\",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css(\"left\")),h=b(this.helper.css(\"top\"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio==\"number\")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(\".ui-resizable-\"+this.axis).css(\"cursor\");c(\"body\").css(\"cursor\",i==\"auto\"?this.axis+\"-resize\":i);e.addClass(\"ui-resizable-resizing\");this._propagate(\"start\",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate(\"resize\",e);h.css({top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.size.width+\"px\",height:this.size.height+\"px\"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger(\"resize\",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],\"left\")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css(\"left\"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css(\"top\"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c(\"body\").css(\"cursor\",\"auto\");this.element.removeClass(\"ui-resizable-resizing\");this._propagate(\"stop\",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e==\"sw\"){h.left=j.left+(f.width-h.width);h.top=null}if(e==\"nw\"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css(\"borderTopWidth\"),h.css(\"borderRightWidth\"),h.css(\"borderBottomWidth\"),h.css(\"borderLeftWidth\")],j=[h.css(\"paddingTop\"),h.css(\"paddingRight\"),h.css(\"paddingBottom\"),h.css(\"paddingLeft\")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(\":hidden\")||c(g).parents(\":hidden\").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style=\"overflow:hidden;\"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:\"absolute\",left:this.elementOffset.left-g+\"px\",top:this.elementOffset.top-g+\"px\",zIndex:++i.zIndex});this.helper.appendTo(\"body\").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!=\"resize\"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:\"1.8.18\"});c.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(f,g){var e=c(this).data(\"resizable\"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data(\"resizable-alsoresize\",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css(\"left\"),10),top:parseInt(k.css(\"top\"),10)})})};if(typeof(i.alsoResize)==\"object\"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data(\"resizable\"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data(\"resizable-alsoresize\"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)==\"object\"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData(\"resizable-alsoresize\")}});c.ui.plugin.add(\"resizable\",\"animate\",{stop:function(i,n){var p=c(this).data(\"resizable\"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],\"left\")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css(\"left\"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css(\"top\"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css(\"width\"),10),height:parseInt(p.element.css(\"height\"),10),top:parseInt(p.element.css(\"top\"),10),left:parseInt(p.element.css(\"left\"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate(\"resize\",i)}})}});c.ui.plugin.add(\"resizable\",\"containment\",{start:function(f,r){var t=c(this).data(\"resizable\"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(p,o){i[p]=b(n.css(\"padding\"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,\"left\")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data(\"resizable\"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css(\"position\"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css(\"position\"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data(\"resizable\"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css(\"position\"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css(\"position\"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add(\"resizable\",\"ghost\",{start:function(g,h){var e=c(this).data(\"resizable\"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:\"block\",position:\"relative\",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass(\"ui-resizable-ghost\").addClass(typeof i.ghost==\"string\"?i.ghost:\"\");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data(\"resizable\"),h=e.options;if(e.ghost){e.ghost.css({position:\"relative\",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data(\"resizable\"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add(\"resizable\",\"grid\",{resize:function(e,m){var p=c(this).data(\"resizable\"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid==\"number\"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!\n * jQuery hashchange event - v1.3 - 7/21/2010\n * http://benalman.com/projects/jquery-hashchange-plugin/\n * \n * Copyright (c) 2010 \"Cowboy\" Ben Alman\n * Dual licensed under the MIT and GPL licenses.\n * http://benalman.com/about/license/\n */\n(function($,e,b){var c=\"hashchange\",h=document,f,g=$.event.special,i=h.documentMode,d=\"on\"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return\"#\"+j.replace(/^[^#]*#?(.*)$/,\"$1\")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,\"\")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex=\"-1\" title=\"empty\"/>').hide().one(\"load\",function(){r||l(a());n()}).attr(\"src\",r||\"javascript:0\").insertAfter(\"body\")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName===\"title\"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain=\"'+t+'\"<\\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:\"xy\",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),[\"iframe\",\"#document\",\"html\",\"body\"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode==\"BackCompat\"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e==\"object\"){d=e;e=0}if(typeof d==\"function\"){d={onAfter:d}}if(f==\"max\"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is(\"html,body\");switch(typeof k){case\"number\":case\"string\":if(/^([+-]=)?\\d+(\\.\\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case\"object\":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(\"\"),function(q,r){var s=r==\"x\"?\"Left\":\"Top\",u=s.toLowerCase(),p=\"scroll\"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css(\"margin\"+s))||0;g[p]-=parseInt(k.css(\"border\"+s+\"Width\"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r==\"x\"?\"width\":\"height\"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)==\"%\"?parseFloat(t)/100*n:t}if(/^\\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i==\"x\"?\"Width\":\"Height\",e=\"scroll\"+h;if(!c(j).is(\"html,body\")){return j[e]-c(j)[h.toLowerCase()]()}var g=\"client\"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d==\"object\"?d:{top:d,left:d}}})(jQuery);/*!\n PowerTip - v1.2.0 - 2013-04-03\n http://stevenbenner.github.com/jquery-powertip/\n Copyright (c) 2013 Steven Benner (http://stevenbenner.com/).\n Released under MIT license.\n https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt\n*/\n(function(a){if(typeof define===\"function\"&&define.amd){define([\"jquery\"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k(\"body\");var n=\"displayController\",e=\"hasActiveHover\",d=\"forcedOpen\",u=\"hasMouseMove\",f=\"mouseOnToPopup\",g=\"originalTitle\",y=\"powertip\",o=\"powertipjq\",l=\"powertiptarget\",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)===\"string\"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr(\"title\");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr(\"title\")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({\"mouseenter.powertip\":function J(P){k.powerTip.show(this,P)},\"mouseleave.powertip\":function L(){k.powerTip.hide(this)},\"focus.powertip\":function K(){k.powerTip.show(this)},\"blur.powertip\":function H(){k.powerTip.hide(this,true)},\"keydown.powertip\":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:\"powerTip\",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:\"n\",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:[\"n\",\"ne\",\"nw\",\"s\"],e:[\"e\",\"ne\",\"se\",\"w\",\"nw\",\"sw\",\"n\",\"s\",\"e\"],s:[\"s\",\"se\",\"sw\",\"n\"],w:[\"w\",\"nw\",\"sw\",\"e\",\"ne\",\"se\",\"n\",\"s\",\"w\"],nw:[\"nw\",\"w\",\"sw\",\"n\",\"s\",\"se\",\"nw\"],ne:[\"ne\",\"e\",\"se\",\"n\",\"s\",\"sw\",\"ne\"],sw:[\"sw\",\"w\",\"nw\",\"s\",\"n\",\"ne\",\"sw\"],se:[\"se\",\"e\",\"ne\",\"s\",\"n\",\"nw\",\"se\"],\"nw-alt\":[\"nw-alt\",\"n\",\"ne-alt\",\"sw-alt\",\"s\",\"se-alt\",\"w\",\"e\"],\"ne-alt\":[\"ne-alt\",\"n\",\"nw-alt\",\"se-alt\",\"s\",\"sw-alt\",\"e\",\"w\"],\"sw-alt\":[\"sw-alt\",\"s\",\"se-alt\",\"nw-alt\",\"n\",\"ne-alt\",\"w\",\"e\"],\"se-alt\":[\"se-alt\",\"s\",\"sw-alt\",\"ne-alt\",\"n\",\"nw-alt\",\"e\",\"w\"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(\".powertip\").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr(\"title\",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top=\"auto\";F.left=\"auto\";F.right=\"auto\";F.bottom=\"auto\";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split(\"-\")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case\"n\":N.set(\"left\",I.left-(J/2));N.set(\"bottom\",c.windowHeight-I.top+P);break;case\"e\":N.set(\"left\",I.left+P);N.set(\"top\",I.top-(O/2));break;case\"s\":N.set(\"left\",I.left-(J/2));N.set(\"top\",I.top+P);break;case\"w\":N.set(\"top\",I.top-(O/2));N.set(\"right\",c.windowWidth-I.left+P);break;case\"nw\":N.set(\"bottom\",c.windowHeight-I.top+P);N.set(\"right\",c.windowWidth-I.left-20);break;case\"nw-alt\":N.set(\"left\",I.left);N.set(\"bottom\",c.windowHeight-I.top+P);break;case\"ne\":N.set(\"left\",I.left-20);N.set(\"bottom\",c.windowHeight-I.top+P);break;case\"ne-alt\":N.set(\"bottom\",c.windowHeight-I.top+P);N.set(\"right\",c.windowWidth-I.left);break;case\"sw\":N.set(\"top\",I.top+P);N.set(\"right\",c.windowWidth-I.left-20);break;case\"sw-alt\":N.set(\"left\",I.left);N.set(\"top\",I.top+P);break;case\"se\":N.set(\"left\",I.left-20);N.set(\"top\",I.top+P);break;case\"se-alt\":N.set(\"top\",I.top+P);N.set(\"right\",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case\"n\":M=O.left+N/2;L=O.top;break;case\"e\":M=O.left+N;L=O.top+I/2;break;case\"s\":M=O.left+N/2;L=O.top+I;break;case\"w\":M=O.left;L=O.top+I/2;break;case\"nw\":M=O.left;L=O.top;break;case\"ne\":M=O.left+N;L=O.top;break;case\"sw\":M=O.left;L=O.top+I;break;case\"se\":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest(\"svg\")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=[\"nw\",\"n\",\"ne\",\"e\",\"se\",\"s\",\"sw\",\"w\"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k(\"#\"+Q.popupId);if(O.length===0){O=k(\"<div/>\",{id:Q.popupId});if(w.length===0){w=k(\"body\")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on(\"mousemove\",M);s.on(\"scroll\",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger(\"powerTipPreRender\");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger(\"powerTipRender\");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger(\"powerTipOpen\")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set(\"top\",c.currentY+Q.offset);T.set(\"left\",c.currentX+Q.offset);O.css(T);R.trigger(\"powerTipClose\")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set(\"top\",c.currentY+Q.offset);U.set(\"left\",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set(\"left\",c.windowWidth-R)}else{if(S===p.bottom){U.set(\"top\",c.scrollTop+c.windowHeight-V)}}}else{U.set(\"left\",c.currentX-R-Q.offset);U.set(\"top\",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set(\"top\",0);V.set(\"left\",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(\":disabled\")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(\":focus\")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on(\"mousemove\",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k(\"#\"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));"
  },
  {
    "path": "external/glm/doc/api/man.doxy",
    "content": "# Doxyfile 1.8.10\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a double hash (##) is considered a comment and is placed in\n# front of the TAG it is preceding.\n#\n# All text after a single hash (#) is considered a comment and will be ignored.\n# The format is:\n# TAG = value [value, ...]\n# For lists, items can also be appended using:\n# TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\\\" \\\").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all text\n# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv\n# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv\n# for the list of possible encodings.\n# The default value is: UTF-8.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by\n# double-quotes, unless you are using Doxywizard) that should identify the\n# project for which the documentation is generated. This name is used in the\n# title of most generated pages and in a few other places.\n# The default value is: My Project.\n\nPROJECT_NAME           = \"0.9.9 API documenation\"\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. This\n# could be handy for archiving the generated documentation or if some version\n# control system is used.\n\nPROJECT_NUMBER         = \n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer a\n# quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = \n\n# With the PROJECT_LOGO tag one can specify a logo or an icon that is included\n# in the documentation. The maximum height of the logo should not exceed 55\n# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy\n# the logo to the output directory.\n\nPROJECT_LOGO           = G:/Source/G-Truc/glm/doc/manual/logo-mini.png\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path\n# into which the generated documentation will be written. If a relative path is\n# entered, it will be relative to the location where doxygen was started. If\n# left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = .\n\n# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-\n# directories (in 2 levels) under the output directory of each output format and\n# will distribute the generated files over these directories. Enabling this\n# option can be useful when feeding doxygen a huge amount of source files, where\n# putting all generated files in the same directory would otherwise causes\n# performance problems for the file system.\n# The default value is: NO.\n\nCREATE_SUBDIRS         = NO\n\n# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII\n# characters to appear in the names of generated files. If set to NO, non-ASCII\n# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode\n# U+3044.\n# The default value is: NO.\n\nALLOW_UNICODE_NAMES    = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,\n# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),\n# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,\n# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),\n# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,\n# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,\n# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,\n# Ukrainian and Vietnamese.\n# The default value is: English.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member\n# descriptions after the members that are listed in the file and class\n# documentation (similar to Javadoc). Set to NO to disable this.\n# The default value is: YES.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief\n# description of a member or function before the detailed description\n#\n# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n# The default value is: YES.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator that is\n# used to form the text in various listings. Each string in this list, if found\n# as the leading text of the brief description, will be stripped from the text\n# and the result, after processing the whole list, is used as the annotated\n# text. Otherwise, the brief description is used as-is. If left blank, the\n# following values are used ($name is automatically replaced with the name of\n# the entity):The $name class, The $name widget, The $name file, is, provides,\n# specifies, contains, represents, a, an and the.\n\nABBREVIATE_BRIEF       = \"The $name class       \" \\\n                         \"The $name widget       \" \\\n                         \"The $name file       \" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# doxygen will generate a detailed section even if there is only a brief\n# description.\n# The default value is: NO.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n# The default value is: NO.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path\n# before files name in the file list and in the header files. If set to NO the\n# shortest path that makes the file name unique will be used\n# The default value is: YES.\n\nFULL_PATH_NAMES        = NO\n\n# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.\n# Stripping is only done if one of the specified strings matches the left-hand\n# part of the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the path to\n# strip.\n#\n# Note that you can specify absolute paths here, but also relative paths, which\n# will be relative from the directory where doxygen is started.\n# This tag requires that the tag FULL_PATH_NAMES is set to YES.\n\nSTRIP_FROM_PATH        = \"C:/Documents and Settings/Groove/       \"\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the\n# path mentioned in the documentation of a class, which tells the reader which\n# header file to include in order to use a class. If left blank only the name of\n# the header file containing the class definition is used. Otherwise one should\n# specify the list of include paths that are normally passed to the compiler\n# using the -I flag.\n\nSTRIP_FROM_INC_PATH    = \n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but\n# less readable) file names. This can be useful is your file systems doesn't\n# support long names like on DOS, Mac, or CD-ROM.\n# The default value is: NO.\n\nSHORT_NAMES            = YES\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the\n# first line (until the first dot) of a Javadoc-style comment as the brief\n# description. If set to NO, the Javadoc-style will behave just like regular Qt-\n# style comments (thus requiring an explicit @brief command for a brief\n# description.)\n# The default value is: NO.\n\nJAVADOC_AUTOBRIEF      = YES\n\n# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first\n# line (until the first dot) of a Qt-style comment as the brief description. If\n# set to NO, the Qt-style will behave just like regular Qt-style comments (thus\n# requiring an explicit \\brief command for a brief description.)\n# The default value is: NO.\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a\n# multi-line C++ special comment block (i.e. a block of //! or /// comments) as\n# a brief description. This used to be the default behavior. The new default is\n# to treat a multi-line C++ comment block as a detailed description. Set this\n# tag to YES if you prefer the old behavior instead.\n#\n# Note that setting this tag to YES also means that rational rose comments are\n# not recognized any more.\n# The default value is: NO.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the\n# documentation from any documented member that it re-implements.\n# The default value is: YES.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new\n# page for each member. If set to NO, the documentation of a member will be part\n# of the file/class/namespace that contains it.\n# The default value is: NO.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen\n# uses this value to replace tabs by spaces in code fragments.\n# Minimum value: 1, maximum value: 16, default value: 4.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that act as commands in\n# the documentation. An alias has the form:\n# name=value\n# For example adding\n# \"sideeffect=@par Side Effects:\\n\"\n# will allow you to put the command \\sideeffect (or @sideeffect) in the\n# documentation, which will result in a user-defined paragraph with heading\n# \"Side Effects:\". You can put \\n's in the value part of an alias to insert\n# newlines.\n\nALIASES                = \n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding \"class=itcl::class\"\n# will allow you to use the command class in the itcl::class meaning.\n\nTCL_SUBST              = \n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n# only. Doxygen will then generate output that is more tailored for C. For\n# instance, some of the names that are used will be different. The list of all\n# members will be omitted, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or\n# Python sources only. Doxygen will then generate output that is more tailored\n# for that language. For instance, namespaces will be presented as packages,\n# qualified scopes will look different, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources. Doxygen will then generate output that is tailored for Fortran.\n# The default value is: NO.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for VHDL.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension, and\n# language is one of the parsers supported by doxygen: IDL, Java, Javascript,\n# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:\n# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:\n# Fortran. In the later case the parser tries to guess whether the code is fixed\n# or free formatted code, this is the default for Fortran type files), VHDL. For\n# instance to make doxygen treat .inc files as Fortran files (default is PHP),\n# and .f files as C (default is Fortran), use: inc=Fortran f=C.\n#\n# Note: For files without extension you can use no_extension as a placeholder.\n#\n# Note that for custom extensions you also need to set FILE_PATTERNS otherwise\n# the files are not read by doxygen.\n\nEXTENSION_MAPPING      = \n\n# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments\n# according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you can\n# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in\n# case of backward compatibilities issues.\n# The default value is: YES.\n\nMARKDOWN_SUPPORT       = YES\n\n# When enabled doxygen tries to link words that correspond to documented\n# classes, or namespaces to their corresponding documentation. Such a link can\n# be prevented in individual cases by putting a % sign in front of the word or\n# globally by setting AUTOLINK_SUPPORT to NO.\n# The default value is: YES.\n\nAUTOLINK_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should set this\n# tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string);\n# versus func(std::string) {}). This also make the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n# The default value is: NO.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n# The default value is: NO.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:\n# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen\n# will parse them like normal C++ but will assume all classes use public instead\n# of private inheritance when no explicit protection keyword is present.\n# The default value is: NO.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES will make\n# doxygen to replace the get and set methods by a property in the documentation.\n# This will only work if the methods are indeed getting or setting a simple\n# type. If this is not the case, or you want to show the methods anyway, you\n# should set this option to NO.\n# The default value is: YES.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n# The default value is: NO.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# If one adds a struct or class to a group and this option is enabled, then also\n# any nested class or struct is added to the same group. By default this option\n# is disabled and one has to add nested compounds explicitly via \\ingroup.\n# The default value is: NO.\n\nGROUP_NESTED_COMPOUNDS = NO\n\n# Set the SUBGROUPING tag to YES to allow class member groups of the same type\n# (for instance a group of public functions) to be put as a subgroup of that\n# type (e.g. under the Public Functions section). Set it to NO to prevent\n# subgrouping. Alternatively, this can be done per class using the\n# \\nosubgrouping command.\n# The default value is: YES.\n\nSUBGROUPING            = NO\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions\n# are shown inside the group in which they are included (e.g. using \\ingroup)\n# instead of on a separate page (for HTML and Man pages) or section (for LaTeX\n# and RTF).\n#\n# Note that this feature does not work in combination with\n# SEPARATE_MEMBER_PAGES.\n# The default value is: NO.\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions\n# with only public data fields or simple typedef fields will be shown inline in\n# the documentation of the scope in which they are defined (i.e. file,\n# namespace, or group documentation), provided this scope is documented. If set\n# to NO, structs, classes, and unions are shown on a separate page (for HTML and\n# Man pages) or section (for LaTeX and RTF).\n# The default value is: NO.\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or\n# enum is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically be\n# useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n# The default value is: NO.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n# cache is used to resolve symbols given their name and scope. Since this can be\n# an expensive process and often the same symbol appears multiple times in the\n# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small\n# doxygen will become slower. If the cache is too large, memory is wasted. The\n# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range\n# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536\n# symbols. At the end of a run doxygen will report the cache usage and suggest\n# the optimal cache size from a speed point of view.\n# Minimum value: 0, maximum value: 9, default value: 0.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in\n# documentation are documented, even if no documentation was available. Private\n# class members and static file members will be hidden unless the\n# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.\n# Note: This will also disable the warnings about undocumented members that are\n# normally produced when WARNINGS is set to YES.\n# The default value is: NO.\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will\n# be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal\n# scope will be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be\n# included in the documentation.\n# The default value is: NO.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined\n# locally in source files will be included in the documentation. If set to NO,\n# only classes defined in header files are included. Does not have any effect\n# for Java sources.\n# The default value is: YES.\n\nEXTRACT_LOCAL_CLASSES  = NO\n\n# This flag is only useful for Objective-C code. If set to YES, local methods,\n# which are defined in the implementation section but not in the interface are\n# included in the documentation. If set to NO, only methods in the interface are\n# included.\n# The default value is: NO.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base name of\n# the file that contains the anonymous namespace. By default anonymous namespace\n# are hidden.\n# The default value is: NO.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all\n# undocumented members inside documented classes or files. If set to NO these\n# members will be included in the various overviews, but no documentation\n# section is generated. This option has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_MEMBERS     = YES\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy. If set\n# to NO, these classes will be included in the various overviews. This option\n# has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_CLASSES     = YES\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend\n# (class|struct|union) declarations. If set to NO, these declarations will be\n# included in the documentation.\n# The default value is: NO.\n\nHIDE_FRIEND_COMPOUNDS  = YES\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any\n# documentation blocks found inside the body of a function. If set to NO, these\n# blocks will be appended to the function's detailed documentation block.\n# The default value is: NO.\n\nHIDE_IN_BODY_DOCS      = YES\n\n# The INTERNAL_DOCS tag determines if documentation that is typed after a\n# \\internal command is included. If the tag is set to NO then the documentation\n# will be excluded. Set it to YES to include the internal documentation.\n# The default value is: NO.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file\n# names in lower-case letters. If set to YES, upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n# The default value is: system dependent.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with\n# their full class and namespace scopes in the documentation. If set to YES, the\n# scope will be hidden.\n# The default value is: NO.\n\nHIDE_SCOPE_NAMES       = YES\n\n# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will\n# append additional text to a page's title, such as Class Reference. If set to\n# YES the compound reference will be hidden.\n# The default value is: NO.\n\nHIDE_COMPOUND_REFERENCE= NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of\n# the files that are included by a file in the documentation of that file.\n# The default value is: YES.\n\nSHOW_INCLUDE_FILES     = NO\n\n# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each\n# grouped member an include statement to the documentation, telling the reader\n# which file to include in order to use the member.\n# The default value is: NO.\n\nSHOW_GROUPED_MEMB_INC  = NO\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include\n# files with double quotes in the documentation rather than with sharp brackets.\n# The default value is: NO.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the\n# documentation for inline members.\n# The default value is: YES.\n\nINLINE_INFO            = NO\n\n# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the\n# (detailed) documentation of file and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order.\n# The default value is: YES.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief\n# descriptions of file, namespace and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order. Note that\n# this will also influence the order of the classes in the class list.\n# The default value is: NO.\n\nSORT_BRIEF_DOCS        = YES\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the\n# (brief and detailed) documentation of class members so that constructors and\n# destructors are listed first. If set to NO the constructors will appear in the\n# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.\n# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief\n# member documentation.\n# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting\n# detailed member documentation.\n# The default value is: NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy\n# of group names into alphabetical order. If set to NO the group names will\n# appear in their defined order.\n# The default value is: NO.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by\n# fully-qualified names, including namespaces. If set to NO, the class list will\n# be sorted only by class name, not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the alphabetical\n# list.\n# The default value is: NO.\n\nSORT_BY_SCOPE_NAME     = YES\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper\n# type resolution of all parameters of a function it will reject a match between\n# the prototype and the implementation of a member function even if there is\n# only one candidate or it is obvious which candidate to choose by doing a\n# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still\n# accept a match between prototype and implementation in such cases.\n# The default value is: NO.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo\n# list. This list is created by putting \\todo commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test\n# list. This list is created by putting \\test commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug\n# list. This list is created by putting \\bug commands in the documentation.\n# The default value is: YES.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)\n# the deprecated list. This list is created by putting \\deprecated commands in\n# the documentation.\n# The default value is: YES.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional documentation\n# sections, marked by \\if <section_label> ... \\endif and \\cond <section_label>\n# ... \\endcond blocks.\n\nENABLED_SECTIONS       = \n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the\n# initial value of a variable or macro / define can have for it to appear in the\n# documentation. If the initializer consists of more lines than specified here\n# it will be hidden. Use a value of 0 to hide initializers completely. The\n# appearance of the value of individual variables and macros / defines can be\n# controlled using \\showinitializer or \\hideinitializer command in the\n# documentation regardless of this setting.\n# Minimum value: 0, maximum value: 10000, default value: 30.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at\n# the bottom of the documentation of classes and structs. If set to YES, the\n# list will mention the files that were used to generate the documentation.\n# The default value is: YES.\n\nSHOW_USED_FILES        = NO\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This\n# will remove the Files entry from the Quick Index and from the Folder Tree View\n# (if specified).\n# The default value is: YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces\n# page. This will remove the Namespaces entry from the Quick Index and from the\n# Folder Tree View (if specified).\n# The default value is: YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command command input-file, where command is the value of the\n# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided\n# by doxygen. Whatever the program writes to standard output is used as the file\n# version. For an example see the documentation.\n\nFILE_VERSION_FILTER    = \n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option. You can\n# optionally specify a file name after the option, if omitted DoxygenLayout.xml\n# will be used as the name of the layout file.\n#\n# Note that if you run doxygen from a directory containing a file called\n# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE\n# tag is left empty.\n\nLAYOUT_FILE            = \n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files containing\n# the reference definitions. This must be a list of .bib files. The .bib\n# extension is automatically appended if omitted. This requires the bibtex tool\n# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.\n# For LaTeX the style of the bibliography can be controlled using\n# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the\n# search path. See also \\cite for info how to create references.\n\nCITE_BIB_FILES         = \n\n#---------------------------------------------------------------------------\n# Configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated to\n# standard output by doxygen. If QUIET is set to YES this implies that the\n# messages are off.\n# The default value is: NO.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES\n# this implies that the warnings are on.\n#\n# Tip: Turn warnings on while writing the documentation.\n# The default value is: YES.\n\nWARNINGS               = YES\n\n# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate\n# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag\n# will automatically be disabled.\n# The default value is: YES.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some parameters\n# in a documented function, or documenting parameters that don't exist or using\n# markup commands wrongly.\n# The default value is: YES.\n\nWARN_IF_DOC_ERROR      = YES\n\n# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that\n# are documented, but have no documentation for their parameters or return\n# value. If set to NO, doxygen will only warn about wrong or incomplete\n# parameter documentation, but not about the absence of documentation.\n# The default value is: NO.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that doxygen\n# can produce. The string should contain the $file, $line, and $text tags, which\n# will be replaced by the file and line number from which the warning originated\n# and the warning text. Optionally the format may contain $version, which will\n# be replaced by the version of the file (if it could be obtained via\n# FILE_VERSION_FILTER)\n# The default value is: $file:$line: $text.\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning and error\n# messages should be written. If left blank the output is written to standard\n# error (stderr).\n\nWARN_LOGFILE           = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag is used to specify the files and/or directories that contain\n# documented source files. You may enter file names like myfile.cpp or\n# directories like /usr/src/myproject. Separate the files or directories with\n# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING\n# Note: If this tag is empty the current directory is searched.\n\nINPUT                  = ../glm \\\n                         .\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses\n# libiconv (or the iconv built into libc) for the transcoding. See the libiconv\n# documentation (see: http://www.gnu.org/software/libiconv) for the list of\n# possible encodings.\n# The default value is: UTF-8.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and\n# *.h) to filter out the source-files in the directories.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# read by doxygen.\n#\n# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,\n# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,\n# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,\n# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd,\n# *.vhdl, *.ucf, *.qsf, *.as and *.js.\n\nFILE_PATTERNS          = *.hpp \\\n                         *.doxy\n\n# The RECURSIVE tag can be used to specify whether or not subdirectories should\n# be searched for input files as well.\n# The default value is: NO.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n#\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = \n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n# The default value is: NO.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories.\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = \n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories use the pattern */test/*\n\nEXCLUDE_SYMBOLS        = \n\n# The EXAMPLE_PATH tag can be used to specify one or more files or directories\n# that contain example code fragments that are included (see the \\include\n# command).\n\nEXAMPLE_PATH           = \n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and\n# *.h) to filter out the source-files in the directories. If left blank all\n# files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude commands\n# irrespective of the value of the RECURSIVE tag.\n# The default value is: NO.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or directories\n# that contain images that are to be included in the documentation (see the\n# \\image command).\n\nIMAGE_PATH             = \n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command:\n#\n# <filter> <input-file>\n#\n# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the\n# name of an input file. Doxygen will then use the output that the filter\n# program writes to standard output. If FILTER_PATTERNS is specified, this tag\n# will be ignored.\n#\n# Note that the filter must not add or remove lines; it is applied before the\n# code is scanned, but not when the output code is generated. If lines are added\n# or removed, the anchors will not be placed correctly.\n\nINPUT_FILTER           = \n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis. Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match. The filters are a list of the form: pattern=filter\n# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how\n# filters are used. If the FILTER_PATTERNS tag is empty or if none of the\n# patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        = \n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will also be used to filter the input files that are used for\n# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).\n# The default value is: NO.\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and\n# it is also possible to disable source filtering for a specific pattern using\n# *.ext= (so without naming a filter).\n# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.\n\nFILTER_SOURCE_PATTERNS = \n\n# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page\n# (index.html). This can be useful if you have a project on for instance GitHub\n# and want to reuse the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE = \n\n#---------------------------------------------------------------------------\n# Configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will be\n# generated. Documented entities will be cross-referenced with these sources.\n#\n# Note: To get rid of all source code in the generated output, make sure that\n# also VERBATIM_HEADERS is set to NO.\n# The default value is: NO.\n\nSOURCE_BROWSER         = YES\n\n# Setting the INLINE_SOURCES tag to YES will include the body of functions,\n# classes and enums directly into the documentation.\n# The default value is: NO.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any\n# special comment blocks from generated source code fragments. Normal C, C++ and\n# Fortran comments will always remain visible.\n# The default value is: YES.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES then for each documented\n# function all documented functions referencing it will be listed.\n# The default value is: NO.\n\nREFERENCED_BY_RELATION = YES\n\n# If the REFERENCES_RELATION tag is set to YES then for each documented function\n# all documented entities called/used by that function will be listed.\n# The default value is: NO.\n\nREFERENCES_RELATION    = YES\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set\n# to YES then the hyperlinks from functions in REFERENCES_RELATION and\n# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will\n# link to the documentation.\n# The default value is: YES.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the\n# source code will show a tooltip with additional information such as prototype,\n# brief description and links to the definition and documentation. Since this\n# will make the HTML file larger and loading of large files a bit slower, you\n# can opt to disable this feature.\n# The default value is: YES.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nSOURCE_TOOLTIPS        = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code will\n# point to the HTML generated by the htags(1) tool instead of doxygen built-in\n# source browser. The htags tool is part of GNU's global source tagging system\n# (see http://www.gnu.org/software/global/global.html). You will need version\n# 4.8.6 or higher.\n#\n# To use it do the following:\n# - Install the latest version of global\n# - Enable SOURCE_BROWSER and USE_HTAGS in the config file\n# - Make sure the INPUT points to the root of the source tree\n# - Run doxygen as normal\n#\n# Doxygen will invoke htags (and that will in turn invoke gtags), so these\n# tools must be available from the command line (i.e. in the search path).\n#\n# The result: instead of the source browser generated by doxygen, the links to\n# source code will now point to the output of htags.\n# The default value is: NO.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a\n# verbatim copy of the header file for each class for which an include is\n# specified. Set to NO to disable this.\n# See also: Section \\class.\n# The default value is: YES.\n\nVERBATIM_HEADERS       = YES\n\n# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the\n# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the\n# cost of reduced performance. This can be particularly helpful with template\n# rich C++ code for which doxygen's built-in parser lacks the necessary type\n# information.\n# Note: The availability of this option depends on whether or not doxygen was\n# compiled with the --with-libclang option.\n# The default value is: NO.\n\nCLANG_ASSISTED_PARSING = NO\n\n# If clang assisted parsing is enabled you can provide the compiler with command\n# line options that you would normally use when invoking the compiler. Note that\n# the include paths will already be set by doxygen for the files and directories\n# specified with INPUT and INCLUDE_PATH.\n# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.\n\nCLANG_OPTIONS          = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all\n# compounds will be generated. Enable this if the project contains a lot of\n# classes, structs, unions or interfaces.\n# The default value is: YES.\n\nALPHABETICAL_INDEX     = NO\n\n# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in\n# which the alphabetical index list will be split.\n# Minimum value: 1, maximum value: 20, default value: 5.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all classes will\n# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag\n# can be used to specify a prefix (or a list of prefixes) that should be ignored\n# while generating the index headers.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nIGNORE_PREFIX          = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output\n# The default value is: YES.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each\n# generated HTML page (for example: .htm, .php, .asp).\n# The default value is: .html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a user-defined HTML header file for\n# each generated HTML page. If the tag is left blank doxygen will generate a\n# standard header.\n#\n# To get valid HTML the header file that includes any scripts and style sheets\n# that doxygen needs, which is dependent on the configuration options used (e.g.\n# the setting GENERATE_TREEVIEW). It is highly recommended to start with a\n# default header using\n# doxygen -w html new_header.html new_footer.html new_stylesheet.css\n# YourConfigFile\n# and then modify the file new_header.html. See also section \"Doxygen usage\"\n# for information on how to generate the default header that doxygen normally\n# uses.\n# Note: The header is subject to change so you typically have to regenerate the\n# default header when upgrading to a newer version of doxygen. For a description\n# of the possible markers and block names see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_HEADER            = \n\n# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each\n# generated HTML page. If the tag is left blank doxygen will generate a standard\n# footer. See HTML_HEADER for more information on how to generate a default\n# footer and what special commands can be used inside the footer. See also\n# section \"Doxygen usage\" for information on how to generate the default footer\n# that doxygen normally uses.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FOOTER            = \n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style\n# sheet that is used by each HTML page. It can be used to fine-tune the look of\n# the HTML output. If left blank doxygen will generate a default style sheet.\n# See also section \"Doxygen usage\" for information on how to generate the style\n# sheet that doxygen normally uses.\n# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as\n# it is more robust and this tag (HTML_STYLESHEET) will in the future become\n# obsolete.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_STYLESHEET        = \n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# cascading style sheets that are included after the standard style sheets\n# created by doxygen. Using this option one can overrule certain style aspects.\n# This is preferred over using HTML_STYLESHEET since it does not replace the\n# standard style sheet and is therefore more robust against future updates.\n# Doxygen will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list). For an example see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_STYLESHEET  = \n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that the\n# files will be copied as-is; there are no commands or markers available.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_FILES       = \n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen\n# will adjust the colors in the style sheet and background images according to\n# this color. Hue is specified as an angle on a colorwheel, see\n# http://en.wikipedia.org/wiki/Hue for more information. For instance the value\n# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300\n# purple, and 360 is red again.\n# Minimum value: 0, maximum value: 359, default value: 220.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors\n# in the HTML output. For a value of 0 the output will use grayscales only. A\n# value of 255 will produce the most vivid colors.\n# Minimum value: 0, maximum value: 255, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the\n# luminance component of the colors in the HTML output. Values below 100\n# gradually make the output lighter, whereas values above 100 make the output\n# darker. The value divided by 100 is the actual gamma applied, so 80 represents\n# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not\n# change the gamma.\n# Minimum value: 40, maximum value: 240, default value: 80.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting this\n# to YES can help to show when doxygen was last run and thus if the\n# documentation is up to date.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_TIMESTAMP         = NO\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries\n# shown in the various tree structured indices initially; the user can expand\n# and collapse entries dynamically later on. Doxygen will expand the tree to\n# such a level that at most the specified number of entries are visible (unless\n# a fully collapsed tree already exceeds this amount). So setting the number of\n# entries 1 will produce a full collapsed tree by default. 0 is a special value\n# representing an infinite number of entries and will result in a full expanded\n# tree by default.\n# Minimum value: 0, maximum value: 9999, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files will be\n# generated that can be used as input for Apple's Xcode 3 integrated development\n# environment (see: http://developer.apple.com/tools/xcode/), introduced with\n# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a\n# Makefile in the HTML output directory. Running make will produce the docset in\n# that directory and running make install will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at\n# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_DOCSET        = NO\n\n# This tag determines the name of the docset feed. A documentation feed provides\n# an umbrella under which multiple documentation sets from a single provider\n# (such as a company or product suite) can be grouped.\n# The default value is: Doxygen generated docs.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# This tag specifies a string that should uniquely identify the documentation\n# set bundle. This should be a reverse domain-name style string, e.g.\n# com.mycompany.MyDocSet. Doxygen will append .docset to the name.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n# The default value is: org.doxygen.Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.\n# The default value is: Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three\n# additional HTML index files: index.hhp, index.hhc, and index.hhk. The\n# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop\n# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on\n# Windows.\n#\n# The HTML Help Workshop contains a compiler that can convert all HTML output\n# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML\n# files are now used as the Windows 98 help format, and will replace the old\n# Windows help format (.hlp) on all Windows platforms in the future. Compressed\n# HTML files also contain an index, a table of contents, and you can search for\n# words in the documentation. The HTML workshop also contains a viewer for\n# compressed HTML files.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_HTMLHELP      = NO\n\n# The CHM_FILE tag can be used to specify the file name of the resulting .chm\n# file. You can add a path in front of the file if the result should not be\n# written to the html output directory.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_FILE               = \n\n# The HHC_LOCATION tag can be used to specify the location (absolute path\n# including file name) of the HTML help compiler (hhc.exe). If non-empty,\n# doxygen will try to run the HTML help compiler on the generated index.hhp.\n# The file has to be specified with full path.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nHHC_LOCATION           = \n\n# The GENERATE_CHI flag controls if a separate .chi index file is generated\n# (YES) or that it should be included in the master .chm file (NO).\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nGENERATE_CHI           = NO\n\n# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)\n# and project file content.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_INDEX_ENCODING     = \n\n# The BINARY_TOC flag controls whether a binary table of contents is generated\n# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it\n# enables the Previous and Next buttons.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members to\n# the table of contents of the HTML help documentation and to the tree view.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that\n# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help\n# (.qch) of the generated HTML documentation.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify\n# the file name of the resulting .qch file. The path specified is relative to\n# the HTML output folder.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQCH_FILE               = \n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help\n# Project output. For more information please see Qt Help Project / Namespace\n# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt\n# Help Project output. For more information please see Qt Help Project / Virtual\n# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-\n# folders).\n# The default value is: doc.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom\n# filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_NAME   = \n\n# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_ATTRS  = \n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's filter section matches. Qt Help Project / Filter Attributes (see:\n# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_SECT_FILTER_ATTRS  = \n\n# The QHG_LOCATION tag can be used to specify the location of Qt's\n# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the\n# generated .qhp file.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHG_LOCATION           = \n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be\n# generated, together with the HTML files, they form an Eclipse help plugin. To\n# install this plugin and make it available under the help contents menu in\n# Eclipse, the contents of the directory containing the HTML and XML files needs\n# to be copied into the plugins directory of eclipse. The name of the directory\n# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.\n# After copying Eclipse needs to be restarted before the help appears.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the Eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have this\n# name. Each documentation set should have its own identifier.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# If you want full control over the layout of the generated HTML pages it might\n# be necessary to disable the index and replace it with your own. The\n# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top\n# of each HTML page. A value of NO enables the index and the value YES disables\n# it. Since the tabs in the index contain the same information as the navigation\n# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information. If the tag\n# value is set to YES, a side panel will be generated containing a tree-like\n# index structure (just like the one that is generated for HTML Help). For this\n# to work a browser that supports JavaScript, DHTML, CSS and frames is required\n# (i.e. any modern browser). Windows users are probably better off using the\n# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can\n# further fine-tune the look of the index. As an example, the default style\n# sheet generated by doxygen has an example that shows how to put an image at\n# the root of the tree instead of the PROJECT_NAME. Since the tree basically has\n# the same information as the tab index, you could consider setting\n# DISABLE_INDEX to YES when enabling this option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_TREEVIEW      = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that\n# doxygen will group on one line in the generated HTML documentation.\n#\n# Note that a value of 0 will completely suppress the enum values from appearing\n# in the overview section.\n# Minimum value: 0, maximum value: 20, default value: 4.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used\n# to set the initial width (in pixels) of the frame in which the tree is shown.\n# Minimum value: 0, maximum value: 1500, default value: 250.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nTREEVIEW_WIDTH         = 250\n\n# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to\n# external symbols imported via tag files in a separate window.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of LaTeX formulas included as images in\n# the HTML documentation. When you change the font size after a successful\n# doxygen run you need to manually remove any form_*.png images from the HTML\n# output directory to force them to be regenerated.\n# Minimum value: 8, maximum value: 50, default value: 10.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are not\n# supported properly for IE 6.0, but are supported on all modern browsers.\n#\n# Note that when changing this option you need to delete any form_*.png files in\n# the HTML output directory before the changes have effect.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see\n# http://www.mathjax.org) which uses client side Javascript for the rendering\n# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX\n# installed or if you want to formulas look prettier in the HTML output. When\n# enabled you may also need to install MathJax separately and configure the path\n# to it using the MATHJAX_RELPATH option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# the MathJax output. See the MathJax site (see:\n# http://docs.mathjax.org/en/latest/output.html) for more details.\n# Possible values are: HTML-CSS (which is slower, but has the best\n# compatibility), NativeMML (i.e. MathML) and SVG.\n# The default value is: HTML-CSS.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_FORMAT         = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the HTML\n# output directory using the MATHJAX_RELPATH option. The destination directory\n# should contain the MathJax.js script. For instance, if the mathjax directory\n# is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax\n# Content Delivery Network so you can quickly see the result without installing\n# MathJax. However, it is strongly recommended to install a local copy of\n# MathJax from http://www.mathjax.org before deployment.\n# The default value is: http://cdn.mathjax.org/mathjax/latest.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_RELPATH        = http://www.mathjax.org/mathjax\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax\n# extension names that should be enabled during MathJax rendering. For example\n# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_EXTENSIONS     = \n\n# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces\n# of code that will be used on startup of the MathJax code. See the MathJax site\n# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an\n# example see the documentation.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_CODEFILE       = \n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box for\n# the HTML output. The underlying search engine uses javascript and DHTML and\n# should work on any modern browser. Note that when using HTML help\n# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)\n# there is already a search function so this one should typically be disabled.\n# For large projects the javascript based search engine can be slow, then\n# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to\n# search using the keyboard; to jump to the search box use <access key> + S\n# (what the <access key> is depends on the OS and browser, but it is typically\n# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down\n# key> to jump into the search results window, the results can be navigated\n# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel\n# the search. The filter options can be selected when the cursor is inside the\n# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>\n# to select a filter and <Enter> or <escape> to activate or cancel the filter\n# option.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a web server instead of a web client using Javascript. There\n# are two flavors of web server based searching depending on the EXTERNAL_SEARCH\n# setting. When disabled, doxygen will generate a PHP script for searching and\n# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing\n# and searching needs to be provided by external tools. See the section\n# \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSERVER_BASED_SEARCH    = NO\n\n# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP\n# script for searching. Instead the search results are written to an XML file\n# which needs to be processed by an external indexer. Doxygen will invoke an\n# external search engine pointed to by the SEARCHENGINE_URL option to obtain the\n# search results.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: http://xapian.org/).\n#\n# See the section \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH        = NO\n\n# The SEARCHENGINE_URL should point to a search engine hosted by a web server\n# which will return the search results when EXTERNAL_SEARCH is enabled.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: http://xapian.org/). See the section \"External Indexing and\n# Searching\" for details.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHENGINE_URL       = \n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n# search data is written to a file for indexing by an external tool. With the\n# SEARCHDATA_FILE tag the name of this file can be specified.\n# The default file is: searchdata.xml.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHDATA_FILE        = searchdata.xml\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the\n# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n# projects and redirect the results back to the right project.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH_ID     = \n\n# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n# projects other than the one defined by this configuration file, but that are\n# all added to the same external search index. Each project needs to have a\n# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of\n# to a relative location where the documentation can be found. The format is:\n# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTRA_SEARCH_MAPPINGS  = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.\n# The default value is: YES.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked.\n#\n# Note that when enabling USE_PDFLATEX this option is only used for generating\n# bitmaps for formulas in the HTML output, but not in the Makefile that is\n# written to the output directory.\n# The default file is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate\n# index for LaTeX.\n# The default file is: makeindex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used by the\n# printer.\n# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x\n# 14 inches) and executive (7.25 x 10.5 inches).\n# The default value is: a4.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names\n# that should be included in the LaTeX output. The package can be specified just\n# by its name or with the correct syntax as to be used with the LaTeX\n# \\usepackage command. To get the times font for instance you can specify :\n# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}\n# To use the option intlimits with the amsmath package you can specify:\n# EXTRA_PACKAGES=[intlimits]{amsmath}\n# If left blank no extra packages will be included.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nEXTRA_PACKAGES         = \n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the\n# generated LaTeX document. The header should contain everything until the first\n# chapter. If it is left blank doxygen will generate a standard header. See\n# section \"Doxygen usage\" for information on how to let doxygen write the\n# default header to a separate file.\n#\n# Note: Only use a user-defined header if you know what you are doing! The\n# following commands have a special meaning inside the header: $title,\n# $datetime, $date, $doxygenversion, $projectname, $projectnumber,\n# $projectbrief, $projectlogo. Doxygen will replace $title with the empty\n# string, for the replacement values of the other commands the user is referred\n# to HTML_HEADER.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HEADER           = \n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the\n# generated LaTeX document. The footer should contain everything after the last\n# chapter. If it is left blank doxygen will generate a standard footer. See\n# LATEX_HEADER for more information on how to generate a default footer and what\n# special commands can be used inside the footer.\n#\n# Note: Only use a user-defined footer if you know what you are doing!\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_FOOTER           = \n\n# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# LaTeX style sheets that are included after the standard style sheets created\n# by doxygen. Using this option one can overrule certain style aspects. Doxygen\n# will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list).\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_STYLESHEET = \n\n# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the LATEX_OUTPUT output\n# directory. Note that the files will be copied as-is; there are no commands or\n# markers available.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_FILES      = \n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is\n# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will\n# contain links (just like the HTML output) instead of page references. This\n# makes the output suitable for online browsing using a PDF viewer.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPDF_HYPERLINKS         = NO\n\n# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate\n# the PDF file directly from the LaTeX files. Set this option to YES, to get a\n# higher quality PDF documentation.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode\n# command to the generated LaTeX files. This will instruct LaTeX to keep running\n# if errors occur, instead of asking the user for help. This option is also used\n# when generating formulas in HTML.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BATCHMODE        = NO\n\n# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the\n# index chapters (such as File Index, Compound Index, etc.) in the output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HIDE_INDICES     = NO\n\n# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source\n# code with syntax highlighting in the LaTeX output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. See\n# http://en.wikipedia.org/wiki/BibTeX and \\cite for more info.\n# The default value is: plain.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# Configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The\n# RTF output is optimized for Word 97 and may not look too pretty with other RTF\n# readers/editors.\n# The default value is: NO.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: rtf.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_OUTPUT             = glm.rtf\n\n# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will\n# contain hyperlink fields. The RTF file will contain links (just like the HTML\n# output) instead of page references. This makes the output suitable for online\n# browsing using Word or some other Word compatible readers that support those\n# fields.\n#\n# Note: WordPad (write) and others do not support links.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_HYPERLINKS         = YES\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's config\n# file, i.e. a series of assignments. You only have to provide replacements,\n# missing definitions are set to their default value.\n#\n# See also section \"Doxygen usage\" for information on how to generate the\n# default style sheet that doxygen normally uses.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_STYLESHEET_FILE    = \n\n# Set optional variables used in the generation of an RTF document. Syntax is\n# similar to doxygen's config file. A template extensions file can be generated\n# using doxygen -e rtf extensionFile.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_EXTENSIONS_FILE    = \n\n# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code\n# with syntax highlighting in the RTF output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_SOURCE_CODE        = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for\n# classes and files.\n# The default value is: NO.\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it. A directory man3 will be created inside the directory specified by\n# MAN_OUTPUT.\n# The default directory is: man.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to the generated\n# man pages. In case the manual section does not start with a number, the number\n# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is\n# optional.\n# The default value is: .3.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_EXTENSION          = .3\n\n# The MAN_SUBDIR tag determines the name of the directory created within\n# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by\n# MAN_EXTENSION with the initial . removed.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_SUBDIR             = \n\n# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it\n# will generate one additional man file for each entity documented in the real\n# man page(s). These additional files only source the real man page, but without\n# them the man command would be unable to find the correct page.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that\n# captures the structure of the code including all documentation.\n# The default value is: NO.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: xml.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_OUTPUT             = xml\n\n# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program\n# listings (including syntax highlighting and cross-referencing information) to\n# the XML output. Note that enabling this will significantly increase the size\n# of the XML output.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to the DOCBOOK output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files\n# that can be used to generate PDF.\n# The default value is: NO.\n\nGENERATE_DOCBOOK       = NO\n\n# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n# front of it.\n# The default directory is: docbook.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_OUTPUT         = docbook\n\n# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the\n# program listings (including syntax highlighting and cross-referencing\n# information) to the DOCBOOK output. Note that enabling this will significantly\n# increase the size of the DOCBOOK output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_PROGRAMLISTING = NO\n\n#---------------------------------------------------------------------------\n# Configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an\n# AutoGen Definitions (see http://autogen.sf.net) file that captures the\n# structure of the code including all documentation. Note that this feature is\n# still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module\n# file that captures the structure of the code including all documentation.\n#\n# Note that this feature is still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary\n# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI\n# output from the Perl module output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely\n# formatted so it can be parsed by a human reader. This is useful if you want to\n# understand what is going on. On the other hand, if this tag is set to NO, the\n# size of the Perl module output will be much smaller and Perl will parse it\n# just the same.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file are\n# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful\n# so different doxyrules.make files included by the same Makefile don't\n# overwrite each other's variables.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_MAKEVAR_PREFIX = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all\n# C-preprocessor directives found in the sources and include files.\n# The default value is: YES.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names\n# in the source code. If set to NO, only conditional compilation will be\n# performed. Macro expansion can be done in a controlled way by setting\n# EXPAND_ONLY_PREDEF to YES.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then\n# the macro expansion is limited to the macros specified with the PREDEFINED and\n# EXPAND_AS_DEFINED tags.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES, the include files in the\n# INCLUDE_PATH will be searched if a #include is found.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by the\n# preprocessor.\n# This tag requires that the tag SEARCH_INCLUDES is set to YES.\n\nINCLUDE_PATH           = \n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will be\n# used.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nINCLUDE_FILE_PATTERNS  = \n\n# The PREDEFINED tag can be used to specify one or more macro names that are\n# defined before the preprocessor is started (similar to the -D option of e.g.\n# gcc). The argument of the tag is a list of macros of the form: name or\n# name=definition (no spaces). If the definition and the \"=\" are omitted, \"=1\"\n# is assumed. To prevent a macro definition from being undefined via #undef or\n# recursively expanded use the := operator instead of the = operator.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nPREDEFINED             = \n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this\n# tag can be used to specify a list of macro names that should be expanded. The\n# macro definition that is found in the sources will be used. Use the PREDEFINED\n# tag if you want to use a different macro definition that overrules the\n# definition found in the source code.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_AS_DEFINED      = \n\n# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will\n# remove all references to function-like macros that are alone on a line, have\n# an all uppercase name, and do not end with a semicolon. Such function macros\n# are typically used for boiler-plate code, and will confuse the parser if not\n# removed.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES tag can be used to specify one or more tag files. For each tag\n# file the location of the external documentation should be added. The format of\n# a tag file without this location is as follows:\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where loc1 and loc2 can be relative or absolute paths or URLs. See the\n# section \"Linking to external documentation\" for more information about the use\n# of tag files.\n# Note: Each tag file must have a unique name (where the name does NOT include\n# the path). If a tag file is not located in the directory in which doxygen is\n# run, you must also specify the path to the tagfile here.\n\nTAGFILES               = \n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create a\n# tag file that is based on the input files it reads. See section \"Linking to\n# external documentation\" for more information about the usage of tag files.\n\nGENERATE_TAGFILE       = \n\n# If the ALLEXTERNALS tag is set to YES, all external class will be listed in\n# the class index. If set to NO, only the inherited external classes will be\n# listed.\n# The default value is: NO.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will be\n# listed.\n# The default value is: YES.\n\nEXTERNAL_GROUPS        = YES\n\n# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in\n# the related pages index. If set to NO, only the current project's pages will\n# be listed.\n# The default value is: YES.\n\nEXTERNAL_PAGES         = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of 'which perl').\n# The default file (with absolute path) is: /usr/bin/perl.\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram\n# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to\n# NO turns the diagrams off. Note that this option also works with HAVE_DOT\n# disabled, but it is recommended to install and use dot, since it yields more\n# powerful graphs.\n# The default value is: YES.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see:\n# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            = \n\n# You can include diagrams made with dia in doxygen documentation. Doxygen will\n# then run dia to produce the diagram and insert it in the documentation. The\n# DIA_PATH tag allows you to specify the directory where the dia binary resides.\n# If left empty dia is assumed to be found in the default search path.\n\nDIA_PATH               = \n\n# If set to YES the inheritance and collaboration graphs will hide inheritance\n# and usage relations if the target is undocumented or is not a class.\n# The default value is: YES.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz (see:\n# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent\n# Bell Labs. The other options in this section have no effect if this option is\n# set to NO\n# The default value is: NO.\n\nHAVE_DOT               = NO\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed\n# to run in parallel. When set to 0 doxygen will base this on the number of\n# processors available in the system. You can set it explicitly to a value\n# larger than 0 to get control over the balance between CPU load and processing\n# speed.\n# Minimum value: 0, maximum value: 32, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_NUM_THREADS        = 0\n\n# When you want a differently looking font in the dot files that doxygen\n# generates you can specify the font name using DOT_FONTNAME. You need to make\n# sure dot is able to find the font, which can be done by putting it in a\n# standard location or by setting the DOTFONTPATH environment variable or by\n# setting DOT_FONTPATH to the directory containing the font.\n# The default value is: Helvetica.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of\n# dot graphs.\n# Minimum value: 4, maximum value: 24, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the default font as specified with\n# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set\n# the path where dot can find it using this tag.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTPATH           = \n\n# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for\n# each documented class showing the direct and indirect inheritance relations.\n# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a\n# graph for each documented class showing the direct and indirect implementation\n# dependencies (inheritance, containment, and class references variables) of the\n# class with other documented classes.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for\n# groups, showing the direct groups dependencies.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside the\n# class node. If there are many fields or methods and many nodes the graph may\n# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the\n# number of items for each type to make the size more manageable. Set this to 0\n# for no limit. Note that the threshold may be exceeded by 50% before the limit\n# is enforced. So when you set the threshold to 10, up to 15 fields may appear,\n# but if the number exceeds 15, the total amount of fields shown is limited to\n# 10.\n# Minimum value: 0, maximum value: 100, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and\n# collaboration graphs will show the relations between templates and their\n# instances.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to\n# YES then doxygen will generate a graph for each documented file showing the\n# direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDE_GRAPH          = YES\n\n# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are\n# set to YES then doxygen will generate a graph for each documented file showing\n# the direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH tag is set to YES then doxygen will generate a call\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable call graphs for selected\n# functions only using the \\callgraph command. Disabling a call graph can be\n# accomplished by means of the command \\hidecallgraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALL_GRAPH             = YES\n\n# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable caller graphs for selected\n# functions only using the \\callergraph command. Disabling a caller graph can be\n# accomplished by means of the command \\hidecallergraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALLER_GRAPH           = YES\n\n# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical\n# hierarchy of all classes instead of a textual one.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the\n# dependencies a directory has on other directories in a graphical way. The\n# dependency relations are determined by the #include relations between the\n# files in the directories.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. For an explanation of the image formats see the section\n# output formats in the documentation of the dot tool (Graphviz (see:\n# http://www.graphviz.org/)).\n# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order\n# to make the SVG files visible in IE 9+ (other browsers do not have this\n# requirement).\n# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,\n# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and\n# png:gdiplus:gdiplus.\n# The default value is: png.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n#\n# Note that this requires a modern browser other than Internet Explorer. Tested\n# and working are Firefox, Chrome, Safari, and Opera.\n# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make\n# the SVG files visible. Older versions of IE do not have SVG support.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINTERACTIVE_SVG        = NO\n\n# The DOT_PATH tag can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_PATH               = \n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the \\dotfile\n# command).\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOTFILE_DIRS           = \n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the \\mscfile\n# command).\n\nMSCFILE_DIRS           = \n\n# The DIAFILE_DIRS tag can be used to specify one or more directories that\n# contain dia files that are included in the documentation (see the \\diafile\n# command).\n\nDIAFILE_DIRS           = \n\n# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the\n# path where java can find the plantuml.jar file. If left blank, it is assumed\n# PlantUML is not used or called during a preprocessing step. Doxygen will\n# generate a warning when it encounters a \\startuml command in this case and\n# will not generate output for the diagram.\n\nPLANTUML_JAR_PATH      = \n\n# When using plantuml, the specified paths are searched for files specified by\n# the !include statement in a plantuml block.\n\nPLANTUML_INCLUDE_PATH  = \n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes\n# that will be shown in the graph. If the number of nodes in a graph becomes\n# larger than this value, doxygen will truncate the graph, which is visualized\n# by representing a node as a red box. Note that doxygen if the number of direct\n# children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that\n# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n# Minimum value: 0, maximum value: 10000, default value: 50.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs\n# generated by dot. A depth value of 3 means that only nodes reachable from the\n# root by following a path via at most 3 edges will be shown. Nodes that lay\n# further from the root node will be omitted. Note that setting this option to 1\n# or 2 may greatly reduce the computation time needed for large code bases. Also\n# note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n# Minimum value: 0, maximum value: 1000, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nMAX_DOT_GRAPH_DEPTH    = 1000\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not seem\n# to support this out of the box.\n#\n# Warning: Depending on the platform used, enabling this option may lead to\n# badly anti-aliased labels on the edges of a graph (i.e. they become hard to\n# read).\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10) support\n# this, this feature is disabled by default.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page\n# explaining the meaning of the various boxes and arrows in the dot generated\n# graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot\n# files that are used to generate the various graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "external/glm/doc/api/modules.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<title>0.9.9 API documenation: Modules</title>\n<link href=\"tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"jquery.js\"></script>\n<script type=\"text/javascript\" src=\"dynsections.js\"></script>\n<link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"search/searchdata.js\"></script>\n<script type=\"text/javascript\" src=\"search/search.js\"></script>\n<script type=\"text/javascript\">\n  $(document).ready(function() { init_search(); });\n</script>\n<link href=\"doxygen.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"logo-mini.png\"/></td>\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">0.9.9 API documenation\n   </div>\n  </td>\n </tr>\n </tbody>\n</table>\n</div>\n<!-- end header part -->\n<!-- Generated by Doxygen 1.8.10 -->\n<script type=\"text/javascript\">\nvar searchBox = new SearchBox(\"searchBox\", \"search\",false,'Search');\n</script>\n  <div id=\"navrow1\" class=\"tabs\">\n    <ul class=\"tablist\">\n      <li><a href=\"index.html\"><span>Main&#160;Page</span></a></li>\n      <li class=\"current\"><a href=\"modules.html\"><span>Modules</span></a></li>\n      <li><a href=\"files.html\"><span>Files</span></a></li>\n      <li>\n        <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n        <span class=\"left\">\n          <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n               onmouseover=\"return searchBox.OnSearchSelectShow()\"\n               onmouseout=\"return searchBox.OnSearchSelectHide()\"\n               alt=\"\"/>\n          <input type=\"text\" id=\"MSearchField\" value=\"Search\" accesskey=\"S\"\n               onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n               onblur=\"searchBox.OnSearchFieldFocus(false)\" \n               onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n          </span><span class=\"right\">\n            <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\"><img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n          </span>\n        </div>\n      </li>\n    </ul>\n  </div>\n</div><!-- top -->\n<!-- window showing the filter options -->\n<div id=\"MSearchSelectWindow\"\n     onmouseover=\"return searchBox.OnSearchSelectShow()\"\n     onmouseout=\"return searchBox.OnSearchSelectHide()\"\n     onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n</div>\n\n<!-- iframe showing the search results (closed by default) -->\n<div id=\"MSearchResultsWindow\">\n<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n        name=\"MSearchResults\" id=\"MSearchResults\">\n</iframe>\n</div>\n\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">Modules</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"textblock\">Here is a list of all modules:</div><div class=\"directory\">\n<div class=\"levels\">[detail level <span onclick=\"javascript:toggleLevel(1);\">1</span><span onclick=\"javascript:toggleLevel(2);\">2</span><span onclick=\"javascript:toggleLevel(3);\">3</span>]</div><table class=\"directory\">\n<tr id=\"row_0_\" class=\"even\"><td class=\"entry\"><span style=\"width:0px;display:inline-block;\">&#160;</span><span id=\"arr_0_\" class=\"arrow\" onclick=\"toggleFolder('0_')\">&#9660;</span><a class=\"el\" href=\"a00143.html\" target=\"_self\">Core features</a></td><td class=\"desc\">Features that implement in C++ the GLSL specification as closely as possible </td></tr>\n<tr id=\"row_0_0_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00140.html\" target=\"_self\">Common functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00015.html\" title=\"Core features \">glm/common.hpp</a>&gt; to use these core features </td></tr>\n<tr id=\"row_0_1_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00141.html\" target=\"_self\">Exponential functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00024.html\" title=\"Core features \">glm/exponential.hpp</a>&gt; to use these core features </td></tr>\n<tr id=\"row_0_2_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00142.html\" target=\"_self\">Geometric functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00034.html\" title=\"Core features \">glm/geometric.hpp</a>&gt; to use these core features </td></tr>\n<tr id=\"row_0_3_\" class=\"even\"><td class=\"entry\"><span style=\"width:16px;display:inline-block;\">&#160;</span><span id=\"arr_0_3_\" class=\"arrow\" onclick=\"toggleFolder('0_3_')\">&#9660;</span><a class=\"el\" href=\"a00144.html\" target=\"_self\">Types</a></td><td class=\"desc\">The standard types defined by the specification </td></tr>\n<tr id=\"row_0_3_0_\"><td class=\"entry\"><span style=\"width:48px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00145.html\" target=\"_self\">Precision types</a></td><td class=\"desc\">Non-GLSL types that are used to define qualifier-based types </td></tr>\n<tr id=\"row_0_4_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00145.html\" target=\"_self\">Precision types</a></td><td class=\"desc\">Non-GLSL types that are used to define qualifier-based types </td></tr>\n<tr id=\"row_0_5_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00146.html\" target=\"_self\">Template types</a></td><td class=\"desc\">The generic template types used as the basis for the core types </td></tr>\n<tr id=\"row_0_6_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00229.html\" target=\"_self\">Integer functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00041.html\" title=\"Core features \">glm/integer.hpp</a>&gt; to use these core features </td></tr>\n<tr id=\"row_0_7_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00230.html\" target=\"_self\">Matrix functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00055.html\" title=\"Core features \">glm/matrix.hpp</a>&gt; to use these core features </td></tr>\n<tr id=\"row_0_8_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00231.html\" target=\"_self\">Floating-Point Pack and Unpack Functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00077.html\" title=\"Core features \">glm/packing.hpp</a>&gt; to use these core features </td></tr>\n<tr id=\"row_0_9_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00232.html\" target=\"_self\">Angle and Trigonometry Functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00100.html\" title=\"Core features \">glm/trigonometric.hpp</a>&gt; to use these core features </td></tr>\n<tr id=\"row_0_10_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00233.html\" target=\"_self\">Vector Relational Functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00133_source.html\">glm/vector_relational.hpp</a>&gt; to use these core features </td></tr>\n<tr id=\"row_1_\"><td class=\"entry\"><span style=\"width:0px;display:inline-block;\">&#160;</span><span id=\"arr_1_\" class=\"arrow\" onclick=\"toggleFolder('1_')\">&#9660;</span><a class=\"el\" href=\"a00147.html\" target=\"_self\">Stable extensions</a></td><td class=\"desc\">Additional features not specified by GLSL specification </td></tr>\n<tr id=\"row_1_0_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00149.html\" target=\"_self\">GLM_GTC_bitfield</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00009.html\" title=\"GLM_GTC_bitfield \">glm/gtc/bitfield.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_1_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00150.html\" target=\"_self\">GLM_GTC_color_space</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00012.html\" title=\"GLM_GTC_color_space \">glm/gtc/color_space.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_2_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00151.html\" target=\"_self\">GLM_GTC_constants</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00020.html\" title=\"GLM_GTC_constants \">glm/gtc/constants.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_3_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00152.html\" target=\"_self\">GLM_GTC_epsilon</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00022.html\" title=\"GLM_GTC_epsilon \">glm/gtc/epsilon.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_4_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00153.html\" target=\"_self\">GLM_GTC_integer</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00039.html\" title=\"GLM_GTC_integer \">glm/gtc/integer.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_5_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00154.html\" target=\"_self\">GLM_GTC_matrix_access</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00056.html\" title=\"GLM_GTC_matrix_access \">glm/gtc/matrix_access.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_6_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00155.html\" target=\"_self\">GLM_GTC_matrix_integer</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00060.html\" title=\"GLM_GTC_matrix_integer \">glm/gtc/matrix_integer.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_7_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00156.html\" target=\"_self\">GLM_GTC_matrix_inverse</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00060.html\" title=\"GLM_GTC_matrix_integer \">glm/gtc/matrix_integer.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_8_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00157.html\" target=\"_self\">GLM_GTC_matrix_transform</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00066.html\" title=\"GLM_GTC_matrix_transform \">glm/gtc/matrix_transform.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_9_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00158.html\" target=\"_self\">GLM_GTC_noise</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00069.html\" title=\"GLM_GTC_noise \">glm/gtc/noise.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_10_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00159.html\" target=\"_self\">GLM_GTC_packing</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00076.html\" title=\"GLM_GTC_packing \">glm/gtc/packing.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_11_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00160.html\" target=\"_self\">GLM_GTC_quaternion</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00083.html\" title=\"GLM_GTC_quaternion \">glm/gtc/quaternion.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_12_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00161.html\" target=\"_self\">GLM_GTC_random</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00085.html\" title=\"GLM_GTC_random \">glm/gtc/random.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_13_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00162.html\" target=\"_self\">GLM_GTC_reciprocal</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00088.html\" title=\"GLM_GTC_reciprocal \">glm/gtc/reciprocal.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_14_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00163.html\" target=\"_self\">GLM_GTC_round</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00091.html\" title=\"GLM_GTC_round \">glm/gtc/round.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_15_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00164.html\" target=\"_self\">GLM_GTC_type_aligned</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00101.html\" title=\"GLM_GTC_type_aligned \">glm/gtc/type_aligned.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_16_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00165.html\" target=\"_self\">GLM_GTC_type_precision</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00117.html\" title=\"GLM_GTC_type_precision \">glm/gtc/type_precision.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_17_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00166.html\" target=\"_self\">GLM_GTC_type_ptr</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00118.html\" title=\"GLM_GTC_type_ptr \">glm/gtc/type_ptr.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_18_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00167.html\" target=\"_self\">GLM_GTC_ulp</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00125.html\" title=\"GLM_GTC_ulp \">glm/gtc/ulp.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_1_19_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00168.html\" target=\"_self\">GLM_GTC_vec1</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00126.html\" title=\"GLM_GTC_vec1 \">glm/gtc/vec1.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_\" class=\"even\"><td class=\"entry\"><span style=\"width:0px;display:inline-block;\">&#160;</span><span id=\"arr_2_\" class=\"arrow\" onclick=\"toggleFolder('2_')\">&#9660;</span><a class=\"el\" href=\"a00148.html\" target=\"_self\">Experimental extensions</a></td><td class=\"desc\">Experimental features not specified by GLSL specification </td></tr>\n<tr id=\"row_2_0_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00169.html\" target=\"_self\">GLM_GTX_associated_min_max</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00007.html\" title=\"GLM_GTX_associated_min_max \">glm/gtx/associated_min_max.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_1_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00170.html\" target=\"_self\">GLM_GTX_bit</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00008.html\" title=\"GLM_GTX_bit \">glm/gtx/bit.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_2_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00171.html\" target=\"_self\">GLM_GTX_closest_point</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00010.html\" title=\"GLM_GTX_closest_point \">glm/gtx/closest_point.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_3_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00172.html\" target=\"_self\">GLM_GTX_color_encoding</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00011.html\" title=\"GLM_GTX_color_encoding \">glm/gtx/color_encoding.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_4_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00173.html\" target=\"_self\">GLM_GTX_color_space</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00013.html\" title=\"GLM_GTX_color_space \">glm/gtx/color_space.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_5_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00174.html\" target=\"_self\">GLM_GTX_color_space_YCoCg</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00014.html\" title=\"GLM_GTX_color_space_YCoCg \">glm/gtx/color_space_YCoCg.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_6_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00175.html\" target=\"_self\">GLM_GTX_common</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00016.html\" title=\"GLM_GTX_common \">glm/gtx/common.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_7_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00176.html\" target=\"_self\">GLM_GTX_compatibility</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00017.html\" title=\"GLM_GTX_compatibility \">glm/gtx/compatibility.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_8_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00177.html\" target=\"_self\">GLM_GTX_component_wise</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00018.html\" title=\"GLM_GTX_component_wise \">glm/gtx/component_wise.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_9_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00178.html\" target=\"_self\">GLM_GTX_dual_quaternion</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00021.html\" title=\"GLM_GTX_dual_quaternion \">glm/gtx/dual_quaternion.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_10_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00179.html\" target=\"_self\">GLM_GTX_euler_angles</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00023.html\" title=\"GLM_GTX_euler_angles \">glm/gtx/euler_angles.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_11_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00180.html\" target=\"_self\">GLM_GTX_extend</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00026.html\" title=\"GLM_GTX_extend \">glm/gtx/extend.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_12_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00181.html\" target=\"_self\">GLM_GTX_extented_min_max</a></td><td class=\"desc\">Include &lt;glm/gtx/extented_min_max.hpp&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_13_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00182.html\" target=\"_self\">GLM_GTX_exterior_product</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00028.html\" title=\"GLM_GTX_exterior_product \">glm/gtx/exterior_product.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_14_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00183.html\" target=\"_self\">GLM_GTX_fast_exponential</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00029.html\" title=\"GLM_GTX_fast_exponential \">glm/gtx/fast_exponential.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_15_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00184.html\" target=\"_self\">GLM_GTX_fast_square_root</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00030.html\" title=\"GLM_GTX_fast_square_root \">glm/gtx/fast_square_root.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_16_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00185.html\" target=\"_self\">GLM_GTX_fast_trigonometry</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00031.html\" title=\"GLM_GTX_fast_trigonometry \">glm/gtx/fast_trigonometry.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_17_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00186.html\" target=\"_self\">GLM_GTX_functions</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00032.html\" title=\"GLM_GTX_functions \">glm/gtx/functions.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_18_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00187.html\" target=\"_self\">GLM_GTX_gradient_paint</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00036.html\" title=\"GLM_GTX_gradient_paint \">glm/gtx/gradient_paint.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_19_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00188.html\" target=\"_self\">GLM_GTX_handed_coordinate_space</a></td><td class=\"desc\">Include &lt;glm/gtx/handed_coordinate_system.hpp&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_20_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00189.html\" target=\"_self\">GLM_GTX_hash</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00038.html\" title=\"GLM_GTX_hash \">glm/gtx/hash.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_21_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00190.html\" target=\"_self\">GLM_GTX_integer</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00040.html\" title=\"GLM_GTX_integer \">glm/gtx/integer.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_22_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00191.html\" target=\"_self\">GLM_GTX_intersect</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00042.html\" title=\"GLM_GTX_intersect \">glm/gtx/intersect.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_23_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00192.html\" target=\"_self\">GLM_GTX_io</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00043.html\" title=\"GLM_GTX_io \">glm/gtx/io.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_24_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00193.html\" target=\"_self\">GLM_GTX_log_base</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00044.html\" title=\"GLM_GTX_log_base \">glm/gtx/log_base.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_25_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00194.html\" target=\"_self\">GLM_GTX_matrix_cross_product</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00057.html\" title=\"GLM_GTX_matrix_cross_product \">glm/gtx/matrix_cross_product.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_26_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00195.html\" target=\"_self\">GLM_GTX_matrix_decompose</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00058.html\" title=\"GLM_GTX_matrix_decompose \">glm/gtx/matrix_decompose.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_27_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00196.html\" target=\"_self\">GLM_GTX_matrix_factorisation</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00059.html\" title=\"GLM_GTX_matrix_factorisation \">glm/gtx/matrix_factorisation.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_28_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00197.html\" target=\"_self\">GLM_GTX_matrix_interpolation</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00061.html\" title=\"GLM_GTX_matrix_interpolation \">glm/gtx/matrix_interpolation.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_29_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00198.html\" target=\"_self\">GLM_GTX_matrix_major_storage</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00063.html\" title=\"GLM_GTX_matrix_major_storage \">glm/gtx/matrix_major_storage.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_30_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00199.html\" target=\"_self\">GLM_GTX_matrix_operation</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00064.html\" title=\"GLM_GTX_matrix_operation \">glm/gtx/matrix_operation.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_31_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00200.html\" target=\"_self\">GLM_GTX_matrix_query</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00065.html\" title=\"GLM_GTX_matrix_query \">glm/gtx/matrix_query.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_32_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00201.html\" target=\"_self\">GLM_GTX_matrix_transform_2d</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00067.html\" title=\"GLM_GTX_matrix_transform_2d \">glm/gtx/matrix_transform_2d.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_33_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00202.html\" target=\"_self\">GLM_GTX_mixed_producte</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00068.html\" title=\"GLM_GTX_mixed_producte \">glm/gtx/mixed_product.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_34_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00203.html\" target=\"_self\">GLM_GTX_norm</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00070.html\" title=\"GLM_GTX_norm \">glm/gtx/norm.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_35_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00204.html\" target=\"_self\">GLM_GTX_normal</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00071.html\" title=\"GLM_GTX_normal \">glm/gtx/normal.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_36_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00205.html\" target=\"_self\">GLM_GTX_normalize_dot</a></td><td class=\"desc\">Include &lt;glm/gtx/normalized_dot.hpp&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_37_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00206.html\" target=\"_self\">GLM_GTX_number_precision</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00073.html\" title=\"GLM_GTX_number_precision \">glm/gtx/number_precision.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_38_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00207.html\" target=\"_self\">GLM_GTX_optimum_pow</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00074.html\" title=\"GLM_GTX_optimum_pow \">glm/gtx/optimum_pow.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_39_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00208.html\" target=\"_self\">GLM_GTX_orthonormalize</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00075.html\" title=\"GLM_GTX_orthonormalize \">glm/gtx/orthonormalize.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_40_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00209.html\" target=\"_self\">GLM_GTX_perpendicular</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00079.html\" title=\"GLM_GTX_perpendicular \">glm/gtx/perpendicular.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_41_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00210.html\" target=\"_self\">GLM_GTX_polar_coordinates</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00080.html\" title=\"GLM_GTX_polar_coordinates \">glm/gtx/polar_coordinates.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_42_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00211.html\" target=\"_self\">GLM_GTX_projection</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00081.html\" title=\"GLM_GTX_projection \">glm/gtx/projection.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_43_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00212.html\" target=\"_self\">GLM_GTX_quaternion</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00084.html\" title=\"GLM_GTX_quaternion \">glm/gtx/quaternion.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_44_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00213.html\" target=\"_self\">GLM_GTX_range</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00086.html\" title=\"GLM_GTX_range \">glm/gtx/range.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_45_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00214.html\" target=\"_self\">GLM_GTX_raw_data</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00087.html\" title=\"GLM_GTX_raw_data \">glm/gtx/raw_data.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_46_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00215.html\" target=\"_self\">GLM_GTX_rotate_normalized_axis</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00089.html\" title=\"GLM_GTX_rotate_normalized_axis \">glm/gtx/rotate_normalized_axis.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_47_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00216.html\" target=\"_self\">GLM_GTX_rotate_vector</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00090.html\" title=\"GLM_GTX_rotate_vector \">glm/gtx/rotate_vector.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_48_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00217.html\" target=\"_self\">GLM_GTX_scalar_relational</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00093.html\" title=\"GLM_GTX_scalar_relational \">glm/gtx/scalar_relational.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_49_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00218.html\" target=\"_self\">GLM_GTX_spline</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00095.html\" title=\"GLM_GTX_spline \">glm/gtx/spline.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_50_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00219.html\" target=\"_self\">GLM_GTX_std_based_type</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00096.html\" title=\"GLM_GTX_std_based_type \">glm/gtx/std_based_type.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_51_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00220.html\" target=\"_self\">GLM_GTX_string_cast</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00097.html\" title=\"GLM_GTX_string_cast \">glm/gtx/string_cast.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_52_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00221.html\" target=\"_self\">GLM_GTX_transform</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00098.html\" title=\"GLM_GTX_transform \">glm/gtx/transform.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_53_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00222.html\" target=\"_self\">GLM_GTX_transform2</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00099.html\" title=\"GLM_GTX_transform2 \">glm/gtx/transform2.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_54_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00223.html\" target=\"_self\">GLM_GTX_type_aligned</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00102.html\" title=\"GLM_GTX_type_aligned \">glm/gtx/type_aligned.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_55_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00224.html\" target=\"_self\">GLM_GTX_type_trait</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00119.html\" title=\"GLM_GTX_type_trait \">glm/gtx/type_trait.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_56_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00225.html\" target=\"_self\">GLM_GTX_vec_swizzle</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00130.html\" title=\"GLM_GTX_vec_swizzle \">glm/gtx/vec_swizzle.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_57_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00226.html\" target=\"_self\">GLM_GTX_vector_angle</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00131.html\" title=\"GLM_GTX_vector_angle \">glm/gtx/vector_angle.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_58_\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00227.html\" target=\"_self\">GLM_GTX_vector_query</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00132.html\" title=\"GLM_GTX_vector_query \">glm/gtx/vector_query.hpp</a>&gt; to use the features of this extension </td></tr>\n<tr id=\"row_2_59_\" class=\"even\"><td class=\"entry\"><span style=\"width:32px;display:inline-block;\">&#160;</span><a class=\"el\" href=\"a00228.html\" target=\"_self\">GLM_GTX_wrap</a></td><td class=\"desc\">Include &lt;<a class=\"el\" href=\"a00134.html\" title=\"GLM_GTX_wrap \">glm/gtx/wrap.hpp</a>&gt; to use the features of this extension </td></tr>\n</table>\n</div><!-- directory -->\n</div><!-- contents -->\n<!-- start footer part -->\n<hr class=\"footer\"/><address class=\"footer\"><small>\nGenerated by &#160;<a href=\"http://www.doxygen.org/index.html\">\n<img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/>\n</a> 1.8.10\n</small></address>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/pages.doxy",
    "content": ""
  },
  {
    "path": "external/glm/doc/api/search/all_0.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_0.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_0.js",
    "content": "var searchData=\n[\n  ['_5ffeatures_2ehpp',['_features.hpp',['../a00001.html',1,'']]],\n  ['_5ffixes_2ehpp',['_fixes.hpp',['../a00002.html',1,'']]],\n  ['_5fnoise_2ehpp',['_noise.hpp',['../a00003.html',1,'']]],\n  ['_5fswizzle_2ehpp',['_swizzle.hpp',['../a00004.html',1,'']]],\n  ['_5fswizzle_5ffunc_2ehpp',['_swizzle_func.hpp',['../a00005.html',1,'']]],\n  ['_5fvectorize_2ehpp',['_vectorize.hpp',['../a00006.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_1.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_1.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_1.js",
    "content": "var searchData=\n[\n  ['abs',['abs',['../a00140.html#ga693d77696ff36572a0da79efec965acd',1,'glm::abs(genType x)'],['../a00140.html#ga3e141c9738c73d3e581efa471dba8b4c',1,'glm::abs(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['acos',['acos',['../a00232.html#gacc9b092df8257c68f19c9053703e2563',1,'glm']]],\n  ['acosh',['acosh',['../a00232.html#ga858f35dc66fd2688f20c52b5f25be76a',1,'glm']]],\n  ['acot',['acot',['../a00162.html#gaeadfb9c9d71093f7865b2ba2ca8d104d',1,'glm']]],\n  ['acoth',['acoth',['../a00162.html#gafaca98a7100170db8841f446282debfa',1,'glm']]],\n  ['acsc',['acsc',['../a00162.html#ga1b4bed91476b9b915e76b4a30236d330',1,'glm']]],\n  ['acsch',['acsch',['../a00162.html#ga4b50aa5e5afc7e19ec113ab91596c576',1,'glm']]],\n  ['affineinverse',['affineInverse',['../a00156.html#gae0fcc5fc8783291f9702272de428fa0e',1,'glm']]],\n  ['aligned_5fbvec1',['aligned_bvec1',['../a00164.html#ga780a35f764020f553a9601a3fcdcd059',1,'glm']]],\n  ['aligned_5fbvec2',['aligned_bvec2',['../a00164.html#gae766b317c5afec852bfb3d74a3c54bc8',1,'glm']]],\n  ['aligned_5fbvec3',['aligned_bvec3',['../a00164.html#gae1964ba70d15915e5b710926decbb3cb',1,'glm']]],\n  ['aligned_5fbvec4',['aligned_bvec4',['../a00164.html#gae164a1f7879f828bc35e50b79d786b05',1,'glm']]],\n  ['aligned_5fdvec1',['aligned_dvec1',['../a00164.html#ga4974f46ae5a19415d91316960a53617a',1,'glm']]],\n  ['aligned_5fdvec2',['aligned_dvec2',['../a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0',1,'glm']]],\n  ['aligned_5fdvec3',['aligned_dvec3',['../a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0',1,'glm']]],\n  ['aligned_5fdvec4',['aligned_dvec4',['../a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5',1,'glm']]],\n  ['aligned_5fhighp_5fbvec1',['aligned_highp_bvec1',['../a00164.html#ga862843a45b01c35ffe4d44c47ea774ad',1,'glm']]],\n  ['aligned_5fhighp_5fbvec2',['aligned_highp_bvec2',['../a00164.html#ga0731b593c5e33559954c80f8687e76c6',1,'glm']]],\n  ['aligned_5fhighp_5fbvec3',['aligned_highp_bvec3',['../a00164.html#ga0913bdf048d0cb74af1d2512aec675bc',1,'glm']]],\n  ['aligned_5fhighp_5fbvec4',['aligned_highp_bvec4',['../a00164.html#ga9df1d0c425852cf63a57e533b7a83f4f',1,'glm']]],\n  ['aligned_5fhighp_5fdvec1',['aligned_highp_dvec1',['../a00164.html#gaf0448b0f7ceb8273f7eda3a92205eefc',1,'glm']]],\n  ['aligned_5fhighp_5fdvec2',['aligned_highp_dvec2',['../a00164.html#gab173a333e6b7ce153ceba66ac4a321cf',1,'glm']]],\n  ['aligned_5fhighp_5fdvec3',['aligned_highp_dvec3',['../a00164.html#gae94ef61edfa047d05bc69b6065fc42ba',1,'glm']]],\n  ['aligned_5fhighp_5fdvec4',['aligned_highp_dvec4',['../a00164.html#ga8fad35c5677f228e261fe541f15363a4',1,'glm']]],\n  ['aligned_5fhighp_5fivec1',['aligned_highp_ivec1',['../a00164.html#gad63b8c5b4dc0500d54d7414ef555178f',1,'glm']]],\n  ['aligned_5fhighp_5fivec2',['aligned_highp_ivec2',['../a00164.html#ga41563650f36cb7f479e080de21e08418',1,'glm']]],\n  ['aligned_5fhighp_5fivec3',['aligned_highp_ivec3',['../a00164.html#ga6eca5170bb35eac90b4972590fd31a06',1,'glm']]],\n  ['aligned_5fhighp_5fivec4',['aligned_highp_ivec4',['../a00164.html#ga31bfa801e1579fdba752ec3f7a45ec91',1,'glm']]],\n  ['aligned_5fhighp_5fuvec1',['aligned_highp_uvec1',['../a00164.html#ga5b80e28396c6ef7d32c6fd18df498451',1,'glm']]],\n  ['aligned_5fhighp_5fuvec2',['aligned_highp_uvec2',['../a00164.html#ga04db692662a4908beeaf5a5ba6e19483',1,'glm']]],\n  ['aligned_5fhighp_5fuvec3',['aligned_highp_uvec3',['../a00164.html#ga073fd6e8b241afade6d8afbd676b2667',1,'glm']]],\n  ['aligned_5fhighp_5fuvec4',['aligned_highp_uvec4',['../a00164.html#gabdd60462042859f876c17c7346c732a5',1,'glm']]],\n  ['aligned_5fhighp_5fvec1',['aligned_highp_vec1',['../a00164.html#ga4d0bd70d5fac49b800546d608b707513',1,'glm']]],\n  ['aligned_5fhighp_5fvec2',['aligned_highp_vec2',['../a00164.html#gac9f8482dde741fb6bab7248b81a45465',1,'glm']]],\n  ['aligned_5fhighp_5fvec3',['aligned_highp_vec3',['../a00164.html#ga65415d2d68c9cc0ca554524a8f5510b2',1,'glm']]],\n  ['aligned_5fhighp_5fvec4',['aligned_highp_vec4',['../a00164.html#ga7cb26d354dd69d23849c34c4fba88da9',1,'glm']]],\n  ['aligned_5fivec1',['aligned_ivec1',['../a00164.html#ga76298aed82a439063c3d55980c84aa0b',1,'glm']]],\n  ['aligned_5fivec2',['aligned_ivec2',['../a00164.html#gae4f38fd2c86cee6940986197777b3ca4',1,'glm']]],\n  ['aligned_5fivec3',['aligned_ivec3',['../a00164.html#ga32794322d294e5ace7fed4a61896f270',1,'glm']]],\n  ['aligned_5fivec4',['aligned_ivec4',['../a00164.html#ga7f79eae5927c9033d84617e49f6f34e4',1,'glm']]],\n  ['aligned_5flowp_5fbvec1',['aligned_lowp_bvec1',['../a00164.html#gac6036449ab1c4abf8efe1ea00fcdd1c9',1,'glm']]],\n  ['aligned_5flowp_5fbvec2',['aligned_lowp_bvec2',['../a00164.html#ga59fadcd3835646e419372ae8b43c5d37',1,'glm']]],\n  ['aligned_5flowp_5fbvec3',['aligned_lowp_bvec3',['../a00164.html#ga83aab4d191053f169c93a3e364f2e118',1,'glm']]],\n  ['aligned_5flowp_5fbvec4',['aligned_lowp_bvec4',['../a00164.html#gaa7a76555ee4853614e5755181a8dd54e',1,'glm']]],\n  ['aligned_5flowp_5fdvec1',['aligned_lowp_dvec1',['../a00164.html#ga7f8a2cc5a686e52b1615761f4978ca62',1,'glm']]],\n  ['aligned_5flowp_5fdvec2',['aligned_lowp_dvec2',['../a00164.html#ga0e37cff4a43cca866101f0a35f01db6d',1,'glm']]],\n  ['aligned_5flowp_5fdvec3',['aligned_lowp_dvec3',['../a00164.html#gab9e669c4efd52d3347fc6d5f6b20fd59',1,'glm']]],\n  ['aligned_5flowp_5fdvec4',['aligned_lowp_dvec4',['../a00164.html#ga226f5ec7a953cea559c16fe3aff9924f',1,'glm']]],\n  ['aligned_5flowp_5fivec1',['aligned_lowp_ivec1',['../a00164.html#ga1101d3a82b2e3f5f8828bd8f3adab3e1',1,'glm']]],\n  ['aligned_5flowp_5fivec2',['aligned_lowp_ivec2',['../a00164.html#ga44c4accad582cfbd7226a19b83b0cadc',1,'glm']]],\n  ['aligned_5flowp_5fivec3',['aligned_lowp_ivec3',['../a00164.html#ga65663f10a02e52cedcddbcfe36ddf38d',1,'glm']]],\n  ['aligned_5flowp_5fivec4',['aligned_lowp_ivec4',['../a00164.html#gaae92fcec8b2e0328ffbeac31cc4fc419',1,'glm']]],\n  ['aligned_5flowp_5fuvec1',['aligned_lowp_uvec1',['../a00164.html#gad09b93acc43c43423408d17a64f6d7ca',1,'glm']]],\n  ['aligned_5flowp_5fuvec2',['aligned_lowp_uvec2',['../a00164.html#ga6f94fcd28dde906fc6cad5f742b55c1a',1,'glm']]],\n  ['aligned_5flowp_5fuvec3',['aligned_lowp_uvec3',['../a00164.html#ga9e9f006970b1a00862e3e6e599eedd4c',1,'glm']]],\n  ['aligned_5flowp_5fuvec4',['aligned_lowp_uvec4',['../a00164.html#ga46b1b0b9eb8625a5d69137bd66cd13dc',1,'glm']]],\n  ['aligned_5flowp_5fvec1',['aligned_lowp_vec1',['../a00164.html#gab34aee3d5e121c543fea11d2c50ecc43',1,'glm']]],\n  ['aligned_5flowp_5fvec2',['aligned_lowp_vec2',['../a00164.html#ga53ac5d252317f1fa43c2ef921857bf13',1,'glm']]],\n  ['aligned_5flowp_5fvec3',['aligned_lowp_vec3',['../a00164.html#ga98f0b5cd65fce164ff1367c2a3b3aa1e',1,'glm']]],\n  ['aligned_5flowp_5fvec4',['aligned_lowp_vec4',['../a00164.html#ga82f7275d6102593a69ce38cdad680409',1,'glm']]],\n  ['aligned_5fmediump_5fbvec1',['aligned_mediump_bvec1',['../a00164.html#gadd3b8bd71a758f7fb0da8e525156f34e',1,'glm']]],\n  ['aligned_5fmediump_5fbvec2',['aligned_mediump_bvec2',['../a00164.html#gacb183eb5e67ec0d0ea5a016cba962810',1,'glm']]],\n  ['aligned_5fmediump_5fbvec3',['aligned_mediump_bvec3',['../a00164.html#gacfa4a542f1b20a5b63ad702dfb6fd587',1,'glm']]],\n  ['aligned_5fmediump_5fbvec4',['aligned_mediump_bvec4',['../a00164.html#ga91bc1f513bb9b0fd60281d57ded9a48c',1,'glm']]],\n  ['aligned_5fmediump_5fdvec1',['aligned_mediump_dvec1',['../a00164.html#ga7180b685c581adb224406a7f831608e3',1,'glm']]],\n  ['aligned_5fmediump_5fdvec2',['aligned_mediump_dvec2',['../a00164.html#ga9af1eabe22f569e70d9893be72eda0f5',1,'glm']]],\n  ['aligned_5fmediump_5fdvec3',['aligned_mediump_dvec3',['../a00164.html#ga058e7ddab1428e47f2197bdd3a5a6953',1,'glm']]],\n  ['aligned_5fmediump_5fdvec4',['aligned_mediump_dvec4',['../a00164.html#gaffd747ea2aea1e69c2ecb04e68521b21',1,'glm']]],\n  ['aligned_5fmediump_5fivec1',['aligned_mediump_ivec1',['../a00164.html#ga20e63dd980b81af10cadbbe219316650',1,'glm']]],\n  ['aligned_5fmediump_5fivec2',['aligned_mediump_ivec2',['../a00164.html#gaea13d89d49daca2c796aeaa82fc2c2f2',1,'glm']]],\n  ['aligned_5fmediump_5fivec3',['aligned_mediump_ivec3',['../a00164.html#gabbf0f15e9c3d9868e43241ad018f82bd',1,'glm']]],\n  ['aligned_5fmediump_5fivec4',['aligned_mediump_ivec4',['../a00164.html#ga6099dd7878d0a78101a4250d8cd2d736',1,'glm']]],\n  ['aligned_5fmediump_5fuvec1',['aligned_mediump_uvec1',['../a00164.html#gacb78126ea2eb779b41c7511128ff1283',1,'glm']]],\n  ['aligned_5fmediump_5fuvec2',['aligned_mediump_uvec2',['../a00164.html#ga081d53e0a71443d0b68ea61c870f9adc',1,'glm']]],\n  ['aligned_5fmediump_5fuvec3',['aligned_mediump_uvec3',['../a00164.html#gad6fc921bdde2bdbc7e09b028e1e9b379',1,'glm']]],\n  ['aligned_5fmediump_5fuvec4',['aligned_mediump_uvec4',['../a00164.html#ga73ea0c1ba31580e107d21270883f51fc',1,'glm']]],\n  ['aligned_5fmediump_5fvec1',['aligned_mediump_vec1',['../a00164.html#ga6b797eec76fa471e300158f3453b3b2e',1,'glm']]],\n  ['aligned_5fmediump_5fvec2',['aligned_mediump_vec2',['../a00164.html#ga026a55ddbf2bafb1432f1157a2708616',1,'glm']]],\n  ['aligned_5fmediump_5fvec3',['aligned_mediump_vec3',['../a00164.html#ga3a25e494173f6a64637b08a1b50a2132',1,'glm']]],\n  ['aligned_5fmediump_5fvec4',['aligned_mediump_vec4',['../a00164.html#ga320d1c661cff2ef214eb50241f2928b2',1,'glm']]],\n  ['aligned_5fuvec1',['aligned_uvec1',['../a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548',1,'glm']]],\n  ['aligned_5fuvec2',['aligned_uvec2',['../a00164.html#ga074137e3be58528d67041c223d49f398',1,'glm']]],\n  ['aligned_5fuvec3',['aligned_uvec3',['../a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0',1,'glm']]],\n  ['aligned_5fuvec4',['aligned_uvec4',['../a00164.html#gabf842c45eea186170c267a328e3f3b7d',1,'glm']]],\n  ['aligned_5fvec1',['aligned_vec1',['../a00164.html#ga05e6d4c908965d04191c2070a8d0a65e',1,'glm']]],\n  ['aligned_5fvec2',['aligned_vec2',['../a00164.html#ga0682462f8096a226773e20fac993cde5',1,'glm']]],\n  ['aligned_5fvec3',['aligned_vec3',['../a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0',1,'glm']]],\n  ['aligned_5fvec4',['aligned_vec4',['../a00164.html#ga85d89e83cb8137e1be1446de8c3b643a',1,'glm']]],\n  ['all',['all',['../a00233.html#gab5af106b2d5675d51af84815d937384d',1,'glm']]],\n  ['angle',['angle',['../a00160.html#gaaee6c856cae3217d274a240238cb6373',1,'glm::angle(tquat&lt; T, Q &gt; const &amp;x)'],['../a00226.html#ga2e2917b4cb75ca3d043ac15ff88f14e1',1,'glm::angle(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['angleaxis',['angleAxis',['../a00160.html#ga93856b8bfcdd5b9a164248df3149476c',1,'glm']]],\n  ['any',['any',['../a00233.html#gadcc289349a96ef7642b14bc151ee4ae8',1,'glm']]],\n  ['arecollinear',['areCollinear',['../a00227.html#ga13da4a787a2ff70e95d561fb19ff91b4',1,'glm']]],\n  ['areorthogonal',['areOrthogonal',['../a00227.html#gac7b95b3f798e3c293262b2bdaad47c57',1,'glm']]],\n  ['areorthonormal',['areOrthonormal',['../a00227.html#ga1b091c3d7f9ee3b0708311c001c293e3',1,'glm']]],\n  ['asec',['asec',['../a00162.html#ga2c5b7f962c2c9ff684e6d2de48db1f10',1,'glm']]],\n  ['asech',['asech',['../a00162.html#gaec7586dccfe431f850d006f3824b8ca6',1,'glm']]],\n  ['asin',['asin',['../a00232.html#ga0552d2df4865fa8c3d7cfc3ec2caac73',1,'glm']]],\n  ['asinh',['asinh',['../a00232.html#ga3ef16b501ee859fddde88e22192a5950',1,'glm']]],\n  ['associated_5fmin_5fmax_2ehpp',['associated_min_max.hpp',['../a00007.html',1,'']]],\n  ['associatedmax',['associatedMax',['../a00169.html#ga7d9c8785230c8db60f72ec8975f1ba45',1,'glm::associatedMax(T x, U a, T y, U b)'],['../a00169.html#ga5c6758bc50aa7fbe700f87123a045aad',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b)'],['../a00169.html#ga0d169d6ce26b03248df175f39005d77f',1,'glm::associatedMax(T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b)'],['../a00169.html#ga4086269afabcb81dd7ded33cb3448653',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b)'],['../a00169.html#gaec891e363d91abbf3a4443cf2f652209',1,'glm::associatedMax(T x, U a, T y, U b, T z, U c)'],['../a00169.html#gab84fdc35016a31e8cd0cbb8296bddf7c',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c)'],['../a00169.html#gadd2a2002f4f2144bbc39eb2336dd2fba',1,'glm::associatedMax(T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c)'],['../a00169.html#ga19f59d1141a51a3b2108a9807af78f7f',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c)'],['../a00169.html#ga3038ffcb43eaa6af75897a99a5047ccc',1,'glm::associatedMax(T x, U a, T y, U b, T z, U c, T w, U d)'],['../a00169.html#gaf5ab0c428f8d1cd9e3b45fcfbf6423a6',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c, vec&lt; L, T, Q &gt; const &amp;w, vec&lt; L, U, Q &gt; const &amp;d)'],['../a00169.html#ga11477c2c4b5b0bfd1b72b29df3725a9d',1,'glm::associatedMax(T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c, T w, vec&lt; L, U, Q &gt; const &amp;d)'],['../a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)']]],\n  ['associatedmin',['associatedMin',['../a00169.html#gacc01bd272359572fc28437ae214a02df',1,'glm::associatedMin(T x, U a, T y, U b)'],['../a00169.html#gac2f0dff90948f2e44386a5eafd941d1c',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b)'],['../a00169.html#gacfec519c820331d023ef53a511749319',1,'glm::associatedMin(T x, const vec&lt; L, U, Q &gt; &amp;a, T y, const vec&lt; L, U, Q &gt; &amp;b)'],['../a00169.html#ga4757c7cab2d809124a8525d0a9deeb37',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b)'],['../a00169.html#gad0aa8f86259a26d839d34a3577a923fc',1,'glm::associatedMin(T x, U a, T y, U b, T z, U c)'],['../a00169.html#ga723e5411cebc7ffbd5c81ffeec61127d',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c)'],['../a00169.html#ga432224ebe2085eaa2b63a077ecbbbff6',1,'glm::associatedMin(T x, U a, T y, U b, T z, U c, T w, U d)'],['../a00169.html#ga66b08118bc88f0494bcacb7cdb940556',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c, vec&lt; L, T, Q &gt; const &amp;w, vec&lt; L, U, Q &gt; const &amp;d)'],['../a00169.html#ga78c28fde1a7080fb7420bd88e68c6c68',1,'glm::associatedMin(T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c, T w, vec&lt; L, U, Q &gt; const &amp;d)'],['../a00169.html#ga2db7e351994baee78540a562d4bb6d3b',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)']]],\n  ['atan',['atan',['../a00232.html#gac61629f3a4aa14057e7a8cae002291db',1,'glm::atan(vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, T, Q &gt; const &amp;x)'],['../a00232.html#ga5229f087eaccbc466f1c609ce3107b95',1,'glm::atan(vec&lt; L, T, Q &gt; const &amp;y_over_x)']]],\n  ['atan2',['atan2',['../a00176.html#gac63011205bf6d0be82589dc56dd26708',1,'glm::atan2(T x, T y)'],['../a00176.html#ga83bc41bd6f89113ee8006576b12bfc50',1,'glm::atan2(const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y)'],['../a00176.html#gac39314f5087e7e51e592897cabbc1927',1,'glm::atan2(const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y)'],['../a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3',1,'glm::atan2(const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y)']]],\n  ['atanh',['atanh',['../a00232.html#gabc925650e618357d07da255531658b87',1,'glm']]],\n  ['axis',['axis',['../a00160.html#gaaf2707d3081789ce097daaa6e54d5287',1,'glm']]],\n  ['axisangle',['axisAngle',['../a00197.html#ga97f160158906ea89676f56cc4697ec98',1,'glm']]],\n  ['axisanglematrix',['axisAngleMatrix',['../a00197.html#ga992a5db71893ed1ba6ebac99f0f69831',1,'glm']]],\n  ['angle_20and_20trigonometry_20functions',['Angle and Trigonometry Functions',['../a00232.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_10.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_10.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_10.js",
    "content": "var searchData=\n[\n  ['radialgradient',['radialGradient',['../a00187.html#gaaecb1e93de4cbe0758b882812d4da294',1,'glm']]],\n  ['radians',['radians',['../a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68',1,'glm']]],\n  ['random_2ehpp',['random.hpp',['../a00085.html',1,'']]],\n  ['range_2ehpp',['range.hpp',['../a00086.html',1,'']]],\n  ['raw_5fdata_2ehpp',['raw_data.hpp',['../a00087.html',1,'']]],\n  ['reciprocal_2ehpp',['reciprocal.hpp',['../a00088.html',1,'']]],\n  ['reflect',['reflect',['../a00142.html#ga5631dd1d5618de5450b1ea3cf3e94905',1,'glm']]],\n  ['refract',['refract',['../a00142.html#ga01da3dff9e2ef6b9d4915c3047e22b74',1,'glm']]],\n  ['repeat',['repeat',['../a00228.html#ga809650c6310ea7c42666e918c117fb6f',1,'glm']]],\n  ['rgb2ycocg',['rgb2YCoCg',['../a00174.html#ga0606353ec2a9b9eaa84f1b02ec391bc5',1,'glm']]],\n  ['rgb2ycocgr',['rgb2YCoCgR',['../a00174.html#ga0389772e44ca0fd2ba4a79bdd8efe898',1,'glm']]],\n  ['rgbcolor',['rgbColor',['../a00173.html#ga5f9193be46f45f0655c05a0cdca006db',1,'glm']]],\n  ['righthanded',['rightHanded',['../a00188.html#ga99386a5ab5491871b947076e21699cc8',1,'glm']]],\n  ['roll',['roll',['../a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b',1,'glm']]],\n  ['root_5ffive',['root_five',['../a00151.html#gae9ebbded75b53d4faeb1e4ef8b3347a2',1,'glm']]],\n  ['root_5fhalf_5fpi',['root_half_pi',['../a00151.html#ga4e276cb823cc5e612d4f89ed99c75039',1,'glm']]],\n  ['root_5fln_5ffour',['root_ln_four',['../a00151.html#ga4129412e96b33707a77c1a07652e23e2',1,'glm']]],\n  ['root_5fpi',['root_pi',['../a00151.html#ga261380796b2cd496f68d2cf1d08b8eb9',1,'glm']]],\n  ['root_5fthree',['root_three',['../a00151.html#ga4f286be4abe88be1eed7d2a9f6cb193e',1,'glm']]],\n  ['root_5ftwo',['root_two',['../a00151.html#ga74e607d29020f100c0d0dc46ce2ca950',1,'glm']]],\n  ['root_5ftwo_5fpi',['root_two_pi',['../a00151.html#ga2bcedc575039fe0cd765742f8bbb0bd3',1,'glm']]],\n  ['rotate',['rotate',['../a00157.html#gaee9e865eaa9776370996da2940873fd4',1,'glm::rotate(mat&lt; 4, 4, T, Q &gt; const &amp;m, T angle, vec&lt; 3, T, Q &gt; const &amp;axis)'],['../a00160.html#ga21c6e3b6104c9b8116a35ddf2ac4d358',1,'glm::rotate(tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)'],['../a00201.html#gad5c84a4932a758f385a87098ce1b1660',1,'glm::rotate(mat&lt; 3, 3, T, Q &gt; const &amp;m, T angle)'],['../a00212.html#ga49730f975e7f0ee3862a20b767aba583',1,'glm::rotate(tquat&lt; T, Q &gt; const &amp;q, vec&lt; 3, T, Q &gt; const &amp;v)'],['../a00212.html#ga97a5f8af1d63056b85a53ac28042fe77',1,'glm::rotate(tquat&lt; T, Q &gt; const &amp;q, vec&lt; 4, T, Q &gt; const &amp;v)'],['../a00216.html#gab64a67b52ff4f86c3ba16595a5a25af6',1,'glm::rotate(vec&lt; 2, T, Q &gt; const &amp;v, T const &amp;angle)'],['../a00216.html#ga1ba501ef83d1a009a17ac774cc560f21',1,'glm::rotate(vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)'],['../a00216.html#ga1005f1267ed9c57faa3f24cf6873b961',1,'glm::rotate(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)'],['../a00221.html#gaf599be4c0e9d99be1f9cddba79b6018b',1,'glm::rotate(T angle, vec&lt; 3, T, Q &gt; const &amp;v)']]],\n  ['rotate_5fnormalized_5faxis_2ehpp',['rotate_normalized_axis.hpp',['../a00089.html',1,'']]],\n  ['rotate_5fvector_2ehpp',['rotate_vector.hpp',['../a00090.html',1,'']]],\n  ['rotatenormalizedaxis',['rotateNormalizedAxis',['../a00215.html#ga50efd7ebca0f7a603bb3cc11e34c708d',1,'glm::rotateNormalizedAxis(mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)'],['../a00215.html#gad5bb8a155ee52fd349b88cec3a843600',1,'glm::rotateNormalizedAxis(tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)']]],\n  ['rotatex',['rotateX',['../a00216.html#ga059fdbdba4cca35cdff172a9d0d0afc9',1,'glm::rotateX(vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)'],['../a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a',1,'glm::rotateX(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)']]],\n  ['rotatey',['rotateY',['../a00216.html#gaebdc8b054ace27d9f62e054531c6f44d',1,'glm::rotateY(vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)'],['../a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b',1,'glm::rotateY(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)']]],\n  ['rotatez',['rotateZ',['../a00216.html#ga5a048838a03f6249acbacb4dbacf79c4',1,'glm::rotateZ(vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)'],['../a00216.html#ga923b75c6448161053768822d880702e6',1,'glm::rotateZ(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)']]],\n  ['rotation',['rotation',['../a00212.html#ga5a729f33cbd904c9ca14cdf25d0a07e4',1,'glm']]],\n  ['round',['round',['../a00140.html#gafa03aca8c4713e1cc892aa92ca135a7e',1,'glm']]],\n  ['round_2ehpp',['round.hpp',['../a00091.html',1,'']]],\n  ['roundeven',['roundEven',['../a00140.html#ga76b81785045a057989a84d99aeeb1578',1,'glm']]],\n  ['roundmultiple',['roundMultiple',['../a00163.html#ga6739d1de04b2cea7c78675b365644bce',1,'glm::roundMultiple(genType Source, genType Multiple)'],['../a00163.html#ga812d27fa1a60c48dc111d67da26b1455',1,'glm::roundMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)']]],\n  ['roundpoweroftwo',['roundPowerOfTwo',['../a00163.html#ga6d24a9e3abe3e6a908661b43acb8efe0',1,'glm::roundPowerOfTwo(genIUType Value)'],['../a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6',1,'glm::roundPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['row',['row',['../a00154.html#ga259e5ebd0f31ec3f83440f8cae7f5dba',1,'glm::row(genType const &amp;m, length_t index)'],['../a00154.html#gaadcc64829aadf4103477679e48c7594f',1,'glm::row(genType const &amp;m, length_t index, typename genType::row_type const &amp;x)']]],\n  ['rowmajor2',['rowMajor2',['../a00198.html#gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8',1,'glm::rowMajor2(vec&lt; 2, T, Q &gt; const &amp;v1, vec&lt; 2, T, Q &gt; const &amp;v2)'],['../a00198.html#gaf66c75ed69ca9e87462550708c2c6726',1,'glm::rowMajor2(mat&lt; 2, 2, T, Q &gt; const &amp;m)']]],\n  ['rowmajor3',['rowMajor3',['../a00198.html#ga2ae46497493339f745754e40f438442e',1,'glm::rowMajor3(vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)'],['../a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77',1,'glm::rowMajor3(mat&lt; 3, 3, T, Q &gt; const &amp;m)']]],\n  ['rowmajor4',['rowMajor4',['../a00198.html#ga9636cd6bbe2c32a8d0c03ffb8b1ef284',1,'glm::rowMajor4(vec&lt; 4, T, Q &gt; const &amp;v1, vec&lt; 4, T, Q &gt; const &amp;v2, vec&lt; 4, T, Q &gt; const &amp;v3, vec&lt; 4, T, Q &gt; const &amp;v4)'],['../a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b',1,'glm::rowMajor4(mat&lt; 4, 4, T, Q &gt; const &amp;m)']]],\n  ['rq_5fdecompose',['rq_decompose',['../a00196.html#ga82874e2ebe891ba35ac21d9993873758',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_11.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_11.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_11.js",
    "content": "var searchData=\n[\n  ['stable_20extensions',['Stable extensions',['../a00147.html',1,'']]],\n  ['saturate',['saturate',['../a00176.html#ga0fd09e616d122bc2ed9726682ffd44b7',1,'glm::saturate(T x)'],['../a00176.html#gaee97b8001c794a78a44f5d59f62a8aba',1,'glm::saturate(const vec&lt; 2, T, Q &gt; &amp;x)'],['../a00176.html#ga39bfe3a421286ee31680d45c31ccc161',1,'glm::saturate(const vec&lt; 3, T, Q &gt; &amp;x)'],['../a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183',1,'glm::saturate(const vec&lt; 4, T, Q &gt; &amp;x)']]],\n  ['saturation',['saturation',['../a00173.html#ga01a97152b44e1550edcac60bd849e884',1,'glm::saturation(T const s)'],['../a00173.html#ga2156cea600e90148ece5bc96fd6db43a',1,'glm::saturation(T const s, vec&lt; 3, T, Q &gt; const &amp;color)'],['../a00173.html#gaba0eacee0736dae860e9371cc1ae4785',1,'glm::saturation(T const s, vec&lt; 4, T, Q &gt; const &amp;color)']]],\n  ['scalar_5fmultiplication_2ehpp',['scalar_multiplication.hpp',['../a00092.html',1,'']]],\n  ['scalar_5frelational_2ehpp',['scalar_relational.hpp',['../a00093.html',1,'']]],\n  ['scale',['scale',['../a00157.html#ga05051adbee603fb3c5095d8cf5cc229b',1,'glm::scale(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)'],['../a00201.html#gadb47d2ad2bd984b213e8ff7d9cd8154e',1,'glm::scale(mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)'],['../a00221.html#gafbeefee8fec884d566e4ada0049174d7',1,'glm::scale(vec&lt; 3, T, Q &gt; const &amp;v)']]],\n  ['scalebias',['scaleBias',['../a00222.html#gabf249498b236e62c983d90d30d63c99c',1,'glm::scaleBias(T scale, T bias)'],['../a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e',1,'glm::scaleBias(mat&lt; 4, 4, T, Q &gt; const &amp;m, T scale, T bias)']]],\n  ['sec',['sec',['../a00162.html#gae4bcbebee670c5ea155f0777b3acbd84',1,'glm']]],\n  ['sech',['sech',['../a00162.html#ga9a5cfd1e7170104a7b33863b1b75e5ae',1,'glm']]],\n  ['setup_2ehpp',['setup.hpp',['../a00094.html',1,'']]],\n  ['shearx',['shearX',['../a00201.html#ga2a118ece5db1e2022112b954846012af',1,'glm']]],\n  ['shearx2d',['shearX2D',['../a00222.html#gabf714b8a358181572b32a45555f71948',1,'glm']]],\n  ['shearx3d',['shearX3D',['../a00222.html#ga73e867c6cd4d700fe2054437e56106c4',1,'glm']]],\n  ['sheary',['shearY',['../a00201.html#ga717f1833369c1ac4a40e4ac015af885e',1,'glm']]],\n  ['sheary2d',['shearY2D',['../a00222.html#gac7998d0763d9181550c77e8af09a182c',1,'glm']]],\n  ['sheary3d',['shearY3D',['../a00222.html#gade5bb65ffcb513973db1a1314fb5cfac',1,'glm']]],\n  ['shearz3d',['shearZ3D',['../a00222.html#ga6591e0a3a9d2c9c0b6577bb4dace0255',1,'glm']]],\n  ['shortmix',['shortMix',['../a00212.html#gaf0ad63ac791b1f9a587e363837c2d538',1,'glm']]],\n  ['sign',['sign',['../a00140.html#ga1e2e5cfff800056540e32f6c9b604b28',1,'glm::sign(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00193.html#ga04ef803a24f3d4f8c67dbccb33b0fce0',1,'glm::sign(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;base)']]],\n  ['simplex',['simplex',['../a00158.html#ga8122468c69015ff397349a7dcc638b27',1,'glm']]],\n  ['sin',['sin',['../a00232.html#ga29747fd108cb7292ae5a284f69691a69',1,'glm']]],\n  ['sinh',['sinh',['../a00232.html#gac7c39ff21809e281552b4dbe46f4a39d',1,'glm']]],\n  ['sint',['sint',['../a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40',1,'glm']]],\n  ['size1',['size1',['../a00219.html#gaeb877ac8f9a3703961736c1c5072cf68',1,'glm']]],\n  ['size1_5ft',['size1_t',['../a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f',1,'glm']]],\n  ['size2',['size2',['../a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe',1,'glm']]],\n  ['size2_5ft',['size2_t',['../a00219.html#ga5976c25657d4e2b5f73f39364c3845d6',1,'glm']]],\n  ['size3',['size3',['../a00219.html#gae1c72956d0359b0db332c6c8774d3b04',1,'glm']]],\n  ['size3_5ft',['size3_t',['../a00219.html#gaf2654983c60d641fd3808e65a8dfad8d',1,'glm']]],\n  ['size4',['size4',['../a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa',1,'glm']]],\n  ['size4_5ft',['size4_t',['../a00219.html#gaa423efcea63675a2df26990dbcb58656',1,'glm']]],\n  ['slerp',['slerp',['../a00160.html#ga3796542dac06014d541d67ebd5f2a88a',1,'glm::slerp(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)'],['../a00216.html#ga8b11b18ce824174ea1a5a69ea14e2cee',1,'glm::slerp(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, T const &amp;a)']]],\n  ['smoothstep',['smoothstep',['../a00140.html#ga562edf7eca082cc5b7a0aaf180436daf',1,'glm']]],\n  ['sphericalrand',['sphericalRand',['../a00161.html#ga22f90fcaccdf001c516ca90f6428e138',1,'glm']]],\n  ['spline_2ehpp',['spline.hpp',['../a00095.html',1,'']]],\n  ['sqrt',['sqrt',['../a00141.html#gaa83e5f1648b7ccdf33b87c07c76cb77c',1,'glm::sqrt(vec&lt; L, T, Q &gt; const &amp;v)'],['../a00190.html#ga7ce36693a75879ccd9bb10167cfa722d',1,'glm::sqrt(int x)'],['../a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc',1,'glm::sqrt(uint x)']]],\n  ['squad',['squad',['../a00212.html#gacfcb16619e166e672c4672aff50a565c',1,'glm']]],\n  ['std_5fbased_5ftype_2ehpp',['std_based_type.hpp',['../a00096.html',1,'']]],\n  ['step',['step',['../a00140.html#ga015a1261ff23e12650211aa872863cce',1,'glm::step(genType edge, genType x)'],['../a00140.html#ga8f9a911a48ef244b51654eaefc81c551',1,'glm::step(T edge, vec&lt; L, T, Q &gt; const &amp;x)'],['../a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f',1,'glm::step(vec&lt; L, T, Q &gt; const &amp;edge, vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['string_5fcast_2ehpp',['string_cast.hpp',['../a00097.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_12.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_12.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_12.js",
    "content": "var searchData=\n[\n  ['template_20types',['Template types',['../a00146.html',1,'']]],\n  ['types',['Types',['../a00144.html',1,'']]],\n  ['tan',['tan',['../a00232.html#ga293a34cfb9f0115cc606b4a97c84f11f',1,'glm']]],\n  ['tanh',['tanh',['../a00232.html#gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1',1,'glm']]],\n  ['third',['third',['../a00151.html#ga3077c6311010a214b69ddc8214ec13b5',1,'glm']]],\n  ['three_5fover_5ftwo_5fpi',['three_over_two_pi',['../a00151.html#gae94950df74b0ce382b1fc1d978ef7394',1,'glm']]],\n  ['to_5fstring',['to_string',['../a00220.html#ga8f0dced1fd45e67e2d77e80ab93c7af5',1,'glm']]],\n  ['tomat3',['toMat3',['../a00212.html#ga433955cb703d982427fb53b540d02f3d',1,'glm']]],\n  ['tomat4',['toMat4',['../a00212.html#ga1fa0fb798c2715148e2e0358442bf895',1,'glm']]],\n  ['toquat',['toQuat',['../a00212.html#gae9be791077b7a612d9092a922bd13f86',1,'glm::toQuat(mat&lt; 3, 3, T, Q &gt; const &amp;x)'],['../a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54',1,'glm::toQuat(mat&lt; 4, 4, T, Q &gt; const &amp;x)']]],\n  ['transform_2ehpp',['transform.hpp',['../a00098.html',1,'']]],\n  ['transform2_2ehpp',['transform2.hpp',['../a00099.html',1,'']]],\n  ['translate',['translate',['../a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284',1,'glm::translate(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)'],['../a00201.html#gaf4573ae47c80938aa9053ef6a33755ab',1,'glm::translate(mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)'],['../a00221.html#ga309a30e652e58c396e2c3d4db3ee7658',1,'glm::translate(vec&lt; 3, T, Q &gt; const &amp;v)']]],\n  ['transpose',['transpose',['../a00230.html#gae679d841da8ce9dbcc6c2d454f15bc35',1,'glm']]],\n  ['trianglenormal',['triangleNormal',['../a00204.html#gaff1cb5496925dfa7962df457772a7f35',1,'glm']]],\n  ['trigonometric_2ehpp',['trigonometric.hpp',['../a00100.html',1,'']]],\n  ['trunc',['trunc',['../a00140.html#gaf9375e3e06173271d49e6ffa3a334259',1,'glm']]],\n  ['tweakedinfiniteperspective',['tweakedInfinitePerspective',['../a00157.html#gaaeacc04a2a6f4b18c5899d37e7bb3ef9',1,'glm::tweakedInfinitePerspective(T fovy, T aspect, T near)'],['../a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8',1,'glm::tweakedInfinitePerspective(T fovy, T aspect, T near, T ep)']]],\n  ['two_5fover_5fpi',['two_over_pi',['../a00151.html#ga74eadc8a211253079683219a3ea0462a',1,'glm']]],\n  ['two_5fover_5froot_5fpi',['two_over_root_pi',['../a00151.html#ga5827301817640843cf02026a8d493894',1,'glm']]],\n  ['two_5fpi',['two_pi',['../a00151.html#gaa5276a4617566abcfe49286f40e3a256',1,'glm']]],\n  ['two_5fthirds',['two_thirds',['../a00151.html#ga9b4d2f4322edcf63a6737b92a29dd1f5',1,'glm']]],\n  ['type_5ffloat_2ehpp',['type_float.hpp',['../a00103.html',1,'']]],\n  ['type_5fgentype_2ehpp',['type_gentype.hpp',['../a00104.html',1,'']]],\n  ['type_5fhalf_2ehpp',['type_half.hpp',['../a00105.html',1,'']]],\n  ['type_5fint_2ehpp',['type_int.hpp',['../a00106.html',1,'']]],\n  ['type_5fmat_2ehpp',['type_mat.hpp',['../a00107.html',1,'']]],\n  ['type_5fmat2x2_2ehpp',['type_mat2x2.hpp',['../a00108.html',1,'']]],\n  ['type_5fmat2x3_2ehpp',['type_mat2x3.hpp',['../a00109.html',1,'']]],\n  ['type_5fmat2x4_2ehpp',['type_mat2x4.hpp',['../a00110.html',1,'']]],\n  ['type_5fmat3x2_2ehpp',['type_mat3x2.hpp',['../a00111.html',1,'']]],\n  ['type_5fmat3x3_2ehpp',['type_mat3x3.hpp',['../a00112.html',1,'']]],\n  ['type_5fmat3x4_2ehpp',['type_mat3x4.hpp',['../a00113.html',1,'']]],\n  ['type_5fmat4x2_2ehpp',['type_mat4x2.hpp',['../a00114.html',1,'']]],\n  ['type_5fmat4x3_2ehpp',['type_mat4x3.hpp',['../a00115.html',1,'']]],\n  ['type_5fmat4x4_2ehpp',['type_mat4x4.hpp',['../a00116.html',1,'']]],\n  ['type_5fprecision_2ehpp',['type_precision.hpp',['../a00117.html',1,'']]],\n  ['type_5fptr_2ehpp',['type_ptr.hpp',['../a00118.html',1,'']]],\n  ['type_5ftrait_2ehpp',['type_trait.hpp',['../a00119.html',1,'']]],\n  ['type_5fvec_2ehpp',['type_vec.hpp',['../a00120.html',1,'']]],\n  ['type_5fvec1_2ehpp',['type_vec1.hpp',['../a00121.html',1,'']]],\n  ['type_5fvec2_2ehpp',['type_vec2.hpp',['../a00122.html',1,'']]],\n  ['type_5fvec3_2ehpp',['type_vec3.hpp',['../a00123.html',1,'']]],\n  ['type_5fvec4_2ehpp',['type_vec4.hpp',['../a00124.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_13.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_13.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_13.js",
    "content": "var searchData=\n[\n  ['u16',['u16',['../a00165.html#gaa2d7acc0adb536fab71fe261232a40ff',1,'glm']]],\n  ['u16vec1',['u16vec1',['../a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5',1,'glm::u16vec1()'],['../a00206.html#ga52cc069a92e126c3a8dcde93424d2ef0',1,'glm::gtx::u16vec1()']]],\n  ['u16vec2',['u16vec2',['../a00165.html#ga2a78447eb9d66a114b193f4a25899c16',1,'glm']]],\n  ['u16vec3',['u16vec3',['../a00165.html#ga1c522ca821c27b862fe51cf4024b064b',1,'glm']]],\n  ['u16vec4',['u16vec4',['../a00165.html#ga529496d75775fb656a07993ea9af2450',1,'glm']]],\n  ['u32',['u32',['../a00165.html#ga8165913e068444f7842302d40ba897b9',1,'glm']]],\n  ['u32vec1',['u32vec1',['../a00165.html#gae627372cfd5f20dd87db490387b71195',1,'glm::u32vec1()'],['../a00206.html#ga9bbc1e14aea65cba5e2dcfef6a67d9f3',1,'glm::gtx::u32vec1()']]],\n  ['u32vec2',['u32vec2',['../a00165.html#ga2a266e46ee218d0c680f12b35c500cc0',1,'glm']]],\n  ['u32vec3',['u32vec3',['../a00165.html#gae267358ff2a41d156d97f5762630235a',1,'glm']]],\n  ['u32vec4',['u32vec4',['../a00165.html#ga31cef34e4cd04840c54741ff2f7005f0',1,'glm']]],\n  ['u64',['u64',['../a00165.html#gaf3f312156984c365e9f65620354da70b',1,'glm']]],\n  ['u64vec1',['u64vec1',['../a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd',1,'glm::u64vec1()'],['../a00206.html#ga818de170e2584ab037130f2881925974',1,'glm::gtx::u64vec1()']]],\n  ['u64vec2',['u64vec2',['../a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5',1,'glm']]],\n  ['u64vec3',['u64vec3',['../a00165.html#ga489b89ba93d4f7b3934df78debc52276',1,'glm']]],\n  ['u64vec4',['u64vec4',['../a00165.html#ga3945dd6515d4498cb603e65ff867ab03',1,'glm']]],\n  ['u8',['u8',['../a00165.html#gaecc7082561fc9028b844b6cf3d305d36',1,'glm']]],\n  ['u8vec1',['u8vec1',['../a00165.html#ga29b349e037f0b24320b4548a143daee2',1,'glm::u8vec1()'],['../a00206.html#ga5853fe457f4c8a6bc09343d0e9833980',1,'glm::gtx::u8vec1()']]],\n  ['u8vec2',['u8vec2',['../a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611',1,'glm']]],\n  ['u8vec3',['u8vec3',['../a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2',1,'glm']]],\n  ['u8vec4',['u8vec4',['../a00165.html#ga20779a61de2fd526a17f12fe53ec46b1',1,'glm']]],\n  ['uaddcarry',['uaddCarry',['../a00229.html#gaedcec48743632dff6786bcc492074b1b',1,'glm']]],\n  ['uint',['uint',['../a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14',1,'glm']]],\n  ['uint16',['uint16',['../a00165.html#ga13471cbbe74e4303a57f3743d007b74d',1,'glm']]],\n  ['uint16_5ft',['uint16_t',['../a00165.html#ga91f91f411080c37730856ff5887f5bcf',1,'glm']]],\n  ['uint32',['uint32',['../a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d',1,'glm']]],\n  ['uint32_5ft',['uint32_t',['../a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac',1,'glm']]],\n  ['uint64',['uint64',['../a00165.html#gab630f76c26b50298187f7889104d4b9c',1,'glm']]],\n  ['uint64_5ft',['uint64_t',['../a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee',1,'glm']]],\n  ['uint8',['uint8',['../a00165.html#ga36475e31b1992cfde54c1a6f5a148865',1,'glm']]],\n  ['uint8_5ft',['uint8_t',['../a00165.html#ga28d97808322d3c92186e4a0c067d7e8e',1,'glm']]],\n  ['uintbitstofloat',['uintBitsToFloat',['../a00140.html#gab2bae0d15dcdca6093f88f76b3975d97',1,'glm::uintBitsToFloat(uint const &amp;v)'],['../a00140.html#ga97f46b5f7b42fe44482e13356eb394ae',1,'glm::uintBitsToFloat(vec&lt; L, uint, Q &gt; const &amp;v)']]],\n  ['ulp_2ehpp',['ulp.hpp',['../a00125.html',1,'']]],\n  ['umat2',['umat2',['../a00155.html#ga4cae85566f900debf930c41944b64691',1,'glm']]],\n  ['umat2x2',['umat2x2',['../a00155.html#gabf8acdd33ce8951051edbca5200898aa',1,'glm']]],\n  ['umat2x3',['umat2x3',['../a00155.html#ga1870da7578d5022b973a83155d386ab3',1,'glm']]],\n  ['umat2x4',['umat2x4',['../a00155.html#ga57936a3998e992370e59a223e0ee4fd4',1,'glm']]],\n  ['umat3',['umat3',['../a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6',1,'glm']]],\n  ['umat3x2',['umat3x2',['../a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a',1,'glm']]],\n  ['umat3x3',['umat3x3',['../a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb',1,'glm']]],\n  ['umat3x4',['umat3x4',['../a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba',1,'glm']]],\n  ['umat4',['umat4',['../a00155.html#ga38bc7bb6494e344185df596deeb4544c',1,'glm']]],\n  ['umat4x2',['umat4x2',['../a00155.html#ga70fa2d05896aa83cbc8c07672a429b53',1,'glm']]],\n  ['umat4x3',['umat4x3',['../a00155.html#ga87581417945411f75cb31dd6ca1dba98',1,'glm']]],\n  ['umat4x4',['umat4x4',['../a00155.html#gaf72e6d399c42985db6872c50f53d7eb8',1,'glm']]],\n  ['umulextended',['umulExtended',['../a00229.html#ga732e2fb56db57ea541c7e5c92b7121be',1,'glm']]],\n  ['unpackdouble2x32',['unpackDouble2x32',['../a00231.html#ga5f4296dc5f12f0aa67ac05b8bb322483',1,'glm']]],\n  ['unpackf2x11_5f1x10',['unpackF2x11_1x10',['../a00159.html#ga2b1fd1e854705b1345e98409e0a25e50',1,'glm']]],\n  ['unpackf3x9_5fe1x5',['unpackF3x9_E1x5',['../a00159.html#gab9e60ebe3ad3eeced6a9ec6eb876d74e',1,'glm']]],\n  ['unpackhalf',['unpackHalf',['../a00159.html#ga30d6b2f1806315bcd6047131f547d33b',1,'glm']]],\n  ['unpackhalf1x16',['unpackHalf1x16',['../a00159.html#gac37dedaba24b00adb4ec6e8f92c19dbf',1,'glm']]],\n  ['unpackhalf2x16',['unpackHalf2x16',['../a00231.html#gaf59b52e6b28da9335322c4ae19b5d745',1,'glm']]],\n  ['unpackhalf4x16',['unpackHalf4x16',['../a00159.html#ga57dfc41b2eb20b0ac00efae7d9c49dcd',1,'glm']]],\n  ['unpacki3x10_5f1x2',['unpackI3x10_1x2',['../a00159.html#ga9a05330e5490be0908d3b117d82aff56',1,'glm']]],\n  ['unpackint2x16',['unpackInt2x16',['../a00159.html#gaccde055882918a3175de82f4ca8b7d8e',1,'glm']]],\n  ['unpackint2x32',['unpackInt2x32',['../a00159.html#gab297c0bfd38433524791eb0584d8f08d',1,'glm']]],\n  ['unpackint2x8',['unpackInt2x8',['../a00159.html#gab0c59f1e259fca9e68adb2207a6b665e',1,'glm']]],\n  ['unpackint4x16',['unpackInt4x16',['../a00159.html#ga52c154a9b232b62c22517a700cc0c78c',1,'glm']]],\n  ['unpackint4x8',['unpackInt4x8',['../a00159.html#ga1cd8d2038cdd33a860801aa155a26221',1,'glm']]],\n  ['unpackrgbm',['unpackRGBM',['../a00159.html#ga5c1ec97894b05ea21a05aea4f0204a02',1,'glm']]],\n  ['unpacksnorm',['unpackSnorm',['../a00159.html#ga6d49b31e5c3f9df8e1f99ab62b999482',1,'glm']]],\n  ['unpacksnorm1x16',['unpackSnorm1x16',['../a00159.html#ga96dd15002370627a443c835ab03a766c',1,'glm']]],\n  ['unpacksnorm1x8',['unpackSnorm1x8',['../a00159.html#ga4851ff86678aa1c7ace9d67846894285',1,'glm']]],\n  ['unpacksnorm2x16',['unpackSnorm2x16',['../a00231.html#gacd8f8971a3fe28418be0d0fa1f786b38',1,'glm']]],\n  ['unpacksnorm2x8',['unpackSnorm2x8',['../a00159.html#ga8b128e89be449fc71336968a66bf6e1a',1,'glm']]],\n  ['unpacksnorm3x10_5f1x2',['unpackSnorm3x10_1x2',['../a00159.html#ga7a4fbf79be9740e3c57737bc2af05e5b',1,'glm']]],\n  ['unpacksnorm4x16',['unpackSnorm4x16',['../a00159.html#gaaddf9c353528fe896106f7181219c7f4',1,'glm']]],\n  ['unpacksnorm4x8',['unpackSnorm4x8',['../a00231.html#ga2db488646d48b7c43d3218954523fe82',1,'glm']]],\n  ['unpacku3x10_5f1x2',['unpackU3x10_1x2',['../a00159.html#ga48df3042a7d079767f5891a1bfd8a60a',1,'glm']]],\n  ['unpackuint2x16',['unpackUint2x16',['../a00159.html#ga035bbbeab7ec2b28c0529757395b645b',1,'glm']]],\n  ['unpackuint2x32',['unpackUint2x32',['../a00159.html#gaf942ff11b65e83eb5f77e68329ebc6ab',1,'glm']]],\n  ['unpackuint2x8',['unpackUint2x8',['../a00159.html#gaa7600a6c71784b637a410869d2a5adcd',1,'glm']]],\n  ['unpackuint4x16',['unpackUint4x16',['../a00159.html#gab173834ef14cfc23a96a959f3ff4b8dc',1,'glm']]],\n  ['unpackuint4x8',['unpackUint4x8',['../a00159.html#gaf6dc0e4341810a641c7ed08f10e335d1',1,'glm']]],\n  ['unpackunorm',['unpackUnorm',['../a00159.html#ga3e6ac9178b59f0b1b2f7599f2183eb7f',1,'glm']]],\n  ['unpackunorm1x16',['unpackUnorm1x16',['../a00159.html#ga83d34160a5cb7bcb5339823210fc7501',1,'glm']]],\n  ['unpackunorm1x5_5f1x6_5f1x5',['unpackUnorm1x5_1x6_1x5',['../a00159.html#gab3bc08ecfc0f3339be93fb2b3b56d88a',1,'glm']]],\n  ['unpackunorm1x8',['unpackUnorm1x8',['../a00159.html#ga1319207e30874fb4931a9ee913983ee1',1,'glm']]],\n  ['unpackunorm2x16',['unpackUnorm2x16',['../a00231.html#ga1f66188e5d65afeb9ffba1ad971e4007',1,'glm']]],\n  ['unpackunorm2x3_5f1x2',['unpackUnorm2x3_1x2',['../a00159.html#ga6abd5a9014df3b5ce4059008d2491260',1,'glm']]],\n  ['unpackunorm2x4',['unpackUnorm2x4',['../a00159.html#ga2e50476132fe5f27f08e273d9c70d85b',1,'glm']]],\n  ['unpackunorm2x8',['unpackUnorm2x8',['../a00159.html#ga637cbe3913dd95c6e7b4c99c61bd611f',1,'glm']]],\n  ['unpackunorm3x10_5f1x2',['unpackUnorm3x10_1x2',['../a00159.html#ga5156d3060355fe332865da2c7f78815f',1,'glm']]],\n  ['unpackunorm3x5_5f1x1',['unpackUnorm3x5_1x1',['../a00159.html#ga5ff95ff5bc16f396432ab67243dbae4d',1,'glm']]],\n  ['unpackunorm4x16',['unpackUnorm4x16',['../a00159.html#ga2ae149c5d2473ac1e5f347bb654a242d',1,'glm']]],\n  ['unpackunorm4x4',['unpackUnorm4x4',['../a00159.html#gac58ee89d0e224bb6df5e8bbb18843a2d',1,'glm']]],\n  ['unpackunorm4x8',['unpackUnorm4x8',['../a00231.html#ga7f903259150b67e9466f5f8edffcd197',1,'glm']]],\n  ['unproject',['unProject',['../a00157.html#ga36641e5d60f994e01c3d8f56b10263d2',1,'glm']]],\n  ['uround',['uround',['../a00153.html#ga6715b9d573972a0f7763d30d45bcaec4',1,'glm']]],\n  ['usubborrow',['usubBorrow',['../a00229.html#gae3316ba1229ad9b9f09480833321b053',1,'glm']]],\n  ['uvec2',['uvec2',['../a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84',1,'glm']]],\n  ['uvec3',['uvec3',['../a00144.html#gae85537b672ffe0b3218cbdf1823e1c72',1,'glm']]],\n  ['uvec4',['uvec4',['../a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_14.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_14.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_14.js",
    "content": "var searchData=\n[\n  ['vector_20relational_20functions',['Vector Relational Functions',['../a00233.html',1,'']]],\n  ['value_5fptr',['value_ptr',['../a00166.html#ga1c64669e1ba1160ad9386e43dc57569a',1,'glm']]],\n  ['vec1_2ehpp',['vec1.hpp',['../a00126.html',1,'']]],\n  ['vec2',['vec2',['../a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da',1,'glm']]],\n  ['vec2_2ehpp',['vec2.hpp',['../a00127.html',1,'']]],\n  ['vec3',['vec3',['../a00144.html#gaa8ea2429bb3cb41a715258a447f39897',1,'glm']]],\n  ['vec3_2ehpp',['vec3.hpp',['../a00128.html',1,'']]],\n  ['vec4',['vec4',['../a00144.html#gafbab23070ca47932487d25332adc7d7c',1,'glm']]],\n  ['vec4_2ehpp',['vec4.hpp',['../a00129.html',1,'']]],\n  ['vec_5fswizzle_2ehpp',['vec_swizzle.hpp',['../a00130.html',1,'']]],\n  ['vector_5fangle_2ehpp',['vector_angle.hpp',['../a00131.html',1,'']]],\n  ['vector_5fquery_2ehpp',['vector_query.hpp',['../a00132.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_15.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_15.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_15.js",
    "content": "var searchData=\n[\n  ['word',['word',['../a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5',1,'glm']]],\n  ['wrap_2ehpp',['wrap.hpp',['../a00134.html',1,'']]],\n  ['wrapangle',['wrapAngle',['../a00185.html#ga069527c6dbd64f53435b8ebc4878b473',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_16.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_16.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_16.js",
    "content": "var searchData=\n[\n  ['yaw',['yaw',['../a00160.html#ga53feffeb4001b99e36e216522e465e9e',1,'glm']]],\n  ['yawpitchroll',['yawPitchRoll',['../a00179.html#gae6aa26ccb020d281b449619e419a609e',1,'glm']]],\n  ['ycocg2rgb',['YCoCg2rgb',['../a00174.html#ga163596b804c7241810b2534a99eb1343',1,'glm']]],\n  ['ycocgr2rgb',['YCoCgR2rgb',['../a00174.html#gaf8d30574c8576838097d8e20c295384a',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_17.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_17.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_17.js",
    "content": "var searchData=\n[\n  ['zero',['zero',['../a00151.html#ga788f5a421fc0f40a1296ebc094cbaa8a',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_2.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_2.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_2.js",
    "content": "var searchData=\n[\n  ['ballrand',['ballRand',['../a00161.html#ga7c53b7797f3147af68a11c767679fa3f',1,'glm']]],\n  ['bit_2ehpp',['bit.hpp',['../a00008.html',1,'']]],\n  ['bitcount',['bitCount',['../a00229.html#ga44abfe3379e11cbd29425a843420d0d6',1,'glm::bitCount(genType v)'],['../a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5',1,'glm::bitCount(vec&lt; L, T, Q &gt; const &amp;v)']]],\n  ['bitfield_2ehpp',['bitfield.hpp',['../a00009.html',1,'']]],\n  ['bitfieldextract',['bitfieldExtract',['../a00229.html#ga346b25ab11e793e91a4a69c8aa6819f2',1,'glm']]],\n  ['bitfieldfillone',['bitfieldFillOne',['../a00149.html#ga46f9295abe3b5c7658f5b13c7f819f0a',1,'glm::bitfieldFillOne(genIUType Value, int FirstBit, int BitCount)'],['../a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1',1,'glm::bitfieldFillOne(vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)']]],\n  ['bitfieldfillzero',['bitfieldFillZero',['../a00149.html#ga697b86998b7d74ee0a69d8e9f8819fee',1,'glm::bitfieldFillZero(genIUType Value, int FirstBit, int BitCount)'],['../a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2',1,'glm::bitfieldFillZero(vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)']]],\n  ['bitfieldinsert',['bitfieldInsert',['../a00229.html#ga2e82992340d421fadb61a473df699b20',1,'glm']]],\n  ['bitfieldinterleave',['bitfieldInterleave',['../a00149.html#ga24cad0069f9a0450abd80b3e89501adf',1,'glm::bitfieldInterleave(int8 x, int8 y)'],['../a00149.html#ga9a4976a529aec2cee56525e1165da484',1,'glm::bitfieldInterleave(uint8 x, uint8 y)'],['../a00149.html#gac51c33a394593f0631fa3aa5bb778809',1,'glm::bitfieldInterleave(int16 x, int16 y)'],['../a00149.html#ga94f3646a5667f4be56f8dcf3310e963f',1,'glm::bitfieldInterleave(uint16 x, uint16 y)'],['../a00149.html#gaebb756a24a0784e3d6fba8bd011ab77a',1,'glm::bitfieldInterleave(int32 x, int32 y)'],['../a00149.html#ga2f1e2b3fe699e7d897ae38b2115ddcbd',1,'glm::bitfieldInterleave(uint32 x, uint32 y)'],['../a00149.html#ga8fdb724dccd4a07d57efc01147102137',1,'glm::bitfieldInterleave(int8 x, int8 y, int8 z)'],['../a00149.html#ga9fc2a0dd5dcf8b00e113f272a5feca93',1,'glm::bitfieldInterleave(uint8 x, uint8 y, uint8 z)'],['../a00149.html#gaa901c36a842fa5d126ea650549f17b24',1,'glm::bitfieldInterleave(int16 x, int16 y, int16 z)'],['../a00149.html#ga3afd6d38881fe3948c53d4214d2197fd',1,'glm::bitfieldInterleave(uint16 x, uint16 y, uint16 z)'],['../a00149.html#gad2075d96a6640121edaa98ea534102ca',1,'glm::bitfieldInterleave(int32 x, int32 y, int32 z)'],['../a00149.html#gab19fbc739fc0cf7247978602c36f7da8',1,'glm::bitfieldInterleave(uint32 x, uint32 y, uint32 z)'],['../a00149.html#ga8a44ae22f5c953b296c42d067dccbe6d',1,'glm::bitfieldInterleave(int8 x, int8 y, int8 z, int8 w)'],['../a00149.html#ga14bb274d54a3c26f4919dd7ed0dd0c36',1,'glm::bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w)'],['../a00149.html#ga180a63161e1319fbd5a53c84d0429c7a',1,'glm::bitfieldInterleave(int16 x, int16 y, int16 z, int16 w)'],['../a00149.html#gafca8768671a14c8016facccb66a89f26',1,'glm::bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w)']]],\n  ['bitfieldreverse',['bitfieldReverse',['../a00229.html#ga750a1d92464489b7711dee67aa3441b6',1,'glm']]],\n  ['bitfieldrotateleft',['bitfieldRotateLeft',['../a00149.html#ga2eb49678a344ce1495bdb5586d9896b9',1,'glm::bitfieldRotateLeft(genIUType In, int Shift)'],['../a00149.html#gae186317091b1a39214ebf79008d44a1e',1,'glm::bitfieldRotateLeft(vec&lt; L, T, Q &gt; const &amp;In, int Shift)']]],\n  ['bitfieldrotateright',['bitfieldRotateRight',['../a00149.html#ga1c33d075c5fb8bd8dbfd5092bfc851ca',1,'glm::bitfieldRotateRight(genIUType In, int Shift)'],['../a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88',1,'glm::bitfieldRotateRight(vec&lt; L, T, Q &gt; const &amp;In, int Shift)']]],\n  ['bool1',['bool1',['../a00176.html#gaddcd7aa2e30e61af5b38660613d3979e',1,'glm']]],\n  ['bool1x1',['bool1x1',['../a00176.html#ga7f895c936f0c29c8729afbbf22806090',1,'glm']]],\n  ['bool2',['bool2',['../a00176.html#gaa09ab65ec9c3c54305ff502e2b1fe6d9',1,'glm']]],\n  ['bool2x2',['bool2x2',['../a00176.html#gadb3703955e513632f98ba12fe051ba3e',1,'glm']]],\n  ['bool2x3',['bool2x3',['../a00176.html#ga9ae6ee155d0f90cb1ae5b6c4546738a0',1,'glm']]],\n  ['bool2x4',['bool2x4',['../a00176.html#ga4d7fa65be8e8e4ad6d920b45c44e471f',1,'glm']]],\n  ['bool3',['bool3',['../a00176.html#ga99629f818737f342204071ef8296b2ed',1,'glm']]],\n  ['bool3x2',['bool3x2',['../a00176.html#gac7d7311f7e0fa8b6163d96dab033a755',1,'glm']]],\n  ['bool3x3',['bool3x3',['../a00176.html#ga6c97b99aac3e302053ffb58aace9033c',1,'glm']]],\n  ['bool3x4',['bool3x4',['../a00176.html#gae7d6b679463d37d6c527d478fb470fdf',1,'glm']]],\n  ['bool4',['bool4',['../a00176.html#ga13c3200b82708f73faac6d7f09ec91a3',1,'glm']]],\n  ['bool4x2',['bool4x2',['../a00176.html#ga9ed830f52408b2f83c085063a3eaf1d0',1,'glm']]],\n  ['bool4x3',['bool4x3',['../a00176.html#gad0f5dc7f22c2065b1b06d57f1c0658fe',1,'glm']]],\n  ['bool4x4',['bool4x4',['../a00176.html#ga7d2a7d13986602ae2896bfaa394235d4',1,'glm']]],\n  ['bvec2',['bvec2',['../a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60',1,'glm']]],\n  ['bvec3',['bvec3',['../a00144.html#ga150731e2a148eff8752114a0e450505e',1,'glm']]],\n  ['bvec4',['bvec4',['../a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6',1,'glm']]],\n  ['byte',['byte',['../a00214.html#ga3005cb0d839d546c616becfa6602c607',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_3.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_3.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_3.js",
    "content": "var searchData=\n[\n  ['catmullrom',['catmullRom',['../a00218.html#ga8119c04f8210fd0d292757565cd6918d',1,'glm']]],\n  ['ceil',['ceil',['../a00140.html#gafb9d2a645a23aca12d4d6de0104b7657',1,'glm']]],\n  ['ceilmultiple',['ceilMultiple',['../a00163.html#gac84898c466e609cdd2e81d9ba907d9e8',1,'glm::ceilMultiple(genType Source, genType Multiple)'],['../a00163.html#ga073227936f36f9102cd3a8aa45871b26',1,'glm::ceilMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)']]],\n  ['ceilpoweroftwo',['ceilPowerOfTwo',['../a00163.html#gaa73c7690c787086fa3ac1c312264acab',1,'glm::ceilPowerOfTwo(genIUType Value)'],['../a00163.html#gac46c061058771cb31c467ef673d12c80',1,'glm::ceilPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['circularrand',['circularRand',['../a00161.html#ga9dd05c36025088fae25b97c869e88517',1,'glm']]],\n  ['clamp',['clamp',['../a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c',1,'glm::clamp(genType x, genType minVal, genType maxVal)'],['../a00140.html#gabff13e6547edac08f52b4133ff4bf183',1,'glm::clamp(vec&lt; L, T, Q &gt; const &amp;x, T minVal, T maxVal)'],['../a00140.html#ga748333282a6f2f87762c0a4739c8c364',1,'glm::clamp(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;minVal, vec&lt; L, T, Q &gt; const &amp;maxVal)'],['../a00228.html#ga6c0cc6bd1d67ea1008d2592e998bad33',1,'glm::clamp(genType const &amp;Texcoord)']]],\n  ['closest_5fpoint_2ehpp',['closest_point.hpp',['../a00010.html',1,'']]],\n  ['closestpointonline',['closestPointOnLine',['../a00171.html#ga36529c278ef716986151d58d151d697d',1,'glm::closestPointOnLine(vec&lt; 3, T, Q &gt; const &amp;point, vec&lt; 3, T, Q &gt; const &amp;a, vec&lt; 3, T, Q &gt; const &amp;b)'],['../a00171.html#ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0',1,'glm::closestPointOnLine(vec&lt; 2, T, Q &gt; const &amp;point, vec&lt; 2, T, Q &gt; const &amp;a, vec&lt; 2, T, Q &gt; const &amp;b)']]],\n  ['colmajor2',['colMajor2',['../a00198.html#gaaff72f11286e59a4a88ed21a347f284c',1,'glm::colMajor2(vec&lt; 2, T, Q &gt; const &amp;v1, vec&lt; 2, T, Q &gt; const &amp;v2)'],['../a00198.html#gafc25fd44196c92b1397b127aec1281ab',1,'glm::colMajor2(mat&lt; 2, 2, T, Q &gt; const &amp;m)']]],\n  ['colmajor3',['colMajor3',['../a00198.html#ga1e25b72b085087740c92f5c70f3b051f',1,'glm::colMajor3(vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)'],['../a00198.html#ga86bd0656e787bb7f217607572590af27',1,'glm::colMajor3(mat&lt; 3, 3, T, Q &gt; const &amp;m)']]],\n  ['colmajor4',['colMajor4',['../a00198.html#gaf4aa6c7e17bfce41a6c13bf6469fab05',1,'glm::colMajor4(vec&lt; 4, T, Q &gt; const &amp;v1, vec&lt; 4, T, Q &gt; const &amp;v2, vec&lt; 4, T, Q &gt; const &amp;v3, vec&lt; 4, T, Q &gt; const &amp;v4)'],['../a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3',1,'glm::colMajor4(mat&lt; 4, 4, T, Q &gt; const &amp;m)']]],\n  ['color_5fencoding_2ehpp',['color_encoding.hpp',['../a00011.html',1,'']]],\n  ['color_5fspace_5fycocg_2ehpp',['color_space_YCoCg.hpp',['../a00014.html',1,'']]],\n  ['column',['column',['../a00154.html#ga96022eb0d3fae39d89fc7a954e59b374',1,'glm::column(genType const &amp;m, length_t index)'],['../a00154.html#ga9e757377523890e8b80c5843dbe4dd15',1,'glm::column(genType const &amp;m, length_t index, typename genType::col_type const &amp;x)']]],\n  ['common_2ehpp',['common.hpp',['../a00015.html',1,'']]],\n  ['compadd',['compAdd',['../a00177.html#gaf71833350e15e74d31cbf8a3e7f27051',1,'glm']]],\n  ['compatibility_2ehpp',['compatibility.hpp',['../a00017.html',1,'']]],\n  ['compmax',['compMax',['../a00177.html#gabfa4bb19298c8c73d4217ba759c496b6',1,'glm']]],\n  ['compmin',['compMin',['../a00177.html#gab5d0832b5c7bb01b8d7395973bfb1425',1,'glm']]],\n  ['compmul',['compMul',['../a00177.html#gae8ab88024197202c9479d33bdc5a8a5d',1,'glm']]],\n  ['compnormalize',['compNormalize',['../a00177.html#ga8f2b81ada8515875e58cb1667b6b9908',1,'glm']]],\n  ['component_5fwise_2ehpp',['component_wise.hpp',['../a00018.html',1,'']]],\n  ['compscale',['compScale',['../a00177.html#ga80abc2980d65d675f435d178c36880eb',1,'glm']]],\n  ['conjugate',['conjugate',['../a00160.html#gac40833db608deda477f018767b9a1cad',1,'glm']]],\n  ['constants_2ehpp',['constants.hpp',['../a00020.html',1,'']]],\n  ['convertd65xyztod50xyz',['convertD65XYZToD50XYZ',['../a00172.html#gad12f4f65022b2c80e33fcba2ced0dc48',1,'glm']]],\n  ['convertd65xyztolinearsrgb',['convertD65XYZToLinearSRGB',['../a00172.html#ga5265386fc3ac29e4c580d37ed470859c',1,'glm']]],\n  ['convertlinearsrgbtod50xyz',['convertLinearSRGBToD50XYZ',['../a00172.html#ga1522ba180e3d83d554a734056da031f9',1,'glm']]],\n  ['convertlinearsrgbtod65xyz',['convertLinearSRGBToD65XYZ',['../a00172.html#gaf9e130d9d4ccf51cc99317de7449f369',1,'glm']]],\n  ['convertlineartosrgb',['convertLinearToSRGB',['../a00150.html#ga42239e7b3da900f7ef37cec7e2476579',1,'glm::convertLinearToSRGB(vec&lt; L, T, Q &gt; const &amp;ColorLinear)'],['../a00150.html#gaace0a21167d13d26116c283009af57f6',1,'glm::convertLinearToSRGB(vec&lt; L, T, Q &gt; const &amp;ColorLinear, T Gamma)']]],\n  ['convertsrgbtolinear',['convertSRGBToLinear',['../a00150.html#ga16c798b7a226b2c3079dedc55083d187',1,'glm::convertSRGBToLinear(vec&lt; L, T, Q &gt; const &amp;ColorSRGB)'],['../a00150.html#gad1b91f27a9726c9cb403f9fee6e2e200',1,'glm::convertSRGBToLinear(vec&lt; L, T, Q &gt; const &amp;ColorSRGB, T Gamma)']]],\n  ['core_20features',['Core features',['../a00143.html',1,'']]],\n  ['common_20functions',['Common functions',['../a00140.html',1,'']]],\n  ['cos',['cos',['../a00232.html#ga6a41efc740e3b3c937447d3a6284130e',1,'glm']]],\n  ['cosh',['cosh',['../a00232.html#ga4e260e372742c5f517aca196cf1e62b3',1,'glm']]],\n  ['cot',['cot',['../a00162.html#ga3a7b517a95bbd3ad74da3aea87a66314',1,'glm']]],\n  ['coth',['coth',['../a00162.html#ga6b8b770eb7198e4dea59d52e6db81442',1,'glm']]],\n  ['cross',['cross',['../a00142.html#gaeeec0794212fe84fc9d261de067c9587',1,'glm::cross(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)'],['../a00182.html#gac36e72b934ea6a9dd313772d7e78fa93',1,'glm::cross(vec&lt; 2, T, Q &gt; const &amp;v, vec&lt; 2, T, Q &gt; const &amp;u)'],['../a00212.html#ga8639615408166d0dddda1b91a940b338',1,'glm::cross(tquat&lt; T, Q &gt; const &amp;q, vec&lt; 3, T, Q &gt; const &amp;v)'],['../a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce',1,'glm::cross(vec&lt; 3, T, Q &gt; const &amp;v, tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['csc',['csc',['../a00162.html#ga59dd0005b6474eea48af743b4f14ebbb',1,'glm']]],\n  ['csch',['csch',['../a00162.html#ga6d95843ff3ca6472ab399ba171d290a0',1,'glm']]],\n  ['cubic',['cubic',['../a00218.html#ga6b867eb52e2fc933d2e0bf26aabc9a70',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_4.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_4.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_4.js",
    "content": "var searchData=\n[\n  ['ddualquat',['ddualquat',['../a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6',1,'glm']]],\n  ['decompose',['decompose',['../a00195.html#ga91185463739c855d602596907a9994bc',1,'glm']]],\n  ['degrees',['degrees',['../a00232.html#ga8faec9e303538065911ba8b3caf7326b',1,'glm']]],\n  ['determinant',['determinant',['../a00230.html#gad7928795124768e058f99dce270f5c8d',1,'glm']]],\n  ['diagonal2x2',['diagonal2x2',['../a00199.html#ga58a32a2beeb2478dae2a721368cdd4ac',1,'glm']]],\n  ['diagonal2x3',['diagonal2x3',['../a00199.html#gab69f900206a430e2875a5a073851e175',1,'glm']]],\n  ['diagonal2x4',['diagonal2x4',['../a00199.html#ga30b4dbfed60a919d66acc8a63bcdc549',1,'glm']]],\n  ['diagonal3x2',['diagonal3x2',['../a00199.html#ga832c805d5130d28ad76236958d15b47d',1,'glm']]],\n  ['diagonal3x3',['diagonal3x3',['../a00199.html#ga5487ff9cdbc8e04d594adef1bcb16ee0',1,'glm']]],\n  ['diagonal3x4',['diagonal3x4',['../a00199.html#gad7551139cff0c4208d27f0ad3437833e',1,'glm']]],\n  ['diagonal4x2',['diagonal4x2',['../a00199.html#gacb8969e6543ba775c6638161a37ac330',1,'glm']]],\n  ['diagonal4x3',['diagonal4x3',['../a00199.html#gae235def5049d6740f0028433f5e13f90',1,'glm']]],\n  ['diagonal4x4',['diagonal4x4',['../a00199.html#ga0b4cd8dea436791b072356231ee8578f',1,'glm']]],\n  ['diskrand',['diskRand',['../a00161.html#gaa0b18071f3f97dbf8bcf6f53c6fe5f73',1,'glm']]],\n  ['distance',['distance',['../a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f',1,'glm']]],\n  ['distance2',['distance2',['../a00203.html#ga85660f1b79f66c09c7b5a6f80e68c89f',1,'glm']]],\n  ['dmat2',['dmat2',['../a00144.html#gac7f51e23c8802d867f564dfd146bdb44',1,'glm']]],\n  ['dmat2x2',['dmat2x2',['../a00144.html#gacc27b39853a2ecb538c8b3afc20c359e',1,'glm']]],\n  ['dmat2x3',['dmat2x3',['../a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7',1,'glm']]],\n  ['dmat2x4',['dmat2x4',['../a00144.html#gaddd230c88fbd6ec33242329be3a1b738',1,'glm']]],\n  ['dmat3',['dmat3',['../a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff',1,'glm']]],\n  ['dmat3x2',['dmat3x2',['../a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8',1,'glm']]],\n  ['dmat3x3',['dmat3x3',['../a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8',1,'glm']]],\n  ['dmat3x4',['dmat3x4',['../a00144.html#ga38d9bfca882ec542b1928cf77b5c2091',1,'glm']]],\n  ['dmat4',['dmat4',['../a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27',1,'glm']]],\n  ['dmat4x2',['dmat4x2',['../a00144.html#ga6ddab280c735a2139133b4164b99a68a',1,'glm']]],\n  ['dmat4x3',['dmat4x3',['../a00144.html#gab6c8974496fc7c72dad09219118ba89e',1,'glm']]],\n  ['dmat4x4',['dmat4x4',['../a00144.html#ga41c2da87ca627c1b2da5e895435a508e',1,'glm']]],\n  ['dot',['dot',['../a00142.html#gaad6c5d9d39bdc0bf43baf1b22e147a0a',1,'glm::dot(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00160.html#gab219911644fdc694e7d275cfcf35bfca',1,'glm::dot(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)']]],\n  ['double1',['double1',['../a00176.html#ga20b861a9b6e2a300323671c57a02525b',1,'glm']]],\n  ['double1x1',['double1x1',['../a00176.html#ga45f16a4dd0db1f199afaed9fd12fe9a8',1,'glm']]],\n  ['double2',['double2',['../a00176.html#ga31b729b04facccda73f07ed26958b3c2',1,'glm']]],\n  ['double2x2',['double2x2',['../a00176.html#gae57d0201096834d25f2b91b319e7cdbd',1,'glm']]],\n  ['double2x3',['double2x3',['../a00176.html#ga3655bc324008553ca61f39952d0b2d08',1,'glm']]],\n  ['double2x4',['double2x4',['../a00176.html#gacd33061fc64a7b2dcfd7322c49d9557a',1,'glm']]],\n  ['double3',['double3',['../a00176.html#ga3d8b9028a1053a44a98902cd1c389472',1,'glm']]],\n  ['double3x2',['double3x2',['../a00176.html#ga5ec08fc39c9d783dfcc488be240fe975',1,'glm']]],\n  ['double3x3',['double3x3',['../a00176.html#ga4bad5bb20c6ddaecfe4006c93841d180',1,'glm']]],\n  ['double3x4',['double3x4',['../a00176.html#ga2ef022e453d663d70aec414b2a80f756',1,'glm']]],\n  ['double4',['double4',['../a00176.html#gaf92f58af24f35617518aeb3d4f63fda6',1,'glm']]],\n  ['double4x2',['double4x2',['../a00176.html#gabca29ccceea53669618b751aae0ba83d',1,'glm']]],\n  ['double4x3',['double4x3',['../a00176.html#gafad66a02ccd360c86d6ab9ff9cfbc19c',1,'glm']]],\n  ['double4x4',['double4x4',['../a00176.html#gaab541bed2e788e4537852a2492860806',1,'glm']]],\n  ['dual_5fquat_5fidentity',['dual_quat_identity',['../a00178.html#ga0b35c0e30df8a875dbaa751e0bd800e0',1,'glm']]],\n  ['dual_5fquaternion_2ehpp',['dual_quaternion.hpp',['../a00021.html',1,'']]],\n  ['dualquat',['dualquat',['../a00178.html#gae93abee0c979902fbec6a7bee0f6fae1',1,'glm']]],\n  ['dualquat_5fcast',['dualquat_cast',['../a00178.html#gac4064ff813759740201765350eac4236',1,'glm::dualquat_cast(mat&lt; 2, 4, T, Q &gt; const &amp;x)'],['../a00178.html#ga91025ebdca0f4ea54da08497b00e8c84',1,'glm::dualquat_cast(mat&lt; 3, 4, T, Q &gt; const &amp;x)']]],\n  ['dvec2',['dvec2',['../a00144.html#ga15ade901680b29b78c1f9d1796db6e0e',1,'glm']]],\n  ['dvec3',['dvec3',['../a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4',1,'glm']]],\n  ['dvec4',['dvec4',['../a00144.html#ga9503f809789bda7e8852a6abde3ae5c1',1,'glm']]],\n  ['dword',['dword',['../a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_5.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_5.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_5.js",
    "content": "var searchData=\n[\n  ['exponential_20functions',['Exponential functions',['../a00141.html',1,'']]],\n  ['e',['e',['../a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139',1,'glm']]],\n  ['epsilon',['epsilon',['../a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429',1,'glm']]],\n  ['epsilon_2ehpp',['epsilon.hpp',['../a00022.html',1,'']]],\n  ['epsilonequal',['epsilonEqual',['../a00152.html#ga91b417866cafadd076004778217a1844',1,'glm::epsilonEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y, T const &amp;epsilon)'],['../a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb',1,'glm::epsilonEqual(genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)']]],\n  ['epsilonnotequal',['epsilonNotEqual',['../a00152.html#gaf840d33b9a5261ec78dcd5125743b025',1,'glm::epsilonNotEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y, T const &amp;epsilon)'],['../a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf',1,'glm::epsilonNotEqual(genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)']]],\n  ['equal',['equal',['../a00160.html#ga22089a76bfb7b45b4c34961bb715e2df',1,'glm::equal(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#ga774f9e3a93c913f1e7c215a549707d59',1,'glm::equal(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['euclidean',['euclidean',['../a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8',1,'glm']]],\n  ['euler',['euler',['../a00151.html#gad8fe2e6f90bce9d829e9723b649fbd42',1,'glm']]],\n  ['euler_5fangles_2ehpp',['euler_angles.hpp',['../a00023.html',1,'']]],\n  ['eulerangles',['eulerAngles',['../a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3',1,'glm']]],\n  ['euleranglex',['eulerAngleX',['../a00179.html#gafba6282e4ed3ff8b5c75331abfba3489',1,'glm']]],\n  ['euleranglexy',['eulerAngleXY',['../a00179.html#ga64036577ee17a2d24be0dbc05881d4e2',1,'glm']]],\n  ['euleranglexyz',['eulerAngleXYZ',['../a00179.html#ga1975e0f0e9bed7f716dc9946da2ab645',1,'glm']]],\n  ['euleranglexz',['eulerAngleXZ',['../a00179.html#gaa39bd323c65c2fc0a1508be33a237ce9',1,'glm']]],\n  ['eulerangley',['eulerAngleY',['../a00179.html#gab84bf4746805fd69b8ecbb230e3974c5',1,'glm']]],\n  ['eulerangleyx',['eulerAngleYX',['../a00179.html#ga4f57e6dd25c3cffbbd4daa6ef3f4486d',1,'glm']]],\n  ['eulerangleyxz',['eulerAngleYXZ',['../a00179.html#gab8ba99a9814f6d9edf417b6c6d5b0c10',1,'glm']]],\n  ['eulerangleyz',['eulerAngleYZ',['../a00179.html#ga220379e10ac8cca55e275f0c9018fed9',1,'glm']]],\n  ['euleranglez',['eulerAngleZ',['../a00179.html#ga5b3935248bb6c3ec6b0d9297d406e251',1,'glm']]],\n  ['euleranglezx',['eulerAngleZX',['../a00179.html#ga483903115cd4059228961046a28d69b5',1,'glm']]],\n  ['euleranglezy',['eulerAngleZY',['../a00179.html#ga400b2bd5984999efab663f3a68e1d020',1,'glm']]],\n  ['exp',['exp',['../a00141.html#ga071566cadc7505455e611f2a0353f4d4',1,'glm::exp(vec&lt; L, T, Q &gt; const &amp;v)'],['../a00212.html#ga72275e87ce62dc75a06d39a6c049835c',1,'glm::exp(tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['exp2',['exp2',['../a00141.html#gaff17ace6b579a03bf223ed4d1ed2cd16',1,'glm']]],\n  ['exponential_2ehpp',['exponential.hpp',['../a00024.html',1,'']]],\n  ['ext_2ehpp',['ext.hpp',['../a00025.html',1,'']]],\n  ['extend',['extend',['../a00180.html#ga8140caae613b0f847ab0d7175dc03a37',1,'glm']]],\n  ['extend_2ehpp',['extend.hpp',['../a00026.html',1,'']]],\n  ['extended_5fmin_5fmax_2ehpp',['extended_min_max.hpp',['../a00027.html',1,'']]],\n  ['exterior_5fproduct_2ehpp',['exterior_product.hpp',['../a00028.html',1,'']]],\n  ['extracteuleranglexyz',['extractEulerAngleXYZ',['../a00179.html#gacea701562f778c1da4d3a0a1cf091000',1,'glm']]],\n  ['extractmatrixrotation',['extractMatrixRotation',['../a00197.html#ga8834d4499a1a52fcf531b4506f0b5f67',1,'glm']]],\n  ['extractrealcomponent',['extractRealComponent',['../a00212.html#ga312385d0a8caa24c1daaa1d00ce4c2d3',1,'glm']]],\n  ['experimental_20extensions',['Experimental extensions',['../a00148.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_6.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_6.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_6.js",
    "content": "var searchData=\n[\n  ['floating_2dpoint_20pack_20and_20unpack_20functions',['Floating-Point Pack and Unpack Functions',['../a00231.html',1,'']]],\n  ['f32',['f32',['../a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7',1,'glm']]],\n  ['f32mat1',['f32mat1',['../a00206.html#ga145ad477a2a3e152855511c3b52469a6',1,'glm::gtx']]],\n  ['f32mat1x1',['f32mat1x1',['../a00206.html#gac88c6a4dbfc380aa26e3adbbade36348',1,'glm::gtx']]],\n  ['f32mat2',['f32mat2',['../a00165.html#gab12383ed6ac7595ed6fde4d266c58425',1,'glm']]],\n  ['f32mat2x2',['f32mat2x2',['../a00165.html#ga04100c76f7d55a0dd0983ccf05142bff',1,'glm']]],\n  ['f32mat2x3',['f32mat2x3',['../a00165.html#gab256cdab5eb582e426d749ae77b5b566',1,'glm']]],\n  ['f32mat2x4',['f32mat2x4',['../a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8',1,'glm']]],\n  ['f32mat3',['f32mat3',['../a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be',1,'glm']]],\n  ['f32mat3x2',['f32mat3x2',['../a00165.html#ga1320a08e14fdff3821241eefab6947e9',1,'glm']]],\n  ['f32mat3x3',['f32mat3x3',['../a00165.html#ga65261fa8a21045c8646ddff114a56174',1,'glm']]],\n  ['f32mat3x4',['f32mat3x4',['../a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d',1,'glm']]],\n  ['f32mat4',['f32mat4',['../a00165.html#ga99d1b85ff99956b33da7e9992aad129a',1,'glm']]],\n  ['f32mat4x2',['f32mat4x2',['../a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20',1,'glm']]],\n  ['f32mat4x3',['f32mat4x3',['../a00165.html#ga239b96198771b7add8eea7e6b59840c0',1,'glm']]],\n  ['f32mat4x4',['f32mat4x4',['../a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3',1,'glm']]],\n  ['f32quat',['f32quat',['../a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0',1,'glm']]],\n  ['f32vec1',['f32vec1',['../a00165.html#ga701f32ab5b3fb06996b41f5c0d643805',1,'glm::f32vec1()'],['../a00206.html#ga07f8d7348eb7ae059a84c118fdfeb943',1,'glm::gtx::f32vec1()']]],\n  ['f32vec2',['f32vec2',['../a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8',1,'glm']]],\n  ['f32vec3',['f32vec3',['../a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79',1,'glm']]],\n  ['f32vec4',['f32vec4',['../a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8',1,'glm']]],\n  ['f64',['f64',['../a00165.html#ga1d794d240091678f602e8de225b8d8c9',1,'glm']]],\n  ['f64mat1',['f64mat1',['../a00206.html#ga59bfa589419b5265d01314fcecd33435',1,'glm::gtx']]],\n  ['f64mat1x1',['f64mat1x1',['../a00206.html#ga448eeb08d0b7d8c43a8b292c981955fd',1,'glm::gtx']]],\n  ['f64mat2',['f64mat2',['../a00165.html#gad9771450a54785d13080cdde0fe20c1d',1,'glm']]],\n  ['f64mat2x2',['f64mat2x2',['../a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37',1,'glm']]],\n  ['f64mat2x3',['f64mat2x3',['../a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a',1,'glm']]],\n  ['f64mat2x4',['f64mat2x4',['../a00165.html#gac87278e0c702ba8afff76316d4eeb769',1,'glm']]],\n  ['f64mat3',['f64mat3',['../a00165.html#ga9b69181efbf8f37ae934f135137b29c0',1,'glm']]],\n  ['f64mat3x2',['f64mat3x2',['../a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7',1,'glm']]],\n  ['f64mat3x3',['f64mat3x3',['../a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185',1,'glm']]],\n  ['f64mat3x4',['f64mat3x4',['../a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675',1,'glm']]],\n  ['f64mat4',['f64mat4',['../a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc',1,'glm']]],\n  ['f64mat4x2',['f64mat4x2',['../a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512',1,'glm']]],\n  ['f64mat4x3',['f64mat4x3',['../a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110',1,'glm']]],\n  ['f64mat4x4',['f64mat4x4',['../a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e',1,'glm']]],\n  ['f64quat',['f64quat',['../a00165.html#ga14c583bd625eda8cf4935a14d5dd544d',1,'glm']]],\n  ['f64vec1',['f64vec1',['../a00165.html#gade502df1ce14f837fae7f60a03ddb9b0',1,'glm::f64vec1()'],['../a00206.html#gae5987a61b8c03d5c432a9e62f0b3efe1',1,'glm::gtx::f64vec1()']]],\n  ['f64vec2',['f64vec2',['../a00165.html#gadc4e1594f9555d919131ee02b17822a2',1,'glm']]],\n  ['f64vec3',['f64vec3',['../a00165.html#gaa7a1ddca75c5f629173bf4772db7a635',1,'glm']]],\n  ['f64vec4',['f64vec4',['../a00165.html#ga66e92e57260bdb910609b9a56bf83e97',1,'glm']]],\n  ['faceforward',['faceforward',['../a00142.html#ga7aed0a36c738169402404a3a5d54e43b',1,'glm']]],\n  ['factorial',['factorial',['../a00190.html#ga8cbd3120905f398ec321b5d1836e08fb',1,'glm']]],\n  ['fast_5fexponential_2ehpp',['fast_exponential.hpp',['../a00029.html',1,'']]],\n  ['fast_5fsquare_5froot_2ehpp',['fast_square_root.hpp',['../a00030.html',1,'']]],\n  ['fast_5ftrigonometry_2ehpp',['fast_trigonometry.hpp',['../a00031.html',1,'']]],\n  ['fastacos',['fastAcos',['../a00185.html#ga9721d63356e5d94fdc4b393a426ab26b',1,'glm']]],\n  ['fastasin',['fastAsin',['../a00185.html#ga562cb62c51fbfe7fac7db0bce706b81f',1,'glm']]],\n  ['fastatan',['fastAtan',['../a00185.html#ga8d197c6ef564f5e5d59af3b3f8adcc2c',1,'glm::fastAtan(T y, T x)'],['../a00185.html#gae25de86a968490ff56856fa425ec9d30',1,'glm::fastAtan(T angle)']]],\n  ['fastcos',['fastCos',['../a00185.html#gab34c8b45c23c0165a64dcecfcc3b302a',1,'glm']]],\n  ['fastdistance',['fastDistance',['../a00184.html#gaac333418d0c4e0cc6d3d219ed606c238',1,'glm::fastDistance(genType x, genType y)'],['../a00184.html#ga42d3e771fa7cb3c60d828e315829df19',1,'glm::fastDistance(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['fastexp',['fastExp',['../a00183.html#gaa3180ac8f96ab37ab96e0cacaf608e10',1,'glm::fastExp(T x)'],['../a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58',1,'glm::fastExp(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastexp2',['fastExp2',['../a00183.html#ga0af50585955eb14c60bb286297fabab2',1,'glm::fastExp2(T x)'],['../a00183.html#gacaaed8b67d20d244b7de217e7816c1b6',1,'glm::fastExp2(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastinversesqrt',['fastInverseSqrt',['../a00184.html#ga7f081b14d9c7035c8714eba5f7f75a8f',1,'glm::fastInverseSqrt(genType x)'],['../a00184.html#gadcd7be12b1e5ee182141359d4c45dd24',1,'glm::fastInverseSqrt(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastlength',['fastLength',['../a00184.html#gafe697d6287719538346bbdf8b1367c59',1,'glm::fastLength(genType x)'],['../a00184.html#ga90f66be92ef61e705c005e7b3209edb8',1,'glm::fastLength(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastlog',['fastLog',['../a00183.html#gae1bdc97b7f96a600e29c753f1cd4388a',1,'glm::fastLog(T x)'],['../a00183.html#ga937256993a7219e73f186bb348fe6be8',1,'glm::fastLog(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastlog2',['fastLog2',['../a00183.html#ga6e98118685f6dc9e05fbb13dd5e5234e',1,'glm::fastLog2(T x)'],['../a00183.html#ga7562043539194ccc24649f8475bc5584',1,'glm::fastLog2(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastmix',['fastMix',['../a00212.html#gac5c77bc74dfc750aaf271d68f271bf2b',1,'glm']]],\n  ['fastnormalize',['fastNormalize',['../a00184.html#ga3b02c1d6e0c754144e2f1e110bf9f16c',1,'glm']]],\n  ['fastnormalizedot',['fastNormalizeDot',['../a00205.html#ga2746fb9b5bd22b06b2f7c8babba5de9e',1,'glm']]],\n  ['fastpow',['fastPow',['../a00183.html#ga5340e98a11fcbbd936ba6e983a154d50',1,'glm::fastPow(genType x, genType y)'],['../a00183.html#ga15325a8ed2d1c4ed2412c4b3b3927aa2',1,'glm::fastPow(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00183.html#ga7f2562db9c3e02ae76169c36b086c3f6',1,'glm::fastPow(genTypeT x, genTypeU y)'],['../a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5',1,'glm::fastPow(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastsin',['fastSin',['../a00185.html#ga0aab3257bb3b628d10a1e0483e2c6915',1,'glm']]],\n  ['fastsqrt',['fastSqrt',['../a00184.html#ga6c460e9414a50b2fc455c8f64c86cdc9',1,'glm::fastSqrt(genType x)'],['../a00184.html#gae83f0c03614f73eae5478c5b6274ee6d',1,'glm::fastSqrt(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fasttan',['fastTan',['../a00185.html#gaf29b9c1101a10007b4f79ee89df27ba2',1,'glm']]],\n  ['fdualquat',['fdualquat',['../a00178.html#ga237c2b9b42c9a930e49de5840ae0f930',1,'glm']]],\n  ['findlsb',['findLSB',['../a00229.html#gaf74c4d969fa34ab8acb9d390f5ca5274',1,'glm::findLSB(genIUType x)'],['../a00229.html#ga4454c0331d6369888c28ab677f4810c7',1,'glm::findLSB(vec&lt; L, T, Q &gt; const &amp;v)']]],\n  ['findmsb',['findMSB',['../a00229.html#ga7e4a794d766861c70bc961630f8ef621',1,'glm::findMSB(genIUType x)'],['../a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872',1,'glm::findMSB(vec&lt; L, T, Q &gt; const &amp;v)']]],\n  ['fliplr',['fliplr',['../a00196.html#gaf39f4e5f78eb29c1a90277d45b9b3feb',1,'glm']]],\n  ['flipud',['flipud',['../a00196.html#ga85003371f0ba97380dd25e8905de1870',1,'glm']]],\n  ['float1',['float1',['../a00176.html#gaf5208d01f6c6fbcb7bb55d610b9c0ead',1,'glm']]],\n  ['float1x1',['float1x1',['../a00176.html#ga73720b8dc4620835b17f74d428f98c0c',1,'glm']]],\n  ['float2',['float2',['../a00176.html#ga02d3c013982c183906c61d74aa3166ce',1,'glm']]],\n  ['float2x2',['float2x2',['../a00176.html#ga33d43ecbb60a85a1366ff83f8a0ec85f',1,'glm']]],\n  ['float2x3',['float2x3',['../a00176.html#ga939b0cff15cee3030f75c1b2e36f89fe',1,'glm']]],\n  ['float2x4',['float2x4',['../a00176.html#gafec3cfd901ab334a92e0242b8f2269b4',1,'glm']]],\n  ['float3',['float3',['../a00176.html#ga821ff110fc8533a053cbfcc93e078cc0',1,'glm']]],\n  ['float32',['float32',['../a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1',1,'glm']]],\n  ['float32_5ft',['float32_t',['../a00165.html#ga41d579d81c3d98edd0532244fa02da77',1,'glm']]],\n  ['float3x2',['float3x2',['../a00176.html#gaa6c69f04ba95f3faedf95dae874de576',1,'glm']]],\n  ['float3x3',['float3x3',['../a00176.html#ga6ceb5d38a58becdf420026e12a6562f3',1,'glm']]],\n  ['float3x4',['float3x4',['../a00176.html#ga4d2679c321b793ca3784fe0315bb5332',1,'glm']]],\n  ['float4',['float4',['../a00176.html#gae2da7345087db3815a25d8837a727ef1',1,'glm']]],\n  ['float4x2',['float4x2',['../a00176.html#ga308b9af0c221145bcfe9bfc129d9098e',1,'glm']]],\n  ['float4x3',['float4x3',['../a00176.html#gac0a51b4812038aa81d73ffcc37f741ac',1,'glm']]],\n  ['float4x4',['float4x4',['../a00176.html#gad3051649b3715d828a4ab92cdae7c3bf',1,'glm']]],\n  ['float64',['float64',['../a00165.html#gab5596d48586414c91ccb270962dc14d3',1,'glm']]],\n  ['float64_5ft',['float64_t',['../a00165.html#ga6957c7b22f405683bb276554ca40dc37',1,'glm']]],\n  ['float_5fdistance',['float_distance',['../a00167.html#ga2e09bd6c8b0a9c91f6f5683d68245634',1,'glm::float_distance(T const &amp;x, T const &amp;y)'],['../a00167.html#ga72b3223069013f336d8c31812b7ada80',1,'glm::float_distance(vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)']]],\n  ['floatbitstoint',['floatBitsToInt',['../a00140.html#ga1425c1c3160ec51214b03a0469a3013d',1,'glm::floatBitsToInt(float const &amp;v)'],['../a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed',1,'glm::floatBitsToInt(vec&lt; L, float, Q &gt; const &amp;v)']]],\n  ['floatbitstouint',['floatBitsToUint',['../a00140.html#ga70e0271c34af52f3100c7960e18c3f2b',1,'glm::floatBitsToUint(float const &amp;v)'],['../a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db',1,'glm::floatBitsToUint(vec&lt; L, float, Q &gt; const &amp;v)']]],\n  ['floor',['floor',['../a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d',1,'glm']]],\n  ['floor_5flog2',['floor_log2',['../a00190.html#ga7011b4e1c1e1ed492149b028feacc00e',1,'glm']]],\n  ['floormultiple',['floorMultiple',['../a00163.html#ga9eafb9dbedf84e5cece65c2fe9d5631d',1,'glm::floorMultiple(genType Source, genType Multiple)'],['../a00163.html#ga2b6d6bcdf0641b54cb539104c224885b',1,'glm::floorMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)']]],\n  ['floorpoweroftwo',['floorPowerOfTwo',['../a00163.html#gac80f6519c31baae10d8d7bea6735d1fa',1,'glm::floorPowerOfTwo(genIUType Value)'],['../a00163.html#ga6ebfea889605abf6629c7589e0cb2e28',1,'glm::floorPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['fma',['fma',['../a00140.html#gad0f444d4b81cc53c3b6edf5aa25078c2',1,'glm']]],\n  ['fmat2',['fmat2',['../a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280',1,'glm']]],\n  ['fmat2x2',['fmat2x2',['../a00165.html#ga3350c93c3275298f940a42875388e4b4',1,'glm']]],\n  ['fmat2x3',['fmat2x3',['../a00165.html#ga55a2d2a8eb09b5633668257eb3cad453',1,'glm']]],\n  ['fmat2x4',['fmat2x4',['../a00165.html#ga681381f19f11c9e5ee45cda2c56937ff',1,'glm']]],\n  ['fmat3',['fmat3',['../a00165.html#ga253d453c20e037730023fea0215cb6f6',1,'glm']]],\n  ['fmat3x2',['fmat3x2',['../a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f',1,'glm']]],\n  ['fmat3x3',['fmat3x3',['../a00165.html#gaa07c86650253672a19dbfb898f3265b8',1,'glm']]],\n  ['fmat3x4',['fmat3x4',['../a00165.html#ga44e158af77a670ee1b58c03cda9e1619',1,'glm']]],\n  ['fmat4',['fmat4',['../a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca',1,'glm']]],\n  ['fmat4x2',['fmat4x2',['../a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774',1,'glm']]],\n  ['fmat4x3',['fmat4x3',['../a00165.html#ga4295048a78bdf46b8a7de77ec665b497',1,'glm']]],\n  ['fmat4x4',['fmat4x4',['../a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3',1,'glm']]],\n  ['fmod',['fmod',['../a00175.html#gae5e80425df9833164ad469e83b475fb4',1,'glm']]],\n  ['four_5fover_5fpi',['four_over_pi',['../a00151.html#ga753950e5140e4ea6a88e4a18ba61dc09',1,'glm']]],\n  ['fract',['fract',['../a00140.html#ga8ba89e40e55ae5cdf228548f9b7639c7',1,'glm::fract(genType x)'],['../a00140.html#ga2df623004f634b440d61e018d62c751b',1,'glm::fract(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['frexp',['frexp',['../a00140.html#ga20620e83544d1a988857a3bc4ebe0e1d',1,'glm']]],\n  ['frustum',['frustum',['../a00157.html#ga0bcd4542e0affc63a0b8c08fcb839ea9',1,'glm']]],\n  ['frustumlh',['frustumLH',['../a00157.html#gae4277c37f61d81da01bc9db14ea90296',1,'glm']]],\n  ['frustumrh',['frustumRH',['../a00157.html#ga4366ab45880c6c5f8b3e8c371ca4b136',1,'glm']]],\n  ['functions_2ehpp',['functions.hpp',['../a00032.html',1,'']]],\n  ['fvec1',['fvec1',['../a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f',1,'glm']]],\n  ['fvec2',['fvec2',['../a00165.html#ga24273aa02abaecaab7f160bac437a339',1,'glm']]],\n  ['fvec3',['fvec3',['../a00165.html#ga89930533646b30d021759298aa6bf04a',1,'glm']]],\n  ['fvec4',['fvec4',['../a00165.html#ga713c796c54875cf4092d42ff9d9096b0',1,'glm']]],\n  ['fwd_2ehpp',['fwd.hpp',['../a00033.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_7.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_7.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_7.js",
    "content": "var searchData=\n[\n  ['color_5fspace_2ehpp',['color_space.hpp',['../a00012.html',1,'']]],\n  ['color_5fspace_2ehpp',['color_space.hpp',['../a00013.html',1,'']]],\n  ['common_2ehpp',['common.hpp',['../a00016.html',1,'']]],\n  ['geometric_20functions',['Geometric functions',['../a00142.html',1,'']]],\n  ['gauss',['gauss',['../a00186.html#ga0b50b197ff74261a0fad90f4b8d24702',1,'glm::gauss(T x, T ExpectedValue, T StandardDeviation)'],['../a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab',1,'glm::gauss(vec&lt; 2, T, Q &gt; const &amp;Coord, vec&lt; 2, T, Q &gt; const &amp;ExpectedValue, vec&lt; 2, T, Q &gt; const &amp;StandardDeviation)']]],\n  ['gaussrand',['gaussRand',['../a00161.html#ga5193a83e49e4fdc5652c084711083574',1,'glm']]],\n  ['geometric_2ehpp',['geometric.hpp',['../a00034.html',1,'']]],\n  ['glm_2ehpp',['glm.hpp',['../a00035.html',1,'']]],\n  ['glm_5faligned_5ftypedef',['GLM_ALIGNED_TYPEDEF',['../a00223.html#gab5cd5c5fad228b25c782084f1cc30114',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int8, aligned_lowp_int8, 1)'],['../a00223.html#ga5bb5dd895ef625c1b113f2cf400186b0',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int16, aligned_lowp_int16, 2)'],['../a00223.html#gac6efa54cf7c6c86f7158922abdb1a430',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int32, aligned_lowp_int32, 4)'],['../a00223.html#ga6612eb77c8607048e7552279a11eeb5f',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int64, aligned_lowp_int64, 8)'],['../a00223.html#ga7ddc1848ff2223026db8968ce0c97497',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int8_t, aligned_lowp_int8_t, 1)'],['../a00223.html#ga22240dd9458b0f8c11fbcc4f48714f68',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int16_t, aligned_lowp_int16_t, 2)'],['../a00223.html#ga8130ea381d76a2cc34a93ccbb6cf487d',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int32_t, aligned_lowp_int32_t, 4)'],['../a00223.html#ga7ccb60f3215d293fd62b33b31ed0e7be',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int64_t, aligned_lowp_int64_t, 8)'],['../a00223.html#gac20d508d2ef5cc95ad3daf083c57ec2a',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_i8, aligned_lowp_i8, 1)'],['../a00223.html#ga50257b48069a31d0c8d9c1f644d267de',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_i16, aligned_lowp_i16, 2)'],['../a00223.html#gaa07e98e67b7a3435c0746018c7a2a839',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_i32, aligned_lowp_i32, 4)'],['../a00223.html#ga62601fc6f8ca298b77285bedf03faffd',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_i64, aligned_lowp_i64, 8)'],['../a00223.html#gac8cff825951aeb54dd846037113c72db',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int8, aligned_mediump_int8, 1)'],['../a00223.html#ga78f443d88f438575a62b5df497cdf66b',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int16, aligned_mediump_int16, 2)'],['../a00223.html#ga0680cd3b5d4e8006985fb41a4f9b57af',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int32, aligned_mediump_int32, 4)'],['../a00223.html#gad9e5babb1dd3e3531b42c37bf25dd951',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int64, aligned_mediump_int64, 8)'],['../a00223.html#ga353fd9fa8a9ad952fcabd0d53ad9a6dd',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int8_t, aligned_mediump_int8_t, 1)'],['../a00223.html#ga2196442c0e5c5e8c77842de388c42521',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int16_t, aligned_mediump_int16_t, 2)'],['../a00223.html#ga1284488189daf897cf095c5eefad9744',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int32_t, aligned_mediump_int32_t, 4)'],['../a00223.html#ga73fdc86a539808af58808b7c60a1c4d8',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int64_t, aligned_mediump_int64_t, 8)'],['../a00223.html#gafafeea923e1983262c972e2b83922d3b',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_i8, aligned_mediump_i8, 1)'],['../a00223.html#ga4b35ca5fe8f55c9d2fe54fdb8d8896f4',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_i16, aligned_mediump_i16, 2)'],['../a00223.html#ga63b882e29170d428463d99c3d630acc6',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_i32, aligned_mediump_i32, 4)'],['../a00223.html#ga8b20507bb048c1edea2d441cc953e6f0',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_i64, aligned_mediump_i64, 8)'],['../a00223.html#ga56c5ca60813027b603c7b61425a0479d',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int8, aligned_highp_int8, 1)'],['../a00223.html#ga7a751b3aff24c0259f4a7357c2969089',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int16, aligned_highp_int16, 2)'],['../a00223.html#ga70cd2144351c556469ee6119e59971fc',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int32, aligned_highp_int32, 4)'],['../a00223.html#ga46bbf08dc004d8c433041e0b5018a5d3',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int64, aligned_highp_int64, 8)'],['../a00223.html#gab3e10c77a20d1abad2de1c561c7a5c18',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int8_t, aligned_highp_int8_t, 1)'],['../a00223.html#ga968f30319ebeaca9ebcd3a25a8e139fb',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int16_t, aligned_highp_int16_t, 2)'],['../a00223.html#gaae773c28e6390c6aa76f5b678b7098a3',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int32_t, aligned_highp_int32_t, 4)'],['../a00223.html#ga790cfff1ca39d0ed696ffed980809311',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int64_t, aligned_highp_int64_t, 8)'],['../a00223.html#ga8265b91eb23c120a9b0c3e381bc37b96',1,'glm::GLM_ALIGNED_TYPEDEF(highp_i8, aligned_highp_i8, 1)'],['../a00223.html#gae6d384de17588d8edb894fbe06e0d410',1,'glm::GLM_ALIGNED_TYPEDEF(highp_i16, aligned_highp_i16, 2)'],['../a00223.html#ga9c8172b745ee03fc5b2b91c350c2922f',1,'glm::GLM_ALIGNED_TYPEDEF(highp_i32, aligned_highp_i32, 4)'],['../a00223.html#ga77e0dff12aa4020ddc3f8cabbea7b2e6',1,'glm::GLM_ALIGNED_TYPEDEF(highp_i64, aligned_highp_i64, 8)'],['../a00223.html#gabd82b9faa9d4d618dbbe0fc8a1efee63',1,'glm::GLM_ALIGNED_TYPEDEF(int8, aligned_int8, 1)'],['../a00223.html#ga285649744560be21000cfd81bbb5d507',1,'glm::GLM_ALIGNED_TYPEDEF(int16, aligned_int16, 2)'],['../a00223.html#ga07732da630b2deda428ce95c0ecaf3ff',1,'glm::GLM_ALIGNED_TYPEDEF(int32, aligned_int32, 4)'],['../a00223.html#ga1a8da2a8c51f69c07a2e7f473aa420f4',1,'glm::GLM_ALIGNED_TYPEDEF(int64, aligned_int64, 8)'],['../a00223.html#ga848aedf13e2d9738acf0bb482c590174',1,'glm::GLM_ALIGNED_TYPEDEF(int8_t, aligned_int8_t, 1)'],['../a00223.html#gafd2803d39049dd45a37a63931e25d943',1,'glm::GLM_ALIGNED_TYPEDEF(int16_t, aligned_int16_t, 2)'],['../a00223.html#gae553b33349d6da832cf0724f1e024094',1,'glm::GLM_ALIGNED_TYPEDEF(int32_t, aligned_int32_t, 4)'],['../a00223.html#ga16d223a2b3409e812e1d3bd87f0e9e5c',1,'glm::GLM_ALIGNED_TYPEDEF(int64_t, aligned_int64_t, 8)'],['../a00223.html#ga2de065d2ddfdb366bcd0febca79ae2ad',1,'glm::GLM_ALIGNED_TYPEDEF(i8, aligned_i8, 1)'],['../a00223.html#gabd786bdc20a11c8cb05c92c8212e28d3',1,'glm::GLM_ALIGNED_TYPEDEF(i16, aligned_i16, 2)'],['../a00223.html#gad4aefe56691cdb640c72f0d46d3fb532',1,'glm::GLM_ALIGNED_TYPEDEF(i32, aligned_i32, 4)'],['../a00223.html#ga8fe9745f7de24a8394518152ff9fccdc',1,'glm::GLM_ALIGNED_TYPEDEF(i64, aligned_i64, 8)'],['../a00223.html#gaaad735483450099f7f882d4e3a3569bd',1,'glm::GLM_ALIGNED_TYPEDEF(ivec1, aligned_ivec1, 4)'],['../a00223.html#gac7b6f823802edbd6edbaf70ea25bf068',1,'glm::GLM_ALIGNED_TYPEDEF(ivec2, aligned_ivec2, 8)'],['../a00223.html#ga3e235bcd2b8029613f25b8d40a2d3ef7',1,'glm::GLM_ALIGNED_TYPEDEF(ivec3, aligned_ivec3, 16)'],['../a00223.html#ga50d8a9523968c77f8325b4c9bfbff41e',1,'glm::GLM_ALIGNED_TYPEDEF(ivec4, aligned_ivec4, 16)'],['../a00223.html#ga9ec20fdfb729c702032da9378c79679f',1,'glm::GLM_ALIGNED_TYPEDEF(i8vec1, aligned_i8vec1, 1)'],['../a00223.html#ga25b3fe1d9e8d0a5e86c1949c1acd8131',1,'glm::GLM_ALIGNED_TYPEDEF(i8vec2, aligned_i8vec2, 2)'],['../a00223.html#ga2958f907719d94d8109b562540c910e2',1,'glm::GLM_ALIGNED_TYPEDEF(i8vec3, aligned_i8vec3, 4)'],['../a00223.html#ga1fe6fc032a978f1c845fac9aa0668714',1,'glm::GLM_ALIGNED_TYPEDEF(i8vec4, aligned_i8vec4, 4)'],['../a00223.html#gaa4161e7a496dc96972254143fe873e55',1,'glm::GLM_ALIGNED_TYPEDEF(i16vec1, aligned_i16vec1, 2)'],['../a00223.html#ga9d7cb211ccda69b1c22ddeeb0f3e7aba',1,'glm::GLM_ALIGNED_TYPEDEF(i16vec2, aligned_i16vec2, 4)'],['../a00223.html#gaaee91dd2ab34423bcc11072ef6bd0f02',1,'glm::GLM_ALIGNED_TYPEDEF(i16vec3, aligned_i16vec3, 8)'],['../a00223.html#ga49f047ccaa8b31fad9f26c67bf9b3510',1,'glm::GLM_ALIGNED_TYPEDEF(i16vec4, aligned_i16vec4, 8)'],['../a00223.html#ga904e9c2436bb099397c0823506a0771f',1,'glm::GLM_ALIGNED_TYPEDEF(i32vec1, aligned_i32vec1, 4)'],['../a00223.html#gaf90651cf2f5e7ee2b11cfdc5a6749534',1,'glm::GLM_ALIGNED_TYPEDEF(i32vec2, aligned_i32vec2, 8)'],['../a00223.html#ga7354a4ead8cb17868aec36b9c30d6010',1,'glm::GLM_ALIGNED_TYPEDEF(i32vec3, aligned_i32vec3, 16)'],['../a00223.html#gad2ecbdea18732163e2636e27b37981ee',1,'glm::GLM_ALIGNED_TYPEDEF(i32vec4, aligned_i32vec4, 16)'],['../a00223.html#ga965b1c9aa1800e93d4abc2eb2b5afcbf',1,'glm::GLM_ALIGNED_TYPEDEF(i64vec1, aligned_i64vec1, 8)'],['../a00223.html#ga1f9e9c2ea2768675dff9bae5cde2d829',1,'glm::GLM_ALIGNED_TYPEDEF(i64vec2, aligned_i64vec2, 16)'],['../a00223.html#gad77c317b7d942322cd5be4c8127b3187',1,'glm::GLM_ALIGNED_TYPEDEF(i64vec3, aligned_i64vec3, 32)'],['../a00223.html#ga716f8ea809bdb11b5b542d8b71aeb04f',1,'glm::GLM_ALIGNED_TYPEDEF(i64vec4, aligned_i64vec4, 32)'],['../a00223.html#gad46f8e9082d5878b1bc04f9c1471cdaa',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint8, aligned_lowp_uint8, 1)'],['../a00223.html#ga1246094581af624aca6c7499aaabf801',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint16, aligned_lowp_uint16, 2)'],['../a00223.html#ga7a5009a1d0196bbf21dd7518f61f0249',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint32, aligned_lowp_uint32, 4)'],['../a00223.html#ga45213fd18b3bb1df391671afefe4d1e7',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint64, aligned_lowp_uint64, 8)'],['../a00223.html#ga0ba26b4e3fd9ecbc25358efd68d8a4ca',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint8_t, aligned_lowp_uint8_t, 1)'],['../a00223.html#gaf2b58f5fb6d4ec8ce7b76221d3af43e1',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint16_t, aligned_lowp_uint16_t, 2)'],['../a00223.html#gadc246401847dcba155f0699425e49dcd',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint32_t, aligned_lowp_uint32_t, 4)'],['../a00223.html#gaace64bddf51a9def01498da9a94fb01c',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint64_t, aligned_lowp_uint64_t, 8)'],['../a00223.html#gad7bb97c29d664bd86ffb1bed4abc5534',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_u8, aligned_lowp_u8, 1)'],['../a00223.html#ga404bba7785130e0b1384d695a9450b28',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_u16, aligned_lowp_u16, 2)'],['../a00223.html#ga31ba41fd896257536958ec6080203d2a',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_u32, aligned_lowp_u32, 4)'],['../a00223.html#gacca5f13627f57b3505676e40a6e43e5e',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_u64, aligned_lowp_u64, 8)'],['../a00223.html#ga5faf1d3e70bf33174dd7f3d01d5b883b',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint8, aligned_mediump_uint8, 1)'],['../a00223.html#ga727e2bf2c433bb3b0182605860a48363',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint16, aligned_mediump_uint16, 2)'],['../a00223.html#ga12566ca66d5962dadb4a5eb4c74e891e',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint32, aligned_mediump_uint32, 4)'],['../a00223.html#ga7b66a97a8acaa35c5a377b947318c6bc',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint64, aligned_mediump_uint64, 8)'],['../a00223.html#gaa9cde002439b74fa66120a16a9f55fcc',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint8_t, aligned_mediump_uint8_t, 1)'],['../a00223.html#ga1ca98c67f7d1e975f7c5202f1da1df1f',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint16_t, aligned_mediump_uint16_t, 2)'],['../a00223.html#ga1dc8bc6199d785f235576948d80a597c',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint32_t, aligned_mediump_uint32_t, 4)'],['../a00223.html#gad14a0f2ec93519682b73d70b8e401d81',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint64_t, aligned_mediump_uint64_t, 8)'],['../a00223.html#gada8b996eb6526dc1ead813bd49539d1b',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_u8, aligned_mediump_u8, 1)'],['../a00223.html#ga28948f6bfb52b42deb9d73ae1ea8d8b0',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_u16, aligned_mediump_u16, 2)'],['../a00223.html#gad6a7c0b5630f89d3f1c5b4ef2919bb4c',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_u32, aligned_mediump_u32, 4)'],['../a00223.html#gaa0fc531cbaa972ac3a0b86d21ef4a7fa',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_u64, aligned_mediump_u64, 8)'],['../a00223.html#ga0ee829f7b754b262bbfe6317c0d678ac',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint8, aligned_highp_uint8, 1)'],['../a00223.html#ga447848a817a626cae08cedc9778b331c',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint16, aligned_highp_uint16, 2)'],['../a00223.html#ga6027ae13b2734f542a6e7beee11b8820',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint32, aligned_highp_uint32, 4)'],['../a00223.html#ga2aca46c8608c95ef991ee4c332acde5f',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint64, aligned_highp_uint64, 8)'],['../a00223.html#gaff50b10dd1c48be324fdaffd18e2c7ea',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint8_t, aligned_highp_uint8_t, 1)'],['../a00223.html#ga9fc4421dbb833d5461e6d4e59dcfde55',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint16_t, aligned_highp_uint16_t, 2)'],['../a00223.html#ga329f1e2b94b33ba5e3918197030bcf03',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint32_t, aligned_highp_uint32_t, 4)'],['../a00223.html#ga71e646f7e301aa422328194162c9c998',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint64_t, aligned_highp_uint64_t, 8)'],['../a00223.html#ga8942e09f479489441a7a5004c6d8cb66',1,'glm::GLM_ALIGNED_TYPEDEF(highp_u8, aligned_highp_u8, 1)'],['../a00223.html#gaab32497d6e4db16ee439dbedd64c5865',1,'glm::GLM_ALIGNED_TYPEDEF(highp_u16, aligned_highp_u16, 2)'],['../a00223.html#gaaadbb34952eca8e3d7fe122c3e167742',1,'glm::GLM_ALIGNED_TYPEDEF(highp_u32, aligned_highp_u32, 4)'],['../a00223.html#ga92024d27c74a3650afb55ec8e024ed25',1,'glm::GLM_ALIGNED_TYPEDEF(highp_u64, aligned_highp_u64, 8)'],['../a00223.html#gabde1d0b4072df35453db76075ab896a6',1,'glm::GLM_ALIGNED_TYPEDEF(uint8, aligned_uint8, 1)'],['../a00223.html#ga06c296c9e398b294c8c9dd2a7693dcbb',1,'glm::GLM_ALIGNED_TYPEDEF(uint16, aligned_uint16, 2)'],['../a00223.html#gacf1744488c96ebd33c9f36ad33b2010a',1,'glm::GLM_ALIGNED_TYPEDEF(uint32, aligned_uint32, 4)'],['../a00223.html#ga3328061a64c20ba59d5f9da24c2cd059',1,'glm::GLM_ALIGNED_TYPEDEF(uint64, aligned_uint64, 8)'],['../a00223.html#gaf6ced36f13bae57f377bafa6f5fcc299',1,'glm::GLM_ALIGNED_TYPEDEF(uint8_t, aligned_uint8_t, 1)'],['../a00223.html#gafbc7fb7847bfc78a339d1d371c915c73',1,'glm::GLM_ALIGNED_TYPEDEF(uint16_t, aligned_uint16_t, 2)'],['../a00223.html#gaa86bc56a73fd8120b1121b5f5e6245ae',1,'glm::GLM_ALIGNED_TYPEDEF(uint32_t, aligned_uint32_t, 4)'],['../a00223.html#ga68c0b9e669060d0eb5ab8c3ddeb483d8',1,'glm::GLM_ALIGNED_TYPEDEF(uint64_t, aligned_uint64_t, 8)'],['../a00223.html#ga4f3bab577daf3343e99cc005134bce86',1,'glm::GLM_ALIGNED_TYPEDEF(u8, aligned_u8, 1)'],['../a00223.html#ga13a2391339d0790d43b76d00a7611c4f',1,'glm::GLM_ALIGNED_TYPEDEF(u16, aligned_u16, 2)'],['../a00223.html#ga197570e03acbc3d18ab698e342971e8f',1,'glm::GLM_ALIGNED_TYPEDEF(u32, aligned_u32, 4)'],['../a00223.html#ga0f033b21e145a1faa32c62ede5878993',1,'glm::GLM_ALIGNED_TYPEDEF(u64, aligned_u64, 8)'],['../a00223.html#ga509af83527f5cd512e9a7873590663aa',1,'glm::GLM_ALIGNED_TYPEDEF(uvec1, aligned_uvec1, 4)'],['../a00223.html#ga94e86186978c502c6dc0c0d9c4a30679',1,'glm::GLM_ALIGNED_TYPEDEF(uvec2, aligned_uvec2, 8)'],['../a00223.html#ga5cec574686a7f3c8ed24bb195c5e2d0a',1,'glm::GLM_ALIGNED_TYPEDEF(uvec3, aligned_uvec3, 16)'],['../a00223.html#ga47edfdcee9c89b1ebdaf20450323b1d4',1,'glm::GLM_ALIGNED_TYPEDEF(uvec4, aligned_uvec4, 16)'],['../a00223.html#ga5611d6718e3a00096918a64192e73a45',1,'glm::GLM_ALIGNED_TYPEDEF(u8vec1, aligned_u8vec1, 1)'],['../a00223.html#ga19837e6f72b60d994a805ef564c6c326',1,'glm::GLM_ALIGNED_TYPEDEF(u8vec2, aligned_u8vec2, 2)'],['../a00223.html#ga9740cf8e34f068049b42a2753f9601c2',1,'glm::GLM_ALIGNED_TYPEDEF(u8vec3, aligned_u8vec3, 4)'],['../a00223.html#ga8b8588bb221448f5541a858903822a57',1,'glm::GLM_ALIGNED_TYPEDEF(u8vec4, aligned_u8vec4, 4)'],['../a00223.html#ga991abe990c16de26b2129d6bc2f4c051',1,'glm::GLM_ALIGNED_TYPEDEF(u16vec1, aligned_u16vec1, 2)'],['../a00223.html#gac01bb9fc32a1cd76c2b80d030f71df4c',1,'glm::GLM_ALIGNED_TYPEDEF(u16vec2, aligned_u16vec2, 4)'],['../a00223.html#ga09540dbca093793a36a8997e0d4bee77',1,'glm::GLM_ALIGNED_TYPEDEF(u16vec3, aligned_u16vec3, 8)'],['../a00223.html#gaecafb5996f5a44f57e34d29c8670741e',1,'glm::GLM_ALIGNED_TYPEDEF(u16vec4, aligned_u16vec4, 8)'],['../a00223.html#gac6b161a04d2f8408fe1c9d857e8daac0',1,'glm::GLM_ALIGNED_TYPEDEF(u32vec1, aligned_u32vec1, 4)'],['../a00223.html#ga1fa0dfc8feb0fa17dab2acd43e05342b',1,'glm::GLM_ALIGNED_TYPEDEF(u32vec2, aligned_u32vec2, 8)'],['../a00223.html#ga0019500abbfa9c66eff61ca75eaaed94',1,'glm::GLM_ALIGNED_TYPEDEF(u32vec3, aligned_u32vec3, 16)'],['../a00223.html#ga14fd29d01dae7b08a04e9facbcc18824',1,'glm::GLM_ALIGNED_TYPEDEF(u32vec4, aligned_u32vec4, 16)'],['../a00223.html#gab253845f534a67136f9619843cade903',1,'glm::GLM_ALIGNED_TYPEDEF(u64vec1, aligned_u64vec1, 8)'],['../a00223.html#ga929427a7627940cdf3304f9c050b677d',1,'glm::GLM_ALIGNED_TYPEDEF(u64vec2, aligned_u64vec2, 16)'],['../a00223.html#gae373b6c04fdf9879f33d63e6949c037e',1,'glm::GLM_ALIGNED_TYPEDEF(u64vec3, aligned_u64vec3, 32)'],['../a00223.html#ga53a8a03dca2015baec4584f45b8e9cdc',1,'glm::GLM_ALIGNED_TYPEDEF(u64vec4, aligned_u64vec4, 32)'],['../a00223.html#gab3301bae94ef5bf59fbdd9a24e7d2a01',1,'glm::GLM_ALIGNED_TYPEDEF(float32, aligned_float32, 4)'],['../a00223.html#ga75930684ff2233171c573e603f216162',1,'glm::GLM_ALIGNED_TYPEDEF(float64, aligned_float64, 8)'],['../a00223.html#gada9b0bea273d3ae0286f891533b9568f',1,'glm::GLM_ALIGNED_TYPEDEF(float32_t, aligned_float32_t, 4)'],['../a00223.html#ga6e3a2d83b131336219a0f4c7cbba2a48',1,'glm::GLM_ALIGNED_TYPEDEF(float64_t, aligned_float64_t, 8)'],['../a00223.html#gadbce23b9f23d77bb3884e289a574ebd5',1,'glm::GLM_ALIGNED_TYPEDEF(float32, aligned_f32, 4)'],['../a00223.html#gaa4deaa0dea930c393d55e7a4352b0a20',1,'glm::GLM_ALIGNED_TYPEDEF(float64, aligned_f64, 8)'],['../a00223.html#ga81bc497b2bfc6f80bab690c6ee28f0f9',1,'glm::GLM_ALIGNED_TYPEDEF(vec1, aligned_vec1, 4)'],['../a00223.html#gada3e8f783e9d4b90006695a16c39d4d4',1,'glm::GLM_ALIGNED_TYPEDEF(vec2, aligned_vec2, 8)'],['../a00223.html#gab8d081fac3a38d6f55fa552f32168d32',1,'glm::GLM_ALIGNED_TYPEDEF(vec3, aligned_vec3, 16)'],['../a00223.html#ga12fe7b9769c964c5b48dcfd8b7f40198',1,'glm::GLM_ALIGNED_TYPEDEF(vec4, aligned_vec4, 16)'],['../a00223.html#gaefab04611c7f8fe1fd9be3071efea6cc',1,'glm::GLM_ALIGNED_TYPEDEF(fvec1, aligned_fvec1, 4)'],['../a00223.html#ga2543c05ba19b3bd19d45b1227390c5b4',1,'glm::GLM_ALIGNED_TYPEDEF(fvec2, aligned_fvec2, 8)'],['../a00223.html#ga009afd727fd657ef33a18754d6d28f60',1,'glm::GLM_ALIGNED_TYPEDEF(fvec3, aligned_fvec3, 16)'],['../a00223.html#ga2f26177e74bfb301a3d0e02ec3c3ef53',1,'glm::GLM_ALIGNED_TYPEDEF(fvec4, aligned_fvec4, 16)'],['../a00223.html#ga309f495a1d6b75ddf195b674b65cb1e4',1,'glm::GLM_ALIGNED_TYPEDEF(f32vec1, aligned_f32vec1, 4)'],['../a00223.html#ga5e185865a2217d0cd47187644683a8c3',1,'glm::GLM_ALIGNED_TYPEDEF(f32vec2, aligned_f32vec2, 8)'],['../a00223.html#gade4458b27b039b9ca34f8ec049f3115a',1,'glm::GLM_ALIGNED_TYPEDEF(f32vec3, aligned_f32vec3, 16)'],['../a00223.html#ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b',1,'glm::GLM_ALIGNED_TYPEDEF(f32vec4, aligned_f32vec4, 16)'],['../a00223.html#ga3e0f35fa0c626285a8bad41707e7316c',1,'glm::GLM_ALIGNED_TYPEDEF(dvec1, aligned_dvec1, 8)'],['../a00223.html#ga78bfec2f185d1d365ea0a9ef1e3d45b8',1,'glm::GLM_ALIGNED_TYPEDEF(dvec2, aligned_dvec2, 16)'],['../a00223.html#ga01fe6fee6db5df580b6724a7e681f069',1,'glm::GLM_ALIGNED_TYPEDEF(dvec3, aligned_dvec3, 32)'],['../a00223.html#ga687d5b8f551d5af32425c0b2fba15e99',1,'glm::GLM_ALIGNED_TYPEDEF(dvec4, aligned_dvec4, 32)'],['../a00223.html#ga8e842371d46842ff8f1813419ba49d0f',1,'glm::GLM_ALIGNED_TYPEDEF(f64vec1, aligned_f64vec1, 8)'],['../a00223.html#ga32814aa0f19316b43134fc25f2aad2b9',1,'glm::GLM_ALIGNED_TYPEDEF(f64vec2, aligned_f64vec2, 16)'],['../a00223.html#gaf3d3bbc1e93909b689123b085e177a14',1,'glm::GLM_ALIGNED_TYPEDEF(f64vec3, aligned_f64vec3, 32)'],['../a00223.html#ga804c654cead1139bd250f90f9bb01fad',1,'glm::GLM_ALIGNED_TYPEDEF(f64vec4, aligned_f64vec4, 32)'],['../a00223.html#gafed7d010235a3aa7ea2f88646858f2ae',1,'glm::GLM_ALIGNED_TYPEDEF(mat2, aligned_mat2, 16)'],['../a00223.html#ga17f911ee7b78ca6d1b91c4ab51ddb73c',1,'glm::GLM_ALIGNED_TYPEDEF(mat3, aligned_mat3, 16)'],['../a00223.html#ga31940e6012b72110e26fdb0f54805033',1,'glm::GLM_ALIGNED_TYPEDEF(mat4, aligned_mat4, 16)'],['../a00223.html#ga01de96cd0b541c52d2b4a3faf65822e9',1,'glm::GLM_ALIGNED_TYPEDEF(mat2x2, aligned_mat2x2, 16)'],['../a00223.html#gac88a191b004bd341e64fc53b5a4d00e3',1,'glm::GLM_ALIGNED_TYPEDEF(mat3x3, aligned_mat3x3, 16)'],['../a00223.html#gabe8c745fa2ced44a600a6e3f19991161',1,'glm::GLM_ALIGNED_TYPEDEF(mat4x4, aligned_mat4x4, 16)'],['../a00223.html#ga719da577361541a4c43a2dd1d0e361e1',1,'glm::GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2, 16)'],['../a00223.html#ga6e7ee4f541e1d7db66cd1a224caacafb',1,'glm::GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3, 16)'],['../a00223.html#gae5d672d359f2a39f63f98c7975057486',1,'glm::GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4, 16)'],['../a00223.html#ga6fa2df037dbfc5fe8c8e0b4db8a34953',1,'glm::GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2x2, 16)'],['../a00223.html#ga0743b4f4f69a3227b82ff58f6abbad62',1,'glm::GLM_ALIGNED_TYPEDEF(fmat2x3, aligned_fmat2x3, 16)'],['../a00223.html#ga1a76b325fdf70f961d835edd182c63dd',1,'glm::GLM_ALIGNED_TYPEDEF(fmat2x4, aligned_fmat2x4, 16)'],['../a00223.html#ga4b4e181cd041ba28c3163e7b8074aef0',1,'glm::GLM_ALIGNED_TYPEDEF(fmat3x2, aligned_fmat3x2, 16)'],['../a00223.html#ga27b13f465abc8a40705698145e222c3f',1,'glm::GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3x3, 16)'],['../a00223.html#ga2608d19cc275830a6f8c0b6405625a4f',1,'glm::GLM_ALIGNED_TYPEDEF(fmat3x4, aligned_fmat3x4, 16)'],['../a00223.html#ga93f09768241358a287c4cca538f1f7e7',1,'glm::GLM_ALIGNED_TYPEDEF(fmat4x2, aligned_fmat4x2, 16)'],['../a00223.html#ga7c117e3ecca089e10247b1d41d88aff9',1,'glm::GLM_ALIGNED_TYPEDEF(fmat4x3, aligned_fmat4x3, 16)'],['../a00223.html#ga07c75cd04ba42dc37fa3e105f89455c5',1,'glm::GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4x4, 16)'],['../a00223.html#ga65ff0d690a34a4d7f46f9b2eb51525ee',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2, 16)'],['../a00223.html#gadd8ddbe2bf65ccede865ba2f510176dc',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3, 16)'],['../a00223.html#gaf18dbff14bf13d3ff540c517659ec045',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4, 16)'],['../a00223.html#ga66339f6139bf7ff19e245beb33f61cc8',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2x2, 16)'],['../a00223.html#ga1558a48b3934011b52612809f443e46d',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat2x3, aligned_f32mat2x3, 16)'],['../a00223.html#gaa52e5732daa62851627021ad551c7680',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat2x4, aligned_f32mat2x4, 16)'],['../a00223.html#gac09663c42566bcb58d23c6781ac4e85a',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat3x2, aligned_f32mat3x2, 16)'],['../a00223.html#ga3f510999e59e1b309113e1d561162b29',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3x3, 16)'],['../a00223.html#ga2c9c94f0c89cd71ce56551db6cf4aaec',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat3x4, aligned_f32mat3x4, 16)'],['../a00223.html#ga99ce8274c750fbfdf0e70c95946a2875',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat4x2, aligned_f32mat4x2, 16)'],['../a00223.html#ga9476ef66790239df53dbe66f3989c3b5',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat4x3, aligned_f32mat4x3, 16)'],['../a00223.html#gacc429b3b0b49921e12713b6d31e14e1d',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4x4, 16)'],['../a00223.html#ga88f6c6fa06e6e64479763e69444669cf',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2, 32)'],['../a00223.html#gaae8e4639c991e64754145ab8e4c32083',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3, 32)'],['../a00223.html#ga6e9094f3feb3b5b49d0f83683a101fde',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4, 32)'],['../a00223.html#gadbd2c639c03de1c3e9591b5a39f65559',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2x2, 32)'],['../a00223.html#gab059d7b9fe2094acc563b7223987499f',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat2x3, aligned_f64mat2x3, 32)'],['../a00223.html#gabbc811d1c52ed2b8cfcaff1378f75c69',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat2x4, aligned_f64mat2x4, 32)'],['../a00223.html#ga9ddf5212777734d2fd841a84439f3bdf',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat3x2, aligned_f64mat3x2, 32)'],['../a00223.html#gad1dda32ed09f94bfcf0a7d8edfb6cf13',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3x3, 32)'],['../a00223.html#ga5875e0fa72f07e271e7931811cbbf31a',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat3x4, aligned_f64mat3x4, 32)'],['../a00223.html#ga41e82cd6ac07f912ba2a2d45799dcf0d',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat4x2, aligned_f64mat4x2, 32)'],['../a00223.html#ga0892638d6ba773043b3d63d1d092622e',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat4x3, aligned_f64mat4x3, 32)'],['../a00223.html#ga912a16432608b822f1e13607529934c1',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4x4, 32)'],['../a00223.html#gafd945a8ea86b042aba410e0560df9a3d',1,'glm::GLM_ALIGNED_TYPEDEF(quat, aligned_quat, 16)'],['../a00223.html#gad8c4bfacff70e57dc8303634c8bfce35',1,'glm::GLM_ALIGNED_TYPEDEF(fquat, aligned_fquat, 16)'],['../a00223.html#gaabc28c84a3288b697605d4688686f9a9',1,'glm::GLM_ALIGNED_TYPEDEF(dquat, aligned_dquat, 32)'],['../a00223.html#ga1ed8aeb5ca67fade269a46105f1bf273',1,'glm::GLM_ALIGNED_TYPEDEF(f32quat, aligned_f32quat, 16)'],['../a00223.html#ga95cc03b8b475993fa50e05e38e203303',1,'glm::GLM_ALIGNED_TYPEDEF(f64quat, aligned_f64quat, 32)']]],\n  ['golden_5fratio',['golden_ratio',['../a00151.html#ga748cf8642830657c5b7eae04d0a80899',1,'glm']]],\n  ['gradient_5fpaint_2ehpp',['gradient_paint.hpp',['../a00036.html',1,'']]],\n  ['greaterthan',['greaterThan',['../a00160.html#ga3f2720e2d77ec39186415f85ecd9cad0',1,'glm::greaterThan(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#gad3a3a7d228da3754c328c9a778f6df56',1,'glm::greaterThan(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['greaterthanequal',['greaterThanEqual',['../a00160.html#ga293cb3175d9ad290deaf50984716fd44',1,'glm::greaterThanEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#ga271038c5290184127754bda0ae91a5bd',1,'glm::greaterThanEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['glm_5fgtc_5fbitfield',['GLM_GTC_bitfield',['../a00149.html',1,'']]],\n  ['glm_5fgtc_5fcolor_5fspace',['GLM_GTC_color_space',['../a00150.html',1,'']]],\n  ['glm_5fgtc_5fconstants',['GLM_GTC_constants',['../a00151.html',1,'']]],\n  ['glm_5fgtc_5fepsilon',['GLM_GTC_epsilon',['../a00152.html',1,'']]],\n  ['glm_5fgtc_5finteger',['GLM_GTC_integer',['../a00153.html',1,'']]],\n  ['glm_5fgtc_5fmatrix_5faccess',['GLM_GTC_matrix_access',['../a00154.html',1,'']]],\n  ['glm_5fgtc_5fmatrix_5finteger',['GLM_GTC_matrix_integer',['../a00155.html',1,'']]],\n  ['glm_5fgtc_5fmatrix_5finverse',['GLM_GTC_matrix_inverse',['../a00156.html',1,'']]],\n  ['glm_5fgtc_5fmatrix_5ftransform',['GLM_GTC_matrix_transform',['../a00157.html',1,'']]],\n  ['glm_5fgtc_5fnoise',['GLM_GTC_noise',['../a00158.html',1,'']]],\n  ['glm_5fgtc_5fpacking',['GLM_GTC_packing',['../a00159.html',1,'']]],\n  ['glm_5fgtc_5fquaternion',['GLM_GTC_quaternion',['../a00160.html',1,'']]],\n  ['glm_5fgtc_5frandom',['GLM_GTC_random',['../a00161.html',1,'']]],\n  ['glm_5fgtc_5freciprocal',['GLM_GTC_reciprocal',['../a00162.html',1,'']]],\n  ['glm_5fgtc_5fround',['GLM_GTC_round',['../a00163.html',1,'']]],\n  ['glm_5fgtc_5ftype_5faligned',['GLM_GTC_type_aligned',['../a00164.html',1,'']]],\n  ['glm_5fgtc_5ftype_5fprecision',['GLM_GTC_type_precision',['../a00165.html',1,'']]],\n  ['glm_5fgtc_5ftype_5fptr',['GLM_GTC_type_ptr',['../a00166.html',1,'']]],\n  ['glm_5fgtc_5fulp',['GLM_GTC_ulp',['../a00167.html',1,'']]],\n  ['glm_5fgtc_5fvec1',['GLM_GTC_vec1',['../a00168.html',1,'']]],\n  ['glm_5fgtx_5fassociated_5fmin_5fmax',['GLM_GTX_associated_min_max',['../a00169.html',1,'']]],\n  ['glm_5fgtx_5fbit',['GLM_GTX_bit',['../a00170.html',1,'']]],\n  ['glm_5fgtx_5fclosest_5fpoint',['GLM_GTX_closest_point',['../a00171.html',1,'']]],\n  ['glm_5fgtx_5fcolor_5fencoding',['GLM_GTX_color_encoding',['../a00172.html',1,'']]],\n  ['glm_5fgtx_5fcolor_5fspace',['GLM_GTX_color_space',['../a00173.html',1,'']]],\n  ['glm_5fgtx_5fcolor_5fspace_5fycocg',['GLM_GTX_color_space_YCoCg',['../a00174.html',1,'']]],\n  ['glm_5fgtx_5fcommon',['GLM_GTX_common',['../a00175.html',1,'']]],\n  ['glm_5fgtx_5fcompatibility',['GLM_GTX_compatibility',['../a00176.html',1,'']]],\n  ['glm_5fgtx_5fcomponent_5fwise',['GLM_GTX_component_wise',['../a00177.html',1,'']]],\n  ['glm_5fgtx_5fdual_5fquaternion',['GLM_GTX_dual_quaternion',['../a00178.html',1,'']]],\n  ['glm_5fgtx_5feuler_5fangles',['GLM_GTX_euler_angles',['../a00179.html',1,'']]],\n  ['glm_5fgtx_5fextend',['GLM_GTX_extend',['../a00180.html',1,'']]],\n  ['glm_5fgtx_5fextented_5fmin_5fmax',['GLM_GTX_extented_min_max',['../a00181.html',1,'']]],\n  ['glm_5fgtx_5fexterior_5fproduct',['GLM_GTX_exterior_product',['../a00182.html',1,'']]],\n  ['glm_5fgtx_5ffast_5fexponential',['GLM_GTX_fast_exponential',['../a00183.html',1,'']]],\n  ['glm_5fgtx_5ffast_5fsquare_5froot',['GLM_GTX_fast_square_root',['../a00184.html',1,'']]],\n  ['glm_5fgtx_5ffast_5ftrigonometry',['GLM_GTX_fast_trigonometry',['../a00185.html',1,'']]],\n  ['glm_5fgtx_5ffunctions',['GLM_GTX_functions',['../a00186.html',1,'']]],\n  ['glm_5fgtx_5fgradient_5fpaint',['GLM_GTX_gradient_paint',['../a00187.html',1,'']]],\n  ['glm_5fgtx_5fhanded_5fcoordinate_5fspace',['GLM_GTX_handed_coordinate_space',['../a00188.html',1,'']]],\n  ['glm_5fgtx_5fhash',['GLM_GTX_hash',['../a00189.html',1,'']]],\n  ['glm_5fgtx_5finteger',['GLM_GTX_integer',['../a00190.html',1,'']]],\n  ['glm_5fgtx_5fintersect',['GLM_GTX_intersect',['../a00191.html',1,'']]],\n  ['glm_5fgtx_5fio',['GLM_GTX_io',['../a00192.html',1,'']]],\n  ['glm_5fgtx_5flog_5fbase',['GLM_GTX_log_base',['../a00193.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5fcross_5fproduct',['GLM_GTX_matrix_cross_product',['../a00194.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5fdecompose',['GLM_GTX_matrix_decompose',['../a00195.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5ffactorisation',['GLM_GTX_matrix_factorisation',['../a00196.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5finterpolation',['GLM_GTX_matrix_interpolation',['../a00197.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5fmajor_5fstorage',['GLM_GTX_matrix_major_storage',['../a00198.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5foperation',['GLM_GTX_matrix_operation',['../a00199.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5fquery',['GLM_GTX_matrix_query',['../a00200.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5ftransform_5f2d',['GLM_GTX_matrix_transform_2d',['../a00201.html',1,'']]],\n  ['glm_5fgtx_5fmixed_5fproducte',['GLM_GTX_mixed_producte',['../a00202.html',1,'']]],\n  ['glm_5fgtx_5fnorm',['GLM_GTX_norm',['../a00203.html',1,'']]],\n  ['glm_5fgtx_5fnormal',['GLM_GTX_normal',['../a00204.html',1,'']]],\n  ['glm_5fgtx_5fnormalize_5fdot',['GLM_GTX_normalize_dot',['../a00205.html',1,'']]],\n  ['glm_5fgtx_5fnumber_5fprecision',['GLM_GTX_number_precision',['../a00206.html',1,'']]],\n  ['glm_5fgtx_5foptimum_5fpow',['GLM_GTX_optimum_pow',['../a00207.html',1,'']]],\n  ['glm_5fgtx_5forthonormalize',['GLM_GTX_orthonormalize',['../a00208.html',1,'']]],\n  ['glm_5fgtx_5fperpendicular',['GLM_GTX_perpendicular',['../a00209.html',1,'']]],\n  ['glm_5fgtx_5fpolar_5fcoordinates',['GLM_GTX_polar_coordinates',['../a00210.html',1,'']]],\n  ['glm_5fgtx_5fprojection',['GLM_GTX_projection',['../a00211.html',1,'']]],\n  ['glm_5fgtx_5fquaternion',['GLM_GTX_quaternion',['../a00212.html',1,'']]],\n  ['glm_5fgtx_5frange',['GLM_GTX_range',['../a00213.html',1,'']]],\n  ['glm_5fgtx_5fraw_5fdata',['GLM_GTX_raw_data',['../a00214.html',1,'']]],\n  ['glm_5fgtx_5frotate_5fnormalized_5faxis',['GLM_GTX_rotate_normalized_axis',['../a00215.html',1,'']]],\n  ['glm_5fgtx_5frotate_5fvector',['GLM_GTX_rotate_vector',['../a00216.html',1,'']]],\n  ['glm_5fgtx_5fscalar_5frelational',['GLM_GTX_scalar_relational',['../a00217.html',1,'']]],\n  ['glm_5fgtx_5fspline',['GLM_GTX_spline',['../a00218.html',1,'']]],\n  ['glm_5fgtx_5fstd_5fbased_5ftype',['GLM_GTX_std_based_type',['../a00219.html',1,'']]],\n  ['glm_5fgtx_5fstring_5fcast',['GLM_GTX_string_cast',['../a00220.html',1,'']]],\n  ['glm_5fgtx_5ftransform',['GLM_GTX_transform',['../a00221.html',1,'']]],\n  ['glm_5fgtx_5ftransform2',['GLM_GTX_transform2',['../a00222.html',1,'']]],\n  ['glm_5fgtx_5ftype_5faligned',['GLM_GTX_type_aligned',['../a00223.html',1,'']]],\n  ['glm_5fgtx_5ftype_5ftrait',['GLM_GTX_type_trait',['../a00224.html',1,'']]],\n  ['glm_5fgtx_5fvec_5fswizzle',['GLM_GTX_vec_swizzle',['../a00225.html',1,'']]],\n  ['glm_5fgtx_5fvector_5fangle',['GLM_GTX_vector_angle',['../a00226.html',1,'']]],\n  ['glm_5fgtx_5fvector_5fquery',['GLM_GTX_vector_query',['../a00227.html',1,'']]],\n  ['glm_5fgtx_5fwrap',['GLM_GTX_wrap',['../a00228.html',1,'']]],\n  ['integer_2ehpp',['integer.hpp',['../a00039.html',1,'']]],\n  ['integer_2ehpp',['integer.hpp',['../a00040.html',1,'']]],\n  ['packing_2ehpp',['packing.hpp',['../a00076.html',1,'']]],\n  ['quaternion_2ehpp',['quaternion.hpp',['../a00084.html',1,'']]],\n  ['quaternion_2ehpp',['quaternion.hpp',['../a00083.html',1,'']]],\n  ['type_5faligned_2ehpp',['type_aligned.hpp',['../a00102.html',1,'']]],\n  ['type_5faligned_2ehpp',['type_aligned.hpp',['../a00101.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_8.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_8.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_8.js",
    "content": "var searchData=\n[\n  ['half_5fpi',['half_pi',['../a00151.html#ga0c36b41d462e45641faf7d7938948bac',1,'glm']]],\n  ['handed_5fcoordinate_5fspace_2ehpp',['handed_coordinate_space.hpp',['../a00037.html',1,'']]],\n  ['hash_2ehpp',['hash.hpp',['../a00038.html',1,'']]],\n  ['hermite',['hermite',['../a00218.html#gaa69e143f6374d32f934a8edeaa50bac9',1,'glm']]],\n  ['highestbitvalue',['highestBitValue',['../a00170.html#ga0dcc8fe7c3d3ad60dea409281efa3d05',1,'glm::highestBitValue(genIUType Value)'],['../a00170.html#ga898ef075ccf809a1e480faab48fe96bf',1,'glm::highestBitValue(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['highp_5fbvec2',['highp_bvec2',['../a00145.html#ga5d7156af15f362d4007769784a38e148',1,'glm']]],\n  ['highp_5fbvec3',['highp_bvec3',['../a00145.html#gae3625991931d1c556452a2c551748730',1,'glm']]],\n  ['highp_5fbvec4',['highp_bvec4',['../a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0',1,'glm']]],\n  ['highp_5fddualquat',['highp_ddualquat',['../a00178.html#ga8f67eafa7197d7a668dad5105a463d2a',1,'glm']]],\n  ['highp_5fdmat2',['highp_dmat2',['../a00145.html#ga02c6ed0185f84600c3b5001cf0db4746',1,'glm']]],\n  ['highp_5fdmat2x2',['highp_dmat2x2',['../a00145.html#ga458e8160a061147a3a2021c574b19787',1,'glm']]],\n  ['highp_5fdmat2x3',['highp_dmat2x3',['../a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5',1,'glm']]],\n  ['highp_5fdmat2x4',['highp_dmat2x4',['../a00145.html#ga8b4fed753f9b7c217b0401dc808e780a',1,'glm']]],\n  ['highp_5fdmat3',['highp_dmat3',['../a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a',1,'glm']]],\n  ['highp_5fdmat3x2',['highp_dmat3x2',['../a00145.html#ga5922c1b5a0a4973b0256db146aa77049',1,'glm']]],\n  ['highp_5fdmat3x3',['highp_dmat3x3',['../a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516',1,'glm']]],\n  ['highp_5fdmat3x4',['highp_dmat3x4',['../a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8',1,'glm']]],\n  ['highp_5fdmat4',['highp_dmat4',['../a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d',1,'glm']]],\n  ['highp_5fdmat4x2',['highp_dmat4x2',['../a00145.html#gad779abbdd0c7594cee515e4546d3db29',1,'glm']]],\n  ['highp_5fdmat4x3',['highp_dmat4x3',['../a00145.html#ga719750bee4022a646b006d2dda75cb76',1,'glm']]],\n  ['highp_5fdmat4x4',['highp_dmat4x4',['../a00145.html#gab7e154baf836679251844a5d933bd0aa',1,'glm']]],\n  ['highp_5fdualquat',['highp_dualquat',['../a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf',1,'glm']]],\n  ['highp_5fdvec2',['highp_dvec2',['../a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4',1,'glm']]],\n  ['highp_5fdvec3',['highp_dvec3',['../a00145.html#gab8a03109aebc121ef69abec50fcdd459',1,'glm']]],\n  ['highp_5fdvec4',['highp_dvec4',['../a00145.html#ga9dfeaa53a616848ed067994a2bd18992',1,'glm']]],\n  ['highp_5ffdualquat',['highp_fdualquat',['../a00178.html#ga4c4e55e9c99dc57b299ed590968da564',1,'glm']]],\n  ['highp_5ffloat',['highp_float',['../a00145.html#ga6e95694987ba35af6f736638be39626a',1,'glm']]],\n  ['highp_5fi16',['highp_i16',['../a00165.html#ga0336abc2604dd2c20c30e036454b64f8',1,'glm']]],\n  ['highp_5fi32',['highp_i32',['../a00165.html#ga727675ac6b5d2fc699520e0059735e25',1,'glm']]],\n  ['highp_5fi64',['highp_i64',['../a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd',1,'glm']]],\n  ['highp_5fi8',['highp_i8',['../a00165.html#gacb88796f2d08ef253d0345aff20c3aee',1,'glm']]],\n  ['highp_5fimat2',['highp_imat2',['../a00155.html#ga8499cc3b016003f835314c1c756e9db9',1,'glm']]],\n  ['highp_5fimat2x2',['highp_imat2x2',['../a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3',1,'glm']]],\n  ['highp_5fimat2x3',['highp_imat2x3',['../a00155.html#gaba49d890e06c9444795f5a133fbf1336',1,'glm']]],\n  ['highp_5fimat2x4',['highp_imat2x4',['../a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b',1,'glm']]],\n  ['highp_5fimat3',['highp_imat3',['../a00155.html#gaca4506a3efa679eff7c006d9826291fd',1,'glm']]],\n  ['highp_5fimat3x2',['highp_imat3x2',['../a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb',1,'glm']]],\n  ['highp_5fimat3x3',['highp_imat3x3',['../a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41',1,'glm']]],\n  ['highp_5fimat3x4',['highp_imat3x4',['../a00155.html#ga53008f580be99018a17b357b5a4ffc0d',1,'glm']]],\n  ['highp_5fimat4',['highp_imat4',['../a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56',1,'glm']]],\n  ['highp_5fimat4x2',['highp_imat4x2',['../a00155.html#ga1858820fb292cae396408b2034407f72',1,'glm']]],\n  ['highp_5fimat4x3',['highp_imat4x3',['../a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5',1,'glm']]],\n  ['highp_5fimat4x4',['highp_imat4x4',['../a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44',1,'glm']]],\n  ['highp_5fint',['highp_int',['../a00145.html#gaaabe7eb044941ebf308b53a447d692dc',1,'glm']]],\n  ['highp_5fint16',['highp_int16',['../a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718',1,'glm']]],\n  ['highp_5fint16_5ft',['highp_int16_t',['../a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff',1,'glm']]],\n  ['highp_5fint32',['highp_int32',['../a00165.html#ga84ed04b4e0de18c977e932d617e7c223',1,'glm']]],\n  ['highp_5fint32_5ft',['highp_int32_t',['../a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f',1,'glm']]],\n  ['highp_5fint64',['highp_int64',['../a00165.html#ga226a8d52b4e3f77aaa6231135e886aac',1,'glm']]],\n  ['highp_5fint64_5ft',['highp_int64_t',['../a00165.html#ga73c6abb280a45feeff60f9accaee91f3',1,'glm']]],\n  ['highp_5fint8',['highp_int8',['../a00165.html#gad0549c902a96a7164e4ac858d5f39dbf',1,'glm']]],\n  ['highp_5fint8_5ft',['highp_int8_t',['../a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5',1,'glm']]],\n  ['highp_5fivec2',['highp_ivec2',['../a00145.html#ga23594b732ebff0ff9630ddb2a3bad659',1,'glm']]],\n  ['highp_5fivec3',['highp_ivec3',['../a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7',1,'glm']]],\n  ['highp_5fivec4',['highp_ivec4',['../a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518',1,'glm']]],\n  ['highp_5fmat2',['highp_mat2',['../a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a',1,'glm']]],\n  ['highp_5fmat2x2',['highp_mat2x2',['../a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229',1,'glm']]],\n  ['highp_5fmat2x3',['highp_mat2x3',['../a00145.html#ga441b8e3402eefca108b40f3d22a1baa9',1,'glm']]],\n  ['highp_5fmat2x4',['highp_mat2x4',['../a00145.html#ga3b030d815c7c9f77c3c47e708863fd62',1,'glm']]],\n  ['highp_5fmat3',['highp_mat3',['../a00145.html#ga9f30904176d75657930fa4383618f968',1,'glm']]],\n  ['highp_5fmat3x2',['highp_mat3x2',['../a00145.html#ga12276a2b151d87c039134c388b5a3746',1,'glm']]],\n  ['highp_5fmat3x3',['highp_mat3x3',['../a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3',1,'glm']]],\n  ['highp_5fmat3x4',['highp_mat3x4',['../a00145.html#gabb55c60d8c7fb400bf2ed511251ca394',1,'glm']]],\n  ['highp_5fmat4',['highp_mat4',['../a00145.html#ga332149037f33cec9d9b583e11c3c8524',1,'glm']]],\n  ['highp_5fmat4x2',['highp_mat4x2',['../a00145.html#ga39ba2335320534c19db435a27d8bb765',1,'glm']]],\n  ['highp_5fmat4x3',['highp_mat4x3',['../a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63',1,'glm']]],\n  ['highp_5fmat4x4',['highp_mat4x4',['../a00145.html#ga989736bc5e50330ef3ab13d34bebc66f',1,'glm']]],\n  ['highp_5fu16',['highp_u16',['../a00165.html#ga8e62c883d13f47015f3b70ed88751369',1,'glm']]],\n  ['highp_5fu32',['highp_u32',['../a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf',1,'glm']]],\n  ['highp_5fu64',['highp_u64',['../a00165.html#ga0c181fdf06a309691999926b6690c969',1,'glm']]],\n  ['highp_5fu8',['highp_u8',['../a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c',1,'glm']]],\n  ['highp_5fuint',['highp_uint',['../a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf',1,'glm']]],\n  ['highp_5fuint16',['highp_uint16',['../a00165.html#ga746dc6da204f5622e395f492997dbf57',1,'glm']]],\n  ['highp_5fuint16_5ft',['highp_uint16_t',['../a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7',1,'glm']]],\n  ['highp_5fuint32',['highp_uint32',['../a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3',1,'glm']]],\n  ['highp_5fuint32_5ft',['highp_uint32_t',['../a00165.html#gae978599c9711ac263ba732d4ac225b0e',1,'glm']]],\n  ['highp_5fuint64',['highp_uint64',['../a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce',1,'glm']]],\n  ['highp_5fuint64_5ft',['highp_uint64_t',['../a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08',1,'glm']]],\n  ['highp_5fuint8',['highp_uint8',['../a00165.html#ga97432f9979e73e66567361fd01e4cffb',1,'glm']]],\n  ['highp_5fuint8_5ft',['highp_uint8_t',['../a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5',1,'glm']]],\n  ['highp_5fumat2',['highp_umat2',['../a00155.html#ga42cbce64c4c1cd121b8437daa6e110de',1,'glm']]],\n  ['highp_5fumat2x2',['highp_umat2x2',['../a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28',1,'glm']]],\n  ['highp_5fumat2x3',['highp_umat2x3',['../a00155.html#ga90718c7128320b24b52f9ea70e643ad4',1,'glm']]],\n  ['highp_5fumat2x4',['highp_umat2x4',['../a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b',1,'glm']]],\n  ['highp_5fumat3',['highp_umat3',['../a00155.html#gaa1143120339b7d2d469d327662e8a172',1,'glm']]],\n  ['highp_5fumat3x2',['highp_umat3x2',['../a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4',1,'glm']]],\n  ['highp_5fumat3x3',['highp_umat3x3',['../a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2',1,'glm']]],\n  ['highp_5fumat3x4',['highp_umat3x4',['../a00155.html#ga25ee15c323924f2d0fe9896d329e5086',1,'glm']]],\n  ['highp_5fumat4',['highp_umat4',['../a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9',1,'glm']]],\n  ['highp_5fumat4x2',['highp_umat4x2',['../a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801',1,'glm']]],\n  ['highp_5fumat4x3',['highp_umat4x3',['../a00155.html#ga45a8163d02c43216252056b0c120f3a5',1,'glm']]],\n  ['highp_5fumat4x4',['highp_umat4x4',['../a00155.html#ga6a56cbb769aed334c95241664415f9ba',1,'glm']]],\n  ['highp_5fuvec2',['highp_uvec2',['../a00145.html#gab6d886704d5c7faf85b03e4a36290546',1,'glm']]],\n  ['highp_5fuvec3',['highp_uvec3',['../a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e',1,'glm']]],\n  ['highp_5fuvec4',['highp_uvec4',['../a00145.html#ga09b43516ea6fd2c617fc4bee2995316a',1,'glm']]],\n  ['highp_5fvec2',['highp_vec2',['../a00145.html#gaa92c1954d71b1e7914874bd787b43d1c',1,'glm']]],\n  ['highp_5fvec3',['highp_vec3',['../a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9',1,'glm']]],\n  ['highp_5fvec4',['highp_vec4',['../a00145.html#gad281decae52948b82feb3a9db8f63a7b',1,'glm']]],\n  ['hsvcolor',['hsvColor',['../a00173.html#ga789802bec2d4fe0f9741c731b4a8a7d8',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_9.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_9.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_9.js",
    "content": "var searchData=\n[\n  ['integer_20functions',['Integer functions',['../a00229.html',1,'']]],\n  ['i16',['i16',['../a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699',1,'glm']]],\n  ['i16vec1',['i16vec1',['../a00165.html#gafe730798732aa7b0647096a004db1b1c',1,'glm']]],\n  ['i16vec2',['i16vec2',['../a00165.html#ga2996630ba7b10535af8e065cf326f761',1,'glm']]],\n  ['i16vec3',['i16vec3',['../a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b',1,'glm']]],\n  ['i16vec4',['i16vec4',['../a00165.html#ga550831bfc26d1e0101c1cb3d79938c06',1,'glm']]],\n  ['i32',['i32',['../a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb',1,'glm']]],\n  ['i32vec1',['i32vec1',['../a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf',1,'glm']]],\n  ['i32vec2',['i32vec2',['../a00165.html#ga8b44026374982dcd1e52d22bac99247e',1,'glm']]],\n  ['i32vec3',['i32vec3',['../a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e',1,'glm']]],\n  ['i32vec4',['i32vec4',['../a00165.html#ga866a05905c49912309ed1fa5f5980e61',1,'glm']]],\n  ['i64',['i64',['../a00165.html#gadb997e409103d4da18abd837e636a496',1,'glm']]],\n  ['i64vec1',['i64vec1',['../a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50',1,'glm']]],\n  ['i64vec2',['i64vec2',['../a00165.html#ga48310188e1d0c616bf8d78c92447523b',1,'glm']]],\n  ['i64vec3',['i64vec3',['../a00165.html#ga667948cfe6fb3d6606c750729ec49f77',1,'glm']]],\n  ['i64vec4',['i64vec4',['../a00165.html#gaa4e31c3d9de067029efeb161a44b0232',1,'glm']]],\n  ['i8',['i8',['../a00165.html#ga302ec977b0c0c3ea245b6c9275495355',1,'glm']]],\n  ['i8vec1',['i8vec1',['../a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b',1,'glm']]],\n  ['i8vec2',['i8vec2',['../a00165.html#gad06935764d78f43f9d542c784c2212ec',1,'glm']]],\n  ['i8vec3',['i8vec3',['../a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e',1,'glm']]],\n  ['i8vec4',['i8vec4',['../a00165.html#ga4177a44206121dabc8c4ff1c0f544574',1,'glm']]],\n  ['imat2',['imat2',['../a00155.html#gaabe04f9948d4a213bb1c20137de03e01',1,'glm']]],\n  ['imat2x2',['imat2x2',['../a00155.html#gaa4732a240522ad9bc28144fda2fc14ec',1,'glm']]],\n  ['imat2x3',['imat2x3',['../a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605',1,'glm']]],\n  ['imat2x4',['imat2x4',['../a00155.html#ga9d8faafdca42583d67e792dd038fc668',1,'glm']]],\n  ['imat3',['imat3',['../a00155.html#ga038f68437155ffa3c2583a15264a8195',1,'glm']]],\n  ['imat3x2',['imat3x2',['../a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f',1,'glm']]],\n  ['imat3x3',['imat3x3',['../a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4',1,'glm']]],\n  ['imat3x4',['imat3x4',['../a00155.html#ga6e9ce23496d8b08dfc302d4039694b58',1,'glm']]],\n  ['imat4',['imat4',['../a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb',1,'glm']]],\n  ['imat4x2',['imat4x2',['../a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa',1,'glm']]],\n  ['imat4x3',['imat4x3',['../a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5',1,'glm']]],\n  ['imat4x4',['imat4x4',['../a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b',1,'glm']]],\n  ['imulextended',['imulExtended',['../a00229.html#gac0c510a70e852f57594a9141848642e3',1,'glm']]],\n  ['infiniteperspective',['infinitePerspective',['../a00157.html#ga44fa38a18349450325cae2661bb115ca',1,'glm']]],\n  ['infiniteperspectivelh',['infinitePerspectiveLH',['../a00157.html#ga3201b30f5b3ea0f933246d87bfb992a9',1,'glm']]],\n  ['infiniteperspectiverh',['infinitePerspectiveRH',['../a00157.html#ga99672ffe5714ef478dab2437255fe7e1',1,'glm']]],\n  ['int1',['int1',['../a00176.html#ga0670a2111b5e4a6410bd027fa0232fc3',1,'glm']]],\n  ['int16',['int16',['../a00165.html#ga302041c186d0d028bea31b711fe16759',1,'glm']]],\n  ['int16_5ft',['int16_t',['../a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede',1,'glm']]],\n  ['int1x1',['int1x1',['../a00176.html#ga056ffe02d3a45af626f8e62221881c7a',1,'glm']]],\n  ['int2',['int2',['../a00176.html#gafe3a8fd56354caafe24bfe1b1e3ad22a',1,'glm']]],\n  ['int2x2',['int2x2',['../a00176.html#ga4e5ce477c15836b21e3c42daac68554d',1,'glm']]],\n  ['int2x3',['int2x3',['../a00176.html#ga197ded5ad8354f6b6fb91189d7a269b3',1,'glm']]],\n  ['int2x4',['int2x4',['../a00176.html#ga2749d59a7fddbac44f34ba78e57ef807',1,'glm']]],\n  ['int3',['int3',['../a00176.html#ga909c38a425f215a50c847145d7da09f0',1,'glm']]],\n  ['int32',['int32',['../a00165.html#ga8df669f4e7698dfe0c0354d92578d74f',1,'glm']]],\n  ['int32_5ft',['int32_t',['../a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710',1,'glm']]],\n  ['int3x2',['int3x2',['../a00176.html#gaa4cbe16a92cf3664376c7a2fc5126aa8',1,'glm']]],\n  ['int3x3',['int3x3',['../a00176.html#ga15c9649286f0bf431bdf9b3509580048',1,'glm']]],\n  ['int3x4',['int3x4',['../a00176.html#gaacac46ddc7d15d0f9529d05c92946a0f',1,'glm']]],\n  ['int4',['int4',['../a00176.html#gaecdef18c819c205aeee9f94dc93de56a',1,'glm']]],\n  ['int4x2',['int4x2',['../a00176.html#ga97a39dd9bc7d572810d80b8467cbffa1',1,'glm']]],\n  ['int4x3',['int4x3',['../a00176.html#gae4a2c53f14aeec9a17c2b81142b7e82d',1,'glm']]],\n  ['int4x4',['int4x4',['../a00176.html#ga04dee1552424198b8f58b377c2ee00d8',1,'glm']]],\n  ['int64',['int64',['../a00165.html#gaff5189f97f9e842d9636a0f240001b2e',1,'glm']]],\n  ['int64_5ft',['int64_t',['../a00165.html#ga322a7d7d2c2c68994dc872a33de63c61',1,'glm']]],\n  ['int8',['int8',['../a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0',1,'glm']]],\n  ['int8_5ft',['int8_t',['../a00165.html#ga4bf09d8838a86866b39ee6e109341645',1,'glm']]],\n  ['intbitstofloat',['intBitsToFloat',['../a00140.html#ga4fb7c21c2dce064b26fd9ccdaf9adcd4',1,'glm::intBitsToFloat(int const &amp;v)'],['../a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0',1,'glm::intBitsToFloat(vec&lt; L, int, Q &gt; const &amp;v)']]],\n  ['integer_2ehpp',['integer.hpp',['../a00041.html',1,'']]],\n  ['intermediate',['intermediate',['../a00212.html#gac9be2084562a52ae8923813233563a28',1,'glm']]],\n  ['interpolate',['interpolate',['../a00197.html#gad5fc63a2e084000b39f6508ab07421a5',1,'glm']]],\n  ['intersect_2ehpp',['intersect.hpp',['../a00042.html',1,'']]],\n  ['intersectlinesphere',['intersectLineSphere',['../a00191.html#ga9c68139f3d8a4f3d7fe45f9dbc0de5b7',1,'glm']]],\n  ['intersectlinetriangle',['intersectLineTriangle',['../a00191.html#ga9d29b9b3acb504d43986502f42740df4',1,'glm']]],\n  ['intersectrayplane',['intersectRayPlane',['../a00191.html#gad3697a9700ea379739a667ea02573488',1,'glm']]],\n  ['intersectraysphere',['intersectRaySphere',['../a00191.html#gac88f8cd84c4bcb5b947d56acbbcfa56e',1,'glm::intersectRaySphere(genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, typename genType::value_type const sphereRadiusSquered, typename genType::value_type &amp;intersectionDistance)'],['../a00191.html#gad28c00515b823b579c608aafa1100c1d',1,'glm::intersectRaySphere(genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, const typename genType::value_type sphereRadius, genType &amp;intersectionPosition, genType &amp;intersectionNormal)']]],\n  ['intersectraytriangle',['intersectRayTriangle',['../a00191.html#ga62e2b3c67ff9e95c04e39383920a9c27',1,'glm']]],\n  ['inverse',['inverse',['../a00230.html#gacc53488cd254cbe33d1b505a72ef3719',1,'glm::inverse(mat&lt; C, R, T, Q &gt; const &amp;m)'],['../a00160.html#gadc59b59ce71daa5586a64a6acf36c072',1,'glm::inverse(tquat&lt; T, Q &gt; const &amp;q)'],['../a00178.html#ga070f521a953f6461af4ab4cf8ccbf27e',1,'glm::inverse(tdualquat&lt; T, Q &gt; const &amp;q)']]],\n  ['inversesqrt',['inversesqrt',['../a00141.html#ga523dd6bd0ad9f75ae2d24c8e4b017b7a',1,'glm']]],\n  ['inversetranspose',['inverseTranspose',['../a00156.html#gab213cd0e3ead5f316d583f99d6312008',1,'glm']]],\n  ['io_2ehpp',['io.hpp',['../a00043.html',1,'']]],\n  ['iround',['iround',['../a00153.html#ga57824268ebe13a922f1d69a5d37f637f',1,'glm']]],\n  ['iscompnull',['isCompNull',['../a00227.html#gaf6ec1688eab7442fe96fe4941d5d4e76',1,'glm']]],\n  ['isdenormal',['isdenormal',['../a00175.html#ga74aa7c7462245d83bd5a9edf9c6c2d91',1,'glm']]],\n  ['isfinite',['isfinite',['../a00176.html#gaf4b04dcd3526996d68c1bfe17bfc8657',1,'glm::isfinite(genType const &amp;x)'],['../a00176.html#gac3b12b8ac3014418fe53c299478b6603',1,'glm::isfinite(const vec&lt; 1, T, Q &gt; &amp;x)'],['../a00176.html#ga8e76dc3e406ce6a4155c2b12a2e4b084',1,'glm::isfinite(const vec&lt; 2, T, Q &gt; &amp;x)'],['../a00176.html#ga929ef27f896d902c1771a2e5e150fc97',1,'glm::isfinite(const vec&lt; 3, T, Q &gt; &amp;x)'],['../a00176.html#ga19925badbe10ce61df1d0de00be0b5ad',1,'glm::isfinite(const vec&lt; 4, T, Q &gt; &amp;x)']]],\n  ['isidentity',['isIdentity',['../a00200.html#gaee935d145581c82e82b154ccfd78ad91',1,'glm']]],\n  ['isinf',['isinf',['../a00140.html#ga2885587c23a106301f20443896365b62',1,'glm::isinf(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00160.html#ga139abc0f7f89553e341f8be95bf8d3cb',1,'glm::isinf(tquat&lt; T, Q &gt; const &amp;x)']]],\n  ['ismultiple',['isMultiple',['../a00163.html#gaf7444a7b2eb524f373463ceba76b9326',1,'glm::isMultiple(genIUType Value, genIUType Multiple)'],['../a00163.html#ga908a61945ecb235817a9a87b249d4b2d',1,'glm::isMultiple(vec&lt; L, T, Q &gt; const &amp;Value, T Multiple)'],['../a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368',1,'glm::isMultiple(vec&lt; L, T, Q &gt; const &amp;Value, vec&lt; L, T, Q &gt; const &amp;Multiple)']]],\n  ['isnan',['isnan',['../a00140.html#ga29ef934c00306490de837b4746b4e14d',1,'glm::isnan(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00160.html#ga31f4378ab97985177e208f4f4f8b1fd3',1,'glm::isnan(tquat&lt; T, Q &gt; const &amp;x)']]],\n  ['isnormalized',['isNormalized',['../a00200.html#gae785af56f47ce220a1609f7f84aa077a',1,'glm::isNormalized(mat&lt; 2, 2, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00200.html#gaa068311695f28f5f555f5f746a6a66fb',1,'glm::isNormalized(mat&lt; 3, 3, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad',1,'glm::isNormalized(mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00227.html#gac3c974f459fd75453134fad7ae89a39e',1,'glm::isNormalized(vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)']]],\n  ['isnull',['isNull',['../a00200.html#ga9790ec222ce948c0ff0d8ce927340dba',1,'glm::isNull(mat&lt; 2, 2, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00200.html#gae14501c6b14ccda6014cc5350080103d',1,'glm::isNull(mat&lt; 3, 3, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b',1,'glm::isNull(mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00227.html#gab4a3637dbcb4bb42dc55caea7a1e0495',1,'glm::isNull(vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)']]],\n  ['isorthogonal',['isOrthogonal',['../a00200.html#ga58f3289f74dcab653387dd78ad93ca40',1,'glm']]],\n  ['ispoweroftwo',['isPowerOfTwo',['../a00163.html#gaebf826fbb6e0a70eeaab0792d89b25ec',1,'glm::isPowerOfTwo(genIUType Value)'],['../a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17',1,'glm::isPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['ivec2',['ivec2',['../a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f',1,'glm']]],\n  ['ivec3',['ivec3',['../a00144.html#ga34aee73784bcc247d426250540c1911c',1,'glm']]],\n  ['ivec4',['ivec4',['../a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_a.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_a.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_a.js",
    "content": "var searchData=\n[\n  ['l1norm',['l1Norm',['../a00203.html#gae2fc0b2aa967bebfd6a244700bff6997',1,'glm::l1Norm(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)'],['../a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be',1,'glm::l1Norm(vec&lt; 3, T, Q &gt; const &amp;v)']]],\n  ['l2norm',['l2Norm',['../a00203.html#ga41340b2ef40a9307ab0f137181565168',1,'glm::l2Norm(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)'],['../a00203.html#gae288bde8f0e41fb4ed62e65137b18cba',1,'glm::l2Norm(vec&lt; 3, T, Q &gt; const &amp;x)']]],\n  ['ldexp',['ldexp',['../a00140.html#ga52e319d7289b849ec92055abd4830533',1,'glm']]],\n  ['lefthanded',['leftHanded',['../a00188.html#ga6f1bad193b9a3b048543d1935cf04dd3',1,'glm']]],\n  ['length',['length',['../a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263',1,'glm::length(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00160.html#gab33f82f8d1c9223d335aab752a126855',1,'glm::length(tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['length2',['length2',['../a00203.html#ga8d1789651050adb7024917984b41c3de',1,'glm::length2(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00212.html#ga229bacc3051770b030042fe266f7b0cb',1,'glm::length2(tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['lerp',['lerp',['../a00160.html#gabc58e7013ef63d6df69c28c14afd0c01',1,'glm::lerp(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)'],['../a00176.html#ga5494ba3a95ea6594c86fc75236886864',1,'glm::lerp(T x, T y, T a)'],['../a00176.html#gaa551c0a0e16d2d4608e49f7696df897f',1,'glm::lerp(const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y, T a)'],['../a00176.html#ga44a8b5fd776320f1713413dec959b32a',1,'glm::lerp(const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y, T a)'],['../a00176.html#ga89ac8e000199292ec7875519d27e214b',1,'glm::lerp(const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, T a)'],['../a00176.html#gaf68de5baf72d16135368b8ef4f841604',1,'glm::lerp(const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y, const vec&lt; 2, T, Q &gt; &amp;a)'],['../a00176.html#ga4ae1a616c8540a2649eab8e0cd051bb3',1,'glm::lerp(const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y, const vec&lt; 3, T, Q &gt; &amp;a)'],['../a00176.html#gab5477ab69c40de4db5d58d3359529724',1,'glm::lerp(const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, const vec&lt; 4, T, Q &gt; &amp;a)'],['../a00178.html#gace8380112d16d33f520839cb35a4d173',1,'glm::lerp(tdualquat&lt; T, Q &gt; const &amp;x, tdualquat&lt; T, Q &gt; const &amp;y, T const &amp;a)']]],\n  ['lessthan',['lessThan',['../a00160.html#ga627487c769e33f4b9f318f271b75802c',1,'glm::lessThan(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#ga314be073c42278ccb6fe7a7958213824',1,'glm::lessThan(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['lessthanequal',['lessThanEqual',['../a00160.html#ga9e84617bb109bf2eb7f30d7f4ba07ad4',1,'glm::lessThanEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#ga51bf75522dbe1fa5e7806eb9b825ab6a',1,'glm::lessThanEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['lineargradient',['linearGradient',['../a00187.html#ga849241df1e55129b8ce9476200307419',1,'glm']]],\n  ['linearrand',['linearRand',['../a00161.html#ga04e241ab88374a477a2c2ceadd2fa03d',1,'glm::linearRand(genType Min, genType Max)'],['../a00161.html#ga94731130c298a9ff5e5025fdee6d97a0',1,'glm::linearRand(vec&lt; L, T, Q &gt; const &amp;Min, vec&lt; L, T, Q &gt; const &amp;Max)']]],\n  ['ln_5fln_5ftwo',['ln_ln_two',['../a00151.html#gaca94292c839ed31a405ab7a81ae7e850',1,'glm']]],\n  ['ln_5ften',['ln_ten',['../a00151.html#gaf97ebc6c059ffd788e6c4946f71ef66c',1,'glm']]],\n  ['ln_5ftwo',['ln_two',['../a00151.html#ga24f4d27765678116f41a2f336ab7975c',1,'glm']]],\n  ['log',['log',['../a00141.html#ga918c9f3fd086ce20e6760c903bd30fa9',1,'glm::log(vec&lt; L, T, Q &gt; const &amp;v)'],['../a00193.html#ga60a7b0a401da660869946b2b77c710c9',1,'glm::log(genType const &amp;x, genType const &amp;base)'],['../a00212.html#gaad510f1a4ea26994b341c094ec4f4eed',1,'glm::log(tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['log2',['log2',['../a00141.html#ga82831c7d9cca777cebedfe03a19c8d75',1,'glm::log2(vec&lt; L, T, Q &gt; const &amp;v)'],['../a00153.html#ga9bd682e74bfacb005c735305207ec417',1,'glm::log2(genIUType x)']]],\n  ['log_5fbase_2ehpp',['log_base.hpp',['../a00044.html',1,'']]],\n  ['lookat',['lookAt',['../a00157.html#gaa64aa951a0e99136bba9008d2b59c78e',1,'glm']]],\n  ['lookatlh',['lookAtLH',['../a00157.html#gab2c09e25b0a16d3a9d89cc85bbae41b0',1,'glm']]],\n  ['lookatrh',['lookAtRH',['../a00157.html#gacfa12c8889c754846bc20c65d9b5c701',1,'glm']]],\n  ['lowestbitvalue',['lowestBitValue',['../a00170.html#ga2ff6568089f3a9b67f5c30918855fc6f',1,'glm']]],\n  ['lowp_5fbvec2',['lowp_bvec2',['../a00145.html#ga39fbc2447d5846af799d075a29c6e46d',1,'glm']]],\n  ['lowp_5fbvec3',['lowp_bvec3',['../a00145.html#ga916d4e72701db85b64815faf06050111',1,'glm']]],\n  ['lowp_5fbvec4',['lowp_bvec4',['../a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6',1,'glm']]],\n  ['lowp_5fddualquat',['lowp_ddualquat',['../a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a',1,'glm']]],\n  ['lowp_5fdmat2',['lowp_dmat2',['../a00145.html#ga0dfc5624d872b189ab4a82bebca7107c',1,'glm']]],\n  ['lowp_5fdmat2x2',['lowp_dmat2x2',['../a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c',1,'glm']]],\n  ['lowp_5fdmat2x3',['lowp_dmat2x3',['../a00145.html#ga4450cd185006155fff0380dad2d70ec4',1,'glm']]],\n  ['lowp_5fdmat2x4',['lowp_dmat2x4',['../a00145.html#ga49b6a11f54dcec866c0ecf17d7685165',1,'glm']]],\n  ['lowp_5fdmat3',['lowp_dmat3',['../a00145.html#gadffb225ac88b8a65e1e76233b8bd5768',1,'glm']]],\n  ['lowp_5fdmat3x2',['lowp_dmat3x2',['../a00145.html#ga02af788947516c41893c658990783fd4',1,'glm']]],\n  ['lowp_5fdmat3x3',['lowp_dmat3x3',['../a00145.html#ga0bae293e714e00f23e4bbf5a6c000448',1,'glm']]],\n  ['lowp_5fdmat3x4',['lowp_dmat3x4',['../a00145.html#ga42108fc51b1c14745e6edf399c1d0150',1,'glm']]],\n  ['lowp_5fdmat4',['lowp_dmat4',['../a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a',1,'glm']]],\n  ['lowp_5fdmat4x2',['lowp_dmat4x2',['../a00145.html#ga3daec60b56a8d57455cb60d8328f3645',1,'glm']]],\n  ['lowp_5fdmat4x3',['lowp_dmat4x3',['../a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d',1,'glm']]],\n  ['lowp_5fdmat4x4',['lowp_dmat4x4',['../a00145.html#ga843a2b7ca501078963910ea0b453f970',1,'glm']]],\n  ['lowp_5fdualquat',['lowp_dualquat',['../a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa',1,'glm']]],\n  ['lowp_5fdvec2',['lowp_dvec2',['../a00145.html#ga8e7f034722aaa1895196f0381a1810f5',1,'glm']]],\n  ['lowp_5fdvec3',['lowp_dvec3',['../a00145.html#ga2b6374e88079410f8b641e21bf6b77a3',1,'glm']]],\n  ['lowp_5fdvec4',['lowp_dvec4',['../a00145.html#gabcd63b91329c8213fdae89d0da6ece4c',1,'glm']]],\n  ['lowp_5ffdualquat',['lowp_fdualquat',['../a00178.html#gaa38f671be25a7f3b136a452a8bb42860',1,'glm']]],\n  ['lowp_5ffloat',['lowp_float',['../a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1',1,'glm']]],\n  ['lowp_5fi16',['lowp_i16',['../a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7',1,'glm']]],\n  ['lowp_5fi32',['lowp_i32',['../a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac',1,'glm']]],\n  ['lowp_5fi64',['lowp_i64',['../a00165.html#ga354736e0c645099cd44c42fb2f87c2b8',1,'glm']]],\n  ['lowp_5fi8',['lowp_i8',['../a00165.html#ga552a6bde5e75984efb0f863278da2e54',1,'glm']]],\n  ['lowp_5fimat2',['lowp_imat2',['../a00155.html#gaa0bff0be804142bb16d441aec0a7962e',1,'glm']]],\n  ['lowp_5fimat2x2',['lowp_imat2x2',['../a00155.html#ga92b95b679975d408645547ab45a8dcd8',1,'glm']]],\n  ['lowp_5fimat2x3',['lowp_imat2x3',['../a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65',1,'glm']]],\n  ['lowp_5fimat2x4',['lowp_imat2x4',['../a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e',1,'glm']]],\n  ['lowp_5fimat3',['lowp_imat3',['../a00155.html#ga69bfe668f4170379fc1f35d82b060c43',1,'glm']]],\n  ['lowp_5fimat3x2',['lowp_imat3x2',['../a00155.html#ga33db8f27491d30906cd37c0d86b3f432',1,'glm']]],\n  ['lowp_5fimat3x3',['lowp_imat3x3',['../a00155.html#ga664f061df00020048c3f8530329ace45',1,'glm']]],\n  ['lowp_5fimat3x4',['lowp_imat3x4',['../a00155.html#ga9273faab33623d944af4080befbb2c80',1,'glm']]],\n  ['lowp_5fimat4',['lowp_imat4',['../a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c',1,'glm']]],\n  ['lowp_5fimat4x2',['lowp_imat4x2',['../a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09',1,'glm']]],\n  ['lowp_5fimat4x3',['lowp_imat4x3',['../a00155.html#ga8f40483a3ae634ead8ad22272c543a33',1,'glm']]],\n  ['lowp_5fimat4x4',['lowp_imat4x4',['../a00155.html#gaf65677e53ac8e31a107399340d5e2451',1,'glm']]],\n  ['lowp_5fint',['lowp_int',['../a00145.html#gad0fa1e32e8b3552ed63556eca51c620e',1,'glm']]],\n  ['lowp_5fint16',['lowp_int16',['../a00165.html#ga698e36b01167fc0f037889334dce8def',1,'glm']]],\n  ['lowp_5fint16_5ft',['lowp_int16_t',['../a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a',1,'glm']]],\n  ['lowp_5fint32',['lowp_int32',['../a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02',1,'glm']]],\n  ['lowp_5fint32_5ft',['lowp_int32_t',['../a00165.html#ga0350631d35ff800e6133ac6243b13cbc',1,'glm']]],\n  ['lowp_5fint64',['lowp_int64',['../a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c',1,'glm']]],\n  ['lowp_5fint64_5ft',['lowp_int64_t',['../a00165.html#gaebf341fc4a5be233f7dde962c2e33847',1,'glm']]],\n  ['lowp_5fint8',['lowp_int8',['../a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6',1,'glm']]],\n  ['lowp_5fint8_5ft',['lowp_int8_t',['../a00165.html#ga119c41d73fe9977358174eb3ac1035a3',1,'glm']]],\n  ['lowp_5fivec2',['lowp_ivec2',['../a00145.html#ga7ce7e678655c51239b95b2089e8f0e96',1,'glm']]],\n  ['lowp_5fivec3',['lowp_ivec3',['../a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0',1,'glm']]],\n  ['lowp_5fivec4',['lowp_ivec4',['../a00145.html#ga693ad87d8ccd440f0c0423281defeccd',1,'glm']]],\n  ['lowp_5fmat2',['lowp_mat2',['../a00145.html#ga08bba677ef7b2809ac0061fa9a3db854',1,'glm']]],\n  ['lowp_5fmat2x2',['lowp_mat2x2',['../a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5',1,'glm']]],\n  ['lowp_5fmat2x3',['lowp_mat2x3',['../a00145.html#ga083089177b89ae9166d8d251a90f4b8b',1,'glm']]],\n  ['lowp_5fmat2x4',['lowp_mat2x4',['../a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8',1,'glm']]],\n  ['lowp_5fmat3',['lowp_mat3',['../a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9',1,'glm']]],\n  ['lowp_5fmat3x2',['lowp_mat3x2',['../a00145.html#ga10f0f2108800a543f22d90ecf4b40d01',1,'glm']]],\n  ['lowp_5fmat3x3',['lowp_mat3x3',['../a00145.html#ga1e4b7727038383e0103b138c66a65039',1,'glm']]],\n  ['lowp_5fmat3x4',['lowp_mat3x4',['../a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7',1,'glm']]],\n  ['lowp_5fmat4',['lowp_mat4',['../a00145.html#ga73e2f3bcae71b05736f2c962f98565a1',1,'glm']]],\n  ['lowp_5fmat4x2',['lowp_mat4x2',['../a00145.html#ga9839115cb8be9524f0621caf4bb29665',1,'glm']]],\n  ['lowp_5fmat4x3',['lowp_mat4x3',['../a00145.html#ga7eb333327f0b261237b540496137d55e',1,'glm']]],\n  ['lowp_5fmat4x4',['lowp_mat4x4',['../a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b',1,'glm']]],\n  ['lowp_5fu16',['lowp_u16',['../a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126',1,'glm']]],\n  ['lowp_5fu32',['lowp_u32',['../a00165.html#ga4f072ada9552e1e480bbb3b1acde5250',1,'glm']]],\n  ['lowp_5fu64',['lowp_u64',['../a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed',1,'glm']]],\n  ['lowp_5fu8',['lowp_u8',['../a00165.html#ga1b09f03da7ac43055c68a349d5445083',1,'glm']]],\n  ['lowp_5fuint',['lowp_uint',['../a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97',1,'glm']]],\n  ['lowp_5fuint16',['lowp_uint16',['../a00165.html#gad68bfd9f881856fc863a6ebca0b67f78',1,'glm']]],\n  ['lowp_5fuint16_5ft',['lowp_uint16_t',['../a00165.html#ga91c4815f93177eb423362fd296a87e9f',1,'glm']]],\n  ['lowp_5fuint32',['lowp_uint32',['../a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b',1,'glm']]],\n  ['lowp_5fuint32_5ft',['lowp_uint32_t',['../a00165.html#gaf1b735b4b1145174f4e4167d13778f9b',1,'glm']]],\n  ['lowp_5fuint64',['lowp_uint64',['../a00165.html#gaa212b805736a759998e312cbdd550fae',1,'glm']]],\n  ['lowp_5fuint64_5ft',['lowp_uint64_t',['../a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153',1,'glm']]],\n  ['lowp_5fuint8',['lowp_uint8',['../a00165.html#gaf49470869e9be2c059629b250619804e',1,'glm']]],\n  ['lowp_5fuint8_5ft',['lowp_uint8_t',['../a00165.html#ga667b2ece2b258be898812dc2177995d1',1,'glm']]],\n  ['lowp_5fumat2',['lowp_umat2',['../a00155.html#gaf2fba702d990437fc88ff3f3a76846ee',1,'glm']]],\n  ['lowp_5fumat2x2',['lowp_umat2x2',['../a00155.html#ga7b2e9d89745f7175051284e54c81d81c',1,'glm']]],\n  ['lowp_5fumat2x3',['lowp_umat2x3',['../a00155.html#ga3072f90fd86f17a862e21589fbb14c0f',1,'glm']]],\n  ['lowp_5fumat2x4',['lowp_umat2x4',['../a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d',1,'glm']]],\n  ['lowp_5fumat3',['lowp_umat3',['../a00155.html#gaf1145f72bcdd590f5808c4bc170c2924',1,'glm']]],\n  ['lowp_5fumat3x2',['lowp_umat3x2',['../a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b',1,'glm']]],\n  ['lowp_5fumat3x3',['lowp_umat3x3',['../a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5',1,'glm']]],\n  ['lowp_5fumat3x4',['lowp_umat3x4',['../a00155.html#gaec3d624306bd59649f021864709d56b5',1,'glm']]],\n  ['lowp_5fumat4',['lowp_umat4',['../a00155.html#gac092c6105827bf9ea080db38074b78eb',1,'glm']]],\n  ['lowp_5fumat4x2',['lowp_umat4x2',['../a00155.html#ga7716c2b210d141846f1ac4e774adef5e',1,'glm']]],\n  ['lowp_5fumat4x3',['lowp_umat4x3',['../a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff',1,'glm']]],\n  ['lowp_5fumat4x4',['lowp_umat4x4',['../a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0',1,'glm']]],\n  ['lowp_5fuvec2',['lowp_uvec2',['../a00145.html#ga3ab41df977e0b21c1c41a314b1011042',1,'glm']]],\n  ['lowp_5fuvec3',['lowp_uvec3',['../a00145.html#gaacab3ed11290185c279a97edc9255b98',1,'glm']]],\n  ['lowp_5fuvec4',['lowp_uvec4',['../a00145.html#ga4cdf061bac6ded19e940e876eab9b737',1,'glm']]],\n  ['lowp_5fvec2',['lowp_vec2',['../a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9',1,'glm']]],\n  ['lowp_5fvec3',['lowp_vec3',['../a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79',1,'glm']]],\n  ['lowp_5fvec4',['lowp_vec4',['../a00145.html#gace3acb313c800552a9411953eb8b2ed7',1,'glm']]],\n  ['luminosity',['luminosity',['../a00173.html#gad028e0a4f1a9c812b39439b746295b34',1,'glm']]],\n  ['lxnorm',['lxNorm',['../a00203.html#gacad23d30497eb16f67709f2375d1f66a',1,'glm::lxNorm(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, unsigned int Depth)'],['../a00203.html#gac61b6d81d796d6eb4d4183396a19ab91',1,'glm::lxNorm(vec&lt; 3, T, Q &gt; const &amp;x, unsigned int Depth)']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_b.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_b.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_b.js",
    "content": "var searchData=\n[\n  ['matrix_20functions',['Matrix functions',['../a00230.html',1,'']]],\n  ['make_5fmat2',['make_mat2',['../a00166.html#ga04409e74dc3da251d2501acf5b4b546c',1,'glm']]],\n  ['make_5fmat2x2',['make_mat2x2',['../a00166.html#gae49e1c7bcd5abec74d1c34155031f663',1,'glm']]],\n  ['make_5fmat2x3',['make_mat2x3',['../a00166.html#ga21982104164789cf8985483aaefc25e8',1,'glm']]],\n  ['make_5fmat2x4',['make_mat2x4',['../a00166.html#ga078b862c90b0e9a79ed43a58997d8388',1,'glm']]],\n  ['make_5fmat3',['make_mat3',['../a00166.html#ga611ee7c4d4cadfc83a8fa8e1d10a170f',1,'glm']]],\n  ['make_5fmat3x2',['make_mat3x2',['../a00166.html#ga27a24e121dc39e6857620e0f85b6e1a8',1,'glm']]],\n  ['make_5fmat3x3',['make_mat3x3',['../a00166.html#gaf2e8337b15c3362aaeb6e5849e1c0536',1,'glm']]],\n  ['make_5fmat3x4',['make_mat3x4',['../a00166.html#ga05dd66232aedb993e3b8e7b35eaf932b',1,'glm']]],\n  ['make_5fmat4',['make_mat4',['../a00166.html#gae7bcedb710d1446c87fd1fc93ed8ee9a',1,'glm']]],\n  ['make_5fmat4x2',['make_mat4x2',['../a00166.html#ga8b34c9b25bf3310d8ff9c828c7e2d97c',1,'glm']]],\n  ['make_5fmat4x3',['make_mat4x3',['../a00166.html#ga0330bf6640092d7985fac92927bbd42b',1,'glm']]],\n  ['make_5fmat4x4',['make_mat4x4',['../a00166.html#ga8f084be30e404844bfbb4a551ac2728c',1,'glm']]],\n  ['make_5fquat',['make_quat',['../a00166.html#gaadafb6600af2633e4c98cc64c72f5269',1,'glm']]],\n  ['make_5fvec2',['make_vec2',['../a00166.html#ga81253cf7b0ebfbb1e70540c5774e6824',1,'glm']]],\n  ['make_5fvec3',['make_vec3',['../a00166.html#gad9e0d36ff489cb30c65ad1fa40351651',1,'glm']]],\n  ['make_5fvec4',['make_vec4',['../a00166.html#ga63f576518993efc22a969f18f80e29bb',1,'glm']]],\n  ['mask',['mask',['../a00149.html#gad7eba518a0b71662114571ee76939f8a',1,'glm::mask(genIUType Bits)'],['../a00149.html#ga2e64e3b922a296033b825311e7f5fff1',1,'glm::mask(vec&lt; L, T, Q &gt; const &amp;v)']]],\n  ['mat2',['mat2',['../a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450',1,'glm']]],\n  ['mat2x2',['mat2x2',['../a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5',1,'glm']]],\n  ['mat2x2_2ehpp',['mat2x2.hpp',['../a00046.html',1,'']]],\n  ['mat2x3',['mat2x3',['../a00144.html#gafb063d734266e92915d87f8943560471',1,'glm']]],\n  ['mat2x3_2ehpp',['mat2x3.hpp',['../a00047.html',1,'']]],\n  ['mat2x4',['mat2x4',['../a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac',1,'glm']]],\n  ['mat2x4_2ehpp',['mat2x4.hpp',['../a00048.html',1,'']]],\n  ['mat2x4_5fcast',['mat2x4_cast',['../a00178.html#gae99d143b37f9cad4cd9285571aab685a',1,'glm']]],\n  ['mat3',['mat3',['../a00144.html#ga6dd3ec98a548755676267e59142911f8',1,'glm']]],\n  ['mat3_5fcast',['mat3_cast',['../a00160.html#ga6e88f15c94effe737c876d21ea0db101',1,'glm']]],\n  ['mat3x2',['mat3x2',['../a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4',1,'glm']]],\n  ['mat3x2_2ehpp',['mat3x2.hpp',['../a00049.html',1,'']]],\n  ['mat3x3',['mat3x3',['../a00144.html#ga378921b6a07bcdad946858b340f69ab1',1,'glm']]],\n  ['mat3x3_2ehpp',['mat3x3.hpp',['../a00050.html',1,'']]],\n  ['mat3x4',['mat3x4',['../a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf',1,'glm']]],\n  ['mat3x4_2ehpp',['mat3x4.hpp',['../a00051.html',1,'']]],\n  ['mat3x4_5fcast',['mat3x4_cast',['../a00178.html#gaf59f5bb69620d2891c3795c6f2639179',1,'glm']]],\n  ['mat4',['mat4',['../a00144.html#gade0eb47c01f79384a6f38017ede17446',1,'glm']]],\n  ['mat4_5fcast',['mat4_cast',['../a00160.html#ga8e2085f17cd5aae423c04536524f11b3',1,'glm']]],\n  ['mat4x2',['mat4x2',['../a00144.html#ga1b3f6a5cbc17362141f9781262ed838f',1,'glm']]],\n  ['mat4x2_2ehpp',['mat4x2.hpp',['../a00052.html',1,'']]],\n  ['mat4x3',['mat4x3',['../a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd',1,'glm']]],\n  ['mat4x3_2ehpp',['mat4x3.hpp',['../a00053.html',1,'']]],\n  ['mat4x4',['mat4x4',['../a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81',1,'glm']]],\n  ['mat4x4_2ehpp',['mat4x4.hpp',['../a00054.html',1,'']]],\n  ['matrix_2ehpp',['matrix.hpp',['../a00055.html',1,'']]],\n  ['matrix_5faccess_2ehpp',['matrix_access.hpp',['../a00056.html',1,'']]],\n  ['matrix_5fcross_5fproduct_2ehpp',['matrix_cross_product.hpp',['../a00057.html',1,'']]],\n  ['matrix_5fdecompose_2ehpp',['matrix_decompose.hpp',['../a00058.html',1,'']]],\n  ['matrix_5ffactorisation_2ehpp',['matrix_factorisation.hpp',['../a00059.html',1,'']]],\n  ['matrix_5finteger_2ehpp',['matrix_integer.hpp',['../a00060.html',1,'']]],\n  ['matrix_5finterpolation_2ehpp',['matrix_interpolation.hpp',['../a00061.html',1,'']]],\n  ['matrix_5finverse_2ehpp',['matrix_inverse.hpp',['../a00062.html',1,'']]],\n  ['matrix_5fmajor_5fstorage_2ehpp',['matrix_major_storage.hpp',['../a00063.html',1,'']]],\n  ['matrix_5foperation_2ehpp',['matrix_operation.hpp',['../a00064.html',1,'']]],\n  ['matrix_5fquery_2ehpp',['matrix_query.hpp',['../a00065.html',1,'']]],\n  ['matrix_5ftransform_2ehpp',['matrix_transform.hpp',['../a00066.html',1,'']]],\n  ['matrix_5ftransform_5f2d_2ehpp',['matrix_transform_2d.hpp',['../a00067.html',1,'']]],\n  ['matrixcompmult',['matrixCompMult',['../a00230.html#gaf14569404c779fedca98d0b9b8e58c1f',1,'glm']]],\n  ['matrixcross3',['matrixCross3',['../a00194.html#ga5802386bb4c37b3332a3b6fd8b6960ff',1,'glm']]],\n  ['matrixcross4',['matrixCross4',['../a00194.html#ga20057fff91ddafa102934adb25458cde',1,'glm']]],\n  ['max',['max',['../a00140.html#ga98caa7f95a94c86a86ebce893a45326c',1,'glm::max(genType x, genType y)'],['../a00140.html#gae8b0964d30deabd0867b8d7ac44f067e',1,'glm::max(vec&lt; L, T, Q &gt; const &amp;x, T y)'],['../a00140.html#gad48b723358c68d45477c22ff0101985e',1,'glm::max(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00181.html#ga04991ccb9865c4c4e58488cfb209ce69',1,'glm::max(T const &amp;x, T const &amp;y, T const &amp;z)'],['../a00181.html#gae1b7bbe5c91de4924835ea3e14530744',1,'glm::max(C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z)'],['../a00181.html#gaf832e9d4ab4826b2dda2fda25935a3a4',1,'glm::max(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z)'],['../a00181.html#ga78e04a0cef1c4863fcae1a2130500d87',1,'glm::max(T const &amp;x, T const &amp;y, T const &amp;z, T const &amp;w)'],['../a00181.html#ga7cca8b53cfda402040494cdf40fbdf4a',1,'glm::max(C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z, typename C&lt; T &gt;::T const &amp;w)'],['../a00181.html#gaacffbc466c2d08c140b181e7fd8a4858',1,'glm::max(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)']]],\n  ['mediump_5fbvec2',['mediump_bvec2',['../a00145.html#ga6670d1a61e113c339aac7dd2ae72154b',1,'glm']]],\n  ['mediump_5fbvec3',['mediump_bvec3',['../a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005',1,'glm']]],\n  ['mediump_5fbvec4',['mediump_bvec4',['../a00145.html#ga620d6dce077134eee76e014a3e2b2661',1,'glm']]],\n  ['mediump_5fddualquat',['mediump_ddualquat',['../a00178.html#ga0fb11e48e2d16348ccb06a25213641b4',1,'glm']]],\n  ['mediump_5fdmat2',['mediump_dmat2',['../a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0',1,'glm']]],\n  ['mediump_5fdmat2x2',['mediump_dmat2x2',['../a00145.html#gade27733f04b9a6f723850263ccda908b',1,'glm']]],\n  ['mediump_5fdmat2x3',['mediump_dmat2x3',['../a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e',1,'glm']]],\n  ['mediump_5fdmat2x4',['mediump_dmat2x4',['../a00145.html#ga6afa4f5d70f8e0dceed640a26918661b',1,'glm']]],\n  ['mediump_5fdmat3',['mediump_dmat3',['../a00145.html#ga5418e9669f0673640a2fbdeb261aff50',1,'glm']]],\n  ['mediump_5fdmat3x2',['mediump_dmat3x2',['../a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4',1,'glm']]],\n  ['mediump_5fdmat3x3',['mediump_dmat3x3',['../a00145.html#gafee0cf7585d59b2485e42e8aae4714ca',1,'glm']]],\n  ['mediump_5fdmat3x4',['mediump_dmat3x4',['../a00145.html#ga9e0578807bf8880cea8336dfdb666d69',1,'glm']]],\n  ['mediump_5fdmat4',['mediump_dmat4',['../a00145.html#gafaf455c1dff11cb8f3c86467ac27a461',1,'glm']]],\n  ['mediump_5fdmat4x2',['mediump_dmat4x2',['../a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680',1,'glm']]],\n  ['mediump_5fdmat4x3',['mediump_dmat4x3',['../a00145.html#ga002d912d086a3eaa5425a6c4ca468fea',1,'glm']]],\n  ['mediump_5fdmat4x4',['mediump_dmat4x4',['../a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f',1,'glm']]],\n  ['mediump_5fdualquat',['mediump_dualquat',['../a00178.html#gaa7aeb54c167712b38f2178a1be2360ad',1,'glm']]],\n  ['mediump_5fdvec2',['mediump_dvec2',['../a00145.html#ga00b74cf6997deedd6a962e0997bc120b',1,'glm']]],\n  ['mediump_5fdvec3',['mediump_dvec3',['../a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a',1,'glm']]],\n  ['mediump_5fdvec4',['mediump_dvec4',['../a00145.html#ga072fdd19df303b9b821b6793b86c1637',1,'glm']]],\n  ['mediump_5ffdualquat',['mediump_fdualquat',['../a00178.html#ga4a6b594ff7e81150d8143001367a9431',1,'glm']]],\n  ['mediump_5ffloat',['mediump_float',['../a00145.html#ga280c68f537f4b1e03a00b23e62573b98',1,'glm']]],\n  ['mediump_5fi16',['mediump_i16',['../a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a',1,'glm']]],\n  ['mediump_5fi32',['mediump_i32',['../a00165.html#gaf5e94bf2a20af7601787c154751dc2e1',1,'glm']]],\n  ['mediump_5fi64',['mediump_i64',['../a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f',1,'glm']]],\n  ['mediump_5fi8',['mediump_i8',['../a00165.html#gacf1ded173e1e2d049c511d095b259e21',1,'glm']]],\n  ['mediump_5fimat2',['mediump_imat2',['../a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378',1,'glm']]],\n  ['mediump_5fimat2x2',['mediump_imat2x2',['../a00155.html#ga4b2aeb11a329940721dda9583e71f856',1,'glm']]],\n  ['mediump_5fimat2x3',['mediump_imat2x3',['../a00155.html#ga74362470ba99843ac70aee5ac38cc674',1,'glm']]],\n  ['mediump_5fimat2x4',['mediump_imat2x4',['../a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09',1,'glm']]],\n  ['mediump_5fimat3',['mediump_imat3',['../a00155.html#ga6c63bdc736efd3466e0730de0251cb71',1,'glm']]],\n  ['mediump_5fimat3x2',['mediump_imat3x2',['../a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809',1,'glm']]],\n  ['mediump_5fimat3x3',['mediump_imat3x3',['../a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12',1,'glm']]],\n  ['mediump_5fimat3x4',['mediump_imat3x4',['../a00155.html#ga67689a518b181a26540bc44a163525cd',1,'glm']]],\n  ['mediump_5fimat4',['mediump_imat4',['../a00155.html#gaf348552978553630d2a00b78eb887ced',1,'glm']]],\n  ['mediump_5fimat4x2',['mediump_imat4x2',['../a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc',1,'glm']]],\n  ['mediump_5fimat4x3',['mediump_imat4x3',['../a00155.html#ga5b10acc696759e03f6ab918f4467e94c',1,'glm']]],\n  ['mediump_5fimat4x4',['mediump_imat4x4',['../a00155.html#ga2596869d154dec1180beadbb9df80501',1,'glm']]],\n  ['mediump_5fint',['mediump_int',['../a00145.html#ga212ef8f883878cb7430228a279a7d866',1,'glm']]],\n  ['mediump_5fint16',['mediump_int16',['../a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d',1,'glm']]],\n  ['mediump_5fint16_5ft',['mediump_int16_t',['../a00165.html#ga80e72fe94c88498537e8158ba7591c54',1,'glm']]],\n  ['mediump_5fint32',['mediump_int32',['../a00165.html#ga5244cef85d6e870e240c76428a262ae8',1,'glm']]],\n  ['mediump_5fint32_5ft',['mediump_int32_t',['../a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180',1,'glm']]],\n  ['mediump_5fint64',['mediump_int64',['../a00165.html#ga7b968f2b86a0442a89c7359171e1d866',1,'glm']]],\n  ['mediump_5fint64_5ft',['mediump_int64_t',['../a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64',1,'glm']]],\n  ['mediump_5fint8',['mediump_int8',['../a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e',1,'glm']]],\n  ['mediump_5fint8_5ft',['mediump_int8_t',['../a00165.html#ga6d7b3789ecb932c26430009478cac7ae',1,'glm']]],\n  ['mediump_5fivec2',['mediump_ivec2',['../a00145.html#gaabd76afa066badf4489fd0fec28f9537',1,'glm']]],\n  ['mediump_5fivec3',['mediump_ivec3',['../a00145.html#gaf964dcfcbb2088d13c9c321517171154',1,'glm']]],\n  ['mediump_5fivec4',['mediump_ivec4',['../a00145.html#ga7f89d11cd6e64c1814200f8cca083512',1,'glm']]],\n  ['mediump_5fmat2',['mediump_mat2',['../a00145.html#ga83fe5281ac0a3d153226b903badd415b',1,'glm']]],\n  ['mediump_5fmat2x2',['mediump_mat2x2',['../a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0',1,'glm']]],\n  ['mediump_5fmat2x3',['mediump_mat2x3',['../a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a',1,'glm']]],\n  ['mediump_5fmat2x4',['mediump_mat2x4',['../a00145.html#gaa190a86a477360f02508191a6549efc3',1,'glm']]],\n  ['mediump_5fmat3',['mediump_mat3',['../a00145.html#gad31f8a0097ff6c22b92cf855dfffc575',1,'glm']]],\n  ['mediump_5fmat3x2',['mediump_mat3x2',['../a00145.html#ga66a044feff0a17b1bf275bc8d200e514',1,'glm']]],\n  ['mediump_5fmat3x3',['mediump_mat3x3',['../a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a',1,'glm']]],\n  ['mediump_5fmat3x4',['mediump_mat3x4',['../a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e',1,'glm']]],\n  ['mediump_5fmat4',['mediump_mat4',['../a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58',1,'glm']]],\n  ['mediump_5fmat4x2',['mediump_mat4x2',['../a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e',1,'glm']]],\n  ['mediump_5fmat4x3',['mediump_mat4x3',['../a00145.html#ga1bab99cd9c4edd4bffdab662609b0961',1,'glm']]],\n  ['mediump_5fmat4x4',['mediump_mat4x4',['../a00145.html#ga005facdef4caac0ef7435eee609c7e46',1,'glm']]],\n  ['mediump_5fu16',['mediump_u16',['../a00165.html#ga9df98857be695d5a30cb30f5bfa38a80',1,'glm']]],\n  ['mediump_5fu32',['mediump_u32',['../a00165.html#ga1bd0e914158bf03135f8a317de6debe9',1,'glm']]],\n  ['mediump_5fu64',['mediump_u64',['../a00165.html#ga2af9490085ae3bdf36a544e9dd073610',1,'glm']]],\n  ['mediump_5fu8',['mediump_u8',['../a00165.html#gad1213a22bbb9e4107f07eaa4956f8281',1,'glm']]],\n  ['mediump_5fuint',['mediump_uint',['../a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e',1,'glm']]],\n  ['mediump_5fuint16',['mediump_uint16',['../a00165.html#ga2885a6c89916911e418c06bb76b9bdbb',1,'glm']]],\n  ['mediump_5fuint16_5ft',['mediump_uint16_t',['../a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e',1,'glm']]],\n  ['mediump_5fuint32',['mediump_uint32',['../a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f',1,'glm']]],\n  ['mediump_5fuint32_5ft',['mediump_uint32_t',['../a00165.html#gaf4dae276fd29623950de14a6ca2586b5',1,'glm']]],\n  ['mediump_5fuint64',['mediump_uint64',['../a00165.html#ga30652709815ad9404272a31957daa59e',1,'glm']]],\n  ['mediump_5fuint64_5ft',['mediump_uint64_t',['../a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9',1,'glm']]],\n  ['mediump_5fuint8',['mediump_uint8',['../a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3',1,'glm']]],\n  ['mediump_5fuint8_5ft',['mediump_uint8_t',['../a00165.html#gadfe65c78231039e90507770db50c98c7',1,'glm']]],\n  ['mediump_5fumat2',['mediump_umat2',['../a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee',1,'glm']]],\n  ['mediump_5fumat2x2',['mediump_umat2x2',['../a00155.html#ga3b209b1b751f041422137e3c065dfa98',1,'glm']]],\n  ['mediump_5fumat2x3',['mediump_umat2x3',['../a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306',1,'glm']]],\n  ['mediump_5fumat2x4',['mediump_umat2x4',['../a00155.html#gae1317ddca16d01e119a40b7f0ee85f95',1,'glm']]],\n  ['mediump_5fumat3',['mediump_umat3',['../a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a',1,'glm']]],\n  ['mediump_5fumat3x2',['mediump_umat3x2',['../a00155.html#gaadc28bfdc8ebca81ae85121b11994970',1,'glm']]],\n  ['mediump_5fumat3x3',['mediump_umat3x3',['../a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d',1,'glm']]],\n  ['mediump_5fumat3x4',['mediump_umat3x4',['../a00155.html#ga78009a1e4ca64217e46b418535e52546',1,'glm']]],\n  ['mediump_5fumat4',['mediump_umat4',['../a00155.html#ga5087c2beb26a11d9af87432e554cf9d1',1,'glm']]],\n  ['mediump_5fumat4x2',['mediump_umat4x2',['../a00155.html#gaf35aefd81cc13718f6b059623f7425fa',1,'glm']]],\n  ['mediump_5fumat4x3',['mediump_umat4x3',['../a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb',1,'glm']]],\n  ['mediump_5fumat4x4',['mediump_umat4x4',['../a00155.html#gaa9428fc8430dc552aad920653f822ef3',1,'glm']]],\n  ['mediump_5fuvec2',['mediump_uvec2',['../a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081',1,'glm']]],\n  ['mediump_5fuvec3',['mediump_uvec3',['../a00145.html#gaab484fc37dddd84f767d84e38d761649',1,'glm']]],\n  ['mediump_5fuvec4',['mediump_uvec4',['../a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa',1,'glm']]],\n  ['mediump_5fvec2',['mediump_vec2',['../a00145.html#gabc61976261c406520c7a8e4d946dc3f0',1,'glm']]],\n  ['mediump_5fvec3',['mediump_vec3',['../a00145.html#ga2384e263df19f1404b733016eff78fca',1,'glm']]],\n  ['mediump_5fvec4',['mediump_vec4',['../a00145.html#ga5c6978d3ffba06738416a33083853fc0',1,'glm']]],\n  ['min',['min',['../a00140.html#ga2c2bde1cec025b7ddff83c74a1113719',1,'glm::min(genType x, genType y)'],['../a00140.html#ga2d274e8b537c173dba983331a2620736',1,'glm::min(vec&lt; L, T, Q &gt; const &amp;x, T y)'],['../a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478',1,'glm::min(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00181.html#ga713d3f9b3e76312c0d314e0c8611a6a6',1,'glm::min(T const &amp;x, T const &amp;y, T const &amp;z)'],['../a00181.html#ga74d1a96e7cdbac40f6d35142d3bcbbd4',1,'glm::min(C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z)'],['../a00181.html#ga42b5c3fc027fd3d9a50d2ccc9126d9f0',1,'glm::min(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z)'],['../a00181.html#ga95466987024d03039607f09e69813d69',1,'glm::min(T const &amp;x, T const &amp;y, T const &amp;z, T const &amp;w)'],['../a00181.html#ga4fe35dd31dd0c45693c9b60b830b8d47',1,'glm::min(C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z, typename C&lt; T &gt;::T const &amp;w)'],['../a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead',1,'glm::min(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)']]],\n  ['mirrorclamp',['mirrorClamp',['../a00228.html#gaa6856a0a048d2749252848da35e10c8b',1,'glm']]],\n  ['mirrorrepeat',['mirrorRepeat',['../a00228.html#ga16a89b0661b60d5bea85137bbae74d73',1,'glm']]],\n  ['mix',['mix',['../a00140.html#ga8e93f374aae27d1a88b921860351f8d4',1,'glm::mix(genTypeT x, genTypeT y, genTypeU a)'],['../a00160.html#ga6c31ccbb8548b2b24226901e602dfc0a',1,'glm::mix(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)']]],\n  ['mixed_5fproduct_2ehpp',['mixed_product.hpp',['../a00068.html',1,'']]],\n  ['mixedproduct',['mixedProduct',['../a00202.html#gab3c6048fbb67f7243b088a4fee48d020',1,'glm']]],\n  ['mod',['mod',['../a00140.html#ga12201563ef902e3b07e0d1d7656efdb1',1,'glm::mod(genType x, genType y)'],['../a00140.html#gad32bcde4977c7a42c80468f4061a1f55',1,'glm::mod(vec&lt; L, T, Q &gt; const &amp;x, T y)'],['../a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c',1,'glm::mod(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0',1,'glm::mod(genIUType x, genIUType y)'],['../a00190.html#gaabfbb41531ab7ad8d06fc176edfba785',1,'glm::mod(int x, int y)'],['../a00190.html#ga63fc8d63e7da1706439233b386ba8b6f',1,'glm::mod(uint x, uint y)']]],\n  ['modf',['modf',['../a00140.html#ga85e33f139b8db1b39b590a5713b9e679',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_c.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_c.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_c.js",
    "content": "var searchData=\n[\n  ['next_5ffloat',['next_float',['../a00167.html#gae516ae554faa6117660828240e8bdaf0',1,'glm::next_float(genType const &amp;x)'],['../a00167.html#gad107ec3d9697ef82032a33338a73ebdd',1,'glm::next_float(genType const &amp;x, uint const &amp;Distance)']]],\n  ['nlz',['nlz',['../a00190.html#ga78dff8bdb361bf0061194c93e003d189',1,'glm']]],\n  ['noise_2ehpp',['noise.hpp',['../a00069.html',1,'']]],\n  ['norm_2ehpp',['norm.hpp',['../a00070.html',1,'']]],\n  ['normal_2ehpp',['normal.hpp',['../a00071.html',1,'']]],\n  ['normalize',['normalize',['../a00142.html#ga3b8d3dcae77870781392ed2902cce597',1,'glm::normalize(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00160.html#gad4f3769e33c18d1897d1857c1f8da864',1,'glm::normalize(tquat&lt; T, Q &gt; const &amp;q)'],['../a00178.html#ga299b8641509606b1958ffa104a162cfe',1,'glm::normalize(tdualquat&lt; T, Q &gt; const &amp;q)']]],\n  ['normalize_5fdot_2ehpp',['normalize_dot.hpp',['../a00072.html',1,'']]],\n  ['normalizedot',['normalizeDot',['../a00205.html#gacb140a2b903115d318c8b0a2fb5a5daa',1,'glm']]],\n  ['not_5f',['not_',['../a00233.html#ga464f1392c934f69a917ab8bb6eda5b09',1,'glm']]],\n  ['notequal',['notEqual',['../a00160.html#ga9494ec3489041958a240963a8a0ac9a0',1,'glm::notEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#gac5a72a973c81dc697dd8bb5d218e8251',1,'glm::notEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['number_5fprecision_2ehpp',['number_precision.hpp',['../a00073.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_d.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_d.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_d.js",
    "content": "var searchData=\n[\n  ['opengl_20mathematics_20_28glm_29',['OpenGL Mathematics (GLM)',['../index.html',1,'']]],\n  ['one',['one',['../a00151.html#ga39c2fb227631ca25894326529bdd1ee5',1,'glm']]],\n  ['one_5fover_5fpi',['one_over_pi',['../a00151.html#ga555150da2b06d23c8738981d5013e0eb',1,'glm']]],\n  ['one_5fover_5froot_5ftwo',['one_over_root_two',['../a00151.html#ga788fa23a0939bac4d1d0205fb4f35818',1,'glm']]],\n  ['one_5fover_5ftwo_5fpi',['one_over_two_pi',['../a00151.html#ga7c922b427986cbb2e4c6ac69874eefbc',1,'glm']]],\n  ['optimum_5fpow_2ehpp',['optimum_pow.hpp',['../a00074.html',1,'']]],\n  ['orientate2',['orientate2',['../a00179.html#gae16738a9f1887cf4e4db6a124637608d',1,'glm']]],\n  ['orientate3',['orientate3',['../a00179.html#ga7ca98668a5786f19c7b38299ebbc9b4c',1,'glm::orientate3(T const &amp;angle)'],['../a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb',1,'glm::orientate3(vec&lt; 3, T, Q &gt; const &amp;angles)']]],\n  ['orientate4',['orientate4',['../a00179.html#ga4a044653f71a4ecec68e0b623382b48a',1,'glm']]],\n  ['orientation',['orientation',['../a00216.html#ga1a32fceb71962e6160e8af295c91930a',1,'glm']]],\n  ['orientedangle',['orientedAngle',['../a00226.html#ga9556a803dce87fe0f42fdabe4ebba1d5',1,'glm::orientedAngle(vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)'],['../a00226.html#ga706fce3d111f485839756a64f5a48553',1,'glm::orientedAngle(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, vec&lt; 3, T, Q &gt; const &amp;ref)']]],\n  ['ortho',['ortho',['../a00157.html#ga6615d8a9d39432e279c4575313ecb456',1,'glm::ortho(T left, T right, T bottom, T top, T zNear, T zFar)'],['../a00157.html#gae5b6b40ed882cd56cd7cb97701909c06',1,'glm::ortho(T left, T right, T bottom, T top)']]],\n  ['ortholh',['orthoLH',['../a00157.html#gad122a79aadaa5529cec4ac197203db7f',1,'glm']]],\n  ['orthonormalize',['orthonormalize',['../a00208.html#ga4cab5d698e6e2eccea30c8e81c74371f',1,'glm::orthonormalize(mat&lt; 3, 3, T, Q &gt; const &amp;m)'],['../a00208.html#gac3bc7ef498815026bc3d361ae0b7138e',1,'glm::orthonormalize(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)']]],\n  ['orthonormalize_2ehpp',['orthonormalize.hpp',['../a00075.html',1,'']]],\n  ['orthorh',['orthoRH',['../a00157.html#ga16264c9b838edeb9dd1de7a1010a13a4',1,'glm']]],\n  ['outerproduct',['outerProduct',['../a00230.html#gac29fb7bae75a8e4c1b74cbbf85520e50',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_e.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_e.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_e.js",
    "content": "var searchData=\n[\n  ['precision_20types',['Precision types',['../a00145.html',1,'']]],\n  ['packdouble2x32',['packDouble2x32',['../a00231.html#gaa916ca426b2bb0343ba17e3753e245c2',1,'glm']]],\n  ['packed_5fbvec1',['packed_bvec1',['../a00164.html#ga88632cea9008ac0ac1388e94e804a53c',1,'glm']]],\n  ['packed_5fbvec2',['packed_bvec2',['../a00164.html#gab85245913eaa40ab82adabcae37086cb',1,'glm']]],\n  ['packed_5fbvec3',['packed_bvec3',['../a00164.html#ga0c48f9417f649e27f3fb0c9f733a18bd',1,'glm']]],\n  ['packed_5fbvec4',['packed_bvec4',['../a00164.html#ga3180d7db84a74c402157df3bbc0ae3ed',1,'glm']]],\n  ['packed_5fdvec1',['packed_dvec1',['../a00164.html#ga532f0c940649b1ee303acd572fc35531',1,'glm']]],\n  ['packed_5fdvec2',['packed_dvec2',['../a00164.html#ga5c194b11fbda636f2ab20c3bd0079196',1,'glm']]],\n  ['packed_5fdvec3',['packed_dvec3',['../a00164.html#ga0581ea552d86b2b5de7a2804bed80e72',1,'glm']]],\n  ['packed_5fdvec4',['packed_dvec4',['../a00164.html#gae8a9b181f9dc813ad6e125a52b14b935',1,'glm']]],\n  ['packed_5fhighp_5fbvec1',['packed_highp_bvec1',['../a00164.html#ga439e97795314b81cd15abd4e5c2e6e7a',1,'glm']]],\n  ['packed_5fhighp_5fbvec2',['packed_highp_bvec2',['../a00164.html#gad791d671f4fcf1ed1ea41f752916b70a',1,'glm']]],\n  ['packed_5fhighp_5fbvec3',['packed_highp_bvec3',['../a00164.html#ga6a5a3250b57dfadc66735bc72911437f',1,'glm']]],\n  ['packed_5fhighp_5fbvec4',['packed_highp_bvec4',['../a00164.html#ga09f517d88b996ef1b2f42fd54222b82d',1,'glm']]],\n  ['packed_5fhighp_5fdvec1',['packed_highp_dvec1',['../a00164.html#gab472b2d917b5e6efd76e8c7dbfbbf9f1',1,'glm']]],\n  ['packed_5fhighp_5fdvec2',['packed_highp_dvec2',['../a00164.html#ga5b2dc48fa19b684d207d69c6b145eb63',1,'glm']]],\n  ['packed_5fhighp_5fdvec3',['packed_highp_dvec3',['../a00164.html#gaaac6b356ef00154da41aaae7d1549193',1,'glm']]],\n  ['packed_5fhighp_5fdvec4',['packed_highp_dvec4',['../a00164.html#ga81b5368fe485e2630aa9b44832d592e7',1,'glm']]],\n  ['packed_5fhighp_5fivec1',['packed_highp_ivec1',['../a00164.html#ga7245acc887a5438f46fd85fdf076bb3b',1,'glm']]],\n  ['packed_5fhighp_5fivec2',['packed_highp_ivec2',['../a00164.html#ga54f368ec6b514a5aa4f28d40e6f93ef7',1,'glm']]],\n  ['packed_5fhighp_5fivec3',['packed_highp_ivec3',['../a00164.html#ga865a9c7bb22434b1b8c5ac31e164b628',1,'glm']]],\n  ['packed_5fhighp_5fivec4',['packed_highp_ivec4',['../a00164.html#gad6f1b4e3a51c2c051814b60d5d1b8895',1,'glm']]],\n  ['packed_5fhighp_5fuvec1',['packed_highp_uvec1',['../a00164.html#ga8c32b53f628a3616aa5061e58d66fe74',1,'glm']]],\n  ['packed_5fhighp_5fuvec2',['packed_highp_uvec2',['../a00164.html#gab704d4fb15f6f96d70e363d5db7060cd',1,'glm']]],\n  ['packed_5fhighp_5fuvec3',['packed_highp_uvec3',['../a00164.html#ga0b570da473fec4619db5aa0dce5133b0',1,'glm']]],\n  ['packed_5fhighp_5fuvec4',['packed_highp_uvec4',['../a00164.html#gaa582f38c82aef61dea7aaedf15bb06a6',1,'glm']]],\n  ['packed_5fhighp_5fvec1',['packed_highp_vec1',['../a00164.html#ga56473759d2702ee19ab7f91d0017fa70',1,'glm']]],\n  ['packed_5fhighp_5fvec2',['packed_highp_vec2',['../a00164.html#ga6b8b9475e7c3b16aed13edbc460bbc4d',1,'glm']]],\n  ['packed_5fhighp_5fvec3',['packed_highp_vec3',['../a00164.html#ga3815661df0e2de79beff8168c09adf1e',1,'glm']]],\n  ['packed_5fhighp_5fvec4',['packed_highp_vec4',['../a00164.html#ga4015f36bf5a5adb6ac5d45beed959867',1,'glm']]],\n  ['packed_5fivec1',['packed_ivec1',['../a00164.html#ga11581a06fc7bf941fa4d4b6aca29812c',1,'glm']]],\n  ['packed_5fivec2',['packed_ivec2',['../a00164.html#ga1fe4c5f56b8087d773aa90dc88a257a7',1,'glm']]],\n  ['packed_5fivec3',['packed_ivec3',['../a00164.html#gae157682a7847161787951ba1db4cf325',1,'glm']]],\n  ['packed_5fivec4',['packed_ivec4',['../a00164.html#gac228b70372abd561340d5f926a7c1778',1,'glm']]],\n  ['packed_5flowp_5fbvec1',['packed_lowp_bvec1',['../a00164.html#gae3c8750f53259ece334d3aa3b3649a40',1,'glm']]],\n  ['packed_5flowp_5fbvec2',['packed_lowp_bvec2',['../a00164.html#gac969befedbda69eb78d4e23f751fdbee',1,'glm']]],\n  ['packed_5flowp_5fbvec3',['packed_lowp_bvec3',['../a00164.html#ga7c20adbe1409e3fe4544677a7f6fe954',1,'glm']]],\n  ['packed_5flowp_5fbvec4',['packed_lowp_bvec4',['../a00164.html#gae473587cff3092edc0877fc691c26a0b',1,'glm']]],\n  ['packed_5flowp_5fdvec1',['packed_lowp_dvec1',['../a00164.html#ga054050e9d4e78d81db0e6d1573b1c624',1,'glm']]],\n  ['packed_5flowp_5fdvec2',['packed_lowp_dvec2',['../a00164.html#gadc19938ddb204bfcb4d9ef35b1e2bf93',1,'glm']]],\n  ['packed_5flowp_5fdvec3',['packed_lowp_dvec3',['../a00164.html#ga9189210cabd6651a5e14a4c46fb20598',1,'glm']]],\n  ['packed_5flowp_5fdvec4',['packed_lowp_dvec4',['../a00164.html#ga262dafd0c001c3a38d1cc91d024ca738',1,'glm']]],\n  ['packed_5flowp_5fivec1',['packed_lowp_ivec1',['../a00164.html#gaf22b77f1cf3e73b8b1dddfe7f959357c',1,'glm']]],\n  ['packed_5flowp_5fivec2',['packed_lowp_ivec2',['../a00164.html#ga52635859f5ef660ab999d22c11b7867f',1,'glm']]],\n  ['packed_5flowp_5fivec3',['packed_lowp_ivec3',['../a00164.html#ga98c9d122a959e9f3ce10a5623c310f5d',1,'glm']]],\n  ['packed_5flowp_5fivec4',['packed_lowp_ivec4',['../a00164.html#ga931731b8ae3b54c7ecc221509dae96bc',1,'glm']]],\n  ['packed_5flowp_5fuvec1',['packed_lowp_uvec1',['../a00164.html#gaf111fed760ecce16cb1988807569bee5',1,'glm']]],\n  ['packed_5flowp_5fuvec2',['packed_lowp_uvec2',['../a00164.html#ga958210fe245a75b058325d367c951132',1,'glm']]],\n  ['packed_5flowp_5fuvec3',['packed_lowp_uvec3',['../a00164.html#ga576a3f8372197a56a79dee1c8280f485',1,'glm']]],\n  ['packed_5flowp_5fuvec4',['packed_lowp_uvec4',['../a00164.html#gafdd97922b4a2a42cd0c99a13877ff4da',1,'glm']]],\n  ['packed_5flowp_5fvec1',['packed_lowp_vec1',['../a00164.html#ga0a6198fe64166a6a61084d43c71518a9',1,'glm']]],\n  ['packed_5flowp_5fvec2',['packed_lowp_vec2',['../a00164.html#gafbf1c2cce307c5594b165819ed83bf5d',1,'glm']]],\n  ['packed_5flowp_5fvec3',['packed_lowp_vec3',['../a00164.html#ga3a30c137c1f8cce478c28eab0427a570',1,'glm']]],\n  ['packed_5flowp_5fvec4',['packed_lowp_vec4',['../a00164.html#ga3cc94fb8de80bbd8a4aa7a5b206d304a',1,'glm']]],\n  ['packed_5fmediump_5fbvec1',['packed_mediump_bvec1',['../a00164.html#ga5546d828d63010a8f9cf81161ad0275a',1,'glm']]],\n  ['packed_5fmediump_5fbvec2',['packed_mediump_bvec2',['../a00164.html#gab4c6414a59539e66a242ad4cf4b476b4',1,'glm']]],\n  ['packed_5fmediump_5fbvec3',['packed_mediump_bvec3',['../a00164.html#ga70147763edff3fe96b03a0b98d6339a2',1,'glm']]],\n  ['packed_5fmediump_5fbvec4',['packed_mediump_bvec4',['../a00164.html#ga7b1620f259595b9da47a6374fc44588a',1,'glm']]],\n  ['packed_5fmediump_5fdvec1',['packed_mediump_dvec1',['../a00164.html#ga8920e90ea9c01d9c97e604a938ce2cbd',1,'glm']]],\n  ['packed_5fmediump_5fdvec2',['packed_mediump_dvec2',['../a00164.html#ga0c754a783b6fcf80374c013371c4dae9',1,'glm']]],\n  ['packed_5fmediump_5fdvec3',['packed_mediump_dvec3',['../a00164.html#ga1f18ada6f7cdd8c46db33ba987280fc4',1,'glm']]],\n  ['packed_5fmediump_5fdvec4',['packed_mediump_dvec4',['../a00164.html#ga568b850f1116b667043533cf77826968',1,'glm']]],\n  ['packed_5fmediump_5fivec1',['packed_mediump_ivec1',['../a00164.html#ga09507ef020a49517a7bcd50438f05056',1,'glm']]],\n  ['packed_5fmediump_5fivec2',['packed_mediump_ivec2',['../a00164.html#gaaa891048dddef4627df33809ec726219',1,'glm']]],\n  ['packed_5fmediump_5fivec3',['packed_mediump_ivec3',['../a00164.html#ga06f26d54dca30994eb1fdadb8e69f4a2',1,'glm']]],\n  ['packed_5fmediump_5fivec4',['packed_mediump_ivec4',['../a00164.html#ga70130dc8ed9c966ec2a221ce586d45d8',1,'glm']]],\n  ['packed_5fmediump_5fuvec1',['packed_mediump_uvec1',['../a00164.html#ga2c29fb42bab9a4f9b66bc60b2e514a34',1,'glm']]],\n  ['packed_5fmediump_5fuvec2',['packed_mediump_uvec2',['../a00164.html#gaa1f95690a78dc12e39da32943243aeef',1,'glm']]],\n  ['packed_5fmediump_5fuvec3',['packed_mediump_uvec3',['../a00164.html#ga1ea2bbdbcb0a69242f6d884663c1b0ab',1,'glm']]],\n  ['packed_5fmediump_5fuvec4',['packed_mediump_uvec4',['../a00164.html#ga63a73be86a4f07ea7a7499ab0bfebe45',1,'glm']]],\n  ['packed_5fmediump_5fvec1',['packed_mediump_vec1',['../a00164.html#ga71d63cead1e113fca0bcdaaa33aad050',1,'glm']]],\n  ['packed_5fmediump_5fvec2',['packed_mediump_vec2',['../a00164.html#ga6844c6f4691d1bf67673240850430948',1,'glm']]],\n  ['packed_5fmediump_5fvec3',['packed_mediump_vec3',['../a00164.html#gab0eb771b708c5b2205d9b14dd1434fd8',1,'glm']]],\n  ['packed_5fmediump_5fvec4',['packed_mediump_vec4',['../a00164.html#ga68c9bb24f387b312bae6a0a68e74d95e',1,'glm']]],\n  ['packed_5fuvec1',['packed_uvec1',['../a00164.html#ga5621493caac01bdd22ab6be4416b0314',1,'glm']]],\n  ['packed_5fuvec2',['packed_uvec2',['../a00164.html#gabcc33efb4d5e83b8fe4706360e75b932',1,'glm']]],\n  ['packed_5fuvec3',['packed_uvec3',['../a00164.html#gab96804e99e3a72a35740fec690c79617',1,'glm']]],\n  ['packed_5fuvec4',['packed_uvec4',['../a00164.html#ga8e5d92e84ebdbe2480cf96bc17d6e2f2',1,'glm']]],\n  ['packed_5fvec1',['packed_vec1',['../a00164.html#ga14741e3d9da9ae83765389927f837331',1,'glm']]],\n  ['packed_5fvec2',['packed_vec2',['../a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66',1,'glm']]],\n  ['packed_5fvec3',['packed_vec3',['../a00164.html#gaccccd090e185450caa28b5b63ad4e8f0',1,'glm']]],\n  ['packed_5fvec4',['packed_vec4',['../a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d',1,'glm']]],\n  ['packf2x11_5f1x10',['packF2x11_1x10',['../a00159.html#ga4944ad465ff950e926d49621f916c78d',1,'glm']]],\n  ['packf3x9_5fe1x5',['packF3x9_E1x5',['../a00159.html#ga3f648fc205467792dc6d8c59c748f8a6',1,'glm']]],\n  ['packhalf',['packHalf',['../a00159.html#ga2d8bbce673ebc04831c1fb05c47f5251',1,'glm']]],\n  ['packhalf1x16',['packHalf1x16',['../a00159.html#ga43f2093b6ff192a79058ff7834fc3528',1,'glm']]],\n  ['packhalf2x16',['packHalf2x16',['../a00231.html#ga20f134b07db3a3d3a38efb2617388c92',1,'glm']]],\n  ['packhalf4x16',['packHalf4x16',['../a00159.html#gafe2f7b39caf8f5ec555e1c059ec530e6',1,'glm']]],\n  ['packi3x10_5f1x2',['packI3x10_1x2',['../a00159.html#ga06ecb6afb902dba45419008171db9023',1,'glm']]],\n  ['packing_2ehpp',['packing.hpp',['../a00077.html',1,'']]],\n  ['packint2x16',['packInt2x16',['../a00159.html#ga3644163cf3a47bf1d4af1f4b03013a7e',1,'glm']]],\n  ['packint2x32',['packInt2x32',['../a00159.html#gad1e4c8a9e67d86b61a6eec86703a827a',1,'glm']]],\n  ['packint2x8',['packInt2x8',['../a00159.html#ga8884b1f2292414f36d59ef3be5d62914',1,'glm']]],\n  ['packint4x16',['packInt4x16',['../a00159.html#ga1989f093a27ae69cf9207145be48b3d7',1,'glm']]],\n  ['packint4x8',['packInt4x8',['../a00159.html#gaf2238401d5ce2aaade1a44ba19709072',1,'glm']]],\n  ['packrgbm',['packRGBM',['../a00159.html#ga0466daf4c90f76cc64b3f105ce727295',1,'glm']]],\n  ['packsnorm',['packSnorm',['../a00159.html#gaa54b5855a750d6aeb12c1c902f5939b8',1,'glm']]],\n  ['packsnorm1x16',['packSnorm1x16',['../a00159.html#gab22f8bcfdb5fc65af4701b25f143c1af',1,'glm']]],\n  ['packsnorm1x8',['packSnorm1x8',['../a00159.html#gae3592e0795e62aaa1865b3a10496a7a1',1,'glm']]],\n  ['packsnorm2x16',['packSnorm2x16',['../a00231.html#ga977ab172da5494e5ac63e952afacfbe2',1,'glm']]],\n  ['packsnorm2x8',['packSnorm2x8',['../a00159.html#ga6be3cfb2cce3702f03e91bbeb5286d7e',1,'glm']]],\n  ['packsnorm3x10_5f1x2',['packSnorm3x10_1x2',['../a00159.html#gab997545661877d2c7362a5084d3897d3',1,'glm']]],\n  ['packsnorm4x16',['packSnorm4x16',['../a00159.html#ga358943934d21da947d5bcc88c2ab7832',1,'glm']]],\n  ['packsnorm4x8',['packSnorm4x8',['../a00231.html#ga85e8f17627516445026ab7a9c2e3531a',1,'glm']]],\n  ['packu3x10_5f1x2',['packU3x10_1x2',['../a00159.html#gada3d88d59f0f458f9c51a9fd359a4bc0',1,'glm']]],\n  ['packuint2x16',['packUint2x16',['../a00159.html#ga5eecc9e8cbaf51ac6cf57501e670ee19',1,'glm']]],\n  ['packuint2x32',['packUint2x32',['../a00159.html#gaa864081097b86e83d8e4a4d79c382b22',1,'glm']]],\n  ['packuint2x8',['packUint2x8',['../a00159.html#ga3c3c9fb53ae7823b10fa083909357590',1,'glm']]],\n  ['packuint4x16',['packUint4x16',['../a00159.html#ga2ceb62cca347d8ace42ee90317a3f1f9',1,'glm']]],\n  ['packuint4x8',['packUint4x8',['../a00159.html#gaa0fe2f09aeb403cd66c1a062f58861ab',1,'glm']]],\n  ['packunorm',['packUnorm',['../a00159.html#gaccd3f27e6ba5163eb7aa9bc8ff96251a',1,'glm']]],\n  ['packunorm1x16',['packUnorm1x16',['../a00159.html#ga9f82737bf2a44bedff1d286b76837886',1,'glm']]],\n  ['packunorm1x5_5f1x6_5f1x5',['packUnorm1x5_1x6_1x5',['../a00159.html#ga768e0337dd6246773f14aa0a421fe9a8',1,'glm']]],\n  ['packunorm1x8',['packUnorm1x8',['../a00159.html#ga4b2fa60df3460403817d28b082ee0736',1,'glm']]],\n  ['packunorm2x16',['packUnorm2x16',['../a00231.html#ga0e2d107039fe608a209497af867b85fb',1,'glm']]],\n  ['packunorm2x3_5f1x2',['packUnorm2x3_1x2',['../a00159.html#ga7f9abdb50f9be1aa1c14912504a0d98d',1,'glm']]],\n  ['packunorm2x4',['packUnorm2x4',['../a00159.html#gab6bbd5be3b8e6db538ecb33a7844481c',1,'glm']]],\n  ['packunorm2x8',['packUnorm2x8',['../a00159.html#ga9a666b1c688ab54100061ed06526de6e',1,'glm']]],\n  ['packunorm3x10_5f1x2',['packUnorm3x10_1x2',['../a00159.html#ga8a1ee625d2707c60530fb3fca2980b19',1,'glm']]],\n  ['packunorm3x5_5f1x1',['packUnorm3x5_1x1',['../a00159.html#gaec4112086d7fb133bea104a7c237de52',1,'glm']]],\n  ['packunorm4x16',['packUnorm4x16',['../a00159.html#ga1f63c264e7ab63264e2b2a99fd393897',1,'glm']]],\n  ['packunorm4x4',['packUnorm4x4',['../a00159.html#gad3e7e3ce521513584a53aedc5f9765c1',1,'glm']]],\n  ['packunorm4x8',['packUnorm4x8',['../a00231.html#gaf7d2f7341a9eeb4a436929d6f9ad08f2',1,'glm']]],\n  ['perlin',['perlin',['../a00158.html#ga1e043ce3b51510e9bc4469227cefc38a',1,'glm::perlin(vec&lt; L, T, Q &gt; const &amp;p)'],['../a00158.html#gac270edc54c5fc52f5985a45f940bb103',1,'glm::perlin(vec&lt; L, T, Q &gt; const &amp;p, vec&lt; L, T, Q &gt; const &amp;rep)']]],\n  ['perp',['perp',['../a00209.html#ga264cfc4e180cf9b852e943b35089003c',1,'glm']]],\n  ['perpendicular_2ehpp',['perpendicular.hpp',['../a00079.html',1,'']]],\n  ['perspective',['perspective',['../a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787',1,'glm']]],\n  ['perspectivefov',['perspectiveFov',['../a00157.html#gaebd02240fd36e85ad754f02ddd9a560d',1,'glm']]],\n  ['perspectivefovlh',['perspectiveFovLH',['../a00157.html#ga6aebe16c164bd8e52554cbe0304ef4aa',1,'glm']]],\n  ['perspectivefovrh',['perspectiveFovRH',['../a00157.html#gaf32bf563f28379c68554a44ee60c6a85',1,'glm']]],\n  ['perspectivelh',['perspectiveLH',['../a00157.html#ga9bd34951dc7022ac256fcb51d7f6fc2f',1,'glm']]],\n  ['perspectiverh',['perspectiveRH',['../a00157.html#ga26b88757fbd90601b80768a7e1ad3aa1',1,'glm']]],\n  ['pi',['pi',['../a00151.html#ga94bafeb2a0f23ab6450fed1f98ee4e45',1,'glm']]],\n  ['pickmatrix',['pickMatrix',['../a00157.html#gaf6b21eadb7ac2ecbbe258a9a233b4c82',1,'glm']]],\n  ['pitch',['pitch',['../a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73',1,'glm']]],\n  ['polar',['polar',['../a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d',1,'glm']]],\n  ['polar_5fcoordinates_2ehpp',['polar_coordinates.hpp',['../a00080.html',1,'']]],\n  ['pow',['pow',['../a00141.html#ga2254981952d4f333b900a6bf5167a6c4',1,'glm::pow(vec&lt; L, T, Q &gt; const &amp;base, vec&lt; L, T, Q &gt; const &amp;exponent)'],['../a00190.html#ga465016030a81d513fa2fac881ebdaa83',1,'glm::pow(int x, uint y)'],['../a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0',1,'glm::pow(uint x, uint y)'],['../a00212.html#gad382fc37392d537aecf2245a4597d8a3',1,'glm::pow(tquat&lt; T, Q &gt; const &amp;x, T const &amp;y)']]],\n  ['pow2',['pow2',['../a00207.html#ga19aaff3213bf23bdec3ef124ace237e9',1,'glm::gtx']]],\n  ['pow3',['pow3',['../a00207.html#ga35689d03cd434d6ea819f1942d3bf82e',1,'glm::gtx']]],\n  ['pow4',['pow4',['../a00207.html#gacef0968763026e180e53e735007dbf5a',1,'glm::gtx']]],\n  ['poweroftwoabove',['powerOfTwoAbove',['../a00170.html#ga8cda2459871f574a0aecbe702ac93291',1,'glm::powerOfTwoAbove(genIUType Value)'],['../a00170.html#ga2bbded187c5febfefc1e524ba31b3fab',1,'glm::powerOfTwoAbove(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['poweroftwobelow',['powerOfTwoBelow',['../a00170.html#ga3de7df63c589325101a2817a56f8e29d',1,'glm::powerOfTwoBelow(genIUType Value)'],['../a00170.html#gaf78ddcc4152c051b2a21e68fecb10980',1,'glm::powerOfTwoBelow(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['poweroftwonearest',['powerOfTwoNearest',['../a00170.html#ga5f65973a5d2ea38c719e6a663149ead9',1,'glm::powerOfTwoNearest(genIUType Value)'],['../a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b',1,'glm::powerOfTwoNearest(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['prev_5ffloat',['prev_float',['../a00167.html#ga2fcbb7bfbfc595712bfddc51b0715b07',1,'glm::prev_float(genType const &amp;x)'],['../a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec',1,'glm::prev_float(genType const &amp;x, uint const &amp;Distance)']]],\n  ['proj',['proj',['../a00211.html#ga58384b7170801dd513de46f87c7fb00e',1,'glm']]],\n  ['proj2d',['proj2D',['../a00222.html#ga5b992a0cdc8298054edb68e228f0d93e',1,'glm']]],\n  ['proj3d',['proj3D',['../a00222.html#gaa2b7f4f15b98f697caede11bef50509e',1,'glm']]],\n  ['project',['project',['../a00157.html#gaf36e96033f456659e6705472a06b6e11',1,'glm']]],\n  ['projection_2ehpp',['projection.hpp',['../a00081.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/all_f.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"all_f.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/all_f.js",
    "content": "var searchData=\n[\n  ['qr_5fdecompose',['qr_decompose',['../a00196.html#gac62d7bfc8dc661e616620d70552cd566',1,'glm']]],\n  ['qualifier_2ehpp',['qualifier.hpp',['../a00082.html',1,'']]],\n  ['quarter_5fpi',['quarter_pi',['../a00151.html#ga3c9df42bd73c519a995c43f0f99e77e0',1,'glm']]],\n  ['quat_5fcast',['quat_cast',['../a00160.html#ga03e023aec9acd561a28594bbc8a3abf6',1,'glm::quat_cast(mat&lt; 3, 3, T, Q &gt; const &amp;x)'],['../a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60',1,'glm::quat_cast(mat&lt; 4, 4, T, Q &gt; const &amp;x)']]],\n  ['quat_5fidentity',['quat_identity',['../a00212.html#ga40788ce1d74fac29fa000af893a3ceb5',1,'glm']]],\n  ['quatlookat',['quatLookAt',['../a00212.html#ga668d9ec9964ced2b455d416677e1e8b9',1,'glm']]],\n  ['quatlookatlh',['quatLookAtLH',['../a00212.html#ga6f1b3fba52fcab952d0ab523177ff443',1,'glm']]],\n  ['quatlookatrh',['quatLookAtRH',['../a00212.html#gad30cbeb78315773b6d18d9d1c1c75b77',1,'glm']]],\n  ['qword',['qword',['../a00214.html#ga4021754ffb8e5ef14c75802b15657714',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_0.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_0.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_0.js",
    "content": "var searchData=\n[\n  ['_5ffeatures_2ehpp',['_features.hpp',['../a00001.html',1,'']]],\n  ['_5ffixes_2ehpp',['_fixes.hpp',['../a00002.html',1,'']]],\n  ['_5fnoise_2ehpp',['_noise.hpp',['../a00003.html',1,'']]],\n  ['_5fswizzle_2ehpp',['_swizzle.hpp',['../a00004.html',1,'']]],\n  ['_5fswizzle_5ffunc_2ehpp',['_swizzle_func.hpp',['../a00005.html',1,'']]],\n  ['_5fvectorize_2ehpp',['_vectorize.hpp',['../a00006.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_1.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_1.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_1.js",
    "content": "var searchData=\n[\n  ['associated_5fmin_5fmax_2ehpp',['associated_min_max.hpp',['../a00007.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_10.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_10.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_10.js",
    "content": "var searchData=\n[\n  ['random_2ehpp',['random.hpp',['../a00085.html',1,'']]],\n  ['range_2ehpp',['range.hpp',['../a00086.html',1,'']]],\n  ['raw_5fdata_2ehpp',['raw_data.hpp',['../a00087.html',1,'']]],\n  ['reciprocal_2ehpp',['reciprocal.hpp',['../a00088.html',1,'']]],\n  ['rotate_5fnormalized_5faxis_2ehpp',['rotate_normalized_axis.hpp',['../a00089.html',1,'']]],\n  ['rotate_5fvector_2ehpp',['rotate_vector.hpp',['../a00090.html',1,'']]],\n  ['round_2ehpp',['round.hpp',['../a00091.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_11.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_11.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_11.js",
    "content": "var searchData=\n[\n  ['scalar_5fmultiplication_2ehpp',['scalar_multiplication.hpp',['../a00092.html',1,'']]],\n  ['scalar_5frelational_2ehpp',['scalar_relational.hpp',['../a00093.html',1,'']]],\n  ['setup_2ehpp',['setup.hpp',['../a00094.html',1,'']]],\n  ['spline_2ehpp',['spline.hpp',['../a00095.html',1,'']]],\n  ['std_5fbased_5ftype_2ehpp',['std_based_type.hpp',['../a00096.html',1,'']]],\n  ['string_5fcast_2ehpp',['string_cast.hpp',['../a00097.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_12.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_12.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_12.js",
    "content": "var searchData=\n[\n  ['transform_2ehpp',['transform.hpp',['../a00098.html',1,'']]],\n  ['transform2_2ehpp',['transform2.hpp',['../a00099.html',1,'']]],\n  ['trigonometric_2ehpp',['trigonometric.hpp',['../a00100.html',1,'']]],\n  ['type_5ffloat_2ehpp',['type_float.hpp',['../a00103.html',1,'']]],\n  ['type_5fgentype_2ehpp',['type_gentype.hpp',['../a00104.html',1,'']]],\n  ['type_5fhalf_2ehpp',['type_half.hpp',['../a00105.html',1,'']]],\n  ['type_5fint_2ehpp',['type_int.hpp',['../a00106.html',1,'']]],\n  ['type_5fmat_2ehpp',['type_mat.hpp',['../a00107.html',1,'']]],\n  ['type_5fmat2x2_2ehpp',['type_mat2x2.hpp',['../a00108.html',1,'']]],\n  ['type_5fmat2x3_2ehpp',['type_mat2x3.hpp',['../a00109.html',1,'']]],\n  ['type_5fmat2x4_2ehpp',['type_mat2x4.hpp',['../a00110.html',1,'']]],\n  ['type_5fmat3x2_2ehpp',['type_mat3x2.hpp',['../a00111.html',1,'']]],\n  ['type_5fmat3x3_2ehpp',['type_mat3x3.hpp',['../a00112.html',1,'']]],\n  ['type_5fmat3x4_2ehpp',['type_mat3x4.hpp',['../a00113.html',1,'']]],\n  ['type_5fmat4x2_2ehpp',['type_mat4x2.hpp',['../a00114.html',1,'']]],\n  ['type_5fmat4x3_2ehpp',['type_mat4x3.hpp',['../a00115.html',1,'']]],\n  ['type_5fmat4x4_2ehpp',['type_mat4x4.hpp',['../a00116.html',1,'']]],\n  ['type_5fprecision_2ehpp',['type_precision.hpp',['../a00117.html',1,'']]],\n  ['type_5fptr_2ehpp',['type_ptr.hpp',['../a00118.html',1,'']]],\n  ['type_5ftrait_2ehpp',['type_trait.hpp',['../a00119.html',1,'']]],\n  ['type_5fvec_2ehpp',['type_vec.hpp',['../a00120.html',1,'']]],\n  ['type_5fvec1_2ehpp',['type_vec1.hpp',['../a00121.html',1,'']]],\n  ['type_5fvec2_2ehpp',['type_vec2.hpp',['../a00122.html',1,'']]],\n  ['type_5fvec3_2ehpp',['type_vec3.hpp',['../a00123.html',1,'']]],\n  ['type_5fvec4_2ehpp',['type_vec4.hpp',['../a00124.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_13.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_13.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_13.js",
    "content": "var searchData=\n[\n  ['ulp_2ehpp',['ulp.hpp',['../a00125.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_14.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_14.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_14.js",
    "content": "var searchData=\n[\n  ['vec1_2ehpp',['vec1.hpp',['../a00126.html',1,'']]],\n  ['vec2_2ehpp',['vec2.hpp',['../a00127.html',1,'']]],\n  ['vec3_2ehpp',['vec3.hpp',['../a00128.html',1,'']]],\n  ['vec4_2ehpp',['vec4.hpp',['../a00129.html',1,'']]],\n  ['vec_5fswizzle_2ehpp',['vec_swizzle.hpp',['../a00130.html',1,'']]],\n  ['vector_5fangle_2ehpp',['vector_angle.hpp',['../a00131.html',1,'']]],\n  ['vector_5fquery_2ehpp',['vector_query.hpp',['../a00132.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_15.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_15.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_15.js",
    "content": "var searchData=\n[\n  ['wrap_2ehpp',['wrap.hpp',['../a00134.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_2.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_2.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_2.js",
    "content": "var searchData=\n[\n  ['bit_2ehpp',['bit.hpp',['../a00008.html',1,'']]],\n  ['bitfield_2ehpp',['bitfield.hpp',['../a00009.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_3.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_3.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_3.js",
    "content": "var searchData=\n[\n  ['closest_5fpoint_2ehpp',['closest_point.hpp',['../a00010.html',1,'']]],\n  ['color_5fencoding_2ehpp',['color_encoding.hpp',['../a00011.html',1,'']]],\n  ['color_5fspace_5fycocg_2ehpp',['color_space_YCoCg.hpp',['../a00014.html',1,'']]],\n  ['common_2ehpp',['common.hpp',['../a00015.html',1,'']]],\n  ['compatibility_2ehpp',['compatibility.hpp',['../a00017.html',1,'']]],\n  ['component_5fwise_2ehpp',['component_wise.hpp',['../a00018.html',1,'']]],\n  ['constants_2ehpp',['constants.hpp',['../a00020.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_4.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_4.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_4.js",
    "content": "var searchData=\n[\n  ['dual_5fquaternion_2ehpp',['dual_quaternion.hpp',['../a00021.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_5.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_5.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_5.js",
    "content": "var searchData=\n[\n  ['epsilon_2ehpp',['epsilon.hpp',['../a00022.html',1,'']]],\n  ['euler_5fangles_2ehpp',['euler_angles.hpp',['../a00023.html',1,'']]],\n  ['exponential_2ehpp',['exponential.hpp',['../a00024.html',1,'']]],\n  ['ext_2ehpp',['ext.hpp',['../a00025.html',1,'']]],\n  ['extend_2ehpp',['extend.hpp',['../a00026.html',1,'']]],\n  ['extended_5fmin_5fmax_2ehpp',['extended_min_max.hpp',['../a00027.html',1,'']]],\n  ['exterior_5fproduct_2ehpp',['exterior_product.hpp',['../a00028.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_6.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_6.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_6.js",
    "content": "var searchData=\n[\n  ['fast_5fexponential_2ehpp',['fast_exponential.hpp',['../a00029.html',1,'']]],\n  ['fast_5fsquare_5froot_2ehpp',['fast_square_root.hpp',['../a00030.html',1,'']]],\n  ['fast_5ftrigonometry_2ehpp',['fast_trigonometry.hpp',['../a00031.html',1,'']]],\n  ['functions_2ehpp',['functions.hpp',['../a00032.html',1,'']]],\n  ['fwd_2ehpp',['fwd.hpp',['../a00033.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_7.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_7.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_7.js",
    "content": "var searchData=\n[\n  ['color_5fspace_2ehpp',['color_space.hpp',['../a00012.html',1,'']]],\n  ['color_5fspace_2ehpp',['color_space.hpp',['../a00013.html',1,'']]],\n  ['common_2ehpp',['common.hpp',['../a00016.html',1,'']]],\n  ['geometric_2ehpp',['geometric.hpp',['../a00034.html',1,'']]],\n  ['glm_2ehpp',['glm.hpp',['../a00035.html',1,'']]],\n  ['gradient_5fpaint_2ehpp',['gradient_paint.hpp',['../a00036.html',1,'']]],\n  ['integer_2ehpp',['integer.hpp',['../a00040.html',1,'']]],\n  ['integer_2ehpp',['integer.hpp',['../a00039.html',1,'']]],\n  ['packing_2ehpp',['packing.hpp',['../a00076.html',1,'']]],\n  ['quaternion_2ehpp',['quaternion.hpp',['../a00084.html',1,'']]],\n  ['quaternion_2ehpp',['quaternion.hpp',['../a00083.html',1,'']]],\n  ['type_5faligned_2ehpp',['type_aligned.hpp',['../a00102.html',1,'']]],\n  ['type_5faligned_2ehpp',['type_aligned.hpp',['../a00101.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_8.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_8.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_8.js",
    "content": "var searchData=\n[\n  ['handed_5fcoordinate_5fspace_2ehpp',['handed_coordinate_space.hpp',['../a00037.html',1,'']]],\n  ['hash_2ehpp',['hash.hpp',['../a00038.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_9.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_9.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_9.js",
    "content": "var searchData=\n[\n  ['integer_2ehpp',['integer.hpp',['../a00041.html',1,'']]],\n  ['intersect_2ehpp',['intersect.hpp',['../a00042.html',1,'']]],\n  ['io_2ehpp',['io.hpp',['../a00043.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_a.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_a.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_a.js",
    "content": "var searchData=\n[\n  ['log_5fbase_2ehpp',['log_base.hpp',['../a00044.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_b.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_b.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_b.js",
    "content": "var searchData=\n[\n  ['mat2x2_2ehpp',['mat2x2.hpp',['../a00046.html',1,'']]],\n  ['mat2x3_2ehpp',['mat2x3.hpp',['../a00047.html',1,'']]],\n  ['mat2x4_2ehpp',['mat2x4.hpp',['../a00048.html',1,'']]],\n  ['mat3x2_2ehpp',['mat3x2.hpp',['../a00049.html',1,'']]],\n  ['mat3x3_2ehpp',['mat3x3.hpp',['../a00050.html',1,'']]],\n  ['mat3x4_2ehpp',['mat3x4.hpp',['../a00051.html',1,'']]],\n  ['mat4x2_2ehpp',['mat4x2.hpp',['../a00052.html',1,'']]],\n  ['mat4x3_2ehpp',['mat4x3.hpp',['../a00053.html',1,'']]],\n  ['mat4x4_2ehpp',['mat4x4.hpp',['../a00054.html',1,'']]],\n  ['matrix_2ehpp',['matrix.hpp',['../a00055.html',1,'']]],\n  ['matrix_5faccess_2ehpp',['matrix_access.hpp',['../a00056.html',1,'']]],\n  ['matrix_5fcross_5fproduct_2ehpp',['matrix_cross_product.hpp',['../a00057.html',1,'']]],\n  ['matrix_5fdecompose_2ehpp',['matrix_decompose.hpp',['../a00058.html',1,'']]],\n  ['matrix_5ffactorisation_2ehpp',['matrix_factorisation.hpp',['../a00059.html',1,'']]],\n  ['matrix_5finteger_2ehpp',['matrix_integer.hpp',['../a00060.html',1,'']]],\n  ['matrix_5finterpolation_2ehpp',['matrix_interpolation.hpp',['../a00061.html',1,'']]],\n  ['matrix_5finverse_2ehpp',['matrix_inverse.hpp',['../a00062.html',1,'']]],\n  ['matrix_5fmajor_5fstorage_2ehpp',['matrix_major_storage.hpp',['../a00063.html',1,'']]],\n  ['matrix_5foperation_2ehpp',['matrix_operation.hpp',['../a00064.html',1,'']]],\n  ['matrix_5fquery_2ehpp',['matrix_query.hpp',['../a00065.html',1,'']]],\n  ['matrix_5ftransform_2ehpp',['matrix_transform.hpp',['../a00066.html',1,'']]],\n  ['matrix_5ftransform_5f2d_2ehpp',['matrix_transform_2d.hpp',['../a00067.html',1,'']]],\n  ['mixed_5fproduct_2ehpp',['mixed_product.hpp',['../a00068.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_c.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_c.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_c.js",
    "content": "var searchData=\n[\n  ['noise_2ehpp',['noise.hpp',['../a00069.html',1,'']]],\n  ['norm_2ehpp',['norm.hpp',['../a00070.html',1,'']]],\n  ['normal_2ehpp',['normal.hpp',['../a00071.html',1,'']]],\n  ['normalize_5fdot_2ehpp',['normalize_dot.hpp',['../a00072.html',1,'']]],\n  ['number_5fprecision_2ehpp',['number_precision.hpp',['../a00073.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_d.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_d.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_d.js",
    "content": "var searchData=\n[\n  ['optimum_5fpow_2ehpp',['optimum_pow.hpp',['../a00074.html',1,'']]],\n  ['orthonormalize_2ehpp',['orthonormalize.hpp',['../a00075.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_e.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_e.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_e.js",
    "content": "var searchData=\n[\n  ['packing_2ehpp',['packing.hpp',['../a00077.html',1,'']]],\n  ['perpendicular_2ehpp',['perpendicular.hpp',['../a00079.html',1,'']]],\n  ['polar_5fcoordinates_2ehpp',['polar_coordinates.hpp',['../a00080.html',1,'']]],\n  ['projection_2ehpp',['projection.hpp',['../a00081.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/files_f.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"files_f.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/files_f.js",
    "content": "var searchData=\n[\n  ['qualifier_2ehpp',['qualifier.hpp',['../a00082.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_0.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_0.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_0.js",
    "content": "var searchData=\n[\n  ['abs',['abs',['../a00140.html#ga693d77696ff36572a0da79efec965acd',1,'glm::abs(genType x)'],['../a00140.html#ga3e141c9738c73d3e581efa471dba8b4c',1,'glm::abs(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['acos',['acos',['../a00232.html#gacc9b092df8257c68f19c9053703e2563',1,'glm']]],\n  ['acosh',['acosh',['../a00232.html#ga858f35dc66fd2688f20c52b5f25be76a',1,'glm']]],\n  ['acot',['acot',['../a00162.html#gaeadfb9c9d71093f7865b2ba2ca8d104d',1,'glm']]],\n  ['acoth',['acoth',['../a00162.html#gafaca98a7100170db8841f446282debfa',1,'glm']]],\n  ['acsc',['acsc',['../a00162.html#ga1b4bed91476b9b915e76b4a30236d330',1,'glm']]],\n  ['acsch',['acsch',['../a00162.html#ga4b50aa5e5afc7e19ec113ab91596c576',1,'glm']]],\n  ['affineinverse',['affineInverse',['../a00156.html#gae0fcc5fc8783291f9702272de428fa0e',1,'glm']]],\n  ['all',['all',['../a00233.html#gab5af106b2d5675d51af84815d937384d',1,'glm']]],\n  ['angle',['angle',['../a00160.html#gaaee6c856cae3217d274a240238cb6373',1,'glm::angle(tquat&lt; T, Q &gt; const &amp;x)'],['../a00226.html#ga2e2917b4cb75ca3d043ac15ff88f14e1',1,'glm::angle(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['angleaxis',['angleAxis',['../a00160.html#ga93856b8bfcdd5b9a164248df3149476c',1,'glm']]],\n  ['any',['any',['../a00233.html#gadcc289349a96ef7642b14bc151ee4ae8',1,'glm']]],\n  ['arecollinear',['areCollinear',['../a00227.html#ga13da4a787a2ff70e95d561fb19ff91b4',1,'glm']]],\n  ['areorthogonal',['areOrthogonal',['../a00227.html#gac7b95b3f798e3c293262b2bdaad47c57',1,'glm']]],\n  ['areorthonormal',['areOrthonormal',['../a00227.html#ga1b091c3d7f9ee3b0708311c001c293e3',1,'glm']]],\n  ['asec',['asec',['../a00162.html#ga2c5b7f962c2c9ff684e6d2de48db1f10',1,'glm']]],\n  ['asech',['asech',['../a00162.html#gaec7586dccfe431f850d006f3824b8ca6',1,'glm']]],\n  ['asin',['asin',['../a00232.html#ga0552d2df4865fa8c3d7cfc3ec2caac73',1,'glm']]],\n  ['asinh',['asinh',['../a00232.html#ga3ef16b501ee859fddde88e22192a5950',1,'glm']]],\n  ['associatedmax',['associatedMax',['../a00169.html#ga7d9c8785230c8db60f72ec8975f1ba45',1,'glm::associatedMax(T x, U a, T y, U b)'],['../a00169.html#ga5c6758bc50aa7fbe700f87123a045aad',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b)'],['../a00169.html#ga0d169d6ce26b03248df175f39005d77f',1,'glm::associatedMax(T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b)'],['../a00169.html#ga4086269afabcb81dd7ded33cb3448653',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b)'],['../a00169.html#gaec891e363d91abbf3a4443cf2f652209',1,'glm::associatedMax(T x, U a, T y, U b, T z, U c)'],['../a00169.html#gab84fdc35016a31e8cd0cbb8296bddf7c',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c)'],['../a00169.html#gadd2a2002f4f2144bbc39eb2336dd2fba',1,'glm::associatedMax(T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c)'],['../a00169.html#ga19f59d1141a51a3b2108a9807af78f7f',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c)'],['../a00169.html#ga3038ffcb43eaa6af75897a99a5047ccc',1,'glm::associatedMax(T x, U a, T y, U b, T z, U c, T w, U d)'],['../a00169.html#gaf5ab0c428f8d1cd9e3b45fcfbf6423a6',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c, vec&lt; L, T, Q &gt; const &amp;w, vec&lt; L, U, Q &gt; const &amp;d)'],['../a00169.html#ga11477c2c4b5b0bfd1b72b29df3725a9d',1,'glm::associatedMax(T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c, T w, vec&lt; L, U, Q &gt; const &amp;d)'],['../a00169.html#gab9c3dd74cac899d2c625b5767ea3b3fb',1,'glm::associatedMax(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)']]],\n  ['associatedmin',['associatedMin',['../a00169.html#gacc01bd272359572fc28437ae214a02df',1,'glm::associatedMin(T x, U a, T y, U b)'],['../a00169.html#gac2f0dff90948f2e44386a5eafd941d1c',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b)'],['../a00169.html#gacfec519c820331d023ef53a511749319',1,'glm::associatedMin(T x, const vec&lt; L, U, Q &gt; &amp;a, T y, const vec&lt; L, U, Q &gt; &amp;b)'],['../a00169.html#ga4757c7cab2d809124a8525d0a9deeb37',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b)'],['../a00169.html#gad0aa8f86259a26d839d34a3577a923fc',1,'glm::associatedMin(T x, U a, T y, U b, T z, U c)'],['../a00169.html#ga723e5411cebc7ffbd5c81ffeec61127d',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c)'],['../a00169.html#ga432224ebe2085eaa2b63a077ecbbbff6',1,'glm::associatedMin(T x, U a, T y, U b, T z, U c, T w, U d)'],['../a00169.html#ga66b08118bc88f0494bcacb7cdb940556',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, U, Q &gt; const &amp;a, vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, U, Q &gt; const &amp;b, vec&lt; L, T, Q &gt; const &amp;z, vec&lt; L, U, Q &gt; const &amp;c, vec&lt; L, T, Q &gt; const &amp;w, vec&lt; L, U, Q &gt; const &amp;d)'],['../a00169.html#ga78c28fde1a7080fb7420bd88e68c6c68',1,'glm::associatedMin(T x, vec&lt; L, U, Q &gt; const &amp;a, T y, vec&lt; L, U, Q &gt; const &amp;b, T z, vec&lt; L, U, Q &gt; const &amp;c, T w, vec&lt; L, U, Q &gt; const &amp;d)'],['../a00169.html#ga2db7e351994baee78540a562d4bb6d3b',1,'glm::associatedMin(vec&lt; L, T, Q &gt; const &amp;x, U a, vec&lt; L, T, Q &gt; const &amp;y, U b, vec&lt; L, T, Q &gt; const &amp;z, U c, vec&lt; L, T, Q &gt; const &amp;w, U d)']]],\n  ['atan',['atan',['../a00232.html#gac61629f3a4aa14057e7a8cae002291db',1,'glm::atan(vec&lt; L, T, Q &gt; const &amp;y, vec&lt; L, T, Q &gt; const &amp;x)'],['../a00232.html#ga5229f087eaccbc466f1c609ce3107b95',1,'glm::atan(vec&lt; L, T, Q &gt; const &amp;y_over_x)']]],\n  ['atan2',['atan2',['../a00176.html#gac63011205bf6d0be82589dc56dd26708',1,'glm::atan2(T x, T y)'],['../a00176.html#ga83bc41bd6f89113ee8006576b12bfc50',1,'glm::atan2(const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y)'],['../a00176.html#gac39314f5087e7e51e592897cabbc1927',1,'glm::atan2(const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y)'],['../a00176.html#gaba86c28da7bf5bdac64fecf7d56e8ff3',1,'glm::atan2(const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y)']]],\n  ['atanh',['atanh',['../a00232.html#gabc925650e618357d07da255531658b87',1,'glm']]],\n  ['axis',['axis',['../a00160.html#gaaf2707d3081789ce097daaa6e54d5287',1,'glm']]],\n  ['axisangle',['axisAngle',['../a00197.html#ga97f160158906ea89676f56cc4697ec98',1,'glm']]],\n  ['axisanglematrix',['axisAngleMatrix',['../a00197.html#ga992a5db71893ed1ba6ebac99f0f69831',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_1.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_1.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_1.js",
    "content": "var searchData=\n[\n  ['ballrand',['ballRand',['../a00161.html#ga7c53b7797f3147af68a11c767679fa3f',1,'glm']]],\n  ['bitcount',['bitCount',['../a00229.html#ga44abfe3379e11cbd29425a843420d0d6',1,'glm::bitCount(genType v)'],['../a00229.html#gaac7b15e40bdea8d9aa4c4cb34049f7b5',1,'glm::bitCount(vec&lt; L, T, Q &gt; const &amp;v)']]],\n  ['bitfieldextract',['bitfieldExtract',['../a00229.html#ga346b25ab11e793e91a4a69c8aa6819f2',1,'glm']]],\n  ['bitfieldfillone',['bitfieldFillOne',['../a00149.html#ga46f9295abe3b5c7658f5b13c7f819f0a',1,'glm::bitfieldFillOne(genIUType Value, int FirstBit, int BitCount)'],['../a00149.html#ga3e96dd1f0a4bc892f063251ed118c0c1',1,'glm::bitfieldFillOne(vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)']]],\n  ['bitfieldfillzero',['bitfieldFillZero',['../a00149.html#ga697b86998b7d74ee0a69d8e9f8819fee',1,'glm::bitfieldFillZero(genIUType Value, int FirstBit, int BitCount)'],['../a00149.html#ga0d16c9acef4be79ea9b47c082a0cf7c2',1,'glm::bitfieldFillZero(vec&lt; L, T, Q &gt; const &amp;Value, int FirstBit, int BitCount)']]],\n  ['bitfieldinsert',['bitfieldInsert',['../a00229.html#ga2e82992340d421fadb61a473df699b20',1,'glm']]],\n  ['bitfieldinterleave',['bitfieldInterleave',['../a00149.html#ga24cad0069f9a0450abd80b3e89501adf',1,'glm::bitfieldInterleave(int8 x, int8 y)'],['../a00149.html#ga9a4976a529aec2cee56525e1165da484',1,'glm::bitfieldInterleave(uint8 x, uint8 y)'],['../a00149.html#gac51c33a394593f0631fa3aa5bb778809',1,'glm::bitfieldInterleave(int16 x, int16 y)'],['../a00149.html#ga94f3646a5667f4be56f8dcf3310e963f',1,'glm::bitfieldInterleave(uint16 x, uint16 y)'],['../a00149.html#gaebb756a24a0784e3d6fba8bd011ab77a',1,'glm::bitfieldInterleave(int32 x, int32 y)'],['../a00149.html#ga2f1e2b3fe699e7d897ae38b2115ddcbd',1,'glm::bitfieldInterleave(uint32 x, uint32 y)'],['../a00149.html#ga8fdb724dccd4a07d57efc01147102137',1,'glm::bitfieldInterleave(int8 x, int8 y, int8 z)'],['../a00149.html#ga9fc2a0dd5dcf8b00e113f272a5feca93',1,'glm::bitfieldInterleave(uint8 x, uint8 y, uint8 z)'],['../a00149.html#gaa901c36a842fa5d126ea650549f17b24',1,'glm::bitfieldInterleave(int16 x, int16 y, int16 z)'],['../a00149.html#ga3afd6d38881fe3948c53d4214d2197fd',1,'glm::bitfieldInterleave(uint16 x, uint16 y, uint16 z)'],['../a00149.html#gad2075d96a6640121edaa98ea534102ca',1,'glm::bitfieldInterleave(int32 x, int32 y, int32 z)'],['../a00149.html#gab19fbc739fc0cf7247978602c36f7da8',1,'glm::bitfieldInterleave(uint32 x, uint32 y, uint32 z)'],['../a00149.html#ga8a44ae22f5c953b296c42d067dccbe6d',1,'glm::bitfieldInterleave(int8 x, int8 y, int8 z, int8 w)'],['../a00149.html#ga14bb274d54a3c26f4919dd7ed0dd0c36',1,'glm::bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w)'],['../a00149.html#ga180a63161e1319fbd5a53c84d0429c7a',1,'glm::bitfieldInterleave(int16 x, int16 y, int16 z, int16 w)'],['../a00149.html#gafca8768671a14c8016facccb66a89f26',1,'glm::bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w)']]],\n  ['bitfieldreverse',['bitfieldReverse',['../a00229.html#ga750a1d92464489b7711dee67aa3441b6',1,'glm']]],\n  ['bitfieldrotateleft',['bitfieldRotateLeft',['../a00149.html#ga2eb49678a344ce1495bdb5586d9896b9',1,'glm::bitfieldRotateLeft(genIUType In, int Shift)'],['../a00149.html#gae186317091b1a39214ebf79008d44a1e',1,'glm::bitfieldRotateLeft(vec&lt; L, T, Q &gt; const &amp;In, int Shift)']]],\n  ['bitfieldrotateright',['bitfieldRotateRight',['../a00149.html#ga1c33d075c5fb8bd8dbfd5092bfc851ca',1,'glm::bitfieldRotateRight(genIUType In, int Shift)'],['../a00149.html#ga590488e1fc00a6cfe5d3bcaf93fbfe88',1,'glm::bitfieldRotateRight(vec&lt; L, T, Q &gt; const &amp;In, int Shift)']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_10.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_10.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_10.js",
    "content": "var searchData=\n[\n  ['saturate',['saturate',['../a00176.html#ga0fd09e616d122bc2ed9726682ffd44b7',1,'glm::saturate(T x)'],['../a00176.html#gaee97b8001c794a78a44f5d59f62a8aba',1,'glm::saturate(const vec&lt; 2, T, Q &gt; &amp;x)'],['../a00176.html#ga39bfe3a421286ee31680d45c31ccc161',1,'glm::saturate(const vec&lt; 3, T, Q &gt; &amp;x)'],['../a00176.html#ga356f8c3a7e7d6376d3d4b0a026407183',1,'glm::saturate(const vec&lt; 4, T, Q &gt; &amp;x)']]],\n  ['saturation',['saturation',['../a00173.html#ga01a97152b44e1550edcac60bd849e884',1,'glm::saturation(T const s)'],['../a00173.html#ga2156cea600e90148ece5bc96fd6db43a',1,'glm::saturation(T const s, vec&lt; 3, T, Q &gt; const &amp;color)'],['../a00173.html#gaba0eacee0736dae860e9371cc1ae4785',1,'glm::saturation(T const s, vec&lt; 4, T, Q &gt; const &amp;color)']]],\n  ['scale',['scale',['../a00157.html#ga05051adbee603fb3c5095d8cf5cc229b',1,'glm::scale(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)'],['../a00201.html#gadb47d2ad2bd984b213e8ff7d9cd8154e',1,'glm::scale(mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)'],['../a00221.html#gafbeefee8fec884d566e4ada0049174d7',1,'glm::scale(vec&lt; 3, T, Q &gt; const &amp;v)']]],\n  ['scalebias',['scaleBias',['../a00222.html#gabf249498b236e62c983d90d30d63c99c',1,'glm::scaleBias(T scale, T bias)'],['../a00222.html#gae2bdd91a76759fecfbaef97e3020aa8e',1,'glm::scaleBias(mat&lt; 4, 4, T, Q &gt; const &amp;m, T scale, T bias)']]],\n  ['sec',['sec',['../a00162.html#gae4bcbebee670c5ea155f0777b3acbd84',1,'glm']]],\n  ['sech',['sech',['../a00162.html#ga9a5cfd1e7170104a7b33863b1b75e5ae',1,'glm']]],\n  ['shearx',['shearX',['../a00201.html#ga2a118ece5db1e2022112b954846012af',1,'glm']]],\n  ['shearx2d',['shearX2D',['../a00222.html#gabf714b8a358181572b32a45555f71948',1,'glm']]],\n  ['shearx3d',['shearX3D',['../a00222.html#ga73e867c6cd4d700fe2054437e56106c4',1,'glm']]],\n  ['sheary',['shearY',['../a00201.html#ga717f1833369c1ac4a40e4ac015af885e',1,'glm']]],\n  ['sheary2d',['shearY2D',['../a00222.html#gac7998d0763d9181550c77e8af09a182c',1,'glm']]],\n  ['sheary3d',['shearY3D',['../a00222.html#gade5bb65ffcb513973db1a1314fb5cfac',1,'glm']]],\n  ['shearz3d',['shearZ3D',['../a00222.html#ga6591e0a3a9d2c9c0b6577bb4dace0255',1,'glm']]],\n  ['shortmix',['shortMix',['../a00212.html#gaf0ad63ac791b1f9a587e363837c2d538',1,'glm']]],\n  ['sign',['sign',['../a00140.html#ga1e2e5cfff800056540e32f6c9b604b28',1,'glm::sign(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00193.html#ga04ef803a24f3d4f8c67dbccb33b0fce0',1,'glm::sign(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;base)']]],\n  ['simplex',['simplex',['../a00158.html#ga8122468c69015ff397349a7dcc638b27',1,'glm']]],\n  ['sin',['sin',['../a00232.html#ga29747fd108cb7292ae5a284f69691a69',1,'glm']]],\n  ['sinh',['sinh',['../a00232.html#gac7c39ff21809e281552b4dbe46f4a39d',1,'glm']]],\n  ['slerp',['slerp',['../a00160.html#ga3796542dac06014d541d67ebd5f2a88a',1,'glm::slerp(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)'],['../a00216.html#ga8b11b18ce824174ea1a5a69ea14e2cee',1,'glm::slerp(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, T const &amp;a)']]],\n  ['smoothstep',['smoothstep',['../a00140.html#ga562edf7eca082cc5b7a0aaf180436daf',1,'glm']]],\n  ['sphericalrand',['sphericalRand',['../a00161.html#ga22f90fcaccdf001c516ca90f6428e138',1,'glm']]],\n  ['sqrt',['sqrt',['../a00141.html#gaa83e5f1648b7ccdf33b87c07c76cb77c',1,'glm::sqrt(vec&lt; L, T, Q &gt; const &amp;v)'],['../a00190.html#ga7ce36693a75879ccd9bb10167cfa722d',1,'glm::sqrt(int x)'],['../a00190.html#ga1975d318978d6dacf78b6444fa5ed7bc',1,'glm::sqrt(uint x)']]],\n  ['squad',['squad',['../a00212.html#gacfcb16619e166e672c4672aff50a565c',1,'glm']]],\n  ['step',['step',['../a00140.html#ga015a1261ff23e12650211aa872863cce',1,'glm::step(genType edge, genType x)'],['../a00140.html#ga8f9a911a48ef244b51654eaefc81c551',1,'glm::step(T edge, vec&lt; L, T, Q &gt; const &amp;x)'],['../a00140.html#gaf4a5fc81619c7d3e8b22f53d4a098c7f',1,'glm::step(vec&lt; L, T, Q &gt; const &amp;edge, vec&lt; L, T, Q &gt; const &amp;x)']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_11.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_11.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_11.js",
    "content": "var searchData=\n[\n  ['tan',['tan',['../a00232.html#ga293a34cfb9f0115cc606b4a97c84f11f',1,'glm']]],\n  ['tanh',['tanh',['../a00232.html#gaa1bccbfdcbe40ed2ffcddc2aa8bfd0f1',1,'glm']]],\n  ['third',['third',['../a00151.html#ga3077c6311010a214b69ddc8214ec13b5',1,'glm']]],\n  ['three_5fover_5ftwo_5fpi',['three_over_two_pi',['../a00151.html#gae94950df74b0ce382b1fc1d978ef7394',1,'glm']]],\n  ['to_5fstring',['to_string',['../a00220.html#ga8f0dced1fd45e67e2d77e80ab93c7af5',1,'glm']]],\n  ['tomat3',['toMat3',['../a00212.html#ga433955cb703d982427fb53b540d02f3d',1,'glm']]],\n  ['tomat4',['toMat4',['../a00212.html#ga1fa0fb798c2715148e2e0358442bf895',1,'glm']]],\n  ['toquat',['toQuat',['../a00212.html#gae9be791077b7a612d9092a922bd13f86',1,'glm::toQuat(mat&lt; 3, 3, T, Q &gt; const &amp;x)'],['../a00212.html#ga6c0a178ac9c7d23e1a6848045d83aa54',1,'glm::toQuat(mat&lt; 4, 4, T, Q &gt; const &amp;x)']]],\n  ['translate',['translate',['../a00157.html#ga1a4ecc4ad82652b8fb14dcb087879284',1,'glm::translate(mat&lt; 4, 4, T, Q &gt; const &amp;m, vec&lt; 3, T, Q &gt; const &amp;v)'],['../a00201.html#gaf4573ae47c80938aa9053ef6a33755ab',1,'glm::translate(mat&lt; 3, 3, T, Q &gt; const &amp;m, vec&lt; 2, T, Q &gt; const &amp;v)'],['../a00221.html#ga309a30e652e58c396e2c3d4db3ee7658',1,'glm::translate(vec&lt; 3, T, Q &gt; const &amp;v)']]],\n  ['transpose',['transpose',['../a00230.html#gae679d841da8ce9dbcc6c2d454f15bc35',1,'glm']]],\n  ['trianglenormal',['triangleNormal',['../a00204.html#gaff1cb5496925dfa7962df457772a7f35',1,'glm']]],\n  ['trunc',['trunc',['../a00140.html#gaf9375e3e06173271d49e6ffa3a334259',1,'glm']]],\n  ['tweakedinfiniteperspective',['tweakedInfinitePerspective',['../a00157.html#gaaeacc04a2a6f4b18c5899d37e7bb3ef9',1,'glm::tweakedInfinitePerspective(T fovy, T aspect, T near)'],['../a00157.html#gaf5b3c85ff6737030a1d2214474ffa7a8',1,'glm::tweakedInfinitePerspective(T fovy, T aspect, T near, T ep)']]],\n  ['two_5fover_5fpi',['two_over_pi',['../a00151.html#ga74eadc8a211253079683219a3ea0462a',1,'glm']]],\n  ['two_5fover_5froot_5fpi',['two_over_root_pi',['../a00151.html#ga5827301817640843cf02026a8d493894',1,'glm']]],\n  ['two_5fpi',['two_pi',['../a00151.html#gaa5276a4617566abcfe49286f40e3a256',1,'glm']]],\n  ['two_5fthirds',['two_thirds',['../a00151.html#ga9b4d2f4322edcf63a6737b92a29dd1f5',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_12.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_12.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_12.js",
    "content": "var searchData=\n[\n  ['uaddcarry',['uaddCarry',['../a00229.html#gaedcec48743632dff6786bcc492074b1b',1,'glm']]],\n  ['uintbitstofloat',['uintBitsToFloat',['../a00140.html#gab2bae0d15dcdca6093f88f76b3975d97',1,'glm::uintBitsToFloat(uint const &amp;v)'],['../a00140.html#ga97f46b5f7b42fe44482e13356eb394ae',1,'glm::uintBitsToFloat(vec&lt; L, uint, Q &gt; const &amp;v)']]],\n  ['umulextended',['umulExtended',['../a00229.html#ga732e2fb56db57ea541c7e5c92b7121be',1,'glm']]],\n  ['unpackdouble2x32',['unpackDouble2x32',['../a00231.html#ga5f4296dc5f12f0aa67ac05b8bb322483',1,'glm']]],\n  ['unpackf2x11_5f1x10',['unpackF2x11_1x10',['../a00159.html#ga2b1fd1e854705b1345e98409e0a25e50',1,'glm']]],\n  ['unpackf3x9_5fe1x5',['unpackF3x9_E1x5',['../a00159.html#gab9e60ebe3ad3eeced6a9ec6eb876d74e',1,'glm']]],\n  ['unpackhalf',['unpackHalf',['../a00159.html#ga30d6b2f1806315bcd6047131f547d33b',1,'glm']]],\n  ['unpackhalf1x16',['unpackHalf1x16',['../a00159.html#gac37dedaba24b00adb4ec6e8f92c19dbf',1,'glm']]],\n  ['unpackhalf2x16',['unpackHalf2x16',['../a00231.html#gaf59b52e6b28da9335322c4ae19b5d745',1,'glm']]],\n  ['unpackhalf4x16',['unpackHalf4x16',['../a00159.html#ga57dfc41b2eb20b0ac00efae7d9c49dcd',1,'glm']]],\n  ['unpacki3x10_5f1x2',['unpackI3x10_1x2',['../a00159.html#ga9a05330e5490be0908d3b117d82aff56',1,'glm']]],\n  ['unpackint2x16',['unpackInt2x16',['../a00159.html#gaccde055882918a3175de82f4ca8b7d8e',1,'glm']]],\n  ['unpackint2x32',['unpackInt2x32',['../a00159.html#gab297c0bfd38433524791eb0584d8f08d',1,'glm']]],\n  ['unpackint2x8',['unpackInt2x8',['../a00159.html#gab0c59f1e259fca9e68adb2207a6b665e',1,'glm']]],\n  ['unpackint4x16',['unpackInt4x16',['../a00159.html#ga52c154a9b232b62c22517a700cc0c78c',1,'glm']]],\n  ['unpackint4x8',['unpackInt4x8',['../a00159.html#ga1cd8d2038cdd33a860801aa155a26221',1,'glm']]],\n  ['unpackrgbm',['unpackRGBM',['../a00159.html#ga5c1ec97894b05ea21a05aea4f0204a02',1,'glm']]],\n  ['unpacksnorm',['unpackSnorm',['../a00159.html#ga6d49b31e5c3f9df8e1f99ab62b999482',1,'glm']]],\n  ['unpacksnorm1x16',['unpackSnorm1x16',['../a00159.html#ga96dd15002370627a443c835ab03a766c',1,'glm']]],\n  ['unpacksnorm1x8',['unpackSnorm1x8',['../a00159.html#ga4851ff86678aa1c7ace9d67846894285',1,'glm']]],\n  ['unpacksnorm2x16',['unpackSnorm2x16',['../a00231.html#gacd8f8971a3fe28418be0d0fa1f786b38',1,'glm']]],\n  ['unpacksnorm2x8',['unpackSnorm2x8',['../a00159.html#ga8b128e89be449fc71336968a66bf6e1a',1,'glm']]],\n  ['unpacksnorm3x10_5f1x2',['unpackSnorm3x10_1x2',['../a00159.html#ga7a4fbf79be9740e3c57737bc2af05e5b',1,'glm']]],\n  ['unpacksnorm4x16',['unpackSnorm4x16',['../a00159.html#gaaddf9c353528fe896106f7181219c7f4',1,'glm']]],\n  ['unpacksnorm4x8',['unpackSnorm4x8',['../a00231.html#ga2db488646d48b7c43d3218954523fe82',1,'glm']]],\n  ['unpacku3x10_5f1x2',['unpackU3x10_1x2',['../a00159.html#ga48df3042a7d079767f5891a1bfd8a60a',1,'glm']]],\n  ['unpackuint2x16',['unpackUint2x16',['../a00159.html#ga035bbbeab7ec2b28c0529757395b645b',1,'glm']]],\n  ['unpackuint2x32',['unpackUint2x32',['../a00159.html#gaf942ff11b65e83eb5f77e68329ebc6ab',1,'glm']]],\n  ['unpackuint2x8',['unpackUint2x8',['../a00159.html#gaa7600a6c71784b637a410869d2a5adcd',1,'glm']]],\n  ['unpackuint4x16',['unpackUint4x16',['../a00159.html#gab173834ef14cfc23a96a959f3ff4b8dc',1,'glm']]],\n  ['unpackuint4x8',['unpackUint4x8',['../a00159.html#gaf6dc0e4341810a641c7ed08f10e335d1',1,'glm']]],\n  ['unpackunorm',['unpackUnorm',['../a00159.html#ga3e6ac9178b59f0b1b2f7599f2183eb7f',1,'glm']]],\n  ['unpackunorm1x16',['unpackUnorm1x16',['../a00159.html#ga83d34160a5cb7bcb5339823210fc7501',1,'glm']]],\n  ['unpackunorm1x5_5f1x6_5f1x5',['unpackUnorm1x5_1x6_1x5',['../a00159.html#gab3bc08ecfc0f3339be93fb2b3b56d88a',1,'glm']]],\n  ['unpackunorm1x8',['unpackUnorm1x8',['../a00159.html#ga1319207e30874fb4931a9ee913983ee1',1,'glm']]],\n  ['unpackunorm2x16',['unpackUnorm2x16',['../a00231.html#ga1f66188e5d65afeb9ffba1ad971e4007',1,'glm']]],\n  ['unpackunorm2x3_5f1x2',['unpackUnorm2x3_1x2',['../a00159.html#ga6abd5a9014df3b5ce4059008d2491260',1,'glm']]],\n  ['unpackunorm2x4',['unpackUnorm2x4',['../a00159.html#ga2e50476132fe5f27f08e273d9c70d85b',1,'glm']]],\n  ['unpackunorm2x8',['unpackUnorm2x8',['../a00159.html#ga637cbe3913dd95c6e7b4c99c61bd611f',1,'glm']]],\n  ['unpackunorm3x10_5f1x2',['unpackUnorm3x10_1x2',['../a00159.html#ga5156d3060355fe332865da2c7f78815f',1,'glm']]],\n  ['unpackunorm3x5_5f1x1',['unpackUnorm3x5_1x1',['../a00159.html#ga5ff95ff5bc16f396432ab67243dbae4d',1,'glm']]],\n  ['unpackunorm4x16',['unpackUnorm4x16',['../a00159.html#ga2ae149c5d2473ac1e5f347bb654a242d',1,'glm']]],\n  ['unpackunorm4x4',['unpackUnorm4x4',['../a00159.html#gac58ee89d0e224bb6df5e8bbb18843a2d',1,'glm']]],\n  ['unpackunorm4x8',['unpackUnorm4x8',['../a00231.html#ga7f903259150b67e9466f5f8edffcd197',1,'glm']]],\n  ['unproject',['unProject',['../a00157.html#ga36641e5d60f994e01c3d8f56b10263d2',1,'glm']]],\n  ['uround',['uround',['../a00153.html#ga6715b9d573972a0f7763d30d45bcaec4',1,'glm']]],\n  ['usubborrow',['usubBorrow',['../a00229.html#gae3316ba1229ad9b9f09480833321b053',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_13.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_13.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_13.js",
    "content": "var searchData=\n[\n  ['value_5fptr',['value_ptr',['../a00166.html#ga1c64669e1ba1160ad9386e43dc57569a',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_14.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_14.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_14.js",
    "content": "var searchData=\n[\n  ['wrapangle',['wrapAngle',['../a00185.html#ga069527c6dbd64f53435b8ebc4878b473',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_15.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_15.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_15.js",
    "content": "var searchData=\n[\n  ['yaw',['yaw',['../a00160.html#ga53feffeb4001b99e36e216522e465e9e',1,'glm']]],\n  ['yawpitchroll',['yawPitchRoll',['../a00179.html#gae6aa26ccb020d281b449619e419a609e',1,'glm']]],\n  ['ycocg2rgb',['YCoCg2rgb',['../a00174.html#ga163596b804c7241810b2534a99eb1343',1,'glm']]],\n  ['ycocgr2rgb',['YCoCgR2rgb',['../a00174.html#gaf8d30574c8576838097d8e20c295384a',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_16.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_16.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_16.js",
    "content": "var searchData=\n[\n  ['zero',['zero',['../a00151.html#ga788f5a421fc0f40a1296ebc094cbaa8a',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_2.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_2.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_2.js",
    "content": "var searchData=\n[\n  ['catmullrom',['catmullRom',['../a00218.html#ga8119c04f8210fd0d292757565cd6918d',1,'glm']]],\n  ['ceil',['ceil',['../a00140.html#gafb9d2a645a23aca12d4d6de0104b7657',1,'glm']]],\n  ['ceilmultiple',['ceilMultiple',['../a00163.html#gac84898c466e609cdd2e81d9ba907d9e8',1,'glm::ceilMultiple(genType Source, genType Multiple)'],['../a00163.html#ga073227936f36f9102cd3a8aa45871b26',1,'glm::ceilMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)']]],\n  ['ceilpoweroftwo',['ceilPowerOfTwo',['../a00163.html#gaa73c7690c787086fa3ac1c312264acab',1,'glm::ceilPowerOfTwo(genIUType Value)'],['../a00163.html#gac46c061058771cb31c467ef673d12c80',1,'glm::ceilPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['circularrand',['circularRand',['../a00161.html#ga9dd05c36025088fae25b97c869e88517',1,'glm']]],\n  ['clamp',['clamp',['../a00140.html#ga93bce26c7d80d30a62f5c508f8498a6c',1,'glm::clamp(genType x, genType minVal, genType maxVal)'],['../a00140.html#gabff13e6547edac08f52b4133ff4bf183',1,'glm::clamp(vec&lt; L, T, Q &gt; const &amp;x, T minVal, T maxVal)'],['../a00140.html#ga748333282a6f2f87762c0a4739c8c364',1,'glm::clamp(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;minVal, vec&lt; L, T, Q &gt; const &amp;maxVal)'],['../a00228.html#ga6c0cc6bd1d67ea1008d2592e998bad33',1,'glm::clamp(genType const &amp;Texcoord)']]],\n  ['closestpointonline',['closestPointOnLine',['../a00171.html#ga36529c278ef716986151d58d151d697d',1,'glm::closestPointOnLine(vec&lt; 3, T, Q &gt; const &amp;point, vec&lt; 3, T, Q &gt; const &amp;a, vec&lt; 3, T, Q &gt; const &amp;b)'],['../a00171.html#ga55bcbcc5fc06cb7ff7bc7a6e0e155eb0',1,'glm::closestPointOnLine(vec&lt; 2, T, Q &gt; const &amp;point, vec&lt; 2, T, Q &gt; const &amp;a, vec&lt; 2, T, Q &gt; const &amp;b)']]],\n  ['colmajor2',['colMajor2',['../a00198.html#gaaff72f11286e59a4a88ed21a347f284c',1,'glm::colMajor2(vec&lt; 2, T, Q &gt; const &amp;v1, vec&lt; 2, T, Q &gt; const &amp;v2)'],['../a00198.html#gafc25fd44196c92b1397b127aec1281ab',1,'glm::colMajor2(mat&lt; 2, 2, T, Q &gt; const &amp;m)']]],\n  ['colmajor3',['colMajor3',['../a00198.html#ga1e25b72b085087740c92f5c70f3b051f',1,'glm::colMajor3(vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)'],['../a00198.html#ga86bd0656e787bb7f217607572590af27',1,'glm::colMajor3(mat&lt; 3, 3, T, Q &gt; const &amp;m)']]],\n  ['colmajor4',['colMajor4',['../a00198.html#gaf4aa6c7e17bfce41a6c13bf6469fab05',1,'glm::colMajor4(vec&lt; 4, T, Q &gt; const &amp;v1, vec&lt; 4, T, Q &gt; const &amp;v2, vec&lt; 4, T, Q &gt; const &amp;v3, vec&lt; 4, T, Q &gt; const &amp;v4)'],['../a00198.html#gaf3f9511c366c20ba2e4a64c9e4cec2b3',1,'glm::colMajor4(mat&lt; 4, 4, T, Q &gt; const &amp;m)']]],\n  ['column',['column',['../a00154.html#ga96022eb0d3fae39d89fc7a954e59b374',1,'glm::column(genType const &amp;m, length_t index)'],['../a00154.html#ga9e757377523890e8b80c5843dbe4dd15',1,'glm::column(genType const &amp;m, length_t index, typename genType::col_type const &amp;x)']]],\n  ['compadd',['compAdd',['../a00177.html#gaf71833350e15e74d31cbf8a3e7f27051',1,'glm']]],\n  ['compmax',['compMax',['../a00177.html#gabfa4bb19298c8c73d4217ba759c496b6',1,'glm']]],\n  ['compmin',['compMin',['../a00177.html#gab5d0832b5c7bb01b8d7395973bfb1425',1,'glm']]],\n  ['compmul',['compMul',['../a00177.html#gae8ab88024197202c9479d33bdc5a8a5d',1,'glm']]],\n  ['compnormalize',['compNormalize',['../a00177.html#ga8f2b81ada8515875e58cb1667b6b9908',1,'glm']]],\n  ['compscale',['compScale',['../a00177.html#ga80abc2980d65d675f435d178c36880eb',1,'glm']]],\n  ['conjugate',['conjugate',['../a00160.html#gac40833db608deda477f018767b9a1cad',1,'glm']]],\n  ['convertd65xyztod50xyz',['convertD65XYZToD50XYZ',['../a00172.html#gad12f4f65022b2c80e33fcba2ced0dc48',1,'glm']]],\n  ['convertd65xyztolinearsrgb',['convertD65XYZToLinearSRGB',['../a00172.html#ga5265386fc3ac29e4c580d37ed470859c',1,'glm']]],\n  ['convertlinearsrgbtod50xyz',['convertLinearSRGBToD50XYZ',['../a00172.html#ga1522ba180e3d83d554a734056da031f9',1,'glm']]],\n  ['convertlinearsrgbtod65xyz',['convertLinearSRGBToD65XYZ',['../a00172.html#gaf9e130d9d4ccf51cc99317de7449f369',1,'glm']]],\n  ['convertlineartosrgb',['convertLinearToSRGB',['../a00150.html#ga42239e7b3da900f7ef37cec7e2476579',1,'glm::convertLinearToSRGB(vec&lt; L, T, Q &gt; const &amp;ColorLinear)'],['../a00150.html#gaace0a21167d13d26116c283009af57f6',1,'glm::convertLinearToSRGB(vec&lt; L, T, Q &gt; const &amp;ColorLinear, T Gamma)']]],\n  ['convertsrgbtolinear',['convertSRGBToLinear',['../a00150.html#ga16c798b7a226b2c3079dedc55083d187',1,'glm::convertSRGBToLinear(vec&lt; L, T, Q &gt; const &amp;ColorSRGB)'],['../a00150.html#gad1b91f27a9726c9cb403f9fee6e2e200',1,'glm::convertSRGBToLinear(vec&lt; L, T, Q &gt; const &amp;ColorSRGB, T Gamma)']]],\n  ['cos',['cos',['../a00232.html#ga6a41efc740e3b3c937447d3a6284130e',1,'glm']]],\n  ['cosh',['cosh',['../a00232.html#ga4e260e372742c5f517aca196cf1e62b3',1,'glm']]],\n  ['cot',['cot',['../a00162.html#ga3a7b517a95bbd3ad74da3aea87a66314',1,'glm']]],\n  ['coth',['coth',['../a00162.html#ga6b8b770eb7198e4dea59d52e6db81442',1,'glm']]],\n  ['cross',['cross',['../a00142.html#gaeeec0794212fe84fc9d261de067c9587',1,'glm::cross(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)'],['../a00182.html#gac36e72b934ea6a9dd313772d7e78fa93',1,'glm::cross(vec&lt; 2, T, Q &gt; const &amp;v, vec&lt; 2, T, Q &gt; const &amp;u)'],['../a00212.html#ga8639615408166d0dddda1b91a940b338',1,'glm::cross(tquat&lt; T, Q &gt; const &amp;q, vec&lt; 3, T, Q &gt; const &amp;v)'],['../a00212.html#gaa75ca5654e0dc3b61c05db091f7d46ce',1,'glm::cross(vec&lt; 3, T, Q &gt; const &amp;v, tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['csc',['csc',['../a00162.html#ga59dd0005b6474eea48af743b4f14ebbb',1,'glm']]],\n  ['csch',['csch',['../a00162.html#ga6d95843ff3ca6472ab399ba171d290a0',1,'glm']]],\n  ['cubic',['cubic',['../a00218.html#ga6b867eb52e2fc933d2e0bf26aabc9a70',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_3.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_3.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_3.js",
    "content": "var searchData=\n[\n  ['decompose',['decompose',['../a00195.html#ga91185463739c855d602596907a9994bc',1,'glm']]],\n  ['degrees',['degrees',['../a00232.html#ga8faec9e303538065911ba8b3caf7326b',1,'glm']]],\n  ['determinant',['determinant',['../a00230.html#gad7928795124768e058f99dce270f5c8d',1,'glm']]],\n  ['diagonal2x2',['diagonal2x2',['../a00199.html#ga58a32a2beeb2478dae2a721368cdd4ac',1,'glm']]],\n  ['diagonal2x3',['diagonal2x3',['../a00199.html#gab69f900206a430e2875a5a073851e175',1,'glm']]],\n  ['diagonal2x4',['diagonal2x4',['../a00199.html#ga30b4dbfed60a919d66acc8a63bcdc549',1,'glm']]],\n  ['diagonal3x2',['diagonal3x2',['../a00199.html#ga832c805d5130d28ad76236958d15b47d',1,'glm']]],\n  ['diagonal3x3',['diagonal3x3',['../a00199.html#ga5487ff9cdbc8e04d594adef1bcb16ee0',1,'glm']]],\n  ['diagonal3x4',['diagonal3x4',['../a00199.html#gad7551139cff0c4208d27f0ad3437833e',1,'glm']]],\n  ['diagonal4x2',['diagonal4x2',['../a00199.html#gacb8969e6543ba775c6638161a37ac330',1,'glm']]],\n  ['diagonal4x3',['diagonal4x3',['../a00199.html#gae235def5049d6740f0028433f5e13f90',1,'glm']]],\n  ['diagonal4x4',['diagonal4x4',['../a00199.html#ga0b4cd8dea436791b072356231ee8578f',1,'glm']]],\n  ['diskrand',['diskRand',['../a00161.html#gaa0b18071f3f97dbf8bcf6f53c6fe5f73',1,'glm']]],\n  ['distance',['distance',['../a00142.html#gaa68de6c53e20dfb2dac2d20197562e3f',1,'glm']]],\n  ['distance2',['distance2',['../a00203.html#ga85660f1b79f66c09c7b5a6f80e68c89f',1,'glm']]],\n  ['dot',['dot',['../a00142.html#gaad6c5d9d39bdc0bf43baf1b22e147a0a',1,'glm::dot(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00160.html#gab219911644fdc694e7d275cfcf35bfca',1,'glm::dot(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)']]],\n  ['dual_5fquat_5fidentity',['dual_quat_identity',['../a00178.html#ga0b35c0e30df8a875dbaa751e0bd800e0',1,'glm']]],\n  ['dualquat_5fcast',['dualquat_cast',['../a00178.html#gac4064ff813759740201765350eac4236',1,'glm::dualquat_cast(mat&lt; 2, 4, T, Q &gt; const &amp;x)'],['../a00178.html#ga91025ebdca0f4ea54da08497b00e8c84',1,'glm::dualquat_cast(mat&lt; 3, 4, T, Q &gt; const &amp;x)']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_4.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_4.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_4.js",
    "content": "var searchData=\n[\n  ['e',['e',['../a00151.html#ga4b7956eb6e2fbedfc7cf2e46e85c5139',1,'glm']]],\n  ['epsilon',['epsilon',['../a00151.html#ga2a1e57fc5592b69cfae84174cbfc9429',1,'glm']]],\n  ['epsilonequal',['epsilonEqual',['../a00152.html#ga91b417866cafadd076004778217a1844',1,'glm::epsilonEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y, T const &amp;epsilon)'],['../a00152.html#gaa7f227999ca09e7ca994e8b35aba47bb',1,'glm::epsilonEqual(genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)']]],\n  ['epsilonnotequal',['epsilonNotEqual',['../a00152.html#gaf840d33b9a5261ec78dcd5125743b025',1,'glm::epsilonNotEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y, T const &amp;epsilon)'],['../a00152.html#ga50a92103fb0cbd796908e1bf20c79aaf',1,'glm::epsilonNotEqual(genType const &amp;x, genType const &amp;y, genType const &amp;epsilon)']]],\n  ['equal',['equal',['../a00160.html#ga22089a76bfb7b45b4c34961bb715e2df',1,'glm::equal(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#ga774f9e3a93c913f1e7c215a549707d59',1,'glm::equal(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['euclidean',['euclidean',['../a00210.html#ga1821d5b3324201e60a9e2823d0b5d0c8',1,'glm']]],\n  ['euler',['euler',['../a00151.html#gad8fe2e6f90bce9d829e9723b649fbd42',1,'glm']]],\n  ['eulerangles',['eulerAngles',['../a00160.html#gaf21424fa62e03de8b11c2b776c17d7a3',1,'glm']]],\n  ['euleranglex',['eulerAngleX',['../a00179.html#gafba6282e4ed3ff8b5c75331abfba3489',1,'glm']]],\n  ['euleranglexy',['eulerAngleXY',['../a00179.html#ga64036577ee17a2d24be0dbc05881d4e2',1,'glm']]],\n  ['euleranglexyz',['eulerAngleXYZ',['../a00179.html#ga1975e0f0e9bed7f716dc9946da2ab645',1,'glm']]],\n  ['euleranglexz',['eulerAngleXZ',['../a00179.html#gaa39bd323c65c2fc0a1508be33a237ce9',1,'glm']]],\n  ['eulerangley',['eulerAngleY',['../a00179.html#gab84bf4746805fd69b8ecbb230e3974c5',1,'glm']]],\n  ['eulerangleyx',['eulerAngleYX',['../a00179.html#ga4f57e6dd25c3cffbbd4daa6ef3f4486d',1,'glm']]],\n  ['eulerangleyxz',['eulerAngleYXZ',['../a00179.html#gab8ba99a9814f6d9edf417b6c6d5b0c10',1,'glm']]],\n  ['eulerangleyz',['eulerAngleYZ',['../a00179.html#ga220379e10ac8cca55e275f0c9018fed9',1,'glm']]],\n  ['euleranglez',['eulerAngleZ',['../a00179.html#ga5b3935248bb6c3ec6b0d9297d406e251',1,'glm']]],\n  ['euleranglezx',['eulerAngleZX',['../a00179.html#ga483903115cd4059228961046a28d69b5',1,'glm']]],\n  ['euleranglezy',['eulerAngleZY',['../a00179.html#ga400b2bd5984999efab663f3a68e1d020',1,'glm']]],\n  ['exp',['exp',['../a00141.html#ga071566cadc7505455e611f2a0353f4d4',1,'glm::exp(vec&lt; L, T, Q &gt; const &amp;v)'],['../a00212.html#ga72275e87ce62dc75a06d39a6c049835c',1,'glm::exp(tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['exp2',['exp2',['../a00141.html#gaff17ace6b579a03bf223ed4d1ed2cd16',1,'glm']]],\n  ['extend',['extend',['../a00180.html#ga8140caae613b0f847ab0d7175dc03a37',1,'glm']]],\n  ['extracteuleranglexyz',['extractEulerAngleXYZ',['../a00179.html#gacea701562f778c1da4d3a0a1cf091000',1,'glm']]],\n  ['extractmatrixrotation',['extractMatrixRotation',['../a00197.html#ga8834d4499a1a52fcf531b4506f0b5f67',1,'glm']]],\n  ['extractrealcomponent',['extractRealComponent',['../a00212.html#ga312385d0a8caa24c1daaa1d00ce4c2d3',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_5.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_5.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_5.js",
    "content": "var searchData=\n[\n  ['faceforward',['faceforward',['../a00142.html#ga7aed0a36c738169402404a3a5d54e43b',1,'glm']]],\n  ['factorial',['factorial',['../a00190.html#ga8cbd3120905f398ec321b5d1836e08fb',1,'glm']]],\n  ['fastacos',['fastAcos',['../a00185.html#ga9721d63356e5d94fdc4b393a426ab26b',1,'glm']]],\n  ['fastasin',['fastAsin',['../a00185.html#ga562cb62c51fbfe7fac7db0bce706b81f',1,'glm']]],\n  ['fastatan',['fastAtan',['../a00185.html#ga8d197c6ef564f5e5d59af3b3f8adcc2c',1,'glm::fastAtan(T y, T x)'],['../a00185.html#gae25de86a968490ff56856fa425ec9d30',1,'glm::fastAtan(T angle)']]],\n  ['fastcos',['fastCos',['../a00185.html#gab34c8b45c23c0165a64dcecfcc3b302a',1,'glm']]],\n  ['fastdistance',['fastDistance',['../a00184.html#gaac333418d0c4e0cc6d3d219ed606c238',1,'glm::fastDistance(genType x, genType y)'],['../a00184.html#ga42d3e771fa7cb3c60d828e315829df19',1,'glm::fastDistance(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['fastexp',['fastExp',['../a00183.html#gaa3180ac8f96ab37ab96e0cacaf608e10',1,'glm::fastExp(T x)'],['../a00183.html#ga3ba6153aec6bd74628f8b00530aa8d58',1,'glm::fastExp(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastexp2',['fastExp2',['../a00183.html#ga0af50585955eb14c60bb286297fabab2',1,'glm::fastExp2(T x)'],['../a00183.html#gacaaed8b67d20d244b7de217e7816c1b6',1,'glm::fastExp2(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastinversesqrt',['fastInverseSqrt',['../a00184.html#ga7f081b14d9c7035c8714eba5f7f75a8f',1,'glm::fastInverseSqrt(genType x)'],['../a00184.html#gadcd7be12b1e5ee182141359d4c45dd24',1,'glm::fastInverseSqrt(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastlength',['fastLength',['../a00184.html#gafe697d6287719538346bbdf8b1367c59',1,'glm::fastLength(genType x)'],['../a00184.html#ga90f66be92ef61e705c005e7b3209edb8',1,'glm::fastLength(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastlog',['fastLog',['../a00183.html#gae1bdc97b7f96a600e29c753f1cd4388a',1,'glm::fastLog(T x)'],['../a00183.html#ga937256993a7219e73f186bb348fe6be8',1,'glm::fastLog(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastlog2',['fastLog2',['../a00183.html#ga6e98118685f6dc9e05fbb13dd5e5234e',1,'glm::fastLog2(T x)'],['../a00183.html#ga7562043539194ccc24649f8475bc5584',1,'glm::fastLog2(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastmix',['fastMix',['../a00212.html#gac5c77bc74dfc750aaf271d68f271bf2b',1,'glm']]],\n  ['fastnormalize',['fastNormalize',['../a00184.html#ga3b02c1d6e0c754144e2f1e110bf9f16c',1,'glm']]],\n  ['fastnormalizedot',['fastNormalizeDot',['../a00205.html#ga2746fb9b5bd22b06b2f7c8babba5de9e',1,'glm']]],\n  ['fastpow',['fastPow',['../a00183.html#ga5340e98a11fcbbd936ba6e983a154d50',1,'glm::fastPow(genType x, genType y)'],['../a00183.html#ga15325a8ed2d1c4ed2412c4b3b3927aa2',1,'glm::fastPow(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00183.html#ga7f2562db9c3e02ae76169c36b086c3f6',1,'glm::fastPow(genTypeT x, genTypeU y)'],['../a00183.html#ga1abe488c0829da5b9de70ac64aeaa7e5',1,'glm::fastPow(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fastsin',['fastSin',['../a00185.html#ga0aab3257bb3b628d10a1e0483e2c6915',1,'glm']]],\n  ['fastsqrt',['fastSqrt',['../a00184.html#ga6c460e9414a50b2fc455c8f64c86cdc9',1,'glm::fastSqrt(genType x)'],['../a00184.html#gae83f0c03614f73eae5478c5b6274ee6d',1,'glm::fastSqrt(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['fasttan',['fastTan',['../a00185.html#gaf29b9c1101a10007b4f79ee89df27ba2',1,'glm']]],\n  ['findlsb',['findLSB',['../a00229.html#gaf74c4d969fa34ab8acb9d390f5ca5274',1,'glm::findLSB(genIUType x)'],['../a00229.html#ga4454c0331d6369888c28ab677f4810c7',1,'glm::findLSB(vec&lt; L, T, Q &gt; const &amp;v)']]],\n  ['findmsb',['findMSB',['../a00229.html#ga7e4a794d766861c70bc961630f8ef621',1,'glm::findMSB(genIUType x)'],['../a00229.html#ga39ac4d52028bb6ab08db5ad6562c2872',1,'glm::findMSB(vec&lt; L, T, Q &gt; const &amp;v)']]],\n  ['fliplr',['fliplr',['../a00196.html#gaf39f4e5f78eb29c1a90277d45b9b3feb',1,'glm']]],\n  ['flipud',['flipud',['../a00196.html#ga85003371f0ba97380dd25e8905de1870',1,'glm']]],\n  ['float_5fdistance',['float_distance',['../a00167.html#ga2e09bd6c8b0a9c91f6f5683d68245634',1,'glm::float_distance(T const &amp;x, T const &amp;y)'],['../a00167.html#ga72b3223069013f336d8c31812b7ada80',1,'glm::float_distance(vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)']]],\n  ['floatbitstoint',['floatBitsToInt',['../a00140.html#ga1425c1c3160ec51214b03a0469a3013d',1,'glm::floatBitsToInt(float const &amp;v)'],['../a00140.html#ga99f7d62f78ac5ea3b49bae715c9488ed',1,'glm::floatBitsToInt(vec&lt; L, float, Q &gt; const &amp;v)']]],\n  ['floatbitstouint',['floatBitsToUint',['../a00140.html#ga70e0271c34af52f3100c7960e18c3f2b',1,'glm::floatBitsToUint(float const &amp;v)'],['../a00140.html#ga49418ba4c8a60fbbb5d57b705f3e26db',1,'glm::floatBitsToUint(vec&lt; L, float, Q &gt; const &amp;v)']]],\n  ['floor',['floor',['../a00140.html#gaa9d0742639e85b29c7c5de11cfd6840d',1,'glm']]],\n  ['floor_5flog2',['floor_log2',['../a00190.html#ga7011b4e1c1e1ed492149b028feacc00e',1,'glm']]],\n  ['floormultiple',['floorMultiple',['../a00163.html#ga9eafb9dbedf84e5cece65c2fe9d5631d',1,'glm::floorMultiple(genType Source, genType Multiple)'],['../a00163.html#ga2b6d6bcdf0641b54cb539104c224885b',1,'glm::floorMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)']]],\n  ['floorpoweroftwo',['floorPowerOfTwo',['../a00163.html#gac80f6519c31baae10d8d7bea6735d1fa',1,'glm::floorPowerOfTwo(genIUType Value)'],['../a00163.html#ga6ebfea889605abf6629c7589e0cb2e28',1,'glm::floorPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['fma',['fma',['../a00140.html#gad0f444d4b81cc53c3b6edf5aa25078c2',1,'glm']]],\n  ['fmod',['fmod',['../a00175.html#gae5e80425df9833164ad469e83b475fb4',1,'glm']]],\n  ['four_5fover_5fpi',['four_over_pi',['../a00151.html#ga753950e5140e4ea6a88e4a18ba61dc09',1,'glm']]],\n  ['fract',['fract',['../a00140.html#ga8ba89e40e55ae5cdf228548f9b7639c7',1,'glm::fract(genType x)'],['../a00140.html#ga2df623004f634b440d61e018d62c751b',1,'glm::fract(vec&lt; L, T, Q &gt; const &amp;x)']]],\n  ['frexp',['frexp',['../a00140.html#ga20620e83544d1a988857a3bc4ebe0e1d',1,'glm']]],\n  ['frustum',['frustum',['../a00157.html#ga0bcd4542e0affc63a0b8c08fcb839ea9',1,'glm']]],\n  ['frustumlh',['frustumLH',['../a00157.html#gae4277c37f61d81da01bc9db14ea90296',1,'glm']]],\n  ['frustumrh',['frustumRH',['../a00157.html#ga4366ab45880c6c5f8b3e8c371ca4b136',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_6.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_6.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_6.js",
    "content": "var searchData=\n[\n  ['gauss',['gauss',['../a00186.html#ga0b50b197ff74261a0fad90f4b8d24702',1,'glm::gauss(T x, T ExpectedValue, T StandardDeviation)'],['../a00186.html#gad19ec8754a83c0b9a8dc16b7e60705ab',1,'glm::gauss(vec&lt; 2, T, Q &gt; const &amp;Coord, vec&lt; 2, T, Q &gt; const &amp;ExpectedValue, vec&lt; 2, T, Q &gt; const &amp;StandardDeviation)']]],\n  ['gaussrand',['gaussRand',['../a00161.html#ga5193a83e49e4fdc5652c084711083574',1,'glm']]],\n  ['glm_5faligned_5ftypedef',['GLM_ALIGNED_TYPEDEF',['../a00223.html#gab5cd5c5fad228b25c782084f1cc30114',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int8, aligned_lowp_int8, 1)'],['../a00223.html#ga5bb5dd895ef625c1b113f2cf400186b0',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int16, aligned_lowp_int16, 2)'],['../a00223.html#gac6efa54cf7c6c86f7158922abdb1a430',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int32, aligned_lowp_int32, 4)'],['../a00223.html#ga6612eb77c8607048e7552279a11eeb5f',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int64, aligned_lowp_int64, 8)'],['../a00223.html#ga7ddc1848ff2223026db8968ce0c97497',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int8_t, aligned_lowp_int8_t, 1)'],['../a00223.html#ga22240dd9458b0f8c11fbcc4f48714f68',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int16_t, aligned_lowp_int16_t, 2)'],['../a00223.html#ga8130ea381d76a2cc34a93ccbb6cf487d',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int32_t, aligned_lowp_int32_t, 4)'],['../a00223.html#ga7ccb60f3215d293fd62b33b31ed0e7be',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_int64_t, aligned_lowp_int64_t, 8)'],['../a00223.html#gac20d508d2ef5cc95ad3daf083c57ec2a',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_i8, aligned_lowp_i8, 1)'],['../a00223.html#ga50257b48069a31d0c8d9c1f644d267de',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_i16, aligned_lowp_i16, 2)'],['../a00223.html#gaa07e98e67b7a3435c0746018c7a2a839',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_i32, aligned_lowp_i32, 4)'],['../a00223.html#ga62601fc6f8ca298b77285bedf03faffd',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_i64, aligned_lowp_i64, 8)'],['../a00223.html#gac8cff825951aeb54dd846037113c72db',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int8, aligned_mediump_int8, 1)'],['../a00223.html#ga78f443d88f438575a62b5df497cdf66b',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int16, aligned_mediump_int16, 2)'],['../a00223.html#ga0680cd3b5d4e8006985fb41a4f9b57af',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int32, aligned_mediump_int32, 4)'],['../a00223.html#gad9e5babb1dd3e3531b42c37bf25dd951',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int64, aligned_mediump_int64, 8)'],['../a00223.html#ga353fd9fa8a9ad952fcabd0d53ad9a6dd',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int8_t, aligned_mediump_int8_t, 1)'],['../a00223.html#ga2196442c0e5c5e8c77842de388c42521',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int16_t, aligned_mediump_int16_t, 2)'],['../a00223.html#ga1284488189daf897cf095c5eefad9744',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int32_t, aligned_mediump_int32_t, 4)'],['../a00223.html#ga73fdc86a539808af58808b7c60a1c4d8',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_int64_t, aligned_mediump_int64_t, 8)'],['../a00223.html#gafafeea923e1983262c972e2b83922d3b',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_i8, aligned_mediump_i8, 1)'],['../a00223.html#ga4b35ca5fe8f55c9d2fe54fdb8d8896f4',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_i16, aligned_mediump_i16, 2)'],['../a00223.html#ga63b882e29170d428463d99c3d630acc6',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_i32, aligned_mediump_i32, 4)'],['../a00223.html#ga8b20507bb048c1edea2d441cc953e6f0',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_i64, aligned_mediump_i64, 8)'],['../a00223.html#ga56c5ca60813027b603c7b61425a0479d',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int8, aligned_highp_int8, 1)'],['../a00223.html#ga7a751b3aff24c0259f4a7357c2969089',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int16, aligned_highp_int16, 2)'],['../a00223.html#ga70cd2144351c556469ee6119e59971fc',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int32, aligned_highp_int32, 4)'],['../a00223.html#ga46bbf08dc004d8c433041e0b5018a5d3',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int64, aligned_highp_int64, 8)'],['../a00223.html#gab3e10c77a20d1abad2de1c561c7a5c18',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int8_t, aligned_highp_int8_t, 1)'],['../a00223.html#ga968f30319ebeaca9ebcd3a25a8e139fb',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int16_t, aligned_highp_int16_t, 2)'],['../a00223.html#gaae773c28e6390c6aa76f5b678b7098a3',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int32_t, aligned_highp_int32_t, 4)'],['../a00223.html#ga790cfff1ca39d0ed696ffed980809311',1,'glm::GLM_ALIGNED_TYPEDEF(highp_int64_t, aligned_highp_int64_t, 8)'],['../a00223.html#ga8265b91eb23c120a9b0c3e381bc37b96',1,'glm::GLM_ALIGNED_TYPEDEF(highp_i8, aligned_highp_i8, 1)'],['../a00223.html#gae6d384de17588d8edb894fbe06e0d410',1,'glm::GLM_ALIGNED_TYPEDEF(highp_i16, aligned_highp_i16, 2)'],['../a00223.html#ga9c8172b745ee03fc5b2b91c350c2922f',1,'glm::GLM_ALIGNED_TYPEDEF(highp_i32, aligned_highp_i32, 4)'],['../a00223.html#ga77e0dff12aa4020ddc3f8cabbea7b2e6',1,'glm::GLM_ALIGNED_TYPEDEF(highp_i64, aligned_highp_i64, 8)'],['../a00223.html#gabd82b9faa9d4d618dbbe0fc8a1efee63',1,'glm::GLM_ALIGNED_TYPEDEF(int8, aligned_int8, 1)'],['../a00223.html#ga285649744560be21000cfd81bbb5d507',1,'glm::GLM_ALIGNED_TYPEDEF(int16, aligned_int16, 2)'],['../a00223.html#ga07732da630b2deda428ce95c0ecaf3ff',1,'glm::GLM_ALIGNED_TYPEDEF(int32, aligned_int32, 4)'],['../a00223.html#ga1a8da2a8c51f69c07a2e7f473aa420f4',1,'glm::GLM_ALIGNED_TYPEDEF(int64, aligned_int64, 8)'],['../a00223.html#ga848aedf13e2d9738acf0bb482c590174',1,'glm::GLM_ALIGNED_TYPEDEF(int8_t, aligned_int8_t, 1)'],['../a00223.html#gafd2803d39049dd45a37a63931e25d943',1,'glm::GLM_ALIGNED_TYPEDEF(int16_t, aligned_int16_t, 2)'],['../a00223.html#gae553b33349d6da832cf0724f1e024094',1,'glm::GLM_ALIGNED_TYPEDEF(int32_t, aligned_int32_t, 4)'],['../a00223.html#ga16d223a2b3409e812e1d3bd87f0e9e5c',1,'glm::GLM_ALIGNED_TYPEDEF(int64_t, aligned_int64_t, 8)'],['../a00223.html#ga2de065d2ddfdb366bcd0febca79ae2ad',1,'glm::GLM_ALIGNED_TYPEDEF(i8, aligned_i8, 1)'],['../a00223.html#gabd786bdc20a11c8cb05c92c8212e28d3',1,'glm::GLM_ALIGNED_TYPEDEF(i16, aligned_i16, 2)'],['../a00223.html#gad4aefe56691cdb640c72f0d46d3fb532',1,'glm::GLM_ALIGNED_TYPEDEF(i32, aligned_i32, 4)'],['../a00223.html#ga8fe9745f7de24a8394518152ff9fccdc',1,'glm::GLM_ALIGNED_TYPEDEF(i64, aligned_i64, 8)'],['../a00223.html#gaaad735483450099f7f882d4e3a3569bd',1,'glm::GLM_ALIGNED_TYPEDEF(ivec1, aligned_ivec1, 4)'],['../a00223.html#gac7b6f823802edbd6edbaf70ea25bf068',1,'glm::GLM_ALIGNED_TYPEDEF(ivec2, aligned_ivec2, 8)'],['../a00223.html#ga3e235bcd2b8029613f25b8d40a2d3ef7',1,'glm::GLM_ALIGNED_TYPEDEF(ivec3, aligned_ivec3, 16)'],['../a00223.html#ga50d8a9523968c77f8325b4c9bfbff41e',1,'glm::GLM_ALIGNED_TYPEDEF(ivec4, aligned_ivec4, 16)'],['../a00223.html#ga9ec20fdfb729c702032da9378c79679f',1,'glm::GLM_ALIGNED_TYPEDEF(i8vec1, aligned_i8vec1, 1)'],['../a00223.html#ga25b3fe1d9e8d0a5e86c1949c1acd8131',1,'glm::GLM_ALIGNED_TYPEDEF(i8vec2, aligned_i8vec2, 2)'],['../a00223.html#ga2958f907719d94d8109b562540c910e2',1,'glm::GLM_ALIGNED_TYPEDEF(i8vec3, aligned_i8vec3, 4)'],['../a00223.html#ga1fe6fc032a978f1c845fac9aa0668714',1,'glm::GLM_ALIGNED_TYPEDEF(i8vec4, aligned_i8vec4, 4)'],['../a00223.html#gaa4161e7a496dc96972254143fe873e55',1,'glm::GLM_ALIGNED_TYPEDEF(i16vec1, aligned_i16vec1, 2)'],['../a00223.html#ga9d7cb211ccda69b1c22ddeeb0f3e7aba',1,'glm::GLM_ALIGNED_TYPEDEF(i16vec2, aligned_i16vec2, 4)'],['../a00223.html#gaaee91dd2ab34423bcc11072ef6bd0f02',1,'glm::GLM_ALIGNED_TYPEDEF(i16vec3, aligned_i16vec3, 8)'],['../a00223.html#ga49f047ccaa8b31fad9f26c67bf9b3510',1,'glm::GLM_ALIGNED_TYPEDEF(i16vec4, aligned_i16vec4, 8)'],['../a00223.html#ga904e9c2436bb099397c0823506a0771f',1,'glm::GLM_ALIGNED_TYPEDEF(i32vec1, aligned_i32vec1, 4)'],['../a00223.html#gaf90651cf2f5e7ee2b11cfdc5a6749534',1,'glm::GLM_ALIGNED_TYPEDEF(i32vec2, aligned_i32vec2, 8)'],['../a00223.html#ga7354a4ead8cb17868aec36b9c30d6010',1,'glm::GLM_ALIGNED_TYPEDEF(i32vec3, aligned_i32vec3, 16)'],['../a00223.html#gad2ecbdea18732163e2636e27b37981ee',1,'glm::GLM_ALIGNED_TYPEDEF(i32vec4, aligned_i32vec4, 16)'],['../a00223.html#ga965b1c9aa1800e93d4abc2eb2b5afcbf',1,'glm::GLM_ALIGNED_TYPEDEF(i64vec1, aligned_i64vec1, 8)'],['../a00223.html#ga1f9e9c2ea2768675dff9bae5cde2d829',1,'glm::GLM_ALIGNED_TYPEDEF(i64vec2, aligned_i64vec2, 16)'],['../a00223.html#gad77c317b7d942322cd5be4c8127b3187',1,'glm::GLM_ALIGNED_TYPEDEF(i64vec3, aligned_i64vec3, 32)'],['../a00223.html#ga716f8ea809bdb11b5b542d8b71aeb04f',1,'glm::GLM_ALIGNED_TYPEDEF(i64vec4, aligned_i64vec4, 32)'],['../a00223.html#gad46f8e9082d5878b1bc04f9c1471cdaa',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint8, aligned_lowp_uint8, 1)'],['../a00223.html#ga1246094581af624aca6c7499aaabf801',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint16, aligned_lowp_uint16, 2)'],['../a00223.html#ga7a5009a1d0196bbf21dd7518f61f0249',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint32, aligned_lowp_uint32, 4)'],['../a00223.html#ga45213fd18b3bb1df391671afefe4d1e7',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint64, aligned_lowp_uint64, 8)'],['../a00223.html#ga0ba26b4e3fd9ecbc25358efd68d8a4ca',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint8_t, aligned_lowp_uint8_t, 1)'],['../a00223.html#gaf2b58f5fb6d4ec8ce7b76221d3af43e1',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint16_t, aligned_lowp_uint16_t, 2)'],['../a00223.html#gadc246401847dcba155f0699425e49dcd',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint32_t, aligned_lowp_uint32_t, 4)'],['../a00223.html#gaace64bddf51a9def01498da9a94fb01c',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_uint64_t, aligned_lowp_uint64_t, 8)'],['../a00223.html#gad7bb97c29d664bd86ffb1bed4abc5534',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_u8, aligned_lowp_u8, 1)'],['../a00223.html#ga404bba7785130e0b1384d695a9450b28',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_u16, aligned_lowp_u16, 2)'],['../a00223.html#ga31ba41fd896257536958ec6080203d2a',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_u32, aligned_lowp_u32, 4)'],['../a00223.html#gacca5f13627f57b3505676e40a6e43e5e',1,'glm::GLM_ALIGNED_TYPEDEF(lowp_u64, aligned_lowp_u64, 8)'],['../a00223.html#ga5faf1d3e70bf33174dd7f3d01d5b883b',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint8, aligned_mediump_uint8, 1)'],['../a00223.html#ga727e2bf2c433bb3b0182605860a48363',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint16, aligned_mediump_uint16, 2)'],['../a00223.html#ga12566ca66d5962dadb4a5eb4c74e891e',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint32, aligned_mediump_uint32, 4)'],['../a00223.html#ga7b66a97a8acaa35c5a377b947318c6bc',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint64, aligned_mediump_uint64, 8)'],['../a00223.html#gaa9cde002439b74fa66120a16a9f55fcc',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint8_t, aligned_mediump_uint8_t, 1)'],['../a00223.html#ga1ca98c67f7d1e975f7c5202f1da1df1f',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint16_t, aligned_mediump_uint16_t, 2)'],['../a00223.html#ga1dc8bc6199d785f235576948d80a597c',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint32_t, aligned_mediump_uint32_t, 4)'],['../a00223.html#gad14a0f2ec93519682b73d70b8e401d81',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_uint64_t, aligned_mediump_uint64_t, 8)'],['../a00223.html#gada8b996eb6526dc1ead813bd49539d1b',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_u8, aligned_mediump_u8, 1)'],['../a00223.html#ga28948f6bfb52b42deb9d73ae1ea8d8b0',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_u16, aligned_mediump_u16, 2)'],['../a00223.html#gad6a7c0b5630f89d3f1c5b4ef2919bb4c',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_u32, aligned_mediump_u32, 4)'],['../a00223.html#gaa0fc531cbaa972ac3a0b86d21ef4a7fa',1,'glm::GLM_ALIGNED_TYPEDEF(mediump_u64, aligned_mediump_u64, 8)'],['../a00223.html#ga0ee829f7b754b262bbfe6317c0d678ac',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint8, aligned_highp_uint8, 1)'],['../a00223.html#ga447848a817a626cae08cedc9778b331c',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint16, aligned_highp_uint16, 2)'],['../a00223.html#ga6027ae13b2734f542a6e7beee11b8820',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint32, aligned_highp_uint32, 4)'],['../a00223.html#ga2aca46c8608c95ef991ee4c332acde5f',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint64, aligned_highp_uint64, 8)'],['../a00223.html#gaff50b10dd1c48be324fdaffd18e2c7ea',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint8_t, aligned_highp_uint8_t, 1)'],['../a00223.html#ga9fc4421dbb833d5461e6d4e59dcfde55',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint16_t, aligned_highp_uint16_t, 2)'],['../a00223.html#ga329f1e2b94b33ba5e3918197030bcf03',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint32_t, aligned_highp_uint32_t, 4)'],['../a00223.html#ga71e646f7e301aa422328194162c9c998',1,'glm::GLM_ALIGNED_TYPEDEF(highp_uint64_t, aligned_highp_uint64_t, 8)'],['../a00223.html#ga8942e09f479489441a7a5004c6d8cb66',1,'glm::GLM_ALIGNED_TYPEDEF(highp_u8, aligned_highp_u8, 1)'],['../a00223.html#gaab32497d6e4db16ee439dbedd64c5865',1,'glm::GLM_ALIGNED_TYPEDEF(highp_u16, aligned_highp_u16, 2)'],['../a00223.html#gaaadbb34952eca8e3d7fe122c3e167742',1,'glm::GLM_ALIGNED_TYPEDEF(highp_u32, aligned_highp_u32, 4)'],['../a00223.html#ga92024d27c74a3650afb55ec8e024ed25',1,'glm::GLM_ALIGNED_TYPEDEF(highp_u64, aligned_highp_u64, 8)'],['../a00223.html#gabde1d0b4072df35453db76075ab896a6',1,'glm::GLM_ALIGNED_TYPEDEF(uint8, aligned_uint8, 1)'],['../a00223.html#ga06c296c9e398b294c8c9dd2a7693dcbb',1,'glm::GLM_ALIGNED_TYPEDEF(uint16, aligned_uint16, 2)'],['../a00223.html#gacf1744488c96ebd33c9f36ad33b2010a',1,'glm::GLM_ALIGNED_TYPEDEF(uint32, aligned_uint32, 4)'],['../a00223.html#ga3328061a64c20ba59d5f9da24c2cd059',1,'glm::GLM_ALIGNED_TYPEDEF(uint64, aligned_uint64, 8)'],['../a00223.html#gaf6ced36f13bae57f377bafa6f5fcc299',1,'glm::GLM_ALIGNED_TYPEDEF(uint8_t, aligned_uint8_t, 1)'],['../a00223.html#gafbc7fb7847bfc78a339d1d371c915c73',1,'glm::GLM_ALIGNED_TYPEDEF(uint16_t, aligned_uint16_t, 2)'],['../a00223.html#gaa86bc56a73fd8120b1121b5f5e6245ae',1,'glm::GLM_ALIGNED_TYPEDEF(uint32_t, aligned_uint32_t, 4)'],['../a00223.html#ga68c0b9e669060d0eb5ab8c3ddeb483d8',1,'glm::GLM_ALIGNED_TYPEDEF(uint64_t, aligned_uint64_t, 8)'],['../a00223.html#ga4f3bab577daf3343e99cc005134bce86',1,'glm::GLM_ALIGNED_TYPEDEF(u8, aligned_u8, 1)'],['../a00223.html#ga13a2391339d0790d43b76d00a7611c4f',1,'glm::GLM_ALIGNED_TYPEDEF(u16, aligned_u16, 2)'],['../a00223.html#ga197570e03acbc3d18ab698e342971e8f',1,'glm::GLM_ALIGNED_TYPEDEF(u32, aligned_u32, 4)'],['../a00223.html#ga0f033b21e145a1faa32c62ede5878993',1,'glm::GLM_ALIGNED_TYPEDEF(u64, aligned_u64, 8)'],['../a00223.html#ga509af83527f5cd512e9a7873590663aa',1,'glm::GLM_ALIGNED_TYPEDEF(uvec1, aligned_uvec1, 4)'],['../a00223.html#ga94e86186978c502c6dc0c0d9c4a30679',1,'glm::GLM_ALIGNED_TYPEDEF(uvec2, aligned_uvec2, 8)'],['../a00223.html#ga5cec574686a7f3c8ed24bb195c5e2d0a',1,'glm::GLM_ALIGNED_TYPEDEF(uvec3, aligned_uvec3, 16)'],['../a00223.html#ga47edfdcee9c89b1ebdaf20450323b1d4',1,'glm::GLM_ALIGNED_TYPEDEF(uvec4, aligned_uvec4, 16)'],['../a00223.html#ga5611d6718e3a00096918a64192e73a45',1,'glm::GLM_ALIGNED_TYPEDEF(u8vec1, aligned_u8vec1, 1)'],['../a00223.html#ga19837e6f72b60d994a805ef564c6c326',1,'glm::GLM_ALIGNED_TYPEDEF(u8vec2, aligned_u8vec2, 2)'],['../a00223.html#ga9740cf8e34f068049b42a2753f9601c2',1,'glm::GLM_ALIGNED_TYPEDEF(u8vec3, aligned_u8vec3, 4)'],['../a00223.html#ga8b8588bb221448f5541a858903822a57',1,'glm::GLM_ALIGNED_TYPEDEF(u8vec4, aligned_u8vec4, 4)'],['../a00223.html#ga991abe990c16de26b2129d6bc2f4c051',1,'glm::GLM_ALIGNED_TYPEDEF(u16vec1, aligned_u16vec1, 2)'],['../a00223.html#gac01bb9fc32a1cd76c2b80d030f71df4c',1,'glm::GLM_ALIGNED_TYPEDEF(u16vec2, aligned_u16vec2, 4)'],['../a00223.html#ga09540dbca093793a36a8997e0d4bee77',1,'glm::GLM_ALIGNED_TYPEDEF(u16vec3, aligned_u16vec3, 8)'],['../a00223.html#gaecafb5996f5a44f57e34d29c8670741e',1,'glm::GLM_ALIGNED_TYPEDEF(u16vec4, aligned_u16vec4, 8)'],['../a00223.html#gac6b161a04d2f8408fe1c9d857e8daac0',1,'glm::GLM_ALIGNED_TYPEDEF(u32vec1, aligned_u32vec1, 4)'],['../a00223.html#ga1fa0dfc8feb0fa17dab2acd43e05342b',1,'glm::GLM_ALIGNED_TYPEDEF(u32vec2, aligned_u32vec2, 8)'],['../a00223.html#ga0019500abbfa9c66eff61ca75eaaed94',1,'glm::GLM_ALIGNED_TYPEDEF(u32vec3, aligned_u32vec3, 16)'],['../a00223.html#ga14fd29d01dae7b08a04e9facbcc18824',1,'glm::GLM_ALIGNED_TYPEDEF(u32vec4, aligned_u32vec4, 16)'],['../a00223.html#gab253845f534a67136f9619843cade903',1,'glm::GLM_ALIGNED_TYPEDEF(u64vec1, aligned_u64vec1, 8)'],['../a00223.html#ga929427a7627940cdf3304f9c050b677d',1,'glm::GLM_ALIGNED_TYPEDEF(u64vec2, aligned_u64vec2, 16)'],['../a00223.html#gae373b6c04fdf9879f33d63e6949c037e',1,'glm::GLM_ALIGNED_TYPEDEF(u64vec3, aligned_u64vec3, 32)'],['../a00223.html#ga53a8a03dca2015baec4584f45b8e9cdc',1,'glm::GLM_ALIGNED_TYPEDEF(u64vec4, aligned_u64vec4, 32)'],['../a00223.html#gab3301bae94ef5bf59fbdd9a24e7d2a01',1,'glm::GLM_ALIGNED_TYPEDEF(float32, aligned_float32, 4)'],['../a00223.html#ga75930684ff2233171c573e603f216162',1,'glm::GLM_ALIGNED_TYPEDEF(float64, aligned_float64, 8)'],['../a00223.html#gada9b0bea273d3ae0286f891533b9568f',1,'glm::GLM_ALIGNED_TYPEDEF(float32_t, aligned_float32_t, 4)'],['../a00223.html#ga6e3a2d83b131336219a0f4c7cbba2a48',1,'glm::GLM_ALIGNED_TYPEDEF(float64_t, aligned_float64_t, 8)'],['../a00223.html#gadbce23b9f23d77bb3884e289a574ebd5',1,'glm::GLM_ALIGNED_TYPEDEF(float32, aligned_f32, 4)'],['../a00223.html#gaa4deaa0dea930c393d55e7a4352b0a20',1,'glm::GLM_ALIGNED_TYPEDEF(float64, aligned_f64, 8)'],['../a00223.html#ga81bc497b2bfc6f80bab690c6ee28f0f9',1,'glm::GLM_ALIGNED_TYPEDEF(vec1, aligned_vec1, 4)'],['../a00223.html#gada3e8f783e9d4b90006695a16c39d4d4',1,'glm::GLM_ALIGNED_TYPEDEF(vec2, aligned_vec2, 8)'],['../a00223.html#gab8d081fac3a38d6f55fa552f32168d32',1,'glm::GLM_ALIGNED_TYPEDEF(vec3, aligned_vec3, 16)'],['../a00223.html#ga12fe7b9769c964c5b48dcfd8b7f40198',1,'glm::GLM_ALIGNED_TYPEDEF(vec4, aligned_vec4, 16)'],['../a00223.html#gaefab04611c7f8fe1fd9be3071efea6cc',1,'glm::GLM_ALIGNED_TYPEDEF(fvec1, aligned_fvec1, 4)'],['../a00223.html#ga2543c05ba19b3bd19d45b1227390c5b4',1,'glm::GLM_ALIGNED_TYPEDEF(fvec2, aligned_fvec2, 8)'],['../a00223.html#ga009afd727fd657ef33a18754d6d28f60',1,'glm::GLM_ALIGNED_TYPEDEF(fvec3, aligned_fvec3, 16)'],['../a00223.html#ga2f26177e74bfb301a3d0e02ec3c3ef53',1,'glm::GLM_ALIGNED_TYPEDEF(fvec4, aligned_fvec4, 16)'],['../a00223.html#ga309f495a1d6b75ddf195b674b65cb1e4',1,'glm::GLM_ALIGNED_TYPEDEF(f32vec1, aligned_f32vec1, 4)'],['../a00223.html#ga5e185865a2217d0cd47187644683a8c3',1,'glm::GLM_ALIGNED_TYPEDEF(f32vec2, aligned_f32vec2, 8)'],['../a00223.html#gade4458b27b039b9ca34f8ec049f3115a',1,'glm::GLM_ALIGNED_TYPEDEF(f32vec3, aligned_f32vec3, 16)'],['../a00223.html#ga2e8a12c5e6a9c4ae4ddaeda1d1cffe3b',1,'glm::GLM_ALIGNED_TYPEDEF(f32vec4, aligned_f32vec4, 16)'],['../a00223.html#ga3e0f35fa0c626285a8bad41707e7316c',1,'glm::GLM_ALIGNED_TYPEDEF(dvec1, aligned_dvec1, 8)'],['../a00223.html#ga78bfec2f185d1d365ea0a9ef1e3d45b8',1,'glm::GLM_ALIGNED_TYPEDEF(dvec2, aligned_dvec2, 16)'],['../a00223.html#ga01fe6fee6db5df580b6724a7e681f069',1,'glm::GLM_ALIGNED_TYPEDEF(dvec3, aligned_dvec3, 32)'],['../a00223.html#ga687d5b8f551d5af32425c0b2fba15e99',1,'glm::GLM_ALIGNED_TYPEDEF(dvec4, aligned_dvec4, 32)'],['../a00223.html#ga8e842371d46842ff8f1813419ba49d0f',1,'glm::GLM_ALIGNED_TYPEDEF(f64vec1, aligned_f64vec1, 8)'],['../a00223.html#ga32814aa0f19316b43134fc25f2aad2b9',1,'glm::GLM_ALIGNED_TYPEDEF(f64vec2, aligned_f64vec2, 16)'],['../a00223.html#gaf3d3bbc1e93909b689123b085e177a14',1,'glm::GLM_ALIGNED_TYPEDEF(f64vec3, aligned_f64vec3, 32)'],['../a00223.html#ga804c654cead1139bd250f90f9bb01fad',1,'glm::GLM_ALIGNED_TYPEDEF(f64vec4, aligned_f64vec4, 32)'],['../a00223.html#gafed7d010235a3aa7ea2f88646858f2ae',1,'glm::GLM_ALIGNED_TYPEDEF(mat2, aligned_mat2, 16)'],['../a00223.html#ga17f911ee7b78ca6d1b91c4ab51ddb73c',1,'glm::GLM_ALIGNED_TYPEDEF(mat3, aligned_mat3, 16)'],['../a00223.html#ga31940e6012b72110e26fdb0f54805033',1,'glm::GLM_ALIGNED_TYPEDEF(mat4, aligned_mat4, 16)'],['../a00223.html#ga01de96cd0b541c52d2b4a3faf65822e9',1,'glm::GLM_ALIGNED_TYPEDEF(mat2x2, aligned_mat2x2, 16)'],['../a00223.html#gac88a191b004bd341e64fc53b5a4d00e3',1,'glm::GLM_ALIGNED_TYPEDEF(mat3x3, aligned_mat3x3, 16)'],['../a00223.html#gabe8c745fa2ced44a600a6e3f19991161',1,'glm::GLM_ALIGNED_TYPEDEF(mat4x4, aligned_mat4x4, 16)'],['../a00223.html#ga719da577361541a4c43a2dd1d0e361e1',1,'glm::GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2, 16)'],['../a00223.html#ga6e7ee4f541e1d7db66cd1a224caacafb',1,'glm::GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3, 16)'],['../a00223.html#gae5d672d359f2a39f63f98c7975057486',1,'glm::GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4, 16)'],['../a00223.html#ga6fa2df037dbfc5fe8c8e0b4db8a34953',1,'glm::GLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2x2, 16)'],['../a00223.html#ga0743b4f4f69a3227b82ff58f6abbad62',1,'glm::GLM_ALIGNED_TYPEDEF(fmat2x3, aligned_fmat2x3, 16)'],['../a00223.html#ga1a76b325fdf70f961d835edd182c63dd',1,'glm::GLM_ALIGNED_TYPEDEF(fmat2x4, aligned_fmat2x4, 16)'],['../a00223.html#ga4b4e181cd041ba28c3163e7b8074aef0',1,'glm::GLM_ALIGNED_TYPEDEF(fmat3x2, aligned_fmat3x2, 16)'],['../a00223.html#ga27b13f465abc8a40705698145e222c3f',1,'glm::GLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3x3, 16)'],['../a00223.html#ga2608d19cc275830a6f8c0b6405625a4f',1,'glm::GLM_ALIGNED_TYPEDEF(fmat3x4, aligned_fmat3x4, 16)'],['../a00223.html#ga93f09768241358a287c4cca538f1f7e7',1,'glm::GLM_ALIGNED_TYPEDEF(fmat4x2, aligned_fmat4x2, 16)'],['../a00223.html#ga7c117e3ecca089e10247b1d41d88aff9',1,'glm::GLM_ALIGNED_TYPEDEF(fmat4x3, aligned_fmat4x3, 16)'],['../a00223.html#ga07c75cd04ba42dc37fa3e105f89455c5',1,'glm::GLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4x4, 16)'],['../a00223.html#ga65ff0d690a34a4d7f46f9b2eb51525ee',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2, 16)'],['../a00223.html#gadd8ddbe2bf65ccede865ba2f510176dc',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3, 16)'],['../a00223.html#gaf18dbff14bf13d3ff540c517659ec045',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4, 16)'],['../a00223.html#ga66339f6139bf7ff19e245beb33f61cc8',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2x2, 16)'],['../a00223.html#ga1558a48b3934011b52612809f443e46d',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat2x3, aligned_f32mat2x3, 16)'],['../a00223.html#gaa52e5732daa62851627021ad551c7680',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat2x4, aligned_f32mat2x4, 16)'],['../a00223.html#gac09663c42566bcb58d23c6781ac4e85a',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat3x2, aligned_f32mat3x2, 16)'],['../a00223.html#ga3f510999e59e1b309113e1d561162b29',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3x3, 16)'],['../a00223.html#ga2c9c94f0c89cd71ce56551db6cf4aaec',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat3x4, aligned_f32mat3x4, 16)'],['../a00223.html#ga99ce8274c750fbfdf0e70c95946a2875',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat4x2, aligned_f32mat4x2, 16)'],['../a00223.html#ga9476ef66790239df53dbe66f3989c3b5',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat4x3, aligned_f32mat4x3, 16)'],['../a00223.html#gacc429b3b0b49921e12713b6d31e14e1d',1,'glm::GLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4x4, 16)'],['../a00223.html#ga88f6c6fa06e6e64479763e69444669cf',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2, 32)'],['../a00223.html#gaae8e4639c991e64754145ab8e4c32083',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3, 32)'],['../a00223.html#ga6e9094f3feb3b5b49d0f83683a101fde',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4, 32)'],['../a00223.html#gadbd2c639c03de1c3e9591b5a39f65559',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2x2, 32)'],['../a00223.html#gab059d7b9fe2094acc563b7223987499f',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat2x3, aligned_f64mat2x3, 32)'],['../a00223.html#gabbc811d1c52ed2b8cfcaff1378f75c69',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat2x4, aligned_f64mat2x4, 32)'],['../a00223.html#ga9ddf5212777734d2fd841a84439f3bdf',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat3x2, aligned_f64mat3x2, 32)'],['../a00223.html#gad1dda32ed09f94bfcf0a7d8edfb6cf13',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3x3, 32)'],['../a00223.html#ga5875e0fa72f07e271e7931811cbbf31a',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat3x4, aligned_f64mat3x4, 32)'],['../a00223.html#ga41e82cd6ac07f912ba2a2d45799dcf0d',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat4x2, aligned_f64mat4x2, 32)'],['../a00223.html#ga0892638d6ba773043b3d63d1d092622e',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat4x3, aligned_f64mat4x3, 32)'],['../a00223.html#ga912a16432608b822f1e13607529934c1',1,'glm::GLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4x4, 32)'],['../a00223.html#gafd945a8ea86b042aba410e0560df9a3d',1,'glm::GLM_ALIGNED_TYPEDEF(quat, aligned_quat, 16)'],['../a00223.html#gad8c4bfacff70e57dc8303634c8bfce35',1,'glm::GLM_ALIGNED_TYPEDEF(fquat, aligned_fquat, 16)'],['../a00223.html#gaabc28c84a3288b697605d4688686f9a9',1,'glm::GLM_ALIGNED_TYPEDEF(dquat, aligned_dquat, 32)'],['../a00223.html#ga1ed8aeb5ca67fade269a46105f1bf273',1,'glm::GLM_ALIGNED_TYPEDEF(f32quat, aligned_f32quat, 16)'],['../a00223.html#ga95cc03b8b475993fa50e05e38e203303',1,'glm::GLM_ALIGNED_TYPEDEF(f64quat, aligned_f64quat, 32)']]],\n  ['golden_5fratio',['golden_ratio',['../a00151.html#ga748cf8642830657c5b7eae04d0a80899',1,'glm']]],\n  ['greaterthan',['greaterThan',['../a00160.html#ga3f2720e2d77ec39186415f85ecd9cad0',1,'glm::greaterThan(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#gad3a3a7d228da3754c328c9a778f6df56',1,'glm::greaterThan(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['greaterthanequal',['greaterThanEqual',['../a00160.html#ga293cb3175d9ad290deaf50984716fd44',1,'glm::greaterThanEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#ga271038c5290184127754bda0ae91a5bd',1,'glm::greaterThanEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_7.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_7.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_7.js",
    "content": "var searchData=\n[\n  ['half_5fpi',['half_pi',['../a00151.html#ga0c36b41d462e45641faf7d7938948bac',1,'glm']]],\n  ['hermite',['hermite',['../a00218.html#gaa69e143f6374d32f934a8edeaa50bac9',1,'glm']]],\n  ['highestbitvalue',['highestBitValue',['../a00170.html#ga0dcc8fe7c3d3ad60dea409281efa3d05',1,'glm::highestBitValue(genIUType Value)'],['../a00170.html#ga898ef075ccf809a1e480faab48fe96bf',1,'glm::highestBitValue(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['hsvcolor',['hsvColor',['../a00173.html#ga789802bec2d4fe0f9741c731b4a8a7d8',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_8.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_8.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_8.js",
    "content": "var searchData=\n[\n  ['imulextended',['imulExtended',['../a00229.html#gac0c510a70e852f57594a9141848642e3',1,'glm']]],\n  ['infiniteperspective',['infinitePerspective',['../a00157.html#ga44fa38a18349450325cae2661bb115ca',1,'glm']]],\n  ['infiniteperspectivelh',['infinitePerspectiveLH',['../a00157.html#ga3201b30f5b3ea0f933246d87bfb992a9',1,'glm']]],\n  ['infiniteperspectiverh',['infinitePerspectiveRH',['../a00157.html#ga99672ffe5714ef478dab2437255fe7e1',1,'glm']]],\n  ['intbitstofloat',['intBitsToFloat',['../a00140.html#ga4fb7c21c2dce064b26fd9ccdaf9adcd4',1,'glm::intBitsToFloat(int const &amp;v)'],['../a00140.html#ga7a0a8291a1cf3e1c2aee33030a1bd7b0',1,'glm::intBitsToFloat(vec&lt; L, int, Q &gt; const &amp;v)']]],\n  ['intermediate',['intermediate',['../a00212.html#gac9be2084562a52ae8923813233563a28',1,'glm']]],\n  ['interpolate',['interpolate',['../a00197.html#gad5fc63a2e084000b39f6508ab07421a5',1,'glm']]],\n  ['intersectlinesphere',['intersectLineSphere',['../a00191.html#ga9c68139f3d8a4f3d7fe45f9dbc0de5b7',1,'glm']]],\n  ['intersectlinetriangle',['intersectLineTriangle',['../a00191.html#ga9d29b9b3acb504d43986502f42740df4',1,'glm']]],\n  ['intersectrayplane',['intersectRayPlane',['../a00191.html#gad3697a9700ea379739a667ea02573488',1,'glm']]],\n  ['intersectraysphere',['intersectRaySphere',['../a00191.html#gac88f8cd84c4bcb5b947d56acbbcfa56e',1,'glm::intersectRaySphere(genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, typename genType::value_type const sphereRadiusSquered, typename genType::value_type &amp;intersectionDistance)'],['../a00191.html#gad28c00515b823b579c608aafa1100c1d',1,'glm::intersectRaySphere(genType const &amp;rayStarting, genType const &amp;rayNormalizedDirection, genType const &amp;sphereCenter, const typename genType::value_type sphereRadius, genType &amp;intersectionPosition, genType &amp;intersectionNormal)']]],\n  ['intersectraytriangle',['intersectRayTriangle',['../a00191.html#ga62e2b3c67ff9e95c04e39383920a9c27',1,'glm']]],\n  ['inverse',['inverse',['../a00230.html#gacc53488cd254cbe33d1b505a72ef3719',1,'glm::inverse(mat&lt; C, R, T, Q &gt; const &amp;m)'],['../a00160.html#gadc59b59ce71daa5586a64a6acf36c072',1,'glm::inverse(tquat&lt; T, Q &gt; const &amp;q)'],['../a00178.html#ga070f521a953f6461af4ab4cf8ccbf27e',1,'glm::inverse(tdualquat&lt; T, Q &gt; const &amp;q)']]],\n  ['inversesqrt',['inversesqrt',['../a00141.html#ga523dd6bd0ad9f75ae2d24c8e4b017b7a',1,'glm']]],\n  ['inversetranspose',['inverseTranspose',['../a00156.html#gab213cd0e3ead5f316d583f99d6312008',1,'glm']]],\n  ['iround',['iround',['../a00153.html#ga57824268ebe13a922f1d69a5d37f637f',1,'glm']]],\n  ['iscompnull',['isCompNull',['../a00227.html#gaf6ec1688eab7442fe96fe4941d5d4e76',1,'glm']]],\n  ['isdenormal',['isdenormal',['../a00175.html#ga74aa7c7462245d83bd5a9edf9c6c2d91',1,'glm']]],\n  ['isfinite',['isfinite',['../a00176.html#gaf4b04dcd3526996d68c1bfe17bfc8657',1,'glm::isfinite(genType const &amp;x)'],['../a00176.html#gac3b12b8ac3014418fe53c299478b6603',1,'glm::isfinite(const vec&lt; 1, T, Q &gt; &amp;x)'],['../a00176.html#ga8e76dc3e406ce6a4155c2b12a2e4b084',1,'glm::isfinite(const vec&lt; 2, T, Q &gt; &amp;x)'],['../a00176.html#ga929ef27f896d902c1771a2e5e150fc97',1,'glm::isfinite(const vec&lt; 3, T, Q &gt; &amp;x)'],['../a00176.html#ga19925badbe10ce61df1d0de00be0b5ad',1,'glm::isfinite(const vec&lt; 4, T, Q &gt; &amp;x)']]],\n  ['isidentity',['isIdentity',['../a00200.html#gaee935d145581c82e82b154ccfd78ad91',1,'glm']]],\n  ['isinf',['isinf',['../a00140.html#ga2885587c23a106301f20443896365b62',1,'glm::isinf(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00160.html#ga139abc0f7f89553e341f8be95bf8d3cb',1,'glm::isinf(tquat&lt; T, Q &gt; const &amp;x)']]],\n  ['ismultiple',['isMultiple',['../a00163.html#gaf7444a7b2eb524f373463ceba76b9326',1,'glm::isMultiple(genIUType Value, genIUType Multiple)'],['../a00163.html#ga908a61945ecb235817a9a87b249d4b2d',1,'glm::isMultiple(vec&lt; L, T, Q &gt; const &amp;Value, T Multiple)'],['../a00163.html#ga12b5f07c3ed46acc6838f159ca6ef368',1,'glm::isMultiple(vec&lt; L, T, Q &gt; const &amp;Value, vec&lt; L, T, Q &gt; const &amp;Multiple)']]],\n  ['isnan',['isnan',['../a00140.html#ga29ef934c00306490de837b4746b4e14d',1,'glm::isnan(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00160.html#ga31f4378ab97985177e208f4f4f8b1fd3',1,'glm::isnan(tquat&lt; T, Q &gt; const &amp;x)']]],\n  ['isnormalized',['isNormalized',['../a00200.html#gae785af56f47ce220a1609f7f84aa077a',1,'glm::isNormalized(mat&lt; 2, 2, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00200.html#gaa068311695f28f5f555f5f746a6a66fb',1,'glm::isNormalized(mat&lt; 3, 3, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00200.html#ga4d9bb4d0465df49fedfad79adc6ce4ad',1,'glm::isNormalized(mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00227.html#gac3c974f459fd75453134fad7ae89a39e',1,'glm::isNormalized(vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)']]],\n  ['isnull',['isNull',['../a00200.html#ga9790ec222ce948c0ff0d8ce927340dba',1,'glm::isNull(mat&lt; 2, 2, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00200.html#gae14501c6b14ccda6014cc5350080103d',1,'glm::isNull(mat&lt; 3, 3, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00200.html#ga2b98bb30a9fefa7cdea5f1dcddba677b',1,'glm::isNull(mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;epsilon)'],['../a00227.html#gab4a3637dbcb4bb42dc55caea7a1e0495',1,'glm::isNull(vec&lt; L, T, Q &gt; const &amp;v, T const &amp;epsilon)']]],\n  ['isorthogonal',['isOrthogonal',['../a00200.html#ga58f3289f74dcab653387dd78ad93ca40',1,'glm']]],\n  ['ispoweroftwo',['isPowerOfTwo',['../a00163.html#gaebf826fbb6e0a70eeaab0792d89b25ec',1,'glm::isPowerOfTwo(genIUType Value)'],['../a00163.html#ga866a7bbd725d7d40b5d433d02bf70f17',1,'glm::isPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_9.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_9.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_9.js",
    "content": "var searchData=\n[\n  ['l1norm',['l1Norm',['../a00203.html#gae2fc0b2aa967bebfd6a244700bff6997',1,'glm::l1Norm(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)'],['../a00203.html#ga1a7491e2037ceeb37f83ce41addfc0be',1,'glm::l1Norm(vec&lt; 3, T, Q &gt; const &amp;v)']]],\n  ['l2norm',['l2Norm',['../a00203.html#ga41340b2ef40a9307ab0f137181565168',1,'glm::l2Norm(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)'],['../a00203.html#gae288bde8f0e41fb4ed62e65137b18cba',1,'glm::l2Norm(vec&lt; 3, T, Q &gt; const &amp;x)']]],\n  ['ldexp',['ldexp',['../a00140.html#ga52e319d7289b849ec92055abd4830533',1,'glm']]],\n  ['lefthanded',['leftHanded',['../a00188.html#ga6f1bad193b9a3b048543d1935cf04dd3',1,'glm']]],\n  ['length',['length',['../a00142.html#ga0cdabbb000834d994a1d6dc56f8f5263',1,'glm::length(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00160.html#gab33f82f8d1c9223d335aab752a126855',1,'glm::length(tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['length2',['length2',['../a00203.html#ga8d1789651050adb7024917984b41c3de',1,'glm::length2(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00212.html#ga229bacc3051770b030042fe266f7b0cb',1,'glm::length2(tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['lerp',['lerp',['../a00160.html#gabc58e7013ef63d6df69c28c14afd0c01',1,'glm::lerp(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)'],['../a00176.html#ga5494ba3a95ea6594c86fc75236886864',1,'glm::lerp(T x, T y, T a)'],['../a00176.html#gaa551c0a0e16d2d4608e49f7696df897f',1,'glm::lerp(const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y, T a)'],['../a00176.html#ga44a8b5fd776320f1713413dec959b32a',1,'glm::lerp(const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y, T a)'],['../a00176.html#ga89ac8e000199292ec7875519d27e214b',1,'glm::lerp(const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, T a)'],['../a00176.html#gaf68de5baf72d16135368b8ef4f841604',1,'glm::lerp(const vec&lt; 2, T, Q &gt; &amp;x, const vec&lt; 2, T, Q &gt; &amp;y, const vec&lt; 2, T, Q &gt; &amp;a)'],['../a00176.html#ga4ae1a616c8540a2649eab8e0cd051bb3',1,'glm::lerp(const vec&lt; 3, T, Q &gt; &amp;x, const vec&lt; 3, T, Q &gt; &amp;y, const vec&lt; 3, T, Q &gt; &amp;a)'],['../a00176.html#gab5477ab69c40de4db5d58d3359529724',1,'glm::lerp(const vec&lt; 4, T, Q &gt; &amp;x, const vec&lt; 4, T, Q &gt; &amp;y, const vec&lt; 4, T, Q &gt; &amp;a)'],['../a00178.html#gace8380112d16d33f520839cb35a4d173',1,'glm::lerp(tdualquat&lt; T, Q &gt; const &amp;x, tdualquat&lt; T, Q &gt; const &amp;y, T const &amp;a)']]],\n  ['lessthan',['lessThan',['../a00160.html#ga627487c769e33f4b9f318f271b75802c',1,'glm::lessThan(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#ga314be073c42278ccb6fe7a7958213824',1,'glm::lessThan(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['lessthanequal',['lessThanEqual',['../a00160.html#ga9e84617bb109bf2eb7f30d7f4ba07ad4',1,'glm::lessThanEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#ga51bf75522dbe1fa5e7806eb9b825ab6a',1,'glm::lessThanEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]],\n  ['lineargradient',['linearGradient',['../a00187.html#ga849241df1e55129b8ce9476200307419',1,'glm']]],\n  ['linearrand',['linearRand',['../a00161.html#ga04e241ab88374a477a2c2ceadd2fa03d',1,'glm::linearRand(genType Min, genType Max)'],['../a00161.html#ga94731130c298a9ff5e5025fdee6d97a0',1,'glm::linearRand(vec&lt; L, T, Q &gt; const &amp;Min, vec&lt; L, T, Q &gt; const &amp;Max)']]],\n  ['ln_5fln_5ftwo',['ln_ln_two',['../a00151.html#gaca94292c839ed31a405ab7a81ae7e850',1,'glm']]],\n  ['ln_5ften',['ln_ten',['../a00151.html#gaf97ebc6c059ffd788e6c4946f71ef66c',1,'glm']]],\n  ['ln_5ftwo',['ln_two',['../a00151.html#ga24f4d27765678116f41a2f336ab7975c',1,'glm']]],\n  ['log',['log',['../a00141.html#ga918c9f3fd086ce20e6760c903bd30fa9',1,'glm::log(vec&lt; L, T, Q &gt; const &amp;v)'],['../a00193.html#ga60a7b0a401da660869946b2b77c710c9',1,'glm::log(genType const &amp;x, genType const &amp;base)'],['../a00212.html#gaad510f1a4ea26994b341c094ec4f4eed',1,'glm::log(tquat&lt; T, Q &gt; const &amp;q)']]],\n  ['log2',['log2',['../a00141.html#ga82831c7d9cca777cebedfe03a19c8d75',1,'glm::log2(vec&lt; L, T, Q &gt; const &amp;v)'],['../a00153.html#ga9bd682e74bfacb005c735305207ec417',1,'glm::log2(genIUType x)']]],\n  ['lookat',['lookAt',['../a00157.html#gaa64aa951a0e99136bba9008d2b59c78e',1,'glm']]],\n  ['lookatlh',['lookAtLH',['../a00157.html#gab2c09e25b0a16d3a9d89cc85bbae41b0',1,'glm']]],\n  ['lookatrh',['lookAtRH',['../a00157.html#gacfa12c8889c754846bc20c65d9b5c701',1,'glm']]],\n  ['lowestbitvalue',['lowestBitValue',['../a00170.html#ga2ff6568089f3a9b67f5c30918855fc6f',1,'glm']]],\n  ['luminosity',['luminosity',['../a00173.html#gad028e0a4f1a9c812b39439b746295b34',1,'glm']]],\n  ['lxnorm',['lxNorm',['../a00203.html#gacad23d30497eb16f67709f2375d1f66a',1,'glm::lxNorm(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, unsigned int Depth)'],['../a00203.html#gac61b6d81d796d6eb4d4183396a19ab91',1,'glm::lxNorm(vec&lt; 3, T, Q &gt; const &amp;x, unsigned int Depth)']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_a.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_a.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_a.js",
    "content": "var searchData=\n[\n  ['make_5fmat2',['make_mat2',['../a00166.html#ga04409e74dc3da251d2501acf5b4b546c',1,'glm']]],\n  ['make_5fmat2x2',['make_mat2x2',['../a00166.html#gae49e1c7bcd5abec74d1c34155031f663',1,'glm']]],\n  ['make_5fmat2x3',['make_mat2x3',['../a00166.html#ga21982104164789cf8985483aaefc25e8',1,'glm']]],\n  ['make_5fmat2x4',['make_mat2x4',['../a00166.html#ga078b862c90b0e9a79ed43a58997d8388',1,'glm']]],\n  ['make_5fmat3',['make_mat3',['../a00166.html#ga611ee7c4d4cadfc83a8fa8e1d10a170f',1,'glm']]],\n  ['make_5fmat3x2',['make_mat3x2',['../a00166.html#ga27a24e121dc39e6857620e0f85b6e1a8',1,'glm']]],\n  ['make_5fmat3x3',['make_mat3x3',['../a00166.html#gaf2e8337b15c3362aaeb6e5849e1c0536',1,'glm']]],\n  ['make_5fmat3x4',['make_mat3x4',['../a00166.html#ga05dd66232aedb993e3b8e7b35eaf932b',1,'glm']]],\n  ['make_5fmat4',['make_mat4',['../a00166.html#gae7bcedb710d1446c87fd1fc93ed8ee9a',1,'glm']]],\n  ['make_5fmat4x2',['make_mat4x2',['../a00166.html#ga8b34c9b25bf3310d8ff9c828c7e2d97c',1,'glm']]],\n  ['make_5fmat4x3',['make_mat4x3',['../a00166.html#ga0330bf6640092d7985fac92927bbd42b',1,'glm']]],\n  ['make_5fmat4x4',['make_mat4x4',['../a00166.html#ga8f084be30e404844bfbb4a551ac2728c',1,'glm']]],\n  ['make_5fquat',['make_quat',['../a00166.html#gaadafb6600af2633e4c98cc64c72f5269',1,'glm']]],\n  ['make_5fvec2',['make_vec2',['../a00166.html#ga81253cf7b0ebfbb1e70540c5774e6824',1,'glm']]],\n  ['make_5fvec3',['make_vec3',['../a00166.html#gad9e0d36ff489cb30c65ad1fa40351651',1,'glm']]],\n  ['make_5fvec4',['make_vec4',['../a00166.html#ga63f576518993efc22a969f18f80e29bb',1,'glm']]],\n  ['mask',['mask',['../a00149.html#gad7eba518a0b71662114571ee76939f8a',1,'glm::mask(genIUType Bits)'],['../a00149.html#ga2e64e3b922a296033b825311e7f5fff1',1,'glm::mask(vec&lt; L, T, Q &gt; const &amp;v)']]],\n  ['mat2x4_5fcast',['mat2x4_cast',['../a00178.html#gae99d143b37f9cad4cd9285571aab685a',1,'glm']]],\n  ['mat3_5fcast',['mat3_cast',['../a00160.html#ga6e88f15c94effe737c876d21ea0db101',1,'glm']]],\n  ['mat3x4_5fcast',['mat3x4_cast',['../a00178.html#gaf59f5bb69620d2891c3795c6f2639179',1,'glm']]],\n  ['mat4_5fcast',['mat4_cast',['../a00160.html#ga8e2085f17cd5aae423c04536524f11b3',1,'glm']]],\n  ['matrixcompmult',['matrixCompMult',['../a00230.html#gaf14569404c779fedca98d0b9b8e58c1f',1,'glm']]],\n  ['matrixcross3',['matrixCross3',['../a00194.html#ga5802386bb4c37b3332a3b6fd8b6960ff',1,'glm']]],\n  ['matrixcross4',['matrixCross4',['../a00194.html#ga20057fff91ddafa102934adb25458cde',1,'glm']]],\n  ['max',['max',['../a00140.html#ga98caa7f95a94c86a86ebce893a45326c',1,'glm::max(genType x, genType y)'],['../a00140.html#gae8b0964d30deabd0867b8d7ac44f067e',1,'glm::max(vec&lt; L, T, Q &gt; const &amp;x, T y)'],['../a00140.html#gad48b723358c68d45477c22ff0101985e',1,'glm::max(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00181.html#ga04991ccb9865c4c4e58488cfb209ce69',1,'glm::max(T const &amp;x, T const &amp;y, T const &amp;z)'],['../a00181.html#gae1b7bbe5c91de4924835ea3e14530744',1,'glm::max(C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z)'],['../a00181.html#gaf832e9d4ab4826b2dda2fda25935a3a4',1,'glm::max(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z)'],['../a00181.html#ga78e04a0cef1c4863fcae1a2130500d87',1,'glm::max(T const &amp;x, T const &amp;y, T const &amp;z, T const &amp;w)'],['../a00181.html#ga7cca8b53cfda402040494cdf40fbdf4a',1,'glm::max(C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z, typename C&lt; T &gt;::T const &amp;w)'],['../a00181.html#gaacffbc466c2d08c140b181e7fd8a4858',1,'glm::max(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)']]],\n  ['min',['min',['../a00140.html#ga2c2bde1cec025b7ddff83c74a1113719',1,'glm::min(genType x, genType y)'],['../a00140.html#ga2d274e8b537c173dba983331a2620736',1,'glm::min(vec&lt; L, T, Q &gt; const &amp;x, T y)'],['../a00140.html#ga734a374ca5c808e7bd9f74b6acfd7478',1,'glm::min(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00181.html#ga713d3f9b3e76312c0d314e0c8611a6a6',1,'glm::min(T const &amp;x, T const &amp;y, T const &amp;z)'],['../a00181.html#ga74d1a96e7cdbac40f6d35142d3bcbbd4',1,'glm::min(C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z)'],['../a00181.html#ga42b5c3fc027fd3d9a50d2ccc9126d9f0',1,'glm::min(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z)'],['../a00181.html#ga95466987024d03039607f09e69813d69',1,'glm::min(T const &amp;x, T const &amp;y, T const &amp;z, T const &amp;w)'],['../a00181.html#ga4fe35dd31dd0c45693c9b60b830b8d47',1,'glm::min(C&lt; T &gt; const &amp;x, typename C&lt; T &gt;::T const &amp;y, typename C&lt; T &gt;::T const &amp;z, typename C&lt; T &gt;::T const &amp;w)'],['../a00181.html#ga7471ea4159eed8dd9ea4ac5d46c2fead',1,'glm::min(C&lt; T &gt; const &amp;x, C&lt; T &gt; const &amp;y, C&lt; T &gt; const &amp;z, C&lt; T &gt; const &amp;w)']]],\n  ['mirrorclamp',['mirrorClamp',['../a00228.html#gaa6856a0a048d2749252848da35e10c8b',1,'glm']]],\n  ['mirrorrepeat',['mirrorRepeat',['../a00228.html#ga16a89b0661b60d5bea85137bbae74d73',1,'glm']]],\n  ['mix',['mix',['../a00140.html#ga8e93f374aae27d1a88b921860351f8d4',1,'glm::mix(genTypeT x, genTypeT y, genTypeU a)'],['../a00160.html#ga6c31ccbb8548b2b24226901e602dfc0a',1,'glm::mix(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y, T a)']]],\n  ['mixedproduct',['mixedProduct',['../a00202.html#gab3c6048fbb67f7243b088a4fee48d020',1,'glm']]],\n  ['mod',['mod',['../a00140.html#ga12201563ef902e3b07e0d1d7656efdb1',1,'glm::mod(genType x, genType y)'],['../a00140.html#gad32bcde4977c7a42c80468f4061a1f55',1,'glm::mod(vec&lt; L, T, Q &gt; const &amp;x, T y)'],['../a00140.html#ga5f8acc481ba553dc0e6be1aedf1ee61c',1,'glm::mod(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)'],['../a00153.html#ga75c6fd2a143fc44e5f7b871abad539e0',1,'glm::mod(genIUType x, genIUType y)'],['../a00190.html#gaabfbb41531ab7ad8d06fc176edfba785',1,'glm::mod(int x, int y)'],['../a00190.html#ga63fc8d63e7da1706439233b386ba8b6f',1,'glm::mod(uint x, uint y)']]],\n  ['modf',['modf',['../a00140.html#ga85e33f139b8db1b39b590a5713b9e679',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_b.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_b.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_b.js",
    "content": "var searchData=\n[\n  ['next_5ffloat',['next_float',['../a00167.html#gae516ae554faa6117660828240e8bdaf0',1,'glm::next_float(genType const &amp;x)'],['../a00167.html#gad107ec3d9697ef82032a33338a73ebdd',1,'glm::next_float(genType const &amp;x, uint const &amp;Distance)']]],\n  ['nlz',['nlz',['../a00190.html#ga78dff8bdb361bf0061194c93e003d189',1,'glm']]],\n  ['normalize',['normalize',['../a00142.html#ga3b8d3dcae77870781392ed2902cce597',1,'glm::normalize(vec&lt; L, T, Q &gt; const &amp;x)'],['../a00160.html#gad4f3769e33c18d1897d1857c1f8da864',1,'glm::normalize(tquat&lt; T, Q &gt; const &amp;q)'],['../a00178.html#ga299b8641509606b1958ffa104a162cfe',1,'glm::normalize(tdualquat&lt; T, Q &gt; const &amp;q)']]],\n  ['normalizedot',['normalizeDot',['../a00205.html#gacb140a2b903115d318c8b0a2fb5a5daa',1,'glm']]],\n  ['not_5f',['not_',['../a00233.html#ga464f1392c934f69a917ab8bb6eda5b09',1,'glm']]],\n  ['notequal',['notEqual',['../a00160.html#ga9494ec3489041958a240963a8a0ac9a0',1,'glm::notEqual(tquat&lt; T, Q &gt; const &amp;x, tquat&lt; T, Q &gt; const &amp;y)'],['../a00233.html#gac5a72a973c81dc697dd8bb5d218e8251',1,'glm::notEqual(vec&lt; L, T, Q &gt; const &amp;x, vec&lt; L, T, Q &gt; const &amp;y)']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_c.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_c.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_c.js",
    "content": "var searchData=\n[\n  ['one',['one',['../a00151.html#ga39c2fb227631ca25894326529bdd1ee5',1,'glm']]],\n  ['one_5fover_5fpi',['one_over_pi',['../a00151.html#ga555150da2b06d23c8738981d5013e0eb',1,'glm']]],\n  ['one_5fover_5froot_5ftwo',['one_over_root_two',['../a00151.html#ga788fa23a0939bac4d1d0205fb4f35818',1,'glm']]],\n  ['one_5fover_5ftwo_5fpi',['one_over_two_pi',['../a00151.html#ga7c922b427986cbb2e4c6ac69874eefbc',1,'glm']]],\n  ['orientate2',['orientate2',['../a00179.html#gae16738a9f1887cf4e4db6a124637608d',1,'glm']]],\n  ['orientate3',['orientate3',['../a00179.html#ga7ca98668a5786f19c7b38299ebbc9b4c',1,'glm::orientate3(T const &amp;angle)'],['../a00179.html#ga7238c8e15c7720e3ca6a45ab151eeabb',1,'glm::orientate3(vec&lt; 3, T, Q &gt; const &amp;angles)']]],\n  ['orientate4',['orientate4',['../a00179.html#ga4a044653f71a4ecec68e0b623382b48a',1,'glm']]],\n  ['orientation',['orientation',['../a00216.html#ga1a32fceb71962e6160e8af295c91930a',1,'glm']]],\n  ['orientedangle',['orientedAngle',['../a00226.html#ga9556a803dce87fe0f42fdabe4ebba1d5',1,'glm::orientedAngle(vec&lt; 2, T, Q &gt; const &amp;x, vec&lt; 2, T, Q &gt; const &amp;y)'],['../a00226.html#ga706fce3d111f485839756a64f5a48553',1,'glm::orientedAngle(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y, vec&lt; 3, T, Q &gt; const &amp;ref)']]],\n  ['ortho',['ortho',['../a00157.html#ga6615d8a9d39432e279c4575313ecb456',1,'glm::ortho(T left, T right, T bottom, T top, T zNear, T zFar)'],['../a00157.html#gae5b6b40ed882cd56cd7cb97701909c06',1,'glm::ortho(T left, T right, T bottom, T top)']]],\n  ['ortholh',['orthoLH',['../a00157.html#gad122a79aadaa5529cec4ac197203db7f',1,'glm']]],\n  ['orthonormalize',['orthonormalize',['../a00208.html#ga4cab5d698e6e2eccea30c8e81c74371f',1,'glm::orthonormalize(mat&lt; 3, 3, T, Q &gt; const &amp;m)'],['../a00208.html#gac3bc7ef498815026bc3d361ae0b7138e',1,'glm::orthonormalize(vec&lt; 3, T, Q &gt; const &amp;x, vec&lt; 3, T, Q &gt; const &amp;y)']]],\n  ['orthorh',['orthoRH',['../a00157.html#ga16264c9b838edeb9dd1de7a1010a13a4',1,'glm']]],\n  ['outerproduct',['outerProduct',['../a00230.html#gac29fb7bae75a8e4c1b74cbbf85520e50',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_d.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_d.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_d.js",
    "content": "var searchData=\n[\n  ['packdouble2x32',['packDouble2x32',['../a00231.html#gaa916ca426b2bb0343ba17e3753e245c2',1,'glm']]],\n  ['packf2x11_5f1x10',['packF2x11_1x10',['../a00159.html#ga4944ad465ff950e926d49621f916c78d',1,'glm']]],\n  ['packf3x9_5fe1x5',['packF3x9_E1x5',['../a00159.html#ga3f648fc205467792dc6d8c59c748f8a6',1,'glm']]],\n  ['packhalf',['packHalf',['../a00159.html#ga2d8bbce673ebc04831c1fb05c47f5251',1,'glm']]],\n  ['packhalf1x16',['packHalf1x16',['../a00159.html#ga43f2093b6ff192a79058ff7834fc3528',1,'glm']]],\n  ['packhalf2x16',['packHalf2x16',['../a00231.html#ga20f134b07db3a3d3a38efb2617388c92',1,'glm']]],\n  ['packhalf4x16',['packHalf4x16',['../a00159.html#gafe2f7b39caf8f5ec555e1c059ec530e6',1,'glm']]],\n  ['packi3x10_5f1x2',['packI3x10_1x2',['../a00159.html#ga06ecb6afb902dba45419008171db9023',1,'glm']]],\n  ['packint2x16',['packInt2x16',['../a00159.html#ga3644163cf3a47bf1d4af1f4b03013a7e',1,'glm']]],\n  ['packint2x32',['packInt2x32',['../a00159.html#gad1e4c8a9e67d86b61a6eec86703a827a',1,'glm']]],\n  ['packint2x8',['packInt2x8',['../a00159.html#ga8884b1f2292414f36d59ef3be5d62914',1,'glm']]],\n  ['packint4x16',['packInt4x16',['../a00159.html#ga1989f093a27ae69cf9207145be48b3d7',1,'glm']]],\n  ['packint4x8',['packInt4x8',['../a00159.html#gaf2238401d5ce2aaade1a44ba19709072',1,'glm']]],\n  ['packrgbm',['packRGBM',['../a00159.html#ga0466daf4c90f76cc64b3f105ce727295',1,'glm']]],\n  ['packsnorm',['packSnorm',['../a00159.html#gaa54b5855a750d6aeb12c1c902f5939b8',1,'glm']]],\n  ['packsnorm1x16',['packSnorm1x16',['../a00159.html#gab22f8bcfdb5fc65af4701b25f143c1af',1,'glm']]],\n  ['packsnorm1x8',['packSnorm1x8',['../a00159.html#gae3592e0795e62aaa1865b3a10496a7a1',1,'glm']]],\n  ['packsnorm2x16',['packSnorm2x16',['../a00231.html#ga977ab172da5494e5ac63e952afacfbe2',1,'glm']]],\n  ['packsnorm2x8',['packSnorm2x8',['../a00159.html#ga6be3cfb2cce3702f03e91bbeb5286d7e',1,'glm']]],\n  ['packsnorm3x10_5f1x2',['packSnorm3x10_1x2',['../a00159.html#gab997545661877d2c7362a5084d3897d3',1,'glm']]],\n  ['packsnorm4x16',['packSnorm4x16',['../a00159.html#ga358943934d21da947d5bcc88c2ab7832',1,'glm']]],\n  ['packsnorm4x8',['packSnorm4x8',['../a00231.html#ga85e8f17627516445026ab7a9c2e3531a',1,'glm']]],\n  ['packu3x10_5f1x2',['packU3x10_1x2',['../a00159.html#gada3d88d59f0f458f9c51a9fd359a4bc0',1,'glm']]],\n  ['packuint2x16',['packUint2x16',['../a00159.html#ga5eecc9e8cbaf51ac6cf57501e670ee19',1,'glm']]],\n  ['packuint2x32',['packUint2x32',['../a00159.html#gaa864081097b86e83d8e4a4d79c382b22',1,'glm']]],\n  ['packuint2x8',['packUint2x8',['../a00159.html#ga3c3c9fb53ae7823b10fa083909357590',1,'glm']]],\n  ['packuint4x16',['packUint4x16',['../a00159.html#ga2ceb62cca347d8ace42ee90317a3f1f9',1,'glm']]],\n  ['packuint4x8',['packUint4x8',['../a00159.html#gaa0fe2f09aeb403cd66c1a062f58861ab',1,'glm']]],\n  ['packunorm',['packUnorm',['../a00159.html#gaccd3f27e6ba5163eb7aa9bc8ff96251a',1,'glm']]],\n  ['packunorm1x16',['packUnorm1x16',['../a00159.html#ga9f82737bf2a44bedff1d286b76837886',1,'glm']]],\n  ['packunorm1x5_5f1x6_5f1x5',['packUnorm1x5_1x6_1x5',['../a00159.html#ga768e0337dd6246773f14aa0a421fe9a8',1,'glm']]],\n  ['packunorm1x8',['packUnorm1x8',['../a00159.html#ga4b2fa60df3460403817d28b082ee0736',1,'glm']]],\n  ['packunorm2x16',['packUnorm2x16',['../a00231.html#ga0e2d107039fe608a209497af867b85fb',1,'glm']]],\n  ['packunorm2x3_5f1x2',['packUnorm2x3_1x2',['../a00159.html#ga7f9abdb50f9be1aa1c14912504a0d98d',1,'glm']]],\n  ['packunorm2x4',['packUnorm2x4',['../a00159.html#gab6bbd5be3b8e6db538ecb33a7844481c',1,'glm']]],\n  ['packunorm2x8',['packUnorm2x8',['../a00159.html#ga9a666b1c688ab54100061ed06526de6e',1,'glm']]],\n  ['packunorm3x10_5f1x2',['packUnorm3x10_1x2',['../a00159.html#ga8a1ee625d2707c60530fb3fca2980b19',1,'glm']]],\n  ['packunorm3x5_5f1x1',['packUnorm3x5_1x1',['../a00159.html#gaec4112086d7fb133bea104a7c237de52',1,'glm']]],\n  ['packunorm4x16',['packUnorm4x16',['../a00159.html#ga1f63c264e7ab63264e2b2a99fd393897',1,'glm']]],\n  ['packunorm4x4',['packUnorm4x4',['../a00159.html#gad3e7e3ce521513584a53aedc5f9765c1',1,'glm']]],\n  ['packunorm4x8',['packUnorm4x8',['../a00231.html#gaf7d2f7341a9eeb4a436929d6f9ad08f2',1,'glm']]],\n  ['perlin',['perlin',['../a00158.html#ga1e043ce3b51510e9bc4469227cefc38a',1,'glm::perlin(vec&lt; L, T, Q &gt; const &amp;p)'],['../a00158.html#gac270edc54c5fc52f5985a45f940bb103',1,'glm::perlin(vec&lt; L, T, Q &gt; const &amp;p, vec&lt; L, T, Q &gt; const &amp;rep)']]],\n  ['perp',['perp',['../a00209.html#ga264cfc4e180cf9b852e943b35089003c',1,'glm']]],\n  ['perspective',['perspective',['../a00157.html#ga747c8cf99458663dd7ad1bb3a2f07787',1,'glm']]],\n  ['perspectivefov',['perspectiveFov',['../a00157.html#gaebd02240fd36e85ad754f02ddd9a560d',1,'glm']]],\n  ['perspectivefovlh',['perspectiveFovLH',['../a00157.html#ga6aebe16c164bd8e52554cbe0304ef4aa',1,'glm']]],\n  ['perspectivefovrh',['perspectiveFovRH',['../a00157.html#gaf32bf563f28379c68554a44ee60c6a85',1,'glm']]],\n  ['perspectivelh',['perspectiveLH',['../a00157.html#ga9bd34951dc7022ac256fcb51d7f6fc2f',1,'glm']]],\n  ['perspectiverh',['perspectiveRH',['../a00157.html#ga26b88757fbd90601b80768a7e1ad3aa1',1,'glm']]],\n  ['pi',['pi',['../a00151.html#ga94bafeb2a0f23ab6450fed1f98ee4e45',1,'glm']]],\n  ['pickmatrix',['pickMatrix',['../a00157.html#gaf6b21eadb7ac2ecbbe258a9a233b4c82',1,'glm']]],\n  ['pitch',['pitch',['../a00160.html#ga9bd78e5fe153d07e39fb4c83e73dba73',1,'glm']]],\n  ['polar',['polar',['../a00210.html#gab83ac2c0e55b684b06b6c46c28b1590d',1,'glm']]],\n  ['pow',['pow',['../a00141.html#ga2254981952d4f333b900a6bf5167a6c4',1,'glm::pow(vec&lt; L, T, Q &gt; const &amp;base, vec&lt; L, T, Q &gt; const &amp;exponent)'],['../a00190.html#ga465016030a81d513fa2fac881ebdaa83',1,'glm::pow(int x, uint y)'],['../a00190.html#ga998e5ee915d3769255519e2fbaa2bbf0',1,'glm::pow(uint x, uint y)'],['../a00212.html#gad382fc37392d537aecf2245a4597d8a3',1,'glm::pow(tquat&lt; T, Q &gt; const &amp;x, T const &amp;y)']]],\n  ['pow2',['pow2',['../a00207.html#ga19aaff3213bf23bdec3ef124ace237e9',1,'glm::gtx']]],\n  ['pow3',['pow3',['../a00207.html#ga35689d03cd434d6ea819f1942d3bf82e',1,'glm::gtx']]],\n  ['pow4',['pow4',['../a00207.html#gacef0968763026e180e53e735007dbf5a',1,'glm::gtx']]],\n  ['poweroftwoabove',['powerOfTwoAbove',['../a00170.html#ga8cda2459871f574a0aecbe702ac93291',1,'glm::powerOfTwoAbove(genIUType Value)'],['../a00170.html#ga2bbded187c5febfefc1e524ba31b3fab',1,'glm::powerOfTwoAbove(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['poweroftwobelow',['powerOfTwoBelow',['../a00170.html#ga3de7df63c589325101a2817a56f8e29d',1,'glm::powerOfTwoBelow(genIUType Value)'],['../a00170.html#gaf78ddcc4152c051b2a21e68fecb10980',1,'glm::powerOfTwoBelow(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['poweroftwonearest',['powerOfTwoNearest',['../a00170.html#ga5f65973a5d2ea38c719e6a663149ead9',1,'glm::powerOfTwoNearest(genIUType Value)'],['../a00170.html#gac87e65d11e16c3d6b91c3bcfaef7da0b',1,'glm::powerOfTwoNearest(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['prev_5ffloat',['prev_float',['../a00167.html#ga2fcbb7bfbfc595712bfddc51b0715b07',1,'glm::prev_float(genType const &amp;x)'],['../a00167.html#gaa399d5b6472a70e8952f9b26ecaacdec',1,'glm::prev_float(genType const &amp;x, uint const &amp;Distance)']]],\n  ['proj',['proj',['../a00211.html#ga58384b7170801dd513de46f87c7fb00e',1,'glm']]],\n  ['proj2d',['proj2D',['../a00222.html#ga5b992a0cdc8298054edb68e228f0d93e',1,'glm']]],\n  ['proj3d',['proj3D',['../a00222.html#gaa2b7f4f15b98f697caede11bef50509e',1,'glm']]],\n  ['project',['project',['../a00157.html#gaf36e96033f456659e6705472a06b6e11',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_e.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_e.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_e.js",
    "content": "var searchData=\n[\n  ['qr_5fdecompose',['qr_decompose',['../a00196.html#gac62d7bfc8dc661e616620d70552cd566',1,'glm']]],\n  ['quarter_5fpi',['quarter_pi',['../a00151.html#ga3c9df42bd73c519a995c43f0f99e77e0',1,'glm']]],\n  ['quat_5fcast',['quat_cast',['../a00160.html#ga03e023aec9acd561a28594bbc8a3abf6',1,'glm::quat_cast(mat&lt; 3, 3, T, Q &gt; const &amp;x)'],['../a00160.html#ga50bb9aecf42fdab04e16039ab6a81c60',1,'glm::quat_cast(mat&lt; 4, 4, T, Q &gt; const &amp;x)']]],\n  ['quat_5fidentity',['quat_identity',['../a00212.html#ga40788ce1d74fac29fa000af893a3ceb5',1,'glm']]],\n  ['quatlookat',['quatLookAt',['../a00212.html#ga668d9ec9964ced2b455d416677e1e8b9',1,'glm']]],\n  ['quatlookatlh',['quatLookAtLH',['../a00212.html#ga6f1b3fba52fcab952d0ab523177ff443',1,'glm']]],\n  ['quatlookatrh',['quatLookAtRH',['../a00212.html#gad30cbeb78315773b6d18d9d1c1c75b77',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_f.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"functions_f.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/functions_f.js",
    "content": "var searchData=\n[\n  ['radialgradient',['radialGradient',['../a00187.html#gaaecb1e93de4cbe0758b882812d4da294',1,'glm']]],\n  ['radians',['radians',['../a00232.html#ga6e1db4862c5e25afd553930e2fdd6a68',1,'glm']]],\n  ['reflect',['reflect',['../a00142.html#ga5631dd1d5618de5450b1ea3cf3e94905',1,'glm']]],\n  ['refract',['refract',['../a00142.html#ga01da3dff9e2ef6b9d4915c3047e22b74',1,'glm']]],\n  ['repeat',['repeat',['../a00228.html#ga809650c6310ea7c42666e918c117fb6f',1,'glm']]],\n  ['rgb2ycocg',['rgb2YCoCg',['../a00174.html#ga0606353ec2a9b9eaa84f1b02ec391bc5',1,'glm']]],\n  ['rgb2ycocgr',['rgb2YCoCgR',['../a00174.html#ga0389772e44ca0fd2ba4a79bdd8efe898',1,'glm']]],\n  ['rgbcolor',['rgbColor',['../a00173.html#ga5f9193be46f45f0655c05a0cdca006db',1,'glm']]],\n  ['righthanded',['rightHanded',['../a00188.html#ga99386a5ab5491871b947076e21699cc8',1,'glm']]],\n  ['roll',['roll',['../a00160.html#ga3ff93afbd9cc29f2ad217f2228e8a95b',1,'glm']]],\n  ['root_5ffive',['root_five',['../a00151.html#gae9ebbded75b53d4faeb1e4ef8b3347a2',1,'glm']]],\n  ['root_5fhalf_5fpi',['root_half_pi',['../a00151.html#ga4e276cb823cc5e612d4f89ed99c75039',1,'glm']]],\n  ['root_5fln_5ffour',['root_ln_four',['../a00151.html#ga4129412e96b33707a77c1a07652e23e2',1,'glm']]],\n  ['root_5fpi',['root_pi',['../a00151.html#ga261380796b2cd496f68d2cf1d08b8eb9',1,'glm']]],\n  ['root_5fthree',['root_three',['../a00151.html#ga4f286be4abe88be1eed7d2a9f6cb193e',1,'glm']]],\n  ['root_5ftwo',['root_two',['../a00151.html#ga74e607d29020f100c0d0dc46ce2ca950',1,'glm']]],\n  ['root_5ftwo_5fpi',['root_two_pi',['../a00151.html#ga2bcedc575039fe0cd765742f8bbb0bd3',1,'glm']]],\n  ['rotate',['rotate',['../a00157.html#gaee9e865eaa9776370996da2940873fd4',1,'glm::rotate(mat&lt; 4, 4, T, Q &gt; const &amp;m, T angle, vec&lt; 3, T, Q &gt; const &amp;axis)'],['../a00160.html#ga21c6e3b6104c9b8116a35ddf2ac4d358',1,'glm::rotate(tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)'],['../a00201.html#gad5c84a4932a758f385a87098ce1b1660',1,'glm::rotate(mat&lt; 3, 3, T, Q &gt; const &amp;m, T angle)'],['../a00212.html#ga49730f975e7f0ee3862a20b767aba583',1,'glm::rotate(tquat&lt; T, Q &gt; const &amp;q, vec&lt; 3, T, Q &gt; const &amp;v)'],['../a00212.html#ga97a5f8af1d63056b85a53ac28042fe77',1,'glm::rotate(tquat&lt; T, Q &gt; const &amp;q, vec&lt; 4, T, Q &gt; const &amp;v)'],['../a00216.html#gab64a67b52ff4f86c3ba16595a5a25af6',1,'glm::rotate(vec&lt; 2, T, Q &gt; const &amp;v, T const &amp;angle)'],['../a00216.html#ga1ba501ef83d1a009a17ac774cc560f21',1,'glm::rotate(vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)'],['../a00216.html#ga1005f1267ed9c57faa3f24cf6873b961',1,'glm::rotate(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;normal)'],['../a00221.html#gaf599be4c0e9d99be1f9cddba79b6018b',1,'glm::rotate(T angle, vec&lt; 3, T, Q &gt; const &amp;v)']]],\n  ['rotatenormalizedaxis',['rotateNormalizedAxis',['../a00215.html#ga50efd7ebca0f7a603bb3cc11e34c708d',1,'glm::rotateNormalizedAxis(mat&lt; 4, 4, T, Q &gt; const &amp;m, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)'],['../a00215.html#gad5bb8a155ee52fd349b88cec3a843600',1,'glm::rotateNormalizedAxis(tquat&lt; T, Q &gt; const &amp;q, T const &amp;angle, vec&lt; 3, T, Q &gt; const &amp;axis)']]],\n  ['rotatex',['rotateX',['../a00216.html#ga059fdbdba4cca35cdff172a9d0d0afc9',1,'glm::rotateX(vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)'],['../a00216.html#ga4333b1ea8ebf1bd52bc3801a7617398a',1,'glm::rotateX(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)']]],\n  ['rotatey',['rotateY',['../a00216.html#gaebdc8b054ace27d9f62e054531c6f44d',1,'glm::rotateY(vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)'],['../a00216.html#ga3ce3db0867b7f8efd878ee34f95a623b',1,'glm::rotateY(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)']]],\n  ['rotatez',['rotateZ',['../a00216.html#ga5a048838a03f6249acbacb4dbacf79c4',1,'glm::rotateZ(vec&lt; 3, T, Q &gt; const &amp;v, T const &amp;angle)'],['../a00216.html#ga923b75c6448161053768822d880702e6',1,'glm::rotateZ(vec&lt; 4, T, Q &gt; const &amp;v, T const &amp;angle)']]],\n  ['rotation',['rotation',['../a00212.html#ga5a729f33cbd904c9ca14cdf25d0a07e4',1,'glm']]],\n  ['round',['round',['../a00140.html#gafa03aca8c4713e1cc892aa92ca135a7e',1,'glm']]],\n  ['roundeven',['roundEven',['../a00140.html#ga76b81785045a057989a84d99aeeb1578',1,'glm']]],\n  ['roundmultiple',['roundMultiple',['../a00163.html#ga6739d1de04b2cea7c78675b365644bce',1,'glm::roundMultiple(genType Source, genType Multiple)'],['../a00163.html#ga812d27fa1a60c48dc111d67da26b1455',1,'glm::roundMultiple(vec&lt; L, T, Q &gt; const &amp;Source, vec&lt; L, T, Q &gt; const &amp;Multiple)']]],\n  ['roundpoweroftwo',['roundPowerOfTwo',['../a00163.html#ga6d24a9e3abe3e6a908661b43acb8efe0',1,'glm::roundPowerOfTwo(genIUType Value)'],['../a00163.html#ga31bea2d2e0b9bc62bd14b60fcb10f4e6',1,'glm::roundPowerOfTwo(vec&lt; L, T, Q &gt; const &amp;value)']]],\n  ['row',['row',['../a00154.html#ga259e5ebd0f31ec3f83440f8cae7f5dba',1,'glm::row(genType const &amp;m, length_t index)'],['../a00154.html#gaadcc64829aadf4103477679e48c7594f',1,'glm::row(genType const &amp;m, length_t index, typename genType::row_type const &amp;x)']]],\n  ['rowmajor2',['rowMajor2',['../a00198.html#gaf5b1aee9e3eb1acf9d6c3c8be1e73bb8',1,'glm::rowMajor2(vec&lt; 2, T, Q &gt; const &amp;v1, vec&lt; 2, T, Q &gt; const &amp;v2)'],['../a00198.html#gaf66c75ed69ca9e87462550708c2c6726',1,'glm::rowMajor2(mat&lt; 2, 2, T, Q &gt; const &amp;m)']]],\n  ['rowmajor3',['rowMajor3',['../a00198.html#ga2ae46497493339f745754e40f438442e',1,'glm::rowMajor3(vec&lt; 3, T, Q &gt; const &amp;v1, vec&lt; 3, T, Q &gt; const &amp;v2, vec&lt; 3, T, Q &gt; const &amp;v3)'],['../a00198.html#gad8a3a50ab47bbe8d36cdb81d90dfcf77',1,'glm::rowMajor3(mat&lt; 3, 3, T, Q &gt; const &amp;m)']]],\n  ['rowmajor4',['rowMajor4',['../a00198.html#ga9636cd6bbe2c32a8d0c03ffb8b1ef284',1,'glm::rowMajor4(vec&lt; 4, T, Q &gt; const &amp;v1, vec&lt; 4, T, Q &gt; const &amp;v2, vec&lt; 4, T, Q &gt; const &amp;v3, vec&lt; 4, T, Q &gt; const &amp;v4)'],['../a00198.html#gac92ad1c2acdf18d3eb7be45a32f9566b',1,'glm::rowMajor4(mat&lt; 4, 4, T, Q &gt; const &amp;m)']]],\n  ['rq_5fdecompose',['rq_decompose',['../a00196.html#ga82874e2ebe891ba35ac21d9993873758',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_0.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_0.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_0.js",
    "content": "var searchData=\n[\n  ['angle_20and_20trigonometry_20functions',['Angle and Trigonometry Functions',['../a00232.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_1.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_1.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_1.js",
    "content": "var searchData=\n[\n  ['core_20features',['Core features',['../a00143.html',1,'']]],\n  ['common_20functions',['Common functions',['../a00140.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_2.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_2.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_2.js",
    "content": "var searchData=\n[\n  ['exponential_20functions',['Exponential functions',['../a00141.html',1,'']]],\n  ['experimental_20extensions',['Experimental extensions',['../a00148.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_3.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_3.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_3.js",
    "content": "var searchData=\n[\n  ['floating_2dpoint_20pack_20and_20unpack_20functions',['Floating-Point Pack and Unpack Functions',['../a00231.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_4.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_4.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_4.js",
    "content": "var searchData=\n[\n  ['geometric_20functions',['Geometric functions',['../a00142.html',1,'']]],\n  ['glm_5fgtc_5fbitfield',['GLM_GTC_bitfield',['../a00149.html',1,'']]],\n  ['glm_5fgtc_5fcolor_5fspace',['GLM_GTC_color_space',['../a00150.html',1,'']]],\n  ['glm_5fgtc_5fconstants',['GLM_GTC_constants',['../a00151.html',1,'']]],\n  ['glm_5fgtc_5fepsilon',['GLM_GTC_epsilon',['../a00152.html',1,'']]],\n  ['glm_5fgtc_5finteger',['GLM_GTC_integer',['../a00153.html',1,'']]],\n  ['glm_5fgtc_5fmatrix_5faccess',['GLM_GTC_matrix_access',['../a00154.html',1,'']]],\n  ['glm_5fgtc_5fmatrix_5finteger',['GLM_GTC_matrix_integer',['../a00155.html',1,'']]],\n  ['glm_5fgtc_5fmatrix_5finverse',['GLM_GTC_matrix_inverse',['../a00156.html',1,'']]],\n  ['glm_5fgtc_5fmatrix_5ftransform',['GLM_GTC_matrix_transform',['../a00157.html',1,'']]],\n  ['glm_5fgtc_5fnoise',['GLM_GTC_noise',['../a00158.html',1,'']]],\n  ['glm_5fgtc_5fpacking',['GLM_GTC_packing',['../a00159.html',1,'']]],\n  ['glm_5fgtc_5fquaternion',['GLM_GTC_quaternion',['../a00160.html',1,'']]],\n  ['glm_5fgtc_5frandom',['GLM_GTC_random',['../a00161.html',1,'']]],\n  ['glm_5fgtc_5freciprocal',['GLM_GTC_reciprocal',['../a00162.html',1,'']]],\n  ['glm_5fgtc_5fround',['GLM_GTC_round',['../a00163.html',1,'']]],\n  ['glm_5fgtc_5ftype_5faligned',['GLM_GTC_type_aligned',['../a00164.html',1,'']]],\n  ['glm_5fgtc_5ftype_5fprecision',['GLM_GTC_type_precision',['../a00165.html',1,'']]],\n  ['glm_5fgtc_5ftype_5fptr',['GLM_GTC_type_ptr',['../a00166.html',1,'']]],\n  ['glm_5fgtc_5fulp',['GLM_GTC_ulp',['../a00167.html',1,'']]],\n  ['glm_5fgtc_5fvec1',['GLM_GTC_vec1',['../a00168.html',1,'']]],\n  ['glm_5fgtx_5fassociated_5fmin_5fmax',['GLM_GTX_associated_min_max',['../a00169.html',1,'']]],\n  ['glm_5fgtx_5fbit',['GLM_GTX_bit',['../a00170.html',1,'']]],\n  ['glm_5fgtx_5fclosest_5fpoint',['GLM_GTX_closest_point',['../a00171.html',1,'']]],\n  ['glm_5fgtx_5fcolor_5fencoding',['GLM_GTX_color_encoding',['../a00172.html',1,'']]],\n  ['glm_5fgtx_5fcolor_5fspace',['GLM_GTX_color_space',['../a00173.html',1,'']]],\n  ['glm_5fgtx_5fcolor_5fspace_5fycocg',['GLM_GTX_color_space_YCoCg',['../a00174.html',1,'']]],\n  ['glm_5fgtx_5fcommon',['GLM_GTX_common',['../a00175.html',1,'']]],\n  ['glm_5fgtx_5fcompatibility',['GLM_GTX_compatibility',['../a00176.html',1,'']]],\n  ['glm_5fgtx_5fcomponent_5fwise',['GLM_GTX_component_wise',['../a00177.html',1,'']]],\n  ['glm_5fgtx_5fdual_5fquaternion',['GLM_GTX_dual_quaternion',['../a00178.html',1,'']]],\n  ['glm_5fgtx_5feuler_5fangles',['GLM_GTX_euler_angles',['../a00179.html',1,'']]],\n  ['glm_5fgtx_5fextend',['GLM_GTX_extend',['../a00180.html',1,'']]],\n  ['glm_5fgtx_5fextented_5fmin_5fmax',['GLM_GTX_extented_min_max',['../a00181.html',1,'']]],\n  ['glm_5fgtx_5fexterior_5fproduct',['GLM_GTX_exterior_product',['../a00182.html',1,'']]],\n  ['glm_5fgtx_5ffast_5fexponential',['GLM_GTX_fast_exponential',['../a00183.html',1,'']]],\n  ['glm_5fgtx_5ffast_5fsquare_5froot',['GLM_GTX_fast_square_root',['../a00184.html',1,'']]],\n  ['glm_5fgtx_5ffast_5ftrigonometry',['GLM_GTX_fast_trigonometry',['../a00185.html',1,'']]],\n  ['glm_5fgtx_5ffunctions',['GLM_GTX_functions',['../a00186.html',1,'']]],\n  ['glm_5fgtx_5fgradient_5fpaint',['GLM_GTX_gradient_paint',['../a00187.html',1,'']]],\n  ['glm_5fgtx_5fhanded_5fcoordinate_5fspace',['GLM_GTX_handed_coordinate_space',['../a00188.html',1,'']]],\n  ['glm_5fgtx_5fhash',['GLM_GTX_hash',['../a00189.html',1,'']]],\n  ['glm_5fgtx_5finteger',['GLM_GTX_integer',['../a00190.html',1,'']]],\n  ['glm_5fgtx_5fintersect',['GLM_GTX_intersect',['../a00191.html',1,'']]],\n  ['glm_5fgtx_5fio',['GLM_GTX_io',['../a00192.html',1,'']]],\n  ['glm_5fgtx_5flog_5fbase',['GLM_GTX_log_base',['../a00193.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5fcross_5fproduct',['GLM_GTX_matrix_cross_product',['../a00194.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5fdecompose',['GLM_GTX_matrix_decompose',['../a00195.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5ffactorisation',['GLM_GTX_matrix_factorisation',['../a00196.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5finterpolation',['GLM_GTX_matrix_interpolation',['../a00197.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5fmajor_5fstorage',['GLM_GTX_matrix_major_storage',['../a00198.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5foperation',['GLM_GTX_matrix_operation',['../a00199.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5fquery',['GLM_GTX_matrix_query',['../a00200.html',1,'']]],\n  ['glm_5fgtx_5fmatrix_5ftransform_5f2d',['GLM_GTX_matrix_transform_2d',['../a00201.html',1,'']]],\n  ['glm_5fgtx_5fmixed_5fproducte',['GLM_GTX_mixed_producte',['../a00202.html',1,'']]],\n  ['glm_5fgtx_5fnorm',['GLM_GTX_norm',['../a00203.html',1,'']]],\n  ['glm_5fgtx_5fnormal',['GLM_GTX_normal',['../a00204.html',1,'']]],\n  ['glm_5fgtx_5fnormalize_5fdot',['GLM_GTX_normalize_dot',['../a00205.html',1,'']]],\n  ['glm_5fgtx_5fnumber_5fprecision',['GLM_GTX_number_precision',['../a00206.html',1,'']]],\n  ['glm_5fgtx_5foptimum_5fpow',['GLM_GTX_optimum_pow',['../a00207.html',1,'']]],\n  ['glm_5fgtx_5forthonormalize',['GLM_GTX_orthonormalize',['../a00208.html',1,'']]],\n  ['glm_5fgtx_5fperpendicular',['GLM_GTX_perpendicular',['../a00209.html',1,'']]],\n  ['glm_5fgtx_5fpolar_5fcoordinates',['GLM_GTX_polar_coordinates',['../a00210.html',1,'']]],\n  ['glm_5fgtx_5fprojection',['GLM_GTX_projection',['../a00211.html',1,'']]],\n  ['glm_5fgtx_5fquaternion',['GLM_GTX_quaternion',['../a00212.html',1,'']]],\n  ['glm_5fgtx_5frange',['GLM_GTX_range',['../a00213.html',1,'']]],\n  ['glm_5fgtx_5fraw_5fdata',['GLM_GTX_raw_data',['../a00214.html',1,'']]],\n  ['glm_5fgtx_5frotate_5fnormalized_5faxis',['GLM_GTX_rotate_normalized_axis',['../a00215.html',1,'']]],\n  ['glm_5fgtx_5frotate_5fvector',['GLM_GTX_rotate_vector',['../a00216.html',1,'']]],\n  ['glm_5fgtx_5fscalar_5frelational',['GLM_GTX_scalar_relational',['../a00217.html',1,'']]],\n  ['glm_5fgtx_5fspline',['GLM_GTX_spline',['../a00218.html',1,'']]],\n  ['glm_5fgtx_5fstd_5fbased_5ftype',['GLM_GTX_std_based_type',['../a00219.html',1,'']]],\n  ['glm_5fgtx_5fstring_5fcast',['GLM_GTX_string_cast',['../a00220.html',1,'']]],\n  ['glm_5fgtx_5ftransform',['GLM_GTX_transform',['../a00221.html',1,'']]],\n  ['glm_5fgtx_5ftransform2',['GLM_GTX_transform2',['../a00222.html',1,'']]],\n  ['glm_5fgtx_5ftype_5faligned',['GLM_GTX_type_aligned',['../a00223.html',1,'']]],\n  ['glm_5fgtx_5ftype_5ftrait',['GLM_GTX_type_trait',['../a00224.html',1,'']]],\n  ['glm_5fgtx_5fvec_5fswizzle',['GLM_GTX_vec_swizzle',['../a00225.html',1,'']]],\n  ['glm_5fgtx_5fvector_5fangle',['GLM_GTX_vector_angle',['../a00226.html',1,'']]],\n  ['glm_5fgtx_5fvector_5fquery',['GLM_GTX_vector_query',['../a00227.html',1,'']]],\n  ['glm_5fgtx_5fwrap',['GLM_GTX_wrap',['../a00228.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_5.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_5.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_5.js",
    "content": "var searchData=\n[\n  ['integer_20functions',['Integer functions',['../a00229.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_6.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_6.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_6.js",
    "content": "var searchData=\n[\n  ['matrix_20functions',['Matrix functions',['../a00230.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_7.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_7.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_7.js",
    "content": "var searchData=\n[\n  ['precision_20types',['Precision types',['../a00145.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_8.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_8.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_8.js",
    "content": "var searchData=\n[\n  ['stable_20extensions',['Stable extensions',['../a00147.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_9.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_9.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_9.js",
    "content": "var searchData=\n[\n  ['template_20types',['Template types',['../a00146.html',1,'']]],\n  ['types',['Types',['../a00144.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_a.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"groups_a.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/groups_a.js",
    "content": "var searchData=\n[\n  ['vector_20relational_20functions',['Vector Relational Functions',['../a00233.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/nomatches.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/pages_0.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"pages_0.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/pages_0.js",
    "content": "var searchData=\n[\n  ['opengl_20mathematics_20_28glm_29',['OpenGL Mathematics (GLM)',['../index.html',1,'']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/search.css",
    "content": "/*---------------- Search Box */\n\n#FSearchBox {\n    float: left;\n}\n\n#MSearchBox {\n    white-space : nowrap;\n    position: absolute;\n    float: none;\n    display: inline;\n    margin-top: 8px;\n    right: 0px;\n    width: 170px;\n    z-index: 102;\n    background-color: white;\n}\n\n#MSearchBox .left\n{\n    display:block;\n    position:absolute;\n    left:10px;\n    width:20px;\n    height:19px;\n    background:url('search_l.png') no-repeat;\n    background-position:right;\n}\n\n#MSearchSelect {\n    display:block;\n    position:absolute;\n    width:20px;\n    height:19px;\n}\n\n.left #MSearchSelect {\n    left:4px;\n}\n\n.right #MSearchSelect {\n    right:5px;\n}\n\n#MSearchField {\n    display:block;\n    position:absolute;\n    height:19px;\n    background:url('search_m.png') repeat-x;\n    border:none;\n    width:111px;\n    margin-left:20px;\n    padding-left:4px;\n    color: #909090;\n    outline: none;\n    font: 9pt Arial, Verdana, sans-serif;\n}\n\n#FSearchBox #MSearchField {\n    margin-left:15px;\n}\n\n#MSearchBox .right {\n    display:block;\n    position:absolute;\n    right:10px;\n    top:0px;\n    width:20px;\n    height:19px;\n    background:url('search_r.png') no-repeat;\n    background-position:left;\n}\n\n#MSearchClose {\n    display: none;\n    position: absolute;\n    top: 4px;\n    background : none;\n    border: none;\n    margin: 0px 4px 0px 0px;\n    padding: 0px 0px;\n    outline: none;\n}\n\n.left #MSearchClose {\n    left: 6px;\n}\n\n.right #MSearchClose {\n    right: 2px;\n}\n\n.MSearchBoxActive #MSearchField {\n    color: #000000;\n}\n\n/*---------------- Search filter selection */\n\n#MSearchSelectWindow {\n    display: none;\n    position: absolute;\n    left: 0; top: 0;\n    border: 1px solid #90A5CE;\n    background-color: #F9FAFC;\n    z-index: 1;\n    padding-top: 4px;\n    padding-bottom: 4px;\n    -moz-border-radius: 4px;\n    -webkit-border-top-left-radius: 4px;\n    -webkit-border-top-right-radius: 4px;\n    -webkit-border-bottom-left-radius: 4px;\n    -webkit-border-bottom-right-radius: 4px;\n    -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n}\n\n.SelectItem {\n    font: 8pt Arial, Verdana, sans-serif;\n    padding-left:  2px;\n    padding-right: 12px;\n    border: 0px;\n}\n\nspan.SelectionMark {\n    margin-right: 4px;\n    font-family: monospace;\n    outline-style: none;\n    text-decoration: none;\n}\n\na.SelectItem {\n    display: block;\n    outline-style: none;\n    color: #000000; \n    text-decoration: none;\n    padding-left:   6px;\n    padding-right: 12px;\n}\n\na.SelectItem:focus,\na.SelectItem:active {\n    color: #000000; \n    outline-style: none;\n    text-decoration: none;\n}\n\na.SelectItem:hover {\n    color: #FFFFFF;\n    background-color: #3D578C;\n    outline-style: none;\n    text-decoration: none;\n    cursor: pointer;\n    display: block;\n}\n\n/*---------------- Search results window */\n\niframe#MSearchResults {\n    width: 60ex;\n    height: 15em;\n}\n\n#MSearchResultsWindow {\n    display: none;\n    position: absolute;\n    left: 0; top: 0;\n    border: 1px solid #000;\n    background-color: #EEF1F7;\n}\n\n/* ----------------------------------- */\n\n\n#SRIndex {\n    clear:both; \n    padding-bottom: 15px;\n}\n\n.SREntry {\n    font-size: 10pt;\n    padding-left: 1ex;\n}\n\n.SRPage .SREntry {\n    font-size: 8pt;\n    padding: 1px 5px;\n}\n\nbody.SRPage {\n    margin: 5px 2px;\n}\n\n.SRChildren {\n    padding-left: 3ex; padding-bottom: .5em \n}\n\n.SRPage .SRChildren {\n    display: none;\n}\n\n.SRSymbol {\n    font-weight: bold; \n    color: #425E97;\n    font-family: Arial, Verdana, sans-serif;\n    text-decoration: none;\n    outline: none;\n}\n\na.SRScope {\n    display: block;\n    color: #425E97; \n    font-family: Arial, Verdana, sans-serif;\n    text-decoration: none;\n    outline: none;\n}\n\na.SRSymbol:focus, a.SRSymbol:active,\na.SRScope:focus, a.SRScope:active {\n    text-decoration: underline;\n}\n\nspan.SRScope {\n    padding-left: 4px;\n}\n\n.SRPage .SRStatus {\n    padding: 2px 5px;\n    font-size: 8pt;\n    font-style: italic;\n}\n\n.SRResult {\n    display: none;\n}\n\nDIV.searchresults {\n    margin-left: 10px;\n    margin-right: 10px;\n}\n\n/*---------------- External search page results */\n\n.searchresult {\n    background-color: #F0F3F8;\n}\n\n.pages b {\n   color: white;\n   padding: 5px 5px 3px 5px;\n   background-image: url(\"../tab_a.png\");\n   background-repeat: repeat-x;\n   text-shadow: 0 1px 1px #000000;\n}\n\n.pages {\n    line-height: 17px;\n    margin-left: 4px;\n    text-decoration: none;\n}\n\n.hl {\n    font-weight: bold;\n}\n\n#searchresults {\n    margin-bottom: 20px;\n}\n\n.searchpages {\n    margin-top: 10px;\n}\n\n"
  },
  {
    "path": "external/glm/doc/api/search/search.js",
    "content": "function convertToId(search)\n{\n  var result = '';\n  for (i=0;i<search.length;i++)\n  {\n    var c = search.charAt(i);\n    var cn = c.charCodeAt(0);\n    if (c.match(/[a-z0-9\\u0080-\\uFFFF]/))\n    {\n      result+=c;\n    }\n    else if (cn<16)\n    {\n      result+=\"_0\"+cn.toString(16);\n    }\n    else\n    {\n      result+=\"_\"+cn.toString(16);\n    }\n  }\n  return result;\n}\n\nfunction getXPos(item)\n{\n  var x = 0;\n  if (item.offsetWidth)\n  {\n    while (item && item!=document.body)\n    {\n      x   += item.offsetLeft;\n      item = item.offsetParent;\n    }\n  }\n  return x;\n}\n\nfunction getYPos(item)\n{\n  var y = 0;\n  if (item.offsetWidth)\n  {\n     while (item && item!=document.body)\n     {\n       y   += item.offsetTop;\n       item = item.offsetParent;\n     }\n  }\n  return y;\n}\n\n/* A class handling everything associated with the search panel.\n\n   Parameters:\n   name - The name of the global variable that will be\n          storing this instance.  Is needed to be able to set timeouts.\n   resultPath - path to use for external files\n*/\nfunction SearchBox(name, resultsPath, inFrame, label)\n{\n  if (!name || !resultsPath) {  alert(\"Missing parameters to SearchBox.\"); }\n\n  // ---------- Instance variables\n  this.name                  = name;\n  this.resultsPath           = resultsPath;\n  this.keyTimeout            = 0;\n  this.keyTimeoutLength      = 500;\n  this.closeSelectionTimeout = 300;\n  this.lastSearchValue       = \"\";\n  this.lastResultsPage       = \"\";\n  this.hideTimeout           = 0;\n  this.searchIndex           = 0;\n  this.searchActive          = false;\n  this.insideFrame           = inFrame;\n  this.searchLabel           = label;\n\n  // ----------- DOM Elements\n\n  this.DOMSearchField = function()\n  {  return document.getElementById(\"MSearchField\");  }\n\n  this.DOMSearchSelect = function()\n  {  return document.getElementById(\"MSearchSelect\");  }\n\n  this.DOMSearchSelectWindow = function()\n  {  return document.getElementById(\"MSearchSelectWindow\");  }\n\n  this.DOMPopupSearchResults = function()\n  {  return document.getElementById(\"MSearchResults\");  }\n\n  this.DOMPopupSearchResultsWindow = function()\n  {  return document.getElementById(\"MSearchResultsWindow\");  }\n\n  this.DOMSearchClose = function()\n  {  return document.getElementById(\"MSearchClose\"); }\n\n  this.DOMSearchBox = function()\n  {  return document.getElementById(\"MSearchBox\");  }\n\n  // ------------ Event Handlers\n\n  // Called when focus is added or removed from the search field.\n  this.OnSearchFieldFocus = function(isActive)\n  {\n    this.Activate(isActive);\n  }\n\n  this.OnSearchSelectShow = function()\n  {\n    var searchSelectWindow = this.DOMSearchSelectWindow();\n    var searchField        = this.DOMSearchSelect();\n\n    if (this.insideFrame)\n    {\n      var left = getXPos(searchField);\n      var top  = getYPos(searchField);\n      left += searchField.offsetWidth + 6;\n      top += searchField.offsetHeight;\n\n      // show search selection popup\n      searchSelectWindow.style.display='block';\n      left -= searchSelectWindow.offsetWidth;\n      searchSelectWindow.style.left =  left + 'px';\n      searchSelectWindow.style.top  =  top  + 'px';\n    }\n    else\n    {\n      var left = getXPos(searchField);\n      var top  = getYPos(searchField);\n      top += searchField.offsetHeight;\n\n      // show search selection popup\n      searchSelectWindow.style.display='block';\n      searchSelectWindow.style.left =  left + 'px';\n      searchSelectWindow.style.top  =  top  + 'px';\n    }\n\n    // stop selection hide timer\n    if (this.hideTimeout)\n    {\n      clearTimeout(this.hideTimeout);\n      this.hideTimeout=0;\n    }\n    return false; // to avoid \"image drag\" default event\n  }\n\n  this.OnSearchSelectHide = function()\n  {\n    this.hideTimeout = setTimeout(this.name +\".CloseSelectionWindow()\",\n                                  this.closeSelectionTimeout);\n  }\n\n  // Called when the content of the search field is changed.\n  this.OnSearchFieldChange = function(evt)\n  {\n    if (this.keyTimeout) // kill running timer\n    {\n      clearTimeout(this.keyTimeout);\n      this.keyTimeout = 0;\n    }\n\n    var e  = (evt) ? evt : window.event; // for IE\n    if (e.keyCode==40 || e.keyCode==13)\n    {\n      if (e.shiftKey==1)\n      {\n        this.OnSearchSelectShow();\n        var win=this.DOMSearchSelectWindow();\n        for (i=0;i<win.childNodes.length;i++)\n        {\n          var child = win.childNodes[i]; // get span within a\n          if (child.className=='SelectItem')\n          {\n            child.focus();\n            return;\n          }\n        }\n        return;\n      }\n      else if (window.frames.MSearchResults.searchResults)\n      {\n        var elem = window.frames.MSearchResults.searchResults.NavNext(0);\n        if (elem) elem.focus();\n      }\n    }\n    else if (e.keyCode==27) // Escape out of the search field\n    {\n      this.DOMSearchField().blur();\n      this.DOMPopupSearchResultsWindow().style.display = 'none';\n      this.DOMSearchClose().style.display = 'none';\n      this.lastSearchValue = '';\n      this.Activate(false);\n      return;\n    }\n\n    // strip whitespaces\n    var searchValue = this.DOMSearchField().value.replace(/ +/g, \"\");\n\n    if (searchValue != this.lastSearchValue) // search value has changed\n    {\n      if (searchValue != \"\") // non-empty search\n      {\n        // set timer for search update\n        this.keyTimeout = setTimeout(this.name + '.Search()',\n                                     this.keyTimeoutLength);\n      }\n      else // empty search field\n      {\n        this.DOMPopupSearchResultsWindow().style.display = 'none';\n        this.DOMSearchClose().style.display = 'none';\n        this.lastSearchValue = '';\n      }\n    }\n  }\n\n  this.SelectItemCount = function(id)\n  {\n    var count=0;\n    var win=this.DOMSearchSelectWindow();\n    for (i=0;i<win.childNodes.length;i++)\n    {\n      var child = win.childNodes[i]; // get span within a\n      if (child.className=='SelectItem')\n      {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  this.SelectItemSet = function(id)\n  {\n    var i,j=0;\n    var win=this.DOMSearchSelectWindow();\n    for (i=0;i<win.childNodes.length;i++)\n    {\n      var child = win.childNodes[i]; // get span within a\n      if (child.className=='SelectItem')\n      {\n        var node = child.firstChild;\n        if (j==id)\n        {\n          node.innerHTML='&#8226;';\n        }\n        else\n        {\n          node.innerHTML='&#160;';\n        }\n        j++;\n      }\n    }\n  }\n\n  // Called when an search filter selection is made.\n  // set item with index id as the active item\n  this.OnSelectItem = function(id)\n  {\n    this.searchIndex = id;\n    this.SelectItemSet(id);\n    var searchValue = this.DOMSearchField().value.replace(/ +/g, \"\");\n    if (searchValue!=\"\" && this.searchActive) // something was found -> do a search\n    {\n      this.Search();\n    }\n  }\n\n  this.OnSearchSelectKey = function(evt)\n  {\n    var e = (evt) ? evt : window.event; // for IE\n    if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down\n    {\n      this.searchIndex++;\n      this.OnSelectItem(this.searchIndex);\n    }\n    else if (e.keyCode==38 && this.searchIndex>0) // Up\n    {\n      this.searchIndex--;\n      this.OnSelectItem(this.searchIndex);\n    }\n    else if (e.keyCode==13 || e.keyCode==27)\n    {\n      this.OnSelectItem(this.searchIndex);\n      this.CloseSelectionWindow();\n      this.DOMSearchField().focus();\n    }\n    return false;\n  }\n\n  // --------- Actions\n\n  // Closes the results window.\n  this.CloseResultsWindow = function()\n  {\n    this.DOMPopupSearchResultsWindow().style.display = 'none';\n    this.DOMSearchClose().style.display = 'none';\n    this.Activate(false);\n  }\n\n  this.CloseSelectionWindow = function()\n  {\n    this.DOMSearchSelectWindow().style.display = 'none';\n  }\n\n  // Performs a search.\n  this.Search = function()\n  {\n    this.keyTimeout = 0;\n\n    // strip leading whitespace\n    var searchValue = this.DOMSearchField().value.replace(/^ +/, \"\");\n\n    var code = searchValue.toLowerCase().charCodeAt(0);\n    var idxChar = searchValue.substr(0, 1).toLowerCase();\n    if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair\n    {\n      idxChar = searchValue.substr(0, 2);\n    }\n\n    var resultsPage;\n    var resultsPageWithSearch;\n    var hasResultsPage;\n\n    var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);\n    if (idx!=-1)\n    {\n       var hexCode=idx.toString(16);\n       resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';\n       resultsPageWithSearch = resultsPage+'?'+escape(searchValue);\n       hasResultsPage = true;\n    }\n    else // nothing available for this search term\n    {\n       resultsPage = this.resultsPath + '/nomatches.html';\n       resultsPageWithSearch = resultsPage;\n       hasResultsPage = false;\n    }\n\n    window.frames.MSearchResults.location = resultsPageWithSearch;\n    var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();\n\n    if (domPopupSearchResultsWindow.style.display!='block')\n    {\n       var domSearchBox = this.DOMSearchBox();\n       this.DOMSearchClose().style.display = 'inline';\n       if (this.insideFrame)\n       {\n         var domPopupSearchResults = this.DOMPopupSearchResults();\n         domPopupSearchResultsWindow.style.position = 'relative';\n         domPopupSearchResultsWindow.style.display  = 'block';\n         var width = document.body.clientWidth - 8; // the -8 is for IE :-(\n         domPopupSearchResultsWindow.style.width    = width + 'px';\n         domPopupSearchResults.style.width          = width + 'px';\n       }\n       else\n       {\n         var domPopupSearchResults = this.DOMPopupSearchResults();\n         var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;\n         var top  = getYPos(domSearchBox) + 20;  // domSearchBox.offsetHeight + 1;\n         domPopupSearchResultsWindow.style.display = 'block';\n         left -= domPopupSearchResults.offsetWidth;\n         domPopupSearchResultsWindow.style.top     = top  + 'px';\n         domPopupSearchResultsWindow.style.left    = left + 'px';\n       }\n    }\n\n    this.lastSearchValue = searchValue;\n    this.lastResultsPage = resultsPage;\n  }\n\n  // -------- Activation Functions\n\n  // Activates or deactivates the search panel, resetting things to\n  // their default values if necessary.\n  this.Activate = function(isActive)\n  {\n    if (isActive || // open it\n        this.DOMPopupSearchResultsWindow().style.display == 'block'\n       )\n    {\n      this.DOMSearchBox().className = 'MSearchBoxActive';\n\n      var searchField = this.DOMSearchField();\n\n      if (searchField.value == this.searchLabel) // clear \"Search\" term upon entry\n      {\n        searchField.value = '';\n        this.searchActive = true;\n      }\n    }\n    else if (!isActive) // directly remove the panel\n    {\n      this.DOMSearchBox().className = 'MSearchBoxInactive';\n      this.DOMSearchField().value   = this.searchLabel;\n      this.searchActive             = false;\n      this.lastSearchValue          = ''\n      this.lastResultsPage          = '';\n    }\n  }\n}\n\n// -----------------------------------------------------------------------\n\n// The class that handles everything on the search results page.\nfunction SearchResults(name)\n{\n    // The number of matches from the last run of <Search()>.\n    this.lastMatchCount = 0;\n    this.lastKey = 0;\n    this.repeatOn = false;\n\n    // Toggles the visibility of the passed element ID.\n    this.FindChildElement = function(id)\n    {\n      var parentElement = document.getElementById(id);\n      var element = parentElement.firstChild;\n\n      while (element && element!=parentElement)\n      {\n        if (element.nodeName == 'DIV' && element.className == 'SRChildren')\n        {\n          return element;\n        }\n\n        if (element.nodeName == 'DIV' && element.hasChildNodes())\n        {\n           element = element.firstChild;\n        }\n        else if (element.nextSibling)\n        {\n           element = element.nextSibling;\n        }\n        else\n        {\n          do\n          {\n            element = element.parentNode;\n          }\n          while (element && element!=parentElement && !element.nextSibling);\n\n          if (element && element!=parentElement)\n          {\n            element = element.nextSibling;\n          }\n        }\n      }\n    }\n\n    this.Toggle = function(id)\n    {\n      var element = this.FindChildElement(id);\n      if (element)\n      {\n        if (element.style.display == 'block')\n        {\n          element.style.display = 'none';\n        }\n        else\n        {\n          element.style.display = 'block';\n        }\n      }\n    }\n\n    // Searches for the passed string.  If there is no parameter,\n    // it takes it from the URL query.\n    //\n    // Always returns true, since other documents may try to call it\n    // and that may or may not be possible.\n    this.Search = function(search)\n    {\n      if (!search) // get search word from URL\n      {\n        search = window.location.search;\n        search = search.substring(1);  // Remove the leading '?'\n        search = unescape(search);\n      }\n\n      search = search.replace(/^ +/, \"\"); // strip leading spaces\n      search = search.replace(/ +$/, \"\"); // strip trailing spaces\n      search = search.toLowerCase();\n      search = convertToId(search);\n\n      var resultRows = document.getElementsByTagName(\"div\");\n      var matches = 0;\n\n      var i = 0;\n      while (i < resultRows.length)\n      {\n        var row = resultRows.item(i);\n        if (row.className == \"SRResult\")\n        {\n          var rowMatchName = row.id.toLowerCase();\n          rowMatchName = rowMatchName.replace(/^sr\\d*_/, ''); // strip 'sr123_'\n\n          if (search.length<=rowMatchName.length &&\n             rowMatchName.substr(0, search.length)==search)\n          {\n            row.style.display = 'block';\n            matches++;\n          }\n          else\n          {\n            row.style.display = 'none';\n          }\n        }\n        i++;\n      }\n      document.getElementById(\"Searching\").style.display='none';\n      if (matches == 0) // no results\n      {\n        document.getElementById(\"NoMatches\").style.display='block';\n      }\n      else // at least one result\n      {\n        document.getElementById(\"NoMatches\").style.display='none';\n      }\n      this.lastMatchCount = matches;\n      return true;\n    }\n\n    // return the first item with index index or higher that is visible\n    this.NavNext = function(index)\n    {\n      var focusItem;\n      while (1)\n      {\n        var focusName = 'Item'+index;\n        focusItem = document.getElementById(focusName);\n        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')\n        {\n          break;\n        }\n        else if (!focusItem) // last element\n        {\n          break;\n        }\n        focusItem=null;\n        index++;\n      }\n      return focusItem;\n    }\n\n    this.NavPrev = function(index)\n    {\n      var focusItem;\n      while (1)\n      {\n        var focusName = 'Item'+index;\n        focusItem = document.getElementById(focusName);\n        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')\n        {\n          break;\n        }\n        else if (!focusItem) // last element\n        {\n          break;\n        }\n        focusItem=null;\n        index--;\n      }\n      return focusItem;\n    }\n\n    this.ProcessKeys = function(e)\n    {\n      if (e.type == \"keydown\")\n      {\n        this.repeatOn = false;\n        this.lastKey = e.keyCode;\n      }\n      else if (e.type == \"keypress\")\n      {\n        if (!this.repeatOn)\n        {\n          if (this.lastKey) this.repeatOn = true;\n          return false; // ignore first keypress after keydown\n        }\n      }\n      else if (e.type == \"keyup\")\n      {\n        this.lastKey = 0;\n        this.repeatOn = false;\n      }\n      return this.lastKey!=0;\n    }\n\n    this.Nav = function(evt,itemIndex)\n    {\n      var e  = (evt) ? evt : window.event; // for IE\n      if (e.keyCode==13) return true;\n      if (!this.ProcessKeys(e)) return false;\n\n      if (this.lastKey==38) // Up\n      {\n        var newIndex = itemIndex-1;\n        var focusItem = this.NavPrev(newIndex);\n        if (focusItem)\n        {\n          var child = this.FindChildElement(focusItem.parentNode.parentNode.id);\n          if (child && child.style.display == 'block') // children visible\n          {\n            var n=0;\n            var tmpElem;\n            while (1) // search for last child\n            {\n              tmpElem = document.getElementById('Item'+newIndex+'_c'+n);\n              if (tmpElem)\n              {\n                focusItem = tmpElem;\n              }\n              else // found it!\n              {\n                break;\n              }\n              n++;\n            }\n          }\n        }\n        if (focusItem)\n        {\n          focusItem.focus();\n        }\n        else // return focus to search field\n        {\n           parent.document.getElementById(\"MSearchField\").focus();\n        }\n      }\n      else if (this.lastKey==40) // Down\n      {\n        var newIndex = itemIndex+1;\n        var focusItem;\n        var item = document.getElementById('Item'+itemIndex);\n        var elem = this.FindChildElement(item.parentNode.parentNode.id);\n        if (elem && elem.style.display == 'block') // children visible\n        {\n          focusItem = document.getElementById('Item'+itemIndex+'_c0');\n        }\n        if (!focusItem) focusItem = this.NavNext(newIndex);\n        if (focusItem)  focusItem.focus();\n      }\n      else if (this.lastKey==39) // Right\n      {\n        var item = document.getElementById('Item'+itemIndex);\n        var elem = this.FindChildElement(item.parentNode.parentNode.id);\n        if (elem) elem.style.display = 'block';\n      }\n      else if (this.lastKey==37) // Left\n      {\n        var item = document.getElementById('Item'+itemIndex);\n        var elem = this.FindChildElement(item.parentNode.parentNode.id);\n        if (elem) elem.style.display = 'none';\n      }\n      else if (this.lastKey==27) // Escape\n      {\n        parent.searchBox.CloseResultsWindow();\n        parent.document.getElementById(\"MSearchField\").focus();\n      }\n      else if (this.lastKey==13) // Enter\n      {\n        return true;\n      }\n      return false;\n    }\n\n    this.NavChild = function(evt,itemIndex,childIndex)\n    {\n      var e  = (evt) ? evt : window.event; // for IE\n      if (e.keyCode==13) return true;\n      if (!this.ProcessKeys(e)) return false;\n\n      if (this.lastKey==38) // Up\n      {\n        if (childIndex>0)\n        {\n          var newIndex = childIndex-1;\n          document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();\n        }\n        else // already at first child, jump to parent\n        {\n          document.getElementById('Item'+itemIndex).focus();\n        }\n      }\n      else if (this.lastKey==40) // Down\n      {\n        var newIndex = childIndex+1;\n        var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);\n        if (!elem) // last child, jump to parent next parent\n        {\n          elem = this.NavNext(itemIndex+1);\n        }\n        if (elem)\n        {\n          elem.focus();\n        }\n      }\n      else if (this.lastKey==27) // Escape\n      {\n        parent.searchBox.CloseResultsWindow();\n        parent.document.getElementById(\"MSearchField\").focus();\n      }\n      else if (this.lastKey==13) // Enter\n      {\n        return true;\n      }\n      return false;\n    }\n}\n\nfunction setKeyActions(elem,action)\n{\n  elem.setAttribute('onkeydown',action);\n  elem.setAttribute('onkeypress',action);\n  elem.setAttribute('onkeyup',action);\n}\n\nfunction setClassAttr(elem,attr)\n{\n  elem.setAttribute('class',attr);\n  elem.setAttribute('className',attr);\n}\n\nfunction createResults()\n{\n  var results = document.getElementById(\"SRResults\");\n  for (var e=0; e<searchData.length; e++)\n  {\n    var id = searchData[e][0];\n    var srResult = document.createElement('div');\n    srResult.setAttribute('id','SR_'+id);\n    setClassAttr(srResult,'SRResult');\n    var srEntry = document.createElement('div');\n    setClassAttr(srEntry,'SREntry');\n    var srLink = document.createElement('a');\n    srLink.setAttribute('id','Item'+e);\n    setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');\n    setClassAttr(srLink,'SRSymbol');\n    srLink.innerHTML = searchData[e][1][0];\n    srEntry.appendChild(srLink);\n    if (searchData[e][1].length==2) // single result\n    {\n      srLink.setAttribute('href',searchData[e][1][1][0]);\n      if (searchData[e][1][1][1])\n      {\n       srLink.setAttribute('target','_parent');\n      }\n      var srScope = document.createElement('span');\n      setClassAttr(srScope,'SRScope');\n      srScope.innerHTML = searchData[e][1][1][2];\n      srEntry.appendChild(srScope);\n    }\n    else // multiple results\n    {\n      srLink.setAttribute('href','javascript:searchResults.Toggle(\"SR_'+id+'\")');\n      var srChildren = document.createElement('div');\n      setClassAttr(srChildren,'SRChildren');\n      for (var c=0; c<searchData[e][1].length-1; c++)\n      {\n        var srChild = document.createElement('a');\n        srChild.setAttribute('id','Item'+e+'_c'+c);\n        setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');\n        setClassAttr(srChild,'SRScope');\n        srChild.setAttribute('href',searchData[e][1][c+1][0]);\n        if (searchData[e][1][c+1][1])\n        {\n         srChild.setAttribute('target','_parent');\n        }\n        srChild.innerHTML = searchData[e][1][c+1][2];\n        srChildren.appendChild(srChild);\n      }\n      srEntry.appendChild(srChildren);\n    }\n    srResult.appendChild(srEntry);\n    results.appendChild(srResult);\n  }\n}\n\nfunction init_search()\n{\n  var results = document.getElementById(\"MSearchSelectWindow\");\n  for (var key in indexSectionLabels)\n  {\n    var link = document.createElement('a');\n    link.setAttribute('class','SelectItem');\n    link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');\n    link.href='javascript:void(0)';\n    link.innerHTML='<span class=\"SelectionMark\">&#160;</span>'+indexSectionLabels[key];\n    results.appendChild(link);\n  }\n  searchBox.OnSelectItem(0);\n}\n\n"
  },
  {
    "path": "external/glm/doc/api/search/searchdata.js",
    "content": "var indexSectionsWithContent =\n{\n  0: \"_abcdefghilmnopqrstuvwyz\",\n  1: \"_abcdefghilmnopqrstuvw\",\n  2: \"abcdefghilmnopqrstuvwyz\",\n  3: \"abdfhilmpqsuvw\",\n  4: \"acefgimpstv\",\n  5: \"o\"\n};\n\nvar indexSectionNames =\n{\n  0: \"all\",\n  1: \"files\",\n  2: \"functions\",\n  3: \"typedefs\",\n  4: \"groups\",\n  5: \"pages\"\n};\n\nvar indexSectionLabels =\n{\n  0: \"All\",\n  1: \"Files\",\n  2: \"Functions\",\n  3: \"Typedefs\",\n  4: \"Modules\",\n  5: \"Pages\"\n};\n\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_0.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_0.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_0.js",
    "content": "var searchData=\n[\n  ['aligned_5fbvec1',['aligned_bvec1',['../a00164.html#ga780a35f764020f553a9601a3fcdcd059',1,'glm']]],\n  ['aligned_5fbvec2',['aligned_bvec2',['../a00164.html#gae766b317c5afec852bfb3d74a3c54bc8',1,'glm']]],\n  ['aligned_5fbvec3',['aligned_bvec3',['../a00164.html#gae1964ba70d15915e5b710926decbb3cb',1,'glm']]],\n  ['aligned_5fbvec4',['aligned_bvec4',['../a00164.html#gae164a1f7879f828bc35e50b79d786b05',1,'glm']]],\n  ['aligned_5fdvec1',['aligned_dvec1',['../a00164.html#ga4974f46ae5a19415d91316960a53617a',1,'glm']]],\n  ['aligned_5fdvec2',['aligned_dvec2',['../a00164.html#ga18d859f87122b2b3b2992ffe86dbebc0',1,'glm']]],\n  ['aligned_5fdvec3',['aligned_dvec3',['../a00164.html#gaa37869eea77d28419b2fb0ff70b69bf0',1,'glm']]],\n  ['aligned_5fdvec4',['aligned_dvec4',['../a00164.html#ga8a9f0a4795ccc442fa9901845026f9f5',1,'glm']]],\n  ['aligned_5fhighp_5fbvec1',['aligned_highp_bvec1',['../a00164.html#ga862843a45b01c35ffe4d44c47ea774ad',1,'glm']]],\n  ['aligned_5fhighp_5fbvec2',['aligned_highp_bvec2',['../a00164.html#ga0731b593c5e33559954c80f8687e76c6',1,'glm']]],\n  ['aligned_5fhighp_5fbvec3',['aligned_highp_bvec3',['../a00164.html#ga0913bdf048d0cb74af1d2512aec675bc',1,'glm']]],\n  ['aligned_5fhighp_5fbvec4',['aligned_highp_bvec4',['../a00164.html#ga9df1d0c425852cf63a57e533b7a83f4f',1,'glm']]],\n  ['aligned_5fhighp_5fdvec1',['aligned_highp_dvec1',['../a00164.html#gaf0448b0f7ceb8273f7eda3a92205eefc',1,'glm']]],\n  ['aligned_5fhighp_5fdvec2',['aligned_highp_dvec2',['../a00164.html#gab173a333e6b7ce153ceba66ac4a321cf',1,'glm']]],\n  ['aligned_5fhighp_5fdvec3',['aligned_highp_dvec3',['../a00164.html#gae94ef61edfa047d05bc69b6065fc42ba',1,'glm']]],\n  ['aligned_5fhighp_5fdvec4',['aligned_highp_dvec4',['../a00164.html#ga8fad35c5677f228e261fe541f15363a4',1,'glm']]],\n  ['aligned_5fhighp_5fivec1',['aligned_highp_ivec1',['../a00164.html#gad63b8c5b4dc0500d54d7414ef555178f',1,'glm']]],\n  ['aligned_5fhighp_5fivec2',['aligned_highp_ivec2',['../a00164.html#ga41563650f36cb7f479e080de21e08418',1,'glm']]],\n  ['aligned_5fhighp_5fivec3',['aligned_highp_ivec3',['../a00164.html#ga6eca5170bb35eac90b4972590fd31a06',1,'glm']]],\n  ['aligned_5fhighp_5fivec4',['aligned_highp_ivec4',['../a00164.html#ga31bfa801e1579fdba752ec3f7a45ec91',1,'glm']]],\n  ['aligned_5fhighp_5fuvec1',['aligned_highp_uvec1',['../a00164.html#ga5b80e28396c6ef7d32c6fd18df498451',1,'glm']]],\n  ['aligned_5fhighp_5fuvec2',['aligned_highp_uvec2',['../a00164.html#ga04db692662a4908beeaf5a5ba6e19483',1,'glm']]],\n  ['aligned_5fhighp_5fuvec3',['aligned_highp_uvec3',['../a00164.html#ga073fd6e8b241afade6d8afbd676b2667',1,'glm']]],\n  ['aligned_5fhighp_5fuvec4',['aligned_highp_uvec4',['../a00164.html#gabdd60462042859f876c17c7346c732a5',1,'glm']]],\n  ['aligned_5fhighp_5fvec1',['aligned_highp_vec1',['../a00164.html#ga4d0bd70d5fac49b800546d608b707513',1,'glm']]],\n  ['aligned_5fhighp_5fvec2',['aligned_highp_vec2',['../a00164.html#gac9f8482dde741fb6bab7248b81a45465',1,'glm']]],\n  ['aligned_5fhighp_5fvec3',['aligned_highp_vec3',['../a00164.html#ga65415d2d68c9cc0ca554524a8f5510b2',1,'glm']]],\n  ['aligned_5fhighp_5fvec4',['aligned_highp_vec4',['../a00164.html#ga7cb26d354dd69d23849c34c4fba88da9',1,'glm']]],\n  ['aligned_5fivec1',['aligned_ivec1',['../a00164.html#ga76298aed82a439063c3d55980c84aa0b',1,'glm']]],\n  ['aligned_5fivec2',['aligned_ivec2',['../a00164.html#gae4f38fd2c86cee6940986197777b3ca4',1,'glm']]],\n  ['aligned_5fivec3',['aligned_ivec3',['../a00164.html#ga32794322d294e5ace7fed4a61896f270',1,'glm']]],\n  ['aligned_5fivec4',['aligned_ivec4',['../a00164.html#ga7f79eae5927c9033d84617e49f6f34e4',1,'glm']]],\n  ['aligned_5flowp_5fbvec1',['aligned_lowp_bvec1',['../a00164.html#gac6036449ab1c4abf8efe1ea00fcdd1c9',1,'glm']]],\n  ['aligned_5flowp_5fbvec2',['aligned_lowp_bvec2',['../a00164.html#ga59fadcd3835646e419372ae8b43c5d37',1,'glm']]],\n  ['aligned_5flowp_5fbvec3',['aligned_lowp_bvec3',['../a00164.html#ga83aab4d191053f169c93a3e364f2e118',1,'glm']]],\n  ['aligned_5flowp_5fbvec4',['aligned_lowp_bvec4',['../a00164.html#gaa7a76555ee4853614e5755181a8dd54e',1,'glm']]],\n  ['aligned_5flowp_5fdvec1',['aligned_lowp_dvec1',['../a00164.html#ga7f8a2cc5a686e52b1615761f4978ca62',1,'glm']]],\n  ['aligned_5flowp_5fdvec2',['aligned_lowp_dvec2',['../a00164.html#ga0e37cff4a43cca866101f0a35f01db6d',1,'glm']]],\n  ['aligned_5flowp_5fdvec3',['aligned_lowp_dvec3',['../a00164.html#gab9e669c4efd52d3347fc6d5f6b20fd59',1,'glm']]],\n  ['aligned_5flowp_5fdvec4',['aligned_lowp_dvec4',['../a00164.html#ga226f5ec7a953cea559c16fe3aff9924f',1,'glm']]],\n  ['aligned_5flowp_5fivec1',['aligned_lowp_ivec1',['../a00164.html#ga1101d3a82b2e3f5f8828bd8f3adab3e1',1,'glm']]],\n  ['aligned_5flowp_5fivec2',['aligned_lowp_ivec2',['../a00164.html#ga44c4accad582cfbd7226a19b83b0cadc',1,'glm']]],\n  ['aligned_5flowp_5fivec3',['aligned_lowp_ivec3',['../a00164.html#ga65663f10a02e52cedcddbcfe36ddf38d',1,'glm']]],\n  ['aligned_5flowp_5fivec4',['aligned_lowp_ivec4',['../a00164.html#gaae92fcec8b2e0328ffbeac31cc4fc419',1,'glm']]],\n  ['aligned_5flowp_5fuvec1',['aligned_lowp_uvec1',['../a00164.html#gad09b93acc43c43423408d17a64f6d7ca',1,'glm']]],\n  ['aligned_5flowp_5fuvec2',['aligned_lowp_uvec2',['../a00164.html#ga6f94fcd28dde906fc6cad5f742b55c1a',1,'glm']]],\n  ['aligned_5flowp_5fuvec3',['aligned_lowp_uvec3',['../a00164.html#ga9e9f006970b1a00862e3e6e599eedd4c',1,'glm']]],\n  ['aligned_5flowp_5fuvec4',['aligned_lowp_uvec4',['../a00164.html#ga46b1b0b9eb8625a5d69137bd66cd13dc',1,'glm']]],\n  ['aligned_5flowp_5fvec1',['aligned_lowp_vec1',['../a00164.html#gab34aee3d5e121c543fea11d2c50ecc43',1,'glm']]],\n  ['aligned_5flowp_5fvec2',['aligned_lowp_vec2',['../a00164.html#ga53ac5d252317f1fa43c2ef921857bf13',1,'glm']]],\n  ['aligned_5flowp_5fvec3',['aligned_lowp_vec3',['../a00164.html#ga98f0b5cd65fce164ff1367c2a3b3aa1e',1,'glm']]],\n  ['aligned_5flowp_5fvec4',['aligned_lowp_vec4',['../a00164.html#ga82f7275d6102593a69ce38cdad680409',1,'glm']]],\n  ['aligned_5fmediump_5fbvec1',['aligned_mediump_bvec1',['../a00164.html#gadd3b8bd71a758f7fb0da8e525156f34e',1,'glm']]],\n  ['aligned_5fmediump_5fbvec2',['aligned_mediump_bvec2',['../a00164.html#gacb183eb5e67ec0d0ea5a016cba962810',1,'glm']]],\n  ['aligned_5fmediump_5fbvec3',['aligned_mediump_bvec3',['../a00164.html#gacfa4a542f1b20a5b63ad702dfb6fd587',1,'glm']]],\n  ['aligned_5fmediump_5fbvec4',['aligned_mediump_bvec4',['../a00164.html#ga91bc1f513bb9b0fd60281d57ded9a48c',1,'glm']]],\n  ['aligned_5fmediump_5fdvec1',['aligned_mediump_dvec1',['../a00164.html#ga7180b685c581adb224406a7f831608e3',1,'glm']]],\n  ['aligned_5fmediump_5fdvec2',['aligned_mediump_dvec2',['../a00164.html#ga9af1eabe22f569e70d9893be72eda0f5',1,'glm']]],\n  ['aligned_5fmediump_5fdvec3',['aligned_mediump_dvec3',['../a00164.html#ga058e7ddab1428e47f2197bdd3a5a6953',1,'glm']]],\n  ['aligned_5fmediump_5fdvec4',['aligned_mediump_dvec4',['../a00164.html#gaffd747ea2aea1e69c2ecb04e68521b21',1,'glm']]],\n  ['aligned_5fmediump_5fivec1',['aligned_mediump_ivec1',['../a00164.html#ga20e63dd980b81af10cadbbe219316650',1,'glm']]],\n  ['aligned_5fmediump_5fivec2',['aligned_mediump_ivec2',['../a00164.html#gaea13d89d49daca2c796aeaa82fc2c2f2',1,'glm']]],\n  ['aligned_5fmediump_5fivec3',['aligned_mediump_ivec3',['../a00164.html#gabbf0f15e9c3d9868e43241ad018f82bd',1,'glm']]],\n  ['aligned_5fmediump_5fivec4',['aligned_mediump_ivec4',['../a00164.html#ga6099dd7878d0a78101a4250d8cd2d736',1,'glm']]],\n  ['aligned_5fmediump_5fuvec1',['aligned_mediump_uvec1',['../a00164.html#gacb78126ea2eb779b41c7511128ff1283',1,'glm']]],\n  ['aligned_5fmediump_5fuvec2',['aligned_mediump_uvec2',['../a00164.html#ga081d53e0a71443d0b68ea61c870f9adc',1,'glm']]],\n  ['aligned_5fmediump_5fuvec3',['aligned_mediump_uvec3',['../a00164.html#gad6fc921bdde2bdbc7e09b028e1e9b379',1,'glm']]],\n  ['aligned_5fmediump_5fuvec4',['aligned_mediump_uvec4',['../a00164.html#ga73ea0c1ba31580e107d21270883f51fc',1,'glm']]],\n  ['aligned_5fmediump_5fvec1',['aligned_mediump_vec1',['../a00164.html#ga6b797eec76fa471e300158f3453b3b2e',1,'glm']]],\n  ['aligned_5fmediump_5fvec2',['aligned_mediump_vec2',['../a00164.html#ga026a55ddbf2bafb1432f1157a2708616',1,'glm']]],\n  ['aligned_5fmediump_5fvec3',['aligned_mediump_vec3',['../a00164.html#ga3a25e494173f6a64637b08a1b50a2132',1,'glm']]],\n  ['aligned_5fmediump_5fvec4',['aligned_mediump_vec4',['../a00164.html#ga320d1c661cff2ef214eb50241f2928b2',1,'glm']]],\n  ['aligned_5fuvec1',['aligned_uvec1',['../a00164.html#ga1ff8ed402c93d280ff0597c1c5e7c548',1,'glm']]],\n  ['aligned_5fuvec2',['aligned_uvec2',['../a00164.html#ga074137e3be58528d67041c223d49f398',1,'glm']]],\n  ['aligned_5fuvec3',['aligned_uvec3',['../a00164.html#ga2a8d9c3046f89d854eb758adfa0811c0',1,'glm']]],\n  ['aligned_5fuvec4',['aligned_uvec4',['../a00164.html#gabf842c45eea186170c267a328e3f3b7d',1,'glm']]],\n  ['aligned_5fvec1',['aligned_vec1',['../a00164.html#ga05e6d4c908965d04191c2070a8d0a65e',1,'glm']]],\n  ['aligned_5fvec2',['aligned_vec2',['../a00164.html#ga0682462f8096a226773e20fac993cde5',1,'glm']]],\n  ['aligned_5fvec3',['aligned_vec3',['../a00164.html#ga7cf643b66664e0cd3c48759ae66c2bd0',1,'glm']]],\n  ['aligned_5fvec4',['aligned_vec4',['../a00164.html#ga85d89e83cb8137e1be1446de8c3b643a',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_1.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_1.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_1.js",
    "content": "var searchData=\n[\n  ['bool1',['bool1',['../a00176.html#gaddcd7aa2e30e61af5b38660613d3979e',1,'glm']]],\n  ['bool1x1',['bool1x1',['../a00176.html#ga7f895c936f0c29c8729afbbf22806090',1,'glm']]],\n  ['bool2',['bool2',['../a00176.html#gaa09ab65ec9c3c54305ff502e2b1fe6d9',1,'glm']]],\n  ['bool2x2',['bool2x2',['../a00176.html#gadb3703955e513632f98ba12fe051ba3e',1,'glm']]],\n  ['bool2x3',['bool2x3',['../a00176.html#ga9ae6ee155d0f90cb1ae5b6c4546738a0',1,'glm']]],\n  ['bool2x4',['bool2x4',['../a00176.html#ga4d7fa65be8e8e4ad6d920b45c44e471f',1,'glm']]],\n  ['bool3',['bool3',['../a00176.html#ga99629f818737f342204071ef8296b2ed',1,'glm']]],\n  ['bool3x2',['bool3x2',['../a00176.html#gac7d7311f7e0fa8b6163d96dab033a755',1,'glm']]],\n  ['bool3x3',['bool3x3',['../a00176.html#ga6c97b99aac3e302053ffb58aace9033c',1,'glm']]],\n  ['bool3x4',['bool3x4',['../a00176.html#gae7d6b679463d37d6c527d478fb470fdf',1,'glm']]],\n  ['bool4',['bool4',['../a00176.html#ga13c3200b82708f73faac6d7f09ec91a3',1,'glm']]],\n  ['bool4x2',['bool4x2',['../a00176.html#ga9ed830f52408b2f83c085063a3eaf1d0',1,'glm']]],\n  ['bool4x3',['bool4x3',['../a00176.html#gad0f5dc7f22c2065b1b06d57f1c0658fe',1,'glm']]],\n  ['bool4x4',['bool4x4',['../a00176.html#ga7d2a7d13986602ae2896bfaa394235d4',1,'glm']]],\n  ['bvec2',['bvec2',['../a00144.html#ga0e46aaaccc5e713eac5bfbc8d6885a60',1,'glm']]],\n  ['bvec3',['bvec3',['../a00144.html#ga150731e2a148eff8752114a0e450505e',1,'glm']]],\n  ['bvec4',['bvec4',['../a00144.html#ga444e8f61bfb3a6f037d019ac6933f8c6',1,'glm']]],\n  ['byte',['byte',['../a00214.html#ga3005cb0d839d546c616becfa6602c607',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_2.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_2.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_2.js",
    "content": "var searchData=\n[\n  ['ddualquat',['ddualquat',['../a00178.html#ga3d71f98d84ba59dfe4e369fde4714cd6',1,'glm']]],\n  ['dmat2',['dmat2',['../a00144.html#gac7f51e23c8802d867f564dfd146bdb44',1,'glm']]],\n  ['dmat2x2',['dmat2x2',['../a00144.html#gacc27b39853a2ecb538c8b3afc20c359e',1,'glm']]],\n  ['dmat2x3',['dmat2x3',['../a00144.html#ga1cb3c561a32f0864733dfaf97c71f0c7',1,'glm']]],\n  ['dmat2x4',['dmat2x4',['../a00144.html#gaddd230c88fbd6ec33242329be3a1b738',1,'glm']]],\n  ['dmat3',['dmat3',['../a00144.html#gae174ff65e148bb7dec4bf10a63cb46ff',1,'glm']]],\n  ['dmat3x2',['dmat3x2',['../a00144.html#gaec22f44dddbdadfe5dfca68eb3457ea8',1,'glm']]],\n  ['dmat3x3',['dmat3x3',['../a00144.html#gac44263f56ff3cbf0a9cc4e2405d5ecb8',1,'glm']]],\n  ['dmat3x4',['dmat3x4',['../a00144.html#ga38d9bfca882ec542b1928cf77b5c2091',1,'glm']]],\n  ['dmat4',['dmat4',['../a00144.html#ga97b38ea24e9ebf58eac04a8d99dc3e27',1,'glm']]],\n  ['dmat4x2',['dmat4x2',['../a00144.html#ga6ddab280c735a2139133b4164b99a68a',1,'glm']]],\n  ['dmat4x3',['dmat4x3',['../a00144.html#gab6c8974496fc7c72dad09219118ba89e',1,'glm']]],\n  ['dmat4x4',['dmat4x4',['../a00144.html#ga41c2da87ca627c1b2da5e895435a508e',1,'glm']]],\n  ['double1',['double1',['../a00176.html#ga20b861a9b6e2a300323671c57a02525b',1,'glm']]],\n  ['double1x1',['double1x1',['../a00176.html#ga45f16a4dd0db1f199afaed9fd12fe9a8',1,'glm']]],\n  ['double2',['double2',['../a00176.html#ga31b729b04facccda73f07ed26958b3c2',1,'glm']]],\n  ['double2x2',['double2x2',['../a00176.html#gae57d0201096834d25f2b91b319e7cdbd',1,'glm']]],\n  ['double2x3',['double2x3',['../a00176.html#ga3655bc324008553ca61f39952d0b2d08',1,'glm']]],\n  ['double2x4',['double2x4',['../a00176.html#gacd33061fc64a7b2dcfd7322c49d9557a',1,'glm']]],\n  ['double3',['double3',['../a00176.html#ga3d8b9028a1053a44a98902cd1c389472',1,'glm']]],\n  ['double3x2',['double3x2',['../a00176.html#ga5ec08fc39c9d783dfcc488be240fe975',1,'glm']]],\n  ['double3x3',['double3x3',['../a00176.html#ga4bad5bb20c6ddaecfe4006c93841d180',1,'glm']]],\n  ['double3x4',['double3x4',['../a00176.html#ga2ef022e453d663d70aec414b2a80f756',1,'glm']]],\n  ['double4',['double4',['../a00176.html#gaf92f58af24f35617518aeb3d4f63fda6',1,'glm']]],\n  ['double4x2',['double4x2',['../a00176.html#gabca29ccceea53669618b751aae0ba83d',1,'glm']]],\n  ['double4x3',['double4x3',['../a00176.html#gafad66a02ccd360c86d6ab9ff9cfbc19c',1,'glm']]],\n  ['double4x4',['double4x4',['../a00176.html#gaab541bed2e788e4537852a2492860806',1,'glm']]],\n  ['dualquat',['dualquat',['../a00178.html#gae93abee0c979902fbec6a7bee0f6fae1',1,'glm']]],\n  ['dvec2',['dvec2',['../a00144.html#ga15ade901680b29b78c1f9d1796db6e0e',1,'glm']]],\n  ['dvec3',['dvec3',['../a00144.html#gabebd0c7e3c5cd337d95c313c5e8b8db4',1,'glm']]],\n  ['dvec4',['dvec4',['../a00144.html#ga9503f809789bda7e8852a6abde3ae5c1',1,'glm']]],\n  ['dword',['dword',['../a00214.html#ga86e46fff9f80ae33893d8d697f2ca98a',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_3.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_3.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_3.js",
    "content": "var searchData=\n[\n  ['f32',['f32',['../a00165.html#gabe6a542dd6c1d5ffd847f1b9b4c9c9b7',1,'glm']]],\n  ['f32mat1',['f32mat1',['../a00206.html#ga145ad477a2a3e152855511c3b52469a6',1,'glm::gtx']]],\n  ['f32mat1x1',['f32mat1x1',['../a00206.html#gac88c6a4dbfc380aa26e3adbbade36348',1,'glm::gtx']]],\n  ['f32mat2',['f32mat2',['../a00165.html#gab12383ed6ac7595ed6fde4d266c58425',1,'glm']]],\n  ['f32mat2x2',['f32mat2x2',['../a00165.html#ga04100c76f7d55a0dd0983ccf05142bff',1,'glm']]],\n  ['f32mat2x3',['f32mat2x3',['../a00165.html#gab256cdab5eb582e426d749ae77b5b566',1,'glm']]],\n  ['f32mat2x4',['f32mat2x4',['../a00165.html#gaf512b74c4400b68f9fdf9388b3d6aac8',1,'glm']]],\n  ['f32mat3',['f32mat3',['../a00165.html#ga856f3905ee7cc2e4890a8a1d56c150be',1,'glm']]],\n  ['f32mat3x2',['f32mat3x2',['../a00165.html#ga1320a08e14fdff3821241eefab6947e9',1,'glm']]],\n  ['f32mat3x3',['f32mat3x3',['../a00165.html#ga65261fa8a21045c8646ddff114a56174',1,'glm']]],\n  ['f32mat3x4',['f32mat3x4',['../a00165.html#gab90ade28222f8b861d5ceaf81a3a7f5d',1,'glm']]],\n  ['f32mat4',['f32mat4',['../a00165.html#ga99d1b85ff99956b33da7e9992aad129a',1,'glm']]],\n  ['f32mat4x2',['f32mat4x2',['../a00165.html#ga3b32ca1e57a4ef91babbc3d35a34ea20',1,'glm']]],\n  ['f32mat4x3',['f32mat4x3',['../a00165.html#ga239b96198771b7add8eea7e6b59840c0',1,'glm']]],\n  ['f32mat4x4',['f32mat4x4',['../a00165.html#gaee4da0e9fbd8cfa2f89cb80889719dc3',1,'glm']]],\n  ['f32quat',['f32quat',['../a00165.html#ga6966c0cb4673928c9c9da2e91006d2c0',1,'glm']]],\n  ['f32vec1',['f32vec1',['../a00165.html#ga701f32ab5b3fb06996b41f5c0d643805',1,'glm::f32vec1()'],['../a00206.html#ga07f8d7348eb7ae059a84c118fdfeb943',1,'glm::gtx::f32vec1()']]],\n  ['f32vec2',['f32vec2',['../a00165.html#ga5d6c70e080409a76a257dc55bd8ea2c8',1,'glm']]],\n  ['f32vec3',['f32vec3',['../a00165.html#gaea5c4518e175162e306d2c2b5ef5ac79',1,'glm']]],\n  ['f32vec4',['f32vec4',['../a00165.html#ga31c6ca0e074a44007f49a9a3720b18c8',1,'glm']]],\n  ['f64',['f64',['../a00165.html#ga1d794d240091678f602e8de225b8d8c9',1,'glm']]],\n  ['f64mat1',['f64mat1',['../a00206.html#ga59bfa589419b5265d01314fcecd33435',1,'glm::gtx']]],\n  ['f64mat1x1',['f64mat1x1',['../a00206.html#ga448eeb08d0b7d8c43a8b292c981955fd',1,'glm::gtx']]],\n  ['f64mat2',['f64mat2',['../a00165.html#gad9771450a54785d13080cdde0fe20c1d',1,'glm']]],\n  ['f64mat2x2',['f64mat2x2',['../a00165.html#ga9ec7c4c79e303c053e30729a95fb2c37',1,'glm']]],\n  ['f64mat2x3',['f64mat2x3',['../a00165.html#gae3ab5719fc4c1e966631dbbcba8d412a',1,'glm']]],\n  ['f64mat2x4',['f64mat2x4',['../a00165.html#gac87278e0c702ba8afff76316d4eeb769',1,'glm']]],\n  ['f64mat3',['f64mat3',['../a00165.html#ga9b69181efbf8f37ae934f135137b29c0',1,'glm']]],\n  ['f64mat3x2',['f64mat3x2',['../a00165.html#ga2473d8bf3f4abf967c4d0e18175be6f7',1,'glm']]],\n  ['f64mat3x3',['f64mat3x3',['../a00165.html#ga916c1aed91cf91f7b41399ebe7c6e185',1,'glm']]],\n  ['f64mat3x4',['f64mat3x4',['../a00165.html#gaab239fa9e35b65a67cbaa6ac082f3675',1,'glm']]],\n  ['f64mat4',['f64mat4',['../a00165.html#ga0ecd3f4952536e5ef12702b44d2626fc',1,'glm']]],\n  ['f64mat4x2',['f64mat4x2',['../a00165.html#gab7daf79d6bc06a68bea1c6f5e11b5512',1,'glm']]],\n  ['f64mat4x3',['f64mat4x3',['../a00165.html#ga3e2e66ffbe341a80bc005ba2b9552110',1,'glm']]],\n  ['f64mat4x4',['f64mat4x4',['../a00165.html#gae52e2b7077a9ff928a06ab5ce600b81e',1,'glm']]],\n  ['f64quat',['f64quat',['../a00165.html#ga14c583bd625eda8cf4935a14d5dd544d',1,'glm']]],\n  ['f64vec1',['f64vec1',['../a00165.html#gade502df1ce14f837fae7f60a03ddb9b0',1,'glm::f64vec1()'],['../a00206.html#gae5987a61b8c03d5c432a9e62f0b3efe1',1,'glm::gtx::f64vec1()']]],\n  ['f64vec2',['f64vec2',['../a00165.html#gadc4e1594f9555d919131ee02b17822a2',1,'glm']]],\n  ['f64vec3',['f64vec3',['../a00165.html#gaa7a1ddca75c5f629173bf4772db7a635',1,'glm']]],\n  ['f64vec4',['f64vec4',['../a00165.html#ga66e92e57260bdb910609b9a56bf83e97',1,'glm']]],\n  ['fdualquat',['fdualquat',['../a00178.html#ga237c2b9b42c9a930e49de5840ae0f930',1,'glm']]],\n  ['float1',['float1',['../a00176.html#gaf5208d01f6c6fbcb7bb55d610b9c0ead',1,'glm']]],\n  ['float1x1',['float1x1',['../a00176.html#ga73720b8dc4620835b17f74d428f98c0c',1,'glm']]],\n  ['float2',['float2',['../a00176.html#ga02d3c013982c183906c61d74aa3166ce',1,'glm']]],\n  ['float2x2',['float2x2',['../a00176.html#ga33d43ecbb60a85a1366ff83f8a0ec85f',1,'glm']]],\n  ['float2x3',['float2x3',['../a00176.html#ga939b0cff15cee3030f75c1b2e36f89fe',1,'glm']]],\n  ['float2x4',['float2x4',['../a00176.html#gafec3cfd901ab334a92e0242b8f2269b4',1,'glm']]],\n  ['float3',['float3',['../a00176.html#ga821ff110fc8533a053cbfcc93e078cc0',1,'glm']]],\n  ['float32',['float32',['../a00165.html#gad3c127f8bf8d7d4e738037c257abb5b1',1,'glm']]],\n  ['float32_5ft',['float32_t',['../a00165.html#ga41d579d81c3d98edd0532244fa02da77',1,'glm']]],\n  ['float3x2',['float3x2',['../a00176.html#gaa6c69f04ba95f3faedf95dae874de576',1,'glm']]],\n  ['float3x3',['float3x3',['../a00176.html#ga6ceb5d38a58becdf420026e12a6562f3',1,'glm']]],\n  ['float3x4',['float3x4',['../a00176.html#ga4d2679c321b793ca3784fe0315bb5332',1,'glm']]],\n  ['float4',['float4',['../a00176.html#gae2da7345087db3815a25d8837a727ef1',1,'glm']]],\n  ['float4x2',['float4x2',['../a00176.html#ga308b9af0c221145bcfe9bfc129d9098e',1,'glm']]],\n  ['float4x3',['float4x3',['../a00176.html#gac0a51b4812038aa81d73ffcc37f741ac',1,'glm']]],\n  ['float4x4',['float4x4',['../a00176.html#gad3051649b3715d828a4ab92cdae7c3bf',1,'glm']]],\n  ['float64',['float64',['../a00165.html#gab5596d48586414c91ccb270962dc14d3',1,'glm']]],\n  ['float64_5ft',['float64_t',['../a00165.html#ga6957c7b22f405683bb276554ca40dc37',1,'glm']]],\n  ['fmat2',['fmat2',['../a00165.html#ga4541dc2feb2a31d6ecb5a303f3dd3280',1,'glm']]],\n  ['fmat2x2',['fmat2x2',['../a00165.html#ga3350c93c3275298f940a42875388e4b4',1,'glm']]],\n  ['fmat2x3',['fmat2x3',['../a00165.html#ga55a2d2a8eb09b5633668257eb3cad453',1,'glm']]],\n  ['fmat2x4',['fmat2x4',['../a00165.html#ga681381f19f11c9e5ee45cda2c56937ff',1,'glm']]],\n  ['fmat3',['fmat3',['../a00165.html#ga253d453c20e037730023fea0215cb6f6',1,'glm']]],\n  ['fmat3x2',['fmat3x2',['../a00165.html#ga6af54d70d9beb0a7ef992a879e86b04f',1,'glm']]],\n  ['fmat3x3',['fmat3x3',['../a00165.html#gaa07c86650253672a19dbfb898f3265b8',1,'glm']]],\n  ['fmat3x4',['fmat3x4',['../a00165.html#ga44e158af77a670ee1b58c03cda9e1619',1,'glm']]],\n  ['fmat4',['fmat4',['../a00165.html#ga8cb400c0f4438f2640035d7b9824a0ca',1,'glm']]],\n  ['fmat4x2',['fmat4x2',['../a00165.html#ga8c8aa45aafcc23238edb1d5aeb801774',1,'glm']]],\n  ['fmat4x3',['fmat4x3',['../a00165.html#ga4295048a78bdf46b8a7de77ec665b497',1,'glm']]],\n  ['fmat4x4',['fmat4x4',['../a00165.html#gad01cc6479bde1fd1870f13d3ed9530b3',1,'glm']]],\n  ['fvec1',['fvec1',['../a00165.html#ga98b9ed43cf8c5cf1d354b23c7df9119f',1,'glm']]],\n  ['fvec2',['fvec2',['../a00165.html#ga24273aa02abaecaab7f160bac437a339',1,'glm']]],\n  ['fvec3',['fvec3',['../a00165.html#ga89930533646b30d021759298aa6bf04a',1,'glm']]],\n  ['fvec4',['fvec4',['../a00165.html#ga713c796c54875cf4092d42ff9d9096b0',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_4.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_4.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_4.js",
    "content": "var searchData=\n[\n  ['highp_5fbvec2',['highp_bvec2',['../a00145.html#ga5d7156af15f362d4007769784a38e148',1,'glm']]],\n  ['highp_5fbvec3',['highp_bvec3',['../a00145.html#gae3625991931d1c556452a2c551748730',1,'glm']]],\n  ['highp_5fbvec4',['highp_bvec4',['../a00145.html#gaa0d2929c4809a6ff51ad616bf81e16e0',1,'glm']]],\n  ['highp_5fddualquat',['highp_ddualquat',['../a00178.html#ga8f67eafa7197d7a668dad5105a463d2a',1,'glm']]],\n  ['highp_5fdmat2',['highp_dmat2',['../a00145.html#ga02c6ed0185f84600c3b5001cf0db4746',1,'glm']]],\n  ['highp_5fdmat2x2',['highp_dmat2x2',['../a00145.html#ga458e8160a061147a3a2021c574b19787',1,'glm']]],\n  ['highp_5fdmat2x3',['highp_dmat2x3',['../a00145.html#ga60fe4ae1b320094bc2a8d977505a97f5',1,'glm']]],\n  ['highp_5fdmat2x4',['highp_dmat2x4',['../a00145.html#ga8b4fed753f9b7c217b0401dc808e780a',1,'glm']]],\n  ['highp_5fdmat3',['highp_dmat3',['../a00145.html#ga6d8eec93e1655d7889d2ef05c3fe580a',1,'glm']]],\n  ['highp_5fdmat3x2',['highp_dmat3x2',['../a00145.html#ga5922c1b5a0a4973b0256db146aa77049',1,'glm']]],\n  ['highp_5fdmat3x3',['highp_dmat3x3',['../a00145.html#gaca3b96f84c48db9830b5b0d4b07d1516',1,'glm']]],\n  ['highp_5fdmat3x4',['highp_dmat3x4',['../a00145.html#ga60cb89371783bb18003d3b2f8dbf62f8',1,'glm']]],\n  ['highp_5fdmat4',['highp_dmat4',['../a00145.html#ga96af41ad54c906b0ed14cbe43ca7db0d',1,'glm']]],\n  ['highp_5fdmat4x2',['highp_dmat4x2',['../a00145.html#gad779abbdd0c7594cee515e4546d3db29',1,'glm']]],\n  ['highp_5fdmat4x3',['highp_dmat4x3',['../a00145.html#ga719750bee4022a646b006d2dda75cb76',1,'glm']]],\n  ['highp_5fdmat4x4',['highp_dmat4x4',['../a00145.html#gab7e154baf836679251844a5d933bd0aa',1,'glm']]],\n  ['highp_5fdualquat',['highp_dualquat',['../a00178.html#ga9ef5bf1da52a9d4932335a517086ceaf',1,'glm']]],\n  ['highp_5fdvec2',['highp_dvec2',['../a00145.html#ga20f7155c9cdcafb74da02d0ef60629a4',1,'glm']]],\n  ['highp_5fdvec3',['highp_dvec3',['../a00145.html#gab8a03109aebc121ef69abec50fcdd459',1,'glm']]],\n  ['highp_5fdvec4',['highp_dvec4',['../a00145.html#ga9dfeaa53a616848ed067994a2bd18992',1,'glm']]],\n  ['highp_5ffdualquat',['highp_fdualquat',['../a00178.html#ga4c4e55e9c99dc57b299ed590968da564',1,'glm']]],\n  ['highp_5ffloat',['highp_float',['../a00145.html#ga6e95694987ba35af6f736638be39626a',1,'glm']]],\n  ['highp_5fi16',['highp_i16',['../a00165.html#ga0336abc2604dd2c20c30e036454b64f8',1,'glm']]],\n  ['highp_5fi32',['highp_i32',['../a00165.html#ga727675ac6b5d2fc699520e0059735e25',1,'glm']]],\n  ['highp_5fi64',['highp_i64',['../a00165.html#gac25db6d2b1e2a0f351b77ba3409ac4cd',1,'glm']]],\n  ['highp_5fi8',['highp_i8',['../a00165.html#gacb88796f2d08ef253d0345aff20c3aee',1,'glm']]],\n  ['highp_5fimat2',['highp_imat2',['../a00155.html#ga8499cc3b016003f835314c1c756e9db9',1,'glm']]],\n  ['highp_5fimat2x2',['highp_imat2x2',['../a00155.html#gaa389e2d1c3b10941cae870bc0aeba5b3',1,'glm']]],\n  ['highp_5fimat2x3',['highp_imat2x3',['../a00155.html#gaba49d890e06c9444795f5a133fbf1336',1,'glm']]],\n  ['highp_5fimat2x4',['highp_imat2x4',['../a00155.html#ga05a970fd4366dad6c8a0be676b1eae5b',1,'glm']]],\n  ['highp_5fimat3',['highp_imat3',['../a00155.html#gaca4506a3efa679eff7c006d9826291fd',1,'glm']]],\n  ['highp_5fimat3x2',['highp_imat3x2',['../a00155.html#ga91c671c3ff9706c2393e78b22fd84bcb',1,'glm']]],\n  ['highp_5fimat3x3',['highp_imat3x3',['../a00155.html#ga07d7b7173e2a6f843ff5f1c615a95b41',1,'glm']]],\n  ['highp_5fimat3x4',['highp_imat3x4',['../a00155.html#ga53008f580be99018a17b357b5a4ffc0d',1,'glm']]],\n  ['highp_5fimat4',['highp_imat4',['../a00155.html#ga7cfb09b34e0fcf73eaf6512d6483ef56',1,'glm']]],\n  ['highp_5fimat4x2',['highp_imat4x2',['../a00155.html#ga1858820fb292cae396408b2034407f72',1,'glm']]],\n  ['highp_5fimat4x3',['highp_imat4x3',['../a00155.html#ga6be0b80ae74bb309bc5b964d93d68fc5',1,'glm']]],\n  ['highp_5fimat4x4',['highp_imat4x4',['../a00155.html#ga2c783ee6f8f040ab37df2f70392c8b44',1,'glm']]],\n  ['highp_5fint',['highp_int',['../a00145.html#gaaabe7eb044941ebf308b53a447d692dc',1,'glm']]],\n  ['highp_5fint16',['highp_int16',['../a00165.html#ga5fde0fa4a3852a9dd5d637a92ee74718',1,'glm']]],\n  ['highp_5fint16_5ft',['highp_int16_t',['../a00165.html#gacaea06d0a79ef3172e887a7a6ba434ff',1,'glm']]],\n  ['highp_5fint32',['highp_int32',['../a00165.html#ga84ed04b4e0de18c977e932d617e7c223',1,'glm']]],\n  ['highp_5fint32_5ft',['highp_int32_t',['../a00165.html#ga2c71c8bd9e2fe7d2e93ca250d8b6157f',1,'glm']]],\n  ['highp_5fint64',['highp_int64',['../a00165.html#ga226a8d52b4e3f77aaa6231135e886aac',1,'glm']]],\n  ['highp_5fint64_5ft',['highp_int64_t',['../a00165.html#ga73c6abb280a45feeff60f9accaee91f3',1,'glm']]],\n  ['highp_5fint8',['highp_int8',['../a00165.html#gad0549c902a96a7164e4ac858d5f39dbf',1,'glm']]],\n  ['highp_5fint8_5ft',['highp_int8_t',['../a00165.html#ga1085c50dd8fbeb5e7e609b1c127492a5',1,'glm']]],\n  ['highp_5fivec2',['highp_ivec2',['../a00145.html#ga23594b732ebff0ff9630ddb2a3bad659',1,'glm']]],\n  ['highp_5fivec3',['highp_ivec3',['../a00145.html#ga24acd3b02b156bf0d67eaf17917ec4b7',1,'glm']]],\n  ['highp_5fivec4',['highp_ivec4',['../a00145.html#ga08f6be9d594bfc3b488e3e8b02d45518',1,'glm']]],\n  ['highp_5fmat2',['highp_mat2',['../a00145.html#ga4fcceff924fa2dc1f3d5217f68c5f81a',1,'glm']]],\n  ['highp_5fmat2x2',['highp_mat2x2',['../a00145.html#gabb2ee47d6bffb6d6363b34a7c61c8229',1,'glm']]],\n  ['highp_5fmat2x3',['highp_mat2x3',['../a00145.html#ga441b8e3402eefca108b40f3d22a1baa9',1,'glm']]],\n  ['highp_5fmat2x4',['highp_mat2x4',['../a00145.html#ga3b030d815c7c9f77c3c47e708863fd62',1,'glm']]],\n  ['highp_5fmat3',['highp_mat3',['../a00145.html#ga9f30904176d75657930fa4383618f968',1,'glm']]],\n  ['highp_5fmat3x2',['highp_mat3x2',['../a00145.html#ga12276a2b151d87c039134c388b5a3746',1,'glm']]],\n  ['highp_5fmat3x3',['highp_mat3x3',['../a00145.html#ga1b33e2669c291268ac4b1c9c296d2dc3',1,'glm']]],\n  ['highp_5fmat3x4',['highp_mat3x4',['../a00145.html#gabb55c60d8c7fb400bf2ed511251ca394',1,'glm']]],\n  ['highp_5fmat4',['highp_mat4',['../a00145.html#ga332149037f33cec9d9b583e11c3c8524',1,'glm']]],\n  ['highp_5fmat4x2',['highp_mat4x2',['../a00145.html#ga39ba2335320534c19db435a27d8bb765',1,'glm']]],\n  ['highp_5fmat4x3',['highp_mat4x3',['../a00145.html#gaf93a24b2e1c4a6f556fbcc796ec90e63',1,'glm']]],\n  ['highp_5fmat4x4',['highp_mat4x4',['../a00145.html#ga989736bc5e50330ef3ab13d34bebc66f',1,'glm']]],\n  ['highp_5fu16',['highp_u16',['../a00165.html#ga8e62c883d13f47015f3b70ed88751369',1,'glm']]],\n  ['highp_5fu32',['highp_u32',['../a00165.html#ga7a6f1929464dcc680b16381a4ee5f2cf',1,'glm']]],\n  ['highp_5fu64',['highp_u64',['../a00165.html#ga0c181fdf06a309691999926b6690c969',1,'glm']]],\n  ['highp_5fu8',['highp_u8',['../a00165.html#gacd1259f3a9e8d2a9df5be2d74322ef9c',1,'glm']]],\n  ['highp_5fuint',['highp_uint',['../a00145.html#ga73e8a694d7fc69143cf25161d18d1dcf',1,'glm']]],\n  ['highp_5fuint16',['highp_uint16',['../a00165.html#ga746dc6da204f5622e395f492997dbf57',1,'glm']]],\n  ['highp_5fuint16_5ft',['highp_uint16_t',['../a00165.html#gacf54c3330ef60aa3d16cb676c7bcb8c7',1,'glm']]],\n  ['highp_5fuint32',['highp_uint32',['../a00165.html#ga256b12b650c3f2fb86878fd1c5db8bc3',1,'glm']]],\n  ['highp_5fuint32_5ft',['highp_uint32_t',['../a00165.html#gae978599c9711ac263ba732d4ac225b0e',1,'glm']]],\n  ['highp_5fuint64',['highp_uint64',['../a00165.html#gaa38d732f5d4a7bc42a1b43b9d3c141ce',1,'glm']]],\n  ['highp_5fuint64_5ft',['highp_uint64_t',['../a00165.html#gaa46172d7dc1c7ffe3e78107ff88adf08',1,'glm']]],\n  ['highp_5fuint8',['highp_uint8',['../a00165.html#ga97432f9979e73e66567361fd01e4cffb',1,'glm']]],\n  ['highp_5fuint8_5ft',['highp_uint8_t',['../a00165.html#gac4e00a26a2adb5f2c0a7096810df29e5',1,'glm']]],\n  ['highp_5fumat2',['highp_umat2',['../a00155.html#ga42cbce64c4c1cd121b8437daa6e110de',1,'glm']]],\n  ['highp_5fumat2x2',['highp_umat2x2',['../a00155.html#ga5337b7bc95f9cbac08a0c00b3f936b28',1,'glm']]],\n  ['highp_5fumat2x3',['highp_umat2x3',['../a00155.html#ga90718c7128320b24b52f9ea70e643ad4',1,'glm']]],\n  ['highp_5fumat2x4',['highp_umat2x4',['../a00155.html#gadca0a4724b4a6f56a2355b6f6e19248b',1,'glm']]],\n  ['highp_5fumat3',['highp_umat3',['../a00155.html#gaa1143120339b7d2d469d327662e8a172',1,'glm']]],\n  ['highp_5fumat3x2',['highp_umat3x2',['../a00155.html#ga844a5da2e7fc03fc7cccc7f1b70809c4',1,'glm']]],\n  ['highp_5fumat3x3',['highp_umat3x3',['../a00155.html#ga1f7d41c36b980774a4d2e7c1647fb4b2',1,'glm']]],\n  ['highp_5fumat3x4',['highp_umat3x4',['../a00155.html#ga25ee15c323924f2d0fe9896d329e5086',1,'glm']]],\n  ['highp_5fumat4',['highp_umat4',['../a00155.html#gaf665e4e78c2cc32a54ab40325738f9c9',1,'glm']]],\n  ['highp_5fumat4x2',['highp_umat4x2',['../a00155.html#gae69eb82ec08b0dc9bf2ead2a339ff801',1,'glm']]],\n  ['highp_5fumat4x3',['highp_umat4x3',['../a00155.html#ga45a8163d02c43216252056b0c120f3a5',1,'glm']]],\n  ['highp_5fumat4x4',['highp_umat4x4',['../a00155.html#ga6a56cbb769aed334c95241664415f9ba',1,'glm']]],\n  ['highp_5fuvec2',['highp_uvec2',['../a00145.html#gab6d886704d5c7faf85b03e4a36290546',1,'glm']]],\n  ['highp_5fuvec3',['highp_uvec3',['../a00145.html#ga6f83c9b2aa706c9bc77587de13bf287e',1,'glm']]],\n  ['highp_5fuvec4',['highp_uvec4',['../a00145.html#ga09b43516ea6fd2c617fc4bee2995316a',1,'glm']]],\n  ['highp_5fvec2',['highp_vec2',['../a00145.html#gaa92c1954d71b1e7914874bd787b43d1c',1,'glm']]],\n  ['highp_5fvec3',['highp_vec3',['../a00145.html#gaca61dfaccbf2f58f2d8063a4e76b44a9',1,'glm']]],\n  ['highp_5fvec4',['highp_vec4',['../a00145.html#gad281decae52948b82feb3a9db8f63a7b',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_5.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_5.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_5.js",
    "content": "var searchData=\n[\n  ['i16',['i16',['../a00165.html#ga3ab5fe184343d394fb6c2723c3ee3699',1,'glm']]],\n  ['i16vec1',['i16vec1',['../a00165.html#gafe730798732aa7b0647096a004db1b1c',1,'glm']]],\n  ['i16vec2',['i16vec2',['../a00165.html#ga2996630ba7b10535af8e065cf326f761',1,'glm']]],\n  ['i16vec3',['i16vec3',['../a00165.html#gae9c90a867a6026b1f6eab00456f3fb8b',1,'glm']]],\n  ['i16vec4',['i16vec4',['../a00165.html#ga550831bfc26d1e0101c1cb3d79938c06',1,'glm']]],\n  ['i32',['i32',['../a00165.html#ga96faea43ac5f875d2d3ffbf8d213e3eb',1,'glm']]],\n  ['i32vec1',['i32vec1',['../a00165.html#ga54b8a4e0f5a7203a821bf8e9c1265bcf',1,'glm']]],\n  ['i32vec2',['i32vec2',['../a00165.html#ga8b44026374982dcd1e52d22bac99247e',1,'glm']]],\n  ['i32vec3',['i32vec3',['../a00165.html#ga7f526b5cccef126a2ebcf9bdd890394e',1,'glm']]],\n  ['i32vec4',['i32vec4',['../a00165.html#ga866a05905c49912309ed1fa5f5980e61',1,'glm']]],\n  ['i64',['i64',['../a00165.html#gadb997e409103d4da18abd837e636a496',1,'glm']]],\n  ['i64vec1',['i64vec1',['../a00165.html#ga2b65767f8b5aed1bd1cf86c541662b50',1,'glm']]],\n  ['i64vec2',['i64vec2',['../a00165.html#ga48310188e1d0c616bf8d78c92447523b',1,'glm']]],\n  ['i64vec3',['i64vec3',['../a00165.html#ga667948cfe6fb3d6606c750729ec49f77',1,'glm']]],\n  ['i64vec4',['i64vec4',['../a00165.html#gaa4e31c3d9de067029efeb161a44b0232',1,'glm']]],\n  ['i8',['i8',['../a00165.html#ga302ec977b0c0c3ea245b6c9275495355',1,'glm']]],\n  ['i8vec1',['i8vec1',['../a00165.html#ga7e80d927ff0a3861ced68dfff8a4020b',1,'glm']]],\n  ['i8vec2',['i8vec2',['../a00165.html#gad06935764d78f43f9d542c784c2212ec',1,'glm']]],\n  ['i8vec3',['i8vec3',['../a00165.html#ga5a08d36cf7917cd19d081a603d0eae3e',1,'glm']]],\n  ['i8vec4',['i8vec4',['../a00165.html#ga4177a44206121dabc8c4ff1c0f544574',1,'glm']]],\n  ['imat2',['imat2',['../a00155.html#gaabe04f9948d4a213bb1c20137de03e01',1,'glm']]],\n  ['imat2x2',['imat2x2',['../a00155.html#gaa4732a240522ad9bc28144fda2fc14ec',1,'glm']]],\n  ['imat2x3',['imat2x3',['../a00155.html#ga3f42dd3d5d94a0fd5706f7ec8dd0c605',1,'glm']]],\n  ['imat2x4',['imat2x4',['../a00155.html#ga9d8faafdca42583d67e792dd038fc668',1,'glm']]],\n  ['imat3',['imat3',['../a00155.html#ga038f68437155ffa3c2583a15264a8195',1,'glm']]],\n  ['imat3x2',['imat3x2',['../a00155.html#ga7b33bbe4f12c060892bd3cc8d4cd737f',1,'glm']]],\n  ['imat3x3',['imat3x3',['../a00155.html#ga6aacc960f62e8f7d2fe9d32d5050e7a4',1,'glm']]],\n  ['imat3x4',['imat3x4',['../a00155.html#ga6e9ce23496d8b08dfc302d4039694b58',1,'glm']]],\n  ['imat4',['imat4',['../a00155.html#ga96b0d26a33b81bb6a60ca0f39682f7eb',1,'glm']]],\n  ['imat4x2',['imat4x2',['../a00155.html#ga8ce7ef51d8b2c1901fa5414deccbc3fa',1,'glm']]],\n  ['imat4x3',['imat4x3',['../a00155.html#ga705ee0bf49d6c3de4404ce2481bf0df5',1,'glm']]],\n  ['imat4x4',['imat4x4',['../a00155.html#ga43ed5e4f475b6f4cad7cba78f29c405b',1,'glm']]],\n  ['int1',['int1',['../a00176.html#ga0670a2111b5e4a6410bd027fa0232fc3',1,'glm']]],\n  ['int16',['int16',['../a00165.html#ga302041c186d0d028bea31b711fe16759',1,'glm']]],\n  ['int16_5ft',['int16_t',['../a00165.html#gae8f5e3e964ca2ae240adc2c0d74adede',1,'glm']]],\n  ['int1x1',['int1x1',['../a00176.html#ga056ffe02d3a45af626f8e62221881c7a',1,'glm']]],\n  ['int2',['int2',['../a00176.html#gafe3a8fd56354caafe24bfe1b1e3ad22a',1,'glm']]],\n  ['int2x2',['int2x2',['../a00176.html#ga4e5ce477c15836b21e3c42daac68554d',1,'glm']]],\n  ['int2x3',['int2x3',['../a00176.html#ga197ded5ad8354f6b6fb91189d7a269b3',1,'glm']]],\n  ['int2x4',['int2x4',['../a00176.html#ga2749d59a7fddbac44f34ba78e57ef807',1,'glm']]],\n  ['int3',['int3',['../a00176.html#ga909c38a425f215a50c847145d7da09f0',1,'glm']]],\n  ['int32',['int32',['../a00165.html#ga8df669f4e7698dfe0c0354d92578d74f',1,'glm']]],\n  ['int32_5ft',['int32_t',['../a00165.html#ga042ef09ff2f0cb24a36f541bcb3a3710',1,'glm']]],\n  ['int3x2',['int3x2',['../a00176.html#gaa4cbe16a92cf3664376c7a2fc5126aa8',1,'glm']]],\n  ['int3x3',['int3x3',['../a00176.html#ga15c9649286f0bf431bdf9b3509580048',1,'glm']]],\n  ['int3x4',['int3x4',['../a00176.html#gaacac46ddc7d15d0f9529d05c92946a0f',1,'glm']]],\n  ['int4',['int4',['../a00176.html#gaecdef18c819c205aeee9f94dc93de56a',1,'glm']]],\n  ['int4x2',['int4x2',['../a00176.html#ga97a39dd9bc7d572810d80b8467cbffa1',1,'glm']]],\n  ['int4x3',['int4x3',['../a00176.html#gae4a2c53f14aeec9a17c2b81142b7e82d',1,'glm']]],\n  ['int4x4',['int4x4',['../a00176.html#ga04dee1552424198b8f58b377c2ee00d8',1,'glm']]],\n  ['int64',['int64',['../a00165.html#gaff5189f97f9e842d9636a0f240001b2e',1,'glm']]],\n  ['int64_5ft',['int64_t',['../a00165.html#ga322a7d7d2c2c68994dc872a33de63c61',1,'glm']]],\n  ['int8',['int8',['../a00165.html#ga41c6189f6485c2825d60fdc835b3a2b0',1,'glm']]],\n  ['int8_5ft',['int8_t',['../a00165.html#ga4bf09d8838a86866b39ee6e109341645',1,'glm']]],\n  ['ivec2',['ivec2',['../a00144.html#ga2ab812bd103527e2d6c62c2e2f5ee78f',1,'glm']]],\n  ['ivec3',['ivec3',['../a00144.html#ga34aee73784bcc247d426250540c1911c',1,'glm']]],\n  ['ivec4',['ivec4',['../a00144.html#gaaa26c41d168dc00be0fe55f4d0a34224',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_6.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_6.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_6.js",
    "content": "var searchData=\n[\n  ['lowp_5fbvec2',['lowp_bvec2',['../a00145.html#ga39fbc2447d5846af799d075a29c6e46d',1,'glm']]],\n  ['lowp_5fbvec3',['lowp_bvec3',['../a00145.html#ga916d4e72701db85b64815faf06050111',1,'glm']]],\n  ['lowp_5fbvec4',['lowp_bvec4',['../a00145.html#ga2e9de03b1c11d11f18ee8da8627a28c6',1,'glm']]],\n  ['lowp_5fddualquat',['lowp_ddualquat',['../a00178.html#gab4c5103338af3dac7e0fbc86895a3f1a',1,'glm']]],\n  ['lowp_5fdmat2',['lowp_dmat2',['../a00145.html#ga0dfc5624d872b189ab4a82bebca7107c',1,'glm']]],\n  ['lowp_5fdmat2x2',['lowp_dmat2x2',['../a00145.html#ga78e7b9e6dcadb7e8ac5562fe0263786c',1,'glm']]],\n  ['lowp_5fdmat2x3',['lowp_dmat2x3',['../a00145.html#ga4450cd185006155fff0380dad2d70ec4',1,'glm']]],\n  ['lowp_5fdmat2x4',['lowp_dmat2x4',['../a00145.html#ga49b6a11f54dcec866c0ecf17d7685165',1,'glm']]],\n  ['lowp_5fdmat3',['lowp_dmat3',['../a00145.html#gadffb225ac88b8a65e1e76233b8bd5768',1,'glm']]],\n  ['lowp_5fdmat3x2',['lowp_dmat3x2',['../a00145.html#ga02af788947516c41893c658990783fd4',1,'glm']]],\n  ['lowp_5fdmat3x3',['lowp_dmat3x3',['../a00145.html#ga0bae293e714e00f23e4bbf5a6c000448',1,'glm']]],\n  ['lowp_5fdmat3x4',['lowp_dmat3x4',['../a00145.html#ga42108fc51b1c14745e6edf399c1d0150',1,'glm']]],\n  ['lowp_5fdmat4',['lowp_dmat4',['../a00145.html#ga5d0f05a7d08f3f058110e1b79f805d7a',1,'glm']]],\n  ['lowp_5fdmat4x2',['lowp_dmat4x2',['../a00145.html#ga3daec60b56a8d57455cb60d8328f3645',1,'glm']]],\n  ['lowp_5fdmat4x3',['lowp_dmat4x3',['../a00145.html#gaaf5b6171d297b3a1c6c771e8b912c08d',1,'glm']]],\n  ['lowp_5fdmat4x4',['lowp_dmat4x4',['../a00145.html#ga843a2b7ca501078963910ea0b453f970',1,'glm']]],\n  ['lowp_5fdualquat',['lowp_dualquat',['../a00178.html#gade05d29ebd4deea0f883d0e1bb4169aa',1,'glm']]],\n  ['lowp_5fdvec2',['lowp_dvec2',['../a00145.html#ga8e7f034722aaa1895196f0381a1810f5',1,'glm']]],\n  ['lowp_5fdvec3',['lowp_dvec3',['../a00145.html#ga2b6374e88079410f8b641e21bf6b77a3',1,'glm']]],\n  ['lowp_5fdvec4',['lowp_dvec4',['../a00145.html#gabcd63b91329c8213fdae89d0da6ece4c',1,'glm']]],\n  ['lowp_5ffdualquat',['lowp_fdualquat',['../a00178.html#gaa38f671be25a7f3b136a452a8bb42860',1,'glm']]],\n  ['lowp_5ffloat',['lowp_float',['../a00145.html#ga358d69e11b1c0f6c7c469e0d39ab7fd1',1,'glm']]],\n  ['lowp_5fi16',['lowp_i16',['../a00165.html#ga392b673fd10847bfb78fb808c6cf8ff7',1,'glm']]],\n  ['lowp_5fi32',['lowp_i32',['../a00165.html#ga7ff73a45cea9613ebf1a9fad0b9f82ac',1,'glm']]],\n  ['lowp_5fi64',['lowp_i64',['../a00165.html#ga354736e0c645099cd44c42fb2f87c2b8',1,'glm']]],\n  ['lowp_5fi8',['lowp_i8',['../a00165.html#ga552a6bde5e75984efb0f863278da2e54',1,'glm']]],\n  ['lowp_5fimat2',['lowp_imat2',['../a00155.html#gaa0bff0be804142bb16d441aec0a7962e',1,'glm']]],\n  ['lowp_5fimat2x2',['lowp_imat2x2',['../a00155.html#ga92b95b679975d408645547ab45a8dcd8',1,'glm']]],\n  ['lowp_5fimat2x3',['lowp_imat2x3',['../a00155.html#ga8c9e7a388f8e7c52f1e6857dee8afb65',1,'glm']]],\n  ['lowp_5fimat2x4',['lowp_imat2x4',['../a00155.html#ga9cc13bd1f8dd2933e9fa31fe3f70e16e',1,'glm']]],\n  ['lowp_5fimat3',['lowp_imat3',['../a00155.html#ga69bfe668f4170379fc1f35d82b060c43',1,'glm']]],\n  ['lowp_5fimat3x2',['lowp_imat3x2',['../a00155.html#ga33db8f27491d30906cd37c0d86b3f432',1,'glm']]],\n  ['lowp_5fimat3x3',['lowp_imat3x3',['../a00155.html#ga664f061df00020048c3f8530329ace45',1,'glm']]],\n  ['lowp_5fimat3x4',['lowp_imat3x4',['../a00155.html#ga9273faab33623d944af4080befbb2c80',1,'glm']]],\n  ['lowp_5fimat4',['lowp_imat4',['../a00155.html#gad1e77f7270cad461ca4fcb4c3ec2e98c',1,'glm']]],\n  ['lowp_5fimat4x2',['lowp_imat4x2',['../a00155.html#ga26ec1a2ba08a1488f5f05336858a0f09',1,'glm']]],\n  ['lowp_5fimat4x3',['lowp_imat4x3',['../a00155.html#ga8f40483a3ae634ead8ad22272c543a33',1,'glm']]],\n  ['lowp_5fimat4x4',['lowp_imat4x4',['../a00155.html#gaf65677e53ac8e31a107399340d5e2451',1,'glm']]],\n  ['lowp_5fint',['lowp_int',['../a00145.html#gad0fa1e32e8b3552ed63556eca51c620e',1,'glm']]],\n  ['lowp_5fint16',['lowp_int16',['../a00165.html#ga698e36b01167fc0f037889334dce8def',1,'glm']]],\n  ['lowp_5fint16_5ft',['lowp_int16_t',['../a00165.html#ga8b2cd8d31eb345b2d641d9261c38db1a',1,'glm']]],\n  ['lowp_5fint32',['lowp_int32',['../a00165.html#ga864aabca5f3296e176e0c3ed9cc16b02',1,'glm']]],\n  ['lowp_5fint32_5ft',['lowp_int32_t',['../a00165.html#ga0350631d35ff800e6133ac6243b13cbc',1,'glm']]],\n  ['lowp_5fint64',['lowp_int64',['../a00165.html#gaf645b1a60203b39c0207baff5e3d8c3c',1,'glm']]],\n  ['lowp_5fint64_5ft',['lowp_int64_t',['../a00165.html#gaebf341fc4a5be233f7dde962c2e33847',1,'glm']]],\n  ['lowp_5fint8',['lowp_int8',['../a00165.html#ga760bcf26fdb23a2c3ecad3c928a19ae6',1,'glm']]],\n  ['lowp_5fint8_5ft',['lowp_int8_t',['../a00165.html#ga119c41d73fe9977358174eb3ac1035a3',1,'glm']]],\n  ['lowp_5fivec2',['lowp_ivec2',['../a00145.html#ga7ce7e678655c51239b95b2089e8f0e96',1,'glm']]],\n  ['lowp_5fivec3',['lowp_ivec3',['../a00145.html#ga59ae64e8103c0ccf7117bd3bee223ad0',1,'glm']]],\n  ['lowp_5fivec4',['lowp_ivec4',['../a00145.html#ga693ad87d8ccd440f0c0423281defeccd',1,'glm']]],\n  ['lowp_5fmat2',['lowp_mat2',['../a00145.html#ga08bba677ef7b2809ac0061fa9a3db854',1,'glm']]],\n  ['lowp_5fmat2x2',['lowp_mat2x2',['../a00145.html#ga993bdd19989dc1f4d09f664a2ee74cb5',1,'glm']]],\n  ['lowp_5fmat2x3',['lowp_mat2x3',['../a00145.html#ga083089177b89ae9166d8d251a90f4b8b',1,'glm']]],\n  ['lowp_5fmat2x4',['lowp_mat2x4',['../a00145.html#gae6e9638a6d1cadbd22f27c02998ebbf8',1,'glm']]],\n  ['lowp_5fmat3',['lowp_mat3',['../a00145.html#gacc4e277672e9f7b3cde23a4a3bd24fc9',1,'glm']]],\n  ['lowp_5fmat3x2',['lowp_mat3x2',['../a00145.html#ga10f0f2108800a543f22d90ecf4b40d01',1,'glm']]],\n  ['lowp_5fmat3x3',['lowp_mat3x3',['../a00145.html#ga1e4b7727038383e0103b138c66a65039',1,'glm']]],\n  ['lowp_5fmat3x4',['lowp_mat3x4',['../a00145.html#ga42a7c3c9eafb869c000b4388913ce0c7',1,'glm']]],\n  ['lowp_5fmat4',['lowp_mat4',['../a00145.html#ga73e2f3bcae71b05736f2c962f98565a1',1,'glm']]],\n  ['lowp_5fmat4x2',['lowp_mat4x2',['../a00145.html#ga9839115cb8be9524f0621caf4bb29665',1,'glm']]],\n  ['lowp_5fmat4x3',['lowp_mat4x3',['../a00145.html#ga7eb333327f0b261237b540496137d55e',1,'glm']]],\n  ['lowp_5fmat4x4',['lowp_mat4x4',['../a00145.html#ga8378facff06c21d2092a9a13c9ef0a0b',1,'glm']]],\n  ['lowp_5fu16',['lowp_u16',['../a00165.html#ga504ce1631cb2ac02fcf1d44d8c2aa126',1,'glm']]],\n  ['lowp_5fu32',['lowp_u32',['../a00165.html#ga4f072ada9552e1e480bbb3b1acde5250',1,'glm']]],\n  ['lowp_5fu64',['lowp_u64',['../a00165.html#ga30069d1f02b19599cbfadf98c23ac6ed',1,'glm']]],\n  ['lowp_5fu8',['lowp_u8',['../a00165.html#ga1b09f03da7ac43055c68a349d5445083',1,'glm']]],\n  ['lowp_5fuint',['lowp_uint',['../a00145.html#ga25ebc60727fc8b4a1167665f9ecdca97',1,'glm']]],\n  ['lowp_5fuint16',['lowp_uint16',['../a00165.html#gad68bfd9f881856fc863a6ebca0b67f78',1,'glm']]],\n  ['lowp_5fuint16_5ft',['lowp_uint16_t',['../a00165.html#ga91c4815f93177eb423362fd296a87e9f',1,'glm']]],\n  ['lowp_5fuint32',['lowp_uint32',['../a00165.html#gaa6a5b461bbf5fe20982472aa51896d4b',1,'glm']]],\n  ['lowp_5fuint32_5ft',['lowp_uint32_t',['../a00165.html#gaf1b735b4b1145174f4e4167d13778f9b',1,'glm']]],\n  ['lowp_5fuint64',['lowp_uint64',['../a00165.html#gaa212b805736a759998e312cbdd550fae',1,'glm']]],\n  ['lowp_5fuint64_5ft',['lowp_uint64_t',['../a00165.html#ga8dd3a3281ae5c970ffe0c41d538aa153',1,'glm']]],\n  ['lowp_5fuint8',['lowp_uint8',['../a00165.html#gaf49470869e9be2c059629b250619804e',1,'glm']]],\n  ['lowp_5fuint8_5ft',['lowp_uint8_t',['../a00165.html#ga667b2ece2b258be898812dc2177995d1',1,'glm']]],\n  ['lowp_5fumat2',['lowp_umat2',['../a00155.html#gaf2fba702d990437fc88ff3f3a76846ee',1,'glm']]],\n  ['lowp_5fumat2x2',['lowp_umat2x2',['../a00155.html#ga7b2e9d89745f7175051284e54c81d81c',1,'glm']]],\n  ['lowp_5fumat2x3',['lowp_umat2x3',['../a00155.html#ga3072f90fd86f17a862e21589fbb14c0f',1,'glm']]],\n  ['lowp_5fumat2x4',['lowp_umat2x4',['../a00155.html#ga8bb45fec4bd77bd81b4ae7eb961a270d',1,'glm']]],\n  ['lowp_5fumat3',['lowp_umat3',['../a00155.html#gaf1145f72bcdd590f5808c4bc170c2924',1,'glm']]],\n  ['lowp_5fumat3x2',['lowp_umat3x2',['../a00155.html#ga56ea68c6a6cba8d8c21d17bb14e69c6b',1,'glm']]],\n  ['lowp_5fumat3x3',['lowp_umat3x3',['../a00155.html#ga4f660a39a395cc14f018f985e7dfbeb5',1,'glm']]],\n  ['lowp_5fumat3x4',['lowp_umat3x4',['../a00155.html#gaec3d624306bd59649f021864709d56b5',1,'glm']]],\n  ['lowp_5fumat4',['lowp_umat4',['../a00155.html#gac092c6105827bf9ea080db38074b78eb',1,'glm']]],\n  ['lowp_5fumat4x2',['lowp_umat4x2',['../a00155.html#ga7716c2b210d141846f1ac4e774adef5e',1,'glm']]],\n  ['lowp_5fumat4x3',['lowp_umat4x3',['../a00155.html#ga09ab33a2636f5f43f7fae29cfbc20fff',1,'glm']]],\n  ['lowp_5fumat4x4',['lowp_umat4x4',['../a00155.html#ga10aafc66cf1a0ece336b1c5ae13d0cc0',1,'glm']]],\n  ['lowp_5fuvec2',['lowp_uvec2',['../a00145.html#ga3ab41df977e0b21c1c41a314b1011042',1,'glm']]],\n  ['lowp_5fuvec3',['lowp_uvec3',['../a00145.html#gaacab3ed11290185c279a97edc9255b98',1,'glm']]],\n  ['lowp_5fuvec4',['lowp_uvec4',['../a00145.html#ga4cdf061bac6ded19e940e876eab9b737',1,'glm']]],\n  ['lowp_5fvec2',['lowp_vec2',['../a00145.html#ga30e8baef5d56d5c166872a2bc00f36e9',1,'glm']]],\n  ['lowp_5fvec3',['lowp_vec3',['../a00145.html#ga868e8e4470a3ef97c7ee3032bf90dc79',1,'glm']]],\n  ['lowp_5fvec4',['lowp_vec4',['../a00145.html#gace3acb313c800552a9411953eb8b2ed7',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_7.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_7.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_7.js",
    "content": "var searchData=\n[\n  ['mat2',['mat2',['../a00144.html#ga6e30cfba068ebc3c71fe1f8b3110e450',1,'glm']]],\n  ['mat2x2',['mat2x2',['../a00144.html#ga0c84b211a5730357b63c6d2e4fb696d5',1,'glm']]],\n  ['mat2x3',['mat2x3',['../a00144.html#gafb063d734266e92915d87f8943560471',1,'glm']]],\n  ['mat2x4',['mat2x4',['../a00144.html#ga4d2ac1a80c36fb5a1d15914035f792ac',1,'glm']]],\n  ['mat3',['mat3',['../a00144.html#ga6dd3ec98a548755676267e59142911f8',1,'glm']]],\n  ['mat3x2',['mat3x2',['../a00144.html#ga3839ca29d011a80ff3ede7f22ba602a4',1,'glm']]],\n  ['mat3x3',['mat3x3',['../a00144.html#ga378921b6a07bcdad946858b340f69ab1',1,'glm']]],\n  ['mat3x4',['mat3x4',['../a00144.html#ga7876e0c3e3fcc3e2f4c0462c152e87cf',1,'glm']]],\n  ['mat4',['mat4',['../a00144.html#gade0eb47c01f79384a6f38017ede17446',1,'glm']]],\n  ['mat4x2',['mat4x2',['../a00144.html#ga1b3f6a5cbc17362141f9781262ed838f',1,'glm']]],\n  ['mat4x3',['mat4x3',['../a00144.html#gacd9ff3b943b3d8bda4f4b388320420fd',1,'glm']]],\n  ['mat4x4',['mat4x4',['../a00144.html#ga089315d5a0c20ac6eaa17a854bbd2e81',1,'glm']]],\n  ['mediump_5fbvec2',['mediump_bvec2',['../a00145.html#ga6670d1a61e113c339aac7dd2ae72154b',1,'glm']]],\n  ['mediump_5fbvec3',['mediump_bvec3',['../a00145.html#gaabc19c9cf2c0994f3ded6b98f9d37005',1,'glm']]],\n  ['mediump_5fbvec4',['mediump_bvec4',['../a00145.html#ga620d6dce077134eee76e014a3e2b2661',1,'glm']]],\n  ['mediump_5fddualquat',['mediump_ddualquat',['../a00178.html#ga0fb11e48e2d16348ccb06a25213641b4',1,'glm']]],\n  ['mediump_5fdmat2',['mediump_dmat2',['../a00145.html#ga963689d328dfa8fcaa4aa140f2e52cd0',1,'glm']]],\n  ['mediump_5fdmat2x2',['mediump_dmat2x2',['../a00145.html#gade27733f04b9a6f723850263ccda908b',1,'glm']]],\n  ['mediump_5fdmat2x3',['mediump_dmat2x3',['../a00145.html#ga253243e9a0e6a6235e41351f3d6fbd2e',1,'glm']]],\n  ['mediump_5fdmat2x4',['mediump_dmat2x4',['../a00145.html#ga6afa4f5d70f8e0dceed640a26918661b',1,'glm']]],\n  ['mediump_5fdmat3',['mediump_dmat3',['../a00145.html#ga5418e9669f0673640a2fbdeb261aff50',1,'glm']]],\n  ['mediump_5fdmat3x2',['mediump_dmat3x2',['../a00145.html#ga2196f803d3b4e1f920acef5b32ab41c4',1,'glm']]],\n  ['mediump_5fdmat3x3',['mediump_dmat3x3',['../a00145.html#gafee0cf7585d59b2485e42e8aae4714ca',1,'glm']]],\n  ['mediump_5fdmat3x4',['mediump_dmat3x4',['../a00145.html#ga9e0578807bf8880cea8336dfdb666d69',1,'glm']]],\n  ['mediump_5fdmat4',['mediump_dmat4',['../a00145.html#gafaf455c1dff11cb8f3c86467ac27a461',1,'glm']]],\n  ['mediump_5fdmat4x2',['mediump_dmat4x2',['../a00145.html#ga04b32b7cbfddf0f02a8b442f8b376680',1,'glm']]],\n  ['mediump_5fdmat4x3',['mediump_dmat4x3',['../a00145.html#ga002d912d086a3eaa5425a6c4ca468fea',1,'glm']]],\n  ['mediump_5fdmat4x4',['mediump_dmat4x4',['../a00145.html#gaeac3848d29b4b47332c44c31d9bcfa2f',1,'glm']]],\n  ['mediump_5fdualquat',['mediump_dualquat',['../a00178.html#gaa7aeb54c167712b38f2178a1be2360ad',1,'glm']]],\n  ['mediump_5fdvec2',['mediump_dvec2',['../a00145.html#ga00b74cf6997deedd6a962e0997bc120b',1,'glm']]],\n  ['mediump_5fdvec3',['mediump_dvec3',['../a00145.html#gabcad2ee624723d7add5ce5bf90b6bd2a',1,'glm']]],\n  ['mediump_5fdvec4',['mediump_dvec4',['../a00145.html#ga072fdd19df303b9b821b6793b86c1637',1,'glm']]],\n  ['mediump_5ffdualquat',['mediump_fdualquat',['../a00178.html#ga4a6b594ff7e81150d8143001367a9431',1,'glm']]],\n  ['mediump_5ffloat',['mediump_float',['../a00145.html#ga280c68f537f4b1e03a00b23e62573b98',1,'glm']]],\n  ['mediump_5fi16',['mediump_i16',['../a00165.html#ga62a17cddeb4dffb4e18fe3aea23f051a',1,'glm']]],\n  ['mediump_5fi32',['mediump_i32',['../a00165.html#gaf5e94bf2a20af7601787c154751dc2e1',1,'glm']]],\n  ['mediump_5fi64',['mediump_i64',['../a00165.html#ga3ebcb1f6d8d8387253de8bccb058d77f',1,'glm']]],\n  ['mediump_5fi8',['mediump_i8',['../a00165.html#gacf1ded173e1e2d049c511d095b259e21',1,'glm']]],\n  ['mediump_5fimat2',['mediump_imat2',['../a00155.html#ga20f4cc7ab23e2aa1f4db9fdb5496d378',1,'glm']]],\n  ['mediump_5fimat2x2',['mediump_imat2x2',['../a00155.html#ga4b2aeb11a329940721dda9583e71f856',1,'glm']]],\n  ['mediump_5fimat2x3',['mediump_imat2x3',['../a00155.html#ga74362470ba99843ac70aee5ac38cc674',1,'glm']]],\n  ['mediump_5fimat2x4',['mediump_imat2x4',['../a00155.html#ga8da25cd380ba30fc5b68a4687deb3e09',1,'glm']]],\n  ['mediump_5fimat3',['mediump_imat3',['../a00155.html#ga6c63bdc736efd3466e0730de0251cb71',1,'glm']]],\n  ['mediump_5fimat3x2',['mediump_imat3x2',['../a00155.html#gac0b4e42d648fb3eaf4bb88da82ecc809',1,'glm']]],\n  ['mediump_5fimat3x3',['mediump_imat3x3',['../a00155.html#gad99cc2aad8fc57f068cfa7719dbbea12',1,'glm']]],\n  ['mediump_5fimat3x4',['mediump_imat3x4',['../a00155.html#ga67689a518b181a26540bc44a163525cd',1,'glm']]],\n  ['mediump_5fimat4',['mediump_imat4',['../a00155.html#gaf348552978553630d2a00b78eb887ced',1,'glm']]],\n  ['mediump_5fimat4x2',['mediump_imat4x2',['../a00155.html#ga8b2d35816f7103f0f4c82dd2f27571fc',1,'glm']]],\n  ['mediump_5fimat4x3',['mediump_imat4x3',['../a00155.html#ga5b10acc696759e03f6ab918f4467e94c',1,'glm']]],\n  ['mediump_5fimat4x4',['mediump_imat4x4',['../a00155.html#ga2596869d154dec1180beadbb9df80501',1,'glm']]],\n  ['mediump_5fint',['mediump_int',['../a00145.html#ga212ef8f883878cb7430228a279a7d866',1,'glm']]],\n  ['mediump_5fint16',['mediump_int16',['../a00165.html#gadff3608baa4b5bd3ed28f95c1c2c345d',1,'glm']]],\n  ['mediump_5fint16_5ft',['mediump_int16_t',['../a00165.html#ga80e72fe94c88498537e8158ba7591c54',1,'glm']]],\n  ['mediump_5fint32',['mediump_int32',['../a00165.html#ga5244cef85d6e870e240c76428a262ae8',1,'glm']]],\n  ['mediump_5fint32_5ft',['mediump_int32_t',['../a00165.html#ga26fc7ced1ad7ca5024f1c973c8dc9180',1,'glm']]],\n  ['mediump_5fint64',['mediump_int64',['../a00165.html#ga7b968f2b86a0442a89c7359171e1d866',1,'glm']]],\n  ['mediump_5fint64_5ft',['mediump_int64_t',['../a00165.html#gac3bc41bcac61d1ba8f02a6f68ce23f64',1,'glm']]],\n  ['mediump_5fint8',['mediump_int8',['../a00165.html#ga6fbd69cbdaa44345bff923a2cf63de7e',1,'glm']]],\n  ['mediump_5fint8_5ft',['mediump_int8_t',['../a00165.html#ga6d7b3789ecb932c26430009478cac7ae',1,'glm']]],\n  ['mediump_5fivec2',['mediump_ivec2',['../a00145.html#gaabd76afa066badf4489fd0fec28f9537',1,'glm']]],\n  ['mediump_5fivec3',['mediump_ivec3',['../a00145.html#gaf964dcfcbb2088d13c9c321517171154',1,'glm']]],\n  ['mediump_5fivec4',['mediump_ivec4',['../a00145.html#ga7f89d11cd6e64c1814200f8cca083512',1,'glm']]],\n  ['mediump_5fmat2',['mediump_mat2',['../a00145.html#ga83fe5281ac0a3d153226b903badd415b',1,'glm']]],\n  ['mediump_5fmat2x2',['mediump_mat2x2',['../a00145.html#gaf1beb3328c79fece7dcc34c5b05b57a0',1,'glm']]],\n  ['mediump_5fmat2x3',['mediump_mat2x3',['../a00145.html#ga0bda8ba50fa930ef29d4fa91a85f229a',1,'glm']]],\n  ['mediump_5fmat2x4',['mediump_mat2x4',['../a00145.html#gaa190a86a477360f02508191a6549efc3',1,'glm']]],\n  ['mediump_5fmat3',['mediump_mat3',['../a00145.html#gad31f8a0097ff6c22b92cf855dfffc575',1,'glm']]],\n  ['mediump_5fmat3x2',['mediump_mat3x2',['../a00145.html#ga66a044feff0a17b1bf275bc8d200e514',1,'glm']]],\n  ['mediump_5fmat3x3',['mediump_mat3x3',['../a00145.html#ga2c78fa1875926e5c6684ae1f8b49092a',1,'glm']]],\n  ['mediump_5fmat3x4',['mediump_mat3x4',['../a00145.html#ga5bcf41dd2acbace9ed7ae4326cb45e6e',1,'glm']]],\n  ['mediump_5fmat4',['mediump_mat4',['../a00145.html#ga0f910a2c5bf1c3fd153c4bc13cefee58',1,'glm']]],\n  ['mediump_5fmat4x2',['mediump_mat4x2',['../a00145.html#gaced6ccfdae150c4465be59c0b15f4d9e',1,'glm']]],\n  ['mediump_5fmat4x3',['mediump_mat4x3',['../a00145.html#ga1bab99cd9c4edd4bffdab662609b0961',1,'glm']]],\n  ['mediump_5fmat4x4',['mediump_mat4x4',['../a00145.html#ga005facdef4caac0ef7435eee609c7e46',1,'glm']]],\n  ['mediump_5fu16',['mediump_u16',['../a00165.html#ga9df98857be695d5a30cb30f5bfa38a80',1,'glm']]],\n  ['mediump_5fu32',['mediump_u32',['../a00165.html#ga1bd0e914158bf03135f8a317de6debe9',1,'glm']]],\n  ['mediump_5fu64',['mediump_u64',['../a00165.html#ga2af9490085ae3bdf36a544e9dd073610',1,'glm']]],\n  ['mediump_5fu8',['mediump_u8',['../a00165.html#gad1213a22bbb9e4107f07eaa4956f8281',1,'glm']]],\n  ['mediump_5fuint',['mediump_uint',['../a00145.html#ga0b7e01c52b9e5bf3369761b79b5f4f8e',1,'glm']]],\n  ['mediump_5fuint16',['mediump_uint16',['../a00165.html#ga2885a6c89916911e418c06bb76b9bdbb',1,'glm']]],\n  ['mediump_5fuint16_5ft',['mediump_uint16_t',['../a00165.html#ga3963b1050fc65a383ee28e3f827b6e3e',1,'glm']]],\n  ['mediump_5fuint32',['mediump_uint32',['../a00165.html#ga34dd5ec1988c443bae80f1b20a8ade5f',1,'glm']]],\n  ['mediump_5fuint32_5ft',['mediump_uint32_t',['../a00165.html#gaf4dae276fd29623950de14a6ca2586b5',1,'glm']]],\n  ['mediump_5fuint64',['mediump_uint64',['../a00165.html#ga30652709815ad9404272a31957daa59e',1,'glm']]],\n  ['mediump_5fuint64_5ft',['mediump_uint64_t',['../a00165.html#ga9b170dd4a8f38448a2dc93987c7875e9',1,'glm']]],\n  ['mediump_5fuint8',['mediump_uint8',['../a00165.html#ga1fa92a233b9110861cdbc8c2ccf0b5a3',1,'glm']]],\n  ['mediump_5fuint8_5ft',['mediump_uint8_t',['../a00165.html#gadfe65c78231039e90507770db50c98c7',1,'glm']]],\n  ['mediump_5fumat2',['mediump_umat2',['../a00155.html#ga43041378b3410ea951b7de0dfd2bc7ee',1,'glm']]],\n  ['mediump_5fumat2x2',['mediump_umat2x2',['../a00155.html#ga3b209b1b751f041422137e3c065dfa98',1,'glm']]],\n  ['mediump_5fumat2x3',['mediump_umat2x3',['../a00155.html#gaee2c1f13b41f4c92ea5b3efe367a1306',1,'glm']]],\n  ['mediump_5fumat2x4',['mediump_umat2x4',['../a00155.html#gae1317ddca16d01e119a40b7f0ee85f95',1,'glm']]],\n  ['mediump_5fumat3',['mediump_umat3',['../a00155.html#ga1730dbe3c67801f53520b06d1aa0a34a',1,'glm']]],\n  ['mediump_5fumat3x2',['mediump_umat3x2',['../a00155.html#gaadc28bfdc8ebca81ae85121b11994970',1,'glm']]],\n  ['mediump_5fumat3x3',['mediump_umat3x3',['../a00155.html#ga48f2fc38d3f7fab3cfbc961278ced53d',1,'glm']]],\n  ['mediump_5fumat3x4',['mediump_umat3x4',['../a00155.html#ga78009a1e4ca64217e46b418535e52546',1,'glm']]],\n  ['mediump_5fumat4',['mediump_umat4',['../a00155.html#ga5087c2beb26a11d9af87432e554cf9d1',1,'glm']]],\n  ['mediump_5fumat4x2',['mediump_umat4x2',['../a00155.html#gaf35aefd81cc13718f6b059623f7425fa',1,'glm']]],\n  ['mediump_5fumat4x3',['mediump_umat4x3',['../a00155.html#ga4e1bed14fbc7f4b376aaed064f89f0fb',1,'glm']]],\n  ['mediump_5fumat4x4',['mediump_umat4x4',['../a00155.html#gaa9428fc8430dc552aad920653f822ef3',1,'glm']]],\n  ['mediump_5fuvec2',['mediump_uvec2',['../a00145.html#gaf2d61afc5b2e4132f72885d4a51f0081',1,'glm']]],\n  ['mediump_5fuvec3',['mediump_uvec3',['../a00145.html#gaab484fc37dddd84f767d84e38d761649',1,'glm']]],\n  ['mediump_5fuvec4',['mediump_uvec4',['../a00145.html#gaa9f64ab6e1618ba357966f18e3e4e6aa',1,'glm']]],\n  ['mediump_5fvec2',['mediump_vec2',['../a00145.html#gabc61976261c406520c7a8e4d946dc3f0',1,'glm']]],\n  ['mediump_5fvec3',['mediump_vec3',['../a00145.html#ga2384e263df19f1404b733016eff78fca',1,'glm']]],\n  ['mediump_5fvec4',['mediump_vec4',['../a00145.html#ga5c6978d3ffba06738416a33083853fc0',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_8.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_8.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_8.js",
    "content": "var searchData=\n[\n  ['packed_5fbvec1',['packed_bvec1',['../a00164.html#ga88632cea9008ac0ac1388e94e804a53c',1,'glm']]],\n  ['packed_5fbvec2',['packed_bvec2',['../a00164.html#gab85245913eaa40ab82adabcae37086cb',1,'glm']]],\n  ['packed_5fbvec3',['packed_bvec3',['../a00164.html#ga0c48f9417f649e27f3fb0c9f733a18bd',1,'glm']]],\n  ['packed_5fbvec4',['packed_bvec4',['../a00164.html#ga3180d7db84a74c402157df3bbc0ae3ed',1,'glm']]],\n  ['packed_5fdvec1',['packed_dvec1',['../a00164.html#ga532f0c940649b1ee303acd572fc35531',1,'glm']]],\n  ['packed_5fdvec2',['packed_dvec2',['../a00164.html#ga5c194b11fbda636f2ab20c3bd0079196',1,'glm']]],\n  ['packed_5fdvec3',['packed_dvec3',['../a00164.html#ga0581ea552d86b2b5de7a2804bed80e72',1,'glm']]],\n  ['packed_5fdvec4',['packed_dvec4',['../a00164.html#gae8a9b181f9dc813ad6e125a52b14b935',1,'glm']]],\n  ['packed_5fhighp_5fbvec1',['packed_highp_bvec1',['../a00164.html#ga439e97795314b81cd15abd4e5c2e6e7a',1,'glm']]],\n  ['packed_5fhighp_5fbvec2',['packed_highp_bvec2',['../a00164.html#gad791d671f4fcf1ed1ea41f752916b70a',1,'glm']]],\n  ['packed_5fhighp_5fbvec3',['packed_highp_bvec3',['../a00164.html#ga6a5a3250b57dfadc66735bc72911437f',1,'glm']]],\n  ['packed_5fhighp_5fbvec4',['packed_highp_bvec4',['../a00164.html#ga09f517d88b996ef1b2f42fd54222b82d',1,'glm']]],\n  ['packed_5fhighp_5fdvec1',['packed_highp_dvec1',['../a00164.html#gab472b2d917b5e6efd76e8c7dbfbbf9f1',1,'glm']]],\n  ['packed_5fhighp_5fdvec2',['packed_highp_dvec2',['../a00164.html#ga5b2dc48fa19b684d207d69c6b145eb63',1,'glm']]],\n  ['packed_5fhighp_5fdvec3',['packed_highp_dvec3',['../a00164.html#gaaac6b356ef00154da41aaae7d1549193',1,'glm']]],\n  ['packed_5fhighp_5fdvec4',['packed_highp_dvec4',['../a00164.html#ga81b5368fe485e2630aa9b44832d592e7',1,'glm']]],\n  ['packed_5fhighp_5fivec1',['packed_highp_ivec1',['../a00164.html#ga7245acc887a5438f46fd85fdf076bb3b',1,'glm']]],\n  ['packed_5fhighp_5fivec2',['packed_highp_ivec2',['../a00164.html#ga54f368ec6b514a5aa4f28d40e6f93ef7',1,'glm']]],\n  ['packed_5fhighp_5fivec3',['packed_highp_ivec3',['../a00164.html#ga865a9c7bb22434b1b8c5ac31e164b628',1,'glm']]],\n  ['packed_5fhighp_5fivec4',['packed_highp_ivec4',['../a00164.html#gad6f1b4e3a51c2c051814b60d5d1b8895',1,'glm']]],\n  ['packed_5fhighp_5fuvec1',['packed_highp_uvec1',['../a00164.html#ga8c32b53f628a3616aa5061e58d66fe74',1,'glm']]],\n  ['packed_5fhighp_5fuvec2',['packed_highp_uvec2',['../a00164.html#gab704d4fb15f6f96d70e363d5db7060cd',1,'glm']]],\n  ['packed_5fhighp_5fuvec3',['packed_highp_uvec3',['../a00164.html#ga0b570da473fec4619db5aa0dce5133b0',1,'glm']]],\n  ['packed_5fhighp_5fuvec4',['packed_highp_uvec4',['../a00164.html#gaa582f38c82aef61dea7aaedf15bb06a6',1,'glm']]],\n  ['packed_5fhighp_5fvec1',['packed_highp_vec1',['../a00164.html#ga56473759d2702ee19ab7f91d0017fa70',1,'glm']]],\n  ['packed_5fhighp_5fvec2',['packed_highp_vec2',['../a00164.html#ga6b8b9475e7c3b16aed13edbc460bbc4d',1,'glm']]],\n  ['packed_5fhighp_5fvec3',['packed_highp_vec3',['../a00164.html#ga3815661df0e2de79beff8168c09adf1e',1,'glm']]],\n  ['packed_5fhighp_5fvec4',['packed_highp_vec4',['../a00164.html#ga4015f36bf5a5adb6ac5d45beed959867',1,'glm']]],\n  ['packed_5fivec1',['packed_ivec1',['../a00164.html#ga11581a06fc7bf941fa4d4b6aca29812c',1,'glm']]],\n  ['packed_5fivec2',['packed_ivec2',['../a00164.html#ga1fe4c5f56b8087d773aa90dc88a257a7',1,'glm']]],\n  ['packed_5fivec3',['packed_ivec3',['../a00164.html#gae157682a7847161787951ba1db4cf325',1,'glm']]],\n  ['packed_5fivec4',['packed_ivec4',['../a00164.html#gac228b70372abd561340d5f926a7c1778',1,'glm']]],\n  ['packed_5flowp_5fbvec1',['packed_lowp_bvec1',['../a00164.html#gae3c8750f53259ece334d3aa3b3649a40',1,'glm']]],\n  ['packed_5flowp_5fbvec2',['packed_lowp_bvec2',['../a00164.html#gac969befedbda69eb78d4e23f751fdbee',1,'glm']]],\n  ['packed_5flowp_5fbvec3',['packed_lowp_bvec3',['../a00164.html#ga7c20adbe1409e3fe4544677a7f6fe954',1,'glm']]],\n  ['packed_5flowp_5fbvec4',['packed_lowp_bvec4',['../a00164.html#gae473587cff3092edc0877fc691c26a0b',1,'glm']]],\n  ['packed_5flowp_5fdvec1',['packed_lowp_dvec1',['../a00164.html#ga054050e9d4e78d81db0e6d1573b1c624',1,'glm']]],\n  ['packed_5flowp_5fdvec2',['packed_lowp_dvec2',['../a00164.html#gadc19938ddb204bfcb4d9ef35b1e2bf93',1,'glm']]],\n  ['packed_5flowp_5fdvec3',['packed_lowp_dvec3',['../a00164.html#ga9189210cabd6651a5e14a4c46fb20598',1,'glm']]],\n  ['packed_5flowp_5fdvec4',['packed_lowp_dvec4',['../a00164.html#ga262dafd0c001c3a38d1cc91d024ca738',1,'glm']]],\n  ['packed_5flowp_5fivec1',['packed_lowp_ivec1',['../a00164.html#gaf22b77f1cf3e73b8b1dddfe7f959357c',1,'glm']]],\n  ['packed_5flowp_5fivec2',['packed_lowp_ivec2',['../a00164.html#ga52635859f5ef660ab999d22c11b7867f',1,'glm']]],\n  ['packed_5flowp_5fivec3',['packed_lowp_ivec3',['../a00164.html#ga98c9d122a959e9f3ce10a5623c310f5d',1,'glm']]],\n  ['packed_5flowp_5fivec4',['packed_lowp_ivec4',['../a00164.html#ga931731b8ae3b54c7ecc221509dae96bc',1,'glm']]],\n  ['packed_5flowp_5fuvec1',['packed_lowp_uvec1',['../a00164.html#gaf111fed760ecce16cb1988807569bee5',1,'glm']]],\n  ['packed_5flowp_5fuvec2',['packed_lowp_uvec2',['../a00164.html#ga958210fe245a75b058325d367c951132',1,'glm']]],\n  ['packed_5flowp_5fuvec3',['packed_lowp_uvec3',['../a00164.html#ga576a3f8372197a56a79dee1c8280f485',1,'glm']]],\n  ['packed_5flowp_5fuvec4',['packed_lowp_uvec4',['../a00164.html#gafdd97922b4a2a42cd0c99a13877ff4da',1,'glm']]],\n  ['packed_5flowp_5fvec1',['packed_lowp_vec1',['../a00164.html#ga0a6198fe64166a6a61084d43c71518a9',1,'glm']]],\n  ['packed_5flowp_5fvec2',['packed_lowp_vec2',['../a00164.html#gafbf1c2cce307c5594b165819ed83bf5d',1,'glm']]],\n  ['packed_5flowp_5fvec3',['packed_lowp_vec3',['../a00164.html#ga3a30c137c1f8cce478c28eab0427a570',1,'glm']]],\n  ['packed_5flowp_5fvec4',['packed_lowp_vec4',['../a00164.html#ga3cc94fb8de80bbd8a4aa7a5b206d304a',1,'glm']]],\n  ['packed_5fmediump_5fbvec1',['packed_mediump_bvec1',['../a00164.html#ga5546d828d63010a8f9cf81161ad0275a',1,'glm']]],\n  ['packed_5fmediump_5fbvec2',['packed_mediump_bvec2',['../a00164.html#gab4c6414a59539e66a242ad4cf4b476b4',1,'glm']]],\n  ['packed_5fmediump_5fbvec3',['packed_mediump_bvec3',['../a00164.html#ga70147763edff3fe96b03a0b98d6339a2',1,'glm']]],\n  ['packed_5fmediump_5fbvec4',['packed_mediump_bvec4',['../a00164.html#ga7b1620f259595b9da47a6374fc44588a',1,'glm']]],\n  ['packed_5fmediump_5fdvec1',['packed_mediump_dvec1',['../a00164.html#ga8920e90ea9c01d9c97e604a938ce2cbd',1,'glm']]],\n  ['packed_5fmediump_5fdvec2',['packed_mediump_dvec2',['../a00164.html#ga0c754a783b6fcf80374c013371c4dae9',1,'glm']]],\n  ['packed_5fmediump_5fdvec3',['packed_mediump_dvec3',['../a00164.html#ga1f18ada6f7cdd8c46db33ba987280fc4',1,'glm']]],\n  ['packed_5fmediump_5fdvec4',['packed_mediump_dvec4',['../a00164.html#ga568b850f1116b667043533cf77826968',1,'glm']]],\n  ['packed_5fmediump_5fivec1',['packed_mediump_ivec1',['../a00164.html#ga09507ef020a49517a7bcd50438f05056',1,'glm']]],\n  ['packed_5fmediump_5fivec2',['packed_mediump_ivec2',['../a00164.html#gaaa891048dddef4627df33809ec726219',1,'glm']]],\n  ['packed_5fmediump_5fivec3',['packed_mediump_ivec3',['../a00164.html#ga06f26d54dca30994eb1fdadb8e69f4a2',1,'glm']]],\n  ['packed_5fmediump_5fivec4',['packed_mediump_ivec4',['../a00164.html#ga70130dc8ed9c966ec2a221ce586d45d8',1,'glm']]],\n  ['packed_5fmediump_5fuvec1',['packed_mediump_uvec1',['../a00164.html#ga2c29fb42bab9a4f9b66bc60b2e514a34',1,'glm']]],\n  ['packed_5fmediump_5fuvec2',['packed_mediump_uvec2',['../a00164.html#gaa1f95690a78dc12e39da32943243aeef',1,'glm']]],\n  ['packed_5fmediump_5fuvec3',['packed_mediump_uvec3',['../a00164.html#ga1ea2bbdbcb0a69242f6d884663c1b0ab',1,'glm']]],\n  ['packed_5fmediump_5fuvec4',['packed_mediump_uvec4',['../a00164.html#ga63a73be86a4f07ea7a7499ab0bfebe45',1,'glm']]],\n  ['packed_5fmediump_5fvec1',['packed_mediump_vec1',['../a00164.html#ga71d63cead1e113fca0bcdaaa33aad050',1,'glm']]],\n  ['packed_5fmediump_5fvec2',['packed_mediump_vec2',['../a00164.html#ga6844c6f4691d1bf67673240850430948',1,'glm']]],\n  ['packed_5fmediump_5fvec3',['packed_mediump_vec3',['../a00164.html#gab0eb771b708c5b2205d9b14dd1434fd8',1,'glm']]],\n  ['packed_5fmediump_5fvec4',['packed_mediump_vec4',['../a00164.html#ga68c9bb24f387b312bae6a0a68e74d95e',1,'glm']]],\n  ['packed_5fuvec1',['packed_uvec1',['../a00164.html#ga5621493caac01bdd22ab6be4416b0314',1,'glm']]],\n  ['packed_5fuvec2',['packed_uvec2',['../a00164.html#gabcc33efb4d5e83b8fe4706360e75b932',1,'glm']]],\n  ['packed_5fuvec3',['packed_uvec3',['../a00164.html#gab96804e99e3a72a35740fec690c79617',1,'glm']]],\n  ['packed_5fuvec4',['packed_uvec4',['../a00164.html#ga8e5d92e84ebdbe2480cf96bc17d6e2f2',1,'glm']]],\n  ['packed_5fvec1',['packed_vec1',['../a00164.html#ga14741e3d9da9ae83765389927f837331',1,'glm']]],\n  ['packed_5fvec2',['packed_vec2',['../a00164.html#ga3254defa5a8f0ae4b02b45fedba84a66',1,'glm']]],\n  ['packed_5fvec3',['packed_vec3',['../a00164.html#gaccccd090e185450caa28b5b63ad4e8f0',1,'glm']]],\n  ['packed_5fvec4',['packed_vec4',['../a00164.html#ga37a0e0bf653169b581c5eea3d547fa5d',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_9.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_9.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_9.js",
    "content": "var searchData=\n[\n  ['qword',['qword',['../a00214.html#ga4021754ffb8e5ef14c75802b15657714',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_a.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_a.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_a.js",
    "content": "var searchData=\n[\n  ['sint',['sint',['../a00190.html#gada7e83fdfe943aba4f1d5bf80cb66f40',1,'glm']]],\n  ['size1',['size1',['../a00219.html#gaeb877ac8f9a3703961736c1c5072cf68',1,'glm']]],\n  ['size1_5ft',['size1_t',['../a00219.html#gaaf6accc57f5aa50447ba7310ce3f0d6f',1,'glm']]],\n  ['size2',['size2',['../a00219.html#ga1bfe8c4975ff282bce41be2bacd524fe',1,'glm']]],\n  ['size2_5ft',['size2_t',['../a00219.html#ga5976c25657d4e2b5f73f39364c3845d6',1,'glm']]],\n  ['size3',['size3',['../a00219.html#gae1c72956d0359b0db332c6c8774d3b04',1,'glm']]],\n  ['size3_5ft',['size3_t',['../a00219.html#gaf2654983c60d641fd3808e65a8dfad8d',1,'glm']]],\n  ['size4',['size4',['../a00219.html#ga3a19dde617beaf8ce3cfc2ac5064e9aa',1,'glm']]],\n  ['size4_5ft',['size4_t',['../a00219.html#gaa423efcea63675a2df26990dbcb58656',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_b.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_b.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_b.js",
    "content": "var searchData=\n[\n  ['u16',['u16',['../a00165.html#gaa2d7acc0adb536fab71fe261232a40ff',1,'glm']]],\n  ['u16vec1',['u16vec1',['../a00165.html#ga08c05ba8ffb19f5d14ab584e1e9e9ee5',1,'glm::u16vec1()'],['../a00206.html#ga52cc069a92e126c3a8dcde93424d2ef0',1,'glm::gtx::u16vec1()']]],\n  ['u16vec2',['u16vec2',['../a00165.html#ga2a78447eb9d66a114b193f4a25899c16',1,'glm']]],\n  ['u16vec3',['u16vec3',['../a00165.html#ga1c522ca821c27b862fe51cf4024b064b',1,'glm']]],\n  ['u16vec4',['u16vec4',['../a00165.html#ga529496d75775fb656a07993ea9af2450',1,'glm']]],\n  ['u32',['u32',['../a00165.html#ga8165913e068444f7842302d40ba897b9',1,'glm']]],\n  ['u32vec1',['u32vec1',['../a00165.html#gae627372cfd5f20dd87db490387b71195',1,'glm::u32vec1()'],['../a00206.html#ga9bbc1e14aea65cba5e2dcfef6a67d9f3',1,'glm::gtx::u32vec1()']]],\n  ['u32vec2',['u32vec2',['../a00165.html#ga2a266e46ee218d0c680f12b35c500cc0',1,'glm']]],\n  ['u32vec3',['u32vec3',['../a00165.html#gae267358ff2a41d156d97f5762630235a',1,'glm']]],\n  ['u32vec4',['u32vec4',['../a00165.html#ga31cef34e4cd04840c54741ff2f7005f0',1,'glm']]],\n  ['u64',['u64',['../a00165.html#gaf3f312156984c365e9f65620354da70b',1,'glm']]],\n  ['u64vec1',['u64vec1',['../a00165.html#gaf09f3ca4b671a4a4f84505eb4cc865fd',1,'glm::u64vec1()'],['../a00206.html#ga818de170e2584ab037130f2881925974',1,'glm::gtx::u64vec1()']]],\n  ['u64vec2',['u64vec2',['../a00165.html#gaef3824ed4fe435a019c5b9dddf53fec5',1,'glm']]],\n  ['u64vec3',['u64vec3',['../a00165.html#ga489b89ba93d4f7b3934df78debc52276',1,'glm']]],\n  ['u64vec4',['u64vec4',['../a00165.html#ga3945dd6515d4498cb603e65ff867ab03',1,'glm']]],\n  ['u8',['u8',['../a00165.html#gaecc7082561fc9028b844b6cf3d305d36',1,'glm']]],\n  ['u8vec1',['u8vec1',['../a00165.html#ga29b349e037f0b24320b4548a143daee2',1,'glm::u8vec1()'],['../a00206.html#ga5853fe457f4c8a6bc09343d0e9833980',1,'glm::gtx::u8vec1()']]],\n  ['u8vec2',['u8vec2',['../a00165.html#ga518b8d948a6b4ddb72f84d5c3b7b6611',1,'glm']]],\n  ['u8vec3',['u8vec3',['../a00165.html#ga7c5706f6bbe5282e5598acf7e7b377e2',1,'glm']]],\n  ['u8vec4',['u8vec4',['../a00165.html#ga20779a61de2fd526a17f12fe53ec46b1',1,'glm']]],\n  ['uint',['uint',['../a00145.html#ga91ad9478d81a7aaf2593e8d9c3d06a14',1,'glm']]],\n  ['uint16',['uint16',['../a00165.html#ga13471cbbe74e4303a57f3743d007b74d',1,'glm']]],\n  ['uint16_5ft',['uint16_t',['../a00165.html#ga91f91f411080c37730856ff5887f5bcf',1,'glm']]],\n  ['uint32',['uint32',['../a00165.html#ga5fa3ddcab56c789bc272ff5651faa12d',1,'glm']]],\n  ['uint32_5ft',['uint32_t',['../a00165.html#ga2171d9dc1fefb1c82e2817f45b622eac',1,'glm']]],\n  ['uint64',['uint64',['../a00165.html#gab630f76c26b50298187f7889104d4b9c',1,'glm']]],\n  ['uint64_5ft',['uint64_t',['../a00165.html#ga3999d3e7ff22025c16ddb601e14dfdee',1,'glm']]],\n  ['uint8',['uint8',['../a00165.html#ga36475e31b1992cfde54c1a6f5a148865',1,'glm']]],\n  ['uint8_5ft',['uint8_t',['../a00165.html#ga28d97808322d3c92186e4a0c067d7e8e',1,'glm']]],\n  ['umat2',['umat2',['../a00155.html#ga4cae85566f900debf930c41944b64691',1,'glm']]],\n  ['umat2x2',['umat2x2',['../a00155.html#gabf8acdd33ce8951051edbca5200898aa',1,'glm']]],\n  ['umat2x3',['umat2x3',['../a00155.html#ga1870da7578d5022b973a83155d386ab3',1,'glm']]],\n  ['umat2x4',['umat2x4',['../a00155.html#ga57936a3998e992370e59a223e0ee4fd4',1,'glm']]],\n  ['umat3',['umat3',['../a00155.html#ga5085e3ff02abbac5e537eb7b89ab63b6',1,'glm']]],\n  ['umat3x2',['umat3x2',['../a00155.html#ga9cd7fa637a4a6788337f45231fad9e1a',1,'glm']]],\n  ['umat3x3',['umat3x3',['../a00155.html#ga1f2cfcf3357db0cdf31fcb15e3c6bafb',1,'glm']]],\n  ['umat3x4',['umat3x4',['../a00155.html#gae7c78ff3fc4309605ab0fa186c8d48ba',1,'glm']]],\n  ['umat4',['umat4',['../a00155.html#ga38bc7bb6494e344185df596deeb4544c',1,'glm']]],\n  ['umat4x2',['umat4x2',['../a00155.html#ga70fa2d05896aa83cbc8c07672a429b53',1,'glm']]],\n  ['umat4x3',['umat4x3',['../a00155.html#ga87581417945411f75cb31dd6ca1dba98',1,'glm']]],\n  ['umat4x4',['umat4x4',['../a00155.html#gaf72e6d399c42985db6872c50f53d7eb8',1,'glm']]],\n  ['uvec2',['uvec2',['../a00144.html#ga9bcffa2d49f28d16f680757b5c0e7c84',1,'glm']]],\n  ['uvec3',['uvec3',['../a00144.html#gae85537b672ffe0b3218cbdf1823e1c72',1,'glm']]],\n  ['uvec4',['uvec4',['../a00144.html#gaa7c3a0e7ae50c34c3290415c115f251e',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_c.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_c.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_c.js",
    "content": "var searchData=\n[\n  ['vec2',['vec2',['../a00144.html#ga09d0200e8ff86391d8804b4fefd5f1da',1,'glm']]],\n  ['vec3',['vec3',['../a00144.html#gaa8ea2429bb3cb41a715258a447f39897',1,'glm']]],\n  ['vec4',['vec4',['../a00144.html#gafbab23070ca47932487d25332adc7d7c',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_d.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html><head><title></title>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta name=\"generator\" content=\"Doxygen 1.8.10\"/>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>\n<script type=\"text/javascript\" src=\"typedefs_d.js\"></script>\n<script type=\"text/javascript\" src=\"search.js\"></script>\n</head>\n<body class=\"SRPage\">\n<div id=\"SRIndex\">\n<div class=\"SRStatus\" id=\"Loading\">Loading...</div>\n<div id=\"SRResults\"></div>\n<script type=\"text/javascript\"><!--\ncreateResults();\n--></script>\n<div class=\"SRStatus\" id=\"Searching\">Searching...</div>\n<div class=\"SRStatus\" id=\"NoMatches\">No Matches</div>\n<script type=\"text/javascript\"><!--\ndocument.getElementById(\"Loading\").style.display=\"none\";\ndocument.getElementById(\"NoMatches\").style.display=\"none\";\nvar searchResults = new SearchResults(\"searchResults\");\nsearchResults.Search();\n--></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "external/glm/doc/api/search/typedefs_d.js",
    "content": "var searchData=\n[\n  ['word',['word',['../a00214.html#ga16e9fea0ef1e6c4ef472d3d1731c49a5',1,'glm']]]\n];\n"
  },
  {
    "path": "external/glm/doc/api/tabs.css",
    "content": ".tabs, .tabs2, .tabs3 {\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFEEDD 95%, #FFEEDD);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFF4F0), to(#FFF4F0));\n    background-color:#FFF8F0;\n\n    width: 100%;\n    z-index: 101;\n    font-size: 13px;\n    font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n}\n\n.tabs2 {\n    font-size: 10px;\n}\n.tabs3 {\n    font-size: 9px;\n}\n\n.tablist {\n    margin: 0;\n    padding: 0;\n    display: table;\n}\n\n.tablist li {\n    float: left;\n    display: table-cell;\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFF4F0 95%, #FFF4F0);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFF4F0), to(#FFF4F0));\n\n    line-height: 36px;\n    list-style: none;\n}\n\n.tablist a {\n    display: block;\n    padding: 0 20px;\n    font-weight: bold;\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFF4F0 95%, #FFF4F0);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFF4F0), to(#FFF4F0));\n\n    background-repeat:no-repeat;\n    background-position:right;\n    background-color:#FFF4F0;\n    color: #992600;\n    text-decoration: none;\n    outline: none;\n}\n\n.tabs3 .tablist a {\n    padding: 0 10px;\n}\n\n.tablist a:hover {\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFF0F8 95%, #FFF0F8);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFF8F0), to(#FF4000));\n\n    background-color:#FFF8F0;\n    color: #FF8000;\n    text-decoration: none;\n}\n\n.tablist li.current a {\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFFCF8 95%, #FFFCF8);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFFCF8), to(#FFFCF8));\n\n    background-color:#FFFCF8;\n    color: #992600;\n}\n"
  },
  {
    "path": "external/glm/doc/man.doxy",
    "content": "# Doxyfile 1.8.10\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a double hash (##) is considered a comment and is placed in\n# front of the TAG it is preceding.\n#\n# All text after a single hash (#) is considered a comment and will be ignored.\n# The format is:\n# TAG = value [value, ...]\n# For lists, items can also be appended using:\n# TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\\\" \\\").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all text\n# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv\n# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv\n# for the list of possible encodings.\n# The default value is: UTF-8.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by\n# double-quotes, unless you are using Doxywizard) that should identify the\n# project for which the documentation is generated. This name is used in the\n# title of most generated pages and in a few other places.\n# The default value is: My Project.\n\nPROJECT_NAME           = \"0.9.9 API documenation\"\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. This\n# could be handy for archiving the generated documentation or if some version\n# control system is used.\n\nPROJECT_NUMBER         = \n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer a\n# quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = \n\n# With the PROJECT_LOGO tag one can specify a logo or an icon that is included\n# in the documentation. The maximum height of the logo should not exceed 55\n# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy\n# the logo to the output directory.\n\nPROJECT_LOGO           = G:/Source/G-Truc/glm/doc/manual/logo-mini.png\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path\n# into which the generated documentation will be written. If a relative path is\n# entered, it will be relative to the location where doxygen was started. If\n# left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = .\n\n# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-\n# directories (in 2 levels) under the output directory of each output format and\n# will distribute the generated files over these directories. Enabling this\n# option can be useful when feeding doxygen a huge amount of source files, where\n# putting all generated files in the same directory would otherwise causes\n# performance problems for the file system.\n# The default value is: NO.\n\nCREATE_SUBDIRS         = NO\n\n# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII\n# characters to appear in the names of generated files. If set to NO, non-ASCII\n# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode\n# U+3044.\n# The default value is: NO.\n\nALLOW_UNICODE_NAMES    = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,\n# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),\n# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,\n# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),\n# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,\n# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,\n# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,\n# Ukrainian and Vietnamese.\n# The default value is: English.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member\n# descriptions after the members that are listed in the file and class\n# documentation (similar to Javadoc). Set to NO to disable this.\n# The default value is: YES.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief\n# description of a member or function before the detailed description\n#\n# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n# The default value is: YES.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator that is\n# used to form the text in various listings. Each string in this list, if found\n# as the leading text of the brief description, will be stripped from the text\n# and the result, after processing the whole list, is used as the annotated\n# text. Otherwise, the brief description is used as-is. If left blank, the\n# following values are used ($name is automatically replaced with the name of\n# the entity):The $name class, The $name widget, The $name file, is, provides,\n# specifies, contains, represents, a, an and the.\n\nABBREVIATE_BRIEF       = \"The $name class       \" \\\n                         \"The $name widget       \" \\\n                         \"The $name file       \" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# doxygen will generate a detailed section even if there is only a brief\n# description.\n# The default value is: NO.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n# The default value is: NO.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path\n# before files name in the file list and in the header files. If set to NO the\n# shortest path that makes the file name unique will be used\n# The default value is: YES.\n\nFULL_PATH_NAMES        = NO\n\n# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.\n# Stripping is only done if one of the specified strings matches the left-hand\n# part of the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the path to\n# strip.\n#\n# Note that you can specify absolute paths here, but also relative paths, which\n# will be relative from the directory where doxygen is started.\n# This tag requires that the tag FULL_PATH_NAMES is set to YES.\n\nSTRIP_FROM_PATH        = \"C:/Documents and Settings/Groove/       \"\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the\n# path mentioned in the documentation of a class, which tells the reader which\n# header file to include in order to use a class. If left blank only the name of\n# the header file containing the class definition is used. Otherwise one should\n# specify the list of include paths that are normally passed to the compiler\n# using the -I flag.\n\nSTRIP_FROM_INC_PATH    = \n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but\n# less readable) file names. This can be useful is your file systems doesn't\n# support long names like on DOS, Mac, or CD-ROM.\n# The default value is: NO.\n\nSHORT_NAMES            = YES\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the\n# first line (until the first dot) of a Javadoc-style comment as the brief\n# description. If set to NO, the Javadoc-style will behave just like regular Qt-\n# style comments (thus requiring an explicit @brief command for a brief\n# description.)\n# The default value is: NO.\n\nJAVADOC_AUTOBRIEF      = YES\n\n# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first\n# line (until the first dot) of a Qt-style comment as the brief description. If\n# set to NO, the Qt-style will behave just like regular Qt-style comments (thus\n# requiring an explicit \\brief command for a brief description.)\n# The default value is: NO.\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a\n# multi-line C++ special comment block (i.e. a block of //! or /// comments) as\n# a brief description. This used to be the default behavior. The new default is\n# to treat a multi-line C++ comment block as a detailed description. Set this\n# tag to YES if you prefer the old behavior instead.\n#\n# Note that setting this tag to YES also means that rational rose comments are\n# not recognized any more.\n# The default value is: NO.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the\n# documentation from any documented member that it re-implements.\n# The default value is: YES.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new\n# page for each member. If set to NO, the documentation of a member will be part\n# of the file/class/namespace that contains it.\n# The default value is: NO.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen\n# uses this value to replace tabs by spaces in code fragments.\n# Minimum value: 1, maximum value: 16, default value: 4.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that act as commands in\n# the documentation. An alias has the form:\n# name=value\n# For example adding\n# \"sideeffect=@par Side Effects:\\n\"\n# will allow you to put the command \\sideeffect (or @sideeffect) in the\n# documentation, which will result in a user-defined paragraph with heading\n# \"Side Effects:\". You can put \\n's in the value part of an alias to insert\n# newlines.\n\nALIASES                = \n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding \"class=itcl::class\"\n# will allow you to use the command class in the itcl::class meaning.\n\nTCL_SUBST              = \n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n# only. Doxygen will then generate output that is more tailored for C. For\n# instance, some of the names that are used will be different. The list of all\n# members will be omitted, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or\n# Python sources only. Doxygen will then generate output that is more tailored\n# for that language. For instance, namespaces will be presented as packages,\n# qualified scopes will look different, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources. Doxygen will then generate output that is tailored for Fortran.\n# The default value is: NO.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for VHDL.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension, and\n# language is one of the parsers supported by doxygen: IDL, Java, Javascript,\n# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:\n# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:\n# Fortran. In the later case the parser tries to guess whether the code is fixed\n# or free formatted code, this is the default for Fortran type files), VHDL. For\n# instance to make doxygen treat .inc files as Fortran files (default is PHP),\n# and .f files as C (default is Fortran), use: inc=Fortran f=C.\n#\n# Note: For files without extension you can use no_extension as a placeholder.\n#\n# Note that for custom extensions you also need to set FILE_PATTERNS otherwise\n# the files are not read by doxygen.\n\nEXTENSION_MAPPING      = \n\n# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments\n# according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you can\n# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in\n# case of backward compatibilities issues.\n# The default value is: YES.\n\nMARKDOWN_SUPPORT       = YES\n\n# When enabled doxygen tries to link words that correspond to documented\n# classes, or namespaces to their corresponding documentation. Such a link can\n# be prevented in individual cases by putting a % sign in front of the word or\n# globally by setting AUTOLINK_SUPPORT to NO.\n# The default value is: YES.\n\nAUTOLINK_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should set this\n# tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string);\n# versus func(std::string) {}). This also make the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n# The default value is: NO.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n# The default value is: NO.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:\n# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen\n# will parse them like normal C++ but will assume all classes use public instead\n# of private inheritance when no explicit protection keyword is present.\n# The default value is: NO.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES will make\n# doxygen to replace the get and set methods by a property in the documentation.\n# This will only work if the methods are indeed getting or setting a simple\n# type. If this is not the case, or you want to show the methods anyway, you\n# should set this option to NO.\n# The default value is: YES.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n# The default value is: NO.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# If one adds a struct or class to a group and this option is enabled, then also\n# any nested class or struct is added to the same group. By default this option\n# is disabled and one has to add nested compounds explicitly via \\ingroup.\n# The default value is: NO.\n\nGROUP_NESTED_COMPOUNDS = NO\n\n# Set the SUBGROUPING tag to YES to allow class member groups of the same type\n# (for instance a group of public functions) to be put as a subgroup of that\n# type (e.g. under the Public Functions section). Set it to NO to prevent\n# subgrouping. Alternatively, this can be done per class using the\n# \\nosubgrouping command.\n# The default value is: YES.\n\nSUBGROUPING            = NO\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions\n# are shown inside the group in which they are included (e.g. using \\ingroup)\n# instead of on a separate page (for HTML and Man pages) or section (for LaTeX\n# and RTF).\n#\n# Note that this feature does not work in combination with\n# SEPARATE_MEMBER_PAGES.\n# The default value is: NO.\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions\n# with only public data fields or simple typedef fields will be shown inline in\n# the documentation of the scope in which they are defined (i.e. file,\n# namespace, or group documentation), provided this scope is documented. If set\n# to NO, structs, classes, and unions are shown on a separate page (for HTML and\n# Man pages) or section (for LaTeX and RTF).\n# The default value is: NO.\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or\n# enum is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically be\n# useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n# The default value is: NO.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n# cache is used to resolve symbols given their name and scope. Since this can be\n# an expensive process and often the same symbol appears multiple times in the\n# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small\n# doxygen will become slower. If the cache is too large, memory is wasted. The\n# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range\n# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536\n# symbols. At the end of a run doxygen will report the cache usage and suggest\n# the optimal cache size from a speed point of view.\n# Minimum value: 0, maximum value: 9, default value: 0.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in\n# documentation are documented, even if no documentation was available. Private\n# class members and static file members will be hidden unless the\n# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.\n# Note: This will also disable the warnings about undocumented members that are\n# normally produced when WARNINGS is set to YES.\n# The default value is: NO.\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will\n# be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal\n# scope will be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be\n# included in the documentation.\n# The default value is: NO.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined\n# locally in source files will be included in the documentation. If set to NO,\n# only classes defined in header files are included. Does not have any effect\n# for Java sources.\n# The default value is: YES.\n\nEXTRACT_LOCAL_CLASSES  = NO\n\n# This flag is only useful for Objective-C code. If set to YES, local methods,\n# which are defined in the implementation section but not in the interface are\n# included in the documentation. If set to NO, only methods in the interface are\n# included.\n# The default value is: NO.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base name of\n# the file that contains the anonymous namespace. By default anonymous namespace\n# are hidden.\n# The default value is: NO.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all\n# undocumented members inside documented classes or files. If set to NO these\n# members will be included in the various overviews, but no documentation\n# section is generated. This option has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_MEMBERS     = YES\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy. If set\n# to NO, these classes will be included in the various overviews. This option\n# has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_CLASSES     = YES\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend\n# (class|struct|union) declarations. If set to NO, these declarations will be\n# included in the documentation.\n# The default value is: NO.\n\nHIDE_FRIEND_COMPOUNDS  = YES\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any\n# documentation blocks found inside the body of a function. If set to NO, these\n# blocks will be appended to the function's detailed documentation block.\n# The default value is: NO.\n\nHIDE_IN_BODY_DOCS      = YES\n\n# The INTERNAL_DOCS tag determines if documentation that is typed after a\n# \\internal command is included. If the tag is set to NO then the documentation\n# will be excluded. Set it to YES to include the internal documentation.\n# The default value is: NO.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file\n# names in lower-case letters. If set to YES, upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n# The default value is: system dependent.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with\n# their full class and namespace scopes in the documentation. If set to YES, the\n# scope will be hidden.\n# The default value is: NO.\n\nHIDE_SCOPE_NAMES       = YES\n\n# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will\n# append additional text to a page's title, such as Class Reference. If set to\n# YES the compound reference will be hidden.\n# The default value is: NO.\n\nHIDE_COMPOUND_REFERENCE= NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of\n# the files that are included by a file in the documentation of that file.\n# The default value is: YES.\n\nSHOW_INCLUDE_FILES     = NO\n\n# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each\n# grouped member an include statement to the documentation, telling the reader\n# which file to include in order to use the member.\n# The default value is: NO.\n\nSHOW_GROUPED_MEMB_INC  = NO\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include\n# files with double quotes in the documentation rather than with sharp brackets.\n# The default value is: NO.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the\n# documentation for inline members.\n# The default value is: YES.\n\nINLINE_INFO            = NO\n\n# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the\n# (detailed) documentation of file and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order.\n# The default value is: YES.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief\n# descriptions of file, namespace and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order. Note that\n# this will also influence the order of the classes in the class list.\n# The default value is: NO.\n\nSORT_BRIEF_DOCS        = YES\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the\n# (brief and detailed) documentation of class members so that constructors and\n# destructors are listed first. If set to NO the constructors will appear in the\n# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.\n# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief\n# member documentation.\n# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting\n# detailed member documentation.\n# The default value is: NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy\n# of group names into alphabetical order. If set to NO the group names will\n# appear in their defined order.\n# The default value is: NO.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by\n# fully-qualified names, including namespaces. If set to NO, the class list will\n# be sorted only by class name, not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the alphabetical\n# list.\n# The default value is: NO.\n\nSORT_BY_SCOPE_NAME     = YES\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper\n# type resolution of all parameters of a function it will reject a match between\n# the prototype and the implementation of a member function even if there is\n# only one candidate or it is obvious which candidate to choose by doing a\n# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still\n# accept a match between prototype and implementation in such cases.\n# The default value is: NO.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo\n# list. This list is created by putting \\todo commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test\n# list. This list is created by putting \\test commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug\n# list. This list is created by putting \\bug commands in the documentation.\n# The default value is: YES.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)\n# the deprecated list. This list is created by putting \\deprecated commands in\n# the documentation.\n# The default value is: YES.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional documentation\n# sections, marked by \\if <section_label> ... \\endif and \\cond <section_label>\n# ... \\endcond blocks.\n\nENABLED_SECTIONS       = \n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the\n# initial value of a variable or macro / define can have for it to appear in the\n# documentation. If the initializer consists of more lines than specified here\n# it will be hidden. Use a value of 0 to hide initializers completely. The\n# appearance of the value of individual variables and macros / defines can be\n# controlled using \\showinitializer or \\hideinitializer command in the\n# documentation regardless of this setting.\n# Minimum value: 0, maximum value: 10000, default value: 30.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at\n# the bottom of the documentation of classes and structs. If set to YES, the\n# list will mention the files that were used to generate the documentation.\n# The default value is: YES.\n\nSHOW_USED_FILES        = NO\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This\n# will remove the Files entry from the Quick Index and from the Folder Tree View\n# (if specified).\n# The default value is: YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces\n# page. This will remove the Namespaces entry from the Quick Index and from the\n# Folder Tree View (if specified).\n# The default value is: YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command command input-file, where command is the value of the\n# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided\n# by doxygen. Whatever the program writes to standard output is used as the file\n# version. For an example see the documentation.\n\nFILE_VERSION_FILTER    = \n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option. You can\n# optionally specify a file name after the option, if omitted DoxygenLayout.xml\n# will be used as the name of the layout file.\n#\n# Note that if you run doxygen from a directory containing a file called\n# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE\n# tag is left empty.\n\nLAYOUT_FILE            = \n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files containing\n# the reference definitions. This must be a list of .bib files. The .bib\n# extension is automatically appended if omitted. This requires the bibtex tool\n# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.\n# For LaTeX the style of the bibliography can be controlled using\n# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the\n# search path. See also \\cite for info how to create references.\n\nCITE_BIB_FILES         = \n\n#---------------------------------------------------------------------------\n# Configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated to\n# standard output by doxygen. If QUIET is set to YES this implies that the\n# messages are off.\n# The default value is: NO.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES\n# this implies that the warnings are on.\n#\n# Tip: Turn warnings on while writing the documentation.\n# The default value is: YES.\n\nWARNINGS               = YES\n\n# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate\n# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag\n# will automatically be disabled.\n# The default value is: YES.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some parameters\n# in a documented function, or documenting parameters that don't exist or using\n# markup commands wrongly.\n# The default value is: YES.\n\nWARN_IF_DOC_ERROR      = YES\n\n# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that\n# are documented, but have no documentation for their parameters or return\n# value. If set to NO, doxygen will only warn about wrong or incomplete\n# parameter documentation, but not about the absence of documentation.\n# The default value is: NO.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that doxygen\n# can produce. The string should contain the $file, $line, and $text tags, which\n# will be replaced by the file and line number from which the warning originated\n# and the warning text. Optionally the format may contain $version, which will\n# be replaced by the version of the file (if it could be obtained via\n# FILE_VERSION_FILTER)\n# The default value is: $file:$line: $text.\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning and error\n# messages should be written. If left blank the output is written to standard\n# error (stderr).\n\nWARN_LOGFILE           = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag is used to specify the files and/or directories that contain\n# documented source files. You may enter file names like myfile.cpp or\n# directories like /usr/src/myproject. Separate the files or directories with\n# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING\n# Note: If this tag is empty the current directory is searched.\n\nINPUT                  = ../glm \\\n                         .\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses\n# libiconv (or the iconv built into libc) for the transcoding. See the libiconv\n# documentation (see: http://www.gnu.org/software/libiconv) for the list of\n# possible encodings.\n# The default value is: UTF-8.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and\n# *.h) to filter out the source-files in the directories.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# read by doxygen.\n#\n# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,\n# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,\n# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,\n# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd,\n# *.vhdl, *.ucf, *.qsf, *.as and *.js.\n\nFILE_PATTERNS          = *.hpp \\\n                         *.doxy\n\n# The RECURSIVE tag can be used to specify whether or not subdirectories should\n# be searched for input files as well.\n# The default value is: NO.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n#\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = \n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n# The default value is: NO.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories.\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = \n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories use the pattern */test/*\n\nEXCLUDE_SYMBOLS        = \n\n# The EXAMPLE_PATH tag can be used to specify one or more files or directories\n# that contain example code fragments that are included (see the \\include\n# command).\n\nEXAMPLE_PATH           = \n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and\n# *.h) to filter out the source-files in the directories. If left blank all\n# files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude commands\n# irrespective of the value of the RECURSIVE tag.\n# The default value is: NO.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or directories\n# that contain images that are to be included in the documentation (see the\n# \\image command).\n\nIMAGE_PATH             = \n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command:\n#\n# <filter> <input-file>\n#\n# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the\n# name of an input file. Doxygen will then use the output that the filter\n# program writes to standard output. If FILTER_PATTERNS is specified, this tag\n# will be ignored.\n#\n# Note that the filter must not add or remove lines; it is applied before the\n# code is scanned, but not when the output code is generated. If lines are added\n# or removed, the anchors will not be placed correctly.\n\nINPUT_FILTER           = \n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis. Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match. The filters are a list of the form: pattern=filter\n# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how\n# filters are used. If the FILTER_PATTERNS tag is empty or if none of the\n# patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        = \n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will also be used to filter the input files that are used for\n# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).\n# The default value is: NO.\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and\n# it is also possible to disable source filtering for a specific pattern using\n# *.ext= (so without naming a filter).\n# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.\n\nFILTER_SOURCE_PATTERNS = \n\n# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page\n# (index.html). This can be useful if you have a project on for instance GitHub\n# and want to reuse the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE = \n\n#---------------------------------------------------------------------------\n# Configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will be\n# generated. Documented entities will be cross-referenced with these sources.\n#\n# Note: To get rid of all source code in the generated output, make sure that\n# also VERBATIM_HEADERS is set to NO.\n# The default value is: NO.\n\nSOURCE_BROWSER         = YES\n\n# Setting the INLINE_SOURCES tag to YES will include the body of functions,\n# classes and enums directly into the documentation.\n# The default value is: NO.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any\n# special comment blocks from generated source code fragments. Normal C, C++ and\n# Fortran comments will always remain visible.\n# The default value is: YES.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES then for each documented\n# function all documented functions referencing it will be listed.\n# The default value is: NO.\n\nREFERENCED_BY_RELATION = YES\n\n# If the REFERENCES_RELATION tag is set to YES then for each documented function\n# all documented entities called/used by that function will be listed.\n# The default value is: NO.\n\nREFERENCES_RELATION    = YES\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set\n# to YES then the hyperlinks from functions in REFERENCES_RELATION and\n# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will\n# link to the documentation.\n# The default value is: YES.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the\n# source code will show a tooltip with additional information such as prototype,\n# brief description and links to the definition and documentation. Since this\n# will make the HTML file larger and loading of large files a bit slower, you\n# can opt to disable this feature.\n# The default value is: YES.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nSOURCE_TOOLTIPS        = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code will\n# point to the HTML generated by the htags(1) tool instead of doxygen built-in\n# source browser. The htags tool is part of GNU's global source tagging system\n# (see http://www.gnu.org/software/global/global.html). You will need version\n# 4.8.6 or higher.\n#\n# To use it do the following:\n# - Install the latest version of global\n# - Enable SOURCE_BROWSER and USE_HTAGS in the config file\n# - Make sure the INPUT points to the root of the source tree\n# - Run doxygen as normal\n#\n# Doxygen will invoke htags (and that will in turn invoke gtags), so these\n# tools must be available from the command line (i.e. in the search path).\n#\n# The result: instead of the source browser generated by doxygen, the links to\n# source code will now point to the output of htags.\n# The default value is: NO.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a\n# verbatim copy of the header file for each class for which an include is\n# specified. Set to NO to disable this.\n# See also: Section \\class.\n# The default value is: YES.\n\nVERBATIM_HEADERS       = YES\n\n# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the\n# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the\n# cost of reduced performance. This can be particularly helpful with template\n# rich C++ code for which doxygen's built-in parser lacks the necessary type\n# information.\n# Note: The availability of this option depends on whether or not doxygen was\n# compiled with the --with-libclang option.\n# The default value is: NO.\n\nCLANG_ASSISTED_PARSING = NO\n\n# If clang assisted parsing is enabled you can provide the compiler with command\n# line options that you would normally use when invoking the compiler. Note that\n# the include paths will already be set by doxygen for the files and directories\n# specified with INPUT and INCLUDE_PATH.\n# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.\n\nCLANG_OPTIONS          = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all\n# compounds will be generated. Enable this if the project contains a lot of\n# classes, structs, unions or interfaces.\n# The default value is: YES.\n\nALPHABETICAL_INDEX     = NO\n\n# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in\n# which the alphabetical index list will be split.\n# Minimum value: 1, maximum value: 20, default value: 5.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all classes will\n# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag\n# can be used to specify a prefix (or a list of prefixes) that should be ignored\n# while generating the index headers.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nIGNORE_PREFIX          = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output\n# The default value is: YES.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each\n# generated HTML page (for example: .htm, .php, .asp).\n# The default value is: .html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a user-defined HTML header file for\n# each generated HTML page. If the tag is left blank doxygen will generate a\n# standard header.\n#\n# To get valid HTML the header file that includes any scripts and style sheets\n# that doxygen needs, which is dependent on the configuration options used (e.g.\n# the setting GENERATE_TREEVIEW). It is highly recommended to start with a\n# default header using\n# doxygen -w html new_header.html new_footer.html new_stylesheet.css\n# YourConfigFile\n# and then modify the file new_header.html. See also section \"Doxygen usage\"\n# for information on how to generate the default header that doxygen normally\n# uses.\n# Note: The header is subject to change so you typically have to regenerate the\n# default header when upgrading to a newer version of doxygen. For a description\n# of the possible markers and block names see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_HEADER            = \n\n# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each\n# generated HTML page. If the tag is left blank doxygen will generate a standard\n# footer. See HTML_HEADER for more information on how to generate a default\n# footer and what special commands can be used inside the footer. See also\n# section \"Doxygen usage\" for information on how to generate the default footer\n# that doxygen normally uses.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FOOTER            = \n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style\n# sheet that is used by each HTML page. It can be used to fine-tune the look of\n# the HTML output. If left blank doxygen will generate a default style sheet.\n# See also section \"Doxygen usage\" for information on how to generate the style\n# sheet that doxygen normally uses.\n# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as\n# it is more robust and this tag (HTML_STYLESHEET) will in the future become\n# obsolete.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_STYLESHEET        = \n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# cascading style sheets that are included after the standard style sheets\n# created by doxygen. Using this option one can overrule certain style aspects.\n# This is preferred over using HTML_STYLESHEET since it does not replace the\n# standard style sheet and is therefore more robust against future updates.\n# Doxygen will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list). For an example see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_STYLESHEET  = \n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that the\n# files will be copied as-is; there are no commands or markers available.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_FILES       = \n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen\n# will adjust the colors in the style sheet and background images according to\n# this color. Hue is specified as an angle on a colorwheel, see\n# http://en.wikipedia.org/wiki/Hue for more information. For instance the value\n# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300\n# purple, and 360 is red again.\n# Minimum value: 0, maximum value: 359, default value: 220.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors\n# in the HTML output. For a value of 0 the output will use grayscales only. A\n# value of 255 will produce the most vivid colors.\n# Minimum value: 0, maximum value: 255, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the\n# luminance component of the colors in the HTML output. Values below 100\n# gradually make the output lighter, whereas values above 100 make the output\n# darker. The value divided by 100 is the actual gamma applied, so 80 represents\n# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not\n# change the gamma.\n# Minimum value: 40, maximum value: 240, default value: 80.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting this\n# to YES can help to show when doxygen was last run and thus if the\n# documentation is up to date.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_TIMESTAMP         = NO\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries\n# shown in the various tree structured indices initially; the user can expand\n# and collapse entries dynamically later on. Doxygen will expand the tree to\n# such a level that at most the specified number of entries are visible (unless\n# a fully collapsed tree already exceeds this amount). So setting the number of\n# entries 1 will produce a full collapsed tree by default. 0 is a special value\n# representing an infinite number of entries and will result in a full expanded\n# tree by default.\n# Minimum value: 0, maximum value: 9999, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files will be\n# generated that can be used as input for Apple's Xcode 3 integrated development\n# environment (see: http://developer.apple.com/tools/xcode/), introduced with\n# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a\n# Makefile in the HTML output directory. Running make will produce the docset in\n# that directory and running make install will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at\n# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_DOCSET        = NO\n\n# This tag determines the name of the docset feed. A documentation feed provides\n# an umbrella under which multiple documentation sets from a single provider\n# (such as a company or product suite) can be grouped.\n# The default value is: Doxygen generated docs.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# This tag specifies a string that should uniquely identify the documentation\n# set bundle. This should be a reverse domain-name style string, e.g.\n# com.mycompany.MyDocSet. Doxygen will append .docset to the name.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n# The default value is: org.doxygen.Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.\n# The default value is: Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three\n# additional HTML index files: index.hhp, index.hhc, and index.hhk. The\n# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop\n# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on\n# Windows.\n#\n# The HTML Help Workshop contains a compiler that can convert all HTML output\n# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML\n# files are now used as the Windows 98 help format, and will replace the old\n# Windows help format (.hlp) on all Windows platforms in the future. Compressed\n# HTML files also contain an index, a table of contents, and you can search for\n# words in the documentation. The HTML workshop also contains a viewer for\n# compressed HTML files.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_HTMLHELP      = NO\n\n# The CHM_FILE tag can be used to specify the file name of the resulting .chm\n# file. You can add a path in front of the file if the result should not be\n# written to the html output directory.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_FILE               = \n\n# The HHC_LOCATION tag can be used to specify the location (absolute path\n# including file name) of the HTML help compiler (hhc.exe). If non-empty,\n# doxygen will try to run the HTML help compiler on the generated index.hhp.\n# The file has to be specified with full path.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nHHC_LOCATION           = \n\n# The GENERATE_CHI flag controls if a separate .chi index file is generated\n# (YES) or that it should be included in the master .chm file (NO).\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nGENERATE_CHI           = NO\n\n# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)\n# and project file content.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_INDEX_ENCODING     = \n\n# The BINARY_TOC flag controls whether a binary table of contents is generated\n# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it\n# enables the Previous and Next buttons.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members to\n# the table of contents of the HTML help documentation and to the tree view.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that\n# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help\n# (.qch) of the generated HTML documentation.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify\n# the file name of the resulting .qch file. The path specified is relative to\n# the HTML output folder.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQCH_FILE               = \n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help\n# Project output. For more information please see Qt Help Project / Namespace\n# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt\n# Help Project output. For more information please see Qt Help Project / Virtual\n# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-\n# folders).\n# The default value is: doc.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom\n# filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_NAME   = \n\n# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_ATTRS  = \n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's filter section matches. Qt Help Project / Filter Attributes (see:\n# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_SECT_FILTER_ATTRS  = \n\n# The QHG_LOCATION tag can be used to specify the location of Qt's\n# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the\n# generated .qhp file.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHG_LOCATION           = \n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be\n# generated, together with the HTML files, they form an Eclipse help plugin. To\n# install this plugin and make it available under the help contents menu in\n# Eclipse, the contents of the directory containing the HTML and XML files needs\n# to be copied into the plugins directory of eclipse. The name of the directory\n# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.\n# After copying Eclipse needs to be restarted before the help appears.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the Eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have this\n# name. Each documentation set should have its own identifier.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# If you want full control over the layout of the generated HTML pages it might\n# be necessary to disable the index and replace it with your own. The\n# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top\n# of each HTML page. A value of NO enables the index and the value YES disables\n# it. Since the tabs in the index contain the same information as the navigation\n# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information. If the tag\n# value is set to YES, a side panel will be generated containing a tree-like\n# index structure (just like the one that is generated for HTML Help). For this\n# to work a browser that supports JavaScript, DHTML, CSS and frames is required\n# (i.e. any modern browser). Windows users are probably better off using the\n# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can\n# further fine-tune the look of the index. As an example, the default style\n# sheet generated by doxygen has an example that shows how to put an image at\n# the root of the tree instead of the PROJECT_NAME. Since the tree basically has\n# the same information as the tab index, you could consider setting\n# DISABLE_INDEX to YES when enabling this option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_TREEVIEW      = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that\n# doxygen will group on one line in the generated HTML documentation.\n#\n# Note that a value of 0 will completely suppress the enum values from appearing\n# in the overview section.\n# Minimum value: 0, maximum value: 20, default value: 4.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used\n# to set the initial width (in pixels) of the frame in which the tree is shown.\n# Minimum value: 0, maximum value: 1500, default value: 250.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nTREEVIEW_WIDTH         = 250\n\n# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to\n# external symbols imported via tag files in a separate window.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of LaTeX formulas included as images in\n# the HTML documentation. When you change the font size after a successful\n# doxygen run you need to manually remove any form_*.png images from the HTML\n# output directory to force them to be regenerated.\n# Minimum value: 8, maximum value: 50, default value: 10.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are not\n# supported properly for IE 6.0, but are supported on all modern browsers.\n#\n# Note that when changing this option you need to delete any form_*.png files in\n# the HTML output directory before the changes have effect.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see\n# http://www.mathjax.org) which uses client side Javascript for the rendering\n# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX\n# installed or if you want to formulas look prettier in the HTML output. When\n# enabled you may also need to install MathJax separately and configure the path\n# to it using the MATHJAX_RELPATH option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# the MathJax output. See the MathJax site (see:\n# http://docs.mathjax.org/en/latest/output.html) for more details.\n# Possible values are: HTML-CSS (which is slower, but has the best\n# compatibility), NativeMML (i.e. MathML) and SVG.\n# The default value is: HTML-CSS.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_FORMAT         = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the HTML\n# output directory using the MATHJAX_RELPATH option. The destination directory\n# should contain the MathJax.js script. For instance, if the mathjax directory\n# is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax\n# Content Delivery Network so you can quickly see the result without installing\n# MathJax. However, it is strongly recommended to install a local copy of\n# MathJax from http://www.mathjax.org before deployment.\n# The default value is: http://cdn.mathjax.org/mathjax/latest.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_RELPATH        = http://www.mathjax.org/mathjax\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax\n# extension names that should be enabled during MathJax rendering. For example\n# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_EXTENSIONS     = \n\n# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces\n# of code that will be used on startup of the MathJax code. See the MathJax site\n# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an\n# example see the documentation.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_CODEFILE       = \n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box for\n# the HTML output. The underlying search engine uses javascript and DHTML and\n# should work on any modern browser. Note that when using HTML help\n# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)\n# there is already a search function so this one should typically be disabled.\n# For large projects the javascript based search engine can be slow, then\n# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to\n# search using the keyboard; to jump to the search box use <access key> + S\n# (what the <access key> is depends on the OS and browser, but it is typically\n# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down\n# key> to jump into the search results window, the results can be navigated\n# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel\n# the search. The filter options can be selected when the cursor is inside the\n# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>\n# to select a filter and <Enter> or <escape> to activate or cancel the filter\n# option.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a web server instead of a web client using Javascript. There\n# are two flavors of web server based searching depending on the EXTERNAL_SEARCH\n# setting. When disabled, doxygen will generate a PHP script for searching and\n# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing\n# and searching needs to be provided by external tools. See the section\n# \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSERVER_BASED_SEARCH    = NO\n\n# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP\n# script for searching. Instead the search results are written to an XML file\n# which needs to be processed by an external indexer. Doxygen will invoke an\n# external search engine pointed to by the SEARCHENGINE_URL option to obtain the\n# search results.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: http://xapian.org/).\n#\n# See the section \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH        = NO\n\n# The SEARCHENGINE_URL should point to a search engine hosted by a web server\n# which will return the search results when EXTERNAL_SEARCH is enabled.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: http://xapian.org/). See the section \"External Indexing and\n# Searching\" for details.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHENGINE_URL       = \n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n# search data is written to a file for indexing by an external tool. With the\n# SEARCHDATA_FILE tag the name of this file can be specified.\n# The default file is: searchdata.xml.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHDATA_FILE        = searchdata.xml\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the\n# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n# projects and redirect the results back to the right project.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH_ID     = \n\n# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n# projects other than the one defined by this configuration file, but that are\n# all added to the same external search index. Each project needs to have a\n# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of\n# to a relative location where the documentation can be found. The format is:\n# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTRA_SEARCH_MAPPINGS  = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.\n# The default value is: YES.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked.\n#\n# Note that when enabling USE_PDFLATEX this option is only used for generating\n# bitmaps for formulas in the HTML output, but not in the Makefile that is\n# written to the output directory.\n# The default file is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate\n# index for LaTeX.\n# The default file is: makeindex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used by the\n# printer.\n# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x\n# 14 inches) and executive (7.25 x 10.5 inches).\n# The default value is: a4.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names\n# that should be included in the LaTeX output. The package can be specified just\n# by its name or with the correct syntax as to be used with the LaTeX\n# \\usepackage command. To get the times font for instance you can specify :\n# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}\n# To use the option intlimits with the amsmath package you can specify:\n# EXTRA_PACKAGES=[intlimits]{amsmath}\n# If left blank no extra packages will be included.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nEXTRA_PACKAGES         = \n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the\n# generated LaTeX document. The header should contain everything until the first\n# chapter. If it is left blank doxygen will generate a standard header. See\n# section \"Doxygen usage\" for information on how to let doxygen write the\n# default header to a separate file.\n#\n# Note: Only use a user-defined header if you know what you are doing! The\n# following commands have a special meaning inside the header: $title,\n# $datetime, $date, $doxygenversion, $projectname, $projectnumber,\n# $projectbrief, $projectlogo. Doxygen will replace $title with the empty\n# string, for the replacement values of the other commands the user is referred\n# to HTML_HEADER.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HEADER           = \n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the\n# generated LaTeX document. The footer should contain everything after the last\n# chapter. If it is left blank doxygen will generate a standard footer. See\n# LATEX_HEADER for more information on how to generate a default footer and what\n# special commands can be used inside the footer.\n#\n# Note: Only use a user-defined footer if you know what you are doing!\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_FOOTER           = \n\n# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# LaTeX style sheets that are included after the standard style sheets created\n# by doxygen. Using this option one can overrule certain style aspects. Doxygen\n# will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list).\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_STYLESHEET = \n\n# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the LATEX_OUTPUT output\n# directory. Note that the files will be copied as-is; there are no commands or\n# markers available.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_FILES      = \n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is\n# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will\n# contain links (just like the HTML output) instead of page references. This\n# makes the output suitable for online browsing using a PDF viewer.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPDF_HYPERLINKS         = NO\n\n# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate\n# the PDF file directly from the LaTeX files. Set this option to YES, to get a\n# higher quality PDF documentation.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode\n# command to the generated LaTeX files. This will instruct LaTeX to keep running\n# if errors occur, instead of asking the user for help. This option is also used\n# when generating formulas in HTML.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BATCHMODE        = NO\n\n# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the\n# index chapters (such as File Index, Compound Index, etc.) in the output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HIDE_INDICES     = NO\n\n# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source\n# code with syntax highlighting in the LaTeX output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. See\n# http://en.wikipedia.org/wiki/BibTeX and \\cite for more info.\n# The default value is: plain.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# Configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The\n# RTF output is optimized for Word 97 and may not look too pretty with other RTF\n# readers/editors.\n# The default value is: NO.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: rtf.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_OUTPUT             = glm.rtf\n\n# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will\n# contain hyperlink fields. The RTF file will contain links (just like the HTML\n# output) instead of page references. This makes the output suitable for online\n# browsing using Word or some other Word compatible readers that support those\n# fields.\n#\n# Note: WordPad (write) and others do not support links.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_HYPERLINKS         = YES\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's config\n# file, i.e. a series of assignments. You only have to provide replacements,\n# missing definitions are set to their default value.\n#\n# See also section \"Doxygen usage\" for information on how to generate the\n# default style sheet that doxygen normally uses.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_STYLESHEET_FILE    = \n\n# Set optional variables used in the generation of an RTF document. Syntax is\n# similar to doxygen's config file. A template extensions file can be generated\n# using doxygen -e rtf extensionFile.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_EXTENSIONS_FILE    = \n\n# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code\n# with syntax highlighting in the RTF output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_SOURCE_CODE        = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for\n# classes and files.\n# The default value is: NO.\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it. A directory man3 will be created inside the directory specified by\n# MAN_OUTPUT.\n# The default directory is: man.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to the generated\n# man pages. In case the manual section does not start with a number, the number\n# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is\n# optional.\n# The default value is: .3.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_EXTENSION          = .3\n\n# The MAN_SUBDIR tag determines the name of the directory created within\n# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by\n# MAN_EXTENSION with the initial . removed.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_SUBDIR             = \n\n# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it\n# will generate one additional man file for each entity documented in the real\n# man page(s). These additional files only source the real man page, but without\n# them the man command would be unable to find the correct page.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that\n# captures the structure of the code including all documentation.\n# The default value is: NO.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: xml.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_OUTPUT             = xml\n\n# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program\n# listings (including syntax highlighting and cross-referencing information) to\n# the XML output. Note that enabling this will significantly increase the size\n# of the XML output.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to the DOCBOOK output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files\n# that can be used to generate PDF.\n# The default value is: NO.\n\nGENERATE_DOCBOOK       = NO\n\n# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n# front of it.\n# The default directory is: docbook.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_OUTPUT         = docbook\n\n# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the\n# program listings (including syntax highlighting and cross-referencing\n# information) to the DOCBOOK output. Note that enabling this will significantly\n# increase the size of the DOCBOOK output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_PROGRAMLISTING = NO\n\n#---------------------------------------------------------------------------\n# Configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an\n# AutoGen Definitions (see http://autogen.sf.net) file that captures the\n# structure of the code including all documentation. Note that this feature is\n# still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module\n# file that captures the structure of the code including all documentation.\n#\n# Note that this feature is still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary\n# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI\n# output from the Perl module output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely\n# formatted so it can be parsed by a human reader. This is useful if you want to\n# understand what is going on. On the other hand, if this tag is set to NO, the\n# size of the Perl module output will be much smaller and Perl will parse it\n# just the same.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file are\n# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful\n# so different doxyrules.make files included by the same Makefile don't\n# overwrite each other's variables.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_MAKEVAR_PREFIX = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all\n# C-preprocessor directives found in the sources and include files.\n# The default value is: YES.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names\n# in the source code. If set to NO, only conditional compilation will be\n# performed. Macro expansion can be done in a controlled way by setting\n# EXPAND_ONLY_PREDEF to YES.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then\n# the macro expansion is limited to the macros specified with the PREDEFINED and\n# EXPAND_AS_DEFINED tags.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES, the include files in the\n# INCLUDE_PATH will be searched if a #include is found.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by the\n# preprocessor.\n# This tag requires that the tag SEARCH_INCLUDES is set to YES.\n\nINCLUDE_PATH           = \n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will be\n# used.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nINCLUDE_FILE_PATTERNS  = \n\n# The PREDEFINED tag can be used to specify one or more macro names that are\n# defined before the preprocessor is started (similar to the -D option of e.g.\n# gcc). The argument of the tag is a list of macros of the form: name or\n# name=definition (no spaces). If the definition and the \"=\" are omitted, \"=1\"\n# is assumed. To prevent a macro definition from being undefined via #undef or\n# recursively expanded use the := operator instead of the = operator.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nPREDEFINED             = \n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this\n# tag can be used to specify a list of macro names that should be expanded. The\n# macro definition that is found in the sources will be used. Use the PREDEFINED\n# tag if you want to use a different macro definition that overrules the\n# definition found in the source code.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_AS_DEFINED      = \n\n# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will\n# remove all references to function-like macros that are alone on a line, have\n# an all uppercase name, and do not end with a semicolon. Such function macros\n# are typically used for boiler-plate code, and will confuse the parser if not\n# removed.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES tag can be used to specify one or more tag files. For each tag\n# file the location of the external documentation should be added. The format of\n# a tag file without this location is as follows:\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where loc1 and loc2 can be relative or absolute paths or URLs. See the\n# section \"Linking to external documentation\" for more information about the use\n# of tag files.\n# Note: Each tag file must have a unique name (where the name does NOT include\n# the path). If a tag file is not located in the directory in which doxygen is\n# run, you must also specify the path to the tagfile here.\n\nTAGFILES               = \n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create a\n# tag file that is based on the input files it reads. See section \"Linking to\n# external documentation\" for more information about the usage of tag files.\n\nGENERATE_TAGFILE       = \n\n# If the ALLEXTERNALS tag is set to YES, all external class will be listed in\n# the class index. If set to NO, only the inherited external classes will be\n# listed.\n# The default value is: NO.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will be\n# listed.\n# The default value is: YES.\n\nEXTERNAL_GROUPS        = YES\n\n# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in\n# the related pages index. If set to NO, only the current project's pages will\n# be listed.\n# The default value is: YES.\n\nEXTERNAL_PAGES         = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of 'which perl').\n# The default file (with absolute path) is: /usr/bin/perl.\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram\n# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to\n# NO turns the diagrams off. Note that this option also works with HAVE_DOT\n# disabled, but it is recommended to install and use dot, since it yields more\n# powerful graphs.\n# The default value is: YES.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see:\n# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            = \n\n# You can include diagrams made with dia in doxygen documentation. Doxygen will\n# then run dia to produce the diagram and insert it in the documentation. The\n# DIA_PATH tag allows you to specify the directory where the dia binary resides.\n# If left empty dia is assumed to be found in the default search path.\n\nDIA_PATH               = \n\n# If set to YES the inheritance and collaboration graphs will hide inheritance\n# and usage relations if the target is undocumented or is not a class.\n# The default value is: YES.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz (see:\n# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent\n# Bell Labs. The other options in this section have no effect if this option is\n# set to NO\n# The default value is: NO.\n\nHAVE_DOT               = NO\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed\n# to run in parallel. When set to 0 doxygen will base this on the number of\n# processors available in the system. You can set it explicitly to a value\n# larger than 0 to get control over the balance between CPU load and processing\n# speed.\n# Minimum value: 0, maximum value: 32, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_NUM_THREADS        = 0\n\n# When you want a differently looking font in the dot files that doxygen\n# generates you can specify the font name using DOT_FONTNAME. You need to make\n# sure dot is able to find the font, which can be done by putting it in a\n# standard location or by setting the DOTFONTPATH environment variable or by\n# setting DOT_FONTPATH to the directory containing the font.\n# The default value is: Helvetica.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of\n# dot graphs.\n# Minimum value: 4, maximum value: 24, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the default font as specified with\n# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set\n# the path where dot can find it using this tag.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTPATH           = \n\n# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for\n# each documented class showing the direct and indirect inheritance relations.\n# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a\n# graph for each documented class showing the direct and indirect implementation\n# dependencies (inheritance, containment, and class references variables) of the\n# class with other documented classes.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for\n# groups, showing the direct groups dependencies.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside the\n# class node. If there are many fields or methods and many nodes the graph may\n# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the\n# number of items for each type to make the size more manageable. Set this to 0\n# for no limit. Note that the threshold may be exceeded by 50% before the limit\n# is enforced. So when you set the threshold to 10, up to 15 fields may appear,\n# but if the number exceeds 15, the total amount of fields shown is limited to\n# 10.\n# Minimum value: 0, maximum value: 100, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and\n# collaboration graphs will show the relations between templates and their\n# instances.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to\n# YES then doxygen will generate a graph for each documented file showing the\n# direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDE_GRAPH          = YES\n\n# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are\n# set to YES then doxygen will generate a graph for each documented file showing\n# the direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH tag is set to YES then doxygen will generate a call\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable call graphs for selected\n# functions only using the \\callgraph command. Disabling a call graph can be\n# accomplished by means of the command \\hidecallgraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALL_GRAPH             = YES\n\n# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable caller graphs for selected\n# functions only using the \\callergraph command. Disabling a caller graph can be\n# accomplished by means of the command \\hidecallergraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALLER_GRAPH           = YES\n\n# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical\n# hierarchy of all classes instead of a textual one.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the\n# dependencies a directory has on other directories in a graphical way. The\n# dependency relations are determined by the #include relations between the\n# files in the directories.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. For an explanation of the image formats see the section\n# output formats in the documentation of the dot tool (Graphviz (see:\n# http://www.graphviz.org/)).\n# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order\n# to make the SVG files visible in IE 9+ (other browsers do not have this\n# requirement).\n# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,\n# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and\n# png:gdiplus:gdiplus.\n# The default value is: png.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n#\n# Note that this requires a modern browser other than Internet Explorer. Tested\n# and working are Firefox, Chrome, Safari, and Opera.\n# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make\n# the SVG files visible. Older versions of IE do not have SVG support.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINTERACTIVE_SVG        = NO\n\n# The DOT_PATH tag can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_PATH               = \n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the \\dotfile\n# command).\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOTFILE_DIRS           = \n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the \\mscfile\n# command).\n\nMSCFILE_DIRS           = \n\n# The DIAFILE_DIRS tag can be used to specify one or more directories that\n# contain dia files that are included in the documentation (see the \\diafile\n# command).\n\nDIAFILE_DIRS           = \n\n# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the\n# path where java can find the plantuml.jar file. If left blank, it is assumed\n# PlantUML is not used or called during a preprocessing step. Doxygen will\n# generate a warning when it encounters a \\startuml command in this case and\n# will not generate output for the diagram.\n\nPLANTUML_JAR_PATH      = \n\n# When using plantuml, the specified paths are searched for files specified by\n# the !include statement in a plantuml block.\n\nPLANTUML_INCLUDE_PATH  = \n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes\n# that will be shown in the graph. If the number of nodes in a graph becomes\n# larger than this value, doxygen will truncate the graph, which is visualized\n# by representing a node as a red box. Note that doxygen if the number of direct\n# children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that\n# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n# Minimum value: 0, maximum value: 10000, default value: 50.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs\n# generated by dot. A depth value of 3 means that only nodes reachable from the\n# root by following a path via at most 3 edges will be shown. Nodes that lay\n# further from the root node will be omitted. Note that setting this option to 1\n# or 2 may greatly reduce the computation time needed for large code bases. Also\n# note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n# Minimum value: 0, maximum value: 1000, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nMAX_DOT_GRAPH_DEPTH    = 1000\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not seem\n# to support this out of the box.\n#\n# Warning: Depending on the platform used, enabling this option may lead to\n# badly anti-aliased labels on the edges of a graph (i.e. they become hard to\n# read).\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10) support\n# this, this feature is disabled by default.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page\n# explaining the meaning of the various boxes and arrows in the dot generated\n# graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot\n# files that are used to generate the various graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "external/glm/doc/theme/doxygen.css",
    "content": "/* The standard CSS for doxygen 1.8.10 */\n\nbody, table, div, p, dl {\n\tfont: 400 14px/22px Roboto,sans-serif;\n}\n\nbody\n{\n\tmargin:0px;\n\tpadding:0px;\n\tbackground-color:#bf6000;\n\tbackground-repeat:no-repeat;\n\tbackground-position:center center;\n\tbackground-attachment:fixed;\n\tmin-height:1200px;\n\toverflow:auto;\n}\n\n/* @group Heading Levels */\n\nh1.groupheader {\n\tcolor:#bf6000;\n\tfont-size: 150%;\n}\n\n.title {\n\tcolor:#bf6000;\n\tfont: 400 14px/28px Roboto,sans-serif;\n\tfont-size: 150%;\n\tfont-weight: bold;\n\tmargin: 10px 2px;\n}\n\nh2.groupheader {\n\tborder-bottom: 1px solid #bf6000;\n\tcolor:#bf6000;\n\tfont-size: 150%;\n\tfont-weight: normal;\n\tmargin-top: 1.75em;\n\tpadding-top: 8px;\n\tpadding-bottom: 4px;\n\twidth: 100%;\n}\n\nh3.groupheader {\n\tfont-size: 100%;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\t-webkit-transition: text-shadow 0.5s linear;\n\t-moz-transition: text-shadow 0.5s linear;\n\t-ms-transition: text-shadow 0.5s linear;\n\t-o-transition: text-shadow 0.5s linear;\n\ttransition: text-shadow 0.5s linear;\n\tmargin-right: 15px;\n}\n\nh1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {\n\ttext-shadow: 0 0 15px cyan;\n}\n\ndt {\n\tfont-weight: bold;\n}\n\ndiv.multicol {\n\t-moz-column-gap: 1em;\n\t-webkit-column-gap: 1em;\n\t-moz-column-count: 3;\n\t-webkit-column-count: 3;\n}\n\np.startli, p.startdd {\n\tmargin-top: 2px;\n}\n\np.starttd {\n\tmargin-top: 0px;\n}\n\np.endli {\n\tmargin-bottom: 0px;\n}\n\np.enddd {\n\tmargin-bottom: 4px;\n}\n\np.endtd {\n\tmargin-bottom: 2px;\n}\n\n/* @end */\n\ncaption {\n\tfont-weight: bold;\n}\n\nspan.legend {\n        font-size: 70%;\n        text-align: center;\n}\n\nh3.version {\n        font-size: 90%;\n        text-align: center;\n}\n\ndiv.qindex, div.navtab{\n\tbackground-color: #FFF8F0;\n\tborder: 1px solid #FF8000;\n\ttext-align: center;\n}\n\ndiv.qindex, div.navpath {\n\twidth: 100%;\n\tline-height: 140%;\n}\n\ndiv.navtab {\n\tmargin-right: 15px;\n}\n\n/* @group Link Styling */\n\na {\n\tcolor: #000000;\n\tfont-weight: normal;\n\ttext-decoration: none;\n}\n\n.contents a:visited {\n\tcolor: #606060;\n}\n\n.contents{\n\tbackground-color: #FFFFFF;\n\tpadding-top:8px;\n\tpadding-bottom:8px;\n\tpadding-left:32px; \n\tpadding-right:32px;\n\tmargin:0px;\n\tmargin-left:auto; \n\tmargin-right:auto;\n\twidth:1216px;\n\tborder-bottom-left-radius: 8px;\n\tborder-bottom-right-radius: 8px;\n}\n\na:hover {\n\ttext-decoration: underline;\n}\n\na.qindex {\n\tfont-weight: bold;\n}\n\na.qindexHL {\n\tfont-weight: bold;\n\tbackground-color: #9CAFD4;\n\tcolor: #ffffff;\n\tborder: 1px double #869DCA;\n}\n\n.contents a.qindexHL:visited {\n        color: #ffffff;\n}\n\na.el {\n\tfont-weight: bold;\n}\n\na.elRef {\n}\n\na.code, a.code:visited, a.line, a.line:visited {\n\tcolor: #4665A2; \n}\n\na.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {\n\tcolor: #4665A2; \n}\n\n/* @end */\n\ndl.el {\n\tmargin-left: -1cm;\n}\n\npre.fragment {\n        border: 1px solid #FF8000;\n        background-color: #FFF8F0;\n        padding: 4px 6px;\n        margin: 4px 8px 4px 2px;\n        overflow: auto;\n        word-wrap: break-word;\n        font-size:  9pt;\n        line-height: 125%;\n        font-family: monospace, fixed;\n        font-size: 105%;\n}\n\ndiv.fragment {\n\tpadding: 4px 6px;\n\tmargin: 4px 8px 4px 2px;\n\tbackground-color: #FFF8F0;\n\tborder: 1px solid #FF8000;\n}\n\ndiv.line {\n\tfont-family: monospace, fixed;\n\tfont-size: 13px;\n\tmin-height: 13px;\n\tline-height: 1.0;\n\ttext-wrap: unrestricted;\n\twhite-space: -moz-pre-wrap; /* Moz */\n\twhite-space: -pre-wrap;     /* Opera 4-6 */\n\twhite-space: -o-pre-wrap;   /* Opera 7 */\n\twhite-space: pre-wrap;      /* CSS3  */\n\tword-wrap: break-word;      /* IE 5.5+ */\n\ttext-indent: -53px;\n\tpadding-left: 53px;\n\tpadding-bottom: 0px;\n\tmargin: 0px;\n\t-webkit-transition-property: background-color, box-shadow;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-property: background-color, box-shadow;\n\t-moz-transition-duration: 0.5s;\n\t-ms-transition-property: background-color, box-shadow;\n\t-ms-transition-duration: 0.5s;\n\t-o-transition-property: background-color, box-shadow;\n\t-o-transition-duration: 0.5s;\n\ttransition-property: background-color, box-shadow;\n\ttransition-duration: 0.5s;\n}\n\ndiv.line.glow {\n\tbackground-color: cyan;\n\tbox-shadow: 0 0 10px cyan;\n}\n\n\nspan.lineno {\n\tpadding-right: 4px;\n\ttext-align: right;\n\tborder-right: 2px solid #0F0;\n\tbackground-color: #E8E8E8;\n\twhite-space: pre;\n}\nspan.lineno a {\n\tbackground-color: #D8D8D8;\n}\n\nspan.lineno a:hover {\n\tbackground-color: #C8C8C8;\n}\n\ndiv.ah, span.ah {\n\tbackground-color: black;\n\tfont-weight: bold;\n\tcolor: #ffffff;\n\tmargin-bottom: 3px;\n\tmargin-top: 3px;\n\tpadding: 0.2em;\n\tborder: solid thin #333;\n\tborder-radius: 0.5em;\n\t-webkit-border-radius: .5em;\n\t-moz-border-radius: .5em;\n\tbox-shadow: 2px 2px 3px #999;\n\t-webkit-box-shadow: 2px 2px 3px #999;\n\t-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n\tbackground-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));\n\tbackground-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);\n}\n\ndiv.classindex ul {\n        list-style: none;\n        padding-left: 0;\n}\n\ndiv.classindex span.ai {\n        display: inline-block;\n}\n\ndiv.groupHeader {\n\tmargin-left: 16px;\n\tmargin-top: 12px;\n\tfont-weight: bold;\n}\n\ndiv.groupText {\n\tmargin-left: 16px;\n\tfont-style: italic;\n}\n\nbody {\n\tcolor: black;\n\tmargin: 0;\n}\n\ntd.indexkey {\n\tbackground-color: #FFF8F0;\n\tfont-weight: bold;\n\tborder: 1px solid #C4CFE5;\n\tmargin: 2px 0px 2px 0;\n\tpadding: 2px 10px;\n\twhite-space: nowrap;\n\tvertical-align: top;\n}\n\ntd.indexvalue {\n\tbackground-color: #FFF8F0;\n\tborder: 1px solid #C4CFE5;\n\tpadding: 2px 10px;\n\tmargin: 2px 0px;\n}\n\ntr.memlist {\n\tbackground-color: #FFF8F0;\n}\n\np.formulaDsp {\n\ttext-align: center;\n}\n\nimg.formulaDsp {\n\t\n}\n\nimg.formulaInl {\n\tvertical-align: middle;\n}\n\ndiv.center {\n\ttext-align: center;\n\tmargin-top: 0px;\n\tmargin-bottom: 0px;\n\tpadding: 0px;\n}\n\ndiv.center img {\n\tborder: 0px;\n}\n\naddress.footer {\n\tdisplay: none;\n}\n\nimg.footer {\n\tborder: 0px;\n\tvertical-align: middle;\n}\n\n/* @group Code Colorization */\n\nspan.keyword {\n\tcolor: #008000\n}\n\nspan.keywordtype {\n\tcolor: #604020\n}\n\nspan.keywordflow {\n\tcolor: #e08000\n}\n\nspan.comment {\n\tcolor: #800000\n}\n\nspan.preprocessor {\n\tcolor: #806020\n}\n\nspan.stringliteral {\n\tcolor: #002080\n}\n\nspan.charliteral {\n\tcolor: #008080\n}\n\nspan.vhdldigit { \n\tcolor: #ff00ff \n}\n\nspan.vhdlchar { \n\tcolor: #000000 \n}\n\nspan.vhdlkeyword { \n\tcolor: #700070 \n}\n\nspan.vhdllogic { \n\tcolor: #ff0000 \n}\n\nblockquote {\n        background-color: #F7F8FB;\n        border-left: 2px solid #9CAFD4;\n        margin: 0 24px 0 4px;\n        padding: 0 12px 0 16px;\n}\n\n/* @end */\n\n/*\n.search {\n\tcolor: #003399;\n\tfont-weight: bold;\n}\n\nform.search {\n\tmargin-bottom: 0px;\n\tmargin-top: 0px;\n}\n\ninput.search {\n\tfont-size: 75%;\n\tcolor: #000080;\n\tfont-weight: normal;\n\tbackground-color: #e8eef2;\n}\n*/\n\ntd.tiny {\n\tfont-size: 75%;\n}\n\n.dirtab {\n\tpadding: 4px;\n\tborder-collapse: collapse;\n\tborder: 1px solid #FF8000;\n}\n\nth.dirtab {\n\tbackground: #EBEFF6;\n\tfont-weight: bold;\n}\n\nhr {\n\theight: 0px;\n\tborder: none;\n\tborder-top: 1px solid #4A6AAA;\n}\n\nhr.footer {\n\tdisplay: none;\n}\n\n/* @group Member Descriptions */\n\ntable.memberdecls {\n\tborder-spacing: 0px;\n\tpadding: 0px;\n}\n\n.memberdecls td, .fieldtable tr {\n\t-webkit-transition-property: background-color, box-shadow;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-property: background-color, box-shadow;\n\t-moz-transition-duration: 0.5s;\n\t-ms-transition-property: background-color, box-shadow;\n\t-ms-transition-duration: 0.5s;\n\t-o-transition-property: background-color, box-shadow;\n\t-o-transition-duration: 0.5s;\n\ttransition-property: background-color, box-shadow;\n\ttransition-duration: 0.5s;\n}\n\n.memberdecls td.glow, .fieldtable tr.glow {\n\tbackground-color: cyan;\n\tbox-shadow: 0 0 15px cyan;\n}\n\n.mdescLeft, .mdescRight,\n.memItemLeft, .memItemRight,\n.memTemplItemLeft, .memTemplItemRight, .memTemplParams {\n\tbackground-color: #FFFCF8;\n\tborder: none;\n\tmargin: 4px;\n\tpadding: 1px 0 0 8px;\n}\n\n.mdescLeft, .mdescRight {\n\tpadding: 0px 8px 4px 8px;\n\tcolor: #555;\n}\n\n.memSeparator {\n        border-bottom: 1px solid #FFF8F0;\n        line-height: 1px;\n        margin: 0px;\n        padding: 0px;\n}\n\n.memItemLeft, .memTemplItemLeft {\n        white-space: nowrap;\n}\n\n.memItemRight {\n\twidth: 100%;\n}\n\n.memTemplParams {\n\tcolor: #bf6000;\n        white-space: nowrap;\n\tfont-size: 80%;\n}\n\n/* @end */\n\n/* @group Member Details */\n\n/* Styles for detailed member documentation */\n\n.memtemplate {\n\tfont-size: 80%;\n\tcolor: #4665A2;\n\tfont-weight: normal;\n\tmargin-left: 9px;\n}\n\n.memnav {\n\tbackground-color: #FFF8F0;\n\tborder: 1px solid #FF8000;\n\ttext-align: center;\n\tmargin: 2px;\n\tmargin-right: 15px;\n\tpadding: 2px;\n}\n\n.mempage {\n\twidth: 100%;\n}\n\n.memitem {\n\tpadding: 0;\n\tmargin-bottom: 10px;\n\tmargin-right: 5px;\n        -webkit-transition: box-shadow 0.5s linear;\n        -moz-transition: box-shadow 0.5s linear;\n        -ms-transition: box-shadow 0.5s linear;\n        -o-transition: box-shadow 0.5s linear;\n        transition: box-shadow 0.5s linear;\n        display: table !important;\n        width: 100%;\n}\n\n.memitem.glow {\n         box-shadow: 0 0 15px cyan;\n}\n\n.memname {\n        font-weight: bold;\n        margin-left: 6px;\n}\n\n.memname td {\n\tvertical-align: bottom;\n}\n\n.memproto, dl.reflist dt {\n        border-top: 1px solid #bf6000;\n        border-left: 1px solid #bf6000;\n        border-right: 1px solid #bf6000;\n        padding: 6px 0px 6px 0px;\n        /*color: #253555;*/\n        font-weight: bold;\n        /*text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);*/\n        /*background-image:url('nav_f.png');*/\n        background-repeat:repeat-x;\n        background-color: #FFF8F0;\n        /* opera specific markup */\n        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n        border-top-right-radius: 4px;\n        border-top-left-radius: 4px;\n        /* firefox specific markup */\n        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n        -moz-border-radius-topright: 4px;\n        -moz-border-radius-topleft: 4px;\n        /* webkit specific markup */\n        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n        -webkit-border-top-right-radius: 4px;\n        -webkit-border-top-left-radius: 4px;\n\n}\n\n.memdoc, dl.reflist dd {\n        border-bottom: 1px solid #bf6000;      \n        border-left: 1px solid #bf6000;      \n        border-right: 1px solid #bf6000; \n        padding: 6px 10px 2px 10px;\n        border-top-width: 0;\n        background-image:url('nav_g.png');\n        background-repeat:repeat-x;\n        background-color: #FFFDFB;\n        /* opera specific markup */\n        border-bottom-left-radius: 4px;\n        border-bottom-right-radius: 4px;\n        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n        /* firefox specific markup */\n        -moz-border-radius-bottomleft: 4px;\n        -moz-border-radius-bottomright: 4px;\n        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n        /* webkit specific markup */\n        -webkit-border-bottom-left-radius: 4px;\n        -webkit-border-bottom-right-radius: 4px;\n        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n}\n\ndl.reflist dt {\n        padding: 5px;\n}\n\ndl.reflist dd {\n        margin: 0px 0px 10px 0px;\n        padding: 5px;\n}\n\n.paramkey {\n\ttext-align: right;\n}\n\n.paramtype {\n\twhite-space: nowrap;\n}\n\n.paramname {\n\tcolor: #602020;\n\twhite-space: nowrap;\n}\n.paramname em {\n\tfont-style: normal;\n}\n.paramname code {\n        line-height: 14px;\n}\n\n.params, .retval, .exception, .tparams {\n        margin-left: 0px;\n        padding-left: 0px;\n}       \n\n.params .paramname, .retval .paramname {\n        font-weight: bold;\n        vertical-align: top;\n}\n        \n.params .paramtype {\n        font-style: italic;\n        vertical-align: top;\n}       \n        \n.params .paramdir {\n        font-family: \"courier new\",courier,monospace;\n        vertical-align: top;\n}\n\ntable.mlabels {\n\tborder-spacing: 0px;\n}\n\ntd.mlabels-left {\n\twidth: 100%;\n\tpadding: 0px;\n}\n\ntd.mlabels-right {\n\tvertical-align: bottom;\n\tpadding: 0px;\n\twhite-space: nowrap;\n}\n\nspan.mlabels {\n        margin-left: 8px;\n}\n\nspan.mlabel {\n\tbackground-color: #728DC1;\n\tborder-top:1px solid #5373B4;\n\tborder-left:1px solid #5373B4;\n\tborder-right:1px solid #C4CFE5;\n\tborder-bottom:1px solid #C4CFE5;\n\ttext-shadow: none;\n\tcolor: white;\n\tmargin-right: 4px;\n\tpadding: 2px 3px;\n\tborder-radius: 3px;\n\tfont-size: 7pt;\n\twhite-space: nowrap;\n\tvertical-align: middle;\n}\n\n\n\n/* @end */\n\n/* these are for tree view inside a (index) page */\n\ndiv.directory {\n        margin: 10px 0px;\n        border-top: 1px solid #bf6000;\n        border-bottom: 1px solid #bf6000;\n        width: 100%;\n}\n\n.directory table {\n        border-collapse:collapse;\n}\n\n.directory td {\n\tmargin: 0px;\n\tpadding: 0px;\n\tvertical-align: top;\n}\n\n.directory td.entry {\n\twhite-space: nowrap;\n\tpadding-right: 6px;\n\tpadding-top: 3px;\n}\n\n.directory td.entry a {\n        outline:none;\n}\n\n.directory td.entry a img {\n        border: none;\n}\n\n.directory td.desc {\n\twidth: 100%;\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n\tpadding-top: 3px;\n\tborder-left: 1px solid rgba(0,0,0,0.05);\n}\n\n.directory tr.even {\n\tpadding-left: 6px;\n\tbackground-color: #FFFDFB;\n}\n\n.directory img {\n\tvertical-align: -30%;\n}\n\n.directory .levels {\n        white-space: nowrap;\n        width: 100%;\n        text-align: right;\n        font-size: 9pt;\n}\n\n.directory .levels span {\n\tcursor: pointer;\n\tpadding-left: 2px;\n\tpadding-right: 2px;\n\tcolor: #bf6000;\n}\n\n.arrow {\n    color: #bf6000;\n    -webkit-user-select: none;\n    -khtml-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    cursor: pointer;\n    font-size: 80%;\n    display: inline-block;\n    width: 16px;\n    height: 22px;\n}\n\n.icon {\n    font-family: Arial, Helvetica;\n    font-weight: bold;\n    font-size: 12px;\n    height: 14px;\n    width: 16px;\n    display: inline-block;\n    background-color: #bf6000;\n    color: white;\n    text-align: center;\n    border-radius: 4px;\n    margin-left: 2px;\n    margin-right: 2px;\n}\n\n.icona {\n    width: 24px;\n    height: 22px;\n    display: inline-block;\n}\n\n.iconfopen {\n    width: 24px;\n    height: 18px;\n    margin-bottom: 4px;\n    background-image:url('folderopen.png');\n    background-position: 0px -4px;\n    background-repeat: repeat-y;\n    vertical-align:top;\n    display: inline-block;\n}\n\n.iconfclosed {\n    width: 24px;\n    height: 18px;\n    margin-bottom: 4px;\n    background-image:url('folderclosed.png');\n    background-position: 0px -4px;\n    background-repeat: repeat-y;\n    vertical-align:top;\n    display: inline-block;\n}\n\n.icondoc {\n    width: 24px;\n    height: 18px;\n    margin-bottom: 4px;\n    background-image:url('doc.png');\n    background-position: 0px -4px;\n    background-repeat: repeat-y;\n    vertical-align:top;\n    display: inline-block;\n}\n\ntable.directory {\n    font: 400 14px Roboto,sans-serif;\n}\n\n/* @end */\n\ndiv.dynheader {\n\tmargin-top: 8px;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\naddress {\n\tfont-style: normal;\n\tcolor: #2A3D61;\n}\n\ntable.doxtable {\n\tborder-collapse:collapse;\n\tmargin-top: 4px;\n\tmargin-bottom: 4px;\n}\n\ntable.doxtable td, table.doxtable th {\n\tborder: 1px solid #2D4068;\n\tpadding: 3px 7px 2px;\n}\n\ntable.doxtable th {\n\tbackground-color: #374F7F;\n\tcolor: #FFFFFF;\n\tfont-size: 110%;\n\tpadding-bottom: 4px;\n\tpadding-top: 5px;\n}\n\ntable.fieldtable {\n        /*width: 100%;*/\n        margin-bottom: 10px;\n        border: 1px solid #A8B8D9;\n        border-spacing: 0px;\n        -moz-border-radius: 4px;\n        -webkit-border-radius: 4px;\n        border-radius: 4px;\n        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);\n        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);\n}\n\n.fieldtable td, .fieldtable th {\n        padding: 3px 7px 2px;\n}\n\n.fieldtable td.fieldtype, .fieldtable td.fieldname {\n        white-space: nowrap;\n        border-right: 1px solid #A8B8D9;\n        border-bottom: 1px solid #A8B8D9;\n        vertical-align: top;\n}\n\n.fieldtable td.fieldname {\n        padding-top: 3px;\n}\n\n.fieldtable td.fielddoc {\n        border-bottom: 1px solid #A8B8D9;\n        /*width: 100%;*/\n}\n\n.fieldtable td.fielddoc p:first-child {\n        margin-top: 0px;\n}       \n        \n.fieldtable td.fielddoc p:last-child {\n        margin-bottom: 2px;\n}\n\n.fieldtable tr:last-child td {\n        border-bottom: none;\n}\n\n.fieldtable th {\n        background-image:url('nav_f.png');\n        background-repeat:repeat-x;\n        background-color: #E2E8F2;\n        font-size: 90%;\n        color: #253555;\n        padding-bottom: 4px;\n        padding-top: 5px;\n        text-align:left;\n        -moz-border-radius-topleft: 4px;\n        -moz-border-radius-topright: 4px;\n        -webkit-border-top-left-radius: 4px;\n        -webkit-border-top-right-radius: 4px;\n        border-top-left-radius: 4px;\n        border-top-right-radius: 4px;\n        border-bottom: 1px solid #A8B8D9;\n}\n\n\n.tabsearch {\n\ttop: 0px;\n\tleft: 10px;\n\theight: 36px;\n\tbackground-image: url('tab_b.png');\n\tz-index: 101;\n\toverflow: hidden;\n\tfont-size: 13px;\n}\n\n.navpath ul\n{\n\tfont-size: 11px;\n\t/*background-image:url('tab_b.png');*/\n\tbackground-color: #FFF8F0;\n\tbackground-repeat:repeat-x;\n\tbackground-position: 0 -5px;\n\theight:30px;\n\tline-height:30px;\n\tcolor:#bf6000;\n\tborder:solid 0px #C2CDE4;\n\toverflow:hidden;\n\tmargin:0px;\n\tpadding:0px;\n}\n\n.navpath li\n{\n\tlist-style-type:none;\n\tfloat:left;\n\tpadding-left:10px;\n\tpadding-right:15px;\n\tbackground-image:url('bc_s.png');\n\tbackground-repeat:no-repeat;\n\tbackground-position:right;\n\tcolor:#bf6000;\n}\n\n.navpath li.navelem a\n{\n\theight:32px;\n\tdisplay:block;\n\ttext-decoration: none;\n\toutline: none;\n\tcolor: #bf6000;\n\tfont-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n\ttext-decoration: none;        \n}\n\n.navpath li.navelem a:hover\n{\n\tcolor:#6884BD;\n}\n\n.navpath li.footer\n{\n        list-style-type:none;\n        float:right;\n        padding-left:10px;\n        padding-right:15px;\n        background-image:none;\n        background-repeat:no-repeat;\n        background-position:right;\n        color:#bf6000;\n        font-size: 8pt;\n}\n\ndiv.summary\n{\n\tfloat: right;\n\tfont-size: 8pt;\n\tpadding-right: 5px;\n\twidth: 50%;\n\ttext-align: right;\n}\n\ndiv.summary a\n{\n\twhite-space: nowrap;\n}\n\ndiv.ingroups\n{\n\tfont-size: 8pt;\n\twidth: 50%;\n\ttext-align: left;\n}\n\ndiv.ingroups a\n{\n\twhite-space: nowrap;\n}\n\ndiv.header\n{\n\tbackground-repeat:repeat-x;\n\tbackground-color: #FFFCF8;\n\n\tpadding:0px;\n\tmargin:0px;\n\tmargin-left:auto; \n\tmargin-right:auto;\n\twidth:1280px;\n}\n\ndiv.headertitle\n{\n\tpadding: 5px 5px 5px 10px;\n}\n\ndl\n{\n        padding: 0 0 0 10px;\n}\n\n/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */\ndl.section\n{\n\tmargin-left: 0px;\n\tpadding-left: 0px;\n}\n\ndl.note\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #D0C000;\n}\n\ndl.warning, dl.attention\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #FF0000;\n}\n\ndl.pre, dl.post, dl.invariant\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #00D000;\n}\n\ndl.deprecated\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #505050;\n}\n\ndl.todo\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #E0C000;\n}\n\ndl.test\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #3030E0;\n}\n\ndl.bug\n{\n        margin-left:-7px;\n        padding-left: 3px;\n        border-left:4px solid;\n        border-color: #C08050;\n}\n\ndl.section dd {\n\tmargin-bottom: 6px;\n}\n\n\n#projectlogo\n{\n\ttext-align: center;\n\tvertical-align: bottom;\n\tborder-collapse: separate;\n}\n \n#projectlogo img\n{ \n\tborder: 0px none;\n}\n \n#projectalign\n{\n        vertical-align: middle;\n}\n\n#projectname\n{\n\tfont: 300% Tahoma, Arial,sans-serif;\n\tmargin: 0px;\n\tpadding: 2px 0px;\n\tcolor: #FF8000;\n}\n    \n#projectbrief\n{\n\tfont: 120% Tahoma, Arial,sans-serif;\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\n#projectnumber\n{\n\tfont: 50% Tahoma, Arial,sans-serif;\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\n#titlearea\n{\n\tpadding: 0px;\n\tmargin: 0px;\n\twidth: 100%;\n\tborder-bottom: 1px solid #5373B4;\n}\n\n.image\n{\n        text-align: center;\n}\n\n.dotgraph\n{\n        text-align: center;\n}\n\n.mscgraph\n{\n        text-align: center;\n}\n\n.diagraph\n{\n        text-align: center;\n}\n\n.caption\n{\n\tfont-weight: bold;\n}\n\ndiv.zoom\n{\n\tborder: 1px solid #90A5CE;\n}\n\ndl.citelist {\n        margin-bottom:50px;\n}\n\ndl.citelist dt {\n        color:#334975;\n        float:left;\n        font-weight:bold;\n        margin-right:10px;\n        padding:5px;\n}\n\ndl.citelist dd {\n        margin:2px 0;\n        padding:5px 0;\n}\n\ndiv.toc {\n        padding: 14px 25px;\n        background-color: #F4F6FA;\n        border: 1px solid #D8DFEE;\n        border-radius: 7px 7px 7px 7px;\n        float: right;\n        height: auto;\n        margin: 0 20px 10px 10px;\n        width: 200px;\n}\n\ndiv.toc li {\n        background: url(\"bdwn.png\") no-repeat scroll 0 5px transparent;\n        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;\n        margin-top: 5px;\n        padding-left: 10px;\n        padding-top: 2px;\n}\n\ndiv.toc h3 {\n        font: bold 12px/1.2 Arial,FreeSans,sans-serif;\n\tcolor: #4665A2;\n        border-bottom: 0 none;\n        margin: 0;\n}\n\ndiv.toc ul {\n        list-style: none outside none;\n        border: medium none;\n        padding: 0px;\n}       \n\ndiv.toc li.level1 {\n        margin-left: 0px;\n}\n\ndiv.toc li.level2 {\n        margin-left: 15px;\n}\n\ndiv.toc li.level3 {\n        margin-left: 30px;\n}\n\ndiv.toc li.level4 {\n        margin-left: 45px;\n}\n\n.inherit_header {\n\tfont-weight: bold;\n\tcolor: gray;\n\tcursor: pointer;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.inherit_header td {\n        padding: 6px 0px 2px 5px;\n}\n\n.inherit {\n        display: none;\n}\n\ntr.heading h2 {\n        margin-top: 12px;\n        margin-bottom: 4px;\n}\n\n/* tooltip related style info */\n\n.ttc {\n        position: absolute;\n        display: none;\n}\n\n#powerTip {\n\tcursor: default;\n\twhite-space: nowrap;\n\tbackground-color: white;\n\tborder: 1px solid gray;\n\tborder-radius: 4px 4px 4px 4px;\n\tbox-shadow: 1px 1px 7px gray;\n\tdisplay: none;\n\tfont-size: smaller;\n\tmax-width: 80%;\n\topacity: 0.9;\n\tpadding: 1ex 1em 1em;\n\tposition: absolute;\n\tz-index: 2147483647;\n}\n\n#powerTip div.ttdoc {\n        color: grey;\n\tfont-style: italic;\n}\n\n#powerTip div.ttname a {\n        font-weight: bold;\n}\n\n#powerTip div.ttname {\n        font-weight: bold;\n}\n\n#powerTip div.ttdeci {\n        color: #006318;\n}\n\n#powerTip div {\n        margin: 0px;\n        padding: 0px;\n        font: 12px/16px Roboto,sans-serif;\n}\n\n#powerTip:before, #powerTip:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tmargin: 0px;\n}\n\n#powerTip.n:after,  #powerTip.n:before,\n#powerTip.s:after,  #powerTip.s:before,\n#powerTip.w:after,  #powerTip.w:before,\n#powerTip.e:after,  #powerTip.e:before,\n#powerTip.ne:after, #powerTip.ne:before,\n#powerTip.se:after, #powerTip.se:before,\n#powerTip.nw:after, #powerTip.nw:before,\n#powerTip.sw:after, #powerTip.sw:before {\n\tborder: solid transparent;\n\tcontent: \" \";\n\theight: 0;\n\twidth: 0;\n\tposition: absolute;\n}\n\n#powerTip.n:after,  #powerTip.s:after,\n#powerTip.w:after,  #powerTip.e:after,\n#powerTip.nw:after, #powerTip.ne:after,\n#powerTip.sw:after, #powerTip.se:after {\n\tborder-color: rgba(255, 255, 255, 0);\n}\n\n#powerTip.n:before,  #powerTip.s:before,\n#powerTip.w:before,  #powerTip.e:before,\n#powerTip.nw:before, #powerTip.ne:before,\n#powerTip.sw:before, #powerTip.se:before {\n\tborder-color: rgba(128, 128, 128, 0);\n}\n\n#powerTip.n:after,  #powerTip.n:before,\n#powerTip.ne:after, #powerTip.ne:before,\n#powerTip.nw:after, #powerTip.nw:before {\n\ttop: 100%;\n}\n\n#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {\n\tborder-top-color: #ffffff;\n\tborder-width: 10px;\n\tmargin: 0px -10px;\n}\n#powerTip.n:before {\n\tborder-top-color: #808080;\n\tborder-width: 11px;\n\tmargin: 0px -11px;\n}\n#powerTip.n:after, #powerTip.n:before {\n\tleft: 50%;\n}\n\n#powerTip.nw:after, #powerTip.nw:before {\n\tright: 14px;\n}\n\n#powerTip.ne:after, #powerTip.ne:before {\n\tleft: 14px;\n}\n\n#powerTip.s:after,  #powerTip.s:before,\n#powerTip.se:after, #powerTip.se:before,\n#powerTip.sw:after, #powerTip.sw:before {\n\tbottom: 100%;\n}\n\n#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {\n\tborder-bottom-color: #ffffff;\n\tborder-width: 10px;\n\tmargin: 0px -10px;\n}\n\n#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {\n\tborder-bottom-color: #808080;\n\tborder-width: 11px;\n\tmargin: 0px -11px;\n}\n\n#powerTip.s:after, #powerTip.s:before {\n\tleft: 50%;\n}\n\n#powerTip.sw:after, #powerTip.sw:before {\n\tright: 14px;\n}\n\n#powerTip.se:after, #powerTip.se:before {\n\tleft: 14px;\n}\n\n#powerTip.e:after, #powerTip.e:before {\n\tleft: 100%;\n}\n#powerTip.e:after {\n\tborder-left-color: #ffffff;\n\tborder-width: 10px;\n\ttop: 50%;\n\tmargin-top: -10px;\n}\n#powerTip.e:before {\n\tborder-left-color: #808080;\n\tborder-width: 11px;\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n\n#powerTip.w:after, #powerTip.w:before {\n\tright: 100%;\n}\n#powerTip.w:after {\n\tborder-right-color: #ffffff;\n\tborder-width: 10px;\n\ttop: 50%;\n\tmargin-top: -10px;\n}\n#powerTip.w:before {\n\tborder-right-color: #808080;\n\tborder-width: 11px;\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n\n#titlearea\n{\n\tmargin: 0px;\n\tpadding-top: 8px;\n\tpadding-bottom: 8px;\n\tmargin-top: 32px;\n\twidth: 100%;\n\tborder-bottom: 0px solid #FF8000;\n\tborder-top-left-radius: 8px;\n\tborder-top-right-radius: 8px;\n\tbackground-color:#FFFFFF;\n}\n\n#top\n{\n\tmargin-left:auto; \n\tmargin-right:auto;\n\twidth:1280px;\n}\n\n@media print\n{\n  #top { display: none; }\n  #side-nav { display: none; }\n  #nav-path { display: none; }\n  body { overflow:visible; }\n  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }\n  .summary { display: none; }\n  .memitem { page-break-inside: avoid; }\n  #doc-content\n  {\n    margin-left:0 !important;\n    height:auto !important;\n    width:auto !important;\n    overflow:inherit;\n    display:inline;\n  }\n}\n\n"
  },
  {
    "path": "external/glm/doc/theme/tabs.css",
    "content": ".tabs, .tabs2, .tabs3 {\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFEEDD 95%, #FFEEDD);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFF4F0), to(#FFF4F0));\n    background-color:#FFF8F0;\n\n    width: 100%;\n    z-index: 101;\n    font-size: 13px;\n    font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n}\n\n.tabs2 {\n    font-size: 10px;\n}\n.tabs3 {\n    font-size: 9px;\n}\n\n.tablist {\n    margin: 0;\n    padding: 0;\n    display: table;\n}\n\n.tablist li {\n    float: left;\n    display: table-cell;\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFF4F0 95%, #FFF4F0);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFF4F0), to(#FFF4F0));\n\n    line-height: 36px;\n    list-style: none;\n}\n\n.tablist a {\n    display: block;\n    padding: 0 20px;\n    font-weight: bold;\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFF4F0 95%, #FFF4F0);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFF4F0), to(#FFF4F0));\n\n    background-repeat:no-repeat;\n    background-position:right;\n    background-color:#FFF4F0;\n    color: #992600;\n    text-decoration: none;\n    outline: none;\n}\n\n.tabs3 .tablist a {\n    padding: 0 10px;\n}\n\n.tablist a:hover {\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFF0F8 95%, #FFF0F8);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFF8F0), to(#FF4000));\n\n    background-color:#FFF8F0;\n    color: #FF8000;\n    text-decoration: none;\n}\n\n.tablist li.current a {\n    background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 5%, #FFFCF8 95%, #FFFCF8);\n    background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.05,#FFFFFF), color-stop(0.95,#FFFCF8), to(#FFFCF8));\n\n    background-color:#FFFCF8;\n    color: #992600;\n}\n"
  },
  {
    "path": "external/glm/glm/CMakeLists.txt",
    "content": "file(GLOB ROOT_SOURCE *.cpp)\nfile(GLOB ROOT_INLINE *.inl)\nfile(GLOB ROOT_HEADER *.hpp)\nfile(GLOB ROOT_TEXT ../*.txt)\nfile(GLOB ROOT_MD ../*.md)\nfile(GLOB ROOT_NAT ../util/glm.natvis)\n\nfile(GLOB_RECURSE CORE_SOURCE ./detail/*.cpp)\nfile(GLOB_RECURSE CORE_INLINE ./detail/*.inl)\nfile(GLOB_RECURSE CORE_HEADER ./detail/*.hpp)\n\nfile(GLOB_RECURSE EXT_SOURCE ./ext/*.cpp)\nfile(GLOB_RECURSE EXT_INLINE ./ext/*.inl)\nfile(GLOB_RECURSE EXT_HEADER ./ext/*.hpp)\n\nfile(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp)\nfile(GLOB_RECURSE GTC_INLINE ./gtc/*.inl)\nfile(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp)\n\nfile(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp)\nfile(GLOB_RECURSE GTX_INLINE ./gtx/*.inl)\nfile(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp)\n\nfile(GLOB_RECURSE SIMD_SOURCE ./simd/*.cpp)\nfile(GLOB_RECURSE SIMD_INLINE ./simd/*.inl)\nfile(GLOB_RECURSE SIMD_HEADER ./simd/*.h)\n\nsource_group(\"Text Files\" FILES ${ROOT_TEXT} ${ROOT_MD})\nsource_group(\"Core Files\" FILES ${CORE_SOURCE})\nsource_group(\"Core Files\" FILES ${CORE_INLINE})\nsource_group(\"Core Files\" FILES ${CORE_HEADER})\nsource_group(\"EXT Files\" FILES ${EXT_SOURCE})\nsource_group(\"EXT Files\" FILES ${EXT_INLINE})\nsource_group(\"EXT Files\" FILES ${EXT_HEADER})\nsource_group(\"GTC Files\" FILES ${GTC_SOURCE})\nsource_group(\"GTC Files\" FILES ${GTC_INLINE})\nsource_group(\"GTC Files\" FILES ${GTC_HEADER})\nsource_group(\"GTX Files\" FILES ${GTX_SOURCE})\nsource_group(\"GTX Files\" FILES ${GTX_INLINE})\nsource_group(\"GTX Files\" FILES ${GTX_HEADER})\nsource_group(\"SIMD Files\" FILES ${SIMD_SOURCE})\nsource_group(\"SIMD Files\" FILES ${SIMD_INLINE})\nsource_group(\"SIMD Files\" FILES ${SIMD_HEADER})\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR}/..)\n\nif(GLM_STATIC_LIBRARY_ENABLE OR GLM_DYNAMIC_LIBRARY_ENABLE)\n\tif(GLM_STATIC_LIBRARY_ENABLE)\n\t\tadd_library(glm_static STATIC ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT}\n\t\t\t${ROOT_SOURCE}    ${ROOT_INLINE}    ${ROOT_HEADER}\n\t\t\t${CORE_SOURCE}    ${CORE_INLINE}    ${CORE_HEADER}\n\t\t\t${EXT_SOURCE}     ${EXT_INLINE}     ${EXT_HEADER}\n\t\t\t${GTC_SOURCE}     ${GTC_INLINE}     ${GTC_HEADER}\n\t\t\t${GTX_SOURCE}     ${GTX_INLINE}     ${GTX_HEADER}\n\t\t\t${SIMD_SOURCE}    ${SIMD_INLINE}    ${SIMD_HEADER})\n\tendif(GLM_STATIC_LIBRARY_ENABLE)\n\n\tif(GLM_DYNAMIC_LIBRARY_ENABLE)\n\t\tadd_library(glm_shared SHARED ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT}\n\t\t\t${ROOT_SOURCE}    ${ROOT_INLINE}    ${ROOT_HEADER}\n\t\t\t${CORE_SOURCE}    ${CORE_INLINE}    ${CORE_HEADER}\n\t\t\t${EXT_SOURCE}     ${EXT_INLINE}     ${EXT_HEADER}\n\t\t\t${GTC_SOURCE}     ${GTC_INLINE}     ${GTC_HEADER}\n\t\t\t${GTX_SOURCE}     ${GTX_INLINE}     ${GTX_HEADER}\n\t\t\t${SIMD_SOURCE}    ${SIMD_INLINE}    ${SIMD_HEADER})\n\tendif(GLM_DYNAMIC_LIBRARY_ENABLE)\n\nelse(GLM_STATIC_LIBRARY_ENABLE OR GLM_DYNAMIC_LIBRARY_ENABLE)\n\tadd_executable(glm_dummy ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT}\n\t\t${ROOT_SOURCE}    ${ROOT_INLINE}    ${ROOT_HEADER}\n\t\t${CORE_SOURCE}    ${CORE_INLINE}    ${CORE_HEADER}\n\t\t${EXT_SOURCE}     ${EXT_INLINE}     ${EXT_HEADER}\n\t\t${GTC_SOURCE}     ${GTC_INLINE}     ${GTC_HEADER}\n\t\t${GTX_SOURCE}     ${GTX_INLINE}     ${GTX_HEADER}\n\t\t${SIMD_SOURCE}    ${SIMD_INLINE}    ${SIMD_HEADER})\n\nendif(GLM_STATIC_LIBRARY_ENABLE OR GLM_DYNAMIC_LIBRARY_ENABLE)\n"
  },
  {
    "path": "external/glm/glm/common.hpp",
    "content": "/// @ref core\n/// @file glm/common.hpp\n/// \n/// @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>\n///\n/// @defgroup core_func_common Common functions\n/// @ingroup core\n/// \n/// Include <glm/common.hpp> to use these core features.\n///\n/// These all operate component-wise. The description is per component.\n\n#pragma once\n\n#include \"detail/setup.hpp\"\n#include \"detail/qualifier.hpp\"\n#include \"detail/type_int.hpp\"\n#include \"detail/_fixes.hpp\"\n\nnamespace glm\n{\n\t/// @addtogroup core_func_common\n\t/// @{\n\n\t/// Returns x if x >= 0; otherwise, it returns -x.\n\t/// \n\t/// @tparam genType floating-point or signed integer; scalar or vector types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml\">GLSL abs man page</a>\n\t/// @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>\n\t/// @see qualifier\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType abs(genType x);\n\n\t/// Returns x if x >= 0; otherwise, it returns -x.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or signed integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml\">GLSL abs man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> abs(vec<L, T, Q> const& x);\n\n\t/// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. \n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml\">GLSL sign man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> sign(vec<L, T, Q> const& x);\n\n\t/// Returns a value equal to the nearest integer that is less then or equal to x. \n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml\">GLSL floor man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> floor(vec<L, T, Q> const& x);\n\n\t/// Returns a value equal to the nearest integer to x\n\t/// whose absolute value is not larger than the absolute value of x.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml\">GLSL trunc man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> trunc(vec<L, T, Q> const& x);\n\n\t/// Returns a value equal to the nearest integer to x.\n\t/// The fraction 0.5 will round in a direction chosen by the\n\t/// implementation, presumably the direction that is fastest.\n\t/// This includes the possibility that round(x) returns the\n\t/// same value as roundEven(x) for all values of x.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml\">GLSL round man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> round(vec<L, T, Q> const& x);\n\n\t/// Returns a value equal to the nearest integer to x.\n\t/// A fractional part of 0.5 will round toward the nearest even\n\t/// integer. (Both 3.5 and 4.5 for x will return 4.0.)\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml\">GLSL roundEven man page</a>\n\t/// @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>\n\t/// @see <a href=\"http://developer.amd.com/documentation/articles/pages/New-Round-to-Even-Technique.aspx\">New round to even technique</a>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> roundEven(vec<L, T, Q> const& x);\n\n\t/// Returns a value equal to the nearest integer\n\t/// that is greater than or equal to x.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml\">GLSL ceil man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> ceil(vec<L, T, Q> const& x);\n\n\t/// Return x - floor(x).\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml\">GLSL fract man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType fract(genType x);\n\n\t/// Return x - floor(x).\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml\">GLSL fract man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fract(vec<L, T, Q> const& x);\n\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType mod(genType x, genType y);\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> mod(vec<L, T, Q> const& x, T y);\n\n\t/// Modulus. Returns x - y * floor(x / y)\n\t/// for each component in x using the floating point value y.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types, include glm/gtc/integer for integer scalar types support\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> mod(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns the fractional part of x and sets i to the integer\n\t/// part (as a whole number floating point value). Both the\n\t/// return value and the output parameter will have the same\n\t/// sign as x.\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml\">GLSL modf man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType modf(genType x, genType& i);\n\n\t/// Returns y if y < x; otherwise, it returns x.\n\t///\n\t/// @tparam genType Floating-point or integer; scalar or vector types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType min(genType x, genType y);\n\n\t/// Returns y if y < x; otherwise, it returns x.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> min(vec<L, T, Q> const& x, T y);\n\n\t/// Returns y if y < x; otherwise, it returns x.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> min(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns y if x < y; otherwise, it returns x.\n\t/// \n\t/// @tparam genType Floating-point or integer; scalar or vector types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType max(genType x, genType y);\n\n\t/// Returns y if x < y; otherwise, it returns x.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> max(vec<L, T, Q> const& x, T y);\n\n\t/// Returns y if x < y; otherwise, it returns x.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> max(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns min(max(x, minVal), maxVal) for each component in x \n\t/// using the floating-point values minVal and maxVal.\n\t///\n\t/// @tparam genType Floating-point or integer; scalar or vector types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType clamp(genType x, genType minVal, genType maxVal);\n\n\t/// Returns min(max(x, minVal), maxVal) for each component in x \n\t/// using the floating-point values minVal and maxVal.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> clamp(vec<L, T, Q> const& x, T minVal, T maxVal);\n\n\t/// Returns min(max(x, minVal), maxVal) for each component in x \n\t/// using the floating-point values minVal and maxVal.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL clamp man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> clamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal);\n\n\t/// If genTypeU is a floating scalar or vector:\n\t/// Returns x * (1.0 - a) + y * a, i.e., the linear blend of\n\t/// x and y using the floating-point value a.\n\t/// The value for a is not restricted to the range [0, 1].\n\t/// \n\t/// If genTypeU is a boolean scalar or vector:\n\t/// Selects which vector each returned component comes\n\t/// from. For a component of 'a' that is false, the\n\t/// corresponding component of 'x' is returned. For a\n\t/// component of 'a' that is true, the corresponding\n\t/// component of 'y' is returned. Components of 'x' and 'y' that\n\t/// are not selected are allowed to be invalid floating point\n\t/// values and will have no effect on the results. Thus, this\n\t/// provides different functionality than\n\t/// genType mix(genType x, genType y, genType(a))\n\t/// where a is a Boolean vector.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mix.xml\">GLSL mix man page</a>\n\t/// @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>\n\t/// \n\t/// @param[in]  x Value to interpolate.\n\t/// @param[in]  y Value to interpolate.\n\t/// @param[in]  a Interpolant.\n\t/// \n\t/// @tparam\tgenTypeT Floating point scalar or vector.\n\t/// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT.\n\t/// \n\t/// @code\n\t/// #include <glm/glm.hpp>\n\t/// ...\n\t/// float a;\n\t/// bool b;\n\t/// glm::dvec3 e;\n\t/// glm::dvec3 f;\n\t/// glm::vec4 g;\n\t/// glm::vec4 h;\n\t/// ...\n\t/// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar two vectors. \n\t/// glm::vec4 s = glm::mix(g, h, b); // Returns g or h;\n\t/// glm::dvec3 t = glm::mix(e, f, a); // Types of the third parameter is not required to match with the first and the second.\n\t/// glm::vec4 u = glm::mix(g, h, r); // Interpolations can be perform per component with a vector for the last parameter.\n\t/// @endcode\n\ttemplate<typename genTypeT, typename genTypeU>\n\tGLM_FUNC_DECL genTypeT mix(genTypeT x, genTypeT y, genTypeU a);\n\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> mix(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, U, Q> const& a);\n\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> mix(vec<L, T, Q> const& x, vec<L, T, Q> const& y, U a);\n\n\t/// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a genType.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType step(genType edge, genType x);\n\n\t/// Returns 0.0 if x < edge, otherwise it returns 1.0.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> step(T edge, vec<L, T, Q> const& x);\n\n\t/// Returns 0.0 if x < edge, otherwise it returns 1.0.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL step man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> step(vec<L, T, Q> const& edge, vec<L, T, Q> const& x);\n\n\t/// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and\n\t/// performs smooth Hermite interpolation between 0 and 1\n\t/// when edge0 < x < edge1. This is useful in cases where\n\t/// you would want a threshold function with a smooth\n\t/// transition. This is equivalent to:\n\t/// genType t;\n\t/// t = clamp ((x - edge0) / (edge1 - edge0), 0, 1);\n\t/// return t * t * (3 - 2 * t);\n\t/// Results are undefined if edge0 >= edge1.\n\t///\n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml\">GLSL smoothstep man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType smoothstep(genType edge0, genType edge1, genType x);\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> smoothstep(T edge0, T edge1, vec<L, T, Q> const& x);\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> smoothstep(vec<L, T, Q> const& edge0, vec<L, T, Q> const& edge1, vec<L, T, Q> const& x);\n\n\t/// Returns true if x holds a NaN (not a number)\n\t/// representation in the underlying implementation's set of\n\t/// floating point representations. Returns false otherwise,\n\t/// including for implementations with no NaN\n\t/// representations.\n\t/// \n\t/// /!\\ When using compiler fast math, this function may fail.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml\">GLSL isnan man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> isnan(vec<L, T, Q> const& x);\n\n\t/// Returns true if x holds a positive infinity or negative\n\t/// infinity representation in the underlying implementation's\n\t/// set of floating point representations. Returns false\n\t/// otherwise, including for implementations with no infinity\n\t/// representations.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml\">GLSL isinf man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> isinf(vec<L, T, Q> const& x);\n\n\t/// Returns a signed integer value representing\n\t/// the encoding of a floating-point value. The floating-point\n\t/// value's bit-level representation is preserved.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml\">GLSL floatBitsToInt man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL int floatBitsToInt(float const& v);\n\n\t/// Returns a signed integer value representing\n\t/// the encoding of a floating-point value. The floatingpoint\n\t/// value's bit-level representation is preserved.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml\">GLSL floatBitsToInt man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, int, Q> floatBitsToInt(vec<L, float, Q> const& v);\n\n\t/// Returns a unsigned integer value representing\n\t/// the encoding of a floating-point value. The floatingpoint\n\t/// value's bit-level representation is preserved.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml\">GLSL floatBitsToUint man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint floatBitsToUint(float const& v);\n\n\t/// Returns a unsigned integer value representing\n\t/// the encoding of a floating-point value. The floatingpoint\n\t/// value's bit-level representation is preserved.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml\">GLSL floatBitsToUint man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, uint, Q> floatBitsToUint(vec<L, float, Q> const& v);\n\n\t/// Returns a floating-point value corresponding to a signed\n\t/// integer encoding of a floating-point value.\n\t/// If an inf or NaN is passed in, it will not signal, and the\n\t/// resulting floating point value is unspecified. Otherwise,\n\t/// the bit-level representation is preserved.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml\">GLSL intBitsToFloat man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL float intBitsToFloat(int const& v);\n\n\t/// Returns a floating-point value corresponding to a signed\n\t/// integer encoding of a floating-point value.\n\t/// If an inf or NaN is passed in, it will not signal, and the\n\t/// resulting floating point value is unspecified. Otherwise,\n\t/// the bit-level representation is preserved.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml\">GLSL intBitsToFloat man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, float, Q> intBitsToFloat(vec<L, int, Q> const& v);\n\n\t/// Returns a floating-point value corresponding to a\n\t/// unsigned integer encoding of a floating-point value.\n\t/// If an inf or NaN is passed in, it will not signal, and the\n\t/// resulting floating point value is unspecified. Otherwise,\n\t/// the bit-level representation is preserved.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml\">GLSL uintBitsToFloat man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL float uintBitsToFloat(uint const& v);\n\n\t/// Returns a floating-point value corresponding to a\n\t/// unsigned integer encoding of a floating-point value.\n\t/// If an inf or NaN is passed in, it will not signal, and the\n\t/// resulting floating point value is unspecified. Otherwise,\n\t/// the bit-level representation is preserved.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml\">GLSL uintBitsToFloat man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, float, Q> uintBitsToFloat(vec<L, uint, Q> const& v);\n\n\t/// Computes and returns a * b + c.\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml\">GLSL fma man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType fma(genType const& a, genType const& b, genType const& c);\n\n\t/// Splits x into a floating-point significand in the range\n\t/// [0.5, 1.0) and an integral exponent of two, such that:\n\t/// x = significand * exp(2, exponent)\n\t/// \n\t/// The significand is returned by the function and the\n\t/// exponent is returned in the parameter exp. For a\n\t/// floating-point value of zero, the significant and exponent\n\t/// are both zero. For a floating-point value that is an\n\t/// infinity or is not a number, the results are undefined.\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml\">GLSL frexp man page</a>\n\t/// @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>\n\ttemplate<typename genType, typename genIType>\n\tGLM_FUNC_DECL genType frexp(genType const& x, genIType& exp);\n\n\t/// Builds a floating-point number from x and the\n\t/// corresponding integral exponent of two in exp, returning:\n\t/// significand * exp(2, exponent)\n\t/// \n\t/// If this product is too large to be represented in the\n\t/// floating-point type, the result is undefined.\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t///  \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml\">GLSL ldexp man page</a>; \n\t/// @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>\n\ttemplate<typename genType, typename genIType>\n\tGLM_FUNC_DECL genType ldexp(genType const& x, genIType const& exp);\n\n\t/// @}\n}//namespace glm\n\n#include \"detail/func_common.inl\"\n\n"
  },
  {
    "path": "external/glm/glm/detail/_features.hpp",
    "content": "/// @ref core\n/// @file glm/detail/_features.hpp\n\n#pragma once\n\n// #define GLM_CXX98_EXCEPTIONS\n// #define GLM_CXX98_RTTI\n\n// #define GLM_CXX11_RVALUE_REFERENCES\n// Rvalue references - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html\n\n// GLM_CXX11_TRAILING_RETURN\n// Rvalue references for *this - GCC not supported\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm\n\n// GLM_CXX11_NONSTATIC_MEMBER_INIT\n// Initialization of class objects by rvalues - GCC any\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html\n\n// GLM_CXX11_NONSTATIC_MEMBER_INIT\n// Non-static data member initializers - GCC 4.7\n// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm\n\n// #define GLM_CXX11_VARIADIC_TEMPLATE\n// Variadic templates - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf\n\n// \n// Extending variadic template template parameters - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf\n\n// #define GLM_CXX11_GENERALIZED_INITIALIZERS\n// Initializer lists - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm\n\n// #define GLM_CXX11_STATIC_ASSERT \n// Static assertions - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html\n\n// #define GLM_CXX11_AUTO_TYPE\n// auto-typed variables - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf\n\n// #define GLM_CXX11_AUTO_TYPE\n// Multi-declarator auto - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1737.pdf\n\n// #define GLM_CXX11_AUTO_TYPE\n// Removal of auto as a storage-class specifier - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm\n\n// #define GLM_CXX11_AUTO_TYPE\n// New function declarator syntax - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm\n\n// #define GLM_CXX11_LAMBDAS\n// New wording for C++0x lambdas - GCC 4.5\n// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf\n\n// #define GLM_CXX11_DECLTYPE\n// Declared type of an expression - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf\n\n// \n// Right angle brackets - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html\n\n// \n// Default template arguments for function templates\tDR226\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226\n\n// \n// Solving the SFINAE problem for expressions\tDR339\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html\n\n// #define GLM_CXX11_ALIAS_TEMPLATE\n// Template aliases\tN2258\tGCC 4.7\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf\n\n// \n// Extern templates\tN1987\tYes\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm\n\n// #define GLM_CXX11_NULLPTR\n// Null pointer constant\tN2431\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf\n\n// #define GLM_CXX11_STRONG_ENUMS\n// Strongly-typed enums\tN2347\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf\n\n// \n// Forward declarations for enums\tN2764\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf\n\n// \n// Generalized attributes\tN2761\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf\n\n// \n// Generalized constant expressions\tN2235\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf\n\n// \n// Alignment support\tN2341\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf\n\n// #define GLM_CXX11_DELEGATING_CONSTRUCTORS\n// Delegating constructors\tN1986\tGCC 4.7\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf\n\n// \n// Inheriting constructors\tN2540\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm\n\n// #define GLM_CXX11_EXPLICIT_CONVERSIONS\n// Explicit conversion operators\tN2437\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf\n\n// \n// New character types\tN2249\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html\n\n// \n// Unicode string literals\tN2442\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm\n\n// \n// Raw string literals\tN2442\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm\n\n// \n// Universal character name literals\tN2170\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html\n\n// #define GLM_CXX11_USER_LITERALS\n// User-defined literals\t\tN2765\tGCC 4.7\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf\n\n// \n// Standard Layout Types\tN2342\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm\n\n// #define GLM_CXX11_DEFAULTED_FUNCTIONS\n// #define GLM_CXX11_DELETED_FUNCTIONS\n// Defaulted and deleted functions\tN2346\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm\n\n// \n// Extended friend declarations\tN1791\tGCC 4.7\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf\n\n// \n// Extending sizeof\tN2253\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html\n\n// #define GLM_CXX11_INLINE_NAMESPACES\n// Inline namespaces\tN2535\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm\n\n// #define GLM_CXX11_UNRESTRICTED_UNIONS\n// Unrestricted unions\tN2544\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf\n\n// #define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS\n// Local and unnamed types as template arguments\tN2657\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm\n\n// #define GLM_CXX11_RANGE_FOR\n// Range-based for\tN2930\tGCC 4.6\n// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html\n\n// #define GLM_CXX11_OVERRIDE_CONTROL\n// Explicit virtual overrides\tN2928 N3206 N3272\tGCC 4.7\n// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm\n\n// \n// Minimal support for garbage collection and reachability-based leak detection\tN2670\tNo\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm\n\n// #define GLM_CXX11_NOEXCEPT\n// Allowing move constructors to throw [noexcept]\tN3050\tGCC 4.6 (core language only)\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html\n\n// \n// Defining move special member functions\tN3053\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html\n\n// \n// Sequence points\tN2239\tYes\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html\n\n// \n// Atomic operations\tN2427\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html\n\n// \n// Strong Compare and Exchange\tN2748\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html\n\n// \n// Bidirectional Fences\tN2752\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm\n\n// \n// Memory model\tN2429\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm\n\n// \n// Data-dependency ordering: atomics and memory model\tN2664\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm\n\n// \n// Propagating exceptions\tN2179\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html\n\n// \n// Abandoning a process and at_quick_exit\tN2440\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm\n\n// \n// Allow atomics use in signal handlers\tN2547\tYes\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm\n\n// \n// Thread-local storage\tN2659\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm\n\n// \n// Dynamic initialization and destruction with concurrency\tN2660\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm\n\n// \n// __func__ predefined identifier\tN2340\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm\n\n// \n// C99 preprocessor\tN1653\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm\n\n// \n// long long\tN1811\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf\n\n// \n// Extended integral types\tN1988\tYes\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf\n\n#if(GLM_COMPILER & GLM_COMPILER_GCC)\n\n#\tdefine GLM_CXX11_STATIC_ASSERT\n\n#elif(GLM_COMPILER & GLM_COMPILER_CLANG)\n#\tif(__has_feature(cxx_exceptions))\n#\t\tdefine GLM_CXX98_EXCEPTIONS\n#\tendif\n\n#\tif(__has_feature(cxx_rtti))\n#\t\tdefine GLM_CXX98_RTTI\n#\tendif\n\n#\tif(__has_feature(cxx_access_control_sfinae))\n#\t\tdefine GLM_CXX11_ACCESS_CONTROL_SFINAE\n#\tendif\n\n#\tif(__has_feature(cxx_alias_templates))\n#\t\tdefine GLM_CXX11_ALIAS_TEMPLATE\n#\tendif\n\n#\tif(__has_feature(cxx_alignas))\n#\t\tdefine GLM_CXX11_ALIGNAS\n#\tendif\n\n#\tif(__has_feature(cxx_attributes))\n#\t\tdefine GLM_CXX11_ATTRIBUTES\n#\tendif\n\n#\tif(__has_feature(cxx_constexpr))\n#\t\tdefine GLM_CXX11_CONSTEXPR\n#\tendif\n\n#\tif(__has_feature(cxx_decltype))\n#\t\tdefine GLM_CXX11_DECLTYPE\n#\tendif\n\n#\tif(__has_feature(cxx_default_function_template_args))\n#\t\tdefine GLM_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS\n#\tendif\n\n#\tif(__has_feature(cxx_defaulted_functions))\n#\t\tdefine GLM_CXX11_DEFAULTED_FUNCTIONS\n#\tendif\n\n#\tif(__has_feature(cxx_delegating_constructors))\n#\t\tdefine GLM_CXX11_DELEGATING_CONSTRUCTORS\n#\tendif\n\n#\tif(__has_feature(cxx_deleted_functions))\n#\t\tdefine GLM_CXX11_DELETED_FUNCTIONS\n#\tendif\n\n#\tif(__has_feature(cxx_explicit_conversions))\n#\t\tdefine GLM_CXX11_EXPLICIT_CONVERSIONS\n#\tendif\n\n#\tif(__has_feature(cxx_generalized_initializers))\n#\t\tdefine GLM_CXX11_GENERALIZED_INITIALIZERS\n#\tendif\n\n#\tif(__has_feature(cxx_implicit_moves))\n#\t\tdefine GLM_CXX11_IMPLICIT_MOVES\n#\tendif\n\n#\tif(__has_feature(cxx_inheriting_constructors))\n#\t\tdefine GLM_CXX11_INHERITING_CONSTRUCTORS\n#\tendif\n\n#\tif(__has_feature(cxx_inline_namespaces))\n#\t\tdefine GLM_CXX11_INLINE_NAMESPACES\n#\tendif\n\n#\tif(__has_feature(cxx_lambdas))\n#\t\tdefine GLM_CXX11_LAMBDAS\n#\tendif\n\n#\tif(__has_feature(cxx_local_type_template_args))\n#\t\tdefine GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS\n#\tendif\n\n#\tif(__has_feature(cxx_noexcept))\n#\t\tdefine GLM_CXX11_NOEXCEPT\n#\tendif\n\n#\tif(__has_feature(cxx_nonstatic_member_init))\n#\t\tdefine GLM_CXX11_NONSTATIC_MEMBER_INIT\n#\tendif\n\n#\tif(__has_feature(cxx_nullptr))\n#\t\tdefine GLM_CXX11_NULLPTR\n#\tendif\n\n#\tif(__has_feature(cxx_override_control))\n#\t\tdefine GLM_CXX11_OVERRIDE_CONTROL\n#\tendif\n\n#\tif(__has_feature(cxx_reference_qualified_functions))\n#\t\tdefine GLM_CXX11_REFERENCE_QUALIFIED_FUNCTIONS\n#\tendif\n\n#\tif(__has_feature(cxx_range_for))\n#\t\tdefine GLM_CXX11_RANGE_FOR\n#\tendif\n\n#\tif(__has_feature(cxx_raw_string_literals))\n#\t\tdefine GLM_CXX11_RAW_STRING_LITERALS\n#\tendif\n\n#\tif(__has_feature(cxx_rvalue_references))\n#\t\tdefine GLM_CXX11_RVALUE_REFERENCES\n#\tendif\n\n#\tif(__has_feature(cxx_static_assert))\n#\t\tdefine GLM_CXX11_STATIC_ASSERT\n#\tendif\n\n#\tif(__has_feature(cxx_auto_type))\n#\t\tdefine GLM_CXX11_AUTO_TYPE\n#\tendif\n\n#\tif(__has_feature(cxx_strong_enums))\n#\t\tdefine GLM_CXX11_STRONG_ENUMS\n#\tendif\n\n#\tif(__has_feature(cxx_trailing_return))\n#\t\tdefine GLM_CXX11_TRAILING_RETURN\n#\tendif\n\n#\tif(__has_feature(cxx_unicode_literals))\n#\t\tdefine GLM_CXX11_UNICODE_LITERALS\n#\tendif\n\n#\tif(__has_feature(cxx_unrestricted_unions))\n#\t\tdefine GLM_CXX11_UNRESTRICTED_UNIONS\n#\tendif\n\n#\tif(__has_feature(cxx_user_literals))\n#\t\tdefine GLM_CXX11_USER_LITERALS\n#\tendif\n\n#\tif(__has_feature(cxx_variadic_templates))\n#\t\tdefine GLM_CXX11_VARIADIC_TEMPLATES\n#\tendif\n\n#endif//(GLM_COMPILER & GLM_COMPILER_CLANG)\n"
  },
  {
    "path": "external/glm/glm/detail/_fixes.hpp",
    "content": "/// @ref core\n/// @file glm/detail/_fixes.hpp\n\n#include <cmath>\n\n//! Workaround for compatibility with other libraries\n#ifdef max\n#undef max\n#endif\n\n//! Workaround for compatibility with other libraries\n#ifdef min\n#undef min\n#endif\n\n//! Workaround for Android\n#ifdef isnan\n#undef isnan\n#endif\n\n//! Workaround for Android\n#ifdef isinf\n#undef isinf\n#endif\n\n//! Workaround for Chrone Native Client\n#ifdef log2\n#undef log2\n#endif\n\n"
  },
  {
    "path": "external/glm/glm/detail/_noise.hpp",
    "content": "/// @ref core\n/// @file glm/detail/_noise.hpp\n\n#pragma once\n\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../common.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T mod289(T const& x)\n\t{\n\t\treturn x - floor(x * (static_cast<T>(1.0) / static_cast<T>(289.0))) * static_cast<T>(289.0);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T permute(T const& x)\n\t{\n\t\treturn mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> permute(vec<2, T, Q> const& x)\n\t{\n\t\treturn mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x);\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> permute(vec<3, T, Q> const& x)\n\t{\n\t\treturn mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x);\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> permute(vec<4, T, Q> const& x)\n\t{\n\t\treturn mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T taylorInvSqrt(T const& r)\n\t{\n\t\treturn T(1.79284291400159) - T(0.85373472095314) * r;\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> taylorInvSqrt(vec<2, T, Q> const& r)\n\t{\n\t\treturn T(1.79284291400159) - T(0.85373472095314) * r;\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> taylorInvSqrt(vec<3, T, Q> const& r)\n\t{\n\t\treturn T(1.79284291400159) - T(0.85373472095314) * r;\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> taylorInvSqrt(vec<4, T, Q> const& r)\n\t{\n\t\treturn T(1.79284291400159) - T(0.85373472095314) * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> fade(vec<2, T, Q> const& t)\n\t{\n\t\treturn (t * t * t) * (t * (t * T(6) - T(15)) + T(10));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> fade(vec<3, T, Q> const& t)\n\t{\n\t\treturn (t * t * t) * (t * (t * T(6) - T(15)) + T(10));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> fade(vec<4, T, Q> const& t)\n\t{\n\t\treturn (t * t * t) * (t * (t * T(6) - T(15)) + T(10));\n\t}\n}//namespace detail\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/detail/_swizzle.hpp",
    "content": "/// @ref core\n/// @file glm/detail/_swizzle.hpp\n\n#pragma once\n\nnamespace glm{\nnamespace detail\n{\n\t// Internal class for implementing swizzle operators\n\ttemplate<typename T, int N>\n\tstruct _swizzle_base0\n\t{\n\tprotected:\n\t\tGLM_FUNC_QUALIFIER T& elem(size_t i){ return (reinterpret_cast<T*>(_buffer))[i]; }\n\t\tGLM_FUNC_QUALIFIER T const& elem(size_t i) const{ return (reinterpret_cast<const T*>(_buffer))[i]; }\n\n\t\t// Use an opaque buffer to *ensure* the compiler doesn't call a constructor.\n\t\t// The size 1 buffer is assumed to aligned to the actual members so that the\n\t\t// elem() \n\t\tchar    _buffer[1];\n\t};\n\n\ttemplate<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3, bool Aligned>\n\tstruct _swizzle_base1 : public _swizzle_base0<T, N>\n\t{\n\t};\n\n\ttemplate<typename T, qualifier Q, int E0, int E1, bool Aligned>\n\tstruct _swizzle_base1<2, T, Q, E0,E1,-1,-2, Aligned> : public _swizzle_base0<T, 2>\n\t{\n\t\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator ()()  const { return vec<2, T, Q>(this->elem(E0), this->elem(E1)); }\n\t};\n\n\ttemplate<typename T, qualifier Q, int E0, int E1, int E2, bool Aligned>\n\tstruct _swizzle_base1<3, T, Q, E0,E1,E2,-1, Aligned> : public _swizzle_base0<T, 3>\n\t{\n\t\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator ()()  const { return vec<3, T, Q>(this->elem(E0), this->elem(E1), this->elem(E2)); }\n\t};\n\n\ttemplate<typename T, qualifier Q, int E0, int E1, int E2, int E3, bool Aligned>\n\tstruct _swizzle_base1<4, T, Q, E0,E1,E2,E3, Aligned> : public _swizzle_base0<T, 4>\n\t{ \n\t\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator ()()  const { return vec<4, T, Q>(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); }\n\t};\n\n\t// Internal class for implementing swizzle operators\n\t/*\n\t\tTemplate parameters:\n\n\t\tT\t\t\t= type of scalar values (e.g. float, double)\n\t\tN\t\t\t= number of components in the vector (e.g. 3)\n\t\tE0...3\t\t= what index the n-th element of this swizzle refers to in the unswizzled vec\n\n\t\tDUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used to specialize swizzles\n\t\t\tcontaining duplicate elements so that they cannot be used as r-values).            \n\t*/\n\ttemplate<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3, int DUPLICATE_ELEMENTS>\n\tstruct _swizzle_base2 : public _swizzle_base1<N, T, Q, E0,E1,E2,E3, detail::is_aligned<Q>::value>\n\t{\n\t\tGLM_FUNC_QUALIFIER _swizzle_base2& operator= (const T& t)\n\t\t{\n\t\t\tfor (int i = 0; i < N; ++i)\n\t\t\t\t(*this)[i] = t;\n\t\t\treturn *this;\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER _swizzle_base2& operator= (vec<N, T, Q> const& that)\n\t\t{\n\t\t\tstruct op { \n\t\t\t\tGLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e = t; } \n\t\t\t};\n\t\t\t_apply_op(that, op());\n\t\t\treturn *this;\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER void operator -= (vec<N, T, Q> const& that)\n\t\t{\n\t\t\tstruct op { \n\t\t\t\tGLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e -= t; } \n\t\t\t};\n\t\t\t_apply_op(that, op());\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER void operator += (vec<N, T, Q> const& that)\n\t\t{\n\t\t\tstruct op { \n\t\t\t\tGLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e += t; } \n\t\t\t};\n\t\t\t_apply_op(that, op());\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER void operator *= (vec<N, T, Q> const& that)\n\t\t{\n\t\t\tstruct op { \n\t\t\t\tGLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e *= t; } \n\t\t\t};\n\t\t\t_apply_op(that, op());\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER void operator /= (vec<N, T, Q> const& that)\n\t\t{\n\t\t\tstruct op { \n\t\t\t\tGLM_FUNC_QUALIFIER void operator() (T& e, T& t) { e /= t; } \n\t\t\t};\n\t\t\t_apply_op(that, op());\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER T& operator[](size_t i)\n\t\t{\n\t\t\tconst int offset_dst[4] = { E0, E1, E2, E3 };\n\t\t\treturn this->elem(offset_dst[i]);\n\t\t}\n\t\tGLM_FUNC_QUALIFIER T operator[](size_t i) const\n\t\t{\n\t\t\tconst int offset_dst[4] = { E0, E1, E2, E3 };\n\t\t\treturn this->elem(offset_dst[i]);\n\t\t}\n\n\tprotected:\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_QUALIFIER void _apply_op(vec<N, T, Q> const& that, U op)\n\t\t{\n\t\t\t// Make a copy of the data in this == &that.\n\t\t\t// The copier should optimize out the copy in cases where the function is\n\t\t\t// properly inlined and the copy is not necessary.\n\t\t\tT t[N];\n\t\t\tfor (int i = 0; i < N; ++i)\n\t\t\t\tt[i] = that[i];\n\t\t\tfor (int i = 0; i < N; ++i)\n\t\t\t\top( (*this)[i], t[i] );\n\t\t}\n\t};\n\n\t// Specialization for swizzles containing duplicate elements.  These cannot be modified.\n\ttemplate<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3>\n\tstruct _swizzle_base2<N, T, Q, E0,E1,E2,E3, 1> : public _swizzle_base1<N, T, Q, E0,E1,E2,E3, detail::is_aligned<Q>::value>\n\t{\n\t\tstruct Stub {};\n\n\t\tGLM_FUNC_QUALIFIER _swizzle_base2& operator= (Stub const&) { return *this; }\n\n\t\tGLM_FUNC_QUALIFIER T operator[]  (size_t i) const\n\t\t{\n\t\t\tconst int offset_dst[4] = { E0, E1, E2, E3 };\n\t\t\treturn this->elem(offset_dst[i]);\n\t\t}\n\t};\n\n\ttemplate<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3>\n\tstruct _swizzle : public _swizzle_base2<N, T, Q, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)>\n\t{\n\t\ttypedef _swizzle_base2<N, T, Q, E0, E1, E2, E3, (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 || E1 == E3 || E2 == E3)> base_type;\n\n\t\tusing base_type::operator=;\n\n\t\tGLM_FUNC_QUALIFIER operator vec<N, T, Q> () const { return (*this)(); }\n\t};\n\n//\n// To prevent the C++ syntax from getting entirely overwhelming, define some alias macros\n//\n#define GLM_SWIZZLE_TEMPLATE1   template<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3>\n#define GLM_SWIZZLE_TEMPLATE2   template<int N, typename T, qualifier Q, int E0, int E1, int E2, int E3, int F0, int F1, int F2, int F3>\n#define GLM_SWIZZLE_TYPE1       _swizzle<N, T, Q, E0, E1, E2, E3>\n#define GLM_SWIZZLE_TYPE2       _swizzle<N, T, Q, F0, F1, F2, F3>\n\n//\n// Wrapper for a binary operator (e.g. u.yy + v.zy)\n//\n#define GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND)                 \\\n\tGLM_SWIZZLE_TEMPLATE2                                                          \\\n\tGLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b)  \\\n\t{                                                                               \\\n\t\treturn a() OPERAND b();                                                     \\\n\t}                                                                               \\\n\tGLM_SWIZZLE_TEMPLATE1                                                          \\\n\tGLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const vec<N, T, Q>& b)                   \\\n\t{                                                                               \\\n\t\treturn a() OPERAND b;                                                       \\\n\t}                                                                               \\\n\tGLM_SWIZZLE_TEMPLATE1                                                          \\\n\tGLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const vec<N, T, Q>& a, const GLM_SWIZZLE_TYPE1& b)                   \\\n\t{                                                                               \\\n\t\treturn a OPERAND b();                                                       \\\n\t}\n\n//\n// Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz)\n//\n#define GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND)                 \\\n\tGLM_SWIZZLE_TEMPLATE1                                                          \\\n\tGLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const GLM_SWIZZLE_TYPE1& a, const T& b)                   \\\n\t{                                                                               \\\n\t\treturn a() OPERAND b;                                                       \\\n\t}                                                                               \\\n\tGLM_SWIZZLE_TEMPLATE1                                                          \\\n\tGLM_FUNC_QUALIFIER vec<N, T, Q> operator OPERAND ( const T& a, const GLM_SWIZZLE_TYPE1& b)                   \\\n\t{                                                                               \\\n\t\treturn a OPERAND b();                                                       \\\n\t}\n\n//\n// Macro for wrapping a function taking one argument (e.g. abs())\n//\n#define GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION)                          \\\n\tGLM_SWIZZLE_TEMPLATE1                                                          \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a)  \\\n\t{                                                                               \\\n\t\treturn FUNCTION(a());                                                       \\\n\t}\n\n//\n// Macro for wrapping a function taking two vector arguments (e.g. dot()).\n//\n#define GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION)                                                      \\\n\tGLM_SWIZZLE_TEMPLATE2                                                                                      \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b) \\\n\t{                                                                                                           \\\n\t\treturn FUNCTION(a(), b());                                                                              \\\n\t}                                                                                                           \\\n\tGLM_SWIZZLE_TEMPLATE1                                                                                      \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE1& b) \\\n\t{                                                                                                           \\\n\t\treturn FUNCTION(a(), b());                                                                              \\\n\t}                                                                                                           \\\n\tGLM_SWIZZLE_TEMPLATE1                                                                                      \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const typename V& b)         \\\n\t{                                                                                                           \\\n\t\treturn FUNCTION(a(), b);                                                                                \\\n\t}                                                                                                           \\\n\tGLM_SWIZZLE_TEMPLATE1                                                                                      \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V& a, const GLM_SWIZZLE_TYPE1& b)                  \\\n\t{                                                                                                           \\\n\t\treturn FUNCTION(a, b());                                                                                \\\n\t} \n\n//\n// Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g. mix()).\n//\n#define GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION)                                                             \\\n\tGLM_SWIZZLE_TEMPLATE2                                                                                                    \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE2& b, const T& c)   \\\n\t{                                                                                                                         \\\n\t\treturn FUNCTION(a(), b(), c);                                                                                         \\\n\t}                                                                                                                         \\\n\tGLM_SWIZZLE_TEMPLATE1                                                                                                    \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const GLM_SWIZZLE_TYPE1& b, const T& c)   \\\n\t{                                                                                                                         \\\n\t\treturn FUNCTION(a(), b(), c);                                                                                         \\\n\t}                                                                                                                         \\\n\tGLM_SWIZZLE_TEMPLATE1                                                                                                    \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b, const T& c)\\\n\t{                                                                                                                         \\\n\t\treturn FUNCTION(a(), b, c);                                                                                           \\\n\t}                                                                                                                         \\\n\tGLM_SWIZZLE_TEMPLATE1                                                                                                    \\\n\tGLM_FUNC_QUALIFIER typename GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V& a, const GLM_SWIZZLE_TYPE1& b, const T& c)           \\\n\t{                                                                                                                         \\\n\t\treturn FUNCTION(a, b(), c);                                                                                           \\\n\t} \n \n}//namespace detail \n}//namespace glm\n\nnamespace glm\n{\n\tnamespace detail\n\t{\n\t\tGLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-)\n\t\tGLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*)\n\t\tGLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+)\n\t\tGLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-)\n\t\tGLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*)\n\t\tGLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/)\n\t}\n\n\t//\n\t// Swizzles are distinct types from the unswizzled type.  The below macros will\n\t// provide template specializations for the swizzle types for the given functions\n\t// so that the compiler does not have any ambiguity to choosing how to handle\n\t// the function.\n\t//\n\t// The alternative is to use the operator()() when calling the function in order\n\t// to explicitly convert the swizzled type to the unswizzled type.\n\t//\n\n\t//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    abs);\n\t//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    acos);\n\t//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    acosh);\n\t//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    all);\n\t//GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    any);\n\n\t//GLM_SWIZZLE_FUNCTION_2_ARGS(value_type,  dot);\n\t//GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type,    cross);\n\t//GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type,    step);    \n\t//GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix);\n}\n\n#define GLM_SWIZZLE2_2_MEMBERS(T, Q, E0,E1) \\\n\tstruct { detail::_swizzle<2, T, Q, 0,0,-1,-2> E0 ## E0; }; \\\n\tstruct { detail::_swizzle<2, T, Q, 0,1,-1,-2> E0 ## E1; }; \\\n\tstruct { detail::_swizzle<2, T, Q, 1,0,-1,-2> E1 ## E0; }; \\\n\tstruct { detail::_swizzle<2, T, Q, 1,1,-1,-2> E1 ## E1; }; \n\n#define GLM_SWIZZLE2_3_MEMBERS(T, Q, E0,E1) \\\n\tstruct { detail::_swizzle<3,T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3,T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3,T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3,T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<3,T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3,T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3,T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3,T, Q, 1,1,1,-1> E1 ## E1 ## E1; };  \n\n#define GLM_SWIZZLE2_4_MEMBERS(T, Q, E0,E1) \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; };\n\n#define GLM_SWIZZLE3_2_MEMBERS(T, Q, E0,E1,E2) \\\n\tstruct { detail::_swizzle<2,T, Q, 0,0,-1,-2> E0 ## E0; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 0,1,-1,-2> E0 ## E1; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 0,2,-1,-2> E0 ## E2; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 1,0,-1,-2> E1 ## E0; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 1,1,-1,-2> E1 ## E1; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 1,2,-1,-2> E1 ## E2; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 2,0,-1,-2> E2 ## E0; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 2,1,-1,-2> E2 ## E1; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 2,2,-1,-2> E2 ## E2; };\n\n#define GLM_SWIZZLE3_3_MEMBERS(T, Q ,E0,E1,E2) \\\n\tstruct { detail::_swizzle<3, T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,0,2,-1> E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,1,2,-1> E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,2,0,-1> E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,2,1,-1> E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,2,2,-1> E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,0,2,-1> E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,1,2,-1> E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,2,0,-1> E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,2,1,-1> E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,2,2,-1> E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,0,0,-1> E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,0,1,-1> E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,0,2,-1> E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,1,0,-1> E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,1,1,-1> E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,1,2,-1> E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,2,0,-1> E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,2,1,-1> E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,2,2,-1> E2 ## E2 ## E2; };\n\n#define GLM_SWIZZLE3_4_MEMBERS(T, Q, E0,E1,E2) \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4,T, Q, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; \n\n#define GLM_SWIZZLE4_2_MEMBERS(T, Q, E0,E1,E2,E3) \\\n\tstruct { detail::_swizzle<2,T, Q, 0,0,-1,-2> E0 ## E0; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 0,1,-1,-2> E0 ## E1; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 0,2,-1,-2> E0 ## E2; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 0,3,-1,-2> E0 ## E3; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 1,0,-1,-2> E1 ## E0; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 1,1,-1,-2> E1 ## E1; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 1,2,-1,-2> E1 ## E2; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 1,3,-1,-2> E1 ## E3; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 2,0,-1,-2> E2 ## E0; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 2,1,-1,-2> E2 ## E1; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 2,2,-1,-2> E2 ## E2; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 2,3,-1,-2> E2 ## E3; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 3,0,-1,-2> E3 ## E0; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 3,1,-1,-2> E3 ## E1; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 3,2,-1,-2> E3 ## E2; }; \\\n\tstruct { detail::_swizzle<2,T, Q, 3,3,-1,-2> E3 ## E3; }; \n\n#define GLM_SWIZZLE4_3_MEMBERS(T, Q, E0,E1,E2,E3) \\\n\tstruct { detail::_swizzle<3, T, Q, 0,0,0,-1> E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,0,1,-1> E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,0,2,-1> E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,0,3,-1> E0 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,1,0,-1> E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,1,1,-1> E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,1,2,-1> E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,1,3,-1> E0 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,2,0,-1> E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,2,1,-1> E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,2,2,-1> E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,2,3,-1> E0 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,3,0,-1> E0 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,3,1,-1> E0 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,3,2,-1> E0 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 0,3,3,-1> E0 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,0,0,-1> E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,0,1,-1> E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,0,2,-1> E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,0,3,-1> E1 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,1,0,-1> E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,1,1,-1> E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,1,2,-1> E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,1,3,-1> E1 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,2,0,-1> E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,2,1,-1> E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,2,2,-1> E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,2,3,-1> E1 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,3,0,-1> E1 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,3,1,-1> E1 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,3,2,-1> E1 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 1,3,3,-1> E1 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,0,0,-1> E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,0,1,-1> E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,0,2,-1> E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,0,3,-1> E2 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,1,0,-1> E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,1,1,-1> E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,1,2,-1> E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,1,3,-1> E2 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,2,0,-1> E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,2,1,-1> E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,2,2,-1> E2 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,2,3,-1> E2 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,3,0,-1> E2 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,3,1,-1> E2 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,3,2,-1> E2 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 2,3,3,-1> E2 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,0,0,-1> E3 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,0,1,-1> E3 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,0,2,-1> E3 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,0,3,-1> E3 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,1,0,-1> E3 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,1,1,-1> E3 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,1,2,-1> E3 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,1,3,-1> E3 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,2,0,-1> E3 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,2,1,-1> E3 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,2,2,-1> E3 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,2,3,-1> E3 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,3,0,-1> E3 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,3,1,-1> E3 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,3,2,-1> E3 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<3, T, Q, 3,3,3,-1> E3 ## E3 ## E3; };  \n\n#define GLM_SWIZZLE4_4_MEMBERS(T, Q, E0,E1,E2,E3) \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,0,0> E0 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,0,1> E0 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,0,2> E0 ## E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,0,3> E0 ## E0 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,1,0> E0 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,1,1> E0 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,1,2> E0 ## E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,1,3> E0 ## E0 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,2,0> E0 ## E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,2,1> E0 ## E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,2,2> E0 ## E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,2,3> E0 ## E0 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,3,0> E0 ## E0 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,3,1> E0 ## E0 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,3,2> E0 ## E0 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,0,3,3> E0 ## E0 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,0,0> E0 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,0,1> E0 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,0,2> E0 ## E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,0,3> E0 ## E1 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,1,0> E0 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,1,1> E0 ## E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,1,2> E0 ## E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,1,3> E0 ## E1 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,2,0> E0 ## E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,2,1> E0 ## E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,2,2> E0 ## E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,2,3> E0 ## E1 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,3,0> E0 ## E1 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,3,1> E0 ## E1 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,3,2> E0 ## E1 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,1,3,3> E0 ## E1 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,0,0> E0 ## E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,0,1> E0 ## E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,0,2> E0 ## E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,0,3> E0 ## E2 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,1,0> E0 ## E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,1,1> E0 ## E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,1,2> E0 ## E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,1,3> E0 ## E2 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,2,0> E0 ## E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,2,1> E0 ## E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,2,2> E0 ## E2 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,2,3> E0 ## E2 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,3,0> E0 ## E2 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,3,1> E0 ## E2 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,3,2> E0 ## E2 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,2,3,3> E0 ## E2 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,0,0> E0 ## E3 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,0,1> E0 ## E3 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,0,2> E0 ## E3 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,0,3> E0 ## E3 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,1,0> E0 ## E3 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,1,1> E0 ## E3 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,1,2> E0 ## E3 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,1,3> E0 ## E3 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,2,0> E0 ## E3 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,2,1> E0 ## E3 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,2,2> E0 ## E3 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,2,3> E0 ## E3 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,3,0> E0 ## E3 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,3,1> E0 ## E3 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,3,2> E0 ## E3 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 0,3,3,3> E0 ## E3 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,0,0> E1 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,0,1> E1 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,0,2> E1 ## E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,0,3> E1 ## E0 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,1,0> E1 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,1,1> E1 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,1,2> E1 ## E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,1,3> E1 ## E0 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,2,0> E1 ## E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,2,1> E1 ## E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,2,2> E1 ## E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,2,3> E1 ## E0 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,3,0> E1 ## E0 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,3,1> E1 ## E0 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,3,2> E1 ## E0 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,0,3,3> E1 ## E0 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,0,0> E1 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,0,1> E1 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,0,2> E1 ## E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,0,3> E1 ## E1 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,1,0> E1 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,1,1> E1 ## E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,1,2> E1 ## E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,1,3> E1 ## E1 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,2,0> E1 ## E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,2,1> E1 ## E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,2,2> E1 ## E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,2,3> E1 ## E1 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,3,0> E1 ## E1 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,3,1> E1 ## E1 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,3,2> E1 ## E1 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,1,3,3> E1 ## E1 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,0,0> E1 ## E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,0,1> E1 ## E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,0,2> E1 ## E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,0,3> E1 ## E2 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,1,0> E1 ## E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,1,1> E1 ## E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,1,2> E1 ## E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,1,3> E1 ## E2 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,2,0> E1 ## E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,2,1> E1 ## E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,2,2> E1 ## E2 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,2,3> E1 ## E2 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,3,0> E1 ## E2 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,3,1> E1 ## E2 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,3,2> E1 ## E2 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,2,3,3> E1 ## E2 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,0,0> E1 ## E3 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,0,1> E1 ## E3 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,0,2> E1 ## E3 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,0,3> E1 ## E3 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,1,0> E1 ## E3 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,1,1> E1 ## E3 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,1,2> E1 ## E3 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,1,3> E1 ## E3 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,2,0> E1 ## E3 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,2,1> E1 ## E3 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,2,2> E1 ## E3 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,2,3> E1 ## E3 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,3,0> E1 ## E3 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,3,1> E1 ## E3 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,3,2> E1 ## E3 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 1,3,3,3> E1 ## E3 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,0,0> E2 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,0,1> E2 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,0,2> E2 ## E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,0,3> E2 ## E0 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,1,0> E2 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,1,1> E2 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,1,2> E2 ## E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,1,3> E2 ## E0 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,2,0> E2 ## E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,2,1> E2 ## E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,2,2> E2 ## E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,2,3> E2 ## E0 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,3,0> E2 ## E0 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,3,1> E2 ## E0 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,3,2> E2 ## E0 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,0,3,3> E2 ## E0 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,0,0> E2 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,0,1> E2 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,0,2> E2 ## E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,0,3> E2 ## E1 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,1,0> E2 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,1,1> E2 ## E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,1,2> E2 ## E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,1,3> E2 ## E1 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,2,0> E2 ## E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,2,1> E2 ## E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,2,2> E2 ## E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,2,3> E2 ## E1 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,3,0> E2 ## E1 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,3,1> E2 ## E1 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,3,2> E2 ## E1 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,1,3,3> E2 ## E1 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,0,0> E2 ## E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,0,1> E2 ## E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,0,2> E2 ## E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,0,3> E2 ## E2 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,1,0> E2 ## E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,1,1> E2 ## E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,1,2> E2 ## E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,1,3> E2 ## E2 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,2,0> E2 ## E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,2,1> E2 ## E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,2,2> E2 ## E2 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,2,3> E2 ## E2 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,3,0> E2 ## E2 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,3,1> E2 ## E2 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,3,2> E2 ## E2 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,2,3,3> E2 ## E2 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,0,0> E2 ## E3 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,0,1> E2 ## E3 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,0,2> E2 ## E3 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,0,3> E2 ## E3 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,1,0> E2 ## E3 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,1,1> E2 ## E3 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,1,2> E2 ## E3 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,1,3> E2 ## E3 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,2,0> E2 ## E3 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,2,1> E2 ## E3 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,2,2> E2 ## E3 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,2,3> E2 ## E3 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,3,0> E2 ## E3 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,3,1> E2 ## E3 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,3,2> E2 ## E3 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 2,3,3,3> E2 ## E3 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,0,0> E3 ## E0 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,0,1> E3 ## E0 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,0,2> E3 ## E0 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,0,3> E3 ## E0 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,1,0> E3 ## E0 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,1,1> E3 ## E0 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,1,2> E3 ## E0 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,1,3> E3 ## E0 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,2,0> E3 ## E0 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,2,1> E3 ## E0 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,2,2> E3 ## E0 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,2,3> E3 ## E0 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,3,0> E3 ## E0 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,3,1> E3 ## E0 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,3,2> E3 ## E0 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,0,3,3> E3 ## E0 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,0,0> E3 ## E1 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,0,1> E3 ## E1 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,0,2> E3 ## E1 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,0,3> E3 ## E1 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,1,0> E3 ## E1 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,1,1> E3 ## E1 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,1,2> E3 ## E1 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,1,3> E3 ## E1 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,2,0> E3 ## E1 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,2,1> E3 ## E1 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,2,2> E3 ## E1 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,2,3> E3 ## E1 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,3,0> E3 ## E1 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,3,1> E3 ## E1 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,3,2> E3 ## E1 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,1,3,3> E3 ## E1 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,0,0> E3 ## E2 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,0,1> E3 ## E2 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,0,2> E3 ## E2 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,0,3> E3 ## E2 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,1,0> E3 ## E2 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,1,1> E3 ## E2 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,1,2> E3 ## E2 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,1,3> E3 ## E2 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,2,0> E3 ## E2 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,2,1> E3 ## E2 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,2,2> E3 ## E2 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,2,3> E3 ## E2 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,3,0> E3 ## E2 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,3,1> E3 ## E2 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,3,2> E3 ## E2 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,2,3,3> E3 ## E2 ## E3 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,0,0> E3 ## E3 ## E0 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,0,1> E3 ## E3 ## E0 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,0,2> E3 ## E3 ## E0 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,0,3> E3 ## E3 ## E0 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,1,0> E3 ## E3 ## E1 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,1,1> E3 ## E3 ## E1 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,1,2> E3 ## E3 ## E1 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,1,3> E3 ## E3 ## E1 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,2,0> E3 ## E3 ## E2 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,2,1> E3 ## E3 ## E2 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,2,2> E3 ## E3 ## E2 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,2,3> E3 ## E3 ## E2 ## E3; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,3,0> E3 ## E3 ## E3 ## E0; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,3,1> E3 ## E3 ## E3 ## E1; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,3,2> E3 ## E3 ## E3 ## E2; }; \\\n\tstruct { detail::_swizzle<4, T, Q, 3,3,3,3> E3 ## E3 ## E3 ## E3; };\n"
  },
  {
    "path": "external/glm/glm/detail/_swizzle_func.hpp",
    "content": "/// @ref core\n/// @file glm/detail/_swizzle_func.hpp\n\n#pragma once\n\n#define GLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, CONST, A, B)\t\\\n\tvec<2, T, Q> A ## B() CONST\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\treturn vec<2, T, Q>(this->A, this->B);\t\t\t\\\n\t}\n\n#define GLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, CONST, A, B, C)\t\t\\\n\tvec<3, T, Q> A ## B ## C() CONST\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\treturn vec<3, T, Q>(this->A, this->B, this->C);\t\t\t\\\n\t}\n\n#define GLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, CONST, A, B, C, D)\t\t\t\t\t\\\n\tvec<4, T, Q> A ## B ## C ## D() CONST\t\t\t\t\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\treturn vec<4, T, Q>(this->A, this->B, this->C, this->D);\t\t\t\\\n\t}\n\n#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(T, P, L, CONST, A, B)\t\\\n\ttemplate<typename T>\t\t\t\t\t\t\t\t\t\t\\\n\tvec<L, T, Q> vec<L, T, Q>::A ## B() CONST\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\treturn vec<2, T, Q>(this->A, this->B);\t\t\t\t\t\\\n\t}\n\n#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(T, P, L, CONST, A, B, C)\t\t\\\n\ttemplate<typename T>\t\t\t\t\t\t\t\t\t\t\t\\\n\tvec<3, T, Q> vec<L, T, Q>::A ## B ## C() CONST\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\treturn vec<3, T, Q>(this->A, this->B, this->C);\t\t\t\t\\\n\t}\n\n#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(T, P, L, CONST, A, B, C, D)\t\t\\\n\ttemplate<typename T>\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tvec<4, T, Q> vec<L, T, Q>::A ## B ## C ## D() CONST\t\t\t\t\t\\\n\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\treturn vec<4, T, Q>(this->A, this->B, this->C, this->D);\t\t\\\n\t}\n\n#define GLM_MUTABLE\n\n#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, 2, GLM_MUTABLE, B, A)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(T, P) \\\n\tGLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, x, y) \\\n\tGLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, r, g) \\\n\tGLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(T, P, s, t)\n\n#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B)\n\n#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, GLM_MUTABLE, C, B, A)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(T, P, A, B, C)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, P) \\\n\tGLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, x, y, z) \\\n\tGLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, r, g, b) \\\n\tGLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, P, s, t, p)\n\n#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, GLM_MUTABLE, D, C)\n\n#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , A, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , B, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , C, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, , D, C, B)\n\n#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, C, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, D, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, C, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, D, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , B, A, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, B, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, D, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , C, A, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, , D, B, C, A)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(T, P) \\\n\tGLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, x, y, z, w) \\\n\tGLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, r, g, b, a) \\\n\tGLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, P, s, t, p, q)\n\n#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B)\n\n#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B)\n\n#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(T, P, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(T, P, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(T, P, A, B)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P)\t\t\t\\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, x, y)\t\\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, r, g)\t\\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(T, P, s, t)\n\n#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C)\n\n#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C)\n\n#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(T, P, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(T, P, A, B, C)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P) \\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, x, y, z) \\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, r, g, b) \\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, P, s, t, p)\n\n#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC2_ENTRY(T, P, const, D, D)\n\n#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, A, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, B, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, C, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC3_ENTRY(T, P, const, D, D, D)\n\n#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, A, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, B, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, C, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, A, D, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, A, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, B, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, C, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, B, D, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, A, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, B, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, C, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, C, D, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, A, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, B, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, C, D, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, A, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, B, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, A) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, B) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, C) \\\n\tGLM_SWIZZLE_GEN_VEC4_ENTRY(T, P, const, D, D, D, D)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(T, P, A, B, C, D) \\\n\tGLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(T, P, A, B, C, D)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P) \\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, x, y, z, w) \\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, r, g, b, a) \\\n\tGLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, P, s, t, p, q)\n\n"
  },
  {
    "path": "external/glm/glm/detail/_vectorize.hpp",
    "content": "/// @ref core\n/// @file glm/detail/_vectorize.hpp\n\n#pragma once\n\n#include \"type_vec1.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename R, typename T, qualifier Q>\n\tstruct functor1{};\n\n\ttemplate<typename R, typename T, qualifier Q>\n\tstruct functor1<1, R, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<1, R, Q> call(R (*Func) (T x), vec<1, T, Q> const& v)\n\t\t{\n\t\t\treturn vec<1, R, Q>(Func(v.x));\n\t\t}\n\t};\n\n\ttemplate<typename R, typename T, qualifier Q>\n\tstruct functor1<2, R, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<2, R, Q> call(R (*Func) (T x), vec<2, T, Q> const& v)\n\t\t{\n\t\t\treturn vec<2, R, Q>(Func(v.x), Func(v.y));\n\t\t}\n\t};\n\n\ttemplate<typename R, typename T, qualifier Q>\n\tstruct functor1<3, R, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<3, R, Q> call(R (*Func) (T x), vec<3, T, Q> const& v)\n\t\t{\n\t\t\treturn vec<3, R, Q>(Func(v.x), Func(v.y), Func(v.z));\n\t\t}\n\t};\n\n\ttemplate<typename R, typename T, qualifier Q>\n\tstruct functor1<4, R, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, R, Q> call(R (*Func) (T x), vec<4, T, Q> const& v)\n\t\t{\n\t\t\treturn vec<4, R, Q>(Func(v.x), Func(v.y), Func(v.z), Func(v.w));\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct functor2{};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct functor2<1, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, vec<1, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<1, T, Q>(Func(a.x, b.x));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct functor2<2, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, vec<2, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<2, T, Q>(Func(a.x, b.x), Func(a.y, b.y));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct functor2<3, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, vec<3, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<3, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct functor2<4, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w));\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct functor2_vec_sca{};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct functor2_vec_sca<1, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, T b)\n\t\t{\n\t\t\treturn vec<1, T, Q>(Func(a.x, b));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct functor2_vec_sca<2, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, T b)\n\t\t{\n\t\t\treturn vec<2, T, Q>(Func(a.x, b), Func(a.y, b));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct functor2_vec_sca<3, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, T b)\n\t\t{\n\t\t\treturn vec<3, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct functor2_vec_sca<4, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, T b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b));\n\t\t}\n\t};\n}//namespace detail\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/compute_vector_relational.hpp",
    "content": "#pragma once\n\n#include \"setup.hpp\"\n#include <cstring>\n#include <limits>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate <typename T, bool isFloat = std::numeric_limits<T>::is_iec559>\n\tstruct compute_equal\n\t{\n\t\tGLM_FUNC_QUALIFIER static bool call(T a, T b)\n\t\t{\n\t\t\treturn a == b;\n\t\t}\n\t};\n\n\ttemplate <typename T>\n\tstruct compute_equal<T, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static bool call(T a, T b)\n\t\t{\n\t\t\treturn std::memcmp(&a, &b, sizeof(T)) == 0;\n\t\t}\n\t};\n}//namespace detail\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/dummy.cpp",
    "content": "/// @ref core\n/// @file glm/core/dummy.cpp\n///\n/// GLM is a header only library. There is nothing to compile. \n/// dummy.cpp exist only a wordaround for CMake file.\n\n/*\n#define GLM_MESSAGES\n#include <glm/glm.hpp>\n#include <glm/ext.hpp>\n#include <limits>\n\nstruct material\n{\n\tglm::vec4 emission; // Ecm\n\tglm::vec4 ambient; // Acm\n\tglm::vec4 diffuse; // Dcm\n\tglm::vec4 specular; // Scm\n\tfloat shininess; // Srm\n};\n\nstruct light\n{\n\tglm::vec4 ambient; // Acli\n\tglm::vec4 diffuse; // Dcli\n\tglm::vec4 specular; // Scli\n\tglm::vec4 position; // Ppli\n\tglm::vec4 halfVector; // Derived: Hi\n\tglm::vec3 spotDirection; // Sdli\n\tfloat spotExponent; // Srli\n\tfloat spotCutoff; // Crli\n\t// (range: [0.0,90.0], 180.0)\n\tfloat spotCosCutoff; // Derived: cos(Crli)\n\t// (range: [1.0,0.0],-1.0)\n\tfloat constantAttenuation; // K0\n\tfloat linearAttenuation; // K1\n\tfloat quadraticAttenuation;// K2\n};\n\n\n// Sample 1\n#include <glm/vec3.hpp>// glm::vec3\n#include <glm/geometric.hpp>// glm::cross, glm::normalize\n\nglm::vec3 computeNormal\n(\n\tglm::vec3 const& a,\n\tglm::vec3 const& b,\n\tglm::vec3 const& c\n)\n{\n\treturn glm::normalize(glm::cross(c - a, b - a));\n}\n\ntypedef unsigned int GLuint;\n#define GL_FALSE 0\nvoid glUniformMatrix4fv(GLuint, int, int, float*){}\n\n// Sample 2\n#include <glm/vec3.hpp> // glm::vec3\n#include <glm/vec4.hpp> // glm::vec4, glm::ivec4\n#include <glm/mat4x4.hpp> // glm::mat4\n#include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective\n#include <glm/gtc/type_ptr.hpp> // glm::value_ptr\nvoid func(GLuint LocationMVP, float Translate, glm::vec2 const& Rotate)\n{\n\tglm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);\n\tglm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate));\n\tglm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f));\n\tglm::mat4 View = glm::rotate(ViewRotateX, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f));\n\tglm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));\n\tglm::mat4 MVP = Projection * View * Model;\n\tglUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP));\n}\n\n// Sample 3\n#include <glm/vec2.hpp>// glm::vec2\n#include <glm/packing.hpp>// glm::packUnorm2x16\n#include <glm/integer.hpp>// glm::uint\n#include <glm/gtc/type_precision.hpp>// glm::i8vec2, glm::i32vec2\nstd::size_t const VertexCount = 4;\n// Float quad geometry\nstd::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2);\nglm::vec2 const PositionDataF32[VertexCount] =\n{\n\tglm::vec2(-1.0f,-1.0f),\n\tglm::vec2( 1.0f,-1.0f),\n\tglm::vec2( 1.0f, 1.0f),\n\tglm::vec2(-1.0f, 1.0f)\n\t};\n// Half-float quad geometry\nstd::size_t const PositionSizeF16 = VertexCount * sizeof(glm::uint);\nglm::uint const PositionDataF16[VertexCount] =\n{\n\tglm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, -1.0f))),\n\tglm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, -1.0f))),\n\tglm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, 1.0f))),\n\tglm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, 1.0f)))\n};\n// 8 bits signed integer quad geometry\nstd::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2);\nglm::i8vec2 const PositionDataI8[VertexCount] =\n{\n\tglm::i8vec2(-1,-1),\n\tglm::i8vec2( 1,-1),\n\tglm::i8vec2( 1, 1),\n\tglm::i8vec2(-1, 1)\n};\n// 32 bits signed integer quad geometry\nstd::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2);\nglm::i32vec2 const PositionDataI32[VertexCount] =\n{\n\tglm::i32vec2 (-1,-1),\n\tglm::i32vec2 ( 1,-1),\n\tglm::i32vec2 ( 1, 1),\n\tglm::i32vec2 (-1, 1)\n};\n\nstruct intersection\n{\n\tglm::vec4 position;\n\tglm::vec3 normal;\n};\n*/\n\n\n/*\n// Sample 4\n#include <glm/vec3.hpp>// glm::vec3\n#include <glm/geometric.hpp>// glm::normalize, glm::dot, glm::reflect\n#include <glm/exponential.hpp>// glm::pow\n#include <glm/gtc/random.hpp>// glm::vecRand3\nglm::vec3 lighting\n(\n\tintersection const& Intersection,\n\tmaterial const& Material,\n\tlight const& Light,\n\tglm::vec3 const& View\n)\n{\n\tglm::vec3 Color(0.0f);\n\tglm::vec3 LightVertor(glm::normalize(\n\t\tLight.position - Intersection.position +\n\t\tglm::vecRand3(0.0f, Light.inaccuracy));\n\n\tif(!shadow(Intersection.position, Light.position, LightVertor))\n\t{\n\t\tfloat Diffuse = glm::dot(Intersection.normal, LightVector);\n\t\tif(Diffuse <= 0.0f)\n\t\t\treturn Color;\n\t\tif(Material.isDiffuse())\n\t\t\tColor += Light.color() * Material.diffuse * Diffuse;\n\t\tif(Material.isSpecular())\n\t\t{\n\t\t\tglm::vec3 Reflect(glm::reflect(\n\t\t\t\tglm::normalize(-LightVector),\n\t\t\t\tglm::normalize(Intersection.normal)));\n\t\t\tfloat Dot = glm::dot(Reflect, View);\n\t\t\tfloat Base = Dot > 0.0f ? Dot : 0.0f;\n\t\t\tfloat Specular = glm::pow(Base, Material.exponent);\n\t\t\tColor += Material.specular * Specular;\n\t\t}\n\t}\n\treturn Color;\n}\n*/\n\nint main()\n{\n/*\n\tglm::vec1 o(1);\n\tglm::vec2 a(1);\n\tglm::vec3 b(1);\n\tglm::vec4 c(1);\n\n\tglm::quat q;\n\tglm::dualquat p;\n\n\tglm::mat4 m(1);\n\n\tfloat a0 = normalizeDotA(a, a);\n\tfloat b0 = normalizeDotB(b, b);\n\tfloat c0 = normalizeDotC(c, c);\n*/\n\treturn 0;\n}\n"
  },
  {
    "path": "external/glm/glm/detail/func_common.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_common.inl\n\n#include \"../vector_relational.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n#include \"_vectorize.hpp\"\n#include <limits>\n\nnamespace glm\n{\n\t// min\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType min(genType x, genType y)\n\t{\n\t\tGLM_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\");\n\t\treturn (y < x) ? y : x;\n\t}\n\n\t// max\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType max(genType x, genType y)\n\t{\n\t\tGLM_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\");\n\n\t\treturn (x < y) ? y : x;\n\t}\n\n\t// abs\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER int32 abs(int32 x)\n\t{\n\t\tint32 const y = x >> 31;\n\t\treturn (x ^ y) - y;\n\t}\n\n\t// round\n#\tif GLM_HAS_CXX11_STL\n\t\tusing ::std::round;\n#\telse\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER genType round(genType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'round' only accept floating-point inputs\");\n\n\t\t\treturn 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)));\n\t\t}\n#\tendif\n\n\t// trunc\n#\tif GLM_HAS_CXX11_STL\n\t\tusing ::std::trunc;\n#\telse\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER genType trunc(genType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'trunc' only accept floating-point inputs\");\n\n\t\t\treturn x < static_cast<genType>(0) ? -std::floor(-x) : std::floor(x);\n\t\t}\n#\tendif\n\n}//namespace glm\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<typename genFIType, bool /*signed*/>\n\tstruct compute_abs\n\t{};\n\n\ttemplate<typename genFIType>\n\tstruct compute_abs<genFIType, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static genFIType call(genFIType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(\n\t\t\t\tstd::numeric_limits<genFIType>::is_iec559 || std::numeric_limits<genFIType>::is_signed || GLM_UNRESTRICTED_GENTYPE,\n\t\t\t\t\"'abs' only accept floating-point and integer scalar or vector inputs\");\n\n\t\t\treturn x >= genFIType(0) ? x : -x;\n\t\t\t// TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff;\n\t\t}\n\t};\n\n\t#if GLM_COMPILER & GLM_COMPILER_CUDA\n\ttemplate<>\n\tstruct compute_abs<float, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static float call(float x)\n\t\t{\n\t\t\treturn fabsf(x);\n\t\t}\n\t};\n\t#endif\n\n\ttemplate<typename genFIType>\n\tstruct compute_abs<genFIType, false>\n\t{\n\t\tGLM_FUNC_QUALIFIER static genFIType call(genFIType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(\n\t\t\t\t(!std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer) || GLM_UNRESTRICTED_GENTYPE,\n\t\t\t\t\"'abs' only accept floating-point and integer scalar or vector inputs\");\n\t\t\treturn x;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_abs_vector\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn detail::functor1<L, T, T, Q>::call(abs, x);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, typename U, qualifier Q, bool Aligned>\n\tstruct compute_mix_vector\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, U, Q> const& a)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'mix' only accept floating-point inputs for the interpolator a\");\n\n\t\t\treturn vec<L, T, Q>(vec<L, U, Q>(x) + a * vec<L, U, Q>(y - x));\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_mix_vector<L, T, bool, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, bool, Q> const& a)\n\t\t{\n\t\t\tvec<L, T, Q> Result;\n\t\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\t\tResult[i] = a[i] ? y[i] : x[i];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, typename U, qualifier Q, bool Aligned>\n\tstruct compute_mix_scalar\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y, U const& a)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'mix' only accept floating-point inputs for the interpolator a\");\n\n\t\t\treturn vec<L, T, Q>(vec<L, U, Q>(x) + a * vec<L, U, Q>(y - x));\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_mix_scalar<L, T, bool, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y, bool const& a)\n\t\t{\n\t\t\treturn a ? y : x;\n\t\t}\n\t};\n\n\ttemplate<typename T, typename U>\n\tstruct compute_mix\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(T const& x, T const& y, U const& a)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<U>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'mix' only accept floating-point inputs for the interpolator a\");\n\n\t\t\treturn static_cast<T>(static_cast<U>(x) + a * static_cast<U>(y - x));\n\t\t}\n\t};\n\n\ttemplate<typename T>\n\tstruct compute_mix<T, bool>\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(T const& x, T const& y, bool const& a)\n\t\t{\n\t\t\treturn a ? y : x;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool isFloat, bool Aligned>\n\tstruct compute_sign\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn vec<L, T, Q>(glm::lessThan(vec<L, T, Q>(0), x)) - vec<L, T, Q>(glm::lessThan(x, vec<L, T, Q>(0)));\n\t\t}\n\t};\n\n#\tif GLM_ARCH == GLM_ARCH_X86\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_sign<L, T, Q, false, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\tT const Shift(static_cast<T>(sizeof(T) * 8 - 1));\n\t\t\tvec<L, T, Q> const y(vec<L, typename make_unsigned<T>::type, Q>(-x) >> typename make_unsigned<T>::type(Shift));\n\n\t\t\treturn (x >> Shift) | y;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_floor\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn detail::functor1<L, T, T, Q>::call(std::floor, x);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_ceil\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn detail::functor1<L, T, T, Q>::call(std::ceil, x);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_fract\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn x - floor(x);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_trunc\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn detail::functor1<L, T, T, Q>::call(trunc, x);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_round\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn detail::functor1<L, T, T, Q>::call(round, x);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_mod\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'mod' only accept floating-point inputs. Include <glm/gtc/integer.hpp> for integer inputs.\");\n\t\t\treturn a - b * floor(a / b);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_min_vector\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t\t{\n\t\t\treturn detail::functor2<L, T, Q>::call(min, x, y);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_max_vector\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t\t{\n\t\t\treturn detail::functor2<L, T, Q>::call(max, x, y);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_clamp_vector\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal)\n\t\t{\n\t\t\treturn min(max(x, minVal), maxVal);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_step_vector\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& edge, vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn mix(vec<L, T, Q>(1), vec<L, T, Q>(0), glm::lessThan(x, edge));\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_smoothstep_vector\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& edge0, vec<L, T, Q> const& edge1, vec<L, T, Q> const& x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'step' only accept floating-point inputs\");\n\t\t\tvec<L, T, Q> const tmp(clamp((x - edge0) / (edge1 - edge0), static_cast<T>(0), static_cast<T>(1)));\n\t\t\treturn tmp * tmp * (static_cast<T>(3) - static_cast<T>(2) * tmp);\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<typename genFIType>\n\tGLM_FUNC_QUALIFIER genFIType abs(genFIType x)\n\t{\n\t\treturn detail::compute_abs<genFIType, std::numeric_limits<genFIType>::is_signed>::call(x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> abs(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::compute_abs_vector<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\t// sign\n\t// fast and works for any type\n\ttemplate<typename genFIType> \n\tGLM_FUNC_QUALIFIER genFIType sign(genFIType x)\n\t{\n\t\tGLM_STATIC_ASSERT(\n\t\t\tstd::numeric_limits<genFIType>::is_iec559 || (std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer),\n\t\t\t\"'sign' only accept signed inputs\");\n\t\t\n\t\treturn detail::compute_sign<1, genFIType, defaultp, std::numeric_limits<genFIType>::is_iec559, highp>::call(vec<1, genFIType>(x)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> sign(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(\n\t\t\tstd::numeric_limits<T>::is_iec559 || (std::numeric_limits<T>::is_signed && std::numeric_limits<T>::is_integer),\n\t\t\t\"'sign' only accept signed inputs\");\n\n\t\treturn detail::compute_sign<L, T, Q, std::numeric_limits<T>::is_iec559, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\t// floor\n\tusing ::std::floor;\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> floor(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'floor' only accept floating-point inputs.\");\n\t\treturn detail::compute_floor<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> trunc(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'trunc' only accept floating-point inputs\");\n\t\treturn detail::compute_trunc<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> round(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'round' only accept floating-point inputs\");\n\t\treturn detail::compute_round<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n/*\n\t// roundEven\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType roundEven(genType const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'roundEven' only accept floating-point inputs\");\n\n\t\treturn genType(int(x + genType(int(x) % 2)));\n\t}\n*/\n\n\t// roundEven\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType roundEven(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'roundEven' only accept floating-point inputs\");\n\t\t\n\t\tint Integer = static_cast<int>(x);\n\t\tgenType IntegerPart = static_cast<genType>(Integer);\n\t\tgenType FractionalPart = fract(x);\n\n\t\tif(FractionalPart > static_cast<genType>(0.5) || FractionalPart < static_cast<genType>(0.5))\n\t\t{\n\t\t\treturn round(x);\n\t\t}\n\t\telse if((Integer % 2) == 0)\n\t\t{\n\t\t\treturn IntegerPart;\n\t\t}\n\t\telse if(x <= static_cast<genType>(0)) // Work around... \n\t\t{\n\t\t\treturn IntegerPart - static_cast<genType>(1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn IntegerPart + static_cast<genType>(1);\n\t\t}\n\t\t//else // Bug on MinGW 4.5.2\n\t\t//{\n\t\t//\treturn mix(IntegerPart + genType(-1), IntegerPart + genType(1), x <= genType(0));\n\t\t//}\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> roundEven(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'roundEven' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(roundEven, x);\n\t}\n\n\t// ceil\n\tusing ::std::ceil;\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> ceil(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'ceil' only accept floating-point inputs\");\n\t\treturn detail::compute_ceil<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\t// fract\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fract(genType x)\n\t{\n\t\treturn fract(vec<1, genType>(x)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fract(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'fract' only accept floating-point inputs\");\n\t\treturn detail::compute_fract<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\t// mod\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType mod(genType x, genType y)\n\t{\n#\t\tif GLM_COMPILER & GLM_COMPILER_CUDA\n\t\t\t// Another Cuda compiler bug https://github.com/g-truc/glm/issues/530\n\t\t\tvec<1, genType, defaultp> Result(mod(vec<1, genType, defaultp>(x), y));\n\t\t\treturn Result.x;\n#\t\telse\n\t\t\treturn mod(vec<1, genType, defaultp>(x), y).x;\n#\t\tendif\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> mod(vec<L, T, Q> const& x, T y)\n\t{\n\t\treturn detail::compute_mod<L, T, Q, detail::is_aligned<Q>::value>::call(x, vec<L, T, Q>(y));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> mod(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\treturn detail::compute_mod<L, T, Q, detail::is_aligned<Q>::value>::call(x, y);\n\t}\n\n\t// modf\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType modf(genType x, genType & i)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'modf' only accept floating-point inputs\");\n\t\treturn std::modf(x, &i);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> modf(vec<1, T, Q> const& x, vec<1, T, Q> & i)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tmodf(x.x, i.x));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> modf(vec<2, T, Q> const& x, vec<2, T, Q> & i)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tmodf(x.x, i.x),\n\t\t\tmodf(x.y, i.y));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> modf(vec<3, T, Q> const& x, vec<3, T, Q> & i)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tmodf(x.x, i.x),\n\t\t\tmodf(x.y, i.y),\n\t\t\tmodf(x.z, i.z));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> modf(vec<4, T, Q> const& x, vec<4, T, Q> & i)\n\t{\n\t\treturn vec<4, T, Q>(\n\t\t\tmodf(x.x, i.x),\n\t\t\tmodf(x.y, i.y),\n\t\t\tmodf(x.z, i.z),\n\t\t\tmodf(x.w, i.w));\n\t}\n\n\t//// Only valid if (INT_MIN <= x-y <= INT_MAX)\n\t//// min(x,y)\n\t//r = y + ((x - y) & ((x - y) >> (sizeof(int) *\n\t//CHAR_BIT - 1)));\n\t//// max(x,y)\n\t//r = x - ((x - y) & ((x - y) >> (sizeof(int) *\n\t//CHAR_BIT - 1)));\n\n\t// min\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> min(vec<L, T, Q> const& a, T b)\n\t{\n\t\tGLM_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\");\n\t\treturn detail::compute_min_vector<L, T, Q, detail::is_aligned<Q>::value>::call(a, vec<L, T, Q>(b));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> min(vec<L, T, Q> const& a, vec<L, T, Q> const& b)\n\t{\n\t\treturn detail::compute_min_vector<L, T, Q, detail::is_aligned<Q>::value>::call(a, b);\n\t}\n\n\t// max\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> max(vec<L, T, Q> const& a, T b)\n\t{\n\t\tGLM_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\");\n\t\treturn detail::compute_max_vector<L, T, Q, detail::is_aligned<Q>::value>::call(a, vec<L, T, Q>(b));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> max(vec<L, T, Q> const& a, vec<L, T, Q> const& b)\n\t{\n\t\treturn detail::compute_max_vector<L, T, Q, detail::is_aligned<Q>::value>::call(a, b);\n\t}\n\n\t// clamp\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType clamp(genType x, genType minVal, genType maxVal)\n\t{\n\t\tGLM_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\");\n\t\treturn min(max(x, minVal), maxVal);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> clamp(vec<L, T, Q> const& x, T minVal, T maxVal)\n\t{\n\t\tGLM_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\");\n\t\treturn detail::compute_clamp_vector<L, T, Q, detail::is_aligned<Q>::value>::call(x, vec<L, T, Q>(minVal), vec<L, T, Q>(maxVal));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> clamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal)\n\t{\n\t\tGLM_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\");\n\t\treturn detail::compute_clamp_vector<L, T, Q, detail::is_aligned<Q>::value>::call(x, minVal, maxVal);\n\t}\n\n\ttemplate<typename genTypeT, typename genTypeU>\n\tGLM_FUNC_QUALIFIER genTypeT mix(genTypeT x, genTypeT y, genTypeU a)\n\t{\n\t\treturn detail::compute_mix<genTypeT, genTypeU>::call(x, y, a);\n\t}\n\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> mix(vec<L, T, Q> const& x, vec<L, T, Q> const& y, U a)\n\t{\n\t\treturn detail::compute_mix_scalar<L, T, U, Q, detail::is_aligned<Q>::value>::call(x, y, a);\n\t}\n\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> mix(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, U, Q> const& a)\n\t{\n\t\treturn detail::compute_mix_vector<L, T, U, Q, detail::is_aligned<Q>::value>::call(x, y, a);\n\t}\n\n\t// step\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType step(genType edge, genType x)\n\t{\n\t\treturn mix(static_cast<genType>(1), static_cast<genType>(0), x < edge);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> step(T edge, vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::compute_step_vector<L, T, Q, detail::is_aligned<Q>::value>::call(vec<L, T, Q>(edge), x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> step(vec<L, T, Q> const& edge, vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::compute_step_vector<L, T, Q, detail::is_aligned<Q>::value>::call(edge, x);\n\t}\n\n\t// smoothstep\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType smoothstep(genType edge0, genType edge1, genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'smoothstep' only accept floating-point inputs\");\n\n\t\tgenType const tmp(clamp((x - edge0) / (edge1 - edge0), genType(0), genType(1)));\n\t\treturn tmp * tmp * (genType(3) - genType(2) * tmp);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> smoothstep(T edge0, T edge1, vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::compute_smoothstep_vector<L, T, Q, detail::is_aligned<Q>::value>::call(vec<L, T, Q>(edge0), vec<L, T, Q>(edge1), x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> smoothstep(vec<L, T, Q> const& edge0, vec<L, T, Q> const& edge1, vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::compute_smoothstep_vector<L, T, Q, detail::is_aligned<Q>::value>::call(edge0, edge1, x);\n\t}\n\n#\tif GLM_HAS_CXX11_STL\n\t\tusing std::isnan;\n#\telse\n\t\ttemplate<typename genType> \n\t\tGLM_FUNC_QUALIFIER bool isnan(genType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'isnan' only accept floating-point inputs\");\n\n#\t\t\tif GLM_HAS_CXX11_STL\n\t\t\t\treturn std::isnan(x);\n#\t\t\telif GLM_COMPILER & GLM_COMPILER_VC\n\t\t\t\treturn _isnan(x) != 0;\n#\t\t\telif GLM_COMPILER & GLM_COMPILER_INTEL\n#\t\t\t\tif GLM_PLATFORM & GLM_PLATFORM_WINDOWS\n\t\t\t\t\treturn _isnan(x) != 0;\n#\t\t\t\telse\n\t\t\t\t\treturn ::isnan(x) != 0;\n#\t\t\t\tendif\n#\t\t\telif (GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)) && (GLM_PLATFORM & GLM_PLATFORM_ANDROID) && __cplusplus < 201103L\n\t\t\t\treturn _isnan(x) != 0;\n#\t\t\telif GLM_COMPILER & GLM_COMPILER_CUDA\n\t\t\t\treturn isnan(x) != 0;\n#\t\t\telse\n\t\t\t\treturn std::isnan(x);\n#\t\t\tendif\n\t\t}\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> isnan(vec<L, T, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isnan' only accept floating-point inputs\");\n\n\t\tvec<L, bool, Q> Result;\n\t\tfor (length_t l = 0; l < v.length(); ++l)\n\t\t\tResult[l] = glm::isnan(v[l]);\n\t\treturn Result;\n\t}\n\n#\tif GLM_HAS_CXX11_STL\n\t\tusing std::isinf;\n#\telse\n\t\ttemplate<typename genType> \n\t\tGLM_FUNC_QUALIFIER bool isinf(genType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'isinf' only accept floating-point inputs\");\n\n#\t\t\tif GLM_HAS_CXX11_STL\n\t\t\t\treturn std::isinf(x);\n#\t\t\telif GLM_COMPILER & (GLM_COMPILER_INTEL | GLM_COMPILER_VC)\n#\t\t\t\tif(GLM_PLATFORM & GLM_PLATFORM_WINDOWS)\n\t\t\t\t\treturn _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF;\n#\t\t\t\telse\n\t\t\t\t\treturn ::isinf(x);\n#\t\t\t\tendif\n#\t\t\telif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)\n#\t\t\t\tif(GLM_PLATFORM & GLM_PLATFORM_ANDROID && __cplusplus < 201103L)\n\t\t\t\t\treturn _isinf(x) != 0;\n#\t\t\t\telse\n\t\t\t\t\treturn std::isinf(x);\n#\t\t\t\tendif\n#\t\t\telif GLM_COMPILER & GLM_COMPILER_CUDA\n\t\t\t\t// http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__MATH__DOUBLE_g13431dd2b40b51f9139cbb7f50c18fab.html#g13431dd2b40b51f9139cbb7f50c18fab\n\t\t\t\treturn isinf(double(x)) != 0;\n#\t\t\telse\n\t\t\t\treturn std::isinf(x);\n#\t\t\tendif\n\t}\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> isinf(vec<L, T, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isinf' only accept floating-point inputs\");\n\n\t\tvec<L, bool, Q> Result;\n\t\tfor (length_t l = 0; l < v.length(); ++l)\n\t\t\tResult[l] = glm::isinf(v[l]);\n\t\treturn Result;\n\t}\n\n\tGLM_FUNC_QUALIFIER int floatBitsToInt(float const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tfloat in;\n\t\t\tint out;\n\t\t} u;\n\n\t\tu.in = v;\n\n\t\treturn u.out;\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, int, Q> floatBitsToInt(vec<L, float, Q> const& v)\n\t{\n\t\treturn reinterpret_cast<vec<L, int, Q>&>(const_cast<vec<L, float, Q>&>(v));\n\t}\n\n\tGLM_FUNC_QUALIFIER uint floatBitsToUint(float const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tfloat in;\n\t\t\tuint out;\n\t\t} u;\n\n\t\tu.in = v;\n\n\t\treturn u.out;\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, uint, Q> floatBitsToUint(vec<L, float, Q> const& v)\n\t{\n\t\treturn reinterpret_cast<vec<L, uint, Q>&>(const_cast<vec<L, float, Q>&>(v));\n\t}\n\n\tGLM_FUNC_QUALIFIER float intBitsToFloat(int const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tint in;\n\t\t\tfloat out;\n\t\t} u;\n\n\t\tu.in = v;\n\n\t\treturn u.out;\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, float, Q> intBitsToFloat(vec<L, int, Q> const& v)\n\t{\n\t\treturn reinterpret_cast<vec<L, float, Q>&>(const_cast<vec<L, int, Q>&>(v));\n\t}\n\n\tGLM_FUNC_QUALIFIER float uintBitsToFloat(uint const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tuint in;\n\t\t\tfloat out;\n\t\t} u;\n\n\t\tu.in = v;\n\n\t\treturn u.out;\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, float, Q> uintBitsToFloat(vec<L, uint, Q> const& v)\n\t{\n\t\treturn reinterpret_cast<vec<L, float, Q>&>(const_cast<vec<L, uint, Q>&>(v));\n\t}\n\t\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fma(genType const& a, genType const& b, genType const& c)\n\t{\n\t\treturn a * b + c;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType frexp(genType x, int& exp)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'frexp' only accept floating-point inputs\");\n\n\t\treturn std::frexp(x, &exp);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> frexp(vec<L, T, Q> const& v, vec<L, int, Q>& exp)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'frexp' only accept floating-point inputs\");\n\n\t\tvec<L, T, Q> Result;\n\t\tfor (length_t l = 0; l < v.length(); ++l)\n\t\t\tResult[l] = std::frexp(v[l], &exp[l]);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType ldexp(genType const& x, int const& exp)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'ldexp' only accept floating-point inputs\");\n\n\t\treturn std::ldexp(x, exp);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> ldexp(vec<L, T, Q> const& v, vec<L, int, Q> const& exp)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'ldexp' only accept floating-point inputs\");\n\n\t\tvec<L, T, Q> Result;\n\t\tfor (length_t l = 0; l < v.length(); ++l)\n\t\t\tResult[l] = std::ldexp(v[l], exp[l]);\n\t\treturn Result;\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS\n#\tinclude \"func_common_simd.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/func_common_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_common_simd.inl\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n#include \"../simd/common.h\"\n\n#include <immintrin.h>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<qualifier Q>\n\tstruct compute_abs_vector<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = glm_vec4_abs(v.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_abs_vector<4, int, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v)\n\t\t{\n\t\t\tvec<4, int, Q> result;\n\t\t\tresult.data = glm_ivec4_abs(v.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_floor<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = glm_vec4_floor(v.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_ceil<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = glm_vec4_ceil(v.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_fract<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = glm_vec4_fract(v.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_round<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = glm_vec4_round(v.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_mod<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = glm_vec4_mod(x.data, y.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_min_vector<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = _mm_min_ps(v1.data, v2.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_min_vector<4, int32, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, int32, Q> call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2)\n\t\t{\n\t\t\tvec<4, int32, Q> result;\n\t\t\tresult.data = _mm_min_epi32(v1.data, v2.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_min_vector<4, uint32, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, int32, Q> call(vec<4, uint32, Q> const& v1, vec<4, uint32, Q> const& v2)\n\t\t{\n\t\t\tvec<4, uint32, Q> result;\n\t\t\tresult.data = _mm_min_epu32(v1.data, v2.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_max_vector<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = _mm_max_ps(v1.data, v2.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_max_vector<4, int32, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, int32, Q> call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2)\n\t\t{\n\t\t\tvec<4, int32, Q> result;\n\t\t\tresult.data = _mm_max_epi32(v1.data, v2.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_max_vector<4, uint32, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, uint32, Q> call(vec<4, uint32, Q> const& v1, vec<4, uint32, Q> const& v2)\n\t\t{\n\t\t\tvec<4, uint32, Q> result;\n\t\t\tresult.data = _mm_max_epu32(v1.data, v2.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_clamp_vector<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& minVal, vec<4, float, Q> const& maxVal)\n\t\t{\n\t\t\tvec<4, float, Q> result;\n\t\t\tresult.data = _mm_min_ps(_mm_max_ps(x.data, minVal.data), maxVal.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_clamp_vector<4, int32, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, int32, Q> call(vec<4, int32, Q> const& x, vec<4, int32, Q> const& minVal, vec<4, int32, Q> const& maxVal)\n\t\t{\n\t\t\tvec<4, int32, Q> result;\n\t\t\tresult.data = _mm_min_epi32(_mm_max_epi32(x.data, minVal.data), maxVal.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_clamp_vector<4, uint32, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, uint32, Q> call(vec<4, uint32, Q> const& x, vec<4, uint32, Q> const& minVal, vec<4, uint32, Q> const& maxVal)\n\t\t{\n\t\t\tvec<4, uint32, Q> result;\n\t\t\tresult.data = _mm_min_epu32(_mm_max_epu32(x.data, minVal.data), maxVal.data);\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_mix_vector<4, float, bool, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y, vec<4, bool, Q> const& a)\n\t\t{\n\t\t\t__m128i const Load = _mm_set_epi32(-static_cast<int>(a.w), -static_cast<int>(a.z), -static_cast<int>(a.y), -static_cast<int>(a.x));\n\t\t\t__m128 const Mask = _mm_castsi128_ps(Load);\n\n\t\t\tvec<4, float, Q> Result;\n#\t\t\tif 0 && GLM_ARCH & GLM_ARCH_AVX\n\t\t\t\tResult.data = _mm_blendv_ps(x.data, y.data, Mask);\n#\t\t\telse\n\t\t\t\tResult.data = _mm_or_ps(_mm_and_ps(Mask, y.data), _mm_andnot_ps(Mask, x.data));\n#\t\t\tendif\n\t\t\treturn Result;\n\t\t}\n\t};\n/* FIXME\n\ttemplate<qualifier Q>\n\tstruct compute_step_vector<float, Q, tvec4>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge, vec<4, float, Q> const& x)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tresult.data = glm_vec4_step(edge.data, x.data);\n\t\t\treturn result;\n\t\t}\n\t};\n*/\n\ttemplate<qualifier Q>\n\tstruct compute_smoothstep_vector<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge0, vec<4, float, Q> const& edge1, vec<4, float, Q> const& x)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = glm_vec4_smoothstep(edge0.data, edge1.data, x.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n}//namespace detail\n}//namespace glm\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/detail/func_exponential.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_exponential.inl\n\n#include \"../vector_relational.hpp\"\n#include \"_vectorize.hpp\"\n#include <limits>\n#include <cmath>\n#include <cassert>\n\nnamespace glm{\nnamespace detail\n{\n#\tif GLM_HAS_CXX11_STL\n\t\tusing std::log2;\n#\telse\n\t\ttemplate<typename genType>\n\t\tgenType log2(genType Value)\n\t\t{\n\t\t\treturn std::log(Value) * static_cast<genType>(1.4426950408889634073599246810019);\n\t\t}\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q, bool isFloat, bool Aligned>\n\tstruct compute_log2\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'log2' only accept floating-point inputs. Include <glm/gtc/integer.hpp> for integer inputs.\");\n\n\t\t\treturn detail::functor1<L, T, T, Q>::call(log2, v);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_sqrt\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn detail::functor1<L, T, T, Q>::call(std::sqrt, x);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_inversesqrt\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\treturn static_cast<T>(1) / sqrt(x);\n\t\t}\n\t};\n\t\t\n\ttemplate<length_t L, bool Aligned>\n\tstruct compute_inversesqrt<L, float, lowp, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, float, lowp> call(vec<L, float, lowp> const& x)\n\t\t{\n\t\t\tvec<L, float, lowp> tmp(x);\n\t\t\tvec<L, float, lowp> xhalf(tmp * 0.5f);\n\t\t\tvec<L, uint, lowp>* p = reinterpret_cast<vec<L, uint, lowp>*>(const_cast<vec<L, float, lowp>*>(&x));\n\t\t\tvec<L, uint, lowp> i = vec<L, uint, lowp>(0x5f375a86) - (*p >> vec<L, uint, lowp>(1));\n\t\t\tvec<L, float, lowp>* ptmp = reinterpret_cast<vec<L, float, lowp>*>(&i);\n\t\t\ttmp = *ptmp;\n\t\t\ttmp = tmp * (1.5f - xhalf * tmp * tmp);\n\t\t\treturn tmp;\n\t\t}\n\t};\n}//namespace detail\n\n\t// pow\n\tusing std::pow;\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> pow(vec<L, T, Q> const& base, vec<L, T, Q> const& exponent)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(pow, base, exponent);\n\t}\n\n\t// exp\n\tusing std::exp;\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> exp(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(exp, x);\n\t}\n\n\t// log\n\tusing std::log;\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> log(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(log, x);\n\t}\n\n\t//exp2, ln2 = 0.69314718055994530941723212145818f\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType exp2(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'exp2' only accept floating-point inputs\");\n\n\t\treturn std::exp(static_cast<genType>(0.69314718055994530941723212145818) * x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> exp2(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(exp2, x);\n\t}\n\n\t// log2, ln2 = 0.69314718055994530941723212145818f\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType log2(genType x)\n\t{\n\t\treturn log2(vec<1, genType>(x)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> log2(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::compute_log2<L, T, Q, std::numeric_limits<T>::is_iec559, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\t// sqrt\n\tusing std::sqrt;\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> sqrt(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'sqrt' only accept floating-point inputs\");\n\t\treturn detail::compute_sqrt<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\t// inversesqrt\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType inversesqrt(genType x)\n\t{\n\t\treturn static_cast<genType>(1) / sqrt(x);\n\t}\n\t\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> inversesqrt(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'inversesqrt' only accept floating-point inputs\");\n\t\treturn detail::compute_inversesqrt<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS\n#\tinclude \"func_exponential_simd.inl\"\n#endif\n\n"
  },
  {
    "path": "external/glm/glm/detail/func_exponential_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_exponential_simd.inl\n\n#include \"../simd/exponential.h\"\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<qualifier Q>\n\tstruct compute_sqrt<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_sqrt_ps(v.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_sqrt<4, float, aligned_lowp, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, aligned_lowp> call(vec<4, float, aligned_lowp> const& v)\n\t\t{\n\t\t\tvec<4, float, aligned_lowp> Result;\n\t\t\tResult.data = glm_vec4_sqrt_lowp(v.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n}//namespace detail\n}//namespace glm\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/detail/func_geometric.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_geometric.inl\n\n#include \"../exponential.hpp\"\n#include \"../common.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec4.hpp\"\n#include \"type_float.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_length\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\treturn sqrt(dot(v, v));\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_distance\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1)\n\t\t{\n\t\t\treturn length(p1 - p0);\n\t\t}\n\t};\n\n\ttemplate<typename V, typename T, bool Aligned>\n\tstruct compute_dot{};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_dot<vec<1, T, Q>, T, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(vec<1, T, Q> const& a, vec<1, T, Q> const& b)\n\t\t{\n\t\t\treturn a.x * b.x;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_dot<vec<2, T, Q>, T, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& a, vec<2, T, Q> const& b)\n\t\t{\n\t\t\tvec<2, T, Q> tmp(a * b);\n\t\t\treturn tmp.x + tmp.y;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_dot<vec<3, T, Q>, T, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(vec<3, T, Q> const& a, vec<3, T, Q> const& b)\n\t\t{\n\t\t\tvec<3, T, Q> tmp(a * b);\n\t\t\treturn tmp.x + tmp.y + tmp.z;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_dot<vec<4, T, Q>, T, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> tmp(a * b);\n\t\t\treturn (tmp.x + tmp.y) + (tmp.z + tmp.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_cross\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<3, T, Q> call(vec<3, T, Q> const& x, vec<3, T, Q> const& y)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'cross' accepts only floating-point inputs\");\n\n\t\t\treturn vec<3, T, Q>(\n\t\t\t\tx.y * y.z - y.y * x.z,\n\t\t\t\tx.z * y.x - y.z * x.x,\n\t\t\t\tx.x * y.y - y.x * x.y);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_normalize\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'normalize' accepts only floating-point inputs\");\n\n\t\t\treturn v * inversesqrt(dot(v, v));\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_faceforward\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& N, vec<L, T, Q> const& I, vec<L, T, Q> const& Nref)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'normalize' accepts only floating-point inputs\");\n\n\t\t\treturn dot(Nref, I) < static_cast<T>(0) ? N : -N;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_reflect\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& I, vec<L, T, Q> const& N)\n\t\t{\n\t\t\treturn I - N * dot(N, I) * static_cast<T>(2);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_refract\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& I, vec<L, T, Q> const& N, T eta)\n\t\t{\n\t\t\tT const dotValue(dot(N, I));\n\t\t\tT const k(static_cast<T>(1) - eta * eta * (static_cast<T>(1) - dotValue * dotValue));\n\t\t\treturn (eta * I - (eta * dotValue + std::sqrt(k)) * N) * static_cast<T>(k >= static_cast<T>(0));\n\t\t}\n\t};\n}//namespace detail\n\n\t// length\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType length(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'length' accepts only floating-point inputs\");\n\n\t\treturn abs(x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T length(vec<L, T, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'length' accepts only floating-point inputs\");\n\n\t\treturn detail::compute_length<L, T, Q, detail::is_aligned<Q>::value>::call(v);\n\t}\n\n\t// distance\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType distance(genType const& p0, genType const& p1)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'distance' accepts only floating-point inputs\");\n\n\t\treturn length(p1 - p0);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T distance(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1)\n\t{\n\t\treturn detail::compute_distance<L, T, Q, detail::is_aligned<Q>::value>::call(p0, p1);\n\t}\n\n\t// dot\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T dot(T x, T y)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'dot' accepts only floating-point inputs\");\n\t\treturn x * y;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T dot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'dot' accepts only floating-point inputs\");\n\t\treturn detail::compute_dot<vec<L, T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);\n\t}\n\n\t// cross\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y)\n\t{\n\t\treturn detail::compute_cross<T, Q, detail::is_aligned<Q>::value>::call(x, y);\n\t}\n\n\t// normalize\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType normalize(genType const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'normalize' accepts only floating-point inputs\");\n\n\t\treturn x < genType(0) ? genType(-1) : genType(1);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> normalize(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'normalize' accepts only floating-point inputs\");\n\n\t\treturn detail::compute_normalize<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\t// faceforward\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType faceforward(genType const& N, genType const& I, genType const& Nref)\n\t{\n\t\treturn dot(Nref, I) < static_cast<genType>(0) ? N : -N;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> faceforward(vec<L, T, Q> const& N, vec<L, T, Q> const& I, vec<L, T, Q> const& Nref)\n\t{\n\t\treturn detail::compute_faceforward<L, T, Q, detail::is_aligned<Q>::value>::call(N, I, Nref);\n\t}\n\n\t// reflect\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType reflect(genType const& I, genType const& N)\n\t{\n\t\treturn I - N * dot(N, I) * genType(2);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> reflect(vec<L, T, Q> const& I, vec<L, T, Q> const& N)\n\t{\n\t\treturn detail::compute_reflect<L, T, Q, detail::is_aligned<Q>::value>::call(I, N);\n\t}\n\n\t// refract\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType refract(genType const& I, genType const& N, genType eta)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'refract' accepts only floating-point inputs\");\n\t\tgenType const dotValue(dot(N, I));\n\t\tgenType const k(static_cast<genType>(1) - eta * eta * (static_cast<genType>(1) - dotValue * dotValue));\n\t\treturn (eta * I - (eta * dotValue + sqrt(k)) * N) * static_cast<genType>(k >= static_cast<genType>(0));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> refract(vec<L, T, Q> const& I, vec<L, T, Q> const& N, T eta)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'refract' accepts only floating-point inputs\");\n\t\treturn detail::compute_refract<L, T, Q, detail::is_aligned<Q>::value>::call(I, N, eta);\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS\n#\tinclude \"func_geometric_simd.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/func_geometric_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_geometric_simd.inl\n\n#include \"../simd/geometric.h\"\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<qualifier Q>\n\tstruct compute_length<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& v)\n\t\t{\n\t\t\treturn _mm_cvtss_f32(glm_vec4_length(v.data));\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_distance<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& p0, vec<4, float, Q> const& p1)\n\t\t{\n\t\t\treturn _mm_cvtss_f32(glm_vec4_distance(p0.data, p1.data));\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_dot<vec<4, float, Q>, float, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& x, vec<4, float, Q> const& y)\n\t\t{\n\t\t\treturn _mm_cvtss_f32(glm_vec1_dot(x.data, y.data));\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_cross<float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<3, float, Q> call(vec<3, float, Q> const& a, vec<3, float, Q> const& b)\n\t\t{\n\t\t\t__m128 const set0 = _mm_set_ps(0.0f, a.z, a.y, a.x);\n\t\t\t__m128 const set1 = _mm_set_ps(0.0f, b.z, b.y, b.x);\n\t\t\t__m128 const xpd0 = glm_vec4_cross(set0, set1);\n\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = xpd0;\n\t\t\treturn vec<3, float, Q>(Result);\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_normalize<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = glm_vec4_normalize(v.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_faceforward<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& N, vec<4, float, Q> const& I, vec<4, float, Q> const& Nref)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = glm_vec4_faceforward(N.data, I.data, Nref.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_reflect<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = glm_vec4_reflect(I.data, N.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_refract<4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N, float eta)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = glm_vec4_refract(I.data, N.data, _mm_set1_ps(eta));\n\t\t\treturn Result;\n\t\t}\n\t};\n}//namespace detail\n}//namespace glm\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/detail/func_integer.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_integer.inl\n\n#include \"../ext/vec1.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n#include \"type_int.hpp\"\n#include \"_vectorize.hpp\"\n#if(GLM_ARCH & GLM_ARCH_X86 && GLM_COMPILER & GLM_COMPILER_VC)\n#\tinclude <intrin.h>\n#\tpragma intrinsic(_BitScanReverse)\n#endif//(GLM_ARCH & GLM_ARCH_X86 && GLM_COMPILER & GLM_COMPILER_VC)\n#include <limits>\n\n#if !GLM_HAS_EXTENDED_INTEGER_TYPE\n#\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\tpragma GCC diagnostic ignored \"-Wlong-long\"\n#\tendif\n#\tif (GLM_COMPILER & GLM_COMPILER_CLANG)\n#\t\tpragma clang diagnostic ignored \"-Wc++11-long-long\"\n#\tendif\n#endif\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T mask(T Bits)\n\t{\n\t\treturn Bits >= static_cast<T>(sizeof(T) * 8) ? ~static_cast<T>(0) : (static_cast<T>(1) << Bits) - static_cast<T>(1);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned, bool EXEC>\n\tstruct compute_bitfieldReverseStep\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T, T)\n\t\t{\n\t\t\treturn v;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_bitfieldReverseStep<L, T, Q, Aligned, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T Mask, T Shift)\n\t\t{\n\t\t\treturn (v & Mask) << Shift | (v & (~Mask)) >> Shift;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned, bool EXEC>\n\tstruct compute_bitfieldBitCountStep\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T, T)\n\t\t{\n\t\t\treturn v;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_bitfieldBitCountStep<L, T, Q, Aligned, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T Mask, T Shift)\n\t\t{\n\t\t\treturn (v & Mask) + ((v >> Shift) & Mask);\n\t\t}\n\t};\n\n\ttemplate<typename genIUType, size_t Bits>\n\tstruct compute_findLSB\n\t{\n\t\tGLM_FUNC_QUALIFIER static int call(genIUType Value)\n\t\t{\n\t\t\tif(Value == 0)\n\t\t\t\treturn -1;\n\n\t\t\treturn glm::bitCount(~Value & (Value - static_cast<genIUType>(1)));\n\t\t}\n\t};\n\n#\tif GLM_HAS_BITSCAN_WINDOWS\n\t\ttemplate<typename genIUType>\n\t\tstruct compute_findLSB<genIUType, 32>\n\t\t{\n\t\t\tGLM_FUNC_QUALIFIER static int call(genIUType Value)\n\t\t\t{\n\t\t\t\tunsigned long Result(0);\n\t\t\t\tunsigned char IsNotNull = _BitScanForward(&Result, *reinterpret_cast<unsigned long*>(&Value));\n\t\t\t\treturn IsNotNull ? int(Result) : -1;\n\t\t\t}\n\t\t};\n\n#\t\tif !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32))\n\t\ttemplate<typename genIUType>\n\t\tstruct compute_findLSB<genIUType, 64>\n\t\t{\n\t\t\tGLM_FUNC_QUALIFIER static int call(genIUType Value)\n\t\t\t{\n\t\t\t\tunsigned long Result(0);\n\t\t\t\tunsigned char IsNotNull = _BitScanForward64(&Result, *reinterpret_cast<unsigned __int64*>(&Value));\n\t\t\t\treturn IsNotNull ? int(Result) : -1;\n\t\t\t}\n\t\t};\n#\t\tendif\n#\tendif//GLM_HAS_BITSCAN_WINDOWS\n\n\ttemplate<length_t L, typename T, qualifier Q, bool EXEC = true>\n\tstruct compute_findMSB_step_vec\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, T Shift)\n\t\t{\n\t\t\treturn x | (x >> Shift);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct compute_findMSB_step_vec<L, T, Q, false>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x, T)\n\t\t{\n\t\t\treturn x;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, int>\n\tstruct compute_findMSB_vec\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, int, Q> call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\tvec<L, T, Q> x(v);\n\t\t\tx = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >=  8>::call(x, static_cast<T>( 1));\n\t\t\tx = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >=  8>::call(x, static_cast<T>( 2));\n\t\t\tx = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >=  8>::call(x, static_cast<T>( 4));\n\t\t\tx = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 16>::call(x, static_cast<T>( 8));\n\t\t\tx = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 32>::call(x, static_cast<T>(16));\n\t\t\tx = compute_findMSB_step_vec<L, T, Q, sizeof(T) * 8 >= 64>::call(x, static_cast<T>(32));\n\t\t\treturn vec<L, int, Q>(sizeof(T) * 8 - 1) - glm::bitCount(~x);\n\t\t}\n\t};\n\n#\tif GLM_HAS_BITSCAN_WINDOWS\n\t\ttemplate<typename genIUType>\n\t\tGLM_FUNC_QUALIFIER int compute_findMSB_32(genIUType Value)\n\t\t{\n\t\t\tunsigned long Result(0);\n\t\t\tunsigned char IsNotNull = _BitScanReverse(&Result, *reinterpret_cast<unsigned long*>(&Value));\n\t\t\treturn IsNotNull ? int(Result) : -1;\n\t\t}\n\n\t\ttemplate<length_t L, typename T, qualifier Q>\n\t\tstruct compute_findMSB_vec<L, T, Q, 32>\n\t\t{\n\t\t\tGLM_FUNC_QUALIFIER static vec<L, int, Q> call(vec<L, T, Q> const& x)\n\t\t\t{\n\t\t\t\treturn detail::functor1<L, int, T, Q>::call(compute_findMSB_32, x);\n\t\t\t}\n\t\t};\n\n#\t\tif !((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_MODEL == GLM_MODEL_32))\n\t\ttemplate<typename genIUType>\n\t\tGLM_FUNC_QUALIFIER int compute_findMSB_64(genIUType Value)\n\t\t{\n\t\t\tunsigned long Result(0);\n\t\t\tunsigned char IsNotNull = _BitScanReverse64(&Result, *reinterpret_cast<unsigned __int64*>(&Value));\n\t\t\treturn IsNotNull ? int(Result) : -1;\n\t\t}\n\n\t\ttemplate<length_t L, typename T, qualifier Q>\n\t\tstruct compute_findMSB_vec<L, T, Q, 64>\n\t\t{\n\t\t\tGLM_FUNC_QUALIFIER static vec<L, int, Q> call(vec<L, T, Q> const& x)\n\t\t\t{\n\t\t\t\treturn detail::functor1<L, int, T, Q>::call(compute_findMSB_64, x);\n\t\t\t}\n\t\t};\n#\t\tendif\n#\tendif//GLM_HAS_BITSCAN_WINDOWS\n}//namespace detail\n\n\t// uaddCarry\n\tGLM_FUNC_QUALIFIER uint uaddCarry(uint const& x, uint const& y, uint & Carry)\n\t{\n\t\tuint64 const Value64(static_cast<uint64>(x) + static_cast<uint64>(y));\n\t\tuint64 const Max32((static_cast<uint64>(1) << static_cast<uint64>(32)) - static_cast<uint64>(1));\n\t\tCarry = Value64 > Max32 ? 1u : 0u;\n\t\treturn static_cast<uint32>(Value64 % (Max32 + static_cast<uint64>(1)));\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, uint, Q> uaddCarry(vec<L, uint, Q> const& x, vec<L, uint, Q> const& y, vec<L, uint, Q>& Carry)\n\t{\n\t\tvec<L, uint64, Q> Value64(vec<L, uint64, Q>(x) + vec<L, uint64, Q>(y));\n\t\tvec<L, uint64, Q> Max32((static_cast<uint64>(1) << static_cast<uint64>(32)) - static_cast<uint64>(1));\n\t\tCarry = mix(vec<L, uint32, Q>(0), vec<L, uint32, Q>(1), greaterThan(Value64, Max32));\n\t\treturn vec<L, uint32, Q>(Value64 % (Max32 + static_cast<uint64>(1)));\n\t}\n\n\t// usubBorrow\n\tGLM_FUNC_QUALIFIER uint usubBorrow(uint const& x, uint const& y, uint & Borrow)\n\t{\n\t\tGLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), \"uint and uint32 size mismatch\");\n\n\t\tBorrow = x >= y ? static_cast<uint32>(0) : static_cast<uint32>(1);\n\t\tif(y >= x)\n\t\t\treturn y - x;\n\t\telse\n\t\t\treturn static_cast<uint32>((static_cast<int64>(1) << static_cast<int64>(32)) + (static_cast<int64>(y) - static_cast<int64>(x)));\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, uint, Q> usubBorrow(vec<L, uint, Q> const& x, vec<L, uint, Q> const& y, vec<L, uint, Q>& Borrow)\n\t{\n\t\tBorrow = mix(vec<L, uint, Q>(1), vec<L, uint, Q>(0), greaterThanEqual(x, y));\n\t\tvec<L, uint, Q> const YgeX(y - x);\n\t\tvec<L, uint, Q> const XgeY(vec<L, uint32, Q>((static_cast<int64>(1) << static_cast<int64>(32)) + (vec<L, int64, Q>(y) - vec<L, int64, Q>(x))));\n\t\treturn mix(XgeY, YgeX, greaterThanEqual(y, x));\n\t}\n\n\t// umulExtended\n\tGLM_FUNC_QUALIFIER void umulExtended(uint const& x, uint const& y, uint & msb, uint & lsb)\n\t{\n\t\tGLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), \"uint and uint32 size mismatch\");\n\n\t\tuint64 Value64 = static_cast<uint64>(x) * static_cast<uint64>(y);\n\t\tmsb = static_cast<uint>(Value64 >> static_cast<uint64>(32));\n\t\tlsb = static_cast<uint>(Value64);\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER void umulExtended(vec<L, uint, Q> const& x, vec<L, uint, Q> const& y, vec<L, uint, Q>& msb, vec<L, uint, Q>& lsb)\n\t{\n\t\tGLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32), \"uint and uint32 size mismatch\");\n\n\t\tvec<L, uint64, Q> Value64(vec<L, uint64, Q>(x) * vec<L, uint64, Q>(y));\n\t\tmsb = vec<L, uint32, Q>(Value64 >> static_cast<uint64>(32));\n\t\tlsb = vec<L, uint32, Q>(Value64);\n\t}\n\n\t// imulExtended\n\tGLM_FUNC_QUALIFIER void imulExtended(int x, int y, int& msb, int& lsb)\n\t{\n\t\tGLM_STATIC_ASSERT(sizeof(int) == sizeof(int32), \"int and int32 size mismatch\");\n\n\t\tint64 Value64 = static_cast<int64>(x) * static_cast<int64>(y);\n\t\tmsb = static_cast<int>(Value64 >> static_cast<int64>(32));\n\t\tlsb = static_cast<int>(Value64);\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER void imulExtended(vec<L, int, Q> const& x, vec<L, int, Q> const& y, vec<L, int, Q>& msb, vec<L, int, Q>& lsb)\n\t{\n\t\tGLM_STATIC_ASSERT(sizeof(int) == sizeof(int32), \"int and int32 size mismatch\");\n\n\t\tvec<L, int64, Q> Value64(vec<L, int64, Q>(x) * vec<L, int64, Q>(y));\n\t\tlsb = vec<L, int32, Q>(Value64 & static_cast<int64>(0xFFFFFFFF));\n\t\tmsb = vec<L, int32, Q>((Value64 >> static_cast<int64>(32)) & static_cast<int64>(0xFFFFFFFF));\n\t}\n\n\t// bitfieldExtract\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType bitfieldExtract(genIUType Value, int Offset, int Bits)\n\t{\n\t\treturn bitfieldExtract(vec<1, genIUType>(Value), Offset, Bits).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldExtract(vec<L, T, Q> const& Value, int Offset, int Bits)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'bitfieldExtract' only accept integer inputs\");\n\n\t\treturn (Value >> static_cast<T>(Offset)) & static_cast<T>(detail::mask(Bits));\n\t}\n\n\t// bitfieldInsert\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType bitfieldInsert(genIUType const& Base, genIUType const& Insert, int Offset, int Bits)\n\t{\n\t\treturn bitfieldInsert(vec<1, genIUType>(Base), vec<1, genIUType>(Insert), Offset, Bits).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldInsert(vec<L, T, Q> const& Base, vec<L, T, Q> const& Insert, int Offset, int Bits)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'bitfieldInsert' only accept integer values\");\n\n\t\tT const Mask = static_cast<T>(detail::mask(Bits) << Offset);\n\t\treturn (Base & ~Mask) | (Insert & Mask);\n\t}\n\n\t// bitfieldReverse\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType bitfieldReverse(genType x)\n\t{\n\t\treturn bitfieldReverse(glm::vec<1, genType, glm::defaultp>(x)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldReverse(vec<L, T, Q> const& v)\n\t{\n\t\tvec<L, T, Q> x(v);\n\t\tx = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>=  2>::call(x, static_cast<T>(0x5555555555555555ull), static_cast<T>( 1));\n\t\tx = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>=  4>::call(x, static_cast<T>(0x3333333333333333ull), static_cast<T>( 2));\n\t\tx = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>=  8>::call(x, static_cast<T>(0x0F0F0F0F0F0F0F0Full), static_cast<T>( 4));\n\t\tx = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 16>::call(x, static_cast<T>(0x00FF00FF00FF00FFull), static_cast<T>( 8));\n\t\tx = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 32>::call(x, static_cast<T>(0x0000FFFF0000FFFFull), static_cast<T>(16));\n\t\tx = detail::compute_bitfieldReverseStep<L, T, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 64>::call(x, static_cast<T>(0x00000000FFFFFFFFull), static_cast<T>(32));\n\t\treturn x;\n\t}\n\n\t// bitCount\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER int bitCount(genType x)\n\t{\n\t\treturn bitCount(glm::vec<1, genType, glm::defaultp>(x)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, int, Q> bitCount(vec<L, T, Q> const& v)\n\t{\n#\t\tif GLM_COMPILER & GLM_COMPILER_VC\n#\t\t\tpragma warning(push)\n#\t\t\tpragma warning(disable : 4310) //cast truncates constant value\n#\t\tendif\n\n\t\tvec<L, typename detail::make_unsigned<T>::type, Q> x(*reinterpret_cast<vec<L, typename detail::make_unsigned<T>::type, Q> const *>(&v));\n\t\tx = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>=  2>::call(x, typename detail::make_unsigned<T>::type(0x5555555555555555ull), typename detail::make_unsigned<T>::type( 1));\n\t\tx = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>=  4>::call(x, typename detail::make_unsigned<T>::type(0x3333333333333333ull), typename detail::make_unsigned<T>::type( 2));\n\t\tx = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>=  8>::call(x, typename detail::make_unsigned<T>::type(0x0F0F0F0F0F0F0F0Full), typename detail::make_unsigned<T>::type( 4));\n\t\tx = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 16>::call(x, typename detail::make_unsigned<T>::type(0x00FF00FF00FF00FFull), typename detail::make_unsigned<T>::type( 8));\n\t\tx = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 32>::call(x, typename detail::make_unsigned<T>::type(0x0000FFFF0000FFFFull), typename detail::make_unsigned<T>::type(16));\n\t\tx = detail::compute_bitfieldBitCountStep<L, typename detail::make_unsigned<T>::type, Q, detail::is_aligned<Q>::value, sizeof(T) * 8>= 64>::call(x, typename detail::make_unsigned<T>::type(0x00000000FFFFFFFFull), typename detail::make_unsigned<T>::type(32));\n\t\treturn vec<L, int, Q>(x);\n\n#\t\tif GLM_COMPILER & GLM_COMPILER_VC\n#\t\t\tpragma warning(pop)\n#\t\tendif\n\t}\n\n\t// findLSB\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER int findLSB(genIUType Value)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'findLSB' only accept integer values\");\n\n\t\treturn detail::compute_findLSB<genIUType, sizeof(genIUType) * 8>::call(Value);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, int, Q> findLSB(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'findLSB' only accept integer values\");\n\n\t\treturn detail::functor1<L, int, T, Q>::call(findLSB, x);\n\t}\n\n\t// findMSB\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER int findMSB(genIUType v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'findMSB' only accept integer values\");\n\n\t\treturn findMSB(vec<1, genIUType>(v)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, int, Q> findMSB(vec<L, T, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'findMSB' only accept integer values\");\n\n\t\treturn detail::compute_findMSB_vec<L, T, Q, sizeof(T) * 8>::call(v);\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS\n#\tinclude \"func_integer_simd.inl\"\n#endif\n\n"
  },
  {
    "path": "external/glm/glm/detail/func_integer_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_integer_simd.inl\n\n#include \"../simd/integer.h\"\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<qualifier Q>\n\tstruct compute_bitfieldReverseStep<4, uint32, Q, true, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, uint32, Q> call(vec<4, uint32, Q> const& v, uint32 Mask, uint32 Shift)\n\t\t{\n\t\t\t__m128i const set0 = v.data;\n\n\t\t\t__m128i const set1 = _mm_set1_epi32(static_cast<int>(Mask));\n\t\t\t__m128i const and1 = _mm_and_si128(set0, set1);\n\t\t\t__m128i const sft1 = _mm_slli_epi32(and1, Shift);\n\n\t\t\t__m128i const set2 = _mm_andnot_si128(set0, _mm_set1_epi32(-1));\n\t\t\t__m128i const and2 = _mm_and_si128(set0, set2);\n\t\t\t__m128i const sft2 = _mm_srai_epi32(and2, Shift);\n\t\t\n\t\t\t__m128i const or0 = _mm_or_si128(sft1, sft2);\n\t\t\n\t\t\treturn or0;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_bitfieldBitCountStep<4, uint32, Q, true, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, uint32, Q> call(vec<4, uint32, Q> const& v, uint32 Mask, uint32 Shift)\n\t\t{\n\t\t\t__m128i const set0 = v.data;\n\n\t\t\t__m128i const set1 = _mm_set1_epi32(static_cast<int>(Mask));\n\t\t\t__m128i const and0 = _mm_and_si128(set0, set1);\n\t\t\t__m128i const sft0 = _mm_slli_epi32(set0, Shift);\n\t\t\t__m128i const and1 = _mm_and_si128(sft0, set1);\n\t\t\t__m128i const add0 = _mm_add_epi32(and0, and1);\n\t\t\n\t\t\treturn add0;\n\t\t}\n\t};\n}//namespace detail\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER int bitCount(uint32 x)\n\t{\n\t\treturn _mm_popcnt_u32(x);\n\t}\n\n#\tif(GLM_MODEL == GLM_MODEL_64)\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER int bitCount(uint64 x)\n\t{\n\t\treturn static_cast<int>(_mm_popcnt_u64(x));\n\t}\n#\tendif//GLM_MODEL\n#\tendif//GLM_ARCH\n\n}//namespace glm\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/detail/func_matrix.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_matrix.inl\n\n#include \"../geometric.hpp\"\n#include <limits>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t C, length_t R, typename T, qualifier Q, bool Aligned>\n\tstruct compute_matrixCompMult\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<C, R, T, Q> call(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y)\n\t\t{\n\t\t\tmat<C, R, T, Q> Result;\n\t\t\tfor(length_t i = 0; i < Result.length(); ++i)\n\t\t\t\tResult[i] = x[i] * y[i];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose{};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<2, 2, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<2, 2, T, Q> call(mat<2, 2, T, Q> const& m)\n\t\t{\n\t\t\tmat<2, 2, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<2, 3, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<3, 2, T, Q> call(mat<2, 3, T, Q> const& m)\n\t\t{\n\t\t\tmat<3,2, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\tResult[2][0] = m[0][2];\n\t\t\tResult[2][1] = m[1][2];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<2, 4, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<4, 2, T, Q> call(mat<2, 4, T, Q> const& m)\n\t\t{\n\t\t\tmat<4, 2, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\tResult[2][0] = m[0][2];\n\t\t\tResult[2][1] = m[1][2];\n\t\t\tResult[3][0] = m[0][3];\n\t\t\tResult[3][1] = m[1][3];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<3, 2, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<2, 3, T, Q> call(mat<3, 2, T, Q> const& m)\n\t\t{\n\t\t\tmat<2, 3, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[0][2] = m[2][0];\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\tResult[1][2] = m[2][1];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<3, 3, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m)\n\t\t{\n\t\t\tmat<3, 3, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[0][2] = m[2][0];\n\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\tResult[1][2] = m[2][1];\n\n\t\t\tResult[2][0] = m[0][2];\n\t\t\tResult[2][1] = m[1][2];\n\t\t\tResult[2][2] = m[2][2];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<3, 4, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<4, 3, T, Q> call(mat<3, 4, T, Q> const& m)\n\t\t{\n\t\t\tmat<4, 3, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[0][2] = m[2][0];\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\tResult[1][2] = m[2][1];\n\t\t\tResult[2][0] = m[0][2];\n\t\t\tResult[2][1] = m[1][2];\n\t\t\tResult[2][2] = m[2][2];\n\t\t\tResult[3][0] = m[0][3];\n\t\t\tResult[3][1] = m[1][3];\n\t\t\tResult[3][2] = m[2][3];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<4, 2, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<2, 4, T, Q> call(mat<4, 2, T, Q> const& m)\n\t\t{\n\t\t\tmat<2, 4, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[0][2] = m[2][0];\n\t\t\tResult[0][3] = m[3][0];\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\tResult[1][2] = m[2][1];\n\t\t\tResult[1][3] = m[3][1];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<4, 3, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<3, 4, T, Q> call(mat<4, 3, T, Q> const& m)\n\t\t{\n\t\t\tmat<3, 4, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[0][2] = m[2][0];\n\t\t\tResult[0][3] = m[3][0];\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\tResult[1][2] = m[2][1];\n\t\t\tResult[1][3] = m[3][1];\n\t\t\tResult[2][0] = m[0][2];\n\t\t\tResult[2][1] = m[1][2];\n\t\t\tResult[2][2] = m[2][2];\n\t\t\tResult[2][3] = m[3][2];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_transpose<4, 4, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<4, 4, T, Q> call(mat<4, 4, T, Q> const& m)\n\t\t{\n\t\t\tmat<4, 4, T, Q> Result;\n\t\t\tResult[0][0] = m[0][0];\n\t\t\tResult[0][1] = m[1][0];\n\t\t\tResult[0][2] = m[2][0];\n\t\t\tResult[0][3] = m[3][0];\n\n\t\t\tResult[1][0] = m[0][1];\n\t\t\tResult[1][1] = m[1][1];\n\t\t\tResult[1][2] = m[2][1];\n\t\t\tResult[1][3] = m[3][1];\n\n\t\t\tResult[2][0] = m[0][2];\n\t\t\tResult[2][1] = m[1][2];\n\t\t\tResult[2][2] = m[2][2];\n\t\t\tResult[2][3] = m[3][2];\n\n\t\t\tResult[3][0] = m[0][3];\n\t\t\tResult[3][1] = m[1][3];\n\t\t\tResult[3][2] = m[2][3];\n\t\t\tResult[3][3] = m[3][3];\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q, bool Aligned>\n\tstruct compute_determinant{};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_determinant<2, 2, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(mat<2, 2, T, Q> const& m)\n\t\t{\n\t\t\treturn m[0][0] * m[1][1] - m[1][0] * m[0][1];\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_determinant<3, 3, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(mat<3, 3, T, Q> const& m)\n\t\t{\n\t\t\treturn\n\t\t\t\t+ m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])\n\t\t\t\t- m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2])\n\t\t\t\t+ m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_determinant<4, 4, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(mat<4, 4, T, Q> const& m)\n\t\t{\n\t\t\tT SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\t\tT SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\t\tT SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\t\tT SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\t\tT SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\t\tT SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\n\t\t\tvec<4, T, Q> DetCof(\n\t\t\t\t+ (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02),\n\t\t\t\t- (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04),\n\t\t\t\t+ (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05),\n\t\t\t\t- (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));\n\n\t\t\treturn\n\t\t\t\tm[0][0] * DetCof[0] + m[0][1] * DetCof[1] +\n\t\t\t\tm[0][2] * DetCof[2] + m[0][3] * DetCof[3];\n\t\t}\n\t};\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q, bool Aligned>\n\tstruct compute_inverse{};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_inverse<2, 2, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<2, 2, T, Q> call(mat<2, 2, T, Q> const& m)\n\t\t{\n\t\t\tT OneOverDeterminant = static_cast<T>(1) / (\n\t\t\t\t+ m[0][0] * m[1][1]\n\t\t\t\t- m[1][0] * m[0][1]);\n\n\t\t\tmat<2, 2, T, Q> Inverse(\n\t\t\t\t+ m[1][1] * OneOverDeterminant,\n\t\t\t\t- m[0][1] * OneOverDeterminant,\n\t\t\t\t- m[1][0] * OneOverDeterminant,\n\t\t\t\t+ m[0][0] * OneOverDeterminant);\n\n\t\t\treturn Inverse;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_inverse<3, 3, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m)\n\t\t{\n\t\t\tT OneOverDeterminant = static_cast<T>(1) / (\n\t\t\t\t+ m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])\n\t\t\t\t- m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2])\n\t\t\t\t+ m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]));\n\n\t\t\tmat<3, 3, T, Q> Inverse;\n\t\t\tInverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDeterminant;\n\t\t\tInverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDeterminant;\n\t\t\tInverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDeterminant;\n\t\t\tInverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDeterminant;\n\t\t\tInverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDeterminant;\n\t\t\tInverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDeterminant;\n\t\t\tInverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDeterminant;\n\t\t\tInverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDeterminant;\n\t\t\tInverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDeterminant;\n\n\t\t\treturn Inverse;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_inverse<4, 4, T, Q, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<4, 4, T, Q> call(mat<4, 4, T, Q> const& m)\n\t\t{\n\t\t\tT Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\t\tT Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n\t\t\tT Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\n\t\t\tT Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\t\tT Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n\t\t\tT Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\n\t\t\tT Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\t\tT Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n\t\t\tT Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\n\t\t\tT Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\t\tT Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n\t\t\tT Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\n\t\t\tT Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\t\tT Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n\t\t\tT Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\n\t\t\tT Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\t\t\tT Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n\t\t\tT Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n\t\t\tvec<4, T, Q> Fac0(Coef00, Coef00, Coef02, Coef03);\n\t\t\tvec<4, T, Q> Fac1(Coef04, Coef04, Coef06, Coef07);\n\t\t\tvec<4, T, Q> Fac2(Coef08, Coef08, Coef10, Coef11);\n\t\t\tvec<4, T, Q> Fac3(Coef12, Coef12, Coef14, Coef15);\n\t\t\tvec<4, T, Q> Fac4(Coef16, Coef16, Coef18, Coef19);\n\t\t\tvec<4, T, Q> Fac5(Coef20, Coef20, Coef22, Coef23);\n\n\t\t\tvec<4, T, Q> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]);\n\t\t\tvec<4, T, Q> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]);\n\t\t\tvec<4, T, Q> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]);\n\t\t\tvec<4, T, Q> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]);\n\n\t\t\tvec<4, T, Q> Inv0(Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2);\n\t\t\tvec<4, T, Q> Inv1(Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4);\n\t\t\tvec<4, T, Q> Inv2(Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5);\n\t\t\tvec<4, T, Q> Inv3(Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5);\n\n\t\t\tvec<4, T, Q> SignA(+1, -1, +1, -1);\n\t\t\tvec<4, T, Q> SignB(-1, +1, -1, +1);\n\t\t\tmat<4, 4, T, Q> Inverse(Inv0 * SignA, Inv1 * SignB, Inv2 * SignA, Inv3 * SignB);\n\n\t\t\tvec<4, T, Q> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]);\n\n\t\t\tvec<4, T, Q> Dot0(m[0] * Row0);\n\t\t\tT Dot1 = (Dot0.x + Dot0.y) + (Dot0.z + Dot0.w);\n\n\t\t\tT OneOverDeterminant = static_cast<T>(1) / Dot1;\n\n\t\t\treturn Inverse * OneOverDeterminant;\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<C, R, T, Q> matrixCompMult(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'matrixCompMult' only accept floating-point inputs\");\n\t\treturn detail::compute_matrixCompMult<C, R, T, Q, detail::is_aligned<Q>::value>::call(x, y);\n\t}\n\n\ttemplate<length_t DA, length_t DB, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename detail::outerProduct_trait<DA, DB, T, Q>::type outerProduct(vec<DA, T, Q> const& c, vec<DB, T, Q> const& r)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'outerProduct' only accept floating-point inputs\");\n\n\t\ttypename detail::outerProduct_trait<DA, DB, T, Q>::type m;\n\t\tfor(length_t i = 0; i < m.length(); ++i)\n\t\t\tm[i] = c * r[i];\n\t\treturn m;\n\t}\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<C, R, T, Q>::transpose_type transpose(mat<C, R, T, Q> const& m)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'transpose' only accept floating-point inputs\");\n\t\treturn detail::compute_transpose<C, R, T, Q, detail::is_aligned<Q>::value>::call(m);\n\t}\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T determinant(mat<C, R, T, Q> const& m)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'determinant' only accept floating-point inputs\");\n\t\treturn detail::compute_determinant<C, R, T, Q, detail::is_aligned<Q>::value>::call(m);\n\t}\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<C, R, T, Q> inverse(mat<C, R, T, Q> const& m)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559 || GLM_UNRESTRICTED_GENTYPE, \"'inverse' only accept floating-point inputs\");\n\t\treturn detail::compute_inverse<C, R, T, Q, detail::is_aligned<Q>::value>::call(m);\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS\n#\tinclude \"func_matrix_simd.inl\"\n#endif\n\n"
  },
  {
    "path": "external/glm/glm/detail/func_matrix_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_matrix_simd.inl\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n#include \"type_mat4x4.hpp\"\n#include \"../geometric.hpp\"\n#include \"../simd/matrix.h\"\n#include <cstring>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<qualifier Q>\n\tstruct compute_matrixCompMult<4, 4, float, Q, true>\n\t{\n\t\tGLM_STATIC_ASSERT(detail::is_aligned<Q>::value, \"Specialization requires aligned\");\n\n\t\tGLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& x, mat<4, 4, float, Q> const& y)\n\t\t{\n\t\t\tmat<4, 4, float, Q> Result;\n\t\t\tglm_mat4_matrixCompMult(\n\t\t\t\t*static_cast<glm_vec4 const (*)[4]>(&x[0].data),\n\t\t\t\t*static_cast<glm_vec4 const (*)[4]>(&y[0].data),\n\t\t\t\t*static_cast<glm_vec4(*)[4]>(&Result[0].data));\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_transpose<4, 4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m)\n\t\t{\n\t\t\tmat<4, 4, float, Q> Result;\n\t\t\tglm_mat4_transpose(\n\t\t\t\t*static_cast<glm_vec4 const (*)[4]>(&m[0].data),\n\t\t\t\t*static_cast<glm_vec4(*)[4]>(&Result[0].data));\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_determinant<4, 4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static float call(mat<4, 4, float, Q> const& m)\n\t\t{\n\t\t\treturn _mm_cvtss_f32(glm_mat4_determinant(*reinterpret_cast<__m128 const(*)[4]>(&m[0].data)));\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_inverse<4, 4, float, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static mat<4, 4, float, Q> call(mat<4, 4, float, Q> const& m)\n\t\t{\n\t\t\tmat<4, 4, float, Q> Result;\n\t\t\tglm_mat4_inverse(*reinterpret_cast<__m128 const(*)[4]>(&m[0].data), *reinterpret_cast<__m128(*)[4]>(&Result[0].data));\n\t\t\treturn Result;\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER mat<4, 4, float, aligned_lowp> outerProduct<4, 4, float, aligned_lowp>(vec<4, float, aligned_lowp> const& c, vec<4, float, aligned_lowp> const& r)\n\t{\n\t\t__m128 NativeResult[4];\n\t\tglm_mat4_outerProduct(c.data, r.data, NativeResult);\n\t\tmat<4, 4, float, aligned_lowp> Result;\n\t\tstd::memcpy(&Result[0], &NativeResult[0], sizeof(Result));\n\t\treturn Result;\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER mat<4, 4, float, aligned_mediump> outerProduct<4, 4, float, aligned_mediump>(vec<4, float, aligned_mediump> const& c, vec<4, float, aligned_mediump> const& r)\n\t{\n\t\t__m128 NativeResult[4];\n\t\tglm_mat4_outerProduct(c.data, r.data, NativeResult);\n\t\tmat<4, 4, float, aligned_mediump> Result;\n\t\tstd::memcpy(&Result[0], &NativeResult[0], sizeof(Result));\n\t\treturn Result;\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER mat<4, 4, float, aligned_highp> outerProduct<4, 4, float, aligned_highp>(vec<4, float, aligned_highp> const& c, vec<4, float, aligned_highp> const& r)\n\t{\n\t\t__m128 NativeResult[4];\n\t\tglm_mat4_outerProduct(c.data, r.data, NativeResult);\n\t\tmat<4, 4, float, aligned_highp> Result;\n\t\tstd::memcpy(&Result[0], &NativeResult[0], sizeof(Result));\n\t\treturn Result;\n\t}\n}//namespace glm\n\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/func_packing.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_packing.inl\n\n#include \"../common.hpp\"\n#include \"type_half.hpp\"\n#include \"../fwd.hpp\"\n\nnamespace glm\n{\n\tGLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tu16  in[2];\n\t\t\tuint out;\n\t\t} u;\n\n\t\tu16vec2 result(round(clamp(v, 0.0f, 1.0f) * 65535.0f));\n\n\t\tu.in[0] = result[0];\n\t\tu.in[1] = result[1];\n\n\t\treturn u.out;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint p)\n\t{\n\t\tunion\n\t\t{\n\t\t\tuint in;\n\t\t\tu16  out[2];\n\t\t} u;\n\n\t\tu.in = p;\n\n\t\treturn vec2(u.out[0], u.out[1]) * 1.5259021896696421759365224689097e-5f;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\ti16  in[2];\n\t\t\tuint out;\n\t\t} u;\n\n\t\ti16vec2 result(round(clamp(v, -1.0f, 1.0f) * 32767.0f));\n\n\t\tu.in[0] = result[0];\n\t\tu.in[1] = result[1];\n\n\t\treturn u.out;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint p)\n\t{\n\t\tunion\n\t\t{\n\t\t\tuint in;\n\t\t\ti16  out[2];\n\t\t} u;\n\n\t\tu.in = p;\n\n\t\treturn clamp(vec2(u.out[0], u.out[1]) * 3.0518509475997192297128208258309e-5f, -1.0f, 1.0f);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tu8   in[4];\n\t\t\tuint out;\n\t\t} u;\n\n\t\tu8vec4 result(round(clamp(v, 0.0f, 1.0f) * 255.0f));\n\n\t\tu.in[0] = result[0];\n\t\tu.in[1] = result[1];\n\t\tu.in[2] = result[2];\n\t\tu.in[3] = result[3];\n\n\t\treturn u.out;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint p)\n\t{\n\t\tunion\n\t\t{\n\t\t\tuint in;\n\t\t\tu8   out[4];\n\t\t} u;\n\n\t\tu.in = p;\n\n\t\treturn vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0039215686274509803921568627451f;\n\t}\n\t\n\tGLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\ti8   in[4];\n\t\t\tuint out;\n\t\t} u;\n\n\t\ti8vec4 result(round(clamp(v, -1.0f, 1.0f) * 127.0f));\n\n\t\tu.in[0] = result[0];\n\t\tu.in[1] = result[1];\n\t\tu.in[2] = result[2];\n\t\tu.in[3] = result[3];\n\n\t\treturn u.out;\n\t}\n\t\n\tGLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint p)\n\t{\n\t\tunion\n\t\t{\n\t\t\tuint in;\n\t\t\ti8   out[4];\n\t\t} u;\n\n\t\tu.in = p;\n\n\t\treturn clamp(vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0078740157480315f, -1.0f, 1.0f);\n\t}\n\n\tGLM_FUNC_QUALIFIER double packDouble2x32(uvec2 const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tuint   in[2];\n\t\t\tdouble out;\n\t\t} u;\n\n\t\tu.in[0] = v[0];\n\t\tu.in[1] = v[1];\n\n\t\treturn u.out;\n\t}\n\n\tGLM_FUNC_QUALIFIER uvec2 unpackDouble2x32(double v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tdouble in;\n\t\t\tuint   out[2];\n\t\t} u;\n\n\t\tu.in = v;\n\n\t\treturn uvec2(u.out[0], u.out[1]);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint packHalf2x16(vec2 const& v)\n\t{\n\t\tunion\n\t\t{\n\t\t\ti16  in[2];\n\t\t\tuint out;\n\t\t} u;\n\n\t\tu.in[0] = detail::toFloat16(v.x);\n\t\tu.in[1] = detail::toFloat16(v.y);\n\n\t\treturn u.out;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint v)\n\t{\n\t\tunion\n\t\t{\n\t\t\tuint in;\n\t\t\ti16  out[2];\n\t\t} u;\n\n\t\tu.in = v;\n\n\t\treturn vec2(\n\t\t\tdetail::toFloat32(u.out[0]),\n\t\t\tdetail::toFloat32(u.out[1]));\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS\n#\tinclude \"func_packing_simd.inl\"\n#endif\n\n"
  },
  {
    "path": "external/glm/glm/detail/func_packing_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_packing_simd.inl\n\nnamespace glm{\nnamespace detail\n{\n\n}//namespace detail\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/func_trigonometric.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_trigonometric.inl\n\n#include \"_vectorize.hpp\"\n#include <cmath>\n#include <limits>\n\nnamespace glm\n{\n\t// radians\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType radians(genType degrees)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'radians' only accept floating-point input\");\n\n\t\treturn degrees * static_cast<genType>(0.01745329251994329576923690768489);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, T, Q> radians(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(radians, v);\n\t}\n\t\n\t// degrees\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType degrees(genType radians)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'degrees' only accept floating-point input\");\n\n\t\treturn radians * static_cast<genType>(57.295779513082320876798154814105);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, T, Q> degrees(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(degrees, v);\n\t}\n\n\t// sin\n\tusing ::std::sin;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> sin(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(sin, v);\n\t}\n\n\t// cos\n\tusing std::cos;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> cos(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(cos, v);\n\t}\n\n\t// tan\n\tusing std::tan;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> tan(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(tan, v);\n\t}\n\n\t// asin\n\tusing std::asin;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> asin(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(asin, v);\n\t}\n\n\t// acos\n\tusing std::acos;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> acos(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(acos, v);\n\t}\n\n\t// atan\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType atan(genType y, genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'atan' only accept floating-point input\");\n\n\t\treturn ::std::atan2(y, x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> atan(vec<L, T, Q> const& a, vec<L, T, Q> const& b)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(::std::atan2, a, b);\n\t}\n\n\tusing std::atan;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> atan(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(atan, v);\n\t}\n\n\t// sinh\n\tusing std::sinh;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> sinh(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(sinh, v);\n\t}\n\n\t// cosh\n\tusing std::cosh;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> cosh(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(cosh, v);\n\t}\n\n\t// tanh\n\tusing std::tanh;\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> tanh(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(tanh, v);\n\t}\n\n\t// asinh\n#\tif GLM_HAS_CXX11_STL\n\t\tusing std::asinh;\n#\telse\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER genType asinh(genType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'asinh' only accept floating-point input\");\n\n\t\t\treturn (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));\n\t\t}\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> asinh(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(asinh, v);\n\t}\n\n\t// acosh\n#\tif GLM_HAS_CXX11_STL\n\t\tusing std::acosh;\n#\telse\n\t\ttemplate<typename genType> \n\t\tGLM_FUNC_QUALIFIER genType acosh(genType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'acosh' only accept floating-point input\");\n\n\t\t\tif(x < static_cast<genType>(1))\n\t\t\t\treturn static_cast<genType>(0);\n\t\t\treturn log(x + sqrt(x * x - static_cast<genType>(1)));\n\t\t}\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> acosh(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(acosh, v);\n\t}\n\n\t// atanh\n#\tif GLM_HAS_CXX11_STL\n\t\tusing std::atanh;\n#\telse\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER genType atanh(genType x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'atanh' only accept floating-point input\");\n\t\t\n\t\t\tif(std::abs(x) >= static_cast<genType>(1))\n\t\t\t\treturn 0;\n\t\t\treturn static_cast<genType>(0.5) * log((static_cast<genType>(1) + x) / (static_cast<genType>(1) - x));\n\t\t}\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> atanh(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(atanh, v);\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS\n#\tinclude \"func_trigonometric_simd.inl\"\n#endif\n\n"
  },
  {
    "path": "external/glm/glm/detail/func_trigonometric_simd.inl",
    "content": ""
  },
  {
    "path": "external/glm/glm/detail/func_vector_relational.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_vector_relational.inl\n\n#include \"compute_vector_relational.hpp\"\n\nnamespace glm\n{\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> lessThan(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tassert(x.length() == y.length());\n\n\t\tvec<L, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = x[i] < y[i];\n\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> lessThanEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tassert(x.length() == y.length());\n\n\t\tvec<L, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = x[i] <= y[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> greaterThan(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tassert(x.length() == y.length());\n\n\t\tvec<L, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = x[i] > y[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> greaterThanEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tassert(x.length() == y.length());\n\n\t\tvec<L, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = x[i] >= y[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tassert(x.length() == y.length());\n\n\t\tvec<L, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = detail::compute_equal<T>::call(x[i], y[i]);\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tassert(x.length() == y.length());\n\n\t\tvec<L, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = !detail::compute_equal<T>::call(x[i], y[i]);\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool any(vec<L, bool, Q> const& v)\n\t{\n\t\tbool Result = false;\n\t\tfor(length_t i = 0; i < v.length(); ++i)\n\t\t\tResult = Result || v[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool all(vec<L, bool, Q> const& v)\n\t{\n\t\tbool Result = true;\n\t\tfor(length_t i = 0; i < v.length(); ++i)\n\t\t\tResult = Result && v[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> not_(vec<L, bool, Q> const& v)\n\t{\n\t\tvec<L, bool, Q> Result;\n\t\tfor(length_t i = 0; i < v.length(); ++i)\n\t\t\tResult[i] = !v[i];\n\t\treturn Result;\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS\n#\tinclude \"func_vector_relational_simd.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/func_vector_relational_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_vector_relational_simd.inl\n\nnamespace glm{\nnamespace detail\n{\n\n}//namespace detail\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/glm.cpp",
    "content": "/// @ref core\n/// @file glm/glm.cpp\n\n#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/glm.hpp>\n#include <glm/ext/vec1.hpp>\n#include <glm/gtc/quaternion.hpp>\n#include <glm/gtx/dual_quaternion.hpp>\n\nnamespace glm\n{\n// tvec1 type explicit instantiation\ntemplate struct vec<1, uint8, lowp>;\ntemplate struct vec<1, uint16, lowp>;\ntemplate struct vec<1, uint32, lowp>;\ntemplate struct vec<1, uint64, lowp>;\ntemplate struct vec<1, int8, lowp>;\ntemplate struct vec<1, int16, lowp>;\ntemplate struct vec<1, int32, lowp>;\ntemplate struct vec<1, int64, lowp>;\ntemplate struct vec<1, float32, lowp>;\ntemplate struct vec<1, float64, lowp>;\n\ntemplate struct vec<1, uint8, mediump>;\ntemplate struct vec<1, uint16, mediump>;\ntemplate struct vec<1, uint32, mediump>;\ntemplate struct vec<1, uint64, mediump>;\ntemplate struct vec<1, int8, mediump>;\ntemplate struct vec<1, int16, mediump>;\ntemplate struct vec<1, int32, mediump>;\ntemplate struct vec<1, int64, mediump>;\ntemplate struct vec<1, float32, mediump>;\ntemplate struct vec<1, float64, mediump>;\n\ntemplate struct vec<1, uint8, highp>;\ntemplate struct vec<1, uint16, highp>;\ntemplate struct vec<1, uint32, highp>;\ntemplate struct vec<1, uint64, highp>;\ntemplate struct vec<1, int8, highp>;\ntemplate struct vec<1, int16, highp>;\ntemplate struct vec<1, int32, highp>;\ntemplate struct vec<1, int64, highp>;\ntemplate struct vec<1, float32, highp>;\ntemplate struct vec<1, float64, highp>;\n\n// tvec2 type explicit instantiation\ntemplate struct vec<2, uint8, lowp>;\ntemplate struct vec<2, uint16, lowp>;\ntemplate struct vec<2, uint32, lowp>;\ntemplate struct vec<2, uint64, lowp>;\ntemplate struct vec<2, int8, lowp>;\ntemplate struct vec<2, int16, lowp>;\ntemplate struct vec<2, int32, lowp>;\ntemplate struct vec<2, int64, lowp>;\ntemplate struct vec<2, float32, lowp>;\ntemplate struct vec<2, float64, lowp>;\n\ntemplate struct vec<2, uint8, mediump>;\ntemplate struct vec<2, uint16, mediump>;\ntemplate struct vec<2, uint32, mediump>;\ntemplate struct vec<2, uint64, mediump>;\ntemplate struct vec<2, int8, mediump>;\ntemplate struct vec<2, int16, mediump>;\ntemplate struct vec<2, int32, mediump>;\ntemplate struct vec<2, int64, mediump>;\ntemplate struct vec<2, float32, mediump>;\ntemplate struct vec<2, float64, mediump>;\n\ntemplate struct vec<2, uint8, highp>;\ntemplate struct vec<2, uint16, highp>;\ntemplate struct vec<2, uint32, highp>;\ntemplate struct vec<2, uint64, highp>;\ntemplate struct vec<2, int8, highp>;\ntemplate struct vec<2, int16, highp>;\ntemplate struct vec<2, int32, highp>;\ntemplate struct vec<2, int64, highp>;\ntemplate struct vec<2, float32, highp>;\ntemplate struct vec<2, float64, highp>;\n\n// tvec3 type explicit instantiation\ntemplate struct vec<3, uint8, lowp>;\ntemplate struct vec<3, uint16, lowp>;\ntemplate struct vec<3, uint32, lowp>;\ntemplate struct vec<3, uint64, lowp>;\ntemplate struct vec<3, int8, lowp>;\ntemplate struct vec<3, int16, lowp>;\ntemplate struct vec<3, int32, lowp>;\ntemplate struct vec<3, int64, lowp>;\ntemplate struct vec<3, float32, lowp>;\ntemplate struct vec<3, float64, lowp>;\n\ntemplate struct vec<3, uint8, mediump>;\ntemplate struct vec<3, uint16, mediump>;\ntemplate struct vec<3, uint32, mediump>;\ntemplate struct vec<3, uint64, mediump>;\ntemplate struct vec<3, int8, mediump>;\ntemplate struct vec<3, int16, mediump>;\ntemplate struct vec<3, int32, mediump>;\ntemplate struct vec<3, int64, mediump>;\ntemplate struct vec<3, float32, mediump>;\ntemplate struct vec<3, float64, mediump>;\n\ntemplate struct vec<3, uint8, highp>;\ntemplate struct vec<3, uint16, highp>;\ntemplate struct vec<3, uint32, highp>;\ntemplate struct vec<3, uint64, highp>;\ntemplate struct vec<3, int8, highp>;\ntemplate struct vec<3, int16, highp>;\ntemplate struct vec<3, int32, highp>;\ntemplate struct vec<3, int64, highp>;\ntemplate struct vec<3, float32, highp>;\ntemplate struct vec<3, float64, highp>;\n\n// tvec4 type explicit instantiation\ntemplate struct vec<4, uint8, lowp>;\ntemplate struct vec<4, uint16, lowp>;\ntemplate struct vec<4, uint32, lowp>;\ntemplate struct vec<4, uint64, lowp>;\ntemplate struct vec<4, int8, lowp>;\ntemplate struct vec<4, int16, lowp>;\ntemplate struct vec<4, int32, lowp>;\ntemplate struct vec<4, int64, lowp>;\ntemplate struct vec<4, float32, lowp>;\ntemplate struct vec<4, float64, lowp>;\n\ntemplate struct vec<4, uint8, mediump>;\ntemplate struct vec<4, uint16, mediump>;\ntemplate struct vec<4, uint32, mediump>;\ntemplate struct vec<4, uint64, mediump>;\ntemplate struct vec<4, int8, mediump>;\ntemplate struct vec<4, int16, mediump>;\ntemplate struct vec<4, int32, mediump>;\ntemplate struct vec<4, int64, mediump>;\ntemplate struct vec<4, float32, mediump>;\ntemplate struct vec<4, float64, mediump>;\n\ntemplate struct vec<4, uint8, highp>;\ntemplate struct vec<4, uint16, highp>;\ntemplate struct vec<4, uint32, highp>;\ntemplate struct vec<4, uint64, highp>;\ntemplate struct vec<4, int8, highp>;\ntemplate struct vec<4, int16, highp>;\ntemplate struct vec<4, int32, highp>;\ntemplate struct vec<4, int64, highp>;\ntemplate struct vec<4, float32, highp>;\ntemplate struct vec<4, float64, highp>;\n\n// tmat2x2 type explicit instantiation\ntemplate struct mat<2, 2, float32, lowp>;\ntemplate struct mat<2, 2, float64, lowp>;\n\ntemplate struct mat<2, 2, float32, mediump>;\ntemplate struct mat<2, 2, float64, mediump>;\n\ntemplate struct mat<2, 2, float32, highp>;\ntemplate struct mat<2, 2, float64, highp>;\n\n// tmat2x3 type explicit instantiation\ntemplate struct mat<2, 3, float32, lowp>;\ntemplate struct mat<2, 3, float64, lowp>;\n\ntemplate struct mat<2, 3, float32, mediump>;\ntemplate struct mat<2, 3, float64, mediump>;\n\ntemplate struct mat<2, 3, float32, highp>;\ntemplate struct mat<2, 3, float64, highp>;\n\n// tmat2x4 type explicit instantiation\ntemplate struct mat<2, 4, float32, lowp>;\ntemplate struct mat<2, 4, float64, lowp>;\n\ntemplate struct mat<2, 4, float32, mediump>;\ntemplate struct mat<2, 4, float64, mediump>;\n\ntemplate struct mat<2, 4, float32, highp>;\ntemplate struct mat<2, 4, float64, highp>;\n\n// tmat3x2 type explicit instantiation\ntemplate struct mat<3, 2, float32, lowp>;\ntemplate struct mat<3, 2, float64, lowp>;\n\ntemplate struct mat<3, 2, float32, mediump>;\ntemplate struct mat<3, 2, float64, mediump>;\n\ntemplate struct mat<3, 2, float32, highp>;\ntemplate struct mat<3, 2, float64, highp>;\n\n// tmat3x3 type explicit instantiation\ntemplate struct mat<3, 3, float32, lowp>;\ntemplate struct mat<3, 3, float64, lowp>;\n\ntemplate struct mat<3, 3, float32, mediump>;\ntemplate struct mat<3, 3, float64, mediump>;\n\ntemplate struct mat<3, 3, float32, highp>;\ntemplate struct mat<3, 3, float64, highp>;\n\n// tmat3x4 type explicit instantiation\ntemplate struct mat<3, 4, float32, lowp>;\ntemplate struct mat<3, 4, float64, lowp>;\n\ntemplate struct mat<3, 4, float32, mediump>;\ntemplate struct mat<3, 4, float64, mediump>;\n\ntemplate struct mat<3, 4, float32, highp>;\ntemplate struct mat<3, 4, float64, highp>;\n\n// tmat4x2 type explicit instantiation\ntemplate struct mat<4, 2, float32, lowp>;\ntemplate struct mat<4, 2, float64, lowp>;\n\ntemplate struct mat<4, 2, float32, mediump>;\ntemplate struct mat<4, 2, float64, mediump>;\n\ntemplate struct mat<4, 2, float32, highp>;\ntemplate struct mat<4, 2, float64, highp>;\n\n// tmat4x3 type explicit instantiation\ntemplate struct mat<4, 3, float32, lowp>;\ntemplate struct mat<4, 3, float64, lowp>;\n\ntemplate struct mat<4, 3, float32, mediump>;\ntemplate struct mat<4, 3, float64, mediump>;\n\ntemplate struct mat<4, 3, float32, highp>;\ntemplate struct mat<4, 3, float64, highp>;\n\n// tmat4x4 type explicit instantiation\ntemplate struct mat<4, 4, float32, lowp>;\ntemplate struct mat<4, 4, float64, lowp>;\n\ntemplate struct mat<4, 4, float32, mediump>;\ntemplate struct mat<4, 4, float64, mediump>;\n\ntemplate struct mat<4, 4, float32, highp>;\ntemplate struct mat<4, 4, float64, highp>;\n\n// tquat type explicit instantiation\ntemplate struct tquat<float32, lowp>;\ntemplate struct tquat<float64, lowp>;\n\ntemplate struct tquat<float32, mediump>;\ntemplate struct tquat<float64, mediump>;\n\ntemplate struct tquat<float32, highp>;\ntemplate struct tquat<float64, highp>;\n\n//tdualquat type explicit instantiation\ntemplate struct tdualquat<float32, lowp>;\ntemplate struct tdualquat<float64, lowp>;\n\ntemplate struct tdualquat<float32, mediump>;\ntemplate struct tdualquat<float64, mediump>;\n\ntemplate struct tdualquat<float32, highp>;\ntemplate struct tdualquat<float64, highp>;\n\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/detail/qualifier.hpp",
    "content": "/// @ref core\n/// @file glm/detail/qualifier.hpp\n\n#pragma once\n\n#include \"setup.hpp\"\n\nnamespace glm\n{\n\t/// Qualify GLM types in term of alignment (packed, aligned) and precision in term of ULPs (lowp, mediump, highp)\n\tenum qualifier\n\t{\n\t\tpacked_highp, ///< Typed data is tightly packed in memory and operations are executed with high precision in term of ULPs\n\t\tpacked_mediump, ///< Typed data is tightly packed in memory  and operations are executed with medium precision in term of ULPs for higher performance\n\t\tpacked_lowp, ///< Typed data is tightly packed in memory  and operations are executed with low precision in term of ULPs to maximize performance\n\n#\t\tif GLM_HAS_ALIGNED_TYPE\n\t\t\taligned_highp, ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs\n\t\t\taligned_mediump, ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs for higher performance\n\t\t\taligned_lowp, // ///< Typed data is aligned in memory allowing SIMD optimizations and operations are executed with high precision in term of ULPs to maximize performance\n\t\t\taligned = aligned_highp, ///< By default aligned qualifier is also high precision\n#\t\tendif\n\n\t\thighp = packed_highp, ///< By default highp qualifier is also packed\n\t\tmediump = packed_mediump, ///< By default mediump qualifier is also packed\n\t\tlowp = packed_lowp, ///< By default lowp qualifier is also packed\n\t\tpacked = packed_highp, ///< By default packed qualifier is also high precision\n\n#\t\tif GLM_HAS_ALIGNED_TYPE && defined(GLM_FORCE_ALIGNED)\n\t\t\tdefaultp = aligned_highp\n#\t\telse\n\t\t\tdefaultp = highp\n#\t\tendif\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q = defaultp> struct vec;\n\ttemplate<length_t C, length_t R, typename T, qualifier Q = defaultp> struct mat;\n\nnamespace detail\n{\n\ttemplate<glm::qualifier P>\n\tstruct is_aligned\n\t{\n\t\tstatic const bool value = false;\n\t};\n\n#\tif GLM_HAS_ALIGNED_TYPE\n\t\ttemplate<>\n\t\tstruct is_aligned<glm::aligned_lowp>\n\t\t{\n\t\t\tstatic const bool value = true;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct is_aligned<glm::aligned_mediump>\n\t\t{\n\t\t\tstatic const bool value = true;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct is_aligned<glm::aligned_highp>\n\t\t{\n\t\t\tstatic const bool value = true;\n\t\t};\n#\tendif\n}//namespace detail\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/setup.hpp",
    "content": "/// @ref core\n/// @file glm/detail/setup.hpp\n\n#ifndef GLM_SETUP_INCLUDED\n\n#define GLM_VERSION_MAJOR\t\t\t0\n#define GLM_VERSION_MINOR\t\t\t9\n#define GLM_VERSION_PATCH\t\t\t9\n#define GLM_VERSION_REVISION\t\t0\n#define GLM_VERSION\t\t\t\t\t990\n\n#define GLM_SETUP_INCLUDED GLM_VERSION\n\n#if defined(GLM_FORCE_SWIZZLE) && defined(GLM_FORCE_UNRESTRICTED_GENTYPE)\n#\terror \"Both GLM_FORCE_SWIZZLE and GLM_FORCE_UNRESTRICTED_GENTYPE can't be defined at the same time\"\n#endif\n\n#include <cassert>\n#include <cstddef>\n\n///////////////////////////////////////////////////////////////////////////////////\n// Messages\n\n#define GLM_MESSAGES_ENABLED 1\n#define GLM_MESSAGES_DISABLE 0\n\n#if defined(GLM_FORCE_MESSAGES)\n#\tdefine GLM_MESSAGES GLM_MESSAGES_ENABLED\n#else\n#\tdefine GLM_MESSAGES GLM_MESSAGES_DISABLE\n#endif\n\n///////////////////////////////////////////////////////////////////////////////////\n// Detect the platform\n\n#include \"../simd/platform.h\"\n\n///////////////////////////////////////////////////////////////////////////////////\n// Version\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_VERSION_DISPLAYED)\n#\tdefine GLM_MESSAGE_VERSION_DISPLAYED\n#\tpragma message (\"GLM: version 0.9.9.0\")\n#endif//GLM_MESSAGES\n\n// Report compiler detection\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_COMPILER_DISPLAYED)\n#\tdefine GLM_MESSAGE_COMPILER_DISPLAYED\n#\tif GLM_COMPILER & GLM_COMPILER_CUDA\n#\t\tpragma message(\"GLM: CUDA compiler detected\")\n#\telif GLM_COMPILER & GLM_COMPILER_VC\n#\t\tpragma message(\"GLM: Visual C++ compiler detected\")\n#\telif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\tpragma message(\"GLM: Clang compiler detected\")\n#\telif GLM_COMPILER & GLM_COMPILER_INTEL\n#\t\tpragma message(\"GLM: Intel Compiler detected\")\n#\telif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\tpragma message(\"GLM: GCC compiler detected\")\n#\telse\n#\t\tpragma message(\"GLM: Compiler not detected\")\n#\tendif\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// Build model\n\n#if defined(__arch64__) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__)\n#\tdefine GLM_MODEL\tGLM_MODEL_64\n#elif defined(__i386__) || defined(__ppc__)\n#\tdefine GLM_MODEL\tGLM_MODEL_32\n#else\n#\tdefine GLM_MODEL\tGLM_MODEL_32\n#endif//\n\n#if !defined(GLM_MODEL) && GLM_COMPILER != 0\n#\terror \"GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message.\"\n#endif//GLM_MODEL\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_MODEL_DISPLAYED)\n#\tdefine GLM_MESSAGE_MODEL_DISPLAYED\n#\tif(GLM_MODEL == GLM_MODEL_64)\n#\t\tpragma message(\"GLM: 64 bits model\")\n#\telif(GLM_MODEL == GLM_MODEL_32)\n#\t\tpragma message(\"GLM: 32 bits model\")\n#\tendif//GLM_MODEL\n#endif//GLM_MESSAGES\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_ARCH_DISPLAYED)\n#\tdefine GLM_MESSAGE_ARCH_DISPLAYED\n#\tif(GLM_ARCH == GLM_ARCH_PURE)\n#\t\tpragma message(\"GLM: Platform independent code\")\n#\telif(GLM_ARCH == GLM_ARCH_AVX2)\n#\t\tpragma message(\"GLM: AVX2 instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_AVX)\n#\t\tpragma message(\"GLM: AVX instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_SSE42)\n#\t\tpragma message(\"GLM: SSE4.2 instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_SSE41)\n#\t\tpragma message(\"GLM: SSE4.1 instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_SSSE3)\n#\t\tpragma message(\"GLM: SSSE3 instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_SSE3)\n#\t\tpragma message(\"GLM: SSE3 instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_SSE2)\n#\t\tpragma message(\"GLM: SSE2 instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_X86)\n#\t\tpragma message(\"GLM: x86 instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_NEON)\n#\t\tpragma message(\"GLM: NEON instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_ARM)\n#\t\tpragma message(\"GLM: ARM instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_MIPS)\n#\t\tpragma message(\"GLM: MIPS instruction set\")\n#\telif(GLM_ARCH == GLM_ARCH_PPC)\n#\t\tpragma message(\"GLM: PowerPC architechture\")\n#\tendif//GLM_ARCH\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// C++ Version\n\n// User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14\n\n#define GLM_LANG_CXX98_FLAG\t\t\t(1 << 1)\n#define GLM_LANG_CXX03_FLAG\t\t\t(1 << 2)\n#define GLM_LANG_CXX0X_FLAG\t\t\t(1 << 3)\n#define GLM_LANG_CXX11_FLAG\t\t\t(1 << 4)\n#define GLM_LANG_CXX1Y_FLAG\t\t\t(1 << 5)\n#define GLM_LANG_CXX14_FLAG\t\t\t(1 << 6)\n#define GLM_LANG_CXX1Z_FLAG\t\t\t(1 << 7)\n#define GLM_LANG_CXXMS_FLAG\t\t\t(1 << 8)\n#define GLM_LANG_CXXGNU_FLAG\t\t(1 << 9)\n\n#define GLM_LANG_CXX98\t\t\tGLM_LANG_CXX98_FLAG\n#define GLM_LANG_CXX03\t\t\t(GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG)\n#define GLM_LANG_CXX0X\t\t\t(GLM_LANG_CXX03 | GLM_LANG_CXX0X_FLAG)\n#define GLM_LANG_CXX11\t\t\t(GLM_LANG_CXX0X | GLM_LANG_CXX11_FLAG)\n#define GLM_LANG_CXX1Y\t\t\t(GLM_LANG_CXX11 | GLM_LANG_CXX1Y_FLAG)\n#define GLM_LANG_CXX14\t\t\t(GLM_LANG_CXX1Y | GLM_LANG_CXX14_FLAG)\n#define GLM_LANG_CXX1Z\t\t\t(GLM_LANG_CXX14 | GLM_LANG_CXX1Z_FLAG)\n#define GLM_LANG_CXXMS\t\t\tGLM_LANG_CXXMS_FLAG\n#define GLM_LANG_CXXGNU\t\t\tGLM_LANG_CXXGNU_FLAG\n\n#if defined(GLM_FORCE_CXX14)\n#\tif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER <= GLM_COMPILER_GCC50)) || ((GLM_COMPILER & GLM_COMPILER_CLANG) && (GLM_COMPILER <= GLM_COMPILER_CLANG34))\n#\t\t\tpragma message(\"GLM: Using GLM_FORCE_CXX14 with a compiler that doesn't fully support C++14\")\n#\telif GLM_COMPILER & GLM_COMPILER_VC\n#\t\t\tpragma message(\"GLM: Using GLM_FORCE_CXX14 but there is no known version of Visual C++ compiler that fully supports C++14\")\n#\telif GLM_COMPILER & GLM_COMPILER_INTEL\n#\t\t\tpragma message(\"GLM: Using GLM_FORCE_CXX14 but there is no known version of ICC compiler that fully supports C++14\")\n#\tendif\n#\tdefine GLM_LANG GLM_LANG_CXX14\n#\tdefine GLM_LANG_STL11_FORCED\n#elif defined(GLM_FORCE_CXX11)\n#\tif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER <= GLM_COMPILER_GCC48)) || ((GLM_COMPILER & GLM_COMPILER_CLANG) && (GLM_COMPILER <= GLM_COMPILER_CLANG33))\n#\t\t\tpragma message(\"GLM: Using GLM_FORCE_CXX11 with a compiler that doesn't fully support C++11\")\n#\telif GLM_COMPILER & GLM_COMPILER_VC\n#\t\t\tpragma message(\"GLM: Using GLM_FORCE_CXX11 but there is no known version of Visual C++ compiler that fully supports C++11\")\n#\telif GLM_COMPILER & GLM_COMPILER_INTEL\n#\t\t\tpragma message(\"GLM: Using GLM_FORCE_CXX11 but there is no known version of ICC compiler that fully supports C++11\")\n#\tendif\n#\tdefine GLM_LANG GLM_LANG_CXX11\n#\tdefine GLM_LANG_STL11_FORCED\n#elif defined(GLM_FORCE_CXX03)\n#\tdefine GLM_LANG GLM_LANG_CXX03\n#elif defined(GLM_FORCE_CXX98)\n#\tdefine GLM_LANG GLM_LANG_CXX98\n#else\n#\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\tif __cplusplus >= 201402L // GLM_COMPILER_CLANG34 + -std=c++14\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX14\n#\t\telif __has_feature(cxx_decltype_auto) && __has_feature(cxx_aggregate_nsdmi) // GLM_COMPILER_CLANG33 + -std=c++1y\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX1Y\n#\t\telif __cplusplus >= 201103L // GLM_COMPILER_CLANG33 + -std=c++11\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX11\n#\t\telif __has_feature(cxx_static_assert) // GLM_COMPILER_CLANG29 + -std=c++11\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX0X\n#\t\telif __cplusplus >= 199711L\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX98\n#\t\telse\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX\n#\t\tendif\n#\telif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\tif __cplusplus >= 201402L\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX14\n#\t\telif __cplusplus >= 201103L\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX11\n#\t\telif defined(__GXX_EXPERIMENTAL_CXX0X__)\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX0X\n#\t\telse\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX98\n#\t\tendif\n#\telif GLM_COMPILER & GLM_COMPILER_VC\n#\t\tifdef _MSC_EXTENSIONS\n#\t\t\tif __cplusplus >= 201402L\n#\t\t\t\tdefine GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_CXXMS_FLAG)\n#\t\t\telif __cplusplus >= 201103L\n#\t\t\t\tdefine GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_CXXMS_FLAG)\n#\t\t\telse\n#\t\t\t\tdefine GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_CXXMS_FLAG)\n#\t\t\tendif\n#\t\telse\n#\t\t\tif __cplusplus >= 201402L\n#\t\t\t\tdefine GLM_LANG GLM_LANG_CXX14\n#\t\t\telif __cplusplus >= 201103L\n#\t\t\t\tdefine GLM_LANG GLM_LANG_CXX11\n#\t\t\telse\n#\t\t\t\tdefine GLM_LANG GLM_LANG_CXX0X\n#\t\t\tendif\n#\t\tendif\n#\telif GLM_COMPILER & GLM_COMPILER_INTEL\n#\t\tifdef _MSC_EXTENSIONS\n#\t\t\tdefine GLM_MSC_EXT GLM_LANG_CXXMS_FLAG\n#\t\telse\n#\t\t\tdefine GLM_MSC_EXT 0\n#\t\tendif\n#\t\tif __cplusplus >= 201402L\n#\t\t\tdefine GLM_LANG (GLM_LANG_CXX14 | GLM_MSC_EXT)\n#\t\telif __cplusplus >= 201103L\n#\t\t\tdefine GLM_LANG (GLM_LANG_CXX11 | GLM_MSC_EXT)\n#\t\telif __INTEL_CXX11_MODE__\n#\t\t\tdefine GLM_LANG (GLM_LANG_CXX0X | GLM_MSC_EXT)\n#\t\telif __cplusplus >= 199711L\n#\t\t\tdefine GLM_LANG (GLM_LANG_CXX98 | GLM_MSC_EXT)\n#\t\telse\n#\t\t\tdefine GLM_LANG (GLM_LANG_CXX | GLM_MSC_EXT)\n#\t\tendif\n#\telif GLM_COMPILER & GLM_COMPILER_CUDA\n#\t\tifdef _MSC_EXTENSIONS\n#\t\t\tdefine GLM_MSC_EXT GLM_LANG_CXXMS_FLAG\n#\t\telse\n#\t\t\tdefine GLM_MSC_EXT 0\n#\t\tendif\n#\t\tif GLM_COMPILER >= GLM_COMPILER_CUDA75\n#\t\t\tdefine GLM_LANG (GLM_LANG_CXX0X | GLM_MSC_EXT)\n#\t\telse\n#\t\t\tdefine GLM_LANG (GLM_LANG_CXX98 | GLM_MSC_EXT)\n#\t\tendif\n#\telse // Unknown compiler\n#\t\tif __cplusplus >= 201402L\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX14\n#\t\telif __cplusplus >= 201103L\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX11\n#\t\telif __cplusplus >= 199711L\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX98\n#\t\telse\n#\t\t\tdefine GLM_LANG GLM_LANG_CXX // Good luck with that!\n#\t\tendif\n#\t\tifndef GLM_FORCE_PURE\n#\t\t\tdefine GLM_FORCE_PURE\n#\t\tendif\n#\tendif\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_LANG_DISPLAYED)\n#\tdefine GLM_MESSAGE_LANG_DISPLAYED\n\n#\tif GLM_LANG & GLM_LANG_CXX1Z_FLAG\n#\t\tpragma message(\"GLM: C++1z\")\n#\telif GLM_LANG & GLM_LANG_CXX14_FLAG\n#\t\tpragma message(\"GLM: C++14\")\n#\telif GLM_LANG & GLM_LANG_CXX1Y_FLAG\n#\t\tpragma message(\"GLM: C++1y\")\n#\telif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\t\tpragma message(\"GLM: C++11\")\n#\telif GLM_LANG & GLM_LANG_CXX0X_FLAG\n#\t\tpragma message(\"GLM: C++0x\")\n#\telif GLM_LANG & GLM_LANG_CXX03_FLAG\n#\t\tpragma message(\"GLM: C++03\")\n#\telif GLM_LANG & GLM_LANG_CXX98_FLAG\n#\t\tpragma message(\"GLM: C++98\")\n#\telse\n#\t\tpragma message(\"GLM: C++ language undetected\")\n#\tendif//GLM_LANG\n\n#\tif GLM_LANG & (GLM_LANG_CXXGNU_FLAG | GLM_LANG_CXXMS_FLAG)\n#\t\tpragma message(\"GLM: Language extensions enabled\")\n#\tendif//GLM_LANG\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// Has of C++ features\n\n// http://clang.llvm.org/cxx_status.html\n// http://gcc.gnu.org/projects/cxx0x.html\n// http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.120).aspx\n\n// Android has multiple STLs but C++11 STL detection doesn't always work #284 #564\n#if GLM_PLATFORM == GLM_PLATFORM_ANDROID && !defined(GLM_LANG_STL11_FORCED)\n#\tdefine GLM_HAS_CXX11_STL 0\n#elif GLM_COMPILER & GLM_COMPILER_CLANG\n#\tif (defined(_LIBCPP_VERSION) && GLM_LANG & GLM_LANG_CXX11_FLAG) || defined(GLM_LANG_STL11_FORCED)\n#\t\tdefine GLM_HAS_CXX11_STL 1\n#\telse\n#\t\tdefine GLM_HAS_CXX11_STL 0\n#\tendif\n#else\n#\tdefine GLM_HAS_CXX11_STL ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \\\n\t\t((GLM_PLATFORM != GLM_PLATFORM_WINDOWS) && (GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15))))\n#endif\n\n// N1720\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_STATIC_ASSERT __has_feature(cxx_static_assert)\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_STATIC_ASSERT 1\n#else\n#\tdefine GLM_HAS_STATIC_ASSERT ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC))))\n#endif\n\n// N1988\n#if GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_EXTENDED_INTEGER_TYPE 1\n#else\n#\tdefine GLM_HAS_EXTENDED_INTEGER_TYPE (\\\n\t\t((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC)) || \\\n\t\t((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CUDA)) || \\\n\t\t((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC)) || \\\n\t\t((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CLANG)))\n#endif\n\n// N2235\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_CONSTEXPR __has_feature(cxx_constexpr)\n#\tdefine GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_CONSTEXPR 1\n#\tdefine GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR\n#else\n#\tdefine GLM_HAS_CONSTEXPR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)))) // GCC 4.6 support constexpr but there is a compiler bug causing a crash\n#\tdefine GLM_HAS_CONSTEXPR_PARTIAL (GLM_HAS_CONSTEXPR || ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14)))\n#endif\n\n// N2672\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_INITIALIZER_LISTS __has_feature(cxx_generalized_initializers)\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_INITIALIZER_LISTS 1\n#else\n#\tdefine GLM_HAS_INITIALIZER_LISTS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA75))))\n#endif\n\n// N2544 Unrestricted unions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions)\n#elif GLM_LANG & (GLM_LANG_CXX11_FLAG | GLM_LANG_CXXMS_FLAG)\n#\tdefine GLM_HAS_UNRESTRICTED_UNIONS 1\n#else\n#\tdefine GLM_HAS_UNRESTRICTED_UNIONS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_LANG & GLM_LANG_CXXMS_FLAG)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA75)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)))\n#endif\n\n// N2346\n#if defined(GLM_FORCE_UNRESTRICTED_GENTYPE)\n#\tdefine GLM_HAS_DEFAULTED_FUNCTIONS 0\n#elif GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_DEFAULTED_FUNCTIONS __has_feature(cxx_defaulted_functions)\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_DEFAULTED_FUNCTIONS 1\n#else\n#\tdefine GLM_HAS_DEFAULTED_FUNCTIONS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_INTEL)) || \\\n\t\t(GLM_COMPILER & GLM_COMPILER_CUDA)))\n#endif\n\n// N2118\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_RVALUE_REFERENCES __has_feature(cxx_rvalue_references)\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_RVALUE_REFERENCES 1\n#else\n#\tdefine GLM_HAS_RVALUE_REFERENCES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA))))\n#endif\n\n// N2437 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_EXPLICIT_CONVERSION_OPERATORS __has_feature(cxx_explicit_conversions)\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_EXPLICIT_CONVERSION_OPERATORS 1\n#else\n#\tdefine GLM_HAS_EXPLICIT_CONVERSION_OPERATORS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA))))\n#endif\n\n// N2258 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_TEMPLATE_ALIASES __has_feature(cxx_alias_templates)\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_TEMPLATE_ALIASES 1\n#else\n#\tdefine GLM_HAS_TEMPLATE_ALIASES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_INTEL)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC47)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA))))\n#endif\n\n// N2930 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_RANGE_FOR __has_feature(cxx_range_for)\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_RANGE_FOR 1\n#else\n#\tdefine GLM_HAS_RANGE_FOR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_INTEL)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA))))\n#endif\n\n// N2341 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf\n#if GLM_COMPILER & GLM_COMPILER_CLANG\n#\tdefine GLM_HAS_ALIGNOF __has_feature(c_alignof)\n#elif GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_ALIGNOF 1\n#else\n#\tdefine GLM_HAS_ALIGNOF ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA70))))\n#endif\n\n#define GLM_HAS_ONLY_XYZW ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER < GLM_COMPILER_GCC46))\n#if GLM_HAS_ONLY_XYZW\n#\tpragma message(\"GLM: GCC older than 4.6 has a bug presenting the use of rgba and stpq components\")\n#endif\n\n//\n#if GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_ASSIGNABLE 1\n#else\n#\tdefine GLM_HAS_ASSIGNABLE ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC49))))\n#endif\n\n//\n#define GLM_HAS_TRIVIAL_QUERIES 0\n\n//\n#if GLM_LANG & GLM_LANG_CXX11_FLAG\n#\tdefine GLM_HAS_MAKE_SIGNED 1\n#else\n#\tdefine GLM_HAS_MAKE_SIGNED ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_CUDA))))\n#endif\n\n#if GLM_ARCH == GLM_ARCH_PURE\n#\tdefine GLM_HAS_BITSCAN_WINDOWS 0\n#else\n#\tdefine GLM_HAS_BITSCAN_WINDOWS ((GLM_PLATFORM & GLM_PLATFORM_WINDOWS) && (\\\n\t\t((GLM_COMPILER & GLM_COMPILER_INTEL)) || \\\n\t\t((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14) && (GLM_ARCH & GLM_ARCH_X86_BIT))))\n#endif\n\n// OpenMP\n#ifdef _OPENMP\n#\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\tif GLM_COMPILER >= GLM_COMPILER_GCC61\n#\t\t\tdefine GLM_HAS_OPENMP 45\n#\t\telif GLM_COMPILER >= GLM_COMPILER_GCC49\n#\t\t\tdefine GLM_HAS_OPENMP 40\n#\t\telif GLM_COMPILER >= GLM_COMPILER_GCC47\n#\t\t\tdefine GLM_HAS_OPENMP 31\n#\t\telse\n#\t\t\tdefine GLM_HAS_OPENMP 0\n#\t\tendif\n#\telif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\tif GLM_COMPILER >= GLM_COMPILER_CLANG38\n#\t\t\tdefine GLM_HAS_OPENMP 31\n#\t\telse\n#\t\t\tdefine GLM_HAS_OPENMP 0\n#\t\tendif\n#\telif GLM_COMPILER & GLM_COMPILER_VC\n#\t\tdefine GLM_HAS_OPENMP 20\n#\telif GLM_COMPILER & GLM_COMPILER_INTEL\n#\t\tif GLM_COMPILER >= GLM_COMPILER_INTEL16\n#\t\t\tdefine GLM_HAS_OPENMP 40\n#\t\telse\n#\t\t\tdefine GLM_HAS_OPENMP 0\n#\t\tendif\n#\telse\n#\t\tdefine GLM_HAS_OPENMP 0\n#\tendif\n#else\n#\tdefine GLM_HAS_OPENMP 0\n#endif\n\n///////////////////////////////////////////////////////////////////////////////////\n// Static assert\n\n#if GLM_HAS_STATIC_ASSERT\n#\tdefine GLM_STATIC_ASSERT(x, message) static_assert(x, message)\n#elif GLM_COMPILER & GLM_COMPILER_VC\n#\tdefine GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1]\n#else\n#\tdefine GLM_STATIC_ASSERT(x, message)\n#\tdefine GLM_STATIC_ASSERT_NULL\n#endif//GLM_LANG\n\n///////////////////////////////////////////////////////////////////////////////////\n// Qualifiers\n\n#if GLM_COMPILER & GLM_COMPILER_CUDA\n#\tdefine GLM_CUDA_FUNC_DEF __device__ __host__\n#\tdefine GLM_CUDA_FUNC_DECL __device__ __host__\n#else\n#\tdefine GLM_CUDA_FUNC_DEF\n#\tdefine GLM_CUDA_FUNC_DECL\n#endif\n\n#if GLM_COMPILER & GLM_COMPILER_GCC\n#\tdefine GLM_VAR_USED __attribute__ ((unused))\n#else\n#\tdefine GLM_VAR_USED\n#endif\n\n#if defined(GLM_FORCE_INLINE)\n#\tif GLM_COMPILER & GLM_COMPILER_VC\n#\t\tdefine GLM_INLINE __forceinline\n#\t\tdefine GLM_NEVER_INLINE __declspec((noinline))\n#\telif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)\n#\t\tdefine GLM_INLINE inline __attribute__((__always_inline__))\n#\t\tdefine GLM_NEVER_INLINE __attribute__((__noinline__))\n#\telif GLM_COMPILER & GLM_COMPILER_CUDA\n#\t\tdefine GLM_INLINE __forceinline__\n#\t\tdefine GLM_NEVER_INLINE __noinline__\n#\telse\n#\t\tdefine GLM_INLINE inline\n#\t\tdefine GLM_NEVER_INLINE\n#\tendif//GLM_COMPILER\n#else\n#\tdefine GLM_INLINE inline\n#\tdefine GLM_NEVER_INLINE\n#endif//defined(GLM_FORCE_INLINE)\n\n#define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL\n#define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE\n\n///////////////////////////////////////////////////////////////////////////////////\n// Swizzle operators\n\n// User defines: GLM_FORCE_SWIZZLE\n\n#define GLM_SWIZZLE_ENABLED 1\n#define GLM_SWIZZLE_DISABLE 0\n\n#if defined(GLM_FORCE_SWIZZLE)\n#\tdefine GLM_SWIZZLE GLM_SWIZZLE_ENABLED\n#else\n#\tdefine GLM_SWIZZLE GLM_SWIZZLE_DISABLE\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_SWIZZLE_DISPLAYED)\n#\tdefine GLM_MESSAGE_SWIZZLE_DISPLAYED\n#\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n#\t\tpragma message(\"GLM: Swizzling operators enabled\")\n#\telse\n#\t\tpragma message(\"GLM: Swizzling operators disabled, #define GLM_SWIZZLE to enable swizzle operators\")\n#\tendif\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// Allows using not basic types as genType\n\n// #define GLM_FORCE_UNRESTRICTED_GENTYPE\n\n#ifdef GLM_FORCE_UNRESTRICTED_GENTYPE\n#\tdefine GLM_UNRESTRICTED_GENTYPE 1\n#else\n#\tdefine GLM_UNRESTRICTED_GENTYPE 0\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_UNRESTRICTED_GENTYPE_DISPLAYED)\n#\tdefine GLM_MESSAGE_UNRESTRICTED_GENTYPE_DISPLAYED\n#\tifdef GLM_FORCE_UNRESTRICTED_GENTYPE\n#\t\tpragma message(\"GLM: Use unrestricted genType\")\n#\tendif\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// Force single only (remove explicit float64 types)\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_SINGLE_ONLY_DISPLAYED)\n#\tdefine GLM_MESSAGE_SINGLE_ONLY_DISPLAYED\n#\tifdef GLM_FORCE_SINGLE_ONLY\n#\t\tpragma message(\"GLM: Using only single precision floating-point types\")\n#\tendif\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// Clip control\n\n#define GLM_DEPTH_ZERO_TO_ONE\t\t\t\t0x00000001\n#define GLM_DEPTH_NEGATIVE_ONE_TO_ONE\t\t0x00000002\n\n#ifdef GLM_FORCE_DEPTH_ZERO_TO_ONE\n#\tdefine GLM_DEPTH_CLIP_SPACE GLM_DEPTH_ZERO_TO_ONE\n#else\n#\tdefine GLM_DEPTH_CLIP_SPACE GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_DEPTH_DISPLAYED)\n#\tdefine GLM_MESSAGE_DEPTH_DISPLAYED\n#\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n#\t\tpragma message(\"GLM: Depth clip space: Zero to one\")\n#\telse\n#\t\tpragma message(\"GLM: Depth clip space: negative one to one\")\n#\tendif\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// Coordinate system, define GLM_FORCE_LEFT_HANDED before including GLM\n// to use left handed coordinate system by default.\n\n#define GLM_LEFT_HANDED\t\t\t\t0x00000001\t// For DirectX, Metal, Vulkan\n#define GLM_RIGHT_HANDED\t\t\t0x00000002\t// For OpenGL, default in GLM\n\n#ifdef GLM_FORCE_LEFT_HANDED\n#\tdefine GLM_COORDINATE_SYSTEM GLM_LEFT_HANDED\n#else\n#\tdefine GLM_COORDINATE_SYSTEM GLM_RIGHT_HANDED\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_HANDED_DISPLAYED)\n#\tdefine GLM_MESSAGE_HANDED_DISPLAYED\n#\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n#\t\tpragma message(\"GLM: Coordinate system: left handed\")\n#\telse\n#\t\tpragma message(\"GLM: Coordinate system: right handed\")\n#\tendif\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// Qualifiers\n\n#if (GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))\n#\tdefine GLM_DEPRECATED __declspec(deprecated)\n#\tdefine GLM_ALIGN(x) __declspec(align(x))\n#\tdefine GLM_ALIGNED_STRUCT(x) struct __declspec(align(x))\n#\tdefine GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef __declspec(align(alignment)) type name\n#\tdefine GLM_RESTRICT_FUNC __declspec(restrict)\n#\tdefine GLM_RESTRICT __restrict\n#\tif GLM_COMPILER >= GLM_COMPILER_VC12\n#\t\tdefine GLM_VECTOR_CALL __vectorcall\n#\telse\n#\t\tdefine GLM_VECTOR_CALL\n#\tendif\n#elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG | GLM_COMPILER_INTEL)\n#\tdefine GLM_DEPRECATED __attribute__((__deprecated__))\n#\tdefine GLM_ALIGN(x) __attribute__((aligned(x)))\n#\tdefine GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x)))\n#\tdefine GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __attribute__((aligned(alignment)))\n#\tdefine GLM_RESTRICT_FUNC __restrict__\n#\tdefine GLM_RESTRICT __restrict__\n#\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\tif GLM_COMPILER >= GLM_COMPILER_CLANG37\n#\t\t\tdefine GLM_VECTOR_CALL __vectorcall\n#\t\telse\n#\t\t\tdefine GLM_VECTOR_CALL\n#\t\tendif\n#\telse\n#\t\tdefine GLM_VECTOR_CALL\n#\tendif\n#elif GLM_COMPILER & GLM_COMPILER_CUDA\n#\tdefine GLM_DEPRECATED\n#\tdefine GLM_ALIGN(x) __align__(x)\n#\tdefine GLM_ALIGNED_STRUCT(x) struct __align__(x)\n#\tdefine GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __align__(x)\n#\tdefine GLM_RESTRICT_FUNC __restrict__\n#\tdefine GLM_RESTRICT __restrict__\n#\tdefine GLM_VECTOR_CALL\n#else\n#\tdefine GLM_DEPRECATED\n#\tdefine GLM_ALIGN\n#\tdefine GLM_ALIGNED_STRUCT(x) struct\n#\tdefine GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name\n#\tdefine GLM_RESTRICT_FUNC\n#\tdefine GLM_RESTRICT\n#\tdefine GLM_VECTOR_CALL\n#endif//GLM_COMPILER\n\n#if GLM_HAS_DEFAULTED_FUNCTIONS\n#\tdefine GLM_DEFAULT = default\n#else\n#\tdefine GLM_DEFAULT\n#endif\n\n#if GLM_HAS_CONSTEXPR || GLM_HAS_CONSTEXPR_PARTIAL\n#\tdefine GLM_CONSTEXPR constexpr\n#\tif ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER <= GLM_COMPILER_VC14)) // Visual C++ has a bug #594 https://github.com/g-truc/glm/issues/594\n#\t\tdefine GLM_CONSTEXPR_CTOR\n#\telse\n#\t\tdefine GLM_CONSTEXPR_CTOR constexpr\n#\tendif\n#else\n#\tdefine GLM_CONSTEXPR\n#\tdefine GLM_CONSTEXPR_CTOR\n#endif\n\n#if GLM_HAS_CONSTEXPR\n#\tdefine GLM_RELAXED_CONSTEXPR constexpr\n#else\n#\tdefine GLM_RELAXED_CONSTEXPR const\n#endif\n\n#if GLM_ARCH == GLM_ARCH_PURE\n#\tdefine GLM_CONSTEXPR_SIMD GLM_CONSTEXPR_CTOR\n#else\n#\tdefine GLM_CONSTEXPR_SIMD\n#endif\n\n#ifdef GLM_FORCE_EXPLICIT_CTOR\n#\tdefine GLM_EXPLICIT explicit\n#else\n#\tdefine GLM_EXPLICIT\n#endif\n\n///////////////////////////////////////////////////////////////////////////////////\n\n#define GLM_HAS_ALIGNED_TYPE GLM_HAS_UNRESTRICTED_UNIONS\n\n///////////////////////////////////////////////////////////////////////////////////\n// Length type: all length functions returns a length_t type.\n// When GLM_FORCE_SIZE_T_LENGTH is defined, length_t is a typedef of size_t otherwise\n// length_t is a typedef of int like GLSL defines it.\n\n// User define: GLM_FORCE_SIZE_T_LENGTH\n\nnamespace glm\n{\n\tusing std::size_t;\n#\tif defined(GLM_FORCE_SIZE_T_LENGTH)\n\t\ttypedef size_t length_t;\n#\telse\n\t\ttypedef int length_t;\n#\tendif\n}//namespace glm\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_FORCE_SIZE_T_LENGTH)\n#\tdefine GLM_MESSAGE_FORCE_SIZE_T_LENGTH\n#\tif defined GLM_FORCE_SIZE_T_LENGTH\n#\t\tpragma message(\"GLM: .length() returns glm::length_t, a typedef of std::size_t\")\n#\telse\n#\t\tpragma message(\"GLM: .length() returns glm::length_t, a typedef of int following the GLSL specification\")\n#\tendif\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// countof\n\n#if GLM_HAS_CONSTEXPR_PARTIAL\n\tnamespace glm\n\t{\n\t\ttemplate<typename T, std::size_t N>\n\t\tconstexpr std::size_t countof(T const (&)[N])\n\t\t{\n\t\t\treturn N;\n\t\t}\n\t}//namespace glm\n#\tdefine GLM_COUNTOF(arr) glm::countof(arr)\n#elif defined(_MSC_VER)\n#\tdefine GLM_COUNTOF(arr) _countof(arr)\n#else\n#\tdefine GLM_COUNTOF(arr) sizeof(arr) / sizeof(arr[0])\n#endif\n\n///////////////////////////////////////////////////////////////////////////////////\n// Check inclusions of different versions of GLM\n\n#elif ((GLM_SETUP_INCLUDED != GLM_VERSION) && !defined(GLM_FORCE_IGNORE_VERSION))\t\n#\terror \"GLM error: A different version of GLM is already included. Define GLM_FORCE_IGNORE_VERSION before including GLM headers to ignore this error.\"\n#elif GLM_SETUP_INCLUDED == GLM_VERSION\n\n#endif//GLM_SETUP_INCLUDED\n"
  },
  {
    "path": "external/glm/glm/detail/type_float.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_float.hpp\n\n#pragma once\n\n#include \"setup.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttypedef float\t\t\t\tfloat32;\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\t\ttypedef double\t\t\tfloat64;\n#\tendif//GLM_FORCE_SINGLE_ONLY\n}//namespace detail\n\t\n\ttypedef float\t\t\t\tlowp_float_t;\n\ttypedef float\t\t\t\tmediump_float_t;\n\ttypedef double\t\t\t\thighp_float_t;\n\n\t/// @addtogroup core_precision\n\t/// @{\n\n\t/// Low qualifier floating-point numbers. \n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef lowp_float_t\t\tlowp_float;\n\n\t/// Medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef mediump_float_t\t\tmediump_float;\n\n\t/// High qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef highp_float_t\t\thighp_float;\n\n#if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef mediump_float\t\tfloat_t;\n#elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef highp_float\t\t\tfloat_t;\n#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef mediump_float\t\tfloat_t;\n#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef lowp_float\t\t\tfloat_t;\n#else\n#\terror \"GLM error: multiple default precision requested for floating-point types\"\n#endif\n\n\ttypedef float\t\t\t\tfloat32;\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\t\ttypedef double\t\t\t\tfloat64;\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n////////////////////\n// check type sizes\n#ifndef GLM_STATIC_ASSERT_NULL\n\tGLM_STATIC_ASSERT(sizeof(glm::float32) == 4, \"float32 size isn't 4 bytes on this platform\");\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\t\tGLM_STATIC_ASSERT(sizeof(glm::float64) == 8, \"float64 size isn't 8 bytes on this platform\");\n#\tendif//GLM_FORCE_SINGLE_ONLY\n#endif//GLM_STATIC_ASSERT_NULL\n\n\t/// @}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_gentype.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_gentype.hpp\n\n#pragma once\n\nnamespace glm\n{\n\tenum profile\n\t{\n\t\tnice,\n\t\tfast,\n\t\tsimd\n\t};\n\n\ttypedef std::size_t sizeType;\n\t\nnamespace detail\n{\n\ttemplate\n\t<\n\t\ttypename VALTYPE, \n\t\ttemplate<typename> class TYPE\n\t>\n\tstruct genType\n\t{\n\tpublic:\n\t\tenum ctor{null};\n\n\t\ttypedef VALTYPE value_type;\n\t\ttypedef VALTYPE & value_reference;\n\t\ttypedef VALTYPE * value_pointer;\n\t\ttypedef VALTYPE const * value_const_pointer;\n\t\ttypedef TYPE<bool> bool_type;\n\n\t\ttypedef sizeType size_type;\n\t\tstatic bool is_vector();\n\t\tstatic bool is_matrix();\n\t\t\n\t\ttypedef TYPE<VALTYPE> type;\n\t\ttypedef TYPE<VALTYPE> * pointer;\n\t\ttypedef TYPE<VALTYPE> const * const_pointer;\n\t\ttypedef TYPE<VALTYPE> const * const const_pointer_const;\n\t\ttypedef TYPE<VALTYPE> * const pointer_const;\n\t\ttypedef TYPE<VALTYPE> & reference;\n\t\ttypedef TYPE<VALTYPE> const& const_reference;\n\t\ttypedef TYPE<VALTYPE> const& param_type;\n\n\t\t//////////////////////////////////////\n\t\t// Address (Implementation details)\n\n\t\tvalue_const_pointer value_address() const{return value_pointer(this);}\n\t\tvalue_pointer value_address(){return value_pointer(this);}\n\n\t//protected:\n\t//\tenum kind\n\t//\t{\n\t//\t\tGEN_TYPE,\n\t//\t\tVEC_TYPE,\n\t//\t\tMAT_TYPE\n\t//\t};\n\n\t//\ttypedef typename TYPE::kind kind;\n\t};\n\n\ttemplate\n\t<\n\t\ttypename VALTYPE, \n\t\ttemplate<typename> class TYPE\n\t>\n\tbool genType<VALTYPE, TYPE>::is_vector()\n\t{\n\t\treturn true;\n\t}\n/*\n\ttemplate<typename valTypeT, unsigned int colT, unsigned int rowT, profile proT = nice>\n\tclass base\n\t{\n\tpublic:\n\t\t//////////////////////////////////////\n\t\t// Traits\n\n\t\ttypedef sizeType\t\t\t\t\t\t\tsize_type;\n\t\ttypedef valTypeT\t\t\t\t\t\t\tvalue_type;\n\n\t\ttypedef base<value_type, colT, rowT>\t\tclass_type;\n\n\t\ttypedef base<bool, colT, rowT>\t\t\t\tbool_type;\n\t\ttypedef base<value_type, rowT, 1>\t\t\tcol_type;\n\t\ttypedef base<value_type, colT, 1>\t\t\trow_type;\n\t\ttypedef base<value_type, rowT, colT>\t\ttranspose_type;\n\n\t\tstatic size_type\t\t\t\t\t\t\tcol_size();\n\t\tstatic size_type\t\t\t\t\t\t\trow_size();\n\t\tstatic size_type\t\t\t\t\t\t\tvalue_size();\n\t\tstatic bool\t\t\t\t\t\t\t\t\tis_scalar();\n\t\tstatic bool\t\t\t\t\t\t\t\t\tis_vector();\n\t\tstatic bool\t\t\t\t\t\t\t\t\tis_matrix();\n\n\tprivate:\n\t\t// Data \n\t\tcol_type value[colT];\t\t\n\n\tpublic:\n\t\t//////////////////////////////////////\n\t\t// Constructors\n\t\tbase();\n\t\tbase(class_type const& m);\n\n\t\texplicit base(T const& x);\n\t\texplicit base(value_type const * const x);\n\t\texplicit base(col_type const * const x);\n\n\t\t//////////////////////////////////////\n\t\t// Conversions\n\t\ttemplate<typename vU, uint cU, uint rU, profile pU>\n\t\texplicit base(base<vU, cU, rU, pU> const& m);\n\n\t\t//////////////////////////////////////\n\t\t// Accesses\n\t\tcol_type& operator[](size_type i);\n\t\tcol_type const& operator[](size_type i) const;\n\n\t\t//////////////////////////////////////\n\t\t// Unary updatable operators\n\t\tclass_type& operator=  (class_type const& x);\n\t\tclass_type& operator+= (T const& x);\n\t\tclass_type& operator+= (class_type const& x);\n\t\tclass_type& operator-= (T const& x);\n\t\tclass_type& operator-= (class_type const& x);\n\t\tclass_type& operator*= (T const& x);\n\t\tclass_type& operator*= (class_type const& x);\n\t\tclass_type& operator/= (T const& x);\n\t\tclass_type& operator/= (class_type const& x);\n\t\tclass_type& operator++ ();\n\t\tclass_type& operator-- ();\n\t};\n*/\n\t\n\t//template<typename T>\n\t//struct traits\n\t//{\n\t//\tstatic const bool is_signed = false;\n\t//\tstatic const bool is_float = false;\n\t//\tstatic const bool is_vector = false;\n\t//\tstatic const bool is_matrix = false;\n\t//\tstatic const bool is_genType = false;\n\t//\tstatic const bool is_genIType = false;\n\t//\tstatic const bool is_genUType = false;\n\t//};\n\t\n\t//template<>\n\t//struct traits<half>\n\t//{\n\t//\tstatic const bool is_float = true;\n\t//\tstatic const bool is_genType = true;\n\t//};\n\t\n\t//template<>\n\t//struct traits<float>\n\t//{\n\t//\tstatic const bool is_float = true;\n\t//\tstatic const bool is_genType = true;\n\t//};\n\t\n\t//template<>\n\t//struct traits<double>\n\t//{\n\t//\tstatic const bool is_float = true;\n\t//\tstatic const bool is_genType = true;\n\t//};\n\t\n\t//template<typename genType>\n\t//struct desc\n\t//{\n\t//\ttypedef genType\t\t\t\t\t\t\ttype;\n\t//\ttypedef genType *\t\t\t\t\t\tpointer;\n\t//\ttypedef genType const*\t\t\t\t\tconst_pointer;\n\t//\ttypedef genType const *const\t\t\tconst_pointer_const;\n\t//\ttypedef genType *const\t\t\t\t\tpointer_const;\n\t//\ttypedef genType &\t\t\t\t\t\treference;\n\t//\ttypedef genType const&\t\t\t\t\tconst_reference;\n\t//\ttypedef genType const&\t\t\t\t\tparam_type;\n\t\n\t//\ttypedef typename genType::value_type\tvalue_type;\n\t//\ttypedef typename genType::size_type\t\tsize_type;\n\t//\tstatic const typename size_type\t\t\tvalue_size;\n\t//};\n\t\n\t//template<typename genType>\n\t//const typename desc<genType>::size_type desc<genType>::value_size = genType::value_size();\n\t\n}//namespace detail\n}//namespace glm\n\n//#include \"type_gentype.inl\"\n"
  },
  {
    "path": "external/glm/glm/detail/type_gentype.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_gentype.inl\n\nnamespace glm{\nnamespace detail{\n\n/////////////////////////////////\n// Static functions\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::col_size()\n{\n\treturn cT;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::row_size()\n{\n\treturn rT;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::value_size()\n{\n\treturn rT * cT;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\nbool base<vT, cT, rT, pT>::is_scalar()\n{\n\treturn rT == 1 && cT == 1;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\nbool base<vT, cT, rT, pT>::is_vector()\n{\n\treturn rT == 1;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\nbool base<vT, cT, rT, pT>::is_matrix()\n{\n\treturn rT != 1;\n}\n\n/////////////////////////////////\n// Constructor\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base()\n{\n\tmemset(&this->value, 0, cT * rT * sizeof(vT));\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base\n(\n\ttypename base<vT, cT, rT, pT>::class_type const& m\n)\n{\n\tfor\n\t(\n\t\ttypename genType<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);\n\t\ti < base<vT, cT, rT, pT>::col_size();\n\t\t++i\n\t)\n\t{\n\t\tthis->value[i] = m[i];\n\t}\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base\n(\n\ttypename base<vT, cT, rT, pT>::T const& x\n)\n{\n\tif(rT == 1) // vector\n\t{\n\t\tfor\n\t\t(\n\t\t\ttypename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);\n\t\t\ti < base<vT, cT, rT, pT>::col_size();\n\t\t\t++i\n\t\t)\n\t\t{\n\t\t\tthis->value[i][rT] = x;\n\t\t}\n\t}\n\telse // matrix\n\t{\n\t\tmemset(&this->value, 0, cT * rT * sizeof(vT));\n\n\t\ttypename base<vT, cT, rT, pT>::size_type stop = cT < rT ? cT : rT;\n\n\t\tfor\n\t\t(\n\t\t\ttypename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);\n\t\t\ti < stop;\n\t\t\t++i\n\t\t)\n\t\t{\n\t\t\tthis->value[i][i] = x;\n\t\t}\n\t}\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base\n(\n\ttypename base<vT, cT, rT, pT>::value_type const * const x\n)\n{\n\tmemcpy(&this->value, &x.value, cT * rT * sizeof(vT));\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base\n(\n\ttypename base<vT, cT, rT, pT>::col_type const * const x\n)\n{\n\tfor\n\t(\n\t\ttypename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);\n\t\ti < base<vT, cT, rT, pT>::col_size();\n\t\t++i\n\t)\n\t{\n\t\tthis->value[i] = x[i];\n\t}\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntemplate<typename vU, uint cU, uint rU, profile pU>\nbase<vT, cT, rT, pT>::base\n(\n\tbase<vU, cU, rU, pU> const& m\n)\n{\n\tfor\n\t(\n\t\ttypename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);\n\t\ti < base<vT, cT, rT, pT>::col_size();\n\t\t++i\n\t)\n\t{\n\t\tthis->value[i] = base<vT, cT, rT, pT>(m[i]);\n\t}\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::col_type& base<vT, cT, rT, pT>::operator[]\n(\n\ttypename base<vT, cT, rT, pT>::size_type i\n)\n{\n\treturn this->value[i];\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::col_type const& base<vT, cT, rT, pT>::operator[]\n(\n\ttypename base<vT, cT, rT, pT>::size_type i\n) const\n{\n\treturn this->value[i];\n}\n\n//////////////////////////////////////\n// Unary updatable operators\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator= \n(\n\ttypename base<vT, cT, rT, pT>::class_type const& x\n)\n{\n\tmemcpy(&this->value, &x.value, cT * rT * sizeof(vT));\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= \n(\n\ttypename base<vT, cT, rT, pT>::T const& x\n)\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\tthis->value[j][i] += x;\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= \n(\n\ttypename base<vT, cT, rT, pT>::class_type const& x\n)\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\tthis->value[j][i] += x[j][i];\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= \n(\n\ttypename base<vT, cT, rT, pT>::T const& x\n)\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\tthis->value[j][i] -= x;\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= \n(\n\ttypename base<vT, cT, rT, pT>::class_type const& x\n)\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\tthis->value[j][i] -= x[j][i];\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= \n(\n\ttypename base<vT, cT, rT, pT>::T const& x\n)\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\tthis->value[j][i] *= x;\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= \n(\n\ttypename base<vT, cT, rT, pT>::class_type const& x\n)\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\tthis->value[j][i] *= x[j][i];\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= \n(\n\ttypename base<vT, cT, rT, pT>::T const& x\n)\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\tthis->value[j][i] /= x;\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= \n(\n\ttypename base<vT, cT, rT, pT>::class_type const& x\n)\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\tthis->value[j][i] /= x[j][i];\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator++ ()\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\t++this->value[j][i];\n\n\treturn *this;\n}\n\ntemplate<typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-- ()\n{\n\ttypename base<vT, cT, rT, pT>::size_type stop_col = col_size();\n\ttypename base<vT, cT, rT, pT>::size_type stop_row = row_size();\n\n\tfor(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n\tfor(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n\t\t--this->value[j][i];\n\n\treturn *this;\n}\n\n} //namespace detail\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_half.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_half.hpp\n\n#pragma once\n\n#include \"setup.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttypedef short hdata;\n\n\tGLM_FUNC_DECL float toFloat32(hdata value);\n\tGLM_FUNC_DECL hdata toFloat16(float const& value);\n\n}//namespace detail\n}//namespace glm\n\n#include \"type_half.inl\"\n"
  },
  {
    "path": "external/glm/glm/detail/type_half.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_half.inl\n\nnamespace glm{\nnamespace detail\n{\n\tGLM_FUNC_QUALIFIER float overflow()\n\t{\n\t\tvolatile float f = 1e10;\n\n\t\tfor(int i = 0; i < 10; ++i)\t\n\t\t\tf *= f; // this will overflow before the for loop terminates\n\t\treturn f;\n\t}\n\n\tunion uif32\n\t{\n\t\tGLM_FUNC_QUALIFIER uif32() :\n\t\t\ti(0)\n\t\t{}\n\n\t\tGLM_FUNC_QUALIFIER uif32(float f_) :\n\t\t\tf(f_)\n\t\t{}\n\n\t\tGLM_FUNC_QUALIFIER uif32(uint32 i_) :\n\t\t\ti(i_)\n\t\t{}\n\n\t\tfloat f;\n\t\tuint32 i;\n\t};\n\n\tGLM_FUNC_QUALIFIER float toFloat32(hdata value)\n\t{\n\t\tint s = (value >> 15) & 0x00000001;\n\t\tint e = (value >> 10) & 0x0000001f;\n\t\tint m =  value        & 0x000003ff;\n\n\t\tif(e == 0)\n\t\t{\n\t\t\tif(m == 0)\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// Plus or minus zero\n\t\t\t\t//\n\n\t\t\t\tdetail::uif32 result;\n\t\t\t\tresult.i = static_cast<unsigned int>(s << 31);\n\t\t\t\treturn result.f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// Denormalized number -- renormalize it\n\t\t\t\t//\n\n\t\t\t\twhile(!(m & 0x00000400))\n\t\t\t\t{\n\t\t\t\t\tm <<= 1;\n\t\t\t\t\te -=  1;\n\t\t\t\t}\n\n\t\t\t\te += 1;\n\t\t\t\tm &= ~0x00000400;\n\t\t\t}\n\t\t}\n\t\telse if(e == 31)\n\t\t{\n\t\t\tif(m == 0)\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// Positive or negative infinity\n\t\t\t\t//\n\n\t\t\t\tuif32 result;\n\t\t\t\tresult.i = static_cast<unsigned int>((s << 31) | 0x7f800000);\n\t\t\t\treturn result.f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// Nan -- preserve sign and significand bits\n\t\t\t\t//\n\n\t\t\t\tuif32 result;\n\t\t\t\tresult.i = static_cast<unsigned int>((s << 31) | 0x7f800000 | (m << 13));\n\t\t\t\treturn result.f;\n\t\t\t}\n\t\t}\n\n\t\t//\n\t\t// Normalized number\n\t\t//\n\n\t\te = e + (127 - 15);\n\t\tm = m << 13;\n\n\t\t//\n\t\t// Assemble s, e and m.\n\t\t//\n\n\t\tuif32 Result;\n\t\tResult.i = static_cast<unsigned int>((s << 31) | (e << 23) | m);\n\t\treturn Result.f;\n\t}\n\n\tGLM_FUNC_QUALIFIER hdata toFloat16(float const& f)\n\t{\n\t\tuif32 Entry;\n\t\tEntry.f = f;\n\t\tint i = static_cast<int>(Entry.i);\n\n\t\t//\n\t\t// Our floating point number, f, is represented by the bit\n\t\t// pattern in integer i.  Disassemble that bit pattern into\n\t\t// the sign, s, the exponent, e, and the significand, m.\n\t\t// Shift s into the position where it will go in in the\n\t\t// resulting half number.\n\t\t// Adjust e, accounting for the different exponent bias\n\t\t// of float and half (127 versus 15).\n\t\t//\n\n\t\tint s =  (i >> 16) & 0x00008000;\n\t\tint e = ((i >> 23) & 0x000000ff) - (127 - 15);\n\t\tint m =   i        & 0x007fffff;\n\n\t\t//\n\t\t// Now reassemble s, e and m into a half:\n\t\t//\n\n\t\tif(e <= 0)\n\t\t{\n\t\t\tif(e < -10)\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// E is less than -10.  The absolute value of f is\n\t\t\t\t// less than half_MIN (f may be a small normalized\n\t\t\t\t// float, a denormalized float or a zero).\n\t\t\t\t//\n\t\t\t\t// We convert f to a half zero.\n\t\t\t\t//\n\n\t\t\t\treturn hdata(s);\n\t\t\t}\n\n\t\t\t//\n\t\t\t// E is between -10 and 0.  F is a normalized float,\n\t\t\t// whose magnitude is less than __half_NRM_MIN.\n\t\t\t//\n\t\t\t// We convert f to a denormalized half.\n\t\t\t// \n\n\t\t\tm = (m | 0x00800000) >> (1 - e);\n\n\t\t\t//\n\t\t\t// Round to nearest, round \"0.5\" up.\n\t\t\t//\n\t\t\t// Rounding may cause the significand to overflow and make\n\t\t\t// our number normalized.  Because of the way a half's bits\n\t\t\t// are laid out, we don't have to treat this case separately;\n\t\t\t// the code below will handle it correctly.\n\t\t\t// \n\n\t\t\tif(m & 0x00001000) \n\t\t\t\tm += 0x00002000;\n\n\t\t\t//\n\t\t\t// Assemble the half from s, e (zero) and m.\n\t\t\t//\n\n\t\t\treturn hdata(s | (m >> 13));\n\t\t}\n\t\telse if(e == 0xff - (127 - 15))\n\t\t{\n\t\t\tif(m == 0)\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// F is an infinity; convert f to a half\n\t\t\t\t// infinity with the same sign as f.\n\t\t\t\t//\n\n\t\t\t\treturn hdata(s | 0x7c00);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//\n\t\t\t\t// F is a NAN; we produce a half NAN that preserves\n\t\t\t\t// the sign bit and the 10 leftmost bits of the\n\t\t\t\t// significand of f, with one exception: If the 10\n\t\t\t\t// leftmost bits are all zero, the NAN would turn \n\t\t\t\t// into an infinity, so we have to set at least one\n\t\t\t\t// bit in the significand.\n\t\t\t\t//\n\n\t\t\t\tm >>= 13;\n\n\t\t\t\treturn hdata(s | 0x7c00 | m | (m == 0));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//\n\t\t\t// E is greater than zero.  F is a normalized float.\n\t\t\t// We try to convert f to a normalized half.\n\t\t\t//\n\n\t\t\t//\n\t\t\t// Round to nearest, round \"0.5\" up\n\t\t\t//\n\n\t\t\tif(m &  0x00001000)\n\t\t\t{\n\t\t\t\tm += 0x00002000;\n\n\t\t\t\tif(m & 0x00800000)\n\t\t\t\t{\n\t\t\t\t\tm =  0;     // overflow in significand,\n\t\t\t\t\te += 1;     // adjust exponent\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//\n\t\t\t// Handle exponent overflow\n\t\t\t//\n\n\t\t\tif (e > 30)\n\t\t\t{\n\t\t\t\toverflow();        // Cause a hardware floating point overflow;\n\n\t\t\t\treturn hdata(s | 0x7c00);\n\t\t\t\t// if this returns, the half becomes an\n\t\t\t}   // infinity with the same sign as f.\n\n\t\t\t//\n\t\t\t// Assemble the half from s, e and m.\n\t\t\t//\n\n\t\t\treturn hdata(s | (e << 10) | (m >> 13));\n\t\t}\n\t}\n\n}//namespace detail\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_int.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_int.hpp\n\n#pragma once\n\n#include \"setup.hpp\"\n#if GLM_HAS_MAKE_SIGNED\n#\tinclude <type_traits>\n#endif\n\n#if GLM_HAS_EXTENDED_INTEGER_TYPE\n#\tinclude <cstdint>\n#endif\n\nnamespace glm{\nnamespace detail\n{\n#\tif GLM_HAS_EXTENDED_INTEGER_TYPE\n\t\ttypedef std::int8_t\t\t\t\t\tint8;\n\t\ttypedef std::int16_t\t\t\t\tint16;\n\t\ttypedef std::int32_t\t\t\t\tint32;\n\t\ttypedef std::int64_t\t\t\t\tint64;\n\t\n\t\ttypedef std::uint8_t\t\t\t\tuint8;\n\t\ttypedef std::uint16_t\t\t\t\tuint16;\n\t\ttypedef std::uint32_t\t\t\t\tuint32;\n\t\ttypedef std::uint64_t\t\t\t\tuint64;\n#\telse\n#\t\tif(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available\n\t\t\ttypedef int64_t\t\t\t\t\tsint64;\n\t\t\ttypedef uint64_t\t\t\t\tuint64;\n\t\n#\t\telif GLM_COMPILER & GLM_COMPILER_VC\n\t\t\ttypedef signed __int64\t\t\tsint64;\n\t\t\ttypedef unsigned __int64\t\tuint64;\n\t\n#\t\telif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\tpragma GCC diagnostic ignored \"-Wlong-long\"\n\t\t\t__extension__ typedef signed long long\t\tsint64;\n\t\t\t__extension__ typedef unsigned long long\tuint64;\n\t\n#\t\telif (GLM_COMPILER & GLM_COMPILER_CLANG)\n#\t\t\tpragma clang diagnostic ignored \"-Wc++11-long-long\"\n\t\t\ttypedef signed long\tlong\t\tsint64;\n\t\t\ttypedef unsigned long long\t\tuint64;\n\t\n#\t\telse//unknown compiler\n\t\t\ttypedef signed long\tlong\t\tsint64;\n\t\t\ttypedef unsigned long long\t\tuint64;\n#\t\tendif//GLM_COMPILER\n\t\t\n\t\ttypedef signed char\t\t\t\t\tint8;\n\t\ttypedef signed short\t\t\t\tint16;\n\t\ttypedef signed int\t\t\t\t\tint32;\n\t\ttypedef sint64\t\t\t\t\t\tint64;\n\t\n\t\ttypedef unsigned char\t\t\t\tuint8;\n\t\ttypedef unsigned short\t\t\t\tuint16;\n\t\ttypedef unsigned int\t\t\t\tuint32;\n\t\ttypedef uint64\t\t\t\t\t\tuint64;\n#endif//\n\t\n\ttypedef signed int\t\t\t\t\t\tlowp_int_t;\n\ttypedef signed int\t\t\t\t\t\tmediump_int_t;\n\ttypedef signed int\t\t\t\t\t\thighp_int_t;\n\t\n\ttypedef unsigned int\t\t\t\t\tlowp_uint_t;\n\ttypedef unsigned int\t\t\t\t\tmediump_uint_t;\n\ttypedef unsigned int\t\t\t\t\thighp_uint_t;\n\n#\tif GLM_HAS_MAKE_SIGNED\n\t\tusing std::make_signed;\n\t\tusing std::make_unsigned;\n\n#\telse//GLM_HAS_MAKE_SIGNED\n\t\ttemplate<typename genType>\n\t\tstruct make_signed\n\t\t{};\n\n\t\ttemplate<>\n\t\tstruct make_signed<char>\n\t\t{\n\t\t\ttypedef char type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_signed<short>\n\t\t{\n\t\t\ttypedef short type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_signed<int>\n\t\t{\n\t\t\ttypedef int type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_signed<long>\n\t\t{\n\t\t\ttypedef long type;\n\t\t};\n\t\n\t\ttemplate<>\n\t\tstruct make_signed<unsigned char>\n\t\t{\n\t\t\ttypedef char type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_signed<unsigned short>\n\t\t{\n\t\t\ttypedef short type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_signed<unsigned int>\n\t\t{\n\t\t\ttypedef int type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_signed<unsigned long>\n\t\t{\n\t\t\ttypedef long type;\n\t\t};\n\n\t\ttemplate<typename genType>\n\t\tstruct make_unsigned\n\t\t{};\n\n\t\ttemplate<>\n\t\tstruct make_unsigned<char>\n\t\t{\n\t\t\ttypedef unsigned char type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_unsigned<short>\n\t\t{\n\t\t\ttypedef unsigned short type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_unsigned<int>\n\t\t{\n\t\t\ttypedef unsigned int type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_unsigned<long>\n\t\t{\n\t\t\ttypedef unsigned long type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_unsigned<unsigned char>\n\t\t{\n\t\t\ttypedef unsigned char type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_unsigned<unsigned short>\n\t\t{\n\t\t\ttypedef unsigned short type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_unsigned<unsigned int>\n\t\t{\n\t\t\ttypedef unsigned int type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_unsigned<unsigned long>\n\t\t{\n\t\t\ttypedef unsigned long type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct make_signed<long long>\n\t\t{\n\t\t\ttypedef long long type;\n\t\t};\n\t\n\t\ttemplate<>\n\t\tstruct make_signed<unsigned long long>\n\t\t{\n\t\t\ttypedef long long type;\n\t\t};\n\t\n\t\ttemplate<>\n\t\tstruct make_unsigned<long long>\n\t\t{\n\t\t\ttypedef unsigned long long type;\n\t\t};\n\t\n\t\ttemplate<>\n\t\tstruct make_unsigned<unsigned long long>\n\t\t{\n\t\t\ttypedef unsigned long long type;\n\t\t};\n#\tendif//GLM_HAS_MAKE_SIGNED\n}//namespace detail\n\n\ttypedef detail::int8\t\t\t\t\tint8;\n\ttypedef detail::int16\t\t\t\t\tint16;\n\ttypedef detail::int32\t\t\t\t\tint32;\n\ttypedef detail::int64\t\t\t\t\tint64;\n\t\n\ttypedef detail::uint8\t\t\t\t\tuint8;\n\ttypedef detail::uint16\t\t\t\t\tuint16;\n\ttypedef detail::uint32\t\t\t\t\tuint32;\n\ttypedef detail::uint64\t\t\t\t\tuint64;\n\n\t/// @addtogroup core_precision\n\t/// @{\n\n\t/// Low qualifier signed integer. \n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef detail::lowp_int_t\t\t\t\tlowp_int;\n\n\t/// Medium qualifier signed integer. \n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef detail::mediump_int_t\t\t\tmediump_int;\n\n\t/// High qualifier signed integer.\n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef detail::highp_int_t\t\t\t\thighp_int;\n\n\t/// Low qualifier unsigned integer. \n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef detail::lowp_uint_t\t\t\t\tlowp_uint;\n\n\t/// Medium qualifier unsigned integer. \n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef detail::mediump_uint_t\t\t\tmediump_uint;\n\n\t/// High qualifier unsigned integer. \n\t/// There is no guarantee on the actual qualifier.\n\t/// \n\t/// @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>\n\t/// @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>\n\ttypedef detail::highp_uint_t\t\t\thighp_uint;\n\n#if(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))\n\ttypedef mediump_int\t\t\t\t\tint_t;\n#elif(defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))\n\ttypedef highp_int\t\t\t\t\tint_t;\n#elif(!defined(GLM_PRECISION_HIGHP_INT) && defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))\n\ttypedef mediump_int\t\t\t\t\tint_t;\n#elif(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_int\t\t\t\t\tint_t;\n#else\n#\terror \"GLM error: multiple default precision requested for signed integer types\"\n#endif\n\n#if(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef mediump_uint\t\t\t\tuint_t;\n#elif(defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef highp_uint\t\t\t\t\tuint_t;\n#elif(!defined(GLM_PRECISION_HIGHP_UINT) && defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef mediump_uint\t\t\t\tuint_t;\n#elif(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef lowp_uint\t\t\t\t\tuint_t;\n#else\n#\terror \"GLM error: multiple default precision requested for unsigned integer types\"\n#endif\n\n\t/// Unsigned integer type.\n\t/// \n\t/// @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>\n\ttypedef unsigned int\t\t\t\tuint;\n\n\t/// @}\n\n////////////////////\n// check type sizes\n#ifndef GLM_STATIC_ASSERT_NULL\n\tGLM_STATIC_ASSERT(sizeof(glm::int8) == 1, \"int8 size isn't 1 byte on this platform\");\n\tGLM_STATIC_ASSERT(sizeof(glm::int16) == 2, \"int16 size isn't 2 bytes on this platform\");\n\tGLM_STATIC_ASSERT(sizeof(glm::int32) == 4, \"int32 size isn't 4 bytes on this platform\");\n\tGLM_STATIC_ASSERT(sizeof(glm::int64) == 8, \"int64 size isn't 8 bytes on this platform\");\n\n\tGLM_STATIC_ASSERT(sizeof(glm::uint8) == 1, \"uint8 size isn't 1 byte on this platform\");\n\tGLM_STATIC_ASSERT(sizeof(glm::uint16) == 2, \"uint16 size isn't 2 bytes on this platform\");\n\tGLM_STATIC_ASSERT(sizeof(glm::uint32) == 4, \"uint32 size isn't 4 bytes on this platform\");\n\tGLM_STATIC_ASSERT(sizeof(glm::uint64) == 8, \"uint64 size isn't 8 bytes on this platform\");\n#endif//GLM_STATIC_ASSERT_NULL\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat.hpp\n\n#pragma once\n\n#include \"qualifier.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tstruct outerProduct_trait{};\n}//namespace detail\n\n#if GLM_HAS_TEMPLATE_ALIASES\n\ttemplate <typename T, qualifier Q = defaultp> using tmat2x2 = mat<2, 2, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tmat2x3 = mat<2, 3, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tmat2x4 = mat<2, 4, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tmat3x2 = mat<3, 2, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tmat3x3 = mat<3, 3, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tmat3x4 = mat<3, 4, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tmat4x2 = mat<4, 2, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tmat4x3 = mat<4, 3, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tmat4x4 = mat<4, 4, T, Q>;\n#endif//GLM_HAS_TEMPLATE_ALIASES\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<C, R, T, Q> inverse(mat<C, R, T, Q> const& m);\n\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 2 columns of 2 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, lowp>\t\tlowp_mat2;\n\t\n\t/// 2 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, mediump>\tmediump_mat2;\n\t\n\t/// 2 columns of 2 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, highp>\t\thighp_mat2;\n\t\n\t/// 2 columns of 2 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, lowp>\t\tlowp_mat2x2;\n\t\n\t/// 2 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, mediump>\tmediump_mat2x2;\n\t\n\t/// 2 columns of 2 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, highp>\t\thighp_mat2x2;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 2 columns of 3 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, float, lowp>\t\tlowp_mat2x3;\n\t\n\t/// 2 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, float, mediump>\tmediump_mat2x3;\n\t\n\t/// 2 columns of 3 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, float, highp>\t\thighp_mat2x3;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 2 columns of 4 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, float, lowp>\t\tlowp_mat2x4;\n\t\n\t/// 2 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, float, mediump>\tmediump_mat2x4;\n\t\n\t/// 2 columns of 4 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, float, highp>\t\thighp_mat2x4;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 3 columns of 2 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, float, lowp>\t\tlowp_mat3x2;\n\t\n\t/// 3 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, float, mediump>\tmediump_mat3x2;\n\t\n\t/// 3 columns of 2 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, float, highp>\t\thighp_mat3x2;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 3 columns of 3 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, lowp>\t\tlowp_mat3;\n\t\n\t/// 3 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, mediump>\tmediump_mat3;\n\t\n\t/// 3 columns of 3 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, highp>\t\thighp_mat3;\n\t\n\t/// 3 columns of 3 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, lowp>\t\tlowp_mat3x3;\n\t\n\t/// 3 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, mediump>\tmediump_mat3x3;\n\t\n\t/// 3 columns of 3 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, highp>\t\thighp_mat3x3;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 3 columns of 4 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, float, lowp>\t\tlowp_mat3x4;\n\t\n\t/// 3 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, float, mediump>\tmediump_mat3x4;\n\t\n\t/// 3 columns of 4 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, float, highp>\t\thighp_mat3x4;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 4 columns of 2 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, float, lowp>\t\tlowp_mat4x2;\n\t\n\t/// 4 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, float, mediump>\tmediump_mat4x2;\n\t\n\t/// 4 columns of 2 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, float, highp>\t\thighp_mat4x2;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 4 columns of 3 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, float, lowp>\t\tlowp_mat4x3;\n\t\n\t/// 4 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, float, mediump>\tmediump_mat4x3;\n\t\n\t/// 4 columns of 3 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, float, highp>\t\thighp_mat4x3;\n\t\n\t/// @}\n\t\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 4 columns of 4 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, lowp>\t\tlowp_mat4;\n\t\n\t/// 4 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, mediump>\tmediump_mat4;\n\t\n\t/// 4 columns of 4 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, highp>\t\thighp_mat4;\n\t\n\t/// 4 columns of 4 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, lowp>\t\tlowp_mat4x4;\n\t\n\t/// 4 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, mediump>\tmediump_mat4x4;\n\t\n\t/// 4 columns of 4 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, highp>\t\thighp_mat4x4;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_types\n\t/// @{\n\t\n\t//////////////////////////\n\t// Float definition\n\t\n#if(defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef lowp_mat2x2\t\t\tmat2x2;\n\ttypedef lowp_mat2x3\t\t\tmat2x3;\n\ttypedef lowp_mat2x4\t\t\tmat2x4;\n\ttypedef lowp_mat3x2\t\t\tmat3x2;\n\ttypedef lowp_mat3x3\t\t\tmat3x3;\n\ttypedef lowp_mat3x4\t\t\tmat3x4;\n\ttypedef lowp_mat4x2\t\t\tmat4x2;\n\ttypedef lowp_mat4x3\t\t\tmat4x3;\n\ttypedef lowp_mat4x4\t\t\tmat4x4;\n#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))\n\ttypedef mediump_mat2x2\t\tmat2x2;\n\ttypedef mediump_mat2x3\t\tmat2x3;\n\ttypedef mediump_mat2x4\t\tmat2x4;\n\ttypedef mediump_mat3x2\t\tmat3x2;\n\ttypedef mediump_mat3x3\t\tmat3x3;\n\ttypedef mediump_mat3x4\t\tmat3x4;\n\ttypedef mediump_mat4x2\t\tmat4x2;\n\ttypedef mediump_mat4x3\t\tmat4x3;\n\ttypedef mediump_mat4x4\t\tmat4x4;\n#else\t\n\t//! 2 columns of 2 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat2x2\t\t\tmat2x2;\n\t\n\t//! 2 columns of 3 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat2x3\t\t\tmat2x3;\n\t\n\t//! 2 columns of 4 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat2x4\t\t\tmat2x4;\n\t\n\t//! 3 columns of 2 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat3x2\t\t\tmat3x2;\n\t\n\t//! 3 columns of 3 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat3x3\t\t\tmat3x3;\n\t\n\t//! 3 columns of 4 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat3x4\t\t\tmat3x4;\n\t\n\t//! 4 columns of 2 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat4x2\t\t\tmat4x2;\n\t\n\t//! 4 columns of 3 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat4x3\t\t\tmat4x3;\n\t\n\t//! 4 columns of 4 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_mat4x4\t\t\tmat4x4;\n\t\n#endif//GLM_PRECISION\n\t\n\t//! 2 columns of 2 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef mat2x2\t\t\t\t\tmat2;\n\t\n\t//! 3 columns of 3 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef mat3x3\t\t\t\t\tmat3;\n\t\n\t//! 4 columns of 4 components matrix of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef mat4x4\t\t\t\t\tmat4;\n\t\t\n\t//////////////////////////\n\t// Double definition\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 2 columns of 2 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, double, lowp>\t\tlowp_dmat2;\n\t\n\t/// 2 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, double, mediump>\tmediump_dmat2;\n\t\n\t/// 2 columns of 2 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, double, highp>\t\thighp_dmat2;\n\t\n\t/// 2 columns of 2 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, double, lowp>\t\tlowp_dmat2x2;\n\t\n\t/// 2 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, double, mediump>\tmediump_dmat2x2;\n\t\n\t/// 2 columns of 2 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, double, highp>\t\thighp_dmat2x2;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 2 columns of 3 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, double, lowp>\t\tlowp_dmat2x3;\n\t\n\t/// 2 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, double, mediump>\tmediump_dmat2x3;\n\t\n\t/// 2 columns of 3 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, double, highp>\t\thighp_dmat2x3;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 2 columns of 4 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, double, lowp>\t\tlowp_dmat2x4;\n\t\n\t/// 2 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, double, mediump>\tmediump_dmat2x4;\n\t\n\t/// 2 columns of 4 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, double, highp>\t\thighp_dmat2x4;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 3 columns of 2 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, double, lowp>\t\tlowp_dmat3x2;\n\t\n\t/// 3 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, double, mediump>\tmediump_dmat3x2;\n\t\n\t/// 3 columns of 2 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, double, highp>\t\thighp_dmat3x2;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 3 columns of 3 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, lowp>\t\tlowp_dmat3;\n\t\n\t/// 3 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, double, mediump>\tmediump_dmat3;\n\t\n\t/// 3 columns of 3 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, double, highp>\t\thighp_dmat3;\n\t\n\t/// 3 columns of 3 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, double, lowp>\t\tlowp_dmat3x3;\n\t\n\t/// 3 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, double, mediump>\tmediump_dmat3x3;\n\t\n\t/// 3 columns of 3 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, double, highp>\t\thighp_dmat3x3;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 3 columns of 4 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, double, lowp>\t\tlowp_dmat3x4;\n\t\n\t/// 3 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, double, mediump>\tmediump_dmat3x4;\n\t\n\t/// 3 columns of 4 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, double, highp>\t\thighp_dmat3x4;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 4 columns of 2 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, double, lowp>\t\tlowp_dmat4x2;\n\t\n\t/// 4 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, double, mediump>\tmediump_dmat4x2;\n\t\n\t/// 4 columns of 2 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, double, highp>\t\thighp_dmat4x2;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 4 columns of 3 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, double, lowp>\t\tlowp_dmat4x3;\n\t\n\t/// 4 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, double, mediump>\tmediump_dmat4x3;\n\t\n\t/// 4 columns of 3 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, double, highp>\t\thighp_dmat4x3;\n\t\n\t/// @}\n\t\n\t/// @addtogroup core_precision\n\t/// @{\n\t\n\t/// 4 columns of 4 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, double, lowp>\t\tlowp_dmat4;\n\t\n\t/// 4 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, double, mediump>\tmediump_dmat4;\n\t\n\t/// 4 columns of 4 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, double, highp>\t\thighp_dmat4;\n\t\n\t/// 4 columns of 4 components matrix of low qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, double, lowp>\t\tlowp_dmat4x4;\n\t\n\t/// 4 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, double, mediump>\tmediump_dmat4x4;\n\t\n\t/// 4 columns of 4 components matrix of high qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, double, highp>\t\thighp_dmat4x4;\n\t\n\t/// @}\n\t\n#if(defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef lowp_dmat2x2\t\tdmat2x2;\n\ttypedef lowp_dmat2x3\t\tdmat2x3;\n\ttypedef lowp_dmat2x4\t\tdmat2x4;\n\ttypedef lowp_dmat3x2\t\tdmat3x2;\n\ttypedef lowp_dmat3x3\t\tdmat3x3;\n\ttypedef lowp_dmat3x4\t\tdmat3x4;\n\ttypedef lowp_dmat4x2\t\tdmat4x2;\n\ttypedef lowp_dmat4x3\t\tdmat4x3;\n\ttypedef lowp_dmat4x4\t\tdmat4x4;\n#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))\n\ttypedef mediump_dmat2x2\t\tdmat2x2;\n\ttypedef mediump_dmat2x3\t\tdmat2x3;\n\ttypedef mediump_dmat2x4\t\tdmat2x4;\n\ttypedef mediump_dmat3x2\t\tdmat3x2;\n\ttypedef mediump_dmat3x3\t\tdmat3x3;\n\ttypedef mediump_dmat3x4\t\tdmat3x4;\n\ttypedef mediump_dmat4x2\t\tdmat4x2;\n\ttypedef mediump_dmat4x3\t\tdmat4x3;\n\ttypedef mediump_dmat4x4\t\tdmat4x4;\n#else //defined(GLM_PRECISION_HIGHP_DOUBLE)\n\t\n\t//! 2 * 2 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat2x2\t\tdmat2;\n\t\n\t//! 3 * 3 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat3x3\t\tdmat3;\n\t\n\t//! 4 * 4 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat4x4\t\tdmat4;\n\t\n\t//! 2 * 2 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat2x2\t\tdmat2x2;\n\t\n\t//! 2 * 3 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat2x3\t\tdmat2x3;\n\t\n\t//! 2 * 4 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat2x4\t\tdmat2x4;\n\t\n\t//! 3 * 2 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat3x2\t\tdmat3x2;\n\t\n\t/// 3 * 3 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat3x3\t\tdmat3x3;\n\t\n\t/// 3 * 4 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat3x4\t\tdmat3x4;\n\t\n\t/// 4 * 2 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat4x2\t\tdmat4x2;\n\t\n\t/// 4 * 3 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat4x3\t\tdmat4x3;\n\t\n\t/// 4 * 4 matrix of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dmat4x4\t\tdmat4x4;\n\n#endif//GLM_PRECISION\n\t\n\t/// @}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat.inl\n\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat2x2.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat2x2.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<2, 2, T, Q>\n\t{\n\t\ttypedef vec<2, T, Q> col_type;\n\t\ttypedef vec<2, T, Q> row_type;\n\t\ttypedef mat<2, 2, T, Q> type;\n\t\ttypedef mat<2, 2, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[2];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; }\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<2, 2, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<2, 2, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T scalar);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT const& x1, T const& y1,\n\t\t\tT const& x2, T const& y2);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v1,\n\t\t\tcol_type const& v2);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<typename U, typename V, typename M, typename N>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tU const& x1, V const& y1,\n\t\t\tM const& x2, N const& y2);\n\n\t\ttemplate<typename U, typename V>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<2, U, Q> const& v1,\n\t\t\tvec<2, V, Q> const& v2);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator=(mat<2, 2, T, Q> const& v) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator=(mat<2, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator+=(mat<2, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator-=(mat<2, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator*=(mat<2, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator/=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator/=(mat<2, 2, U, Q> const& m);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator++ ();\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> & operator-- ();\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<2, 2, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<2, 2, T, Q>::col_type operator*(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<2, 2, T, Q>::row_type operator*(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2);\n} //namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat2x2.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat2x2.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat2x2.inl\n\n#include \"../matrix.hpp\"\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m.value[0];\n\t\t\tthis->value[1] = m.value[1];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<2, 2, T, P> const& m)\n\t{\n\t\tthis->value[0] = m.value[0];\n\t\tthis->value[1] = m.value[1];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(T scalar)\n\t{\n\t\tthis->value[0] = col_type(scalar, 0);\n\t\tthis->value[1] = col_type(0, scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat \n\t(\n\t\tT const& x0, T const& y0,\n\t\tT const& x1, T const& y1\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0);\n\t\tthis->value[1] = col_type(x1, y1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(col_type const& v0, col_type const& v1)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename X1, typename Y1, typename X2, typename Y2>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat \n\t(\n\t\tX1 const& x1, Y1 const& y1,\n\t\tX2 const& x2, Y2 const& y2\n\t)\n\t{\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2)\n\t{\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t}\n\n\t// -- mat2x2 matrix conversions --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<2, 2, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type const& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary updatable operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator=(mat<2, 2, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator=(mat<2, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(U scalar)\n\t{\n\t\tthis->value[0] += scalar;\n\t\tthis->value[1] += scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(mat<2, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(U scalar)\n\t{\n\t\tthis->value[0] -= scalar;\n\t\tthis->value[1] -= scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(mat<2, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(U scalar)\n\t{\n\t\tthis->value[0] *= scalar;\n\t\tthis->value[1] *= scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(mat<2, 2, U, Q> const& m)\n\t{\n\t\treturn (*this = *this * m);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(U scalar)\n\t{\n\t\tthis->value[0] /= scalar;\n\t\tthis->value[1] /= scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(mat<2, 2, U, Q> const& m)\n\t{\n\t\treturn *this *= inverse(m);\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator++(int)\n\t{\n\t\tmat<2, 2, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> mat<2, 2, T, Q>::operator--(int)\n\t{\n\t\tmat<2, 2, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\t-m[0], \n\t\t\t-m[1]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm[0] - scalar,\n\t\t\tm[1] - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tscalar - m[0],\n\t\t\tscalar - m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator*\n\t(\n\t\tmat<2, 2, T, Q> const& m,\n\t\ttypename mat<2, 2, T, Q>::row_type const& v\n\t)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tm[0][0] * v.x + m[1][0] * v.y,\n\t\t\tm[0][1] * v.x + m[1][1] * v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator*\n\t(\n\t\ttypename mat<2, 2, T, Q>::col_type const& v,\n\t\tmat<2, 2, T, Q> const& m\n\t)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x * m[0][0] + v.y * m[0][1],\n\t\t\tv.x * m[1][0] + v.y * m[1][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],\n\t\t\tm1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],\n\t\t\tm1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tm[0] / scalar,\n\t\t\tm[1] / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m)\n\t{\n\t\treturn mat<2, 2, T, Q>(\n\t\t\tscalar / m[0],\n\t\t\tscalar / m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v)\n\t{\n\t\treturn inverse(m) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m)\n\t{\n\t\treturn v *  inverse(m);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)\n\t{\t\n\t\tmat<2, 2, T, Q> m1_copy(m1);\n\t\treturn m1_copy /= m2;\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat2x3.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat2x3.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<2, 3, T, Q>\n\t{\n\t\ttypedef vec<3, T, Q> col_type;\n\t\ttypedef vec<2, T, Q> row_type;\n\t\ttypedef mat<2, 3, T, Q> type;\n\t\ttypedef mat<3, 2, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[2];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; }\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<2, 3, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<2, 3, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T scalar);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT x0, T y0, T z0,\n\t\t\tT x1, T y1, T z1);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v0,\n\t\t\tcol_type const& v1);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tX1 x1, Y1 y1, Z1 z1,\n\t\t\tX2 x2, Y2 y2, Z2 z2);\n\n\t\ttemplate<typename U, typename V>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<3, U, Q> const& v1,\n\t\t\tvec<3, V, Q> const& v2);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator=(mat<2, 3, T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator=(mat<2, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator+=(mat<2, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator-=(mat<2, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator/=(U s);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator++ ();\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> & operator-- ();\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<2, 3, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator*(T scalar, mat<2, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<2, 3, T, Q>::col_type operator*(mat<2, 3, T, Q> const& m, typename mat<2, 3, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<2, 3, T, Q>::row_type operator*(typename mat<2, 3, T, Q>::col_type const& v, mat<2, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<2, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<3, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<4, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator/(mat<2, 3, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator/(T scalar, mat<2, 3, T, Q> const& m);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat2x3.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat2x3.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat2x3.inl\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m.value[0];\n\t\t\tthis->value[1] = m.value[1];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<2, 3, T, P> const& m)\n\t{\n\t\tthis->value[0] = m.value[0];\n\t\tthis->value[1] = m.value[1];\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(T scalar)\n\t{\n\t\tthis->value[0] = col_type(scalar, 0, 0);\n\t\tthis->value[1] = col_type(0, scalar, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat \n\t(\n\t\tT x0, T y0, T z0,\n\t\tT x1, T y1, T z1\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0, z0);\n\t\tthis->value[1] = col_type(x1, y1, z1);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(col_type const& v0, col_type const& v1)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<\n\t\ttypename X1, typename Y1, typename Z1,\n\t\ttypename X2, typename Y2, typename Z2>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat \n\t(\n\t\tX1 x1, Y1 y1, Z1 z1,\n\t\tX2 x2, Y2 y2, Z2 z2\n\t)\n\t{\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2)\n\t{\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t}\n\n\t// -- Matrix conversions --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<2, 3, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER  mat<2, 3, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type & mat<2, 3, T, Q>::operator[](typename mat<2, 3, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type const& mat<2, 3, T, Q>::operator[](typename mat<2, 3, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary updatable operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator=(mat<2, 3, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator=(mat<2, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator+=(U s)\n\t{\n\t\tthis->value[0] += s;\n\t\tthis->value[1] += s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator+=(mat<2, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator-=(U s)\n\t{\n\t\tthis->value[0] -= s;\n\t\tthis->value[1] -= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator-=(mat<2, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q>& mat<2, 3, T, Q>::operator*=(U s)\n\t{\n\t\tthis->value[0] *= s;\n\t\tthis->value[1] *= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator/=(U s)\n\t{\n\t\tthis->value[0] /= s;\n\t\tthis->value[1] /= s;\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> & mat<2, 3, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> mat<2, 3, T, Q>::operator++(int)\n\t{\n\t\tmat<2, 3, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> mat<2, 3, T, Q>::operator--(int)\n\t{\n\t\tmat<2, 3, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\t-m[0],\n\t\t\t-m[1]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator+(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm[0] - scalar,\n\t\t\tm[1] - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator-(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(T scalar, mat<2, 3, T, Q> const& m)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::col_type operator*\n\t(\n\t\tmat<2, 3, T, Q> const& m,\n\t\ttypename mat<2, 3, T, Q>::row_type const& v)\n\t{\n\t\treturn typename mat<2, 3, T, Q>::col_type(\n\t\t\tm[0][0] * v.x + m[1][0] * v.y,\n\t\t\tm[0][1] * v.x + m[1][1] * v.y,\n\t\t\tm[0][2] * v.x + m[1][2] * v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 3, T, Q>::row_type operator*\n\t(\n\t\ttypename mat<2, 3, T, Q>::col_type const& v,\n\t\tmat<2, 3, T, Q> const& m)\n\t{\n\t\treturn typename mat<2, 3, T, Q>::row_type(\n\t\t\tv.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2],\n\t\t\tv.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<2, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<3, 2, T, Q> const& m2)\n\t{\n\t\tT SrcA00 = m1[0][0];\n\t\tT SrcA01 = m1[0][1];\n\t\tT SrcA02 = m1[0][2];\n\t\tT SrcA10 = m1[1][0];\n\t\tT SrcA11 = m1[1][1];\n\t\tT SrcA12 = m1[1][2];\n\n\t\tT SrcB00 = m2[0][0];\n\t\tT SrcB01 = m2[0][1];\n\t\tT SrcB10 = m2[1][0];\n\t\tT SrcB11 = m2[1][1];\n\t\tT SrcB20 = m2[2][0];\n\t\tT SrcB21 = m2[2][1];\n\n\t\tmat<3, 3, T, Q> Result;\n\t\tResult[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;\n\t\tResult[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;\n\t\tResult[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;\n\t\tResult[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;\n\t\tResult[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;\n\t\tResult[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;\n\t\tResult[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;\n\t\tResult[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;\n\t\tResult[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<2, 3, T, Q> const& m1, mat<4, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],\n\t\t\tm1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],\n\t\t\tm1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],\n\t\t\tm1[0][1] * m2[3][0] + m1[1][1] * m2[3][1],\n\t\t\tm1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator/(mat<2, 3, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm[0] / scalar,\n\t\t\tm[1] / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator/(T scalar, mat<2, 3, T, Q> const& m)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tscalar / m[0],\n\t\t\tscalar / m[1]);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(mat<2, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat2x4.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat2x4.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec4.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<2, 4, T, Q>\n\t{\n\t\ttypedef vec<4, T, Q> col_type;\n\t\ttypedef vec<2, T, Q> row_type;\n\t\ttypedef mat<2, 4, T, Q> type;\n\t\ttypedef mat<4, 2, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[2];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 2; }\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<2, 4, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<2, 4, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T scalar);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT x0, T y0, T z0, T w0,\n\t\t\tT x1, T y1, T z1, T w1);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v0,\n\t\t\tcol_type const& v1);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<\n\t\t\ttypename X1, typename Y1, typename Z1, typename W1,\n\t\t\ttypename X2, typename Y2, typename Z2, typename W2>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tX1 x1, Y1 y1, Z1 z1, W1 w1,\n\t\t\tX2 x2, Y2 y2, Z2 z2, W2 w2);\n\n\t\ttemplate<typename U, typename V>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<4, U, Q> const& v1,\n\t\t\tvec<4, V, Q> const& v2);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator=(mat<2, 4, T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator=(mat<2, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator+=(mat<2, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator-=(mat<2, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator/=(U s);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator++ ();\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> & operator-- ();\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<2, 4, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator*(T scalar, mat<2, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<2, 4, T, Q>::col_type operator*(mat<2, 4, T, Q> const& m, typename mat<2, 4, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<2, 4, T, Q>::row_type operator*(typename mat<2, 4, T, Q>::col_type const& v, mat<2, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<4, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<2, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<3, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator/(mat<2, 4, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator/(T scalar, mat<2, 4, T, Q> const& m);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat2x4.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat2x4.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat2x4.inl\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m.value[0];\n\t\t\tthis->value[1] = m.value[1];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<2, 4, T, P> const& m)\n\t{\n\t\tthis->value[0] = m.value[0];\n\t\tthis->value[1] = m.value[1];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(T scalar)\n\t{\n\t\tvalue_type const Zero(0);\n\t\tthis->value[0] = col_type(scalar, Zero, Zero, Zero);\n\t\tthis->value[1] = col_type(Zero, scalar, Zero, Zero);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat\n\t(\n\t\tT x0, T y0, T z0, T w0,\n\t\tT x1, T y1, T z1, T w1\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0, z0, w0);\n\t\tthis->value[1] = col_type(x1, y1, z1, w1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(col_type const& v0, col_type const& v1)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<\n\t\ttypename X1, typename Y1, typename Z1, typename W1,\n\t\ttypename X2, typename Y2, typename Z2, typename W2>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat\n\t(\n\t\tX1 x1, Y1 y1, Z1 z1, W1 w1,\n\t\tX2 x2, Y2 y2, Z2 z2, W2 w2\n\t)\n\t{\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1), value_type(w1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2), value_type(w2));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(vec<4, V1, Q> const& v1, vec<4, V2, Q> const& v2)\n\t{\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t}\n\n\t// -- Matrix conversions --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<2, 4, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type & mat<2, 4, T, Q>::operator[](typename mat<2, 4, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type const& mat<2, 4, T, Q>::operator[](typename mat<2, 4, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary updatable operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator=(mat<2, 4, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator=(mat<2, 4, U, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator+=(U s)\n\t{\n\t\tthis->value[0] += s;\n\t\tthis->value[1] += s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator+=(mat<2, 4, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator-=(U s)\n\t{\n\t\tthis->value[0] -= s;\n\t\tthis->value[1] -= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator-=(mat<2, 4, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator*=(U s)\n\t{\n\t\tthis->value[0] *= s;\n\t\tthis->value[1] *= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> & mat<2, 4, T, Q>::operator/=(U s)\n\t{\n\t\tthis->value[0] /= s;\n\t\tthis->value[1] /= s;\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q>& mat<2, 4, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat<2, 4, T, Q>::operator++(int)\n\t{\n\t\tmat<2, 4, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat<2, 4, T, Q>::operator--(int)\n\t{\n\t\tmat<2, 4, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\t-m[0], \n\t\t\t-m[1]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator+(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm[0] - scalar,\n\t\t\tm[1] - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator-(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(T scalar, mat<2, 4, T, Q> const& m)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::col_type operator*(mat<2, 4, T, Q> const& m, typename mat<2, 4, T, Q>::row_type const& v)\n\t{\n\t\treturn typename mat<2, 4, T, Q>::col_type(\n\t\t\tm[0][0] * v.x + m[1][0] * v.y,\n\t\t\tm[0][1] * v.x + m[1][1] * v.y,\n\t\t\tm[0][2] * v.x + m[1][2] * v.y,\n\t\t\tm[0][3] * v.x + m[1][3] * v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<2, 4, T, Q>::row_type operator*(typename mat<2, 4, T, Q>::col_type const& v, mat<2, 4, T, Q> const& m)\n\t{\n\t\treturn typename mat<2, 4, T, Q>::row_type(\n\t\t\tv.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3],\n\t\t\tv.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<4, 2, T, Q> const& m2)\n\t{\n\t\tT SrcA00 = m1[0][0];\n\t\tT SrcA01 = m1[0][1];\n\t\tT SrcA02 = m1[0][2];\n\t\tT SrcA03 = m1[0][3];\n\t\tT SrcA10 = m1[1][0];\n\t\tT SrcA11 = m1[1][1];\n\t\tT SrcA12 = m1[1][2];\n\t\tT SrcA13 = m1[1][3];\n\n\t\tT SrcB00 = m2[0][0];\n\t\tT SrcB01 = m2[0][1];\n\t\tT SrcB10 = m2[1][0];\n\t\tT SrcB11 = m2[1][1];\n\t\tT SrcB20 = m2[2][0];\n\t\tT SrcB21 = m2[2][1];\n\t\tT SrcB30 = m2[3][0];\n\t\tT SrcB31 = m2[3][1];\n\n\t\tmat<4, 4, T, Q> Result;\n\t\tResult[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;\n\t\tResult[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;\n\t\tResult[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;\n\t\tResult[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01;\n\t\tResult[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;\n\t\tResult[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;\n\t\tResult[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;\n\t\tResult[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11;\n\t\tResult[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;\n\t\tResult[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;\n\t\tResult[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;\n\t\tResult[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21;\n\t\tResult[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31;\n\t\tResult[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31;\n\t\tResult[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31;\n\t\tResult[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<2, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],\n\t\t\tm1[0][3] * m2[0][0] + m1[1][3] * m2[0][1],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],\n\t\t\tm1[0][3] * m2[1][0] + m1[1][3] * m2[1][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<2, 4, T, Q> const& m1, mat<3, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],\n\t\t\tm1[0][3] * m2[0][0] + m1[1][3] * m2[0][1],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],\n\t\t\tm1[0][3] * m2[1][0] + m1[1][3] * m2[1][1],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],\n\t\t\tm1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],\n\t\t\tm1[0][3] * m2[2][0] + m1[1][3] * m2[2][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator/(mat<2, 4, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm[0] / scalar,\n\t\t\tm[1] / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator/(T scalar, mat<2, 4, T, Q> const& m)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tscalar / m[0],\n\t\t\tscalar / m[1]);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(mat<2, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat3x2.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat3x2.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<3, 2, T, Q>\n\t{\n\t\ttypedef vec<2, T, Q> col_type;\n\t\ttypedef vec<3, T, Q> row_type;\n\t\ttypedef mat<3, 2, T, Q> type;\n\t\ttypedef mat<2, 3, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[3];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; }\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<3, 2, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<3, 2, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T scalar);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT x0, T y0,\n\t\t\tT x1, T y1,\n\t\t\tT x2, T y2);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v0,\n\t\t\tcol_type const& v1,\n\t\t\tcol_type const& v2);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<\n\t\t\ttypename X1, typename Y1,\n\t\t\ttypename X2, typename Y2,\n\t\t\ttypename X3, typename Y3>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tX1 x1, Y1 y1,\n\t\t\tX2 x2, Y2 y2,\n\t\t\tX3 x3, Y3 y3);\n\n\t\ttemplate<typename V1, typename V2, typename V3>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<2, V1, Q> const& v1,\n\t\t\tvec<2, V2, Q> const& v2,\n\t\t\tvec<2, V3, Q> const& v3);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator=(mat<3, 2, T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator=(mat<3, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator+=(mat<3, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator-=(mat<3, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator/=(U s);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator++ ();\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> & operator-- ();\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<3, 2, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator*(T scalar, mat<3, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<3, 2, T, Q>::col_type operator*(mat<3, 2, T, Q> const& m, typename mat<3, 2, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<3, 2, T, Q>::row_type operator*(typename mat<3, 2, T, Q>::col_type const& v, mat<3, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<2, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<3, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<4, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator/(mat<3, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator/(T scalar, mat<3, 2, T, Q> const& m);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2);\n\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat3x2.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat3x2.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat3x2.inl\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q> \n\t\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m.value[0];\n\t\t\tthis->value[1] = m.value[1];\n\t\t\tthis->value[2] = m.value[2];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<3, 2, T, P> const& m)\n\t{\n\t\tthis->value[0] = m.value[0];\n\t\tthis->value[1] = m.value[1];\n\t\tthis->value[2] = m.value[2];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(T scalar)\n\t{\n\t\tthis->value[0] = col_type(scalar, 0);\n\t\tthis->value[1] = col_type(0, scalar);\n\t\tthis->value[2] = col_type(0, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat\n\t(\n\t\tT x0, T y0,\n\t\tT x1, T y1,\n\t\tT x2, T y2\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0);\n\t\tthis->value[1] = col_type(x1, y1);\n\t\tthis->value[2] = col_type(x2, y2);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat\n\t(\n\t\tcol_type const& v0,\n\t\tcol_type const& v1,\n\t\tcol_type const& v2\n\t)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t\tthis->value[2] = v2;\n\t}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<\n\t\ttypename X1, typename Y1,\n\t\ttypename X2, typename Y2,\n\t\ttypename X3, typename Y3>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat\n\t(\n\t\tX1 x1, Y1 y1,\n\t\tX2 x2, Y2 y2,\n\t\tX3 x3, Y3 y3\n\t)\n\t{\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2));\n\t\tthis->value[2] = col_type(static_cast<T>(x3), value_type(y3));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2, typename V3>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat\n\t(\n\t\tvec<2, V1, Q> const& v1,\n\t\tvec<2, V2, Q> const& v2,\n\t\tvec<2, V3, Q> const& v3\n\t)\n\t{\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t\tthis->value[2] = col_type(v3);\n\t}\n\n\t// -- Matrix conversions --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<3, 2, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(T(0));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(T(0));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type & mat<3, 2, T, Q>::operator[](typename mat<3, 2, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type const& mat<3, 2, T, Q>::operator[](typename mat<3, 2, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary updatable operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator=(mat<3, 2, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\tthis->value[2] = m[2];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator=(mat<3, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator+=(U s)\n\t{\n\t\tthis->value[0] += s;\n\t\tthis->value[1] += s;\n\t\tthis->value[2] += s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator+=(mat<3, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\tthis->value[2] += m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator-=(U s)\n\t{\n\t\tthis->value[0] -= s;\n\t\tthis->value[1] -= s;\n\t\tthis->value[2] -= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator-=(mat<3, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\tthis->value[2] -= m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator*=(U s)\n\t{\n\t\tthis->value[0] *= s;\n\t\tthis->value[1] *= s;\n\t\tthis->value[2] *= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> & mat<3, 2, T, Q>::operator/=(U s)\n\t{\n\t\tthis->value[0] /= s;\n\t\tthis->value[1] /= s;\n\t\tthis->value[2] /= s;\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\t++this->value[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q>& mat<3, 2, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\t--this->value[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> mat<3, 2, T, Q>::operator++(int)\n\t{\n\t\tmat<3, 2, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> mat<3, 2, T, Q>::operator--(int)\n\t{\n\t\tmat<3, 2, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\t-m[0],\n\t\t\t-m[1],\n\t\t\t-m[2]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar,\n\t\t\tm[2] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator+(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1],\n\t\t\tm1[2] + m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm[0] - scalar,\n\t\t\tm[1] - scalar,\n\t\t\tm[2] - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator-(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1],\n\t\t\tm1[2] - m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar,\n\t\t\tm[2] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(T scalar, mat<3, 2, T, Q> const& m)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar,\n\t\t\tm[2] * scalar);\n\t}\n   \n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::col_type operator*(mat<3, 2, T, Q> const& m, typename mat<3, 2, T, Q>::row_type const& v)\n\t{\n\t\treturn typename mat<3, 2, T, Q>::col_type(\n\t\t\tm[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,\n\t\t\tm[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 2, T, Q>::row_type operator*(typename mat<3, 2, T, Q>::col_type const& v, mat<3, 2, T, Q> const& m)\n\t{\n\t\treturn typename mat<3, 2, T, Q>::row_type(\n\t\t\tv.x * m[0][0] + v.y * m[0][1],\n\t\t\tv.x * m[1][0] + v.y * m[1][1],\n\t\t\tv.x * m[2][0] + v.y * m[2][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<2, 3, T, Q> const& m2)\n\t{\n\t\tconst T SrcA00 = m1[0][0];\n\t\tconst T SrcA01 = m1[0][1];\n\t\tconst T SrcA10 = m1[1][0];\n\t\tconst T SrcA11 = m1[1][1];\n\t\tconst T SrcA20 = m1[2][0];\n\t\tconst T SrcA21 = m1[2][1];\n\n\t\tconst T SrcB00 = m2[0][0];\n\t\tconst T SrcB01 = m2[0][1];\n\t\tconst T SrcB02 = m2[0][2];\n\t\tconst T SrcB10 = m2[1][0];\n\t\tconst T SrcB11 = m2[1][1];\n\t\tconst T SrcB12 = m2[1][2];\n\n\t\tmat<2, 2, T, Q> Result;\n\t\tResult[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;\n\t\tResult[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;\n\t\tResult[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;\n\t\tResult[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<3, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<3, 2, T, Q> const& m1, mat<4, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],\n\t\t\tm1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],\n\t\t\tm1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator/(mat<3, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm[0] / scalar,\n\t\t\tm[1] / scalar,\n\t\t\tm[2] / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator/(T scalar, mat<3, 2, T, Q> const& m)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tscalar / m[0],\n\t\t\tscalar / m[1],\n\t\t\tscalar / m[2]);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER bool operator!=(mat<3, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat3x3.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat3x3.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<3, 3, T, Q>\n\t{\n\t\ttypedef vec<3, T, Q> col_type;\n\t\ttypedef vec<3, T, Q> row_type;\n\t\ttypedef mat<3, 3, T, Q> type;\n\t\ttypedef mat<3, 3, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[3];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; }\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<3, 3, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<3, 3, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T scalar);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT x0, T y0, T z0,\n\t\t\tT x1, T y1, T z1,\n\t\t\tT x2, T y2, T z2);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v0,\n\t\t\tcol_type const& v1,\n\t\t\tcol_type const& v2);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<\n\t\t\ttypename X1, typename Y1, typename Z1,\n\t\t\ttypename X2, typename Y2, typename Z2,\n\t\t\ttypename X3, typename Y3, typename Z3>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tX1 x1, Y1 y1, Z1 z1,\n\t\t\tX2 x2, Y2 y2, Z2 z2,\n\t\t\tX3 x3, Y3 y3, Z3 z3);\n\n\t\ttemplate<typename V1, typename V2, typename V3>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<3, V1, Q> const& v1,\n\t\t\tvec<3, V2, Q> const& v2,\n\t\t\tvec<3, V3, Q> const& v3);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator=(mat<3, 3, T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator=(mat<3, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator+=(mat<3, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator-=(mat<3, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator*=(mat<3, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator/=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator/=(mat<3, 3, U, Q> const& m);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator++();\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> & operator--();\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<3, 3, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat3x3.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat3x3.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat3x3.inl\n\n#include \"../matrix.hpp\"\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m.value[0];\n\t\t\tthis->value[1] = m.value[1];\n\t\t\tthis->value[2] = m.value[2];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<3, 3, T, P> const& m)\n\t{\n\t\tthis->value[0] = m.value[0];\n\t\tthis->value[1] = m.value[1];\n\t\tthis->value[2] = m.value[2];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(T scalar)\n\t{\n\t\tthis->value[0] = col_type(scalar, 0, 0);\n\t\tthis->value[1] = col_type(0, scalar, 0);\n\t\tthis->value[2] = col_type(0, 0, scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat\n\t(\n\t\tT x0, T y0, T z0,\n\t\tT x1, T y1, T z1,\n\t\tT x2, T y2, T z2\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0, z0);\n\t\tthis->value[1] = col_type(x1, y1, z1);\n\t\tthis->value[2] = col_type(x2, y2, z2);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat\n\t(\n\t\tcol_type const& v0,\n\t\tcol_type const& v1,\n\t\tcol_type const& v2\n\t)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t\tthis->value[2] = v2;\n\t}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<\n\t\ttypename X1, typename Y1, typename Z1,\n\t\ttypename X2, typename Y2, typename Z2,\n\t\ttypename X3, typename Y3, typename Z3>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat\n\t(\n\t\tX1 x1, Y1 y1, Z1 z1,\n\t\tX2 x2, Y2 y2, Z2 z2,\n\t\tX3 x3, Y3 y3, Z3 z3\n\t)\n\t{\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2));\n\t\tthis->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2, typename V3>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat\n\t(\n\t\tvec<3, V1, Q> const& v1,\n\t\tvec<3, V2, Q> const& v2,\n\t\tvec<3, V3, Q> const& v3\n\t)\n\t{\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t\tthis->value[2] = col_type(v3);\n\t}\n\n\t// -- Matrix conversions --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<3, 3, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = col_type(0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(m[2], 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(m[2], 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type & mat<3, 3, T, Q>::operator[](typename mat<3, 3, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type const& mat<3, 3, T, Q>::operator[](typename mat<3, 3, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary updatable operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator=(mat<3, 3, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\tthis->value[2] = m[2];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator=(mat<3, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(U s)\n\t{\n\t\tthis->value[0] += s;\n\t\tthis->value[1] += s;\n\t\tthis->value[2] += s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(mat<3, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\tthis->value[2] += m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(U s)\n\t{\n\t\tthis->value[0] -= s;\n\t\tthis->value[1] -= s;\n\t\tthis->value[2] -= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(mat<3, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\tthis->value[2] -= m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(U s)\n\t{\n\t\tthis->value[0] *= s;\n\t\tthis->value[1] *= s;\n\t\tthis->value[2] *= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(mat<3, 3, U, Q> const& m)\n\t{\n\t\treturn (*this = *this * m);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(U s)\n\t{\n\t\tthis->value[0] /= s;\n\t\tthis->value[1] /= s;\n\t\tthis->value[2] /= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(mat<3, 3, U, Q> const& m)\n\t{\n\t\treturn *this *= inverse(m);\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\t++this->value[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\t--this->value[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat<3, 3, T, Q>::operator++(int)\n\t{\n\t\tmat<3, 3, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat<3, 3, T, Q>::operator--(int)\n\t{\n\t\tmat<3, 3, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\t-m[0], \n\t\t\t-m[1],\n\t\t\t-m[2]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar,\n\t\t\tm[2] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar,\n\t\t\tm[2] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1],\n\t\t\tm1[2] + m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tm[0] - scalar,\n\t\t\tm[1] - scalar,\n\t\t\tm[2] - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tscalar - m[0],\n\t\t\tscalar - m[1],\n\t\t\tscalar - m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1],\n\t\t\tm1[2] - m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar,\n\t\t\tm[2] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar,\n\t\t\tm[2] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v)\n\t{\n\t\treturn typename mat<3, 3, T, Q>::col_type(\n\t\t\tm[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,\n\t\t\tm[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z,\n\t\t\tm[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn typename mat<3, 3, T, Q>::row_type(\n\t\t\tm[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z,\n\t\t\tm[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z,\n\t\t\tm[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)\n\t{\n\t\tT const SrcA00 = m1[0][0];\n\t\tT const SrcA01 = m1[0][1];\n\t\tT const SrcA02 = m1[0][2];\n\t\tT const SrcA10 = m1[1][0];\n\t\tT const SrcA11 = m1[1][1];\n\t\tT const SrcA12 = m1[1][2];\n\t\tT const SrcA20 = m1[2][0];\n\t\tT const SrcA21 = m1[2][1];\n\t\tT const SrcA22 = m1[2][2];\n\n\t\tT const SrcB00 = m2[0][0];\n\t\tT const SrcB01 = m2[0][1];\n\t\tT const SrcB02 = m2[0][2];\n\t\tT const SrcB10 = m2[1][0];\n\t\tT const SrcB11 = m2[1][1];\n\t\tT const SrcB12 = m2[1][2];\n\t\tT const SrcB20 = m2[2][0];\n\t\tT const SrcB21 = m2[2][1];\n\t\tT const SrcB22 = m2[2][2];\n\n\t\tmat<3, 3, T, Q> Result;\n\t\tResult[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;\n\t\tResult[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;\n\t\tResult[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02;\n\t\tResult[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;\n\t\tResult[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;\n\t\tResult[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12;\n\t\tResult[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22;\n\t\tResult[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22;\n\t\tResult[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],\n\t\t\tm1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],\n\t\t\tm1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],\n\t\t\tm1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2],\n\t\t\tm1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m,\tT scalar)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tm[0] / scalar,\n\t\t\tm[1] / scalar,\n\t\t\tm[2] / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tscalar / m[0],\n\t\t\tscalar / m[1],\n\t\t\tscalar / m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v)\n\t{\n\t\treturn  inverse(m) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn v * inverse(m);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)\n\t{\n\t\tmat<3, 3, T, Q> m1_copy(m1);\n\t\treturn m1_copy /= m2;\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat3x4.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat3x4.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<3, 4, T, Q>\n\t{\n\t\ttypedef vec<4, T, Q> col_type;\n\t\ttypedef vec<3, T, Q> row_type;\n\t\ttypedef mat<3, 4, T, Q> type;\n\t\ttypedef mat<4, 3, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[3];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 3; }\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<3, 4, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<3, 4, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T scalar);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT x0, T y0, T z0, T w0,\n\t\t\tT x1, T y1, T z1, T w1,\n\t\t\tT x2, T y2, T z2, T w2);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v0,\n\t\t\tcol_type const& v1,\n\t\t\tcol_type const& v2);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<\n\t\t\ttypename X1, typename Y1, typename Z1, typename W1,\n\t\t\ttypename X2, typename Y2, typename Z2, typename W2,\n\t\t\ttypename X3, typename Y3, typename Z3, typename W3>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tX1 x1, Y1 y1, Z1 z1, W1 w1,\n\t\t\tX2 x2, Y2 y2, Z2 z2, W2 w2,\n\t\t\tX3 x3, Y3 y3, Z3 z3, W3 w3);\n\n\t\ttemplate<typename V1, typename V2, typename V3>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<4, V1, Q> const& v1,\n\t\t\tvec<4, V2, Q> const& v2,\n\t\t\tvec<4, V3, Q> const& v3);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator=(mat<3, 4, T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator=(mat<3, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator+=(mat<3, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator-=(mat<3, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator/=(U s);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator++();\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> & operator--();\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<3, 4, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator*(T scalar, mat<3, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<3, 4, T, Q>::col_type operator*(mat<3, 4, T, Q> const& m, typename mat<3, 4, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<3, 4, T, Q>::row_type operator*(typename mat<3, 4, T, Q>::col_type const& v, mat<3, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1,\tmat<4, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<2, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1,\tmat<3, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator/(mat<3, 4, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator/(T scalar, mat<3, 4, T, Q> const& m);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat3x4.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat3x4.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat3x4.inl\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m.value[0];\n\t\t\tthis->value[1] = m.value[1];\n\t\t\tthis->value[2] = m.value[2];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<3, 4, T, P> const& m)\n\t{\n\t\tthis->value[0] = m.value[0];\n\t\tthis->value[1] = m.value[1];\n\t\tthis->value[2] = m.value[2];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(T scalar)\n\t{\n\t\tthis->value[0] = col_type(scalar, 0, 0, 0);\n\t\tthis->value[1] = col_type(0, scalar, 0, 0);\n\t\tthis->value[2] = col_type(0, 0, scalar, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat \n\t(\n\t\tT x0, T y0, T z0, T w0,\n\t\tT x1, T y1, T z1, T w1,\n\t\tT x2, T y2, T z2, T w2\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0, z0, w0);\n\t\tthis->value[1] = col_type(x1, y1, z1, w1);\n\t\tthis->value[2] = col_type(x2, y2, z2, w2);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat \n\t(\n\t\tcol_type const& v0,\n\t\tcol_type const& v1,\n\t\tcol_type const& v2\n\t)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t\tthis->value[2] = v2;\n\t}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<\n\t\ttypename X1, typename Y1, typename Z1, typename W1,\n\t\ttypename X2, typename Y2, typename Z2, typename W2,\n\t\ttypename X3, typename Y3, typename Z3, typename W3>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat \n\t(\n\t\tX1 x1, Y1 y1, Z1 z1, W1 w1,\n\t\tX2 x2, Y2 y2, Z2 z2, W2 w2,\n\t\tX3 x3, Y3 y3, Z3 z3, W3 w3\n\t)\n\t{\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1), value_type(w1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2), value_type(w2));\n\t\tthis->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3), value_type(w3));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2, typename V3>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat \n\t(\n\t\tvec<4, V1, Q> const& v1,\n\t\tvec<4, V2, Q> const& v2,\n\t\tvec<4, V3, Q> const& v3\n\t)\n\t{\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t\tthis->value[2] = col_type(v3);\n\t}\n\t\n\t// -- Matrix conversions --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<3, 4, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t\tthis->value[2] = col_type(0, 0, 1, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(m[2], 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(0, 0, 1, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t\tthis->value[2] = col_type(m[2], 1, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(0, 0, 1, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t\tthis->value[2] = col_type(m[2], 1, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(m[2], 0);\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type & mat<3, 4, T, Q>::operator[](typename mat<3, 4, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type const& mat<3, 4, T, Q>::operator[](typename mat<3, 4, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary updatable operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator=(mat<3, 4, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\tthis->value[2] = m[2];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q> \n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator=(mat<3, 4, U, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator+=(U s)\n\t{\n\t\tthis->value[0] += s;\n\t\tthis->value[1] += s;\n\t\tthis->value[2] += s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator+=(mat<3, 4, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\tthis->value[2] += m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator-=(U s)\n\t{\n\t\tthis->value[0] -= s;\n\t\tthis->value[1] -= s;\n\t\tthis->value[2] -= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator-=(mat<3, 4, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\tthis->value[2] -= m[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator*=(U s)\n\t{\n\t\tthis->value[0] *= s;\n\t\tthis->value[1] *= s;\n\t\tthis->value[2] *= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> & mat<3, 4, T, Q>::operator/=(U s)\n\t{\n\t\tthis->value[0] /= s;\n\t\tthis->value[1] /= s;\n\t\tthis->value[2] /= s;\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\t++this->value[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q>& mat<3, 4, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\t--this->value[2];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat<3, 4, T, Q>::operator++(int)\n\t{\n\t\tmat<3, 4, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat<3, 4, T, Q>::operator--(int)\n\t{\n\t\tmat<3, 4, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\t-m[0],\n\t\t\t-m[1],\n\t\t\t-m[2]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar,\n\t\t\tm[2] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator+(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1],\n\t\t\tm1[2] + m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m,\tT scalar)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm[0] - scalar,\n\t\t\tm[1] - scalar,\n\t\t\tm[2] - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator-(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1],\n\t\t\tm1[2] - m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar,\n\t\t\tm[2] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(T scalar, mat<3, 4, T, Q> const& m)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar,\n\t\t\tm[2] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::col_type operator*\n\t(\n\t\tmat<3, 4, T, Q> const& m,\n\t\ttypename mat<3, 4, T, Q>::row_type const& v\n\t)\n\t{\n\t\treturn typename mat<3, 4, T, Q>::col_type(\n\t\t\tm[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,\n\t\t\tm[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z,\n\t\t\tm[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z,\n\t\t\tm[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<3, 4, T, Q>::row_type operator*\n\t(\n\t\ttypename mat<3, 4, T, Q>::col_type const& v,\n\t\tmat<3, 4, T, Q> const& m\n\t)\n\t{\n\t\treturn typename mat<3, 4, T, Q>::row_type(\n\t\t\tv.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3],\n\t\t\tv.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3],\n\t\t\tv.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + v.w * m[2][3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<4, 3, T, Q> const& m2)\n\t{\n\t\tconst T SrcA00 = m1[0][0];\n\t\tconst T SrcA01 = m1[0][1];\n\t\tconst T SrcA02 = m1[0][2];\n\t\tconst T SrcA03 = m1[0][3];\n\t\tconst T SrcA10 = m1[1][0];\n\t\tconst T SrcA11 = m1[1][1];\n\t\tconst T SrcA12 = m1[1][2];\n\t\tconst T SrcA13 = m1[1][3];\n\t\tconst T SrcA20 = m1[2][0];\n\t\tconst T SrcA21 = m1[2][1];\n\t\tconst T SrcA22 = m1[2][2];\n\t\tconst T SrcA23 = m1[2][3];\n\n\t\tconst T SrcB00 = m2[0][0];\n\t\tconst T SrcB01 = m2[0][1];\n\t\tconst T SrcB02 = m2[0][2];\n\t\tconst T SrcB10 = m2[1][0];\n\t\tconst T SrcB11 = m2[1][1];\n\t\tconst T SrcB12 = m2[1][2];\n\t\tconst T SrcB20 = m2[2][0];\n\t\tconst T SrcB21 = m2[2][1];\n\t\tconst T SrcB22 = m2[2][2];\n\t\tconst T SrcB30 = m2[3][0];\n\t\tconst T SrcB31 = m2[3][1];\n\t\tconst T SrcB32 = m2[3][2];\n\n\t\tmat<4, 4, T, Q> Result;\n\t\tResult[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;\n\t\tResult[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;\n\t\tResult[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02;\n\t\tResult[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01 + SrcA23 * SrcB02;\n\t\tResult[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;\n\t\tResult[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;\n\t\tResult[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12;\n\t\tResult[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11 + SrcA23 * SrcB12;\n\t\tResult[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22;\n\t\tResult[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22;\n\t\tResult[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22;\n\t\tResult[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21 + SrcA23 * SrcB22;\n\t\tResult[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31 + SrcA20 * SrcB32;\n\t\tResult[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31 + SrcA21 * SrcB32;\n\t\tResult[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31 + SrcA22 * SrcB32;\n\t\tResult[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31 + SrcA23 * SrcB32;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<2, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],\n\t\t\tm1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],\n\t\t\tm1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<3, 4, T, Q> const& m1, mat<3, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],\n\t\t\tm1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],\n\t\t\tm1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],\n\t\t\tm1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],\n\t\t\tm1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator/(mat<3, 4, T, Q> const& m,\tT scalar)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm[0] / scalar,\n\t\t\tm[1] / scalar,\n\t\t\tm[2] / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator/(T scalar, mat<3, 4, T, Q> const& m)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tscalar / m[0],\n\t\t\tscalar / m[1],\n\t\t\tscalar / m[2]);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(mat<3, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat4x2.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat4x2.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec4.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<4, 2, T, Q>\n\t{\n\t\ttypedef vec<2, T, Q> col_type;\n\t\ttypedef vec<4, T, Q> row_type;\n\t\ttypedef mat<4, 2, T, Q> type;\n\t\ttypedef mat<2, 4, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[4];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 4; }\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<4, 2, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<4, 2, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T scalar);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT x0, T y0,\n\t\t\tT x1, T y1,\n\t\t\tT x2, T y2,\n\t\t\tT x3, T y3);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v0,\n\t\t\tcol_type const& v1,\n\t\t\tcol_type const& v2,\n\t\t\tcol_type const& v3);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<\n\t\t\ttypename X1, typename Y1,\n\t\t\ttypename X2, typename Y2,\n\t\t\ttypename X3, typename Y3,\n\t\t\ttypename X4, typename Y4>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tX1 x1, Y1 y1,\n\t\t\tX2 x2, Y2 y2,\n\t\t\tX3 x3, Y3 y3,\n\t\t\tX4 x4, Y4 y4);\n\n\t\ttemplate<typename V1, typename V2, typename V3, typename V4>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<2, V1, Q> const& v1,\n\t\t\tvec<2, V2, Q> const& v2,\n\t\t\tvec<2, V3, Q> const& v3,\n\t\t\tvec<2, V4, Q> const& v4);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator=(mat<4, 2, T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator=(mat<4, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator+=(mat<4, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator-=(mat<4, 2, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator/=(U s);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator++ ();\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> & operator-- ();\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<4, 2, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m1,\tmat<4, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator*(T scalar, mat<4, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<4, 2, T, Q>::col_type operator*(mat<4, 2, T, Q> const& m, typename mat<4, 2, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<4, 2, T, Q>::row_type operator*(typename mat<4, 2, T, Q>::col_type const& v, mat<4, 2, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<2, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<3, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<4, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator/(mat<4, 2, T, Q> const& m, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> operator/(T scalar, mat<4, 2, T, Q> const& m);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat4x2.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat4x2.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat4x2.inl\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q> \n\t\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m.value[0];\n\t\t\tthis->value[1] = m.value[1];\n\t\t\tthis->value[2] = m.value[2];\n\t\t\tthis->value[3] = m.value[3];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<4, 2, T, P> const& m)\n\t{\n\t\tthis->value[0] = m.value[0];\n\t\tthis->value[1] = m.value[1];\n\t\tthis->value[2] = m.value[2];\n\t\tthis->value[3] = m.value[3];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(T scalar)\n\t{\n\t\tthis->value[0] = col_type(scalar, 0);\n\t\tthis->value[1] = col_type(0, scalar);\n\t\tthis->value[2] = col_type(0, 0);\n\t\tthis->value[3] = col_type(0, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat\n\t(\n\t\tT x0, T y0,\n\t\tT x1, T y1,\n\t\tT x2, T y2,\n\t\tT x3, T y3\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0);\n\t\tthis->value[1] = col_type(x1, y1);\n\t\tthis->value[2] = col_type(x2, y2);\n\t\tthis->value[3] = col_type(x3, y3);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat\n\t(\n\t\tcol_type const& v0,\n\t\tcol_type const& v1,\n\t\tcol_type const& v2,\n\t\tcol_type const& v3\n\t)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t\tthis->value[2] = v2;\n\t\tthis->value[3] = v3;\n\t}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<\n\t\ttypename X1, typename Y1,\n\t\ttypename X2, typename Y2,\n\t\ttypename X3, typename Y3,\n\t\ttypename X4, typename Y4>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat\n\t(\n\t\tX1 x1, Y1 y1,\n\t\tX2 x2, Y2 y2,\n\t\tX3 x3, Y3 y3,\n\t\tX4 x4, Y4 y4\n\t)\n\t{\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2));\n\t\tthis->value[2] = col_type(static_cast<T>(x3), value_type(y3));\n\t\tthis->value[3] = col_type(static_cast<T>(x4), value_type(y4));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2, typename V3, typename V4>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat\n\t(\n\t\tvec<2, V1, Q> const& v1,\n\t\tvec<2, V2, Q> const& v2,\n\t\tvec<2, V3, Q> const& v3,\n\t\tvec<2, V4, Q> const& v4\n\t)\n\t{\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t\tthis->value[2] = col_type(v3);\n\t\tthis->value[3] = col_type(v4);\n\t}\n\n\t// -- Conversion --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<4, 2, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(m[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(0);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(m[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(0);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(0);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(m[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type & mat<4, 2, T, Q>::operator[](typename mat<4, 2, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type const& mat<4, 2, T, Q>::operator[](typename mat<4, 2, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary updatable operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>& mat<4, 2, T, Q>::operator=(mat<4, 2, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\tthis->value[2] = m[2];\n\t\t\tthis->value[3] = m[3];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q>& mat<4, 2, T, Q>::operator=(mat<4, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t\tthis->value[3] = m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator+=(U s)\n\t{\n\t\tthis->value[0] += s;\n\t\tthis->value[1] += s;\n\t\tthis->value[2] += s;\n\t\tthis->value[3] += s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator+=(mat<4, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\tthis->value[2] += m[2];\n\t\tthis->value[3] += m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator-=(U s)\n\t{\n\t\tthis->value[0] -= s;\n\t\tthis->value[1] -= s;\n\t\tthis->value[2] -= s;\n\t\tthis->value[3] -= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator-=(mat<4, 2, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\tthis->value[2] -= m[2];\n\t\tthis->value[3] -= m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator*=(U s)\n\t{\n\t\tthis->value[0] *= s;\n\t\tthis->value[1] *= s;\n\t\tthis->value[2] *= s;\n\t\tthis->value[3] *= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator/=(U s)\n\t{\n\t\tthis->value[0] /= s;\n\t\tthis->value[1] /= s;\n\t\tthis->value[2] /= s;\n\t\tthis->value[3] /= s;\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\t++this->value[2];\n\t\t++this->value[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> & mat<4, 2, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\t--this->value[2];\n\t\t--this->value[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> mat<4, 2, T, Q>::operator++(int)\n\t{\n\t\tmat<4, 2, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> mat<4, 2, T, Q>::operator--(int)\n\t{\n\t\tmat<4, 2, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\t-m[0],\n\t\t\t-m[1],\n\t\t\t-m[2],\n\t\t\t-m[3]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm[0] + scalar,\n\t\t\tm[1] + scalar,\n\t\t\tm[2] + scalar,\n\t\t\tm[3] + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator+(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1],\n\t\t\tm1[2] + m2[2],\n\t\t\tm1[3] + m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm[0] - scalar,\n\t\t\tm[1] - scalar,\n\t\t\tm[2] - scalar,\n\t\t\tm[3] - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator-(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1],\n\t\t\tm1[2] - m2[2],\n\t\t\tm1[3] - m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar,\n\t\t\tm[2] * scalar,\n\t\t\tm[3] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(T scalar, mat<4, 2, T, Q> const& m)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm[0] * scalar,\n\t\t\tm[1] * scalar,\n\t\t\tm[2] * scalar,\n\t\t\tm[3] * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::col_type operator*(mat<4, 2, T, Q> const& m, typename mat<4, 2, T, Q>::row_type const& v)\n\t{\n\t\treturn typename mat<4, 2, T, Q>::col_type(\n\t\t\tm[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,\n\t\t\tm[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 2, T, Q>::row_type operator*(typename mat<4, 2, T, Q>::col_type const& v, mat<4, 2, T, Q> const& m)\n\t{\n\t\treturn typename mat<4, 2, T, Q>::row_type(\n\t\t\tv.x * m[0][0] + v.y * m[0][1],\n\t\t\tv.x * m[1][0] + v.y * m[1][1],\n\t\t\tv.x * m[2][0] + v.y * m[2][1],\n\t\t\tv.x * m[3][0] + v.y * m[3][1]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<2, 4, T, Q> const& m2)\n\t{\n\t\tT const SrcA00 = m1[0][0];\n\t\tT const SrcA01 = m1[0][1];\n\t\tT const SrcA10 = m1[1][0];\n\t\tT const SrcA11 = m1[1][1];\n\t\tT const SrcA20 = m1[2][0];\n\t\tT const SrcA21 = m1[2][1];\n\t\tT const SrcA30 = m1[3][0];\n\t\tT const SrcA31 = m1[3][1];\n\n\t\tT const SrcB00 = m2[0][0];\n\t\tT const SrcB01 = m2[0][1];\n\t\tT const SrcB02 = m2[0][2];\n\t\tT const SrcB03 = m2[0][3];\n\t\tT const SrcB10 = m2[1][0];\n\t\tT const SrcB11 = m2[1][1];\n\t\tT const SrcB12 = m2[1][2];\n\t\tT const SrcB13 = m2[1][3];\n\n\t\tmat<2, 2, T, Q> Result;\n\t\tResult[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;\n\t\tResult[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;\n\t\tResult[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;\n\t\tResult[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<3, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 2, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator*(mat<4, 2, T, Q> const& m1, mat<4, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],\n\t\t\tm1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],\n\t\t\tm1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator/(mat<4, 2, T, Q> const& m, T scalar)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tm[0] / scalar,\n\t\t\tm[1] / scalar,\n\t\t\tm[2] / scalar,\n\t\t\tm[3] / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> operator/(T scalar, mat<4, 2, T, Q> const& m)\n\t{\n\t\treturn mat<4, 2, T, Q>(\n\t\t\tscalar / m[0],\n\t\t\tscalar / m[1],\n\t\t\tscalar / m[2],\n\t\t\tscalar / m[3]);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(mat<4, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat4x3.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat4x3.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<4, 3, T, Q>\n\t{\n\t\ttypedef vec<3, T, Q> col_type;\n\t\ttypedef vec<4, T, Q> row_type;\n\t\ttypedef mat<4, 3, T, Q> type;\n\t\ttypedef mat<3, 4, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[4];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length() { return 4; }\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<4, 3, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<4, 3, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T const& x);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT const& x0, T const& y0, T const& z0,\n\t\t\tT const& x1, T const& y1, T const& z1,\n\t\t\tT const& x2, T const& y2, T const& z2,\n\t\t\tT const& x3, T const& y3, T const& z3);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v0,\n\t\t\tcol_type const& v1,\n\t\t\tcol_type const& v2,\n\t\t\tcol_type const& v3);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<\n\t\t\ttypename X1, typename Y1, typename Z1,\n\t\t\ttypename X2, typename Y2, typename Z2,\n\t\t\ttypename X3, typename Y3, typename Z3,\n\t\t\ttypename X4, typename Y4, typename Z4>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tX1 const& x1, Y1 const& y1, Z1 const& z1,\n\t\t\tX2 const& x2, Y2 const& y2, Z2 const& z2,\n\t\t\tX3 const& x3, Y3 const& y3, Z3 const& z3,\n\t\t\tX4 const& x4, Y4 const& y4, Z4 const& z4);\n\n\t\ttemplate<typename V1, typename V2, typename V3, typename V4>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<3, V1, Q> const& v1,\n\t\t\tvec<3, V2, Q> const& v2,\n\t\t\tvec<3, V3, Q> const& v3,\n\t\t\tvec<3, V4, Q> const& v4);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> & operator=(mat<4, 3, T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> & operator=(mat<4, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> & operator+=(mat<4, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> & operator-=(mat<4, 3, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> & operator/=(U s);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q>& operator++();\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q>& operator--();\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<4, 3, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator*(T const& s, mat<4, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<4, 3, T, Q>::col_type operator*(mat<4, 3, T, Q> const& m, typename mat<4, 3, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<4, 3, T, Q>::row_type operator*(typename mat<4, 3, T, Q>::col_type const& v, mat<4, 3, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<2, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1,\tmat<3, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<4, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator/(mat<4, 3, T, Q> const& m, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> operator/(T const& s, mat<4, 3, T, Q> const& m);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat4x3.inl\"\n#endif //GLM_EXTERNAL_TEMPLATE\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat4x3.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat4x3.inl\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m.value[0];\n\t\t\tthis->value[1] = m.value[1];\n\t\t\tthis->value[2] = m.value[2];\n\t\t\tthis->value[3] = m.value[3];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<4, 3, T, P> const& m)\n\t{\n\t\tthis->value[0] = m.value[0];\n\t\tthis->value[1] = m.value[1];\n\t\tthis->value[2] = m.value[2];\n\t\tthis->value[3] = m.value[3];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(T const& s)\n\t{\n\t\tthis->value[0] = col_type(s, 0, 0);\n\t\tthis->value[1] = col_type(0, s, 0);\n\t\tthis->value[2] = col_type(0, 0, s);\n\t\tthis->value[3] = col_type(0, 0, 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat\n\t(\n\t\tT const& x0, T const& y0, T const& z0,\n\t\tT const& x1, T const& y1, T const& z1,\n\t\tT const& x2, T const& y2, T const& z2,\n\t\tT const& x3, T const& y3, T const& z3\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0, z0);\n\t\tthis->value[1] = col_type(x1, y1, z1);\n\t\tthis->value[2] = col_type(x2, y2, z2);\n\t\tthis->value[3] = col_type(x3, y3, z3);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat\n\t(\n\t\tcol_type const& v0,\n\t\tcol_type const& v1,\n\t\tcol_type const& v2,\n\t\tcol_type const& v3\n\t)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t\tthis->value[2] = v2;\n\t\tthis->value[3] = v3;\n\t}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<\n\t\ttypename X1, typename Y1, typename Z1,\n\t\ttypename X2, typename Y2, typename Z2,\n\t\ttypename X3, typename Y3, typename Z3,\n\t\ttypename X4, typename Y4, typename Z4>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat\n\t(\n\t\tX1 const& x1, Y1 const& y1, Z1 const& z1,\n\t\tX2 const& x2, Y2 const& y2, Z2 const& z2,\n\t\tX3 const& x3, Y3 const& y3, Z3 const& z3,\n\t\tX4 const& x4, Y4 const& y4, Z4 const& z4\n\t)\n\t{\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2));\n\t\tthis->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3));\n\t\tthis->value[3] = col_type(static_cast<T>(x4), value_type(y4), value_type(z4));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2, typename V3, typename V4>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat\n\t(\n\t\tvec<3, V1, Q> const& v1,\n\t\tvec<3, V2, Q> const& v2,\n\t\tvec<3, V3, Q> const& v3,\n\t\tvec<3, V4, Q> const& v4\n\t)\n\t{\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t\tthis->value[2] = col_type(v3);\n\t\tthis->value[3] = col_type(v4);\n\t}\n\n\t// -- Matrix conversions --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<4, 3, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(m[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(0, 0, 1);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(m[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(0, 0, 1);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(m[2], 1);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(0, 0, 1);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(m[2], 1);\n\t\tthis->value[3] = col_type(m[3], 0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(0);\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type & mat<4, 3, T, Q>::operator[](typename mat<4, 3, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type const& mat<4, 3, T, Q>::operator[](typename mat<4, 3, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary updatable operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>& mat<4, 3, T, Q>::operator=(mat<4, 3, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\tthis->value[2] = m[2];\n\t\t\tthis->value[3] = m[3];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q>& mat<4, 3, T, Q>::operator=(mat<4, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t\tthis->value[3] = m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator+=(U s)\n\t{\n\t\tthis->value[0] += s;\n\t\tthis->value[1] += s;\n\t\tthis->value[2] += s;\n\t\tthis->value[3] += s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator+=(mat<4, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\tthis->value[2] += m[2];\n\t\tthis->value[3] += m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator-=(U s)\n\t{\n\t\tthis->value[0] -= s;\n\t\tthis->value[1] -= s;\n\t\tthis->value[2] -= s;\n\t\tthis->value[3] -= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator-=(mat<4, 3, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\tthis->value[2] -= m[2];\n\t\tthis->value[3] -= m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator*=(U s)\n\t{\n\t\tthis->value[0] *= s;\n\t\tthis->value[1] *= s;\n\t\tthis->value[2] *= s;\n\t\tthis->value[3] *= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator/=(U s)\n\t{\n\t\tthis->value[0] /= s;\n\t\tthis->value[1] /= s;\n\t\tthis->value[2] /= s;\n\t\tthis->value[3] /= s;\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\t++this->value[2];\n\t\t++this->value[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> & mat<4, 3, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\t--this->value[2];\n\t\t--this->value[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> mat<4, 3, T, Q>::operator++(int)\n\t{\n\t\tmat<4, 3, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> mat<4, 3, T, Q>::operator--(int)\n\t{\n\t\tmat<4, 3, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\t-m[0],\n\t\t\t-m[1],\n\t\t\t-m[2],\n\t\t\t-m[3]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m, T const& s)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm[0] + s,\n\t\t\tm[1] + s,\n\t\t\tm[2] + s,\n\t\t\tm[3] + s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator+(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1],\n\t\t\tm1[2] + m2[2],\n\t\t\tm1[3] + m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m, T const& s)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm[0] - s,\n\t\t\tm[1] - s,\n\t\t\tm[2] - s,\n\t\t\tm[3] - s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator-(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1],\n\t\t\tm1[2] - m2[2],\n\t\t\tm1[3] - m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m, T const& s)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm[0] * s,\n\t\t\tm[1] * s,\n\t\t\tm[2] * s,\n\t\t\tm[3] * s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(T const& s, mat<4, 3, T, Q> const& m)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm[0] * s,\n\t\t\tm[1] * s,\n\t\t\tm[2] * s,\n\t\t\tm[3] * s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::col_type operator*\n\t(\n\t\tmat<4, 3, T, Q> const& m,\n\t\ttypename mat<4, 3, T, Q>::row_type const& v)\n\t{\n\t\treturn typename mat<4, 3, T, Q>::col_type(\n\t\t\tm[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,\n\t\t\tm[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w,\n\t\t\tm[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 3, T, Q>::row_type operator*\n\t(\n\t\ttypename mat<4, 3, T, Q>::col_type const& v,\n\t\tmat<4, 3, T, Q> const& m)\n\t{\n\t\treturn typename mat<4, 3, T, Q>::row_type(\n\t\t\tv.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2],\n\t\t\tv.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2],\n\t\t\tv.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2],\n\t\t\tv.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<2, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 3, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<3, 4, T, Q> const& m2)\n\t{\n\t\tT const SrcA00 = m1[0][0];\n\t\tT const SrcA01 = m1[0][1];\n\t\tT const SrcA02 = m1[0][2];\n\t\tT const SrcA10 = m1[1][0];\n\t\tT const SrcA11 = m1[1][1];\n\t\tT const SrcA12 = m1[1][2];\n\t\tT const SrcA20 = m1[2][0];\n\t\tT const SrcA21 = m1[2][1];\n\t\tT const SrcA22 = m1[2][2];\n\t\tT const SrcA30 = m1[3][0];\n\t\tT const SrcA31 = m1[3][1];\n\t\tT const SrcA32 = m1[3][2];\n\n\t\tT const SrcB00 = m2[0][0];\n\t\tT const SrcB01 = m2[0][1];\n\t\tT const SrcB02 = m2[0][2];\n\t\tT const SrcB03 = m2[0][3];\n\t\tT const SrcB10 = m2[1][0];\n\t\tT const SrcB11 = m2[1][1];\n\t\tT const SrcB12 = m2[1][2];\n\t\tT const SrcB13 = m2[1][3];\n\t\tT const SrcB20 = m2[2][0];\n\t\tT const SrcB21 = m2[2][1];\n\t\tT const SrcB22 = m2[2][2];\n\t\tT const SrcB23 = m2[2][3];\n\n\t\tmat<3, 3, T, Q> Result;\n\t\tResult[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;\n\t\tResult[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;\n\t\tResult[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03;\n\t\tResult[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;\n\t\tResult[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;\n\t\tResult[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12 + SrcA32 * SrcB13;\n\t\tResult[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22 + SrcA30 * SrcB23;\n\t\tResult[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22 + SrcA31 * SrcB23;\n\t\tResult[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22 + SrcA32 * SrcB23;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator*(mat<4, 3, T, Q> const& m1, mat<4, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],\n\t\t\tm1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],\n\t\t\tm1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],\n\t\t\tm1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3],\n\t\t\tm1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2] + m1[3][2] * m2[3][3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator/(mat<4, 3, T, Q> const& m, T const& s)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\tm[0] / s,\n\t\t\tm[1] / s,\n\t\t\tm[2] / s,\n\t\t\tm[3] / s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> operator/(T const& s, mat<4, 3, T, Q> const& m)\n\t{\n\t\treturn mat<4, 3, T, Q>(\n\t\t\ts / m[0],\n\t\t\ts / m[1],\n\t\t\ts / m[2],\n\t\t\ts / m[3]);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(mat<4, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat4x4.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_mat4x4.hpp\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"type_vec4.hpp\"\n#include \"type_mat.hpp\"\n#include <limits>\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct mat<4, 4, T, Q>\n\t{\n\t\ttypedef vec<4, T, Q> col_type;\n\t\ttypedef vec<4, T, Q> row_type;\n\t\ttypedef mat<4, 4, T, Q> type;\n\t\ttypedef mat<4, 4, T, Q> transpose_type;\n\t\ttypedef T value_type;\n\n\tprivate:\n\t\tcol_type value[4];\n\n\tpublic:\n\t\t// -- Accesses --\n\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;}\n\n\t\tGLM_FUNC_DECL col_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL col_type const& operator[](length_type i) const;\n\n\t\t// -- Constructors --\n\n\t\tGLM_FUNC_DECL mat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL mat(mat<4, 4, T, Q> const& m) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL mat(mat<4, 4, T, P> const& m);\n\n\t\tGLM_FUNC_DECL explicit mat(T const& x);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tT const& x0, T const& y0, T const& z0, T const& w0,\n\t\t\tT const& x1, T const& y1, T const& z1, T const& w1,\n\t\t\tT const& x2, T const& y2, T const& z2, T const& w2,\n\t\t\tT const& x3, T const& y3, T const& z3, T const& w3);\n\t\tGLM_FUNC_DECL mat(\n\t\t\tcol_type const& v0,\n\t\t\tcol_type const& v1,\n\t\t\tcol_type const& v2,\n\t\t\tcol_type const& v3);\n\n\t\t// -- Conversions --\n\n\t\ttemplate<\n\t\t\ttypename X1, typename Y1, typename Z1, typename W1,\n\t\t\ttypename X2, typename Y2, typename Z2, typename W2,\n\t\t\ttypename X3, typename Y3, typename Z3, typename W3,\n\t\t\ttypename X4, typename Y4, typename Z4, typename W4>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tX1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1,\n\t\t\tX2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2,\n\t\t\tX3 const& x3, Y3 const& y3, Z3 const& z3, W3 const& w3,\n\t\t\tX4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4);\n\n\t\ttemplate<typename V1, typename V2, typename V3, typename V4>\n\t\tGLM_FUNC_DECL mat(\n\t\t\tvec<4, V1, Q> const& v1,\n\t\t\tvec<4, V2, Q> const& v2,\n\t\t\tvec<4, V3, Q> const& v3,\n\t\t\tvec<4, V4, Q> const& v4);\n\n\t\t// -- Matrix conversions --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 4, U, P> const& m);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 3, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<2, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 2, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<3, 4, T, Q> const& x);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT mat(mat<4, 3, T, Q> const& x);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator=(mat<4, 4, T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator=(mat<4, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator+=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator+=(mat<4, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator-=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator-=(mat<4, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator*=(mat<4, 4, U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator/=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator/=(mat<4, 4, U, Q> const& m);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator++();\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> & operator--();\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL mat<4, 4, T, Q> operator--(int);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator+(T const& s, mat<4, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator-(T const& s, mat<4, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m1,\tmat<4, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator*(T const& s, mat<4, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<4, 4, T, Q>::col_type operator*(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<4, 4, T, Q>::row_type operator*(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator/(T const& s, mat<4, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<4, 4, T, Q>::row_type operator/(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m1,\tmat<4, 4, T, Q> const& m2);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat4x4.inl\"\n#endif//GLM_EXTERNAL_TEMPLATE\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat4x4.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat4x4.inl\n\n#include \"../matrix.hpp\"\n\nnamespace glm\n{\n\t// -- Constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<4, 4, T, Q> const& m)\n\t\t{\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\tthis->value[2] = m[2];\n\t\t\tthis->value[3] = m[3];\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<4, 4, T, P> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t\tthis->value[3] = m[3];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(T const& s)\n\t{\n\t\tthis->value[0] = col_type(s, 0, 0, 0);\n\t\tthis->value[1] = col_type(0, s, 0, 0);\n\t\tthis->value[2] = col_type(0, 0, s, 0);\n\t\tthis->value[3] = col_type(0, 0, 0, s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat\n\t(\n\t\tT const& x0, T const& y0, T const& z0, T const& w0,\n\t\tT const& x1, T const& y1, T const& z1, T const& w1,\n\t\tT const& x2, T const& y2, T const& z2, T const& w2,\n\t\tT const& x3, T const& y3, T const& z3, T const& w3\n\t)\n\t{\n\t\tthis->value[0] = col_type(x0, y0, z0, w0);\n\t\tthis->value[1] = col_type(x1, y1, z1, w1);\n\t\tthis->value[2] = col_type(x2, y2, z2, w2);\n\t\tthis->value[3] = col_type(x3, y3, z3, w3);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat\n\t(\n\t\tcol_type const& v0,\n\t\tcol_type const& v1,\n\t\tcol_type const& v2,\n\t\tcol_type const& v3\n\t)\n\t{\n\t\tthis->value[0] = v0;\n\t\tthis->value[1] = v1;\n\t\tthis->value[2] = v2;\n\t\tthis->value[3] = v3;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<4, 4, U, P> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0]);\n\t\tthis->value[1] = col_type(m[1]);\n\t\tthis->value[2] = col_type(m[2]);\n\t\tthis->value[3] = col_type(m[3]);\n\t}\n\n\t// -- Conversions --\n\n\ttemplate<typename T, qualifier Q> \n\ttemplate<\n\t\ttypename X1, typename Y1, typename Z1, typename W1,\n\t\ttypename X2, typename Y2, typename Z2, typename W2,\n\t\ttypename X3, typename Y3, typename Z3, typename W3,\n\t\ttypename X4, typename Y4, typename Z4, typename W4>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat\n\t(\n\t\tX1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1,\n\t\tX2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2,\n\t\tX3 const& x3, Y3 const& y3, Z3 const& z3, W3 const& w3,\n\t\tX4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4\n\t)\n\t{\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\n\t\tthis->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1), value_type(w1));\n\t\tthis->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2), value_type(w2));\n\t\tthis->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3), value_type(w3));\n\t\tthis->value[3] = col_type(static_cast<T>(x4), value_type(y4), value_type(z4), value_type(w4));\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename V1, typename V2, typename V3, typename V4>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat\n\t(\n\t\tvec<4, V1, Q> const& v1,\n\t\tvec<4, V2, Q> const& v2,\n\t\tvec<4, V3, Q> const& v3,\n\t\tvec<4, V4, Q> const& v4\n\t)\t\t\n\t{\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\t\tGLM_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.\");\n\n\t\tthis->value[0] = col_type(v1);\n\t\tthis->value[1] = col_type(v2);\n\t\tthis->value[2] = col_type(v3);\n\t\tthis->value[3] = col_type(v4);\n\t}\n\n\t// -- Matrix conversions --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<2, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t\tthis->value[2] = col_type(0, 0, 1, 0);\n\t\tthis->value[3] = col_type(0, 0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<3, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(m[2], 0);\n\t\tthis->value[3] = col_type(0, 0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<2, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(0, 0, 1, 0);\n\t\tthis->value[3] = col_type(0, 0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<3, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t\tthis->value[2] = col_type(m[2], 1, 0);\n\t\tthis->value[3] = col_type(0, 0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<2, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = col_type(0, 0, 1, 0);\n\t\tthis->value[3] = col_type(0, 0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<4, 2, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0, 0);\n\t\tthis->value[1] = col_type(m[1], 0, 0);\n\t\tthis->value[2] = col_type(0, 0, 1, 0);\n\t\tthis->value[3] = col_type(0, 0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<3, 4, T, Q> const& m)\n\t{\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t\tthis->value[3] = col_type(0, 0, 0, 1);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>::mat(mat<4, 3, T, Q> const& m)\n\t{\n\t\tthis->value[0] = col_type(m[0], 0);\n\t\tthis->value[1] = col_type(m[1], 0);\n\t\tthis->value[2] = col_type(m[2], 0);\n\t\tthis->value[3] = col_type(m[3], 1);\n\t}\n\n\t// -- Accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type & mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i)\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type const& mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i) const\n\t{\n\t\tassert(i < this->length());\n\t\treturn this->value[i];\n\t}\n\n\t// -- Unary arithmetic operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator=(mat<4, 4, T, Q> const& m)\n\t\t{\n\t\t\t//memcpy could be faster\n\t\t\t//memcpy(&this->value, &m.value, 16 * sizeof(valType));\n\t\t\tthis->value[0] = m[0];\n\t\t\tthis->value[1] = m[1];\n\t\t\tthis->value[2] = m[2];\n\t\t\tthis->value[3] = m[3];\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q> \n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator=(mat<4, 4, U, Q> const& m)\n\t{\n\t\t//memcpy could be faster\n\t\t//memcpy(&this->value, &m.value, 16 * sizeof(valType));\n\t\tthis->value[0] = m[0];\n\t\tthis->value[1] = m[1];\n\t\tthis->value[2] = m[2];\n\t\tthis->value[3] = m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(U s)\n\t{\n\t\tthis->value[0] += s;\n\t\tthis->value[1] += s;\n\t\tthis->value[2] += s;\n\t\tthis->value[3] += s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(mat<4, 4, U, Q> const& m)\n\t{\n\t\tthis->value[0] += m[0];\n\t\tthis->value[1] += m[1];\n\t\tthis->value[2] += m[2];\n\t\tthis->value[3] += m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(U s)\n\t{\n\t\tthis->value[0] -= s;\n\t\tthis->value[1] -= s;\n\t\tthis->value[2] -= s;\n\t\tthis->value[3] -= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(mat<4, 4, U, Q> const& m)\n\t{\n\t\tthis->value[0] -= m[0];\n\t\tthis->value[1] -= m[1];\n\t\tthis->value[2] -= m[2];\n\t\tthis->value[3] -= m[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(U s)\n\t{\n\t\tthis->value[0] *= s;\n\t\tthis->value[1] *= s;\n\t\tthis->value[2] *= s;\n\t\tthis->value[3] *= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(mat<4, 4, U, Q> const& m)\n\t{\n\t\treturn (*this = *this * m);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(U s)\n\t{\n\t\tthis->value[0] /= s;\n\t\tthis->value[1] /= s;\n\t\tthis->value[2] /= s;\n\t\tthis->value[3] /= s;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(mat<4, 4, U, Q> const& m)\n\t{\n\t\treturn *this *= inverse(m);\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator++()\n\t{\n\t\t++this->value[0];\n\t\t++this->value[1];\n\t\t++this->value[2];\n\t\t++this->value[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator--()\n\t{\n\t\t--this->value[0];\n\t\t--this->value[1];\n\t\t--this->value[2];\n\t\t--this->value[3];\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator++(int)\n\t{\n\t\tmat<4, 4, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator--(int)\n\t{\n\t\tmat<4, 4, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary constant operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m)\n\t{\n\t\treturn m;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\t-m[0],\n\t\t\t-m[1],\n\t\t\t-m[2],\n\t\t\t-m[3]);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m, T const& s)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm[0] + s,\n\t\t\tm[1] + s,\n\t\t\tm[2] + s,\n\t\t\tm[3] + s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(T const& s, mat<4, 4, T, Q> const& m)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm[0] + s,\n\t\t\tm[1] + s,\n\t\t\tm[2] + s,\n\t\t\tm[3] + s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm1[0] + m2[0],\n\t\t\tm1[1] + m2[1],\n\t\t\tm1[2] + m2[2],\n\t\t\tm1[3] + m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m, T const& s)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm[0] - s,\n\t\t\tm[1] - s,\n\t\t\tm[2] - s,\n\t\t\tm[3] - s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(T const& s, mat<4, 4, T, Q> const& m)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\ts - m[0],\n\t\t\ts - m[1],\n\t\t\ts - m[2],\n\t\t\ts - m[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm1[0] - m2[0],\n\t\t\tm1[1] - m2[1],\n\t\t\tm1[2] - m2[2],\n\t\t\tm1[3] - m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m, T const  & s)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm[0] * s,\n\t\t\tm[1] * s,\n\t\t\tm[2] * s,\n\t\t\tm[3] * s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(T const& s, mat<4, 4, T, Q> const& m)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm[0] * s,\n\t\t\tm[1] * s,\n\t\t\tm[2] * s,\n\t\t\tm[3] * s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type operator*\n\t(\n\t\tmat<4, 4, T, Q> const& m,\n\t\ttypename mat<4, 4, T, Q>::row_type const& v\n\t)\n\t{\n/*\n\t\t__m128 v0 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 v1 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 v2 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 v3 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 m0 = _mm_mul_ps(m[0].data, v0);\n\t\t__m128 m1 = _mm_mul_ps(m[1].data, v1);\n\t\t__m128 a0 = _mm_add_ps(m0, m1);\n\n\t\t__m128 m2 = _mm_mul_ps(m[2].data, v2);\n\t\t__m128 m3 = _mm_mul_ps(m[3].data, v3);\n\t\t__m128 a1 = _mm_add_ps(m2, m3);\n\n\t\t__m128 a2 = _mm_add_ps(a0, a1);\n\n\t\treturn typename mat<4, 4, T, Q>::col_type(a2);\n*/\n\n\t\ttypename mat<4, 4, T, Q>::col_type const Mov0(v[0]);\n\t\ttypename mat<4, 4, T, Q>::col_type const Mov1(v[1]);\n\t\ttypename mat<4, 4, T, Q>::col_type const Mul0 = m[0] * Mov0;\n\t\ttypename mat<4, 4, T, Q>::col_type const Mul1 = m[1] * Mov1;\n\t\ttypename mat<4, 4, T, Q>::col_type const Add0 = Mul0 + Mul1;\n\t\ttypename mat<4, 4, T, Q>::col_type const Mov2(v[2]);\n\t\ttypename mat<4, 4, T, Q>::col_type const Mov3(v[3]);\n\t\ttypename mat<4, 4, T, Q>::col_type const Mul2 = m[2] * Mov2;\n\t\ttypename mat<4, 4, T, Q>::col_type const Mul3 = m[3] * Mov3;\n\t\ttypename mat<4, 4, T, Q>::col_type const Add1 = Mul2 + Mul3;\n\t\ttypename mat<4, 4, T, Q>::col_type const Add2 = Add0 + Add1;\n\t\treturn Add2;\n\n/*\n\t\treturn typename mat<4, 4, T, Q>::col_type(\n\t\t\tm[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3],\n\t\t\tm[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1] * v[3],\n\t\t\tm[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2] * v[3],\n\t\t\tm[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3] * v[3]);\n*/\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::row_type operator*\n\t(\n\t\ttypename mat<4, 4, T, Q>::col_type const& v,\n\t\tmat<4, 4, T, Q> const& m\n\t)\n\t{\n\t\treturn typename mat<4, 4, T, Q>::row_type(\n\t\t\tm[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3],\n\t\t\tm[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3],\n\t\t\tm[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3],\n\t\t\tm[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<2, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<2, 4, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],\n\t\t\tm1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],\n\t\t\tm1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<3, 4, T, Q> const& m2)\n\t{\n\t\treturn mat<3, 4, T, Q>(\n\t\t\tm1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n\t\t\tm1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n\t\t\tm1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],\n\t\t\tm1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3],\n\t\t\tm1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n\t\t\tm1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n\t\t\tm1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],\n\t\t\tm1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3],\n\t\t\tm1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],\n\t\t\tm1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],\n\t\t\tm1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],\n\t\t\tm1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2] + m1[3][3] * m2[2][3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2)\n\t{\n\t\ttypename mat<4, 4, T, Q>::col_type const SrcA0 = m1[0];\n\t\ttypename mat<4, 4, T, Q>::col_type const SrcA1 = m1[1];\n\t\ttypename mat<4, 4, T, Q>::col_type const SrcA2 = m1[2];\n\t\ttypename mat<4, 4, T, Q>::col_type const SrcA3 = m1[3];\n\n\t\ttypename mat<4, 4, T, Q>::col_type const SrcB0 = m2[0];\n\t\ttypename mat<4, 4, T, Q>::col_type const SrcB1 = m2[1];\n\t\ttypename mat<4, 4, T, Q>::col_type const SrcB2 = m2[2];\n\t\ttypename mat<4, 4, T, Q>::col_type const SrcB3 = m2[3];\n\n\t\tmat<4, 4, T, Q> Result;\n\t\tResult[0] = SrcA0 * SrcB0[0] + SrcA1 * SrcB0[1] + SrcA2 * SrcB0[2] + SrcA3 * SrcB0[3];\n\t\tResult[1] = SrcA0 * SrcB1[0] + SrcA1 * SrcB1[1] + SrcA2 * SrcB1[2] + SrcA3 * SrcB1[3];\n\t\tResult[2] = SrcA0 * SrcB2[0] + SrcA1 * SrcB2[1] + SrcA2 * SrcB2[2] + SrcA3 * SrcB2[3];\n\t\tResult[3] = SrcA0 * SrcB3[0] + SrcA1 * SrcB3[1] + SrcA2 * SrcB3[2] + SrcA3 * SrcB3[3];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m, T const& s)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm[0] / s,\n\t\t\tm[1] / s,\n\t\t\tm[2] / s,\n\t\t\tm[3] / s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(T const& s,\tmat<4, 4, T, Q> const& m)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\ts / m[0],\n\t\t\ts / m[1],\n\t\t\ts / m[2],\n\t\t\ts / m[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q> const& m, typename mat<4, 4, T, Q>::row_type const& v)\n\t{\n\t\treturn inverse(m) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename mat<4, 4, T, Q>::row_type operator/(typename mat<4, 4, T, Q>::col_type const& v, mat<4, 4, T, Q> const& m)\n\t{\n\t\treturn v * inverse(m);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2)\n\t{\n\t\tmat<4, 4, T, Q> m1_copy(m1);\n\t\treturn m1_copy /= m2;\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2)\n\t{\n\t\treturn (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]);\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE\n#\tinclude \"type_mat4x4_simd.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_mat4x4_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_mat4x4_sse2.inl\n\nnamespace glm\n{\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_vec.hpp\n\n#pragma once\n\n#include \"qualifier.hpp\"\n#include \"type_int.hpp\"\n#include \"compute_vector_relational.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<typename T, std::size_t size, bool aligned>\n\tstruct storage\n\t{\n\t\ttypedef struct type {\n\t\t\tuint8 data[size];\n\t\t} type;\n\t};\n\n\t#define GLM_ALIGNED_STORAGE_TYPE_STRUCT(x) \\\n\t\ttemplate<typename T> \\\n\t\tstruct storage<T, x, true> { \\\n\t\t\tGLM_ALIGNED_STRUCT(x) type { \\\n\t\t\t\tuint8 data[x]; \\\n\t\t\t}; \\\n\t\t};\n\n\tGLM_ALIGNED_STORAGE_TYPE_STRUCT(1)\n\tGLM_ALIGNED_STORAGE_TYPE_STRUCT(2)\n\tGLM_ALIGNED_STORAGE_TYPE_STRUCT(4)\n\tGLM_ALIGNED_STORAGE_TYPE_STRUCT(8)\n\tGLM_ALIGNED_STORAGE_TYPE_STRUCT(16)\n\tGLM_ALIGNED_STORAGE_TYPE_STRUCT(32)\n\tGLM_ALIGNED_STORAGE_TYPE_STRUCT(64)\n\t\t\n#\tif GLM_ARCH & GLM_ARCH_SSE2_BIT\n\t\ttemplate<>\n\t\tstruct storage<float, 16, true>\n\t\t{\n\t\t\ttypedef glm_vec4 type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct storage<int, 16, true>\n\t\t{\n\t\t\ttypedef glm_ivec4 type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct storage<unsigned int, 16, true>\n\t\t{\n\t\t\ttypedef glm_uvec4 type;\n\t\t};\n/*\n#\telse\n\t\ttypedef union __declspec(align(16)) glm_128\n\t\t{\n\t\t\tunsigned __int8 data[16];\n\t\t} glm_128;\n\n\t\ttemplate<>\n\t\tstruct storage<float, 16, true>\n\t\t{\n\t\t\ttypedef glm_128 type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct storage<int, 16, true>\n\t\t{\n\t\t\ttypedef glm_128 type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct storage<unsigned int, 16, true>\n\t\t{\n\t\t\ttypedef glm_128 type;\n\t\t};\n*/\n#\tendif\n\n#\tif (GLM_ARCH & GLM_ARCH_AVX_BIT)\n\t\ttemplate<>\n\t\tstruct storage<double, 32, true>\n\t\t{\n\t\t\ttypedef glm_dvec4 type;\n\t\t};\n#\tendif\n\n#\tif (GLM_ARCH & GLM_ARCH_AVX2_BIT)\n\t\ttemplate<>\n\t\tstruct storage<int64, 32, true>\n\t\t{\n\t\t\ttypedef glm_i64vec4 type;\n\t\t};\n\n\t\ttemplate<>\n\t\tstruct storage<uint64, 32, true>\n\t\t{\n\t\t\ttypedef glm_u64vec4 type;\n\t\t};\n#\tendif\n}//namespace detail\n\n#if GLM_HAS_TEMPLATE_ALIASES\n\ttemplate <typename T, qualifier Q = defaultp> using tvec2 = vec<2, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tvec3 = vec<3, T, Q>;\n\ttemplate <typename T, qualifier Q = defaultp> using tvec4 = vec<4, T, Q>;\n#endif//GLM_HAS_TEMPLATE_ALIASES\n\n\t/// @addtogroup core_precision\n\t/// @{\n\n\t/// 2 components vector of high single-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, float, highp>\t\thighp_vec2;\n\n\t/// 2 components vector of medium single-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, float, mediump>\tmediump_vec2;\n\n\t/// 2 components vector of low single-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, float, lowp>\t\tlowp_vec2;\n\n\t/// 2 components vector of high double-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, double, highp>\thighp_dvec2;\n\n\t/// 2 components vector of medium double-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, double, mediump>\tmediump_dvec2;\n\n\t/// 2 components vector of low double-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, double, lowp>\t\tlowp_dvec2;\n\n\t/// 2 components vector of high qualifier signed integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, int, highp>\t\thighp_ivec2;\n\n\t/// 2 components vector of medium qualifier signed integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, int, mediump>\t\tmediump_ivec2;\n\n\t/// 2 components vector of low qualifier signed integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, int, lowp>\t\tlowp_ivec2;\n\n\t/// 2 components vector of high qualifier unsigned integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, uint, highp>\t\thighp_uvec2;\n\n\t/// 2 components vector of medium qualifier unsigned integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, uint, mediump>\tmediump_uvec2;\n\n\t/// 2 components vector of low qualifier unsigned integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, uint, lowp>\t\tlowp_uvec2;\n\n\t/// 2 components vector of high qualifier bool numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, bool, highp>\t\thighp_bvec2;\n\n\t/// 2 components vector of medium qualifier bool numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, bool, mediump>\tmediump_bvec2;\n\n\t/// 2 components vector of low qualifier bool numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<2, bool, lowp>\t\tlowp_bvec2;\n\n\t/// @}\n\n\t/// @addtogroup core_precision\n\t/// @{\n\n\t/// 3 components vector of high single-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, float, highp>\t\thighp_vec3;\n\n\t/// 3 components vector of medium single-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, float, mediump>\tmediump_vec3;\n\n\t/// 3 components vector of low single-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, float, lowp>\t\tlowp_vec3;\n\n\t/// 3 components vector of high double-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, double, highp>\thighp_dvec3;\n\n\t/// 3 components vector of medium double-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, double, mediump>\tmediump_dvec3;\n\n\t/// 3 components vector of low double-qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, double, lowp>\t\tlowp_dvec3;\n\n\t/// 3 components vector of high qualifier signed integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, int, highp>\t\thighp_ivec3;\n\n\t/// 3 components vector of medium qualifier signed integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, int, mediump>\t\tmediump_ivec3;\n\n\t/// 3 components vector of low qualifier signed integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, int, lowp>\t\tlowp_ivec3;\n\n\t/// 3 components vector of high qualifier unsigned integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, uint, highp>\t\thighp_uvec3;\n\n\t/// 3 components vector of medium qualifier unsigned integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, uint, mediump>\tmediump_uvec3;\n\n\t/// 3 components vector of low qualifier unsigned integer numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, uint, lowp>\t\tlowp_uvec3;\n\n\t/// 3 components vector of high qualifier bool numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, bool, highp>\t\thighp_bvec3;\n\n\t/// 3 components vector of medium qualifier bool numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, bool, mediump>\tmediump_bvec3;\n\n\t/// 3 components vector of low qualifier bool numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<3, bool, lowp>\t\tlowp_bvec3;\n\n\t/// @}\n\n\t/// @addtogroup core_precision\n\t/// @{\n\n\t/// 4 components vector of high single-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, float, highp>\t\thighp_vec4;\n\n\t/// 4 components vector of medium single-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, float, mediump>\tmediump_vec4;\n\n\t/// 4 components vector of low single-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, float, lowp>\t\tlowp_vec4;\n\n\t/// 4 components vector of high double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, double, highp>\thighp_dvec4;\n\n\t/// 4 components vector of medium double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, double, mediump>\tmediump_dvec4;\n\n\t/// 4 components vector of low double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, double, lowp>\t\tlowp_dvec4;\n\n\t/// 4 components vector of high qualifier signed integer numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, int, highp>\t\thighp_ivec4;\n\n\t/// 4 components vector of medium qualifier signed integer numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, int, mediump>\t\tmediump_ivec4;\n\n\t/// 4 components vector of low qualifier signed integer numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, int, lowp>\t\tlowp_ivec4;\n\n\t/// 4 components vector of high qualifier unsigned integer numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, uint, highp>\t\thighp_uvec4;\n\n\t/// 4 components vector of medium qualifier unsigned integer numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, uint, mediump>\tmediump_uvec4;\n\n\t/// 4 components vector of low qualifier unsigned integer numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, uint, lowp>\t\tlowp_uvec4;\n\n\t/// 4 components vector of high qualifier bool numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, bool, highp>\t\thighp_bvec4;\n\n\t/// 4 components vector of medium qualifier bool numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, bool, mediump>\tmediump_bvec4;\n\n\t/// 4 components vector of low qualifier bool numbers.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef vec<4, bool, lowp>\t\tlowp_bvec4;\n\n\t/// @}\n\n\t/// @addtogroup core_types\n\t/// @{\n\n\t// -- Default float definition --\n\n#if(defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef lowp_vec2\t\t\tvec2;\n\ttypedef lowp_vec3\t\t\tvec3;\n\ttypedef lowp_vec4\t\t\tvec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))\n\ttypedef mediump_vec2\t\tvec2;\n\ttypedef mediump_vec3\t\tvec3;\n\ttypedef mediump_vec4\t\tvec4;\n#else //defined(GLM_PRECISION_HIGHP_FLOAT)\n\t/// 2 components vector of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_vec2\t\t\tvec2;\n\n\t//! 3 components vector of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_vec3\t\t\tvec3;\n\n\t//! 4 components vector of floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_vec4\t\t\tvec4;\n#endif//GLM_PRECISION\n\n\t// -- Default double definition --\n\n#if(defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef lowp_dvec2\t\t\tdvec2;\n\ttypedef lowp_dvec3\t\t\tdvec3;\n\ttypedef lowp_dvec4\t\t\tdvec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))\n\ttypedef mediump_dvec2\t\tdvec2;\n\ttypedef mediump_dvec3\t\tdvec3;\n\ttypedef mediump_dvec4\t\tdvec4;\n#else //defined(GLM_PRECISION_HIGHP_DOUBLE)\n\t/// 2 components vector of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dvec2\t\t\tdvec2;\n\n\t//! 3 components vector of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dvec3\t\t\tdvec3;\n\n\t//! 4 components vector of double-qualifier floating-point numbers.\n\t///\n\t/// @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>\n\ttypedef highp_dvec4\t\t\tdvec4;\n#endif//GLM_PRECISION\n\n\t// -- Signed integer definition --\n\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_ivec2\t\t\tivec2;\n\ttypedef lowp_ivec3\t\t\tivec3;\n\ttypedef lowp_ivec4\t\t\tivec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_ivec2\t\tivec2;\n\ttypedef mediump_ivec3\t\tivec3;\n\ttypedef mediump_ivec4\t\tivec4;\n#else //defined(GLM_PRECISION_HIGHP_INT)\n\t/// 2 components vector of signed integer numbers.\n\t///\n\t/// @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>\n\ttypedef highp_ivec2\t\t\tivec2;\n\n\t/// 3 components vector of signed integer numbers.\n\t///\n\t/// @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>\n\ttypedef highp_ivec3\t\t\tivec3;\n\n\t/// 4 components vector of signed integer numbers.\n\t///\n\t/// @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>\n\ttypedef highp_ivec4\t\t\tivec4;\n#endif//GLM_PRECISION\n\n\t// -- Unsigned integer definition --\n\n#if(defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef lowp_uvec2\t\t\tuvec2;\n\ttypedef lowp_uvec3\t\t\tuvec3;\n\ttypedef lowp_uvec4\t\t\tuvec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_UINT))\n\ttypedef mediump_uvec2\t\tuvec2;\n\ttypedef mediump_uvec3\t\tuvec3;\n\ttypedef mediump_uvec4\t\tuvec4;\n#else //defined(GLM_PRECISION_HIGHP_UINT)\n\t/// 2 components vector of unsigned integer numbers.\n\t///\n\t/// @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>\n\ttypedef highp_uvec2\t\t\tuvec2;\n\n\t/// 3 components vector of unsigned integer numbers.\n\t///\n\t/// @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>\n\ttypedef highp_uvec3\t\t\tuvec3;\n\n\t/// 4 components vector of unsigned integer numbers.\n\t///\n\t/// @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>\n\ttypedef highp_uvec4\t\t\tuvec4;\n#endif//GLM_PRECISION\n\n\t// -- Boolean definition --\n\n#if(defined(GLM_PRECISION_LOWP_BOOL))\n\ttypedef lowp_bvec2\t\t\tbvec2;\n\ttypedef lowp_bvec3\t\t\tbvec3;\n\ttypedef lowp_bvec4\t\t\tbvec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_BOOL))\n\ttypedef mediump_bvec2\t\tbvec2;\n\ttypedef mediump_bvec3\t\tbvec3;\n\ttypedef mediump_bvec4\t\tbvec4;\n#else //defined(GLM_PRECISION_HIGHP_BOOL)\n\t/// 2 components vector of boolean.\n\t///\n\t/// @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>\n\ttypedef highp_bvec2\t\t\tbvec2;\n\n\t/// 3 components vector of boolean.\n\t///\n\t/// @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>\n\ttypedef highp_bvec3\t\t\tbvec3;\n\n\t/// 4 components vector of boolean.\n\t///\n\t/// @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>\n\ttypedef highp_bvec4\t\t\tbvec4;\n#endif//GLM_PRECISION\n\n\t/// @}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_vec.inl\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec1.hpp",
    "content": ""
  },
  {
    "path": "external/glm/glm/detail/type_vec1.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_vec1.inl\n\nnamespace glm\n{\n\t// -- Implicit basic constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec()\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<1, T, Q> const& v)\n\t\t\t: x(v.x)\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<1, T, P> const& v)\n\t\t: x(v.x)\n\t{}\n\n\t// -- Explicit basic constructors --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(T scalar)\n\t\t: x(scalar)\n\t{}\n\n\t// -- Conversion vector constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<1, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<2, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<3, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<1, T, Q>::vec(vec<4, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t{}\n\n\t// -- Component accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T & vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type i)\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const& vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type i) const\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\t// -- Unary arithmetic operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, T, Q> const& v)\n\t\t{\n\t\t\tthis->x = v.x;\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x = static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator+=(U scalar)\n\t{\n\t\tthis->x += static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator+=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x += static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator-=(U scalar)\n\t{\n\t\tthis->x -= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator-=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x -= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator*=(U scalar)\n\t{\n\t\tthis->x *= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator*=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x *= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator/=(U scalar)\n\t{\n\t\tthis->x /= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator/=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x /= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator++()\n\t{\n\t\t++this->x;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator--()\n\t{\n\t\t--this->x;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> vec<1, T, Q>::operator++(int)\n\t{\n\t\tvec<1, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> vec<1, T, Q>::operator--(int)\n\t{\n\t\tvec<1, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator%=(U scalar)\n\t{\n\t\tthis->x %= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator%=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x %= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator&=(U scalar)\n\t{\n\t\tthis->x &= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator&=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x &= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator|=(U scalar)\n\t{\n\t\tthis->x |= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator|=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x |= U(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator^=(U scalar)\n\t{\n\t\tthis->x ^= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator^=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x ^= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator<<=(U scalar)\n\t{\n\t\tthis->x <<= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator<<=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x <<= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator>>=(U scalar)\n\t{\n\t\tthis->x >>= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> & vec<1, T, Q>::operator>>=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x >>= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\t// -- Unary constant operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator+(vec<1, T, Q> const& v)\n\t{\n\t\treturn v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator-(vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\t-v.x);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar + v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x + v2.x);\n\t}\n\n\t//operator-\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar - v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x - v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar * v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x * v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar / v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x / v2.x);\n\t}\n\n\t// -- Binary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x % scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar % v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x % v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x & scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar & v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x & v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x | scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar | v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x | v2.x);\n\t}\n\t\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x ^ scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar ^ v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x ^ v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tstatic_cast<T>(v.x << scalar));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar << v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x << v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv.x >> scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tscalar >> v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\tv1.x >> v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, T, Q> operator~(vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(\n\t\t\t~v.x);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn detail::compute_equal<T>::call(v1.x, v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn !(v1 == v2);\n\t}\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2)\n\t{\n\t\treturn vec<1, bool, Q>(v1.x && v2.x);\n\t}\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2)\n\t{\n\t\treturn vec<1, bool, Q>(v1.x || v2.x);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec2.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_vec2.hpp\n\n#pragma once\n\n#include \"type_vec.hpp\"\n#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n#\tif GLM_HAS_UNRESTRICTED_UNIONS\n#\t\tinclude \"_swizzle.hpp\"\n#\telse\n#\t\tinclude \"_swizzle_func.hpp\"\n#\tendif\n#endif //GLM_SWIZZLE\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct vec<2, T, Q>\n\t{\n\t\t// -- Implementation detail --\n\n\t\ttypedef T value_type;\n\t\ttypedef vec type;\n\t\ttypedef vec<2, bool, Q> bool_type;\n\n\t\t// -- Data --\n\n#\t\tif GLM_HAS_ONLY_XYZW\n\t\t\tT x, y;\n\n#\t\telif GLM_HAS_ALIGNED_TYPE\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic push\n#\t\t\t\tpragma GCC diagnostic ignored \"-Wpedantic\"\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic push\n#\t\t\t\tpragma clang diagnostic ignored \"-Wgnu-anonymous-struct\"\n#\t\t\t\tpragma clang diagnostic ignored \"-Wnested-anon-types\"\n#\t\t\tendif\n\t\t\n\t\t\tunion\n\t\t\t{\n\t\t\t\tstruct{ T x, y; };\n\t\t\t\tstruct{ T r, g; };\n\t\t\t\tstruct{ T s, t; };\n\n#\t\t\t\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\t\t\t\t\tGLM_SWIZZLE2_2_MEMBERS(T, Q, x, y)\n\t\t\t\t\tGLM_SWIZZLE2_2_MEMBERS(T, Q, r, g)\n\t\t\t\t\tGLM_SWIZZLE2_2_MEMBERS(T, Q, s, t)\n\t\t\t\t\tGLM_SWIZZLE2_3_MEMBERS(T, Q, x, y)\n\t\t\t\t\tGLM_SWIZZLE2_3_MEMBERS(T, Q, r, g)\n\t\t\t\t\tGLM_SWIZZLE2_3_MEMBERS(T, Q, s, t)\n\t\t\t\t\tGLM_SWIZZLE2_4_MEMBERS(T, Q, x, y)\n\t\t\t\t\tGLM_SWIZZLE2_4_MEMBERS(T, Q, r, g)\n\t\t\t\t\tGLM_SWIZZLE2_4_MEMBERS(T, Q, s, t)\n#\t\t\t\tendif//GLM_SWIZZLE\n\n\t\t\t};\n\t\t\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic pop\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic pop\n#\t\t\tendif\n#\t\telse\n\t\t\tunion {T x, r, s;};\n\t\t\tunion {T y, g, t;};\n\n#\t\t\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\t\t\t\tGLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P)\n#\t\t\tendif//GLM_SWIZZLE\n#\t\tendif\n\n\t\t// -- Component accesses --\n\n\t\t/// Return the count of components of the vector\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;}\n\n\t\tGLM_FUNC_DECL T& operator[](length_type i);\n\t\tGLM_FUNC_DECL T const& operator[](length_type i) const;\n\n\t\t// -- Implicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, T, P> const& v);\n\n\t\t// -- Explicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(T x, T y);\n\n\t\t// -- Conversion constructors --\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A x, B y);\n\t\ttemplate<typename A, typename B>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, Q> const& x, vec<1, B, Q> const& y);\n\n\t\t// -- Conversion vector constructors --\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v);\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<2, U, P> const& v);\n\n\t\t// -- Swizzle constructors --\n#\t\tif GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)\n\t\t\ttemplate<int E0, int E1>\n\t\t\tGLM_FUNC_DECL vec(detail::_swizzle<2, T, Q, E0, E1,-1,-2> const& that)\n\t\t\t{\n\t\t\t\t*this = that();\n\t\t\t}\n#\t\tendif// GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL vec& operator=(vec const& v) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator+=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator+=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator+=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator-=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator-=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator-=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator*=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator*=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator*=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator/=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator/=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec& operator/=(vec<2, U, Q> const& v);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL vec & operator++();\n\t\tGLM_FUNC_DECL vec & operator--();\n\t\tGLM_FUNC_DECL vec operator++(int);\n\t\tGLM_FUNC_DECL vec operator--(int);\n\n\t\t// -- Unary bit operators --\n\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator%=(U scalar);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator%=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator&=(U scalar);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator&=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator|=(U scalar);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator|=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator^=(U scalar);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator^=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator<<=(U scalar);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator<<=(vec<2, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator>>=(U scalar);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U> \n\t\tGLM_FUNC_DECL vec & operator>>=(vec<2, U, Q> const& v);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator+(vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator-(vec<2, T, Q> const& v);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> operator~(vec<2, T, Q> const& v);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2);\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_DECL vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2);\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_DECL vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_vec2.inl\"\n#endif//GLM_EXTERNAL_TEMPLATE\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec2.inl",
    "content": "/// @ref core\n/// @file glm/core/type_tvec2.inl\n\nnamespace glm\n{\n\t// -- Implicit basic constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec()\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<2, T, Q> const& v)\n\t\t\t: x(v.x), y(v.y)\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<2, T, P> const& v)\n\t\t: x(v.x), y(v.y)\n\t{}\n\n\t// -- Explicit basic constructors --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(T scalar)\n\t\t: x(scalar), y(scalar)\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(T _x, T _y)\n\t\t: x(_x), y(_y)\n\t{}\n\n\t// -- Conversion scalar constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(A _x, B _y)\n\t\t: x(static_cast<T>(_x))\n\t\t, y(static_cast<T>(_y))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<1, A, Q> const& _x, vec<1, B, Q> const& _y)\n\t\t: x(static_cast<T>(_x.x))\n\t\t, y(static_cast<T>(_y.x))\n\t{}\n\n\t// -- Conversion vector constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<2, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t\t, y(static_cast<T>(v.y))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<3, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t\t, y(static_cast<T>(v.y))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<2, T, Q>::vec(vec<4, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t\t, y(static_cast<T>(v.y))\n\t{}\n\n\t// -- Component accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T & vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i)\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const& vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i) const\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\t// -- Unary arithmetic operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, T, Q> const& v)\n\t\t{\n\t\t\tthis->x = v.x;\n\t\t\tthis->y = v.y;\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x = static_cast<T>(v.x);\n\t\tthis->y = static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator+=(U scalar)\n\t{\n\t\tthis->x += static_cast<T>(scalar);\n\t\tthis->y += static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x += static_cast<T>(v.x);\n\t\tthis->y += static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x += static_cast<T>(v.x);\n\t\tthis->y += static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator-=(U scalar)\n\t{\n\t\tthis->x -= static_cast<T>(scalar);\n\t\tthis->y -= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x -= static_cast<T>(v.x);\n\t\tthis->y -= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x -= static_cast<T>(v.x);\n\t\tthis->y -= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator*=(U scalar)\n\t{\n\t\tthis->x *= static_cast<T>(scalar);\n\t\tthis->y *= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x *= static_cast<T>(v.x);\n\t\tthis->y *= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x *= static_cast<T>(v.x);\n\t\tthis->y *= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator/=(U scalar)\n\t{\n\t\tthis->x /= static_cast<T>(scalar);\n\t\tthis->y /= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x /= static_cast<T>(v.x);\n\t\tthis->y /= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x /= static_cast<T>(v.x);\n\t\tthis->y /= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator++()\n\t{\n\t\t++this->x;\n\t\t++this->y;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator--()\n\t{\n\t\t--this->x;\n\t\t--this->y;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<2, T, Q> vec<2, T, Q>::operator++(int)\n\t{\n\t\tvec<2, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<2, T, Q> vec<2, T, Q>::operator--(int)\n\t{\n\t\tvec<2, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator%=(U scalar)\n\t{\n\t\tthis->x %= static_cast<T>(scalar);\n\t\tthis->y %= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x %= static_cast<T>(v.x);\n\t\tthis->y %= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x %= static_cast<T>(v.x);\n\t\tthis->y %= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator&=(U scalar)\n\t{\n\t\tthis->x &= static_cast<T>(scalar);\n\t\tthis->y &= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x &= static_cast<T>(v.x);\n\t\tthis->y &= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x &= static_cast<T>(v.x);\n\t\tthis->y &= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator|=(U scalar)\n\t{\n\t\tthis->x |= static_cast<T>(scalar);\n\t\tthis->y |= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x |= static_cast<T>(v.x);\n\t\tthis->y |= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x |= static_cast<T>(v.x);\n\t\tthis->y |= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator^=(U scalar)\n\t{\n\t\tthis->x ^= static_cast<T>(scalar);\n\t\tthis->y ^= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x ^= static_cast<T>(v.x);\n\t\tthis->y ^= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x ^= static_cast<T>(v.x);\n\t\tthis->y ^= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator<<=(U scalar)\n\t{\n\t\tthis->x <<= static_cast<T>(scalar);\n\t\tthis->y <<= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x <<= static_cast<T>(v.x);\n\t\tthis->y <<= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x <<= static_cast<T>(v.x);\n\t\tthis->y <<= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator>>=(U scalar)\n\t{\n\t\tthis->x >>= static_cast<T>(scalar);\n\t\tthis->y >>= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x >>= static_cast<T>(v.x);\n\t\tthis->y >>= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<2, U, Q> const& v)\n\t{\n\t\tthis->x >>= static_cast<T>(v.x);\n\t\tthis->y >>= static_cast<T>(v.y);\n\t\treturn *this;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<2, T, Q> const& v)\n\t{\n\t\treturn v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\t-v.x, \n\t\t\t-v.y);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x + scalar,\n\t\t\tv.y + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x + v2.x,\n\t\t\tv1.y + v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar + v.x,\n\t\t\tscalar + v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x + v2.x,\n\t\t\tv1.x + v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x + v2.x,\n\t\t\tv1.y + v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x - scalar,\n\t\t\tv.y - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x - v2.x,\n\t\t\tv1.y - v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar - v.x,\n\t\t\tscalar - v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x - v2.x,\n\t\t\tv1.x - v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x - v2.x,\n\t\t\tv1.y - v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x * scalar,\n\t\t\tv.y * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x * v2.x,\n\t\t\tv1.y * v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar * v.x,\n\t\t\tscalar * v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x * v2.x,\n\t\t\tv1.x * v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x * v2.x,\n\t\t\tv1.y * v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x / scalar,\n\t\t\tv.y / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x / v2.x,\n\t\t\tv1.y / v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar / v.x,\n\t\t\tscalar / v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x / v2.x,\n\t\t\tv1.x / v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x / v2.x,\n\t\t\tv1.y / v2.y);\n\t}\n\n\t// -- Binary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x % scalar,\n\t\t\tv.y % scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x % v2.x,\n\t\t\tv1.y % v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar % v.x,\n\t\t\tscalar % v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x % v2.x,\n\t\t\tv1.x % v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x % v2.x,\n\t\t\tv1.y % v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x & scalar,\n\t\t\tv.y & scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x & v2.x,\n\t\t\tv1.y & v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar & v.x,\n\t\t\tscalar & v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x & v2.x,\n\t\t\tv1.x & v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x & v2.x,\n\t\t\tv1.y & v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x | scalar,\n\t\t\tv.y | scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x | v2.x,\n\t\t\tv1.y | v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar | v.x,\n\t\t\tscalar | v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x | v2.x,\n\t\t\tv1.x | v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x | v2.x,\n\t\t\tv1.y | v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x ^ scalar,\n\t\t\tv.y ^ scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x ^ v2.x,\n\t\t\tv1.y ^ v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar ^ v.x,\n\t\t\tscalar ^ v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x ^ v2.x,\n\t\t\tv1.x ^ v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x ^ v2.x,\n\t\t\tv1.y ^ v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x << scalar,\n\t\t\tv.y << scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x << v2.x,\n\t\t\tv1.y << v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar << v.x,\n\t\t\tscalar << v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x << v2.x,\n\t\t\tv1.x << v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x << v2.x,\n\t\t\tv1.y << v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv.x >> scalar,\n\t\t\tv.y >> scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x >> v2.x,\n\t\t\tv1.y >> v2.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tscalar >> v.x,\n\t\t\tscalar >> v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x >> v2.x,\n\t\t\tv1.x >> v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tv1.x >> v2.x,\n\t\t\tv1.y >> v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> operator~(vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\t~v.x,\n\t\t\t~v.y);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn\n\t\t\tdetail::compute_equal<T>::call(v1.x, v2.x) &&\n\t\t\tdetail::compute_equal<T>::call(v1.y, v2.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)\n\t{\n\t\treturn !(v1 == v2);\n\t}\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2)\n\t{\n\t\treturn vec<2, bool, Q>(v1.x && v2.x, v1.y && v2.y);\n\t}\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2)\n\t{\n\t\treturn vec<2, bool, Q>(v1.x || v2.x, v1.y || v2.y);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec3.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_vec3.hpp\n\n#pragma once\n\n#include \"type_vec.hpp\"\n#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n#\tif GLM_HAS_UNRESTRICTED_UNIONS\n#\t\tinclude \"_swizzle.hpp\"\n#\telse\n#\t\tinclude \"_swizzle_func.hpp\"\n#\tendif\n#endif //GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct vec<3, T, Q>\n\t{\n\t\t// -- Implementation detail --\n\n\t\ttypedef T value_type;\n\t\ttypedef vec type;\n\t\ttypedef vec<3, bool, Q> bool_type;\n\n\t\t// -- Data --\n\n#\t\tif GLM_HAS_ONLY_XYZW\n\t\t\tT x, y, z;\n\n#\t\telif GLM_HAS_ALIGNED_TYPE\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic push\n#\t\t\t\tpragma GCC diagnostic ignored \"-Wpedantic\"\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic push\n#\t\t\t\tpragma clang diagnostic ignored \"-Wgnu-anonymous-struct\"\n#\t\t\t\tpragma clang diagnostic ignored \"-Wnested-anon-types\"\n#\t\t\tendif\n\n\t\t\tunion\n\t\t\t{\n\t\t\t\tstruct{ T x, y, z; };\n\t\t\t\tstruct{ T r, g, b; };\n\t\t\t\tstruct{ T s, t, p; };\n\n#\t\t\t\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\t\t\t\t\tGLM_SWIZZLE3_2_MEMBERS(T, Q, x, y, z)\n\t\t\t\t\tGLM_SWIZZLE3_2_MEMBERS(T, Q, r, g, b)\n\t\t\t\t\tGLM_SWIZZLE3_2_MEMBERS(T, Q, s, t, p)\n\t\t\t\t\tGLM_SWIZZLE3_3_MEMBERS(T, Q, x, y, z)\n\t\t\t\t\tGLM_SWIZZLE3_3_MEMBERS(T, Q, r, g, b)\n\t\t\t\t\tGLM_SWIZZLE3_3_MEMBERS(T, Q, s, t, p)\n\t\t\t\t\tGLM_SWIZZLE3_4_MEMBERS(T, Q, x, y, z)\n\t\t\t\t\tGLM_SWIZZLE3_4_MEMBERS(T, Q, r, g, b)\n\t\t\t\t\tGLM_SWIZZLE3_4_MEMBERS(T, Q, s, t, p)\n#\t\t\t\tendif//GLM_SWIZZLE\n\t\t\t};\n\t\t\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic pop\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic pop\n#\t\t\tendif\n#\t\telse\n\t\t\tunion { T x, r, s; };\n\t\t\tunion { T y, g, t; };\n\t\t\tunion { T z, b, p; };\n\n#\t\t\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\t\t\t\tGLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P)\n#\t\t\tendif//GLM_SWIZZLE\n#\t\tendif//GLM_LANG\n\n\t\t// -- Component accesses --\n\n\t\t/// Return the count of components of the vector\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 3;}\n\n\t\tGLM_FUNC_DECL T & operator[](length_type i);\n\t\tGLM_FUNC_DECL T const& operator[](length_type i) const;\n\n\t\t// -- Implicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<3, T, P> const& v);\n\n\t\t// -- Explicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(T a, T b, T c);\n\n\t\t// -- Conversion scalar constructors --\n\n\t\t/// Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename X, typename Y, typename Z>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(X x, Y y, Z z);\n\t\ttemplate<typename X, typename Y, typename Z>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z);\n\n\t\t// -- Conversion vector constructors --\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, B _z);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec<2, B, P> const& _yz);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v);\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v);\n\n\t\t// -- Swizzle constructors --\n#\t\tif GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)\n\t\t\ttemplate<int E0, int E1, int E2>\n\t\t\tGLM_FUNC_DECL vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& that)\n\t\t\t{\n\t\t\t\t*this = that();\n\t\t\t}\n\n\t\t\ttemplate<int E0, int E1>\n\t\t\tGLM_FUNC_DECL vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& scalar)\n\t\t\t{\n\t\t\t\t*this = vec(v(), scalar);\n\t\t\t}\n\n\t\t\ttemplate<int E0, int E1>\n\t\t\tGLM_FUNC_DECL vec(T const& scalar, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v)\n\t\t\t{\n\t\t\t\t*this = vec(scalar, v());\n\t\t\t}\n#\t\tendif// GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL vec & operator=(vec const& v) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator+=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator+=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator+=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator-=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator-=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator-=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator*=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator*=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator*=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator/=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator/=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator/=(vec<3, U, Q> const& v);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL vec & operator++();\n\t\tGLM_FUNC_DECL vec & operator--();\n\t\tGLM_FUNC_DECL vec operator++(int);\n\t\tGLM_FUNC_DECL vec operator--(int);\n\n\t\t// -- Unary bit operators --\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator%=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator%=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator&=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator&=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator|=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator|=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator^=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator^=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator<<=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator<<=(vec<3, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator>>=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator>>=(vec<3, U, Q> const& v);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator+(vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator-(vec<3, T, Q> const& v);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator+(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator-(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator/(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator%(T const& scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator%(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator&(vec<3, T, Q> const& v1, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator&(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator|(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator^(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator<<(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator>>(vec<1, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL vec<3, T, Q> operator~(vec<3, T, Q> const& v);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2);\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_DECL vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2);\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_DECL vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_vec3.inl\"\n#endif//GLM_EXTERNAL_TEMPLATE\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec3.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_tvec3.inl\n\nnamespace glm\n{\n\t// -- Implicit basic constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec()\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<3, T, Q> const& v)\n\t\t\t: x(v.x), y(v.y), z(v.z)\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<3, T, P> const& v)\n\t\t: x(v.x), y(v.y), z(v.z)\n\t{}\n\n\t// -- Explicit basic constructors --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(T scalar)\n\t\t: x(scalar), y(scalar), z(scalar)\n\t{}\n\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(T _x, T _y, T _z)\n\t\t: x(_x), y(_y), z(_z)\n\t{}\n\n\t// -- Conversion scalar constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename X, typename Y, typename Z>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(X _x, Y _y, Z _z)\n\t\t: x(static_cast<T>(_x))\n\t\t, y(static_cast<T>(_y))\n\t\t, z(static_cast<T>(_z))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename X, typename Y, typename Z>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z)\n\t\t: x(static_cast<T>(_x))\n\t\t, y(static_cast<T>(_y))\n\t\t, z(static_cast<T>(_z))\n\t{}\n\n\t// -- Conversion vector constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, B _z)\n\t\t: x(static_cast<T>(_xy.x))\n\t\t, y(static_cast<T>(_xy.y))\n\t\t, z(static_cast<T>(_z))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z)\n\t\t: x(static_cast<T>(_xy.x))\n\t\t, y(static_cast<T>(_xy.y))\n\t\t, z(static_cast<T>(_z.x))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(A _x, vec<2, B, P> const& _yz)\n\t\t: x(static_cast<T>(_x))\n\t\t, y(static_cast<T>(_yz.x))\n\t\t, z(static_cast<T>(_yz.y))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz)\n\t\t: x(static_cast<T>(_x.x))\n\t\t, y(static_cast<T>(_yz.x))\n\t\t, z(static_cast<T>(_yz.y))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<3, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t\t, y(static_cast<T>(v.y))\n\t\t, z(static_cast<T>(v.z))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<3, T, Q>::vec(vec<4, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t\t, y(static_cast<T>(v.y))\n\t\t, z(static_cast<T>(v.z))\n\t{}\n\n\t// -- Component accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T & vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i)\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const& vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) const\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\t// -- Unary arithmetic operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, T, Q> const& v)\n\t\t{\n\t\t\tthis->x = v.x;\n\t\t\tthis->y = v.y;\n\t\t\tthis->z = v.z;\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x = static_cast<T>(v.x);\n\t\tthis->y = static_cast<T>(v.y);\n\t\tthis->z = static_cast<T>(v.z);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator+=(U scalar)\n\t{\n\t\tthis->x += static_cast<T>(scalar);\n\t\tthis->y += static_cast<T>(scalar);\n\t\tthis->z += static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x += static_cast<T>(v.x);\n\t\tthis->y += static_cast<T>(v.x);\n\t\tthis->z += static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x += static_cast<T>(v.x);\n\t\tthis->y += static_cast<T>(v.y);\n\t\tthis->z += static_cast<T>(v.z);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator-=(U scalar)\n\t{\n\t\tthis->x -= static_cast<T>(scalar);\n\t\tthis->y -= static_cast<T>(scalar);\n\t\tthis->z -= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x -= static_cast<T>(v.x);\n\t\tthis->y -= static_cast<T>(v.x);\n\t\tthis->z -= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x -= static_cast<T>(v.x);\n\t\tthis->y -= static_cast<T>(v.y);\n\t\tthis->z -= static_cast<T>(v.z);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator*=(U scalar)\n\t{\n\t\tthis->x *= static_cast<T>(scalar);\n\t\tthis->y *= static_cast<T>(scalar);\n\t\tthis->z *= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x *= static_cast<T>(v.x);\n\t\tthis->y *= static_cast<T>(v.x);\n\t\tthis->z *= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x *= static_cast<T>(v.x);\n\t\tthis->y *= static_cast<T>(v.y);\n\t\tthis->z *= static_cast<T>(v.z);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator/=(U v)\n\t{\n\t\tthis->x /= static_cast<T>(v);\n\t\tthis->y /= static_cast<T>(v);\n\t\tthis->z /= static_cast<T>(v);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x /= static_cast<T>(v.x);\n\t\tthis->y /= static_cast<T>(v.x);\n\t\tthis->z /= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x /= static_cast<T>(v.x);\n\t\tthis->y /= static_cast<T>(v.y);\n\t\tthis->z /= static_cast<T>(v.z);\n\t\treturn *this;\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator++()\n\t{\n\t\t++this->x;\n\t\t++this->y;\n\t\t++this->z;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator--()\n\t{\n\t\t--this->x;\n\t\t--this->y;\n\t\t--this->z;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> vec<3, T, Q>::operator++(int)\n\t{\n\t\tvec<3, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> vec<3, T, Q>::operator--(int)\n\t{\n\t\tvec<3, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator%=(U scalar)\n\t{\n\t\tthis->x %= scalar;\n\t\tthis->y %= scalar;\n\t\tthis->z %= scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x %= v.x;\n\t\tthis->y %= v.x;\n\t\tthis->z %= v.x;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x %= v.x;\n\t\tthis->y %= v.y;\n\t\tthis->z %= v.z;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator&=(U scalar)\n\t{\n\t\tthis->x &= scalar;\n\t\tthis->y &= scalar;\n\t\tthis->z &= scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x &= v.x;\n\t\tthis->y &= v.x;\n\t\tthis->z &= v.x;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x &= v.x;\n\t\tthis->y &= v.y;\n\t\tthis->z &= v.z;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator|=(U scalar)\n\t{\n\t\tthis->x |= scalar;\n\t\tthis->y |= scalar;\n\t\tthis->z |= scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x |= v.x;\n\t\tthis->y |= v.x;\n\t\tthis->z |= v.x;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x |= v.x;\n\t\tthis->y |= v.y;\n\t\tthis->z |= v.z;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator^=(U scalar)\n\t{\n\t\tthis->x ^= scalar;\n\t\tthis->y ^= scalar;\n\t\tthis->z ^= scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x ^= v.x;\n\t\tthis->y ^= v.x;\n\t\tthis->z ^= v.x;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x ^= v.x;\n\t\tthis->y ^= v.y;\n\t\tthis->z ^= v.z;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator<<=(U scalar)\n\t{\n\t\tthis->x <<= scalar;\n\t\tthis->y <<= scalar;\n\t\tthis->z <<= scalar;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x <<= static_cast<T>(v.x);\n\t\tthis->y <<= static_cast<T>(v.x);\n\t\tthis->z <<= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x <<= static_cast<T>(v.x);\n\t\tthis->y <<= static_cast<T>(v.y);\n\t\tthis->z <<= static_cast<T>(v.z);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator>>=(U scalar)\n\t{\n\t\tthis->x >>= static_cast<T>(scalar);\n\t\tthis->y >>= static_cast<T>(scalar);\n\t\tthis->z >>= static_cast<T>(scalar);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<1, U, Q> const& v)\n\t{\n\t\tthis->x >>= static_cast<T>(v.x);\n\t\tthis->y >>= static_cast<T>(v.x);\n\t\tthis->z >>= static_cast<T>(v.x);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<3, U, Q> const& v)\n\t{\n\t\tthis->x >>= static_cast<T>(v.x);\n\t\tthis->y >>= static_cast<T>(v.y);\n\t\tthis->z >>= static_cast<T>(v.z);\n\t\treturn *this;\n\t}\n\n\t// -- Unary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<3, T, Q> const& v)\n\t{\n\t\treturn v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\t-v.x, \n\t\t\t-v.y, \n\t\t\t-v.z);\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x + scalar,\n\t\t\tv.y + scalar,\n\t\t\tv.z + scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x + scalar.x,\n\t\t\tv.y + scalar.x,\n\t\t\tv.z + scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar + v.x,\n\t\t\tscalar + v.y,\n\t\t\tscalar + v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x + v.x,\n\t\t\tscalar.x + v.y,\n\t\t\tscalar.x + v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x + v2.x,\n\t\t\tv1.y + v2.y,\n\t\t\tv1.z + v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x - scalar,\n\t\t\tv.y - scalar,\n\t\t\tv.z - scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x - scalar.x,\n\t\t\tv.y - scalar.x,\n\t\t\tv.z - scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar - v.x,\n\t\t\tscalar - v.y,\n\t\t\tscalar - v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x - v.x,\n\t\t\tscalar.x - v.y,\n\t\t\tscalar.x - v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x - v2.x,\n\t\t\tv1.y - v2.y,\n\t\t\tv1.z - v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x * scalar,\n\t\t\tv.y * scalar,\n\t\t\tv.z * scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x * scalar.x,\n\t\t\tv.y * scalar.x,\n\t\t\tv.z * scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar * v.x,\n\t\t\tscalar * v.y,\n\t\t\tscalar * v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x * v.x,\n\t\t\tscalar.x * v.y,\n\t\t\tscalar.x * v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x * v2.x,\n\t\t\tv1.y * v2.y,\n\t\t\tv1.z * v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x / scalar,\n\t\t\tv.y / scalar,\n\t\t\tv.z / scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator/(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x / scalar.x,\n\t\t\tv.y / scalar.x,\n\t\t\tv.z / scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar / v.x,\n\t\t\tscalar / v.y,\n\t\t\tscalar / v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator/(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x / v.x,\n\t\t\tscalar.x / v.y,\n\t\t\tscalar.x / v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x / v2.x,\n\t\t\tv1.y / v2.y,\n\t\t\tv1.z / v2.z);\n\t}\n\n\t// -- Binary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x % scalar,\n\t\t\tv.y % scalar,\n\t\t\tv.z % scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator%(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x % scalar.x,\n\t\t\tv.y % scalar.x,\n\t\t\tv.z % scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator%(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar % v.x,\n\t\t\tscalar % v.y,\n\t\t\tscalar % v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator%(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x % v.x,\n\t\t\tscalar.x % v.y,\n\t\t\tscalar.x % v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x % v2.x,\n\t\t\tv1.y % v2.y,\n\t\t\tv1.z % v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator&(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x & scalar,\n\t\t\tv.y & scalar,\n\t\t\tv.z & scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator&(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x & scalar.x,\n\t\t\tv.y & scalar.x,\n\t\t\tv.z & scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar & v.x,\n\t\t\tscalar & v.y,\n\t\t\tscalar & v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator&(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x & v.x,\n\t\t\tscalar.x & v.y,\n\t\t\tscalar.x & v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x & v2.x,\n\t\t\tv1.y & v2.y,\n\t\t\tv1.z & v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x | scalar,\n\t\t\tv.y | scalar,\n\t\t\tv.z | scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator|(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x | scalar.x,\n\t\t\tv.y | scalar.x,\n\t\t\tv.z | scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar | v.x,\n\t\t\tscalar | v.y,\n\t\t\tscalar | v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator|(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x | v.x,\n\t\t\tscalar.x | v.y,\n\t\t\tscalar.x | v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x | v2.x,\n\t\t\tv1.y | v2.y,\n\t\t\tv1.z | v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x ^ scalar,\n\t\t\tv.y ^ scalar,\n\t\t\tv.z ^ scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator^(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x ^ scalar.x,\n\t\t\tv.y ^ scalar.x,\n\t\t\tv.z ^ scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar ^ v.x,\n\t\t\tscalar ^ v.y,\n\t\t\tscalar ^ v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator^(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x ^ v.x,\n\t\t\tscalar.x ^ v.y,\n\t\t\tscalar.x ^ v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x ^ v2.x,\n\t\t\tv1.y ^ v2.y,\n\t\t\tv1.z ^ v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x << scalar,\n\t\t\tv.y << scalar,\n\t\t\tv.z << scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x << scalar.x,\n\t\t\tv.y << scalar.x,\n\t\t\tv.z << scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar << v.x,\n\t\t\tscalar << v.y,\n\t\t\tscalar << v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x << v.x,\n\t\t\tscalar.x << v.y,\n\t\t\tscalar.x << v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x << v2.x,\n\t\t\tv1.y << v2.y,\n\t\t\tv1.z << v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x >> scalar,\n\t\t\tv.y >> scalar,\n\t\t\tv.z >> scalar);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv.x >> scalar.x,\n\t\t\tv.y >> scalar.x,\n\t\t\tv.z >> scalar.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar >> v.x,\n\t\t\tscalar >> v.y,\n\t\t\tscalar >> v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tscalar.x >> v.x,\n\t\t\tscalar.x >> v.y,\n\t\t\tscalar.x >> v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tv1.x >> v2.x,\n\t\t\tv1.y >> v2.y,\n\t\t\tv1.z >> v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator~(vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\t~v.x,\n\t\t\t~v.y,\n\t\t\t~v.z);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn\n\t\t\tdetail::compute_equal<T>::call(v1.x, v2.x) &&\n\t\t\tdetail::compute_equal<T>::call(v1.y, v2.y) &&\n\t\t\tdetail::compute_equal<T>::call(v1.z, v2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2)\n\t{\n\t\treturn !(v1 == v2);\n\t}\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2)\n\t{\n\t\treturn vec<3, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z);\n\t}\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2)\n\t{\n\t\treturn vec<3, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec4.hpp",
    "content": "/// @ref core\n/// @file glm/detail/type_vec4.hpp\n\n#pragma once\n\n#include \"type_vec.hpp\"\n#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n#\tif GLM_HAS_UNRESTRICTED_UNIONS\n#\t\tinclude \"_swizzle.hpp\"\n#\telse\n#\t\tinclude \"_swizzle_func.hpp\"\n#\tendif\n#endif //GLM_SWIZZLE\n#include <cstddef>\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tstruct vec<4, T, Q>\n\t{\n\t\t// -- Implementation detail --\n\n\t\ttypedef T value_type;\n\t\ttypedef vec<4, T, Q> type;\n\t\ttypedef vec<4, bool, Q> bool_type;\n\n\t\t// -- Data --\n\n#\t\tif GLM_HAS_ONLY_XYZW\n\t\t\tT x, y, z, w;\n\n#\t\telif GLM_HAS_ALIGNED_TYPE\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic push\n#\t\t\t\tpragma GCC diagnostic ignored \"-Wpedantic\"\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic push\n#\t\t\t\tpragma clang diagnostic ignored \"-Wgnu-anonymous-struct\"\n#\t\t\t\tpragma clang diagnostic ignored \"-Wnested-anon-types\"\n#\t\t\tendif\n\n\t\t\tunion\n\t\t\t{\n\t\t\t\tstruct { T x, y, z, w;};\n\t\t\t\tstruct { T r, g, b, a; };\n\t\t\t\tstruct { T s, t, p, q; };\n\n\t\t\t\ttypename detail::storage<T, sizeof(T) * 4, detail::is_aligned<Q>::value>::type data;\n\n#\t\t\t\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\t\t\t\t\tGLM_SWIZZLE4_2_MEMBERS(T, Q, x, y, z, w)\n\t\t\t\t\tGLM_SWIZZLE4_2_MEMBERS(T, Q, r, g, b, a)\n\t\t\t\t\tGLM_SWIZZLE4_2_MEMBERS(T, Q, s, t, p, q)\n\t\t\t\t\tGLM_SWIZZLE4_3_MEMBERS(T, Q, x, y, z, w)\n\t\t\t\t\tGLM_SWIZZLE4_3_MEMBERS(T, Q, r, g, b, a)\n\t\t\t\t\tGLM_SWIZZLE4_3_MEMBERS(T, Q, s, t, p, q)\n\t\t\t\t\tGLM_SWIZZLE4_4_MEMBERS(T, Q, x, y, z, w)\n\t\t\t\t\tGLM_SWIZZLE4_4_MEMBERS(T, Q, r, g, b, a)\n\t\t\t\t\tGLM_SWIZZLE4_4_MEMBERS(T, Q, s, t, p, q)\n#\t\t\t\tendif//GLM_SWIZZLE\n\t\t\t};\n\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic pop\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic pop\n#\t\t\tendif\n#\t\telse\n\t\t\tunion { T x, r, s; };\n\t\t\tunion { T y, g, t; };\n\t\t\tunion { T z, b, p; };\n\t\t\tunion { T w, a, q; };\n\n#\t\t\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\t\t\t\tGLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P)\n#\t\t\tendif//GLM_SWIZZLE\n#\t\tendif\n\n\t\t// -- Component accesses --\n\n\t\t/// Return the count of components of the vector\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;}\n\n\t\tGLM_FUNC_DECL T & operator[](length_type i);\n\t\tGLM_FUNC_DECL T const& operator[](length_type i) const;\n\n\t\t// -- Implicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(vec<4, T, Q> const& v) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(vec<4, T, P> const& v);\n\n\t\t// -- Explicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_SIMD explicit vec(T scalar);\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(T x, T y, T z, T w);\n\n\t\t// -- Conversion scalar constructors --\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename X, typename Y, typename Z, typename W>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_SIMD vec(X _x, Y _y, Z _z, W _w);\n\t\ttemplate<typename X, typename Y, typename Z, typename W>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _Y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w);\n\n\t\t// -- Conversion vector constructors --\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, typename C, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, B _z, C _w);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, typename C, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, typename C, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec<2, B, P> const& _yz, C _w);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, typename C, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, typename C, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, B _y, vec<2, C, P> const& _zw);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, typename C, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<3, A, P> const& _xyz, B _w);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(A _x, vec<3, B, P> const& _yzw);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename A, typename B, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw);\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v);\n\n\t\t// -- Swizzle constructors --\n#\t\tif GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)\n\t\t\ttemplate<int E0, int E1, int E2, int E3>\n\t\t\tGLM_FUNC_DECL vec(detail::_swizzle<4, T, Q, E0, E1, E2, E3> const& that)\n\t\t\t{\n\t\t\t\t*this = that();\n\t\t\t}\n\n\t\t\ttemplate<int E0, int E1, int F0, int F1>\n\t\t\tGLM_FUNC_DECL vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, detail::_swizzle<2, T, Q, F0, F1, -1, -2> const& u)\n\t\t\t{\n\t\t\t\t*this = vec<4, T, Q>(v(), u());\n\t\t\t}\n\n\t\t\ttemplate<int E0, int E1>\n\t\t\tGLM_FUNC_DECL vec(T const& x, T const& y, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v)\n\t\t\t{\n\t\t\t\t*this = vec<4, T, Q>(x, y, v());\n\t\t\t}\n\n\t\t\ttemplate<int E0, int E1>\n\t\t\tGLM_FUNC_DECL vec(T const& x, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& w)\n\t\t\t{\n\t\t\t\t*this = vec<4, T, Q>(x, v(), w);\n\t\t\t}\n\n\t\t\ttemplate<int E0, int E1>\n\t\t\tGLM_FUNC_DECL vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& z, T const& w)\n\t\t\t{\n\t\t\t\t*this = vec<4, T, Q>(v(), z, w);\n\t\t\t}\n\n\t\t\ttemplate<int E0, int E1, int E2>\n\t\t\tGLM_FUNC_DECL vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v, T const& w)\n\t\t\t{\n\t\t\t\t*this = vec<4, T, Q>(v(), w);\n\t\t\t}\n\n\t\t\ttemplate<int E0, int E1, int E2>\n\t\t\tGLM_FUNC_DECL vec(T const& x, detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v)\n\t\t\t{\n\t\t\t\t*this = vec<4, T, Q>(x, v());\n\t\t\t}\n#\t\tendif// GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED)\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator=(vec<4, T, Q> const& v) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator+=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator+=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator+=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator-=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator-=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator-=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator*=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator*=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator*=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator/=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator/=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q>& operator/=(vec<4, U, Q> const& v);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator++();\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator--();\n\t\tGLM_FUNC_DECL vec<4, T, Q> operator++(int);\n\t\tGLM_FUNC_DECL vec<4, T, Q> operator--(int);\n\n\t\t// -- Unary bit operators --\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator%=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator%=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator%=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator&=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator&=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator&=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator|=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator|=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator|=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator^=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator^=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator^=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator<<=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator<<=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator<<=(vec<4, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator>>=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator>>=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec<4, T, Q> & operator>>=(vec<4, U, Q> const& v);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator+(vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator-(vec<4, T, Q> const& v);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator+(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator-(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator/(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator%(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator&(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator|(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator|(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator^(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator^(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator<<(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator>>(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator~(vec<4, T, Q> const& v);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2);\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2);\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_vec4.inl\"\n#endif//GLM_EXTERNAL_TEMPLATE\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec4.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_tvec4.inl\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<typename T>\n\tstruct is_int\n\t{\n\t\tenum test {value = 0};\n\t};\n\n\ttemplate<>\n\tstruct is_int<uint32>\n\t{\n\t\tenum test {value = ~0};\n\t};\n\n\ttemplate<>\n\tstruct is_int<int32>\n\t{\n\t\tenum test {value = ~0};\n\t};\n\n\ttemplate<>\n\tstruct is_int<uint64>\n\t{\n\t\tenum test {value = ~0};\n\t};\n\n\ttemplate<>\n\tstruct is_int<int64>\n\t{\n\t\tenum test {value = ~0};\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_vec4_add\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_vec4_sub\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_vec4_mul\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_vec4_div\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_vec4_mod\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x % b.x, a.y % b.y, a.z % b.z, a.w % b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned>\n\tstruct compute_vec4_and\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x & b.x, a.y & b.y, a.z & b.z, a.w & b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned>\n\tstruct compute_vec4_or\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x | b.x, a.y | b.y, a.z | b.z, a.w | b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned>\n\tstruct compute_vec4_xor\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x ^ b.x, a.y ^ b.y, a.z ^ b.z, a.w ^ b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned>\n\tstruct compute_vec4_shift_left\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x << b.x, a.y << b.y, a.z << b.z, a.w << b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned>\n\tstruct compute_vec4_shift_right\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\treturn vec<4, T, Q>(a.x >> b.x, a.y >> b.y, a.z >> b.z, a.w >> b.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned>\n\tstruct compute_vec4_equal\n\t{\n\t\tGLM_FUNC_QUALIFIER static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t\t{\n\t\t\treturn\n\t\t\t\tdetail::compute_equal<T>::call(v1.x, v2.x) &&\n\t\t\t\tdetail::compute_equal<T>::call(v1.y, v2.y) &&\n\t\t\t\tdetail::compute_equal<T>::call(v1.z, v2.z) &&\n\t\t\t\tdetail::compute_equal<T>::call(v1.w, v2.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned>\n\tstruct compute_vec4_nequal\n\t{\n\t\tGLM_FUNC_QUALIFIER static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t\t{\n\t\t\treturn !compute_vec4_equal<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, int IsInt, std::size_t Size, bool Aligned>\n\tstruct compute_vec4_bitwise_not\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& v)\n\t\t{\n\t\t\treturn vec<4, T, Q>(~v.x, ~v.y, ~v.z, ~v.w);\n\t\t}\n\t};\n}//namespace detail\n\n\t// -- Implicit basic constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec()\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(vec<4, T, Q> const& v)\n\t\t\t: x(v.x), y(v.y), z(v.z), w(v.w)\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(vec<4, T, P> const& v)\n\t\t: x(v.x), y(v.y), z(v.z), w(v.w)\n\t{}\n\n\t// -- Explicit basic constructors --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(T scalar)\n\t\t: x(scalar), y(scalar), z(scalar), w(scalar)\n\t{}\n\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(T _x, T _y, T _z, T _w)\n\t\t: x(_x), y(_y), z(_z), w(_w)\n\t{}\n\n\t// -- Conversion scalar constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename X, typename Y, typename Z, typename W>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, T, Q>::vec(X _x, Y _y, Z _z, W _w)\n\t\t: x(static_cast<T>(_x))\n\t\t, y(static_cast<T>(_y))\n\t\t, z(static_cast<T>(_z))\n\t\t, w(static_cast<T>(_w))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename X, typename Y, typename Z, typename W>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w)\n\t\t: x(static_cast<T>(_x.x))\n\t\t, y(static_cast<T>(_y.x))\n\t\t, z(static_cast<T>(_z.x))\n\t\t, w(static_cast<T>(_w.x))\n\t{}\n\n\t// -- Conversion vector constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, typename C, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, B _z, C _w)\n\t\t: x(static_cast<T>(_xy.x))\n\t\t, y(static_cast<T>(_xy.y))\n\t\t, z(static_cast<T>(_z))\n\t\t, w(static_cast<T>(_w))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, typename C, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w)\n\t\t: x(static_cast<T>(_xy.x))\n\t\t, y(static_cast<T>(_xy.y))\n\t\t, z(static_cast<T>(_z.x))\n\t\t, w(static_cast<T>(_w.x))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, typename C, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(A _x, vec<2, B, P> const& _yz, C _w)\n\t\t: x(static_cast<T>(_x))\n\t\t, y(static_cast<T>(_yz.x))\n\t\t, z(static_cast<T>(_yz.y))\n\t\t, w(static_cast<T>(_w))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, typename C, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w)\n\t\t: x(static_cast<T>(_x.x))\n\t\t, y(static_cast<T>(_yz.x))\n\t\t, z(static_cast<T>(_yz.y))\n\t\t, w(static_cast<T>(_w.x))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, typename C, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(A _x, B _y, vec<2, C, P> const& _zw)\n\t\t: x(static_cast<T>(_x))\n\t\t, y(static_cast<T>(_y))\n\t\t, z(static_cast<T>(_zw.x))\n\t\t, w(static_cast<T>(_zw.y))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, typename C, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw)\n\t\t: x(static_cast<T>(_x.x))\n\t\t, y(static_cast<T>(_y.x))\n\t\t, z(static_cast<T>(_zw.x))\n\t\t, w(static_cast<T>(_zw.y))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, B _w)\n\t\t: x(static_cast<T>(_xyz.x))\n\t\t, y(static_cast<T>(_xyz.y))\n\t\t, z(static_cast<T>(_xyz.z))\n\t\t, w(static_cast<T>(_w))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w)\n\t\t: x(static_cast<T>(_xyz.x))\n\t\t, y(static_cast<T>(_xyz.y))\n\t\t, z(static_cast<T>(_xyz.z))\n\t\t, w(static_cast<T>(_w.x))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(A _x, vec<3, B, P> const& _yzw)\n\t\t: x(static_cast<T>(_x))\n\t\t, y(static_cast<T>(_yzw.x))\n\t\t, z(static_cast<T>(_yzw.y))\n\t\t, w(static_cast<T>(_yzw.z))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw)\n\t\t: x(static_cast<T>(_x.x))\n\t\t, y(static_cast<T>(_yzw.x))\n\t\t, z(static_cast<T>(_yzw.y))\n\t\t, w(static_cast<T>(_yzw.z))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename A, typename B, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw)\n\t\t: x(static_cast<T>(_xy.x))\n\t\t, y(static_cast<T>(_xy.y))\n\t\t, z(static_cast<T>(_zw.x))\n\t\t, w(static_cast<T>(_zw.y))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_CTOR vec<4, T, Q>::vec(vec<4, U, P> const& v)\n\t\t: x(static_cast<T>(v.x))\n\t\t, y(static_cast<T>(v.y))\n\t\t, z(static_cast<T>(v.z))\n\t\t, w(static_cast<T>(v.w))\n\t{}\n\n\t// -- Component accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i)\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i) const\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\t// -- Unary arithmetic operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, T, Q> const& v)\n\t\t{\n\t\t\tthis->x = v.x;\n\t\t\tthis->y = v.y;\n\t\t\tthis->z = v.z;\n\t\t\tthis->w = v.w;\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, U, Q> const& v)\n\t{\n\t\tthis->x = static_cast<T>(v.x);\n\t\tthis->y = static_cast<T>(v.y);\n\t\tthis->z = static_cast<T>(v.z);\n\t\tthis->w = static_cast<T>(v.w);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator+=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_add<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_add<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_add<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator-=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_sub<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_sub<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_sub<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator*=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_mul<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_mul<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_mul<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator/=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_div<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_div<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_div<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\t// -- Increment and decrement operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator++()\n\t{\n\t\t++this->x;\n\t\t++this->y;\n\t\t++this->z;\n\t\t++this->w;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator--()\n\t{\n\t\t--this->x;\n\t\t--this->y;\n\t\t--this->z;\n\t\t--this->w;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> vec<4, T, Q>::operator++(int)\n\t{\n\t\tvec<4, T, Q> Result(*this);\n\t\t++*this;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> vec<4, T, Q>::operator--(int)\n\t{\n\t\tvec<4, T, Q> Result(*this);\n\t\t--*this;\n\t\treturn Result;\n\t}\n\n\t// -- Unary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator%=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_mod<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_mod<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_mod<T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator&=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_and<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_and<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_and<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator|=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_or<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_or<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_or<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator^=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_xor<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_xor<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_xor<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator<<=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_shift_left<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_shift_left<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_shift_left<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator>>=(U scalar)\n\t{\n\t\treturn (*this = detail::compute_vec4_shift_right<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<1, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_shift_right<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<4, U, Q> const& v)\n\t{\n\t\treturn (*this = detail::compute_vec4_shift_right<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));\n\t}\n\n\t// -- Unary constant operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<4, T, Q> const& v)\n\t{\n\t\treturn v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(0) -= v;\n\t}\n\n\t// -- Binary arithmetic operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) += scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) += v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(v) += scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v2) += v1;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) += v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) -= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) -= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar) -= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1.x) -= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) -= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) *= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) *= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(v) *= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v2) *= v1;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) *= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator/(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) /= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) /= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar) /= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1.x) /= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) /= v2;\n\t}\n\n\t// -- Binary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) %= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) %= v2.x;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar) %= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar.x) %= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) %= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) &= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) &= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar) &= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator&(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1.x) &= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) &= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) |= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) |= v2.x;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar) |= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator|(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1.x) |= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) |= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) ^= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) ^= v2.x;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar) ^= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator^(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1.x) ^= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) ^= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) <<= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) <<= v2.x;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar) <<= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1.x) <<= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) <<= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar)\n\t{\n\t\treturn vec<4, T, Q>(v) >>= scalar;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) >>= v2.x;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(scalar) >>= v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1.x) >>= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn vec<4, T, Q>(v1) >>= v2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator~(vec<4, T, Q> const& v)\n\t{\n\t\treturn detail::compute_vec4_bitwise_not<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn detail::compute_vec4_equal<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)\n\t{\n\t\treturn detail::compute_vec4_nequal<T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);\n\t}\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2)\n\t{\n\t\treturn vec<4, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z, v1.w && v2.w);\n\t}\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2)\n\t{\n\t\treturn vec<4, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z, v1.w || v2.w);\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_ALIGNED_TYPE\n#\tinclude \"type_vec4_simd.inl\"\n#endif\n"
  },
  {
    "path": "external/glm/glm/detail/type_vec4_simd.inl",
    "content": "/// @ref core\n/// @file glm/detail/type_tvec4_simd.inl\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nnamespace glm{\nnamespace detail\n{\n#\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\ttemplate<qualifier Q, int E0, int E1, int E2, int E3>\n\tstruct _swizzle_base1<4, float, Q, E0,E1,E2,E3, true> : public _swizzle_base0<float, 4>\n\t{ \n\t\tGLM_FUNC_QUALIFIER vec<4, float, Q> operator ()()  const\n\t\t{\n\t\t\t__m128 data = *reinterpret_cast<__m128 const*>(&this->_buffer);\n\n\t\t\tvec<4, float, Q> Result;\n#\t\t\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\t\t\t\tResult.data = _mm_permute_ps(data, _MM_SHUFFLE(E3, E2, E1, E0));\n#\t\t\telse\n\t\t\t\tResult.data = _mm_shuffle_ps(data, data, _MM_SHUFFLE(E3, E2, E1, E0));\n#\t\t\tendif\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q, int E0, int E1, int E2, int E3>\n\tstruct _swizzle_base1<4, int32, Q, E0,E1,E2,E3, true> : public _swizzle_base0<int32, 4>\n\t{ \n\t\tGLM_FUNC_QUALIFIER vec<4, int32, Q> operator ()()  const\n\t\t{\n\t\t\t__m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer);\n\n\t\t\tvec<4, int32, Q> Result;\n\t\t\tResult.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0));\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q, int E0, int E1, int E2, int E3>\n\tstruct _swizzle_base1<4, uint32, Q, E0,E1,E2,E3, true> : public _swizzle_base0<uint32, 4>\n\t{ \n\t\tGLM_FUNC_QUALIFIER vec<4, uint32, Q> operator ()()  const\n\t\t{\n\t\t\t__m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer);\n\n\t\t\tvec<4, uint32, Q> Result;\n\t\t\tResult.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0));\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif// GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_add<float, Q, true>\n\t{\n\t\tstatic vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_add_ps(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_add<double, Q, true>\n\t{\n\t\tstatic vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b)\n\t\t{\n\t\t\tvec<4, double, Q> Result;\n\t\t\tResult.data = _mm256_add_pd(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_sub<float, Q, true>\n\t{\n\t\tstatic vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_sub_ps(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_sub<double, Q, true>\n\t{\n\t\tstatic vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b)\n\t\t{\n\t\t\tvec<4, double, Q> Result;\n\t\t\tResult.data = _mm256_sub_pd(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_mul<float, Q, true>\n\t{\n\t\tstatic vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_mul_ps(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_mul<double, Q, true>\n\t{\n\t\tstatic vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b)\n\t\t{\n\t\t\tvec<4, double, Q> Result;\n\t\t\tResult.data = _mm256_mul_pd(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_div<float, Q, true>\n\t{\n\t\tstatic vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_div_ps(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\t#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_div<double, Q, true>\n\t{\n\t\tstatic vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b)\n\t\t{\n\t\t\tvec<4, double, Q> Result;\n\t\t\tResult.data = _mm256_div_pd(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<>\n\tstruct compute_vec4_div<float, aligned_lowp, true>\n\t{\n\t\tstatic vec<4, float, aligned_lowp> call(vec<4, float, aligned_lowp> const& a, vec<4, float, aligned_lowp> const& b)\n\t\t{\n\t\t\tvec<4, float, aligned_lowp> Result;\n\t\t\tResult.data = _mm_mul_ps(a.data, _mm_rcp_ps(b.data));\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_and<T, Q, true, 32, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm_and_si128(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX2_BIT\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_and<T, Q, true, 64, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm256_and_si256(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_or<T, Q, true, 32, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm_or_si128(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX2_BIT\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_or<T, Q, true, 64, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm256_or_si256(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_xor<T, Q, true, 32, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm_xor_si128(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX2_BIT\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_xor<T, Q, true, 64, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm256_xor_si256(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_shift_left<T, Q, true, 32, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm_sll_epi32(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX2_BIT\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_shift_left<T, Q, true, 64, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm256_sll_epi64(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_shift_right<T, Q, true, 32, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm_srl_epi32(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX2_BIT\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_shift_right<T, Q, true, 64, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& a, vec<4, T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm256_srl_epi64(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_bitwise_not<T, Q, true, 32, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& v)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm_xor_si128(v.data, _mm_set1_epi32(-1));\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX2_BIT\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_vec4_bitwise_not<T, Q, true, 64, true>\n\t{\n\t\tstatic vec<4, T, Q> call(vec<4, T, Q> const& v)\n\t\t{\n\t\t\tvec<4, T, Q> Result;\n\t\t\tResult.data = _mm256_xor_si256(v.data, _mm_set1_epi32(-1));\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_equal<float, Q, false, 32, true>\n\t{\n\t\tstatic bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2)\n\t\t{\n\t\t\treturn _mm_movemask_ps(_mm_cmpeq_ps(v1.data, v2.data)) != 0;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_equal<int32, Q, true, 32, true>\n\t{\n\t\tstatic bool call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2)\n\t\t{\n\t\t\treturn _mm_movemask_epi8(_mm_cmpeq_epi32(v1.data, v2.data)) != 0;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_nequal<float, Q, false, 32, true>\n\t{\n\t\tstatic bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2)\n\t\t{\n\t\t\treturn _mm_movemask_ps(_mm_cmpneq_ps(v1.data, v2.data)) != 0;\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_vec4_nequal<int32, Q, true, 32, true>\n\t{\n\t\tstatic bool call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2)\n\t\t{\n\t\t\treturn _mm_movemask_epi8(_mm_cmpneq_epi32(v1.data, v2.data)) != 0;\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_lowp>::vec(float _s) :\n\t\tdata(_mm_set1_ps(_s))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_mediump>::vec(float _s) :\n\t\tdata(_mm_set1_ps(_s))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_highp>::vec(float _s) :\n\t\tdata(_mm_set1_ps(_s))\n\t{}\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, double, aligned_lowp>::vec(double _s) :\n\t\tdata(_mm256_set1_pd(_s))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, double, aligned_mediump>::vec(double _s) :\n\t\tdata(_mm256_set1_pd(_s))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, double, aligned_highp>::vec(double _s) :\n\t\tdata(_mm256_set1_pd(_s))\n\t{}\n#\tendif\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_lowp>::vec(int32 _s) :\n\t\tdata(_mm_set1_epi32(_s))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_mediump>::vec(int32 _s) :\n\t\tdata(_mm_set1_epi32(_s))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_highp>::vec(int32 _s) :\n\t\tdata(_mm_set1_epi32(_s))\n\t{}\n\n#\tif GLM_ARCH & GLM_ARCH_AVX2_BIT\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int64, aligned_lowp>::vec(int64 _s) :\n\t\tdata(_mm256_set1_epi64x(_s))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int64, aligned_mediump>::vec(int64 _s) :\n\t\tdata(_mm256_set1_epi64x(_s))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int64, aligned_highp>::vec(int64 _s) :\n\t\tdata(_mm256_set1_epi64x(_s))\n\t{}\n#\tendif\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_lowp>::vec(float _x, float _y, float _z, float _w) :\n\t\tdata(_mm_set_ps(_w, _z, _y, _x))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_mediump>::vec(float _x, float _y, float _z, float _w) :\n\t\tdata(_mm_set_ps(_w, _z, _y, _x))\n\t{}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_highp>::vec(float _x, float _y, float _z, float _w) :\n\t\tdata(_mm_set_ps(_w, _z, _y, _x))\n\t{}\n\n\ttemplate<>\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_lowp>::vec(int32 _x, int32 _y, int32 _z, int32 _w) :\n\t\tdata(_mm_set_epi32(_w, _z, _y, _x))\n\t{}\n\n\ttemplate<>\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_mediump>::vec(int32 _x, int32 _y, int32 _z, int32 _w) :\n\t\tdata(_mm_set_epi32(_w, _z, _y, _x))\n\t{}\n\n\ttemplate<>\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, int32, aligned_highp>::vec(int32 _x, int32 _y, int32 _z, int32 _w) :\n\t\tdata(_mm_set_epi32(_w, _z, _y, _x))\n\t{}\n\n\ttemplate<>\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_lowp>::vec(int32 _x, int32 _y, int32 _z, int32 _w) :\n\t\tdata(_mm_castsi128_ps(_mm_set_epi32(_w, _z, _y, _x)))\n\t{}\n\n\ttemplate<>\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_mediump>::vec(int32 _x, int32 _y, int32 _z, int32 _w) :\n\t\tdata(_mm_castsi128_ps(_mm_set_epi32(_w, _z, _y, _x)))\n\t{}\n\n\ttemplate<>\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR_SIMD vec<4, float, aligned_highp>::vec(int32 _x, int32 _y, int32 _z, int32 _w) :\n\t\tdata(_mm_castsi128_ps(_mm_set_epi32(_w, _z, _y, _x)))\n\t{}\n}//namespace glm\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/exponential.hpp",
    "content": "/// @ref core\n/// @file glm/exponential.hpp\n/// \n/// @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>\n///\n/// @defgroup core_func_exponential Exponential functions\n/// @ingroup core\n/// \n/// Include <glm/exponential.hpp> to use these core features.\n///\n/// These all operate component-wise. The description is per component.\n\n#pragma once\n\n#include \"detail/type_vec1.hpp\"\n#include \"detail/type_vec2.hpp\"\n#include \"detail/type_vec3.hpp\"\n#include \"detail/type_vec4.hpp\"\n#include <cmath>\n\nnamespace glm\n{\n\t/// @addtogroup core_func_exponential\n\t/// @{\n\n\t/// Returns 'base' raised to the power 'exponent'. \n\t///\n\t/// @param base Floating point value. pow function is defined for input values of 'base' defined in the range (inf-, inf+) in the limit of the type qualifier.\n\t/// @param exponent Floating point value representing the 'exponent'.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/pow.xml\">GLSL pow man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> pow(vec<L, T, Q> const& base, vec<L, T, Q> const& exponent);\n\n\t/// Returns the natural exponentiation of x, i.e., e^x.\n\t///\n\t/// @param v exp function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier.\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/exp.xml\">GLSL exp man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> exp(vec<L, T, Q> const& v);\n\n\t/// Returns the natural logarithm of v, i.e., \n\t/// returns the value y which satisfies the equation x = e^y. \n\t/// Results are undefined if v <= 0.\n\t///\n\t/// @param v log function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier.\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/log.xml\">GLSL log man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> log(vec<L, T, Q> const& v);\n\n\t/// Returns 2 raised to the v power.\n\t/// \n\t/// @param v exp2 function is defined for input values of v defined in the range (inf-, inf+) in the limit of the type qualifier.\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/exp2.xml\">GLSL exp2 man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> exp2(vec<L, T, Q> const& v);\n\n\t/// Returns the base 2 log of x, i.e., returns the value y, \n\t/// which satisfies the equation x = 2 ^ y.\n\t/// \n\t/// @param v log2 function is defined for input values of v defined in the range (0, inf+) in the limit of the type qualifier.\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/log2.xml\">GLSL log2 man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> log2(vec<L, T, Q> const& v);\n\n\t/// Returns the positive square root of v.\n\t/// \n\t/// @param v sqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier.\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sqrt.xml\">GLSL sqrt man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> sqrt(vec<L, T, Q> const& v);\n\n\t/// Returns the reciprocal of the positive square root of v.\n\t/// \n\t/// @param v inversesqrt function is defined for input values of v defined in the range [0, inf+) in the limit of the type qualifier.\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/inversesqrt.xml\">GLSL inversesqrt man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> inversesqrt(vec<L, T, Q> const& v);\n\n\t/// @}\n}//namespace glm\n\n#include \"detail/func_exponential.inl\"\n"
  },
  {
    "path": "external/glm/glm/ext/vec1.hpp",
    "content": "/// @ref ext_vec1\n/// @file glm/ext/vec1.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup ext_vec1 GLM_EXT_vec1\n/// @ingroup ext\n///\n/// Include <glm/ext/vec1.hpp> to use the features of this extension.\n/// \n/// Add vec1, ivec1, uvec1 and bvec1 types.\n\n#pragma once\n\n#include \"../fwd.hpp\"\n#include \"../detail/type_vec.hpp\"\n#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n#\tif GLM_HAS_UNRESTRICTED_UNIONS\n#\t\tinclude \"../detail/_swizzle.hpp\"\n#\telse\n#\t\tinclude \"../detail/_swizzle_func.hpp\"\n#\tendif\n#endif //GLM_SWIZZLE\n#include <cstddef>\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_EXT_vec1 extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup ext_vec1\n\t/// @{\n\n\ttemplate<typename T, qualifier Q>\n\tstruct vec<1, T, Q>\n\t{\n\t\t// -- Implementation detail --\n\n\t\ttypedef T value_type;\n\t\ttypedef vec type;\n\t\ttypedef vec<1, bool, Q> bool_type;\n\n\t\t// -- Data --\n\n#\t\tif GLM_HAS_ONLY_XYZW\n\t\t\tT x;\n\n#\t\telif GLM_HAS_ALIGNED_TYPE\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic push\n#\t\t\t\tpragma GCC diagnostic ignored \"-Wpedantic\"\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic push\n#\t\t\t\tpragma clang diagnostic ignored \"-Wgnu-anonymous-struct\"\n#\t\t\t\tpragma clang diagnostic ignored \"-Wnested-anon-types\"\n#\t\t\tendif\n\t\t\n\t\t\tunion\n\t\t\t{\n\t\t\t\tT x;\n\t\t\t\tT r;\n\t\t\t\tT s;\n/*\n#\t\t\t\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\t\t\t\t\t_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, x)\n\t\t\t\t\t_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, r)\n\t\t\t\t\t_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, s)\n\t\t\t\t\t_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, x)\n\t\t\t\t\t_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, r)\n\t\t\t\t\t_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, s)\n\t\t\t\t\t_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, x)\n\t\t\t\t\t_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, r)\n\t\t\t\t\t_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, s)\n#\t\t\t\tendif//GLM_SWIZZLE*/\n\t\t\t};\n\t\t\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic pop\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic pop\n#\t\t\tendif\n#\t\telse\n\t\t\tunion {T x, r, s;};\n/*\n#\t\t\tif GLM_SWIZZLE == GLM_SWIZZLE_ENABLED\n\t\t\t\tGLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, P, tvec2, tvec2, tvec3, tvec4)\n#\t\t\tendif//GLM_SWIZZLE*/\n#\t\tendif\n\n\t\t// -- Component accesses --\n\n\t\t/// Return the count of components of the vector\n\t\ttypedef length_t length_type;\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 1;}\n\n\t\tGLM_FUNC_DECL T & operator[](length_type i);\n\t\tGLM_FUNC_DECL T const& operator[](length_type i) const;\n\n\t\t// -- Implicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, T, P> const& v);\n\n\t\t// -- Explicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);\n\n\t\t// -- Conversion vector constructors --\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<2, U, P> const& v);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v);\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v);\n\n\t\t/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<1, U, P> const& v);\n\n\t\t// -- Swizzle constructors --\n/*\n#\t\tif(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))\n\t\t\ttemplate<int E0>\n\t\t\tGLM_FUNC_DECL tvec(detail::_swizzle<1, T, Q, tvec1, E0, -1,-2,-3> const& that)\n\t\t\t{\n\t\t\t\t*this = that();\n\t\t\t}\n#\t\tendif//(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))\n*/\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL vec & operator=(vec const& v) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator+=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator+=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator-=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator-=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator*=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator*=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator/=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator/=(vec<1, U, Q> const& v);\n\n\t\t// -- Increment and decrement operators --\n\n\t\tGLM_FUNC_DECL vec & operator++();\n\t\tGLM_FUNC_DECL vec & operator--();\n\t\tGLM_FUNC_DECL vec operator++(int);\n\t\tGLM_FUNC_DECL vec operator--(int);\n\n\t\t// -- Unary bit operators --\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator%=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator&=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator|=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator^=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator<<=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator>>=(U scalar);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v);\n\t};\n\n\t// -- Unary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> operator~(vec<1, T, Q> const& v);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_DECL vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2);\n\n\ttemplate<qualifier Q>\n\tGLM_FUNC_DECL vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2);\n\n\t/// 1 component vector of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, float, highp>\t\thighp_vec1;\n\n\t/// 1 component vector of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, float, mediump>\t\tmediump_vec1;\n\n\t/// 1 component vector of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, float, lowp>\t\t\tlowp_vec1;\n\n\t/// 1 component vector of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, double, highp>\t\thighp_dvec1;\n\n\t/// 1 component vector of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, double, mediump>\t\tmediump_dvec1;\n\n\t/// 1 component vector of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, double, lowp>\t\tlowp_dvec1;\n\n\t/// 1 component vector of signed integer numbers.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, int, highp>\t\t\thighp_ivec1;\n\n\t/// 1 component vector of signed integer numbers.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, int, mediump>\t\tmediump_ivec1;\n\n\t/// 1 component vector of signed integer numbers.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, int, lowp>\t\t\tlowp_ivec1;\n\n\t/// 1 component vector of unsigned integer numbers.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, uint, highp>\t\t\thighp_uvec1;\n\n\t/// 1 component vector of unsigned integer numbers.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, uint, mediump>\t\tmediump_uvec1;\n\n\t/// 1 component vector of unsigned integer numbers.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, uint, lowp>\t\t\tlowp_uvec1;\n\n\t/// 1 component vector of bool values.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, bool, highp>\t\t\thighp_bvec1;\n\n\t/// 1 component vector of bool values.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, bool, mediump>\t\tmediump_bvec1;\n\n\t/// 1 component vector of bool values.\n\t///\n\t/// @see ext_vec1\n\ttypedef vec<1, bool, lowp>\t\t\tlowp_bvec1;\n\n#if GLM_HAS_TEMPLATE_ALIASES\n\ttemplate <typename T, qualifier Q = defaultp> using tvec1 = vec<1, T, Q>;\n#endif//GLM_HAS_TEMPLATE_ALIASES\n\n\t/// @}\n}//namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"../detail/type_vec1.inl\"\n#endif//GLM_EXTERNAL_TEMPLATE\n"
  },
  {
    "path": "external/glm/glm/ext/vec1.inl",
    "content": ""
  },
  {
    "path": "external/glm/glm/ext/vector_relational.hpp",
    "content": "/// @ref ext_vector_relational\n/// @file glm/ext/vector_relational.hpp\n/// \n/// @see core (dependence)\n///\n/// @defgroup ext_vector_relational GLM_EXT_vector_relational\n/// @ingroup ext\n///\n/// Include <glm/ext/vector_relational.hpp> to use the features of this extension.\n/// \n/// Comparison functions for a user defined epsilon values.\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_EXT_vector_relational extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup ext_vector_relational\n\t/// @{\n\n\t/// Returns the component-wise comparison of |x - y| < epsilon.\n\t/// True if this expression is satisfied.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see ext_vector_relational\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon);\n\n\t/// Returns the component-wise comparison of |x - y| < epsilon.\n\t/// True if this expression is satisfied.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see ext_vector_relational\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon);\n\n\t/// Returns the component-wise comparison of |x - y| < epsilon.\n\t/// True if this expression is satisfied.\n\t///\n\t/// @tparam genType Floating-point or integer scalar types\n\t///\n\t/// @see ext_vector_relational\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool equal(genType const& x, genType const& y, genType const& epsilon);\n\n\t/// Returns the component-wise comparison of |x - y| < epsilon.\n\t/// True if this expression is not satisfied.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see ext_vector_relational\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon);\n\n\t/// Returns the component-wise comparison of |x - y| < epsilon.\n\t/// True if this expression is not satisfied.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see ext_vector_relational\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon);\n\n\t/// Returns the component-wise comparison of |x - y| >= epsilon.\n\t/// True if this expression is not satisfied.\n\t///\n\t/// @tparam genType Floating-point or integer scalar types\n\t///\n\t/// @see ext_vector_relational\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool notEqual(genType const& x, genType const& y, genType const& epsilon);\n\n\t/// Returns whether vector components values are within an interval. A open interval excludes its endpoints, and is denoted with square brackets.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see ext_vector_relational\n\ttemplate <length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> openBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max);\n\n\t/// Returns whether vector components values are within an interval. A closed interval includes its endpoints, and is denoted with square brackets.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see ext_vector_relational\n\ttemplate <length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> closeBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max);\n\n\t/// @}\n}//namespace glm\n\n#include \"vector_relational.inl\"\n"
  },
  {
    "path": "external/glm/glm/ext/vector_relational.inl",
    "content": "/// @ref ext_vector_relational\n/// @file glm/ext/vector_relational.inl\n\n// Dependency:\n#include \"../vector_relational.hpp\"\n#include \"../common.hpp\"\n#include \"../detail/type_vec.hpp\"\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool equal(genType const& x, genType const& y, genType const& epsilon)\n\t{\n\t\treturn abs(x - y) < epsilon;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon)\n\t{\n\t\treturn lessThan(abs(x - y), vec<L, T, Q>(epsilon));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon)\n\t{\n\t\treturn lessThan(abs(x - y), epsilon);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool notEqual(genType const& x, genType const& y, genType const& epsilon)\n\t{\n\t\treturn abs(x - y) >= epsilon;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon)\n\t{\n\t\treturn greaterThanEqual(abs(x - y), vec<L, T, Q>(epsilon));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon)\n\t{\n\t\treturn greaterThanEqual(abs(x - y), epsilon);\n\t}\n\n\ttemplate <length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> openBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max)\n\t{\n\t\treturn greaterThan(Value, Min) && lessThan(Value, Max);\n\t}\n\n\ttemplate <length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> closeBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max)\n\t{\n\t\treturn greaterThanEqual(Value, Min) && lessThanEqual(Value, Max);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/ext.hpp",
    "content": "/// @file glm/ext.hpp\n///\n/// @ref core (Dependence)\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"glm.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_EXT_INCLUDED_DISPLAYED)\n#\tdefine GLM_MESSAGE_EXT_INCLUDED_DISPLAYED\n#\tpragma message(\"GLM: All extensions included (not recommanded)\")\n#endif//GLM_MESSAGES\n\n#include \"./ext/vector_relational.hpp\"\n\n#include \"./gtc/bitfield.hpp\"\n#include \"./gtc/color_space.hpp\"\n#include \"./gtc/constants.hpp\"\n#include \"./gtc/epsilon.hpp\"\n#include \"./gtc/integer.hpp\"\n#include \"./gtc/matrix_access.hpp\"\n#include \"./gtc/matrix_integer.hpp\"\n#include \"./gtc/matrix_inverse.hpp\"\n#include \"./gtc/matrix_transform.hpp\"\n#include \"./gtc/noise.hpp\"\n#include \"./gtc/packing.hpp\"\n#include \"./gtc/quaternion.hpp\"\n#include \"./gtc/random.hpp\"\n#include \"./gtc/reciprocal.hpp\"\n#include \"./gtc/round.hpp\"\n//#include \"./gtc/type_aligned.hpp\"\n#include \"./gtc/type_precision.hpp\"\n#include \"./gtc/type_ptr.hpp\"\n#include \"./gtc/ulp.hpp\"\n#include \"./gtc/vec1.hpp\"\n#if GLM_HAS_ALIGNED_TYPE\n#\tinclude \"./gtc/type_aligned.hpp\"\n#endif\n\n#ifdef GLM_ENABLE_EXPERIMENTAL\n#include \"./gtx/associated_min_max.hpp\"\n#include \"./gtx/bit.hpp\"\n#include \"./gtx/closest_point.hpp\"\n#include \"./gtx/color_encoding.hpp\"\n#include \"./gtx/color_space.hpp\"\n#include \"./gtx/color_space_YCoCg.hpp\"\n#include \"./gtx/compatibility.hpp\"\n#include \"./gtx/component_wise.hpp\"\n#include \"./gtx/dual_quaternion.hpp\"\n#include \"./gtx/euler_angles.hpp\"\n#include \"./gtx/extend.hpp\"\n#include \"./gtx/extended_min_max.hpp\"\n#include \"./gtx/fast_exponential.hpp\"\n#include \"./gtx/fast_square_root.hpp\"\n#include \"./gtx/fast_trigonometry.hpp\"\n#include \"./gtx/functions.hpp\"\n#include \"./gtx/gradient_paint.hpp\"\n#include \"./gtx/handed_coordinate_space.hpp\"\n#include \"./gtx/integer.hpp\"\n#include \"./gtx/intersect.hpp\"\n#include \"./gtx/log_base.hpp\"\n#include \"./gtx/matrix_cross_product.hpp\"\n#include \"./gtx/matrix_interpolation.hpp\"\n#include \"./gtx/matrix_major_storage.hpp\"\n#include \"./gtx/matrix_operation.hpp\"\n#include \"./gtx/matrix_query.hpp\"\n#include \"./gtx/mixed_product.hpp\"\n#include \"./gtx/norm.hpp\"\n#include \"./gtx/normal.hpp\"\n#include \"./gtx/normalize_dot.hpp\"\n#include \"./gtx/number_precision.hpp\"\n#include \"./gtx/optimum_pow.hpp\"\n#include \"./gtx/orthonormalize.hpp\"\n#include \"./gtx/perpendicular.hpp\"\n#include \"./gtx/polar_coordinates.hpp\"\n#include \"./gtx/projection.hpp\"\n#include \"./gtx/quaternion.hpp\"\n#include \"./gtx/raw_data.hpp\"\n#include \"./gtx/rotate_vector.hpp\"\n#include \"./gtx/spline.hpp\"\n#include \"./gtx/std_based_type.hpp\"\n#if !(GLM_COMPILER & GLM_COMPILER_CUDA)\n#\tinclude \"./gtx/string_cast.hpp\"\n#endif\n#include \"./gtx/transform.hpp\"\n#include \"./gtx/transform2.hpp\"\n#include \"./gtx/vec_swizzle.hpp\"\n#include \"./gtx/vector_angle.hpp\"\n#include \"./gtx/vector_query.hpp\"\n#include \"./gtx/wrap.hpp\"\n\n#if GLM_HAS_TEMPLATE_ALIASES\n#\tinclude \"./gtx/scalar_multiplication.hpp\"\n#endif\n\n#if GLM_HAS_RANGE_FOR\n#\tinclude \"./gtx/range.hpp\"\n#endif\n#endif//GLM_ENABLE_EXPERIMENTAL\n"
  },
  {
    "path": "external/glm/glm/fwd.hpp",
    "content": "/// @ref core\n/// @file glm/fwd.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_int.hpp\"\n#include \"detail/type_float.hpp\"\n#include \"detail/type_vec.hpp\"\n#include \"detail/type_mat.hpp\"\n\n//////////////////////\n// GLM_GTC_quaternion\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q> struct tquat;\n\n\t/// Quaternion of low single-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef tquat<float, lowp>\t\tlowp_quat;\n\n\t/// Quaternion of medium single-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef tquat<float, mediump>\tmediump_quat;\n\n\t/// Quaternion of high single-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef tquat<float, highp>\t\thighp_quat;\n\n#if(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef highp_quat\t\t\tquat;\n#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef mediump_quat\t\tquat;\n#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef lowp_quat\t\t\tquat;\n#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\t/// Quaternion of default single-qualifier floating-point numbers.\n\ttypedef highp_quat\t\t\tquat;\n#endif\n\n\t/// Quaternion of low single-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef lowp_quat\t\t\tlowp_fquat;\n\n\t/// Quaternion of medium single-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef mediump_quat\t\tmediump_fquat;\n\n\t/// Quaternion of high single-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef highp_quat\t\t\thighp_fquat;\n\n\t/// Quaternion of default single-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef quat\t\t\t\tfquat;\n\n\n\t/// Quaternion of low double-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef tquat<double, lowp>\t\tlowp_dquat;\n\t\n\t/// Quaternion of medium double-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef tquat<double, mediump>\tmediump_dquat;\n\t\n\t/// Quaternion of high double-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef tquat<double, highp>\thighp_dquat;\n\t\n#if(defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef highp_dquat\t\t\tdquat;\n#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef mediump_dquat\t\tdquat;\n#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef lowp_dquat\t\t\tdquat;\n#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))\n\t/// Quaternion of default double-qualifier floating-point numbers.\n\t///\n\t/// @see gtc_quaternion\n\ttypedef highp_dquat\t\t\tdquat;\n#endif\n\n}//namespace glm\n\n//////////////////////\n// GLM_GTC_precision\nnamespace glm\n{\n\t/// Low qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 lowp_int8;\n\t\n\t/// Low qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 lowp_int16;\n\n\t/// Low qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 lowp_int32;\n\n\t/// Low qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 lowp_int64;\n\n\t/// Low qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 lowp_int8_t;\n\t\n\t/// Low qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 lowp_int16_t;\n\n\t/// Low qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 lowp_int32_t;\n\n\t/// Low qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 lowp_int64_t;\n\n\t/// Low qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 lowp_i8;\n\t\n\t/// Low qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 lowp_i16;\n\n\t/// Low qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 lowp_i32;\n\n\t/// Low qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 lowp_i64;\n\n\t/// Medium qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 mediump_int8;\n\t\n\t/// Medium qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 mediump_int16;\n\n\t/// Medium qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 mediump_int32;\n\n\t/// Medium qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 mediump_int64;\n\n\t/// Medium qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 mediump_int8_t;\n\t\n\t/// Medium qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 mediump_int16_t;\n\n\t/// Medium qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 mediump_int32_t;\n\n\t/// Medium qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 mediump_int64_t;\n\n\t/// Medium qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 mediump_i8;\n\t\n\t/// Medium qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 mediump_i16;\n\n\t/// Medium qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 mediump_i32;\n\n\t/// Medium qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 mediump_i64;\n\n\t/// High qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 highp_int8;\n\t\n\t/// High qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 highp_int16;\n\n\t/// High qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 highp_int32;\n\n\t/// High qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 highp_int64;\n\n\t/// High qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 highp_int8_t;\n\t\n\t/// High qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 highp_int16_t;\n\n\t/// 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 highp_int32_t;\n\n\t/// High qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 highp_int64_t;\n\n\t/// High qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 highp_i8;\n\t\n\t/// High qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 highp_i16;\n\n\t/// High qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 highp_i32;\n\n\t/// High qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 highp_i64;\n\t\n\n\t/// 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 int8;\n\t\n\t/// 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 int16;\n\n\t/// 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 int32;\n\n\t/// 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 int64;\n\n\n#if GLM_HAS_EXTENDED_INTEGER_TYPE\n\tusing std::int8_t;\n\tusing std::int16_t;\n\tusing std::int32_t;\n\tusing std::int64_t;\n#else\n\t/// 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 int8_t;\n\t\n\t/// 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 int16_t;\n\n\t/// 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 int32_t;\n\n\t/// 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 int64_t;\n#endif\n\n\t/// 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 i8;\n\t\n\t/// 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 i16;\n\n\t/// 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 i32;\n\n\t/// 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 i64;\n\t\n\t\n\t\n\t/// Low qualifier 8 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i8, lowp> lowp_i8vec1;\n\t\n\t/// Low qualifier 8 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i8, lowp> lowp_i8vec2;\n\t\n\t/// Low qualifier 8 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i8, lowp> lowp_i8vec3;\n\t\n\t/// Low qualifier 8 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i8, lowp> lowp_i8vec4;\n\t\n\n\t/// Medium qualifier 8 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i8, mediump> mediump_i8vec1;\n\t\n\t/// Medium qualifier 8 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i8, mediump> mediump_i8vec2;\n\t\n\t/// Medium qualifier 8 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i8, mediump> mediump_i8vec3;\n\t\n\t/// Medium qualifier 8 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i8, mediump> mediump_i8vec4;\n\t\n\t\n\t/// High qualifier 8 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i8, highp> highp_i8vec1;\n\t\n\t/// High qualifier 8 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i8, highp> highp_i8vec2;\n\t\n\t/// High qualifier 8 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i8, highp> highp_i8vec3;\n\t\n\t/// High qualifier 8 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i8, highp> highp_i8vec4;\n\t\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_i8vec1\t\t\t\ti8vec1;\n\ttypedef lowp_i8vec2\t\t\t\ti8vec2;\n\ttypedef lowp_i8vec3\t\t\t\ti8vec3;\n\ttypedef lowp_i8vec4\t\t\t\ti8vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_i8vec1\t\t\ti8vec1;\n\ttypedef mediump_i8vec2\t\t\ti8vec2;\n\ttypedef mediump_i8vec3\t\t\ti8vec3;\n\ttypedef mediump_i8vec4\t\t\ti8vec4;\t\n#else\n\t/// Default qualifier 8 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i8vec1\t\t\ti8vec1;\n\t\n\t/// Default qualifier 8 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i8vec2\t\t\ti8vec2;\n\t\n\t/// Default qualifier 8 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i8vec3\t\t\ti8vec3;\n\t\n\t/// Default qualifier 8 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i8vec4\t\t\ti8vec4;\n#endif\n\t\n\t\n\t/// Low qualifier 16 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i16, lowp>\t\tlowp_i16vec1;\n\t\n\t/// Low qualifier 16 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i16, lowp>\t\tlowp_i16vec2;\n\t\n\t/// Low qualifier 16 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i16, lowp>\t\tlowp_i16vec3;\n\t\n\t/// Low qualifier 16 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i16, lowp>\t\tlowp_i16vec4;\n\t\n\t\n\t/// Medium qualifier 16 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i16, mediump>\t\tmediump_i16vec1;\n\t\n\t/// Medium qualifier 16 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i16, mediump>\t\tmediump_i16vec2;\n\t\n\t/// Medium qualifier 16 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i16, mediump>\t\tmediump_i16vec3;\n\t\n\t/// Medium qualifier 16 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i16, mediump>\t\tmediump_i16vec4;\n\t\n\t\n\t/// High qualifier 16 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i16, highp>\t\thighp_i16vec1;\n\t\n\t/// High qualifier 16 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i16, highp>\t\thighp_i16vec2;\n\t\n\t/// High qualifier 16 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i16, highp>\t\thighp_i16vec3;\n\t\n\t/// High qualifier 16 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i16, highp>\t\thighp_i16vec4;\n\t\n\t\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_i16vec1\t\t\ti16vec1;\n\ttypedef lowp_i16vec2\t\t\ti16vec2;\n\ttypedef lowp_i16vec3\t\t\ti16vec3;\n\ttypedef lowp_i16vec4\t\t\ti16vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_i16vec1\t\t\ti16vec1;\n\ttypedef mediump_i16vec2\t\t\ti16vec2;\n\ttypedef mediump_i16vec3\t\t\ti16vec3;\n\ttypedef mediump_i16vec4\t\t\ti16vec4;\n#else\n\t/// Default qualifier 16 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i16vec1\t\t\ti16vec1;\n\t\n\t/// Default qualifier 16 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i16vec2\t\t\ti16vec2;\n\t\n\t/// Default qualifier 16 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i16vec3\t\t\ti16vec3;\n\t\n\t/// Default qualifier 16 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i16vec4\t\t\ti16vec4;\n#endif\n\n\n\t/// Low qualifier 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i32, lowp>\t\tlowp_i32vec1;\n\t\n\t/// Low qualifier 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i32, lowp>\t\tlowp_i32vec2;\n\t\n\t/// Low qualifier 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i32, lowp>\t\tlowp_i32vec3;\n\t\n\t/// Low qualifier 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i32, lowp>\t\tlowp_i32vec4;\n\t\n\t\n\t/// Medium qualifier 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i32, mediump>\t\tmediump_i32vec1;\n\t\n\t/// Medium qualifier 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i32, mediump>\t\tmediump_i32vec2;\n\t\n\t/// Medium qualifier 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i32, mediump>\t\tmediump_i32vec3;\n\t\n\t/// Medium qualifier 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i32, mediump>\t\tmediump_i32vec4;\n\t\n\t\n\t/// High qualifier 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i32, highp>\t\thighp_i32vec1;\n\t\n\t/// High qualifier 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i32, highp>\t\thighp_i32vec2;\n\t\n\t/// High qualifier 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i32, highp>\t\thighp_i32vec3;\n\t\n\t/// High qualifier 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i32, highp>\t\thighp_i32vec4;\n\t\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_i32vec1\t\t\ti32vec1;\n\ttypedef lowp_i32vec2\t\t\ti32vec2;\n\ttypedef lowp_i32vec3\t\t\ti32vec3;\n\ttypedef lowp_i32vec4\t\t\ti32vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_i32vec1\t\t\ti32vec1;\n\ttypedef mediump_i32vec2\t\t\ti32vec2;\n\ttypedef mediump_i32vec3\t\t\ti32vec3;\n\ttypedef mediump_i32vec4\t\t\ti32vec4;\n#else\n\t/// Default qualifier 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i32vec1\t\t\ti32vec1;\n\t\n\t/// Default qualifier 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i32vec2\t\t\ti32vec2;\n\t\n\t/// Default qualifier 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i32vec3\t\t\ti32vec3;\n\t\n\t/// Default qualifier 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i32vec4\t\t\ti32vec4;\n#endif\n\n\n\t/// Low qualifier 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i32, lowp>\t\tlowp_i32vec1;\n\t\n\t/// Low qualifier 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i32, lowp>\t\tlowp_i32vec2;\n\t\n\t/// Low qualifier 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i32, lowp>\t\tlowp_i32vec3;\n\t\n\t/// Low qualifier 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i32, lowp>\t\tlowp_i32vec4;\n\t\n\t\n\t/// Medium qualifier 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i32, mediump>\t\tmediump_i32vec1;\n\t\n\t/// Medium qualifier 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i32, mediump>\t\tmediump_i32vec2;\n\t\n\t/// Medium qualifier 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i32, mediump>\t\tmediump_i32vec3;\n\t\n\t/// Medium qualifier 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i32, mediump>\t\tmediump_i32vec4;\n\t\n\t\n\t/// High qualifier 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i32, highp>\t\thighp_i32vec1;\n\t\n\t/// High qualifier 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i32, highp>\t\thighp_i32vec2;\n\t\n\t/// High qualifier 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i32, highp>\t\thighp_i32vec3;\n\t\n\t/// High qualifier 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i32, highp>\t\thighp_i32vec4;\n\t\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_i32vec1\t\t\ti32vec1;\n\ttypedef lowp_i32vec2\t\t\ti32vec2;\n\ttypedef lowp_i32vec3\t\t\ti32vec3;\n\ttypedef lowp_i32vec4\t\t\ti32vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_i32vec1\t\t\ti32vec1;\n\ttypedef mediump_i32vec2\t\t\ti32vec2;\n\ttypedef mediump_i32vec3\t\t\ti32vec3;\n\ttypedef mediump_i32vec4\t\t\ti32vec4;\n#else\n\t/// Default qualifier 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i32vec1\t\t\ti32vec1;\n\n\t/// Default qualifier 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i32vec2\t\t\ti32vec2;\n\t\n\t/// Default qualifier 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i32vec3\t\t\ti32vec3;\n\t\n\t/// Default qualifier 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i32vec4\t\t\ti32vec4;\n#endif\n\n\n\t\n\t/// Low qualifier 64 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i64, lowp>\t\tlowp_i64vec1;\n\t\n\t/// Low qualifier 64 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i64, lowp>\t\tlowp_i64vec2;\n\t\n\t/// Low qualifier 64 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i64, lowp>\t\tlowp_i64vec3;\n\t\n\t/// Low qualifier 64 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i64, lowp>\t\tlowp_i64vec4;\n\t\n\t\n\t/// Medium qualifier 64 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i64, mediump>\t\tmediump_i64vec1;\n\t\n\t/// Medium qualifier 64 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i64, mediump>\t\tmediump_i64vec2;\n\t\n\t/// Medium qualifier 64 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i64, mediump>\t\tmediump_i64vec3;\n\t\n\t/// Medium qualifier 64 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i64, mediump>\t\tmediump_i64vec4;\n\t\n\t\n\t/// High qualifier 64 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i64, highp>\t\thighp_i64vec1;\n\t\n\t/// High qualifier 64 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i64, highp>\t\thighp_i64vec2;\n\t\n\t/// High qualifier 64 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i64, highp>\t\thighp_i64vec3;\n\t\n\t/// High qualifier 64 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i64, highp>\t\thighp_i64vec4;\n\t\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_i64vec1\t\t\ti64vec1;\n\ttypedef lowp_i64vec2\t\t\ti64vec2;\n\ttypedef lowp_i64vec3\t\t\ti64vec3;\n\ttypedef lowp_i64vec4\t\t\ti64vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_i64vec1\t\t\ti64vec1;\n\ttypedef mediump_i64vec2\t\t\ti64vec2;\n\ttypedef mediump_i64vec3\t\t\ti64vec3;\n\ttypedef mediump_i64vec4\t\t\ti64vec4;\n#else\n\t/// Default qualifier 64 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i64vec1\t\t\ti64vec1;\n\n\t/// Default qualifier 64 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i64vec2\t\t\ti64vec2;\n\t\n\t/// Default qualifier 64 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i64vec3\t\t\ti64vec3;\n\t\n\t/// Default qualifier 64 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_i64vec4\t\t\ti64vec4;\n#endif\n\t\n\t\n\t/////////////////////////////\n\t// Unsigned int vector types\n\t\n\t/// Low qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 lowp_uint8;\n\t\n\t/// Low qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 lowp_uint16;\n\t\n\t/// Low qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 lowp_uint32;\n\t\n\t/// Low qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 lowp_uint64;\n\t\n\t\n\t/// Low qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 lowp_uint8_t;\n\t\n\t/// Low qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 lowp_uint16_t;\n\t\n\t/// Low qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 lowp_uint32_t;\n\t\n\t/// Low qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 lowp_uint64_t;\n\t\n\t\n\t/// Low qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 lowp_u8;\n\t\n\t/// Low qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 lowp_u16;\n\t\n\t/// Low qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 lowp_u32;\n\t\n\t/// Low qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 lowp_u64;\n\t\n\t\n\t\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 mediump_uint8;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 mediump_uint16;\n\t\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 mediump_uint32;\n\t\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 mediump_uint64;\n\t\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 mediump_uint8_t;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 mediump_uint16_t;\n\t\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 mediump_uint32_t;\n\t\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 mediump_uint64_t;\n\t\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 mediump_u8;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 mediump_u16;\n\t\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 mediump_u32;\n\t\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 mediump_u64;\n\t\t\n\t\n\t\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 highp_uint8;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 highp_uint16;\n\t\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 highp_uint32;\n\t\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 highp_uint64;\n\t\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 highp_uint8_t;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 highp_uint16_t;\n\t\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 highp_uint32_t;\n\t\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 highp_uint64_t;\n\t\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 highp_u8;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 highp_u16;\n\t\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 highp_u32;\n\t\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 highp_u64;\n\t\n\t\n\t\n\t/// 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 uint8;\n\t\n\t/// 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 uint16;\n\t\n\t/// 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 uint32;\n\t\n\t/// 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 uint64;\n\t\n#if GLM_HAS_EXTENDED_INTEGER_TYPE\n\tusing std::uint8_t;\n\tusing std::uint16_t;\n\tusing std::uint32_t;\n\tusing std::uint64_t;\n#else\n\t/// 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 uint8_t;\n\t\n\t/// 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 uint16_t;\n\t\n\t/// 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 uint32_t;\n\t\n\t/// 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 uint64_t;\n#endif\n\n\t/// 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 u8;\n\n\t/// 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 u16;\n\n\t/// 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 u32;\n\n\t/// 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 u64;\n\n\n\n\t/// Low qualifier 8 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u8, lowp> lowp_u8vec1;\n\t\n\t/// Low qualifier 8 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u8, lowp> lowp_u8vec2;\n\t\n\t/// Low qualifier 8 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u8, lowp> lowp_u8vec3;\n\t\n\t/// Low qualifier 8 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u8, lowp> lowp_u8vec4;\n\t\n\n\t/// Medium qualifier 8 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u8, mediump> mediump_u8vec1;\n\n\t/// Medium qualifier 8 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u8, mediump> mediump_u8vec2;\n\n\t/// Medium qualifier 8 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u8, mediump> mediump_u8vec3;\n\n\t/// Medium qualifier 8 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u8, mediump> mediump_u8vec4;\n\n\n\t/// High qualifier 8 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u8, highp> highp_u8vec1;\n\n\t/// High qualifier 8 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u8, highp> highp_u8vec2;\n\n\t/// High qualifier 8 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u8, highp> highp_u8vec3;\n\n\t/// High qualifier 8 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u8, highp> highp_u8vec4;\n\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_u8vec1\t\t\t\tu8vec1;\n\ttypedef lowp_u8vec2\t\t\t\tu8vec2;\n\ttypedef lowp_u8vec3\t\t\t\tu8vec3;\n\ttypedef lowp_u8vec4\t\t\t\tu8vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_u8vec1\t\t\tu8vec1;\n\ttypedef mediump_u8vec2\t\t\tu8vec2;\n\ttypedef mediump_u8vec3\t\t\tu8vec3;\n\ttypedef mediump_u8vec4\t\t\tu8vec4;\t\n#else\n\t/// Default qualifier 8 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u8vec1\t\t\tu8vec1;\n\n\t/// Default qualifier 8 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u8vec2\t\t\tu8vec2;\n\n\t/// Default qualifier 8 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u8vec3\t\t\tu8vec3;\n\n\t/// Default qualifier 8 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u8vec4\t\t\tu8vec4;\n#endif\n\n\n\t/// Low qualifier 16 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u16, lowp>\t\tlowp_u16vec1;\n\n\t/// Low qualifier 16 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u16, lowp>\t\tlowp_u16vec2;\n\n\t/// Low qualifier 16 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u16, lowp>\t\tlowp_u16vec3;\n\n\t/// Low qualifier 16 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u16, lowp>\t\tlowp_u16vec4;\n\n\n\t/// Medium qualifier 16 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u16, mediump>\t\tmediump_u16vec1;\n\n\t/// Medium qualifier 16 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u16, mediump>\t\tmediump_u16vec2;\n\n\t/// Medium qualifier 16 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u16, mediump>\t\tmediump_u16vec3;\n\n\t/// Medium qualifier 16 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u16, mediump>\t\tmediump_u16vec4;\n\n\n\t/// High qualifier 16 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u16, highp>\t\thighp_u16vec1;\n\n\t/// High qualifier 16 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u16, highp>\t\thighp_u16vec2;\n\n\t/// High qualifier 16 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u16, highp>\t\thighp_u16vec3;\n\n\t/// High qualifier 16 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u16, highp>\t\thighp_u16vec4;\n\n\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_u16vec1\t\t\tu16vec1;\n\ttypedef lowp_u16vec2\t\t\tu16vec2;\n\ttypedef lowp_u16vec3\t\t\tu16vec3;\n\ttypedef lowp_u16vec4\t\t\tu16vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_u16vec1\t\t\tu16vec1;\n\ttypedef mediump_u16vec2\t\t\tu16vec2;\n\ttypedef mediump_u16vec3\t\t\tu16vec3;\n\ttypedef mediump_u16vec4\t\t\tu16vec4;\n#else\n\t/// Default qualifier 16 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u16vec1\t\t\tu16vec1;\n\n\t/// Default qualifier 16 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u16vec2\t\t\tu16vec2;\n\n\t/// Default qualifier 16 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u16vec3\t\t\tu16vec3;\n\n\t/// Default qualifier 16 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u16vec4\t\t\tu16vec4;\n#endif\n\n\n\t/// Low qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u32, lowp>\t\tlowp_u32vec1;\n\n\t/// Low qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u32, lowp>\t\tlowp_u32vec2;\n\n\t/// Low qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u32, lowp>\t\tlowp_u32vec3;\n\n\t/// Low qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u32, lowp>\t\tlowp_u32vec4;\n\n\n\t/// Medium qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u32, mediump>\t\tmediump_u32vec1;\n\n\t/// Medium qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u32, mediump>\t\tmediump_u32vec2;\n\n\t/// Medium qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u32, mediump>\t\tmediump_u32vec3;\n\n\t/// Medium qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u32, mediump>\t\tmediump_u32vec4;\n\n\n\t/// High qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u32, highp>\t\thighp_u32vec1;\n\n\t/// High qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u32, highp>\t\thighp_u32vec2;\n\n\t/// High qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u32, highp>\t\thighp_u32vec3;\n\n\t/// High qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u32, highp>\t\thighp_u32vec4;\n\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_u32vec1\t\t\tu32vec1;\n\ttypedef lowp_u32vec2\t\t\tu32vec2;\n\ttypedef lowp_u32vec3\t\t\tu32vec3;\n\ttypedef lowp_u32vec4\t\t\tu32vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_u32vec1\t\t\tu32vec1;\n\ttypedef mediump_u32vec2\t\t\tu32vec2;\n\ttypedef mediump_u32vec3\t\t\tu32vec3;\n\ttypedef mediump_u32vec4\t\t\tu32vec4;\n#else\n\t/// Default qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u32vec1\t\t\tu32vec1;\n\n\t/// Default qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u32vec2\t\t\tu32vec2;\n\n\t/// Default qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u32vec3\t\t\tu32vec3;\n\n\t/// Default qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u32vec4\t\t\tu32vec4;\n#endif\n\n\n\t/// Low qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u32, lowp>\t\tlowp_u32vec1;\n\n\t/// Low qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u32, lowp>\t\tlowp_u32vec2;\n\n\t/// Low qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u32, lowp>\t\tlowp_u32vec3;\n\n\t/// Low qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u32, lowp>\t\tlowp_u32vec4;\n\n\n\t/// Medium qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u32, mediump>\t\tmediump_u32vec1;\n\n\t/// Medium qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u32, mediump>\t\tmediump_u32vec2;\n\n\t/// Medium qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u32, mediump>\t\tmediump_u32vec3;\n\n\t/// Medium qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u32, mediump>\t\tmediump_u32vec4;\n\n\n\t/// High qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u32, highp>\t\thighp_u32vec1;\n\n\t/// High qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u32, highp>\t\thighp_u32vec2;\n\n\t/// High qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u32, highp>\t\thighp_u32vec3;\n\n\t/// High qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u32, highp>\t\thighp_u32vec4;\n\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_u32vec1\t\t\tu32vec1;\n\ttypedef lowp_u32vec2\t\t\tu32vec2;\n\ttypedef lowp_u32vec3\t\t\tu32vec3;\n\ttypedef lowp_u32vec4\t\t\tu32vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_u32vec1\t\t\tu32vec1;\n\ttypedef mediump_u32vec2\t\t\tu32vec2;\n\ttypedef mediump_u32vec3\t\t\tu32vec3;\n\ttypedef mediump_u32vec4\t\t\tu32vec4;\n#else\n\t/// Default qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u32vec1\t\t\tu32vec1;\n\n\t/// Default qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u32vec2\t\t\tu32vec2;\n\t\n\t/// Default qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u32vec3\t\t\tu32vec3;\n\t\n\t/// Default qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u32vec4\t\t\tu32vec4;\n#endif\n\n\n\t\n\t/// Low qualifier 64 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u64, lowp>\t\tlowp_u64vec1;\n\n\t/// Low qualifier 64 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u64, lowp>\t\tlowp_u64vec2;\n\n\t/// Low qualifier 64 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u64, lowp>\t\tlowp_u64vec3;\n\n\t/// Low qualifier 64 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u64, lowp>\t\tlowp_u64vec4;\n\n\n\t/// Medium qualifier 64 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u64, mediump>\t\tmediump_u64vec1;\n\n\t/// Medium qualifier 64 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u64, mediump>\t\tmediump_u64vec2;\n\n\t/// Medium qualifier 64 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u64, mediump>\t\tmediump_u64vec3;\n\n\t/// Medium qualifier 64 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u64, mediump>\t\tmediump_u64vec4;\n\n\n\t/// High qualifier 64 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u64, highp>\t\thighp_u64vec1;\n\n\t/// High qualifier 64 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u64, highp>\t\thighp_u64vec2;\n\n\t/// High qualifier 64 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u64, highp>\t\thighp_u64vec3;\n\n\t/// High qualifier 64 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u64, highp>\t\thighp_u64vec4;\n\n#if(defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef lowp_u64vec1\t\t\tu64vec1;\n\ttypedef lowp_u64vec2\t\t\tu64vec2;\n\ttypedef lowp_u64vec3\t\t\tu64vec3;\n\ttypedef lowp_u64vec4\t\t\tu64vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_UINT))\n\ttypedef mediump_u64vec1\t\t\tu64vec1;\n\ttypedef mediump_u64vec2\t\t\tu64vec2;\n\ttypedef mediump_u64vec3\t\t\tu64vec3;\n\ttypedef mediump_u64vec4\t\t\tu64vec4;\n#else\n\t/// Default qualifier 64 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u64vec1\t\t\tu64vec1;\n\n\t/// Default qualifier 64 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u64vec2\t\t\tu64vec2;\n\t\n\t/// Default qualifier 64 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u64vec3\t\t\tu64vec3;\n\t\n\t/// Default qualifier 64 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef highp_u64vec4\t\t\tu64vec4;\n#endif\n\t\n\t\n\t//////////////////////\n\t// Float vector types\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 lowp_float32;\n\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 lowp_float64;\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 lowp_float32_t;\n\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 lowp_float64_t;\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float32 lowp_f32;\n\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float64 lowp_f64;\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 lowp_float32;\n\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 lowp_float64;\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 lowp_float32_t;\n\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 lowp_float64_t;\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float32 lowp_f32;\n\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float64 lowp_f64;\n\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 lowp_float32;\n\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 lowp_float64;\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 lowp_float32_t;\n\t\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 lowp_float64_t;\n\n\t/// Low 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float32 lowp_f32;\n\n\t/// Low 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float64 lowp_f64;\n\n\n\t/// Medium 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 mediump_float32;\n\n\t/// Medium 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 mediump_float64;\n\n\t/// Medium 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 mediump_float32_t;\n\n\t/// Medium 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 mediump_float64_t;\n\n\t/// Medium 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float32 mediump_f32;\n\n\t/// Medium 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float64 mediump_f64;\n\n\n\t/// High 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 highp_float32;\n\n\t/// High 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 highp_float64;\n\n\t/// High 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 highp_float32_t;\n\n\t/// High 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float64 highp_float64_t;\n\n\t/// High 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float32 highp_f32;\n\n\t/// High 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float64 highp_f64;\n\n\n#if(defined(GLM_PRECISION_LOWP_FLOAT))\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef lowp_float32 float32;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef lowp_float64 float64;\n\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef lowp_float32_t float32_t;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef lowp_float64_t float64_t;\n\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef lowp_f32 f32;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef lowp_f64 f64;\n\n#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))\n\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef mediump_float32 float32;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef mediump_float64 float64;\n\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef mediump_float32 float32_t;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef mediump_float64 float64_t;\n\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef mediump_float32 f32;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef mediump_float64 f64;\n\n#else//(defined(GLM_PRECISION_HIGHP_FLOAT))\n\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef highp_float32 float32;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef highp_float64 float64;\n\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef highp_float32_t float32_t;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef highp_float64_t float64_t;\n\n\t/// Default 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef highp_float32_t f32;\n\n\t/// Default 64 bit double-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef highp_float64_t f64;\n#endif\n\n\n\t/// Low single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, float, lowp> lowp_vec1;\n\n\t/// Low single-qualifier floating-point vector of 2 components.\n\t/// @see core_precision\n\ttypedef vec<2, float, lowp> lowp_vec2;\n\n\t/// Low single-qualifier floating-point vector of 3 components.\n\t/// @see core_precision\n\ttypedef vec<3, float, lowp> lowp_vec3;\n\n\t/// Low single-qualifier floating-point vector of 4 components.\n\t/// @see core_precision\n\ttypedef vec<4, float, lowp> lowp_vec4;\n\n\t/// Low single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, float, lowp> lowp_fvec1;\n\n\t/// Low single-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, float, lowp> lowp_fvec2;\n\n\t/// Low single-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, float, lowp> lowp_fvec3;\n\n\t/// Low single-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, float, lowp> lowp_fvec4;\n\n\n\t/// Medium single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, float, mediump> mediump_vec1;\n\n\t/// Medium Single-qualifier floating-point vector of 2 components.\n\t/// @see core_precision\n\ttypedef vec<2, float, mediump> mediump_vec2;\n\n\t/// Medium Single-qualifier floating-point vector of 3 components.\n\t/// @see core_precision\n\ttypedef vec<3, float, mediump> mediump_vec3;\n\n\t/// Medium Single-qualifier floating-point vector of 4 components.\n\t/// @see core_precision\n\ttypedef vec<4, float, mediump> mediump_vec4;\n\n\t/// Medium single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, float, mediump> mediump_fvec1;\n\n\t/// Medium Single-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, float, mediump> mediump_fvec2;\n\n\t/// Medium Single-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, float, mediump> mediump_fvec3;\n\n\t/// Medium Single-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, float, mediump> mediump_fvec4;\n\n\n\t/// High single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, float, highp> highp_vec1;\n\n\t/// High Single-qualifier floating-point vector of 2 components.\n\t/// @see core_precision\n\ttypedef vec<2, float, highp> highp_vec2;\n\n\t/// High Single-qualifier floating-point vector of 3 components.\n\t/// @see core_precision\n\ttypedef vec<3, float, highp> highp_vec3;\n\n\t/// High Single-qualifier floating-point vector of 4 components.\n\t/// @see core_precision\n\ttypedef vec<4, float, highp> highp_vec4;\n\n\t/// High single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, float, highp> highp_fvec1;\n\n\t/// High Single-qualifier floating-point vector of 2 components.\n\t/// @see core_precision\n\ttypedef vec<2, float, highp> highp_fvec2;\n\n\t/// High Single-qualifier floating-point vector of 3 components.\n\t/// @see core_precision\n\ttypedef vec<3, float, highp> highp_fvec3;\n\n\t/// High Single-qualifier floating-point vector of 4 components.\n\t/// @see core_precision\n\ttypedef vec<4, float, highp> highp_fvec4;\n\n\n\t/// Low single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, f32, lowp> lowp_f32vec1;\n\n\t/// Low single-qualifier floating-point vector of 2 components.\n\t/// @see core_precision\n\ttypedef vec<2, f32, lowp> lowp_f32vec2;\n\n\t/// Low single-qualifier floating-point vector of 3 components.\n\t/// @see core_precision\n\ttypedef vec<3, f32, lowp> lowp_f32vec3;\n\n\t/// Low single-qualifier floating-point vector of 4 components.\n\t/// @see core_precision\n\ttypedef vec<4, f32, lowp> lowp_f32vec4;\n\n\t/// Medium single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, f32, mediump> mediump_f32vec1;\n\n\t/// Medium single-qualifier floating-point vector of 2 components.\n\t/// @see core_precision\n\ttypedef vec<2, f32, mediump> mediump_f32vec2;\n\n\t/// Medium single-qualifier floating-point vector of 3 components.\n\t/// @see core_precision\n\ttypedef vec<3, f32, mediump> mediump_f32vec3;\n\n\t/// Medium single-qualifier floating-point vector of 4 components.\n\t/// @see core_precision\n\ttypedef vec<4, f32, mediump> mediump_f32vec4;\n\n\t/// High single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, f32, highp> highp_f32vec1;\n\n\t/// High single-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, f32, highp> highp_f32vec2;\n\n\t/// High single-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, f32, highp> highp_f32vec3;\n\n\t/// High single-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, f32, highp> highp_f32vec4;\n\n\n\t/// Low double-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, f64, lowp> lowp_f64vec1;\n\n\t/// Low double-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, f64, lowp> lowp_f64vec2;\n\n\t/// Low double-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, f64, lowp> lowp_f64vec3;\n\n\t/// Low double-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, f64, lowp> lowp_f64vec4;\n\n\t/// Medium double-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, f64, mediump> mediump_f64vec1;\n\n\t/// Medium double-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, f64, mediump> mediump_f64vec2;\n\n\t/// Medium double-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, f64, mediump> mediump_f64vec3;\n\n\t/// Medium double-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, f64, mediump> mediump_f64vec4;\n\n\t/// High double-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, f64, highp> highp_f64vec1;\n\n\t/// High double-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, f64, highp> highp_f64vec2;\n\n\t/// High double-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, f64, highp> highp_f64vec3;\n\n\t/// High double-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, f64, highp> highp_f64vec4;\n\n\n\t//////////////////////\n\t// Float matrix types\n\n\t/// Low single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef lowp_f32 lowp_fmat1x1;\n\n\t/// Low single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, lowp> lowp_fmat2x2;\n\n\t/// Low single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f32, lowp> lowp_fmat2x3;\n\n\t/// Low single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f32, lowp> lowp_fmat2x4;\n\n\t/// Low single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f32, lowp> lowp_fmat3x2;\n\n\t/// Low single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, lowp> lowp_fmat3x3;\n\n\t/// Low single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f32, lowp> lowp_fmat3x4;\n\n\t/// Low single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f32, lowp> lowp_fmat4x2;\n\n\t/// Low single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f32, lowp> lowp_fmat4x3;\n\n\t/// Low single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, lowp> lowp_fmat4x4;\n\n\t/// Low single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef lowp_fmat1x1 lowp_fmat1;\n\n\t/// Low single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_fmat2x2 lowp_fmat2;\n\n\t/// Low single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_fmat3x3 lowp_fmat3;\n\n\t/// Low single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_fmat4x4 lowp_fmat4;\n\n\n\t/// Medium single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef mediump_f32 mediump_fmat1x1;\n\n\t/// Medium single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, mediump> mediump_fmat2x2;\n\n\t/// Medium single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f32, mediump> mediump_fmat2x3;\n\n\t/// Medium single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f32, mediump> mediump_fmat2x4;\n\n\t/// Medium single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f32, mediump> mediump_fmat3x2;\n\n\t/// Medium single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, mediump> mediump_fmat3x3;\n\n\t/// Medium single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f32, mediump> mediump_fmat3x4;\n\n\t/// Medium single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f32, mediump> mediump_fmat4x2;\n\n\t/// Medium single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f32, mediump> mediump_fmat4x3;\n\n\t/// Medium single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, mediump> mediump_fmat4x4;\n\n\t/// Medium single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef mediump_fmat1x1 mediump_fmat1;\n\n\t/// Medium single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_fmat2x2 mediump_fmat2;\n\n\t/// Medium single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_fmat3x3 mediump_fmat3;\n\n\t/// Medium single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_fmat4x4 mediump_fmat4;\n\n\n\t/// High single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef highp_f32 highp_fmat1x1;\n\n\t/// High single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, highp> highp_fmat2x2;\n\n\t/// High single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f32, highp> highp_fmat2x3;\n\n\t/// High single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f32, highp> highp_fmat2x4;\n\n\t/// High single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f32, highp> highp_fmat3x2;\n\n\t/// High single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, highp> highp_fmat3x3;\n\n\t/// High single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f32, highp> highp_fmat3x4;\n\n\t/// High single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f32, highp> highp_fmat4x2;\n\n\t/// High single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f32, highp> highp_fmat4x3;\n\n\t/// High single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, highp> highp_fmat4x4;\n\n\t/// High single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef highp_fmat1x1 highp_fmat1;\n\n\t/// High single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_fmat2x2 highp_fmat2;\n\n\t/// High single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_fmat3x3 highp_fmat3;\n\t\n\t/// High single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_fmat4x4 highp_fmat4;\n\n\n\t/// Low single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f32 lowp_f32mat1x1;\n\n\t/// Low single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, lowp> lowp_f32mat2x2;\n\n\t/// Low single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f32, lowp> lowp_f32mat2x3;\n\n\t/// Low single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f32, lowp> lowp_f32mat2x4;\n\n\t/// Low single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f32, lowp> lowp_f32mat3x2;\n\n\t/// Low single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, lowp> lowp_f32mat3x3;\n\n\t/// Low single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f32, lowp> lowp_f32mat3x4;\n\n\t/// Low single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f32, lowp> lowp_f32mat4x2;\n\n\t/// Low single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f32, lowp> lowp_f32mat4x3;\n\n\t/// Low single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, lowp> lowp_f32mat4x4;\n\n\t/// Low single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef detail::tmat1x1<f32, lowp> lowp_f32mat1;\n\n\t/// Low single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_f32mat2x2 lowp_f32mat2;\n\n\t/// Low single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_f32mat3x3 lowp_f32mat3;\n\n\t/// Low single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_f32mat4x4 lowp_f32mat4;\n\n\n\t/// High single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f32 mediump_f32mat1x1;\n\n\t/// Low single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, mediump> mediump_f32mat2x2;\n\n\t/// Medium single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f32, mediump> mediump_f32mat2x3;\n\n\t/// Medium single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f32, mediump> mediump_f32mat2x4;\n\n\t/// Medium single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f32, mediump> mediump_f32mat3x2;\n\n\t/// Medium single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, mediump> mediump_f32mat3x3;\n\n\t/// Medium single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f32, mediump> mediump_f32mat3x4;\n\n\t/// Medium single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f32, mediump> mediump_f32mat4x2;\n\n\t/// Medium single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f32, mediump> mediump_f32mat4x3;\n\n\t/// Medium single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, mediump> mediump_f32mat4x4;\n\n\t/// Medium single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef detail::tmat1x1<f32, mediump> f32mat1;\n\n\t/// Medium single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_f32mat2x2 mediump_f32mat2;\n\n\t/// Medium single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_f32mat3x3 mediump_f32mat3;\n\n\t/// Medium single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_f32mat4x4 mediump_f32mat4;\n\n\n\t/// High single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f32 highp_f32mat1x1;\n\n\t/// High single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, highp> highp_f32mat2x2;\n\n\t/// High single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f32, highp> highp_f32mat2x3;\n\n\t/// High single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f32, highp> highp_f32mat2x4;\n\n\t/// High single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f32, highp> highp_f32mat3x2;\n\n\t/// High single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, highp> highp_f32mat3x3;\n\n\t/// High single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f32, highp> highp_f32mat3x4;\n\n\t/// High single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f32, highp> highp_f32mat4x2;\n\n\t/// High single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f32, highp> highp_f32mat4x3;\n\n\t/// High single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, highp> highp_f32mat4x4;\n\n\t/// High single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef detail::tmat1x1<f32, highp> f32mat1;\n\n\t/// High single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat2x2 highp_f32mat2;\n\n\t/// High single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat3x3 highp_f32mat3;\n\n\t/// High single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat4x4 highp_f32mat4;\n\n\n\t/// Low double-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f64 lowp_f64mat1x1;\n\n\t/// Low double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f64, lowp> lowp_f64mat2x2;\n\n\t/// Low double-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f64, lowp> lowp_f64mat2x3;\n\n\t/// Low double-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f64, lowp> lowp_f64mat2x4;\n\n\t/// Low double-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f64, lowp> lowp_f64mat3x2;\n\n\t/// Low double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f64, lowp> lowp_f64mat3x3;\n\n\t/// Low double-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f64, lowp> lowp_f64mat3x4;\n\n\t/// Low double-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f64, lowp> lowp_f64mat4x2;\n\n\t/// Low double-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f64, lowp> lowp_f64mat4x3;\n\t\n\t/// Low double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f64, lowp> lowp_f64mat4x4;\n\n\t/// Low double-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef lowp_f64mat1x1 lowp_f64mat1;\n\n\t/// Low double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_f64mat2x2 lowp_f64mat2;\n\n\t/// Low double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_f64mat3x3 lowp_f64mat3;\n\n\t/// Low double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef lowp_f64mat4x4 lowp_f64mat4;\n\n\n\t/// Medium double-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f64 Highp_f64mat1x1;\n\n\t/// Medium double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f64, mediump> mediump_f64mat2x2;\n\n\t/// Medium double-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f64, mediump> mediump_f64mat2x3;\n\n\t/// Medium double-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f64, mediump> mediump_f64mat2x4;\n\n\t/// Medium double-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f64, mediump> mediump_f64mat3x2;\n\n\t/// Medium double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f64, mediump> mediump_f64mat3x3;\n\n\t/// Medium double-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f64, mediump> mediump_f64mat3x4;\n\n\t/// Medium double-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f64, mediump> mediump_f64mat4x2;\n\n\t/// Medium double-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f64, mediump> mediump_f64mat4x3;\n\n\t/// Medium double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f64, mediump> mediump_f64mat4x4;\n\n\t/// Medium double-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef mediump_f64mat1x1 mediump_f64mat1;\n\n\t/// Medium double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_f64mat2x2 mediump_f64mat2;\n\n\t/// Medium double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_f64mat3x3 mediump_f64mat3;\n\n\t/// Medium double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mediump_f64mat4x4 mediump_f64mat4;\n\n\t/// High double-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f64 highp_f64mat1x1;\n\n\t/// High double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f64, highp> highp_f64mat2x2;\n\n\t/// High double-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f64, highp> highp_f64mat2x3;\n\n\t/// High double-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f64, highp> highp_f64mat2x4;\n\n\t/// High double-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f64, highp> highp_f64mat3x2;\n\n\t/// High double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f64, highp> highp_f64mat3x3;\n\n\t/// High double-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f64, highp> highp_f64mat3x4;\n\n\t/// High double-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f64, highp> highp_f64mat4x2;\n\n\t/// High double-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f64, highp> highp_f64mat4x3;\n\n\t/// High double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f64, highp> highp_f64mat4x4;\n\n\t/// High double-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef highp_f64mat1x1 highp_f64mat1;\n\n\t/// High double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat2x2 highp_f64mat2;\n\n\t/// High double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat3x3 highp_f64mat3;\n\n\t/// High double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat4x4 highp_f64mat4;\n\n\t//////////////////////////\n\t// Quaternion types\n\n\t/// Low single-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef tquat<f32, lowp> lowp_f32quat;\n\n\t/// Low double-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef tquat<f64, lowp> lowp_f64quat;\n\n\t/// Medium single-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef tquat<f32, mediump> mediump_f32quat;\n\n\t/// Medium double-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef tquat<f64, mediump> mediump_f64quat;\n\n\t/// High single-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef tquat<f32, highp> highp_f32quat;\n\n\t/// High double-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef tquat<f64, highp> highp_f64quat;\n\n\n#if(defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef lowp_f32vec1\t\t\tfvec1;\n\ttypedef lowp_f32vec2\t\t\tfvec2;\n\ttypedef lowp_f32vec3\t\t\tfvec3;\n\ttypedef lowp_f32vec4\t\t\tfvec4;\n\ttypedef lowp_f32mat2\t\t\tfmat2;\n\ttypedef lowp_f32mat3\t\t\tfmat3;\n\ttypedef lowp_f32mat4\t\t\tfmat4;\n\ttypedef lowp_f32mat2x2\t\t\tfmat2x2;\n\ttypedef lowp_f32mat3x2\t\t\tfmat3x2;\n\ttypedef lowp_f32mat4x2\t\t\tfmat4x2;\n\ttypedef lowp_f32mat2x3\t\t\tfmat2x3;\n\ttypedef lowp_f32mat3x3\t\t\tfmat3x3;\n\ttypedef lowp_f32mat4x3\t\t\tfmat4x3;\n\ttypedef lowp_f32mat2x4\t\t\tfmat2x4;\n\ttypedef lowp_f32mat3x4\t\t\tfmat3x4;\n\ttypedef lowp_f32mat4x4\t\t\tfmat4x4;\n\ttypedef lowp_f32quat\t\t\tfquat;\n\n\ttypedef lowp_f32vec1\t\t\tf32vec1;\n\ttypedef lowp_f32vec2\t\t\tf32vec2;\n\ttypedef lowp_f32vec3\t\t\tf32vec3;\n\ttypedef lowp_f32vec4\t\t\tf32vec4;\n\ttypedef lowp_f32mat2\t\t\tf32mat2;\n\ttypedef lowp_f32mat3\t\t\tf32mat3;\n\ttypedef lowp_f32mat4\t\t\tf32mat4;\n\ttypedef lowp_f32mat2x2\t\t\tf32mat2x2;\n\ttypedef lowp_f32mat3x2\t\t\tf32mat3x2;\n\ttypedef lowp_f32mat4x2\t\t\tf32mat4x2;\n\ttypedef lowp_f32mat2x3\t\t\tf32mat2x3;\n\ttypedef lowp_f32mat3x3\t\t\tf32mat3x3;\n\ttypedef lowp_f32mat4x3\t\t\tf32mat4x3;\n\ttypedef lowp_f32mat2x4\t\t\tf32mat2x4;\n\ttypedef lowp_f32mat3x4\t\t\tf32mat3x4;\n\ttypedef lowp_f32mat4x4\t\t\tf32mat4x4;\n\ttypedef lowp_f32quat\t\t\tf32quat;\n#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))\n\ttypedef mediump_f32vec1\t\t\tfvec1;\n\ttypedef mediump_f32vec2\t\t\tfvec2;\n\ttypedef mediump_f32vec3\t\t\tfvec3;\n\ttypedef mediump_f32vec4\t\t\tfvec4;\n\ttypedef mediump_f32mat2\t\t\tfmat2;\n\ttypedef mediump_f32mat3\t\t\tfmat3;\n\ttypedef mediump_f32mat4\t\t\tfmat4;\n\ttypedef mediump_f32mat2x2\t\tfmat2x2;\n\ttypedef mediump_f32mat3x2\t\tfmat3x2;\n\ttypedef mediump_f32mat4x2\t\tfmat4x2;\n\ttypedef mediump_f32mat2x3\t\tfmat2x3;\n\ttypedef mediump_f32mat3x3\t\tfmat3x3;\n\ttypedef mediump_f32mat4x3\t\tfmat4x3;\n\ttypedef mediump_f32mat2x4\t\tfmat2x4;\n\ttypedef mediump_f32mat3x4\t\tfmat3x4;\n\ttypedef mediump_f32mat4x4\t\tfmat4x4;\n\ttypedef mediump_f32quat\t\t\tfquat;\n\n\ttypedef mediump_f32vec1\t\t\tf32vec1;\n\ttypedef mediump_f32vec2\t\t\tf32vec2;\n\ttypedef mediump_f32vec3\t\t\tf32vec3;\n\ttypedef mediump_f32vec4\t\t\tf32vec4;\n\ttypedef mediump_f32mat2\t\t\tf32mat2;\n\ttypedef mediump_f32mat3\t\t\tf32mat3;\n\ttypedef mediump_f32mat4\t\t\tf32mat4;\n\ttypedef mediump_f32mat2x2\t\tf32mat2x2;\n\ttypedef mediump_f32mat3x2\t\tf32mat3x2;\n\ttypedef mediump_f32mat4x2\t\tf32mat4x2;\n\ttypedef mediump_f32mat2x3\t\tf32mat2x3;\n\ttypedef mediump_f32mat3x3\t\tf32mat3x3;\n\ttypedef mediump_f32mat4x3\t\tf32mat4x3;\n\ttypedef mediump_f32mat2x4\t\tf32mat2x4;\n\ttypedef mediump_f32mat3x4\t\tf32mat3x4;\n\ttypedef mediump_f32mat4x4\t\tf32mat4x4;\n\ttypedef mediump_f32quat\t\t\tf32quat;\n#else//if(defined(GLM_PRECISION_HIGHP_FLOAT))\n\t/// Default single-qualifier floating-point vector of 1 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32vec1\t\t\tfvec1;\n\n\t/// Default single-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32vec2\t\t\tfvec2;\n\n\t/// Default single-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32vec3\t\t\tfvec3;\n\n\t/// Default single-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32vec4\t\t\tfvec4;\n\n\t/// Default single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat2x2\t\t\tfmat2x2;\n\n\t/// Default single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat2x3\t\t\tfmat2x3;\n\n\t/// Default single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat2x4\t\t\tfmat2x4;\n\n\t/// Default single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat3x2\t\t\tfmat3x2;\n\n\t/// Default single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat3x3\t\t\tfmat3x3;\n\n\t/// Default single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat3x4\t\t\tfmat3x4;\n\n\t/// Default single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat4x2\t\t\tfmat4x2;\n\n\t/// Default single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat4x3\t\t\tfmat4x3;\n\n\t/// Default single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat4x4\t\t\tfmat4x4;\n\t\n\t/// Default single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef fmat2x2\t\t\t\t\tfmat2;\n\n\t/// Default single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef fmat3x3\t\t\t\t\tfmat3;\n\n\t/// Default single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef fmat4x4\t\t\t\t\tfmat4;\n\n\t/// Default single-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef highp_fquat\t\t\t\tfquat;\n\t\n\n\n\t/// Default single-qualifier floating-point vector of 1 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32vec1\t\t\tf32vec1;\n\n\t/// Default single-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32vec2\t\t\tf32vec2;\n\n\t/// Default single-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32vec3\t\t\tf32vec3;\n\n\t/// Default single-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32vec4\t\t\tf32vec4;\n\n\t/// Default single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat2x2\t\t\tf32mat2x2;\n\n\t/// Default single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat2x3\t\t\tf32mat2x3;\n\n\t/// Default single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat2x4\t\t\tf32mat2x4;\n\n\t/// Default single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat3x2\t\t\tf32mat3x2;\n\n\t/// Default single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat3x3\t\t\tf32mat3x3;\n\n\t/// Default single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat3x4\t\t\tf32mat3x4;\n\n\t/// Default single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat4x2\t\t\tf32mat4x2;\n\n\t/// Default single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat4x3\t\t\tf32mat4x3;\n\n\t/// Default single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32mat4x4\t\t\tf32mat4x4;\n\n\t/// Default single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef f32mat2x2\t\t\t\tf32mat2;\n\n\t/// Default single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef f32mat3x3\t\t\t\tf32mat3;\n\n\t/// Default single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef f32mat4x4\t\t\t\tf32mat4;\n\n\t/// Default single-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef highp_f32quat\t\t\tf32quat;\n#endif\n\n#if(defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef lowp_f64vec1\t\t\tf64vec1;\n\ttypedef lowp_f64vec2\t\t\tf64vec2;\n\ttypedef lowp_f64vec3\t\t\tf64vec3;\n\ttypedef lowp_f64vec4\t\t\tf64vec4;\n\ttypedef lowp_f64mat2\t\t\tf64mat2;\n\ttypedef lowp_f64mat3\t\t\tf64mat3;\n\ttypedef lowp_f64mat4\t\t\tf64mat4;\n\ttypedef lowp_f64mat2x2\t\t\tf64mat2x2;\n\ttypedef lowp_f64mat3x2\t\t\tf64mat3x2;\n\ttypedef lowp_f64mat4x2\t\t\tf64mat4x2;\n\ttypedef lowp_f64mat2x3\t\t\tf64mat2x3;\n\ttypedef lowp_f64mat3x3\t\t\tf64mat3x3;\n\ttypedef lowp_f64mat4x3\t\t\tf64mat4x3;\n\ttypedef lowp_f64mat2x4\t\t\tf64mat2x4;\n\ttypedef lowp_f64mat3x4\t\t\tf64mat3x4;\n\ttypedef lowp_f64mat4x4\t\t\tf64mat4x4;\n\ttypedef lowp_f64quat\t\t\tf64quat;\n#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))\n\ttypedef mediump_f64vec1\t\t\tf64vec1;\n\ttypedef mediump_f64vec2\t\t\tf64vec2;\n\ttypedef mediump_f64vec3\t\t\tf64vec3;\n\ttypedef mediump_f64vec4\t\t\tf64vec4;\n\ttypedef mediump_f64mat2\t\t\tf64mat2;\n\ttypedef mediump_f64mat3\t\t\tf64mat3;\n\ttypedef mediump_f64mat4\t\t\tf64mat4;\n\ttypedef mediump_f64mat2x2\t\tf64mat2x2;\n\ttypedef mediump_f64mat3x2\t\tf64mat3x2;\n\ttypedef mediump_f64mat4x2\t\tf64mat4x2;\n\ttypedef mediump_f64mat2x3\t\tf64mat2x3;\n\ttypedef mediump_f64mat3x3\t\tf64mat3x3;\n\ttypedef mediump_f64mat4x3\t\tf64mat4x3;\n\ttypedef mediump_f64mat2x4\t\tf64mat2x4;\n\ttypedef mediump_f64mat3x4\t\tf64mat3x4;\n\ttypedef mediump_f64mat4x4\t\tf64mat4x4;\n\ttypedef mediump_f64quat\t\t\tf64quat;\n#else\n\t/// Default double-qualifier floating-point vector of 1 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64vec1\t\t\tf64vec1;\n\n\t/// Default double-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64vec2\t\t\tf64vec2;\n\n\t/// Default double-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64vec3\t\t\tf64vec3;\n\n\t/// Default double-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64vec4\t\t\tf64vec4;\n\n\t/// Default double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat2x2\t\t\tf64mat2x2;\n\n\t/// Default double-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat2x3\t\t\tf64mat2x3;\n\n\t/// Default double-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat2x4\t\t\tf64mat2x4;\n\n\t/// Default double-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat3x2\t\t\tf64mat3x2;\n\n\t/// Default double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat3x3\t\t\tf64mat3x3;\n\n\t/// Default double-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat3x4\t\t\tf64mat3x4;\n\n\t/// Default double-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat4x2\t\t\tf64mat4x2;\n\n\t/// Default double-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat4x3\t\t\tf64mat4x3;\n\n\t/// Default double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64mat4x4\t\t\tf64mat4x4;\n\n\t/// Default double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef f64mat2x2\t\t\t\tf64mat2;\n\n\t/// Default double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef f64mat3x3\t\t\t\tf64mat3;\n\n\t/// Default double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef f64mat4x4\t\t\t\tf64mat4;\n\n\t/// Default double-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef highp_f64quat\t\t\tf64quat;\n#endif\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/geometric.hpp",
    "content": "/// @ref core\n/// @file glm/geometric.hpp\n///\n/// @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>\n/// \n/// @defgroup core_func_geometric Geometric functions\n/// @ingroup core\n/// \n/// Include <glm/geometric.hpp> to use these core features.\n///\n/// These operate on vectors as vectors, not component-wise.\n\n#pragma once\n\n#include \"detail/type_vec3.hpp\"\n\nnamespace glm\n{\n\t/// @addtogroup core_func_geometric\n\t/// @{\n\n\t/// Returns the length of x, i.e., sqrt(x * x).\n\t/// \n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/length.xml\">GLSL length man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T length(vec<L, T, Q> const& x);\n\n\t/// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/distance.xml\">GLSL distance man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T distance(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1);\n\n\t/// Returns the dot product of x and y, i.e., result = x * y.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml\">GLSL dot man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T dot(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns the cross product of x and y.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cross.xml\">GLSL cross man page</a>\n\t/// @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>\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y);\n\n\t/// Returns a vector in the same direction as x but with length of 1.\n\t/// According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefined and generate an error.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/normalize.xml\">GLSL normalize man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> normalize(vec<L, T, Q> const& x);\n\n\t/// If dot(Nref, I) < 0.0, return N, otherwise, return -N.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/faceforward.xml\">GLSL faceforward man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> faceforward(\n\t\tvec<L, T, Q> const& N,\n\t\tvec<L, T, Q> const& I,\n\t\tvec<L, T, Q> const& Nref);\n\n\t/// For the incident vector I and surface orientation N, \n\t/// returns the reflection direction : result = I - 2.0 * dot(N, I) * N.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/reflect.xml\">GLSL reflect man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> reflect(\n\t\tvec<L, T, Q> const& I,\n\t\tvec<L, T, Q> const& N);\n\n\t/// For the incident vector I and surface normal N, \n\t/// and the ratio of indices of refraction eta, \n\t/// return the refraction vector.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Floating-point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml\">GLSL refract man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> refract(\n\t\tvec<L, T, Q> const& I,\n\t\tvec<L, T, Q> const& N,\n\t\tT eta);\n\n\t/// @}\n}//namespace glm\n\n#include \"detail/func_geometric.inl\"\n"
  },
  {
    "path": "external/glm/glm/glm.hpp",
    "content": "/// @ref core\n/// @file glm/glm.hpp\n///\n/// @defgroup core Core features\n///\n/// @brief Features that implement in C++ the GLSL specification as closely as possible.\n///\n/// The GLM core consists of @ref core_types \"C++ types that mirror GLSL types\" and\n/// C++ functions that mirror the GLSL functions. It also includes \n/// @ref core_precision \"a set of qualifier-based types\" that can be used in the appropriate\n/// functions. The C++ types are all based on a basic set of @ref core_template \"template types\".\n///\n/// The best documentation for GLM Core is the current GLSL specification,\n/// <a href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.clean.pdf\">version 4.2\n/// (pdf file)</a>.\n///\n/// GLM core functionalities require <glm/glm.hpp> to be included to be used.\n///\n/// @defgroup core_types Types\n///\n/// @brief The standard types defined by the specification.\n///\n/// These types are all typedefs of more generalized, template types. To see the definition\n/// of these template types, go to @ref core_template.\n///\n/// @ingroup core\n///\n/// @defgroup core_precision Precision types\n///\n/// @brief Non-GLSL types that are used to define qualifier-based types.\n///\n/// The GLSL language allows the user to define the qualifier of a particular variable.\n/// In OpenGL's GLSL, these qualifier qualifiers have no effect; they are there for compatibility\n/// with OpenGL ES's qualifier qualifiers, where they @em do have an effect.\n///\n/// C++ has no language equivalent to qualifier qualifiers. So GLM provides the next-best thing:\n/// a number of typedefs of the @ref core_template that use a particular qualifier.\n///\n/// None of these types make any guarantees about the actual qualifier used.\n///\n/// @ingroup core\n///\n/// @defgroup core_template Template types\n///\n/// @brief The generic template types used as the basis for the core types. \n///\n/// These types are all templates used to define the actual @ref core_types.\n/// These templetes are implementation details of GLM types and should not be used explicitly.\n///\n/// @ingroup core\n///\n/// @defgroup gtc Stable extensions\n///\n/// @brief Additional features not specified by GLSL specification.\n/// \n/// GTC extensions aim to be stable. \n/// \n/// Even if it's highly unrecommended, it's possible to include all the extensions at once by\n/// including <glm/ext.hpp>. Otherwise, each extension needs to be included  a specific file.\n/// \n/// @defgroup gtx Experimental extensions\n/// \n/// @brief Experimental features not specified by GLSL specification.\n/// \n/// Experimental extensions are useful functions and types, but the development of\n/// their API and functionality is not necessarily stable. They can change \n/// substantially between versions. Backwards compatibility is not much of an issue\n/// for them.\n/// \n/// Even if it's highly unrecommended, it's possible to include all the extensions \n/// at once by including <glm/ext.hpp>. Otherwise, each extension needs to be \n/// included  a specific file.\n/// \n/// @mainpage OpenGL Mathematics (GLM)\n/// - Website: <a href=\"https://glm.g-truc.net\">glm.g-truc.net</a>\n/// - <a href=\"modules.html\">GLM API documentation</a>\n/// - <a href=\"https://github.com/g-truc/glm/blob/master/manual.md\">GLM Manual</a>\n\n#include \"detail/_fixes.hpp\"\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include <cmath>\n#include <climits>\n#include <cfloat>\n#include <limits>\n#include <cassert>\n#include \"fwd.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_CORE_INCLUDED_DISPLAYED)\n#\tdefine GLM_MESSAGE_CORE_INCLUDED_DISPLAYED\n#\tpragma message(\"GLM: Core library included\")\n#endif//GLM_MESSAGES\n\n#include \"vec2.hpp\"\n#include \"vec3.hpp\"\n#include \"vec4.hpp\"\n#include \"mat2x2.hpp\"\n#include \"mat2x3.hpp\"\n#include \"mat2x4.hpp\"\n#include \"mat3x2.hpp\"\n#include \"mat3x3.hpp\"\n#include \"mat3x4.hpp\"\n#include \"mat4x2.hpp\"\n#include \"mat4x3.hpp\"\n#include \"mat4x4.hpp\"\n\n#include \"trigonometric.hpp\"\n#include \"exponential.hpp\"\n#include \"common.hpp\"\n#include \"packing.hpp\"\n#include \"geometric.hpp\"\n#include \"matrix.hpp\"\n#include \"vector_relational.hpp\"\n#include \"integer.hpp\"\n"
  },
  {
    "path": "external/glm/glm/gtc/bitfield.hpp",
    "content": "/// @ref gtc_bitfield\n/// @file glm/gtc/bitfield.hpp\n///\n/// @see core (dependence)\n/// @see gtc_bitfield (dependence)\n///\n/// @defgroup gtc_bitfield GLM_GTC_bitfield\n/// @ingroup gtc\n/// \n/// Include <glm/gtc/bitfield.hpp> to use the features of this extension.\n/// \n/// Allow to perform bit operations on integer values\n\n#include \"../detail/setup.hpp\"\n\n#pragma once\n\n// Dependencies\n#include \"../detail/qualifier.hpp\"\n#include \"../detail/type_int.hpp\"\n#include \"../detail/_vectorize.hpp\"\n#include <limits>\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_bitfield extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_bitfield\n\t/// @{\n\n\t/// Build a mask of 'count' bits\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType mask(genIUType Bits);\n\t\n\t/// Build a mask of 'count' bits\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Signed and unsigned integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> mask(vec<L, T, Q> const& v);\n\n\t/// Rotate all bits to the right. All the bits dropped in the right side are inserted back on the left side.\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType bitfieldRotateRight(genIUType In, int Shift);\n\n\t/// Rotate all bits to the right. All the bits dropped in the right side are inserted back on the left side.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Signed and unsigned integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> bitfieldRotateRight(vec<L, T, Q> const& In, int Shift);\n\n\t/// Rotate all bits to the left. All the bits dropped in the left side are inserted back on the right side.\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType bitfieldRotateLeft(genIUType In, int Shift);\n\n\t/// Rotate all bits to the left. All the bits dropped in the left side are inserted back on the right side.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Signed and unsigned integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> bitfieldRotateLeft(vec<L, T, Q> const& In, int Shift);\n\n\t/// Set to 1 a range of bits.\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount);\n\n\t/// Set to 1 a range of bits.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Signed and unsigned integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> bitfieldFillOne(vec<L, T, Q> const& Value, int FirstBit, int BitCount);\n\n\t/// Set to 0 a range of bits.\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount);\n\n\t/// Set to 0 a range of bits.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Signed and unsigned integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_bitfield\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> bitfieldFillZero(vec<L, T, Q> const& Value, int FirstBit, int BitCount);\n\n\t/// Interleaves the bits of x and y.\n\t/// The first bit is the first bit of x followed by the first bit of y.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL int16 bitfieldInterleave(int8 x, int8 y);\n\n\t/// Interleaves the bits of x and y.\n\t/// The first bit is the first bit of x followed by the first bit of y.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL uint16 bitfieldInterleave(uint8 x, uint8 y);\n\n\t/// Interleaves the bits of x and y.\n\t/// The first bit is the first bit of x followed by the first bit of y.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL int32 bitfieldInterleave(int16 x, int16 y);\n\n\t/// Interleaves the bits of x and y.\n\t/// The first bit is the first bit of x followed by the first bit of y.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL uint32 bitfieldInterleave(uint16 x, uint16 y);\n\n\t/// Interleaves the bits of x and y.\n\t/// The first bit is the first bit of x followed by the first bit of y.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y);\n\n\t/// Interleaves the bits of x and y.\n\t/// The first bit is the first bit of x followed by the first bit of y.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y);\n\n\t/// Interleaves the bits of x, y and z.\n\t/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z);\n\n\t/// Interleaves the bits of x, y and z.\n\t/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z);\n\n\t/// Interleaves the bits of x, y and z.\n\t/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z);\n\n\t/// Interleaves the bits of x, y and z. \n\t/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z);\n\n\t/// Interleaves the bits of x, y and z. \n\t/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y, int32 z);\n\n\t/// Interleaves the bits of x, y and z. \n\t/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z);\n\n\t/// Interleaves the bits of x, y, z and w. \n\t/// 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.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w);\n\n\t/// Interleaves the bits of x, y, z and w. \n\t/// 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.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w);\n\n\t/// Interleaves the bits of x, y, z and w. \n\t/// 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.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w);\n\n\t/// Interleaves the bits of x, y, z and w. \n\t/// 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.\n\t/// The other bits are interleaved following the previous sequence.\n\t/// \n\t/// @see gtc_bitfield\n\tGLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w);\n\n\t/// @}\n} //namespace glm\n\n#include \"bitfield.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/bitfield.inl",
    "content": "/// @ref gtc_bitfield\n/// @file glm/gtc/bitfield.inl\n\n#include \"../simd/integer.h\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<typename PARAM, typename RET>\n\tGLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y);\n\n\ttemplate<typename PARAM, typename RET>\n\tGLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z);\n\n\ttemplate<typename PARAM, typename RET>\n\tGLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z, PARAM w);\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER glm::uint16 bitfieldInterleave(glm::uint8 x, glm::uint8 y)\n\t{\n\t\tglm::uint16 REG1(x);\n\t\tglm::uint16 REG2(y);\n\n\t\tREG1 = ((REG1 <<  4) | REG1) & static_cast<glm::uint16>(0x0F0F);\n\t\tREG2 = ((REG2 <<  4) | REG2) & static_cast<glm::uint16>(0x0F0F);\n\n\t\tREG1 = ((REG1 <<  2) | REG1) & static_cast<glm::uint16>(0x3333);\n\t\tREG2 = ((REG2 <<  2) | REG2) & static_cast<glm::uint16>(0x3333);\n\n\t\tREG1 = ((REG1 <<  1) | REG1) & static_cast<glm::uint16>(0x5555);\n\t\tREG2 = ((REG2 <<  1) | REG2) & static_cast<glm::uint16>(0x5555);\n\n\t\treturn REG1 | static_cast<glm::uint16>(REG2 << 1);\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint16 x, glm::uint16 y)\n\t{\n\t\tglm::uint32 REG1(x);\n\t\tglm::uint32 REG2(y);\n\n\t\tREG1 = ((REG1 <<  8) | REG1) & static_cast<glm::uint32>(0x00FF00FF);\n\t\tREG2 = ((REG2 <<  8) | REG2) & static_cast<glm::uint32>(0x00FF00FF);\n\n\t\tREG1 = ((REG1 <<  4) | REG1) & static_cast<glm::uint32>(0x0F0F0F0F);\n\t\tREG2 = ((REG2 <<  4) | REG2) & static_cast<glm::uint32>(0x0F0F0F0F);\n\n\t\tREG1 = ((REG1 <<  2) | REG1) & static_cast<glm::uint32>(0x33333333);\n\t\tREG2 = ((REG2 <<  2) | REG2) & static_cast<glm::uint32>(0x33333333);\n\n\t\tREG1 = ((REG1 <<  1) | REG1) & static_cast<glm::uint32>(0x55555555);\n\t\tREG2 = ((REG2 <<  1) | REG2) & static_cast<glm::uint32>(0x55555555);\n\n\t\treturn REG1 | (REG2 << 1);\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y)\n\t{\n\t\tglm::uint64 REG1(x);\n\t\tglm::uint64 REG2(y);\n\n\t\tREG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x0000FFFF0000FFFFull);\n\t\tREG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x0000FFFF0000FFFFull);\n\n\t\tREG1 = ((REG1 <<  8) | REG1) & static_cast<glm::uint64>(0x00FF00FF00FF00FFull);\n\t\tREG2 = ((REG2 <<  8) | REG2) & static_cast<glm::uint64>(0x00FF00FF00FF00FFull);\n\n\t\tREG1 = ((REG1 <<  4) | REG1) & static_cast<glm::uint64>(0x0F0F0F0F0F0F0F0Full);\n\t\tREG2 = ((REG2 <<  4) | REG2) & static_cast<glm::uint64>(0x0F0F0F0F0F0F0F0Full);\n\n\t\tREG1 = ((REG1 <<  2) | REG1) & static_cast<glm::uint64>(0x3333333333333333ull);\n\t\tREG2 = ((REG2 <<  2) | REG2) & static_cast<glm::uint64>(0x3333333333333333ull);\n\n\t\tREG1 = ((REG1 <<  1) | REG1) & static_cast<glm::uint64>(0x5555555555555555ull);\n\t\tREG2 = ((REG2 <<  1) | REG2) & static_cast<glm::uint64>(0x5555555555555555ull);\n\n\t\treturn REG1 | (REG2 << 1);\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z)\n\t{\n\t\tglm::uint32 REG1(x);\n\t\tglm::uint32 REG2(y);\n\t\tglm::uint32 REG3(z);\n\n\t\tREG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint32>(0xFF0000FFu);\n\t\tREG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint32>(0xFF0000FFu);\n\t\tREG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint32>(0xFF0000FFu);\n\n\t\tREG1 = ((REG1 <<  8) | REG1) & static_cast<glm::uint32>(0x0F00F00Fu);\n\t\tREG2 = ((REG2 <<  8) | REG2) & static_cast<glm::uint32>(0x0F00F00Fu);\n\t\tREG3 = ((REG3 <<  8) | REG3) & static_cast<glm::uint32>(0x0F00F00Fu);\n\n\t\tREG1 = ((REG1 <<  4) | REG1) & static_cast<glm::uint32>(0xC30C30C3u);\n\t\tREG2 = ((REG2 <<  4) | REG2) & static_cast<glm::uint32>(0xC30C30C3u);\n\t\tREG3 = ((REG3 <<  4) | REG3) & static_cast<glm::uint32>(0xC30C30C3u);\n\n\t\tREG1 = ((REG1 <<  2) | REG1) & static_cast<glm::uint32>(0x49249249u);\n\t\tREG2 = ((REG2 <<  2) | REG2) & static_cast<glm::uint32>(0x49249249u);\n\t\tREG3 = ((REG3 <<  2) | REG3) & static_cast<glm::uint32>(0x49249249u);\n\n\t\treturn REG1 | (REG2 << 1) | (REG3 << 2);\n\t}\n\t\t\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z)\n\t{\n\t\tglm::uint64 REG1(x);\n\t\tglm::uint64 REG2(y);\n\t\tglm::uint64 REG3(z);\n\n\t\tREG1 = ((REG1 << 32) | REG1) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);\n\t\tREG2 = ((REG2 << 32) | REG2) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);\n\t\tREG3 = ((REG3 << 32) | REG3) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);\n\n\t\tREG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);\n\t\tREG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);\n\t\tREG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);\n\n\t\tREG1 = ((REG1 <<  8) | REG1) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);\n\t\tREG2 = ((REG2 <<  8) | REG2) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);\n\t\tREG3 = ((REG3 <<  8) | REG3) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);\n\n\t\tREG1 = ((REG1 <<  4) | REG1) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);\n\t\tREG2 = ((REG2 <<  4) | REG2) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);\n\t\tREG3 = ((REG3 <<  4) | REG3) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);\n\n\t\tREG1 = ((REG1 <<  2) | REG1) & static_cast<glm::uint64>(0x9249249249249249ull);\n\t\tREG2 = ((REG2 <<  2) | REG2) & static_cast<glm::uint64>(0x9249249249249249ull);\n\t\tREG3 = ((REG3 <<  2) | REG3) & static_cast<glm::uint64>(0x9249249249249249ull);\n\n\t\treturn REG1 | (REG2 << 1) | (REG3 << 2);\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y, glm::uint32 z)\n\t{\n\t\tglm::uint64 REG1(x);\n\t\tglm::uint64 REG2(y);\n\t\tglm::uint64 REG3(z);\n\n\t\tREG1 = ((REG1 << 32) | REG1) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);\n\t\tREG2 = ((REG2 << 32) | REG2) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);\n\t\tREG3 = ((REG3 << 32) | REG3) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);\n\n\t\tREG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);\n\t\tREG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);\n\t\tREG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);\n\n\t\tREG1 = ((REG1 <<  8) | REG1) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);\n\t\tREG2 = ((REG2 <<  8) | REG2) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);\n\t\tREG3 = ((REG3 <<  8) | REG3) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);\n\n\t\tREG1 = ((REG1 <<  4) | REG1) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);\n\t\tREG2 = ((REG2 <<  4) | REG2) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);\n\t\tREG3 = ((REG3 <<  4) | REG3) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);\n\n\t\tREG1 = ((REG1 <<  2) | REG1) & static_cast<glm::uint64>(0x9249249249249249ull);\n\t\tREG2 = ((REG2 <<  2) | REG2) & static_cast<glm::uint64>(0x9249249249249249ull);\n\t\tREG3 = ((REG3 <<  2) | REG3) & static_cast<glm::uint64>(0x9249249249249249ull);\n\n\t\treturn REG1 | (REG2 << 1) | (REG3 << 2);\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z, glm::uint8 w)\n\t{\n\t\tglm::uint32 REG1(x);\n\t\tglm::uint32 REG2(y);\n\t\tglm::uint32 REG3(z);\n\t\tglm::uint32 REG4(w);\n\n\t\tREG1 = ((REG1 << 12) | REG1) & static_cast<glm::uint32>(0x000F000Fu);\n\t\tREG2 = ((REG2 << 12) | REG2) & static_cast<glm::uint32>(0x000F000Fu);\n\t\tREG3 = ((REG3 << 12) | REG3) & static_cast<glm::uint32>(0x000F000Fu);\n\t\tREG4 = ((REG4 << 12) | REG4) & static_cast<glm::uint32>(0x000F000Fu);\n\n\t\tREG1 = ((REG1 <<  6) | REG1) & static_cast<glm::uint32>(0x03030303u);\n\t\tREG2 = ((REG2 <<  6) | REG2) & static_cast<glm::uint32>(0x03030303u);\n\t\tREG3 = ((REG3 <<  6) | REG3) & static_cast<glm::uint32>(0x03030303u);\n\t\tREG4 = ((REG4 <<  6) | REG4) & static_cast<glm::uint32>(0x03030303u);\n\n\t\tREG1 = ((REG1 <<  3) | REG1) & static_cast<glm::uint32>(0x11111111u);\n\t\tREG2 = ((REG2 <<  3) | REG2) & static_cast<glm::uint32>(0x11111111u);\n\t\tREG3 = ((REG3 <<  3) | REG3) & static_cast<glm::uint32>(0x11111111u);\n\t\tREG4 = ((REG4 <<  3) | REG4) & static_cast<glm::uint32>(0x11111111u);\n\n\t\treturn REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3);\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z, glm::uint16 w)\n\t{\n\t\tglm::uint64 REG1(x);\n\t\tglm::uint64 REG2(y);\n\t\tglm::uint64 REG3(z);\n\t\tglm::uint64 REG4(w);\n\n\t\tREG1 = ((REG1 << 24) | REG1) & static_cast<glm::uint64>(0x000000FF000000FFull);\n\t\tREG2 = ((REG2 << 24) | REG2) & static_cast<glm::uint64>(0x000000FF000000FFull);\n\t\tREG3 = ((REG3 << 24) | REG3) & static_cast<glm::uint64>(0x000000FF000000FFull);\n\t\tREG4 = ((REG4 << 24) | REG4) & static_cast<glm::uint64>(0x000000FF000000FFull);\n\n\t\tREG1 = ((REG1 << 12) | REG1) & static_cast<glm::uint64>(0x000F000F000F000Full);\n\t\tREG2 = ((REG2 << 12) | REG2) & static_cast<glm::uint64>(0x000F000F000F000Full);\n\t\tREG3 = ((REG3 << 12) | REG3) & static_cast<glm::uint64>(0x000F000F000F000Full);\n\t\tREG4 = ((REG4 << 12) | REG4) & static_cast<glm::uint64>(0x000F000F000F000Full);\n\n\t\tREG1 = ((REG1 <<  6) | REG1) & static_cast<glm::uint64>(0x0303030303030303ull);\n\t\tREG2 = ((REG2 <<  6) | REG2) & static_cast<glm::uint64>(0x0303030303030303ull);\n\t\tREG3 = ((REG3 <<  6) | REG3) & static_cast<glm::uint64>(0x0303030303030303ull);\n\t\tREG4 = ((REG4 <<  6) | REG4) & static_cast<glm::uint64>(0x0303030303030303ull);\n\n\t\tREG1 = ((REG1 <<  3) | REG1) & static_cast<glm::uint64>(0x1111111111111111ull);\n\t\tREG2 = ((REG2 <<  3) | REG2) & static_cast<glm::uint64>(0x1111111111111111ull);\n\t\tREG3 = ((REG3 <<  3) | REG3) & static_cast<glm::uint64>(0x1111111111111111ull);\n\t\tREG4 = ((REG4 <<  3) | REG4) & static_cast<glm::uint64>(0x1111111111111111ull);\n\n\t\treturn REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3);\n\t}\n}//namespace detail\n\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType mask(genIUType Bits)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'mask' accepts only integer values\");\n\n\t\treturn Bits >= sizeof(genIUType) * 8 ? ~static_cast<genIUType>(0) : (static_cast<genIUType>(1) << Bits) - static_cast<genIUType>(1);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> mask(vec<L, T, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'mask' accepts only integer values\");\n\n\t\treturn detail::functor1<L, T, T, Q>::call(mask, v);\n\t}\n\n\ttemplate<typename genIType>\n\tGLM_FUNC_QUALIFIER genIType bitfieldRotateRight(genIType In, int Shift)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIType>::is_integer, \"'bitfieldRotateRight' accepts only integer values\");\n\n\t\tint const BitSize = static_cast<genIType>(sizeof(genIType) * 8);\n\t\treturn (In << static_cast<genIType>(Shift)) | (In >> static_cast<genIType>(BitSize - Shift));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldRotateRight(vec<L, T, Q> const& In, int Shift)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'bitfieldRotateRight' accepts only integer values\");\n\n\t\tint const BitSize = static_cast<int>(sizeof(T) * 8);\n\t\treturn (In << static_cast<T>(Shift)) | (In >> static_cast<T>(BitSize - Shift));\n\t}\n\n\ttemplate<typename genIType>\n\tGLM_FUNC_QUALIFIER genIType bitfieldRotateLeft(genIType In, int Shift)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIType>::is_integer, \"'bitfieldRotateLeft' accepts only integer values\");\n\n\t\tint const BitSize = static_cast<genIType>(sizeof(genIType) * 8);\n\t\treturn (In >> static_cast<genIType>(Shift)) | (In << static_cast<genIType>(BitSize - Shift));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldRotateLeft(vec<L, T, Q> const& In, int Shift)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'bitfieldRotateLeft' accepts only integer values\");\n\n\t\tint const BitSize = static_cast<int>(sizeof(T) * 8);\n\t\treturn (In >> static_cast<T>(Shift)) | (In << static_cast<T>(BitSize - Shift));\n\t}\n\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount)\n\t{\n\t\treturn Value | static_cast<genIUType>(mask(BitCount) << FirstBit);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldFillOne(vec<L, T, Q> const& Value, int FirstBit, int BitCount)\n\t{\n\t\treturn Value | static_cast<T>(mask(BitCount) << FirstBit);\n\t}\n\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount)\n\t{\n\t\treturn Value & static_cast<genIUType>(~(mask(BitCount) << FirstBit));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldFillZero(vec<L, T, Q> const& Value, int FirstBit, int BitCount)\n\t{\n\t\treturn Value & static_cast<T>(~(mask(BitCount) << FirstBit));\n\t}\n\n\tGLM_FUNC_QUALIFIER int16 bitfieldInterleave(int8 x, int8 y)\n\t{\n\t\tunion sign8\n\t\t{\n\t\t\tint8 i;\n\t\t\tuint8 u;\n\t\t} sign_x, sign_y;\n\n\t\tunion sign16\n\t\t{\n\t\t\tint16 i;\n\t\t\tuint16 u;\n\t\t} result;\n\n\t\tsign_x.i = x;\n\t\tsign_y.i = y;\n\t\tresult.u = bitfieldInterleave(sign_x.u, sign_y.u);\n\n\t\treturn result.i;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint16 bitfieldInterleave(uint8 x, uint8 y)\n\t{\n\t\treturn detail::bitfieldInterleave<uint8, uint16>(x, y);\n\t}\n\n\tGLM_FUNC_QUALIFIER int32 bitfieldInterleave(int16 x, int16 y)\n\t{\n\t\tunion sign16\n\t\t{\n\t\t\tint16 i;\n\t\t\tuint16 u;\n\t\t} sign_x, sign_y;\n\n\t\tunion sign32\n\t\t{\n\t\t\tint32 i;\n\t\t\tuint32 u;\n\t\t} result;\n\n\t\tsign_x.i = x;\n\t\tsign_y.i = y;\n\t\tresult.u = bitfieldInterleave(sign_x.u, sign_y.u);\n\n\t\treturn result.i;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint16 x, uint16 y)\n\t{\n\t\treturn detail::bitfieldInterleave<uint16, uint32>(x, y);\n\t}\n\n\tGLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y)\n\t{\n\t\tunion sign32\n\t\t{\n\t\t\tint32 i;\n\t\t\tuint32 u;\n\t\t} sign_x, sign_y;\n\n\t\tunion sign64\n\t\t{\n\t\t\tint64 i;\n\t\t\tuint64 u;\n\t\t} result;\n\n\t\tsign_x.i = x;\n\t\tsign_y.i = y;\n\t\tresult.u = bitfieldInterleave(sign_x.u, sign_y.u);\n\n\t\treturn result.i;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y)\n\t{\n\t\treturn detail::bitfieldInterleave<uint32, uint64>(x, y);\n\t}\n\n\tGLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z)\n\t{\n\t\tunion sign8\n\t\t{\n\t\t\tint8 i;\n\t\t\tuint8 u;\n\t\t} sign_x, sign_y, sign_z;\n\n\t\tunion sign32\n\t\t{\n\t\t\tint32 i;\n\t\t\tuint32 u;\n\t\t} result;\n\n\t\tsign_x.i = x;\n\t\tsign_y.i = y;\n\t\tsign_z.i = z;\n\t\tresult.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);\n\n\t\treturn result.i;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z)\n\t{\n\t\treturn detail::bitfieldInterleave<uint8, uint32>(x, y, z);\n\t}\n\n\tGLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z)\n\t{\n\t\tunion sign16\n\t\t{\n\t\t\tint16 i;\n\t\t\tuint16 u;\n\t\t} sign_x, sign_y, sign_z;\n\n\t\tunion sign64\n\t\t{\n\t\t\tint64 i;\n\t\t\tuint64 u;\n\t\t} result;\n\n\t\tsign_x.i = x;\n\t\tsign_y.i = y;\n\t\tsign_z.i = z;\n\t\tresult.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);\n\n\t\treturn result.i;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z)\n\t{\n\t\treturn detail::bitfieldInterleave<uint32, uint64>(x, y, z);\n\t}\n\n\tGLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y, int32 z)\n\t{\n\t\tunion sign16\n\t\t{\n\t\t\tint32 i;\n\t\t\tuint32 u;\n\t\t} sign_x, sign_y, sign_z;\n\n\t\tunion sign64\n\t\t{\n\t\t\tint64 i;\n\t\t\tuint64 u;\n\t\t} result;\n\n\t\tsign_x.i = x;\n\t\tsign_y.i = y;\n\t\tsign_z.i = z;\n\t\tresult.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);\n\n\t\treturn result.i;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z)\n\t{\n\t\treturn detail::bitfieldInterleave<uint32, uint64>(x, y, z);\n\t}\n\n\tGLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w)\n\t{\n\t\tunion sign8\n\t\t{\n\t\t\tint8 i;\n\t\t\tuint8 u;\n\t\t} sign_x, sign_y, sign_z, sign_w;\n\n\t\tunion sign32\n\t\t{\n\t\t\tint32 i;\n\t\t\tuint32 u;\n\t\t} result;\n\n\t\tsign_x.i = x;\n\t\tsign_y.i = y;\n\t\tsign_z.i = z;\n\t\tsign_w.i = w;\n\t\tresult.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u);\n\n\t\treturn result.i;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w)\n\t{\n\t\treturn detail::bitfieldInterleave<uint8, uint32>(x, y, z, w);\n\t}\n\n\tGLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w)\n\t{\n\t\tunion sign16\n\t\t{\n\t\t\tint16 i;\n\t\t\tuint16 u;\n\t\t} sign_x, sign_y, sign_z, sign_w;\n\n\t\tunion sign64\n\t\t{\n\t\t\tint64 i;\n\t\t\tuint64 u;\n\t\t} result;\n\n\t\tsign_x.i = x;\n\t\tsign_y.i = y;\n\t\tsign_z.i = z;\n\t\tsign_w.i = w;\n\t\tresult.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u);\n\n\t\treturn result.i;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w)\n\t{\n\t\treturn detail::bitfieldInterleave<uint16, uint64>(x, y, z, w);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/color_space.hpp",
    "content": "/// @ref gtc_color_space\n/// @file glm/gtc/color_space.hpp\n///\n/// @see core (dependence)\n/// @see gtc_color_space (dependence)\n///\n/// @defgroup gtc_color_space GLM_GTC_color_space\n/// @ingroup gtc\n///\n/// Include <glm/gtc/color_space.hpp> to use the features of this extension.\n///\n/// Allow to perform bit operations on integer values\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n#include \"../exponential.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include <limits>\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_color_space extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_color_space\n\t/// @{\n\n\t/// Convert a linear color to sRGB color using a standard gamma correction.\n\t/// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> convertLinearToSRGB(vec<L, T, Q> const& ColorLinear);\n\n\t/// Convert a linear color to sRGB color using a custom gamma correction.\n\t/// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> convertLinearToSRGB(vec<L, T, Q> const& ColorLinear, T Gamma);\n\n\t/// Convert a sRGB color to linear color using a standard gamma correction.\n\t/// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> convertSRGBToLinear(vec<L, T, Q> const& ColorSRGB);\n\n\t/// Convert a sRGB color to linear color using a custom gamma correction.\n\t// IEC 61966-2-1:1999 / Rec. 709 specification https://www.w3.org/Graphics/Color/srgb\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> convertSRGBToLinear(vec<L, T, Q> const& ColorSRGB, T Gamma);\n\n\t/// @}\n} //namespace glm\n\n#include \"color_space.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/color_space.inl",
    "content": "/// @ref gtc_color_space\n/// @file glm/gtc/color_space.inl\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct compute_rgbToSrgb\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& ColorRGB, T GammaCorrection)\n\t\t{\n\t\t\tvec<L, T, Q> const ClampedColor(clamp(ColorRGB, static_cast<T>(0), static_cast<T>(1)));\n\n\t\t\treturn mix(\n\t\t\t\tpow(ClampedColor, vec<L, T, Q>(GammaCorrection)) * static_cast<T>(1.055) - static_cast<T>(0.055),\n\t\t\t\tClampedColor * static_cast<T>(12.92),\n\t\t\t\tlessThan(ClampedColor, vec<L, T, Q>(static_cast<T>(0.0031308))));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_rgbToSrgb<4, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& ColorRGB, T GammaCorrection)\n\t\t{\n\t\t\treturn vec<4, T, Q>(compute_rgbToSrgb<3, T, Q>::call(vec<3, T, Q>(ColorRGB), GammaCorrection), ColorRGB.w);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct compute_srgbToRgb\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& ColorSRGB, T Gamma)\n\t\t{\n\t\t\treturn mix(\n\t\t\t\tpow((ColorSRGB + static_cast<T>(0.055)) * static_cast<T>(0.94786729857819905213270142180095), vec<L, T, Q>(Gamma)),\n\t\t\t\tColorSRGB * static_cast<T>(0.07739938080495356037151702786378),\n\t\t\t\tlessThanEqual(ColorSRGB, vec<L, T, Q>(static_cast<T>(0.04045))));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_srgbToRgb<4, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, T, Q> call(vec<4, T, Q> const& ColorSRGB, T Gamma)\n\t\t{\n\t\t\treturn vec<4, T, Q>(compute_srgbToRgb<3, T, Q>::call(vec<3, T, Q>(ColorSRGB), Gamma), ColorSRGB.w);\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> convertLinearToSRGB(vec<L, T, Q> const& ColorLinear)\n\t{\n\t\treturn detail::compute_rgbToSrgb<L, T, Q>::call(ColorLinear, static_cast<T>(0.41666));\n\t}\n\n\t// Based on Ian Taylor http://chilliant.blogspot.fr/2012/08/srgb-approximations-for-hlsl.html\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER vec<3, float, lowp> convertLinearToSRGB(vec<3, float, lowp> const& ColorLinear)\n\t{\n\t\tvec<3, float, lowp> S1 = sqrt(ColorLinear);\n\t\tvec<3, float, lowp> S2 = sqrt(S1);\n\t\tvec<3, float, lowp> S3 = sqrt(S2);\n\t\treturn 0.662002687f * S1 + 0.684122060f * S2 - 0.323583601f * S3 - 0.0225411470f * ColorLinear;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> convertLinearToSRGB(vec<L, T, Q> const& ColorLinear, T Gamma)\n\t{\n\t\treturn detail::compute_rgbToSrgb<L, T, Q>::call(ColorLinear, static_cast<T>(1) / Gamma);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> convertSRGBToLinear(vec<L, T, Q> const& ColorSRGB)\n\t{\n\t\treturn detail::compute_srgbToRgb<L, T, Q>::call(ColorSRGB, static_cast<T>(2.4));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> convertSRGBToLinear(vec<L, T, Q> const& ColorSRGB, T Gamma)\n\t{\n\t\treturn detail::compute_srgbToRgb<L, T, Q>::call(ColorSRGB, Gamma);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/constants.hpp",
    "content": "/// @ref gtc_constants\n/// @file glm/gtc/constants.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_constants GLM_GTC_constants\n/// @ingroup gtc\n///\n/// Include <glm/gtc/constants.hpp> to use the features of this extension.\n/// \n/// Provide a list of constants and precomputed useful values.\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_constants extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_constants\n\t/// @{\n\n\t/// Return the epsilon constant for floating point types.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType epsilon();\n\n\t/// Return 0.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType zero();\n\n\t/// Return 1.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType one();\n\n\t/// Return the pi constant.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType pi();\n\n\t/// Return pi * 2.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType two_pi();\n\n\t/// Return square root of pi.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType root_pi();\n\n\t/// Return pi / 2.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType half_pi();\n\n\t/// Return pi / 2 * 3.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType three_over_two_pi();\n\n\t/// Return pi / 4.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType quarter_pi();\n\n\t/// Return 1 / pi.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType one_over_pi();\n\n\t/// Return 1 / (pi * 2).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType one_over_two_pi();\n\n\t/// Return 2 / pi.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType two_over_pi();\n\n\t/// Return 4 / pi.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType four_over_pi();\n\n\t/// Return 2 / sqrt(pi).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType two_over_root_pi();\n\n\t/// Return 1 / sqrt(2).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType one_over_root_two();\n\n\t/// Return sqrt(pi / 2).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType root_half_pi();\n\n\t/// Return sqrt(2 * pi).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType root_two_pi();\n\n\t/// Return sqrt(ln(4)).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType root_ln_four();\n\n\t/// Return e constant.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType e();\n\n\t/// Return Euler's constant.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType euler();\n\n\t/// Return sqrt(2).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType root_two();\n\n\t/// Return sqrt(3).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType root_three();\n\n\t/// Return sqrt(5).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType root_five();\n\n\t/// Return ln(2).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType ln_two();\n\n\t/// Return ln(10).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType ln_ten();\n\n\t/// Return ln(ln(2)).\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType ln_ln_two();\n\n\t/// Return 1 / 3.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType third();\n\n\t/// Return 2 / 3.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType two_thirds();\n\n\t/// Return the golden ratio constant.\n\t/// @see gtc_constants\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL GLM_CONSTEXPR genType golden_ratio();\n\n\t/// @}\n} //namespace glm\n\n#include \"constants.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/constants.inl",
    "content": "/// @ref gtc_constants\n/// @file glm/gtc/constants.inl\n\n#include <limits>\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType epsilon()\n\t{\n\t\treturn std::numeric_limits<genType>::epsilon();\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType zero()\n\t{\n\t\treturn genType(0);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one()\n\t{\n\t\treturn genType(1);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType pi()\n\t{\n\t\treturn genType(3.14159265358979323846264338327950288);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_pi()\n\t{\n\t\treturn genType(6.28318530717958647692528676655900576);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_pi()\n\t{\n\t\treturn genType(1.772453850905516027);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType half_pi()\n\t{\n\t\treturn genType(1.57079632679489661923132169163975144);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType three_over_two_pi()\n\t{\n\t\treturn genType(4.71238898038468985769396507491925432);           \n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType quarter_pi()\n\t{\n\t\treturn genType(0.785398163397448309615660845819875721);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_pi()\n\t{\n\t\treturn genType(0.318309886183790671537767526745028724);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_two_pi()\n\t{\n\t\treturn genType(0.159154943091895335768883763372514362);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_pi()\n\t{\n\t\treturn genType(0.636619772367581343075535053490057448);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType four_over_pi()\n\t{\n\t\treturn genType(1.273239544735162686151070106980114898);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_root_pi()\n\t{\n\t\treturn genType(1.12837916709551257389615890312154517);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_root_two()\n\t{\n\t\treturn genType(0.707106781186547524400844362104849039);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_half_pi()\n\t{\n\t\treturn genType(1.253314137315500251);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two_pi()\n\t{\n\t\treturn genType(2.506628274631000502);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_ln_four()\n\t{\n\t\treturn genType(1.17741002251547469);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType e()\n\t{\n\t\treturn genType(2.71828182845904523536);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType euler()\n\t{\n\t\treturn genType(0.577215664901532860606);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two()\n\t{\n\t\treturn genType(1.41421356237309504880168872420969808);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_three()\n\t{\n\t\treturn genType(1.73205080756887729352744634150587236);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_five()\n\t{\n\t\treturn genType(2.23606797749978969640917366873127623);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_two()\n\t{\n\t\treturn genType(0.693147180559945309417232121458176568);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ten()\n\t{\n\t\treturn genType(2.30258509299404568401799145468436421);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ln_two()\n\t{\n\t\treturn genType(-0.3665129205816643);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType third()\n\t{\n\t\treturn genType(0.3333333333333333333333333333333333333333);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_thirds()\n\t{\n\t\treturn genType(0.666666666666666666666666666666666666667);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR genType golden_ratio()\n\t{\n\t\treturn genType(1.61803398874989484820458683436563811);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/epsilon.hpp",
    "content": "/// @ref gtc_epsilon\n/// @file glm/gtc/epsilon.hpp\n/// \n/// @see core (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtc_epsilon GLM_GTC_epsilon\n/// @ingroup gtc\n///\n/// Include <glm/gtc/epsilon.hpp> to use the features of this extension.\n/// \n/// Comparison functions for a user defined epsilon values.\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_epsilon extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_epsilon\n\t/// @{\n\n\t/// Returns the component-wise comparison of |x - y| < epsilon.\n\t/// True if this expression is satisfied.\n\t///\n\t/// @see gtc_epsilon\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> epsilonEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon);\n\n\t/// Returns the component-wise comparison of |x - y| < epsilon.\n\t/// True if this expression is satisfied.\n\t///\n\t/// @see gtc_epsilon\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool epsilonEqual(genType const& x, genType const& y, genType const& epsilon);\n\n\t/// Returns the component-wise comparison of |x - y| < epsilon.\n\t/// True if this expression is not satisfied.\n\t///\n\t/// @see gtc_epsilon\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> epsilonNotEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon);\n\n\t/// Returns the component-wise comparison of |x - y| >= epsilon.\n\t/// True if this expression is not satisfied.\n\t///\n\t/// @see gtc_epsilon\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool epsilonNotEqual(genType const& x, genType const& y, genType const& epsilon);\n\n\t/// @}\n}//namespace glm\n\n#include \"epsilon.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/epsilon.inl",
    "content": "/// @ref gtc_epsilon\n/// @file glm/gtc/epsilon.inl\n\n// Dependency:\n#include \"quaternion.hpp\"\n#include \"../vector_relational.hpp\"\n#include \"../common.hpp\"\n#include \"../detail/type_vec.hpp\"\n\nnamespace glm\n{\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER bool epsilonEqual\n\t(\n\t\tfloat const& x,\n\t\tfloat const& y,\n\t\tfloat const& epsilon\n\t)\n\t{\n\t\treturn abs(x - y) < epsilon;\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER bool epsilonEqual\n\t(\n\t\tdouble const& x,\n\t\tdouble const& y,\n\t\tdouble const& epsilon\n\t)\n\t{\n\t\treturn abs(x - y) < epsilon;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> epsilonEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon)\n\t{\n\t\treturn lessThan(abs(x - y), vec<L, T, Q>(epsilon));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> epsilonEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon)\n\t{\n\t\treturn lessThan(abs(x - y), vec<L, T, Q>(epsilon));\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER bool epsilonNotEqual(float const& x, float const& y, float const& epsilon)\n\t{\n\t\treturn abs(x - y) >= epsilon;\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER bool epsilonNotEqual(double const& x, double const& y, double const& epsilon)\n\t{\n\t\treturn abs(x - y) >= epsilon;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> epsilonNotEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T const& epsilon)\n\t{\n\t\treturn greaterThanEqual(abs(x - y), vec<L, T, Q>(epsilon));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> epsilonNotEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& epsilon)\n\t{\n\t\treturn greaterThanEqual(abs(x - y), vec<L, T, Q>(epsilon));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> epsilonEqual(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& epsilon)\n\t{\n\t\tvec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w);\n\t\treturn lessThan(abs(v), vec<4, T, Q>(epsilon));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> epsilonNotEqual(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& epsilon)\n\t{\n\t\tvec<4, T, Q> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w);\n\t\treturn greaterThanEqual(abs(v), vec<4, T, Q>(epsilon));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/integer.hpp",
    "content": "/// @ref gtc_integer\n/// @file glm/gtc/integer.hpp\n///\n/// @see core (dependence)\n/// @see gtc_integer (dependence)\n///\n/// @defgroup gtc_integer GLM_GTC_integer\n/// @ingroup gtc\n///\n/// Include <glm/gtc/integer.hpp> to use the features of this extension.\n///\n/// @brief Allow to perform bit operations on integer values\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n#include \"../common.hpp\"\n#include \"../integer.hpp\"\n#include \"../exponential.hpp\"\n#include <limits>\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_integer extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_integer\n\t/// @{\n\n\t/// Returns the log2 of x for integer values. Can be reliably using to compute mipmap count from the texture size.\n\t/// @see gtc_integer\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType log2(genIUType x);\n\n\t/// Returns a value equal to the nearest integer to x.\n\t/// The fraction 0.5 will round in a direction chosen by the\n\t/// implementation, presumably the direction that is fastest.\n\t/// \n\t/// @param x The values of the argument must be greater or equal to zero.\n\t/// @tparam T floating point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml\">GLSL round man page</a>\n\t/// @see gtc_integer\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, int, Q> iround(vec<L, T, Q> const& x);\n\n\t/// Returns a value equal to the nearest integer to x.\n\t/// The fraction 0.5 will round in a direction chosen by the\n\t/// implementation, presumably the direction that is fastest.\n\t/// \n\t/// @param x The values of the argument must be greater or equal to zero.\n\t/// @tparam T floating point scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml\">GLSL round man page</a>\n\t/// @see gtc_integer\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, uint, Q> uround(vec<L, T, Q> const& x);\n\n\t/// @}\n} //namespace glm\n\n#include \"integer.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/integer.inl",
    "content": "/// @ref gtc_integer\n/// @file glm/gtc/integer.inl\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_log2<L, T, Q, false, Aligned>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\t//Equivalent to return findMSB(vec); but save one function call in ASM with VC\n\t\t\t//return findMSB(vec);\n\t\t\treturn vec<L, T, Q>(detail::compute_findMSB_vec<L, T, Q, sizeof(T) * 8>::call(v));\n\t\t}\n\t};\n\n#\tif GLM_HAS_BITSCAN_WINDOWS\n\t\ttemplate<qualifier Q, bool Aligned>\n\t\tstruct compute_log2<4, int, Q, false, Aligned>\n\t\t{\n\t\t\tGLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v)\n\t\t\t{\n\t\t\t\tvec<4, int, Q> Result;\n\t\t\t\t_BitScanReverse(reinterpret_cast<unsigned long*>(&Result.x), v.x);\n\t\t\t\t_BitScanReverse(reinterpret_cast<unsigned long*>(&Result.y), v.y);\n\t\t\t\t_BitScanReverse(reinterpret_cast<unsigned long*>(&Result.z), v.z);\n\t\t\t\t_BitScanReverse(reinterpret_cast<unsigned long*>(&Result.w), v.w);\n\t\t\t\treturn Result;\n\t\t\t}\n\t\t};\n#\tendif//GLM_HAS_BITSCAN_WINDOWS\n}//namespace detail\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER int iround(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'iround' only accept floating-point inputs\");\n\t\tassert(static_cast<genType>(0.0) <= x);\n\n\t\treturn static_cast<int>(x + static_cast<genType>(0.5));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, int, Q> iround(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'iround' only accept floating-point inputs\");\n\t\tassert(all(lessThanEqual(vec<L, T, Q>(0), x)));\n\n\t\treturn vec<L, int, Q>(x + static_cast<T>(0.5));\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER uint uround(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'uround' only accept floating-point inputs\");\n\t\tassert(static_cast<genType>(0.0) <= x);\n\n\t\treturn static_cast<uint>(x + static_cast<genType>(0.5));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, uint, Q> uround(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'uround' only accept floating-point inputs\");\n\t\tassert(all(lessThanEqual(vec<L, T, Q>(0), x)));\n\n\t\treturn vec<L, uint, Q>(x + static_cast<T>(0.5));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/matrix_access.hpp",
    "content": "/// @ref gtc_matrix_access\n/// @file glm/gtc/matrix_access.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_matrix_access GLM_GTC_matrix_access\n/// @ingroup gtc\n///\n/// Include <glm/gtc/matrix_access.hpp> to use the features of this extension.\n///\n/// Defines functions to access rows or columns of a matrix easily.\n\n#pragma once\n\n// Dependency:\n#include \"../detail/setup.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_matrix_access extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_matrix_access\n\t/// @{\n\n\t/// Get a specific row of a matrix.\n\t/// @see gtc_matrix_access\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL typename genType::row_type row(\n\t\tgenType const& m,\n\t\tlength_t index);\n\n\t/// Set a specific row to a matrix.\n\t/// @see gtc_matrix_access\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType row(\n\t\tgenType const& m,\n\t\tlength_t index,\n\t\ttypename genType::row_type const& x);\n\n\t/// Get a specific column of a matrix.\n\t/// @see gtc_matrix_access\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL typename genType::col_type column(\n\t\tgenType const& m,\n\t\tlength_t index);\n\n\t/// Set a specific column to a matrix.\n\t/// @see gtc_matrix_access\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType column(\n\t\tgenType const& m,\n\t\tlength_t index,\n\t\ttypename genType::col_type const& x);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_access.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/matrix_access.inl",
    "content": "/// @ref gtc_matrix_access\n/// @file glm/gtc/matrix_access.inl\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType row\n\t(\n\t\tgenType const& m,\n\t\tlength_t index,\n\t\ttypename genType::row_type const& x\n\t)\n\t{\n\t\tassert(index >= 0 && index < m[0].length());\n\n\t\tgenType Result = m;\n\t\tfor(length_t i = 0; i < m.length(); ++i)\n\t\t\tResult[i][index] = x[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER typename genType::row_type row\n\t(\n\t\tgenType const& m,\n\t\tlength_t index\n\t)\n\t{\n\t\tassert(index >= 0 && index < m[0].length());\n\n\t\ttypename genType::row_type Result(0);\n\t\tfor(length_t i = 0; i < m.length(); ++i)\n\t\t\tResult[i] = m[i][index];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType column\n\t(\n\t\tgenType const& m,\n\t\tlength_t index,\n\t\ttypename genType::col_type const& x\n\t)\n\t{\n\t\tassert(index >= 0 && index < m.length());\n\n\t\tgenType Result = m;\n\t\tResult[index] = x;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER typename genType::col_type column\n\t(\n\t\tgenType const& m,\n\t\tlength_t index\n\t)\n\t{\n\t\tassert(index >= 0 && index < m.length());\n\n\t\treturn m[index];\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/matrix_integer.hpp",
    "content": "/// @ref gtc_matrix_integer\n/// @file glm/gtc/matrix_integer.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_matrix_integer GLM_GTC_matrix_integer\n/// @ingroup gtc\n///\n/// Include <glm/gtc/matrix_integer.hpp> to use the features of this extension.\n///\n/// Defines a number of matrices with integer types.\n\n#pragma once\n\n// Dependency:\n#include \"../mat2x2.hpp\"\n#include \"../mat2x3.hpp\"\n#include \"../mat2x4.hpp\"\n#include \"../mat3x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat3x4.hpp\"\n#include \"../mat4x2.hpp\"\n#include \"../mat4x3.hpp\"\n#include \"../mat4x4.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_matrix_integer extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_matrix_integer\n\t/// @{\n\n\t/// High-qualifier signed integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, int, highp>\t\t\t\thighp_imat2;\n\n\t/// High-qualifier signed integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, int, highp>\t\t\t\thighp_imat3;\n\n\t/// High-qualifier signed integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, int, highp>\t\t\t\thighp_imat4;\n\n\t/// High-qualifier signed integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, int, highp>\t\t\t\thighp_imat2x2;\n\n\t/// High-qualifier signed integer 2x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 3, int, highp>\t\t\t\thighp_imat2x3;\n\n\t/// High-qualifier signed integer 2x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 4, int, highp>\t\t\t\thighp_imat2x4;\n\n\t/// High-qualifier signed integer 3x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 2, int, highp>\t\t\t\thighp_imat3x2;\n\n\t/// High-qualifier signed integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, int, highp>\t\t\t\thighp_imat3x3;\n\n\t/// High-qualifier signed integer 3x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 4, int, highp>\t\t\t\thighp_imat3x4;\n\n\t/// High-qualifier signed integer 4x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 2, int, highp>\t\t\t\thighp_imat4x2;\n\n\t/// High-qualifier signed integer 4x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 3, int, highp>\t\t\t\thighp_imat4x3;\n\n\t/// High-qualifier signed integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, int, highp>\t\t\t\thighp_imat4x4;\n\n\n\t/// Medium-qualifier signed integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, int, mediump>\t\t\tmediump_imat2;\n\n\t/// Medium-qualifier signed integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, int, mediump>\t\t\tmediump_imat3;\n\n\t/// Medium-qualifier signed integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, int, mediump>\t\t\tmediump_imat4;\n\n\n\t/// Medium-qualifier signed integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, int, mediump>\t\t\tmediump_imat2x2;\n\n\t/// Medium-qualifier signed integer 2x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 3, int, mediump>\t\t\tmediump_imat2x3;\n\n\t/// Medium-qualifier signed integer 2x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 4, int, mediump>\t\t\tmediump_imat2x4;\n\n\t/// Medium-qualifier signed integer 3x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 2, int, mediump>\t\t\tmediump_imat3x2;\n\n\t/// Medium-qualifier signed integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, int, mediump>\t\t\tmediump_imat3x3;\n\n\t/// Medium-qualifier signed integer 3x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 4, int, mediump>\t\t\tmediump_imat3x4;\n\n\t/// Medium-qualifier signed integer 4x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 2, int, mediump>\t\t\tmediump_imat4x2;\n\n\t/// Medium-qualifier signed integer 4x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 3, int, mediump>\t\t\tmediump_imat4x3;\n\n\t/// Medium-qualifier signed integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, int, mediump>\t\t\tmediump_imat4x4;\n\n\n\t/// Low-qualifier signed integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, int, lowp>\t\t\t\tlowp_imat2;\n\t\n\t/// Low-qualifier signed integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, int, lowp>\t\t\t\tlowp_imat3;\n\n\t/// Low-qualifier signed integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, int, lowp>\t\t\t\tlowp_imat4;\n\n\n\t/// Low-qualifier signed integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, int, lowp>\t\t\t\tlowp_imat2x2;\n\n\t/// Low-qualifier signed integer 2x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 3, int, lowp>\t\t\t\tlowp_imat2x3;\n\n\t/// Low-qualifier signed integer 2x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 4, int, lowp>\t\t\t\tlowp_imat2x4;\n\n\t/// Low-qualifier signed integer 3x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 2, int, lowp>\t\t\t\tlowp_imat3x2;\n\n\t/// Low-qualifier signed integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, int, lowp>\t\t\t\tlowp_imat3x3;\n\n\t/// Low-qualifier signed integer 3x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 4, int, lowp>\t\t\t\tlowp_imat3x4;\n\n\t/// Low-qualifier signed integer 4x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 2, int, lowp>\t\t\t\tlowp_imat4x2;\n\n\t/// Low-qualifier signed integer 4x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 3, int, lowp>\t\t\t\tlowp_imat4x3;\n\n\t/// Low-qualifier signed integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, int, lowp>\t\t\t\tlowp_imat4x4;\n\n\n\t/// High-qualifier unsigned integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, uint, highp>\t\t\t\thighp_umat2;\t\n\n\t/// High-qualifier unsigned integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, uint, highp>\t\t\t\thighp_umat3;\n\n\t/// High-qualifier unsigned integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, uint, highp>\t\t\t\thighp_umat4;\n\n\t/// High-qualifier unsigned integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, uint, highp>\t\t\t\thighp_umat2x2;\n\n\t/// High-qualifier unsigned integer 2x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 3, uint, highp>\t\t\t\thighp_umat2x3;\n\n\t/// High-qualifier unsigned integer 2x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 4, uint, highp>\t\t\t\thighp_umat2x4;\n\n\t/// High-qualifier unsigned integer 3x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 2, uint, highp>\t\t\t\thighp_umat3x2;\n\n\t/// High-qualifier unsigned integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, uint, highp>\t\t\t\thighp_umat3x3;\n\n\t/// High-qualifier unsigned integer 3x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 4, uint, highp>\t\t\t\thighp_umat3x4;\n\n\t/// High-qualifier unsigned integer 4x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 2, uint, highp>\t\t\t\thighp_umat4x2;\n\n\t/// High-qualifier unsigned integer 4x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 3, uint, highp>\t\t\t\thighp_umat4x3;\n\n\t/// High-qualifier unsigned integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, uint, highp>\t\t\t\thighp_umat4x4;\n\n\n\t/// Medium-qualifier unsigned integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, uint, mediump>\t\t\tmediump_umat2;\n\n\t/// Medium-qualifier unsigned integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, uint, mediump>\t\t\tmediump_umat3;\n\n\t/// Medium-qualifier unsigned integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, uint, mediump>\t\t\tmediump_umat4;\n\n\n\t/// Medium-qualifier unsigned integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, uint, mediump>\t\t\tmediump_umat2x2;\n\n\t/// Medium-qualifier unsigned integer 2x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 3, uint, mediump>\t\t\tmediump_umat2x3;\n\n\t/// Medium-qualifier unsigned integer 2x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 4, uint, mediump>\t\t\tmediump_umat2x4;\n\n\t/// Medium-qualifier unsigned integer 3x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 2, uint, mediump>\t\t\tmediump_umat3x2;\n\n\t/// Medium-qualifier unsigned integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, uint, mediump>\t\t\tmediump_umat3x3;\n\n\t/// Medium-qualifier unsigned integer 3x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 4, uint, mediump>\t\t\tmediump_umat3x4;\n\n\t/// Medium-qualifier unsigned integer 4x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 2, uint, mediump>\t\t\tmediump_umat4x2;\n\n\t/// Medium-qualifier unsigned integer 4x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 3, uint, mediump>\t\t\tmediump_umat4x3;\n\n\t/// Medium-qualifier unsigned integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, uint, mediump>\t\t\tmediump_umat4x4;\n\n\n\t/// Low-qualifier unsigned integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, uint, lowp>\t\t\t\tlowp_umat2;\n\t\n\t/// Low-qualifier unsigned integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, uint, lowp>\t\t\t\tlowp_umat3;\n\n\t/// Low-qualifier unsigned integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, uint, lowp>\t\t\t\tlowp_umat4;\n\n\n\t/// Low-qualifier unsigned integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 2, uint, lowp>\t\t\t\tlowp_umat2x2;\n\n\t/// Low-qualifier unsigned integer 2x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 3, uint, lowp>\t\t\t\tlowp_umat2x3;\n\n\t/// Low-qualifier unsigned integer 2x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<2, 4, uint, lowp>\t\t\t\tlowp_umat2x4;\n\n\t/// Low-qualifier unsigned integer 3x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 2, uint, lowp>\t\t\t\tlowp_umat3x2;\n\n\t/// Low-qualifier unsigned integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 3, uint, lowp>\t\t\t\tlowp_umat3x3;\n\n\t/// Low-qualifier unsigned integer 3x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<3, 4, uint, lowp>\t\t\t\tlowp_umat3x4;\n\n\t/// Low-qualifier unsigned integer 4x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 2, uint, lowp>\t\t\t\tlowp_umat4x2;\n\n\t/// Low-qualifier unsigned integer 4x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 3, uint, lowp>\t\t\t\tlowp_umat4x3;\n\n\t/// Low-qualifier unsigned integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mat<4, 4, uint, lowp>\t\t\t\tlowp_umat4x4;\n\n#if(defined(GLM_PRECISION_HIGHP_INT))\n\ttypedef highp_imat2\t\t\t\t\t\t\t\timat2;\n\ttypedef highp_imat3\t\t\t\t\t\t\t\timat3;\n\ttypedef highp_imat4\t\t\t\t\t\t\t\timat4;\n\ttypedef highp_imat2x2\t\t\t\t\t\t\timat2x2;\n\ttypedef highp_imat2x3\t\t\t\t\t\t\timat2x3;\n\ttypedef highp_imat2x4\t\t\t\t\t\t\timat2x4;\n\ttypedef highp_imat3x2\t\t\t\t\t\t\timat3x2;\n\ttypedef highp_imat3x3\t\t\t\t\t\t\timat3x3;\n\ttypedef highp_imat3x4\t\t\t\t\t\t\timat3x4;\n\ttypedef highp_imat4x2\t\t\t\t\t\t\timat4x2;\n\ttypedef highp_imat4x3\t\t\t\t\t\t\timat4x3;\n\ttypedef highp_imat4x4\t\t\t\t\t\t\timat4x4;\n#elif(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_imat2\t\t\t\t\t\t\t\timat2;\n\ttypedef lowp_imat3\t\t\t\t\t\t\t\timat3;\n\ttypedef lowp_imat4\t\t\t\t\t\t\t\timat4;\n\ttypedef lowp_imat2x2\t\t\t\t\t\t\timat2x2;\n\ttypedef lowp_imat2x3\t\t\t\t\t\t\timat2x3;\n\ttypedef lowp_imat2x4\t\t\t\t\t\t\timat2x4;\n\ttypedef lowp_imat3x2\t\t\t\t\t\t\timat3x2;\n\ttypedef lowp_imat3x3\t\t\t\t\t\t\timat3x3;\n\ttypedef lowp_imat3x4\t\t\t\t\t\t\timat3x4;\n\ttypedef lowp_imat4x2\t\t\t\t\t\t\timat4x2;\n\ttypedef lowp_imat4x3\t\t\t\t\t\t\timat4x3;\n\ttypedef lowp_imat4x4\t\t\t\t\t\t\timat4x4;\n#else //if(defined(GLM_PRECISION_MEDIUMP_INT))\n\n\t/// Signed integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat2\t\t\t\t\t\t\timat2;\n\n\t/// Signed integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat3\t\t\t\t\t\t\timat3;\n\n\t/// Signed integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat4\t\t\t\t\t\t\timat4;\n\n\t/// Signed integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat2x2\t\t\t\t\t\t\timat2x2;\n\n\t/// Signed integer 2x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat2x3\t\t\t\t\t\t\timat2x3;\n\n\t/// Signed integer 2x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat2x4\t\t\t\t\t\t\timat2x4;\n\n\t/// Signed integer 3x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat3x2\t\t\t\t\t\t\timat3x2;\n\n\t/// Signed integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat3x3\t\t\t\t\t\t\timat3x3;\n\n\t/// Signed integer 3x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat3x4\t\t\t\t\t\t\timat3x4;\n\n\t/// Signed integer 4x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat4x2\t\t\t\t\t\t\timat4x2;\n\n\t/// Signed integer 4x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat4x3\t\t\t\t\t\t\timat4x3;\n\n\t/// Signed integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_imat4x4\t\t\t\t\t\t\timat4x4;\n#endif//GLM_PRECISION\n\n#if(defined(GLM_PRECISION_HIGHP_UINT))\n\ttypedef highp_umat2\t\t\t\t\t\t\t\tumat2;\n\ttypedef highp_umat3\t\t\t\t\t\t\t\tumat3;\n\ttypedef highp_umat4\t\t\t\t\t\t\t\tumat4;\n\ttypedef highp_umat2x2\t\t\t\t\t\t\tumat2x2;\n\ttypedef highp_umat2x3\t\t\t\t\t\t\tumat2x3;\n\ttypedef highp_umat2x4\t\t\t\t\t\t\tumat2x4;\n\ttypedef highp_umat3x2\t\t\t\t\t\t\tumat3x2;\n\ttypedef highp_umat3x3\t\t\t\t\t\t\tumat3x3;\n\ttypedef highp_umat3x4\t\t\t\t\t\t\tumat3x4;\n\ttypedef highp_umat4x2\t\t\t\t\t\t\tumat4x2;\n\ttypedef highp_umat4x3\t\t\t\t\t\t\tumat4x3;\n\ttypedef highp_umat4x4\t\t\t\t\t\t\tumat4x4;\n#elif(defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef lowp_umat2\t\t\t\t\t\t\t\tumat2;\n\ttypedef lowp_umat3\t\t\t\t\t\t\t\tumat3;\n\ttypedef lowp_umat4\t\t\t\t\t\t\t\tumat4;\n\ttypedef lowp_umat2x2\t\t\t\t\t\t\tumat2x2;\n\ttypedef lowp_umat2x3\t\t\t\t\t\t\tumat2x3;\n\ttypedef lowp_umat2x4\t\t\t\t\t\t\tumat2x4;\n\ttypedef lowp_umat3x2\t\t\t\t\t\t\tumat3x2;\n\ttypedef lowp_umat3x3\t\t\t\t\t\t\tumat3x3;\n\ttypedef lowp_umat3x4\t\t\t\t\t\t\tumat3x4;\n\ttypedef lowp_umat4x2\t\t\t\t\t\t\tumat4x2;\n\ttypedef lowp_umat4x3\t\t\t\t\t\t\tumat4x3;\n\ttypedef lowp_umat4x4\t\t\t\t\t\t\tumat4x4;\n#else //if(defined(GLM_PRECISION_MEDIUMP_UINT))\n\t\n\t/// Unsigned integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat2\t\t\t\t\t\t\tumat2;\n\n\t/// Unsigned integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat3\t\t\t\t\t\t\tumat3;\n\n\t/// Unsigned integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat4\t\t\t\t\t\t\tumat4;\n\n\t/// Unsigned integer 2x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat2x2\t\t\t\t\t\t\tumat2x2;\n\n\t/// Unsigned integer 2x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat2x3\t\t\t\t\t\t\tumat2x3;\n\n\t/// Unsigned integer 2x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat2x4\t\t\t\t\t\t\tumat2x4;\n\n\t/// Unsigned integer 3x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat3x2\t\t\t\t\t\t\tumat3x2;\n\n\t/// Unsigned integer 3x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat3x3\t\t\t\t\t\t\tumat3x3;\n\n\t/// Unsigned integer 3x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat3x4\t\t\t\t\t\t\tumat3x4;\n\n\t/// Unsigned integer 4x2 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat4x2\t\t\t\t\t\t\tumat4x2;\n\n\t/// Unsigned integer 4x3 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat4x3\t\t\t\t\t\t\tumat4x3;\n\n\t/// Unsigned integer 4x4 matrix.\n\t/// @see gtc_matrix_integer\n\ttypedef mediump_umat4x4\t\t\t\t\t\t\tumat4x4;\n#endif//GLM_PRECISION\n\n\t/// @}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/matrix_inverse.hpp",
    "content": "/// @ref gtc_matrix_inverse\n/// @file glm/gtc/matrix_inverse.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_matrix_inverse GLM_GTC_matrix_inverse\n/// @ingroup gtc\n///\n/// Include <glm/gtc/matrix_integer.hpp> to use the features of this extension.\n///\n/// Defines additional matrix inverting functions.\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../matrix.hpp\"\n#include \"../mat2x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat4x4.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_matrix_inverse extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_matrix_inverse\n\t/// @{\n\n\t/// Fast matrix inverse for affine matrix.\n\t/// \n\t/// @param m Input matrix to invert.\n\t/// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate.\n\t/// @see gtc_matrix_inverse\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType affineInverse(genType const& m);\n\n\t/// Compute the inverse transpose of a matrix.\n\t/// \n\t/// @param m Input matrix to invert transpose.\n\t/// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-qualifier floating point value is highly innacurate.\n\t/// @see gtc_matrix_inverse\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType inverseTranspose(genType const& m);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_inverse.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/matrix_inverse.inl",
    "content": "/// @ref gtc_matrix_inverse\n/// @file glm/gtc/matrix_inverse.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> affineInverse(mat<3, 3, T, Q> const& m)\n\t{\n\t\tmat<2, 2, T, Q> const Inv(inverse(mat<2, 2, T, Q>(m)));\n\n\t\treturn mat<3, 3, T, Q>(\n\t\t\tvec<3, T, Q>(Inv[0], static_cast<T>(0)),\n\t\t\tvec<3, T, Q>(Inv[1], static_cast<T>(0)),\n\t\t\tvec<3, T, Q>(-Inv * vec<2, T, Q>(m[2]), static_cast<T>(1)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> affineInverse(mat<4, 4, T, Q> const& m)\n\t{\n\t\tmat<3, 3, T, Q> const Inv(inverse(mat<3, 3, T, Q>(m)));\n\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tvec<4, T, Q>(Inv[0], static_cast<T>(0)),\n\t\t\tvec<4, T, Q>(Inv[1], static_cast<T>(0)),\n\t\t\tvec<4, T, Q>(Inv[2], static_cast<T>(0)),\n\t\t\tvec<4, T, Q>(-Inv * vec<3, T, Q>(m[3]), static_cast<T>(1)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> inverseTranspose(mat<2, 2, T, Q> const& m)\n\t{\n\t\tT Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1];\n\n\t\tmat<2, 2, T, Q> Inverse(\n\t\t\t+ m[1][1] / Determinant,\n\t\t\t- m[0][1] / Determinant,\n\t\t\t- m[1][0] / Determinant,\n\t\t\t+ m[0][0] / Determinant);\n\n\t\treturn Inverse;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> inverseTranspose(mat<3, 3, T, Q> const& m)\n\t{\n\t\tT Determinant =\n\t\t\t+ m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1])\n\t\t\t- m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0])\n\t\t\t+ m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);\n\n\t\tmat<3, 3, T, Q> Inverse;\n\t\tInverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]);\n\t\tInverse[0][1] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]);\n\t\tInverse[0][2] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]);\n\t\tInverse[1][0] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]);\n\t\tInverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]);\n\t\tInverse[1][2] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]);\n\t\tInverse[2][0] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]);\n\t\tInverse[2][1] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]);\n\t\tInverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]);\n\t\tInverse /= Determinant;\n\n\t\treturn Inverse;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> inverseTranspose(mat<4, 4, T, Q> const& m)\n\t{\n\t\tT SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\tT SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\tT SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\tT SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\tT SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\tT SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\t\tT SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n\t\tT SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n\t\tT SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n\t\tT SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n\t\tT SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n\t\tT SubFactor11 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n\t\tT SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n\t\tT SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\t\tT SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\t\tT SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\t\tT SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\t\tT SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\t\tT SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n\t\tmat<4, 4, T, Q> Inverse;\n\t\tInverse[0][0] = + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02);\n\t\tInverse[0][1] = - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04);\n\t\tInverse[0][2] = + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05);\n\t\tInverse[0][3] = - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05);\n\n\t\tInverse[1][0] = - (m[0][1] * SubFactor00 - m[0][2] * SubFactor01 + m[0][3] * SubFactor02);\n\t\tInverse[1][1] = + (m[0][0] * SubFactor00 - m[0][2] * SubFactor03 + m[0][3] * SubFactor04);\n\t\tInverse[1][2] = - (m[0][0] * SubFactor01 - m[0][1] * SubFactor03 + m[0][3] * SubFactor05);\n\t\tInverse[1][3] = + (m[0][0] * SubFactor02 - m[0][1] * SubFactor04 + m[0][2] * SubFactor05);\n\n\t\tInverse[2][0] = + (m[0][1] * SubFactor06 - m[0][2] * SubFactor07 + m[0][3] * SubFactor08);\n\t\tInverse[2][1] = - (m[0][0] * SubFactor06 - m[0][2] * SubFactor09 + m[0][3] * SubFactor10);\n\t\tInverse[2][2] = + (m[0][0] * SubFactor11 - m[0][1] * SubFactor09 + m[0][3] * SubFactor12);\n\t\tInverse[2][3] = - (m[0][0] * SubFactor08 - m[0][1] * SubFactor10 + m[0][2] * SubFactor12);\n\n\t\tInverse[3][0] = - (m[0][1] * SubFactor13 - m[0][2] * SubFactor14 + m[0][3] * SubFactor15);\n\t\tInverse[3][1] = + (m[0][0] * SubFactor13 - m[0][2] * SubFactor16 + m[0][3] * SubFactor17);\n\t\tInverse[3][2] = - (m[0][0] * SubFactor14 - m[0][1] * SubFactor16 + m[0][3] * SubFactor18);\n\t\tInverse[3][3] = + (m[0][0] * SubFactor15 - m[0][1] * SubFactor17 + m[0][2] * SubFactor18);\n\n\t\tT Determinant =\n\t\t\t+ m[0][0] * Inverse[0][0]\n\t\t\t+ m[0][1] * Inverse[0][1]\n\t\t\t+ m[0][2] * Inverse[0][2]\n\t\t\t+ m[0][3] * Inverse[0][3];\n\n\t\tInverse /= Determinant;\n\n\t\treturn Inverse;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/matrix_transform.hpp",
    "content": "/// @ref gtc_matrix_transform\n/// @file glm/gtc/matrix_transform.hpp\n///\n/// @see core (dependence)\n/// @see gtx_transform\n/// @see gtx_transform2\n/// \n/// @defgroup gtc_matrix_transform GLM_GTC_matrix_transform\n/// @ingroup gtc\n///\n/// Include <glm/gtc/matrix_transform.hpp> to use the features of this extension.\n///\n/// Defines functions that generate common transformation matrices.\n///\n/// The matrices generated by this extension use standard OpenGL fixed-function\n/// conventions. For example, the lookAt function generates a transform from world\n/// space into the specific eye space that the projective matrix functions \n/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility\n/// specifications defines the particular layout of this eye space.\n\n#pragma once\n\n// Dependencies\n#include \"../mat4x4.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../gtc/constants.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_matrix_transform extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_matrix_transform\n\t/// @{\n\n\t/// Builds a translation 4 * 4 matrix created from a vector of 3 components.\n\t/// \n\t/// @param m Input matrix multiplied by this translation matrix.\n\t/// @param v Coordinates of a translation vector.\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @code\n\t/// #include <glm/glm.hpp>\n\t/// #include <glm/gtc/matrix_transform.hpp>\n\t/// ...\n\t/// glm::mat4 m = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f));\n\t/// // m[0][0] == 1.0f, m[0][1] == 0.0f, m[0][2] == 0.0f, m[0][3] == 0.0f\n\t/// // m[1][0] == 0.0f, m[1][1] == 1.0f, m[1][2] == 0.0f, m[1][3] == 0.0f\n\t/// // m[2][0] == 0.0f, m[2][1] == 0.0f, m[2][2] == 1.0f, m[2][3] == 0.0f\n\t/// // m[3][0] == 1.0f, m[3][1] == 1.0f, m[3][2] == 1.0f, m[3][3] == 1.0f\n\t/// @endcode\n\t/// @see gtc_matrix_transform\n\t/// @see - translate(mat<4, 4, T, Q> const& m, T x, T y, T z)\n\t/// @see - translate(vec<3, T, Q> const& v)\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTranslate.xml\">glTranslate man page</a> \n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> translate(\n\t\tmat<4, 4, T, Q> const& m, vec<3, T, Q> const& v);\n\n\t/// Builds a rotation 4 * 4 matrix created from an axis vector and an angle. \n\t/// \n\t/// @param m Input matrix multiplied by this rotation matrix.\n\t/// @param angle Rotation angle expressed in radians.\n\t/// @param axis Rotation axis, recommended to be normalized.\n\t/// @tparam T Value type used to build the matrix. Supported: half, float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z) \n\t/// @see - rotate(T angle, vec<3, T, Q> const& v) \n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRotate.xml\">glRotate man page</a> \n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> rotate(\n\t\tmat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& axis);\n\n\t/// Builds a scale 4 * 4 matrix created from 3 scalars. \n\t/// \n\t/// @param m Input matrix multiplied by this scale matrix.\n\t/// @param v Ratio of scaling for each axis.\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommended), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - scale(mat<4, 4, T, Q> const& m, T x, T y, T z)\n\t/// @see - scale(vec<3, T, Q> const& v)\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glScale.xml\">glScale man page</a> \n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> scale(\n\t\tmat<4, 4, T, Q> const& m, vec<3, T, Q> const& v);\n\n\t/// Creates a matrix for projecting two-dimensional coordinates onto the screen.\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top, T const& zNear, T const& zFar)\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluOrtho2D.xml\">gluOrtho2D man page</a> \n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> ortho(\n\t\tT left, T right, T bottom, T top);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH_ZO(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume using right-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH_NO(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH_ZO(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume, using right-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH_NO(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> orthoZO(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> orthoNO(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume, using left-handed coordinates.\n\t/// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> orthoLH(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume, using right-handed coordinates.\n\t/// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> orthoRH(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a matrix for an orthographic parallel viewing volume, using the default handedness and default near and far clip planes definition.\n\t/// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE.\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see - glm::ortho(T const& left, T const& right, T const& bottom, T const& top)\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml\">glOrtho man page</a> \n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> ortho(\n\t\tT left, T right, T bottom, T top, T zNear, T zFar);\n\n\t/// Creates a left handed frustum matrix.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH_ZO(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\t/// Creates a left handed frustum matrix.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH_NO(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\t/// Creates a right handed frustum matrix.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH_ZO(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\t/// Creates a right handed frustum matrix.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH_NO(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\t/// Creates a frustum matrix using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustumZO(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\t/// Creates a frustum matrix using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustumNO(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\t/// Creates a left handed frustum matrix.\n\t/// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustumLH(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\t/// Creates a right handed frustum matrix.\n\t/// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustumRH(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\t/// Creates a frustum matrix with default handedness, using the default handedness and default near and far clip planes definition.\n\t/// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE.\n\t///\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFrustum.xml\">glFrustum man page</a> \n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> frustum(\n\t\tT left, T right, T bottom, T top, T near, T far);\n\n\n\t/// Creates a matrix for a right handed, symetric perspective-view frustum.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH_ZO(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Creates a matrix for a right handed, symetric perspective-view frustum.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH_NO(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Creates a matrix for a left handed, symetric perspective-view frustum.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH_ZO(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Creates a matrix for a left handed, symetric perspective-view frustum.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH_NO(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Creates a matrix for a symetric perspective-view frustum using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveZO(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Creates a matrix for a symetric perspective-view frustum using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveNO(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Creates a matrix for a right handed, symetric perspective-view frustum.\n\t/// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveRH(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Creates a matrix for a left handed, symetric perspective-view frustum.\n\t/// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveLH(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Creates a matrix for a symetric perspective-view frustum based on the default handedness and default near and far clip planes definition.\n\t/// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE.\n\t/// \n\t/// @param fovy Specifies the field of view angle in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPerspective.xml\">gluPerspective man page</a> \n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspective(\n\t\tT fovy, T aspect, T near, T far);\n\n\t/// Builds a perspective projection matrix based on a field of view using right-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH_ZO(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Builds a perspective projection matrix based on a field of view using right-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH_NO(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Builds a perspective projection matrix based on a field of view using left-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH_ZO(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Builds a perspective projection matrix based on a field of view using left-handed coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH_NO(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Builds a perspective projection matrix based on a field of view using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovZO(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Builds a perspective projection matrix based on a field of view using left-handed coordinates if GLM_FORCE_LEFT_HANDED if defined or right-handed coordinates otherwise.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovNO(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Builds a right handed perspective projection matrix based on a field of view.\n\t/// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovRH(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Builds a left handed perspective projection matrix based on a field of view.\n\t/// If GLM_FORCE_DEPTH_ZERO_TO_ONE is defined, the near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// Otherwise, the near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFovLH(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Builds a perspective projection matrix based on a field of view and the default handedness and default near and far clip planes definition.\n\t/// To change default handedness use GLM_FORCE_LEFT_HANDED. To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE.\n\t/// \n\t/// @param fov Expressed in radians.\n\t/// @param width Width of the viewport\n\t/// @param height Height of the viewport\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param far Specifies the distance from the viewer to the far clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> perspectiveFov(\n\t\tT fov, T width, T height, T near, T far);\n\n\t/// Creates a matrix for a left handed, symmetric perspective-view frustum with far plane at infinite.\n\t///\n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspectiveLH(\n\t\tT fovy, T aspect, T near);\n\n\t/// Creates a matrix for a right handed, symmetric perspective-view frustum with far plane at infinite.\n\t///\n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspectiveRH(\n\t\tT fovy, T aspect, T near);\n\n\t/// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite with default handedness.\n\t///\n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> infinitePerspective(\n\t\tT fovy, T aspect, T near);\n\n\t/// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping.\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> tweakedInfinitePerspective(\n\t\tT fovy, T aspect, T near);\n\n\t/// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping.\n\t/// \n\t/// @param fovy Specifies the field of view angle, in degrees, in the y direction. Expressed in radians.\n\t/// @param aspect Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).\n\t/// @param near Specifies the distance from the viewer to the near clipping plane (always positive).\n\t/// @param ep Epsilon\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// @see gtc_matrix_transform\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> tweakedInfinitePerspective(\n\t\tT fovy, T aspect, T near, T ep);\n\n\t/// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t/// \n\t/// @param obj Specify the object coordinates.\n\t/// @param model Specifies the current modelview matrix\n\t/// @param proj Specifies the current projection matrix\n\t/// @param viewport Specifies the current viewport\n\t/// @return Return the computed window coordinates.\n\t/// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double.\n\t/// @tparam U Currently supported: Floating-point types and integer types.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml\">gluProject man page</a> \n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> projectZO(\n\t\tvec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport);\n\n\t/// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t/// \n\t/// @param obj Specify the object coordinates.\n\t/// @param model Specifies the current modelview matrix\n\t/// @param proj Specifies the current projection matrix\n\t/// @param viewport Specifies the current viewport\n\t/// @return Return the computed window coordinates.\n\t/// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double.\n\t/// @tparam U Currently supported: Floating-point types and integer types.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml\">gluProject man page</a> \n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> projectNO(\n\t\tvec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport);\n\n\t/// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates using default near and far clip planes definition.\n\t/// To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE.\n\t/// \n\t/// @param obj Specify the object coordinates.\n\t/// @param model Specifies the current modelview matrix\n\t/// @param proj Specifies the current projection matrix\n\t/// @param viewport Specifies the current viewport\n\t/// @return Return the computed window coordinates.\n\t/// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double.\n\t/// @tparam U Currently supported: Floating-point types and integer types.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluProject.xml\">gluProject man page</a> \n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> project(\n\t\tvec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport);\n\n\t/// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of 0 and +1 respectively. (Direct3D clip volume definition)\n\t///\n\t/// @param win Specify the window coordinates to be mapped.\n\t/// @param model Specifies the modelview matrix\n\t/// @param proj Specifies the projection matrix\n\t/// @param viewport Specifies the viewport\n\t/// @return Returns the computed object coordinates.\n\t/// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double.\n\t/// @tparam U Currently supported: Floating-point types and integer types.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml\">gluUnProject man page</a> \n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> unProjectZO(\n\t\tvec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport);\n\n\t/// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates.\n\t/// The near and far clip planes correspond to z normalized device coordinates of -1 and +1 respectively. (OpenGL clip volume definition)\n\t///\n\t/// @param win Specify the window coordinates to be mapped.\n\t/// @param model Specifies the modelview matrix\n\t/// @param proj Specifies the projection matrix\n\t/// @param viewport Specifies the viewport\n\t/// @return Returns the computed object coordinates.\n\t/// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double.\n\t/// @tparam U Currently supported: Floating-point types and integer types.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml\">gluUnProject man page</a> \n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> unProjectNO(\n\t\tvec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport);\n\n\t/// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates using default near and far clip planes definition.\n\t/// To change default near and far clip planes definition use GLM_FORCE_DEPTH_ZERO_TO_ONE.\n\t///\n\t/// @param win Specify the window coordinates to be mapped.\n\t/// @param model Specifies the modelview matrix\n\t/// @param proj Specifies the projection matrix\n\t/// @param viewport Specifies the viewport\n\t/// @return Returns the computed object coordinates.\n\t/// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double.\n\t/// @tparam U Currently supported: Floating-point types and integer types.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml\">gluUnProject man page</a> \n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> unProject(\n\t\tvec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport);\n\n\t/// Define a picking region\n\t///\n\t/// @param center Specify the center of a picking region in window coordinates.\n\t/// @param delta Specify the width and height, respectively, of the picking region in window coordinates.\n\t/// @param viewport Rendering viewport\n\t/// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double.\n\t/// @tparam U Currently supported: Floating-point types and integer types.\n\t/// @see gtc_matrix_transform\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPickMatrix.xml\">gluPickMatrix man page</a> \n\ttemplate<typename T, qualifier Q, typename U>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> pickMatrix(\n\t\tvec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport);\n\n\t/// Build a right handed look at view matrix.\n\t///\n\t/// @param eye Position of the camera\n\t/// @param center Position where the camera is looking at\n\t/// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1)\n\t/// @see gtc_matrix_transform\n\t/// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal)\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> lookAtRH(\n\t\tvec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up);\n\n\t/// Build a left handed look at view matrix.\n\t///\n\t/// @param eye Position of the camera\n\t/// @param center Position where the camera is looking at\n\t/// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1)\n\t/// @see gtc_matrix_transform\n\t/// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal)\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> lookAtLH(\n\t\tvec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up);\n\n\t/// Build a look at view matrix based on the default handedness.\n\t///\n\t/// @param eye Position of the camera\n\t/// @param center Position where the camera is looking at\n\t/// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1)\n\t/// @see gtc_matrix_transform\n\t/// @see - frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal) frustum(T const& left, T const& right, T const& bottom, T const& top, T const& nearVal, T const& farVal)\n\t/// @see <a href=\"https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml\">gluLookAt man page</a> \n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> lookAt(\n\t\tvec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_transform.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/matrix_transform.inl",
    "content": "/// @ref gtc_matrix_transform\n/// @file glm/gtc/matrix_transform.inl\n\n#include \"../geometric.hpp\"\n#include \"../trigonometric.hpp\"\n#include \"../matrix.hpp\"\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)\n\t{\n\t\tmat<4, 4, T, Q> Result(m);\n\t\tResult[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];\n\t\treturn Result;\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v)\n\t{\n\t\tT const a = angle;\n\t\tT const c = cos(a);\n\t\tT const s = sin(a);\n\n\t\tvec<3, T, Q> axis(normalize(v));\n\t\tvec<3, T, Q> temp((T(1) - c) * axis);\n\n\t\tmat<4, 4, T, Q> Rotate;\n\t\tRotate[0][0] = c + temp[0] * axis[0];\n\t\tRotate[0][1] = temp[0] * axis[1] + s * axis[2];\n\t\tRotate[0][2] = temp[0] * axis[2] - s * axis[1];\n\n\t\tRotate[1][0] = temp[1] * axis[0] - s * axis[2];\n\t\tRotate[1][1] = c + temp[1] * axis[1];\n\t\tRotate[1][2] = temp[1] * axis[2] + s * axis[0];\n\n\t\tRotate[2][0] = temp[2] * axis[0] + s * axis[1];\n\t\tRotate[2][1] = temp[2] * axis[1] - s * axis[0];\n\t\tRotate[2][2] = c + temp[2] * axis[2];\n\n\t\tmat<4, 4, T, Q> Result;\n\t\tResult[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];\n\t\tResult[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];\n\t\tResult[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];\n\t\tResult[3] = m[3];\n\t\treturn Result;\n\t}\n\t\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate_slow(mat<4, 4, T, Q> const& m, T angle, vec<3, T, Q> const& v)\n\t{\n\t\tT const a = angle;\n\t\tT const c = cos(a);\n\t\tT const s = sin(a);\n\t\tmat<4, 4, T, Q> Result;\n\n\t\tvec<3, T, Q> axis = normalize(v);\n\n\t\tResult[0][0] = c + (static_cast<T>(1) - c)      * axis.x     * axis.x;\n\t\tResult[0][1] = (static_cast<T>(1) - c) * axis.x * axis.y + s * axis.z;\n\t\tResult[0][2] = (static_cast<T>(1) - c) * axis.x * axis.z - s * axis.y;\n\t\tResult[0][3] = static_cast<T>(0);\n\n\t\tResult[1][0] = (static_cast<T>(1) - c) * axis.y * axis.x - s * axis.z;\n\t\tResult[1][1] = c + (static_cast<T>(1) - c) * axis.y * axis.y;\n\t\tResult[1][2] = (static_cast<T>(1) - c) * axis.y * axis.z + s * axis.x;\n\t\tResult[1][3] = static_cast<T>(0);\n\n\t\tResult[2][0] = (static_cast<T>(1) - c) * axis.z * axis.x + s * axis.y;\n\t\tResult[2][1] = (static_cast<T>(1) - c) * axis.z * axis.y - s * axis.x;\n\t\tResult[2][2] = c + (static_cast<T>(1) - c) * axis.z * axis.z;\n\t\tResult[2][3] = static_cast<T>(0);\n\n\t\tResult[3] = vec<4, T, Q>(0, 0, 0, 1);\n\t\treturn m * Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)\n\t{\n\t\tmat<4, 4, T, Q> Result;\n\t\tResult[0] = m[0] * v[0];\n\t\tResult[1] = m[1] * v[1];\n\t\tResult[2] = m[2] * v[2];\n\t\tResult[3] = m[3];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale_slow(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)\n\t{\n\t\tmat<4, 4, T, Q> Result(T(1));\n\t\tResult[0][0] = v.x;\n\t\tResult[1][1] = v.y;\n\t\tResult[2][2] = v.z;\n\t\treturn m * Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(1));\n\t\tResult[0][0] = static_cast<T>(2) / (right - left);\n\t\tResult[1][1] = static_cast<T>(2) / (top - bottom);\n\t\tResult[3][0] = - (right + left) / (right - left);\n\t\tResult[3][1] = - (top + bottom) / (top - bottom);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH_ZO(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(1);\n\t\tResult[0][0] = static_cast<T>(2) / (right - left);\n\t\tResult[1][1] = static_cast<T>(2) / (top - bottom);\n\t\tResult[2][2] = static_cast<T>(1) / (zFar - zNear);\n\t\tResult[3][0] = - (right + left) / (right - left);\n\t\tResult[3][1] = - (top + bottom) / (top - bottom);\n\t\tResult[3][2] = - zNear / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH_NO(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(1);\n\t\tResult[0][0] = static_cast<T>(2) / (right - left);\n\t\tResult[1][1] = static_cast<T>(2) / (top - bottom);\n\t\tResult[2][2] = static_cast<T>(2) / (zFar - zNear);\n\t\tResult[3][0] = - (right + left) / (right - left);\n\t\tResult[3][1] = - (top + bottom) / (top - bottom);\n\t\tResult[3][2] = - (zFar + zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH_ZO(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(1);\n\t\tResult[0][0] = static_cast<T>(2) / (right - left);\n\t\tResult[1][1] = static_cast<T>(2) / (top - bottom);\n\t\tResult[2][2] = - static_cast<T>(1) / (zFar - zNear);\n\t\tResult[3][0] = - (right + left) / (right - left);\n\t\tResult[3][1] = - (top + bottom) / (top - bottom);\n\t\tResult[3][2] = - zNear / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH_NO(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(1);\n\t\tResult[0][0] = static_cast<T>(2) / (right - left);\n\t\tResult[1][1] = static_cast<T>(2) / (top - bottom);\n\t\tResult[2][2] = - static_cast<T>(2) / (zFar - zNear);\n\t\tResult[3][0] = - (right + left) / (right - left);\n\t\tResult[3][1] = - (top + bottom) / (top - bottom);\n\t\tResult[3][2] = - (zFar + zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoZO(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn orthoLH_ZO(left, right, bottom, top, zNear, zFar);\n#\t\telse\n\t\t\treturn orthoRH_ZO(left, right, bottom, top, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoNO(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn orthoLH_NO(left, right, bottom, top, zNear, zFar);\n#\t\telse\n\t\t\treturn orthoRH_NO(left, right, bottom, top, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoLH(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn orthoLH_ZO(left, right, bottom, top, zNear, zFar);\n#\t\telse\n\t\t\treturn orthoLH_NO(left, right, bottom, top, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> orthoRH(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn orthoRH_ZO(left, right, bottom, top, zNear, zFar);\n#\t\telse\n\t\t\treturn orthoRH_NO(left, right, bottom, top, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn orthoLH_ZO(left, right, bottom, top, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n\t\t\treturn orthoLH_NO(left, right, bottom, top, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn orthoRH_ZO(left, right, bottom, top, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n\t\t\treturn orthoRH_NO(left, right, bottom, top, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH_ZO(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(0);\n\t\tResult[0][0] = (static_cast<T>(2) * nearVal) / (right - left);\n\t\tResult[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom);\n\t\tResult[2][0] = (right + left) / (right - left);\n\t\tResult[2][1] = (top + bottom) / (top - bottom);\n\t\tResult[2][2] = farVal / (farVal - nearVal);\n\t\tResult[2][3] = static_cast<T>(1);\n\t\tResult[3][2] = -(farVal * nearVal) / (farVal - nearVal);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH_NO(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(0);\n\t\tResult[0][0] = (static_cast<T>(2) * nearVal) / (right - left);\n\t\tResult[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom);\n\t\tResult[2][0] = (right + left) / (right - left);\n\t\tResult[2][1] = (top + bottom) / (top - bottom);\n\t\tResult[2][2] = (farVal + nearVal) / (farVal - nearVal);\n\t\tResult[2][3] = static_cast<T>(1);\n\t\tResult[3][2] = - (static_cast<T>(2) * farVal * nearVal) / (farVal - nearVal);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH_ZO(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(0);\n\t\tResult[0][0] = (static_cast<T>(2) * nearVal) / (right - left);\n\t\tResult[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom);\n\t\tResult[2][0] = (right + left) / (right - left);\n\t\tResult[2][1] = (top + bottom) / (top - bottom);\n\t\tResult[2][2] = farVal / (nearVal - farVal);\n\t\tResult[2][3] = static_cast<T>(-1);\n\t\tResult[3][2] = -(farVal * nearVal) / (farVal - nearVal);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH_NO(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n\t\tmat<4, 4, T, defaultp> Result(0);\n\t\tResult[0][0] = (static_cast<T>(2) * nearVal) / (right - left);\n\t\tResult[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom);\n\t\tResult[2][0] = (right + left) / (right - left);\n\t\tResult[2][1] = (top + bottom) / (top - bottom);\n\t\tResult[2][2] = - (farVal + nearVal) / (farVal - nearVal);\n\t\tResult[2][3] = static_cast<T>(-1);\n\t\tResult[3][2] = - (static_cast<T>(2) * farVal * nearVal) / (farVal - nearVal);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumZO(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn frustumLH_ZO(left, right, bottom, top, nearVal, farVal);\n#\t\telse\n\t\t\treturn frustumRH_ZO(left, right, bottom, top, nearVal, farVal);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumNO(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn frustumLH_NO(left, right, bottom, top, nearVal, farVal);\n#\t\telse\n\t\t\treturn frustumRH_NO(left, right, bottom, top, nearVal, farVal);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumLH(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn frustumLH_ZO(left, right, bottom, top, nearVal, farVal);\n#\t\telse\n\t\t\treturn frustumLH_NO(left, right, bottom, top, nearVal, farVal);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustumRH(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn frustumRH_ZO(left, right, bottom, top, nearVal, farVal);\n#\t\telse\n\t\t\treturn frustumRH_NO(left, right, bottom, top, nearVal, farVal);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> frustum(T left, T right, T bottom, T top, T nearVal, T farVal)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn frustumLH_ZO(left, right, bottom, top, nearVal, farVal);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n\t\t\treturn frustumLH_NO(left, right, bottom, top, nearVal, farVal);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn frustumRH_ZO(left, right, bottom, top, nearVal, farVal);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n\t\t\treturn frustumRH_NO(left, right, bottom, top, nearVal, farVal);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH_ZO(T fovy, T aspect, T zNear, T zFar)\n\t{\n\t\tassert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0));\n\n\t\tT const tanHalfFovy = tan(fovy / static_cast<T>(2));\n\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy);\n\t\tResult[1][1] = static_cast<T>(1) / (tanHalfFovy);\n\t\tResult[2][2] = zFar / (zNear - zFar);\n\t\tResult[2][3] = - static_cast<T>(1);\n\t\tResult[3][2] = -(zFar * zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH_NO(T fovy, T aspect, T zNear, T zFar)\n\t{\n\t\tassert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0));\n\n\t\tT const tanHalfFovy = tan(fovy / static_cast<T>(2));\n\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy);\n\t\tResult[1][1] = static_cast<T>(1) / (tanHalfFovy);\n\t\tResult[2][2] = - (zFar + zNear) / (zFar - zNear);\n\t\tResult[2][3] = - static_cast<T>(1);\n\t\tResult[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH_ZO(T fovy, T aspect, T zNear, T zFar)\n\t{\n\t\tassert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0));\n\n\t\tT const tanHalfFovy = tan(fovy / static_cast<T>(2));\n\t\t\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy);\n\t\tResult[1][1] = static_cast<T>(1) / (tanHalfFovy);\n\t\tResult[2][2] = zFar / (zFar - zNear);\n\t\tResult[2][3] = static_cast<T>(1);\n\t\tResult[3][2] = -(zFar * zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH_NO(T fovy, T aspect, T zNear, T zFar)\n\t{\n\t\tassert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0));\n\n\t\tT const tanHalfFovy = tan(fovy / static_cast<T>(2));\n\t\t\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy);\n\t\tResult[1][1] = static_cast<T>(1) / (tanHalfFovy);\n\t\tResult[2][2] = (zFar + zNear) / (zFar - zNear);\n\t\tResult[2][3] = static_cast<T>(1);\n\t\tResult[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveZO(T fovy, T aspect, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn perspectiveLH_ZO(fovy, aspect, zNear, zFar);\n#\t\telse\n\t\t\treturn perspectiveRH_ZO(fovy, aspect, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveNO(T fovy, T aspect, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn perspectiveLH_NO(fovy, aspect, zNear, zFar);\n#\t\telse\n\t\t\treturn perspectiveRH_NO(fovy, aspect, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveLH(T fovy, T aspect, T zNear, T zFar)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn perspectiveLH_ZO(fovy, aspect, zNear, zFar);\n#\t\telse\n\t\t\treturn perspectiveLH_NO(fovy, aspect, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveRH(T fovy, T aspect, T zNear, T zFar)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn perspectiveRH_ZO(fovy, aspect, zNear, zFar);\n#\t\telse\n\t\t\treturn perspectiveRH_NO(fovy, aspect, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspective(T fovy, T aspect, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn perspectiveLH_ZO(fovy, aspect, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n\t\t\treturn perspectiveLH_NO(fovy, aspect, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn perspectiveRH_ZO(fovy, aspect, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n\t\t\treturn perspectiveRH_NO(fovy, aspect, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH_ZO(T fov, T width, T height, T zNear, T zFar)\n\t{\n\t\tassert(width > static_cast<T>(0));\n\t\tassert(height > static_cast<T>(0));\n\t\tassert(fov > static_cast<T>(0));\n\t\n\t\tT const rad = fov;\n\t\tT const h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad);\n\t\tT const w = h * height / width; ///todo max(width , Height) / min(width , Height)?\n\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = w;\n\t\tResult[1][1] = h;\n\t\tResult[2][2] = zFar / (zNear - zFar);\n\t\tResult[2][3] = - static_cast<T>(1);\n\t\tResult[3][2] = -(zFar * zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH_NO(T fov, T width, T height, T zNear, T zFar)\n\t{\n\t\tassert(width > static_cast<T>(0));\n\t\tassert(height > static_cast<T>(0));\n\t\tassert(fov > static_cast<T>(0));\n\t\n\t\tT const rad = fov;\n\t\tT const h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad);\n\t\tT const w = h * height / width; ///todo max(width , Height) / min(width , Height)?\n\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = w;\n\t\tResult[1][1] = h;\n\t\tResult[2][2] = - (zFar + zNear) / (zFar - zNear);\n\t\tResult[2][3] = - static_cast<T>(1);\n\t\tResult[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH_ZO(T fov, T width, T height, T zNear, T zFar)\n\t{\n\t\tassert(width > static_cast<T>(0));\n\t\tassert(height > static_cast<T>(0));\n\t\tassert(fov > static_cast<T>(0));\n\t\n\t\tT const rad = fov;\n\t\tT const h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad);\n\t\tT const w = h * height / width; ///todo max(width , Height) / min(width , Height)?\n\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = w;\n\t\tResult[1][1] = h;\n\t\tResult[2][2] = zFar / (zFar - zNear);\n\t\tResult[2][3] = static_cast<T>(1);\n\t\tResult[3][2] = -(zFar * zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH_NO(T fov, T width, T height, T zNear, T zFar)\n\t{\n\t\tassert(width > static_cast<T>(0));\n\t\tassert(height > static_cast<T>(0));\n\t\tassert(fov > static_cast<T>(0));\n\t\n\t\tT const rad = fov;\n\t\tT const h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad);\n\t\tT const w = h * height / width; ///todo max(width , Height) / min(width , Height)?\n\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = w;\n\t\tResult[1][1] = h;\n\t\tResult[2][2] = (zFar + zNear) / (zFar - zNear);\n\t\tResult[2][3] = static_cast<T>(1);\n\t\tResult[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovZO(T fov, T width, T height, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn perspectiveFovLH_ZO(fov, width, height, zNear, zFar);\n#\t\telse\n\t\t\treturn perspectiveFovRH_ZO(fov, width, height, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovNO(T fov, T width, T height, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn perspectiveFovLH_NO(fov, width, height, zNear, zFar);\n#\t\telse\n\t\t\treturn perspectiveFovRH_NO(fov, width, height, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovLH(T fov, T width, T height, T zNear, T zFar)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn perspectiveFovLH_ZO(fov, width, height, zNear, zFar);\n#\t\telse\n\t\t\treturn perspectiveFovLH_NO(fov, width, height, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFovRH(T fov, T width, T height, T zNear, T zFar)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn perspectiveFovRH_ZO(fov, width, height, zNear, zFar);\n#\t\telse\n\t\t\treturn perspectiveFovRH_NO(fov, width, height, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> perspectiveFov(T fov, T width, T height, T zNear, T zFar)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn perspectiveFovLH_ZO(fov, width, height, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n\t\t\treturn perspectiveFovLH_NO(fov, width, height, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn perspectiveFovRH_ZO(fov, width, height, zNear, zFar);\n#\t\telif GLM_COORDINATE_SYSTEM == GLM_RIGHT_HANDED && GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_NEGATIVE_ONE_TO_ONE\n\t\t\treturn perspectiveFovRH_NO(fov, width, height, zNear, zFar);\n#\t\tendif\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspectiveRH(T fovy, T aspect, T zNear)\n\t{\n\t\tT const range = tan(fovy / static_cast<T>(2)) * zNear;\n\t\tT const left = -range * aspect;\n\t\tT const right = range * aspect;\n\t\tT const bottom = -range;\n\t\tT const top = range;\n\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = (static_cast<T>(2) * zNear) / (right - left);\n\t\tResult[1][1] = (static_cast<T>(2) * zNear) / (top - bottom);\n\t\tResult[2][2] = - static_cast<T>(1);\n\t\tResult[2][3] = - static_cast<T>(1);\n\t\tResult[3][2] = - static_cast<T>(2) * zNear;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspectiveLH(T fovy, T aspect, T zNear)\n\t{\n\t\tT const range = tan(fovy / static_cast<T>(2)) * zNear;\n\t\tT const left = -range * aspect;\n\t\tT const right = range * aspect;\n\t\tT const bottom = -range;\n\t\tT const top = range;\n\n\t\tmat<4, 4, T, defaultp> Result(T(0));\n\t\tResult[0][0] = (static_cast<T>(2) * zNear) / (right - left);\n\t\tResult[1][1] = (static_cast<T>(2) * zNear) / (top - bottom);\n\t\tResult[2][2] = static_cast<T>(1);\n\t\tResult[2][3] = static_cast<T>(1);\n\t\tResult[3][2] = - static_cast<T>(2) * zNear;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> infinitePerspective(T fovy, T aspect, T zNear)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn infinitePerspectiveLH(fovy, aspect, zNear);\n#\t\telse\n\t\t\treturn infinitePerspectiveRH(fovy, aspect, zNear);\n#\t\tendif\n\t}\n\n\t// Infinite projection matrix: http://www.terathon.com/gdc07_lengyel.pdf\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear, T ep)\n\t{\n\t\tT const range = tan(fovy / static_cast<T>(2)) * zNear;\t\n\t\tT const left = -range * aspect;\n\t\tT const right = range * aspect;\n\t\tT const bottom = -range;\n\t\tT const top = range;\n\n\t\tmat<4, 4, T, defaultp> Result(static_cast<T>(0));\n\t\tResult[0][0] = (static_cast<T>(2) * zNear) / (right - left);\n\t\tResult[1][1] = (static_cast<T>(2) * zNear) / (top - bottom);\n\t\tResult[2][2] = ep - static_cast<T>(1);\n\t\tResult[2][3] = static_cast<T>(-1);\n\t\tResult[3][2] = (ep - static_cast<T>(2)) * zNear;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear)\n\t{\n\t\treturn tweakedInfinitePerspective(fovy, aspect, zNear, epsilon<T>());\n\t}\n\n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> projectZO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)\n\t{\n\t\tvec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast<T>(1));\n\t\ttmp = model * tmp;\n\t\ttmp = proj * tmp;\n\n\t\ttmp /= tmp.w;\n\t\ttmp.x = tmp.x * static_cast<T>(0.5) + static_cast<T>(0.5);\n\t\ttmp.y = tmp.y * static_cast<T>(0.5) + static_cast<T>(0.5);\n\n\t\ttmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);\n\t\ttmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);\n\n\t\treturn vec<3, T, Q>(tmp);\n\t}\n\n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> projectNO(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)\n\t{\n\t\tvec<4, T, Q> tmp = vec<4, T, Q>(obj, static_cast<T>(1));\n\t\ttmp = model * tmp;\n\t\ttmp = proj * tmp;\n\n\t\ttmp /= tmp.w;\n\t\ttmp = tmp * static_cast<T>(0.5) + static_cast<T>(0.5);\n\t\ttmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);\n\t\ttmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);\n\n\t\treturn vec<3, T, Q>(tmp);\n\t}\n\n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> project(vec<3, T, Q> const& obj, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn projectZO(obj, model, proj, viewport);\n#\t\telse\n\t\t\treturn projectNO(obj, model, proj, viewport);\n#\t\tendif\n\t}\n\n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> unProjectZO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)\n\t{\n\t\tmat<4, 4, T, Q> Inverse = inverse(proj * model);\n\n\t\tvec<4, T, Q> tmp = vec<4, T, Q>(win, T(1));\n\t\ttmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);\n\t\ttmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);\n\t\ttmp.x = tmp.x * static_cast<T>(2) - static_cast<T>(1);\n\t\ttmp.y = tmp.y * static_cast<T>(2) - static_cast<T>(1);\n\n\t\tvec<4, T, Q> obj = Inverse * tmp;\n\t\tobj /= obj.w;\n\n\t\treturn vec<3, T, Q>(obj);\n\t}\n\n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> unProjectNO(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)\n\t{\n\t\tmat<4, 4, T, Q> Inverse = inverse(proj * model);\n\n\t\tvec<4, T, Q> tmp = vec<4, T, Q>(win, T(1));\n\t\ttmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);\n\t\ttmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);\n\t\ttmp = tmp * static_cast<T>(2) - static_cast<T>(1);\n\n\t\tvec<4, T, Q> obj = Inverse * tmp;\n\t\tobj /= obj.w;\n\n\t\treturn vec<3, T, Q>(obj);\n\t}\n\n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> unProject(vec<3, T, Q> const& win, mat<4, 4, T, Q> const& model, mat<4, 4, T, Q> const& proj, vec<4, U, Q> const& viewport)\n\t{\n#\t\tif GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE\n\t\t\treturn unProjectZO(win, model, proj, viewport);\n#\t\telse\n\t\t\treturn unProjectNO(win, model, proj, viewport);\n#\t\tendif\n\t}\n\n\ttemplate<typename T, qualifier Q, typename U>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> pickMatrix(vec<2, T, Q> const& center, vec<2, T, Q> const& delta, vec<4, U, Q> const& viewport)\n\t{\n\t\tassert(delta.x > static_cast<T>(0) && delta.y > static_cast<T>(0));\n\t\tmat<4, 4, T, Q> Result(static_cast<T>(1));\n\n\t\tif(!(delta.x > static_cast<T>(0) && delta.y > static_cast<T>(0)))\n\t\t\treturn Result; // Error\n\n\t\tvec<3, T, Q> Temp(\n\t\t\t(static_cast<T>(viewport[2]) - static_cast<T>(2) * (center.x - static_cast<T>(viewport[0]))) / delta.x,\n\t\t\t(static_cast<T>(viewport[3]) - static_cast<T>(2) * (center.y - static_cast<T>(viewport[1]))) / delta.y,\n\t\t\tstatic_cast<T>(0));\n\n\t\t// Translate and scale the picked region to the entire window\n\t\tResult = translate(Result, Temp);\n\t\treturn scale(Result, vec<3, T, Q>(static_cast<T>(viewport[2]) / delta.x, static_cast<T>(viewport[3]) / delta.y, static_cast<T>(1)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtRH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up)\n\t{\n\t\tvec<3, T, Q> const f(normalize(center - eye));\n\t\tvec<3, T, Q> const s(normalize(cross(f, up)));\n\t\tvec<3, T, Q> const u(cross(s, f));\n\n\t\tmat<4, 4, T, Q> Result(1);\n\t\tResult[0][0] = s.x;\n\t\tResult[1][0] = s.y;\n\t\tResult[2][0] = s.z;\n\t\tResult[0][1] = u.x;\n\t\tResult[1][1] = u.y;\n\t\tResult[2][1] = u.z;\n\t\tResult[0][2] =-f.x;\n\t\tResult[1][2] =-f.y;\n\t\tResult[2][2] =-f.z;\n\t\tResult[3][0] =-dot(s, eye);\n\t\tResult[3][1] =-dot(u, eye);\n\t\tResult[3][2] = dot(f, eye);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtLH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up)\n\t{\n\t\tvec<3, T, Q> const f(normalize(center - eye));\n\t\tvec<3, T, Q> const s(normalize(cross(up, f)));\n\t\tvec<3, T, Q> const u(cross(f, s));\n\n\t\tmat<4, 4, T, Q> Result(1);\n\t\tResult[0][0] = s.x;\n\t\tResult[1][0] = s.y;\n\t\tResult[2][0] = s.z;\n\t\tResult[0][1] = u.x;\n\t\tResult[1][1] = u.y;\n\t\tResult[2][1] = u.z;\n\t\tResult[0][2] = f.x;\n\t\tResult[1][2] = f.y;\n\t\tResult[2][2] = f.z;\n\t\tResult[3][0] = -dot(s, eye);\n\t\tResult[3][1] = -dot(u, eye);\n\t\tResult[3][2] = -dot(f, eye);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAt(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn lookAtLH(eye, center, up);\n#\t\telse\n\t\t\treturn lookAtRH(eye, center, up);\n#\t\tendif\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/noise.hpp",
    "content": "/// @ref gtc_noise\n/// @file glm/gtc/noise.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_noise GLM_GTC_noise\n/// @ingroup gtc\n///\n/// Include <glm/gtc/noise.hpp> to use the features of this extension.\n///\n/// Defines 2D, 3D and 4D procedural noise functions \n/// Based on the work of Stefan Gustavson and Ashima Arts on \"webgl-noise\": \n/// https://github.com/ashima/webgl-noise \n/// Following Stefan Gustavson's paper \"Simplex noise demystified\": \n/// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n#include \"../detail/_noise.hpp\"\n#include \"../geometric.hpp\"\n#include \"../common.hpp\"\n#include \"../vector_relational.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_noise extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_noise\n\t/// @{\n\n\t/// Classic perlin noise.\n\t/// @see gtc_noise\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T perlin(\n\t\tvec<L, T, Q> const& p);\n\t\t\n\t/// Periodic perlin noise.\n\t/// @see gtc_noise\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T perlin(\n\t\tvec<L, T, Q> const& p,\n\t\tvec<L, T, Q> const& rep);\n\n\t/// Simplex noise.\n\t/// @see gtc_noise\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T simplex(\n\t\tvec<L, T, Q> const& p);\n\n\t/// @}\n}//namespace glm\n\n#include \"noise.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/noise.inl",
    "content": "/// @ref gtc_noise\n/// @file glm/gtc/noise.inl\n///\n// Based on the work of Stefan Gustavson and Ashima Arts on \"webgl-noise\": \n// https://github.com/ashima/webgl-noise \n// Following Stefan Gustavson's paper \"Simplex noise demystified\": \n// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n\nnamespace glm{\nnamespace gtc\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> grad4(T const& j, vec<4, T, Q> const& ip)\n\t{\n\t\tvec<3, T, Q> pXYZ = floor(fract(vec<3, T, Q>(j) * vec<3, T, Q>(ip)) * T(7)) * ip[2] - T(1);\n\t\tT pW = static_cast<T>(1.5) - dot(abs(pXYZ), vec<3, T, Q>(1));\n\t\tvec<4, T, Q> s = vec<4, T, Q>(lessThan(vec<4, T, Q>(pXYZ, pW), vec<4, T, Q>(0.0)));\n\t\tpXYZ = pXYZ + (vec<3, T, Q>(s) * T(2) - T(1)) * s.w; \n\t\treturn vec<4, T, Q>(pXYZ, pW);\n\t}\n}//namespace gtc\n\n\t// Classic Perlin noise\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T perlin(vec<2, T, Q> const& Position)\n\t{\n\t\tvec<4, T, Q> Pi = glm::floor(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) + vec<4, T, Q>(0.0, 0.0, 1.0, 1.0);\n\t\tvec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0);\n\t\tPi = mod(Pi, vec<4, T, Q>(289)); // To avoid truncation effects in permutation\n\t\tvec<4, T, Q> ix(Pi.x, Pi.z, Pi.x, Pi.z);\n\t\tvec<4, T, Q> iy(Pi.y, Pi.y, Pi.w, Pi.w);\n\t\tvec<4, T, Q> fx(Pf.x, Pf.z, Pf.x, Pf.z);\n\t\tvec<4, T, Q> fy(Pf.y, Pf.y, Pf.w, Pf.w);\n\n\t\tvec<4, T, Q> i = detail::permute(detail::permute(ix) + iy);\n\n\t\tvec<4, T, Q> gx = static_cast<T>(2) * glm::fract(i / T(41)) - T(1);\n\t\tvec<4, T, Q> gy = glm::abs(gx) - T(0.5);\n\t\tvec<4, T, Q> tx = glm::floor(gx + T(0.5));\n\t\tgx = gx - tx;\n\n\t\tvec<2, T, Q> g00(gx.x, gy.x);\n\t\tvec<2, T, Q> g10(gx.y, gy.y);\n\t\tvec<2, T, Q> g01(gx.z, gy.z);\n\t\tvec<2, T, Q> g11(gx.w, gy.w);\n\n\t\tvec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));\n\t\tg00 *= norm.x;\n\t\tg01 *= norm.y;\n\t\tg10 *= norm.z;\n\t\tg11 *= norm.w;\n\n\t\tT n00 = dot(g00, vec<2, T, Q>(fx.x, fy.x));\n\t\tT n10 = dot(g10, vec<2, T, Q>(fx.y, fy.y));\n\t\tT n01 = dot(g01, vec<2, T, Q>(fx.z, fy.z));\n\t\tT n11 = dot(g11, vec<2, T, Q>(fx.w, fy.w));\n\n\t\tvec<2, T, Q> fade_xy = detail::fade(vec<2, T, Q>(Pf.x, Pf.y));\n\t\tvec<2, T, Q> n_x = mix(vec<2, T, Q>(n00, n01), vec<2, T, Q>(n10, n11), fade_xy.x);\n\t\tT n_xy = mix(n_x.x, n_x.y, fade_xy.y);\n\t\treturn T(2.3) * n_xy;\n\t}\n\n\t// Classic Perlin noise\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& Position)\n\t{\n\t\tvec<3, T, Q> Pi0 = floor(Position); // Integer part for indexing\n\t\tvec<3, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1\n\t\tPi0 = detail::mod289(Pi0);\n\t\tPi1 = detail::mod289(Pi1);\n\t\tvec<3, T, Q> Pf0 = fract(Position); // Fractional part for interpolation\n\t\tvec<3, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0\n\t\tvec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n\t\tvec<4, T, Q> iy = vec<4, T, Q>(vec<2, T, Q>(Pi0.y), vec<2, T, Q>(Pi1.y));\n\t\tvec<4, T, Q> iz0(Pi0.z);\n\t\tvec<4, T, Q> iz1(Pi1.z);\n\n\t\tvec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy);\n\t\tvec<4, T, Q> ixy0 = detail::permute(ixy + iz0);\n\t\tvec<4, T, Q> ixy1 = detail::permute(ixy + iz1);\n\n\t\tvec<4, T, Q> gx0 = ixy0 * T(1.0 / 7.0);\n\t\tvec<4, T, Q> gy0 = fract(floor(gx0) * T(1.0 / 7.0)) - T(0.5);\n\t\tgx0 = fract(gx0);\n\t\tvec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0);\n\t\tvec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0.0));\n\t\tgx0 -= sz0 * (step(T(0), gx0) - T(0.5));\n\t\tgy0 -= sz0 * (step(T(0), gy0) - T(0.5));\n\n\t\tvec<4, T, Q> gx1 = ixy1 * T(1.0 / 7.0);\n\t\tvec<4, T, Q> gy1 = fract(floor(gx1) * T(1.0 / 7.0)) - T(0.5);\n\t\tgx1 = fract(gx1);\n\t\tvec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1);\n\t\tvec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(0.0));\n\t\tgx1 -= sz1 * (step(T(0), gx1) - T(0.5));\n\t\tgy1 -= sz1 * (step(T(0), gy1) - T(0.5));\n\n\t\tvec<3, T, Q> g000(gx0.x, gy0.x, gz0.x);\n\t\tvec<3, T, Q> g100(gx0.y, gy0.y, gz0.y);\n\t\tvec<3, T, Q> g010(gx0.z, gy0.z, gz0.z);\n\t\tvec<3, T, Q> g110(gx0.w, gy0.w, gz0.w);\n\t\tvec<3, T, Q> g001(gx1.x, gy1.x, gz1.x);\n\t\tvec<3, T, Q> g101(gx1.y, gy1.y, gz1.y);\n\t\tvec<3, T, Q> g011(gx1.z, gy1.z, gz1.z);\n\t\tvec<3, T, Q> g111(gx1.w, gy1.w, gz1.w);\n\n\t\tvec<4, T, Q> norm0 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n\t\tg000 *= norm0.x;\n\t\tg010 *= norm0.y;\n\t\tg100 *= norm0.z;\n\t\tg110 *= norm0.w;\n\t\tvec<4, T, Q> norm1 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n\t\tg001 *= norm1.x;\n\t\tg011 *= norm1.y;\n\t\tg101 *= norm1.z;\n\t\tg111 *= norm1.w;\n\n\t\tT n000 = dot(g000, Pf0);\n\t\tT n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z));\n\t\tT n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z));\n\t\tT n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z));\n\t\tT n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z));\n\t\tT n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z));\n\t\tT n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z));\n\t\tT n111 = dot(g111, Pf1);\n\n\t\tvec<3, T, Q> fade_xyz = detail::fade(Pf0);\n\t\tvec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z);\n\t\tvec<2, T, Q> n_yz = mix(vec<2, T, Q>(n_z.x, n_z.y), vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y);\n\t\tT n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); \n\t\treturn T(2.2) * n_xyz;\n\t}\n\t/*\n\t// Classic Perlin noise\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& P)\n\t{\n\t\tvec<3, T, Q> Pi0 = floor(P); // Integer part for indexing\n\t\tvec<3, T, Q> Pi1 = Pi0 + T(1); // Integer part + 1\n\t\tPi0 = mod(Pi0, T(289));\n\t\tPi1 = mod(Pi1, T(289));\n\t\tvec<3, T, Q> Pf0 = fract(P); // Fractional part for interpolation\n\t\tvec<3, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0\n\t\tvec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n\t\tvec<4, T, Q> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y);\n\t\tvec<4, T, Q> iz0(Pi0.z);\n\t\tvec<4, T, Q> iz1(Pi1.z);\n\n\t\tvec<4, T, Q> ixy = permute(permute(ix) + iy);\n\t\tvec<4, T, Q> ixy0 = permute(ixy + iz0);\n\t\tvec<4, T, Q> ixy1 = permute(ixy + iz1);\n\n\t\tvec<4, T, Q> gx0 = ixy0 / T(7);\n\t\tvec<4, T, Q> gy0 = fract(floor(gx0) / T(7)) - T(0.5);\n\t\tgx0 = fract(gx0);\n\t\tvec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0);\n\t\tvec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0.0));\n\t\tgx0 -= sz0 * (step(0.0, gx0) - T(0.5));\n\t\tgy0 -= sz0 * (step(0.0, gy0) - T(0.5));\n\n\t\tvec<4, T, Q> gx1 = ixy1 / T(7);\n\t\tvec<4, T, Q> gy1 = fract(floor(gx1) / T(7)) - T(0.5);\n\t\tgx1 = fract(gx1);\n\t\tvec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1);\n\t\tvec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(0.0));\n\t\tgx1 -= sz1 * (step(T(0), gx1) - T(0.5));\n\t\tgy1 -= sz1 * (step(T(0), gy1) - T(0.5));\n\n\t\tvec<3, T, Q> g000(gx0.x, gy0.x, gz0.x);\n\t\tvec<3, T, Q> g100(gx0.y, gy0.y, gz0.y);\n\t\tvec<3, T, Q> g010(gx0.z, gy0.z, gz0.z);\n\t\tvec<3, T, Q> g110(gx0.w, gy0.w, gz0.w);\n\t\tvec<3, T, Q> g001(gx1.x, gy1.x, gz1.x);\n\t\tvec<3, T, Q> g101(gx1.y, gy1.y, gz1.y);\n\t\tvec<3, T, Q> g011(gx1.z, gy1.z, gz1.z);\n\t\tvec<3, T, Q> g111(gx1.w, gy1.w, gz1.w);\n\n\t\tvec<4, T, Q> norm0 = taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n\t\tg000 *= norm0.x;\n\t\tg010 *= norm0.y;\n\t\tg100 *= norm0.z;\n\t\tg110 *= norm0.w;\n\t\tvec<4, T, Q> norm1 = taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n\t\tg001 *= norm1.x;\n\t\tg011 *= norm1.y;\n\t\tg101 *= norm1.z;\n\t\tg111 *= norm1.w;\n\n\t\tT n000 = dot(g000, Pf0);\n\t\tT n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z));\n\t\tT n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z));\n\t\tT n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z));\n\t\tT n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z));\n\t\tT n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z));\n\t\tT n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z));\n\t\tT n111 = dot(g111, Pf1);\n\n\t\tvec<3, T, Q> fade_xyz = fade(Pf0);\n\t\tvec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z);\n\t\tvec<2, T, Q> n_yz = mix(\n\t\t\tvec<2, T, Q>(n_z.x, n_z.y), \n\t\t\tvec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y);\n\t\tT n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); \n\t\treturn T(2.2) * n_xyz;\n\t}\n\t*/\n\t// Classic Perlin noise\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T perlin(vec<4, T, Q> const& Position)\n\t{\n\t\tvec<4, T, Q> Pi0 = floor(Position);\t// Integer part for indexing\n\t\tvec<4, T, Q> Pi1 = Pi0 + T(1);\t\t// Integer part + 1\n\t\tPi0 = mod(Pi0, vec<4, T, Q>(289));\n\t\tPi1 = mod(Pi1, vec<4, T, Q>(289));\n\t\tvec<4, T, Q> Pf0 = fract(Position);\t// Fractional part for interpolation\n\t\tvec<4, T, Q> Pf1 = Pf0 - T(1);\t\t// Fractional part - 1.0\n\t\tvec<4, T, Q> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n\t\tvec<4, T, Q> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y);\n\t\tvec<4, T, Q> iz0(Pi0.z);\n\t\tvec<4, T, Q> iz1(Pi1.z);\n\t\tvec<4, T, Q> iw0(Pi0.w);\n\t\tvec<4, T, Q> iw1(Pi1.w);\n\n\t\tvec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy);\n\t\tvec<4, T, Q> ixy0 = detail::permute(ixy + iz0);\n\t\tvec<4, T, Q> ixy1 = detail::permute(ixy + iz1);\n\t\tvec<4, T, Q> ixy00 = detail::permute(ixy0 + iw0);\n\t\tvec<4, T, Q> ixy01 = detail::permute(ixy0 + iw1);\n\t\tvec<4, T, Q> ixy10 = detail::permute(ixy1 + iw0);\n\t\tvec<4, T, Q> ixy11 = detail::permute(ixy1 + iw1);\n\n\t\tvec<4, T, Q> gx00 = ixy00 / T(7);\n\t\tvec<4, T, Q> gy00 = floor(gx00) / T(7);\n\t\tvec<4, T, Q> gz00 = floor(gy00) / T(6);\n\t\tgx00 = fract(gx00) - T(0.5);\n\t\tgy00 = fract(gy00) - T(0.5);\n\t\tgz00 = fract(gz00) - T(0.5);\n\t\tvec<4, T, Q> gw00 = vec<4, T, Q>(0.75) - abs(gx00) - abs(gy00) - abs(gz00);\n\t\tvec<4, T, Q> sw00 = step(gw00, vec<4, T, Q>(0.0));\n\t\tgx00 -= sw00 * (step(T(0), gx00) - T(0.5));\n\t\tgy00 -= sw00 * (step(T(0), gy00) - T(0.5));\n\n\t\tvec<4, T, Q> gx01 = ixy01 / T(7);\n\t\tvec<4, T, Q> gy01 = floor(gx01) / T(7);\n\t\tvec<4, T, Q> gz01 = floor(gy01) / T(6);\n\t\tgx01 = fract(gx01) - T(0.5);\n\t\tgy01 = fract(gy01) - T(0.5);\n\t\tgz01 = fract(gz01) - T(0.5);\n\t\tvec<4, T, Q> gw01 = vec<4, T, Q>(0.75) - abs(gx01) - abs(gy01) - abs(gz01);\n\t\tvec<4, T, Q> sw01 = step(gw01, vec<4, T, Q>(0.0));\n\t\tgx01 -= sw01 * (step(T(0), gx01) - T(0.5));\n\t\tgy01 -= sw01 * (step(T(0), gy01) - T(0.5));\n\n\t\tvec<4, T, Q> gx10 = ixy10 / T(7);\n\t\tvec<4, T, Q> gy10 = floor(gx10) / T(7);\n\t\tvec<4, T, Q> gz10 = floor(gy10) / T(6);\n\t\tgx10 = fract(gx10) - T(0.5);\n\t\tgy10 = fract(gy10) - T(0.5);\n\t\tgz10 = fract(gz10) - T(0.5);\n\t\tvec<4, T, Q> gw10 = vec<4, T, Q>(0.75) - abs(gx10) - abs(gy10) - abs(gz10);\n\t\tvec<4, T, Q> sw10 = step(gw10, vec<4, T, Q>(0));\n\t\tgx10 -= sw10 * (step(T(0), gx10) - T(0.5));\n\t\tgy10 -= sw10 * (step(T(0), gy10) - T(0.5));\n\n\t\tvec<4, T, Q> gx11 = ixy11 / T(7);\n\t\tvec<4, T, Q> gy11 = floor(gx11) / T(7);\n\t\tvec<4, T, Q> gz11 = floor(gy11) / T(6);\n\t\tgx11 = fract(gx11) - T(0.5);\n\t\tgy11 = fract(gy11) - T(0.5);\n\t\tgz11 = fract(gz11) - T(0.5);\n\t\tvec<4, T, Q> gw11 = vec<4, T, Q>(0.75) - abs(gx11) - abs(gy11) - abs(gz11);\n\t\tvec<4, T, Q> sw11 = step(gw11, vec<4, T, Q>(0.0));\n\t\tgx11 -= sw11 * (step(T(0), gx11) - T(0.5));\n\t\tgy11 -= sw11 * (step(T(0), gy11) - T(0.5));\n\n\t\tvec<4, T, Q> g0000(gx00.x, gy00.x, gz00.x, gw00.x);\n\t\tvec<4, T, Q> g1000(gx00.y, gy00.y, gz00.y, gw00.y);\n\t\tvec<4, T, Q> g0100(gx00.z, gy00.z, gz00.z, gw00.z);\n\t\tvec<4, T, Q> g1100(gx00.w, gy00.w, gz00.w, gw00.w);\n\t\tvec<4, T, Q> g0010(gx10.x, gy10.x, gz10.x, gw10.x);\n\t\tvec<4, T, Q> g1010(gx10.y, gy10.y, gz10.y, gw10.y);\n\t\tvec<4, T, Q> g0110(gx10.z, gy10.z, gz10.z, gw10.z);\n\t\tvec<4, T, Q> g1110(gx10.w, gy10.w, gz10.w, gw10.w);\n\t\tvec<4, T, Q> g0001(gx01.x, gy01.x, gz01.x, gw01.x);\n\t\tvec<4, T, Q> g1001(gx01.y, gy01.y, gz01.y, gw01.y);\n\t\tvec<4, T, Q> g0101(gx01.z, gy01.z, gz01.z, gw01.z);\n\t\tvec<4, T, Q> g1101(gx01.w, gy01.w, gz01.w, gw01.w);\n\t\tvec<4, T, Q> g0011(gx11.x, gy11.x, gz11.x, gw11.x);\n\t\tvec<4, T, Q> g1011(gx11.y, gy11.y, gz11.y, gw11.y);\n\t\tvec<4, T, Q> g0111(gx11.z, gy11.z, gz11.z, gw11.z);\n\t\tvec<4, T, Q> g1111(gx11.w, gy11.w, gz11.w, gw11.w);\n\n\t\tvec<4, T, Q> norm00 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100)));\n\t\tg0000 *= norm00.x;\n\t\tg0100 *= norm00.y;\n\t\tg1000 *= norm00.z;\n\t\tg1100 *= norm00.w;\n\n\t\tvec<4, T, Q> norm01 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101)));\n\t\tg0001 *= norm01.x;\n\t\tg0101 *= norm01.y;\n\t\tg1001 *= norm01.z;\n\t\tg1101 *= norm01.w;\n\n\t\tvec<4, T, Q> norm10 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110)));\n\t\tg0010 *= norm10.x;\n\t\tg0110 *= norm10.y;\n\t\tg1010 *= norm10.z;\n\t\tg1110 *= norm10.w;\n\n\t\tvec<4, T, Q> norm11 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111)));\n\t\tg0011 *= norm11.x;\n\t\tg0111 *= norm11.y;\n\t\tg1011 *= norm11.z;\n\t\tg1111 *= norm11.w;\n\n\t\tT n0000 = dot(g0000, Pf0);\n\t\tT n1000 = dot(g1000, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf0.w));\n\t\tT n0100 = dot(g0100, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf0.w));\n\t\tT n1100 = dot(g1100, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf0.w));\n\t\tT n0010 = dot(g0010, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf0.w));\n\t\tT n1010 = dot(g1010, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf0.w));\n\t\tT n0110 = dot(g0110, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf0.w));\n\t\tT n1110 = dot(g1110, vec<4, T, Q>(Pf1.x, Pf1.y, Pf1.z, Pf0.w));\n\t\tT n0001 = dot(g0001, vec<4, T, Q>(Pf0.x, Pf0.y, Pf0.z, Pf1.w));\n\t\tT n1001 = dot(g1001, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf1.w));\n\t\tT n0101 = dot(g0101, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf1.w));\n\t\tT n1101 = dot(g1101, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf1.w));\n\t\tT n0011 = dot(g0011, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf1.w));\n\t\tT n1011 = dot(g1011, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf1.w));\n\t\tT n0111 = dot(g0111, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf1.w));\n\t\tT n1111 = dot(g1111, Pf1);\n\n\t\tvec<4, T, Q> fade_xyzw = detail::fade(Pf0);\n\t\tvec<4, T, Q> n_0w = mix(vec<4, T, Q>(n0000, n1000, n0100, n1100), vec<4, T, Q>(n0001, n1001, n0101, n1101), fade_xyzw.w);\n\t\tvec<4, T, Q> n_1w = mix(vec<4, T, Q>(n0010, n1010, n0110, n1110), vec<4, T, Q>(n0011, n1011, n0111, n1111), fade_xyzw.w);\n\t\tvec<4, T, Q> n_zw = mix(n_0w, n_1w, fade_xyzw.z);\n\t\tvec<2, T, Q> n_yzw = mix(vec<2, T, Q>(n_zw.x, n_zw.y), vec<2, T, Q>(n_zw.z, n_zw.w), fade_xyzw.y);\n\t\tT n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);\n\t\treturn T(2.2) * n_xyzw;\n\t}\n\n\t// Classic Perlin noise, periodic variant\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T perlin(vec<2, T, Q> const& Position, vec<2, T, Q> const& rep)\n\t{\n\t\tvec<4, T, Q> Pi = floor(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) + vec<4, T, Q>(0.0, 0.0, 1.0, 1.0);\n\t\tvec<4, T, Q> Pf = fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0);\n\t\tPi = mod(Pi, vec<4, T, Q>(rep.x, rep.y, rep.x, rep.y)); // To create noise with explicit period\n\t\tPi = mod(Pi, vec<4, T, Q>(289)); // To avoid truncation effects in permutation\n\t\tvec<4, T, Q> ix(Pi.x, Pi.z, Pi.x, Pi.z);\n\t\tvec<4, T, Q> iy(Pi.y, Pi.y, Pi.w, Pi.w);\n\t\tvec<4, T, Q> fx(Pf.x, Pf.z, Pf.x, Pf.z);\n\t\tvec<4, T, Q> fy(Pf.y, Pf.y, Pf.w, Pf.w);\n\n\t\tvec<4, T, Q> i = detail::permute(detail::permute(ix) + iy);\n\n\t\tvec<4, T, Q> gx = static_cast<T>(2) * fract(i / T(41)) - T(1);\n\t\tvec<4, T, Q> gy = abs(gx) - T(0.5);\n\t\tvec<4, T, Q> tx = floor(gx + T(0.5));\n\t\tgx = gx - tx;\n\n\t\tvec<2, T, Q> g00(gx.x, gy.x);\n\t\tvec<2, T, Q> g10(gx.y, gy.y);\n\t\tvec<2, T, Q> g01(gx.z, gy.z);\n\t\tvec<2, T, Q> g11(gx.w, gy.w);\n\n\t\tvec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));\n\t\tg00 *= norm.x;\n\t\tg01 *= norm.y;\n\t\tg10 *= norm.z;\n\t\tg11 *= norm.w;\n\n\t\tT n00 = dot(g00, vec<2, T, Q>(fx.x, fy.x));\n\t\tT n10 = dot(g10, vec<2, T, Q>(fx.y, fy.y));\n\t\tT n01 = dot(g01, vec<2, T, Q>(fx.z, fy.z));\n\t\tT n11 = dot(g11, vec<2, T, Q>(fx.w, fy.w));\n\n\t\tvec<2, T, Q> fade_xy = detail::fade(vec<2, T, Q>(Pf.x, Pf.y));\n\t\tvec<2, T, Q> n_x = mix(vec<2, T, Q>(n00, n01), vec<2, T, Q>(n10, n11), fade_xy.x);\n\t\tT n_xy = mix(n_x.x, n_x.y, fade_xy.y);\n\t\treturn T(2.3) * n_xy;\n\t}\n\n\t// Classic Perlin noise, periodic variant\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T perlin(vec<3, T, Q> const& Position, vec<3, T, Q> const& rep)\n\t{\n\t\tvec<3, T, Q> Pi0 = mod(floor(Position), rep); // Integer part, modulo period\n\t\tvec<3, T, Q> Pi1 = mod(Pi0 + vec<3, T, Q>(T(1)), rep); // Integer part + 1, mod period\n\t\tPi0 = mod(Pi0, vec<3, T, Q>(289));\n\t\tPi1 = mod(Pi1, vec<3, T, Q>(289));\n\t\tvec<3, T, Q> Pf0 = fract(Position); // Fractional part for interpolation\n\t\tvec<3, T, Q> Pf1 = Pf0 - vec<3, T, Q>(T(1)); // Fractional part - 1.0\n\t\tvec<4, T, Q> ix = vec<4, T, Q>(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n\t\tvec<4, T, Q> iy = vec<4, T, Q>(Pi0.y, Pi0.y, Pi1.y, Pi1.y);\n\t\tvec<4, T, Q> iz0(Pi0.z);\n\t\tvec<4, T, Q> iz1(Pi1.z);\n\n\t\tvec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy);\n\t\tvec<4, T, Q> ixy0 = detail::permute(ixy + iz0);\n\t\tvec<4, T, Q> ixy1 = detail::permute(ixy + iz1);\n\n\t\tvec<4, T, Q> gx0 = ixy0 / T(7);\n\t\tvec<4, T, Q> gy0 = fract(floor(gx0) / T(7)) - T(0.5);\n\t\tgx0 = fract(gx0);\n\t\tvec<4, T, Q> gz0 = vec<4, T, Q>(0.5) - abs(gx0) - abs(gy0);\n\t\tvec<4, T, Q> sz0 = step(gz0, vec<4, T, Q>(0));\n\t\tgx0 -= sz0 * (step(T(0), gx0) - T(0.5));\n\t\tgy0 -= sz0 * (step(T(0), gy0) - T(0.5));\n\n\t\tvec<4, T, Q> gx1 = ixy1 / T(7);\n\t\tvec<4, T, Q> gy1 = fract(floor(gx1) / T(7)) - T(0.5);\n\t\tgx1 = fract(gx1);\n\t\tvec<4, T, Q> gz1 = vec<4, T, Q>(0.5) - abs(gx1) - abs(gy1);\n\t\tvec<4, T, Q> sz1 = step(gz1, vec<4, T, Q>(T(0)));\n\t\tgx1 -= sz1 * (step(T(0), gx1) - T(0.5));\n\t\tgy1 -= sz1 * (step(T(0), gy1) - T(0.5));\n\n\t\tvec<3, T, Q> g000 = vec<3, T, Q>(gx0.x, gy0.x, gz0.x);\n\t\tvec<3, T, Q> g100 = vec<3, T, Q>(gx0.y, gy0.y, gz0.y);\n\t\tvec<3, T, Q> g010 = vec<3, T, Q>(gx0.z, gy0.z, gz0.z);\n\t\tvec<3, T, Q> g110 = vec<3, T, Q>(gx0.w, gy0.w, gz0.w);\n\t\tvec<3, T, Q> g001 = vec<3, T, Q>(gx1.x, gy1.x, gz1.x);\n\t\tvec<3, T, Q> g101 = vec<3, T, Q>(gx1.y, gy1.y, gz1.y);\n\t\tvec<3, T, Q> g011 = vec<3, T, Q>(gx1.z, gy1.z, gz1.z);\n\t\tvec<3, T, Q> g111 = vec<3, T, Q>(gx1.w, gy1.w, gz1.w);\n\n\t\tvec<4, T, Q> norm0 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n\t\tg000 *= norm0.x;\n\t\tg010 *= norm0.y;\n\t\tg100 *= norm0.z;\n\t\tg110 *= norm0.w;\n\t\tvec<4, T, Q> norm1 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n\t\tg001 *= norm1.x;\n\t\tg011 *= norm1.y;\n\t\tg101 *= norm1.z;\n\t\tg111 *= norm1.w;\n\n\t\tT n000 = dot(g000, Pf0);\n\t\tT n100 = dot(g100, vec<3, T, Q>(Pf1.x, Pf0.y, Pf0.z));\n\t\tT n010 = dot(g010, vec<3, T, Q>(Pf0.x, Pf1.y, Pf0.z));\n\t\tT n110 = dot(g110, vec<3, T, Q>(Pf1.x, Pf1.y, Pf0.z));\n\t\tT n001 = dot(g001, vec<3, T, Q>(Pf0.x, Pf0.y, Pf1.z));\n\t\tT n101 = dot(g101, vec<3, T, Q>(Pf1.x, Pf0.y, Pf1.z));\n\t\tT n011 = dot(g011, vec<3, T, Q>(Pf0.x, Pf1.y, Pf1.z));\n\t\tT n111 = dot(g111, Pf1);\n\n\t\tvec<3, T, Q> fade_xyz = detail::fade(Pf0);\n\t\tvec<4, T, Q> n_z = mix(vec<4, T, Q>(n000, n100, n010, n110), vec<4, T, Q>(n001, n101, n011, n111), fade_xyz.z);\n\t\tvec<2, T, Q> n_yz = mix(vec<2, T, Q>(n_z.x, n_z.y), vec<2, T, Q>(n_z.z, n_z.w), fade_xyz.y);\n\t\tT n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n\t\treturn T(2.2) * n_xyz;\n\t}\n\n\t// Classic Perlin noise, periodic version\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T perlin(vec<4, T, Q> const& Position, vec<4, T, Q> const& rep)\n\t{\n\t\tvec<4, T, Q> Pi0 = mod(floor(Position), rep); // Integer part modulo rep\n\t\tvec<4, T, Q> Pi1 = mod(Pi0 + T(1), rep); // Integer part + 1 mod rep\n\t\tvec<4, T, Q> Pf0 = fract(Position); // Fractional part for interpolation\n\t\tvec<4, T, Q> Pf1 = Pf0 - T(1); // Fractional part - 1.0\n\t\tvec<4, T, Q> ix = vec<4, T, Q>(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n\t\tvec<4, T, Q> iy = vec<4, T, Q>(Pi0.y, Pi0.y, Pi1.y, Pi1.y);\n\t\tvec<4, T, Q> iz0(Pi0.z);\n\t\tvec<4, T, Q> iz1(Pi1.z);\n\t\tvec<4, T, Q> iw0(Pi0.w);\n\t\tvec<4, T, Q> iw1(Pi1.w);\n\n\t\tvec<4, T, Q> ixy = detail::permute(detail::permute(ix) + iy);\n\t\tvec<4, T, Q> ixy0 = detail::permute(ixy + iz0);\n\t\tvec<4, T, Q> ixy1 = detail::permute(ixy + iz1);\n\t\tvec<4, T, Q> ixy00 = detail::permute(ixy0 + iw0);\n\t\tvec<4, T, Q> ixy01 = detail::permute(ixy0 + iw1);\n\t\tvec<4, T, Q> ixy10 = detail::permute(ixy1 + iw0);\n\t\tvec<4, T, Q> ixy11 = detail::permute(ixy1 + iw1);\n\n\t\tvec<4, T, Q> gx00 = ixy00 / T(7);\n\t\tvec<4, T, Q> gy00 = floor(gx00) / T(7);\n\t\tvec<4, T, Q> gz00 = floor(gy00) / T(6);\n\t\tgx00 = fract(gx00) - T(0.5);\n\t\tgy00 = fract(gy00) - T(0.5);\n\t\tgz00 = fract(gz00) - T(0.5);\n\t\tvec<4, T, Q> gw00 = vec<4, T, Q>(0.75) - abs(gx00) - abs(gy00) - abs(gz00);\n\t\tvec<4, T, Q> sw00 = step(gw00, vec<4, T, Q>(0));\n\t\tgx00 -= sw00 * (step(T(0), gx00) - T(0.5));\n\t\tgy00 -= sw00 * (step(T(0), gy00) - T(0.5));\n\n\t\tvec<4, T, Q> gx01 = ixy01 / T(7);\n\t\tvec<4, T, Q> gy01 = floor(gx01) / T(7);\n\t\tvec<4, T, Q> gz01 = floor(gy01) / T(6);\n\t\tgx01 = fract(gx01) - T(0.5);\n\t\tgy01 = fract(gy01) - T(0.5);\n\t\tgz01 = fract(gz01) - T(0.5);\n\t\tvec<4, T, Q> gw01 = vec<4, T, Q>(0.75) - abs(gx01) - abs(gy01) - abs(gz01);\n\t\tvec<4, T, Q> sw01 = step(gw01, vec<4, T, Q>(0.0));\n\t\tgx01 -= sw01 * (step(T(0), gx01) - T(0.5));\n\t\tgy01 -= sw01 * (step(T(0), gy01) - T(0.5));\n\n\t\tvec<4, T, Q> gx10 = ixy10 / T(7);\n\t\tvec<4, T, Q> gy10 = floor(gx10) / T(7);\n\t\tvec<4, T, Q> gz10 = floor(gy10) / T(6);\n\t\tgx10 = fract(gx10) - T(0.5);\n\t\tgy10 = fract(gy10) - T(0.5);\n\t\tgz10 = fract(gz10) - T(0.5);\n\t\tvec<4, T, Q> gw10 = vec<4, T, Q>(0.75) - abs(gx10) - abs(gy10) - abs(gz10);\n\t\tvec<4, T, Q> sw10 = step(gw10, vec<4, T, Q>(0.0));\n\t\tgx10 -= sw10 * (step(T(0), gx10) - T(0.5));\n\t\tgy10 -= sw10 * (step(T(0), gy10) - T(0.5));\n\n\t\tvec<4, T, Q> gx11 = ixy11 / T(7);\n\t\tvec<4, T, Q> gy11 = floor(gx11) / T(7);\n\t\tvec<4, T, Q> gz11 = floor(gy11) / T(6);\n\t\tgx11 = fract(gx11) - T(0.5);\n\t\tgy11 = fract(gy11) - T(0.5);\n\t\tgz11 = fract(gz11) - T(0.5);\n\t\tvec<4, T, Q> gw11 = vec<4, T, Q>(0.75) - abs(gx11) - abs(gy11) - abs(gz11);\n\t\tvec<4, T, Q> sw11 = step(gw11, vec<4, T, Q>(T(0)));\n\t\tgx11 -= sw11 * (step(T(0), gx11) - T(0.5));\n\t\tgy11 -= sw11 * (step(T(0), gy11) - T(0.5));\n\n\t\tvec<4, T, Q> g0000(gx00.x, gy00.x, gz00.x, gw00.x);\n\t\tvec<4, T, Q> g1000(gx00.y, gy00.y, gz00.y, gw00.y);\n\t\tvec<4, T, Q> g0100(gx00.z, gy00.z, gz00.z, gw00.z);\n\t\tvec<4, T, Q> g1100(gx00.w, gy00.w, gz00.w, gw00.w);\n\t\tvec<4, T, Q> g0010(gx10.x, gy10.x, gz10.x, gw10.x);\n\t\tvec<4, T, Q> g1010(gx10.y, gy10.y, gz10.y, gw10.y);\n\t\tvec<4, T, Q> g0110(gx10.z, gy10.z, gz10.z, gw10.z);\n\t\tvec<4, T, Q> g1110(gx10.w, gy10.w, gz10.w, gw10.w);\n\t\tvec<4, T, Q> g0001(gx01.x, gy01.x, gz01.x, gw01.x);\n\t\tvec<4, T, Q> g1001(gx01.y, gy01.y, gz01.y, gw01.y);\n\t\tvec<4, T, Q> g0101(gx01.z, gy01.z, gz01.z, gw01.z);\n\t\tvec<4, T, Q> g1101(gx01.w, gy01.w, gz01.w, gw01.w);\n\t\tvec<4, T, Q> g0011(gx11.x, gy11.x, gz11.x, gw11.x);\n\t\tvec<4, T, Q> g1011(gx11.y, gy11.y, gz11.y, gw11.y);\n\t\tvec<4, T, Q> g0111(gx11.z, gy11.z, gz11.z, gw11.z);\n\t\tvec<4, T, Q> g1111(gx11.w, gy11.w, gz11.w, gw11.w);\n\n\t\tvec<4, T, Q> norm00 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100)));\n\t\tg0000 *= norm00.x;\n\t\tg0100 *= norm00.y;\n\t\tg1000 *= norm00.z;\n\t\tg1100 *= norm00.w;\n\n\t\tvec<4, T, Q> norm01 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101)));\n\t\tg0001 *= norm01.x;\n\t\tg0101 *= norm01.y;\n\t\tg1001 *= norm01.z;\n\t\tg1101 *= norm01.w;\n\n\t\tvec<4, T, Q> norm10 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110)));\n\t\tg0010 *= norm10.x;\n\t\tg0110 *= norm10.y;\n\t\tg1010 *= norm10.z;\n\t\tg1110 *= norm10.w;\n\n\t\tvec<4, T, Q> norm11 = detail::taylorInvSqrt(vec<4, T, Q>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111)));\n\t\tg0011 *= norm11.x;\n\t\tg0111 *= norm11.y;\n\t\tg1011 *= norm11.z;\n\t\tg1111 *= norm11.w;\n\n\t\tT n0000 = dot(g0000, Pf0);\n\t\tT n1000 = dot(g1000, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf0.w));\n\t\tT n0100 = dot(g0100, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf0.w));\n\t\tT n1100 = dot(g1100, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf0.w));\n\t\tT n0010 = dot(g0010, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf0.w));\n\t\tT n1010 = dot(g1010, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf0.w));\n\t\tT n0110 = dot(g0110, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf0.w));\n\t\tT n1110 = dot(g1110, vec<4, T, Q>(Pf1.x, Pf1.y, Pf1.z, Pf0.w));\n\t\tT n0001 = dot(g0001, vec<4, T, Q>(Pf0.x, Pf0.y, Pf0.z, Pf1.w));\n\t\tT n1001 = dot(g1001, vec<4, T, Q>(Pf1.x, Pf0.y, Pf0.z, Pf1.w));\n\t\tT n0101 = dot(g0101, vec<4, T, Q>(Pf0.x, Pf1.y, Pf0.z, Pf1.w));\n\t\tT n1101 = dot(g1101, vec<4, T, Q>(Pf1.x, Pf1.y, Pf0.z, Pf1.w));\n\t\tT n0011 = dot(g0011, vec<4, T, Q>(Pf0.x, Pf0.y, Pf1.z, Pf1.w));\n\t\tT n1011 = dot(g1011, vec<4, T, Q>(Pf1.x, Pf0.y, Pf1.z, Pf1.w));\n\t\tT n0111 = dot(g0111, vec<4, T, Q>(Pf0.x, Pf1.y, Pf1.z, Pf1.w));\n\t\tT n1111 = dot(g1111, Pf1);\n\n\t\tvec<4, T, Q> fade_xyzw = detail::fade(Pf0);\n\t\tvec<4, T, Q> n_0w = mix(vec<4, T, Q>(n0000, n1000, n0100, n1100), vec<4, T, Q>(n0001, n1001, n0101, n1101), fade_xyzw.w);\n\t\tvec<4, T, Q> n_1w = mix(vec<4, T, Q>(n0010, n1010, n0110, n1110), vec<4, T, Q>(n0011, n1011, n0111, n1111), fade_xyzw.w);\n\t\tvec<4, T, Q> n_zw = mix(n_0w, n_1w, fade_xyzw.z);\n\t\tvec<2, T, Q> n_yzw = mix(vec<2, T, Q>(n_zw.x, n_zw.y), vec<2, T, Q>(n_zw.z, n_zw.w), fade_xyzw.y);\n\t\tT n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);\n\t\treturn T(2.2) * n_xyzw;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T simplex(glm::vec<2, T, Q> const& v)\n\t{\n\t\tvec<4, T, Q> const C = vec<4, T, Q>(\n\t\t\tT( 0.211324865405187),  // (3.0 -  sqrt(3.0)) / 6.0\n\t\t\tT( 0.366025403784439),  //  0.5 * (sqrt(3.0)  - 1.0)\n\t\t\tT(-0.577350269189626),\t// -1.0 + 2.0 * C.x\n\t\t\tT( 0.024390243902439)); //  1.0 / 41.0\n\n\t\t// First corner\n\t\tvec<2, T, Q> i  = floor(v + dot(v, vec<2, T, Q>(C[1])));\n\t\tvec<2, T, Q> x0 = v -   i + dot(i, vec<2, T, Q>(C[0]));\n\n\t\t// Other corners\n\t\t//i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0\n\t\t//i1.y = 1.0 - i1.x;\n\t\tvec<2, T, Q> i1 = (x0.x > x0.y) ? vec<2, T, Q>(1, 0) : vec<2, T, Q>(0, 1);\n\t\t// x0 = x0 - 0.0 + 0.0 * C.xx ;\n\t\t// x1 = x0 - i1 + 1.0 * C.xx ;\n\t\t// x2 = x0 - 1.0 + 2.0 * C.xx ;\n\t\tvec<4, T, Q> x12 = vec<4, T, Q>(x0.x, x0.y, x0.x, x0.y) + vec<4, T, Q>(C.x, C.x, C.z, C.z);\n\t\tx12 = vec<4, T, Q>(vec<2, T, Q>(x12) - i1, x12.z, x12.w);\n\n\t\t// Permutations\n\t\ti = mod(i, vec<2, T, Q>(289)); // Avoid truncation effects in permutation\n\t\tvec<3, T, Q> p = detail::permute(\n\t\t\tdetail::permute(i.y + vec<3, T, Q>(T(0), i1.y, T(1)))\n\t\t\t+ i.x + vec<3, T, Q>(T(0), i1.x, T(1)));\n\n\t\tvec<3, T, Q> m = max(vec<3, T, Q>(0.5) - vec<3, T, Q>(\n\t\t\tdot(x0, x0),\n\t\t\tdot(vec<2, T, Q>(x12.x, x12.y), vec<2, T, Q>(x12.x, x12.y)), \n\t\t\tdot(vec<2, T, Q>(x12.z, x12.w), vec<2, T, Q>(x12.z, x12.w))), vec<3, T, Q>(0));\n\t\tm = m * m ;\n\t\tm = m * m ;\n\n\t\t// Gradients: 41 points uniformly over a line, mapped onto a diamond.\n\t\t// The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287)\n\n\t\tvec<3, T, Q> x = static_cast<T>(2) * fract(p * C.w) - T(1);\n\t\tvec<3, T, Q> h = abs(x) - T(0.5);\n\t\tvec<3, T, Q> ox = floor(x + T(0.5));\n\t\tvec<3, T, Q> a0 = x - ox;\n\n\t\t// Normalise gradients implicitly by scaling m\n\t\t// Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h );\n\t\tm *= static_cast<T>(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h);\n\n\t\t// Compute final noise value at P\n\t\tvec<3, T, Q> g;\n\t\tg.x  = a0.x  * x0.x  + h.x  * x0.y;\n\t\t//g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n\t\tg.y = a0.y * x12.x + h.y * x12.y;\n\t\tg.z = a0.z * x12.z + h.z * x12.w;\n\t\treturn T(130) * dot(m, g);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T simplex(vec<3, T, Q> const& v)\n\t{\n\t\tvec<2, T, Q> const C(1.0 / 6.0, 1.0 / 3.0);\n\t\tvec<4, T, Q> const D(0.0, 0.5, 1.0, 2.0);\n\n\t\t// First corner\n\t\tvec<3, T, Q> i(floor(v + dot(v, vec<3, T, Q>(C.y))));\n\t\tvec<3, T, Q> x0(v - i + dot(i, vec<3, T, Q>(C.x)));\n\n\t\t// Other corners\n\t\tvec<3, T, Q> g(step(vec<3, T, Q>(x0.y, x0.z, x0.x), x0));\n\t\tvec<3, T, Q> l(T(1) - g);\n\t\tvec<3, T, Q> i1(min(g, vec<3, T, Q>(l.z, l.x, l.y)));\n\t\tvec<3, T, Q> i2(max(g, vec<3, T, Q>(l.z, l.x, l.y)));\n\n\t\t//   x0 = x0 - 0.0 + 0.0 * C.xxx;\n\t\t//   x1 = x0 - i1  + 1.0 * C.xxx;\n\t\t//   x2 = x0 - i2  + 2.0 * C.xxx;\n\t\t//   x3 = x0 - 1.0 + 3.0 * C.xxx;\n\t\tvec<3, T, Q> x1(x0 - i1 + C.x);\n\t\tvec<3, T, Q> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y\n\t\tvec<3, T, Q> x3(x0 - D.y);      // -1.0+3.0*C.x = -0.5 = -D.y\n\n\t\t// Permutations\n\t\ti = detail::mod289(i);\n\t\tvec<4, T, Q> p(detail::permute(detail::permute(detail::permute(\n\t\t\ti.z + vec<4, T, Q>(T(0), i1.z, i2.z, T(1))) +\n\t\t\ti.y + vec<4, T, Q>(T(0), i1.y, i2.y, T(1))) +\n\t\t\ti.x + vec<4, T, Q>(T(0), i1.x, i2.x, T(1))));\n\n\t\t// Gradients: 7x7 points over a square, mapped onto an octahedron.\n\t\t// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n\t\tT n_ = static_cast<T>(0.142857142857); // 1.0/7.0\n\t\tvec<3, T, Q> ns(n_ * vec<3, T, Q>(D.w, D.y, D.z) - vec<3, T, Q>(D.x, D.z, D.x));\n\n\t\tvec<4, T, Q> j(p - T(49) * floor(p * ns.z * ns.z));  //  mod(p,7*7)\n\n\t\tvec<4, T, Q> x_(floor(j * ns.z));\n\t\tvec<4, T, Q> y_(floor(j - T(7) * x_));    // mod(j,N)\n\n\t\tvec<4, T, Q> x(x_ * ns.x + ns.y);\n\t\tvec<4, T, Q> y(y_ * ns.x + ns.y);\n\t\tvec<4, T, Q> h(T(1) - abs(x) - abs(y));\n\n\t\tvec<4, T, Q> b0(x.x, x.y, y.x, y.y);\n\t\tvec<4, T, Q> b1(x.z, x.w, y.z, y.w);\n\n\t\t// vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n\t\t// vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n\t\tvec<4, T, Q> s0(floor(b0) * T(2) + T(1));\n\t\tvec<4, T, Q> s1(floor(b1) * T(2) + T(1));\n\t\tvec<4, T, Q> sh(-step(h, vec<4, T, Q>(0.0)));\n\n\t\tvec<4, T, Q> a0 = vec<4, T, Q>(b0.x, b0.z, b0.y, b0.w) + vec<4, T, Q>(s0.x, s0.z, s0.y, s0.w) * vec<4, T, Q>(sh.x, sh.x, sh.y, sh.y);\n\t\tvec<4, T, Q> a1 = vec<4, T, Q>(b1.x, b1.z, b1.y, b1.w) + vec<4, T, Q>(s1.x, s1.z, s1.y, s1.w) * vec<4, T, Q>(sh.z, sh.z, sh.w, sh.w);\n\n\t\tvec<3, T, Q> p0(a0.x, a0.y, h.x);\n\t\tvec<3, T, Q> p1(a0.z, a0.w, h.y);\n\t\tvec<3, T, Q> p2(a1.x, a1.y, h.z);\n\t\tvec<3, T, Q> p3(a1.z, a1.w, h.w);\n\n\t\t// Normalise gradients\n\t\tvec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n\t\tp0 *= norm.x;\n\t\tp1 *= norm.y;\n\t\tp2 *= norm.z;\n\t\tp3 *= norm.w;\n\n\t\t// Mix final noise value\n\t\tvec<4, T, Q> m = max(T(0.6) - vec<4, T, Q>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), vec<4, T, Q>(0));\n\t\tm = m * m;\n\t\treturn T(42) * dot(m * m, vec<4, T, Q>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T simplex(vec<4, T, Q> const& v)\n\t{\n\t\tvec<4, T, Q> const C(\n\t\t\t0.138196601125011,  // (5 - sqrt(5))/20  G4\n\t\t\t0.276393202250021,  // 2 * G4\n\t\t\t0.414589803375032,  // 3 * G4\n\t\t\t-0.447213595499958); // -1 + 4 * G4\n\n\t\t// (sqrt(5) - 1)/4 = F4, used once below\n\t\tT const F4 = static_cast<T>(0.309016994374947451);\n\n\t\t// First corner\n\t\tvec<4, T, Q> i  = floor(v + dot(v, vec4(F4)));\n\t\tvec<4, T, Q> x0 = v -   i + dot(i, vec4(C.x));\n\n\t\t// Other corners\n\n\t\t// Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\n\t\tvec<4, T, Q> i0;\n\t\tvec<3, T, Q> isX = step(vec<3, T, Q>(x0.y, x0.z, x0.w), vec<3, T, Q>(x0.x));\n\t\tvec<3, T, Q> isYZ = step(vec<3, T, Q>(x0.z, x0.w, x0.w), vec<3, T, Q>(x0.y, x0.y, x0.z));\n\t\t//  i0.x = dot(isX, vec3(1.0));\n\t\t//i0.x = isX.x + isX.y + isX.z;\n\t\t//i0.yzw = static_cast<T>(1) - isX;\n\t\ti0 = vec<4, T, Q>(isX.x + isX.y + isX.z, T(1) - isX);\n\t\t//  i0.y += dot(isYZ.xy, vec2(1.0));\n\t\ti0.y += isYZ.x + isYZ.y;\n\t\t//i0.zw += 1.0 - vec<2, T, Q>(isYZ.x, isYZ.y);\n\t\ti0.z += static_cast<T>(1) - isYZ.x;\n\t\ti0.w += static_cast<T>(1) - isYZ.y;\n\t\ti0.z += isYZ.z;\n\t\ti0.w += static_cast<T>(1) - isYZ.z;\n\n\t\t// i0 now contains the unique values 0,1,2,3 in each channel\n\t\tvec<4, T, Q> i3 = clamp(i0, T(0), T(1));\n\t\tvec<4, T, Q> i2 = clamp(i0 - T(1), T(0), T(1));\n\t\tvec<4, T, Q> i1 = clamp(i0 - T(2), T(0), T(1));\n\n\t\t//  x0 = x0 - 0.0 + 0.0 * C.xxxx\n\t\t//  x1 = x0 - i1  + 0.0 * C.xxxx\n\t\t//  x2 = x0 - i2  + 0.0 * C.xxxx\n\t\t//  x3 = x0 - i3  + 0.0 * C.xxxx\n\t\t//  x4 = x0 - 1.0 + 4.0 * C.xxxx\n\t\tvec<4, T, Q> x1 = x0 - i1 + C.x;\n\t\tvec<4, T, Q> x2 = x0 - i2 + C.y;\n\t\tvec<4, T, Q> x3 = x0 - i3 + C.z;\n\t\tvec<4, T, Q> x4 = x0 + C.w;\n\n\t\t// Permutations\n\t\ti = mod(i, vec<4, T, Q>(289)); \n\t\tT j0 = detail::permute(detail::permute(detail::permute(detail::permute(i.w) + i.z) + i.y) + i.x);\n\t\tvec<4, T, Q> j1 = detail::permute(detail::permute(detail::permute(detail::permute(\n\t\t\ti.w + vec<4, T, Q>(i1.w, i2.w, i3.w, T(1))) +\n\t\t\ti.z + vec<4, T, Q>(i1.z, i2.z, i3.z, T(1))) +\n\t\t\ti.y + vec<4, T, Q>(i1.y, i2.y, i3.y, T(1))) +\n\t\t\ti.x + vec<4, T, Q>(i1.x, i2.x, i3.x, T(1)));\n\n\t\t// Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope\n\t\t// 7*7*6 = 294, which is close to the ring size 17*17 = 289.\n\t\tvec<4, T, Q> ip = vec<4, T, Q>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0));\n\n\t\tvec<4, T, Q> p0 = gtc::grad4(j0,   ip);\n\t\tvec<4, T, Q> p1 = gtc::grad4(j1.x, ip);\n\t\tvec<4, T, Q> p2 = gtc::grad4(j1.y, ip);\n\t\tvec<4, T, Q> p3 = gtc::grad4(j1.z, ip);\n\t\tvec<4, T, Q> p4 = gtc::grad4(j1.w, ip);\n\n\t\t// Normalise gradients\n\t\tvec<4, T, Q> norm = detail::taylorInvSqrt(vec<4, T, Q>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n\t\tp0 *= norm.x;\n\t\tp1 *= norm.y;\n\t\tp2 *= norm.z;\n\t\tp3 *= norm.w;\n\t\tp4 *= detail::taylorInvSqrt(dot(p4, p4));\n\n\t\t// Mix contributions from the five corners\n\t\tvec<3, T, Q> m0 = max(T(0.6) - vec<3, T, Q>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), vec<3, T, Q>(0));\n\t\tvec<2, T, Q> m1 = max(T(0.6) - vec<2, T, Q>(dot(x3, x3), dot(x4, x4)             ), vec<2, T, Q>(0));\n\t\tm0 = m0 * m0;\n\t\tm1 = m1 * m1;\n\t\treturn T(49) * \n\t\t\t(dot(m0 * m0, vec<3, T, Q>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + \n\t\t\tdot(m1 * m1, vec<2, T, Q>(dot(p3, x3), dot(p4, x4))));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/packing.hpp",
    "content": "/// @ref gtc_packing\n/// @file glm/gtc/packing.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_packing GLM_GTC_packing\n/// @ingroup gtc\n///\n/// Include <glm/gtc/packing.hpp> to use the features of this extension.\n///\n/// This extension provides a set of function to convert vertors to packed\n/// formats.\n\n#pragma once\n\n// Dependency:\n#include \"type_precision.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_packing extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_packing\n\t/// @{\n\n\t/// First, converts the normalized floating-point value v into a 8-bit integer value.\n\t/// Then, the results are packed into the returned 8-bit unsigned integer.\n\t///\n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packUnorm1x8:\tround(clamp(c, 0, +1) * 255.0)\n\t///\n\t/// @see gtc_packing\n\t/// @see uint16 packUnorm2x8(vec2 const& v)\n\t/// @see uint32 packUnorm4x8(vec4 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint8 packUnorm1x8(float v);\n\n\t/// Convert a single 8-bit integer to a normalized floating-point value.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackUnorm4x8: f / 255.0\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec2 unpackUnorm2x8(uint16 p)\n\t/// @see vec4 unpackUnorm4x8(uint32 p)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL unpackUnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL float unpackUnorm1x8(uint8 p);\n\n\t/// First, converts each component of the normalized floating-point value v into 8-bit integer values.\n\t/// Then, the results are packed into the returned 16-bit unsigned integer.\n\t///\n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packUnorm2x8:\tround(clamp(c, 0, +1) * 255.0)\n\t///\n\t/// The first component of the vector will be written to the least significant bits of the output;\n\t/// the last component will be written to the most significant bits.\n\t///\n\t/// @see gtc_packing\n\t/// @see uint8 packUnorm1x8(float const& v)\n\t/// @see uint32 packUnorm4x8(vec4 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint16 packUnorm2x8(vec2 const& v);\n\n\t/// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackUnorm4x8: f / 255.0\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see float unpackUnorm1x8(uint8 v)\n\t/// @see vec4 unpackUnorm4x8(uint32 p)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL unpackUnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec2 unpackUnorm2x8(uint16 p);\n\t\n\t/// First, converts the normalized floating-point value v into 8-bit integer value.\n\t/// Then, the results are packed into the returned 8-bit unsigned integer.\n\t///\n\t/// The conversion to fixed point is done as follows:\n\t/// packSnorm1x8:\tround(clamp(s, -1, +1) * 127.0)\n\t///\n\t/// @see gtc_packing\n\t/// @see uint16 packSnorm2x8(vec2 const& v)\n\t/// @see uint32 packSnorm4x8(vec4 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint8 packSnorm1x8(float s);\n\n\t/// First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers. \n\t/// Then, the value is converted to a normalized floating-point value to generate the returned scalar.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackSnorm1x8: clamp(f / 127.0, -1, +1)\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec2 unpackSnorm2x8(uint16 p)\n\t/// @see vec4 unpackSnorm4x8(uint32 p)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL unpackSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL float unpackSnorm1x8(uint8 p);\n\t\n\t/// First, converts each component of the normalized floating-point value v into 8-bit integer values.\n\t/// Then, the results are packed into the returned 16-bit unsigned integer.\n\t///\n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packSnorm2x8:\tround(clamp(c, -1, +1) * 127.0)\n\t///\n\t/// The first component of the vector will be written to the least significant bits of the output;\n\t/// the last component will be written to the most significant bits.\n\t///\n\t/// @see gtc_packing\n\t/// @see uint8 packSnorm1x8(float const& v)\n\t/// @see uint32 packSnorm4x8(vec4 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint16 packSnorm2x8(vec2 const& v);\n\n\t/// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackSnorm2x8: clamp(f / 127.0, -1, +1)\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see float unpackSnorm1x8(uint8 p)\n\t/// @see vec4 unpackSnorm4x8(uint32 p)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL unpackSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec2 unpackSnorm2x8(uint16 p);\n\t\n\t/// First, converts the normalized floating-point value v into a 16-bit integer value.\n\t/// Then, the results are packed into the returned 16-bit unsigned integer.\n\t///\n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packUnorm1x16:\tround(clamp(c, 0, +1) * 65535.0)\n\t///\n\t/// @see gtc_packing\n\t/// @see uint16 packSnorm1x16(float const& v)\n\t/// @see uint64 packSnorm4x16(vec4 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint16 packUnorm1x16(float v);\n\n\t/// First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers. \n\t/// Then, the value is converted to a normalized floating-point value to generate the returned scalar.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackUnorm1x16: f / 65535.0 \n\t/// \n\t/// @see gtc_packing\n\t/// @see vec2 unpackUnorm2x16(uint32 p)\n\t/// @see vec4 unpackUnorm4x16(uint64 p)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL unpackUnorm2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL float unpackUnorm1x16(uint16 p);\n\n\t/// First, converts each component of the normalized floating-point value v into 16-bit integer values.\n\t/// Then, the results are packed into the returned 64-bit unsigned integer.\n\t///\n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packUnorm4x16:\tround(clamp(c, 0, +1) * 65535.0)\n\t///\n\t/// The first component of the vector will be written to the least significant bits of the output;\n\t/// the last component will be written to the most significant bits.\n\t///\n\t/// @see gtc_packing\n\t/// @see uint16 packUnorm1x16(float const& v)\n\t/// @see uint32 packUnorm2x16(vec2 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint64 packUnorm4x16(vec4 const& v);\n\n\t/// First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackUnormx4x16: f / 65535.0 \n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see float unpackUnorm1x16(uint16 p)\n\t/// @see vec2 unpackUnorm2x16(uint32 p)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL unpackUnorm2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec4 unpackUnorm4x16(uint64 p);\n\n\t/// First, converts the normalized floating-point value v into 16-bit integer value.\n\t/// Then, the results are packed into the returned 16-bit unsigned integer.\n\t///\n\t/// The conversion to fixed point is done as follows:\n\t/// packSnorm1x8:\tround(clamp(s, -1, +1) * 32767.0)\n\t///\n\t/// @see gtc_packing\n\t/// @see uint32 packSnorm2x16(vec2 const& v)\n\t/// @see uint64 packSnorm4x16(vec4 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint16 packSnorm1x16(float v);\n\n\t/// First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned scalar.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackSnorm1x16: clamp(f / 32767.0, -1, +1)\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec2 unpackSnorm2x16(uint32 p)\n\t/// @see vec4 unpackSnorm4x16(uint64 p)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm1x16.xml\">GLSL unpackSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL float unpackSnorm1x16(uint16 p);\n\n\t/// First, converts each component of the normalized floating-point value v into 16-bit integer values.\n\t/// Then, the results are packed into the returned 64-bit unsigned integer.\n\t///\n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packSnorm2x8:\tround(clamp(c, -1, +1) * 32767.0)\n\t///\n\t/// The first component of the vector will be written to the least significant bits of the output;\n\t/// the last component will be written to the most significant bits.\n\t///\n\t/// @see gtc_packing\n\t/// @see uint16 packSnorm1x16(float const& v)\n\t/// @see uint32 packSnorm2x16(vec2 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint64 packSnorm4x16(vec4 const& v);\n\n\t/// First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackSnorm4x16: clamp(f / 32767.0, -1, +1)\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see float unpackSnorm1x16(uint16 p)\n\t/// @see vec2 unpackSnorm2x16(uint32 p)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml\">GLSL unpackSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec4 unpackSnorm4x16(uint64 p);\n\t\n\t/// Returns an unsigned integer obtained by converting the components of a floating-point scalar\n\t/// to the 16-bit floating-point representation found in the OpenGL Specification,\n\t/// and then packing this 16-bit value into a 16-bit unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see uint32 packHalf2x16(vec2 const& v)\n\t/// @see uint64 packHalf4x16(vec4 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL packHalf2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint16 packHalf1x16(float v);\n\t\n\t/// Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into a 16-bit value,\n\t/// interpreted as a 16-bit floating-point number according to the OpenGL Specification,\n\t/// and converting it to 32-bit floating-point values.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec2 unpackHalf2x16(uint32 const& v)\n\t/// @see vec4 unpackHalf4x16(uint64 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL unpackHalf2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL float unpackHalf1x16(uint16 v);\n\n\t/// Returns an unsigned integer obtained by converting the components of a four-component floating-point vector \n\t/// to the 16-bit floating-point representation found in the OpenGL Specification, \n\t/// and then packing these four 16-bit values into a 64-bit unsigned integer.\n\t/// The first vector component specifies the 16 least-significant bits of the result; \n\t/// the forth component specifies the 16 most-significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint16 packHalf1x16(float const& v)\n\t/// @see uint32 packHalf2x16(vec2 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL packHalf2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint64 packHalf4x16(vec4 const& v);\n\t\n\t/// Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigned integer into four 16-bit values,\n\t/// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, \n\t/// and converting them to 32-bit floating-point values.\n\t/// The first component of the vector is obtained from the 16 least-significant bits of v; \n\t/// the forth component is obtained from the 16 most-significant bits of v.\n\t/// \n\t/// @see gtc_packing\n\t/// @see float unpackHalf1x16(uint16 const& v)\n\t/// @see vec2 unpackHalf2x16(uint32 const& v)\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL unpackHalf2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec4 unpackHalf4x16(uint64 p);\n\n\t/// Returns an unsigned integer obtained by converting the components of a four-component signed integer vector \n\t/// to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification, \n\t/// and then packing these four values into a 32-bit unsigned integer.\n\t/// The first vector component specifies the 10 least-significant bits of the result; \n\t/// the forth component specifies the 2 most-significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint32 packI3x10_1x2(uvec4 const& v)\n\t/// @see uint32 packSnorm3x10_1x2(vec4 const& v)\n\t/// @see uint32 packUnorm3x10_1x2(vec4 const& v)\n\t/// @see ivec4 unpackI3x10_1x2(uint32 const& p)\n\tGLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const& v);\n\n\t/// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers. \n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint32 packU3x10_1x2(uvec4 const& v)\n\t/// @see vec4 unpackSnorm3x10_1x2(uint32 const& p);\n\t/// @see uvec4 unpackI3x10_1x2(uint32 const& p);\n\tGLM_FUNC_DECL ivec4 unpackI3x10_1x2(uint32 p);\n\n\t/// Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector \n\t/// to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification, \n\t/// and then packing these four values into a 32-bit unsigned integer.\n\t/// The first vector component specifies the 10 least-significant bits of the result; \n\t/// the forth component specifies the 2 most-significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint32 packI3x10_1x2(ivec4 const& v)\n\t/// @see uint32 packSnorm3x10_1x2(vec4 const& v)\n\t/// @see uint32 packUnorm3x10_1x2(vec4 const& v)\n\t/// @see ivec4 unpackU3x10_1x2(uint32 const& p)\n\tGLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const& v);\n\n\t/// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers. \n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint32 packU3x10_1x2(uvec4 const& v)\n\t/// @see vec4 unpackSnorm3x10_1x2(uint32 const& p);\n\t/// @see uvec4 unpackI3x10_1x2(uint32 const& p);\n\tGLM_FUNC_DECL uvec4 unpackU3x10_1x2(uint32 p);\n\n\t/// First, converts the first three components of the normalized floating-point value v into 10-bit signed integer values.\n\t/// Then, converts the forth component of the normalized floating-point value v into 2-bit signed integer values.\n\t/// Then, the results are packed into the returned 32-bit unsigned integer.\n\t///\n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packSnorm3x10_1x2(xyz):\tround(clamp(c, -1, +1) * 511.0)\n\t/// packSnorm3x10_1x2(w):\tround(clamp(c, -1, +1) * 1.0)\n\t///\n\t/// The first vector component specifies the 10 least-significant bits of the result; \n\t/// the forth component specifies the 2 most-significant bits.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec4 unpackSnorm3x10_1x2(uint32 const& p)\n\t/// @see uint32 packUnorm3x10_1x2(vec4 const& v)\n\t/// @see uint32 packU3x10_1x2(uvec4 const& v)\n\t/// @see uint32 packI3x10_1x2(ivec4 const& v)\n\tGLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const& v);\n\n\t/// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackSnorm3x10_1x2(xyz): clamp(f / 511.0, -1, +1)\n\t/// unpackSnorm3x10_1x2(w): clamp(f / 511.0, -1, +1)\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint32 packSnorm3x10_1x2(vec4 const& v)\n\t/// @see vec4 unpackUnorm3x10_1x2(uint32 const& p))\n\t/// @see uvec4 unpackI3x10_1x2(uint32 const& p)\n\t/// @see uvec4 unpackU3x10_1x2(uint32 const& p)\n\tGLM_FUNC_DECL vec4 unpackSnorm3x10_1x2(uint32 p);\n\n\t/// First, converts the first three components of the normalized floating-point value v into 10-bit unsigned integer values.\n\t/// Then, converts the forth component of the normalized floating-point value v into 2-bit signed uninteger values.\n\t/// Then, the results are packed into the returned 32-bit unsigned integer.\n\t///\n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packUnorm3x10_1x2(xyz):\tround(clamp(c, 0, +1) * 1023.0)\n\t/// packUnorm3x10_1x2(w):\tround(clamp(c, 0, +1) * 3.0)\n\t///\n\t/// The first vector component specifies the 10 least-significant bits of the result; \n\t/// the forth component specifies the 2 most-significant bits.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec4 unpackUnorm3x10_1x2(uint32 const& p)\n\t/// @see uint32 packUnorm3x10_1x2(vec4 const& v)\n\t/// @see uint32 packU3x10_1x2(uvec4 const& v)\n\t/// @see uint32 packI3x10_1x2(ivec4 const& v)\n\tGLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const& v);\n\n\t/// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackSnorm3x10_1x2(xyz): clamp(f / 1023.0, 0, +1)\n\t/// unpackSnorm3x10_1x2(w): clamp(f / 3.0, 0, +1)\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint32 packSnorm3x10_1x2(vec4 const& v)\n\t/// @see vec4 unpackInorm3x10_1x2(uint32 const& p))\n\t/// @see uvec4 unpackI3x10_1x2(uint32 const& p)\n\t/// @see uvec4 unpackU3x10_1x2(uint32 const& p)\n\tGLM_FUNC_DECL vec4 unpackUnorm3x10_1x2(uint32 p);\n\n\t/// First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values.\n\t/// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value.\n\t/// Then, the results are packed into the returned 32-bit unsigned integer.\n\t///\n\t/// The first vector component specifies the 11 least-significant bits of the result; \n\t/// the last component specifies the 10 most-significant bits.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec3 unpackF2x11_1x10(uint32 const& p)\n\tGLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const& v);\n\n\t/// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector.\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint32 packF2x11_1x10(vec3 const& v)\n\tGLM_FUNC_DECL vec3 unpackF2x11_1x10(uint32 p);\n\n\n\t/// First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values.\n\t/// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value.\n\t/// Then, the results are packed into the returned 32-bit unsigned integer.\n\t///\n\t/// The first vector component specifies the 11 least-significant bits of the result; \n\t/// the last component specifies the 10 most-significant bits.\n\t///\n\t/// packF3x9_E1x5 allows encoding into RGBE / RGB9E5 format\n\t///\n\t/// @see gtc_packing\n\t/// @see vec3 unpackF3x9_E1x5(uint32 const& p)\n\tGLM_FUNC_DECL uint32 packF3x9_E1x5(vec3 const& v);\n\n\t/// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value . \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector.\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t///\n\t/// unpackF3x9_E1x5 allows decoding RGBE / RGB9E5 data\n\t///\n\t/// @see gtc_packing\n\t/// @see uint32 packF3x9_E1x5(vec3 const& v)\n\tGLM_FUNC_DECL vec3 unpackF3x9_E1x5(uint32 p);\n\n\t/// Returns an unsigned integer vector obtained by converting the components of a floating-point vector\n\t/// to the 16-bit floating-point representation found in the OpenGL Specification.\n\t/// The first vector component specifies the 16 least-significant bits of the result; \n\t/// the forth component specifies the 16 most-significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& p)\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb);\n\n\t/// Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values.\n\t/// The first component of the vector is obtained from the 16 least-significant bits of v;\n\t/// the forth component is obtained from the 16 most-significant bits of v.\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec<4, T, Q> packRGBM(vec<3, float, Q> const& v)\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm);\n\n\t/// Returns an unsigned integer vector obtained by converting the components of a floating-point vector\n\t/// to the 16-bit floating-point representation found in the OpenGL Specification.\n\t/// The first vector component specifies the 16 least-significant bits of the result; \n\t/// the forth component specifies the 16 most-significant bits.\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec<L, float, Q> unpackHalf(vec<L, uint16, Q> const& p)\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, uint16, Q> packHalf(vec<L, float, Q> const& v);\n\n\t/// Returns a floating-point vector with components obtained by reinterpreting an integer vector as 16-bit floating-point numbers and converting them to 32-bit floating-point values.\n\t/// The first component of the vector is obtained from the 16 least-significant bits of v;\n\t/// the forth component is obtained from the 16 most-significant bits of v.\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec<L, uint16, Q> packHalf(vec<L, float, Q> const& v)\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, float, Q> unpackHalf(vec<L, uint16, Q> const& p);\n\n\t/// Convert each component of the normalized floating-point vector into unsigned integer values.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec<L, floatType, Q> unpackUnorm(vec<L, intType, Q> const& p);\n\ttemplate<typename uintType, length_t L, typename floatType, qualifier Q>\n\tGLM_FUNC_DECL vec<L, uintType, Q> packUnorm(vec<L, floatType, Q> const& v);\n\n\t/// Convert a packed integer to a normalized floating-point vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec<L, intType, Q> packUnorm(vec<L, floatType, Q> const& v)\n\ttemplate<typename floatType, length_t L, typename uintType, qualifier Q>\n\tGLM_FUNC_DECL vec<L, floatType, Q> unpackUnorm(vec<L, uintType, Q> const& v);\n\n\t/// Convert each component of the normalized floating-point vector into signed integer values.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec<L, floatType, Q> unpackSnorm(vec<L, intType, Q> const& p);\n\ttemplate<typename intType, length_t L, typename floatType, qualifier Q>\n\tGLM_FUNC_DECL vec<L, intType, Q> packSnorm(vec<L, floatType, Q> const& v);\n\n\t/// Convert a packed integer to a normalized floating-point vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see vec<L, intType, Q> packSnorm(vec<L, floatType, Q> const& v)\n\ttemplate<typename floatType, length_t L, typename intType, qualifier Q>\n\tGLM_FUNC_DECL vec<L, floatType, Q> unpackSnorm(vec<L, intType, Q> const& v);\n\n\t/// Convert each component of the normalized floating-point vector into unsigned integer values.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec2 unpackUnorm2x4(uint8 p)\n\tGLM_FUNC_DECL uint8 packUnorm2x4(vec2 const& v);\n\n\t/// Convert a packed integer to a normalized floating-point vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint8 packUnorm2x4(vec2 const& v)\n\tGLM_FUNC_DECL vec2 unpackUnorm2x4(uint8 p);\n\n\t/// Convert each component of the normalized floating-point vector into unsigned integer values.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec4 unpackUnorm4x4(uint16 p)\n\tGLM_FUNC_DECL uint16 packUnorm4x4(vec4 const& v);\n\n\t/// Convert a packed integer to a normalized floating-point vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint16 packUnorm4x4(vec4 const& v)\n\tGLM_FUNC_DECL vec4 unpackUnorm4x4(uint16 p);\n\n\t/// Convert each component of the normalized floating-point vector into unsigned integer values.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec3 unpackUnorm1x5_1x6_1x5(uint16 p)\n\tGLM_FUNC_DECL uint16 packUnorm1x5_1x6_1x5(vec3 const& v);\n\n\t/// Convert a packed integer to a normalized floating-point vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint16 packUnorm1x5_1x6_1x5(vec3 const& v)\n\tGLM_FUNC_DECL vec3 unpackUnorm1x5_1x6_1x5(uint16 p);\n\n\t/// Convert each component of the normalized floating-point vector into unsigned integer values.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec4 unpackUnorm3x5_1x1(uint16 p)\n\tGLM_FUNC_DECL uint16 packUnorm3x5_1x1(vec4 const& v);\n\n\t/// Convert a packed integer to a normalized floating-point vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint16 packUnorm3x5_1x1(vec4 const& v)\n\tGLM_FUNC_DECL vec4 unpackUnorm3x5_1x1(uint16 p);\n\n\t/// Convert each component of the normalized floating-point vector into unsigned integer values.\n\t///\n\t/// @see gtc_packing\n\t/// @see vec3 unpackUnorm2x3_1x2(uint8 p)\n\tGLM_FUNC_DECL uint8 packUnorm2x3_1x2(vec3 const& v);\n\n\t/// Convert a packed integer to a normalized floating-point vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint8 packUnorm2x3_1x2(vec3 const& v)\n\tGLM_FUNC_DECL vec3 unpackUnorm2x3_1x2(uint8 p);\n\n\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see i8vec2 unpackInt2x8(int16 p)\n\tGLM_FUNC_DECL int16 packInt2x8(i8vec2 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see int16 packInt2x8(i8vec2 const& v)\n\tGLM_FUNC_DECL i8vec2 unpackInt2x8(int16 p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see u8vec2 unpackInt2x8(uint16 p)\n\tGLM_FUNC_DECL uint16 packUint2x8(u8vec2 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint16 packInt2x8(u8vec2 const& v)\n\tGLM_FUNC_DECL u8vec2 unpackUint2x8(uint16 p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see i8vec4 unpackInt4x8(int32 p)\n\tGLM_FUNC_DECL int32 packInt4x8(i8vec4 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see int32 packInt2x8(i8vec4 const& v)\n\tGLM_FUNC_DECL i8vec4 unpackInt4x8(int32 p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see u8vec4 unpackUint4x8(uint32 p)\n\tGLM_FUNC_DECL uint32 packUint4x8(u8vec4 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint32 packUint4x8(u8vec2 const& v)\n\tGLM_FUNC_DECL u8vec4 unpackUint4x8(uint32 p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see i16vec2 unpackInt2x16(int p)\n\tGLM_FUNC_DECL int packInt2x16(i16vec2 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see int packInt2x16(i16vec2 const& v)\n\tGLM_FUNC_DECL i16vec2 unpackInt2x16(int p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see i16vec4 unpackInt4x16(int64 p)\n\tGLM_FUNC_DECL int64 packInt4x16(i16vec4 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see int64 packInt4x16(i16vec4 const& v)\n\tGLM_FUNC_DECL i16vec4 unpackInt4x16(int64 p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see u16vec2 unpackUint2x16(uint p)\n\tGLM_FUNC_DECL uint packUint2x16(u16vec2 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint packUint2x16(u16vec2 const& v)\n\tGLM_FUNC_DECL u16vec2 unpackUint2x16(uint p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see u16vec4 unpackUint4x16(uint64 p)\n\tGLM_FUNC_DECL uint64 packUint4x16(u16vec4 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see uint64 packUint4x16(u16vec4 const& v)\n\tGLM_FUNC_DECL u16vec4 unpackUint4x16(uint64 p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see i32vec2 unpackInt2x32(int p)\n\tGLM_FUNC_DECL int64 packInt2x32(i32vec2 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see int packInt2x16(i32vec2 const& v)\n\tGLM_FUNC_DECL i32vec2 unpackInt2x32(int64 p);\n\n\t/// Convert each component from an integer vector into a packed unsigned integer.\n\t///\n\t/// @see gtc_packing\n\t/// @see u32vec2 unpackUint2x32(int p)\n\tGLM_FUNC_DECL uint64 packUint2x32(u32vec2 const& v);\n\n\t/// Convert a packed integer into an integer vector.\n\t/// \n\t/// @see gtc_packing\n\t/// @see int packUint2x16(u32vec2 const& v)\n\tGLM_FUNC_DECL u32vec2 unpackUint2x32(uint64 p);\n\n\n\t/// @}\n}// namespace glm\n\n#include \"packing.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/packing.inl",
    "content": "/// @ref gtc_packing\n/// @file glm/gtc/packing.inl\n\n#include \"../common.hpp\"\n#include \"../vector_relational.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../detail/type_half.hpp\"\n#include <cstring>\n#include <limits>\n\nnamespace glm{\nnamespace detail\n{\n\tGLM_FUNC_QUALIFIER glm::uint16 float2half(glm::uint32 f)\n\t{\n\t\t// 10 bits    =>                         EE EEEFFFFF\n\t\t// 11 bits    =>                        EEE EEFFFFFF\n\t\t// Half bits  =>                   SEEEEEFF FFFFFFFF\n\t\t// Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n\t\t// 0x00007c00 => 00000000 00000000 01111100 00000000\n\t\t// 0x000003ff => 00000000 00000000 00000011 11111111\n\t\t// 0x38000000 => 00111000 00000000 00000000 00000000\n\t\t// 0x7f800000 => 01111111 10000000 00000000 00000000\n\t\t// 0x00008000 => 00000000 00000000 10000000 00000000\n\t\treturn\n\t\t\t((f >> 16) & 0x8000) | // sign\n\t\t\t((((f & 0x7f800000) - 0x38000000) >> 13) & 0x7c00) | // exponential\n\t\t\t((f >> 13) & 0x03ff); // Mantissa\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint32 float2packed11(glm::uint32 f)\n\t{\n\t\t// 10 bits    =>                         EE EEEFFFFF\n\t\t// 11 bits    =>                        EEE EEFFFFFF\n\t\t// Half bits  =>                   SEEEEEFF FFFFFFFF\n\t\t// Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n\t\t// 0x000007c0 => 00000000 00000000 00000111 11000000\n\t\t// 0x00007c00 => 00000000 00000000 01111100 00000000\n\t\t// 0x000003ff => 00000000 00000000 00000011 11111111\n\t\t// 0x38000000 => 00111000 00000000 00000000 00000000\n\t\t// 0x7f800000 => 01111111 10000000 00000000 00000000\n\t\t// 0x00008000 => 00000000 00000000 10000000 00000000\n\t\treturn\n\t\t\t((((f & 0x7f800000) - 0x38000000) >> 17) & 0x07c0) | // exponential\n\t\t\t((f >> 17) & 0x003f); // Mantissa\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint32 packed11ToFloat(glm::uint32 p)\n\t{\n\t\t// 10 bits    =>                         EE EEEFFFFF\n\t\t// 11 bits    =>                        EEE EEFFFFFF\n\t\t// Half bits  =>                   SEEEEEFF FFFFFFFF\n\t\t// Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n\t\t// 0x000007c0 => 00000000 00000000 00000111 11000000\n\t\t// 0x00007c00 => 00000000 00000000 01111100 00000000\n\t\t// 0x000003ff => 00000000 00000000 00000011 11111111\n\t\t// 0x38000000 => 00111000 00000000 00000000 00000000\n\t\t// 0x7f800000 => 01111111 10000000 00000000 00000000\n\t\t// 0x00008000 => 00000000 00000000 10000000 00000000\n\t\treturn\n\t\t\t((((p & 0x07c0) << 17) + 0x38000000) & 0x7f800000) | // exponential\n\t\t\t((p & 0x003f) << 17); // Mantissa\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint32 float2packed10(glm::uint32 f)\n\t{\n\t\t// 10 bits    =>                         EE EEEFFFFF\n\t\t// 11 bits    =>                        EEE EEFFFFFF\n\t\t// Half bits  =>                   SEEEEEFF FFFFFFFF\n\t\t// Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n\t\t// 0x0000001F => 00000000 00000000 00000000 00011111\n\t\t// 0x0000003F => 00000000 00000000 00000000 00111111\n\t\t// 0x000003E0 => 00000000 00000000 00000011 11100000\n\t\t// 0x000007C0 => 00000000 00000000 00000111 11000000\n\t\t// 0x00007C00 => 00000000 00000000 01111100 00000000\n\t\t// 0x000003FF => 00000000 00000000 00000011 11111111\n\t\t// 0x38000000 => 00111000 00000000 00000000 00000000\n\t\t// 0x7f800000 => 01111111 10000000 00000000 00000000\n\t\t// 0x00008000 => 00000000 00000000 10000000 00000000\n\t\treturn\n\t\t\t((((f & 0x7f800000) - 0x38000000) >> 18) & 0x03E0) | // exponential\n\t\t\t((f >> 18) & 0x001f); // Mantissa\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint32 packed10ToFloat(glm::uint32 p)\n\t{\n\t\t// 10 bits    =>                         EE EEEFFFFF\n\t\t// 11 bits    =>                        EEE EEFFFFFF\n\t\t// Half bits  =>                   SEEEEEFF FFFFFFFF\n\t\t// Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n\t\t// 0x0000001F => 00000000 00000000 00000000 00011111\n\t\t// 0x0000003F => 00000000 00000000 00000000 00111111\n\t\t// 0x000003E0 => 00000000 00000000 00000011 11100000\n\t\t// 0x000007C0 => 00000000 00000000 00000111 11000000\n\t\t// 0x00007C00 => 00000000 00000000 01111100 00000000\n\t\t// 0x000003FF => 00000000 00000000 00000011 11111111\n\t\t// 0x38000000 => 00111000 00000000 00000000 00000000\n\t\t// 0x7f800000 => 01111111 10000000 00000000 00000000\n\t\t// 0x00008000 => 00000000 00000000 10000000 00000000\n\t\treturn\n\t\t\t((((p & 0x03E0) << 18) + 0x38000000) & 0x7f800000) | // exponential\n\t\t\t((p & 0x001f) << 18); // Mantissa\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint half2float(glm::uint h)\n\t{\n\t\treturn ((h & 0x8000) << 16) | ((( h & 0x7c00) + 0x1C000) << 13) | ((h & 0x03FF) << 13);\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint floatTo11bit(float x)\n\t{\n\t\tif(x == 0.0f)\n\t\t\treturn 0u;\n\t\telse if(glm::isnan(x))\n\t\t\treturn ~0u;\n\t\telse if(glm::isinf(x))\n\t\t\treturn 0x1Fu << 6u;\n\n\t\tuint Pack = 0u;\n\t\tmemcpy(&Pack, &x, sizeof(Pack));\n\t\treturn float2packed11(Pack);\n\t}\n\n\tGLM_FUNC_QUALIFIER float packed11bitToFloat(glm::uint x)\n\t{\n\t\tif(x == 0)\n\t\t\treturn 0.0f;\n\t\telse if(x == ((1 << 11) - 1))\n\t\t\treturn ~0;//NaN\n\t\telse if(x == (0x1f << 6))\n\t\t\treturn ~0;//Inf\n\n\t\tuint Result = packed11ToFloat(x);\n\n\t\tfloat Temp = 0;\n\t\tmemcpy(&Temp, &Result, sizeof(Temp));\n\t\treturn Temp;\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint floatTo10bit(float x)\n\t{\n\t\tif(x == 0.0f)\n\t\t\treturn 0u;\n\t\telse if(glm::isnan(x))\n\t\t\treturn ~0u;\n\t\telse if(glm::isinf(x))\n\t\t\treturn 0x1Fu << 5u;\n\n\t\tuint Pack = 0;\n\t\tmemcpy(&Pack, &x, sizeof(Pack));\n\t\treturn float2packed10(Pack);\n\t}\n\n\tGLM_FUNC_QUALIFIER float packed10bitToFloat(glm::uint x)\n\t{\n\t\tif(x == 0)\n\t\t\treturn 0.0f;\n\t\telse if(x == ((1 << 10) - 1))\n\t\t\treturn ~0;//NaN\n\t\telse if(x == (0x1f << 5))\n\t\t\treturn ~0;//Inf\n\n\t\tuint Result = packed10ToFloat(x);\n\n\t\tfloat Temp = 0;\n\t\tmemcpy(&Temp, &Result, sizeof(Temp));\n\t\treturn Temp;\n\t}\n\n//\tGLM_FUNC_QUALIFIER glm::uint f11_f11_f10(float x, float y, float z)\n//\t{\n//\t\treturn ((floatTo11bit(x) & ((1 << 11) - 1)) << 0) |  ((floatTo11bit(y) & ((1 << 11) - 1)) << 11) | ((floatTo10bit(z) & ((1 << 10) - 1)) << 22);\n//\t}\n\n\tunion u3u3u2\n\t{\n\t\tstruct\n\t\t{\n\t\t\tuint x : 3;\n\t\t\tuint y : 3;\n\t\t\tuint z : 2;\n\t\t} data;\n\t\tuint8 pack;\n\t};\n\n\tunion u4u4\n\t{\n\t\tstruct\n\t\t{\n\t\t\tuint x : 4;\n\t\t\tuint y : 4;\n\t\t} data;\n\t\tuint8 pack;\n\t};\n\n\tunion u4u4u4u4\n\t{\n\t\tstruct\n\t\t{\n\t\t\tuint x : 4;\n\t\t\tuint y : 4;\n\t\t\tuint z : 4;\n\t\t\tuint w : 4;\n\t\t} data;\n\t\tuint16 pack;\n\t};\n\n\tunion u5u6u5\n\t{\n\t\tstruct\n\t\t{\n\t\t\tuint x : 5;\n\t\t\tuint y : 6;\n\t\t\tuint z : 5;\n\t\t} data;\n\t\tuint16 pack;\n\t};\n\n\tunion u5u5u5u1\n\t{\n\t\tstruct\n\t\t{\n\t\t\tuint x : 5;\n\t\t\tuint y : 5;\n\t\t\tuint z : 5;\n\t\t\tuint w : 1;\n\t\t} data;\n\t\tuint16 pack;\n\t};\n\n\tunion u10u10u10u2\n\t{\n\t\tstruct\n\t\t{\n\t\t\tuint x : 10;\n\t\t\tuint y : 10;\n\t\t\tuint z : 10;\n\t\t\tuint w : 2;\n\t\t} data;\n\t\tuint32 pack;\n\t};\n\n\tunion i10i10i10i2\n\t{\n\t\tstruct\n\t\t{\n\t\t\tint x : 10;\n\t\t\tint y : 10;\n\t\t\tint z : 10;\n\t\t\tint w : 2;\n\t\t} data;\n\t\tuint32 pack;\n\t};\n\n\tunion u9u9u9e5\n\t{\n\t\tstruct\n\t\t{\n\t\t\tuint x : 9;\n\t\t\tuint y : 9;\n\t\t\tuint z : 9;\n\t\t\tuint w : 5;\n\t\t} data;\n\t\tuint32 pack;\n\t};\n\n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_half\n\t{};\n\n\ttemplate<qualifier Q>\n\tstruct compute_half<1, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<1, uint16, Q> pack(vec<1, float, Q> const& v)\n\t\t{\n\t\t\tint16 const Unpack(detail::toFloat16(v.x));\n\t\t\tu16vec1 Packed;\n\t\t\tmemcpy(&Packed, &Unpack, sizeof(Packed));\n\t\t\treturn Packed;\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER static vec<1, float, Q> unpack(vec<1, uint16, Q> const& v)\n\t\t{\n\t\t\ti16vec1 Unpack;\n\t\t\tmemcpy(&Unpack, &v, sizeof(Unpack));\n\t\t\treturn vec<1, float, Q>(detail::toFloat32(v.x));\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_half<2, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<2, uint16, Q> pack(vec<2, float, Q> const& v)\n\t\t{\n\t\t\tvec<2, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y));\n\t\t\tu16vec2 Packed;\n\t\t\tmemcpy(&Packed, &Unpack, sizeof(Packed));\n\t\t\treturn Packed;\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER static vec<2, float, Q> unpack(vec<2, uint16, Q> const& v)\n\t\t{\n\t\t\ti16vec2 Unpack;\n\t\t\tmemcpy(&Unpack, &v, sizeof(Unpack));\n\t\t\treturn vec<2, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y));\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_half<3, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<3, uint16, Q> pack(vec<3, float, Q> const& v)\n\t\t{\n\t\t\tvec<3, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z));\n\t\t\tu16vec3 Packed;\n\t\t\tmemcpy(&Packed, &Unpack, sizeof(Packed));\n\t\t\treturn Packed;\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER static vec<3, float, Q> unpack(vec<3, uint16, Q> const& v)\n\t\t{\n\t\t\ti16vec3 Unpack;\n\t\t\tmemcpy(&Unpack, &v, sizeof(Unpack));\n\t\t\treturn vec<3, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z));\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_half<4, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, uint16, Q> pack(vec<4, float, Q> const& v)\n\t\t{\n\t\t\tvec<4, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z), detail::toFloat16(v.w));\n\t\t\tu16vec4 Packed;\n\t\t\tmemcpy(&Packed, &Unpack, sizeof(Packed));\n\t\t\treturn Packed;\n\t\t}\n\n\t\tGLM_FUNC_QUALIFIER static vec<4, float, Q> unpack(vec<4, uint16, Q> const& v)\n\t\t{\n\t\t\ti16vec4 Unpack;\n\t\t\tmemcpy(&Unpack, &v, sizeof(Unpack));\n\t\t\treturn vec<4, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z), detail::toFloat32(v.w));\n\t\t}\n\t};\n}//namespace detail\n\n\tGLM_FUNC_QUALIFIER uint8 packUnorm1x8(float v)\n\t{\n\t\treturn static_cast<uint8>(round(clamp(v, 0.0f, 1.0f) * 255.0f));\n\t}\n\t\n\tGLM_FUNC_QUALIFIER float unpackUnorm1x8(uint8 p)\n\t{\n\t\tfloat const Unpack(p);\n\t\treturn Unpack * static_cast<float>(0.0039215686274509803921568627451); // 1 / 255\n\t}\n\t\n\tGLM_FUNC_QUALIFIER uint16 packUnorm2x8(vec2 const& v)\n\t{\n\t\tu8vec2 const Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f));\n\n\t\tuint16 Unpack = 0;\n\t\tmemcpy(&Unpack, &Topack, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\t\n\tGLM_FUNC_QUALIFIER vec2 unpackUnorm2x8(uint16 p)\n\t{\n\t\tu8vec2 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn vec2(Unpack) * float(0.0039215686274509803921568627451); // 1 / 255\n\t}\n\n\tGLM_FUNC_QUALIFIER uint8 packSnorm1x8(float v)\n\t{\n\t\tint8 const Topack(static_cast<int8>(round(clamp(v ,-1.0f, 1.0f) * 127.0f)));\n\t\tuint8 Packed = 0;\n\t\tmemcpy(&Packed, &Topack, sizeof(Packed));\n\t\treturn Packed;\n\t}\n\t\n\tGLM_FUNC_QUALIFIER float unpackSnorm1x8(uint8 p)\n\t{\n\t\tint8 Unpack = 0;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn clamp(\n\t\t\tstatic_cast<float>(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f\n\t\t\t-1.0f, 1.0f);\n\t}\n\t\n\tGLM_FUNC_QUALIFIER uint16 packSnorm2x8(vec2 const& v)\n\t{\n\t\ti8vec2 const Topack(round(clamp(v, -1.0f, 1.0f) * 127.0f));\n\t\tuint16 Packed = 0;\n\t\tmemcpy(&Packed, &Topack, sizeof(Packed));\n\t\treturn Packed;\n\t}\n\t\n\tGLM_FUNC_QUALIFIER vec2 unpackSnorm2x8(uint16 p)\n\t{\n\t\ti8vec2 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn clamp(\n\t\t\tvec2(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f\n\t\t\t-1.0f, 1.0f);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint16 packUnorm1x16(float s)\n\t{\n\t\treturn static_cast<uint16>(round(clamp(s, 0.0f, 1.0f) * 65535.0f));\n\t}\n\n\tGLM_FUNC_QUALIFIER float unpackUnorm1x16(uint16 p)\n\t{\n\t\tfloat const Unpack(p);\n\t\treturn Unpack * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 packUnorm4x16(vec4 const& v)\n\t{\n\t\tu16vec4 const Topack(round(clamp(v , 0.0f, 1.0f) * 65535.0f));\n\t\tuint64 Packed = 0;\n\t\tmemcpy(&Packed, &Topack, sizeof(Packed));\n\t\treturn Packed;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec4 unpackUnorm4x16(uint64 p)\n\t{\n\t\tu16vec4 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn vec4(Unpack) * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0\n\t}\n\n\tGLM_FUNC_QUALIFIER uint16 packSnorm1x16(float v)\n\t{\n\t\tint16 const Topack = static_cast<int16>(round(clamp(v ,-1.0f, 1.0f) * 32767.0f));\n\t\tuint16 Packed = 0;\n\t\tmemcpy(&Packed, &Topack, sizeof(Packed));\n\t\treturn Packed;\n\t}\n\n\tGLM_FUNC_QUALIFIER float unpackSnorm1x16(uint16 p)\n\t{\n\t\tint16 Unpack = 0;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn clamp(\n\t\t\tstatic_cast<float>(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f, \n\t\t\t-1.0f, 1.0f);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 packSnorm4x16(vec4 const& v)\n\t{\n\t\ti16vec4 const Topack(round(clamp(v ,-1.0f, 1.0f) * 32767.0f));\n\t\tuint64 Packed = 0;\n\t\tmemcpy(&Packed, &Topack, sizeof(Packed));\n\t\treturn Packed;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec4 unpackSnorm4x16(uint64 p)\n\t{\n\t\ti16vec4 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn clamp(\n\t\t\tvec4(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f,\n\t\t\t-1.0f, 1.0f);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint16 packHalf1x16(float v)\n\t{\n\t\tint16 const Topack(detail::toFloat16(v));\n\t\tuint16 Packed = 0;\n\t\tmemcpy(&Packed, &Topack, sizeof(Packed));\n\t\treturn Packed;\n\t}\n\n\tGLM_FUNC_QUALIFIER float unpackHalf1x16(uint16 v)\n\t{\n\t\tint16 Unpack = 0;\n\t\tmemcpy(&Unpack, &v, sizeof(Unpack));\n\t\treturn detail::toFloat32(Unpack);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 packHalf4x16(glm::vec4 const& v)\n\t{\n\t\ti16vec4 const Unpack(\n\t\t\tdetail::toFloat16(v.x),\n\t\t\tdetail::toFloat16(v.y),\n\t\t\tdetail::toFloat16(v.z),\n\t\t\tdetail::toFloat16(v.w));\n\t\tuint64 Packed = 0;\n\t\tmemcpy(&Packed, &Unpack, sizeof(Packed));\n\t\treturn Packed;\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::vec4 unpackHalf4x16(uint64 v)\n\t{\n\t\ti16vec4 Unpack;\n\t\tmemcpy(&Unpack, &v, sizeof(Unpack));\n\t\treturn vec4(\n\t\t\tdetail::toFloat32(Unpack.x),\n\t\t\tdetail::toFloat32(Unpack.y),\n\t\t\tdetail::toFloat32(Unpack.z),\n\t\t\tdetail::toFloat32(Unpack.w));\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 packI3x10_1x2(ivec4 const& v)\n\t{\n\t\tdetail::i10i10i10i2 Result;\n\t\tResult.data.x = v.x;\n\t\tResult.data.y = v.y;\n\t\tResult.data.z = v.z;\n\t\tResult.data.w = v.w;\n\t\treturn Result.pack; \n\t}\n\n\tGLM_FUNC_QUALIFIER ivec4 unpackI3x10_1x2(uint32 v)\n\t{\n\t\tdetail::i10i10i10i2 Unpack;\n\t\tUnpack.pack = v;\n\t\treturn ivec4(\n\t\t\tUnpack.data.x,\n\t\t\tUnpack.data.y,\n\t\t\tUnpack.data.z,\n\t\t\tUnpack.data.w);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 packU3x10_1x2(uvec4 const& v)\n\t{\n\t\tdetail::u10u10u10u2 Result;\n\t\tResult.data.x = v.x;\n\t\tResult.data.y = v.y;\n\t\tResult.data.z = v.z;\n\t\tResult.data.w = v.w;\n\t\treturn Result.pack; \n\t}\n\n\tGLM_FUNC_QUALIFIER uvec4 unpackU3x10_1x2(uint32 v)\n\t{\n\t\tdetail::u10u10u10u2 Unpack;\n\t\tUnpack.pack = v;\n\t\treturn uvec4(\n\t\t\tUnpack.data.x,\n\t\t\tUnpack.data.y,\n\t\t\tUnpack.data.z,\n\t\t\tUnpack.data.w);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 packSnorm3x10_1x2(vec4 const& v)\n\t{\n\t\tivec4 const Pack(round(clamp(v,-1.0f, 1.0f) * vec4(511.f, 511.f, 511.f, 1.f)));\n\n\t\tdetail::i10i10i10i2 Result;\n\t\tResult.data.x = Pack.x;\n\t\tResult.data.y = Pack.y;\n\t\tResult.data.z = Pack.z;\n\t\tResult.data.w = Pack.w;\n\t\treturn Result.pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec4 unpackSnorm3x10_1x2(uint32 v)\n\t{\n\t\tdetail::i10i10i10i2 Unpack;\n\t\tUnpack.pack = v;\n\n\t\tvec4 const Result(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w);\n\n\t\treturn clamp(Result * vec4(1.f / 511.f, 1.f / 511.f, 1.f / 511.f, 1.f), -1.0f, 1.0f);\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 packUnorm3x10_1x2(vec4 const& v)\n\t{\n\t\tuvec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(1023.f, 1023.f, 1023.f, 3.f)));\n\n\t\tdetail::u10u10u10u2 Result;\n\t\tResult.data.x = Unpack.x;\n\t\tResult.data.y = Unpack.y;\n\t\tResult.data.z = Unpack.z;\n\t\tResult.data.w = Unpack.w;\n\t\treturn Result.pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec4 unpackUnorm3x10_1x2(uint32 v)\n\t{\n\t\tvec4 const ScaleFactors(1.0f / 1023.f, 1.0f / 1023.f, 1.0f / 1023.f, 1.0f / 3.f);\n\n\t\tdetail::u10u10u10u2 Unpack;\n\t\tUnpack.pack = v;\n\t\treturn vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactors;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 packF2x11_1x10(vec3 const& v)\n\t{\n\t\treturn\n\t\t\t((detail::floatTo11bit(v.x) & ((1 << 11) - 1)) <<  0) |\n\t\t\t((detail::floatTo11bit(v.y) & ((1 << 11) - 1)) << 11) |\n\t\t\t((detail::floatTo10bit(v.z) & ((1 << 10) - 1)) << 22);\n\t}\n\n\tGLM_FUNC_QUALIFIER vec3 unpackF2x11_1x10(uint32 v)\n\t{\n\t\treturn vec3(\n\t\t\tdetail::packed11bitToFloat(v >> 0),\n\t\t\tdetail::packed11bitToFloat(v >> 11),\n\t\t\tdetail::packed10bitToFloat(v >> 22));\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 packF3x9_E1x5(vec3 const& v)\n\t{\n\t\tfloat const SharedExpMax = (pow(2.0f, 9.0f - 1.0f) / pow(2.0f, 9.0f)) * pow(2.0f, 31.f - 15.f);\n\t\tvec3 const Color = clamp(v, 0.0f, SharedExpMax);\n\t\tfloat const MaxColor = max(Color.x, max(Color.y, Color.z));\n\n\t\tfloat const ExpSharedP = max(-15.f - 1.f, floor(log2(MaxColor))) + 1.0f + 15.f;\n\t\tfloat const MaxShared = floor(MaxColor / pow(2.0f, (ExpSharedP - 15.f - 9.f)) + 0.5f);\n\t\tfloat const ExpShared = detail::compute_equal<float>::call(MaxShared, pow(2.0f, 9.0f)) ? ExpSharedP + 1.0f : ExpSharedP;\n\n\t\tuvec3 const ColorComp(floor(Color / pow(2.f, (ExpShared - 15.f - 9.f)) + 0.5f));\n\n\t\tdetail::u9u9u9e5 Unpack;\n\t\tUnpack.data.x = ColorComp.x;\n\t\tUnpack.data.y = ColorComp.y;\n\t\tUnpack.data.z = ColorComp.z;\n\t\tUnpack.data.w = uint(ExpShared);\n\t\treturn Unpack.pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec3 unpackF3x9_E1x5(uint32 v)\n\t{\n\t\tdetail::u9u9u9e5 Unpack;\n\t\tUnpack.pack = v;\n\n\t\treturn vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * pow(2.0f, Unpack.data.w - 15.f - 9.f);\n\t}\n\n\t// Based on Brian Karis http://graphicrants.blogspot.fr/2009/04/rgbm-color-encoding.html\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb)\n\t{\n\t\tvec<3, T, Q> const Color(rgb * static_cast<T>(1.0 / 6.0));\n\t\tT Alpha = clamp(max(max(Color.x, Color.y), max(Color.z, static_cast<T>(1e-6))), static_cast<T>(0), static_cast<T>(1));\n\t\tAlpha = ceil(Alpha * static_cast<T>(255.0)) / static_cast<T>(255.0);\n\t\treturn vec<4, T, Q>(Color / Alpha, Alpha);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm)\n\t{\n\t\treturn vec<3, T, Q>(rgbm.x, rgbm.y, rgbm.z) * rgbm.w * static_cast<T>(6);\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, uint16, Q> packHalf(vec<L, float, Q> const& v)\n\t{\n\t\treturn detail::compute_half<L, Q>::pack(v);\n\t}\n\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, float, Q> unpackHalf(vec<L, uint16, Q> const& v)\n\t{\n\t\treturn detail::compute_half<L, Q>::unpack(v);\n\t}\n\n\ttemplate<typename uintType, length_t L, typename floatType, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, uintType, Q> packUnorm(vec<L, floatType, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<uintType>::is_integer, \"uintType must be an integer type\");\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, \"floatType must be a floating point type\");\n\n\t\treturn vec<L, uintType, Q>(round(clamp(v, static_cast<floatType>(0), static_cast<floatType>(1)) * static_cast<floatType>(std::numeric_limits<uintType>::max())));\n\t}\n\n\ttemplate<typename floatType, length_t L, typename uintType, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, floatType, Q> unpackUnorm(vec<L, uintType, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<uintType>::is_integer, \"uintType must be an integer type\");\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, \"floatType must be a floating point type\");\n\n\t\treturn vec<L, float, Q>(v) * (static_cast<floatType>(1) / static_cast<floatType>(std::numeric_limits<uintType>::max()));\n\t}\n\n\ttemplate<typename intType, length_t L, typename floatType, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, intType, Q> packSnorm(vec<L, floatType, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<intType>::is_integer, \"uintType must be an integer type\");\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, \"floatType must be a floating point type\");\n\n\t\treturn vec<L, intType, Q>(round(clamp(v , static_cast<floatType>(-1), static_cast<floatType>(1)) * static_cast<floatType>(std::numeric_limits<intType>::max())));\n\t}\n\n\ttemplate<typename floatType, length_t L, typename intType, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, floatType, Q> unpackSnorm(vec<L, intType, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<intType>::is_integer, \"uintType must be an integer type\");\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, \"floatType must be a floating point type\");\n\n\t\treturn clamp(vec<L, floatType, Q>(v) * (static_cast<floatType>(1) / static_cast<floatType>(std::numeric_limits<intType>::max())), static_cast<floatType>(-1), static_cast<floatType>(1));\n\t}\n\n\tGLM_FUNC_QUALIFIER uint8 packUnorm2x4(vec2 const& v)\n\t{\n\t\tu32vec2 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f));\n\t\tdetail::u4u4 Result;\n\t\tResult.data.x = Unpack.x;\n\t\tResult.data.y = Unpack.y;\n\t\treturn Result.pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec2 unpackUnorm2x4(uint8 v)\n\t{\n\t\tfloat const ScaleFactor(1.f / 15.f);\n\t\tdetail::u4u4 Unpack;\n\t\tUnpack.pack = v;\n\t\treturn vec2(Unpack.data.x, Unpack.data.y) * ScaleFactor;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint16 packUnorm4x4(vec4 const& v)\n\t{\n\t\tu32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f));\n\t\tdetail::u4u4u4u4 Result;\n\t\tResult.data.x = Unpack.x;\n\t\tResult.data.y = Unpack.y;\n\t\tResult.data.z = Unpack.z;\n\t\tResult.data.w = Unpack.w;\n\t\treturn Result.pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec4 unpackUnorm4x4(uint16 v)\n\t{\n\t\tfloat const ScaleFactor(1.f / 15.f);\n\t\tdetail::u4u4u4u4 Unpack;\n\t\tUnpack.pack = v;\n\t\treturn vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint16 packUnorm1x5_1x6_1x5(vec3 const& v)\n\t{\n\t\tu32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(31.f, 63.f, 31.f)));\n\t\tdetail::u5u6u5 Result;\n\t\tResult.data.x = Unpack.x;\n\t\tResult.data.y = Unpack.y;\n\t\tResult.data.z = Unpack.z;\n\t\treturn Result.pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec3 unpackUnorm1x5_1x6_1x5(uint16 v)\n\t{\n\t\tvec3 const ScaleFactor(1.f / 31.f, 1.f / 63.f, 1.f / 31.f);\n\t\tdetail::u5u6u5 Unpack;\n\t\tUnpack.pack = v;\n\t\treturn vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint16 packUnorm3x5_1x1(vec4 const& v)\n\t{\n\t\tu32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(31.f, 31.f, 31.f, 1.f)));\n\t\tdetail::u5u5u5u1 Result;\n\t\tResult.data.x = Unpack.x;\n\t\tResult.data.y = Unpack.y;\n\t\tResult.data.z = Unpack.z;\n\t\tResult.data.w = Unpack.w;\n\t\treturn Result.pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec4 unpackUnorm3x5_1x1(uint16 v)\n\t{\n\t\tvec4 const ScaleFactor(1.f / 31.f, 1.f / 31.f, 1.f / 31.f, 1.f);\n\t\tdetail::u5u5u5u1 Unpack;\n\t\tUnpack.pack = v;\n\t\treturn vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint8 packUnorm2x3_1x2(vec3 const& v)\n\t{\n\t\tu32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(7.f, 7.f, 3.f)));\n\t\tdetail::u3u3u2 Result;\n\t\tResult.data.x = Unpack.x;\n\t\tResult.data.y = Unpack.y;\n\t\tResult.data.z = Unpack.z;\n\t\treturn Result.pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER vec3 unpackUnorm2x3_1x2(uint8 v)\n\t{\n\t\tvec3 const ScaleFactor(1.f / 7.f, 1.f / 7.f, 1.f / 3.f);\n\t\tdetail::u3u3u2 Unpack;\n\t\tUnpack.pack = v;\n\t\treturn vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor;\n\t}\n\n\tGLM_FUNC_QUALIFIER int16 packInt2x8(i8vec2 const& v)\n\t{\n\t\tint16 Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER i8vec2 unpackInt2x8(int16 p)\n\t{\n\t\ti8vec2 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint16 packUint2x8(u8vec2 const& v)\n\t{\n\t\tuint16 Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER u8vec2 unpackUint2x8(uint16 p)\n\t{\n\t\tu8vec2 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER int32 packInt4x8(i8vec4 const& v)\n\t{\n\t\tint32 Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER i8vec4 unpackInt4x8(int32 p)\n\t{\n\t\ti8vec4 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint32 packUint4x8(u8vec4 const& v)\n\t{\n\t\tuint32 Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER u8vec4 unpackUint4x8(uint32 p)\n\t{\n\t\tu8vec4 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER int packInt2x16(i16vec2 const& v)\n\t{\n\t\tint Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER i16vec2 unpackInt2x16(int p)\n\t{\n\t\ti16vec2 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER int64 packInt4x16(i16vec4 const& v)\n\t{\n\t\tint64 Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER i16vec4 unpackInt4x16(int64 p)\n\t{\n\t\ti16vec4 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint packUint2x16(u16vec2 const& v)\n\t{\n\t\tuint Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER u16vec2 unpackUint2x16(uint p)\n\t{\n\t\tu16vec2 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 packUint4x16(u16vec4 const& v)\n\t{\n\t\tuint64 Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER u16vec4 unpackUint4x16(uint64 p)\n\t{\n\t\tu16vec4 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER int64 packInt2x32(i32vec2 const& v)\n\t{\n\t\tint64 Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER i32vec2 unpackInt2x32(int64 p)\n\t{\n\t\ti32vec2 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint64 packUint2x32(u32vec2 const& v)\n\t{\n\t\tuint64 Pack = 0;\n\t\tmemcpy(&Pack, &v, sizeof(Pack));\n\t\treturn Pack;\n\t}\n\n\tGLM_FUNC_QUALIFIER u32vec2 unpackUint2x32(uint64 p)\n\t{\n\t\tu32vec2 Unpack;\n\t\tmemcpy(&Unpack, &p, sizeof(Unpack));\n\t\treturn Unpack;\n\t}\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/gtc/quaternion.hpp",
    "content": "/// @ref gtc_quaternion\n/// @file glm/gtc/quaternion.hpp\n///\n/// @see core (dependence)\n/// @see gtc_constants (dependence)\n///\n/// @defgroup gtc_quaternion GLM_GTC_quaternion\n/// @ingroup gtc\n///\n/// Include <glm/gtc/quaternion.hpp> to use the features of this extension.\n///\n/// Defines a templated quaternion type and several quaternion operations.\n\n#pragma once\n\n// Dependency:\n#include \"../mat3x3.hpp\"\n#include \"../mat4x4.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../gtc/constants.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_quaternion extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_quaternion\n\t/// @{\n\n\ttemplate<typename T, qualifier Q = defaultp>\n\tstruct tquat\n\t{\n\t\t// -- Implementation detail --\n\n\t\ttypedef tquat<T, Q> type;\n\t\ttypedef T value_type;\n\n\t\t// -- Data --\n\n#\t\tif GLM_HAS_ALIGNED_TYPE\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic push\n#\t\t\t\tpragma GCC diagnostic ignored \"-Wpedantic\"\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic push\n#\t\t\t\tpragma clang diagnostic ignored \"-Wgnu-anonymous-struct\"\n#\t\t\t\tpragma clang diagnostic ignored \"-Wnested-anon-types\"\n#\t\t\tendif\n\t\t\n\t\t\tunion\n\t\t\t{\n\t\t\t\tstruct { T x, y, z, w;};\n\t\t\t\ttypename detail::storage<T, sizeof(T) * 4, detail::is_aligned<Q>::value>::type data;\n\t\t\t};\n\t\t\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\t\t\tpragma clang diagnostic pop\n#\t\t\tendif\n#\t\t\tif GLM_COMPILER & GLM_COMPILER_GCC\n#\t\t\t\tpragma GCC diagnostic pop\n#\t\t\tendif\n#\t\telse\n\t\t\tT x, y, z, w;\n#\t\tendif\n\n\t\t// -- Component accesses --\n\n\t\ttypedef length_t length_type;\n\t\t/// Return the count of components of a quaternion\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;}\n\n\t\tGLM_FUNC_DECL T & operator[](length_type i);\n\t\tGLM_FUNC_DECL T const& operator[](length_type i) const;\n\n\t\t// -- Implicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tquat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat<T, Q> const& q) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tquat(tquat<T, P> const& q);\n\n\t\t// -- Explicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tquat(T s, vec<3, T, Q> const& v);\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tquat(T w, T x, T y, T z);\n\n\t\t// -- Conversion constructors --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tquat(tquat<U, P> const& q);\n\n\t\t/// Explicit conversion operators\n#\t\tif GLM_HAS_EXPLICIT_CONVERSION_OPERATORS\n\t\t\tGLM_FUNC_DECL explicit operator mat<3, 3, T, Q>();\n\t\t\tGLM_FUNC_DECL explicit operator mat<4, 4, T, Q>();\n#\t\tendif\n\n\t\t/// Create a quaternion from two normalized axis\n\t\t///\n\t\t/// @param u A first normalized axis\n\t\t/// @param v A second normalized axis\n\t\t/// @see gtc_quaternion\n\t\t/// @see http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors\n\t\tGLM_FUNC_DECL tquat(vec<3, T, Q> const& u, vec<3, T, Q> const& v);\n\n\t\t/// Build a quaternion from euler angles (pitch, yaw, roll), in radians.\n\t\tGLM_FUNC_DECL GLM_EXPLICIT tquat(vec<3, T, Q> const& eulerAngles);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT tquat(mat<3, 3, T, Q> const& q);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT tquat(mat<4, 4, T, Q> const& q);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL tquat<T, Q> & operator=(tquat<T, Q> const& q) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tquat<T, Q> & operator=(tquat<U, Q> const& q);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tquat<T, Q> & operator+=(tquat<U, Q> const& q);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tquat<T, Q> & operator-=(tquat<U, Q> const& q);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tquat<T, Q> & operator*=(tquat<U, Q> const& q);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tquat<T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tquat<T, Q> & operator/=(U s);\n\t};\n\n\t// -- Unary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> operator+(tquat<T, Q> const& q);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> operator-(tquat<T, Q> const& q);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> operator+(tquat<T, Q> const& q, tquat<T, Q> const& p);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> operator*(tquat<T, Q> const& q, tquat<T, Q> const& p);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(tquat<T, Q> const& q, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, tquat<T, Q> const& q);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(tquat<T, Q> const& q, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, tquat<T, Q> const& q);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> operator*(tquat<T, Q> const& q, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> operator*(T const& s, tquat<T, Q> const& q);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> operator/(tquat<T, Q> const& q, T const& s);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(tquat<T, Q> const& q1, tquat<T, Q> const& q2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(tquat<T, Q> const& q1, tquat<T, Q> const& q2);\n\n\t/// Returns the length of the quaternion.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T length(tquat<T, Q> const& q);\n\n\t/// Returns the normalized quaternion.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> normalize(tquat<T, Q> const& q);\n\t\t\n\t/// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T dot(tquat<T, Q> const& x, tquat<T, Q> const& y);\n\n\t/// Spherical linear interpolation of two quaternions.\n\t/// The interpolation is oriented and the rotation is performed at constant speed.\n\t/// For short path spherical linear interpolation, use the slerp function.\n\t/// \n\t/// @param x A quaternion\n\t/// @param y A quaternion\n\t/// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1].\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see - slerp(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& a)\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> mix(tquat<T, Q> const& x, tquat<T, Q> const& y, T a);\n\n\t/// Linear interpolation of two quaternions.\n\t/// The interpolation is oriented.\n\t/// \n\t/// @param x A quaternion\n\t/// @param y A quaternion\n\t/// @param a Interpolation factor. The interpolation is defined in the range [0, 1].\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> lerp(tquat<T, Q> const& x, tquat<T, Q> const& y, T a);\n\n\t/// Spherical linear interpolation of two quaternions.\n\t/// The interpolation always take the short path and the rotation is performed at constant speed.\n\t/// \n\t/// @param x A quaternion\n\t/// @param y A quaternion\n\t/// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1].\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> slerp(tquat<T, Q> const& x, tquat<T, Q> const& y, T a);\n\n\t/// Returns the q conjugate.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> conjugate(tquat<T, Q> const& q);\n\n\t/// Returns the q inverse.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> inverse(tquat<T, Q> const& q);\n\n\t/// Rotates a quaternion from a vector of 3 components axis and an angle.\n\t/// \n\t/// @param q Source orientation\n\t/// @param angle Angle expressed in radians.\n\t/// @param axis Axis of the rotation\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> rotate(tquat<T, Q> const& q, T const& angle, vec<3, T, Q> const& axis);\n\n\t/// Returns euler angles, pitch as x, yaw as y, roll as z.\n\t/// The result is expressed in radians.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> eulerAngles(tquat<T, Q> const& x);\n\n\t/// Returns roll value of euler angles expressed in radians.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T roll(tquat<T, Q> const& x);\n\n\t/// Returns pitch value of euler angles expressed in radians.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T pitch(tquat<T, Q> const& x);\n\n\t/// Returns yaw value of euler angles expressed in radians.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T yaw(tquat<T, Q> const& x);\n\n\t/// Converts a quaternion to a 3 * 3 matrix.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> mat3_cast(tquat<T, Q> const& x);\n\n\t/// Converts a quaternion to a 4 * 4 matrix.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> mat4_cast(tquat<T, Q> const& x);\n\n\t/// Converts a 3 * 3 matrix to a quaternion.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> quat_cast(mat<3, 3, T, Q> const& x);\n\n\t/// Converts a 4 * 4 matrix to a quaternion.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> quat_cast(mat<4, 4, T, Q> const& x);\n\n\t/// Returns the quaternion rotation angle.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T angle(tquat<T, Q> const& x);\n\n\t/// Returns the q rotation axis.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> axis(tquat<T, Q> const& x);\n\n\t/// Build a quaternion from an angle and a normalized axis.\n\t///\n\t/// @param angle Angle expressed in radians.\n\t/// @param axis Axis of the quaternion, must be normalized.\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> angleAxis(T const& angle, vec<3, T, Q> const& axis);\n\n\t/// Returns the component-wise comparison result of x < y.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> lessThan(tquat<T, Q> const& x, tquat<T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x <= y.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> lessThanEqual(tquat<T, Q> const& x, tquat<T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x > y.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> greaterThan(tquat<T, Q> const& x, tquat<T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x >= y.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> greaterThanEqual(tquat<T, Q> const& x, tquat<T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x == y.\n\t///\n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> equal(tquat<T, Q> const& x, tquat<T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x != y.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> notEqual(tquat<T, Q> const& x, tquat<T, Q> const& y);\n\n\t/// Returns true if x holds a NaN (not a number)\n\t/// representation in the underlying implementation's set of\n\t/// floating point representations. Returns false otherwise,\n\t/// including for implementations with no NaN\n\t/// representations.\n\t/// \n\t/// /!\\ When using compiler fast math, this function may fail.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> isnan(tquat<T, Q> const& x);\n\n\t/// Returns true if x holds a positive infinity or negative\n\t/// infinity representation in the underlying implementation's\n\t/// set of floating point representations. Returns false\n\t/// otherwise, including for implementations with no infinity\n\t/// representations.\n\t/// \n\t/// @tparam T Floating-point scalar types.\n\t///\n\t/// @see gtc_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, bool, Q> isinf(tquat<T, Q> const& x);\n\n\t/// @}\n} //namespace glm\n\n#include \"quaternion.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/quaternion.inl",
    "content": "/// @ref gtc_quaternion\n/// @file glm/gtc/quaternion.inl\n\n#include \"../trigonometric.hpp\"\n#include \"../geometric.hpp\"\n#include \"../exponential.hpp\"\n#include \"../detail/compute_vector_relational.hpp\"\n#include \"epsilon.hpp\"\n#include <limits>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_dot<tquat<T, Q>, T, Aligned>\n\t{\n\t\tstatic GLM_FUNC_QUALIFIER T call(tquat<T, Q> const& a, tquat<T, Q> const& b)\n\t\t{\n\t\t\tvec<4, T, Q> tmp(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);\n\t\t\treturn (tmp.x + tmp.y) + (tmp.z + tmp.w);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_quat_add\n\t{\n\t\tstatic tquat<T, Q> call(tquat<T, Q> const& q, tquat<T, Q> const& p)\n\t\t{\n\t\t\treturn tquat<T, Q>(q.w + p.w, q.x + p.x, q.y + p.y, q.z + p.z);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_quat_sub\n\t{\n\t\tstatic tquat<T, Q> call(tquat<T, Q> const& q, tquat<T, Q> const& p)\n\t\t{\n\t\t\treturn tquat<T, Q>(q.w - p.w, q.x - p.x, q.y - p.y, q.z - p.z);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_quat_mul_scalar\n\t{\n\t\tstatic tquat<T, Q> call(tquat<T, Q> const& q, T s)\n\t\t{\n\t\t\treturn tquat<T, Q>(q.w * s, q.x * s, q.y * s, q.z * s);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_quat_div_scalar\n\t{\n\t\tstatic tquat<T, Q> call(tquat<T, Q> const& q, T s)\n\t\t{\n\t\t\treturn tquat<T, Q>(q.w / s, q.x / s, q.y / s, q.z / s);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_quat_mul_vec4\n\t{\n\t\tstatic vec<4, T, Q> call(tquat<T, Q> const& q, vec<4, T, Q> const& v)\n\t\t{\n\t\t\treturn vec<4, T, Q>(q * vec<3, T, Q>(v), v.w);\n\t\t}\n\t};\n}//namespace detail\n\n\t// -- Component accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T & tquat<T, Q>::operator[](typename tquat<T, Q>::length_type i)\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const& tquat<T, Q>::operator[](typename tquat<T, Q>::length_type i) const\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&x)[i];\n\t}\n\n\t// -- Implicit basic constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(tquat<T, Q> const& q)\n\t\t\t: x(q.x), y(q.y), z(q.z), w(q.w)\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(tquat<T, P> const& q)\n\t\t: x(q.x), y(q.y), z(q.z), w(q.w)\n\t{}\n\n\t// -- Explicit basic constructors --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(T s, vec<3, T, Q> const& v)\n\t\t: x(v.x), y(v.y), z(v.z), w(s)\n\t{}\n\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(T _w, T _x, T _y, T _z)\n\t\t: x(_x), y(_y), z(_z), w(_w)\n\t{}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tquat<T, Q>::tquat(tquat<U, P> const& q)\n\t\t: x(static_cast<T>(q.x))\n\t\t, y(static_cast<T>(q.y))\n\t\t, z(static_cast<T>(q.z))\n\t\t, w(static_cast<T>(q.w))\n\t{}\n\n\t//template<typename valType> \n\t//GLM_FUNC_QUALIFIER tquat<valType>::tquat\n\t//(\n\t//\tvalType const& pitch,\n\t//\tvalType const& yaw,\n\t//\tvalType const& roll\n\t//)\n\t//{\n\t//\tvec<3, valType> eulerAngle(pitch * valType(0.5), yaw * valType(0.5), roll * valType(0.5));\n\t//\tvec<3, valType> c = glm::cos(eulerAngle * valType(0.5));\n\t//\tvec<3, valType> s = glm::sin(eulerAngle * valType(0.5));\n\t//\t\n\t//\tthis->w = c.x * c.y * c.z + s.x * s.y * s.z;\n\t//\tthis->x = s.x * c.y * c.z - c.x * s.y * s.z;\n\t//\tthis->y = c.x * s.y * c.z + s.x * c.y * s.z;\n\t//\tthis->z = c.x * c.y * s.z - s.x * s.y * c.z;\n\t//}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q>::tquat(vec<3, T, Q> const& u, vec<3, T, Q> const& v)\n\t{\n\t\tT norm_u_norm_v = sqrt(dot(u, u) * dot(v, v));\n\t\tT real_part = norm_u_norm_v + dot(u, v);\n\t\tvec<3, T, Q> t;\n\n\t\tif(real_part < static_cast<T>(1.e-6f) * norm_u_norm_v)\n\t\t{\n\t\t\t// If u and v are exactly opposite, rotate 180 degrees\n\t\t\t// around an arbitrary orthogonal axis. Axis normalisation\n\t\t\t// can happen later, when we normalise the quaternion.\n\t\t\treal_part = static_cast<T>(0);\n\t\t\tt = abs(u.x) > abs(u.z) ? vec<3, T, Q>(-u.y, u.x, static_cast<T>(0)) : vec<3, T, Q>(static_cast<T>(0), -u.z, u.y);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Otherwise, build quaternion the standard way.\n\t\t\tt = cross(u, v);\n\t\t}\n\n\t    *this = normalize(tquat<T, Q>(real_part, t.x, t.y, t.z));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q>::tquat(vec<3, T, Q> const& eulerAngle)\n\t{\n\t\tvec<3, T, Q> c = glm::cos(eulerAngle * T(0.5));\n\t\tvec<3, T, Q> s = glm::sin(eulerAngle * T(0.5));\n\t\t\n\t\tthis->w = c.x * c.y * c.z + s.x * s.y * s.z;\n\t\tthis->x = s.x * c.y * c.z - c.x * s.y * s.z;\n\t\tthis->y = c.x * s.y * c.z + s.x * c.y * s.z;\n\t\tthis->z = c.x * c.y * s.z - s.x * s.y * c.z;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q>::tquat(mat<3, 3, T, Q> const& m)\n\t{\n\t\t*this = quat_cast(m);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q>::tquat(mat<4, 4, T, Q> const& m)\n\t{\n\t\t*this = quat_cast(m);\n\t}\n\n#\tif GLM_HAS_EXPLICIT_CONVERSION_OPERATORS\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q>::operator mat<3, 3, T, Q>()\n\t{\n\t\treturn mat3_cast(*this);\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\t\n\tGLM_FUNC_QUALIFIER tquat<T, Q>::operator mat<4, 4, T, Q>()\n\t{\n\t\treturn mat4_cast(*this);\n\t}\n#\tendif//GLM_HAS_EXPLICIT_CONVERSION_OPERATORS\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> conjugate(tquat<T, Q> const& q)\n\t{\n\t\treturn tquat<T, Q>(q.w, -q.x, -q.y, -q.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> inverse(tquat<T, Q> const& q)\n\t{\n\t\treturn conjugate(q) / dot(q, q);\n\t}\n\n\t// -- Unary arithmetic operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator=(tquat<T, Q> const& q)\n\t\t{\n\t\t\tthis->w = q.w;\n\t\t\tthis->x = q.x;\n\t\t\tthis->y = q.y;\n\t\t\tthis->z = q.z;\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator=(tquat<U, Q> const& q)\n\t{\n\t\tthis->w = static_cast<T>(q.w);\n\t\tthis->x = static_cast<T>(q.x);\n\t\tthis->y = static_cast<T>(q.y);\n\t\tthis->z = static_cast<T>(q.z);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator+=(tquat<U, Q> const& q)\n\t{\n\t\treturn (*this = detail::compute_quat_add<T, Q, detail::is_aligned<Q>::value>::call(*this, tquat<T, Q>(q)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator-=(tquat<U, Q> const& q)\n\t{\n\t\treturn (*this = detail::compute_quat_sub<T, Q, detail::is_aligned<Q>::value>::call(*this, tquat<T, Q>(q)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator*=(tquat<U, Q> const& r)\n\t{\n\t\ttquat<T, Q> const p(*this);\n\t\ttquat<T, Q> const q(r);\n\n\t\tthis->w = p.w * q.w - p.x * q.x - p.y * q.y - p.z * q.z;\n\t\tthis->x = p.w * q.x + p.x * q.w + p.y * q.z - p.z * q.y;\n\t\tthis->y = p.w * q.y + p.y * q.w + p.z * q.x - p.x * q.z;\n\t\tthis->z = p.w * q.z + p.z * q.w + p.x * q.y - p.y * q.x;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator*=(U s)\n\t{\n\t\treturn (*this = detail::compute_quat_mul_scalar<T, Q, detail::is_aligned<Q>::value>::call(*this, static_cast<U>(s)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> & tquat<T, Q>::operator/=(U s)\n\t{\n\t\treturn (*this = detail::compute_quat_div_scalar<T, Q, detail::is_aligned<Q>::value>::call(*this, static_cast<U>(s)));\n\t}\n\n\t// -- Unary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> operator+(tquat<T, Q> const& q)\n\t{\n\t\treturn q;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> operator-(tquat<T, Q> const& q)\n\t{\n\t\treturn tquat<T, Q>(-q.w, -q.x, -q.y, -q.z);\n\t}\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> operator+(tquat<T, Q> const& q, tquat<T, Q> const& p)\n\t{\n\t\treturn tquat<T, Q>(q) += p;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> operator*(tquat<T, Q> const& q, tquat<T, Q> const& p)\n\t{\n\t\treturn tquat<T, Q>(q) *= p;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(tquat<T, Q> const& q, vec<3, T, Q> const& v)\n\t{\n\t\tvec<3, T, Q> const QuatVector(q.x, q.y, q.z);\n\t\tvec<3, T, Q> const uv(glm::cross(QuatVector, v));\n\t\tvec<3, T, Q> const uuv(glm::cross(QuatVector, uv));\n\n\t\treturn v + ((uv * q.w) + uuv) * static_cast<T>(2);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, tquat<T, Q> const& q)\n\t{\n\t\treturn glm::inverse(q) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(tquat<T, Q> const& q, vec<4, T, Q> const& v)\n\t{\n\t\treturn detail::compute_quat_mul_vec4<T, Q, detail::is_aligned<Q>::value>::call(q, v);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v, tquat<T, Q> const& q)\n\t{\n\t\treturn glm::inverse(q) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> operator*(tquat<T, Q> const& q, T const& s)\n\t{\n\t\treturn tquat<T, Q>(\n\t\t\tq.w * s, q.x * s, q.y * s, q.z * s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> operator*(T const& s, tquat<T, Q> const& q)\n\t{\n\t\treturn q * s;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> operator/(tquat<T, Q> const& q, T const& s)\n\t{\n\t\treturn tquat<T, Q>(\n\t\t\tq.w / s, q.x / s, q.y / s, q.z / s);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(tquat<T, Q> const& q1, tquat<T, Q> const& q2)\n\t{\n\t\treturn all(epsilonEqual(q1, q2, epsilon<T>()));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(tquat<T, Q> const& q1, tquat<T, Q> const& q2)\n\t{\n\t\treturn any(epsilonNotEqual(q1, q2, epsilon<T>()));\n\t}\n\n\t// -- Operations --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T dot(tquat<T, Q> const& x, tquat<T, Q> const& y)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'dot' accepts only floating-point inputs\");\n\t\treturn detail::compute_dot<tquat<T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T length(tquat<T, Q> const& q)\n\t{\n\t\treturn glm::sqrt(dot(q, q));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> normalize(tquat<T, Q> const& q)\n\t{\n\t\tT len = length(q);\n\t\tif(len <= T(0)) // Problem\n\t\t\treturn tquat<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0));\n\t\tT oneOverLen = T(1) / len;\n\t\treturn tquat<T, Q>(q.w * oneOverLen, q.x * oneOverLen, q.y * oneOverLen, q.z * oneOverLen);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> cross(tquat<T, Q> const& q1, tquat<T, Q> const& q2)\n\t{\n\t\treturn tquat<T, Q>(\n\t\t\tq1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z,\n\t\t\tq1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,\n\t\t\tq1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z,\n\t\t\tq1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x);\n\t}\n/*\n\t// (x * sin(1 - a) * angle / sin(angle)) + (y * sin(a) * angle / sin(angle))\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> mix(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& a)\n\t{\n\t\tif(a <= T(0)) return x;\n\t\tif(a >= T(1)) return y;\n\n\t\tfloat fCos = dot(x, y);\n\t\ttquat<T, Q> y2(y); //BUG!!! tquat<T, Q> y2;\n\t\tif(fCos < T(0))\n\t\t{\n\t\t\ty2 = -y;\n\t\t\tfCos = -fCos;\n\t\t}\n\n\t\t//if(fCos > 1.0f) // problem\n\t\tfloat k0, k1;\n\t\tif(fCos > T(0.9999))\n\t\t{\n\t\t\tk0 = T(1) - a;\n\t\t\tk1 = T(0) + a; //BUG!!! 1.0f + a;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tT fSin = sqrt(T(1) - fCos * fCos);\n\t\t\tT fAngle = atan(fSin, fCos);\n\t\t\tT fOneOverSin = static_cast<T>(1) / fSin;\n\t\t\tk0 = sin((T(1) - a) * fAngle) * fOneOverSin;\n\t\t\tk1 = sin((T(0) + a) * fAngle) * fOneOverSin;\n\t\t}\n\n\t\treturn tquat<T, Q>(\n\t\t\tk0 * x.w + k1 * y2.w,\n\t\t\tk0 * x.x + k1 * y2.x,\n\t\t\tk0 * x.y + k1 * y2.y,\n\t\t\tk0 * x.z + k1 * y2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> mix2\n\t(\n\t\ttquat<T, Q> const& x, \n\t\ttquat<T, Q> const& y, \n\t\tT const& a\n\t)\n\t{\n\t\tbool flip = false;\n\t\tif(a <= static_cast<T>(0)) return x;\n\t\tif(a >= static_cast<T>(1)) return y;\n\n\t\tT cos_t = dot(x, y);\n\t\tif(cos_t < T(0))\n\t\t{\n\t\t\tcos_t = -cos_t;\n\t\t\tflip = true;\n\t\t}\n\n\t\tT alpha(0), beta(0);\n\n\t\tif(T(1) - cos_t < 1e-7)\n\t\t\tbeta = static_cast<T>(1) - alpha;\n\t\telse\n\t\t{\n\t\t\tT theta = acos(cos_t);\n\t\t\tT sin_t = sin(theta);\n\t\t\tbeta = sin(theta * (T(1) - alpha)) / sin_t;\n\t\t\talpha = sin(alpha * theta) / sin_t;\n\t\t}\n\n\t\tif(flip)\n\t\t\talpha = -alpha;\n\t\t\n\t\treturn normalize(beta * x + alpha * y);\n\t}\n*/\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> mix(tquat<T, Q> const& x, tquat<T, Q> const& y, T a)\n\t{\n\t\tT cosTheta = dot(x, y);\n\n\t\t// Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator\n\t\tif(cosTheta > T(1) - epsilon<T>())\n\t\t{\n\t\t\t// Linear interpolation\n\t\t\treturn tquat<T, Q>(\n\t\t\t\tmix(x.w, y.w, a),\n\t\t\t\tmix(x.x, y.x, a),\n\t\t\t\tmix(x.y, y.y, a),\n\t\t\t\tmix(x.z, y.z, a));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Essential Mathematics, page 467\n\t\t\tT angle = acos(cosTheta);\n\t\t\treturn (sin((T(1) - a) * angle) * x + sin(a * angle) * y) / sin(angle);\n\t\t}\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> lerp(tquat<T, Q> const& x, tquat<T, Q> const& y, T a)\n\t{\n\t\t// Lerp is only defined in [0, 1]\n\t\tassert(a >= static_cast<T>(0));\n\t\tassert(a <= static_cast<T>(1));\n\n\t\treturn x * (T(1) - a) + (y * a);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> slerp(tquat<T, Q> const& x,\ttquat<T, Q> const& y, T a)\n\t{\n\t\ttquat<T, Q> z = y;\n\n\t\tT cosTheta = dot(x, y);\n\n\t\t// If cosTheta < 0, the interpolation will take the long way around the sphere. \n\t\t// To fix this, one quat must be negated.\n\t\tif (cosTheta < T(0))\n\t\t{\n\t\t\tz        = -y;\n\t\t\tcosTheta = -cosTheta;\n\t\t}\n\n\t\t// Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator\n\t\tif(cosTheta > T(1) - epsilon<T>())\n\t\t{\n\t\t\t// Linear interpolation\n\t\t\treturn tquat<T, Q>(\n\t\t\t\tmix(x.w, z.w, a),\n\t\t\t\tmix(x.x, z.x, a),\n\t\t\t\tmix(x.y, z.y, a),\n\t\t\t\tmix(x.z, z.z, a));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Essential Mathematics, page 467\n\t\t\tT angle = acos(cosTheta);\n\t\t\treturn (sin((T(1) - a) * angle) * x + sin(a * angle) * z) / sin(angle);\n\t\t}\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> rotate(tquat<T, Q> const& q, T const& angle, vec<3, T, Q> const& v)\n\t{\n\t\tvec<3, T, Q> Tmp = v;\n\n\t\t// Axis of rotation must be normalised\n\t\tT len = glm::length(Tmp);\n\t\tif(abs(len - T(1)) > T(0.001))\n\t\t{\n\t\t\tT oneOverLen = static_cast<T>(1) / len;\n\t\t\tTmp.x *= oneOverLen;\n\t\t\tTmp.y *= oneOverLen;\n\t\t\tTmp.z *= oneOverLen;\n\t\t}\n\n\t\tT const AngleRad(angle);\n\t\tT const Sin = sin(AngleRad * T(0.5));\n\n\t\treturn q * tquat<T, Q>(cos(AngleRad * T(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin);\n\t\t//return gtc::quaternion::cross(q, tquat<T, Q>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> eulerAngles(tquat<T, Q> const& x)\n\t{\n\t\treturn vec<3, T, Q>(pitch(x), yaw(x), roll(x));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T roll(tquat<T, Q> const& q)\n\t{\n\t\treturn static_cast<T>(atan(static_cast<T>(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T pitch(tquat<T, Q> const& q)\n\t{\n\t\t//return T(atan(T(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z));\n\t\tconst T y = static_cast<T>(2) * (q.y * q.z + q.w * q.x);\n\t\tconst T x = q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z;\n\n\t\tif(detail::compute_equal<T>::call(y, static_cast<T>(0)) && detail::compute_equal<T>::call(x, static_cast<T>(0))) //avoid atan2(0,0) - handle singularity - Matiis\n\t\t\treturn static_cast<T>(static_cast<T>(2) * atan(q.x,q.w));\n\n\t\treturn static_cast<T>(atan(y,x));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T yaw(tquat<T, Q> const& q)\n\t{\n\t\treturn asin(clamp(static_cast<T>(-2) * (q.x * q.z - q.w * q.y), static_cast<T>(-1), static_cast<T>(1)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> mat3_cast(tquat<T, Q> const& q)\n\t{\n\t\tmat<3, 3, T, Q> Result(T(1));\n\t\tT qxx(q.x * q.x);\n\t\tT qyy(q.y * q.y);\n\t\tT qzz(q.z * q.z);\n\t\tT qxz(q.x * q.z);\n\t\tT qxy(q.x * q.y);\n\t\tT qyz(q.y * q.z);\n\t\tT qwx(q.w * q.x);\n\t\tT qwy(q.w * q.y);\n\t\tT qwz(q.w * q.z);\n\n\t\tResult[0][0] = T(1) - T(2) * (qyy +  qzz);\n\t\tResult[0][1] = T(2) * (qxy + qwz);\n\t\tResult[0][2] = T(2) * (qxz - qwy);\n\n\t\tResult[1][0] = T(2) * (qxy - qwz);\n\t\tResult[1][1] = T(1) - T(2) * (qxx +  qzz);\n\t\tResult[1][2] = T(2) * (qyz + qwx);\n\n\t\tResult[2][0] = T(2) * (qxz + qwy);\n\t\tResult[2][1] = T(2) * (qyz - qwx);\n\t\tResult[2][2] = T(1) - T(2) * (qxx +  qyy);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat4_cast(tquat<T, Q> const& q)\n\t{\n\t\treturn mat<4, 4, T, Q>(mat3_cast(q));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> quat_cast(mat<3, 3, T, Q> const& m)\n\t{\n\t\tT fourXSquaredMinus1 = m[0][0] - m[1][1] - m[2][2];\n\t\tT fourYSquaredMinus1 = m[1][1] - m[0][0] - m[2][2];\n\t\tT fourZSquaredMinus1 = m[2][2] - m[0][0] - m[1][1];\n\t\tT fourWSquaredMinus1 = m[0][0] + m[1][1] + m[2][2];\n\n\t\tint biggestIndex = 0;\n\t\tT fourBiggestSquaredMinus1 = fourWSquaredMinus1;\n\t\tif(fourXSquaredMinus1 > fourBiggestSquaredMinus1)\n\t\t{\n\t\t\tfourBiggestSquaredMinus1 = fourXSquaredMinus1;\n\t\t\tbiggestIndex = 1;\n\t\t}\n\t\tif(fourYSquaredMinus1 > fourBiggestSquaredMinus1)\n\t\t{\n\t\t\tfourBiggestSquaredMinus1 = fourYSquaredMinus1;\n\t\t\tbiggestIndex = 2;\n\t\t}\n\t\tif(fourZSquaredMinus1 > fourBiggestSquaredMinus1)\n\t\t{\n\t\t\tfourBiggestSquaredMinus1 = fourZSquaredMinus1;\n\t\t\tbiggestIndex = 3;\n\t\t}\n\n\t\tT biggestVal = sqrt(fourBiggestSquaredMinus1 + static_cast<T>(1)) * static_cast<T>(0.5);\n\t\tT mult = static_cast<T>(0.25) / biggestVal;\n\n\t\tswitch(biggestIndex)\n\t\t{\n\t\tcase 0:\n\t\t\treturn tquat<T, Q>(biggestVal, (m[1][2] - m[2][1]) * mult, (m[2][0] - m[0][2]) * mult, (m[0][1] - m[1][0]) * mult);\n\t\tcase 1:\n\t\t\treturn tquat<T, Q>((m[1][2] - m[2][1]) * mult, biggestVal, (m[0][1] + m[1][0]) * mult, (m[2][0] + m[0][2]) * mult);\n\t\tcase 2:\n\t\t\treturn tquat<T, Q>((m[2][0] - m[0][2]) * mult, (m[0][1] + m[1][0]) * mult, biggestVal, (m[1][2] + m[2][1]) * mult);\n\t\tcase 3:\n\t\t\treturn tquat<T, Q>((m[0][1] - m[1][0]) * mult, (m[2][0] + m[0][2]) * mult, (m[1][2] + m[2][1]) * mult, biggestVal);\n\t\tdefault: // Silence a -Wswitch-default warning in GCC. Should never actually get here. Assert is just for sanity.\n\t\t\tassert(false);\n\t\t\treturn tquat<T, Q>(1, 0, 0, 0);\n\t\t}\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> quat_cast(mat<4, 4, T, Q> const& m4)\n\t{\n\t\treturn quat_cast(mat<3, 3, T, Q>(m4));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T angle(tquat<T, Q> const& x)\n\t{\n\t\treturn acos(x.w) * static_cast<T>(2);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> axis(tquat<T, Q> const& x)\n\t{\n\t\tT tmp1 = static_cast<T>(1) - x.w * x.w;\n\t\tif(tmp1 <= static_cast<T>(0))\n\t\t\treturn vec<3, T, Q>(0, 0, 1);\n\t\tT tmp2 = static_cast<T>(1) / sqrt(tmp1);\n\t\treturn vec<3, T, Q>(x.x * tmp2, x.y * tmp2, x.z * tmp2);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> angleAxis(T const& angle, vec<3, T, Q> const& v)\n\t{\n\t\ttquat<T, Q> Result;\n\n\t\tT const a(angle);\n\t\tT const s = glm::sin(a * static_cast<T>(0.5));\n\n\t\tResult.w = glm::cos(a * static_cast<T>(0.5));\n\t\tResult.x = v.x * s;\n\t\tResult.y = v.y * s;\n\t\tResult.z = v.z * s;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> lessThan(tquat<T, Q> const& x, tquat<T, Q> const& y)\n\t{\n\t\tvec<4, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = x[i] < y[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> lessThanEqual(tquat<T, Q> const& x, tquat<T, Q> const& y)\n\t{\n\t\tvec<4, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = x[i] <= y[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThan(tquat<T, Q> const& x, tquat<T, Q> const& y)\n\t{\n\t\tvec<4, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = x[i] > y[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThanEqual(tquat<T, Q> const& x, tquat<T, Q> const& y)\n\t{\n\t\tvec<4, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = x[i] >= y[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> equal(tquat<T, Q> const& x, tquat<T, Q> const& y)\n\t{\n\t\tvec<4, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = detail::compute_equal<T>::call(x[i], y[i]);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> notEqual(tquat<T, Q> const& x, tquat<T, Q> const& y)\n\t{\n\t\tvec<4, bool, Q> Result;\n\t\tfor(length_t i = 0; i < x.length(); ++i)\n\t\t\tResult[i] = !detail::compute_equal<T>::call(x[i], y[i]);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> isnan(tquat<T, Q> const& q)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isnan' only accept floating-point inputs\");\n\n\t\treturn vec<4, bool, Q>(isnan(q.x), isnan(q.y), isnan(q.z), isnan(q.w));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> isinf(tquat<T, Q> const& q)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isinf' only accept floating-point inputs\");\n\n\t\treturn vec<4, bool, Q>(isinf(q.x), isinf(q.y), isinf(q.z), isinf(q.w));\n\t}\n}//namespace glm\n\n#if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_ALIGNED_TYPE\n#\tinclude \"quaternion_simd.inl\"\n#endif\n\n"
  },
  {
    "path": "external/glm/glm/gtc/quaternion_simd.inl",
    "content": "/// @ref core\n/// @file glm/gtc/quaternion_simd.inl\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nnamespace glm{\nnamespace detail\n{\n/*\n\ttemplate<qualifier Q>\n\tstruct compute_quat_mul<float, Q, true>\n\t{\n\t\tstatic tquat<float, Q> call(tquat<float, Q> const& q1, tquat<float, Q> const& q2)\n\t\t{\n\t\t\t// SSE2 STATS: 11 shuffle, 8 mul, 8 add\n\t\t\t// SSE4 STATS: 3 shuffle, 4 mul, 4 dpps\n\n\t\t\t__m128 const mul0 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(0, 1, 2, 3)));\n\t\t\t__m128 const mul1 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(1, 0, 3, 2)));\n\t\t\t__m128 const mul2 = _mm_mul_ps(q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(2, 3, 0, 1)));\n\t\t\t__m128 const mul3 = _mm_mul_ps(q1.Data, q2.Data);\n\n#\t\t\tif GLM_ARCH & GLM_ARCH_SSE41_BIT\n\t\t\t\t__m128 const add0 = _mm_dp_ps(mul0, _mm_set_ps(1.0f, -1.0f,  1.0f,  1.0f), 0xff);\n\t\t\t\t__m128 const add1 = _mm_dp_ps(mul1, _mm_set_ps(1.0f,  1.0f,  1.0f, -1.0f), 0xff);\n\t\t\t\t__m128 const add2 = _mm_dp_ps(mul2, _mm_set_ps(1.0f,  1.0f, -1.0f,  1.0f), 0xff);\n\t\t\t\t__m128 const add3 = _mm_dp_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f), 0xff);\n#\t\t\telse\n\t\t\t\t__m128 const mul4 = _mm_mul_ps(mul0, _mm_set_ps(1.0f, -1.0f,  1.0f,  1.0f));\n\t\t\t\t__m128 const add0 = _mm_add_ps(mul0, _mm_movehl_ps(mul4, mul4));\n\t\t\t\t__m128 const add4 = _mm_add_ss(add0, _mm_shuffle_ps(add0, add0, 1));\n\n\t\t\t\t__m128 const mul5 = _mm_mul_ps(mul1, _mm_set_ps(1.0f,  1.0f,  1.0f, -1.0f));\n\t\t\t\t__m128 const add1 = _mm_add_ps(mul1, _mm_movehl_ps(mul5, mul5));\n\t\t\t\t__m128 const add5 = _mm_add_ss(add1, _mm_shuffle_ps(add1, add1, 1));\n\n\t\t\t\t__m128 const mul6 = _mm_mul_ps(mul2, _mm_set_ps(1.0f,  1.0f, -1.0f,  1.0f));\n\t\t\t\t__m128 const add2 = _mm_add_ps(mul6, _mm_movehl_ps(mul6, mul6));\n\t\t\t\t__m128 const add6 = _mm_add_ss(add2, _mm_shuffle_ps(add2, add2, 1));\n\n\t\t\t\t__m128 const mul7 = _mm_mul_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f));\n\t\t\t\t__m128 const add3 = _mm_add_ps(mul3, _mm_movehl_ps(mul7, mul7));\n\t\t\t\t__m128 const add7 = _mm_add_ss(add3, _mm_shuffle_ps(add3, add3, 1));\n\t\t#endif\n\n\t\t\t// This SIMD code is a politically correct way of doing this, but in every test I've tried it has been slower than\n\t\t\t// the final code below. I'll keep this here for reference - maybe somebody else can do something better...\n\t\t\t//\n\t\t\t//__m128 xxyy = _mm_shuffle_ps(add4, add5, _MM_SHUFFLE(0, 0, 0, 0));\n\t\t\t//__m128 zzww = _mm_shuffle_ps(add6, add7, _MM_SHUFFLE(0, 0, 0, 0));\n\t\t\t//\n\t\t\t//return _mm_shuffle_ps(xxyy, zzww, _MM_SHUFFLE(2, 0, 2, 0));\n\n\t\t\ttquat<float, Q> Result;\n\t\t\t_mm_store_ss(&Result.x, add4);\n\t\t\t_mm_store_ss(&Result.y, add5);\n\t\t\t_mm_store_ss(&Result.z, add6);\n\t\t\t_mm_store_ss(&Result.w, add7);\n\t\t\treturn Result;\n\t\t}\n\t};\n*/\n\n\ttemplate<qualifier Q>\n\tstruct compute_dot<tquat<float, Q>, float, true>\n\t{\n\t\tstatic GLM_FUNC_QUALIFIER float call(tquat<float, Q> const& x, tquat<float, Q> const& y)\n\t\t{\n\t\t\treturn _mm_cvtss_f32(glm_vec1_dot(x.data, y.data));\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_quat_add<float, Q, true>\n\t{\n\t\tstatic tquat<float, Q> call(tquat<float, Q> const& q, tquat<float, Q> const& p)\n\t\t{\n\t\t\ttquat<float, Q> Result;\n\t\t\tResult.data = _mm_add_ps(q.data, p.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<qualifier Q>\n\tstruct compute_quat_add<double, Q, true>\n\t{\n\t\tstatic tquat<double, Q> call(tquat<double, Q> const& a, tquat<double, Q> const& b)\n\t\t{\n\t\t\ttquat<double, Q> Result;\n\t\t\tResult.data = _mm256_add_pd(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<qualifier Q>\n\tstruct compute_quat_sub<float, Q, true>\n\t{\n\t\tstatic tquat<float, Q> call(tquat<float, Q> const& q, tquat<float, Q> const& p)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_sub_ps(q.data, p.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<qualifier Q>\n\tstruct compute_quat_sub<double, Q, true>\n\t{\n\t\tstatic tquat<double, Q> call(tquat<double, Q> const& a, tquat<double, Q> const& b)\n\t\t{\n\t\t\ttquat<double, Q> Result;\n\t\t\tResult.data = _mm256_sub_pd(a.data, b.data);\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<qualifier Q>\n\tstruct compute_quat_mul_scalar<float, Q, true>\n\t{\n\t\tstatic tquat<float, Q> call(tquat<float, Q> const& q, float s)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_mul_ps(q.data, _mm_set_ps1(s));\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<qualifier Q>\n\tstruct compute_quat_mul_scalar<double, Q, true>\n\t{\n\t\tstatic tquat<double, Q> call(tquat<double, Q> const& q, double s)\n\t\t{\n\t\t\ttquat<double, Q> Result;\n\t\t\tResult.data = _mm256_mul_pd(q.data, _mm_set_ps1(s));\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<qualifier Q>\n\tstruct compute_quat_div_scalar<float, Q, true>\n\t{\n\t\tstatic tquat<float, Q> call(tquat<float, Q> const& q, float s)\n\t\t{\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_div_ps(q.data, _mm_set_ps1(s));\n\t\t\treturn Result;\n\t\t}\n\t};\n\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttemplate<qualifier Q>\n\tstruct compute_quat_div_scalar<double, Q, true>\n\t{\n\t\tstatic tquat<double, Q> call(tquat<double, Q> const& q, double s)\n\t\t{\n\t\t\ttquat<double, Q> Result;\n\t\t\tResult.data = _mm256_div_pd(q.data, _mm_set_ps1(s));\n\t\t\treturn Result;\n\t\t}\n\t};\n#\tendif\n\n\ttemplate<qualifier Q>\n\tstruct compute_quat_mul_vec4<float, Q, true>\n\t{\n\t\tstatic vec<4, float, Q> call(tquat<float, Q> const& q, vec<4, float, Q> const& v)\n\t\t{\n\t\t\t__m128 const q_wwww = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 3, 3, 3));\n\t\t\t__m128 const q_swp0 = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 0, 2, 1));\n\t\t\t__m128 const q_swp1 = _mm_shuffle_ps(q.data, q.data, _MM_SHUFFLE(3, 1, 0, 2));\n\t\t\t__m128 const v_swp0 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 0, 2, 1));\n\t\t\t__m128 const v_swp1 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 1, 0, 2));\n\t\n\t\t\t__m128 uv      = _mm_sub_ps(_mm_mul_ps(q_swp0, v_swp1), _mm_mul_ps(q_swp1, v_swp0));\n\t\t\t__m128 uv_swp0 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 0, 2, 1));\n\t\t\t__m128 uv_swp1 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 1, 0, 2));\n\t\t\t__m128 uuv     = _mm_sub_ps(_mm_mul_ps(q_swp0, uv_swp1), _mm_mul_ps(q_swp1, uv_swp0));\n\n\t\t\t__m128 const two = _mm_set1_ps(2.0f);\n\t\t\tuv  = _mm_mul_ps(uv, _mm_mul_ps(q_wwww, two));\n\t\t\tuuv = _mm_mul_ps(uuv, two);\n\n\t\t\tvec<4, float, Q> Result;\n\t\t\tResult.data = _mm_add_ps(v.Data, _mm_add_ps(uv, uuv));\n\t\t\treturn Result;\n\t\t}\n\t};\n}//namespace detail\n}//namespace glm\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n"
  },
  {
    "path": "external/glm/glm/gtc/random.hpp",
    "content": "/// @ref gtc_random\n/// @file glm/gtc/random.hpp\n///\n/// @see core (dependence)\n/// @see gtx_random (extended)\n///\n/// @defgroup gtc_random GLM_GTC_random\n/// @ingroup gtc\n///\n/// Include <glm/gtc/random.hpp> to use the features of this extension.\n///\n/// Generate random number from various distribution methods.\n\n#pragma once\n\n// Dependency:\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_random extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_random\n\t/// @{\n\t\n\t/// Generate random numbers in the interval [Min, Max], according a linear distribution \n\t/// \n\t/// @param Min Minimum value included in the sampling \n\t/// @param Max Maximum value included in the sampling \n\t/// @tparam genType Value type. Currently supported: float or double scalars.\n\t/// @see gtc_random\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType linearRand(genType Min, genType Max);\n\n\t/// Generate random numbers in the interval [Min, Max], according a linear distribution \n\t/// \n\t/// @param Min Minimum value included in the sampling \n\t/// @param Max Maximum value included in the sampling \n\t/// @tparam T Value type. Currently supported: float or double.\n\t///\n\t/// @see gtc_random\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> linearRand(vec<L, T, Q> const& Min, vec<L, T, Q> const& Max);\n\n\t/// Generate random numbers in the interval [Min, Max], according a gaussian distribution \n\t/// \n\t/// @see gtc_random\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType gaussRand(genType Mean, genType Deviation);\n\n\t/// Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius\n\t/// \n\t/// @see gtc_random\n\ttemplate<typename T>\n\tGLM_FUNC_DECL vec<2, T, defaultp> circularRand(T Radius);\n\n\t/// Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius\n\t/// \n\t/// @see gtc_random\n\ttemplate<typename T>\n\tGLM_FUNC_DECL vec<3, T, defaultp> sphericalRand(T Radius);\n\n\t/// Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius\n\t/// \n\t/// @see gtc_random\n\ttemplate<typename T>\n\tGLM_FUNC_DECL vec<2, T, defaultp> diskRand(T Radius);\n\n\t/// Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius\n\t/// \n\t/// @see gtc_random\n\ttemplate<typename T>\n\tGLM_FUNC_DECL vec<3, T, defaultp> ballRand(T Radius);\n\n\t/// @}\n}//namespace glm\n\n#include \"random.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/random.inl",
    "content": "/// @ref gtc_random\n/// @file glm/gtc/random.inl\n\n#include \"../geometric.hpp\"\n#include \"../exponential.hpp\"\n#include \"../trigonometric.hpp\"\n#include \"../ext/vec1.hpp\"\n#include <cstdlib>\n#include <ctime>\n#include <cassert>\n#include <cmath>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate <length_t L, typename T, qualifier Q>\n\tstruct compute_rand\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call();\n\t};\n\n\ttemplate <qualifier P>\n\tstruct compute_rand<1, uint8, P>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<1, uint8, P> call()\n\t\t{\n\t\t\treturn vec<1, uint8, P>(\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max());\n\t\t}\n\t};\n\n\ttemplate <qualifier P>\n\tstruct compute_rand<2, uint8, P>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<2, uint8, P> call()\n\t\t{\n\t\t\treturn vec<2, uint8, P>(\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max(),\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max());\n\t\t}\n\t};\n\n\ttemplate <qualifier P>\n\tstruct compute_rand<3, uint8, P>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<3, uint8, P> call()\n\t\t{\n\t\t\treturn vec<3, uint8, P>(\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max(),\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max(),\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max());\n\t\t}\n\t};\n\n\ttemplate <qualifier P>\n\tstruct compute_rand<4, uint8, P>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, uint8, P> call()\n\t\t{\n\t\t\treturn vec<4, uint8, P>(\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max(),\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max(),\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max(),\n\t\t\t\tstd::rand() % std::numeric_limits<uint8>::max());\n\t\t}\n\t};\n\n\ttemplate <length_t L, qualifier Q>\n\tstruct compute_rand<L, uint16, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, uint16, Q> call()\n\t\t{\n\t\t\treturn\n\t\t\t\t(vec<L, uint16, Q>(compute_rand<L, uint8, Q>::call()) << static_cast<uint16>(8)) |\n\t\t\t\t(vec<L, uint16, Q>(compute_rand<L, uint8, Q>::call()) << static_cast<uint16>(0));\n\t\t}\n\t};\n\n\ttemplate <length_t L, qualifier Q>\n\tstruct compute_rand<L, uint32, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, uint32, Q> call()\n\t\t{\n\t\t\treturn\n\t\t\t\t(vec<L, uint32, Q>(compute_rand<L, uint16, Q>::call()) << static_cast<uint32>(16)) |\n\t\t\t\t(vec<L, uint32, Q>(compute_rand<L, uint16, Q>::call()) << static_cast<uint32>(0));\n\t\t}\n\t};\n\n\ttemplate <length_t L, qualifier Q>\n\tstruct compute_rand<L, uint64, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, uint64, Q> call()\n\t\t{\n\t\t\treturn\n\t\t\t\t(vec<L, uint64, Q>(compute_rand<L, uint32, Q>::call()) << static_cast<uint64>(32)) |\n\t\t\t\t(vec<L, uint64, Q>(compute_rand<L, uint32, Q>::call()) << static_cast<uint64>(0));\n\t\t}\n\t};\n\n\ttemplate <length_t L, typename T, qualifier Q>\n\tstruct compute_linearRand\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& Min, vec<L, T, Q> const& Max);\n\t};\n\n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_linearRand<L, int8, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, int8, Q> call(vec<L, int8, Q> const& Min, vec<L, int8, Q> const& Max)\n\t\t{\n\t\t\treturn (vec<L, int8, Q>(compute_rand<L, uint8, Q>::call() % vec<L, uint8, Q>(Max + static_cast<int8>(1) - Min))) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_linearRand<L, uint8, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, uint8, Q> call(vec<L, uint8, Q> const& Min, vec<L, uint8, Q> const& Max)\n\t\t{\n\t\t\treturn (compute_rand<L, uint8, Q>::call() % (Max + static_cast<uint8>(1) - Min)) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_linearRand<L, int16, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, int16, Q> call(vec<L, int16, Q> const& Min, vec<L, int16, Q> const& Max)\n\t\t{\n\t\t\treturn (vec<L, int16, Q>(compute_rand<L, uint16, Q>::call() % vec<L, uint16, Q>(Max + static_cast<int16>(1) - Min))) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_linearRand<L, uint16, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, uint16, Q> call(vec<L, uint16, Q> const& Min, vec<L, uint16, Q> const& Max)\n\t\t{\n\t\t\treturn (compute_rand<L, uint16, Q>::call() % (Max + static_cast<uint16>(1) - Min)) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_linearRand<L, int32, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, int32, Q> call(vec<L, int32, Q> const& Min, vec<L, int32, Q> const& Max)\n\t\t{\n\t\t\treturn (vec<L, int32, Q>(compute_rand<L, uint32, Q>::call() % vec<L, uint32, Q>(Max + static_cast<int32>(1) - Min))) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_linearRand<L, uint32, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, uint32, Q> call(vec<L, uint32, Q> const& Min, vec<L, uint32, Q> const& Max)\n\t\t{\n\t\t\treturn (compute_rand<L, uint32, Q>::call() % (Max + static_cast<uint32>(1) - Min)) + Min;\n\t\t}\n\t};\n \n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_linearRand<L, int64, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, int64, Q> call(vec<L, int64, Q> const& Min, vec<L, int64, Q> const& Max)\n\t\t{\n\t\t\treturn (vec<L, int64, Q>(compute_rand<L, uint64, Q>::call() % vec<L, uint64, Q>(Max + static_cast<int64>(1) - Min))) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L, qualifier Q>\n\tstruct compute_linearRand<L, uint64, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, uint64, Q> call(vec<L, uint64, Q> const& Min, vec<L, uint64, Q> const& Max)\n\t\t{\n\t\t\treturn (compute_rand<L, uint64, Q>::call() % (Max + static_cast<uint64>(1) - Min)) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, float, lowp>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, float, lowp> call(vec<L, float, lowp> const& Min, vec<L, float, lowp> const& Max)\n\t\t{\n\t\t\treturn vec<L, float, lowp>(compute_rand<L, uint8, lowp>::call()) / static_cast<float>(std::numeric_limits<uint8>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, float, mediump>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, float, mediump> call(vec<L, float, mediump> const& Min, vec<L, float, mediump> const& Max)\n\t\t{\n\t\t\treturn vec<L, float, mediump>(compute_rand<L, uint16, mediump>::call()) / static_cast<float>(std::numeric_limits<uint16>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, float, highp>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, float, highp> call(vec<L, float, highp> const& Min, vec<L, float, highp> const& Max)\n\t\t{\n\t\t\treturn vec<L, float, highp>(compute_rand<L, uint32, highp>::call()) / static_cast<float>(std::numeric_limits<uint32>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, double, lowp>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, double, lowp> call(vec<L, double, lowp> const& Min, vec<L, double, lowp> const& Max)\n\t\t{\n\t\t\treturn vec<L, double, lowp>(compute_rand<L, uint16, lowp>::call()) / static_cast<double>(std::numeric_limits<uint16>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, double, mediump>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, double, mediump> call(vec<L, double, mediump> const& Min, vec<L, double, mediump> const& Max)\n\t\t{\n\t\t\treturn vec<L, double, mediump>(compute_rand<L, uint32, mediump>::call()) / static_cast<double>(std::numeric_limits<uint32>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, double, highp>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, double, highp> call(vec<L, double, highp> const& Min, vec<L, double, highp> const& Max)\n\t\t{\n\t\t\treturn vec<L, double, highp>(compute_rand<L, uint64, highp>::call()) / static_cast<double>(std::numeric_limits<uint64>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, long double, lowp>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, long double, lowp> call(vec<L, long double, lowp> const& Min, vec<L, long double, lowp> const& Max)\n\t\t{\n\t\t\treturn vec<L, long double, lowp>(compute_rand<L, uint32, lowp>::call()) / static_cast<long double>(std::numeric_limits<uint32>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, long double, mediump>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, long double, mediump> call(vec<L, long double, mediump> const& Min, vec<L, long double, mediump> const& Max)\n\t\t{\n\t\t\treturn vec<L, long double, mediump>(compute_rand<L, uint64, mediump>::call()) / static_cast<long double>(std::numeric_limits<uint64>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n\n\ttemplate<length_t L>\n\tstruct compute_linearRand<L, long double, highp>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, long double, highp> call(vec<L, long double, highp> const& Min, vec<L, long double, highp> const& Max)\n\t\t{\n\t\t\treturn vec<L, long double, highp>(compute_rand<L, uint64, highp>::call()) / static_cast<long double>(std::numeric_limits<uint64>::max()) * (Max - Min) + Min;\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType linearRand(genType Min, genType Max)\n\t{\n\t\treturn detail::compute_linearRand<1, genType, highp>::call(\n\t\t\tvec<1, genType, highp>(Min),\n\t\t\tvec<1, genType, highp>(Max)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> linearRand(vec<L, T, Q> const& Min, vec<L, T, Q> const& Max)\n\t{\n\t\treturn detail::compute_linearRand<L, T, Q>::call(Min, Max);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType gaussRand(genType Mean, genType Deviation)\n\t{\n\t\tgenType w, x1, x2;\n\n\t\tdo\n\t\t{\n\t\t\tx1 = linearRand(genType(-1), genType(1));\n\t\t\tx2 = linearRand(genType(-1), genType(1));\n\t\t\n\t\t\tw = x1 * x1 + x2 * x2;\n\t\t} while(w > genType(1));\n\n\t\treturn x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> gaussRand(vec<L, T, Q> const& Mean, vec<L, T, Q> const& Deviation)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(gaussRand, Mean, Deviation);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER vec<2, T, defaultp> diskRand(T Radius)\n\t{\t\t\n\t\tvec<2, T, defaultp> Result(T(0));\n\t\tT LenRadius(T(0));\n\n\t\tdo\n\t\t{\n\t\t\tResult = linearRand(\n\t\t\t\tvec<2, T, defaultp>(-Radius),\n\t\t\t\tvec<2, T, defaultp>(Radius));\n\t\t\tLenRadius = length(Result);\n\t\t}\n\t\twhile(LenRadius > Radius);\n\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER vec<3, T, defaultp> ballRand(T Radius)\n\t{\n\t\tvec<3, T, defaultp> Result(T(0));\n\t\tT LenRadius(T(0));\n\t\t\n\t\tdo\n\t\t{\n\t\t\tResult = linearRand(\n\t\t\t\tvec<3, T, defaultp>(-Radius),\n\t\t\t\tvec<3, T, defaultp>(Radius));\n\t\t\tLenRadius = length(Result);\n\t\t}\n\t\twhile(LenRadius > Radius);\n\t\t\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER vec<2, T, defaultp> circularRand(T Radius)\n\t{\n\t\tT a = linearRand(T(0), static_cast<T>(6.283185307179586476925286766559));\n\t\treturn vec<2, T, defaultp>(glm::cos(a), glm::sin(a)) * Radius;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER vec<3, T, defaultp> sphericalRand(T Radius)\n\t{\n\t\tT z = linearRand(T(-1), T(1));\n\t\tT a = linearRand(T(0), T(6.283185307179586476925286766559f));\n\n\t\tT r = sqrt(T(1) - z * z);\n\n\t\tT x = r * std::cos(a);\n\t\tT y = r * std::sin(a);\n\n\t\treturn vec<3, T, defaultp>(x, y, z) * Radius;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/reciprocal.hpp",
    "content": "/// @ref gtc_reciprocal\n/// @file glm/gtc/reciprocal.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_reciprocal GLM_GTC_reciprocal\n/// @ingroup gtc\n///\n/// Include <glm/gtc/reciprocal.hpp> to use the features of this extension.\n///\n/// Define secant, cosecant and cotangent functions.\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_reciprocal extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_reciprocal\n\t/// @{\n\n\t/// Secant function.\n\t/// hypotenuse / adjacent or 1 / cos(x)\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType sec(genType angle);\n\n\t/// Cosecant function.\n\t/// hypotenuse / opposite or 1 / sin(x)\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType csc(genType angle);\n\t\t\n\t/// Cotangent function.\n\t/// adjacent / opposite or 1 / tan(x)\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType cot(genType angle);\n\n\t/// Inverse secant function.\n\t/// \n\t/// @return Return an angle expressed in radians.\n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType asec(genType x);\n\n\t/// Inverse cosecant function.\n\t/// \n\t/// @return Return an angle expressed in radians.\n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType acsc(genType x);\n\t\t\n\t/// Inverse cotangent function.\n\t/// \n\t/// @return Return an angle expressed in radians.\n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType acot(genType x);\n\n\t/// Secant hyperbolic function.\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType sech(genType angle);\n\n\t/// Cosecant hyperbolic function.\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType csch(genType angle);\n\t\t\n\t/// Cotangent hyperbolic function.\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType coth(genType angle);\n\n\t/// Inverse secant hyperbolic function.\n\t/// \n\t/// @return Return an angle expressed in radians.\n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType asech(genType x);\n\n\t/// Inverse cosecant hyperbolic function.\n\t/// \n\t/// @return Return an angle expressed in radians.\n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType acsch(genType x);\n\t\t\n\t/// Inverse cotangent hyperbolic function.\n\t/// \n\t/// @return Return an angle expressed in radians.\n\t/// @tparam genType Floating-point scalar or vector types.\n\t/// \n\t/// @see gtc_reciprocal\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType acoth(genType x);\n\n\t/// @}\n}//namespace glm\n\n#include \"reciprocal.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/reciprocal.inl",
    "content": "/// @ref gtc_reciprocal\n/// @file glm/gtc/reciprocal.inl\n\n#include \"../trigonometric.hpp\"\n#include <limits>\n\nnamespace glm\n{\n\t// sec\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType sec(genType angle)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'sec' only accept floating-point values\");\n\t\treturn genType(1) / glm::cos(angle);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> sec(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'sec' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(sec, x);\n\t}\n\n\t// csc\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType csc(genType angle)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'csc' only accept floating-point values\");\n\t\treturn genType(1) / glm::sin(angle);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> csc(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'csc' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(csc, x);\n\t}\n\n\t// cot\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType cot(genType angle)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'cot' only accept floating-point values\");\n\t\n\t\tgenType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0);\n\t\treturn glm::tan(pi_over_2 - angle);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> cot(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'cot' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(cot, x);\n\t}\n\n\t// asec\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType asec(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'asec' only accept floating-point values\");\n\t\treturn acos(genType(1) / x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> asec(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'asec' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(asec, x);\n\t}\n\n\t// acsc\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType acsc(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'acsc' only accept floating-point values\");\n\t\treturn asin(genType(1) / x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> acsc(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'acsc' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(acsc, x);\n\t}\n\n\t// acot\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType acot(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'acot' only accept floating-point values\");\n\n\t\tgenType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0);\n\t\treturn pi_over_2 - atan(x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> acot(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'acot' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(acot, x);\n\t}\n\n\t// sech\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType sech(genType angle)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'sech' only accept floating-point values\");\n\t\treturn genType(1) / glm::cosh(angle);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> sech(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'sech' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(sech, x);\n\t}\n\n\t// csch\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType csch(genType angle)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'csch' only accept floating-point values\");\n\t\treturn genType(1) / glm::sinh(angle);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> csch(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'csch' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(csch, x);\n\t}\n\n\t// coth\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType coth(genType angle)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'coth' only accept floating-point values\");\n\t\treturn glm::cosh(angle) / glm::sinh(angle);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> coth(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'coth' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(coth, x);\n\t}\n\n\t// asech\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType asech(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'asech' only accept floating-point values\");\n\t\treturn acosh(genType(1) / x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> asech(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'asech' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(asech, x);\n\t}\n\n\t// acsch\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType acsch(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'acsch' only accept floating-point values\");\n\t\treturn acsch(genType(1) / x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> acsch(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'acsch' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(acsch, x);\n\t}\n\n\t// acoth\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType acoth(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'acoth' only accept floating-point values\");\n\t\treturn atanh(genType(1) / x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> acoth(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'acoth' only accept floating-point inputs\");\n\t\treturn detail::functor1<L, T, T, Q>::call(acoth, x);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/round.hpp",
    "content": "/// @ref gtc_round\n/// @file glm/gtc/round.hpp\n///\n/// @see core (dependence)\n/// @see gtc_round (dependence)\n///\n/// @defgroup gtc_round GLM_GTC_round\n/// @ingroup gtc\n///\n/// Include <glm/gtc/round.hpp> to use the features of this extension.\n///\n/// Rounding value to specific boundings\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n#include \"../detail/_vectorize.hpp\"\n#include \"../vector_relational.hpp\"\n#include \"../common.hpp\"\n#include <limits>\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_integer extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_round\n\t/// @{\n\n\t/// Return true if the value is a power of two number.\n\t///\n\t/// @see gtc_round\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL bool isPowerOfTwo(genIUType v);\n\n\t/// Return true if the value is a power of two number.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> isPowerOfTwo(vec<L, T, Q> const& v);\n\n\t/// Return the power of two number which value is just higher the input value,\n\t/// round up to a power of two.\n\t///\n\t/// @see gtc_round\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType ceilPowerOfTwo(genIUType v);\n\n\t/// Return the power of two number which value is just higher the input value,\n\t/// round up to a power of two.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> ceilPowerOfTwo(vec<L, T, Q> const& v);\n\n\t/// Return the power of two number which value is just lower the input value,\n\t/// round down to a power of two.\n\t///\n\t/// @see gtc_round\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType floorPowerOfTwo(genIUType v);\n\n\t/// Return the power of two number which value is just lower the input value,\n\t/// round down to a power of two.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> floorPowerOfTwo(vec<L, T, Q> const& v);\n\n\t/// Return the power of two number which value is the closet to the input value.\n\t///\n\t/// @see gtc_round\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType roundPowerOfTwo(genIUType v);\n\n\t/// Return the power of two number which value is the closet to the input value.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> roundPowerOfTwo(vec<L, T, Q> const& v);\n\n\t/// Return true if the 'Value' is a multiple of 'Multiple'.\n\t///\n\t/// @see gtc_round\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL bool isMultiple(genIUType v, genIUType Multiple);\n\n\t/// Return true if the 'Value' is a multiple of 'Multiple'.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> isMultiple(vec<L, T, Q> const& v, T Multiple);\n\n\t/// Return true if the 'Value' is a multiple of 'Multiple'.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> isMultiple(vec<L, T, Q> const& v, vec<L, T, Q> const& Multiple);\n\n\t/// Higher multiple number of Source.\n\t///\n\t/// @tparam genType Floating-point or integer scalar or vector types.\n\t///\n\t/// @param v Source value to which is applied the function\n\t/// @param Multiple Must be a null or positive value\n\t///\n\t/// @see gtc_round\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType ceilMultiple(genType v, genType Multiple);\n\n\t/// Higher multiple number of Source.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @param v Source values to which is applied the function\n\t/// @param Multiple Must be a null or positive value\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> ceilMultiple(vec<L, T, Q> const& v, vec<L, T, Q> const& Multiple);\n\n\t/// Lower multiple number of Source.\n\t///\n\t/// @tparam genType Floating-point or integer scalar or vector types.\n\t///\n\t/// @param v Source value to which is applied the function\n\t/// @param Multiple Must be a null or positive value\n\t///\n\t/// @see gtc_round\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType floorMultiple(genType v, genType Multiple);\n\n\t/// Lower multiple number of Source.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @param v Source values to which is applied the function\n\t/// @param Multiple Must be a null or positive value\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> floorMultiple(vec<L, T, Q> const& v, vec<L, T, Q> const& Multiple);\n\n\t/// Lower multiple number of Source.\n\t///\n\t/// @tparam genType Floating-point or integer scalar or vector types.\n\t///\n\t/// @param v Source value to which is applied the function\n\t/// @param Multiple Must be a null or positive value\n\t///\n\t/// @see gtc_round\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType roundMultiple(genType v, genType Multiple);\n\n\t/// Lower multiple number of Source.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @param v Source values to which is applied the function\n\t/// @param Multiple Must be a null or positive value\n\t///\n\t/// @see gtc_round\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> roundMultiple(vec<L, T, Q> const& v, vec<L, T, Q> const& Multiple);\n\n\t/// @}\n} //namespace glm\n\n#include \"round.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/round.inl",
    "content": "/// @ref gtc_round\n/// @file glm/gtc/round.inl\n\n#include \"../integer.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, qualifier Q, bool compute = false>\n\tstruct compute_ceilShift\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T)\n\t\t{\n\t\t\treturn v;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct compute_ceilShift<L, T, Q, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& v, T Shift)\n\t\t{\n\t\t\treturn v | (v >> Shift);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q, bool isSigned = true>\n\tstruct compute_ceilPowerOfTwo\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(!std::numeric_limits<T>::is_iec559, \"'ceilPowerOfTwo' only accept integer scalar or vector inputs\");\n\n\t\t\tvec<L, T, Q> const Sign(sign(x));\n\n\t\t\tvec<L, T, Q> v(abs(x));\n\n\t\t\tv = v - static_cast<T>(1);\n\t\t\tv = v | (v >> static_cast<T>(1));\n\t\t\tv = v | (v >> static_cast<T>(2));\n\t\t\tv = v | (v >> static_cast<T>(4));\n\t\t\tv = compute_ceilShift<L, T, Q, sizeof(T) >= 2>::call(v, 8);\n\t\t\tv = compute_ceilShift<L, T, Q, sizeof(T) >= 4>::call(v, 16);\n\t\t\tv = compute_ceilShift<L, T, Q, sizeof(T) >= 8>::call(v, 32);\n\t\t\treturn (v + static_cast<T>(1)) * Sign;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct compute_ceilPowerOfTwo<L, T, Q, false>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& x)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(!std::numeric_limits<T>::is_iec559, \"'ceilPowerOfTwo' only accept integer scalar or vector inputs\");\n\n\t\t\tvec<L, T, Q> v(x);\n\n\t\t\tv = v - static_cast<T>(1);\n\t\t\tv = v | (v >> static_cast<T>(1));\n\t\t\tv = v | (v >> static_cast<T>(2));\n\t\t\tv = v | (v >> static_cast<T>(4));\n\t\t\tv = compute_ceilShift<L, T, Q, sizeof(T) >= 2>::call(v, 8);\n\t\t\tv = compute_ceilShift<L, T, Q, sizeof(T) >= 4>::call(v, 16);\n\t\t\tv = compute_ceilShift<L, T, Q, sizeof(T) >= 8>::call(v, 32);\n\t\t\treturn v + static_cast<T>(1);\n\t\t}\n\t};\n\n\ttemplate<bool is_float, bool is_signed>\n\tstruct compute_ceilMultiple{};\n\n\ttemplate<>\n\tstruct compute_ceilMultiple<true, true>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tif(Source > genType(0))\n\t\t\t\treturn Source + (Multiple - std::fmod(Source, Multiple));\n\t\t\telse\n\t\t\t\treturn Source + std::fmod(-Source, Multiple);\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_ceilMultiple<false, false>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tgenType Tmp = Source - genType(1);\n\t\t\treturn Tmp + (Multiple - (Tmp % Multiple));\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_ceilMultiple<false, true>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tif(Source > genType(0))\n\t\t\t{\n\t\t\t\tgenType Tmp = Source - genType(1);\n\t\t\t\treturn Tmp + (Multiple - (Tmp % Multiple));\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn Source + (-Source % Multiple);\n\t\t}\n\t};\n\n\ttemplate<bool is_float, bool is_signed>\n\tstruct compute_floorMultiple{};\n\n\ttemplate<>\n\tstruct compute_floorMultiple<true, true>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tif(Source >= genType(0))\n\t\t\t\treturn Source - std::fmod(Source, Multiple);\n\t\t\telse\n\t\t\t\treturn Source - std::fmod(Source, Multiple) - Multiple;\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_floorMultiple<false, false>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tif(Source >= genType(0))\n\t\t\t\treturn Source - Source % Multiple;\n\t\t\telse\n\t\t\t{\n\t\t\t\tgenType Tmp = Source + genType(1);\n\t\t\t\treturn Tmp - Tmp % Multiple - Multiple;\n\t\t\t}\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_floorMultiple<false, true>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tif(Source >= genType(0))\n\t\t\t\treturn Source - Source % Multiple;\n\t\t\telse\n\t\t\t{\n\t\t\t\tgenType Tmp = Source + genType(1);\n\t\t\t\treturn Tmp - Tmp % Multiple - Multiple;\n\t\t\t}\n\t\t}\n\t};\n\n\ttemplate<bool is_float, bool is_signed>\n\tstruct compute_roundMultiple{};\n\n\ttemplate<>\n\tstruct compute_roundMultiple<true, true>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tif(Source >= genType(0))\n\t\t\t\treturn Source - std::fmod(Source, Multiple);\n\t\t\telse\n\t\t\t{\n\t\t\t\tgenType Tmp = Source + genType(1);\n\t\t\t\treturn Tmp - std::fmod(Tmp, Multiple) - Multiple;\n\t\t\t}\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_roundMultiple<false, false>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tif(Source >= genType(0))\n\t\t\t\treturn Source - Source % Multiple;\n\t\t\telse\n\t\t\t{\n\t\t\t\tgenType Tmp = Source + genType(1);\n\t\t\t\treturn Tmp - Tmp % Multiple - Multiple;\n\t\t\t}\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_roundMultiple<false, true>\n\t{\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)\n\t\t{\n\t\t\tif(Source >= genType(0))\n\t\t\t\treturn Source - Source % Multiple;\n\t\t\telse\n\t\t\t{\n\t\t\t\tgenType Tmp = Source + genType(1);\n\t\t\t\treturn Tmp - Tmp % Multiple - Multiple;\n\t\t\t}\n\t\t}\n\t};\n}//namespace detail\n\n\t////////////////\n\t// isPowerOfTwo\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool isPowerOfTwo(genType Value)\n\t{\n\t\tgenType const Result = glm::abs(Value);\n\t\treturn !(Result & (Result - 1));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> isPowerOfTwo(vec<L, T, Q> const& Value)\n\t{\n\t\tvec<L, T, Q> const Result(abs(Value));\n\t\treturn equal(Result & (Result - 1), vec<L, T, Q>(0));\n\t}\n\n\t//////////////////\n\t// ceilPowerOfTwo\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType ceilPowerOfTwo(genType value)\n\t{\n\t\treturn detail::compute_ceilPowerOfTwo<1, genType, defaultp, std::numeric_limits<genType>::is_signed>::call(vec<1, genType, defaultp>(value)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> ceilPowerOfTwo(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::compute_ceilPowerOfTwo<L, T, Q, std::numeric_limits<T>::is_signed>::call(v);\n\t}\n\n\t///////////////////\n\t// floorPowerOfTwo\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType floorPowerOfTwo(genType value)\n\t{\n\t\treturn isPowerOfTwo(value) ? value : static_cast<genType>(1) << findMSB(value);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> floorPowerOfTwo(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(floorPowerOfTwo, v);\n\t}\n\n\t///////////////////\n\t// roundPowerOfTwo\n\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType roundPowerOfTwo(genIUType value)\n\t{\n\t\tif(isPowerOfTwo(value))\n\t\t\treturn value;\n\n\t\tgenIUType const prev = static_cast<genIUType>(1) << findMSB(value);\n\t\tgenIUType const next = prev << static_cast<genIUType>(1);\n\t\treturn (next - value) < (value - prev) ? next : prev;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> roundPowerOfTwo(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(roundPowerOfTwo, v);\n\t}\n\n\t////////////////\n\t// isMultiple\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool isMultiple(genType Value, genType Multiple)\n\t{\n\t\treturn isMultiple(vec<1, genType>(Value), vec<1, genType>(Multiple)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> isMultiple(vec<L, T, Q> const& Value, T Multiple)\n\t{\n\t\treturn (Value % Multiple) == vec<L, T, Q>(0);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> isMultiple(vec<L, T, Q> const& Value, vec<L, T, Q> const& Multiple)\n\t{\n\t\treturn (Value % Multiple) == vec<L, T, Q>(0);\n\t}\n\n\t//////////////////////\n\t// ceilMultiple\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType ceilMultiple(genType Source, genType Multiple)\n\t{\n\t\treturn detail::compute_ceilMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> ceilMultiple(vec<L, T, Q> const& Source, vec<L, T, Q> const& Multiple)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(ceilMultiple, Source, Multiple);\n\t}\n\n\t//////////////////////\n\t// floorMultiple\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType floorMultiple(genType Source, genType Multiple)\n\t{\n\t\treturn detail::compute_floorMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> floorMultiple(vec<L, T, Q> const& Source, vec<L, T, Q> const& Multiple)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(floorMultiple, Source, Multiple);\n\t}\n\n\t//////////////////////\n\t// roundMultiple\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType roundMultiple(genType Source, genType Multiple)\n\t{\n\t\treturn detail::compute_roundMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> roundMultiple(vec<L, T, Q> const& Source, vec<L, T, Q> const& Multiple)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(roundMultiple, Source, Multiple);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/type_aligned.hpp",
    "content": "/// @ref gtc_type_aligned\n/// @file glm/gtc/type_aligned.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_type_aligned GLM_GTC_type_aligned\n/// @ingroup gtc\n///\n/// Include <glm/gtc/type_aligned.hpp> to use the features of this extension.\n///\n/// Aligned types allowing SIMD optimizations of vectors and matrices types\n\n#pragma once\n\n#if !GLM_HAS_ALIGNED_TYPE\n#\terror \"GLM: Aligned types are not supported on this platform\"\n#endif\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n# pragma message(\"GLM: GLM_GTC_type_aligned extension included\")\n#endif\n\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../gtc/vec1.hpp\"\n\nnamespace glm\n{\n\t/// @addtogroup gtc_type_aligned\n\t/// @{\n\n\t// -- *vec1 --\n\n\t/// 1 component vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<1, float, aligned_highp>\taligned_highp_vec1;\n\n\t/// 1 component vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<1, float, aligned_mediump>\taligned_mediump_vec1;\n\n\t/// 1 component vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<1, float, aligned_lowp>\t\taligned_lowp_vec1;\n\n\t/// 1 component vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<1, double, aligned_highp>\taligned_highp_dvec1;\n\n\t/// 1 component vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<1, double, aligned_mediump>\taligned_mediump_dvec1;\n\n\t/// 1 component vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<1, double, aligned_lowp>\taligned_lowp_dvec1;\n\n\t/// 1 component vector aligned in memory of signed integer numbers.\n\ttypedef vec<1, int, aligned_highp>\t\taligned_highp_ivec1;\n\n\t/// 1 component vector aligned in memory of signed integer numbers.\n\ttypedef vec<1, int, aligned_mediump>\taligned_mediump_ivec1;\n\n\t/// 1 component vector aligned in memory of signed integer numbers.\n\ttypedef vec<1, int, aligned_lowp>\t\taligned_lowp_ivec1;\n\n\t/// 1 component vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<1, uint, aligned_highp>\t\taligned_highp_uvec1;\n\n\t/// 1 component vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<1, uint, aligned_mediump>\taligned_mediump_uvec1;\n\n\t/// 1 component vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<1, uint, aligned_lowp>\t\taligned_lowp_uvec1;\n\n\t/// 1 component vector aligned in memory of bool values.\n\ttypedef vec<1, bool, aligned_highp>\t\taligned_highp_bvec1;\n\n\t/// 1 component vector aligned in memory of bool values.\n\ttypedef vec<1, bool, aligned_mediump>\taligned_mediump_bvec1;\n\n\t/// 1 component vector aligned in memory of bool values.\n\ttypedef vec<1, bool, aligned_lowp>\t\taligned_lowp_bvec1;\n\n\t/// 1 component vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<1, float, packed_highp>\t\tpacked_highp_vec1;\n\n\t/// 1 component vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<1, float, packed_mediump>\tpacked_mediump_vec1;\n\n\t/// 1 component vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<1, float, packed_lowp>\t\tpacked_lowp_vec1;\n\n\t/// 1 component vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<1, double, packed_highp>\tpacked_highp_dvec1;\n\n\t/// 1 component vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<1, double, packed_mediump>\tpacked_mediump_dvec1;\n\n\t/// 1 component vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<1, double, packed_lowp>\t\tpacked_lowp_dvec1;\n\n\t/// 1 component vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<1, int, packed_highp>\t\tpacked_highp_ivec1;\n\n\t/// 1 component vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<1, int, packed_mediump>\t\tpacked_mediump_ivec1;\n\n\t/// 1 component vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<1, int, packed_lowp>\t\tpacked_lowp_ivec1;\n\n\t/// 1 component vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<1, uint, packed_highp>\t\tpacked_highp_uvec1;\n\n\t/// 1 component vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<1, uint, packed_mediump>\tpacked_mediump_uvec1;\n\n\t/// 1 component vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<1, uint, packed_lowp>\t\tpacked_lowp_uvec1;\n\n\t/// 1 component vector tightly packed in memory of bool values.\n\ttypedef vec<1, bool, packed_highp>\t\tpacked_highp_bvec1;\n\n\t/// 1 component vector tightly packed in memory of bool values.\n\ttypedef vec<1, bool, packed_mediump>\tpacked_mediump_bvec1;\n\n\t/// 1 component vector tightly packed in memory of bool values.\n\ttypedef vec<1, bool, packed_lowp>\t\tpacked_lowp_bvec1;\n\n\t// -- *vec2 --\n\n\t/// 2 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<2, float, aligned_highp>\taligned_highp_vec2;\n\n\t/// 2 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<2, float, aligned_mediump>\taligned_mediump_vec2;\n\n\t/// 2 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<2, float, aligned_lowp>\t\taligned_lowp_vec2;\n\n\t/// 2 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<2, double, aligned_highp>\taligned_highp_dvec2;\n\n\t/// 2 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<2, double, aligned_mediump>\taligned_mediump_dvec2;\n\n\t/// 2 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<2, double, aligned_lowp>\taligned_lowp_dvec2;\n\n\t/// 2 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<2, int, aligned_highp>\t\taligned_highp_ivec2;\n\n\t/// 2 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<2, int, aligned_mediump>\taligned_mediump_ivec2;\n\n\t/// 2 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<2, int, aligned_lowp>\t\taligned_lowp_ivec2;\n\n\t/// 2 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<2, uint, aligned_highp>\t\taligned_highp_uvec2;\n\n\t/// 2 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<2, uint, aligned_mediump>\taligned_mediump_uvec2;\n\n\t/// 2 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<2, uint, aligned_lowp>\t\taligned_lowp_uvec2;\n\n\t/// 2 components vector aligned in memory of bool values.\n\ttypedef vec<2, bool, aligned_highp>\t\taligned_highp_bvec2;\n\n\t/// 2 components vector aligned in memory of bool values.\n\ttypedef vec<2, bool, aligned_mediump>\taligned_mediump_bvec2;\n\n\t/// 2 components vector aligned in memory of bool values.\n\ttypedef vec<2, bool, aligned_lowp>\t\taligned_lowp_bvec2;\n\n\t/// 2 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<2, float, packed_highp>\t\tpacked_highp_vec2;\n\n\t/// 2 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<2, float, packed_mediump>\tpacked_mediump_vec2;\n\n\t/// 2 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<2, float, packed_lowp>\t\tpacked_lowp_vec2;\n\n\t/// 2 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<2, double, packed_highp>\tpacked_highp_dvec2;\n\n\t/// 2 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<2, double, packed_mediump>\tpacked_mediump_dvec2;\n\n\t/// 2 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<2, double, packed_lowp>\t\tpacked_lowp_dvec2;\n\n\t/// 2 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<2, int, packed_highp>\t\tpacked_highp_ivec2;\n\n\t/// 2 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<2, int, packed_mediump>\t\tpacked_mediump_ivec2;\n\n\t/// 2 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<2, int, packed_lowp>\t\tpacked_lowp_ivec2;\n\n\t/// 2 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<2, uint, packed_highp>\t\tpacked_highp_uvec2;\n\n\t/// 2 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<2, uint, packed_mediump>\tpacked_mediump_uvec2;\n\n\t/// 2 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<2, uint, packed_lowp>\t\tpacked_lowp_uvec2;\n\n\t/// 2 components vector tightly packed in memory of bool values.\n\ttypedef vec<2, bool, packed_highp>\t\tpacked_highp_bvec2;\n\n\t/// 2 components vector tightly packed in memory of bool values.\n\ttypedef vec<2, bool, packed_mediump>\tpacked_mediump_bvec2;\n\n\t/// 2 components vector tightly packed in memory of bool values.\n\ttypedef vec<2, bool, packed_lowp>\t\tpacked_lowp_bvec2;\n\n\t// -- *vec3 --\n\n\t/// 3 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<3, float, aligned_highp>\taligned_highp_vec3;\n\n\t/// 3 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<3, float, aligned_mediump>\taligned_mediump_vec3;\n\n\t/// 3 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<3, float, aligned_lowp>\t\taligned_lowp_vec3;\n\n\t/// 3 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<3, double, aligned_highp>\taligned_highp_dvec3;\n\n\t/// 3 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<3, double, aligned_mediump>\taligned_mediump_dvec3;\n\n\t/// 3 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<3, double, aligned_lowp>\taligned_lowp_dvec3;\n\n\t/// 3 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<3, int, aligned_highp>\t\taligned_highp_ivec3;\n\n\t/// 3 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<3, int, aligned_mediump>\taligned_mediump_ivec3;\n\n\t/// 3 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<3, int, aligned_lowp>\t\taligned_lowp_ivec3;\n\n\t/// 3 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<3, uint, aligned_highp>\t\taligned_highp_uvec3;\n\n\t/// 3 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<3, uint, aligned_mediump>\taligned_mediump_uvec3;\n\n\t/// 3 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<3, uint, aligned_lowp>\t\taligned_lowp_uvec3;\n\n\t/// 3 components vector aligned in memory of bool values.\n\ttypedef vec<3, bool, aligned_highp>\t\taligned_highp_bvec3;\n\n\t/// 3 components vector aligned in memory of bool values.\n\ttypedef vec<3, bool, aligned_mediump>\taligned_mediump_bvec3;\n\n\t/// 3 components vector aligned in memory of bool values.\n\ttypedef vec<3, bool, aligned_lowp>\t\taligned_lowp_bvec3;\n\n\t/// 3 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<3, float, packed_highp>\t\tpacked_highp_vec3;\n\n\t/// 3 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<3, float, packed_mediump>\tpacked_mediump_vec3;\n\n\t/// 3 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<3, float, packed_lowp>\t\tpacked_lowp_vec3;\n\n\t/// 3 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<3, double, packed_highp>\tpacked_highp_dvec3;\n\n\t/// 3 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<3, double, packed_mediump>\tpacked_mediump_dvec3;\n\n\t/// 3 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<3, double, packed_lowp>\t\tpacked_lowp_dvec3;\n\n\t/// 3 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<3, int, packed_highp>\t\tpacked_highp_ivec3;\n\n\t/// 3 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<3, int, packed_mediump>\t\tpacked_mediump_ivec3;\n\n\t/// 3 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<3, int, packed_lowp>\t\tpacked_lowp_ivec3;\n\n\t/// 3 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<3, uint, packed_highp>\t\tpacked_highp_uvec3;\n\n\t/// 3 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<3, uint, packed_mediump>\tpacked_mediump_uvec3;\n\n\t/// 3 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<3, uint, packed_lowp>\t\tpacked_lowp_uvec3;\n\n\t/// 3 components vector tightly packed in memory of bool values.\n\ttypedef vec<3, bool, packed_highp>\t\tpacked_highp_bvec3;\n\n\t/// 3 components vector tightly packed in memory of bool values.\n\ttypedef vec<3, bool, packed_mediump>\tpacked_mediump_bvec3;\n\n\t/// 3 components vector tightly packed in memory of bool values.\n\ttypedef vec<3, bool, packed_lowp>\t\tpacked_lowp_bvec3;\n\n\t// -- *vec4 --\n\n\t/// 4 components vector aligned in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<4, float, aligned_highp>\taligned_highp_vec4;\n\n\t/// 4 components vector aligned in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<4, float, aligned_mediump>\taligned_mediump_vec4;\n\n\t/// 4 components vector aligned in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<4, float, aligned_lowp>\t\taligned_lowp_vec4;\n\n\t/// 4 components vector aligned in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<4, double, aligned_highp>\taligned_highp_dvec4;\n\n\t/// 4 components vector aligned in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<4, double, aligned_mediump>\taligned_mediump_dvec4;\n\n\t/// 4 components vector aligned in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<4, double, aligned_lowp>\taligned_lowp_dvec4;\n\n\t/// 4 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<4, int, aligned_highp>\t\taligned_highp_ivec4;\n\n\t/// 4 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<4, int, aligned_mediump>\taligned_mediump_ivec4;\n\n\t/// 4 components vector aligned in memory of signed integer numbers.\n\ttypedef vec<4, int, aligned_lowp>\t\taligned_lowp_ivec4;\n\n\t/// 4 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<4, uint, aligned_highp>\t\taligned_highp_uvec4;\n\n\t/// 4 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<4, uint, aligned_mediump>\taligned_mediump_uvec4;\n\n\t/// 4 components vector aligned in memory of unsigned integer numbers.\n\ttypedef vec<4, uint, aligned_lowp>\t\taligned_lowp_uvec4;\n\n\t/// 4 components vector aligned in memory of bool values.\n\ttypedef vec<4, bool, aligned_highp>\t\taligned_highp_bvec4;\n\n\t/// 4 components vector aligned in memory of bool values.\n\ttypedef vec<4, bool, aligned_mediump>\taligned_mediump_bvec4;\n\n\t/// 4 components vector aligned in memory of bool values.\n\ttypedef vec<4, bool, aligned_lowp>\t\taligned_lowp_bvec4;\n\n\t/// 4 components vector tightly packed in memory of single-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<4, float, packed_highp>\t\tpacked_highp_vec4;\n\n\t/// 4 components vector tightly packed in memory of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<4, float, packed_mediump>\tpacked_mediump_vec4;\n\n\t/// 4 components vector tightly packed in memory of single-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<4, float, packed_lowp>\t\tpacked_lowp_vec4;\n\n\t/// 4 components vector tightly packed in memory of double-precision floating-point numbers using high precision arithmetic in term of ULPs.\n\ttypedef vec<4, double, packed_highp>\tpacked_highp_dvec4;\n\n\t/// 4 components vector tightly packed in memory of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.\n\ttypedef vec<4, double, packed_mediump>\tpacked_mediump_dvec4;\n\n\t/// 4 components vector tightly packed in memory of double-precision floating-point numbers using low precision arithmetic in term of ULPs.\n\ttypedef vec<4, double, packed_lowp>\t\tpacked_lowp_dvec4;\n\n\t/// 4 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<4, int, packed_highp>\t\tpacked_highp_ivec4;\n\n\t/// 4 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<4, int, packed_mediump>\t\tpacked_mediump_ivec4;\n\n\t/// 4 components vector tightly packed in memory of signed integer numbers.\n\ttypedef vec<4, int, packed_lowp>\t\tpacked_lowp_ivec4;\n\n\t/// 4 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<4, uint, packed_highp>\t\tpacked_highp_uvec4;\n\n\t/// 4 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<4, uint, packed_mediump>\tpacked_mediump_uvec4;\n\n\t/// 4 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef vec<4, uint, packed_lowp>\t\tpacked_lowp_uvec4;\n\n\t/// 4 components vector tightly packed in memory of bool values.\n\ttypedef vec<4, bool, packed_highp>\t\tpacked_highp_bvec4;\n\n\t/// 4 components vector tightly packed in memory of bool values.\n\ttypedef vec<4, bool, packed_mediump>\tpacked_mediump_bvec4;\n\n\t/// 4 components vector tightly packed in memory of bool values.\n\ttypedef vec<4, bool, packed_lowp>\t\tpacked_lowp_bvec4;\n\n\t// -- default --\n\n#if(defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef aligned_lowp_vec1\t\t\taligned_vec1;\n\ttypedef aligned_lowp_vec2\t\t\taligned_vec2;\n\ttypedef aligned_lowp_vec3\t\t\taligned_vec3;\n\ttypedef aligned_lowp_vec4\t\t\taligned_vec4;\n\ttypedef packed_lowp_vec1\t\t\tpacked_vec1;\n\ttypedef packed_lowp_vec2\t\t\tpacked_vec2;\n\ttypedef packed_lowp_vec3\t\t\tpacked_vec3;\n\ttypedef packed_lowp_vec4\t\t\tpacked_vec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))\n\ttypedef aligned_mediump_vec1\t\taligned_vec1;\n\ttypedef aligned_mediump_vec2\t\taligned_vec2;\n\ttypedef aligned_mediump_vec3\t\taligned_vec3;\n\ttypedef aligned_mediump_vec4\t\taligned_vec4;\n\ttypedef packed_mediump_vec1\t\t\tpacked_vec1;\n\ttypedef packed_mediump_vec2\t\t\tpacked_vec2;\n\ttypedef packed_mediump_vec3\t\t\tpacked_vec3;\n\ttypedef packed_mediump_vec4\t\t\tpacked_vec4;\n#else //defined(GLM_PRECISION_HIGHP_FLOAT)\n\t/// 1 component vector aligned in memory of single-precision floating-point numbers.\n\ttypedef aligned_highp_vec1\t\t\taligned_vec1;\n\n\t/// 2 components vector aligned in memory of single-precision floating-point numbers.\n\ttypedef aligned_highp_vec2\t\t\taligned_vec2;\n\n\t/// 3 components vector aligned in memory of single-precision floating-point numbers.\n\ttypedef aligned_highp_vec3\t\t\taligned_vec3;\n\n\t/// 4 components vector aligned in memory of single-precision floating-point numbers.\n\ttypedef aligned_highp_vec4\t\t\taligned_vec4;\n\n\t/// 1 component vector tightly packed in memory of single-precision floating-point numbers.\n\ttypedef packed_highp_vec1\t\t\tpacked_vec1;\n\n\t/// 2 components vector tightly packed in memory of single-precision floating-point numbers.\n\ttypedef packed_highp_vec2\t\t\tpacked_vec2;\n\n\t/// 3 components vector tightly packed in memory of single-precision floating-point numbers.\n\ttypedef packed_highp_vec3\t\t\tpacked_vec3;\n\n\t/// 4 components vector tightly packed in memory of single-precision floating-point numbers.\n\ttypedef packed_highp_vec4\t\t\tpacked_vec4;\n#endif//GLM_PRECISION\n\n#if(defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef aligned_lowp_dvec1\t\t\taligned_dvec1;\n\ttypedef aligned_lowp_dvec2\t\t\taligned_dvec2;\n\ttypedef aligned_lowp_dvec3\t\t\taligned_dvec3;\n\ttypedef aligned_lowp_dvec4\t\t\taligned_dvec4;\n\ttypedef packed_lowp_dvec1\t\t\tpacked_dvec1;\n\ttypedef packed_lowp_dvec2\t\t\tpacked_dvec2;\n\ttypedef packed_lowp_dvec3\t\t\tpacked_dvec3;\n\ttypedef packed_lowp_dvec4\t\t\tpacked_dvec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))\n\ttypedef aligned_mediump_dvec1\t\taligned_dvec1;\n\ttypedef aligned_mediump_dvec2\t\taligned_dvec2;\n\ttypedef aligned_mediump_dvec3\t\taligned_dvec3;\n\ttypedef aligned_mediump_dvec4\t\taligned_dvec4;\n\ttypedef packed_mediump_dvec1\t\tpacked_dvec1;\n\ttypedef packed_mediump_dvec2\t\tpacked_dvec2;\n\ttypedef packed_mediump_dvec3\t\tpacked_dvec3;\n\ttypedef packed_mediump_dvec4\t\tpacked_dvec4;\n#else //defined(GLM_PRECISION_HIGHP_DOUBLE)\n\t/// 1 component vector aligned in memory of double-precision floating-point numbers.\n\ttypedef aligned_highp_dvec1\t\t\taligned_dvec1;\n\n\t/// 2 components vector aligned in memory of double-precision floating-point numbers.\n\ttypedef aligned_highp_dvec2\t\t\taligned_dvec2;\n\n\t/// 3 components vector aligned in memory of double-precision floating-point numbers.\n\ttypedef aligned_highp_dvec3\t\t\taligned_dvec3;\n\n\t/// 4 components vector aligned in memory of double-precision floating-point numbers.\n\ttypedef aligned_highp_dvec4\t\t\taligned_dvec4;\n\n\t/// 1 component vector tightly packed in memory of double-precision floating-point numbers.\n\ttypedef packed_highp_dvec1\t\t\tpacked_dvec1;\n\n\t/// 2 components vector tightly packed in memory of double-precision floating-point numbers.\n\ttypedef packed_highp_dvec2\t\t\tpacked_dvec2;\n\n\t/// 3 components vector tightly packed in memory of double-precision floating-point numbers.\n\ttypedef packed_highp_dvec3\t\t\tpacked_dvec3;\n\n\t/// 4 components vector tightly packed in memory of double-precision floating-point numbers.\n\ttypedef packed_highp_dvec4\t\t\tpacked_dvec4;\n#endif//GLM_PRECISION\n\n#if(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef aligned_lowp_ivec1\t\t\taligned_ivec1;\n\ttypedef aligned_lowp_ivec2\t\t\taligned_ivec2;\n\ttypedef aligned_lowp_ivec3\t\t\taligned_ivec3;\n\ttypedef aligned_lowp_ivec4\t\t\taligned_ivec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef aligned_mediump_ivec1\t\taligned_ivec1;\n\ttypedef aligned_mediump_ivec2\t\taligned_ivec2;\n\ttypedef aligned_mediump_ivec3\t\taligned_ivec3;\n\ttypedef aligned_mediump_ivec4\t\taligned_ivec4;\n#else //defined(GLM_PRECISION_HIGHP_INT)\n\t/// 1 component vector aligned in memory of signed integer numbers.\n\ttypedef aligned_highp_ivec1\t\t\taligned_ivec1;\n\n\t/// 2 components vector aligned in memory of signed integer numbers.\n\ttypedef aligned_highp_ivec2\t\t\taligned_ivec2;\n\n\t/// 3 components vector aligned in memory of signed integer numbers.\n\ttypedef aligned_highp_ivec3\t\t\taligned_ivec3;\n\n\t/// 4 components vector aligned in memory of signed integer numbers.\n\ttypedef aligned_highp_ivec4\t\t\taligned_ivec4;\n\n\t/// 1 component vector tightly packed in memory of signed integer numbers.\n\ttypedef packed_highp_ivec1\t\t\tpacked_ivec1;\n\n\t/// 2 components vector tightly packed in memory of signed integer numbers.\n\ttypedef packed_highp_ivec2\t\t\tpacked_ivec2;\n\n\t/// 3 components vector tightly packed in memory of signed integer numbers.\n\ttypedef packed_highp_ivec3\t\t\tpacked_ivec3;\n\n\t/// 4 components vector tightly packed in memory of signed integer numbers.\n\ttypedef packed_highp_ivec4\t\t\tpacked_ivec4;\n\n#endif//GLM_PRECISION\n\n\t// -- Unsigned integer definition --\n\n#if(defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef aligned_lowp_uvec1\t\t\taligned_uvec1;\n\ttypedef aligned_lowp_uvec2\t\t\taligned_uvec2;\n\ttypedef aligned_lowp_uvec3\t\t\taligned_uvec3;\n\ttypedef aligned_lowp_uvec4\t\t\taligned_uvec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_UINT))\n\ttypedef aligned_mediump_uvec1\t\taligned_uvec1;\n\ttypedef aligned_mediump_uvec2\t\taligned_uvec2;\n\ttypedef aligned_mediump_uvec3\t\taligned_uvec3;\n\ttypedef aligned_mediump_uvec4\t\taligned_uvec4;\n#else //defined(GLM_PRECISION_HIGHP_UINT)\n\t/// 1 component vector aligned in memory of unsigned integer numbers.\n\ttypedef aligned_highp_uvec1\t\t\taligned_uvec1;\n\n\t/// 2 components vector aligned in memory of unsigned integer numbers.\n\ttypedef aligned_highp_uvec2\t\t\taligned_uvec2;\n\n\t/// 3 components vector aligned in memory of unsigned integer numbers.\n\ttypedef aligned_highp_uvec3\t\t\taligned_uvec3;\n\n\t/// 4 components vector aligned in memory of unsigned integer numbers.\n\ttypedef aligned_highp_uvec4\t\t\taligned_uvec4;\n\n\t/// 1 component vector tightly packed in memory of unsigned integer numbers.\n\ttypedef packed_highp_uvec1\t\t\tpacked_uvec1;\n\n\t/// 2 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef packed_highp_uvec2\t\t\tpacked_uvec2;\n\n\t/// 3 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef packed_highp_uvec3\t\t\tpacked_uvec3;\n\n\t/// 4 components vector tightly packed in memory of unsigned integer numbers.\n\ttypedef packed_highp_uvec4\t\t\tpacked_uvec4;\n#endif//GLM_PRECISION\n\n#if(defined(GLM_PRECISION_LOWP_BOOL))\n\ttypedef aligned_lowp_bvec1\t\t\taligned_bvec1;\n\ttypedef aligned_lowp_bvec2\t\t\taligned_bvec2;\n\ttypedef aligned_lowp_bvec3\t\t\taligned_bvec3;\n\ttypedef aligned_lowp_bvec4\t\t\taligned_bvec4;\n#elif(defined(GLM_PRECISION_MEDIUMP_BOOL))\n\ttypedef aligned_mediump_bvec1\t\taligned_bvec1;\n\ttypedef aligned_mediump_bvec2\t\taligned_bvec2;\n\ttypedef aligned_mediump_bvec3\t\taligned_bvec3;\n\ttypedef aligned_mediump_bvec4\t\taligned_bvec4;\n#else //defined(GLM_PRECISION_HIGHP_BOOL)\n\t/// 1 component vector aligned in memory of bool values.\n\ttypedef aligned_highp_bvec1\t\t\taligned_bvec1;\n\n\t/// 2 components vector aligned in memory of bool values.\n\ttypedef aligned_highp_bvec2\t\t\taligned_bvec2;\n\n\t/// 3 components vector aligned in memory of bool values.\n\ttypedef aligned_highp_bvec3\t\t\taligned_bvec3;\n\n\t/// 4 components vector aligned in memory of bool values.\n\ttypedef aligned_highp_bvec4\t\t\taligned_bvec4;\n\n\t/// 1 components vector tightly packed in memory of bool values.\n\ttypedef packed_highp_bvec1\t\t\tpacked_bvec1;\n\n\t/// 2 components vector tightly packed in memory of bool values.\n\ttypedef packed_highp_bvec2\t\t\tpacked_bvec2;\n\n\t/// 3 components vector tightly packed in memory of bool values.\n\ttypedef packed_highp_bvec3\t\t\tpacked_bvec3;\n\n\t/// 4 components vector tightly packed in memory of bool values.\n\ttypedef packed_highp_bvec4\t\t\tpacked_bvec4;\n#endif//GLM_PRECISION\n\n\t/// @}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/type_precision.hpp",
    "content": "/// @ref gtc_type_precision\n/// @file glm/gtc/type_precision.hpp\n///\n/// @see core (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtc_type_precision GLM_GTC_type_precision\n/// @ingroup gtc\n///\n/// Include <glm/gtc/type_precision.hpp> to use the features of this extension.\n///\n/// Defines specific C++-based qualifier types.\n/// \n/// @ref core_precision defines types based on GLSL's qualifier qualifiers. This\n/// extension defines types based on explicitly-sized C++ data types.\n\n#pragma once\n\n// Dependency:\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtc/vec1.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../mat2x2.hpp\"\n#include \"../mat2x3.hpp\"\n#include \"../mat2x4.hpp\"\n#include \"../mat3x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat3x4.hpp\"\n#include \"../mat4x2.hpp\"\n#include \"../mat4x3.hpp\"\n#include \"../mat4x4.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_type_precision extension included\")\n#endif\n\nnamespace glm\n{\n\t///////////////////////////\n\t// Signed int vector types \n\n\t/// @addtogroup gtc_type_precision\n\t/// @{\n\n\t/// Low qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 lowp_int8;\n\t\n\t/// Low qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 lowp_int16;\n\n\t/// Low qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 lowp_int32;\n\n\t/// Low qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 lowp_int64;\n\n\t/// Low qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 lowp_int8_t;\n\t\n\t/// Low qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 lowp_int16_t;\n\n\t/// Low qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 lowp_int32_t;\n\n\t/// Low qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 lowp_int64_t;\n\n\t/// Low qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 lowp_i8;\n\t\n\t/// Low qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 lowp_i16;\n\n\t/// Low qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 lowp_i32;\n\n\t/// Low qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 lowp_i64;\n\n\t/// Medium qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 mediump_int8;\n\t\n\t/// Medium qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 mediump_int16;\n\n\t/// Medium qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 mediump_int32;\n\n\t/// Medium qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 mediump_int64;\n\n\t/// Medium qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 mediump_int8_t;\n\t\n\t/// Medium qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 mediump_int16_t;\n\n\t/// Medium qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 mediump_int32_t;\n\n\t/// Medium qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 mediump_int64_t;\n\n\t/// Medium qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 mediump_i8;\n\t\n\t/// Medium qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 mediump_i16;\n\n\t/// Medium qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 mediump_i32;\n\n\t/// Medium qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 mediump_i64;\n\n\t/// High qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 highp_int8;\n\t\n\t/// High qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 highp_int16;\n\n\t/// High qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 highp_int32;\n\n\t/// High qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 highp_int64;\n\n\t/// High qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 highp_int8_t;\n\t\n\t/// High qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 highp_int16_t;\n\n\t/// 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 highp_int32_t;\n\n\t/// High qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 highp_int64_t;\n\n\t/// High qualifier 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 highp_i8;\n\t\n\t/// High qualifier 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 highp_i16;\n\n\t/// High qualifier 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 highp_i32;\n\n\t/// High qualifier 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 highp_i64;\n\t\n\n\t/// 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 int8;\n\t\n\t/// 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 int16;\n\n\t/// 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 int32;\n\n\t/// 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 int64;\n\n#if GLM_HAS_EXTENDED_INTEGER_TYPE\n\tusing std::int8_t;\n\tusing std::int16_t;\n\tusing std::int32_t;\n\tusing std::int64_t;\n#else\n\t/// 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 int8_t;\n\t\n\t/// 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 int16_t;\n\n\t/// 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 int32_t;\n\n\t/// 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 int64_t;\n#endif\n\n\t/// 8 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int8 i8;\n\t\n\t/// 16 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int16 i16;\n\n\t/// 32 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int32 i32;\n\n\t/// 64 bit signed integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::int64 i64;\n\n\n\t/// 8 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i8, defaultp> i8vec1;\n\t\n\t/// 8 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i8, defaultp> i8vec2;\n\n\t/// 8 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i8, defaultp> i8vec3;\n\n\t/// 8 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i8, defaultp> i8vec4;\n\n\n\t/// 16 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i16, defaultp> i16vec1;\n\t\n\t/// 16 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i16, defaultp> i16vec2;\n\n\t/// 16 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i16, defaultp> i16vec3;\n\n\t/// 16 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i16, defaultp> i16vec4;\n\n\n\t/// 32 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i32, defaultp> i32vec1;\n\t\n\t/// 32 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i32, defaultp> i32vec2;\n\n\t/// 32 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i32, defaultp> i32vec3;\n\n\t/// 32 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i32, defaultp> i32vec4;\n\n\n\t/// 64 bit signed integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, i64, defaultp> i64vec1;\n\t\n\t/// 64 bit signed integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, i64, defaultp> i64vec2;\n\n\t/// 64 bit signed integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, i64, defaultp> i64vec3;\n\n\t/// 64 bit signed integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, i64, defaultp> i64vec4;\n\n\n\t/////////////////////////////\n\t// Unsigned int vector types\n\n\t/// Low qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 lowp_uint8;\n\t\n\t/// Low qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 lowp_uint16;\n\n\t/// Low qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 lowp_uint32;\n\n\t/// Low qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 lowp_uint64;\n\n\t/// Low qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 lowp_uint8_t;\n\t\n\t/// Low qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 lowp_uint16_t;\n\n\t/// Low qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 lowp_uint32_t;\n\n\t/// Low qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 lowp_uint64_t;\n\n\t/// Low qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 lowp_u8;\n\t\n\t/// Low qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 lowp_u16;\n\n\t/// Low qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 lowp_u32;\n\n\t/// Low qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 lowp_u64;\n\t\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 mediump_uint8;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 mediump_uint16;\n\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 mediump_uint32;\n\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 mediump_uint64;\n\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 mediump_uint8_t;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 mediump_uint16_t;\n\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 mediump_uint32_t;\n\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 mediump_uint64_t;\n\n\t/// Medium qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 mediump_u8;\n\t\n\t/// Medium qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 mediump_u16;\n\n\t/// Medium qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 mediump_u32;\n\n\t/// Medium qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 mediump_u64;\n\t\n\t/// High qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 highp_uint8;\n\t\n\t/// High qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 highp_uint16;\n\n\t/// High qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 highp_uint32;\n\n\t/// High qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 highp_uint64;\n\n\t/// High qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 highp_uint8_t;\n\t\n\t/// High qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 highp_uint16_t;\n\n\t/// High qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 highp_uint32_t;\n\n\t/// High qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 highp_uint64_t;\n\n\t/// High qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 highp_u8;\n\t\n\t/// High qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 highp_u16;\n\n\t/// High qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 highp_u32;\n\n\t/// High qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 highp_u64;\n\n\t/// Default qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 uint8;\n\t\n\t/// Default qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 uint16;\n\n\t/// Default qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 uint32;\n\n\t/// Default qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 uint64;\n\n#if GLM_HAS_EXTENDED_INTEGER_TYPE\n\tusing std::uint8_t;\n\tusing std::uint16_t;\n\tusing std::uint32_t;\n\tusing std::uint64_t;\n#else\n\t/// Default qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 uint8_t;\n\t\n\t/// Default qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 uint16_t;\n\n\t/// Default qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 uint32_t;\n\n\t/// Default qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 uint64_t;\n#endif\n\n\t/// Default qualifier 8 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint8 u8;\n\t\n\t/// Default qualifier 16 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint16 u16;\n\n\t/// Default qualifier 32 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint32 u32;\n\n\t/// Default qualifier 64 bit unsigned integer type.\n\t/// @see gtc_type_precision\n\ttypedef detail::uint64 u64;\n\n\n\n\t/// Default qualifier 8 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u8, defaultp> u8vec1;\n\t\n\t/// Default qualifier 8 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u8, defaultp> u8vec2;\n\n\t/// Default qualifier 8 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u8, defaultp> u8vec3;\n\n\t/// Default qualifier 8 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u8, defaultp> u8vec4;\n\n\n\t/// Default qualifier 16 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u16, defaultp> u16vec1;\n\t\n\t/// Default qualifier 16 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u16, defaultp> u16vec2;\n\n\t/// Default qualifier 16 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u16, defaultp> u16vec3;\n\n\t/// Default qualifier 16 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u16, defaultp> u16vec4;\n\n\n\t/// Default qualifier 32 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u32, defaultp> u32vec1;\n\t\n\t/// Default qualifier 32 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u32, defaultp> u32vec2;\n\n\t/// Default qualifier 32 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u32, defaultp> u32vec3;\n\n\t/// Default qualifier 32 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u32, defaultp> u32vec4;\n\n\n\t/// Default qualifier 64 bit unsigned integer scalar type.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, u64, defaultp> u64vec1;\n\t\n\t/// Default qualifier 64 bit unsigned integer vector of 2 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, u64, defaultp> u64vec2;\n\n\t/// Default qualifier 64 bit unsigned integer vector of 3 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, u64, defaultp> u64vec3;\n\n\t/// Default qualifier 64 bit unsigned integer vector of 4 components type.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, u64, defaultp> u64vec4;\n\n\n\t//////////////////////\n\t// Float vector types\n\n\t/// 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 float32;\n\n\t/// 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef detail::float32 float32_t;\n\n\t/// 32 bit single-qualifier floating-point scalar.\n\t/// @see gtc_type_precision\n\ttypedef float32 f32;\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\t\t/// 64 bit double-qualifier floating-point scalar.\n\t\t/// @see gtc_type_precision\n\t\ttypedef detail::float64 float64;\n\n\t\t/// 64 bit double-qualifier floating-point scalar.\n\t\t/// @see gtc_type_precision\n\t\ttypedef detail::float64 float64_t;\n\n\t\t/// 64 bit double-qualifier floating-point scalar.\n\t\t/// @see gtc_type_precision\n\t\ttypedef float64 f64;\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n\t/// Single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, float, defaultp> fvec1;\n\n\t/// Single-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, float, defaultp> fvec2;\n\n\t/// Single-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, float, defaultp> fvec3;\n\n\t/// Single-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, float, defaultp> fvec4;\n\n\t\n\t/// Single-qualifier floating-point vector of 1 component.\n\t/// @see gtc_type_precision\n\ttypedef vec<1, f32, defaultp> f32vec1;\n\n\t/// Single-qualifier floating-point vector of 2 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<2, f32, defaultp> f32vec2;\n\n\t/// Single-qualifier floating-point vector of 3 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<3, f32, defaultp> f32vec3;\n\n\t/// Single-qualifier floating-point vector of 4 components.\n\t/// @see gtc_type_precision\n\ttypedef vec<4, f32, defaultp> f32vec4;\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\t\t/// Double-qualifier floating-point vector of 1 component.\n\t\t/// @see gtc_type_precision\n\t\ttypedef vec<1, f64, defaultp> f64vec1;\n\n\t\t/// Double-qualifier floating-point vector of 2 components.\n\t\t/// @see gtc_type_precision\n\t\ttypedef vec<2, f64, defaultp> f64vec2;\n\n\t\t/// Double-qualifier floating-point vector of 3 components.\n\t\t/// @see gtc_type_precision\n\t\ttypedef vec<3, f64, defaultp> f64vec3;\n\n\t\t/// Double-qualifier floating-point vector of 4 components.\n\t\t/// @see gtc_type_precision\n\t\ttypedef vec<4, f64, defaultp> f64vec4;\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n\n\t//////////////////////\n\t// Float matrix types \n\n\t/// Single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef detail::tmat1x1<f32> fmat1;\n\n\t/// Single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, defaultp> fmat2;\n\n\t/// Single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, defaultp> fmat3;\n\n\t/// Single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, defaultp> fmat4;\n\n\n\t/// Single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f32 fmat1x1;\n\n\t/// Single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, defaultp> fmat2x2;\n\n\t/// Single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f32, defaultp> fmat2x3;\n\n\t/// Single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f32, defaultp> fmat2x4;\n\n\t/// Single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f32, defaultp> fmat3x2;\n\n\t/// Single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, defaultp> fmat3x3;\n\n\t/// Single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f32, defaultp> fmat3x4;\n\n\t/// Single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f32, defaultp> fmat4x2;\n\n\t/// Single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f32, defaultp> fmat4x3;\n\n\t/// Single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, defaultp> fmat4x4;\n\n\n\t/// Single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef detail::tmat1x1<f32, defaultp> f32mat1;\n\n\t/// Single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, defaultp> f32mat2;\n\n\t/// Single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, defaultp> f32mat3;\n\n\t/// Single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, defaultp> f32mat4;\n\n\n\t/// Single-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f32 f32mat1x1;\n\n\t/// Single-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f32, defaultp> f32mat2x2;\n\n\t/// Single-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f32, defaultp> f32mat2x3;\n\n\t/// Single-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f32, defaultp> f32mat2x4;\n\n\t/// Single-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f32, defaultp> f32mat3x2;\n\n\t/// Single-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f32, defaultp> f32mat3x3;\n\n\t/// Single-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f32, defaultp> f32mat3x4;\n\n\t/// Single-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f32, defaultp> f32mat4x2;\n\n\t/// Single-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f32, defaultp> f32mat4x3;\n\n\t/// Single-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f32, defaultp> f32mat4x4;\n\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\n\t/// Double-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef detail::tmat1x1<f64, defaultp> f64mat1;\n\n\t/// Double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f64, defaultp> f64mat2;\n\n\t/// Double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f64, defaultp> f64mat3;\n\n\t/// Double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f64, defaultp> f64mat4;\n\n\n\t/// Double-qualifier floating-point 1x1 matrix.\n\t/// @see gtc_type_precision\n\t//typedef f64 f64mat1x1;\n\n\t/// Double-qualifier floating-point 2x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 2, f64, defaultp> f64mat2x2;\n\n\t/// Double-qualifier floating-point 2x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 3, f64, defaultp> f64mat2x3;\n\n\t/// Double-qualifier floating-point 2x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<2, 4, f64, defaultp> f64mat2x4;\n\n\t/// Double-qualifier floating-point 3x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 2, f64, defaultp> f64mat3x2;\n\n\t/// Double-qualifier floating-point 3x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 3, f64, defaultp> f64mat3x3;\n\n\t/// Double-qualifier floating-point 3x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<3, 4, f64, defaultp> f64mat3x4;\n\n\t/// Double-qualifier floating-point 4x2 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 2, f64, defaultp> f64mat4x2;\n\n\t/// Double-qualifier floating-point 4x3 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 3, f64, defaultp> f64mat4x3;\n\n\t/// Double-qualifier floating-point 4x4 matrix.\n\t/// @see gtc_type_precision\n\ttypedef mat<4, 4, f64, defaultp> f64mat4x4;\n\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n\t//////////////////////////\n\t// Quaternion types\n\n\t/// Single-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef tquat<f32, defaultp> f32quat;\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\n\t/// Double-qualifier floating-point quaternion.\n\t/// @see gtc_type_precision\n\ttypedef tquat<f64, defaultp> f64quat;\n\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n\t/// @}\n}//namespace glm\n\n#include \"type_precision.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/type_precision.inl",
    "content": "/// @ref gtc_swizzle\n/// @file glm/gtc/swizzle.inl\n\nnamespace glm\n{\n\n}\n"
  },
  {
    "path": "external/glm/glm/gtc/type_ptr.hpp",
    "content": "/// @ref gtc_type_ptr\n/// @file glm/gtc/type_ptr.hpp\n///\n/// @see core (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtc_type_ptr GLM_GTC_type_ptr\n/// @ingroup gtc\n///\n/// Include <glm/gtc/type_ptr.hpp> to use the features of this extension.\n///\n/// Handles the interaction between pointers and vector, matrix types.\n///\n/// This extension defines an overloaded function, glm::value_ptr, which\n/// takes any of the \\ref core_template \"core template types\". It returns\n/// a pointer to the memory layout of the object. Matrix types store their values\n/// in column-major order.\n/// \n/// This is useful for uploading data to matrices or copying data to buffer objects.\n///\n/// Example:\n/// @code\n/// #include <glm/glm.hpp>\n/// #include <glm/gtc/type_ptr.hpp>\n///\n/// glm::vec3 aVector(3);\n/// glm::mat4 someMatrix(1.0);\n///\n/// glUniform3fv(uniformLoc, 1, glm::value_ptr(aVector));\n/// glUniformMatrix4fv(uniformMatrixLoc, 1, GL_FALSE, glm::value_ptr(someMatrix));\n/// @endcode\n///\n/// <glm/gtc/type_ptr.hpp> need to be included to use the features of this extension.\n\n#pragma once\n\n// Dependency:\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtc/vec1.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../mat2x2.hpp\"\n#include \"../mat2x3.hpp\"\n#include \"../mat2x4.hpp\"\n#include \"../mat3x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat3x4.hpp\"\n#include \"../mat4x2.hpp\"\n#include \"../mat4x3.hpp\"\n#include \"../mat4x4.hpp\"\n#include <cstring>\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_type_ptr extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_type_ptr\n\t/// @{\n\n\t/// Return the constant address to the data of the input parameter.\n\t/// @see gtc_type_ptr\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL typename genType::value_type const * value_ptr(genType const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<1, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<2, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<3, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<1, T, Q> make_vec1(vec<4, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<1, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<2, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<3, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> make_vec2(vec<4, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<1, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<2, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<3, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> make_vec3(vec<4, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<1, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<2, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<3, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> make_vec4(vec<4, T, Q> const& v);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL vec<2, T, defaultp> make_vec2(T const * const ptr);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL vec<3, T, defaultp> make_vec3(T const * const ptr);\n\n\t/// Build a vector from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL vec<4, T, defaultp> make_vec4(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<2, 2, T, defaultp> make_mat2x2(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<2, 3, T, defaultp> make_mat2x3(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<2, 4, T, defaultp> make_mat2x4(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<3, 2, T, defaultp> make_mat3x2(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<3, 3, T, defaultp> make_mat3x3(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<3, 4, T, defaultp> make_mat3x4(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 2, T, defaultp> make_mat4x2(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 3, T, defaultp> make_mat4x3(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> make_mat4x4(T const * const ptr);\n\t\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<2, 2, T, defaultp> make_mat2(T const * const ptr);\n\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<3, 3, T, defaultp> make_mat3(T const * const ptr);\n\t\t\n\t/// Build a matrix from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> make_mat4(T const * const ptr);\n\n\t/// Build a quaternion from a pointer.\n\t/// @see gtc_type_ptr\n\ttemplate<typename T>\n\tGLM_FUNC_DECL tquat<T, defaultp> make_quat(T const * const ptr);\n\n\t/// @}\n}//namespace glm\n\n#include \"type_ptr.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/type_ptr.inl",
    "content": "/// @ref gtc_type_ptr\n/// @file glm/gtc/type_ptr.inl\n\n#include <cstring>\n\nnamespace glm\n{\n\t/// @addtogroup gtc_type_ptr\n\t/// @{\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(vec<2, T, Q> const& v)\n\t{\n\t\treturn &(v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(vec<2, T, Q>& v)\n\t{\n\t\treturn &(v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const * value_ptr(vec<3, T, Q> const& v)\n\t{\n\t\treturn &(v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(vec<3, T, Q>& v)\n\t{\n\t\treturn &(v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(vec<4, T, Q> const& v)\n\t{\n\t\treturn &(v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(vec<4, T, Q>& v)\n\t{\n\t\treturn &(v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 2, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(mat<2, 2, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 3, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(mat<3, 3, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 4, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(mat<4, 4, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 3, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(mat<2, 3, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 2, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(mat<3, 2, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<2, 4, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(mat<2, 4, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 2, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(mat<4, 2, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<3, 4, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(mat<3, 4, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const* value_ptr(mat<4, 3, T, Q> const& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T * value_ptr(mat<4, 3, T, Q>& m)\n\t{\n\t\treturn &(m[0].x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T const * value_ptr(tquat<T, Q> const& q)\n\t{\n\t\treturn &(q[0]);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T* value_ptr(tquat<T, Q>& q)\n\t{\n\t\treturn &(q[0]);\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<1, T, Q> make_vec1(vec<1, T, Q> const& v)\n\t{\n\t\treturn v;\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<1, T, Q> make_vec1(vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(v);\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<1, T, Q> make_vec1(vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(v);\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<1, T, Q> make_vec1(vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<1, T, Q>(v);\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<2, T, Q> make_vec2(vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(v.x, static_cast<T>(0));\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<2, T, Q> make_vec2(vec<2, T, Q> const& v)\n\t{\n\t\treturn v;\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<2, T, Q> make_vec2(vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(v);\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<2, T, Q> make_vec2(vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<2, T, Q>(v);\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<3, T, Q> make_vec3(vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(v.x, static_cast<T>(0), static_cast<T>(0));\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<3, T, Q> make_vec3(vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(v.x, v.y, static_cast<T>(0));\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<3, T, Q> make_vec3(vec<3, T, Q> const& v)\n\t{\n\t\treturn v;\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<3, T, Q> make_vec3(vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<3, T, Q>(v);\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<4, T, Q> make_vec4(vec<1, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(v.x, static_cast<T>(0), static_cast<T>(0), static_cast<T>(1));\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<4, T, Q> make_vec4(vec<2, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(v.x, v.y, static_cast<T>(0), static_cast<T>(1));\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<4, T, Q> make_vec4(vec<3, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(v.x, v.y, v.z, static_cast<T>(1));\n\t}\n\n\ttemplate <typename T, qualifier Q>\n\tinline vec<4, T, Q> make_vec4(vec<4, T, Q> const& v)\n\t{\n\t\treturn v;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER vec<2, T, defaultp> make_vec2(T const *const ptr)\n\t{\n\t\tvec<2, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(vec<2, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER vec<3, T, defaultp> make_vec3(T const *const ptr)\n\t{\n\t\tvec<3, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(vec<3, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER vec<4, T, defaultp> make_vec4(T const *const ptr)\n\t{\n\t\tvec<4, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(vec<4, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> make_mat2x2(T const *const ptr)\n\t{\n\t\tmat<2, 2, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<2, 2, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, defaultp> make_mat2x3(T const *const ptr)\n\t{\n\t\tmat<2, 3, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<2, 3, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, defaultp> make_mat2x4(T const *const ptr)\n\t{\n\t\tmat<2, 4, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<2, 4, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, defaultp> make_mat3x2(T const *const ptr)\n\t{\n\t\tmat<3, 2, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<3, 2, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> make_mat3x3(T const *const ptr)\n\t{\n\t\tmat<3, 3, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<3, 3, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, defaultp> make_mat3x4(T const *const ptr)\n\t{\n\t\tmat<3, 4, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<3, 4, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, defaultp> make_mat4x2(T const *const ptr)\n\t{\n\t\tmat<4, 2, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<4, 2, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, defaultp> make_mat4x3(T const *const ptr)\n\t{\n\t\tmat<4, 3, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<4, 3, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> make_mat4x4(T const *const ptr)\n\t{\n\t\tmat<4, 4, T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(mat<4, 4, T, defaultp>));\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> make_mat2(T const *const ptr)\n\t{\n\t\treturn make_mat2x2(ptr);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> make_mat3(T const *const ptr)\n\t{\n\t\treturn make_mat3x3(ptr);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> make_mat4(T const *const ptr)\n\t{\n\t\treturn make_mat4x4(ptr);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER tquat<T, defaultp> make_quat(T const *const ptr)\n\t{\n\t\ttquat<T, defaultp> Result;\n\t\tmemcpy(value_ptr(Result), ptr, sizeof(tquat<T, defaultp>));\n\t\treturn Result;\n\t}\n\n\t/// @}\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/gtc/ulp.hpp",
    "content": "/// @ref gtc_ulp\n/// @file glm/gtc/ulp.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_ulp GLM_GTC_ulp\n/// @ingroup gtc\n///\n/// Include <glm/gtc/ulp.hpp> to use the features of this extension.\n///\n/// Allow the measurement of the accuracy of a function against a reference \n/// implementation. This extension works on floating-point data and provide results \n/// in ULP.\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n#include \"../detail/type_int.hpp\"\n#include \"../detail/compute_vector_relational.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_ulp extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtc_ulp\n\t/// @{\n\n\t/// Return the next ULP value(s) after the input value(s).\n\t/// @see gtc_ulp\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType next_float(genType const& x);\n\n\t/// Return the previous ULP value(s) before the input value(s).\n\t/// @see gtc_ulp\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType prev_float(genType const& x);\n\n\t/// Return the value(s) ULP distance after the input value(s).\n\t/// @see gtc_ulp\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType next_float(genType const& x, uint const& Distance);\n\n\t/// Return the value(s) ULP distance before the input value(s).\n\t/// @see gtc_ulp\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType prev_float(genType const& x, uint const& Distance);\n\t\n\t/// Return the distance in the number of ULP between 2 scalars.\n\t/// @see gtc_ulp\n\ttemplate<typename T>\n\tGLM_FUNC_DECL uint float_distance(T const& x, T const& y);\n\n\t/// Return the distance in the number of ULP between 2 vectors.\n\t/// @see gtc_ulp\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, uint, Q> float_distance(vec<2, T, Q> const& x, vec<2, T, Q> const& y);\n\t\n\t/// @}\n}// namespace glm\n\n#include \"ulp.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/ulp.inl",
    "content": "/// @ref gtc_ulp\n/// @file glm/gtc/ulp.inl\n///\n/// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n///\n/// Developed at SunPro, a Sun Microsystems, Inc. business.\n/// Permission to use, copy, modify, and distribute this\n/// software is freely granted, provided that this notice\n/// is preserved.\n\n#include \"../detail/type_int.hpp\"\n#include \"epsilon.hpp\"\n#include <cmath>\n#include <cfloat>\n#include <limits>\n\n#if(GLM_COMPILER & GLM_COMPILER_VC)\n#\tpragma warning(push)\n#\tpragma warning(disable : 4127)\n#endif\n\ntypedef union\n{\n\tfloat value;\n\t/* FIXME: Assumes 32 bit int.  */\n\tunsigned int word;\n} ieee_float_shape_type;\n\ntypedef union\n{\n\tdouble value;\n\tstruct\n\t{\n\t\tglm::detail::int32 lsw;\n\t\tglm::detail::int32 msw;\n\t} parts;\n} ieee_double_shape_type;\n\n#define GLM_EXTRACT_WORDS(ix0,ix1,d)\t\t\\\n\tdo {\t\t\t\t\t\t\t\t\t\\\n\t\tieee_double_shape_type ew_u;\t\t\\\n\t\tew_u.value = (d);\t\t\t\t\t\\\n\t\t(ix0) = ew_u.parts.msw;\t\t\t\t\\\n\t\t(ix1) = ew_u.parts.lsw;\t\t\t\t\\\n\t} while (0)\n\n#define GLM_GET_FLOAT_WORD(i,d)\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\t\t\\\n\t\tieee_float_shape_type gf_u;\t\t\t\\\n\t\tgf_u.value = (d);\t\t\t\t\t\\\n\t\t(i) = gf_u.word;\t\t\t\t\t\\\n\t} while (0)\n\n#define GLM_SET_FLOAT_WORD(d,i)\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\t\t\\\n\t\tieee_float_shape_type sf_u;\t\t\t\\\n\t\tsf_u.word = (i);\t\t\t\t\t\\\n\t\t(d) = sf_u.value;\t\t\t\t\t\\\n\t} while (0)\n\n#define GLM_INSERT_WORDS(d,ix0,ix1)\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\t\t\\\n\t\tieee_double_shape_type iw_u;\t\t\\\n\t\tiw_u.parts.msw = (ix0);\t\t\t\t\\\n\t\tiw_u.parts.lsw = (ix1);\t\t\t\t\\\n\t\t(d) = iw_u.value;\t\t\t\t\t\\\n\t} while (0)\n\nnamespace glm{\nnamespace detail\n{\n\tGLM_FUNC_QUALIFIER float nextafterf(float x, float y)\n\t{\n\t\tvolatile float t;\n\t\tglm::detail::int32 hx, hy, ix, iy;\n\n\t\tGLM_GET_FLOAT_WORD(hx, x);\n\t\tGLM_GET_FLOAT_WORD(hy, y);\n\t\tix = hx&0x7fffffff;\t\t// |x|\n\t\tiy = hy&0x7fffffff;\t\t// |y|\n\n\t\tif((ix>0x7f800000) ||\t// x is nan \n\t\t\t(iy>0x7f800000))\t// y is nan \n\t\t\treturn x+y;\n\t\tif(compute_equal<float>::call(x, y))\n\t\t\treturn y;\t\t// x=y, return y\n\t\tif(ix==0)\n\t\t{\t\t\t\t// x == 0\n\t\t\tGLM_SET_FLOAT_WORD(x,(hy&0x80000000)|1);// return +-minsubnormal\n\t\t\tt = x*x;\n\t\t\tif(detail::compute_equal<float>::call(t, x))\n\t\t\t\treturn t;\n\t\t\telse\n\t\t\t\treturn x;\t// raise underflow flag\n\t\t}\n\t\tif(hx>=0)\n\t\t{\t\t\t\t\t\t// x > 0 \n\t\t\tif(hx>hy)\t\t\t// x > y, x -= ulp\n\t\t\t\thx -= 1;\n\t\t\telse\t\t\t\t// x < y, x += ulp\n\t\t\t\thx += 1;\n\t\t}\n\t\telse\n\t\t{\t\t\t\t\t\t// x < 0\n\t\t\tif(hy>=0||hx>hy)\t// x < y, x -= ulp\n\t\t\t\thx -= 1;\n\t\t\telse\t\t\t\t// x > y, x += ulp\n\t\t\t\thx += 1;\n\t\t}\n\t\thy = hx&0x7f800000;\n\t\tif(hy>=0x7f800000)\n\t\t\treturn x+x;  \t\t// overflow\n\t\tif(hy<0x00800000)\t\t// underflow\n\t\t{\n\t\t\tt = x*x;\n\t\t\tif(!detail::compute_equal<float>::call(t, x))\n\t\t\t{\t\t\t\t\t// raise underflow flag\n\t\t\t\tGLM_SET_FLOAT_WORD(y,hx);\n\t\t\t\treturn y;\n\t\t\t}\n\t\t}\n\t\tGLM_SET_FLOAT_WORD(x,hx);\n\t\treturn x;\n\t}\n\n\tGLM_FUNC_QUALIFIER double nextafter(double x, double y)\n\t{\n\t\tvolatile double t;\n\t\tglm::detail::int32 hx, hy, ix, iy;\n\t\tglm::detail::uint32 lx, ly;\n\n\t\tGLM_EXTRACT_WORDS(hx, lx, x);\n\t\tGLM_EXTRACT_WORDS(hy, ly, y);\n\t\tix = hx & 0x7fffffff;\t\t\t\t\t\t\t\t// |x| \n\t\tiy = hy & 0x7fffffff;\t\t\t\t\t\t\t\t// |y| \n\n\t\tif(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||\t// x is nan\n\t\t\t((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0))\t// y is nan\n\t\t\treturn x+y;\n\t\tif(detail::compute_equal<double>::call(x, y))\n\t\t\treturn y;\t\t\t\t\t\t\t\t\t// x=y, return y\n\t\tif((ix|lx)==0)\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t// x == 0 \n\t\t\tGLM_INSERT_WORDS(x, hy & 0x80000000, 1);\t\t// return +-minsubnormal\n\t\t\tt = x*x;\n\t\t\tif(detail::compute_equal<double>::call(t, x))\n\t\t\t\treturn t;\n\t\t\telse\n\t\t\t\treturn x;   // raise underflow flag \n\t\t}\n\t\tif(hx>=0) {                             // x > 0 \n\t\t\tif(hx>hy||((hx==hy)&&(lx>ly))) {    // x > y, x -= ulp \n\t\t\t\tif(lx==0) hx -= 1;\n\t\t\t\tlx -= 1;\n\t\t\t} else {                            // x < y, x += ulp\n\t\t\t\tlx += 1;\n\t\t\t\tif(lx==0) hx += 1;\n\t\t\t}\n\t\t} else {                                // x < 0 \n\t\t\tif(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){// x < y, x -= ulp\n\t\t\t\tif(lx==0) hx -= 1;\n\t\t\t\tlx -= 1;\n\t\t\t} else {                            // x > y, x += ulp\n\t\t\t\tlx += 1;\n\t\t\t\tif(lx==0) hx += 1;\n\t\t\t}\n\t\t}\n\t\thy = hx&0x7ff00000;\n\t\tif(hy>=0x7ff00000)\n\t\t\treturn x+x;\t\t\t// overflow\n\t\tif(hy<0x00100000)\n\t\t{\t\t\t\t\t\t// underflow\n\t\t\tt = x*x;\n\t\t\tif(!detail::compute_equal<double>::call(t, x))\n\t\t\t{\t\t\t\t\t// raise underflow flag\n\t\t\t\tGLM_INSERT_WORDS(y,hx,lx);\n\t\t\t\treturn y;\n\t\t\t}\n\t\t}\n\t\tGLM_INSERT_WORDS(x,hx,lx);\n\t\treturn x;\n\t}\n}//namespace detail\n}//namespace glm\n\n#if(GLM_COMPILER & GLM_COMPILER_VC)\n#\tpragma warning(pop)\n#endif\n\nnamespace glm\n{\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER float next_float(float const& x)\n\t{\n#\t\tif GLM_HAS_CXX11_STL\n\t\t\treturn std::nextafter(x, std::numeric_limits<float>::max());\n#\t\telif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))\n\t\t\treturn detail::nextafterf(x, FLT_MAX);\n#\t\telif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n\t\t\treturn __builtin_nextafterf(x, FLT_MAX);\n#\t\telse\n\t\t\treturn nextafterf(x, FLT_MAX);\n#\t\tendif\n\t}\n\n\ttemplate<>\n\tGLM_FUNC_QUALIFIER double next_float(double const& x)\n\t{\n#\t\tif GLM_HAS_CXX11_STL\n\t\t\treturn std::nextafter(x, std::numeric_limits<double>::max());\n#\t\telif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))\n\t\t\treturn detail::nextafter(x, std::numeric_limits<double>::max());\n#\t\telif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n\t\t\treturn __builtin_nextafter(x, FLT_MAX);\n#\t\telse\n\t\t\treturn nextafter(x, DBL_MAX);\n#\t\tendif\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> next_float(vec<L, T, Q> const& x)\n\t{\n\t\tvec<L, T, Q> Result;\n\t\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\t\tResult[i] = next_float(x[i]);\n\t\treturn Result;\n\t}\n\n\tGLM_FUNC_QUALIFIER float prev_float(float const& x)\n\t{\n#\t\tif GLM_HAS_CXX11_STL\n\t\t\treturn std::nextafter(x, std::numeric_limits<float>::min());\n#\t\telif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))\n\t\t\treturn detail::nextafterf(x, FLT_MIN);\n#\t\telif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n\t\t\treturn __builtin_nextafterf(x, FLT_MIN);\n#\t\telse\n\t\t\treturn nextafterf(x, FLT_MIN);\n#\t\tendif\n\t}\n\n\tGLM_FUNC_QUALIFIER double prev_float(double const& x)\n\t{\n#\t\tif GLM_HAS_CXX11_STL\n\t\t\treturn std::nextafter(x, std::numeric_limits<double>::min());\n#\t\telif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))\n\t\t\treturn _nextafter(x, DBL_MIN);\n#\t\telif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n\t\t\treturn __builtin_nextafter(x, DBL_MIN);\n#\t\telse\n\t\t\treturn nextafter(x, DBL_MIN);\n#\t\tendif\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> prev_float(vec<L, T, Q> const& x)\n\t{\n\t\tvec<L, T, Q> Result;\n\t\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\t\tResult[i] = prev_float(x[i]);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T next_float(T const& x, uint const& ulps)\n\t{\n\t\tT temp = x;\n\t\tfor(uint i = 0; i < ulps; ++i)\n\t\t\ttemp = next_float(temp);\n\t\treturn temp;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> next_float(vec<L, T, Q> const& x, vec<L, uint, Q> const& ulps)\n\t{\n\t\tvec<L, T, Q> Result;\n\t\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\t\tResult[i] = next_float(x[i], ulps[i]);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T prev_float(T const& x, uint const& ulps)\n\t{\n\t\tT temp = x;\n\t\tfor(uint i = 0; i < ulps; ++i)\n\t\t\ttemp = prev_float(temp);\n\t\treturn temp;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> prev_float(vec<L, T, Q> const& x, vec<L, uint, Q> const& ulps)\n\t{\n\t\tvec<L, T, Q> Result;\n\t\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\t\tResult[i] = prev_float(x[i], ulps[i]);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER uint float_distance(T const& x, T const& y)\n\t{\n\t\tuint ulp = 0;\n\n\t\tif(x < y)\n\t\t{\n\t\t\tT temp = x;\n\t\t\twhile(glm::epsilonNotEqual(temp, y, glm::epsilon<T>()))// && ulp < std::numeric_limits<std::size_t>::max())\n\t\t\t{\n\t\t\t\t++ulp;\n\t\t\t\ttemp = next_float(temp);\n\t\t\t}\n\t\t}\n\t\telse if(y < x)\n\t\t{\n\t\t\tT temp = y;\n\t\t\twhile(glm::epsilonNotEqual(temp, x, glm::epsilon<T>()))// && ulp < std::numeric_limits<std::size_t>::max())\n\t\t\t{\n\t\t\t\t++ulp;\n\t\t\t\ttemp = next_float(temp);\n\t\t\t}\n\t\t}\n\t\telse // ==\n\t\t{\n\n\t\t}\n\n\t\treturn ulp;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, uint, Q> float_distance(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tvec<L, uint, Q> Result;\n\t\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\t\tResult[i] = float_distance(x[i], y[i]);\n\t\treturn Result;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtc/vec1.hpp",
    "content": "/// @ref gtc_vec1\n/// @file glm/gtc/vec1.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_vec1 GLM_GTC_vec1\n/// @ingroup gtc\n///\n/// Include <glm/gtc/vec1.hpp> to use the features of this extension.\n/// \n/// Add vec1, ivec1, uvec1 and bvec1 types.\n\n#pragma once\n\n// Dependency:\n#include \"../ext/vec1.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_vec1 extension included\")\n#endif\n\nnamespace glm\n{\n\t//////////////////////////\n\t// vec1 definition\n\n#if(defined(GLM_PRECISION_HIGHP_BOOL))\n\ttypedef highp_bvec1\t\t\t\tbvec1;\n#elif(defined(GLM_PRECISION_MEDIUMP_BOOL))\n\ttypedef mediump_bvec1\t\t\tbvec1;\n#elif(defined(GLM_PRECISION_LOWP_BOOL))\n\ttypedef lowp_bvec1\t\t\t\tbvec1;\n#else\n\t/// 1 component vector of boolean.\n\t/// @see gtc_vec1 extension.\n\ttypedef highp_bvec1\t\t\t\tbvec1;\n#endif//GLM_PRECISION\n\n#if(defined(GLM_PRECISION_HIGHP_FLOAT))\n\ttypedef highp_vec1\t\t\t\tvec1;\n#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))\n\ttypedef mediump_vec1\t\t\tvec1;\n#elif(defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef lowp_vec1\t\t\t\tvec1;\n#else\n\t/// 1 component vector of floating-point numbers.\n\t/// @see gtc_vec1 extension.\n\ttypedef highp_vec1\t\t\t\tvec1;\n#endif//GLM_PRECISION\n\n#if(defined(GLM_PRECISION_HIGHP_DOUBLE))\n\ttypedef highp_dvec1\t\t\t\tdvec1;\n#elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))\n\ttypedef mediump_dvec1\t\t\tdvec1;\n#elif(defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef lowp_dvec1\t\t\t\tdvec1;\n#else\n\t/// 1 component vector of floating-point numbers.\n\t/// @see gtc_vec1 extension.\n\ttypedef highp_dvec1\t\t\t\tdvec1;\n#endif//GLM_PRECISION\n\n#if(defined(GLM_PRECISION_HIGHP_INT))\n\ttypedef highp_ivec1\t\t\tivec1;\n#elif(defined(GLM_PRECISION_MEDIUMP_INT))\n\ttypedef mediump_ivec1\t\tivec1;\n#elif(defined(GLM_PRECISION_LOWP_INT))\n\ttypedef lowp_ivec1\t\t\tivec1;\n#else\n\t/// 1 component vector of signed integer numbers. \n\t/// @see gtc_vec1 extension.\n\ttypedef highp_ivec1\t\t\tivec1;\n#endif//GLM_PRECISION\n\n#if(defined(GLM_PRECISION_HIGHP_UINT))\n\ttypedef highp_uvec1\t\t\tuvec1;\n#elif(defined(GLM_PRECISION_MEDIUMP_UINT))\n\ttypedef mediump_uvec1\t\tuvec1;\n#elif(defined(GLM_PRECISION_LOWP_UINT))\n\ttypedef lowp_uvec1\t\t\tuvec1;\n#else\n\t/// 1 component vector of unsigned integer numbers. \n\t/// @see gtc_vec1 extension.\n\ttypedef highp_uvec1\t\t\tuvec1;\n#endif//GLM_PRECISION\n\n}// namespace glm\n\n#include \"vec1.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtc/vec1.inl",
    "content": "/// @ref gtc_vec1\n/// @file glm/gtc/vec1.inl\n"
  },
  {
    "path": "external/glm/glm/gtx/associated_min_max.hpp",
    "content": "/// @ref gtx_associated_min_max\n/// @file glm/gtx/associated_min_max.hpp\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_associated_min_max GLM_GTX_associated_min_max\n/// @ingroup gtx\n///\n/// Include <glm/gtx/associated_min_max.hpp> to use the features of this extension.\n/// \n/// @brief Min and max functions that return associated values not the compared onces.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GTX_associated_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_associated_min_max extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_associated_min_max\n\t/// @{\n\n\t/// Minimum comparison between 2 variables and returns 2 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL U associatedMin(T x, U a, T y, U b);\n\n\t/// Minimum comparison between 2 variables and returns 2 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<2, U, Q> associatedMin(\n\t\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\t\tvec<L, T, Q> const& y, vec<L, U, Q> const& b);\n\n\t/// Minimum comparison between 2 variables and returns 2 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMin(\n\t\tT x, const vec<L, U, Q>& a,\n\t\tT y, const vec<L, U, Q>& b);\n\n\t/// Minimum comparison between 2 variables and returns 2 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMin(\n\t\tvec<L, T, Q> const& x, U a,\n\t\tvec<L, T, Q> const& y, U b);\n\n\t/// Minimum comparison between 3 variables and returns 3 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<typename T, typename U>\n\tGLM_FUNC_DECL U associatedMin(\n\t\tT x, U a,\n\t\tT y, U b,\n\t\tT z, U c);\n\n\t/// Minimum comparison between 3 variables and returns 3 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMin(\n\t\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\t\tvec<L, T, Q> const& y, vec<L, U, Q> const& b,\n\t\tvec<L, T, Q> const& z, vec<L, U, Q> const& c);\n\n\t/// Minimum comparison between 4 variables and returns 4 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<typename T, typename U>\n\tGLM_FUNC_DECL U associatedMin(\n\t\tT x, U a,\n\t\tT y, U b,\n\t\tT z, U c,\n\t\tT w, U d);\n\n\t/// Minimum comparison between 4 variables and returns 4 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMin(\n\t\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\t\tvec<L, T, Q> const& y, vec<L, U, Q> const& b,\n\t\tvec<L, T, Q> const& z, vec<L, U, Q> const& c,\n\t\tvec<L, T, Q> const& w, vec<L, U, Q> const& d);\n\n\t/// Minimum comparison between 4 variables and returns 4 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMin(\n\t\tT x, vec<L, U, Q> const& a,\n\t\tT y, vec<L, U, Q> const& b,\n\t\tT z, vec<L, U, Q> const& c,\n\t\tT w, vec<L, U, Q> const& d);\n\n\t/// Minimum comparison between 4 variables and returns 4 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMin(\n\t\tvec<L, T, Q> const& x, U a,\n\t\tvec<L, T, Q> const& y, U b,\n\t\tvec<L, T, Q> const& z, U c,\n\t\tvec<L, T, Q> const& w, U d);\n\n\t/// Maximum comparison between 2 variables and returns 2 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<typename T, typename U>\n\tGLM_FUNC_DECL U associatedMax(T x, U a, T y, U b);\n\n\t/// Maximum comparison between 2 variables and returns 2 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<2, U, Q> associatedMax(\n\t\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\t\tvec<L, T, Q> const& y, vec<L, U, Q> const& b);\n\n\t/// Maximum comparison between 2 variables and returns 2 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> associatedMax(\n\t\tT x, vec<L, U, Q> const& a,\n\t\tT y, vec<L, U, Q> const& b);\n\n\t/// Maximum comparison between 2 variables and returns 2 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMax(\n\t\tvec<L, T, Q> const& x, U a,\n\t\tvec<L, T, Q> const& y, U b);\n\n\t/// Maximum comparison between 3 variables and returns 3 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<typename T, typename U>\n\tGLM_FUNC_DECL U associatedMax(\n\t\tT x, U a,\n\t\tT y, U b,\n\t\tT z, U c);\n\n\t/// Maximum comparison between 3 variables and returns 3 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMax(\n\t\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\t\tvec<L, T, Q> const& y, vec<L, U, Q> const& b,\n\t\tvec<L, T, Q> const& z, vec<L, U, Q> const& c);\n\n\t/// Maximum comparison between 3 variables and returns 3 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> associatedMax(\n\t\tT x, vec<L, U, Q> const& a,\n\t\tT y, vec<L, U, Q> const& b,\n\t\tT z, vec<L, U, Q> const& c);\n\n\t/// Maximum comparison between 3 variables and returns 3 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMax(\n\t\tvec<L, T, Q> const& x, U a,\n\t\tvec<L, T, Q> const& y, U b,\n\t\tvec<L, T, Q> const& z, U c);\n\n\t/// Maximum comparison between 4 variables and returns 4 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<typename T, typename U>\n\tGLM_FUNC_DECL U associatedMax(\n\t\tT x, U a,\n\t\tT y, U b,\n\t\tT z, U c,\n\t\tT w, U d);\n\n\t/// Maximum comparison between 4 variables and returns 4 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMax(\n\t\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\t\tvec<L, T, Q> const& y, vec<L, U, Q> const& b,\n\t\tvec<L, T, Q> const& z, vec<L, U, Q> const& c,\n\t\tvec<L, T, Q> const& w, vec<L, U, Q> const& d);\n\n\t/// Maximum comparison between 4 variables and returns 4 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMax(\n\t\tT x, vec<L, U, Q> const& a,\n\t\tT y, vec<L, U, Q> const& b,\n\t\tT z, vec<L, U, Q> const& c,\n\t\tT w, vec<L, U, Q> const& d);\n\n\t/// Maximum comparison between 4 variables and returns 4 associated variable values\n\t/// @see gtx_associated_min_max\n\ttemplate<length_t L, typename T, typename U, qualifier Q>\n\tGLM_FUNC_DECL vec<L, U, Q> associatedMax(\n\t\tvec<L, T, Q> const& x, U a,\n\t\tvec<L, T, Q> const& y, U b,\n\t\tvec<L, T, Q> const& z, U c,\n\t\tvec<L, T, Q> const& w, U d);\n\n\t/// @}\n} //namespace glm\n\n#include \"associated_min_max.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/associated_min_max.inl",
    "content": "/// @ref gtx_associated_min_max\n/// @file glm/gtx/associated_min_max.inl\n\nnamespace glm{\n\n// Min comparison between 2 variables\ntemplate<typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b)\n{\n\treturn x < y ? a : b;\n}\n\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<2, U, Q> associatedMin\n(\n\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\tvec<L, T, Q> const& y, vec<L, U, Q> const& b\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x[i] < y[i] ? a[i] : b[i];\n\treturn Result;\n}\n\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin\n(\n\tT x, const vec<L, U, Q>& a,\n\tT y, const vec<L, U, Q>& b\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x < y ? a[i] : b[i];\n\treturn Result;\n}\n\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin\n(\n\tvec<L, T, Q> const& x, U a,\n\tvec<L, T, Q> const& y, U b\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x[i] < y[i] ? a : b;\n\treturn Result;\n}\n\n// Min comparison between 3 variables\ntemplate<typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMin\n(\n\tT x, U a,\n\tT y, U b,\n\tT z, U c\n)\n{\n\tU Result = x < y ? (x < z ? a : c) : (y < z ? b : c);\n\treturn Result;\n}\n\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin\n(\n\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\tvec<L, T, Q> const& y, vec<L, U, Q> const& b,\n\tvec<L, T, Q> const& z, vec<L, U, Q> const& c\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);\n\treturn Result;\n}\n\n// Min comparison between 4 variables\ntemplate<typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMin\n(\n\tT x, U a,\n\tT y, U b,\n\tT z, U c,\n\tT w, U d\n)\n{\n\tT Test1 = min(x, y);\n\tT Test2 = min(z, w);;\n\tU Result1 = x < y ? a : b;\n\tU Result2 = z < w ? c : d;\n\tU Result = Test1 < Test2 ? Result1 : Result2;\n\treturn Result;\n}\n\n// Min comparison between 4 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin\n(\n\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\tvec<L, T, Q> const& y, vec<L, U, Q> const& b,\n\tvec<L, T, Q> const& z, vec<L, U, Q> const& c,\n\tvec<L, T, Q> const& w, vec<L, U, Q> const& d\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t{\n\t\tT Test1 = min(x[i], y[i]);\n\t\tT Test2 = min(z[i], w[i]);\n\t\tU Result1 = x[i] < y[i] ? a[i] : b[i];\n\t\tU Result2 = z[i] < w[i] ? c[i] : d[i];\n\t\tResult[i] = Test1 < Test2 ? Result1 : Result2;\n\t}\n\treturn Result;\n}\n\n// Min comparison between 4 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin\n(\n\tT x, vec<L, U, Q> const& a,\n\tT y, vec<L, U, Q> const& b,\n\tT z, vec<L, U, Q> const& c,\n\tT w, vec<L, U, Q> const& d\n)\n{\n\tT Test1 = min(x, y);\n\tT Test2 = min(z, w);\n\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t{\n\t\tU Result1 = x < y ? a[i] : b[i];\n\t\tU Result2 = z < w ? c[i] : d[i];\n\t\tResult[i] = Test1 < Test2 ? Result1 : Result2;\n\t}\n\treturn Result;\n}\n\n// Min comparison between 4 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin\n(\n\tvec<L, T, Q> const& x, U a,\n\tvec<L, T, Q> const& y, U b,\n\tvec<L, T, Q> const& z, U c,\n\tvec<L, T, Q> const& w, U d\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t{\n\t\tT Test1 = min(x[i], y[i]);\n\t\tT Test2 = min(z[i], w[i]);;\n\t\tU Result1 = x[i] < y[i] ? a : b;\n\t\tU Result2 = z[i] < w[i] ? c : d;\n\t\tResult[i] = Test1 < Test2 ? Result1 : Result2;\n\t}\n\treturn Result;\n}\n\n// Max comparison between 2 variables\ntemplate<typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b)\n{\n\treturn x > y ? a : b;\n}\n\n// Max comparison between 2 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<2, U, Q> associatedMax\n(\n\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\tvec<L, T, Q> const& y, vec<L, U, Q> const& b\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x[i] > y[i] ? a[i] : b[i];\n\treturn Result;\n}\n\n// Max comparison between 2 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, T, Q> associatedMax\n(\n\tT x, vec<L, U, Q> const& a,\n\tT y, vec<L, U, Q> const& b\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x > y ? a[i] : b[i];\n\treturn Result;\n}\n\n// Max comparison between 2 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax\n(\n\tvec<L, T, Q> const& x, U a,\n\tvec<L, T, Q> const& y, U b\n)\n{\n\tvec<L, T, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x[i] > y[i] ? a : b;\n\treturn Result;\n}\n\n// Max comparison between 3 variables\ntemplate<typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMax\n(\n\tT x, U a,\n\tT y, U b,\n\tT z, U c\n)\n{\n\tU Result = x > y ? (x > z ? a : c) : (y > z ? b : c);\n\treturn Result;\n}\n\n// Max comparison between 3 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax\n(\n\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\tvec<L, T, Q> const& y, vec<L, U, Q> const& b,\n\tvec<L, T, Q> const& z, vec<L, U, Q> const& c\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);\n\treturn Result;\n}\n\n// Max comparison between 3 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, T, Q> associatedMax\n(\n\tT x, vec<L, U, Q> const& a,\n\tT y, vec<L, U, Q> const& b,\n\tT z, vec<L, U, Q> const& c\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);\n\treturn Result;\n}\n\n// Max comparison between 3 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax\n(\n\tvec<L, T, Q> const& x, U a,\n\tvec<L, T, Q> const& y, U b,\n\tvec<L, T, Q> const& z, U c\n)\n{\n\tvec<L, T, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t\tResult[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);\n\treturn Result;\n}\n\n// Max comparison between 4 variables\ntemplate<typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMax\n(\n\tT x, U a,\n\tT y, U b,\n\tT z, U c,\n\tT w, U d\n)\n{\n\tT Test1 = max(x, y);\n\tT Test2 = max(z, w);;\n\tU Result1 = x > y ? a : b;\n\tU Result2 = z > w ? c : d;\n\tU Result = Test1 > Test2 ? Result1 : Result2;\n\treturn Result;\n}\n\n// Max comparison between 4 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax\n(\n\tvec<L, T, Q> const& x, vec<L, U, Q> const& a,\n\tvec<L, T, Q> const& y, vec<L, U, Q> const& b,\n\tvec<L, T, Q> const& z, vec<L, U, Q> const& c,\n\tvec<L, T, Q> const& w, vec<L, U, Q> const& d\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t{\n\t\tT Test1 = max(x[i], y[i]);\n\t\tT Test2 = max(z[i], w[i]);\n\t\tU Result1 = x[i] > y[i] ? a[i] : b[i];\n\t\tU Result2 = z[i] > w[i] ? c[i] : d[i];\n\t\tResult[i] = Test1 > Test2 ? Result1 : Result2;\n\t}\n\treturn Result;\n}\n\n// Max comparison between 4 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax\n(\n\tT x, vec<L, U, Q> const& a,\n\tT y, vec<L, U, Q> const& b,\n\tT z, vec<L, U, Q> const& c,\n\tT w, vec<L, U, Q> const& d\n)\n{\n\tT Test1 = max(x, y);\n\tT Test2 = max(z, w);\n\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t{\n\t\tU Result1 = x > y ? a[i] : b[i];\n\t\tU Result2 = z > w ? c[i] : d[i];\n\t\tResult[i] = Test1 > Test2 ? Result1 : Result2;\n\t}\n\treturn Result;\n}\n\n// Max comparison between 4 variables\ntemplate<length_t L, typename T, typename U, qualifier Q>\nGLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax\n(\n\tvec<L, T, Q> const& x, U a,\n\tvec<L, T, Q> const& y, U b,\n\tvec<L, T, Q> const& z, U c,\n\tvec<L, T, Q> const& w, U d\n)\n{\n\tvec<L, U, Q> Result;\n\tfor(length_t i = 0, n = Result.length(); i < n; ++i)\n\t{\n\t\tT Test1 = max(x[i], y[i]);\n\t\tT Test2 = max(z[i], w[i]);;\n\t\tU Result1 = x[i] > y[i] ? a : b;\n\t\tU Result2 = z[i] > w[i] ? c : d;\n\t\tResult[i] = Test1 > Test2 ? Result1 : Result2;\n\t}\n\treturn Result;\n}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/bit.hpp",
    "content": "/// @ref gtx_bit\n/// @file glm/gtx/bit.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_bit GLM_GTX_bit\n/// @ingroup gtx\n///\n/// Include <glm/gtx/bit.hpp> to use the features of this extension.\n/// \n/// Allow to perform bit operations on integer values\n\n#pragma once\n\n// Dependencies\n#include \"../gtc/bitfield.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_bit is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_bit extension is deprecated, include GLM_GTC_bitfield and GLM_GTC_integer instead\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_bit\n\t/// @{\n\n\t/// @see gtx_bit\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType highestBitValue(genIUType Value);\n\n\t/// @see gtx_bit\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL genIUType lowestBitValue(genIUType Value);\n\n\t/// Find the highest bit set to 1 in a integer variable and return its value.\n\t///\n\t/// @see gtx_bit\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> highestBitValue(vec<L, T, Q> const& value);\n\n\t/// Return the power of two number which value is just higher the input value.\n\t/// Deprecated, use ceilPowerOfTwo from GTC_round instead\n\t///\n\t/// @see gtc_round\n\t/// @see gtx_bit\n\ttemplate<typename genIUType>\n\tGLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoAbove(genIUType Value);\n\n\t/// Return the power of two number which value is just higher the input value.\n\t/// Deprecated, use ceilPowerOfTwo from GTC_round instead\n\t///\n\t/// @see gtc_round\n\t/// @see gtx_bit\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoAbove(vec<L, T, Q> const& value);\n\n\t/// Return the power of two number which value is just lower the input value.\n\t/// Deprecated, use floorPowerOfTwo from GTC_round instead\n\t///\n\t/// @see gtc_round\n\t/// @see gtx_bit\n\ttemplate<typename genIUType>\n\tGLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoBelow(genIUType Value);\n\n\t/// Return the power of two number which value is just lower the input value.\n\t/// Deprecated, use floorPowerOfTwo from GTC_round instead\n\t///\n\t/// @see gtc_round\n\t/// @see gtx_bit\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoBelow(vec<L, T, Q> const& value);\n\n\t/// Return the power of two number which value is the closet to the input value.\n\t/// Deprecated, use roundPowerOfTwo from GTC_round instead\n\t///\n\t/// @see gtc_round\n\t/// @see gtx_bit\n\ttemplate<typename genIUType>\n\tGLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoNearest(genIUType Value);\n\n\t/// Return the power of two number which value is the closet to the input value.\n\t/// Deprecated, use roundPowerOfTwo from GTC_round instead\n\t///\n\t/// @see gtc_round\n\t/// @see gtx_bit\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoNearest(vec<L, T, Q> const& value);\n\n\t/// @}\n} //namespace glm\n\n\n#include \"bit.inl\"\n\n"
  },
  {
    "path": "external/glm/glm/gtx/bit.inl",
    "content": "/// @ref gtx_bit\n/// @file glm/gtx/bit.inl\n\nnamespace glm\n{\n\t///////////////////\n\t// highestBitValue\n\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType highestBitValue(genIUType Value)\n\t{\n\t\tgenIUType tmp = Value;\n\t\tgenIUType result = genIUType(0);\n\t\twhile(tmp)\n\t\t{\n\t\t\tresult = (tmp & (~tmp + 1)); // grab lowest bit\n\t\t\ttmp &= ~result; // clear lowest bit\n\t\t}\n\t\treturn result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> highestBitValue(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(highestBitValue, v);\n\t}\n\n\t///////////////////\n\t// lowestBitValue\n\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType lowestBitValue(genIUType Value)\n\t{\n\t\treturn (Value & (~Value + 1));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> lowestBitValue(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(lowestBitValue, v);\n\t}\n\n\t///////////////////\n\t// powerOfTwoAbove\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType value)\n\t{\n\t\treturn isPowerOfTwo(value) ? value : highestBitValue(value) << 1;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoAbove(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(powerOfTwoAbove, v);\n\t}\n\n\t///////////////////\n\t// powerOfTwoBelow\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType powerOfTwoBelow(genType value)\n\t{\n\t\treturn isPowerOfTwo(value) ? value : highestBitValue(value);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoBelow(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(powerOfTwoBelow, v);\n\t}\n\n\t/////////////////////\n\t// powerOfTwoNearest\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType powerOfTwoNearest(genType value)\n\t{\n\t\tif(isPowerOfTwo(value))\n\t\t\treturn value;\n\n\t\tgenType const prev = highestBitValue(value);\n\t\tgenType const next = prev << 1;\n\t\treturn (next - value) < (value - prev) ? next : prev;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoNearest(vec<L, T, Q> const& v)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(powerOfTwoNearest, v);\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/closest_point.hpp",
    "content": "/// @ref gtx_closest_point\n/// @file glm/gtx/closest_point.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_closest_point GLM_GTX_closest_point\n/// @ingroup gtx\n///\n/// Include <glm/gtx/closest_point.hpp> to use the features of this extension.\n///\n/// Find the point on a straight line which is the closet of a point.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_closest_point extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_closest_point\n\t/// @{\n\n\t/// Find the point on a straight line which is the closet of a point. \n\t/// @see gtx_closest_point\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> closestPointOnLine(\n\t\tvec<3, T, Q> const& point,\n\t\tvec<3, T, Q> const& a, \n\t\tvec<3, T, Q> const& b);\n\t\n\t/// 2d lines work as well\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> closestPointOnLine(\n\t\tvec<2, T, Q> const& point,\n\t\tvec<2, T, Q> const& a, \n\t\tvec<2, T, Q> const& b);\t\n\n\t/// @}\n}// namespace glm\n\n#include \"closest_point.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/closest_point.inl",
    "content": "/// @ref gtx_closest_point\n/// @file glm/gtx/closest_point.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> closestPointOnLine\n\t(\n\t\tvec<3, T, Q> const& point,\n\t\tvec<3, T, Q> const& a,\n\t\tvec<3, T, Q> const& b\n\t)\n\t{\n\t\tT LineLength = distance(a, b);\n\t\tvec<3, T, Q> Vector = point - a;\n\t\tvec<3, T, Q> LineDirection = (b - a) / LineLength;\n\n\t\t// Project Vector to LineDirection to get the distance of point from a\n\t\tT Distance = dot(Vector, LineDirection);\n\n\t\tif(Distance <= T(0)) return a;\n\t\tif(Distance >= LineLength) return b;\n\t\treturn a + LineDirection * Distance;\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> closestPointOnLine\n\t(\n\t\tvec<2, T, Q> const& point,\n\t\tvec<2, T, Q> const& a,\n\t\tvec<2, T, Q> const& b\n\t)\n\t{\n\t\tT LineLength = distance(a, b);\n\t\tvec<2, T, Q> Vector = point - a;\n\t\tvec<2, T, Q> LineDirection = (b - a) / LineLength;\n\n\t\t// Project Vector to LineDirection to get the distance of point from a\n\t\tT Distance = dot(Vector, LineDirection);\n\n\t\tif(Distance <= T(0)) return a;\n\t\tif(Distance >= LineLength) return b;\n\t\treturn a + LineDirection * Distance;\n\t}\n\t\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/color_encoding.hpp",
    "content": "/// @ref gtx_color_encoding\n/// @file glm/gtx/color_encoding.hpp\n///\n/// @see core (dependence)\n/// @see gtx_color_encoding (dependence)\n///\n/// @defgroup gtx_color_encoding GLM_GTX_color_encoding\n/// @ingroup gtx\n///\n/// Include <glm/gtx/color_encoding.hpp> to use the features of this extension.\n///\n/// @brief Allow to perform bit operations on integer values\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n#include \"../vec3.hpp\"\n#include <limits>\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTC_color_encoding extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_color_encoding\n\t/// @{\n\n\t/// Convert a linear sRGB color to D65 YUV.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB);\n\n\t/// Convert a linear sRGB color to D50 YUV.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB);\n\n\t/// Convert a D65 YUV color to linear sRGB.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ);\n\n\t/// Convert a D65 YUV color to D50 YUV.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ);\n\n\t/// @}\n} //namespace glm\n\n#include \"color_encoding.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/color_encoding.inl",
    "content": "/// @ref gtx_color_encoding\n/// @file glm/gtx/color_encoding.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB)\n\t{\n\t\tvec<3, T, Q> const M(0.490f, 0.17697f, 0.2f);\n\t\tvec<3, T, Q> const N(0.31f,  0.8124f, 0.01063f);\n\t\tvec<3, T, Q> const O(0.490f, 0.01f, 0.99f);\n\n\t\treturn (M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB) * static_cast<T>(5.650675255693055f);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB)\n\t{\n\t\tvec<3, T, Q> const M(0.436030342570117f, 0.222438466210245f, 0.013897440074263f);\n\t\tvec<3, T, Q> const N(0.385101860087134f, 0.716942745571917f, 0.097076381494207f);\n\t\tvec<3, T, Q> const O(0.143067806654203f, 0.060618777416563f, 0.713926257896652f);\n\n\t\treturn M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ)\n\t{\n\t\tvec<3, T, Q> const M(0.41847f, -0.091169f, 0.0009209f);\n\t\tvec<3, T, Q> const N(-0.15866f, 0.25243f, 0.015708f);\n\t\tvec<3, T, Q> const O(0.0009209f, -0.0025498f, 0.1786f);\n\n\t\treturn M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ)\n\t{\n\t\tvec<3, T, Q> const M(+1.047844353856414f, +0.029549007606644f, -0.009250984365223f);\n\t\tvec<3, T, Q> const N(+0.022898981050086f, +0.990508028941971f, +0.015072338237051f);\n\t\tvec<3, T, Q> const O(-0.050206647741605f, -0.017074711360960f, +0.751717835079977f);\n\n\t\treturn M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ;\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/color_space.hpp",
    "content": "/// @ref gtx_color_space\n/// @file glm/gtx/color_space.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_color_space GLM_GTX_color_space\n/// @ingroup gtx\n///\n/// Include <glm/gtx/color_space.hpp> to use the features of this extension.\n///\n/// Related to RGB to HSV conversions and operations.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_color_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_color_space extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_color_space\n\t/// @{\n\n\t/// Converts a color from HSV color space to its color in RGB color space.\n\t/// @see gtx_color_space\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> rgbColor(\n\t\tvec<3, T, Q> const& hsvValue);\n\n\t/// Converts a color from RGB color space to its color in HSV color space.\n\t/// @see gtx_color_space\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> hsvColor(\n\t\tvec<3, T, Q> const& rgbValue);\n\t\t\n\t/// Build a saturation matrix.\n\t/// @see gtx_color_space\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> saturation(\n\t\tT const s);\n\n\t/// Modify the saturation of a color.\n\t/// @see gtx_color_space\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> saturation(\n\t\tT const s,\n\t\tvec<3, T, Q> const& color);\n\t\t\n\t/// Modify the saturation of a color.\n\t/// @see gtx_color_space\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> saturation(\n\t\tT const s,\n\t\tvec<4, T, Q> const& color);\n\t\t\n\t/// Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals.\n\t/// @see gtx_color_space\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T luminosity(\n\t\tvec<3, T, Q> const& color);\n\n\t/// @}\n}//namespace glm\n\n#include \"color_space.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/color_space.inl",
    "content": "/// @ref gtx_color_space\n/// @file glm/gtx/color_space.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rgbColor(const vec<3, T, Q>& hsvColor)\n\t{\n\t\tvec<3, T, Q> hsv = hsvColor;\n\t\tvec<3, T, Q> rgbColor;\n\n\t\tif(hsv.y == static_cast<T>(0))\n\t\t\t// achromatic (grey)\n\t\t\trgbColor = vec<3, T, Q>(hsv.z);\n\t\telse\n\t\t{\n\t\t\tT sector = floor(hsv.x * (T(1) / T(60)));\n\t\t\tT frac = (hsv.x * (T(1) / T(60))) - sector;\n\t\t\t// factorial part of h\n\t\t\tT o = hsv.z * (T(1) - hsv.y);\n\t\t\tT p = hsv.z * (T(1) - hsv.y * frac);\n\t\t\tT q = hsv.z * (T(1) - hsv.y * (T(1) - frac));\n\n\t\t\tswitch(int(sector))\n\t\t\t{\n\t\t\tdefault:\n\t\t\tcase 0:\n\t\t\t\trgbColor.r = hsv.z;\n\t\t\t\trgbColor.g = q;\n\t\t\t\trgbColor.b = o;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\trgbColor.r = p;\n\t\t\t\trgbColor.g = hsv.z;\n\t\t\t\trgbColor.b = o;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\trgbColor.r = o;\n\t\t\t\trgbColor.g = hsv.z;\n\t\t\t\trgbColor.b = q;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\trgbColor.r = o;\n\t\t\t\trgbColor.g = p;\n\t\t\t\trgbColor.b = hsv.z;\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\trgbColor.r = q; \n\t\t\t\trgbColor.g = o; \n\t\t\t\trgbColor.b = hsv.z;\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\trgbColor.r = hsv.z; \n\t\t\t\trgbColor.g = o; \n\t\t\t\trgbColor.b = p;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn rgbColor;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> hsvColor(const vec<3, T, Q>& rgbColor)\n\t{\n\t\tvec<3, T, Q> hsv = rgbColor;\n\t\tfloat Min   = min(min(rgbColor.r, rgbColor.g), rgbColor.b);\n\t\tfloat Max   = max(max(rgbColor.r, rgbColor.g), rgbColor.b);\n\t\tfloat Delta = Max - Min;\n\n\t\thsv.z = Max;                               \n\n\t\tif(Max != static_cast<T>(0))\n\t\t{\n\t\t\thsv.y = Delta / hsv.z;    \n\t\t\tT h = static_cast<T>(0);\n\n\t\t\tif(rgbColor.r == Max)\n\t\t\t\t// between yellow & magenta\n\t\t\t\th = static_cast<T>(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta;\n\t\t\telse if(rgbColor.g == Max)\n\t\t\t\t// between cyan & yellow\n\t\t\t\th = static_cast<T>(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta;\n\t\t\telse\n\t\t\t\t// between magenta & cyan\n\t\t\t\th = static_cast<T>(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta;\n\n\t\t\tif(h < T(0)) \n\t\t\t\thsv.x = h + T(360);\n\t\t\telse\n\t\t\t\thsv.x = h;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If r = g = b = 0 then s = 0, h is undefined\n\t\t\thsv.y = static_cast<T>(0);\n\t\t\thsv.x = static_cast<T>(0);\n\t\t}\n\n\t\treturn hsv;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> saturation(T const s)\n\t{\n\t\tvec<3, T, defaultp> rgbw = vec<3, T, defaultp>(T(0.2126), T(0.7152), T(0.0722));\n\n\t\tvec<3, T, defaultp> const col((T(1) - s) * rgbw);\n\n\t\tmat<4, 4, T, defaultp> result(T(1));\n\t\tresult[0][0] = col.x + s;\n\t\tresult[0][1] = col.x;\n\t\tresult[0][2] = col.x;\n\t\tresult[1][0] = col.y;\n\t\tresult[1][1] = col.y + s;\n\t\tresult[1][2] = col.y;\n\t\tresult[2][0] = col.z;\n\t\tresult[2][1] = col.z;\n\t\tresult[2][2] = col.z + s;\n\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> saturation(const T s, const vec<3, T, Q>& color)\n\t{\n\t\treturn vec<3, T, Q>(saturation(s) * vec<4, T, Q>(color, T(0)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> saturation(const T s, const vec<4, T, Q>& color)\n\t{\n\t\treturn saturation(s) * color;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER T luminosity(const vec<3, T, Q>& color)\n\t{\n\t\tconst vec<3, T, Q> tmp = vec<3, T, Q>(0.33, 0.59, 0.11);\n\t\treturn dot(color, tmp);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/color_space_YCoCg.hpp",
    "content": "/// @ref gtx_color_space_YCoCg\n/// @file glm/gtx/color_space_YCoCg.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_color_space_YCoCg GLM_GTX_color_space_YCoCg\n/// @ingroup gtx\n///\n/// Include <glm/gtx/color_space_YCoCg.hpp> to use the features of this extension.\n///\n/// RGB to YCoCg conversions and operations\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_color_space_YCoCg is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_color_space_YCoCg extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_color_space_YCoCg\n\t/// @{\n\n\t/// Convert a color from RGB color space to YCoCg color space.\n\t/// @see gtx_color_space_YCoCg\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> rgb2YCoCg(\n\t\tvec<3, T, Q> const& rgbColor);\n\n\t/// Convert a color from YCoCg color space to RGB color space.\n\t/// @see gtx_color_space_YCoCg\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> YCoCg2rgb(\n\t\tvec<3, T, Q> const& YCoCgColor);\n\n\t/// Convert a color from RGB color space to YCoCgR color space.\n\t/// @see \"YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range\"\n\t/// @see gtx_color_space_YCoCg\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> rgb2YCoCgR(\n\t\tvec<3, T, Q> const& rgbColor);\n\n\t/// Convert a color from YCoCgR color space to RGB color space.\n\t/// @see \"YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range\"\n\t/// @see gtx_color_space_YCoCg\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> YCoCgR2rgb(\n\t\tvec<3, T, Q> const& YCoCgColor);\n\n\t/// @}\n}//namespace glm\n\n#include \"color_space_YCoCg.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/color_space_YCoCg.inl",
    "content": "/// @ref gtx_color_space_YCoCg\n/// @file glm/gtx/color_space_YCoCg.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCg\n\t(\n\t\tvec<3, T, Q> const& rgbColor\n\t)\n\t{\n\t\tvec<3, T, Q> result;\n\t\tresult.x/*Y */ =   rgbColor.r / T(4) + rgbColor.g / T(2) + rgbColor.b / T(4);\n\t\tresult.y/*Co*/ =   rgbColor.r / T(2) + rgbColor.g * T(0) - rgbColor.b / T(2);\n\t\tresult.z/*Cg*/ = - rgbColor.r / T(4) + rgbColor.g / T(2) - rgbColor.b / T(4);\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> YCoCg2rgb\n\t(\n\t\tvec<3, T, Q> const& YCoCgColor\n\t)\n\t{\n\t\tvec<3, T, Q> result;\n\t\tresult.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z;\n\t\tresult.g = YCoCgColor.x\t\t\t\t   + YCoCgColor.z;\n\t\tresult.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z;\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q, bool isInteger>\n\tclass compute_YCoCgR {\n\tpublic:\n\t\tstatic GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR\n\t\t(\n\t\t\tvec<3, T, Q> const& rgbColor\n\t\t)\n\t\t{\n\t\t\tvec<3, T, Q> result;\n\t\t\tresult.x/*Y */ = rgbColor.g * static_cast<T>(0.5) + (rgbColor.r + rgbColor.b) * static_cast<T>(0.25);\n\t\t\tresult.y/*Co*/ = rgbColor.r - rgbColor.b;\n\t\t\tresult.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) * static_cast<T>(0.5);\n\t\t\treturn result;\n\t\t}\n\n\t\tstatic GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb\n\t\t(\n\t\t\tvec<3, T, Q> const& YCoCgRColor\n\t\t)\n\t\t{\n\t\t\tvec<3, T, Q> result;\n\t\t\tT tmp = YCoCgRColor.x - (YCoCgRColor.z * static_cast<T>(0.5));\n\t\t\tresult.g = YCoCgRColor.z + tmp;\n\t\t\tresult.b = tmp - (YCoCgRColor.y * static_cast<T>(0.5));\n\t\t\tresult.r = result.b + YCoCgRColor.y;\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tclass compute_YCoCgR<T, Q, true> {\n\tpublic:\n\t\tstatic GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR\n\t\t(\n\t\t\tvec<3, T, Q> const& rgbColor\n\t\t)\n\t\t{\n\t\t\tvec<3, T, Q> result;\n\t\t\tresult.y/*Co*/ = rgbColor.r - rgbColor.b;\n\t\t\tT tmp = rgbColor.b + (result.y >> 1);\n\t\t\tresult.z/*Cg*/ = rgbColor.g - tmp;\n\t\t\tresult.x/*Y */ = tmp + (result.z >> 1);\n\t\t\treturn result;\n\t\t}\n\n\t\tstatic GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb\n\t\t(\n\t\t\tvec<3, T, Q> const& YCoCgRColor\n\t\t)\n\t\t{\n\t\t\tvec<3, T, Q> result;\n\t\t\tT tmp = YCoCgRColor.x - (YCoCgRColor.z >> 1);\n\t\t\tresult.g = YCoCgRColor.z + tmp;\n\t\t\tresult.b = tmp - (YCoCgRColor.y >> 1);\n\t\t\tresult.r = result.b + YCoCgRColor.y;\n\t\t\treturn result;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR\n\t(\n\t\tvec<3, T, Q> const& rgbColor\n\t)\n\t{\n\t\treturn compute_YCoCgR<T, Q, std::numeric_limits<T>::is_integer>::rgb2YCoCgR(rgbColor);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb\n\t(\n\t\tvec<3, T, Q> const& YCoCgRColor\n\t)\n\t{\n\t\treturn compute_YCoCgR<T, Q, std::numeric_limits<T>::is_integer>::YCoCgR2rgb(YCoCgRColor);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/common.hpp",
    "content": "/// @ref gtx_common\n/// @file glm/gtx/common.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_common GLM_GTX_common\n/// @ingroup gtx\n///\n/// Include <glm/gtx/common.hpp> to use the features of this extension.\n///\n/// @brief Provide functions to increase the compatibility with Cg and HLSL languages\n\n#pragma once\n\n// Dependencies:\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../gtc/vec1.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_common is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_common extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_common\n\t/// @{\n\n\t/// Returns true if x is a denormalized number\n\t/// Numbers whose absolute value is too small to be represented in the normal format are represented in an alternate, denormalized format.\n\t/// This format is less precise but can represent values closer to zero.\n\t/// \n\t/// @tparam genType Floating-point scalar or vector types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml\">GLSL isnan man page</a>\n\t/// @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>\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL typename genType::bool_type isdenormal(genType const& x);\n\n\t/// Similar to 'mod' but with a different rounding and integer support.\n\t/// Returns 'x - y * trunc(x/y)' instead of 'x - y * floor(x/y)'\n\t/// \n\t/// @see <a href=\"http://stackoverflow.com/questions/7610631/glsl-mod-vs-hlsl-fmod\">GLSL mod vs HLSL fmod</a>\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod man page</a>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fmod(vec<L, T, Q> const& v);\n\n\t/// @}\n}//namespace glm\n\n#include \"common.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/common.inl",
    "content": "/// @ref gtx_common\n/// @file glm/gtx/common.inl\n\n#include <cmath>\n#include \"../gtc/epsilon.hpp\"\n#include \"../gtc/constants.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, qualifier Q, bool isFloat = true>\n\tstruct compute_fmod\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)\n\t\t{\n\t\t\treturn detail::functor2<L, T, Q>::call(std::fmod, a, b);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct compute_fmod<L, T, Q, false>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)\n\t\t{\n\t\t\treturn a % b;\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<typename T> \n\tGLM_FUNC_QUALIFIER bool isdenormal(T const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isdenormal' only accept floating-point inputs\");\n\n#\t\tif GLM_HAS_CXX11_STL\n\t\t\treturn std::fpclassify(x) == FP_SUBNORMAL;\n#\t\telse\n\t\t\treturn epsilonNotEqual(x, static_cast<T>(0), epsilon<T>()) && std::fabs(x) < std::numeric_limits<T>::min();\n#\t\tendif\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename vec<1, T, Q>::bool_type isdenormal\n\t(\n\t\tvec<1, T, Q> const& x\n\t)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isdenormal' only accept floating-point inputs\");\n\n\t\treturn typename vec<1, T, Q>::bool_type(\n\t\t\tisdenormal(x.x));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename vec<2, T, Q>::bool_type isdenormal\n\t(\n\t\tvec<2, T, Q> const& x\n\t)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isdenormal' only accept floating-point inputs\");\n\n\t\treturn typename vec<2, T, Q>::bool_type(\n\t\t\tisdenormal(x.x),\n\t\t\tisdenormal(x.y));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename vec<3, T, Q>::bool_type isdenormal\n\t(\n\t\tvec<3, T, Q> const& x\n\t)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isdenormal' only accept floating-point inputs\");\n\n\t\treturn typename vec<3, T, Q>::bool_type(\n\t\t\tisdenormal(x.x),\n\t\t\tisdenormal(x.y),\n\t\t\tisdenormal(x.z));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename vec<4, T, Q>::bool_type isdenormal\n\t(\n\t\tvec<4, T, Q> const& x\n\t)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isdenormal' only accept floating-point inputs\");\n\n\t\treturn typename vec<4, T, Q>::bool_type(\n\t\t\tisdenormal(x.x),\n\t\t\tisdenormal(x.y),\n\t\t\tisdenormal(x.z),\n\t\t\tisdenormal(x.w));\n\t}\n\n\t// fmod\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fmod(genType x, genType y)\n\t{\n\t\treturn fmod(vec<1, genType>(x), y).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fmod(vec<L, T, Q> const& x, T y)\n\t{\n\t\treturn detail::compute_fmod<L, T, Q, std::numeric_limits<T>::is_iec559>::call(x, vec<L, T, Q>(y));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fmod(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\treturn detail::compute_fmod<L, T, Q, std::numeric_limits<T>::is_iec559>::call(x, y);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/compatibility.hpp",
    "content": "/// @ref gtx_compatibility\n/// @file glm/gtx/compatibility.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_compatibility GLM_GTX_compatibility\n/// @ingroup gtx\n///\n/// Include <glm/gtx/compatibility.hpp> to use the features of this extension.\n///\n/// Provide functions to increase the compatibility with Cg and HLSL languages\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/quaternion.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_compatibility is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_compatibility extension included\")\n#endif\n\n#if GLM_COMPILER & GLM_COMPILER_VC\n#\tinclude <cfloat>\n#elif GLM_COMPILER & GLM_COMPILER_GCC\n#\tinclude <cmath>\n#\tif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n#\t\tundef isfinite\n#\tendif\n#endif//GLM_COMPILER\n\nnamespace glm\n{\n\t/// @addtogroup gtx_compatibility\n\t/// @{\n\n\ttemplate<typename T> GLM_FUNC_QUALIFIER T lerp(T x, T y, T a){return mix(x, y, a);}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//!< \\brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, T a){return mix(x, y, a);}\t\t\t\t\t\t\t//!< \\brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)\n\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, T a){return mix(x, y, a);}\t\t\t\t\t\t\t//!< \\brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, T a){return mix(x, y, a);}\t\t\t\t\t\t\t//!< \\brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, const vec<2, T, Q>& a){return mix(x, y, a);}\t//!< \\brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, const vec<3, T, Q>& a){return mix(x, y, a);}\t//!< \\brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, const vec<4, T, Q>& a){return mix(x, y, a);}\t//!< \\brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)\n\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));}\t\t\t\t\t\t\t\t\t\t\t\t\t\t//!< \\brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> saturate(const vec<2, T, Q>& x){return clamp(x, T(0), T(1));}\t\t\t\t\t//!< \\brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> saturate(const vec<3, T, Q>& x){return clamp(x, T(0), T(1));}\t\t\t\t\t//!< \\brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> saturate(const vec<4, T, Q>& x){return clamp(x, T(0), T(1));}\t\t\t\t\t//!< \\brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)\n\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER T atan2(T x, T y){return atan(x, y);}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//!< \\brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> atan2(const vec<2, T, Q>& x, const vec<2, T, Q>& y){return atan(x, y);}\t//!< \\brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> atan2(const vec<3, T, Q>& x, const vec<3, T, Q>& y){return atan(x, y);}\t//!< \\brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> atan2(const vec<4, T, Q>& x, const vec<4, T, Q>& y){return atan(x, y);}\t//!< \\brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)\n\n\ttemplate<typename genType> GLM_FUNC_DECL bool isfinite(genType const& x);\t\t\t\t\t\t\t\t\t\t\t//!< \\brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_DECL vec<1, bool, Q> isfinite(const vec<1, T, Q>& x);\t\t\t\t//!< \\brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_DECL vec<2, bool, Q> isfinite(const vec<2, T, Q>& x);\t\t\t\t//!< \\brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_DECL vec<3, bool, Q> isfinite(const vec<3, T, Q>& x);\t\t\t\t//!< \\brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)\n\ttemplate<typename T, qualifier Q> GLM_FUNC_DECL vec<4, bool, Q> isfinite(const vec<4, T, Q>& x);\t\t\t\t//!< \\brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)\n\n\ttypedef bool\t\t\t\t\t\tbool1;\t\t\t//!< \\brief boolean type with 1 component. (From GLM_GTX_compatibility extension)\n\ttypedef vec<2, bool, highp>\t\t\tbool2;\t\t\t//!< \\brief boolean type with 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef vec<3, bool, highp>\t\t\tbool3;\t\t\t//!< \\brief boolean type with 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef vec<4, bool, highp>\t\t\tbool4;\t\t\t//!< \\brief boolean type with 4 components. (From GLM_GTX_compatibility extension)\n\n\ttypedef bool\t\t\t\t\t\tbool1x1;\t\t//!< \\brief boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 2, bool, highp>\t\tbool2x2;\t\t//!< \\brief boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 3, bool, highp>\t\tbool2x3;\t\t//!< \\brief boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 4, bool, highp>\t\tbool2x4;\t\t//!< \\brief boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 2, bool, highp>\t\tbool3x2;\t\t//!< \\brief boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 3, bool, highp>\t\tbool3x3;\t\t//!< \\brief boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 4, bool, highp>\t\tbool3x4;\t\t//!< \\brief boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 2, bool, highp>\t\tbool4x2;\t\t//!< \\brief boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 3, bool, highp>\t\tbool4x3;\t\t//!< \\brief boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 4, bool, highp>\t\tbool4x4;\t\t//!< \\brief boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)\n\n\ttypedef int\t\t\t\t\t\t\tint1;\t\t\t//!< \\brief integer vector with 1 component. (From GLM_GTX_compatibility extension)\n\ttypedef vec<2, int, highp>\t\t\tint2;\t\t\t//!< \\brief integer vector with 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef vec<3, int, highp>\t\t\tint3;\t\t\t//!< \\brief integer vector with 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef vec<4, int, highp>\t\t\tint4;\t\t\t//!< \\brief integer vector with 4 components. (From GLM_GTX_compatibility extension)\n\n\ttypedef int\t\t\t\t\t\t\tint1x1;\t\t\t//!< \\brief integer matrix with 1 component. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 2, int, highp>\t\tint2x2;\t\t\t//!< \\brief integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 3, int, highp>\t\tint2x3;\t\t\t//!< \\brief integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 4, int, highp>\t\tint2x4;\t\t\t//!< \\brief integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 2, int, highp>\t\tint3x2;\t\t\t//!< \\brief integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 3, int, highp>\t\tint3x3;\t\t\t//!< \\brief integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 4, int, highp>\t\tint3x4;\t\t\t//!< \\brief integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 2, int, highp>\t\tint4x2;\t\t\t//!< \\brief integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 3, int, highp>\t\tint4x3;\t\t\t//!< \\brief integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 4, int, highp>\t\tint4x4;\t\t\t//!< \\brief integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)\n\n\ttypedef float\t\t\t\t\t\tfloat1;\t\t\t//!< \\brief single-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension)\n\ttypedef vec<2, float, highp>\t\tfloat2;\t\t\t//!< \\brief single-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef vec<3, float, highp>\t\tfloat3;\t\t\t//!< \\brief single-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef vec<4, float, highp>\t\tfloat4;\t\t\t//!< \\brief single-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension)\n\n\ttypedef float\t\t\t\t\t\tfloat1x1;\t\t//!< \\brief single-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 2, float, highp>\t\tfloat2x2;\t\t//!< \\brief single-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 3, float, highp>\t\tfloat2x3;\t\t//!< \\brief single-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 4, float, highp>\t\tfloat2x4;\t\t//!< \\brief single-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 2, float, highp>\t\tfloat3x2;\t\t//!< \\brief single-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 3, float, highp>\t\tfloat3x3;\t\t//!< \\brief single-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 4, float, highp>\t\tfloat3x4;\t\t//!< \\brief single-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 2, float, highp>\t\tfloat4x2;\t\t//!< \\brief single-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 3, float, highp>\t\tfloat4x3;\t\t//!< \\brief single-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 4, float, highp>\t\tfloat4x4;\t\t//!< \\brief single-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)\n\n\ttypedef double\t\t\t\t\t\tdouble1;\t\t//!< \\brief double-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension)\n\ttypedef vec<2, double, highp>\t\tdouble2;\t\t//!< \\brief double-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef vec<3, double, highp>\t\tdouble3;\t\t//!< \\brief double-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef vec<4, double, highp>\t\tdouble4;\t\t//!< \\brief double-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension)\n\n\ttypedef double\t\t\t\t\t\tdouble1x1;\t\t//!< \\brief double-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 2, double, highp>\t\tdouble2x2;\t\t//!< \\brief double-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 3, double, highp>\t\tdouble2x3;\t\t//!< \\brief double-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<2, 4, double, highp>\t\tdouble2x4;\t\t//!< \\brief double-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 2, double, highp>\t\tdouble3x2;\t\t//!< \\brief double-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 3, double, highp>\t\tdouble3x3;\t\t//!< \\brief double-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<3, 4, double, highp>\t\tdouble3x4;\t\t//!< \\brief double-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 2, double, highp>\t\tdouble4x2;\t\t//!< \\brief double-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 3, double, highp>\t\tdouble4x3;\t\t//!< \\brief double-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)\n\ttypedef mat<4, 4, double, highp>\t\tdouble4x4;\t\t//!< \\brief double-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)\n\n\t/// @}\n}//namespace glm\n\n#include \"compatibility.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/compatibility.inl",
    "content": "/// @ref gtx_compatibility\n/// @file glm/gtx/compatibility.inl\n\n#include <limits>\n\nnamespace glm\n{\n\t// isfinite\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool isfinite(\n\t\tgenType const& x)\n\t{\n#\t\tif GLM_HAS_CXX11_STL\n\t\t\treturn std::isfinite(x) != 0;\n#\t\telif GLM_COMPILER & GLM_COMPILER_VC\n\t\t\treturn _finite(x);\n#\t\telif GLM_COMPILER & GLM_COMPILER_GCC && GLM_PLATFORM & GLM_PLATFORM_ANDROID\n\t\t\treturn _isfinite(x) != 0;\n#\t\telse\n\t\t\tif (std::numeric_limits<genType>::is_integer || std::denorm_absent == std::numeric_limits<genType>::has_denorm)\n\t\t\t\treturn std::numeric_limits<genType>::min() <= x && std::numeric_limits<genType>::max() >= x;\n\t\t\telse\n\t\t\t\treturn -std::numeric_limits<genType>::max() <= x && std::numeric_limits<genType>::max() >= x;\n#\t\tendif\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<1, bool, Q> isfinite(\n\t\tvec<1, T, Q> const& x)\n\t{\n\t\treturn vec<1, bool, Q>(\n\t\t\tisfinite(x.x));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, bool, Q> isfinite(\n\t\tvec<2, T, Q> const& x)\n\t{\n\t\treturn vec<2, bool, Q>(\n\t\t\tisfinite(x.x),\n\t\t\tisfinite(x.y));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, bool, Q> isfinite(\n\t\tvec<3, T, Q> const& x)\n\t{\n\t\treturn vec<3, bool, Q>(\n\t\t\tisfinite(x.x),\n\t\t\tisfinite(x.y),\n\t\t\tisfinite(x.z));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> isfinite(\n\t\tvec<4, T, Q> const& x)\n\t{\n\t\treturn vec<4, bool, Q>(\n\t\t\tisfinite(x.x),\n\t\t\tisfinite(x.y),\n\t\t\tisfinite(x.z),\n\t\t\tisfinite(x.w));\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/component_wise.hpp",
    "content": "/// @ref gtx_component_wise\n/// @file glm/gtx/component_wise.hpp\n/// @date 2007-05-21 / 2011-06-07\n/// @author Christophe Riccio\n/// \n/// @see core (dependence)\n///\n/// @defgroup gtx_component_wise GLM_GTX_component_wise\n/// @ingroup gtx\n///\n/// Include <glm/gtx/component_wise.hpp> to use the features of this extension.\n///\n/// Operations between components of a type\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_component_wise is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_component_wise extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_component_wise\n\t/// @{\n\n\t/// Convert an integer vector to a normalized float vector.\n\t/// If the parameter value type is already a floating qualifier type, the value is passed through.\n\t/// @see gtx_component_wise\n\ttemplate<typename floatType, length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, floatType, Q> compNormalize(vec<L, T, Q> const& v);\n\n\t/// Convert a normalized float vector to an integer vector.\n\t/// If the parameter value type is already a floating qualifier type, the value is passed through.\n\t/// @see gtx_component_wise\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> compScale(vec<L, floatType, Q> const& v);\n\n\t/// Add all vector components together. \n\t/// @see gtx_component_wise\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL typename genType::value_type compAdd(genType const& v);\n\n\t/// Multiply all vector components together. \n\t/// @see gtx_component_wise\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL typename genType::value_type compMul(genType const& v);\n\n\t/// Find the minimum value between single vector components.\n\t/// @see gtx_component_wise\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL typename genType::value_type compMin(genType const& v);\n\n\t/// Find the maximum value between single vector components.\n\t/// @see gtx_component_wise\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL typename genType::value_type compMax(genType const& v);\n\n\t/// @}\n}//namespace glm\n\n#include \"component_wise.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/component_wise.inl",
    "content": "/// @ref gtx_component_wise\n/// @file glm/gtx/component_wise.inl\n\n#include <limits>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q, bool isInteger, bool signedType>\n\tstruct compute_compNormalize\n\t{};\n\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q>\n\tstruct compute_compNormalize<L, T, floatType, Q, true, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\tfloatType const Min = static_cast<floatType>(std::numeric_limits<T>::min());\n\t\t\tfloatType const Max = static_cast<floatType>(std::numeric_limits<T>::max());\n\t\t\treturn (vec<L, floatType, Q>(v) - Min) / (Max - Min) * static_cast<floatType>(2) - static_cast<floatType>(1);\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q>\n\tstruct compute_compNormalize<L, T, floatType, Q, true, false>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\treturn vec<L, floatType, Q>(v) / static_cast<floatType>(std::numeric_limits<T>::max());\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q>\n\tstruct compute_compNormalize<L, T, floatType, Q, false, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\treturn v;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q, bool isInteger, bool signedType>\n\tstruct compute_compScale\n\t{};\n\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q>\n\tstruct compute_compScale<L, T, floatType, Q, true, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v)\n\t\t{\n\t\t\tfloatType const Max = static_cast<floatType>(std::numeric_limits<T>::max()) + static_cast<floatType>(0.5);\n\t\t\tvec<L, floatType, Q> const Scaled(v * Max);\n\t\t\tvec<L, T, Q> const Result(Scaled - static_cast<floatType>(0.5));\n\t\t\treturn Result;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q>\n\tstruct compute_compScale<L, T, floatType, Q, true, false>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v)\n\t\t{\n\t\t\treturn vec<L, T, Q>(vec<L, floatType, Q>(v) * static_cast<floatType>(std::numeric_limits<T>::max()));\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, typename floatType, qualifier Q>\n\tstruct compute_compScale<L, T, floatType, Q, false, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v)\n\t\t{\n\t\t\treturn v;\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<typename floatType, length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, floatType, Q> compNormalize(vec<L, T, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, \"'compNormalize' accepts only floating-point types for 'floatType' template parameter\");\n\n\t\treturn detail::compute_compNormalize<L, T, floatType, Q, std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed>::call(v);\n\t}\n\n\ttemplate<typename T, length_t L, typename floatType, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> compScale(vec<L, floatType, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, \"'compScale' accepts only floating-point types for 'floatType' template parameter\");\n\n\t\treturn detail::compute_compScale<L, T, floatType, Q, std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed>::call(v);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T compAdd(vec<L, T, Q> const& v)\n\t{\n\t\tT Result(0);\n\t\tfor(length_t i = 0, n = v.length(); i < n; ++i)\n\t\t\tResult += v[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T compMul(vec<L, T, Q> const& v)\n\t{\n\t\tT Result(1);\n\t\tfor(length_t i = 0, n = v.length(); i < n; ++i)\n\t\t\tResult *= v[i];\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T compMin(vec<L, T, Q> const& v)\n\t{\n\t\tT Result(v[0]);\n\t\tfor(length_t i = 1, n = v.length(); i < n; ++i)\n\t\t\tResult = min(Result, v[i]);\n\t\treturn Result;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T compMax(vec<L, T, Q> const& v)\n\t{\n\t\tT Result(v[0]);\n\t\tfor(length_t i = 1, n = v.length(); i < n; ++i)\n\t\t\tResult = max(Result, v[i]);\n\t\treturn Result;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/dual_quaternion.hpp",
    "content": "/// @ref gtx_dual_quaternion\n/// @file glm/gtx/dual_quaternion.hpp\n/// @author Maksim Vorobiev (msomeone@gmail.com)\n///\n/// @see core (dependence)\n/// @see gtc_constants (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtx_dual_quaternion GLM_GTX_dual_quaternion\n/// @ingroup gtx\n///\n/// Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension.\n///\n/// Defines a templated dual-quaternion type and several dual-quaternion operations.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/constants.hpp\"\n#include \"../gtc/quaternion.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_dual_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_dual_quaternion extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_dual_quaternion\n\t/// @{\n\n\ttemplate<typename T, qualifier Q = defaultp>\n\tstruct tdualquat\n\t{\n\t\t// -- Implementation detail --\n\n\t\ttypedef T value_type;\n\t\ttypedef glm::tquat<T, Q> part_type;\n\n\t\t// -- Data --\n\n\t\tglm::tquat<T, Q> real, dual;\n\n\t\t// -- Component accesses --\n\n\t\ttypedef length_t length_type;\n\t\t/// Return the count of components of a dual quaternion\n\t\tGLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;}\n\n\t\tGLM_FUNC_DECL part_type & operator[](length_type i);\n\t\tGLM_FUNC_DECL part_type const& operator[](length_type i) const;\n\n\t\t// -- Implicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tdualquat() GLM_DEFAULT;\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, Q> const& d) GLM_DEFAULT;\n\t\ttemplate<qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, P> const& d);\n\n\t\t// -- Explicit basic constructors --\n\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& real);\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& orientation, vec<3, T, Q> const& translation);\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tquat<T, Q> const& real, tquat<T, Q> const& dual);\n\n\t\t// -- Conversion constructors --\n\n\t\ttemplate<typename U, qualifier P>\n\t\tGLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tdualquat(tdualquat<U, P> const& q);\n\n\t\tGLM_FUNC_DECL GLM_EXPLICIT tdualquat(mat<2, 4, T, Q> const& holder_mat);\n\t\tGLM_FUNC_DECL GLM_EXPLICIT tdualquat(mat<3, 4, T, Q> const& aug_mat);\n\n\t\t// -- Unary arithmetic operators --\n\n\t\tGLM_FUNC_DECL tdualquat<T, Q> & operator=(tdualquat<T, Q> const& m) GLM_DEFAULT;\n\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tdualquat<T, Q> & operator=(tdualquat<U, Q> const& m);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tdualquat<T, Q> & operator*=(U s);\n\t\ttemplate<typename U>\n\t\tGLM_FUNC_DECL tdualquat<T, Q> & operator/=(U s);\n\t};\n\n\t// -- Unary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> operator+(tdualquat<T, Q> const& q);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> operator-(tdualquat<T, Q> const& q);\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> operator+(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(tdualquat<T, Q> const& q, vec<3, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat<T, Q> const& q);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(tdualquat<T, Q> const& q, vec<4, T, Q> const& v);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat<T, Q> const& q);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, T const& s);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> operator*(T const& s, tdualquat<T, Q> const& q);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> operator/(tdualquat<T, Q> const& q, T const& s);\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator==(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2);\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool operator!=(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2);\n\n\t/// Creates an identity dual quaternion.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttemplate <typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> dual_quat_identity();\n\n\t/// Returns the normalized quaternion.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> normalize(tdualquat<T, Q> const& q);\n\n\t/// Returns the linear interpolation of two dual quaternion.\n\t///\n\t/// @see gtc_dual_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> lerp(tdualquat<T, Q> const& x, tdualquat<T, Q> const& y, T const& a);\n\n\t/// Returns the q inverse.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> inverse(tdualquat<T, Q> const& q);\n\n\t/// Converts a quaternion to a 2 * 4 matrix.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> mat2x4_cast(tdualquat<T, Q> const& x);\n\n\t/// Converts a quaternion to a 3 * 4 matrix.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> mat3x4_cast(tdualquat<T, Q> const& x);\n\n\t/// Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> dualquat_cast(mat<2, 4, T, Q> const& x);\n\n\t/// Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tdualquat<T, Q> dualquat_cast(mat<3, 4, T, Q> const& x);\n\n\n\t/// Dual-quaternion of low single-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<float, lowp>\t\tlowp_dualquat;\n\n\t/// Dual-quaternion of medium single-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<float, mediump>\tmediump_dualquat;\n\n\t/// Dual-quaternion of high single-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<float, highp>\t\thighp_dualquat;\n\n\n\t/// Dual-quaternion of low single-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<float, lowp>\t\tlowp_fdualquat;\n\n\t/// Dual-quaternion of medium single-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<float, mediump>\tmediump_fdualquat;\n\n\t/// Dual-quaternion of high single-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<float, highp>\t\thighp_fdualquat;\n\n\n\t/// Dual-quaternion of low double-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<double, lowp>\t\tlowp_ddualquat;\n\n\t/// Dual-quaternion of medium double-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<double, mediump>\tmediump_ddualquat;\n\n\t/// Dual-quaternion of high double-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef tdualquat<double, highp>\thighp_ddualquat;\n\n\n#if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\t/// Dual-quaternion of floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef highp_fdualquat\t\t\tdualquat;\n\n\t/// Dual-quaternion of single-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef highp_fdualquat\t\t\tfdualquat;\n#elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef highp_fdualquat\t\t\tdualquat;\n\ttypedef highp_fdualquat\t\t\tfdualquat;\n#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef mediump_fdualquat\t\tdualquat;\n\ttypedef mediump_fdualquat\t\tfdualquat;\n#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT))\n\ttypedef lowp_fdualquat\t\t\tdualquat;\n\ttypedef lowp_fdualquat\t\t\tfdualquat;\n#else\n#\terror \"GLM error: multiple default precision requested for single-precision floating-point types\"\n#endif\n\n\n#if(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))\n\t/// Dual-quaternion of default double-qualifier floating-point numbers.\n\t///\n\t/// @see gtx_dual_quaternion\n\ttypedef highp_ddualquat\t\t\tddualquat;\n#elif(defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef highp_ddualquat\t\t\tddualquat;\n#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef mediump_ddualquat\t\tddualquat;\n#elif(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && defined(GLM_PRECISION_LOWP_DOUBLE))\n\ttypedef lowp_ddualquat\t\t\tddualquat;\n#else\n#\terror \"GLM error: Multiple default precision requested for double-precision floating-point types\"\n#endif\n\n\t/// @}\n} //namespace glm\n\n#include \"dual_quaternion.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/dual_quaternion.inl",
    "content": "/// @ref gtx_dual_quaternion\n/// @file glm/gtx/dual_quaternion.inl\n\n#include \"../geometric.hpp\"\n#include <limits>\n\nnamespace glm\n{\n\t// -- Component accesses --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename tdualquat<T, Q>::part_type & tdualquat<T, Q>::operator[](typename tdualquat<T, Q>::length_type i)\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&real)[i];\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER typename tdualquat<T, Q>::part_type const& tdualquat<T, Q>::operator[](typename tdualquat<T, Q>::length_type i) const\n\t{\n\t\tassert(i >= 0 && i < this->length());\n\t\treturn (&real)[i];\n\t}\n\n\t// -- Implicit basic constructors --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat()\n\t\t{}\n#\tendif\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<T, Q> const& d)\n\t\t\t: real(d.real)\n\t\t\t, dual(d.dual)\n\t\t{}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<T, P> const& d)\n\t\t: real(d.real)\n\t\t, dual(d.dual)\n\t{}\n\n\t// -- Explicit basic constructors --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tquat<T, Q> const& r)\n\t\t: real(r), dual(tquat<T, Q>(0, 0, 0, 0))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tquat<T, Q> const& q, vec<3, T, Q> const& p)\n\t\t: real(q), dual(\n\t\t\tT(-0.5) * ( p.x*q.x + p.y*q.y + p.z*q.z),\n\t\t\tT(+0.5) * ( p.x*q.w + p.y*q.z - p.z*q.y),\n\t\t\tT(+0.5) * (-p.x*q.z + p.y*q.w + p.z*q.x),\n\t\t\tT(+0.5) * ( p.x*q.y - p.y*q.x + p.z*q.w))\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tquat<T, Q> const& r, tquat<T, Q> const& d)\n\t\t: real(r), dual(d)\n\t{}\n\n\t// -- Conversion constructors --\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U, qualifier P>\n\tGLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<U, P> const& q)\n\t\t: real(q.real)\n\t\t, dual(q.dual)\n\t{}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q>::tdualquat(mat<2, 4, T, Q> const& m)\n\t{\n\t\t*this = dualquat_cast(m);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q>::tdualquat(mat<3, 4, T, Q> const& m)\n\t{\n\t\t*this = dualquat_cast(m);\n\t}\n\n\t// -- Unary arithmetic operators --\n\n#\tif !GLM_HAS_DEFAULTED_FUNCTIONS\n\t\ttemplate<typename T, qualifier Q>\n\t\tGLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator=(tdualquat<T, Q> const& q)\n\t\t{\n\t\t\tthis->real = q.real;\n\t\t\tthis->dual = q.dual;\n\t\t\treturn *this;\n\t\t}\n#\tendif//!GLM_HAS_DEFAULTED_FUNCTIONS\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator=(tdualquat<U, Q> const& q)\n\t{\n\t\tthis->real = q.real;\n\t\tthis->dual = q.dual;\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator*=(U s)\n\t{\n\t\tthis->real *= static_cast<T>(s);\n\t\tthis->dual *= static_cast<T>(s);\n\t\treturn *this;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\ttemplate<typename U>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator/=(U s)\n\t{\n\t\tthis->real /= static_cast<T>(s);\n\t\tthis->dual /= static_cast<T>(s);\n\t\treturn *this;\n\t}\n\n\t// -- Unary bit operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> operator+(tdualquat<T, Q> const& q)\n\t{\n\t\treturn q;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> operator-(tdualquat<T, Q> const& q)\n\t{\n\t\treturn tdualquat<T, Q>(-q.real, -q.dual);\n\t}\n\n\t// -- Binary operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> operator+(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p)\n\t{\n\t\treturn tdualquat<T, Q>(q.real + p.real,q.dual + p.dual);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(tdualquat<T, Q> const& p, tdualquat<T, Q> const& o)\n\t{\n\t\treturn tdualquat<T, Q>(p.real * o.real,p.real * o.dual + p.dual * o.real);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(tdualquat<T, Q> const& q, vec<3, T, Q> const& v)\n\t{\n\t\tvec<3, T, Q> const real_v3(q.real.x,q.real.y,q.real.z);\n\t\tvec<3, T, Q> const dual_v3(q.dual.x,q.dual.y,q.dual.z);\n\t\treturn (cross(real_v3, cross(real_v3,v) + v * q.real.w + dual_v3) + dual_v3 * q.real.w - real_v3 * q.dual.w) * T(2) + v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v,\ttdualquat<T, Q> const& q)\n\t{\n\t\treturn glm::inverse(q) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(tdualquat<T, Q> const& q, vec<4, T, Q> const& v)\n\t{\n\t\treturn vec<4, T, Q>(q * vec<3, T, Q>(v), v.w);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v,\ttdualquat<T, Q> const& q)\n\t{\n\t\treturn glm::inverse(q) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, T const& s)\n\t{\n\t\treturn tdualquat<T, Q>(q.real * s, q.dual * s);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(T const& s, tdualquat<T, Q> const& q)\n\t{\n\t\treturn q * s;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> operator/(tdualquat<T, Q> const& q,\tT const& s)\n\t{\n\t\treturn tdualquat<T, Q>(q.real / s, q.dual / s);\n\t}\n\n\t// -- Boolean operators --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator==(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2)\n\t{\n\t\treturn (q1.real == q2.real) && (q1.dual == q2.dual);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool operator!=(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2)\n\t{\n\t\treturn (q1.real != q2.real) || (q1.dual != q2.dual);\n\t}\n\n\t// -- Operations --\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> dual_quat_identity()\n\t{\n\t\treturn tdualquat<T, Q>(\n\t\t\ttquat<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)),\n\t\t\ttquat<T, Q>(static_cast<T>(0), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> normalize(tdualquat<T, Q> const& q)\n\t{\n\t\treturn q / length(q.real);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> lerp(tdualquat<T, Q> const& x, tdualquat<T, Q> const& y, T const& a)\n\t{\n\t\t// Dual Quaternion Linear blend aka DLB:\n\t\t// Lerp is only defined in [0, 1]\n\t\tassert(a >= static_cast<T>(0));\n\t\tassert(a <= static_cast<T>(1));\n\t\tT const k = dot(x.real,y.real) < static_cast<T>(0) ? -a : a;\n\t\tT const one(1);\n\t\treturn tdualquat<T, Q>(x * (one - a) + y * k);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> inverse(tdualquat<T, Q> const& q)\n\t{\n\t\tconst glm::tquat<T, Q> real = conjugate(q.real);\n\t\tconst glm::tquat<T, Q> dual = conjugate(q.dual);\n\t\treturn tdualquat<T, Q>(real, dual + (real * (-2.0f * dot(real,dual))));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat2x4_cast(tdualquat<T, Q> const& x)\n\t{\n\t\treturn mat<2, 4, T, Q>( x[0].x, x[0].y, x[0].z, x[0].w, x[1].x, x[1].y, x[1].z, x[1].w );\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat3x4_cast(tdualquat<T, Q> const& x)\n\t{\n\t\ttquat<T, Q> r = x.real / length2(x.real);\n\t\t\n\t\ttquat<T, Q> const rr(r.w * x.real.w, r.x * x.real.x, r.y * x.real.y, r.z * x.real.z);\n\t\tr *= static_cast<T>(2);\n\t\t\n\t\tT const xy = r.x * x.real.y;\n\t\tT const xz = r.x * x.real.z;\n\t\tT const yz = r.y * x.real.z;\n\t\tT const wx = r.w * x.real.x;\n\t\tT const wy = r.w * x.real.y;\n\t\tT const wz = r.w * x.real.z;\n\t\t\n\t\tvec<4, T, Q> const a(\n\t\t\trr.w + rr.x - rr.y - rr.z,\n\t\t\txy - wz,\n\t\t\txz + wy,\n\t\t\t-(x.dual.w * r.x - x.dual.x * r.w + x.dual.y * r.z - x.dual.z * r.y));\n\t\t\n\t\tvec<4, T, Q> const b(\n\t\t\txy + wz,\n\t\t\trr.w + rr.y - rr.x - rr.z,\n\t\t\tyz - wx,\n\t\t\t-(x.dual.w * r.y - x.dual.x * r.z - x.dual.y * r.w + x.dual.z * r.x));\n\t\t\n\t\tvec<4, T, Q> const c(\n\t\t\txz - wy,\n\t\t\tyz + wx,\n\t\t\trr.w + rr.z - rr.x - rr.y,\n\t\t\t-(x.dual.w * r.z + x.dual.x * r.y - x.dual.y * r.x - x.dual.z * r.w));\n\t\t\n\t\treturn mat<3, 4, T, Q>(a, b, c);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> dualquat_cast(mat<2, 4, T, Q> const& x)\n\t{\n\t\treturn tdualquat<T, Q>(\n\t\t\ttquat<T, Q>( x[0].w, x[0].x, x[0].y, x[0].z ),\n\t\t\ttquat<T, Q>( x[1].w, x[1].x, x[1].y, x[1].z ));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tdualquat<T, Q> dualquat_cast(mat<3, 4, T, Q> const& x)\n\t{\n\t\ttquat<T, Q> real;\n\t\t\n\t\tT const trace = x[0].x + x[1].y + x[2].z;\n\t\tif(trace > static_cast<T>(0))\n\t\t{\n\t\t\tT const r = sqrt(T(1) + trace);\n\t\t\tT const invr = static_cast<T>(0.5) / r;\n\t\t\treal.w = static_cast<T>(0.5) * r;\n\t\t\treal.x = (x[2].y - x[1].z) * invr;\n\t\t\treal.y = (x[0].z - x[2].x) * invr;\n\t\t\treal.z = (x[1].x - x[0].y) * invr;\n\t\t}\n\t\telse if(x[0].x > x[1].y && x[0].x > x[2].z)\n\t\t{\n\t\t\tT const r = sqrt(T(1) + x[0].x - x[1].y - x[2].z);\n\t\t\tT const invr = static_cast<T>(0.5) / r;\n\t\t\treal.x = static_cast<T>(0.5)*r;\n\t\t\treal.y = (x[1].x + x[0].y) * invr;\n\t\t\treal.z = (x[0].z + x[2].x) * invr;\n\t\t\treal.w = (x[2].y - x[1].z) * invr;\n\t\t}\n\t\telse if(x[1].y > x[2].z)\n\t\t{\n\t\t\tT const r = sqrt(T(1) + x[1].y - x[0].x - x[2].z);\n\t\t\tT const invr = static_cast<T>(0.5) / r;\n\t\t\treal.x = (x[1].x + x[0].y) * invr;\n\t\t\treal.y = static_cast<T>(0.5) * r;\n\t\t\treal.z = (x[2].y + x[1].z) * invr;\n\t\t\treal.w = (x[0].z - x[2].x) * invr;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tT const r = sqrt(T(1) + x[2].z - x[0].x - x[1].y);\n\t\t\tT const invr = static_cast<T>(0.5) / r;\n\t\t\treal.x = (x[0].z + x[2].x) * invr;\n\t\t\treal.y = (x[2].y + x[1].z) * invr;\n\t\t\treal.z = static_cast<T>(0.5) * r;\n\t\t\treal.w = (x[1].x - x[0].y) * invr;\n\t\t}\n\t\t\n\t\ttquat<T, Q> dual;\n\t\tdual.x =  static_cast<T>(0.5) * ( x[0].w * real.w + x[1].w * real.z - x[2].w * real.y);\n\t\tdual.y =  static_cast<T>(0.5) * (-x[0].w * real.z + x[1].w * real.w + x[2].w * real.x);\n\t\tdual.z =  static_cast<T>(0.5) * ( x[0].w * real.y - x[1].w * real.x + x[2].w * real.w);\n\t\tdual.w = -static_cast<T>(0.5) * ( x[0].w * real.x + x[1].w * real.y + x[2].w * real.z);\n\t\treturn tdualquat<T, Q>(real, dual);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/euler_angles.hpp",
    "content": "/// @ref gtx_euler_angles\n/// @file glm/gtx/euler_angles.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_euler_angles GLM_GTX_euler_angles\n/// @ingroup gtx\n///\n/// Include <glm/gtx/euler_angles.hpp> to use the features of this extension.\n///\n/// Build matrices from Euler angles.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_euler_angles is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_euler_angles extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_euler_angles\n\t/// @{\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X.\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleX(\n\t\tT const& angleX);\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y.\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleY(\n\t\tT const& angleY);\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z.\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZ(\n\t\tT const& angleZ);\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXY(\n\t\tT const& angleX,\n\t\tT const& angleY);\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYX(\n\t\tT const& angleY,\n\t\tT const& angleX);\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZ(\n\t\tT const& angleX,\n\t\tT const& angleZ);\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZX(\n\t\tT const& angle,\n\t\tT const& angleX);\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZ(\n\t\tT const& angleY,\n\t\tT const& angleZ);\n\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZY(\n\t\tT const& angleZ,\n\t\tT const& angleY);\n\n    /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z).\n    /// @see gtx_euler_angles\n    template<typename T>\n    GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXYZ(\n        T const& t1,\n        T const& t2,\n        T const& t3);\n    \n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXZ(\n\t\tT const& yaw,\n\t\tT const& pitch,\n\t\tT const& roll);\n    \n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<4, 4, T, defaultp> yawPitchRoll(\n\t\tT const& yaw,\n\t\tT const& pitch,\n\t\tT const& roll);\n\n\t/// Creates a 2D 2 * 2 rotation matrix from an euler angle.\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<2, 2, T, defaultp> orientate2(T const& angle);\n\n\t/// Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle.\n\t/// @see gtx_euler_angles\n\ttemplate<typename T>\n\tGLM_FUNC_DECL mat<3, 3, T, defaultp> orientate3(T const& angle);\n\n\t/// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z). \n\t/// @see gtx_euler_angles\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> orientate3(vec<3, T, Q> const& angles);\n\t\t\n\t/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).\n\t/// @see gtx_euler_angles\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> orientate4(vec<3, T, Q> const& angles);\n\n    /// Extracts the (X * Y * Z) Euler angles from the rotation matrix M\n    /// @see gtx_euler_angles\n    template<typename T>\n    GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M,\n                                            T & t1,\n                                            T & t2,\n                                            T & t3);\n    \n\t/// @}\n}//namespace glm\n\n#include \"euler_angles.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/euler_angles.inl",
    "content": "/// @ref gtx_euler_angles\n/// @file glm/gtx/euler_angles.inl\n\n#include \"compatibility.hpp\" // glm::atan2\n\nnamespace glm\n{\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleX\n\t(\n\t\tT const& angleX\n\t)\n\t{\n\t\tT cosX = glm::cos(angleX);\n\t\tT sinX = glm::sin(angleX);\n\t\n\t\treturn mat<4, 4, T, defaultp>(\n\t\t\tT(1), T(0), T(0), T(0),\n\t\t\tT(0), cosX, sinX, T(0),\n\t\t\tT(0),-sinX, cosX, T(0),\n\t\t\tT(0), T(0), T(0), T(1));\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleY\n\t(\n\t\tT const& angleY\n\t)\n\t{\n\t\tT cosY = glm::cos(angleY);\n\t\tT sinY = glm::sin(angleY);\n\n\t\treturn mat<4, 4, T, defaultp>(\n\t\t\tcosY,\tT(0),\t-sinY,\tT(0),\n\t\t\tT(0),\tT(1),\tT(0),\tT(0),\n\t\t\tsinY,\tT(0),\tcosY,\tT(0),\n\t\t\tT(0),\tT(0),\tT(0),\tT(1));\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZ\n\t(\n\t\tT const& angleZ\n\t)\n\t{\n\t\tT cosZ = glm::cos(angleZ);\n\t\tT sinZ = glm::sin(angleZ);\n\n\t\treturn mat<4, 4, T, defaultp>(\n\t\t\tcosZ,\tsinZ,\tT(0), T(0),\n\t\t\t-sinZ,\tcosZ,\tT(0), T(0),\n\t\t\tT(0),\tT(0),\tT(1), T(0),\n\t\t\tT(0),\tT(0),\tT(0), T(1));\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXY\n\t(\n\t\tT const& angleX,\n\t\tT const& angleY\n\t)\n\t{\n\t\tT cosX = glm::cos(angleX);\n\t\tT sinX = glm::sin(angleX);\n\t\tT cosY = glm::cos(angleY);\n\t\tT sinY = glm::sin(angleY);\n\n\t\treturn mat<4, 4, T, defaultp>(\n\t\t\tcosY,   -sinX * -sinY,  cosX * -sinY,   T(0),\n\t\t\tT(0),   cosX,           sinX,           T(0),\n\t\t\tsinY,   -sinX * cosY,   cosX * cosY,    T(0),\n\t\t\tT(0),   T(0),           T(0),           T(1));\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYX\n\t(\n\t\tT const& angleY,\n\t\tT const& angleX\n\t)\n\t{\n\t\tT cosX = glm::cos(angleX);\n\t\tT sinX = glm::sin(angleX);\n\t\tT cosY = glm::cos(angleY);\n\t\tT sinY = glm::sin(angleY);\n\n\t\treturn mat<4, 4, T, defaultp>(\n\t\t\tcosY,          0,      -sinY,    T(0),\n\t\t\tsinY * sinX,  cosX, cosY * sinX, T(0),\n\t\t\tsinY * cosX, -sinX, cosY * cosX, T(0),\n\t\t\tT(0),         T(0),     T(0),    T(1));\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZ\n\t(\n\t\tT const& angleX,\n\t\tT const& angleZ\n\t)\n\t{\n\t\treturn eulerAngleX(angleX) * eulerAngleZ(angleZ);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZX\n\t(\n\t\tT const& angleZ,\n\t\tT const& angleX\n\t)\n\t{\n\t\treturn eulerAngleZ(angleZ) * eulerAngleX(angleX);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZ\n\t(\n\t\tT const& angleY,\n\t\tT const& angleZ\n\t)\n\t{\n\t\treturn eulerAngleY(angleY) * eulerAngleZ(angleZ);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZY\n\t(\n\t\tT const& angleZ,\n\t\tT const& angleY\n\t)\n\t{\n\t\treturn eulerAngleZ(angleZ) * eulerAngleY(angleY);\n\t}\n    \n    template<typename T>\n    GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXYZ\n    (\n     T const& t1,\n     T const& t2,\n     T const& t3\n     )\n    {\n        T c1 = glm::cos(-t1);\n        T c2 = glm::cos(-t2);\n        T c3 = glm::cos(-t3);\n        T s1 = glm::sin(-t1);\n        T s2 = glm::sin(-t2);\n        T s3 = glm::sin(-t3);\n        \n        mat<4, 4, T, defaultp> Result;\n        Result[0][0] = c2 * c3;\n        Result[0][1] =-c1 * s3 + s1 * s2 * c3;\n        Result[0][2] = s1 * s3 + c1 * s2 * c3;\n        Result[0][3] = static_cast<T>(0);\n        Result[1][0] = c2 * s3;\n        Result[1][1] = c1 * c3 + s1 * s2 * s3;\n        Result[1][2] =-s1 * c3 + c1 * s2 * s3;\n        Result[1][3] = static_cast<T>(0);\n        Result[2][0] =-s2;\n        Result[2][1] = s1 * c2;\n        Result[2][2] = c1 * c2;\n        Result[2][3] = static_cast<T>(0);\n        Result[3][0] = static_cast<T>(0);\n        Result[3][1] = static_cast<T>(0);\n        Result[3][2] = static_cast<T>(0);\n        Result[3][3] = static_cast<T>(1);\n        return Result;\n    }\n    \n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYXZ\n\t(\n\t\tT const& yaw,\n\t\tT const& pitch,\n\t\tT const& roll\n\t)\n\t{\n\t\tT tmp_ch = glm::cos(yaw);\n\t\tT tmp_sh = glm::sin(yaw);\n\t\tT tmp_cp = glm::cos(pitch);\n\t\tT tmp_sp = glm::sin(pitch);\n\t\tT tmp_cb = glm::cos(roll);\n\t\tT tmp_sb = glm::sin(roll);\n\n\t\tmat<4, 4, T, defaultp> Result;\n\t\tResult[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb;\n\t\tResult[0][1] = tmp_sb * tmp_cp;\n\t\tResult[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb;\n\t\tResult[0][3] = static_cast<T>(0);\n\t\tResult[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb;\n\t\tResult[1][1] = tmp_cb * tmp_cp;\n\t\tResult[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb;\n\t\tResult[1][3] = static_cast<T>(0);\n\t\tResult[2][0] = tmp_sh * tmp_cp;\n\t\tResult[2][1] = -tmp_sp;\n\t\tResult[2][2] = tmp_ch * tmp_cp;\n\t\tResult[2][3] = static_cast<T>(0);\n\t\tResult[3][0] = static_cast<T>(0);\n\t\tResult[3][1] = static_cast<T>(0);\n\t\tResult[3][2] = static_cast<T>(0);\n\t\tResult[3][3] = static_cast<T>(1);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> yawPitchRoll\n\t(\n\t\tT const& yaw,\n\t\tT const& pitch,\n\t\tT const& roll\n\t)\n\t{\n\t\tT tmp_ch = glm::cos(yaw);\n\t\tT tmp_sh = glm::sin(yaw);\n\t\tT tmp_cp = glm::cos(pitch);\n\t\tT tmp_sp = glm::sin(pitch);\n\t\tT tmp_cb = glm::cos(roll);\n\t\tT tmp_sb = glm::sin(roll);\n\n\t\tmat<4, 4, T, defaultp> Result;\n\t\tResult[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb;\n\t\tResult[0][1] = tmp_sb * tmp_cp;\n\t\tResult[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb;\n\t\tResult[0][3] = static_cast<T>(0);\n\t\tResult[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb;\n\t\tResult[1][1] = tmp_cb * tmp_cp;\n\t\tResult[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb;\n\t\tResult[1][3] = static_cast<T>(0);\n\t\tResult[2][0] = tmp_sh * tmp_cp;\n\t\tResult[2][1] = -tmp_sp;\n\t\tResult[2][2] = tmp_ch * tmp_cp;\n\t\tResult[2][3] = static_cast<T>(0);\n\t\tResult[3][0] = static_cast<T>(0);\n\t\tResult[3][1] = static_cast<T>(0);\n\t\tResult[3][2] = static_cast<T>(0);\n\t\tResult[3][3] = static_cast<T>(1);\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> orientate2\n\t(\n\t\tT const& angle\n\t)\n\t{\n\t\tT c = glm::cos(angle);\n\t\tT s = glm::sin(angle);\n\n\t\tmat<2, 2, T, defaultp> Result;\n\t\tResult[0][0] = c;\n\t\tResult[0][1] = s;\n\t\tResult[1][0] = -s;\n\t\tResult[1][1] = c;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> orientate3\n\t(\n\t\tT const& angle\n\t)\n\t{\n\t\tT c = glm::cos(angle);\n\t\tT s = glm::sin(angle);\n\n\t\tmat<3, 3, T, defaultp> Result;\n\t\tResult[0][0] = c;\n\t\tResult[0][1] = s;\n\t\tResult[0][2] = 0.0f;\n\t\tResult[1][0] = -s;\n\t\tResult[1][1] = c;\n\t\tResult[1][2] = 0.0f;\n\t\tResult[2][0] = 0.0f;\n\t\tResult[2][1] = 0.0f;\n\t\tResult[2][2] = 1.0f;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> orientate3\n\t(\n\t\tvec<3, T, Q> const& angles\n\t)\n\t{\n\t\treturn mat<3, 3, T, Q>(yawPitchRoll(angles.z, angles.x, angles.y));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientate4\n\t(\n\t\tvec<3, T, Q> const& angles\n\t)\n\t{\n\t\treturn yawPitchRoll(angles.z, angles.x, angles.y);\n\t}\n    \n    template<typename T>\n    GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M,\n                                            T & t1,\n                                            T & t2,\n                                            T & t3)\n    {\n        float T1 = glm::atan2<T, defaultp>(M[2][1], M[2][2]);\n        float C2 = glm::sqrt(M[0][0]*M[0][0] + M[1][0]*M[1][0]);\n        float T2 = glm::atan2<T, defaultp>(-M[2][0], C2);\n        float S1 = glm::sin(T1);\n        float C1 = glm::cos(T1);\n        float T3 = glm::atan2<T, defaultp>(S1*M[0][2] - C1*M[0][1], C1*M[1][1] - S1*M[1][2  ]);\n        t1 = -T1;\n        t2 = -T2;\n        t3 = -T3;\n    }\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/extend.hpp",
    "content": "/// @ref gtx_extend\n/// @file glm/gtx/extend.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_extend GLM_GTX_extend\n/// @ingroup gtx\n///\n/// Include <glm/gtx/extend.hpp> to use the features of this extension.\n///\n/// Extend a position from a source to a position at a defined length.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_extend extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_extend\n\t/// @{\n\n\t/// Extends of Length the Origin position using the (Source - Origin) direction.\n\t/// @see gtx_extend\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType extend(\n\t\tgenType const& Origin, \n\t\tgenType const& Source, \n\t\ttypename genType::value_type const Length);\n\n\t/// @}\n}//namespace glm\n\n#include \"extend.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/extend.inl",
    "content": "/// @ref gtx_extend\n/// @file glm/gtx/extend.inl\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType extend\n\t(\n\t\tgenType const& Origin, \n\t\tgenType const& Source, \n\t\tgenType const& Distance\n\t)\n\t{\n\t\treturn Origin + (Source - Origin) * Distance;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> extend\n\t(\n\t\tvec<2, T, Q> const& Origin,\n\t\tvec<2, T, Q> const& Source,\n\t\tT const& Distance\n\t)\n\t{\n\t\treturn Origin + (Source - Origin) * Distance;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> extend\n\t(\n\t\tvec<3, T, Q> const& Origin,\n\t\tvec<3, T, Q> const& Source,\n\t\tT const& Distance\n\t)\n\t{\n\t\treturn Origin + (Source - Origin) * Distance;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> extend\n\t(\n\t\tvec<4, T, Q> const& Origin,\n\t\tvec<4, T, Q> const& Source,\n\t\tT const& Distance\n\t)\n\t{\n\t\treturn Origin + (Source - Origin) * Distance;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/extended_min_max.hpp",
    "content": "/// @ref gtx_extended_min_max\n/// @file glm/gtx/extended_min_max.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_extended_min_max GLM_GTX_extented_min_max\n/// @ingroup gtx\n///\n/// Include <glm/gtx/extented_min_max.hpp> to use the features of this extension.\n///\n/// Min and max functions for 3 to 4 parameters.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_extented_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_extented_min_max extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_extended_min_max\n\t/// @{\n\n\t/// Return the minimum component-wise values of 3 inputs \n\t/// @see gtx_extented_min_max\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T min(\n\t\tT const& x, \n\t\tT const& y, \n\t\tT const& z);\n\n\t/// Return the minimum component-wise values of 3 inputs\n\t/// @see gtx_extented_min_max\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_DECL C<T> min(\n\t\tC<T> const& x, \n\t\ttypename C<T>::T const& y, \n\t\ttypename C<T>::T const& z);\n\n\t/// Return the minimum component-wise values of 3 inputs \n\t/// @see gtx_extented_min_max\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_DECL C<T> min(\n\t\tC<T> const& x, \n\t\tC<T> const& y, \n\t\tC<T> const& z);\n\n\t/// Return the minimum component-wise values of 4 inputs \n\t/// @see gtx_extented_min_max\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T min(\n\t\tT const& x, \n\t\tT const& y, \n\t\tT const& z, \n\t\tT const& w);\n\n\t/// Return the minimum component-wise values of 4 inputs \n\t/// @see gtx_extented_min_max\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_DECL C<T> min(\n\t\tC<T> const& x, \n\t\ttypename C<T>::T const& y, \n\t\ttypename C<T>::T const& z, \n\t\ttypename C<T>::T const& w);\n\n\t/// Return the minimum component-wise values of 4 inputs\n\t/// @see gtx_extented_min_max\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_DECL C<T> min(\n\t\tC<T> const& x, \n\t\tC<T> const& y, \n\t\tC<T> const& z,\n\t\tC<T> const& w);\n\n\t/// Return the maximum component-wise values of 3 inputs \n\t/// @see gtx_extented_min_max\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T max(\n\t\tT const& x, \n\t\tT const& y, \n\t\tT const& z);\n\n\t/// Return the maximum component-wise values of 3 inputs\n\t/// @see gtx_extented_min_max\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_DECL C<T> max(\n\t\tC<T> const& x, \n\t\ttypename C<T>::T const& y, \n\t\ttypename C<T>::T const& z);\n\n\t/// Return the maximum component-wise values of 3 inputs \n\t/// @see gtx_extented_min_max\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_DECL C<T> max(\n\t\tC<T> const& x, \n\t\tC<T> const& y, \n\t\tC<T> const& z);\n\n\t/// Return the maximum component-wise values of 4 inputs\n\t/// @see gtx_extented_min_max\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T max(\n\t\tT const& x, \n\t\tT const& y, \n\t\tT const& z, \n\t\tT const& w);\n\n\t/// Return the maximum component-wise values of 4 inputs \n\t/// @see gtx_extented_min_max\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_DECL C<T> max(\n\t\tC<T> const& x, \n\t\ttypename C<T>::T const& y, \n\t\ttypename C<T>::T const& z, \n\t\ttypename C<T>::T const& w);\n\n\t/// Return the maximum component-wise values of 4 inputs \n\t/// @see gtx_extented_min_max\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_DECL C<T> max(\n\t\tC<T> const& x, \n\t\tC<T> const& y, \n\t\tC<T> const& z, \n\t\tC<T> const& w);\n\n\t/// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t///\n\t/// @tparam genType Floating-point or integer; scalar or vector types.\n\t/// \n\t/// @see gtx_extented_min_max\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType fmin(genType x, genType y);\n\n\t/// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtx_extented_min_max\n\t/// @see <a href=\"http://en.cppreference.com/w/cpp/numeric/math/fmin\">std::fmin documentation</a>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fmin(vec<L, T, Q> const& x, T y);\n\n\t/// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtx_extented_min_max\n\t/// @see <a href=\"http://en.cppreference.com/w/cpp/numeric/math/fmin\">std::fmin documentation</a>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fmin(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t/// \n\t/// @tparam genType Floating-point; scalar or vector types.\n\t/// \n\t/// @see gtx_extented_min_max\n\t/// @see <a href=\"http://en.cppreference.com/w/cpp/numeric/math/fmax\">std::fmax documentation</a>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType fmax(genType x, genType y);\n\n\t/// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see gtx_extented_min_max\n\t/// @see <a href=\"http://en.cppreference.com/w/cpp/numeric/math/fmax\">std::fmax documentation</a>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fmax(vec<L, T, Q> const& x, T y);\n\n\t/// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t/// \n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see gtx_extented_min_max\n\t/// @see <a href=\"http://en.cppreference.com/w/cpp/numeric/math/fmax\">std::fmax documentation</a>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fmax(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t///\n\t/// @tparam genType Floating-point scalar or vector types.\n\t///\n\t/// @see gtx_extented_min_max\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType fclamp(genType x, genType minVal, genType maxVal);\n\n\t/// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtx_extented_min_max\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fclamp(vec<L, T, Q> const& x, T minVal, T maxVal);\n\n\t/// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see gtx_extented_min_max\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fclamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal);\n\n\n\t/// @}\n}//namespace glm\n\n#include \"extended_min_max.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/extended_min_max.inl",
    "content": "/// @ref gtx_extended_min_max\n/// @file glm/gtx/extended_min_max.inl\n\nnamespace glm\n{\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T min(\n\t\tT const& x, \n\t\tT const& y, \n\t\tT const& z)\n\t{\n\t\treturn glm::min(glm::min(x, y), z);\n\t}\n\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_QUALIFIER C<T> min\n\t(\n\t\tC<T> const& x, \n\t\ttypename C<T>::T const& y, \n\t\ttypename C<T>::T const& z\n\t)\n\t{\n\t\treturn glm::min(glm::min(x, y), z);\n\t}\n\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_QUALIFIER C<T> min\n\t(\n\t\tC<T> const& x, \n\t\tC<T> const& y, \n\t\tC<T> const& z\n\t)\n\t{\n\t\treturn glm::min(glm::min(x, y), z);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T min\n\t(\n\t\tT const& x, \n\t\tT const& y, \n\t\tT const& z, \n\t\tT const& w\n\t)\n\t{\n\t\treturn glm::min(glm::min(x, y), glm::min(z, w));\n\t}\n\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_QUALIFIER C<T> min\n\t(\n\t\tC<T> const& x, \n\t\ttypename C<T>::T const& y, \n\t\ttypename C<T>::T const& z, \n\t\ttypename C<T>::T const& w\n\t)\n\t{\n\t\treturn glm::min(glm::min(x, y), glm::min(z, w));\n\t}\n\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_QUALIFIER C<T> min\n\t(\n\t\tC<T> const& x, \n\t\tC<T> const& y, \n\t\tC<T> const& z, \n\t\tC<T> const& w\n\t)\n\t{\n\t\treturn glm::min(glm::min(x, y), glm::min(z, w));\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T max(\n\t\tT const& x, \n\t\tT const& y, \n\t\tT const& z)\n\t{\n\t\treturn glm::max(glm::max(x, y), z);\n\t}\n\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_QUALIFIER C<T> max\n\t(\n\t\tC<T> const& x, \n\t\ttypename C<T>::T const& y, \n\t\ttypename C<T>::T const& z\n\t)\n\t{\n\t\treturn glm::max(glm::max(x, y), z);\n\t}\n\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_QUALIFIER C<T> max\n\t(\n\t\tC<T> const& x, \n\t\tC<T> const& y, \n\t\tC<T> const& z\n\t)\n\t{\n\t\treturn glm::max(glm::max(x, y), z);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T max\n\t(\n\t\tT const& x, \n\t\tT const& y, \n\t\tT const& z, \n\t\tT const& w\n\t)\n\t{\n\t\treturn glm::max(glm::max(x, y), glm::max(z, w));\n\t}\n\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_QUALIFIER C<T> max\n\t(\n\t\tC<T> const& x, \n\t\ttypename C<T>::T const& y, \n\t\ttypename C<T>::T const& z, \n\t\ttypename C<T>::T const& w\n\t)\n\t{\n\t\treturn glm::max(glm::max(x, y), glm::max(z, w));\n\t}\n\n\ttemplate<typename T, template<typename> class C>\n\tGLM_FUNC_QUALIFIER C<T> max\n\t(\n\t\tC<T> const& x, \n\t\tC<T> const& y, \n\t\tC<T> const& z, \n\t\tC<T> const& w\n\t)\n\t{\n\t\treturn glm::max(glm::max(x, y), glm::max(z, w));\n\t}\n\n\t// fmin\n#\tif GLM_HAS_CXX11_STL\n\t\tusing std::fmin;\n#\telse\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER genType fmin(genType x, genType y)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'fmin' only accept floating-point input\");\n\n\t\t\tif (isnan(x))\n\t\t\t\treturn y;\n\t\t\tif (isnan(y))\n\t\t\t\treturn x;\n\n\t\t\treturn min(x, y);\n\t\t}\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fmin(vec<L, T, Q> const& a, T b)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(fmin, a, vec<L, T, Q>(b));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fmin(vec<L, T, Q> const& a, vec<L, T, Q> const& b)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(fmin, a, b);\n\t}\n\n\t// fmax\n#\tif GLM_HAS_CXX11_STL\n\t\tusing std::fmax;\n#\telse\n\t\ttemplate<typename genType>\n\t\tGLM_FUNC_QUALIFIER genType fmax(genType x, genType y)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'fmax' only accept floating-point input\");\n\n\t\t\tif (isnan(x))\n\t\t\t\treturn y;\n\t\t\tif (isnan(y))\n\t\t\t\treturn x;\n\n\t\t\treturn max(x, y);\n\t\t}\n#\tendif\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fmax(vec<L, T, Q> const& a, T b)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(fmax, a, vec<L, T, Q>(b));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fmax(vec<L, T, Q> const& a, vec<L, T, Q> const& b)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(fmax, a, b);\n\t}\n\n\t// fclamp\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fclamp(genType x, genType minVal, genType maxVal)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'fclamp' only accept floating-point or integer inputs\");\n\t\treturn fmin(fmax(x, minVal), maxVal);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fclamp(vec<L, T, Q> const& x, T minVal, T maxVal)\n\t{\n\t\treturn fmin(fmax(x, vec<L, T, Q>(minVal)), vec<L, T, Q>(maxVal));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fclamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal)\n\t{\n\t\treturn fmin(fmax(x, minVal), maxVal);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/exterior_product.hpp",
    "content": "/// @ref gtx_exterior_product\n/// @file glm/gtx/exterior_product.hpp\n///\n/// @see core (dependence)\n/// @see gtx_exterior_product (dependence)\n///\n/// @defgroup gtx_exterior_product GLM_GTX_exterior_product\n/// @ingroup gtx\n///\n/// Include <glm/gtx/exterior_product.hpp> to use the features of this extension.\n/// \n/// @brief Allow to perform bit operations on integer values\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_exterior_product extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_exterior_product\n\t/// @{\n\n\t/// Returns the cross product of x and y.\n\t///\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"https://en.wikipedia.org/wiki/Exterior_algebra#Cross_and_triple_products\">Exterior product</a>\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T cross(vec<2, T, Q> const& v, vec<2, T, Q> const& u);\n\n\t/// @}\n} //namespace glm\n\n#include \"exterior_product.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/exterior_product.inl",
    "content": "/// @ref core\n/// @file glm/detail/func_geometric.inl\n\n#include <limits>\n\nnamespace glm {\nnamespace detail\n{\n\ttemplate<typename T, qualifier Q, bool Aligned>\n\tstruct compute_cross_vec2\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& v, vec<2, T, Q> const& u)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'cross' accepts only floating-point inputs\");\n\n\t\t\treturn v.x * u.y - u.x * v.y;\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T cross(vec<2, T, Q> const& x, vec<2, T, Q> const& y)\n\t{\n\t\treturn detail::compute_cross_vec2<T, Q, detail::is_aligned<Q>::value>::call(x, y);\n\t}\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/gtx/fast_exponential.hpp",
    "content": "/// @ref gtx_fast_exponential\n/// @file glm/gtx/fast_exponential.hpp\n///\n/// @see core (dependence)\n/// @see gtx_half_float (dependence)\n///\n/// @defgroup gtx_fast_exponential GLM_GTX_fast_exponential\n/// @ingroup gtx\n///\n/// Include <glm/gtx/fast_exponential.hpp> to use the features of this extension.\n///\n/// Fast but less accurate implementations of exponential based functions.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_fast_exponential is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_fast_exponential extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_fast_exponential\n\t/// @{\n\n\t/// Faster than the common pow function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType fastPow(genType x, genType y);\n\n\t/// Faster than the common pow function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Faster than the common pow function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<typename genTypeT, typename genTypeU>\n\tGLM_FUNC_DECL genTypeT fastPow(genTypeT x, genTypeU y);\n\n\t/// Faster than the common pow function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fastPow(vec<L, T, Q> const& x);\n\n\t/// Faster than the common exp function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T fastExp(T x);\n\n\t/// Faster than the common exp function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fastExp(vec<L, T, Q> const& x);\n\n\t/// Faster than the common log function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T fastLog(T x);\n\n\t/// Faster than the common exp2 function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fastLog(vec<L, T, Q> const& x);\n\n\t/// Faster than the common exp2 function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T fastExp2(T x);\n\n\t/// Faster than the common exp2 function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fastExp2(vec<L, T, Q> const& x);\n\n\t/// Faster than the common log2 function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T fastLog2(T x);\n\n\t/// Faster than the common log2 function but less accurate.\n\t/// @see gtx_fast_exponential\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fastLog2(vec<L, T, Q> const& x);\n\n\t/// @}\n}//namespace glm\n\n#include \"fast_exponential.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/fast_exponential.inl",
    "content": "/// @ref gtx_fast_exponential\n/// @file glm/gtx/fast_exponential.inl\n\nnamespace glm\n{\n\t// fastPow:\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastPow(genType x, genType y)\n\t{\n\t\treturn exp(y * log(x));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\treturn exp(y * log(x));\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T fastPow(T x, int y)\n\t{\n\t\tT f = static_cast<T>(1);\n\t\tfor(int i = 0; i < y; ++i)\n\t\t\tf *= x;\n\t\treturn f;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, int, Q> const& y)\n\t{\n\t\tvec<L, T, Q> Result;\n\t\tfor(length_t i = 0, n = x.length(); i < n; ++i)\n\t\t\tResult[i] = fastPow(x[i], y[i]);\n\t\treturn Result;\n\t}\n\n\t// fastExp\n\t// Note: This function provides accurate results only for value between -1 and 1, else avoid it.\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T fastExp(T x)\n\t{\n\t\t// This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower.\n\t\t// return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f))));\n\t\tT x2 = x * x;\n\t\tT x3 = x2 * x;\n\t\tT x4 = x3 * x;\n\t\tT x5 = x4 * x;\n\t\treturn T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) + (x4 * T(0.041666667)) + (x5 * T(0.008333333333));\n\t}\n\t/*  // Try to handle all values of float... but often shower than std::exp, glm::floor and the loop kill the performance\n\tGLM_FUNC_QUALIFIER float fastExp(float x)\n\t{\n\t\tconst float e = 2.718281828f;\n\t\tconst float IntegerPart = floor(x);\n\t\tconst float FloatPart = x - IntegerPart;\n\t\tfloat z = 1.f;\n\n\t\tfor(int i = 0; i < int(IntegerPart); ++i)\n\t\t\tz *= e;\n\n\t\tconst float x2 = FloatPart * FloatPart;\n\t\tconst float x3 = x2 * FloatPart;\n\t\tconst float x4 = x3 * FloatPart;\n\t\tconst float x5 = x4 * FloatPart;\n\t\treturn z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f));\n\t}\n\n\t// Increase accuracy on number bigger that 1 and smaller than -1 but it's not enough for high and negative numbers\n\tGLM_FUNC_QUALIFIER float fastExp(float x)\n\t{\n\t\t// This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower.\n\t\t// return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f))));\n\t\tfloat x2 = x * x;\n\t\tfloat x3 = x2 * x;\n\t\tfloat x4 = x3 * x;\n\t\tfloat x5 = x4 * x;\n\t\tfloat x6 = x5 * x;\n\t\tfloat x7 = x6 * x;\n\t\tfloat x8 = x7 * x;\n\t\treturn 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 * 0.000198412698f) + (x8 * 0.0000248015873f);;\n\t}\n\t*/\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastExp(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastExp, x);\n\t}\n\n\t// fastLog\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastLog(genType x)\n\t{\n\t\treturn std::log(x);\n\t}\n\n\t/* Slower than the VC7.1 function...\n\tGLM_FUNC_QUALIFIER float fastLog(float x)\n\t{\n\t\tfloat y1 = (x - 1.0f) / (x + 1.0f);\n\t\tfloat y2 = y1 * y1;\n\t\treturn 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 * 0.1428571429f)));\n\t}\n\t*/\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastLog(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastLog, x);\n\t}\n\n\t//fastExp2, ln2 = 0.69314718055994530941723212145818f\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastExp2(genType x)\n\t{\n\t\treturn fastExp(0.69314718055994530941723212145818f * x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastExp2(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastExp2, x);\n\t}\n\n\t// fastLog2, ln2 = 0.69314718055994530941723212145818f\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastLog2(genType x)\n\t{\n\t\treturn fastLog(x) / 0.69314718055994530941723212145818f;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastLog2(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastLog2, x);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/fast_square_root.hpp",
    "content": "/// @ref gtx_fast_square_root\n/// @file glm/gtx/fast_square_root.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_fast_square_root GLM_GTX_fast_square_root\n/// @ingroup gtx\n///\n/// Include <glm/gtx/fast_square_root.hpp> to use the features of this extension.\n///\n/// Fast but less accurate implementations of square root based functions.\n/// - Sqrt optimisation based on Newton's method, \n/// www.gamedev.net/community/forums/topic.asp?topic id=139956\n\n#pragma once\n\n// Dependency:\n#include \"../common.hpp\"\n#include \"../exponential.hpp\"\n#include \"../geometric.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_fast_square_root is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_fast_square_root extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_fast_square_root\n\t/// @{\n\n\t/// Faster than the common sqrt function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType fastSqrt(genType x);\n\n\t/// Faster than the common sqrt function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fastSqrt(vec<L, T, Q> const& x);\n\n\t/// Faster than the common inversesqrt function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType fastInverseSqrt(genType x);\n\n\t/// Faster than the common inversesqrt function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> fastInverseSqrt(vec<L, T, Q> const& x);\n\n\t/// Faster than the common length function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType fastLength(genType x);\n\n\t/// Faster than the common length function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T fastLength(vec<L, T, Q> const& x);\n\n\t/// Faster than the common distance function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType fastDistance(genType x, genType y);\n\n\t/// Faster than the common distance function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T fastDistance(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Faster than the common normalize function but less accurate.\n\t///\n\t/// @see gtx_fast_square_root extension.\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType fastNormalize(genType const& x);\n\n\t/// @}\n}// namespace glm\n\n#include \"fast_square_root.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/fast_square_root.inl",
    "content": "/// @ref gtx_fast_square_root\n/// @file glm/gtx/fast_square_root.inl\n\nnamespace glm\n{\n\t// fastSqrt\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastSqrt(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'fastSqrt' only accept floating-point input\");\n\n\t\treturn genType(1) / fastInverseSqrt(x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastSqrt(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastSqrt, x);\n\t}\n\n\t// fastInversesqrt\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastInverseSqrt(genType x)\n\t{\n#\t\tifdef __CUDACC__ // Wordaround for a CUDA compiler bug up to CUDA6\n\t\t\tvec<1, T, Q> tmp(detail::compute_inversesqrt<tvec1, genType, lowp, detail::is_aligned<lowp>::value>::call(vec<1, genType, lowp>(x)));\n\t\t\treturn tmp.x;\n#\t\telse\n\t\t\treturn detail::compute_inversesqrt<1, genType, lowp, detail::is_aligned<lowp>::value>::call(vec<1, genType, lowp>(x)).x;\n#\t\tendif\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastInverseSqrt(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::compute_inversesqrt<L, T, Q, detail::is_aligned<Q>::value>::call(x);\n\t}\n\n\t// fastLength\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastLength(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'fastLength' only accept floating-point inputs\");\n\n\t\treturn abs(x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T fastLength(vec<L, T, Q> const& x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'fastLength' only accept floating-point inputs\");\n\n\t\treturn fastSqrt(dot(x, x));\n\t}\n\n\t// fastDistance\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastDistance(genType x, genType y)\n\t{\n\t\treturn fastLength(y - x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T fastDistance(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\treturn fastLength(y - x);\n\t}\n\n\t// fastNormalize\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType fastNormalize(genType x)\n\t{\n\t\treturn x > genType(0) ? genType(1) : -genType(1);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastNormalize(vec<L, T, Q> const& x)\n\t{\n\t\treturn x * fastInverseSqrt(dot(x, x));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/fast_trigonometry.hpp",
    "content": "/// @ref gtx_fast_trigonometry\n/// @file glm/gtx/fast_trigonometry.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_fast_trigonometry GLM_GTX_fast_trigonometry\n/// @ingroup gtx\n///\n/// Include <glm/gtx/fast_trigonometry.hpp> to use the features of this extension.\n///\n/// Fast but less accurate implementations of trigonometric functions.\n\n#pragma once\n\n// Dependency:\n#include \"../gtc/constants.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_fast_trigonometry is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_fast_trigonometry extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_fast_trigonometry\n\t/// @{\n\n\t/// Wrap an angle to [0 2pi[\n\t/// From GLM_GTX_fast_trigonometry extension.\n\ttemplate<typename T> \n\tGLM_FUNC_DECL T wrapAngle(T angle);\n\n\t/// Faster than the common sin function but less accurate.\n\t/// From GLM_GTX_fast_trigonometry extension.\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T fastSin(T angle);\n\n\t/// Faster than the common cos function but less accurate.\n\t/// From GLM_GTX_fast_trigonometry extension.\n\ttemplate<typename T> \n\tGLM_FUNC_DECL T fastCos(T angle);\n\n\t/// Faster than the common tan function but less accurate. \n\t/// Defined between -2pi and 2pi. \n\t/// From GLM_GTX_fast_trigonometry extension.\n\ttemplate<typename T> \n\tGLM_FUNC_DECL T fastTan(T angle);\n\n\t/// Faster than the common asin function but less accurate. \n\t/// Defined between -2pi and 2pi.\n\t/// From GLM_GTX_fast_trigonometry extension.\n\ttemplate<typename T> \n\tGLM_FUNC_DECL T fastAsin(T angle);\n\n\t/// Faster than the common acos function but less accurate. \n\t/// Defined between -2pi and 2pi. \n\t/// From GLM_GTX_fast_trigonometry extension.\n\ttemplate<typename T> \n\tGLM_FUNC_DECL T fastAcos(T angle);\n\n\t/// Faster than the common atan function but less accurate.\n\t/// Defined between -2pi and 2pi. \n\t/// From GLM_GTX_fast_trigonometry extension.\n\ttemplate<typename T> \n\tGLM_FUNC_DECL T fastAtan(T y, T x);\n\n\t/// Faster than the common atan function but less accurate. \n\t/// Defined between -2pi and 2pi.\n\t/// From GLM_GTX_fast_trigonometry extension.\n\ttemplate<typename T> \n\tGLM_FUNC_DECL T fastAtan(T angle);\n\n\t/// @}\n}//namespace glm\n\n#include \"fast_trigonometry.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/fast_trigonometry.inl",
    "content": "/// @ref gtx_fast_trigonometry\n/// @file glm/gtx/fast_trigonometry.inl\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> taylorCos(vec<L, T, Q> const& x)\n\t{\n\t\treturn static_cast<T>(1)\n\t\t\t- (x * x) * (1.f / 2.f)\n\t\t\t+ ((x * x) * (x * x)) * (1.f / 24.f)\n\t\t\t- (((x * x) * (x * x)) * (x * x)) * (1.f / 720.f)\n\t\t\t+ (((x * x) * (x * x)) * ((x * x) * (x * x))) * (1.f / 40320.f);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T cos_52s(T x)\n\t{\n\t\tT const xx(x * x);\n\t\treturn (T(0.9999932946) + xx * (T(-0.4999124376) + xx * (T(0.0414877472) + xx * T(-0.0012712095))));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> cos_52s(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(cos_52s, x);\n\t}\n}//namespace detail\n\n\t// wrapAngle\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T wrapAngle(T angle)\n\t{\n\t\treturn abs<T>(mod<T>(angle, two_pi<T>()));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> wrapAngle(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(wrapAngle, x);\n\t}\n\n\t// cos\n\ttemplate<typename T> \n\tGLM_FUNC_QUALIFIER T fastCos(T x)\n\t{\n\t\tT const angle(wrapAngle<T>(x));\n\n\t\tif(angle < half_pi<T>())\n\t\t\treturn detail::cos_52s(angle);\n\t\tif(angle < pi<T>())\n\t\t\treturn -detail::cos_52s(pi<T>() - angle);\n\t\tif(angle < (T(3) * half_pi<T>()))\n\t\t\treturn -detail::cos_52s(angle - pi<T>());\n\n\t\treturn detail::cos_52s(two_pi<T>() - angle);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastCos(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastCos, x);\n\t}\n\n\t// sin\n\ttemplate<typename T> \n\tGLM_FUNC_QUALIFIER T fastSin(T x)\n\t{\n\t\treturn fastCos<T>(half_pi<T>() - x);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastSin(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastSin, x);\n\t}\n\n\t// tan\n\ttemplate<typename T> \n\tGLM_FUNC_QUALIFIER T fastTan(T x)\n\t{\n\t\treturn x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastTan(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastTan, x);\n\t}\n\n\t// asin\n\ttemplate<typename T> \n\tGLM_FUNC_QUALIFIER T fastAsin(T x)\n\t{\n\t\treturn x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastAsin(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastAsin, x);\n\t}\n\n\t// acos\n\ttemplate<typename T> \n\tGLM_FUNC_QUALIFIER T fastAcos(T x)\n\t{\n\t\treturn T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2)\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastAcos(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastAcos, x);\n\t}\n\n\t// atan\n\ttemplate<typename T> \n\tGLM_FUNC_QUALIFIER T fastAtan(T y, T x)\n\t{\n\t\tT sgn = sign(y) * sign(x);\n\t\treturn abs(fastAtan(y / x)) * sgn;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastAtan(vec<L, T, Q> const& y, vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor2<L, T, Q>::call(fastAtan, y, x);\n\t}\n\n\ttemplate<typename T> \n\tGLM_FUNC_QUALIFIER T fastAtan(T x)\n\t{\n\t\treturn x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> fastAtan(vec<L, T, Q> const& x)\n\t{\n\t\treturn detail::functor1<L, T, T, Q>::call(fastAtan, x);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/float_notmalize.inl",
    "content": "/// @ref gtx_float_normalize\n/// @file glm/gtx/float_normalize.inl\n\n#include <limits>\n\nnamespace glm\n{\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, float, Q> floatNormalize(vec<L, T, Q> const& v)\n\t{\n\t\treturn vec<L, float, Q>(v) / static_cast<float>(std::numeric_limits<T>::max());\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/functions.hpp",
    "content": "/// @ref gtx_functions\n/// @file glm/gtx/functions.hpp\n/// \n/// @see core (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtx_functions GLM_GTX_functions\n/// @ingroup gtx\n///\n/// Include <glm/gtx/functions.hpp> to use the features of this extension.\n/// \n/// List of useful common functions.\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/qualifier.hpp\"\n#include \"../detail/type_vec2.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_functions extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_functions\n\t/// @{\n\n\t/// 1D gauss function\n\t///\n\t/// @see gtc_epsilon\n\ttemplate<typename T>\n\tGLM_FUNC_DECL T gauss(\n\t\tT x,\n\t\tT ExpectedValue,\n\t\tT StandardDeviation);\n\n\t/// 2D gauss function\n\t///\n\t/// @see gtc_epsilon\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T gauss(\n\t\tvec<2, T, Q> const& Coord,\n\t\tvec<2, T, Q> const& ExpectedValue,\n\t\tvec<2, T, Q> const& StandardDeviation);\n\n\t/// @}\n}//namespace glm\n\n#include \"functions.inl\"\n\n"
  },
  {
    "path": "external/glm/glm/gtx/functions.inl",
    "content": "/// @ref gtx_functions\n/// @file glm/gtx/functions.inl\n\n#include \"../exponential.hpp\"\n\nnamespace glm\n{\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T gauss\n\t(\n\t\tT x,\n\t\tT ExpectedValue,\n\t\tT StandardDeviation\n\t)\n\t{\n\t\treturn exp(-((x - ExpectedValue) * (x - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation)) / (StandardDeviation * sqrt(static_cast<T>(6.28318530717958647692528676655900576)));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T gauss\n\t(\n\t\tvec<2, T, Q> const& Coord,\n\t\tvec<2, T, Q> const& ExpectedValue,\n\t\tvec<2, T, Q> const& StandardDeviation\n\t)\n\t{\n\t\tvec<2, T, Q> const Squared = ((Coord - ExpectedValue) * (Coord - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation);\n\t\treturn exp(-(Squared.x + Squared.y));\n\t}\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/gtx/gradient_paint.hpp",
    "content": "/// @ref gtx_gradient_paint\n/// @file glm/gtx/gradient_paint.hpp\n///\n/// @see core (dependence)\n/// @see gtx_optimum_pow (dependence)\n///\n/// @defgroup gtx_gradient_paint GLM_GTX_gradient_paint\n/// @ingroup gtx\n///\n/// Include <glm/gtx/gradient_paint.hpp> to use the features of this extension.\n///\n/// Functions that return the color of procedural gradient for specific coordinates.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/optimum_pow.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_gradient_paint is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_gradient_paint extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_gradient_paint\n\t/// @{\n\n\t/// Return a color from a radial gradient.\n\t/// @see - gtx_gradient_paint\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T radialGradient(\n\t\tvec<2, T, Q> const& Center,\n\t\tT const& Radius,\n\t\tvec<2, T, Q> const& Focal,\n\t\tvec<2, T, Q> const& Position);\n\n\t/// Return a color from a linear gradient.\n\t/// @see - gtx_gradient_paint\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T linearGradient(\n\t\tvec<2, T, Q> const& Point0,\n\t\tvec<2, T, Q> const& Point1,\n\t\tvec<2, T, Q> const& Position);\n\n\t/// @}\n}// namespace glm\n\n#include \"gradient_paint.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/gradient_paint.inl",
    "content": "/// @ref gtx_gradient_paint\n/// @file glm/gtx/gradient_paint.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T radialGradient\n\t(\n\t\tvec<2, T, Q> const& Center,\n\t\tT const& Radius,\n\t\tvec<2, T, Q> const& Focal,\n\t\tvec<2, T, Q> const& Position\n\t)\n\t{\n\t\tvec<2, T, Q> F = Focal - Center;\n\t\tvec<2, T, Q> D = Position - Focal;\n\t\tT Radius2 = pow2(Radius);\n\t\tT Fx2 = pow2(F.x);\n\t\tT Fy2 = pow2(F.y);\n\n\t\tT Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x));\n\t\tT Denominator = Radius2 - (Fx2 + Fy2);\n\t\treturn Numerator / Denominator;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T linearGradient\n\t(\n\t\tvec<2, T, Q> const& Point0,\n\t\tvec<2, T, Q> const& Point1,\n\t\tvec<2, T, Q> const& Position\n\t)\n\t{\n\t\tvec<2, T, Q> Dist = Point1 - Point0;\n\t\treturn (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/handed_coordinate_space.hpp",
    "content": "/// @ref gtx_handed_coordinate_space\n/// @file glm/gtx/handed_coordinate_space.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_handed_coordinate_space GLM_GTX_handed_coordinate_space\n/// @ingroup gtx\n///\n/// Include <glm/gtx/handed_coordinate_system.hpp> to use the features of this extension.\n///\n/// To know if a set of three basis vectors defines a right or left-handed coordinate system.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_handed_coordinate_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_handed_coordinate_space extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_handed_coordinate_space\n\t/// @{\n\n\t//! Return if a trihedron right handed or not.\n\t//! From GLM_GTX_handed_coordinate_space extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool rightHanded(\n\t\tvec<3, T, Q> const& tangent,\n\t\tvec<3, T, Q> const& binormal,\n\t\tvec<3, T, Q> const& normal);\n\n\t//! Return if a trihedron left handed or not.\n\t//! From GLM_GTX_handed_coordinate_space extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool leftHanded(\n\t\tvec<3, T, Q> const& tangent,\n\t\tvec<3, T, Q> const& binormal,\n\t\tvec<3, T, Q> const& normal);\n\n\t/// @}\n}// namespace glm\n\n#include \"handed_coordinate_space.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/handed_coordinate_space.inl",
    "content": "/// @ref gtx_handed_coordinate_space\n/// @file glm/gtx/handed_coordinate_space.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool rightHanded\n\t(\n\t\tvec<3, T, Q> const& tangent,\n\t\tvec<3, T, Q> const& binormal,\n\t\tvec<3, T, Q> const& normal\n\t)\n\t{\n\t\treturn dot(cross(normal, tangent), binormal) > T(0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool leftHanded\n\t(\n\t\tvec<3, T, Q> const& tangent,\n\t\tvec<3, T, Q> const& binormal,\n\t\tvec<3, T, Q> const& normal\n\t)\n\t{\n\t\treturn dot(cross(normal, tangent), binormal) < T(0);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/hash.hpp",
    "content": "/// @ref gtx_hash\n/// @file glm/gtx/hash.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_hash GLM_GTX_hash\n/// @ingroup gtx\n///\n/// Include <glm/gtx/hash.hpp> to use the features of this extension.\n/// \n/// Add std::hash support for glm types\n\n#pragma once\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_hash is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#include <functional>\n\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../gtc/vec1.hpp\"\n\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtx/dual_quaternion.hpp\"\n\n#include \"../mat2x2.hpp\"\n#include \"../mat2x3.hpp\"\n#include \"../mat2x4.hpp\"\n\n#include \"../mat3x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat3x4.hpp\"\n\n#include \"../mat4x2.hpp\"\n#include \"../mat4x3.hpp\"\n#include \"../mat4x4.hpp\"\n\n#if !GLM_HAS_CXX11_STL\n#\terror \"GLM_GTX_hash requires C++11 standard library support\"\n#endif\n\nnamespace std\n{\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::vec<1, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::vec<1, T, Q> const& v) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::vec<2, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::vec<2, T, Q> const& v) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::vec<3, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::vec<3, T, Q> const& v) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::vec<4, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::vec<4, T, Q> const& v) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::tquat<T,Q>>\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::tquat<T, Q> const& q) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::tdualquat<T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::tdualquat<T,Q> const& q) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<2, 2, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<2, 2, T,Q> const& m) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<2, 3, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<2, 3, T,Q> const& m) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<2, 4, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<2, 4, T,Q> const& m) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<3, 2, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<3, 2, T,Q> const& m) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<3, 3, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<3, 3, T,Q> const& m) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<3, 4, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<3, 4, T,Q> const& m) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<4, 2, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<4, 2, T,Q> const& m) const;\n\t};\n\t\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<4, 3, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<4, 3, T,Q> const& m) const;\n\t};\n\n\ttemplate<typename T, glm::qualifier Q>\n\tstruct hash<glm::mat<4, 4, T,Q> >\n\t{\n\t\tGLM_FUNC_DECL size_t operator()(glm::mat<4, 4, T,Q> const& m) const;\n\t};\n} // namespace std\n\n#include \"hash.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/hash.inl",
    "content": "/// @ref gtx_hash\n/// @file glm/gtx/hash.inl\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_hash GLM_GTX_hash\n/// @ingroup gtx\n///\n/// @brief Add std::hash support for glm types\n///\n/// <glm/gtx/hash.inl> need to be included to use the features of this extension.\n\nnamespace glm {\nnamespace detail\n{\n\tGLM_INLINE void hash_combine(size_t &seed, size_t hash)\n\t{\n\t\thash += 0x9e3779b9 + (seed << 6) + (seed >> 2);\n\t\tseed ^= hash;\n\t}\n}}\n\nnamespace std\n{\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::vec<1, T, Q>>::operator()(glm::vec<1, T, Q> const& v) const\n\t{\n\t\thash<T> hasher;\n\t\treturn hasher(v.x);\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::vec<2, T, Q>>::operator()(glm::vec<2, T, Q> const& v) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<T> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(v.x));\n\t\tglm::detail::hash_combine(seed, hasher(v.y));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::vec<3, T, Q>>::operator()(glm::vec<3, T, Q> const& v) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<T> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(v.x));\n\t\tglm::detail::hash_combine(seed, hasher(v.y));\n\t\tglm::detail::hash_combine(seed, hasher(v.z));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::vec<4, T, Q>>::operator()(glm::vec<4, T, Q> const& v) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<T> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(v.x));\n\t\tglm::detail::hash_combine(seed, hasher(v.y));\n\t\tglm::detail::hash_combine(seed, hasher(v.z));\n\t\tglm::detail::hash_combine(seed, hasher(v.w));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::tquat<T, Q>>::operator()(glm::tquat<T,Q> const& q) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<T> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(q.x));\n\t\tglm::detail::hash_combine(seed, hasher(q.y));\n\t\tglm::detail::hash_combine(seed, hasher(q.z));\n\t\tglm::detail::hash_combine(seed, hasher(q.w));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::tdualquat<T, Q>>::operator()(glm::tdualquat<T, Q> const& q) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::tquat<T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(q.real));\n\t\tglm::detail::hash_combine(seed, hasher(q.dual));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 2, T, Q>>::operator()(glm::mat<2, 2, T, Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<2, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 3, T, Q>>::operator()(glm::mat<2, 3, T, Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<3, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 4, T, Q>>::operator()(glm::mat<2, 4, T, Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<4, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 2, T, Q>>::operator()(glm::mat<3, 2, T, Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<2, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\tglm::detail::hash_combine(seed, hasher(m[2]));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 3, T, Q>>::operator()(glm::mat<3, 3, T, Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<3, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\tglm::detail::hash_combine(seed, hasher(m[2]));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 4, T, Q>>::operator()(glm::mat<3, 4, T, Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<4, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\tglm::detail::hash_combine(seed, hasher(m[2]));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 2, T,Q>>::operator()(glm::mat<4, 2, T,Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<2, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\tglm::detail::hash_combine(seed, hasher(m[2]));\n\t\tglm::detail::hash_combine(seed, hasher(m[3]));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 3, T,Q>>::operator()(glm::mat<4, 3, T,Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<3, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\tglm::detail::hash_combine(seed, hasher(m[2]));\n\t\tglm::detail::hash_combine(seed, hasher(m[3]));\n\t\treturn seed;\n\t}\n\n\ttemplate<typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 4, T,Q>>::operator()(glm::mat<4, 4, T, Q> const& m) const\n\t{\n\t\tsize_t seed = 0;\n\t\thash<glm::vec<4, T, Q>> hasher;\n\t\tglm::detail::hash_combine(seed, hasher(m[0]));\n\t\tglm::detail::hash_combine(seed, hasher(m[1]));\n\t\tglm::detail::hash_combine(seed, hasher(m[2]));\n\t\tglm::detail::hash_combine(seed, hasher(m[3]));\n\t\treturn seed;\n\t}\n}\n"
  },
  {
    "path": "external/glm/glm/gtx/integer.hpp",
    "content": "/// @ref gtx_integer\n/// @file glm/gtx/integer.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_integer GLM_GTX_integer\n/// @ingroup gtx\n///\n/// Include <glm/gtx/integer.hpp> to use the features of this extension.\n///\n/// Add support for integer for core functions\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/integer.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_integer is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_integer extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_integer\n\t/// @{\n\n\t//! Returns x raised to the y power. \n\t//! From GLM_GTX_integer extension.\n\tGLM_FUNC_DECL int pow(int x, uint y);\n\n\t//! Returns the positive square root of x.\n\t//! From GLM_GTX_integer extension.\n\tGLM_FUNC_DECL int sqrt(int x);\n\n\t//! Returns the floor log2 of x.\n\t//! From GLM_GTX_integer extension.\n\tGLM_FUNC_DECL unsigned int floor_log2(unsigned int x);\n\n\t//! Modulus. Returns x - y * floor(x / y) for each component in x using the floating point value y.\n\t//! From GLM_GTX_integer extension.\n\tGLM_FUNC_DECL int mod(int x, int y);\n\n\t//! Return the factorial value of a number (!12 max, integer only)\n\t//! From GLM_GTX_integer extension.\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType factorial(genType const& x);\n\n\t//! 32bit signed integer. \n\t//! From GLM_GTX_integer extension.\n\ttypedef signed int\t\t\t\t\tsint;\n\n\t//! Returns x raised to the y power.\n\t//! From GLM_GTX_integer extension.\n\tGLM_FUNC_DECL uint pow(uint x, uint y);\n\n\t//! Returns the positive square root of x. \n\t//! From GLM_GTX_integer extension.\n\tGLM_FUNC_DECL uint sqrt(uint x);\n\n\t//! Modulus. Returns x - y * floor(x / y) for each component in x using the floating point value y.\n\t//! From GLM_GTX_integer extension.\n\tGLM_FUNC_DECL uint mod(uint x, uint y);\n\n\t//! Returns the number of leading zeros.\n\t//! From GLM_GTX_integer extension.\n\tGLM_FUNC_DECL uint nlz(uint x);\n\n\t/// @}\n}//namespace glm\n\n#include \"integer.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/integer.inl",
    "content": "/// @ref gtx_integer\n/// @file glm/gtx/integer.inl\n\nnamespace glm\n{\n\t// pow\n\tGLM_FUNC_QUALIFIER int pow(int x, uint y)\n\t{\n\t\tif(y == 0)\n\t\t\treturn x >= 0 ? 1 : -1;\n\n\t\tint result = x;\n\t\tfor(uint i = 1; i < y; ++i)\n\t\t\tresult *= x;\n\t\treturn result;\n\t}\n\n\t// sqrt: From Christopher J. Musial, An integer square root, Graphics Gems, 1990, page 387\n\tGLM_FUNC_QUALIFIER int sqrt(int x)\n\t{\n\t\tif(x <= 1) return x;\n\n\t\tint NextTrial = x >> 1;\n\t\tint CurrentAnswer;\n\n\t\tdo\n\t\t{\n\t\t\tCurrentAnswer = NextTrial;\n\t\t\tNextTrial = (NextTrial + x / NextTrial) >> 1;\n\t\t} while(NextTrial < CurrentAnswer);\n\n\t\treturn CurrentAnswer;\n\t}\n\n// Henry Gordon Dietz: http://aggregate.org/MAGIC/\nnamespace detail\n{\n\tGLM_FUNC_QUALIFIER unsigned int ones32(unsigned int x)\n\t{\n\t\t/* 32-bit recursive reduction using SWAR...\n\t\tbut first step is mapping 2-bit values\n\t\tinto sum of 2 1-bit values in sneaky way\n\t\t*/\n\t\tx -= ((x >> 1) & 0x55555555);\n\t\tx = (((x >> 2) & 0x33333333) + (x & 0x33333333));\n\t\tx = (((x >> 4) + x) & 0x0f0f0f0f);\n\t\tx += (x >> 8);\n\t\tx += (x >> 16);\n\t\treturn(x & 0x0000003f);\n\t}\n}//namespace detail\n\n\t// Henry Gordon Dietz: http://aggregate.org/MAGIC/\n/*\n\tGLM_FUNC_QUALIFIER unsigned int floor_log2(unsigned int x)\n\t{\n\t\tx |= (x >> 1);\n\t\tx |= (x >> 2);\n\t\tx |= (x >> 4);\n\t\tx |= (x >> 8);\n\t\tx |= (x >> 16);\n\n\t\treturn _detail::ones32(x) >> 1;\n\t}\n*/\n\t// mod\n\tGLM_FUNC_QUALIFIER int mod(int x, int y)\n\t{\n\t\treturn x - y * (x / y);\n\t}\n\n\t// factorial (!12 max, integer only)\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType factorial(genType const& x)\n\t{\n\t\tgenType Temp = x;\n\t\tgenType Result;\n\t\tfor(Result = 1; Temp > 1; --Temp)\n\t\t\tResult *= Temp;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> factorial(\n\t\tvec<2, T, Q> const& x)\n\t{\n\t\treturn vec<2, T, Q>(\n\t\t\tfactorial(x.x),\n\t\t\tfactorial(x.y));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> factorial(\n\t\tvec<3, T, Q> const& x)\n\t{\n\t\treturn vec<3, T, Q>(\n\t\t\tfactorial(x.x),\n\t\t\tfactorial(x.y),\n\t\t\tfactorial(x.z));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> factorial(\n\t\tvec<4, T, Q> const& x)\n\t{\n\t\treturn vec<4, T, Q>(\n\t\t\tfactorial(x.x),\n\t\t\tfactorial(x.y),\n\t\t\tfactorial(x.z),\n\t\t\tfactorial(x.w));\n\t}\n\n\tGLM_FUNC_QUALIFIER uint pow(uint x, uint y)\n\t{\n\t\tif (y == 0)\n\t\t\treturn 1u;\n\n\t\tuint result = x;\n\t\tfor(uint i = 1; i < y; ++i)\n\t\t\tresult *= x;\n\t\treturn result;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint sqrt(uint x)\n\t{\n\t\tif(x <= 1) return x;\n\n\t\tuint NextTrial = x >> 1;\n\t\tuint CurrentAnswer;\n\n\t\tdo\n\t\t{\n\t\t\tCurrentAnswer = NextTrial;\n\t\t\tNextTrial = (NextTrial + x / NextTrial) >> 1;\n\t\t} while(NextTrial < CurrentAnswer);\n\n\t\treturn CurrentAnswer;\n\t}\n\n\tGLM_FUNC_QUALIFIER uint mod(uint x, uint y)\n\t{\n\t\treturn x - y * (x / y);\n\t}\n\n#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC))\n\n\tGLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) \n\t{\n\t\treturn 31u - findMSB(x);\n\t}\n\n#else\n\n\t// Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt\n\tGLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) \n\t{\n\t\tint y, m, n;\n\n\t\ty = -int(x >> 16);      // If left half of x is 0,\n\t\tm = (y >> 16) & 16;  // set n = 16.  If left half\n\t\tn = 16 - m;          // is nonzero, set n = 0 and\n\t\tx = x >> m;          // shift x right 16.\n\t\t\t\t\t\t\t// Now x is of the form 0000xxxx.\n\t\ty = x - 0x100;       // If positions 8-15 are 0,\n\t\tm = (y >> 16) & 8;   // add 8 to n and shift x left 8.\n\t\tn = n + m;\n\t\tx = x << m;\n\n\t\ty = x - 0x1000;      // If positions 12-15 are 0,\n\t\tm = (y >> 16) & 4;   // add 4 to n and shift x left 4.\n\t\tn = n + m;\n\t\tx = x << m;\n\n\t\ty = x - 0x4000;      // If positions 14-15 are 0,\n\t\tm = (y >> 16) & 2;   // add 2 to n and shift x left 2.\n\t\tn = n + m;\n\t\tx = x << m;\n\n\t\ty = x >> 14;         // Set y = 0, 1, 2, or 3.\n\t\tm = y & ~(y >> 1);   // Set m = 0, 1, 2, or 2 resp.\n\t\treturn unsigned(n + 2 - m);\n\t}\n\n#endif//(GLM_COMPILER)\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/intersect.hpp",
    "content": "/// @ref gtx_intersect\n/// @file glm/gtx/intersect.hpp\n///\n/// @see core (dependence)\n/// @see gtx_closest_point (dependence)\n///\n/// @defgroup gtx_intersect GLM_GTX_intersect\n/// @ingroup gtx\n///\n/// Include <glm/gtx/intersect.hpp> to use the features of this extension.\n///\n/// Add intersection functions\n\n#pragma once\n\n// Dependency:\n#include <cfloat>\n#include <limits>\n#include \"../glm.hpp\"\n#include \"../geometric.hpp\"\n#include \"../gtx/closest_point.hpp\"\n#include \"../gtx/vector_query.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_closest_point extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_intersect\n\t/// @{\n\n\t//! Compute the intersection of a ray and a plane.\n\t//! Ray direction and plane normal must be unit length.\n\t//! From GLM_GTX_intersect extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool intersectRayPlane(\n\t\tgenType const& orig, genType const& dir,\n\t\tgenType const& planeOrig, genType const& planeNormal,\n\t\ttypename genType::value_type & intersectionDistance);\n\n\t//! Compute the intersection of a ray and a triangle.\n\t/// Based om Tomas Mller implementation http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/raytri/\n\t//! From GLM_GTX_intersect extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool intersectRayTriangle(\n\t\tvec<3, T, Q> const& orig, vec<3, T, Q> const& dir,\n\t\tvec<3, T, Q> const& v0, vec<3, T, Q> const& v1, vec<3, T, Q> const& v2,\n\t\tvec<3, T, Q>& baryPosition, T& distance);\n\n\t//! Compute the intersection of a line and a triangle.\n\t//! From GLM_GTX_intersect extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool intersectLineTriangle(\n\t\tgenType const& orig, genType const& dir,\n\t\tgenType const& vert0, genType const& vert1, genType const& vert2,\n\t\tgenType & position);\n\n\t//! Compute the intersection distance of a ray and a sphere. \n\t//! The ray direction vector is unit length.\n\t//! From GLM_GTX_intersect extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool intersectRaySphere(\n\t\tgenType const& rayStarting, genType const& rayNormalizedDirection,\n\t\tgenType const& sphereCenter, typename genType::value_type const sphereRadiusSquered,\n\t\ttypename genType::value_type & intersectionDistance);\n\n\t//! Compute the intersection of a ray and a sphere.\n\t//! From GLM_GTX_intersect extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool intersectRaySphere(\n\t\tgenType const& rayStarting, genType const& rayNormalizedDirection,\n\t\tgenType const& sphereCenter, const typename genType::value_type sphereRadius,\n\t\tgenType & intersectionPosition, genType & intersectionNormal);\n\n\t//! Compute the intersection of a line and a sphere.\n\t//! From GLM_GTX_intersect extension\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL bool intersectLineSphere(\n\t\tgenType const& point0, genType const& point1,\n\t\tgenType const& sphereCenter, typename genType::value_type sphereRadius,\n\t\tgenType & intersectionPosition1, genType & intersectionNormal1, \n\t\tgenType & intersectionPosition2 = genType(), genType & intersectionNormal2 = genType());\n\n\t/// @}\n}//namespace glm\n\n#include \"intersect.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/intersect.inl",
    "content": "/// @ref gtx_intersect\n/// @file glm/gtx/intersect.inl\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool intersectRayPlane\n\t(\n\t\tgenType const& orig, genType const& dir,\n\t\tgenType const& planeOrig, genType const& planeNormal,\n\t\ttypename genType::value_type & intersectionDistance\n\t)\n\t{\n\t\ttypename genType::value_type d = glm::dot(dir, planeNormal);\n\t\ttypename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();\n\n\t\tif(d < -Epsilon)\n\t\t{\n\t\t\tintersectionDistance = glm::dot(planeOrig - orig, planeNormal) / d;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool intersectRayTriangle\n\t(\n\t\tvec<3, T, Q> const& orig, vec<3, T, Q> const& dir,\n\t\tvec<3, T, Q> const& vert0, vec<3, T, Q> const& vert1, vec<3, T, Q> const& vert2,\n\t\tvec<2, T, Q>& baryPosition, T& distance\n\t)\n\t{\n\t\t// find vectors for two edges sharing vert0\n\t\tvec<3, T, Q> const edge1 = vert1 - vert0;\n\t\tvec<3, T, Q> const edge2 = vert2 - vert0;\n\n\t\t// begin calculating determinant - also used to calculate U parameter\n\t\tvec<3, T, Q> const p = glm::cross(dir, edge2);\n\n\t\t// if determinant is near zero, ray lies in plane of triangle\n\t\tT const det = glm::dot(edge1, p);\n\n\t\tvec<3, T, Q> qvec;\n\n\t\tif(det > std::numeric_limits<T>::epsilon())\n\t\t{\n\t\t\t// calculate distance from vert0 to ray origin\n\t\t\tvec<3, T, Q> const tvec = orig - vert0;\n\n\t\t\t// calculate U parameter and test bounds\n\t\t\tbaryPosition.x = glm::dot(tvec, p);\n\t\t\tif(baryPosition.x < static_cast<T>(0) || baryPosition.x > det)\n\t\t\t\treturn false;\n\n\t\t\t// prepare to test V parameter\n\t\t\tqvec = glm::cross(tvec, edge1);\n\n\t\t\t// calculate V parameter and test bounds\n\t\t\tbaryPosition.y = glm::dot(dir, qvec);\n\t\t\tif((baryPosition.y < static_cast<T>(0)) || ((baryPosition.x + baryPosition.y) > det))\n\t\t\t\treturn false;\n\t\t}\n\t\telse if(det < -std::numeric_limits<T>::epsilon())\n\t\t{\n\t\t\t// calculate distance from vert0 to ray origin\n\t\t\tvec<3, T, Q> const tvec = orig - vert0;\n\n\t\t\t// calculate U parameter and test bounds\n\t\t\tbaryPosition.x = glm::dot(tvec, p);\n\t\t\tif((baryPosition.x > static_cast<T>(0)) || (baryPosition.x < det))\n\t\t\t\treturn false;\n\n\t\t\t// prepare to test V parameter\n\t\t\tqvec = glm::cross(tvec, edge1);\n\n\t\t\t// calculate V parameter and test bounds\n\t\t\tbaryPosition.y = glm::dot(dir, qvec);\n\t\t\tif((baryPosition.y > static_cast<T>(0)) || (baryPosition.x + baryPosition.y < det))\n\t\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t\treturn false; // ray is parallel to the plane of the triangle\n\n\t\tT inv_det = static_cast<T>(1) / det;\n\n\t\t// calculate distance, ray intersects triangle\n\t\tdistance = glm::dot(edge2, qvec) * inv_det;\n\t\tbaryPosition *= inv_det;\n\n\t\treturn true;\n\t}\n\n/*\n\t\ttypename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();\n\t\tif(a < Epsilon && a > -Epsilon)\n\t\t\treturn false;\n\n\t\ttypename genType::value_type f = typename genType::value_type(1.0f) / a;\n\n\t\tgenType s = orig - v0;\n\t\tbaryPosition.x = f * glm::dot(s, p);\n\t\tif(baryPosition.x < typename genType::value_type(0.0f))\n\t\t\treturn false;\n\t\tif(baryPosition.x > typename genType::value_type(1.0f))\n\t\t\treturn false;\n\n\t\tgenType q = glm::cross(s, e1);\n\t\tbaryPosition.y = f * glm::dot(dir, q);\n\t\tif(baryPosition.y < typename genType::value_type(0.0f))\n\t\t\treturn false;\n\t\tif(baryPosition.y + baryPosition.x > typename genType::value_type(1.0f))\n\t\t\treturn false;\n\n\t\tbaryPosition.z = f * glm::dot(e2, q);\n\n\t\treturn baryPosition.z >= typename genType::value_type(0.0f);\n\t}\n*/\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool intersectLineTriangle\n\t(\n\t\tgenType const& orig, genType const& dir,\n\t\tgenType const& vert0, genType const& vert1, genType const& vert2,\n\t\tgenType & position\n\t)\n\t{\n\t\ttypename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();\n\n\t\tgenType edge1 = vert1 - vert0;\n\t\tgenType edge2 = vert2 - vert0;\n\n\t\tgenType pvec = cross(dir, edge2);\n\n\t\tfloat det = dot(edge1, pvec);\n\n\t\tif (det > -Epsilon && det < Epsilon)\n\t\t\treturn false;\n\t\tfloat inv_det = typename genType::value_type(1) / det;\n\n\t\tgenType tvec = orig - vert0;\n\n\t\tposition.y = dot(tvec, pvec) * inv_det;\n\t\tif (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1))\n\t\t\treturn false;\n\n\t\tgenType qvec = cross(tvec, edge1);\n\n\t\tposition.z = dot(dir, qvec) * inv_det;\n\t\tif (position.z < typename genType::value_type(0) || position.y + position.z > typename genType::value_type(1))\n\t\t\treturn false;\n\n\t\tposition.x = dot(edge2, qvec) * inv_det;\n\n\t\treturn true;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool intersectRaySphere\n\t(\n\t\tgenType const& rayStarting, genType const& rayNormalizedDirection,\n\t\tgenType const& sphereCenter, const typename genType::value_type sphereRadiusSquered,\n\t\ttypename genType::value_type & intersectionDistance\n\t)\n\t{\n\t\ttypename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();\n\t\tgenType diff = sphereCenter - rayStarting;\n\t\ttypename genType::value_type t0 = dot(diff, rayNormalizedDirection);\n\t\ttypename genType::value_type dSquared = dot(diff, diff) - t0 * t0;\n\t\tif( dSquared > sphereRadiusSquered )\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\ttypename genType::value_type t1 = sqrt( sphereRadiusSquered - dSquared );\n\t\tintersectionDistance = t0 > t1 + Epsilon ? t0 - t1 : t0 + t1;\n\t\treturn intersectionDistance > Epsilon;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool intersectRaySphere\n\t(\n\t\tgenType const& rayStarting, genType const& rayNormalizedDirection,\n\t\tgenType const& sphereCenter, const typename genType::value_type sphereRadius,\n\t\tgenType & intersectionPosition, genType & intersectionNormal\n\t)\n\t{\n\t\ttypename genType::value_type distance;\n\t\tif( intersectRaySphere( rayStarting, rayNormalizedDirection, sphereCenter, sphereRadius * sphereRadius, distance ) )\n\t\t{\n\t\t\tintersectionPosition = rayStarting + rayNormalizedDirection * distance;\n\t\t\tintersectionNormal = (intersectionPosition - sphereCenter) / sphereRadius;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER bool intersectLineSphere\n\t(\n\t\tgenType const& point0, genType const& point1,\n\t\tgenType const& sphereCenter, typename genType::value_type sphereRadius,\n\t\tgenType & intersectionPoint1, genType & intersectionNormal1, \n\t\tgenType & intersectionPoint2, genType & intersectionNormal2\n\t)\n\t{\n\t\ttypename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();\n\t\tgenType dir = normalize(point1 - point0);\n\t\tgenType diff = sphereCenter - point0;\n\t\ttypename genType::value_type t0 = dot(diff, dir);\n\t\ttypename genType::value_type dSquared = dot(diff, diff) - t0 * t0;\n\t\tif( dSquared > sphereRadius * sphereRadius )\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\ttypename genType::value_type t1 = sqrt( sphereRadius * sphereRadius - dSquared );\n\t\tif( t0 < t1 + Epsilon )\n\t\t\tt1 = -t1;\n\t\tintersectionPoint1 = point0 + dir * (t0 - t1);\n\t\tintersectionNormal1 = (intersectionPoint1 - sphereCenter) / sphereRadius;\n\t\tintersectionPoint2 = point0 + dir * (t0 + t1);\n\t\tintersectionNormal2 = (intersectionPoint2 - sphereCenter) / sphereRadius;\n\t\treturn true;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/io.hpp",
    "content": "/// @ref gtx_io\n/// @file glm/gtx/io.hpp\n/// @author Jan P Springer (regnirpsj@gmail.com)\n///\n/// @see core (dependence)\n/// @see gtc_matrix_access (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtx_io GLM_GTX_io\n/// @ingroup gtx\n///\n/// Include <glm/gtx/io.hpp> to use the features of this extension.\n/// \n/// std::[w]ostream support for glm types\n///\n/// std::[w]ostream support for glm types + qualifier/width/etc. manipulators\n/// based on howard hinnant's std::chrono io proposal\n/// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html]\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/quaternion.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_io is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n# pragma message(\"GLM: GLM_GTX_io extension included\")\n#endif\n\n#include <iosfwd>  // std::basic_ostream<> (fwd)\n#include <locale>  // std::locale, std::locale::facet, std::locale::id\n#include <utility> // std::pair<>\n\nnamespace glm\n{\n\t/// @addtogroup gtx_io\n\t/// @{\n\n\tnamespace io\n\t{\n\t\tenum order_type { column_major, row_major};\n\n\t\ttemplate<typename CTy>\n\t\tclass format_punct : public std::locale::facet\n\t\t{\n\t\t\ttypedef CTy char_type;\n\n\t\tpublic:\n\n\t\t\tstatic std::locale::id id;\n\n\t\t\tbool       formatted;\n\t\t\tunsigned   precision;\n\t\t\tunsigned   width;\n\t\t\tchar_type  separator;\n\t\t\tchar_type  delim_left;\n\t\t\tchar_type  delim_right;\n\t\t\tchar_type  space;\n\t\t\tchar_type  newline;\n\t\t\torder_type order;\n\n\t\t\tGLM_FUNC_DECL explicit format_punct(size_t a = 0);\n\t\t\tGLM_FUNC_DECL explicit format_punct(format_punct const&);\n\t\t};\n\n\t\ttemplate<typename CTy, typename CTr = std::char_traits<CTy> >\n\t\tclass basic_state_saver {\n\n\t\tpublic:\n\n\t\t\tGLM_FUNC_DECL explicit basic_state_saver(std::basic_ios<CTy,CTr>&);\n\t\t\tGLM_FUNC_DECL ~basic_state_saver();\n\n\t\tprivate:\n\n\t\t\ttypedef ::std::basic_ios<CTy,CTr>      state_type;\n\t\t\ttypedef typename state_type::char_type char_type;\n\t\t\ttypedef ::std::ios_base::fmtflags      flags_type;\n\t\t\ttypedef ::std::streamsize              streamsize_type;\n\t\t\ttypedef ::std::locale const            locale_type;\n\n\t\t\tstate_type&     state_;\n\t\t\tflags_type      flags_;\n\t\t\tstreamsize_type precision_;\n\t\t\tstreamsize_type width_;\n\t\t\tchar_type       fill_;\n\t\t\tlocale_type     locale_;\n\n\t\t\tGLM_FUNC_DECL basic_state_saver& operator=(basic_state_saver const&);\n\t\t};\n\n\t\ttypedef basic_state_saver<char>     state_saver;\n\t\ttypedef basic_state_saver<wchar_t> wstate_saver;\n\n\t\ttemplate<typename CTy, typename CTr = std::char_traits<CTy> >\n\t\tclass basic_format_saver\n\t\t{\n\t\tpublic:\n\n\t\t\tGLM_FUNC_DECL explicit basic_format_saver(std::basic_ios<CTy,CTr>&);\n\t\t\tGLM_FUNC_DECL ~basic_format_saver();\n\n\t\tprivate:\n\n\t\t\tbasic_state_saver<CTy> const bss_;\n\n\t\t\tGLM_FUNC_DECL basic_format_saver& operator=(basic_format_saver const&);\n\t\t};\n\n\t\ttypedef basic_format_saver<char>     format_saver;\n\t\ttypedef basic_format_saver<wchar_t> wformat_saver;\n\n\t\tstruct precision\n\t\t{\n\t\t\tunsigned value;\n\n\t\t\tGLM_FUNC_DECL explicit precision(unsigned);\n\t\t};\n\n\t\tstruct width\n\t\t{\n\t\t\tunsigned value;\n\n\t\t\tGLM_FUNC_DECL explicit width(unsigned);\n\t\t};\n\n\t\ttemplate<typename CTy>\n\t\tstruct delimeter\n\t\t{\n\t\t\tCTy value[3];\n\n\t\t\tGLM_FUNC_DECL explicit delimeter(CTy /* left */, CTy /* right */, CTy /* separator */ = ',');\n\t\t};\n\n\t\tstruct order\n\t\t{\n\t\t\torder_type value;\n\n\t\t\tGLM_FUNC_DECL explicit order(order_type);\n\t\t};\n\n\t\t// functions, inlined (inline)\n\n\t\ttemplate<typename FTy, typename CTy, typename CTr>\n\t\tFTy const& get_facet(std::basic_ios<CTy,CTr>&);\n\t\ttemplate<typename FTy, typename CTy, typename CTr>\n\t\tstd::basic_ios<CTy,CTr>& formatted(std::basic_ios<CTy,CTr>&);\n\t\ttemplate<typename FTy, typename CTy, typename CTr>\n\t\tstd::basic_ios<CTy,CTr>& unformattet(std::basic_ios<CTy,CTr>&);\n\n\t\ttemplate<typename CTy, typename CTr>\n\t\tstd::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, precision const&);\n\t\ttemplate<typename CTy, typename CTr>\n\t\tstd::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, width const&);\n\t\ttemplate<typename CTy, typename CTr>\n\t\tstd::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, delimeter<CTy> const&);\n\t\ttemplate<typename CTy, typename CTr>\n\t\tstd::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, order const&);\n\t}//namespace io\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tquat<T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<1, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<2, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<3, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<4, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 2, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 3, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 4, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 2, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 3, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 4, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 2, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 3, T, Q> const&);\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 4, T, Q> const&);\n\n  template<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_DECL std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr> &,\n                                                         std::pair<mat<4, 4, T, Q> const, mat<4, 4, T, Q> const> const&);\n\n\t/// @}\n}//namespace glm\n\n#include \"io.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/io.inl",
    "content": "/// @ref gtx_io\n/// @file glm/gtx/io.inl\n/// @author Jan P Springer (regnirpsj@gmail.com)\n\n#include <iomanip>                  // std::fixed, std::setfill<>, std::setprecision, std::right, std::setw\n#include <ostream>                  // std::basic_ostream<>\n#include \"../gtc/matrix_access.hpp\" // glm::col, glm::row\n#include \"../gtx/type_trait.hpp\"    // glm::type<>\n\nnamespace glm{\nnamespace io\n{\n\ttemplate<typename CTy>\n\tGLM_FUNC_QUALIFIER format_punct<CTy>::format_punct(size_t a)\n\t\t: std::locale::facet(a)\n\t\t, formatted(true)\n\t\t, precision(3)\n\t\t, width(1 + 4 + 1 + precision)\n\t\t, separator(',')\n\t\t, delim_left('[')\n\t\t, delim_right(']')\n\t\t, space(' ')\n\t\t, newline('\\n')\n\t\t, order(column_major)\n\t{}\n\n\ttemplate<typename CTy>\n\tGLM_FUNC_QUALIFIER format_punct<CTy>::format_punct(format_punct const& a)\n\t\t: std::locale::facet(0)\n\t\t, formatted(a.formatted)\n\t\t, precision(a.precision)\n\t\t, width(a.width)\n\t\t, separator(a.separator)\n\t\t, delim_left(a.delim_left)\n\t\t, delim_right(a.delim_right)\n\t\t, space(a.space)\n\t\t, newline(a.newline)\n\t\t, order(a.order)\n\t{}\n\n\ttemplate<typename CTy> std::locale::id format_punct<CTy>::id;\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER basic_state_saver<CTy, CTr>::basic_state_saver(std::basic_ios<CTy, CTr>& a)\n\t\t: state_(a)\n\t\t, flags_(a.flags())\n\t\t, precision_(a.precision())\n\t\t, width_(a.width())\n\t\t, fill_(a.fill())\n\t\t, locale_(a.getloc())\n\t{}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER basic_state_saver<CTy, CTr>::~basic_state_saver()\n\t{\n\t\tstate_.imbue(locale_);\n\t\tstate_.fill(fill_);\n\t\tstate_.width(width_);\n\t\tstate_.precision(precision_);\n\t\tstate_.flags(flags_);\n\t}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER basic_format_saver<CTy, CTr>::basic_format_saver(std::basic_ios<CTy, CTr>& a)\n\t\t: bss_(a)\n\t{\n\t\ta.imbue(std::locale(a.getloc(), new format_punct<CTy>(get_facet<format_punct<CTy> >(a))));\n\t}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER\n\tbasic_format_saver<CTy, CTr>::~basic_format_saver()\n\t{}\n\n\tGLM_FUNC_QUALIFIER precision::precision(unsigned a)\n\t\t: value(a)\n\t{}\n\n\tGLM_FUNC_QUALIFIER width::width(unsigned a)\n\t\t: value(a)\n\t{}\n\n\ttemplate<typename CTy>\n\tGLM_FUNC_QUALIFIER delimeter<CTy>::delimeter(CTy a, CTy b, CTy c)\n\t\t: value()\n\t{\n\t\tvalue[0] = a;\n\t\tvalue[1] = b;\n\t\tvalue[2] = c;\n\t}\n\n\tGLM_FUNC_QUALIFIER order::order(order_type a)\n\t\t: value(a)\n\t{}\n\n\ttemplate<typename FTy, typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER FTy const& get_facet(std::basic_ios<CTy, CTr>& ios)\n\t{\n\t\tif(!std::has_facet<FTy>(ios.getloc()))\n\t\t\tios.imbue(std::locale(ios.getloc(), new FTy));\n\n\t\treturn std::use_facet<FTy>(ios.getloc());\n\t}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER std::basic_ios<CTy, CTr>& formatted(std::basic_ios<CTy, CTr>& ios)\n\t{\n\t\tconst_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(ios)).formatted = true;\n\t\treturn ios;\n\t}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER std::basic_ios<CTy, CTr>& unformatted(std::basic_ios<CTy, CTr>& ios)\n\t{\n\t\tconst_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(ios)).formatted = false;\n\t\treturn ios;\n\t}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, precision const& a)\n\t{\n\t\tconst_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).precision = a.value;\n\t\treturn os;\n\t}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, width const& a)\n\t{\n\t\tconst_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).width = a.value;\n\t\treturn os;\n\t}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER  std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, delimeter<CTy> const& a)\n\t{\n\t\tformat_punct<CTy> & fmt(const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)));\n\n\t\tfmt.delim_left  = a.value[0];\n\t\tfmt.delim_right = a.value[1];\n\t\tfmt.separator   = a.value[2];\n\n\t\treturn os;\n\t}\n\n\ttemplate<typename CTy, typename CTr>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, order const& a)\n\t{\n\t\tconst_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).order = a.value;\n\t\treturn os;\n\t}\n} // namespace io\n\nnamespace detail\n{\n\ttemplate<typename CTy, typename CTr, typename V>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>&\n\tprint_vector_on(std::basic_ostream<CTy, CTr>& os, V const& a)\n\t{\n\t\ttypename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n\t\tif(cerberus)\n\t\t{\n\t\t\tio::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os));\n\n\t\t\tlength_t const& components(type<V>::components);\n\n\t\t\tif(fmt.formatted)\n\t\t\t{\n\t\t\t\tio::basic_state_saver<CTy> const bss(os);\n\n\t\t\t\tos << std::fixed << std::right << std::setprecision(fmt.precision) << std::setfill(fmt.space) << fmt.delim_left;\n\n\t\t\t\tfor(length_t i(0); i < components; ++i)\n\t\t\t\t{\n\t\t\t\t\tos << std::setw(fmt.width) << a[i];\n\t\t\t\t\tif(components-1 != i)\n\t\t\t\t\t\tos << fmt.separator;\n\t\t\t\t}\n\n\t\t\t\tos << fmt.delim_right;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor(length_t i(0); i < components; ++i)\n\t\t\t\t{\n\t\t\t\t\tos << a[i];\n\n\t\t\t\t\tif(components-1 != i)\n\t\t\t\t\t\tos << fmt.space;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn os;\n\t}\n}//namespace detail\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tquat<T, Q> const& a)\n\t{\n\t\treturn detail::print_vector_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<1, T, Q> const& a)\n\t{\n\t\treturn detail::print_vector_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<2, T, Q> const& a)\n\t{\n\t\treturn detail::print_vector_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<3, T, Q> const& a)\n\t{\n\t\treturn detail::print_vector_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<4, T, Q> const& a)\n\t{\n\t\treturn detail::print_vector_on(os, a);\n\t}\n\nnamespace detail\n{\n\ttemplate<typename CTy, typename CTr, template<length_t, length_t, typename, qualifier> class M, length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& print_matrix_on(std::basic_ostream<CTy, CTr>& os, M<C, R, T, Q> const& a)\n\t{\n\t\ttypename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);\n\n\t\tif(cerberus)\n\t\t{\n\t\t\tio::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os));\n\n\t\t\tlength_t const& cols(type<M<C, R, T, Q> >::cols);\n\t\t\tlength_t const& rows(type<M<C, R, T, Q> >::rows);\n\n\t\t\tif(fmt.formatted)\n\t\t\t{\n\t\t\t\tos << fmt.newline << fmt.delim_left;\n\n\t\t\t\tswitch(fmt.order)\n\t\t\t\t{\n\t\t\t\t\tcase io::column_major:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(length_t i(0); i < rows; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (0 != i)\n\t\t\t\t\t\t\t\tos << fmt.space;\n\n\t\t\t\t\t\t\tos << row(a, i);\n\n\t\t\t\t\t\t\tif(rows-1 != i)\n\t\t\t\t\t\t\t\tos << fmt.newline;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase io::row_major:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(length_t i(0); i < cols; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(0 != i)\n\t\t\t\t\t\t\t\tos << fmt.space;\n\n\t\t\t\t\t\t\tos << column(a, i);\n\n\t\t\t\t\t\t\tif(cols-1 != i)\n\t\t\t\t\t\t\t\tos << fmt.newline;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tos << fmt.delim_right;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tswitch (fmt.order)\n\t\t\t\t{\n\t\t\t\t\tcase io::column_major:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(length_t i(0); i < cols; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tos << column(a, i);\n\n\t\t\t\t\t\t\tif(cols - 1 != i)\n\t\t\t\t\t\t\t\tos << fmt.space;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase io::row_major:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (length_t i(0); i < rows; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tos << row(a, i);\n\n\t\t\t\t\t\t\tif (rows-1 != i)\n\t\t\t\t\t\t\t\tos << fmt.space;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn os;\n\t}\n}//namespace detail\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 2, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 3, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 4, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 2, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 3, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 4, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 2, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 3, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 4, T, Q> const& a)\n\t{\n\t\treturn detail::print_matrix_on(os, a);\n\t}\n\nnamespace detail\n{\n\ttemplate<typename CTy, typename CTr, template<length_t, length_t, typename, qualifier> class M, length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& print_matrix_pair_on(std::basic_ostream<CTy, CTr>& os, std::pair<M<C, R, T, Q> const, M<C, R, T, Q> const> const& a)\n\t{\n\t\ttypename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);\n\n\t\tif(cerberus)\n\t\t{\n\t\t\tio::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os));\n\t\t\tM<C, R, T, Q> const& ml(a.first);\n\t\t\tM<C, R, T, Q> const& mr(a.second);\n\t\t\tlength_t const& cols(type<M<C, R, T, Q> >::cols);\n\t\t\tlength_t const& rows(type<M<C, R, T, Q> >::rows);\n\n\t\t\tif(fmt.formatted)\n\t\t\t{\n\t\t\t\tos << fmt.newline << fmt.delim_left;\n\n\t\t\t\tswitch(fmt.order)\n\t\t\t\t{\n\t\t\t\t\tcase io::column_major:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(length_t i(0); i < rows; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(0 != i)\n\t\t\t\t\t\t\t\tos << fmt.space;\n\n\t\t\t\t\t\t\tos << row(ml, i) << ((rows-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << row(mr, i);\n\n\t\t\t\t\t\t\tif(rows-1 != i)\n\t\t\t\t\t\t\t\tos << fmt.newline;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase io::row_major:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(length_t i(0); i < cols; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(0 != i)\n\t\t\t\t\t\t\t\tos << fmt.space;\n\n\t\t\t\t\t\t\tos << column(ml, i) << ((cols-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << column(mr, i);\n\n\t\t\t\t\t\t\tif(cols-1 != i)\n\t\t\t\t\t\t\t\tos << fmt.newline;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tos << fmt.delim_right;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tos << ml << fmt.space << mr;\n\t\t\t}\n\t\t}\n\n\t\treturn os;\n\t}\n}//namespace detail\n\n\ttemplate<typename CTy, typename CTr, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n\t\tstd::basic_ostream<CTy, CTr> & os,\n\t\tstd::pair<mat<4, 4, T, Q> const,\n\t\tmat<4, 4, T, Q> const> const& a)\n\t{\n\t\treturn detail::print_matrix_pair_on(os, a);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/log_base.hpp",
    "content": "/// @ref gtx_log_base\n/// @file glm/gtx/log_base.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_log_base GLM_GTX_log_base\n/// @ingroup gtx\n///\n/// Include <glm/gtx/log_base.hpp> to use the features of this extension.\n///\n/// Logarithm for any base. base can be a vector or a scalar.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_log_base is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_log_base extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_log_base\n\t/// @{\n\n\t/// Logarithm for any base.\n\t/// From GLM_GTX_log_base.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType log(\n\t\tgenType const& x,\n\t\tgenType const& base);\n\n\t/// Logarithm for any base.\n\t/// From GLM_GTX_log_base.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> sign(\n\t\tvec<L, T, Q> const& x,\n\t\tvec<L, T, Q> const& base);\n\n\t/// @}\n}//namespace glm\n\n#include \"log_base.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/log_base.inl",
    "content": "/// @ref gtx_log_base\n/// @file glm/gtx/log_base.inl\n\nnamespace glm\n{\n\ttemplate<typename genType> \n\tGLM_FUNC_QUALIFIER genType log(genType const& x, genType const& base)\n\t{\n\t\tassert(!detail::compute_equal<genType>::call(x, static_cast<genType>(0)));\n\t\treturn glm::log(x) / glm::log(base);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> log(vec<L, T, Q> const& x, vec<L, T, Q> const& base)\n\t{\n\t\treturn glm::log(x) / glm::log(base);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_cross_product.hpp",
    "content": "/// @ref gtx_matrix_cross_product\n/// @file glm/gtx/matrix_cross_product.hpp\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_matrix_cross_product GLM_GTX_matrix_cross_product\n/// @ingroup gtx\n///\n/// Include <glm/gtx/matrix_cross_product.hpp> to use the features of this extension.\n///\n/// Build cross product matrices\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_matrix_cross_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_matrix_cross_product extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_matrix_cross_product\n\t/// @{\n\n\t//! Build a cross product matrix.\n\t//! From GLM_GTX_matrix_cross_product extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> matrixCross3(\n\t\tvec<3, T, Q> const& x);\n\t\t\n\t//! Build a cross product matrix.\n\t//! From GLM_GTX_matrix_cross_product extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> matrixCross4(\n\t\tvec<3, T, Q> const& x);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_cross_product.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_cross_product.inl",
    "content": "/// @ref gtx_matrix_cross_product\n/// @file glm/gtx/matrix_cross_product.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> matrixCross3\n\t(\n\t\tvec<3, T, Q> const& x\n\t)\n\t{\n\t\tmat<3, 3, T, Q> Result(T(0));\n\t\tResult[0][1] = x.z;\n\t\tResult[1][0] = -x.z;\n\t\tResult[0][2] = -x.y;\n\t\tResult[2][0] = x.y;\n\t\tResult[1][2] = x.x;\n\t\tResult[2][1] = -x.x;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> matrixCross4\n\t(\n\t\tvec<3, T, Q> const& x\n\t)\n\t{\n\t\tmat<4, 4, T, Q> Result(T(0));\n\t\tResult[0][1] = x.z;\n\t\tResult[1][0] = -x.z;\n\t\tResult[0][2] = -x.y;\n\t\tResult[2][0] = x.y;\n\t\tResult[1][2] = x.x;\n\t\tResult[2][1] = -x.x;\n\t\treturn Result;\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_decompose.hpp",
    "content": "/// @ref gtx_matrix_decompose\n/// @file glm/gtx/matrix_decompose.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_matrix_decompose GLM_GTX_matrix_decompose\n/// @ingroup gtx\n///\n/// Include <glm/gtx/matrix_decompose.hpp> to use the features of this extension.\n///\n/// Decomposes a model matrix to translations, rotation and scale components\n\n#pragma once\n\n// Dependencies\n#include \"../mat4x4.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../geometric.hpp\"\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtc/matrix_transform.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_matrix_decompose is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_matrix_decompose extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_matrix_decompose\n\t/// @{\n\n\t/// Decomposes a model matrix to translations, rotation and scale components \n\t/// @see gtx_matrix_decompose\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool decompose(\n\t\tmat<4, 4, T, Q> const& modelMatrix,\n\t\tvec<3, T, Q> & scale, tquat<T, Q> & orientation, vec<3, T, Q> & translation, vec<3, T, Q> & skew, vec<4, T, Q> & perspective);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_decompose.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_decompose.inl",
    "content": "/// @ref gtx_matrix_decompose\n/// @file glm/gtx/matrix_decompose.inl\n\n#include \"../gtc/constants.hpp\"\n#include \"../gtc/epsilon.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\t/// Make a linear combination of two vectors and return the result.\n\t// result = (a * ascl) + (b * bscl)\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> combine(\n\t\tvec<3, T, Q> const& a, \n\t\tvec<3, T, Q> const& b,\n\t\tT ascl, T bscl)\n\t{\n\t\treturn (a * ascl) + (b * bscl);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> scale(vec<3, T, Q> const& v, T desiredLength)\n\t{\n\t\treturn v * desiredLength / length(v);\n\t}\n}//namespace detail\n\n\t// Matrix decompose\n\t// http://www.opensource.apple.com/source/WebCore/WebCore-514/platform/graphics/transforms/TransformationMatrix.cpp\n\t// Decomposes the mode matrix to translations,rotation scale components\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool decompose(mat<4, 4, T, Q> const& ModelMatrix, vec<3, T, Q> & Scale, tquat<T, Q> & Orientation, vec<3, T, Q> & Translation, vec<3, T, Q> & Skew, vec<4, T, Q> & Perspective)\n\t{\n\t\tmat<4, 4, T, Q> LocalMatrix(ModelMatrix);\n\n\t\t// Normalize the matrix.\n\t\tif(epsilonEqual(LocalMatrix[3][3], static_cast<T>(0), epsilon<T>()))\n\t\t\treturn false;\n\n\t\tfor(length_t i = 0; i < 4; ++i)\n\t\tfor(length_t j = 0; j < 4; ++j)\n\t\t\tLocalMatrix[i][j] /= LocalMatrix[3][3];\n\n\t\t// perspectiveMatrix is used to solve for perspective, but it also provides\n\t\t// an easy way to test for singularity of the upper 3x3 component.\n\t\tmat<4, 4, T, Q> PerspectiveMatrix(LocalMatrix);\n\n\t\tfor(length_t i = 0; i < 3; i++)\n\t\t\tPerspectiveMatrix[i][3] = static_cast<T>(0);\n\t\tPerspectiveMatrix[3][3] = static_cast<T>(1);\n\n\t\t/// TODO: Fixme!\n\t\tif(epsilonEqual(determinant(PerspectiveMatrix), static_cast<T>(0), epsilon<T>()))\n\t\t\treturn false;\n\n\t\t// First, isolate perspective.  This is the messiest.\n\t\tif(\n\t\t\tepsilonNotEqual(LocalMatrix[0][3], static_cast<T>(0), epsilon<T>()) || \n\t\t\tepsilonNotEqual(LocalMatrix[1][3], static_cast<T>(0), epsilon<T>()) || \n\t\t\tepsilonNotEqual(LocalMatrix[2][3], static_cast<T>(0), epsilon<T>()))\n\t\t{\n\t\t\t// rightHandSide is the right hand side of the equation.\n\t\t\tvec<4, T, Q> RightHandSide;\n\t\t\tRightHandSide[0] = LocalMatrix[0][3];\n\t\t\tRightHandSide[1] = LocalMatrix[1][3];\n\t\t\tRightHandSide[2] = LocalMatrix[2][3];\n\t\t\tRightHandSide[3] = LocalMatrix[3][3];\n\n\t\t\t// Solve the equation by inverting PerspectiveMatrix and multiplying\n\t\t\t// rightHandSide by the inverse.  (This is the easiest way, not\n\t\t\t// necessarily the best.)\n\t\t\tmat<4, 4, T, Q> InversePerspectiveMatrix = glm::inverse(PerspectiveMatrix);//   inverse(PerspectiveMatrix, inversePerspectiveMatrix);\n\t\t\tmat<4, 4, T, Q> TransposedInversePerspectiveMatrix = glm::transpose(InversePerspectiveMatrix);//   transposeMatrix4(inversePerspectiveMatrix, transposedInversePerspectiveMatrix);\n\n\t\t\tPerspective = TransposedInversePerspectiveMatrix * RightHandSide;\n\t\t\t//  v4MulPointByMatrix(rightHandSide, transposedInversePerspectiveMatrix, perspectivePoint);\n\n\t\t\t// Clear the perspective partition\n\t\t\tLocalMatrix[0][3] = LocalMatrix[1][3] = LocalMatrix[2][3] = static_cast<T>(0);\n\t\t\tLocalMatrix[3][3] = static_cast<T>(1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// No perspective.\n\t\t\tPerspective = vec<4, T, Q>(0, 0, 0, 1);\n\t\t}\n\n\t\t// Next take care of translation (easy).\n\t\tTranslation = vec<3, T, Q>(LocalMatrix[3]);\n\t\tLocalMatrix[3] = vec<4, T, Q>(0, 0, 0, LocalMatrix[3].w);\n\n\t\tvec<3, T, Q> Row[3], Pdum3;\n\n\t\t// Now get scale and shear.\n\t\tfor(length_t i = 0; i < 3; ++i)\n\t\tfor(length_t j = 0; j < 3; ++j)\n\t\t\tRow[i][j] = LocalMatrix[i][j];\n\n\t\t// Compute X scale factor and normalize first row.\n\t\tScale.x = length(Row[0]);// v3Length(Row[0]);\n\n\t\tRow[0] = detail::scale(Row[0], static_cast<T>(1));\n\n\t\t// Compute XY shear factor and make 2nd row orthogonal to 1st.\n\t\tSkew.z = dot(Row[0], Row[1]);\n\t\tRow[1] = detail::combine(Row[1], Row[0], static_cast<T>(1), -Skew.z);\n\n\t\t// Now, compute Y scale and normalize 2nd row.\n\t\tScale.y = length(Row[1]);\n\t\tRow[1] = detail::scale(Row[1], static_cast<T>(1));\n\t\tSkew.z /= Scale.y;\n\n\t\t// Compute XZ and YZ shears, orthogonalize 3rd row.\n\t\tSkew.y = glm::dot(Row[0], Row[2]);\n\t\tRow[2] = detail::combine(Row[2], Row[0], static_cast<T>(1), -Skew.y);\n\t\tSkew.x = glm::dot(Row[1], Row[2]);\n\t\tRow[2] = detail::combine(Row[2], Row[1], static_cast<T>(1), -Skew.x);\n\n\t\t// Next, get Z scale and normalize 3rd row.\n\t\tScale.z = length(Row[2]);\n\t\tRow[2] = detail::scale(Row[2], static_cast<T>(1));\n\t\tSkew.y /= Scale.z;\n\t\tSkew.x /= Scale.z;\n\n\t\t// At this point, the matrix (in rows[]) is orthonormal.\n\t\t// Check for a coordinate system flip.  If the determinant\n\t\t// is -1, then negate the matrix and the scaling factors.\n\t\tPdum3 = cross(Row[1], Row[2]); // v3Cross(row[1], row[2], Pdum3);\n\t\tif(dot(Row[0], Pdum3) < 0)\n\t\t{\n\t\t\tfor(length_t i = 0; i < 3; i++)\n\t\t\t{\n\t\t\t\tScale[i] *= static_cast<T>(-1);\n\t\t\t\tRow[i] *= static_cast<T>(-1);\n\t\t\t}\n\t\t}\n\n\t\t// Now, get the rotations out, as described in the gem.\n\n\t\t// FIXME - Add the ability to return either quaternions (which are\n\t\t// easier to recompose with) or Euler angles (rx, ry, rz), which\n\t\t// are easier for authors to deal with. The latter will only be useful\n\t\t// when we fix https://bugs.webkit.org/show_bug.cgi?id=23799, so I\n\t\t// will leave the Euler angle code here for now.\n\n\t\t// ret.rotateY = asin(-Row[0][2]);\n\t\t// if (cos(ret.rotateY) != 0) {\n\t\t//     ret.rotateX = atan2(Row[1][2], Row[2][2]);\n\t\t//     ret.rotateZ = atan2(Row[0][1], Row[0][0]);\n\t\t// } else {\n\t\t//     ret.rotateX = atan2(-Row[2][0], Row[1][1]);\n\t\t//     ret.rotateZ = 0;\n\t\t// }\n\n\t\tint i, j, k = 0;\n\t\tfloat root, trace = Row[0].x + Row[1].y + Row[2].z;\n\t\tif(trace > static_cast<T>(0))\n\t\t{\n\t\t\troot = sqrt(trace + static_cast<T>(1.0));\n\t\t\tOrientation.w = static_cast<T>(0.5) * root;\n\t\t\troot = static_cast<T>(0.5) / root;\n\t\t\tOrientation.x = root * (Row[1].z - Row[2].y);\n\t\t\tOrientation.y = root * (Row[2].x - Row[0].z);\n\t\t\tOrientation.z = root * (Row[0].y - Row[1].x);\n\t\t} // End if > 0\n\t\telse\n\t\t{\n\t\t\tstatic int Next[3] = {1, 2, 0};\n\t\t\ti = 0;\n\t\t\tif(Row[1].y > Row[0].x) i = 1;\n\t\t\tif(Row[2].z > Row[i][i]) i = 2;\n\t\t\tj = Next[i];\n\t\t\tk = Next[j];\n\n\t\t\troot = sqrt(Row[i][i] - Row[j][j] - Row[k][k] + static_cast<T>(1.0));\n\n\t\t\tOrientation[i] = static_cast<T>(0.5) * root;\n\t\t\troot = static_cast<T>(0.5) / root;\n\t\t\tOrientation[j] = root * (Row[i][j] + Row[j][i]);\n\t\t\tOrientation[k] = root * (Row[i][k] + Row[k][i]);\n\t\t\tOrientation.w = root * (Row[j][k] - Row[k][j]);\n\t\t} // End if <= 0\n\n\t\treturn true;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_factorisation.hpp",
    "content": "/// @ref gtx_matrix_factorisation\n/// @file glm/gtx/matrix_factorisation.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_matrix_factorisation GLM_GTX_matrix_factorisation\n/// @ingroup gtx\n///\n/// Include <glm/gtx/matrix_factorisation.hpp> to use the features of this extension.\n///\n/// Functions to factor matrices in various forms\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_matrix_factorisation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_matrix_factorisation extension included\")\n#endif\n\n/*\nSuggestions:\n - Move helper functions flipud and fliplr to another file: They may be helpful in more general circumstances.\n - Implement other types of matrix factorisation, such as: QL and LQ, L(D)U, eigendecompositions, etc...\n*/\n\nnamespace glm\n{\n\t/// @addtogroup gtx_matrix_factorisation\n\t/// @{\n\n\t/// Flips the matrix rows up and down.\n\t///\n\t/// From GLM_GTX_matrix_factorisation extension.\n\ttemplate <length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<C, R, T, Q> flipud(mat<C, R, T, Q> const& in);\n\n\t/// Flips the matrix columns right and left.\n\t///\n\t/// From GLM_GTX_matrix_factorisation extension.\n\ttemplate <length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<C, R, T, Q> fliplr(mat<C, R, T, Q> const& in);\n\n\t/// Performs QR factorisation of a matrix.\n\t/// Returns 2 matrices, q and r, such that the columns of q are orthonormal and span the same subspace than those of the input matrix, r is an upper triangular matrix, and q*r=in.\n\t/// Given an n-by-m input matrix, q has dimensions min(n,m)-by-m, and r has dimensions n-by-min(n,m).\n\t///\n\t/// From GLM_GTX_matrix_factorisation extension.\n\ttemplate <length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL void qr_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& q, mat<C, (C < R ? C : R), T, Q>& r);\n\n\t/// Performs RQ factorisation of a matrix.\n\t/// Returns 2 matrices, r and q, such that r is an upper triangular matrix, the rows of q are orthonormal and span the same subspace than those of the input matrix, and r*q=in.\n\t/// Note that in the context of RQ factorisation, the diagonal is seen as starting in the lower-right corner of the matrix, instead of the usual upper-left.\n\t/// Given an n-by-m input matrix, r has dimensions min(n,m)-by-m, and q has dimensions n-by-min(n,m).\n\t///\n\t/// From GLM_GTX_matrix_factorisation extension.\n\ttemplate <length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL void rq_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& r, mat<C, (C < R ? C : R), T, Q>& q);\n\n\t/// @}\n}\n\n#include \"matrix_factorisation.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_factorisation.inl",
    "content": "/// @ref gtx_matrix_factorisation\n/// @file glm/gtx/matrix_factorisation.inl\n\nnamespace glm\n{\n\ttemplate <length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<C, R, T, Q> flipud(mat<C, R, T, Q> const& in)\n\t{\n\t\tmat<R, C, T, Q> tin = transpose(in);\n\t\ttin = fliplr(tin);\n\t\tmat<C, R, T, Q> out = transpose(tin);\n\n\t\treturn out;\n\t}\n\n\ttemplate <length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<C, R, T, Q> fliplr(mat<C, R, T, Q> const& in)\n\t{\n\t\tmat<C, R, T, Q> out;\n\t\tfor (length_t i = 0; i < C; i++)\n\t\t{\n\t\t\tout[i] = in[(C - i) - 1];\n\t\t}\n\n\t\treturn out;\n\t}\n\n\ttemplate <length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER void qr_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& q, mat<C, (C < R ? C : R), T, Q>& r)\n\t{\n\t\t// Uses modified Gram-Schmidt method\n\t\t// Source: https://en.wikipedia.org/wiki/GramSchmidt_process\n\t\t// And https://en.wikipedia.org/wiki/QR_decomposition\n\n\t\t//For all the linearly independs columns of the input...\n\t\t// (there can be no more linearly independents columns than there are rows.)\n\t\tfor (length_t i = 0; i < (C < R ? C : R); i++)\n\t\t{\n\t\t\t//Copy in Q the input's i-th column.\n\t\t\tq[i] = in[i];\n\n\t\t\t//j = [0,i[\n\t\t\t// Make that column orthogonal to all the previous ones by substracting to it the non-orthogonal projection of all the previous columns.\n\t\t\t// Also: Fill the zero elements of R\n\t\t\tfor (length_t j = 0; j < i; j++)\n\t\t\t{\n\t\t\t\tq[i] -= dot(q[i], q[j])*q[j];\n\t\t\t\tr[j][i] = 0;\n\t\t\t}\n\n\t\t\t//Now, Q i-th column is orthogonal to all the previous columns. Normalize it.\n\t\t\tq[i] = normalize(q[i]);\n\n\t\t\t//j = [i,C[\n\t\t\t//Finally, compute the corresponding coefficients of R by computing the projection of the resulting column on the other columns of the input.\n\t\t\tfor (length_t j = i; j < C; j++)\n\t\t\t{\n\t\t\t\tr[j][i] = dot(in[j], q[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\ttemplate <length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER void rq_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& r, mat<C, (C < R ? C : R), T, Q>& q)\n\t{\n\t\t// From https://en.wikipedia.org/wiki/QR_decomposition:\n\t\t// The RQ decomposition transforms a matrix A into the product of an upper triangular matrix R (also known as right-triangular) and an orthogonal matrix Q. The only difference from QR decomposition is the order of these matrices.\n\t\t// QR decomposition is GramSchmidt orthogonalization of columns of A, started from the first column.\n\t\t// RQ decomposition is GramSchmidt orthogonalization of rows of A, started from the last row.\n\n\t\tmat<R, C, T, Q> tin = transpose(in);\n\t\ttin = fliplr(tin);\n\n\t\tmat<R, (C < R ? C : R), T, Q> tr;\n\t\tmat<(C < R ? C : R), C, T, Q> tq;\n\t\tqr_decompose(tin, tq, tr);\n\n\t\ttr = fliplr(tr);\n\t\tr = transpose(tr);\n\t\tr = fliplr(r);\n\n\t\ttq = fliplr(tq);\n\t\tq = transpose(tq);\n\t}\n} //namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_interpolation.hpp",
    "content": "/// @ref gtx_matrix_interpolation\n/// @file glm/gtx/matrix_interpolation.hpp\n/// @author Ghenadii Ursachi (the.asteroth@gmail.com)\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_matrix_interpolation GLM_GTX_matrix_interpolation\n/// @ingroup gtx\n///\n/// Include <glm/gtx/matrix_interpolation.hpp> to use the features of this extension.\n///\n/// Allows to directly interpolate two exiciting matrices.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_matrix_interpolation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_matrix_interpolation extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_matrix_interpolation\n\t/// @{\n\n\t/// Get the axis and angle of the rotation from a matrix.\n\t/// From GLM_GTX_matrix_interpolation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL void axisAngle(\n\t\tmat<4, 4, T, Q> const& mat,\n\t\tvec<3, T, Q> & axis,\n\t\tT & angle);\n\n\t/// Build a matrix from axis and angle.\n\t/// From GLM_GTX_matrix_interpolation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> axisAngleMatrix(\n\t\tvec<3, T, Q> const& axis,\n\t\tT const angle);\n\n\t/// Extracts the rotation part of a matrix.\n\t/// From GLM_GTX_matrix_interpolation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> extractMatrixRotation(\n\t\tmat<4, 4, T, Q> const& mat);\n\n\t/// Build a interpolation of 4 * 4 matrixes.\n\t/// From GLM_GTX_matrix_interpolation extension.\n\t/// Warning! works only with rotation and/or translation matrixes, scale will generate unexpected results.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> interpolate(\n\t\tmat<4, 4, T, Q> const& m1,\n\t\tmat<4, 4, T, Q> const& m2,\n\t\tT const delta);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_interpolation.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_interpolation.inl",
    "content": "/// @ref gtx_matrix_interpolation\n/// @file glm/gtx/matrix_interpolation.hpp\n\n#include \"../gtc/constants.hpp\"\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER void axisAngle(mat<4, 4, T, Q> const& mat, vec<3, T, Q> & axis, T & angle)\n\t{\n\t\tT epsilon = static_cast<T>(0.01);\n\t\tT epsilon2 = static_cast<T>(0.1);\n\n\t\tif((abs(mat[1][0] - mat[0][1]) < epsilon) && (abs(mat[2][0] - mat[0][2]) < epsilon) && (abs(mat[2][1] - mat[1][2]) < epsilon))\n\t\t{\n\t\t\tif ((abs(mat[1][0] + mat[0][1]) < epsilon2) && (abs(mat[2][0] + mat[0][2]) < epsilon2) && (abs(mat[2][1] + mat[1][2]) < epsilon2) && (abs(mat[0][0] + mat[1][1] + mat[2][2] - static_cast<T>(3.0)) < epsilon2))\n\t\t\t{\n\t\t\t\tangle = static_cast<T>(0.0);\n\t\t\t\taxis.x = static_cast<T>(1.0);\n\t\t\t\taxis.y = static_cast<T>(0.0);\n\t\t\t\taxis.z = static_cast<T>(0.0);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tangle = static_cast<T>(3.1415926535897932384626433832795);\n\t\t\tT xx = (mat[0][0] + static_cast<T>(1.0)) * static_cast<T>(0.5);\n\t\t\tT yy = (mat[1][1] + static_cast<T>(1.0)) * static_cast<T>(0.5);\n\t\t\tT zz = (mat[2][2] + static_cast<T>(1.0)) * static_cast<T>(0.5);\n\t\t\tT xy = (mat[1][0] + mat[0][1]) * static_cast<T>(0.25);\n\t\t\tT xz = (mat[2][0] + mat[0][2]) * static_cast<T>(0.25);\n\t\t\tT yz = (mat[2][1] + mat[1][2]) * static_cast<T>(0.25);\n\t\t\tif((xx > yy) && (xx > zz))\n\t\t\t{\n\t\t\t\tif(xx < epsilon)\n\t\t\t\t{\n\t\t\t\t\taxis.x = static_cast<T>(0.0);\n\t\t\t\t\taxis.y = static_cast<T>(0.7071);\n\t\t\t\t\taxis.z = static_cast<T>(0.7071);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\taxis.x = sqrt(xx);\n\t\t\t\t\taxis.y = xy / axis.x;\n\t\t\t\t\taxis.z = xz / axis.x;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (yy > zz)\n\t\t\t{\n\t\t\t\tif(yy < epsilon)\n\t\t\t\t{\n\t\t\t\t\taxis.x = static_cast<T>(0.7071);\n\t\t\t\t\taxis.y = static_cast<T>(0.0);\n\t\t\t\t\taxis.z = static_cast<T>(0.7071);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\taxis.y = sqrt(yy);\n\t\t\t\t\taxis.x = xy / axis.y;\n\t\t\t\t\taxis.z = yz / axis.y;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (zz < epsilon)\n\t\t\t\t{\n\t\t\t\t\taxis.x = static_cast<T>(0.7071);\n\t\t\t\t\taxis.y = static_cast<T>(0.7071);\n\t\t\t\t\taxis.z = static_cast<T>(0.0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\taxis.z = sqrt(zz);\n\t\t\t\t\taxis.x = xz / axis.z;\n\t\t\t\t\taxis.y = yz / axis.z;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tT s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) + (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) + (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1]));\n\t\tif (glm::abs(s) < T(0.001))\n\t\t\ts = static_cast<T>(1);\n\t\tT const angleCos = (mat[0][0] + mat[1][1] + mat[2][2] - static_cast<T>(1)) * static_cast<T>(0.5);\n\t\tif(angleCos - static_cast<T>(1) < epsilon)\n\t\t\tangle = pi<T>() * static_cast<T>(0.25);\n\t\telse\n\t\t\tangle = acos(angleCos);\n\t\taxis.x = (mat[1][2] - mat[2][1]) / s;\n\t\taxis.y = (mat[2][0] - mat[0][2]) / s;\n\t\taxis.z = (mat[0][1] - mat[1][0]) / s;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> axisAngleMatrix(vec<3, T, Q> const& axis, T const angle)\n\t{\n\t\tT c = cos(angle);\n\t\tT s = sin(angle);\n\t\tT t = static_cast<T>(1) - c;\n\t\tvec<3, T, Q> n = normalize(axis);\n\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tt * n.x * n.x + c,          t * n.x * n.y + n.z * s,    t * n.x * n.z - n.y * s,    static_cast<T>(0.0),\n\t\t\tt * n.x * n.y - n.z * s,    t * n.y * n.y + c,          t * n.y * n.z + n.x * s,    static_cast<T>(0.0),\n\t\t\tt * n.x * n.z + n.y * s,    t * n.y * n.z - n.x * s,    t * n.z * n.z + c,          static_cast<T>(0.0),\n\t\t\tstatic_cast<T>(0.0),        static_cast<T>(0.0),        static_cast<T>(0.0),        static_cast<T>(1.0));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> extractMatrixRotation(mat<4, 4, T, Q> const& m)\n\t{\n\t\treturn mat<4, 4, T, Q>(\n\t\t\tm[0][0], m[0][1], m[0][2], static_cast<T>(0.0),\n\t\t\tm[1][0], m[1][1], m[1][2], static_cast<T>(0.0),\n\t\t\tm[2][0], m[2][1], m[2][2], static_cast<T>(0.0),\n\t\t\tstatic_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(1.0));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> interpolate(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2, T const delta)\n\t{\n\t\tmat<4, 4, T, Q> m1rot = extractMatrixRotation(m1);\n\t\tmat<4, 4, T, Q> dltRotation = m2 * transpose(m1rot);\n\t\tvec<3, T, Q> dltAxis;\n\t\tT dltAngle;\n\t\taxisAngle(dltRotation, dltAxis, dltAngle);\n\t\tmat<4, 4, T, Q> out = axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot;\n\t\tout[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]);\n\t\tout[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]);\n\t\tout[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]);\n\t\treturn out;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_major_storage.hpp",
    "content": "/// @ref gtx_matrix_major_storage\n/// @file glm/gtx/matrix_major_storage.hpp\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_matrix_major_storage GLM_GTX_matrix_major_storage\n/// @ingroup gtx\n///\n/// Include <glm/gtx/matrix_major_storage.hpp> to use the features of this extension.\n///\n/// Build matrices with specific matrix order, row or column\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_matrix_major_storage is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_matrix_major_storage extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_matrix_major_storage\n\t/// @{\n\n\t//! Build a row major matrix from row vectors.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2(\n\t\tvec<2, T, Q> const& v1, \n\t\tvec<2, T, Q> const& v2);\n\t\t\n\t//! Build a row major matrix from other matrix.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2(\n\t\tmat<2, 2, T, Q> const& m);\n\n\t//! Build a row major matrix from row vectors.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3(\n\t\tvec<3, T, Q> const& v1, \n\t\tvec<3, T, Q> const& v2, \n\t\tvec<3, T, Q> const& v3);\n\n\t//! Build a row major matrix from other matrix.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3(\n\t\tmat<3, 3, T, Q> const& m);\n\n\t//! Build a row major matrix from row vectors.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4(\n\t\tvec<4, T, Q> const& v1, \n\t\tvec<4, T, Q> const& v2,\n\t\tvec<4, T, Q> const& v3, \n\t\tvec<4, T, Q> const& v4);\n\n\t//! Build a row major matrix from other matrix.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4(\n\t\tmat<4, 4, T, Q> const& m);\n\n\t//! Build a column major matrix from column vectors.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> colMajor2(\n\t\tvec<2, T, Q> const& v1, \n\t\tvec<2, T, Q> const& v2);\n\t\t\n\t//! Build a column major matrix from other matrix.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> colMajor2(\n\t\tmat<2, 2, T, Q> const& m);\n\n\t//! Build a column major matrix from column vectors.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> colMajor3(\n\t\tvec<3, T, Q> const& v1, \n\t\tvec<3, T, Q> const& v2, \n\t\tvec<3, T, Q> const& v3);\n\t\t\n\t//! Build a column major matrix from other matrix.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> colMajor3(\n\t\tmat<3, 3, T, Q> const& m);\n\t\t\n\t//! Build a column major matrix from column vectors.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> colMajor4(\n\t\tvec<4, T, Q> const& v1, \n\t\tvec<4, T, Q> const& v2, \n\t\tvec<4, T, Q> const& v3, \n\t\tvec<4, T, Q> const& v4);\n\t\t\t\t\n\t//! Build a column major matrix from other matrix.\n\t//! From GLM_GTX_matrix_major_storage extension.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL mat<4, 4, T, Q> colMajor4(\n\t\tmat<4, 4, T, Q> const& m);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_major_storage.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_major_storage.inl",
    "content": "/// @ref gtx_matrix_major_storage\n/// @file glm/gtx/matrix_major_storage.hpp\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2\n\t(\n\t\tvec<2, T, Q> const& v1, \n\t\tvec<2, T, Q> const& v2\n\t)\n\t{\n\t\tmat<2, 2, T, Q> Result;\n\t\tResult[0][0] = v1.x;\n\t\tResult[1][0] = v1.y;\n\t\tResult[0][1] = v2.x;\n\t\tResult[1][1] = v2.y;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2(\n\t\tconst mat<2, 2, T, Q>& m)\n\t{\n\t\tmat<2, 2, T, Q> Result;\n\t\tResult[0][0] = m[0][0];\n\t\tResult[0][1] = m[1][0];\n\t\tResult[1][0] = m[0][1];\n\t\tResult[1][1] = m[1][1];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3(\n\t\tconst vec<3, T, Q>& v1, \n\t\tconst vec<3, T, Q>& v2, \n\t\tconst vec<3, T, Q>& v3)\n\t{\n\t\tmat<3, 3, T, Q> Result;\n\t\tResult[0][0] = v1.x;\n\t\tResult[1][0] = v1.y;\n\t\tResult[2][0] = v1.z;\n\t\tResult[0][1] = v2.x;\n\t\tResult[1][1] = v2.y;\n\t\tResult[2][1] = v2.z;\n\t\tResult[0][2] = v3.x;\n\t\tResult[1][2] = v3.y;\n\t\tResult[2][2] = v3.z;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3(\n\t\tconst mat<3, 3, T, Q>& m)\n\t{\n\t\tmat<3, 3, T, Q> Result;\n\t\tResult[0][0] = m[0][0];\n\t\tResult[0][1] = m[1][0];\n\t\tResult[0][2] = m[2][0];\n\t\tResult[1][0] = m[0][1];\n\t\tResult[1][1] = m[1][1];\n\t\tResult[1][2] = m[2][1];\n\t\tResult[2][0] = m[0][2];\n\t\tResult[2][1] = m[1][2];\n\t\tResult[2][2] = m[2][2];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4(\n\t\tconst vec<4, T, Q>& v1, \n\t\tconst vec<4, T, Q>& v2, \n\t\tconst vec<4, T, Q>& v3, \n\t\tconst vec<4, T, Q>& v4)\n\t{\n\t\tmat<4, 4, T, Q> Result;\n\t\tResult[0][0] = v1.x;\n\t\tResult[1][0] = v1.y;\n\t\tResult[2][0] = v1.z;\n\t\tResult[3][0] = v1.w;\n\t\tResult[0][1] = v2.x;\n\t\tResult[1][1] = v2.y;\n\t\tResult[2][1] = v2.z;\n\t\tResult[3][1] = v2.w;\n\t\tResult[0][2] = v3.x;\n\t\tResult[1][2] = v3.y;\n\t\tResult[2][2] = v3.z;\n\t\tResult[3][2] = v3.w;\n\t\tResult[0][3] = v4.x;\n\t\tResult[1][3] = v4.y;\n\t\tResult[2][3] = v4.z;\n\t\tResult[3][3] = v4.w;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4(\n\t\tconst mat<4, 4, T, Q>& m)\n\t{\n\t\tmat<4, 4, T, Q> Result;\n\t\tResult[0][0] = m[0][0];\n\t\tResult[0][1] = m[1][0];\n\t\tResult[0][2] = m[2][0];\n\t\tResult[0][3] = m[3][0];\n\t\tResult[1][0] = m[0][1];\n\t\tResult[1][1] = m[1][1];\n\t\tResult[1][2] = m[2][1];\n\t\tResult[1][3] = m[3][1];\n\t\tResult[2][0] = m[0][2];\n\t\tResult[2][1] = m[1][2];\n\t\tResult[2][2] = m[2][2];\n\t\tResult[2][3] = m[3][2];\n\t\tResult[3][0] = m[0][3];\n\t\tResult[3][1] = m[1][3];\n\t\tResult[3][2] = m[2][3];\n\t\tResult[3][3] = m[3][3];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2(\n\t\tconst vec<2, T, Q>& v1, \n\t\tconst vec<2, T, Q>& v2)\n\t{\n\t\treturn mat<2, 2, T, Q>(v1, v2);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2(\n\t\tconst mat<2, 2, T, Q>& m)\n\t{\n\t\treturn mat<2, 2, T, Q>(m);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3(\n\t\tconst vec<3, T, Q>& v1, \n\t\tconst vec<3, T, Q>& v2, \n\t\tconst vec<3, T, Q>& v3)\n\t{\n\t\treturn mat<3, 3, T, Q>(v1, v2, v3);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3(\n\t\tconst mat<3, 3, T, Q>& m)\n\t{\n\t\treturn mat<3, 3, T, Q>(m);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4(\n\t\tconst vec<4, T, Q>& v1, \n\t\tconst vec<4, T, Q>& v2, \n\t\tconst vec<4, T, Q>& v3, \n\t\tconst vec<4, T, Q>& v4)\n\t{\n\t\treturn mat<4, 4, T, Q>(v1, v2, v3, v4);\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4(\n\t\tconst mat<4, 4, T, Q>& m)\n\t{\n\t\treturn mat<4, 4, T, Q>(m);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_operation.hpp",
    "content": "/// @ref gtx_matrix_operation\n/// @file glm/gtx/matrix_operation.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_matrix_operation GLM_GTX_matrix_operation\n/// @ingroup gtx\n///\n/// Include <glm/gtx/matrix_operation.hpp> to use the features of this extension.\n///\n/// Build diagonal matrices from vectors.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_matrix_operation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_matrix_operation extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_matrix_operation\n\t/// @{\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 2, T, Q> diagonal2x2(\n\t\tvec<2, T, Q> const& v);\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 3, T, Q> diagonal2x3(\n\t\tvec<2, T, Q> const& v);\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<2, 4, T, Q> diagonal2x4(\n\t\tvec<2, T, Q> const& v);\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 2, T, Q> diagonal3x2(\n\t\tvec<2, T, Q> const& v);\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> diagonal3x3(\n\t\tvec<3, T, Q> const& v);\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 4, T, Q> diagonal3x4(\n\t\tvec<3, T, Q> const& v);\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 2, T, Q> diagonal4x2(\n\t\tvec<2, T, Q> const& v);\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 3, T, Q> diagonal4x3(\n\t\tvec<3, T, Q> const& v);\n\n\t//! Build a diagonal matrix.\n\t//! From GLM_GTX_matrix_operation extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> diagonal4x4(\n\t\tvec<4, T, Q> const& v);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_operation.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_operation.inl",
    "content": "/// @ref gtx_matrix_operation\n/// @file glm/gtx/matrix_operation.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 2, T, Q> diagonal2x2\n\t(\n\t\tvec<2, T, Q> const& v\n\t)\n\t{\n\t\tmat<2, 2, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 3, T, Q> diagonal2x3\n\t(\n\t\tvec<2, T, Q> const& v\n\t)\n\t{\n\t\tmat<2, 3, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<2, 4, T, Q> diagonal2x4\n\t(\n\t\tvec<2, T, Q> const& v\n\t)\n\t{\n\t\tmat<2, 4, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 2, T, Q> diagonal3x2\n\t(\n\t\tvec<2, T, Q> const& v\n\t)\n\t{\n\t\tmat<3, 2, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> diagonal3x3\n\t(\n\t\tvec<3, T, Q> const& v\n\t)\n\t{\n\t\tmat<3, 3, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\tResult[2][2] = v[2];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 4, T, Q> diagonal3x4\n\t(\n\t\tvec<3, T, Q> const& v\n\t)\n\t{\n\t\tmat<3, 4, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\tResult[2][2] = v[2];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> diagonal4x4\n\t(\n\t\tvec<4, T, Q> const& v\n\t)\n\t{\n\t\tmat<4, 4, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\tResult[2][2] = v[2];\n\t\tResult[3][3] = v[3];\n\t\treturn Result;\t\t\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 3, T, Q> diagonal4x3\n\t(\n\t\tvec<3, T, Q> const& v\n\t)\n\t{\n\t\tmat<4, 3, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\tResult[2][2] = v[2];\n\t\treturn Result;\t\t\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 2, T, Q> diagonal4x2\n\t(\n\t\tvec<2, T, Q> const& v\n\t)\n\t{\n\t\tmat<4, 2, T, Q> Result(static_cast<T>(1));\n\t\tResult[0][0] = v[0];\n\t\tResult[1][1] = v[1];\n\t\treturn Result;\t\t\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_query.hpp",
    "content": "/// @ref gtx_matrix_query\n/// @file glm/gtx/matrix_query.hpp\n///\n/// @see core (dependence)\n/// @see gtx_vector_query (dependence)\n///\n/// @defgroup gtx_matrix_query GLM_GTX_matrix_query\n/// @ingroup gtx\n///\n/// Include <glm/gtx/matrix_query.hpp> to use the features of this extension.\n///\n/// Query to evaluate matrix properties\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/vector_query.hpp\"\n#include <limits>\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_matrix_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_matrix_query extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_matrix_query\n\t/// @{\n\n\t/// Return whether a matrix a null matrix.\n\t/// From GLM_GTX_matrix_query extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon);\n\t\t\n\t/// Return whether a matrix a null matrix.\n\t/// From GLM_GTX_matrix_query extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon);\n\t\t\n\t/// Return whether a matrix is a null matrix.\n\t/// From GLM_GTX_matrix_query extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon);\n\t\t\t\n\t/// Return whether a matrix is an identity matrix.\n\t/// From GLM_GTX_matrix_query extension.\n\ttemplate<length_t C, length_t R, typename T, qualifier Q, template<length_t, length_t, typename, qualifier> class matType>\n\tGLM_FUNC_DECL bool isIdentity(matType<C, R, T, Q> const& m, T const& epsilon);\n\n\t/// Return whether a matrix is a normalized matrix.\n\t/// From GLM_GTX_matrix_query extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon);\n\n\t/// Return whether a matrix is a normalized matrix.\n\t/// From GLM_GTX_matrix_query extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon);\n\n\t/// Return whether a matrix is a normalized matrix.\n\t/// From GLM_GTX_matrix_query extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon);\n\n\t/// Return whether a matrix is an orthonormalized matrix.\n\t/// From GLM_GTX_matrix_query extension.\n\ttemplate<length_t C, length_t R, typename T, qualifier Q, template<length_t, length_t, typename, qualifier> class matType>\n\tGLM_FUNC_DECL bool isOrthogonal(matType<C, R, T, Q> const& m, T const& epsilon);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_query.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_query.inl",
    "content": "/// @ref gtx_matrix_query\n/// @file glm/gtx/matrix_query.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon)\n\t{\n\t\tbool result = true;\n\t\tfor(length_t i = 0; result && i < m.length() ; ++i)\n\t\t\tresult = isNull(m[i], epsilon);\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon)\n\t{\n\t\tbool result = true;\n\t\tfor(length_t i = 0; result && i < m.length() ; ++i)\n\t\t\tresult = isNull(m[i], epsilon);\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon)\n\t{\n\t\tbool result = true;\n\t\tfor(length_t i = 0; result && i < m.length() ; ++i)\n\t\t\tresult = isNull(m[i], epsilon);\n\t\treturn result;\n\t}\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isIdentity(mat<C, R, T, Q> const& m, T const& epsilon)\n\t{\n\t\tbool result = true;\n\t\tfor(length_t i = 0; result && i < m[0].length() ; ++i)\n\t\t{\n\t\t\tfor(length_t j = 0; result && j < i ; ++j)\n\t\t\t\tresult = abs(m[i][j]) <= epsilon;\n\t\t\tif(result)\n\t\t\t\tresult = abs(m[i][i] - 1) <= epsilon;\n\t\t\tfor(length_t j = i + 1; result && j < m.length(); ++j)\n\t\t\t\tresult = abs(m[i][j]) <= epsilon;\n\t\t}\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon)\n\t{\n\t\tbool result(true);\n\t\tfor(length_t i = 0; result && i < m.length(); ++i)\n\t\t\tresult = isNormalized(m[i], epsilon);\n\t\tfor(length_t i = 0; result && i < m.length(); ++i)\n\t\t{\n\t\t\ttypename mat<2, 2, T, Q>::col_type v;\n\t\t\tfor(length_t j = 0; j < m.length(); ++j)\n\t\t\t\tv[j] = m[j][i];\n\t\t\tresult = isNormalized(v, epsilon);\n\t\t}\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon)\n\t{\n\t\tbool result(true);\n\t\tfor(length_t i = 0; result && i < m.length(); ++i)\n\t\t\tresult = isNormalized(m[i], epsilon);\n\t\tfor(length_t i = 0; result && i < m.length(); ++i)\n\t\t{\n\t\t\ttypename mat<3, 3, T, Q>::col_type v;\n\t\t\tfor(length_t j = 0; j < m.length(); ++j)\n\t\t\t\tv[j] = m[j][i];\n\t\t\tresult = isNormalized(v, epsilon);\n\t\t}\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon)\n\t{\n\t\tbool result(true);\n\t\tfor(length_t i = 0; result && i < m.length(); ++i)\n\t\t\tresult = isNormalized(m[i], epsilon);\n\t\tfor(length_t i = 0; result && i < m.length(); ++i)\n\t\t{\n\t\t\ttypename mat<4, 4, T, Q>::col_type v;\n\t\t\tfor(length_t j = 0; j < m.length(); ++j)\n\t\t\t\tv[j] = m[j][i];\n\t\t\tresult = isNormalized(v, epsilon);\n\t\t}\n\t\treturn result;\n\t}\n\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isOrthogonal(mat<C, R, T, Q> const& m, T const& epsilon)\n\t{\n\t\tbool result = true;\n\t\tfor(length_t i(0); result && i < m.length() - 1; ++i)\n\t\tfor(length_t j(i + 1); result && j < m.length(); ++j)\n\t\t\tresult = areOrthogonal(m[i], m[j], epsilon);\n\n\t\tif(result)\n\t\t{\n\t\t\tmat<C, R, T, Q> tmp = transpose(m);\n\t\t\tfor(length_t i(0); result && i < m.length() - 1 ; ++i)\n\t\t\tfor(length_t j(i + 1); result && j < m.length(); ++j)\n\t\t\t\tresult = areOrthogonal(tmp[i], tmp[j], epsilon);\n\t\t}\n\t\treturn result;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_transform_2d.hpp",
    "content": "/// @ref gtx_matrix_transform_2d\n/// @file glm/gtx/matrix_transform_2d.hpp\n/// @author Miguel Ángel Pérez Martínez\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_matrix_transform_2d GLM_GTX_matrix_transform_2d\n/// @ingroup gtx\n///\n/// Include <glm/gtx/matrix_transform_2d.hpp> to use the features of this extension.\n///\n/// Defines functions that generate common 2d transformation matrices.\n\n#pragma once\n\n// Dependency:\n#include \"../mat3x3.hpp\"\n#include \"../vec2.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_matrix_transform_2d is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_matrix_transform_2d extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_matrix_transform_2d\n\t/// @{\n\t\n\t/// Builds a translation 3 * 3 matrix created from a vector of 2 components.\n\t///\n\t/// @param m Input matrix multiplied by this translation matrix.\n\t/// @param v Coordinates of a translation vector.\t\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tvec<2, T, Q> const& v);\n\n\t/// Builds a rotation 3 * 3 matrix created from an angle. \n\t///\n\t/// @param m Input matrix multiplied by this translation matrix.\n\t/// @param angle Rotation angle expressed in radians.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tT angle);\n\n\t/// Builds a scale 3 * 3 matrix created from a vector of 2 components.\n\t///\n\t/// @param m Input matrix multiplied by this translation matrix.\n\t/// @param v Coordinates of a scale vector.\t\t\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tvec<2, T, Q> const& v);\n\n\t/// Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix. \n\t///\n\t/// @param m Input matrix multiplied by this translation matrix.\n\t/// @param y Shear factor.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tT y);\n\n\t/// Builds a vertical (parallel to the y axis) shear 3 * 3 matrix. \n\t///\n\t/// @param m Input matrix multiplied by this translation matrix.\n\t/// @param x Shear factor.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tT x);\n\n\t/// @}\n}//namespace glm\n\n#include \"matrix_transform_2d.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/matrix_transform_2d.inl",
    "content": "/// @ref gtx_matrix_transform_2d\n/// @file glm/gtc/matrix_transform_2d.inl\n/// @author Miguel Ángel Pérez Martínez\n\n#include \"../trigonometric.hpp\"\n\nnamespace glm\n{\n\t\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tvec<2, T, Q> const& v)\n\t{\n\t\tmat<3, 3, T, Q> Result(m);\n\t\tResult[2] = m[0] * v[0] + m[1] * v[1] + m[2];\n\t\treturn Result;\n\t}\n\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tT angle)\n\t{\n\t\tT const a = angle;\n\t\tT const c = cos(a);\n\t\tT const s = sin(a);\n\n\t\tmat<3, 3, T, Q> Result;\n\t\tResult[0] = m[0] * c + m[1] * s;\n\t\tResult[1] = m[0] * -s + m[1] * c;\n\t\tResult[2] = m[2];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tvec<2, T, Q> const& v)\n\t{\n\t\tmat<3, 3, T, Q> Result;\n\t\tResult[0] = m[0] * v[0];\n\t\tResult[1] = m[1] * v[1];\n\t\tResult[2] = m[2];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tT y)\n\t{\n\t\tmat<3, 3, T, Q> Result(1);\n\t\tResult[0][1] = y;\n\t\treturn m * Result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY(\n\t\tmat<3, 3, T, Q> const& m,\n\t\tT x)\n\t{\n\t\tmat<3, 3, T, Q> Result(1);\n\t\tResult[1][0] = x;\n\t\treturn m * Result;\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/mixed_product.hpp",
    "content": "/// @ref gtx_mixed_product\n/// @file glm/gtx/mixed_product.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_mixed_product GLM_GTX_mixed_producte\n/// @ingroup gtx\n///\n/// Include <glm/gtx/mixed_product.hpp> to use the features of this extension.\n///\n/// Mixed product of 3 vectors.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_mixed_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_mixed_product extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_mixed_product\n\t/// @{\n\n\t/// @brief Mixed product of 3 vectors (from GLM_GTX_mixed_product extension)\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL T mixedProduct(\n\t\tvec<3, T, Q> const& v1, \n\t\tvec<3, T, Q> const& v2, \n\t\tvec<3, T, Q> const& v3);\n\n\t/// @}\n}// namespace glm\n\n#include \"mixed_product.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/mixed_product.inl",
    "content": "/// @ref gtx_mixed_product\n/// @file glm/gtx/mixed_product.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T mixedProduct\n\t(\n\t\tvec<3, T, Q> const& v1,\n\t\tvec<3, T, Q> const& v2,\n\t\tvec<3, T, Q> const& v3\n\t)\n\t{\n\t\treturn dot(cross(v1, v2), v3);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/norm.hpp",
    "content": "/// @ref gtx_norm\n/// @file glm/gtx/norm.hpp\n///\n/// @see core (dependence)\n/// @see gtx_quaternion (dependence)\n///\n/// @defgroup gtx_norm GLM_GTX_norm\n/// @ingroup gtx\n///\n/// Include <glm/gtx/norm.hpp> to use the features of this extension.\n///\n/// Various ways to compute vector norms.\n\n#pragma once\n\n// Dependency:\n#include \"../geometric.hpp\"\n#include \"../gtx/quaternion.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_norm is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_norm extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_norm\n\t/// @{\n\n\t/// Returns the squared length of x.\n\t/// From GLM_GTX_norm extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T length2(vec<L, T, Q> const& x);\n\n\t/// Returns the squared distance between p0 and p1, i.e., length2(p0 - p1).\n\t/// From GLM_GTX_norm extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T distance2(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1);\n\n\t//! Returns the L1 norm between x and y.\n\t//! From GLM_GTX_norm extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y);\n\n\t//! Returns the L1 norm of v.\n\t//! From GLM_GTX_norm extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& v);\n\n\t//! Returns the L2 norm between x and y.\n\t//! From GLM_GTX_norm extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y);\n\t\t\n\t//! Returns the L2 norm of v.\n\t//! From GLM_GTX_norm extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x);\n\t\t\n\t//! Returns the L norm between x and y.\n\t//! From GLM_GTX_norm extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth);\n\n\t//! Returns the L norm of v.\n\t//! From GLM_GTX_norm extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, unsigned int Depth);\n\n\t/// @}\n}//namespace glm\n\n#include \"norm.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/norm.inl",
    "content": "/// @ref gtx_norm\n/// @file glm/gtx/norm.inl\n\n#include \"../detail/qualifier.hpp\"\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, qualifier Q, bool Aligned>\n\tstruct compute_length2\n\t{\n\t\tGLM_FUNC_QUALIFIER static T call(vec<L, T, Q> const& v)\n\t\t{\n\t\t\treturn dot(v, v);\n\t\t}\n\t};\n}//namespace detail\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType length2(genType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'length2' accepts only floating-point inputs\");\n\t\treturn x * x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T length2(vec<L, T, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'length2' accepts only floating-point inputs\");\n\t\treturn detail::compute_length2<L, T, Q, detail::is_aligned<Q>::value>::call(v);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T distance2(T p0, T p1)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'distance2' accepts only floating-point inputs\");\n\t\treturn length2(p1 - p0);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T distance2(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'distance2' accepts only floating-point inputs\");\n\t\treturn length2(p1 - p0);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b)\n\t{\n\t\treturn abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& v)\n\t{\n\t\treturn abs(v.x) + abs(v.y) + abs(v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b\n\t)\n\t{\n\t\treturn length(b - a);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& v)\n\t{\n\t\treturn length(v);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth)\n\t{\n\t\treturn pow(pow(y.x - x.x, T(Depth)) + pow(y.y - x.y, T(Depth)) + pow(y.z - x.z, T(Depth)), T(1) / T(Depth));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& v, unsigned int Depth)\n\t{\n\t\treturn pow(pow(v.x, T(Depth)) + pow(v.y, T(Depth)) + pow(v.z, T(Depth)), T(1) / T(Depth));\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/normal.hpp",
    "content": "/// @ref gtx_normal\n/// @file glm/gtx/normal.hpp\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_normal GLM_GTX_normal\n/// @ingroup gtx\n///\n/// Include <glm/gtx/normal.hpp> to use the features of this extension.\n///\n/// Compute the normal of a triangle.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_normal is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_normal extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_normal\n\t/// @{\n\n\t/// Computes triangle normal from triangle points. \n\t///\n\t/// @see gtx_normal\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL vec<3, T, Q> triangleNormal(vec<3, T, Q> const& p1, vec<3, T, Q> const& p2, vec<3, T, Q> const& p3);\n\n\t/// @}\n}//namespace glm\n\n#include \"normal.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/normal.inl",
    "content": "/// @ref gtx_normal\n/// @file glm/gtx/normal.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> triangleNormal\n\t(\n\t\tvec<3, T, Q> const& p1, \n\t\tvec<3, T, Q> const& p2, \n\t\tvec<3, T, Q> const& p3\n\t)\n\t{\n\t\treturn normalize(cross(p1 - p2, p1 - p3));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/normalize_dot.hpp",
    "content": "/// @ref gtx_normalize_dot\n/// @file glm/gtx/normalize_dot.hpp\n///\n/// @see core (dependence)\n/// @see gtx_fast_square_root (dependence)\n///\n/// @defgroup gtx_normalize_dot GLM_GTX_normalize_dot\n/// @ingroup gtx\n///\n/// Include <glm/gtx/normalized_dot.hpp> to use the features of this extension.\n///\n/// Dot product of vectors that need to be normalize with a single square root.\n\n#pragma once\n\n// Dependency:\n#include \"../gtx/fast_square_root.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_normalize_dot is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_normalize_dot extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_normalize_dot\n\t/// @{\n\n\t/// Normalize parameters and returns the dot product of x and y.\n\t/// It's faster that dot(normalize(x), normalize(y)).\n\t///\n\t/// @see gtx_normalize_dot extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T normalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Normalize parameters and returns the dot product of x and y.\n\t/// Faster that dot(fastNormalize(x), fastNormalize(y)).\n\t///\n\t/// @see gtx_normalize_dot extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T fastNormalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// @}\n}//namespace glm\n\n#include \"normalize_dot.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/normalize_dot.inl",
    "content": "/// @ref gtx_normalize_dot\n/// @file glm/gtx/normalize_dot.inl\n\nnamespace glm\n{\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T normalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\treturn glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T fastNormalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\treturn glm::dot(x, y) * glm::fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/number_precision.hpp",
    "content": "/// @ref gtx_number_precision\n/// @file glm/gtx/number_precision.hpp\n///\n/// @see core (dependence)\n/// @see gtc_type_precision (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtx_number_precision GLM_GTX_number_precision\n/// @ingroup gtx\n///\n/// Include <glm/gtx/number_precision.hpp> to use the features of this extension.\n///\n/// Defined size types.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/type_precision.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_number_precision is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_number_precision extension included\")\n#endif\n\nnamespace glm{\nnamespace gtx\n{\n\t/////////////////////////////\n\t// Unsigned int vector types \n\n\t/// @addtogroup gtx_number_precision\n\t/// @{\n\n\ttypedef u8\t\t\tu8vec1;\t\t//!< \\brief 8bit unsigned integer scalar. (from GLM_GTX_number_precision extension)\n\ttypedef u16\t\t\tu16vec1;    //!< \\brief 16bit unsigned integer scalar. (from GLM_GTX_number_precision extension)\n\ttypedef u32\t\t\tu32vec1;    //!< \\brief 32bit unsigned integer scalar. (from GLM_GTX_number_precision extension)\n\ttypedef u64\t\t\tu64vec1;    //!< \\brief 64bit unsigned integer scalar. (from GLM_GTX_number_precision extension)\n\n\t//////////////////////\n\t// Float vector types \n\n\ttypedef f32\t\t\tf32vec1;    //!< \\brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)\n\ttypedef f64\t\t\tf64vec1;    //!< \\brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)\n\n\t//////////////////////\n\t// Float matrix types \n\n\ttypedef f32\t\t\tf32mat1;\t//!< \\brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)\n\ttypedef f32\t\t\tf32mat1x1;\t//!< \\brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)\n\ttypedef f64\t\t\tf64mat1;\t//!< \\brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)\n\ttypedef f64\t\t\tf64mat1x1;\t//!< \\brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)\n\n\t/// @}\n}//namespace gtx\n}//namespace glm\n\n#include \"number_precision.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/number_precision.inl",
    "content": "/// @ref gtx_number_precision\n/// @file glm/gtx/number_precision.inl\n\nnamespace glm\n{\n\n}\n"
  },
  {
    "path": "external/glm/glm/gtx/optimum_pow.hpp",
    "content": "/// @ref gtx_optimum_pow\n/// @file glm/gtx/optimum_pow.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_optimum_pow GLM_GTX_optimum_pow\n/// @ingroup gtx\n///\n/// Include <glm/gtx/optimum_pow.hpp> to use the features of this extension.\n///\n/// Integer exponentiation of power functions.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_optimum_pow is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_optimum_pow extension included\")\n#endif\n\nnamespace glm{\nnamespace gtx\n{\n\t/// @addtogroup gtx_optimum_pow\n\t/// @{\n\n\t/// Returns x raised to the power of 2.\n\t///\n\t/// @see gtx_optimum_pow\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType pow2(genType const& x);\n\n\t/// Returns x raised to the power of 3.\n\t///\n\t/// @see gtx_optimum_pow\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType pow3(genType const& x);\n\n\t/// Returns x raised to the power of 4.\n\t///\n\t/// @see gtx_optimum_pow\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType pow4(genType const& x);\n\n\t/// @}\n}//namespace gtx\n}//namespace glm\n\n#include \"optimum_pow.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/optimum_pow.inl",
    "content": "/// @ref gtx_optimum_pow\n/// @file glm/gtx/optimum_pow.inl\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType pow2(genType const& x)\n\t{\n\t\treturn x * x;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType pow3(genType const& x)\n\t{\n\t\treturn x * x * x;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType pow4(genType const& x)\n\t{\n\t\treturn (x * x) * (x * x);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/orthonormalize.hpp",
    "content": "/// @ref gtx_orthonormalize\n/// @file glm/gtx/orthonormalize.hpp\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_orthonormalize GLM_GTX_orthonormalize\n/// @ingroup gtx\n///\n/// Include <glm/gtx/orthonormalize.hpp> to use the features of this extension.\n///\n/// Orthonormalize matrices.\n\n#pragma once\n\n// Dependency:\n#include \"../vec3.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../geometric.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_orthonormalize is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_orthonormalize extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_orthonormalize\n\t/// @{\n\n\t/// Returns the orthonormalized matrix of m.\n\t///\n\t/// @see gtx_orthonormalize\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m);\n\t\t\n\t/// Orthonormalizes x according y.\n\t///\n\t/// @see gtx_orthonormalize\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y);\n\n\t/// @}\n}//namespace glm\n\n#include \"orthonormalize.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/orthonormalize.inl",
    "content": "/// @ref gtx_orthonormalize\n/// @file glm/gtx/orthonormalize.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m)\n\t{\n\t\tmat<3, 3, T, Q> r = m;\n\n\t\tr[0] = normalize(r[0]);\n\n\t\tT d0 = dot(r[0], r[1]);\n\t\tr[1] -= r[0] * d0;\n\t\tr[1] = normalize(r[1]);\n\n\t\tT d1 = dot(r[1], r[2]);\n\t\td0 = dot(r[0], r[2]);\n\t\tr[2] -= r[0] * d0 + r[1] * d1;\n\t\tr[2] = normalize(r[2]);\n\n\t\treturn r;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y)\n\t{\n\t\treturn normalize(x - y * dot(y, x));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/perpendicular.hpp",
    "content": "/// @ref gtx_perpendicular\n/// @file glm/gtx/perpendicular.hpp\n///\n/// @see core (dependence)\n/// @see gtx_projection (dependence)\n///\n/// @defgroup gtx_perpendicular GLM_GTX_perpendicular\n/// @ingroup gtx\n///\n/// Include <glm/gtx/perpendicular.hpp> to use the features of this extension.\n///\n/// Perpendicular of a vector from other one\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/projection.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_perpendicular is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_perpendicular extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_perpendicular\n\t/// @{\n\n\t//! Projects x a perpendicular axis of Normal.\n\t//! From GLM_GTX_perpendicular extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType perp(genType const& x, genType const& Normal);\n\n\t/// @}\n}//namespace glm\n\n#include \"perpendicular.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/perpendicular.inl",
    "content": "/// @ref gtx_perpendicular\n/// @file glm/gtx/perpendicular.inl\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType perp(genType const& x, genType const& Normal)\n\t{\n\t\treturn x - proj(x, Normal);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/polar_coordinates.hpp",
    "content": "/// @ref gtx_polar_coordinates\n/// @file glm/gtx/polar_coordinates.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_polar_coordinates GLM_GTX_polar_coordinates\n/// @ingroup gtx\n///\n/// Include <glm/gtx/polar_coordinates.hpp> to use the features of this extension.\n///\n/// Conversion from Euclidean space to polar space and revert.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_polar_coordinates is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_polar_coordinates extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_polar_coordinates\n\t/// @{\n\n\t/// Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude.\n\t///\n\t/// @see gtx_polar_coordinates\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> polar(\n\t\tvec<3, T, Q> const& euclidean);\n\n\t/// Convert Polar to Euclidean coordinates.\n\t///\n\t/// @see gtx_polar_coordinates\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> euclidean(\n\t\tvec<2, T, Q> const& polar);\n\n\t/// @}\n}//namespace glm\n\n#include \"polar_coordinates.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/polar_coordinates.inl",
    "content": "/// @ref gtx_polar_coordinates\n/// @file glm/gtx/polar_coordinates.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> polar\n\t(\n\t\tvec<3, T, Q> const& euclidean\n\t)\n\t{\n\t\tT const Length(length(euclidean));\n\t\tvec<3, T, Q> const tmp(euclidean / Length);\n\t\tT const xz_dist(sqrt(tmp.x * tmp.x + tmp.z * tmp.z));\n\n\t\treturn vec<3, T, Q>(\n\t\t\tasin(tmp.y),\t// latitude\n\t\t\tatan(tmp.x, tmp.z),\t\t// longitude\n\t\t\txz_dist);\t\t\t\t// xz distance\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> euclidean\n\t(\n\t\tvec<2, T, Q> const& polar\n\t)\n\t{\n\t\tT const latitude(polar.x);\n\t\tT const longitude(polar.y);\n\n\t\treturn vec<3, T, Q>(\n\t\t\tcos(latitude) * sin(longitude),\n\t\t\tsin(latitude),\n\t\t\tcos(latitude) * cos(longitude));\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/projection.hpp",
    "content": "/// @ref gtx_projection\n/// @file glm/gtx/projection.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_projection GLM_GTX_projection\n/// @ingroup gtx\n///\n/// Include <glm/gtx/projection.hpp> to use the features of this extension.\n///\n/// Projection of a vector to other one\n\n#pragma once\n\n// Dependency:\n#include \"../geometric.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_projection is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_projection extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_projection\n\t/// @{\n\n\t/// Projects x on Normal.\n\t///\n\t/// @see gtx_projection\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType proj(genType const& x, genType const& Normal);\n\n\t/// @}\n}//namespace glm\n\n#include \"projection.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/projection.inl",
    "content": "/// @ref gtx_projection\n/// @file glm/gtx/projection.inl\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType proj(genType const& x, genType const& Normal)\n\t{\n\t\treturn glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/quaternion.hpp",
    "content": "/// @ref gtx_quaternion\n/// @file glm/gtx/quaternion.hpp\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_quaternion GLM_GTX_quaternion\n/// @ingroup gtx\n///\n/// Include <glm/gtx/quaternion.hpp> to use the features of this extension.\n///\n/// Extented quaternion types and functions\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/constants.hpp\"\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtx/norm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_quaternion extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_quaternion\n\t/// @{\n\n\t/// Create an identity quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> quat_identity();\n\n\t/// Compute a cross product between a quaternion and a vector.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> cross(\n\t\ttquat<T, Q> const& q,\n\t\tvec<3, T, Q> const& v);\n\n\t//! Compute a cross product between a vector and a quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> cross(\n\t\tvec<3, T, Q> const& v,\n\t\ttquat<T, Q> const& q);\n\n\t//! Compute a point on a path according squad equation. \n\t//! q1 and q2 are control points; s1 and s2 are intermediate control points.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> squad(\n\t\ttquat<T, Q> const& q1,\n\t\ttquat<T, Q> const& q2,\n\t\ttquat<T, Q> const& s1,\n\t\ttquat<T, Q> const& s2,\n\t\tT const& h);\n\n\t//! Returns an intermediate control point for squad interpolation.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> intermediate(\n\t\ttquat<T, Q> const& prev,\n\t\ttquat<T, Q> const& curr,\n\t\ttquat<T, Q> const& next);\n\n\t//! Returns a exp of a quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> exp(\n\t\ttquat<T, Q> const& q);\n\n\t//! Returns a log of a quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> log(\n\t\ttquat<T, Q> const& q);\n\n\t/// Returns x raised to the y power.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> pow(\n\t\ttquat<T, Q> const& x,\n\t\tT const& y);\n\n\t//! Returns quarternion square root.\n\t///\n\t/// @see gtx_quaternion\n\t//template<typename T, qualifier Q>\n\t//tquat<T, Q> sqrt(\n\t//\ttquat<T, Q> const& q);\n\n\t//! Rotates a 3 components vector by a quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> rotate(\n\t\ttquat<T, Q> const& q,\n\t\tvec<3, T, Q> const& v);\n\n\t/// Rotates a 4 components vector by a quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> rotate(\n\t\ttquat<T, Q> const& q,\n\t\tvec<4, T, Q> const& v);\n\n\t/// Extract the real component of a quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T extractRealComponent(\n\t\ttquat<T, Q> const& q);\n\n\t/// Converts a quaternion to a 3 * 3 matrix.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> toMat3(\n\t\ttquat<T, Q> const& x){return mat3_cast(x);}\n\n\t/// Converts a quaternion to a 4 * 4 matrix.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> toMat4(\n\t\ttquat<T, Q> const& x){return mat4_cast(x);}\n\n\t/// Converts a 3 * 3 matrix to a quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> toQuat(\n\t\tmat<3, 3, T, Q> const& x){return quat_cast(x);}\n\n\t/// Converts a 4 * 4 matrix to a quaternion.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> toQuat(\n\t\tmat<4, 4, T, Q> const& x){return quat_cast(x);}\n\n\t/// Quaternion interpolation using the rotation short path.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> shortMix(\n\t\ttquat<T, Q> const& x,\n\t\ttquat<T, Q> const& y,\n\t\tT const& a);\n\n\t/// Quaternion normalized linear interpolation.\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> fastMix(\n\t\ttquat<T, Q> const& x,\n\t\ttquat<T, Q> const& y,\n\t\tT const& a);\n\n\t/// Compute the rotation between two vectors.\n\t/// param orig vector, needs to be normalized\n\t/// param dest vector, needs to be normalized\n\t///\n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> rotation(\n\t\tvec<3, T, Q> const& orig, \n\t\tvec<3, T, Q> const& dest);\n\n\t/// Build a look at quaternion based on the default handedness.\n\t///\n\t/// @param direction Desired forward direction. Needs to be normalized.\n\t/// @param up Up vector, how the camera is oriented. Typically (0, 1, 0).\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> quatLookAt(\n\t\tvec<3, T, Q> const& direction,\n\t\tvec<3, T, Q> const& up);\n\n\t/// Build a right-handed look at quaternion.\n\t///\n\t/// @param direction Desired forward direction onto which the -z-axis gets mapped. Needs to be normalized.\n\t/// @param up Up vector, how the camera is oriented. Typically (0, 1, 0).\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> quatLookAtRH(\n\t\tvec<3, T, Q> const& direction,\n\t\tvec<3, T, Q> const& up);\n\n\t/// Build a left-handed look at quaternion.\n\t///\n\t/// @param direction Desired forward direction onto which the +z-axis gets mapped. Needs to be normalized.\n\t/// @param up Up vector, how the camera is oriented. Typically (0, 1, 0).\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> quatLookAtLH(\n\t\tvec<3, T, Q> const& direction,\n\t\tvec<3, T, Q> const& up);\n\t\n\t/// Returns the squared length of x.\n\t/// \n\t/// @see gtx_quaternion\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T length2(tquat<T, Q> const& q);\n\n\t/// @}\n}//namespace glm\n\n#include \"quaternion.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/quaternion.inl",
    "content": "/// @ref gtx_quaternion\n/// @file glm/gtx/quaternion.inl\n\n#include <limits>\n#include \"../gtc/constants.hpp\"\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> quat_identity()\n\t{\n\t\treturn tquat<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& v, tquat<T, Q> const& q)\n\t{\n\t\treturn inverse(q) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> cross(tquat<T, Q> const& q, vec<3, T, Q> const& v)\n\t{\n\t\treturn q * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> squad\n\t(\n\t\ttquat<T, Q> const& q1,\n\t\ttquat<T, Q> const& q2,\n\t\ttquat<T, Q> const& s1,\n\t\ttquat<T, Q> const& s2,\n\t\tT const& h)\n\t{\n\t\treturn mix(mix(q1, q2, h), mix(s1, s2, h), static_cast<T>(2) * (static_cast<T>(1) - h) * h);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> intermediate\n\t(\n\t\ttquat<T, Q> const& prev,\n\t\ttquat<T, Q> const& curr,\n\t\ttquat<T, Q> const& next\n\t)\n\t{\n\t\ttquat<T, Q> invQuat = inverse(curr);\n\t\treturn exp((log(next + invQuat) + log(prev + invQuat)) / static_cast<T>(-4)) * curr;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> exp(tquat<T, Q> const& q)\n\t{\n\t\tvec<3, T, Q> u(q.x, q.y, q.z);\n\t\tT const Angle = glm::length(u);\n\t\tif (Angle < epsilon<T>())\n\t\t\treturn tquat<T, Q>();\n\n\t\tvec<3, T, Q> const v(u / Angle);\n\t\treturn tquat<T, Q>(cos(Angle), sin(Angle) * v);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> log(tquat<T, Q> const& q)\n\t{\n\t\tvec<3, T, Q> u(q.x, q.y, q.z);\n\t\tT Vec3Len = length(u);\n\n\t\tif (Vec3Len < epsilon<T>())\n\t\t{\n\t\t\tif(q.w > static_cast<T>(0))\n\t\t\t\treturn tquat<T, Q>(log(q.w), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0));\n\t\t\telse if(q.w < static_cast<T>(0))\n\t\t\t\treturn tquat<T, Q>(log(-q.w), pi<T>(), static_cast<T>(0), static_cast<T>(0));\n\t\t\telse\n\t\t\t\treturn tquat<T, Q>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity());\n\t\t}\n\t\telse\n\t\t{\n\t\t\tT t = atan(Vec3Len, T(q.w)) / Vec3Len;\n\t\t\tT QuatLen2 = Vec3Len * Vec3Len + q.w * q.w;\n\t\t\treturn tquat<T, Q>(static_cast<T>(0.5) * log(QuatLen2), t * q.x, t * q.y, t * q.z);\n\t\t}\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> pow(tquat<T, Q> const& x, T const& y)\n\t{\n\t\t//Raising to the power of 0 should yield 1\n\t\t//Needed to prevent a division by 0 error later on\n\t\tif(y > -epsilon<T>() && y < epsilon<T>())\n\t\t\treturn tquat<T, Q>(1,0,0,0);\n\n\t\t//To deal with non-unit quaternions\n\t\tT magnitude = sqrt(x.x * x.x + x.y * x.y + x.z * x.z + x.w *x.w);\n\n\t\t//Equivalent to raising a real number to a power\n\t\t//Needed to prevent a division by 0 error later on\n\t\tif(abs(x.w / magnitude) > static_cast<T>(1) - epsilon<T>() && abs(x.w / magnitude) < static_cast<T>(1) + epsilon<T>())\n\t\t\treturn tquat<T, Q>(pow(x.w, y),0,0,0);\n\n\t\tT Angle = acos(x.w / magnitude);\n\t\tT NewAngle = Angle * y;\n\t\tT Div = sin(NewAngle) / sin(Angle);\n\t\tT Mag = pow(magnitude, y - static_cast<T>(1));\n\n\t\treturn tquat<T, Q>(cos(NewAngle) * magnitude * Mag, x.x * Div * Mag, x.y * Div * Mag, x.z * Div * Mag);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rotate(tquat<T, Q> const& q, vec<3, T, Q> const& v)\n\t{\n\t\treturn q * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> rotate(tquat<T, Q> const& q, vec<4, T, Q> const& v)\n\t{\n\t\treturn q * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T extractRealComponent(tquat<T, Q> const& q)\n\t{\n\t\tT w = static_cast<T>(1) - q.x * q.x - q.y * q.y - q.z * q.z;\n\t\tif(w < T(0))\n\t\t\treturn T(0);\n\t\telse\n\t\t\treturn -sqrt(w);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T length2(tquat<T, Q> const& q)\n\t{\n\t\treturn q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> shortMix(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& a)\n\t{\n\t\tif(a <= static_cast<T>(0)) return x;\n\t\tif(a >= static_cast<T>(1)) return y;\n\n\t\tT fCos = dot(x, y);\n\t\ttquat<T, Q> y2(y); //BUG!!! tquat<T> y2;\n\t\tif(fCos < static_cast<T>(0))\n\t\t{\n\t\t\ty2 = -y;\n\t\t\tfCos = -fCos;\n\t\t}\n\n\t\t//if(fCos > 1.0f) // problem\n\t\tT k0, k1;\n\t\tif(fCos > (static_cast<T>(1) - epsilon<T>()))\n\t\t{\n\t\t\tk0 = static_cast<T>(1) - a;\n\t\t\tk1 = static_cast<T>(0) + a; //BUG!!! 1.0f + a;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tT fSin = sqrt(T(1) - fCos * fCos);\n\t\t\tT fAngle = atan(fSin, fCos);\n\t\t\tT fOneOverSin = static_cast<T>(1) / fSin;\n\t\t\tk0 = sin((static_cast<T>(1) - a) * fAngle) * fOneOverSin;\n\t\t\tk1 = sin((static_cast<T>(0) + a) * fAngle) * fOneOverSin;\n\t\t}\n\n\t\treturn tquat<T, Q>(\n\t\t\tk0 * x.w + k1 * y2.w,\n\t\t\tk0 * x.x + k1 * y2.x,\n\t\t\tk0 * x.y + k1 * y2.y,\n\t\t\tk0 * x.z + k1 * y2.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> fastMix(tquat<T, Q> const& x, tquat<T, Q> const& y, T const& a)\n\t{\n\t\treturn glm::normalize(x * (static_cast<T>(1) - a) + (y * a));\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> rotation(vec<3, T, Q> const& orig, vec<3, T, Q> const& dest)\n\t{\n\t\tT cosTheta = dot(orig, dest);\n\t\tvec<3, T, Q> rotationAxis;\n\n\t\tif(cosTheta >= static_cast<T>(1) - epsilon<T>()) {\n\t\t\t// orig and dest point in the same direction\n\t\t\treturn quat_identity<T,Q>();\n\t\t}\n\n\t\tif(cosTheta < static_cast<T>(-1) + epsilon<T>())\n\t\t{\n\t\t\t// special case when vectors in opposite directions :\n\t\t\t// there is no \"ideal\" rotation axis\n\t\t\t// So guess one; any will do as long as it's perpendicular to start\n\t\t\t// This implementation favors a rotation around the Up axis (Y),\n\t\t\t// since it's often what you want to do.\n\t\t\trotationAxis = cross(vec<3, T, Q>(0, 0, 1), orig);\n\t\t\tif(length2(rotationAxis) < epsilon<T>()) // bad luck, they were parallel, try again!\n\t\t\t\trotationAxis = cross(vec<3, T, Q>(1, 0, 0), orig);\n\n\t\t\trotationAxis = normalize(rotationAxis);\n\t\t\treturn angleAxis(pi<T>(), rotationAxis);\n\t\t}\n\n\t\t// Implementation from Stan Melax's Game Programming Gems 1 article\n\t\trotationAxis = cross(orig, dest);\n\n\t\tT s = sqrt((T(1) + cosTheta) * static_cast<T>(2));\n\t\tT invs = static_cast<T>(1) / s;\n\n\t\treturn tquat<T, Q>(\n\t\t\ts * static_cast<T>(0.5f), \n\t\t\trotationAxis.x * invs,\n\t\t\trotationAxis.y * invs,\n\t\t\trotationAxis.z * invs);\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> quatLookAt(vec<3, T, Q> const& direction, vec<3, T, Q> const& up)\n\t{\n#\t\tif GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED\n\t\t\treturn quatLookAtLH(direction, up);\n#\t\telse\n\t\t\treturn quatLookAtRH(direction, up);\n# \t\tendif\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> quatLookAtRH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up)\n\t{\n\t\tmat<3, 3, T, Q> Result;\n\n\t\tResult[2] = -direction;\n\t\tResult[0] = normalize(cross(up, Result[2]));\n\t\tResult[1] = cross(Result[2], Result[0]);\n\n\t\treturn quat_cast(Result);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> quatLookAtLH(vec<3, T, Q> const& direction, vec<3, T, Q> const& up)\n\t{\n\t\tmat<3, 3, T, Q> Result;\n\n\t\tResult[2] = direction;\n\t\tResult[0] = normalize(cross(up, Result[2]));\n\t\tResult[1] = cross(Result[2], Result[0]);\n\n\t\treturn quat_cast(Result);\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/range.hpp",
    "content": "/// @ref gtx_range\n/// @file glm/gtx/range.hpp\n/// @author Joshua Moerman\n///\n/// @defgroup gtx_range GLM_GTX_range\n/// @ingroup gtx\n///\n/// Include <glm/gtx/range.hpp> to use the features of this extension.\n///\n/// Defines begin and end for vectors and matrices. Useful for range-based for loop.\n/// The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements).\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_range is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if !GLM_HAS_RANGE_FOR\n#\terror \"GLM_GTX_range requires C++11 suppport or 'range for'\"\n#endif\n\n#include \"../gtc/type_ptr.hpp\"\n#include \"../gtc/vec1.hpp\"\n\nnamespace glm\n{\n\t/// @addtogroup gtx_range\n\t/// @{\n\n#\tif GLM_COMPILER & GLM_COMPILER_VC\n#\t\tpragma warning(push)\n#\t\tpragma warning(disable : 4100) // unreferenced formal parameter\n#\tendif\n\n\ttemplate<typename T, qualifier Q>\n\tinline length_t components(vec<1, T, Q> const& v)\n\t{\n\t\treturn v.length();\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tinline length_t components(vec<2, T, Q> const& v)\n\t{\n\t\treturn v.length();\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tinline length_t components(vec<3, T, Q> const& v)\n\t{\n\t\treturn v.length();\n\t}\n\t\n\ttemplate<typename T, qualifier Q>\n\tinline length_t components(vec<4, T, Q> const& v)\n\t{\n\t\treturn v.length();\n\t}\n\t\n\ttemplate<typename genType>\n\tinline length_t components(genType const& m)\n\t{\n\t\treturn m.length() * m[0].length();\n\t}\n\t\n\ttemplate<typename genType>\n\tinline typename genType::value_type const * begin(genType const& v)\n\t{\n\t\treturn value_ptr(v);\n\t}\n\n\ttemplate<typename genType>\n\tinline typename genType::value_type const * end(genType const& v)\n\t{\n\t\treturn begin(v) + components(v);\n\t}\n\n\ttemplate<typename genType>\n\tinline typename genType::value_type * begin(genType& v)\n\t{\n\t\treturn value_ptr(v);\n\t}\n\n\ttemplate<typename genType>\n\tinline typename genType::value_type * end(genType& v)\n\t{\n\t\treturn begin(v) + components(v);\n\t}\n\n#\tif GLM_COMPILER & GLM_COMPILER_VC\n#\t\tpragma warning(pop)\n#\tendif\n\n\t/// @}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/raw_data.hpp",
    "content": "/// @ref gtx_raw_data\n/// @file glm/gtx/raw_data.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_raw_data GLM_GTX_raw_data\n/// @ingroup gtx\n///\n/// Include <glm/gtx/raw_data.hpp> to use the features of this extension.\n///\n/// Projection of a vector to other one\n\n#pragma once\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/type_int.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_raw_data is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_raw_data extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_raw_data\n\t/// @{\n\n\t//! Type for byte numbers. \n\t//! From GLM_GTX_raw_data extension.\n\ttypedef detail::uint8\t\tbyte;\n\n\t//! Type for word numbers. \n\t//! From GLM_GTX_raw_data extension.\n\ttypedef detail::uint16\t\tword;\n\n\t//! Type for dword numbers. \n\t//! From GLM_GTX_raw_data extension.\n\ttypedef detail::uint32\t\tdword;\n\n\t//! Type for qword numbers. \n\t//! From GLM_GTX_raw_data extension.\n\ttypedef detail::uint64\t\tqword;\n\n\t/// @}\n}// namespace glm\n\n#include \"raw_data.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/raw_data.inl",
    "content": "/// @ref gtx_raw_data\n/// @file glm/gtx/raw_data.inl\n"
  },
  {
    "path": "external/glm/glm/gtx/rotate_normalized_axis.hpp",
    "content": "/// @ref gtx_rotate_normalized_axis\n/// @file glm/gtx/rotate_normalized_axis.hpp\n///\n/// @see core (dependence)\n/// @see gtc_matrix_transform\n/// @see gtc_quaternion\n///\n/// @defgroup gtx_rotate_normalized_axis GLM_GTX_rotate_normalized_axis\n/// @ingroup gtx\n///\n/// Include <glm/gtx/rotate_normalized_axis.hpp> to use the features of this extension.\n///\n/// Quaternions and matrices rotations around normalized axis.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/epsilon.hpp\"\n#include \"../gtc/quaternion.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_rotate_normalized_axis is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_rotate_normalized_axis extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_rotate_normalized_axis\n\t/// @{\n\n\t/// Builds a rotation 4 * 4 matrix created from a normalized axis and an angle. \n\t/// \n\t/// @param m Input matrix multiplied by this rotation matrix.\n\t/// @param angle Rotation angle expressed in radians.\n\t/// @param axis Rotation axis, must be normalized.\n\t/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.\n\t/// \n\t/// @see gtx_rotate_normalized_axis\n\t/// @see - rotate(T angle, T x, T y, T z) \n\t/// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z) \n\t/// @see - rotate(T angle, vec<3, T, Q> const& v) \n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> rotateNormalizedAxis(\n\t\tmat<4, 4, T, Q> const& m,\n\t\tT const& angle,\n\t\tvec<3, T, Q> const& axis);\n\n\t/// Rotates a quaternion from a vector of 3 components normalized axis and an angle.\n\t/// \n\t/// @param q Source orientation\n\t/// @param angle Angle expressed in radians.\n\t/// @param axis Normalized axis of the rotation, must be normalized.\n\t/// \n\t/// @see gtx_rotate_normalized_axis\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL tquat<T, Q> rotateNormalizedAxis(\n\t\ttquat<T, Q> const& q,\n\t\tT const& angle,\n\t\tvec<3, T, Q> const& axis);\n\n\t/// @}\n}//namespace glm\n\n#include \"rotate_normalized_axis.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/rotate_normalized_axis.inl",
    "content": "/// @ref gtx_rotate_normalized_axis\n/// @file glm/gtx/rotate_normalized_axis.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotateNormalizedAxis\n\t(\n\t\tmat<4, 4, T, Q> const& m,\n\t\tT const& angle,\n\t\tvec<3, T, Q> const& v\n\t)\n\t{\n\t\tT const a = angle;\n\t\tT const c = cos(a);\n\t\tT const s = sin(a);\n\n\t\tvec<3, T, Q> const axis(v);\n\n\t\tvec<3, T, Q> const temp((static_cast<T>(1) - c) * axis);\n\n\t\tmat<4, 4, T, Q> Rotate;\n\t\tRotate[0][0] = c + temp[0] * axis[0];\n\t\tRotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];\n\t\tRotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];\n\n\t\tRotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];\n\t\tRotate[1][1] = c + temp[1] * axis[1];\n\t\tRotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];\n\n\t\tRotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];\n\t\tRotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];\n\t\tRotate[2][2] = c + temp[2] * axis[2];\n\n\t\tmat<4, 4, T, Q> Result;\n\t\tResult[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];\n\t\tResult[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];\n\t\tResult[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];\n\t\tResult[3] = m[3];\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER tquat<T, Q> rotateNormalizedAxis\n\t(\n\t\ttquat<T, Q> const& q, \n\t\tT const& angle,\n\t\tvec<3, T, Q> const& v\n\t)\n\t{\n\t\tvec<3, T, Q> const Tmp(v);\n\n\t\tT const AngleRad(angle);\n\t\tT const Sin = sin(AngleRad * T(0.5));\n\n\t\treturn q * tquat<T, Q>(cos(AngleRad * static_cast<T>(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin);\n\t\t//return gtc::quaternion::cross(q, tquat<T, Q>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/rotate_vector.hpp",
    "content": "/// @ref gtx_rotate_vector\n/// @file glm/gtx/rotate_vector.hpp\n///\n/// @see core (dependence)\n/// @see gtx_transform (dependence)\n///\n/// @defgroup gtx_rotate_vector GLM_GTX_rotate_vector\n/// @ingroup gtx\n///\n/// Include <glm/gtx/rotate_vector.hpp> to use the features of this extension.\n///\n/// Function to directly rotate a vector\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/transform.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_rotate_vector is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_rotate_vector extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_rotate_vector\n\t/// @{\n\n\t/// Returns Spherical interpolation between two vectors\n\t/// \n\t/// @param x A first vector\n\t/// @param y A second vector\n\t/// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1].\n\t/// \n\t/// @see gtx_rotate_vector\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> slerp(\n\t\tvec<3, T, Q> const& x,\n\t\tvec<3, T, Q> const& y,\n\t\tT const& a);\n\n\t//! Rotate a two dimensional vector.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<2, T, Q> rotate(\n\t\tvec<2, T, Q> const& v,\n\t\tT const& angle);\n\t\t\n\t//! Rotate a three dimensional vector around an axis.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> rotate(\n\t\tvec<3, T, Q> const& v,\n\t\tT const& angle,\n\t\tvec<3, T, Q> const& normal);\n\t\t\n\t//! Rotate a four dimensional vector around an axis.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> rotate(\n\t\tvec<4, T, Q> const& v,\n\t\tT const& angle,\n\t\tvec<3, T, Q> const& normal);\n\t\t\n\t//! Rotate a three dimensional vector around the X axis.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> rotateX(\n\t\tvec<3, T, Q> const& v,\n\t\tT const& angle);\n\n\t//! Rotate a three dimensional vector around the Y axis.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> rotateY(\n\t\tvec<3, T, Q> const& v,\n\t\tT const& angle);\n\t\t\n\t//! Rotate a three dimensional vector around the Z axis.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<3, T, Q> rotateZ(\n\t\tvec<3, T, Q> const& v,\n\t\tT const& angle);\n\t\t\n\t//! Rotate a four dimensional vector around the X axis.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> rotateX(\n\t\tvec<4, T, Q> const& v,\n\t\tT const& angle);\n\t\t\n\t//! Rotate a four dimensional vector around the Y axis.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> rotateY(\n\t\tvec<4, T, Q> const& v,\n\t\tT const& angle);\n\t\t\n\t//! Rotate a four dimensional vector around the Z axis.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<4, T, Q> rotateZ(\n\t\tvec<4, T, Q> const& v,\n\t\tT const& angle);\n\t\t\n\t//! Build a rotation matrix from a normal and a up vector.\n\t//! From GLM_GTX_rotate_vector extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> orientation(\n\t\tvec<3, T, Q> const& Normal,\n\t\tvec<3, T, Q> const& Up);\n\n\t/// @}\n}//namespace glm\n\n#include \"rotate_vector.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/rotate_vector.inl",
    "content": "/// @ref gtx_rotate_vector\n/// @file glm/gtx/rotate_vector.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> slerp\n\t(\n\t\tvec<3, T, Q> const& x,\n\t\tvec<3, T, Q> const& y,\n\t\tT const& a\n\t)\n\t{\n\t\t// get cosine of angle between vectors (-1 -> 1)\n\t\tT CosAlpha = dot(x, y);\n\t\t// get angle (0 -> pi)\n\t\tT Alpha = acos(CosAlpha);\n\t\t// get sine of angle between vectors (0 -> 1)\n\t\tT SinAlpha = sin(Alpha);\n\t\t// this breaks down when SinAlpha = 0, i.e. Alpha = 0 or pi\n\t\tT t1 = sin((static_cast<T>(1) - a) * Alpha) / SinAlpha;\n\t\tT t2 = sin(a * Alpha) / SinAlpha;\n\n\t\t// interpolate src vectors\n\t\treturn x * t1 + y * t2;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, T, Q> rotate\n\t(\n\t\tvec<2, T, Q> const& v,\n\t\tT const& angle\n\t)\n\t{\n\t\tvec<2, T, Q> Result;\n\t\tT const Cos(cos(angle));\n\t\tT const Sin(sin(angle));\n\n\t\tResult.x = v.x * Cos - v.y * Sin;\n\t\tResult.y = v.x * Sin + v.y * Cos;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rotate\n\t(\n\t\tvec<3, T, Q> const& v,\n\t\tT const& angle,\n\t\tvec<3, T, Q> const& normal\n\t)\n\t{\n\t\treturn mat<3, 3, T, Q>(glm::rotate(angle, normal)) * v;\n\t}\n\t/*\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rotateGTX(\n\t\tconst vec<3, T, Q>& x,\n\t\tT angle,\n\t\tconst vec<3, T, Q>& normal)\n\t{\n\t\tconst T Cos = cos(radians(angle));\n\t\tconst T Sin = sin(radians(angle));\n\t\treturn x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin;\n\t}\n\t*/\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> rotate\n\t(\n\t\tvec<4, T, Q> const& v,\n\t\tT const& angle,\n\t\tvec<3, T, Q> const& normal\n\t)\n\t{\n\t\treturn rotate(angle, normal) * v;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rotateX\n\t(\n\t\tvec<3, T, Q> const& v,\n\t\tT const& angle\n\t)\n\t{\n\t\tvec<3, T, Q> Result(v);\n\t\tT const Cos(cos(angle));\n\t\tT const Sin(sin(angle));\n\n\t\tResult.y = v.y * Cos - v.z * Sin;\n\t\tResult.z = v.y * Sin + v.z * Cos;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rotateY\n\t(\n\t\tvec<3, T, Q> const& v,\n\t\tT const& angle\n\t)\n\t{\n\t\tvec<3, T, Q> Result = v;\n\t\tT const Cos(cos(angle));\n\t\tT const Sin(sin(angle));\n\n\t\tResult.x =  v.x * Cos + v.z * Sin;\n\t\tResult.z = -v.x * Sin + v.z * Cos;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, T, Q> rotateZ\n\t(\n\t\tvec<3, T, Q> const& v,\n\t\tT const& angle\n\t)\n\t{\n\t\tvec<3, T, Q> Result = v;\n\t\tT const Cos(cos(angle));\n\t\tT const Sin(sin(angle));\n\n\t\tResult.x = v.x * Cos - v.y * Sin;\n\t\tResult.y = v.x * Sin + v.y * Cos;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> rotateX\n\t(\n\t\tvec<4, T, Q> const& v,\n\t\tT const& angle\n\t)\n\t{\n\t\tvec<4, T, Q> Result = v;\n\t\tT const Cos(cos(angle));\n\t\tT const Sin(sin(angle));\n\n\t\tResult.y = v.y * Cos - v.z * Sin;\n\t\tResult.z = v.y * Sin + v.z * Cos;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> rotateY\n\t(\n\t\tvec<4, T, Q> const& v,\n\t\tT const& angle\n\t)\n\t{\n\t\tvec<4, T, Q> Result = v;\n\t\tT const Cos(cos(angle));\n\t\tT const Sin(sin(angle));\n\n\t\tResult.x =  v.x * Cos + v.z * Sin;\n\t\tResult.z = -v.x * Sin + v.z * Cos;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, T, Q> rotateZ\n\t(\n\t\tvec<4, T, Q> const& v,\n\t\tT const& angle\n\t)\n\t{\n\t\tvec<4, T, Q> Result = v;\n\t\tT const Cos(cos(angle));\n\t\tT const Sin(sin(angle));\n\n\t\tResult.x = v.x * Cos - v.y * Sin;\n\t\tResult.y = v.x * Sin + v.y * Cos;\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientation\n\t(\n\t\tvec<3, T, Q> const& Normal,\n\t\tvec<3, T, Q> const& Up\n\t)\n\t{\n\t\tif(all(equal(Normal, Up)))\n\t\t\treturn mat<4, 4, T, Q>(T(1));\n\n\t\tvec<3, T, Q> RotationAxis = cross(Up, Normal);\n\t\tT Angle = acos(dot(Normal, Up));\n\n\t\treturn rotate(Angle, RotationAxis);\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/scalar_multiplication.hpp",
    "content": "/// @ref gtx\n/// @file glm/gtx/scalar_multiplication.hpp\n/// @author Joshua Moerman\n///\n/// Include <glm/gtx/scalar_multiplication.hpp> to use the features of this extension.\n///\n/// Enables scalar multiplication for all types\n///\n/// Since GLSL is very strict about types, the following (often used) combinations do not work:\n///    double * vec4\n///    int * vec4\n///    vec4 / int\n/// So we'll fix that! Of course \"float * vec4\" should remain the same (hence the enable_if magic)\n\n#pragma once\n\n#include \"../detail/setup.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_scalar_multiplication is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if !GLM_HAS_TEMPLATE_ALIASES && !(GLM_COMPILER & GLM_COMPILER_GCC)\n#\terror \"GLM_GTX_scalar_multiplication requires C++11 support or alias templates and if not support for GCC\"\n#endif\n\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../mat2x2.hpp\"\n#include <type_traits>\n\nnamespace glm\n{\n\ttemplate<typename T, typename Vec>\n\tusing return_type_scalar_multiplication = typename std::enable_if<\n\t\t!std::is_same<T, float>::value       // T may not be a float\n\t\t&& std::is_arithmetic<T>::value, Vec // But it may be an int or double (no vec3 or mat3, ...)\n\t>::type;\n\n#define GLM_IMPLEMENT_SCAL_MULT(Vec) \\\n\ttemplate<typename T> \\\n\treturn_type_scalar_multiplication<T, Vec> \\\n\toperator*(T const& s, Vec rh){ \\\n\t\treturn rh *= static_cast<float>(s); \\\n\t} \\\n\t \\\n\ttemplate<typename T> \\\n\treturn_type_scalar_multiplication<T, Vec> \\\n\toperator*(Vec lh, T const& s){ \\\n\t\treturn lh *= static_cast<float>(s); \\\n\t} \\\n\t \\\n\ttemplate<typename T> \\\n\treturn_type_scalar_multiplication<T, Vec> \\\n\toperator/(Vec lh, T const& s){ \\\n\t\treturn lh *= 1.0f / s; \\\n\t}\n\nGLM_IMPLEMENT_SCAL_MULT(vec2)\nGLM_IMPLEMENT_SCAL_MULT(vec3)\nGLM_IMPLEMENT_SCAL_MULT(vec4)\n\nGLM_IMPLEMENT_SCAL_MULT(mat2)\nGLM_IMPLEMENT_SCAL_MULT(mat2x3)\nGLM_IMPLEMENT_SCAL_MULT(mat2x4)\nGLM_IMPLEMENT_SCAL_MULT(mat3x2)\nGLM_IMPLEMENT_SCAL_MULT(mat3)\nGLM_IMPLEMENT_SCAL_MULT(mat3x4)\nGLM_IMPLEMENT_SCAL_MULT(mat4x2)\nGLM_IMPLEMENT_SCAL_MULT(mat4x3)\nGLM_IMPLEMENT_SCAL_MULT(mat4)\n\n#undef GLM_IMPLEMENT_SCAL_MULT\n} // namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/scalar_relational.hpp",
    "content": "/// @ref gtx_scalar_relational\n/// @file glm/gtx/scalar_relational.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_scalar_relational GLM_GTX_scalar_relational\n/// @ingroup gtx\n///\n/// Include <glm/gtx/scalar_relational.hpp> to use the features of this extension.\n///\n/// Extend a position from a source to a position at a defined length.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_extend extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_scalar_relational\n\t/// @{\n\n\n\n\t/// @}\n}//namespace glm\n\n#include \"scalar_relational.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/scalar_relational.inl",
    "content": "/// @ref gtx_scalar_relational\n/// @file glm/gtx/scalar_relational.inl\n\nnamespace glm\n{\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER bool lessThan\n\t(\n\t\tT const& x, \n\t\tT const& y\n\t)\n\t{\n\t\treturn x < y;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER bool lessThanEqual\n\t(\n\t\tT const& x, \n\t\tT const& y\n\t)\n\t{\n\t\treturn x <= y;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER bool greaterThan\n\t(\n\t\tT const& x, \n\t\tT const& y\n\t)\n\t{\n\t\treturn x > y;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER bool greaterThanEqual\n\t(\n\t\tT const& x, \n\t\tT const& y\n\t)\n\t{\n\t\treturn x >= y;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER bool equal\n\t(\n\t\tT const& x, \n\t\tT const& y\n\t)\n\t{\n\t\treturn detail::compute_equal<T>::call(x, y);\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER bool notEqual\n\t(\n\t\tT const& x, \n\t\tT const& y\n\t)\n\t{\n\t\treturn !detail::compute_equal<T>::call(x, y);\n\t}\n\n\tGLM_FUNC_QUALIFIER bool any\n\t(\n\t\tbool const& x\n\t)\n\t{\n\t\treturn x;\n\t}\n\n\tGLM_FUNC_QUALIFIER bool all\n\t(\n\t\tbool const& x\n\t)\n\t{\n\t\treturn x;\n\t}\n\n\tGLM_FUNC_QUALIFIER bool not_\n\t(\n\t\tbool const& x\n\t)\n\t{\n\t\treturn !x;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/spline.hpp",
    "content": "/// @ref gtx_spline\n/// @file glm/gtx/spline.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_spline GLM_GTX_spline\n/// @ingroup gtx\n///\n/// Include <glm/gtx/spline.hpp> to use the features of this extension.\n///\n/// Spline functions\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/optimum_pow.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_spline is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_spline extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_spline\n\t/// @{\n\n\t/// Return a point from a catmull rom curve.\n\t/// @see gtx_spline extension.\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType catmullRom(\n\t\tgenType const& v1, \n\t\tgenType const& v2, \n\t\tgenType const& v3, \n\t\tgenType const& v4, \n\t\ttypename genType::value_type const& s);\n\t\t\n\t/// Return a point from a hermite curve.\n\t/// @see gtx_spline extension.\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType hermite(\n\t\tgenType const& v1, \n\t\tgenType const& t1, \n\t\tgenType const& v2, \n\t\tgenType const& t2, \n\t\ttypename genType::value_type const& s);\n\t\t\n\t/// Return a point from a cubic curve. \n\t/// @see gtx_spline extension.\n\ttemplate<typename genType> \n\tGLM_FUNC_DECL genType cubic(\n\t\tgenType const& v1, \n\t\tgenType const& v2, \n\t\tgenType const& v3, \n\t\tgenType const& v4, \n\t\ttypename genType::value_type const& s);\n\n\t/// @}\n}//namespace glm\n\n#include \"spline.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/spline.inl",
    "content": "/// @ref gtx_spline\n/// @file glm/gtx/spline.inl\n\nnamespace glm\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType catmullRom\n\t(\n\t\tgenType const& v1, \n\t\tgenType const& v2, \n\t\tgenType const& v3, \n\t\tgenType const& v4, \n\t\ttypename genType::value_type const& s\n\t)\n\t{\n\t\ttypename genType::value_type s2 = pow2(s);\n\t\ttypename genType::value_type s3 = pow3(s);\n\n\t\ttypename genType::value_type f1 = -s3 + typename genType::value_type(2) * s2 - s;\n\t\ttypename genType::value_type f2 = typename genType::value_type(3) * s3 - typename genType::value_type(5) * s2 + typename genType::value_type(2);\n\t\ttypename genType::value_type f3 = typename genType::value_type(-3) * s3 + typename genType::value_type(4) * s2 + s;\n\t\ttypename genType::value_type f4 = s3 - s2;\n\n\t\treturn (f1 * v1 + f2 * v2 + f3 * v3 + f4 * v4) / typename genType::value_type(2);\n\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType hermite\n\t(\n\t\tgenType const& v1, \n\t\tgenType const& t1, \n\t\tgenType const& v2, \n\t\tgenType const& t2, \n\t\ttypename genType::value_type const& s\n\t)\n\t{\n\t\ttypename genType::value_type s2 = pow2(s);\n\t\ttypename genType::value_type s3 = pow3(s);\n\n\t\ttypename genType::value_type f1 = typename genType::value_type(2) * s3 - typename genType::value_type(3) * s2 + typename genType::value_type(1);\n\t\ttypename genType::value_type f2 = typename genType::value_type(-2) * s3 + typename genType::value_type(3) * s2;\n\t\ttypename genType::value_type f3 = s3 - typename genType::value_type(2) * s2 + s;\n\t\ttypename genType::value_type f4 = s3 - s2;\n\n\t\treturn f1 * v1 + f2 * v2 + f3 * t1 + f4 * t2;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType cubic\n\t(\n\t\tgenType const& v1, \n\t\tgenType const& v2, \n\t\tgenType const& v3, \n\t\tgenType const& v4, \n\t\ttypename genType::value_type const& s\n\t)\n\t{\n\t\treturn ((v1 * s + v2) * s + v3) * s + v4;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/std_based_type.hpp",
    "content": "/// @ref gtx_std_based_type\n/// @file glm/gtx/std_based_type.hpp\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_std_based_type GLM_GTX_std_based_type\n/// @ingroup gtx\n///\n/// Include <glm/gtx/std_based_type.hpp> to use the features of this extension.\n///\n/// Adds vector types based on STL value types.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include <cstdlib>\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_std_based_type is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_std_based_type extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_std_based_type\n\t/// @{\n\n\t/// Vector type based of one std::size_t component.\n\t/// @see GLM_GTX_std_based_type\n\ttypedef vec<1, std::size_t, defaultp>\t\tsize1;\n\n\t/// Vector type based of two std::size_t components.\n\t/// @see GLM_GTX_std_based_type\n\ttypedef vec<2, std::size_t, defaultp>\t\tsize2;\n\n\t/// Vector type based of three std::size_t components.\n\t/// @see GLM_GTX_std_based_type\n\ttypedef vec<3, std::size_t, defaultp>\t\tsize3;\n\n\t/// Vector type based of four std::size_t components.\n\t/// @see GLM_GTX_std_based_type\n\ttypedef vec<4, std::size_t, defaultp>\t\tsize4;\n\n\t/// Vector type based of one std::size_t component.\n\t/// @see GLM_GTX_std_based_type\n\ttypedef vec<1, std::size_t, defaultp>\t\tsize1_t;\n\n\t/// Vector type based of two std::size_t components.\n\t/// @see GLM_GTX_std_based_type\n\ttypedef vec<2, std::size_t, defaultp>\t\tsize2_t;\n\n\t/// Vector type based of three std::size_t components.\n\t/// @see GLM_GTX_std_based_type\n\ttypedef vec<3, std::size_t, defaultp>\t\tsize3_t;\n\n\t/// Vector type based of four std::size_t components.\n\t/// @see GLM_GTX_std_based_type\n\ttypedef vec<4, std::size_t, defaultp>\t\tsize4_t;\n\n\t/// @}\n}//namespace glm\n\n#include \"std_based_type.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/std_based_type.inl",
    "content": "/// @ref gtx_std_based_type\n/// @file glm/gtx/std_based_type.inl\n\nnamespace glm\n{\n\n}\n"
  },
  {
    "path": "external/glm/glm/gtx/string_cast.hpp",
    "content": "/// @ref gtx_string_cast\n/// @file glm/gtx/string_cast.hpp\n///\n/// @see core (dependence)\n/// @see gtx_integer (dependence)\n/// @see gtx_quaternion (dependence)\n///\n/// @defgroup gtx_string_cast GLM_GTX_string_cast\n/// @ingroup gtx\n///\n/// Include <glm/gtx/string_cast.hpp> to use the features of this extension.\n///\n/// Setup strings for GLM type values\n///\n/// This extension is not supported with CUDA\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/type_precision.hpp\"\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtx/dual_quaternion.hpp\"\n#include <string>\n#include <cmath>\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_string_cast is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if(GLM_COMPILER & GLM_COMPILER_CUDA)\n#\terror \"GLM_GTX_string_cast is not supported on CUDA compiler\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_string_cast extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_string_cast\n\t/// @{\n\n\t/// Create a string from a GLM vector or matrix typed variable.\n\t/// @see gtx_string_cast extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL std::string to_string(genType const& x);\n\n\t/// @}\n}//namespace glm\n\n#include \"string_cast.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/string_cast.inl",
    "content": "/// @ref gtx_string_cast\n/// @file glm/gtx/string_cast.inl\n\n#include <cstdarg>\n#include <cstdio>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate <typename T>\n\tstruct cast\n\t{\n\t\ttypedef T value_type;\n\t};\n\n\ttemplate <>\n\tstruct cast<float>\n\t{\n\t\ttypedef double value_type;\n\t};\n\n\tGLM_FUNC_QUALIFIER std::string format(const char* msg, ...)\n\t{\n\t\tstd::size_t const STRING_BUFFER(4096);\n\t\tchar text[STRING_BUFFER];\n\t\tva_list list;\n\n\t\tif(msg == 0)\n\t\t\treturn std::string();\n\n\t\tva_start(list, msg);\n#\t\tif(GLM_COMPILER & GLM_COMPILER_VC)\n\t\t\tvsprintf_s(text, STRING_BUFFER, msg, list);\n#\t\telse//\n\t\t\tvsprintf(text, msg, list);\n#\t\tendif//\n\t\tva_end(list);\n\n\t\treturn std::string(text);\n\t}\n\n\tstatic const char* LabelTrue = \"true\";\n\tstatic const char* LabelFalse = \"false\";\n\n\ttemplate<typename T, bool isFloat = false>\n\tstruct literal\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"%d\";}\n\t};\n\n\ttemplate<typename T>\n\tstruct literal<T, true>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"%f\";}\n\t};\n\n#\tif GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC\n\ttemplate<>\n\tstruct literal<uint64_t, false>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"%lld\";}\n\t};\n\n\ttemplate<>\n\tstruct literal<int64_t, false>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"%lld\";}\n\t};\n#\tendif//GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC\n\n\ttemplate<typename T>\n\tstruct prefix{};\n\n\ttemplate<>\n\tstruct prefix<float>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<double>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"d\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<bool>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"b\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<uint8_t>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"u8\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<int8_t>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"i8\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<uint16_t>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"u16\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<int16_t>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"i16\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<uint32_t>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"u\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<int32_t>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"i\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<uint64_t>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"u64\";}\n\t};\n\n\ttemplate<>\n\tstruct prefix<int64_t>\n\t{\n\t\tGLM_FUNC_QUALIFIER static char const * value() {return \"i64\";}\n\t};\n\n\ttemplate<typename matType>\n\tstruct compute_to_string\n\t{};\n\n\ttemplate<qualifier Q>\n\tstruct compute_to_string<vec<1, bool, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(vec<1, bool, Q> const& x)\n\t\t{\n\t\t\treturn detail::format(\"bvec1(%s)\",\n\t\t\t\tx[0] ? detail::LabelTrue : detail::LabelFalse);\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_to_string<vec<2, bool, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(vec<2, bool, Q> const& x)\n\t\t{\n\t\t\treturn detail::format(\"bvec2(%s, %s)\",\n\t\t\t\tx[0] ? detail::LabelTrue : detail::LabelFalse,\n\t\t\t\tx[1] ? detail::LabelTrue : detail::LabelFalse);\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_to_string<vec<3, bool, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(vec<3, bool, Q> const& x)\n\t\t{\n\t\t\treturn detail::format(\"bvec3(%s, %s, %s)\",\n\t\t\t\tx[0] ? detail::LabelTrue : detail::LabelFalse,\n\t\t\t\tx[1] ? detail::LabelTrue : detail::LabelFalse,\n\t\t\t\tx[2] ? detail::LabelTrue : detail::LabelFalse);\n\t\t}\n\t};\n\n\ttemplate<qualifier Q>\n\tstruct compute_to_string<vec<4, bool, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(vec<4, bool, Q> const& x)\n\t\t{\n\t\t\treturn detail::format(\"bvec4(%s, %s, %s, %s)\",\n\t\t\t\tx[0] ? detail::LabelTrue : detail::LabelFalse,\n\t\t\t\tx[1] ? detail::LabelTrue : detail::LabelFalse,\n\t\t\t\tx[2] ? detail::LabelTrue : detail::LabelFalse,\n\t\t\t\tx[3] ? detail::LabelTrue : detail::LabelFalse);\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<vec<1, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(vec<1, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%svec1(%s)\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<vec<2, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(vec<2, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%svec2(%s, %s)\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<vec<3, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(vec<3, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%svec3(%s, %s, %s)\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0]), \n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1]), \n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<vec<4, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(vec<4, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%svec4(%s, %s, %s, %s)\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(), \n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[3]));\n\t\t}\n\t};\n\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<2, 2, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<2, 2, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat2x2((%s, %s), (%s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<2, 3, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<2, 3, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat2x3((%s, %s, %s), (%s, %s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<2, 4, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<2, 4, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat2x4((%s, %s, %s, %s), (%s, %s, %s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<3, 2, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<3, 2, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat3x2((%s, %s), (%s, %s), (%s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<3, 3, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<3, 3, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat3x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<3, 4, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<3, 4, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat3x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), static_cast<typename cast<T>::value_type>(x[2][3]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<4, 2, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<4, 2, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat4x2((%s, %s), (%s, %s), (%s, %s), (%s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<4, 3, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<4, 3, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat4x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s), (%s, %s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]), static_cast<typename cast<T>::value_type>(x[3][2]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<mat<4, 4, T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(mat<4, 4, T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%smat4x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), static_cast<typename cast<T>::value_type>(x[2][3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]), static_cast<typename cast<T>::value_type>(x[3][2]), static_cast<typename cast<T>::value_type>(x[3][3]));\n\t\t}\n\t};\n\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<tquat<T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(tquat<T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%squat(%s, {%s, %s, %s})\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[0]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x[2]));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_to_string<tdualquat<T, Q> >\n\t{\n\t\tGLM_FUNC_QUALIFIER static std::string call(tdualquat<T, Q> const& x)\n\t\t{\n\t\t\tchar const * PrefixStr = prefix<T>::value();\n\t\t\tchar const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();\n\t\t\tstd::string FormatStr(detail::format(\"%sdualquat((%s, {%s, %s, %s}), (%s, {%s, %s, %s}))\",\n\t\t\t\tPrefixStr,\n\t\t\t\tLiteralStr, LiteralStr, LiteralStr, LiteralStr));\n\n\t\t\treturn detail::format(FormatStr.c_str(),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x.real[3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x.real[0]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x.real[1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x.real[2]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x.dual[3]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x.dual[0]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x.dual[1]),\n\t\t\t\tstatic_cast<typename cast<T>::value_type>(x.dual[2]));\n\t\t}\n\t};\n\n}//namespace detail\n\ntemplate<class matType>\nGLM_FUNC_QUALIFIER std::string to_string(matType const& x)\n{\n\treturn detail::compute_to_string<matType>::call(x);\n}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/texture.hpp",
    "content": "/// @ref gtx_texture\n/// @file glm/gtx/texture.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_texture GLM_GTX_texture\n/// @ingroup gtx\n///\n/// Include <glm/gtx/texture.hpp> to use the features of this extension.\n///\n/// Wrapping mode of texture coordinates.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/integer.hpp\"\n#include \"../gtx/component_wise.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_texture is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_texture extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_texture\n\t/// @{\n\n\t/// Compute the number of mipmaps levels necessary to create a mipmap complete texture\n\t///\n\t/// @param Extent Extent of the texture base level mipmap\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point or signed integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\ttemplate <length_t L, typename T, qualifier Q>\n\tT levels(vec<L, T, Q> const& Extent);\n\n\t/// @}\n}// namespace glm\n\n#include \"texture.inl\"\n\n"
  },
  {
    "path": "external/glm/glm/gtx/texture.inl",
    "content": "/// @ref gtx_texture\n/// @file glm/gtx/texture.inl\n\nnamespace glm\n{\n\ttemplate <length_t L, typename T, qualifier Q>\n\tinline T levels(vec<L, T, Q> const& Extent)\n\t{\n\t\treturn glm::log2(compMax(Extent)) + static_cast<T>(1);\n\t}\n\n\ttemplate <typename T>\n\tinline T levels(T Extent)\n\t{\n\t\treturn vec<1, T, defaultp>(Extent).x;\n\t}\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/gtx/transform.hpp",
    "content": "/// @ref gtx_transform\n/// @file glm/gtx/transform.hpp\n///\n/// @see core (dependence)\n/// @see gtc_matrix_transform (dependence)\n/// @see gtx_transform\n/// @see gtx_transform2\n///\n/// @defgroup gtx_transform GLM_GTX_transform\n/// @ingroup gtx\n///\n/// Include <glm/gtx/transform.hpp> to use the features of this extension.\n///\n/// Add transformation matrices\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/matrix_transform.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_transform is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_transform extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_transform\n\t/// @{\n\n\t/// Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars.\n\t/// @see gtc_matrix_transform\n\t/// @see gtx_transform\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> translate(\n\t\tvec<3, T, Q> const& v);\n\n\t/// Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in radians. \n\t/// @see gtc_matrix_transform\n\t/// @see gtx_transform\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> rotate(\n\t\tT angle, \n\t\tvec<3, T, Q> const& v);\n\n\t/// Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components.\n\t/// @see gtc_matrix_transform\n\t/// @see gtx_transform\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> scale(\n\t\tvec<3, T, Q> const& v);\n\n\t/// @}\n}// namespace glm\n\n#include \"transform.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/transform.inl",
    "content": "/// @ref gtx_transform\n/// @file glm/gtx/transform.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(vec<3, T, Q> const& v)\n\t{\n\t\treturn translate(mat<4, 4, T, Q>(static_cast<T>(1)), v);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotate(T angle, vec<3, T, Q> const& v)\n\t{\n\t\treturn rotate(mat<4, 4, T, Q>(static_cast<T>(1)), angle, v);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> scale(vec<3, T, Q> const& v)\n\t{\n\t\treturn scale(mat<4, 4, T, Q>(static_cast<T>(1)), v);\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/transform2.hpp",
    "content": "/// @ref gtx_transform2\n/// @file glm/gtx/transform2.hpp\n///\n/// @see core (dependence)\n/// @see gtx_transform (dependence)\n///\n/// @defgroup gtx_transform2 GLM_GTX_transform2\n/// @ingroup gtx\n///\n/// Include <glm/gtx/transform2.hpp> to use the features of this extension.\n///\n/// Add extra transformation matrices\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/transform.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_transform2 is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_transform2 extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_transform2\n\t/// @{\n\n\t//! Transforms a matrix with a shearing on X axis.\n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<3, 3, T, Q> shearX2D(mat<3, 3, T, Q> const& m, T y);\n\n\t//! Transforms a matrix with a shearing on Y axis.\n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL mat<3, 3, T, Q> shearY2D(mat<3, 3, T, Q> const& m, T x);\n\n\t//! Transforms a matrix with a shearing on X axis\n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL mat<4, 4, T, Q> shearX3D(mat<4, 4, T, Q> const& m, T y, T z);\n\n\t//! Transforms a matrix with a shearing on Y axis.\n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL mat<4, 4, T, Q> shearY3D(mat<4, 4, T, Q> const& m, T x, T z);\n\n\t//! Transforms a matrix with a shearing on Z axis. \n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL mat<4, 4, T, Q> shearZ3D(mat<4, 4, T, Q> const& m, T x, T y);\n\n\t//template<typename T> GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shear(const mat<4, 4, T, Q> & m, shearPlane, planePoint, angle)\n\t// Identity + tan(angle) * cross(Normal, OnPlaneVector)     0\n\t// - dot(PointOnPlane, normal) * OnPlaneVector              1\n\n\t// Reflect functions seem to don't work\n\t//template<typename T> mat<3, 3, T, Q> reflect2D(const mat<3, 3, T, Q> & m, const vec<3, T, Q>& normal){return reflect2DGTX(m, normal);}\t\t\t\t\t\t\t\t\t//!< \\brief Build a reflection matrix (from GLM_GTX_transform2 extension)\n\t//template<typename T> mat<4, 4, T, Q> reflect3D(const mat<4, 4, T, Q> & m, const vec<3, T, Q>& normal){return reflect3DGTX(m, normal);}\t\t\t\t\t\t\t\t\t//!< \\brief Build a reflection matrix (from GLM_GTX_transform2 extension)\n\t\t\n\t//! Build planar projection matrix along normal axis.\n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_DECL mat<3, 3, T, Q> proj2D(mat<3, 3, T, Q> const& m, vec<3, T, Q> const& normal);\n\n\t//! Build planar projection matrix along normal axis.\n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> proj3D(mat<4, 4, T, Q> const & m, vec<3, T, Q> const& normal);\n\n\t//! Build a scale bias matrix. \n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> scaleBias(T scale, T bias);\n\n\t//! Build a scale bias matrix.\n\t//! From GLM_GTX_transform2 extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<4, 4, T, Q> scaleBias(mat<4, 4, T, Q> const& m, T scale, T bias);\n\n\t/// @}\n}// namespace glm\n\n#include \"transform2.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/transform2.inl",
    "content": "/// @ref gtx_transform2\n/// @file glm/gtx/transform2.inl\n\nnamespace glm\n{\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX2D(mat<3, 3, T, Q> const& m, T s)\n\t{\n\t\tmat<3, 3, T, Q> r(1);\n\t\tr[1][0] = s;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY2D(mat<3, 3, T, Q> const& m, T s)\n\t{\n\t\tmat<3, 3, T, Q> r(1);\n\t\tr[0][1] = s;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearX3D(mat<4, 4, T, Q> const& m, T s, T t)\n\t{\n\t\tmat<4, 4, T, Q> r(1);\n\t\tr[0][1] = s;\n\t\tr[0][2] = t;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearY3D(mat<4, 4, T, Q> const& m, T s, T t)\n\t{\n\t\tmat<4, 4, T, Q> r(1);\n\t\tr[1][0] = s;\n\t\tr[1][2] = t;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> shearZ3D(mat<4, 4, T, Q> const& m, T s, T t)\n\t{\n\t\tmat<4, 4, T, Q> r(1);\n\t\tr[2][0] = s;\n\t\tr[2][1] = t;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> reflect2D(mat<3, 3, T, Q> const& m, vec<3, T, Q> const& normal)\n\t{\n\t\tmat<3, 3, T, Q> r(static_cast<T>(1));\n\t\tr[0][0] = static_cast<T>(1) - static_cast<T>(2) * normal.x * normal.x;\n\t\tr[0][1] = -static_cast<T>(2) * normal.x * normal.y;\n\t\tr[1][0] = -static_cast<T>(2) * normal.x * normal.y;\n\t\tr[1][1] = static_cast<T>(1) - static_cast<T>(2) * normal.y * normal.y;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> reflect3D(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& normal)\n\t{\n\t\tmat<4, 4, T, Q> r(static_cast<T>(1));\n\t\tr[0][0] = static_cast<T>(1) - static_cast<T>(2) * normal.x * normal.x;\n\t\tr[0][1] = -static_cast<T>(2) * normal.x * normal.y;\n\t\tr[0][2] = -static_cast<T>(2) * normal.x * normal.z;\n\n\t\tr[1][0] = -static_cast<T>(2) * normal.x * normal.y;\n\t\tr[1][1] = static_cast<T>(1) - static_cast<T>(2) * normal.y * normal.y;\n\t\tr[1][2] = -static_cast<T>(2) * normal.y * normal.z;\n\n\t\tr[2][0] = -static_cast<T>(2) * normal.x * normal.z;\n\t\tr[2][1] = -static_cast<T>(2) * normal.y * normal.z;\n\t\tr[2][2] = static_cast<T>(1) - static_cast<T>(2) * normal.z * normal.z;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<3, 3, T, Q> proj2D(\n\t\tconst mat<3, 3, T, Q>& m, \n\t\tconst vec<3, T, Q>& normal)\n\t{\n\t\tmat<3, 3, T, Q> r(static_cast<T>(1));\n\t\tr[0][0] = static_cast<T>(1) - normal.x * normal.x;\n\t\tr[0][1] = - normal.x * normal.y;\n\t\tr[1][0] = - normal.x * normal.y;\n\t\tr[1][1] = static_cast<T>(1) - normal.y * normal.y;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> proj3D(\n\t\tconst mat<4, 4, T, Q>& m, \n\t\tconst vec<3, T, Q>& normal)\n\t{\n\t\tmat<4, 4, T, Q> r(static_cast<T>(1));\n\t\tr[0][0] = static_cast<T>(1) - normal.x * normal.x;\n\t\tr[0][1] = - normal.x * normal.y;\n\t\tr[0][2] = - normal.x * normal.z;\n\t\tr[1][0] = - normal.x * normal.y;\n\t\tr[1][1] = static_cast<T>(1) - normal.y * normal.y;\n\t\tr[1][2] = - normal.y * normal.z;\n\t\tr[2][0] = - normal.x * normal.z;\n\t\tr[2][1] = - normal.y * normal.z;\n\t\tr[2][2] = static_cast<T>(1) - normal.z * normal.z;\n\t\treturn m * r;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> scaleBias(T scale, T bias)\n\t{\n\t\tmat<4, 4, T, Q> result;\n\t\tresult[3] = vec<4, T, Q>(vec<3, T, Q>(bias), static_cast<T>(1));\n\t\tresult[0][0] = scale;\n\t\tresult[1][1] = scale;\n\t\tresult[2][2] = scale;\n\t\treturn result;\n\t}\n\n\ttemplate<typename T, qualifier Q> \n\tGLM_FUNC_QUALIFIER mat<4, 4, T, Q> scaleBias(mat<4, 4, T, Q> const& m, T scale, T bias)\n\t{\n\t\treturn m * scaleBias(scale, bias);\n\t}\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/gtx/type_aligned.hpp",
    "content": "/// @ref gtx_type_aligned\n/// @file glm/gtx/type_aligned.hpp\n///\n/// @see core (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtx_type_aligned GLM_GTX_type_aligned\n/// @ingroup gtx\n///\n/// Include <glm/gtx/type_aligned.hpp> to use the features of this extension.\n///\n/// Defines aligned types.\n///\n/// @ref core_precision defines aligned types.\n\n#pragma once\n\n// Dependency:\n#include \"../gtc/type_precision.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_type_aligned is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_type_aligned extension included\")\n#endif\n\nnamespace glm\n{\n\t///////////////////////////\n\t// Signed int vector types \n\n\t/// @addtogroup gtx_type_aligned\n\t/// @{\n\n\t/// Low qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_int8, aligned_lowp_int8, 1);\n\n\t/// Low qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_int16, aligned_lowp_int16, 2);\n\n\t/// Low qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_int32, aligned_lowp_int32, 4);\n\n\t/// Low qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_int64, aligned_lowp_int64, 8);\n\n\n\t/// Low qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_int8_t, aligned_lowp_int8_t, 1);\n\n\t/// Low qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_int16_t, aligned_lowp_int16_t, 2);\n\n\t/// Low qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_int32_t, aligned_lowp_int32_t, 4);\n\n\t/// Low qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_int64_t, aligned_lowp_int64_t, 8);\n\n\n\t/// Low qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_i8, aligned_lowp_i8, 1);\n\n\t/// Low qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_i16, aligned_lowp_i16, 2);\n\n\t/// Low qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_i32, aligned_lowp_i32, 4);\n\n\t/// Low qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_i64, aligned_lowp_i64, 8);\n\n\n\t/// Medium qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_int8, aligned_mediump_int8, 1);\n\n\t/// Medium qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_int16, aligned_mediump_int16, 2);\n\n\t/// Medium qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_int32, aligned_mediump_int32, 4);\n\n\t/// Medium qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_int64, aligned_mediump_int64, 8);\n\n\n\t/// Medium qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_int8_t, aligned_mediump_int8_t, 1);\n\n\t/// Medium qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_int16_t, aligned_mediump_int16_t, 2);\n\n\t/// Medium qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_int32_t, aligned_mediump_int32_t, 4);\n\n\t/// Medium qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_int64_t, aligned_mediump_int64_t, 8);\n\n\n\t/// Medium qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_i8, aligned_mediump_i8, 1);\n\n\t/// Medium qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_i16, aligned_mediump_i16, 2);\n\n\t/// Medium qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_i32, aligned_mediump_i32, 4);\n\n\t/// Medium qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_i64, aligned_mediump_i64, 8);\n\n\n\t/// High qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_int8, aligned_highp_int8, 1);\n\n\t/// High qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_int16, aligned_highp_int16, 2);\n\n\t/// High qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_int32, aligned_highp_int32, 4);\n\n\t/// High qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_int64, aligned_highp_int64, 8);\n\n\n\t/// High qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_int8_t, aligned_highp_int8_t, 1);\n\n\t/// High qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_int16_t, aligned_highp_int16_t, 2);\n\n\t/// High qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_int32_t, aligned_highp_int32_t, 4);\n\n\t/// High qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_int64_t, aligned_highp_int64_t, 8);\n\n\n\t/// High qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_i8, aligned_highp_i8, 1);\n\n\t/// High qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_i16, aligned_highp_i16, 2);\n\n\t/// High qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_i32, aligned_highp_i32, 4);\n\n\t/// High qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_i64, aligned_highp_i64, 8);\n\n\n\t/// Default qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(int8, aligned_int8, 1);\n\n\t/// Default qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(int16, aligned_int16, 2);\n\n\t/// Default qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(int32, aligned_int32, 4);\n\n\t/// Default qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(int64, aligned_int64, 8);\n\n\n\t/// Default qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(int8_t, aligned_int8_t, 1);\n\n\t/// Default qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(int16_t, aligned_int16_t, 2);\n\n\t/// Default qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(int32_t, aligned_int32_t, 4);\n\n\t/// Default qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(int64_t, aligned_int64_t, 8);\n\n\n\t/// Default qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i8, aligned_i8, 1);\n\n\t/// Default qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i16, aligned_i16, 2);\n\n\t/// Default qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i32, aligned_i32, 4);\n\n\t/// Default qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i64, aligned_i64, 8);\n\n\n\t/// Default qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(ivec1, aligned_ivec1, 4);\n\t\n\t/// Default qualifier 32 bit signed integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(ivec2, aligned_ivec2, 8);\n\n\t/// Default qualifier 32 bit signed integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(ivec3, aligned_ivec3, 16);\n\n\t/// Default qualifier 32 bit signed integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(ivec4, aligned_ivec4, 16);\n\n\n\t/// Default qualifier 8 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i8vec1, aligned_i8vec1, 1);\n\n\t/// Default qualifier 8 bit signed integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i8vec2, aligned_i8vec2, 2);\n\n\t/// Default qualifier 8 bit signed integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i8vec3, aligned_i8vec3, 4);\n\n\t/// Default qualifier 8 bit signed integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i8vec4, aligned_i8vec4, 4);\n\n\n\t/// Default qualifier 16 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i16vec1, aligned_i16vec1, 2);\n\t\n\t/// Default qualifier 16 bit signed integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i16vec2, aligned_i16vec2, 4);\n\n\t/// Default qualifier 16 bit signed integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i16vec3, aligned_i16vec3, 8);\n\n\t/// Default qualifier 16 bit signed integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i16vec4, aligned_i16vec4, 8);\n\n\n\t/// Default qualifier 32 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i32vec1, aligned_i32vec1, 4);\n\t\n\t/// Default qualifier 32 bit signed integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i32vec2, aligned_i32vec2, 8);\n\n\t/// Default qualifier 32 bit signed integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i32vec3, aligned_i32vec3, 16);\n\n\t/// Default qualifier 32 bit signed integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i32vec4, aligned_i32vec4, 16);\n\n\n\t/// Default qualifier 64 bit signed integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i64vec1, aligned_i64vec1, 8);\n\t\n\t/// Default qualifier 64 bit signed integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i64vec2, aligned_i64vec2, 16);\n\n\t/// Default qualifier 64 bit signed integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i64vec3, aligned_i64vec3, 32);\n\n\t/// Default qualifier 64 bit signed integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(i64vec4, aligned_i64vec4, 32);\n\n\n\t/////////////////////////////\n\t// Unsigned int vector types\n\n\t/// Low qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_uint8, aligned_lowp_uint8, 1);\n\n\t/// Low qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_uint16, aligned_lowp_uint16, 2);\n\n\t/// Low qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_uint32, aligned_lowp_uint32, 4);\n\n\t/// Low qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_uint64, aligned_lowp_uint64, 8);\n\n\n\t/// Low qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_uint8_t, aligned_lowp_uint8_t, 1);\n\n\t/// Low qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_uint16_t, aligned_lowp_uint16_t, 2);\n\n\t/// Low qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_uint32_t, aligned_lowp_uint32_t, 4);\n\n\t/// Low qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_uint64_t, aligned_lowp_uint64_t, 8);\n\n\n\t/// Low qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_u8, aligned_lowp_u8, 1);\n\n\t/// Low qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_u16, aligned_lowp_u16, 2);\n\n\t/// Low qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_u32, aligned_lowp_u32, 4);\n\n\t/// Low qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(lowp_u64, aligned_lowp_u64, 8);\n\n\n\t/// Medium qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_uint8, aligned_mediump_uint8, 1);\n\n\t/// Medium qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_uint16, aligned_mediump_uint16, 2);\n\n\t/// Medium qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_uint32, aligned_mediump_uint32, 4);\n\n\t/// Medium qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_uint64, aligned_mediump_uint64, 8);\n\n\n\t/// Medium qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_uint8_t, aligned_mediump_uint8_t, 1);\n\n\t/// Medium qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_uint16_t, aligned_mediump_uint16_t, 2);\n\n\t/// Medium qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_uint32_t, aligned_mediump_uint32_t, 4);\n\n\t/// Medium qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_uint64_t, aligned_mediump_uint64_t, 8);\n\n\n\t/// Medium qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_u8, aligned_mediump_u8, 1);\n\n\t/// Medium qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_u16, aligned_mediump_u16, 2);\n\n\t/// Medium qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_u32, aligned_mediump_u32, 4);\n\n\t/// Medium qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mediump_u64, aligned_mediump_u64, 8);\n\n\n\t/// High qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_uint8, aligned_highp_uint8, 1);\n\n\t/// High qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_uint16, aligned_highp_uint16, 2);\n\n\t/// High qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_uint32, aligned_highp_uint32, 4);\n\n\t/// High qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_uint64, aligned_highp_uint64, 8);\n\n\n\t/// High qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_uint8_t, aligned_highp_uint8_t, 1);\n\n\t/// High qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_uint16_t, aligned_highp_uint16_t, 2);\n\n\t/// High qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_uint32_t, aligned_highp_uint32_t, 4);\n\n\t/// High qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_uint64_t, aligned_highp_uint64_t, 8);\n\n\n\t/// High qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_u8, aligned_highp_u8, 1);\n\n\t/// High qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_u16, aligned_highp_u16, 2);\n\n\t/// High qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_u32, aligned_highp_u32, 4);\n\n\t/// High qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(highp_u64, aligned_highp_u64, 8);\n\n\n\t/// Default qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uint8, aligned_uint8, 1);\n\n\t/// Default qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uint16, aligned_uint16, 2);\n\n\t/// Default qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uint32, aligned_uint32, 4);\n\n\t/// Default qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uint64, aligned_uint64, 8);\n\n\n\t/// Default qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uint8_t, aligned_uint8_t, 1);\n\n\t/// Default qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uint16_t, aligned_uint16_t, 2);\n\n\t/// Default qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uint32_t, aligned_uint32_t, 4);\n\n\t/// Default qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uint64_t, aligned_uint64_t, 8);\n\n\n\t/// Default qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u8, aligned_u8, 1);\n\n\t/// Default qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u16, aligned_u16, 2);\n\n\t/// Default qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u32, aligned_u32, 4);\n\n\t/// Default qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u64, aligned_u64, 8);\n\n\n\t/// Default qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uvec1, aligned_uvec1, 4);\n\t\n\t/// Default qualifier 32 bit unsigned integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uvec2, aligned_uvec2, 8);\n\n\t/// Default qualifier 32 bit unsigned integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uvec3, aligned_uvec3, 16);\n\n\t/// Default qualifier 32 bit unsigned integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(uvec4, aligned_uvec4, 16);\n\n\n\t/// Default qualifier 8 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u8vec1, aligned_u8vec1, 1);\n\n\t/// Default qualifier 8 bit unsigned integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u8vec2, aligned_u8vec2, 2);\n\n\t/// Default qualifier 8 bit unsigned integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u8vec3, aligned_u8vec3, 4);\n\n\t/// Default qualifier 8 bit unsigned integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u8vec4, aligned_u8vec4, 4);\n\n\n\t/// Default qualifier 16 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u16vec1, aligned_u16vec1, 2);\n\t\n\t/// Default qualifier 16 bit unsigned integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u16vec2, aligned_u16vec2, 4);\n\n\t/// Default qualifier 16 bit unsigned integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u16vec3, aligned_u16vec3, 8);\n\n\t/// Default qualifier 16 bit unsigned integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u16vec4, aligned_u16vec4, 8);\n\n\n\t/// Default qualifier 32 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u32vec1, aligned_u32vec1, 4);\n\t\n\t/// Default qualifier 32 bit unsigned integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u32vec2, aligned_u32vec2, 8);\n\n\t/// Default qualifier 32 bit unsigned integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u32vec3, aligned_u32vec3, 16);\n\n\t/// Default qualifier 32 bit unsigned integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u32vec4, aligned_u32vec4, 16);\n\n\n\t/// Default qualifier 64 bit unsigned integer aligned scalar type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u64vec1, aligned_u64vec1, 8);\n\t\n\t/// Default qualifier 64 bit unsigned integer aligned vector of 2 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u64vec2, aligned_u64vec2, 16);\n\n\t/// Default qualifier 64 bit unsigned integer aligned vector of 3 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u64vec3, aligned_u64vec3, 32);\n\n\t/// Default qualifier 64 bit unsigned integer aligned vector of 4 components type.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(u64vec4, aligned_u64vec4, 32);\n\n\n\t//////////////////////\n\t// Float vector types\n\n\t/// 32 bit single-qualifier floating-point aligned scalar.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(float32, aligned_float32, 4);\n\n\t/// 32 bit single-qualifier floating-point aligned scalar.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(float32_t, aligned_float32_t, 4);\n\n\t/// 32 bit single-qualifier floating-point aligned scalar.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(float32, aligned_f32, 4);\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\n\t/// 64 bit double-qualifier floating-point aligned scalar.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(float64, aligned_float64, 8);\n\n\t/// 64 bit double-qualifier floating-point aligned scalar.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(float64_t, aligned_float64_t, 8);\n\n\t/// 64 bit double-qualifier floating-point aligned scalar.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(float64, aligned_f64, 8);\n\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n\n\t/// Single-qualifier floating-point aligned vector of 1 component.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(vec1, aligned_vec1, 4);\n\n\t/// Single-qualifier floating-point aligned vector of 2 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(vec2, aligned_vec2, 8);\n\n\t/// Single-qualifier floating-point aligned vector of 3 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(vec3, aligned_vec3, 16);\n\n\t/// Single-qualifier floating-point aligned vector of 4 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(vec4, aligned_vec4, 16);\n\n\n\t/// Single-qualifier floating-point aligned vector of 1 component.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fvec1, aligned_fvec1, 4);\n\n\t/// Single-qualifier floating-point aligned vector of 2 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fvec2, aligned_fvec2, 8);\n\n\t/// Single-qualifier floating-point aligned vector of 3 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fvec3, aligned_fvec3, 16);\n\n\t/// Single-qualifier floating-point aligned vector of 4 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fvec4, aligned_fvec4, 16);\n\n\n\t/// Single-qualifier floating-point aligned vector of 1 component.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32vec1, aligned_f32vec1, 4);\n\n\t/// Single-qualifier floating-point aligned vector of 2 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32vec2, aligned_f32vec2, 8);\n\n\t/// Single-qualifier floating-point aligned vector of 3 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32vec3, aligned_f32vec3, 16);\n\n\t/// Single-qualifier floating-point aligned vector of 4 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32vec4, aligned_f32vec4, 16);\n\n\n\t/// Double-qualifier floating-point aligned vector of 1 component.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(dvec1, aligned_dvec1, 8);\n\n\t/// Double-qualifier floating-point aligned vector of 2 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(dvec2, aligned_dvec2, 16);\n\n\t/// Double-qualifier floating-point aligned vector of 3 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(dvec3, aligned_dvec3, 32);\n\n\t/// Double-qualifier floating-point aligned vector of 4 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(dvec4, aligned_dvec4, 32);\n\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\n\t/// Double-qualifier floating-point aligned vector of 1 component.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64vec1, aligned_f64vec1, 8);\n\n\t/// Double-qualifier floating-point aligned vector of 2 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64vec2, aligned_f64vec2, 16);\n\n\t/// Double-qualifier floating-point aligned vector of 3 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64vec3, aligned_f64vec3, 32);\n\n\t/// Double-qualifier floating-point aligned vector of 4 components.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64vec4, aligned_f64vec4, 32);\n\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n\t//////////////////////\n\t// Float matrix types \n\n\t/// Single-qualifier floating-point aligned 1x1 matrix.\n\t/// @see gtx_type_aligned\n\t//typedef detail::tmat1<f32> mat1;\n\n\t/// Single-qualifier floating-point aligned 2x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mat2, aligned_mat2, 16);\n\n\t/// Single-qualifier floating-point aligned 3x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mat3, aligned_mat3, 16);\n\n\t/// Single-qualifier floating-point aligned 4x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mat4, aligned_mat4, 16);\n\n\n\t/// Single-qualifier floating-point aligned 1x1 matrix.\n\t/// @see gtx_type_aligned\n\t//typedef detail::tmat1x1<f32> mat1;\n\n\t/// Single-qualifier floating-point aligned 2x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mat2x2, aligned_mat2x2, 16);\n\n\t/// Single-qualifier floating-point aligned 3x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mat3x3, aligned_mat3x3, 16);\n\n\t/// Single-qualifier floating-point aligned 4x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(mat4x4, aligned_mat4x4, 16);\n\n\n\t/// Single-qualifier floating-point aligned 1x1 matrix.\n\t/// @see gtx_type_aligned\n\t//typedef detail::tmat1x1<f32> fmat1;\n\n\t/// Single-qualifier floating-point aligned 2x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2, 16);\n\n\t/// Single-qualifier floating-point aligned 3x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3, 16);\n\n\t/// Single-qualifier floating-point aligned 4x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4, 16);\n\n\n\t/// Single-qualifier floating-point aligned 1x1 matrix.\n\t/// @see gtx_type_aligned\n\t//typedef f32 fmat1x1;\n\n\t/// Single-qualifier floating-point aligned 2x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat2x2, aligned_fmat2x2, 16);\n\n\t/// Single-qualifier floating-point aligned 2x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat2x3, aligned_fmat2x3, 16);\n\n\t/// Single-qualifier floating-point aligned 2x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat2x4, aligned_fmat2x4, 16);\n\n\t/// Single-qualifier floating-point aligned 3x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat3x2, aligned_fmat3x2, 16);\n\n\t/// Single-qualifier floating-point aligned 3x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat3x3, aligned_fmat3x3, 16);\n\n\t/// Single-qualifier floating-point aligned 3x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat3x4, aligned_fmat3x4, 16);\n\n\t/// Single-qualifier floating-point aligned 4x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat4x2, aligned_fmat4x2, 16);\n\n\t/// Single-qualifier floating-point aligned 4x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat4x3, aligned_fmat4x3, 16);\n\n\t/// Single-qualifier floating-point aligned 4x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fmat4x4, aligned_fmat4x4, 16);\n\n\n\t/// Single-qualifier floating-point aligned 1x1 matrix.\n\t/// @see gtx_type_aligned\n\t//typedef detail::tmat1x1<f32, defaultp> f32mat1;\n\n\t/// Single-qualifier floating-point aligned 2x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2, 16);\n\n\t/// Single-qualifier floating-point aligned 3x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3, 16);\n\n\t/// Single-qualifier floating-point aligned 4x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4, 16);\n\n\n\t/// Single-qualifier floating-point aligned 1x1 matrix.\n\t/// @see gtx_type_aligned\n\t//typedef f32 f32mat1x1;\n\n\t/// Single-qualifier floating-point aligned 2x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat2x2, aligned_f32mat2x2, 16);\n\n\t/// Single-qualifier floating-point aligned 2x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat2x3, aligned_f32mat2x3, 16);\n\n\t/// Single-qualifier floating-point aligned 2x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat2x4, aligned_f32mat2x4, 16);\n\n\t/// Single-qualifier floating-point aligned 3x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat3x2, aligned_f32mat3x2, 16);\n\n\t/// Single-qualifier floating-point aligned 3x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat3x3, aligned_f32mat3x3, 16);\n\n\t/// Single-qualifier floating-point aligned 3x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat3x4, aligned_f32mat3x4, 16);\n\n\t/// Single-qualifier floating-point aligned 4x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat4x2, aligned_f32mat4x2, 16);\n\n\t/// Single-qualifier floating-point aligned 4x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat4x3, aligned_f32mat4x3, 16);\n\n\t/// Single-qualifier floating-point aligned 4x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32mat4x4, aligned_f32mat4x4, 16);\n\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\n\t/// Double-qualifier floating-point aligned 1x1 matrix.\n\t/// @see gtx_type_aligned\n\t//typedef detail::tmat1x1<f64, defaultp> f64mat1;\n\n\t/// Double-qualifier floating-point aligned 2x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2, 32);\n\n\t/// Double-qualifier floating-point aligned 3x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3, 32);\n\n\t/// Double-qualifier floating-point aligned 4x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4, 32);\n\n\n\t/// Double-qualifier floating-point aligned 1x1 matrix.\n\t/// @see gtx_type_aligned\n\t//typedef f64 f64mat1x1;\n\n\t/// Double-qualifier floating-point aligned 2x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat2x2, aligned_f64mat2x2, 32);\n\n\t/// Double-qualifier floating-point aligned 2x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat2x3, aligned_f64mat2x3, 32);\n\n\t/// Double-qualifier floating-point aligned 2x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat2x4, aligned_f64mat2x4, 32);\n\n\t/// Double-qualifier floating-point aligned 3x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat3x2, aligned_f64mat3x2, 32);\n\n\t/// Double-qualifier floating-point aligned 3x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat3x3, aligned_f64mat3x3, 32);\n\n\t/// Double-qualifier floating-point aligned 3x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat3x4, aligned_f64mat3x4, 32);\n\n\t/// Double-qualifier floating-point aligned 4x2 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat4x2, aligned_f64mat4x2, 32);\n\n\t/// Double-qualifier floating-point aligned 4x3 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat4x3, aligned_f64mat4x3, 32);\n\n\t/// Double-qualifier floating-point aligned 4x4 matrix.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64mat4x4, aligned_f64mat4x4, 32);\n\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n\n\t//////////////////////////\n\t// Quaternion types\n\n\t/// Single-qualifier floating-point aligned quaternion.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(quat, aligned_quat, 16);\n\n\t/// Single-qualifier floating-point aligned quaternion.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(fquat, aligned_fquat, 16);\n\n\t/// Double-qualifier floating-point aligned quaternion.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(dquat, aligned_dquat, 32);\n\n\t/// Single-qualifier floating-point aligned quaternion.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f32quat, aligned_f32quat, 16);\n\n#\tifndef GLM_FORCE_SINGLE_ONLY\n\n\t/// Double-qualifier floating-point aligned quaternion.\n\t/// @see gtx_type_aligned\n\tGLM_ALIGNED_TYPEDEF(f64quat, aligned_f64quat, 32);\n\n#\tendif//GLM_FORCE_SINGLE_ONLY\n\n\t/// @}\n}//namespace glm\n\n#include \"type_aligned.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/type_aligned.inl",
    "content": "/// @ref gtc_type_aligned\n/// @file glm/gtc/type_aligned.inl\n\nnamespace glm\n{\n\n}\n"
  },
  {
    "path": "external/glm/glm/gtx/type_trait.hpp",
    "content": "/// @ref gtx_type_trait\n/// @file glm/gtx/type_trait.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_type_trait GLM_GTX_type_trait\n/// @ingroup gtx\n///\n/// Include <glm/gtx/type_trait.hpp> to use the features of this extension.\n///\n/// Defines traits for each type.\n\n#pragma once\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_type_trait is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n// Dependency:\n#include \"../detail/type_vec2.hpp\"\n#include \"../detail/type_vec3.hpp\"\n#include \"../detail/type_vec4.hpp\"\n#include \"../detail/type_mat2x2.hpp\"\n#include \"../detail/type_mat2x3.hpp\"\n#include \"../detail/type_mat2x4.hpp\"\n#include \"../detail/type_mat3x2.hpp\"\n#include \"../detail/type_mat3x3.hpp\"\n#include \"../detail/type_mat3x4.hpp\"\n#include \"../detail/type_mat4x2.hpp\"\n#include \"../detail/type_mat4x3.hpp\"\n#include \"../detail/type_mat4x4.hpp\"\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtx/dual_quaternion.hpp\"\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_type_trait extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_type_trait\n\t/// @{\n\n\ttemplate<typename T>\n\tstruct type\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = false;\n\t\tstatic bool const is_quat = false;\n\t\tstatic length_t const components = 0;\n\t\tstatic length_t const cols = 0;\n\t\tstatic length_t const rows = 0;\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct type<vec<L, T, Q> >\n\t{\n\t\tstatic bool const is_vec = true;\n\t\tstatic bool const is_mat = false;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = L\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<2, 2, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 2,\n\t\t\tcols = 2,\n\t\t\trows = 2\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<2, 3, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 2,\n\t\t\tcols = 2,\n\t\t\trows = 3\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<2, 4, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 2,\n\t\t\tcols = 2,\n\t\t\trows = 4\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<3, 2, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 3,\n\t\t\tcols = 3,\n\t\t\trows = 2\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<3, 3, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 3,\n\t\t\tcols = 3,\n\t\t\trows = 3\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<3, 4, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 3,\n\t\t\tcols = 3,\n\t\t\trows = 4\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<4, 2, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 4,\n\t\t\tcols = 4,\n\t\t\trows = 2\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<4, 3, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 4,\n\t\t\tcols = 4,\n\t\t\trows = 3\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<mat<4, 4, T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = true;\n\t\tstatic bool const is_quat = false;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 4,\n\t\t\tcols = 4,\n\t\t\trows = 4\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<tquat<T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = false;\n\t\tstatic bool const is_quat = true;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 4\n\t\t};\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct type<tdualquat<T, Q> >\n\t{\n\t\tstatic bool const is_vec = false;\n\t\tstatic bool const is_mat = false;\n\t\tstatic bool const is_quat = true;\n\t\tenum\n\t\t{\n\t\t\tcomponents = 8\n\t\t};\n\t};\n\n\t/// @}\n}//namespace glm\n\n#include \"type_trait.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/type_trait.inl",
    "content": ""
  },
  {
    "path": "external/glm/glm/gtx/vec_swizzle.hpp",
    "content": "/// @ref gtx_vec_swizzle\n/// @file glm/gtx/vec_swizzle.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_vec_swizzle GLM_GTX_vec_swizzle\n/// @ingroup gtx\n///\n/// Include <glm/gtx/vec_swizzle.hpp> to use the features of this extension.\n///\n/// Functions to perform swizzle operation.\n\n#pragma once\n\n#include \"../glm.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_vec_swizzle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\nnamespace glm {\n\t// xx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<1, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.x);\n\t}\n\n\t// xy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.y);\n\t}\n\n\t// xz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.z);\n\t}\n\n\t// xw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> xw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.x, v.w);\n\t}\n\n\t// yx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.x);\n\t}\n\n\t// yy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.y);\n\t}\n\n\t// yz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.z);\n\t}\n\n\t// yw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> yw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.y, v.w);\n\t}\n\n\t// zx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> zx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.z, v.x);\n\t}\n\n\t// zy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> zy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.z, v.y);\n\t}\n\n\t// zz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> zz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.z, v.z);\n\t}\n\n\t// zw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> zw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.z, v.w);\n\t}\n\n\t// wx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> wx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.w, v.x);\n\t}\n\n\t// wy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> wy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.w, v.y);\n\t}\n\n\t// wz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> wz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.w, v.z);\n\t}\n\n\t// ww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<2, T, Q> ww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<2, T, Q>(v.w, v.w);\n\t}\n\n\t// xxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<1, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.x);\n\t}\n\n\t// xxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.y);\n\t}\n\n\t// xxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.z);\n\t}\n\n\t// xxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.x, v.w);\n\t}\n\n\t// xyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.x);\n\t}\n\n\t// xyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.y);\n\t}\n\n\t// xyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.z);\n\t}\n\n\t// xyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.y, v.w);\n\t}\n\n\t// xzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.z, v.x);\n\t}\n\n\t// xzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.z, v.y);\n\t}\n\n\t// xzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.z, v.z);\n\t}\n\n\t// xzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.z, v.w);\n\t}\n\n\t// xwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.w, v.x);\n\t}\n\n\t// xwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.w, v.y);\n\t}\n\n\t// xwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.w, v.z);\n\t}\n\n\t// xww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> xww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.x, v.w, v.w);\n\t}\n\n\t// yxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.x);\n\t}\n\n\t// yxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.y);\n\t}\n\n\t// yxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.z);\n\t}\n\n\t// yxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.x, v.w);\n\t}\n\n\t// yyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.x);\n\t}\n\n\t// yyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.y);\n\t}\n\n\t// yyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.z);\n\t}\n\n\t// yyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.y, v.w);\n\t}\n\n\t// yzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.z, v.x);\n\t}\n\n\t// yzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.z, v.y);\n\t}\n\n\t// yzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.z, v.z);\n\t}\n\n\t// yzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.z, v.w);\n\t}\n\n\t// ywx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> ywx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.w, v.x);\n\t}\n\n\t// ywy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> ywy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.w, v.y);\n\t}\n\n\t// ywz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> ywz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.w, v.z);\n\t}\n\n\t// yww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> yww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.y, v.w, v.w);\n\t}\n\n\t// zxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.x, v.x);\n\t}\n\n\t// zxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.x, v.y);\n\t}\n\n\t// zxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.x, v.z);\n\t}\n\n\t// zxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.x, v.w);\n\t}\n\n\t// zyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.y, v.x);\n\t}\n\n\t// zyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.y, v.y);\n\t}\n\n\t// zyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.y, v.z);\n\t}\n\n\t// zyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.y, v.w);\n\t}\n\n\t// zzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.z, v.x);\n\t}\n\n\t// zzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.z, v.y);\n\t}\n\n\t// zzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.z, v.z);\n\t}\n\n\t// zzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.z, v.w);\n\t}\n\n\t// zwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.w, v.x);\n\t}\n\n\t// zwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.w, v.y);\n\t}\n\n\t// zwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.w, v.z);\n\t}\n\n\t// zww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> zww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.z, v.w, v.w);\n\t}\n\n\t// wxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.x, v.x);\n\t}\n\n\t// wxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.x, v.y);\n\t}\n\n\t// wxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.x, v.z);\n\t}\n\n\t// wxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.x, v.w);\n\t}\n\n\t// wyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.y, v.x);\n\t}\n\n\t// wyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.y, v.y);\n\t}\n\n\t// wyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.y, v.z);\n\t}\n\n\t// wyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.y, v.w);\n\t}\n\n\t// wzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.z, v.x);\n\t}\n\n\t// wzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.z, v.y);\n\t}\n\n\t// wzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.z, v.z);\n\t}\n\n\t// wzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.z, v.w);\n\t}\n\n\t// wwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.w, v.x);\n\t}\n\n\t// wwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.w, v.y);\n\t}\n\n\t// wwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> wwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.w, v.z);\n\t}\n\n\t// www\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<3, T, Q> www(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<3, T, Q>(v.w, v.w, v.w);\n\t}\n\n\t// xxxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<1, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);\n\t}\n\n\t// xxxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);\n\t}\n\n\t// xxxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.z);\n\t}\n\n\t// xxxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.x, v.w);\n\t}\n\n\t// xxyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);\n\t}\n\n\t// xxyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);\n\t}\n\n\t// xxyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.z);\n\t}\n\n\t// xxyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.y, v.w);\n\t}\n\n\t// xxzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.z, v.x);\n\t}\n\n\t// xxzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.z, v.y);\n\t}\n\n\t// xxzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.z, v.z);\n\t}\n\n\t// xxzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.z, v.w);\n\t}\n\n\t// xxwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.w, v.x);\n\t}\n\n\t// xxwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.w, v.y);\n\t}\n\n\t// xxwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.w, v.z);\n\t}\n\n\t// xxww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xxww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.x, v.w, v.w);\n\t}\n\n\t// xyxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);\n\t}\n\n\t// xyxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);\n\t}\n\n\t// xyxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.z);\n\t}\n\n\t// xyxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.x, v.w);\n\t}\n\n\t// xyyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);\n\t}\n\n\t// xyyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);\n\t}\n\n\t// xyyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.z);\n\t}\n\n\t// xyyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.y, v.w);\n\t}\n\n\t// xyzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.z, v.x);\n\t}\n\n\t// xyzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.z, v.y);\n\t}\n\n\t// xyzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.z, v.z);\n\t}\n\n\t// xyzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.z, v.w);\n\t}\n\n\t// xywx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xywx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.w, v.x);\n\t}\n\n\t// xywy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xywy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.w, v.y);\n\t}\n\n\t// xywz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xywz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.w, v.z);\n\t}\n\n\t// xyww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xyww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.y, v.w, v.w);\n\t}\n\n\t// xzxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.x, v.x);\n\t}\n\n\t// xzxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.x, v.y);\n\t}\n\n\t// xzxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.x, v.z);\n\t}\n\n\t// xzxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.x, v.w);\n\t}\n\n\t// xzyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.y, v.x);\n\t}\n\n\t// xzyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.y, v.y);\n\t}\n\n\t// xzyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.y, v.z);\n\t}\n\n\t// xzyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.y, v.w);\n\t}\n\n\t// xzzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.z, v.x);\n\t}\n\n\t// xzzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.z, v.y);\n\t}\n\n\t// xzzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.z, v.z);\n\t}\n\n\t// xzzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.z, v.w);\n\t}\n\n\t// xzwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.w, v.x);\n\t}\n\n\t// xzwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.w, v.y);\n\t}\n\n\t// xzwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.w, v.z);\n\t}\n\n\t// xzww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xzww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.z, v.w, v.w);\n\t}\n\n\t// xwxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.x, v.x);\n\t}\n\n\t// xwxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.x, v.y);\n\t}\n\n\t// xwxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.x, v.z);\n\t}\n\n\t// xwxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.x, v.w);\n\t}\n\n\t// xwyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.y, v.x);\n\t}\n\n\t// xwyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.y, v.y);\n\t}\n\n\t// xwyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.y, v.z);\n\t}\n\n\t// xwyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.y, v.w);\n\t}\n\n\t// xwzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.z, v.x);\n\t}\n\n\t// xwzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.z, v.y);\n\t}\n\n\t// xwzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.z, v.z);\n\t}\n\n\t// xwzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.z, v.w);\n\t}\n\n\t// xwwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.w, v.x);\n\t}\n\n\t// xwwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.w, v.y);\n\t}\n\n\t// xwwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.w, v.z);\n\t}\n\n\t// xwww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> xwww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.x, v.w, v.w, v.w);\n\t}\n\n\t// yxxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);\n\t}\n\n\t// yxxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);\n\t}\n\n\t// yxxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.z);\n\t}\n\n\t// yxxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.x, v.w);\n\t}\n\n\t// yxyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);\n\t}\n\n\t// yxyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);\n\t}\n\n\t// yxyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.z);\n\t}\n\n\t// yxyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.y, v.w);\n\t}\n\n\t// yxzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.z, v.x);\n\t}\n\n\t// yxzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.z, v.y);\n\t}\n\n\t// yxzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.z, v.z);\n\t}\n\n\t// yxzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.z, v.w);\n\t}\n\n\t// yxwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.w, v.x);\n\t}\n\n\t// yxwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.w, v.y);\n\t}\n\n\t// yxwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.w, v.z);\n\t}\n\n\t// yxww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yxww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.x, v.w, v.w);\n\t}\n\n\t// yyxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);\n\t}\n\n\t// yyxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);\n\t}\n\n\t// yyxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.z);\n\t}\n\n\t// yyxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.x, v.w);\n\t}\n\n\t// yyyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);\n\t}\n\n\t// yyyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<2, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);\n\t}\n\n\t// yyyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.z);\n\t}\n\n\t// yyyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.y, v.w);\n\t}\n\n\t// yyzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.z, v.x);\n\t}\n\n\t// yyzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.z, v.y);\n\t}\n\n\t// yyzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.z, v.z);\n\t}\n\n\t// yyzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.z, v.w);\n\t}\n\n\t// yywx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yywx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.w, v.x);\n\t}\n\n\t// yywy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yywy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.w, v.y);\n\t}\n\n\t// yywz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yywz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.w, v.z);\n\t}\n\n\t// yyww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yyww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.y, v.w, v.w);\n\t}\n\n\t// yzxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.x, v.x);\n\t}\n\n\t// yzxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.x, v.y);\n\t}\n\n\t// yzxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.x, v.z);\n\t}\n\n\t// yzxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.x, v.w);\n\t}\n\n\t// yzyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.y, v.x);\n\t}\n\n\t// yzyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.y, v.y);\n\t}\n\n\t// yzyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.y, v.z);\n\t}\n\n\t// yzyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.y, v.w);\n\t}\n\n\t// yzzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.z, v.x);\n\t}\n\n\t// yzzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.z, v.y);\n\t}\n\n\t// yzzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.z, v.z);\n\t}\n\n\t// yzzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.z, v.w);\n\t}\n\n\t// yzwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.w, v.x);\n\t}\n\n\t// yzwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.w, v.y);\n\t}\n\n\t// yzwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.w, v.z);\n\t}\n\n\t// yzww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> yzww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.z, v.w, v.w);\n\t}\n\n\t// ywxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.x, v.x);\n\t}\n\n\t// ywxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.x, v.y);\n\t}\n\n\t// ywxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.x, v.z);\n\t}\n\n\t// ywxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.x, v.w);\n\t}\n\n\t// ywyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.y, v.x);\n\t}\n\n\t// ywyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.y, v.y);\n\t}\n\n\t// ywyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.y, v.z);\n\t}\n\n\t// ywyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.y, v.w);\n\t}\n\n\t// ywzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.z, v.x);\n\t}\n\n\t// ywzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.z, v.y);\n\t}\n\n\t// ywzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.z, v.z);\n\t}\n\n\t// ywzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.z, v.w);\n\t}\n\n\t// ywwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.w, v.x);\n\t}\n\n\t// ywwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.w, v.y);\n\t}\n\n\t// ywwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.w, v.z);\n\t}\n\n\t// ywww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> ywww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.y, v.w, v.w, v.w);\n\t}\n\n\t// zxxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.x, v.x);\n\t}\n\n\t// zxxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.x, v.y);\n\t}\n\n\t// zxxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.x, v.z);\n\t}\n\n\t// zxxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.x, v.w);\n\t}\n\n\t// zxyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.y, v.x);\n\t}\n\n\t// zxyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.y, v.y);\n\t}\n\n\t// zxyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.y, v.z);\n\t}\n\n\t// zxyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.y, v.w);\n\t}\n\n\t// zxzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.z, v.x);\n\t}\n\n\t// zxzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.z, v.y);\n\t}\n\n\t// zxzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.z, v.z);\n\t}\n\n\t// zxzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.z, v.w);\n\t}\n\n\t// zxwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.w, v.x);\n\t}\n\n\t// zxwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.w, v.y);\n\t}\n\n\t// zxwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.w, v.z);\n\t}\n\n\t// zxww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zxww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.x, v.w, v.w);\n\t}\n\n\t// zyxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.x, v.x);\n\t}\n\n\t// zyxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.x, v.y);\n\t}\n\n\t// zyxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.x, v.z);\n\t}\n\n\t// zyxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.x, v.w);\n\t}\n\n\t// zyyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.y, v.x);\n\t}\n\n\t// zyyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.y, v.y);\n\t}\n\n\t// zyyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.y, v.z);\n\t}\n\n\t// zyyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.y, v.w);\n\t}\n\n\t// zyzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.z, v.x);\n\t}\n\n\t// zyzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.z, v.y);\n\t}\n\n\t// zyzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.z, v.z);\n\t}\n\n\t// zyzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.z, v.w);\n\t}\n\n\t// zywx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zywx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.w, v.x);\n\t}\n\n\t// zywy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zywy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.w, v.y);\n\t}\n\n\t// zywz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zywz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.w, v.z);\n\t}\n\n\t// zyww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zyww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.y, v.w, v.w);\n\t}\n\n\t// zzxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.x, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.x, v.x);\n\t}\n\n\t// zzxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.x, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.x, v.y);\n\t}\n\n\t// zzxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.x, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.x, v.z);\n\t}\n\n\t// zzxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.x, v.w);\n\t}\n\n\t// zzyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.y, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.y, v.x);\n\t}\n\n\t// zzyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.y, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.y, v.y);\n\t}\n\n\t// zzyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.y, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.y, v.z);\n\t}\n\n\t// zzyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.y, v.w);\n\t}\n\n\t// zzzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.z, v.x);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.z, v.x);\n\t}\n\n\t// zzzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.z, v.y);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.z, v.y);\n\t}\n\n\t// zzzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<3, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.z, v.z);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.z, v.z);\n\t}\n\n\t// zzzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.z, v.w);\n\t}\n\n\t// zzwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.w, v.x);\n\t}\n\n\t// zzwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.w, v.y);\n\t}\n\n\t// zzwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.w, v.z);\n\t}\n\n\t// zzww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zzww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.z, v.w, v.w);\n\t}\n\n\t// zwxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.x, v.x);\n\t}\n\n\t// zwxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.x, v.y);\n\t}\n\n\t// zwxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.x, v.z);\n\t}\n\n\t// zwxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.x, v.w);\n\t}\n\n\t// zwyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.y, v.x);\n\t}\n\n\t// zwyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.y, v.y);\n\t}\n\n\t// zwyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.y, v.z);\n\t}\n\n\t// zwyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.y, v.w);\n\t}\n\n\t// zwzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.z, v.x);\n\t}\n\n\t// zwzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.z, v.y);\n\t}\n\n\t// zwzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.z, v.z);\n\t}\n\n\t// zwzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.z, v.w);\n\t}\n\n\t// zwwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.w, v.x);\n\t}\n\n\t// zwwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.w, v.y);\n\t}\n\n\t// zwwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.w, v.z);\n\t}\n\n\t// zwww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> zwww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.z, v.w, v.w, v.w);\n\t}\n\n\t// wxxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.x, v.x);\n\t}\n\n\t// wxxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.x, v.y);\n\t}\n\n\t// wxxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.x, v.z);\n\t}\n\n\t// wxxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.x, v.w);\n\t}\n\n\t// wxyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.y, v.x);\n\t}\n\n\t// wxyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.y, v.y);\n\t}\n\n\t// wxyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.y, v.z);\n\t}\n\n\t// wxyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.y, v.w);\n\t}\n\n\t// wxzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.z, v.x);\n\t}\n\n\t// wxzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.z, v.y);\n\t}\n\n\t// wxzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.z, v.z);\n\t}\n\n\t// wxzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.z, v.w);\n\t}\n\n\t// wxwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.w, v.x);\n\t}\n\n\t// wxwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.w, v.y);\n\t}\n\n\t// wxwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.w, v.z);\n\t}\n\n\t// wxww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wxww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.x, v.w, v.w);\n\t}\n\n\t// wyxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.x, v.x);\n\t}\n\n\t// wyxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.x, v.y);\n\t}\n\n\t// wyxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.x, v.z);\n\t}\n\n\t// wyxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.x, v.w);\n\t}\n\n\t// wyyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.y, v.x);\n\t}\n\n\t// wyyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.y, v.y);\n\t}\n\n\t// wyyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.y, v.z);\n\t}\n\n\t// wyyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.y, v.w);\n\t}\n\n\t// wyzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.z, v.x);\n\t}\n\n\t// wyzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.z, v.y);\n\t}\n\n\t// wyzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.z, v.z);\n\t}\n\n\t// wyzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.z, v.w);\n\t}\n\n\t// wywx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wywx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.w, v.x);\n\t}\n\n\t// wywy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wywy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.w, v.y);\n\t}\n\n\t// wywz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wywz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.w, v.z);\n\t}\n\n\t// wyww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wyww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.y, v.w, v.w);\n\t}\n\n\t// wzxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.x, v.x);\n\t}\n\n\t// wzxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.x, v.y);\n\t}\n\n\t// wzxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.x, v.z);\n\t}\n\n\t// wzxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.x, v.w);\n\t}\n\n\t// wzyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.y, v.x);\n\t}\n\n\t// wzyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.y, v.y);\n\t}\n\n\t// wzyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.y, v.z);\n\t}\n\n\t// wzyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.y, v.w);\n\t}\n\n\t// wzzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.z, v.x);\n\t}\n\n\t// wzzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.z, v.y);\n\t}\n\n\t// wzzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.z, v.z);\n\t}\n\n\t// wzzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.z, v.w);\n\t}\n\n\t// wzwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.w, v.x);\n\t}\n\n\t// wzwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.w, v.y);\n\t}\n\n\t// wzwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.w, v.z);\n\t}\n\n\t// wzww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wzww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.z, v.w, v.w);\n\t}\n\n\t// wwxx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwxx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.x, v.x);\n\t}\n\n\t// wwxy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwxy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.x, v.y);\n\t}\n\n\t// wwxz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwxz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.x, v.z);\n\t}\n\n\t// wwxw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwxw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.x, v.w);\n\t}\n\n\t// wwyx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwyx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.y, v.x);\n\t}\n\n\t// wwyy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwyy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.y, v.y);\n\t}\n\n\t// wwyz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwyz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.y, v.z);\n\t}\n\n\t// wwyw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwyw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.y, v.w);\n\t}\n\n\t// wwzx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwzx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.z, v.x);\n\t}\n\n\t// wwzy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwzy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.z, v.y);\n\t}\n\n\t// wwzz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwzz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.z, v.z);\n\t}\n\n\t// wwzw\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwzw(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.z, v.w);\n\t}\n\n\t// wwwx\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwwx(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.w, v.x);\n\t}\n\n\t// wwwy\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwwy(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.w, v.y);\n\t}\n\n\t// wwwz\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwwz(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.w, v.z);\n\t}\n\n\t// wwww\n\ttemplate<typename T, qualifier Q>\n\tGLM_INLINE glm::vec<4, T, Q> wwww(const glm::vec<4, T, Q> &v) {\n\t\treturn glm::vec<4, T, Q>(v.w, v.w, v.w, v.w);\n\t}\n\n}\n"
  },
  {
    "path": "external/glm/glm/gtx/vector_angle.hpp",
    "content": "/// @ref gtx_vector_angle\n/// @file glm/gtx/vector_angle.hpp\n///\n/// @see core (dependence)\n/// @see gtx_quaternion (dependence)\n/// @see gtx_epsilon (dependence)\n///\n/// @defgroup gtx_vector_angle GLM_GTX_vector_angle\n/// @ingroup gtx\n///\n/// Include <glm/gtx/vector_angle.hpp> to use the features of this extension.\n///\n/// Compute angle between vectors\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/epsilon.hpp\"\n#include \"../gtx/quaternion.hpp\"\n#include \"../gtx/rotate_vector.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_vector_angle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_vector_angle extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_vector_angle\n\t/// @{\n\n\t//! Returns the absolute angle between two vectors.\n\t//! Parameters need to be normalized.\n\t/// @see gtx_vector_angle extension.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL T angle(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t//! Returns the oriented angle between two 2d vectors.\n\t//! Parameters need to be normalized.\n\t/// @see gtx_vector_angle extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T orientedAngle(vec<2, T, Q> const& x, vec<2, T, Q> const& y);\n\n\t//! Returns the oriented angle between two 3d vectors based from a reference axis.\n\t//! Parameters need to be normalized.\n\t/// @see gtx_vector_angle extension.\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_DECL T orientedAngle(vec<3, T, Q> const& x, vec<3, T, Q> const& y, vec<3, T, Q> const& ref);\n\n\t/// @}\n}// namespace glm\n\n#include \"vector_angle.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/vector_angle.inl",
    "content": "/// @ref gtx_vector_angle\n/// @file glm/gtx/vector_angle.inl\n\nnamespace glm\n{\n\ttemplate<typename genType> \n\tGLM_FUNC_QUALIFIER genType angle\n\t(\n\t\tgenType const& x,\n\t\tgenType const& y\n\t)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, \"'angle' only accept floating-point inputs\");\n\t\treturn acos(clamp(dot(x, y), genType(-1), genType(1)));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T angle(vec<L, T, Q> const& x, vec<L, T, Q> const& y)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'angle' only accept floating-point inputs\");\n\t\treturn acos(clamp(dot(x, y), T(-1), T(1)));\n\t}\n\n\t//! \\todo epsilon is hard coded to 0.01\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T orientedAngle(vec<2, T, Q> const& x, vec<2, T, Q> const& y)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'orientedAngle' only accept floating-point inputs\");\n\t\tT const Angle(acos(clamp(dot(x, y), T(-1), T(1))));\n\n\t\tif(all(epsilonEqual(y, glm::rotate(x, Angle), T(0.0001))))\n\t\t\treturn Angle;\n\t\telse\n\t\t\treturn -Angle;\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER T orientedAngle(vec<3, T, Q> const& x, vec<3, T, Q> const& y, vec<3, T, Q> const& ref)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'orientedAngle' only accept floating-point inputs\");\n\n\t\tT const Angle(acos(clamp(dot(x, y), T(-1), T(1))));\n\t\treturn mix(Angle, -Angle, dot(ref, cross(x, y)) < T(0));\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/vector_query.hpp",
    "content": "/// @ref gtx_vector_query\n/// @file glm/gtx/vector_query.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_vector_query GLM_GTX_vector_query\n/// @ingroup gtx\n///\n/// Include <glm/gtx/vector_query.hpp> to use the features of this extension.\n///\n/// Query informations of vector types\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include <cfloat>\n#include <limits>\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_vector_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_vector_query extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_vector_query\n\t/// @{\n\n\t//! Check whether two vectors are collinears.\n\t/// @see gtx_vector_query extensions.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL bool areCollinear(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon);\n\t\t\n\t//! Check whether two vectors are orthogonals.\n\t/// @see gtx_vector_query extensions.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL bool areOrthogonal(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon);\n\n\t//! Check whether a vector is normalized.\n\t/// @see gtx_vector_query extensions.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL bool isNormalized(vec<L, T, Q> const& v, T const& epsilon);\n\t\t\n\t//! Check whether a vector is null.\n\t/// @see gtx_vector_query extensions.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL bool isNull(vec<L, T, Q> const& v, T const& epsilon);\n\n\t//! Check whether a each component of a vector is null.\n\t/// @see gtx_vector_query extensions.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> isCompNull(vec<L, T, Q> const& v, T const& epsilon);\n\n\t//! Check whether two vectors are orthonormal.\n\t/// @see gtx_vector_query extensions.\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL bool areOrthonormal(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon);\n\n\t/// @}\n}// namespace glm\n\n#include \"vector_query.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/vector_query.inl",
    "content": "/// @ref gtx_vector_query\n/// @file glm/gtx/vector_query.inl\n\n#include <cassert>\n\nnamespace glm{\nnamespace detail\n{\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct compute_areCollinear{};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_areCollinear<2, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static bool call(vec<2, T, Q> const& v0, vec<2, T, Q> const& v1, T const& epsilon)\n\t\t{\n\t\t\treturn length(cross(vec<3, T, Q>(v0, static_cast<T>(0)), vec<3, T, Q>(v1, static_cast<T>(0)))) < epsilon;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_areCollinear<3, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static bool call(vec<3, T, Q> const& v0, vec<3, T, Q> const& v1, T const& epsilon)\n\t\t{\n\t\t\treturn length(cross(v0, v1)) < epsilon;\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_areCollinear<4, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static bool call(vec<4, T, Q> const& v0, vec<4, T, Q> const& v1, T const& epsilon)\n\t\t{\n\t\t\treturn length(cross(vec<3, T, Q>(v0), vec<3, T, Q>(v1))) < epsilon;\n\t\t}\n\t};\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tstruct compute_isCompNull{};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_isCompNull<2, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<2, bool, Q> call(vec<2, T, Q> const& v, T const& epsilon)\n\t\t{\n\t\t\treturn vec<2, bool, Q>(\n\t\t\t\t(abs(v.x) < epsilon),\n\t\t\t\t(abs(v.y) < epsilon));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_isCompNull<3, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<3, bool, Q> call(vec<3, T, Q> const& v, T const& epsilon)\n\t\t{\n\t\t\treturn vec<3, bool, Q>(\n\t\t\t\t(abs(v.x) < epsilon),\n\t\t\t\t(abs(v.y) < epsilon),\n\t\t\t\t(abs(v.z) < epsilon));\n\t\t}\n\t};\n\n\ttemplate<typename T, qualifier Q>\n\tstruct compute_isCompNull<4, T, Q>\n\t{\n\t\tGLM_FUNC_QUALIFIER static vec<4, bool, Q> call(vec<4, T, Q> const& v, T const& epsilon)\n\t\t{\n\t\t\treturn vec<4, bool, Q>(\n\t\t\t\t(abs(v.x) < epsilon),\n\t\t\t\t(abs(v.y) < epsilon),\n\t\t\t\t(abs(v.z) < epsilon),\n\t\t\t\t(abs(v.w) < epsilon));\n\t\t}\n\t};\n\n}//namespace detail\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool areCollinear(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'areCollinear' only accept floating-point inputs\");\n\n\t\treturn detail::compute_areCollinear<L, T, Q>::call(v0, v1, epsilon);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool areOrthogonal(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'areOrthogonal' only accept floating-point inputs\");\n\n\t\treturn abs(dot(v0, v1)) <= max(\n\t\t\tstatic_cast<T>(1),\n\t\t\tlength(v0)) * max(static_cast<T>(1), length(v1)) * epsilon;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isNormalized(vec<L, T, Q> const& v, T const& epsilon)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isNormalized' only accept floating-point inputs\");\n\n\t\treturn abs(length(v) - static_cast<T>(1)) <= static_cast<T>(2) * epsilon;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool isNull(vec<L, T, Q> const& v, T const& epsilon)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isNull' only accept floating-point inputs\");\n\n\t\treturn length(v) <= epsilon;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, bool, Q> isCompNull(vec<L, T, Q> const& v, T const& epsilon)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, \"'isCompNull' only accept floating-point inputs\");\n\n\t\treturn detail::compute_isCompNull<L, T, Q>::call(v, epsilon);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<2, bool, Q> isCompNull(vec<2, T, Q> const& v, T const& epsilon)\n\t{\n\t\treturn vec<2, bool, Q>(\n\t\t\tabs(v.x) < epsilon,\n\t\t\tabs(v.y) < epsilon);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<3, bool, Q> isCompNull(vec<3, T, Q> const& v, T const& epsilon)\n\t{\n\t\treturn vec<3, bool, Q>(\n\t\t\tabs(v.x) < epsilon,\n\t\t\tabs(v.y) < epsilon,\n\t\t\tabs(v.z) < epsilon);\n\t}\n\n\ttemplate<typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<4, bool, Q> isCompNull(vec<4, T, Q> const& v, T const& epsilon)\n\t{\n\t\treturn vec<4, bool, Q>(\n\t\t\tabs(v.x) < epsilon,\n\t\t\tabs(v.y) < epsilon,\n\t\t\tabs(v.z) < epsilon,\n\t\t\tabs(v.w) < epsilon);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER bool areOrthonormal(vec<L, T, Q> const& v0, vec<L, T, Q> const& v1, T const& epsilon)\n\t{\n\t\treturn isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon);\n\t}\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/gtx/wrap.hpp",
    "content": "/// @ref gtx_wrap\n/// @file glm/gtx/wrap.hpp\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_wrap GLM_GTX_wrap\n/// @ingroup gtx\n///\n/// Include <glm/gtx/wrap.hpp> to use the features of this extension.\n///\n/// Wrapping mode of texture coordinates.\n\n#pragma once\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/vec1.hpp\"\n\n#ifndef GLM_ENABLE_EXPERIMENTAL\n#\terror \"GLM: GLM_GTX_wrap is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it.\"\n#endif\n\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)\n#\tpragma message(\"GLM: GLM_GTX_wrap extension included\")\n#endif\n\nnamespace glm\n{\n\t/// @addtogroup gtx_wrap\n\t/// @{\n\n\t/// Simulate GL_CLAMP OpenGL wrap mode\n\t/// @see gtx_wrap extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType clamp(genType const& Texcoord);\n\n\t/// Simulate GL_REPEAT OpenGL wrap mode\n\t/// @see gtx_wrap extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType repeat(genType const& Texcoord);\n\n\t/// Simulate GL_MIRRORED_REPEAT OpenGL wrap mode\n\t/// @see gtx_wrap extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType mirrorClamp(genType const& Texcoord);\n\n\t/// Simulate GL_MIRROR_REPEAT OpenGL wrap mode\n\t/// @see gtx_wrap extension.\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL genType mirrorRepeat(genType const& Texcoord);\n\n\t/// @}\n}// namespace glm\n\n#include \"wrap.inl\"\n"
  },
  {
    "path": "external/glm/glm/gtx/wrap.inl",
    "content": "/// @ref gtx_wrap\n/// @file glm/gtx/wrap.inl\n\nnamespace glm\n{\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> clamp(vec<L, T, Q> const& Texcoord)\n\t{\n\t\treturn glm::clamp(Texcoord, vec<L, T, Q>(0), vec<L, T, Q>(1));\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType clamp(genType const& Texcoord)\n\t{\n\t\treturn clamp(vec<1, genType, defaultp>(Texcoord)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> repeat(vec<L, T, Q> const& Texcoord)\n\t{\n\t\treturn glm::fract(Texcoord);\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType repeat(genType const& Texcoord)\n\t{\n\t\treturn repeat(vec<1, genType, defaultp>(Texcoord)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> mirrorClamp(vec<L, T, Q> const& Texcoord)\n\t{\n\t\treturn glm::fract(glm::abs(Texcoord));\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType mirrorClamp(genType const& Texcoord)\n\t{\n\t\treturn mirrorClamp(vec<1, genType, defaultp>(Texcoord)).x;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER vec<L, T, Q> mirrorRepeat(vec<L, T, Q> const& Texcoord)\n\t{\n\t\tvec<L, T, Q> const Abs = glm::abs(Texcoord);\n\t\tvec<L, T, Q> const Clamp = glm::mod(glm::floor(Abs), vec<L, T, Q>(2));\n\t\tvec<L, T, Q> const Floor = glm::floor(Abs);\n\t\tvec<L, T, Q> const Rest = Abs - Floor;\n\t\tvec<L, T, Q> const Mirror = Clamp + Rest;\n\t\treturn mix(Rest, vec<L, T, Q>(1) - Rest, glm::greaterThanEqual(Mirror, vec<L, T, Q>(1)));\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType mirrorRepeat(genType const& Texcoord)\n\t{\n\t\treturn mirrorRepeat(vec<1, genType, defaultp>(Texcoord)).x;\n\t}\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/integer.hpp",
    "content": "/// @ref core\n/// @file glm/integer.hpp\n///\n/// @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>\n/// \n/// @defgroup core_func_integer Integer functions\n/// @ingroup core\n/// \n/// Include <glm/integer.hpp> to use these core features.\n///\n/// These all operate component-wise. The description is per component. \n/// The notation [a, b] means the set of bits from bit-number a through bit-number \n/// b, inclusive. The lowest-order bit is bit 0.\n\n#pragma once\n\n#include \"detail/setup.hpp\"\n#include \"detail/qualifier.hpp\"\n#include \"common.hpp\"\n#include \"vector_relational.hpp\"\n\nnamespace glm\n{\n\t/// @addtogroup core_func_integer\n\t/// @{\n\n\t/// Adds 32-bit unsigned integer x and y, returning the sum\n\t/// modulo pow(2, 32). The value carry is set to 0 if the sum was\n\t/// less than pow(2, 32), or to 1 otherwise.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uaddCarry.xml\">GLSL uaddCarry man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, uint, Q> uaddCarry(\n\t\tvec<L, uint, Q> const& x,\n\t\tvec<L, uint, Q> const& y,\n\t\tvec<L, uint, Q> & carry);\n\n\t/// Subtracts the 32-bit unsigned integer y from x, returning\n\t/// the difference if non-negative, or pow(2, 32) plus the difference\n\t/// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/usubBorrow.xml\">GLSL usubBorrow man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, uint, Q> usubBorrow(\n\t\tvec<L, uint, Q> const& x,\n\t\tvec<L, uint, Q> const& y,\n\t\tvec<L, uint, Q> & borrow);\n\n\t/// Multiplies 32-bit integers x and y, producing a 64-bit\n\t/// result. The 32 least-significant bits are returned in lsb.\n\t/// The 32 most-significant bits are returned in msb.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/umulExtended.xml\">GLSL umulExtended man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL void umulExtended(\n\t\tvec<L, uint, Q> const& x,\n\t\tvec<L, uint, Q> const& y,\n\t\tvec<L, uint, Q> & msb,\n\t\tvec<L, uint, Q> & lsb);\n\n\t/// Multiplies 32-bit integers x and y, producing a 64-bit\n\t/// result. The 32 least-significant bits are returned in lsb.\n\t/// The 32 most-significant bits are returned in msb.\n\t/// \n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/imulExtended.xml\">GLSL imulExtended man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL void imulExtended(\n\t\tvec<L, int, Q> const& x,\n\t\tvec<L, int, Q> const& y,\n\t\tvec<L, int, Q> & msb,\n\t\tvec<L, int, Q> & lsb);\n\n\t/// Extracts bits [offset, offset + bits - 1] from value,\n\t/// returning them in the least significant bits of the result.\n\t/// For unsigned data types, the most significant bits of the\n\t/// result will be set to zero. For signed data types, the\n\t/// most significant bits will be set to the value of bit offset + base - 1.\n\t///\n\t/// If bits is zero, the result will be zero. The result will be\n\t/// undefined if offset or bits is negative, or if the sum of\n\t/// offset and bits is greater than the number of bits used\n\t/// to store the operand.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Signed or unsigned integer scalar types.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldExtract.xml\">GLSL bitfieldExtract man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> bitfieldExtract(\n\t\tvec<L, T, Q> const& Value,\n\t\tint Offset,\n\t\tint Bits);\n\n\t/// Returns the insertion the bits least-significant bits of insert into base.\n\t///\n\t/// The result will have bits [offset, offset + bits - 1] taken\n\t/// from bits [0, bits - 1] of insert, and all other bits taken\n\t/// directly from the corresponding bits of base. If bits is\n\t/// zero, the result will simply be base. The result will be\n\t/// undefined if offset or bits is negative, or if the sum of\n\t/// offset and bits is greater than the number of bits used to\n\t/// store the operand.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Signed or unsigned integer scalar or vector types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldInsert.xml\">GLSL bitfieldInsert man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> bitfieldInsert(\n\t\tvec<L, T, Q> const& Base,\n\t\tvec<L, T, Q> const& Insert,\n\t\tint Offset,\n\t\tint Bits);\n\n\t/// Returns the reversal of the bits of value. \n\t/// The bit numbered n of the result will be taken from bit (bits - 1) - n of value, \n\t/// where bits is the total number of bits used to represent value.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Signed or unsigned integer scalar or vector types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldReverse.xml\">GLSL bitfieldReverse man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> bitfieldReverse(vec<L, T, Q> const& v);\n\n\t/// Returns the number of bits set to 1 in the binary representation of value.\n\t///\n\t/// @tparam genType Signed or unsigned integer scalar or vector types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml\">GLSL bitCount man page</a>\n\t/// @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>\n\ttemplate<typename genType>\n\tGLM_FUNC_DECL int bitCount(genType v);\n\n\t/// Returns the number of bits set to 1 in the binary representation of value.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Signed or unsigned integer scalar or vector types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml\">GLSL bitCount man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, int, Q> bitCount(vec<L, T, Q> const& v);\n\n\t/// Returns the bit number of the least significant bit set to\n\t/// 1 in the binary representation of value. \n\t/// If value is zero, -1 will be returned.\n\t///\n\t/// @tparam genIUType Signed or unsigned integer scalar types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml\">GLSL findLSB man page</a>\n\t/// @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>\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL int findLSB(genIUType x);\n\n\t/// Returns the bit number of the least significant bit set to\n\t/// 1 in the binary representation of value. \n\t/// If value is zero, -1 will be returned.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Signed or unsigned integer scalar types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml\">GLSL findLSB man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, int, Q> findLSB(vec<L, T, Q> const& v);\n\n\t/// Returns the bit number of the most significant bit in the binary representation of value.\n\t/// For positive integers, the result will be the bit number of the most significant bit set to 1. \n\t/// For negative integers, the result will be the bit number of the most significant\n\t/// bit set to 0. For a value of zero or negative one, -1 will be returned.\n\t///\n\t/// @tparam genIUType Signed or unsigned integer scalar types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml\">GLSL findMSB man page</a>\n\t/// @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>\n\ttemplate<typename genIUType>\n\tGLM_FUNC_DECL int findMSB(genIUType x);\n\n\t/// Returns the bit number of the most significant bit in the binary representation of value.\n\t/// For positive integers, the result will be the bit number of the most significant bit set to 1. \n\t/// For negative integers, the result will be the bit number of the most significant\n\t/// bit set to 0. For a value of zero or negative one, -1 will be returned.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T Signed or unsigned integer scalar types.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml\">GLSL findMSB man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, int, Q> findMSB(vec<L, T, Q> const& v);\n\n\t/// @}\n}//namespace glm\n\n#include \"detail/func_integer.inl\"\n"
  },
  {
    "path": "external/glm/glm/mat2x2.hpp",
    "content": "/// @ref core\n/// @file glm/mat2x2.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat2x2.hpp\"\n\nnamespace glm\n{\n\t/// 2 columns of 2 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, lowp>\t\tlowp_mat2;\n\t\n\t/// 2 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, mediump>\t\tmediump_mat2;\n\t\n\t/// 2 columns of 2 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, highp>\t\thighp_mat2;\n\t\n\t/// 2 columns of 2 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, lowp>\t\tlowp_mat2x2;\n\t\n\t/// 2 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, mediump>\t\tmediump_mat2x2;\n\t\n\t/// 2 columns of 2 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 2, float, highp>\t\thighp_mat2x2;\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/mat2x3.hpp",
    "content": "/// @ref core\n/// @file glm/mat2x3.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat2x3.hpp\"\n\nnamespace glm\n{\n\t/// 2 columns of 3 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, float, lowp>\t\tlowp_mat2x3;\n\n\t/// 2 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, float, mediump>\t\tmediump_mat2x3;\n\n\t/// 2 columns of 3 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 3, float, highp>\t\thighp_mat2x3;\n\n}//namespace glm\n\n"
  },
  {
    "path": "external/glm/glm/mat2x4.hpp",
    "content": "/// @ref core\n/// @file glm/mat2x4.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat2x4.hpp\"\n\nnamespace glm\n{\n\t/// 2 columns of 4 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, float, lowp>\t\tlowp_mat2x4;\n\t\n\t/// 2 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, float, mediump>\t\tmediump_mat2x4;\n\t\n\t/// 2 columns of 4 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<2, 4, float, highp>\t\thighp_mat2x4;\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/mat3x2.hpp",
    "content": "/// @ref core\n/// @file glm/mat3x2.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat3x2.hpp\"\n\nnamespace glm\n{\n\t/// 3 columns of 2 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, float, lowp>\t\tlowp_mat3x2;\n\t\n\t/// 3 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, float, mediump>\t\tmediump_mat3x2;\n\t\n\t/// 3 columns of 2 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 2, float, highp>\t\thighp_mat3x2;\n\n}//namespace\n"
  },
  {
    "path": "external/glm/glm/mat3x3.hpp",
    "content": "/// @ref core\n/// @file glm/mat3x3.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat3x3.hpp\"\n\nnamespace glm\n{\n\t/// 3 columns of 3 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, lowp>\t\tlowp_mat3;\n\t\n\t/// 3 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, mediump>\t\tmediump_mat3;\n\t\n\t/// 3 columns of 3 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, highp>\t\thighp_mat3;\n\t\n\t/// 3 columns of 3 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, lowp>\t\tlowp_mat3x3;\n\t\n\t/// 3 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, mediump>\t\tmediump_mat3x3;\n\t\n\t/// 3 columns of 3 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 3, float, highp>\t\thighp_mat3x3;\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/mat3x4.hpp",
    "content": "/// @ref core\n/// @file glm/mat3x4.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat3x4.hpp\"\n\nnamespace glm\n{\n\t/// 3 columns of 4 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, float, lowp>\t\tlowp_mat3x4;\n\t\n\t/// 3 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, float, mediump>\t\tmediump_mat3x4;\n\t\n\t/// 3 columns of 4 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<3, 4, float, highp>\t\thighp_mat3x4;\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/mat4x2.hpp",
    "content": "/// @ref core\n/// @file glm/mat4x2.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat4x2.hpp\"\n\nnamespace glm\n{\n\t/// 4 columns of 2 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, float, lowp>\t\tlowp_mat4x2;\n\t\n\t/// 4 columns of 2 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, float, mediump>\t\tmediump_mat4x2;\n\t\n\t/// 4 columns of 2 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 2, float, highp>\t\thighp_mat4x2;\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/mat4x3.hpp",
    "content": "/// @ref core\n/// @file glm/mat4x3.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat4x3.hpp\"\n\nnamespace glm\n{\n\t/// 4 columns of 3 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, float, lowp>\t\tlowp_mat4x3;\n\t\n\t/// 4 columns of 3 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, float, mediump>\t\tmediump_mat4x3;\n\t\n\t/// 4 columns of 3 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 3, float, highp>\t\thighp_mat4x3;\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/mat4x4.hpp",
    "content": "/// @ref core\n/// @file glm/mat4x4.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_mat4x4.hpp\"\n\nnamespace glm\n{\n\t/// 4 columns of 4 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, lowp>\t\tlowp_mat4;\n\t\n\t/// 4 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, mediump>\t\tmediump_mat4;\n\t\n\t/// 4 columns of 4 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, highp>\t\thighp_mat4;\n\t\n\t/// 4 columns of 4 components matrix of low qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, lowp>\t\tlowp_mat4x4;\n\t\n\t/// 4 columns of 4 components matrix of medium qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, mediump>\t\tmediump_mat4x4;\n\t\n\t/// 4 columns of 4 components matrix of high qualifier floating-point numbers.\n\t/// There is no guarantee on the actual qualifier.\n\t///\n\t/// @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>\n\t/// @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>\n\ttypedef mat<4, 4, float, highp>\t\thighp_mat4x4;\n\n}//namespace glm\n"
  },
  {
    "path": "external/glm/glm/matrix.hpp",
    "content": "/// @ref core\n/// @file glm/matrix.hpp\n///\n/// @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>\n/// \n/// @defgroup core_func_matrix Matrix functions\n/// @ingroup core\n/// \n/// Include <glm/matrix.hpp> to use these core features.\n///\n/// For each of the following built-in matrix functions, there is both a \n/// single-qualifier floating point version, where all arguments and return values \n/// are single qualifier, and a double-qualifier floating version, where all \n/// arguments and return values are double qualifier. Only the single-qualifier \n/// floating point version is shown.\n\n#pragma once\n\n// Dependencies\n#include \"detail/qualifier.hpp\"\n#include \"detail/setup.hpp\"\n#include \"detail/type_mat.hpp\"\n#include \"vec2.hpp\"\n#include \"vec3.hpp\"\n#include \"vec4.hpp\"\n#include \"mat2x2.hpp\"\n#include \"mat2x3.hpp\"\n#include \"mat2x4.hpp\"\n#include \"mat3x2.hpp\"\n#include \"mat3x3.hpp\"\n#include \"mat3x4.hpp\"\n#include \"mat4x2.hpp\"\n#include \"mat4x3.hpp\"\n#include \"mat4x4.hpp\"\n\nnamespace glm {\n\tnamespace detail\n\t{\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<2, 2, T, Q>\n\t\t{\n\t\t\ttypedef mat<2, 2, T, Q> type;\n\t\t};\n\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<2, 3, T, Q>\n\t\t{\n\t\t\ttypedef mat<3, 2, T, Q> type;\n\t\t};\n\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<2, 4, T, Q>\n\t\t{\n\t\t\ttypedef mat<4, 2, T, Q> type;\n\t\t};\n\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<3, 2, T, Q>\n\t\t{\n\t\t\ttypedef mat<2, 3, T, Q> type;\n\t\t};\n\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<3, 3, T, Q>\n\t\t{\n\t\t\ttypedef mat<3, 3, T, Q> type;\n\t\t};\n\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<3, 4, T, Q>\n\t\t{\n\t\t\ttypedef mat<4, 3, T, Q> type;\n\t\t};\n\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<4, 2, T, Q>\n\t\t{\n\t\t\ttypedef mat<2, 4, T, Q> type;\n\t\t};\n\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<4, 3, T, Q>\n\t\t{\n\t\t\ttypedef mat<3, 4, T, Q> type;\n\t\t};\n\n\t\ttemplate<typename T, qualifier Q>\n\t\tstruct outerProduct_trait<4, 4, T, Q>\n\t\t{\n\t\t\ttypedef mat<4, 4, T, Q> type;\n\t\t};\n\n\t}//namespace detail\n\n\t /// @addtogroup core_func_matrix\n\t /// @{\n\n\t /// Multiply matrix x by matrix y component-wise, i.e., \n\t /// result[i][j] is the scalar product of x[i][j] and y[i][j].\n\t /// \n\t /// @tparam C Integer between 1 and 4 included that qualify the number a column\n\t /// @tparam R Integer between 1 and 4 included that qualify the number a row\n\t /// @tparam T Floating-point or signed integer scalar types\n\t /// @tparam Q Value from qualifier enum\n\t ///\n\t /// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml\">GLSL matrixCompMult man page</a>\n\t /// @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>\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<C, R, T, Q> matrixCompMult(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y);\n\n\t/// Treats the first parameter c as a column vector\n\t/// and the second parameter r as a row vector\n\t/// and does a linear algebraic matrix multiply c * r.\n\t/// \n\t/// @tparam C Integer between 1 and 4 included that qualify the number a column\n\t/// @tparam R Integer between 1 and 4 included that qualify the number a row\n\t/// @tparam T Floating-point or signed integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/outerProduct.xml\">GLSL outerProduct man page</a>\n\t/// @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>\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL typename detail::outerProduct_trait<C, R, T, Q>::type outerProduct(vec<C, T, Q> const& c, vec<R, T, Q> const& r);\n\n\t/// Returns the transposed matrix of x\n\t/// \n\t/// @tparam C Integer between 1 and 4 included that qualify the number a column\n\t/// @tparam R Integer between 1 and 4 included that qualify the number a row\n\t/// @tparam T Floating-point or signed integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/transpose.xml\">GLSL transpose man page</a>\n\t/// @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>\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL typename mat<C, R, T, Q>::transpose_type transpose(mat<C, R, T, Q> const& x);\n\n\t/// Return the determinant of a squared matrix.\n\t/// \n\t/// @tparam C Integer between 1 and 4 included that qualify the number a column\n\t/// @tparam R Integer between 1 and 4 included that qualify the number a row\n\t/// @tparam T Floating-point or signed integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml\">GLSL determinant man page</a>\n\t/// @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>\t\n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL T determinant(mat<C, R, T, Q> const& m);\n\n\t/// Return the inverse of a squared matrix.\n\t/// \n\t/// @tparam C Integer between 1 and 4 included that qualify the number a column\n\t/// @tparam R Integer between 1 and 4 included that qualify the number a row\n\t/// @tparam T Floating-point or signed integer scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml\">GLSL inverse man page</a>\n\t/// @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>\t \n\ttemplate<length_t C, length_t R, typename T, qualifier Q>\n\tGLM_FUNC_DECL mat<C, R, T, Q> inverse(mat<C, R, T, Q> const& m);\n\n\t/// @}\n}//namespace glm\n\n#include \"detail/func_matrix.inl\"\n"
  },
  {
    "path": "external/glm/glm/packing.hpp",
    "content": "/// @ref core\n/// @file glm/packing.hpp\n///\n/// @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>\n/// @see gtc_packing\n///\n/// @defgroup core_func_packing Floating-Point Pack and Unpack Functions\n/// @ingroup core\n///\n/// Include <glm/packing.hpp> to use these core features.\n///\n/// These functions do not operate component-wise, rather as described in each case.\n\n#pragma once\n\n#include \"detail/type_vec2.hpp\"\n#include \"detail/type_vec4.hpp\"\n\nnamespace glm\n{\n\t/// @addtogroup core_func_packing\n\t/// @{\n\n\t/// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. \n\t/// Then, the results are packed into the returned 32-bit unsigned integer.\n\t/// \n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) \n\t/// \n\t/// The first component of the vector will be written to the least significant bits of the output; \n\t/// the last component will be written to the most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml\">GLSL packUnorm2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint packUnorm2x16(vec2 const& v);\n\n\t/// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. \n\t/// Then, the results are packed into the returned 32-bit unsigned integer.\n\t/// \n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packSnorm2x16: round(clamp(v, -1, +1) * 32767.0)\n\t/// \n\t/// The first component of the vector will be written to the least significant bits of the output; \n\t/// the last component will be written to the most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml\">GLSL packSnorm2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint packSnorm2x16(vec2 const& v);\n\n\t/// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. \n\t/// Then, the results are packed into the returned 32-bit unsigned integer.\n\t/// \n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packUnorm4x8:\tround(clamp(c, 0, +1) * 255.0)\n\t/// \n\t/// The first component of the vector will be written to the least significant bits of the output; \n\t/// the last component will be written to the most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL packUnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint packUnorm4x8(vec4 const& v);\n\n\t/// First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. \n\t/// Then, the results are packed into the returned 32-bit unsigned integer.\n\t/// \n\t/// The conversion for component c of v to fixed point is done as follows:\n\t/// packSnorm4x8:\tround(clamp(c, -1, +1) * 127.0) \n\t/// \n\t/// The first component of the vector will be written to the least significant bits of the output; \n\t/// the last component will be written to the most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL packSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint packSnorm4x8(vec4 const& v);\n\n\t/// 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. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackUnorm2x16: f / 65535.0 \n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL unpackUnorm2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec2 unpackUnorm2x16(uint p);\n\n\t/// 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. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackSnorm2x16: clamp(f / 32767.0, -1, +1)\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml\">GLSL unpackSnorm2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec2 unpackSnorm2x16(uint p);\n\n\t/// 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. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackUnorm4x8: f / 255.0\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL unpackUnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec4 unpackUnorm4x8(uint p);\n\n\t/// 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. \n\t/// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector.\n\t/// \n\t/// The conversion for unpacked fixed-point value f to floating point is done as follows:\n\t/// unpackSnorm4x8: clamp(f / 127.0, -1, +1)\n\t/// \n\t/// The first component of the returned vector will be extracted from the least significant bits of the input; \n\t/// the last component will be extracted from the most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL unpackSnorm4x8 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec4 unpackSnorm4x8(uint p);\n\n\t/// Returns a double-qualifier value obtained by packing the components of v into a 64-bit value. \n\t/// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. \n\t/// Otherwise, the bit- level representation of v is preserved. \n\t/// The first vector component specifies the 32 least significant bits; \n\t/// the second component specifies the 32 most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packDouble2x32.xml\">GLSL packDouble2x32 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL double packDouble2x32(uvec2 const& v);\n\n\t/// Returns a two-component unsigned integer vector representation of v. \n\t/// The bit-level representation of v is preserved. \n\t/// The first component of the vector contains the 32 least significant bits of the double; \n\t/// the second component consists the 32 most significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackDouble2x32.xml\">GLSL unpackDouble2x32 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uvec2 unpackDouble2x32(double v);\n\n\t/// Returns an unsigned integer obtained by converting the components of a two-component floating-point vector \n\t/// to the 16-bit floating-point representation found in the OpenGL Specification, \n\t/// and then packing these two 16- bit integers into a 32-bit unsigned integer.\n\t/// The first vector component specifies the 16 least-significant bits of the result; \n\t/// the second component specifies the 16 most-significant bits.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL packHalf2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL uint packHalf2x16(vec2 const& v);\n\n\t/// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, \n\t/// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, \n\t/// and converting them to 32-bit floating-point values.\n\t/// The first component of the vector is obtained from the 16 least-significant bits of v; \n\t/// the second component is obtained from the 16 most-significant bits of v.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL unpackHalf2x16 man page</a>\n\t/// @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>\n\tGLM_FUNC_DECL vec2 unpackHalf2x16(uint v);\n\n\t/// @}\n}//namespace glm\n\n#include \"detail/func_packing.inl\"\n"
  },
  {
    "path": "external/glm/glm/simd/common.h",
    "content": "/// @ref simd\n/// @file glm/simd/common.h\n\n#pragma once\n\n#include \"platform.h\"\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_add(glm_vec4 a, glm_vec4 b)\n{\n\treturn _mm_add_ps(a, b);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec1_add(glm_vec4 a, glm_vec4 b)\n{\n\treturn _mm_add_ss(a, b);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_sub(glm_vec4 a, glm_vec4 b)\n{\n\treturn _mm_sub_ps(a, b);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec1_sub(glm_vec4 a, glm_vec4 b)\n{\n\treturn _mm_sub_ss(a, b);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_mul(glm_vec4 a, glm_vec4 b)\n{\n\treturn _mm_mul_ps(a, b);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec1_mul(glm_vec4 a, glm_vec4 b)\n{\n\treturn _mm_mul_ss(a, b);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_div(glm_vec4 a, glm_vec4 b)\n{\n\treturn _mm_div_ps(a, b);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec1_div(glm_vec4 a, glm_vec4 b)\n{\n\treturn _mm_div_ss(a, b);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_div_lowp(glm_vec4 a, glm_vec4 b)\n{\n\treturn glm_vec4_mul(a, _mm_rcp_ps(b));\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_swizzle_xyzw(glm_vec4 a)\n{\n#\tif GLM_ARCH & GLM_ARCH_AVX2_BIT\n\t\treturn _mm_permute_ps(a, _MM_SHUFFLE(3, 2, 1, 0));\n#\telse\n\t\treturn _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 1, 0));\n#\tendif\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec1_fma(glm_vec4 a, glm_vec4 b, glm_vec4 c)\n{\n#\tif (GLM_ARCH & GLM_ARCH_AVX2_BIT) && !(GLM_COMPILER & GLM_COMPILER_CLANG)\n\t\treturn _mm_fmadd_ss(a, b, c);\n#\telse\n\t\treturn _mm_add_ss(_mm_mul_ss(a, b), c);\n#\tendif\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_fma(glm_vec4 a, glm_vec4 b, glm_vec4 c)\n{\n#\tif (GLM_ARCH & GLM_ARCH_AVX2_BIT) && !(GLM_COMPILER & GLM_COMPILER_CLANG)\n\t\treturn _mm_fmadd_ps(a, b, c);\n#\telse\n\t\treturn glm_vec4_add(glm_vec4_mul(a, b), c);\n#\tendif\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_abs(glm_vec4 x)\n{\n\treturn _mm_and_ps(x, _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF)));\n}\n\nGLM_FUNC_QUALIFIER glm_ivec4 glm_ivec4_abs(glm_ivec4 x)\n{\n#\tif GLM_ARCH & GLM_ARCH_SSSE3_BIT\n\t\treturn _mm_sign_epi32(x, x);\n#\telse\n\t\tglm_ivec4 const sgn0 = _mm_srai_epi32(x, 31);\n\t\tglm_ivec4 const inv0 = _mm_xor_si128(x, sgn0);\n\t\tglm_ivec4 const sub0 = _mm_sub_epi32(inv0, sgn0);\n\t\treturn sub0;\n#\tendif\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_sign(glm_vec4 x)\n{\n\tglm_vec4 const zro0 = _mm_setzero_ps();\n\tglm_vec4 const cmp0 = _mm_cmplt_ps(x, zro0);\n\tglm_vec4 const cmp1 = _mm_cmpgt_ps(x, zro0);\n\tglm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(-1.0f));\n\tglm_vec4 const and1 = _mm_and_ps(cmp1, _mm_set1_ps(1.0f));\n\tglm_vec4 const or0 = _mm_or_ps(and0, and1);;\n\treturn or0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_round(glm_vec4 x)\n{\n#\tif GLM_ARCH & GLM_ARCH_SSE41_BIT\n\t\treturn _mm_round_ps(x, _MM_FROUND_TO_NEAREST_INT);\n#\telse\n\t\tglm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(int(0x80000000)));\n\t\tglm_vec4 const and0 = _mm_and_ps(sgn0, x);\n\t\tglm_vec4 const or0 = _mm_or_ps(and0, _mm_set_ps1(8388608.0f));\n\t\tglm_vec4 const add0 = glm_vec4_add(x, or0);\n\t\tglm_vec4 const sub0 = glm_vec4_sub(add0, or0);\n\t\treturn sub0;\n#\tendif\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_floor(glm_vec4 x)\n{\n#\tif GLM_ARCH & GLM_ARCH_SSE41_BIT\n\t\treturn _mm_floor_ps(x);\n#\telse\n\t\tglm_vec4 const rnd0 = glm_vec4_round(x);\n\t\tglm_vec4 const cmp0 = _mm_cmplt_ps(x, rnd0);\n\t\tglm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(1.0f));\n\t\tglm_vec4 const sub0 = glm_vec4_sub(rnd0, and0);\n\t\treturn sub0;\n#\tendif\n}\n\n/* trunc TODO\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_trunc(glm_vec4 x)\n{\n\treturn glm_vec4();\n}\n*/\n\n//roundEven\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_roundEven(glm_vec4 x)\n{\n\tglm_vec4 const sgn0 = _mm_castsi128_ps(_mm_set1_epi32(int(0x80000000)));\n\tglm_vec4 const and0 = _mm_and_ps(sgn0, x);\n\tglm_vec4 const or0 = _mm_or_ps(and0, _mm_set_ps1(8388608.0f));\n\tglm_vec4 const add0 = glm_vec4_add(x, or0);\n\tglm_vec4 const sub0 = glm_vec4_sub(add0, or0);\n\treturn sub0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_ceil(glm_vec4 x)\n{\n#\tif GLM_ARCH & GLM_ARCH_SSE41_BIT\n\t\treturn _mm_ceil_ps(x);\n#\telse\n\t\tglm_vec4 const rnd0 = glm_vec4_round(x);\n\t\tglm_vec4 const cmp0 = _mm_cmpgt_ps(x, rnd0);\n\t\tglm_vec4 const and0 = _mm_and_ps(cmp0, _mm_set1_ps(1.0f));\n\t\tglm_vec4 const add0 = glm_vec4_add(rnd0, and0);\n\t\treturn add0;\n#\tendif\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_fract(glm_vec4 x)\n{\n\tglm_vec4 const flr0 = glm_vec4_floor(x);\n\tglm_vec4 const sub0 = glm_vec4_sub(x, flr0);\n\treturn sub0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_mod(glm_vec4 x, glm_vec4 y)\n{\n\tglm_vec4 const div0 = glm_vec4_div(x, y);\n\tglm_vec4 const flr0 = glm_vec4_floor(div0);\n\tglm_vec4 const mul0 = glm_vec4_mul(y, flr0);\n\tglm_vec4 const sub0 = glm_vec4_sub(x, mul0);\n\treturn sub0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_clamp(glm_vec4 v, glm_vec4 minVal, glm_vec4 maxVal)\n{\n\tglm_vec4 const min0 = _mm_min_ps(v, maxVal);\n\tglm_vec4 const max0 = _mm_max_ps(min0, minVal);\n\treturn max0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_mix(glm_vec4 v1, glm_vec4 v2, glm_vec4 a)\n{\n\tglm_vec4 const sub0 = glm_vec4_sub(_mm_set1_ps(1.0f), a);\n\tglm_vec4 const mul0 = glm_vec4_mul(v1, sub0);\n\tglm_vec4 const mad0 = glm_vec4_fma(v2, a, mul0);\n\treturn mad0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_step(glm_vec4 edge, glm_vec4 x)\n{\n\tglm_vec4 const cmp = _mm_cmple_ps(x, edge);\n\treturn _mm_movemask_ps(cmp) == 0 ? _mm_set1_ps(1.0f) : _mm_setzero_ps();\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_smoothstep(glm_vec4 edge0, glm_vec4 edge1, glm_vec4 x)\n{\n\tglm_vec4 const sub0 = glm_vec4_sub(x, edge0);\n\tglm_vec4 const sub1 = glm_vec4_sub(edge1, edge0);\n\tglm_vec4 const div0 = glm_vec4_sub(sub0, sub1);\n\tglm_vec4 const clp0 = glm_vec4_clamp(div0, _mm_setzero_ps(), _mm_set1_ps(1.0f));\n\tglm_vec4 const mul0 = glm_vec4_mul(_mm_set1_ps(2.0f), clp0);\n\tglm_vec4 const sub2 = glm_vec4_sub(_mm_set1_ps(3.0f), mul0);\n\tglm_vec4 const mul1 = glm_vec4_mul(clp0, clp0);\n\tglm_vec4 const mul2 = glm_vec4_mul(mul1, sub2);\n\treturn mul2;\n}\n\n// Agner Fog method\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_nan(glm_vec4 x)\n{\n\tglm_ivec4 const t1 = _mm_castps_si128(x);\t\t\t\t\t\t// reinterpret as 32-bit integer\n\tglm_ivec4 const t2 = _mm_sll_epi32(t1, _mm_cvtsi32_si128(1));\t// shift out sign bit\n\tglm_ivec4 const t3 = _mm_set1_epi32(int(0xFF000000));\t\t\t\t// exponent mask\n\tglm_ivec4 const t4 = _mm_and_si128(t2, t3);\t\t\t\t\t\t// exponent\n\tglm_ivec4 const t5 = _mm_andnot_si128(t3, t2);\t\t\t\t\t// fraction\n\tglm_ivec4 const Equal = _mm_cmpeq_epi32(t3, t4);\n\tglm_ivec4 const Nequal = _mm_cmpeq_epi32(t5, _mm_setzero_si128());\n\tglm_ivec4 const And = _mm_and_si128(Equal, Nequal);\n\treturn _mm_castsi128_ps(And);\t\t\t\t\t\t\t\t\t// exponent = all 1s and fraction != 0\n}\n\n// Agner Fog method\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_inf(glm_vec4 x)\n{\n\tglm_ivec4 const t1 = _mm_castps_si128(x);\t\t\t\t\t\t\t\t\t\t// reinterpret as 32-bit integer\n\tglm_ivec4 const t2 = _mm_sll_epi32(t1, _mm_cvtsi32_si128(1));\t\t\t\t\t// shift out sign bit\n\treturn _mm_castsi128_ps(_mm_cmpeq_epi32(t2, _mm_set1_epi32(int(0xFF000000))));\t\t// exponent is all 1s, fraction is 0\n}\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/simd/exponential.h",
    "content": "/// @ref simd\n/// @file glm/simd/experimental.h\n\n#pragma once\n\n#include \"platform.h\"\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec1_sqrt_lowp(glm_vec4 x)\n{\n\treturn _mm_mul_ss(_mm_rsqrt_ss(x), x);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_sqrt_lowp(glm_vec4 x)\n{\n\treturn _mm_mul_ps(_mm_rsqrt_ps(x), x);\n}\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/simd/geometric.h",
    "content": "/// @ref simd\n/// @file glm/simd/geometric.h\n\n#pragma once\n\n#include \"common.h\"\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nGLM_FUNC_DECL glm_vec4 glm_vec4_dot(glm_vec4 v1, glm_vec4 v2);\nGLM_FUNC_DECL glm_vec4 glm_vec1_dot(glm_vec4 v1, glm_vec4 v2);\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_length(glm_vec4 x)\n{\n\tglm_vec4 const dot0 = glm_vec4_dot(x, x);\n\tglm_vec4 const sqt0 = _mm_sqrt_ps(dot0);\n\treturn sqt0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_distance(glm_vec4 p0, glm_vec4 p1)\n{\n\tglm_vec4 const sub0 = _mm_sub_ps(p0, p1);\n\tglm_vec4 const len0 = glm_vec4_length(sub0);\n\treturn len0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_dot(glm_vec4 v1, glm_vec4 v2)\n{\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\t\treturn _mm_dp_ps(v1, v2, 0xff);\n#\telif GLM_ARCH & GLM_ARCH_SSE3_BIT\n\t\tglm_vec4 const mul0 = _mm_mul_ps(v1, v2);\n\t\tglm_vec4 const hadd0 = _mm_hadd_ps(mul0, mul0);\n\t\tglm_vec4 const hadd1 = _mm_hadd_ps(hadd0, hadd0);\n\t\treturn hadd1;\n#\telse\n\t\tglm_vec4 const mul0 = _mm_mul_ps(v1, v2);\n\t\tglm_vec4 const swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1));\n\t\tglm_vec4 const add0 = _mm_add_ps(mul0, swp0);\n\t\tglm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3));\n\t\tglm_vec4 const add1 = _mm_add_ps(add0, swp1);\n\t\treturn add1;\n#\tendif\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec1_dot(glm_vec4 v1, glm_vec4 v2)\n{\n#\tif GLM_ARCH & GLM_ARCH_AVX_BIT\n\t\treturn _mm_dp_ps(v1, v2, 0xff);\n#\telif GLM_ARCH & GLM_ARCH_SSE3_BIT\n\t\tglm_vec4 const mul0 = _mm_mul_ps(v1, v2);\n\t\tglm_vec4 const had0 = _mm_hadd_ps(mul0, mul0);\n\t\tglm_vec4 const had1 = _mm_hadd_ps(had0, had0);\n\t\treturn had1;\n#\telse\n\t\tglm_vec4 const mul0 = _mm_mul_ps(v1, v2);\n\t\tglm_vec4 const mov0 = _mm_movehl_ps(mul0, mul0);\n\t\tglm_vec4 const add0 = _mm_add_ps(mov0, mul0);\n\t\tglm_vec4 const swp1 = _mm_shuffle_ps(add0, add0, 1);\n\t\tglm_vec4 const add1 = _mm_add_ss(add0, swp1);\n\t\treturn add1;\n#\tendif\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_cross(glm_vec4 v1, glm_vec4 v2)\n{\n\tglm_vec4 const swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1));\n\tglm_vec4 const swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2));\n\tglm_vec4 const swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1));\n\tglm_vec4 const swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2));\n\tglm_vec4 const mul0 = _mm_mul_ps(swp0, swp3);\n\tglm_vec4 const mul1 = _mm_mul_ps(swp1, swp2);\n\tglm_vec4 const sub0 = _mm_sub_ps(mul0, mul1);\n\treturn sub0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_normalize(glm_vec4 v)\n{\n\tglm_vec4 const dot0 = glm_vec4_dot(v, v);\n\tglm_vec4 const isr0 = _mm_rsqrt_ps(dot0);\n\tglm_vec4 const mul0 = _mm_mul_ps(v, isr0);\n\treturn mul0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_faceforward(glm_vec4 N, glm_vec4 I, glm_vec4 Nref)\n{\n\tglm_vec4 const dot0 = glm_vec4_dot(Nref, I);\n\tglm_vec4 const sgn0 = glm_vec4_sign(dot0);\n\tglm_vec4 const mul0 = _mm_mul_ps(sgn0, _mm_set1_ps(-1.0f));\n\tglm_vec4 const mul1 = _mm_mul_ps(N, mul0);\n\treturn mul1;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_vec4_reflect(glm_vec4 I, glm_vec4 N)\n{\n\tglm_vec4 const dot0 = glm_vec4_dot(N, I);\n\tglm_vec4 const mul0 = _mm_mul_ps(N, dot0);\n\tglm_vec4 const mul1 = _mm_mul_ps(mul0, _mm_set1_ps(2.0f));\n\tglm_vec4 const sub0 = _mm_sub_ps(I, mul1);\n\treturn sub0;\n}\n\nGLM_FUNC_QUALIFIER __m128 glm_vec4_refract(glm_vec4 I, glm_vec4 N, glm_vec4 eta)\n{\n\tglm_vec4 const dot0 = glm_vec4_dot(N, I);\n\tglm_vec4 const mul0 = _mm_mul_ps(eta, eta);\n\tglm_vec4 const mul1 = _mm_mul_ps(dot0, dot0);\n\tglm_vec4 const sub0 = _mm_sub_ps(_mm_set1_ps(1.0f), mul0);\n\tglm_vec4 const sub1 = _mm_sub_ps(_mm_set1_ps(1.0f), mul1);\n\tglm_vec4 const mul2 = _mm_mul_ps(sub0, sub1);\n\t\n\tif(_mm_movemask_ps(_mm_cmplt_ss(mul2, _mm_set1_ps(0.0f))) == 0)\n\t\treturn _mm_set1_ps(0.0f);\n\n\tglm_vec4 const sqt0 = _mm_sqrt_ps(mul2);\n\tglm_vec4 const mad0 = glm_vec4_fma(eta, dot0, sqt0);\n\tglm_vec4 const mul4 = _mm_mul_ps(mad0, N);\n\tglm_vec4 const mul5 = _mm_mul_ps(eta, I);\n\tglm_vec4 const sub2 = _mm_sub_ps(mul5, mul4);\n\n\treturn sub2;\n}\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/simd/integer.h",
    "content": "/// @ref simd\n/// @file glm/simd/integer.h\n\n#pragma once\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nGLM_FUNC_QUALIFIER glm_uvec4 glm_i128_interleave(glm_uvec4 x)\n{\n\tglm_uvec4 const Mask4 = _mm_set1_epi32(0x0000FFFF);\n\tglm_uvec4 const Mask3 = _mm_set1_epi32(0x00FF00FF);\n\tglm_uvec4 const Mask2 = _mm_set1_epi32(0x0F0F0F0F);\n\tglm_uvec4 const Mask1 = _mm_set1_epi32(0x33333333);\n\tglm_uvec4 const Mask0 = _mm_set1_epi32(0x55555555);\n\n\tglm_uvec4 Reg1;\n\tglm_uvec4 Reg2;\n\n\t// REG1 = x;\n\t// REG2 = y;\n\t//Reg1 = _mm_unpacklo_epi64(x, y);\n\tReg1 = x;\n\n\t//REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n\t//REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n\tReg2 = _mm_slli_si128(Reg1, 2);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask4);\n\n\t//REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n\t//REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n\tReg2 = _mm_slli_si128(Reg1, 1);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask3);\n\n\t//REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t//REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\tReg2 = _mm_slli_epi32(Reg1, 4);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask2);\n\n\t//REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333);\n\t//REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333);\n\tReg2 = _mm_slli_epi32(Reg1, 2);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask1);\n\n\t//REG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555);\n\t//REG2 = ((REG2 <<  1) | REG2) & glm::uint64(0x5555555555555555);\n\tReg2 = _mm_slli_epi32(Reg1, 1);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask0);\n\n\t//return REG1 | (REG2 << 1);\n\tReg2 = _mm_slli_epi32(Reg1, 1);\n\tReg2 = _mm_srli_si128(Reg2, 8);\n\tReg1 = _mm_or_si128(Reg1, Reg2);\n\t\n\treturn Reg1;\n}\n\nGLM_FUNC_QUALIFIER glm_uvec4 glm_i128_interleave2(glm_uvec4 x, glm_uvec4 y)\n{\n\tglm_uvec4 const Mask4 = _mm_set1_epi32(0x0000FFFF);\n\tglm_uvec4 const Mask3 = _mm_set1_epi32(0x00FF00FF);\n\tglm_uvec4 const Mask2 = _mm_set1_epi32(0x0F0F0F0F);\n\tglm_uvec4 const Mask1 = _mm_set1_epi32(0x33333333);\n\tglm_uvec4 const Mask0 = _mm_set1_epi32(0x55555555);\n\n\tglm_uvec4 Reg1;\n\tglm_uvec4 Reg2;\n\n\t// REG1 = x;\n\t// REG2 = y;\n\tReg1 = _mm_unpacklo_epi64(x, y);\n\n\t//REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n\t//REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n\tReg2 = _mm_slli_si128(Reg1, 2);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask4);\n\n\t//REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n\t//REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n\tReg2 = _mm_slli_si128(Reg1, 1);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask3);\n\n\t//REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t//REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\tReg2 = _mm_slli_epi32(Reg1, 4);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask2);\n\n\t//REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333);\n\t//REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333);\n\tReg2 = _mm_slli_epi32(Reg1, 2);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask1);\n\n\t//REG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555);\n\t//REG2 = ((REG2 <<  1) | REG2) & glm::uint64(0x5555555555555555);\n\tReg2 = _mm_slli_epi32(Reg1, 1);\n\tReg1 = _mm_or_si128(Reg2, Reg1);\n\tReg1 = _mm_and_si128(Reg1, Mask0);\n\n\t//return REG1 | (REG2 << 1);\n\tReg2 = _mm_slli_epi32(Reg1, 1);\n\tReg2 = _mm_srli_si128(Reg2, 8);\n\tReg1 = _mm_or_si128(Reg1, Reg2);\n\t\n\treturn Reg1;\n}\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/simd/matrix.h",
    "content": "/// @ref simd\n/// @file glm/simd/matrix.h\n\n#pragma once\n\n#include \"geometric.h\"\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\nGLM_FUNC_QUALIFIER void glm_mat4_matrixCompMult(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4])\n{\n\tout[0] = _mm_mul_ps(in1[0], in2[0]);\n\tout[1] = _mm_mul_ps(in1[1], in2[1]);\n\tout[2] = _mm_mul_ps(in1[2], in2[2]);\n\tout[3] = _mm_mul_ps(in1[3], in2[3]);\n}\n\nGLM_FUNC_QUALIFIER void glm_mat4_add(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4])\n{\n\tout[0] = _mm_add_ps(in1[0], in2[0]);\n\tout[1] = _mm_add_ps(in1[1], in2[1]);\n\tout[2] = _mm_add_ps(in1[2], in2[2]);\n\tout[3] = _mm_add_ps(in1[3], in2[3]);\n}\n\nGLM_FUNC_QUALIFIER void glm_mat4_sub(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4])\n{\n\tout[0] = _mm_sub_ps(in1[0], in2[0]);\n\tout[1] = _mm_sub_ps(in1[1], in2[1]);\n\tout[2] = _mm_sub_ps(in1[2], in2[2]);\n\tout[3] = _mm_sub_ps(in1[3], in2[3]);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_mat4_mul_vec4(glm_vec4 const m[4], glm_vec4 v)\n{\n\t__m128 v0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 v1 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));\n\t__m128 v2 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));\n\t__m128 v3 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3));\n\n\t__m128 m0 = _mm_mul_ps(m[0], v0);\n\t__m128 m1 = _mm_mul_ps(m[1], v1);\n\t__m128 m2 = _mm_mul_ps(m[2], v2);\n\t__m128 m3 = _mm_mul_ps(m[3], v3);\n\n\t__m128 a0 = _mm_add_ps(m0, m1);\n\t__m128 a1 = _mm_add_ps(m2, m3);\n\t__m128 a2 = _mm_add_ps(a0, a1);\n\n\treturn a2;\n}\n\nGLM_FUNC_QUALIFIER __m128 glm_vec4_mul_mat4(glm_vec4 v, glm_vec4 const m[4])\n{\n\t__m128 i0 = m[0];\n\t__m128 i1 = m[1];\n\t__m128 i2 = m[2];\n\t__m128 i3 = m[3];\n\n\t__m128 m0 = _mm_mul_ps(v, i0);\n\t__m128 m1 = _mm_mul_ps(v, i1);\n\t__m128 m2 = _mm_mul_ps(v, i2);\n\t__m128 m3 = _mm_mul_ps(v, i3);\n\n\t__m128 u0 = _mm_unpacklo_ps(m0, m1);\n\t__m128 u1 = _mm_unpackhi_ps(m0, m1);\n\t__m128 a0 = _mm_add_ps(u0, u1);\n\n\t__m128 u2 = _mm_unpacklo_ps(m2, m3);\n\t__m128 u3 = _mm_unpackhi_ps(m2, m3);\n\t__m128 a1 = _mm_add_ps(u2, u3);\n\n\t__m128 f0 = _mm_movelh_ps(a0, a1);\n\t__m128 f1 = _mm_movehl_ps(a1, a0);\n\t__m128 f2 = _mm_add_ps(f0, f1);\n\n\treturn f2;\n}\n\nGLM_FUNC_QUALIFIER void glm_mat4_mul(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4])\n{\n\t{\n\t\t__m128 e0 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 e1 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 e2 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 e3 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 m0 = _mm_mul_ps(in1[0], e0);\n\t\t__m128 m1 = _mm_mul_ps(in1[1], e1);\n\t\t__m128 m2 = _mm_mul_ps(in1[2], e2);\n\t\t__m128 m3 = _mm_mul_ps(in1[3], e3);\n\n\t\t__m128 a0 = _mm_add_ps(m0, m1);\n\t\t__m128 a1 = _mm_add_ps(m2, m3);\n\t\t__m128 a2 = _mm_add_ps(a0, a1);\n\n\t\tout[0] = a2;\n\t}\n\n\t{\n\t\t__m128 e0 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 e1 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 e2 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 e3 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 m0 = _mm_mul_ps(in1[0], e0);\n\t\t__m128 m1 = _mm_mul_ps(in1[1], e1);\n\t\t__m128 m2 = _mm_mul_ps(in1[2], e2);\n\t\t__m128 m3 = _mm_mul_ps(in1[3], e3);\n\n\t\t__m128 a0 = _mm_add_ps(m0, m1);\n\t\t__m128 a1 = _mm_add_ps(m2, m3);\n\t\t__m128 a2 = _mm_add_ps(a0, a1);\n\n\t\tout[1] = a2;\n\t}\n\n\t{\n\t\t__m128 e0 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 e1 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 e2 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 e3 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 m0 = _mm_mul_ps(in1[0], e0);\n\t\t__m128 m1 = _mm_mul_ps(in1[1], e1);\n\t\t__m128 m2 = _mm_mul_ps(in1[2], e2);\n\t\t__m128 m3 = _mm_mul_ps(in1[3], e3);\n\n\t\t__m128 a0 = _mm_add_ps(m0, m1);\n\t\t__m128 a1 = _mm_add_ps(m2, m3);\n\t\t__m128 a2 = _mm_add_ps(a0, a1);\n\n\t\tout[2] = a2;\n\t}\n\n\t{\n\t\t//(__m128&)_mm_shuffle_epi32(__m128i&)in2[0], _MM_SHUFFLE(3, 3, 3, 3))\n\t\t__m128 e0 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 e1 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 e2 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 e3 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 m0 = _mm_mul_ps(in1[0], e0);\n\t\t__m128 m1 = _mm_mul_ps(in1[1], e1);\n\t\t__m128 m2 = _mm_mul_ps(in1[2], e2);\n\t\t__m128 m3 = _mm_mul_ps(in1[3], e3);\n\n\t\t__m128 a0 = _mm_add_ps(m0, m1);\n\t\t__m128 a1 = _mm_add_ps(m2, m3);\n\t\t__m128 a2 = _mm_add_ps(a0, a1);\n\n\t\tout[3] = a2;\n\t}\n}\n\nGLM_FUNC_QUALIFIER void glm_mat4_transpose(glm_vec4 const in[4], glm_vec4 out[4])\n{\n\t__m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44);\n\t__m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE);\n\t__m128 tmp1 = _mm_shuffle_ps(in[2], in[3], 0x44);\n\t__m128 tmp3 = _mm_shuffle_ps(in[2], in[3], 0xEE);\n\n\tout[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88);\n\tout[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD);\n\tout[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88);\n\tout[3] = _mm_shuffle_ps(tmp2, tmp3, 0xDD);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_highp(glm_vec4 const in[4])\n{\n\t__m128 Fac0;\n\t{\n\t\t//\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\t//\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\t//\tvalType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n\t\t//\tvalType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac0 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac1;\n\t{\n\t\t//\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\t//\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\t//\tvalType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n\t\t//\tvalType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac1 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\n\t__m128 Fac2;\n\t{\n\t\t//\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\t//\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\t//\tvalType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n\t\t//\tvalType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac2 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac3;\n\t{\n\t\t//\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\t//\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\t//\tvalType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n\t\t//\tvalType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac3 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac4;\n\t{\n\t\t//\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\t//\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\t//\tvalType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n\t\t//\tvalType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac4 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac5;\n\t{\n\t\t//\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\t\t//\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\t\t//\tvalType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n\t\t//\tvalType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac5 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);\n\t__m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);\n\n\t// m[1][0]\n\t// m[0][0]\n\t// m[0][0]\n\t// m[0][0]\n\t__m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][1]\n\t// m[0][1]\n\t// m[0][1]\n\t// m[0][1]\n\t__m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));\n\t__m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][2]\n\t// m[0][2]\n\t// m[0][2]\n\t// m[0][2]\n\t__m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));\n\t__m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][3]\n\t// m[0][3]\n\t// m[0][3]\n\t// m[0][3]\n\t__m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));\n\t__m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// col0\n\t// + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),\n\t// - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),\n\t// + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),\n\t// - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),\n\t__m128 Mul00 = _mm_mul_ps(Vec1, Fac0);\n\t__m128 Mul01 = _mm_mul_ps(Vec2, Fac1);\n\t__m128 Mul02 = _mm_mul_ps(Vec3, Fac2);\n\t__m128 Sub00 = _mm_sub_ps(Mul00, Mul01);\n\t__m128 Add00 = _mm_add_ps(Sub00, Mul02);\n\t__m128 Inv0 = _mm_mul_ps(SignB, Add00);\n\n\t// col1\n\t// - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),\n\t// + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),\n\t// - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),\n\t// + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),\n\t__m128 Mul03 = _mm_mul_ps(Vec0, Fac0);\n\t__m128 Mul04 = _mm_mul_ps(Vec2, Fac3);\n\t__m128 Mul05 = _mm_mul_ps(Vec3, Fac4);\n\t__m128 Sub01 = _mm_sub_ps(Mul03, Mul04);\n\t__m128 Add01 = _mm_add_ps(Sub01, Mul05);\n\t__m128 Inv1 = _mm_mul_ps(SignA, Add01);\n\n\t// col2\n\t// + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),\n\t// - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),\n\t// + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),\n\t// - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),\n\t__m128 Mul06 = _mm_mul_ps(Vec0, Fac1);\n\t__m128 Mul07 = _mm_mul_ps(Vec1, Fac3);\n\t__m128 Mul08 = _mm_mul_ps(Vec3, Fac5);\n\t__m128 Sub02 = _mm_sub_ps(Mul06, Mul07);\n\t__m128 Add02 = _mm_add_ps(Sub02, Mul08);\n\t__m128 Inv2 = _mm_mul_ps(SignB, Add02);\n\n\t// col3\n\t// - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),\n\t// + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),\n\t// - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),\n\t// + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));\n\t__m128 Mul09 = _mm_mul_ps(Vec0, Fac2);\n\t__m128 Mul10 = _mm_mul_ps(Vec1, Fac4);\n\t__m128 Mul11 = _mm_mul_ps(Vec2, Fac5);\n\t__m128 Sub03 = _mm_sub_ps(Mul09, Mul10);\n\t__m128 Add03 = _mm_add_ps(Sub03, Mul11);\n\t__m128 Inv3 = _mm_mul_ps(SignA, Add03);\n\n\t__m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));\n\n\t//\tvalType Determinant = m[0][0] * Inverse[0][0]\n\t//\t\t\t\t\t\t+ m[0][1] * Inverse[1][0]\n\t//\t\t\t\t\t\t+ m[0][2] * Inverse[2][0]\n\t//\t\t\t\t\t\t+ m[0][3] * Inverse[3][0];\n\t__m128 Det0 = glm_vec4_dot(in[0], Row2);\n\treturn Det0;\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_lowp(glm_vec4 const m[4])\n{\n\t// _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(\n\n\t//T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t//T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t//T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t//T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t//T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t//T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\n\t// First 2 columns\n \t__m128 Swp2A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 1, 1, 2)));\n \t__m128 Swp3A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(3, 2, 3, 3)));\n\t__m128 MulA = _mm_mul_ps(Swp2A, Swp3A);\n\n\t// Second 2 columns\n\t__m128 Swp2B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(3, 2, 3, 3)));\n\t__m128 Swp3B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(0, 1, 1, 2)));\n\t__m128 MulB = _mm_mul_ps(Swp2B, Swp3B);\n\n\t// Columns subtraction\n\t__m128 SubE = _mm_sub_ps(MulA, MulB);\n\n\t// Last 2 rows\n\t__m128 Swp2C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 0, 1, 2)));\n\t__m128 Swp3C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(1, 2, 0, 0)));\n\t__m128 MulC = _mm_mul_ps(Swp2C, Swp3C);\n\t__m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC);\n\n\t//vec<4, T, Q> DetCof(\n\t//\t+ (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02),\n\t//\t- (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04),\n\t//\t+ (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05),\n\t//\t- (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));\n\n\t__m128 SubFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubE), _MM_SHUFFLE(2, 1, 0, 0)));\n\t__m128 SwpFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(0, 0, 0, 1)));\n\t__m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA);\n\n\t__m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1));\n\t__m128 SubFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpB), _MM_SHUFFLE(3, 1, 1, 0)));//SubF[0], SubE[3], SubE[3], SubE[1];\n\t__m128 SwpFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(1, 1, 2, 2)));\n\t__m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB);\n\n\t__m128 SubRes = _mm_sub_ps(MulFacA, MulFacB);\n\n\t__m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2));\n\t__m128 SubFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpC), _MM_SHUFFLE(3, 3, 2, 0)));\n\t__m128 SwpFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(2, 3, 3, 3)));\n\t__m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC);\n\n\t__m128 AddRes = _mm_add_ps(SubRes, MulFacC);\n\t__m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f));\n\n\t//return m[0][0] * DetCof[0]\n\t//\t + m[0][1] * DetCof[1]\n\t//\t + m[0][2] * DetCof[2]\n\t//\t + m[0][3] * DetCof[3];\n\n\treturn glm_vec4_dot(m[0], DetCof);\n}\n\nGLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant(glm_vec4 const m[4])\n{\n\t// _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(add)\n\n\t//T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t//T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t//T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t//T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t//T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t//T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\n\t// First 2 columns\n \t__m128 Swp2A = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 1, 1, 2));\n \t__m128 Swp3A = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(3, 2, 3, 3));\n\t__m128 MulA = _mm_mul_ps(Swp2A, Swp3A);\n\n\t// Second 2 columns\n\t__m128 Swp2B = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(3, 2, 3, 3));\n\t__m128 Swp3B = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(0, 1, 1, 2));\n\t__m128 MulB = _mm_mul_ps(Swp2B, Swp3B);\n\n\t// Columns subtraction\n\t__m128 SubE = _mm_sub_ps(MulA, MulB);\n\n\t// Last 2 rows\n\t__m128 Swp2C = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 0, 1, 2));\n\t__m128 Swp3C = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(1, 2, 0, 0));\n\t__m128 MulC = _mm_mul_ps(Swp2C, Swp3C);\n\t__m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC);\n\n\t//vec<4, T, Q> DetCof(\n\t//\t+ (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02),\n\t//\t- (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04),\n\t//\t+ (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05),\n\t//\t- (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));\n\n\t__m128 SubFacA = _mm_shuffle_ps(SubE, SubE, _MM_SHUFFLE(2, 1, 0, 0));\n\t__m128 SwpFacA = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(0, 0, 0, 1));\n\t__m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA);\n\n\t__m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1));\n\t__m128 SubFacB = _mm_shuffle_ps(SubTmpB, SubTmpB, _MM_SHUFFLE(3, 1, 1, 0));//SubF[0], SubE[3], SubE[3], SubE[1];\n\t__m128 SwpFacB = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(1, 1, 2, 2));\n\t__m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB);\n\n\t__m128 SubRes = _mm_sub_ps(MulFacA, MulFacB);\n\n\t__m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2));\n\t__m128 SubFacC = _mm_shuffle_ps(SubTmpC, SubTmpC, _MM_SHUFFLE(3, 3, 2, 0));\n\t__m128 SwpFacC = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(2, 3, 3, 3));\n\t__m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC);\n\n\t__m128 AddRes = _mm_add_ps(SubRes, MulFacC);\n\t__m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f));\n\n\t//return m[0][0] * DetCof[0]\n\t//\t + m[0][1] * DetCof[1]\n\t//\t + m[0][2] * DetCof[2]\n\t//\t + m[0][3] * DetCof[3];\n\n\treturn glm_vec4_dot(m[0], DetCof);\n}\n\nGLM_FUNC_QUALIFIER void glm_mat4_inverse(glm_vec4 const in[4], glm_vec4 out[4])\n{\n\t__m128 Fac0;\n\t{\n\t\t//\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\t//\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\t//\tvalType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n\t\t//\tvalType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac0 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac1;\n\t{\n\t\t//\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\t//\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\t//\tvalType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n\t\t//\tvalType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac1 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\n\t__m128 Fac2;\n\t{\n\t\t//\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\t//\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\t//\tvalType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n\t\t//\tvalType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac2 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac3;\n\t{\n\t\t//\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\t//\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\t//\tvalType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n\t\t//\tvalType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac3 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac4;\n\t{\n\t\t//\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\t//\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\t//\tvalType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n\t\t//\tvalType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac4 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac5;\n\t{\n\t\t//\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\t\t//\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\t\t//\tvalType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n\t\t//\tvalType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac5 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);\n\t__m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);\n\n\t// m[1][0]\n\t// m[0][0]\n\t// m[0][0]\n\t// m[0][0]\n\t__m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][1]\n\t// m[0][1]\n\t// m[0][1]\n\t// m[0][1]\n\t__m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));\n\t__m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][2]\n\t// m[0][2]\n\t// m[0][2]\n\t// m[0][2]\n\t__m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));\n\t__m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][3]\n\t// m[0][3]\n\t// m[0][3]\n\t// m[0][3]\n\t__m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));\n\t__m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// col0\n\t// + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),\n\t// - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),\n\t// + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),\n\t// - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),\n\t__m128 Mul00 = _mm_mul_ps(Vec1, Fac0);\n\t__m128 Mul01 = _mm_mul_ps(Vec2, Fac1);\n\t__m128 Mul02 = _mm_mul_ps(Vec3, Fac2);\n\t__m128 Sub00 = _mm_sub_ps(Mul00, Mul01);\n\t__m128 Add00 = _mm_add_ps(Sub00, Mul02);\n\t__m128 Inv0 = _mm_mul_ps(SignB, Add00);\n\n\t// col1\n\t// - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),\n\t// + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),\n\t// - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),\n\t// + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),\n\t__m128 Mul03 = _mm_mul_ps(Vec0, Fac0);\n\t__m128 Mul04 = _mm_mul_ps(Vec2, Fac3);\n\t__m128 Mul05 = _mm_mul_ps(Vec3, Fac4);\n\t__m128 Sub01 = _mm_sub_ps(Mul03, Mul04);\n\t__m128 Add01 = _mm_add_ps(Sub01, Mul05);\n\t__m128 Inv1 = _mm_mul_ps(SignA, Add01);\n\n\t// col2\n\t// + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),\n\t// - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),\n\t// + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),\n\t// - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),\n\t__m128 Mul06 = _mm_mul_ps(Vec0, Fac1);\n\t__m128 Mul07 = _mm_mul_ps(Vec1, Fac3);\n\t__m128 Mul08 = _mm_mul_ps(Vec3, Fac5);\n\t__m128 Sub02 = _mm_sub_ps(Mul06, Mul07);\n\t__m128 Add02 = _mm_add_ps(Sub02, Mul08);\n\t__m128 Inv2 = _mm_mul_ps(SignB, Add02);\n\n\t// col3\n\t// - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),\n\t// + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),\n\t// - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),\n\t// + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));\n\t__m128 Mul09 = _mm_mul_ps(Vec0, Fac2);\n\t__m128 Mul10 = _mm_mul_ps(Vec1, Fac4);\n\t__m128 Mul11 = _mm_mul_ps(Vec2, Fac5);\n\t__m128 Sub03 = _mm_sub_ps(Mul09, Mul10);\n\t__m128 Add03 = _mm_add_ps(Sub03, Mul11);\n\t__m128 Inv3 = _mm_mul_ps(SignA, Add03);\n\n\t__m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));\n\n\t//\tvalType Determinant = m[0][0] * Inverse[0][0] \n\t//\t\t\t\t\t\t+ m[0][1] * Inverse[1][0] \n\t//\t\t\t\t\t\t+ m[0][2] * Inverse[2][0] \n\t//\t\t\t\t\t\t+ m[0][3] * Inverse[3][0];\n\t__m128 Det0 = glm_vec4_dot(in[0], Row2);\n\t__m128 Rcp0 = _mm_div_ps(_mm_set1_ps(1.0f), Det0);\n\t//__m128 Rcp0 = _mm_rcp_ps(Det0);\n\n\t//\tInverse /= Determinant;\n\tout[0] = _mm_mul_ps(Inv0, Rcp0);\n\tout[1] = _mm_mul_ps(Inv1, Rcp0);\n\tout[2] = _mm_mul_ps(Inv2, Rcp0);\n\tout[3] = _mm_mul_ps(Inv3, Rcp0);\n}\n\nGLM_FUNC_QUALIFIER void glm_mat4_inverse_lowp(glm_vec4 const in[4], glm_vec4 out[4])\n{\n\t__m128 Fac0;\n\t{\n\t\t//\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\t//\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n\t\t//\tvalType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n\t\t//\tvalType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac0 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac1;\n\t{\n\t\t//\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\t//\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n\t\t//\tvalType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n\t\t//\tvalType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac1 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\n\t__m128 Fac2;\n\t{\n\t\t//\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\t//\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n\t\t//\tvalType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n\t\t//\tvalType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac2 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac3;\n\t{\n\t\t//\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\t//\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n\t\t//\tvalType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n\t\t//\tvalType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac3 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac4;\n\t{\n\t\t//\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\t//\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n\t\t//\tvalType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n\t\t//\tvalType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac4 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 Fac5;\n\t{\n\t\t//\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\t\t//\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\t\t//\tvalType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n\t\t//\tvalType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n\t\t__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\t\t__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n\t\t__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n\t\t__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n\t\t__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\n\t\t__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n\t\t__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n\t\tFac5 = _mm_sub_ps(Mul00, Mul01);\n\t}\n\n\t__m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);\n\t__m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);\n\n\t// m[1][0]\n\t// m[0][0]\n\t// m[0][0]\n\t// m[0][0]\n\t__m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][1]\n\t// m[0][1]\n\t// m[0][1]\n\t// m[0][1]\n\t__m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));\n\t__m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][2]\n\t// m[0][2]\n\t// m[0][2]\n\t// m[0][2]\n\t__m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));\n\t__m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// m[1][3]\n\t// m[0][3]\n\t// m[0][3]\n\t// m[0][3]\n\t__m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));\n\t__m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));\n\n\t// col0\n\t// + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),\n\t// - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),\n\t// + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),\n\t// - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),\n\t__m128 Mul00 = _mm_mul_ps(Vec1, Fac0);\n\t__m128 Mul01 = _mm_mul_ps(Vec2, Fac1);\n\t__m128 Mul02 = _mm_mul_ps(Vec3, Fac2);\n\t__m128 Sub00 = _mm_sub_ps(Mul00, Mul01);\n\t__m128 Add00 = _mm_add_ps(Sub00, Mul02);\n\t__m128 Inv0 = _mm_mul_ps(SignB, Add00);\n\n\t// col1\n\t// - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),\n\t// + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),\n\t// - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),\n\t// + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),\n\t__m128 Mul03 = _mm_mul_ps(Vec0, Fac0);\n\t__m128 Mul04 = _mm_mul_ps(Vec2, Fac3);\n\t__m128 Mul05 = _mm_mul_ps(Vec3, Fac4);\n\t__m128 Sub01 = _mm_sub_ps(Mul03, Mul04);\n\t__m128 Add01 = _mm_add_ps(Sub01, Mul05);\n\t__m128 Inv1 = _mm_mul_ps(SignA, Add01);\n\n\t// col2\n\t// + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),\n\t// - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),\n\t// + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),\n\t// - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),\n\t__m128 Mul06 = _mm_mul_ps(Vec0, Fac1);\n\t__m128 Mul07 = _mm_mul_ps(Vec1, Fac3);\n\t__m128 Mul08 = _mm_mul_ps(Vec3, Fac5);\n\t__m128 Sub02 = _mm_sub_ps(Mul06, Mul07);\n\t__m128 Add02 = _mm_add_ps(Sub02, Mul08);\n\t__m128 Inv2 = _mm_mul_ps(SignB, Add02);\n\n\t// col3\n\t// - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),\n\t// + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),\n\t// - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),\n\t// + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));\n\t__m128 Mul09 = _mm_mul_ps(Vec0, Fac2);\n\t__m128 Mul10 = _mm_mul_ps(Vec1, Fac4);\n\t__m128 Mul11 = _mm_mul_ps(Vec2, Fac5);\n\t__m128 Sub03 = _mm_sub_ps(Mul09, Mul10);\n\t__m128 Add03 = _mm_add_ps(Sub03, Mul11);\n\t__m128 Inv3 = _mm_mul_ps(SignA, Add03);\n\n\t__m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));\n\n\t//\tvalType Determinant = m[0][0] * Inverse[0][0] \n\t//\t\t\t\t\t\t+ m[0][1] * Inverse[1][0] \n\t//\t\t\t\t\t\t+ m[0][2] * Inverse[2][0] \n\t//\t\t\t\t\t\t+ m[0][3] * Inverse[3][0];\n\t__m128 Det0 = glm_vec4_dot(in[0], Row2);\n\t__m128 Rcp0 = _mm_rcp_ps(Det0);\n\t//__m128 Rcp0 = _mm_div_ps(one, Det0);\n\t//\tInverse /= Determinant;\n\tout[0] = _mm_mul_ps(Inv0, Rcp0);\n\tout[1] = _mm_mul_ps(Inv1, Rcp0);\n\tout[2] = _mm_mul_ps(Inv2, Rcp0);\n\tout[3] = _mm_mul_ps(Inv3, Rcp0);\n}\n/*\nGLM_FUNC_QUALIFIER void glm_mat4_rotate(__m128 const in[4], float Angle, float const v[3], __m128 out[4])\n{\n\tfloat a = glm::radians(Angle);\n\tfloat c = cos(a);\n\tfloat s = sin(a);\n\n\tglm::vec4 AxisA(v[0], v[1], v[2], float(0));\n\t__m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x);\n\t__m128 AxisC = detail::sse_nrm_ps(AxisB);\n\n\t__m128 Cos0 = _mm_set_ss(c);\n\t__m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 Sin0 = _mm_set_ss(s);\n\t__m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0));\n\n\t// vec<3, T, Q> temp = (valType(1) - c) * axis;\n\t__m128 Temp0 = _mm_sub_ps(one, CosA);\n\t__m128 Temp1 = _mm_mul_ps(Temp0, AxisC);\n\t\n\t//Rotate[0][0] = c + temp[0] * axis[0];\n\t//Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];\n\t//Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];\n\t__m128 Axis0 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(0, 0, 0, 0));\n\t__m128 TmpA0 = _mm_mul_ps(Axis0, AxisC);\n\t__m128 CosA0 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 1, 0));\n\t__m128 TmpA1 = _mm_add_ps(CosA0, TmpA0);\n\t__m128 SinA0 = SinA;//_mm_set_ps(0.0f, s, -s, 0.0f);\n\t__m128 TmpA2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 1, 2, 3));\n\t__m128 TmpA3 = _mm_mul_ps(SinA0, TmpA2);\n\t__m128 TmpA4 = _mm_add_ps(TmpA1, TmpA3);\n\n\t//Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];\n\t//Rotate[1][1] = c + temp[1] * axis[1];\n\t//Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];\n\t__m128 Axis1 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(1, 1, 1, 1));\n\t__m128 TmpB0 = _mm_mul_ps(Axis1, AxisC);\n\t__m128 CosA1 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 0, 1));\n\t__m128 TmpB1 = _mm_add_ps(CosA1, TmpB0);\n\t__m128 SinB0 = SinA;//_mm_set_ps(-s, 0.0f, s, 0.0f);\n\t__m128 TmpB2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 0, 3, 2));\n\t__m128 TmpB3 = _mm_mul_ps(SinA0, TmpB2);\n\t__m128 TmpB4 = _mm_add_ps(TmpB1, TmpB3);\n\n\t//Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];\n\t//Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];\n\t//Rotate[2][2] = c + temp[2] * axis[2];\n\t__m128 Axis2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(2, 2, 2, 2));\n\t__m128 TmpC0 = _mm_mul_ps(Axis2, AxisC);\n\t__m128 CosA2 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 0, 1, 1));\n\t__m128 TmpC1 = _mm_add_ps(CosA2, TmpC0);\n\t__m128 SinC0 = SinA;//_mm_set_ps(s, -s, 0.0f, 0.0f);\n\t__m128 TmpC2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 3, 0, 1));\n\t__m128 TmpC3 = _mm_mul_ps(SinA0, TmpC2);\n\t__m128 TmpC4 = _mm_add_ps(TmpC1, TmpC3);\n\n\t__m128 Result[4];\n\tResult[0] = TmpA4;\n\tResult[1] = TmpB4;\n\tResult[2] = TmpC4;\n\tResult[3] = _mm_set_ps(1, 0, 0, 0);\n\n\t//mat<4, 4, valType> Result;\n\t//Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];\n\t//Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];\n\t//Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];\n\t//Result[3] = m[3];\n\t//return Result;\n\tsse_mul_ps(in, Result, out);\n}\n*/\nGLM_FUNC_QUALIFIER void glm_mat4_outerProduct(__m128 const& c, __m128 const& r, __m128 out[4])\n{\n\tout[0] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(0, 0, 0, 0)));\n\tout[1] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(1, 1, 1, 1)));\n\tout[2] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(2, 2, 2, 2)));\n\tout[3] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(3, 3, 3, 3)));\n}\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/simd/packing.h",
    "content": "/// @ref simd\n/// @file glm/simd/packing.h\n\n#pragma once\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/simd/platform.h",
    "content": "/// @ref simd\n/// @file glm/simd/platform.h\n\n#pragma once\n\n///////////////////////////////////////////////////////////////////////////////////\n// Platform\n\n#define GLM_PLATFORM_UNKNOWN\t\t0x00000000\n#define GLM_PLATFORM_WINDOWS\t\t0x00010000\n#define GLM_PLATFORM_LINUX\t\t\t0x00020000\n#define GLM_PLATFORM_APPLE\t\t\t0x00040000\n//#define GLM_PLATFORM_IOS\t\t\t0x00080000\n#define GLM_PLATFORM_ANDROID\t\t0x00100000\n#define GLM_PLATFORM_CHROME_NACL\t0x00200000\n#define GLM_PLATFORM_UNIX\t\t\t0x00400000\n#define GLM_PLATFORM_QNXNTO\t\t\t0x00800000\n#define GLM_PLATFORM_WINCE\t\t\t0x01000000\n#define GLM_PLATFORM_CYGWIN\t\t\t0x02000000\n\n#ifdef GLM_FORCE_PLATFORM_UNKNOWN\n#\tdefine GLM_PLATFORM GLM_PLATFORM_UNKNOWN\n#elif defined(__CYGWIN__)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_CYGWIN\n#elif defined(__QNXNTO__)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_QNXNTO\n#elif defined(__APPLE__)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_APPLE\n#elif defined(WINCE)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_WINCE\n#elif defined(_WIN32)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_WINDOWS\n#elif defined(__native_client__)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_CHROME_NACL\n#elif defined(__ANDROID__)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_ANDROID\n#elif defined(__linux)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_LINUX\n#elif defined(__unix)\n#\tdefine GLM_PLATFORM GLM_PLATFORM_UNIX\n#else\n#\tdefine GLM_PLATFORM GLM_PLATFORM_UNKNOWN\n#endif//\n\n// Report platform detection\n#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_PLATFORM_DISPLAYED)\n#\tdefine GLM_MESSAGE_PLATFORM_DISPLAYED\n#\tif(GLM_PLATFORM & GLM_PLATFORM_QNXNTO)\n#\t\tpragma message(\"GLM: QNX platform detected\")\n//#\telif(GLM_PLATFORM & GLM_PLATFORM_IOS)\n//#\t\tpragma message(\"GLM: iOS platform detected\")\n#\telif(GLM_PLATFORM & GLM_PLATFORM_APPLE)\n#\t\tpragma message(\"GLM: Apple platform detected\")\n#\telif(GLM_PLATFORM & GLM_PLATFORM_WINCE)\n#\t\tpragma message(\"GLM: WinCE platform detected\")\n#\telif(GLM_PLATFORM & GLM_PLATFORM_WINDOWS)\n#\t\tpragma message(\"GLM: Windows platform detected\")\n#\telif(GLM_PLATFORM & GLM_PLATFORM_CHROME_NACL)\n#\t\tpragma message(\"GLM: Native Client detected\")\n#\telif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n#\t\tpragma message(\"GLM: Android platform detected\")\n#\telif(GLM_PLATFORM & GLM_PLATFORM_LINUX)\n#\t\tpragma message(\"GLM: Linux platform detected\")\n#\telif(GLM_PLATFORM & GLM_PLATFORM_UNIX)\n#\t\tpragma message(\"GLM: UNIX platform detected\")\n#\telif(GLM_PLATFORM & GLM_PLATFORM_UNKNOWN)\n#\t\tpragma message(\"GLM: platform unknown\")\n#\telse\n#\t\tpragma message(\"GLM: platform not detected\")\n#\tendif\n#endif//GLM_MESSAGES\n\n///////////////////////////////////////////////////////////////////////////////////\n// Compiler\n\n#define GLM_COMPILER_UNKNOWN\t\t0x00000000\n\n// Intel\n#define GLM_COMPILER_INTEL\t\t\t0x00100000\n#define GLM_COMPILER_INTEL14\t\t0x00100040\n#define GLM_COMPILER_INTEL15\t\t0x00100050\n#define GLM_COMPILER_INTEL16\t\t0x00100060\n#define GLM_COMPILER_INTEL17\t\t0x00100070\n\n// Visual C++ defines\n#define GLM_COMPILER_VC\t\t\t\t0x01000000\n#define GLM_COMPILER_VC12\t\t\t0x010000B0\n#define GLM_COMPILER_VC14\t\t\t0x010000C0\n#define GLM_COMPILER_VC15\t\t\t0x010000D0\n#define GLM_COMPILER_VC16\t\t\t0x010000E0\n\n// GCC defines\n#define GLM_COMPILER_GCC\t\t\t0x02000000\n#define GLM_COMPILER_GCC46\t\t\t0x020000D0\n#define GLM_COMPILER_GCC47\t\t\t0x020000E0\n#define GLM_COMPILER_GCC48\t\t\t0x020000F0\n#define GLM_COMPILER_GCC49\t\t\t0x02000100\n#define GLM_COMPILER_GCC5\t\t\t0x02000200\n#define GLM_COMPILER_GCC6\t\t\t0x02000300\n#define GLM_COMPILER_GCC7\t\t\t0x02000400\n#define GLM_COMPILER_GCC8\t\t\t0x02000500\n\n// CUDA\n#define GLM_COMPILER_CUDA\t\t\t0x10000000\n#define GLM_COMPILER_CUDA70\t\t\t0x100000A0\n#define GLM_COMPILER_CUDA75\t\t\t0x100000B0\n#define GLM_COMPILER_CUDA80\t\t\t0x100000C0\n\n// Clang\n#define GLM_COMPILER_CLANG\t\t\t0x20000000\n#define GLM_COMPILER_CLANG34\t\t0x20000050\n#define GLM_COMPILER_CLANG35\t\t0x20000060\n#define GLM_COMPILER_CLANG36\t\t0x20000070\n#define GLM_COMPILER_CLANG37\t\t0x20000080\n#define GLM_COMPILER_CLANG38\t\t0x20000090\n#define GLM_COMPILER_CLANG39\t\t0x200000A0\n#define GLM_COMPILER_CLANG40\t\t0x200000B0\n#define GLM_COMPILER_CLANG41\t\t0x200000C0\n#define GLM_COMPILER_CLANG42\t\t0x200000D0\n\n// Build model\n#define GLM_MODEL_32\t\t\t\t0x00000010\n#define GLM_MODEL_64\t\t\t\t0x00000020\n\n// Force generic C++ compiler\n#ifdef GLM_FORCE_COMPILER_UNKNOWN\n#\tdefine GLM_COMPILER GLM_COMPILER_UNKNOWN\n\n#elif defined(__INTEL_COMPILER)\n#\tif (__INTEL_COMPILER < 1400)\n#\t\terror \"GLM requires ICC 2013 SP1 or newer\"\n#\telif __INTEL_COMPILER == 1400\n#\t\tdefine GLM_COMPILER GLM_COMPILER_INTEL14\n#\telif __INTEL_COMPILER == 1500\n#\t\tdefine GLM_COMPILER GLM_COMPILER_INTEL15\n#\telif __INTEL_COMPILER == 1600\n#\t\tdefine GLM_COMPILER GLM_COMPILER_INTEL16\n#\telif __INTEL_COMPILER >= 1700\n#\t\tdefine GLM_COMPILER GLM_COMPILER_INTEL17\n#\tendif\n\n// CUDA\n#elif defined(__CUDACC__)\n#\tif !defined(CUDA_VERSION) && !defined(GLM_FORCE_CUDA)\n#\t\tinclude <cuda.h>  // make sure version is defined since nvcc does not define it itself!\n#\tendif\n#\tif CUDA_VERSION < 7000\n#\t\terror \"GLM requires CUDA 7.0 or higher\"\n#\telif (CUDA_VERSION >= 7000 && CUDA_VERSION < 7500)\n#\t\tdefine GLM_COMPILER GLM_COMPILER_CUDA70\n#\telif (CUDA_VERSION >= 7500 && CUDA_VERSION < 8000)\n#\t\tdefine GLM_COMPILER GLM_COMPILER_CUDA75\n#\telif (CUDA_VERSION >= 8000)\n#\t\tdefine GLM_COMPILER GLM_COMPILER_CUDA80\n#\tendif\n\n// Clang\n#elif defined(__clang__)\n#\tif defined(__apple_build_version__)\n#\t\tif (__clang_major__ < 6)\n#\t\t\terror \"GLM requires Clang 3.4 / Apple Clang 6.0 or higher\"\n#\t\telif __clang_major__ == 6 && __clang_minor__ == 0\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG35\n#\t\telif __clang_major__ == 6 && __clang_minor__ >= 1\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG36\n#\t\telif __clang_major__ >= 7\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG37\n#\t\tendif\n#\telse\n#\t\tif ((__clang_major__ == 3) && (__clang_minor__ < 4)) || (__clang_major__ < 3)\n#\t\t\terror \"GLM requires Clang 3.4 or higher\"\n#\t\telif __clang_major__ == 3 && __clang_minor__ == 4\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG34\n#\t\telif __clang_major__ == 3 && __clang_minor__ == 5\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG35\n#\t\telif __clang_major__ == 3 && __clang_minor__ == 6\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG36\n#\t\telif __clang_major__ == 3 && __clang_minor__ == 7\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG37\n#\t\telif __clang_major__ == 3 && __clang_minor__ == 8\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG38\n#\t\telif __clang_major__ == 3 && __clang_minor__ >= 9\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG39\n#\t\telif __clang_major__ == 4 && __clang_minor__ == 0\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG40\n#\t\telif __clang_major__ == 4 && __clang_minor__ == 1\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG41\n#\t\telif __clang_major__ == 4 && __clang_minor__ >= 2\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG42\n#\t\telif __clang_major__ >= 4\n#\t\t\tdefine GLM_COMPILER GLM_COMPILER_CLANG42\n#\t\tendif\n#\tendif\n\n// Visual C++\n#elif defined(_MSC_VER)\n#\tif _MSC_VER < 1800\n#\t\terror \"GLM requires Visual C++ 12 - 2013 or higher\"\n#\telif _MSC_VER == 1800\n#\t\tdefine GLM_COMPILER GLM_COMPILER_VC12\n#\telif _MSC_VER == 1900\n#\t\tdefine GLM_COMPILER GLM_COMPILER_VC14\n#\telif _MSC_VER >= 1910\n#\t\tdefine GLM_COMPILER GLM_COMPILER_VC15\n#\tendif//_MSC_VER\n\n// G++\n#elif defined(__GNUC__) || defined(__MINGW32__)\n#\tif ((__GNUC__ == 4) && (__GNUC_MINOR__ < 6)) || (__GNUC__ < 4)\n#\t\terror \"GLM requires GCC 4.7 or higher\"\n#\telif (__GNUC__ == 4) && (__GNUC_MINOR__ == 6)\n#\t\tdefine GLM_COMPILER (GLM_COMPILER_GCC46)\n#\telif (__GNUC__ == 4) && (__GNUC_MINOR__ == 7)\n#\t\tdefine GLM_COMPILER (GLM_COMPILER_GCC47)\n#\telif (__GNUC__ == 4) && (__GNUC_MINOR__ == 8)\n#\t\tdefine GLM_COMPILER (GLM_COMPILER_GCC48)\n#\telif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)\n#\t\tdefine GLM_COMPILER (GLM_COMPILER_GCC49)\n#\telif (__GNUC__ == 5)\n#\t\tdefine GLM_COMPILER (GLM_COMPILER_GCC5)\n#\telif (__GNUC__ == 6)\n#\t\tdefine GLM_COMPILER (GLM_COMPILER_GCC6)\n#\telif (__GNUC__ == 7)\n#\t\tdefine GLM_COMPILER (GLM_COMPILER_GCC7)\n#\telif (__GNUC__ >= 8)\n#\t\tdefine GLM_COMPILER (GLM_COMPILER_GCC8)\n#\tendif\n\n#else\n#\tdefine GLM_COMPILER GLM_COMPILER_UNKNOWN\n#endif\n\n#ifndef GLM_COMPILER\n#\terror \"GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message.\"\n#endif//GLM_COMPILER\n\n///////////////////////////////////////////////////////////////////////////////////\n// Instruction sets\n\n// User defines: GLM_FORCE_PURE GLM_FORCE_SSE2 GLM_FORCE_SSE3 GLM_FORCE_AVX GLM_FORCE_AVX2 GLM_FORCE_AVX2\n\n#define GLM_ARCH_X86_BIT\t\t0x00000001\n#define GLM_ARCH_SSE2_BIT\t\t0x00000002\n#define GLM_ARCH_SSE3_BIT\t\t0x00000004\n#define GLM_ARCH_SSSE3_BIT\t\t0x00000008\n#define GLM_ARCH_SSE41_BIT\t\t0x00000010\n#define GLM_ARCH_SSE42_BIT\t\t0x00000020\n#define GLM_ARCH_AVX_BIT\t\t0x00000040\n#define GLM_ARCH_AVX2_BIT\t\t0x00000080\n#define GLM_ARCH_AVX512_BIT\t\t0x00000200 // Skylake subset\n#define GLM_ARCH_ARM_BIT\t\t0x00000400\n#define GLM_ARCH_NEON_BIT\t\t0x00000800\n#define GLM_ARCH_MIPS_BIT\t\t0x00010000\n#define GLM_ARCH_PPC_BIT\t\t0x01000000\n\n#define GLM_ARCH_PURE\t\t(0x00000000)\n#define GLM_ARCH_X86\t\t(GLM_ARCH_X86_BIT)\n#define GLM_ARCH_SSE2\t\t(GLM_ARCH_SSE2_BIT | GLM_ARCH_X86)\n#define GLM_ARCH_SSE3\t\t(GLM_ARCH_SSE3_BIT | GLM_ARCH_SSE2)\n#define GLM_ARCH_SSSE3\t\t(GLM_ARCH_SSSE3_BIT | GLM_ARCH_SSE3)\n#define GLM_ARCH_SSE41\t\t(GLM_ARCH_SSE41_BIT | GLM_ARCH_SSSE3)\n#define GLM_ARCH_SSE42\t\t(GLM_ARCH_SSE42_BIT | GLM_ARCH_SSE41)\n#define GLM_ARCH_AVX\t\t(GLM_ARCH_AVX_BIT | GLM_ARCH_SSE42)\n#define GLM_ARCH_AVX2\t\t(GLM_ARCH_AVX2_BIT | GLM_ARCH_AVX)\n#define GLM_ARCH_AVX512\t\t(GLM_ARCH_AVX512_BIT | GLM_ARCH_AVX2) // Skylake subset\n#define GLM_ARCH_ARM\t\t(GLM_ARCH_ARM_BIT)\n#define GLM_ARCH_NEON\t\t(GLM_ARCH_NEON_BIT | GLM_ARCH_ARM)\n#define GLM_ARCH_MIPS\t\t(GLM_ARCH_MIPS_BIT)\n#define GLM_ARCH_PPC\t\t(GLM_ARCH_PPC_BIT)\n\n#if defined(GLM_FORCE_PURE)\n#\tdefine GLM_ARCH GLM_ARCH_PURE\n#elif defined(GLM_FORCE_MIPS)\n#\tdefine GLM_ARCH (GLM_ARCH_MIPS)\n#elif defined(GLM_FORCE_PPC)\n#\tdefine GLM_ARCH (GLM_ARCH_PPC)\n#elif defined(GLM_FORCE_NEON)\n#\tdefine GLM_ARCH (GLM_ARCH_NEON)\n#elif defined(GLM_FORCE_AVX512)\n#\tdefine GLM_ARCH (GLM_ARCH_AVX512)\n#elif defined(GLM_FORCE_AVX2)\n#\tdefine GLM_ARCH (GLM_ARCH_AVX2)\n#elif defined(GLM_FORCE_AVX)\n#\tdefine GLM_ARCH (GLM_ARCH_AVX)\n#elif defined(GLM_FORCE_SSE42)\n#\tdefine GLM_ARCH (GLM_ARCH_SSE42)\n#elif defined(GLM_FORCE_SSE41)\n#\tdefine GLM_ARCH (GLM_ARCH_SSE41)\n#elif defined(GLM_FORCE_SSSE3)\n#\tdefine GLM_ARCH (GLM_ARCH_SSSE3)\n#elif defined(GLM_FORCE_SSE3)\n#\tdefine GLM_ARCH (GLM_ARCH_SSE3)\n#elif defined(GLM_FORCE_SSE2)\n#\tdefine GLM_ARCH (GLM_ARCH_SSE2)\n#elif (GLM_COMPILER & (GLM_COMPILER_CLANG | GLM_COMPILER_GCC)) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_LINUX))\n//\tThis is Skylake set of instruction set\n#\tif defined(__AVX512BW__) && defined(__AVX512F__) && defined(__AVX512CD__) && defined(__AVX512VL__) && defined(__AVX512DQ__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_AVX512)\n#\telif defined(__AVX2__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_AVX2)\n#\telif defined(__AVX__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_AVX)\n#\telif defined(__SSE4_2__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_SSE42)\n#\telif defined(__SSE4_1__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_SSE41)\n#\telif defined(__SSSE3__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_SSSE3)\n#\telif defined(__SSE3__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_SSE3)\n#\telif defined(__SSE2__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_SSE2)\n#\telif defined(__i386__) || defined(__x86_64__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_X86)\n#\telif defined(__ARM_NEON)\n#\t\tdefine GLM_ARCH (GLM_ARCH_ARM | GLM_ARCH_NEON)\n#\telif defined(__arm__ )\n#\t\tdefine GLM_ARCH (GLM_ARCH_ARM)\n#\telif defined(__mips__ )\n#\t\tdefine GLM_ARCH (GLM_ARCH_MIPS)\n#\telif defined(__powerpc__ )\n#\t\tdefine GLM_ARCH (GLM_ARCH_PPC)\n#\telse\n#\t\tdefine GLM_ARCH (GLM_ARCH_PURE)\n#\tendif\n#elif (GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))\n#\tif defined(_M_ARM)\n#\t\tdefine GLM_ARCH (GLM_ARCH_ARM)\n#\telif defined(__AVX2__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_AVX2)\n#\telif defined(__AVX__)\n#\t\tdefine GLM_ARCH (GLM_ARCH_AVX)\n#\telif defined(_M_X64)\n#\t\tdefine GLM_ARCH (GLM_ARCH_SSE2)\n#\telif defined(_M_IX86_FP)\n#\t\tif _M_IX86_FP >= 2\n#\t\t\tdefine GLM_ARCH (GLM_ARCH_SSE2)\n#\t\telse\n#\t\t\tdefine GLM_ARCH (GLM_ARCH_PURE)\n#\t\tendif\n#\telif defined(_M_PPC)\n#\t\tdefine GLM_ARCH (GLM_ARCH_PPC)\n#\telse\n#\t\tdefine GLM_ARCH (GLM_ARCH_PURE)\n#\tendif\n#else\n#\tdefine GLM_ARCH GLM_ARCH_PURE\n#endif\n\n// With MinGW-W64, including intrinsic headers before intrin.h will produce some errors. The problem is\n// that windows.h (and maybe other headers) will silently include intrin.h, which of course causes problems.\n// To fix, we just explicitly include intrin.h here.\n#if defined(__MINGW64__) && (GLM_ARCH != GLM_ARCH_PURE)\n#\tinclude <intrin.h>\n#endif\n\n#if GLM_ARCH & GLM_ARCH_AVX2_BIT\n#\tinclude <immintrin.h>\n#elif GLM_ARCH & GLM_ARCH_AVX_BIT\n#\tinclude <immintrin.h>\n#elif GLM_ARCH & GLM_ARCH_SSE42_BIT\n#\tif GLM_COMPILER & GLM_COMPILER_CLANG\n#\t\tinclude <popcntintrin.h>\n#\tendif\n#\tinclude <nmmintrin.h>\n#elif GLM_ARCH & GLM_ARCH_SSE41_BIT\n#\tinclude <smmintrin.h>\n#elif GLM_ARCH & GLM_ARCH_SSSE3_BIT\n#\tinclude <tmmintrin.h>\n#elif GLM_ARCH & GLM_ARCH_SSE3_BIT\n#\tinclude <pmmintrin.h>\n#elif GLM_ARCH & GLM_ARCH_SSE2_BIT\n#\tinclude <emmintrin.h>\n#endif//GLM_ARCH\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\ttypedef __m128\t\tglm_vec4;\n\ttypedef __m128i\t\tglm_ivec4;\n\ttypedef __m128i\t\tglm_uvec4;\n#endif\n\n#if GLM_ARCH & GLM_ARCH_AVX_BIT\n\ttypedef __m256d\t\tglm_dvec4;\n#endif\n\n#if GLM_ARCH & GLM_ARCH_AVX2_BIT\n\ttypedef __m256i\t\tglm_i64vec4;\n\ttypedef __m256i\t\tglm_u64vec4;\n#endif\n"
  },
  {
    "path": "external/glm/glm/simd/trigonometric.h",
    "content": "/// @ref simd\n/// @file glm/simd/trigonometric.h\n\n#pragma once\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n"
  },
  {
    "path": "external/glm/glm/simd/vector_relational.h",
    "content": "/// @ref simd\n/// @file glm/simd/vector_relational.h\n\n#pragma once\n\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n"
  },
  {
    "path": "external/glm/glm/trigonometric.hpp",
    "content": "/// @ref core\n/// @file glm/trigonometric.hpp\n///\n/// @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>\n/// \n/// @defgroup core_func_trigonometric Angle and Trigonometry Functions\n/// @ingroup core\n/// \n/// Include <glm/trigonometric.hpp> to use these core features.\n///\n/// Function parameters specified as angle are assumed to be in units of radians. \n/// In no case will any of these functions result in a divide by zero error. If \n/// the divisor of a ratio is 0, then results will be undefined.\n/// \n/// These all operate component-wise. The description is per component.\n\n#pragma once\n\n#include \"detail/setup.hpp\"\n#include \"detail/qualifier.hpp\"\n\nnamespace glm\n{\n\t/// @addtogroup core_func_trigonometric\n\t/// @{\n\n\t/// Converts degrees to radians and returns the result.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml\">GLSL radians man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL GLM_CONSTEXPR vec<L, T, Q> radians(vec<L, T, Q> const& degrees);\n\n\t/// Converts radians to degrees and returns the result.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml\">GLSL degrees man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL GLM_CONSTEXPR vec<L, T, Q> degrees(vec<L, T, Q> const& radians);\n\n\t/// The standard trigonometric sine function. \n\t/// The values returned by this function will range from [-1, 1].\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sin.xml\">GLSL sin man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> sin(vec<L, T, Q> const& angle);\n\n\t/// The standard trigonometric cosine function. \n\t/// The values returned by this function will range from [-1, 1].\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cos.xml\">GLSL cos man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> cos(vec<L, T, Q> const& angle);\n\n\t/// The standard trigonometric tangent function.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/tan.xml\">GLSL tan man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> tan(vec<L, T, Q> const& angle);\n\n\t/// Arc sine. Returns an angle whose sine is x. \n\t/// The range of values returned by this function is [-PI/2, PI/2]. \n\t/// Results are undefined if |x| > 1.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/asin.xml\">GLSL asin man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> asin(vec<L, T, Q> const& x);\n\n\t/// Arc cosine. Returns an angle whose sine is x. \n\t/// The range of values returned by this function is [0, PI]. \n\t/// Results are undefined if |x| > 1.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/acos.xml\">GLSL acos man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> acos(vec<L, T, Q> const& x);\n\n\t/// Arc tangent. Returns an angle whose tangent is y/x. \n\t/// The signs of x and y are used to determine what \n\t/// quadrant the angle is in. The range of values returned \n\t/// by this function is [-PI, PI]. Results are undefined \n\t/// if x and y are both 0. \n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml\">GLSL atan man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> atan(vec<L, T, Q> const& y, vec<L, T, Q> const& x);\n\n\t/// Arc tangent. Returns an angle whose tangent is y_over_x. \n\t/// The range of values returned by this function is [-PI/2, PI/2].\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml\">GLSL atan man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> atan(vec<L, T, Q> const& y_over_x);\n\n\t/// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sinh.xml\">GLSL sinh man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> sinh(vec<L, T, Q> const& angle);\n\n\t/// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cosh.xml\">GLSL cosh man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> cosh(vec<L, T, Q> const& angle);\n\n\t/// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle)\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/tanh.xml\">GLSL tanh man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> tanh(vec<L, T, Q> const& angle);\n\n\t/// Arc hyperbolic sine; returns the inverse of sinh.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/asinh.xml\">GLSL asinh man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> asinh(vec<L, T, Q> const& x);\n\n\t/// Arc hyperbolic cosine; returns the non-negative inverse\n\t/// of cosh. Results are undefined if x < 1.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/acosh.xml\">GLSL acosh man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> acosh(vec<L, T, Q> const& x);\n\n\t/// Arc hyperbolic tangent; returns the inverse of tanh.\n\t/// Results are undefined if abs(x) >= 1.\n\t///\n\t/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector\n\t/// @tparam T Floating-point scalar types\n\t/// @tparam Q Value from qualifier enum\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atanh.xml\">GLSL atanh man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, T, Q> atanh(vec<L, T, Q> const& x);\n\n\t/// @}\n}//namespace glm\n\n#include \"detail/func_trigonometric.inl\"\n"
  },
  {
    "path": "external/glm/glm/vec2.hpp",
    "content": "/// @ref core\n/// @file glm/vec2.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_vec2.hpp\"\n"
  },
  {
    "path": "external/glm/glm/vec3.hpp",
    "content": "/// @ref core\n/// @file glm/vec3.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_vec3.hpp\"\n"
  },
  {
    "path": "external/glm/glm/vec4.hpp",
    "content": "/// @ref core\n/// @file glm/vec4.hpp\n\n#include \"detail/setup.hpp\"\n\n#pragma once\n\n#include \"detail/type_vec4.hpp\"\n"
  },
  {
    "path": "external/glm/glm/vector_relational.hpp",
    "content": "/// @ref core\n/// @file glm/vector_relational.hpp\n///\n/// @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>\n/// \n/// @defgroup core_func_vector_relational Vector Relational Functions\n/// @ingroup core\n/// \n/// Include <glm/vector_relational.hpp> to use these core features.\n///\n/// Relational and equality operators (<, <=, >, >=, ==, !=) are defined to \n/// operate on scalars and produce scalar Boolean results. For vector results, \n/// use the following built-in functions. \n/// \n/// In all cases, the sizes of all the input and return vectors for any particular \n/// call must match.\n\n#pragma once\n\n#include \"detail/qualifier.hpp\"\n#include \"detail/setup.hpp\"\n\nnamespace glm\n{\n\t/// @addtogroup core_func_vector_relational\n\t/// @{\n\n\t/// Returns the component-wise comparison result of x < y.\n\t/// \n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T A floating-point or integer scalar type.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThan.xml\">GLSL lessThan man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> lessThan(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x <= y.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T A floating-point or integer scalar type.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThanEqual.xml\">GLSL lessThanEqual man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> lessThanEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x > y.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T A floating-point or integer scalar type.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThan.xml\">GLSL greaterThan man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> greaterThan(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x >= y.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T A floating-point or integer scalar type.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThanEqual.xml\">GLSL greaterThanEqual man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> greaterThanEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x == y.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T A floating-point, integer or bool scalar type.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/equal.xml\">GLSL equal man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns the component-wise comparison of result x != y.\n\t/// \n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// @tparam T A floating-point, integer or bool scalar type.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/notEqual.xml\">GLSL notEqual man page</a>\n\t/// @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>\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y);\n\n\t/// Returns true if any component of x is true.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t/// \n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/any.xml\">GLSL any man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL bool any(vec<L, bool, Q> const& v);\n\n\t/// Returns true if all components of x are true.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/all.xml\">GLSL all man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL bool all(vec<L, bool, Q> const& v);\n\n\t/// Returns the component-wise logical complement of x.\n\t/// /!\\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead.\n\t///\n\t/// @tparam L An integer between 1 and 4 included that qualify the dimension of the vector.\n\t///\n\t/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/not.xml\">GLSL not man page</a>\n\t/// @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>\n\ttemplate<length_t L, qualifier Q>\n\tGLM_FUNC_DECL vec<L, bool, Q> not_(vec<L, bool, Q> const& v);\n\n\t/// @}\n}//namespace glm\n\n#include \"detail/func_vector_relational.inl\"\n"
  },
  {
    "path": "external/glm/manual.md",
    "content": "![Alt](/doc/manual/logo-mini.png \"GLM Logo\")\n\n# GLM 0.9.9 Manual\n\n![Alt](/doc/manual/g-truc.png \"G-Truc Logo\")\n\n---\n## Table of Contents\n+ [0. Licenses](#section0)\n+ [1. Getting started](#section1)\n+ [1.1. Setup](#section1_1)\n+ [1.2. Faster compilation](#section1_2)\n+ [1.3. Example usage](#section1_3)\n+ [1.4. Dependencies](#section1_4)\n+ [2. Swizzling](#section2)\n+ [2.1. Default C++98 implementation](#section2_1)\n+ [2.2. Anonynous union member implementation](#section2_2)\n+ [3. Preprocessor options](#section3)\n+ [3.1. GLM\\_PRECISION\\_**: Default precision](#section3_1)\n+ [3.2. GLM\\_FORCE\\_MESSAGES: Compile-time message system](#section3_2)\n+ [3.3. GLM\\_FORCE\\_CXX**: C++ language detection](#section3_3)\n+ [3.4. SIMD support](#section3_4)\n+ [3.5. GLM\\_FORCE\\_INLINE: Force inline](#section3_5)\n+ [3.6. GLM\\_FORCE\\_SIZE\\_T\\_LENGTH: Vector and matrix static size](#section3_6)\n+ [3.7. GLM\\_FORCE\\_EXPLICIT\\_CTOR: Requiring explicit conversions](#section3_7)\n+ [3.8. GLM\\_FORCE\\_UNRESTRICTED\\_GENTYPE: Removing genType restriction](#section3_8)\n+ [3.9. GLM\\_FORCE\\_SINGLE\\_ONLY: Removed explicit 64-bits floating point types](#section3_9)\n+ [4. Stable extensions](#section4)\n+ [4.1. GLM_GTC_bitfield](#section4_1)\n+ [4.2. GLM_GTC_color_space](#section4_2)\n+ [4.3. GLM_GTC_constants](#section4_3)\n+ [4.4. GLM_GTC_epsilon](#section4_4)\n+ [4.5. GLM_GTC_integer](#section4_5)\n+ [4.6. GLM_GTC_matrix_access](#section4_6)\n+ [4.7. GLM_GTC_matrix_integer](#section4_7)\n+ [4.8. GLM_GTC_matrix_inverse](#section4_8)\n+ [4.9. GLM_GTC_matrix_transform](#section4_9)\n+ [4.10. GLM_GTC_noise](#section4_10)\n+ [4.11. GLM_GTC_packing](#section4_11)\n+ [4.12. GLM_GTC_quaternion](#section4_12)\n+ [4.13. GLM_GTC_random](#section4_13)\n+ [4.14. GLM_GTC_reciprocal](#section4_14)\n+ [4.15. GLM_GTC_round](#section4_15)\n+ [4.16. GLM_GTC_type_alignment](#section4_16)\n+ [4.17. GLM_GTC_type_precision](#section4_17)\n+ [4.18. GLM_GTC_type_ptr](#section4_18)\n+ [4.19. GLM_GTC_ulp](#section4_19)\n+ [4.20. GLM_GTC_vec1](#section4_20)\n+ [5. OpenGL interoperability](#section5)\n+ [5.1. GLM Replacements for deprecated OpenGL functions](#section5_1)\n+ [5.2. GLM Replacements for GPU functions](#section5_2)\n+ [6. Known issues](#section6)\n+ [6.1. Not function](#section6_1)\n+ [6.2. Precision qualifiers support](#section6_2)\n+ [7. FAQ](#section7)\n+ [7.1 Why GLM follows GLSL specification and conventions?](#section7_1)\n+ [7.2. Does GLM run GLSL programs?](#section7_2)\n+ [7.3. Does a GLSL compiler build GLM codes?](#section7_3)\n+ [7.4. Should I use ‘GTX’ extensions?](#section7_4)\n+ [7.5. Where can I ask my questions?](#section7_5)\n+ [7.6. Where can I find the documentation of extensions?](#section7_6)\n+ [7.7. Should I use 'using namespace glm;'?](#section7_7)\n+ [7.8. Is GLM fast?](#section7_8)\n+ [7.9. When I build with Visual C++ with /w4 warning level, I have warnings...](#section7_9)\n+ [7.10. Why some GLM functions can crash because of division by zero?](#section7_10)\n+ [7.11. What unit for angles us used in GLM?](#section7_11)\n+ [7.12. Windows headers cause build errors...](#section7_12)\n+ [7.13. Constant expressions support](#section7_13)\n+ [8. Code samples](#section8)\n+ [8.1. Compute a triangle normal](#section8_1)\n+ [8.2. Matrix transform](#section8_2)\n+ [8.3. Vector types](#section8_3)\n+ [8.4. Lighting](#section8_4)\n+ [9. References](#section9)\n+ [9.1. OpenGL specifications](#section9_1)\n+ [9.2. External links](#section9_2)\n+ [9.3. Projects using GLM](#section9_3)\n+ [9.4. Tutorials using GLM](#section9_4)\n+ [9.5. Equivalent for other languages](#section9_5)\n+ [9.6. Alternatives to GLM](#section9_6)\n+ [9.8. Acknowledgements](#section9_8)\n\n---\n## <a name=\"section0\"></a> Licenses\n\n### The Happy Bunny License (Modified MIT License)\n\nCopyright (c) 2005 - 2017 G-Truc Creation\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nRestrictions: By making use of the Software for military purposes, you\nchoose to make a Bunny unhappy.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n![](https://github.com/g-truc/glm/blob/manual/doc/manual/frontpage1.png)\n\n### The MIT License\n\nCopyright (c) 2005 - 2017 G-Truc Creation\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n![](https://github.com/g-truc/glm/blob/manual/doc/manual/frontpage2.png)\n\n---\n\n## <a name=\"section1\"></a> 1. Getting started\n### <a name=\"section1_1\"></a> 1.1. Setup\n\nGLM is a header-only library, and thus does not need to be compiled.  We can use GLM's implementation of GLSL's mathematics functionality by including the `<glm/glm.hpp>` header.  The library can also be installed with CMake, though the details of doing so will differ depending on the target build system.\n\nFeatures can also be included individually to shorten compilation times.\n\n```cpp\n#include <glm/vec2.hpp> // vec2, bvec2, dvec2, ivec2 and uvec2\n#include <glm/vec3.hpp> // vec3, bvec3, dvec3, ivec3 and uvec3\n#include <glm/vec4.hpp> // vec4, bvec4, dvec4, ivec4 and uvec4\n#include <glm/mat2x2.hpp> // mat2, dmat2\n#include <glm/mat2x3.hpp> // mat2x3, dmat2x3\n#include <glm/mat2x4.hpp> // mat2x4, dmat2x4\n#include <glm/mat3x2.hpp> // mat3x2, dmat3x2\n#include <glm/mat3x3.hpp> // mat3, dmat3\n#include <glm/mat3x4.hpp> // mat3x4, dmat2\n#include <glm/mat4x2.hpp> // mat4x2, dmat4x2\n#include <glm/mat4x3.hpp> // mat4x3, dmat4x3\n#include <glm/mat4x4.hpp> // mat4, dmat4\n#include <glm/common.hpp> // all the GLSL common functions\n#include <glm/exponential.hpp> // all the GLSL exponential functions\n#include <glm/geometry.hpp> // all the GLSL geometry functions\n#include <glm/integer.hpp> // all the GLSL integer functions\n#include <glm/matrix.hpp> // all the GLSL matrix functions\n#include <glm/packing.hpp> // all the GLSL packing functions\n#include <glm/trigonometric.hpp> // all the GLSL trigonometric functions\n#include <glm/vector_relational.hpp> // all the GLSL vector relational functions\n```\n### <a name=\"section1_2\"></a> 1.2. Faster compilation\n\nGLM uses C++ templates heavily, and may significantly increase compilation times for projects that use it.  Hence, source files should only include the headers they actually use.\n\nTo reduce compilation time, we can include `<glm/fwd.hpp>`, which forward-declares all types should their definitions not be needed.\n\n```cpp\n// Header file (forward declarations only)\n#include <glm/fwd.hpp>\n\n// At this point, we don't care what exactly makes up a vec2; that won't matter\n// until we write this function's implementation.\nglm::vec2 functionDeclaration(const glm::vec2& input);\n```\n\nPrecompiled headers will also be helpful, though are not covered by this manual.\n\n### <a name=\"section1_3\"></a> 1.3. Example usage\n\n\n```cpp\n// Include GLM core features\n#include <glm/vec3.hpp>\n#include <glm/vec4.hpp>\n#include <glm/mat4x4.hpp>\n#include <glm/trigonometric.hpp>\n\n// Include GLM extensions\n#include <glm/gtc/matrix_transform.hpp>\n\nglm::mat4 transform(glm::vec2 const& Orientation, glm::vec3 const& Translate, glm::vec3 const& Up)\n{\n    glm::mat4 Proj = glm::perspective(glm::radians(45.f), 1.33f, 0.1f, 10.f);\n    glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.f), Translate);\n    glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Orientation.y, Up);\n    glm::mat4 View = glm::rotate(ViewRotateX, Orientation.x, Up);\n    glm::mat4 Model = glm::mat4(1.0f);\n    return Proj * View * Model;\n}\n```\n\n### <a name=\"section1_4\"></a> 1.4. Dependencies\n\nGLM does not depend on external libraries or headers such as `<GL/gl.h>`, [`<GL/glcorearb.h>`](http://www.opengl.org/registry/api/GL/glcorearb.h), `<GLES3/gl3.h>`, `<GL/glu.h>`, or `<windows.h>`.\n\n---\n## <a name=\"section2\"></a> 2. Swizzling\n\nShader languages like GLSL often feature so-called swizzle expressions, which may be used to freely select and arrange a vector's components. For example, `variable.x`, `variable.xzy` and `variable.zxyy` respectively form a scalar, a 3D vector and a 4D vector.  The result of a swizzle expression in GLSL can be either an R-value or an L-value. Swizzle expressions can be written with characters from exactly one of `xyzw` (usually for positions), `rgba` (usually for colors), and `stpq` (usually for texture coordinates).\n\n```cpp\nvec4 A;\nvec2 B;\n\nB.yx = A.wy;\nB = A.xx;\nvec3 C = A.bgr;\nvec3 D = B.rsz; // Invalid, won't compile\n```\n\nGLM optionally supports some of this functionality via the methods described in the following sections. Swizzling can be enabled by defining `GLM_FORCE_SWIZZLE` before including any GLM header files, or as part of a project's build process.\n\n*Note that enabling swizzle expressions will massively increase the size of your binaries and the time it takes to compile them!*\n\n### <a name=\"section2_1\"></a> 2.1. Default C++98 implementation\n\nWhen compiling GLM as C++98, R-value swizzle expressions are simulated through member functions of each vector type.\n\n```cpp\n#define GLM_FORCE_SWIZZLE // Or defined when building (e.g. -DGLM_FORCE_SWIZZLE)\n#include <glm/glm.hpp>\n\nvoid foo()\n{\n    glm::vec4 ColorRGBA(1.0f, 0.5f, 0.0f, 1.0f);\n    glm::vec3 ColorBGR = ColorRGBA.bgr();\n\n    glm::vec3 PositionA(1.0f, 0.5f, 0.0f, 1.0f);\n    glm::vec3 PositionB = PositionXYZ.xyz() * 2.0f;\n\n    glm::vec2 TexcoordST(1.0f, 0.5f);\n    glm::vec4 TexcoordSTPQ = TexcoordST.stst();\n}\n```\n\nSwizzle operators return a **copy** of the component values, and thus *can't* be used as L-values to change a vector's values.\n\n\n```cpp\n#define GLM_FORCE_SWIZZLE\n#include <glm/glm.hpp>\n\nvoid foo()\n{\n  glm::vec3 A(1.0f, 0.5f, 0.0f);\n\n  // No compiler error, but A is not modified.\n  // An anonymous copy is being modified (and then discarded).\n  A.bgr() = glm::vec3(2.0f, 1.5f, 1.0f); // A is not modified!\n}\n```\n\n### <a name=\"section2_2\"></a> 2.2. Anonymous union member implementation\n\nVisual C++ supports, as a _non-standard language extension_, anonymous `struct`s as `union` members. This permits a powerful swizzling implementation that both allows L-value swizzle expressions and GLSL-like syntax.  To use this feature, the language extension must be enabled by a supporting compiler and `GLM_FORCE_SWIZZLE` must be `#define`d.\n\n```cpp\n#define GLM_FORCE_SWIZZLE\n#include <glm/glm.hpp>\n\n// Only guaranteed to work with Visual C++!\n// Some compilers that support Microsoft extensions may compile this.\nvoid foo()\n{\n  glm::vec4 ColorRGBA(1.0f, 0.5f, 0.0f, 1.0f);\n\n  // l-value:\n  glm::vec4 ColorBGRA = ColorRGBA.bgra;\n\n  // r-value:\n  ColorRGBA.bgra = ColorRGBA;\n\n  // Both l-value and r-value\n  ColorRGBA.bgra = ColorRGBA.rgba;\n}\n```\n\nThis version returns implementation-specific objects that _implicitly convert_ to their respective vector types.  As a consequence of this design, these extra types **can't be directly used** by GLM functions; they must be converted through constructors or `operator()`.\n\n```cpp\n#define GLM_FORCE_SWIZZLE\n#include <glm/glm.hpp>\n\nusing glm::vec4;\n\nvoid foo()\n{\n  vec4 Color(1.0f, 0.5f, 0.0f, 1.0f);\n\n  // Generates compiler errors. Color.rgba is not a vector type.\n  vec4 ClampedA = glm::clamp(Color.rgba, 0.f, 1.f); // ERROR\n\n  // Explicit conversion through a constructor\n  vec4 ClampedB = glm::clamp(vec4(Color.rgba), 0.f, 1.f); // OK\n\n  // Explicit conversion through operator()\n  vec4 ClampedC = glm::clamp(Color.rgba(), 0.f, 1.f); // OK\n}\n```\n\n---\n## <a name=\"section3\"></a> 3. Preprocessor options\n\n### <a name=\"section3_1\"></a> 3.1. GLM\\_PRECISION\\_**: Default precision\n\nC++ does not provide a way to implement GLSL default precision selection (as defined in GLSL 4.10 specification section 4.5.3) with GLSL-like syntax.\n\n```cpp\nprecision mediump int;\nprecision highp float;\n```\n\nTo use the default precision functionality, GLM provides some defines that need to added before any include of `glm.hpp`:\n\n```cpp\n#define GLM_PRECISION_MEDIUMP_INT\n#define GLM_PRECISION_HIGHP_FLOAT\n#include <glm/glm.hpp>\n```\n\nAvailable defines for floating point types (glm::vec\\*, glm::mat\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_FLOAT: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_FLOAT: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_FLOAT: High precision (default)\n\nAvailable defines for floating point types (glm::dvec\\*, glm::dmat\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_DOUBLE: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_DOUBLE: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_DOUBLE: High precision (default)\n\nAvailable defines for signed integer types (glm::ivec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_INT: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_INT: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_INT: High precision (default)\n\nAvailable defines for unsigned integer types (glm::uvec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_UINT: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_UINT: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_UINT: High precision (default)\n\n### <a name=\"section3_2\"></a> 3.2. GLM\\_FORCE\\_MESSAGES: Compile-time message system\n\nGLM includes a notification system which can display some information at build time:\n\n* Platform: Windows, Linux, Native Client, QNX, etc.\n* Compiler: Visual C++, Clang, GCC, ICC, etc.\n* Build model: 32bits or 64 bits\n* C++ version : C++98, C++11, MS extensions, etc.\n* Architecture: x86, SSE, AVX, etc.\n* Included extensions\n* etc.\n\nThis system is disabled by default. To enable this system, define GLM\\_FORCE\\_MESSAGES before any inclusion of &lt;glm/glm.hpp&gt;. The messages are generated only by compiler supporting \\#program message and\nonly once per project build.\n\n```cpp\n#define GLM_FORCE_MESSAGES\n#include <glm/glm.hpp>\n```\n\n### <a name=\"section3_3\"></a> 3.3. GLM\\_FORCE\\_CXX**: C++ language detection\n\nGLM will automatically take advantage of compilers’ language extensions when enabled. To increase cross platform compatibility and to avoid compiler extensions, a programmer can define GLM\\_FORCE\\_CXX98 before\nany inclusion of &lt;glm/glm.hpp&gt; to restrict the language feature set C++98:\n\n```cpp\n#define GLM_FORCE_CXX98\n#include <glm/glm.hpp>\n```\n\nFor C++11 and C++14, equivalent defines are available:\nGLM\\_FORCE\\_CXX11, GLM\\_FORCE\\_CXX14.\n\n```cpp\n#define GLM_FORCE_CXX11\n#include <glm/glm.hpp>\n\n// If the compiler doesn’t support C++11, compiler errors will happen.\n```\n\nGLM\\_FORCE\\_CXX14 overrides GLM\\_FORCE\\_CXX11 and GLM\\_FORCE\\_CXX11\noverrides GLM\\_FORCE\\_CXX98 defines.\n\n### <a name=\"section3_4\"></a> 3.4. SIMD support\n\nGLM provides some SIMD optimizations based on [compiler intrinsics](https://msdn.microsoft.com/en-us/library/26td21ds.aspx).\nThese optimizations will be automatically thanks to compiler arguments.\nFor example, if a program is compiled with Visual Studio using /arch:AVX, GLM will detect this argument and generate code using AVX instructions automatically when available.\n\nIt’s possible to avoid the instruction set detection by forcing the use of a specific instruction set with one of the fallowing define:\nGLM\\_FORCE\\_SSE2, GLM\\_FORCE\\_SSE3, GLM\\_FORCE\\_SSSE3, GLM\\_FORCE\\_SSE41, GLM\\_FORCE\\_SSE42, GLM\\_FORCE\\_AVX, GLM\\_FORCE\\_AVX2 or GLM\\_FORCE\\_AVX512.\n\nThe use of intrinsic functions by GLM implementation can be avoided using the define GLM\\_FORCE\\_PURE before any inclusion of GLM headers.\n\n```cpp\n#define GLM_FORCE_PURE\n#include <glm/glm.hpp>\n\n// GLM code will be compiled using pure C++ code without any intrinsics\n```\n\n```cpp\n#define GLM_FORCE_AVX2\n#include <glm/glm.hpp>\n\n// If the compiler doesn’t support AVX2 instrinsics, compiler errors will happen.\n```\n\nAdditionally, GLM provides a low level SIMD API in glm/simd directory for users who are really interested in writing fast algorithms.\n\n### <a name=\"section3_5\"></a> 3.5. GLM\\_FORCE\\_INLINE: Force inline\n\nTo push further the software performance, a programmer can define GLM\\_FORCE\\_INLINE before any inclusion of &lt;glm/glm.hpp&gt; to force the compiler to inline GLM code.\n\n```cpp\n#define GLM_FORCE_INLINE\n#include <glm/glm.hpp>\n```\n\n### <a name=\"section3_6\"></a> 3.6. GLM\\_FORCE\\_SIZE\\_T\\_LENGTH: Vector and matrix static size\n\nGLSL supports the member function .length() for all vector and matrix types.\n\n```cpp\n#include <glm/glm.hpp>\n\nvoid foo(vec4 const& v)\n{\n    int Length = v.length();\n    ...\n}\n```\n\nThis function returns a int however this function typically interacts with STL size\\_t based code. GLM provides GLM\\_FORCE\\_SIZE\\_T\\_LENGTH pre-processor option so that member functions length() return a size\\_t.\n\nAdditionally, GLM defines the type glm::length\\_t to identify length() returned type, independently from GLM\\_FORCE\\_SIZE\\_T\\_LENGTH.\n\n```cpp\n#define GLM_FORCE_SIZE_T_LENGTH\n#include <glm/glm.hpp>\n\nvoid foo(vec4 const& v)\n{\n    glm::length_t Length = v.length();\n    ...\n}\n```\n\n### <a name=\"section3_7\"></a> 3.7. GLM\\_FORCE\\_EXPLICIT\\_CTOR: Requiring explicit conversions\n\nGLSL supports implicit conversions of vector and matrix types. For example, an ivec4 can be implicitly converted into vec4.\n\nOften, this behaviour is not desirable but following the spirit of the library, this behavior is supported in GLM. However, GLM 0.9.6 introduced the define GLM\\_FORCE\\_EXPLICIT\\_CTOR to require explicit\nconversion for GLM types.\n\n```cpp\n#include <glm/glm.hpp>\n\nvoid foo()\n{\n    glm::ivec4 a;\n    ...\n\n    glm::vec4 b(a); // Explicit conversion, OK\n    glm::vec4 c = a; // Implicit conversion, OK\n    ...\n}\n```\n\nWith GLM\\_FORCE\\_EXPLICIT\\_CTOR define, implicit conversions are not allowed:\n\n```cpp\n#define GLM_FORCE_EXPLICIT_CTOR\n#include <glm/glm.hpp>\n\nvoid foo()\n{\n    glm::ivec4 a;\n    {\n        glm::vec4 b(a); // Explicit conversion, OK\n        glm::vec4 c = a; // Implicit conversion, ERROR\n        ...\n}\n```\n\n### <a name=\"section3_8\"></a> 3.8. GLM\\_FORCE\\_UNRESTRICTED\\_GENTYPE: Removing genType restriction\n\nBy default GLM only supports basic types as genType for vector, matrix and quaternion types:\n\n```cpp\n#include <glm/glm.hpp>\n\ntypedef glm::vec<4, float> my_fvec4;\n```\n\nGLM 0.9.8 introduced GLM\\_FORCE\\_UNRESTRICTED\\_GENTYPE define to relax this restriction:\n\n```cpp\n#define GLM_FORCE_UNRESTRICTED_GENTYPE\n#include <glm/glm.hpp>\n\n#include \"half.hpp\" // Define “half” class with behavior equivalent to “float”\n\ntypedef glm::vec<4, half> my_hvec4;\n```\n\nHowever, defining GLM\\_FORCE\\_UNRESTRICTED\\_GENTYPE is not compatible with GLM\\_FORCE\\_SWIZZLE and will generate a compilation error if both are defined at the same time.\n\n### <a name=\"section3_9\"></a> 3.9. GLM\\_FORCE\\_SINGLE\\_ONLY: Removed explicit 64-bits floating point types\n\nSome platforms (Dreamcast) doesn't support double precision floating point values. To compile on such platforms, GCC has the --m4-single-only build argument. When defining GLM\\_FORCE\\_SINGLE\\_ONLY before including GLM headers, GLM releases the requirement of double precision floating point values support. Effectivement, all the float64 types are no longer defined and double behaves like float. \n\n---\n## <a name=\"section4\"></a> 4. Stable extensions\n\nGLM extends the core GLSL feature set with extensions. These extensions include: quaternion, transformation, spline, matrix inverse, color spaces, etc.\n\nTo include an extension, we only need to include the dedicated header file. Once included, the features are added to the GLM namespace.\n\n```cpp\n#include <glm/glm.hpp>\n#include <glm/gtc/matrix_transform.hpp>\n\nint foo()\n{\n    glm::vec4 Position = glm::vec4(glm:: vec3(0.0f), 1.0f);\n    glm::mat4 Model = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f));\n\n    glm::vec4 Transformed = Model * Position;\n    ...\n\n    return 0;\n}\n```\n\nWhen an extension is included, all the dependent core functionalities and extensions will be included as well.\n\n### <a name=\"section4_1\"></a> 4.1. GLM_GTC_bitfield\n\nFast bitfield operations on scalar and vector variables.\n\n&lt;glm/gtc/bitfield.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_2\"></a> 4.2. GLM_GTC_color_space\n\nConversion between linear RGB and sRGB color spaces.\n\n&lt;glm/gtc/color\\_space.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_3\"></a> 4.3. GLM\\_GTC\\_constants\n\nProvide a list of built-in constants.\n\n&lt;glm/gtc/constants.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_4\"></a> 4.4. GLM\\_GTC\\_epsilon\n\nApproximate equality comparisons for floating-point numbers, possibly with a user-defined epsilon.\n\n&lt;glm/gtc/epsilon.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_5\"></a> 4.5. GLM\\_GTC\\_integer\n\nInteger variants of core GLM functions.\n\n&lt;glm/gtc/integer.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_6\"></a> 4.6. GLM\\_GTC\\_matrix\\_access\n\nFunctions to conveniently access the individual rows or columns of a matrix.\n\n&lt;glm/gtc/matrix\\_access.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_7\"></a> 4.7. GLM\\_GTC\\_matrix\\_integer\n\nInteger matrix types similar to the core floating-point matrices.  Some operations (such as inverse and determinant) are not supported.\n\n&lt;glm/gtc/matrix\\_integer.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_8\"></a> 4.8. GLM\\_GTC\\_matrix\\_inverse\n\nAdditional matrix inverse functions.\n\n&lt;glm/gtc/matrix\\_inverse.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_9\"></a> 4.9. GLM\\_GTC\\_matrix\\_transform\n\nMatrix transformation functions that follow the OpenGL fixed-function conventions.\n\nFor example, the ***lookAt*** function generates a transformation matrix that projects world coordinates into eye coordinates suitable for projection matrices (e.g. ***perspective***, ***ortho***). See the OpenGL compatibility specifications for more information about the layout of these generated matrices.\n\nThe matrices generated by this extension use standard OpenGL fixed-function conventions. For example, the ***lookAt*** function generates a transform from world space into the specific eye space that the\nprojective matrix functions (***perspective***, ***ortho***, etc) are designed to expect. The OpenGL compatibility specifications define the particular layout of this eye space.\n\n&lt;glm/gtc/matrix\\_transform.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_10\"></a> 4.10. GLM\\_GTC\\_noise\n\nDefine 2D, 3D and 4D procedural noise functions.\n\n&lt;glm/gtc/noise.hpp&gt; need to be included to use these features.\n\n![](/doc/manual/noise-simplex1.jpg)\n\nFigure 4.10.1: glm::simplex(glm::vec2(x / 16.f, y / 16.f));\n\n![](/doc/manual/noise-simplex2.jpg)\n\nFigure 4.10.2: glm::simplex(glm::vec3(x / 16.f, y / 16.f, 0.5f));\n\n![](/doc/manual/noise-simplex3.jpg)\n\nFigure 4.10.3: glm::simplex(glm::vec4(x / 16.f, y / 16.f, 0.5f, 0.5f));\n\n![](/doc/manual/noise-perlin1.jpg)\n\nFigure 4.10.4: glm::perlin(glm::vec2(x / 16.f, y / 16.f));\n\n![](/doc/manual/noise-perlin2.jpg)\n\nFigure 4.10.5: glm::perlin(glm::vec3(x / 16.f, y / 16.f, 0.5f));\n\n![](/doc/manual/noise-perlin3.jpg)\n\nFigure 4.10.6: glm::perlin(glm::vec4(x / 16.f, y / 16.f, 0.5f, 0.5f)));\n\n![](/doc/manual/noise-perlin4.png)\n\nFigure 4.10.7: glm::perlin(glm::vec2(x / 16.f, y / 16.f), glm::vec2(2.0f));\n\n![](/doc/manual/noise-perlin5.png)\n\nFigure 4.10.8: glm::perlin(glm::vec3(x / 16.f, y / 16.f, 0.5f), glm::vec3(2.0f));\n\n![](/doc/manual/noise-perlin6.png)\n\nFigure 4.10.9: glm::perlin(glm::vec4(x / 16.f, y / 16.f, glm::vec2(0.5f)), glm::vec4(2.0f));\n\n### <a name=\"section4_11\"></a> 4.11. GLM\\_GTC\\_packing\n\nConvert scalar and vector types to and from packed formats, saving space at the cost of precision. However, packing a value into a format that it was previously unpacked from is guaranteed to be lossless.\n\n&lt;glm/gtc/packing.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_12\"></a> 4.12. GLM\\_GTC\\_quaternion\n\nQuaternions and operations upon thereof.\n\n&lt;glm/gtc/quaternion.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_13\"></a> 4.13. GLM\\_GTC\\_random\n\nProbability distributions in up to four dimensions.\n\n&lt;glm/gtc/random.hpp&gt; need to be included to use these features.\n\n![](/doc/manual/random-linearrand.png)\n\nFigure 4.13.1: glm::vec4(glm::linearRand(glm::vec2(-1), glm::vec2(1)), 0, 1);\n\n![](/doc/manual/random-circularrand.png)\n\nFigure 4.13.2: glm::vec4(glm::circularRand(1.0f), 0, 1);\n\n![](/doc/manual/random-sphericalrand.png)\n\nFigure 4.13.3: glm::vec4(glm::sphericalRand(1.0f), 1);\n\n![](/doc/manual/random-diskrand.png)\n\nFigure 4.13.4: glm::vec4(glm::diskRand(1.0f), 0, 1);\n\n![](/doc/manual/random-ballrand.png)\n\nFigure 4.13.5: glm::vec4(glm::ballRand(1.0f), 1);\n\n![](/doc/manual/random-gaussrand.png)\n\nFigure 4.13.6: glm::vec4(glm::gaussRand(glm::vec3(0), glm::vec3(1)), 1);\n\n### <a name=\"section4_14\"></a> 4.14. GLM\\_GTC\\_reciprocal\n\nReciprocal trigonometric functions (e.g. secant, cosecant, tangent).\n\n&lt;glm/gtc/reciprocal.hpp&gt; need to be included to use the features of this extension.\n\n### <a name=\"section4_15\"></a> 4.15. GLM\\_GTC\\_round\n\nVarious rounding operations and common special cases thereof.\n\n&lt;glm/gtc/round.hpp&gt; need to be included to use the features of this extension.\n\n### <a name=\"section4_16\"></a> 4.16. GLM\\_GTC\\_type\\_aligned\n\nAligned vector types.\n\n&lt;glm/gtc/type\\_aligned.hpp&gt; need to be included to use the features of this extension.\n\n### <a name=\"section4_17\"></a> 4.17. GLM\\_GTC\\_type\\_precision\n\nVector and matrix types with defined precisions, e.g. i8vec4, which is a 4D vector of signed 8-bit integers.\n\nThis extension adds defines to set the default precision of each class of types added, in a manner identical to that described in section [Default precision](#section3_1).\n\nAvailable defines for signed 8-bit integer types (glm::i8vec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_INT8: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_INT8: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_INT8: High precision (default)\n\nAvailable defines for unsigned 8-bit integer types (glm::u8vec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_UINT8: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_UINT8: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_UINT8: High precision (default)\n\nAvailable defines for signed 16-bit integer types (glm::i16vec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_INT16: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_INT16: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_INT16: High precision (default)\n\nAvailable defines for unsigned 16-bit integer types (glm::u16vec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_UINT16: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_UINT16: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_UINT16: High precision (default)\n\nAvailable defines for signed 32-bit integer types (glm::i32vec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_INT32: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_INT32: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_INT32: High precision (default)\n\nAvailable defines for unsigned 32-bit integer types (glm::u32vec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_UINT32: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_UINT32: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_UINT32: High precision (default)\n\nAvailable defines for signed 64-bit integer types (glm::i64vec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_INT64: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_INT64: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_INT64: High precision (default)\n\nAvailable defines for unsigned 64-bit integer types (glm::u64vec\\*):\n\n* GLM\\_PRECISION\\_LOWP\\_UINT64: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_UINT64: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_UINT64: High precision (default)\n\nAvailable defines for 32-bit floating-point types (glm::f32vec\\*, glm::f32mat\\*, glm::f32quat):\n\n* GLM\\_PRECISION\\_LOWP\\_FLOAT32: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_FLOAT32: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_FLOAT32: High precision (default)\n\nAvailable defines for 64-bit floating-point types (glm::f64vec\\*, glm::f64mat\\*, glm::f64quat):\n\n* GLM\\_PRECISION\\_LOWP\\_FLOAT64: Low precision\n* GLM\\_PRECISION\\_MEDIUMP\\_FLOAT64: Medium precision\n* GLM\\_PRECISION\\_HIGHP\\_FLOAT64: High precision (default)\n\n&lt;glm/gtc/type\\_precision.hpp&gt; need to be included to use the features of this extension.\n\n### <a name=\"section4_18\"></a> 4.18. GLM\\_GTC\\_type\\_ptr\n\nFacilitate interactions between pointers to basic types (e.g. float*) and GLM types (e.g. mat4).\n\nThis extension defines an overloaded function, glm::value_ptr, which returns a pointer to the memory layout of any GLM vector or matrix (vec3, mat4, etc.). Matrix types store their values in column-major order. This is useful for uploading data to matrices or for copying data to buffer objects.\n\n```cpp\n// GLM_GTC_type_ptr provides a safe solution:\n#include <glm/glm.hpp>\n#include <glm/gtc/type_ptr.hpp>\n\nvoid foo()\n{\n    glm::vec4 v(0.0f);\n    glm::mat4 m(1.0f);\n    ...\n    glVertex3fv(glm::value_ptr(v))\n    glLoadMatrixfv(glm::value_ptr(m));\n}\n\n// Another solution, this one inspired by the STL:\n#include <glm/glm.hpp>\n\nvoid foo()\n{\n    glm::vec4 v(0.0f);\n    glm::mat4 m(1.0f);\n    ...\n    glVertex3fv(&v[0]);\n    glLoadMatrixfv(&m[0][0]);\n}\n```\n\n*Note: It would be possible to implement [*glVertex3fv*](http://www.opengl.org/sdk/docs/man2/xhtml/glVertex.xml)(glm::vec3(0)) in C++ with the appropriate cast operator that would result as an\nimplicit cast in this example. However cast operators may produce programs running with unexpected behaviours without build error or any form of notification. *\n\n&lt;glm/gtc/type\\_ptr.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_19\"></a> 4.19. GLM\\_GTC\\_ulp\n\nMeasure a function's accuracy given a reference implementation of it. This extension works on floating-point data and provides results in [ULP](http://ljk.imag.fr/membres/Carine.Lucas/TPScilab/JMMuller/ulp-toms.pdf).\n\n&lt;glm/gtc/ulp.hpp&gt; need to be included to use these features.\n\n### <a name=\"section4_20\"></a> 4.20. GLM\\_GTC\\_vec1\n\nAdd \\*vec1 types.\n\n&lt;glm/gtc/vec1.hpp&gt; need to be included to use these features.\n\n---\n## <a name=\"section5\"></a> 5. OpenGL interoperability\n\n### <a name=\"section5_1\"></a> 5.1. GLM replacements for deprecated OpenGL functions\n\nOpenGL 3.1 specification has deprecated some features that have been removed from OpenGL 3.2 core profile specification. GLM provides some replacement functions.\n\n[***glRotate{f, d}:***](https://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml)\n\n```cpp\nglm::mat4 glm::rotate(glm::mat4 const& m, float angle, glm::vec3 const& axis);\nglm::dmat4 glm::rotate(glm::dmat4 const& m, double angle, glm::dvec3 const& axis);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***glScale{f, d}:***](http://www.opengl.org/sdk/docs/man2/xhtml/glScale.xml)\n\n```cpp\nglm::mat4 glm::scale(glm::mat4 const& m, glm::vec3 const& factors);\nglm::dmat4 glm::scale(glm::dmat4 const& m, glm::dvec3 const& factors);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***glTranslate{f, d}:***](https://www.opengl.org/sdk/docs/man2/xhtml/glTranslate.xml)\n\n```cpp\nglm::mat4 glm::translate(glm::mat4 const& m, glm::vec3 const& translation);\nglm::dmat4 glm::translate(glm::dmat4 const& m, glm::dvec3 const& translation);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***glLoadIdentity:***](https://www.opengl.org/sdk/docs/man2/xhtml/glLoadIdentity.xml)\n\n```cpp\nglm::mat4(1.0) or glm::mat4();\nglm::dmat4(1.0) or glm::dmat4();\n```\n\nFrom GLM core library: &lt;glm/glm.hpp&gt;\n\n[***glMultMatrix{f, d}:***](https://www.opengl.org/sdk/docs/man2/xhtml/glMultMatrix.xml)\n\n```cpp\nglm::mat4() * glm::mat4();\nglm::dmat4() * glm::dmat4();\n```\n\nFrom GLM core library: &lt;glm/glm.hpp&gt;\n\n[***glLoadTransposeMatrix{f, d}:***](https://www.opengl.org/sdk/docs/man2/xhtml/glLoadTransposeMatrix.xml)\n\n```cpp\nglm::transpose(glm::mat4());\nglm::transpose(glm::dmat4());\n```\n\nFrom GLM core library: &lt;glm/glm.hpp&gt;\n\n[***glMultTransposeMatrix{f, d}:***](https://www.opengl.org/sdk/docs/man2/xhtml/glMultTransposeMatrix.xml)\n\n```cpp\nglm::mat4() * glm::transpose(glm::mat4());\nglm::dmat4() * glm::transpose(glm::dmat4());\n```\n\nFrom GLM core library: &lt;glm/glm.hpp&gt;\n\n[***glFrustum:***](http://www.opengl.org/sdk/docs/man2/xhtml/glFrustum.xml)\n\n```cpp\nglm::mat4 glm::frustum(float left, float right, float bottom, float top, float zNear, float zFar);\nglm::dmat4 glm::frustum(double left, double right, double bottom, double top, double zNear, double zFar);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***glOrtho:***](https://www.opengl.org/sdk/docs/man2/xhtml/glOrtho.xml)\n\n```cpp\nglm::mat4 glm::ortho(float left, float right, float bottom, float top, float zNear, float zFar);\nglm::dmat4 glm::ortho(double left, double right, double bottom, double top, double zNear, double zFar);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n### <a name=\"section5_2\"></a> 5.2. GLM replacements for GLU functions\n\n[***gluLookAt:***](https://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml)\n\n```cpp\nglm::mat4 glm::lookAt(glm::vec3 const& eye, glm::vec3 const& center, glm::vec3 const& up);\nglm::dmat4 glm::lookAt(glm::dvec3 const& eye, glm::dvec3 const& center, glm::dvec3 const& up);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***gluOrtho2D:***](https://www.opengl.org/sdk/docs/man2/xhtml/gluOrtho2D.xml)\n\n```cpp\nglm::mat4 glm::ortho(float left, float right, float bottom, float top);\nglm::dmat4 glm::ortho(double left, double right, double bottom, double top);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***gluPerspective:***](https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml)\n\n```cpp\nglm::mat4 perspective(float fovy, float aspect, float zNear, float zFar);\nglm::dmat4 perspective(double fovy, double aspect, double zNear, double zFar);\n```\n\nNote that in GLM, fovy is expressed in radians, not degrees.\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***gluPickMatrix:***](https://www.opengl.org/sdk/docs/man2/xhtml/gluPickMatrix.xml)\n\n```cpp\nglm::mat4 pickMatrix(glm::vec2 const& center, glm::vec2 const& delta, glm::ivec4 const& viewport);\nglm::dmat4 pickMatrix(glm::dvec2 const& center, glm::dvec2 const& delta, glm::ivec4 const& viewport);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***gluProject:***](http://www.opengl.org/sdk/docs/man2/xhtml/gluProject.xml)\n\n```cpp\nglm::vec3 project(glm::vec3 const& obj, glm::mat4 const& model, glm::mat4 const& proj, glm::ivec4 const& viewport);\nglm::dvec3 project(glm::dvec3 const& obj, glm::dmat4 const& model, glm::dmat4 const& proj, glm::ivec4 const& viewport);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n[***gluUnProject:***](https://www.opengl.org/sdk/docs/man2/xhtml/gluUnProject.xml)\n\n```cpp\nglm::vec3 unProject(glm::vec3 const& win, glm::mat4 const& model, glm::mat4 const& proj, glm::ivec4 const& viewport);\nglm::dvec3 unProject(glm::dvec3 const& win, glm::dmat4 const& model, glm::dmat4 const& proj, glm::ivec4 const& viewport);\n```\n\nFrom GLM\\_GTC\\_matrix\\_transform extension: &lt;glm/gtc/matrix\\_transform.hpp&gt;\n\n---\n## <a name=\"section6\"></a> 6. Known issues\n\nThis section reports GLSL features that GLM can't accurately emulate due to language restrictions.\n\n### <a name=\"section6_1\"></a> 6.1. not function\n\nThe GLSL function 'not' is a keyword in C++. To prevent name collisions and ensure a consistent API, the name not\\_ (note the underscore) is used instead.\n\n### <a name=\"section6_2\"></a> 6.2. Precision qualifiers support\n\nGLM supports GLSL precision qualifiers through prefixes instead of qualifiers. For example, GLM exposes \\verb|lowp_vec4|, \\verb|mediump_vec4| and \\verb|highp_vec4| as variations of \\verb|vec4|.\n\nSimilarly to GLSL, GLM precision qualifiers are used to trade precision of operations in term of [ULPs](http://en.wikipedia.org/wiki/Unit_in_the_last_place) for better performance. By default, all the types use high precision.\n\n```cpp\n// Using precision qualifier in GLSL:\n\nivec3 foo(in vec4 v)\n{\n    highp vec4 a = v;\n    mediump vec4 b = a;\n    lowp ivec3 c = ivec3(b);\n    return c;\n}\n\n// Using precision qualifier in GLM:\n\n#include <glm/glm.hpp>\n\nivec3 foo(const vec4 & v)\n{\n    highp_vec4 a = v;\n    medium_vec4 b = a;\n    lowp_ivec3 c = glm::ivec3(b);\n    return c;\n}\n```\n\nThe syntax for default precision specifications in GLM differs from that in GLSL; for more information, see section Default Precision <a name=\"section3_1\"></a>.\n\n---\n## <a name=\"section7\"></a> 7. FAQ\n\n### <a name=\"section7_1\"></a> 7.1 Why GLM follows GLSL specification and conventions?\n\nFollowing GLSL conventions is a really strict policy of GLM. It has been designed following the idea that everyone does its own math library with his own conventions. The idea is that brilliant developers (the OpenGL ARB) worked together and agreed to make GLSL. Following GLSL conventions\nis a way to find consensus. Moreover, basically when a developer knows GLSL, he knows GLM.\n\n### <a name=\"section7_2\"></a> 7.2. Does GLM run GLSL program?\n\nNo, GLM is a C++ implementation of a subset of GLSL.\n\n### <a name=\"section7_3\"></a> 7.3. Does a GLSL compiler build GLM codes?\n\nNo, this is not what GLM attends to do.\n\n### <a name=\"section7_4\"></a> 7.4. Should I use ‘GTX’ extensions?\n\nGTX extensions are qualified to be experimental extensions. In GLM this means that these extensions might change from version to version without any restriction. In practice, it doesn’t really change except time to\ntime. GTC extensions are stabled, tested and perfectly reliable in time. Many GTX extensions extend GTC extensions and provide a way to explore features and implementations and APIs and then are promoted to GTC\nextensions. This is fairly the way OpenGL features are developed; through extensions.\n\nStating with GLM 0.9.9, to use experimental extensions, an application must define GLM_ENABLE_EXPERIMENTAL.\n\n### <a name=\"section7_5\"></a> 7.5. Where can I ask my questions?\n\nA good place is [stackoverflow](http://stackoverflow.com/search?q=GLM) using the GLM tag.\n\n### <a name=\"section7_6\"></a> 7.6. Where can I find the documentation of extensions?\n\nThe Doxygen generated documentation includes a complete list of all extensions available. Explore this [*API documentation*](http://glm.g-truc.net/html/index.html) to get a complete\nview of all GLM capabilities!\n\n### <a name=\"section7_7\"></a> 7.7. Should I use ‘using namespace glm;’?\n\nNO! Chances are that if using namespace glm; is called, especially in a header file, name collisions will happen as GLM is based on GLSL which uses common tokens for types and functions. Avoiding using namespace\nglm; will a higher compatibility with third party library and SDKs.\n\n### <a name=\"section7_8\"></a> 7.8. Is GLM fast?\n\nGLM is mainly designed to be convenient and that's why it is written against the GLSL specification.\n\nFollowing the Pareto principle where 20% of the code consumes 80% of the execution time, GLM operates perfectly on the 80% of the code that consumes 20% of the performances. Furthermore, thanks to the lowp,\nmediump and highp qualifiers, GLM provides approximations which trade precision for performance. Finally, GLM can automatically produce SIMD optimized code for functions of its implementation.\n\nHowever, on performance critical code paths, we should expect that dedicated algorithms should be written to reach peak performance.\n\n### <a name=\"section7_9\"></a> 7.9. When I build with Visual C++ with /W4 warning level, I have warnings...\n\nYou should not have any warnings even in /W4 mode. However, if you expect such level for your code, then you should ask for the same level to the compiler by at least disabling the Visual C++ language extensions\n(/Za) which generates warnings when used. If these extensions are enabled, then GLM will take advantage of them and the compiler will generate warnings.\n\n### <a name=\"section7_10\"></a> 7.10. Why some GLM functions can crash because of division by zero?\n\nGLM functions crashing is the result of a domain error. Such behavior follows the precedent set by C and C++'s standard library. For example, it’s a domain error to pass a null vector (all zeroes) to glm::normalize function, or to pass a negative number into std::sqrt.\n\n### <a name=\"section7_11\"></a> 7.11. What unit for angles is used in GLM?\n\nGLSL is using radians but GLU is using degrees to express angles. This has caused GLM to use inconsistent units for angles. Starting with GLM 0.9.6, all GLM functions are using radians. For more information, follow\nthe [link](http://www.g-truc.net/post-0693.html#menu).\n\n### <a name=\"section7_12\"></a> 7.12. Windows headers cause build errors...\n\nSome Windows headers define min and max as macros which may cause compatibility with third party libraries such as GLM.\nIt is highly recommended to [define NOMINMAX](http://stackoverflow.com/questions/4913922/possible-problems-with-nominmax-on-visual-c) before including Windows headers to workaround this issue.\nTo workaround the incompatibility with these macros, GLM will systematically undef these macros if they are defined.\n\n### <a name=\"section7_13\"></a> 7.13. Constant expressions support\n\nGLM has some C++ <a href=\"http://en.cppreference.com/w/cpp/language/constexpr\">constant expressions</a> support. However, GLM automatically detects the use of SIMD instruction sets through compiler arguments to populate its implementation with SIMD intrinsics.\nUnfortunately, GCC and Clang doesn't support SIMD instrinsics as constant expressions. To allow constant expressions on all vectors and matrices types, define GLM\\_FORCE\\_PURE before including GLM headers.\n\n---\n## <a name=\"section8\"></a> 8. Code samples\n\nThis series of samples only shows various GLM features without consideration of any sort.\n\n### <a name=\"section8_1\"></a> 8.1. Compute a triangle normal\n\n```cpp\n#include <glm/glm.hpp> // vec3 normalize cross\n\nglm::vec3 computeNormal(glm::vec3 const& a, glm::vec3 const& b, glm::vec3 const& c)\n{\n    return glm::normalize(glm::cross(c - a, b - a));\n}\n\n// A much faster but less accurate alternative:\n#include <glm/glm.hpp> // vec3 cross\n#include <glm/gtx/fast_square_root.hpp> // fastNormalize\n\nglm::vec3 computeNormal(glm::vec3 const& a, glm::vec3 const& b, glm::vec3 const& c)\n{\n    return glm::fastNormalize(glm::cross(c - a, b - a));\n}\n```\n\n### <a name=\"section8_2\"></a> 8.2. Matrix transform\n\n```cpp\n#include <glm/glm.hpp> // vec3, vec4, ivec4, mat4\n#include <glm/gtc/matrix_transform.hpp> // translate, rotate, scale, perspective\n#include <glm/gtc/type_ptr.hpp> // value_ptr\n\nvoid setUniformMVP(GLuint Location, glm::vec3 const& Translate, glm::vec3 const& Rotate)\n{\n    glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);\n    glm::mat4 ViewTranslate = glm::translate(\n        glm::mat4(1.0f), Translate);\n    glm::mat4 ViewRotateX = glm::rotate(\n        ViewTranslate, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f));\n    glm::mat4 View = glm::rotate(ViewRotateX,\n        Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f));\n    glm::mat4 Model = glm::scale(\n        glm::mat4(1.0f), glm::vec3(0.5f));\n    glm::mat4 MVP = Projection * View * Model;\n    glUniformMatrix4fv(Location, 1, GL_FALSE, glm::value_ptr(MVP));\n}\n```\n\n### <a name=\"section8_3\"></a> 8.3. Vector types\n\n```cpp\n#include <glm/glm.hpp> // vec2\n#include <glm/gtc/type_precision.hpp> // hvec2, i8vec2, i32vec2\n\nstd::size_t const VertexCount = 4;\n\n// Float quad geometry\nstd::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2);\nglm::vec2 const PositionDataF32[VertexCount] =\n{\n    glm::vec2(-1.0f,-1.0f),\n    glm::vec2( 1.0f,-1.0f),\n    glm::vec2( 1.0f, 1.0f),\n    glm::vec2(-1.0f, 1.0f)\n};\n\n// Half-float quad geometry\nstd::size_t const PositionSizeF16 = VertexCount * sizeof(glm::hvec2);\nglm::hvec2 const PositionDataF16[VertexCount] =\n{\n    glm::hvec2(-1.0f, -1.0f),\n    glm::hvec2( 1.0f, -1.0f),\n    glm::hvec2( 1.0f, 1.0f),\n    glm::hvec2(-1.0f, 1.0f)\n};\n\n// 8 bits signed integer quad geometry\nstd::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2);\nglm::i8vec2 const PositionDataI8[VertexCount] =\n{\n    glm::i8vec2(-1,-1),\n    glm::i8vec2( 1,-1),\n    glm::i8vec2( 1, 1),\n    glm::i8vec2(-1, 1)\n};\n\n// 32 bits signed integer quad geometry\nstd::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2);\nglm::i32vec2 const PositionDataI32[VertexCount] =\n{\n    glm::i32vec2(-1,-1),\n    glm::i32vec2( 1,-1),\n    glm::i32vec2( 1, 1),\n    glm::i32vec2(-1, 1)\n};\n```\n\n### <a name=\"section8_4\"></a> 8.4. Lighting\n\n```cpp\n#include <glm/glm.hpp> // vec3 normalize reflect dot pow\n#include <glm/gtc/random.hpp> // ballRand\n\n// vecRand3, generate a random and equiprobable normalized vec3\nglm::vec3 lighting(intersection const& Intersection, material const& Material, light const& Light, glm::vec3 const& View)\n{\n    glm::vec3 Color = glm::vec3(0.0f);\n    glm::vec3 LightVertor = glm::normalize(\n        Light.position() - Intersection.globalPosition() +\n        glm::ballRand(0.0f, Light.inaccuracy());\n\n    if(!shadow(Intersection.globalPosition(), Light.position(), LightVertor))\n    {\n        float Diffuse = glm::dot(Intersection.normal(), LightVector);\n        if(Diffuse &lt;= 0.0f)\n            return Color;\n\n        if(Material.isDiffuse())\n            Color += Light.color() * Material.diffuse() * Diffuse;\n\n        if(Material.isSpecular())\n        {\n            glm::vec3 Reflect = glm::reflect(-LightVector, Intersection.normal());\n            float Dot = glm::dot(Reflect, View);\n            float Base = Dot &gt; 0.0f ? Dot : 0.0f;\n            float Specular = glm::pow(Base, Material.exponent());\n            Color += Material.specular() \\* Specular;\n        }\n    }\n\n    return Color;\n}\n```\n\n---\n## <a name=\"section9\"></a> 9. References\n\n### <a name=\"section9_1\"></a> 9.1. OpenGL specifications\n\n* OpenGL 4.3 core specification\n* [GLSL 4.30 specification](http://www.opengl.org/registry/doc/GLSLangSpec.4.30.7.diff.pdf)\n![](media/image21.png){width=\"2.859722222222222in\" height=\"1.6083333333333334in\"}- [*GLU 1.3 specification*](http://www.opengl.org/documentation/specs/glu/glu1_3.pdf)\n\n### <a name=\"section9_2\"></a> 9.2. External links\n\n* [GLM on stackoverflow](http://stackoverflow.com/search?q=GLM)\n\n### <a name=\"section9_3\"></a> 9.3. Projects using GLM\n\n***[Leo’s Fortune](http://www.leosfortune.com/)***\n\nLeo’s Fortune is a platform adventure game where you hunt down the cunning and mysterious thief that stole your gold. Available on PS4, Xbox One, PC, Mac, iOS and Android.\n\nBeautifully hand-crafted levels bring the story of Leo to life in this epic adventure.\n\n“I just returned home to find all my gold has been stolen! For some devious purpose, the thief has dropped pieces of my gold like breadcrumbs through the woods.”\n\n“Despite this pickle of a trap, I am left with no choice but to follow the trail.”\n\n“Whatever lies ahead, I must recover my fortune.” -Leopold\n\n![](/doc/manual/references-leosfortune.jpeg)\n\n![](/doc/manual/references-leosfortune2.jpg)\n\n[***OpenGL 4.0 Shading Language Cookbook***](http://www.packtpub.com/opengl-4-0-shading-language-cookbook/book?tag=rk/opengl4-abr1/0811)\n\nA set of recipes that demonstrates a wide of techniques for producing high-quality, real-time 3D graphics with GLSL 4.0, such as:\n\n* Using GLSL 4.0 to implement lighting and shading techniques.\n* Using the new features of GLSL 4.0 including tessellation and geometry shaders.\n* Using textures in GLSL as part of a wide variety of techniques from basic texture mapping to deferred shading.\n\nSimple, easy-to-follow examples with GLSL source code are provided, as well as a basic description of the theory behind each technique.\n\n![](/doc/manual/references-glsl4book.jpg)\n\n[***Outerra***](http://outerra.com/)\n\nA 3D planetary engine for seamless planet rendering from space down to the surface. Can use arbitrary resolution of elevation data, refining it to centimetre resolution using fractal algorithms.\n\n![](/doc/manual/references-outerra1.jpg)\n\n![](/doc/manual/references-outerra2.jpg)\n\n![](/doc/manual/references-outerra3.jpg)\n\n![](/doc/manual/references-outerra4.jpg)\n\n[***Falcor***](https://github.com/NVIDIA/Falcor)\n\nReal-time rendering research framework by NVIDIA.\n\n[***Cinder***](https://libcinder.org/)\n\nCinder is a free and open source library for professional-quality creative coding in C++.\n\nCinder is a C++ library for programming with aesthetic intent - the sort of development often called creative coding. This includes domains like graphics, audio, video, and computational geometry. Cinder is cross-platform, with official support for OS X, Windows, iOS, and WinRT.\n\nCinder is production-proven, powerful enough to be the primary tool for professionals, but still suitable for learning and experimentation. Cinder is released under the [2-Clause BSD License](http://opensource.org/licenses/BSD-2-Clause).\n\n![](/doc/manual/references-cinder.png)\n\n[***opencloth***](http://code.google.com/p/opencloth/)\n\nA collection of source codes implementing cloth simulation algorithms in OpenGL.\n\nSimple, easy-to-follow examples with GLSL source code, as well as a basic description of the theory behind each technique.\n\n![](/doc/manual/references-opencloth1.png)\n\n![](/doc/manual/references-opencloth3.png)\n\n[***LibreOffice***](https://www.libreoffice.org/)\n\nLibreOffice includes several applications that make it the most powerful Free and Open Source office suite on the market.\n\n[***Are you using GLM in a project?***](mailto:glm@g-truc.net)\n\n### <a name=\"section9_4\"></a> 9.4. Tutorials using GLM\n\n* [Sascha Willems' Vulkan examples](https://github.com/SaschaWillems/Vulkan), Examples and demos for the new Vulkan API\n* [VKTS](https://github.com/McNopper/Vulkan) Vulkan examples using VulKan ToolS (VKTS)\n* [*The OpenGL Samples Pack*](http://www.g-truc.net/project-0026.html#menu), samples that show how to set up all the different new features\n* [*Learning Modern 3D Graphics programming*](http://www.arcsynthesis.org/gltut/), a great OpenGL tutorial using GLM by Jason L. McKesson\n* [*Morten Nobel-Jørgensen’s*](http://blog.nobel-joergensen.com/2011/04/02/glm-brilliant-math-library-for-opengl/) review and use an [*OpenGL renderer*](https://github.com/mortennobel/RenderE)\n* [*Swiftless’ OpenGL tutorial*](http://www.swiftless.com/opengltuts.html) using GLM by Donald Urquhart\n* [*Rastergrid*](http://rastergrid.com/blog/), many technical articles with companion programs using GLM by Daniel Rákos\\\n* [*OpenGL Tutorial*](http://www.opengl-tutorial.org), tutorials for OpenGL 3.1 and later\n* [*OpenGL Programming on Wikibooks*](http://en.wikibooks.org/wiki/OpenGL_Programming): For beginners who are discovering OpenGL.\n* [*3D Game Engine Programming*](http://3dgep.com/): Learning the latest 3D Game Engine Programming techniques.\n* [Game Tutorials](http://www.gametutorials.com/opengl-4-matrices-and-glm/), graphics and game programming.\n* [open.gl](https://open.gl/), OpenGL tutorial\n* [c-jump](http://www.c-jump.com/bcc/common/Talk3/Math/GLM/GLM.html), GLM tutorial\n* [Learn OpenGL](http://learnopengl.com/), OpenGL tutorial\n* [***Are you using GLM in a tutorial?***](mailto:glm@g-truc.net)\n\n### <a name=\"section9_5\"></a> 9.5. Equivalent for other languages\n\n* [*cglm*](https://github.com/recp/cglm): OpenGL Mathematics (glm) for C.\n* [*GlmSharp*](https://github.com/Philip-Trettner/GlmSharp): Open-source semi-generated GLM-flavored math library for .NET/C\\#.\n* [glm-js](https://github.com/humbletim/glm-js): JavaScript adaptation of the OpenGL Mathematics (GLM) C++ library interfaces\n* [Java OpenGL Mathematics (GLM)](https://github.com/java-graphics/glm)\n* [JGLM](https://github.com/jroyalty/jglm) - Java OpenGL Mathematics Library\n* [SwiftGL Math Library](https://github.com/SwiftGL/Math/blob/master/Sources/glm.swift) GLM for Swift\n* [glm-go](https://github.com/jbowtie/glm-go): Simple linear algebra library similar in spirit to GLM\n* [openll](https://github.com/Polkm/openll): Lua bindings for OpenGL, GLM, GLFW, OpenAL, SOIL and PhysicsFS\n* [glm-rs](https://github.com/dche/glm-rs): GLSL mathematics for Rust programming language\n* [glmpython](https://github.com/Queatz/glmpython): GLM math library for Python\n\n### <a name=\"section9_6\"></a> 9.6. Alternatives to GLM\n\n* [*CML*](http://cmldev.net/): The CML (Configurable Math Library) is a free C++ math library for games and graphics.\n* [*Eigen*](http://eigen.tuxfamily.org/): A more heavy weight math library for general linear algebra in C++.\n* [*glhlib*](http://glhlib.sourceforge.net/): A much more than glu C library.\n* Are you using or developing an alternative library to GLM?\n\n### <a name=\"section9_7\"></a> 9.7. Acknowledgements\n\nGLM is developed and maintained by [*Christophe Riccio*](http://www.g-truc.net) but many contributors have made this project what it is.\n\nSpecial thanks to:\n* Ashima Arts and Stefan Gustavson for their work on [*webgl-noise*](https://github.com/ashima/webgl-noise) which has been used for GLM noises implementation.\n* [*Arthur Winters*](http://athile.net/library/wiki/index.php?title=Athile_Technologies) for the C++11 and Visual C++ swizzle operators implementation and tests.\n* Joshua Smith and Christoph Schied for the discussions and the experiments around the swizzle operators implementation issues.\n* Guillaume Chevallereau for providing and maintaining the [*nightlight build system*](http://my.cdash.org/index.php?project=GLM).\n* Ghenadii Ursachi for GLM\\_GTX\\_matrix\\_interpolation implementation.\n* Mathieu Roumillac for providing some implementation ideas.\n* [*Grant James*](http://www.zeuscmd.com/) for the implementation of all combination of none-squared matrix products.\n* Jesse Talavera-Greenberg for his work on the manual amount other things.\n* All the GLM users that have report bugs and hence help GLM to become a great library!\n"
  },
  {
    "path": "external/glm/readme.md",
    "content": "![glm](/doc/manual/logo-mini.png)\n\n[OpenGL Mathematics](http://glm.g-truc.net/) (*GLM*) is a header only C++ mathematics library for graphics software based on the [OpenGL Shading Language (GLSL) specifications](https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf).\n\n*GLM* provides classes and functions designed and implemented with the same naming conventions and functionality than *GLSL* so that anyone who knows *GLSL*, can use *GLM* as well in C++.\n\nThis project isn't limited to *GLSL* features. An extension system, based on the *GLSL* extension conventions, provides extended capabilities: matrix transformations, quaternions, data packing, random numbers, noise, etc...\n\nThis library works perfectly with *[OpenGL](https://www.opengl.org)* but it also ensures interoperability with other third party libraries and SDK. It is a good candidate for software rendering (raytracing / rasterisation), image processing, physic simulations and any development context that requires a simple and convenient mathematics library.\n\n*GLM* is written in C++98 but can take advantage of C++11 when supported by the compiler. It is a platform independent library with no dependence and it officially supports the following compilers:\n- [Apple Clang 6.0](https://developer.apple.com/library/mac/documentation/CompilerTools/Conceptual/LLVMCompilerOverview/index.html) and higher\n- [GCC](http://gcc.gnu.org/) 4.7 and higher\n- [Intel C++ Composer](https://software.intel.com/en-us/intel-compilers) XE 2013 and higher\n- [LLVM](http://llvm.org/) 3.4 and higher\n- [Visual C++](http://www.visualstudio.com/) 2013 and higher\n- [CUDA](https://developer.nvidia.com/about-cuda) 7.0 and higher (experimental)\n- Any C++11 compiler\n\nFor more information about *GLM*, please have a look at the [manual](manual.md) and the [API reference documentation](http://glm.g-truc.net/0.9.8/api/index.html).\nThe source code and the documentation are licensed under both the [Happy Bunny License (Modified MIT) or the MIT License](manual.md#section0).\n\nThanks for contributing to the project by [submitting issues](https://github.com/g-truc/glm/issues) for bug reports and feature requests. Any feedback is welcome at [glm@g-truc.net](mailto://glm@g-truc.net).\n\n```cpp\n#include <glm/vec3.hpp> // glm::vec3\n#include <glm/vec4.hpp> // glm::vec4\n#include <glm/mat4x4.hpp> // glm::mat4\n#include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective\n#include <glm/gtc/constants.hpp> // glm::pi\n\nglm::mat4 camera(float Translate, glm::vec2 const& Rotate)\n{\n\tglm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, 0.1f, 100.f);\n\tglm::mat4 View = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate));\n\tView = glm::rotate(View, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f));\n\tView = glm::rotate(View, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f));\n\tglm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));\n\treturn Projection * View * Model;\n}\n```\n\n## [Lastest release](https://github.com/g-truc/glm/releases/latest)\n\n## Project Health\n\n| Service | System | Compiler | Status |\n| ------- | ------ | -------- | ------ |\n| [Travis CI](https://travis-ci.org/g-truc/glm)| MacOSX, Linux 64 bits | Clang 3.4, Clang 3.6, Clang 4.0, GCC 4.9, GCC 7.0 | [![Travis CI](https://travis-ci.org/g-truc/glm.svg?branch=master)](https://travis-ci.org/g-truc/glm)\n| [AppVeyor](https://ci.appveyor.com/project/Groovounet/glm)| Windows 32 and 64 | Visual Studio 2013, Visual Studio 2015, Visual Studio 2017 | [![AppVeyor](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/Groovounet/glm)\n\n## Release notes\n\n### [GLM 0.9.9.0](https://github.com/g-truc/glm/releases/latest) - 2017-XX-XX\n#### Features:\n- Added RGBM encoding in GTC_packing #420\n- Added GTX_color_encoding extension\n- Added GTX_vec_swizzle, faster compile time swizzling then swizzle operator #558\n- Added GTX_exterior_product with a vec2 cross implementation #621\n- Added GTX_matrix_factorisation to factor matrices in various forms #654\n- Added [GLM_ENABLE_EXPERIMENTAL](manual.md#section7_4) to enable experimental features.\n- Added packing functions for integer vectors #639\n- Added conan packaging configuration #643 #641\n- Added quatLookAt to GTX_quaternion #659\n- Added fmin, fmax and fclamp to GTX_extended_min_max #372\n- Added EXT_vector_relational: extend equal and notEqual to take an epsilon argument\n- Added EXT_vector_relational: openBounded and closeBounded\n- Added EXT_vec1: *vec1 types\n- Added GTX_texture: levels function\n- Added spearate functions to use both nagative one and zero near clip plans #680\n- Added GLM_FORCE_SINGLE_ONLY to use GLM on platforms that don't support double #627\n\n#### Improvements:\n- No more default initialization of vector, matrix and quaternion types\n- Added lowp variant of GTC_color_space convertLinearToSRGB #419\n- Replaced the manual by a markdown version #458\n- Improved API documentation #668\n- Optimized GTC_packing implementation\n- Optimized GTC_noise functions\n- Optimized GTC_color_space HSV to RGB conversions\n- Optimised GTX_color_space_YCoCg YCoCgR conversions\n- Optimized GTX_matrix_interpolation axisAngle function\n- Added FAQ 12: Windows headers cause build errors... #557\n- Removed GCC shadow warnings #595\n- Added error for including of different versions of GLM #619\n- Added GLM_FORCE_IGNORE_VERSION to ignore error caused by including different version of GLM #619\n- Reduced warnings when using very strict compilation flags #646\n- length() member functions are constexpr #657\n- Added support of -Weverything with Clang #646\n- Improved exponential funtion test coverage\n- Enabled warnings as error with Clang unit tests\n\n#### Fixes:\n- Removed doxygen references to GTC_half_float which was removed in 0.9.4\n- Fixed glm::decompose #448\n- Fixed intersectRayTriangle #6\n- Fixed dual quaternion != operator #629\n- Fixed usused variable warning in GTX_spline #618\n- Fixed references to GLM_FORCE_RADIANS which was removed #642\n- Fixed glm::fastInverseSqrt to use fast inverse square #640\n- Fixed axisAngle NaN #638\n- Fixed integer pow from GTX_integer with null exponent #658\n- Fixed quat normalize build error #656\n- Fixed Visual C++ 2017.2 warning regarding __has_feature definision #655\n- Fixed documentation warnings\n- Fixed GLM_HAS_OPENMP when OpenMP is not enabled\n- Fixed Better follow GLSL min and max specification #372\n- Fixed quaternion constructor from two vectors special cases #469\n- Fixed glm::to_string on quaternions wrong components order #681\n\n#### Deprecation:\n- Requires Visual Studio 2013, GCC 4.7, Clang 3.4, Cuda 7, ICC 2013 or a C++11 compiler\n- Removed GLM_GTX_simd_vec4 extension\n- Removed GLM_GTX_simd_mat4 extension\n- Removed GLM_GTX_simd_quat extension\n- Removed GLM_SWIZZLE, use GLM_FORCE_SWIZZLE instead\n- Removed GLM_MESSAGES, use GLM_FORCE_MESSAGES instead\n- Removed GLM_DEPTH_ZERO_TO_ONE, use GLM_FORCE_DEPTH_ZERO_TO_ONE instead\n- Removed GLM_LEFT_HANDED, use GLM_FORCE_LEFT_HANDED instead\n- Removed GLM_FORCE_NO_CTOR_INIT\n- Removed glm::uninitialize\n\n---\n### [GLM 0.9.8.5](https://github.com/g-truc/glm/releases/tag/0.9.8.5) - 2017-08-16\n#### Features:\n- Added Conan package support #647\n\n#### Fixes:\n- Fixed Clang version detection from source #608\n- Fixed packF3x9_E1x5 exponent packing #614\n- Fixed build error min and max specializations with integer #616\n- Fixed simd_mat4 build error #652\n\n---\n### [GLM 0.9.8.4](https://github.com/g-truc/glm/releases/tag/0.9.8.4) - 2017-01-22\n#### Fixes:\n- Fixed GTC_packing test failing on GCC x86 due to denorms #212 #577\n- Fixed POPCNT optimization build in Clang #512\n- Fixed intersectRayPlane returns true in parallel case #578\n- Fixed GCC 6.2 compiler warnings #580\n- Fixed GTX_matrix_decompose decompose #582 #448\n- Fixed GCC 4.5 and older build #566\n- Fixed Visual C++ internal error when declaring a global vec type with siwzzle expression enabled #594\n- Fixed GLM_FORCE_CXX11 with Clang and libstlc++ which wasn't using C++11 STL features. #604\n\n---\n### [GLM 0.9.8.3](https://github.com/g-truc/glm/releases/tag/0.9.8.3) - 2016-11-12\n#### Improvements:\n- Broader support of GLM_FORCE_UNRESTRICTED_GENTYPE #378\n\n#### Fixes:\n- Fixed Android build error with C++11 compiler but C++98 STL #284 #564\n- Fixed GTX_transform2 shear* functions #403\n- Fixed interaction between GLM_FORCE_UNRESTRICTED_GENTYPE and ortho function #568\n- Fixed bitCount with AVX on 32 bit builds #567\n- Fixed CMake find_package with version specification #572 #573\n\n---\n### [GLM 0.9.8.2](https://github.com/g-truc/glm/releases/tag/0.9.8.2) - 2016-11-01\n#### Improvements:\n- Added Visual C++ 15 detection\n- Added Clang 4.0 detection\n- Added warning messages when using GLM_FORCE_CXX** but the compiler\n  is known to not fully support the requested C++ version #555\n- Refactored GLM_COMPILER_VC values\n- Made quat, vec, mat type component length() static #565\n\n#### Fixes:\n- Fixed Visual C++ constexpr build error #555, #556\n\n---\n### [GLM 0.9.8.1](https://github.com/g-truc/glm/releases/tag/0.9.8.1) - 2016-09-25\n#### Improvements:\n- Optimized quaternion log function #554\n\n#### Fixes:\n- Fixed GCC warning filtering, replaced -pedantic by -Wpedantic\n- Fixed SIMD faceforward bug. #549\n- Fixed GCC 4.8 with C++11 compilation option #550\n- Fixed Visual Studio aligned type W4 warning #548\n- Fixed packing/unpacking function fixed for 5_6_5 and 5_5_5_1 #552\n\n---\n### [GLM 0.9.8.0](https://github.com/g-truc/glm/releases/tag/0.9.8.0) - 2016-09-11\n#### Features:\n- Added right and left handed projection and clip control support #447 #415 #119\n- Added compNormalize and compScale functions to GTX_component_wise\n- Added packF3x9_E1x5 and unpackF3x9_E1x5 to GTC_packing for RGB9E5 #416\n- Added (un)packHalf to GTC_packing\n- Added (un)packUnorm and (un)packSnorm to GTC_packing\n- Added 16bit pack and unpack to GTC_packing\n- Added 8bit pack and unpack to GTC_packing\n- Added missing bvec* && and || operators\n- Added iround and uround to GTC_integer, fast round on positive values\n- Added raw SIMD API\n- Added 'aligned' qualifiers\n- Added GTC_type_aligned with aligned *vec* types\n- Added GTC_functions extension\n- Added quaternion version of isnan and isinf #521\n- Added lowestBitValue to GTX_bit #536\n- Added GLM_FORCE_UNRESTRICTED_GENTYPE allowing non basic genType #543\n\n#### Improvements:\n- Improved SIMD and swizzle operators interactions with GCC and Clang #474\n- Improved GTC_random linearRand documentation\n- Improved GTC_reciprocal documentation\n- Improved GLM_FORCE_EXPLICIT_CTOR coverage #481\n- Improved OpenMP support detection for Clang, GCC, ICC and VC\n- Improved GTX_wrap for SIMD friendliness\n- Added constexpr for *vec*, *mat*, *quat* and *dual_quat* types #493\n- Added NEON instruction set detection\n- Added MIPS CPUs detection\n- Added PowerPC CPUs detection\n- Use Cuda built-in function for abs function implementation with Cuda compiler\n- Factorized GLM_COMPILER_LLVM and GLM_COMPILER_APPLE_CLANG into GLM_COMPILER_CLANG\n- No more warnings for use of long long\n- Added more information to build messages\n\n#### Fixes:\n- Fixed GTX_extended_min_max filename typo #386\n- Fixed intersectRayTriangle to not do any unintentional backface culling\n- Fixed long long warnings when using C++98 on GCC and Clang #482\n- Fixed sign with signed integer function on non-x86 architecture\n- Fixed strict aliasing warnings #473\n- Fixed missing vec1 overload to length2 and distance2 functions #431\n- Fixed GLM test '/fp:fast' and '/Za' command-line options are incompatible\n- Fixed quaterion to mat3 cast function mat3_cast from GTC_quaternion #542\n- Fixed GTX_io for Cuda #547 #546\n\n#### Deprecation:\n- Removed GLM_FORCE_SIZE_FUNC define\n- Deprecated GLM_GTX_simd_vec4 extension\n- Deprecated GLM_GTX_simd_mat4 extension\n- Deprecated GLM_GTX_simd_quat extension\n- Deprecated GLM_SWIZZLE, use GLM_FORCE_SWIZZLE instead\n- Deprecated GLM_MESSAGES, use GLM_FORCE_MESSAGES instead\n\n---\n### [GLM 0.9.7.6](https://github.com/g-truc/glm/releases/tag/0.9.7.6) - 2016-07-16\n#### Improvements:\n- Added pkg-config file #509\n- Updated list of compiler versions detected\n- Improved C++ 11 STL detection #523\n\n#### Fixes:\n- Fixed STL for C++11 detection on ICC #510\n- Fixed missing vec1 overload to length2 and distance2 functions #431\n- Fixed long long warnings when using C++98 on GCC and Clang #482\n- Fixed scalar reciprocal functions (GTC_reciprocal) #520\n\n---\n### [GLM 0.9.7.5](https://github.com/g-truc/glm/releases/tag/0.9.7.5) - 2016-05-24\n#### Improvements:\n- Added Visual C++ Clang toolset detection\n\n#### Fixes:\n- Fixed uaddCarry warning #497\n- Fixed roundPowerOfTwo and floorPowerOfTwo #503\n- Fixed Visual C++ SIMD instruction set automatic detection in 64 bits\n- Fixed to_string when used with GLM_FORCE_INLINE #506\n- Fixed GLM_FORCE_INLINE with binary vec4 operators\n- Fixed GTX_extended_min_max filename typo #386\n- Fixed intersectRayTriangle to not do any unintentional backface culling\n\n---\n### [GLM 0.9.7.4](https://github.com/g-truc/glm/releases/tag/0.9.7.4) - 2016-03-19\n#### Fixes:\n- Fixed asinh and atanh warning with C++98 STL #484\n- Fixed polar coordinates function latitude #485\n- Fixed outerProduct defintions and operator signatures for mat2x4 and vec4 #475\n- Fixed eulerAngles precision error, returns NaN  #451\n- Fixed undefined reference errors #489\n- Fixed missing GLM_PLATFORM_CYGWIN declaration #495\n- Fixed various undefined reference errors #490\n\n---\n### [GLM 0.9.7.3](https://github.com/g-truc/glm/releases/tag/0.9.7.3) - 2016-02-21\n#### Improvements:\n- Added AVX512 detection\n\n#### Fixes:\n- Fixed CMake policy warning\n- Fixed GCC 6.0 detection #477\n- Fixed Clang build on Windows #479\n- Fixed 64 bits constants warnings on GCC #463\n\n---\n### [GLM 0.9.7.2](https://github.com/g-truc/glm/releases/tag/0.9.7.2) - 2016-01-03\n#### Fixes:\n- Fixed GTC_round floorMultiple/ceilMultiple #412\n- Fixed GTC_packing unpackUnorm3x10_1x2 #414\n- Fixed GTC_matrix_inverse affineInverse #192\n- Fixed ICC on Linux build errors #449\n- Fixed ldexp and frexp compilation errors\n- Fixed \"Declaration shadows a field\" warning #468\n- Fixed 'GLM_COMPILER_VC2005 is not defined' warning #468\n- Fixed various 'X is not defined' warnings #468\n- Fixed missing unary + operator #435\n- Fixed Cygwin build errors when using C++11 #405\n\n---\n### [GLM 0.9.7.1](https://github.com/g-truc/glm/releases/tag/0.9.7.1) - 2015-09-07\n#### Improvements:\n- Improved constexpr for constant functions coverage #198\n- Added to_string for quat and dual_quat in GTX_string_cast #375\n- Improved overall execution time of unit tests #396\n\n#### Fixes:\n- Fixed strict alignment warnings #235 #370\n- Fixed link errors on compilers not supported default function #377\n- Fixed compilation warnings in vec4\n- Fixed non-identity quaternions for equal vectors #234\n- Fixed excessive GTX_fast_trigonometry execution time #396\n- Fixed Visual Studio 2015 'hides class member' warnings #394\n- Fixed builtin bitscan never being used #392\n- Removed unused func_noise.* files #398\n\n---\n### [GLM 0.9.7.0](https://github.com/g-truc/glm/releases/tag/0.9.7.0) - 2015-08-02\n#### Features:\n- Added GTC_color_space: convertLinearToSRGB and convertSRGBToLinear functions\n- Added 'fmod' overload to GTX_common with tests #308\n- Left handed perspective and lookAt functions #314\n- Added functions eulerAngleXYZ and extractEulerAngleXYZ #311\n- Added <glm/gtx/hash.hpp> to perform std::hash on GLM types #320 #367\n- Added <glm/gtx/wrap.hpp> for texcoord wrapping\n- Added static components and precision members to all vector and quat types #350\n- Added .gitignore #349\n- Added support of defaulted functions to GLM types, to use them in unions #366\n\n#### Improvements:\n- Changed usage of __has_include to support Intel compiler #307\n- Specialized integer implementation of YCoCg-R #310\n- Don't show status message in 'FindGLM' if 'QUIET' option is set. #317\n- Added master branch continuous integration service on Linux 64 #332\n- Clarified manual regarding angle unit in GLM, added FAQ 11 #326\n- Updated list of compiler versions\n\n#### Fixes:\n- Fixed default precision for quat and dual_quat type #312\n- Fixed (u)int64 MSB/LSB handling on BE archs #306\n- Fixed multi-line comment warning in g++. #315\n- Fixed specifier removal by 'std::make_pair<>' #333\n- Fixed perspective fovy argument documentation #327\n- Removed -m64 causing build issues on Linux 32 #331\n- Fixed isfinite with C++98 compilers #343\n- Fixed Intel compiler build error on Linux #354\n- Fixed use of libstdc++ with Clang #351\n- Fixed quaternion pow #346\n- Fixed decompose warnings #373\n- Fixed matrix conversions #371\n\n#### Deprecation:\n- Removed integer specification for 'mod' in GTC_integer #308\n- Removed GTX_multiple, replaced by GTC_round\n\n---\n### [GLM 0.9.6.3](https://github.com/g-truc/glm/releases/tag/0.9.6.3) - 2015-02-15\n- Fixed Android doesn't have C++ 11 STL #284\n\n---\n### [GLM 0.9.6.2](https://github.com/g-truc/glm/releases/tag/0.9.6.2) - 2015-02-15\n#### Features:\n- Added display of GLM version with other GLM_MESSAGES\n- Added ARM instruction set detection\n\n#### Improvements:\n- Removed assert for perspective with zFar < zNear #298\n- Added Visual Studio natvis support for vec1, quat and dualqual types\n- Cleaned up C++11 feature detections\n- Clarify GLM licensing\n\n#### Fixes:\n- Fixed faceforward build #289\n- Fixed conflict with Xlib #define True 1 #293\n- Fixed decompose function VS2010 templating issues #294\n- Fixed mat4x3 = mat2x3 * mat4x2 operator #297\n- Fixed warnings in F2x11_1x10 packing function in GTC_packing #295\n- Fixed Visual Studio natvis support for vec4 #288\n- Fixed GTC_packing *pack*norm*x* build and added tests #292\n- Disabled GTX_scalar_multiplication for GCC, failing to build tests #242\n- Fixed Visual C++ 2015 constexpr errors: Disabled only partial support\n- Fixed functions not inlined with Clang #302\n- Fixed memory corruption (undefined behaviour) #303\n\n---\n### [GLM 0.9.6.1](https://github.com/g-truc/glm/releases/tag/0.9.6.1) - 2014-12-10\n#### Features:\n- Added GLM_LANG_CXX14_FLAG and GLM_LANG_CXX1Z_FLAG language feature flags\n- Added C++14 detection\n\n#### Improvements:\n- Clean up GLM_MESSAGES compilation log to report only detected capabilities\n\n#### Fixes:\n- Fixed scalar uaddCarry build error with Cuda #276\n- Fixed C++11 explicit conversion operators detection #282\n- Fixed missing explicit conversion when using integer log2 with *vec1 types\n- Fixed 64 bits integer GTX_string_cast to_string on VC 32 bit compiler\n- Fixed Android build issue, STL C++11 is not supported by the NDK #284\n- Fixed unsupported _BitScanForward64 and _BitScanReverse64 in VC10\n- Fixed Visual C++ 32 bit build #283\n- Fixed GLM_FORCE_SIZE_FUNC pragma message\n- Fixed C++98 only build\n- Fixed conflict between GTX_compatibility and GTC_quaternion #286\n- Fixed C++ language restriction using GLM_FORCE_CXX**\n\n---\n### [GLM 0.9.6.0](https://github.com/g-truc/glm/releases/tag/0.9.6.0) - 2014-11-30\n#### Features:\n- Exposed template vector and matrix types in 'glm' namespace #239, #244\n- Added GTX_scalar_multiplication for C++ 11 compiler only #242\n- Added GTX_range for C++ 11 compiler only #240\n- Added closestPointOnLine function for tvec2 to GTX_closest_point #238\n- Added GTC_vec1 extension, *vec1 support to *vec* types\n- Updated GTX_associated_min_max with vec1 support\n- Added support of precision and integers to linearRand #230\n- Added Integer types support to GTX_string_cast #249\n- Added vec3 slerp #237\n- Added GTX_common with isdenomal #223\n- Added GLM_FORCE_SIZE_FUNC to replace .length() by .size() #245\n- Added GLM_FORCE_NO_CTOR_INIT\n- Added 'uninitialize' to explicitly not initialize a GLM type\n- Added GTC_bitfield extension, promoted GTX_bit\n- Added GTC_integer extension, promoted GTX_bit and GTX_integer\n- Added GTC_round extension, promoted GTX_bit\n- Added GLM_FORCE_EXPLICIT_CTOR to require explicit type conversions #269\n- Added GTX_type_aligned for aligned vector, matrix and quaternion types\n\n#### Improvements:\n- Rely on C++11 to implement isinf and isnan\n- Removed GLM_FORCE_CUDA, Cuda is implicitly detected\n- Separated Apple Clang and LLVM compiler detection\n- Used pragma once\n- Undetected C++ compiler automatically compile with GLM_FORCE_CXX98 and \n  GLM_FORCE_PURE\n- Added not function (from GLSL specification) on VC12\n- Optimized bitfieldReverse and bitCount functions\n- Optimized findLSB and findMSB functions.\n- Optimized matrix-vector multiple performance with Cuda #257, #258\n- Reduced integer type redifinitions #233\n- Rewrited of GTX_fast_trigonometry #264 #265\n- Made types trivially copyable #263\n- Removed <iostream> in GLM tests\n- Used std features within GLM without redeclaring\n- Optimized cot function #272\n- Optimized sign function #272\n- Added explicit cast from quat to mat3 and mat4 #275\n\n#### Fixes:\n- Fixed std::nextafter not supported with C++11 on Android #217\n- Fixed missing value_type for dual quaternion\n- Fixed return type of dual quaternion length\n- Fixed infinite loop in isfinite function with GCC #221\n- Fixed Visual Studio 14 compiler warnings\n- Fixed implicit conversion from another tvec2 type to another tvec2 #241\n- Fixed lack of consistency of quat and dualquat constructors\n- Fixed uaddCarray #253\n- Fixed float comparison warnings #270\n\n#### Deprecation:\n- Requires Visual Studio 2010, GCC 4.2, Apple Clang 4.0, LLVM 3.0, Cuda 4, ICC 2013 or a C++98 compiler\n- Removed degrees for function parameters\n- Removed GLM_FORCE_RADIANS, active by default\n- Removed VC 2005 / 8 and 2008 / 9 support\n- Removed GCC 3.4 to 4.3 support\n- Removed LLVM GCC support\n- Removed LLVM 2.6 to 3.1 support\n- Removed CUDA 3.0 to 3.2 support\n\n---\n### [GLM 0.9.5.4 - 2014-06-21](https://github.com/g-truc/glm/releases/tag/0.9.5.4)\n- Fixed non-utf8 character #196\n- Added FindGLM install for CMake #189\n- Fixed GTX_color_space - saturation #195\n- Fixed glm::isinf and glm::isnan for with Android NDK 9d #191\n- Fixed builtin GLM_ARCH_SSE4 #204\n- Optimized Quaternion vector rotation #205\n- Fixed missing doxygen @endcond tag #211\n- Fixed instruction set detection with Clang #158\n- Fixed orientate3 function #207\n- Fixed lerp when cosTheta is close to 1 in quaternion slerp #210\n- Added GTX_io for io with <iostream> #144\n- Fixed fastDistance ambiguity #215\n- Fixed tweakedInfinitePerspective #208 and added user-defined epsilon to\n  tweakedInfinitePerspective\n- Fixed std::copy and std::vector with GLM types #214\n- Fixed strict aliasing issues #212, #152\n- Fixed std::nextafter not supported with C++11 on Android #213\n- Fixed corner cases in exp and log functions for quaternions #199\n\n---\n### GLM 0.9.5.3 - 2014-04-02\n- Added instruction set auto detection with Visual C++ using _M_IX86_FP - /arch\n  compiler argument\n- Fixed GTX_raw_data code dependency\n- Fixed GCC instruction set detection\n- Added GLM_GTX_matrix_transform_2d extension (#178, #176)\n- Fixed CUDA issues (#169, #168, #183, #182)\n- Added support for all extensions but GTX_string_cast to CUDA\n- Fixed strict aliasing warnings in GCC 4.8.1 / Android NDK 9c (#152)\n- Fixed missing bitfieldInterleave definisions\n- Fixed usubBorrow (#171)\n- Fixed eulerAngle*** not consistent for right-handed coordinate system (#173)\n- Added full tests for eulerAngle*** functions (#173)\n- Added workaround for a CUDA compiler bug (#186, #185)\n\n---\n### GLM 0.9.5.2 - 2014-02-08\n- Fixed initializer list ambiguity (#159, #160)\n- Fixed warnings with the Android NDK 9c\n- Fixed non power of two matrix products\n- Fixed mix function link error\n- Fixed SSE code included in GLM tests on \"pure\" platforms\n- Fixed undefined reference to fastInverseSqrt (#161)\n- Fixed GLM_FORCE_RADIANS with <glm/ext.hpp> build error (#165)\n- Fix dot product clamp range for vector angle functions. (#163)\n- Tentative fix for strict aliasing warning in GCC 4.8.1 / Android NDK 9c (#152)\n- Fixed GLM_GTC_constants description brief (#162)\n\n---\n### GLM 0.9.5.1 - 2014-01-11\n- Fixed angle and orientedAngle that sometimes return NaN values (#145)\n- Deprecated degrees for function parameters and display a message\n- Added possible static_cast conversion of GLM types (#72)\n- Fixed error 'inverse' is not a member of 'glm' from glm::unProject (#146)\n- Fixed mismatch between some declarations and definitions\n- Fixed inverse link error when using namespace glm; (#147)\n- Optimized matrix inverse and division code (#149)\n- Added intersectRayPlane function (#153)\n- Fixed outerProduct return type (#155)\n\n---\n### GLM 0.9.5.0 - 2013-12-25\n- Added forward declarations (glm/fwd.hpp) for faster compilations\n- Added per feature headers\n- Minimized GLM internal dependencies\n- Improved Intel Compiler detection\n- Added bitfieldInterleave and _mm_bit_interleave_si128 functions\n- Added GTX_scalar_relational\n- Added GTX_dual_quaternion\n- Added rotation function to GTX_quaternion (#22)\n- Added precision variation of each type\n- Added quaternion comparison functions\n- Fixed GTX_multiple for negative value\n- Removed GTX_ocl_type extension\n- Fixed post increment and decrement operators\n- Fixed perspective with zNear == 0 (#71)\n- Removed l-value swizzle operators\n- Cleaned up compiler detection code for unsupported compilers\n- Replaced C cast by C++ casts\n- Fixed .length() that should return a int and not a size_t\n- Added GLM_FORCE_SIZE_T_LENGTH and glm::length_t\n- Removed unnecessary conversions\n- Optimized packing and unpacking functions\n- Removed the normalization of the up argument of lookAt function (#114)\n- Added low precision specializations of inversesqrt\n- Fixed ldexp and frexp implementations\n- Increased assert coverage\n- Increased static_assert coverage\n- Replaced GLM traits by STL traits when possible\n- Allowed including individual core feature\n- Increased unit tests completness\n- Added creating of a quaternion from two vectors\n- Added C++11 initializer lists\n- Fixed umulExtended and imulExtended implementations for vector types (#76)\n- Fixed CUDA coverage for GTC extensions\n- Added GTX_io extension\n- Improved GLM messages enabled when defining GLM_MESSAGES\n- Hidden matrix _inverse function implementation detail into private section\n\n---\n### [GLM 0.9.4.6](https://github.com/g-truc/glm/releases/tag/0.9.4.6) - 2013-09-20\n- Fixed detection to select the last known compiler if newer version #106\n- Fixed is_int and is_uint code duplication with GCC and C++11 #107 \n- Fixed test suite build while using Clang in C++11 mode\n- Added c++1y mode support in CMake test suite\n- Removed ms extension mode to CMake when no using Visual C++\n- Added pedantic mode to CMake test suite for Clang and GCC\n- Added use of GCC frontend on Unix for ICC and Visual C++ fronted on Windows\n  for ICC\n- Added compilation errors for unsupported compiler versions\n- Fixed glm::orientation with GLM_FORCE_RADIANS defined #112\n- Fixed const ref issue on assignment operator taking a scalar parameter #116\n- Fixed glm::eulerAngleY implementation #117\n\n---\n### GLM 0.9.4.5 - 2013-08-12\n- Fixed CUDA support\n- Fixed inclusion of intrinsics in \"pure\" mode #92\n- Fixed language detection on GCC when the C++0x mode isn't enabled #95\n- Fixed issue #97: register is deprecated in C++11\n- Fixed issue #96: CUDA issues\n- Added Windows CE detection #92\n- Added missing value_ptr for quaternions #99\n\n---\n### GLM 0.9.4.4 - 2013-05-29\n- Fixed slerp when costheta is close to 1 #65\n- Fixed mat4x2 value_type constructor #70\n- Fixed glm.natvis for Visual C++ 12 #82\n- Added assert in inversesqrt to detect division by zero #61\n- Fixed missing swizzle operators #86\n- Fixed CUDA warnings #86\n- Fixed GLM natvis for VC11 #82\n- Fixed GLM_GTX_multiple with negative values #79\n- Fixed glm::perspective when zNear is zero #71\n\n---\n### GLM 0.9.4.3 - 2013-03-20\n- Detected qualifier for Clang\n- Fixed C++11 mode for GCC, couldn't be enabled without MS extensions\n- Fixed squad, intermediate and exp quaternion functions\n- Fixed GTX_polar_coordinates euclidean function, takes a vec2 instead of a vec3\n- Clarify the license applying on the manual\n- Added a docx copy of the manual\n- Fixed GLM_GTX_matrix_interpolation\n- Fixed isnan and isinf on Android with Clang\n- Autodetected C++ version using __cplusplus value\n- Fixed mix for bool and bvec* third parameter\n\n---\n### GLM 0.9.4.2 - 2013-02-14\n- Fixed compAdd from GTX_component_wise\n- Fixed SIMD support for Intel compiler on Windows\n- Fixed isnan and isinf for CUDA compiler\n- Fixed GLM_FORCE_RADIANS on glm::perspective\n- Fixed GCC warnings\n- Fixed packDouble2x32 on Xcode\n- Fixed mix for vec4 SSE implementation\n- Fixed 0x2013 dash character in comments that cause issue in Windows \n  Japanese mode\n- Fixed documentation warnings\n- Fixed CUDA warnings\n\n---\n### GLM 0.9.4.1 - 2012-12-22\n- Improved half support: -0.0 case and implicit conversions\n- Fixed Intel Composer Compiler support on Linux\n- Fixed interaction between quaternion and euler angles\n- Fixed GTC_constants build\n- Fixed GTX_multiple\n- Fixed quat slerp using mix function when cosTheta close to 1\n- Improved fvec4SIMD and fmat4x4SIMD implementations\n- Fixed assert messages\n- Added slerp and lerp quaternion functions and tests\n\n---\n### GLM 0.9.4.0 - 2012-11-18\n- Added Intel Composer Compiler support\n- Promoted GTC_espilon extension\n- Promoted GTC_ulp extension\n- Removed GLM website from the source repository\n- Added GLM_FORCE_RADIANS so that all functions takes radians for arguments\n- Fixed detection of Clang and LLVM GCC on MacOS X\n- Added debugger visualizers for Visual C++ 2012\n- Requires Visual Studio 2005, GCC 4.2, Clang 2.6, Cuda 3, ICC 2013 or a C++98 compiler\n\n---\n### [GLM 0.9.3.4](https://github.com/g-truc/glm/releases/tag/0.9.3.4) - 2012-06-30\n- Added SSE4 and AVX2 detection.\n- Removed VIRTREV_xstream and the incompatibility generated with GCC\n- Fixed C++11 compiler option for GCC\n- Removed MS language extension option for GCC (not fonctionnal)\n- Fixed bitfieldExtract for vector types\n- Fixed warnings\n- Fixed SSE includes\n\n---\n### GLM 0.9.3.3 - 2012-05-10\n- Fixed isinf and isnan\n- Improved compatibility with Intel compiler\n- Added CMake test build options: SIMD, C++11, fast math and MS land ext\n- Fixed SIMD mat4 test on GCC\n- Fixed perspectiveFov implementation\n- Fixed matrixCompMult for none-square matrices\n- Fixed namespace issue on stream operators\n- Fixed various warnings\n- Added VC11 support\n\n---\n### GLM 0.9.3.2 - 2012-03-15\n- Fixed doxygen documentation\n- Fixed Clang version detection\n- Fixed simd mat4 /= operator\n\n---\n### GLM 0.9.3.1 - 2012-01-25\n- Fixed platform detection\n- Fixed warnings\n- Removed detail code from Doxygen doc\n\n---\n### GLM 0.9.3.0 - 2012-01-09\n- Added CPP Check project\n- Fixed conflict with Windows headers\n- Fixed isinf implementation\n- Fixed Boost conflict\n- Fixed warnings\n\n---\n### GLM 0.9.3.B - 2011-12-12\n- Added support for Chrone Native Client\n- Added epsilon constant\n- Removed value_size function from vector types\n- Fixed roundEven on GCC\n- Improved API documentation\n- Fixed modf implementation\n- Fixed step function accuracy\n- Fixed outerProduct\n\n---\n### GLM 0.9.3.A - 2011-11-11\n- Improved doxygen documentation\n- Added new swizzle operators for C++11 compilers\n- Added new swizzle operators declared as functions\n- Added GLSL 4.20 length for vector and matrix types\n- Promoted GLM_GTC_noise extension: simplex, perlin, periodic noise functions\n- Promoted GLM_GTC_random extension: linear, gaussian and various random number \ngeneration distribution\n- Added GLM_GTX_constants: provides useful constants\n- Added extension versioning\n- Removed many unused namespaces\n- Fixed half based type contructors\n- Added GLSL core noise functions\n\n---\n### [GLM 0.9.2.7](https://github.com/g-truc/glm/releases/tag/0.9.2.7) - 2011-10-24\n- Added more swizzling constructors\n- Added missing none-squared matrix products\n\n---\n### [GLM 0.9.2.6](https://github.com/g-truc/glm/releases/tag/0.9.2.6) - 2011-10-01\n- Fixed half based type build on old GCC\n- Fixed /W4 warnings on Visual C++\n- Fixed some missing l-value swizzle operators\n\n---\n### GLM 0.9.2.5 - 2011-09-20\n- Fixed floatBitToXint functions\n- Fixed pack and unpack functions\n- Fixed round functions\n\n---\n### GLM 0.9.2.4 - 2011-09-03\n- Fixed extensions bugs\n\n---\n### GLM 0.9.2.3 - 2011-06-08\n- Fixed build issues\n\n---\n### GLM 0.9.2.2 - 2011-06-02\n- Expend matrix constructors flexibility\n- Improved quaternion implementation\n- Fixed many warnings across platforms and compilers\n\n---\n### GLM 0.9.2.1 - 2011-05-24\n- Automatically detect CUDA support\n- Improved compiler detection\n- Fixed errors and warnings in VC with C++ extensions disabled\n- Fixed and tested GLM_GTX_vector_angle\n- Fixed and tested GLM_GTX_rotate_vector\n\n---\n### GLM 0.9.2.0 - 2011-05-09\n- Added CUDA support\n- Added CTest test suite\n- Added GLM_GTX_ulp extension\n- Added GLM_GTX_noise extension\n- Added GLM_GTX_matrix_interpolation extension\n- Updated quaternion slerp interpolation\n\n---\n### [GLM 0.9.1.3](https://github.com/g-truc/glm/releases/tag/0.9.1.3) - 2011-05-07\n- Fixed bugs\n\n---\n### GLM 0.9.1.2 - 2011-04-15\n- Fixed bugs\n\n---\n### GLM 0.9.1.1 - 2011-03-17\n- Fixed bugs\n\n---\n### GLM 0.9.1.0 - 2011-03-03\n- Fixed bugs\n\n---\n### GLM 0.9.1.B - 2011-02-13\n- Updated API documentation\n- Improved SIMD implementation\n- Fixed Linux build\n\n---\n### [GLM 0.9.0.8](https://github.com/g-truc/glm/releases/tag/0.9.0.8) - 2011-02-13\n- Added quaternion product operator.\n- Clarify that GLM is a header only library.\n\n---\n### GLM 0.9.1.A - 2011-01-31\n- Added SIMD support\n- Added new swizzle functions\n- Improved static assert error message with C++0x static_assert\n- New setup system\n- Reduced branching\n- Fixed trunc implementation\n\n---\n### [GLM 0.9.0.7](https://github.com/g-truc/glm/releases/tag/0.9.0.7) - 2011-01-30\n- Added GLSL 4.10 packing functions\n- Added == and != operators for every types.\n\n---\n### GLM 0.9.0.6 - 2010-12-21\n- Many matrices bugs fixed\n\n---\n### GLM 0.9.0.5 - 2010-11-01\n- Improved Clang support\n- Fixed bugs\n\n---\n### GLM 0.9.0.4 - 2010-10-04\n- Added autoexp for GLM\n- Fixed bugs\n\n---\n### GLM 0.9.0.3 - 2010-08-26\n- Fixed non-squared matrix operators\n\n---\n### GLM 0.9.0.2 - 2010-07-08\n- Added GLM_GTX_int_10_10_10_2\n- Fixed bugs\n\n---\n### GLM 0.9.0.1 - 2010-06-21\n- Fixed extensions errors\n\n---\n### GLM 0.9.0.0 - 2010-05-25\n- Objective-C support\n- Fixed warnings\n- Updated documentation\n\n---\n### GLM 0.9.B.2 - 2010-04-30\n- Git transition\n- Removed experimental code from releases\n- Fixed bugs\n\n---\n### GLM 0.9.B.1 - 2010-04-03\n- Based on GLSL 4.00 specification\n- Added the new core functions\n- Added some implicit conversion support\n\n---\n### GLM 0.9.A.2 - 2010-02-20\n- Improved some possible errors messages\n- Improved declarations and definitions match\n\n---\n### GLM 0.9.A.1 - 2010-02-09\n- Removed deprecated features\n- Internal redesign\n\n---\n### GLM 0.8.4.4 final - 2010-01-25\n- Fixed warnings\n\n---\n### GLM 0.8.4.3 final - 2009-11-16\n- Fixed Half float arithmetic\n- Fixed setup defines\n\n---\n### GLM 0.8.4.2 final - 2009-10-19\n- Fixed Half float adds\n\n---\n### GLM 0.8.4.1 final - 2009-10-05\n- Updated documentation\n- Fixed MacOS X build\n\n---\n### GLM 0.8.4.0 final - 2009-09-16\n- Added GCC 4.4 and VC2010 support\n- Added matrix optimizations\n\n---\n### GLM 0.8.3.5 final - 2009-08-11\n- Fixed bugs\n\n---\n### GLM 0.8.3.4 final - 2009-08-10\n- Updated GLM according GLSL 1.5 spec\n- Fixed bugs\n\n---\n### GLM 0.8.3.3 final - 2009-06-25\n- Fixed bugs\n\n---\n### GLM 0.8.3.2 final - 2009-06-04\n- Added GLM_GTC_quaternion\n- Added GLM_GTC_type_precision\n\n---\n### GLM 0.8.3.1 final - 2009-05-21\n- Fixed old extension system.\n\n---\n### GLM 0.8.3.0 final - 2009-05-06\n- Added stable extensions.\n- Added new extension system.\n\n---\n### GLM 0.8.2.3 final - 2009-04-01\n- Fixed bugs.\n\n---\n### GLM 0.8.2.2 final - 2009-02-24\n- Fixed bugs.\n\n---\n### GLM 0.8.2.1 final - 2009-02-13\n- Fixed bugs.\n\n---\n### GLM 0.8.2 final - 2009-01-21\n- Fixed bugs.\n\n---\n### GLM 0.8.1 final - 2008-10-30\n- Fixed bugs.\n\n---\n### GLM 0.8.0 final - 2008-10-23\n- New method to use extension.\n\n---\n### GLM 0.8.0 beta3 - 2008-10-10\n- Added CMake support for GLM tests.\n\n---\n### GLM 0.8.0 beta2 - 2008-10-04\n- Improved half scalars and vectors support.\n\n---\n### GLM 0.8.0 beta1 - 2008-09-26\n- Improved GLSL conformance\n- Added GLSL 1.30 support\n- Improved API documentation\n\n---\n### GLM 0.7.6 final - 2008-08-08\n- Improved C++ standard comformance\n- Added Static assert for types checking\n\n---\n### GLM 0.7.5 final - 2008-07-05\n- Added build message system with Visual Studio\n- Pedantic build with GCC\n\n---\n### GLM 0.7.4 final - 2008-06-01\n- Added external dependencies system.\n\n---\n### GLM 0.7.3 final - 2008-05-24\n- Fixed bugs\n- Added new extension group\n\n---\n### GLM 0.7.2 final - 2008-04-27\n- Updated documentation\n- Added preprocessor options\n\n---\n### GLM 0.7.1 final - 2008-03-24\n- Disabled half on GCC\n- Fixed extensions\n\n---\n### GLM 0.7.0 final - 2008-03-22\n- Changed to MIT license\n- Added new documentation\n\n---\n### GLM 0.6.4 - 2007-12-10\n- Fixed swizzle operators\n\n---\n### GLM 0.6.3 - 2007-11-05\n- Fixed type data accesses\n- Fixed 3DSMax sdk conflict\n\n---\n### GLM 0.6.2 - 2007-10-08\n- Fixed extension\n\n---\n### GLM 0.6.1 - 2007-10-07\n- Fixed a namespace error\n- Added extensions\n\n---\n### GLM 0.6.0 : 2007-09-16\n- Added new extension namespace mecanium\n- Added Automatic compiler detection\n\n---\n### GLM 0.5.1 - 2007-02-19\n- Fixed swizzle operators\n\n---\n### GLM 0.5.0 - 2007-01-06\n- Upgrated to GLSL 1.2\n- Added swizzle operators\n- Added setup settings\n\n---\n### GLM 0.4.1 - 2006-05-22\n- Added OpenGL examples\n\n---\n### GLM 0.4.0 - 2006-05-17\n- Added missing operators to vec* and mat*\n- Added first GLSL 1.2 features\n- Fixed windows.h before glm.h when windows.h required\n\n---\n### GLM 0.3.2 - 2006-04-21\n- Fixed texcoord components access.\n- Fixed mat4 and imat4 division operators.\n\n---\n### GLM 0.3.1 - 2006-03-28\n- Added GCC 4.0 support under MacOS X.\n- Added GCC 4.0 and 4.1 support under Linux.\n- Added code optimisations.\n\n---\n### GLM 0.3 - 2006-02-19\n- Improved GLSL type conversion and construction compliance.\n- Added experimental extensions.\n- Added Doxygen Documentation.\n- Added code optimisations.\n- Fixed bugs.\n\n---\n### GLM 0.2 - 2005-05-05\n- Improve adaptative from GLSL.\n- Add experimental extensions based on OpenGL extension process.\n- Fixe bugs.\n\n---\n### GLM 0.1 - 2005-02-21\n- Add vec2, vec3, vec4 GLSL types\n- Add ivec2, ivec3, ivec4 GLSL types\n- Add bvec2, bvec3, bvec4 GLSL types\n- Add mat2, mat3, mat4 GLSL types\n- Add almost all functions\n\n"
  },
  {
    "path": "external/glm/test/CMakeLists.txt",
    "content": "function(glmCreateTestGTC NAME)\n\tif(GLM_TEST_ENABLE)\n\t\tset(SAMPLE_NAME test-${NAME})\n\t\tadd_executable(${SAMPLE_NAME} ${NAME}.cpp)\n\n\t\tadd_test(\n\t\t\tNAME ${SAMPLE_NAME}\n\t\t\tCOMMAND $<TARGET_FILE:${SAMPLE_NAME}> )\n\tendif(GLM_TEST_ENABLE)\nendfunction()\n\nadd_subdirectory(bug)\nadd_subdirectory(core)\nadd_subdirectory(ext)\nadd_subdirectory(gtc)\nadd_subdirectory(gtx)\n\n\n"
  },
  {
    "path": "external/glm/test/bug/CMakeLists.txt",
    "content": "glmCreateTestGTC(bug_ms_vec_static)\n"
  },
  {
    "path": "external/glm/test/bug/bug_ms_vec_static.cpp",
    "content": "#include <glm/glm.hpp>\n\n#if GLM_HAS_ALIGNED_TYPE\nstruct vec2;\n\nstruct _swizzle\n{\n\tchar _buffer[1];\n};\n\nstruct vec2\n{\n\tGLM_CONSTEXPR_CTOR vec2() :\n\t\tx(0), y(0)\n\t{}\n\n\tunion\n\t{\n\t\tstruct { float x, y; };\n\t\tstruct { _swizzle xx; };\n\t};\n};\n#endif\n\n// Visual C++ has a bug generating the error: fatal error C1001: An internal error has occurred in the compiler.\n// vec2 Bar;\n\nint main()\n{\n\treturn 0;\n}\n"
  },
  {
    "path": "external/glm/test/core/CMakeLists.txt",
    "content": "glmCreateTestGTC(core_force_pure)\nglmCreateTestGTC(core_force_unrestricted_gentype)\nglmCreateTestGTC(core_type_aligned)\nglmCreateTestGTC(core_type_cast)\nglmCreateTestGTC(core_type_ctor)\nglmCreateTestGTC(core_type_float)\nglmCreateTestGTC(core_type_int)\nglmCreateTestGTC(core_type_length)\nglmCreateTestGTC(core_type_mat2x2)\nglmCreateTestGTC(core_type_mat2x3)\nglmCreateTestGTC(core_type_mat2x4)\nglmCreateTestGTC(core_type_mat3x2)\nglmCreateTestGTC(core_type_mat3x3)\nglmCreateTestGTC(core_type_mat3x4)\nglmCreateTestGTC(core_type_mat4x2)\nglmCreateTestGTC(core_type_mat4x3)\nglmCreateTestGTC(core_type_mat4x4)\nglmCreateTestGTC(core_type_vec1)\nglmCreateTestGTC(core_type_vec2)\nglmCreateTestGTC(core_type_vec3)\nglmCreateTestGTC(core_type_vec4)\nglmCreateTestGTC(core_func_common)\nglmCreateTestGTC(core_func_exponential)\nglmCreateTestGTC(core_func_geometric)\nglmCreateTestGTC(core_func_integer)\nglmCreateTestGTC(core_func_integer_bit_count)\nglmCreateTestGTC(core_func_integer_find_lsb)\nglmCreateTestGTC(core_func_integer_find_msb)\nglmCreateTestGTC(core_func_matrix)\nglmCreateTestGTC(core_func_noise)\nglmCreateTestGTC(core_func_packing)\nglmCreateTestGTC(core_func_trigonometric)\nglmCreateTestGTC(core_func_vector_relational)\nglmCreateTestGTC(core_func_swizzle)\nglmCreateTestGTC(core_setup_force_cxx98)\nglmCreateTestGTC(core_setup_force_size_t_length)\nglmCreateTestGTC(core_setup_message)\nglmCreateTestGTC(core_setup_precision)\n\n\n\n"
  },
  {
    "path": "external/glm/test/core/core_force_pure.cpp",
    "content": "#ifndef GLM_FORCE_PURE\n#\tdefine GLM_FORCE_PURE\n#endif//GLM_FORCE_PURE\n#define GLM_FORCE_ALIGNED\n#define GLM_FORCE_SWIZZLE\n#include <glm/vector_relational.hpp>\n#include <glm/vec2.hpp>\n#include <glm/vec3.hpp>\n#include <glm/vec4.hpp>\n#include <cstdio>\n#include <ctime>\n#include <vector>\n\nint test_vec4_ctor()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::ivec4 A(1, 2, 3, 4);\n\t\tglm::ivec4 B(A);\n\t\tError += glm::all(glm::equal(A, B)) ? 0 : 1;\n\t}\n\n#\tif GLM_HAS_TRIVIAL_QUERIES\n\t//\tError += std::is_trivially_default_constructible<glm::vec4>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::vec4>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::vec4>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::dvec4>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::ivec4>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::uvec4>::value ? 0 : 1;\n\n\t\tError += std::is_copy_constructible<glm::vec4>::value ? 0 : 1;\n#\tendif\n\n#if GLM_HAS_INITIALIZER_LISTS\n\t{\n\t\tglm::vec4 a{ 0, 1, 2, 3 };\n\t\tstd::vector<glm::vec4> v = {\n\t\t\t{0, 1, 2, 3},\n\t\t\t{4, 5, 6, 7},\n\t\t\t{8, 9, 0, 1}};\n\t}\n\n\t{\n\t\tglm::dvec4 a{ 0, 1, 2, 3 };\n\t\tstd::vector<glm::dvec4> v = {\n\t\t\t{0, 1, 2, 3},\n\t\t\t{4, 5, 6, 7},\n\t\t\t{8, 9, 0, 1}};\n\t}\n#endif\n\n#if GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)\n\t{\n\t\tglm::vec4 A = glm::vec4(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = A.xyzw;\n\t\tglm::vec4 C(A.xyzw);\n\t\tglm::vec4 D(A.xyzw());\n\t\tglm::vec4 E(A.x, A.yzw);\n\t\tglm::vec4 F(A.x, A.yzw());\n\t\tglm::vec4 G(A.xyz, A.w);\n\t\tglm::vec4 H(A.xyz(), A.w);\n\t\tglm::vec4 I(A.xy, A.zw);\n\t\tglm::vec4 J(A.xy(), A.zw());\n\t\tglm::vec4 K(A.x, A.y, A.zw);\n\t\tglm::vec4 L(A.x, A.yz, A.w);\n\t\tglm::vec4 M(A.xy, A.z, A.w);\n\n\t\tError += glm::all(glm::equal(A, B)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, C)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, D)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, E)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, F)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, G)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, H)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, I)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, J)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, K)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, L)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, M)) ? 0 : 1;\n\t}\n#endif// GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)\n\n\t{\n\t\tglm::vec4 A(1);\n\t\tglm::vec4 B(1, 1, 1, 1);\n\t\t\n\t\tError += A == B ? 0 : 1;\n\t}\n\t\n\t{\n\t\tstd::vector<glm::vec4> Tests;\n\t\tTests.push_back(glm::vec4(glm::vec2(1, 2), 3, 4));\n\t\tTests.push_back(glm::vec4(1, glm::vec2(2, 3), 4));\n\t\tTests.push_back(glm::vec4(1, 2, glm::vec2(3, 4)));\n\t\tTests.push_back(glm::vec4(glm::vec3(1, 2, 3), 4));\n\t\tTests.push_back(glm::vec4(1, glm::vec3(2, 3, 4)));\n\t\tTests.push_back(glm::vec4(glm::vec2(1, 2), glm::vec2(3, 4)));\n\t\tTests.push_back(glm::vec4(1, 2, 3, 4));\n\t\tTests.push_back(glm::vec4(glm::vec4(1, 2, 3, 4)));\n\t\t\n\t\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t\t\tError += Tests[i] == glm::vec4(1, 2, 3, 4) ? 0 : 1;\n\t}\n\t\n\treturn Error;\n}\n\nint test_bvec4_ctor()\n{\n\tint Error = 0;\n\n\tglm::bvec4 const A(true);\n\tglm::bvec4 const B(true);\n\tglm::bvec4 const C(false);\n\tglm::bvec4 const D = A && B;\n\tglm::bvec4 const E = A && C;\n\tglm::bvec4 const F = A || C;\n\n\tError += D == glm::bvec4(true) ? 0 : 1;\n\tError += E == glm::bvec4(false) ? 0 : 1;\n\tError += F == glm::bvec4(true) ? 0 : 1;\n\n\tbool const G = A == C;\n\tbool const H = A != C;\n\n\tError += !G ? 0 : 1;\n\tError += H ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_vec4_operators()\n{\n\tint Error = 0;\n\t\n\t{\n\t\tglm::vec4 A(1.0f);\n\t\tglm::vec4 B(1.0f);\n\t\tbool R = A != B;\n\t\tbool S = A == B;\n\n\t\tError += (S && !R) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tglm::vec4 C = A + B;\n\t\tError += C == glm::vec4(5, 7, 9, 11) ? 0 : 1;\n\n\t\tglm::vec4 D = B - A;\n\t\tError += D == glm::vec4(3, 3, 3, 3) ? 0 : 1;\n\n\t\tglm::vec4 E = A * B;\n\t\tError += E == glm::vec4(4, 10, 18, 28) ? 0 : 1;\n\n\t\tglm::vec4 F = B / A;\n\t\tError += F == glm::vec4(4, 2.5, 2, 7.0f / 4.0f) ? 0 : 1;\n\n\t\tglm::vec4 G = A + 1.0f;\n\t\tError += G == glm::vec4(2, 3, 4, 5) ? 0 : 1;\n\n\t\tglm::vec4 H = B - 1.0f;\n\t\tError += H == glm::vec4(3, 4, 5, 6) ? 0 : 1;\n\n\t\tglm::vec4 I = A * 2.0f;\n\t\tError += I == glm::vec4(2, 4, 6, 8) ? 0 : 1;\n\n\t\tglm::vec4 J = B / 2.0f;\n\t\tError += J == glm::vec4(2, 2.5, 3, 3.5) ? 0 : 1;\n\n\t\tglm::vec4 K = 1.0f + A;\n\t\tError += K == glm::vec4(2, 3, 4, 5) ? 0 : 1;\n\n\t\tglm::vec4 L = 1.0f - B;\n\t\tError += L == glm::vec4(-3, -4, -5, -6) ? 0 : 1;\n\n\t\tglm::vec4 M = 2.0f * A;\n\t\tError += M == glm::vec4(2, 4, 6, 8) ? 0 : 1;\n\n\t\tglm::vec4 N = 2.0f / B;\n\t\tError += N == glm::vec4(0.5, 2.0 / 5.0, 2.0 / 6.0, 2.0 / 7.0) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tA += B;\n\t\tError += A == glm::vec4(5, 7, 9, 11) ? 0 : 1;\n\n\t\tA += 1.0f;\n\t\tError += A == glm::vec4(6, 8, 10, 12) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tB -= A;\n\t\tError += B == glm::vec4(3, 3, 3, 3) ? 0 : 1;\n\n\t\tB -= 1.0f;\n\t\tError += B == glm::vec4(2, 2, 2, 2) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tA *= B;\n\t\tError += A == glm::vec4(4, 10, 18, 28) ? 0 : 1;\n\n\t\tA *= 2.0f;\n\t\tError += A == glm::vec4(8, 20, 36, 56) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tB /= A;\n\t\tError += B == glm::vec4(4, 2.5, 2, 7.0f / 4.0f) ? 0 : 1;\n\n\t\tB /= 2.0f;\n\t\tError += B == glm::vec4(2, 1.25, 1, 7.0f / 4.0f / 2.0f) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(2.0f);\n\n\t\tB /= B.y;\n\t\tError += B == glm::vec4(1.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = -A;\n\t\tError += B == glm::vec4(-1.0f, -2.0f, -3.0f, -4.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = --A;\n\t\tError += B == glm::vec4(0.0f, 1.0f, 2.0f, 3.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = A--;\n\t\tError += B == glm::vec4(1.0f, 2.0f, 3.0f, 4.0f) ? 0 : 1;\n\t\tError += A == glm::vec4(0.0f, 1.0f, 2.0f, 3.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = ++A;\n\t\tError += B == glm::vec4(2.0f, 3.0f, 4.0f, 5.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = A++;\n\t\tError += B == glm::vec4(1.0f, 2.0f, 3.0f, 4.0f) ? 0 : 1;\n\t\tError += A == glm::vec4(2.0f, 3.0f, 4.0f, 5.0f) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_vec4_equal()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::vec4 const A(1, 2, 3, 4);\n\t\tglm::vec4 const B(1, 2, 3, 4);\n\t\tError += A == B ? 0 : 1;\n\t\tError += A != B ? 1 : 0;\n\t}\n\n\t{\n\t\tglm::ivec4 const A(1, 2, 3, 4);\n\t\tglm::ivec4 const B(1, 2, 3, 4);\n\t\tError += A == B ? 0 : 1;\n\t\tError += A != B ? 1 : 0;\n\t}\n\n\treturn Error;\n}\n\nint test_vec4_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::vec4) == sizeof(glm::lowp_vec4) ? 0 : 1;\n\tError += sizeof(glm::vec4) == sizeof(glm::mediump_vec4) ? 0 : 1;\n\tError += sizeof(glm::vec4) == sizeof(glm::highp_vec4) ? 0 : 1;\n\tError += 16 == sizeof(glm::mediump_vec4) ? 0 : 1;\n\tError += sizeof(glm::dvec4) == sizeof(glm::lowp_dvec4) ? 0 : 1;\n\tError += sizeof(glm::dvec4) == sizeof(glm::mediump_dvec4) ? 0 : 1;\n\tError += sizeof(glm::dvec4) == sizeof(glm::highp_dvec4) ? 0 : 1;\n\tError += 32 == sizeof(glm::highp_dvec4) ? 0 : 1;\n\tError += glm::vec4().length() == 4 ? 0 : 1;\n\tError += glm::dvec4().length() == 4 ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_vec4_swizzle_partial()\n{\n\tint Error = 0;\n\n\tglm::vec4 A(1, 2, 3, 4);\n\n#\tif GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_SWIZZLE_RELAX)\n\t{\n\t\tglm::vec4 B(A.xy, A.zw);\n\t\tError += A == B ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(A.xy, 3.0f, 4.0f);\n\t\tError += A == B ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(1.0f, A.yz, 4.0f);\n\t\tError += A == B ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(1.0f, 2.0f, A.zw);\n\t\tError += A == B ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 B(A.xyz, 4.0f);\n\t\tError += A == B ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(1.0f, A.yzw);\n\t\tError += A == B ? 0 : 1;\n\t}\n#\tendif\n\n\treturn Error;\n}\n\nint test_operator_increment()\n{\n\tint Error(0);\n\n\tglm::ivec4 v0(1);\n\tglm::ivec4 v1(v0);\n\tglm::ivec4 v2(v0);\n\tglm::ivec4 v3 = ++v1;\n\tglm::ivec4 v4 = v2++;\n\n\tError += glm::all(glm::equal(v0, v4)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v2)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v3)) ? 0 : 1;\n\n\tint i0(1);\n\tint i1(i0);\n\tint i2(i0);\n\tint i3 = ++i1;\n\tint i4 = i2++;\n\n\tError += i0 == i4 ? 0 : 1;\n\tError += i1 == i2 ? 0 : 1;\n\tError += i1 == i3 ? 0 : 1;\n\n\treturn Error;\n}\n\nnamespace heap\n{\n\tstruct A\n\t{\n\t\tfloat f;\n\t};\n\n\tstruct B : public A\n\t{\n\t\tfloat g;\n\t\tglm::vec4 v;\n\t};\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tA* p = new B;\n\t\tp->f = 0.f;\n\t\tdelete p;\n\n\t\tError += sizeof(B) == (sizeof(glm::vec4) + sizeof(float) * 2) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace heap\n\nint test_vec4_simd()\n{\n\tint Error = 0;\n\n\tglm::vec4 const a(std::clock(), std::clock(), std::clock(), std::clock());\n\tglm::vec4 const b(std::clock(), std::clock(), std::clock(), std::clock());\n\n\tglm::vec4 const c(b * a);\n\tglm::vec4 const d(a + c);\n\n\tError += glm::all(glm::greaterThanEqual(d, glm::vec4(0))) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_vec4_ctor();\n\tError += test_bvec4_ctor();\n\tError += test_vec4_size();\n\tError += test_vec4_operators();\n\tError += test_vec4_equal();\n\tError += test_vec4_swizzle_partial();\n\tError += test_vec4_simd();\n\tError += test_operator_increment();\n\tError += heap::test();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_force_unrestricted_gentype.cpp",
    "content": "#define GLM_FORCE_UNRESTRICTED_GENTYPE\n\n#include <glm/glm.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_common.cpp",
    "content": "#define GLM_FORCE_EXPLICIT_CTOR\n#include <glm/common.hpp>\n#include <glm/gtc/constants.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <glm/gtc/random.hpp>\n#include <vector>\n#include <cstdio>\n#include <cmath>\n#include <ctime>\n\n// This file has divisions by zero to test isnan\n#if GLM_COMPILER & GLM_COMPILER_VC\n#\tpragma warning(disable : 4723)\n#endif\n\nnamespace floor_\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\n\t\t{\n\t\t\tfloat A = 1.1f;\n\t\t\tfloat B = glm::floor(A);\n\t\t\tError += glm::epsilonEqual(B, 1.f, 0.0001f) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tdouble A = 1.1;\n\t\t\tdouble B = glm::floor(A);\n\t\t\tError += glm::epsilonEqual(B, 1.0, 0.0001) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec1 A(1.1f);\n\t\t\tglm::vec1 B = glm::floor(A);\n\n\t\t\tError += glm::all(glm::epsilonEqual(B, glm::vec1(1.0), 0.0001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::dvec1 A(1.1);\n\t\t\tglm::dvec1 B = glm::floor(A);\n\n\t\t\tError += glm::all(glm::epsilonEqual(B, glm::dvec1(1.0), 0.0001)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec2 A(1.1f);\n\t\t\tglm::vec2 B = glm::floor(A);\n\n\t\t\tError += glm::all(glm::epsilonEqual(B, glm::vec2(1.0), 0.0001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::dvec2 A(1.1);\n\t\t\tglm::dvec2 B = glm::floor(A);\n\n\t\t\tError += glm::all(glm::epsilonEqual(B, glm::dvec2(1.0), 0.0001)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec3 A(1.1f);\n\t\t\tglm::vec3 B = glm::floor(A);\n\n\t\t\tError += glm::all(glm::epsilonEqual(B, glm::vec3(1.0), 0.0001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::dvec3 A(1.1);\n\t\t\tglm::dvec3 B = glm::floor(A);\n\n\t\t\tError += glm::all(glm::epsilonEqual(B, glm::dvec3(1.0), 0.0001)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 A(1.1f);\n\t\t\tglm::vec4 B = glm::floor(A);\n\n\t\t\tError += glm::all(glm::epsilonEqual(B, glm::vec4(1.0), 0.0001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::dvec4 A(1.1);\n\t\t\tglm::dvec4 B = glm::floor(A);\n\n\t\t\tError += glm::all(glm::epsilonEqual(B, glm::dvec4(1.0), 0.0001)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace floor\n\nnamespace modf_\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\n\t\t{\n\t\t\tfloat X(1.5f);\n\t\t\tfloat I(0.0f);\n\t\t\tfloat A = glm::modf(X, I);\n\n\t\t\tError += I == 1.0f ? 0 : 1;\n\t\t\tError += A == 0.5f ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 X(1.1f, 1.2f, 1.5f, 1.7f);\n\t\t\tglm::vec4 I(0.0f);\n\t\t\tglm::vec4 A = glm::modf(X, I);\n\n\t\t\tError += I == glm::vec4(1.0f) ? 0 : 1;\n\t\t\tError += glm::all(glm::epsilonEqual(A, glm::vec4(0.1f, 0.2f, 0.5f, 0.7f), 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::dvec4 X(1.1, 1.2, 1.5, 1.7);\n\t\t\tglm::dvec4 I(0.0);\n\t\t\tglm::dvec4 A = glm::modf(X, I);\n\n\t\t\tError += I == glm::dvec4(1.0) ? 0 : 1;\n\t\t\tError += glm::all(glm::epsilonEqual(A, glm::dvec4(0.1, 0.2, 0.5, 0.7), 0.000000001)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tdouble X(1.5);\n\t\t\tdouble I(0.0);\n\t\t\tdouble A = glm::modf(X, I);\n\n\t\t\tError += I == 1.0 ? 0 : 1;\n\t\t\tError += A == 0.5 ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace modf\n\nnamespace mod_\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\n\t\t{\n\t\t\tfloat A(1.5f);\n\t\t\tfloat B(1.0f);\n\t\t\tfloat C = glm::mod(A, B);\n\n\t\t\tError += glm::abs(C - 0.5f) < 0.00001f ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tfloat A(-0.2f);\n\t\t\tfloat B(1.0f);\n\t\t\tfloat C = glm::mod(A, B);\n\n\t\t\tError += glm::abs(C - 0.8f) < 0.00001f ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tfloat A(3.0);\n\t\t\tfloat B(2.0f);\n\t\t\tfloat C = glm::mod(A, B);\n\n\t\t\tError += glm::abs(C - 1.0f) < 0.00001f ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 A(3.0);\n\t\t\tfloat B(2.0f);\n\t\t\tglm::vec4 C = glm::mod(A, B);\n\n\t\t\tError += glm::all(glm::epsilonEqual(C, glm::vec4(1.0f), 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 A(3.0);\n\t\t\tglm::vec4 B(2.0f);\n\t\t\tglm::vec4 C = glm::mod(A, B);\n\n\t\t\tError += glm::all(glm::epsilonEqual(C, glm::vec4(1.0f), 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace mod_\n\nnamespace floatBitsToInt\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\t\n\t\t{\n\t\t\tfloat A = 1.0f;\n\t\t\tint B = glm::floatBitsToInt(A);\n\t\t\tfloat C = glm::intBitsToFloat(B);\n\t\t\tError += glm::epsilonEqual(A, C, 0.0001f) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec2 A(1.0f, 2.0f);\n\t\t\tglm::ivec2 B = glm::floatBitsToInt(A);\n\t\t\tglm::vec2 C = glm::intBitsToFloat(B);\n\t\t\tError += glm::all(glm::epsilonEqual(A, C, 0.0001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\t\tglm::ivec3 B = glm::floatBitsToInt(A);\n\t\t\tglm::vec3 C = glm::intBitsToFloat(B);\n\t\t\tError += glm::all(glm::epsilonEqual(A, C, 0.0001f)) ? 0 : 1;\n\t\t}\n\t\n\t\t{\n\t\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\t\tglm::ivec4 B = glm::floatBitsToInt(A);\n\t\t\tglm::vec4 C = glm::intBitsToFloat(B);\n\t\t\tError += glm::all(glm::epsilonEqual(A, C, 0.0001f)) ? 0 : 1;\n\t\t}\n\t\n\t\treturn Error;\n\t}\n}//namespace floatBitsToInt\n\nnamespace floatBitsToUint\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\t\n\t\t{\n\t\t\tfloat A = 1.0f;\n\t\t\tglm::uint B = glm::floatBitsToUint(A);\n\t\t\tfloat C = glm::intBitsToFloat(B);\n\t\t\tError += glm::epsilonEqual(A, C, 0.0001f) ? 0 : 1;\n\t\t}\n\t\n\t\t{\n\t\t\tglm::vec2 A(1.0f, 2.0f);\n\t\t\tglm::uvec2 B = glm::floatBitsToUint(A);\n\t\t\tglm::vec2 C = glm::uintBitsToFloat(B);\n\t\t\tError += glm::all(glm::epsilonEqual(A, C, 0.0001f)) ? 0 : 1;\n\t\t}\n\t\n\t\t{\n\t\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\t\tglm::uvec3 B = glm::floatBitsToUint(A);\n\t\t\tglm::vec3 C = glm::uintBitsToFloat(B);\n\t\t\tError += glm::all(glm::epsilonEqual(A, C, 0.0001f)) ? 0 : 1;\n\t\t}\n\t\n\t\t{\n\t\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\t\tglm::uvec4 B = glm::floatBitsToUint(A);\n\t\t\tglm::vec4 C = glm::uintBitsToFloat(B);\n\t\t\tError += glm::all(glm::epsilonEqual(A, C, 0.0001f)) ? 0 : 1;\n\t\t}\n\t\n\t\treturn Error;\n\t}\n}//namespace floatBitsToUint\n\nnamespace min_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::vec1 A0 = glm::min(glm::vec1(1), glm::vec1(1));\n\n\t\tglm::vec2 B0 = glm::min(glm::vec2(1), glm::vec2(1));\n\t\tglm::vec2 B1 = glm::min(glm::vec2(1), 1.0f);\n\t\tbool B2 = glm::all(glm::equal(B0, B1));\n\t\tError += B2 ? 0 : 1;\n\n\t\tglm::vec3 C0 = glm::min(glm::vec3(1), glm::vec3(1));\n\t\tglm::vec3 C1 = glm::min(glm::vec3(1), 1.0f);\n\t\tbool C2 = glm::all(glm::equal(C0, C1));\n\t\tError += C2 ? 0 : 1;\n\n\t\tglm::vec4 D0 = glm::min(glm::vec4(1), glm::vec4(1));\n\t\tglm::vec4 D1 = glm::min(glm::vec4(1), 1.0f);\n\t\tbool D2 = glm::all(glm::equal(D0, D1));\n\t\tError += D2 ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace min_\n\nnamespace max_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::vec1 A0 = glm::max(glm::vec1(1), glm::vec1(1));\n\n\t\tglm::vec2 B0 = glm::max(glm::vec2(1), glm::vec2(1));\n\t\tglm::vec2 B1 = glm::max(glm::vec2(1), 1.0f);\n\t\tbool B2 = glm::all(glm::equal(B0, B1));\n\t\tError += B2 ? 0 : 1;\n\n\t\tglm::vec3 C0 = glm::max(glm::vec3(1), glm::vec3(1));\n\t\tglm::vec3 C1 = glm::max(glm::vec3(1), 1.0f);\n\t\tbool C2 = glm::all(glm::equal(C0, C1));\n\t\tError += C2 ? 0 : 1;\n\n\t\tglm::vec4 D0 = glm::max(glm::vec4(1), glm::vec4(1));\n\t\tglm::vec4 D1 = glm::max(glm::vec4(1), 1.0f);\n\t\tbool D2 = glm::all(glm::equal(D0, D1));\n\t\tError += D2 ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace max_\n\nnamespace clamp_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\treturn Error;\n\t}\n}//namespace clamp_\n\nnamespace mix_\n{\n\ttemplate<typename T, typename B>\n\tstruct entry\n\t{\n\t\tT x;\n\t\tT y;\n\t\tB a;\n\t\tT Result;\n\t};\n\n\tentry<float, bool> const TestBool[] =\n\t{\n\t\t{0.0f, 1.0f, false, 0.0f},\n\t\t{0.0f, 1.0f, true, 1.0f},\n\t\t{-1.0f, 1.0f, false, -1.0f},\n\t\t{-1.0f, 1.0f, true, 1.0f}\n\t};\n\n\tentry<float, float> const TestFloat[] =\n\t{\n\t\t{0.0f, 1.0f, 0.0f, 0.0f},\n\t\t{0.0f, 1.0f, 1.0f, 1.0f},\n\t\t{-1.0f, 1.0f, 0.0f, -1.0f},\n\t\t{-1.0f, 1.0f, 1.0f, 1.0f}\n\t};\n\n\tentry<glm::vec2, bool> const TestVec2Bool[] =\n\t{\n\t\t{glm::vec2(0.0f), glm::vec2(1.0f), false, glm::vec2(0.0f)},\n\t\t{glm::vec2(0.0f), glm::vec2(1.0f), true, glm::vec2(1.0f)},\n\t\t{glm::vec2(-1.0f), glm::vec2(1.0f), false, glm::vec2(-1.0f)},\n\t\t{glm::vec2(-1.0f), glm::vec2(1.0f), true, glm::vec2(1.0f)}\n\t};\n\n\tentry<glm::vec2, glm::bvec2> const TestBVec2[] =\n\t{\n\t\t{glm::vec2(0.0f), glm::vec2(1.0f), glm::bvec2(false), glm::vec2(0.0f)},\n\t\t{glm::vec2(0.0f), glm::vec2(1.0f), glm::bvec2(true), glm::vec2(1.0f)},\n\t\t{glm::vec2(-1.0f), glm::vec2(1.0f), glm::bvec2(false), glm::vec2(-1.0f)},\n\t\t{glm::vec2(-1.0f), glm::vec2(1.0f), glm::bvec2(true), glm::vec2(1.0f)},\n\t\t{glm::vec2(-1.0f), glm::vec2(1.0f), glm::bvec2(true, false), glm::vec2(1.0f, -1.0f)}\n\t};\n\n\tentry<glm::vec3, bool> const TestVec3Bool[] =\n\t{\n\t\t{glm::vec3(0.0f), glm::vec3(1.0f), false, glm::vec3(0.0f)},\n\t\t{glm::vec3(0.0f), glm::vec3(1.0f), true, glm::vec3(1.0f)},\n\t\t{glm::vec3(-1.0f), glm::vec3(1.0f), false, glm::vec3(-1.0f)},\n\t\t{glm::vec3(-1.0f), glm::vec3(1.0f), true, glm::vec3(1.0f)}\n\t};\n\n\tentry<glm::vec3, glm::bvec3> const TestBVec3[] =\n\t{\n\t\t{glm::vec3(0.0f), glm::vec3(1.0f), glm::bvec3(false), glm::vec3(0.0f)},\n\t\t{glm::vec3(0.0f), glm::vec3(1.0f), glm::bvec3(true), glm::vec3(1.0f)},\n\t\t{glm::vec3(-1.0f), glm::vec3(1.0f), glm::bvec3(false), glm::vec3(-1.0f)},\n\t\t{glm::vec3(-1.0f), glm::vec3(1.0f), glm::bvec3(true), glm::vec3(1.0f)},\n\t\t{glm::vec3(1.0f, 2.0f, 3.0f), glm::vec3(4.0f, 5.0f, 6.0f), glm::bvec3(true, false, true), glm::vec3(4.0f, 2.0f, 6.0f)}\n\t};\n\n\tentry<glm::vec4, bool> const TestVec4Bool[] = \n\t{\n\t\t{glm::vec4(0.0f), glm::vec4(1.0f), false, glm::vec4(0.0f)},\n\t\t{glm::vec4(0.0f), glm::vec4(1.0f), true, glm::vec4(1.0f)},\n\t\t{glm::vec4(-1.0f), glm::vec4(1.0f), false, glm::vec4(-1.0f)},\n\t\t{glm::vec4(-1.0f), glm::vec4(1.0f), true, glm::vec4(1.0f)}\n\t};\n\n\tentry<glm::vec4, glm::bvec4> const TestBVec4[] = \n\t{\n\t\t{glm::vec4(0.0f, 0.0f, 1.0f, 1.0f), glm::vec4(2.0f, 2.0f, 3.0f, 3.0f), glm::bvec4(false, true, false, true), glm::vec4(0.0f, 2.0f, 1.0f, 3.0f)},\n\t\t{glm::vec4(0.0f), glm::vec4(1.0f), glm::bvec4(true), glm::vec4(1.0f)},\n\t\t{glm::vec4(-1.0f), glm::vec4(1.0f), glm::bvec4(false), glm::vec4(-1.0f)},\n\t\t{glm::vec4(-1.0f), glm::vec4(1.0f), glm::bvec4(true), glm::vec4(1.0f)},\n\t\t{glm::vec4(1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(5.0f, 6.0f, 7.0f, 8.0f), glm::bvec4(true, false, true, false), glm::vec4(5.0f, 2.0f, 7.0f, 4.0f)}\n\t};\n\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\t// Float with bool\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < sizeof(TestBool) / sizeof(entry<float, bool>); ++i)\n\t\t\t{\n\t\t\t\tfloat Result = glm::mix(TestBool[i].x, TestBool[i].y, TestBool[i].a);\n\t\t\t\tError += glm::epsilonEqual(Result, TestBool[i].Result, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\t// Float with float\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < sizeof(TestFloat) / sizeof(entry<float, float>); ++i)\n\t\t\t{\n\t\t\t\tfloat Result = glm::mix(TestFloat[i].x, TestFloat[i].y, TestFloat[i].a);\n\t\t\t\tError += glm::epsilonEqual(Result, TestFloat[i].Result, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\t// vec2 with bool\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < sizeof(TestVec2Bool) / sizeof(entry<glm::vec2, bool>); ++i)\n\t\t\t{\n\t\t\t\tglm::vec2 Result = glm::mix(TestVec2Bool[i].x, TestVec2Bool[i].y, TestVec2Bool[i].a);\n\t\t\t\tError += glm::epsilonEqual(Result.x, TestVec2Bool[i].Result.x, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.y, TestVec2Bool[i].Result.y, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\t// vec2 with bvec2\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < sizeof(TestBVec2) / sizeof(entry<glm::vec2, glm::bvec2>); ++i)\n\t\t\t{\n\t\t\t\tglm::vec2 Result = glm::mix(TestBVec2[i].x, TestBVec2[i].y, TestBVec2[i].a);\n\t\t\t\tError += glm::epsilonEqual(Result.x, TestBVec2[i].Result.x, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.y, TestBVec2[i].Result.y, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\t// vec3 with bool\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < sizeof(TestVec3Bool) / sizeof(entry<glm::vec3, bool>); ++i)\n\t\t\t{\n\t\t\t\tglm::vec3 Result = glm::mix(TestVec3Bool[i].x, TestVec3Bool[i].y, TestVec3Bool[i].a);\n\t\t\t\tError += glm::epsilonEqual(Result.x, TestVec3Bool[i].Result.x, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.y, TestVec3Bool[i].Result.y, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.z, TestVec3Bool[i].Result.z, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\t// vec3 with bvec3\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < sizeof(TestBVec3) / sizeof(entry<glm::vec3, glm::bvec3>); ++i)\n\t\t\t{\n\t\t\t\tglm::vec3 Result = glm::mix(TestBVec3[i].x, TestBVec3[i].y, TestBVec3[i].a);\n\t\t\t\tError += glm::epsilonEqual(Result.x, TestBVec3[i].Result.x, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.y, TestBVec3[i].Result.y, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.z, TestBVec3[i].Result.z, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\t// vec4 with bool\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < sizeof(TestVec4Bool) / sizeof(entry<glm::vec4, bool>); ++i)\n\t\t\t{\n\t\t\t\tglm::vec4 Result = glm::mix(TestVec4Bool[i].x, TestVec4Bool[i].y, TestVec4Bool[i].a);\n\t\t\t\tError += glm::epsilonEqual(Result.x, TestVec4Bool[i].Result.x, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.y, TestVec4Bool[i].Result.y, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.z, TestVec4Bool[i].Result.z, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.w, TestVec4Bool[i].Result.w, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\t// vec4 with bvec4\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < sizeof(TestBVec4) / sizeof(entry<glm::vec4, glm::bvec4>); ++i)\n\t\t\t{\n\t\t\t\tglm::vec4 Result = glm::mix(TestBVec4[i].x, TestBVec4[i].y, TestBVec4[i].a);\n\t\t\t\tError += glm::epsilonEqual(Result.x, TestBVec4[i].Result.x, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.y, TestBVec4[i].Result.y, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.z, TestBVec4[i].Result.z, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t\tError += glm::epsilonEqual(Result.w, TestBVec4[i].Result.w, glm::epsilon<float>()) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace mix_\n\nnamespace step_\n{\n\ttemplate<typename EDGE, typename VEC>\n\tstruct entry\n\t{\n\t\tEDGE edge;\n\t\tVEC x;\n\t\tVEC result;\n\t};\n\n\tentry<float, glm::vec4> TestVec4Scalar [] =\n\t{\n\t\t{ 1.0f, glm::vec4(1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(1.0f) },\n\t\t{ 0.0f, glm::vec4(1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(1.0f) },\n\t\t{ 0.0f, glm::vec4(-1.0f, -2.0f, -3.0f, -4.0f), glm::vec4(0.0f) }\n\t};\n\n\tentry<glm::vec4, glm::vec4> TestVec4Vector [] =\n\t{\n\t\t{ glm::vec4(-1.0f, -2.0f, -3.0f, -4.0f), glm::vec4(-2.0f, -3.0f, -4.0f, -5.0f), glm::vec4(0.0f) },\n\t\t{ glm::vec4( 0.0f, 1.0f, 2.0f, 3.0f), glm::vec4( 1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(1.0f) },\n\t\t{ glm::vec4( 2.0f, 3.0f, 4.0f, 5.0f), glm::vec4( 1.0f, 2.0f, 3.0f, 4.0f), glm::vec4(0.0f) },\n\t\t{ glm::vec4( 0.0f, 1.0f, 2.0f, 3.0f), glm::vec4(-1.0f,-2.0f,-3.0f,-4.0f), glm::vec4(0.0f) }\n\t};\n\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\t// scalar\n\t\t{\n\t\t\tfloat const Edge = 2.0f;\n\n\t\t\tfloat const A = glm::step(Edge, 1.0f);\n\t\t\tError += glm::epsilonEqual(A, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\n\t\t\tfloat const B = glm::step(Edge, 3.0f);\n\t\t\tError += glm::epsilonEqual(B, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\n\t\t\tfloat const C = glm::step(Edge, 2.0f);\n\t\t\tError += glm::epsilonEqual(C, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\n\t\t// vec4 and float\n\t\t{\n\t\t\tfor (std::size_t i = 0; i < sizeof(TestVec4Scalar) / sizeof(entry<float, glm::vec4>); ++i)\n\t\t\t{\n\t\t\t\tglm::vec4 Result = glm::step(TestVec4Scalar[i].edge, TestVec4Scalar[i].x);\n\t\t\t\tError += glm::all(glm::epsilonEqual(Result, TestVec4Scalar[i].result, glm::epsilon<float>())) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\t// vec4 and vec4\n\t\t{\n\t\t\tfor (std::size_t i = 0; i < sizeof(TestVec4Vector) / sizeof(entry<glm::vec4, glm::vec4>); ++i)\n\t\t\t{\n\t\t\t\tglm::vec4 Result = glm::step(TestVec4Vector[i].edge, TestVec4Vector[i].x);\n\t\t\t\tError += glm::all(glm::epsilonEqual(Result, TestVec4Vector[i].result, glm::epsilon<float>())) ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace step_\n\nnamespace round_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\t{\n\t\t\tfloat A = glm::round(0.0f);\n\t\t\tError += glm::epsilonEqual(A, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat B = glm::round(0.5f);\n\t\t\tError += glm::epsilonEqual(B, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat C = glm::round(1.0f);\n\t\t\tError += glm::epsilonEqual(C, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat D = glm::round(0.1f);\n\t\t\tError += glm::epsilonEqual(D, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat E = glm::round(0.9f);\n\t\t\tError += glm::epsilonEqual(E, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat F = glm::round(1.5f);\n\t\t\tError += glm::epsilonEqual(F, 2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat G = glm::round(1.9f);\n\t\t\tError += glm::epsilonEqual(G, 2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\t\n\t\t{\n\t\t\tfloat A = glm::round(-0.0f);\n\t\t\tError += glm::epsilonEqual(A, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat B = glm::round(-0.5f);\n\t\t\tError += glm::epsilonEqual(B, -1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat C = glm::round(-1.0f);\n\t\t\tError += glm::epsilonEqual(C, -1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat D = glm::round(-0.1f);\n\t\t\tError += glm::epsilonEqual(D, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat E = glm::round(-0.9f);\n\t\t\tError += glm::epsilonEqual(E, -1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat F = glm::round(-1.5f);\n\t\t\tError += glm::epsilonEqual(F, -2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat G = glm::round(-1.9f);\n\t\t\tError += glm::epsilonEqual(G, -2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\t\n\t\treturn Error;\n\t}\n}//namespace round_\n\nnamespace roundEven\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\t{\n\t\t\tfloat A1 = glm::roundEven(-1.5f);\n\t\t\tError += glm::epsilonEqual(A1, -2.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat A2 = glm::roundEven(1.5f);\n\t\t\tError += glm::epsilonEqual(A2, 2.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat A5 = glm::roundEven(-2.5f);\n\t\t\tError += glm::epsilonEqual(A5, -2.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat A6 = glm::roundEven(2.5f);\n\t\t\tError += glm::epsilonEqual(A6, 2.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat A3 = glm::roundEven(-3.5f);\n\t\t\tError += glm::epsilonEqual(A3, -4.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat A4 = glm::roundEven(3.5f);\n\t\t\tError += glm::epsilonEqual(A4, 4.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat C7 = glm::roundEven(-4.5f);\n\t\t\tError += glm::epsilonEqual(C7, -4.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat C8 = glm::roundEven(4.5f);\n\t\t\tError += glm::epsilonEqual(C8, 4.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat C1 = glm::roundEven(-5.5f);\n\t\t\tError += glm::epsilonEqual(C1, -6.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat C2 = glm::roundEven(5.5f);\n\t\t\tError += glm::epsilonEqual(C2, 6.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat C3 = glm::roundEven(-6.5f);\n\t\t\tError += glm::epsilonEqual(C3, -6.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat C4 = glm::roundEven(6.5f);\n\t\t\tError += glm::epsilonEqual(C4, 6.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat C5 = glm::roundEven(-7.5f);\n\t\t\tError += glm::epsilonEqual(C5, -8.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat C6 = glm::roundEven(7.5f);\n\t\t\tError += glm::epsilonEqual(C6, 8.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tError += 0;\n\t\t}\n\n\t\t{\n\t\t\tfloat A7 = glm::roundEven(-2.4f);\n\t\t\tError += glm::epsilonEqual(A7, -2.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat A8 = glm::roundEven(2.4f);\n\t\t\tError += glm::epsilonEqual(A8, 2.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat B1 = glm::roundEven(-2.6f);\n\t\t\tError += glm::epsilonEqual(B1, -3.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat B2 = glm::roundEven(2.6f);\n\t\t\tError += glm::epsilonEqual(B2, 3.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat B3 = glm::roundEven(-2.0f);\n\t\t\tError += glm::epsilonEqual(B3, -2.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tfloat B4 = glm::roundEven(2.0f);\n\t\t\tError += glm::epsilonEqual(B4, 2.0f, 0.0001f) ? 0 : 1;\n\n\t\t\tError += 0;\n\t\t}\n\n\t\t{\n\t\t\tfloat A = glm::roundEven(0.0f);\n\t\t\tError += glm::epsilonEqual(A, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat B = glm::roundEven(0.5f);\n\t\t\tError += glm::epsilonEqual(B, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat C = glm::roundEven(1.0f);\n\t\t\tError += glm::epsilonEqual(C, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat D = glm::roundEven(0.1f);\n\t\t\tError += glm::epsilonEqual(D, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat E = glm::roundEven(0.9f);\n\t\t\tError += glm::epsilonEqual(E, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat F = glm::roundEven(1.5f);\n\t\t\tError += glm::epsilonEqual(F, 2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat G = glm::roundEven(1.9f);\n\t\t\tError += glm::epsilonEqual(G, 2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tfloat A = glm::roundEven(-0.0f);\n\t\t\tError += glm::epsilonEqual(A,  0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat B = glm::roundEven(-0.5f);\n\t\t\tError += glm::epsilonEqual(B, -0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat C = glm::roundEven(-1.0f);\n\t\t\tError += glm::epsilonEqual(C, -1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat D = glm::roundEven(-0.1f);\n\t\t\tError += glm::epsilonEqual(D,  0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat E = glm::roundEven(-0.9f);\n\t\t\tError += glm::epsilonEqual(E, -1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat F = glm::roundEven(-1.5f);\n\t\t\tError += glm::epsilonEqual(F, -2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat G = glm::roundEven(-1.9f);\n\t\t\tError += glm::epsilonEqual(G, -2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tfloat A = glm::roundEven(1.5f);\n\t\t\tError += glm::epsilonEqual(A, 2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat B = glm::roundEven(2.5f);\n\t\t\tError += glm::epsilonEqual(B, 2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat C = glm::roundEven(3.5f);\n\t\t\tError += glm::epsilonEqual(C, 4.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat D = glm::roundEven(4.5f);\n\t\t\tError += glm::epsilonEqual(D, 4.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat E = glm::roundEven(5.5f);\n\t\t\tError += glm::epsilonEqual(E, 6.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat F = glm::roundEven(6.5f);\n\t\t\tError += glm::epsilonEqual(F, 6.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat G = glm::roundEven(7.5f);\n\t\t\tError += glm::epsilonEqual(G, 8.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\t\n\t\t{\n\t\t\tfloat A = glm::roundEven(-1.5f);\n\t\t\tError += glm::epsilonEqual(A, -2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat B = glm::roundEven(-2.5f);\n\t\t\tError += glm::epsilonEqual(B, -2.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat C = glm::roundEven(-3.5f);\n\t\t\tError += glm::epsilonEqual(C, -4.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat D = glm::roundEven(-4.5f);\n\t\t\tError += glm::epsilonEqual(D, -4.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat E = glm::roundEven(-5.5f);\n\t\t\tError += glm::epsilonEqual(E, -6.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat F = glm::roundEven(-6.5f);\n\t\t\tError += glm::epsilonEqual(F, -6.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tfloat G = glm::roundEven(-7.5f);\n\t\t\tError += glm::epsilonEqual(G, -8.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace roundEven\n\nnamespace isnan_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tfloat Zero_f = 0.0;\n\t\tdouble Zero_d = 0.0;\n\n\t\t{\n\t\t\tError += true == glm::isnan(0.0/Zero_d) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isnan(glm::dvec2(0.0 / Zero_d))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isnan(glm::dvec3(0.0 / Zero_d))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isnan(glm::dvec4(0.0 / Zero_d))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tError += true == glm::isnan(0.0f/Zero_f) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isnan(glm::vec2(0.0f/Zero_f))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isnan(glm::vec3(0.0f/Zero_f))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isnan(glm::vec4(0.0f/Zero_f))) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace isnan_\n\nnamespace isinf_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tfloat Zero_f = 0.0;\n\t\tdouble Zero_d = 0.0;\n\n\t\t{\n\t\t\tError += true == glm::isinf( 1.0/Zero_d) ? 0 : 1;\n\t\t\tError += true == glm::isinf(-1.0/Zero_d) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::dvec2( 1.0/Zero_d))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::dvec2(-1.0/Zero_d))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::dvec3( 1.0/Zero_d))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::dvec3(-1.0/Zero_d))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::dvec4( 1.0/Zero_d))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::dvec4(-1.0/Zero_d))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tError += true == glm::isinf( 1.0f/Zero_f) ? 0 : 1;\n\t\t\tError += true == glm::isinf(-1.0f/Zero_f) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::vec2( 1.0f/Zero_f))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::vec2(-1.0f/Zero_f))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::vec3( 1.0f/Zero_f))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::vec3(-1.0f/Zero_f))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::vec4( 1.0f/Zero_f))) ? 0 : 1;\n\t\t\tError += true == glm::any(glm::isinf(glm::vec4(-1.0f/Zero_f))) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace isinf_\n\nnamespace sign\n{\n\ttemplate<typename genFIType> \n\tGLM_FUNC_QUALIFIER genFIType sign_if(genFIType x)\n\t{\n\t\tGLM_STATIC_ASSERT(\n\t\t\tstd::numeric_limits<genFIType>::is_iec559 ||\n\t\t\t(std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer), \"'sign' only accept signed inputs\");\n\n\t\tgenFIType result;\n\t\tif(x > genFIType(0))\n\t\t\tresult = genFIType(1);\n\t\telse if(x < genFIType(0))\n\t\t\tresult = genFIType(-1);\n\t\telse\n\t\t\tresult = genFIType(0);\n\t\treturn result;\n\t}\n\n\ttemplate<typename genFIType> \n\tGLM_FUNC_QUALIFIER genFIType sign_alu1(genFIType x)\n\t{\n\t\tGLM_STATIC_ASSERT(\n\t\t\tstd::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer, \n\t\t\t\"'sign' only accept integer inputs\");\n\n\t\treturn (x >> 31) | (static_cast<unsigned>(-x) >> 31);\n\t}\n\n\tGLM_FUNC_QUALIFIER int sign_alu2(int x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<int>::is_signed && std::numeric_limits<int>::is_integer, \"'sign' only accept integer inputs\");\n\n#\t\tif GLM_COMPILER & GLM_COMPILER_VC\n#\t\t\tpragma warning(push)\n#\t\t\tpragma warning(disable : 4146) //cast truncates constant value\n#\t\tendif\n\n\t\treturn -(static_cast<unsigned>(x) >> 31) | (-static_cast<unsigned>(x) >> 31);\n\n#\t\tif GLM_COMPILER & GLM_COMPILER_VC\n#\t\t\tpragma warning(pop)\n#\t\tendif\n\t}\n\n\ttemplate<typename genFIType> \n\tGLM_FUNC_QUALIFIER genFIType sign_sub(genFIType x)\n\t{\n\t\tGLM_STATIC_ASSERT(\n\t\t\tstd::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer, \n\t\t\t\"'sign' only accept integer inputs\");\n\n\t\treturn (static_cast<unsigned>(-x) >> 31) - (static_cast<unsigned>(x) >> 31);\n\t}\n\n\ttemplate<typename genFIType> \n\tGLM_FUNC_QUALIFIER genFIType sign_cmp(genFIType x)\n\t{\n\t\tGLM_STATIC_ASSERT(\n\t\t\tstd::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer, \n\t\t\t\"'sign' only accept integer inputs\");\n\n\t\treturn (x > 0) - (x < 0);\n\t}\n\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tgenType\t\tReturn;\n\t};\n\n\tint test_int32()\n\t{\n\t\ttype<glm::int32> const Data[] =\n\t\t{\n\t\t\t{ std::numeric_limits<glm::int32>::max(),  1},\n\t\t\t{ std::numeric_limits<glm::int32>::min(), -1},\n\t\t\t{ 0, 0},\n\t\t\t{ 1, 1},\n\t\t\t{ 2, 1},\n\t\t\t{ 3, 1},\n\t\t\t{-1,-1},\n\t\t\t{-2,-1},\n\t\t\t{-3,-1}\n\t\t};\n\n\t\tint Error = 0;\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)\n\t\t{\n\t\t\tglm::int32 Result = glm::sign(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)\n\t\t{\n\t\t\tglm::int32 Result = sign_cmp(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)\n\t\t{\n\t\t\tglm::int32 Result = sign_if(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)\n\t\t{\n\t\t\tglm::int32 Result = sign_alu1(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::int32>); ++i)\n\t\t{\n\t\t\tglm::int32 Result = sign_alu2(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test_i32vec4()\n\t{\n\t\ttype<glm::i32vec4> const Data[] =\n\t\t{\n\t\t\t{glm::i32vec4( 1), glm::i32vec4( 1)},\n\t\t\t{glm::i32vec4( 0), glm::i32vec4( 0)},\n\t\t\t{glm::i32vec4( 2), glm::i32vec4( 1)},\n\t\t\t{glm::i32vec4( 3), glm::i32vec4( 1)},\n\t\t\t{glm::i32vec4(-1), glm::i32vec4(-1)},\n\t\t\t{glm::i32vec4(-2), glm::i32vec4(-1)},\n\t\t\t{glm::i32vec4(-3), glm::i32vec4(-1)}\n\t\t};\n\n\t\tint Error = 0;\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::i32vec4>); ++i)\n\t\t{\n\t\t\tglm::i32vec4 Result = glm::sign(Data[i].Value);\n\t\t\tError += glm::all(glm::equal(Data[i].Return, Result)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test_f32vec4()\n\t{\n\t\ttype<glm::vec4> const Data[] =\n\t\t{\n\t\t\t{glm::vec4( 1), glm::vec4( 1)},\n\t\t\t{glm::vec4( 0), glm::vec4( 0)},\n\t\t\t{glm::vec4( 2), glm::vec4( 1)},\n\t\t\t{glm::vec4( 3), glm::vec4( 1)},\n\t\t\t{glm::vec4(-1), glm::vec4(-1)},\n\t\t\t{glm::vec4(-2), glm::vec4(-1)},\n\t\t\t{glm::vec4(-3), glm::vec4(-1)}\n\t\t};\n\n\t\tint Error = 0;\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::vec4>); ++i)\n\t\t{\n\t\t\tglm::vec4 Result = glm::sign(Data[i].Value);\n\t\t\tError += glm::all(glm::equal(Data[i].Return, Result)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tError += test_int32();\n\t\tError += test_i32vec4();\n\t\tError += test_f32vec4();\n\n\t\treturn Error;\n\t}\n\n\tint perf_rand(std::size_t Samples)\n\t{\n\t\tint Error = 0;\n\n\t\tstd::size_t const Count = Samples;\n\t\tstd::vector<glm::int32> Input, Output;\n\t\tInput.resize(Count);\n\t\tOutput.resize(Count);\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tInput[i] = static_cast<glm::int32>(glm::linearRand(-65536.f, 65536.f));\n\n\t\tstd::clock_t Timestamp0 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_cmp(Input[i]);\n\n\t\tstd::clock_t Timestamp1 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_if(Input[i]);\n\n\t\tstd::clock_t Timestamp2 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_alu1(Input[i]);\n\n\t\tstd::clock_t Timestamp3 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_alu2(Input[i]);\n\n\t\tstd::clock_t Timestamp4 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_sub(Input[i]);\n\n\t\tstd::clock_t Timestamp5 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = glm::sign(Input[i]);\n\n\t\tstd::clock_t Timestamp6 = std::clock();\n\n\t\tstd::printf(\"sign_cmp(rand) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp1 - Timestamp0));\n\t\tstd::printf(\"sign_if(rand) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp2 - Timestamp1));\n\t\tstd::printf(\"sign_alu1(rand) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp3 - Timestamp2));\n\t\tstd::printf(\"sign_alu2(rand) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp4 - Timestamp3));\n\t\tstd::printf(\"sign_sub(rand) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp5 - Timestamp4));\n\t\tstd::printf(\"glm::sign(rand) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp6 - Timestamp5));\n\n\t\treturn Error;\n\t}\n\n\tint perf_linear(std::size_t Samples)\n\t{\n\t\tint Error = 0;\n\n\t\tstd::size_t const Count = Samples;\n\t\tstd::vector<glm::int32> Input, Output;\n\t\tInput.resize(Count);\n\t\tOutput.resize(Count);\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tInput[i] = static_cast<glm::int32>(i);\n\n\t\tstd::clock_t Timestamp0 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_cmp(Input[i]);\n\n\t\tstd::clock_t Timestamp1 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_if(Input[i]);\n\n\t\tstd::clock_t Timestamp2 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_alu1(Input[i]);\n\n\t\tstd::clock_t Timestamp3 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_alu2(Input[i]);\n\n\t\tstd::clock_t Timestamp4 = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\tOutput[i] = sign_sub(Input[i]);\n\n\t\tstd::clock_t Timestamp5 = std::clock();\n\n\t\tstd::printf(\"sign_cmp(linear) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp1 - Timestamp0));\n\t\tstd::printf(\"sign_if(linear) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp2 - Timestamp1));\n\t\tstd::printf(\"sign_alu1(linear) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp3 - Timestamp2));\n\t\tstd::printf(\"sign_alu2(linear) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp4 - Timestamp3));\n\t\tstd::printf(\"sign_sub(linear) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp5 - Timestamp4));\n\n\t\treturn Error;\n\t}\n\n\tint perf_linear_cal(std::size_t Samples)\n\t{\n\t\tint Error = 0;\n\n\t\tglm::int32 const Count = static_cast<glm::int32>(Samples);\n\n\t\tstd::clock_t Timestamp0 = std::clock();\n\t\tglm::int32 Sum = 0;\n\n\t\tfor(glm::int32 i = 1; i < Count; ++i)\n\t\t\tSum += sign_cmp(i);\n\n\t\tstd::clock_t Timestamp1 = std::clock();\n\n\t\tfor(glm::int32 i = 1; i < Count; ++i)\n\t\t\tSum += sign_if(i);\n\n\t\tstd::clock_t Timestamp2 = std::clock();\n\n\t\tfor(glm::int32 i = 1; i < Count; ++i)\n\t\t\tSum += sign_alu1(i);\n\n\t\tstd::clock_t Timestamp3 = std::clock();\n\n\t\tfor(glm::int32 i = 1; i < Count; ++i)\n\t\t\tSum += sign_alu2(i);\n\n\t\tstd::clock_t Timestamp4 = std::clock();\n\n\t\tfor(glm::int32 i = 1; i < Count; ++i)\n\t\t\tSum += sign_sub(i);\n\n\t\tstd::clock_t Timestamp5 = std::clock();\n\n\t\tstd::printf(\"Sum %d\\n\", static_cast<unsigned int>(Sum));\n\n\t\tstd::printf(\"sign_cmp(linear_cal) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp1 - Timestamp0));\n\t\tstd::printf(\"sign_if(linear_cal) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp2 - Timestamp1));\n\t\tstd::printf(\"sign_alu1(linear_cal) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp3 - Timestamp2));\n\t\tstd::printf(\"sign_alu2(linear_cal) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp4 - Timestamp3));\n\t\tstd::printf(\"sign_sub(linear_cal) Time %d clocks\\n\", static_cast<unsigned int>(Timestamp5 - Timestamp4));\n\n\t\treturn Error;\n\t}\n\n\tstatic int perf(std::size_t Samples)\n\t{\n\t\tint Error(0);\n\n\t\tError += perf_linear_cal(Samples);\n\t\tError += perf_linear(Samples);\n\t\tError += perf_rand(Samples);\n\n\t\treturn Error;\n\t}\n}//namespace sign\n\nnamespace frexp_\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\n\t\t{\n\t\t\tglm::vec1 x(1024);\n\t\t\tglm::ivec1 exp;\n\t\t\tglm::vec1 A = glm::frexp(x, exp);\n\t\t\tError += glm::all(glm::epsilonEqual(A, glm::vec1(0.5), 0.00001f)) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(exp, glm::ivec1(11))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec2 x(1024, 0.24);\n\t\t\tglm::ivec2 exp;\n\t\t\tglm::vec2 A = glm::frexp(x, exp);\n\t\t\tError += glm::all(glm::epsilonEqual(A, glm::vec2(0.5, 0.96), 0.00001f)) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(exp, glm::ivec2(11, -2))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec3 x(1024, 0.24, 0);\n\t\t\tglm::ivec3 exp;\n\t\t\tglm::vec3 A = glm::frexp(x, exp);\n\t\t\tError += glm::all(glm::epsilonEqual(A, glm::vec3(0.5, 0.96, 0.0), 0.00001f)) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(exp, glm::ivec3(11, -2, 0))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 x(1024, 0.24, 0, -1.33);\n\t\t\tglm::ivec4 exp;\n\t\t\tglm::vec4 A = glm::frexp(x, exp);\n\t\t\tError += glm::all(glm::epsilonEqual(A, glm::vec4(0.5, 0.96, 0.0, -0.665), 0.00001f)) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(exp, glm::ivec4(11, -2, 0, 1))) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace frexp_\n\nnamespace ldexp_\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\n\t\t{\n\t\t\tglm::vec1 A = glm::vec1(0.5);\n\t\t\tglm::ivec1 exp = glm::ivec1(11);\n\t\t\tglm::vec1 x = glm::ldexp(A, exp);\n\t\t\tError += glm::all(glm::epsilonEqual(x, glm::vec1(1024),0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec2 A = glm::vec2(0.5, 0.96);\n\t\t\tglm::ivec2 exp = glm::ivec2(11, -2);\n\t\t\tglm::vec2 x = glm::ldexp(A, exp);\n\t\t\tError += glm::all(glm::epsilonEqual(x, glm::vec2(1024, .24),0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec3 A = glm::vec3(0.5, 0.96, 0.0);\n\t\t\tglm::ivec3 exp = glm::ivec3(11, -2, 0);\n\t\t\tglm::vec3 x = glm::ldexp(A, exp);\n\t\t\tError += glm::all(glm::epsilonEqual(x, glm::vec3(1024, .24, 0),0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 A = glm::vec4(0.5, 0.96, 0.0, -0.665);\n\t\t\tglm::ivec4 exp = glm::ivec4(11, -2, 0, 1);\n\t\t\tglm::vec4 x = glm::ldexp(A, exp);\n\t\t\tError += glm::all(glm::epsilonEqual(x, glm::vec4(1024, .24, 0, -1.33),0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace ldexp_\n\nint main()\n{\n\tint Error = 0;\n\n\tError += sign::test();\n\tError += floor_::test();\n\tError += mod_::test();\n\tError += modf_::test();\n\tError += floatBitsToInt::test();\n\tError += floatBitsToUint::test();\n\tError += mix_::test();\n\tError += step_::test();\n\tError += max_::test();\n\tError += min_::test();\n\tError += clamp_::test();\n\tError += round_::test();\n\tError += roundEven::test();\n\tError += isnan_::test();\n\tError += isinf_::test();\n\tError += frexp_::test();\n\tError += ldexp_::test();\n\n#\tifdef NDEBUG\n\t\tstd::size_t Samples = 1000;\n#\telse\n\t\tstd::size_t Samples = 1;\n#\tendif\n\tError += sign::perf(Samples);\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_exponential.cpp",
    "content": "#include <glm/common.hpp>\n#include <glm/exponential.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/constants.hpp>\n#include <glm/gtc/ulp.hpp>\n#include <glm/gtc/vec1.hpp>\n\nstatic int test_pow()\n{\n\tint Error(0);\n\n\tfloat A = glm::pow(2.f, 2.f);\n\tError += glm::epsilonEqual(A, 4.f, 0.01f) ? 0 : 1;\n\n\tglm::vec1 B = glm::pow(glm::vec1(2.f), glm::vec1(2.f));\n\tError += glm::all(glm::epsilonEqual(B, glm::vec1(4.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec2 C = glm::pow(glm::vec2(2.f), glm::vec2(2.f));\n\tError += glm::all(glm::epsilonEqual(C, glm::vec2(4.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec3 D = glm::pow(glm::vec3(2.f), glm::vec3(2.f));\n\tError += glm::all(glm::epsilonEqual(D, glm::vec3(4.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec4 E = glm::pow(glm::vec4(2.f), glm::vec4(2.f));\n\tError += glm::all(glm::epsilonEqual(E, glm::vec4(4.f), 0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_sqrt()\n{\n\tint Error = 0;\n\n\tfloat A = glm::sqrt(4.f);\n\tError += glm::epsilonEqual(A, 2.f, 0.01f) ? 0 : 1;\n\n\tglm::vec1 B = glm::sqrt(glm::vec1(4.f));\n\tError += glm::all(glm::epsilonEqual(B, glm::vec1(2.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec2 C = glm::sqrt(glm::vec2(4.f));\n\tError += glm::all(glm::epsilonEqual(C, glm::vec2(2.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec3 D = glm::sqrt(glm::vec3(4.f));\n\tError += glm::all(glm::epsilonEqual(D, glm::vec3(2.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec4 E = glm::sqrt(glm::vec4(4.f));\n\tError += glm::all(glm::epsilonEqual(E, glm::vec4(2.f), 0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\n\nstatic int test_exp()\n{\n\tint Error = 0;\n\n\tfloat A = glm::exp(1.f);\n\tError += glm::epsilonEqual(A, glm::e<float>(), 0.01f) ? 0 : 1;\n\n\tglm::vec1 B = glm::exp(glm::vec1(1.f));\n\tError += glm::all(glm::epsilonEqual(B, glm::vec1(glm::e<float>()), 0.01f)) ? 0 : 1;\n\n\tglm::vec2 C = glm::exp(glm::vec2(1.f));\n\tError += glm::all(glm::epsilonEqual(C, glm::vec2(glm::e<float>()), 0.01f)) ? 0 : 1;\n\n\tglm::vec3 D = glm::exp(glm::vec3(1.f));\n\tError += glm::all(glm::epsilonEqual(D, glm::vec3(glm::e<float>()), 0.01f)) ? 0 : 1;\n\n\tglm::vec4 E = glm::exp(glm::vec4(1.f));\n\tError += glm::all(glm::epsilonEqual(E, glm::vec4(glm::e<float>()), 0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_log()\n{\n\tint Error = 0;\n\n\tfloat const A = glm::log(glm::e<float>());\n\tError += glm::epsilonEqual(A, 1.f, 0.01f) ? 0 : 1;\n\n\tglm::vec1 const B = glm::log(glm::vec1(glm::e<float>()));\n\tError += glm::all(glm::epsilonEqual(B, glm::vec1(1.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec2 const C = glm::log(glm::vec2(glm::e<float>()));\n\tError += glm::all(glm::epsilonEqual(C, glm::vec2(1.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec3 const D = glm::log(glm::vec3(glm::e<float>()));\n\tError += glm::all(glm::epsilonEqual(D, glm::vec3(1.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec4 const E = glm::log(glm::vec4(glm::e<float>()));\n\tError += glm::all(glm::epsilonEqual(E, glm::vec4(1.f), 0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_exp2()\n{\n\tint Error = 0;\n\n\tfloat A = glm::exp2(4.f);\n\tError += glm::epsilonEqual(A, 16.f, 0.01f) ? 0 : 1;\n\n\tglm::vec1 B = glm::exp2(glm::vec1(4.f));\n\tError += glm::all(glm::epsilonEqual(B, glm::vec1(16.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec2 C = glm::exp2(glm::vec2(4.f, 3.f));\n\tError += glm::all(glm::epsilonEqual(C, glm::vec2(16.f, 8.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec3 D = glm::exp2(glm::vec3(4.f, 3.f, 2.f));\n\tError += glm::all(glm::epsilonEqual(D, glm::vec3(16.f, 8.f, 4.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec4 E = glm::exp2(glm::vec4(4.f, 3.f, 2.f, 1.f));\n\tError += glm::all(glm::epsilonEqual(E, glm::vec4(16.f, 8.f, 4.f, 2.f), 0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_log2()\n{\n\tint Error = 0;\n\n\tfloat A = glm::log2(16.f);\n\tError += glm::epsilonEqual(A, 4.f, 0.01f) ? 0 : 1;\n\n\tglm::vec1 B = glm::log2(glm::vec1(16.f));\n\tError += glm::all(glm::epsilonEqual(B, glm::vec1(4.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec2 C = glm::log2(glm::vec2(16.f, 8.f));\n\tError += glm::all(glm::epsilonEqual(C, glm::vec2(4.f, 3.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec3 D = glm::log2(glm::vec3(16.f, 8.f, 4.f));\n\tError += glm::all(glm::epsilonEqual(D, glm::vec3(4.f, 3.f, 2.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec4 E = glm::log2(glm::vec4(16.f, 8.f, 4.f, 2.f));\n\tError += glm::all(glm::epsilonEqual(E, glm::vec4(4.f, 3.f, 2.f, 1.f), 0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_inversesqrt()\n{\n\tint Error = 0;\n\n\tfloat A = glm::inversesqrt(16.f) * glm::sqrt(16.f);\n\tError += glm::epsilonEqual(A, 1.f, 0.01f) ? 0 : 1;\n\n\tglm::vec1 B = glm::inversesqrt(glm::vec1(16.f)) * glm::sqrt(16.f);;\n\tError += glm::all(glm::epsilonEqual(B, glm::vec1(1.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec2 C = glm::inversesqrt(glm::vec2(16.f)) * glm::sqrt(16.f);;\n\tError += glm::all(glm::epsilonEqual(C, glm::vec2(1.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec3 D = glm::inversesqrt(glm::vec3(16.f)) * glm::sqrt(16.f);;\n\tError += glm::all(glm::epsilonEqual(D, glm::vec3(1.f), 0.01f)) ? 0 : 1;\n\n\tglm::vec4 E = glm::inversesqrt(glm::vec4(16.f)) * glm::sqrt(16.f);\n\tError += glm::all(glm::epsilonEqual(E, glm::vec4(1.f), 0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_pow();\n\tError += test_sqrt();\n\tError += test_exp();\n\tError += test_log();\n\tError += test_exp2();\n\tError += test_log2();\n\tError += test_inversesqrt();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_geometric.cpp",
    "content": "#include <glm/geometric.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <limits>\n\nnamespace length\n{\n\tint test()\n\t{\n\t\tfloat Length1 = glm::length(glm::vec1(1));\n\t\tfloat Length2 = glm::length(glm::vec2(1, 0));\n\t\tfloat Length3 = glm::length(glm::vec3(1, 0, 0));\n\t\tfloat Length4 = glm::length(glm::vec4(1, 0, 0, 0));\n\n\t\tint Error = 0;\n\n\t\tError += glm::abs(Length1 - 1.0f) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Length2 - 1.0f) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Length3 - 1.0f) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Length4 - 1.0f) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace length\n\nnamespace distance\n{\n\tint test()\n\t{\n\t\tfloat Distance1 = glm::distance(glm::vec1(1), glm::vec1(1));\n\t\tfloat Distance2 = glm::distance(glm::vec2(1, 0), glm::vec2(1, 0));\n\t\tfloat Distance3 = glm::distance(glm::vec3(1, 0, 0), glm::vec3(1, 0, 0));\n\t\tfloat Distance4 = glm::distance(glm::vec4(1, 0, 0, 0), glm::vec4(1, 0, 0, 0));\n\n\t\tint Error = 0;\n\n\t\tError += glm::abs(Distance1) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Distance2) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Distance3) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Distance4) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace distance\n\nnamespace dot\n{\n\tint test()\n\t{\n\t\tfloat Dot1 = glm::dot(glm::vec1(1), glm::vec1(1));\n\t\tfloat Dot2 = glm::dot(glm::vec2(1), glm::vec2(1));\n\t\tfloat Dot3 = glm::dot(glm::vec3(1), glm::vec3(1));\n\t\tfloat Dot4 = glm::dot(glm::vec4(1), glm::vec4(1));\n\n\t\tint Error = 0;\n\n\t\tError += glm::abs(Dot1 - 1.0f) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Dot2 - 2.0f) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Dot3 - 3.0f) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\t\tError += glm::abs(Dot4 - 4.0f) < std::numeric_limits<float>::epsilon() ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace dot\n\nnamespace cross\n{\n\tint test()\n\t{\n\t\tglm::vec3 Cross1 = glm::cross(glm::vec3(1, 0, 0), glm::vec3(0, 1, 0));\n\t\tglm::vec3 Cross2 = glm::cross(glm::vec3(0, 1, 0), glm::vec3(1, 0, 0));\n\n\t\tint Error = 0;\n\n\t\tError += glm::all(glm::lessThan(glm::abs(Cross1 - glm::vec3(0, 0, 1)), glm::vec3(std::numeric_limits<float>::epsilon()))) ? 0 : 1;\n\t\tError += glm::all(glm::lessThan(glm::abs(Cross2 - glm::vec3(0, 0,-1)), glm::vec3(std::numeric_limits<float>::epsilon()))) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace cross\n\nnamespace normalize\n{\n\tint test()\n\t{\n\t\tglm::vec3 Normalize1 = glm::normalize(glm::vec3(1, 0, 0));\n\t\tglm::vec3 Normalize2 = glm::normalize(glm::vec3(2, 0, 0));\n\n\t\tglm::vec3 Normalize3 = glm::normalize(glm::vec3(-0.6, 0.7, -0.5));\n\n\t\tglm::vec3 ro = glm::vec3(glm::cos(5.f) * 3.f, 2.f, glm::sin(5.f) * 3.f);\n\t\tglm::vec3 w = glm::normalize(glm::vec3(0, -0.2f, 0) - ro);\n\t\tglm::vec3 u = glm::normalize(glm::cross(w, glm::vec3(0, 1, 0)));\n\t\tglm::vec3 v = glm::cross(u, w);\n\n\t\tint Error = 0;\n\n\t\tError += glm::all(glm::lessThan(glm::abs(Normalize1 - glm::vec3(1, 0, 0)), glm::vec3(std::numeric_limits<float>::epsilon()))) ? 0 : 1;\n\t\tError += glm::all(glm::lessThan(glm::abs(Normalize2 - glm::vec3(1, 0, 0)), glm::vec3(std::numeric_limits<float>::epsilon()))) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace normalize\n\nnamespace faceforward\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\t{\n\t\t\tglm::vec3 N(0.0f, 0.0f, 1.0f);\n\t\t\tglm::vec3 I(1.0f, 0.0f, 1.0f);\n\t\t\tglm::vec3 Nref(0.0f, 0.0f, 1.0f);\n\t\t\tglm::vec3 F = glm::faceforward(N, I, Nref);\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace faceforward\n\nnamespace reflect\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\t{\n\t\t\tglm::vec2 A(1.0f,-1.0f);\n\t\t\tglm::vec2 B(0.0f, 1.0f);\n\t\t\tglm::vec2 C = glm::reflect(A, B);\n\t\t\tError += C == glm::vec2(1.0, 1.0) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::dvec2 A(1.0f,-1.0f);\n\t\t\tglm::dvec2 B(0.0f, 1.0f);\n\t\t\tglm::dvec2 C = glm::reflect(A, B);\n\t\t\tError += C == glm::dvec2(1.0, 1.0) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace reflect\n\nnamespace refract\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\t{\n\t\t\tfloat A(-1.0f);\n\t\t\tfloat B(1.0f);\n\t\t\tfloat C = glm::refract(A, B, 0.5f);\n\t\t\tError += glm::epsilonEqual(C, -1.0f, 0.0001f) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec2 A(0.0f,-1.0f);\n\t\t\tglm::vec2 B(0.0f, 1.0f);\n\t\t\tglm::vec2 C = glm::refract(A, B, 0.5f);\n\t\t\tError += glm::all(glm::epsilonEqual(C, glm::vec2(0.0, -1.0), 0.0001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::dvec2 A(0.0f,-1.0f);\n\t\t\tglm::dvec2 B(0.0f, 1.0f);\n\t\t\tglm::dvec2 C = glm::refract(A, B, 0.5);\n\t\t\tError += C == glm::dvec2(0.0, -1.0) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace refract\n\nint main()\n{\n\tint Error(0);\n\n\tError += length::test();\n\tError += distance::test();\n\tError += dot::test();\n\tError += cross::test();\n\tError += normalize::test();\n\tError += faceforward::test();\n\tError += reflect::test();\n\tError += refract::test();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_integer.cpp",
    "content": "#include <glm/integer.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <vector>\n#include <ctime>\n#include <cstdio>\n\nenum result\n{\n\tSUCCESS,\n\tFAIL,\n\tASSERT,\n\tSTATIC_ASSERT\n};\n\nnamespace bitfieldInsert\n{\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tBase;\n\t\tgenType\t\tInsert;\n\t\tint\t\t\tOffset;\n\t\tint\t\t\tBits;\n\t\tgenType\t\tReturn;\n\t};\n\n\ttypedef type<glm::uint> typeU32;\n\n\ttypeU32 const Data32[] =\n\t{\n\t\t{0x00000000, 0xffffffff,  0, 32, 0xffffffff},\n\t\t{0x00000000, 0xffffffff,  0, 31, 0x7fffffff},\n\t\t{0x00000000, 0xffffffff,  0,  0, 0x00000000},\n\t\t{0xff000000, 0x0000ff00,  8,  8, 0xff00ff00},\n\t\t{0xffff0000, 0x0000ffff, 16, 16, 0x00000000},\n\t\t{0x0000ffff, 0xffff0000, 16, 16, 0xffffffff}\n\t};\n\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\t\tglm::uint count = sizeof(Data32) / sizeof(typeU32);\n\t\t\n\t\tfor(glm::uint i = 0; i < count; ++i)\n\t\t{\n\t\t\tglm::uint Return = glm::bitfieldInsert(\n\t\t\t\tData32[i].Base,\n\t\t\t\tData32[i].Insert,\n\t\t\t\tData32[i].Offset,\n\t\t\t\tData32[i].Bits);\n\n\t\t\tError += Data32[i].Return == Return ? 0 : 1;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n}//bitfieldInsert\n\nnamespace bitfieldExtract\n{\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tint\t\t\tOffset;\n\t\tint\t\t\tBits;\n\t\tgenType\t\tReturn;\n\t\tresult\t\tResult;\n\t};\n\n\ttypedef type<glm::uint> typeU32;\n\n\ttypeU32 const Data32[] =\n\t{\n\t\t{0xffffffff, 0,32, 0xffffffff, SUCCESS},\n\t\t{0xffffffff, 8, 0, 0x00000000, SUCCESS},\n\t\t{0x00000000, 0,32, 0x00000000, SUCCESS},\n\t\t{0x0f0f0f0f, 0,32, 0x0f0f0f0f, SUCCESS},\n\t\t{0x00000000, 8, 0, 0x00000000, SUCCESS},\n\t\t{0x80000000,31, 1, 0x00000001, SUCCESS},\n\t\t{0x7fffffff,31, 1, 0x00000000, SUCCESS},\n\t\t{0x00000300, 8, 8, 0x00000003, SUCCESS},\n\t\t{0x0000ff00, 8, 8, 0x000000ff, SUCCESS},\n\t\t{0xfffffff0, 0, 5, 0x00000010, SUCCESS},\n\t\t{0x000000ff, 1, 3, 0x00000007, SUCCESS},\n\t\t{0x000000ff, 0, 3, 0x00000007, SUCCESS},\n\t\t{0x00000000, 0, 2, 0x00000000, SUCCESS},\n\t\t{0xffffffff, 0, 8, 0x000000ff, SUCCESS},\n\t\t{0xffff0000,16,16, 0x0000ffff, SUCCESS},\n\t\t{0xfffffff0, 0, 8, 0x00000000, FAIL},\n\t\t{0xffffffff,16,16, 0x00000000, FAIL},\n\t\t//{0xffffffff,32, 1, 0x00000000, ASSERT}, // Throw an assert \n\t\t//{0xffffffff, 0,33, 0x00000000, ASSERT}, // Throw an assert \n\t\t//{0xffffffff,16,16, 0x00000000, ASSERT}, // Throw an assert \n\t};\n\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::uint count = sizeof(Data32) / sizeof(typeU32);\n\n\t\tfor(glm::uint i = 0; i < count; ++i)\n\t\t{\n\t\t\tglm::uint Return = glm::bitfieldExtract(\n\t\t\t\tData32[i].Value, \n\t\t\t\tData32[i].Offset, \n\t\t\t\tData32[i].Bits);\n\t\t\t\n\t\t\tbool Compare = Data32[i].Return == Return;\n\n\t\t\tif(Data32[i].Result == SUCCESS && Compare)\n\t\t\t\tcontinue;\n\t\t\telse if(Data32[i].Result == FAIL && !Compare)\n\t\t\t\tcontinue;\n\n\t\t\tError += 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//extractField\n\nnamespace bitfieldReverse\n{\n/*\n\tGLM_FUNC_QUALIFIER unsigned int bitfieldReverseLoop(unsigned int v)\n\t{\n\t\tunsigned int Result(0);\n\t\tunsigned int const BitSize = static_cast<unsigned int>(sizeof(unsigned int) * 8);\n\t\tfor(unsigned int i = 0; i < BitSize; ++i)\n\t\t{\n\t\t\tunsigned int const BitSet(v & (static_cast<unsigned int>(1) << i));\n\t\t\tunsigned int const BitFirst(BitSet >> i);\n\t\t\tResult |= BitFirst << (BitSize - 1 - i);\n\t\t}\n\t\treturn Result;\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint64_t bitfieldReverseLoop(glm::uint64_t v)\n\t{\n\t\tglm::uint64_t Result(0);\n\t\tglm::uint64_t const BitSize = static_cast<glm::uint64_t>(sizeof(unsigned int) * 8);\n\t\tfor(glm::uint64_t i = 0; i < BitSize; ++i)\n\t\t{\n\t\t\tglm::uint64_t const BitSet(v & (static_cast<glm::uint64_t>(1) << i));\n\t\t\tglm::uint64_t const BitFirst(BitSet >> i);\n\t\t\tResult |= BitFirst << (BitSize - 1 - i);\n\t\t}\n\t\treturn Result;\n\t}\n*/\n\ttemplate<glm::length_t L, typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> bitfieldReverseLoop(glm::vec<L, T, Q> const& v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'bitfieldReverse' only accept integer values\");\n\n\t\tglm::vec<L, T, Q> Result(0);\n\t\tT const BitSize = static_cast<T>(sizeof(T) * 8);\n\t\tfor(T i = 0; i < BitSize; ++i)\n\t\t{\n\t\t\tglm::vec<L, T, Q> const BitSet(v & (static_cast<T>(1) << i));\n\t\t\tglm::vec<L, T, Q> const BitFirst(BitSet >> i);\n\t\t\tResult |= BitFirst << (BitSize - 1 - i);\n\t\t}\n\t\treturn Result;\n\t}\n\n\ttemplate<typename T>\n\tGLM_FUNC_QUALIFIER T bitfieldReverseLoop(T v)\n\t{\n\t\treturn bitfieldReverseLoop(glm::vec<1, T>(v)).x;\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint32_t bitfieldReverseUint32(glm::uint32_t x)\n\t{\n\t\tx = (x & 0x55555555) <<  1 | (x & 0xAAAAAAAA) >>  1;\n\t\tx = (x & 0x33333333) <<  2 | (x & 0xCCCCCCCC) >>  2;\n\t\tx = (x & 0x0F0F0F0F) <<  4 | (x & 0xF0F0F0F0) >>  4;\n\t\tx = (x & 0x00FF00FF) <<  8 | (x & 0xFF00FF00) >>  8;\n\t\tx = (x & 0x0000FFFF) << 16 | (x & 0xFFFF0000) >> 16;\n\t\treturn x;\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint64_t bitfieldReverseUint64(glm::uint64_t x)\n\t{\n\t\tx = (x & 0x5555555555555555) <<  1 | (x & 0xAAAAAAAAAAAAAAAA) >>  1;\n\t\tx = (x & 0x3333333333333333) <<  2 | (x & 0xCCCCCCCCCCCCCCCC) >>  2;\n\t\tx = (x & 0x0F0F0F0F0F0F0F0F) <<  4 | (x & 0xF0F0F0F0F0F0F0F0) >>  4;\n\t\tx = (x & 0x00FF00FF00FF00FF) <<  8 | (x & 0xFF00FF00FF00FF00) >>  8;\n\t\tx = (x & 0x0000FFFF0000FFFF) << 16 | (x & 0xFFFF0000FFFF0000) >> 16;\n\t\tx = (x & 0x00000000FFFFFFFF) << 32 | (x & 0xFFFFFFFF00000000) >> 32;\n\t\treturn x;\n\t}\n\n\ttemplate<bool EXEC = false>\n\tstruct compute_bitfieldReverseStep\n\t{\n\t\ttemplate<glm::length_t L, typename T, glm::qualifier Q>\n\t\tGLM_FUNC_QUALIFIER static glm::vec<L, T, Q> call(glm::vec<L, T, Q> const& v, T, T)\n\t\t{\n\t\t\treturn v;\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_bitfieldReverseStep<true>\n\t{\n\t\ttemplate<glm::length_t L, typename T, glm::qualifier Q>\n\t\tGLM_FUNC_QUALIFIER static glm::vec<L, T, Q> call(glm::vec<L, T, Q> const& v, T Mask, T Shift)\n\t\t{\n\t\t\treturn (v & Mask) << Shift | (v & (~Mask)) >> Shift;\n\t\t}\n\t};\n\n\ttemplate<glm::length_t L, typename T, glm::qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> bitfieldReverseOps(glm::vec<L, T, Q> const& v)\n\t{\n\t\tglm::vec<L, T, Q> x(v);\n\t\tx = compute_bitfieldReverseStep<sizeof(T) * 8 >=  2>::call(x, static_cast<T>(0x5555555555555555ull), static_cast<T>( 1));\n\t\tx = compute_bitfieldReverseStep<sizeof(T) * 8 >=  4>::call(x, static_cast<T>(0x3333333333333333ull), static_cast<T>( 2));\n\t\tx = compute_bitfieldReverseStep<sizeof(T) * 8 >=  8>::call(x, static_cast<T>(0x0F0F0F0F0F0F0F0Full), static_cast<T>( 4));\n\t\tx = compute_bitfieldReverseStep<sizeof(T) * 8 >= 16>::call(x, static_cast<T>(0x00FF00FF00FF00FFull), static_cast<T>( 8));\n\t\tx = compute_bitfieldReverseStep<sizeof(T) * 8 >= 32>::call(x, static_cast<T>(0x0000FFFF0000FFFFull), static_cast<T>(16));\n\t\tx = compute_bitfieldReverseStep<sizeof(T) * 8 >= 64>::call(x, static_cast<T>(0x00000000FFFFFFFFull), static_cast<T>(32));\n\t\treturn x;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType bitfieldReverseOps(genType x)\n\t{\n\t\treturn bitfieldReverseOps(glm::vec<1, genType, glm::defaultp>(x)).x;\n\t}\n\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tgenType\t\tReturn;\n\t\tresult\t\tResult;\n\t};\n\n\ttypedef type<glm::uint> typeU32;\n\n\ttypeU32 const Data32[] =\n\t{\n\t\t{0x00000001, 0x80000000, SUCCESS},\n\t\t{0x0000000f, 0xf0000000, SUCCESS},\n\t\t{0x000000ff, 0xff000000, SUCCESS},\n\t\t{0xf0000000, 0x0000000f, SUCCESS},\n\t\t{0xff000000, 0x000000ff, SUCCESS},\n\t\t{0xffffffff, 0xffffffff, SUCCESS},\n\t\t{0x00000000, 0x00000000, SUCCESS}\n\t};\n\n\ttypedef type<glm::uint64> typeU64;\n\n\ttypeU64 const Data64[] =\n\t{\n\t\t{0x00000000000000ff, 0xff00000000000000, SUCCESS},\n\t\t{0x000000000000000f, 0xf000000000000000, SUCCESS},\n\t\t{0xf000000000000000, 0x000000000000000f, SUCCESS},\n\t\t{0xffffffffffffffff, 0xffffffffffffffff, SUCCESS},\n\t\t{0x0000000000000000, 0x0000000000000000, SUCCESS}\n\t};\n\n\tstatic int test32_bitfieldReverse()\n\t{\n\t\tint Error = 0;\n\t\tstd::size_t const Count = sizeof(Data32) / sizeof(typeU32);\n\t\t\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t{\n\t\t\tglm::uint Return = glm::bitfieldReverse(Data32[i].Value);\n\t\t\t\n\t\t\tbool Compare = Data32[i].Return == Return;\n\t\t\t\n\t\t\tif(Data32[i].Result == SUCCESS)\n\t\t\t\tError += Compare ? 0 : 1;\n\t\t\telse\n\t\t\t\tError += Compare ? 1 : 0;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n\n\tstatic int test32_bitfieldReverseLoop()\n\t{\n\t\tint Error = 0;\n\t\tstd::size_t const Count = sizeof(Data32) / sizeof(typeU32);\n\t\t\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t{\n\t\t\tglm::uint Return = bitfieldReverseLoop(Data32[i].Value);\n\t\t\t\n\t\t\tbool Compare = Data32[i].Return == Return;\n\t\t\t\n\t\t\tif(Data32[i].Result == SUCCESS)\n\t\t\t\tError += Compare ? 0 : 1;\n\t\t\telse\n\t\t\t\tError += Compare ? 1 : 0;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n\n\tstatic int test32_bitfieldReverseUint32()\n\t{\n\t\tint Error = 0;\n\t\tstd::size_t const Count = sizeof(Data32) / sizeof(typeU32);\n\t\t\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t{\n\t\t\tglm::uint Return = bitfieldReverseUint32(Data32[i].Value);\n\t\t\t\n\t\t\tbool Compare = Data32[i].Return == Return;\n\t\t\t\n\t\t\tif(Data32[i].Result == SUCCESS)\n\t\t\t\tError += Compare ? 0 : 1;\n\t\t\telse\n\t\t\t\tError += Compare ? 1 : 0;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n\n\tstatic int test32_bitfieldReverseOps()\n\t{\n\t\tint Error = 0;\n\t\tstd::size_t const Count = sizeof(Data32) / sizeof(typeU32);\n\t\t\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t{\n\t\t\tglm::uint Return = bitfieldReverseOps(Data32[i].Value);\n\t\t\t\n\t\t\tbool Compare = Data32[i].Return == Return;\n\t\t\t\n\t\t\tif(Data32[i].Result == SUCCESS)\n\t\t\t\tError += Compare ? 0 : 1;\n\t\t\telse\n\t\t\t\tError += Compare ? 1 : 0;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n\n\tstatic int test64_bitfieldReverse()\n\t{\n\t\tint Error = 0;\n\t\tstd::size_t const Count = sizeof(Data64) / sizeof(typeU64);\n\t\t\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t{\n\t\t\tglm::uint64 Return = glm::bitfieldReverse(Data64[i].Value);\n\t\t\t\n\t\t\tbool Compare = Data64[i].Return == Return;\n\t\t\t\n\t\t\tif(Data64[i].Result == SUCCESS)\n\t\t\t\tError += Compare ? 0 : 1;\n\t\t\telse\n\t\t\t\tError += Compare ? 1 : 0;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n\n\tstatic int test64_bitfieldReverseLoop()\n\t{\n\t\tint Error = 0;\n\t\tstd::size_t const Count = sizeof(Data64) / sizeof(typeU64);\n\t\t\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t{\n\t\t\tglm::uint64 Return = bitfieldReverseLoop(Data64[i].Value);\n\t\t\t\n\t\t\tbool Compare = Data64[i].Return == Return;\n\t\t\t\n\t\t\tif(Data32[i].Result == SUCCESS)\n\t\t\t\tError += Compare ? 0 : 1;\n\t\t\telse\n\t\t\t\tError += Compare ? 1 : 0;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n\n\tstatic int test64_bitfieldReverseUint64()\n\t{\n\t\tint Error = 0;\n\t\tstd::size_t const Count = sizeof(Data64) / sizeof(typeU64);\n\t\t\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t{\n\t\t\tglm::uint64 Return = bitfieldReverseUint64(Data64[i].Value);\n\t\t\t\n\t\t\tbool Compare = Data64[i].Return == Return;\n\t\t\t\n\t\t\tif(Data64[i].Result == SUCCESS)\n\t\t\t\tError += Compare ? 0 : 1;\n\t\t\telse\n\t\t\t\tError += Compare ? 1 : 0;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n\n\tstatic int test64_bitfieldReverseOps()\n\t{\n\t\tint Error = 0;\n\t\tstd::size_t const Count = sizeof(Data64) / sizeof(typeU64);\n\t\t\n\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t{\n\t\t\tglm::uint64 Return = bitfieldReverseOps(Data64[i].Value);\n\t\t\t\n\t\t\tbool Compare = Data64[i].Return == Return;\n\t\t\t\n\t\t\tif(Data64[i].Result == SUCCESS)\n\t\t\t\tError += Compare ? 0 : 1;\n\t\t\telse\n\t\t\t\tError += Compare ? 1 : 0;\n\t\t}\n\t\t\n\t\treturn Error;\n\t}\n\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tError += test32_bitfieldReverse();\n\t\tError += test32_bitfieldReverseLoop();\n\t\tError += test32_bitfieldReverseUint32();\n\t\tError += test32_bitfieldReverseOps();\n\n\t\tError += test64_bitfieldReverse();\n\t\tError += test64_bitfieldReverseLoop();\n\t\tError += test64_bitfieldReverseUint64();\n\t\tError += test64_bitfieldReverseOps();\n\n\t\treturn Error;\n\t}\n\n\tstatic int perf32(glm::uint32 Count)\n\t{\n\t\tint Error = 0;\n\n\t\tstd::vector<glm::uint32> Data;\n\t\tData.resize(static_cast<std::size_t>(Count));\n\n\t\tstd::clock_t Timestamps0 = std::clock();\n\n\t\tfor(glm::uint32 k = 0; k < Count; ++k)\n\t\t\tData[k] = glm::bitfieldReverse(k);\n\n\t\tstd::clock_t Timestamps1 = std::clock();\n\n\t\tfor(glm::uint32 k = 0; k < Count; ++k)\n\t\t\tData[k] = bitfieldReverseLoop(k);\n\n\t\tstd::clock_t Timestamps2 = std::clock();\n\n\t\tfor(glm::uint32 k = 0; k < Count; ++k)\n\t\t\tData[k] = bitfieldReverseUint32(k);\n\n\t\tstd::clock_t Timestamps3 = std::clock();\n\n\t\tfor(glm::uint32 k = 0; k < Count; ++k)\n\t\t\tData[k] = bitfieldReverseOps(k);\n\n\t\tstd::clock_t Timestamps4 = std::clock();\n\n\t\tstd::printf(\"glm::bitfieldReverse: %d clocks\\n\", static_cast<unsigned int>(Timestamps1 - Timestamps0));\n\t\tstd::printf(\"bitfieldReverseLoop: %d clocks\\n\", static_cast<unsigned int>(Timestamps2 - Timestamps1));\n\t\tstd::printf(\"bitfieldReverseUint32: %d clocks\\n\", static_cast<unsigned int>(Timestamps3 - Timestamps2));\n\t\tstd::printf(\"bitfieldReverseOps: %d clocks\\n\", static_cast<unsigned int>(Timestamps4 - Timestamps3));\n\n\t\treturn Error;\n\t}\n\n\tstatic int perf64(glm::uint64 Count)\n\t{\n\t\tint Error = 0;\n\n\t\tstd::vector<glm::uint64> Data;\n\t\tData.resize(static_cast<std::size_t>(Count));\n\n\t\tstd::clock_t Timestamps0 = std::clock();\n\n\t\tfor(glm::uint64 k = 0; k < Count; ++k)\n\t\t\tData[static_cast<std::size_t>(k)] = glm::bitfieldReverse(k);\n\n\t\tstd::clock_t Timestamps1 = std::clock();\n\n\t\tfor(glm::uint64 k = 0; k < Count; ++k)\n\t\t\tData[static_cast<std::size_t>(k)] = bitfieldReverseLoop<glm::uint64>(k);\n\n\t\tstd::clock_t Timestamps2 = std::clock();\n\n\t\tfor(glm::uint64 k = 0; k < Count; ++k)\n\t\t\tData[static_cast<std::size_t>(k)] = bitfieldReverseUint64(k);\n\n\t\tstd::clock_t Timestamps3 = std::clock();\n\n\t\tfor(glm::uint64 k = 0; k < Count; ++k)\n\t\t\tData[static_cast<std::size_t>(k)] = bitfieldReverseOps(k);\n\n\t\tstd::clock_t Timestamps4 = std::clock();\n\n\t\tstd::printf(\"glm::bitfieldReverse - 64: %d clocks\\n\", static_cast<unsigned int>(Timestamps1 - Timestamps0));\n\t\tstd::printf(\"bitfieldReverseLoop - 64: %d clocks\\n\", static_cast<unsigned int>(Timestamps2 - Timestamps1));\n\t\tstd::printf(\"bitfieldReverseUint - 64: %d clocks\\n\", static_cast<unsigned int>(Timestamps3 - Timestamps2));\n\t\tstd::printf(\"bitfieldReverseOps - 64: %d clocks\\n\", static_cast<unsigned int>(Timestamps4 - Timestamps3));\n\n\t\treturn Error;\n\t}\n\n\tstatic int perf(std::size_t Samples)\n\t{\n\t\tint Error = 0;\n\n\t\tError += perf32(static_cast<glm::uint32>(Samples));\n\t\tError += perf64(static_cast<glm::uint64>(Samples));\n\n\t\treturn Error;\n\t}\n}//bitfieldReverse\n\nnamespace findMSB\n{\n\ttemplate<typename genType, typename retType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tretType\t\tReturn;\n\t};\n\n#\tif GLM_HAS_BITSCAN_WINDOWS\n\t\ttemplate<typename genIUType>\n\t\tstatic int findMSB_intrinsic(genIUType Value)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'findMSB' only accept integer values\");\n\n\t\t\tif(Value == 0)\n\t\t\t\treturn -1;\n\n\t\t\tunsigned long Result(0);\n\t\t\t_BitScanReverse(&Result, Value);\n\t\t\treturn int(Result);\n\t\t}\n#\tendif//GLM_HAS_BITSCAN_WINDOWS\n\n#\tif GLM_ARCH & GLM_ARCH_AVX && GLM_COMPILER & GLM_COMPILER_VC\n\t\ttemplate<typename genIUType>\n\t\tstatic int findMSB_avx(genIUType Value)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'findMSB' only accept integer values\");\n\n\t\t\tif(Value == 0)\n\t\t\t\treturn -1;\n\n\t\t\treturn int(_tzcnt_u32(Value));\n\t\t}\n#\tendif//GLM_ARCH & GLM_ARCH_AVX && GLM_PLATFORM & GLM_PLATFORM_WINDOWS\n\n\ttemplate<typename genIUType>\n\tstatic int findMSB_095(genIUType Value)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'findMSB' only accept integer values\");\n\t\t\n\t\tif(Value == genIUType(0) || Value == genIUType(-1))\n\t\t\treturn -1;\n\t\telse if(Value > 0)\n\t\t{\n\t\t\tgenIUType Bit = genIUType(-1);\n\t\t\tfor(genIUType tmp = Value; tmp > 0; tmp >>= 1, ++Bit){}\n\t\t\treturn static_cast<int>(Bit);\n\t\t}\n\t\telse //if(Value < 0)\n\t\t{\n\t\t\tint const BitCount(sizeof(genIUType) * 8);\n\t\t\tint MostSignificantBit(-1);\n\t\t\tfor(int BitIndex(0); BitIndex < BitCount; ++BitIndex)\n\t\t\t\tMostSignificantBit = (Value & (1 << BitIndex)) ? MostSignificantBit : BitIndex;\n\t\t\tassert(MostSignificantBit >= 0);\n\t\t\treturn MostSignificantBit;\n\t\t}\n\t}\n\n\ttemplate<typename genIUType>\n\tstatic int findMSB_nlz1(genIUType x)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'findMSB' only accept integer values\");\n\n\t\tif (x == 0)\n\t\t\treturn -1;\n\n\t\tint n = 0;\n\t\tif (x <= 0x0000FFFF) {n = n +16; x = x <<16;}\n\t\tif (x <= 0x00FFFFFF) {n = n + 8; x = x << 8;}\n\t\tif (x <= 0x0FFFFFFF) {n = n + 4; x = x << 4;}\n\t\tif (x <= 0x3FFFFFFF) {n = n + 2; x = x << 2;}\n\t\tif (x <= 0x7FFFFFFF) {n = n + 1;}\n\t\treturn 31 - n;\n\t}\n\n\tstatic int findMSB_nlz2(unsigned int x)\n\t{\n\t\tunsigned int y;\n\t\tint n = 32;\n\n\t\ty = x >>16;  if (y != 0) {n = n -16;  x = y;}\n\t\ty = x >> 8;  if (y != 0) {n = n - 8;  x = y;}\n\t\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\t\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\t\ty = x >> 1;  if (y != 0) return n - 2;\n\t\treturn 32 - (n - static_cast<int>(x));\n\t}\n\n\tstatic int findMSB_pop(unsigned int x)\n\t{\n\t\tx = x | (x >> 1);\n\t\tx = x | (x >> 2);\n\t\tx = x | (x >> 4);\n\t\tx = x | (x >> 8);\n\t\tx = x | (x >>16);\n\t\treturn 31 - glm::bitCount(~x);\n\t}\n\n\tstatic int perf_int(std::size_t Count)\n\t{\n\t\ttype<int, int> const Data[] =\n\t\t{\n\t\t\t{0x00000000, -1},\n\t\t\t{0x00000001,  0},\n\t\t\t{0x00000002,  1},\n\t\t\t{0x00000003,  1},\n\t\t\t{0x00000004,  2},\n\t\t\t{0x00000005,  2},\n\t\t\t{0x00000007,  2},\n\t\t\t{0x00000008,  3},\n\t\t\t{0x00000010,  4},\n\t\t\t{0x00000020,  5},\n\t\t\t{0x00000040,  6},\n\t\t\t{0x00000080,  7},\n\t\t\t{0x00000100,  8},\n\t\t\t{0x00000200,  9},\n\t\t\t{0x00000400, 10},\n\t\t\t{0x00000800, 11},\n\t\t\t{0x00001000, 12},\n\t\t\t{0x00002000, 13},\n\t\t\t{0x00004000, 14},\n\t\t\t{0x00008000, 15},\n\t\t\t{0x00010000, 16},\n\t\t\t{0x00020000, 17},\n\t\t\t{0x00040000, 18},\n\t\t\t{0x00080000, 19},\n\t\t\t{0x00100000, 20},\n\t\t\t{0x00200000, 21},\n\t\t\t{0x00400000, 22},\n\t\t\t{0x00800000, 23},\n\t\t\t{0x01000000, 24},\n\t\t\t{0x02000000, 25},\n\t\t\t{0x04000000, 26},\n\t\t\t{0x08000000, 27},\n\t\t\t{0x10000000, 28},\n\t\t\t{0x20000000, 29},\n\t\t\t{0x40000000, 30}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tstd::clock_t Timestamps0 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int, int>); ++i)\n\t\t{\n\t\t\tint Result = glm::findMSB(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps1 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int, int>); ++i)\n\t\t{\n\t\t\tint Result = findMSB_nlz1(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps2 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int, int>); ++i)\n\t\t{\n\t\t\tint Result = findMSB_nlz2(static_cast<unsigned int>(Data[i].Value));\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps3 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int, int>); ++i)\n\t\t{\n\t\t\tint Result = findMSB_095(static_cast<unsigned int>(Data[i].Value));\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps4 = std::clock();\n\n#\t\tif GLM_HAS_BITSCAN_WINDOWS\n\t\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int, int>); ++i)\n\t\t\t{\n\t\t\t\tint Result = findMSB_intrinsic(Data[i].Value);\n\t\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t\t}\n#\t\tendif//GLM_HAS_BITSCAN_WINDOWS\n\n\t\tstd::clock_t Timestamps5 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int, int>); ++i)\n\t\t{\n\t\t\tint Result = findMSB_pop(static_cast<unsigned int>(Data[i].Value));\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps6 = std::clock();\n\n#\t\tif GLM_ARCH & GLM_ARCH_AVX && GLM_COMPILER & GLM_COMPILER_VC\n\t\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int, int>); ++i)\n\t\t\t{\n\t\t\t\tint Result = findMSB_avx(Data[i].Value);\n\t\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t\t}\n\n\t\t\tstd::clock_t Timestamps7 = std::clock();\n#\t\tendif\n\n\t\tstd::printf(\"glm::findMSB: %d clocks\\n\", static_cast<unsigned int>(Timestamps1 - Timestamps0));\n\t\tstd::printf(\"findMSB - nlz1: %d clocks\\n\", static_cast<unsigned int>(Timestamps2 - Timestamps1));\n\t\tstd::printf(\"findMSB - nlz2: %d clocks\\n\", static_cast<unsigned int>(Timestamps3 - Timestamps2));\n\t\tstd::printf(\"findMSB - 0.9.5: %d clocks\\n\", static_cast<unsigned int>(Timestamps4 - Timestamps3));\n\n#\t\tif GLM_HAS_BITSCAN_WINDOWS\n\t\t\tstd::printf(\"findMSB - intrinsics: %d clocks\\n\", static_cast<unsigned int>(Timestamps5 - Timestamps4));\n#\t\tendif//GLM_HAS_BITSCAN_WINDOWS\n\t\tstd::printf(\"findMSB - pop: %d clocks\\n\", static_cast<unsigned int>(Timestamps6 - Timestamps5));\n\n#\t\tif GLM_ARCH & GLM_ARCH_AVX && GLM_COMPILER & GLM_COMPILER_VC\n\t\t\tstd::printf(\"findMSB - avx tzcnt: %d clocks\\n\", static_cast<unsigned int>(Timestamps7 - Timestamps6));\n#\t\tendif//GLM_ARCH & GLM_ARCH_AVX && GLM_PLATFORM & GLM_PLATFORM_WINDOWS\n\n\t\treturn Error;\n\t}\n\n\tstatic int test_ivec4()\n\t{\n\t\ttype<glm::ivec4, glm::ivec4> const Data[] =\n\t\t{\n\t\t\t{glm::ivec4(0x00000000), glm::ivec4(-1)},\n\t\t\t{glm::ivec4(0x00000001), glm::ivec4( 0)},\n\t\t\t{glm::ivec4(0x00000002), glm::ivec4( 1)},\n\t\t\t{glm::ivec4(0x00000003), glm::ivec4( 1)},\n\t\t\t{glm::ivec4(0x00000004), glm::ivec4( 2)},\n\t\t\t{glm::ivec4(0x00000005), glm::ivec4( 2)},\n\t\t\t{glm::ivec4(0x00000007), glm::ivec4( 2)},\n\t\t\t{glm::ivec4(0x00000008), glm::ivec4( 3)},\n\t\t\t{glm::ivec4(0x00000010), glm::ivec4( 4)},\n\t\t\t{glm::ivec4(0x00000020), glm::ivec4( 5)},\n\t\t\t{glm::ivec4(0x00000040), glm::ivec4( 6)},\n\t\t\t{glm::ivec4(0x00000080), glm::ivec4( 7)},\n\t\t\t{glm::ivec4(0x00000100), glm::ivec4( 8)},\n\t\t\t{glm::ivec4(0x00000200), glm::ivec4( 9)},\n\t\t\t{glm::ivec4(0x00000400), glm::ivec4(10)},\n\t\t\t{glm::ivec4(0x00000800), glm::ivec4(11)},\n\t\t\t{glm::ivec4(0x00001000), glm::ivec4(12)},\n\t\t\t{glm::ivec4(0x00002000), glm::ivec4(13)},\n\t\t\t{glm::ivec4(0x00004000), glm::ivec4(14)},\n\t\t\t{glm::ivec4(0x00008000), glm::ivec4(15)},\n\t\t\t{glm::ivec4(0x00010000), glm::ivec4(16)},\n\t\t\t{glm::ivec4(0x00020000), glm::ivec4(17)},\n\t\t\t{glm::ivec4(0x00040000), glm::ivec4(18)},\n\t\t\t{glm::ivec4(0x00080000), glm::ivec4(19)},\n\t\t\t{glm::ivec4(0x00100000), glm::ivec4(20)},\n\t\t\t{glm::ivec4(0x00200000), glm::ivec4(21)},\n\t\t\t{glm::ivec4(0x00400000), glm::ivec4(22)},\n\t\t\t{glm::ivec4(0x00800000), glm::ivec4(23)},\n\t\t\t{glm::ivec4(0x01000000), glm::ivec4(24)},\n\t\t\t{glm::ivec4(0x02000000), glm::ivec4(25)},\n\t\t\t{glm::ivec4(0x04000000), glm::ivec4(26)},\n\t\t\t{glm::ivec4(0x08000000), glm::ivec4(27)},\n\t\t\t{glm::ivec4(0x10000000), glm::ivec4(28)},\n\t\t\t{glm::ivec4(0x20000000), glm::ivec4(29)},\n\t\t\t{glm::ivec4(0x40000000), glm::ivec4(30)}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<glm::ivec4, glm::ivec4>); ++i)\n\t\t{\n\t\t\tglm::ivec4 Result0 = glm::findMSB(Data[i].Value);\n\t\t\tError += glm::all(glm::equal(Data[i].Return, Result0)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tstatic int test_int()\n\t{\n\t\ttypedef type<glm::uint, int> entry;\n\n\t\tentry const Data[] =\n\t\t{\n\t\t\t{0x00000000, -1},\n\t\t\t{0x00000001,  0},\n\t\t\t{0x00000002,  1},\n\t\t\t{0x00000003,  1},\n\t\t\t{0x00000004,  2},\n\t\t\t{0x00000005,  2},\n\t\t\t{0x00000007,  2},\n\t\t\t{0x00000008,  3},\n\t\t\t{0x00000010,  4},\n\t\t\t{0x00000020,  5},\n\t\t\t{0x00000040,  6},\n\t\t\t{0x00000080,  7},\n\t\t\t{0x00000100,  8},\n\t\t\t{0x00000200,  9},\n\t\t\t{0x00000400, 10},\n\t\t\t{0x00000800, 11},\n\t\t\t{0x00001000, 12},\n\t\t\t{0x00002000, 13},\n\t\t\t{0x00004000, 14},\n\t\t\t{0x00008000, 15},\n\t\t\t{0x00010000, 16},\n\t\t\t{0x00020000, 17},\n\t\t\t{0x00040000, 18},\n\t\t\t{0x00080000, 19},\n\t\t\t{0x00100000, 20},\n\t\t\t{0x00200000, 21},\n\t\t\t{0x00400000, 22},\n\t\t\t{0x00800000, 23},\n\t\t\t{0x01000000, 24},\n\t\t\t{0x02000000, 25},\n\t\t\t{0x04000000, 26},\n\t\t\t{0x08000000, 27},\n\t\t\t{0x10000000, 28},\n\t\t\t{0x20000000, 29},\n\t\t\t{0x40000000, 30}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result0 = glm::findMSB(Data[i].Value);\n\t\t\tError += Data[i].Return == Result0 ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result0 = findMSB_nlz1(Data[i].Value);\n\t\t\tError += Data[i].Return == Result0 ? 0 : 1;\n\t\t}\n/*\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result0 = findMSB_nlz2(Data[i].Value);\n\t\t\tError += Data[i].Return == Result0 ? 0 : 1;\n\t\t}\n*/\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result0 = findMSB_095(Data[i].Value);\n\t\t\tError += Data[i].Return == Result0 ? 0 : 1;\n\t\t}\n\n#\t\tif GLM_HAS_BITSCAN_WINDOWS\n\t\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(entry); ++i)\n\t\t\t{\n\t\t\t\tint Result0 = findMSB_intrinsic(Data[i].Value);\n\t\t\t\tError += Data[i].Return == Result0 ? 0 : 1;\n\t\t\t}\n#\t\tendif//GLM_HAS_BITSCAN_WINDOWS\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result0 = findMSB_pop(Data[i].Value);\n\t\t\tError += Data[i].Return == Result0 ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\n\t\tError += test_ivec4();\n\t\tError += test_int();\n\n\t\treturn Error;\n\t}\n\n\tstatic int perf(std::size_t Samples)\n\t{\n\t\tint Error(0);\n\n\t\tError += perf_int(Samples);\n\n\t\treturn Error;\n\t}\n}//findMSB\n\nnamespace findLSB\n{\n\ttemplate<typename genType, typename retType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tretType\t\tReturn;\n\t};\n\n\ttypedef type<int, int> entry;\n\n\tentry const DataI32[] =\n\t{\n\t\t{0x00000001,  0},\n\t\t{0x00000003,  0},\n\t\t{0x00000002,  1},\n\t\t// {0x80000000, 31}, // Clang generates an error with this\n\t\t{0x00010000, 16},\n\t\t{0x7FFF0000, 16},\n\t\t{0x7F000000, 24},\n\t\t{0x7F00FF00,  8},\n\t\t{0x00000000, -1}\n\t};\n\n#\tif GLM_HAS_BITSCAN_WINDOWS\n\t\ttemplate<typename genIUType>\n\t\tstatic int findLSB_intrinsic(genIUType Value)\n\t\t{\n\t\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'findLSB' only accept integer values\");\n\n\t\t\tif(Value == 0)\n\t\t\t\treturn -1;\n\n\t\t\tunsigned long Result(0);\n\t\t\t_BitScanForward(&Result, Value);\n\t\t\treturn int(Result);\n\t\t}\n#\tendif\n\n\ttemplate<typename genIUType>\n\tstatic int findLSB_095(genIUType Value)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, \"'findLSB' only accept integer values\");\n\t\tif(Value == 0)\n\t\t\treturn -1;\n\n\t\tgenIUType Bit;\n\t\tfor(Bit = genIUType(0); !(Value & (1 << Bit)); ++Bit){}\n\t\treturn Bit;\n\t}\n\n\ttemplate<typename genIUType>\n\tstatic int findLSB_ntz2(genIUType x)\n\t{\n\t\tif(x == 0)\n\t\t\treturn -1;\n\n\t\treturn glm::bitCount(~x & (x - static_cast<genIUType>(1)));\n\t}\n\n\ttemplate<typename genIUType>\n\tstatic int findLSB_branchfree(genIUType x)\n\t{\n\t\tbool IsNull(x == 0);\n\t\tint const Keep(!IsNull);\n\t\tint const Discard(IsNull);\n\n\t\treturn static_cast<int>(glm::bitCount(~x & (x - static_cast<genIUType>(1)))) * Keep + Discard * -1;\n\t}\n\n\tstatic int test_int()\n\t{\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result = glm::findLSB(DataI32[i].Value);\n\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result = findLSB_095(DataI32[i].Value);\n\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t}\n\n#\t\tif GLM_HAS_BITSCAN_WINDOWS\n\t\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t\t{\n\t\t\t\tint Result = findLSB_intrinsic(DataI32[i].Value);\n\t\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t\t}\n#\t\tendif\n\n\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result = findLSB_ntz2(DataI32[i].Value);\n\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result = findLSB_branchfree(DataI32[i].Value);\n\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\n\t\tError += test_int();\n\n\t\treturn Error;\n\t}\n\n\tstatic int perf_int(std::size_t Count)\n\t{\n\t\tint Error(0);\n\n\t\tstd::clock_t Timestamps0 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result = glm::findLSB(DataI32[i].Value);\n\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps1 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result = findLSB_095(DataI32[i].Value);\n\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps2 = std::clock();\n\n#\t\tif GLM_HAS_BITSCAN_WINDOWS\n\t\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t\t{\n\t\t\t\tint Result = findLSB_intrinsic(DataI32[i].Value);\n\t\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t\t}\n#\t\tendif\n\n\t\tstd::clock_t Timestamps3 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result = findLSB_ntz2(DataI32[i].Value);\n\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps4 = std::clock();\n\n\t\tfor(std::size_t k = 0; k < Count; ++k)\n\t\tfor(std::size_t i = 0; i < sizeof(DataI32) / sizeof(entry); ++i)\n\t\t{\n\t\t\tint Result = findLSB_branchfree(DataI32[i].Value);\n\t\t\tError += DataI32[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tstd::clock_t Timestamps5 = std::clock();\n\n\t\tstd::printf(\"glm::findLSB: %d clocks\\n\", static_cast<unsigned int>(Timestamps1 - Timestamps0));\n\t\tstd::printf(\"findLSB - 0.9.5: %d clocks\\n\", static_cast<unsigned int>(Timestamps2 - Timestamps1));\n\n#\t\tif GLM_HAS_BITSCAN_WINDOWS\n\t\t\tstd::printf(\"findLSB - intrinsics: %d clocks\\n\", static_cast<unsigned int>(Timestamps3 - Timestamps2));\n#\t\tendif\n\n\t\tstd::printf(\"findLSB - ntz2: %d clocks\\n\", static_cast<unsigned int>(Timestamps4 - Timestamps3));\n\t\tstd::printf(\"findLSB - branchfree: %d clocks\\n\", static_cast<unsigned int>(Timestamps5 - Timestamps4));\n\n\t\treturn Error;\n\t}\n\n\tstatic int perf(std::size_t Samples)\n\t{\n\t\tint Error(0);\n\n\t\tError += perf_int(Samples);\n\n\t\treturn Error;\n\t}\n}//findLSB\n\nnamespace uaddCarry\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\t\t\n\t\t{\n\t\t\tglm::uint x = std::numeric_limits<glm::uint>::max();\n\t\t\tglm::uint y = 0;\n\t\t\tglm::uint Carry = 0;\n\t\t\tglm::uint Result = glm::uaddCarry(x, y, Carry);\n\n\t\t\tError += Carry == 0 ? 0 : 1;\n\t\t\tError += Result == std::numeric_limits<glm::uint>::max() ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uint x = std::numeric_limits<glm::uint>::max();\n\t\t\tglm::uint y = 1;\n\t\t\tglm::uint Carry = 0;\n\t\t\tglm::uint Result = glm::uaddCarry(x, y, Carry);\n\n\t\t\tError += Carry == 1 ? 0 : 1;\n\t\t\tError += Result == 0 ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec1 x(std::numeric_limits<glm::uint>::max());\n\t\t\tglm::uvec1 y(0);\n\t\t\tglm::uvec1 Carry(0);\n\t\t\tglm::uvec1 Result(glm::uaddCarry(x, y, Carry));\n\n\t\t\tError += glm::all(glm::equal(Carry, glm::uvec1(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(Result, glm::uvec1(std::numeric_limits<glm::uint>::max()))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec1 x(std::numeric_limits<glm::uint>::max());\n\t\t\tglm::uvec1 y(1);\n\t\t\tglm::uvec1 Carry(0);\n\t\t\tglm::uvec1 Result(glm::uaddCarry(x, y, Carry));\n\n\t\t\tError += glm::all(glm::equal(Carry, glm::uvec1(1))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(Result, glm::uvec1(0))) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace uaddCarry\n\nnamespace usubBorrow\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\t\t\n\t\t{\n\t\t\tglm::uint x = 16;\n\t\t\tglm::uint y = 17;\n\t\t\tglm::uint Borrow = 0;\n\t\t\tglm::uint Result = glm::usubBorrow(x, y, Borrow);\n\n\t\t\tError += Borrow == 1 ? 0 : 1;\n\t\t\tError += Result == 1 ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec1 x(16);\n\t\t\tglm::uvec1 y(17);\n\t\t\tglm::uvec1 Borrow(0);\n\t\t\tglm::uvec1 Result(glm::usubBorrow(x, y, Borrow));\n\n\t\t\tError += glm::all(glm::equal(Borrow, glm::uvec1(1))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(Result, glm::uvec1(1))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec2 x(16);\n\t\t\tglm::uvec2 y(17);\n\t\t\tglm::uvec2 Borrow(0);\n\t\t\tglm::uvec2 Result(glm::usubBorrow(x, y, Borrow));\n\n\t\t\tError += glm::all(glm::equal(Borrow, glm::uvec2(1))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(Result, glm::uvec2(1))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec3 x(16);\n\t\t\tglm::uvec3 y(17);\n\t\t\tglm::uvec3 Borrow(0);\n\t\t\tglm::uvec3 Result(glm::usubBorrow(x, y, Borrow));\n\n\t\t\tError += glm::all(glm::equal(Borrow, glm::uvec3(1))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(Result, glm::uvec3(1))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec4 x(16);\n\t\t\tglm::uvec4 y(17);\n\t\t\tglm::uvec4 Borrow(0);\n\t\t\tglm::uvec4 Result(glm::usubBorrow(x, y, Borrow));\n\n\t\t\tError += glm::all(glm::equal(Borrow, glm::uvec4(1))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(Result, glm::uvec4(1))) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace usubBorrow\n\nnamespace umulExtended\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\t\t\n\t\t{\n\t\t\tglm::uint x = 2;\n\t\t\tglm::uint y = 3;\n\t\t\tglm::uint msb = 0;\n\t\t\tglm::uint lsb = 0;\n\t\t\tglm::umulExtended(x, y, msb, lsb);\n\n\t\t\tError += msb == 0 ? 0 : 1;\n\t\t\tError += lsb == 6 ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec1 x(2);\n\t\t\tglm::uvec1 y(3);\n\t\t\tglm::uvec1 msb(0);\n\t\t\tglm::uvec1 lsb(0);\n\t\t\tglm::umulExtended(x, y, msb, lsb);\n\n\t\t\tError += glm::all(glm::equal(msb, glm::uvec1(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(lsb, glm::uvec1(6))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec2 x(2);\n\t\t\tglm::uvec2 y(3);\n\t\t\tglm::uvec2 msb(0);\n\t\t\tglm::uvec2 lsb(0);\n\t\t\tglm::umulExtended(x, y, msb, lsb);\n\n\t\t\tError += glm::all(glm::equal(msb, glm::uvec2(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(lsb, glm::uvec2(6))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec3 x(2);\n\t\t\tglm::uvec3 y(3);\n\t\t\tglm::uvec3 msb(0);\n\t\t\tglm::uvec3 lsb(0);\n\t\t\tglm::umulExtended(x, y, msb, lsb);\n\n\t\t\tError += glm::all(glm::equal(msb, glm::uvec3(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(lsb, glm::uvec3(6))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::uvec4 x(2);\n\t\t\tglm::uvec4 y(3);\n\t\t\tglm::uvec4 msb(0);\n\t\t\tglm::uvec4 lsb(0);\n\t\t\tglm::umulExtended(x, y, msb, lsb);\n\n\t\t\tError += glm::all(glm::equal(msb, glm::uvec4(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(lsb, glm::uvec4(6))) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace umulExtended\n\nnamespace imulExtended\n{\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\t\t\n\t\t{\n\t\t\tint x = 2;\n\t\t\tint y = 3;\n\t\t\tint msb = 0;\n\t\t\tint lsb = 0;\n\t\t\tglm::imulExtended(x, y, msb, lsb);\n\n\t\t\tError += msb == 0 ? 0 : 1;\n\t\t\tError += lsb == 6 ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::ivec1 x(2);\n\t\t\tglm::ivec1 y(3);\n\t\t\tglm::ivec1 msb(0);\n\t\t\tglm::ivec1 lsb(0);\n\t\t\tglm::imulExtended(x, y, msb, lsb);\n\n\t\t\tError += glm::all(glm::equal(msb, glm::ivec1(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(lsb, glm::ivec1(6))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::ivec2 x(2);\n\t\t\tglm::ivec2 y(3);\n\t\t\tglm::ivec2 msb(0);\n\t\t\tglm::ivec2 lsb(0);\n\t\t\tglm::imulExtended(x, y, msb, lsb);\n\n\t\t\tError += glm::all(glm::equal(msb, glm::ivec2(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(lsb, glm::ivec2(6))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::ivec3 x(2);\n\t\t\tglm::ivec3 y(3);\n\t\t\tglm::ivec3 msb(0);\n\t\t\tglm::ivec3 lsb(0);\n\t\t\tglm::imulExtended(x, y, msb, lsb);\n\n\t\t\tError += glm::all(glm::equal(msb, glm::ivec3(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(lsb, glm::ivec3(6))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::ivec4 x(2);\n\t\t\tglm::ivec4 y(3);\n\t\t\tglm::ivec4 msb(0);\n\t\t\tglm::ivec4 lsb(0);\n\t\t\tglm::imulExtended(x, y, msb, lsb);\n\n\t\t\tError += glm::all(glm::equal(msb, glm::ivec4(0))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(lsb, glm::ivec4(6))) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace imulExtended\n\nnamespace bitCount\n{\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tgenType\t\tReturn;\n\t};\n\n\ttype<int> const DataI32[] =\n\t{\n\t\t{0x00000001,  1},\n\t\t{0x00000003,  2},\n\t\t{0x00000002,  1},\n\t\t{0x7fffffff, 31},\n\t\t{0x00000000,  0}\n\t};\n\n\ttemplate<typename T>\n\tinline int bitCount_if(T v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'bitCount' only accept integer values\");\n\n\t\tint Count(0);\n\t\tfor(T i = 0, n = static_cast<T>(sizeof(T) * 8); i < n; ++i)\n\t\t{\n\t\t\tif(v & static_cast<T>(1 << i))\n\t\t\t\t++Count;\n\t\t}\n\t\treturn Count;\n\t}\n\n\ttemplate<typename T>\n\tinline int bitCount_vec(T v)\n\t{\n\t\tGLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, \"'bitCount' only accept integer values\");\n\n\t\tint Count(0);\n\t\tfor(T i = 0, n = static_cast<T>(sizeof(T) * 8); i < n; ++i)\n\t\t{\n\t\t\tCount += static_cast<int>((v >> i) & static_cast<T>(1));\n\t\t}\n\t\treturn Count;\n\t}\n\n\ttemplate<bool EXEC = false>\n\tstruct compute_bitfieldBitCountStep\n\t{\n\t\ttemplate<glm::length_t L, typename T, glm::qualifier Q>\n\t\tGLM_FUNC_QUALIFIER static glm::vec<L, T, Q> call(glm::vec<L, T, Q> const& v, T, T)\n\t\t{\n\t\t\treturn v;\n\t\t}\n\t};\n\n\ttemplate<>\n\tstruct compute_bitfieldBitCountStep<true>\n\t{\n\t\ttemplate<glm::length_t L, typename T, glm::qualifier Q>\n\t\tGLM_FUNC_QUALIFIER static glm::vec<L, T, Q> call(glm::vec<L, T, Q> const& v, T Mask, T Shift)\n\t\t{\n\t\t\treturn (v & Mask) + ((v >> Shift) & Mask);\n\t\t}\n\t};\n\n\ttemplate<glm::length_t L, typename T, glm::qualifier Q>\n\tstatic glm::vec<L, int, Q> bitCount_bitfield(glm::vec<L, T, Q> const& v)\n\t{\n\t\tglm::vec<L, typename glm::detail::make_unsigned<T>::type, Q> x(*reinterpret_cast<glm::vec<L, typename glm::detail::make_unsigned<T>::type, Q> const *>(&v));\n\t\tx = compute_bitfieldBitCountStep<sizeof(T) * 8 >=  2>::call(x, static_cast<typename glm::detail::make_unsigned<T>::type>(0x5555555555555555ull), static_cast<typename glm::detail::make_unsigned<T>::type>( 1));\n\t\tx = compute_bitfieldBitCountStep<sizeof(T) * 8 >=  4>::call(x, static_cast<typename glm::detail::make_unsigned<T>::type>(0x3333333333333333ull), static_cast<typename glm::detail::make_unsigned<T>::type>( 2));\n\t\tx = compute_bitfieldBitCountStep<sizeof(T) * 8 >=  8>::call(x, static_cast<typename glm::detail::make_unsigned<T>::type>(0x0F0F0F0F0F0F0F0Full), static_cast<typename glm::detail::make_unsigned<T>::type>( 4));\n\t\tx = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 16>::call(x, static_cast<typename glm::detail::make_unsigned<T>::type>(0x00FF00FF00FF00FFull), static_cast<typename glm::detail::make_unsigned<T>::type>( 8));\n\t\tx = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 32>::call(x, static_cast<typename glm::detail::make_unsigned<T>::type>(0x0000FFFF0000FFFFull), static_cast<typename glm::detail::make_unsigned<T>::type>(16));\n\t\tx = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 64>::call(x, static_cast<typename glm::detail::make_unsigned<T>::type>(0x00000000FFFFFFFFull), static_cast<typename glm::detail::make_unsigned<T>::type>(32));\n\t\treturn glm::vec<L, int, Q>(x);\n\t}\n\n\ttemplate<typename genType>\n\tstatic int bitCount_bitfield(genType x)\n\t{\n\t\treturn bitCount_bitfield(glm::vec<1, genType, glm::defaultp>(x)).x;\n\t}\n\n\tstatic int perf(std::size_t Size)\n\t{\n\t\tint Error(0);\n\n\t\tstd::vector<int> v;\n\t\tv.resize(Size);\n\n\t\tstd::vector<glm::ivec4> w;\n\t\tw.resize(Size);\n\n\n\t\tstd::clock_t TimestampsA = std::clock();\n\n\t\t// bitCount - TimeIf\n\t\t{\n\t\t\tfor(std::size_t i = 0, n = v.size(); i < n; ++i)\n\t\t\t\tv[i] = bitCount_if(static_cast<int>(i));\n\t\t}\n\n\t\tstd::clock_t TimestampsB = std::clock();\n\n\t\t// bitCount - TimeVec\n\t\t{\n\t\t\tfor(std::size_t i = 0, n = v.size(); i < n; ++i)\n\t\t\t\tv[i] = bitCount_vec(i);\n\t\t}\n\n\t\tstd::clock_t TimestampsC = std::clock();\n\n\t\t// bitCount - TimeDefault\n\t\t{\n\t\t\tfor(std::size_t i = 0, n = v.size(); i < n; ++i)\n\t\t\t\tv[i] = glm::bitCount(i);\n\t\t}\n\n\t\tstd::clock_t TimestampsD = std::clock();\n\n\t\t// bitCount - TimeVec4\n\t\t{\n\t\t\tfor(std::size_t i = 0, n = v.size(); i < n; ++i)\n\t\t\t\tw[i] = glm::bitCount(glm::ivec4(static_cast<int>(i)));\n\t\t}\n\n\t\tstd::clock_t TimestampsE = std::clock();\n\n\t\t{\n\t\t\tfor(std::size_t i = 0, n = v.size(); i < n; ++i)\n\t\t\t\tv[i] = bitCount_bitfield(static_cast<int>(i));\n\t\t}\n\n\t\tstd::clock_t TimestampsF = std::clock();\n\n\t\tstd::printf(\"bitCount - TimeIf %d\\n\", static_cast<unsigned int>(TimestampsB - TimestampsA));\n\t\tstd::printf(\"bitCount - TimeVec %d\\n\", static_cast<unsigned int>(TimestampsC - TimestampsB));\n\t\tstd::printf(\"bitCount - TimeDefault %d\\n\", static_cast<unsigned int>(TimestampsD - TimestampsC));\n\t\tstd::printf(\"bitCount - TimeVec4 %d\\n\", static_cast<unsigned int>(TimestampsE - TimestampsD));\n\t\tstd::printf(\"bitCount - bitfield %d\\n\", static_cast<unsigned int>(TimestampsF - TimestampsE));\n\n\t\treturn Error;\n\t}\n\n\tstatic int test()\n\t{\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(DataI32) / sizeof(type<int>); i < n; ++i)\n\t\t{\n\t\t\tint ResultA = glm::bitCount(DataI32[i].Value);\n\t\t\tint ResultB = bitCount_if(DataI32[i].Value);\n\t\t\tint ResultC = bitCount_vec(DataI32[i].Value);\n\t\t\tint ResultE = bitCount_bitfield(DataI32[i].Value);\n\n\t\t\tError += DataI32[i].Return == ResultA ? 0 : 1;\n\t\t\tError += DataI32[i].Return == ResultB ? 0 : 1;\n\t\t\tError += DataI32[i].Return == ResultC ? 0 : 1;\n\t\t\tError += DataI32[i].Return == ResultE ? 0 : 1;\n\n\t\t\tassert(!Error);\n\t\t}\n\n\t\treturn Error;\n\t}\n}//bitCount\n\nint main()\n{\n\tint Error = 0;\n\n\tError += ::bitCount::test();\n\tError += ::bitfieldReverse::test();\n\tError += ::findMSB::test();\n\tError += ::findLSB::test();\n\tError += ::umulExtended::test();\n\tError += ::imulExtended::test();\n\tError += ::uaddCarry::test();\n\tError += ::usubBorrow::test();\n\tError += ::bitfieldInsert::test();\n\tError += ::bitfieldExtract::test();\n\n#\tifdef NDEBUG\n\t\tstd::size_t const Samples = 1000;\n#\telse\n\t\tstd::size_t const Samples = 1;\n#\tendif\n\n\t::bitCount::perf(Samples);\n\t::bitfieldReverse::perf(Samples);\n\t::findMSB::perf(Samples);\n\t::findLSB::perf(Samples);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_func_integer_bit_count.cpp",
    "content": "// This has the programs for computing the number of 1-bits\n// in a word, or byte, etc.\n// Max line length is 57, to fit in hacker.book.\n#include <stdio.h>\n#include <stdlib.h>     //To define \"exit\", req'd by XLC.\n#include <ctime>\n\nunsigned rotatel(unsigned x, int n)\n{\n\tif (static_cast<unsigned>(n) > 63) {printf(\"rotatel, n out of range.\\n\"); exit(1);}\n\treturn (x << n) | (x >> (32 - n));\n}\n\nint pop0(unsigned x)\n{\n\tx = (x & 0x55555555) + ((x >> 1) & 0x55555555);\n\tx = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n\tx = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);\n\tx = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);\n\tx = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF);\n\treturn x;\n}\n\nint pop1(unsigned x)\n{\n\tx = x - ((x >> 1) & 0x55555555);\n\tx = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n\tx = (x + (x >> 4)) & 0x0F0F0F0F;\n\tx = x + (x >> 8);\n\tx = x + (x >> 16);\n\treturn x & 0x0000003F;\n}\n/* Note: an alternative to the last three executable lines above is:\n   return x*0x01010101 >> 24;\nif your machine has a fast multiplier (suggested by Jari Kirma). */\n\nint pop2(unsigned x)\n{\n\tunsigned n;\n\n\tn = (x >> 1) & 033333333333;       // Count bits in\n\tx = x - n;                         // each 3-bit\n\tn = (n >> 1) & 033333333333;       // field.\n\tx = x - n;\n\tx = (x + (x >> 3)) & 030707070707; // 6-bit sums.\n\treturn x%63;                       // Add 6-bit sums.\n}\n\n/* An alternative to the \"return\" statement above is:\n   return ((x * 0404040404) >> 26) +  // Add 6-bit sums.\n           (x >> 30);\nwhich runs faster on most machines (suggested by Norbert Juffa). */\n\nint pop3(unsigned x)\n{\n\tunsigned n;\n\n\tn = (x >> 1) & 0x77777777;        // Count bits in\n\tx = x - n;                        // each 4-bit\n\tn = (n >> 1) & 0x77777777;        // field.\n\tx = x - n;\n\tn = (n >> 1) & 0x77777777;\n\tx = x - n;\n\tx = (x + (x >> 4)) & 0x0F0F0F0F;  // Get byte sums.\n\tx = x*0x01010101;                 // Add the bytes.\n\treturn x >> 24;\n}\n\nint pop4(unsigned x)\n{\n\tint n;\n\n\tn = 0;\n\twhile (x != 0) {\n\t\tn = n + 1;\n\t\tx = x & (x - 1);\n\t}\n\treturn n;\n}\n\nint pop5(unsigned x)\n{\n\tint i, sum;\n\n\t// Rotate and sum method        // Shift right & subtract\n\n\tsum = x;                     // sum = x;\n\tfor (i = 1; i <= 31; i++) {  // while (x != 0) {\n\t\tx = rotatel(x, 1);        //    x = x >> 1;\n\t\tsum = sum + x;            //    sum = sum - x;\n\t}                            // }\n\treturn -sum;                 // return sum;\n}\n\nint pop5a(unsigned x)\n{\n\tint sum;\n\n\t// Shift right & subtract\n\n\tsum = x;\n\twhile (x != 0) {\n\t\tx = x >> 1;\n\t\tsum = sum - x;\n\t}\n\treturn sum;\n}\n\nint pop6(unsigned x)\n{ // Table lookup.\n\tstatic char table[256] = {\n\t\t0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n\t\t1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n\t\t1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n\t\t2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n\n\t\t1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n\t\t2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n\t\t2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n\t\t3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n\n\t\t1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n\t\t2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n\t\t2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n\t\t3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n\n\t\t2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n\t\t3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n\t\t3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n\t\t4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};\n\n\treturn table[x         & 0xFF] +\n\t\t\ttable[(x >>  8) & 0xFF] +\n\t\t\ttable[(x >> 16) & 0xFF] +\n\t\t\ttable[(x >> 24)];\n}\n\n// The following works only for 8-bit quantities.\nint pop7(unsigned x)\n{\n\tx = x*0x08040201;    // Make 4 copies.\n\tx = x >> 3;          // So next step hits proper bits.\n\tx = x & 0x11111111;  // Every 4th bit.\n\tx = x*0x11111111;    // Sum the digits (each 0 or 1).\n\tx = x >> 28;         // Position the result.\n\treturn x;\n}\n\n// The following works only for 7-bit quantities.\nint pop8(unsigned x)\n{\n\tx = x*0x02040810;    // Make 4 copies, left-adjusted.\n\tx = x & 0x11111111;  // Every 4th bit.\n\tx = x*0x11111111;    // Sum the digits (each 0 or 1).\n\tx = x >> 28;         // Position the result.\n\treturn x;\n}\n\n// The following works only for 15-bit quantities.\nint pop9(unsigned x)\n{\n\tunsigned long long y;\n\ty = x * 0x0002000400080010ULL;\n\ty = y & 0x1111111111111111ULL;\n\ty = y * 0x1111111111111111ULL;\n\ty = y >> 60;\n\treturn static_cast<int>(y);\n}\n\nint errors;\nvoid error(int x, int y)\n{\n\terrors = errors + 1;\n\tprintf(\"Error for x = %08x, got %08x\\n\", x, y);\n}\n\nint main()\n{\n#\tifdef NDEBUG\n\n\tint i, n;\n\tstatic unsigned test[] = {0,0, 1,1, 2,1, 3,2, 4,1, 5,2, 6,2, 7,3,\n\t\t8,1, 9,2, 10,2, 11,3, 12,2, 13,3, 14,3, 15,4, 16,1, 17,2,\n\t\t0x3F,6, 0x40,1, 0x41,2, 0x7f,7, 0x80,1, 0x81,2, 0xfe,7, 0xff,8,\n\t\t0x4000,1, 0x4001,2, 0x7000,3, 0x7fff,15,\n\t\t0x55555555,16, 0xAAAAAAAA, 16, 0xFF000000,8, 0xC0C0C0C0,8,\n\t\t0x0FFFFFF0,24, 0x80000000,1, 0xFFFFFFFF,32};\n\n\tstd::size_t const Count = 1000000;\n\n\tn = sizeof(test)/4;\n\n\tstd::clock_t TimestampBeg = 0;\n\tstd::clock_t TimestampEnd = 0;\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (pop0(test[i]) != test[i+1]) error(test[i], pop0(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop0: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (pop1(test[i]) != test[i+1]) error(test[i], pop1(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop1: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (pop2(test[i]) != test[i+1]) error(test[i], pop2(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop2: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (pop3(test[i]) != test[i+1]) error(test[i], pop3(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop3: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (pop4(test[i]) != test[i+1]) error(test[i], pop4(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop4: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (pop5(test[i]) != test[i+1]) error(test[i], pop5(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop5: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (pop5a(test[i]) != test[i+1]) error(test[i], pop5a(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop5a: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (pop6(test[i]) != test[i+1]) error(test[i], pop6(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop6: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif ((test[i] & 0xffffff00) == 0)\n\t\tif (pop7(test[i]) != test[i+1]) error(test[i], pop7(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop7: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif ((test[i] & 0xffffff80) == 0)\n\t\tif (pop8(test[i]) != test[i+1]) error(test[i], pop8(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop8: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif ((test[i] & 0xffff8000) == 0)\n\t\tif (pop9(test[i]) != test[i+1]) error(test[i], pop9(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"pop9: %ld clocks\\n\", TimestampEnd - TimestampBeg);\n\n\tif (errors == 0)\n\t\tprintf(\"Passed all %d cases.\\n\", static_cast<int>(sizeof(test)/8));\n\n#\tendif//NDEBUG\n}\n"
  },
  {
    "path": "external/glm/test/core/core_func_integer_find_lsb.cpp",
    "content": "#include <glm/glm.hpp>\n#include <cstdio>\n#include <cstdlib>     //To define \"exit\", req'd by XLC.\n#include <ctime>\n\nint nlz(unsigned x) {\n   int pop(unsigned x);\n\n   x = x | (x >> 1);\n   x = x | (x >> 2);\n   x = x | (x >> 4);\n   x = x | (x >> 8);\n   x = x | (x >>16);\n   return pop(~x);\n}\n\nint pop(unsigned x) {\n   x = x - ((x >> 1) & 0x55555555);\n   x = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n   x = (x + (x >> 4)) & 0x0F0F0F0F;\n   x = x + (x << 8);\n   x = x + (x << 16);\n   return x >> 24;\n}\n\nint ntz1(unsigned x) {\n   return 32 - nlz(~x & (x-1));\n}\n\nint ntz2(unsigned x) {\n   return pop(~x & (x - 1));\n}\n\nint ntz3(unsigned x) {\n   int n;\n\n   if (x == 0) return(32);\n   n = 1;\n   if ((x & 0x0000FFFF) == 0) {n = n +16; x = x >>16;}\n   if ((x & 0x000000FF) == 0) {n = n + 8; x = x >> 8;}\n   if ((x & 0x0000000F) == 0) {n = n + 4; x = x >> 4;}\n   if ((x & 0x00000003) == 0) {n = n + 2; x = x >> 2;}\n   return n - (x & 1);\n}\n\nint ntz4(unsigned x) {\n   unsigned y;\n   int n;\n\n   if (x == 0) return 32;\n   n = 31;\n   y = x <<16;  if (y != 0) {n = n -16;  x = y;}\n   y = x << 8;  if (y != 0) {n = n - 8;  x = y;}\n   y = x << 4;  if (y != 0) {n = n - 4;  x = y;}\n   y = x << 2;  if (y != 0) {n = n - 2;  x = y;}\n   y = x << 1;  if (y != 0) {n = n - 1;}\n   return n;\n}\n\nint ntz4a(unsigned x) {\n   unsigned y;\n   int n;\n\n   if (x == 0) return 32;\n   n = 31;\n   y = x <<16;  if (y != 0) {n = n -16;  x = y;}\n   y = x << 8;  if (y != 0) {n = n - 8;  x = y;}\n   y = x << 4;  if (y != 0) {n = n - 4;  x = y;}\n   y = x << 2;  if (y != 0) {n = n - 2;  x = y;}\n   n = n - ((x << 1) >> 31);\n   return n;\n}\n\nint ntz5(char x)\n{\n\tif (x & 15) {\n\t\tif (x & 3) {\n\t\t\tif (x & 1) return 0;\n\t\t\telse return 1;\n\t\t}\n\t\telse if (x & 4) return 2;\n\t\telse return 3;\n\t}\n\telse if (x & 0x30) {\n\t\tif (x & 0x10) return 4;\n\t\telse return 5;\n\t}\n\telse if (x & 0x40) return 6;\n\telse if (x) return 7;\n\telse return 8;\n}\n\nint ntz6(unsigned x) {\n   int n;\n\n   x = ~x & (x - 1);\n   n = 0;                       // n = 32;\n   while(x != 0) {              // while (x != 0) {\n      n = n + 1;                //    n = n - 1;\n      x = x >> 1;               //    x = x + x;\n   }                            // }\n   return n;                    // return n;\n}\n\nint ntz6a(unsigned x)\n{\n\tint n = 32;\n\n\twhile (x != 0) {\n\t\tn = n - 1;\n\t\tx = x + x;\n\t}\n\treturn n;\n}\n\n/* Dean Gaudet's algorithm. To be most useful there must be a good way\nto evaluate the C \"conditional expression\" (a?b:c construction) without\nbranching. The result of a?b:c is b if a is true (nonzero), and c if a\nis false (0).\n   For example, a compare to zero op that sets a target GPR to 1 if the\noperand is 0, and to 0 if the operand is nonzero, will do it. With this\ninstruction, the algorithm is entirely branch-free. But the most\ninteresting thing about it is the high degree of parallelism. All six\nlines with conditional expressions can be executed in parallel (on a\nmachine with sufficient computational units).\n   Although the instruction count is 30 measured statically, it could\nexecute in only 10 cycles on a machine with sufficient parallelism.\n   The first two uses of y can instead be x, which would increase the\nuseful parallelism on most machines (the assignments to y, bz, and b4\ncould then all run in parallel). */\n\nint ntz7(unsigned x)\n{\n\tunsigned y, bz, b4, b3, b2, b1, b0;\n\n\ty = x & -x;               // Isolate rightmost 1-bit.\n\tbz = y ? 0 : 1;           // 1 if y = 0.\n\tb4 = (y & 0x0000FFFF) ? 0 : 16;\n\tb3 = (y & 0x00FF00FF) ? 0 : 8;\n\tb2 = (y & 0x0F0F0F0F) ? 0 : 4;\n\tb1 = (y & 0x33333333) ? 0 : 2;\n\tb0 = (y & 0x55555555) ? 0 : 1;\n\treturn bz + b4 + b3 + b2 + b1 + b0;\n}\n\n// This file has divisions by zero to test isnan\n#if GLM_COMPILER & GLM_COMPILER_VC\n#\tpragma warning(disable : 4800)\n#endif\n\nint ntz7_christophe(unsigned x)\n{\n\tunsigned y, bz, b4, b3, b2, b1, b0;\n\n\ty = x & -x;               // Isolate rightmost 1-bit.\n\tbz = unsigned(!bool(y));           // 1 if y = 0.\n\tb4 = unsigned(!bool(y & 0x0000FFFF)) * 16;\n\tb3 = unsigned(!bool(y & 0x00FF00FF)) * 8;\n\tb2 = unsigned(!bool(y & 0x0F0F0F0F)) * 4;\n\tb1 = unsigned(!bool(y & 0x33333333)) * 2;\n\tb0 = unsigned(!bool(y & 0x55555555)) * 1;\n\treturn bz + b4 + b3 + b2 + b1 + b0;\n}\n\n/* Below is David Seal's algorithm, found at\nhttp://www.ciphersbyritter.com/NEWS4/BITCT.HTM Table\nentries marked \"u\" are unused. 6 ops including a\nmultiply, plus an indexed load. */\n\n#define u 99\nint ntz8(unsigned x)\n{\n\tstatic char table[64] =\n\t\t{32, 0, 1,12, 2, 6, u,13,   3, u, 7, u, u, u, u,14,\n\t\t10, 4, u, u, 8, u, u,25,   u, u, u, u, u,21,27,15,\n\t\t31,11, 5, u, u, u, u, u,   9, u, u,24, u, u,20,26,\n\t\t30, u, u, u, u,23, u,19,  29, u,22,18,28,17,16, u};\n\n\tx = (x & -x)*0x0450FBAF;\n\treturn table[x >> 26];\n}\n\n/* Seal's algorithm with multiply expanded.\n9 elementary ops plus an indexed load. */\n\nint ntz8a(unsigned x)\n{\n\tstatic char table[64] =\n\t\t{32, 0, 1,12, 2, 6, u,13,   3, u, 7, u, u, u, u,14,\n\t\t10, 4, u, u, 8, u, u,25,   u, u, u, u, u,21,27,15,\n\t\t31,11, 5, u, u, u, u, u,   9, u, u,24, u, u,20,26,\n\t\t30, u, u, u, u,23, u,19,  29, u,22,18,28,17,16, u};\n\n\tx = (x & -x);\n\tx = (x << 4) + x;    // x = x*17.\n\tx = (x << 6) + x;    // x = x*65.\n\tx = (x << 16) - x;   // x = x*65535.\n\treturn table[x >> 26];\n}\n\n/* Reiser's algorithm. Three ops including a \"remainder,\"\nplus an indexed load. */\n\nint ntz9(unsigned x) {\n\n   static char table[37] = {32,  0,  1, 26,  2, 23, 27,\n                 u,  3, 16, 24, 30, 28, 11,  u, 13,  4,\n                 7, 17,  u, 25, 22, 31, 15, 29, 10, 12,\n                 6,  u, 21, 14,  9,  5, 20,  8, 19, 18};\n\n   x = (x & -x)%37;\n   return table[x];\n}\n\n/* Using a de Bruijn sequence. This is a table lookup with a 32-entry\ntable. The de Bruijn sequence used here is\n                0000 0100 1101 0111 0110 0101 0001 1111,\nobtained from Danny Dube's October 3, 1997, posting in\ncomp.compression.research. Thanks to Norbert Juffa for this reference. */\n\nint ntz10(unsigned x) {\n\n   static char table[32] =\n     { 0, 1, 2,24, 3,19, 6,25,  22, 4,20,10,16, 7,12,26,\n      31,23,18, 5,21, 9,15,11,  30,17, 8,14,29,13,28,27};\n\n   if (x == 0) return 32;\n   x = (x & -x)*0x04D7651F;\n   return table[x >> 27];\n}\n\n/* Norbert Juffa's code, answer to exercise 1 of Chapter 5 (2nd ed). */\n\n#define SLOW_MUL\nint ntz11 (unsigned int n) {\n\n   static unsigned char tab[32] =\n   {   0,  1,  2, 24,  3, 19, 6,  25,\n      22,  4, 20, 10, 16,  7, 12, 26,\n      31, 23, 18,  5, 21,  9, 15, 11,\n      30, 17,  8, 14, 29, 13, 28, 27\n   };\n   unsigned int k;\n   n = n & (-n);        /* isolate lsb */\n   printf(\"n = %d\\n\", n);\n#if defined(SLOW_MUL)\n   k = (n << 11) - n;\n   k = (k <<  2) + k;\n   k = (k <<  8) + n;\n   k = (k <<  5) - k;\n#else\n   k = n * 0x4d7651f;\n#endif\n   return n ? tab[k>>27] : 32;\n}\n\nint errors;\nvoid error(int x, int y) {\n   errors = errors + 1;\n   printf(\"Error for x = %08x, got %d\\n\", x, y);\n}\n\nint main()\n{\n#\tifdef NDEBUG\n\n\tint i, m, n;\n\tstatic unsigned test[] = {0,32, 1,0, 2,1, 3,0, 4,2, 5,0, 6,1,  7,0,\n\t\t8,3, 9,0, 16,4, 32,5, 64,6, 128,7, 255,0, 256,8, 512,9, 1024,10,\n\t\t2048,11, 4096,12, 8192,13, 16384,14, 32768,15, 65536,16,\n\t\t0x20000,17, 0x40000,18, 0x80000,19, 0x100000,20, 0x200000,21,\n\t\t0x400000,22, 0x800000,23, 0x1000000,24, 0x2000000,25,\n\t\t0x4000000,26, 0x8000000,27, 0x10000000,28, 0x20000000,29,\n\t\t0x40000000,30, 0x80000000,31, 0xFFFFFFF0,4, 0x3000FF00,8,\n\t\t0xC0000000,30, 0x60000000,29, 0x00011000, 12};\n\n\tstd::size_t const Count = 1000;\n\n\tn = sizeof(test)/4;\n\n\tstd::clock_t TimestampBeg = 0;\n\tstd::clock_t TimestampEnd = 0;\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz1(test[i]) != test[i+1]) error(test[i], ntz1(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz1: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz2(test[i]) != test[i+1]) error(test[i], ntz2(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz2: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz3(test[i]) != test[i+1]) error(test[i], ntz3(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz3: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz4(test[i]) != test[i+1]) error(test[i], ntz4(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz4: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz4a(test[i]) != test[i+1]) error(test[i], ntz4a(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz4a: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor(std::size_t k = 0; k < Count; ++k)\n\tfor(i = 0; i < n; i += 2)\n\t{\n\t\tm = test[i+1];\n\t\tif(m > 8)\n\t\t\tm = 8;\n\t\tif(ntz5(static_cast<char>(test[i])) != m)\n\t\t\terror(test[i], ntz5(static_cast<char>(test[i])));\n\t}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz5: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz6(test[i]) != test[i+1]) error(test[i], ntz6(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz6: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz6a(test[i]) != test[i+1]) error(test[i], ntz6a(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz6a: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz7(test[i]) != test[i+1]) error(test[i], ntz7(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz7: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz7_christophe(test[i]) != test[i+1]) error(test[i], ntz7(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz7_christophe: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz8(test[i]) != test[i+1]) error(test[i], ntz8(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz8: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz8a(test[i]) != test[i+1]) error(test[i], ntz8a(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz8a: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz9(test[i]) != test[i+1]) error(test[i], ntz9(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz9: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (ntz10(test[i]) != test[i+1]) error(test[i], ntz10(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"ntz10: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tif (errors == 0)\n\t\tprintf(\"Passed all %d cases.\\n\", static_cast<int>(sizeof(test)/8));\n\n#\tendif//NDEBUG\n}\n"
  },
  {
    "path": "external/glm/test/core/core_func_integer_find_msb.cpp",
    "content": "#include <glm/glm.hpp>\n#include <cstdio>\n#include <cstdlib>     // To define \"exit\", req'd by XLC.\n#include <ctime>\n\n#define LE 1            // 1 for little-endian, 0 for big-endian.\n\nint pop(unsigned x) {\n   x = x - ((x >> 1) & 0x55555555);\n   x = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n   x = (x + (x >> 4)) & 0x0F0F0F0F;\n   x = x + (x << 8);\n   x = x + (x << 16);\n   return x >> 24;\n}\n\nint nlz1(unsigned x) {\n   int n;\n\n   if (x == 0) return(32);\n   n = 0;\n   if (x <= 0x0000FFFF) {n = n +16; x = x <<16;}\n   if (x <= 0x00FFFFFF) {n = n + 8; x = x << 8;}\n   if (x <= 0x0FFFFFFF) {n = n + 4; x = x << 4;}\n   if (x <= 0x3FFFFFFF) {n = n + 2; x = x << 2;}\n   if (x <= 0x7FFFFFFF) {n = n + 1;}\n   return n;\n}\n\nint nlz1a(unsigned x) {\n   int n;\n\n/* if (x == 0) return(32); */\n   if (static_cast<int>(x) <= 0) return (~x >> 26) & 32;\n   n = 1;\n   if ((x >> 16) == 0) {n = n +16; x = x <<16;}\n   if ((x >> 24) == 0) {n = n + 8; x = x << 8;}\n   if ((x >> 28) == 0) {n = n + 4; x = x << 4;}\n   if ((x >> 30) == 0) {n = n + 2; x = x << 2;}\n   n = n - (x >> 31);\n   return n;\n}\n// On basic Risc, 12 to 20 instructions.\n\nint nlz2(unsigned x) {\n   unsigned y;\n   int n;\n\n   n = 32;\n   y = x >>16;  if (y != 0) {n = n -16;  x = y;}\n   y = x >> 8;  if (y != 0) {n = n - 8;  x = y;}\n   y = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n   y = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n   y = x >> 1;  if (y != 0) return n - 2;\n   return n - x;\n}\n\n// As above but coded as a loop for compactness:\n// 23 to 33 basic Risc instructions.\nint nlz2a(unsigned x) {\n   unsigned y;\n   int n, c;\n\n   n = 32;\n   c = 16;\n   do {\n      y = x >> c;  if (y != 0) {n = n - c;  x = y;}\n      c = c >> 1;\n   } while (c != 0);\n   return n - x;\n}\n\nint nlz3(int x) {\n   int y, n;\n\n   n = 0;\n   y = x;\nL: if (x < 0) return n;\n   if (y == 0) return 32 - n;\n   n = n + 1;\n   x = x << 1;\n   y = y >> 1;\n   goto L;\n}\n\nint nlz4(unsigned x) {\n   int y, m, n;\n\n   y = -(x >> 16);      // If left half of x is 0,\n   m = (y >> 16) & 16;  // set n = 16.  If left half\n   n = 16 - m;          // is nonzero, set n = 0 and\n   x = x >> m;          // shift x right 16.\n                        // Now x is of the form 0000xxxx.\n   y = x - 0x100;       // If positions 8-15 are 0,\n   m = (y >> 16) & 8;   // add 8 to n and shift x left 8.\n   n = n + m;\n   x = x << m;\n\n   y = x - 0x1000;      // If positions 12-15 are 0,\n   m = (y >> 16) & 4;   // add 4 to n and shift x left 4.\n   n = n + m;\n   x = x << m;\n\n   y = x - 0x4000;      // If positions 14-15 are 0,\n   m = (y >> 16) & 2;   // add 2 to n and shift x left 2.\n   n = n + m;\n   x = x << m;\n\n   y = x >> 14;         // Set y = 0, 1, 2, or 3.\n   m = y & ~(y >> 1);   // Set m = 0, 1, 2, or 2 resp.\n   return n + 2 - m;\n}\n\nint nlz5(unsigned x) {\n   int pop(unsigned x);\n\n   x = x | (x >> 1);\n   x = x | (x >> 2);\n   x = x | (x >> 4);\n   x = x | (x >> 8);\n   x = x | (x >>16);\n   return pop(~x);\n}\n\n/* The four programs below are not valid ANSI C programs.  This is\nbecause they refer to the same storage locations as two different types.\nHowever, they work with xlc/AIX, gcc/AIX, and gcc/NT.  If you try to\ncode them more compactly by declaring a variable xx to be \"double,\" and\nthen using\n\n   n = 1054 - (*((unsigned *)&xx + LE) >> 20);\n\nthen you are violating not only the rule above, but also the ANSI C\nrule that pointer arithmetic can be performed only on pointers to\narray elements.\n   When coded with the above statement, the program fails with xlc,\ngcc/AIX, and gcc/NT, at some optimization levels.\n   BTW, these programs use the \"anonymous union\" feature of C++, not\navailable in C. */\n\nint nlz6(unsigned k)\n{\n\tunion {\n\t\tunsigned asInt[2];\n\t\tdouble asDouble;\n\t};\n\tint n;\n\n\tasDouble = static_cast<double>(k) + 0.5;\n\tn = 1054 - (asInt[LE] >> 20);\n\treturn n;\n}\n\nint nlz7(unsigned k)\n{\n\tunion {\n\t\tunsigned asInt[2];\n\t\tdouble asDouble;\n\t};\n\tint n;\n\n\tasDouble = static_cast<double>(k);\n\tn = 1054 - (asInt[LE] >> 20);\n\tn = (n & 31) + (n >> 9);\n\treturn n;\n}\n\n   /* In single qualifier, round-to-nearest mode, the basic method fails for:\n   k = 0, k = 01FFFFFF, 03FFFFFE <= k <= 03FFFFFF,\n                        07FFFFFC <= k <= 07FFFFFF,\n                        0FFFFFF8 <= k <= 0FFFFFFF,\n                                   ...\n                        7FFFFFC0 <= k <= 7FFFFFFF.\n                        FFFFFF80 <= k <= FFFFFFFF.\n   For k = 0 it gives 158, and for the other values it is too low by 1. */\n\nint nlz8(unsigned k)\n{\n\tunion {\n\t\tunsigned asInt;\n\t\tfloat asFloat;\n\t};\n\tint n;\n\n\tk = k & ~(k >> 1);           /* Fix problem with rounding. */\n\tasFloat = static_cast<float>(k) + 0.5f;\n\tn = 158 - (asInt >> 23);\n\treturn n;\n}\n\n/* The example below shows how to make a macro for nlz.  It uses an\nextension to the C and C++ languages that is provided by the GNU C/C++\ncompiler, namely, that of allowing statements and declarations in\nexpressions (see \"Using and Porting GNU CC\", by Richard M. Stallman\n(1998).  The underscores are necessary to protect against the\npossibility that the macro argument will conflict with one of its local\nvariables, e.g., NLZ(k). */\n\nint nlz9(unsigned k)\n{\n\tunion {\n\t\tunsigned asInt;\n\t\tfloat asFloat;\n\t};\n\tint n;\n\n\tk = k & ~(k >> 1);           /* Fix problem with rounding. */\n\tasFloat = static_cast<float>(k);\n\tn = 158 - (asInt >> 23);\n\tn = (n & 31) + (n >> 6);     /* Fix problem with k = 0. */\n\treturn n;\n}\n\n/* Below are three nearly equivalent programs for computing the number\nof leading zeros in a word. This material is not in HD, but may be in a\nfuture edition.\n   Immediately below is Robert Harley's algorithm, found at the\ncomp.arch newsgroup entry dated 7/12/96, pointed out to me by Norbert\nJuffa.\n   Table entries marked \"u\" are unused. 14 ops including a multiply,\nplus an indexed load.\n   The smallest multiplier that works is 0x045BCED1 = 17*65*129*513 (all\nof form 2**k + 1). There are no multipliers of three terms of the form\n2**k +- 1 that work, with a table size of 64 or 128. There are some,\nwith a table size of 64, if you precede the multiplication with x = x -\n(x >> 1), but that seems less elegant. There are also some if you use a\ntable size of 256, the smallest is 0x01033CBF = 65*255*1025 (this would\nsave two instructions in the form of this algorithm with the\nmultiplication expanded into shifts and adds, but the table size is\ngetting a bit large). */\n\n#define u 99\nint nlz10(unsigned x)\n{\n\tstatic char table[64] =\n\t\t{32,31, u,16, u,30, 3, u,  15, u, u, u,29,10, 2, u,\n\t\tu, u,12,14,21, u,19, u,   u,28, u,25, u, 9, 1, u,\n\t\t17, u, 4, u, u, u,11, u,  13,22,20, u,26, u, u,18,\n\t\t5, u, u,23, u,27, u, 6,   u,24, 7, u, 8, u, 0, u};\n\n\tx = x | (x >> 1);\t\t// Propagate leftmost\n\tx = x | (x >> 2);\t\t// 1-bit to the right.\n\tx = x | (x >> 4);\n\tx = x | (x >> 8);\n\tx = x | (x >>16);\n\tx = x*0x06EB14F9;\t\t// Multiplier is 7*255**3.\n\treturn table[x >> 26];\n}\n\n/* Harley's algorithm with multiply expanded.\n19 elementary ops plus an indexed load. */\n\nint nlz10a(unsigned x)\n{\n\tstatic char table[64] =\n\t\t{32,31, u,16, u,30, 3, u,  15, u, u, u,29,10, 2, u,\n\t\tu, u,12,14,21, u,19, u,   u,28, u,25, u, 9, 1, u,\n\t\t17, u, 4, u, u, u,11, u,  13,22,20, u,26, u, u,18,\n\t\t5, u, u,23, u,27, u, 6,   u,24, 7, u, 8, u, 0, u};\n\n\tx = x | (x >> 1);    // Propagate leftmost\n\tx = x | (x >> 2);    // 1-bit to the right.\n\tx = x | (x >> 4);\n\tx = x | (x >> 8);\n\tx = x | (x >> 16);\n\tx = (x << 3) - x;    // Multiply by 7.\n\tx = (x << 8) - x;    // Multiply by 255.\n\tx = (x << 8) - x;    // Again.\n\tx = (x << 8) - x;    // Again.\n\treturn table[x >> 26];\n}\n\n/* Julius Goryavsky's version of Harley's algorithm.\n17 elementary ops plus an indexed load, if the machine\nhas \"and not.\" */\n\nint nlz10b(unsigned x)\n{\n\tstatic char table[64] =\n\t\t{32,20,19, u, u,18, u, 7,  10,17, u, u,14, u, 6, u,\n\t\tu, 9, u,16, u, u, 1,26,   u,13, u, u,24, 5, u, u,\n\t\tu,21, u, 8,11, u,15, u,   u, u, u, 2,27, 0,25, u,\n\t\t22, u,12, u, u, 3,28, u,  23, u, 4,29, u, u,30,31};\n\n\tx = x | (x >> 1);    // Propagate leftmost\n\tx = x | (x >> 2);    // 1-bit to the right.\n\tx = x | (x >> 4);\n\tx = x | (x >> 8);\n\tx = x & ~(x >> 16);\n\tx = x*0xFD7049FF;    // Activate this line or the following 3.\n\t// x = (x << 9) - x;    // Multiply by 511.\n\t// x = (x << 11) - x;   // Multiply by 2047.\n\t// x = (x << 14) - x;   // Multiply by 16383.\n\treturn table[x >> 26];\n}\n\nint errors;\nvoid error(int x, int y)\n{\n\terrors = errors + 1;\n\tprintf(\"Error for x = %08x, got %d\\n\", x, y);\n}\n\nint main()\n{\n#\tifdef NDEBUG\n\n\tint i, n;\n\tstatic unsigned test[] = {0,32, 1,31, 2,30, 3,30, 4,29, 5,29, 6,29,\n\t\t7,29, 8,28, 9,28, 16,27, 32,26, 64,25, 128,24, 255,24, 256,23,\n\t\t512,22, 1024,21, 2048,20, 4096,19, 8192,18, 16384,17, 32768,16,\n\t\t65536,15, 0x20000,14, 0x40000,13, 0x80000,12, 0x100000,11,\n\t\t0x200000,10, 0x400000,9, 0x800000,8, 0x1000000,7, 0x2000000,6,\n\t\t0x4000000,5, 0x8000000,4, 0x0FFFFFFF,4, 0x10000000,3,\n\t\t0x3000FFFF,2, 0x50003333,1, 0x7FFFFFFF,1, 0x80000000,0,\n\t\t0xFFFFFFFF,0};\n\tstd::size_t const Count = 1000;\n\n\tn = sizeof(test)/4;\n\n\tstd::clock_t TimestampBeg = 0;\n\tstd::clock_t TimestampEnd = 0;\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz1(test[i]) != test[i+1]) error(test[i], nlz1(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz1: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz1a(test[i]) != test[i+1]) error(test[i], nlz1a(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz1a: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz2(test[i]) != test[i+1]) error(test[i], nlz2(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz2: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz2a(test[i]) != test[i+1]) error(test[i], nlz2a(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz2a: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz3(test[i]) != test[i+1]) error(test[i], nlz3(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz3: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz4(test[i]) != test[i+1]) error(test[i], nlz4(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz4: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz5(test[i]) != test[i+1]) error(test[i], nlz5(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz5: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz6(test[i]) != test[i+1]) error(test[i], nlz6(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz6: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz7(test[i]) != test[i+1]) error(test[i], nlz7(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz7: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz8(test[i]) != test[i+1]) error(test[i], nlz8(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz8: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz9(test[i]) != test[i+1]) error(test[i], nlz9(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz9: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz10(test[i]) != test[i+1]) error(test[i], nlz10(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz10: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz10a(test[i]) != test[i+1]) error(test[i], nlz10a(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz10a: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tTimestampBeg = std::clock();\n\tfor (std::size_t k = 0; k < Count; ++k)\n\tfor (i = 0; i < n; i += 2) {\n\t\tif (nlz10b(test[i]) != test[i+1]) error(test[i], nlz10b(test[i]));}\n\tTimestampEnd = std::clock();\n\n\tprintf(\"nlz10b: %d clocks\\n\", static_cast<int>(TimestampEnd - TimestampBeg));\n\n\tif (errors == 0)\n\t\tprintf(\"Passed all %d cases.\\n\", static_cast<int>(sizeof(test)/8));\n\n#\tendif//NDEBUG\n}\n"
  },
  {
    "path": "external/glm/test/core/core_func_matrix.cpp",
    "content": "#include <glm/matrix.hpp>\n#include <glm/gtc/matrix_transform.hpp>\n#include <glm/gtc/ulp.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/constants.hpp>\n#include <vector>\n#include <ctime>\n#include <cstdio>\n\nusing namespace glm;\n\nint test_matrixCompMult()\n{\n\tint Error(0);\n\n\t{\n\t\tmat2 m(0, 1, 2, 3);\n\t\tmat2 n = matrixCompMult(m, m);\n\t\tmat2 expected = mat2(0, 1, 4, 9);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat2x3 m(0, 1, 2, 3, 4, 5);\n\t\tmat2x3 n = matrixCompMult(m, m);\n\t\tmat2x3 expected = mat2x3(0, 1, 4, 9, 16, 25);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat2x4 m(0, 1, 2, 3, 4, 5, 6, 7);\n\t\tmat2x4 n = matrixCompMult(m, m);\n\t\tmat2x4 expected = mat2x4(0, 1, 4, 9, 16, 25, 36, 49);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat3 m(0, 1, 2, 3, 4, 5, 6, 7, 8);\n\t\tmat3 n = matrixCompMult(m, m);\n\t\tmat3 expected = mat3(0, 1, 4, 9, 16, 25, 36, 49, 64);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat3x2 m(0, 1, 2, 3, 4, 5);\n\t\tmat3x2 n = matrixCompMult(m, m);\n\t\tmat3x2 expected = mat3x2(0, 1, 4, 9, 16, 25);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat3x4 m(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);\n\t\tmat3x4 n = matrixCompMult(m, m);\n\t\tmat3x4 expected = mat3x4(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat4 m(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\t\tmat4 n = matrixCompMult(m, m);\n\t\tmat4 expected = mat4(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat4x2 m(0, 1, 2, 3, 4, 5, 6, 7);\n\t\tmat4x2 n = matrixCompMult(m, m);\n\t\tmat4x2 expected = mat4x2(0, 1, 4, 9, 16, 25, 36, 49);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat4x3 m(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);\n\t\tmat4x3 n = matrixCompMult(m, m);\n\t\tmat4x3 expected = mat4x3(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121);\n\t\tfor (length_t l = 0; l < m.length(); ++l)\n\t\t\tError += all(epsilonEqual(n[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_outerProduct()\n{\n\t{ glm::mat2 m = glm::outerProduct(glm::vec2(1.0f), glm::vec2(1.0f)); }\n\t{ glm::mat3 m = glm::outerProduct(glm::vec3(1.0f), glm::vec3(1.0f)); }\n\t{ glm::mat4 m = glm::outerProduct(glm::vec4(1.0f), glm::vec4(1.0f)); }\n\n\t{ glm::mat2x3 m = glm::outerProduct(glm::vec3(1.0f), glm::vec2(1.0f)); }\n\t{ glm::mat2x4 m = glm::outerProduct(glm::vec4(1.0f), glm::vec2(1.0f)); }\n\n\t{ glm::mat3x2 m = glm::outerProduct(glm::vec2(1.0f), glm::vec3(1.0f)); }\n\t{ glm::mat3x4 m = glm::outerProduct(glm::vec4(1.0f), glm::vec3(1.0f)); }\n  \n\t{ glm::mat4x2 m = glm::outerProduct(glm::vec2(1.0f), glm::vec4(1.0f)); }\n\t{ glm::mat4x3 m = glm::outerProduct(glm::vec3(1.0f), glm::vec4(1.0f)); }\n\n\treturn 0;\n}\n\nint test_transpose()\n{\n\tint Error(0);\n\n\t{\n\t\tmat2 const m(0, 1, 2, 3);\n\t\tmat2 const t = transpose(m);\n\t\tmat2 const expected = mat2(0, 2, 1, 3);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat2x3 m(0, 1, 2, 3, 4, 5);\n\t\tmat3x2 t = transpose(m);\n\t\tmat3x2 const expected = mat3x2(0, 3, 1, 4, 2, 5);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat2x4 m(0, 1, 2, 3, 4, 5, 6, 7);\n\t\tmat4x2 t = transpose(m);\n\t\tmat4x2 const expected = mat4x2(0, 4, 1, 5, 2, 6, 3, 7);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat3 m(0, 1, 2, 3, 4, 5, 6, 7, 8);\n\t\tmat3 t = transpose(m);\n\t\tmat3 const expected = mat3(0, 3, 6, 1, 4, 7, 2, 5, 8);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat3x2 m(0, 1, 2, 3, 4, 5);\n\t\tmat2x3 t = transpose(m);\n\t\tmat2x3 const expected = mat2x3(0, 2, 4, 1, 3, 5);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat3x4 m(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);\n\t\tmat4x3 t = transpose(m);\n\t\tmat4x3 const expected = mat4x3(0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat4 m(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n\t\tmat4 t = transpose(m);\n\t\tmat4 const expected = mat4(0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat4x2 m(0, 1, 2, 3, 4, 5, 6, 7);\n\t\tmat2x4 t = transpose(m);\n\t\tmat2x4 const expected = mat2x4(0, 2, 4, 6, 1, 3, 5, 7);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tmat4x3 m(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);\n\t\tmat3x4 t = transpose(m);\n\t\tmat3x4 const expected = mat3x4(0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11);\n\t\tfor (length_t l = 0; l < expected.length(); ++l)\n\t\t\tError += all(epsilonEqual(t[l], expected[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_determinant()\n{\n\n\n\treturn 0;\n}\n\nint test_inverse()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::mat4x4 A4x4(\n\t\t\tglm::vec4(1, 0, 1, 0), \n\t\t\tglm::vec4(0, 1, 0, 0), \n\t\t\tglm::vec4(0, 0, 1, 0), \n\t\t\tglm::vec4(0, 0, 0, 1));\n\t\tglm::mat4x4 B4x4 = inverse(A4x4);\n\t\tglm::mat4x4 I4x4 = A4x4 * B4x4;\n\t\tglm::mat4x4 Identity(1);\n\t\tfor (length_t l = 0; l < Identity.length(); ++l)\n\t\t\tError += all(epsilonEqual(I4x4[l], Identity[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::mat3x3 A3x3(\n\t\t\tglm::vec3(1, 0, 1), \n\t\t\tglm::vec3(0, 1, 0), \n\t\t\tglm::vec3(0, 0, 1));\n\t\tglm::mat3x3 B3x3 = glm::inverse(A3x3);\n\t\tglm::mat3x3 I3x3 = A3x3 * B3x3;\n\t\tglm::mat3x3 Identity(1);\n\t\tfor (length_t l = 0; l < Identity.length(); ++l)\n\t\t\tError += all(epsilonEqual(I3x3[l], Identity[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::mat2x2 A2x2(\n\t\t\tglm::vec2(1, 1), \n\t\t\tglm::vec2(0, 1));\n\t\tglm::mat2x2 B2x2 = glm::inverse(A2x2);\n\t\tglm::mat2x2 I2x2 = A2x2 * B2x2;\n\t\tglm::mat2x2 Identity(1);\n\t\tfor (length_t l = 0; l < Identity.length(); ++l)\n\t\t\tError += all(epsilonEqual(I2x2[l], Identity[l], epsilon<float>())) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_inverse_simd()\n{\n\tint Error = 0;\n\n\tglm::mat4x4 const Identity(1);\n\n\tglm::mat4x4 const A4x4(\n\t\tglm::vec4(1, 0, 1, 0),\n\t\tglm::vec4(0, 1, 0, 0),\n\t\tglm::vec4(0, 0, 1, 0),\n\t\tglm::vec4(0, 0, 0, 1));\n\tglm::mat4x4 const B4x4 = glm::inverse(A4x4);\n\tglm::mat4x4 const I4x4 = A4x4 * B4x4;\n\n\tError += glm::all(glm::epsilonEqual(I4x4[0], Identity[0], 0.001f)) ? 0 : 1;\n\tError += glm::all(glm::epsilonEqual(I4x4[1], Identity[1], 0.001f)) ? 0 : 1;\n\tError += glm::all(glm::epsilonEqual(I4x4[2], Identity[2], 0.001f)) ? 0 : 1;\n\tError += glm::all(glm::epsilonEqual(I4x4[3], Identity[3], 0.001f)) ? 0 : 1;\n\n\treturn Error;\n}\n\ntemplate<typename VEC3, typename MAT4>\nint test_inverse_perf(std::size_t Count, std::size_t Instance, char const * Message)\n{\n\tstd::vector<MAT4> TestInputs;\n\tTestInputs.resize(Count);\n\tstd::vector<MAT4> TestOutputs;\n\tTestOutputs.resize(TestInputs.size());\n\n\tVEC3 Axis(glm::normalize(VEC3(1.0f, 2.0f, 3.0f)));\n\n\tfor(std::size_t i = 0; i < TestInputs.size(); ++i)\n\t{\n\t\ttypename MAT4::value_type f = static_cast<typename MAT4::value_type>(i + Instance) * typename MAT4::value_type(0.1) + typename MAT4::value_type(0.1);\n\t\tTestInputs[i] = glm::rotate(glm::translate(MAT4(1), Axis * f), f, Axis);\n\t\t//TestInputs[i] = glm::translate(MAT4(1), Axis * f);\n\t}\n\n\tstd::clock_t StartTime = std::clock();\n\n\tfor(std::size_t i = 0; i < TestInputs.size(); ++i)\n\t\tTestOutputs[i] = glm::inverse(TestInputs[i]);\n\n\tstd::clock_t EndTime = std::clock();\n\n\tfor(std::size_t i = 0; i < TestInputs.size(); ++i)\n\t\tTestOutputs[i] = TestOutputs[i] * TestInputs[i];\n\n\ttypename MAT4::value_type Diff(0);\n\tfor(std::size_t Entry = 0; Entry < TestOutputs.size(); ++Entry)\n\t{\n\t\tMAT4 i(1.0);\n\t\tMAT4 m(TestOutputs[Entry]);\n\t\tfor(glm::length_t y = 0; y < m.length(); ++y)\n\t\tfor(glm::length_t x = 0; x < m[y].length(); ++x)\n\t\t\tDiff = glm::max(m[y][x], i[y][x]);\n\t}\n\n\t//glm::uint Ulp = 0;\n\t//Ulp = glm::max(glm::float_distance(*Dst, *Src), Ulp);\n\n\tprintf(\"inverse<%s>(%f): %lu\\n\", Message, static_cast<double>(Diff), EndTime - StartTime);\n\n\treturn 0;\n}\n\nint main()\n{\n\tint Error = 0;\n\tError += test_matrixCompMult();\n\tError += test_outerProduct();\n\tError += test_transpose();\n\tError += test_determinant();\n\tError += test_inverse();\n\tError += test_inverse_simd();\n\n#\tifdef NDEBUG\n\tstd::size_t const Samples = 1000;\n#\telse\n\tstd::size_t const Samples = 1;\n#\tendif//NDEBUG\n\n\tfor(std::size_t i = 0; i < 1; ++i)\n\t{\n\t\tError += test_inverse_perf<glm::vec3, glm::mat4>(Samples, i, \"mat4\");\n\t\tError += test_inverse_perf<glm::dvec3, glm::dmat4>(Samples, i, \"dmat4\");\n\t}\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_noise.cpp",
    "content": "int main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_packing.cpp",
    "content": "#include <glm/gtc/type_precision.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/packing.hpp>\n#include <vector>\n\nint test_packUnorm2x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2(1.0f, 0.0f));\n\tA.push_back(glm::vec2(0.5f, 0.7f));\n\tA.push_back(glm::vec2(0.1f, 0.2f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::uint32 C = glm::packUnorm2x16(B);\n\t\tglm::vec2 D = glm::unpackUnorm2x16(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 65535.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packSnorm2x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2( 1.0f, 0.0f));\n\tA.push_back(glm::vec2(-0.5f,-0.7f));\n\tA.push_back(glm::vec2(-0.1f, 0.1f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::uint32 C = glm::packSnorm2x16(B);\n\t\tglm::vec2 D = glm::unpackSnorm2x16(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packUnorm4x8()\n{\n\tint Error = 0;\n\n\tglm::uint32 Packed = glm::packUnorm4x8(glm::vec4(1.0f, 0.5f, 0.0f, 1.0f));\n\tglm::u8vec4 Vec(255, 128, 0, 255);\n\tglm::uint32 & Ref = *reinterpret_cast<glm::uint32*>(&Vec[0]);\n\n\tError += Packed == Ref ? 0 : 1;\n\n\tstd::vector<glm::vec4> A;\n\tA.push_back(glm::vec4(1.0f, 0.7f, 0.3f, 0.0f));\n\tA.push_back(glm::vec4(0.5f, 0.1f, 0.2f, 0.3f));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec4 B(A[i]);\n\t\tglm::uint32 C = glm::packUnorm4x8(B);\n\t\tglm::vec4 D = glm::unpackUnorm4x8(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packSnorm4x8()\n{\n\tint Error = 0;\n\t\n\tstd::vector<glm::vec4> A;\n\tA.push_back(glm::vec4( 1.0f, 0.0f,-0.5f,-1.0f));\n\tA.push_back(glm::vec4(-0.7f,-0.1f, 0.1f, 0.7f));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec4 B(A[i]);\n\t\tglm::uint32 C = glm::packSnorm4x8(B);\n\t\tglm::vec4 D = glm::unpackSnorm4x8(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 127.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packHalf2x16()\n{\n\tint Error = 0;\n/*\n\tstd::vector<glm::hvec2> A;\n\tA.push_back(glm::hvec2(glm::half( 1.0f), glm::half( 2.0f)));\n\tA.push_back(glm::hvec2(glm::half(-1.0f), glm::half(-2.0f)));\n\tA.push_back(glm::hvec2(glm::half(-1.1f), glm::half( 1.1f)));\n*/\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2( 1.0f, 2.0f));\n\tA.push_back(glm::vec2(-1.0f,-2.0f));\n\tA.push_back(glm::vec2(-1.1f, 1.1f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::uint C = glm::packHalf2x16(B);\n\t\tglm::vec2 D = glm::unpackHalf2x16(C);\n\t\t//Error += B == D ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 127.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packDouble2x32()\n{\n\tint Error = 0;\n\t\n\tstd::vector<glm::uvec2> A;\n\tA.push_back(glm::uvec2( 1, 2));\n\tA.push_back(glm::uvec2(-1,-2));\n\tA.push_back(glm::uvec2(-1000, 1100));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::uvec2 B(A[i]);\n\t\tdouble C = glm::packDouble2x32(B);\n\t\tglm::uvec2 D = glm::unpackDouble2x32(C);\n\t\tError += B == D ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\t\n\tError += test_packSnorm4x8();\n\tError += test_packUnorm4x8();\n\tError += test_packSnorm2x16();\n\tError += test_packUnorm2x16();\n\tError += test_packHalf2x16();\n\tError += test_packDouble2x32();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_swizzle.cpp",
    "content": "#define GLM_FORCE_MESSAGES\n#define GLM_FORCE_SWIZZLE\n#include <glm/glm.hpp>\n\n#if !GLM_HAS_ONLY_XYZW\n\nint test_ivec2_swizzle()\n{\n\tint Error = 0;\n\n\tglm::ivec2 A(1, 2);\n\tglm::ivec2 B = A.yx();\n\tglm::ivec2 C = B.yx();\n\n\tError += A != B ? 0 : 1;\n\tError += A == C ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_ivec3_swizzle()\n{\n\tint Error = 0;\n\n\tglm::ivec3 A(1, 2, 3);\n\tglm::ivec3 B = A.zyx();\n\tglm::ivec3 C = B.zyx();\n\n\tError += A != B ? 0 : 1;\n\tError += A == C ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_ivec4_swizzle()\n{\n\tint Error = 0;\n\n\tglm::ivec4 A(1, 2, 3, 4);\n\tglm::ivec4 B = A.wzyx();\n\tglm::ivec4 C = B.wzyx();\n\n\tError += A != B ? 0 : 1;\n\tError += A == C ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_vec4_swizzle()\n{\n\tint Error = 0;\n\n\tglm::vec4 A(1, 2, 3, 4);\n\tglm::vec4 B = A.wzyx();\n\tglm::vec4 C = B.wzyx();\n\n\tError += A != B ? 0 : 1;\n\tError += A == C ? 0 : 1;\n\n\tfloat f = glm::dot(C.wzyx(), C.xyzw());\n\tError += glm::abs(f - 20.f) < 0.01f ? 0 : 1;\n\n\treturn Error;\n}\n#endif//!GLM_HAS_ONLY_XYZW\n\nint main()\n{\n\tint Error = 0;\n\n#\tif !GLM_HAS_ONLY_XYZW\n\t\tError += test_ivec2_swizzle();\n\t\tError += test_ivec3_swizzle();\n\t\tError += test_ivec4_swizzle();\n\n\t\tError += test_vec4_swizzle();\n#\tendif//!GLM_HAS_ONLY_XYZW\n\n\treturn Error;\n}\n\n\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_trigonometric.cpp",
    "content": "#include <glm/trigonometric.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_func_vector_relational.cpp",
    "content": "#include <glm/vec2.hpp>\n#include <glm/vec3.hpp>\n#include <glm/vec4.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/gtc/vec1.hpp>\n\nstatic int test_not()\n{\n\tint Error(0);\n\n\t{\n\t\tglm::bvec1 v(false);\n\t\tError += glm::all(glm::not_(v)) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::bvec2 v(false);\n\t\tError += glm::all(glm::not_(v)) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::bvec3 v(false);\n\t\tError += glm::all(glm::not_(v)) ? 0 : 1;\n\t}\n\t\n\t{\n\t\tglm::bvec4 v(false);\n\t\tError += glm::all(glm::not_(v)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_not();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_setup_force_cxx98.cpp",
    "content": "#define GLM_FORCE_CXX98\n#include <glm/glm.hpp>\n#include <glm/ext.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_setup_force_size_t_length.cpp",
    "content": "#define GLM_FORCE_SIZE_T_LENGTH\n#include <glm/glm.hpp>\n#include <glm/ext.hpp>\n\ntemplate <typename genType>\ngenType add(genType const& a, genType const& b)\n{\n\tgenType result(0);\n\tfor(glm::length_t i = 0; i < a.length(); ++i)\n\t\tresult[i] = a[i] + b[i];\n\treturn result;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tglm::ivec4 v(1);\n\tError += add(v, v) == glm::ivec4(2) ? 0 : 1;\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_setup_message.cpp",
    "content": "#define GLM_FORCE_MESSAGES\n#include <glm/vec3.hpp>\n#include <cstdio>\n\nint test_compiler()\n{\n\tint Error(0);\n\t\n\tif(GLM_COMPILER & GLM_COMPILER_VC)\n\t{\n\t\tswitch(GLM_COMPILER)\n\t\t{\n\t\tcase GLM_COMPILER_VC12:\n\t\t\tstd::printf(\"Visual C++ 12 - 2013\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_VC14:\n\t\t\tstd::printf(\"Visual C++ 14 - 2015\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_VC15:\n\t\t\tstd::printf(\"Visual C++ 15 - 2017\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_VC16:\n\t\t\tstd::printf(\"Visual C++ 16 - 20XX\\n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstd::printf(\"Visual C++ version not detected\\n\");\n\t\t\tError += 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if(GLM_COMPILER & GLM_COMPILER_GCC)\n\t{\n\t\tswitch(GLM_COMPILER)\n\t\t{\n\t\tcase GLM_COMPILER_GCC46:\n\t\t\tstd::printf(\"GCC 4.6\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_GCC47:\n\t\t\tstd::printf(\"GCC 4.7\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_GCC48:\n\t\t\tstd::printf(\"GCC 4.8\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_GCC49:\n\t\t\tstd::printf(\"GCC 4.9\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_GCC5:\n\t\t\tstd::printf(\"GCC 5\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_GCC6:\n\t\t\tstd::printf(\"GCC 6\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_GCC7:\n\t\t\tstd::printf(\"GCC 7\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_GCC8:\n\t\t\tstd::printf(\"GCC 8\\n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstd::printf(\"GCC version not detected\\n\");\n\t\t\tError += 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if(GLM_COMPILER & GLM_COMPILER_CUDA)\n\t{\n\t\tstd::printf(\"CUDA\\n\");\n\t}\n\telse if(GLM_COMPILER & GLM_COMPILER_CLANG)\n\t{\n\t\tswitch(GLM_COMPILER)\n\t\t{\n\t\tcase GLM_COMPILER_CLANG34:\n\t\t\tstd::printf(\"Clang 3.4\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_CLANG35:\n\t\t\tstd::printf(\"Clang 3.5\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_CLANG36:\n\t\t\tstd::printf(\"Clang 3.6\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_CLANG37:\n\t\t\tstd::printf(\"Clang 3.7\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_CLANG38:\n\t\t\tstd::printf(\"Clang 3.8\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_CLANG39:\n\t\t\tstd::printf(\"Clang 3.9\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_CLANG40:\n\t\t\tstd::printf(\"Clang 4.0\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_CLANG41:\n\t\t\tstd::printf(\"Clang 4.1\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_CLANG42:\n\t\t\tstd::printf(\"Clang 4.2\\n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstd::printf(\"LLVM version not detected\\n\");\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if(GLM_COMPILER & GLM_COMPILER_INTEL)\n\t{\n\t\tswitch(GLM_COMPILER)\n\t\t{\n\t\tcase GLM_COMPILER_INTEL14:\n\t\t\tstd::printf(\"ICC 14 - 2013 SP1\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_INTEL15:\n\t\t\tstd::printf(\"ICC 15 - 2015\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_INTEL16:\n\t\t\tstd::printf(\"ICC 16 - 2017\\n\");\n\t\t\tbreak;\n\t\tcase GLM_COMPILER_INTEL17:\n\t\t\tstd::printf(\"ICC 17 - 20XX\\n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstd::printf(\"Intel compiler version not detected\\n\");\n\t\t\tError += 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tstd::printf(\"Undetected compiler\\n\");\n\t\tError += 1;\n\t}\n\t\n\treturn Error;\n}\n\nint test_model()\n{\n\tint Error = 0;\n\t\n\tError += ((sizeof(void*) == 4) && (GLM_MODEL == GLM_MODEL_32)) || ((sizeof(void*) == 8) && (GLM_MODEL == GLM_MODEL_64)) ? 0 : 1;\n\t\n\tif(GLM_MODEL == GLM_MODEL_32)\n\t\tstd::printf(\"GLM_MODEL_32\\n\");\n\telse if(GLM_MODEL == GLM_MODEL_64)\n\t\tstd::printf(\"GLM_MODEL_64\\n\");\n\t\n\treturn Error;\n}\n\nint test_instruction_set()\n{\n\tint Error = 0;\n\n\tstd::printf(\"GLM_ARCH: \");\n\n\tif(GLM_ARCH == GLM_ARCH_PURE)\n\t\tstd::printf(\"GLM_ARCH_PURE \");\n\tif(GLM_ARCH & GLM_ARCH_ARM_BIT)\n\t\tstd::printf(\"ARM \");\n\tif(GLM_ARCH & GLM_ARCH_NEON_BIT)\n\t\tstd::printf(\"NEON \");\n\tif(GLM_ARCH & GLM_ARCH_AVX2)\n\t\tstd::printf(\"AVX2 \");\n\tif(GLM_ARCH & GLM_ARCH_AVX)\n\t\tstd::printf(\"AVX \");\n\tif(GLM_ARCH & GLM_ARCH_SSE42_BIT)\n\t\tstd::printf(\"SSE4.2 \");\n\tif(GLM_ARCH & GLM_ARCH_SSE41_BIT)\n\t\tstd::printf(\"SSE4.1 \");\n\tif(GLM_ARCH & GLM_ARCH_SSSE3_BIT)\n\t\tstd::printf(\"SSSE3 \");\n\tif(GLM_ARCH & GLM_ARCH_SSE3_BIT)\n\t\tstd::printf(\"SSE3 \");\n\tif(GLM_ARCH & GLM_ARCH_SSE2_BIT)\n\t\tstd::printf(\"SSE2 \");\n\n\tstd::printf(\"\\n\");\n\n\treturn Error;\n}\n\nint test_cpp_version()\n{\n\tstd::printf(\"__cplusplus: %d\\n\", static_cast<int>(__cplusplus));\n\t\n\treturn 0;\n}\n\nint test_operators()\n{\n\tglm::vec3 A(1.0f);\n\tglm::vec3 B(1.0f);\n\tbool R = A != B;\n\tbool S = A == B;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\ntemplate<typename T>\nstruct vec\n{\n\n};\n\ntemplate<template<typename> class C, typename T>\nstruct Class\n{\n\n};\n\ntemplate<typename T>\nstruct Class<vec, T>\n{\n\n};\n\nint main()\n{\n\t//Class<vec, float> C;\n\n\tint Error = 0;\n\n\tError += test_cpp_version();\n\tError += test_compiler();\n\tError += test_model();\n\tError += test_instruction_set();\n\tError += test_operators();\n\t\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_setup_precision.cpp",
    "content": "#define GLM_FORCE_INLINE\n#define GLM_PRECISION_HIGHP_FLOAT\n#include <glm/glm.hpp>\n#include <glm/ext.hpp>\n\nstatic int test_mat()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::mat2) == sizeof(glm::highp_mat2) ? 0 : 1;\n\tError += sizeof(glm::mat3) == sizeof(glm::highp_mat3) ? 0 : 1;\n\tError += sizeof(glm::mat4) == sizeof(glm::highp_mat4) ? 0 : 1;\n\n\tError += sizeof(glm::mat2x2) == sizeof(glm::highp_mat2x2) ? 0 : 1;\n\tError += sizeof(glm::mat2x3) == sizeof(glm::highp_mat2x3) ? 0 : 1;\n\tError += sizeof(glm::mat2x4) == sizeof(glm::highp_mat2x4) ? 0 : 1;\n\tError += sizeof(glm::mat3x2) == sizeof(glm::highp_mat3x2) ? 0 : 1;\n\tError += sizeof(glm::mat3x3) == sizeof(glm::highp_mat3x3) ? 0 : 1;\n\tError += sizeof(glm::mat3x4) == sizeof(glm::highp_mat3x4) ? 0 : 1;\n\tError += sizeof(glm::mat4x2) == sizeof(glm::highp_mat4x2) ? 0 : 1;\n\tError += sizeof(glm::mat4x3) == sizeof(glm::highp_mat4x3) ? 0 : 1;\n\tError += sizeof(glm::mat4x4) == sizeof(glm::highp_mat4x4) ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_vec()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::vec2) == sizeof(glm::highp_vec2) ? 0 : 1;\n\tError += sizeof(glm::vec3) == sizeof(glm::highp_vec3) ? 0 : 1;\n\tError += sizeof(glm::vec4) == sizeof(glm::highp_vec4) ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_dvec()\n{\n\tint Error = 0;\n\t\n\tError += sizeof(glm::dvec2) == sizeof(glm::highp_dvec2) ? 0 : 1;\n\tError += sizeof(glm::dvec3) == sizeof(glm::highp_dvec3) ? 0 : 1;\n\tError += sizeof(glm::dvec4) == sizeof(glm::highp_dvec4) ? 0 : 1;\n\t\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_mat();\n\tError += test_vec();\n\tError += test_dvec();\n\t\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_aligned.cpp",
    "content": "#include <glm/glm.hpp>\n\nint test_aligned()\n{\n\tint Error = 0;\n\n\tsize_t size1_aligned = sizeof(glm::detail::storage<int, 1, true>::type);\n\tError += size1_aligned == 1 ? 0 : 1;\n\tsize_t size2_aligned = sizeof(glm::detail::storage<int, 2, true>::type);\n\tError += size2_aligned == 2 ? 0 : 1;\n\tsize_t size4_aligned = sizeof(glm::detail::storage<int, 4, true>::type);\n\tError += size4_aligned == 4 ? 0 : 1;\n\tsize_t size8_aligned = sizeof(glm::detail::storage<int, 8, true>::type);\n\tError += size8_aligned == 8 ? 0 : 1;\n\tsize_t size16_aligned = sizeof(glm::detail::storage<int, 16, true>::type);\n\tError += size16_aligned == 16 ? 0 : 1;\n\tsize_t size32_aligned = sizeof(glm::detail::storage<int, 32, true>::type);\n\tError += size32_aligned == 32 ? 0 : 1;\n\tsize_t size64_aligned = sizeof(glm::detail::storage<int, 64, true>::type);\n\tError += size64_aligned == 64 ? 0 : 1;\n\n#\tif GLM_HAS_ALIGNOF\n\n\tsize_t align1_aligned = alignof(glm::detail::storage<int, 1, true>::type);\n\tError += align1_aligned == 1 ? 0 : 1;\n\tsize_t align2_aligned = alignof(glm::detail::storage<int, 2, true>::type);\n\tError += align2_aligned == 2 ? 0 : 1;\n\tsize_t align4_aligned = alignof(glm::detail::storage<int, 4, true>::type);\n\tError += align4_aligned == 4 ? 0 : 1;\n\tsize_t align8_aligned = alignof(glm::detail::storage<int, 8, true>::type);\n\tError += align8_aligned == 8 ? 0 : 1;\n\tsize_t align16_aligned = alignof(glm::detail::storage<int, 16, true>::type);\n\tError += align16_aligned == 16 ? 0 : 1;\n\tsize_t align32_aligned = alignof(glm::detail::storage<int, 32, true>::type);\n\tError += align32_aligned == 32 ? 0 : 1;\n\tsize_t align64_aligned = alignof(glm::detail::storage<int, 64, true>::type);\n\tError += align64_aligned == 64 ? 0 : 1;\n\n#\telif GLM_COMPILER & GLM_COMPILER_GCC\n\n\tsize_t align1_aligned = __alignof__(glm::detail::storage<int, 1, true>::type);\n\tError += align1_aligned == 1 ? 0 : 1;\n\tsize_t align2_aligned = __alignof__(glm::detail::storage<int, 2, true>::type);\n\tError += align2_aligned == 2 ? 0 : 1;\n\tsize_t align4_aligned = __alignof__(glm::detail::storage<int, 4, true>::type);\n\tError += align4_aligned == 4 ? 0 : 1;\n\tsize_t align8_aligned = __alignof__(glm::detail::storage<int, 8, true>::type);\n\tError += align8_aligned == 8 ? 0 : 1;\n\tsize_t align16_aligned = __alignof__(glm::detail::storage<int, 16, true>::type);\n\tError += align16_aligned == 16 ? 0 : 1;\n\tsize_t align32_aligned = __alignof__(glm::detail::storage<int, 32, true>::type);\n\tError += align32_aligned == 32 ? 0 : 1;\n\tsize_t align64_aligned = __alignof__(glm::detail::storage<int, 64, true>::type);\n\tError += align64_aligned == 64 ? 0 : 1;\n\n#\tendif //GLM_HAS_ALIGNOF\n\n\treturn Error;\n}\n\nint test_unaligned()\n{\n\tint Error = 0;\n\n\tsize_t size1_unaligned = sizeof(glm::detail::storage<int, 1, false>::type);\n\tError += size1_unaligned == 1 ? 0 : 1;\n\tsize_t size2_unaligned = sizeof(glm::detail::storage<int, 2, false>::type);\n\tError += size2_unaligned == 2 ? 0 : 1;\n\tsize_t size4_unaligned = sizeof(glm::detail::storage<int, 4, false>::type);\n\tError += size4_unaligned == 4 ? 0 : 1;\n\tsize_t size8_unaligned = sizeof(glm::detail::storage<int, 8, false>::type);\n\tError += size8_unaligned == 8 ? 0 : 1;\n\tsize_t size16_unaligned = sizeof(glm::detail::storage<int, 16, false>::type);\n\tError += size16_unaligned == 16 ? 0 : 1;\n\tsize_t size32_unaligned = sizeof(glm::detail::storage<int, 32, false>::type);\n\tError += size32_unaligned == 32 ? 0 : 1;\n\tsize_t size64_unaligned = sizeof(glm::detail::storage<int, 64, false>::type);\n\tError += size64_unaligned == 64 ? 0 : 1;\n\n#\tif GLM_HAS_ALIGNOF\n\n\tsize_t align1_unaligned = alignof(glm::detail::storage<int, 1, false>::type);\n\tError += align1_unaligned == 1 ? 0 : 1;\n\tsize_t align2_unaligned = alignof(glm::detail::storage<int, 2, false>::type);\n\tError += align2_unaligned == 1 ? 0 : 1;\n\tsize_t align4_unaligned = alignof(glm::detail::storage<int, 4, false>::type);\n\tError += align4_unaligned == 1 ? 0 : 1;\n\tsize_t align8_unaligned = alignof(glm::detail::storage<int, 8, false>::type);\n\tError += align8_unaligned == 1 ? 0 : 1;\n\tsize_t align16_unaligned = alignof(glm::detail::storage<int, 16, false>::type);\n\tError += align16_unaligned == 1 ? 0 : 1;\n\tsize_t align32_unaligned = alignof(glm::detail::storage<int, 32, false>::type);\n\tError += align32_unaligned == 1 ? 0 : 1;\n\tsize_t align64_unaligned = alignof(glm::detail::storage<int, 64, false>::type);\n\tError += align64_unaligned == 1 ? 0 : 1;\n\n#\telif GLM_COMPILER & GLM_COMPILER_GCC\n\n\tsize_t align1_unaligned = __alignof__(glm::detail::storage<int, 1, false>::type);\n\tError += align1_unaligned == 1 ? 0 : 1;\n\tsize_t align2_unaligned = __alignof__(glm::detail::storage<int, 2, false>::type);\n\tError += align2_unaligned == 1 ? 0 : 1;\n\tsize_t align4_unaligned = __alignof__(glm::detail::storage<int, 4, false>::type);\n\tError += align4_unaligned == 1 ? 0 : 1;\n\tsize_t align8_unaligned = __alignof__(glm::detail::storage<int, 8, false>::type);\n\tError += align8_unaligned == 1 ? 0 : 1;\n\tsize_t align16_unaligned = __alignof__(glm::detail::storage<int, 16, false>::type);\n\tError += align16_unaligned == 1 ? 0 : 1;\n\tsize_t align32_unaligned = __alignof__(glm::detail::storage<int, 32, false>::type);\n\tError += align32_unaligned == 1 ? 0 : 1;\n\tsize_t align64_unaligned = __alignof__(glm::detail::storage<int, 64, false>::type);\n\tError += align64_unaligned == 1 ? 0 : 1;\n\n#\tendif //GLM_HAS_ALIGNOF\n\n\treturn Error;\n}\n\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_aligned();\n\tError += test_unaligned();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_cast.cpp",
    "content": "#include <glm/glm.hpp>\n#include <algorithm>\n#include <vector>\n#include <iterator>\n\nstruct my_vec2\n{\n\toperator glm::vec2() { return glm::vec2(x, y); }\n\tfloat x, y;\n};\n\nint test_vec2_cast()\n{\n\tglm::vec2 A(1.0f, 2.0f);\n\tglm::lowp_vec2 B(A);\n\tglm::mediump_vec2 C(A);\n\tglm::highp_vec2 D(A);\n\t\n\tglm::vec2 E = static_cast<glm::vec2>(A);\n\tglm::lowp_vec2 F = static_cast<glm::lowp_vec2>(A);\n\tglm::mediump_vec2 G = static_cast<glm::mediump_vec2>(A);\n\tglm::highp_vec2 H = static_cast<glm::highp_vec2>(A);\n\t\n\tmy_vec2 I;\n\tglm::vec2 J = static_cast<glm::vec2>(I);\n\tglm::vec2 K(7.8f);\n\n\tint Error(0);\n\t\n\tError += glm::all(glm::equal(A, E)) ? 0 : 1;\n\tError += glm::all(glm::equal(B, F)) ? 0 : 1;\n\tError += glm::all(glm::equal(C, G)) ? 0 : 1;\n\tError += glm::all(glm::equal(D, H)) ? 0 : 1;\n\t\n\treturn Error;\n}\n\nint test_vec3_cast()\n{\n\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\tglm::lowp_vec3 B(A);\n\tglm::mediump_vec3 C(A);\n\tglm::highp_vec3 D(A);\n\t\n\tglm::vec3 E = static_cast<glm::vec3>(A);\n\tglm::lowp_vec3 F = static_cast<glm::lowp_vec3>(A);\n\tglm::mediump_vec3 G = static_cast<glm::mediump_vec3>(A);\n\tglm::highp_vec3 H = static_cast<glm::highp_vec3>(A);\n\t\n\tint Error(0);\n\t\n\tError += glm::all(glm::equal(A, E)) ? 0 : 1;\n\tError += glm::all(glm::equal(B, F)) ? 0 : 1;\n\tError += glm::all(glm::equal(C, G)) ? 0 : 1;\n\tError += glm::all(glm::equal(D, H)) ? 0 : 1;\n\t\n\treturn Error;\n}\n\nint test_vec4_cast()\n{\n\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\tglm::lowp_vec4 B(A);\n\tglm::mediump_vec4 C(A);\n\tglm::highp_vec4 D(A);\n\t\n\tglm::vec4 E = static_cast<glm::vec4>(A);\n\tglm::lowp_vec4 F = static_cast<glm::lowp_vec4>(A);\n\tglm::mediump_vec4 G = static_cast<glm::mediump_vec4>(A);\n\tglm::highp_vec4 H = static_cast<glm::highp_vec4>(A);\n\t\n\tint Error(0);\n\t\n\tError += glm::all(glm::equal(A, E)) ? 0 : 1;\n\tError += glm::all(glm::equal(B, F)) ? 0 : 1;\n\tError += glm::all(glm::equal(C, G)) ? 0 : 1;\n\tError += glm::all(glm::equal(D, H)) ? 0 : 1;\n\t\n\treturn Error;\n}\n\nint test_std_copy()\n{\n\tint Error = 0;\n\n\t{\n\t\tstd::vector<int> High;\n\t\tHigh.resize(64);\n\t\tstd::vector<int> Medium(High.size());\n\t\t\n\t\tstd::copy(High.begin(), High.end(), Medium.begin());\n\n\t\t*Medium.begin() = *High.begin();\n\t}\n\n\t{\n\t\tstd::vector<glm::dvec4> High4;\n\t\tHigh4.resize(64);\n\t\tstd::vector<glm::vec4> Medium4(High4.size());\n\t\t\n\t\tstd::copy(High4.begin(), High4.end(), Medium4.begin());\n\n\t\t*Medium4.begin() = *High4.begin();\n\t}\n\n\t{\n\t\tstd::vector<glm::dvec3> High3;\n\t\tHigh3.resize(64);\n\t\tstd::vector<glm::vec3> Medium3(High3.size());\n\n\t\tstd::copy(High3.begin(), High3.end(), Medium3.begin());\n\n\t\t*Medium3.begin() = *High3.begin();\n\t}\n\n\t{\n\t\tstd::vector<glm::dvec2> High2;\n\t\tHigh2.resize(64);\n\t\tstd::vector<glm::vec2> Medium2(High2.size());\n\n\t\tstd::copy(High2.begin(), High2.end(), Medium2.begin());\n\n\t\t*Medium2.begin() = *High2.begin();\n\t}\n\n\tglm::dvec4 v1;\n\tglm::vec4 v2;\n\n\tv2 = v1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_std_copy();\n\tError += test_vec2_cast();\n\tError += test_vec3_cast();\n\tError += test_vec4_cast();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_ctor.cpp",
    "content": "#include <glm/glm.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <glm/gtc/quaternion.hpp>\n\nstatic int test_vec1_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::vec1 f;\n\t\t\tglm::ivec1 i;\n\t\t} A, B;\n\n\t\tA.f = glm::vec1(0);\n\t\tError += glm::all(glm::equal(A.i, glm::ivec1(0))) ? 0 : 1;\n\n\t\tB.f = glm::vec1(1);\n\t\tError += glm::all(glm::equal(B.i, glm::ivec1(1065353216))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_vec2_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::vec2 f;\n\t\t\tglm::ivec2 i;\n\t\t} A, B;\n\n\t\tA.f = glm::vec2(0);\n\t\tError += glm::all(glm::equal(A.i, glm::ivec2(0))) ? 0 : 1;\n\n\t\tB.f = glm::vec2(1);\n\t\tError += glm::all(glm::equal(B.i, glm::ivec2(1065353216))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_vec3_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::vec3 f;\n\t\t\tglm::ivec3 i;\n\t\t} A, B;\n\n\t\tA.f = glm::vec3(0);\n\t\tError += glm::all(glm::equal(A.i, glm::ivec3(0))) ? 0 : 1;\n\n\t\tB.f = glm::vec3(1);\n\t\tError += glm::all(glm::equal(B.i, glm::ivec3(1065353216))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_vec4_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::vec4 f;\n\t\t\tglm::ivec4 i;\n\t\t} A, B;\n\n\t\tA.f = glm::vec4(0);\n\t\tError += glm::all(glm::equal(A.i, glm::ivec4(0))) ? 0 : 1;\n\n\t\tB.f = glm::vec4(1);\n\t\tError += glm::all(glm::equal(B.i, glm::ivec4(1065353216))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat2x2_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat2x2 f;\n\t\t\tglm::mat2x2 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat2x2(0);\n\t\tError += glm::all(glm::equal(A.i[0], glm::vec2(0))) ? 0 : 1;\n\n\t\tB.f = glm::mat2x2(1);\n\t\tError += glm::all(glm::equal(B.i[0], glm::vec2(1, 0))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat2x3_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat2x3 f;\n\t\t\tglm::mat2x3 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat2x3(0);\n\t\tError += glm::all(glm::equal(A.i[0], glm::vec3(0))) ? 0 : 1;\n\n\t\tB.f = glm::mat2x3(1);\n\t\tError += glm::all(glm::equal(B.i[0], glm::vec3(1, 0, 0))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat2x4_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat2x4 f;\n\t\t\tglm::mat2x4 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat2x4(0);\n\t\tglm::vec4 const C(0, 0, 0, 0);\n\t\tError += glm::all(glm::equal(A.i[0], C)) ? 0 : 1;\n\n\t\tB.f = glm::mat2x4(1);\n\t\tglm::vec4 const D(1, 0, 0, 0);\n\t\tError += glm::all(glm::equal(B.i[0], D)) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat3x2_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat3x2 f;\n\t\t\tglm::mat3x2 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat3x2(0);\n\t\tError += glm::all(glm::equal(A.i[0], glm::vec2(0))) ? 0 : 1;\n\n\t\tB.f = glm::mat3x2(1);\n\t\tError += glm::all(glm::equal(B.i[0], glm::vec2(1, 0))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat3x3_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat3x3 f;\n\t\t\tglm::mat3x3 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat3x3(0);\n\t\tError += glm::all(glm::equal(A.i[0], glm::vec3(0))) ? 0 : 1;\n\n\t\tB.f = glm::mat3x3(1);\n\t\tError += glm::all(glm::equal(B.i[0], glm::vec3(1, 0, 0))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat3x4_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat3x4 f;\n\t\t\tglm::mat3x4 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat3x4(0);\n\t\tError += glm::all(glm::equal(A.i[0], glm::vec4(0))) ? 0 : 1;\n\n\t\tB.f = glm::mat3x4(1);\n\t\tError += glm::all(glm::equal(B.i[0], glm::vec4(1, 0, 0, 0))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat4x2_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat4x2 f;\n\t\t\tglm::mat4x2 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat4x2(0);\n\t\tError += glm::all(glm::equal(A.i[0], glm::vec2(0))) ? 0 : 1;\n\n\t\tB.f = glm::mat4x2(1);\n\t\tError += glm::all(glm::equal(B.i[0], glm::vec2(1, 0))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat4x3_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat4x3 f;\n\t\t\tglm::mat4x3 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat4x3(0);\n\t\tError += glm::all(glm::equal(A.i[0], glm::vec3(0))) ? 0 : 1;\n\n\t\tB.f = glm::mat4x3(1);\n\t\tError += glm::all(glm::equal(B.i[0], glm::vec3(1, 0, 0))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_mat4x4_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::mat4 f;\n\t\t\tglm::mat4 i;\n\t\t} A, B;\n\n\t\tA.f = glm::mat4(0);\n\t\tError += glm::all(glm::equal(A.i[0], glm::vec4(0))) ? 0 : 1;\n\n\t\tB.f = glm::mat4(1);\n\t\tError += glm::all(glm::equal(B.i[0], glm::vec4(1, 0, 0, 0))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nstatic int test_quat_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_DEFAULTED_FUNCTIONS\n\t{\n\t\tunion pack\n\t\t{\n\t\t\tglm::quat f;\n\t\t\tglm::quat i;\n\t\t} A, B;\n\n\t\tA.f = glm::quat(0, 0, 0, 0);\n\t\tError += glm::all(glm::equal(A.i, glm::quat(0, 0, 0, 0))) ? 0 : 1;\n\n\t\tB.f = glm::quat(1, 1, 1, 1);\n\t\tError += glm::all(glm::equal(B.i, glm::quat(1, 1, 1, 1))) ? 0 : 1;\n\t}\n#\tendif//GLM_HAS_DEFAULTED_FUNCTIONS\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_vec1_ctor();\n\tError += test_vec2_ctor();\n\tError += test_vec3_ctor();\n\tError += test_vec4_ctor();\n\tError += test_mat2x2_ctor();\n\tError += test_mat2x3_ctor();\n\tError += test_mat2x4_ctor();\n\tError += test_mat3x2_ctor();\n\tError += test_mat3x3_ctor();\n\tError += test_mat3x4_ctor();\n\tError += test_mat4x2_ctor();\n\tError += test_mat4x3_ctor();\n\tError += test_mat4x4_ctor();\n\tError += test_quat_ctor();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_float.cpp",
    "content": "#include <glm/glm.hpp>\n\nint test_float_size()\n{\n\treturn\n\t\tsizeof(glm::float_t) != sizeof(glm::lowp_float) &&\n\t\tsizeof(glm::float_t) != sizeof(glm::mediump_float) && \n\t\tsizeof(glm::float_t) != sizeof(glm::highp_float);\n}\n\nint test_float_precision()\n{\n\treturn (\n\t\tsizeof(glm::lowp_float) <= sizeof(glm::mediump_float) && \n\t\tsizeof(glm::mediump_float) <= sizeof(glm::highp_float)) ? 0 : 1;\n}\n\nint test_vec2()\n{\n\treturn 0;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_float_size();\n\tError += test_float_precision();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_int.cpp",
    "content": "#include <glm/glm.hpp>\n\nstatic int test_int_size()\n{\n\treturn\n\t\tsizeof(glm::int_t) != sizeof(glm::lowp_int) &&\n\t\tsizeof(glm::int_t) != sizeof(glm::mediump_int) && \n\t\tsizeof(glm::int_t) != sizeof(glm::highp_int);\n}\n\nstatic int test_uint_size()\n{\n\treturn\n\t\tsizeof(glm::uint_t) != sizeof(glm::lowp_uint) &&\n\t\tsizeof(glm::uint_t) != sizeof(glm::mediump_uint) && \n\t\tsizeof(glm::uint_t) != sizeof(glm::highp_uint);\n}\n\nstatic int test_int_precision()\n{\n\treturn (\n\t\tsizeof(glm::lowp_int) <= sizeof(glm::mediump_int) && \n\t\tsizeof(glm::mediump_int) <= sizeof(glm::highp_int)) ? 0 : 1;\n}\n\nstatic int test_uint_precision()\n{\n\treturn (\n\t\tsizeof(glm::lowp_uint) <= sizeof(glm::mediump_uint) && \n\t\tsizeof(glm::mediump_uint) <= sizeof(glm::highp_uint)) ? 0 : 1;\n}\n\nstatic int test_bit_operator()\n{\n\tint Error = 0;\n\n\tglm::ivec4 const a(1);\n\tglm::ivec4 const b = ~a;\n\tError += glm::all(glm::equal(b, glm::ivec4(-2))) ? 0 : 1;\n\n\tglm::int32 const c(1);\n\tglm::int32 const d = ~c;\n\tError += d == -2 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_int_size();\n\tError += test_int_precision();\n\tError += test_uint_size();\n\tError += test_uint_precision();\n\tError += test_bit_operator();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_length.cpp",
    "content": "#include <glm/glm.hpp>\n\nstatic int test_length_mat_non_squared()\n{\n\tint Error = 0;\n\n\tError += glm::mat2x3().length() == 2 ? 0 : 1;\n\tError += glm::mat2x4().length() == 2 ? 0 : 1;\n\tError += glm::mat3x2().length() == 3 ? 0 : 1;\n\tError += glm::mat3x4().length() == 3 ? 0 : 1;\n\tError += glm::mat4x2().length() == 4 ? 0 : 1;\n\tError += glm::mat4x3().length() == 4 ? 0 : 1;\n\t\n\tError += glm::dmat2x3().length() == 2 ? 0 : 1;\n\tError += glm::dmat2x4().length() == 2 ? 0 : 1;\n\tError += glm::dmat3x2().length() == 3 ? 0 : 1;\n\tError += glm::dmat3x4().length() == 3 ? 0 : 1;\n\tError += glm::dmat4x2().length() == 4 ? 0 : 1;\n\tError += glm::dmat4x3().length() == 4 ? 0 : 1;\n\t\n\treturn Error;\n}\n\nstatic int test_length_mat()\n{\n\tint Error = 0;\n\t\n\tError += glm::mat2().length() == 2 ? 0 : 1;\n\tError += glm::mat3().length() == 3 ? 0 : 1;\n\tError += glm::mat4().length() == 4 ? 0 : 1;\n\tError += glm::mat2x2().length() == 2 ? 0 : 1;\n\tError += glm::mat3x3().length() == 3 ? 0 : 1;\n\tError += glm::mat4x4().length() == 4 ? 0 : 1;\n\t\n\tError += glm::dmat2().length() == 2 ? 0 : 1;\n\tError += glm::dmat3().length() == 3 ? 0 : 1;\n\tError += glm::dmat4().length() == 4 ? 0 : 1;\n\tError += glm::dmat2x2().length() == 2 ? 0 : 1;\n\tError += glm::dmat3x3().length() == 3 ? 0 : 1;\n\tError += glm::dmat4x4().length() == 4 ? 0 : 1;\n\t\n\treturn Error;\n}\n\nstatic int test_length_vec()\n{\n\n\tint Error = 0;\n\t\n\tError += glm::vec2().length() == 2 ? 0 : 1;\n\tError += glm::vec3().length() == 3 ? 0 : 1;\n\tError += glm::vec4().length() == 4 ? 0 : 1;\n\n\tError += glm::ivec2().length() == 2 ? 0 : 1;\n\tError += glm::ivec3().length() == 3 ? 0 : 1;\n\tError += glm::ivec4().length() == 4 ? 0 : 1;\n\n\tError += glm::uvec2().length() == 2 ? 0 : 1;\n\tError += glm::uvec3().length() == 3 ? 0 : 1;\n\tError += glm::uvec4().length() == 4 ? 0 : 1;\t\n\t\n\tError += glm::dvec2().length() == 2 ? 0 : 1;\n\tError += glm::dvec3().length() == 3 ? 0 : 1;\n\tError += glm::dvec4().length() == 4 ? 0 : 1;\n\t\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\t\n\tError += test_length_vec();\n\tError += test_length_mat();\n\tError += test_length_mat_non_squared();\n\t\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat2x2.cpp",
    "content": "#include <glm/gtc/epsilon.hpp>\n#include <glm/matrix.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <vector>\n\nint test_operators()\n{\n\tglm::mat2x2 l(1.0f);\n\tglm::mat2x2 m(1.0f);\n\tglm::vec2 u(1.0f);\n\tglm::vec2 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec2 a = m * u;\n\tglm::vec2 b = v * m;\n\tglm::mat2x2 n = x / m;\n\tglm::mat2x2 o = m / x;\n\tglm::mat2x2 p = x * m;\n\tglm::mat2x2 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_inverse()\n{\n\tint Error(0);\n\n\t{\n\t\tglm::mat2 const Matrix(1, 2, 3, 4);\n\t\tglm::mat2 const Inverse = glm::inverse(Matrix);\n\t\tglm::mat2 const Identity = Matrix * Inverse;\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::vec2(1.0f, 0.0f), glm::vec2(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::vec2(0.0f, 1.0f), glm::vec2(0.01f))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::mat2 const Matrix(1, 2, 3, 4);\n\t\tglm::mat2 const Identity = Matrix / Matrix;\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::vec2(1.0f, 0.0f), glm::vec2(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::vec2(0.0f, 1.0f), glm::vec2(0.01f))) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if GLM_HAS_INITIALIZER_LISTS\n\tglm::mat2x2 m0(\n\t\tglm::vec2(0, 1), \n\t\tglm::vec2(2, 3));\n\n\tglm::mat2x2 m1{0, 1, 2, 3};\n\n\tglm::mat2x2 m2{\n\t\t{0, 1},\n\t\t{2, 3}};\n\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\n\tstd::vector<glm::mat2x2> v1{\n\t\t{0, 1, 2, 3},\n\t\t{0, 1, 2, 3}\n\t};\n\n\tstd::vector<glm::mat2x2> v2{\n\t\t{\n\t\t\t{ 0, 1},\n\t\t\t{ 4, 5}\n\t\t},\n\t\t{\n\t\t\t{ 0, 1},\n\t\t\t{ 4, 5}\n\t\t}\n\t};\n\n#endif//GLM_HAS_INITIALIZER_LISTS\n\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat2 B(A);\n\t\tglm::mat2 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::equal(B[i], Identity[i])) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 16 == sizeof(glm::mat2x2) ? 0 : 1;\n\tError += 32 == sizeof(glm::dmat2x2) ? 0 : 1;\n\tError += glm::mat2x2().length() == 2 ? 0 : 1;\n\tError += glm::dmat2x2().length() == 2 ? 0 : 1;\n\tError += glm::mat2x2::length() == 2 ? 0 : 1;\n\tError += glm::dmat2x2::length() == 2 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_operators();\n\tError += test_inverse();\n\tError += test_size();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat2x3.cpp",
    "content": "#include <glm/vector_relational.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <vector>\n\nstatic int test_operators()\n{\n\tglm::mat2x3 l(1.0f);\n\tglm::mat2x3 m(1.0f);\n\tglm::vec2 u(1.0f);\n\tglm::vec3 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec3 a = m * u;\n\tglm::vec2 b = v * m;\n\tglm::mat2x3 n = x / m;\n\tglm::mat2x3 o = m / x;\n\tglm::mat2x3 p = x * m;\n\tglm::mat2x3 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if GLM_HAS_INITIALIZER_LISTS\n\tglm::mat2x3 m0(\n\t\tglm::vec3(0, 1, 2),\n\t\tglm::vec3(3, 4, 5));\n\t\n\tglm::mat2x3 m1{0, 1, 2, 3, 4, 5};\n\t\n\tglm::mat2x3 m2{\n\t\t{0, 1, 2},\n\t\t{3, 4, 5}};\n\t\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\t\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\t\n\tstd::vector<glm::mat2x3> v1{\n\t\t{0, 1, 2, 3, 4, 5},\n\t\t{0, 1, 2, 3, 4, 5}\n\t};\n\t\n\tstd::vector<glm::mat2x3> v2{\n\t\t{\n\t\t\t{ 0, 1, 2},\n\t\t\t{ 4, 5, 6}\n\t\t},\n\t\t{\n\t\t\t{ 0, 1, 2},\n\t\t\t{ 4, 5, 6}\n\t\t}\n\t};\n\t\n#endif//GLM_HAS_INITIALIZER_LISTS\n\t\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat2x3 B(A);\n\t\tglm::mat2x3 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::equal(B[i], Identity[i])) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 24 == sizeof(glm::mat2x3) ? 0 : 1;\n\tError += 48 == sizeof(glm::dmat2x3) ? 0 : 1;\n\tError += glm::mat2x3().length() == 2 ? 0 : 1;\n\tError += glm::dmat2x3().length() == 2 ? 0 : 1;\n\tError += glm::mat2x3::length() == 2 ? 0 : 1;\n\tError += glm::dmat2x3::length() == 2 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_operators();\n\tError += test_size();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat2x4.cpp",
    "content": "#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/constants.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <vector>\n\nstatic int test_operators()\n{\n\tglm::mat2x4 l(1.0f);\n\tglm::mat2x4 m(1.0f);\n\tglm::vec2 u(1.0f);\n\tglm::vec4 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec4 a = m * u;\n\tglm::vec2 b = v * m;\n\tglm::mat2x4 n = x / m;\n\tglm::mat2x4 o = m / x;\n\tglm::mat2x4 p = x * m;\n\tglm::mat2x4 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if(GLM_HAS_INITIALIZER_LISTS)\n\tglm::mat2x4 m0(\n\t\tglm::vec4(0, 1, 2, 3),\n\t\tglm::vec4(4, 5, 6, 7));\n\t\n\tglm::mat2x4 m1{0, 1, 2, 3, 4, 5, 6, 7};\n\t\n\tglm::mat2x4 m2{\n\t\t{0, 1, 2, 3},\n\t\t{4, 5, 6, 7}};\n\t\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\t\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\t\n\tstd::vector<glm::mat2x4> v1{\n\t\t{0, 1, 2, 3, 4, 5, 6, 7},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7}\n\t};\n\t\n\tstd::vector<glm::mat2x4> v2{\n\t\t{\n\t\t\t{ 0, 1, 2, 3},\n\t\t\t{ 4, 5, 6, 7}\n\t\t},\n\t\t{\n\t\t\t{ 0, 1, 2, 3},\n\t\t\t{ 4, 5, 6, 7}\n\t\t}\n\t};\n\t\n#endif//GLM_HAS_INITIALIZER_LISTS\n\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat2x4 B(A);\n\t\tglm::mat2x4 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::epsilonEqual(B[i], Identity[i], glm::epsilon<float>())) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 32 == sizeof(glm::mat2x4) ? 0 : 1;\n\tError += 64 == sizeof(glm::dmat2x4) ? 0 : 1;\n\tError += glm::mat2x4().length() == 2 ? 0 : 1;\n\tError += glm::dmat2x4().length() == 2 ? 0 : 1;\n\tError += glm::mat2x4::length() == 2 ? 0 : 1;\n\tError += glm::dmat2x4::length() == 2 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_operators();\n\tError += test_size();\n\n\treturn Error;\n}\n\n\n\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat3x2.cpp",
    "content": "#include <glm/vector_relational.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <vector>\n\nstatic bool test_operators()\n{\n\tglm::mat3x2 l(1.0f);\n\tglm::mat3x2 m(1.0f);\n\tglm::vec3 u(1.0f);\n\tglm::vec2 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec2 a = m * u;\n\tglm::vec3 b = v * m;\n\tglm::mat3x2 n = x / m;\n\tglm::mat3x2 o = m / x;\n\tglm::mat3x2 p = x * m;\n\tglm::mat3x2 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if(GLM_HAS_INITIALIZER_LISTS)\n\tglm::mat3x2 m0(\n\t\tglm::vec2(0, 1),\n\t\tglm::vec2(2, 3),\n\t\tglm::vec2(4, 5));\n\t\n\tglm::mat3x2 m1{0, 1, 2, 3, 4, 5};\n\t\n\tglm::mat3x2 m2{\n\t\t{0, 1},\n\t\t{2, 3},\n\t\t{4, 5}};\n\t\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\t\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\t\n\tstd::vector<glm::mat3x2> v1{\n\t\t{0, 1, 2, 3, 4, 5},\n\t\t{0, 1, 2, 3, 4, 5}\n\t};\n\t\n\tstd::vector<glm::mat3x2> v2{\n\t\t{\n\t\t\t{ 0, 1},\n\t\t\t{ 2, 3},\n\t\t\t{ 4, 5}\n\t\t},\n\t\t{\n\t\t\t{ 0, 1},\n\t\t\t{ 2, 3},\n\t\t\t{ 4, 5}\n\t\t}\n\t};\n\t\n#endif//GLM_HAS_INITIALIZER_LISTS\n\t\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat3x2 B(A);\n\t\tglm::mat3x2 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::equal(B[i], Identity[i])) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 24 == sizeof(glm::mat3x2) ? 0 : 1;\n\tError += 48 == sizeof(glm::dmat3x2) ? 0 : 1;\n\tError += glm::mat3x2().length() == 3 ? 0 : 1;\n\tError += glm::dmat3x2().length() == 3 ? 0 : 1;\n\tError += glm::mat3x2::length() == 3 ? 0 : 1;\n\tError += glm::dmat3x2::length() == 3 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_operators();\n\tError += test_size();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat3x3.cpp",
    "content": "#include <glm/gtc/epsilon.hpp>\n#include <glm/matrix.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <cstdio>\n#include <vector>\n\nvoid print(glm::dmat3 const& Mat0)\n{\n\tprintf(\"mat3(\\n\");\n\tprintf(\"\\tvec3(%2.3f, %2.3f, %2.3f)\\n\", Mat0[0][0], Mat0[0][1], Mat0[0][2]);\n\tprintf(\"\\tvec3(%2.3f, %2.3f, %2.3f)\\n\", Mat0[1][0], Mat0[1][1], Mat0[1][2]);\n\tprintf(\"\\tvec3(%2.3f, %2.3f, %2.3f))\\n\\n\", Mat0[2][0], Mat0[2][1], Mat0[2][2]);\n}\n\nint test_mat3x3()\n{\n\tglm::dmat3 Mat0(\n\t\tglm::dvec3(0.6f, 0.2f, 0.3f), \n\t\tglm::dvec3(0.2f, 0.7f, 0.5f), \n\t\tglm::dvec3(0.3f, 0.5f, 0.7f));\n\tglm::dmat3 Inv0 = glm::inverse(Mat0);\n\tglm::dmat3 Res0 = Mat0 * Inv0;\n\n\tprint(Mat0);\n\tprint(Inv0);\n\tprint(Res0);\n\n\treturn 0;\n}\n\nstatic int test_operators()\n{\n\tglm::mat3x3 l(1.0f);\n\tglm::mat3x3 m(1.0f);\n\tglm::vec3 u(1.0f);\n\tglm::vec3 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec3 a = m * u;\n\tglm::vec3 b = v * m;\n\tglm::mat3x3 n = x / m;\n\tglm::mat3x3 o = m / x;\n\tglm::mat3x3 p = x * m;\n\tglm::mat3x3 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_inverse()\n{\n\tint Error(0);\n\n\t{\n\t\tglm::mat3 const Matrix(\n\t\t\tglm::vec3(0.6f, 0.2f, 0.3f), \n\t\t\tglm::vec3(0.2f, 0.7f, 0.5f), \n\t\t\tglm::vec3(0.3f, 0.5f, 0.7f));\n\t\tglm::mat3 const Inverse = glm::inverse(Matrix);\n\t\tglm::mat3 const Identity = Matrix * Inverse;\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[2], glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(0.01f))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::mat3 const Matrix(\n\t\t\tglm::vec3(0.6f, 0.2f, 0.3f), \n\t\t\tglm::vec3(0.2f, 0.7f, 0.5f), \n\t\t\tglm::vec3(0.3f, 0.5f, 0.7f));\n\t\tglm::mat3 const Identity = Matrix / Matrix;\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[2], glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(0.01f))) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if(GLM_HAS_INITIALIZER_LISTS)\n\tglm::mat3x3 m0(\n\t\tglm::vec3(0, 1, 2),\n\t\tglm::vec3(3, 4, 5),\n\t\tglm::vec3(6, 7, 8));\n\t\n\tglm::mat3x3 m1{0, 1, 2, 3, 4, 5, 6, 7, 8};\n\t\n\tglm::mat3x3 m2{\n\t\t{0, 1, 2},\n\t\t{3, 4, 5},\n\t\t{6, 7, 8}};\n\t\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\t\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\t\n\tstd::vector<glm::mat3x3> v1{\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8}\n\t};\n\t\n\tstd::vector<glm::mat3x3> v2{\n\t\t{\n\t\t\t{ 0, 1, 2},\n\t\t\t{ 3, 4, 5},\n\t\t\t{ 6, 7, 8}\n\t\t},\n\t\t{\n\t\t\t{ 0, 1, 2},\n\t\t\t{ 3, 4, 5},\n\t\t\t{ 6, 7, 8}\n\t\t}\n\t};\n\t\n#endif//GLM_HAS_INITIALIZER_LISTS\n\t\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat3x3 B(A);\n\t\tglm::mat3x3 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::equal(B[i], Identity[i])) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 36 == sizeof(glm::mat3x3) ? 0 : 1;\n\tError += 72 == sizeof(glm::dmat3x3) ? 0 : 1;\n\tError += glm::mat3x3().length() == 3 ? 0 : 1;\n\tError += glm::dmat3x3().length() == 3 ? 0 : 1;\n\tError += glm::mat3x3::length() == 3 ? 0 : 1;\n\tError += glm::dmat3x3::length() == 3 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_mat3x3();\n\tError += test_operators();\n\tError += test_inverse();\n\tError += test_size();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat3x4.cpp",
    "content": "#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/constants.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <vector>\n\nstatic bool test_operators()\n{\n\tglm::mat3x4 l(1.0f);\n\tglm::mat3x4 m(1.0f);\n\tglm::vec3 u(1.0f);\n\tglm::vec4 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec4 a = m * u;\n\tglm::vec3 b = v * m;\n\tglm::mat3x4 n = x / m;\n\tglm::mat3x4 o = m / x;\n\tglm::mat3x4 p = x * m;\n\tglm::mat3x4 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if(GLM_HAS_INITIALIZER_LISTS)\n\tglm::mat3x4 m0(\n\t\tglm::vec4(0, 1, 2, 3),\n\t\tglm::vec4(4, 5, 6, 7),\n\t\tglm::vec4(8, 9, 10, 11));\n\t\n\tglm::mat3x4 m1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};\n\t\n\tglm::mat3x4 m2{\n\t\t{0, 1, 2, 3},\n\t\t{4, 5, 6, 7},\n\t\t{8, 9, 10, 11}};\n\t\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\t\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\t\n\tstd::vector<glm::mat3x4> v1{\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}\n\t};\n\t\n\tstd::vector<glm::mat3x4> v2{\n\t\t{\n\t\t\t{ 0, 1, 2, 3},\n\t\t\t{ 4, 5, 6, 7},\n\t\t\t{ 8, 9, 10, 11}\n\t\t},\n\t\t{\n\t\t\t{ 0, 1, 2, 3},\n\t\t\t{ 4, 5, 6, 7},\n\t\t\t{ 8, 9, 10, 11}\n\t\t}\n\t};\n\t\n#endif//GLM_HAS_INITIALIZER_LISTS\n\t\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat3x4 B(A);\n\t\tglm::mat3x4 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::epsilonEqual(B[i], Identity[i], glm::epsilon<float>())) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 48 == sizeof(glm::mat3x4) ? 0 : 1;\n\tError += 96 == sizeof(glm::dmat3x4) ? 0 : 1;\n\tError += glm::mat3x4().length() == 3 ? 0 : 1;\n\tError += glm::dmat3x4().length() == 3 ? 0 : 1;\n\tError += glm::mat3x4::length() == 3 ? 0 : 1;\n\tError += glm::dmat3x4::length() == 3 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_operators();\n\tError += test_size();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat4x2.cpp",
    "content": "#include <glm/vector_relational.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <vector>\n\nstatic int test_operators()\n{\n\tglm::mat4x2 l(1.0f);\n\tglm::mat4x2 m(1.0f);\n\tglm::vec4 u(1.0f);\n\tglm::vec2 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec2 a = m * u;\n\tglm::vec4 b = v * m;\n\tglm::mat4x2 n = x / m;\n\tglm::mat4x2 o = m / x;\n\tglm::mat4x2 p = x * m;\n\tglm::mat4x2 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if(GLM_HAS_INITIALIZER_LISTS)\n\tglm::mat4x2 m0(\n\t\tglm::vec2(0, 1), \n\t\tglm::vec2(2, 3),\n\t\tglm::vec2(4, 5),\n\t\tglm::vec2(6, 7));\n\n\tglm::mat4x2 m1{0, 1, 2, 3, 4, 5, 6, 7};\n\n\tglm::mat4x2 m2{\n\t\t{0, 1},\n\t\t{2, 3},\n\t\t{4, 5},\n\t\t{6, 7}};\n\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\n\tstd::vector<glm::mat4x2> v1{\n\t\t{0, 1, 2, 3, 4, 5, 6, 7},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7}\n\t};\n\n\tstd::vector<glm::mat4x2> v2{\n\t\t{\n\t\t\t{ 0, 1},\n\t\t\t{ 4, 5},\n\t\t\t{ 8, 9},\n\t\t\t{ 12, 13}\n\t\t},\n\t\t{\n\t\t\t{ 0, 1},\n\t\t\t{ 4, 5},\n\t\t\t{ 8, 9},\n\t\t\t{ 12, 13}\n\t\t}\n\t};\n\n#endif//GLM_HAS_INITIALIZER_LISTS\n\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat4x2 B(A);\n\t\tglm::mat4x2 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::equal(B[i], Identity[i])) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 32 == sizeof(glm::mat4x2) ? 0 : 1;\n\tError += 64 == sizeof(glm::dmat4x2) ? 0 : 1;\n\tError += glm::mat4x2().length() == 4 ? 0 : 1;\n\tError += glm::dmat4x2().length() == 4 ? 0 : 1;\n\tError += glm::mat4x2::length() == 4 ? 0 : 1;\n\tError += glm::dmat4x2::length() == 4 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_operators();\n\tError += test_size();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat4x3.cpp",
    "content": "#include <glm/vector_relational.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <vector>\n\nstatic int test_operators()\n{\n\tglm::mat4x3 l(1.0f);\n\tglm::mat4x3 m(1.0f);\n\tglm::vec4 u(1.0f);\n\tglm::vec3 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec3 a = m * u;\n\tglm::vec4 b = v * m;\n\tglm::mat4x3 n = x / m;\n\tglm::mat4x3 o = m / x;\n\tglm::mat4x3 p = x * m;\n\tglm::mat4x3 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if(GLM_HAS_INITIALIZER_LISTS)\n\tglm::mat4x3 m0(\n\t\tglm::vec3(0, 1, 2), \n\t\tglm::vec3(3, 4, 5),\n\t\tglm::vec3(6, 7, 8),\n\t\tglm::vec3(9, 10, 11));\n\n\tglm::mat4x3 m1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};\n\n\tglm::mat4x3 m2{\n\t\t{0, 1, 2},\n\t\t{3, 4, 5},\n\t\t{6, 7, 8},\n\t\t{9, 10, 11}};\n\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\n\tstd::vector<glm::mat4x3> v1{\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}\n\t};\n\n\tstd::vector<glm::mat4x3> v2{\n\t\t{\n\t\t\t{ 0, 1, 2 },\n\t\t\t{ 4, 5, 6 },\n\t\t\t{ 8, 9, 10 },\n\t\t\t{ 12, 13, 14 }\n\t\t},\n\t\t{\n\t\t\t{ 0, 1, 2 },\n\t\t\t{ 4, 5, 6 },\n\t\t\t{ 8, 9, 10 },\n\t\t\t{ 12, 13, 14 }\n\t\t}\n\t};\n\n#endif//GLM_HAS_INITIALIZER_LISTS\n\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat4x3 B(A);\n\t\tglm::mat4x3 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::equal(B[i], Identity[i])) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 48 == sizeof(glm::mat4x3) ? 0 : 1;\n\tError += 96 == sizeof(glm::dmat4x3) ? 0 : 1;\n\tError += glm::mat4x3().length() == 4 ? 0 : 1;\n\tError += glm::dmat4x3().length() == 4 ? 0 : 1;\n\tError += glm::mat4x3::length() == 4 ? 0 : 1;\n\tError += glm::dmat4x3::length() == 4 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_operators();\n\tError += test_size();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/core/core_type_mat4x4.cpp",
    "content": "#include <glm/gtc/constants.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/matrix.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n#include <cstdio>\n#include <vector>\n\n\ntemplate<typename genType>\nvoid print(genType const& Mat0)\n{\n\tprintf(\"mat4(\\n\");\n\tprintf(\"\\tvec4(%2.9f, %2.9f, %2.9f, %2.9f)\\n\", static_cast<double>(Mat0[0][0]), static_cast<double>(Mat0[0][1]), static_cast<double>(Mat0[0][2]), static_cast<double>(Mat0[0][3]));\n\tprintf(\"\\tvec4(%2.9f, %2.9f, %2.9f, %2.9f)\\n\", static_cast<double>(Mat0[1][0]), static_cast<double>(Mat0[1][1]), static_cast<double>(Mat0[1][2]), static_cast<double>(Mat0[1][3]));\n\tprintf(\"\\tvec4(%2.9f, %2.9f, %2.9f, %2.9f)\\n\", static_cast<double>(Mat0[2][0]), static_cast<double>(Mat0[2][1]), static_cast<double>(Mat0[2][2]), static_cast<double>(Mat0[2][3]));\n\tprintf(\"\\tvec4(%2.9f, %2.9f, %2.9f, %2.9f))\\n\\n\", static_cast<double>(Mat0[3][0]), static_cast<double>(Mat0[3][1]), static_cast<double>(Mat0[3][2]), static_cast<double>(Mat0[3][3]));\n}\n\nint test_inverse_mat4x4()\n{\n\tglm::mat4 Mat0(\n\t\tglm::vec4(0.6f, 0.2f, 0.3f, 0.4f), \n\t\tglm::vec4(0.2f, 0.7f, 0.5f, 0.3f), \n\t\tglm::vec4(0.3f, 0.5f, 0.7f, 0.2f), \n\t\tglm::vec4(0.4f, 0.3f, 0.2f, 0.6f));\n\tglm::mat4 Inv0 = glm::inverse(Mat0);\n\tglm::mat4 Res0 = Mat0 * Inv0;\n\n\tprint(Mat0);\n\tprint(Inv0);\n\tprint(Res0);\n\n\treturn 0;\n}\n\nint test_inverse_dmat4x4()\n{\n\tglm::dmat4 Mat0(\n\t\tglm::dvec4(0.6f, 0.2f, 0.3f, 0.4f), \n\t\tglm::dvec4(0.2f, 0.7f, 0.5f, 0.3f), \n\t\tglm::dvec4(0.3f, 0.5f, 0.7f, 0.2f), \n\t\tglm::dvec4(0.4f, 0.3f, 0.2f, 0.6f));\n\tglm::dmat4 Inv0 = glm::inverse(Mat0);\n\tglm::dmat4 Res0 = Mat0 * Inv0;\n\n\tprint(Mat0);\n\tprint(Inv0);\n\tprint(Res0);\n\n\treturn 0;\n}\n\nstatic bool test_operators()\n{\n\tglm::mat4x4 l(1.0f);\n\tglm::mat4x4 m(1.0f);\n\tglm::vec4 u(1.0f);\n\tglm::vec4 v(1.0f);\n\tfloat x = 1.0f;\n\tglm::vec4 a = m * u;\n\tglm::vec4 b = v * m;\n\tglm::mat4x4 n = x / m;\n\tglm::mat4x4 o = m / x;\n\tglm::mat4x4 p = x * m;\n\tglm::mat4x4 q = m * x;\n\tbool R = m != q;\n\tbool S = m == l;\n\n\treturn (S && !R) ? 0 : 1;\n}\n\nint test_inverse()\n{\n\tint Error(0);\n\n\t{\n\t\tglm::mat4 const Matrix(\n\t\t\tglm::vec4(0.6f, 0.2f, 0.3f, 0.4f), \n\t\t\tglm::vec4(0.2f, 0.7f, 0.5f, 0.3f), \n\t\t\tglm::vec4(0.3f, 0.5f, 0.7f, 0.2f), \n\t\t\tglm::vec4(0.4f, 0.3f, 0.2f, 0.6f));\n\t\tglm::mat4 const Inverse = glm::inverse(Matrix);\n\t\tglm::mat4 const Identity = Matrix * Inverse;\n\n\t\tprint(Matrix);\n\t\tprint(Inverse);\n\t\tprint(Identity);\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::vec4(0.0f, 1.0f, 0.0f, 0.0f), glm::vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[2], glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[3], glm::vec4(0.0f, 0.0f, 0.0f, 1.0f), glm::vec4(0.01f))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::highp_mat4 const Matrix(\n\t\t\tglm::highp_vec4(0.6f, 0.2f, 0.3f, 0.4f), \n\t\t\tglm::highp_vec4(0.2f, 0.7f, 0.5f, 0.3f), \n\t\t\tglm::highp_vec4(0.3f, 0.5f, 0.7f, 0.2f), \n\t\t\tglm::highp_vec4(0.4f, 0.3f, 0.2f, 0.6f));\n\t\tglm::highp_mat4 const Inverse = glm::inverse(Matrix);\n\t\tglm::highp_mat4 const Identity = Matrix * Inverse;\n\n\t\tprintf(\"highp_mat4 inverse\\n\");\n\t\tprint(Matrix);\n\t\tprint(Inverse);\n\t\tprint(Identity);\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::highp_vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::highp_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::highp_vec4(0.0f, 1.0f, 0.0f, 0.0f), glm::highp_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[2], glm::highp_vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::highp_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[3], glm::highp_vec4(0.0f, 0.0f, 0.0f, 1.0f), glm::highp_vec4(0.01f))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::mediump_mat4 const Matrix(\n\t\t\tglm::mediump_vec4(0.6f, 0.2f, 0.3f, 0.4f), \n\t\t\tglm::mediump_vec4(0.2f, 0.7f, 0.5f, 0.3f), \n\t\t\tglm::mediump_vec4(0.3f, 0.5f, 0.7f, 0.2f), \n\t\t\tglm::mediump_vec4(0.4f, 0.3f, 0.2f, 0.6f));\n\t\tglm::mediump_mat4 const Inverse = glm::inverse(Matrix);\n\t\tglm::mediump_mat4 const Identity = Matrix * Inverse;\n\n\t\tprintf(\"mediump_mat4 inverse\\n\");\n\t\tprint(Matrix);\n\t\tprint(Inverse);\n\t\tprint(Identity);\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::mediump_vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::mediump_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::mediump_vec4(0.0f, 1.0f, 0.0f, 0.0f), glm::mediump_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[2], glm::mediump_vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::mediump_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[3], glm::mediump_vec4(0.0f, 0.0f, 0.0f, 1.0f), glm::mediump_vec4(0.01f))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::lowp_mat4 const Matrix(\n\t\t\tglm::lowp_vec4(0.6f, 0.2f, 0.3f, 0.4f), \n\t\t\tglm::lowp_vec4(0.2f, 0.7f, 0.5f, 0.3f), \n\t\t\tglm::lowp_vec4(0.3f, 0.5f, 0.7f, 0.2f), \n\t\t\tglm::lowp_vec4(0.4f, 0.3f, 0.2f, 0.6f));\n\t\tglm::lowp_mat4 const Inverse = glm::inverse(Matrix);\n\t\tglm::lowp_mat4 const Identity = Matrix * Inverse;\n\n\t\tprintf(\"lowp_mat4 inverse\\n\");\n\t\tprint(Matrix);\n\t\tprint(Inverse);\n\t\tprint(Identity);\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::lowp_vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::lowp_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::lowp_vec4(0.0f, 1.0f, 0.0f, 0.0f), glm::lowp_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[2], glm::lowp_vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::lowp_vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[3], glm::lowp_vec4(0.0f, 0.0f, 0.0f, 1.0f), glm::lowp_vec4(0.01f))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::mat4 const Matrix(\n\t\t\tglm::vec4(0.6f, 0.2f, 0.3f, 0.4f), \n\t\t\tglm::vec4(0.2f, 0.7f, 0.5f, 0.3f), \n\t\t\tglm::vec4(0.3f, 0.5f, 0.7f, 0.2f), \n\t\t\tglm::vec4(0.4f, 0.3f, 0.2f, 0.6f));\n\t\tglm::mat4 const Identity = Matrix / Matrix;\n\n\t\tError += glm::all(glm::epsilonEqual(Identity[0], glm::vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[1], glm::vec4(0.0f, 1.0f, 0.0f, 0.0f), glm::vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[2], glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::vec4(0.01f))) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Identity[3], glm::vec4(0.0f, 0.0f, 0.0f, 1.0f), glm::vec4(0.01f))) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_ctr()\n{\n\tint Error(0);\n\n#if GLM_HAS_TRIVIAL_QUERIES\n\t//Error += std::is_trivially_default_constructible<glm::mat4>::value ? 0 : 1;\n\t//Error += std::is_trivially_copy_assignable<glm::mat4>::value ? 0 : 1;\n\tError += std::is_trivially_copyable<glm::mat4>::value ? 0 : 1;\n\t//Error += std::is_copy_constructible<glm::mat4>::value ? 0 : 1;\n\t//Error += std::has_trivial_copy_constructor<glm::mat4>::value ? 0 : 1;\n#endif\n\n#if(GLM_HAS_INITIALIZER_LISTS)\n\tglm::mat4 m0(\n\t\tglm::vec4(0, 1, 2, 3), \n\t\tglm::vec4(4, 5, 6, 7),\n\t\tglm::vec4(8, 9, 10, 11),\n\t\tglm::vec4(12, 13, 14, 15));\n\n\tassert(sizeof(m0) == 4 * 4 * 4);\n\n\tglm::vec4 V{0, 1, 2, 3};\n\n\tglm::mat4 m1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};\n\n\tglm::mat4 m2{\n\t\t{0, 1, 2, 3},\n\t\t{4, 5, 6, 7},\n\t\t{8, 9, 10, 11},\n\t\t{12, 13, 14, 15}};\n\n\tfor(glm::length_t i = 0; i < m0.length(); ++i)\n\t\tError += glm::all(glm::equal(m0[i], m2[i])) ? 0 : 1;\n\n\tfor(glm::length_t i = 0; i < m1.length(); ++i)\n\t\tError += glm::all(glm::equal(m1[i], m2[i])) ? 0 : 1;\n\n\tstd::vector<glm::mat4> m3{\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}};\n\n\tstd::vector<glm::mat4> v1{\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},\n\t\t{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}};\n\n\tstd::vector<glm::mat4> v2{\n\t\t{\n\t\t\t{ 0, 1, 2, 3 },\n\t\t\t{ 4, 5, 6, 7 },\n\t\t\t{ 8, 9, 10, 11 },\n\t\t\t{ 12, 13, 14, 15 }\n\t\t},\n\t\t{\n\t\t\t{ 0, 1, 2, 3 },\n\t\t\t{ 4, 5, 6, 7 },\n\t\t\t{ 8, 9, 10, 11 },\n\t\t\t{ 12, 13, 14, 15 }\n\t\t}};\n\n#endif//GLM_HAS_INITIALIZER_LISTS\n\n\treturn Error;\n}\n\nint perf_mul()\n{\n\tint Error = 0;\n\n\n\n\treturn Error;\n}\n\nnamespace cast\n{\n\ttemplate<typename genType>\n\tint entry()\n\t{\n\t\tint Error = 0;\n\n\t\tgenType A(1.0f);\n\t\tglm::mat4x4 B(A);\n\t\tglm::mat4x4 Identity(1.0f);\n\n\t\tfor(glm::length_t i = 0, length = B.length(); i < length; ++i)\n\t\t\tError += glm::all(glm::epsilonEqual(B[i], Identity[i], glm::epsilon<float>())) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tError += entry<glm::mat2x2>();\n\t\tError += entry<glm::mat2x3>();\n\t\tError += entry<glm::mat2x4>();\n\t\tError += entry<glm::mat3x2>();\n\t\tError += entry<glm::mat3x3>();\n\t\tError += entry<glm::mat3x4>();\n\t\tError += entry<glm::mat4x2>();\n\t\tError += entry<glm::mat4x3>();\n\t\tError += entry<glm::mat4x4>();\n\n\t\treturn Error;\n\t}\n}//namespace cast\n\nstruct repro\n{\n\trepro(){ this->matrix = new glm::mat4(); }\n\t~repro(){delete this->matrix;}\n\n\tglm::mat4* matrix;\n};\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 64 == sizeof(glm::mat4) ? 0 : 1;\n\tError += 128 == sizeof(glm::dmat4) ? 0 : 1;\n\tError += glm::mat4().length() == 4 ? 0 : 1;\n\tError += glm::dmat4().length() == 4 ? 0 : 1;\n\tError += glm::mat4::length() == 4 ? 0 : 1;\n\tError += glm::dmat4::length() == 4 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\trepro Repro;\n\n\tError += cast::test();\n\tError += test_ctr();\n\tError += test_inverse_dmat4x4();\n\tError += test_inverse_mat4x4();\n\tError += test_operators();\n\tError += test_inverse();\n\tError += test_size();\n\n\tError += perf_mul();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_vec1.cpp",
    "content": "#define GLM_FORCE_SWIZZLE\n#include <glm/vector_relational.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <glm/vec2.hpp>\n#include <vector>\n\nstatic glm::vec1 g1;\nstatic glm::vec1 g2(1);\n\nint test_vec1_operators()\n{\n\tint Error(0);\n\n\tglm::vec1 A(1.0f);\n\tglm::vec1 B(1.0f);\n\t{\n\t\tbool R = A != B;\n\t\tbool S = A == B;\n\n\t\tError += (S && !R) ? 0 : 1;\n\t}\n\n\t{\n\t\tA *= 1.0f;\n\t\tB *= 1.0;\n\t\tA += 1.0f;\n\t\tB += 1.0;\n\n\t\tbool R = A != B;\n\t\tbool S = A == B;\n\n\t\tError += (S && !R) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_vec1_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_TRIVIAL_QUERIES\n\t//\tError += std::is_trivially_default_constructible<glm::vec1>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::vec1>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::vec1>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::dvec1>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::ivec1>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::uvec1>::value ? 0 : 1;\n\n\t\tError += std::is_copy_constructible<glm::vec1>::value ? 0 : 1;\n#\tendif\n\n/*\n#if GLM_HAS_INITIALIZER_LISTS\n\t{\n\t\tglm::vec1 a{ 0 };\n\t\tstd::vector<glm::vec1> v = {\n\t\t\t{0.f},\n\t\t\t{4.f},\n\t\t\t{8.f}};\n\t}\n\n\t{\n\t\tglm::dvec2 a{ 0 };\n\t\tstd::vector<glm::dvec1> v = {\n\t\t\t{0.0},\n\t\t\t{4.0},\n\t\t\t{8.0}};\n\t}\n#endif\n*/\n#if GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)\n\t{\n\t\tglm::vec2 A = glm::vec2(1.0f, 2.0f);\n\t\tglm::vec2 B = A.xy;\n\t\tglm::vec2 C(A.xy);\n\t\tglm::vec2 D(A.xy());\n\n\t\tError += glm::all(glm::equal(A, B)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, C)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, D)) ? 0 : 1;\n\t}\n#endif//GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)\n\n\t{\n\t\tglm::vec2 A = glm::vec2(2.0f);\n\t\tglm::vec2 B = glm::vec2(2.0f, 3.0f);\n\t\tglm::vec2 C = glm::vec2(2.0f, 3.0);\n\t\t//glm::vec2 D = glm::dvec2(2.0); // Build error TODO: What does the specification says?\n\t\tglm::vec2 E(glm::dvec2(2.0));\n\t\tglm::vec2 F(glm::ivec2(2));\n\t}\n\n\treturn Error;\n}\n\nint test_vec1_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::vec1) == sizeof(glm::mediump_vec1) ? 0 : 1;\n\tError += 4 == sizeof(glm::mediump_vec1) ? 0 : 1;\n\tError += sizeof(glm::dvec1) == sizeof(glm::highp_dvec1) ? 0 : 1;\n\tError += 8 == sizeof(glm::highp_dvec1) ? 0 : 1;\n\tError += glm::vec1().length() == 1 ? 0 : 1;\n\tError += glm::dvec1().length() == 1 ? 0 : 1;\n\tError += glm::vec1::length() == 1 ? 0 : 1;\n\tError += glm::dvec1::length() == 1 ? 0 : 1;\n\n#\tif GLM_HAS_CONSTEXPR_PARTIAL\n\tconstexpr std::size_t Length = glm::vec1::length();\n\tError += Length == 1 ? 0 : 1;\n#\tendif\n\n\treturn Error;\n}\n\nint test_vec1_operator_increment()\n{\n\tint Error(0);\n\n\tglm::ivec1 v0(1);\n\tglm::ivec1 v1(v0);\n\tglm::ivec1 v2(v0);\n\tglm::ivec1 v3 = ++v1;\n\tglm::ivec1 v4 = v2++;\n\n\tError += glm::all(glm::equal(v0, v4)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v2)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v3)) ? 0 : 1;\n\n\tint i0(1);\n\tint i1(i0);\n\tint i2(i0);\n\tint i3 = ++i1;\n\tint i4 = i2++;\n\n\tError += i0 == i4 ? 0 : 1;\n\tError += i1 == i2 ? 0 : 1;\n\tError += i1 == i3 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_vec1_size();\n\tError += test_vec1_ctor();\n\tError += test_vec1_operators();\n\tError += test_vec1_operator_increment();\n\t\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_vec2.cpp",
    "content": "#define GLM_FORCE_SWIZZLE\n#include <glm/gtc/epsilon.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/vec2.hpp>\n#include <vector>\n#if GLM_HAS_TRIVIAL_QUERIES\n#\tinclude <type_traits>\n#endif\n\nstatic glm::vec2 g1;\nstatic glm::vec2 g2(1);\nstatic glm::vec2 g3(1, 1);\n\nint test_vec2_operators()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::vec2 A(1.0f);\n\t\tglm::vec2 B(1.0f);\n\t\tError += A != B ? 1 : 0;\n\t\tError += A == B ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f);\n\t\tglm::vec2 C = A + 1.0f;\n\t\tA += 1.0f;\n\t\tError += glm::all(glm::epsilonEqual(A, glm::vec2(2.0f), glm::epsilon<float>())) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(A, C, glm::epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f);\n\t\tglm::vec2 B(2.0f,-1.0f);\n\t\tglm::vec2 C = A + B;\n\t\tA += B;\n\t\tError += glm::all(glm::epsilonEqual(A, glm::vec2(3.0f, 0.0f), glm::epsilon<float>())) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(A, C, glm::epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f);\n\t\tglm::vec2 C = A - 1.0f;\n\t\tA -= 1.0f;\n\t\tError += glm::all(glm::epsilonEqual(A, glm::vec2(0.0f), glm::epsilon<float>())) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(A, C, glm::epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f);\n\t\tglm::vec2 B(2.0f,-1.0f);\n\t\tglm::vec2 C = A - B;\n\t\tA -= B;\n\t\tError += glm::all(glm::epsilonEqual(A, glm::vec2(-1.0f, 2.0f), glm::epsilon<float>())) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(A, C, glm::epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f);\n\t\tglm::vec2 C = A * 2.0f;\n\t\tA *= 2.0f;\n\t\tError += glm::all(glm::epsilonEqual(A, glm::vec2(2.0f), glm::epsilon<float>())) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(A, C, glm::epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(2.0f);\n\t\tglm::vec2 B(2.0f);\n\t\tglm::vec2 C = A / B;\n\t\tA /= B;\n\t\tError += glm::all(glm::epsilonEqual(A, glm::vec2(1.0f), glm::epsilon<float>())) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(A, C, glm::epsilon<float>())) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B(4.0f, 5.0f);\n\n\t\tglm::vec2 C = A + B;\n\t\tError += C == glm::vec2(5, 7) ? 0 : 1;\n\n\t\tglm::vec2 D = B - A;\n\t\tError += D == glm::vec2(3, 3) ? 0 : 1;\n\n\t\tglm::vec2 E = A * B;\n\t\tError += E == glm::vec2(4, 10) ? 0 : 1;\n\n\t\tglm::vec2 F = B / A;\n\t\tError += F == glm::vec2(4, 2.5) ? 0 : 1;\n\n\t\tglm::vec2 G = A + 1.0f;\n\t\tError += G == glm::vec2(2, 3) ? 0 : 1;\n\n\t\tglm::vec2 H = B - 1.0f;\n\t\tError += H == glm::vec2(3, 4) ? 0 : 1;\n\n\t\tglm::vec2 I = A * 2.0f;\n\t\tError += I == glm::vec2(2, 4) ? 0 : 1;\n\n\t\tglm::vec2 J = B / 2.0f;\n\t\tError += J == glm::vec2(2, 2.5) ? 0 : 1;\n\n\t\tglm::vec2 K = 1.0f + A;\n\t\tError += K == glm::vec2(2, 3) ? 0 : 1;\n\n\t\tglm::vec2 L = 1.0f - B;\n\t\tError += L == glm::vec2(-3, -4) ? 0 : 1;\n\n\t\tglm::vec2 M = 2.0f * A;\n\t\tError += M == glm::vec2(2, 4) ? 0 : 1;\n\n\t\tglm::vec2 N = 2.0f / B;\n\t\tError += N == glm::vec2(0.5, 2.0 / 5.0) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B(4.0f, 5.0f);\n\n\t\tA += B;\n\t\tError += A == glm::vec2(5, 7) ? 0 : 1;\n\n\t\tA += 1.0f;\n\t\tError += A == glm::vec2(6, 8) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B(4.0f, 5.0f);\n\n\t\tB -= A;\n\t\tError += B == glm::vec2(3, 3) ? 0 : 1;\n\n\t\tB -= 1.0f;\n\t\tError += B == glm::vec2(2, 2) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B(4.0f, 5.0f);\n\n\t\tA *= B;\n\t\tError += A == glm::vec2(4, 10) ? 0 : 1;\n\n\t\tA *= 2.0f;\n\t\tError += A == glm::vec2(8, 20) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B(4.0f, 5.0f);\n\n\t\tB /= A;\n\t\tError += B == glm::vec2(4, 2.5) ? 0 : 1;\n\n\t\tB /= 2.0f;\n\t\tError += B == glm::vec2(2, 1.25) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec2 B(2.0f);\n\n\t\tB /= B.y;\n\t\tError += B == glm::vec2(1.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B = -A;\n\t\tError += B == glm::vec2(-1.0f, -2.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B = --A;\n\t\tError += B == glm::vec2(0.0f, 1.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B = A--;\n\t\tError += B == glm::vec2(1.0f, 2.0f) ? 0 : 1;\n\t\tError += A == glm::vec2(0.0f, 1.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B = ++A;\n\t\tError += B == glm::vec2(2.0f, 3.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec2 A(1.0f, 2.0f);\n\t\tglm::vec2 B = A++;\n\t\tError += B == glm::vec2(1.0f, 2.0f) ? 0 : 1;\n\t\tError += A == glm::vec2(2.0f, 3.0f) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_vec2_ctor()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::vec2 A(1);\n\t\tglm::vec2 B(A);\n\t\tError += A == B ? 0 : 1;\n\t}\n\n#\tif GLM_HAS_TRIVIAL_QUERIES\n\t//\tError += std::is_trivially_default_constructible<glm::vec2>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::vec2>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::vec2>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::dvec2>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::ivec2>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::uvec2>::value ? 0 : 1;\n\n\t\tError += std::is_copy_constructible<glm::vec2>::value ? 0 : 1;\n#\tendif\n\n#if GLM_HAS_INITIALIZER_LISTS\n\t{\n\t\tglm::vec2 a{ 0, 1 };\n\t\tstd::vector<glm::vec2> v = {\n\t\t\t{0, 1},\n\t\t\t{4, 5},\n\t\t\t{8, 9}};\n\t}\n\n\t{\n\t\tglm::dvec2 a{ 0, 1 };\n\t\tstd::vector<glm::dvec2> v = {\n\t\t\t{0, 1},\n\t\t\t{4, 5},\n\t\t\t{8, 9}};\n\t}\n#endif\n\n#if GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)\n\t{\n\t\tglm::vec2 A = glm::vec2(1.0f, 2.0f);\n\t\tglm::vec2 B = A.xy;\n\t\tglm::vec2 C(A.xy);\n\t\tglm::vec2 D(A.xy());\n\n\t\tError += glm::all(glm::equal(A, B)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, C)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, D)) ? 0 : 1;\n\t}\n#endif//GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)\n\n\t{\n\t\tglm::vec2 A = glm::vec2(2.0f);\n\t\tglm::vec2 B = glm::vec2(2.0f, 3.0f);\n\t\tglm::vec2 C = glm::vec2(2.0f, 3.0);\n\t\t//glm::vec2 D = glm::dvec2(2.0); // Build error TODO: What does the specification says?\n\t\tglm::vec2 E(glm::dvec2(2.0));\n\t\tglm::vec2 F(glm::ivec2(2));\n\t}\n\n\treturn Error;\n}\n\nint test_vec2_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::vec2) == sizeof(glm::mediump_vec2) ? 0 : 1;\n\tError += 8 == sizeof(glm::mediump_vec2) ? 0 : 1;\n\tError += sizeof(glm::dvec2) == sizeof(glm::highp_dvec2) ? 0 : 1;\n\tError += 16 == sizeof(glm::highp_dvec2) ? 0 : 1;\n\tError += glm::vec2().length() == 2 ? 0 : 1;\n\tError += glm::dvec2().length() == 2 ? 0 : 1;\n\tError += glm::vec2::length() == 2 ? 0 : 1;\n\tError += glm::dvec2::length() == 2 ? 0 : 1;\n\n#\tif GLM_HAS_CONSTEXPR_PARTIAL\n\t\tconstexpr std::size_t Length = glm::vec2::length();\n\t\tError += Length == 2 ? 0 : 1;\n#\tendif\n\n\treturn Error;\n}\n\nint test_operator_increment()\n{\n\tint Error(0);\n\n\tglm::ivec2 v0(1);\n\tglm::ivec2 v1(v0);\n\tglm::ivec2 v2(v0);\n\tglm::ivec2 v3 = ++v1;\n\tglm::ivec2 v4 = v2++;\n\n\tError += glm::all(glm::equal(v0, v4)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v2)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v3)) ? 0 : 1;\n\n\tint i0(1);\n\tint i1(i0);\n\tint i2(i0);\n\tint i3 = ++i1;\n\tint i4 = i2++;\n\n\tError += i0 == i4 ? 0 : 1;\n\tError += i1 == i2 ? 0 : 1;\n\tError += i1 == i3 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_vec2_size();\n\tError += test_vec2_ctor();\n\tError += test_vec2_operators();\n\tError += test_operator_increment();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_vec3.cpp",
    "content": "#define GLM_FORCE_SWIZZLE\n#include <glm/vector_relational.hpp>\n#include <glm/geometric.hpp>\n#include <glm/vec2.hpp>\n#include <glm/vec3.hpp>\n#include <glm/vec4.hpp>\n#include <cstdio>\n#include <vector>\n\nstatic glm::vec3 g1;\nstatic glm::vec3 g2(1);\nstatic glm::vec3 g3(1, 1, 1);\n\nint test_vec3_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_TRIVIAL_QUERIES\n\t//\tError += std::is_trivially_default_constructible<glm::vec3>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::vec3>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::vec3>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::dvec3>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::ivec3>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::uvec3>::value ? 0 : 1;\n\n\t\tError += std::is_copy_constructible<glm::vec3>::value ? 0 : 1;\n#\tendif\n\n#if (GLM_HAS_INITIALIZER_LISTS)\n\t{\n\t\tglm::vec3 a{ 0, 1, 2 };\n\t\tstd::vector<glm::vec3> v = {\n\t\t\t{0, 1, 2},\n\t\t\t{4, 5, 6},\n\t\t\t{8, 9, 0}};\n\t}\n\n\t{\n\t\tglm::dvec3 a{ 0, 1, 2 };\n\t\tstd::vector<glm::dvec3> v = {\n\t\t\t{0, 1, 2},\n\t\t\t{4, 5, 6},\n\t\t\t{8, 9, 0}};\n\t}\n#endif\n\n#if(GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE))\n\t{\n\t\tglm::vec3 A = glm::vec3(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B = A.xyz;\n\t\tglm::vec3 C(A.xyz);\n\t\tglm::vec3 D(A.xyz());\n\t\tglm::vec3 E(A.x, A.yz);\n\t\tglm::vec3 F(A.x, A.yz());\n\t\tglm::vec3 G(A.xy, A.z);\n\t\tglm::vec3 H(A.xy(), A.z);\n\n\t\tError += glm::all(glm::equal(A, B)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, C)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, D)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, E)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, F)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, G)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, H)) ? 0 : 1;\n\t}\n#endif//(GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE))\n\n\t{\n\t\tglm::vec3 A(1);\n\t\tglm::vec3 B(1, 1, 1);\n\t\t\n\t\tError += A == B ? 0 : 1;\n\t}\n\t\n\t{\n\t\tstd::vector<glm::vec3> Tests;\n\t\tTests.push_back(glm::vec3(glm::vec2(1, 2), 3));\n\t\tTests.push_back(glm::vec3(1, glm::vec2(2, 3)));\n\t\tTests.push_back(glm::vec3(1, 2, 3));\n\t\tTests.push_back(glm::vec3(glm::vec4(1, 2, 3, 4)));\n\n\t\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t\t\tError += Tests[i] == glm::vec3(1, 2, 3) ? 0 : 1;\n\t}\n\t\t\n\treturn Error;\n}\n\nfloat foo()\n{\n\tglm::vec3 bar = glm::vec3(0.0f, 1.0f, 1.0f);\n\n\treturn glm::length(bar);\n}\n\nint test_vec3_operators()\n{\n\tint Error = 0;\n\t\n\t{\n\t\tglm::vec3 A(1.0f);\n\t\tglm::vec3 B(1.0f);\n\t\tbool R = A != B;\n\t\tbool S = A == B;\n\n\t\tError += (S && !R) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B(4.0f, 5.0f, 6.0f);\n\n\t\tglm::vec3 C = A + B;\n\t\tError += C == glm::vec3(5, 7, 9) ? 0 : 1;\n\n\t\tglm::vec3 D = B - A;\n\t\tError += D == glm::vec3(3, 3, 3) ? 0 : 1;\n\n\t\tglm::vec3 E = A * B;\n\t\tError += E == glm::vec3(4, 10, 18) ? 0 : 1;\n\n\t\tglm::vec3 F = B / A;\n\t\tError += F == glm::vec3(4, 2.5, 2) ? 0 : 1;\n\n\t\tglm::vec3 G = A + 1.0f;\n\t\tError += G == glm::vec3(2, 3, 4) ? 0 : 1;\n\n\t\tglm::vec3 H = B - 1.0f;\n\t\tError += H == glm::vec3(3, 4, 5) ? 0 : 1;\n\n\t\tglm::vec3 I = A * 2.0f;\n\t\tError += I == glm::vec3(2, 4, 6) ? 0 : 1;\n\n\t\tglm::vec3 J = B / 2.0f;\n\t\tError += J == glm::vec3(2, 2.5, 3) ? 0 : 1;\n\n\t\tglm::vec3 K = 1.0f + A;\n\t\tError += K == glm::vec3(2, 3, 4) ? 0 : 1;\n\n\t\tglm::vec3 L = 1.0f - B;\n\t\tError += L == glm::vec3(-3, -4, -5) ? 0 : 1;\n\n\t\tglm::vec3 M = 2.0f * A;\n\t\tError += M == glm::vec3(2, 4, 6) ? 0 : 1;\n\n\t\tglm::vec3 N = 2.0f / B;\n\t\tError += N == glm::vec3(0.5, 2.0 / 5.0, 2.0 / 6.0) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B(4.0f, 5.0f, 6.0f);\n\n\t\tA += B;\n\t\tError += A == glm::vec3(5, 7, 9) ? 0 : 1;\n\n\t\tA += 1.0f;\n\t\tError += A == glm::vec3(6, 8, 10) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B(4.0f, 5.0f, 6.0f);\n\n\t\tB -= A;\n\t\tError += B == glm::vec3(3, 3, 3) ? 0 : 1;\n\n\t\tB -= 1.0f;\n\t\tError += B == glm::vec3(2, 2, 2) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B(4.0f, 5.0f, 6.0f);\n\n\t\tA *= B;\n\t\tError += A == glm::vec3(4, 10, 18) ? 0 : 1;\n\n\t\tA *= 2.0f;\n\t\tError += A == glm::vec3(8, 20, 36) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B(4.0f, 5.0f, 6.0f);\n\n\t\tB /= A;\n\t\tError += B == glm::vec3(4, 2.5, 2) ? 0 : 1;\n\n\t\tB /= 2.0f;\n\t\tError += B == glm::vec3(2, 1.25, 1) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec3 B(2.0f);\n\n\t\tB /= B.y;\n\t\tError += B == glm::vec3(1.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B = -A;\n\t\tError += B == glm::vec3(-1.0f, -2.0f, -3.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B = --A;\n\t\tError += B == glm::vec3(0.0f, 1.0f, 2.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B = A--;\n\t\tError += B == glm::vec3(1.0f, 2.0f, 3.0f) ? 0 : 1;\n\t\tError += A == glm::vec3(0.0f, 1.0f, 2.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B = ++A;\n\t\tError += B == glm::vec3(2.0f, 3.0f, 4.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 A(1.0f, 2.0f, 3.0f);\n\t\tglm::vec3 B = A++;\n\t\tError += B == glm::vec3(1.0f, 2.0f, 3.0f) ? 0 : 1;\n\t\tError += A == glm::vec3(2.0f, 3.0f, 4.0f) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_vec3_size()\n{\n\tint Error = 0;\n\t\n\tError += sizeof(glm::vec3) == sizeof(glm::lowp_vec3) ? 0 : 1;\n\tError += sizeof(glm::vec3) == sizeof(glm::mediump_vec3) ? 0 : 1;\n\tError += sizeof(glm::vec3) == sizeof(glm::highp_vec3) ? 0 : 1;\n\tError += 12 == sizeof(glm::mediump_vec3) ? 0 : 1;\n\tError += sizeof(glm::dvec3) == sizeof(glm::lowp_dvec3) ? 0 : 1;\n\tError += sizeof(glm::dvec3) == sizeof(glm::mediump_dvec3) ? 0 : 1;\n\tError += sizeof(glm::dvec3) == sizeof(glm::highp_dvec3) ? 0 : 1;\n\tError += 24 == sizeof(glm::highp_dvec3) ? 0 : 1;\n\tError += glm::vec3().length() == 3 ? 0 : 1;\n\tError += glm::dvec3().length() == 3 ? 0 : 1;\n\tError += glm::vec3::length() == 3 ? 0 : 1;\n\tError += glm::dvec3::length() == 3 ? 0 : 1;\n\n#\tif GLM_HAS_CONSTEXPR_PARTIAL\n\tconstexpr std::size_t Length = glm::vec3::length();\n\tError += Length == 3 ? 0 : 1;\n#\tendif\n\n\treturn Error;\n}\n\nint test_vec3_swizzle3_2()\n{\n\tint Error = 0;\n\n#\tif(GLM_LANG & GLM_LANG_CXXMS_FLAG)\n\n\t\tglm::vec3 v(1, 2, 3);\n\t\tglm::vec2 u;\n\n\t\t// Can not assign a vec3 swizzle to a vec2\n\t\t//u = v.xyz;    //Illegal\n\t\t//u = v.rgb;    //Illegal\n\t\t//u = v.stp;    //Illegal\n\n\t\tu = v.xx;       Error += (u.x == 1.0f && u.y == 1.0f) ? 0 : 1;\n\t\tu = v.xy;       Error += (u.x == 1.0f && u.y == 2.0f) ? 0 : 1;\n\t\tu = v.xz;       Error += (u.x == 1.0f && u.y == 3.0f) ? 0 : 1;\n\t\tu = v.yx;       Error += (u.x == 2.0f && u.y == 1.0f) ? 0 : 1;\n\t\tu = v.yy;       Error += (u.x == 2.0f && u.y == 2.0f) ? 0 : 1;\n\t\tu = v.yz;       Error += (u.x == 2.0f && u.y == 3.0f) ? 0 : 1;\n\t\tu = v.zx;       Error += (u.x == 3.0f && u.y == 1.0f) ? 0 : 1;\n\t\tu = v.zy;       Error += (u.x == 3.0f && u.y == 2.0f) ? 0 : 1;\n\t\tu = v.zz;       Error += (u.x == 3.0f && u.y == 3.0f) ? 0 : 1;\n\n\t\tu = v.rr;       Error += (u.r == 1.0f && u.g == 1.0f) ? 0 : 1;\n\t\tu = v.rg;       Error += (u.r == 1.0f && u.g == 2.0f) ? 0 : 1;\n\t\tu = v.rb;       Error += (u.r == 1.0f && u.g == 3.0f) ? 0 : 1;\n\t\tu = v.gr;       Error += (u.r == 2.0f && u.g == 1.0f) ? 0 : 1;\n\t\tu = v.gg;       Error += (u.r == 2.0f && u.g == 2.0f) ? 0 : 1;\n\t\tu = v.gb;       Error += (u.r == 2.0f && u.g == 3.0f) ? 0 : 1;\n\t\tu = v.br;       Error += (u.r == 3.0f && u.g == 1.0f) ? 0 : 1;\n\t\tu = v.bg;       Error += (u.r == 3.0f && u.g == 2.0f) ? 0 : 1;\n\t\tu = v.bb;       Error += (u.r == 3.0f && u.g == 3.0f) ? 0 : 1;\n\n\t\tu = v.ss;       Error += (u.s == 1.0f && u.t == 1.0f) ? 0 : 1;\n\t\tu = v.st;       Error += (u.s == 1.0f && u.t == 2.0f) ? 0 : 1;\n\t\tu = v.sp;       Error += (u.s == 1.0f && u.t == 3.0f) ? 0 : 1;\n\t\tu = v.ts;       Error += (u.s == 2.0f && u.t == 1.0f) ? 0 : 1;\n\t\tu = v.tt;       Error += (u.s == 2.0f && u.t == 2.0f) ? 0 : 1;\n\t\tu = v.tp;       Error += (u.s == 2.0f && u.t == 3.0f) ? 0 : 1;\n\t\tu = v.ps;       Error += (u.s == 3.0f && u.t == 1.0f) ? 0 : 1;\n\t\tu = v.pt;       Error += (u.s == 3.0f && u.t == 2.0f) ? 0 : 1;\n\t\tu = v.pp;       Error += (u.s == 3.0f && u.t == 3.0f) ? 0 : 1;\n\t\t// Mixed member aliases are not valid\n\t\t//u = v.rx;     //Illegal\n\t\t//u = v.sy;     //Illegal\n\n\t\tu = glm::vec2(1, 2);\n\t\tv = glm::vec3(1, 2, 3);\n\t\t//v.xx = u;     //Illegal\n\t\tv.xy = u;       Error += (v.x == 1.0f && v.y == 2.0f && v.z == 3.0f) ? 0 : 1;\n\t\tv.xz = u;       Error += (v.x == 1.0f && v.y == 2.0f && v.z == 2.0f) ? 0 : 1;\n\t\tv.yx = u;       Error += (v.x == 2.0f && v.y == 1.0f && v.z == 2.0f) ? 0 : 1;\n\t\t//v.yy = u;     //Illegal\n\t\tv.yz = u;       Error += (v.x == 2.0f && v.y == 1.0f && v.z == 2.0f) ? 0 : 1;\n\t\tv.zx = u;       Error += (v.x == 2.0f && v.y == 1.0f && v.z == 1.0f) ? 0 : 1;\n\t\tv.zy = u;       Error += (v.x == 2.0f && v.y == 2.0f && v.z == 1.0f) ? 0 : 1;\n\t\t//v.zz = u;     //Illegal\n\n#\tendif//GLM_LANG\n\n\treturn Error;\n}\n\nint test_vec3_swizzle3_3()\n{\n\tint Error = 0;\n\n#\tif(GLM_LANG & GLM_LANG_CXXMS_FLAG)\n\tglm::vec3 v(1, 2, 3);\n\tglm::vec3 u;\n\n\t\tu = v;          Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1;\n\n\t\tu = v.xyz;      Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1;\n\t\tu = v.zyx;      Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1;\n\t\tu.zyx = v;      Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1;\n\n\t\tu = v.rgb;      Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1;\n\t\tu = v.bgr;      Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1;\n\t\tu.bgr = v;      Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1;\n\n\t\tu = v.stp;      Error += (u.x == 1.0f && u.y == 2.0f && u.z == 3.0f) ? 0 : 1;\n\t\tu = v.pts;      Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1;\n\t\tu.pts = v;      Error += (u.x == 3.0f && u.y == 2.0f && u.z == 1.0f) ? 0 : 1;\n#\tendif//GLM_LANG\n\n\treturn Error;\n}\n\n#if !GLM_HAS_ONLY_XYZW\nint test_vec3_swizzle_operators()\n{\n\tint Error = 0;\n\n\tglm::vec3 u = glm::vec3(1, 2, 3);\n\tglm::vec3 v = glm::vec3(10, 20, 30);\n\n#\tif(GLM_LANG & GLM_LANG_CXXMS_FLAG)\n\t\tglm::vec3 q;\n\n\t\t// Swizzle, swizzle binary operators\n\t\tq = u.xyz + v.xyz;          Error += (q == (u + v)) ? 0 : 1;\n\t\tq = (u.zyx + v.zyx).zyx;    Error += (q == (u + v)) ? 0 : 1;\n\t\tq = (u.xyz - v.xyz);        Error += (q == (u - v)) ? 0 : 1;\n\t\tq = (u.xyz * v.xyz);        Error += (q == (u * v)) ? 0 : 1;\n\t\tq = (u.xxx * v.xxx);        Error += (q == glm::vec3(u.x * v.x)) ? 0 : 1;\n\t\tq = (u.xyz / v.xyz);        Error += (q == (u / v)) ? 0 : 1;\n\n\t\t// vec, swizzle binary operators\n\t\tq = u + v.xyz;              Error += (q == (u + v)) ? 0 : 1;\n\t\tq = (u - v.xyz);            Error += (q == (u - v)) ? 0 : 1;\n\t\tq = (u * v.xyz);            Error += (q == (u * v)) ? 0 : 1;\n\t\tq = (u * v.xxx);            Error += (q == v.x * u) ? 0 : 1;\n\t\tq = (u / v.xyz);            Error += (q == (u / v)) ? 0 : 1;\n\n\t\t// swizzle,vec binary operators\n\t\tq = u.xyz + v;              Error += (q == (u + v)) ? 0 : 1;\n\t\tq = (u.xyz - v);            Error += (q == (u - v)) ? 0 : 1;\n\t\tq = (u.xyz * v);            Error += (q == (u * v)) ? 0 : 1;\n\t\tq = (u.xxx * v);            Error += (q == u.x * v) ? 0 : 1;\n\t\tq = (u.xyz / v);            Error += (q == (u / v)) ? 0 : 1;\n#\tendif//GLM_LANG\n\n\t// Compile errors\n\t//q = (u.yz * v.xyz);\n\t//q = (u * v.xy);\n\n\treturn Error;\n}\n\nint test_vec3_swizzle_functions()\n{\n\tint Error = 0;\n\n\t// NOTE: template functions cannot pick up the implicit conversion from\n\t// a swizzle to the unswizzled type, therefore the operator() must be \n\t// used.  E.g.:\n\t//\n\t// glm::dot(u.xy, v.xy);        <--- Compile error\n\t// glm::dot(u.xy(), v.xy());    <--- Compiles correctly\n\n\tfloat r;\n\n\t// vec2\n\tglm::vec2 a(1, 2);\n\tglm::vec2 b(10, 20);\n\tr = glm::dot(a, b);                 Error += (int(r) == 50) ? 0 : 1;\n\tr = glm::dot(glm::vec2(a.xy()), glm::vec2(b.xy()));       Error += (int(r) == 50) ? 0 : 1;\n\tr = glm::dot(glm::vec2(a.xy()), glm::vec2(b.yy()));       Error += (int(r) == 60) ? 0 : 1;\n\n\t// vec3\n\tglm::vec3 u = glm::vec3(1, 2, 3);\n\tglm::vec3 v = glm::vec3(10, 20, 30);\n\tr = glm::dot(u, v);                 Error += (int(r) == 140) ? 0 : 1;\n\tr = glm::dot(u.xyz(), v.zyz());     Error += (int(r) == 160) ? 0 : 1;\n\tr = glm::dot(u, v.zyx());           Error += (int(r) == 100) ? 0 : 1;\n\tr = glm::dot(u.xyz(), v);           Error += (int(r) == 140) ? 0 : 1;\n\tr = glm::dot(u.xy(), v.xy());       Error += (int(r) == 50) ? 0 : 1;\n\n\t// vec4\n\tglm::vec4 s = glm::vec4(1, 2, 3, 4);\n\tglm::vec4 t = glm::vec4(10, 20, 30, 40);\n\tr = glm::dot(s, t);                 Error += (int(r) == 300) ? 0 : 1;\n\tr = glm::dot(s.xyzw(), t.xyzw());   Error += (int(r) == 300) ? 0 : 1;\n\tr = glm::dot(s.xyz(), t.xyz());     Error += (int(r) == 140) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_vec3_swizzle_partial()\n{\n\tint Error = 0;\n\n\tglm::vec3 A(1, 2, 3);\n\n#\tif(GLM_LANG & GLM_LANG_CXXMS_FLAG)\n\t{\n\t\tglm::vec3 B(A.xy, 3.0f);\n\t\tError += A == B ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 B(1.0f, A.yz);\n\t\tError += A == B ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec3 B(A.xyz);\n\t\tError += A == B ? 0 : 1;\n\t}\n#\tendif//GLM_LANG\n\n\treturn Error;\n}\n#endif//!GLM_HAS_ONLY_XYZW\n\nint test_operator_increment()\n{\n\tint Error(0);\n\n\tglm::ivec3 v0(1);\n\tglm::ivec3 v1(v0);\n\tglm::ivec3 v2(v0);\n\tglm::ivec3 v3 = ++v1;\n\tglm::ivec3 v4 = v2++;\n\n\tError += glm::all(glm::equal(v0, v4)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v2)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v3)) ? 0 : 1;\n\n\tint i0(1);\n\tint i1(i0);\n\tint i2(i0);\n\tint i3 = ++i1;\n\tint i4 = i2++;\n\n\tError += i0 == i4 ? 0 : 1;\n\tError += i1 == i2 ? 0 : 1;\n\tError += i1 == i3 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_vec3_ctor();\n\tError += test_vec3_operators();\n\tError += test_vec3_size();\n\tError += test_vec3_swizzle3_2();\n\tError += test_vec3_swizzle3_3();\n\tError += test_operator_increment();\n\n#\tif !GLM_HAS_ONLY_XYZW\n\t\tError += test_vec3_swizzle_partial();\n\t\tError += test_vec3_swizzle_operators();\n\t\tError += test_vec3_swizzle_functions();\n#\tendif//!GLM_HAS_ONLY_XYZW\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/core/core_type_vec4.cpp",
    "content": "#define GLM_FORCE_ALIGNED\n#define GLM_FORCE_SWIZZLE\n#include <glm/gtc/epsilon.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/vec2.hpp>\n#include <glm/vec3.hpp>\n#include <glm/vec4.hpp>\n#include <cstdio>\n#include <ctime>\n#include <vector>\n\nstatic glm::vec4 g1;\nstatic glm::vec4 g2(1);\nstatic glm::vec4 g3(1, 1, 1, 1);\n\ntemplate <int Value>\nstruct mask\n{\n\tenum{value = Value};\n};\n\nenum comp\n{\n\tX,\n\tY,\n\tZ,\n\tW\n};\n\n//template<comp X, comp Y, comp Z, comp W>\n//__m128 swizzle(glm::vec4 const& v)\n//{\n//\t__m128 Src = _mm_set_ps(v.w, v.z, v.y, v.x);\n//\treturn _mm_shuffle_ps(Src, Src, mask<(int(W) << 6) | (int(Z) << 4) | (int(Y) << 2) | (int(X) << 0)>::value);\n//}\n\nstatic int test_vec4_ctor()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::ivec4 A(1, 2, 3, 4);\n\t\tglm::ivec4 B(A);\n\t\tError += glm::all(glm::equal(A, B)) ? 0 : 1;\n\t}\n\n#\tif GLM_HAS_TRIVIAL_QUERIES\n\t//\tError += std::is_trivially_default_constructible<glm::vec4>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::vec4>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::vec4>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::dvec4>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::ivec4>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::uvec4>::value ? 0 : 1;\n\n\t\tError += std::is_copy_constructible<glm::vec4>::value ? 0 : 1;\n#\tendif\n\n#if GLM_HAS_INITIALIZER_LISTS\n\t{\n\t\tglm::vec4 a{ 0, 1, 2, 3 };\n\t\tstd::vector<glm::vec4> v = {\n\t\t\t{0, 1, 2, 3},\n\t\t\t{4, 5, 6, 7},\n\t\t\t{8, 9, 0, 1}};\n\t}\n\n\t{\n\t\tglm::dvec4 a{ 0, 1, 2, 3 };\n\t\tstd::vector<glm::dvec4> v = {\n\t\t\t{0, 1, 2, 3},\n\t\t\t{4, 5, 6, 7},\n\t\t\t{8, 9, 0, 1}};\n\t}\n#endif\n\n#if GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)\n\t{\n\t\tglm::vec4 A = glm::vec4(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = A.xyzw;\n\t\tglm::vec4 C(A.xyzw);\n\t\tglm::vec4 D(A.xyzw());\n\t\tglm::vec4 E(A.x, A.yzw);\n\t\tglm::vec4 F(A.x, A.yzw());\n\t\tglm::vec4 G(A.xyz, A.w);\n\t\tglm::vec4 H(A.xyz(), A.w);\n\t\tglm::vec4 I(A.xy, A.zw);\n\t\tglm::vec4 J(A.xy(), A.zw());\n\t\tglm::vec4 K(A.x, A.y, A.zw);\n\t\tglm::vec4 L(A.x, A.yz, A.w);\n\t\tglm::vec4 M(A.xy, A.z, A.w);\n\n\t\tError += glm::all(glm::equal(A, B)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, C)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, D)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, E)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, F)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, G)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, H)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, I)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, J)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, K)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, L)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(A, M)) ? 0 : 1;\n\t}\n#endif// GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)\n\n#\tif GLM_HAS_CONSTEXPR && GLM_ARCH == GLM_ARCH_PURE && !(GLM_COMPILER & GLM_COMPILER_VC) // Visual Studio bug?\n\t{\n\t\tconstexpr glm::ivec4 v(1);\n\n\t\tError += v.x == 1 ? 0 : 1;\n\t\tError += v.y == 1 ? 0 : 1;\n\t\tError += v.z == 1 ? 0 : 1;\n\t\tError += v.w == 1 ? 0 : 1;\n\t}\n#\tendif\n\n\t{\n\t\tglm::vec4 A(1);\n\t\tglm::vec4 B(1, 1, 1, 1);\n\t\t\n\t\tError += A == B ? 0 : 1;\n\t}\n\t\n\t{\n\t\tstd::vector<glm::vec4> Tests;\n\t\tTests.push_back(glm::vec4(glm::vec2(1, 2), 3, 4));\n\t\tTests.push_back(glm::vec4(1, glm::vec2(2, 3), 4));\n\t\tTests.push_back(glm::vec4(1, 2, glm::vec2(3, 4)));\n\t\tTests.push_back(glm::vec4(glm::vec3(1, 2, 3), 4));\n\t\tTests.push_back(glm::vec4(1, glm::vec3(2, 3, 4)));\n\t\tTests.push_back(glm::vec4(glm::vec2(1, 2), glm::vec2(3, 4)));\n\t\tTests.push_back(glm::vec4(1, 2, 3, 4));\n\t\tTests.push_back(glm::vec4(glm::vec4(1, 2, 3, 4)));\n\t\t\n\t\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t\t\tError += Tests[i] == glm::vec4(1, 2, 3, 4) ? 0 : 1;\n\t}\n\t\n\treturn Error;\n}\n\nstatic int test_bvec4_ctor()\n{\n\tint Error = 0;\n\n\tglm::bvec4 const A(true);\n\tglm::bvec4 const B(true);\n\tglm::bvec4 const C(false);\n\tglm::bvec4 const D = A && B;\n\tglm::bvec4 const E = A && C;\n\tglm::bvec4 const F = A || C;\n\n\tError += D == glm::bvec4(true) ? 0 : 1;\n\tError += E == glm::bvec4(false) ? 0 : 1;\n\tError += F == glm::bvec4(true) ? 0 : 1;\n\n\tbool const G = A == C;\n\tbool const H = A != C;\n\tError += !G ? 0 : 1;\n\tError += H ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_vec4_operators()\n{\n\tint Error = 0;\n\t\n\t{\n\t\tglm::vec4 A(1.0f);\n\t\tglm::vec4 B(1.0f);\n\t\tbool R = A != B;\n\t\tbool S = A == B;\n\n\t\tError += (S && !R) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tglm::vec4 C = A + B;\n\t\tError += C == glm::vec4(5, 7, 9, 11) ? 0 : 1;\n\n\t\tglm::vec4 D = B - A;\n\t\tError += D == glm::vec4(3, 3, 3, 3) ? 0 : 1;\n\n\t\tglm::vec4 E = A * B;\n\t\tError += E == glm::vec4(4, 10, 18, 28) ? 0 : 1;\n\n\t\tglm::vec4 F = B / A;\n\t\tError += F == glm::vec4(4, 2.5, 2, 7.0f / 4.0f) ? 0 : 1;\n\n\t\tglm::vec4 G = A + 1.0f;\n\t\tError += G == glm::vec4(2, 3, 4, 5) ? 0 : 1;\n\n\t\tglm::vec4 H = B - 1.0f;\n\t\tError += H == glm::vec4(3, 4, 5, 6) ? 0 : 1;\n\n\t\tglm::vec4 I = A * 2.0f;\n\t\tError += I == glm::vec4(2, 4, 6, 8) ? 0 : 1;\n\n\t\tglm::vec4 J = B / 2.0f;\n\t\tError += J == glm::vec4(2, 2.5, 3, 3.5) ? 0 : 1;\n\n\t\tglm::vec4 K = 1.0f + A;\n\t\tError += K == glm::vec4(2, 3, 4, 5) ? 0 : 1;\n\n\t\tglm::vec4 L = 1.0f - B;\n\t\tError += L == glm::vec4(-3, -4, -5, -6) ? 0 : 1;\n\n\t\tglm::vec4 M = 2.0f * A;\n\t\tError += M == glm::vec4(2, 4, 6, 8) ? 0 : 1;\n\n\t\tglm::vec4 N = 2.0f / B;\n\t\tError += N == glm::vec4(0.5, 2.0 / 5.0, 2.0 / 6.0, 2.0 / 7.0) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tA += B;\n\t\tError += A == glm::vec4(5, 7, 9, 11) ? 0 : 1;\n\n\t\tA += 1.0f;\n\t\tError += A == glm::vec4(6, 8, 10, 12) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tB -= A;\n\t\tError += B == glm::vec4(3, 3, 3, 3) ? 0 : 1;\n\n\t\tB -= 1.0f;\n\t\tError += B == glm::vec4(2, 2, 2, 2) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tA *= B;\n\t\tError += A == glm::vec4(4, 10, 18, 28) ? 0 : 1;\n\n\t\tA *= 2.0f;\n\t\tError += A == glm::vec4(8, 20, 36, 56) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);\n\n\t\tB /= A;\n\t\tError += B == glm::vec4(4, 2.5, 2, 7.0f / 4.0f) ? 0 : 1;\n\n\t\tB /= 2.0f;\n\t\tError += B == glm::vec4(2, 1.25, 1, 7.0f / 4.0f / 2.0f) ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(2.0f);\n\n\t\tB /= B.y;\n\t\tError += B == glm::vec4(1.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = -A;\n\t\tError += B == glm::vec4(-1.0f, -2.0f, -3.0f, -4.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = --A;\n\t\tError += B == glm::vec4(0.0f, 1.0f, 2.0f, 3.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = A--;\n\t\tError += B == glm::vec4(1.0f, 2.0f, 3.0f, 4.0f) ? 0 : 1;\n\t\tError += A == glm::vec4(0.0f, 1.0f, 2.0f, 3.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = ++A;\n\t\tError += B == glm::vec4(2.0f, 3.0f, 4.0f, 5.0f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\t\tglm::vec4 B = A++;\n\t\tError += B == glm::vec4(1.0f, 2.0f, 3.0f, 4.0f) ? 0 : 1;\n\t\tError += A == glm::vec4(2.0f, 3.0f, 4.0f, 5.0f) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nstatic int test_vec4_equal()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::vec4 const A(1, 2, 3, 4);\n\t\tglm::vec4 const B(1, 2, 3, 4);\n\t\tError += A == B ? 0 : 1;\n\t\tError += A != B ? 1 : 0;\n\t}\n\n\t{\n\t\tglm::ivec4 const A(1, 2, 3, 4);\n\t\tglm::ivec4 const B(1, 2, 3, 4);\n\t\tError += A == B ? 0 : 1;\n\t\tError += A != B ? 1 : 0;\n\t}\n\n\treturn Error;\n}\n\nstatic int test_vec4_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::vec4) == sizeof(glm::lowp_vec4) ? 0 : 1;\n\tError += sizeof(glm::vec4) == sizeof(glm::mediump_vec4) ? 0 : 1;\n\tError += sizeof(glm::vec4) == sizeof(glm::highp_vec4) ? 0 : 1;\n\tError += 16 == sizeof(glm::mediump_vec4) ? 0 : 1;\n\tError += sizeof(glm::dvec4) == sizeof(glm::lowp_dvec4) ? 0 : 1;\n\tError += sizeof(glm::dvec4) == sizeof(glm::mediump_dvec4) ? 0 : 1;\n\tError += sizeof(glm::dvec4) == sizeof(glm::highp_dvec4) ? 0 : 1;\n\tError += 32 == sizeof(glm::highp_dvec4) ? 0 : 1;\n\tError += glm::vec4().length() == 4 ? 0 : 1;\n\tError += glm::dvec4().length() == 4 ? 0 : 1;\n\tError += glm::vec4::length() == 4 ? 0 : 1;\n\tError += glm::dvec4::length() == 4 ? 0 : 1;\n\n#\tif GLM_HAS_CONSTEXPR_PARTIAL\n\tconstexpr std::size_t Length = glm::vec4::length();\n\tError += Length == 4 ? 0 : 1;\n#\tendif\n\n\treturn Error;\n}\n\nstatic int test_vec4_swizzle_partial()\n{\n\tint Error = 0;\n\n\tglm::vec4 A(1, 2, 3, 4);\n\n#\tif GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_SWIZZLE_RELAX)\n\t{\n\t\tglm::vec4 B(A.xy, A.zw);\n\t\tError += A == B ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(A.xy, 3.0f, 4.0f);\n\t\tError += A == B ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(1.0f, A.yz, 4.0f);\n\t\tError += A == B ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(1.0f, 2.0f, A.zw);\n\t\tError += A == B ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::vec4 B(A.xyz, 4.0f);\n\t\tError += A == B ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 B(1.0f, A.yzw);\n\t\tError += A == B ? 0 : 1;\n\t}\n#\tendif\n\n\treturn Error;\n}\n\nstatic int test_operator_increment()\n{\n\tint Error(0);\n\n\tglm::ivec4 v0(1);\n\tglm::ivec4 v1(v0);\n\tglm::ivec4 v2(v0);\n\tglm::ivec4 v3 = ++v1;\n\tglm::ivec4 v4 = v2++;\n\n\tError += glm::all(glm::equal(v0, v4)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v2)) ? 0 : 1;\n\tError += glm::all(glm::equal(v1, v3)) ? 0 : 1;\n\n\tint i0(1);\n\tint i1(i0);\n\tint i2(i0);\n\tint i3 = ++i1;\n\tint i4 = i2++;\n\n\tError += i0 == i4 ? 0 : 1;\n\tError += i1 == i2 ? 0 : 1;\n\tError += i1 == i3 ? 0 : 1;\n\n\treturn Error;\n}\n\nstruct AoS\n{\n\tglm::vec4 A;\n\tglm::vec3 B;\n\tglm::vec3 C;\n\tglm::vec2 D;\n};\n\nstatic int test_vec4_perf_AoS(std::size_t Size)\n{\n\tint Error(0);\n\n\tstd::vector<AoS> In;\n\tstd::vector<AoS> Out;\n\tIn.resize(Size);\n\tOut.resize(Size);\n\n\tstd::clock_t StartTime = std::clock();\n\n\tfor(std::size_t i = 0; i < In.size(); ++i)\n\t\tOut[i] = In[i];\n\n\tstd::clock_t EndTime = std::clock();\n\n\tstd::printf(\"AoS: %ld\\n\", EndTime - StartTime);\n\n\treturn Error;\n}\n\nstatic int test_vec4_perf_SoA(std::size_t Size)\n{\n\tint Error(0);\n\n\tstd::vector<glm::vec4> InA;\n\tstd::vector<glm::vec3> InB;\n\tstd::vector<glm::vec3> InC;\n\tstd::vector<glm::vec2> InD;\n\tstd::vector<glm::vec4> OutA;\n\tstd::vector<glm::vec3> OutB;\n\tstd::vector<glm::vec3> OutC;\n\tstd::vector<glm::vec2> OutD;\n\n\tInA.resize(Size);\n\tInB.resize(Size);\n\tInC.resize(Size);\n\tInD.resize(Size);\n\tOutA.resize(Size);\n\tOutB.resize(Size);\n\tOutC.resize(Size);\n\tOutD.resize(Size);\n\n\tstd::clock_t StartTime = std::clock();\n\n\tfor(std::size_t i = 0; i < InA.size(); ++i)\n\t{\n\t\tOutA[i] = InA[i];\n\t\tOutB[i] = InB[i];\n\t\tOutC[i] = InC[i];\n\t\tOutD[i] = InD[i];\n\t}\n\n\tstd::clock_t EndTime = std::clock();\n\n\tstd::printf(\"SoA: %ld\\n\", EndTime - StartTime);\n\n\treturn Error;\n}\n\nnamespace heap\n{\n\tstruct A\n\t{\n\t\tfloat f;\n\t};\n\n\tstruct B : public A\n\t{\n\t\tfloat g;\n\t\tglm::vec4 v;\n\t};\n\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tA* p = new B;\n\t\tp->f = 0.0f;\n\t\tdelete p;\n\n\t\tError += sizeof(B) == sizeof(glm::vec4) + sizeof(float) * 2 ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace heap\n\nstatic int test_vec4_simd()\n{\n\tint Error = 0;\n\n\tglm::vec4 const a(std::clock(), std::clock(), std::clock(), std::clock());\n\tglm::vec4 const b(std::clock(), std::clock(), std::clock(), std::clock());\n\n\tglm::vec4 const c(b * a);\n\tglm::vec4 const d(a + c);\n\n\tError += glm::all(glm::greaterThanEqual(d, glm::vec4(0))) ? 0 : 1;\n\n\treturn Error;\n}\n\nstatic int test_inheritance()\n{\n\tstruct my_vec4 : public glm::vec4\n\t{\n\t\tmy_vec4()\n\t\t\t: glm::vec4(76.f, 75.f, 74.f, 73.f)\n\t\t\t, data(82)\n\t\t{}\n\n\t\tint data;\n\t};\n\n\tint Error = 0;\n\n\tmy_vec4 v;\n\n\tError += v.data == 82 ? 0 : 1;\n\tError += glm::epsilonEqual(v.x, 76.f, glm::epsilon<float>()) ? 0 : 1;\n\tError += glm::epsilonEqual(v.y, 75.f, glm::epsilon<float>()) ? 0 : 1;\n\tError += glm::epsilonEqual(v.z, 74.f, glm::epsilon<float>()) ? 0 : 1;\n\tError += glm::epsilonEqual(v.w, 73.f, glm::epsilon<float>()) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n/*\n\t{\n\t\tglm::ivec4 const a1(2);\n\t\tglm::ivec4 const b1 = a1 >> 1;\n\n\t\t__m128i const e1 = _mm_set1_epi32(2);\n\t\t__m128i const f1 = _mm_srli_epi32(e1, 1);\n\n\t\tglm::ivec4 const g1 = *reinterpret_cast<glm::ivec4 const* const>(&f1);\n\n\t\tglm::ivec4 const a2(-2);\n\t\tglm::ivec4 const b2 = a2 >> 1;\n\n\t\t__m128i const e2 = _mm_set1_epi32(-1);\n\t\t__m128i const f2 = _mm_srli_epi32(e2, 1);\n\n\t\tglm::ivec4 const g2 = *reinterpret_cast<glm::ivec4 const* const>(&f2);\n\n\t\tprintf(\"GNI\\n\");\n\t}\n\n\t{\n\t\tglm::uvec4 const a1(2);\n\t\tglm::uvec4 const b1 = a1 >> 1u;\n\n\t\t__m128i const e1 = _mm_set1_epi32(2);\n\t\t__m128i const f1 = _mm_srli_epi32(e1, 1);\n\n\t\tglm::uvec4 const g1 = *reinterpret_cast<glm::uvec4 const* const>(&f1);\n\n\t\tglm::uvec4 const a2(-1);\n\t\tglm::uvec4 const b2 = a2 >> 1u;\n\n\t\t__m128i const e2 = _mm_set1_epi32(-1);\n\t\t__m128i const f2 = _mm_srli_epi32(e2, 1);\n\n\t\tglm::uvec4 const g2 = *reinterpret_cast<glm::uvec4 const* const>(&f2);\n\n\t\tprintf(\"GNI\\n\");\n\t}\n*/\n\n#\tifdef NDEBUG\n\tstd::size_t const Size(1000000);\n#\telse\n\tstd::size_t const Size(1);\n#\tendif//NDEBUG\n\n\tError += test_vec4_perf_AoS(Size);\n\tError += test_vec4_perf_SoA(Size);\n\n\tError += test_vec4_ctor();\n\tError += test_bvec4_ctor();\n\tError += test_vec4_size();\n\tError += test_vec4_operators();\n\tError += test_vec4_equal();\n\tError += test_vec4_swizzle_partial();\n\tError += test_vec4_simd();\n\tError += test_operator_increment();\n\tError += heap::test();\n\tError += test_inheritance();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/ext/CMakeLists.txt",
    "content": "glmCreateTestGTC(ext_vec1)\nglmCreateTestGTC(ext_vector_relational)\n"
  },
  {
    "path": "external/glm/test/ext/ext_vec1.cpp",
    "content": "#include <glm/ext/vec1.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/ext/ext_vector_relational.cpp",
    "content": "#include <glm/ext/vector_relational.hpp>\n#include <glm/vec2.hpp>\n\nint test_equal()\n{\n\tint Error = 0;\n\n\tError += glm::equal(1.01f, 1.02f, 0.1f) ? 0 : 1;\n\tError += glm::all(glm::equal(glm::vec2(1.01f), glm::vec2(1.02f), 0.1f)) ? 0 : 1;\n\tError += glm::all(glm::equal(glm::vec2(1.01f), glm::vec2(1.02f), glm::vec2(0.1f))) ? 0 : 1;\n\n\tError += !glm::equal(1.01f, 1.02f, 0.001f) ? 0 : 1;\n\tError += !glm::any(glm::equal(glm::vec2(1.01f), glm::vec2(1.02f), 0.001f)) ? 0 : 1;\n\tError += !glm::any(glm::equal(glm::vec2(1.01f), glm::vec2(1.02f), glm::vec2(0.001f))) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_notEqual()\n{\n\tint Error = 0;\n\n\tError += glm::notEqual(1.01f, 1.02f, 0.001f) ? 0 : 1;\n\tError += glm::all(glm::notEqual(glm::vec2(1.01f), glm::vec2(1.02f), 0.001f)) ? 0 : 1;\n\tError += glm::all(glm::notEqual(glm::vec2(1.01f), glm::vec2(1.02f), glm::vec2(0.001f))) ? 0 : 1;\n\n\tError += !glm::notEqual(1.01f, 1.02f, 0.1f) ? 0 : 1;\n\tError += !glm::any(glm::notEqual(glm::vec2(1.01f), glm::vec2(1.02f), 0.1f)) ? 0 : 1;\n\tError += !glm::any(glm::notEqual(glm::vec2(1.01f), glm::vec2(1.02f), glm::vec2(0.1f))) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_openBounded()\n{\n\tint Error = 0;\n\n\tError += glm::all(glm::openBounded(glm::ivec2(2), glm::ivec2(1), glm::ivec2(3))) ? 0 : 1;\n\tError += !glm::all(glm::openBounded(glm::ivec2(1), glm::ivec2(1), glm::ivec2(3))) ? 0 : 1;\n\tError += !glm::all(glm::openBounded(glm::ivec2(3), glm::ivec2(1), glm::ivec2(3))) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_closeBounded()\n{\n\tint Error = 0;\n\n\tError += glm::all(glm::closeBounded(glm::ivec2(2), glm::ivec2(1), glm::ivec2(3))) ? 0 : 1;\n\tError += glm::all(glm::closeBounded(glm::ivec2(1), glm::ivec2(1), glm::ivec2(3))) ? 0 : 1;\n\tError += glm::all(glm::closeBounded(glm::ivec2(3), glm::ivec2(1), glm::ivec2(3))) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_equal();\n\tError += test_notEqual();\n\tError += test_openBounded();\n\tError += test_closeBounded();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/glm.cppcheck",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"1\">\n    <includedir>\n        <dir name=\"../glm\"/>\n    </includedir>\n</project>\n"
  },
  {
    "path": "external/glm/test/gtc/CMakeLists.txt",
    "content": "glmCreateTestGTC(gtc_bitfield)\nglmCreateTestGTC(gtc_color_space)\nglmCreateTestGTC(gtc_constants)\nglmCreateTestGTC(gtc_epsilon)\nglmCreateTestGTC(gtc_integer)\nglmCreateTestGTC(gtc_matrix_access)\nglmCreateTestGTC(gtc_matrix_integer)\nglmCreateTestGTC(gtc_matrix_inverse)\nglmCreateTestGTC(gtc_matrix_transform)\nglmCreateTestGTC(gtc_noise)\nglmCreateTestGTC(gtc_packing)\nglmCreateTestGTC(gtc_quaternion)\nglmCreateTestGTC(gtc_random)\nglmCreateTestGTC(gtc_round)\nglmCreateTestGTC(gtc_reciprocal)\nglmCreateTestGTC(gtc_type_aligned)\nglmCreateTestGTC(gtc_type_precision)\nglmCreateTestGTC(gtc_type_ptr)\nglmCreateTestGTC(gtc_ulp)\nglmCreateTestGTC(gtc_vec1)\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_bitfield.cpp",
    "content": "#include <glm/gtc/bitfield.hpp>\n#include <glm/gtc/type_precision.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/integer.hpp>\n#include <ctime>\n#include <cstdio>\n#include <vector>\n\nnamespace mask\n{\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tgenType\t\tReturn;\n\t};\n\n\tinline int mask_zero(int Bits)\n\t{\n\t\treturn ~((~0) << Bits);\n\t}\n\n\tinline int mask_mix(int Bits)\n\t{\n\t\treturn Bits >= sizeof(int) * 8 ? 0xffffffff : (static_cast<int>(1) << Bits) - static_cast<int>(1);\n\t}\n\n\tinline int mask_half(int Bits)\n\t{\n\t\t// We do the shift in two steps because 1 << 32 on an int is undefined.\n\n\t\tint const Half = Bits >> 1;\n\t\tint const Fill = ~0;\n\t\tint const ShiftHaft = (Fill << Half);\n\t\tint const Rest = Bits - Half;\n\t\tint const Reversed = ShiftHaft << Rest;\n\n\t\treturn ~Reversed;\n\t}\n\n\tinline int mask_loop(int Bits)\n\t{\n\t\tint Mask = 0;\n\t\tfor(int Bit = 0; Bit < Bits; ++Bit)\n\t\t\tMask |= (static_cast<int>(1) << Bit);\n\t\treturn Mask;\n\t}\n\n\tint perf()\n\t{\n\t\tint const Count = 100000000;\n\n\t\tstd::clock_t Timestamp1 = std::clock();\n\n\t\t{\n\t\t\tstd::vector<int> Mask;\n\t\t\tMask.resize(Count);\n\t\t\tfor(int i = 0; i < Count; ++i)\n\t\t\t\tMask[i] = mask_mix(i % 32);\n\t\t}\n\n\t\tstd::clock_t Timestamp2 = std::clock();\n\n\t\t{\n\t\t\tstd::vector<int> Mask;\n\t\t\tMask.resize(Count);\n\t\t\tfor(int i = 0; i < Count; ++i)\n\t\t\t\tMask[i] = mask_loop(i % 32);\n\t\t}\n\n\t\tstd::clock_t Timestamp3 = std::clock();\n\n\t\t{\n\t\t\tstd::vector<int> Mask;\n\t\t\tMask.resize(Count);\n\t\t\tfor(int i = 0; i < Count; ++i)\n\t\t\t\tMask[i] = glm::mask(i % 32);\n\t\t}\n\n\t\tstd::clock_t Timestamp4 = std::clock();\n\n\t\t{\n\t\t\tstd::vector<int> Mask;\n\t\t\tMask.resize(Count);\n\t\t\tfor(int i = 0; i < Count; ++i)\n\t\t\t\tMask[i] = mask_zero(i % 32);\n\t\t}\n\n\t\tstd::clock_t Timestamp5 = std::clock();\n\n\t\t{\n\t\t\tstd::vector<int> Mask;\n\t\t\tMask.resize(Count);\n\t\t\tfor(int i = 0; i < Count; ++i)\n\t\t\t\tMask[i] = mask_half(i % 32);\n\t\t}\n\n\t\tstd::clock_t Timestamp6 = std::clock();\n\n\t\tstd::clock_t TimeMix = Timestamp2 - Timestamp1;\n\t\tstd::clock_t TimeLoop = Timestamp3 - Timestamp2;\n\t\tstd::clock_t TimeDefault = Timestamp4 - Timestamp3;\n\t\tstd::clock_t TimeZero = Timestamp5 - Timestamp4;\n\t\tstd::clock_t TimeHalf = Timestamp6 - Timestamp5;\n\n\t\tprintf(\"mask[mix]: %d\\n\", static_cast<unsigned int>(TimeMix));\n\t\tprintf(\"mask[loop]: %d\\n\", static_cast<unsigned int>(TimeLoop));\n\t\tprintf(\"mask[default]: %d\\n\", static_cast<unsigned int>(TimeDefault));\n\t\tprintf(\"mask[zero]: %d\\n\", static_cast<unsigned int>(TimeZero));\n\t\tprintf(\"mask[half]: %d\\n\", static_cast<unsigned int>(TimeHalf));\n\n\t\treturn TimeDefault < TimeLoop ? 0 : 1;\n\t}\n\n\tint test_uint()\n\t{\n\t\ttype<glm::uint> const Data[] =\n\t\t{\n\t\t\t{ 0, 0x00000000},\n\t\t\t{ 1, 0x00000001},\n\t\t\t{ 2, 0x00000003},\n\t\t\t{ 3, 0x00000007},\n\t\t\t{31, 0x7fffffff},\n\t\t\t{32, 0xffffffff}\n\t\t};\n\n\t\tint Error = 0;\n/* mask_zero is sadly not a correct code\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int>); ++i)\n\t\t{\n\t\t\tint Result = mask_zero(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n*/\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int>); ++i)\n\t\t{\n\t\t\tint Result = mask_mix(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int>); ++i)\n\t\t{\n\t\t\tint Result = mask_half(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int>); ++i)\n\t\t{\n\t\t\tint Result = mask_loop(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0; i < sizeof(Data) / sizeof(type<int>); ++i)\n\t\t{\n\t\t\tint Result = glm::mask(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test_uvec4()\n\t{\n\t\ttype<glm::ivec4> const Data[] =\n\t\t{\n\t\t\t{glm::ivec4( 0), glm::ivec4(0x00000000)},\n\t\t\t{glm::ivec4( 1), glm::ivec4(0x00000001)},\n\t\t\t{glm::ivec4( 2), glm::ivec4(0x00000003)},\n\t\t\t{glm::ivec4( 3), glm::ivec4(0x00000007)},\n\t\t\t{glm::ivec4(31), glm::ivec4(0x7fffffff)},\n\t\t\t{glm::ivec4(32), glm::ivec4(0xffffffff)}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::ivec4>); i < n; ++i)\n\t\t{\n\t\t\tglm::ivec4 Result = glm::mask(Data[i].Value);\n\t\t\tError += glm::all(glm::equal(Data[i].Return, Result)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tError += test_uint();\n\t\tError += test_uvec4();\n\n\t\treturn Error;\n\t}\n}//namespace mask\n\nnamespace bitfieldInterleave3\n{\n\ttemplate<typename PARAM, typename RET>\n\tinline RET refBitfieldInterleave(PARAM x, PARAM y, PARAM z)\n\t{\n\t\tRET Result = 0; \n\t\tfor(RET i = 0; i < sizeof(PARAM) * 8; ++i)\n\t\t{\n\t\t\tResult |= ((RET(x) & (RET(1U) << i)) << ((i << 1) + 0));\n\t\t\tResult |= ((RET(y) & (RET(1U) << i)) << ((i << 1) + 1));\n\t\t\tResult |= ((RET(z) & (RET(1U) << i)) << ((i << 1) + 2));\n\t\t}\n\t\treturn Result;\n\t}\n\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tglm::uint16 x_max = 1 << 11;\n\t\tglm::uint16 y_max = 1 << 11;\n\t\tglm::uint16 z_max = 1 << 11;\n\n\t\tfor(glm::uint16 z = 0; z < z_max; z += 27)\n\t\tfor(glm::uint16 y = 0; y < y_max; y += 27)\n\t\tfor(glm::uint16 x = 0; x < x_max; x += 27)\n\t\t{\n\t\t\tglm::uint64 ResultA = refBitfieldInterleave<glm::uint16, glm::uint64>(x, y, z);\n\t\t\tglm::uint64 ResultB = glm::bitfieldInterleave(x, y, z);\n\t\t\tError += ResultA == ResultB ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}\n\nnamespace bitfieldInterleave4\n{\n\ttemplate<typename PARAM, typename RET>\n\tinline RET loopBitfieldInterleave(PARAM x, PARAM y, PARAM z, PARAM w)\n\t{\n\t\tRET const v[4] = {x, y, z, w};\n\t\tRET Result = 0; \n\t\tfor(RET i = 0; i < sizeof(PARAM) * 8; i++)\n\t\t{\n\t\t\tResult |= ((((v[0] >> i) & 1U)) << ((i << 2) + 0));\n\t\t\tResult |= ((((v[1] >> i) & 1U)) << ((i << 2) + 1));\n\t\t\tResult |= ((((v[2] >> i) & 1U)) << ((i << 2) + 2));\n\t\t\tResult |= ((((v[3] >> i) & 1U)) << ((i << 2) + 3));\n\t\t}\n\t\treturn Result;\n\t}\n\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tglm::uint16 x_max = 1 << 11;\n\t\tglm::uint16 y_max = 1 << 11;\n\t\tglm::uint16 z_max = 1 << 11;\n\t\tglm::uint16 w_max = 1 << 11;\n\n\t\tfor(glm::uint16 w = 0; w < w_max; w += 27)\n\t\tfor(glm::uint16 z = 0; z < z_max; z += 27)\n\t\tfor(glm::uint16 y = 0; y < y_max; y += 27)\n\t\tfor(glm::uint16 x = 0; x < x_max; x += 27)\n\t\t{\n\t\t\tglm::uint64 ResultA = loopBitfieldInterleave<glm::uint16, glm::uint64>(x, y, z, w);\n\t\t\tglm::uint64 ResultB = glm::bitfieldInterleave(x, y, z, w);\n\t\t\tError += ResultA == ResultB ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}\n\nnamespace bitfieldInterleave\n{\n\tinline glm::uint64 fastBitfieldInterleave(glm::uint32 x, glm::uint32 y)\n\t{\n\t\tglm::uint64 REG1;\n\t\tglm::uint64 REG2;\n\n\t\tREG1 = x;\n\t\tREG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n\t\tREG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n\t\tREG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t\tREG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333);\n\t\tREG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555);\n\n\t\tREG2 = y;\n\t\tREG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n\t\tREG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n\t\tREG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t\tREG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333);\n\t\tREG2 = ((REG2 <<  1) | REG2) & glm::uint64(0x5555555555555555);\n\n\t\treturn REG1 | (REG2 << 1);\n\t}\n\n\tinline glm::uint64 interleaveBitfieldInterleave(glm::uint32 x, glm::uint32 y)\n\t{\n\t\tglm::uint64 REG1;\n\t\tglm::uint64 REG2;\n\n\t\tREG1 = x;\n\t\tREG2 = y;\n\n\t\tREG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n\t\tREG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n\n\t\tREG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n\t\tREG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n\n\t\tREG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t\tREG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\n\t\tREG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333);\n\t\tREG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333);\n\n\t\tREG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555);\n\t\tREG2 = ((REG2 <<  1) | REG2) & glm::uint64(0x5555555555555555);\n\n\t\treturn REG1 | (REG2 << 1);\n\t}\n/*\n\tinline glm::uint64 loopBitfieldInterleave(glm::uint32 x, glm::uint32 y)\n\t{\n\t\tstatic glm::uint64 const Mask[5] = \n\t\t{\n\t\t\t0x5555555555555555,\n\t\t\t0x3333333333333333,\n\t\t\t0x0F0F0F0F0F0F0F0F,\n\t\t\t0x00FF00FF00FF00FF,\n\t\t\t0x0000FFFF0000FFFF\n\t\t};\n\n\t\tglm::uint64 REG1 = x;\n\t\tglm::uint64 REG2 = y;\n\t\tfor(int i = 4; i >= 0; --i)\n\t\t{\n\t\t\tREG1 = ((REG1 << (1 << i)) | REG1) & Mask[i];\n\t\t\tREG2 = ((REG2 << (1 << i)) | REG2) & Mask[i];\n\t\t}\n\n\t\treturn REG1 | (REG2 << 1);\n\t}\n*/\n#if GLM_ARCH & GLM_ARCH_SSE2_BIT\n\tinline glm::uint64 sseBitfieldInterleave(glm::uint32 x, glm::uint32 y)\n\t{\n\t\t__m128i const Array = _mm_set_epi32(0, y, 0, x);\n\n\t\t__m128i const Mask4 = _mm_set1_epi32(0x0000FFFF);\n\t\t__m128i const Mask3 = _mm_set1_epi32(0x00FF00FF);\n\t\t__m128i const Mask2 = _mm_set1_epi32(0x0F0F0F0F);\n\t\t__m128i const Mask1 = _mm_set1_epi32(0x33333333);\n\t\t__m128i const Mask0 = _mm_set1_epi32(0x55555555);\n\n\t\t__m128i Reg1;\n\t\t__m128i Reg2;\n\n\t\t// REG1 = x;\n\t\t// REG2 = y;\n\t\tReg1 = _mm_load_si128(&Array);\n\n\t\t//REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n\t\t//REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n\t\tReg2 = _mm_slli_si128(Reg1, 2);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask4);\n\n\t\t//REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n\t\t//REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n\t\tReg2 = _mm_slli_si128(Reg1, 1);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask3);\n\n\t\t//REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t\t//REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t\tReg2 = _mm_slli_epi32(Reg1, 4);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask2);\n\n\t\t//REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333);\n\t\t//REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333);\n\t\tReg2 = _mm_slli_epi32(Reg1, 2);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask1);\n\n\t\t//REG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555);\n\t\t//REG2 = ((REG2 <<  1) | REG2) & glm::uint64(0x5555555555555555);\n\t\tReg2 = _mm_slli_epi32(Reg1, 1);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask0);\n\n\t\t//return REG1 | (REG2 << 1);\n\t\tReg2 = _mm_slli_epi32(Reg1, 1);\n\t\tReg2 = _mm_srli_si128(Reg2, 8);\n\t\tReg1 = _mm_or_si128(Reg1, Reg2);\n\t\n\t\t__m128i Result;\n\t\t_mm_store_si128(&Result, Reg1);\n\t\treturn *reinterpret_cast<glm::uint64*>(&Result);\n\t}\n\n\tinline glm::uint64 sseUnalignedBitfieldInterleave(glm::uint32 x, glm::uint32 y)\n\t{\n\t\t__m128i const Array = _mm_set_epi32(0, y, 0, x);\n\n\t\t__m128i const Mask4 = _mm_set1_epi32(0x0000FFFF);\n\t\t__m128i const Mask3 = _mm_set1_epi32(0x00FF00FF);\n\t\t__m128i const Mask2 = _mm_set1_epi32(0x0F0F0F0F);\n\t\t__m128i const Mask1 = _mm_set1_epi32(0x33333333);\n\t\t__m128i const Mask0 = _mm_set1_epi32(0x55555555);\n\n\t\t__m128i Reg1;\n\t\t__m128i Reg2;\n\n\t\t// REG1 = x;\n\t\t// REG2 = y;\n\t\tReg1 = _mm_loadu_si128(&Array);\n\n\t\t//REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n\t\t//REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n\t\tReg2 = _mm_slli_si128(Reg1, 2);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask4);\n\n\t\t//REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n\t\t//REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n\t\tReg2 = _mm_slli_si128(Reg1, 1);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask3);\n\n\t\t//REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t\t//REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\t\tReg2 = _mm_slli_epi32(Reg1, 4);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask2);\n\n\t\t//REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333);\n\t\t//REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333);\n\t\tReg2 = _mm_slli_epi32(Reg1, 2);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask1);\n\n\t\t//REG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555);\n\t\t//REG2 = ((REG2 <<  1) | REG2) & glm::uint64(0x5555555555555555);\n\t\tReg2 = _mm_slli_epi32(Reg1, 1);\n\t\tReg1 = _mm_or_si128(Reg2, Reg1);\n\t\tReg1 = _mm_and_si128(Reg1, Mask0);\n\n\t\t//return REG1 | (REG2 << 1);\n\t\tReg2 = _mm_slli_epi32(Reg1, 1);\n\t\tReg2 = _mm_srli_si128(Reg2, 8);\n\t\tReg1 = _mm_or_si128(Reg1, Reg2);\n\n\t\t__m128i Result;\n\t\t_mm_store_si128(&Result, Reg1);\n\t\treturn *reinterpret_cast<glm::uint64*>(&Result);\n\t}\n#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\n/*\n\t\t{\n\t\t\tfor(glm::uint32 y = 0; y < (1 << 10); ++y)\n\t\t\tfor(glm::uint32 x = 0; x < (1 << 10); ++x)\n\t\t\t{\n\t\t\t\tglm::uint64 A = glm::bitfieldInterleave(x, y);\n\t\t\t\tglm::uint64 B = fastBitfieldInterleave(x, y);\n\t\t\t\t//glm::uint64 C = loopBitfieldInterleave(x, y);\n\t\t\t\tglm::uint64 D = interleaveBitfieldInterleave(x, y);\n\n\t\t\t\tassert(A == B);\n\t\t\t\t//assert(A == C);\n\t\t\t\tassert(A == D);\n\n#\t\t\t\tif GLM_ARCH & GLM_ARCH_SSE2_BIT\n\t\t\t\t\tglm::uint64 E = sseBitfieldInterleave(x, y);\n\t\t\t\t\tglm::uint64 F = sseUnalignedBitfieldInterleave(x, y);\n\t\t\t\t\tassert(A == E);\n\t\t\t\t\tassert(A == F);\n\n\t\t\t\t\t__m128i G = glm_i128_interleave(_mm_set_epi32(0, y, 0, x));\n\t\t\t\t\tglm::uint64 Result[2];\n\t\t\t\t\t_mm_storeu_si128((__m128i*)Result, G);\n\t\t\t\t\tassert(A == Result[0]);\n#\t\t\t\tendif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n\t\t\t}\n\t\t}\n*/\n\t\t{\n\t\t\tfor(glm::uint8 y = 0; y < 127; ++y)\n\t\t\tfor(glm::uint8 x = 0; x < 127; ++x)\n\t\t\t{\n\t\t\t\tglm::uint64 A(glm::bitfieldInterleave(glm::uint8(x), glm::uint8(y)));\n\t\t\t\tglm::uint64 B(glm::bitfieldInterleave(glm::uint16(x), glm::uint16(y)));\n\t\t\t\tglm::uint64 C(glm::bitfieldInterleave(glm::uint32(x), glm::uint32(y)));\n\n\t\t\t\tError += A == B ? 0 : 1;\n\t\t\t\tError += A == C ? 0 : 1;\n\n\t\t\t\tglm::int64 D(glm::bitfieldInterleave(glm::int8(x), glm::int8(y)));\n\t\t\t\tglm::int64 E(glm::bitfieldInterleave(glm::int16(x), glm::int16(y)));\n\t\t\t\tglm::int64 F(glm::bitfieldInterleave(glm::int32(x), glm::int32(y)));\n\n\t\t\t\tError += D == E ? 0 : 1;\n\t\t\t\tError += D == F ? 0 : 1;\n\t\t\t}\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint perf()\n\t{\n\t\tglm::uint32 x_max = 1 << 11;\n\t\tglm::uint32 y_max = 1 << 10;\n\n\t\t// ALU\n\t\tstd::vector<glm::uint64> Data(x_max * y_max);\n\t\tstd::vector<glm::u32vec2> Param(x_max * y_max);\n\t\tfor(glm::uint32 i = 0; i < Param.size(); ++i)\n\t\t\tParam[i] = glm::u32vec2(i % x_max, i / y_max);\n\n\t\t{\n\t\t\tstd::clock_t LastTime = std::clock();\n\n\t\t\tfor(std::size_t i = 0; i < Data.size(); ++i)\n\t\t\t\tData[i] = glm::bitfieldInterleave(Param[i].x, Param[i].y);\n\n\t\t\tstd::clock_t Time = std::clock() - LastTime;\n\n\t\t\tstd::printf(\"glm::bitfieldInterleave Time %d clocks\\n\", static_cast<unsigned int>(Time));\n\t\t}\n\n\t\t{\n\t\t\tstd::clock_t LastTime = std::clock();\n\n\t\t\tfor(std::size_t i = 0; i < Data.size(); ++i)\n\t\t\t\tData[i] = fastBitfieldInterleave(Param[i].x, Param[i].y);\n\n\t\t\tstd::clock_t Time = std::clock() - LastTime;\n\n\t\t\tstd::printf(\"fastBitfieldInterleave Time %d clocks\\n\", static_cast<unsigned int>(Time));\n\t\t}\n/*\n\t\t{\n\t\t\tstd::clock_t LastTime = std::clock();\n\n\t\t\tfor(std::size_t i = 0; i < Data.size(); ++i)\n\t\t\t\tData[i] = loopBitfieldInterleave(Param[i].x, Param[i].y);\n\n\t\t\tstd::clock_t Time = std::clock() - LastTime;\n\n\t\t\tstd::printf(\"loopBitfieldInterleave Time %d clocks\\n\", static_cast<unsigned int>(Time));\n\t\t}\n*/\n\t\t{\n\t\t\tstd::clock_t LastTime = std::clock();\n\n\t\t\tfor(std::size_t i = 0; i < Data.size(); ++i)\n\t\t\t\tData[i] = interleaveBitfieldInterleave(Param[i].x, Param[i].y);\n\n\t\t\tstd::clock_t Time = std::clock() - LastTime;\n\n\t\t\tstd::printf(\"interleaveBitfieldInterleave Time %d clocks\\n\", static_cast<unsigned int>(Time));\n\t\t}\n\n#\t\tif GLM_ARCH & GLM_ARCH_SSE2_BIT\n\t\t{\n\t\t\tstd::clock_t LastTime = std::clock();\n\n\t\t\tfor(std::size_t i = 0; i < Data.size(); ++i)\n\t\t\t\tData[i] = sseBitfieldInterleave(Param[i].x, Param[i].y);\n\n\t\t\tstd::clock_t Time = std::clock() - LastTime;\n\n\t\t\tstd::printf(\"sseBitfieldInterleave Time %d clocks\\n\", static_cast<unsigned int>(Time));\n\t\t}\n\n\t\t{\n\t\t\tstd::clock_t LastTime = std::clock();\n\n\t\t\tfor(std::size_t i = 0; i < Data.size(); ++i)\n\t\t\t\tData[i] = sseUnalignedBitfieldInterleave(Param[i].x, Param[i].y);\n\n\t\t\tstd::clock_t Time = std::clock() - LastTime;\n\n\t\t\tstd::printf(\"sseUnalignedBitfieldInterleave Time %d clocks\\n\", static_cast<unsigned int>(Time));\n\t\t}\n#\t\tendif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n\t\t{\n\t\t\tstd::clock_t LastTime = std::clock();\n\n\t\t\tfor(std::size_t i = 0; i < Data.size(); ++i)\n\t\t\t\tData[i] = glm::bitfieldInterleave(Param[i].x, Param[i].y, Param[i].x);\n\n\t\t\tstd::clock_t Time = std::clock() - LastTime;\n\n\t\t\tstd::printf(\"glm::detail::bitfieldInterleave Time %d clocks\\n\", static_cast<unsigned int>(Time));\n\t\t}\n\n#\t\tif(GLM_ARCH & GLM_ARCH_SSE2_BIT && !(GLM_COMPILER & GLM_COMPILER_GCC))\n\t\t{\n\t\t\t// SIMD\n\t\t\tstd::vector<__m128i> SimdData;\n\t\t\tSimdData.resize(static_cast<std::size_t>(x_max * y_max));\n\t\t\tstd::vector<__m128i> SimdParam;\n\t\t\tSimdParam.resize(static_cast<std::size_t>(x_max * y_max));\n\t\t\tfor(std::size_t i = 0; i < SimdParam.size(); ++i)\n\t\t\t\tSimdParam[i] = _mm_set_epi32(static_cast<int>(i % static_cast<std::size_t>(x_max)), 0, static_cast<int>(i / static_cast<std::size_t>(y_max)), 0);\n\n\t\t\tstd::clock_t LastTime = std::clock();\n\n\t\t\tfor(std::size_t i = 0; i < SimdData.size(); ++i)\n\t\t\t\tSimdData[i] = glm_i128_interleave(SimdParam[i]);\n\n\t\t\tstd::clock_t Time = std::clock() - LastTime;\n\n\t\t\tstd::printf(\"_mm_bit_interleave_si128 Time %d clocks\\n\", static_cast<unsigned int>(Time));\n\t\t}\n#\t\tendif//GLM_ARCH & GLM_ARCH_SSE2_BIT\n\n\t\treturn 0;\n\t}\n}//namespace bitfieldInterleave\n\nnamespace bitfieldInterleave5\n{\n\tGLM_FUNC_QUALIFIER glm::uint16 bitfieldInterleave_u8vec2(glm::uint8 x, glm::uint8 y)\n\t{\n\t\tglm::uint32 Result = (glm::uint32(y) << 16) | glm::uint32(x);\n\t\tResult = ((Result <<  4) | Result) & 0x0F0F0F0F;\n\t\tResult = ((Result <<  2) | Result) & 0x33333333;\n\t\tResult = ((Result <<  1) | Result) & 0x55555555;\n\t\treturn static_cast<glm::uint16>((Result & 0x0000FFFF) | (Result >> 15));\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::u8vec2 bitfieldDeinterleave_u8vec2(glm::uint16 InterleavedBitfield)\n\t{\n\t\tglm::uint32 Result(InterleavedBitfield);\n\t\tResult = ((Result << 15) | Result) & 0x55555555;\n\t\tResult = ((Result >>  1) | Result) & 0x33333333;\n\t\tResult = ((Result >>  2) | Result) & 0x0F0F0F0F;\n\t\tResult = ((Result >>  4) | Result) & 0x00FF00FF;\n\t\treturn glm::u8vec2(Result & 0x0000FFFF, Result >> 16);\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave_u8vec4(glm::uint8 x, glm::uint8 y, glm::uint8 z, glm::uint8 w)\n\t{\n\t\tglm::uint64 Result = (glm::uint64(w) << 48) | (glm::uint64(z) << 32) | (glm::uint64(y) << 16) | glm::uint64(x);\n\t\tResult = ((Result << 12) | Result) & 0x000F000F000F000Full;\n\t\tResult = ((Result <<  6) | Result) & 0x0303030303030303ull;\n\t\tResult = ((Result <<  3) | Result) & 0x1111111111111111ull;\n\n\t\tconst glm::uint32 a = static_cast<glm::uint32>((Result & 0x000000000000FFFF) >> ( 0 - 0));\n\t\tconst glm::uint32 b = static_cast<glm::uint32>((Result & 0x00000000FFFF0000) >> (16 - 3));\n\t\tconst glm::uint32 c = static_cast<glm::uint32>((Result & 0x0000FFFF00000000) >> (32 - 6));\n\t\tconst glm::uint32 d = static_cast<glm::uint32>((Result & 0xFFFF000000000000) >> (48 - 12));\n\n\t\treturn a | b | c | d;\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::u8vec4 bitfieldDeinterleave_u8vec4(glm::uint32 InterleavedBitfield)\n\t{\n\t\tglm::uint64 Result(InterleavedBitfield);\n\t\tResult = ((Result << 15) | Result) & 0x9249249249249249ull;\n\t\tResult = ((Result >>  1) | Result) & 0x30C30C30C30C30C3ull;\n\t\tResult = ((Result >>  2) | Result) & 0xF00F00F00F00F00Full;\n\t\tResult = ((Result >>  4) | Result) & 0x00FF0000FF0000FFull;\n\t\treturn glm::u8vec4(\n\t\t\t(Result >> 0) & 0x000000000000FFFFull,\n\t\t\t(Result >> 16) & 0x00000000FFFF0000ull,\n\t\t\t(Result >> 32) & 0x0000FFFF00000000ull,\n\t\t\t(Result >> 48) & 0xFFFF000000000000ull);\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave_u16vec2(glm::uint16 x, glm::uint16 y)\n\t{\n\t\tglm::uint64 Result = (glm::uint64(y) << 32) | glm::uint64(x);\n\t\tResult = ((Result <<  8) | Result) & static_cast<glm::uint32>(0x00FF00FF00FF00FFull);\n\t\tResult = ((Result <<  4) | Result) & static_cast<glm::uint32>(0x0F0F0F0F0F0F0F0Full);\n\t\tResult = ((Result <<  2) | Result) & static_cast<glm::uint32>(0x3333333333333333ull);\n\t\tResult = ((Result <<  1) | Result) & static_cast<glm::uint32>(0x5555555555555555ull);\n\t\treturn static_cast<glm::uint32>((Result & 0x00000000FFFFFFFFull) | (Result >> 31));\n\t}\n\n\tGLM_FUNC_QUALIFIER glm::u16vec2 bitfieldDeinterleave_u16vec2(glm::uint32 InterleavedBitfield)\n\t{\n\t\tglm::uint64 Result(InterleavedBitfield);\n\t\tResult = ((Result << 31) | Result) & 0x5555555555555555ull;\n\t\tResult = ((Result >>  1) | Result) & 0x3333333333333333ull;\n\t\tResult = ((Result >>  2) | Result) & 0x0F0F0F0F0F0F0F0Full;\n\t\tResult = ((Result >>  4) | Result) & 0x00FF00FF00FF00FFull;\n\t\tResult = ((Result >>  8) | Result) & 0x0000FFFF0000FFFFull;\n\t\treturn glm::u16vec2(Result & 0x00000000FFFFFFFFull, Result >> 32);\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t{\n\t\t\tglm::uint16 A = bitfieldInterleave_u8vec2(glm::uint8(i), glm::uint8(j));\n\t\t\tglm::uint16 B = glm::bitfieldInterleave(glm::uint8(i), glm::uint8(j));\n\t\t\tError += A == B ? 0 : 1;\n\n\t\t\tglm::u8vec2 C = bitfieldDeinterleave_u8vec2(A);\n\t\t\tError += C.x == glm::uint8(i) ? 0 : 1;\n\t\t\tError += C.y == glm::uint8(j) ? 0 : 1;\n\t\t}\n\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t{\n\t\t\tglm::uint32 A = bitfieldInterleave_u8vec4(glm::uint8(i), glm::uint8(j), glm::uint8(i), glm::uint8(j));\n\t\t\tglm::uint32 B = glm::bitfieldInterleave(glm::uint8(i), glm::uint8(j), glm::uint8(i), glm::uint8(j));\n\t\t\tError += A == B ? 0 : 1;\n/*\n\t\t\tglm::u8vec4 C = bitfieldDeinterleave_u8vec4(A);\n\t\t\tError += C.x == glm::uint8(i) ? 0 : 1;\n\t\t\tError += C.y == glm::uint8(j) ? 0 : 1;\n\t\t\tError += C.z == glm::uint8(i) ? 0 : 1;\n\t\t\tError += C.w == glm::uint8(j) ? 0 : 1;\n*/\n\t\t}\n\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t{\n\t\t\tglm::uint32 A = bitfieldInterleave_u16vec2(glm::uint16(i), glm::uint16(j));\n\t\t\tglm::uint32 B = glm::bitfieldInterleave(glm::uint16(i), glm::uint16(j));\n\t\t\tError += A == B ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint perf_old_u8vec2(std::vector<glm::uint16>& Result)\n\t{\n\t\tint Error = 0;\n\n\t\tconst std::clock_t BeginTime = std::clock();\n\t\t\n\t\tfor(glm::size_t k = 0; k < 10000; ++k)\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tError += Result[j * 256 + i] == glm::bitfieldInterleave(glm::uint8(i), glm::uint8(j)) ? 0 : 1;\n\n\t\tconst std::clock_t EndTime = std::clock();\n\n\t\tstd::printf(\"glm::bitfieldInterleave<u8vec2> Time %d clocks\\n\", static_cast<unsigned int>(EndTime - BeginTime));\n\n\t\treturn Error;\n\t}\n\n\tint perf_new_u8vec2(std::vector<glm::uint16>& Result)\n\t{\n\t\tint Error = 0;\n\n\t\tconst std::clock_t BeginTime = std::clock();\n\n\t\tfor(glm::size_t k = 0; k < 10000; ++k)\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tError += Result[j * 256 + i] == bitfieldInterleave_u8vec2(glm::uint8(i), glm::uint8(j)) ? 0 : 1;\n\n\t\tconst std::clock_t EndTime = std::clock();\n\n\t\tstd::printf(\"bitfieldInterleave_u8vec2 Time %d clocks\\n\", static_cast<unsigned int>(EndTime - BeginTime));\n\n\t\treturn Error;\n\t}\n\n\tint perf_old_u8vec4(std::vector<glm::uint32>& Result)\n\t{\n\t\tint Error = 0;\n\n\t\tconst std::clock_t BeginTime = std::clock();\n\n\t\tfor(glm::size_t k = 0; k < 10000; ++k)\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tError += Result[j * 256 + i] == glm::bitfieldInterleave(glm::uint8(i), glm::uint8(j), glm::uint8(i), glm::uint8(j)) ? 0 : 1;\n\n\t\tconst std::clock_t EndTime = std::clock();\n\n\t\tstd::printf(\"glm::bitfieldInterleave<u8vec4> Time %d clocks\\n\", static_cast<unsigned int>(EndTime - BeginTime));\n\n\t\treturn Error;\n\t}\n\n\tint perf_new_u8vec4(std::vector<glm::uint32>& Result)\n\t{\n\t\tint Error = 0;\n\n\t\tconst std::clock_t BeginTime = std::clock();\n\n\t\tfor(glm::size_t k = 0; k < 10000; ++k)\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tError += Result[j * 256 + i] == bitfieldInterleave_u8vec4(glm::uint8(i), glm::uint8(j), glm::uint8(i), glm::uint8(j)) ? 0 : 1;\n\n\t\tconst std::clock_t EndTime = std::clock();\n\n\t\tstd::printf(\"bitfieldInterleave_u8vec4 Time %d clocks\\n\", static_cast<unsigned int>(EndTime - BeginTime));\n\n\t\treturn Error;\n\t}\n\n\tint perf_old_u16vec2(std::vector<glm::uint32>& Result)\n\t{\n\t\tint Error = 0;\n\n\t\tconst std::clock_t BeginTime = std::clock();\n\n\t\tfor(glm::size_t k = 0; k < 10000; ++k)\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tError += Result[j * 256 + i] == glm::bitfieldInterleave(glm::uint16(i), glm::uint16(j)) ? 0 : 1;\n\n\t\tconst std::clock_t EndTime = std::clock();\n\n\t\tstd::printf(\"glm::bitfieldInterleave<u16vec2> Time %d clocks\\n\", static_cast<unsigned int>(EndTime - BeginTime));\n\n\t\treturn Error;\n\t}\n\n\tint perf_new_u16vec2(std::vector<glm::uint32>& Result)\n\t{\n\t\tint Error = 0;\n\n\t\tconst std::clock_t BeginTime = std::clock();\n\n\t\tfor(glm::size_t k = 0; k < 10000; ++k)\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tError += Result[j * 256 + i] == bitfieldInterleave_u16vec2(glm::uint16(i), glm::uint16(j)) ? 0 : 1;\n\n\t\tconst std::clock_t EndTime = std::clock();\n\n\t\tstd::printf(\"bitfieldInterleave_u16vec2 Time %d clocks\\n\", static_cast<unsigned int>(EndTime - BeginTime));\n\n\t\treturn Error;\n\t}\n\n\tint perf()\n\t{\n\t\tint Error = 0;\n\n\t\tstd::printf(\"bitfieldInterleave perf: init\\r\");\n\n\t\tstd::vector<glm::uint16> Result_u8vec2(256 * 256, 0);\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tResult_u8vec2[j * 256 + i] = glm::bitfieldInterleave(glm::uint8(i), glm::uint8(j));\n\n\t\tError += perf_old_u8vec2(Result_u8vec2);\n\t\tError += perf_new_u8vec2(Result_u8vec2);\n\n\t\tstd::vector<glm::uint32> Result_u8vec4(256 * 256, 0);\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tResult_u8vec4[j * 256 + i] = glm::bitfieldInterleave(glm::uint8(i), glm::uint8(j), glm::uint8(i), glm::uint8(j));\n\t\t\n\t\tError += perf_old_u8vec4(Result_u8vec4);\n\t\tError += perf_new_u8vec4(Result_u8vec4);\n\n\t\tstd::vector<glm::uint32> Result_u16vec2(256 * 256, 0);\n\t\tfor(glm::size_t j = 0; j < 256; ++j)\n\t\tfor(glm::size_t i = 0; i < 256; ++i)\n\t\t\tResult_u16vec2[j * 256 + i] = glm::bitfieldInterleave(glm::uint16(i), glm::uint16(j));\n\n\t\tError += perf_old_u16vec2(Result_u16vec2);\n\t\tError += perf_new_u16vec2(Result_u16vec2);\n\n\t\tstd::printf(\"bitfieldInterleave perf: %d Errors\\n\", Error);\n\n\t\treturn Error;\n\t}\n\n}//namespace bitfieldInterleave5\n\nint main()\n{\n\tint Error = 0;\n/* Tests for a faster and to reserve bitfieldInterleave\n\tError += ::bitfieldInterleave5::test();\n\tError += ::bitfieldInterleave5::perf();\n*/\n\tError += ::mask::test();\n\tError += ::bitfieldInterleave3::test();\n\tError += ::bitfieldInterleave4::test();\n\tError += ::bitfieldInterleave::test();\n\n#\tifdef NDEBUG\n\t\tError += ::mask::perf();\n\t\tError += ::bitfieldInterleave::perf();\n#\tendif//NDEBUG\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_color_space.cpp",
    "content": "#include <glm/gtc/color_space.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/constants.hpp>\n\nnamespace srgb\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tglm::vec3 const ColorSourceRGB(1.0, 0.5, 0.0);\n\n\t\t{\n\t\t\tglm::vec3 const ColorSRGB = glm::convertLinearToSRGB(ColorSourceRGB);\n\t\t\tglm::vec3 const ColorRGB = glm::convertSRGBToLinear(ColorSRGB);\n\t\t\tError += glm::all(glm::epsilonEqual(ColorSourceRGB, ColorRGB, 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec3 const ColorSRGB = glm::convertLinearToSRGB(ColorSourceRGB, 2.8f);\n\t\t\tglm::vec3 const ColorRGB = glm::convertSRGBToLinear(ColorSRGB, 2.8f);\n\t\t\tError += glm::all(glm::epsilonEqual(ColorSourceRGB, ColorRGB, 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\tglm::vec4 const ColorSourceRGBA(1.0, 0.5, 0.0, 1.0);\n\n\t\t{\n\t\t\tglm::vec4 const ColorSRGB = glm::convertLinearToSRGB(ColorSourceRGBA);\n\t\t\tglm::vec4 const ColorRGB = glm::convertSRGBToLinear(ColorSRGB);\n\t\t\tError += glm::all(glm::epsilonEqual(ColorSourceRGBA, ColorRGB, 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 const ColorSRGB = glm::convertLinearToSRGB(ColorSourceRGBA, 2.8f);\n\t\t\tglm::vec4 const ColorRGB = glm::convertSRGBToLinear(ColorSRGB, 2.8f);\n\t\t\tError += glm::all(glm::epsilonEqual(ColorSourceRGBA, ColorRGB, 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace srgb\n\nnamespace srgb_lowp\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tfor(float Color = 0.0f; Color < 1.0f; Color += 0.01f)\n\t\t{\n\t\t\tglm::highp_vec3 const HighpSRGB = glm::convertLinearToSRGB(glm::highp_vec3(Color));\n\t\t\tglm::lowp_vec3 const LowpSRGB = glm::convertLinearToSRGB(glm::lowp_vec3(Color));\n\t\t\tError += glm::all(glm::epsilonEqual(glm::abs(HighpSRGB - glm::highp_vec3(LowpSRGB)), glm::highp_vec3(0), 0.1f)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace srgb_lowp\n\nint main()\n{\n\tint Error(0);\n\n\tError += srgb::test();\n\tError += srgb_lowp::test();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_constants.cpp",
    "content": "#include <glm/gtc/constants.hpp>\n\nint test_epsilon()\n{\n\tint Error = 0;\n\n\t{\n\t\tfloat Test = glm::epsilon<float>();\n\t\tError += Test > 0.0f ? 0 : 1;\n\t}\n\n\t{\n\t\tdouble Test = glm::epsilon<double>();\n\t\tError += Test > 0.0 ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\t//float MinHalf = 0.0f;\n\t//while (glm::half(MinHalf) == glm::half(0.0f))\n\t//\tMinHalf += std::numeric_limits<float>::epsilon();\n\tError += test_epsilon();\n\t\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_epsilon.cpp",
    "content": "#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/constants.hpp>\n#include <glm/vector_relational.hpp>\n\nint test_defined()\n{\n\tglm::epsilonEqual(glm::vec2(), glm::vec2(), glm::vec2());\n\tglm::epsilonEqual(glm::vec3(), glm::vec3(), glm::vec3());\n\tglm::epsilonEqual(glm::vec4(), glm::vec4(), glm::vec4());\n\n\tglm::epsilonNotEqual(glm::vec2(), glm::vec2(), glm::vec2());\n\tglm::epsilonNotEqual(glm::vec3(), glm::vec3(), glm::vec3());\n\tglm::epsilonNotEqual(glm::vec4(), glm::vec4(), glm::vec4());\n\t\n\tglm::epsilonEqual(glm::vec2(), glm::vec2(), 0.0f);\n\tglm::epsilonEqual(glm::vec3(), glm::vec3(), 0.0f);\n\tglm::epsilonEqual(glm::vec4(), glm::vec4(), 0.0f);\n\tglm::epsilonEqual(glm::quat(), glm::quat(), 0.0f);\n\n\tglm::epsilonNotEqual(glm::vec2(), glm::vec2(), 0.0f);\n\tglm::epsilonNotEqual(glm::vec3(), glm::vec3(), 0.0f);\n\tglm::epsilonNotEqual(glm::vec4(), glm::vec4(), 0.0f);\n\tglm::epsilonNotEqual(glm::quat(), glm::quat(), 0.0f);\n\n\treturn 0;\n}\n\ntemplate<typename T>\nint test_equal()\n{\n\tint Error(0);\n\t\n\t{\n\t\tT A = glm::epsilon<T>();\n\t\tT B = glm::epsilon<T>();\n\t\tError += glm::epsilonEqual(A, B, glm::epsilon<T>() * T(2)) ? 0 : 1;\n\t}\n\n\t{\n\t\tT A(0);\n\t\tT B = static_cast<T>(0) + glm::epsilon<T>();\n\t\tError += glm::epsilonEqual(A, B, glm::epsilon<T>() * T(2)) ? 0 : 1;\n\t}\n\n\t{\n\t\tT A(0);\n\t\tT B = static_cast<T>(0) - glm::epsilon<T>();\n\t\tError += glm::epsilonEqual(A, B, glm::epsilon<T>() * T(2)) ? 0 : 1;\n\t}\n\n\t{\n\t\tT A = static_cast<T>(0) + glm::epsilon<T>();\n\t\tT B = static_cast<T>(0);\n\t\tError += glm::epsilonEqual(A, B, glm::epsilon<T>() * T(2)) ? 0 : 1;\n\t}\n\n\t{\n\t\tT A = static_cast<T>(0) - glm::epsilon<T>();\n\t\tT B = static_cast<T>(0);\n\t\tError += glm::epsilonEqual(A, B, glm::epsilon<T>() * T(2)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_defined();\n\tError += test_equal<float>();\n\tError += test_equal<double>();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_integer.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#define GLM_FORCE_INLINE\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/integer.hpp>\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <glm/gtx/type_aligned.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/vec2.hpp>\n#include <glm/vec3.hpp>\n#include <glm/vec4.hpp>\n#include <ctime>\n#include <cstdio>\n#include <vector>\n#include <cmath>\n\nnamespace log2_\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tint A0 = static_cast<int>(glm::log2(16.f));\n\t\tglm::ivec1 B0(glm::log2(glm::vec1(16.f)));\n\t\tglm::ivec2 C0(glm::log2(glm::vec2(16.f)));\n\t\tglm::ivec3 D0(glm::log2(glm::vec3(16.f)));\n\t\tglm::ivec4 E0(glm::log2(glm::vec4(16.f)));\n\n\t\tint A1 = glm::log2(int(16));\n\t\tglm::ivec1 B1 = glm::log2(glm::ivec1(16));\n\t\tglm::ivec2 C1 = glm::log2(glm::ivec2(16));\n\t\tglm::ivec3 D1 = glm::log2(glm::ivec3(16));\n\t\tglm::ivec4 E1 = glm::log2(glm::ivec4(16));\n\n\t\tError += A0 == A1 ? 0 : 1;\n\t\tError += glm::all(glm::equal(B0, B1)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(C0, C1)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(D0, D1)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(E0, E1)) ? 0 : 1;\n\n\t\tglm::uint64 A2 = glm::log2(glm::uint64(16));\n\t\tglm::u64vec1 B2 = glm::log2(glm::u64vec1(16));\n\t\tglm::u64vec2 C2 = glm::log2(glm::u64vec2(16));\n\t\tglm::u64vec3 D2 = glm::log2(glm::u64vec3(16));\n\t\tglm::u64vec4 E2 = glm::log2(glm::u64vec4(16));\n\n\t\tError += A2 == glm::uint64(4) ? 0 : 1;\n\t\tError += glm::all(glm::equal(B2, glm::u64vec1(4))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(C2, glm::u64vec2(4))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(D2, glm::u64vec3(4))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(E2, glm::u64vec4(4))) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n\n\tint perf(std::size_t Count)\n\t{\n\t\tint Error = 0;\n\n\t\t{\n\t\t\tstd::vector<int> Result;\n\t\t\tResult.resize(Count);\n\n\t\t\tstd::clock_t Begin = clock();\n\n\t\t\tfor(int i = 0; i < static_cast<int>(Count); ++i)\n\t\t\t\tResult[i] = glm::log2(static_cast<int>(i));\n\n\t\t\tstd::clock_t End = clock();\n\n\t\t\tprintf(\"glm::log2<int>: %ld clocks\\n\", End - Begin);\n\t\t}\n\n\t\t{\n\t\t\tstd::vector<glm::ivec4> Result;\n\t\t\tResult.resize(Count);\n\n\t\t\tstd::clock_t Begin = clock();\n\n\t\t\tfor(int i = 0; i < static_cast<int>(Count); ++i)\n\t\t\t\tResult[i] = glm::log2(glm::ivec4(i));\n\n\t\t\tstd::clock_t End = clock();\n\n\t\t\tprintf(\"glm::log2<ivec4>: %ld clocks\\n\", End - Begin);\n\t\t}\n\n#\t\tif GLM_HAS_BITSCAN_WINDOWS\n\t\t{\n\t\t\tstd::vector<glm::ivec4> Result;\n\t\t\tResult.resize(Count);\n\n\t\t\tstd::clock_t Begin = clock();\n\n\t\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\t{\n\t\t\t\tglm::vec<4, unsigned long, glm::defaultp> Tmp;\n\t\t\t\t_BitScanReverse(&Tmp.x, i);\n\t\t\t\t_BitScanReverse(&Tmp.y, i);\n\t\t\t\t_BitScanReverse(&Tmp.z, i);\n\t\t\t\t_BitScanReverse(&Tmp.w, i);\n\t\t\t\tResult[i] = glm::ivec4(Tmp);\n\t\t\t}\n\n\t\t\tstd::clock_t End = clock();\n\n\t\t\tprintf(\"glm::log2<ivec4> inlined: %ld clocks\\n\", End - Begin);\n\t\t}\n\n\n\t\t{\n\t\t\tstd::vector<glm::vec<4, unsigned long, glm::defaultp> > Result;\n\t\t\tResult.resize(Count);\n\n\t\t\tstd::clock_t Begin = clock();\n\n\t\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\t{\n\t\t\t\t_BitScanReverse(&Result[i].x, i);\n\t\t\t\t_BitScanReverse(&Result[i].y, i);\n\t\t\t\t_BitScanReverse(&Result[i].z, i);\n\t\t\t\t_BitScanReverse(&Result[i].w, i);\n\t\t\t}\n\n\t\t\tstd::clock_t End = clock();\n\n\t\t\tprintf(\"glm::log2<ivec4> inlined no cast: %ld clocks\\n\", End - Begin);\n\t\t}\n\n\n\t\t{\n\t\t\tstd::vector<glm::ivec4> Result;\n\t\t\tResult.resize(Count);\n\n\t\t\tstd::clock_t Begin = clock();\n\n\t\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\t{\n\t\t\t\t_BitScanReverse(reinterpret_cast<unsigned long*>(&Result[i].x), i);\n\t\t\t\t_BitScanReverse(reinterpret_cast<unsigned long*>(&Result[i].y), i);\n\t\t\t\t_BitScanReverse(reinterpret_cast<unsigned long*>(&Result[i].z), i);\n\t\t\t\t_BitScanReverse(reinterpret_cast<unsigned long*>(&Result[i].w), i);\n\t\t\t}\n\n\t\t\tstd::clock_t End = clock();\n\n\t\t\tprintf(\"glm::log2<ivec4> reinterpret: %ld clocks\\n\", End - Begin);\n\t\t}\n#\t\tendif//GLM_HAS_BITSCAN_WINDOWS\n\n\t\t{\n\t\t\tstd::vector<float> Result;\n\t\t\tResult.resize(Count);\n\n\t\t\tstd::clock_t Begin = clock();\n\n\t\t\tfor(std::size_t i = 0; i < Count; ++i)\n\t\t\t\tResult[i] = glm::log2(static_cast<float>(i));\n\n\t\t\tstd::clock_t End = clock();\n\n\t\t\tprintf(\"glm::log2<float>: %ld clocks\\n\", End - Begin);\n\t\t}\n\n\t\t{\n\t\t\tstd::vector<glm::vec4> Result;\n\t\t\tResult.resize(Count);\n\n\t\t\tstd::clock_t Begin = clock();\n\n\t\t\tfor(int i = 0; i < static_cast<int>(Count); ++i)\n\t\t\t\tResult[i] = glm::log2(glm::vec4(static_cast<float>(i)));\n\n\t\t\tstd::clock_t End = clock();\n\n\t\t\tprintf(\"glm::log2<vec4>: %ld clocks\\n\", End - Begin);\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace log2_\n\nnamespace iround\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tfor(float f = 0.0f; f < 3.1f; f += 0.05f)\n\t\t{\n\t\t\tint RoundFast = static_cast<int>(glm::iround(f));\n\t\t\tint RoundSTD = static_cast<int>(glm::round(f));\n\t\t\tError += RoundFast == RoundSTD ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace iround\n\nnamespace uround\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tfor(float f = 0.0f; f < 3.1f; f += 0.05f)\n\t\t{\n\t\t\tint RoundFast = static_cast<int>(glm::uround(f));\n\t\t\tint RoundSTD = static_cast<int>(glm::round(f));\n\t\t\tError += RoundFast == RoundSTD ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace uround\n\nint main()\n{\n\tint Error(0);\n\n\tError += ::log2_::test();\n\tError += ::iround::test();\n\tError += ::uround::test();\n\n#\tifdef NDEBUG\n\t\tstd::size_t const Samples(1000);\n\t\tError += ::log2_::perf(Samples);\n#\tendif//NDEBUG\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_matrix_access.cpp",
    "content": "#include <glm/gtc/matrix_access.hpp>\n#include <glm/mat2x2.hpp>\n#include <glm/mat2x3.hpp>\n#include <glm/mat2x4.hpp>\n#include <glm/mat3x2.hpp>\n#include <glm/mat3x3.hpp>\n#include <glm/mat3x4.hpp>\n#include <glm/mat4x2.hpp>\n#include <glm/mat4x3.hpp>\n#include <glm/mat4x4.hpp>\n\nint test_mat2x2_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat2x2 m(1);\n\n\tm = glm::row(m, 0, glm::vec2( 0,  1));\n\tm = glm::row(m, 1, glm::vec2( 4,  5));\n\n\tError += glm::row(m, 0) == glm::vec2( 0,  1) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec2( 4,  5) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat2x2_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat2x2 m(1);\n\n\tm = glm::column(m, 0, glm::vec2( 0,  1));\n\tm = glm::column(m, 1, glm::vec2( 4,  5));\n\n\tError += glm::column(m, 0) == glm::vec2( 0,  1) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec2( 4,  5) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat2x3_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat2x3 m(1);\n\n\tm = glm::row(m, 0, glm::vec2( 0,  1));\n\tm = glm::row(m, 1, glm::vec2( 4,  5));\n\tm = glm::row(m, 2, glm::vec2( 8,  9));\n\n\tError += glm::row(m, 0) == glm::vec2( 0,  1) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec2( 4,  5) ? 0 : 1;\n\tError += glm::row(m, 2) == glm::vec2( 8,  9) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat2x3_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat2x3 m(1);\n\n\tm = glm::column(m, 0, glm::vec3( 0,  1,  2));\n\tm = glm::column(m, 1, glm::vec3( 4,  5,  6));\n\n\tError += glm::column(m, 0) == glm::vec3( 0,  1,  2) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec3( 4,  5,  6) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat2x4_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat2x4 m(1);\n\n\tm = glm::row(m, 0, glm::vec2( 0,  1));\n\tm = glm::row(m, 1, glm::vec2( 4,  5));\n\tm = glm::row(m, 2, glm::vec2( 8,  9));\n\tm = glm::row(m, 3, glm::vec2(12, 13));\n\n\tError += glm::row(m, 0) == glm::vec2( 0,  1) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec2( 4,  5) ? 0 : 1;\n\tError += glm::row(m, 2) == glm::vec2( 8,  9) ? 0 : 1;\n\tError += glm::row(m, 3) == glm::vec2(12, 13) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat2x4_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat2x4 m(1);\n\n\tm = glm::column(m, 0, glm::vec4( 0,  1,  2, 3));\n\tm = glm::column(m, 1, glm::vec4( 4,  5,  6, 7));\n\n\tError += glm::column(m, 0) == glm::vec4( 0,  1,  2, 3) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec4( 4,  5,  6, 7) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat3x2_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat3x2 m(1);\n\n\tm = glm::row(m, 0, glm::vec3( 0,  1,  2));\n\tm = glm::row(m, 1, glm::vec3( 4,  5,  6));\n\n\tError += glm::row(m, 0) == glm::vec3( 0,  1,  2) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec3( 4,  5,  6) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat3x2_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat3x2 m(1);\n\n\tm = glm::column(m, 0, glm::vec2( 0,  1));\n\tm = glm::column(m, 1, glm::vec2( 4,  5));\n\tm = glm::column(m, 2, glm::vec2( 8,  9));\n\n\tError += glm::column(m, 0) == glm::vec2( 0,  1) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec2( 4,  5) ? 0 : 1;\n\tError += glm::column(m, 2) == glm::vec2( 8,  9) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat3x3_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat3x3 m(1);\n\n\tm = glm::row(m, 0, glm::vec3( 0,  1,  2));\n\tm = glm::row(m, 1, glm::vec3( 4,  5,  6));\n\tm = glm::row(m, 2, glm::vec3( 8,  9, 10));\n\n\tError += glm::row(m, 0) == glm::vec3( 0,  1,  2) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec3( 4,  5,  6) ? 0 : 1;\n\tError += glm::row(m, 2) == glm::vec3( 8,  9, 10) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat3x3_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat3x3 m(1);\n\n\tm = glm::column(m, 0, glm::vec3( 0,  1,  2));\n\tm = glm::column(m, 1, glm::vec3( 4,  5,  6));\n\tm = glm::column(m, 2, glm::vec3( 8,  9, 10));\n\n\tError += glm::column(m, 0) == glm::vec3( 0,  1,  2) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec3( 4,  5,  6) ? 0 : 1;\n\tError += glm::column(m, 2) == glm::vec3( 8,  9, 10) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat3x4_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat3x4 m(1);\n\n\tm = glm::row(m, 0, glm::vec3( 0,  1,  2));\n\tm = glm::row(m, 1, glm::vec3( 4,  5,  6));\n\tm = glm::row(m, 2, glm::vec3( 8,  9, 10));\n\tm = glm::row(m, 3, glm::vec3(12, 13, 14));\n\n\tError += glm::row(m, 0) == glm::vec3( 0,  1,  2) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec3( 4,  5,  6) ? 0 : 1;\n\tError += glm::row(m, 2) == glm::vec3( 8,  9, 10) ? 0 : 1;\n\tError += glm::row(m, 3) == glm::vec3(12, 13, 14) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat3x4_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat3x4 m(1);\n\n\tm = glm::column(m, 0, glm::vec4( 0,  1,  2, 3));\n\tm = glm::column(m, 1, glm::vec4( 4,  5,  6, 7));\n\tm = glm::column(m, 2, glm::vec4( 8,  9, 10, 11));\n\n\tError += glm::column(m, 0) == glm::vec4( 0,  1,  2, 3) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec4( 4,  5,  6, 7) ? 0 : 1;\n\tError += glm::column(m, 2) == glm::vec4( 8,  9, 10, 11) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat4x2_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat4x2 m(1);\n\n\tm = glm::row(m, 0, glm::vec4( 0,  1,  2,  3));\n\tm = glm::row(m, 1, glm::vec4( 4,  5,  6,  7));\n\n\tError += glm::row(m, 0) == glm::vec4( 0,  1,  2,  3) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec4( 4,  5,  6,  7) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat4x2_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat4x2 m(1);\n\n\tm = glm::column(m, 0, glm::vec2( 0,  1));\n\tm = glm::column(m, 1, glm::vec2( 4,  5));\n\tm = glm::column(m, 2, glm::vec2( 8,  9));\n\tm = glm::column(m, 3, glm::vec2(12, 13));\n\n\tError += glm::column(m, 0) == glm::vec2( 0,  1) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec2( 4,  5) ? 0 : 1;\n\tError += glm::column(m, 2) == glm::vec2( 8,  9) ? 0 : 1;\n\tError += glm::column(m, 3) == glm::vec2(12, 13) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat4x3_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat4x3 m(1);\n\n\tm = glm::row(m, 0, glm::vec4( 0,  1,  2,  3));\n\tm = glm::row(m, 1, glm::vec4( 4,  5,  6,  7));\n\tm = glm::row(m, 2, glm::vec4( 8,  9, 10, 11));\n\n\tError += glm::row(m, 0) == glm::vec4( 0,  1,  2,  3) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec4( 4,  5,  6,  7) ? 0 : 1;\n\tError += glm::row(m, 2) == glm::vec4( 8,  9, 10, 11) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat4x3_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat4x3 m(1);\n\n\tm = glm::column(m, 0, glm::vec3( 0,  1,  2));\n\tm = glm::column(m, 1, glm::vec3( 4,  5,  6));\n\tm = glm::column(m, 2, glm::vec3( 8,  9, 10));\n\tm = glm::column(m, 3, glm::vec3(12, 13, 14));\n\n\tError += glm::column(m, 0) == glm::vec3( 0,  1,  2) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec3( 4,  5,  6) ? 0 : 1;\n\tError += glm::column(m, 2) == glm::vec3( 8,  9, 10) ? 0 : 1;\n\tError += glm::column(m, 3) == glm::vec3(12, 13, 14) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat4x4_row_set()\n{\n\tint Error = 0;\n\n\tglm::mat4 m(1);\n\n\tm = glm::row(m, 0, glm::vec4( 0,  1,  2,  3));\n\tm = glm::row(m, 1, glm::vec4( 4,  5,  6,  7));\n\tm = glm::row(m, 2, glm::vec4( 8,  9, 10, 11));\n\tm = glm::row(m, 3, glm::vec4(12, 13, 14, 15));\n\n\tError += glm::row(m, 0) == glm::vec4( 0,  1,  2,  3) ? 0 : 1;\n\tError += glm::row(m, 1) == glm::vec4( 4,  5,  6,  7) ? 0 : 1;\n\tError += glm::row(m, 2) == glm::vec4( 8,  9, 10, 11) ? 0 : 1;\n\tError += glm::row(m, 3) == glm::vec4(12, 13, 14, 15) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat4x4_col_set()\n{\n\tint Error = 0;\n\n\tglm::mat4 m(1);\n\n\tm = glm::column(m, 0, glm::vec4( 0,  1,  2,  3));\n\tm = glm::column(m, 1, glm::vec4( 4,  5,  6,  7));\n\tm = glm::column(m, 2, glm::vec4( 8,  9, 10, 11));\n\tm = glm::column(m, 3, glm::vec4(12, 13, 14, 15));\n\n\tError += glm::column(m, 0) == glm::vec4( 0,  1,  2,  3) ? 0 : 1;\n\tError += glm::column(m, 1) == glm::vec4( 4,  5,  6,  7) ? 0 : 1;\n\tError += glm::column(m, 2) == glm::vec4( 8,  9, 10, 11) ? 0 : 1;\n\tError += glm::column(m, 3) == glm::vec4(12, 13, 14, 15) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat4x4_row_get()\n{\n\tint Error = 0;\n\n\tglm::mat4 m(1);\n\n\tglm::vec4 A = glm::row(m, 0);\n\tError += A == glm::vec4(1, 0, 0, 0) ? 0 : 1;\n\tglm::vec4 B = glm::row(m, 1);\n\tError += B == glm::vec4(0, 1, 0, 0) ? 0 : 1;\n\tglm::vec4 C = glm::row(m, 2);\n\tError += C == glm::vec4(0, 0, 1, 0) ? 0 : 1;\n\tglm::vec4 D = glm::row(m, 3);\n\tError += D == glm::vec4(0, 0, 0, 1) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_mat4x4_col_get()\n{\n\tint Error = 0;\n\n\tglm::mat4 m(1);\n\n\tglm::vec4 A = glm::column(m, 0);\n\tError += A == glm::vec4(1, 0, 0, 0) ? 0 : 1;\n\tglm::vec4 B = glm::column(m, 1);\n\tError += B == glm::vec4(0, 1, 0, 0) ? 0 : 1;\n\tglm::vec4 C = glm::column(m, 2);\n\tError += C == glm::vec4(0, 0, 1, 0) ? 0 : 1;\n\tglm::vec4 D = glm::column(m, 3);\n\tError += D == glm::vec4(0, 0, 0, 1) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_mat2x2_row_set();\n\tError += test_mat2x2_col_set();\n\tError += test_mat2x3_row_set();\n\tError += test_mat2x3_col_set();\n\tError += test_mat2x4_row_set();\n\tError += test_mat2x4_col_set();\n\tError += test_mat3x2_row_set();\n\tError += test_mat3x2_col_set();\n\tError += test_mat3x3_row_set();\n\tError += test_mat3x3_col_set();\n\tError += test_mat3x4_row_set();\n\tError += test_mat3x4_col_set();\n\tError += test_mat4x2_row_set();\n\tError += test_mat4x2_col_set();\n\tError += test_mat4x3_row_set();\n\tError += test_mat4x3_col_set();\n\tError += test_mat4x4_row_set();\n\tError += test_mat4x4_col_set();\n\n\tError += test_mat4x4_row_get();\n\tError += test_mat4x4_col_get();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_matrix_integer.cpp",
    "content": "#include <glm/gtc/matrix_integer.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_matrix_inverse.cpp",
    "content": "#include <glm/gtc/matrix_inverse.hpp>\n#include <glm/gtc/epsilon.hpp>\n\nint test_affine()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::mat3 const M(\n\t\t\t2.f, 0.f, 0.f,\n\t\t\t0.f, 2.f, 0.f,\n\t\t\t0.f, 0.f, 1.f);\n\t\tglm::mat3 const A = glm::affineInverse(M);\n\t\tglm::mat3 const I = glm::inverse(M);\n\t\tglm::mat3 const R = glm::affineInverse(A);\n\n\t\tfor(glm::length_t i = 0; i < A.length(); ++i)\n\t\t{\n\t\t\tError += glm::all(glm::epsilonEqual(M[i], R[i], 0.01f)) ? 0 : 1;\n\t\t\tError += glm::all(glm::epsilonEqual(A[i], I[i], 0.01f)) ? 0 : 1;\n\t\t}\n\t}\n\n\t{\n\t\tglm::mat4 const M(\n\t\t\t2.f, 0.f, 0.f, 0.f,\n\t\t\t0.f, 2.f, 0.f, 0.f,\n\t\t\t0.f, 0.f, 2.f, 0.f,\n\t\t\t0.f, 0.f, 0.f, 1.f);\n\t\tglm::mat4 const A = glm::affineInverse(M);\n\t\tglm::mat4 const I = glm::inverse(M);\n\t\tglm::mat4 const R = glm::affineInverse(A);\n\n\t\tfor(glm::length_t i = 0; i < A.length(); ++i)\n\t\t{\n\t\t\tError += glm::all(glm::epsilonEqual(M[i], R[i], 0.01f)) ? 0 : 1;\n\t\t\tError += glm::all(glm::epsilonEqual(A[i], I[i], 0.01f)) ? 0 : 1;\n\t\t}\n\t}\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_affine();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_matrix_transform.cpp",
    "content": "#include <glm/gtc/matrix_transform.hpp>\n#include <glm/gtc/constants.hpp>\n\nint test_perspective()\n{\n\tint Error = 0;\n\n\tglm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, 0.1f, 100.0f);\n\n\treturn Error;\n}\n\nint test_pick()\n{\n\tint Error = 0;\n\n\tglm::mat4 Pick = glm::pickMatrix(glm::vec2(1, 2), glm::vec2(3, 4), glm::ivec4(0, 0, 320, 240));\n\n\treturn Error;\n}\n\nint test_tweakedInfinitePerspective()\n{\n\tint Error = 0;\n\n\tglm::mat4 ProjectionA = glm::tweakedInfinitePerspective(45.f, 640.f/480.f, 1.0f);\n\tglm::mat4 ProjectionB = glm::tweakedInfinitePerspective(45.f, 640.f/480.f, 1.0f, 0.001f);\n\n\n\treturn Error;\n}\n\nint test_translate()\n{\n\tint Error = 0;\n\n\tglm::lowp_vec3 v(1.0);\n\tglm::lowp_mat4 m(0);\n\tglm::lowp_mat4 t = glm::translate(m, v);\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_translate();\n\tError += test_tweakedInfinitePerspective();\n\tError += test_pick();\n\tError += test_perspective();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_noise.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/noise.hpp>\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtx/raw_data.hpp>\n\nint test_simplex()\n{\n\tint Error = 0;\n\n\tglm::u8vec4 const PixelSimplex2D(glm::byte(glm::abs(glm::simplex(glm::vec2(0.f, 0.f))) * 255.f));\n\tglm::u8vec4 const PixelSimplex3D(glm::byte(glm::abs(glm::simplex(glm::vec3(0.f, 0.f, 0.f))) * 255.f));\n\tglm::u8vec4 const PixelSimplex4D(glm::byte(glm::abs(glm::simplex(glm::vec4(0.f, 0.f, 0.f, 0.f))) * 255.f));\n\n\treturn Error;\n}\n\nint test_perlin()\n{\n\tint Error = 0;\n\n\tglm::u8vec4 const PixelPerlin2D(glm::byte(glm::abs(glm::perlin(glm::vec2(0.f, 0.f))) * 255.f));\n\tglm::u8vec4 const PixelPerlin3D(glm::byte(glm::abs(glm::perlin(glm::vec3(0.f, 0.f, 0.f))) * 255.f));\n\tglm::u8vec4 const PixelPerlin4D(glm::byte(glm::abs(glm::perlin(glm::vec4(0.f, 0.f, 0.f, 0.f))) * 255.f));\n\n\treturn Error;\n}\n\nint test_perlin_pedioric()\n{\n\tint Error = 0;\n\n\tglm::u8vec4 const PixelPeriodic2D(glm::byte(glm::abs(glm::perlin(glm::vec2(0.f, 0.f), glm::vec2(2.0f))) * 255.f));\n\tglm::u8vec4 const PixelPeriodic3D(glm::byte(glm::abs(glm::perlin(glm::vec3(0.f, 0.f, 0.f), glm::vec3(2.0f))) * 255.f));\n\tglm::u8vec4 const PixelPeriodic4D(glm::byte(glm::abs(glm::perlin(glm::vec4(0.f, 0.f, 0.f, 0.f), glm::vec4(2.0f))) * 255.f));\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_simplex();\n\tError += test_perlin();\n\tError += test_perlin_pedioric();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_packing.cpp",
    "content": "#include <glm/packing.hpp>\n#include <glm/gtc/packing.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <cstdio>\n#include <vector>\n\nvoid print_bits(float const& s)\n{\n\tunion\n\t{\n\t\tfloat f;\n\t\tunsigned int i;\n\t} uif;\n\n\tuif.f = s;\n\n\tprintf(\"f32: \");\n\tfor(std::size_t j = sizeof(s) * 8; j > 0; --j)\n\t{\n\t\tif(j == 23 || j == 31)\n\t\t\tprintf(\" \");\n\t\tprintf(\"%d\", (uif.i & (1 << (j - 1))) ? 1 : 0);\n\t}\n}\n\nvoid print_10bits(glm::uint const& s)\n{\n\tprintf(\"10b: \");\n\tfor(std::size_t j = 10; j > 0; --j)\n\t{\n\t\tif(j == 5)\n\t\t\tprintf(\" \");\n\t\tprintf(\"%d\", (s & (1 << (j - 1))) ? 1 : 0);\n\t}\n}\n\nvoid print_11bits(glm::uint const& s)\n{\n\tprintf(\"11b: \");\n\tfor(std::size_t j = 11; j > 0; --j)\n\t{\n\t\tif(j == 6)\n\t\t\tprintf(\" \");\n\t\tprintf(\"%d\", (s & (1 << (j - 1))) ? 1 : 0);\n\t}\n}\n\nvoid print_value(float const& s)\n{\n\tprintf(\"%2.5f, \", static_cast<double>(s));\n\tprint_bits(s);\n\tprintf(\", \");\n//\tprint_11bits(detail::floatTo11bit(s));\n//\tprintf(\", \");\n//\tprint_10bits(detail::floatTo10bit(s));\n\tprintf(\"\\n\");\n}\n\nint test_Half1x16()\n{\n\tint Error = 0;\n\n\tstd::vector<float> Tests;\n\tTests.push_back(0.0f);\n\tTests.push_back(1.0f);\n\tTests.push_back(-1.0f);\n\tTests.push_back(2.0f);\n\tTests.push_back(-2.0f);\n\tTests.push_back(1.9f);\n\n\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t{\n\t\tglm::uint16 p0 = glm::packHalf1x16(Tests[i]);\n\t\tfloat v0 = glm::unpackHalf1x16(p0);\n\t\tglm::uint16 p1 = glm::packHalf1x16(v0);\n\t\tfloat v1 = glm::unpackHalf1x16(p1);\n\t\tError += glm::epsilonEqual(v0, v1, glm::epsilon<float>()) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_Half4x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec4> Tests;\n\tTests.push_back(glm::vec4(1.0f));\n\tTests.push_back(glm::vec4(0.0f));\n\tTests.push_back(glm::vec4(2.0f));\n\tTests.push_back(glm::vec4(0.1f));\n\tTests.push_back(glm::vec4(0.5f));\n\tTests.push_back(glm::vec4(-0.9f));\n\n\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t{\n\t\tglm::uint64 p0 = glm::packHalf4x16(Tests[i]);\n\t\tglm::vec4 v0 = glm::unpackHalf4x16(p0);\n\t\tglm::uint64 p1 = glm::packHalf4x16(v0);\n\t\tglm::vec4 v1 = glm::unpackHalf4x16(p1);\n\t\tglm::u16vec4 p2 = glm::packHalf(v0);\n\t\tglm::vec4 v2 = glm::unpackHalf(p2);\n\n\t\tError += glm::all(glm::equal(v0, v1)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v0, v2)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_I3x10_1x2()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::ivec4> Tests;\n\tTests.push_back(glm::ivec4(0));\n\tTests.push_back(glm::ivec4(1));\n\tTests.push_back(glm::ivec4(-1));\n\tTests.push_back(glm::ivec4(2));\n\tTests.push_back(glm::ivec4(-2));\n\tTests.push_back(glm::ivec4(3));\n\n\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t{\n\t\tglm::uint32 p0 = glm::packI3x10_1x2(Tests[i]);\n\t\tglm::ivec4 v0 = glm::unpackI3x10_1x2(p0);\n\t\tglm::uint32 p1 = glm::packI3x10_1x2(v0);\n\t\tglm::ivec4 v1 = glm::unpackI3x10_1x2(p1);\n\t\tError += glm::all(glm::equal(v0, v1)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_U3x10_1x2()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::uvec4> Tests;\n\tTests.push_back(glm::uvec4(0));\n\tTests.push_back(glm::uvec4(1));\n\tTests.push_back(glm::uvec4(2));\n\tTests.push_back(glm::uvec4(3));\n\tTests.push_back(glm::uvec4(4));\n\tTests.push_back(glm::uvec4(5));\n\n\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t{\n\t\tglm::uint32 p0 = glm::packU3x10_1x2(Tests[i]);\n\t\tglm::uvec4 v0 = glm::unpackU3x10_1x2(p0);\n\t\tglm::uint32 p1 = glm::packU3x10_1x2(v0);\n\t\tglm::uvec4 v1 = glm::unpackU3x10_1x2(p1);\n\t\tError += glm::all(glm::equal(v0, v1)) ? 0 : 1;\n\t}\n\n\tglm::u8vec4 const v0(0xff, 0x77, 0x0, 0x33);\n\tglm::uint32 const p0 = *reinterpret_cast<glm::uint32 const*>(&v0[0]);\n\tglm::uint32 const r0 = 0x330077ff;\n\n\tError += p0 == r0 ? 0 : 1;\n\n\tglm::uvec4 const v1(0xff, 0x77, 0x0, 0x33);\n\tglm::uint32 const p1 = glm::packU3x10_1x2(v1);\n\tglm::uint32 const r1 = 0xc001dcff;\n\n\tError += p1 == r1 ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_Snorm3x10_1x2()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec4> Tests;\n\tTests.push_back(glm::vec4(1.0f));\n\tTests.push_back(glm::vec4(0.0f));\n\tTests.push_back(glm::vec4(2.0f));\n\tTests.push_back(glm::vec4(0.1f));\n\tTests.push_back(glm::vec4(0.5f));\n\tTests.push_back(glm::vec4(0.9f));\n\n\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t{\n\t\tglm::uint32 p0 = glm::packSnorm3x10_1x2(Tests[i]);\n\t\tglm::vec4 v0 = glm::unpackSnorm3x10_1x2(p0);\n\t\tglm::uint32 p1 = glm::packSnorm3x10_1x2(v0);\n\t\tglm::vec4 v1 = glm::unpackSnorm3x10_1x2(p1);\n\n\t\tError += glm::all(glm::epsilonEqual(v0, v1, 0.01f)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_Unorm3x10_1x2()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec4> Tests;\n\tTests.push_back(glm::vec4(1.0f));\n\tTests.push_back(glm::vec4(0.0f));\n\tTests.push_back(glm::vec4(2.0f));\n\tTests.push_back(glm::vec4(0.1f));\n\tTests.push_back(glm::vec4(0.5f));\n\tTests.push_back(glm::vec4(0.9f));\n\n\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t{\n\t\tglm::uint32 p0 = glm::packUnorm3x10_1x2(Tests[i]);\n\t\tglm::vec4 v0 = glm::unpackUnorm3x10_1x2(p0);\n\t\tglm::uint32 p1 = glm::packUnorm3x10_1x2(v0);\n\t\tglm::vec4 v1 = glm::unpackUnorm3x10_1x2(p1);\n\n\t\tError += glm::all(glm::epsilonEqual(v0, v1, 0.001f)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_F2x11_1x10()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec3> Tests;\n\tTests.push_back(glm::vec3(1.0f));\n\tTests.push_back(glm::vec3(0.0f));\n\tTests.push_back(glm::vec3(2.0f));\n\tTests.push_back(glm::vec3(0.1f));\n\tTests.push_back(glm::vec3(0.5f));\n\tTests.push_back(glm::vec3(0.9f));\n\n\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t{\n\t\tglm::uint32 p0 = glm::packF2x11_1x10(Tests[i]);\n\t\tglm::vec3 v0 = glm::unpackF2x11_1x10(p0);\n\t\tglm::uint32 p1 = glm::packF2x11_1x10(v0);\n\t\tglm::vec3 v1 = glm::unpackF2x11_1x10(p1);\n\t\tError += glm::all(glm::equal(v0, v1)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_F3x9_E1x5()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec3> Tests;\n\tTests.push_back(glm::vec3(1.0f));\n\tTests.push_back(glm::vec3(0.0f));\n\tTests.push_back(glm::vec3(2.0f));\n\tTests.push_back(glm::vec3(0.1f));\n\tTests.push_back(glm::vec3(0.5f));\n\tTests.push_back(glm::vec3(0.9f));\n\n\tfor(std::size_t i = 0; i < Tests.size(); ++i)\n\t{\n\t\tglm::uint32 p0 = glm::packF3x9_E1x5(Tests[i]);\n\t\tglm::vec3 v0 = glm::unpackF3x9_E1x5(p0);\n\t\tglm::uint32 p1 = glm::packF3x9_E1x5(v0);\n\t\tglm::vec3 v1 = glm::unpackF3x9_E1x5(p1);\n\t\tError += glm::all(glm::epsilonEqual(v0, v1, 0.01f)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_RGBM()\n{\n\tint Error = 0;\n\n\tfor(std::size_t i = 0; i < 1024; ++i)\n\t{\n\t\tglm::vec3 const Color(static_cast<float>(i));\n\t\tglm::vec4 const RGBM = glm::packRGBM(Color);\n\t\tglm::vec3 const Result= glm::unpackRGBM(RGBM);\n\n\t\tError += glm::all(glm::epsilonEqual(Color, Result, 0.01f)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_packUnorm1x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec1> A;\n\tA.push_back(glm::vec1(1.0f));\n\tA.push_back(glm::vec1(0.5f));\n\tA.push_back(glm::vec1(0.1f));\n\tA.push_back(glm::vec1(0.0f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec1 B(A[i]);\n\t\tglm::uint16 C = glm::packUnorm1x16(B.x);\n\t\tglm::vec1 D(glm::unpackUnorm1x16(C));\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 65535.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packSnorm1x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec1> A;\n\tA.push_back(glm::vec1( 1.0f));\n\tA.push_back(glm::vec1( 0.0f));\n\tA.push_back(glm::vec1(-0.5f));\n\tA.push_back(glm::vec1(-0.1f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec1 B(A[i]);\n\t\tglm::uint16 C = glm::packSnorm1x16(B.x);\n\t\tglm::vec1 D(glm::unpackSnorm1x16(C));\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;\n\t}\n\t\n\treturn Error;\n}\n\nint test_packUnorm2x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2(1.0f, 0.0f));\n\tA.push_back(glm::vec2(0.5f, 0.7f));\n\tA.push_back(glm::vec2(0.1f, 0.2f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::uint32 C = glm::packUnorm2x16(B);\n\t\tglm::vec2 D = glm::unpackUnorm2x16(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 65535.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packSnorm2x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2( 1.0f, 0.0f));\n\tA.push_back(glm::vec2(-0.5f,-0.7f));\n\tA.push_back(glm::vec2(-0.1f, 0.1f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::uint32 C = glm::packSnorm2x16(B);\n\t\tglm::vec2 D = glm::unpackSnorm2x16(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packUnorm4x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec4> A;\n\tA.push_back(glm::vec4(1.0f));\n\tA.push_back(glm::vec4(0.5f));\n\tA.push_back(glm::vec4(0.1f));\n\tA.push_back(glm::vec4(0.0f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec4 B(A[i]);\n\t\tglm::uint64 C = glm::packUnorm4x16(B);\n\t\tglm::vec4 D(glm::unpackUnorm4x16(C));\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 65535.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packSnorm4x16()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec4> A;\n\tA.push_back(glm::vec4( 1.0f, 0.0f, -0.5f, 0.5f));\n\tA.push_back(glm::vec4(-0.3f,-0.7f,  0.3f, 0.7f));\n\tA.push_back(glm::vec4(-0.1f, 0.1f, -0.2f, 0.2f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec4 B(A[i]);\n\t\tglm::uint64 C = glm::packSnorm4x16(B);\n\t\tglm::vec4 D(glm::unpackSnorm4x16(C));\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packUnorm1x8()\n{\n\tint Error = 0;\n\t\n\tstd::vector<glm::vec1> A;\n\tA.push_back(glm::vec1(1.0f));\n\tA.push_back(glm::vec1(0.5f));\n\tA.push_back(glm::vec1(0.0f));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec1 B(A[i]);\n\t\tglm::uint8 C = glm::packUnorm1x8(B.x);\n\t\tglm::vec1 D(glm::unpackUnorm1x8(C));\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packSnorm1x8()\n{\n\tint Error = 0;\n\t\n\tstd::vector<glm::vec1> A;\n\tA.push_back(glm::vec1( 1.0f));\n\tA.push_back(glm::vec1(-0.7f));\n\tA.push_back(glm::vec1(-1.0f));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec1 B(A[i]);\n\t\tglm::uint8 C = glm::packSnorm1x8(B.x);\n\t\tglm::vec1 D(glm::unpackSnorm1x8(C));\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 127.f)) ? 0 : 1;\n\t}\n\t\n\treturn Error;\n}\n\nint test_packUnorm2x8()\n{\n\tint Error = 0;\n\t\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2(1.0f, 0.7f));\n\tA.push_back(glm::vec2(0.5f, 0.1f));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::uint16 C = glm::packUnorm2x8(B);\n\t\tglm::vec2 D = glm::unpackUnorm2x8(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packSnorm2x8()\n{\n\tint Error = 0;\n\t\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2( 1.0f, 0.0f));\n\tA.push_back(glm::vec2(-0.7f,-0.1f));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::uint16 C = glm::packSnorm2x8(B);\n\t\tglm::vec2 D = glm::unpackSnorm2x8(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 127.f)) ? 0 : 1;\n\t}\n\t\n\treturn Error;\n}\n\nint test_packUnorm4x8()\n{\n\tint Error = 0;\n\t\n\tstd::vector<glm::vec4> A;\n\tA.push_back(glm::vec4(1.0f, 0.7f, 0.3f, 0.0f));\n\tA.push_back(glm::vec4(0.5f, 0.1f, 0.2f, 0.3f));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec4 B(A[i]);\n\t\tglm::uint32 C = glm::packUnorm4x8(B);\n\t\tglm::vec4 D = glm::unpackUnorm4x8(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packSnorm4x8()\n{\n\tint Error = 0;\n\t\n\tstd::vector<glm::vec4> A;\n\tA.push_back(glm::vec4( 1.0f, 0.0f,-0.5f,-1.0f));\n\tA.push_back(glm::vec4(-0.7f,-0.1f, 0.1f, 0.7f));\n\t\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec4 B(A[i]);\n\t\tglm::uint32 C = glm::packSnorm4x8(B);\n\t\tglm::vec4 D = glm::unpackSnorm4x8(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 127.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\t\n\treturn Error;\n}\n\nint test_packUnorm()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2(1.0f, 0.7f));\n\tA.push_back(glm::vec2(0.5f, 0.1f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::u16vec2 C = glm::packUnorm<glm::uint16>(B);\n\t\tglm::vec2 D = glm::unpackUnorm<float>(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 255.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_packSnorm()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2( 1.0f, 0.0f));\n\tA.push_back(glm::vec2(-0.5f,-0.7f));\n\tA.push_back(glm::vec2(-0.1f, 0.1f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::i16vec2 C = glm::packSnorm<glm::int16>(B);\n\t\tglm::vec2 D = glm::unpackSnorm<float>(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 32767.0f * 2.0f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_packUnorm2x4()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec2> A;\n\tA.push_back(glm::vec2(1.0f, 0.7f));\n\tA.push_back(glm::vec2(0.5f, 0.0f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec2 B(A[i]);\n\t\tglm::uint8 C = glm::packUnorm2x4(B);\n\t\tglm::vec2 D = glm::unpackUnorm2x4(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 15.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_packUnorm4x4()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec4> A;\n\tA.push_back(glm::vec4(1.0f, 0.7f, 0.5f, 0.0f));\n\tA.push_back(glm::vec4(0.5f, 0.1f, 0.0f, 1.0f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec4 B(A[i]);\n\t\tglm::uint16 C = glm::packUnorm4x4(B);\n\t\tglm::vec4 D = glm::unpackUnorm4x4(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 15.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_packUnorm3x5_1x1()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec4> A;\n\tA.push_back(glm::vec4(1.0f, 0.7f, 0.5f, 0.0f));\n\tA.push_back(glm::vec4(0.5f, 0.1f, 0.0f, 1.0f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec4 B(A[i]);\n\t\tglm::uint16 C = glm::packUnorm3x5_1x1(B);\n\t\tglm::vec4 D = glm::unpackUnorm3x5_1x1(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 15.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_packUnorm1x5_1x6_1x5()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec3> A;\n\tA.push_back(glm::vec3(1.0f, 0.7f, 0.5f));\n\tA.push_back(glm::vec3(0.5f, 0.1f, 0.0f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec3 B(A[i]);\n\t\tglm::uint16 C = glm::packUnorm1x5_1x6_1x5(B);\n\t\tglm::vec3 D = glm::unpackUnorm1x5_1x6_1x5(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 15.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_packUnorm2x3_1x2()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::vec3> A;\n\tA.push_back(glm::vec3(1.0f, 0.7f, 0.5f));\n\tA.push_back(glm::vec3(0.5f, 0.1f, 0.0f));\n\n\tfor(std::size_t i = 0; i < A.size(); ++i)\n\t{\n\t\tglm::vec3 B(A[i]);\n\t\tglm::uint8 C = glm::packUnorm2x3_1x2(B);\n\t\tglm::vec3 D = glm::unpackUnorm2x3_1x2(C);\n\t\tError += glm::all(glm::epsilonEqual(B, D, 1.0f / 3.f)) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_packUint2x8()\n{\n\tint Error = 0;\n\n\tglm::u8vec2 const Source(1, 2);\n\n\tglm::uint16 const Packed = glm::packUint2x8(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::u8vec2 const Unpacked = glm::unpackUint2x8(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packUint4x8()\n{\n\tint Error = 0;\n\n\tglm::u8vec4 const Source(1, 2, 3, 4);\n\n\tglm::uint32 const Packed = glm::packUint4x8(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::u8vec4 const Unpacked = glm::unpackUint4x8(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packUint2x16()\n{\n\tint Error = 0;\n\n\tglm::u16vec2 const Source(1, 2);\n\n\tglm::uint32 const Packed = glm::packUint2x16(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::u16vec2 const Unpacked = glm::unpackUint2x16(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packUint4x16()\n{\n\tint Error = 0;\n\n\tglm::u16vec4 const Source(1, 2, 3, 4);\n\n\tglm::uint64 const Packed = glm::packUint4x16(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::u16vec4 const Unpacked = glm::unpackUint4x16(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packUint2x32()\n{\n\tint Error = 0;\n\n\tglm::u32vec2 const Source(1, 2);\n\n\tglm::uint64 const Packed = glm::packUint2x32(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::u32vec2 const Unpacked = glm::unpackUint2x32(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packInt2x8()\n{\n\tint Error = 0;\n\n\tglm::i8vec2 const Source(1, 2);\n\n\tglm::int16 const Packed = glm::packInt2x8(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::i8vec2 const Unpacked = glm::unpackInt2x8(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packInt4x8()\n{\n\tint Error = 0;\n\n\tglm::i8vec4 const Source(1, 2, 3, 4);\n\n\tglm::int32 const Packed = glm::packInt4x8(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::i8vec4 const Unpacked = glm::unpackInt4x8(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packInt2x16()\n{\n\tint Error = 0;\n\n\tglm::i16vec2 const Source(1, 2);\n\n\tglm::int32 const Packed = glm::packInt2x16(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::i16vec2 const Unpacked = glm::unpackInt2x16(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packInt4x16()\n{\n\tint Error = 0;\n\n\tglm::i16vec4 const Source(1, 2, 3, 4);\n\n\tglm::int64 const Packed = glm::packInt4x16(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::i16vec4 const Unpacked = glm::unpackInt4x16(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_packInt2x32()\n{\n\tint Error = 0;\n\n\tglm::i32vec2 const Source(1, 2);\n\n\tglm::int64 const Packed = glm::packInt2x32(Source);\n\tError += Packed != 0 ? 0 : 1;\n\n\tglm::i32vec2 const Unpacked = glm::unpackInt2x32(Packed);\n\tError += Source == Unpacked ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_packUnorm();\n\tError += test_packSnorm();\n\n\tError += test_packSnorm1x16();\n\tError += test_packSnorm2x16();\n\tError += test_packSnorm4x16();\n\n\tError += test_packSnorm1x8();\n\tError += test_packSnorm2x8();\n\tError += test_packSnorm4x8();\n\n\tError += test_packUnorm1x16();\n\tError += test_packUnorm2x16();\n\tError += test_packUnorm4x16();\n\n\tError += test_packUnorm1x8();\n\tError += test_packUnorm2x8();\n\tError += test_packUnorm4x8();\n\n\tError += test_packUnorm2x4();\n\tError += test_packUnorm4x4();\n\tError += test_packUnorm3x5_1x1();\n\tError += test_packUnorm1x5_1x6_1x5();\n\tError += test_packUnorm2x3_1x2();\n\n\tError += test_packUint2x8();\n\tError += test_packUint4x8();\n\tError += test_packUint2x16();\n\tError += test_packUint4x16();\n\tError += test_packUint2x32();\n\n\tError += test_packInt2x8();\n\tError += test_packInt4x8();\n\tError += test_packInt2x16();\n\tError += test_packInt4x16();\n\tError += test_packInt2x32();\n\n\tError += test_F2x11_1x10();\n\tError += test_F3x9_E1x5();\n\tError += test_RGBM();\n\tError += test_Unorm3x10_1x2();\n\tError += test_Snorm3x10_1x2();\n\n\tError += test_I3x10_1x2();\n\tError += test_U3x10_1x2();\n\tError += test_Half1x16();\n\tError += test_Half4x16();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_quaternion.cpp",
    "content": "#include <glm/gtc/quaternion.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/vector_relational.hpp>\n#include <vector>\n\nint test_quat_angle()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::quat Q = glm::angleAxis(glm::pi<float>() * 0.25f, glm::vec3(0, 0, 1));\n\t\tglm::quat N = glm::normalize(Q);\n\t\tfloat L = glm::length(N);\n\t\tError += glm::epsilonEqual(L, 1.0f, 0.01f) ? 0 : 1;\n\t\tfloat A = glm::angle(N);\n\t\tError += glm::epsilonEqual(A, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\t}\n\t{\n\t\tglm::quat Q = glm::angleAxis(glm::pi<float>() * 0.25f, glm::normalize(glm::vec3(0, 1, 1)));\n\t\tglm::quat N = glm::normalize(Q);\n\t\tfloat L = glm::length(N);\n\t\tError += glm::epsilonEqual(L, 1.0f, 0.01f) ? 0 : 1;\n\t\tfloat A = glm::angle(N);\n\t\tError += glm::epsilonEqual(A, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\t}\n\t{\n\t\tglm::quat Q = glm::angleAxis(glm::pi<float>() * 0.25f, glm::normalize(glm::vec3(1, 2, 3)));\n\t\tglm::quat N = glm::normalize(Q);\n\t\tfloat L = glm::length(N);\n\t\tError += glm::epsilonEqual(L, 1.0f, 0.01f) ? 0 : 1;\n\t\tfloat A = glm::angle(N);\n\t\tError += glm::epsilonEqual(A, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_quat_angleAxis()\n{\n\tint Error = 0;\n\n\tglm::quat A = glm::angleAxis(0.f, glm::vec3(0.f, 0.f, 1.f));\n\tglm::quat B = glm::angleAxis(glm::pi<float>() * 0.5f, glm::vec3(0, 0, 1));\n\tglm::quat C = glm::mix(A, B, 0.5f);\n\tglm::quat D = glm::angleAxis(glm::pi<float>() * 0.25f, glm::vec3(0, 0, 1));\n\n\tError += glm::epsilonEqual(C.x, D.x, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.y, D.y, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.z, D.z, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.w, D.w, 0.01f) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_quat_mix()\n{\n\tint Error = 0;\n\n\tglm::quat A = glm::angleAxis(0.f, glm::vec3(0.f, 0.f, 1.f));\n\tglm::quat B = glm::angleAxis(glm::pi<float>() * 0.5f, glm::vec3(0, 0, 1));\n\tglm::quat C = glm::mix(A, B, 0.5f);\n\tglm::quat D = glm::angleAxis(glm::pi<float>() * 0.25f, glm::vec3(0, 0, 1));\n\n\tError += glm::epsilonEqual(C.x, D.x, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.y, D.y, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.z, D.z, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.w, D.w, 0.01f) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_quat_precision()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::lowp_quat) <= sizeof(glm::mediump_quat) ? 0 : 1;\n\tError += sizeof(glm::mediump_quat) <= sizeof(glm::highp_quat) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_quat_normalize()\n{\n\tint Error(0);\n\n\t{\n\t\tglm::quat Q = glm::angleAxis(glm::pi<float>() * 0.25f, glm::vec3(0, 0, 1));\n\t\tglm::quat N = glm::normalize(Q);\n\t\tfloat L = glm::length(N);\n\t\tError += glm::epsilonEqual(L, 1.0f, 0.000001f) ? 0 : 1;\n\t}\n\t{\n\t\tglm::quat Q = glm::angleAxis(glm::pi<float>() * 0.25f, glm::vec3(0, 0, 2));\n\t\tglm::quat N = glm::normalize(Q);\n\t\tfloat L = glm::length(N);\n\t\tError += glm::epsilonEqual(L, 1.0f, 0.000001f) ? 0 : 1;\n\t}\n\t{\n\t\tglm::quat Q = glm::angleAxis(glm::pi<float>() * 0.25f, glm::vec3(1, 2, 3));\n\t\tglm::quat N = glm::normalize(Q);\n\t\tfloat L = glm::length(N);\n\t\tError += glm::epsilonEqual(L, 1.0f, 0.000001f) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_quat_euler()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::quat q(1.0f, 0.0f, 0.0f, 1.0f);\n\t\tfloat Roll = glm::roll(q);\n\t\tfloat Pitch = glm::pitch(q);\n\t\tfloat Yaw = glm::yaw(q);\n\t\tglm::vec3 Angles = glm::eulerAngles(q);\n\t\tError += glm::all(glm::epsilonEqual(Angles, glm::vec3(Pitch, Yaw, Roll), 0.000001f)) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::dquat q(1.0, 0.0, 0.0, 1.0);\n\t\tdouble Roll = glm::roll(q);\n\t\tdouble Pitch = glm::pitch(q);\n\t\tdouble Yaw = glm::yaw(q);\n\t\tglm::dvec3 Angles = glm::eulerAngles(q);\n\t\tError += glm::all(glm::epsilonEqual(Angles, glm::dvec3(Pitch, Yaw, Roll), 0.000001)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_quat_slerp()\n{\n\tint Error = 0;\n\n\tfloat const Epsilon = 0.0001f;//glm::epsilon<float>();\n\n\tfloat sqrt2 = std::sqrt(2.0f)/2.0f;\n\tglm::quat id(static_cast<float>(1), static_cast<float>(0), static_cast<float>(0), static_cast<float>(0));\n\tglm::quat Y90rot(sqrt2, 0.0f, sqrt2, 0.0f);\n\tglm::quat Y180rot(0.0f, 0.0f, 1.0f, 0.0f);\n\n\t// Testing a == 0\n\t// Must be id\n\tglm::quat id2 = glm::slerp(id, Y90rot, 0.0f);\n\tError += glm::all(glm::epsilonEqual(id, id2, Epsilon)) ? 0 : 1;\n\n\t// Testing a == 1\n\t// Must be 90 rotation on Y : 0 0.7 0 0.7\n\tglm::quat Y90rot2 = glm::slerp(id, Y90rot, 1.0f);\n\tError += glm::all(glm::epsilonEqual(Y90rot, Y90rot2, Epsilon)) ? 0 : 1;\n\n\t// Testing standard, easy case\n\t// Must be 45 rotation on Y : 0 0.38 0 0.92\n\tglm::quat Y45rot1 = glm::slerp(id, Y90rot, 0.5f);\n\n\t// Testing reverse case\n\t// Must be 45 rotation on Y : 0 0.38 0 0.92\n\tglm::quat Ym45rot2 = glm::slerp(Y90rot, id, 0.5f);\n\n\t// Testing against full circle around the sphere instead of shortest path\n\t// Must be 45 rotation on Y\n\t// certainly not a 135 rotation\n\tglm::quat Y45rot3 = glm::slerp(id , -Y90rot, 0.5f);\n\tfloat Y45angle3 = glm::angle(Y45rot3);\n\tError += glm::epsilonEqual(Y45angle3, glm::pi<float>() * 0.25f, Epsilon) ? 0 : 1;\n\tError += glm::all(glm::epsilonEqual(Ym45rot2, Y45rot3, Epsilon)) ? 0 : 1;\n\n\t// Same, but inverted\n\t// Must also be 45 rotation on Y :  0 0.38 0 0.92\n\t// -0 -0.38 -0 -0.92 is ok too\n\tglm::quat Y45rot4 = glm::slerp(-Y90rot, id, 0.5f);\n\tError += glm::all(glm::epsilonEqual(Ym45rot2, -Y45rot4, Epsilon)) ? 0 : 1;\n\n\t// Testing q1 = q2\n\t// Must be 90 rotation on Y : 0 0.7 0 0.7\n\tglm::quat Y90rot3 = glm::slerp(Y90rot, Y90rot, 0.5f);\n\tError += glm::all(glm::epsilonEqual(Y90rot, Y90rot3, Epsilon)) ? 0 : 1;\n\n\t// Testing 180 rotation\n\t// Must be 90 rotation on almost any axis that is on the XZ plane\n\tglm::quat XZ90rot = glm::slerp(id, -Y90rot, 0.5f);\n\tfloat XZ90angle = glm::angle(XZ90rot); // Must be PI/4 = 0.78;\n\tError += glm::epsilonEqual(XZ90angle, glm::pi<float>() * 0.25f, Epsilon) ? 0 : 1;\n\n\t// Testing almost equal quaternions (this test should pass through the linear interpolation)\n\t// Must be 0 0.00X 0 0.99999\n\tglm::quat almostid = glm::slerp(id, glm::angleAxis(0.1f, glm::vec3(0.0f, 1.0f, 0.0f)), 0.5f);\n\n\t// Testing quaternions with opposite sign\n\t{\n\t\tglm::quat a(-1, 0, 0, 0);\n\n\t\tglm::quat result = glm::slerp(a, id, 0.5f);\n\n\t\tError += glm::epsilonEqual(glm::pow(glm::dot(id, result), 2.f), 1.f, 0.01f) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_quat_mul()\n{\n\tint Error(0);\n\n\tglm::quat temp1 = glm::normalize(glm::quat(1.0f, glm::vec3(0.0, 1.0, 0.0)));\n\tglm::quat temp2 = glm::normalize(glm::quat(0.5f, glm::vec3(1.0, 0.0, 0.0)));\n\n\tglm::vec3 transformed0 = (temp1 * glm::vec3(0.0, 1.0, 0.0) * glm::inverse(temp1));\n\tglm::vec3 temp4 = temp2 * transformed0 * glm::inverse(temp2);\n\n\tglm::quat temp5 = glm::normalize(temp1 * temp2);\n\tglm::vec3 temp6 = temp5 * glm::vec3(0.0, 1.0, 0.0) * glm::inverse(temp5);\n\n\tglm::quat temp7(1.0f, glm::vec3(0.0, 1.0, 0.0));\n\n\ttemp7 *= temp5;\n\ttemp7 *= glm::inverse(temp5);\n\n\tError += temp7 != glm::quat(1.0f, glm::vec3(0.0, 1.0, 0.0));\n\n\treturn Error;\n}\n\nint test_quat_two_axis_ctr()\n{\n\tint Error = 0;\n\n\tglm::quat const q1(glm::vec3(1, 0, 0), glm::vec3(0, 1, 0));\n\tglm::vec3 const v1 = q1 * glm::vec3(1, 0, 0);\n\tError += glm::all(glm::epsilonEqual(v1, glm::vec3(0, 1, 0), 0.0001f)) ? 0 : 1;\n\n\tglm::quat const q2 = q1 * q1;\n\tglm::vec3 const v2 = q2 * glm::vec3(1, 0, 0);\n\tError += glm::all(glm::epsilonEqual(v2, glm::vec3(-1, 0, 0), 0.0001f)) ? 0 : 1;\n\n\tglm::quat const q3(glm::vec3(1, 0, 0), glm::vec3(-1, 0, 0));\n\tglm::vec3 const v3 = q3 * glm::vec3(1, 0, 0);\n\tError += glm::all(glm::epsilonEqual(v3, glm::vec3(-1, 0, 0), 0.0001f)) ? 0 : 1;\n\n\tglm::quat const q4(glm::vec3(0, 1, 0), glm::vec3(0, -1, 0));\n\tglm::vec3 const v4 = q4 * glm::vec3(0, 1, 0);\n\tError += glm::all(glm::epsilonEqual(v4, glm::vec3(0, -1, 0), 0.0001f)) ? 0 : 1;\n\n\tglm::quat const q5(glm::vec3(0, 0, 1), glm::vec3(0, 0, -1));\n\tglm::vec3 const v5 = q5 * glm::vec3(0, 0, 1);\n\tError += glm::all(glm::epsilonEqual(v5, glm::vec3(0, 0, -1), 0.0001f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_quat_mul_vec()\n{\n\tint Error(0);\n\n\tglm::quat q = glm::angleAxis(glm::pi<float>() * 0.5f, glm::vec3(0, 0, 1));\n\tglm::vec3 v(1, 0, 0);\n\tglm::vec3 u(q * v);\n\tglm::vec3 w(u * q);\n\n\tError += glm::all(glm::epsilonEqual(v, w, 0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_quat_ctr()\n{\n\tint Error(0);\n\n#\tif GLM_HAS_TRIVIAL_QUERIES\n\t//\tError += std::is_trivially_default_constructible<glm::quat>::value ? 0 : 1;\n\t//\tError += std::is_trivially_default_constructible<glm::dquat>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::quat>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::dquat>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::quat>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::dquat>::value ? 0 : 1;\n\n\t\tError += std::is_copy_constructible<glm::quat>::value ? 0 : 1;\n\t\tError += std::is_copy_constructible<glm::dquat>::value ? 0 : 1;\n#\tendif\n\n#\tif GLM_HAS_INITIALIZER_LISTS\n\t{\n\t\tglm::quat A{0, 1, 2, 3};\n\n\t\tstd::vector<glm::quat> B{\n\t\t\t{0, 1, 2, 3},\n\t\t\t{0, 1, 2, 3}};\n\t}\n#\tendif//GLM_HAS_INITIALIZER_LISTS\n\n\treturn Error;\n}\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 16 == sizeof(glm::quat) ? 0 : 1;\n\tError += 32 == sizeof(glm::dquat) ? 0 : 1;\n\tError += glm::quat().length() == 4 ? 0 : 1;\n\tError += glm::dquat().length() == 4 ? 0 : 1;\n\tError += glm::quat::length() == 4 ? 0 : 1;\n\tError += glm::dquat::length() == 4 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_quat_ctr();\n\tError += test_quat_mul_vec();\n\tError += test_quat_two_axis_ctr();\n\tError += test_quat_mul();\n\tError += test_quat_precision();\n\tError += test_quat_angle();\n\tError += test_quat_angleAxis();\n\tError += test_quat_mix();\n\tError += test_quat_normalize();\n\tError += test_quat_euler();\n\tError += test_quat_slerp();\n\tError += test_size();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_random.cpp",
    "content": "#include <glm/gtc/random.hpp>\n#include <glm/gtc/epsilon.hpp>\n#if GLM_LANG & GLM_LANG_CXX0X_FLAG\n#\tinclude <array>\n#endif\n\nstd::size_t const TestSamples = 10000;\n\nint test_linearRand()\n{\n\tint Error = 0;\n\n\tglm::int32 const Min = 16;\n\tglm::int32 const Max = 32;\n\n\t{\n\t\tglm::u8vec2 AMin(std::numeric_limits<glm::u8>::max());\n\t\tglm::u8vec2 AMax(std::numeric_limits<glm::u8>::min());\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t\t{\n\t\t\t\tglm::u8vec2 A = glm::linearRand(glm::u8vec2(Min), glm::u8vec2(Max));\n\t\t\t\tAMin = glm::min(AMin, A);\n\t\t\t\tAMax = glm::max(AMax, A);\n\n\t\t\t\tif(!glm::all(glm::lessThanEqual(A, glm::u8vec2(Max))))\n\t\t\t\t\t++Error;\n\t\t\t\tif(!glm::all(glm::greaterThanEqual(A, glm::u8vec2(Min))))\n\t\t\t\t\t++Error;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\n\t\t\tError += glm::all(glm::equal(AMin, glm::u8vec2(Min))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(AMax, glm::u8vec2(Max))) ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\n\t\tglm::u16vec2 BMin(std::numeric_limits<glm::u16>::max());\n\t\tglm::u16vec2 BMax(std::numeric_limits<glm::u16>::min());\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t\t{\n\t\t\t\tglm::u16vec2 B = glm::linearRand(glm::u16vec2(Min), glm::u16vec2(Max));\n\t\t\t\tBMin = glm::min(BMin, B);\n\t\t\t\tBMax = glm::max(BMax, B);\n\n\t\t\t\tif(!glm::all(glm::lessThanEqual(B, glm::u16vec2(Max))))\n\t\t\t\t\t++Error;\n\t\t\t\tif(!glm::all(glm::greaterThanEqual(B, glm::u16vec2(Min))))\n\t\t\t\t\t++Error;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\n\t\t\tError += glm::all(glm::equal(BMin, glm::u16vec2(Min))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(BMax, glm::u16vec2(Max))) ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\n\t\tglm::u32vec2 CMin(std::numeric_limits<glm::u32>::max());\n\t\tglm::u32vec2 CMax(std::numeric_limits<glm::u32>::min());\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t\t{\n\t\t\t\tglm::u32vec2 C = glm::linearRand(glm::u32vec2(Min), glm::u32vec2(Max));\n\t\t\t\tCMin = glm::min(CMin, C);\n\t\t\t\tCMax = glm::max(CMax, C);\n\n\t\t\t\tif(!glm::all(glm::lessThanEqual(C, glm::u32vec2(Max))))\n\t\t\t\t\t++Error;\n\t\t\t\tif(!glm::all(glm::greaterThanEqual(C, glm::u32vec2(Min))))\n\t\t\t\t\t++Error;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\n\t\t\tError += glm::all(glm::equal(CMin, glm::u32vec2(Min))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(CMax, glm::u32vec2(Max))) ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\n\t\tglm::u64vec2 DMin(std::numeric_limits<glm::u64>::max());\n\t\tglm::u64vec2 DMax(std::numeric_limits<glm::u64>::min());\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t\t{\n\t\t\t\tglm::u64vec2 D = glm::linearRand(glm::u64vec2(Min), glm::u64vec2(Max));\n\t\t\t\tDMin = glm::min(DMin, D);\n\t\t\t\tDMax = glm::max(DMax, D);\n\n\t\t\t\tif(!glm::all(glm::lessThanEqual(D, glm::u64vec2(Max))))\n\t\t\t\t\t++Error;\n\t\t\t\tif(!glm::all(glm::greaterThanEqual(D, glm::u64vec2(Min))))\n\t\t\t\t\t++Error;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\n\t\t\tError += glm::all(glm::equal(DMin, glm::u64vec2(Min))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(DMax, glm::u64vec2(Max))) ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\t}\n\n\t{\n\t\tglm::i8vec2 AMin(std::numeric_limits<glm::i8>::max());\n\t\tglm::i8vec2 AMax(std::numeric_limits<glm::i8>::min());\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t\t{\n\t\t\t\tglm::i8vec2 A = glm::linearRand(glm::i8vec2(Min), glm::i8vec2(Max));\n\t\t\t\tAMin = glm::min(AMin, A);\n\t\t\t\tAMax = glm::max(AMax, A);\n\n\t\t\t\tif(!glm::all(glm::lessThanEqual(A, glm::i8vec2(Max))))\n\t\t\t\t\t++Error;\n\t\t\t\tif(!glm::all(glm::greaterThanEqual(A, glm::i8vec2(Min))))\n\t\t\t\t\t++Error;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\n\t\t\tError += glm::all(glm::equal(AMin, glm::i8vec2(Min))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(AMax, glm::i8vec2(Max))) ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\n\t\tglm::i16vec2 BMin(std::numeric_limits<glm::i16>::max());\n\t\tglm::i16vec2 BMax(std::numeric_limits<glm::i16>::min());\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t\t{\n\t\t\t\tglm::i16vec2 B = glm::linearRand(glm::i16vec2(Min), glm::i16vec2(Max));\n\t\t\t\tBMin = glm::min(BMin, B);\n\t\t\t\tBMax = glm::max(BMax, B);\n\n\t\t\t\tif(!glm::all(glm::lessThanEqual(B, glm::i16vec2(Max))))\n\t\t\t\t\t++Error;\n\t\t\t\tif(!glm::all(glm::greaterThanEqual(B, glm::i16vec2(Min))))\n\t\t\t\t\t++Error;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\n\t\t\tError += glm::all(glm::equal(BMin, glm::i16vec2(Min))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(BMax, glm::i16vec2(Max))) ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\n\t\tglm::i32vec2 CMin(std::numeric_limits<glm::i32>::max());\n\t\tglm::i32vec2 CMax(std::numeric_limits<glm::i32>::min());\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t\t{\n\t\t\t\tglm::i32vec2 C = glm::linearRand(glm::i32vec2(Min), glm::i32vec2(Max));\n\t\t\t\tCMin = glm::min(CMin, C);\n\t\t\t\tCMax = glm::max(CMax, C);\n\n\t\t\t\tif(!glm::all(glm::lessThanEqual(C, glm::i32vec2(Max))))\n\t\t\t\t\t++Error;\n\t\t\t\tif(!glm::all(glm::greaterThanEqual(C, glm::i32vec2(Min))))\n\t\t\t\t\t++Error;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\n\t\t\tError += glm::all(glm::equal(CMin, glm::i32vec2(Min))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(CMax, glm::i32vec2(Max))) ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\n\t\tglm::i64vec2 DMin(std::numeric_limits<glm::i64>::max());\n\t\tglm::i64vec2 DMax(std::numeric_limits<glm::i64>::min());\n\t\t{\n\t\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t\t{\n\t\t\t\tglm::i64vec2 D = glm::linearRand(glm::i64vec2(Min), glm::i64vec2(Max));\n\t\t\t\tDMin = glm::min(DMin, D);\n\t\t\t\tDMax = glm::max(DMax, D);\n\n\t\t\t\tif(!glm::all(glm::lessThanEqual(D, glm::i64vec2(Max))))\n\t\t\t\t\t++Error;\n\t\t\t\tif(!glm::all(glm::greaterThanEqual(D, glm::i64vec2(Min))))\n\t\t\t\t\t++Error;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\n\t\t\tError += glm::all(glm::equal(DMin, glm::i64vec2(Min))) ? 0 : 1;\n\t\t\tError += glm::all(glm::equal(DMax, glm::i64vec2(Max))) ? 0 : 1;\n\t\t\tassert(!Error);\n\t\t}\n\t}\n\n\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t{\n\t\tglm::f32vec2 const A(glm::linearRand(glm::f32vec2(static_cast<float>(Min)), glm::f32vec2(static_cast<float>(Max))));\n\t\tif(!glm::all(glm::lessThanEqual(A, glm::f32vec2(static_cast<float>(Max)))))\n\t\t\t++Error;\n\t\tif(!glm::all(glm::greaterThanEqual(A, glm::f32vec2(static_cast<float>(Min)))))\n\t\t\t++Error;\n\n\t\tglm::f64vec2 const B(glm::linearRand(glm::f64vec2(Min), glm::f64vec2(Max)));\n\t\tif(!glm::all(glm::lessThanEqual(B, glm::f64vec2(Max))))\n\t\t\t++Error;\n\t\tif(!glm::all(glm::greaterThanEqual(B, glm::f64vec2(Min))))\n\t\t\t++Error;\n\t\tassert(!Error);\n\t}\n\n\t{\n\t\tfloat ResultFloat = 0.0f;\n\t\tdouble ResultDouble = 0.0;\n\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t{\n\t\t\tResultFloat += glm::linearRand(-1.0f, 1.0f);\n\t\t\tResultDouble += glm::linearRand(-1.0, 1.0);\n\t\t}\n\n\t\tError += glm::epsilonEqual(ResultFloat, 0.0f, 0.0001f);\n\t\tError += glm::epsilonEqual(ResultDouble, 0.0, 0.0001);\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_circularRand()\n{\n\tint Error = 0;\n\n\t{\n\t\tstd::size_t Max = TestSamples;\n\t\tfloat ResultFloat = 0.0f;\n\t\tdouble ResultDouble = 0.0;\n\t\tdouble Radius = 2.0;\n\n\t\tfor(std::size_t i = 0; i < Max; ++i)\n\t\t{\n\t\t\tResultFloat += glm::length(glm::circularRand(1.0f));\n\t\t\tResultDouble += glm::length(glm::circularRand(Radius));\n\t\t}\n\n\t\tError += glm::epsilonEqual(ResultFloat, float(Max), 0.01f) ? 0 : 1;\n\t\tError += glm::epsilonEqual(ResultDouble, double(Max) * double(Radius), 0.01) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_sphericalRand()\n{\n\tint Error = 0;\n\n\t{\n\t\tstd::size_t Max = TestSamples;\n\t\tfloat ResultFloatA = 0.0f;\n\t\tfloat ResultFloatB = 0.0f;\n\t\tfloat ResultFloatC = 0.0f;\n\t\tdouble ResultDoubleA = 0.0;\n\t\tdouble ResultDoubleB = 0.0;\n\t\tdouble ResultDoubleC = 0.0;\n\n\t\tfor(std::size_t i = 0; i < Max; ++i)\n\t\t{\n\t\t\tResultFloatA += glm::length(glm::sphericalRand(1.0f));\n\t\t\tResultDoubleA += glm::length(glm::sphericalRand(1.0));\n\t\t\tResultFloatB += glm::length(glm::sphericalRand(2.0f));\n\t\t\tResultDoubleB += glm::length(glm::sphericalRand(2.0));\n\t\t\tResultFloatC += glm::length(glm::sphericalRand(3.0f));\n\t\t\tResultDoubleC += glm::length(glm::sphericalRand(3.0));\n\t\t}\n\n\t\tError += glm::epsilonEqual(ResultFloatA, float(Max), 0.01f) ? 0 : 1;\n\t\tError += glm::epsilonEqual(ResultDoubleA, double(Max), 0.0001) ? 0 : 1;\n\t\tError += glm::epsilonEqual(ResultFloatB, float(Max * 2), 0.01f) ? 0 : 1;\n\t\tError += glm::epsilonEqual(ResultDoubleB, double(Max * 2), 0.0001) ? 0 : 1;\n\t\tError += glm::epsilonEqual(ResultFloatC, float(Max * 3), 0.01f) ? 0 : 1;\n\t\tError += glm::epsilonEqual(ResultDoubleC, double(Max * 3), 0.01) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_diskRand()\n{\n\tint Error = 0;\n\n\t{\n\t\tfloat ResultFloat = 0.0f;\n\t\tdouble ResultDouble = 0.0;\n\n\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t{\n\t\t\tResultFloat += glm::length(glm::diskRand(2.0f));\n\t\t\tResultDouble += glm::length(glm::diskRand(2.0));\n\t\t}\n\n\t\tError += ResultFloat < float(TestSamples) * 2.f ? 0 : 1;\n\t\tError += ResultDouble < double(TestSamples) * 2.0 ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_ballRand()\n{\n\tint Error = 0;\n\n\t{\n\t\tfloat ResultFloat = 0.0f;\n\t\tdouble ResultDouble = 0.0;\n\n\t\tfor(std::size_t i = 0; i < TestSamples; ++i)\n\t\t{\n\t\t\tResultFloat += glm::length(glm::ballRand(2.0f));\n\t\t\tResultDouble += glm::length(glm::ballRand(2.0));\n\t\t}\n\n\t\tError += ResultFloat < float(TestSamples) * 2.f ? 0 : 1;\n\t\tError += ResultDouble < double(TestSamples) * 2.0 ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n/*\n#if(GLM_LANG & GLM_LANG_CXX0X_FLAG)\nint test_grid()\n{\n\tint Error = 0;\n\n\ttypedef std::array<int, 8> colors;\n\ttypedef std::array<int, 8 * 8> grid;\n\n\tgrid Grid;\n\tcolors Colors;\n\n\tgrid GridBest;\n\tcolors ColorsBest;\n\n\twhile(true)\n\t{\n\t\tfor(std::size_t i = 0; i < Grid.size(); ++i)\n\t\t\tGrid[i] = int(glm::linearRand(0.0, 8.0 * 8.0 * 8.0 - 1.0) / 64.0);\n\n\t\tfor(std::size_t i = 0; i < Grid.size(); ++i)\n\t\t\t++Colors[Grid[i]];\n\n\t\tbool Exit = true;\n\t\tfor(std::size_t i = 0; i < Colors.size(); ++i)\n\t\t{\n\t\t\tif(Colors[i] == 8)\n\t\t\t\tcontinue;\n\n\t\t\tExit = false;\n\t\t\tbreak;\n\t\t}\n\n\t\tif(Exit == true)\n\t\t\tbreak;\n\t}\n\n\treturn Error;\n}\n#endif\n*/\nint main()\n{\n\tint Error = 0;\n\n\tError += test_linearRand();\n\tError += test_circularRand();\n\tError += test_sphericalRand();\n\tError += test_diskRand();\n\tError += test_ballRand();\n/*\n#if(GLM_LANG & GLM_LANG_CXX0X_FLAG)\n\tError += test_grid();\n#endif\n*/\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_reciprocal.cpp",
    "content": "#include <glm/gtc/reciprocal.hpp>\n#include <ctime>\n\nint main()\n{\n\treturn 0;\n}\n\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_round.cpp",
    "content": "#include <glm/gtc/round.hpp>\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <vector>\n#include <ctime>\n#include <cstdio>\n\nnamespace isPowerOfTwo\n{\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tbool\t\tReturn;\n\t};\n\n\tint test_int16()\n\t{\n\t\ttype<glm::int16> const Data[] =\n\t\t{\n\t\t\t{0x0001, true},\n\t\t\t{0x0002, true},\n\t\t\t{0x0004, true},\n\t\t\t{0x0080, true},\n\t\t\t{0x0000, true},\n\t\t\t{0x0003, false}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::int16>); i < n; ++i)\n\t\t{\n\t\t\tbool Result = glm::isPowerOfTwo(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test_uint16()\n\t{\n\t\ttype<glm::uint16> const Data[] =\n\t\t{\n\t\t\t{0x0001, true},\n\t\t\t{0x0002, true},\n\t\t\t{0x0004, true},\n\t\t\t{0x0000, true},\n\t\t\t{0x0000, true},\n\t\t\t{0x0003, false}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::uint16>); i < n; ++i)\n\t\t{\n\t\t\tbool Result = glm::isPowerOfTwo(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test_int32()\n\t{\n\t\ttype<int> const Data[] =\n\t\t{\n\t\t\t{0x00000001, true},\n\t\t\t{0x00000002, true},\n\t\t\t{0x00000004, true},\n\t\t\t{0x0000000f, false},\n\t\t\t{0x00000000, true},\n\t\t\t{0x00000003, false}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<int>); i < n; ++i)\n\t\t{\n\t\t\tbool Result = glm::isPowerOfTwo(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<int>); i < n; ++i)\n\t\t{\n\t\t\tglm::bvec1 Result = glm::isPowerOfTwo(glm::ivec1(Data[i].Value));\n\t\t\tError += glm::all(glm::equal(glm::bvec1(Data[i].Return), Result)) ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<int>); i < n; ++i)\n\t\t{\n\t\t\tglm::bvec2 Result = glm::isPowerOfTwo(glm::ivec2(Data[i].Value));\n\t\t\tError += glm::all(glm::equal(glm::bvec2(Data[i].Return), Result)) ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<int>); i < n; ++i)\n\t\t{\n\t\t\tglm::bvec3 Result = glm::isPowerOfTwo(glm::ivec3(Data[i].Value));\n\t\t\tError += glm::all(glm::equal(glm::bvec3(Data[i].Return), Result)) ? 0 : 1;\n\t\t}\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<int>); i < n; ++i)\n\t\t{\n\t\t\tglm::bvec4 Result = glm::isPowerOfTwo(glm::ivec4(Data[i].Value));\n\t\t\tError += glm::all(glm::equal(glm::bvec4(Data[i].Return), Result)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test_uint32()\n\t{\n\t\ttype<glm::uint> const Data[] =\n\t\t{\n\t\t\t{0x00000001, true},\n\t\t\t{0x00000002, true},\n\t\t\t{0x00000004, true},\n\t\t\t{0x80000000, true},\n\t\t\t{0x00000000, true},\n\t\t\t{0x00000003, false}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::uint>); i < n; ++i)\n\t\t{\n\t\t\tbool Result = glm::isPowerOfTwo(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tError += test_int16();\n\t\tError += test_uint16();\n\t\tError += test_int32();\n\t\tError += test_uint32();\n\n\t\treturn Error;\n\t}\n}//isPowerOfTwo\n\nnamespace ceilPowerOfTwo_advanced\n{\n\ttemplate<typename genIUType>\n\tGLM_FUNC_QUALIFIER genIUType highestBitValue(genIUType Value)\n\t{\n\t\tgenIUType tmp = Value;\n\t\tgenIUType result = genIUType(0);\n\t\twhile(tmp)\n\t\t{\n\t\t\tresult = (tmp & (~tmp + 1)); // grab lowest bit\n\t\t\ttmp &= ~result; // clear lowest bit\n\t\t}\n\t\treturn result;\n\t}\n\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType ceilPowerOfTwo_loop(genType value)\n\t{\n\t\treturn glm::isPowerOfTwo(value) ? value : highestBitValue(value) << 1;\n\t}\n\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tValue;\n\t\tgenType\t\tReturn;\n\t};\n\n\tint test_int32()\n\t{\n\t\ttype<glm::int32> const Data[] =\n\t\t{\n\t\t\t{0x0000ffff, 0x00010000},\n\t\t\t{-3, -4},\n\t\t\t{-8, -8},\n\t\t\t{0x00000001, 0x00000001},\n\t\t\t{0x00000002, 0x00000002},\n\t\t\t{0x00000004, 0x00000004},\n\t\t\t{0x00000007, 0x00000008},\n\t\t\t{0x0000fff0, 0x00010000},\n\t\t\t{0x0000f000, 0x00010000},\n\t\t\t{0x08000000, 0x08000000},\n\t\t\t{0x00000000, 0x00000000},\n\t\t\t{0x00000003, 0x00000004}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::int32>); i < n; ++i)\n\t\t{\n\t\t\tglm::int32 Result = glm::ceilPowerOfTwo(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test_uint32()\n\t{\n\t\ttype<glm::uint32> const Data[] =\n\t\t{\n\t\t\t{0x00000001, 0x00000001},\n\t\t\t{0x00000002, 0x00000002},\n\t\t\t{0x00000004, 0x00000004},\n\t\t\t{0x00000007, 0x00000008},\n\t\t\t{0x0000ffff, 0x00010000},\n\t\t\t{0x0000fff0, 0x00010000},\n\t\t\t{0x0000f000, 0x00010000},\n\t\t\t{0x80000000, 0x80000000},\n\t\t\t{0x00000000, 0x00000000},\n\t\t\t{0x00000003, 0x00000004}\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::uint32>); i < n; ++i)\n\t\t{\n\t\t\tglm::uint32 Result = glm::ceilPowerOfTwo(Data[i].Value);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint perf()\n\t{\n\t\tint Error(0);\n\n\t\tstd::vector<glm::uint> v;\n\t\tv.resize(100000000);\n\n\t\tstd::clock_t Timestramp0 = std::clock();\n\n\t\tfor(glm::uint32 i = 0, n = static_cast<glm::uint>(v.size()); i < n; ++i)\n\t\t\tv[i] = ceilPowerOfTwo_loop(i);\n\n\t\tstd::clock_t Timestramp1 = std::clock();\n\n\t\tfor(glm::uint32 i = 0, n = static_cast<glm::uint>(v.size()); i < n; ++i)\n\t\t\tv[i] = glm::ceilPowerOfTwo(i);\n\n\t\tstd::clock_t Timestramp2 = std::clock();\n\n\t\tstd::printf(\"ceilPowerOfTwo_loop: %d clocks\\n\", static_cast<unsigned int>(Timestramp1 - Timestramp0));\n\t\tstd::printf(\"glm::ceilPowerOfTwo: %d clocks\\n\", static_cast<unsigned int>(Timestramp2 - Timestramp1));\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tError += test_int32();\n\t\tError += test_uint32();\n\n\t\treturn Error;\n\t}\n}//namespace ceilPowerOfTwo_advanced\n\nnamespace roundPowerOfTwo\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tglm::uint32 const A = glm::roundPowerOfTwo(7u);\n\t\tError += A == 8u ? 0 : 1;\n\t\t\n\t\tglm::uint32 const B = glm::roundPowerOfTwo(15u);\n\t\tError += B == 16u ? 0 : 1;\n\n\t\tglm::uint32 const C = glm::roundPowerOfTwo(31u);\n\t\tError += C == 32u ? 0 : 1;\n\t\t\n\t\tglm::uint32 const D = glm::roundPowerOfTwo(9u);\n\t\tError += D == 8u ? 0 : 1;\n\t\t\n\t\tglm::uint32 const E = glm::roundPowerOfTwo(17u);\n\t\tError += E == 16u ? 0 : 1;\n\t\t\n\t\tglm::uint32 const F = glm::roundPowerOfTwo(33u);\n\t\tError += F == 32u ? 0 : 1;\n\t\t\n\t\treturn Error;\n\t}\n}//namespace roundPowerOfTwo\n\nnamespace floorPowerOfTwo\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tglm::uint32 const A = glm::floorPowerOfTwo(7u);\n\t\tError += A == 4u ? 0 : 1;\n\t\t\n\t\tglm::uint32 const B = glm::floorPowerOfTwo(15u);\n\t\tError += B == 8u ? 0 : 1;\n\t\t\n\t\tglm::uint32 const C = glm::floorPowerOfTwo(31u);\n\t\tError += C == 16u ? 0 : 1;\n\t\t\n\t\treturn Error;\n\t}\n}//namespace floorPowerOfTwo\n\nnamespace ceilPowerOfTwo\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\t\t\n\t\tglm::uint32 const A = glm::ceilPowerOfTwo(7u);\n\t\tError += A == 8u ? 0 : 1;\n\t\t\n\t\tglm::uint32 const B = glm::ceilPowerOfTwo(15u);\n\t\tError += B == 16u ? 0 : 1;\n\t\t\n\t\tglm::uint32 const C = glm::ceilPowerOfTwo(31u);\n\t\tError += C == 32u ? 0 : 1;\n\t\t\n\t\treturn Error;\n\t}\n}//namespace ceilPowerOfTwo\n\nnamespace floorMultiple\n{\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tSource;\n\t\tgenType\t\tMultiple;\n\t\tgenType\t\tReturn;\n\t\tgenType\t\tEpsilon;\n\t};\n\n\tint test_float()\n\t{\n\t\ttype<glm::float64> const Data[] = \n\t\t{\n\t\t\t{3.4, 0.3, 3.3, 0.0001},\n\t\t\t{-1.4, 0.3, -1.5, 0.0001},\n\t\t};\n\n\t\tint Error(0);\n\t\t\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::float64>); i < n; ++i)\n\t\t{\n\t\t\tglm::float64 Result = glm::floorMultiple(Data[i].Source, Data[i].Multiple);\n\t\t\tError += glm::epsilonEqual(Data[i].Return, Result, Data[i].Epsilon) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tError += test_float();\n\n\t\treturn Error;\n\t}\n}//namespace floorMultiple\n\nnamespace ceilMultiple\n{\n\ttemplate<typename genType>\n\tstruct type\n\t{\n\t\tgenType\t\tSource;\n\t\tgenType\t\tMultiple;\n\t\tgenType\t\tReturn;\n\t\tgenType\t\tEpsilon;\n\t};\n\n\tint test_float()\n\t{\n\t\ttype<glm::float64> const Data[] = \n\t\t{\n\t\t\t{3.4, 0.3, 3.6, 0.0001},\n\t\t\t{-1.4, 0.3, -1.2, 0.0001},\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::float64>); i < n; ++i)\n\t\t{\n\t\t\tglm::float64 Result = glm::ceilMultiple(Data[i].Source, Data[i].Multiple);\n\t\t\tError += glm::epsilonEqual(Data[i].Return, Result, Data[i].Epsilon) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test_int()\n\t{\n\t\ttype<int> const Data[] = \n\t\t{\n\t\t\t{3, 4, 4, 0},\n\t\t\t{7, 4, 8, 0},\n\t\t\t{5, 4, 8, 0},\n\t\t\t{1, 4, 4, 0},\n\t\t\t{1, 3, 3, 0},\n\t\t\t{4, 3, 6, 0},\n\t\t\t{4, 1, 4, 0},\n\t\t\t{1, 1, 1, 0},\n\t\t\t{7, 1, 7, 0},\n\t\t};\n\n\t\tint Error(0);\n\n\t\tfor(std::size_t i = 0, n = sizeof(Data) / sizeof(type<int>); i < n; ++i)\n\t\t{\n\t\t\tint Result = glm::ceilMultiple(Data[i].Source, Data[i].Multiple);\n\t\t\tError += Data[i].Return == Result ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tError += test_int();\n\t\tError += test_float();\n\n\t\treturn Error;\n\t}\n}//namespace ceilMultiple\n\nint main()\n{\n\tint Error(0);\n\n\tError += isPowerOfTwo::test();\n\tError += floorPowerOfTwo::test();\n\tError += roundPowerOfTwo::test();\n\tError += ceilPowerOfTwo::test();\n\tError += ceilPowerOfTwo_advanced::test();\n\t\n#\tifdef NDEBUG\n\t\tError += ceilPowerOfTwo_advanced::perf();\n#\tendif//NDEBUG\n\n\tError += floorMultiple::test();\n\tError += ceilMultiple::test();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_type_aligned.cpp",
    "content": "#define GLM_FORCE_MESSAGES\n#include <glm/glm.hpp>\n\n#if GLM_HAS_ALIGNED_TYPE\n#include <glm/gtc/type_aligned.hpp>\n\nGLM_STATIC_ASSERT(glm::detail::is_aligned<glm::aligned_lowp>::value, \"aligned_lowp is not aligned\");\nGLM_STATIC_ASSERT(glm::detail::is_aligned<glm::aligned_mediump>::value, \"aligned_mediump is not aligned\");\nGLM_STATIC_ASSERT(glm::detail::is_aligned<glm::aligned_highp>::value, \"aligned_highp is not aligned\");\nGLM_STATIC_ASSERT(!glm::detail::is_aligned<glm::packed_highp>::value, \"packed_highp is aligned\");\nGLM_STATIC_ASSERT(!glm::detail::is_aligned<glm::packed_mediump>::value, \"packed_mediump is aligned\");\nGLM_STATIC_ASSERT(!glm::detail::is_aligned<glm::packed_lowp>::value, \"packed_lowp is aligned\");\n\nstruct my_vec4_packed\n{\n\tglm::uint32 a;\n\tglm::vec4 b;\n};\nGLM_STATIC_ASSERT(sizeof(my_vec4_packed) == sizeof(glm::uint32) + sizeof(glm::vec4), \"glm::vec4 packed is not correct\");\n\nstruct my_vec4_aligned\n{\n\tglm::uint32 a;\n\tglm::aligned_vec4 b;\n};\nGLM_STATIC_ASSERT(sizeof(my_vec4_aligned) == sizeof(glm::aligned_vec4) * 2, \"glm::vec4 aligned is not correct\");\n\nstruct my_dvec4_packed\n{\n\tglm::uint64 a;\n\tglm::dvec4 b;\n};\nGLM_STATIC_ASSERT(sizeof(my_dvec4_packed) == sizeof(glm::uint64) + sizeof(glm::dvec4), \"glm::dvec4 packed is not correct\");\n\nstruct my_dvec4_aligned\n{\n\tglm::uint64 a;\n\tglm::aligned_dvec4 b;\n};\n//GLM_STATIC_ASSERT(sizeof(my_dvec4_aligned) == sizeof(glm::aligned_dvec4) * 2, \"glm::dvec4 aligned is not correct\");\n\nstruct my_ivec4_packed\n{\n\tglm::uint32 a;\n\tglm::ivec4 b;\n};\nGLM_STATIC_ASSERT(sizeof(my_ivec4_packed) == sizeof(glm::uint32) + sizeof(glm::ivec4), \"glm::ivec4 packed is not correct\");\n\nstruct my_ivec4_aligned\n{\n\tglm::uint32 a;\n\tglm::aligned_ivec4 b;\n};\nGLM_STATIC_ASSERT(sizeof(my_ivec4_aligned) == sizeof(glm::aligned_ivec4) * 2, \"glm::ivec4 aligned is not correct\");\n\nstruct my_u8vec4_packed\n{\n\tglm::uint32 a;\n\tglm::u8vec4 b;\n};\nGLM_STATIC_ASSERT(sizeof(my_u8vec4_packed) == sizeof(glm::uint32) + sizeof(glm::u8vec4), \"glm::u8vec4 packed is not correct\");\n\nstatic int test_copy()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::aligned_ivec4 const a(1, 2, 3, 4);\n\t\tglm::ivec4 const u(a);\n\n\t\tError += a.x == u.x ? 0 : 1;\n\t\tError += a.y == u.y ? 0 : 1;\n\t\tError += a.z == u.z ? 0 : 1;\n\t\tError += a.w == u.w ? 0 : 1;\n\t}\n\n\t{\n\t\tmy_ivec4_aligned a;\n\t\ta.b = glm::ivec4(1, 2, 3, 4);\n\n\t\tmy_ivec4_packed u;\n\t\tu.b = a.b;\n\n\t\tError += a.b.x == u.b.x ? 0 : 1;\n\t\tError += a.b.y == u.b.y ? 0 : 1;\n\t\tError += a.b.z == u.b.z ? 0 : 1;\n\t\tError += a.b.w == u.b.w ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nstatic int test_ctor()\n{\n\tint Error = 0;\n\n#\tif GLM_HAS_CONSTEXPR && GLM_ARCH == GLM_ARCH_PURE\n\t{\n\t\tconstexpr glm::aligned_ivec4 v(1);\n\n\t\tError += v.x == 1 ? 0 : 1;\n\t\tError += v.y == 1 ? 0 : 1;\n\t\tError += v.z == 1 ? 0 : 1;\n\t\tError += v.w == 1 ? 0 : 1;\n\t}\n\n\t{\n\t\tconstexpr glm::packed_ivec4 v(1);\n\n\t\tError += v.x == 1 ? 0 : 1;\n\t\tError += v.y == 1 ? 0 : 1;\n\t\tError += v.z == 1 ? 0 : 1;\n\t\tError += v.w == 1 ? 0 : 1;\n\t}\n\n\t{\n\t\tconstexpr glm::ivec4 v(1);\n\n\t\tError += v.x == 1 ? 0 : 1;\n\t\tError += v.y == 1 ? 0 : 1;\n\t\tError += v.z == 1 ? 0 : 1;\n\t\tError += v.w == 1 ? 0 : 1;\n\t}\n#\tendif\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_ctor();\n\tError += test_copy();\n\n\treturn Error;\n}\n\n#else\n\nint main()\n{\n\treturn 0;\n}\n\n#endif//GLM_HAS_ALIGNED_TYPE\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_type_precision.cpp",
    "content": "#include <glm/gtc/type_precision.hpp>\n#include <glm/gtc/quaternion.hpp>\n#include <vector>\n#if GLM_HAS_OPENMP\n#\tinclude <omp.h>\n#endif\n\nstatic int test_scalar_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::int8) != 1;\n\tError += sizeof(glm::int16) != 2;\n\tError += sizeof(glm::int32) != 4;\n\tError += sizeof(glm::int64) != 8;\n\tError += sizeof(glm::uint8) != 1;\n\tError += sizeof(glm::uint16) != 2;\n\tError += sizeof(glm::uint32) != 4;\n\tError += sizeof(glm::uint64) != 8;\n\tError += sizeof(glm::float32) != 4;\n\tError += sizeof(glm::float64) != 8;\n\n\tError += sizeof(glm::lowp_int8) != 1;\n\tError += sizeof(glm::lowp_int16) != 2;\n\tError += sizeof(glm::lowp_int32) != 4;\n\tError += sizeof(glm::lowp_int64) != 8;\n\tError += sizeof(glm::lowp_uint8) != 1;\n\tError += sizeof(glm::lowp_uint16) != 2;\n\tError += sizeof(glm::lowp_uint32) != 4;\n\tError += sizeof(glm::lowp_uint64) != 8;\n\tError += sizeof(glm::lowp_float32) != 4;\n\tError += sizeof(glm::lowp_float64) != 8;\n\n\tError += sizeof(glm::mediump_int8) != 1;\n\tError += sizeof(glm::mediump_int16) != 2;\n\tError += sizeof(glm::mediump_int32) != 4;\n\tError += sizeof(glm::mediump_int64) != 8;\n\tError += sizeof(glm::mediump_uint8) != 1;\n\tError += sizeof(glm::mediump_uint16) != 2;\n\tError += sizeof(glm::mediump_uint32) != 4;\n\tError += sizeof(glm::mediump_uint64) != 8;\n\tError += sizeof(glm::mediump_float32) != 4;\n\tError += sizeof(glm::mediump_float64) != 8;\n\n\tError += sizeof(glm::highp_int8) != 1;\n\tError += sizeof(glm::highp_int16) != 2;\n\tError += sizeof(glm::highp_int32) != 4;\n\tError += sizeof(glm::highp_int64) != 8;\n\tError += sizeof(glm::highp_uint8) != 1;\n\tError += sizeof(glm::highp_uint16) != 2;\n\tError += sizeof(glm::highp_uint32) != 4;\n\tError += sizeof(glm::highp_uint64) != 8;\n\tError += sizeof(glm::highp_float32) != 4;\n\tError += sizeof(glm::highp_float64) != 8;\n\n\treturn Error;\n}\n\nstatic int test_fvec_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::f32vec2) != 8;\n\tError += sizeof(glm::f32vec3) != 12;\n\tError += sizeof(glm::f32vec4) != 16;\n\tError += sizeof(glm::f64vec2) != 16;\n\tError += sizeof(glm::f64vec3) != 24;\n\tError += sizeof(glm::f64vec4) != 32;\n\n\tError += sizeof(glm::lowp_f32vec2) != 8;\n\tError += sizeof(glm::lowp_f32vec3) != 12;\n\tError += sizeof(glm::lowp_f32vec4) != 16;\n\tError += sizeof(glm::lowp_f64vec2) != 16;\n\tError += sizeof(glm::lowp_f64vec3) != 24;\n\tError += sizeof(glm::lowp_f64vec4) != 32;\n\n\tError += sizeof(glm::mediump_f32vec2) != 8;\n\tError += sizeof(glm::mediump_f32vec3) != 12;\n\tError += sizeof(glm::mediump_f32vec4) != 16;\n\tError += sizeof(glm::mediump_f64vec2) != 16;\n\tError += sizeof(glm::mediump_f64vec3) != 24;\n\tError += sizeof(glm::mediump_f64vec4) != 32;\n\n\tError += sizeof(glm::highp_f32vec2) != 8;\n\tError += sizeof(glm::highp_f32vec3) != 12;\n\tError += sizeof(glm::highp_f32vec4) != 16;\n\tError += sizeof(glm::highp_f64vec2) != 16;\n\tError += sizeof(glm::highp_f64vec3) != 24;\n\tError += sizeof(glm::highp_f64vec4) != 32;\n\n\treturn Error;\n}\n\nstatic int test_fvec_precision()\n{\n\tint Error = 0;\n/*\n\t{\n\t\tglm::f32vec2 v1;\n\t\tglm::lowp_f32vec2 v2((glm::f32vec2(v1)));\n\t\tglm::mediump_f32vec2 v3((glm::f32vec2(v1)));\n\t\tglm::highp_f32vec2 v4((glm::f32vec2(v1)));\n\n\t\tError += glm::all(glm::equal(v1, v2)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, v3)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, v4)) ? 0 : 1;\n\t}\n*/\n\t{\n\t\tglm::f32vec2 v1(1.f);\n\t\tglm::lowp_f32vec2 v2(v1);\n\t\tglm::mediump_f32vec2 v3(v1);\n\t\tglm::highp_f32vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::f32vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f32vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f32vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::f32vec3 v1(1.f);\n\t\tglm::lowp_f32vec3 v2(v1);\n\t\tglm::mediump_f32vec3 v3(v1);\n\t\tglm::highp_f32vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::f32vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f32vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f32vec3(v4))) ? 0 : 1;\n\t}\n\t\n\t{\n\t\tglm::f32vec4 v1(1.f);\n\t\tglm::lowp_f32vec4 v2(v1);\n\t\tglm::mediump_f32vec4 v3(v1);\n\t\tglm::highp_f32vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::f32vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f32vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f32vec4(v4))) ? 0 : 1;\n\t}\n\t\n\treturn Error;\n}\n\nstatic int test_dvec_precision()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::f64vec2 v1(1.0);\n\t\tglm::lowp_f64vec2 v2(v1);\n\t\tglm::mediump_f64vec2 v3(v1);\n\t\tglm::highp_f64vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::f64vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f64vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f64vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::f64vec3 v1(1.0);\n\t\tglm::lowp_f64vec3 v2(v1);\n\t\tglm::mediump_f64vec3 v3(v1);\n\t\tglm::highp_f64vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::f64vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f64vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f64vec3(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::f64vec4 v1(1.0);\n\t\tglm::lowp_f64vec4 v2(v1);\n\t\tglm::mediump_f64vec4 v3(v1);\n\t\tglm::highp_f64vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::f64vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f64vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::f64vec4(v4))) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nstatic int test_ivec_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::i8vec2) != 2;\n\tError += sizeof(glm::i8vec3) != 3;\n\tError += sizeof(glm::i8vec4) != 4;\n\tError += sizeof(glm::i16vec2) != 4;\n\tError += sizeof(glm::i16vec3) != 6;\n\tError += sizeof(glm::i16vec4) != 8;\n\tError += sizeof(glm::i32vec2) != 8;\n\tError += sizeof(glm::i32vec3) != 12;\n\tError += sizeof(glm::i32vec4) != 16;\n\tError += sizeof(glm::i64vec2) != 16;\n\tError += sizeof(glm::i64vec3) != 24;\n\tError += sizeof(glm::i64vec4) != 32;\n\n\tError += sizeof(glm::lowp_i8vec2) != 2;\n\tError += sizeof(glm::lowp_i8vec3) != 3;\n\tError += sizeof(glm::lowp_i8vec4) != 4;\n\tError += sizeof(glm::lowp_i16vec2) != 4;\n\tError += sizeof(glm::lowp_i16vec3) != 6;\n\tError += sizeof(glm::lowp_i16vec4) != 8;\n\tError += sizeof(glm::lowp_i32vec2) != 8;\n\tError += sizeof(glm::lowp_i32vec3) != 12;\n\tError += sizeof(glm::lowp_i32vec4) != 16;\n\tError += sizeof(glm::lowp_i64vec2) != 16;\n\tError += sizeof(glm::lowp_i64vec3) != 24;\n\tError += sizeof(glm::lowp_i64vec4) != 32;\n\n\tError += sizeof(glm::mediump_i8vec2) != 2;\n\tError += sizeof(glm::mediump_i8vec3) != 3;\n\tError += sizeof(glm::mediump_i8vec4) != 4;\n\tError += sizeof(glm::mediump_i16vec2) != 4;\n\tError += sizeof(glm::mediump_i16vec3) != 6;\n\tError += sizeof(glm::mediump_i16vec4) != 8;\n\tError += sizeof(glm::mediump_i32vec2) != 8;\n\tError += sizeof(glm::mediump_i32vec3) != 12;\n\tError += sizeof(glm::mediump_i32vec4) != 16;\n\tError += sizeof(glm::mediump_i64vec2) != 16;\n\tError += sizeof(glm::mediump_i64vec3) != 24;\n\tError += sizeof(glm::mediump_i64vec4) != 32;\n\n\tError += sizeof(glm::highp_i8vec2) != 2;\n\tError += sizeof(glm::highp_i8vec3) != 3;\n\tError += sizeof(glm::highp_i8vec4) != 4;\n\tError += sizeof(glm::highp_i16vec2) != 4;\n\tError += sizeof(glm::highp_i16vec3) != 6;\n\tError += sizeof(glm::highp_i16vec4) != 8;\n\tError += sizeof(glm::highp_i32vec2) != 8;\n\tError += sizeof(glm::highp_i32vec3) != 12;\n\tError += sizeof(glm::highp_i32vec4) != 16;\n\tError += sizeof(glm::highp_i64vec2) != 16;\n\tError += sizeof(glm::highp_i64vec3) != 24;\n\tError += sizeof(glm::highp_i64vec4) != 32;\n\n\treturn Error;\n}\n\nstatic int test_ivec_precision()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::i8vec2 v1(0);\n\t\tglm::lowp_i8vec2 v2(v1);\n\t\tglm::mediump_i8vec2 v3(v1);\n\t\tglm::highp_i8vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i8vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i8vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i8vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i8vec3 v1(0);\n\t\tglm::lowp_i8vec3 v2(v1);\n\t\tglm::mediump_i8vec3 v3(v1);\n\t\tglm::highp_i8vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i8vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i8vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i8vec3(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i8vec4 v1(0);\n\t\tglm::lowp_i8vec4 v2(v1);\n\t\tglm::mediump_i8vec4 v3(v1);\n\t\tglm::highp_i8vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i8vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i8vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i8vec4(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i16vec2 v1(0);\n\t\tglm::lowp_i16vec2 v2(v1);\n\t\tglm::mediump_i16vec2 v3(v1);\n\t\tglm::highp_i16vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i16vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i16vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i16vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i16vec3 v1(0);\n\t\tglm::lowp_i16vec3 v2(v1);\n\t\tglm::mediump_i16vec3 v3(v1);\n\t\tglm::highp_i16vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i16vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i16vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i16vec3(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i16vec4 v1(0);\n\t\tglm::lowp_i16vec4 v2(v1);\n\t\tglm::mediump_i16vec4 v3(v1);\n\t\tglm::highp_i16vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i16vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i16vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i16vec4(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i32vec2 v1(0);\n\t\tglm::lowp_i32vec2 v2(v1);\n\t\tglm::mediump_i32vec2 v3(v1);\n\t\tglm::highp_i32vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i32vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i32vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i32vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i32vec3 v1(0);\n\t\tglm::lowp_i32vec3 v2(v1);\n\t\tglm::mediump_i32vec3 v3(v1);\n\t\tglm::highp_i32vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i32vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i32vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i32vec3(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i32vec4 v1(0);\n\t\tglm::lowp_i32vec4 v2(v1);\n\t\tglm::mediump_i32vec4 v3(v1);\n\t\tglm::highp_i32vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i32vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i32vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i32vec4(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i64vec2 v1(0);\n\t\tglm::lowp_i64vec2 v2(v1);\n\t\tglm::mediump_i64vec2 v3(v1);\n\t\tglm::highp_i64vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i64vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i64vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i64vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i64vec3 v1(0);\n\t\tglm::lowp_i64vec3 v2(v1);\n\t\tglm::mediump_i64vec3 v3(v1);\n\t\tglm::highp_i64vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i64vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i64vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i64vec3(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::i64vec4 v1(0);\n\t\tglm::lowp_i64vec4 v2(v1);\n\t\tglm::mediump_i64vec4 v3(v1);\n\t\tglm::highp_i64vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::i64vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i64vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::i64vec4(v4))) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nstatic int test_uvec_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::u8vec2) != 2;\n\tError += sizeof(glm::u8vec3) != 3;\n\tError += sizeof(glm::u8vec4) != 4;\n\tError += sizeof(glm::u16vec2) != 4;\n\tError += sizeof(glm::u16vec3) != 6;\n\tError += sizeof(glm::u16vec4) != 8;\n\tError += sizeof(glm::u32vec2) != 8;\n\tError += sizeof(glm::u32vec3) != 12;\n\tError += sizeof(glm::u32vec4) != 16;\n\tError += sizeof(glm::u64vec2) != 16;\n\tError += sizeof(glm::u64vec3) != 24;\n\tError += sizeof(glm::u64vec4) != 32;\n\n\tError += sizeof(glm::lowp_u8vec2) != 2;\n\tError += sizeof(glm::lowp_u8vec3) != 3;\n\tError += sizeof(glm::lowp_u8vec4) != 4;\n\tError += sizeof(glm::lowp_u16vec2) != 4;\n\tError += sizeof(glm::lowp_u16vec3) != 6;\n\tError += sizeof(glm::lowp_u16vec4) != 8;\n\tError += sizeof(glm::lowp_u32vec2) != 8;\n\tError += sizeof(glm::lowp_u32vec3) != 12;\n\tError += sizeof(glm::lowp_u32vec4) != 16;\n\tError += sizeof(glm::lowp_u64vec2) != 16;\n\tError += sizeof(glm::lowp_u64vec3) != 24;\n\tError += sizeof(glm::lowp_u64vec4) != 32;\n\n\tError += sizeof(glm::mediump_u8vec2) != 2;\n\tError += sizeof(glm::mediump_u8vec3) != 3;\n\tError += sizeof(glm::mediump_u8vec4) != 4;\n\tError += sizeof(glm::mediump_u16vec2) != 4;\n\tError += sizeof(glm::mediump_u16vec3) != 6;\n\tError += sizeof(glm::mediump_u16vec4) != 8;\n\tError += sizeof(glm::mediump_u32vec2) != 8;\n\tError += sizeof(glm::mediump_u32vec3) != 12;\n\tError += sizeof(glm::mediump_u32vec4) != 16;\n\tError += sizeof(glm::mediump_u64vec2) != 16;\n\tError += sizeof(glm::mediump_u64vec3) != 24;\n\tError += sizeof(glm::mediump_u64vec4) != 32;\n\n\tError += sizeof(glm::highp_u8vec2) != 2;\n\tError += sizeof(glm::highp_u8vec3) != 3;\n\tError += sizeof(glm::highp_u8vec4) != 4;\n\tError += sizeof(glm::highp_u16vec2) != 4;\n\tError += sizeof(glm::highp_u16vec3) != 6;\n\tError += sizeof(glm::highp_u16vec4) != 8;\n\tError += sizeof(glm::highp_u32vec2) != 8;\n\tError += sizeof(glm::highp_u32vec3) != 12;\n\tError += sizeof(glm::highp_u32vec4) != 16;\n\tError += sizeof(glm::highp_u64vec2) != 16;\n\tError += sizeof(glm::highp_u64vec3) != 24;\n\tError += sizeof(glm::highp_u64vec4) != 32;\n\n\treturn Error;\n}\n\nstatic int test_uvec_precision()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::u8vec2 v1(0);\n\t\tglm::lowp_u8vec2 v2(v1);\n\t\tglm::mediump_u8vec2 v3(v1);\n\t\tglm::highp_u8vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u8vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u8vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u8vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::u8vec3 v1(0);\n\t\tglm::lowp_u8vec3 v2(v1);\n\t\tglm::mediump_u8vec3 v3(v1);\n\t\tglm::highp_u8vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u8vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u8vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u8vec3(v4))) ? 0 : 1;\n\t}\n\t\n\t{\n\t\tglm::u8vec4 v1(0);\n\t\tglm::lowp_u8vec4 v2(v1);\n\t\tglm::mediump_u8vec4 v3(v1);\n\t\tglm::highp_u8vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u8vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u8vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u8vec4(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::u16vec2 v1(0);\n\t\tglm::lowp_u16vec2 v2(v1);\n\t\tglm::mediump_u16vec2 v3(v1);\n\t\tglm::highp_u16vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u16vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u16vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u16vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::u16vec3 v1(0);\n\t\tglm::lowp_u16vec3 v2(v1);\n\t\tglm::mediump_u16vec3 v3(v1);\n\t\tglm::highp_u16vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u16vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u16vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u16vec3(v4))) ? 0 : 1;\n\t}\n\t\n\t{\n\t\tglm::u16vec4 v1(0);\n\t\tglm::lowp_u16vec4 v2(v1);\n\t\tglm::mediump_u16vec4 v3(v1);\n\t\tglm::highp_u16vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u16vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u16vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u16vec4(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::u32vec2 v1(0);\n\t\tglm::lowp_u32vec2 v2(v1);\n\t\tglm::mediump_u32vec2 v3(v1);\n\t\tglm::highp_u32vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u32vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u32vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u32vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::u32vec3 v1(0);\n\t\tglm::lowp_u32vec3 v2(v1);\n\t\tglm::mediump_u32vec3 v3(v1);\n\t\tglm::highp_u32vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u32vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u32vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u32vec3(v4))) ? 0 : 1;\n\t}\n\t\n\t{\n\t\tglm::u32vec4 v1(0);\n\t\tglm::lowp_u32vec4 v2(v1);\n\t\tglm::mediump_u32vec4 v3(v1);\n\t\tglm::highp_u32vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u32vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u32vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u32vec4(v4))) ? 0 : 1;\n\t}\n\t\n\t{\n\t\tglm::u64vec2 v1(0);\n\t\tglm::lowp_u64vec2 v2(v1);\n\t\tglm::mediump_u64vec2 v3(v1);\n\t\tglm::highp_u64vec2 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u64vec2(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u64vec2(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u64vec2(v4))) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::u64vec3 v1(0);\n\t\tglm::lowp_u64vec3 v2(v1);\n\t\tglm::mediump_u64vec3 v3(v1);\n\t\tglm::highp_u64vec3 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u64vec3(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u64vec3(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u64vec3(v4))) ? 0 : 1;\n\t}\n\t\n\t{\n\t\tglm::u64vec4 v1(0);\n\t\tglm::lowp_u64vec4 v2(v1);\n\t\tglm::mediump_u64vec4 v3(v1);\n\t\tglm::highp_u64vec4 v4(v1);\n\n\t\tError += glm::all(glm::equal(v1, glm::u64vec4(v2))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u64vec4(v3))) ? 0 : 1;\n\t\tError += glm::all(glm::equal(v1, glm::u64vec4(v4))) ? 0 : 1;\n\t}\n\t\n\treturn Error;\n}\n\nstatic int test_fmat_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::mat2) != 16;\n\tError += sizeof(glm::mat3) != 36;\n\tError += sizeof(glm::mat4) != 64;\n\tError += sizeof(glm::mat2x2) != 16;\n\tError += sizeof(glm::mat2x3) != 24;\n\tError += sizeof(glm::mat2x4) != 32;\n\tError += sizeof(glm::mat3x2) != 24;\n\tError += sizeof(glm::mat3x3) != 36;\n\tError += sizeof(glm::mat3x4) != 48;\n\tError += sizeof(glm::mat4x2) != 32;\n\tError += sizeof(glm::mat4x3) != 48;\n\tError += sizeof(glm::mat4x4) != 64;\n\n\tError += sizeof(glm::fmat2) != 16;\n\tError += sizeof(glm::fmat3) != 36;\n\tError += sizeof(glm::fmat4) != 64;\n\tError += sizeof(glm::fmat2x2) != 16;\n\tError += sizeof(glm::fmat2x3) != 24;\n\tError += sizeof(glm::fmat2x4) != 32;\n\tError += sizeof(glm::fmat3x2) != 24;\n\tError += sizeof(glm::fmat3x3) != 36;\n\tError += sizeof(glm::fmat3x4) != 48;\n\tError += sizeof(glm::fmat4x2) != 32;\n\tError += sizeof(glm::fmat4x3) != 48;\n\tError += sizeof(glm::fmat4x4) != 64;\n\n\tError += sizeof(glm::f32mat2) != 16;\n\tError += sizeof(glm::f32mat3) != 36;\n\tError += sizeof(glm::f32mat4) != 64;\n\tError += sizeof(glm::f32mat2x2) != 16;\n\tError += sizeof(glm::f32mat2x3) != 24;\n\tError += sizeof(glm::f32mat2x4) != 32;\n\tError += sizeof(glm::f32mat3x2) != 24;\n\tError += sizeof(glm::f32mat3x3) != 36;\n\tError += sizeof(glm::f32mat3x4) != 48;\n\tError += sizeof(glm::f32mat4x2) != 32;\n\tError += sizeof(glm::f32mat4x3) != 48;\n\tError += sizeof(glm::f32mat4x4) != 64;\n\n\n\tError += sizeof(glm::lowp_mat2) != 16;\n\tError += sizeof(glm::lowp_mat3) != 36;\n\tError += sizeof(glm::lowp_mat4) != 64;\n\tError += sizeof(glm::lowp_mat2x2) != 16;\n\tError += sizeof(glm::lowp_mat2x3) != 24;\n\tError += sizeof(glm::lowp_mat2x4) != 32;\n\tError += sizeof(glm::lowp_mat3x2) != 24;\n\tError += sizeof(glm::lowp_mat3x3) != 36;\n\tError += sizeof(glm::lowp_mat3x4) != 48;\n\tError += sizeof(glm::lowp_mat4x2) != 32;\n\tError += sizeof(glm::lowp_mat4x3) != 48;\n\tError += sizeof(glm::lowp_mat4x4) != 64;\n\n\tError += sizeof(glm::lowp_fmat2) != 16;\n\tError += sizeof(glm::lowp_fmat3) != 36;\n\tError += sizeof(glm::lowp_fmat4) != 64;\n\tError += sizeof(glm::lowp_fmat2x2) != 16;\n\tError += sizeof(glm::lowp_fmat2x3) != 24;\n\tError += sizeof(glm::lowp_fmat2x4) != 32;\n\tError += sizeof(glm::lowp_fmat3x2) != 24;\n\tError += sizeof(glm::lowp_fmat3x3) != 36;\n\tError += sizeof(glm::lowp_fmat3x4) != 48;\n\tError += sizeof(glm::lowp_fmat4x2) != 32;\n\tError += sizeof(glm::lowp_fmat4x3) != 48;\n\tError += sizeof(glm::lowp_fmat4x4) != 64;\n\n\tError += sizeof(glm::lowp_f32mat2) != 16;\n\tError += sizeof(glm::lowp_f32mat3) != 36;\n\tError += sizeof(glm::lowp_f32mat4) != 64;\n\tError += sizeof(glm::lowp_f32mat2x2) != 16;\n\tError += sizeof(glm::lowp_f32mat2x3) != 24;\n\tError += sizeof(glm::lowp_f32mat2x4) != 32;\n\tError += sizeof(glm::lowp_f32mat3x2) != 24;\n\tError += sizeof(glm::lowp_f32mat3x3) != 36;\n\tError += sizeof(glm::lowp_f32mat3x4) != 48;\n\tError += sizeof(glm::lowp_f32mat4x2) != 32;\n\tError += sizeof(glm::lowp_f32mat4x3) != 48;\n\tError += sizeof(glm::lowp_f32mat4x4) != 64;\n\n\tError += sizeof(glm::mediump_mat2) != 16;\n\tError += sizeof(glm::mediump_mat3) != 36;\n\tError += sizeof(glm::mediump_mat4) != 64;\n\tError += sizeof(glm::mediump_mat2x2) != 16;\n\tError += sizeof(glm::mediump_mat2x3) != 24;\n\tError += sizeof(glm::mediump_mat2x4) != 32;\n\tError += sizeof(glm::mediump_mat3x2) != 24;\n\tError += sizeof(glm::mediump_mat3x3) != 36;\n\tError += sizeof(glm::mediump_mat3x4) != 48;\n\tError += sizeof(glm::mediump_mat4x2) != 32;\n\tError += sizeof(glm::mediump_mat4x3) != 48;\n\tError += sizeof(glm::mediump_mat4x4) != 64;\n\n\tError += sizeof(glm::mediump_fmat2) != 16;\n\tError += sizeof(glm::mediump_fmat3) != 36;\n\tError += sizeof(glm::mediump_fmat4) != 64;\n\tError += sizeof(glm::mediump_fmat2x2) != 16;\n\tError += sizeof(glm::mediump_fmat2x3) != 24;\n\tError += sizeof(glm::mediump_fmat2x4) != 32;\n\tError += sizeof(glm::mediump_fmat3x2) != 24;\n\tError += sizeof(glm::mediump_fmat3x3) != 36;\n\tError += sizeof(glm::mediump_fmat3x4) != 48;\n\tError += sizeof(glm::mediump_fmat4x2) != 32;\n\tError += sizeof(glm::mediump_fmat4x3) != 48;\n\tError += sizeof(glm::mediump_fmat4x4) != 64;\n\n\tError += sizeof(glm::mediump_f32mat2) != 16;\n\tError += sizeof(glm::mediump_f32mat3) != 36;\n\tError += sizeof(glm::mediump_f32mat4) != 64;\n\tError += sizeof(glm::mediump_f32mat2x2) != 16;\n\tError += sizeof(glm::mediump_f32mat2x3) != 24;\n\tError += sizeof(glm::mediump_f32mat2x4) != 32;\n\tError += sizeof(glm::mediump_f32mat3x2) != 24;\n\tError += sizeof(glm::mediump_f32mat3x3) != 36;\n\tError += sizeof(glm::mediump_f32mat3x4) != 48;\n\tError += sizeof(glm::mediump_f32mat4x2) != 32;\n\tError += sizeof(glm::mediump_f32mat4x3) != 48;\n\tError += sizeof(glm::mediump_f32mat4x4) != 64;\n\n\tError += sizeof(glm::highp_mat2) != 16;\n\tError += sizeof(glm::highp_mat3) != 36;\n\tError += sizeof(glm::highp_mat4) != 64;\n\tError += sizeof(glm::highp_mat2x2) != 16;\n\tError += sizeof(glm::highp_mat2x3) != 24;\n\tError += sizeof(glm::highp_mat2x4) != 32;\n\tError += sizeof(glm::highp_mat3x2) != 24;\n\tError += sizeof(glm::highp_mat3x3) != 36;\n\tError += sizeof(glm::highp_mat3x4) != 48;\n\tError += sizeof(glm::highp_mat4x2) != 32;\n\tError += sizeof(glm::highp_mat4x3) != 48;\n\tError += sizeof(glm::highp_mat4x4) != 64;\n\n\tError += sizeof(glm::highp_fmat2) != 16;\n\tError += sizeof(glm::highp_fmat3) != 36;\n\tError += sizeof(glm::highp_fmat4) != 64;\n\tError += sizeof(glm::highp_fmat2x2) != 16;\n\tError += sizeof(glm::highp_fmat2x3) != 24;\n\tError += sizeof(glm::highp_fmat2x4) != 32;\n\tError += sizeof(glm::highp_fmat3x2) != 24;\n\tError += sizeof(glm::highp_fmat3x3) != 36;\n\tError += sizeof(glm::highp_fmat3x4) != 48;\n\tError += sizeof(glm::highp_fmat4x2) != 32;\n\tError += sizeof(glm::highp_fmat4x3) != 48;\n\tError += sizeof(glm::highp_fmat4x4) != 64;\n\n\tError += sizeof(glm::highp_f32mat2) != 16;\n\tError += sizeof(glm::highp_f32mat3) != 36;\n\tError += sizeof(glm::highp_f32mat4) != 64;\n\tError += sizeof(glm::highp_f32mat2x2) != 16;\n\tError += sizeof(glm::highp_f32mat2x3) != 24;\n\tError += sizeof(glm::highp_f32mat2x4) != 32;\n\tError += sizeof(glm::highp_f32mat3x2) != 24;\n\tError += sizeof(glm::highp_f32mat3x3) != 36;\n\tError += sizeof(glm::highp_f32mat3x4) != 48;\n\tError += sizeof(glm::highp_f32mat4x2) != 32;\n\tError += sizeof(glm::highp_f32mat4x3) != 48;\n\tError += sizeof(glm::highp_f32mat4x4) != 64;\n\n\treturn Error;\n}\n\nstatic int test_dmat_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::f64mat2) != 32;\n\tError += sizeof(glm::f64mat3) != 72;\n\tError += sizeof(glm::f64mat4) != 128;\n\tError += sizeof(glm::f64mat2x2) != 32;\n\tError += sizeof(glm::f64mat2x3) != 48;\n\tError += sizeof(glm::f64mat2x4) != 64;\n\tError += sizeof(glm::f64mat3x2) != 48;\n\tError += sizeof(glm::f64mat3x3) != 72;\n\tError += sizeof(glm::f64mat3x4) != 96;\n\tError += sizeof(glm::f64mat4x2) != 64;\n\tError += sizeof(glm::f64mat4x3) != 96;\n\tError += sizeof(glm::f64mat4x4) != 128;\n\n\tError += sizeof(glm::lowp_f64mat2) != 32;\n\tError += sizeof(glm::lowp_f64mat3) != 72;\n\tError += sizeof(glm::lowp_f64mat4) != 128;\n\tError += sizeof(glm::lowp_f64mat2x2) != 32;\n\tError += sizeof(glm::lowp_f64mat2x3) != 48;\n\tError += sizeof(glm::lowp_f64mat2x4) != 64;\n\tError += sizeof(glm::lowp_f64mat3x2) != 48;\n\tError += sizeof(glm::lowp_f64mat3x3) != 72;\n\tError += sizeof(glm::lowp_f64mat3x4) != 96;\n\tError += sizeof(glm::lowp_f64mat4x2) != 64;\n\tError += sizeof(glm::lowp_f64mat4x3) != 96;\n\tError += sizeof(glm::lowp_f64mat4x4) != 128;\n\n\tError += sizeof(glm::mediump_f64mat2) != 32;\n\tError += sizeof(glm::mediump_f64mat3) != 72;\n\tError += sizeof(glm::mediump_f64mat4) != 128;\n\tError += sizeof(glm::mediump_f64mat2x2) != 32;\n\tError += sizeof(glm::mediump_f64mat2x3) != 48;\n\tError += sizeof(glm::mediump_f64mat2x4) != 64;\n\tError += sizeof(glm::mediump_f64mat3x2) != 48;\n\tError += sizeof(glm::mediump_f64mat3x3) != 72;\n\tError += sizeof(glm::mediump_f64mat3x4) != 96;\n\tError += sizeof(glm::mediump_f64mat4x2) != 64;\n\tError += sizeof(glm::mediump_f64mat4x3) != 96;\n\tError += sizeof(glm::mediump_f64mat4x4) != 128;\n\n\tError += sizeof(glm::highp_f64mat2) != 32;\n\tError += sizeof(glm::highp_f64mat3) != 72;\n\tError += sizeof(glm::highp_f64mat4) != 128;\n\tError += sizeof(glm::highp_f64mat2x2) != 32;\n\tError += sizeof(glm::highp_f64mat2x3) != 48;\n\tError += sizeof(glm::highp_f64mat2x4) != 64;\n\tError += sizeof(glm::highp_f64mat3x2) != 48;\n\tError += sizeof(glm::highp_f64mat3x3) != 72;\n\tError += sizeof(glm::highp_f64mat3x4) != 96;\n\tError += sizeof(glm::highp_f64mat4x2) != 64;\n\tError += sizeof(glm::highp_f64mat4x3) != 96;\n\tError += sizeof(glm::highp_f64mat4x4) != 128;\n\n\treturn Error;\n}\n\nstatic int test_quat_size()\n{\n\tint Error = 0;\n\n\tError += sizeof(glm::f32quat) != 16;\n\tError += sizeof(glm::f64quat) != 32;\n\n\tError += sizeof(glm::lowp_f32quat) != 16;\n\tError += sizeof(glm::lowp_f64quat) != 32;\n\n\tError += sizeof(glm::mediump_f32quat) != 16;\n\tError += sizeof(glm::mediump_f64quat) != 32;\n\n\tError += sizeof(glm::highp_f32quat) != 16;\n\tError += sizeof(glm::highp_f64quat) != 32;\n\n\treturn Error;\n}\n\nstatic int test_quat_precision()\n{\n\tint Error = 0;\n\t\n\t{\n\t\tglm::f32quat q1(0.f, glm::vec3(0.f, 0.f, 1.f));\n\t\tglm::lowp_f32quat qA(q1);\n\t\tglm::mediump_f32quat qB(q1);\n\t\tglm::highp_f32quat qC(q1);\n\t\tglm::f32quat q2(qA);\n\t\tglm::f32quat q3(qB);\n\t\tglm::f32quat q4(qC);\n\t\t\n\t\tError += glm::all(glm::equal(q1, q2)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(q1, q3)) ? 0 : 1;\n\t\tError += glm::all(glm::equal(q1, q4)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nstatic int test_fvec_conversion()\n{\n\tint Error(0);\n\n\t{\n\t\tglm::highp_vec4 a = glm::vec4(1, 2, 3, 4);\n\t\tglm::mediump_vec4 b = glm::vec4(1, 2, 3, 4);\n\t\tglm::lowp_vec4 c = b;\n\t\tglm::mediump_vec4 d = c;\n\t\tglm::lowp_ivec4 e = glm::ivec4(d);\n\t\tglm::lowp_ivec3 f = glm::ivec3(e);\n\n\t\tError += glm::all(glm::equal(b, d)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\n#if GLM_HAS_OPENMP\nstatic int test_openmp()\n{\n\tstd::vector<glm::u8vec3> VectorA(1000);\n\tstd::vector<glm::u8vec3> VectorB(1000);\n\tstd::vector<glm::u8vec3> VectorC(1000);\n\n\tfor (std::size_t i = 0; i < VectorA.size(); ++i)\n\t{\n\t\tVectorA[i] = glm::u8vec3(1, 1, 1);\n\t\tVectorB[i] = glm::u8vec3(1, 1, 1);\n\t}\n\n\t#pragma omp parallel for default(none) shared(VectorA, VectorB, VectorC)\n\tfor (int i = 0; i < static_cast<int>(VectorC.size()); ++i)\n\t{\n\t\tVectorC[i] = VectorA[i] + VectorB[i];\n\t}\n\n\treturn 0;\n}\n#endif//GLM_HAS_OPENMP\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_scalar_size();\n\tError += test_fvec_size();\n\n\tError += test_fvec_precision();\n\tError += test_fvec_conversion();\n\n\tError += test_dvec_precision();\n\n\tError += test_uvec_size();\n\tError += test_uvec_precision();\n\tError += test_ivec_size();\n\tError += test_ivec_precision();\n\n\tError += test_fmat_size();\n\tError += test_dmat_size();\n\tError += test_quat_size();\n\tError += test_quat_precision();\n\n#\tif GLM_HAS_OPENMP\n\t\tError += test_openmp();\n#\tendif//\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_type_ptr.cpp",
    "content": "#include <glm/gtc/type_ptr.hpp>\n#include <glm/gtc/vec1.hpp>\n\nint test_value_ptr_vec()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::vec2 v(1.0);\n\t\tfloat * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec3 v(1.0);\n\t\tfloat * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 v(1.0);\n\t\tfloat * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::dvec2 v(1.0);\n\t\tdouble * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::dvec3 v(1.0);\n\t\tdouble * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::dvec4 v(1.0);\n\t\tdouble * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_value_ptr_vec_const()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::vec2 const v(1.0);\n\t\tfloat const * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec3 const v(1.0);\n\t\tfloat const * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::vec4 const v(1.0);\n\t\tfloat const * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::dvec2 const v(1.0);\n\t\tdouble const * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::dvec3 const v(1.0);\n\t\tdouble const * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::dvec4 const v(1.0);\n\t\tdouble const * p = glm::value_ptr(v);\n\t\tError += p == &v[0] ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_value_ptr_mat()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::mat2x2 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat2x3 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat2x4 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat3x2 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat3x3 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat3x4 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat4x2 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat4x3 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat4x4 m(1.0);\n\t\tfloat * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_value_ptr_mat_const()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::mat2x2 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat2x3 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat2x4 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat3x2 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat3x3 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat3x4 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat4x2 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat4x3 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\t{\n\t\tglm::mat4x4 const m(1.0);\n\t\tfloat const * p = glm::value_ptr(m);\n\t\tError += p == &m[0][0] ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_make_pointer_mat()\n{\n\tint Error = 0;\n\n\tfloat ArrayA[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};\n\tdouble ArrayB[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};\n\n\tglm::mat2x2 Mat2x2A = glm::make_mat2x2(ArrayA);\n\tglm::mat2x3 Mat2x3A = glm::make_mat2x3(ArrayA);\n\tglm::mat2x4 Mat2x4A = glm::make_mat2x4(ArrayA);\n\tglm::mat3x2 Mat3x2A = glm::make_mat3x2(ArrayA);\n\tglm::mat3x3 Mat3x3A = glm::make_mat3x3(ArrayA);\n\tglm::mat3x4 Mat3x4A = glm::make_mat3x4(ArrayA);\n\tglm::mat4x2 Mat4x2A = glm::make_mat4x2(ArrayA);\n\tglm::mat4x3 Mat4x3A = glm::make_mat4x3(ArrayA);\n\tglm::mat4x4 Mat4x4A = glm::make_mat4x4(ArrayA);\n\n\tglm::dmat2x2 Mat2x2B = glm::make_mat2x2(ArrayB);\n\tglm::dmat2x3 Mat2x3B = glm::make_mat2x3(ArrayB);\n\tglm::dmat2x4 Mat2x4B = glm::make_mat2x4(ArrayB);\n\tglm::dmat3x2 Mat3x2B = glm::make_mat3x2(ArrayB);\n\tglm::dmat3x3 Mat3x3B = glm::make_mat3x3(ArrayB);\n\tglm::dmat3x4 Mat3x4B = glm::make_mat3x4(ArrayB);\n\tglm::dmat4x2 Mat4x2B = glm::make_mat4x2(ArrayB);\n\tglm::dmat4x3 Mat4x3B = glm::make_mat4x3(ArrayB);\n\tglm::dmat4x4 Mat4x4B = glm::make_mat4x4(ArrayB);\n\n\treturn Error;\n}\n\nint test_make_pointer_vec()\n{\n\tint Error = 0;\n\n\tfloat ArrayA[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};\n\tint ArrayB[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};\n\tbool ArrayC[] = {true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false};\n\n\tglm::vec2 Vec2A = glm::make_vec2(ArrayA);\n\tglm::vec3 Vec3A = glm::make_vec3(ArrayA);\n\tglm::vec4 Vec4A = glm::make_vec4(ArrayA);\n\n\tglm::ivec2 Vec2B = glm::make_vec2(ArrayB);\n\tglm::ivec3 Vec3B = glm::make_vec3(ArrayB);\n\tglm::ivec4 Vec4B = glm::make_vec4(ArrayB);\n\n\tglm::bvec2 Vec2C = glm::make_vec2(ArrayC);\n\tglm::bvec3 Vec3C = glm::make_vec3(ArrayC);\n\tglm::bvec4 Vec4C = glm::make_vec4(ArrayC);\n\n\treturn Error;\n}\n\nint test_make_vec1()\n{\n\tint Error = 0;\n\n\tglm::ivec1 const v1 = glm::make_vec1(glm::ivec1(2));\n\tError += v1 == glm::ivec1(2) ? 0 : 1;\n\n\tglm::ivec1 const v2 = glm::make_vec1(glm::ivec2(2));\n\tError += v2 == glm::ivec1(2) ? 0 : 1;\n\n\tglm::ivec1 const v3 = glm::make_vec1(glm::ivec3(2));\n\tError += v3 == glm::ivec1(2) ? 0 : 1;\n\n\tglm::ivec1 const v4 = glm::make_vec1(glm::ivec4(2));\n\tError += v3 == glm::ivec1(2) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_make_vec2()\n{\n\tint Error = 0;\n\n\tglm::ivec2 const v1 = glm::make_vec2(glm::ivec1(2));\n\tError += v1 == glm::ivec2(2, 0) ? 0 : 1;\n\n\tglm::ivec2 const v2 = glm::make_vec2(glm::ivec2(2));\n\tError += v2 == glm::ivec2(2, 2) ? 0 : 1;\n\n\tglm::ivec2 const v3 = glm::make_vec2(glm::ivec3(2));\n\tError += v3 == glm::ivec2(2, 2) ? 0 : 1;\n\n\tglm::ivec2 const v4 = glm::make_vec2(glm::ivec4(2));\n\tError += v3 == glm::ivec2(2, 2) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_make_vec3()\n{\n\tint Error = 0;\n\n\tglm::ivec3 const v1 = glm::make_vec3(glm::ivec1(2));\n\tError += v1 == glm::ivec3(2, 0, 0) ? 0 : 1;\n\n\tglm::ivec3 const v2 = glm::make_vec3(glm::ivec2(2));\n\tError += v2 == glm::ivec3(2, 2, 0) ? 0 : 1;\n\n\tglm::ivec3 const v3 = glm::make_vec3(glm::ivec3(2));\n\tError += v3 == glm::ivec3(2, 2, 2) ? 0 : 1;\n\n\tglm::ivec3 const v4 = glm::make_vec3(glm::ivec4(2));\n\tError += v3 == glm::ivec3(2, 2, 2) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_make_vec4()\n{\n\tint Error = 0;\n\n\tglm::ivec4 const v1 = glm::make_vec4(glm::ivec1(2));\n\tError += v1 == glm::ivec4(2, 0, 0, 1) ? 0 : 1;\n\n\tglm::ivec4 const v2 = glm::make_vec4(glm::ivec2(2));\n\tError += v2 == glm::ivec4(2, 2, 0, 1) ? 0 : 1;\n\n\tglm::ivec4 const v3 = glm::make_vec4(glm::ivec3(2));\n\tError += v3 == glm::ivec4(2, 2, 2, 1) ? 0 : 1;\n\n\tglm::ivec4 const v4 = glm::make_vec4(glm::ivec4(2));\n\tError += v4 == glm::ivec4(2, 2, 2, 2) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_make_vec1();\n\tError += test_make_vec2();\n\tError += test_make_vec3();\n\tError += test_make_vec4();\n\tError += test_make_pointer_vec();\n\tError += test_make_pointer_mat();\n\tError += test_value_ptr_vec();\n\tError += test_value_ptr_vec_const();\n\tError += test_value_ptr_mat();\n\tError += test_value_ptr_mat_const();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_ulp.cpp",
    "content": "#include <glm/gtc/ulp.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <limits>\n\nint test_ulp_float_dist()\n{\n\tint Error = 0;\n\n\tfloat A = 1.0f;\n\n\tfloat B = glm::next_float(A);\n\tError += !glm::epsilonEqual(A, B, glm::epsilon<float>()) ? 0 : 1;\n\tfloat C = glm::prev_float(B);\n\tError += glm::epsilonEqual(A, C, glm::epsilon<float>()) ? 0 : 1;\n\n\tint D = glm::float_distance(A, B);\n\tError += D == 1 ? 0 : 1;\n\tint E = glm::float_distance(A, C);\n\tError += E == 0 ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_ulp_float_step()\n{\n\tint Error = 0;\n\n\tfloat A = 1.0f;\n\n\tfor(int i = 10; i < 1000; i *= 10)\n\t{\n\t\tfloat B = glm::next_float(A, i);\n\t\tError += !glm::epsilonEqual(A, B, glm::epsilon<float>()) ? 0 : 1;\n\t\tfloat C = glm::prev_float(B, i);\n\t\tError += glm::epsilonEqual(A, C, glm::epsilon<float>()) ? 0 : 1;\n\n\t\tint D = glm::float_distance(A, B);\n\t\tError += D == i ? 0 : 1;\n\t\tint E = glm::float_distance(A, C);\n\t\tError += E == 0 ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_ulp_double_dist()\n{\n\tint Error = 0;\n\n\tdouble A = 1.0;\n\n\tdouble B = glm::next_float(A);\n\tError += !glm::epsilonEqual(A, B, glm::epsilon<double>()) ? 0 : 1;\n\tdouble C = glm::prev_float(B);\n\tError += glm::epsilonEqual(A, C, glm::epsilon<double>()) ? 0 : 1;\n\n\tint D = glm::float_distance(A, B);\n\tError += D == 1 ? 0 : 1;\n\tint E = glm::float_distance(A, C);\n\tError += E == 0 ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_ulp_double_step()\n{\n\tint Error = 0;\n\n\tdouble A = 1.0;\n\n\tfor(int i = 10; i < 1000; i *= 10)\n\t{\n\t\tdouble B = glm::next_float(A, i);\n\t\tError += !glm::epsilonEqual(A, B, glm::epsilon<double>()) ? 0 : 1;\n\t\tdouble C = glm::prev_float(B, i);\n\t\tError += glm::epsilonEqual(A, C, glm::epsilon<double>()) ? 0 : 1;\n\n\t\tint D = glm::float_distance(A, B);\n\t\tError += D == i ? 0 : 1;\n\t\tint E = glm::float_distance(A, C);\n\t\tError += E == 0 ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\tError += test_ulp_float_dist();\n\tError += test_ulp_float_step();\n\tError += test_ulp_double_dist();\n\tError += test_ulp_double_step();\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_user_defined_types.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2010-09-16\n// Updated : 2011-05-27\n// Licence : This source is under MIT licence\n// File    : test/gtc/type_ptr.cpp\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#define GLM_FORCE_RADIANS\n#include <glm/gtc/user_defined_type.hpp>\n\nint test_make_pointer_vec()\n{\n\tint Error = 0;\n\n\tglm::func();\n\t//func();\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_make_pointer_vec();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtc/gtc_vec1.cpp",
    "content": "#include <glm/gtc/vec1.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/CMakeLists.txt",
    "content": "glmCreateTestGTC(gtx)\nglmCreateTestGTC(gtx_associated_min_max)\nglmCreateTestGTC(gtx_closest_point)\nglmCreateTestGTC(gtx_color_encoding)\nglmCreateTestGTC(gtx_color_space_YCoCg)\nglmCreateTestGTC(gtx_color_space)\nglmCreateTestGTC(gtx_common)\nglmCreateTestGTC(gtx_compatibility)\nglmCreateTestGTC(gtx_component_wise)\nglmCreateTestGTC(gtx_euler_angle)\nglmCreateTestGTC(gtx_extend)\nglmCreateTestGTC(gtx_extended_min_max)\nglmCreateTestGTC(gtx_exterior_product)\nglmCreateTestGTC(gtx_fast_exponential)\nglmCreateTestGTC(gtx_fast_square_root)\nglmCreateTestGTC(gtx_fast_trigonometry)\nglmCreateTestGTC(gtx_functions)\nglmCreateTestGTC(gtx_gradient_paint)\nglmCreateTestGTC(gtx_handed_coordinate_space)\nglmCreateTestGTC(gtx_integer)\nglmCreateTestGTC(gtx_intersect)\nglmCreateTestGTC(gtx_io)\nglmCreateTestGTC(gtx_log_base)\nglmCreateTestGTC(gtx_matrix_cross_product)\nglmCreateTestGTC(gtx_matrix_decompose)\nglmCreateTestGTC(gtx_matrix_factorisation)\nglmCreateTestGTC(gtx_matrix_interpolation)\nglmCreateTestGTC(gtx_matrix_major_storage)\nglmCreateTestGTC(gtx_matrix_operation)\nglmCreateTestGTC(gtx_matrix_query)\nglmCreateTestGTC(gtx_matrix_transform_2d)\nglmCreateTestGTC(gtx_norm)\nglmCreateTestGTC(gtx_normal)\nglmCreateTestGTC(gtx_normalize_dot)\nglmCreateTestGTC(gtx_number_precision)\nglmCreateTestGTC(gtx_orthonormalize)\nglmCreateTestGTC(gtx_optimum_pow)\nglmCreateTestGTC(gtx_perpendicular)\nglmCreateTestGTC(gtx_polar_coordinates)\nglmCreateTestGTC(gtx_projection)\nglmCreateTestGTC(gtx_quaternion)\nglmCreateTestGTC(gtx_dual_quaternion)\nglmCreateTestGTC(gtx_range)\nglmCreateTestGTC(gtx_rotate_normalized_axis)\nglmCreateTestGTC(gtx_rotate_vector)\nglmCreateTestGTC(gtx_scalar_multiplication)\nglmCreateTestGTC(gtx_scalar_relational)\nglmCreateTestGTC(gtx_spline)\nglmCreateTestGTC(gtx_string_cast)\nglmCreateTestGTC(gtx_texture)\nglmCreateTestGTC(gtx_type_aligned)\nglmCreateTestGTC(gtx_type_trait)\nglmCreateTestGTC(gtx_vec_swizzle)\nglmCreateTestGTC(gtx_vector_angle)\nglmCreateTestGTC(gtx_vector_query)\nglmCreateTestGTC(gtx_wrap)\n"
  },
  {
    "path": "external/glm/test/gtx/gtx.cpp",
    "content": "#include <glm/ext.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_associated_min_max.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtx/associated_min_max.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_closest_point.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/closest_point.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_color_encoding.cpp",
    "content": "#include <glm/gtx/color_encoding.hpp>\n#include <glm/gtc/color_space.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/constants.hpp>\n\nnamespace srgb\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tglm::vec3 const ColorSourceRGB(1.0, 0.5, 0.0);\n/*\n\t\t{\n\t\t\tglm::vec3 const ColorSRGB = glm::convertLinearSRGBToD65XYZ(ColorSourceRGB);\n\t\t\tglm::vec3 const ColorRGB = glm::convertD65XYZToLinearSRGB(ColorSRGB);\n\t\t\tError += glm::all(glm::epsilonEqual(ColorSourceRGB, ColorRGB, 0.00001f)) ? 0 : 1;\n\t\t}\n*/\n\t\t{\n\t\t\tglm::vec3 const ColorSRGB = glm::convertLinearToSRGB(ColorSourceRGB, 2.8f);\n\t\t\tglm::vec3 const ColorRGB = glm::convertSRGBToLinear(ColorSRGB, 2.8f);\n\t\t\tError += glm::all(glm::epsilonEqual(ColorSourceRGB, ColorRGB, 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\tglm::vec4 const ColorSourceRGBA(1.0, 0.5, 0.0, 1.0);\n\n\t\t{\n\t\t\tglm::vec4 const ColorSRGB = glm::convertLinearToSRGB(ColorSourceRGBA);\n\t\t\tglm::vec4 const ColorRGB = glm::convertSRGBToLinear(ColorSRGB);\n\t\t\tError += glm::all(glm::epsilonEqual(ColorSourceRGBA, ColorRGB, 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 const ColorSRGB = glm::convertLinearToSRGB(ColorSourceRGBA, 2.8f);\n\t\t\tglm::vec4 const ColorRGB = glm::convertSRGBToLinear(ColorSRGB, 2.8f);\n\t\t\tError += glm::all(glm::epsilonEqual(ColorSourceRGBA, ColorRGB, 0.00001f)) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace srgb\n\nint main()\n{\n\tint Error(0);\n\n\tError += srgb::test();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_color_space.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/color_space.hpp>\n\nint test_saturation()\n{\n\tint Error(0);\n\t\n\tglm::vec4 Color = glm::saturation(1.0f, glm::vec4(1.0, 0.5, 0.0, 1.0));\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_saturation();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_color_space_YCoCg.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/color_space_YCoCg.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_common.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/common.hpp>\n#include <glm/gtc/integer.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/vector_relational.hpp>\n#include <glm/common.hpp>\n\nnamespace fmod_\n{\n\ttemplate<typename genType>\n\tGLM_FUNC_QUALIFIER genType modTrunc(genType a, genType b)\n\t{\n\t\treturn a - b * glm::trunc(a / b);\n\t}\n\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\t{\n\t\t\tfloat A0(3.0);\n\t\t\tfloat B0(2.0f);\n\t\t\tfloat C0 = glm::fmod(A0, B0);\n\n\t\t\tError += glm::abs(C0 - 1.0f) < 0.00001f ? 0 : 1;\n\n\t\t\tglm::vec4 A1(3.0);\n\t\t\tfloat B1(2.0f);\n\t\t\tglm::vec4 C1 = glm::fmod(A1, B1);\n\n\t\t\tError += glm::all(glm::epsilonEqual(C1, glm::vec4(1.0f), 0.00001f)) ? 0 : 1;\n\n\t\t\tglm::vec4 A2(3.0);\n\t\t\tglm::vec4 B2(2.0f);\n\t\t\tglm::vec4 C2 = glm::fmod(A2, B2);\n\n\t\t\tError += glm::all(glm::epsilonEqual(C2, glm::vec4(1.0f), 0.00001f)) ? 0 : 1;\n\n\t\t\tglm::ivec4 A3(3);\n\t\t\tint B3(2);\n\t\t\tglm::ivec4 C3 = glm::fmod(A3, B3);\n\n\t\t\tError += glm::all(glm::equal(C3, glm::ivec4(1))) ? 0 : 1;\n\n\t\t\tglm::ivec4 A4(3);\n\t\t\tglm::ivec4 B4(2);\n\t\t\tglm::ivec4 C4 = glm::fmod(A4, B4);\n\n\t\t\tError += glm::all(glm::equal(C4, glm::ivec4(1))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tfloat A0(22.0);\n\t\t\tfloat B0(-10.0f);\n\t\t\tfloat C0 = glm::fmod(A0, B0);\n\n\t\t\tError += glm::abs(C0 - 2.0f) < 0.00001f ? 0 : 1;\n\n\t\t\tglm::vec4 A1(22.0);\n\t\t\tfloat B1(-10.0f);\n\t\t\tglm::vec4 C1 = glm::fmod(A1, B1);\n\n\t\t\tError += glm::all(glm::epsilonEqual(C1, glm::vec4(2.0f), 0.00001f)) ? 0 : 1;\n\n\t\t\tglm::vec4 A2(22.0);\n\t\t\tglm::vec4 B2(-10.0f);\n\t\t\tglm::vec4 C2 = glm::fmod(A2, B2);\n\n\t\t\tError += glm::all(glm::epsilonEqual(C2, glm::vec4(2.0f), 0.00001f)) ? 0 : 1;\n\n\t\t\tglm::ivec4 A3(22);\n\t\t\tint B3(-10);\n\t\t\tglm::ivec4 C3 = glm::fmod(A3, B3);\n\n\t\t\tError += glm::all(glm::equal(C3, glm::ivec4(2))) ? 0 : 1;\n\n\t\t\tglm::ivec4 A4(22);\n\t\t\tglm::ivec4 B4(-10);\n\t\t\tglm::ivec4 C4 = glm::fmod(A4, B4);\n\n\t\t\tError += glm::all(glm::equal(C4, glm::ivec4(2))) ? 0 : 1;\n\t\t}\n\n\t\t// http://stackoverflow.com/questions/7610631/glsl-mod-vs-hlsl-fmod\n\t\t{\n\t\t\tfor (float y = -10.0f; y < 10.0f; y += 0.1f)\n\t\t\tfor (float x = -10.0f; x < 10.0f; x += 0.1f)\n\t\t\t{\n\t\t\t\tfloat const A(std::fmod(x, y));\n\t\t\t\t//float const B(std::remainder(x, y));\n\t\t\t\tfloat const C(glm::fmod(x, y));\n\t\t\t\tfloat const D(modTrunc(x, y));\n\n\t\t\t\t//Error += glm::epsilonEqual(A, B, 0.0001f) ? 0 : 1;\n\t\t\t\t//assert(!Error);\n\t\t\t\tError += glm::epsilonEqual(A, C, 0.0001f) ? 0 : 1;\n\t\t\t\tassert(!Error);\n\t\t\t\tError += glm::epsilonEqual(A, D, 0.00001f) ? 0 : 1;\n\t\t\t\tassert(!Error);\n\t\t\t}\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace fmod_\n\nint test_isdenormal()\n{\n\tint Error = 0;\n\n\tbool A = glm::isdenormal(1.0f);\n\tError += !A ? 0 : 1;\n\n\tglm::bvec1 B = glm::isdenormal(glm::vec1(1.0f));\n\tError += !glm::any(B) ? 0 : 1;\n\n\tglm::bvec2 C = glm::isdenormal(glm::vec2(1.0f));\n\tError += !glm::any(C) ? 0 : 1;\n\n\tglm::bvec3 D = glm::isdenormal(glm::vec3(1.0f));\n\tError += !glm::any(D) ? 0 : 1;\n\n\tglm::bvec4 E = glm::isdenormal(glm::vec4(1.0f));\n\tError += !glm::any(E) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_isdenormal();\n\tError += ::fmod_::test();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_compatibility.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/compatibility.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\tError += glm::isfinite(1.0f) ? 0 : 1;\n\tError += glm::isfinite(1.0) ? 0 : 1;\n\tError += glm::isfinite(-1.0f) ? 0 : 1;\n\tError += glm::isfinite(-1.0) ? 0 : 1;\n\n\tError += glm::all(glm::isfinite(glm::vec4(1.0f))) ? 0 : 1;\n\tError += glm::all(glm::isfinite(glm::dvec4(1.0))) ? 0 : 1;\n\tError += glm::all(glm::isfinite(glm::vec4(-1.0f))) ? 0 : 1;\n\tError += glm::all(glm::isfinite(glm::dvec4(-1.0))) ? 0 : 1;\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_component_wise.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/component_wise.hpp>\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/constants.hpp>\n#include <limits>\n\nnamespace compNormalize\n{\n\tint run()\n\t{\n\t\tint Error(0);\n\n\t\t{\n\t\t\tglm::vec4 const A = glm::compNormalize<float>(glm::u8vec4(0, 127, 128, 255));\n\n\t\t\tError += glm::epsilonEqual(A.x, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tError += A.y < 0.5f ? 0 : 1;\n\t\t\tError += A.z > 0.5f ? 0 : 1;\n\t\t\tError += glm::epsilonEqual(A.w, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 const A = glm::compNormalize<float>(glm::i8vec4(-128, -1, 0, 127));\n\n\t\t\tError += glm::epsilonEqual(A.x,-1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tError += A.y < 0.0f ? 0 : 1;\n\t\t\tError += A.z > 0.0f ? 0 : 1;\n\t\t\tError += glm::epsilonEqual(A.w, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 const A = glm::compNormalize<float>(glm::u16vec4(\n\t\t\t\tstd::numeric_limits<glm::u16>::min(),\n\t\t\t\t(std::numeric_limits<glm::u16>::max() >> 1) + 0,\n\t\t\t\t(std::numeric_limits<glm::u16>::max() >> 1) + 1,\n\t\t\t\tstd::numeric_limits<glm::u16>::max()));\n\n\t\t\tError += glm::epsilonEqual(A.x, 0.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tError += A.y < 0.5f ? 0 : 1;\n\t\t\tError += A.z > 0.5f ? 0 : 1;\n\t\t\tError += glm::epsilonEqual(A.w, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 const A = glm::compNormalize<float>(glm::i16vec4(\n\t\t\t\tstd::numeric_limits<glm::i16>::min(),\n\t\t\t\tstatic_cast<glm::i16>(-1),\n\t\t\t\tstatic_cast<glm::i16>(0),\n\t\t\t\tstd::numeric_limits<glm::i16>::max()));\n\n\t\t\tError += glm::epsilonEqual(A.x,-1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t\tError += A.y < 0.0f ? 0 : 1;\n\t\t\tError += A.z > 0.0f ? 0 : 1;\n\t\t\tError += glm::epsilonEqual(A.w, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace compNormalize\n\nnamespace compScale\n{\n\tint run()\n\t{\n\t\tint Error(0);\n\n\t\t{\n\t\t\tglm::u8vec4 const A = glm::compScale<glm::u8>(glm::vec4(0.0f, 0.2f, 0.5f, 1.0f));\n\n\t\t\tError += A.x == std::numeric_limits<glm::u8>::min() ? 0 : 1;\n\t\t\tError += A.y < (std::numeric_limits<glm::u8>::max() >> 2) ? 0 : 1;\n\t\t\tError += A.z == 127 ? 0 : 1;\n\t\t\tError += A.w == 255 ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::i8vec4 const A = glm::compScale<glm::i8>(glm::vec4(0.0f,-1.0f, 0.5f, 1.0f));\n\n\t\t\tError += A.x == 0 ? 0 : 1;\n\t\t\tError += A.y == -128 ? 0 : 1;\n\t\t\tError += A.z == 63 ? 0 : 1;\n\t\t\tError += A.w == 127 ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::u16vec4 const A = glm::compScale<glm::u16>(glm::vec4(0.0f, 0.2f, 0.5f, 1.0f));\n\n\t\t\tError += A.x == std::numeric_limits<glm::u16>::min() ? 0 : 1;\n\t\t\tError += A.y < (std::numeric_limits<glm::u16>::max() >> 2) ? 0 : 1;\n\t\t\tError += A.z == 32767 ? 0 : 1;\n\t\t\tError += A.w == 65535 ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::i16vec4 const A = glm::compScale<glm::i16>(glm::vec4(0.0f,-1.0f, 0.5f, 1.0f));\n\n\t\t\tError += A.x == 0 ? 0 : 1;\n\t\t\tError += A.y == -32768 ? 0 : 1;\n\t\t\tError += A.z == 16383 ? 0 : 1;\n\t\t\tError += A.w == 32767 ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}// compScale\n\nint main()\n{\n\tint Error(0);\n\n\tError += compNormalize::run();\n\tError += compScale::run();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_dual_quaternion.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/dual_quaternion.hpp>\n#include <glm/gtc/matrix_transform.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtx/euler_angles.hpp>\n#include <glm/vector_relational.hpp>\n#if GLM_HAS_TRIVIAL_QUERIES\n#\tinclude <type_traits>\n#endif\n\nint myrand()\n{\n\tstatic int holdrand = 1;\n\treturn (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);\n}\n\nfloat myfrand() // returns values from -1 to 1 inclusive\n{\n\treturn float(double(myrand()) / double( 0x7ffff )) * 2.0f - 1.0f;\n}\n\nint test_dquat_type()\n{\n\tglm::dvec3 vA;\n\tglm::dquat dqA, dqB;\n\tglm::ddualquat C(dqA, dqB);\n\tglm::ddualquat B(dqA);\n\tglm::ddualquat D(dqA, vA);\n\treturn 0;\n}\n\nint test_scalars()\n{\n\tfloat const Epsilon = 0.0001f;\n\n\tint Error(0);\n\n\tglm::quat src_q1 = glm::quat(1.0f,2.0f,3.0f,4.0f);\n\tglm::quat src_q2 = glm::quat(5.0f,6.0f,7.0f,8.0f);\n\tglm::dualquat src1(src_q1,src_q2);\n\n\t{\n\t\tglm::dualquat dst1 = src1 * 2.0f;\n\t\tglm::dualquat dst2 = 2.0f * src1;\n\t\tglm::dualquat dst3 = src1;\n\t\tdst3 *= 2.0f;\n\t\tglm::dualquat dstCmp(src_q1 * 2.0f,src_q2 * 2.0f);\n\t\tError += glm::all(glm::epsilonEqual(dst1.real,dstCmp.real, Epsilon)) && glm::all(glm::epsilonEqual(dst1.dual,dstCmp.dual, Epsilon)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(dst2.real,dstCmp.real, Epsilon)) && glm::all(glm::epsilonEqual(dst2.dual,dstCmp.dual, Epsilon)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(dst3.real,dstCmp.real, Epsilon)) && glm::all(glm::epsilonEqual(dst3.dual,dstCmp.dual, Epsilon)) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::dualquat dst1 = src1 / 2.0f;\n\t\tglm::dualquat dst2 = src1;\n\t\tdst2 /= 2.0f;\n\t\tglm::dualquat dstCmp(src_q1 / 2.0f,src_q2 / 2.0f);\n\t\tError += glm::all(glm::epsilonEqual(dst1.real,dstCmp.real, Epsilon)) && glm::all(glm::epsilonEqual(dst1.dual,dstCmp.dual, Epsilon)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(dst2.real,dstCmp.real, Epsilon)) && glm::all(glm::epsilonEqual(dst2.dual,dstCmp.dual, Epsilon)) ? 0 : 1;\n\t}\n\treturn Error;\n}\n\nint test_inverse() \n{\n\tint Error(0);\n\n\tfloat const Epsilon = 0.0001f;\n\n\tglm::dualquat dqid = glm::dual_quat_identity<float, glm::defaultp>();\n\tglm::mat4x4 mid(1.0f);\n\n\tfor (int j = 0; j < 100; ++j)\n\t{\n\t\tglm::mat4x4 rot = glm::yawPitchRoll(myfrand() * 360.0f, myfrand() * 360.0f, myfrand() * 360.0f);\n\t\tglm::vec3 vt = glm::vec3(myfrand() * 10.0f, myfrand() * 10.0f, myfrand() * 10.0f);\n\n\t\tglm::mat4x4 m = glm::translate(mid, vt) * rot;\n\n\t\tglm::quat qr = glm::quat_cast(m);\n\n\t\tglm::dualquat dq(qr);\n\n\t\tglm::dualquat invdq = glm::inverse(dq);\n\n\t\tglm::dualquat r1 = invdq * dq;\n\t\tglm::dualquat r2 = dq * invdq;\n\n\t\tError += glm::all(glm::epsilonEqual(r1.real, dqid.real, Epsilon)) && glm::all(glm::epsilonEqual(r1.dual, dqid.dual, Epsilon)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(r2.real, dqid.real, Epsilon)) && glm::all(glm::epsilonEqual(r2.dual, dqid.dual, Epsilon)) ? 0 : 1;\n\n\t\t// testing commutative property\n\t\tglm::dualquat r (   glm::quat( myfrand() * glm::pi<float>() * 2.0f, myfrand(), myfrand(), myfrand() ),\n\t\t\t\t\t\t\tglm::vec3(myfrand() * 10.0f, myfrand() * 10.0f, myfrand() * 10.0f) );\n\t\tglm::dualquat riq = (r * invdq) * dq;\n\t\tglm::dualquat rqi = (r * dq) * invdq;\n\n\t\tError += glm::all(glm::epsilonEqual(riq.real, rqi.real, Epsilon)) && glm::all(glm::epsilonEqual(riq.dual, rqi.dual, Epsilon)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_mul() \n{\n\tint Error(0);\n\n\tfloat const Epsilon = 0.0001f;\n\n\tglm::mat4x4 mid(1.0f);\n\n\tfor (int j = 0; j < 100; ++j)\n\t{\n\t\t// generate random rotations and translations and compare transformed by matrix and dualquats random points \n\t\tglm::vec3 vt1 = glm::vec3(myfrand() * 10.0f, myfrand() * 10.0f, myfrand() * 10.0f);\n\t\tglm::vec3 vt2 = glm::vec3(myfrand() * 10.0f, myfrand() * 10.0f, myfrand() * 10.0f);\n\n\t\tglm::mat4x4 rot1 = glm::yawPitchRoll(myfrand() * 360.0f, myfrand() * 360.0f, myfrand() * 360.0f);\n\t\tglm::mat4x4 rot2 = glm::yawPitchRoll(myfrand() * 360.0f, myfrand() * 360.0f, myfrand() * 360.0f);\n\t\tglm::mat4x4 m1 = glm::translate(mid, vt1) * rot1;\n\t\tglm::mat4x4 m2 = glm::translate(mid, vt2) * rot2;\n\t\tglm::mat4x4 m3 = m2 * m1;\n\t\tglm::mat4x4 m4 = m1 * m2;\n\n\t\tglm::quat qrot1 = glm::quat_cast(rot1);\n\t\tglm::quat qrot2 = glm::quat_cast(rot2);\n\n\t\tglm::dualquat dq1 = glm::dualquat(qrot1,vt1);\n\t\tglm::dualquat dq2 = glm::dualquat(qrot2,vt2);\n\t\tglm::dualquat dq3 = dq2 * dq1;\n\t\tglm::dualquat dq4 = dq1 * dq2;\n\n\t\tfor (int i = 0; i < 100; ++i)\n\t\t{\n\t\t\tglm::vec4 src_pt = glm::vec4(myfrand() * 4.0f, myfrand() * 5.0f, myfrand() * 3.0f,1.0f);\n\t\t\t// test both multiplication orders        \n\t\t\tglm::vec4 dst_pt_m3  = m3 * src_pt; \n\t\t\tglm::vec4 dst_pt_dq3 = dq3 * src_pt;\n\n\t\t\tglm::vec4 dst_pt_m3_i  = glm::inverse(m3) * src_pt;\n\t\t\tglm::vec4 dst_pt_dq3_i = src_pt * dq3;\n\n\t\t\tglm::vec4 dst_pt_m4  = m4 * src_pt;\n\t\t\tglm::vec4 dst_pt_dq4 = dq4 * src_pt;\n\n\t\t\tglm::vec4 dst_pt_m4_i  = glm::inverse(m4) * src_pt;\n\t\t\tglm::vec4 dst_pt_dq4_i = src_pt * dq4;\n\n\t\t\tError += glm::all(glm::epsilonEqual(dst_pt_m3, dst_pt_dq3, Epsilon)) ? 0 : 1;\n\t\t\tError += glm::all(glm::epsilonEqual(dst_pt_m4, dst_pt_dq4, Epsilon)) ? 0 : 1;\n\t\t\tError += glm::all(glm::epsilonEqual(dst_pt_m3_i, dst_pt_dq3_i, Epsilon)) ? 0 : 1;\n\t\t\tError += glm::all(glm::epsilonEqual(dst_pt_m4_i, dst_pt_dq4_i, Epsilon)) ? 0 : 1;\n\t\t}\n\t} \n\n\treturn Error;\n}\n\nint test_dual_quat_ctr()\n{\n\tint Error(0);\n\n#\tif GLM_HAS_TRIVIAL_QUERIES\n\t//\tError += std::is_trivially_default_constructible<glm::dualquat>::value ? 0 : 1;\n\t//\tError += std::is_trivially_default_constructible<glm::ddualquat>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::dualquat>::value ? 0 : 1;\n\t//\tError += std::is_trivially_copy_assignable<glm::ddualquat>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::dualquat>::value ? 0 : 1;\n\t\tError += std::is_trivially_copyable<glm::ddualquat>::value ? 0 : 1;\n\n\t\tError += std::is_copy_constructible<glm::dualquat>::value ? 0 : 1;\n\t\tError += std::is_copy_constructible<glm::ddualquat>::value ? 0 : 1;\n#\tendif\n\n\treturn Error;\n}\n\nint test_size()\n{\n\tint Error = 0;\n\n\tError += 32 == sizeof(glm::dualquat) ? 0 : 1;\n\tError += 64 == sizeof(glm::ddualquat) ? 0 : 1;\n\tError += glm::dualquat().length() == 2 ? 0 : 1;\n\tError += glm::ddualquat().length() == 2 ? 0 : 1;\n\tError += glm::dualquat::length() == 2 ? 0 : 1;\n\tError += glm::ddualquat::length() == 2 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_dual_quat_ctr();\n\tError += test_dquat_type();\n\tError += test_scalars();\n\tError += test_inverse();\n\tError += test_mul();\n\tError += test_size();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_euler_angle.cpp",
    "content": "// Code sample from Filippo Ramaciotti\n\n#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/matrix_transform.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtx/string_cast.hpp>\n#include <glm/gtx/euler_angles.hpp>\n#include <cstdio>\n\nnamespace test_eulerAngleX\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tfloat const Angle(glm::pi<float>() * 0.5f);\n\t\tglm::vec3 const X(1.0f, 0.0f, 0.0f);\n\n\t\tglm::vec4 const Y(0.0f, 1.0f, 0.0f, 1.0f);\n\t\tglm::vec4 const Y1 = glm::rotate(glm::mat4(1.0f), Angle, X) * Y;\n\t\tglm::vec4 const Y2 = glm::eulerAngleX(Angle) * Y;\n\t\tglm::vec4 const Y3 = glm::eulerAngleXY(Angle, 0.0f) * Y;\n\t\tglm::vec4 const Y4 = glm::eulerAngleYX(0.0f, Angle) * Y;\n\t\tglm::vec4 const Y5 = glm::eulerAngleXZ(Angle, 0.0f) * Y;\n\t\tglm::vec4 const Y6 = glm::eulerAngleZX(0.0f, Angle) * Y;\n\t\tglm::vec4 const Y7 = glm::eulerAngleYXZ(0.0f, Angle, 0.0f) * Y;\n\t\tError += glm::all(glm::epsilonEqual(Y1, Y2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Y1, Y3, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Y1, Y4, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Y1, Y5, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Y1, Y6, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Y1, Y7, 0.00001f)) ? 0 : 1;\n\n\t\tglm::vec4 const Z(0.0f, 0.0f, 1.0f, 1.0f);\n\t\tglm::vec4 const Z1 = glm::rotate(glm::mat4(1.0f), Angle, X) * Z;\n\t\tglm::vec4 const Z2 = glm::eulerAngleX(Angle) * Z;\n\t\tglm::vec4 const Z3 = glm::eulerAngleXY(Angle, 0.0f) * Z;\n\t\tglm::vec4 const Z4 = glm::eulerAngleYX(0.0f, Angle) * Z;\n\t\tglm::vec4 const Z5 = glm::eulerAngleXZ(Angle, 0.0f) * Z;\n\t\tglm::vec4 const Z6 = glm::eulerAngleZX(0.0f, Angle) * Z;\n\t\tglm::vec4 const Z7 = glm::eulerAngleYXZ(0.0f, Angle, 0.0f) * Z;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z3, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z4, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z5, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z6, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z7, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleX\n\nnamespace test_eulerAngleY\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tfloat const Angle(glm::pi<float>() * 0.5f);\n\t\tglm::vec3 const Y(0.0f, 1.0f, 0.0f);\n\n\t\tglm::vec4 const X(1.0f, 0.0f, 0.0f, 1.0f);\n\t\tglm::vec4 const X1 = glm::rotate(glm::mat4(1.0f), Angle, Y) * X;\n\t\tglm::vec4 const X2 = glm::eulerAngleY(Angle) * X;\n\t\tglm::vec4 const X3 = glm::eulerAngleYX(Angle, 0.0f) * X;\n\t\tglm::vec4 const X4 = glm::eulerAngleXY(0.0f, Angle) * X;\n\t\tglm::vec4 const X5 = glm::eulerAngleYZ(Angle, 0.0f) * X;\n\t\tglm::vec4 const X6 = glm::eulerAngleZY(0.0f, Angle) * X;\n\t\tglm::vec4 const X7 = glm::eulerAngleYXZ(Angle, 0.0f, 0.0f) * X;\n\t\tError += glm::all(glm::epsilonEqual(X1, X2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X3, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X4, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X5, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X6, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X7, 0.00001f)) ? 0 : 1;\n\n\t\tglm::vec4 const Z(0.0f, 0.0f, 1.0f, 1.0f);\n\t\tglm::vec4 const Z1 = glm::eulerAngleY(Angle) * Z;\n\t\tglm::vec4 const Z2 = glm::rotate(glm::mat4(1.0f), Angle, Y) * Z;\n\t\tglm::vec4 const Z3 = glm::eulerAngleYX(Angle, 0.0f) * Z;\n\t\tglm::vec4 const Z4 = glm::eulerAngleXY(0.0f, Angle) * Z;\n\t\tglm::vec4 const Z5 = glm::eulerAngleYZ(Angle, 0.0f) * Z;\n\t\tglm::vec4 const Z6 = glm::eulerAngleZY(0.0f, Angle) * Z;\n\t\tglm::vec4 const Z7 = glm::eulerAngleYXZ(Angle, 0.0f, 0.0f) * Z;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z3, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z4, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z5, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z6, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z7, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleY\n\nnamespace test_eulerAngleZ\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tfloat const Angle(glm::pi<float>() * 0.5f);\n\t\tglm::vec3 const Z(0.0f, 0.0f, 1.0f);\n\n\t\tglm::vec4 const X(1.0f, 0.0f, 0.0f, 1.0f);\n\t\tglm::vec4 const X1 = glm::rotate(glm::mat4(1.0f), Angle, Z) * X;\n\t\tglm::vec4 const X2 = glm::eulerAngleZ(Angle) * X;\n\t\tglm::vec4 const X3 = glm::eulerAngleZX(Angle, 0.0f) * X;\n\t\tglm::vec4 const X4 = glm::eulerAngleXZ(0.0f, Angle) * X;\n\t\tglm::vec4 const X5 = glm::eulerAngleZY(Angle, 0.0f) * X;\n\t\tglm::vec4 const X6 = glm::eulerAngleYZ(0.0f, Angle) * X;\n\t\tglm::vec4 const X7 = glm::eulerAngleYXZ(0.0f, 0.0f, Angle) * X;\n\t\tError += glm::all(glm::epsilonEqual(X1, X2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X3, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X4, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X5, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X6, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(X1, X7, 0.00001f)) ? 0 : 1;\n\n\t\tglm::vec4 const Y(1.0f, 0.0f, 0.0f, 1.0f);\n\t\tglm::vec4 const Z1 = glm::rotate(glm::mat4(1.0f), Angle, Z) * Y;\n\t\tglm::vec4 const Z2 = glm::eulerAngleZ(Angle) * Y;\n\t\tglm::vec4 const Z3 = glm::eulerAngleZX(Angle, 0.0f) * Y;\n\t\tglm::vec4 const Z4 = glm::eulerAngleXZ(0.0f, Angle) * Y;\n\t\tglm::vec4 const Z5 = glm::eulerAngleZY(Angle, 0.0f) * Y;\n\t\tglm::vec4 const Z6 = glm::eulerAngleYZ(0.0f, Angle) * Y;\n\t\tglm::vec4 const Z7 = glm::eulerAngleYXZ(0.0f, 0.0f, Angle) * Y;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z3, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z4, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z5, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z6, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(Z1, Z7, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleZ\n\nnamespace test_eulerAngleXY\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::vec4 const V(1.0f);\n\n\t\tfloat const AngleX(glm::pi<float>() * 0.5f);\n\t\tfloat const AngleY(glm::pi<float>() * 0.25f);\n\n\t\tglm::vec3 const axisX(1.0f, 0.0f, 0.0f);\n\t\tglm::vec3 const axisY(0.0f, 1.0f, 0.0f);\n\n\t\tglm::vec4 const V1 = (glm::rotate(glm::mat4(1.0f), AngleX, axisX) * glm::rotate(glm::mat4(1.0f), AngleY, axisY)) * V;\n\t\tglm::vec4 const V2 = glm::eulerAngleXY(AngleX, AngleY) * V;\n\t\tglm::vec4 const V3 = glm::eulerAngleX(AngleX) * glm::eulerAngleY(AngleY) * V;\n\t\tError += glm::all(glm::epsilonEqual(V1, V2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(V1, V3, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleXY\n\nnamespace test_eulerAngleYX\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::vec4 const V(1.0f);\n\n\t\tfloat const AngleX(glm::pi<float>() * 0.5f);\n\t\tfloat const AngleY(glm::pi<float>() * 0.25f);\n\n\t\tglm::vec3 const axisX(1.0f, 0.0f, 0.0f);\n\t\tglm::vec3 const axisY(0.0f, 1.0f, 0.0f);\n\n\t\tglm::vec4 const V1 = (glm::rotate(glm::mat4(1.0f), AngleY, axisY) * glm::rotate(glm::mat4(1.0f), AngleX, axisX)) * V;\n\t\tglm::vec4 const V2 = glm::eulerAngleYX(AngleY, AngleX) * V;\n\t\tglm::vec4 const V3 = glm::eulerAngleY(AngleY) * glm::eulerAngleX(AngleX) * V;\n\t\tError += glm::all(glm::epsilonEqual(V1, V2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(V1, V3, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleYX\n\nnamespace test_eulerAngleXZ\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::vec4 const V(1.0f);\n\n\t\tfloat const AngleX(glm::pi<float>() * 0.5f);\n\t\tfloat const AngleZ(glm::pi<float>() * 0.25f);\n\n\t\tglm::vec3 const axisX(1.0f, 0.0f, 0.0f);\n\t\tglm::vec3 const axisZ(0.0f, 0.0f, 1.0f);\n\n\t\tglm::vec4 const V1 = (glm::rotate(glm::mat4(1.0f), AngleX, axisX) * glm::rotate(glm::mat4(1.0f), AngleZ, axisZ)) * V;\n\t\tglm::vec4 const V2 = glm::eulerAngleXZ(AngleX, AngleZ) * V;\n\t\tglm::vec4 const V3 = glm::eulerAngleX(AngleX) * glm::eulerAngleZ(AngleZ) * V;\n\t\tError += glm::all(glm::epsilonEqual(V1, V2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(V1, V3, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleXZ\n\nnamespace test_eulerAngleZX\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::vec4 const V(1.0f);\n\n\t\tfloat const AngleX(glm::pi<float>() * 0.5f);\n\t\tfloat const AngleZ(glm::pi<float>() * 0.25f);\n\n\t\tglm::vec3 const axisX(1.0f, 0.0f, 0.0f);\n\t\tglm::vec3 const axisZ(0.0f, 0.0f, 1.0f);\n\n\t\tglm::vec4 const V1 = (glm::rotate(glm::mat4(1.0f), AngleZ, axisZ) * glm::rotate(glm::mat4(1.0f), AngleX, axisX)) * V;\n\t\tglm::vec4 const V2 = glm::eulerAngleZX(AngleZ, AngleX) * V;\n\t\tglm::vec4 const V3 = glm::eulerAngleZ(AngleZ) * glm::eulerAngleX(AngleX) * V;\n\t\tError += glm::all(glm::epsilonEqual(V1, V2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(V1, V3, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleZX\n\nnamespace test_eulerAngleYZ\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::vec4 const V(1.0f);\n\n\t\tfloat const AngleY(glm::pi<float>() * 0.5f);\n\t\tfloat const AngleZ(glm::pi<float>() * 0.25f);\n\n\t\tglm::vec3 const axisX(1.0f, 0.0f, 0.0f);\n\t\tglm::vec3 const axisY(0.0f, 1.0f, 0.0f);\n\t\tglm::vec3 const axisZ(0.0f, 0.0f, 1.0f);\n\n\t\tglm::vec4 const V1 = (glm::rotate(glm::mat4(1.0f), AngleY, axisY) * glm::rotate(glm::mat4(1.0f), AngleZ, axisZ)) * V;\n\t\tglm::vec4 const V2 = glm::eulerAngleYZ(AngleY, AngleZ) * V;\n\t\tglm::vec4 const V3 = glm::eulerAngleY(AngleY) * glm::eulerAngleZ(AngleZ) * V;\n\t\tError += glm::all(glm::epsilonEqual(V1, V2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(V1, V3, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleYZ\n\nnamespace test_eulerAngleZY\n{\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\tglm::vec4 const V(1.0f);\n\n\t\tfloat const AngleY(glm::pi<float>() * 0.5f);\n\t\tfloat const AngleZ(glm::pi<float>() * 0.25f);\n\n\t\tglm::vec3 const axisX(1.0f, 0.0f, 0.0f);\n\t\tglm::vec3 const axisY(0.0f, 1.0f, 0.0f);\n\t\tglm::vec3 const axisZ(0.0f, 0.0f, 1.0f);\n\n\t\tglm::vec4 const V1 = (glm::rotate(glm::mat4(1.0f), AngleZ, axisZ) * glm::rotate(glm::mat4(1.0f), AngleY, axisY)) * V;\n\t\tglm::vec4 const V2 = glm::eulerAngleZY(AngleZ, AngleY) * V;\n\t\tglm::vec4 const V3 = glm::eulerAngleZ(AngleZ) * glm::eulerAngleY(AngleY) * V;\n\t\tError += glm::all(glm::epsilonEqual(V1, V2, 0.00001f)) ? 0 : 1;\n\t\tError += glm::all(glm::epsilonEqual(V1, V3, 0.00001f)) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace test_eulerAngleZY\n\nnamespace test_eulerAngleYXZ\n{\n\tint test()\n\t{\n\t\tglm::f32 first =  1.046f;\n\t\tglm::f32 second = 0.52f;\n\t\tglm::f32 third = -0.785f;\n\n\t\tglm::fmat4 rotationEuler = glm::eulerAngleYXZ(first, second, third); \n\n\t\tglm::fmat4 rotationInvertedY  = glm::eulerAngleY(-1.f*first) * glm::eulerAngleX(second) * glm::eulerAngleZ(third); \n\t\tglm::fmat4 rotationDumb = glm::fmat4(); \n\t\trotationDumb = glm::rotate(rotationDumb, first, glm::fvec3(0,1,0));\n\t\trotationDumb = glm::rotate(rotationDumb, second, glm::fvec3(1,0,0));\n\t\trotationDumb = glm::rotate(rotationDumb, third, glm::fvec3(0,0,1));\n\n\t\tstd::printf(\"%s\\n\", glm::to_string(glm::fmat3(rotationEuler)).c_str());\n\t\tstd::printf(\"%s\\n\", glm::to_string(glm::fmat3(rotationDumb)).c_str());\n\t\tstd::printf(\"%s\\n\", glm::to_string(glm::fmat3(rotationInvertedY)).c_str());\n\n\t\tstd::printf(\"\\nRESIDUAL\\n\");\n\t\tstd::printf(\"%s\\n\", glm::to_string(glm::fmat3(rotationEuler-(rotationDumb))).c_str());\n\t\tstd::printf(\"%s\\n\", glm::to_string(glm::fmat3(rotationEuler-(rotationInvertedY))).c_str());\n\n\t\treturn 0;\n\t}\n}//namespace eulerAngleYXZ\n\nint main()\n{ \n\tint Error = 0;\n\n\tError += test_eulerAngleX::test();\n\tError += test_eulerAngleY::test();\n\tError += test_eulerAngleZ::test();\n\tError += test_eulerAngleXY::test();\n\tError += test_eulerAngleYX::test();\n\tError += test_eulerAngleXZ::test();\n\tError += test_eulerAngleZX::test();\n\tError += test_eulerAngleYZ::test();\n\tError += test_eulerAngleZY::test();\n\tError += test_eulerAngleYXZ::test();\n\n\treturn Error; \n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_extend.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/extend.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_extended_min_max.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n\n#include <glm/gtx/extended_min_max.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <glm/gtc/epsilon.hpp>\n\n// This file has divisions by zero to test isnan\n#if GLM_COMPILER & GLM_COMPILER_VC\n#\tpragma warning(disable : 4723)\n#endif\n\nnamespace fmin_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tfloat Zero_f = 0.0f;\n\t\tglm::vec1 A0 = glm::fmin(glm::vec1(1), glm::vec1(Zero_f / 0.0f));\n\t\tError += glm::epsilonEqual(A0.x, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\n\t\tglm::vec1 A1 = glm::fmin(glm::vec1(Zero_f / 0.0f), glm::vec1(1));\n\t\tError += glm::epsilonEqual(A1.x, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\n\t\tglm::vec2 B0 = glm::fmin(glm::vec2(1), glm::vec2(1));\n\t\tglm::vec2 B1 = glm::fmin(glm::vec2(1), 1.0f);\n\t\tbool B2 = glm::all(glm::equal(B0, B1));\n\t\tError += B2 ? 0 : 1;\n\n\t\tglm::vec3 C0 = glm::fmin(glm::vec3(1), glm::vec3(1));\n\t\tglm::vec3 C1 = glm::fmin(glm::vec3(1), 1.0f);\n\t\tbool C2 = glm::all(glm::equal(C0, C1));\n\t\tError += C2 ? 0 : 1;\n\n\t\tglm::vec4 D0 = glm::fmin(glm::vec4(1), glm::vec4(1));\n\t\tglm::vec4 D1 = glm::fmin(glm::vec4(1), 1.0f);\n\t\tbool D2 = glm::all(glm::equal(D0, D1));\n\t\tError += D2 ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace fmin_\n\nnamespace fmax_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tfloat Zero_f = 0.0f;\n\t\tglm::vec1 A0 = glm::fmax(glm::vec1(1), glm::vec1(Zero_f / 0.0f));\n\t\tError += glm::epsilonEqual(A0.x, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\n\t\tglm::vec1 A1 = glm::fmax(glm::vec1(Zero_f / 0.0f), glm::vec1(1));\n\t\tError += glm::epsilonEqual(A0.x, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\n\t\tglm::vec2 B0 = glm::fmax(glm::vec2(1), glm::vec2(1));\n\t\tglm::vec2 B1 = glm::fmax(glm::vec2(1), 1.0f);\n\t\tbool B2 = glm::all(glm::equal(B0, B1));\n\t\tError += B2 ? 0 : 1;\n\n\t\tglm::vec3 C0 = glm::fmax(glm::vec3(1), glm::vec3(1));\n\t\tglm::vec3 C1 = glm::fmax(glm::vec3(1), 1.0f);\n\t\tbool C2 = glm::all(glm::equal(C0, C1));\n\t\tError += C2 ? 0 : 1;\n\n\t\tglm::vec4 D0 = glm::fmax(glm::vec4(1), glm::vec4(1));\n\t\tglm::vec4 D1 = glm::fmax(glm::vec4(1), 1.0f);\n\t\tbool D2 = glm::all(glm::equal(D0, D1));\n\t\tError += D2 ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace fmax_\n\nnamespace fclamp_\n{\n\tstatic int test()\n\t{\n\t\tint Error = 0;\n\n\t\tfloat Zero_f = 0.0f;\n\t\tglm::vec1 A0 = glm::fclamp(glm::vec1(1), glm::vec1(Zero_f / 0.0f), glm::vec1(2.0f));\n\t\tError += glm::epsilonEqual(A0.x, 1.0f, glm::epsilon<float>()) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace fclamp_\n\nint main()\n{\n\tint Error = 0;\n\n\tError += fmin_::test();\n\tError += fmax_::test();\n\tError += fclamp_::test();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_extented_min_max.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to deal\n/// in the Software without restriction, including without limitation the rights\n/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n/// copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n/// \n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n/// \n/// Restrictions:\n///\t\tBy making use of the Software for military purposes, you choose to make\n///\t\ta Bunny unhappy.\n/// \n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n/// THE SOFTWARE.\n///\n/// @file test/gtx/gtx_extented_min_max.cpp\n/// @date 2013-10-25 / 2014-11-25\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <glm/gtx/extended_min_max.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_exterior_product.cpp",
    "content": "#include <glm/gtx/exterior_product.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/vec2.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\tfloat const f = glm::cross(glm::vec2(1.0f, 1.0f), glm::vec2(1.0f, 1.0f));\n\tError += glm::epsilonEqual(f, 0.0f, 0.001f) ? 0 : 1;\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_fast_exponential.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/fast_exponential.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_fast_square_root.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/fast_square_root.hpp>\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/vector_relational.hpp>\n\nint test_fastInverseSqrt()\n{\n\tint Error(0);\n\n\tError += glm::epsilonEqual(glm::fastInverseSqrt(1.0f), 1.0f, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(glm::fastInverseSqrt(1.0), 1.0, 0.01) ? 0 : 1;\n\tError += glm::all(glm::epsilonEqual(glm::fastInverseSqrt(glm::vec2(1.0f)), glm::vec2(1.0f), 0.01f)) ? 0 : 1;\n\tError += glm::all(glm::epsilonEqual(glm::fastInverseSqrt(glm::dvec3(1.0)), glm::dvec3(1.0), 0.01)) ? 0 : 1;\n\tError += glm::all(glm::epsilonEqual(glm::fastInverseSqrt(glm::dvec4(1.0)), glm::dvec4(1.0), 0.01)) ? 0 : 1;\n\n\t\n\treturn 0;\n}\n\nint test_fastDistance()\n{\n\tint Error(0);\n\n\tglm::mediump_f32 A = glm::fastDistance(glm::mediump_f32(0.0f), glm::mediump_f32(1.0f));\n\tglm::mediump_f32 B = glm::fastDistance(glm::mediump_f32vec2(0.0f), glm::mediump_f32vec2(1.0f, 0.0f));\n\tglm::mediump_f32 C = glm::fastDistance(glm::mediump_f32vec3(0.0f), glm::mediump_f32vec3(1.0f, 0.0f, 0.0f));\n\tglm::mediump_f32 D = glm::fastDistance(glm::mediump_f32vec4(0.0f), glm::mediump_f32vec4(1.0f, 0.0f, 0.0f, 0.0f));\n\n\tError += glm::epsilonEqual(A, glm::mediump_f32(1.0f), glm::mediump_f32(0.01f)) ? 0 : 1;\n\tError += glm::epsilonEqual(B, glm::mediump_f32(1.0f), glm::mediump_f32(0.01f)) ? 0 : 1;\n\tError += glm::epsilonEqual(C, glm::mediump_f32(1.0f), glm::mediump_f32(0.01f)) ? 0 : 1;\n\tError += glm::epsilonEqual(D, glm::mediump_f32(1.0f), glm::mediump_f32(0.01f)) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_fastInverseSqrt();\n\tError += test_fastDistance();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_fast_trigonometry.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtx/fast_trigonometry.hpp>\n#include <glm/gtx/integer.hpp>\n#include <glm/gtx/common.hpp>\n#include <glm/gtc/constants.hpp>\n#include <glm/gtc/ulp.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <glm/trigonometric.hpp>\n#include <cmath>\n#include <ctime>\n#include <cstdio>\n#include <vector>\n\nnamespace fastCos\n{\n\tint perf(bool NextFloat)\n\t{\n\t\tconst float begin = -glm::pi<float>();\n\t\tconst float end = glm::pi<float>();\n\t\tfloat result = 0.f;\n\n\t\tconst std::clock_t timestamp1 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::fastCos(i);\n\n\t\tconst std::clock_t timestamp2 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::cos(i);\n\n\t\tconst std::clock_t timestamp3 = std::clock();\n\t\tconst std::clock_t time_fast = timestamp2 - timestamp1;\n\t\tconst std::clock_t time_default = timestamp3 - timestamp2;\n\t\tstd::printf(\"fastCos Time %d clocks\\n\", static_cast<unsigned int>(time_fast));\n\t\tstd::printf(\"cos Time %d clocks\\n\", static_cast<unsigned int>(time_default));\n\n\t\treturn time_fast <= time_default ? 0 : 1;\n\t}\n}//namespace fastCos\n\nnamespace fastSin\n{\n\t/*\n\tfloat sin(float x) {\n\tfloat temp;\n\ttemp = (x + M_PI) / ((2 * M_PI) - M_PI);\n\treturn limited_sin((x + M_PI) - ((2 * M_PI) - M_PI) * temp));\n\t}\n\t*/\n\n\tint perf(bool NextFloat)\n\t{\n\t\tconst float begin = -glm::pi<float>();\n\t\tconst float end = glm::pi<float>();\n\t\tfloat result = 0.f;\n\n\t\tconst std::clock_t timestamp1 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::fastSin(i);\n\n\t\tconst std::clock_t timestamp2 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::sin(i);\n\n\t\tconst std::clock_t timestamp3 = std::clock();\n\t\tconst std::clock_t time_fast = timestamp2 - timestamp1;\n\t\tconst std::clock_t time_default = timestamp3 - timestamp2;\n\t\tstd::printf(\"fastSin Time %d clocks\\n\", static_cast<unsigned int>(time_fast));\n\t\tstd::printf(\"sin Time %d clocks\\n\", static_cast<unsigned int>(time_default));\n\n\t\treturn time_fast <= time_default ? 0 : 1;\n\t}\n}//namespace fastSin\n\nnamespace fastTan\n{\n\tint perf(bool NextFloat)\n\t{\n\t\tconst float begin = -glm::pi<float>();\n\t\tconst float end = glm::pi<float>();\n\t\tfloat result = 0.f;\n\n\t\tconst std::clock_t timestamp1 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::fastTan(i);\n\n\t\tconst std::clock_t timestamp2 = std::clock();\n\t\tfor (float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::tan(i);\n\n\t\tconst std::clock_t timestamp3 = std::clock();\n\t\tconst std::clock_t time_fast = timestamp2 - timestamp1;\n\t\tconst std::clock_t time_default = timestamp3 - timestamp2;\n\t\tstd::printf(\"fastTan Time %d clocks\\n\", static_cast<unsigned int>(time_fast));\n\t\tstd::printf(\"tan Time %d clocks\\n\", static_cast<unsigned int>(time_default));\n\n\t\treturn time_fast <= time_default ? 0 : 1;\n\t}\n}//namespace fastTan\n\nnamespace fastAcos\n{\n\tint perf(bool NextFloat)\n\t{\n\t\tconst float begin = -glm::pi<float>();\n\t\tconst float end = glm::pi<float>();\n\t\tfloat result = 0.f;\n\n\t\tconst std::clock_t timestamp1 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::fastAcos(i);\n\n\t\tconst std::clock_t timestamp2 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::acos(i);\n\n\t\tconst std::clock_t timestamp3 = std::clock();\n\t\tconst std::clock_t time_fast = timestamp2 - timestamp1;\n\t\tconst std::clock_t time_default = timestamp3 - timestamp2;\n\n\t\tstd::printf(\"fastAcos Time %d clocks\\n\", static_cast<unsigned int>(time_fast));\n\t\tstd::printf(\"acos Time %d clocks\\n\", static_cast<unsigned int>(time_default));\n\n\t\treturn time_fast <= time_default ? 0 : 1;\n\t}\n}//namespace fastAcos\n\nnamespace fastAsin\n{\n\tint perf(bool NextFloat)\n\t{\n\t\tconst float begin = -glm::pi<float>();\n\t\tconst float end = glm::pi<float>();\n\t\tfloat result = 0.f;\n\t\tconst std::clock_t timestamp1 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::fastAsin(i);\n\t\tconst std::clock_t timestamp2 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::asin(i);\n\t\tconst std::clock_t timestamp3 = std::clock();\n\t\tconst std::clock_t time_fast = timestamp2 - timestamp1;\n\t\tconst std::clock_t time_default = timestamp3 - timestamp2;\n\t\tstd::printf(\"fastAsin Time %d clocks\\n\", static_cast<unsigned int>(time_fast));\n\t\tstd::printf(\"asin Time %d clocks\\n\", static_cast<unsigned int>(time_default));\n\n\t\treturn time_fast <= time_default ? 0 : 1;\n\t}\n}//namespace fastAsin\n\nnamespace fastAtan\n{\n\tint perf(bool NextFloat)\n\t{\n\t\tconst float begin = -glm::pi<float>();\n\t\tconst float end = glm::pi<float>();\n\t\tfloat result = 0.f;\n\t\tconst std::clock_t timestamp1 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::fastAtan(i);\n\t\tconst std::clock_t timestamp2 = std::clock();\n\t\tfor(float i = begin; i < end; i = NextFloat ? glm::next_float(i) : i += 0.1f)\n\t\t\tresult = glm::atan(i);\n\t\tconst std::clock_t timestamp3 = std::clock();\n\t\tconst std::clock_t time_fast = timestamp2 - timestamp1;\n\t\tconst std::clock_t time_default = timestamp3 - timestamp2;\n\t\tstd::printf(\"fastAtan Time %d clocks\\n\", static_cast<unsigned int>(time_fast));\n\t\tstd::printf(\"atan Time %d clocks\\n\", static_cast<unsigned int>(time_default));\n\n\t\treturn time_fast <= time_default ? 0 : 1;\n\t}\n}//namespace fastAtan\n\nnamespace taylorCos\n{\n\tusing glm::qualifier;\n\tusing glm::length_t;\n\t\n\tglm::vec4 const AngleShift(0.0f, glm::half_pi<float>(), glm::pi<float>(), glm::three_over_two_pi<float>());\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> taylorSeriesNewCos(glm::vec<L, T, Q> const& x)\n\t{\n\t\tglm::vec<L, T, Q> const Powed2(x * x);\n\t\tglm::vec<L, T, Q> const Powed4(Powed2 * Powed2);\n\t\tglm::vec<L, T, Q> const Powed6(Powed4 * Powed2);\n\t\tglm::vec<L, T, Q> const Powed8(Powed4 * Powed4);\n\n\t\treturn static_cast<T>(1)\n\t\t\t- Powed2 * static_cast<T>(0.5)\n\t\t\t+ Powed4 * static_cast<T>(0.04166666666666666666666666666667)\n\t\t\t- Powed6 * static_cast<T>(0.00138888888888888888888888888889)\n\t\t\t+ Powed8 * static_cast<T>(2.4801587301587301587301587301587e-5);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> taylorSeriesNewCos6(glm::vec<L, T, Q> const& x)\n\t{\n\t\tglm::vec<L, T, Q> const Powed2(x * x);\n\t\tglm::vec<L, T, Q> const Powed4(Powed2 * Powed2);\n\t\tglm::vec<L, T, Q> const Powed6(Powed4 * Powed2);\n\n\t\treturn static_cast<T>(1)\n\t\t\t- Powed2 * static_cast<T>(0.5)\n\t\t\t+ Powed4 * static_cast<T>(0.04166666666666666666666666666667)\n\t\t\t- Powed6 * static_cast<T>(0.00138888888888888888888888888889);\n\t}\n\n\ttemplate<glm::length_t L, qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, float, Q> fastAbs(glm::vec<L, float, Q> x)\n\t{\n\t\tint* Pointer = reinterpret_cast<int*>(&x[0]);\n\t\tPointer[0] &= 0x7fffffff;\n\t\tPointer[1] &= 0x7fffffff;\n\t\tPointer[2] &= 0x7fffffff;\n\t\tPointer[3] &= 0x7fffffff;\n\t\treturn x;\n\t}\n\n\ttemplate<glm::length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> fastCosNew(glm::vec<L, T, Q> const& x)\n\t{\n\t\tglm::vec<L, T, Q> const Angle0_PI(fastAbs(fmod(x + glm::pi<T>(), glm::two_pi<T>()) - glm::pi<T>()));\n\t\treturn taylorSeriesNewCos6(x);\n/*\n\t\tvec<L, bool, Q> const FirstQuarterPi(lessThanEqual(Angle0_PI, vec<L, T, Q>(glm::half_pi<T>())));\n\n\t\tvec<L, T, Q> const RevertAngle(mix(vec<L, T, Q>(glm::pi<T>()), vec<L, T, Q>(0), FirstQuarterPi));\n\t\tvec<L, T, Q> const ReturnSign(mix(vec<L, T, Q>(-1), vec<L, T, Q>(1), FirstQuarterPi));\n\t\tvec<L, T, Q> const SectionAngle(RevertAngle - Angle0_PI);\n\n\t\treturn ReturnSign * taylorSeriesNewCos(SectionAngle);\n*/\n\t}\n\n\tint perf_fastCosNew(float Begin, float End, std::size_t Samples)\n\t{\n\t\tstd::vector<glm::vec4> Results;\n\t\tResults.resize(Samples);\n\n\t\tfloat Steps = (End - Begin) / Samples;\n\n\t\tstd::clock_t const TimeStampBegin = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tResults[i] = fastCosNew(AngleShift + glm::vec4(Begin + Steps * i));\n\n\t\tstd::clock_t const TimeStampEnd = std::clock();\n\n\t\tstd::printf(\"fastCosNew %ld clocks\\n\", TimeStampEnd - TimeStampBegin);\n\n\t\tint Error = 0;\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tError += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1;\n\t\treturn Error;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> deterministic_fmod(glm::vec<L, T, Q> const& x, T y)\n\t{\n\t\treturn x - y * trunc(x / y);\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> fastCosDeterminisctic(glm::vec<L, T, Q> const& x)\n\t{\n\t\tglm::vec<L, T, Q> const Angle0_PI(abs(deterministic_fmod(x + glm::pi<T>(), glm::two_pi<T>()) - glm::pi<T>()));\n\t\tglm::vec<L, bool, Q> const FirstQuarterPi(lessThanEqual(Angle0_PI, glm::vec<L, T, Q>(glm::half_pi<T>())));\n\n\t\tglm::vec<L, T, Q> const RevertAngle(mix(glm::vec<L, T, Q>(glm::pi<T>()), glm::vec<L, T, Q>(0), FirstQuarterPi));\n\t\tglm::vec<L, T, Q> const ReturnSign(mix(glm::vec<L, T, Q>(-1), glm::vec<L, T, Q>(1), FirstQuarterPi));\n\t\tglm::vec<L, T, Q> const SectionAngle(RevertAngle - Angle0_PI);\n\n\t\treturn ReturnSign * taylorSeriesNewCos(SectionAngle);\n\t}\n\n\tint perf_fastCosDeterminisctic(float Begin, float End, std::size_t Samples)\n\t{\n\t\tstd::vector<glm::vec4> Results;\n\t\tResults.resize(Samples);\n\n\t\tfloat Steps = (End - Begin) / Samples;\n\n\t\tstd::clock_t const TimeStampBegin = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tResults[i] = taylorCos::fastCosDeterminisctic(AngleShift + glm::vec4(Begin + Steps * i));\n\n\t\tstd::clock_t const TimeStampEnd = std::clock();\n\n\t\tstd::printf(\"fastCosDeterminisctic %ld clocks\\n\", TimeStampEnd - TimeStampBegin);\n\n\t\tint Error = 0;\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tError += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1;\n\t\treturn Error;\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> taylorSeriesRefCos(glm::vec<L, T, Q> const& x)\n\t{\n\t\treturn static_cast<T>(1)\n\t\t\t- (x * x) / glm::factorial(static_cast<T>(2))\n\t\t\t+ (x * x * x * x) / glm::factorial(static_cast<T>(4))\n\t\t\t- (x * x * x * x * x * x) / glm::factorial(static_cast<T>(6))\n\t\t\t+ (x * x * x * x * x * x * x * x) / glm::factorial(static_cast<T>(8));\n\t}\n\n\ttemplate<length_t L, typename T, qualifier Q>\n\tGLM_FUNC_QUALIFIER glm::vec<L, T, Q> fastRefCos(glm::vec<L, T, Q> const& x)\n\t{\n\t\tglm::vec<L, T, Q> const Angle0_PI(glm::abs(fmod(x + glm::pi<T>(), glm::two_pi<T>()) - glm::pi<T>()));\n//\t\treturn taylorSeriesRefCos(Angle0_PI);\n\n\t\tglm::vec<L, bool, Q> const FirstQuarterPi(lessThanEqual(Angle0_PI, glm::vec<L, T, Q>(glm::half_pi<T>())));\n\n\t\tglm::vec<L, T, Q> const RevertAngle(mix(glm::vec<L, T, Q>(glm::pi<T>()), glm::vec<L, T, Q>(0), FirstQuarterPi));\n\t\tglm::vec<L, T, Q> const ReturnSign(mix(glm::vec<L, T, Q>(-1), glm::vec<L, T, Q>(1), FirstQuarterPi));\n\t\tglm::vec<L, T, Q> const SectionAngle(RevertAngle - Angle0_PI);\n\n\t\treturn ReturnSign * taylorSeriesRefCos(SectionAngle);\n\t}\n\n\tint perf_fastCosRef(float Begin, float End, std::size_t Samples)\n\t{\n\t\tstd::vector<glm::vec4> Results;\n\t\tResults.resize(Samples);\n\n\t\tfloat Steps = (End - Begin) / Samples;\n\n\t\tstd::clock_t const TimeStampBegin = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tResults[i] = taylorCos::fastRefCos(AngleShift + glm::vec4(Begin + Steps * i));\n\n\t\tstd::clock_t const TimeStampEnd = std::clock();\n\n\t\tstd::printf(\"fastCosRef %ld clocks\\n\", TimeStampEnd - TimeStampBegin);\n\n\t\tint Error = 0;\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tError += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1;\n\t\treturn Error;\n\t}\n\n\tint perf_fastCosOld(float Begin, float End, std::size_t Samples)\n\t{\n\t\tstd::vector<glm::vec4> Results;\n\t\tResults.resize(Samples);\n\n\t\tfloat Steps = (End - Begin) / Samples;\n\n\t\tstd::clock_t const TimeStampBegin = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tResults[i] = glm::fastCos(AngleShift + glm::vec4(Begin + Steps * i));\n\n\t\tstd::clock_t const TimeStampEnd = std::clock();\n\n\t\tstd::printf(\"fastCosOld %ld clocks\\n\", TimeStampEnd - TimeStampBegin);\n\n\t\tint Error = 0;\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tError += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1;\n\t\treturn Error;\n\t}\n\n\tint perf_cos(float Begin, float End, std::size_t Samples)\n\t{\n\t\tstd::vector<glm::vec4> Results;\n\t\tResults.resize(Samples);\n\n\t\tfloat Steps = (End - Begin) / Samples;\n\n\t\tstd::clock_t const TimeStampBegin = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tResults[i] = glm::cos(AngleShift + glm::vec4(Begin + Steps * i));\n\n\t\tstd::clock_t const TimeStampEnd = std::clock();\n\n\t\tstd::printf(\"cos %ld clocks\\n\", TimeStampEnd - TimeStampBegin);\n\n\t\tint Error = 0;\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tError += Results[i].x >= -1.0f && Results[i].x <= 1.0f ? 0 : 1;\n\t\treturn Error;\n\t}\n\n\tint perf(std::size_t const Samples)\n\t{\n\t\tint Error = 0;\n\n\t\tfloat const Begin = -glm::pi<float>();\n\t\tfloat const End = glm::pi<float>();\n\n\t\tError += perf_cos(Begin, End, Samples);\n\t\tError += perf_fastCosOld(Begin, End, Samples);\n\t\tError += perf_fastCosRef(Begin, End, Samples);\n\t\t//Error += perf_fastCosNew(Begin, End, Samples);\n\t\tError += perf_fastCosDeterminisctic(Begin, End, Samples);\n\n\t\treturn Error;\n\t}\n\n\tint test()\n\t{\n\t\tint Error = 0;\n\n\t\t//for(float Angle = -4.0f * glm::pi<float>(); Angle < 4.0f * glm::pi<float>(); Angle += 0.1f)\n\t\t//for(float Angle = -720.0f; Angle < 720.0f; Angle += 0.1f)\n\t\tfor(float Angle = 0.0f; Angle < 180.0f; Angle += 0.1f)\n\t\t{\n\t\t\tfloat const modAngle = std::fmod(glm::abs(Angle), 360.f);\n\t\t\tassert(modAngle >= 0.0f && modAngle <= 360.f);\n\t\t\tfloat const radAngle = glm::radians(modAngle);\n\t\t\tfloat const Cos0 = std::cos(radAngle);\n\n\t\t\tfloat const Cos1 = taylorCos::fastRefCos(glm::fvec1(radAngle)).x;\n\t\t\tError += glm::abs(Cos1 - Cos0) < 0.1f ? 0 : 1;\n\n\t\t\t//float const Cos2 = taylorCos::fastCosNew(glm::fvec1(radAngle)).x;\n\t\t\t//Error += glm::abs(Cos2 - Cos0) < 0.1f ? 0 : 1;\n\n\t\t\tassert(!Error);\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace taylorCos\n\nnamespace taylor2\n{\n\tglm::vec4 const AngleShift(0.0f, glm::pi<float>() * 0.5f, glm::pi<float>() * 1.0f, glm::pi<float>() * 1.5f);\n\n\tfloat taylorCosA(float x)\n\t{\n\t\treturn 1.f\n\t\t\t- (x * x) * (1.f / 2.f)\n\t\t\t+ (x * x * x * x) * (1.f / 24.f)\n\t\t\t- (x * x * x * x * x * x) * (1.f / 720.f)\n\t\t\t+ (x * x * x * x * x * x * x * x) * (1.f / 40320.f);\n\t}\n\n\tfloat taylorCosB(float x)\n\t{\n\t\treturn 1.f\n\t\t\t- (x * x) * (1.f / 2.f)\n\t\t\t+ (x * x * x * x) * (1.f / 24.f)\n\t\t\t- (x * x * x * x * x * x) * (1.f / 720.f)\n\t\t\t+ (x * x * x * x * x * x * x * x) * (1.f / 40320.f);\n\t}\n\n\tfloat taylorCosC(float x)\n\t{\n\t\treturn 1.f\n\t\t\t- (x * x) * (1.f / 2.f)\n\t\t\t+ ((x * x) * (x * x)) * (1.f / 24.f)\n\t\t\t- (((x * x) * (x * x)) * (x * x)) * (1.f / 720.f)\n\t\t\t+ (((x * x) * (x * x)) * ((x * x) * (x * x))) * (1.f / 40320.f);\n\t}\n\n\tint perf_taylorCosA(float Begin, float End, std::size_t Samples)\n\t{\n\t\tstd::vector<float> Results;\n\t\tResults.resize(Samples);\n\n\t\tfloat Steps = (End - Begin) / Samples;\n\n\t\tstd::clock_t const TimeStampBegin = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tResults[i] = taylorCosA(AngleShift.x + Begin + Steps * i);\n\n\t\tstd::clock_t const TimeStampEnd = std::clock();\n\n\t\tstd::printf(\"taylorCosA %ld clocks\\n\", TimeStampEnd - TimeStampBegin);\n\n\t\tint Error = 0;\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tError += Results[i] >= -1.0f && Results[i] <= 1.0f ? 0 : 1;\n\t\treturn Error;\n\t}\n\n\tint perf_taylorCosB(float Begin, float End, std::size_t Samples)\n\t{\n\t\tstd::vector<float> Results;\n\t\tResults.resize(Samples);\n\n\t\tfloat Steps = (End - Begin) / Samples;\n\n\t\tstd::clock_t const TimeStampBegin = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tResults[i] = taylorCosB(AngleShift.x + Begin + Steps * i);\n\n\t\tstd::clock_t const TimeStampEnd = std::clock();\n\n\t\tstd::printf(\"taylorCosB %ld clocks\\n\", TimeStampEnd - TimeStampBegin);\n\n\t\tint Error = 0;\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tError += Results[i] >= -1.0f && Results[i] <= 1.0f ? 0 : 1;\n\t\treturn Error;\n\t}\n\n\tint perf_taylorCosC(float Begin, float End, std::size_t Samples)\n\t{\n\t\tstd::vector<float> Results;\n\t\tResults.resize(Samples);\n\n\t\tfloat Steps = (End - Begin) / Samples;\n\n\t\tstd::clock_t const TimeStampBegin = std::clock();\n\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tResults[i] = taylorCosC(AngleShift.x + Begin + Steps * i);\n\n\t\tstd::clock_t const TimeStampEnd = std::clock();\n\n\t\tstd::printf(\"taylorCosC %ld clocks\\n\", TimeStampEnd - TimeStampBegin);\n\n\t\tint Error = 0;\n\t\tfor(std::size_t i = 0; i < Samples; ++i)\n\t\t\tError += Results[i] >= -1.0f && Results[i] <= 1.0f ? 0 : 1;\n\t\treturn Error;\n\t}\n\n\tint perf(std::size_t Samples)\n\t{\n\t\tint Error = 0;\n\n\t\tfloat const Begin = -glm::pi<float>();\n\t\tfloat const End = glm::pi<float>();\n\n\t\tError += perf_taylorCosA(Begin, End, Samples);\n\t\tError += perf_taylorCosB(Begin, End, Samples);\n\t\tError += perf_taylorCosC(Begin, End, Samples);\n\n\t\treturn Error;\n\t}\n\n}//namespace taylor2\n\nint main()\n{\n\tint Error(0);\n\n\tError += ::taylor2::perf(1000);\n\tError += ::taylorCos::test();\n\tError += ::taylorCos::perf(1000);\n\n#\tifdef NDEBUG\n\t\t::fastCos::perf(false);\n\t\t::fastSin::perf(false);\n\t\t::fastTan::perf(false);\n\t\t::fastAcos::perf(false);\n\t\t::fastAsin::perf(false);\n\t\t::fastAtan::perf(false);\n#\tendif//NDEBUG\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_functions.cpp",
    "content": "#include <glm/gtx/functions.hpp>\n#include <vector>\n\nint test_gauss_1d()\n{\n\tint Error = 0;\n\n\tstd::vector<float> Result(20);\n\tfor(std::size_t i = 0, n = Result.size(); i < n; ++i)\n\t\tResult[i] = glm::gauss(static_cast<float>(i) * 0.1f, 0.0f, 1.0f);\n\n\treturn Error;\n}\n\nint test_gauss_2d()\n{\n\tint Error = 0;\n\n\tstd::vector<float> Result(20);\n\tfor(std::size_t i = 0, n = Result.size(); i < n; ++i)\n\t\tResult[i] = glm::gauss(glm::vec2(static_cast<float>(i)) * 0.1f, glm::vec2(0.0f), glm::vec2(1.0f));\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_gauss_1d();\n\tError += test_gauss_2d();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_gradient_paint.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/gradient_paint.hpp>\n\nint test_radialGradient()\n{\n\tint Error = 0;\n\t\n\tfloat Gradient = glm::radialGradient(glm::vec2(0), 1.0f, glm::vec2(1), glm::vec2(0.5));\n\tError += Gradient != 0.0f ? 0 : 1;\n\t\n\treturn Error;\n}\n\nint test_linearGradient()\n{\n\tint Error = 0;\n\n\tfloat Gradient = glm::linearGradient(glm::vec2(0), glm::vec2(1), glm::vec2(0.5));\n\tError += Gradient != 0.0f ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n    Error += test_radialGradient();\n    Error += test_linearGradient();\n    \n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_handed_coordinate_space.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/handed_coordinate_space.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_int_10_10_10_2.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2013-10-25\n// Updated : 2013-10-25\n// Licence : This source is under MIT licence\n// File    : test/gtx/associated_min_max.cpp\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtx/associated_min_max.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_integer.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/exponential.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtx/integer.hpp>\n#include <cstdio>\n/*\nint test_floor_log2()\n{\n\tint Error = 0;\n\n\tfor(std::size_t i = 1; i < 1000000; ++i)\n\t{\n\t\tglm::uint A = glm::floor_log2(glm::uint(i));\n\t\tglm::uint B = glm::uint(glm::floor(glm::log2(double(i)))); // Will fail with float, lack of accuracy\n\n\t\tError += A == B ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n*/\nint test_log2()\n{\n\tint Error = 0;\n\n\tfor(std::size_t i = 1; i < 24; ++i)\n\t{\n\t\tglm::uint A = glm::log2(glm::uint(1 << i));\n\t\tglm::uint B = glm::uint(glm::log2(double(1 << i)));\n\n\t\t//Error += glm::equalEpsilon(double(A), B, 1.0) ? 0 : 1;\n\t\tError += glm::abs(double(A) - B) <= 24 ? 0 : 1;\n\t\tassert(!Error);\n\n\t\tprintf(\"Log2(%d) error A=%d, B=%d\\n\", 1 << i, A, B);\n\t}\n\n\tprintf(\"log2 error=%d\\n\", Error);\n\n\treturn Error;\n}\n\nint test_nlz()\n{\n\tint Error = 0;\n\n\tfor(glm::uint i = 1; i < glm::uint(33); ++i)\n\t\tError += glm::nlz(i) == glm::uint(31u) - glm::findMSB(i) ? 0 : 1;\n\t\t//printf(\"%d, %d\\n\", glm::nlz(i), 31u - glm::findMSB(i));\n\n\treturn Error;\n}\n\nint test_pow_uint()\n{\n\tint Error = 0;\n\n\tglm::uint const p0 = glm::pow(2u, 0u);\n\tError += p0 == 1u ? 0 : 1;\n\n\tglm::uint const p1 = glm::pow(2u, 1u);\n\tError += p1 == 2u ? 0 : 1;\n\n\tglm::uint const p2 = glm::pow(2u, 2u);\n\tError += p2 == 4u ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_pow_int()\n{\n\tint Error = 0;\n\n\tint const p0 = glm::pow(2, 0u);\n\tError += p0 == 1 ? 0 : 1;\n\n\tint const p1 = glm::pow(2, 1u);\n\tError += p1 == 2 ? 0 : 1;\n\n\tint const p2 = glm::pow(2, 2u);\n\tError += p2 == 4 ? 0 : 1;\n\n\tint const p0n = glm::pow(-2, 0u);\n\tError += p0n == -1 ? 0 : 1;\n\n\tint const p1n = glm::pow(-2, 1u);\n\tError += p1n == -2 ? 0 : 1;\n\n\tint const p2n = glm::pow(-2, 2u);\n\tError += p2n == 4 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_nlz();\n//\tError += test_floor_log2();\n\tError += test_log2();\n\tError += test_pow_uint();\n\tError += test_pow_int();\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_intersect.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/glm.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtx/intersect.hpp>\n\nint test_intersectRayTriangle()\n{\n\tint Error = 0;\n\n\tglm::vec3 const Orig(0, 0, 2);\n\tglm::vec3 const Dir(0, 0, -1);\n\tglm::vec3 const Vert0(0, 0, 0);\n\tglm::vec3 const Vert1(-1, -1, 0);\n\tglm::vec3 const Vert2(1, -1, 0);\n\tglm::vec2 BaryPosition(0);\n\tfloat Distance = 0;\n\n\tbool const Result = glm::intersectRayTriangle(Orig, Dir, Vert0, Vert1, Vert2, BaryPosition, Distance);\n\n\tError += glm::all(glm::epsilonEqual(BaryPosition, glm::vec2(0), std::numeric_limits<float>::epsilon())) ? 0 : 1;\n\tError += glm::abs(Distance - 2.f) <= std::numeric_limits<float>::epsilon() ? 0 : 1;\n\tError += Result ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_intersectRayTriangle();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_io.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtx/io.hpp>\n#include <iostream>\n#include <sstream>\n#include <typeinfo>\n\nnamespace\n{\n\ttemplate<typename CTy, typename CTr>\n\tstd::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, glm::qualifier const& a)\n\t{\n\t\ttypename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);\n\n\t\tif (cerberus)\n\t\t{\n\t\t\tswitch (a) {\n\t\t\tcase glm::highp:\t\t\tos << \"uhi\"; break;\n\t\t\tcase glm::mediump:\t\t\tos << \"umd\"; break;\n\t\t\tcase glm::lowp:\t\t\t\tos << \"ulo\"; break;\n#\t\t\tif GLM_HAS_ALIGNED_TYPE\n\t\t\t\tcase glm::aligned_highp:\tos << \"ahi\"; break;\n\t\t\t\tcase glm::aligned_mediump:\tos << \"amd\"; break;\n\t\t\t\tcase glm::aligned_lowp:\t\tos << \"alo\"; break;\n#\t\t\tendif\n\t\t\t}\n\t\t}\n\n\t\treturn os;\n\t}\n\n\ttemplate<typename U, glm::qualifier P, typename T, typename CTy, typename CTr>\n\tstd::basic_string<CTy> type_name(std::basic_ostream<CTy,CTr>&, T const&)\n\t{\n\t\tstd::basic_ostringstream<CTy,CTr> ostr;\n\n\t\tif      (typeid(T) == typeid(glm::tquat<U,P>))   { ostr << \"quat\"; }\n\t\telse if (typeid(T) == typeid(glm::vec<2, U,P>))   { ostr << \"vec2\"; }\n\t\telse if (typeid(T) == typeid(glm::vec<3, U,P>))   { ostr << \"vec3\"; }\n\t\telse if (typeid(T) == typeid(glm::vec<4, U,P>))   { ostr << \"vec4\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<2, 2, U,P>)) { ostr << \"mat2x2\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<2, 3, U,P>)) { ostr << \"mat2x3\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<2, 4, U,P>)) { ostr << \"mat2x4\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<3, 2, U,P>)) { ostr << \"mat3x2\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<3, 3, U,P>)) { ostr << \"mat3x3\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<3, 4, U,P>)) { ostr << \"mat3x4\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<4, 2, U,P>)) { ostr << \"mat4x2\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<4, 3, U,P>)) { ostr << \"mat4x3\"; }\n\t\telse if (typeid(T) == typeid(glm::mat<4, 4, U,P>)) { ostr << \"mat4x4\"; }\n\t\telse                                             { ostr << \"unknown\"; }\n\n\t\tostr << '<' << typeid(U).name() << ',' << P << '>';\n\n\t\treturn ostr.str();\n\t}\n} // namespace {\n\ntemplate<typename T, glm::qualifier P, typename OS>\nint test_io_quat(OS& os)\n{\n\tos << '\\n' << typeid(OS).name() << '\\n';\n\n\tglm::tquat<T,P> const q(1, 0, 0, 0);\n\n\t{\n\t\tglm::io::basic_format_saver<typename OS::char_type> const iofs(os);\n\n\t\tos << glm::io::precision(2) << glm::io::width(1 + 2 + 1 + 2)\n\t\t\t<< type_name<T,P>(os, q) << \": \" << q << '\\n';\n\t}\n\n\t{\n\t\tglm::io::basic_format_saver<typename OS::char_type> const iofs(os);\n\n\t\tos << glm::io::unformatted\n\t\t\t<< type_name<T,P>(os, q) << \": \" << q << '\\n';\n\t}\n\n\treturn 0;\n}\n\ntemplate<typename T, glm::qualifier P, typename OS>\nint test_io_vec(OS& os)\n{\n\tos << '\\n' << typeid(OS).name() << '\\n';\n\n\tglm::vec<2, T,P> const v2(0, 1);\n\tglm::vec<3, T,P> const v3(2, 3, 4);\n\tglm::vec<4, T,P> const v4(5, 6, 7, 8);\n\n\tos << type_name<T,P>(os, v2) << \": \" << v2 << '\\n'\n\t\t<< type_name<T,P>(os, v3) << \": \" << v3 << '\\n'\n\t\t<< type_name<T,P>(os, v4) << \": \" << v4 << '\\n';\n\n\tglm::io::basic_format_saver<typename OS::char_type> const iofs(os);\n\n\tos << glm::io::precision(2) << glm::io::width(1 + 2 + 1 + 2)\n\t\t<< type_name<T,P>(os, v2) << \": \" << v2 << '\\n'\n\t\t<< type_name<T,P>(os, v3) << \": \" << v3 << '\\n'\n\t\t<< type_name<T,P>(os, v4) << \": \" << v4 << '\\n';\n\n\treturn 0;\n}\n\ntemplate<typename T, glm::qualifier P, typename OS>\nint test_io_mat(OS& os, glm::io::order_type otype)\n{\n\tos << '\\n' << typeid(OS).name() << '\\n';\n\n\tglm::vec<2, T,P> const v2_1( 0,  1);\n\tglm::vec<2, T,P> const v2_2( 2,  3);\n\tglm::vec<2, T,P> const v2_3( 4,  5);\n\tglm::vec<2, T,P> const v2_4( 6,  7);\n\tglm::vec<3, T,P> const v3_1( 8,  9, 10);\n\tglm::vec<3, T,P> const v3_2(11, 12, 13);\n\tglm::vec<3, T,P> const v3_3(14, 15, 16);\n\tglm::vec<3, T,P> const v3_4(17, 18, 19);\n\tglm::vec<4, T,P> const v4_1(20, 21, 22, 23);\n\tglm::vec<4, T,P> const v4_2(24, 25, 26, 27);\n\tglm::vec<4, T,P> const v4_3(28, 29, 30, 31);\n\tglm::vec<4, T,P> const v4_4(32, 33, 34, 35);\n\n\tglm::io::basic_format_saver<typename OS::char_type> const iofs(os);\n\n\tos << glm::io::precision(2) << glm::io::width(1 + 2 + 1 + 2)\n\t\t<< glm::io::order(otype)\n\t\t<< \"mat2x2<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<2, 2, T,P>(v2_1, v2_2) << '\\n'\n\t\t<< \"mat2x3<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<2, 3, T,P>(v3_1, v3_2) << '\\n'\n\t\t<< \"mat2x4<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<2, 4, T,P>(v4_1, v4_2) << '\\n'\n\t\t<< \"mat3x2<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<3, 2, T,P>(v2_1, v2_2, v2_3) << '\\n'\n\t\t<< \"mat3x3<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<3, 3, T,P>(v3_1, v3_2, v3_3) << '\\n'\n\t\t<< \"mat3x4<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<3, 4, T,P>(v4_1, v4_2, v4_3) << '\\n'\n\t\t<< \"mat4x2<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<4, 2, T,P>(v2_1, v2_2, v2_3, v2_4) << '\\n'\n\t\t<< \"mat4x3<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<4, 3, T,P>(v3_1, v3_2, v3_3, v3_4) << '\\n'\n\t\t<< \"mat4x4<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<4, 4, T,P>(v4_1, v4_2, v4_3, v4_4) << '\\n';\n\n\tos << glm::io::unformatted\n\t\t<< glm::io::order(otype)\n\t\t<< \"mat2x2<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<2, 2, T,P>(v2_1, v2_2) << '\\n'\n\t\t<< \"mat2x3<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<2, 3, T,P>(v3_1, v3_2) << '\\n'\n\t\t<< \"mat2x4<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<2, 4, T,P>(v4_1, v4_2) << '\\n'\n\t\t<< \"mat3x2<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<3, 2, T,P>(v2_1, v2_2, v2_3) << '\\n'\n\t\t<< \"mat3x3<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<3, 3, T,P>(v3_1, v3_2, v3_3) << '\\n'\n\t\t<< \"mat3x4<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<3, 4, T,P>(v4_1, v4_2, v4_3) << '\\n'\n\t\t<< \"mat4x2<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<4, 2, T,P>(v2_1, v2_2, v2_3, v2_4) << '\\n'\n\t\t<< \"mat4x3<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<4, 3, T,P>(v3_1, v3_2, v3_3, v3_4) << '\\n'\n\t\t<< \"mat4x4<\" << typeid(T).name() << ',' << P << \">: \" << glm::mat<4, 4, T,P>(v4_1, v4_2, v4_3, v4_4) << '\\n';\n  \n\treturn 0;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_io_quat<float, glm::highp>(std::cout);\n\tError += test_io_quat<float, glm::highp>(std::wcout);\n\tError += test_io_quat<int, glm::mediump>(std::cout);\n\tError += test_io_quat<int, glm::mediump>(std::wcout);\n\tError += test_io_quat<glm::uint, glm::lowp>(std::cout);\n\tError += test_io_quat<glm::uint, glm::lowp>(std::wcout);\n\n\tError += test_io_vec<float, glm::highp>(std::cout);\n\tError += test_io_vec<float, glm::highp>(std::wcout);\n\tError += test_io_vec<int, glm::mediump>(std::cout);\n\tError += test_io_vec<int, glm::mediump>(std::wcout);\n\tError += test_io_vec<glm::uint, glm::lowp>(std::cout);\n\tError += test_io_vec<glm::uint, glm::lowp>(std::wcout);\n\n\tError += test_io_mat<float, glm::highp>(std::cout, glm::io::column_major);\n\tError += test_io_mat<float, glm::lowp>(std::wcout, glm::io::column_major);\n\tError += test_io_mat<float, glm::highp>(std::cout, glm::io::row_major);\n        Error += test_io_mat<float, glm::lowp>(std::wcout, glm::io::row_major);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_log_base.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/log_base.hpp>\n#include <glm/gtc/vec1.hpp>\n#include <glm/gtc/epsilon.hpp>\n#include <glm/exponential.hpp>\n\nnamespace test_log\n{\n\tint run()\n\t{\n\t\tint Error = 0;\n\n\t\t{\n\t\t\tfloat A = glm::log(10.f, 2.0f);\n\t\t\tfloat B = glm::log2(10.f);\n\t\t\tError += glm::epsilonEqual(A, B, 0.00001f) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec1 A = glm::log(glm::vec1(10.f), glm::vec1(2.0f));\n\t\t\tglm::vec1 B = glm::log2(glm::vec1(10.f));\n\t\t\tError += glm::all(glm::epsilonEqual(A, B, glm::vec1(0.00001f))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec2 A = glm::log(glm::vec2(10.f), glm::vec2(2.0f));\n\t\t\tglm::vec2 B = glm::log2(glm::vec2(10.f));\n\t\t\tError += glm::all(glm::epsilonEqual(A, B, glm::vec2(0.00001f))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec3 A = glm::log(glm::vec3(10.f), glm::vec3(2.0f));\n\t\t\tglm::vec3 B = glm::log2(glm::vec3(10.f));\n\t\t\tError += glm::all(glm::epsilonEqual(A, B, glm::vec3(0.00001f))) ? 0 : 1;\n\t\t}\n\n\t\t{\n\t\t\tglm::vec4 A = glm::log(glm::vec4(10.f), glm::vec4(2.0f));\n\t\t\tglm::vec4 B = glm::log2(glm::vec4(10.f));\n\t\t\tError += glm::all(glm::epsilonEqual(A, B, glm::vec4(0.00001f))) ? 0 : 1;\n\t\t}\n\n\t\treturn Error;\n\t}\n}//namespace test_log\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_log::run();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_matrix_cross_product.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/matrix_cross_product.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_matrix_decompose.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/matrix_decompose.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\tglm::mat4 Matrix(1);\n\n\tglm::vec3 Scale;\n\tglm::quat Orientation;\n\tglm::vec3 Translation;\n\tglm::vec3 Skew(1);\n\tglm::vec4 Perspective(1);\n\n\tglm::decompose(Matrix, Scale, Orientation, Translation, Skew, Perspective);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_matrix_factorisation.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/matrix_factorisation.hpp>\n#include <glm/gtc/constants.hpp>\n#include <glm/gtc/epsilon.hpp>\n\ntemplate <glm::length_t C, glm::length_t R, typename T, glm::qualifier Q>\nint test_qr(glm::mat<C, R, T, Q> m)\n{\n\tint Error = 0;\n\n\tT const epsilon = static_cast<T>(1e-10);\n\n\tglm::mat<(C < R ? C : R), R, T, Q> q(-999);\n\tglm::mat<C, (C < R ? C : R), T, Q> r(-999);\n\n\tglm::qr_decompose(m, q, r);\n\n\t//Test if q*r really equals the input matrix\n\tglm::mat<C, R, T, Q> tm = q*r;\n\tglm::mat<C, R, T, Q> err = tm - m;\n\n\tfor (glm::length_t i = 0; i < C; i++)\n\tfor (glm::length_t j = 0; j < R; j++)\n\t\tError += glm::abs(err[i][j]) > epsilon ? 1 : 0;\n\n\t//Test if the columns of q are orthonormal\n\tfor (glm::length_t i = 0; i < (C < R ? C : R); i++)\n\t{\n\t\tError += (length(q[i]) - 1) > epsilon ? 1 : 0;\n\n\t\tfor (glm::length_t j = 0; j<i; j++)\n\t\t\tError += glm::abs(dot(q[i], q[j])) > epsilon ? 1 : 0;\n\t}\n\n\t//Test if the matrix r is upper triangular\n\tfor (glm::length_t i = 0; i < C; i++)\n\tfor (glm::length_t j = i + 1; j < (C < R ? C : R); j++)\n\t\tError += glm::epsilonEqual(r[i][j], static_cast<T>(0), glm::epsilon<T>()) ? 0 : 1;\n\n\treturn Error;\n}\n\ntemplate <glm::length_t C, glm::length_t R, typename T, glm::qualifier Q>\nint test_rq(glm::mat<C, R, T, Q> m)\n{\n\tint Error = 0;\n\n\tT const epsilon = static_cast<T>(1e-10);\n\n\tglm::mat<C, (C < R ? C : R), T, Q> q(-999);\n\tglm::mat<(C < R ? C : R), R, T, Q> r(-999);\n\n\tglm::rq_decompose(m, r, q);\n\n\t//Test if q*r really equals the input matrix\n\tglm::mat<C, R, T, Q> tm = r*q;\n\tglm::mat<C, R, T, Q> err = tm - m;\n\n\tfor (glm::length_t i = 0; i < C; i++)\n\tfor (glm::length_t j = 0; j < R; j++)\n\t\tError += glm::abs(err[i][j]) > epsilon ? 1 : 0;\n\n\t//Test if the rows of q are orthonormal\n\tglm::mat<(C < R ? C : R), C, T, Q> tq = transpose(q);\n\n\tfor (glm::length_t i = 0; i < (C < R ? C : R); i++)\n\t{\n\t\tError += (length(tq[i]) - 1) > epsilon ? 1 : 0;\n\n\t\tfor (glm::length_t j = 0; j<i; j++)\n\t\t\tError += glm::abs(dot(tq[i], tq[j])) > epsilon ? 1 : 0;\n\t}\n\n\t//Test if the matrix r is upper triangular\n\tfor (glm::length_t i = 0; i < (C < R ? C : R); i++)\n\tfor (glm::length_t j = R - (C < R ? C : R) + i + 1; j < R; j++)\n\t\tError += glm::epsilonEqual(r[i][j], static_cast<T>(0), glm::epsilon<T>()) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\t//Test QR square\n\tError += test_qr(glm::dmat3(12.0, 6.0, -4.0, -51.0, 167.0, 24.0, 4.0, -68.0, -41.0)) ? 1 : 0;\n\n\t//Test RQ square\n\tError += test_rq(glm::dmat3(12.0, 6.0, -4.0, -51.0, 167.0, 24.0, 4.0, -68.0, -41.0)) ? 1 : 0;\n\n\t//Test QR triangular 1\n\tError += test_qr(glm::dmat3x4(12.0, 6.0, -4.0, -51.0, 167.0, 24.0, 4.0, -68.0, -41.0, 7.0, 2.0, 15.0)) ? 1 : 0;\n\n\t//Test QR triangular 2\n\tError += test_qr(glm::dmat4x3(12.0, 6.0, -4.0, -51.0, 167.0, 24.0, 4.0, -68.0, -41.0, 7.0, 2.0, 15.0)) ? 1 : 0;\n\n\t//Test RQ triangular 1 : Fails at the triangular test\n\tError += test_rq(glm::dmat3x4(12.0, 6.0, -4.0, -51.0, 167.0, 24.0, 4.0, -68.0, -41.0, 7.0, 2.0, 15.0)) ? 1 : 0;\n\n\t//Test QR triangular 2\n\tError += test_rq(glm::dmat4x3(12.0, 6.0, -4.0, -51.0, 167.0, 24.0, 4.0, -68.0, -41.0, 7.0, 2.0, 15.0)) ? 1 : 0;\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_matrix_interpolation.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/quaternion.hpp>\n#include <glm/gtx/matrix_interpolation.hpp>\n\n#include <iostream>\n\nint test_axisAngle()\n{\n\tint Error = 0;\n\n\tglm::mat4 m1(-0.9946f, 0.0f, -0.104531f, 0.0f,\n\t\t0.0f, 1.0f, 0.0f, 0.0f,\n\t\t0.104531f, 0.0f, -0.9946f, 0.0f,\n\t\t0.0f, 0.0f, 0.0f, 1.0f);\n\tglm::mat4 m2(-0.992624f, 0.0f, -0.121874f, 0.0f,\n\t\t0.0f, 1.0f, 0.0f, 0.0f,\n\t\t0.121874f, 0.0f, -0.992624f, 0.0f,\n\t\t0.0f, 0.0f, 0.0f, 1.0f);\n\n\tglm::mat4 const m1rot = glm::extractMatrixRotation(m1);\n\tglm::mat4 const dltRotation = m2 * glm::transpose(m1rot);\n\n\tglm::vec3 dltAxis(0.0f);\n\tfloat dltAngle = 0.0f;\n\tglm::axisAngle(dltRotation, dltAxis, dltAngle);\n\n\tstd::cout << \"dltAngle: (\" << dltAxis.x << \", \" << dltAxis.y << \", \" << dltAxis.z << \"), dltAngle: \" << dltAngle << std::endl;\n\n\tglm::fquat q = glm::quat_cast(dltRotation);\n\tstd::cout << \"q: (\" << q.x << \", \" << q.y << \", \" << q.z << \", \" << q.w << \")\" << std::endl;\n\tfloat yaw = glm::yaw(q);\n\tstd::cout << \"Yaw: \" << yaw << std::endl;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_axisAngle();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_matrix_major_storage.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/matrix_major_storage.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_matrix_operation.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/matrix_operation.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_matrix_query.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/matrix_query.hpp>\n\nint test_isNull()\n{\n\tint Error(0);\n\t\n\tbool TestA = glm::isNull(glm::mat4(0), 0.00001f);\n\tError += TestA ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_isIdentity()\n{\n\tint Error(0);\n\t\n\t{\n\t\tbool TestA = glm::isIdentity(glm::mat2(1), 0.00001f);\n\t\tError += TestA ? 0 : 1;\n\t}\n\t{\n\t\tbool TestA = glm::isIdentity(glm::mat3(1), 0.00001f);\n\t\tError += TestA ? 0 : 1;\n\t}\n\t{\n\t\tbool TestA = glm::isIdentity(glm::mat4(1), 0.00001f);\n\t\tError += TestA ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_isNormalized()\n{\n\tint Error(0);\n\n\tbool TestA = glm::isNormalized(glm::mat4(1), 0.00001f);\n\tError += TestA ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_isOrthogonal()\n{\n\tint Error(0);\n\n\tbool TestA = glm::isOrthogonal(glm::mat4(1), 0.00001f);\n\tError += TestA ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_isNull();\n\tError += test_isIdentity();\n\tError += test_isNormalized();\n\tError += test_isOrthogonal();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_matrix_transform_2d.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/matrix_transform_2d.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_mixed_product.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2013-10-25\n// Updated : 2013-10-25\n// Licence : This source is under MIT licence\n// File    : test/gtx/associated_min_max.cpp\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include <glm/gtc/type_precision.hpp>\n#include <glm/gtx/associated_min_max.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_norm.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/norm.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_normal.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/normal.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_normalize_dot.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/normalize_dot.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_number_precision.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/number_precision.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_optimum_pow.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/optimum_pow.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_orthonormalize.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/orthonormalize.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_perpendicular.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/perpendicular.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_polar_coordinates.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/polar_coordinates.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_projection.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/projection.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_quaternion.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/epsilon.hpp>\n#include <glm/gtc/type_ptr.hpp>\n#include <glm/gtc/matrix_transform.hpp>\n#include <glm/gtx/transform.hpp>\n#include <glm/gtx/quaternion.hpp>\n#include <glm/gtx/compatibility.hpp>\n#include <glm/ext.hpp>\n\nint test_quat_fastMix()\n{\n\tint Error = 0;\n\n\tglm::quat A = glm::angleAxis(0.0f, glm::vec3(0, 0, 1));\n\tglm::quat B = glm::angleAxis(glm::pi<float>() * 0.5f, glm::vec3(0, 0, 1));\n\tglm::quat C = glm::fastMix(A, B, 0.5f);\n\tglm::quat D = glm::angleAxis(glm::pi<float>() * 0.25f, glm::vec3(0, 0, 1));\n\n\tError += glm::epsilonEqual(C.x, D.x, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.y, D.y, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.z, D.z, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.w, D.w, 0.01f) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_quat_shortMix()\n{\n\tint Error(0);\n\n\tglm::quat A = glm::angleAxis(0.0f, glm::vec3(0, 0, 1));\n\tglm::quat B = glm::angleAxis(glm::pi<float>() * 0.5f, glm::vec3(0, 0, 1));\n\tglm::quat C = glm::shortMix(A, B, 0.5f);\n\tglm::quat D = glm::angleAxis(glm::pi<float>() * 0.25f, glm::vec3(0, 0, 1));\n\n\tError += glm::epsilonEqual(C.x, D.x, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.y, D.y, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.z, D.z, 0.01f) ? 0 : 1;\n\tError += glm::epsilonEqual(C.w, D.w, 0.01f) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_orientation()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::quat q(1.0f, 0.0f, 0.0f, 1.0f);\n\t\tfloat p = glm::roll(q);\n\t\tError += glm::epsilonEqual(p, glm::pi<float>() * 0.5f, 0.0001f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::quat q(1.0f, 0.0f, 0.0f, 1.0f);\n\t\tfloat p = glm::pitch(q);\n\t\tError += glm::epsilonEqual(p, 0.f, 0.0001f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::quat q(1.0f, 0.0f, 0.0f, 1.0f);\n\t\tfloat p = glm::yaw(q);\n\t\tError += glm::epsilonEqual(p, 0.f, 0.0001f) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_rotation()\n{\n\tint Error(0);\n\n\tglm::vec3 v(1, 0, 0);\n\tglm::vec3 u(0, 1, 0);\n\n\tglm::quat Rotation = glm::rotation(v, u);\n\n\tfloat Angle = glm::angle(Rotation);\n\n\tError += glm::abs(Angle - glm::pi<float>() * 0.5f) < glm::epsilon<float>() ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_log()\n{\n\tint Error(0);\n\t\n\tglm::quat q;\n\tglm::quat p = glm::log(q);\n\tglm::quat r = glm::exp(p);\n\n\treturn Error;\n}\n\nint test_quat_lookAt()\n{\n\tint Error(0);\n\n\tglm::vec3 eye(0.0f);\n\tglm::vec3 center(1.1f, -2.0f, 3.1416f);\n\tglm::vec3 up(-0.17f, 7.23f, -1.744f);\n\n\tglm::quat test_quat = glm::quatLookAt(glm::normalize(center - eye), up);\n\tglm::quat test_mat = glm::conjugate(glm::quat_cast(glm::lookAt(eye, center, up)));\n\n\tError += static_cast<int>(glm::abs(glm::length(test_quat) - 1.0f) > glm::epsilon<float>());\n\tError += static_cast<int>(glm::min(glm::length(test_quat + (-test_mat)), glm::length(test_quat + test_mat)) > glm::epsilon<float>());\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_log();\n\tError += test_rotation();\n\tError += test_orientation();\n\tError += test_quat_fastMix();\n\tError += test_quat_shortMix();\n\tError += test_quat_lookAt();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_random.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2011-05-31\n// Updated : 2011-05-31\n// Licence : This source is under MIT licence\n// File    : test/gtx/random.cpp\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include <glm/glm.hpp>\n#include <glm/gtx/random.hpp>\n#include <glm/gtx/epsilon.hpp>\n#include <iostream>\n\nint test_signedRand1()\n{\n\tint Error = 0;\n\n\t{\n\t\tfloat ResultFloat = 0.0f;\n\t\tdouble ResultDouble = 0.0f;\n\t\tfor(std::size_t i = 0; i < 100000; ++i)\n\t\t{\n\t\t\tResultFloat += glm::signedRand1<float>();\n\t\t\tResultDouble += glm::signedRand1<double>();\n\t\t}\n\n\t\tError += glm::equalEpsilon(ResultFloat, 0.0f, 0.0001f);\n\t\tError += glm::equalEpsilon(ResultDouble, 0.0, 0.0001);\n\t}\n\n\treturn Error;\n}\n\nint test_normalizedRand2()\n{\n\tint Error = 0;\n\n\t{\n\t\tstd::size_t Max = 100000;\n\t\tfloat ResultFloat = 0.0f;\n\t\tdouble ResultDouble = 0.0f;\n\t\tfor(std::size_t i = 0; i < Max; ++i)\n\t\t{\n\t\t\tResultFloat += glm::length(glm::normalizedRand2<float>());\n\t\t\tResultDouble += glm::length(glm::normalizedRand2<double>());\n\t\t}\n\n\t\tError += glm::equalEpsilon(ResultFloat, float(Max), 0.000001f) ? 0 : 1;\n\t\tError += glm::equalEpsilon(ResultDouble, double(Max), 0.000001) ? 0 : 1;\n\t\tassert(!Error);\n\t}\n\n\treturn Error;\n}\n\nint test_normalizedRand3()\n{\n\tint Error = 0;\n\n\t{\n\t\tstd::size_t Max = 100000;\n\t\tfloat ResultFloatA = 0.0f;\n\t\tfloat ResultFloatB = 0.0f;\n\t\tfloat ResultFloatC = 0.0f;\n\t\tdouble ResultDoubleA = 0.0f;\n\t\tdouble ResultDoubleB = 0.0f;\n\t\tdouble ResultDoubleC = 0.0f;\n\t\tfor(std::size_t i = 0; i < Max; ++i)\n\t\t{\n\t\t\tResultFloatA += glm::length(glm::normalizedRand3<float>());\n\t\t\tResultDoubleA += glm::length(glm::normalizedRand3<double>());\n\t\t\tResultFloatB += glm::length(glm::normalizedRand3(2.0f, 2.0f));\n\t\t\tResultDoubleB += glm::length(glm::normalizedRand3(2.0, 2.0));\n\t\t\tResultFloatC += glm::length(glm::normalizedRand3(1.0f, 3.0f));\n\t\t\tResultDoubleC += glm::length(glm::normalizedRand3(1.0, 3.0));\n\t\t}\n\n\t\tError += glm::equalEpsilon(ResultFloatA, float(Max), 0.0001f) ? 0 : 1;\n\t\tError += glm::equalEpsilon(ResultDoubleA, double(Max), 0.0001) ? 0 : 1;\n\t\tError += glm::equalEpsilon(ResultFloatB, float(Max * 2), 0.0001f) ? 0 : 1;\n\t\tError += glm::equalEpsilon(ResultDoubleB, double(Max * 2), 0.0001) ? 0 : 1;\n\t\tError += (ResultFloatC >= float(Max) && ResultFloatC <= float(Max * 3)) ? 0 : 1;\n\t\tError += (ResultDoubleC >= double(Max) && ResultDoubleC <= double(Max * 3)) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_signedRand1();\n\tError += test_normalizedRand2();\n\tError += test_normalizedRand3();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_range.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/glm.hpp>\n#include <glm/gtc/epsilon.hpp>\n\n#if GLM_HAS_RANGE_FOR\n\n#include <glm/gtx/range.hpp>\n\nint test_vec()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::ivec3 const v(1, 2, 3);\n\n\t\tint count = 0;\n\t\tglm::ivec3 Result(0);\n\t\tfor(int x : v)\n\t\t{\n\t\t\tResult[count] = x;\n\t\t\tcount++;\n\t\t}\n\t\tError += count == 3 ? 0 : 1;\n\t\tError += v == Result ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::ivec3 v(1, 2, 3);\n\t\tfor(int& x : v)\n\t\t\tx = 0;\n\t\tError += glm::all(glm::equal(v, glm::ivec3(0))) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_mat()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::mat4x3 m(1.0f);\n\n\t\tint count = 0;\n\t\tfloat Sum = 0.0f;\n\t\tfor(float x : m)\n\t\t{\n\t\t\tcount++;\n\t\t\tSum += x;\n\t\t}\n\t\tError += count == 12 ? 0 : 1;\n\t\tError += glm::epsilonEqual(Sum, 3.0f, 0.001f) ? 0 : 1;\n\t}\n\n\t{\n\t\tglm::mat4x3 m(1.0f);\n\n\t\tfor (float& x : m) { x = 0; }\n\t\tglm::vec4 v(1, 1, 1, 1);\n\t\tError += glm::all(glm::equal(m*v, glm::vec3(0, 0, 0))) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\tError += test_vec();\n\tError += test_mat();\n\treturn Error;\n}\n\n#else\n\nint main()\n{\n\treturn 0;\n}\n\n#endif//GLM_HAS_RANGE_FOR\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_rotate_normalized_axis.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/rotate_normalized_axis.hpp>\n\nint main()\n{\n\tint Error(0);\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_rotate_vector.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/constants.hpp>\n#include <glm/gtx/rotate_vector.hpp>\n\nint test_rotate()\n{\n\tint Error = 0;\n\n\tglm::vec2 A = glm::rotate(glm::vec2(1, 0), glm::pi<float>() * 0.5f);\n\tglm::vec3 B = glm::rotate(glm::vec3(1, 0, 0), glm::pi<float>() * 0.5f, glm::vec3(0, 0, 1));\n\tglm::vec4 C = glm::rotate(glm::vec4(1, 0, 0, 1), glm::pi<float>() * 0.5f, glm::vec3(0, 0, 1));\n\tglm::vec3 D = glm::rotateX(glm::vec3(1, 0, 0), glm::pi<float>() * 0.5f);\n\tglm::vec4 E = glm::rotateX(glm::vec4(1, 0, 0, 1), glm::pi<float>() * 0.5f);\n\tglm::vec3 F = glm::rotateY(glm::vec3(1, 0, 0), glm::pi<float>() * 0.5f);\n\tglm::vec4 G = glm::rotateY(glm::vec4(1, 0, 0, 1), glm::pi<float>() * 0.5f);\n\tglm::vec3 H = glm::rotateZ(glm::vec3(1, 0, 0), glm::pi<float>() * 0.5f);\n\tglm::vec4 I = glm::rotateZ(glm::vec4(1, 0, 0,1 ), glm::pi<float>() * 0.5f);\n\tglm::mat4 O = glm::orientation(glm::normalize(glm::vec3(1)), glm::vec3(0, 0, 1));\n\n\treturn Error;\n}\n\nint test_rotateX()\n{\n\tint Error = 0;\n\n\tglm::vec3 D = glm::rotateX(glm::vec3(1, 0, 0), glm::pi<float>() * 0.5f);\n\tglm::vec4 E = glm::rotateX(glm::vec4(1, 0, 0, 1), glm::pi<float>() * 0.5f);\n\n\treturn Error;\n}\n\nint test_rotateY()\n{\n\tint Error = 0;\n\n\tglm::vec3 F = glm::rotateY(glm::vec3(1, 0, 0), glm::pi<float>() * 0.5f);\n\tglm::vec4 G = glm::rotateY(glm::vec4(1, 0, 0, 1), glm::pi<float>() * 0.5f);\n\n\treturn Error;\n}\n\n\nint test_rotateZ()\n{\n\tint Error = 0;\n\n\tglm::vec3 H = glm::rotateZ(glm::vec3(1, 0, 0), glm::pi<float>() * 0.5f);\n\tglm::vec4 I = glm::rotateZ(glm::vec4(1, 0, 0,1 ), glm::pi<float>() * 0.5f);\n\n\treturn Error;\n}\n\nint test_orientation()\n{\n\tint Error = 0;\n\n\tglm::mat4 O = glm::orientation(glm::normalize(glm::vec3(1)), glm::vec3(0, 0, 1));\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_rotate();\n\tError += test_rotateX();\n\tError += test_rotateY();\n\tError += test_rotateZ();\n\tError += test_orientation();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_scalar_multiplication.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/glm.hpp>\n\n#if GLM_HAS_TEMPLATE_ALIASES && !(GLM_COMPILER & GLM_COMPILER_GCC)\n#include <glm/gtx/scalar_multiplication.hpp>\n\nint main()\n{\n\tint Error(0);\n\tglm::vec3 v(0.5, 3.1, -9.1);\n\n\tError += glm::all(glm::equal(v, 1.0 * v)) ? 0 : 1;\n\tError += glm::all(glm::equal(v, 1 * v)) ? 0 : 1;\n\tError += glm::all(glm::equal(v, 1u * v)) ? 0 : 1;\n\n\tglm::mat3 m(1, 2, 3, 4, 5, 6, 7, 8, 9);\n\tglm::vec3 w = 0.5f * m * v;\n\n\tError += glm::all(glm::equal((m*v)/2, w)) ? 0 : 1;\n\tError += glm::all(glm::equal(m*(v/2), w)) ? 0 : 1;\n\tError += glm::all(glm::equal((m/2)*v, w)) ? 0 : 1;\n\tError += glm::all(glm::equal((0.5*m)*v, w)) ? 0 : 1;\n\tError += glm::all(glm::equal(0.5*(m*v), w)) ? 0 : 1;\n\n\treturn Error;\n}\n\n#else\n\nint main()\n{\n\treturn 0;\n}\n\n#endif\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_scalar_relational.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/glm.hpp>\n#include <glm/gtx/scalar_relational.hpp>\n#include <cstdio>\n\nint test_lessThan()\n{\n\tint Error(0);\n\n\tError += glm::lessThan(0, 1) ? 0 : 1;\n\tError += glm::lessThan(1, 0) ? 1 : 0;\n\tError += glm::lessThan(0, 0) ? 1 : 0;\n\tError += glm::lessThan(1, 1) ? 1 : 0;\n\tError += glm::lessThan(0.0f, 1.0f) ? 0 : 1;\n\tError += glm::lessThan(1.0f, 0.0f) ? 1 : 0;\n\tError += glm::lessThan(0.0f, 0.0f) ? 1 : 0;\n\tError += glm::lessThan(1.0f, 1.0f) ? 1 : 0;\n\tError += glm::lessThan(0.0, 1.0) ? 0 : 1;\n\tError += glm::lessThan(1.0, 0.0) ? 1 : 0;\n\tError += glm::lessThan(0.0, 0.0) ? 1 : 0;\n\tError += glm::lessThan(1.0, 1.0) ? 1 : 0;\n\n\treturn Error;\n}\n\nint test_lessThanEqual()\n{\n\tint Error(0);\n\n\tError += glm::lessThanEqual(0, 1) ? 0 : 1;\n\tError += glm::lessThanEqual(1, 0) ? 1 : 0;\n\tError += glm::lessThanEqual(0, 0) ? 0 : 1;\n\tError += glm::lessThanEqual(1, 1) ? 0 : 1;\n\tError += glm::lessThanEqual(0.0f, 1.0f) ? 0 : 1;\n\tError += glm::lessThanEqual(1.0f, 0.0f) ? 1 : 0;\n\tError += glm::lessThanEqual(0.0f, 0.0f) ? 0 : 1;\n\tError += glm::lessThanEqual(1.0f, 1.0f) ? 0 : 1;\n\tError += glm::lessThanEqual(0.0, 1.0) ? 0 : 1;\n\tError += glm::lessThanEqual(1.0, 0.0) ? 1 : 0;\n\tError += glm::lessThanEqual(0.0, 0.0) ? 0 : 1;\n\tError += glm::lessThanEqual(1.0, 1.0) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_greaterThan()\n{\n\tint Error(0);\n\n\tError += glm::greaterThan(0, 1) ? 1 : 0;\n\tError += glm::greaterThan(1, 0) ? 0 : 1;\n\tError += glm::greaterThan(0, 0) ? 1 : 0;\n\tError += glm::greaterThan(1, 1) ? 1 : 0;\n\tError += glm::greaterThan(0.0f, 1.0f) ? 1 : 0;\n\tError += glm::greaterThan(1.0f, 0.0f) ? 0 : 1;\n\tError += glm::greaterThan(0.0f, 0.0f) ? 1 : 0;\n\tError += glm::greaterThan(1.0f, 1.0f) ? 1 : 0;\n\tError += glm::greaterThan(0.0, 1.0) ? 1 : 0;\n\tError += glm::greaterThan(1.0, 0.0) ? 0 : 1;\n\tError += glm::greaterThan(0.0, 0.0) ? 1 : 0;\n\tError += glm::greaterThan(1.0, 1.0) ? 1 : 0;\n\n\treturn Error;\n}\n\nint test_greaterThanEqual()\n{\n\tint Error(0);\n\n\tError += glm::greaterThanEqual(0, 1) ? 1 : 0;\n\tError += glm::greaterThanEqual(1, 0) ? 0 : 1;\n\tError += glm::greaterThanEqual(0, 0) ? 0 : 1;\n\tError += glm::greaterThanEqual(1, 1) ? 0 : 1;\n\tError += glm::greaterThanEqual(0.0f, 1.0f) ? 1 : 0;\n\tError += glm::greaterThanEqual(1.0f, 0.0f) ? 0 : 1;\n\tError += glm::greaterThanEqual(0.0f, 0.0f) ? 0 : 1;\n\tError += glm::greaterThanEqual(1.0f, 1.0f) ? 0 : 1;\n\tError += glm::greaterThanEqual(0.0, 1.0) ? 1 : 0;\n\tError += glm::greaterThanEqual(1.0, 0.0) ? 0 : 1;\n\tError += glm::greaterThanEqual(0.0, 0.0) ? 0 : 1;\n\tError += glm::greaterThanEqual(1.0, 1.0) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_equal()\n{\n\tint Error(0);\n\n\tError += glm::equal(0, 1) ? 1 : 0;\n\tError += glm::equal(1, 0) ? 1 : 0;\n\tError += glm::equal(0, 0) ? 0 : 1;\n\tError += glm::equal(1, 1) ? 0 : 1;\n\tError += glm::equal(0.0f, 1.0f) ? 1 : 0;\n\tError += glm::equal(1.0f, 0.0f) ? 1 : 0;\n\tError += glm::equal(0.0f, 0.0f) ? 0 : 1;\n\tError += glm::equal(1.0f, 1.0f) ? 0 : 1;\n\tError += glm::equal(0.0, 1.0) ? 1 : 0;\n\tError += glm::equal(1.0, 0.0) ? 1 : 0;\n\tError += glm::equal(0.0, 0.0) ? 0 : 1;\n\tError += glm::equal(1.0, 1.0) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_notEqual()\n{\n\tint Error(0);\n\n\tError += glm::notEqual(0, 1) ? 0 : 1;\n\tError += glm::notEqual(1, 0) ? 0 : 1;\n\tError += glm::notEqual(0, 0) ? 1 : 0;\n\tError += glm::notEqual(1, 1) ? 1 : 0;\n\tError += glm::notEqual(0.0f, 1.0f) ? 0 : 1;\n\tError += glm::notEqual(1.0f, 0.0f) ? 0 : 1;\n\tError += glm::notEqual(0.0f, 0.0f) ? 1 : 0;\n\tError += glm::notEqual(1.0f, 1.0f) ? 1 : 0;\n\tError += glm::notEqual(0.0, 1.0) ? 0 : 1;\n\tError += glm::notEqual(1.0, 0.0) ? 0 : 1;\n\tError += glm::notEqual(0.0, 0.0) ? 1 : 0;\n\tError += glm::notEqual(1.0, 1.0) ? 1 : 0;\n\n\treturn Error;\n}\n\nint test_any()\n{\n\tint Error(0);\n\n\tError += glm::any(true) ? 0 : 1;\n\tError += glm::any(false) ? 1 : 0;\n\n\treturn Error;\n}\n\nint test_all()\n{\n\tint Error(0);\n\n\tError += glm::all(true) ? 0 : 1;\n\tError += glm::all(false) ? 1 : 0;\n\n\treturn Error;\n}\n\nint test_not()\n{\n\tint Error(0);\n\n\tError += glm::not_(true) ? 1 : 0;\n\tError += glm::not_(false) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_lessThan();\n\tError += test_lessThanEqual();\n\tError += test_greaterThan();\n\tError += test_greaterThanEqual();\n\tError += test_equal();\n\tError += test_notEqual();\n\tError += test_any();\n\tError += test_all();\n\tError += test_not();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_simd_mat4.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to deal\n/// in the Software without restriction, including without limitation the rights\n/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n/// copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n/// \n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n/// \n/// Restrictions:\n///\t\tBy making use of the Software for military purposes, you choose to make\n///\t\ta Bunny unhappy.\n/// \n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n/// THE SOFTWARE.\n///\n/// @file test/gtx/gtx_simd_mat4.cpp\n/// @date 2010-09-16 / 2014-11-25\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <glm/glm.hpp>\n#include <glm/gtc/matrix_transform.hpp>\n#include <glm/gtc/quaternion.hpp>\n#include <glm/gtc/random.hpp>\n#include <glm/gtx/simd_vec4.hpp>\n#include <glm/gtx/simd_mat4.hpp>\n#include <cstdio>\n#include <ctime>\n#include <vector>\n\n#if(GLM_ARCH != GLM_ARCH_PURE)\n\nstd::vector<float> test_detA(std::vector<glm::mat4> const & Data)\n{\n\tstd::vector<float> Test(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Test.size() - 1; ++i)\n\t\tTest[i] = glm::determinant(Data[i]);\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Det A: %ld\\n\", TimeEnd - TimeStart);\n\n\treturn Test;\n}\n\nstd::vector<float> test_detB(std::vector<glm::mat4> const & Data)\n{\n\tstd::vector<float> Test(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Test.size() - 1; ++i)\n\t{\n\t\t_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);\n\t\tglm::simdMat4 m(Data[i]);\n\t\tglm::simdVec4 d(glm::detail::sse_slow_det_ps((__m128 const * const)&m)); \n\t\tglm::vec4 v;//(d);\n\t\tTest[i] = v.x;\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Det B: %ld\\n\", TimeEnd - TimeStart);\n\n\treturn Test;\n}\n\nstd::vector<float> test_detC(std::vector<glm::mat4> const & Data)\n{\n\tstd::vector<float> Test(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Test.size() - 1; ++i)\n\t{\n\t\t_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);\n\t\tglm::simdMat4 m(Data[i]);\n\t\tglm::simdVec4 d(glm::detail::sse_det_ps((__m128 const * const)&m));\n\t\tglm::vec4 v;//(d);\n\t\tTest[i] = v.x;\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Det C: %ld\\n\", TimeEnd - TimeStart);\n\n\treturn Test;\n}\n\nstd::vector<float> test_detD(std::vector<glm::mat4> const & Data)\n{\n\tstd::vector<float> Test(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Test.size() - 1; ++i)\n\t{\n\t\t_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);\n\t\tglm::simdMat4 m(Data[i]);\n\t\tglm::simdVec4 d(glm::detail::sse_detd_ps((__m128 const * const)&m));\n\t\tglm::vec4 v;//(d); \n\t\tTest[i] = v.x;\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Det D: %ld\\n\", TimeEnd - TimeStart);\n\n\treturn Test;\n}\n\nvoid test_invA(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)\n{\n\t//std::vector<float> Test(Data.size());\n\tOut.resize(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Out.size() - 1; ++i)\n\t{\n\t\tOut[i] = glm::inverse(Data[i]);\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Inv A: %ld\\n\", TimeEnd - TimeStart);\n}\n\nvoid test_invC(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)\n{\n\t//std::vector<float> Test(Data.size());\n\tOut.resize(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Out.size() - 1; ++i)\n\t{\n\t\t_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);\n\t\tglm::simdMat4 m(Data[i]);\n\t\tglm::simdMat4 o;\n\t\tglm::detail::sse_inverse_fast_ps((__m128 const * const)&m, (__m128 *)&o);\n\t\tOut[i] = *(glm::mat4*)&o;\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Inv C: %ld\\n\", TimeEnd - TimeStart);\n}\n\nvoid test_invD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)\n{\n\t//std::vector<float> Test(Data.size());\n\tOut.resize(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Out.size() - 1; ++i)\n\t{\n\t\t_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);\n\t\tglm::simdMat4 m(Data[i]);\n\t\tglm::simdMat4 o;\n\t\tglm::detail::sse_inverse_ps((__m128 const * const)&m, (__m128 *)&o);\n\t\tOut[i] = *(glm::mat4*)&o;\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Inv D: %ld\\n\", TimeEnd - TimeStart);\n}\n\nvoid test_mulA(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)\n{\n\t//std::vector<float> Test(Data.size());\n\tOut.resize(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Out.size() - 1; ++i)\n\t{\n\t\tOut[i] = Data[i] * Data[i];\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Mul A: %ld\\n\", TimeEnd - TimeStart);\n}\n\nvoid test_mulD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)\n{\n\t//std::vector<float> Test(Data.size());\n\tOut.resize(Data.size());\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t i = 0; i < Out.size() - 1; ++i)\n\t{\n\t\t_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);\n\t\tglm::simdMat4 m(Data[i]);\n\t\tglm::simdMat4 o;\n\t\tglm::detail::sse_mul_ps((__m128 const * const)&m, (__m128 const * const)&m, (__m128*)&o);\n\t\tOut[i] = *(glm::mat4*)&o;\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"Mul D: %ld\\n\", TimeEnd - TimeStart);\n}\n\nint test_compute_glm()\n{\n\treturn 0;\n}\n\nint test_compute_gtx()\n{\n\tstd::vector<glm::vec4> Output(1000000);\n\n\tstd::clock_t TimeStart = clock();\n\n\tfor(std::size_t k = 0; k < Output.size(); ++k)\n\t{\n\t\tfloat i = float(k) / 1000.f + 0.001f;\n\t\tglm::vec3 A = glm::normalize(glm::vec3(i));\n\t\tglm::vec3 B = glm::cross(A, glm::normalize(glm::vec3(1, 1, 2)));\n\t\tglm::mat4 C = glm::rotate(glm::mat4(1.0f), i, B);\n\t\tglm::mat4 D = glm::scale(C, glm::vec3(0.8f, 1.0f, 1.2f));\n\t\tglm::mat4 E = glm::translate(D, glm::vec3(1.4f, 1.2f, 1.1f));\n\t\tglm::mat4 F = glm::perspective(i, 1.5f, 0.1f, 1000.f);\n\t\tglm::mat4 G = glm::inverse(F * E);\n\t\tglm::vec3 H = glm::unProject(glm::vec3(i), G, F, E[3]);\n\t\tglm::vec3 I = glm::any(glm::isnan(glm::project(H, G, F, E[3]))) ? glm::vec3(2) : glm::vec3(1);\n\t\tglm::mat4 J = glm::lookAt(glm::normalize(glm::max(B, glm::vec3(0.001f))), H, I);\n\t\tglm::mat4 K = glm::transpose(J);\n\t\tglm::quat L = glm::normalize(glm::quat_cast(K));\n\t\tglm::vec4 M = L * glm::smoothstep(K[3], J[3], glm::vec4(i));\n\t\tglm::mat4 N = glm::mat4(glm::normalize(glm::max(M, glm::vec4(0.001f))), K[3], J[3], glm::vec4(i));\n\t\tglm::mat4 O = N * glm::inverse(N);\n\t\tglm::vec4 P = O * glm::reflect(N[3], glm::vec4(A, 1.0f));\n\t\tglm::vec4 Q = glm::vec4(glm::dot(M, P));\n\t\tglm::vec4 R = glm::quat(Q.w, glm::vec3(Q)) * P;\n\t\tOutput[k] = R;\n\t}\n\n\tstd::clock_t TimeEnd = clock();\n\tprintf(\"test_compute_gtx: %ld\\n\", TimeEnd - TimeStart);\n\n\treturn 0;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tstd::vector<glm::mat4> Data(64 * 64 * 1);\n\tfor(std::size_t i = 0; i < Data.size(); ++i)\n\t\tData[i] = glm::mat4(\n\t\t\tglm::vec4(glm::linearRand(glm::vec4(-2.0f), glm::vec4(2.0f))),\n\t\t\tglm::vec4(glm::linearRand(glm::vec4(-2.0f), glm::vec4(2.0f))),\n\t\t\tglm::vec4(glm::linearRand(glm::vec4(-2.0f), glm::vec4(2.0f))),\n\t\t\tglm::vec4(glm::linearRand(glm::vec4(-2.0f), glm::vec4(2.0f))));\n\n\t{\n\t\tstd::vector<glm::mat4> TestInvA;\n\t\ttest_invA(Data, TestInvA);\n\t}\n\t{\n\t\tstd::vector<glm::mat4> TestInvC;\n\t\ttest_invC(Data, TestInvC);\n\t}\n\t{\n\t\tstd::vector<glm::mat4> TestInvD;\n\t\ttest_invD(Data, TestInvD);\n\t}\n\n\t{\n\t\tstd::vector<glm::mat4> TestA;\n\t\ttest_mulA(Data, TestA);\n\t}\n\t{\n\t\tstd::vector<glm::mat4> TestD;\n\t\ttest_mulD(Data, TestD);\n\t}\n\n\t{\n\t\tstd::vector<float> TestDetA = test_detA(Data);\n\t\tstd::vector<float> TestDetB = test_detB(Data);\n\t\tstd::vector<float> TestDetD = test_detD(Data);\n\t\tstd::vector<float> TestDetC = test_detC(Data);\n\n\t\tfor(std::size_t i = 0; i < TestDetA.size(); ++i)\n\t\t\tif(TestDetA[i] != TestDetB[i] && TestDetC[i] != TestDetB[i] && TestDetC[i] != TestDetD[i])\n\t\t\t\treturn 1;\n\t}\n\n\t// shuffle test\n\tglm::simdVec4 A(1.0f, 2.0f, 3.0f, 4.0f);\n\tglm::simdVec4 B(5.0f, 6.0f, 7.0f, 8.0f);\n\t//__m128 C = _mm_shuffle_ps(A.Data, B.Data, _MM_SHUFFLE(1, 0, 1, 0));\n\n\tError += test_compute_glm();\n\tError += test_compute_gtx();\n\tfloat Det = glm::determinant(glm::simdMat4(1.0));\n\tError += Det == 1.0f ? 0 : 1;\n\t\n\tglm::simdMat4 D = glm::matrixCompMult(glm::simdMat4(1.0), glm::simdMat4(1.0));\n\n\treturn Error;\n}\n\n#else\n\nint main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n\n#endif//(GLM_ARCH != GLM_ARCH_PURE)\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_simd_vec4.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to deal\n/// in the Software without restriction, including without limitation the rights\n/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n/// copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n/// \n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n/// \n/// Restrictions:\n///\t\tBy making use of the Software for military purposes, you choose to make\n///\t\ta Bunny unhappy.\n/// \n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n/// THE SOFTWARE.\n///\n/// @file test/gtx/gtx_simd_vec4.cpp\n/// @date 2010-09-16 / 2014-11-25\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <glm/glm.hpp>\n#include <glm/gtx/simd_vec4.hpp>\n#include <cstdio>\n\n#if(GLM_ARCH != GLM_ARCH_PURE)\n\nint main()\n{\n\tglm::simdVec4 A1(0.0f, 0.1f, 0.2f, 0.3f);\n\tglm::simdVec4 B1(0.4f, 0.5f, 0.6f, 0.7f);\n\tglm::simdVec4 C1 = A1 + B1;\n\tglm::simdVec4 D1 = A1.swizzle<glm::X, glm::Z, glm::Y, glm::W>();\n\tglm::simdVec4 E1(glm::vec4(1.0f));\n\tglm::vec4 F1 = glm::vec4_cast(E1);\n\t//glm::vec4 G1(E1);\n\n\t//printf(\"A1(%2.3f, %2.3f, %2.3f, %2.3f)\\n\", A1.x, A1.y, A1.z, A1.w);\n\t//printf(\"B1(%2.3f, %2.3f, %2.3f, %2.3f)\\n\", B1.x, B1.y, B1.z, B1.w);\n\t//printf(\"C1(%2.3f, %2.3f, %2.3f, %2.3f)\\n\", C1.x, C1.y, C1.z, C1.w);\n\t//printf(\"D1(%2.3f, %2.3f, %2.3f, %2.3f)\\n\", D1.x, D1.y, D1.z, D1.w);\n\n\t__m128 value = _mm_set1_ps(0.0f);\n\t__m128 data = _mm_cmpeq_ps(value, value);\n\t__m128 add0 = _mm_add_ps(data, data);\n\n\tglm::simdVec4 GNI(add0);\n\n\treturn 0;\n}\n\n#else\n\nint main()\n{\n\tint Error = 0;\n\n\treturn Error;\n}\n\n#endif//(GLM_ARCH != GLM_ARCH_PURE)\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_spline.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/vec2.hpp>\n#include <glm/vec3.hpp>\n#include <glm/vec4.hpp>\n#include <glm/gtx/spline.hpp>\n\nnamespace catmullRom\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tglm::vec2 Result2 = glm::catmullRom(\n\t\t\tglm::vec2(0.0f, 0.0f),\n\t\t\tglm::vec2(1.0f, 0.0f),\n\t\t\tglm::vec2(1.0f, 1.0f),\n\t\t\tglm::vec2(0.0f, 1.0f), 0.5f);\n\n\t\tglm::vec3 Result3 = glm::catmullRom(\n\t\t\tglm::vec3(0.0f, 0.0f, 0.0f), \n\t\t\tglm::vec3(1.0f, 0.0f, 0.0f), \n\t\t\tglm::vec3(1.0f, 1.0f, 0.0f), \n\t\t\tglm::vec3(0.0f, 1.0f, 0.0f), 0.5f);\n\n\t\tglm::vec4 Result4 = glm::catmullRom(\n\t\t\tglm::vec4(0.0f, 0.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(1.0f, 0.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(1.0f, 1.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(0.0f, 1.0f, 0.0f, 1.0f), 0.5f);\n\n\t\treturn Error;\n\t}\n}//catmullRom\n\nnamespace hermite\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tglm::vec2 Result2 = glm::hermite(\n\t\t\tglm::vec2(0.0f, 0.0f),\n\t\t\tglm::vec2(1.0f, 0.0f),\n\t\t\tglm::vec2(1.0f, 1.0f),\n\t\t\tglm::vec2(0.0f, 1.0f), 0.5f);\n\n\t\tglm::vec3 Result3 = glm::hermite(\n\t\t\tglm::vec3(0.0f, 0.0f, 0.0f), \n\t\t\tglm::vec3(1.0f, 0.0f, 0.0f), \n\t\t\tglm::vec3(1.0f, 1.0f, 0.0f), \n\t\t\tglm::vec3(0.0f, 1.0f, 0.0f), 0.5f);\n\n\t\tglm::vec4 Result4 = glm::hermite(\n\t\t\tglm::vec4(0.0f, 0.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(1.0f, 0.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(1.0f, 1.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(0.0f, 1.0f, 0.0f, 1.0f), 0.5f);\n\n\t\treturn Error;\n\t}\n}//catmullRom\n\nnamespace cubic\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tglm::vec2 Result2 = glm::cubic(\n\t\t\tglm::vec2(0.0f, 0.0f),\n\t\t\tglm::vec2(1.0f, 0.0f),\n\t\t\tglm::vec2(1.0f, 1.0f),\n\t\t\tglm::vec2(0.0f, 1.0f), 0.5f);\n\n\t\tglm::vec3 Result3 = glm::cubic(\n\t\t\tglm::vec3(0.0f, 0.0f, 0.0f), \n\t\t\tglm::vec3(1.0f, 0.0f, 0.0f), \n\t\t\tglm::vec3(1.0f, 1.0f, 0.0f), \n\t\t\tglm::vec3(0.0f, 1.0f, 0.0f), 0.5f);\n\n\t\tglm::vec4 Result = glm::cubic(\n\t\t\tglm::vec4(0.0f, 0.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(1.0f, 0.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(1.0f, 1.0f, 0.0f, 1.0f), \n\t\t\tglm::vec4(0.0f, 1.0f, 0.0f, 1.0f), 0.5f);\n\n\t\treturn Error;\n\t}\n}//catmullRom\n\nint main()\n{\n\tint Error(0);\n\n\tError += catmullRom::test();\n\tError += hermite::test();\n\tError += cubic::test();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_string_cast.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/glm.hpp>\n#include <glm/gtx/string_cast.hpp>\n#include <limits>\n\nint test_string_cast_vector()\n{\n\tint Error = 0;\n\n\t{\n\t\tglm::vec2 A1(1, 2);\n\t\tstd::string A2 = glm::to_string(A1);\n\t\tError += A2 != std::string(\"vec2(1.000000, 2.000000)\") ? 1 : 0;\n\t\n\t\tglm::vec3 B1(1, 2, 3);\n\t\tstd::string B2 = glm::to_string(B1);\n\t\tError += B2 != std::string(\"vec3(1.000000, 2.000000, 3.000000)\") ? 1 : 0;\n\n\t\tglm::vec4 C1(1, 2, 3, 4);\n\t\tstd::string C2 = glm::to_string(C1);\n\t\tError += C2 != std::string(\"vec4(1.000000, 2.000000, 3.000000, 4.000000)\") ? 1 : 0;\n\t\n\t\tglm::dvec2 J1(1, 2);\n\t\tstd::string J2 = glm::to_string(J1);\n\t\tError += J2 != std::string(\"dvec2(1.000000, 2.000000)\") ? 1 : 0;\n\t\n\t\tglm::dvec3 K1(1, 2, 3);\n\t\tstd::string K2 = glm::to_string(K1);\n\t\tError += K2 != std::string(\"dvec3(1.000000, 2.000000, 3.000000)\") ? 1 : 0;\n\t\n\t\tglm::dvec4 L1(1, 2, 3, 4);\n\t\tstd::string L2 = glm::to_string(L1);\n\t\tError += L2 != std::string(\"dvec4(1.000000, 2.000000, 3.000000, 4.000000)\") ? 1 : 0;\n\t}\n\n\t{\n\t\tglm::bvec2 M1(false, true);\n\t\tstd::string M2 = glm::to_string(M1);\n\t\tError += M2 != std::string(\"bvec2(false, true)\") ? 1 : 0;\n\t\n\t\tglm::bvec3 O1(false, true, false);\n\t\tstd::string O2 = glm::to_string(O1);\n\t\tError += O2 != std::string(\"bvec3(false, true, false)\") ? 1 : 0;\n\n\t\tglm::bvec4 P1(false, true, false, true);\n\t\tstd::string P2 = glm::to_string(P1);\n\t\tError += P2 != std::string(\"bvec4(false, true, false, true)\") ? 1 : 0;\n\t}\n\n\t{\n\t\tglm::ivec2 D1(1, 2);\n\t\tstd::string D2 = glm::to_string(D1);\n\t\tError += D2 != std::string(\"ivec2(1, 2)\") ? 1 : 0;\n\t\n\t\tglm::ivec3 E1(1, 2, 3);\n\t\tstd::string E2 = glm::to_string(E1);\n\t\tError += E2 != std::string(\"ivec3(1, 2, 3)\") ? 1 : 0;\n\t\n\t\tglm::ivec4 F1(1, 2, 3, 4);\n\t\tstd::string F2 = glm::to_string(F1);\n\t\tError += F2 != std::string(\"ivec4(1, 2, 3, 4)\") ? 1 : 0;\n\t}\n\n\t{\n\t\tglm::i8vec2 D1(1, 2);\n\t\tstd::string D2 = glm::to_string(D1);\n\t\tError += D2 != std::string(\"i8vec2(1, 2)\") ? 1 : 0;\n\t\n\t\tglm::i8vec3 E1(1, 2, 3);\n\t\tstd::string E2 = glm::to_string(E1);\n\t\tError += E2 != std::string(\"i8vec3(1, 2, 3)\") ? 1 : 0;\n\t\n\t\tglm::i8vec4 F1(1, 2, 3, 4);\n\t\tstd::string F2 = glm::to_string(F1);\n\t\tError += F2 != std::string(\"i8vec4(1, 2, 3, 4)\") ? 1 : 0;\n\t}\n\n\t{\n\t\tglm::i16vec2 D1(1, 2);\n\t\tstd::string D2 = glm::to_string(D1);\n\t\tError += D2 != std::string(\"i16vec2(1, 2)\") ? 1 : 0;\n\t\n\t\tglm::i16vec3 E1(1, 2, 3);\n\t\tstd::string E2 = glm::to_string(E1);\n\t\tError += E2 != std::string(\"i16vec3(1, 2, 3)\") ? 1 : 0;\n\t\n\t\tglm::i16vec4 F1(1, 2, 3, 4);\n\t\tstd::string F2 = glm::to_string(F1);\n\t\tError += F2 != std::string(\"i16vec4(1, 2, 3, 4)\") ? 1 : 0;\n\t}\n\n\t{\n\t\tglm::i64vec2 D1(1, 2);\n\t\tstd::string D2 = glm::to_string(D1);\n\t\tError += D2 != std::string(\"i64vec2(1, 2)\") ? 1 : 0;\n\t\n\t\tglm::i64vec3 E1(1, 2, 3);\n\t\tstd::string E2 = glm::to_string(E1);\n\t\tError += E2 != std::string(\"i64vec3(1, 2, 3)\") ? 1 : 0;\n\t\n\t\tglm::i64vec4 F1(1, 2, 3, 4);\n\t\tstd::string F2 = glm::to_string(F1);\n\t\tError += F2 != std::string(\"i64vec4(1, 2, 3, 4)\") ? 1 : 0;\n\t}\n\n\treturn Error;\n}\n\nint test_string_cast_matrix()\n{\n\tint Error = 0;\n\t\n\tglm::mat2x2 A1(1.000000, 2.000000, 3.000000, 4.000000);\n\tstd::string A2 = glm::to_string(A1);\n\tError += A2 != std::string(\"mat2x2((1.000000, 2.000000), (3.000000, 4.000000))\") ? 1 : 0;\n\n\treturn Error;\n}\n\nint test_string_cast_quaternion()\n{\n\tint Error = 0;\n\n\tglm::quat Q0 = glm::quat(1.0f, 2.0f, 3.0f, 4.0f);\n\tstd::string S0 = glm::to_string(Q0);\n\tError += S0 != std::string(\"quat(1.000000, {2.000000, 3.000000, 4.000000})\") ? 1 : 0;\n\n\treturn Error;\n\n}\n\nint main()\n{\n\tint Error = 0;\n\tError += test_string_cast_vector();\n\tError += test_string_cast_matrix();\n\tError += test_string_cast_quaternion();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_texture.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/vec2.hpp>\n#include <glm/gtx/texture.hpp>\n\nint test_levels()\n{\n\tint Error = 0;\n\n\tint const Levels = glm::levels(glm::ivec2(3, 2));\n\tError += Levels == 2 ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error = 0;\n\n\tError += test_levels();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_type_aligned.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/type_aligned.hpp>\n#include <cstdio>\n\nint test_decl()\n{\n\tint Error(0);\n\n\t{\n\t\tstruct S1\n\t\t{\n\t\t\tglm::aligned_vec4 B;\n\t\t};\n\n\t\tstruct S2\n\t\t{\n\t\t\tglm::vec4 B;\n\t\t};\n\n\t\tprintf(\"vec4 - Aligned: %d, unaligned: %d\\n\", static_cast<int>(sizeof(S1)), static_cast<int>(sizeof(S2)));\n\n\t\tError += sizeof(S1) >= sizeof(S2) ? 0 : 1;\n\t}\n\n\t{\n\t\tstruct S1\n\t\t{\n\t\t\tbool A;\n\t\t\tglm::vec3 B;\n\t\t};\n\n\t\tstruct S2\n\t\t{\n\t\t\tbool A;\n\t\t\tglm::aligned_vec3 B;\n\t\t};\n\n\t\tprintf(\"vec3 - Aligned: %d, unaligned: %d\\n\", static_cast<int>(sizeof(S1)), static_cast<int>(sizeof(S2)));\n\n\t\tError += sizeof(S1) <= sizeof(S2) ? 0 : 1;\n\t}\n\n\t{\n\t\tstruct S1\n\t\t{\n\t\t\tbool A;\n\t\t\tglm::aligned_vec4 B;\n\t\t};\n\n\t\tstruct S2\n\t\t{\n\t\t\tbool A;\n\t\t\tglm::vec4 B;\n\t\t};\n\n\t\tprintf(\"vec4 - Aligned: %d, unaligned: %d\\n\", static_cast<int>(sizeof(S1)), static_cast<int>(sizeof(S2)));\n\n\t\tError += sizeof(S1) >= sizeof(S2) ? 0 : 1;\n\t}\n\n\t{\n\t\tstruct S1\n\t\t{\n\t\t\tbool A;\n\t\t\tglm::aligned_dvec4 B;\n\t\t};\n\n\t\tstruct S2\n\t\t{\n\t\t\tbool A;\n\t\t\tglm::dvec4 B;\n\t\t};\n\n\t\tprintf(\"dvec4 - Aligned: %d, unaligned: %d\\n\", static_cast<int>(sizeof(S1)), static_cast<int>(sizeof(S2)));\n\n\t\tError += sizeof(S1) >= sizeof(S2) ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\ntemplate<typename genType>\nvoid print(genType const& Mat0)\n{\n\tprintf(\"mat4(\\n\");\n\tprintf(\"\\tvec4(%2.9f, %2.9f, %2.9f, %2.9f)\\n\", static_cast<double>(Mat0[0][0]), static_cast<double>(Mat0[0][1]), static_cast<double>(Mat0[0][2]), static_cast<double>(Mat0[0][3]));\n\tprintf(\"\\tvec4(%2.9f, %2.9f, %2.9f, %2.9f)\\n\", static_cast<double>(Mat0[1][0]), static_cast<double>(Mat0[1][1]), static_cast<double>(Mat0[1][2]), static_cast<double>(Mat0[1][3]));\n\tprintf(\"\\tvec4(%2.9f, %2.9f, %2.9f, %2.9f)\\n\", static_cast<double>(Mat0[2][0]), static_cast<double>(Mat0[2][1]), static_cast<double>(Mat0[2][2]), static_cast<double>(Mat0[2][3]));\n\tprintf(\"\\tvec4(%2.9f, %2.9f, %2.9f, %2.9f))\\n\\n\", static_cast<double>(Mat0[3][0]), static_cast<double>(Mat0[3][1]), static_cast<double>(Mat0[3][2]), static_cast<double>(Mat0[3][3]));\n}\n\nint perf_mul()\n{\n\tint Error = 0;\n\n\tglm::mat4 A(1.0f);\n\tglm::mat4 B(1.0f);\n\n\tglm::mat4 C = A * B;\n\n\tprint(C);\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_decl();\n\tError += perf_mul();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_type_trait.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/vec4.hpp>\n#include <glm/gtx/type_trait.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\t\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_vec_swizzle.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/vec_swizzle.hpp>\n\nint main()\n{\n\tint Error = 0;\n\n\n\treturn Error;\n}\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_vector_angle.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtc/constants.hpp>\n#include <glm/gtx/vector_angle.hpp>\n#include <limits>\n\nint test_angle()\n{\n\tint Error = 0;\n\t\n\tfloat AngleA = glm::angle(glm::vec2(1, 0), glm::normalize(glm::vec2(1, 1)));\n\tError += glm::epsilonEqual(AngleA, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\tfloat AngleB = glm::angle(glm::vec3(1, 0, 0), glm::normalize(glm::vec3(1, 1, 0)));\n\tError += glm::epsilonEqual(AngleB, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\tfloat AngleC = glm::angle(glm::vec4(1, 0, 0, 0), glm::normalize(glm::vec4(1, 1, 0, 0)));\n\tError += glm::epsilonEqual(AngleC, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_orientedAngle_vec2()\n{\n\tint Error = 0;\n\t\n\tfloat AngleA = glm::orientedAngle(glm::vec2(1, 0), glm::normalize(glm::vec2(1, 1)));\n\tError += glm::epsilonEqual(AngleA, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\tfloat AngleB = glm::orientedAngle(glm::vec2(0, 1), glm::normalize(glm::vec2(1, 1)));\n\tError += glm::epsilonEqual(AngleB, -glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\tfloat AngleC = glm::orientedAngle(glm::normalize(glm::vec2(1, 1)), glm::vec2(0, 1));\n\tError += glm::epsilonEqual(AngleC, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_orientedAngle_vec3()\n{\n\tint Error = 0;\n\t\n\tfloat AngleA = glm::orientedAngle(glm::vec3(1, 0, 0), glm::normalize(glm::vec3(1, 1, 0)), glm::vec3(0, 0, 1));\n\tError += glm::epsilonEqual(AngleA, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\tfloat AngleB = glm::orientedAngle(glm::vec3(0, 1, 0), glm::normalize(glm::vec3(1, 1, 0)), glm::vec3(0, 0, 1));\n\tError += glm::epsilonEqual(AngleB, -glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\tfloat AngleC = glm::orientedAngle(glm::normalize(glm::vec3(1, 1, 0)), glm::vec3(0, 1, 0), glm::vec3(0, 0, 1));\n\tError += glm::epsilonEqual(AngleC, glm::pi<float>() * 0.25f, 0.01f) ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\t\n\tError += test_angle();\n\tError += test_orientedAngle_vec2();\n\tError += test_orientedAngle_vec3();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_vector_query.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/vec2.hpp>\n#include <glm/vec3.hpp>\n#include <glm/vec4.hpp>\n#include <glm/gtx/vector_query.hpp>\n\nint test_areCollinear()\n{\n\tint Error(0);\n\n\t{\n\t\tbool TestA = glm::areCollinear(glm::vec2(-1), glm::vec2(1), 0.00001f);\n\t\tError += TestA ? 0 : 1;\n\t}\n\n\t{\n\t\tbool TestA = glm::areCollinear(glm::vec3(-1), glm::vec3(1), 0.00001f);\n\t\tError += TestA ? 0 : 1;\n\t}\n\n\t{\n\t\tbool TestA = glm::areCollinear(glm::vec4(-1), glm::vec4(1), 0.00001f);\n\t\tError += TestA ? 0 : 1;\n\t}\n\n\treturn Error;\n}\n\nint test_areOrthogonal()\n{\n\tint Error(0);\n\t\n\tbool TestA = glm::areOrthogonal(glm::vec2(1, 0), glm::vec2(0, 1), 0.00001f);\n\tError += TestA ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_isNormalized()\n{\n\tint Error(0);\n\t\n\tbool TestA = glm::isNormalized(glm::vec4(1, 0, 0, 0), 0.00001f);\n\tError += TestA ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_isNull()\n{\n\tint Error(0);\n\t\n\tbool TestA = glm::isNull(glm::vec4(0), 0.00001f);\n\tError += TestA ? 0 : 1;\n\n\treturn Error;\n}\n\nint test_areOrthonormal()\n{\n\tint Error(0);\n\n\tbool TestA = glm::areOrthonormal(glm::vec2(1, 0), glm::vec2(0, 1), 0.00001f);\n\tError += TestA ? 0 : 1;\n\n\treturn Error;\n}\n\nint main()\n{\n\tint Error(0);\n\n\tError += test_areCollinear();\n\tError += test_areOrthogonal();\n\tError += test_isNormalized();\n\tError += test_isNull();\n\tError += test_areOrthonormal();\n\n\treturn Error;\n}\n\n\n"
  },
  {
    "path": "external/glm/test/gtx/gtx_wrap.cpp",
    "content": "#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/wrap.hpp>\n#include <glm/gtc/epsilon.hpp>\n\nnamespace clamp\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tfloat A = glm::clamp(0.5f);\n\t\tError += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat B = glm::clamp(0.0f);\n\t\tError += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat C = glm::clamp(1.0f);\n\t\tError += glm::epsilonEqual(C, 1.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat D = glm::clamp(-0.5f);\n\t\tError += glm::epsilonEqual(D, 0.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat E = glm::clamp(1.5f);\n\t\tError += glm::epsilonEqual(E, 1.0f, 0.00001f) ? 0 : 1;\n\n\t\tglm::vec2 K = glm::clamp(glm::vec2(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(K, glm::vec2(0.5f), glm::vec2(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec3 L = glm::clamp(glm::vec3(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(L, glm::vec3(0.5f), glm::vec3(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec4 M = glm::clamp(glm::vec4(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(M, glm::vec4(0.5f), glm::vec4(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec1 N = glm::clamp(glm::vec1(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(N, glm::vec1(0.5f), glm::vec1(0.00001f))) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace clamp\n\nnamespace repeat\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tfloat A = glm::repeat(0.5f);\n\t\tError += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat B = glm::repeat(0.0f);\n\t\tError += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat C = glm::repeat(1.0f);\n\t\tError += glm::epsilonEqual(C, 0.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat D = glm::repeat(-0.5f);\n\t\tError += glm::epsilonEqual(D, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat E = glm::repeat(1.5f);\n\t\tError += glm::epsilonEqual(E, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat F = glm::repeat(0.9f);\n\t\tError += glm::epsilonEqual(F, 0.9f, 0.00001f) ? 0 : 1;\n\n\t\tglm::vec2 K = glm::repeat(glm::vec2(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(K, glm::vec2(0.5f), glm::vec2(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec3 L = glm::repeat(glm::vec3(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(L, glm::vec3(0.5f), glm::vec3(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec4 M = glm::repeat(glm::vec4(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(M, glm::vec4(0.5f), glm::vec4(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec1 N = glm::repeat(glm::vec1(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(N, glm::vec1(0.5f), glm::vec1(0.00001f))) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace repeat\n\nnamespace mirrorClamp\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tfloat A = glm::mirrorClamp(0.5f);\n\t\tError += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat B = glm::mirrorClamp(0.0f);\n\t\tError += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat C = glm::mirrorClamp(1.1f);\n\t\tError += glm::epsilonEqual(C, 0.1f, 0.00001f) ? 0 : 1;\n\n\t\tfloat D = glm::mirrorClamp(-0.5f);\n\t\tError += glm::epsilonEqual(D, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat E = glm::mirrorClamp(1.5f);\n\t\tError += glm::epsilonEqual(E, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat F = glm::mirrorClamp(0.9f);\n\t\tError += glm::epsilonEqual(F, 0.9f, 0.00001f) ? 0 : 1;\n\n\t\tfloat G = glm::mirrorClamp(3.1f);\n\t\tError += glm::epsilonEqual(G, 0.1f, 0.00001f) ? 0 : 1;\n\n\t\tfloat H = glm::mirrorClamp(-3.1f);\n\t\tError += glm::epsilonEqual(H, 0.1f, 0.00001f) ? 0 : 1;\n\n\t\tfloat I = glm::mirrorClamp(-0.9f);\n\t\tError += glm::epsilonEqual(I, 0.9f, 0.00001f) ? 0 : 1;\n\n\t\tglm::vec2 K = glm::mirrorClamp(glm::vec2(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(K, glm::vec2(0.5f), glm::vec2(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec3 L = glm::mirrorClamp(glm::vec3(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(L, glm::vec3(0.5f), glm::vec3(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec4 M = glm::mirrorClamp(glm::vec4(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(M, glm::vec4(0.5f), glm::vec4(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec1 N = glm::mirrorClamp(glm::vec1(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(N, glm::vec1(0.5f), glm::vec1(0.00001f))) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace mirrorClamp\n\nnamespace mirrorRepeat\n{\n\tint test()\n\t{\n\t\tint Error(0);\n\n\t\tfloat A = glm::mirrorRepeat(0.5f);\n\t\tError += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat B = glm::mirrorRepeat(0.0f);\n\t\tError += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat C = glm::mirrorRepeat(1.0f);\n\t\tError += glm::epsilonEqual(C, 1.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat D = glm::mirrorRepeat(-0.5f);\n\t\tError += glm::epsilonEqual(D, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat E = glm::mirrorRepeat(1.5f);\n\t\tError += glm::epsilonEqual(E, 0.5f, 0.00001f) ? 0 : 1;\n\n\t\tfloat F = glm::mirrorRepeat(0.9f);\n\t\tError += glm::epsilonEqual(F, 0.9f, 0.00001f) ? 0 : 1;\n\n\t\tfloat G = glm::mirrorRepeat(3.0f);\n\t\tError += glm::epsilonEqual(G, 1.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat H = glm::mirrorRepeat(-3.0f);\n\t\tError += glm::epsilonEqual(H, 1.0f, 0.00001f) ? 0 : 1;\n\n\t\tfloat I = glm::mirrorRepeat(-1.0f);\n\t\tError += glm::epsilonEqual(I, 1.0f, 0.00001f) ? 0 : 1;\n\n\t\tglm::vec2 K = glm::mirrorRepeat(glm::vec2(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(K, glm::vec2(0.5f), glm::vec2(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec3 L = glm::mirrorRepeat(glm::vec3(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(L, glm::vec3(0.5f), glm::vec3(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec4 M = glm::mirrorRepeat(glm::vec4(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(M, glm::vec4(0.5f), glm::vec4(0.00001f))) ? 0 : 1;\n\n\t\tglm::vec1 N = glm::mirrorRepeat(glm::vec1(0.5f));\n\t\tError += glm::all(glm::epsilonEqual(N, glm::vec1(0.5f), glm::vec1(0.00001f))) ? 0 : 1;\n\n\t\treturn Error;\n\t}\n}//namespace mirrorRepeat\n\nint main()\n{\n\tint Error(0);\n\n\tError += clamp::test();\n\tError += repeat::test();\n\tError += mirrorClamp::test();\n\tError += mirrorRepeat::test();\n\n\treturn Error;\n}\n"
  },
  {
    "path": "external/glm/util/autoexp.txt",
    "content": "[Visualizer]\n\nglm::detail::tvec2<*>{\n    preview (\n        #(#($c.x,$c.y))\n    )\n    children (\n            #([x]: $c.x,[y]: $c.y)\n    )\n}\n\nglm::detail::tvec3<*>{\n    preview (\n        #($e.x,$e.y,$e.z)\n    )\n    children (\n            #([x]: $e.x,[y]: $e.y,[z]: $e.z)\n    )\n}\n\nglm::detail::tvec4<*>{\n    preview (\n        #($c.x,$c.y,$c.z,$c.w)\n    )\n    children (\n            #([x]: $e.x,[y]: $e.y,[z]: $e.z, #([w]: $e.w))\n    )\n}\n"
  },
  {
    "path": "external/glm/util/conan-package/.gitignore",
    "content": "#Backup files\n*\\~\n*swp\n\n#OSX\nThumbs.db\n.DS_Store\n\n#Emacs buffers\n\\#*\\#\n\\.#*\n\n#Conan\ntest_package/build\nconanfile.pyc\nconaninfo.txt\nconanbuildinfo.txt\nconanbuildinfo.cmake\n!FindGLM.cmake\n"
  },
  {
    "path": "external/glm/util/conan-package/FindGLM.cmake",
    "content": "FIND_PATH(\n  GLM_INCLUDE_DIR\n  NAMES\n  glm\n  PATHS\n  include)\n\nINCLUDE(FindPackageHandleStandardArgs)\n\nFIND_PACKAGE_HANDLE_STANDARD_ARGS(GLM REQUIRED_VARS GLM_INCLUDE_DIR)\n"
  },
  {
    "path": "external/glm/util/conan-package/README.md",
    "content": "Conan package for the [GLM](https://github.com/g-truc/glm) library\n\nThe package is hosted on [bintray](https://bintray.com/conan/conan-center?filterByPkgName=glm%3Ag-truc).\n\nIt works on Windows (Visual Studio or MinGW), MacOS/OSX and Linux.\n"
  },
  {
    "path": "external/glm/util/conan-package/conanfile.py",
    "content": "import os\nfrom conans import ConanFile\n\nclass GlmConan(ConanFile):\n    name = \"glm\"\n    version = \"master\"\n    generators = \"txt\"\n    url=\"https://github.com/g-truc/glm\"\n    description=\"OpenGL Mathematics (GLM)\"\n    license = \"https://github.com/g-truc/glm/blob/manual/copying.txt\"\n    exports_sources = [\"FindGLM.cmake\", os.sep.join([\"..\", \"..\", \"glm*\"])]\n    exports = \"lib_licenses/*\"\n\n    def build(self):\n        self.output.info(\"No compilation necessary for GLM\")\n\n    def package(self):\n        self.copy(\"FindGLM.cmake\", \".\", \".\")\n        self.copy(\"*\", src=\"glm\", dst=os.sep.join([\".\", \"include\", \"glm\"]))\n        self.copy(\"lib_licenses/license*\", dst=\"licenses\",  ignore_case=True, keep_path=False)\n"
  },
  {
    "path": "external/glm/util/conan-package/lib_licenses/LICENSE1.txt",
    "content": "The Happy Bunny License (Modified MIT License)\n\nCopyright (c) 2005 - 2017 G-Truc Creation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nRestrictions: By making use of the Software for military purposes, you choose to make a Bunny unhappy.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "external/glm/util/conan-package/lib_licenses/LICENSE2.txt",
    "content": "The MIT License\n\nCopyright (c) 2005 - 2017 G-Truc Creation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "external/glm/util/conan-package/test_package/CMakeLists.txt",
    "content": "project(GlmTest)\ncmake_minimum_required(VERSION 3.0.0)\ninclude(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)\nconan_basic_setup()\n\nif(MSVC)\n  set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} /EHsc\")\nendif(MSVC)\n\nadd_executable(testGlm main.cpp)\n\n\n"
  },
  {
    "path": "external/glm/util/conan-package/test_package/conanfile.py",
    "content": "from conans import ConanFile, CMake\nimport os\n\nclass TestGlm(ConanFile):\n    settings = \"os\", \"compiler\", \"build_type\", \"arch\"\n    generators = \"cmake\"\n\n    def build(self):\n        cmake = CMake(self)\n        self.run('cmake \"%s\" %s' % (self.conanfile_directory, cmake.command_line))\n        self.run(\"cmake --build . %s\" % cmake.build_config)\n\n    def test(self):\n        self.run(os.sep.join([\".\",\"bin\", \"testGlm\"]))\n\n"
  },
  {
    "path": "external/glm/util/conan-package/test_package/main.cpp",
    "content": "#include \"glm/glm.hpp\"\n\nint main (){\n  glm::mat4x4 aMatrix;\n  return 0;\n}\n"
  },
  {
    "path": "external/glm/util/glm.natvis",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- GLM visualizers for Visual Studio 2012 -->\n<!-- Put them into My Documents/Visual Studio 2012/Visualizers/ -->\n\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\n\t<Type Name=\"glm::tvec1&lt;*&gt;\">\n\t\t<DisplayString>{x}</DisplayString>\n\t\t<Expand>\n\t\t\t<Item Name=\"x\">x</Item>\n\t\t</Expand>\n\t</Type>\n\n\t<Type Name=\"glm::tvec2&lt;*&gt;\">\n\t\t<DisplayString>{x}, {y}</DisplayString>\n\t\t<Expand>\n\t\t\t<Item Name=\"x\">x</Item>\n\t\t\t<Item Name=\"y\">y</Item>\n\t\t</Expand>\n\t</Type>\n\n\t<Type Name=\"glm::tvec3&lt;*&gt;\">\n\t\t<DisplayString>{x}, {y}, {z}</DisplayString>\n\t\t<Expand>\n\t\t\t<Item Name=\"x\">x</Item>\n\t\t\t<Item Name=\"y\">y</Item>\n\t\t\t<Item Name=\"z\">z</Item>\n\t\t</Expand>\n\t</Type>\n\n\t<Type Name=\"glm::tvec4&lt;*&gt;\">\n\t\t<DisplayString>{x}, {y}, {z}, {w}</DisplayString>\n\t\t<Expand>\n\t\t\t<Item Name=\"x\">x</Item>\n\t\t\t<Item Name=\"y\">y</Item>\n\t\t\t<Item Name=\"z\">z</Item>\n\t\t\t<Item Name=\"w\">w</Item>\n\t\t</Expand>\n\t</Type>\n\n\t<!--Type Name=\"glm::tmat4&lt;*&gt;\">\n\t\t<DisplayString>{value[0]}, {value[1]}, {value[2]}, {value[3]}</DisplayString>\n\t\t<Expand>\n\t\t\t<Item Name=\"[0]\">value[0]</Item>\n\t\t\t<Item Name=\"[1]\">value[1]</Item>\n\t\t\t<Item Name=\"[2]\">value[2]</Item>\n\t\t\t<Item Name=\"[3]\">value[3]</Item>\n\t\t</Expand>\n\t</Type-->\n\n\t<Type Name=\"glm::tquat&lt;*&gt;\">\n\t\t<DisplayString>({x}, {y}, {z}), {w}</DisplayString>\n\t\t<Expand>\n\t\t\t<Item Name=\"x\">x</Item>\n\t\t\t<Item Name=\"y\">y</Item>\n\t\t\t<Item Name=\"z\">z</Item>\n\t\t\t<Item Name=\"w\">w</Item>\n\t\t</Expand>\n\t</Type>\n\n\t<Type Name=\"glm::tdualquat&lt;*&gt;\">\n\t\t<DisplayString>(({real.x}, {real.y}, {real.z}), {real.w}), (({dual.x}, {dual.y}, {dual.z}), {dual.w})</DisplayString>\n\t\t<Expand>\n\t\t\t<Item Name=\"real\">real</Item>\n\t\t\t<Item Name=\"dual\">dual</Item>\n\t\t</Expand>\n\t</Type>\n</AutoVisualizer>\n\n"
  },
  {
    "path": "external/imgui/.travis.yml",
    "content": "language: cpp\n\nos:\n  - linux\n  - osx\n\ncompiler:\n  - gcc\n  - clang\n\nbefore_install:\n  - if [ $TRAVIS_OS_NAME == linux ]; then sudo add-apt-repository -y ppa:pyglfw/pyglfw && sudo apt-add-repository --yes ppa:zoogie/sdl2-snapshots && sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends libglfw3-dev libxrandr-dev libxi-dev libxxf86vm-dev libsdl2-dev; fi\n  - if [ $TRAVIS_OS_NAME == osx ]; then brew update && brew install glfw3 && brew install sdl2; fi\n\nscript: \n  - make -C examples/opengl2_example\n  - make -C examples/opengl3_example\n  - make -C examples/sdl_opengl3_example\n"
  },
  {
    "path": "external/imgui/LICENSE.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014-2017 Omar Cornut and ImGui contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "external/imgui/README.md",
    "content": "dear imgui,\n=====\n[![Build Status](https://travis-ci.org/ocornut/imgui.svg?branch=master)](https://travis-ci.org/ocornut/imgui)\n[![Coverity Status](https://scan.coverity.com/projects/4720/badge.svg)](https://scan.coverity.com/projects/4720)\n\n(This library is free but needs your support to sustain its development. There are lots of desirable new features and maintenance to do. If you are an individual using dear imgui, please consider donating via Patreon or PayPal. If your company is using dear imgui, please consider financial support (e.g. sponsoring a few weeks/months of development). I can invoice for private support, custom development etc. E-mail: omarcornut at gmail.)\n\nMonthly donations via Patreon:\n<br>[![Patreon](https://cloud.githubusercontent.com/assets/8225057/5990484/70413560-a9ab-11e4-8942-1a63607c0b00.png)](http://www.patreon.com/imgui)\n\nOne-off donations via PayPal:\n<br>[![PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5Q73FPZ9C526U)\n\nDear ImGui is a bloat-free graphical user interface library for C++. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline enabled application. It is fast, portable, renderer agnostic and self-contained (no external dependencies).\n\nDear ImGui is designed to enable fast iteration and empower programmers to create content creation tools and visualization/ debug tools (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and thus lacks certain features normally found in more high-level libraries.\n\nDear ImGui is particularly suited to integration in realtime 3D applications, fullscreen applications, embedded applications, games, or any applications on consoles platforms where operating system features are non-standard. \n\nDear ImGui is self-contained within a few files that you can easily copy and compile into your application/engine:\n\n  - imgui.cpp\n  - imgui.h\n  - imgui_demo.cpp\n  - imgui_draw.cpp\n  - imgui_internal.h\n  - imconfig.h (empty by default, user-editable)\n  - stb_rect_pack.h\n  - stb_textedit.h\n  - stb_truetype.h\n\nNo specific build process is required. You can add the .cpp files to your project or #include them from an existing file.\n\nYour code passes mouse/keyboard inputs and settings to Dear ImGui (see example applications for more details). After Dear ImGui is setup, you can use it like in this example:\n\n![screenshot of sample code alongside its output with dear imgui](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/code_sample_01.png)\n\nDear ImGui outputs vertex buffers and simple command-lists that you can render in your application. The number of draw calls and state changes is typically very small. Because it doesn't know or touch graphics state directly, you can call ImGui commands anywhere in your code (e.g. in the middle of a running algorithm, or in the middle of your own rendering process). Refer to the sample applications in the examples/ folder for instructions on how to integrate dear imgui with your existing codebase. \n\n_A common misunderstanding is to think that immediate mode gui == immediate mode rendering, which usually implies hammering your driver/GPU with a bunch of inefficient draw calls and state changes, as the gui functions are called by the user. This is NOT what Dear ImGui does. Dear ImGui outputs vertex buffers and a small list of draw calls batches. It never touches your GPU directly. The draw call batches are decently optimal and you can render them later, in your app or even remotely._\n\nDear ImGui allows you create elaborate tools as well as very short-lived ones. On the extreme side of short-liveness: using the Edit&Continue feature of modern compilers you can add a few widgets to tweaks variables while your application is running, and remove the code a minute later! Dear ImGui is not just for tweaking values. You can use it to trace a running algorithm by just emitting text commands. You can use it along with your own reflection data to browse your dataset live. You can use it to expose the internals of a subsystem in your engine, to create a logger, an inspection tool, a profiler, a debugger, an entire game making editor/framework, etc.  \n\nBinaries/Demo\n-------------\n\nYou should be able to build the examples from sources (tested on Windows/Mac/Linux). If you don't, let me know! If you want to have a quick look at some Dear ImGui features, you can download Windows binaries of the demo app here:\n- [imgui-demo-binaries-20171013.zip](http://www.miracleworld.net/imgui/binaries/imgui-demo-binaries-20171013.zip) (Windows binaries, Dear ImGui 1.52 WIP built 2017/10/13, 5 executables)\n\nBindings\n--------\n\nIntegrating Dear ImGui within your custom engine is a matter of wiring mouse/keyboard inputs and providing a render function that can bind a texture and render simple textured triangles. The examples/ folder is populated with applications doing just that. If you are an experienced programmer it should take you less than an hour to integrate Dear ImGui in your custom engine, but make sure to spend time reading the FAQ, the comments and other documentation!\n\n_NB: those third-party bindings may be more or less maintained, more or less close to the spirit of original API and therefore I cannot give much guarantee about them. People who create language bindings sometimes haven't used the C++ API themselves (for the good reason that they aren't C++ users). Dear ImGui was designed with C++ in mind and some of the subtleties may be lost in translation with other languages. If your language supports it, I would suggest replicating the function overloading and default parameters used in the original, else the API may be harder to use. In doubt, please check the original C++ version first!_\n\nLanguages:\n- C (cimgui): https://github.com/Extrawurst/cimgui\n- C#/.Net (ImGui.NET): https://github.com/mellinoe/ImGui.NET\n- ChaiScript: https://github.com/JuJuBoSc/imgui-chaiscript\n- D (DerelictImgui): https://github.com/Extrawurst/DerelictImgui\n- Go (go-imgui): https://github.com/Armored-Dragon/go-imgui\n- Lua: https://github.com/patrickriordan/imgui_lua_bindings\n- Odin: https://github.com/ThisDrunkDane/odin-dear_imgui\n- Pascal (imgui-pas): https://github.com/dpethes/imgui-pas\n- Python (CyImGui): https://github.com/chromy/cyimgui\n- Python (pyimgui): https://github.com/swistakm/pyimgui\n- Rust (imgui-rs): https://github.com/Gekkio/imgui-rs\n\nFrameworks:\n- Main ImGui repository include examples for DirectX9, DirectX10, DirectX11, OpenGL2/3, Vulkan, Allegro 5, SDL+GL2/3, iOS and Marmalade: https://github.com/ocornut/imgui/tree/master/examples\n- Unmerged PR: DirectX12: https://github.com/ocornut/imgui/pull/301\n- Unmerged PR: SDL2 + OpenGLES + Emscripten: https://github.com/ocornut/imgui/pull/336\n- Unmerged PR: FreeGlut + OpenGL2: https://github.com/ocornut/imgui/pull/801\n- Unmerged PR: Native Win32 and OSX: https://github.com/ocornut/imgui/pull/281\n- Unmerged PR: Android: https://github.com/ocornut/imgui/pull/421\n- Cinder: https://github.com/simongeilfus/Cinder-ImGui\n- cocos2d-x: https://github.com/c0i/imguix https://github.com/ocornut/imgui/issues/551\n- Flexium/SFML (FlexGUI): https://github.com/DXsmiley/FlexGUI\n- Irrlicht (IrrIMGUI): https://github.com/ZahlGraf/IrrIMGUI\n- Ogre: https://bitbucket.org/LMCrashy/ogreimgui/src\n- openFrameworks (ofxImGui): https://github.com/jvcleave/ofxImGui\n- OpenSceneGraph/OSG: https://gist.github.com/fulezi/d2442ca7626bf270226014501357042c\n- LÖVE: https://github.com/slages/love-imgui\n- NanoRT (software raytraced) https://github.com/syoyo/imgui/tree/nanort/examples/raytrace_example\n- Qt3d https://github.com/alpqr/imgui-qt3d\n- Unreal Engine 4: https://github.com/segross/UnrealImGui or https://github.com/sronsse/UnrealEngine_ImGui\n- SFML: https://github.com/EliasD/imgui-sfml or https://github.com/Mischa-Alff/imgui-backends\n\nFor other bindings: see [this page](https://github.com/ocornut/imgui/wiki/Links/).\nPlease contact me with the Issues tracker or Twitter to fix/update this list.\n\nGallery\n-------\n\nSee the [Screenshots Thread](https://github.com/ocornut/imgui/issues/123) for some user creations.\nAlso see the [Mega screenshots](https://github.com/ocornut/imgui/issues/1273) for an idea of the available features.\n\n![screenshot 1](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v148/examples_01.png)\n[![screenshot game](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v149/gallery_TheDragonsTrap-01-thumb.jpg)](https://cloud.githubusercontent.com/assets/8225057/20628927/33e14cac-b329-11e6-80f6-9524e93b048a.png)\n![screenshot 2](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v148/examples_02.png)\n\n[![screenshot profiler](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v148/profiler-880.jpg)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v148/profiler.png)\n\n![screenshot picker](https://user-images.githubusercontent.com/8225057/29062188-471e95ba-7c53-11e7-9618-c4484c0b75fe.PNG)\n\n![screenshot 5](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v151/menus.png)\n![screenshot 6](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v143/skinning_sample_02.png)\n![screenshot 7](https://cloud.githubusercontent.com/assets/8225057/7903336/96f0fb7c-07d0-11e5-95d6-41c6a1595e5a.png)\n\nDear ImGui can load TTF/OTF fonts. UTF-8 is supported for text display and input. Here using Arial Unicode font to display Japanese. Initialize custom font with:\n```\nImGuiIO& io = ImGui::GetIO();\nio.Fonts->AddFontFromFileTTF(\"ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n\n// For Microsoft IME, pass your HWND to enable IME positioning:\nio.ImeWindowHandle = my_hwnd;\n```\n![Japanese screenshot](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/code_sample_01_jp.png)\n\nReferences\n----------\n\nThe Immediate Mode GUI paradigm may at first appear unusual to some users. This is mainly because \"Retained Mode\" GUIs have been so widespread and predominant. The following links can give you a better understanding about how Immediate Mode GUIs works. \n- [Johannes 'johno' Norneby's article](http://www.johno.se/book/imgui.html).\n- [A presentation by Rickard Gustafsson and Johannes Algelind](http://www.cse.chalmers.se/edu/year/2011/course/TDA361/Advanced%20Computer%20Graphics/IMGUI.pdf).\n- [Jari Komppa's tutorial on building an ImGui library](http://iki.fi/sol/imgui/).\n- [Casey Muratori's original video that popularized the concept](https://mollyrocket.com/861).\n- [Nicolas Guillemot's CppCon'16 flashtalk about Dear ImGui](https://www.youtube.com/watch?v=LSRJ1jZq90k).\n- [Thierry Excoffier's Zero Memory Widget](http://perso.univ-lyon1.fr/thierry.excoffier/ZMW/).\n\nSee the [Software using dear imgui page](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) for an incomplete list of software which are publicly known to use dear migui.\n\nSee the [Links page](https://github.com/ocornut/imgui/wiki/Links) for third-party bindings to different languages and frameworks.\n\nFrequently Asked Question (FAQ)\n-------------------------------\n\n<b>Where is the documentation?</b>\n\n- The documentation is at the top of imgui.cpp + effectively imgui.h. \n- Example code is in imgui_demo.cpp and particularly the ImGui::ShowTestWindow() function. It covers most features of ImGui so you can read the code and call the function itself to see its output. \n- Standalone example applications using e.g. OpenGL/DirectX are provided in the examples/ folder. \n- We obviously needs better documentation! Consider contributing or becoming a [Patron](http://www.patreon.com/imgui) to promote this effort.\n\n<b>Which version should I get?</b>\n\nI occasionally tag [Releases](https://github.com/ocornut/imgui/releases) but it is generally safe and recommended to sync to master. The library is fairly stable and regressions tend to be fixed fast when reported. You may also want to checkout the [navigation branch](https://github.com/ocornut/imgui/tree/navigation) if you want to use Dear ImGui with a gamepad (it is also possible to map keyboard inputs to some degree). The Navigation branch is being kept up to date with Master.\n\n<b>Why the odd dual naming, \"dear imgui\" vs \"ImGui\"?</b>\n\nThe library started its life and is best known as \"ImGui\" only due to the fact that I didn't give it a proper name when I released it. However, the term IMGUI (immediate-mode graphical user interface) was coined before and is being used in variety of other situations. It seemed confusing and unfair to hog the name. To reduce the ambiguity without affecting existing codebases, I have decided on an alternate, longer name \"dear imgui\" that people can use to refer to this specific library in ambiguous situations.\n\n<b>What is ImTextureID and how do I display an image?</b>\n<br><b>I integrated Dear ImGui in my engine and the text or lines are blurry..</b>\n<br><b>I integrated Dear ImGui in my engine and some elements are disappearing when I move windows around..</b>\n<br><b>How can I have multiple widgets with the same label? Can I have widget without a label? (Yes). A primer on labels/IDs.</b>\n<br><b>How can I tell when Dear ImGui wants my mouse/keyboard inputs VS when I can pass them to my application?</b>\n<br><b>How can I load a different font than the default?</b>\n<br><b>How can I easily use icons in my application?</b>\n<br><b>How can I load multiple fonts?</b>\n<br><b>How can I display and input non-latin characters such as Chinese, Japanese, Korean, Cyrillic?</b>\n<br><b>How can I preserve my Dear ImGui context across reloading a DLL? (loss of the global/static variables)</b>\n<br><b>How can I use the drawing facilities without an Dear ImGui window? (using ImDrawList API)</b>\n\nSee the FAQ in imgui.cpp for answers.\n\n<b>How do you use Dear ImGui on a platform that may not have a mouse or keyboard?</b>\n\nI recommend using [Synergy](http://synergy-project.org) ([sources](https://github.com/symless/synergy)). In particular, the _src/micro/uSynergy.c_ file contains a small client that you can use on any platform to connect to your host PC. You can seamlessly use your PC input devices from a video game console or a tablet. Dear ImGui allows to increase the hit box of widgets (via the _style.TouchPadding_ setting) to accommodate a little for the lack of precision of touch inputs, but it is recommended you use a mouse to allow optimising for screen real-estate. You can also checkout the beta [navigation branch](https://github.com/ocornut/imgui/tree/navigation) which provides support for using Dear ImGui with a game controller.\n\n<b>Can you create elaborate/serious tools with Dear ImGui?</b>\n\nYes. People have written game editors, data browsers, debuggers, profilers and all sort of non-trivial tools with the library. In my experience the simplicity of the API is very empowering. Your UI runs close to your live data. Make the tools always-on and everybody in the team will be inclined to create new tools (as opposed to more \"offline\" UI toolkits where only a fraction of your team effectively creates tools).\n\nDear ImGui is very programmer centric and the immediate-mode GUI paradigm might requires you to readjust some habits before you can realize its full potential. Dear ImGui is about making things that are simple, efficient and powerful.\n\n<b>Is Dear ImGui fast?</b>\n\nProbably fast enough for most uses. Down to the foundation of its visual design, Dear ImGui is engineered to be fairly performant both in term of CPU and GPU usage. Running elaborate code and creating elaborate UI will of course have a cost but Dear ImGui aims to minimize it.\n\nMileage may vary but the following screenshot can give you a rough idea of the cost of running and rendering UI code (In the case of a trivial demo application like this one, your driver/os setup are likely to be the bottleneck. Testing performance as part of a real application is recommended).\n\n![performance screenshot](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v138/performance_01.png)\n\nThis is showing framerate for the full application loop on my 2011 iMac running Windows 7, OpenGL, AMD Radeon HD 6700M with an optimized executable. In contrast, librairies featuring higher-quality rendering and layouting techniques may have a higher resources footprint.\n\nIf you intend to display large lists of items (say, 1000+) it can be beneficial for your code to perform clipping manually - one way is using helpers such as ImGuiListClipper - in order to avoid submitting them to Dear ImGui in the first place. Even though ImGui will discard your clipped items it still needs to calculate their size and that overhead will add up if you have thousands of items. If you can handle clipping and height positionning yourself then browsing a list with millions of items isn't a problem.\n\n<b>Can you reskin the look of Dear ImGui?</b>\n\nYou can alter the look of the interface to some degree: changing colors, sizes, padding, rounding, fonts. However, as Dear ImGui is designed and optimised to create debug tools, the amount of skinning you can apply is limited. There is only so much you can stray away from the default look and feel of the interface. Below is a screenshot from [LumixEngine](https://github.com/nem0/LumixEngine) with custom colors + a docking/tabs extension (both of which you can find in the Issues section and will eventually be merged):\n\n![LumixEngine](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v151/lumix-201710-rearranged.png)\n\n<b>Why using C++ (as opposed to C)?</b>\n\nDear ImGui takes advantage of a few C++ languages features for convenience but nothing anywhere Boost-insanity/quagmire. Dear ImGui does NOT require C++11 so it can be used with most old C++ compilers. Dear ImGui doesn't use any C++ header file. Language-wise, function overloading and default parameters are used to make the API easier to use and code more terse. Doing so I believe the API is sitting on a sweet spot and giving up on those features would make the API more cumbersome. Other features such as namespace, constructors and templates (in the case of the ImVector<> class) are also relied on as a convenience.\n\nThere is an reasonably maintained [c-api for ImGui](https://github.com/Extrawurst/cimgui) by Stephan Dilly designed for binding in other languages. I would suggest using your target language functionalities to try replicating the function overloading and default parameters used in C++ else the API may be harder to use. Also see [Links](https://github.com/ocornut/imgui/wiki/Links) for third-party bindings to other languages.\n\nSupport dear imgui\n------------------\n\n<b>How can I help financing further development of Dear ImGui?</b>\n\nYour contributions are keeping the library alive. If you are an individual using dear imgui, please consider donating to enable me to spend more time improving the library.\n\nMonthly donations via Patreon:\n<br>[![Patreon](https://cloud.githubusercontent.com/assets/8225057/5990484/70413560-a9ab-11e4-8942-1a63607c0b00.png)](http://www.patreon.com/imgui)\n\nOne-off donations via PayPal:\n<br>[![PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5Q73FPZ9C526U)\n\nIf your company uses dear imgui, please consider financial support (e.g. sponsoring a few weeks/months of development). I can invoice for private support, custom development etc. E-mail: omarcornut at gmail. Thanks!\n\nCredits\n-------\n\nDeveloped by [Omar Cornut](http://www.miracleworld.net) and every direct or indirect contributors to the GitHub. The early version of this library was developed with the support of [Media Molecule](http://www.mediamolecule.com) and first used internally on the game [Tearaway](http://tearaway.mediamolecule.com). \n\nI first discovered imgui principles at [Q-Games](http://www.q-games.com) where Atman had dropped his own simple imgui implementation in the codebase, which I spent quite some time improving and thinking about. It turned out that Atman was exposed to the concept directly by working with Casey. When I moved to Media Molecule I rewrote a new library trying to overcome the flaws and limitations of the first one I've worked with. It became this library and since then I have spent an unreasonable amount of time iterating on it. \n\nEmbeds [ProggyClean.ttf](http://upperbounds.net) font by Tristan Grimmer (MIT license).\n\nEmbeds [stb_textedit.h, stb_truetype.h, stb_rectpack.h](https://github.com/nothings/stb/) by Sean Barrett (public domain).\n\nInspiration, feedback, and testing for early versions: Casey Muratori, Atman Binstock, Mikko Mononen, Emmanuel Briney, Stefan Kamoda, Anton Mikhailov, Matt Willis. And everybody posting feedback, questions and patches on the GitHub.\n\nOngoing dear imgui development is financially supported on [**Patreon**](http://www.patreon.com/imgui).\n\nDouble-chocolate sponsors:\n- Media Molecule\n- Mobigame\n- Insomniac Games (sponsored the gamepad/keyboard navigation branch)\n- Aras Pranckevičius\n- Lizardcube\n- Greggman\n\nSalty caramel supporters:\n- Jetha Chan, Wild Sheep Studio, Pastagames, Mārtiņš Možeiko, Daniel Collin, Recognition Robotics, Chris Genova, ikrima, Glenn Fiedler, Geoffrey Evans, Dakko Dakko, Mercury Labs, Singularity Demo Group, Mischa Alff, Sebastien Ronsse.\n\nCaramel supporters:\n- Michel Courtine, César Leblic, Dale Kim, Alex Evans, Rui Figueira, Paul Patrashcu, Jerome Lanquetot, Ctrl Alt Ninja, Paul Fleming, Neil Henning, Stephan Dilly, Neil Blakey-Milner, Aleksei, NeiloGD, Justin Paver, FiniteSol, Vincent Pancaldi, James Billot, Robin Hübner, furrtek, Eric, Simon Barratt, Game Atelier, Julian Bosch, Simon Lundmark, Vincent Hamm, Farhan Wali, Jeff Roberts, Matt Reyer, Colin Riley, Victor Martins, Josh Simmons, Garrett Hoofman, Sergio Gonzales, Andrew Berridge, Roy Eltham, Game Preservation Society, Kit framework, Josh Faust, Martin Donlon, Quinton, Felix, Andrew Belt, Codecat, Cort Stratton, Claudio Canepa, Doug McNabb, Emmanuel Julien, Guillaume Chereau, Jeffrey Slutter, Jeremiah Deckard, r-lyeh, Roger Clark, Nekith, Joshua Fisher, Malte Hoffmann, Mustafa Karaalioglu, Merlyn Morgan-Graham, Per Vognsen, Fabian Giesen, Jan Staubach, Matt Hargett, John Shearer, Jesse Chounard, kingcoopa, Miloš Tošić.\n\nAnd other supporters; thanks!\n(Please contact me or PR if you would like to be added or removed from this list)\n\nLicense\n-------\n\nDear ImGui is licensed under the MIT License, see LICENSE for more information.\n"
  },
  {
    "path": "external/imgui/TODO.txt",
    "content": "dear imgui\nISSUES & TODO LIST\n\nIssue numbers (#) refer to github issues listed at https://github.com/ocornut/imgui/issues/XXXX\nThe list below consist mostly of ideas noted down before they are requested/discussed by users (at which point they usually exist on the github issue tracker).\nIt's mostly a bunch of personal notes, probably incomplete. Feel free to query if you have any questions.\n\n - doc/test: add a proper documentation+regression testing system (#435)\n - doc/test: checklist app to verify binding/integration of imgui (test inputs, rendering, callback, etc.).\n - doc/tips: tips of the day: website? applet in imgui_club?\n - project: folder or separate repository with maintained helpers (e.g. imgui_memory_editor.h, imgui_stl.h, maybe imgui_dock would be there?)\n\n - window: calling SetNextWindowSize() every frame with <= 0 doesn't do anything, may be useful to allow (particularly when used for a single axis). (#690)\n - window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to \"clean\" up from the global window list. perhaps a lightweight explicit cleanup pass.\n - window: auto-fit feedback loop when user relies on any dynamic layout (window width multiplier, column) appears weird to end-user. clarify.\n - window: allow resizing of child windows (possibly given min/max for each axis?.)\n - window: background options for child windows, border option (disable rounding).\n - window: resizing from any sides? + mouse cursor directives for app. (#822)\n!- window: begin with *p_open == false should return false.\n - window: get size/pos helpers given names (see discussion in #249)\n - window: a collapsed window can be stuck behind the main menu bar?\n - window: when window is very small, prioritize resize button over close button.\n - window: detect extra End() call that pop the \"Debug\" window out and assert at End() call site instead of at end of frame.\n - window: increase minimum size of a window with menus or fix the menu rendering so that it doesn't look odd.\n - window: double-clicking on title bar to minimize isn't consistent, perhaps move to single-click on left-most collapse icon?\n - window: expose contents size. (#1045)\n - window: resize from borders and/or all corners. (#822)\n - window: GetWindowSize() returns (0,0) when not calculated? (#1045)\n - window: refactor IsWindowFocused(), merge all three existing variants, add flags, similar to #1382.\n - window: freeze window flag: if not focused/hovered, return false, render with previous ImDrawList. and/or reduce refresh rate. \n!- scrolling: allow immediately effective change of scroll after Begin() if we haven't appended items yet.\n - scrolling/clipping: separator on the initial position of a window is not visible (cursorpos.y <= clippos.y). (2017-08-20: can't repro)\n\n - drawlist: move Font, FontSize, FontTexUvWhitePixel inside ImDrawList and make it self-contained (apart from drawing settings?)\n - drawlist: make it easier to toggle AA per primitive, so we can use e.g. non-AA fill + AA borders more naturally\n - drawlist: end-user probably can't call Clear() directly because we expect a texture to be pushed in the stack.\n - drawlist: maintaining bounding box per command would allow to merge draw command when clipping isn't relied on (typical non-scrolling window or non-overflowing column would merge with previous command).\n - drawlist: avoid passing null (-9999,+9999) rectangle to end-user, instead perhaps pass rectangle based on io.DisplaySize?\n - drawlist: primtiives/helpers to manipulate vertices post submission, so e.g. a quad/rect can be resized to fit later submitted content, _without_ using the ChannelSplit api\n - drawlist: non-AA strokes have gaps between points (#593, #288), especially RenderCheckmark().\n \n - main: considering adding an Init() function? some constructs are awkward in the implementation because of the lack of them.\n - main: find a way to preserve relative orders of multiple reappearing windows (so an app toggling between \"modes\" e.g. fullscreen vs all tools) won't lose relative ordering.\n - main: IsItemHovered() make it more consistent for various type of widgets, widgets with multiple components, etc. also effectively IsHovered() region sometimes differs from hot region, e.g tree nodes\n - main: IsItemHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode?\n - main: rename the main \"Debug\" window to avoid ID collision with user who may want to use \"Debug\" with specific flags.\n\n - widgets: display mode: widget-label, label-widget (aligned on column or using fixed size), label-newline-tab-widget etc. (#395)\n - widgets: clean up widgets internal toward exposing everything and stabilizing imgui_internals.h.\n - widgets: add disabled and read-only modes (#211)\n - widgets: add always-allow-overlap mode.\n - widgets: alignment options in style (e.g. center Selectable, Right-Align within Button, etc.) #1260\n - widgets: activate by identifier (trigger button, focus given id)\n\n - input text: clean up the mess caused by converting UTF-8 <> wchar. the code is rather inefficient right now and super fragile. \n - input text: reorganize event handling, allow CharFilter to modify buffers, allow multiple events? (#541)\n - input text: expose CursorPos in char filter event (#816)\n - input text: access public fields via a non-callback API e.g. InputTextGetState(\"xxx\") that may return NULL if not active.\n - input text: flag to disable live update of the user buffer (also applies to float/int text input) (#701)\n - input text: way to dynamically grow the buffer without forcing the user to initially allocate for worse case, e.g. more natural std::string (follow up on #200)\n - input text: hover tooltip could show unclamped text\n - input text: option to Tab after an Enter validation.\n - input text: add ImGuiInputTextFlags_EnterToApply? (off #218)\n - input text: easier ways to update buffer (from source char*) while owned. preserve some sort of cursor position for multi-line text.\n - input text: add discard flag (e.g. ImGuiInputTextFlags_DiscardActiveBuffer) or make it easier to clear active focus for text replacement during edition (#725)\n - input text: display bug when clicking a drag/slider after an input text in a different window has all-selected text (order dependant). actually a very old bug but no one appears to have noticed it.\n - input text multi-line: don't directly call AddText() which does an unnecessary vertex reserve for character count prior to clipping. and/or more line-based clipping to AddText(). and/or reorganize TextUnformatted/RenderText for more efficiency for large text (e.g TextUnformatted could clip and log separately, etc).\n - input text multi-line: line numbers? status bar? (follow up on #200)\n - input text multi-line: behave better when user changes input buffer while editing is active (even though it is illegal behavior). namely, the change of buffer can create a scrollbar glitch (#725)\n - input text multi-line: better horizontal scrolling support (#383, #1224)\n - input text: allow centering/positioning text so that ctrl+clicking Drag or Slider keeps the textual value at the same pixel position.\n - input number: optional range min/max for Input*() functions\n - input number: holding [-]/[+] buttons could increase the step speed non-linearly (or user-controlled)\n - input number: use mouse wheel to step up/down\n - input number: applying arithmetics ops (+,-,*,/) messes up with text edit undo stack.\n\n - layout: helper or a way to express ImGui::SameLine(ImGui::GetCursorStartPos().x + ImGui::CalcItemWidth() + ImGui::GetStyle().ItemInnerSpacing.x); in a simpler manner.\n - layout: generalization of the above: a concept equivalent to word processor ruler tab stop ~ mini columns (position in X, no clipping implied) (vaguely relate to #267, #395, also what is used internally for menu items)\n - layout: horizontal layout helper (#97)\n - layout: horizontal flow until no space left (#404)\n - layout: more generic alignment state (left/right/centered) for single items?\n - layout: clean up the InputFloatN/SliderFloatN/ColorEdit4 layout code. item width should include frame padding.\n - layout: BeginGroup() needs a border option.\n - layout: vertical alignement of mixed height items (e.g. buttons) within a same line (#1284)\n \n - columns: sizing policy (e.g. for each column: fixed size, %, fill, distribute default size among fills) (#513, #125)\n - columns: add a conditional parameter to SetColumnOffset() (#513, #125)\n - columns: headers. reorderable. (#513, #125)\n - columns: optional sorting modifiers (up/down), sort list so sorting can be done multi-critera. notify user when sort order changed.\n - columns: option to alternate background colors on odd/even scanlines.  \n - columns: allow columns to recurse. \n - columns: allow a same columns set to be interrupted by e.g. CollapsingHeader and resume with columns in sync when moving them. \n - columns: separator function or parameter that works within the column (currently Separator() bypass all columns) (#125)\n - columns: flag to add horizontal separator above/below?\n - columns/layout: setup minimum line height (equivalent of automatically calling AlignFirstTextHeightToWidgets)\n\n!- color: the color conversion helpers/types are a mess and needs sorting out. \n - color: (api breaking) ImGui::ColorConvertXXX functions should be loose ImColorConvertXX to match imgui_internals.h\n - coloredit: it is still somehow awkward to copy colors around (unless going through Hex mode).\n\n - plot: full featured plot/graph api w/ scrolling, zooming etc. all bell & whistle. why not!\n - plot: PlotLines() should use the polygon-stroke facilities, less verticles (currently issues with averaging normals)\n - plot: make it easier for user to draw extra stuff into the graph (e.g: draw basis, highlight certain points, 2d plots, multiple plots)\n - plot: \"smooth\" automatic scale over time, user give an input 0.0(full user scale) 1.0(full derived from value)\n - plot: option/feature: draw the zero line\n - plot: option/feature: draw grid, vertical markers\n - plot: option/feature: draw unit\n - plot: add a helper e.g. Plot(char* label, float value, float time_span=2.0f) that stores values and Plot them for you - probably another function name. and/or automatically allow to plot ANY displayed value (more reliance on stable ID)\n\n - clipper: ability to force display 1 item in the list would be convenient (for patterns where we need to set active id etc.)\n - clipper: ability to disable the clipping through a simple flag/bool.\n - clipper: ability to run without knowing full count in advance.\n\n - splitter/separator: formalize the splitter idiom into an official api (we want to handle n-way split) (#319)\n \n - dock: docking extension\n - dock: dock out from a collapsing header? would work nicely but need emitting window to keep submitting the code.\n\n - tabs: re-ordering, close buttons, context menu, persistent order (#261, #351)\n\n - ext: stl-ish friendly extension (imgui_stl.h) that has wrapped for std::string, std::vector etc.\n\n - button: provide a button that looks framed.\n - image/image button: misalignment on padded/bordered button?\n - image/image button: parameters are confusing, image() has tint_col,border_col whereas imagebutton() has bg_col/tint_col. Even thou they are different parameters ordering could be more consistent. can we fix that?\n - image button: not taking an explicit id is odd.\n - slider: allow using the [-]/[+] buttons used by InputFloat()/InputInt()\n - slider: initial absolute click is imprecise. change to relative movement slider (same as scrollbar).\n - slider: add dragging-based widgets to edit values with mouse (on 2 axises), saving screen real-estate.\n - slider: tint background based on value (e.g. v_min -> v_max, or use 0.0f either side of the sign)\n - slider: precision dragging\n - slider: step option (#1183)\n - knob: rotating knob widget (#942)\n - slider & drag: int data passing through a float\n - drag float: up/down axis\n - drag float: added leeway on edge (e.g. a few invisible steps past the clamp limits)\n\n - combo: sparse combo boxes (via function call?) / iterators\n - combo: active item type could be anything else e.g. void*\n - combo: use clipper\n - combo: contents should extends to fit label if combo widget is small\n - combo: option for ComboEx to not return true when unchanged (#1182)\n - combo/listbox: keyboard control. need InputText-like non-active focus + key handling. considering keyboard for custom listbox (pr #203)\n - listbox: multiple selection.\n - listbox: unselect option (#1208)\n - listbox: make it easier/more natural to implement range-select (need some sort of info/ref about the last clicked/focused item that user can translate to an index?)\n - listbox: user may want to initial scroll to focus on the one selected value?\n - listbox: expose hovered item for a basic ListBox\n - listbox: keyboard navigation.\n - listbox: scrolling should track modified selection.\n\n!- popups/menus: clarify usage of popups id, how MenuItem/Selectable closing parent popups affects the ID, etc. this is quite fishy needs improvement! (#331, #402)\n - popups: reopening context menu at new position should be the behavior by default? (equivalent to internal OpenPopupEx() with reopen_existing=true)\n - popups: if the popup functions took explicit ImGuiID it would allow the user to manage the scope of those ID. (#331)\n - popups: clicking outside (to close popup) and holding shouldn't drag window below.\n - popups: add variant using global identifier similar to Begin/End (#402)\n - popups: border options. richer api like BeginChild() perhaps? (#197)\n - tooltip: tooltip that doesn't fit in entire screen seems to lose their \"last preferred direction\" and may teleport when moving mouse.\n - tooltip: allow to set the width of a tooltip to allow TextWrapped() etc. while keeping the height automatic.\n - tooltip: allow tooltips with timers? or general timer policy? (instaneous vs timed)\n \n - menus: calling BeginMenu() twice with a same name doesn't append as Begin() does for regular windows (#1207)\n - statusbar: add a per-window status bar helper similar to what menubar does.\n - shortcuts: local-style shortcut api, e.g. parse \"&Save\"\n - shortcuts,menus: global-style shortcut api e.g. \"Save (CTRL+S)\" -> explicit flag for recursing into closed menu\n - shortcuts: programmatically access shortcuts \"Focus(\"&Save\"))\n - menus: menubars: main menu-bar could affect clamping of windows position (~ akin to modifying DisplayMin)\n\n - text: selectable text (for copy) as a generic feature (ItemFlags?)\n - text: proper alignment options in imgui_internal.h\n - text wrapped: figure out better way to use TextWrapped() in an always auto-resize context (tooltip, etc.) (#249)\n - text: it's currently impossible to have a window title with \"##\". perhaps an official workaround would be nice. \\ style inhibitor? non-visible ascii code to insert between #?\n - text link/url button: underlined. should api expose an ID or use text contents as ID? which colors enum to use?\n\n - tree node / optimization: avoid formatting when clipped.\n - tree node: tree-node/header right-most side doesn't take account of horizontal scrolling.\n - tree node: add treenode/treepush int variants? not there because (void*) cast from int warns on some platforms/settings?\n - tree node: try to apply scrolling at time of TreePop() if node was just opened and end of node is past scrolling limits?\n - tree node / selectable render mismatch which is visible if you use them both next to each other (e.g. cf. property viewer)\n - tree node: tweak color scheme to distinguish headers from selected tree node (#581)\n\n!- settings: expose enough to save/load .ini from RAM instead of fopen\n - settings: write more decent code to allow saving/loading new fields: columns, selected tree nodes?\n - settings: api for per-tool simple persistent data (bool,int,float,columns sizes,etc.) in .ini file (#437)\n - stb: add defines to disable stb implementations\n\n!- style: better default styles.\n!- style: move border to style structure, remove _ShowBorder flag.\n - style: border types: out-screen, in-screen, etc. (#447)\n - style/optimization: store rounded corners in texture to use 1 quad per corner (filled and wireframe) to lower the cost of rounding.\n - style: add window shadow (fading away from the window. Paint-style calculation of vertices alpha after drawlist would be easier)\n - style: color-box not always square?\n - style: a concept of \"compact style\" that the end-user can easily rely on (e.g. PushStyleCompact()?) that maps to other settings? avoid implementing duplicate helpers such as SmallCheckbox(), etc.\n - style: try to make PushStyleVar() more robust to incorrect parameters (to be more friendly to edit & continues situation).\n - style: global scale setting.\n - style: WindowPadding needs to be EVEN as the 0.5 multiplier used on this value probably have a subtle effect on clip rectangle\n - style: have a more global HSV setter (e.g. alter hue on all elements). consider replacing active/hovered by offset in HSV space? (#438, #707, #1223)\n - style: gradients fill (#1223) ~ 2 bg colors for each fill? tricky with rounded shapes and using textures for corners.\n - style editor: color child window height expressed in multiple of line height.\n\n - log: LogButtons() options for specifying depth and/or hiding depth slider\n - log: have more control over the log scope (e.g. stop logging when leaving current tree node scope)\n - log: be able to log anything (e.g. right-click on a window/tree-node, shows context menu? log into tty/file/clipboard)\n - log: let user copy any window content to clipboard easily (CTRL+C on windows? while moving it? context menu?). code is commented because it fails with multiple Begin/End pairs.\n\n - filters: set a current filter that tree node can automatically query to hide themselves\n - filters: handle wildcards (with implicit leading/trailing *), regexps\n - filters: fuzzy matches (may use code at blog.forrestthewoods.com/4cffeed33fdb)\n\n - drag'n drop, dragging helpers, demo (carry dragging info, visualize drag source before clicking, drop target, etc.) (#143, #479)\n - node/graph editor (#306)\n - pie menus patterns (#434)\n - markup: simple markup language for color change?\n\n - font: free the Alpha buffer if user only requested RGBA.\n!- font: better CalcTextSizeA() API, at least for simple use cases. current one is horrible (perhaps have simple vs extended versions).\n - font: better vertical centering (based e.g on height of lowercase 'x'?). currently Roboto-Medium size 16 px isn't currently centered.\n - font: enforce monospace through ImFontConfig (for icons?) + create dual ImFont output from same input, reusing rasterized data but with different glyphs/AdvanceX\n - font: finish CustomRectRegister() to allow mapping unicode codepoint to custom texture data \n - font: PushFontSize API (#1018)\n - font/atlas: incremental updates\n - font/atlas: dynamic font atlas to avoid baking huge ranges into bitmap and make scaling easier.\n - font/atlas: allow user to submit its own primitive to be rectpacked, and allow to map them on a Unicode point.\n - font: MemoryTTF taking ownership confusing/not obvious, maybe default should be opposite?\n - font/text: vertical and/or rotated text renderer (#705) - vertical is easier clipping wise\n - font: imgui_freetype.h alternative renderer (#618)\n - font: optimization: for monospace font (like the default one) we can trim IndexXAdvance as long as trailing value is == FallbackXAdvance (need to make sure TAB is still correct).\n - font: add support for kerning, probably optional. A) perhaps default to (32..128)^2 matrix ~ 9K entries = 36KB, then hash for non-ascii?. B) or sparse lookup into per-char list?\n - font: add a simpler CalcTextSizeA() api? current one ok but not welcome if user needs to call it directly (without going through ImGui::CalcTextSize)\n - font: fix AddRemapChar() to work before font has been built.\n - font: (api breaking) removed \"TTF\" from symbol names. also because it now supports OTF.\n\n!- nav/keyboard: tooltip & combo boxes are messing up / not honoring keyboard tabbing.\n - nav: integrate navigation branch into master. (#787)\n - nav: integrate/design keyboard controls. \n - nav: once tab should go through most/all widgets (in submission order?)\n - nav: currently cannot access menubar of a child window with Alt/menu key. \n - nav: esc/enter default behavior for popups, e.g. be able to mark an \"ok\" or \"cancel\" button that would get triggered by those keys.\n - focus: preserve ActiveId/focus stack state, e.g. when opening a menu and close it, previously selected InputText() focus gets restored (#622)\n - focus: SetKeyboardFocusHere() on with >= 0 offset could be done on same frame (else latch and modulate on beginning of next frame)\n - focus: unable to use SetKeyboardFocusHere() on clipped widgets. (#787)\n - inputs: rework IO system to be able to pass actual ordered/timestamped events. use an event queue? (~#335, #71)\n - inputs: allow to pass explicit double-clicks if that's the only thing the user's backend can get them. (e.g. for windows by the CS_DBLCLKS style).\n - inputs: support track pad style scrolling & slider edit.\n\n - misc: idle refresh: expose cursor blink animation timer for backend to be able to lower framerate.\n - misc: make the ImGuiCond values linear (non-power-of-two). internal storage for ImGuiWindow can use integers to combine into flags (Why?)\n - misc: provide a way to compile out the entire implementation while providing a dummy API (e.g. #define IMGUI_DUMMY_IMPL)\n - misc: provide HoveredTime and ActivatedTime to ease the creation of animations.\n - misc: fix for compilation settings where stdcall isn't the default (e.g. vectorcall) (#1230)\n - misc: detect user not calling Render() and suggest to call EndFrame()?\n - remote: make a system like RemoteImGui first-class citizen/project (#75)\n\n - demo: add vertical separator demo\n - demo: add a virtual scrolling example?\n - examples: directx9: save/restore device state more thoroughly.\n - examples: window minimize, maximize (#583)\n - examples: provide a zero-framerate/idle example.\n - examples: document WantCaptureKeyboard, WantCaptureMouse in example apps. (#446)\n - examples: glfw: could go idle when minimized? if (glfwGetWindowAttrib(window, GLFW_ICONIFIED)) { glfwWaitEvents(); continue; } // the problem is that DeltaTime will be super high on resume, perhaps provide a way to let impl know (#440)\n - optimization: replace vsnprintf with stb_printf? or enable the defines/infrastructure to allow it (#1038)\n - optimization: add clipping for multi-component widgets (SliderFloatX, ColorEditX, etc.). one problem is that nav branch can't easily clip parent group when there is a move request.\n - optimization: add a flag to disable most of rendering, for the case where the user expect to skip it (#335)\n - optimization: use another hash function than crc32, e.g. FNV1a\n - optimization/render: merge command-lists with same clip-rect into one even if they aren't sequential? (as long as in-between clip rectangle don't overlap)?\n - optimization: turn some the various stack vectors into statically-sized arrays\n"
  },
  {
    "path": "external/imgui/examples/.gitignore",
    "content": "## Visual Studio files\nDebug/*\nRelease/*\nipch/*\nx64/*\ndirectx9_example/Debug/*\ndirectx9_example/Release/*\ndirectx9_example/ipch/*\ndirectx9_example/x64/*\ndirectx10_example/Debug/*\ndirectx10_example/Release/*\ndirectx10_example/ipch/*\ndirectx10_example/x64/*\ndirectx11_example/Debug/*\ndirectx11_example/Release/*\ndirectx11_example/ipch/*\ndirectx11_example/x64/*\nopengl2_example/Debug/*\nopengl2_example/Release/*\nopengl2_example/ipch/*\nopengl2_example/x64/*\nopengl2_example/opengl_example\nopengl3_example/Debug/*\nopengl3_example/Release/*\nopengl3_example/ipch/*\nopengl3_example/x64/*\nopengl3_example/opengl3_example\nsdl_opengl2_example/Debug/*\nsdl_opengl2_example/Release/*\nsdl_opengl2_example/ipch/*\nsdl_opengl2_example/x64/*\nsdl_opengl3_example/Debug/*\nsdl_opengl3_example/Release/*\nsdl_opengl3_example/ipch/*\nsdl_opengl3_example/x64/*\n*.opensdf\n*.sdf\n*.suo\n*.vcxproj.user\n*.o\n*.obj\n*.exe\n*.pdb\n*.ilk\n*.VC.db\n*.VC.VC.opendb\n\n## Ini files\nimgui.ini\n"
  },
  {
    "path": "external/imgui/examples/README.txt",
    "content": "Those are standalone ready-to-build applications to demonstrate ImGui.\nBinaries of some of those demos: http://www.miracleworld.net/imgui/binaries\n\nThird party languages and frameworks bindings: https://github.com/ocornut/imgui/wiki/Links\n(languages: C, .net, rust, D, Python, Lua..)\n(frameworks: DX12, Vulkan, Cinder, OpenGLES, openFrameworks, Cocos2d-x, SFML, Flexium, NanoRT, Irrlicht..)\n(extras: RemoteImGui, ImWindow, imgui_wm..)\n\nTL;DR; \n - Newcomers, read 'PROGRAMMER GUIDE' in imgui.cpp for notes on how to setup ImGui in your codebase.\n - If you are using of the backend provided here, so you can copy the imgui_impl_xxx.cpp/h files\n   to your project and use them unmodified.\n - To LEARN how the library is setup, you may refer to 'opengl2_example' because is the simplest one to read.\n   However, do NOT USE the 'opengl2_example' if your code is using any modern GL3+ calls.\n   Mixing old fixed-pipeline OpenGL2 and modern OpenGL3+ is going to make everything more complicated.\n   Read comments below for details. If you are not sure, in doubt, use 'opengl3_example'.\n - If you have your own engine, you probably want to read a few of the examples first then adapt it to\n   your engine. Please note that if your engine is based on OpenGL/DirectX you can perfectly use the\n   existing rendering backends, don't feel forced to rewrite them with your own engine API, or you can\n   do that later when you already got things to work.\n\nImGui is highly portable and only requires a few things to run:\n - Providing mouse/keyboard inputs\n - Load the font atlas texture into graphics memory\n - Providing a render function to render indexed textured triangles\n - Optional: clipboard support, mouse cursor supports, Windows IME support, etc.\nSo this is essentially what those examples are doing + the obligatory cruft for portability.\n\nUnfortunately in 2016 it is still tedious to create and maintain portable build files using external \nlibraries (the kind we're using here to create a window and render 3D triangles) without relying on \nthird party software. For most examples here I choose to provide:\n - Makefiles for Linux/OSX\n - Batch files for Visual Studio 2008+\n - A .sln project file for Visual Studio 2010+ \nPlease let me know if they don't work with your setup!\nYou can probably just import the imgui_impl_xxx.cpp/.h files into your own codebase or compile those\ndirectly with a command-line compiler.\n\nImGui has zero frame of lag for most behaviors and one frame of lag for some behaviors. \nAt 60 FPS your experience should be pleasant. Consider that OS mouse cursors are typically drawn through \na specific hardware accelerated route and may feel smoother than other GPU rendered contents. You may \nexperiment with the io.MouseDrawCursor flag to request ImGui to draw a mouse cursor itself, to visualize \nthe lag between a hardware cursor and a software cursor. It might be beneficial to the user experience\nto switch to a software rendered cursor when an interactive drag is in progress. \nAlso note that some setup or GPU drivers may be causing extra lag (possibly by enforcing triple buffering), \nleaving you with no option but sadness/anger (Intel GPU drivers were reported as such).\n\nopengl2_example/\n    **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**\n    **Prefer using the code in the opengl3_example/ folder**\n    GLFW + OpenGL example (legacy, fixed pipeline).\n    This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.\n    If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more\n    complicated, will require your code to reset every single OpenGL attributes to their initial state, and might\n    confuse your GPU driver. \n\nopengl3_example/\n    GLFW + OpenGL example (programmable pipeline, binding modern functions with GL3W).\n    This uses more modern OpenGL calls and custom shaders. \n    Prefer using that if you are using modern OpenGL in your application (anything with shaders, vbo, vao, etc.).\n\ndirectx9_example/\n    DirectX9 example, Windows only.\n\t\ndirectx10_example/\n    DirectX10 example, Windows only.\n    This is quite long and tedious, because: DirectX10.\n\ndirectx11_example/\n    DirectX11 example, Windows only.\n    This is quite long and tedious, because: DirectX11.\n\t\napple_example/\n    OSX & iOS example.\n    On iOS, Using Synergy to access keyboard/mouse data from server computer.\n    Synergy keyboard integration is rather hacky.\n\nsdl_opengl2_example/\n    **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**\n    **Prefer using the code in the sdl_opengl3_example/ folder**\n    SDL2 + OpenGL example (legacy, fixed pipeline).\n    This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.\n    If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more\n    complicated, will require your code to reset every single OpenGL attributes to their initial state, and might\n    confuse your GPU driver. \n\nsdl_opengl3_example/\n    SDL2 + OpenGL3 example.\n    This uses more modern OpenGL calls and custom shaders. \n    Prefer using that if you are using modern OpenGL in your application (anything with shaders, vbo, vao, etc.).\n\nallegro5_example/\n    Allegro 5 example.\n\t \nmarmalade_example/\n    Marmalade example using IwGx\n    \nvulkan_example/\n\tVulkan example.\n\tThis is quite long and tedious, because: Vulkan.\n\nTODO: Apple, SDL GL/GL3, Allegro, Marmalade, Vulkan examples do not honor the io.WantMoveMouse flag.\n"
  },
  {
    "path": "external/imgui/examples/allegro5_example/README.md",
    "content": "\n# How to Build\n\n- On Ubuntu 14.04+\n\n```bash\ng++ -I ../imgui main.cpp imgui_impl_a5.cpp ../imgui/imgui*.cpp -lallegro -lallegro_primitives\n```\n\n- On Windows with Visual Studio's CLI\n\n```\nset ALLEGRODIR=path_to_your_allegro5_folder\ncl /Zi /MD /I %ALLEGRODIR%\\include /I ..\\.. main.cpp imgui_impl_a5.cpp ..\\..\\imgui*.cpp /link /LIBPATH:%ALLEGRODIR%\\lib allegro-5.0.10-monolith-md.lib user32.lib\n```\n"
  },
  {
    "path": "external/imgui/examples/allegro5_example/imgui_impl_a5.cpp",
    "content": "// ImGui Allegro 5 bindings\n// In this binding, ImTextureID is used to store a 'ALLEGRO_BITMAP*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// TODO:\n// - Clipboard is not supported.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n// by @birthggd\n\n#include <stdint.h>     // uint64_t\n#include <cstring>      // memcpy\n#include <imgui.h>\n#include \"imgui_impl_a5.h\"\n#include <allegro5/allegro.h>\n#include <allegro5/allegro_primitives.h>\n\n#ifdef _WIN32\n#include <allegro5/allegro_windows.h>\n#endif\n\n// Data\nstatic ALLEGRO_DISPLAY*         g_Display = NULL;\nstatic ALLEGRO_BITMAP*          g_Texture = NULL;\nstatic double                   g_Time = 0.0;\nstatic ALLEGRO_MOUSE_CURSOR*    g_MouseCursorInvisible = NULL;\nstatic ALLEGRO_VERTEX_DECL*     g_VertexDecl = NULL;\n\n#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))\n\nstruct ImDrawVertAllegro\n{\n    ImVec2 pos;\n    ImVec2 uv;\n    ALLEGRO_COLOR col;\n};\n\nvoid ImGui_ImplA5_RenderDrawLists(ImDrawData* draw_data)\n{\n    int op, src, dst;\n    al_get_blender(&op, &src, &dst);\n    al_set_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA);\n\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n\n        // FIXME-OPT: Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 floats\n        static ImVector<ImDrawVertAllegro> vertices;\n        vertices.resize(cmd_list->VtxBuffer.Size);\n        for (int i = 0; i < cmd_list->VtxBuffer.Size; ++i)\n        {\n            const ImDrawVert &dv = cmd_list->VtxBuffer[i];\n            ImDrawVertAllegro v;\n            v.pos = dv.pos;\n            v.uv = dv.uv;\n            unsigned char *c = (unsigned char*)&dv.col;\n            v.col = al_map_rgba(c[0], c[1], c[2], c[3]);\n            vertices[i] = v;\n        }\n\n        // FIXME-OPT: Unfortunately Allegro doesn't support 16-bit indices\n        // You can also use '#define ImDrawIdx unsigned int' in imconfig.h and request ImGui to output 32-bit indices\n        static ImVector<int> indices;\n        indices.resize(cmd_list->IdxBuffer.Size);\n        for (int i = 0; i < cmd_list->IdxBuffer.Size; ++i)\n            indices[i] = (int)cmd_list->IdxBuffer.Data[i];\n\n        int idx_offset = 0;\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                ALLEGRO_BITMAP* texture = (ALLEGRO_BITMAP*)pcmd->TextureId;\n                al_set_clipping_rectangle(pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z-pcmd->ClipRect.x, pcmd->ClipRect.w-pcmd->ClipRect.y);\n                al_draw_indexed_prim(&vertices[0], g_VertexDecl, texture, &indices[idx_offset], pcmd->ElemCount, ALLEGRO_PRIM_TRIANGLE_LIST);\n            }\n            idx_offset += pcmd->ElemCount;\n        }\n    }\n\n    // Restore modified state\n    al_set_blender(op, src, dst);\n    al_set_clipping_rectangle(0, 0, al_get_display_width(g_Display), al_get_display_height(g_Display));\n}\n\nbool Imgui_ImplA5_CreateDeviceObjects()\n{\n    // Build texture atlas\n    ImGuiIO &io = ImGui::GetIO();\n    unsigned char *pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);\n\n    // Create texture\n    int flags = al_get_new_bitmap_flags();\n    int fmt = al_get_new_bitmap_format();\n    al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP|ALLEGRO_MIN_LINEAR|ALLEGRO_MAG_LINEAR);\n    al_set_new_bitmap_format(ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE);\n    ALLEGRO_BITMAP* img = al_create_bitmap(width, height);\n    al_set_new_bitmap_flags(flags);\n    al_set_new_bitmap_format(fmt);\n    if (!img)\n        return false;\n\n    ALLEGRO_LOCKED_REGION *locked_img = al_lock_bitmap(img, al_get_bitmap_format(img), ALLEGRO_LOCK_WRITEONLY);\n    if (!locked_img)\n    {\n        al_destroy_bitmap(img);\n        return false;\n    }\n    memcpy(locked_img->data, pixels, sizeof(int)*width*height);\n    al_unlock_bitmap(img);\n\n    // Convert software texture to hardware texture.\n    ALLEGRO_BITMAP* cloned_img = al_clone_bitmap(img);\n    al_destroy_bitmap(img);\n    if (!cloned_img)\n        return false;\n\n    // Store our identifier\n    io.Fonts->TexID = (void*)cloned_img;\n    g_Texture = cloned_img;\n\n    // Create an invisible mouse cursor\n    // Because al_hide_mouse_cursor() seems to mess up with the actual inputs..\n    ALLEGRO_BITMAP* mouse_cursor = al_create_bitmap(8,8);\n    g_MouseCursorInvisible = al_create_mouse_cursor(mouse_cursor, 0, 0);\n    al_destroy_bitmap(mouse_cursor);\n\n    return true;\n}\n\nvoid ImGui_ImplA5_InvalidateDeviceObjects()\n{\n    if (g_Texture)\n    {\n        al_destroy_bitmap(g_Texture);\n        ImGui::GetIO().Fonts->TexID = NULL;\n        g_Texture = NULL;\n    }\n    if (g_MouseCursorInvisible)\n    {\n        al_destroy_mouse_cursor(g_MouseCursorInvisible);\n        g_MouseCursorInvisible = NULL;\n    }\n}\n\nbool ImGui_ImplA5_Init(ALLEGRO_DISPLAY* display)\n{\n    g_Display = display;\n\n    // Create custom vertex declaration.\n    // Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 floats.\n    // We still use a custom declaration to use 'ALLEGRO_PRIM_TEX_COORD' instead of 'ALLEGRO_PRIM_TEX_COORD_PIXEL' else we can't do a reliable conversion.\n    ALLEGRO_VERTEX_ELEMENT elems[] =\n    {\n        { ALLEGRO_PRIM_POSITION, ALLEGRO_PRIM_FLOAT_2, OFFSETOF(ImDrawVertAllegro, pos) },\n        { ALLEGRO_PRIM_TEX_COORD, ALLEGRO_PRIM_FLOAT_2, OFFSETOF(ImDrawVertAllegro, uv) },\n        { ALLEGRO_PRIM_COLOR_ATTR, 0, OFFSETOF(ImDrawVertAllegro, col) },\n        { 0, 0, 0 }\n    };\n    g_VertexDecl = al_create_vertex_decl(elems, sizeof(ImDrawVertAllegro));\n\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = ALLEGRO_KEY_TAB;\n    io.KeyMap[ImGuiKey_LeftArrow] = ALLEGRO_KEY_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = ALLEGRO_KEY_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = ALLEGRO_KEY_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = ALLEGRO_KEY_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = ALLEGRO_KEY_PGUP;\n    io.KeyMap[ImGuiKey_PageDown] = ALLEGRO_KEY_PGDN;\n    io.KeyMap[ImGuiKey_Home] = ALLEGRO_KEY_HOME;\n    io.KeyMap[ImGuiKey_End] = ALLEGRO_KEY_END;\n    io.KeyMap[ImGuiKey_Delete] = ALLEGRO_KEY_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = ALLEGRO_KEY_BACKSPACE;\n    io.KeyMap[ImGuiKey_Enter] = ALLEGRO_KEY_ENTER;\n    io.KeyMap[ImGuiKey_Escape] = ALLEGRO_KEY_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = ALLEGRO_KEY_A;\n    io.KeyMap[ImGuiKey_C] = ALLEGRO_KEY_C;\n    io.KeyMap[ImGuiKey_V] = ALLEGRO_KEY_V;\n    io.KeyMap[ImGuiKey_X] = ALLEGRO_KEY_X;\n    io.KeyMap[ImGuiKey_Y] = ALLEGRO_KEY_Y;\n    io.KeyMap[ImGuiKey_Z] = ALLEGRO_KEY_Z;\n\n    io.RenderDrawListsFn = ImGui_ImplA5_RenderDrawLists;        // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n#ifdef _WIN32\n    io.ImeWindowHandle = al_get_win_window_handle(g_Display);\n#endif\n\n    return true;\n}\n\nvoid ImGui_ImplA5_Shutdown()\n{\n    ImGui_ImplA5_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n}\n\n// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\nbool ImGui_ImplA5_ProcessEvent(ALLEGRO_EVENT *ev)\n{\n    ImGuiIO &io = ImGui::GetIO();\n\n    switch (ev->type)\n    {\n    case ALLEGRO_EVENT_MOUSE_AXES:\n        io.MouseWheel += ev->mouse.dz;\n        return true;\n    case ALLEGRO_EVENT_KEY_CHAR:\n        if (ev->keyboard.display == g_Display)\n            if (ev->keyboard.unichar > 0 && ev->keyboard.unichar < 0x10000)\n                io.AddInputCharacter((unsigned short)ev->keyboard.unichar);\n        return true;\n    case ALLEGRO_EVENT_KEY_DOWN:\n    case ALLEGRO_EVENT_KEY_UP:\n        if (ev->keyboard.display == g_Display)\n            io.KeysDown[ev->keyboard.keycode] = (ev->type == ALLEGRO_EVENT_KEY_DOWN);\n        return true;\n    }\n    return false;\n}\n\nvoid ImGui_ImplA5_NewFrame()\n{\n    if (!g_Texture)\n        Imgui_ImplA5_CreateDeviceObjects();\n\n    ImGuiIO &io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    int w, h;\n    w = al_get_display_width(g_Display);\n    h = al_get_display_height(g_Display);\n    io.DisplaySize = ImVec2((float)w, (float)h);\n\n    // Setup time step\n    double current_time = al_get_time();\n    io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);\n    g_Time = current_time;\n\n    // Setup inputs\n    ALLEGRO_KEYBOARD_STATE keys;\n    al_get_keyboard_state(&keys);\n    io.KeyCtrl = al_key_down(&keys, ALLEGRO_KEY_LCTRL) || al_key_down(&keys, ALLEGRO_KEY_RCTRL);\n    io.KeyShift = al_key_down(&keys, ALLEGRO_KEY_LSHIFT) || al_key_down(&keys, ALLEGRO_KEY_RSHIFT);\n    io.KeyAlt = al_key_down(&keys, ALLEGRO_KEY_ALT) || al_key_down(&keys, ALLEGRO_KEY_ALTGR);\n    io.KeySuper = al_key_down(&keys, ALLEGRO_KEY_LWIN) || al_key_down(&keys, ALLEGRO_KEY_RWIN);\n\n    ALLEGRO_MOUSE_STATE mouse;\n    if (keys.display == g_Display)\n    {\n        al_get_mouse_state(&mouse);\n        io.MousePos = ImVec2((float)mouse.x, (float)mouse.y);\n    }\n    else\n    {\n        io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);\n    }\n\n    al_get_mouse_state(&mouse);\n    io.MouseDown[0] = mouse.buttons & (1 << 0);\n    io.MouseDown[1] = mouse.buttons & (1 << 1);\n    io.MouseDown[2] = mouse.buttons & (1 << 2);\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    if (io.MouseDrawCursor)\n    {\n        al_set_mouse_cursor(g_Display, g_MouseCursorInvisible);\n    }\n    else\n    {\n        ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT;\n        switch (ImGui::GetMouseCursor())\n        {\n        case ImGuiMouseCursor_TextInput:    cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT; break;\n        case ImGuiMouseCursor_Move:         cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE; break;\n        case ImGuiMouseCursor_ResizeNS:     cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N; break;\n        case ImGuiMouseCursor_ResizeEW:     cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E; break;\n        case ImGuiMouseCursor_ResizeNESW:   cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE; break;\n        case ImGuiMouseCursor_ResizeNWSE:   cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW; break;\n        }\n        al_set_system_mouse_cursor(g_Display, cursor_id);\n    }\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n"
  },
  {
    "path": "external/imgui/examples/allegro5_example/imgui_impl_a5.h",
    "content": "// ImGui Allegro 5 bindings\n// In this binding, ImTextureID is used to store a 'ALLEGRO_BITMAP*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n// by @birthggd\n\n#pragma once\n\nstruct ALLEGRO_DISPLAY;\nunion ALLEGRO_EVENT;\n\nIMGUI_API bool    ImGui_ImplA5_Init(ALLEGRO_DISPLAY* display);\nIMGUI_API void    ImGui_ImplA5_Shutdown();\nIMGUI_API void    ImGui_ImplA5_NewFrame();\nIMGUI_API bool    ImGui_ImplA5_ProcessEvent(ALLEGRO_EVENT* event);\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API bool    Imgui_ImplA5_CreateDeviceObjects();\nIMGUI_API void    ImGui_ImplA5_InvalidateDeviceObjects();\n"
  },
  {
    "path": "external/imgui/examples/allegro5_example/main.cpp",
    "content": "// ImGui - standalone example application for Allegro 5\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n\n#include <stdint.h>\n#include <allegro5/allegro.h>\n#include <allegro5/allegro_primitives.h>\n#include <imgui.h>\n#include \"imgui_impl_a5.h\"\n\nint main(int, char**)\n{\n    // Setup Allegro\n    al_init();\n    al_install_keyboard();\n    al_install_mouse();\n    al_init_primitives_addon();\n    al_set_new_display_flags(ALLEGRO_RESIZABLE);\n    ALLEGRO_DISPLAY* display = al_create_display(1280, 720);\n    al_set_window_title(display, \"ImGui Allegro 5 example\");\n    ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();\n    al_register_event_source(queue, al_get_display_event_source(display));\n    al_register_event_source(queue, al_get_keyboard_event_source());\n    al_register_event_source(queue, al_get_mouse_event_source());\n\n    // Setup ImGui binding\n    ImGui_ImplA5_Init(display);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    bool running = true;\n    while (running)\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        ALLEGRO_EVENT ev;\n        while (al_get_next_event(queue, &ev))\n        {\n            ImGui_ImplA5_ProcessEvent(&ev);\n            if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) \n                running = false;\n            if (ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE)\n            {\n                ImGui_ImplA5_InvalidateDeviceObjects();\n                al_acknowledge_resize(display);\n                Imgui_ImplA5_CreateDeviceObjects();\n            }\n        }\n        ImGui_ImplA5_NewFrame();\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f/ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        al_clear_to_color(al_map_rgba_f(clear_color.x, clear_color.y, clear_color.z, clear_color.w));\n        ImGui::Render();\n        al_flip_display();\n    }\n\n    // Cleanup\n    ImGui_ImplA5_Shutdown();\n    al_destroy_event_queue(queue);\n    al_destroy_display(display);\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/apple_example/.gitignore",
    "content": ".DS_Store\nimguiex.xcodeproj/project.xcworkspace/\nimguiex.xcodeproj/xcuserdata/"
  },
  {
    "path": "external/imgui/examples/apple_example/README.md",
    "content": "# iOS / OSX example\n\n## Introduction\n\nThis example is the default XCode \"OpenGL\" example code, modified to support ImGui and [Synergy](http://synergy-project.org/) to share mouse/keyboard on an iOS device.\n\nIt is a rather complex and messy example because of all of the faff required to get an XCode/iOS application running. Refer to the regular OpenGL examples if you want to learn about integrating ImGui. **The opengl3_example/ should also work on OS X and is much simpler.** This is an integration for iOS with Synergy.\n\nSynergy (remote keyboard/mouse) is not required, but it's pretty hard to use ImGui without it. Synergy includes a \"uSynergy\" library that allows embedding a synergy client, this is what is used here. ImGui supports \"TouchPadding\", and this is enabled when Synergy is not active.\n\n## How to Use on iOS\n\n* In Synergy, go to Preferences, and uncheck \"Use SSL encryption\"\n* Run the example app.\n* Tap the \"servername\" button in the corner\n* Enter the name or the IP of your synergy host\n* If you had previously connected to a server, you may need to kill and re-start the app.\n\n## How to Build on OSX\n\n* Make sure you have install `brew`, if not, please refer to [Homebrew Website](http://brew.sh)\n* Run the command: `brew install glfw3`\n* Double click `imguiex.xcodeproj` and select `imguiex-osx` scheme\n* Click `Run` button\n\n## Notes and TODOs\n\nThings that would be nice but I didn't get around to doing:\n\n* iOS software keyboard not supported for text inputs\n* iOS hardware (bluetooth) keyboards not supported\n* Graceful disconnect/reconnect from uSynergy.\n* Copy/Paste not well-supported\n\n## C++ on iOS / OSX\n\nImGui is a c++ library. If you want to include it directly, rename your Obj-C file to have the \".mm\" extension. \n\nAlternatively, you can wrap your debug code in a C interface, this is what I am demonstrating here with the \"debug_hud.h\" interface. Either approach works, use whatever you prefer.\n\nIn my case, most of my game code is already in C++ so it's not really an issue and I can use ImGui directly.\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/AppDelegate.h",
    "content": "//\n//  AppDelegate.h\n//  imguiex\n\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n\n@end\n\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/AppDelegate.m",
    "content": "//\n//  AppDelegate.m\n//  imguiex\n\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n    // Override point for customization after application launch.\n    return YES;\n}\n\n- (void)applicationWillResignActive:(UIApplication *)application {\n    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n}\n\n- (void)applicationDidEnterBackground:(UIApplication *)application {\n    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n}\n\n- (void)applicationWillEnterForeground:(UIApplication *)application {\n    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.\n}\n\n- (void)applicationDidBecomeActive:(UIApplication *)application {\n    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n}\n\n- (void)applicationWillTerminate:(UIApplication *)application {\n    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n}\n\n@end\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7706\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7703\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"imguiex\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"7706\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BV1-FR-VrT\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7703\"/>\n        <capability name=\"Constraints to layout margins\" minToolsVersion=\"6.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Game View Controller-->\n        <scene sceneID=\"tXr-a1-R10\">\n            <objects>\n                <viewController id=\"BV1-FR-VrT\" customClass=\"GameViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"8aa-yV-Osq\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"qHh-Mt-9TT\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"3se-qz-xqx\" customClass=\"GLKView\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" misplaced=\"YES\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"piS-r7-VWh\">\n                                <rect key=\"frame\" x=\"16\" y=\"550\" width=\"136\" height=\"30\"/>\n                                <state key=\"normal\" title=\"servername\">\n                                    <color key=\"titleShadowColor\" white=\"0.5\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"onServernameTapped:\" destination=\"BV1-FR-VrT\" eventType=\"touchUpInside\" id=\"9sO-yv-0be\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"qHh-Mt-9TT\" firstAttribute=\"top\" secondItem=\"piS-r7-VWh\" secondAttribute=\"bottom\" constant=\"20\" id=\"JxW-fj-qni\"/>\n                            <constraint firstItem=\"piS-r7-VWh\" firstAttribute=\"leading\" secondItem=\"3se-qz-xqx\" secondAttribute=\"leadingMargin\" constant=\"20\" id=\"w5q-gx-tJj\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"btnServername\" destination=\"piS-r7-VWh\" id=\"9iV-ef-l6M\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"SZV-WD-TEh\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/GameViewController.h",
    "content": "//\n//  GameViewController.h\n//  imguiex\n\n// This is the OpenGL Example template from XCode, modified to support ImGui\n\n#import <UIKit/UIKit.h>\n#import <GLKit/GLKit.h>\n\n@interface GameViewController : GLKViewController\n\n@end\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/GameViewController.m",
    "content": "//\n//  GameViewController.m\n//  imguiex\n//\n#import \"GameViewController.h\"\n#import <OpenGLES/ES2/glext.h>\n\n#import \"imgui_impl_ios.h\"\n#import \"debug_hud.h\"\n\n#define BUFFER_OFFSET(i) ((char *)NULL + (i))\n\n#define SERVERNAME_KEY @\"ServerName\"\n\n#define SERVERNAME_ALERT_TAG (10)\n\n// Uniform index.\nenum\n{\n    UNIFORM_MODELVIEWPROJECTION_MATRIX,\n    UNIFORM_NORMAL_MATRIX,\n    UNIFORM_DIFFUSE_COLOR,\n    \n    NUM_UNIFORMS\n};\nGLint uniforms[NUM_UNIFORMS];\n\n// Attribute index.\nenum\n{\n    ATTRIB_VERTEX,\n    ATTRIB_NORMAL,\n    NUM_ATTRIBUTES\n};\n\nGLfloat gCubeVertexData[216] = \n{\n    // Data layout for each line below is:\n    // positionX, positionY, positionZ,     normalX, normalY, normalZ,\n    0.5f, -0.5f, -0.5f,        1.0f, 0.0f, 0.0f,\n    0.5f, 0.5f, -0.5f,         1.0f, 0.0f, 0.0f,\n    0.5f, -0.5f, 0.5f,         1.0f, 0.0f, 0.0f,\n    0.5f, -0.5f, 0.5f,         1.0f, 0.0f, 0.0f,\n    0.5f, 0.5f, -0.5f,          1.0f, 0.0f, 0.0f,\n    0.5f, 0.5f, 0.5f,         1.0f, 0.0f, 0.0f,\n    \n    0.5f, 0.5f, -0.5f,         0.0f, 1.0f, 0.0f,\n    -0.5f, 0.5f, -0.5f,        0.0f, 1.0f, 0.0f,\n    0.5f, 0.5f, 0.5f,          0.0f, 1.0f, 0.0f,\n    0.5f, 0.5f, 0.5f,          0.0f, 1.0f, 0.0f,\n    -0.5f, 0.5f, -0.5f,        0.0f, 1.0f, 0.0f,\n    -0.5f, 0.5f, 0.5f,         0.0f, 1.0f, 0.0f,\n    \n    -0.5f, 0.5f, -0.5f,        -1.0f, 0.0f, 0.0f,\n    -0.5f, -0.5f, -0.5f,       -1.0f, 0.0f, 0.0f,\n    -0.5f, 0.5f, 0.5f,         -1.0f, 0.0f, 0.0f,\n    -0.5f, 0.5f, 0.5f,         -1.0f, 0.0f, 0.0f,\n    -0.5f, -0.5f, -0.5f,       -1.0f, 0.0f, 0.0f,\n    -0.5f, -0.5f, 0.5f,        -1.0f, 0.0f, 0.0f,\n    \n    -0.5f, -0.5f, -0.5f,       0.0f, -1.0f, 0.0f,\n    0.5f, -0.5f, -0.5f,        0.0f, -1.0f, 0.0f,\n    -0.5f, -0.5f, 0.5f,        0.0f, -1.0f, 0.0f,\n    -0.5f, -0.5f, 0.5f,        0.0f, -1.0f, 0.0f,\n    0.5f, -0.5f, -0.5f,        0.0f, -1.0f, 0.0f,\n    0.5f, -0.5f, 0.5f,         0.0f, -1.0f, 0.0f,\n    \n    0.5f, 0.5f, 0.5f,          0.0f, 0.0f, 1.0f,\n    -0.5f, 0.5f, 0.5f,         0.0f, 0.0f, 1.0f,\n    0.5f, -0.5f, 0.5f,         0.0f, 0.0f, 1.0f,\n    0.5f, -0.5f, 0.5f,         0.0f, 0.0f, 1.0f,\n    -0.5f, 0.5f, 0.5f,         0.0f, 0.0f, 1.0f,\n    -0.5f, -0.5f, 0.5f,        0.0f, 0.0f, 1.0f,\n    \n    0.5f, -0.5f, -0.5f,        0.0f, 0.0f, -1.0f,\n    -0.5f, -0.5f, -0.5f,       0.0f, 0.0f, -1.0f,\n    0.5f, 0.5f, -0.5f,         0.0f, 0.0f, -1.0f,\n    0.5f, 0.5f, -0.5f,         0.0f, 0.0f, -1.0f,\n    -0.5f, -0.5f, -0.5f,       0.0f, 0.0f, -1.0f,\n    -0.5f, 0.5f, -0.5f,        0.0f, 0.0f, -1.0f\n};\n\n@interface GameViewController () <UIAlertViewDelegate>\n{\n    GLuint _program;\n    \n    GLKMatrix4 _modelViewProjectionMatrix;\n    GLKMatrix3 _normalMatrix;\n    float _rotation;\n    \n    GLuint _vertexArray;\n    GLuint _vertexBuffer;\n    \n    DebugHUD _hud;\n}\n@property (strong, nonatomic) EAGLContext *context;\n@property (strong, nonatomic) GLKBaseEffect *effect;\n@property (strong, nonatomic) ImGuiHelper *imgui;\n@property (weak, nonatomic) IBOutlet UIButton *btnServername;\n\n@property (strong, nonatomic) NSString *serverName;\n\n- (IBAction)onServernameTapped:(id)sender;\n\n- (void)setupGL;\n- (void)tearDownGL;\n\n- (BOOL)loadShaders;\n- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;\n- (BOOL)linkProgram:(GLuint)prog;\n- (BOOL)validateProgram:(GLuint)prog;\n@end\n\n@implementation GameViewController\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    \n    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];\n\n    if (!self.context) {\n        NSLog(@\"Failed to create ES context\");\n    }\n    \n    GLKView *view = (GLKView *)self.view;\n    view.context = self.context;\n    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;\n    \n    [self.btnServername setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];\n    \n    [self setupGL];\n    \n    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];\n    self.serverName = [userDefaults objectForKey: SERVERNAME_KEY ];\n    self.imgui = [[ImGuiHelper alloc] initWithView:self.view ];\n    if (self.serverName)\n    {\n        [self.btnServername setTitle:self.serverName forState:UIControlStateNormal];\n        [self.imgui connectServer: self.serverName ];\n    }\n    \n    DebugHUD_InitDefaults( &_hud );\n}\n\n- (void)dealloc\n{    \n    [self tearDownGL];\n    \n    if ([EAGLContext currentContext] == self.context) {\n        [EAGLContext setCurrentContext:nil];\n    }\n}\n\n- (void)didReceiveMemoryWarning\n{\n    [super didReceiveMemoryWarning];\n\n    if ([self isViewLoaded] && ([[self view] window] == nil)) {\n        self.view = nil;\n        \n        [self tearDownGL];\n        \n        if ([EAGLContext currentContext] == self.context) {\n            [EAGLContext setCurrentContext:nil];\n        }\n        self.context = nil;\n    }\n\n    // Dispose of any resources that can be recreated.\n}\n\n\n- (BOOL)prefersStatusBarHidden {\n    return YES;\n}\n\n- (IBAction)onServernameTapped:(id)sender\n{\n    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@\"Set Server\" message:@\"Enter server name or IP for uSynergy\" delegate:self cancelButtonTitle:@\"OK\" otherButtonTitles:@\"Cancel\", nil ];\n    alert.alertViewStyle = UIAlertViewStylePlainTextInput;\n    alert.tag = SERVERNAME_ALERT_TAG; // cheezy way to tell which alert view we're responding to\n    [alert show];\n}\n\n- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex\n{\n    if ((buttonIndex==0)&&(alertView.tag==SERVERNAME_ALERT_TAG))\n    {\n        // This is really janky. I usually just hardcode the servername since I'm building it anyway.\n        // If you want to properly handle updating the server, you'll want to tear down and recreate\n        // the usynergy stuff in connectServer\n        BOOL serverNameWasSet = self.serverName.length > 0;\n        NSString *serverName = [[alertView textFieldAtIndex:0] text];\n\n        if ([serverName length] > 0) {\n            self.serverName = serverName;\n            NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];\n            [userDefaults setObject:serverName forKey:SERVERNAME_KEY ];\n            [userDefaults synchronize];\n            \n            [self.btnServername setTitle:self.serverName forState:UIControlStateNormal];\n            \n            // If we hadn't previously connected, try now\n            if (!serverNameWasSet) {\n                [self.imgui connectServer:self.serverName];\n            }\n            else\n            {\n                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@\"Servername Updated\"\n                                                                message:@\"Restart the app to connect the server\"\n                                                               delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles: nil];\n                [alert show];\n            }\n        }\n    }\n}\n\n- (void)setupGL\n{\n    [EAGLContext setCurrentContext:self.context];\n    \n    [self loadShaders];\n    \n    self.effect = [[GLKBaseEffect alloc] init];\n    self.effect.light0.enabled = GL_TRUE;\n    self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 1.0f);\n    \n    glEnable(GL_DEPTH_TEST);\n    \n    glGenVertexArraysOES(1, &_vertexArray);\n    glBindVertexArrayOES(_vertexArray);\n    \n    glGenBuffers(1, &_vertexBuffer);\n    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);\n    glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW);\n    \n    glEnableVertexAttribArray(GLKVertexAttribPosition);\n    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));\n    glEnableVertexAttribArray(GLKVertexAttribNormal);\n    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));\n    \n    glBindVertexArrayOES(0);\n    \n\n}\n\n- (void)tearDownGL\n{\n    [EAGLContext setCurrentContext:self.context];\n    \n    glDeleteBuffers(1, &_vertexBuffer);\n    glDeleteVertexArraysOES(1, &_vertexArray);\n    \n    self.effect = nil;\n    \n    if (_program) {\n        glDeleteProgram(_program);\n        _program = 0;\n    }\n}\n\n#pragma mark - GLKView and GLKViewController delegate methods\n\n- (void)update\n{\n    float aspect = fabs(self.view.bounds.size.width / self.view.bounds.size.height);\n    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);\n    \n    self.effect.transform.projectionMatrix = projectionMatrix;\n    \n    GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f);\n    baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f);\n    \n    // Compute the model view matrix for the object rendered with GLKit\n    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f);\n    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);\n    modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);\n    \n    self.effect.transform.modelviewMatrix = modelViewMatrix;\n    \n    // Compute the model view matrix for the object rendered with ES2\n    modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f);\n    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);\n    modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);\n    \n    _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);\n    \n    _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);\n    \n    _rotation += self.timeSinceLastUpdate * (_hud.rotation_speed * (M_PI / 180.0));\n}\n\n\n- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect\n{\n    glClearColor(0.65f, 0.65f, 0.65f, 1.0f);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n    \n    glBindVertexArrayOES(_vertexArray);\n    \n    // Render the object with GLKit\n    [self.effect prepareToDraw];\n    \n    glDrawArrays(GL_TRIANGLES, 0, 36);\n    \n    // Render the object again with ES2\n    glUseProgram(_program);\n    \n    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);\n    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);\n    glUniform3f(uniforms[UNIFORM_DIFFUSE_COLOR], _hud.cubeColor1[0], _hud.cubeColor1[1], _hud.cubeColor1[2] );\n\n    glDrawArrays(GL_TRIANGLES, 0, 36);\n    \n    [self.imgui newFrame];\n    \n    // Now do our ImGUI UI\n    DebugHUD_DoInterface( &_hud );\n    \n    self.effect.light0.diffuseColor = GLKVector4Make( _hud.cubeColor2[0], _hud.cubeColor2[1], _hud.cubeColor2[2], 1.0f);\n    \n    // Now render Imgui\n    [self.imgui render];\n    \n}\n\n#pragma mark -  OpenGL ES 2 shader compilation\n\n- (BOOL)loadShaders\n{\n    GLuint vertShader, fragShader;\n    NSString *vertShaderPathname, *fragShaderPathname;\n    \n    // Create shader program.\n    _program = glCreateProgram();\n    \n    // Create and compile vertex shader.\n    vertShaderPathname = [[NSBundle mainBundle] pathForResource:@\"Shader\" ofType:@\"vsh\"];\n    if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) {\n        NSLog(@\"Failed to compile vertex shader\");\n        return NO;\n    }\n    \n    // Create and compile fragment shader.\n    fragShaderPathname = [[NSBundle mainBundle] pathForResource:@\"Shader\" ofType:@\"fsh\"];\n    if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname]) {\n        NSLog(@\"Failed to compile fragment shader\");\n        return NO;\n    }\n    \n    // Attach vertex shader to program.\n    glAttachShader(_program, vertShader);\n    \n    // Attach fragment shader to program.\n    glAttachShader(_program, fragShader);\n    \n    // Bind attribute locations.\n    // This needs to be done prior to linking.\n    glBindAttribLocation(_program, GLKVertexAttribPosition, \"position\");\n    glBindAttribLocation(_program, GLKVertexAttribNormal, \"normal\");\n    \n    // Link program.\n    if (![self linkProgram:_program]) {\n        NSLog(@\"Failed to link program: %d\", _program);\n        \n        if (vertShader) {\n            glDeleteShader(vertShader);\n            vertShader = 0;\n        }\n        if (fragShader) {\n            glDeleteShader(fragShader);\n            fragShader = 0;\n        }\n        if (_program) {\n            glDeleteProgram(_program);\n            _program = 0;\n        }\n        \n        return NO;\n    }\n    \n    // Get uniform locations.\n    uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(_program, \"modelViewProjectionMatrix\");\n    uniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(_program, \"normalMatrix\");\n    uniforms[UNIFORM_DIFFUSE_COLOR] = glGetUniformLocation(_program, \"diffuseColor\");\n    \n    // Release vertex and fragment shaders.\n    if (vertShader) {\n        glDetachShader(_program, vertShader);\n        glDeleteShader(vertShader);\n    }\n    if (fragShader) {\n        glDetachShader(_program, fragShader);\n        glDeleteShader(fragShader);\n    }\n    \n    return YES;\n}\n\n- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file\n{\n    GLint status;\n    const GLchar *source;\n    \n    source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String];\n    if (!source) {\n        NSLog(@\"Failed to load vertex shader\");\n        return NO;\n    }\n    \n    *shader = glCreateShader(type);\n    glShaderSource(*shader, 1, &source, NULL);\n    glCompileShader(*shader);\n    \n#if defined(DEBUG)\n    GLint logLength;\n    glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);\n    if (logLength > 0) {\n        GLchar *log = (GLchar *)malloc(logLength);\n        glGetShaderInfoLog(*shader, logLength, &logLength, log);\n        NSLog(@\"Shader compile log:\\n%s\", log);\n        free(log);\n    }\n#endif\n    \n    glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);\n    if (status == 0) {\n        glDeleteShader(*shader);\n        return NO;\n    }\n    \n    return YES;\n}\n\n- (BOOL)linkProgram:(GLuint)prog\n{\n    GLint status;\n    glLinkProgram(prog);\n    \n#if defined(DEBUG)\n    GLint logLength;\n    glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);\n    if (logLength > 0) {\n        GLchar *log = (GLchar *)malloc(logLength);\n        glGetProgramInfoLog(prog, logLength, &logLength, log);\n        NSLog(@\"Program link log:\\n%s\", log);\n        free(log);\n    }\n#endif\n    \n    glGetProgramiv(prog, GL_LINK_STATUS, &status);\n    if (status == 0) {\n        return NO;\n    }\n    \n    return YES;\n}\n\n- (BOOL)validateProgram:(GLuint)prog\n{\n    GLint logLength, status;\n    \n    glValidateProgram(prog);\n    glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);\n    if (logLength > 0) {\n        GLchar *log = (GLchar *)malloc(logLength);\n        glGetProgramInfoLog(prog, logLength, &logLength, log);\n        NSLog(@\"Program validate log:\\n%s\", log);\n        free(log);\n    }\n    \n    glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);\n    if (status == 0) {\n        return NO;\n    }\n    \n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon_imgui_60@2x~iphone.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon_imgui_60@3x~iphone.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon_imgui_76~ipad.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"icon_imgui_76@2x~ipad.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>org.imgui.example.$(PRODUCT_NAME:rfc1034identifier)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarHidden</key>\n\t<true/>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/Shaders/Shader.fsh",
    "content": "//\n//  Shader.fsh\n//  imguiex\n\nvarying lowp vec4 colorVarying;\n\nvoid main()\n{\n    gl_FragColor = colorVarying;\n}\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/Shaders/Shader.vsh",
    "content": "//\n//  Shader.vsh\n//  imguiex\n\nattribute vec4 position;\nattribute vec3 normal;\n\nvarying lowp vec4 colorVarying;\n\nuniform vec3 diffuseColor;\nuniform mat4 modelViewProjectionMatrix;\nuniform mat3 normalMatrix;\n\nvoid main()\n{\n    vec3 eyeNormal = normalize(normalMatrix * normal);\n    vec3 lightPosition = vec3(0.0, 0.0, 1.0);\n    \n    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));\n    \n    vec3 colorLit = diffuseColor * nDotVP;\n    colorVarying = vec4( colorLit.x, colorLit.y, colorLit.z, 1.0 );\n    \n    gl_Position = modelViewProjectionMatrix * position;\n}\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/debug_hud.cpp",
    "content": "//\n//  debug_hud.cpp\n//  imguiex\n\n#include <stdio.h>\n\n#include \"debug_hud.h\"\n#include \"imgui.h\"\n\nvoid DebugHUD_InitDefaults( DebugHUD *hud )\n{\n    hud->show_test_window = true;\n    hud->show_example_window = true;\n    hud->rotation_speed = 15.0f;\n    \n    hud->cubeColor1[0] = 0.4f;\n    hud->cubeColor1[1] = 0.4f;\n    hud->cubeColor1[2] = 1.0f;\n    hud->cubeColor1[3] = 1.0f;\n    \n    hud->cubeColor2[0] = 1.0f;\n    hud->cubeColor2[1] = 0.4f;\n    hud->cubeColor2[2] = 0.4f;\n    hud->cubeColor2[3] = 1.0f;\n}\n\nvoid DebugHUD_DoInterface(DebugHUD *hud)\n{\n    if (hud->show_test_window)\n    {\n        ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n        ImGui::ShowTestWindow(&hud->show_test_window );\n    }\n    \n    if (hud->show_example_window)\n    {\n        ImGui::Begin(\"Another Window\", &hud->show_example_window);\n        ImGui::Text(\"Hello from another window!\");\n        ImGui::ColorEdit3(\"Cube 1 Color\", hud->cubeColor1);\n        ImGui::ColorEdit3(\"Cube 2 Color\", hud->cubeColor2);\n        ImGui::SliderFloat(\"Rotation Speed\", &hud->rotation_speed, 0.0f, 200.0f);\n        ImGui::End();\n    }\n}\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/debug_hud.h",
    "content": "//\n//  debug_hud.h\n//  imguiex\n\n#pragma once\n\ntypedef struct DebugHUD\n{\n    bool show_test_window;\n    bool show_example_window;\n    float rotation_speed;\n    float cubeColor1[4];\n    float cubeColor2[4];\n} DebugHUD;\n\n#if __cplusplus\nextern \"C\" {\n#endif\n\nvoid DebugHUD_InitDefaults( DebugHUD *hud );\nvoid DebugHUD_DoInterface( DebugHUD *hud );\n\n#if __cplusplus\n}\n#endif\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/imgui_impl_ios.h",
    "content": "// ImGui iOS+OpenGL+Synergy binding\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// Providing a standalone iOS application with Synergy integration makes this sample more verbose than others. It also hasn't been tested as much.\n// Refer to other examples to get an easier understanding of how to integrate ImGui into your existing application.\n\n// by Joel Davis (joeld42@gmail.com)\n\n#pragma once\n\n#include <Foundation/Foundation.h>\n#include <UIKit/UIKit.h>\n\n@interface ImGuiHelper : NSObject\n\n- (id) initWithView: (UIView *)view;\n\n- (void)connectServer: (NSString*)serverName;\n\n- (void)render;\n- (void)newFrame;\n\n@end\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/imgui_impl_ios.mm",
    "content": "// ImGui iOS+OpenGL+Synergy binding\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// Providing a standalone iOS application with Synergy integration makes this sample more verbose than others. It also hasn't been tested as much.\n// Refer to other examples to get an easier understanding of how to integrate ImGui into your existing application.\n\n// TODO:\n// - Clipboard is not supported.\n\n#import <OpenGLES/ES3/gl.h>\n#import <OpenGLES/ES3/glext.h>\n\n#include <sys/time.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netdb.h>\n\n#include \"imgui_impl_ios.h\"\n#include \"imgui.h\"\n\n#include \"uSynergy.h\"\n\n// From Carbon HIToolbox/Events.h\n// FIXME: Keyboard mapping is hacked in because Synergy doesn't give us character but only keycode which aren't really portable if you consider keyboard locale. See https://github.com/ocornut/imgui/pull/247\nenum {\n    kVK_ANSI_A                    = 0x00,\n    kVK_ANSI_S                    = 0x01,\n    kVK_ANSI_D                    = 0x02,\n    kVK_ANSI_F                    = 0x03,\n    kVK_ANSI_H                    = 0x04,\n    kVK_ANSI_G                    = 0x05,\n    kVK_ANSI_Z                    = 0x06,\n    kVK_ANSI_X                    = 0x07,\n    kVK_ANSI_C                    = 0x08,\n    kVK_ANSI_V                    = 0x09,\n    kVK_ANSI_B                    = 0x0B,\n    kVK_ANSI_Q                    = 0x0C,\n    kVK_ANSI_W                    = 0x0D,\n    kVK_ANSI_E                    = 0x0E,\n    kVK_ANSI_R                    = 0x0F,\n    kVK_ANSI_Y                    = 0x10,\n    kVK_ANSI_T                    = 0x11,\n    kVK_ANSI_1                    = 0x12,\n    kVK_ANSI_2                    = 0x13,\n    kVK_ANSI_3                    = 0x14,\n    kVK_ANSI_4                    = 0x15,\n    kVK_ANSI_6                    = 0x16,\n    kVK_ANSI_5                    = 0x17,\n    kVK_ANSI_Equal                = 0x18,\n    kVK_ANSI_9                    = 0x19,\n    kVK_ANSI_7                    = 0x1A,\n    kVK_ANSI_Minus                = 0x1B,\n    kVK_ANSI_8                    = 0x1C,\n    kVK_ANSI_0                    = 0x1D,\n    kVK_ANSI_RightBracket         = 0x1E,\n    kVK_ANSI_O                    = 0x1F,\n    kVK_ANSI_U                    = 0x20,\n    kVK_ANSI_LeftBracket          = 0x21,\n    kVK_ANSI_I                    = 0x22,\n    kVK_ANSI_P                    = 0x23,\n    kVK_ANSI_L                    = 0x25,\n    kVK_ANSI_J                    = 0x26,\n    kVK_ANSI_Quote                = 0x27,\n    kVK_ANSI_K                    = 0x28,\n    kVK_ANSI_Semicolon            = 0x29,\n    kVK_ANSI_Backslash            = 0x2A,\n    kVK_ANSI_Comma                = 0x2B,\n    kVK_ANSI_Slash                = 0x2C,\n    kVK_ANSI_N                    = 0x2D,\n    kVK_ANSI_M                    = 0x2E,\n    kVK_ANSI_Period               = 0x2F,\n    kVK_ANSI_Grave                = 0x32,\n    kVK_ANSI_KeypadDecimal        = 0x41,\n    kVK_ANSI_KeypadMultiply       = 0x43,\n    kVK_ANSI_KeypadPlus           = 0x45,\n    kVK_ANSI_KeypadClear          = 0x47,\n    kVK_ANSI_KeypadDivide         = 0x4B,\n    kVK_ANSI_KeypadEnter          = 0x4C,\n    kVK_ANSI_KeypadMinus          = 0x4E,\n    kVK_ANSI_KeypadEquals         = 0x51,\n    kVK_ANSI_Keypad0              = 0x52,\n    kVK_ANSI_Keypad1              = 0x53,\n    kVK_ANSI_Keypad2              = 0x54,\n    kVK_ANSI_Keypad3              = 0x55,\n    kVK_ANSI_Keypad4              = 0x56,\n    kVK_ANSI_Keypad5              = 0x57,\n    kVK_ANSI_Keypad6              = 0x58,\n    kVK_ANSI_Keypad7              = 0x59,\n    kVK_ANSI_Keypad8              = 0x5B,\n    kVK_ANSI_Keypad9              = 0x5C\n};\n\n/* keycodes for keys that are independent of keyboard layout*/\nenum {\n    kVK_Return                    = 0x24,\n    kVK_Tab                       = 0x30,\n    kVK_Space                     = 0x31,\n    kVK_Delete                    = 0x33,\n    kVK_Escape                    = 0x35,\n    kVK_Command                   = 0x37,\n    kVK_Shift                     = 0x38,\n    kVK_CapsLock                  = 0x39,\n    kVK_Option                    = 0x3A,\n    kVK_Control                   = 0x3B,\n    kVK_RightShift                = 0x3C,\n    kVK_RightOption               = 0x3D,\n    kVK_RightControl              = 0x3E,\n    kVK_Function                  = 0x3F,\n    kVK_F17                       = 0x40,\n    kVK_VolumeUp                  = 0x48,\n    kVK_VolumeDown                = 0x49,\n    kVK_Mute                      = 0x4A,\n    kVK_F18                       = 0x4F,\n    kVK_F19                       = 0x50,\n    kVK_F20                       = 0x5A,\n    kVK_F5                        = 0x60,\n    kVK_F6                        = 0x61,\n    kVK_F7                        = 0x62,\n    kVK_F3                        = 0x63,\n    kVK_F8                        = 0x64,\n    kVK_F9                        = 0x65,\n    kVK_F11                       = 0x67,\n    kVK_F13                       = 0x69,\n    kVK_F16                       = 0x6A,\n    kVK_F14                       = 0x6B,\n    kVK_F10                       = 0x6D,\n    kVK_F12                       = 0x6F,\n    kVK_F15                       = 0x71,\n    kVK_Help                      = 0x72,\n    kVK_Home                      = 0x73,\n    kVK_PageUp                    = 0x74,\n    kVK_ForwardDelete             = 0x75,\n    kVK_F4                        = 0x76,\n    kVK_End                       = 0x77,\n    kVK_F2                        = 0x78,\n    kVK_PageDown                  = 0x79,\n    kVK_F1                        = 0x7A,\n    kVK_LeftArrow                 = 0x7B,\n    kVK_RightArrow                = 0x7C,\n    kVK_DownArrow                 = 0x7D,\n    kVK_UpArrow                   = 0x7E\n};\n\nstatic char g_keycodeCharUnshifted[256] = {};\nstatic char g_keycodeCharShifted[256] = {};\n\n//static double       g_Time = 0.0f;\nstatic bool         g_MousePressed[3] = { false, false, false };\nstatic float        g_mouseWheelX = 0.0f;\nstatic float        g_mouseWheelY = 0.0f;\n\nstatic GLuint       g_FontTexture = 0;\nstatic int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0;\nstatic int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;\nstatic int          g_AttribLocationPosition = 0, g_AttribLocationUV = 0, g_AttribLocationColor = 0;\nstatic size_t       g_VboSize = 0;\nstatic unsigned int g_VboHandle = 0, g_VaoHandle = 0;\nstatic float        g_displayScale;\n\nstatic int usynergy_sockfd;\nstatic bool g_synergyPtrActive = false;\nstatic uint16_t g_mousePosX = 0;\nstatic uint16_t g_mousePosY = 0;\n\nstatic void ImGui_ImplIOS_RenderDrawLists (ImDrawData *draw_data);\nbool ImGui_ImplIOS_CreateDeviceObjects();\n\nstatic NSString *g_serverName;\n\nuSynergyBool ImGui_ConnectFunc(uSynergyCookie cookie)\n{\n    // NOTE: You need to turn off \"Use SSL Encryption\" in Synergy preferences, since\n    // uSynergy does not support SSL.\n    \n    NSLog( @\"Connect Func!\");\n    struct addrinfo hints, *res;\n    \n    // first, load up address structs with getaddrinfo():\n    memset(&hints, 0, sizeof hints);\n    hints.ai_family = AF_UNSPEC;  // use IPv4 or IPv6, whichever\n    hints.ai_socktype = SOCK_STREAM;\n    \n    // get server address\n    getaddrinfo([g_serverName UTF8String], \"24800\", &hints, &res);\n    \n    if (!res)\n    {\n        NSLog( @\"Could not find server: %@\", g_serverName );\n        return USYNERGY_FALSE;\n    }\n    \n    // make a socket:\n    usynergy_sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n    \n    // connect it to the address and port we passed in to getaddrinfo():\n    int ret = connect(usynergy_sockfd, res->ai_addr, res->ai_addrlen);\n    if (!ret) {\n        NSLog( @\"Connect succeeded...\");\n    } else {\n        NSLog( @\"Connect failed, %d\", ret );\n    }\n    \n    \n    return USYNERGY_TRUE;\n}\n\nuSynergyBool ImGui_SendFunc(uSynergyCookie cookie, const uint8_t *buffer, int length)\n{\n//    NSLog( @\"Send Func\" );\n    send( usynergy_sockfd, buffer, length, 0 );\n    \n    return USYNERGY_TRUE;\n}\n\nuSynergyBool ImGui_RecvFunc(uSynergyCookie cookie, uint8_t *buffer, int maxLength, int* outLength)\n{\n    *outLength = (int)recv( usynergy_sockfd, buffer, maxLength, 0 );\n    \n    return USYNERGY_TRUE;\n}\n\nvoid ImGui_SleepFunc(uSynergyCookie cookie, int timeMs)\n{\n    usleep( timeMs * 1000 );\n}\n\nuint32_t ImGui_GetTimeFunc()\n{\n    struct timeval  tv;\n    gettimeofday(&tv, NULL);\n    \n    return (int32_t)((tv.tv_sec) * 1000 + (tv.tv_usec) / 1000);\n}\n\nvoid ImGui_TraceFunc(uSynergyCookie cookie, const char *text)\n{\n    puts(text);\n}\n\nvoid ImGui_ScreenActiveCallback(uSynergyCookie cookie, uSynergyBool active)\n{\n    g_synergyPtrActive = active;\n//    printf( \"Synergy: screen activate %s\\n\", active?\"YES\":\"NO\" );\n}\n\nvoid ImGui_MouseCallback(uSynergyCookie cookie, uint16_t x, uint16_t y, int16_t wheelX, int16_t wheelY,\n                         uSynergyBool buttonLeft, uSynergyBool buttonRight, uSynergyBool buttonMiddle)\n{\n//    printf(\"Synergy: mouse callback %d %d -- wheel %d %d\\n\", x, y,  wheelX, wheelY );\n    uSynergyContext *ctx = (uSynergyContext*)cookie;\n    g_mousePosX = x;\n    g_mousePosY = y;\n    g_mouseWheelX = wheelX;\n    g_mouseWheelY = wheelY;\n    g_MousePressed[0] = buttonLeft;\n    g_MousePressed[1] = buttonMiddle;\n    g_MousePressed[2] = buttonRight;\n    \n    ctx->m_mouseWheelX = 0;\n    ctx->m_mouseWheelY = 0;\n}\n\nvoid ImGui_KeyboardCallback(uSynergyCookie cookie, uint16_t key,\n                            uint16_t modifiers, uSynergyBool down, uSynergyBool repeat)\n{\n    int scanCode = key-1;\n//    printf(\"Synergy: keyboard callback: 0x%02X (%s)\", scanCode, down?\"true\":\"false\");\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeysDown[key] = down;\n    io.KeyShift = (modifiers & USYNERGY_MODIFIER_SHIFT);\n    io.KeyCtrl = (modifiers & USYNERGY_MODIFIER_CTRL);\n    io.KeyAlt = (modifiers & USYNERGY_MODIFIER_ALT);\n    io.KeySuper = (modifiers & USYNERGY_MODIFIER_WIN);\n    \n    // Add this as keyboard input\n    if ((down) && (key) && (scanCode<256) && !(modifiers & USYNERGY_MODIFIER_CTRL)) \n\t{\n        // If this key maps to a character input, apply it\n        int charForKeycode = (modifiers & USYNERGY_MODIFIER_SHIFT) ? g_keycodeCharShifted[scanCode] : g_keycodeCharUnshifted[scanCode];\n        io.AddInputCharacter((unsigned short)charForKeycode);\n    }\n    \n}\n\nvoid ImGui_JoystickCallback(uSynergyCookie cookie, uint8_t joyNum, uint16_t buttons, int8_t leftStickX, int8_t leftStickY, int8_t rightStickX, int8_t rightStickY)\n{\n    printf(\"Synergy: joystick callback TODO\\n\");\n}\n\nvoid ImGui_ClipboardCallback(uSynergyCookie cookie, enum uSynergyClipboardFormat format, const uint8_t *data, uint32_t size)\n{\n    printf(\"Synergy: clipboard callback TODO\\n\" );\n}\n\n@interface ImGuiHelper ()\n{\n    BOOL _mouseDown;\n    BOOL _mouseTapped;\n    CGPoint _touchPos;\n\n    uSynergyContext _synergyCtx;\n    dispatch_queue_t _synergyQueue;\n}\n@property (nonatomic, weak) UIView *view;\n@property (nonatomic, strong) NSString *serverName;\n\n@end\n\n@implementation ImGuiHelper\n\n- (id) initWithView: (UIView *)view\n{\n    self = [super init];\n    if (self)\n    {\n        self.view = view;\n\n        [self setupImGuiHooks];\n    }\n    return self;\n}\n\n- (void)setupKeymaps\n{\n    // The keyboard mapping is a big headache. I tried for a while to find a better way to do this,\n    // but this was the best I could come up with. There are some device independent API's available\n    // to convert scan codes to unicode characters, but these are only available on mac and not\n    // on iOS as far as I can tell (it's part of Carbon). I didn't see any better way to do\n    // this or  any way to get the character codes out of usynergy.\n    g_keycodeCharUnshifted[ kVK_ANSI_A ]='a';\n    g_keycodeCharUnshifted[ kVK_ANSI_S ]='s';\n    g_keycodeCharUnshifted[ kVK_ANSI_D ]='d';\n    g_keycodeCharUnshifted[ kVK_ANSI_F ]='f';\n    g_keycodeCharUnshifted[ kVK_ANSI_H ]='h';\n    g_keycodeCharUnshifted[ kVK_ANSI_G ]='g';\n    g_keycodeCharUnshifted[ kVK_ANSI_Z ]='z';\n    g_keycodeCharUnshifted[ kVK_ANSI_X ]='x';\n    g_keycodeCharUnshifted[ kVK_ANSI_C ]='c';\n    g_keycodeCharUnshifted[ kVK_ANSI_V ]='v';\n    g_keycodeCharUnshifted[ kVK_ANSI_B ]='b';\n    g_keycodeCharUnshifted[ kVK_ANSI_Q ]='q';\n    g_keycodeCharUnshifted[ kVK_ANSI_W ]='w';\n    g_keycodeCharUnshifted[ kVK_ANSI_E ]='e';\n    g_keycodeCharUnshifted[ kVK_ANSI_R ]='r';\n    g_keycodeCharUnshifted[ kVK_ANSI_Y ]='y';\n    g_keycodeCharUnshifted[ kVK_ANSI_T ]='t';\n    g_keycodeCharUnshifted[ kVK_ANSI_1 ]='1';\n    g_keycodeCharUnshifted[ kVK_ANSI_2 ]='2';\n    g_keycodeCharUnshifted[ kVK_ANSI_3 ]='3';\n    g_keycodeCharUnshifted[ kVK_ANSI_4 ]='4';\n    g_keycodeCharUnshifted[ kVK_ANSI_6 ]='6';\n    g_keycodeCharUnshifted[ kVK_ANSI_5 ]='5';\n    g_keycodeCharUnshifted[ kVK_ANSI_Equal ]='=';\n    g_keycodeCharUnshifted[ kVK_ANSI_9 ]='9';\n    g_keycodeCharUnshifted[ kVK_ANSI_7 ]='7';\n    g_keycodeCharUnshifted[ kVK_ANSI_Minus ]='-';\n    g_keycodeCharUnshifted[ kVK_ANSI_8 ]='8';\n    g_keycodeCharUnshifted[ kVK_ANSI_0 ]='0';\n    g_keycodeCharUnshifted[ kVK_ANSI_RightBracket ]=']';\n    g_keycodeCharUnshifted[ kVK_ANSI_O ]='o';\n    g_keycodeCharUnshifted[ kVK_ANSI_U ]='u';\n    g_keycodeCharUnshifted[ kVK_ANSI_LeftBracket ]='[';\n    g_keycodeCharUnshifted[ kVK_ANSI_I ]='i';\n    g_keycodeCharUnshifted[ kVK_ANSI_P ]='p';\n    g_keycodeCharUnshifted[ kVK_ANSI_L ]='l';\n    g_keycodeCharUnshifted[ kVK_ANSI_J ]='j';\n    g_keycodeCharUnshifted[ kVK_ANSI_Quote ]='\\'';\n    g_keycodeCharUnshifted[ kVK_ANSI_K ]='k';\n    g_keycodeCharUnshifted[ kVK_ANSI_Semicolon ]=';';\n    g_keycodeCharUnshifted[ kVK_ANSI_Backslash ]='\\\\';\n    g_keycodeCharUnshifted[ kVK_ANSI_Comma ]=',';\n    g_keycodeCharUnshifted[ kVK_ANSI_Slash ]='/';\n    g_keycodeCharUnshifted[ kVK_ANSI_N ]='n';\n    g_keycodeCharUnshifted[ kVK_ANSI_M ]='m';\n    g_keycodeCharUnshifted[ kVK_ANSI_Period ]='.';\n    g_keycodeCharUnshifted[ kVK_ANSI_Grave ]='`';\n    g_keycodeCharUnshifted[ kVK_ANSI_KeypadDecimal ]='.';\n    g_keycodeCharUnshifted[ kVK_ANSI_KeypadMultiply ]='*';\n    g_keycodeCharUnshifted[ kVK_ANSI_KeypadPlus ]='+';\n    g_keycodeCharUnshifted[ kVK_ANSI_KeypadDivide ]='/';\n    g_keycodeCharUnshifted[ kVK_ANSI_KeypadEnter ]='\\n';\n    g_keycodeCharUnshifted[ kVK_ANSI_KeypadMinus ]='-';\n    g_keycodeCharUnshifted[ kVK_ANSI_KeypadEquals ]='=';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad0 ]='0';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad1 ]='1';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad2 ]='2';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad3 ]='3';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad4 ]='4';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad5 ]='5';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad6 ]='6';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad7 ]='7';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad8 ]='8';\n    g_keycodeCharUnshifted[ kVK_ANSI_Keypad9 ]='9';\n    g_keycodeCharUnshifted[ kVK_Space ]=' ';\n    \n    g_keycodeCharShifted[ kVK_ANSI_A ]='A';\n    g_keycodeCharShifted[ kVK_ANSI_S ]='S';\n    g_keycodeCharShifted[ kVK_ANSI_D ]='D';\n    g_keycodeCharShifted[ kVK_ANSI_F ]='F';\n    g_keycodeCharShifted[ kVK_ANSI_H ]='H';\n    g_keycodeCharShifted[ kVK_ANSI_G ]='G';\n    g_keycodeCharShifted[ kVK_ANSI_Z ]='Z';\n    g_keycodeCharShifted[ kVK_ANSI_X ]='X';\n    g_keycodeCharShifted[ kVK_ANSI_C ]='C';\n    g_keycodeCharShifted[ kVK_ANSI_V ]='V';\n    g_keycodeCharShifted[ kVK_ANSI_B ]='B';\n    g_keycodeCharShifted[ kVK_ANSI_Q ]='Q';\n    g_keycodeCharShifted[ kVK_ANSI_W ]='W';\n    g_keycodeCharShifted[ kVK_ANSI_E ]='E';\n    g_keycodeCharShifted[ kVK_ANSI_R ]='R';\n    g_keycodeCharShifted[ kVK_ANSI_Y ]='Y';\n    g_keycodeCharShifted[ kVK_ANSI_T ]='T';\n    g_keycodeCharShifted[ kVK_ANSI_1 ]='!';\n    g_keycodeCharShifted[ kVK_ANSI_2 ]='@';\n    g_keycodeCharShifted[ kVK_ANSI_3 ]='#';\n    g_keycodeCharShifted[ kVK_ANSI_4 ]='$';\n    g_keycodeCharShifted[ kVK_ANSI_6 ]='^';\n    g_keycodeCharShifted[ kVK_ANSI_5 ]='%';\n    g_keycodeCharShifted[ kVK_ANSI_Equal ]='+';\n    g_keycodeCharShifted[ kVK_ANSI_9 ]='(';\n    g_keycodeCharShifted[ kVK_ANSI_7 ]='&';\n    g_keycodeCharShifted[ kVK_ANSI_Minus ]='_';\n    g_keycodeCharShifted[ kVK_ANSI_8 ]='*';\n    g_keycodeCharShifted[ kVK_ANSI_0 ]=')';\n    g_keycodeCharShifted[ kVK_ANSI_RightBracket ]='}';\n    g_keycodeCharShifted[ kVK_ANSI_O ]='O';\n    g_keycodeCharShifted[ kVK_ANSI_U ]='U';\n    g_keycodeCharShifted[ kVK_ANSI_LeftBracket ]='{';\n    g_keycodeCharShifted[ kVK_ANSI_I ]='I';\n    g_keycodeCharShifted[ kVK_ANSI_P ]='P';\n    g_keycodeCharShifted[ kVK_ANSI_L ]='L';\n    g_keycodeCharShifted[ kVK_ANSI_J ]='J';\n    g_keycodeCharShifted[ kVK_ANSI_Quote ]='\\\"';\n    g_keycodeCharShifted[ kVK_ANSI_K ]='K';\n    g_keycodeCharShifted[ kVK_ANSI_Semicolon ]=':';\n    g_keycodeCharShifted[ kVK_ANSI_Backslash ]='|';\n    g_keycodeCharShifted[ kVK_ANSI_Comma ]='<';\n    g_keycodeCharShifted[ kVK_ANSI_Slash ]='?';\n    g_keycodeCharShifted[ kVK_ANSI_N ]='N';\n    g_keycodeCharShifted[ kVK_ANSI_M ]='M';\n    g_keycodeCharShifted[ kVK_ANSI_Period ]='>';\n    g_keycodeCharShifted[ kVK_ANSI_Grave ]='~';\n    g_keycodeCharShifted[ kVK_ANSI_KeypadDecimal ]='.';\n    g_keycodeCharShifted[ kVK_ANSI_KeypadMultiply ]='*';\n    g_keycodeCharShifted[ kVK_ANSI_KeypadPlus ]='+';\n    g_keycodeCharShifted[ kVK_ANSI_KeypadDivide ]='/';\n    g_keycodeCharShifted[ kVK_ANSI_KeypadEnter ]='\\n';\n    g_keycodeCharShifted[ kVK_ANSI_KeypadMinus ]='-';\n    g_keycodeCharShifted[ kVK_ANSI_KeypadEquals ]='=';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad0 ]='0';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad1 ]='1';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad2 ]='2';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad3 ]='3';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad4 ]='4';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad5 ]='5';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad6 ]='6';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad7 ]='7';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad8 ]='8';\n    g_keycodeCharShifted[ kVK_ANSI_Keypad9 ]='9';\n    g_keycodeCharShifted[ kVK_Space ]=' ';\n}\n\n- (void)setupImGuiHooks\n{\n    ImGuiIO &io = ImGui::GetIO();\n    \n    [self setupKeymaps];\n    \n    // Account for retina display for glScissor\n    g_displayScale = [[UIScreen mainScreen] scale];\n    \n    ImGuiStyle &style = ImGui::GetStyle();\n    style.TouchExtraPadding = ImVec2( 4.0, 4.0 );\n    \n    io.RenderDrawListsFn = ImGui_ImplIOS_RenderDrawLists;\n    \n    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(viewDidPan:) ];\n    [self.view addGestureRecognizer:panRecognizer];\n    \n    UITapGestureRecognizer *tapRecoginzer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector( viewDidTap:)];\n    [self.view addGestureRecognizer:tapRecoginzer];\n    \n    // Fill out the Synergy key map\n    // (for some reason synergy scan codes are off by 1)\n    io.KeyMap[ImGuiKey_Tab] = kVK_Tab+1;\n    io.KeyMap[ImGuiKey_LeftArrow] = kVK_LeftArrow+1;\n    io.KeyMap[ImGuiKey_RightArrow] = kVK_RightArrow+1;\n    io.KeyMap[ImGuiKey_UpArrow] = kVK_UpArrow+1;\n    io.KeyMap[ImGuiKey_DownArrow] = kVK_DownArrow+1;\n    io.KeyMap[ImGuiKey_Home] = kVK_Home+1;\n    io.KeyMap[ImGuiKey_End] = kVK_End+1;\n    io.KeyMap[ImGuiKey_Delete] = kVK_ForwardDelete+1;\n    io.KeyMap[ImGuiKey_Backspace] = kVK_Delete+1;\n    io.KeyMap[ImGuiKey_Enter] = kVK_Return+1;\n    io.KeyMap[ImGuiKey_Escape] = kVK_Escape+1;\n    io.KeyMap[ImGuiKey_A] = kVK_ANSI_A+1;\n    io.KeyMap[ImGuiKey_C] = kVK_ANSI_C+1;\n    io.KeyMap[ImGuiKey_V] = kVK_ANSI_V+1;\n    io.KeyMap[ImGuiKey_X] = kVK_ANSI_X+1;\n    io.KeyMap[ImGuiKey_Y] = kVK_ANSI_Y+1;\n    io.KeyMap[ImGuiKey_Z] = kVK_ANSI_Z+1;\n}\n\n- (void)connectServer: (NSString*)serverName\n{\n    self.serverName = serverName;\n    g_serverName = serverName;\n    \n    // Init synergy\n    NSString *bundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];\n    \n    uSynergyInit( &_synergyCtx );\n    _synergyCtx.m_clientName = strdup( [bundleName UTF8String] );\n    _synergyCtx.m_clientWidth = self.view.bounds.size.width;\n    _synergyCtx.m_clientHeight = self.view.bounds.size.height;\n    \n    _synergyCtx.m_connectFunc = ImGui_ConnectFunc;\n    _synergyCtx.m_sendFunc = ImGui_SendFunc;\n    _synergyCtx.m_receiveFunc = ImGui_RecvFunc;\n    _synergyCtx.m_sleepFunc = ImGui_SleepFunc;\n    _synergyCtx.m_traceFunc = ImGui_TraceFunc;\n    _synergyCtx.m_getTimeFunc = ImGui_GetTimeFunc;\n    \n    _synergyCtx.m_traceFunc = ImGui_TraceFunc;\n    _synergyCtx.m_screenActiveCallback = ImGui_ScreenActiveCallback;\n    _synergyCtx.m_mouseCallback = ImGui_MouseCallback;\n    _synergyCtx.m_keyboardCallback = ImGui_KeyboardCallback;\n    \n    _synergyCtx.m_cookie = (uSynergyCookie)&_synergyCtx;\n    \n    // Create a background thread for synergy\n    _synergyQueue = dispatch_queue_create( \"imgui-usynergy\", NULL );\n    dispatch_async( _synergyQueue, ^{\n        while (1) {\n            uSynergyUpdate( &_synergyCtx );\n        }\n    });\n}\n\n\n- (void)viewDidPan: (UIPanGestureRecognizer *)recognizer\n{\n    \n    if ((recognizer.state == UIGestureRecognizerStateBegan) ||\n        (recognizer.state == UIGestureRecognizerStateChanged))\n    {\n        _mouseDown = YES;\n        _touchPos = [recognizer locationInView:self.view];\n    }\n    else\n    {\n        _mouseDown = NO;\n        _touchPos = CGPointMake( -1, -1 );\n    }\n}\n\n- (void)viewDidTap: (UITapGestureRecognizer*)recognizer\n{\n    _touchPos = [recognizer locationInView:self.view];\n    _mouseTapped = YES;\n}\n    \n- (void)render\n{\n    ImGui::Render();\n}\n\n- (void)newFrame\n{\n    ImGuiIO& io = ImGui::GetIO();\n    ImGuiStyle &style = ImGui::GetStyle();\n    \n    if (!g_FontTexture)\n    {\n        ImGui_ImplIOS_CreateDeviceObjects();\n    }\n    \n    io.DisplaySize = ImVec2( _view.bounds.size.width, _view.bounds.size.height );\n\n    io.MouseDrawCursor = g_synergyPtrActive;\n    if (g_synergyPtrActive)\n    {\n        style.TouchExtraPadding = ImVec2( 0.0, 0.0 );\n        io.MousePos = ImVec2( g_mousePosX, g_mousePosY );\n        for (int i=0; i < 3; i++)\n        {\n            io.MouseDown[i] = g_MousePressed[i];\n        }\n\n        // This is an arbitrary scaling factor that works for me. Not sure what units these\n        // mousewheel values from synergy are supposed to be in\n        io.MouseWheel = g_mouseWheelY / 500.0;\n    }\n    else\n    {\n        // Synergy not active, use touch events\n        style.TouchExtraPadding = ImVec2( 4.0, 4.0 );\n        io.MousePos = ImVec2(_touchPos.x, _touchPos.y );\n        if ((_mouseDown) || (_mouseTapped))\n        {\n            io.MouseDown[0] = true;\n            _mouseTapped = NO;\n        }\n        else\n        {\n            io.MouseDown[0] = false;\n        }\n    }\n    \n    ImGui::NewFrame();\n}\n@end\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\n// If text or lines are blurry when integrating ImGui in your engine:\n// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)\n// NOTE: this is copied pretty much entirely from the opengl3_example, with only minor changes for ES\nstatic void ImGui_ImplIOS_RenderDrawLists (ImDrawData *draw_data)\n{\n    // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled\n\t// FIXME: Backport changes from imgui_impl_glfw_gl3.cpp\n    GLint last_program, last_texture;\n    glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);\n    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    glEnable(GL_BLEND);\n    glBlendEquation(GL_FUNC_ADD);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n    \n    glDisable(GL_CULL_FACE);\n    glDisable(GL_DEPTH_TEST);\n    glEnable(GL_SCISSOR_TEST);\n    glActiveTexture(GL_TEXTURE0);\n    \n    // Setup orthographic projection matrix\n    const float width = ImGui::GetIO().DisplaySize.x;\n    const float height = ImGui::GetIO().DisplaySize.y;\n    const float ortho_projection[4][4] =\n    {\n        { 2.0f/width,\t0.0f,\t\t\t0.0f,\t\t0.0f },\n        { 0.0f,\t\t\t2.0f/-height,\t0.0f,\t\t0.0f },\n        { 0.0f,\t\t\t0.0f,\t\t\t-1.0f,\t\t0.0f },\n        { -1.0f,\t\t1.0f,\t\t\t0.0f,\t\t1.0f },\n    };\n    glUseProgram(g_ShaderHandle);\n    glUniform1i(g_AttribLocationTex, 0);\n    glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);\n    glBindVertexArray(g_VaoHandle);\n    \n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        ImDrawList* cmd_list = draw_data->CmdLists[n];\n        ImDrawIdx* idx_buffer = &cmd_list->IdxBuffer.front();\n        \n        glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);\n        const int needed_vtx_size = cmd_list->VtxBuffer.Size * sizeof(ImDrawVert);\n        if (g_VboSize < needed_vtx_size)\n        {\n            // Grow our buffer if needed\n            g_VboSize = needed_vtx_size + 2000 * sizeof(ImDrawVert);\n            glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)g_VboSize, NULL, GL_STREAM_DRAW);\n        }\n\n        unsigned char* vtx_data = (unsigned char*)glMapBufferRange(GL_ARRAY_BUFFER, 0, needed_vtx_size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);\n        if (!vtx_data)\n            continue;\n        memcpy(vtx_data, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));\n        glUnmapBuffer(GL_ARRAY_BUFFER);\n        \n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);\n                glScissor((int)(pcmd->ClipRect.x * g_displayScale),\n                          (int)((height - pcmd->ClipRect.w) * g_displayScale),\n                          (int)((pcmd->ClipRect.z - pcmd->ClipRect.x) * g_displayScale),\n                          (int)((pcmd->ClipRect.w - pcmd->ClipRect.y) * g_displayScale));\n                glDrawElements( GL_TRIANGLES, (GLsizei)pcmd->ElemCount, GL_UNSIGNED_SHORT, idx_buffer );\n            }\n            idx_buffer += pcmd->ElemCount;\n        }\n    }\n    \n    // Restore modified state\n    glBindVertexArray(0);\n    glBindBuffer( GL_ARRAY_BUFFER, 0);\n    glEnable(GL_CULL_FACE);\n    glEnable(GL_DEPTH_TEST);\n    glUseProgram(last_program);\n    glDisable(GL_SCISSOR_TEST);\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n}\n\nvoid ImGui_ImplIOS_CreateFontsTexture()\n{\n    // Build texture atlas\n    ImGuiIO& io = ImGui::GetIO();\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);   // Load as RGBA 32-bits for OpenGL3 demo because it is more likely to be compatible with user's existing shader.\n    \n    // Upload texture to graphics system\n    GLint last_texture;\n    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    glGenTextures(1, &g_FontTexture);\n    glBindTexture(GL_TEXTURE_2D, g_FontTexture);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);\n    \n    // Store our identifier\n    io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;\n\n    // Restore state\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n}\n\nbool ImGui_ImplIOS_CreateDeviceObjects()\n{\n    const GLchar *vertex_shader =\n    \"uniform mat4 ProjMtx;\\n\"\n    \"attribute highp vec2 Position;\\n\"\n    \"attribute highp vec2 UV;\\n\"\n    \"attribute highp vec4 Color;\\n\"\n    \"varying vec2 Frag_UV;\\n\"\n    \"varying vec4 Frag_Color;\\n\"\n    \"void main()\\n\"\n    \"{\\n\"\n    \"\tFrag_UV = UV;\\n\"\n    \"\tFrag_Color = Color;\\n\"\n    \"\tgl_Position = ProjMtx * vec4(Position.xy,0,1);\\n\"\n    \"}\\n\";\n    \n    const GLchar* fragment_shader =\n    \"uniform sampler2D Texture;\\n\"\n    \"varying highp vec2 Frag_UV;\\n\"\n    \"varying highp vec4 Frag_Color;\\n\"\n    \"void main()\\n\"\n    \"{\\n\"\n    \"\tgl_FragColor = Frag_Color * texture2D( Texture, Frag_UV.st);\\n\"\n    \"}\\n\";\n    \n    g_ShaderHandle = glCreateProgram();\n    g_VertHandle = glCreateShader(GL_VERTEX_SHADER);\n    g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(g_VertHandle, 1, &vertex_shader, 0);\n    glShaderSource(g_FragHandle, 1, &fragment_shader, 0);\n    glCompileShader(g_VertHandle);\n    \n#if defined(DEBUG)\n    GLint logLength;\n    glGetShaderiv( g_VertHandle, GL_INFO_LOG_LENGTH, &logLength);\n    if (logLength > 0) {\n        GLchar *log = (GLchar *)malloc(logLength);\n        glGetShaderInfoLog(g_VertHandle, logLength, &logLength, log);\n        NSLog(@\"VERTEX Shader compile log:\\n%s\", log);\n        free(log);\n    }\n#endif\n    \n    glCompileShader(g_FragHandle);\n    \n#if defined(DEBUG)\n    glGetShaderiv( g_FragHandle, GL_INFO_LOG_LENGTH, &logLength);\n    if (logLength > 0) {\n        GLchar *log = (GLchar *)malloc(logLength);\n        glGetShaderInfoLog(g_FragHandle, logLength, &logLength, log);\n        NSLog(@\"FRAGMENT Shader compile log:\\n%s\", log);\n        free(log);\n    }\n#endif\n    \n    glAttachShader(g_ShaderHandle, g_VertHandle);\n    glAttachShader(g_ShaderHandle, g_FragHandle);\n    glLinkProgram(g_ShaderHandle);\n    \n    g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, \"Texture\");\n    g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, \"ProjMtx\");\n    g_AttribLocationPosition = glGetAttribLocation(g_ShaderHandle, \"Position\");\n    g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, \"UV\");\n    g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, \"Color\");\n    \n    glGenBuffers(1, &g_VboHandle);\n    \n    glGenVertexArrays(1, &g_VaoHandle);\n    glBindVertexArray(g_VaoHandle);\n    glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);\n    glEnableVertexAttribArray(g_AttribLocationPosition);\n    glEnableVertexAttribArray(g_AttribLocationUV);\n    glEnableVertexAttribArray(g_AttribLocationColor);\n    \n#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))\n    glVertexAttribPointer(g_AttribLocationPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, pos));\n    glVertexAttribPointer(g_AttribLocationUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, uv));\n    glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, col));\n#undef OFFSETOF\n    glBindVertexArray(0);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n    \n    ImGui_ImplIOS_CreateFontsTexture();\n    \n    return true;\n}\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-ios/main.m",
    "content": "//\n//  main.m\n//  imguiex\n//\n\n#import <UIKit/UIKit.h>\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n    @autoreleasepool {\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n    }\n}\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-osx/AppDelegate.h",
    "content": "//\n//  AppDelegate.h\n//  imguiex-osx\n//\n//  Created by James Chen on 4/5/16.\n//  Copyright © 2016 Joel Davis. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface AppDelegate : NSObject <NSApplicationDelegate>\n\n\n@end\n\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-osx/AppDelegate.m",
    "content": "//\n//  AppDelegate.m\n//  imguiex-osx\n//\n//  Created by James Chen on 4/5/16.\n//  Copyright © 2016 Joel Davis. All rights reserved.\n//\n\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@property (weak) IBOutlet NSWindow *window;\n@end\n\n@implementation AppDelegate\n\n- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {\n    // Insert code here to initialize your application\n}\n\n- (void)applicationWillTerminate:(NSNotification *)aNotification {\n    // Insert code here to tear down your application\n}\n\n@end\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-osx/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"icon_imgui_180x180.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-osx/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-osx/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2016 Joel Davis. All rights reserved.</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex-osx/main.m",
    "content": "//\n//  main.m\n//  imguiex-osx\n//\n//  Created by James Chen on 4/5/16.\n//  Copyright © 2016 Joel Davis. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\nint main(int argc, const char * argv[]) {\n    return NSApplicationMain(argc, argv);\n}\n"
  },
  {
    "path": "external/imgui/examples/apple_example/imguiex.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t197E1E871B8943FE00E3FE6A /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */; };\n\t\t197E1E891B89443600E3FE6A /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E881B89443600E3FE6A /* imgui_demo.cpp */; };\n\t\t1A1A0F231CB39FB50090F036 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1A0F221CB39FB50090F036 /* AppDelegate.m */; };\n\t\t1A1A0F281CB39FB50090F036 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A1A0F271CB39FB50090F036 /* Assets.xcassets */; };\n\t\t1A1A0F301CB3A0DA0090F036 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */; };\n\t\t1A1A0F311CB3A0DA0090F036 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5861B2E64AB00C130BA /* imgui.cpp */; };\n\t\t1A1A0F321CB3A0DE0090F036 /* uSynergy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6D1E39151B35EEF10017B40F /* uSynergy.c */; };\n\t\t1A1A0F331CB3A0E10090F036 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E881B89443600E3FE6A /* imgui_demo.cpp */; };\n\t\t1A1A0F341CB3A0EC0090F036 /* debug_hud.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5891B2E6A5500C130BA /* debug_hud.cpp */; };\n\t\t1A1A0F481CB3A2E50090F036 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A1A0F391CB3A1B20090F036 /* main.cpp */; };\n\t\t1A1A0F4A1CB3A5070090F036 /* imgui_impl_glfw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A1A0F371CB3A1B20090F036 /* imgui_impl_glfw.cpp */; };\n\t\t1A1A0F4E1CB3C54D0090F036 /* libglfw3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A1A0F4D1CB3C54D0090F036 /* libglfw3.dylib */; };\n\t\t6D1E39171B35EEF10017B40F /* uSynergy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6D1E39151B35EEF10017B40F /* uSynergy.c */; };\n\t\t6D2FC55A1B2E632000C130BA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5591B2E632000C130BA /* main.m */; };\n\t\t6D2FC55D1B2E632000C130BA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC55C1B2E632000C130BA /* AppDelegate.m */; };\n\t\t6D2FC55F1B2E632000C130BA /* Shader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC55E1B2E632000C130BA /* Shader.fsh */; };\n\t\t6D2FC5611B2E632000C130BA /* Shader.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC5601B2E632000C130BA /* Shader.vsh */; };\n\t\t6D2FC5641B2E632000C130BA /* GameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5631B2E632000C130BA /* GameViewController.m */; };\n\t\t6D2FC5671B2E632000C130BA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC5651B2E632000C130BA /* Main.storyboard */; };\n\t\t6D2FC5691B2E632000C130BA /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC5681B2E632000C130BA /* Images.xcassets */; };\n\t\t6D2FC56C1B2E632000C130BA /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC56A1B2E632000C130BA /* LaunchScreen.xib */; };\n\t\t6D2FC5831B2E63A100C130BA /* imgui_impl_ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5811B2E63A100C130BA /* imgui_impl_ios.mm */; };\n\t\t6D2FC5881B2E64AB00C130BA /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5861B2E64AB00C130BA /* imgui.cpp */; };\n\t\t6D2FC58B1B2E6A5500C130BA /* debug_hud.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5891B2E6A5500C130BA /* debug_hud.cpp */; };\n\t\t6D2FC5911B30773F00C130BA /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D2FC5901B30773F00C130BA /* CFNetwork.framework */; };\n\t\t6D2FC5931B30774900C130BA /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D2FC5921B30774900C130BA /* SystemConfiguration.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = \"<group>\"; };\n\t\t197E1E881B89443600E3FE6A /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../../imgui_demo.cpp; sourceTree = \"<group>\"; };\n\t\t1A1A0F1F1CB39FB50090F036 /* imguiex-osx.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"imguiex-osx.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1A1A0F211CB39FB50090F036 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t1A1A0F221CB39FB50090F036 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t1A1A0F271CB39FB50090F036 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t1A1A0F2C1CB39FB50090F036 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1A1A0F371CB3A1B20090F036 /* imgui_impl_glfw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = imgui_impl_glfw.cpp; sourceTree = \"<group>\"; };\n\t\t1A1A0F381CB3A1B20090F036 /* imgui_impl_glfw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = imgui_impl_glfw.h; sourceTree = \"<group>\"; };\n\t\t1A1A0F391CB3A1B20090F036 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = \"<group>\"; };\n\t\t1A1A0F4D1CB3C54D0090F036 /* libglfw3.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libglfw3.dylib; path = /usr/local/lib/libglfw3.dylib; sourceTree = \"<absolute>\"; };\n\t\t6D1E39151B35EEF10017B40F /* uSynergy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uSynergy.c; sourceTree = \"<group>\"; };\n\t\t6D1E39161B35EEF10017B40F /* uSynergy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uSynergy.h; sourceTree = \"<group>\"; };\n\t\t6D2FC5541B2E632000C130BA /* imguiex-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"imguiex-ios.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6D2FC5581B2E632000C130BA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t6D2FC5591B2E632000C130BA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t6D2FC55B1B2E632000C130BA /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t6D2FC55C1B2E632000C130BA /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t6D2FC55E1B2E632000C130BA /* Shader.fsh */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = Shader.fsh; path = Shaders/Shader.fsh; sourceTree = \"<group>\"; };\n\t\t6D2FC5601B2E632000C130BA /* Shader.vsh */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = Shader.vsh; path = Shaders/Shader.vsh; sourceTree = \"<group>\"; };\n\t\t6D2FC5621B2E632000C130BA /* GameViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GameViewController.h; sourceTree = \"<group>\"; };\n\t\t6D2FC5631B2E632000C130BA /* GameViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GameViewController.m; sourceTree = \"<group>\"; };\n\t\t6D2FC5661B2E632000C130BA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t6D2FC5681B2E632000C130BA /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t6D2FC56B1B2E632000C130BA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t6D2FC5811B2E63A100C130BA /* imgui_impl_ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = imgui_impl_ios.mm; sourceTree = \"<group>\"; };\n\t\t6D2FC5821B2E63A100C130BA /* imgui_impl_ios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = imgui_impl_ios.h; sourceTree = \"<group>\"; };\n\t\t6D2FC5851B2E64AB00C130BA /* imconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imconfig.h; path = ../../imconfig.h; sourceTree = \"<group>\"; };\n\t\t6D2FC5861B2E64AB00C130BA /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../imgui.cpp; sourceTree = \"<group>\"; };\n\t\t6D2FC5871B2E64AB00C130BA /* imgui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui.h; path = ../../imgui.h; sourceTree = \"<group>\"; };\n\t\t6D2FC5891B2E6A5500C130BA /* debug_hud.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug_hud.cpp; sourceTree = \"<group>\"; };\n\t\t6D2FC58A1B2E6A5500C130BA /* debug_hud.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug_hud.h; sourceTree = \"<group>\"; };\n\t\t6D2FC5901B30773F00C130BA /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };\n\t\t6D2FC5921B30774900C130BA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1A1A0F1C1CB39FB50090F036 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A1A0F4E1CB3C54D0090F036 /* libglfw3.dylib in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6D2FC5511B2E632000C130BA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6D2FC5931B30774900C130BA /* SystemConfiguration.framework in Frameworks */,\n\t\t\t\t6D2FC5911B30773F00C130BA /* CFNetwork.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1A1A0F201CB39FB50090F036 /* imguiex-osx */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1A1A0F4D1CB3C54D0090F036 /* libglfw3.dylib */,\n\t\t\t\t1A1A0F351CB3A1B20090F036 /* opengl2_example */,\n\t\t\t\t1A1A0F211CB39FB50090F036 /* AppDelegate.h */,\n\t\t\t\t1A1A0F221CB39FB50090F036 /* AppDelegate.m */,\n\t\t\t\t1A1A0F271CB39FB50090F036 /* Assets.xcassets */,\n\t\t\t\t1A1A0F2C1CB39FB50090F036 /* Info.plist */,\n\t\t\t\t1A1A0F241CB39FB50090F036 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = \"imguiex-osx\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A1A0F241CB39FB50090F036 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A1A0F351CB3A1B20090F036 /* opengl2_example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1A1A0F371CB3A1B20090F036 /* imgui_impl_glfw.cpp */,\n\t\t\t\t1A1A0F381CB3A1B20090F036 /* imgui_impl_glfw.h */,\n\t\t\t\t1A1A0F391CB3A1B20090F036 /* main.cpp */,\n\t\t\t);\n\t\t\tname = opengl2_example;\n\t\t\tpath = ../../opengl2_example;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6D1E39141B35EEF10017B40F /* usynergy */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6D1E39151B35EEF10017B40F /* uSynergy.c */,\n\t\t\t\t6D1E39161B35EEF10017B40F /* uSynergy.h */,\n\t\t\t);\n\t\t\tname = usynergy;\n\t\t\tpath = ../libs/usynergy;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6D2FC54B1B2E632000C130BA = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6D1E39141B35EEF10017B40F /* usynergy */,\n\t\t\t\t6D2FC5841B2E648D00C130BA /* imgui */,\n\t\t\t\t6D2FC5561B2E632000C130BA /* imguiex-ios */,\n\t\t\t\t1A1A0F201CB39FB50090F036 /* imguiex-osx */,\n\t\t\t\t6D2FC5551B2E632000C130BA /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6D2FC5551B2E632000C130BA /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6D2FC5541B2E632000C130BA /* imguiex-ios.app */,\n\t\t\t\t1A1A0F1F1CB39FB50090F036 /* imguiex-osx.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6D2FC5561B2E632000C130BA /* imguiex-ios */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6D2FC5811B2E63A100C130BA /* imgui_impl_ios.mm */,\n\t\t\t\t6D2FC5821B2E63A100C130BA /* imgui_impl_ios.h */,\n\t\t\t\t197E1E881B89443600E3FE6A /* imgui_demo.cpp */,\n\t\t\t\t6D2FC5891B2E6A5500C130BA /* debug_hud.cpp */,\n\t\t\t\t6D2FC58A1B2E6A5500C130BA /* debug_hud.h */,\n\t\t\t\t6D2FC55B1B2E632000C130BA /* AppDelegate.h */,\n\t\t\t\t6D2FC55C1B2E632000C130BA /* AppDelegate.m */,\n\t\t\t\t6D2FC55E1B2E632000C130BA /* Shader.fsh */,\n\t\t\t\t6D2FC5601B2E632000C130BA /* Shader.vsh */,\n\t\t\t\t6D2FC5621B2E632000C130BA /* GameViewController.h */,\n\t\t\t\t6D2FC5631B2E632000C130BA /* GameViewController.m */,\n\t\t\t\t6D2FC5651B2E632000C130BA /* Main.storyboard */,\n\t\t\t\t6D2FC5681B2E632000C130BA /* Images.xcassets */,\n\t\t\t\t6D2FC56A1B2E632000C130BA /* LaunchScreen.xib */,\n\t\t\t\t6D2FC5571B2E632000C130BA /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = \"imguiex-ios\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6D2FC5571B2E632000C130BA /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6D2FC5921B30774900C130BA /* SystemConfiguration.framework */,\n\t\t\t\t6D2FC5901B30773F00C130BA /* CFNetwork.framework */,\n\t\t\t\t6D2FC5581B2E632000C130BA /* Info.plist */,\n\t\t\t\t6D2FC5591B2E632000C130BA /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6D2FC5841B2E648D00C130BA /* imgui */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6D2FC5851B2E64AB00C130BA /* imconfig.h */,\n\t\t\t\t197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */,\n\t\t\t\t6D2FC5861B2E64AB00C130BA /* imgui.cpp */,\n\t\t\t\t6D2FC5871B2E64AB00C130BA /* imgui.h */,\n\t\t\t);\n\t\t\tname = imgui;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1A1A0F1E1CB39FB50090F036 /* imguiex-osx */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1A1A0F2F1CB39FB50090F036 /* Build configuration list for PBXNativeTarget \"imguiex-osx\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1A1A0F1B1CB39FB50090F036 /* Sources */,\n\t\t\t\t1A1A0F1C1CB39FB50090F036 /* Frameworks */,\n\t\t\t\t1A1A0F1D1CB39FB50090F036 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"imguiex-osx\";\n\t\t\tproductName = \"imguiex-osx\";\n\t\t\tproductReference = 1A1A0F1F1CB39FB50090F036 /* imguiex-osx.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t6D2FC5531B2E632000C130BA /* imguiex-ios */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6D2FC57B1B2E632000C130BA /* Build configuration list for PBXNativeTarget \"imguiex-ios\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6D2FC5501B2E632000C130BA /* Sources */,\n\t\t\t\t6D2FC5511B2E632000C130BA /* Frameworks */,\n\t\t\t\t6D2FC5521B2E632000C130BA /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"imguiex-ios\";\n\t\t\tproductName = imguiex;\n\t\t\tproductReference = 6D2FC5541B2E632000C130BA /* imguiex-ios.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t6D2FC54C1B2E632000C130BA /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0630;\n\t\t\t\tORGANIZATIONNAME = \"Joel Davis\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t1A1A0F1E1CB39FB50090F036 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t};\n\t\t\t\t\t6D2FC5531B2E632000C130BA = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 6D2FC54F1B2E632000C130BA /* Build configuration list for PBXProject \"imguiex\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 6D2FC54B1B2E632000C130BA;\n\t\t\tproductRefGroup = 6D2FC5551B2E632000C130BA /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t6D2FC5531B2E632000C130BA /* imguiex-ios */,\n\t\t\t\t1A1A0F1E1CB39FB50090F036 /* imguiex-osx */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1A1A0F1D1CB39FB50090F036 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A1A0F281CB39FB50090F036 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6D2FC5521B2E632000C130BA /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6D2FC56C1B2E632000C130BA /* LaunchScreen.xib in Resources */,\n\t\t\t\t6D2FC5671B2E632000C130BA /* Main.storyboard in Resources */,\n\t\t\t\t6D2FC5691B2E632000C130BA /* Images.xcassets in Resources */,\n\t\t\t\t6D2FC5611B2E632000C130BA /* Shader.vsh in Resources */,\n\t\t\t\t6D2FC55F1B2E632000C130BA /* Shader.fsh in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1A1A0F1B1CB39FB50090F036 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A1A0F301CB3A0DA0090F036 /* imgui_draw.cpp in Sources */,\n\t\t\t\t1A1A0F311CB3A0DA0090F036 /* imgui.cpp in Sources */,\n\t\t\t\t1A1A0F331CB3A0E10090F036 /* imgui_demo.cpp in Sources */,\n\t\t\t\t1A1A0F341CB3A0EC0090F036 /* debug_hud.cpp in Sources */,\n\t\t\t\t1A1A0F481CB3A2E50090F036 /* main.cpp in Sources */,\n\t\t\t\t1A1A0F321CB3A0DE0090F036 /* uSynergy.c in Sources */,\n\t\t\t\t1A1A0F231CB39FB50090F036 /* AppDelegate.m in Sources */,\n\t\t\t\t1A1A0F4A1CB3A5070090F036 /* imgui_impl_glfw.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6D2FC5501B2E632000C130BA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6D2FC55D1B2E632000C130BA /* AppDelegate.m in Sources */,\n\t\t\t\t6D2FC5831B2E63A100C130BA /* imgui_impl_ios.mm in Sources */,\n\t\t\t\t6D1E39171B35EEF10017B40F /* uSynergy.c in Sources */,\n\t\t\t\t6D2FC5641B2E632000C130BA /* GameViewController.m in Sources */,\n\t\t\t\t6D2FC55A1B2E632000C130BA /* main.m in Sources */,\n\t\t\t\t6D2FC5881B2E64AB00C130BA /* imgui.cpp in Sources */,\n\t\t\t\t6D2FC58B1B2E6A5500C130BA /* debug_hud.cpp in Sources */,\n\t\t\t\t197E1E871B8943FE00E3FE6A /* imgui_draw.cpp in Sources */,\n\t\t\t\t197E1E891B89443600E3FE6A /* imgui_demo.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t6D2FC5651B2E632000C130BA /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t6D2FC5661B2E632000C130BA /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6D2FC56A1B2E632000C130BA /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t6D2FC56B1B2E632000C130BA /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1A1A0F2D1CB39FB50090F036 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)/../../\",\n\t\t\t\t\t/usr/local/include,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"imguiex-osx/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = /usr/local/lib;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.imgui.example.imguiex.imguiex-osx\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1A1A0F2E1CB39FB50090F036 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)/../../\",\n\t\t\t\t\t/usr/local/include,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"imguiex-osx/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = /usr/local/lib;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.imgui.example.imguiex.imguiex-osx\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6D2FC5791B2E632000C130BA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(SRCROOT)/../../\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6D2FC57A1B2E632000C130BA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = \"$(SRCROOT)/../../\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6D2FC57C1B2E632000C130BA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = \"imguiex-ios/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6D2FC57D1B2E632000C130BA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = \"imguiex-ios/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1A1A0F2F1CB39FB50090F036 /* Build configuration list for PBXNativeTarget \"imguiex-osx\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1A1A0F2D1CB39FB50090F036 /* Debug */,\n\t\t\t\t1A1A0F2E1CB39FB50090F036 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6D2FC54F1B2E632000C130BA /* Build configuration list for PBXProject \"imguiex\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6D2FC5791B2E632000C130BA /* Debug */,\n\t\t\t\t6D2FC57A1B2E632000C130BA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6D2FC57B1B2E632000C130BA /* Build configuration list for PBXNativeTarget \"imguiex-ios\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6D2FC57C1B2E632000C130BA /* Debug */,\n\t\t\t\t6D2FC57D1B2E632000C130BA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 6D2FC54C1B2E632000C130BA /* Project object */;\n}\n"
  },
  {
    "path": "external/imgui/examples/directx10_example/build_win32.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I \"%WindowsSdkDir%Include\\um\" /I \"%WindowsSdkDir%Include\\shared\" /I \"%DXSDK_DIR%Include\" /D UNICODE /D _UNICODE *.cpp ..\\..\\*.cpp /FeDebug/directx10_example.exe /FoDebug/ /link /LIBPATH:\"%DXSDK_DIR%/Lib/x86\" d3d10.lib d3dcompiler.lib\n\n"
  },
  {
    "path": "external/imgui/examples/directx10_example/directx10_example.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{345A953E-A004-4648-B442-DC5F9F11068C}</ProjectGuid>\n    <RootNamespace>directx10_example</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>d3d10.lib;d3dcompiler.lib;dxgi.lib;imm32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>d3d10.lib;d3dcompiler.lib;dxgi.lib;imm32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\" />\n    <ClInclude Include=\"..\\..\\imgui.h\" />\n    <ClInclude Include=\"..\\..\\imgui_internal.h\" />\n    <ClInclude Include=\"imgui_impl_dx10.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\imgui.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\" />\n    <ClCompile Include=\"imgui_impl_dx10.cpp\" />\n    <ClCompile Include=\"main.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/directx10_example/directx10_example.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"imgui\">\n      <UniqueIdentifier>{0587d7a3-f2ce-4d56-b84f-a0005d3bfce6}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"sources\">\n      <UniqueIdentifier>{08e36723-ce4f-4cff-9662-c40801cf1acf}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"imgui_impl_dx10.h\">\n      <Filter>sources</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui_internal.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\imgui.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"main.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"imgui_impl_dx10.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/directx10_example/imgui_impl_dx10.cpp",
    "content": "// ImGui Win32 + DirectX10 binding\n// In this binding, ImTextureID is used to store a 'ID3D10ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n#include \"imgui.h\"\n#include \"imgui_impl_dx10.h\"\n\n// DirectX\n#include <d3d10_1.h>\n#include <d3d10.h>\n#include <d3dcompiler.h>\n#define DIRECTINPUT_VERSION 0x0800\n#include <dinput.h>\n\n// Data\nstatic INT64                    g_Time = 0;\nstatic INT64                    g_TicksPerSecond = 0;\n\nstatic HWND                     g_hWnd = 0;\nstatic ID3D10Device*            g_pd3dDevice = NULL;\nstatic ID3D10Buffer*            g_pVB = NULL;\nstatic ID3D10Buffer*            g_pIB = NULL;\nstatic ID3D10Blob *             g_pVertexShaderBlob = NULL;\nstatic ID3D10VertexShader*      g_pVertexShader = NULL;\nstatic ID3D10InputLayout*       g_pInputLayout = NULL;\nstatic ID3D10Buffer*            g_pVertexConstantBuffer = NULL;\nstatic ID3D10Blob *             g_pPixelShaderBlob = NULL;\nstatic ID3D10PixelShader*       g_pPixelShader = NULL;\nstatic ID3D10SamplerState*      g_pFontSampler = NULL;\nstatic ID3D10ShaderResourceView*g_pFontTextureView = NULL;\nstatic ID3D10RasterizerState*   g_pRasterizerState = NULL;\nstatic ID3D10BlendState*        g_pBlendState = NULL;\nstatic ID3D10DepthStencilState* g_pDepthStencilState = NULL;\nstatic int                      g_VertexBufferSize = 5000, g_IndexBufferSize = 10000;\n\nstruct VERTEX_CONSTANT_BUFFER\n{\n    float        mvp[4][4];\n};\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\n// If text or lines are blurry when integrating ImGui in your engine:\n// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)\nvoid ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)\n{\n    ID3D10Device* ctx = g_pd3dDevice;\n\n    // Create and grow vertex/index buffers if needed\n    if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount)\n    {\n        if (g_pVB) { g_pVB->Release(); g_pVB = NULL; }\n        g_VertexBufferSize = draw_data->TotalVtxCount + 5000;\n        D3D10_BUFFER_DESC desc;\n        memset(&desc, 0, sizeof(D3D10_BUFFER_DESC));\n        desc.Usage = D3D10_USAGE_DYNAMIC;\n        desc.ByteWidth = g_VertexBufferSize * sizeof(ImDrawVert);\n        desc.BindFlags = D3D10_BIND_VERTEX_BUFFER;\n        desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\n        desc.MiscFlags = 0;\n        if (ctx->CreateBuffer(&desc, NULL, &g_pVB) < 0)\n            return;\n    }\n\n    if (!g_pIB || g_IndexBufferSize < draw_data->TotalIdxCount)\n    {\n        if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }\n        g_IndexBufferSize = draw_data->TotalIdxCount + 10000;\n        D3D10_BUFFER_DESC desc;\n        memset(&desc, 0, sizeof(D3D10_BUFFER_DESC));\n        desc.Usage = D3D10_USAGE_DYNAMIC;\n        desc.ByteWidth = g_IndexBufferSize * sizeof(ImDrawIdx);\n        desc.BindFlags = D3D10_BIND_INDEX_BUFFER;\n        desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\n        if (ctx->CreateBuffer(&desc, NULL, &g_pIB) < 0)\n            return;\n    }\n\n    // Copy and convert all vertices into a single contiguous buffer\n    ImDrawVert* vtx_dst = NULL;\n    ImDrawIdx* idx_dst = NULL;\n    g_pVB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&vtx_dst);\n    g_pIB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&idx_dst);\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));\n        memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));\n        vtx_dst += cmd_list->VtxBuffer.Size;\n        idx_dst += cmd_list->IdxBuffer.Size;\n    }\n    g_pVB->Unmap();\n    g_pIB->Unmap();\n\n    // Setup orthographic projection matrix into our constant buffer\n    {\n        void* mapped_resource;\n        if (g_pVertexConstantBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK)\n            return;\n        VERTEX_CONSTANT_BUFFER* constant_buffer = (VERTEX_CONSTANT_BUFFER*)mapped_resource;\n        const float L = 0.0f;\n        const float R = ImGui::GetIO().DisplaySize.x;\n        const float B = ImGui::GetIO().DisplaySize.y;\n        const float T = 0.0f;\n        const float mvp[4][4] =\n        {\n            { 2.0f/(R-L),   0.0f,           0.0f,       0.0f },\n            { 0.0f,         2.0f/(T-B),     0.0f,       0.0f },\n            { 0.0f,         0.0f,           0.5f,       0.0f },\n            { (R+L)/(L-R),  (T+B)/(B-T),    0.5f,       1.0f },\n        };\n        memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));\n        g_pVertexConstantBuffer->Unmap();\n    }\n\n    // Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)\n    struct BACKUP_DX10_STATE\n    {\n        UINT                        ScissorRectsCount, ViewportsCount;\n        D3D10_RECT                  ScissorRects[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];\n        D3D10_VIEWPORT              Viewports[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];\n        ID3D10RasterizerState*      RS;\n        ID3D10BlendState*           BlendState;\n        FLOAT                       BlendFactor[4];\n        UINT                        SampleMask;\n        UINT                        StencilRef;\n        ID3D10DepthStencilState*    DepthStencilState;\n        ID3D10ShaderResourceView*   PSShaderResource;\n        ID3D10SamplerState*         PSSampler;\n        ID3D10PixelShader*          PS;\n        ID3D10VertexShader*         VS;\n        D3D10_PRIMITIVE_TOPOLOGY    PrimitiveTopology;\n        ID3D10Buffer*               IndexBuffer, *VertexBuffer, *VSConstantBuffer;\n        UINT                        IndexBufferOffset, VertexBufferStride, VertexBufferOffset;\n        DXGI_FORMAT                 IndexBufferFormat;\n        ID3D10InputLayout*          InputLayout;\n    };\n    BACKUP_DX10_STATE old;\n    old.ScissorRectsCount = old.ViewportsCount = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;\n    ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);\n    ctx->RSGetViewports(&old.ViewportsCount, old.Viewports);\n    ctx->RSGetState(&old.RS);\n    ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);\n    ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef);\n    ctx->PSGetShaderResources(0, 1, &old.PSShaderResource);\n    ctx->PSGetSamplers(0, 1, &old.PSSampler);\n    ctx->PSGetShader(&old.PS);\n    ctx->VSGetShader(&old.VS);\n    ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);\n    ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology);\n    ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);\n    ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);\n    ctx->IAGetInputLayout(&old.InputLayout);\n\n    // Setup viewport\n    D3D10_VIEWPORT vp;\n    memset(&vp, 0, sizeof(D3D10_VIEWPORT));\n    vp.Width = (UINT)ImGui::GetIO().DisplaySize.x;\n    vp.Height = (UINT)ImGui::GetIO().DisplaySize.y;\n    vp.MinDepth = 0.0f;\n    vp.MaxDepth = 1.0f;\n    vp.TopLeftX = vp.TopLeftY = 0;\n    ctx->RSSetViewports(1, &vp);\n\n    // Bind shader and vertex buffers\n    unsigned int stride = sizeof(ImDrawVert);\n    unsigned int offset = 0;\n    ctx->IASetInputLayout(g_pInputLayout);\n    ctx->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset);\n    ctx->IASetIndexBuffer(g_pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);\n    ctx->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\n    ctx->VSSetShader(g_pVertexShader);\n    ctx->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer);\n    ctx->PSSetShader(g_pPixelShader);\n    ctx->PSSetSamplers(0, 1, &g_pFontSampler);\n\n    // Setup render state\n    const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };\n    ctx->OMSetBlendState(g_pBlendState, blend_factor, 0xffffffff);\n    ctx->OMSetDepthStencilState(g_pDepthStencilState, 0);\n    ctx->RSSetState(g_pRasterizerState);\n\n    // Render command lists\n    int vtx_offset = 0;\n    int idx_offset = 0;\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                const D3D10_RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };\n                ctx->PSSetShaderResources(0, 1, (ID3D10ShaderResourceView**)&pcmd->TextureId);\n                ctx->RSSetScissorRects(1, &r);\n                ctx->DrawIndexed(pcmd->ElemCount, idx_offset, vtx_offset);\n            }\n            idx_offset += pcmd->ElemCount;\n        }\n        vtx_offset += cmd_list->VtxBuffer.Size;\n    }\n\n    // Restore modified DX state\n    ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);\n    ctx->RSSetViewports(old.ViewportsCount, old.Viewports);\n    ctx->RSSetState(old.RS); if (old.RS) old.RS->Release();\n    ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();\n    ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release();\n    ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();\n    ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();\n    ctx->PSSetShader(old.PS); if (old.PS) old.PS->Release();\n    ctx->VSSetShader(old.VS); if (old.VS) old.VS->Release();\n    ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();\n    ctx->IASetPrimitiveTopology(old.PrimitiveTopology);\n    ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();\n    ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();\n    ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();\n}\n\nstatic bool IsAnyMouseButtonDown()\n{\n    ImGuiIO& io = ImGui::GetIO();\n    for (int n = 0; n < ARRAYSIZE(io.MouseDown); n++)\n        if (io.MouseDown[n])\n            return true;\n    return false;\n}\n\n// Process Win32 mouse/keyboard inputs. \n// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n// PS: In this Win32 handler, we use the capture API (GetCapture/SetCapture/ReleaseCapture) to be able to read mouse coordinations when dragging mouse outside of our window bounds.\nIMGUI_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    switch (msg)\n    {\n    case WM_LBUTTONDOWN:\n    case WM_RBUTTONDOWN:\n    case WM_MBUTTONDOWN:\n    {\n        int button = 0;\n        if (msg == WM_LBUTTONDOWN) button = 0;\n        if (msg == WM_RBUTTONDOWN) button = 1;\n        if (msg == WM_MBUTTONDOWN) button = 2;\n        if (!IsAnyMouseButtonDown() && GetCapture() == NULL)\n            SetCapture(hwnd);\n        io.MouseDown[button] = true;\n        return 0;\n    }\n    case WM_LBUTTONUP:\n    case WM_RBUTTONUP:\n    case WM_MBUTTONUP:\n    {\n        int button = 0;\n        if (msg == WM_LBUTTONUP) button = 0;\n        if (msg == WM_RBUTTONUP) button = 1;\n        if (msg == WM_MBUTTONUP) button = 2;\n        io.MouseDown[button] = false;\n        if (!IsAnyMouseButtonDown() && GetCapture() == hwnd)\n            ReleaseCapture();\n        return 0;\n    }\n    case WM_MOUSEWHEEL:\n        io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f;\n        return 0;\n    case WM_MOUSEMOVE:\n        io.MousePos.x = (signed short)(lParam);\n        io.MousePos.y = (signed short)(lParam >> 16);\n        return 0;\n    case WM_KEYDOWN:\n    case WM_SYSKEYDOWN:\n        if (wParam < 256)\n            io.KeysDown[wParam] = 1;\n        return 0;\n    case WM_KEYUP:\n    case WM_SYSKEYUP:\n        if (wParam < 256)\n            io.KeysDown[wParam] = 0;\n        return 0;\n    case WM_CHAR:\n        // You can also use ToAscii()+GetKeyboardState() to retrieve characters.\n        if (wParam > 0 && wParam < 0x10000)\n            io.AddInputCharacter((unsigned short)wParam);\n        return 0;\n    }\n    return 0;\n}\n\nstatic void ImGui_ImplDX10_CreateFontsTexture()\n{\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Build\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);\n\n    // Create DX10 texture\n    {\n        D3D10_TEXTURE2D_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.Width = width;\n        desc.Height = height;\n        desc.MipLevels = 1;\n        desc.ArraySize = 1;\n        desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n        desc.SampleDesc.Count = 1;\n        desc.Usage = D3D10_USAGE_DEFAULT;\n        desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;\n        desc.CPUAccessFlags = 0;\n\n        ID3D10Texture2D *pTexture = NULL;\n        D3D10_SUBRESOURCE_DATA subResource;\n        subResource.pSysMem = pixels;\n        subResource.SysMemPitch = desc.Width * 4;\n        subResource.SysMemSlicePitch = 0;\n        g_pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture);\n\n        // Create texture view\n        D3D10_SHADER_RESOURCE_VIEW_DESC srv_desc;\n        ZeroMemory(&srv_desc, sizeof(srv_desc));\n        srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n        srv_desc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;\n        srv_desc.Texture2D.MipLevels = desc.MipLevels;\n        srv_desc.Texture2D.MostDetailedMip = 0;\n        g_pd3dDevice->CreateShaderResourceView(pTexture, &srv_desc, &g_pFontTextureView);\n        pTexture->Release();\n    }\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)g_pFontTextureView;\n\n    // Create texture sampler\n    {\n        D3D10_SAMPLER_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR;\n        desc.AddressU = D3D10_TEXTURE_ADDRESS_WRAP;\n        desc.AddressV = D3D10_TEXTURE_ADDRESS_WRAP;\n        desc.AddressW = D3D10_TEXTURE_ADDRESS_WRAP;\n        desc.MipLODBias = 0.f;\n        desc.ComparisonFunc = D3D10_COMPARISON_ALWAYS;\n        desc.MinLOD = 0.f;\n        desc.MaxLOD = 0.f;\n        g_pd3dDevice->CreateSamplerState(&desc, &g_pFontSampler);\n    }\n\n    // Cleanup (don't clear the input data if you want to append new fonts later)\n    io.Fonts->ClearInputData();\n    io.Fonts->ClearTexData();\n}\n\nbool    ImGui_ImplDX10_CreateDeviceObjects()\n{\n    if (!g_pd3dDevice)\n        return false;\n    if (g_pFontSampler)\n        ImGui_ImplDX10_InvalidateDeviceObjects();\n\n    // By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)\n    // If you would like to use this DX11 sample code but remove this dependency you can: \n    //  1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]\n    //  2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. \n    // See https://github.com/ocornut/imgui/pull/638 for sources and details.\n\n    // Create the vertex shader\n    {\n        static const char* vertexShader =\n            \"cbuffer vertexBuffer : register(b0) \\\n            {\\\n            float4x4 ProjectionMatrix; \\\n            };\\\n            struct VS_INPUT\\\n            {\\\n            float2 pos : POSITION;\\\n            float4 col : COLOR0;\\\n            float2 uv  : TEXCOORD0;\\\n            };\\\n            \\\n            struct PS_INPUT\\\n            {\\\n            float4 pos : SV_POSITION;\\\n            float4 col : COLOR0;\\\n            float2 uv  : TEXCOORD0;\\\n            };\\\n            \\\n            PS_INPUT main(VS_INPUT input)\\\n            {\\\n            PS_INPUT output;\\\n            output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\\\n            output.col = input.col;\\\n            output.uv  = input.uv;\\\n            return output;\\\n            }\";\n\n        D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, \"main\", \"vs_4_0\", 0, 0, &g_pVertexShaderBlob, NULL);\n        if (g_pVertexShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!\n            return false;\n        if (g_pd3dDevice->CreateVertexShader((DWORD*)g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pVertexShader) != S_OK)\n            return false;\n\n        // Create the input layout\n        D3D10_INPUT_ELEMENT_DESC local_layout[] = \n        {\n            { \"POSITION\", 0, DXGI_FORMAT_R32G32_FLOAT,   0, (size_t)(&((ImDrawVert*)0)->pos), D3D10_INPUT_PER_VERTEX_DATA, 0 },\n            { \"TEXCOORD\", 0, DXGI_FORMAT_R32G32_FLOAT,   0, (size_t)(&((ImDrawVert*)0)->uv),  D3D10_INPUT_PER_VERTEX_DATA, 0 },\n            { \"COLOR\",    0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D10_INPUT_PER_VERTEX_DATA, 0 },\n        };\n        if (g_pd3dDevice->CreateInputLayout(local_layout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)\n            return false;\n\n        // Create the constant buffer\n        {\n            D3D10_BUFFER_DESC desc;\n            desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);\n            desc.Usage = D3D10_USAGE_DYNAMIC;\n            desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;\n            desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\n            desc.MiscFlags = 0;\n            g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVertexConstantBuffer);\n        }\n    }\n\n    // Create the pixel shader\n    {\n        static const char* pixelShader =\n            \"struct PS_INPUT\\\n            {\\\n            float4 pos : SV_POSITION;\\\n            float4 col : COLOR0;\\\n            float2 uv  : TEXCOORD0;\\\n            };\\\n            sampler sampler0;\\\n            Texture2D texture0;\\\n            \\\n            float4 main(PS_INPUT input) : SV_Target\\\n            {\\\n            float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \\\n            return out_col; \\\n            }\";\n\n        D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, \"main\", \"ps_4_0\", 0, 0, &g_pPixelShaderBlob, NULL);\n        if (g_pPixelShaderBlob == NULL)  // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!\n            return false;\n        if (g_pd3dDevice->CreatePixelShader((DWORD*)g_pPixelShaderBlob->GetBufferPointer(), g_pPixelShaderBlob->GetBufferSize(), &g_pPixelShader) != S_OK)\n            return false;\n    }\n\n    // Create the blending setup\n    {\n        D3D10_BLEND_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.AlphaToCoverageEnable = false;\n        desc.BlendEnable[0] = true;\n        desc.SrcBlend = D3D10_BLEND_SRC_ALPHA;\n        desc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;\n        desc.BlendOp = D3D10_BLEND_OP_ADD;\n        desc.SrcBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA;\n        desc.DestBlendAlpha = D3D10_BLEND_ZERO;\n        desc.BlendOpAlpha = D3D10_BLEND_OP_ADD;\n        desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;\n        g_pd3dDevice->CreateBlendState(&desc, &g_pBlendState);\n    }\n\n    // Create the rasterizer state\n    {\n        D3D10_RASTERIZER_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.FillMode = D3D10_FILL_SOLID;\n        desc.CullMode = D3D10_CULL_NONE;\n        desc.ScissorEnable = true;\n        desc.DepthClipEnable = true;\n        g_pd3dDevice->CreateRasterizerState(&desc, &g_pRasterizerState);\n    }\n\n    // Create depth-stencil State\n    {\n        D3D10_DEPTH_STENCIL_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.DepthEnable = false;\n        desc.DepthWriteMask = D3D10_DEPTH_WRITE_MASK_ALL;\n        desc.DepthFunc = D3D10_COMPARISON_ALWAYS;\n        desc.StencilEnable = false;\n        desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D10_STENCIL_OP_KEEP;\n        desc.FrontFace.StencilFunc = D3D10_COMPARISON_ALWAYS;\n        desc.BackFace = desc.FrontFace;\n        g_pd3dDevice->CreateDepthStencilState(&desc, &g_pDepthStencilState);\n    }\n\n    ImGui_ImplDX10_CreateFontsTexture();\n\n    return true;\n}\n\nvoid    ImGui_ImplDX10_InvalidateDeviceObjects()\n{\n    if (!g_pd3dDevice)\n        return;\n\n    if (g_pFontSampler) { g_pFontSampler->Release(); g_pFontSampler = NULL; }\n    if (g_pFontTextureView) { g_pFontTextureView->Release(); g_pFontTextureView = NULL; ImGui::GetIO().Fonts->TexID = NULL; } // We copied g_pFontTextureView to io.Fonts->TexID so let's clear that as well.\n    if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }\n    if (g_pVB) { g_pVB->Release(); g_pVB = NULL; }\n\n    if (g_pBlendState) { g_pBlendState->Release(); g_pBlendState = NULL; }\n    if (g_pDepthStencilState) { g_pDepthStencilState->Release(); g_pDepthStencilState = NULL; }\n    if (g_pRasterizerState) { g_pRasterizerState->Release(); g_pRasterizerState = NULL; }\n    if (g_pPixelShader) { g_pPixelShader->Release(); g_pPixelShader = NULL; }\n    if (g_pPixelShaderBlob) { g_pPixelShaderBlob->Release(); g_pPixelShaderBlob = NULL; }\n    if (g_pVertexConstantBuffer) { g_pVertexConstantBuffer->Release(); g_pVertexConstantBuffer = NULL; }\n    if (g_pInputLayout) { g_pInputLayout->Release(); g_pInputLayout = NULL; }\n    if (g_pVertexShader) { g_pVertexShader->Release(); g_pVertexShader = NULL; }\n    if (g_pVertexShaderBlob) { g_pVertexShaderBlob->Release(); g_pVertexShaderBlob = NULL; }\n}\n\nbool    ImGui_ImplDX10_Init(void* hwnd, ID3D10Device* device)\n{\n    g_hWnd = (HWND)hwnd;\n    g_pd3dDevice = device;\n\n    if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond))\n        return false;\n    if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time))\n        return false;\n\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = VK_TAB;                       // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.\n    io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = VK_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;\n    io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;\n    io.KeyMap[ImGuiKey_Home] = VK_HOME;\n    io.KeyMap[ImGuiKey_End] = VK_END;\n    io.KeyMap[ImGuiKey_Delete] = VK_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = VK_BACK;\n    io.KeyMap[ImGuiKey_Enter] = VK_RETURN;\n    io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = 'A';\n    io.KeyMap[ImGuiKey_C] = 'C';\n    io.KeyMap[ImGuiKey_V] = 'V';\n    io.KeyMap[ImGuiKey_X] = 'X';\n    io.KeyMap[ImGuiKey_Y] = 'Y';\n    io.KeyMap[ImGuiKey_Z] = 'Z';\n\n    io.RenderDrawListsFn = ImGui_ImplDX10_RenderDrawLists;  // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.ImeWindowHandle = g_hWnd;\n\n    return true;\n}\n\nvoid ImGui_ImplDX10_Shutdown()\n{\n    ImGui_ImplDX10_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n    g_pd3dDevice = NULL;\n    g_hWnd = (HWND)0;\n}\n\nvoid ImGui_ImplDX10_NewFrame()\n{\n    if (!g_pFontSampler)\n        ImGui_ImplDX10_CreateDeviceObjects();\n\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    RECT rect;\n    GetClientRect(g_hWnd, &rect);\n    io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));\n\n    // Setup time step\n    INT64 current_time;\n    QueryPerformanceCounter((LARGE_INTEGER *)&current_time);\n    io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond;\n    g_Time = current_time;\n\n    // Read keyboard modifiers inputs\n    io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;\n    io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;\n    io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;\n    io.KeySuper = false;\n    // io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events\n    // io.MousePos : filled by WM_MOUSEMOVE events\n    // io.MouseDown : filled by WM_*BUTTON* events\n    // io.MouseWheel : filled by WM_MOUSEWHEEL events\n\n    // Set OS mouse position if requested last frame by io.WantMoveMouse flag (used when io.NavMovesTrue is enabled by user and using directional navigation)\n    if (io.WantMoveMouse)\n    {\n        POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y };\n        ClientToScreen(g_hWnd, &pos);\n        SetCursorPos(pos.x, pos.y);\n    }\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    if (io.MouseDrawCursor)\n        SetCursor(NULL);\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n"
  },
  {
    "path": "external/imgui/examples/directx10_example/imgui_impl_dx10.h",
    "content": "// ImGui Win32 + DirectX10 binding\n// In this binding, ImTextureID is used to store a 'ID3D10ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\nstruct ID3D10Device;\n\nIMGUI_API bool        ImGui_ImplDX10_Init(void* hwnd, ID3D10Device* device);\nIMGUI_API void        ImGui_ImplDX10_Shutdown();\nIMGUI_API void        ImGui_ImplDX10_NewFrame();\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_ImplDX10_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_ImplDX10_CreateDeviceObjects();\n\n// Handler for Win32 messages, update mouse/keyboard data.\n// You may or not need this for your implementation, but it can serve as reference for handling inputs.\n// Commented out to avoid dragging dependencies on <windows.h> types. You can copy the extern declaration in your code.\n/*\nIMGUI_API LRESULT   ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);\n*/\n"
  },
  {
    "path": "external/imgui/examples/directx10_example/main.cpp",
    "content": "// ImGui - standalone example application for DirectX 10\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n\n#include <imgui.h>\n#include \"imgui_impl_dx10.h\"\n#include <d3d10_1.h>\n#include <d3d10.h>\n#define DIRECTINPUT_VERSION 0x0800\n#include <dinput.h>\n#include <tchar.h>\n\n// Data\nstatic ID3D10Device*            g_pd3dDevice = NULL;\nstatic IDXGISwapChain*          g_pSwapChain = NULL;\nstatic ID3D10RenderTargetView*  g_mainRenderTargetView = NULL;\n\nvoid CreateRenderTarget()\n{\n    DXGI_SWAP_CHAIN_DESC sd;\n    g_pSwapChain->GetDesc(&sd);\n\n    // Create the render target\n    ID3D10Texture2D* pBackBuffer;\n    D3D10_RENDER_TARGET_VIEW_DESC render_target_view_desc;\n    ZeroMemory(&render_target_view_desc, sizeof(render_target_view_desc));\n    render_target_view_desc.Format = sd.BufferDesc.Format;\n    render_target_view_desc.ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2D;\n    g_pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer);\n    g_pd3dDevice->CreateRenderTargetView(pBackBuffer, &render_target_view_desc, &g_mainRenderTargetView);\n    g_pd3dDevice->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL);\n    pBackBuffer->Release();\n}\n\nvoid CleanupRenderTarget()\n{\n    if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; }\n}\n\nHRESULT CreateDeviceD3D(HWND hWnd)\n{\n    // Setup swap chain\n    DXGI_SWAP_CHAIN_DESC sd;\n    {\n        ZeroMemory(&sd, sizeof(sd));\n        sd.BufferCount = 2;\n        sd.BufferDesc.Width = 0;\n        sd.BufferDesc.Height = 0;\n        sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n        sd.BufferDesc.RefreshRate.Numerator = 60;\n        sd.BufferDesc.RefreshRate.Denominator = 1;\n        sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;\n        sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;\n        sd.OutputWindow = hWnd;\n        sd.SampleDesc.Count = 1;\n        sd.SampleDesc.Quality = 0;\n        sd.Windowed = TRUE;\n        sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;\n    }\n\n    UINT createDeviceFlags = 0;\n    //createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG;\n    if (D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice) != S_OK)\n        return E_FAIL;\n\n    CreateRenderTarget();\n\n    return S_OK;\n}\n\nvoid CleanupDeviceD3D()\n{\n    CleanupRenderTarget();\n    if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }\n    if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }\n}\n\nextern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);\nLRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)\n{\n    if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))\n        return true;\n\n    switch (msg)\n    {\n    case WM_SIZE:\n        if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)\n        {\n            ImGui_ImplDX10_InvalidateDeviceObjects();\n            CleanupRenderTarget();\n            g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);\n            CreateRenderTarget();\n            ImGui_ImplDX10_CreateDeviceObjects();\n        }\n        return 0;\n    case WM_SYSCOMMAND:\n        if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu\n            return 0;\n        break;\n    case WM_DESTROY:\n        PostQuitMessage(0);\n        return 0;\n    }\n    return DefWindowProc(hWnd, msg, wParam, lParam);\n}\n\nint main(int, char**)\n{\n    // Create application window\n    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, _T(\"ImGui Example\"), NULL };\n    RegisterClassEx(&wc);\n    HWND hwnd = CreateWindow(_T(\"ImGui Example\"), _T(\"ImGui DirectX10 Example\"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);\n\n    // Initialize Direct3D\n    if (CreateDeviceD3D(hwnd) < 0)\n    {\n        CleanupDeviceD3D();\n        UnregisterClass(_T(\"ImGui Example\"), wc.hInstance);\n        return 1;\n    }\n\n    // Show the window\n    ShowWindow(hwnd, SW_SHOWDEFAULT);\n    UpdateWindow(hwnd);\n\n    // Setup ImGui binding\n    ImGui_ImplDX10_Init(hwnd, g_pd3dDevice);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    MSG msg;\n    ZeroMemory(&msg, sizeof(msg));\n    while (msg.message != WM_QUIT)\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))\n        {\n            TranslateMessage(&msg);\n            DispatchMessage(&msg);\n            continue;\n        }\n        ImGui_ImplDX10_NewFrame();\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);     // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        g_pd3dDevice->ClearRenderTargetView(g_mainRenderTargetView, (float*)&clear_color);\n        ImGui::Render();\n\n        g_pSwapChain->Present(1, 0); // Present with vsync\n        //g_pSwapChain->Present(0, 0); // Present without vsync\n    }\n\n    ImGui_ImplDX10_Shutdown();\n    CleanupDeviceD3D();\n    UnregisterClass(_T(\"ImGui Example\"), wc.hInstance);\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/directx11_example/build_win32.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I \"%WindowsSdkDir%Include\\um\" /I \"%WindowsSdkDir%Include\\shared\" /I \"%DXSDK_DIR%Include\" /D UNICODE /D _UNICODE *.cpp ..\\..\\*.cpp /FeDebug/directx11_example.exe /FoDebug/ /link /LIBPATH:\"%DXSDK_DIR%/Lib/x86\" d3d11.lib d3dcompiler.lib\n\n"
  },
  {
    "path": "external/imgui/examples/directx11_example/directx11_example.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{9F316E83-5AE5-4939-A723-305A94F48005}</ProjectGuid>\n    <RootNamespace>directx11_example</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;imm32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;imm32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\" />\n    <ClInclude Include=\"..\\..\\imgui.h\" />\n    <ClInclude Include=\"..\\..\\imgui_internal.h\" />\n    <ClInclude Include=\"imgui_impl_dx11.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\imgui.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\" />\n    <ClCompile Include=\"imgui_impl_dx11.cpp\" />\n    <ClCompile Include=\"main.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/directx11_example/directx11_example.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"imgui\">\n      <UniqueIdentifier>{0587d7a3-f2ce-4d56-b84f-a0005d3bfce6}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"sources\">\n      <UniqueIdentifier>{08e36723-ce4f-4cff-9662-c40801cf1acf}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"imgui_impl_dx11.h\">\n      <Filter>sources</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui_internal.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\imgui.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"main.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"imgui_impl_dx11.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/directx11_example/imgui_impl_dx11.cpp",
    "content": "// ImGui Win32 + DirectX11 binding\n// In this binding, ImTextureID is used to store a 'ID3D11ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n#include <imgui.h>\n#include \"imgui_impl_dx11.h\"\n\n// DirectX\n#include <d3d11.h>\n#include <d3dcompiler.h>\n#define DIRECTINPUT_VERSION 0x0800\n#include <dinput.h>\n\n// Data\nstatic INT64                    g_Time = 0;\nstatic INT64                    g_TicksPerSecond = 0;\n\nstatic HWND                     g_hWnd = 0;\nstatic ID3D11Device*            g_pd3dDevice = NULL;\nstatic ID3D11DeviceContext*     g_pd3dDeviceContext = NULL;\nstatic ID3D11Buffer*            g_pVB = NULL;\nstatic ID3D11Buffer*            g_pIB = NULL;\nstatic ID3D10Blob *             g_pVertexShaderBlob = NULL;\nstatic ID3D11VertexShader*      g_pVertexShader = NULL;\nstatic ID3D11InputLayout*       g_pInputLayout = NULL;\nstatic ID3D11Buffer*            g_pVertexConstantBuffer = NULL;\nstatic ID3D10Blob *             g_pPixelShaderBlob = NULL;\nstatic ID3D11PixelShader*       g_pPixelShader = NULL;\nstatic ID3D11SamplerState*      g_pFontSampler = NULL;\nstatic ID3D11ShaderResourceView*g_pFontTextureView = NULL;\nstatic ID3D11RasterizerState*   g_pRasterizerState = NULL;\nstatic ID3D11BlendState*        g_pBlendState = NULL;\nstatic ID3D11DepthStencilState* g_pDepthStencilState = NULL;\nstatic int                      g_VertexBufferSize = 5000, g_IndexBufferSize = 10000;\n\nstruct VERTEX_CONSTANT_BUFFER\n{\n    float        mvp[4][4];\n};\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\n// If text or lines are blurry when integrating ImGui in your engine:\n// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)\nvoid ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data)\n{\n    ID3D11DeviceContext* ctx = g_pd3dDeviceContext;\n\n    // Create and grow vertex/index buffers if needed\n    if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount)\n    {\n        if (g_pVB) { g_pVB->Release(); g_pVB = NULL; }\n        g_VertexBufferSize = draw_data->TotalVtxCount + 5000;\n        D3D11_BUFFER_DESC desc;\n        memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));\n        desc.Usage = D3D11_USAGE_DYNAMIC;\n        desc.ByteWidth = g_VertexBufferSize * sizeof(ImDrawVert);\n        desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;\n        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\n        desc.MiscFlags = 0;\n        if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVB) < 0)\n            return;\n    }\n    if (!g_pIB || g_IndexBufferSize < draw_data->TotalIdxCount)\n    {\n        if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }\n        g_IndexBufferSize = draw_data->TotalIdxCount + 10000;\n        D3D11_BUFFER_DESC desc;\n        memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));\n        desc.Usage = D3D11_USAGE_DYNAMIC;\n        desc.ByteWidth = g_IndexBufferSize * sizeof(ImDrawIdx);\n        desc.BindFlags = D3D11_BIND_INDEX_BUFFER;\n        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\n        if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pIB) < 0)\n            return;\n    }\n\n    // Copy and convert all vertices into a single contiguous buffer\n    D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource;\n    if (ctx->Map(g_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK)\n        return;\n    if (ctx->Map(g_pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK)\n        return;\n    ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData;\n    ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData;\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));\n        memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));\n        vtx_dst += cmd_list->VtxBuffer.Size;\n        idx_dst += cmd_list->IdxBuffer.Size;\n    }\n    ctx->Unmap(g_pVB, 0);\n    ctx->Unmap(g_pIB, 0);\n\n    // Setup orthographic projection matrix into our constant buffer\n    {\n        D3D11_MAPPED_SUBRESOURCE mapped_resource;\n        if (ctx->Map(g_pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK)\n            return;\n        VERTEX_CONSTANT_BUFFER* constant_buffer = (VERTEX_CONSTANT_BUFFER*)mapped_resource.pData;\n        float L = 0.0f;\n        float R = ImGui::GetIO().DisplaySize.x;\n        float B = ImGui::GetIO().DisplaySize.y;\n        float T = 0.0f;\n        float mvp[4][4] =\n        {\n            { 2.0f/(R-L),   0.0f,           0.0f,       0.0f },\n            { 0.0f,         2.0f/(T-B),     0.0f,       0.0f },\n            { 0.0f,         0.0f,           0.5f,       0.0f },\n            { (R+L)/(L-R),  (T+B)/(B-T),    0.5f,       1.0f },\n        };\n        memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));\n        ctx->Unmap(g_pVertexConstantBuffer, 0);\n    }\n\n    // Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)\n    struct BACKUP_DX11_STATE\n    {\n        UINT                        ScissorRectsCount, ViewportsCount;\n        D3D11_RECT                  ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];\n        D3D11_VIEWPORT              Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];\n        ID3D11RasterizerState*      RS;\n        ID3D11BlendState*           BlendState;\n        FLOAT                       BlendFactor[4];\n        UINT                        SampleMask;\n        UINT                        StencilRef;\n        ID3D11DepthStencilState*    DepthStencilState;\n        ID3D11ShaderResourceView*   PSShaderResource;\n        ID3D11SamplerState*         PSSampler;\n        ID3D11PixelShader*          PS;\n        ID3D11VertexShader*         VS;\n        UINT                        PSInstancesCount, VSInstancesCount;\n        ID3D11ClassInstance*        PSInstances[256], *VSInstances[256];   // 256 is max according to PSSetShader documentation\n        D3D11_PRIMITIVE_TOPOLOGY    PrimitiveTopology;\n        ID3D11Buffer*               IndexBuffer, *VertexBuffer, *VSConstantBuffer;\n        UINT                        IndexBufferOffset, VertexBufferStride, VertexBufferOffset;\n        DXGI_FORMAT                 IndexBufferFormat;\n        ID3D11InputLayout*          InputLayout;\n    };\n    BACKUP_DX11_STATE old;\n    old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;\n    ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);\n    ctx->RSGetViewports(&old.ViewportsCount, old.Viewports);\n    ctx->RSGetState(&old.RS);\n    ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);\n    ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef);\n    ctx->PSGetShaderResources(0, 1, &old.PSShaderResource);\n    ctx->PSGetSamplers(0, 1, &old.PSSampler);\n    old.PSInstancesCount = old.VSInstancesCount = 256;\n    ctx->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount);\n    ctx->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount);\n    ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);\n    ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology);\n    ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);\n    ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);\n    ctx->IAGetInputLayout(&old.InputLayout);\n\n    // Setup viewport\n    D3D11_VIEWPORT vp;\n    memset(&vp, 0, sizeof(D3D11_VIEWPORT));\n    vp.Width = ImGui::GetIO().DisplaySize.x;\n    vp.Height = ImGui::GetIO().DisplaySize.y;\n    vp.MinDepth = 0.0f;\n    vp.MaxDepth = 1.0f;\n    vp.TopLeftX = vp.TopLeftY = 0.0f;\n    ctx->RSSetViewports(1, &vp);\n\n    // Bind shader and vertex buffers\n    unsigned int stride = sizeof(ImDrawVert);\n    unsigned int offset = 0;\n    ctx->IASetInputLayout(g_pInputLayout);\n    ctx->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset);\n    ctx->IASetIndexBuffer(g_pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);\n    ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\n    ctx->VSSetShader(g_pVertexShader, NULL, 0);\n    ctx->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer);\n    ctx->PSSetShader(g_pPixelShader, NULL, 0);\n    ctx->PSSetSamplers(0, 1, &g_pFontSampler);\n\n    // Setup render state\n    const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };\n    ctx->OMSetBlendState(g_pBlendState, blend_factor, 0xffffffff);\n    ctx->OMSetDepthStencilState(g_pDepthStencilState, 0);\n    ctx->RSSetState(g_pRasterizerState);\n\n    // Render command lists\n    int vtx_offset = 0;\n    int idx_offset = 0;\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                const D3D11_RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };\n                ctx->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView**)&pcmd->TextureId);\n                ctx->RSSetScissorRects(1, &r);\n                ctx->DrawIndexed(pcmd->ElemCount, idx_offset, vtx_offset);\n            }\n            idx_offset += pcmd->ElemCount;\n        }\n        vtx_offset += cmd_list->VtxBuffer.Size;\n    }\n\n    // Restore modified DX state\n    ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);\n    ctx->RSSetViewports(old.ViewportsCount, old.Viewports);\n    ctx->RSSetState(old.RS); if (old.RS) old.RS->Release();\n    ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();\n    ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release();\n    ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();\n    ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();\n    ctx->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release();\n    for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release();\n    ctx->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release();\n    ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();\n    for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release();\n    ctx->IASetPrimitiveTopology(old.PrimitiveTopology);\n    ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();\n    ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();\n    ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();\n}\n\nstatic bool IsAnyMouseButtonDown()\n{\n    ImGuiIO& io = ImGui::GetIO();\n    for (int n = 0; n < ARRAYSIZE(io.MouseDown); n++)\n        if (io.MouseDown[n])\n            return true;\n    return false;\n}\n\n// Process Win32 mouse/keyboard inputs. \n// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n// PS: In this Win32 handler, we use the capture API (GetCapture/SetCapture/ReleaseCapture) to be able to read mouse coordinations when dragging mouse outside of our window bounds.\nIMGUI_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    switch (msg)\n    {\n    case WM_LBUTTONDOWN:\n    case WM_RBUTTONDOWN:\n    case WM_MBUTTONDOWN:\n    {\n        int button = 0;\n        if (msg == WM_LBUTTONDOWN) button = 0;\n        if (msg == WM_RBUTTONDOWN) button = 1;\n        if (msg == WM_MBUTTONDOWN) button = 2;\n        if (!IsAnyMouseButtonDown() && GetCapture() == NULL)\n            SetCapture(hwnd);\n        io.MouseDown[button] = true;\n        return 0;\n    }\n    case WM_LBUTTONUP:\n    case WM_RBUTTONUP:\n    case WM_MBUTTONUP:\n    {\n        int button = 0;\n        if (msg == WM_LBUTTONUP) button = 0;\n        if (msg == WM_RBUTTONUP) button = 1;\n        if (msg == WM_MBUTTONUP) button = 2;\n        io.MouseDown[button] = false;\n        if (!IsAnyMouseButtonDown() && GetCapture() == hwnd)\n            ReleaseCapture();\n        return 0;\n    }\n    case WM_MOUSEWHEEL:\n        io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f;\n        return 0;\n    case WM_MOUSEMOVE:\n        io.MousePos.x = (signed short)(lParam);\n        io.MousePos.y = (signed short)(lParam >> 16);\n        return 0;\n    case WM_KEYDOWN:\n    case WM_SYSKEYDOWN:\n        if (wParam < 256)\n            io.KeysDown[wParam] = 1;\n        return 0;\n    case WM_KEYUP:\n    case WM_SYSKEYUP:\n        if (wParam < 256)\n            io.KeysDown[wParam] = 0;\n        return 0;\n    case WM_CHAR:\n        // You can also use ToAscii()+GetKeyboardState() to retrieve characters.\n        if (wParam > 0 && wParam < 0x10000)\n            io.AddInputCharacter((unsigned short)wParam);\n        return 0;\n    }\n    return 0;\n}\n\nstatic void ImGui_ImplDX11_CreateFontsTexture()\n{\n    // Build texture atlas\n    ImGuiIO& io = ImGui::GetIO();\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);\n\n    // Upload texture to graphics system\n    {\n        D3D11_TEXTURE2D_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.Width = width;\n        desc.Height = height;\n        desc.MipLevels = 1;\n        desc.ArraySize = 1;\n        desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n        desc.SampleDesc.Count = 1;\n        desc.Usage = D3D11_USAGE_DEFAULT;\n        desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;\n        desc.CPUAccessFlags = 0;\n\n        ID3D11Texture2D *pTexture = NULL;\n        D3D11_SUBRESOURCE_DATA subResource;\n        subResource.pSysMem = pixels;\n        subResource.SysMemPitch = desc.Width * 4;\n        subResource.SysMemSlicePitch = 0;\n        g_pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture);\n\n        // Create texture view\n        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;\n        ZeroMemory(&srvDesc, sizeof(srvDesc));\n        srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;\n        srvDesc.Texture2D.MipLevels = desc.MipLevels;\n        srvDesc.Texture2D.MostDetailedMip = 0;\n        g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &g_pFontTextureView);\n        pTexture->Release();\n    }\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)g_pFontTextureView;\n\n    // Create texture sampler\n    {\n        D3D11_SAMPLER_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;\n        desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;\n        desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;\n        desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;\n        desc.MipLODBias = 0.f;\n        desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;\n        desc.MinLOD = 0.f;\n        desc.MaxLOD = 0.f;\n        g_pd3dDevice->CreateSamplerState(&desc, &g_pFontSampler);\n    }\n}\n\nbool    ImGui_ImplDX11_CreateDeviceObjects()\n{\n    if (!g_pd3dDevice)\n        return false;\n    if (g_pFontSampler)\n        ImGui_ImplDX11_InvalidateDeviceObjects();\n\n    // By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)\n    // If you would like to use this DX11 sample code but remove this dependency you can: \n    //  1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]\n    //  2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. \n    // See https://github.com/ocornut/imgui/pull/638 for sources and details.\n\n    // Create the vertex shader\n    {\n        static const char* vertexShader =\n            \"cbuffer vertexBuffer : register(b0) \\\n            {\\\n            float4x4 ProjectionMatrix; \\\n            };\\\n            struct VS_INPUT\\\n            {\\\n            float2 pos : POSITION;\\\n            float4 col : COLOR0;\\\n            float2 uv  : TEXCOORD0;\\\n            };\\\n            \\\n            struct PS_INPUT\\\n            {\\\n            float4 pos : SV_POSITION;\\\n            float4 col : COLOR0;\\\n            float2 uv  : TEXCOORD0;\\\n            };\\\n            \\\n            PS_INPUT main(VS_INPUT input)\\\n            {\\\n            PS_INPUT output;\\\n            output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\\\n            output.col = input.col;\\\n            output.uv  = input.uv;\\\n            return output;\\\n            }\";\n\n        D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, \"main\", \"vs_4_0\", 0, 0, &g_pVertexShaderBlob, NULL);\n        if (g_pVertexShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!\n            return false;\n        if (g_pd3dDevice->CreateVertexShader((DWORD*)g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), NULL, &g_pVertexShader) != S_OK)\n            return false;\n\n        // Create the input layout\n        D3D11_INPUT_ELEMENT_DESC local_layout[] = {\n            { \"POSITION\", 0, DXGI_FORMAT_R32G32_FLOAT,   0, (size_t)(&((ImDrawVert*)0)->pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },\n            { \"TEXCOORD\", 0, DXGI_FORMAT_R32G32_FLOAT,   0, (size_t)(&((ImDrawVert*)0)->uv),  D3D11_INPUT_PER_VERTEX_DATA, 0 },\n            { \"COLOR\",    0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D11_INPUT_PER_VERTEX_DATA, 0 },\n        };\n        if (g_pd3dDevice->CreateInputLayout(local_layout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)\n            return false;\n\n        // Create the constant buffer\n        {\n            D3D11_BUFFER_DESC desc;\n            desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);\n            desc.Usage = D3D11_USAGE_DYNAMIC;\n            desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;\n            desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\n            desc.MiscFlags = 0;\n            g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVertexConstantBuffer);\n        }\n    }\n\n    // Create the pixel shader\n    {\n        static const char* pixelShader =\n            \"struct PS_INPUT\\\n            {\\\n            float4 pos : SV_POSITION;\\\n            float4 col : COLOR0;\\\n            float2 uv  : TEXCOORD0;\\\n            };\\\n            sampler sampler0;\\\n            Texture2D texture0;\\\n            \\\n            float4 main(PS_INPUT input) : SV_Target\\\n            {\\\n            float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \\\n            return out_col; \\\n            }\";\n\n        D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, \"main\", \"ps_4_0\", 0, 0, &g_pPixelShaderBlob, NULL);\n        if (g_pPixelShaderBlob == NULL)  // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!\n            return false;\n        if (g_pd3dDevice->CreatePixelShader((DWORD*)g_pPixelShaderBlob->GetBufferPointer(), g_pPixelShaderBlob->GetBufferSize(), NULL, &g_pPixelShader) != S_OK)\n            return false;\n    }\n\n    // Create the blending setup\n    {\n        D3D11_BLEND_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.AlphaToCoverageEnable = false;\n        desc.RenderTarget[0].BlendEnable = true;\n        desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;\n        desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;\n        desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;\n        desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;\n        desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;\n        desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;\n        desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;\n        g_pd3dDevice->CreateBlendState(&desc, &g_pBlendState);\n    }\n\n    // Create the rasterizer state\n    {\n        D3D11_RASTERIZER_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.FillMode = D3D11_FILL_SOLID;\n        desc.CullMode = D3D11_CULL_NONE;\n        desc.ScissorEnable = true;\n        desc.DepthClipEnable = true;\n        g_pd3dDevice->CreateRasterizerState(&desc, &g_pRasterizerState);\n    }\n\n    // Create depth-stencil State\n    {\n        D3D11_DEPTH_STENCIL_DESC desc;\n        ZeroMemory(&desc, sizeof(desc));\n        desc.DepthEnable = false;\n        desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;\n        desc.DepthFunc = D3D11_COMPARISON_ALWAYS;\n        desc.StencilEnable = false;\n        desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;\n        desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;\n        desc.BackFace = desc.FrontFace;\n        g_pd3dDevice->CreateDepthStencilState(&desc, &g_pDepthStencilState);\n    }\n\n    ImGui_ImplDX11_CreateFontsTexture();\n\n    return true;\n}\n\nvoid    ImGui_ImplDX11_InvalidateDeviceObjects()\n{\n    if (!g_pd3dDevice)\n        return;\n\n    if (g_pFontSampler) { g_pFontSampler->Release(); g_pFontSampler = NULL; }\n    if (g_pFontTextureView) { g_pFontTextureView->Release(); g_pFontTextureView = NULL; ImGui::GetIO().Fonts->TexID = NULL; } // We copied g_pFontTextureView to io.Fonts->TexID so let's clear that as well.\n    if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }\n    if (g_pVB) { g_pVB->Release(); g_pVB = NULL; }\n\n    if (g_pBlendState) { g_pBlendState->Release(); g_pBlendState = NULL; }\n    if (g_pDepthStencilState) { g_pDepthStencilState->Release(); g_pDepthStencilState = NULL; }\n    if (g_pRasterizerState) { g_pRasterizerState->Release(); g_pRasterizerState = NULL; }\n    if (g_pPixelShader) { g_pPixelShader->Release(); g_pPixelShader = NULL; }\n    if (g_pPixelShaderBlob) { g_pPixelShaderBlob->Release(); g_pPixelShaderBlob = NULL; }\n    if (g_pVertexConstantBuffer) { g_pVertexConstantBuffer->Release(); g_pVertexConstantBuffer = NULL; }\n    if (g_pInputLayout) { g_pInputLayout->Release(); g_pInputLayout = NULL; }\n    if (g_pVertexShader) { g_pVertexShader->Release(); g_pVertexShader = NULL; }\n    if (g_pVertexShaderBlob) { g_pVertexShaderBlob->Release(); g_pVertexShaderBlob = NULL; }\n}\n\nbool    ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context)\n{\n    g_hWnd = (HWND)hwnd;\n    g_pd3dDevice = device;\n    g_pd3dDeviceContext = device_context;\n\n    if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond))\n        return false;\n    if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time))\n        return false;\n\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = VK_TAB;                       // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.\n    io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = VK_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;\n    io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;\n    io.KeyMap[ImGuiKey_Home] = VK_HOME;\n    io.KeyMap[ImGuiKey_End] = VK_END;\n    io.KeyMap[ImGuiKey_Delete] = VK_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = VK_BACK;\n    io.KeyMap[ImGuiKey_Enter] = VK_RETURN;\n    io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = 'A';\n    io.KeyMap[ImGuiKey_C] = 'C';\n    io.KeyMap[ImGuiKey_V] = 'V';\n    io.KeyMap[ImGuiKey_X] = 'X';\n    io.KeyMap[ImGuiKey_Y] = 'Y';\n    io.KeyMap[ImGuiKey_Z] = 'Z';\n\n    io.RenderDrawListsFn = ImGui_ImplDX11_RenderDrawLists;  // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.ImeWindowHandle = g_hWnd;\n\n    return true;\n}\n\nvoid ImGui_ImplDX11_Shutdown()\n{\n    ImGui_ImplDX11_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n    g_pd3dDevice = NULL;\n    g_pd3dDeviceContext = NULL;\n    g_hWnd = (HWND)0;\n}\n\nvoid ImGui_ImplDX11_NewFrame()\n{\n    if (!g_pFontSampler)\n        ImGui_ImplDX11_CreateDeviceObjects();\n\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    RECT rect;\n    GetClientRect(g_hWnd, &rect);\n    io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));\n\n    // Setup time step\n    INT64 current_time;\n    QueryPerformanceCounter((LARGE_INTEGER *)&current_time);\n    io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond;\n    g_Time = current_time;\n\n    // Read keyboard modifiers inputs\n    io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;\n    io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;\n    io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;\n    io.KeySuper = false;\n    // io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events\n    // io.MousePos : filled by WM_MOUSEMOVE events\n    // io.MouseDown : filled by WM_*BUTTON* events\n    // io.MouseWheel : filled by WM_MOUSEWHEEL events\n\n    // Set OS mouse position if requested last frame by io.WantMoveMouse flag (used when io.NavMovesTrue is enabled by user and using directional navigation)\n    if (io.WantMoveMouse)\n    {\n        POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y };\n        ClientToScreen(g_hWnd, &pos);\n        SetCursorPos(pos.x, pos.y);\n    }\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    if (io.MouseDrawCursor)\n        SetCursor(NULL);\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n"
  },
  {
    "path": "external/imgui/examples/directx11_example/imgui_impl_dx11.h",
    "content": "// ImGui Win32 + DirectX11 binding\n// In this binding, ImTextureID is used to store a 'ID3D11ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\nstruct ID3D11Device;\nstruct ID3D11DeviceContext;\n\nIMGUI_API bool        ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context);\nIMGUI_API void        ImGui_ImplDX11_Shutdown();\nIMGUI_API void        ImGui_ImplDX11_NewFrame();\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_ImplDX11_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_ImplDX11_CreateDeviceObjects();\n\n// Handler for Win32 messages, update mouse/keyboard data.\n// You may or not need this for your implementation, but it can serve as reference for handling inputs.\n// Commented out to avoid dragging dependencies on <windows.h> types. You can copy the extern declaration in your code.\n/*\nIMGUI_API LRESULT   ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);\n*/\n"
  },
  {
    "path": "external/imgui/examples/directx11_example/main.cpp",
    "content": "// ImGui - standalone example application for DirectX 11\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n\n#include <imgui.h>\n#include \"imgui_impl_dx11.h\"\n#include <d3d11.h>\n#define DIRECTINPUT_VERSION 0x0800\n#include <dinput.h>\n#include <tchar.h>\n\n// Data\nstatic ID3D11Device*            g_pd3dDevice = NULL;\nstatic ID3D11DeviceContext*     g_pd3dDeviceContext = NULL;\nstatic IDXGISwapChain*          g_pSwapChain = NULL;\nstatic ID3D11RenderTargetView*  g_mainRenderTargetView = NULL;\n\nvoid CreateRenderTarget()\n{\n    DXGI_SWAP_CHAIN_DESC sd;\n    g_pSwapChain->GetDesc(&sd);\n\n    // Create the render target\n    ID3D11Texture2D* pBackBuffer;\n    D3D11_RENDER_TARGET_VIEW_DESC render_target_view_desc;\n    ZeroMemory(&render_target_view_desc, sizeof(render_target_view_desc));\n    render_target_view_desc.Format = sd.BufferDesc.Format;\n    render_target_view_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;\n    g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);\n    g_pd3dDevice->CreateRenderTargetView(pBackBuffer, &render_target_view_desc, &g_mainRenderTargetView);\n    g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL);\n    pBackBuffer->Release();\n}\n\nvoid CleanupRenderTarget()\n{\n    if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; }\n}\n\nHRESULT CreateDeviceD3D(HWND hWnd)\n{\n    // Setup swap chain\n    DXGI_SWAP_CHAIN_DESC sd;\n    {\n        ZeroMemory(&sd, sizeof(sd));\n        sd.BufferCount = 2;\n        sd.BufferDesc.Width = 0;\n        sd.BufferDesc.Height = 0;\n        sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n        sd.BufferDesc.RefreshRate.Numerator = 60;\n        sd.BufferDesc.RefreshRate.Denominator = 1;\n        sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;\n        sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;\n        sd.OutputWindow = hWnd;\n        sd.SampleDesc.Count = 1;\n        sd.SampleDesc.Quality = 0;\n        sd.Windowed = TRUE;\n        sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;\n    }\n\n    UINT createDeviceFlags = 0;\n    //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;\n    D3D_FEATURE_LEVEL featureLevel;\n    const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, };\n    if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK)\n        return E_FAIL;\n\n    CreateRenderTarget();\n\n    return S_OK;\n}\n\nvoid CleanupDeviceD3D()\n{\n    CleanupRenderTarget();\n    if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }\n    if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = NULL; }\n    if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }\n}\n\nextern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);\nLRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)\n{\n    if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))\n        return true;\n\n    switch (msg)\n    {\n    case WM_SIZE:\n        if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)\n        {\n            ImGui_ImplDX11_InvalidateDeviceObjects();\n            CleanupRenderTarget();\n            g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);\n            CreateRenderTarget();\n            ImGui_ImplDX11_CreateDeviceObjects();\n        }\n        return 0;\n    case WM_SYSCOMMAND:\n        if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu\n            return 0;\n        break;\n    case WM_DESTROY:\n        PostQuitMessage(0);\n        return 0;\n    }\n    return DefWindowProc(hWnd, msg, wParam, lParam);\n}\n\nint main(int, char**)\n{\n    // Create application window\n    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, _T(\"ImGui Example\"), NULL };\n    RegisterClassEx(&wc);\n    HWND hwnd = CreateWindow(_T(\"ImGui Example\"), _T(\"ImGui DirectX11 Example\"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);\n\n    // Initialize Direct3D\n    if (CreateDeviceD3D(hwnd) < 0)\n    {\n        CleanupDeviceD3D();\n        UnregisterClass(_T(\"ImGui Example\"), wc.hInstance);\n        return 1;\n    }\n\n    // Show the window\n    ShowWindow(hwnd, SW_SHOWDEFAULT);\n    UpdateWindow(hwnd);\n\n    // Setup ImGui binding\n    ImGui_ImplDX11_Init(hwnd, g_pd3dDevice, g_pd3dDeviceContext);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    MSG msg;\n    ZeroMemory(&msg, sizeof(msg));\n    while (msg.message != WM_QUIT)\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))\n        {\n            TranslateMessage(&msg);\n            DispatchMessage(&msg);\n            continue;\n        }\n        ImGui_ImplDX11_NewFrame();\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);     // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, (float*)&clear_color);\n        ImGui::Render();\n\n        g_pSwapChain->Present(1, 0); // Present with vsync\n        //g_pSwapChain->Present(0, 0); // Present without vsync\n    }\n\n    ImGui_ImplDX11_Shutdown();\n    CleanupDeviceD3D();\n    UnregisterClass(_T(\"ImGui Example\"), wc.hInstance);\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/directx9_example/build_win32.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I \"%DXSDK_DIR%/Include\" /D UNICODE /D _UNICODE *.cpp ..\\..\\*.cpp /FeDebug/directx9_example.exe /FoDebug/ /link /LIBPATH:\"%DXSDK_DIR%/Lib/x86\" d3d9.lib\n"
  },
  {
    "path": "external/imgui/examples/directx9_example/directx9_example.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{4165A294-21F2-44CA-9B38-E3F935ABADF5}</ProjectGuid>\n    <RootNamespace>directx9_example</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>..\\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\imgui.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\" />\n    <ClCompile Include=\"imgui_impl_dx9.cpp\" />\n    <ClCompile Include=\"main.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\" />\n    <ClInclude Include=\"..\\..\\imgui.h\" />\n    <ClInclude Include=\"..\\..\\imgui_internal.h\" />\n    <ClInclude Include=\"imgui_impl_dx9.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/directx9_example/directx9_example.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"sources\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"imgui\">\n      <UniqueIdentifier>{a82cba23-9de0-45c2-b1e3-2eb1666702de}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"main.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"imgui_impl_dx9.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"imgui_impl_dx9.h\">\n      <Filter>sources</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui_internal.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/directx9_example/imgui_impl_dx9.cpp",
    "content": "// ImGui Win32 + DirectX9 binding\n// In this binding, ImTextureID is used to store a 'LPDIRECT3DTEXTURE9' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n#include <imgui.h>\n#include \"imgui_impl_dx9.h\"\n\n// DirectX\n#include <d3d9.h>\n#define DIRECTINPUT_VERSION 0x0800\n#include <dinput.h>\n\n// Data\nstatic HWND                     g_hWnd = 0;\nstatic INT64                    g_Time = 0;\nstatic INT64                    g_TicksPerSecond = 0;\nstatic LPDIRECT3DDEVICE9        g_pd3dDevice = NULL;\nstatic LPDIRECT3DVERTEXBUFFER9  g_pVB = NULL;\nstatic LPDIRECT3DINDEXBUFFER9   g_pIB = NULL;\nstatic LPDIRECT3DTEXTURE9       g_FontTexture = NULL;\nstatic int                      g_VertexBufferSize = 5000, g_IndexBufferSize = 10000;\n\nstruct CUSTOMVERTEX\n{\n    float    pos[3];\n    D3DCOLOR col;\n    float    uv[2];\n};\n#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\n// If text or lines are blurry when integrating ImGui in your engine:\n// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)\nvoid ImGui_ImplDX9_RenderDrawLists(ImDrawData* draw_data)\n{\n    // Avoid rendering when minimized\n    ImGuiIO& io = ImGui::GetIO();\n    if (io.DisplaySize.x <= 0.0f || io.DisplaySize.y <= 0.0f)\n        return;\n\n    // Create and grow buffers if needed\n    if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount)\n    {\n        if (g_pVB) { g_pVB->Release(); g_pVB = NULL; }\n        g_VertexBufferSize = draw_data->TotalVtxCount + 5000;\n        if (g_pd3dDevice->CreateVertexBuffer(g_VertexBufferSize * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0)\n            return;\n    }\n    if (!g_pIB || g_IndexBufferSize < draw_data->TotalIdxCount)\n    {\n        if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }\n        g_IndexBufferSize = draw_data->TotalIdxCount + 10000;\n        if (g_pd3dDevice->CreateIndexBuffer(g_IndexBufferSize * sizeof(ImDrawIdx), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, sizeof(ImDrawIdx) == 2 ? D3DFMT_INDEX16 : D3DFMT_INDEX32, D3DPOOL_DEFAULT, &g_pIB, NULL) < 0)\n            return;\n    }\n\n    // Backup the DX9 state\n    IDirect3DStateBlock9* d3d9_state_block = NULL;\n    if (g_pd3dDevice->CreateStateBlock(D3DSBT_ALL, &d3d9_state_block) < 0)\n        return;\n\n    // Copy and convert all vertices into a single contiguous buffer\n    CUSTOMVERTEX* vtx_dst;\n    ImDrawIdx* idx_dst;\n    if (g_pVB->Lock(0, (UINT)(draw_data->TotalVtxCount * sizeof(CUSTOMVERTEX)), (void**)&vtx_dst, D3DLOCK_DISCARD) < 0)\n        return;\n    if (g_pIB->Lock(0, (UINT)(draw_data->TotalIdxCount * sizeof(ImDrawIdx)), (void**)&idx_dst, D3DLOCK_DISCARD) < 0)\n        return;\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        const ImDrawVert* vtx_src = cmd_list->VtxBuffer.Data;\n        for (int i = 0; i < cmd_list->VtxBuffer.Size; i++)\n        {\n            vtx_dst->pos[0] = vtx_src->pos.x;\n            vtx_dst->pos[1] = vtx_src->pos.y;\n            vtx_dst->pos[2] = 0.0f;\n            vtx_dst->col = (vtx_src->col & 0xFF00FF00) | ((vtx_src->col & 0xFF0000)>>16) | ((vtx_src->col & 0xFF) << 16);     // RGBA --> ARGB for DirectX9\n            vtx_dst->uv[0] = vtx_src->uv.x;\n            vtx_dst->uv[1] = vtx_src->uv.y;\n            vtx_dst++;\n            vtx_src++;\n        }\n        memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));\n        idx_dst += cmd_list->IdxBuffer.Size;\n    }\n    g_pVB->Unlock();\n    g_pIB->Unlock();\n    g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));\n    g_pd3dDevice->SetIndices(g_pIB);\n    g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);\n\n    // Setup viewport\n    D3DVIEWPORT9 vp;\n    vp.X = vp.Y = 0;\n    vp.Width = (DWORD)io.DisplaySize.x;\n    vp.Height = (DWORD)io.DisplaySize.y;\n    vp.MinZ = 0.0f;\n    vp.MaxZ = 1.0f;\n    g_pd3dDevice->SetViewport(&vp);\n\n    // Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing\n    g_pd3dDevice->SetPixelShader(NULL);\n    g_pd3dDevice->SetVertexShader(NULL);\n    g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);\n    g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);\n    g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);\n    g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);\n    g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, false);\n    g_pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);\n    g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);\n    g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);\n    g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, true);\n    g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);\n    g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);\n    g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);\n    g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);\n    g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);\n    g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);\n    g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);\n    g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);\n\n    // Setup orthographic projection matrix\n    // Being agnostic of whether <d3dx9.h> or <DirectXMath.h> can be used, we aren't relying on D3DXMatrixIdentity()/D3DXMatrixOrthoOffCenterLH() or DirectX::XMMatrixIdentity()/DirectX::XMMatrixOrthographicOffCenterLH()\n    {\n        const float L = 0.5f, R = io.DisplaySize.x+0.5f, T = 0.5f, B = io.DisplaySize.y+0.5f;\n        D3DMATRIX mat_identity = { { 1.0f, 0.0f, 0.0f, 0.0f,  0.0f, 1.0f, 0.0f, 0.0f,  0.0f, 0.0f, 1.0f, 0.0f,  0.0f, 0.0f, 0.0f, 1.0f } };\n        D3DMATRIX mat_projection =\n        {\n            2.0f/(R-L),   0.0f,         0.0f,  0.0f,\n            0.0f,         2.0f/(T-B),   0.0f,  0.0f,\n            0.0f,         0.0f,         0.5f,  0.0f,\n            (L+R)/(L-R),  (T+B)/(B-T),  0.5f,  1.0f,\n        };\n        g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat_identity);\n        g_pd3dDevice->SetTransform(D3DTS_VIEW, &mat_identity);\n        g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat_projection);\n    }\n\n    // Render command lists\n    int vtx_offset = 0;\n    int idx_offset = 0;\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                const RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };\n                g_pd3dDevice->SetTexture(0, (LPDIRECT3DTEXTURE9)pcmd->TextureId);\n                g_pd3dDevice->SetScissorRect(&r);\n                g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, vtx_offset, 0, (UINT)cmd_list->VtxBuffer.Size, idx_offset, pcmd->ElemCount/3);\n            }\n            idx_offset += pcmd->ElemCount;\n        }\n        vtx_offset += cmd_list->VtxBuffer.Size;\n    }\n\n    // Restore the DX9 state\n    d3d9_state_block->Apply();\n    d3d9_state_block->Release();\n}\n\nstatic bool IsAnyMouseButtonDown()\n{\n    ImGuiIO& io = ImGui::GetIO();\n    for (int n = 0; n < ARRAYSIZE(io.MouseDown); n++)\n        if (io.MouseDown[n])\n            return true;\n    return false;\n}\n\n// Process Win32 mouse/keyboard inputs. \n// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n// PS: In this Win32 handler, we use the capture API (GetCapture/SetCapture/ReleaseCapture) to be able to read mouse coordinations when dragging mouse outside of our window bounds.\nIMGUI_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    switch (msg)\n    {\n    case WM_LBUTTONDOWN:\n    case WM_RBUTTONDOWN:\n    case WM_MBUTTONDOWN:\n    {\n        int button = 0;\n        if (msg == WM_LBUTTONDOWN) button = 0;\n        if (msg == WM_RBUTTONDOWN) button = 1;\n        if (msg == WM_MBUTTONDOWN) button = 2;\n        if (!IsAnyMouseButtonDown() && GetCapture() == NULL)\n            SetCapture(hwnd);\n        io.MouseDown[button] = true;\n        return 0;\n    }\n    case WM_LBUTTONUP:\n    case WM_RBUTTONUP:\n    case WM_MBUTTONUP:\n    {\n        int button = 0;\n        if (msg == WM_LBUTTONUP) button = 0;\n        if (msg == WM_RBUTTONUP) button = 1;\n        if (msg == WM_MBUTTONUP) button = 2;\n        io.MouseDown[button] = false;\n        if (!IsAnyMouseButtonDown() && GetCapture() == hwnd)\n            ReleaseCapture();\n        return 0;\n    }\n    case WM_MOUSEWHEEL:\n        io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f;\n        return 0;\n    case WM_MOUSEMOVE:\n        io.MousePos.x = (signed short)(lParam);\n        io.MousePos.y = (signed short)(lParam >> 16);\n        return 0;\n    case WM_KEYDOWN:\n    case WM_SYSKEYDOWN:\n        if (wParam < 256)\n            io.KeysDown[wParam] = 1;\n        return 0;\n    case WM_KEYUP:\n    case WM_SYSKEYUP:\n        if (wParam < 256)\n            io.KeysDown[wParam] = 0;\n        return 0;\n    case WM_CHAR:\n        // You can also use ToAscii()+GetKeyboardState() to retrieve characters.\n        if (wParam > 0 && wParam < 0x10000)\n            io.AddInputCharacter((unsigned short)wParam);\n        return 0;\n    }\n    return 0;\n}\n\nbool    ImGui_ImplDX9_Init(void* hwnd, IDirect3DDevice9* device)\n{\n    g_hWnd = (HWND)hwnd;\n    g_pd3dDevice = device;\n\n    if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond))\n        return false;\n    if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time))\n        return false;\n\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = VK_TAB;                       // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.\n    io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = VK_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;\n    io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;\n    io.KeyMap[ImGuiKey_Home] = VK_HOME;\n    io.KeyMap[ImGuiKey_End] = VK_END;\n    io.KeyMap[ImGuiKey_Delete] = VK_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = VK_BACK;\n    io.KeyMap[ImGuiKey_Enter] = VK_RETURN;\n    io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = 'A';\n    io.KeyMap[ImGuiKey_C] = 'C';\n    io.KeyMap[ImGuiKey_V] = 'V';\n    io.KeyMap[ImGuiKey_X] = 'X';\n    io.KeyMap[ImGuiKey_Y] = 'Y';\n    io.KeyMap[ImGuiKey_Z] = 'Z';\n\n    io.RenderDrawListsFn = ImGui_ImplDX9_RenderDrawLists;   // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.ImeWindowHandle = g_hWnd;\n\n    return true;\n}\n\nvoid ImGui_ImplDX9_Shutdown()\n{\n    ImGui_ImplDX9_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n    g_pd3dDevice = NULL;\n    g_hWnd = 0;\n}\n\nstatic bool ImGui_ImplDX9_CreateFontsTexture()\n{\n    // Build texture atlas\n    ImGuiIO& io = ImGui::GetIO();\n    unsigned char* pixels;\n    int width, height, bytes_per_pixel;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, &bytes_per_pixel);\n\n    // Upload texture to graphics system\n    g_FontTexture = NULL;\n    if (g_pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &g_FontTexture, NULL) < 0)\n        return false;\n    D3DLOCKED_RECT tex_locked_rect;\n    if (g_FontTexture->LockRect(0, &tex_locked_rect, NULL, 0) != D3D_OK)\n        return false;\n    for (int y = 0; y < height; y++)\n        memcpy((unsigned char *)tex_locked_rect.pBits + tex_locked_rect.Pitch * y, pixels + (width * bytes_per_pixel) * y, (width * bytes_per_pixel));\n    g_FontTexture->UnlockRect(0);\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)g_FontTexture;\n\n    return true;\n}\n\nbool ImGui_ImplDX9_CreateDeviceObjects()\n{\n    if (!g_pd3dDevice)\n        return false;\n    if (!ImGui_ImplDX9_CreateFontsTexture())\n        return false;\n    return true;\n}\n\nvoid ImGui_ImplDX9_InvalidateDeviceObjects()\n{\n    if (!g_pd3dDevice)\n        return;\n    if (g_pVB)\n    {\n        g_pVB->Release();\n        g_pVB = NULL;\n    }\n    if (g_pIB)\n    {\n        g_pIB->Release();\n        g_pIB = NULL;\n    }\n\n    // At this point note that we set ImGui::GetIO().Fonts->TexID to be == g_FontTexture, so clear both.\n    ImGuiIO& io = ImGui::GetIO();\n    IM_ASSERT(g_FontTexture == io.Fonts->TexID);\n    if (g_FontTexture)\n        g_FontTexture->Release();\n    g_FontTexture = NULL;\n    io.Fonts->TexID = NULL;\n}\n\nvoid ImGui_ImplDX9_NewFrame()\n{\n    if (!g_FontTexture)\n        ImGui_ImplDX9_CreateDeviceObjects();\n\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    RECT rect;\n    GetClientRect(g_hWnd, &rect);\n    io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));\n\n    // Setup time step\n    INT64 current_time;\n    QueryPerformanceCounter((LARGE_INTEGER *)&current_time);\n    io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond;\n    g_Time = current_time;\n\n    // Read keyboard modifiers inputs\n    io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;\n    io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;\n    io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;\n    io.KeySuper = false;\n    // io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events\n    // io.MousePos : filled by WM_MOUSEMOVE events\n    // io.MouseDown : filled by WM_*BUTTON* events\n    // io.MouseWheel : filled by WM_MOUSEWHEEL events\n\n    // Set OS mouse position if requested last frame by io.WantMoveMouse flag (used when io.NavMovesTrue is enabled by user and using directional navigation)\n    if (io.WantMoveMouse)\n    {\n        POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y };\n        ClientToScreen(g_hWnd, &pos);\n        SetCursorPos(pos.x, pos.y);\n    }\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    if (io.MouseDrawCursor)\n        SetCursor(NULL);\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n"
  },
  {
    "path": "external/imgui/examples/directx9_example/imgui_impl_dx9.h",
    "content": "// ImGui Win32 + DirectX9 binding\n// In this binding, ImTextureID is used to store a 'LPDIRECT3DTEXTURE9' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\nstruct IDirect3DDevice9;\n\nIMGUI_API bool        ImGui_ImplDX9_Init(void* hwnd, IDirect3DDevice9* device);\nIMGUI_API void        ImGui_ImplDX9_Shutdown();\nIMGUI_API void        ImGui_ImplDX9_NewFrame();\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_ImplDX9_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_ImplDX9_CreateDeviceObjects();\n\n// Handler for Win32 messages, update mouse/keyboard data.\n// You may or not need this for your implementation, but it can serve as reference for handling inputs.\n// Commented out to avoid dragging dependencies on <windows.h> types. You can copy the extern declaration in your code.\n/*\nIMGUI_API LRESULT   ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);\n*/\n"
  },
  {
    "path": "external/imgui/examples/directx9_example/main.cpp",
    "content": "// ImGui - standalone example application for DirectX 9\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n\n#include <imgui.h>\n#include \"imgui_impl_dx9.h\"\n#include <d3d9.h>\n#define DIRECTINPUT_VERSION 0x0800\n#include <dinput.h>\n#include <tchar.h>\n\n// Data\nstatic LPDIRECT3DDEVICE9        g_pd3dDevice = NULL;\nstatic D3DPRESENT_PARAMETERS    g_d3dpp;\n\nextern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);\nLRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)\n{\n    if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))\n        return true;\n\n    switch (msg)\n    {\n    case WM_SIZE:\n        if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)\n        {\n            ImGui_ImplDX9_InvalidateDeviceObjects();\n            g_d3dpp.BackBufferWidth  = LOWORD(lParam);\n            g_d3dpp.BackBufferHeight = HIWORD(lParam);\n            HRESULT hr = g_pd3dDevice->Reset(&g_d3dpp);\n            if (hr == D3DERR_INVALIDCALL)\n                IM_ASSERT(0);\n            ImGui_ImplDX9_CreateDeviceObjects();\n        }\n        return 0;\n    case WM_SYSCOMMAND:\n        if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu\n            return 0;\n        break;\n    case WM_DESTROY:\n        PostQuitMessage(0);\n        return 0;\n    }\n    return DefWindowProc(hWnd, msg, wParam, lParam);\n}\n\nint main(int, char**)\n{\n    // Create application window\n    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, _T(\"ImGui Example\"), NULL };\n    RegisterClassEx(&wc);\n    HWND hwnd = CreateWindow(_T(\"ImGui Example\"), _T(\"ImGui DirectX9 Example\"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);\n\n    // Initialize Direct3D\n    LPDIRECT3D9 pD3D;\n    if ((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)\n    {\n        UnregisterClass(_T(\"ImGui Example\"), wc.hInstance);\n        return 0;\n    }\n    ZeroMemory(&g_d3dpp, sizeof(g_d3dpp));\n    g_d3dpp.Windowed = TRUE;\n    g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;\n    g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;\n    g_d3dpp.EnableAutoDepthStencil = TRUE;\n    g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;\n    g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // Present with vsync\n    //g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Present without vsync, maximum unthrottled framerate\n\n    // Create the D3DDevice\n    if (pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_d3dpp, &g_pd3dDevice) < 0)\n    {\n        pD3D->Release();\n        UnregisterClass(_T(\"ImGui Example\"), wc.hInstance);\n        return 0;\n    }\n\n    // Setup ImGui binding\n    ImGui_ImplDX9_Init(hwnd, g_pd3dDevice);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    MSG msg;\n    ZeroMemory(&msg, sizeof(msg));\n    ShowWindow(hwnd, SW_SHOWDEFAULT);\n    UpdateWindow(hwnd);\n    while (msg.message != WM_QUIT)\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))\n        {\n            TranslateMessage(&msg);\n            DispatchMessage(&msg);\n            continue;\n        }\n        ImGui_ImplDX9_NewFrame();\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);\n        g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);\n        g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, false);\n        D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_color.x*255.0f), (int)(clear_color.y*255.0f), (int)(clear_color.z*255.0f), (int)(clear_color.w*255.0f));\n        g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clear_col_dx, 1.0f, 0);\n        if (g_pd3dDevice->BeginScene() >= 0)\n        {\n            ImGui::Render();\n            g_pd3dDevice->EndScene();\n        }\n        g_pd3dDevice->Present(NULL, NULL, NULL, NULL);\n    }\n\n    ImGui_ImplDX9_Shutdown();\n    if (g_pd3dDevice) g_pd3dDevice->Release();\n    if (pD3D) pD3D->Release();\n    UnregisterClass(_T(\"ImGui Example\"), wc.hInstance);\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/imgui_examples_msvc2010.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 11.00\n# Visual Studio 2010\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"opengl2_example\", \"opengl2_example\\opengl2_example.vcxproj\", \"{9CDA7840-B7A5-496D-A527-E95571496D18}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"directx9_example\", \"directx9_example\\directx9_example.vcxproj\", \"{4165A294-21F2-44CA-9B38-E3F935ABADF5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"directx11_example\", \"directx11_example\\directx11_example.vcxproj\", \"{9F316E83-5AE5-4939-A723-305A94F48005}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"opengl3_example\", \"opengl3_example\\opengl3_example.vcxproj\", \"{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"directx10_example\", \"directx10_example\\directx10_example.vcxproj\", \"{345A953E-A004-4648-B442-DC5F9F11068C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|x64.Build.0 = Debug|x64\n\t\t{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.Build.0 = Release|Win32\n\t\t{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|x64.ActiveCfg = Release|x64\n\t\t{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|x64.Build.0 = Release|x64\n\t\t{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|x64.Build.0 = Debug|x64\n\t\t{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.Build.0 = Release|Win32\n\t\t{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|x64.ActiveCfg = Release|x64\n\t\t{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|x64.Build.0 = Release|x64\n\t\t{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|x64.Build.0 = Debug|x64\n\t\t{9F316E83-5AE5-4939-A723-305A94F48005}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{9F316E83-5AE5-4939-A723-305A94F48005}.Release|Win32.Build.0 = Release|Win32\n\t\t{9F316E83-5AE5-4939-A723-305A94F48005}.Release|x64.ActiveCfg = Release|x64\n\t\t{9F316E83-5AE5-4939-A723-305A94F48005}.Release|x64.Build.0 = Release|x64\n\t\t{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|x64.Build.0 = Debug|x64\n\t\t{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|Win32.Build.0 = Release|Win32\n\t\t{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|x64.ActiveCfg = Release|x64\n\t\t{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|x64.Build.0 = Release|x64\n\t\t{345A953E-A004-4648-B442-DC5F9F11068C}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{345A953E-A004-4648-B442-DC5F9F11068C}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{345A953E-A004-4648-B442-DC5F9F11068C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{345A953E-A004-4648-B442-DC5F9F11068C}.Debug|x64.Build.0 = Debug|x64\n\t\t{345A953E-A004-4648-B442-DC5F9F11068C}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{345A953E-A004-4648-B442-DC5F9F11068C}.Release|Win32.Build.0 = Release|Win32\n\t\t{345A953E-A004-4648-B442-DC5F9F11068C}.Release|x64.ActiveCfg = Release|x64\n\t\t{345A953E-A004-4648-B442-DC5F9F11068C}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "external/imgui/examples/libs/gl3w/GL/gl3w.c",
    "content": "#include <GL/gl3w.h>\n\n#ifdef _MSC_VER\n#pragma warning (disable: 4055) // warning C4055: 'type cast' : from data pointer 'void *' to function pointer\n#pragma warning (disable: 4152) // warning C4152: nonstandard extension, function/data pointer conversion in expression\n#endif\n\n#ifdef _WIN32\n#define WIN32_LEAN_AND_MEAN 1\n#include <windows.h>\n\nstatic HMODULE libgl;\n\nstatic void open_libgl(void)\n{\n\tlibgl = LoadLibraryA(\"opengl32.dll\");\n}\n\nstatic void close_libgl(void)\n{\n\tFreeLibrary(libgl);\n}\n\nstatic void *get_proc(const char *proc)\n{\n\tvoid *res;\n\n\tres = wglGetProcAddress(proc);\n\tif (!res)\n\t\tres = GetProcAddress(libgl, proc);\n\treturn res;\n}\n#elif defined(__APPLE__) || defined(__APPLE_CC__)\n#include <Carbon/Carbon.h>\n\nCFBundleRef bundle;\nCFURLRef bundleURL;\n\nstatic void open_libgl(void)\n{\n\tbundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,\n\t\tCFSTR(\"/System/Library/Frameworks/OpenGL.framework\"),\n\t\tkCFURLPOSIXPathStyle, true);\n\n\tbundle = CFBundleCreate(kCFAllocatorDefault, bundleURL);\n\tassert(bundle != NULL);\n}\n\nstatic void close_libgl(void)\n{\n\tCFRelease(bundle);\n\tCFRelease(bundleURL);\n}\n\nstatic void *get_proc(const char *proc)\n{\n\tvoid *res;\n\n\tCFStringRef procname = CFStringCreateWithCString(kCFAllocatorDefault, proc,\n\t\tkCFStringEncodingASCII);\n\tres = CFBundleGetFunctionPointerForName(bundle, procname);\n\tCFRelease(procname);\n\treturn res;\n}\n#else\n#include <dlfcn.h>\n#include <GL/glx.h>\n\nstatic void *libgl;\n\nstatic void open_libgl(void)\n{\n\tlibgl = dlopen(\"libGL.so.1\", RTLD_LAZY | RTLD_GLOBAL);\n}\n\nstatic void close_libgl(void)\n{\n\tdlclose(libgl);\n}\n\nstatic void *get_proc(const char *proc)\n{\n\tvoid *res;\n\n\tres = (void*)glXGetProcAddress((const GLubyte *) proc);\n\tif (!res)\n\t\tres = dlsym(libgl, proc);\n\treturn res;\n}\n#endif\n\nstatic struct {\n\tint major, minor;\n} version;\n\nstatic int parse_version(void)\n{\n\tif (!glGetIntegerv)\n\t\treturn -1;\n\n\tglGetIntegerv(GL_MAJOR_VERSION, &version.major);\n\tglGetIntegerv(GL_MINOR_VERSION, &version.minor);\n\n\tif (version.major < 3)\n\t\treturn -1;\n\treturn 0;\n}\n\nstatic void load_procs(void);\n\nint gl3wInit(void)\n{\n\topen_libgl();\n\tload_procs();\n\tclose_libgl();\n\treturn parse_version();\n}\n\nint gl3wIsSupported(int major, int minor)\n{\n\tif (major < 3)\n\t\treturn 0;\n\tif (version.major == major)\n\t\treturn version.minor >= minor;\n\treturn version.major >= major;\n}\n\nvoid *gl3wGetProcAddress(const char *proc)\n{\n\treturn get_proc(proc);\n}\n\nPFNGLCULLFACEPROC gl3wCullFace;\nPFNGLFRONTFACEPROC gl3wFrontFace;\nPFNGLHINTPROC gl3wHint;\nPFNGLLINEWIDTHPROC gl3wLineWidth;\nPFNGLPOINTSIZEPROC gl3wPointSize;\nPFNGLPOLYGONMODEPROC gl3wPolygonMode;\nPFNGLSCISSORPROC gl3wScissor;\nPFNGLTEXPARAMETERFPROC gl3wTexParameterf;\nPFNGLTEXPARAMETERFVPROC gl3wTexParameterfv;\nPFNGLTEXPARAMETERIPROC gl3wTexParameteri;\nPFNGLTEXPARAMETERIVPROC gl3wTexParameteriv;\nPFNGLTEXIMAGE1DPROC gl3wTexImage1D;\nPFNGLTEXIMAGE2DPROC gl3wTexImage2D;\nPFNGLDRAWBUFFERPROC gl3wDrawBuffer;\nPFNGLCLEARPROC gl3wClear;\nPFNGLCLEARCOLORPROC gl3wClearColor;\nPFNGLCLEARSTENCILPROC gl3wClearStencil;\nPFNGLCLEARDEPTHPROC gl3wClearDepth;\nPFNGLSTENCILMASKPROC gl3wStencilMask;\nPFNGLCOLORMASKPROC gl3wColorMask;\nPFNGLDEPTHMASKPROC gl3wDepthMask;\nPFNGLDISABLEPROC gl3wDisable;\nPFNGLENABLEPROC gl3wEnable;\nPFNGLFINISHPROC gl3wFinish;\nPFNGLFLUSHPROC gl3wFlush;\nPFNGLBLENDFUNCPROC gl3wBlendFunc;\nPFNGLLOGICOPPROC gl3wLogicOp;\nPFNGLSTENCILFUNCPROC gl3wStencilFunc;\nPFNGLSTENCILOPPROC gl3wStencilOp;\nPFNGLDEPTHFUNCPROC gl3wDepthFunc;\nPFNGLPIXELSTOREFPROC gl3wPixelStoref;\nPFNGLPIXELSTOREIPROC gl3wPixelStorei;\nPFNGLREADBUFFERPROC gl3wReadBuffer;\nPFNGLREADPIXELSPROC gl3wReadPixels;\nPFNGLGETBOOLEANVPROC gl3wGetBooleanv;\nPFNGLGETDOUBLEVPROC gl3wGetDoublev;\nPFNGLGETERRORPROC gl3wGetError;\nPFNGLGETFLOATVPROC gl3wGetFloatv;\nPFNGLGETINTEGERVPROC gl3wGetIntegerv;\nPFNGLGETSTRINGPROC gl3wGetString;\nPFNGLGETTEXIMAGEPROC gl3wGetTexImage;\nPFNGLGETTEXPARAMETERFVPROC gl3wGetTexParameterfv;\nPFNGLGETTEXPARAMETERIVPROC gl3wGetTexParameteriv;\nPFNGLGETTEXLEVELPARAMETERFVPROC gl3wGetTexLevelParameterfv;\nPFNGLGETTEXLEVELPARAMETERIVPROC gl3wGetTexLevelParameteriv;\nPFNGLISENABLEDPROC gl3wIsEnabled;\nPFNGLDEPTHRANGEPROC gl3wDepthRange;\nPFNGLVIEWPORTPROC gl3wViewport;\nPFNGLDRAWARRAYSPROC gl3wDrawArrays;\nPFNGLDRAWELEMENTSPROC gl3wDrawElements;\nPFNGLGETPOINTERVPROC gl3wGetPointerv;\nPFNGLPOLYGONOFFSETPROC gl3wPolygonOffset;\nPFNGLCOPYTEXIMAGE1DPROC gl3wCopyTexImage1D;\nPFNGLCOPYTEXIMAGE2DPROC gl3wCopyTexImage2D;\nPFNGLCOPYTEXSUBIMAGE1DPROC gl3wCopyTexSubImage1D;\nPFNGLCOPYTEXSUBIMAGE2DPROC gl3wCopyTexSubImage2D;\nPFNGLTEXSUBIMAGE1DPROC gl3wTexSubImage1D;\nPFNGLTEXSUBIMAGE2DPROC gl3wTexSubImage2D;\nPFNGLBINDTEXTUREPROC gl3wBindTexture;\nPFNGLDELETETEXTURESPROC gl3wDeleteTextures;\nPFNGLGENTEXTURESPROC gl3wGenTextures;\nPFNGLISTEXTUREPROC gl3wIsTexture;\nPFNGLBLENDCOLORPROC gl3wBlendColor;\nPFNGLBLENDEQUATIONPROC gl3wBlendEquation;\nPFNGLDRAWRANGEELEMENTSPROC gl3wDrawRangeElements;\nPFNGLTEXIMAGE3DPROC gl3wTexImage3D;\nPFNGLTEXSUBIMAGE3DPROC gl3wTexSubImage3D;\nPFNGLCOPYTEXSUBIMAGE3DPROC gl3wCopyTexSubImage3D;\nPFNGLACTIVETEXTUREPROC gl3wActiveTexture;\nPFNGLSAMPLECOVERAGEPROC gl3wSampleCoverage;\nPFNGLCOMPRESSEDTEXIMAGE3DPROC gl3wCompressedTexImage3D;\nPFNGLCOMPRESSEDTEXIMAGE2DPROC gl3wCompressedTexImage2D;\nPFNGLCOMPRESSEDTEXIMAGE1DPROC gl3wCompressedTexImage1D;\nPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC gl3wCompressedTexSubImage3D;\nPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC gl3wCompressedTexSubImage2D;\nPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC gl3wCompressedTexSubImage1D;\nPFNGLGETCOMPRESSEDTEXIMAGEPROC gl3wGetCompressedTexImage;\nPFNGLBLENDFUNCSEPARATEPROC gl3wBlendFuncSeparate;\nPFNGLMULTIDRAWARRAYSPROC gl3wMultiDrawArrays;\nPFNGLMULTIDRAWELEMENTSPROC gl3wMultiDrawElements;\nPFNGLPOINTPARAMETERFPROC gl3wPointParameterf;\nPFNGLPOINTPARAMETERFVPROC gl3wPointParameterfv;\nPFNGLPOINTPARAMETERIPROC gl3wPointParameteri;\nPFNGLPOINTPARAMETERIVPROC gl3wPointParameteriv;\nPFNGLGENQUERIESPROC gl3wGenQueries;\nPFNGLDELETEQUERIESPROC gl3wDeleteQueries;\nPFNGLISQUERYPROC gl3wIsQuery;\nPFNGLBEGINQUERYPROC gl3wBeginQuery;\nPFNGLENDQUERYPROC gl3wEndQuery;\nPFNGLGETQUERYIVPROC gl3wGetQueryiv;\nPFNGLGETQUERYOBJECTIVPROC gl3wGetQueryObjectiv;\nPFNGLGETQUERYOBJECTUIVPROC gl3wGetQueryObjectuiv;\nPFNGLBINDBUFFERPROC gl3wBindBuffer;\nPFNGLDELETEBUFFERSPROC gl3wDeleteBuffers;\nPFNGLGENBUFFERSPROC gl3wGenBuffers;\nPFNGLISBUFFERPROC gl3wIsBuffer;\nPFNGLBUFFERDATAPROC gl3wBufferData;\nPFNGLBUFFERSUBDATAPROC gl3wBufferSubData;\nPFNGLGETBUFFERSUBDATAPROC gl3wGetBufferSubData;\nPFNGLMAPBUFFERPROC gl3wMapBuffer;\nPFNGLUNMAPBUFFERPROC gl3wUnmapBuffer;\nPFNGLGETBUFFERPARAMETERIVPROC gl3wGetBufferParameteriv;\nPFNGLGETBUFFERPOINTERVPROC gl3wGetBufferPointerv;\nPFNGLBLENDEQUATIONSEPARATEPROC gl3wBlendEquationSeparate;\nPFNGLDRAWBUFFERSPROC gl3wDrawBuffers;\nPFNGLSTENCILOPSEPARATEPROC gl3wStencilOpSeparate;\nPFNGLSTENCILFUNCSEPARATEPROC gl3wStencilFuncSeparate;\nPFNGLSTENCILMASKSEPARATEPROC gl3wStencilMaskSeparate;\nPFNGLATTACHSHADERPROC gl3wAttachShader;\nPFNGLBINDATTRIBLOCATIONPROC gl3wBindAttribLocation;\nPFNGLCOMPILESHADERPROC gl3wCompileShader;\nPFNGLCREATEPROGRAMPROC gl3wCreateProgram;\nPFNGLCREATESHADERPROC gl3wCreateShader;\nPFNGLDELETEPROGRAMPROC gl3wDeleteProgram;\nPFNGLDELETESHADERPROC gl3wDeleteShader;\nPFNGLDETACHSHADERPROC gl3wDetachShader;\nPFNGLDISABLEVERTEXATTRIBARRAYPROC gl3wDisableVertexAttribArray;\nPFNGLENABLEVERTEXATTRIBARRAYPROC gl3wEnableVertexAttribArray;\nPFNGLGETACTIVEATTRIBPROC gl3wGetActiveAttrib;\nPFNGLGETACTIVEUNIFORMPROC gl3wGetActiveUniform;\nPFNGLGETATTACHEDSHADERSPROC gl3wGetAttachedShaders;\nPFNGLGETATTRIBLOCATIONPROC gl3wGetAttribLocation;\nPFNGLGETPROGRAMIVPROC gl3wGetProgramiv;\nPFNGLGETPROGRAMINFOLOGPROC gl3wGetProgramInfoLog;\nPFNGLGETSHADERIVPROC gl3wGetShaderiv;\nPFNGLGETSHADERINFOLOGPROC gl3wGetShaderInfoLog;\nPFNGLGETSHADERSOURCEPROC gl3wGetShaderSource;\nPFNGLGETUNIFORMLOCATIONPROC gl3wGetUniformLocation;\nPFNGLGETUNIFORMFVPROC gl3wGetUniformfv;\nPFNGLGETUNIFORMIVPROC gl3wGetUniformiv;\nPFNGLGETVERTEXATTRIBDVPROC gl3wGetVertexAttribdv;\nPFNGLGETVERTEXATTRIBFVPROC gl3wGetVertexAttribfv;\nPFNGLGETVERTEXATTRIBIVPROC gl3wGetVertexAttribiv;\nPFNGLGETVERTEXATTRIBPOINTERVPROC gl3wGetVertexAttribPointerv;\nPFNGLISPROGRAMPROC gl3wIsProgram;\nPFNGLISSHADERPROC gl3wIsShader;\nPFNGLLINKPROGRAMPROC gl3wLinkProgram;\nPFNGLSHADERSOURCEPROC gl3wShaderSource;\nPFNGLUSEPROGRAMPROC gl3wUseProgram;\nPFNGLUNIFORM1FPROC gl3wUniform1f;\nPFNGLUNIFORM2FPROC gl3wUniform2f;\nPFNGLUNIFORM3FPROC gl3wUniform3f;\nPFNGLUNIFORM4FPROC gl3wUniform4f;\nPFNGLUNIFORM1IPROC gl3wUniform1i;\nPFNGLUNIFORM2IPROC gl3wUniform2i;\nPFNGLUNIFORM3IPROC gl3wUniform3i;\nPFNGLUNIFORM4IPROC gl3wUniform4i;\nPFNGLUNIFORM1FVPROC gl3wUniform1fv;\nPFNGLUNIFORM2FVPROC gl3wUniform2fv;\nPFNGLUNIFORM3FVPROC gl3wUniform3fv;\nPFNGLUNIFORM4FVPROC gl3wUniform4fv;\nPFNGLUNIFORM1IVPROC gl3wUniform1iv;\nPFNGLUNIFORM2IVPROC gl3wUniform2iv;\nPFNGLUNIFORM3IVPROC gl3wUniform3iv;\nPFNGLUNIFORM4IVPROC gl3wUniform4iv;\nPFNGLUNIFORMMATRIX2FVPROC gl3wUniformMatrix2fv;\nPFNGLUNIFORMMATRIX3FVPROC gl3wUniformMatrix3fv;\nPFNGLUNIFORMMATRIX4FVPROC gl3wUniformMatrix4fv;\nPFNGLVALIDATEPROGRAMPROC gl3wValidateProgram;\nPFNGLVERTEXATTRIB1DPROC gl3wVertexAttrib1d;\nPFNGLVERTEXATTRIB1DVPROC gl3wVertexAttrib1dv;\nPFNGLVERTEXATTRIB1FPROC gl3wVertexAttrib1f;\nPFNGLVERTEXATTRIB1FVPROC gl3wVertexAttrib1fv;\nPFNGLVERTEXATTRIB1SPROC gl3wVertexAttrib1s;\nPFNGLVERTEXATTRIB1SVPROC gl3wVertexAttrib1sv;\nPFNGLVERTEXATTRIB2DPROC gl3wVertexAttrib2d;\nPFNGLVERTEXATTRIB2DVPROC gl3wVertexAttrib2dv;\nPFNGLVERTEXATTRIB2FPROC gl3wVertexAttrib2f;\nPFNGLVERTEXATTRIB2FVPROC gl3wVertexAttrib2fv;\nPFNGLVERTEXATTRIB2SPROC gl3wVertexAttrib2s;\nPFNGLVERTEXATTRIB2SVPROC gl3wVertexAttrib2sv;\nPFNGLVERTEXATTRIB3DPROC gl3wVertexAttrib3d;\nPFNGLVERTEXATTRIB3DVPROC gl3wVertexAttrib3dv;\nPFNGLVERTEXATTRIB3FPROC gl3wVertexAttrib3f;\nPFNGLVERTEXATTRIB3FVPROC gl3wVertexAttrib3fv;\nPFNGLVERTEXATTRIB3SPROC gl3wVertexAttrib3s;\nPFNGLVERTEXATTRIB3SVPROC gl3wVertexAttrib3sv;\nPFNGLVERTEXATTRIB4NBVPROC gl3wVertexAttrib4Nbv;\nPFNGLVERTEXATTRIB4NIVPROC gl3wVertexAttrib4Niv;\nPFNGLVERTEXATTRIB4NSVPROC gl3wVertexAttrib4Nsv;\nPFNGLVERTEXATTRIB4NUBPROC gl3wVertexAttrib4Nub;\nPFNGLVERTEXATTRIB4NUBVPROC gl3wVertexAttrib4Nubv;\nPFNGLVERTEXATTRIB4NUIVPROC gl3wVertexAttrib4Nuiv;\nPFNGLVERTEXATTRIB4NUSVPROC gl3wVertexAttrib4Nusv;\nPFNGLVERTEXATTRIB4BVPROC gl3wVertexAttrib4bv;\nPFNGLVERTEXATTRIB4DPROC gl3wVertexAttrib4d;\nPFNGLVERTEXATTRIB4DVPROC gl3wVertexAttrib4dv;\nPFNGLVERTEXATTRIB4FPROC gl3wVertexAttrib4f;\nPFNGLVERTEXATTRIB4FVPROC gl3wVertexAttrib4fv;\nPFNGLVERTEXATTRIB4IVPROC gl3wVertexAttrib4iv;\nPFNGLVERTEXATTRIB4SPROC gl3wVertexAttrib4s;\nPFNGLVERTEXATTRIB4SVPROC gl3wVertexAttrib4sv;\nPFNGLVERTEXATTRIB4UBVPROC gl3wVertexAttrib4ubv;\nPFNGLVERTEXATTRIB4UIVPROC gl3wVertexAttrib4uiv;\nPFNGLVERTEXATTRIB4USVPROC gl3wVertexAttrib4usv;\nPFNGLVERTEXATTRIBPOINTERPROC gl3wVertexAttribPointer;\nPFNGLUNIFORMMATRIX2X3FVPROC gl3wUniformMatrix2x3fv;\nPFNGLUNIFORMMATRIX3X2FVPROC gl3wUniformMatrix3x2fv;\nPFNGLUNIFORMMATRIX2X4FVPROC gl3wUniformMatrix2x4fv;\nPFNGLUNIFORMMATRIX4X2FVPROC gl3wUniformMatrix4x2fv;\nPFNGLUNIFORMMATRIX3X4FVPROC gl3wUniformMatrix3x4fv;\nPFNGLUNIFORMMATRIX4X3FVPROC gl3wUniformMatrix4x3fv;\nPFNGLCOLORMASKIPROC gl3wColorMaski;\nPFNGLGETBOOLEANI_VPROC gl3wGetBooleani_v;\nPFNGLGETINTEGERI_VPROC gl3wGetIntegeri_v;\nPFNGLENABLEIPROC gl3wEnablei;\nPFNGLDISABLEIPROC gl3wDisablei;\nPFNGLISENABLEDIPROC gl3wIsEnabledi;\nPFNGLBEGINTRANSFORMFEEDBACKPROC gl3wBeginTransformFeedback;\nPFNGLENDTRANSFORMFEEDBACKPROC gl3wEndTransformFeedback;\nPFNGLBINDBUFFERRANGEPROC gl3wBindBufferRange;\nPFNGLBINDBUFFERBASEPROC gl3wBindBufferBase;\nPFNGLTRANSFORMFEEDBACKVARYINGSPROC gl3wTransformFeedbackVaryings;\nPFNGLGETTRANSFORMFEEDBACKVARYINGPROC gl3wGetTransformFeedbackVarying;\nPFNGLCLAMPCOLORPROC gl3wClampColor;\nPFNGLBEGINCONDITIONALRENDERPROC gl3wBeginConditionalRender;\nPFNGLENDCONDITIONALRENDERPROC gl3wEndConditionalRender;\nPFNGLVERTEXATTRIBIPOINTERPROC gl3wVertexAttribIPointer;\nPFNGLGETVERTEXATTRIBIIVPROC gl3wGetVertexAttribIiv;\nPFNGLGETVERTEXATTRIBIUIVPROC gl3wGetVertexAttribIuiv;\nPFNGLVERTEXATTRIBI1IPROC gl3wVertexAttribI1i;\nPFNGLVERTEXATTRIBI2IPROC gl3wVertexAttribI2i;\nPFNGLVERTEXATTRIBI3IPROC gl3wVertexAttribI3i;\nPFNGLVERTEXATTRIBI4IPROC gl3wVertexAttribI4i;\nPFNGLVERTEXATTRIBI1UIPROC gl3wVertexAttribI1ui;\nPFNGLVERTEXATTRIBI2UIPROC gl3wVertexAttribI2ui;\nPFNGLVERTEXATTRIBI3UIPROC gl3wVertexAttribI3ui;\nPFNGLVERTEXATTRIBI4UIPROC gl3wVertexAttribI4ui;\nPFNGLVERTEXATTRIBI1IVPROC gl3wVertexAttribI1iv;\nPFNGLVERTEXATTRIBI2IVPROC gl3wVertexAttribI2iv;\nPFNGLVERTEXATTRIBI3IVPROC gl3wVertexAttribI3iv;\nPFNGLVERTEXATTRIBI4IVPROC gl3wVertexAttribI4iv;\nPFNGLVERTEXATTRIBI1UIVPROC gl3wVertexAttribI1uiv;\nPFNGLVERTEXATTRIBI2UIVPROC gl3wVertexAttribI2uiv;\nPFNGLVERTEXATTRIBI3UIVPROC gl3wVertexAttribI3uiv;\nPFNGLVERTEXATTRIBI4UIVPROC gl3wVertexAttribI4uiv;\nPFNGLVERTEXATTRIBI4BVPROC gl3wVertexAttribI4bv;\nPFNGLVERTEXATTRIBI4SVPROC gl3wVertexAttribI4sv;\nPFNGLVERTEXATTRIBI4UBVPROC gl3wVertexAttribI4ubv;\nPFNGLVERTEXATTRIBI4USVPROC gl3wVertexAttribI4usv;\nPFNGLGETUNIFORMUIVPROC gl3wGetUniformuiv;\nPFNGLBINDFRAGDATALOCATIONPROC gl3wBindFragDataLocation;\nPFNGLGETFRAGDATALOCATIONPROC gl3wGetFragDataLocation;\nPFNGLUNIFORM1UIPROC gl3wUniform1ui;\nPFNGLUNIFORM2UIPROC gl3wUniform2ui;\nPFNGLUNIFORM3UIPROC gl3wUniform3ui;\nPFNGLUNIFORM4UIPROC gl3wUniform4ui;\nPFNGLUNIFORM1UIVPROC gl3wUniform1uiv;\nPFNGLUNIFORM2UIVPROC gl3wUniform2uiv;\nPFNGLUNIFORM3UIVPROC gl3wUniform3uiv;\nPFNGLUNIFORM4UIVPROC gl3wUniform4uiv;\nPFNGLTEXPARAMETERIIVPROC gl3wTexParameterIiv;\nPFNGLTEXPARAMETERIUIVPROC gl3wTexParameterIuiv;\nPFNGLGETTEXPARAMETERIIVPROC gl3wGetTexParameterIiv;\nPFNGLGETTEXPARAMETERIUIVPROC gl3wGetTexParameterIuiv;\nPFNGLCLEARBUFFERIVPROC gl3wClearBufferiv;\nPFNGLCLEARBUFFERUIVPROC gl3wClearBufferuiv;\nPFNGLCLEARBUFFERFVPROC gl3wClearBufferfv;\nPFNGLCLEARBUFFERFIPROC gl3wClearBufferfi;\nPFNGLGETSTRINGIPROC gl3wGetStringi;\nPFNGLDRAWARRAYSINSTANCEDPROC gl3wDrawArraysInstanced;\nPFNGLDRAWELEMENTSINSTANCEDPROC gl3wDrawElementsInstanced;\nPFNGLTEXBUFFERPROC gl3wTexBuffer;\nPFNGLPRIMITIVERESTARTINDEXPROC gl3wPrimitiveRestartIndex;\nPFNGLGETINTEGER64I_VPROC gl3wGetInteger64i_v;\nPFNGLGETBUFFERPARAMETERI64VPROC gl3wGetBufferParameteri64v;\nPFNGLFRAMEBUFFERTEXTUREPROC gl3wFramebufferTexture;\nPFNGLVERTEXATTRIBDIVISORPROC gl3wVertexAttribDivisor;\nPFNGLMINSAMPLESHADINGPROC gl3wMinSampleShading;\nPFNGLBLENDEQUATIONIPROC gl3wBlendEquationi;\nPFNGLBLENDEQUATIONSEPARATEIPROC gl3wBlendEquationSeparatei;\nPFNGLBLENDFUNCIPROC gl3wBlendFunci;\nPFNGLBLENDFUNCSEPARATEIPROC gl3wBlendFuncSeparatei;\nPFNGLISRENDERBUFFERPROC gl3wIsRenderbuffer;\nPFNGLBINDRENDERBUFFERPROC gl3wBindRenderbuffer;\nPFNGLDELETERENDERBUFFERSPROC gl3wDeleteRenderbuffers;\nPFNGLGENRENDERBUFFERSPROC gl3wGenRenderbuffers;\nPFNGLRENDERBUFFERSTORAGEPROC gl3wRenderbufferStorage;\nPFNGLGETRENDERBUFFERPARAMETERIVPROC gl3wGetRenderbufferParameteriv;\nPFNGLISFRAMEBUFFERPROC gl3wIsFramebuffer;\nPFNGLBINDFRAMEBUFFERPROC gl3wBindFramebuffer;\nPFNGLDELETEFRAMEBUFFERSPROC gl3wDeleteFramebuffers;\nPFNGLGENFRAMEBUFFERSPROC gl3wGenFramebuffers;\nPFNGLCHECKFRAMEBUFFERSTATUSPROC gl3wCheckFramebufferStatus;\nPFNGLFRAMEBUFFERTEXTURE1DPROC gl3wFramebufferTexture1D;\nPFNGLFRAMEBUFFERTEXTURE2DPROC gl3wFramebufferTexture2D;\nPFNGLFRAMEBUFFERTEXTURE3DPROC gl3wFramebufferTexture3D;\nPFNGLFRAMEBUFFERRENDERBUFFERPROC gl3wFramebufferRenderbuffer;\nPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC gl3wGetFramebufferAttachmentParameteriv;\nPFNGLGENERATEMIPMAPPROC gl3wGenerateMipmap;\nPFNGLBLITFRAMEBUFFERPROC gl3wBlitFramebuffer;\nPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC gl3wRenderbufferStorageMultisample;\nPFNGLFRAMEBUFFERTEXTURELAYERPROC gl3wFramebufferTextureLayer;\nPFNGLMAPBUFFERRANGEPROC gl3wMapBufferRange;\nPFNGLFLUSHMAPPEDBUFFERRANGEPROC gl3wFlushMappedBufferRange;\nPFNGLBINDVERTEXARRAYPROC gl3wBindVertexArray;\nPFNGLDELETEVERTEXARRAYSPROC gl3wDeleteVertexArrays;\nPFNGLGENVERTEXARRAYSPROC gl3wGenVertexArrays;\nPFNGLISVERTEXARRAYPROC gl3wIsVertexArray;\nPFNGLGETUNIFORMINDICESPROC gl3wGetUniformIndices;\nPFNGLGETACTIVEUNIFORMSIVPROC gl3wGetActiveUniformsiv;\nPFNGLGETACTIVEUNIFORMNAMEPROC gl3wGetActiveUniformName;\nPFNGLGETUNIFORMBLOCKINDEXPROC gl3wGetUniformBlockIndex;\nPFNGLGETACTIVEUNIFORMBLOCKIVPROC gl3wGetActiveUniformBlockiv;\nPFNGLGETACTIVEUNIFORMBLOCKNAMEPROC gl3wGetActiveUniformBlockName;\nPFNGLUNIFORMBLOCKBINDINGPROC gl3wUniformBlockBinding;\nPFNGLCOPYBUFFERSUBDATAPROC gl3wCopyBufferSubData;\nPFNGLDRAWELEMENTSBASEVERTEXPROC gl3wDrawElementsBaseVertex;\nPFNGLDRAWRANGEELEMENTSBASEVERTEXPROC gl3wDrawRangeElementsBaseVertex;\nPFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC gl3wDrawElementsInstancedBaseVertex;\nPFNGLMULTIDRAWELEMENTSBASEVERTEXPROC gl3wMultiDrawElementsBaseVertex;\nPFNGLPROVOKINGVERTEXPROC gl3wProvokingVertex;\nPFNGLFENCESYNCPROC gl3wFenceSync;\nPFNGLISSYNCPROC gl3wIsSync;\nPFNGLDELETESYNCPROC gl3wDeleteSync;\nPFNGLCLIENTWAITSYNCPROC gl3wClientWaitSync;\nPFNGLWAITSYNCPROC gl3wWaitSync;\nPFNGLGETINTEGER64VPROC gl3wGetInteger64v;\nPFNGLGETSYNCIVPROC gl3wGetSynciv;\nPFNGLTEXIMAGE2DMULTISAMPLEPROC gl3wTexImage2DMultisample;\nPFNGLTEXIMAGE3DMULTISAMPLEPROC gl3wTexImage3DMultisample;\nPFNGLGETMULTISAMPLEFVPROC gl3wGetMultisamplefv;\nPFNGLSAMPLEMASKIPROC gl3wSampleMaski;\nPFNGLBLENDEQUATIONIARBPROC gl3wBlendEquationiARB;\nPFNGLBLENDEQUATIONSEPARATEIARBPROC gl3wBlendEquationSeparateiARB;\nPFNGLBLENDFUNCIARBPROC gl3wBlendFunciARB;\nPFNGLBLENDFUNCSEPARATEIARBPROC gl3wBlendFuncSeparateiARB;\nPFNGLMINSAMPLESHADINGARBPROC gl3wMinSampleShadingARB;\nPFNGLNAMEDSTRINGARBPROC gl3wNamedStringARB;\nPFNGLDELETENAMEDSTRINGARBPROC gl3wDeleteNamedStringARB;\nPFNGLCOMPILESHADERINCLUDEARBPROC gl3wCompileShaderIncludeARB;\nPFNGLISNAMEDSTRINGARBPROC gl3wIsNamedStringARB;\nPFNGLGETNAMEDSTRINGARBPROC gl3wGetNamedStringARB;\nPFNGLGETNAMEDSTRINGIVARBPROC gl3wGetNamedStringivARB;\nPFNGLBINDFRAGDATALOCATIONINDEXEDPROC gl3wBindFragDataLocationIndexed;\nPFNGLGETFRAGDATAINDEXPROC gl3wGetFragDataIndex;\nPFNGLGENSAMPLERSPROC gl3wGenSamplers;\nPFNGLDELETESAMPLERSPROC gl3wDeleteSamplers;\nPFNGLISSAMPLERPROC gl3wIsSampler;\nPFNGLBINDSAMPLERPROC gl3wBindSampler;\nPFNGLSAMPLERPARAMETERIPROC gl3wSamplerParameteri;\nPFNGLSAMPLERPARAMETERIVPROC gl3wSamplerParameteriv;\nPFNGLSAMPLERPARAMETERFPROC gl3wSamplerParameterf;\nPFNGLSAMPLERPARAMETERFVPROC gl3wSamplerParameterfv;\nPFNGLSAMPLERPARAMETERIIVPROC gl3wSamplerParameterIiv;\nPFNGLSAMPLERPARAMETERIUIVPROC gl3wSamplerParameterIuiv;\nPFNGLGETSAMPLERPARAMETERIVPROC gl3wGetSamplerParameteriv;\nPFNGLGETSAMPLERPARAMETERIIVPROC gl3wGetSamplerParameterIiv;\nPFNGLGETSAMPLERPARAMETERFVPROC gl3wGetSamplerParameterfv;\nPFNGLGETSAMPLERPARAMETERIUIVPROC gl3wGetSamplerParameterIuiv;\nPFNGLQUERYCOUNTERPROC gl3wQueryCounter;\nPFNGLGETQUERYOBJECTI64VPROC gl3wGetQueryObjecti64v;\nPFNGLGETQUERYOBJECTUI64VPROC gl3wGetQueryObjectui64v;\nPFNGLVERTEXP2UIPROC gl3wVertexP2ui;\nPFNGLVERTEXP2UIVPROC gl3wVertexP2uiv;\nPFNGLVERTEXP3UIPROC gl3wVertexP3ui;\nPFNGLVERTEXP3UIVPROC gl3wVertexP3uiv;\nPFNGLVERTEXP4UIPROC gl3wVertexP4ui;\nPFNGLVERTEXP4UIVPROC gl3wVertexP4uiv;\nPFNGLTEXCOORDP1UIPROC gl3wTexCoordP1ui;\nPFNGLTEXCOORDP1UIVPROC gl3wTexCoordP1uiv;\nPFNGLTEXCOORDP2UIPROC gl3wTexCoordP2ui;\nPFNGLTEXCOORDP2UIVPROC gl3wTexCoordP2uiv;\nPFNGLTEXCOORDP3UIPROC gl3wTexCoordP3ui;\nPFNGLTEXCOORDP3UIVPROC gl3wTexCoordP3uiv;\nPFNGLTEXCOORDP4UIPROC gl3wTexCoordP4ui;\nPFNGLTEXCOORDP4UIVPROC gl3wTexCoordP4uiv;\nPFNGLMULTITEXCOORDP1UIPROC gl3wMultiTexCoordP1ui;\nPFNGLMULTITEXCOORDP1UIVPROC gl3wMultiTexCoordP1uiv;\nPFNGLMULTITEXCOORDP2UIPROC gl3wMultiTexCoordP2ui;\nPFNGLMULTITEXCOORDP2UIVPROC gl3wMultiTexCoordP2uiv;\nPFNGLMULTITEXCOORDP3UIPROC gl3wMultiTexCoordP3ui;\nPFNGLMULTITEXCOORDP3UIVPROC gl3wMultiTexCoordP3uiv;\nPFNGLMULTITEXCOORDP4UIPROC gl3wMultiTexCoordP4ui;\nPFNGLMULTITEXCOORDP4UIVPROC gl3wMultiTexCoordP4uiv;\nPFNGLNORMALP3UIPROC gl3wNormalP3ui;\nPFNGLNORMALP3UIVPROC gl3wNormalP3uiv;\nPFNGLCOLORP3UIPROC gl3wColorP3ui;\nPFNGLCOLORP3UIVPROC gl3wColorP3uiv;\nPFNGLCOLORP4UIPROC gl3wColorP4ui;\nPFNGLCOLORP4UIVPROC gl3wColorP4uiv;\nPFNGLSECONDARYCOLORP3UIPROC gl3wSecondaryColorP3ui;\nPFNGLSECONDARYCOLORP3UIVPROC gl3wSecondaryColorP3uiv;\nPFNGLVERTEXATTRIBP1UIPROC gl3wVertexAttribP1ui;\nPFNGLVERTEXATTRIBP1UIVPROC gl3wVertexAttribP1uiv;\nPFNGLVERTEXATTRIBP2UIPROC gl3wVertexAttribP2ui;\nPFNGLVERTEXATTRIBP2UIVPROC gl3wVertexAttribP2uiv;\nPFNGLVERTEXATTRIBP3UIPROC gl3wVertexAttribP3ui;\nPFNGLVERTEXATTRIBP3UIVPROC gl3wVertexAttribP3uiv;\nPFNGLVERTEXATTRIBP4UIPROC gl3wVertexAttribP4ui;\nPFNGLVERTEXATTRIBP4UIVPROC gl3wVertexAttribP4uiv;\nPFNGLDRAWARRAYSINDIRECTPROC gl3wDrawArraysIndirect;\nPFNGLDRAWELEMENTSINDIRECTPROC gl3wDrawElementsIndirect;\nPFNGLUNIFORM1DPROC gl3wUniform1d;\nPFNGLUNIFORM2DPROC gl3wUniform2d;\nPFNGLUNIFORM3DPROC gl3wUniform3d;\nPFNGLUNIFORM4DPROC gl3wUniform4d;\nPFNGLUNIFORM1DVPROC gl3wUniform1dv;\nPFNGLUNIFORM2DVPROC gl3wUniform2dv;\nPFNGLUNIFORM3DVPROC gl3wUniform3dv;\nPFNGLUNIFORM4DVPROC gl3wUniform4dv;\nPFNGLUNIFORMMATRIX2DVPROC gl3wUniformMatrix2dv;\nPFNGLUNIFORMMATRIX3DVPROC gl3wUniformMatrix3dv;\nPFNGLUNIFORMMATRIX4DVPROC gl3wUniformMatrix4dv;\nPFNGLUNIFORMMATRIX2X3DVPROC gl3wUniformMatrix2x3dv;\nPFNGLUNIFORMMATRIX2X4DVPROC gl3wUniformMatrix2x4dv;\nPFNGLUNIFORMMATRIX3X2DVPROC gl3wUniformMatrix3x2dv;\nPFNGLUNIFORMMATRIX3X4DVPROC gl3wUniformMatrix3x4dv;\nPFNGLUNIFORMMATRIX4X2DVPROC gl3wUniformMatrix4x2dv;\nPFNGLUNIFORMMATRIX4X3DVPROC gl3wUniformMatrix4x3dv;\nPFNGLGETUNIFORMDVPROC gl3wGetUniformdv;\nPFNGLGETSUBROUTINEUNIFORMLOCATIONPROC gl3wGetSubroutineUniformLocation;\nPFNGLGETSUBROUTINEINDEXPROC gl3wGetSubroutineIndex;\nPFNGLGETACTIVESUBROUTINEUNIFORMIVPROC gl3wGetActiveSubroutineUniformiv;\nPFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC gl3wGetActiveSubroutineUniformName;\nPFNGLGETACTIVESUBROUTINENAMEPROC gl3wGetActiveSubroutineName;\nPFNGLUNIFORMSUBROUTINESUIVPROC gl3wUniformSubroutinesuiv;\nPFNGLGETUNIFORMSUBROUTINEUIVPROC gl3wGetUniformSubroutineuiv;\nPFNGLGETPROGRAMSTAGEIVPROC gl3wGetProgramStageiv;\nPFNGLPATCHPARAMETERIPROC gl3wPatchParameteri;\nPFNGLPATCHPARAMETERFVPROC gl3wPatchParameterfv;\nPFNGLBINDTRANSFORMFEEDBACKPROC gl3wBindTransformFeedback;\nPFNGLDELETETRANSFORMFEEDBACKSPROC gl3wDeleteTransformFeedbacks;\nPFNGLGENTRANSFORMFEEDBACKSPROC gl3wGenTransformFeedbacks;\nPFNGLISTRANSFORMFEEDBACKPROC gl3wIsTransformFeedback;\nPFNGLPAUSETRANSFORMFEEDBACKPROC gl3wPauseTransformFeedback;\nPFNGLRESUMETRANSFORMFEEDBACKPROC gl3wResumeTransformFeedback;\nPFNGLDRAWTRANSFORMFEEDBACKPROC gl3wDrawTransformFeedback;\nPFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC gl3wDrawTransformFeedbackStream;\nPFNGLBEGINQUERYINDEXEDPROC gl3wBeginQueryIndexed;\nPFNGLENDQUERYINDEXEDPROC gl3wEndQueryIndexed;\nPFNGLGETQUERYINDEXEDIVPROC gl3wGetQueryIndexediv;\nPFNGLRELEASESHADERCOMPILERPROC gl3wReleaseShaderCompiler;\nPFNGLSHADERBINARYPROC gl3wShaderBinary;\nPFNGLGETSHADERPRECISIONFORMATPROC gl3wGetShaderPrecisionFormat;\nPFNGLDEPTHRANGEFPROC gl3wDepthRangef;\nPFNGLCLEARDEPTHFPROC gl3wClearDepthf;\nPFNGLGETPROGRAMBINARYPROC gl3wGetProgramBinary;\nPFNGLPROGRAMBINARYPROC gl3wProgramBinary;\nPFNGLPROGRAMPARAMETERIPROC gl3wProgramParameteri;\nPFNGLUSEPROGRAMSTAGESPROC gl3wUseProgramStages;\nPFNGLACTIVESHADERPROGRAMPROC gl3wActiveShaderProgram;\nPFNGLCREATESHADERPROGRAMVPROC gl3wCreateShaderProgramv;\nPFNGLBINDPROGRAMPIPELINEPROC gl3wBindProgramPipeline;\nPFNGLDELETEPROGRAMPIPELINESPROC gl3wDeleteProgramPipelines;\nPFNGLGENPROGRAMPIPELINESPROC gl3wGenProgramPipelines;\nPFNGLISPROGRAMPIPELINEPROC gl3wIsProgramPipeline;\nPFNGLGETPROGRAMPIPELINEIVPROC gl3wGetProgramPipelineiv;\nPFNGLPROGRAMUNIFORM1IPROC gl3wProgramUniform1i;\nPFNGLPROGRAMUNIFORM1IVPROC gl3wProgramUniform1iv;\nPFNGLPROGRAMUNIFORM1FPROC gl3wProgramUniform1f;\nPFNGLPROGRAMUNIFORM1FVPROC gl3wProgramUniform1fv;\nPFNGLPROGRAMUNIFORM1DPROC gl3wProgramUniform1d;\nPFNGLPROGRAMUNIFORM1DVPROC gl3wProgramUniform1dv;\nPFNGLPROGRAMUNIFORM1UIPROC gl3wProgramUniform1ui;\nPFNGLPROGRAMUNIFORM1UIVPROC gl3wProgramUniform1uiv;\nPFNGLPROGRAMUNIFORM2IPROC gl3wProgramUniform2i;\nPFNGLPROGRAMUNIFORM2IVPROC gl3wProgramUniform2iv;\nPFNGLPROGRAMUNIFORM2FPROC gl3wProgramUniform2f;\nPFNGLPROGRAMUNIFORM2FVPROC gl3wProgramUniform2fv;\nPFNGLPROGRAMUNIFORM2DPROC gl3wProgramUniform2d;\nPFNGLPROGRAMUNIFORM2DVPROC gl3wProgramUniform2dv;\nPFNGLPROGRAMUNIFORM2UIPROC gl3wProgramUniform2ui;\nPFNGLPROGRAMUNIFORM2UIVPROC gl3wProgramUniform2uiv;\nPFNGLPROGRAMUNIFORM3IPROC gl3wProgramUniform3i;\nPFNGLPROGRAMUNIFORM3IVPROC gl3wProgramUniform3iv;\nPFNGLPROGRAMUNIFORM3FPROC gl3wProgramUniform3f;\nPFNGLPROGRAMUNIFORM3FVPROC gl3wProgramUniform3fv;\nPFNGLPROGRAMUNIFORM3DPROC gl3wProgramUniform3d;\nPFNGLPROGRAMUNIFORM3DVPROC gl3wProgramUniform3dv;\nPFNGLPROGRAMUNIFORM3UIPROC gl3wProgramUniform3ui;\nPFNGLPROGRAMUNIFORM3UIVPROC gl3wProgramUniform3uiv;\nPFNGLPROGRAMUNIFORM4IPROC gl3wProgramUniform4i;\nPFNGLPROGRAMUNIFORM4IVPROC gl3wProgramUniform4iv;\nPFNGLPROGRAMUNIFORM4FPROC gl3wProgramUniform4f;\nPFNGLPROGRAMUNIFORM4FVPROC gl3wProgramUniform4fv;\nPFNGLPROGRAMUNIFORM4DPROC gl3wProgramUniform4d;\nPFNGLPROGRAMUNIFORM4DVPROC gl3wProgramUniform4dv;\nPFNGLPROGRAMUNIFORM4UIPROC gl3wProgramUniform4ui;\nPFNGLPROGRAMUNIFORM4UIVPROC gl3wProgramUniform4uiv;\nPFNGLPROGRAMUNIFORMMATRIX2FVPROC gl3wProgramUniformMatrix2fv;\nPFNGLPROGRAMUNIFORMMATRIX3FVPROC gl3wProgramUniformMatrix3fv;\nPFNGLPROGRAMUNIFORMMATRIX4FVPROC gl3wProgramUniformMatrix4fv;\nPFNGLPROGRAMUNIFORMMATRIX2DVPROC gl3wProgramUniformMatrix2dv;\nPFNGLPROGRAMUNIFORMMATRIX3DVPROC gl3wProgramUniformMatrix3dv;\nPFNGLPROGRAMUNIFORMMATRIX4DVPROC gl3wProgramUniformMatrix4dv;\nPFNGLPROGRAMUNIFORMMATRIX2X3FVPROC gl3wProgramUniformMatrix2x3fv;\nPFNGLPROGRAMUNIFORMMATRIX3X2FVPROC gl3wProgramUniformMatrix3x2fv;\nPFNGLPROGRAMUNIFORMMATRIX2X4FVPROC gl3wProgramUniformMatrix2x4fv;\nPFNGLPROGRAMUNIFORMMATRIX4X2FVPROC gl3wProgramUniformMatrix4x2fv;\nPFNGLPROGRAMUNIFORMMATRIX3X4FVPROC gl3wProgramUniformMatrix3x4fv;\nPFNGLPROGRAMUNIFORMMATRIX4X3FVPROC gl3wProgramUniformMatrix4x3fv;\nPFNGLPROGRAMUNIFORMMATRIX2X3DVPROC gl3wProgramUniformMatrix2x3dv;\nPFNGLPROGRAMUNIFORMMATRIX3X2DVPROC gl3wProgramUniformMatrix3x2dv;\nPFNGLPROGRAMUNIFORMMATRIX2X4DVPROC gl3wProgramUniformMatrix2x4dv;\nPFNGLPROGRAMUNIFORMMATRIX4X2DVPROC gl3wProgramUniformMatrix4x2dv;\nPFNGLPROGRAMUNIFORMMATRIX3X4DVPROC gl3wProgramUniformMatrix3x4dv;\nPFNGLPROGRAMUNIFORMMATRIX4X3DVPROC gl3wProgramUniformMatrix4x3dv;\nPFNGLVALIDATEPROGRAMPIPELINEPROC gl3wValidateProgramPipeline;\nPFNGLGETPROGRAMPIPELINEINFOLOGPROC gl3wGetProgramPipelineInfoLog;\nPFNGLVERTEXATTRIBL1DPROC gl3wVertexAttribL1d;\nPFNGLVERTEXATTRIBL2DPROC gl3wVertexAttribL2d;\nPFNGLVERTEXATTRIBL3DPROC gl3wVertexAttribL3d;\nPFNGLVERTEXATTRIBL4DPROC gl3wVertexAttribL4d;\nPFNGLVERTEXATTRIBL1DVPROC gl3wVertexAttribL1dv;\nPFNGLVERTEXATTRIBL2DVPROC gl3wVertexAttribL2dv;\nPFNGLVERTEXATTRIBL3DVPROC gl3wVertexAttribL3dv;\nPFNGLVERTEXATTRIBL4DVPROC gl3wVertexAttribL4dv;\nPFNGLVERTEXATTRIBLPOINTERPROC gl3wVertexAttribLPointer;\nPFNGLGETVERTEXATTRIBLDVPROC gl3wGetVertexAttribLdv;\nPFNGLVIEWPORTARRAYVPROC gl3wViewportArrayv;\nPFNGLVIEWPORTINDEXEDFPROC gl3wViewportIndexedf;\nPFNGLVIEWPORTINDEXEDFVPROC gl3wViewportIndexedfv;\nPFNGLSCISSORARRAYVPROC gl3wScissorArrayv;\nPFNGLSCISSORINDEXEDPROC gl3wScissorIndexed;\nPFNGLSCISSORINDEXEDVPROC gl3wScissorIndexedv;\nPFNGLDEPTHRANGEARRAYVPROC gl3wDepthRangeArrayv;\nPFNGLDEPTHRANGEINDEXEDPROC gl3wDepthRangeIndexed;\nPFNGLGETFLOATI_VPROC gl3wGetFloati_v;\nPFNGLGETDOUBLEI_VPROC gl3wGetDoublei_v;\nPFNGLCREATESYNCFROMCLEVENTARBPROC gl3wCreateSyncFromCLeventARB;\nPFNGLDEBUGMESSAGECONTROLARBPROC gl3wDebugMessageControlARB;\nPFNGLDEBUGMESSAGEINSERTARBPROC gl3wDebugMessageInsertARB;\nPFNGLDEBUGMESSAGECALLBACKARBPROC gl3wDebugMessageCallbackARB;\nPFNGLGETDEBUGMESSAGELOGARBPROC gl3wGetDebugMessageLogARB;\nPFNGLGETGRAPHICSRESETSTATUSARBPROC gl3wGetGraphicsResetStatusARB;\nPFNGLGETNTEXIMAGEARBPROC gl3wGetnTexImageARB;\nPFNGLREADNPIXELSARBPROC gl3wReadnPixelsARB;\nPFNGLGETNCOMPRESSEDTEXIMAGEARBPROC gl3wGetnCompressedTexImageARB;\nPFNGLGETNUNIFORMFVARBPROC gl3wGetnUniformfvARB;\nPFNGLGETNUNIFORMIVARBPROC gl3wGetnUniformivARB;\nPFNGLGETNUNIFORMUIVARBPROC gl3wGetnUniformuivARB;\nPFNGLGETNUNIFORMDVARBPROC gl3wGetnUniformdvARB;\nPFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC gl3wDrawArraysInstancedBaseInstance;\nPFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC gl3wDrawElementsInstancedBaseInstance;\nPFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC gl3wDrawElementsInstancedBaseVertexBaseInstance;\nPFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC gl3wDrawTransformFeedbackInstanced;\nPFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC gl3wDrawTransformFeedbackStreamInstanced;\nPFNGLGETINTERNALFORMATIVPROC gl3wGetInternalformativ;\nPFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC gl3wGetActiveAtomicCounterBufferiv;\nPFNGLBINDIMAGETEXTUREPROC gl3wBindImageTexture;\nPFNGLMEMORYBARRIERPROC gl3wMemoryBarrier;\nPFNGLTEXSTORAGE1DPROC gl3wTexStorage1D;\nPFNGLTEXSTORAGE2DPROC gl3wTexStorage2D;\nPFNGLTEXSTORAGE3DPROC gl3wTexStorage3D;\nPFNGLTEXTURESTORAGE1DEXTPROC gl3wTextureStorage1DEXT;\nPFNGLTEXTURESTORAGE2DEXTPROC gl3wTextureStorage2DEXT;\nPFNGLTEXTURESTORAGE3DEXTPROC gl3wTextureStorage3DEXT;\nPFNGLDEBUGMESSAGECONTROLPROC gl3wDebugMessageControl;\nPFNGLDEBUGMESSAGEINSERTPROC gl3wDebugMessageInsert;\nPFNGLDEBUGMESSAGECALLBACKPROC gl3wDebugMessageCallback;\nPFNGLGETDEBUGMESSAGELOGPROC gl3wGetDebugMessageLog;\nPFNGLPUSHDEBUGGROUPPROC gl3wPushDebugGroup;\nPFNGLPOPDEBUGGROUPPROC gl3wPopDebugGroup;\nPFNGLOBJECTLABELPROC gl3wObjectLabel;\nPFNGLGETOBJECTLABELPROC gl3wGetObjectLabel;\nPFNGLOBJECTPTRLABELPROC gl3wObjectPtrLabel;\nPFNGLGETOBJECTPTRLABELPROC gl3wGetObjectPtrLabel;\nPFNGLCLEARBUFFERDATAPROC gl3wClearBufferData;\nPFNGLCLEARBUFFERSUBDATAPROC gl3wClearBufferSubData;\nPFNGLCLEARNAMEDBUFFERDATAEXTPROC gl3wClearNamedBufferDataEXT;\nPFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC gl3wClearNamedBufferSubDataEXT;\nPFNGLDISPATCHCOMPUTEPROC gl3wDispatchCompute;\nPFNGLDISPATCHCOMPUTEINDIRECTPROC gl3wDispatchComputeIndirect;\nPFNGLCOPYIMAGESUBDATAPROC gl3wCopyImageSubData;\nPFNGLTEXTUREVIEWPROC gl3wTextureView;\nPFNGLBINDVERTEXBUFFERPROC gl3wBindVertexBuffer;\nPFNGLVERTEXATTRIBFORMATPROC gl3wVertexAttribFormat;\nPFNGLVERTEXATTRIBIFORMATPROC gl3wVertexAttribIFormat;\nPFNGLVERTEXATTRIBLFORMATPROC gl3wVertexAttribLFormat;\nPFNGLVERTEXATTRIBBINDINGPROC gl3wVertexAttribBinding;\nPFNGLVERTEXBINDINGDIVISORPROC gl3wVertexBindingDivisor;\nPFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC gl3wVertexArrayBindVertexBufferEXT;\nPFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC gl3wVertexArrayVertexAttribFormatEXT;\nPFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC gl3wVertexArrayVertexAttribIFormatEXT;\nPFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC gl3wVertexArrayVertexAttribLFormatEXT;\nPFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC gl3wVertexArrayVertexAttribBindingEXT;\nPFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC gl3wVertexArrayVertexBindingDivisorEXT;\nPFNGLFRAMEBUFFERPARAMETERIPROC gl3wFramebufferParameteri;\nPFNGLGETFRAMEBUFFERPARAMETERIVPROC gl3wGetFramebufferParameteriv;\nPFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC gl3wNamedFramebufferParameteriEXT;\nPFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC gl3wGetNamedFramebufferParameterivEXT;\nPFNGLGETINTERNALFORMATI64VPROC gl3wGetInternalformati64v;\nPFNGLINVALIDATETEXSUBIMAGEPROC gl3wInvalidateTexSubImage;\nPFNGLINVALIDATETEXIMAGEPROC gl3wInvalidateTexImage;\nPFNGLINVALIDATEBUFFERSUBDATAPROC gl3wInvalidateBufferSubData;\nPFNGLINVALIDATEBUFFERDATAPROC gl3wInvalidateBufferData;\nPFNGLINVALIDATEFRAMEBUFFERPROC gl3wInvalidateFramebuffer;\nPFNGLINVALIDATESUBFRAMEBUFFERPROC gl3wInvalidateSubFramebuffer;\nPFNGLMULTIDRAWARRAYSINDIRECTPROC gl3wMultiDrawArraysIndirect;\nPFNGLMULTIDRAWELEMENTSINDIRECTPROC gl3wMultiDrawElementsIndirect;\nPFNGLGETPROGRAMINTERFACEIVPROC gl3wGetProgramInterfaceiv;\nPFNGLGETPROGRAMRESOURCEINDEXPROC gl3wGetProgramResourceIndex;\nPFNGLGETPROGRAMRESOURCENAMEPROC gl3wGetProgramResourceName;\nPFNGLGETPROGRAMRESOURCEIVPROC gl3wGetProgramResourceiv;\nPFNGLGETPROGRAMRESOURCELOCATIONPROC gl3wGetProgramResourceLocation;\nPFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC gl3wGetProgramResourceLocationIndex;\nPFNGLSHADERSTORAGEBLOCKBINDINGPROC gl3wShaderStorageBlockBinding;\nPFNGLTEXBUFFERRANGEPROC gl3wTexBufferRange;\nPFNGLTEXTUREBUFFERRANGEEXTPROC gl3wTextureBufferRangeEXT;\nPFNGLTEXSTORAGE2DMULTISAMPLEPROC gl3wTexStorage2DMultisample;\nPFNGLTEXSTORAGE3DMULTISAMPLEPROC gl3wTexStorage3DMultisample;\nPFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC gl3wTextureStorage2DMultisampleEXT;\nPFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC gl3wTextureStorage3DMultisampleEXT;\n\nstatic void load_procs(void)\n{\n\tgl3wCullFace = (PFNGLCULLFACEPROC) get_proc(\"glCullFace\");\n\tgl3wFrontFace = (PFNGLFRONTFACEPROC) get_proc(\"glFrontFace\");\n\tgl3wHint = (PFNGLHINTPROC) get_proc(\"glHint\");\n\tgl3wLineWidth = (PFNGLLINEWIDTHPROC) get_proc(\"glLineWidth\");\n\tgl3wPointSize = (PFNGLPOINTSIZEPROC) get_proc(\"glPointSize\");\n\tgl3wPolygonMode = (PFNGLPOLYGONMODEPROC) get_proc(\"glPolygonMode\");\n\tgl3wScissor = (PFNGLSCISSORPROC) get_proc(\"glScissor\");\n\tgl3wTexParameterf = (PFNGLTEXPARAMETERFPROC) get_proc(\"glTexParameterf\");\n\tgl3wTexParameterfv = (PFNGLTEXPARAMETERFVPROC) get_proc(\"glTexParameterfv\");\n\tgl3wTexParameteri = (PFNGLTEXPARAMETERIPROC) get_proc(\"glTexParameteri\");\n\tgl3wTexParameteriv = (PFNGLTEXPARAMETERIVPROC) get_proc(\"glTexParameteriv\");\n\tgl3wTexImage1D = (PFNGLTEXIMAGE1DPROC) get_proc(\"glTexImage1D\");\n\tgl3wTexImage2D = (PFNGLTEXIMAGE2DPROC) get_proc(\"glTexImage2D\");\n\tgl3wDrawBuffer = (PFNGLDRAWBUFFERPROC) get_proc(\"glDrawBuffer\");\n\tgl3wClear = (PFNGLCLEARPROC) get_proc(\"glClear\");\n\tgl3wClearColor = (PFNGLCLEARCOLORPROC) get_proc(\"glClearColor\");\n\tgl3wClearStencil = (PFNGLCLEARSTENCILPROC) get_proc(\"glClearStencil\");\n\tgl3wClearDepth = (PFNGLCLEARDEPTHPROC) get_proc(\"glClearDepth\");\n\tgl3wStencilMask = (PFNGLSTENCILMASKPROC) get_proc(\"glStencilMask\");\n\tgl3wColorMask = (PFNGLCOLORMASKPROC) get_proc(\"glColorMask\");\n\tgl3wDepthMask = (PFNGLDEPTHMASKPROC) get_proc(\"glDepthMask\");\n\tgl3wDisable = (PFNGLDISABLEPROC) get_proc(\"glDisable\");\n\tgl3wEnable = (PFNGLENABLEPROC) get_proc(\"glEnable\");\n\tgl3wFinish = (PFNGLFINISHPROC) get_proc(\"glFinish\");\n\tgl3wFlush = (PFNGLFLUSHPROC) get_proc(\"glFlush\");\n\tgl3wBlendFunc = (PFNGLBLENDFUNCPROC) get_proc(\"glBlendFunc\");\n\tgl3wLogicOp = (PFNGLLOGICOPPROC) get_proc(\"glLogicOp\");\n\tgl3wStencilFunc = (PFNGLSTENCILFUNCPROC) get_proc(\"glStencilFunc\");\n\tgl3wStencilOp = (PFNGLSTENCILOPPROC) get_proc(\"glStencilOp\");\n\tgl3wDepthFunc = (PFNGLDEPTHFUNCPROC) get_proc(\"glDepthFunc\");\n\tgl3wPixelStoref = (PFNGLPIXELSTOREFPROC) get_proc(\"glPixelStoref\");\n\tgl3wPixelStorei = (PFNGLPIXELSTOREIPROC) get_proc(\"glPixelStorei\");\n\tgl3wReadBuffer = (PFNGLREADBUFFERPROC) get_proc(\"glReadBuffer\");\n\tgl3wReadPixels = (PFNGLREADPIXELSPROC) get_proc(\"glReadPixels\");\n\tgl3wGetBooleanv = (PFNGLGETBOOLEANVPROC) get_proc(\"glGetBooleanv\");\n\tgl3wGetDoublev = (PFNGLGETDOUBLEVPROC) get_proc(\"glGetDoublev\");\n\tgl3wGetError = (PFNGLGETERRORPROC) get_proc(\"glGetError\");\n\tgl3wGetFloatv = (PFNGLGETFLOATVPROC) get_proc(\"glGetFloatv\");\n\tgl3wGetIntegerv = (PFNGLGETINTEGERVPROC) get_proc(\"glGetIntegerv\");\n\tgl3wGetString = (PFNGLGETSTRINGPROC) get_proc(\"glGetString\");\n\tgl3wGetTexImage = (PFNGLGETTEXIMAGEPROC) get_proc(\"glGetTexImage\");\n\tgl3wGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) get_proc(\"glGetTexParameterfv\");\n\tgl3wGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) get_proc(\"glGetTexParameteriv\");\n\tgl3wGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) get_proc(\"glGetTexLevelParameterfv\");\n\tgl3wGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) get_proc(\"glGetTexLevelParameteriv\");\n\tgl3wIsEnabled = (PFNGLISENABLEDPROC) get_proc(\"glIsEnabled\");\n\tgl3wDepthRange = (PFNGLDEPTHRANGEPROC) get_proc(\"glDepthRange\");\n\tgl3wViewport = (PFNGLVIEWPORTPROC) get_proc(\"glViewport\");\n\tgl3wDrawArrays = (PFNGLDRAWARRAYSPROC) get_proc(\"glDrawArrays\");\n\tgl3wDrawElements = (PFNGLDRAWELEMENTSPROC) get_proc(\"glDrawElements\");\n\tgl3wGetPointerv = (PFNGLGETPOINTERVPROC) get_proc(\"glGetPointerv\");\n\tgl3wPolygonOffset = (PFNGLPOLYGONOFFSETPROC) get_proc(\"glPolygonOffset\");\n\tgl3wCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) get_proc(\"glCopyTexImage1D\");\n\tgl3wCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) get_proc(\"glCopyTexImage2D\");\n\tgl3wCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) get_proc(\"glCopyTexSubImage1D\");\n\tgl3wCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) get_proc(\"glCopyTexSubImage2D\");\n\tgl3wTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) get_proc(\"glTexSubImage1D\");\n\tgl3wTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) get_proc(\"glTexSubImage2D\");\n\tgl3wBindTexture = (PFNGLBINDTEXTUREPROC) get_proc(\"glBindTexture\");\n\tgl3wDeleteTextures = (PFNGLDELETETEXTURESPROC) get_proc(\"glDeleteTextures\");\n\tgl3wGenTextures = (PFNGLGENTEXTURESPROC) get_proc(\"glGenTextures\");\n\tgl3wIsTexture = (PFNGLISTEXTUREPROC) get_proc(\"glIsTexture\");\n\tgl3wBlendColor = (PFNGLBLENDCOLORPROC) get_proc(\"glBlendColor\");\n\tgl3wBlendEquation = (PFNGLBLENDEQUATIONPROC) get_proc(\"glBlendEquation\");\n\tgl3wDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) get_proc(\"glDrawRangeElements\");\n\tgl3wTexImage3D = (PFNGLTEXIMAGE3DPROC) get_proc(\"glTexImage3D\");\n\tgl3wTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) get_proc(\"glTexSubImage3D\");\n\tgl3wCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) get_proc(\"glCopyTexSubImage3D\");\n\tgl3wActiveTexture = (PFNGLACTIVETEXTUREPROC) get_proc(\"glActiveTexture\");\n\tgl3wSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) get_proc(\"glSampleCoverage\");\n\tgl3wCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) get_proc(\"glCompressedTexImage3D\");\n\tgl3wCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) get_proc(\"glCompressedTexImage2D\");\n\tgl3wCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) get_proc(\"glCompressedTexImage1D\");\n\tgl3wCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) get_proc(\"glCompressedTexSubImage3D\");\n\tgl3wCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) get_proc(\"glCompressedTexSubImage2D\");\n\tgl3wCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) get_proc(\"glCompressedTexSubImage1D\");\n\tgl3wGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) get_proc(\"glGetCompressedTexImage\");\n\tgl3wBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) get_proc(\"glBlendFuncSeparate\");\n\tgl3wMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) get_proc(\"glMultiDrawArrays\");\n\tgl3wMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) get_proc(\"glMultiDrawElements\");\n\tgl3wPointParameterf = (PFNGLPOINTPARAMETERFPROC) get_proc(\"glPointParameterf\");\n\tgl3wPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) get_proc(\"glPointParameterfv\");\n\tgl3wPointParameteri = (PFNGLPOINTPARAMETERIPROC) get_proc(\"glPointParameteri\");\n\tgl3wPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) get_proc(\"glPointParameteriv\");\n\tgl3wGenQueries = (PFNGLGENQUERIESPROC) get_proc(\"glGenQueries\");\n\tgl3wDeleteQueries = (PFNGLDELETEQUERIESPROC) get_proc(\"glDeleteQueries\");\n\tgl3wIsQuery = (PFNGLISQUERYPROC) get_proc(\"glIsQuery\");\n\tgl3wBeginQuery = (PFNGLBEGINQUERYPROC) get_proc(\"glBeginQuery\");\n\tgl3wEndQuery = (PFNGLENDQUERYPROC) get_proc(\"glEndQuery\");\n\tgl3wGetQueryiv = (PFNGLGETQUERYIVPROC) get_proc(\"glGetQueryiv\");\n\tgl3wGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) get_proc(\"glGetQueryObjectiv\");\n\tgl3wGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) get_proc(\"glGetQueryObjectuiv\");\n\tgl3wBindBuffer = (PFNGLBINDBUFFERPROC) get_proc(\"glBindBuffer\");\n\tgl3wDeleteBuffers = (PFNGLDELETEBUFFERSPROC) get_proc(\"glDeleteBuffers\");\n\tgl3wGenBuffers = (PFNGLGENBUFFERSPROC) get_proc(\"glGenBuffers\");\n\tgl3wIsBuffer = (PFNGLISBUFFERPROC) get_proc(\"glIsBuffer\");\n\tgl3wBufferData = (PFNGLBUFFERDATAPROC) get_proc(\"glBufferData\");\n\tgl3wBufferSubData = (PFNGLBUFFERSUBDATAPROC) get_proc(\"glBufferSubData\");\n\tgl3wGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) get_proc(\"glGetBufferSubData\");\n\tgl3wMapBuffer = (PFNGLMAPBUFFERPROC) get_proc(\"glMapBuffer\");\n\tgl3wUnmapBuffer = (PFNGLUNMAPBUFFERPROC) get_proc(\"glUnmapBuffer\");\n\tgl3wGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) get_proc(\"glGetBufferParameteriv\");\n\tgl3wGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) get_proc(\"glGetBufferPointerv\");\n\tgl3wBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) get_proc(\"glBlendEquationSeparate\");\n\tgl3wDrawBuffers = (PFNGLDRAWBUFFERSPROC) get_proc(\"glDrawBuffers\");\n\tgl3wStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) get_proc(\"glStencilOpSeparate\");\n\tgl3wStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) get_proc(\"glStencilFuncSeparate\");\n\tgl3wStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) get_proc(\"glStencilMaskSeparate\");\n\tgl3wAttachShader = (PFNGLATTACHSHADERPROC) get_proc(\"glAttachShader\");\n\tgl3wBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) get_proc(\"glBindAttribLocation\");\n\tgl3wCompileShader = (PFNGLCOMPILESHADERPROC) get_proc(\"glCompileShader\");\n\tgl3wCreateProgram = (PFNGLCREATEPROGRAMPROC) get_proc(\"glCreateProgram\");\n\tgl3wCreateShader = (PFNGLCREATESHADERPROC) get_proc(\"glCreateShader\");\n\tgl3wDeleteProgram = (PFNGLDELETEPROGRAMPROC) get_proc(\"glDeleteProgram\");\n\tgl3wDeleteShader = (PFNGLDELETESHADERPROC) get_proc(\"glDeleteShader\");\n\tgl3wDetachShader = (PFNGLDETACHSHADERPROC) get_proc(\"glDetachShader\");\n\tgl3wDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) get_proc(\"glDisableVertexAttribArray\");\n\tgl3wEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) get_proc(\"glEnableVertexAttribArray\");\n\tgl3wGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) get_proc(\"glGetActiveAttrib\");\n\tgl3wGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) get_proc(\"glGetActiveUniform\");\n\tgl3wGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) get_proc(\"glGetAttachedShaders\");\n\tgl3wGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) get_proc(\"glGetAttribLocation\");\n\tgl3wGetProgramiv = (PFNGLGETPROGRAMIVPROC) get_proc(\"glGetProgramiv\");\n\tgl3wGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) get_proc(\"glGetProgramInfoLog\");\n\tgl3wGetShaderiv = (PFNGLGETSHADERIVPROC) get_proc(\"glGetShaderiv\");\n\tgl3wGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) get_proc(\"glGetShaderInfoLog\");\n\tgl3wGetShaderSource = (PFNGLGETSHADERSOURCEPROC) get_proc(\"glGetShaderSource\");\n\tgl3wGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) get_proc(\"glGetUniformLocation\");\n\tgl3wGetUniformfv = (PFNGLGETUNIFORMFVPROC) get_proc(\"glGetUniformfv\");\n\tgl3wGetUniformiv = (PFNGLGETUNIFORMIVPROC) get_proc(\"glGetUniformiv\");\n\tgl3wGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) get_proc(\"glGetVertexAttribdv\");\n\tgl3wGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) get_proc(\"glGetVertexAttribfv\");\n\tgl3wGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) get_proc(\"glGetVertexAttribiv\");\n\tgl3wGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) get_proc(\"glGetVertexAttribPointerv\");\n\tgl3wIsProgram = (PFNGLISPROGRAMPROC) get_proc(\"glIsProgram\");\n\tgl3wIsShader = (PFNGLISSHADERPROC) get_proc(\"glIsShader\");\n\tgl3wLinkProgram = (PFNGLLINKPROGRAMPROC) get_proc(\"glLinkProgram\");\n\tgl3wShaderSource = (PFNGLSHADERSOURCEPROC) get_proc(\"glShaderSource\");\n\tgl3wUseProgram = (PFNGLUSEPROGRAMPROC) get_proc(\"glUseProgram\");\n\tgl3wUniform1f = (PFNGLUNIFORM1FPROC) get_proc(\"glUniform1f\");\n\tgl3wUniform2f = (PFNGLUNIFORM2FPROC) get_proc(\"glUniform2f\");\n\tgl3wUniform3f = (PFNGLUNIFORM3FPROC) get_proc(\"glUniform3f\");\n\tgl3wUniform4f = (PFNGLUNIFORM4FPROC) get_proc(\"glUniform4f\");\n\tgl3wUniform1i = (PFNGLUNIFORM1IPROC) get_proc(\"glUniform1i\");\n\tgl3wUniform2i = (PFNGLUNIFORM2IPROC) get_proc(\"glUniform2i\");\n\tgl3wUniform3i = (PFNGLUNIFORM3IPROC) get_proc(\"glUniform3i\");\n\tgl3wUniform4i = (PFNGLUNIFORM4IPROC) get_proc(\"glUniform4i\");\n\tgl3wUniform1fv = (PFNGLUNIFORM1FVPROC) get_proc(\"glUniform1fv\");\n\tgl3wUniform2fv = (PFNGLUNIFORM2FVPROC) get_proc(\"glUniform2fv\");\n\tgl3wUniform3fv = (PFNGLUNIFORM3FVPROC) get_proc(\"glUniform3fv\");\n\tgl3wUniform4fv = (PFNGLUNIFORM4FVPROC) get_proc(\"glUniform4fv\");\n\tgl3wUniform1iv = (PFNGLUNIFORM1IVPROC) get_proc(\"glUniform1iv\");\n\tgl3wUniform2iv = (PFNGLUNIFORM2IVPROC) get_proc(\"glUniform2iv\");\n\tgl3wUniform3iv = (PFNGLUNIFORM3IVPROC) get_proc(\"glUniform3iv\");\n\tgl3wUniform4iv = (PFNGLUNIFORM4IVPROC) get_proc(\"glUniform4iv\");\n\tgl3wUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) get_proc(\"glUniformMatrix2fv\");\n\tgl3wUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) get_proc(\"glUniformMatrix3fv\");\n\tgl3wUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) get_proc(\"glUniformMatrix4fv\");\n\tgl3wValidateProgram = (PFNGLVALIDATEPROGRAMPROC) get_proc(\"glValidateProgram\");\n\tgl3wVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) get_proc(\"glVertexAttrib1d\");\n\tgl3wVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) get_proc(\"glVertexAttrib1dv\");\n\tgl3wVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) get_proc(\"glVertexAttrib1f\");\n\tgl3wVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) get_proc(\"glVertexAttrib1fv\");\n\tgl3wVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) get_proc(\"glVertexAttrib1s\");\n\tgl3wVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) get_proc(\"glVertexAttrib1sv\");\n\tgl3wVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) get_proc(\"glVertexAttrib2d\");\n\tgl3wVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) get_proc(\"glVertexAttrib2dv\");\n\tgl3wVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) get_proc(\"glVertexAttrib2f\");\n\tgl3wVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) get_proc(\"glVertexAttrib2fv\");\n\tgl3wVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) get_proc(\"glVertexAttrib2s\");\n\tgl3wVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) get_proc(\"glVertexAttrib2sv\");\n\tgl3wVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) get_proc(\"glVertexAttrib3d\");\n\tgl3wVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) get_proc(\"glVertexAttrib3dv\");\n\tgl3wVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) get_proc(\"glVertexAttrib3f\");\n\tgl3wVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) get_proc(\"glVertexAttrib3fv\");\n\tgl3wVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) get_proc(\"glVertexAttrib3s\");\n\tgl3wVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) get_proc(\"glVertexAttrib3sv\");\n\tgl3wVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) get_proc(\"glVertexAttrib4Nbv\");\n\tgl3wVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) get_proc(\"glVertexAttrib4Niv\");\n\tgl3wVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) get_proc(\"glVertexAttrib4Nsv\");\n\tgl3wVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) get_proc(\"glVertexAttrib4Nub\");\n\tgl3wVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) get_proc(\"glVertexAttrib4Nubv\");\n\tgl3wVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) get_proc(\"glVertexAttrib4Nuiv\");\n\tgl3wVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) get_proc(\"glVertexAttrib4Nusv\");\n\tgl3wVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) get_proc(\"glVertexAttrib4bv\");\n\tgl3wVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) get_proc(\"glVertexAttrib4d\");\n\tgl3wVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) get_proc(\"glVertexAttrib4dv\");\n\tgl3wVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) get_proc(\"glVertexAttrib4f\");\n\tgl3wVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) get_proc(\"glVertexAttrib4fv\");\n\tgl3wVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) get_proc(\"glVertexAttrib4iv\");\n\tgl3wVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) get_proc(\"glVertexAttrib4s\");\n\tgl3wVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) get_proc(\"glVertexAttrib4sv\");\n\tgl3wVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) get_proc(\"glVertexAttrib4ubv\");\n\tgl3wVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) get_proc(\"glVertexAttrib4uiv\");\n\tgl3wVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) get_proc(\"glVertexAttrib4usv\");\n\tgl3wVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) get_proc(\"glVertexAttribPointer\");\n\tgl3wUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) get_proc(\"glUniformMatrix2x3fv\");\n\tgl3wUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) get_proc(\"glUniformMatrix3x2fv\");\n\tgl3wUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) get_proc(\"glUniformMatrix2x4fv\");\n\tgl3wUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) get_proc(\"glUniformMatrix4x2fv\");\n\tgl3wUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) get_proc(\"glUniformMatrix3x4fv\");\n\tgl3wUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) get_proc(\"glUniformMatrix4x3fv\");\n\tgl3wColorMaski = (PFNGLCOLORMASKIPROC) get_proc(\"glColorMaski\");\n\tgl3wGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) get_proc(\"glGetBooleani_v\");\n\tgl3wGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) get_proc(\"glGetIntegeri_v\");\n\tgl3wEnablei = (PFNGLENABLEIPROC) get_proc(\"glEnablei\");\n\tgl3wDisablei = (PFNGLDISABLEIPROC) get_proc(\"glDisablei\");\n\tgl3wIsEnabledi = (PFNGLISENABLEDIPROC) get_proc(\"glIsEnabledi\");\n\tgl3wBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) get_proc(\"glBeginTransformFeedback\");\n\tgl3wEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) get_proc(\"glEndTransformFeedback\");\n\tgl3wBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) get_proc(\"glBindBufferRange\");\n\tgl3wBindBufferBase = (PFNGLBINDBUFFERBASEPROC) get_proc(\"glBindBufferBase\");\n\tgl3wTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) get_proc(\"glTransformFeedbackVaryings\");\n\tgl3wGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) get_proc(\"glGetTransformFeedbackVarying\");\n\tgl3wClampColor = (PFNGLCLAMPCOLORPROC) get_proc(\"glClampColor\");\n\tgl3wBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) get_proc(\"glBeginConditionalRender\");\n\tgl3wEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) get_proc(\"glEndConditionalRender\");\n\tgl3wVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) get_proc(\"glVertexAttribIPointer\");\n\tgl3wGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) get_proc(\"glGetVertexAttribIiv\");\n\tgl3wGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) get_proc(\"glGetVertexAttribIuiv\");\n\tgl3wVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) get_proc(\"glVertexAttribI1i\");\n\tgl3wVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) get_proc(\"glVertexAttribI2i\");\n\tgl3wVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) get_proc(\"glVertexAttribI3i\");\n\tgl3wVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) get_proc(\"glVertexAttribI4i\");\n\tgl3wVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) get_proc(\"glVertexAttribI1ui\");\n\tgl3wVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) get_proc(\"glVertexAttribI2ui\");\n\tgl3wVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) get_proc(\"glVertexAttribI3ui\");\n\tgl3wVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) get_proc(\"glVertexAttribI4ui\");\n\tgl3wVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) get_proc(\"glVertexAttribI1iv\");\n\tgl3wVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) get_proc(\"glVertexAttribI2iv\");\n\tgl3wVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) get_proc(\"glVertexAttribI3iv\");\n\tgl3wVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) get_proc(\"glVertexAttribI4iv\");\n\tgl3wVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) get_proc(\"glVertexAttribI1uiv\");\n\tgl3wVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) get_proc(\"glVertexAttribI2uiv\");\n\tgl3wVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) get_proc(\"glVertexAttribI3uiv\");\n\tgl3wVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) get_proc(\"glVertexAttribI4uiv\");\n\tgl3wVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) get_proc(\"glVertexAttribI4bv\");\n\tgl3wVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) get_proc(\"glVertexAttribI4sv\");\n\tgl3wVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) get_proc(\"glVertexAttribI4ubv\");\n\tgl3wVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) get_proc(\"glVertexAttribI4usv\");\n\tgl3wGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) get_proc(\"glGetUniformuiv\");\n\tgl3wBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) get_proc(\"glBindFragDataLocation\");\n\tgl3wGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) get_proc(\"glGetFragDataLocation\");\n\tgl3wUniform1ui = (PFNGLUNIFORM1UIPROC) get_proc(\"glUniform1ui\");\n\tgl3wUniform2ui = (PFNGLUNIFORM2UIPROC) get_proc(\"glUniform2ui\");\n\tgl3wUniform3ui = (PFNGLUNIFORM3UIPROC) get_proc(\"glUniform3ui\");\n\tgl3wUniform4ui = (PFNGLUNIFORM4UIPROC) get_proc(\"glUniform4ui\");\n\tgl3wUniform1uiv = (PFNGLUNIFORM1UIVPROC) get_proc(\"glUniform1uiv\");\n\tgl3wUniform2uiv = (PFNGLUNIFORM2UIVPROC) get_proc(\"glUniform2uiv\");\n\tgl3wUniform3uiv = (PFNGLUNIFORM3UIVPROC) get_proc(\"glUniform3uiv\");\n\tgl3wUniform4uiv = (PFNGLUNIFORM4UIVPROC) get_proc(\"glUniform4uiv\");\n\tgl3wTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) get_proc(\"glTexParameterIiv\");\n\tgl3wTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) get_proc(\"glTexParameterIuiv\");\n\tgl3wGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) get_proc(\"glGetTexParameterIiv\");\n\tgl3wGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) get_proc(\"glGetTexParameterIuiv\");\n\tgl3wClearBufferiv = (PFNGLCLEARBUFFERIVPROC) get_proc(\"glClearBufferiv\");\n\tgl3wClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) get_proc(\"glClearBufferuiv\");\n\tgl3wClearBufferfv = (PFNGLCLEARBUFFERFVPROC) get_proc(\"glClearBufferfv\");\n\tgl3wClearBufferfi = (PFNGLCLEARBUFFERFIPROC) get_proc(\"glClearBufferfi\");\n\tgl3wGetStringi = (PFNGLGETSTRINGIPROC) get_proc(\"glGetStringi\");\n\tgl3wDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) get_proc(\"glDrawArraysInstanced\");\n\tgl3wDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) get_proc(\"glDrawElementsInstanced\");\n\tgl3wTexBuffer = (PFNGLTEXBUFFERPROC) get_proc(\"glTexBuffer\");\n\tgl3wPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) get_proc(\"glPrimitiveRestartIndex\");\n\tgl3wGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) get_proc(\"glGetInteger64i_v\");\n\tgl3wGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) get_proc(\"glGetBufferParameteri64v\");\n\tgl3wFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) get_proc(\"glFramebufferTexture\");\n\tgl3wVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) get_proc(\"glVertexAttribDivisor\");\n\tgl3wMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) get_proc(\"glMinSampleShading\");\n\tgl3wBlendEquationi = (PFNGLBLENDEQUATIONIPROC) get_proc(\"glBlendEquationi\");\n\tgl3wBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) get_proc(\"glBlendEquationSeparatei\");\n\tgl3wBlendFunci = (PFNGLBLENDFUNCIPROC) get_proc(\"glBlendFunci\");\n\tgl3wBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) get_proc(\"glBlendFuncSeparatei\");\n\tgl3wIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) get_proc(\"glIsRenderbuffer\");\n\tgl3wBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) get_proc(\"glBindRenderbuffer\");\n\tgl3wDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) get_proc(\"glDeleteRenderbuffers\");\n\tgl3wGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) get_proc(\"glGenRenderbuffers\");\n\tgl3wRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) get_proc(\"glRenderbufferStorage\");\n\tgl3wGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) get_proc(\"glGetRenderbufferParameteriv\");\n\tgl3wIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) get_proc(\"glIsFramebuffer\");\n\tgl3wBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) get_proc(\"glBindFramebuffer\");\n\tgl3wDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) get_proc(\"glDeleteFramebuffers\");\n\tgl3wGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) get_proc(\"glGenFramebuffers\");\n\tgl3wCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) get_proc(\"glCheckFramebufferStatus\");\n\tgl3wFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) get_proc(\"glFramebufferTexture1D\");\n\tgl3wFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) get_proc(\"glFramebufferTexture2D\");\n\tgl3wFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) get_proc(\"glFramebufferTexture3D\");\n\tgl3wFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) get_proc(\"glFramebufferRenderbuffer\");\n\tgl3wGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) get_proc(\"glGetFramebufferAttachmentParameteriv\");\n\tgl3wGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) get_proc(\"glGenerateMipmap\");\n\tgl3wBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) get_proc(\"glBlitFramebuffer\");\n\tgl3wRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) get_proc(\"glRenderbufferStorageMultisample\");\n\tgl3wFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) get_proc(\"glFramebufferTextureLayer\");\n\tgl3wMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) get_proc(\"glMapBufferRange\");\n\tgl3wFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) get_proc(\"glFlushMappedBufferRange\");\n\tgl3wBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) get_proc(\"glBindVertexArray\");\n\tgl3wDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) get_proc(\"glDeleteVertexArrays\");\n\tgl3wGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) get_proc(\"glGenVertexArrays\");\n\tgl3wIsVertexArray = (PFNGLISVERTEXARRAYPROC) get_proc(\"glIsVertexArray\");\n\tgl3wGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) get_proc(\"glGetUniformIndices\");\n\tgl3wGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) get_proc(\"glGetActiveUniformsiv\");\n\tgl3wGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) get_proc(\"glGetActiveUniformName\");\n\tgl3wGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) get_proc(\"glGetUniformBlockIndex\");\n\tgl3wGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) get_proc(\"glGetActiveUniformBlockiv\");\n\tgl3wGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) get_proc(\"glGetActiveUniformBlockName\");\n\tgl3wUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) get_proc(\"glUniformBlockBinding\");\n\tgl3wCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) get_proc(\"glCopyBufferSubData\");\n\tgl3wDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) get_proc(\"glDrawElementsBaseVertex\");\n\tgl3wDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) get_proc(\"glDrawRangeElementsBaseVertex\");\n\tgl3wDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) get_proc(\"glDrawElementsInstancedBaseVertex\");\n\tgl3wMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) get_proc(\"glMultiDrawElementsBaseVertex\");\n\tgl3wProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) get_proc(\"glProvokingVertex\");\n\tgl3wFenceSync = (PFNGLFENCESYNCPROC) get_proc(\"glFenceSync\");\n\tgl3wIsSync = (PFNGLISSYNCPROC) get_proc(\"glIsSync\");\n\tgl3wDeleteSync = (PFNGLDELETESYNCPROC) get_proc(\"glDeleteSync\");\n\tgl3wClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) get_proc(\"glClientWaitSync\");\n\tgl3wWaitSync = (PFNGLWAITSYNCPROC) get_proc(\"glWaitSync\");\n\tgl3wGetInteger64v = (PFNGLGETINTEGER64VPROC) get_proc(\"glGetInteger64v\");\n\tgl3wGetSynciv = (PFNGLGETSYNCIVPROC) get_proc(\"glGetSynciv\");\n\tgl3wTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) get_proc(\"glTexImage2DMultisample\");\n\tgl3wTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) get_proc(\"glTexImage3DMultisample\");\n\tgl3wGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) get_proc(\"glGetMultisamplefv\");\n\tgl3wSampleMaski = (PFNGLSAMPLEMASKIPROC) get_proc(\"glSampleMaski\");\n\tgl3wBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC) get_proc(\"glBlendEquationiARB\");\n\tgl3wBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC) get_proc(\"glBlendEquationSeparateiARB\");\n\tgl3wBlendFunciARB = (PFNGLBLENDFUNCIARBPROC) get_proc(\"glBlendFunciARB\");\n\tgl3wBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC) get_proc(\"glBlendFuncSeparateiARB\");\n\tgl3wMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC) get_proc(\"glMinSampleShadingARB\");\n\tgl3wNamedStringARB = (PFNGLNAMEDSTRINGARBPROC) get_proc(\"glNamedStringARB\");\n\tgl3wDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC) get_proc(\"glDeleteNamedStringARB\");\n\tgl3wCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC) get_proc(\"glCompileShaderIncludeARB\");\n\tgl3wIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC) get_proc(\"glIsNamedStringARB\");\n\tgl3wGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC) get_proc(\"glGetNamedStringARB\");\n\tgl3wGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC) get_proc(\"glGetNamedStringivARB\");\n\tgl3wBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) get_proc(\"glBindFragDataLocationIndexed\");\n\tgl3wGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) get_proc(\"glGetFragDataIndex\");\n\tgl3wGenSamplers = (PFNGLGENSAMPLERSPROC) get_proc(\"glGenSamplers\");\n\tgl3wDeleteSamplers = (PFNGLDELETESAMPLERSPROC) get_proc(\"glDeleteSamplers\");\n\tgl3wIsSampler = (PFNGLISSAMPLERPROC) get_proc(\"glIsSampler\");\n\tgl3wBindSampler = (PFNGLBINDSAMPLERPROC) get_proc(\"glBindSampler\");\n\tgl3wSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) get_proc(\"glSamplerParameteri\");\n\tgl3wSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) get_proc(\"glSamplerParameteriv\");\n\tgl3wSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) get_proc(\"glSamplerParameterf\");\n\tgl3wSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) get_proc(\"glSamplerParameterfv\");\n\tgl3wSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) get_proc(\"glSamplerParameterIiv\");\n\tgl3wSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) get_proc(\"glSamplerParameterIuiv\");\n\tgl3wGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) get_proc(\"glGetSamplerParameteriv\");\n\tgl3wGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) get_proc(\"glGetSamplerParameterIiv\");\n\tgl3wGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) get_proc(\"glGetSamplerParameterfv\");\n\tgl3wGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) get_proc(\"glGetSamplerParameterIuiv\");\n\tgl3wQueryCounter = (PFNGLQUERYCOUNTERPROC) get_proc(\"glQueryCounter\");\n\tgl3wGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) get_proc(\"glGetQueryObjecti64v\");\n\tgl3wGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) get_proc(\"glGetQueryObjectui64v\");\n\tgl3wVertexP2ui = (PFNGLVERTEXP2UIPROC) get_proc(\"glVertexP2ui\");\n\tgl3wVertexP2uiv = (PFNGLVERTEXP2UIVPROC) get_proc(\"glVertexP2uiv\");\n\tgl3wVertexP3ui = (PFNGLVERTEXP3UIPROC) get_proc(\"glVertexP3ui\");\n\tgl3wVertexP3uiv = (PFNGLVERTEXP3UIVPROC) get_proc(\"glVertexP3uiv\");\n\tgl3wVertexP4ui = (PFNGLVERTEXP4UIPROC) get_proc(\"glVertexP4ui\");\n\tgl3wVertexP4uiv = (PFNGLVERTEXP4UIVPROC) get_proc(\"glVertexP4uiv\");\n\tgl3wTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) get_proc(\"glTexCoordP1ui\");\n\tgl3wTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) get_proc(\"glTexCoordP1uiv\");\n\tgl3wTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) get_proc(\"glTexCoordP2ui\");\n\tgl3wTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) get_proc(\"glTexCoordP2uiv\");\n\tgl3wTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) get_proc(\"glTexCoordP3ui\");\n\tgl3wTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) get_proc(\"glTexCoordP3uiv\");\n\tgl3wTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) get_proc(\"glTexCoordP4ui\");\n\tgl3wTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) get_proc(\"glTexCoordP4uiv\");\n\tgl3wMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) get_proc(\"glMultiTexCoordP1ui\");\n\tgl3wMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) get_proc(\"glMultiTexCoordP1uiv\");\n\tgl3wMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) get_proc(\"glMultiTexCoordP2ui\");\n\tgl3wMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) get_proc(\"glMultiTexCoordP2uiv\");\n\tgl3wMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) get_proc(\"glMultiTexCoordP3ui\");\n\tgl3wMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) get_proc(\"glMultiTexCoordP3uiv\");\n\tgl3wMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) get_proc(\"glMultiTexCoordP4ui\");\n\tgl3wMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) get_proc(\"glMultiTexCoordP4uiv\");\n\tgl3wNormalP3ui = (PFNGLNORMALP3UIPROC) get_proc(\"glNormalP3ui\");\n\tgl3wNormalP3uiv = (PFNGLNORMALP3UIVPROC) get_proc(\"glNormalP3uiv\");\n\tgl3wColorP3ui = (PFNGLCOLORP3UIPROC) get_proc(\"glColorP3ui\");\n\tgl3wColorP3uiv = (PFNGLCOLORP3UIVPROC) get_proc(\"glColorP3uiv\");\n\tgl3wColorP4ui = (PFNGLCOLORP4UIPROC) get_proc(\"glColorP4ui\");\n\tgl3wColorP4uiv = (PFNGLCOLORP4UIVPROC) get_proc(\"glColorP4uiv\");\n\tgl3wSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) get_proc(\"glSecondaryColorP3ui\");\n\tgl3wSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) get_proc(\"glSecondaryColorP3uiv\");\n\tgl3wVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) get_proc(\"glVertexAttribP1ui\");\n\tgl3wVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) get_proc(\"glVertexAttribP1uiv\");\n\tgl3wVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) get_proc(\"glVertexAttribP2ui\");\n\tgl3wVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) get_proc(\"glVertexAttribP2uiv\");\n\tgl3wVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) get_proc(\"glVertexAttribP3ui\");\n\tgl3wVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) get_proc(\"glVertexAttribP3uiv\");\n\tgl3wVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) get_proc(\"glVertexAttribP4ui\");\n\tgl3wVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) get_proc(\"glVertexAttribP4uiv\");\n\tgl3wDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) get_proc(\"glDrawArraysIndirect\");\n\tgl3wDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) get_proc(\"glDrawElementsIndirect\");\n\tgl3wUniform1d = (PFNGLUNIFORM1DPROC) get_proc(\"glUniform1d\");\n\tgl3wUniform2d = (PFNGLUNIFORM2DPROC) get_proc(\"glUniform2d\");\n\tgl3wUniform3d = (PFNGLUNIFORM3DPROC) get_proc(\"glUniform3d\");\n\tgl3wUniform4d = (PFNGLUNIFORM4DPROC) get_proc(\"glUniform4d\");\n\tgl3wUniform1dv = (PFNGLUNIFORM1DVPROC) get_proc(\"glUniform1dv\");\n\tgl3wUniform2dv = (PFNGLUNIFORM2DVPROC) get_proc(\"glUniform2dv\");\n\tgl3wUniform3dv = (PFNGLUNIFORM3DVPROC) get_proc(\"glUniform3dv\");\n\tgl3wUniform4dv = (PFNGLUNIFORM4DVPROC) get_proc(\"glUniform4dv\");\n\tgl3wUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) get_proc(\"glUniformMatrix2dv\");\n\tgl3wUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) get_proc(\"glUniformMatrix3dv\");\n\tgl3wUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) get_proc(\"glUniformMatrix4dv\");\n\tgl3wUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) get_proc(\"glUniformMatrix2x3dv\");\n\tgl3wUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) get_proc(\"glUniformMatrix2x4dv\");\n\tgl3wUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) get_proc(\"glUniformMatrix3x2dv\");\n\tgl3wUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) get_proc(\"glUniformMatrix3x4dv\");\n\tgl3wUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) get_proc(\"glUniformMatrix4x2dv\");\n\tgl3wUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) get_proc(\"glUniformMatrix4x3dv\");\n\tgl3wGetUniformdv = (PFNGLGETUNIFORMDVPROC) get_proc(\"glGetUniformdv\");\n\tgl3wGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) get_proc(\"glGetSubroutineUniformLocation\");\n\tgl3wGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) get_proc(\"glGetSubroutineIndex\");\n\tgl3wGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) get_proc(\"glGetActiveSubroutineUniformiv\");\n\tgl3wGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) get_proc(\"glGetActiveSubroutineUniformName\");\n\tgl3wGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) get_proc(\"glGetActiveSubroutineName\");\n\tgl3wUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) get_proc(\"glUniformSubroutinesuiv\");\n\tgl3wGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) get_proc(\"glGetUniformSubroutineuiv\");\n\tgl3wGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) get_proc(\"glGetProgramStageiv\");\n\tgl3wPatchParameteri = (PFNGLPATCHPARAMETERIPROC) get_proc(\"glPatchParameteri\");\n\tgl3wPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) get_proc(\"glPatchParameterfv\");\n\tgl3wBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) get_proc(\"glBindTransformFeedback\");\n\tgl3wDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) get_proc(\"glDeleteTransformFeedbacks\");\n\tgl3wGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) get_proc(\"glGenTransformFeedbacks\");\n\tgl3wIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) get_proc(\"glIsTransformFeedback\");\n\tgl3wPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) get_proc(\"glPauseTransformFeedback\");\n\tgl3wResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) get_proc(\"glResumeTransformFeedback\");\n\tgl3wDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) get_proc(\"glDrawTransformFeedback\");\n\tgl3wDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) get_proc(\"glDrawTransformFeedbackStream\");\n\tgl3wBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) get_proc(\"glBeginQueryIndexed\");\n\tgl3wEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) get_proc(\"glEndQueryIndexed\");\n\tgl3wGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) get_proc(\"glGetQueryIndexediv\");\n\tgl3wReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) get_proc(\"glReleaseShaderCompiler\");\n\tgl3wShaderBinary = (PFNGLSHADERBINARYPROC) get_proc(\"glShaderBinary\");\n\tgl3wGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) get_proc(\"glGetShaderPrecisionFormat\");\n\tgl3wDepthRangef = (PFNGLDEPTHRANGEFPROC) get_proc(\"glDepthRangef\");\n\tgl3wClearDepthf = (PFNGLCLEARDEPTHFPROC) get_proc(\"glClearDepthf\");\n\tgl3wGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) get_proc(\"glGetProgramBinary\");\n\tgl3wProgramBinary = (PFNGLPROGRAMBINARYPROC) get_proc(\"glProgramBinary\");\n\tgl3wProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) get_proc(\"glProgramParameteri\");\n\tgl3wUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) get_proc(\"glUseProgramStages\");\n\tgl3wActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) get_proc(\"glActiveShaderProgram\");\n\tgl3wCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) get_proc(\"glCreateShaderProgramv\");\n\tgl3wBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) get_proc(\"glBindProgramPipeline\");\n\tgl3wDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) get_proc(\"glDeleteProgramPipelines\");\n\tgl3wGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) get_proc(\"glGenProgramPipelines\");\n\tgl3wIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) get_proc(\"glIsProgramPipeline\");\n\tgl3wGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) get_proc(\"glGetProgramPipelineiv\");\n\tgl3wProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) get_proc(\"glProgramUniform1i\");\n\tgl3wProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) get_proc(\"glProgramUniform1iv\");\n\tgl3wProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) get_proc(\"glProgramUniform1f\");\n\tgl3wProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) get_proc(\"glProgramUniform1fv\");\n\tgl3wProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) get_proc(\"glProgramUniform1d\");\n\tgl3wProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) get_proc(\"glProgramUniform1dv\");\n\tgl3wProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) get_proc(\"glProgramUniform1ui\");\n\tgl3wProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) get_proc(\"glProgramUniform1uiv\");\n\tgl3wProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) get_proc(\"glProgramUniform2i\");\n\tgl3wProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) get_proc(\"glProgramUniform2iv\");\n\tgl3wProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) get_proc(\"glProgramUniform2f\");\n\tgl3wProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) get_proc(\"glProgramUniform2fv\");\n\tgl3wProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) get_proc(\"glProgramUniform2d\");\n\tgl3wProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) get_proc(\"glProgramUniform2dv\");\n\tgl3wProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) get_proc(\"glProgramUniform2ui\");\n\tgl3wProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) get_proc(\"glProgramUniform2uiv\");\n\tgl3wProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) get_proc(\"glProgramUniform3i\");\n\tgl3wProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) get_proc(\"glProgramUniform3iv\");\n\tgl3wProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) get_proc(\"glProgramUniform3f\");\n\tgl3wProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) get_proc(\"glProgramUniform3fv\");\n\tgl3wProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) get_proc(\"glProgramUniform3d\");\n\tgl3wProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) get_proc(\"glProgramUniform3dv\");\n\tgl3wProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) get_proc(\"glProgramUniform3ui\");\n\tgl3wProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) get_proc(\"glProgramUniform3uiv\");\n\tgl3wProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) get_proc(\"glProgramUniform4i\");\n\tgl3wProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) get_proc(\"glProgramUniform4iv\");\n\tgl3wProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) get_proc(\"glProgramUniform4f\");\n\tgl3wProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) get_proc(\"glProgramUniform4fv\");\n\tgl3wProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) get_proc(\"glProgramUniform4d\");\n\tgl3wProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) get_proc(\"glProgramUniform4dv\");\n\tgl3wProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) get_proc(\"glProgramUniform4ui\");\n\tgl3wProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) get_proc(\"glProgramUniform4uiv\");\n\tgl3wProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) get_proc(\"glProgramUniformMatrix2fv\");\n\tgl3wProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) get_proc(\"glProgramUniformMatrix3fv\");\n\tgl3wProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) get_proc(\"glProgramUniformMatrix4fv\");\n\tgl3wProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) get_proc(\"glProgramUniformMatrix2dv\");\n\tgl3wProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) get_proc(\"glProgramUniformMatrix3dv\");\n\tgl3wProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) get_proc(\"glProgramUniformMatrix4dv\");\n\tgl3wProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) get_proc(\"glProgramUniformMatrix2x3fv\");\n\tgl3wProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) get_proc(\"glProgramUniformMatrix3x2fv\");\n\tgl3wProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) get_proc(\"glProgramUniformMatrix2x4fv\");\n\tgl3wProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) get_proc(\"glProgramUniformMatrix4x2fv\");\n\tgl3wProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) get_proc(\"glProgramUniformMatrix3x4fv\");\n\tgl3wProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) get_proc(\"glProgramUniformMatrix4x3fv\");\n\tgl3wProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) get_proc(\"glProgramUniformMatrix2x3dv\");\n\tgl3wProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) get_proc(\"glProgramUniformMatrix3x2dv\");\n\tgl3wProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) get_proc(\"glProgramUniformMatrix2x4dv\");\n\tgl3wProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) get_proc(\"glProgramUniformMatrix4x2dv\");\n\tgl3wProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) get_proc(\"glProgramUniformMatrix3x4dv\");\n\tgl3wProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) get_proc(\"glProgramUniformMatrix4x3dv\");\n\tgl3wValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) get_proc(\"glValidateProgramPipeline\");\n\tgl3wGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) get_proc(\"glGetProgramPipelineInfoLog\");\n\tgl3wVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) get_proc(\"glVertexAttribL1d\");\n\tgl3wVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) get_proc(\"glVertexAttribL2d\");\n\tgl3wVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) get_proc(\"glVertexAttribL3d\");\n\tgl3wVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) get_proc(\"glVertexAttribL4d\");\n\tgl3wVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) get_proc(\"glVertexAttribL1dv\");\n\tgl3wVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) get_proc(\"glVertexAttribL2dv\");\n\tgl3wVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) get_proc(\"glVertexAttribL3dv\");\n\tgl3wVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) get_proc(\"glVertexAttribL4dv\");\n\tgl3wVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) get_proc(\"glVertexAttribLPointer\");\n\tgl3wGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) get_proc(\"glGetVertexAttribLdv\");\n\tgl3wViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) get_proc(\"glViewportArrayv\");\n\tgl3wViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) get_proc(\"glViewportIndexedf\");\n\tgl3wViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) get_proc(\"glViewportIndexedfv\");\n\tgl3wScissorArrayv = (PFNGLSCISSORARRAYVPROC) get_proc(\"glScissorArrayv\");\n\tgl3wScissorIndexed = (PFNGLSCISSORINDEXEDPROC) get_proc(\"glScissorIndexed\");\n\tgl3wScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) get_proc(\"glScissorIndexedv\");\n\tgl3wDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) get_proc(\"glDepthRangeArrayv\");\n\tgl3wDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) get_proc(\"glDepthRangeIndexed\");\n\tgl3wGetFloati_v = (PFNGLGETFLOATI_VPROC) get_proc(\"glGetFloati_v\");\n\tgl3wGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) get_proc(\"glGetDoublei_v\");\n\tgl3wCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC) get_proc(\"glCreateSyncFromCLeventARB\");\n\tgl3wDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC) get_proc(\"glDebugMessageControlARB\");\n\tgl3wDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC) get_proc(\"glDebugMessageInsertARB\");\n\tgl3wDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC) get_proc(\"glDebugMessageCallbackARB\");\n\tgl3wGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC) get_proc(\"glGetDebugMessageLogARB\");\n\tgl3wGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC) get_proc(\"glGetGraphicsResetStatusARB\");\n\tgl3wGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC) get_proc(\"glGetnTexImageARB\");\n\tgl3wReadnPixelsARB = (PFNGLREADNPIXELSARBPROC) get_proc(\"glReadnPixelsARB\");\n\tgl3wGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) get_proc(\"glGetnCompressedTexImageARB\");\n\tgl3wGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC) get_proc(\"glGetnUniformfvARB\");\n\tgl3wGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC) get_proc(\"glGetnUniformivARB\");\n\tgl3wGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC) get_proc(\"glGetnUniformuivARB\");\n\tgl3wGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC) get_proc(\"glGetnUniformdvARB\");\n\tgl3wDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) get_proc(\"glDrawArraysInstancedBaseInstance\");\n\tgl3wDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) get_proc(\"glDrawElementsInstancedBaseInstance\");\n\tgl3wDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) get_proc(\"glDrawElementsInstancedBaseVertexBaseInstance\");\n\tgl3wDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) get_proc(\"glDrawTransformFeedbackInstanced\");\n\tgl3wDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) get_proc(\"glDrawTransformFeedbackStreamInstanced\");\n\tgl3wGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) get_proc(\"glGetInternalformativ\");\n\tgl3wGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) get_proc(\"glGetActiveAtomicCounterBufferiv\");\n\tgl3wBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) get_proc(\"glBindImageTexture\");\n\tgl3wMemoryBarrier = (PFNGLMEMORYBARRIERPROC) get_proc(\"glMemoryBarrier\");\n\tgl3wTexStorage1D = (PFNGLTEXSTORAGE1DPROC) get_proc(\"glTexStorage1D\");\n\tgl3wTexStorage2D = (PFNGLTEXSTORAGE2DPROC) get_proc(\"glTexStorage2D\");\n\tgl3wTexStorage3D = (PFNGLTEXSTORAGE3DPROC) get_proc(\"glTexStorage3D\");\n\tgl3wTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC) get_proc(\"glTextureStorage1DEXT\");\n\tgl3wTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC) get_proc(\"glTextureStorage2DEXT\");\n\tgl3wTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC) get_proc(\"glTextureStorage3DEXT\");\n\tgl3wDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) get_proc(\"glDebugMessageControl\");\n\tgl3wDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) get_proc(\"glDebugMessageInsert\");\n\tgl3wDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) get_proc(\"glDebugMessageCallback\");\n\tgl3wGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) get_proc(\"glGetDebugMessageLog\");\n\tgl3wPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) get_proc(\"glPushDebugGroup\");\n\tgl3wPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) get_proc(\"glPopDebugGroup\");\n\tgl3wObjectLabel = (PFNGLOBJECTLABELPROC) get_proc(\"glObjectLabel\");\n\tgl3wGetObjectLabel = (PFNGLGETOBJECTLABELPROC) get_proc(\"glGetObjectLabel\");\n\tgl3wObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) get_proc(\"glObjectPtrLabel\");\n\tgl3wGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) get_proc(\"glGetObjectPtrLabel\");\n\tgl3wClearBufferData = (PFNGLCLEARBUFFERDATAPROC) get_proc(\"glClearBufferData\");\n\tgl3wClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) get_proc(\"glClearBufferSubData\");\n\tgl3wClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC) get_proc(\"glClearNamedBufferDataEXT\");\n\tgl3wClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) get_proc(\"glClearNamedBufferSubDataEXT\");\n\tgl3wDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) get_proc(\"glDispatchCompute\");\n\tgl3wDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) get_proc(\"glDispatchComputeIndirect\");\n\tgl3wCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) get_proc(\"glCopyImageSubData\");\n\tgl3wTextureView = (PFNGLTEXTUREVIEWPROC) get_proc(\"glTextureView\");\n\tgl3wBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) get_proc(\"glBindVertexBuffer\");\n\tgl3wVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) get_proc(\"glVertexAttribFormat\");\n\tgl3wVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) get_proc(\"glVertexAttribIFormat\");\n\tgl3wVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) get_proc(\"glVertexAttribLFormat\");\n\tgl3wVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) get_proc(\"glVertexAttribBinding\");\n\tgl3wVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) get_proc(\"glVertexBindingDivisor\");\n\tgl3wVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) get_proc(\"glVertexArrayBindVertexBufferEXT\");\n\tgl3wVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) get_proc(\"glVertexArrayVertexAttribFormatEXT\");\n\tgl3wVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) get_proc(\"glVertexArrayVertexAttribIFormatEXT\");\n\tgl3wVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) get_proc(\"glVertexArrayVertexAttribLFormatEXT\");\n\tgl3wVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) get_proc(\"glVertexArrayVertexAttribBindingEXT\");\n\tgl3wVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) get_proc(\"glVertexArrayVertexBindingDivisorEXT\");\n\tgl3wFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) get_proc(\"glFramebufferParameteri\");\n\tgl3wGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) get_proc(\"glGetFramebufferParameteriv\");\n\tgl3wNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) get_proc(\"glNamedFramebufferParameteriEXT\");\n\tgl3wGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) get_proc(\"glGetNamedFramebufferParameterivEXT\");\n\tgl3wGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) get_proc(\"glGetInternalformati64v\");\n\tgl3wInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) get_proc(\"glInvalidateTexSubImage\");\n\tgl3wInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) get_proc(\"glInvalidateTexImage\");\n\tgl3wInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) get_proc(\"glInvalidateBufferSubData\");\n\tgl3wInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) get_proc(\"glInvalidateBufferData\");\n\tgl3wInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) get_proc(\"glInvalidateFramebuffer\");\n\tgl3wInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) get_proc(\"glInvalidateSubFramebuffer\");\n\tgl3wMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) get_proc(\"glMultiDrawArraysIndirect\");\n\tgl3wMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) get_proc(\"glMultiDrawElementsIndirect\");\n\tgl3wGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) get_proc(\"glGetProgramInterfaceiv\");\n\tgl3wGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) get_proc(\"glGetProgramResourceIndex\");\n\tgl3wGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) get_proc(\"glGetProgramResourceName\");\n\tgl3wGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) get_proc(\"glGetProgramResourceiv\");\n\tgl3wGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) get_proc(\"glGetProgramResourceLocation\");\n\tgl3wGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) get_proc(\"glGetProgramResourceLocationIndex\");\n\tgl3wShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) get_proc(\"glShaderStorageBlockBinding\");\n\tgl3wTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) get_proc(\"glTexBufferRange\");\n\tgl3wTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC) get_proc(\"glTextureBufferRangeEXT\");\n\tgl3wTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) get_proc(\"glTexStorage2DMultisample\");\n\tgl3wTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) get_proc(\"glTexStorage3DMultisample\");\n\tgl3wTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) get_proc(\"glTextureStorage2DMultisampleEXT\");\n\tgl3wTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) get_proc(\"glTextureStorage3DMultisampleEXT\");\n}\n"
  },
  {
    "path": "external/imgui/examples/libs/gl3w/GL/gl3w.h",
    "content": "#ifndef __gl3w_h_\n#define __gl3w_h_\n\n#include <GL/glcorearb.h>\n\n#ifndef __gl_h_\n#define __gl_h_\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* gl3w api */\nint gl3wInit(void);\nint gl3wIsSupported(int major, int minor);\nvoid *gl3wGetProcAddress(const char *proc);\n\n/* OpenGL functions */\nextern PFNGLCULLFACEPROC gl3wCullFace;\nextern PFNGLFRONTFACEPROC gl3wFrontFace;\nextern PFNGLHINTPROC gl3wHint;\nextern PFNGLLINEWIDTHPROC gl3wLineWidth;\nextern PFNGLPOINTSIZEPROC gl3wPointSize;\nextern PFNGLPOLYGONMODEPROC gl3wPolygonMode;\nextern PFNGLSCISSORPROC gl3wScissor;\nextern PFNGLTEXPARAMETERFPROC gl3wTexParameterf;\nextern PFNGLTEXPARAMETERFVPROC gl3wTexParameterfv;\nextern PFNGLTEXPARAMETERIPROC gl3wTexParameteri;\nextern PFNGLTEXPARAMETERIVPROC gl3wTexParameteriv;\nextern PFNGLTEXIMAGE1DPROC gl3wTexImage1D;\nextern PFNGLTEXIMAGE2DPROC gl3wTexImage2D;\nextern PFNGLDRAWBUFFERPROC gl3wDrawBuffer;\nextern PFNGLCLEARPROC gl3wClear;\nextern PFNGLCLEARCOLORPROC gl3wClearColor;\nextern PFNGLCLEARSTENCILPROC gl3wClearStencil;\nextern PFNGLCLEARDEPTHPROC gl3wClearDepth;\nextern PFNGLSTENCILMASKPROC gl3wStencilMask;\nextern PFNGLCOLORMASKPROC gl3wColorMask;\nextern PFNGLDEPTHMASKPROC gl3wDepthMask;\nextern PFNGLDISABLEPROC gl3wDisable;\nextern PFNGLENABLEPROC gl3wEnable;\nextern PFNGLFINISHPROC gl3wFinish;\nextern PFNGLFLUSHPROC gl3wFlush;\nextern PFNGLBLENDFUNCPROC gl3wBlendFunc;\nextern PFNGLLOGICOPPROC gl3wLogicOp;\nextern PFNGLSTENCILFUNCPROC gl3wStencilFunc;\nextern PFNGLSTENCILOPPROC gl3wStencilOp;\nextern PFNGLDEPTHFUNCPROC gl3wDepthFunc;\nextern PFNGLPIXELSTOREFPROC gl3wPixelStoref;\nextern PFNGLPIXELSTOREIPROC gl3wPixelStorei;\nextern PFNGLREADBUFFERPROC gl3wReadBuffer;\nextern PFNGLREADPIXELSPROC gl3wReadPixels;\nextern PFNGLGETBOOLEANVPROC gl3wGetBooleanv;\nextern PFNGLGETDOUBLEVPROC gl3wGetDoublev;\nextern PFNGLGETERRORPROC gl3wGetError;\nextern PFNGLGETFLOATVPROC gl3wGetFloatv;\nextern PFNGLGETINTEGERVPROC gl3wGetIntegerv;\nextern PFNGLGETSTRINGPROC gl3wGetString;\nextern PFNGLGETTEXIMAGEPROC gl3wGetTexImage;\nextern PFNGLGETTEXPARAMETERFVPROC gl3wGetTexParameterfv;\nextern PFNGLGETTEXPARAMETERIVPROC gl3wGetTexParameteriv;\nextern PFNGLGETTEXLEVELPARAMETERFVPROC gl3wGetTexLevelParameterfv;\nextern PFNGLGETTEXLEVELPARAMETERIVPROC gl3wGetTexLevelParameteriv;\nextern PFNGLISENABLEDPROC gl3wIsEnabled;\nextern PFNGLDEPTHRANGEPROC gl3wDepthRange;\nextern PFNGLVIEWPORTPROC gl3wViewport;\nextern PFNGLDRAWARRAYSPROC gl3wDrawArrays;\nextern PFNGLDRAWELEMENTSPROC gl3wDrawElements;\nextern PFNGLGETPOINTERVPROC gl3wGetPointerv;\nextern PFNGLPOLYGONOFFSETPROC gl3wPolygonOffset;\nextern PFNGLCOPYTEXIMAGE1DPROC gl3wCopyTexImage1D;\nextern PFNGLCOPYTEXIMAGE2DPROC gl3wCopyTexImage2D;\nextern PFNGLCOPYTEXSUBIMAGE1DPROC gl3wCopyTexSubImage1D;\nextern PFNGLCOPYTEXSUBIMAGE2DPROC gl3wCopyTexSubImage2D;\nextern PFNGLTEXSUBIMAGE1DPROC gl3wTexSubImage1D;\nextern PFNGLTEXSUBIMAGE2DPROC gl3wTexSubImage2D;\nextern PFNGLBINDTEXTUREPROC gl3wBindTexture;\nextern PFNGLDELETETEXTURESPROC gl3wDeleteTextures;\nextern PFNGLGENTEXTURESPROC gl3wGenTextures;\nextern PFNGLISTEXTUREPROC gl3wIsTexture;\nextern PFNGLBLENDCOLORPROC gl3wBlendColor;\nextern PFNGLBLENDEQUATIONPROC gl3wBlendEquation;\nextern PFNGLDRAWRANGEELEMENTSPROC gl3wDrawRangeElements;\nextern PFNGLTEXIMAGE3DPROC gl3wTexImage3D;\nextern PFNGLTEXSUBIMAGE3DPROC gl3wTexSubImage3D;\nextern PFNGLCOPYTEXSUBIMAGE3DPROC gl3wCopyTexSubImage3D;\nextern PFNGLACTIVETEXTUREPROC gl3wActiveTexture;\nextern PFNGLSAMPLECOVERAGEPROC gl3wSampleCoverage;\nextern PFNGLCOMPRESSEDTEXIMAGE3DPROC gl3wCompressedTexImage3D;\nextern PFNGLCOMPRESSEDTEXIMAGE2DPROC gl3wCompressedTexImage2D;\nextern PFNGLCOMPRESSEDTEXIMAGE1DPROC gl3wCompressedTexImage1D;\nextern PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC gl3wCompressedTexSubImage3D;\nextern PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC gl3wCompressedTexSubImage2D;\nextern PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC gl3wCompressedTexSubImage1D;\nextern PFNGLGETCOMPRESSEDTEXIMAGEPROC gl3wGetCompressedTexImage;\nextern PFNGLBLENDFUNCSEPARATEPROC gl3wBlendFuncSeparate;\nextern PFNGLMULTIDRAWARRAYSPROC gl3wMultiDrawArrays;\nextern PFNGLMULTIDRAWELEMENTSPROC gl3wMultiDrawElements;\nextern PFNGLPOINTPARAMETERFPROC gl3wPointParameterf;\nextern PFNGLPOINTPARAMETERFVPROC gl3wPointParameterfv;\nextern PFNGLPOINTPARAMETERIPROC gl3wPointParameteri;\nextern PFNGLPOINTPARAMETERIVPROC gl3wPointParameteriv;\nextern PFNGLGENQUERIESPROC gl3wGenQueries;\nextern PFNGLDELETEQUERIESPROC gl3wDeleteQueries;\nextern PFNGLISQUERYPROC gl3wIsQuery;\nextern PFNGLBEGINQUERYPROC gl3wBeginQuery;\nextern PFNGLENDQUERYPROC gl3wEndQuery;\nextern PFNGLGETQUERYIVPROC gl3wGetQueryiv;\nextern PFNGLGETQUERYOBJECTIVPROC gl3wGetQueryObjectiv;\nextern PFNGLGETQUERYOBJECTUIVPROC gl3wGetQueryObjectuiv;\nextern PFNGLBINDBUFFERPROC gl3wBindBuffer;\nextern PFNGLDELETEBUFFERSPROC gl3wDeleteBuffers;\nextern PFNGLGENBUFFERSPROC gl3wGenBuffers;\nextern PFNGLISBUFFERPROC gl3wIsBuffer;\nextern PFNGLBUFFERDATAPROC gl3wBufferData;\nextern PFNGLBUFFERSUBDATAPROC gl3wBufferSubData;\nextern PFNGLGETBUFFERSUBDATAPROC gl3wGetBufferSubData;\nextern PFNGLMAPBUFFERPROC gl3wMapBuffer;\nextern PFNGLUNMAPBUFFERPROC gl3wUnmapBuffer;\nextern PFNGLGETBUFFERPARAMETERIVPROC gl3wGetBufferParameteriv;\nextern PFNGLGETBUFFERPOINTERVPROC gl3wGetBufferPointerv;\nextern PFNGLBLENDEQUATIONSEPARATEPROC gl3wBlendEquationSeparate;\nextern PFNGLDRAWBUFFERSPROC gl3wDrawBuffers;\nextern PFNGLSTENCILOPSEPARATEPROC gl3wStencilOpSeparate;\nextern PFNGLSTENCILFUNCSEPARATEPROC gl3wStencilFuncSeparate;\nextern PFNGLSTENCILMASKSEPARATEPROC gl3wStencilMaskSeparate;\nextern PFNGLATTACHSHADERPROC gl3wAttachShader;\nextern PFNGLBINDATTRIBLOCATIONPROC gl3wBindAttribLocation;\nextern PFNGLCOMPILESHADERPROC gl3wCompileShader;\nextern PFNGLCREATEPROGRAMPROC gl3wCreateProgram;\nextern PFNGLCREATESHADERPROC gl3wCreateShader;\nextern PFNGLDELETEPROGRAMPROC gl3wDeleteProgram;\nextern PFNGLDELETESHADERPROC gl3wDeleteShader;\nextern PFNGLDETACHSHADERPROC gl3wDetachShader;\nextern PFNGLDISABLEVERTEXATTRIBARRAYPROC gl3wDisableVertexAttribArray;\nextern PFNGLENABLEVERTEXATTRIBARRAYPROC gl3wEnableVertexAttribArray;\nextern PFNGLGETACTIVEATTRIBPROC gl3wGetActiveAttrib;\nextern PFNGLGETACTIVEUNIFORMPROC gl3wGetActiveUniform;\nextern PFNGLGETATTACHEDSHADERSPROC gl3wGetAttachedShaders;\nextern PFNGLGETATTRIBLOCATIONPROC gl3wGetAttribLocation;\nextern PFNGLGETPROGRAMIVPROC gl3wGetProgramiv;\nextern PFNGLGETPROGRAMINFOLOGPROC gl3wGetProgramInfoLog;\nextern PFNGLGETSHADERIVPROC gl3wGetShaderiv;\nextern PFNGLGETSHADERINFOLOGPROC gl3wGetShaderInfoLog;\nextern PFNGLGETSHADERSOURCEPROC gl3wGetShaderSource;\nextern PFNGLGETUNIFORMLOCATIONPROC gl3wGetUniformLocation;\nextern PFNGLGETUNIFORMFVPROC gl3wGetUniformfv;\nextern PFNGLGETUNIFORMIVPROC gl3wGetUniformiv;\nextern PFNGLGETVERTEXATTRIBDVPROC gl3wGetVertexAttribdv;\nextern PFNGLGETVERTEXATTRIBFVPROC gl3wGetVertexAttribfv;\nextern PFNGLGETVERTEXATTRIBIVPROC gl3wGetVertexAttribiv;\nextern PFNGLGETVERTEXATTRIBPOINTERVPROC gl3wGetVertexAttribPointerv;\nextern PFNGLISPROGRAMPROC gl3wIsProgram;\nextern PFNGLISSHADERPROC gl3wIsShader;\nextern PFNGLLINKPROGRAMPROC gl3wLinkProgram;\nextern PFNGLSHADERSOURCEPROC gl3wShaderSource;\nextern PFNGLUSEPROGRAMPROC gl3wUseProgram;\nextern PFNGLUNIFORM1FPROC gl3wUniform1f;\nextern PFNGLUNIFORM2FPROC gl3wUniform2f;\nextern PFNGLUNIFORM3FPROC gl3wUniform3f;\nextern PFNGLUNIFORM4FPROC gl3wUniform4f;\nextern PFNGLUNIFORM1IPROC gl3wUniform1i;\nextern PFNGLUNIFORM2IPROC gl3wUniform2i;\nextern PFNGLUNIFORM3IPROC gl3wUniform3i;\nextern PFNGLUNIFORM4IPROC gl3wUniform4i;\nextern PFNGLUNIFORM1FVPROC gl3wUniform1fv;\nextern PFNGLUNIFORM2FVPROC gl3wUniform2fv;\nextern PFNGLUNIFORM3FVPROC gl3wUniform3fv;\nextern PFNGLUNIFORM4FVPROC gl3wUniform4fv;\nextern PFNGLUNIFORM1IVPROC gl3wUniform1iv;\nextern PFNGLUNIFORM2IVPROC gl3wUniform2iv;\nextern PFNGLUNIFORM3IVPROC gl3wUniform3iv;\nextern PFNGLUNIFORM4IVPROC gl3wUniform4iv;\nextern PFNGLUNIFORMMATRIX2FVPROC gl3wUniformMatrix2fv;\nextern PFNGLUNIFORMMATRIX3FVPROC gl3wUniformMatrix3fv;\nextern PFNGLUNIFORMMATRIX4FVPROC gl3wUniformMatrix4fv;\nextern PFNGLVALIDATEPROGRAMPROC gl3wValidateProgram;\nextern PFNGLVERTEXATTRIB1DPROC gl3wVertexAttrib1d;\nextern PFNGLVERTEXATTRIB1DVPROC gl3wVertexAttrib1dv;\nextern PFNGLVERTEXATTRIB1FPROC gl3wVertexAttrib1f;\nextern PFNGLVERTEXATTRIB1FVPROC gl3wVertexAttrib1fv;\nextern PFNGLVERTEXATTRIB1SPROC gl3wVertexAttrib1s;\nextern PFNGLVERTEXATTRIB1SVPROC gl3wVertexAttrib1sv;\nextern PFNGLVERTEXATTRIB2DPROC gl3wVertexAttrib2d;\nextern PFNGLVERTEXATTRIB2DVPROC gl3wVertexAttrib2dv;\nextern PFNGLVERTEXATTRIB2FPROC gl3wVertexAttrib2f;\nextern PFNGLVERTEXATTRIB2FVPROC gl3wVertexAttrib2fv;\nextern PFNGLVERTEXATTRIB2SPROC gl3wVertexAttrib2s;\nextern PFNGLVERTEXATTRIB2SVPROC gl3wVertexAttrib2sv;\nextern PFNGLVERTEXATTRIB3DPROC gl3wVertexAttrib3d;\nextern PFNGLVERTEXATTRIB3DVPROC gl3wVertexAttrib3dv;\nextern PFNGLVERTEXATTRIB3FPROC gl3wVertexAttrib3f;\nextern PFNGLVERTEXATTRIB3FVPROC gl3wVertexAttrib3fv;\nextern PFNGLVERTEXATTRIB3SPROC gl3wVertexAttrib3s;\nextern PFNGLVERTEXATTRIB3SVPROC gl3wVertexAttrib3sv;\nextern PFNGLVERTEXATTRIB4NBVPROC gl3wVertexAttrib4Nbv;\nextern PFNGLVERTEXATTRIB4NIVPROC gl3wVertexAttrib4Niv;\nextern PFNGLVERTEXATTRIB4NSVPROC gl3wVertexAttrib4Nsv;\nextern PFNGLVERTEXATTRIB4NUBPROC gl3wVertexAttrib4Nub;\nextern PFNGLVERTEXATTRIB4NUBVPROC gl3wVertexAttrib4Nubv;\nextern PFNGLVERTEXATTRIB4NUIVPROC gl3wVertexAttrib4Nuiv;\nextern PFNGLVERTEXATTRIB4NUSVPROC gl3wVertexAttrib4Nusv;\nextern PFNGLVERTEXATTRIB4BVPROC gl3wVertexAttrib4bv;\nextern PFNGLVERTEXATTRIB4DPROC gl3wVertexAttrib4d;\nextern PFNGLVERTEXATTRIB4DVPROC gl3wVertexAttrib4dv;\nextern PFNGLVERTEXATTRIB4FPROC gl3wVertexAttrib4f;\nextern PFNGLVERTEXATTRIB4FVPROC gl3wVertexAttrib4fv;\nextern PFNGLVERTEXATTRIB4IVPROC gl3wVertexAttrib4iv;\nextern PFNGLVERTEXATTRIB4SPROC gl3wVertexAttrib4s;\nextern PFNGLVERTEXATTRIB4SVPROC gl3wVertexAttrib4sv;\nextern PFNGLVERTEXATTRIB4UBVPROC gl3wVertexAttrib4ubv;\nextern PFNGLVERTEXATTRIB4UIVPROC gl3wVertexAttrib4uiv;\nextern PFNGLVERTEXATTRIB4USVPROC gl3wVertexAttrib4usv;\nextern PFNGLVERTEXATTRIBPOINTERPROC gl3wVertexAttribPointer;\nextern PFNGLUNIFORMMATRIX2X3FVPROC gl3wUniformMatrix2x3fv;\nextern PFNGLUNIFORMMATRIX3X2FVPROC gl3wUniformMatrix3x2fv;\nextern PFNGLUNIFORMMATRIX2X4FVPROC gl3wUniformMatrix2x4fv;\nextern PFNGLUNIFORMMATRIX4X2FVPROC gl3wUniformMatrix4x2fv;\nextern PFNGLUNIFORMMATRIX3X4FVPROC gl3wUniformMatrix3x4fv;\nextern PFNGLUNIFORMMATRIX4X3FVPROC gl3wUniformMatrix4x3fv;\nextern PFNGLCOLORMASKIPROC gl3wColorMaski;\nextern PFNGLGETBOOLEANI_VPROC gl3wGetBooleani_v;\nextern PFNGLGETINTEGERI_VPROC gl3wGetIntegeri_v;\nextern PFNGLENABLEIPROC gl3wEnablei;\nextern PFNGLDISABLEIPROC gl3wDisablei;\nextern PFNGLISENABLEDIPROC gl3wIsEnabledi;\nextern PFNGLBEGINTRANSFORMFEEDBACKPROC gl3wBeginTransformFeedback;\nextern PFNGLENDTRANSFORMFEEDBACKPROC gl3wEndTransformFeedback;\nextern PFNGLBINDBUFFERRANGEPROC gl3wBindBufferRange;\nextern PFNGLBINDBUFFERBASEPROC gl3wBindBufferBase;\nextern PFNGLTRANSFORMFEEDBACKVARYINGSPROC gl3wTransformFeedbackVaryings;\nextern PFNGLGETTRANSFORMFEEDBACKVARYINGPROC gl3wGetTransformFeedbackVarying;\nextern PFNGLCLAMPCOLORPROC gl3wClampColor;\nextern PFNGLBEGINCONDITIONALRENDERPROC gl3wBeginConditionalRender;\nextern PFNGLENDCONDITIONALRENDERPROC gl3wEndConditionalRender;\nextern PFNGLVERTEXATTRIBIPOINTERPROC gl3wVertexAttribIPointer;\nextern PFNGLGETVERTEXATTRIBIIVPROC gl3wGetVertexAttribIiv;\nextern PFNGLGETVERTEXATTRIBIUIVPROC gl3wGetVertexAttribIuiv;\nextern PFNGLVERTEXATTRIBI1IPROC gl3wVertexAttribI1i;\nextern PFNGLVERTEXATTRIBI2IPROC gl3wVertexAttribI2i;\nextern PFNGLVERTEXATTRIBI3IPROC gl3wVertexAttribI3i;\nextern PFNGLVERTEXATTRIBI4IPROC gl3wVertexAttribI4i;\nextern PFNGLVERTEXATTRIBI1UIPROC gl3wVertexAttribI1ui;\nextern PFNGLVERTEXATTRIBI2UIPROC gl3wVertexAttribI2ui;\nextern PFNGLVERTEXATTRIBI3UIPROC gl3wVertexAttribI3ui;\nextern PFNGLVERTEXATTRIBI4UIPROC gl3wVertexAttribI4ui;\nextern PFNGLVERTEXATTRIBI1IVPROC gl3wVertexAttribI1iv;\nextern PFNGLVERTEXATTRIBI2IVPROC gl3wVertexAttribI2iv;\nextern PFNGLVERTEXATTRIBI3IVPROC gl3wVertexAttribI3iv;\nextern PFNGLVERTEXATTRIBI4IVPROC gl3wVertexAttribI4iv;\nextern PFNGLVERTEXATTRIBI1UIVPROC gl3wVertexAttribI1uiv;\nextern PFNGLVERTEXATTRIBI2UIVPROC gl3wVertexAttribI2uiv;\nextern PFNGLVERTEXATTRIBI3UIVPROC gl3wVertexAttribI3uiv;\nextern PFNGLVERTEXATTRIBI4UIVPROC gl3wVertexAttribI4uiv;\nextern PFNGLVERTEXATTRIBI4BVPROC gl3wVertexAttribI4bv;\nextern PFNGLVERTEXATTRIBI4SVPROC gl3wVertexAttribI4sv;\nextern PFNGLVERTEXATTRIBI4UBVPROC gl3wVertexAttribI4ubv;\nextern PFNGLVERTEXATTRIBI4USVPROC gl3wVertexAttribI4usv;\nextern PFNGLGETUNIFORMUIVPROC gl3wGetUniformuiv;\nextern PFNGLBINDFRAGDATALOCATIONPROC gl3wBindFragDataLocation;\nextern PFNGLGETFRAGDATALOCATIONPROC gl3wGetFragDataLocation;\nextern PFNGLUNIFORM1UIPROC gl3wUniform1ui;\nextern PFNGLUNIFORM2UIPROC gl3wUniform2ui;\nextern PFNGLUNIFORM3UIPROC gl3wUniform3ui;\nextern PFNGLUNIFORM4UIPROC gl3wUniform4ui;\nextern PFNGLUNIFORM1UIVPROC gl3wUniform1uiv;\nextern PFNGLUNIFORM2UIVPROC gl3wUniform2uiv;\nextern PFNGLUNIFORM3UIVPROC gl3wUniform3uiv;\nextern PFNGLUNIFORM4UIVPROC gl3wUniform4uiv;\nextern PFNGLTEXPARAMETERIIVPROC gl3wTexParameterIiv;\nextern PFNGLTEXPARAMETERIUIVPROC gl3wTexParameterIuiv;\nextern PFNGLGETTEXPARAMETERIIVPROC gl3wGetTexParameterIiv;\nextern PFNGLGETTEXPARAMETERIUIVPROC gl3wGetTexParameterIuiv;\nextern PFNGLCLEARBUFFERIVPROC gl3wClearBufferiv;\nextern PFNGLCLEARBUFFERUIVPROC gl3wClearBufferuiv;\nextern PFNGLCLEARBUFFERFVPROC gl3wClearBufferfv;\nextern PFNGLCLEARBUFFERFIPROC gl3wClearBufferfi;\nextern PFNGLGETSTRINGIPROC gl3wGetStringi;\nextern PFNGLDRAWARRAYSINSTANCEDPROC gl3wDrawArraysInstanced;\nextern PFNGLDRAWELEMENTSINSTANCEDPROC gl3wDrawElementsInstanced;\nextern PFNGLTEXBUFFERPROC gl3wTexBuffer;\nextern PFNGLPRIMITIVERESTARTINDEXPROC gl3wPrimitiveRestartIndex;\nextern PFNGLGETINTEGER64I_VPROC gl3wGetInteger64i_v;\nextern PFNGLGETBUFFERPARAMETERI64VPROC gl3wGetBufferParameteri64v;\nextern PFNGLFRAMEBUFFERTEXTUREPROC gl3wFramebufferTexture;\nextern PFNGLVERTEXATTRIBDIVISORPROC gl3wVertexAttribDivisor;\nextern PFNGLMINSAMPLESHADINGPROC gl3wMinSampleShading;\nextern PFNGLBLENDEQUATIONIPROC gl3wBlendEquationi;\nextern PFNGLBLENDEQUATIONSEPARATEIPROC gl3wBlendEquationSeparatei;\nextern PFNGLBLENDFUNCIPROC gl3wBlendFunci;\nextern PFNGLBLENDFUNCSEPARATEIPROC gl3wBlendFuncSeparatei;\nextern PFNGLISRENDERBUFFERPROC gl3wIsRenderbuffer;\nextern PFNGLBINDRENDERBUFFERPROC gl3wBindRenderbuffer;\nextern PFNGLDELETERENDERBUFFERSPROC gl3wDeleteRenderbuffers;\nextern PFNGLGENRENDERBUFFERSPROC gl3wGenRenderbuffers;\nextern PFNGLRENDERBUFFERSTORAGEPROC gl3wRenderbufferStorage;\nextern PFNGLGETRENDERBUFFERPARAMETERIVPROC gl3wGetRenderbufferParameteriv;\nextern PFNGLISFRAMEBUFFERPROC gl3wIsFramebuffer;\nextern PFNGLBINDFRAMEBUFFERPROC gl3wBindFramebuffer;\nextern PFNGLDELETEFRAMEBUFFERSPROC gl3wDeleteFramebuffers;\nextern PFNGLGENFRAMEBUFFERSPROC gl3wGenFramebuffers;\nextern PFNGLCHECKFRAMEBUFFERSTATUSPROC gl3wCheckFramebufferStatus;\nextern PFNGLFRAMEBUFFERTEXTURE1DPROC gl3wFramebufferTexture1D;\nextern PFNGLFRAMEBUFFERTEXTURE2DPROC gl3wFramebufferTexture2D;\nextern PFNGLFRAMEBUFFERTEXTURE3DPROC gl3wFramebufferTexture3D;\nextern PFNGLFRAMEBUFFERRENDERBUFFERPROC gl3wFramebufferRenderbuffer;\nextern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC gl3wGetFramebufferAttachmentParameteriv;\nextern PFNGLGENERATEMIPMAPPROC gl3wGenerateMipmap;\nextern PFNGLBLITFRAMEBUFFERPROC gl3wBlitFramebuffer;\nextern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC gl3wRenderbufferStorageMultisample;\nextern PFNGLFRAMEBUFFERTEXTURELAYERPROC gl3wFramebufferTextureLayer;\nextern PFNGLMAPBUFFERRANGEPROC gl3wMapBufferRange;\nextern PFNGLFLUSHMAPPEDBUFFERRANGEPROC gl3wFlushMappedBufferRange;\nextern PFNGLBINDVERTEXARRAYPROC gl3wBindVertexArray;\nextern PFNGLDELETEVERTEXARRAYSPROC gl3wDeleteVertexArrays;\nextern PFNGLGENVERTEXARRAYSPROC gl3wGenVertexArrays;\nextern PFNGLISVERTEXARRAYPROC gl3wIsVertexArray;\nextern PFNGLGETUNIFORMINDICESPROC gl3wGetUniformIndices;\nextern PFNGLGETACTIVEUNIFORMSIVPROC gl3wGetActiveUniformsiv;\nextern PFNGLGETACTIVEUNIFORMNAMEPROC gl3wGetActiveUniformName;\nextern PFNGLGETUNIFORMBLOCKINDEXPROC gl3wGetUniformBlockIndex;\nextern PFNGLGETACTIVEUNIFORMBLOCKIVPROC gl3wGetActiveUniformBlockiv;\nextern PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC gl3wGetActiveUniformBlockName;\nextern PFNGLUNIFORMBLOCKBINDINGPROC gl3wUniformBlockBinding;\nextern PFNGLCOPYBUFFERSUBDATAPROC gl3wCopyBufferSubData;\nextern PFNGLDRAWELEMENTSBASEVERTEXPROC gl3wDrawElementsBaseVertex;\nextern PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC gl3wDrawRangeElementsBaseVertex;\nextern PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC gl3wDrawElementsInstancedBaseVertex;\nextern PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC gl3wMultiDrawElementsBaseVertex;\nextern PFNGLPROVOKINGVERTEXPROC gl3wProvokingVertex;\nextern PFNGLFENCESYNCPROC gl3wFenceSync;\nextern PFNGLISSYNCPROC gl3wIsSync;\nextern PFNGLDELETESYNCPROC gl3wDeleteSync;\nextern PFNGLCLIENTWAITSYNCPROC gl3wClientWaitSync;\nextern PFNGLWAITSYNCPROC gl3wWaitSync;\nextern PFNGLGETINTEGER64VPROC gl3wGetInteger64v;\nextern PFNGLGETSYNCIVPROC gl3wGetSynciv;\nextern PFNGLTEXIMAGE2DMULTISAMPLEPROC gl3wTexImage2DMultisample;\nextern PFNGLTEXIMAGE3DMULTISAMPLEPROC gl3wTexImage3DMultisample;\nextern PFNGLGETMULTISAMPLEFVPROC gl3wGetMultisamplefv;\nextern PFNGLSAMPLEMASKIPROC gl3wSampleMaski;\nextern PFNGLBLENDEQUATIONIARBPROC gl3wBlendEquationiARB;\nextern PFNGLBLENDEQUATIONSEPARATEIARBPROC gl3wBlendEquationSeparateiARB;\nextern PFNGLBLENDFUNCIARBPROC gl3wBlendFunciARB;\nextern PFNGLBLENDFUNCSEPARATEIARBPROC gl3wBlendFuncSeparateiARB;\nextern PFNGLMINSAMPLESHADINGARBPROC gl3wMinSampleShadingARB;\nextern PFNGLNAMEDSTRINGARBPROC gl3wNamedStringARB;\nextern PFNGLDELETENAMEDSTRINGARBPROC gl3wDeleteNamedStringARB;\nextern PFNGLCOMPILESHADERINCLUDEARBPROC gl3wCompileShaderIncludeARB;\nextern PFNGLISNAMEDSTRINGARBPROC gl3wIsNamedStringARB;\nextern PFNGLGETNAMEDSTRINGARBPROC gl3wGetNamedStringARB;\nextern PFNGLGETNAMEDSTRINGIVARBPROC gl3wGetNamedStringivARB;\nextern PFNGLBINDFRAGDATALOCATIONINDEXEDPROC gl3wBindFragDataLocationIndexed;\nextern PFNGLGETFRAGDATAINDEXPROC gl3wGetFragDataIndex;\nextern PFNGLGENSAMPLERSPROC gl3wGenSamplers;\nextern PFNGLDELETESAMPLERSPROC gl3wDeleteSamplers;\nextern PFNGLISSAMPLERPROC gl3wIsSampler;\nextern PFNGLBINDSAMPLERPROC gl3wBindSampler;\nextern PFNGLSAMPLERPARAMETERIPROC gl3wSamplerParameteri;\nextern PFNGLSAMPLERPARAMETERIVPROC gl3wSamplerParameteriv;\nextern PFNGLSAMPLERPARAMETERFPROC gl3wSamplerParameterf;\nextern PFNGLSAMPLERPARAMETERFVPROC gl3wSamplerParameterfv;\nextern PFNGLSAMPLERPARAMETERIIVPROC gl3wSamplerParameterIiv;\nextern PFNGLSAMPLERPARAMETERIUIVPROC gl3wSamplerParameterIuiv;\nextern PFNGLGETSAMPLERPARAMETERIVPROC gl3wGetSamplerParameteriv;\nextern PFNGLGETSAMPLERPARAMETERIIVPROC gl3wGetSamplerParameterIiv;\nextern PFNGLGETSAMPLERPARAMETERFVPROC gl3wGetSamplerParameterfv;\nextern PFNGLGETSAMPLERPARAMETERIUIVPROC gl3wGetSamplerParameterIuiv;\nextern PFNGLQUERYCOUNTERPROC gl3wQueryCounter;\nextern PFNGLGETQUERYOBJECTI64VPROC gl3wGetQueryObjecti64v;\nextern PFNGLGETQUERYOBJECTUI64VPROC gl3wGetQueryObjectui64v;\nextern PFNGLVERTEXP2UIPROC gl3wVertexP2ui;\nextern PFNGLVERTEXP2UIVPROC gl3wVertexP2uiv;\nextern PFNGLVERTEXP3UIPROC gl3wVertexP3ui;\nextern PFNGLVERTEXP3UIVPROC gl3wVertexP3uiv;\nextern PFNGLVERTEXP4UIPROC gl3wVertexP4ui;\nextern PFNGLVERTEXP4UIVPROC gl3wVertexP4uiv;\nextern PFNGLTEXCOORDP1UIPROC gl3wTexCoordP1ui;\nextern PFNGLTEXCOORDP1UIVPROC gl3wTexCoordP1uiv;\nextern PFNGLTEXCOORDP2UIPROC gl3wTexCoordP2ui;\nextern PFNGLTEXCOORDP2UIVPROC gl3wTexCoordP2uiv;\nextern PFNGLTEXCOORDP3UIPROC gl3wTexCoordP3ui;\nextern PFNGLTEXCOORDP3UIVPROC gl3wTexCoordP3uiv;\nextern PFNGLTEXCOORDP4UIPROC gl3wTexCoordP4ui;\nextern PFNGLTEXCOORDP4UIVPROC gl3wTexCoordP4uiv;\nextern PFNGLMULTITEXCOORDP1UIPROC gl3wMultiTexCoordP1ui;\nextern PFNGLMULTITEXCOORDP1UIVPROC gl3wMultiTexCoordP1uiv;\nextern PFNGLMULTITEXCOORDP2UIPROC gl3wMultiTexCoordP2ui;\nextern PFNGLMULTITEXCOORDP2UIVPROC gl3wMultiTexCoordP2uiv;\nextern PFNGLMULTITEXCOORDP3UIPROC gl3wMultiTexCoordP3ui;\nextern PFNGLMULTITEXCOORDP3UIVPROC gl3wMultiTexCoordP3uiv;\nextern PFNGLMULTITEXCOORDP4UIPROC gl3wMultiTexCoordP4ui;\nextern PFNGLMULTITEXCOORDP4UIVPROC gl3wMultiTexCoordP4uiv;\nextern PFNGLNORMALP3UIPROC gl3wNormalP3ui;\nextern PFNGLNORMALP3UIVPROC gl3wNormalP3uiv;\nextern PFNGLCOLORP3UIPROC gl3wColorP3ui;\nextern PFNGLCOLORP3UIVPROC gl3wColorP3uiv;\nextern PFNGLCOLORP4UIPROC gl3wColorP4ui;\nextern PFNGLCOLORP4UIVPROC gl3wColorP4uiv;\nextern PFNGLSECONDARYCOLORP3UIPROC gl3wSecondaryColorP3ui;\nextern PFNGLSECONDARYCOLORP3UIVPROC gl3wSecondaryColorP3uiv;\nextern PFNGLVERTEXATTRIBP1UIPROC gl3wVertexAttribP1ui;\nextern PFNGLVERTEXATTRIBP1UIVPROC gl3wVertexAttribP1uiv;\nextern PFNGLVERTEXATTRIBP2UIPROC gl3wVertexAttribP2ui;\nextern PFNGLVERTEXATTRIBP2UIVPROC gl3wVertexAttribP2uiv;\nextern PFNGLVERTEXATTRIBP3UIPROC gl3wVertexAttribP3ui;\nextern PFNGLVERTEXATTRIBP3UIVPROC gl3wVertexAttribP3uiv;\nextern PFNGLVERTEXATTRIBP4UIPROC gl3wVertexAttribP4ui;\nextern PFNGLVERTEXATTRIBP4UIVPROC gl3wVertexAttribP4uiv;\nextern PFNGLDRAWARRAYSINDIRECTPROC gl3wDrawArraysIndirect;\nextern PFNGLDRAWELEMENTSINDIRECTPROC gl3wDrawElementsIndirect;\nextern PFNGLUNIFORM1DPROC gl3wUniform1d;\nextern PFNGLUNIFORM2DPROC gl3wUniform2d;\nextern PFNGLUNIFORM3DPROC gl3wUniform3d;\nextern PFNGLUNIFORM4DPROC gl3wUniform4d;\nextern PFNGLUNIFORM1DVPROC gl3wUniform1dv;\nextern PFNGLUNIFORM2DVPROC gl3wUniform2dv;\nextern PFNGLUNIFORM3DVPROC gl3wUniform3dv;\nextern PFNGLUNIFORM4DVPROC gl3wUniform4dv;\nextern PFNGLUNIFORMMATRIX2DVPROC gl3wUniformMatrix2dv;\nextern PFNGLUNIFORMMATRIX3DVPROC gl3wUniformMatrix3dv;\nextern PFNGLUNIFORMMATRIX4DVPROC gl3wUniformMatrix4dv;\nextern PFNGLUNIFORMMATRIX2X3DVPROC gl3wUniformMatrix2x3dv;\nextern PFNGLUNIFORMMATRIX2X4DVPROC gl3wUniformMatrix2x4dv;\nextern PFNGLUNIFORMMATRIX3X2DVPROC gl3wUniformMatrix3x2dv;\nextern PFNGLUNIFORMMATRIX3X4DVPROC gl3wUniformMatrix3x4dv;\nextern PFNGLUNIFORMMATRIX4X2DVPROC gl3wUniformMatrix4x2dv;\nextern PFNGLUNIFORMMATRIX4X3DVPROC gl3wUniformMatrix4x3dv;\nextern PFNGLGETUNIFORMDVPROC gl3wGetUniformdv;\nextern PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC gl3wGetSubroutineUniformLocation;\nextern PFNGLGETSUBROUTINEINDEXPROC gl3wGetSubroutineIndex;\nextern PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC gl3wGetActiveSubroutineUniformiv;\nextern PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC gl3wGetActiveSubroutineUniformName;\nextern PFNGLGETACTIVESUBROUTINENAMEPROC gl3wGetActiveSubroutineName;\nextern PFNGLUNIFORMSUBROUTINESUIVPROC gl3wUniformSubroutinesuiv;\nextern PFNGLGETUNIFORMSUBROUTINEUIVPROC gl3wGetUniformSubroutineuiv;\nextern PFNGLGETPROGRAMSTAGEIVPROC gl3wGetProgramStageiv;\nextern PFNGLPATCHPARAMETERIPROC gl3wPatchParameteri;\nextern PFNGLPATCHPARAMETERFVPROC gl3wPatchParameterfv;\nextern PFNGLBINDTRANSFORMFEEDBACKPROC gl3wBindTransformFeedback;\nextern PFNGLDELETETRANSFORMFEEDBACKSPROC gl3wDeleteTransformFeedbacks;\nextern PFNGLGENTRANSFORMFEEDBACKSPROC gl3wGenTransformFeedbacks;\nextern PFNGLISTRANSFORMFEEDBACKPROC gl3wIsTransformFeedback;\nextern PFNGLPAUSETRANSFORMFEEDBACKPROC gl3wPauseTransformFeedback;\nextern PFNGLRESUMETRANSFORMFEEDBACKPROC gl3wResumeTransformFeedback;\nextern PFNGLDRAWTRANSFORMFEEDBACKPROC gl3wDrawTransformFeedback;\nextern PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC gl3wDrawTransformFeedbackStream;\nextern PFNGLBEGINQUERYINDEXEDPROC gl3wBeginQueryIndexed;\nextern PFNGLENDQUERYINDEXEDPROC gl3wEndQueryIndexed;\nextern PFNGLGETQUERYINDEXEDIVPROC gl3wGetQueryIndexediv;\nextern PFNGLRELEASESHADERCOMPILERPROC gl3wReleaseShaderCompiler;\nextern PFNGLSHADERBINARYPROC gl3wShaderBinary;\nextern PFNGLGETSHADERPRECISIONFORMATPROC gl3wGetShaderPrecisionFormat;\nextern PFNGLDEPTHRANGEFPROC gl3wDepthRangef;\nextern PFNGLCLEARDEPTHFPROC gl3wClearDepthf;\nextern PFNGLGETPROGRAMBINARYPROC gl3wGetProgramBinary;\nextern PFNGLPROGRAMBINARYPROC gl3wProgramBinary;\nextern PFNGLPROGRAMPARAMETERIPROC gl3wProgramParameteri;\nextern PFNGLUSEPROGRAMSTAGESPROC gl3wUseProgramStages;\nextern PFNGLACTIVESHADERPROGRAMPROC gl3wActiveShaderProgram;\nextern PFNGLCREATESHADERPROGRAMVPROC gl3wCreateShaderProgramv;\nextern PFNGLBINDPROGRAMPIPELINEPROC gl3wBindProgramPipeline;\nextern PFNGLDELETEPROGRAMPIPELINESPROC gl3wDeleteProgramPipelines;\nextern PFNGLGENPROGRAMPIPELINESPROC gl3wGenProgramPipelines;\nextern PFNGLISPROGRAMPIPELINEPROC gl3wIsProgramPipeline;\nextern PFNGLGETPROGRAMPIPELINEIVPROC gl3wGetProgramPipelineiv;\nextern PFNGLPROGRAMUNIFORM1IPROC gl3wProgramUniform1i;\nextern PFNGLPROGRAMUNIFORM1IVPROC gl3wProgramUniform1iv;\nextern PFNGLPROGRAMUNIFORM1FPROC gl3wProgramUniform1f;\nextern PFNGLPROGRAMUNIFORM1FVPROC gl3wProgramUniform1fv;\nextern PFNGLPROGRAMUNIFORM1DPROC gl3wProgramUniform1d;\nextern PFNGLPROGRAMUNIFORM1DVPROC gl3wProgramUniform1dv;\nextern PFNGLPROGRAMUNIFORM1UIPROC gl3wProgramUniform1ui;\nextern PFNGLPROGRAMUNIFORM1UIVPROC gl3wProgramUniform1uiv;\nextern PFNGLPROGRAMUNIFORM2IPROC gl3wProgramUniform2i;\nextern PFNGLPROGRAMUNIFORM2IVPROC gl3wProgramUniform2iv;\nextern PFNGLPROGRAMUNIFORM2FPROC gl3wProgramUniform2f;\nextern PFNGLPROGRAMUNIFORM2FVPROC gl3wProgramUniform2fv;\nextern PFNGLPROGRAMUNIFORM2DPROC gl3wProgramUniform2d;\nextern PFNGLPROGRAMUNIFORM2DVPROC gl3wProgramUniform2dv;\nextern PFNGLPROGRAMUNIFORM2UIPROC gl3wProgramUniform2ui;\nextern PFNGLPROGRAMUNIFORM2UIVPROC gl3wProgramUniform2uiv;\nextern PFNGLPROGRAMUNIFORM3IPROC gl3wProgramUniform3i;\nextern PFNGLPROGRAMUNIFORM3IVPROC gl3wProgramUniform3iv;\nextern PFNGLPROGRAMUNIFORM3FPROC gl3wProgramUniform3f;\nextern PFNGLPROGRAMUNIFORM3FVPROC gl3wProgramUniform3fv;\nextern PFNGLPROGRAMUNIFORM3DPROC gl3wProgramUniform3d;\nextern PFNGLPROGRAMUNIFORM3DVPROC gl3wProgramUniform3dv;\nextern PFNGLPROGRAMUNIFORM3UIPROC gl3wProgramUniform3ui;\nextern PFNGLPROGRAMUNIFORM3UIVPROC gl3wProgramUniform3uiv;\nextern PFNGLPROGRAMUNIFORM4IPROC gl3wProgramUniform4i;\nextern PFNGLPROGRAMUNIFORM4IVPROC gl3wProgramUniform4iv;\nextern PFNGLPROGRAMUNIFORM4FPROC gl3wProgramUniform4f;\nextern PFNGLPROGRAMUNIFORM4FVPROC gl3wProgramUniform4fv;\nextern PFNGLPROGRAMUNIFORM4DPROC gl3wProgramUniform4d;\nextern PFNGLPROGRAMUNIFORM4DVPROC gl3wProgramUniform4dv;\nextern PFNGLPROGRAMUNIFORM4UIPROC gl3wProgramUniform4ui;\nextern PFNGLPROGRAMUNIFORM4UIVPROC gl3wProgramUniform4uiv;\nextern PFNGLPROGRAMUNIFORMMATRIX2FVPROC gl3wProgramUniformMatrix2fv;\nextern PFNGLPROGRAMUNIFORMMATRIX3FVPROC gl3wProgramUniformMatrix3fv;\nextern PFNGLPROGRAMUNIFORMMATRIX4FVPROC gl3wProgramUniformMatrix4fv;\nextern PFNGLPROGRAMUNIFORMMATRIX2DVPROC gl3wProgramUniformMatrix2dv;\nextern PFNGLPROGRAMUNIFORMMATRIX3DVPROC gl3wProgramUniformMatrix3dv;\nextern PFNGLPROGRAMUNIFORMMATRIX4DVPROC gl3wProgramUniformMatrix4dv;\nextern PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC gl3wProgramUniformMatrix2x3fv;\nextern PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC gl3wProgramUniformMatrix3x2fv;\nextern PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC gl3wProgramUniformMatrix2x4fv;\nextern PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC gl3wProgramUniformMatrix4x2fv;\nextern PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC gl3wProgramUniformMatrix3x4fv;\nextern PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC gl3wProgramUniformMatrix4x3fv;\nextern PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC gl3wProgramUniformMatrix2x3dv;\nextern PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC gl3wProgramUniformMatrix3x2dv;\nextern PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC gl3wProgramUniformMatrix2x4dv;\nextern PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC gl3wProgramUniformMatrix4x2dv;\nextern PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC gl3wProgramUniformMatrix3x4dv;\nextern PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC gl3wProgramUniformMatrix4x3dv;\nextern PFNGLVALIDATEPROGRAMPIPELINEPROC gl3wValidateProgramPipeline;\nextern PFNGLGETPROGRAMPIPELINEINFOLOGPROC gl3wGetProgramPipelineInfoLog;\nextern PFNGLVERTEXATTRIBL1DPROC gl3wVertexAttribL1d;\nextern PFNGLVERTEXATTRIBL2DPROC gl3wVertexAttribL2d;\nextern PFNGLVERTEXATTRIBL3DPROC gl3wVertexAttribL3d;\nextern PFNGLVERTEXATTRIBL4DPROC gl3wVertexAttribL4d;\nextern PFNGLVERTEXATTRIBL1DVPROC gl3wVertexAttribL1dv;\nextern PFNGLVERTEXATTRIBL2DVPROC gl3wVertexAttribL2dv;\nextern PFNGLVERTEXATTRIBL3DVPROC gl3wVertexAttribL3dv;\nextern PFNGLVERTEXATTRIBL4DVPROC gl3wVertexAttribL4dv;\nextern PFNGLVERTEXATTRIBLPOINTERPROC gl3wVertexAttribLPointer;\nextern PFNGLGETVERTEXATTRIBLDVPROC gl3wGetVertexAttribLdv;\nextern PFNGLVIEWPORTARRAYVPROC gl3wViewportArrayv;\nextern PFNGLVIEWPORTINDEXEDFPROC gl3wViewportIndexedf;\nextern PFNGLVIEWPORTINDEXEDFVPROC gl3wViewportIndexedfv;\nextern PFNGLSCISSORARRAYVPROC gl3wScissorArrayv;\nextern PFNGLSCISSORINDEXEDPROC gl3wScissorIndexed;\nextern PFNGLSCISSORINDEXEDVPROC gl3wScissorIndexedv;\nextern PFNGLDEPTHRANGEARRAYVPROC gl3wDepthRangeArrayv;\nextern PFNGLDEPTHRANGEINDEXEDPROC gl3wDepthRangeIndexed;\nextern PFNGLGETFLOATI_VPROC gl3wGetFloati_v;\nextern PFNGLGETDOUBLEI_VPROC gl3wGetDoublei_v;\nextern PFNGLCREATESYNCFROMCLEVENTARBPROC gl3wCreateSyncFromCLeventARB;\nextern PFNGLDEBUGMESSAGECONTROLARBPROC gl3wDebugMessageControlARB;\nextern PFNGLDEBUGMESSAGEINSERTARBPROC gl3wDebugMessageInsertARB;\nextern PFNGLDEBUGMESSAGECALLBACKARBPROC gl3wDebugMessageCallbackARB;\nextern PFNGLGETDEBUGMESSAGELOGARBPROC gl3wGetDebugMessageLogARB;\nextern PFNGLGETGRAPHICSRESETSTATUSARBPROC gl3wGetGraphicsResetStatusARB;\nextern PFNGLGETNTEXIMAGEARBPROC gl3wGetnTexImageARB;\nextern PFNGLREADNPIXELSARBPROC gl3wReadnPixelsARB;\nextern PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC gl3wGetnCompressedTexImageARB;\nextern PFNGLGETNUNIFORMFVARBPROC gl3wGetnUniformfvARB;\nextern PFNGLGETNUNIFORMIVARBPROC gl3wGetnUniformivARB;\nextern PFNGLGETNUNIFORMUIVARBPROC gl3wGetnUniformuivARB;\nextern PFNGLGETNUNIFORMDVARBPROC gl3wGetnUniformdvARB;\nextern PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC gl3wDrawArraysInstancedBaseInstance;\nextern PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC gl3wDrawElementsInstancedBaseInstance;\nextern PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC gl3wDrawElementsInstancedBaseVertexBaseInstance;\nextern PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC gl3wDrawTransformFeedbackInstanced;\nextern PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC gl3wDrawTransformFeedbackStreamInstanced;\nextern PFNGLGETINTERNALFORMATIVPROC gl3wGetInternalformativ;\nextern PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC gl3wGetActiveAtomicCounterBufferiv;\nextern PFNGLBINDIMAGETEXTUREPROC gl3wBindImageTexture;\nextern PFNGLMEMORYBARRIERPROC gl3wMemoryBarrier;\nextern PFNGLTEXSTORAGE1DPROC gl3wTexStorage1D;\nextern PFNGLTEXSTORAGE2DPROC gl3wTexStorage2D;\nextern PFNGLTEXSTORAGE3DPROC gl3wTexStorage3D;\nextern PFNGLTEXTURESTORAGE1DEXTPROC gl3wTextureStorage1DEXT;\nextern PFNGLTEXTURESTORAGE2DEXTPROC gl3wTextureStorage2DEXT;\nextern PFNGLTEXTURESTORAGE3DEXTPROC gl3wTextureStorage3DEXT;\nextern PFNGLDEBUGMESSAGECONTROLPROC gl3wDebugMessageControl;\nextern PFNGLDEBUGMESSAGEINSERTPROC gl3wDebugMessageInsert;\nextern PFNGLDEBUGMESSAGECALLBACKPROC gl3wDebugMessageCallback;\nextern PFNGLGETDEBUGMESSAGELOGPROC gl3wGetDebugMessageLog;\nextern PFNGLPUSHDEBUGGROUPPROC gl3wPushDebugGroup;\nextern PFNGLPOPDEBUGGROUPPROC gl3wPopDebugGroup;\nextern PFNGLOBJECTLABELPROC gl3wObjectLabel;\nextern PFNGLGETOBJECTLABELPROC gl3wGetObjectLabel;\nextern PFNGLOBJECTPTRLABELPROC gl3wObjectPtrLabel;\nextern PFNGLGETOBJECTPTRLABELPROC gl3wGetObjectPtrLabel;\nextern PFNGLCLEARBUFFERDATAPROC gl3wClearBufferData;\nextern PFNGLCLEARBUFFERSUBDATAPROC gl3wClearBufferSubData;\nextern PFNGLCLEARNAMEDBUFFERDATAEXTPROC gl3wClearNamedBufferDataEXT;\nextern PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC gl3wClearNamedBufferSubDataEXT;\nextern PFNGLDISPATCHCOMPUTEPROC gl3wDispatchCompute;\nextern PFNGLDISPATCHCOMPUTEINDIRECTPROC gl3wDispatchComputeIndirect;\nextern PFNGLCOPYIMAGESUBDATAPROC gl3wCopyImageSubData;\nextern PFNGLTEXTUREVIEWPROC gl3wTextureView;\nextern PFNGLBINDVERTEXBUFFERPROC gl3wBindVertexBuffer;\nextern PFNGLVERTEXATTRIBFORMATPROC gl3wVertexAttribFormat;\nextern PFNGLVERTEXATTRIBIFORMATPROC gl3wVertexAttribIFormat;\nextern PFNGLVERTEXATTRIBLFORMATPROC gl3wVertexAttribLFormat;\nextern PFNGLVERTEXATTRIBBINDINGPROC gl3wVertexAttribBinding;\nextern PFNGLVERTEXBINDINGDIVISORPROC gl3wVertexBindingDivisor;\nextern PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC gl3wVertexArrayBindVertexBufferEXT;\nextern PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC gl3wVertexArrayVertexAttribFormatEXT;\nextern PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC gl3wVertexArrayVertexAttribIFormatEXT;\nextern PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC gl3wVertexArrayVertexAttribLFormatEXT;\nextern PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC gl3wVertexArrayVertexAttribBindingEXT;\nextern PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC gl3wVertexArrayVertexBindingDivisorEXT;\nextern PFNGLFRAMEBUFFERPARAMETERIPROC gl3wFramebufferParameteri;\nextern PFNGLGETFRAMEBUFFERPARAMETERIVPROC gl3wGetFramebufferParameteriv;\nextern PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC gl3wNamedFramebufferParameteriEXT;\nextern PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC gl3wGetNamedFramebufferParameterivEXT;\nextern PFNGLGETINTERNALFORMATI64VPROC gl3wGetInternalformati64v;\nextern PFNGLINVALIDATETEXSUBIMAGEPROC gl3wInvalidateTexSubImage;\nextern PFNGLINVALIDATETEXIMAGEPROC gl3wInvalidateTexImage;\nextern PFNGLINVALIDATEBUFFERSUBDATAPROC gl3wInvalidateBufferSubData;\nextern PFNGLINVALIDATEBUFFERDATAPROC gl3wInvalidateBufferData;\nextern PFNGLINVALIDATEFRAMEBUFFERPROC gl3wInvalidateFramebuffer;\nextern PFNGLINVALIDATESUBFRAMEBUFFERPROC gl3wInvalidateSubFramebuffer;\nextern PFNGLMULTIDRAWARRAYSINDIRECTPROC gl3wMultiDrawArraysIndirect;\nextern PFNGLMULTIDRAWELEMENTSINDIRECTPROC gl3wMultiDrawElementsIndirect;\nextern PFNGLGETPROGRAMINTERFACEIVPROC gl3wGetProgramInterfaceiv;\nextern PFNGLGETPROGRAMRESOURCEINDEXPROC gl3wGetProgramResourceIndex;\nextern PFNGLGETPROGRAMRESOURCENAMEPROC gl3wGetProgramResourceName;\nextern PFNGLGETPROGRAMRESOURCEIVPROC gl3wGetProgramResourceiv;\nextern PFNGLGETPROGRAMRESOURCELOCATIONPROC gl3wGetProgramResourceLocation;\nextern PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC gl3wGetProgramResourceLocationIndex;\nextern PFNGLSHADERSTORAGEBLOCKBINDINGPROC gl3wShaderStorageBlockBinding;\nextern PFNGLTEXBUFFERRANGEPROC gl3wTexBufferRange;\nextern PFNGLTEXTUREBUFFERRANGEEXTPROC gl3wTextureBufferRangeEXT;\nextern PFNGLTEXSTORAGE2DMULTISAMPLEPROC gl3wTexStorage2DMultisample;\nextern PFNGLTEXSTORAGE3DMULTISAMPLEPROC gl3wTexStorage3DMultisample;\nextern PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC gl3wTextureStorage2DMultisampleEXT;\nextern PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC gl3wTextureStorage3DMultisampleEXT;\n\n#define glCullFace\t\tgl3wCullFace\n#define glFrontFace\t\tgl3wFrontFace\n#define glHint\t\tgl3wHint\n#define glLineWidth\t\tgl3wLineWidth\n#define glPointSize\t\tgl3wPointSize\n#define glPolygonMode\t\tgl3wPolygonMode\n#define glScissor\t\tgl3wScissor\n#define glTexParameterf\t\tgl3wTexParameterf\n#define glTexParameterfv\t\tgl3wTexParameterfv\n#define glTexParameteri\t\tgl3wTexParameteri\n#define glTexParameteriv\t\tgl3wTexParameteriv\n#define glTexImage1D\t\tgl3wTexImage1D\n#define glTexImage2D\t\tgl3wTexImage2D\n#define glDrawBuffer\t\tgl3wDrawBuffer\n#define glClear\t\tgl3wClear\n#define glClearColor\t\tgl3wClearColor\n#define glClearStencil\t\tgl3wClearStencil\n#define glClearDepth\t\tgl3wClearDepth\n#define glStencilMask\t\tgl3wStencilMask\n#define glColorMask\t\tgl3wColorMask\n#define glDepthMask\t\tgl3wDepthMask\n#define glDisable\t\tgl3wDisable\n#define glEnable\t\tgl3wEnable\n#define glFinish\t\tgl3wFinish\n#define glFlush\t\tgl3wFlush\n#define glBlendFunc\t\tgl3wBlendFunc\n#define glLogicOp\t\tgl3wLogicOp\n#define glStencilFunc\t\tgl3wStencilFunc\n#define glStencilOp\t\tgl3wStencilOp\n#define glDepthFunc\t\tgl3wDepthFunc\n#define glPixelStoref\t\tgl3wPixelStoref\n#define glPixelStorei\t\tgl3wPixelStorei\n#define glReadBuffer\t\tgl3wReadBuffer\n#define glReadPixels\t\tgl3wReadPixels\n#define glGetBooleanv\t\tgl3wGetBooleanv\n#define glGetDoublev\t\tgl3wGetDoublev\n#define glGetError\t\tgl3wGetError\n#define glGetFloatv\t\tgl3wGetFloatv\n#define glGetIntegerv\t\tgl3wGetIntegerv\n#define glGetString\t\tgl3wGetString\n#define glGetTexImage\t\tgl3wGetTexImage\n#define glGetTexParameterfv\t\tgl3wGetTexParameterfv\n#define glGetTexParameteriv\t\tgl3wGetTexParameteriv\n#define glGetTexLevelParameterfv\t\tgl3wGetTexLevelParameterfv\n#define glGetTexLevelParameteriv\t\tgl3wGetTexLevelParameteriv\n#define glIsEnabled\t\tgl3wIsEnabled\n#define glDepthRange\t\tgl3wDepthRange\n#define glViewport\t\tgl3wViewport\n#define glDrawArrays\t\tgl3wDrawArrays\n#define glDrawElements\t\tgl3wDrawElements\n#define glGetPointerv\t\tgl3wGetPointerv\n#define glPolygonOffset\t\tgl3wPolygonOffset\n#define glCopyTexImage1D\t\tgl3wCopyTexImage1D\n#define glCopyTexImage2D\t\tgl3wCopyTexImage2D\n#define glCopyTexSubImage1D\t\tgl3wCopyTexSubImage1D\n#define glCopyTexSubImage2D\t\tgl3wCopyTexSubImage2D\n#define glTexSubImage1D\t\tgl3wTexSubImage1D\n#define glTexSubImage2D\t\tgl3wTexSubImage2D\n#define glBindTexture\t\tgl3wBindTexture\n#define glDeleteTextures\t\tgl3wDeleteTextures\n#define glGenTextures\t\tgl3wGenTextures\n#define glIsTexture\t\tgl3wIsTexture\n#define glBlendColor\t\tgl3wBlendColor\n#define glBlendEquation\t\tgl3wBlendEquation\n#define glDrawRangeElements\t\tgl3wDrawRangeElements\n#define glTexImage3D\t\tgl3wTexImage3D\n#define glTexSubImage3D\t\tgl3wTexSubImage3D\n#define glCopyTexSubImage3D\t\tgl3wCopyTexSubImage3D\n#define glActiveTexture\t\tgl3wActiveTexture\n#define glSampleCoverage\t\tgl3wSampleCoverage\n#define glCompressedTexImage3D\t\tgl3wCompressedTexImage3D\n#define glCompressedTexImage2D\t\tgl3wCompressedTexImage2D\n#define glCompressedTexImage1D\t\tgl3wCompressedTexImage1D\n#define glCompressedTexSubImage3D\t\tgl3wCompressedTexSubImage3D\n#define glCompressedTexSubImage2D\t\tgl3wCompressedTexSubImage2D\n#define glCompressedTexSubImage1D\t\tgl3wCompressedTexSubImage1D\n#define glGetCompressedTexImage\t\tgl3wGetCompressedTexImage\n#define glBlendFuncSeparate\t\tgl3wBlendFuncSeparate\n#define glMultiDrawArrays\t\tgl3wMultiDrawArrays\n#define glMultiDrawElements\t\tgl3wMultiDrawElements\n#define glPointParameterf\t\tgl3wPointParameterf\n#define glPointParameterfv\t\tgl3wPointParameterfv\n#define glPointParameteri\t\tgl3wPointParameteri\n#define glPointParameteriv\t\tgl3wPointParameteriv\n#define glGenQueries\t\tgl3wGenQueries\n#define glDeleteQueries\t\tgl3wDeleteQueries\n#define glIsQuery\t\tgl3wIsQuery\n#define glBeginQuery\t\tgl3wBeginQuery\n#define glEndQuery\t\tgl3wEndQuery\n#define glGetQueryiv\t\tgl3wGetQueryiv\n#define glGetQueryObjectiv\t\tgl3wGetQueryObjectiv\n#define glGetQueryObjectuiv\t\tgl3wGetQueryObjectuiv\n#define glBindBuffer\t\tgl3wBindBuffer\n#define glDeleteBuffers\t\tgl3wDeleteBuffers\n#define glGenBuffers\t\tgl3wGenBuffers\n#define glIsBuffer\t\tgl3wIsBuffer\n#define glBufferData\t\tgl3wBufferData\n#define glBufferSubData\t\tgl3wBufferSubData\n#define glGetBufferSubData\t\tgl3wGetBufferSubData\n#define glMapBuffer\t\tgl3wMapBuffer\n#define glUnmapBuffer\t\tgl3wUnmapBuffer\n#define glGetBufferParameteriv\t\tgl3wGetBufferParameteriv\n#define glGetBufferPointerv\t\tgl3wGetBufferPointerv\n#define glBlendEquationSeparate\t\tgl3wBlendEquationSeparate\n#define glDrawBuffers\t\tgl3wDrawBuffers\n#define glStencilOpSeparate\t\tgl3wStencilOpSeparate\n#define glStencilFuncSeparate\t\tgl3wStencilFuncSeparate\n#define glStencilMaskSeparate\t\tgl3wStencilMaskSeparate\n#define glAttachShader\t\tgl3wAttachShader\n#define glBindAttribLocation\t\tgl3wBindAttribLocation\n#define glCompileShader\t\tgl3wCompileShader\n#define glCreateProgram\t\tgl3wCreateProgram\n#define glCreateShader\t\tgl3wCreateShader\n#define glDeleteProgram\t\tgl3wDeleteProgram\n#define glDeleteShader\t\tgl3wDeleteShader\n#define glDetachShader\t\tgl3wDetachShader\n#define glDisableVertexAttribArray\t\tgl3wDisableVertexAttribArray\n#define glEnableVertexAttribArray\t\tgl3wEnableVertexAttribArray\n#define glGetActiveAttrib\t\tgl3wGetActiveAttrib\n#define glGetActiveUniform\t\tgl3wGetActiveUniform\n#define glGetAttachedShaders\t\tgl3wGetAttachedShaders\n#define glGetAttribLocation\t\tgl3wGetAttribLocation\n#define glGetProgramiv\t\tgl3wGetProgramiv\n#define glGetProgramInfoLog\t\tgl3wGetProgramInfoLog\n#define glGetShaderiv\t\tgl3wGetShaderiv\n#define glGetShaderInfoLog\t\tgl3wGetShaderInfoLog\n#define glGetShaderSource\t\tgl3wGetShaderSource\n#define glGetUniformLocation\t\tgl3wGetUniformLocation\n#define glGetUniformfv\t\tgl3wGetUniformfv\n#define glGetUniformiv\t\tgl3wGetUniformiv\n#define glGetVertexAttribdv\t\tgl3wGetVertexAttribdv\n#define glGetVertexAttribfv\t\tgl3wGetVertexAttribfv\n#define glGetVertexAttribiv\t\tgl3wGetVertexAttribiv\n#define glGetVertexAttribPointerv\t\tgl3wGetVertexAttribPointerv\n#define glIsProgram\t\tgl3wIsProgram\n#define glIsShader\t\tgl3wIsShader\n#define glLinkProgram\t\tgl3wLinkProgram\n#define glShaderSource\t\tgl3wShaderSource\n#define glUseProgram\t\tgl3wUseProgram\n#define glUniform1f\t\tgl3wUniform1f\n#define glUniform2f\t\tgl3wUniform2f\n#define glUniform3f\t\tgl3wUniform3f\n#define glUniform4f\t\tgl3wUniform4f\n#define glUniform1i\t\tgl3wUniform1i\n#define glUniform2i\t\tgl3wUniform2i\n#define glUniform3i\t\tgl3wUniform3i\n#define glUniform4i\t\tgl3wUniform4i\n#define glUniform1fv\t\tgl3wUniform1fv\n#define glUniform2fv\t\tgl3wUniform2fv\n#define glUniform3fv\t\tgl3wUniform3fv\n#define glUniform4fv\t\tgl3wUniform4fv\n#define glUniform1iv\t\tgl3wUniform1iv\n#define glUniform2iv\t\tgl3wUniform2iv\n#define glUniform3iv\t\tgl3wUniform3iv\n#define glUniform4iv\t\tgl3wUniform4iv\n#define glUniformMatrix2fv\t\tgl3wUniformMatrix2fv\n#define glUniformMatrix3fv\t\tgl3wUniformMatrix3fv\n#define glUniformMatrix4fv\t\tgl3wUniformMatrix4fv\n#define glValidateProgram\t\tgl3wValidateProgram\n#define glVertexAttrib1d\t\tgl3wVertexAttrib1d\n#define glVertexAttrib1dv\t\tgl3wVertexAttrib1dv\n#define glVertexAttrib1f\t\tgl3wVertexAttrib1f\n#define glVertexAttrib1fv\t\tgl3wVertexAttrib1fv\n#define glVertexAttrib1s\t\tgl3wVertexAttrib1s\n#define glVertexAttrib1sv\t\tgl3wVertexAttrib1sv\n#define glVertexAttrib2d\t\tgl3wVertexAttrib2d\n#define glVertexAttrib2dv\t\tgl3wVertexAttrib2dv\n#define glVertexAttrib2f\t\tgl3wVertexAttrib2f\n#define glVertexAttrib2fv\t\tgl3wVertexAttrib2fv\n#define glVertexAttrib2s\t\tgl3wVertexAttrib2s\n#define glVertexAttrib2sv\t\tgl3wVertexAttrib2sv\n#define glVertexAttrib3d\t\tgl3wVertexAttrib3d\n#define glVertexAttrib3dv\t\tgl3wVertexAttrib3dv\n#define glVertexAttrib3f\t\tgl3wVertexAttrib3f\n#define glVertexAttrib3fv\t\tgl3wVertexAttrib3fv\n#define glVertexAttrib3s\t\tgl3wVertexAttrib3s\n#define glVertexAttrib3sv\t\tgl3wVertexAttrib3sv\n#define glVertexAttrib4Nbv\t\tgl3wVertexAttrib4Nbv\n#define glVertexAttrib4Niv\t\tgl3wVertexAttrib4Niv\n#define glVertexAttrib4Nsv\t\tgl3wVertexAttrib4Nsv\n#define glVertexAttrib4Nub\t\tgl3wVertexAttrib4Nub\n#define glVertexAttrib4Nubv\t\tgl3wVertexAttrib4Nubv\n#define glVertexAttrib4Nuiv\t\tgl3wVertexAttrib4Nuiv\n#define glVertexAttrib4Nusv\t\tgl3wVertexAttrib4Nusv\n#define glVertexAttrib4bv\t\tgl3wVertexAttrib4bv\n#define glVertexAttrib4d\t\tgl3wVertexAttrib4d\n#define glVertexAttrib4dv\t\tgl3wVertexAttrib4dv\n#define glVertexAttrib4f\t\tgl3wVertexAttrib4f\n#define glVertexAttrib4fv\t\tgl3wVertexAttrib4fv\n#define glVertexAttrib4iv\t\tgl3wVertexAttrib4iv\n#define glVertexAttrib4s\t\tgl3wVertexAttrib4s\n#define glVertexAttrib4sv\t\tgl3wVertexAttrib4sv\n#define glVertexAttrib4ubv\t\tgl3wVertexAttrib4ubv\n#define glVertexAttrib4uiv\t\tgl3wVertexAttrib4uiv\n#define glVertexAttrib4usv\t\tgl3wVertexAttrib4usv\n#define glVertexAttribPointer\t\tgl3wVertexAttribPointer\n#define glUniformMatrix2x3fv\t\tgl3wUniformMatrix2x3fv\n#define glUniformMatrix3x2fv\t\tgl3wUniformMatrix3x2fv\n#define glUniformMatrix2x4fv\t\tgl3wUniformMatrix2x4fv\n#define glUniformMatrix4x2fv\t\tgl3wUniformMatrix4x2fv\n#define glUniformMatrix3x4fv\t\tgl3wUniformMatrix3x4fv\n#define glUniformMatrix4x3fv\t\tgl3wUniformMatrix4x3fv\n#define glColorMaski\t\tgl3wColorMaski\n#define glGetBooleani_v\t\tgl3wGetBooleani_v\n#define glGetIntegeri_v\t\tgl3wGetIntegeri_v\n#define glEnablei\t\tgl3wEnablei\n#define glDisablei\t\tgl3wDisablei\n#define glIsEnabledi\t\tgl3wIsEnabledi\n#define glBeginTransformFeedback\t\tgl3wBeginTransformFeedback\n#define glEndTransformFeedback\t\tgl3wEndTransformFeedback\n#define glBindBufferRange\t\tgl3wBindBufferRange\n#define glBindBufferBase\t\tgl3wBindBufferBase\n#define glTransformFeedbackVaryings\t\tgl3wTransformFeedbackVaryings\n#define glGetTransformFeedbackVarying\t\tgl3wGetTransformFeedbackVarying\n#define glClampColor\t\tgl3wClampColor\n#define glBeginConditionalRender\t\tgl3wBeginConditionalRender\n#define glEndConditionalRender\t\tgl3wEndConditionalRender\n#define glVertexAttribIPointer\t\tgl3wVertexAttribIPointer\n#define glGetVertexAttribIiv\t\tgl3wGetVertexAttribIiv\n#define glGetVertexAttribIuiv\t\tgl3wGetVertexAttribIuiv\n#define glVertexAttribI1i\t\tgl3wVertexAttribI1i\n#define glVertexAttribI2i\t\tgl3wVertexAttribI2i\n#define glVertexAttribI3i\t\tgl3wVertexAttribI3i\n#define glVertexAttribI4i\t\tgl3wVertexAttribI4i\n#define glVertexAttribI1ui\t\tgl3wVertexAttribI1ui\n#define glVertexAttribI2ui\t\tgl3wVertexAttribI2ui\n#define glVertexAttribI3ui\t\tgl3wVertexAttribI3ui\n#define glVertexAttribI4ui\t\tgl3wVertexAttribI4ui\n#define glVertexAttribI1iv\t\tgl3wVertexAttribI1iv\n#define glVertexAttribI2iv\t\tgl3wVertexAttribI2iv\n#define glVertexAttribI3iv\t\tgl3wVertexAttribI3iv\n#define glVertexAttribI4iv\t\tgl3wVertexAttribI4iv\n#define glVertexAttribI1uiv\t\tgl3wVertexAttribI1uiv\n#define glVertexAttribI2uiv\t\tgl3wVertexAttribI2uiv\n#define glVertexAttribI3uiv\t\tgl3wVertexAttribI3uiv\n#define glVertexAttribI4uiv\t\tgl3wVertexAttribI4uiv\n#define glVertexAttribI4bv\t\tgl3wVertexAttribI4bv\n#define glVertexAttribI4sv\t\tgl3wVertexAttribI4sv\n#define glVertexAttribI4ubv\t\tgl3wVertexAttribI4ubv\n#define glVertexAttribI4usv\t\tgl3wVertexAttribI4usv\n#define glGetUniformuiv\t\tgl3wGetUniformuiv\n#define glBindFragDataLocation\t\tgl3wBindFragDataLocation\n#define glGetFragDataLocation\t\tgl3wGetFragDataLocation\n#define glUniform1ui\t\tgl3wUniform1ui\n#define glUniform2ui\t\tgl3wUniform2ui\n#define glUniform3ui\t\tgl3wUniform3ui\n#define glUniform4ui\t\tgl3wUniform4ui\n#define glUniform1uiv\t\tgl3wUniform1uiv\n#define glUniform2uiv\t\tgl3wUniform2uiv\n#define glUniform3uiv\t\tgl3wUniform3uiv\n#define glUniform4uiv\t\tgl3wUniform4uiv\n#define glTexParameterIiv\t\tgl3wTexParameterIiv\n#define glTexParameterIuiv\t\tgl3wTexParameterIuiv\n#define glGetTexParameterIiv\t\tgl3wGetTexParameterIiv\n#define glGetTexParameterIuiv\t\tgl3wGetTexParameterIuiv\n#define glClearBufferiv\t\tgl3wClearBufferiv\n#define glClearBufferuiv\t\tgl3wClearBufferuiv\n#define glClearBufferfv\t\tgl3wClearBufferfv\n#define glClearBufferfi\t\tgl3wClearBufferfi\n#define glGetStringi\t\tgl3wGetStringi\n#define glDrawArraysInstanced\t\tgl3wDrawArraysInstanced\n#define glDrawElementsInstanced\t\tgl3wDrawElementsInstanced\n#define glTexBuffer\t\tgl3wTexBuffer\n#define glPrimitiveRestartIndex\t\tgl3wPrimitiveRestartIndex\n#define glGetInteger64i_v\t\tgl3wGetInteger64i_v\n#define glGetBufferParameteri64v\t\tgl3wGetBufferParameteri64v\n#define glFramebufferTexture\t\tgl3wFramebufferTexture\n#define glVertexAttribDivisor\t\tgl3wVertexAttribDivisor\n#define glMinSampleShading\t\tgl3wMinSampleShading\n#define glBlendEquationi\t\tgl3wBlendEquationi\n#define glBlendEquationSeparatei\t\tgl3wBlendEquationSeparatei\n#define glBlendFunci\t\tgl3wBlendFunci\n#define glBlendFuncSeparatei\t\tgl3wBlendFuncSeparatei\n#define glIsRenderbuffer\t\tgl3wIsRenderbuffer\n#define glBindRenderbuffer\t\tgl3wBindRenderbuffer\n#define glDeleteRenderbuffers\t\tgl3wDeleteRenderbuffers\n#define glGenRenderbuffers\t\tgl3wGenRenderbuffers\n#define glRenderbufferStorage\t\tgl3wRenderbufferStorage\n#define glGetRenderbufferParameteriv\t\tgl3wGetRenderbufferParameteriv\n#define glIsFramebuffer\t\tgl3wIsFramebuffer\n#define glBindFramebuffer\t\tgl3wBindFramebuffer\n#define glDeleteFramebuffers\t\tgl3wDeleteFramebuffers\n#define glGenFramebuffers\t\tgl3wGenFramebuffers\n#define glCheckFramebufferStatus\t\tgl3wCheckFramebufferStatus\n#define glFramebufferTexture1D\t\tgl3wFramebufferTexture1D\n#define glFramebufferTexture2D\t\tgl3wFramebufferTexture2D\n#define glFramebufferTexture3D\t\tgl3wFramebufferTexture3D\n#define glFramebufferRenderbuffer\t\tgl3wFramebufferRenderbuffer\n#define glGetFramebufferAttachmentParameteriv\t\tgl3wGetFramebufferAttachmentParameteriv\n#define glGenerateMipmap\t\tgl3wGenerateMipmap\n#define glBlitFramebuffer\t\tgl3wBlitFramebuffer\n#define glRenderbufferStorageMultisample\t\tgl3wRenderbufferStorageMultisample\n#define glFramebufferTextureLayer\t\tgl3wFramebufferTextureLayer\n#define glMapBufferRange\t\tgl3wMapBufferRange\n#define glFlushMappedBufferRange\t\tgl3wFlushMappedBufferRange\n#define glBindVertexArray\t\tgl3wBindVertexArray\n#define glDeleteVertexArrays\t\tgl3wDeleteVertexArrays\n#define glGenVertexArrays\t\tgl3wGenVertexArrays\n#define glIsVertexArray\t\tgl3wIsVertexArray\n#define glGetUniformIndices\t\tgl3wGetUniformIndices\n#define glGetActiveUniformsiv\t\tgl3wGetActiveUniformsiv\n#define glGetActiveUniformName\t\tgl3wGetActiveUniformName\n#define glGetUniformBlockIndex\t\tgl3wGetUniformBlockIndex\n#define glGetActiveUniformBlockiv\t\tgl3wGetActiveUniformBlockiv\n#define glGetActiveUniformBlockName\t\tgl3wGetActiveUniformBlockName\n#define glUniformBlockBinding\t\tgl3wUniformBlockBinding\n#define glCopyBufferSubData\t\tgl3wCopyBufferSubData\n#define glDrawElementsBaseVertex\t\tgl3wDrawElementsBaseVertex\n#define glDrawRangeElementsBaseVertex\t\tgl3wDrawRangeElementsBaseVertex\n#define glDrawElementsInstancedBaseVertex\t\tgl3wDrawElementsInstancedBaseVertex\n#define glMultiDrawElementsBaseVertex\t\tgl3wMultiDrawElementsBaseVertex\n#define glProvokingVertex\t\tgl3wProvokingVertex\n#define glFenceSync\t\tgl3wFenceSync\n#define glIsSync\t\tgl3wIsSync\n#define glDeleteSync\t\tgl3wDeleteSync\n#define glClientWaitSync\t\tgl3wClientWaitSync\n#define glWaitSync\t\tgl3wWaitSync\n#define glGetInteger64v\t\tgl3wGetInteger64v\n#define glGetSynciv\t\tgl3wGetSynciv\n#define glTexImage2DMultisample\t\tgl3wTexImage2DMultisample\n#define glTexImage3DMultisample\t\tgl3wTexImage3DMultisample\n#define glGetMultisamplefv\t\tgl3wGetMultisamplefv\n#define glSampleMaski\t\tgl3wSampleMaski\n#define glBlendEquationiARB\t\tgl3wBlendEquationiARB\n#define glBlendEquationSeparateiARB\t\tgl3wBlendEquationSeparateiARB\n#define glBlendFunciARB\t\tgl3wBlendFunciARB\n#define glBlendFuncSeparateiARB\t\tgl3wBlendFuncSeparateiARB\n#define glMinSampleShadingARB\t\tgl3wMinSampleShadingARB\n#define glNamedStringARB\t\tgl3wNamedStringARB\n#define glDeleteNamedStringARB\t\tgl3wDeleteNamedStringARB\n#define glCompileShaderIncludeARB\t\tgl3wCompileShaderIncludeARB\n#define glIsNamedStringARB\t\tgl3wIsNamedStringARB\n#define glGetNamedStringARB\t\tgl3wGetNamedStringARB\n#define glGetNamedStringivARB\t\tgl3wGetNamedStringivARB\n#define glBindFragDataLocationIndexed\t\tgl3wBindFragDataLocationIndexed\n#define glGetFragDataIndex\t\tgl3wGetFragDataIndex\n#define glGenSamplers\t\tgl3wGenSamplers\n#define glDeleteSamplers\t\tgl3wDeleteSamplers\n#define glIsSampler\t\tgl3wIsSampler\n#define glBindSampler\t\tgl3wBindSampler\n#define glSamplerParameteri\t\tgl3wSamplerParameteri\n#define glSamplerParameteriv\t\tgl3wSamplerParameteriv\n#define glSamplerParameterf\t\tgl3wSamplerParameterf\n#define glSamplerParameterfv\t\tgl3wSamplerParameterfv\n#define glSamplerParameterIiv\t\tgl3wSamplerParameterIiv\n#define glSamplerParameterIuiv\t\tgl3wSamplerParameterIuiv\n#define glGetSamplerParameteriv\t\tgl3wGetSamplerParameteriv\n#define glGetSamplerParameterIiv\t\tgl3wGetSamplerParameterIiv\n#define glGetSamplerParameterfv\t\tgl3wGetSamplerParameterfv\n#define glGetSamplerParameterIuiv\t\tgl3wGetSamplerParameterIuiv\n#define glQueryCounter\t\tgl3wQueryCounter\n#define glGetQueryObjecti64v\t\tgl3wGetQueryObjecti64v\n#define glGetQueryObjectui64v\t\tgl3wGetQueryObjectui64v\n#define glVertexP2ui\t\tgl3wVertexP2ui\n#define glVertexP2uiv\t\tgl3wVertexP2uiv\n#define glVertexP3ui\t\tgl3wVertexP3ui\n#define glVertexP3uiv\t\tgl3wVertexP3uiv\n#define glVertexP4ui\t\tgl3wVertexP4ui\n#define glVertexP4uiv\t\tgl3wVertexP4uiv\n#define glTexCoordP1ui\t\tgl3wTexCoordP1ui\n#define glTexCoordP1uiv\t\tgl3wTexCoordP1uiv\n#define glTexCoordP2ui\t\tgl3wTexCoordP2ui\n#define glTexCoordP2uiv\t\tgl3wTexCoordP2uiv\n#define glTexCoordP3ui\t\tgl3wTexCoordP3ui\n#define glTexCoordP3uiv\t\tgl3wTexCoordP3uiv\n#define glTexCoordP4ui\t\tgl3wTexCoordP4ui\n#define glTexCoordP4uiv\t\tgl3wTexCoordP4uiv\n#define glMultiTexCoordP1ui\t\tgl3wMultiTexCoordP1ui\n#define glMultiTexCoordP1uiv\t\tgl3wMultiTexCoordP1uiv\n#define glMultiTexCoordP2ui\t\tgl3wMultiTexCoordP2ui\n#define glMultiTexCoordP2uiv\t\tgl3wMultiTexCoordP2uiv\n#define glMultiTexCoordP3ui\t\tgl3wMultiTexCoordP3ui\n#define glMultiTexCoordP3uiv\t\tgl3wMultiTexCoordP3uiv\n#define glMultiTexCoordP4ui\t\tgl3wMultiTexCoordP4ui\n#define glMultiTexCoordP4uiv\t\tgl3wMultiTexCoordP4uiv\n#define glNormalP3ui\t\tgl3wNormalP3ui\n#define glNormalP3uiv\t\tgl3wNormalP3uiv\n#define glColorP3ui\t\tgl3wColorP3ui\n#define glColorP3uiv\t\tgl3wColorP3uiv\n#define glColorP4ui\t\tgl3wColorP4ui\n#define glColorP4uiv\t\tgl3wColorP4uiv\n#define glSecondaryColorP3ui\t\tgl3wSecondaryColorP3ui\n#define glSecondaryColorP3uiv\t\tgl3wSecondaryColorP3uiv\n#define glVertexAttribP1ui\t\tgl3wVertexAttribP1ui\n#define glVertexAttribP1uiv\t\tgl3wVertexAttribP1uiv\n#define glVertexAttribP2ui\t\tgl3wVertexAttribP2ui\n#define glVertexAttribP2uiv\t\tgl3wVertexAttribP2uiv\n#define glVertexAttribP3ui\t\tgl3wVertexAttribP3ui\n#define glVertexAttribP3uiv\t\tgl3wVertexAttribP3uiv\n#define glVertexAttribP4ui\t\tgl3wVertexAttribP4ui\n#define glVertexAttribP4uiv\t\tgl3wVertexAttribP4uiv\n#define glDrawArraysIndirect\t\tgl3wDrawArraysIndirect\n#define glDrawElementsIndirect\t\tgl3wDrawElementsIndirect\n#define glUniform1d\t\tgl3wUniform1d\n#define glUniform2d\t\tgl3wUniform2d\n#define glUniform3d\t\tgl3wUniform3d\n#define glUniform4d\t\tgl3wUniform4d\n#define glUniform1dv\t\tgl3wUniform1dv\n#define glUniform2dv\t\tgl3wUniform2dv\n#define glUniform3dv\t\tgl3wUniform3dv\n#define glUniform4dv\t\tgl3wUniform4dv\n#define glUniformMatrix2dv\t\tgl3wUniformMatrix2dv\n#define glUniformMatrix3dv\t\tgl3wUniformMatrix3dv\n#define glUniformMatrix4dv\t\tgl3wUniformMatrix4dv\n#define glUniformMatrix2x3dv\t\tgl3wUniformMatrix2x3dv\n#define glUniformMatrix2x4dv\t\tgl3wUniformMatrix2x4dv\n#define glUniformMatrix3x2dv\t\tgl3wUniformMatrix3x2dv\n#define glUniformMatrix3x4dv\t\tgl3wUniformMatrix3x4dv\n#define glUniformMatrix4x2dv\t\tgl3wUniformMatrix4x2dv\n#define glUniformMatrix4x3dv\t\tgl3wUniformMatrix4x3dv\n#define glGetUniformdv\t\tgl3wGetUniformdv\n#define glGetSubroutineUniformLocation\t\tgl3wGetSubroutineUniformLocation\n#define glGetSubroutineIndex\t\tgl3wGetSubroutineIndex\n#define glGetActiveSubroutineUniformiv\t\tgl3wGetActiveSubroutineUniformiv\n#define glGetActiveSubroutineUniformName\t\tgl3wGetActiveSubroutineUniformName\n#define glGetActiveSubroutineName\t\tgl3wGetActiveSubroutineName\n#define glUniformSubroutinesuiv\t\tgl3wUniformSubroutinesuiv\n#define glGetUniformSubroutineuiv\t\tgl3wGetUniformSubroutineuiv\n#define glGetProgramStageiv\t\tgl3wGetProgramStageiv\n#define glPatchParameteri\t\tgl3wPatchParameteri\n#define glPatchParameterfv\t\tgl3wPatchParameterfv\n#define glBindTransformFeedback\t\tgl3wBindTransformFeedback\n#define glDeleteTransformFeedbacks\t\tgl3wDeleteTransformFeedbacks\n#define glGenTransformFeedbacks\t\tgl3wGenTransformFeedbacks\n#define glIsTransformFeedback\t\tgl3wIsTransformFeedback\n#define glPauseTransformFeedback\t\tgl3wPauseTransformFeedback\n#define glResumeTransformFeedback\t\tgl3wResumeTransformFeedback\n#define glDrawTransformFeedback\t\tgl3wDrawTransformFeedback\n#define glDrawTransformFeedbackStream\t\tgl3wDrawTransformFeedbackStream\n#define glBeginQueryIndexed\t\tgl3wBeginQueryIndexed\n#define glEndQueryIndexed\t\tgl3wEndQueryIndexed\n#define glGetQueryIndexediv\t\tgl3wGetQueryIndexediv\n#define glReleaseShaderCompiler\t\tgl3wReleaseShaderCompiler\n#define glShaderBinary\t\tgl3wShaderBinary\n#define glGetShaderPrecisionFormat\t\tgl3wGetShaderPrecisionFormat\n#define glDepthRangef\t\tgl3wDepthRangef\n#define glClearDepthf\t\tgl3wClearDepthf\n#define glGetProgramBinary\t\tgl3wGetProgramBinary\n#define glProgramBinary\t\tgl3wProgramBinary\n#define glProgramParameteri\t\tgl3wProgramParameteri\n#define glUseProgramStages\t\tgl3wUseProgramStages\n#define glActiveShaderProgram\t\tgl3wActiveShaderProgram\n#define glCreateShaderProgramv\t\tgl3wCreateShaderProgramv\n#define glBindProgramPipeline\t\tgl3wBindProgramPipeline\n#define glDeleteProgramPipelines\t\tgl3wDeleteProgramPipelines\n#define glGenProgramPipelines\t\tgl3wGenProgramPipelines\n#define glIsProgramPipeline\t\tgl3wIsProgramPipeline\n#define glGetProgramPipelineiv\t\tgl3wGetProgramPipelineiv\n#define glProgramUniform1i\t\tgl3wProgramUniform1i\n#define glProgramUniform1iv\t\tgl3wProgramUniform1iv\n#define glProgramUniform1f\t\tgl3wProgramUniform1f\n#define glProgramUniform1fv\t\tgl3wProgramUniform1fv\n#define glProgramUniform1d\t\tgl3wProgramUniform1d\n#define glProgramUniform1dv\t\tgl3wProgramUniform1dv\n#define glProgramUniform1ui\t\tgl3wProgramUniform1ui\n#define glProgramUniform1uiv\t\tgl3wProgramUniform1uiv\n#define glProgramUniform2i\t\tgl3wProgramUniform2i\n#define glProgramUniform2iv\t\tgl3wProgramUniform2iv\n#define glProgramUniform2f\t\tgl3wProgramUniform2f\n#define glProgramUniform2fv\t\tgl3wProgramUniform2fv\n#define glProgramUniform2d\t\tgl3wProgramUniform2d\n#define glProgramUniform2dv\t\tgl3wProgramUniform2dv\n#define glProgramUniform2ui\t\tgl3wProgramUniform2ui\n#define glProgramUniform2uiv\t\tgl3wProgramUniform2uiv\n#define glProgramUniform3i\t\tgl3wProgramUniform3i\n#define glProgramUniform3iv\t\tgl3wProgramUniform3iv\n#define glProgramUniform3f\t\tgl3wProgramUniform3f\n#define glProgramUniform3fv\t\tgl3wProgramUniform3fv\n#define glProgramUniform3d\t\tgl3wProgramUniform3d\n#define glProgramUniform3dv\t\tgl3wProgramUniform3dv\n#define glProgramUniform3ui\t\tgl3wProgramUniform3ui\n#define glProgramUniform3uiv\t\tgl3wProgramUniform3uiv\n#define glProgramUniform4i\t\tgl3wProgramUniform4i\n#define glProgramUniform4iv\t\tgl3wProgramUniform4iv\n#define glProgramUniform4f\t\tgl3wProgramUniform4f\n#define glProgramUniform4fv\t\tgl3wProgramUniform4fv\n#define glProgramUniform4d\t\tgl3wProgramUniform4d\n#define glProgramUniform4dv\t\tgl3wProgramUniform4dv\n#define glProgramUniform4ui\t\tgl3wProgramUniform4ui\n#define glProgramUniform4uiv\t\tgl3wProgramUniform4uiv\n#define glProgramUniformMatrix2fv\t\tgl3wProgramUniformMatrix2fv\n#define glProgramUniformMatrix3fv\t\tgl3wProgramUniformMatrix3fv\n#define glProgramUniformMatrix4fv\t\tgl3wProgramUniformMatrix4fv\n#define glProgramUniformMatrix2dv\t\tgl3wProgramUniformMatrix2dv\n#define glProgramUniformMatrix3dv\t\tgl3wProgramUniformMatrix3dv\n#define glProgramUniformMatrix4dv\t\tgl3wProgramUniformMatrix4dv\n#define glProgramUniformMatrix2x3fv\t\tgl3wProgramUniformMatrix2x3fv\n#define glProgramUniformMatrix3x2fv\t\tgl3wProgramUniformMatrix3x2fv\n#define glProgramUniformMatrix2x4fv\t\tgl3wProgramUniformMatrix2x4fv\n#define glProgramUniformMatrix4x2fv\t\tgl3wProgramUniformMatrix4x2fv\n#define glProgramUniformMatrix3x4fv\t\tgl3wProgramUniformMatrix3x4fv\n#define glProgramUniformMatrix4x3fv\t\tgl3wProgramUniformMatrix4x3fv\n#define glProgramUniformMatrix2x3dv\t\tgl3wProgramUniformMatrix2x3dv\n#define glProgramUniformMatrix3x2dv\t\tgl3wProgramUniformMatrix3x2dv\n#define glProgramUniformMatrix2x4dv\t\tgl3wProgramUniformMatrix2x4dv\n#define glProgramUniformMatrix4x2dv\t\tgl3wProgramUniformMatrix4x2dv\n#define glProgramUniformMatrix3x4dv\t\tgl3wProgramUniformMatrix3x4dv\n#define glProgramUniformMatrix4x3dv\t\tgl3wProgramUniformMatrix4x3dv\n#define glValidateProgramPipeline\t\tgl3wValidateProgramPipeline\n#define glGetProgramPipelineInfoLog\t\tgl3wGetProgramPipelineInfoLog\n#define glVertexAttribL1d\t\tgl3wVertexAttribL1d\n#define glVertexAttribL2d\t\tgl3wVertexAttribL2d\n#define glVertexAttribL3d\t\tgl3wVertexAttribL3d\n#define glVertexAttribL4d\t\tgl3wVertexAttribL4d\n#define glVertexAttribL1dv\t\tgl3wVertexAttribL1dv\n#define glVertexAttribL2dv\t\tgl3wVertexAttribL2dv\n#define glVertexAttribL3dv\t\tgl3wVertexAttribL3dv\n#define glVertexAttribL4dv\t\tgl3wVertexAttribL4dv\n#define glVertexAttribLPointer\t\tgl3wVertexAttribLPointer\n#define glGetVertexAttribLdv\t\tgl3wGetVertexAttribLdv\n#define glViewportArrayv\t\tgl3wViewportArrayv\n#define glViewportIndexedf\t\tgl3wViewportIndexedf\n#define glViewportIndexedfv\t\tgl3wViewportIndexedfv\n#define glScissorArrayv\t\tgl3wScissorArrayv\n#define glScissorIndexed\t\tgl3wScissorIndexed\n#define glScissorIndexedv\t\tgl3wScissorIndexedv\n#define glDepthRangeArrayv\t\tgl3wDepthRangeArrayv\n#define glDepthRangeIndexed\t\tgl3wDepthRangeIndexed\n#define glGetFloati_v\t\tgl3wGetFloati_v\n#define glGetDoublei_v\t\tgl3wGetDoublei_v\n#define glCreateSyncFromCLeventARB\t\tgl3wCreateSyncFromCLeventARB\n#define glDebugMessageControlARB\t\tgl3wDebugMessageControlARB\n#define glDebugMessageInsertARB\t\tgl3wDebugMessageInsertARB\n#define glDebugMessageCallbackARB\t\tgl3wDebugMessageCallbackARB\n#define glGetDebugMessageLogARB\t\tgl3wGetDebugMessageLogARB\n#define glGetGraphicsResetStatusARB\t\tgl3wGetGraphicsResetStatusARB\n#define glGetnTexImageARB\t\tgl3wGetnTexImageARB\n#define glReadnPixelsARB\t\tgl3wReadnPixelsARB\n#define glGetnCompressedTexImageARB\t\tgl3wGetnCompressedTexImageARB\n#define glGetnUniformfvARB\t\tgl3wGetnUniformfvARB\n#define glGetnUniformivARB\t\tgl3wGetnUniformivARB\n#define glGetnUniformuivARB\t\tgl3wGetnUniformuivARB\n#define glGetnUniformdvARB\t\tgl3wGetnUniformdvARB\n#define glDrawArraysInstancedBaseInstance\t\tgl3wDrawArraysInstancedBaseInstance\n#define glDrawElementsInstancedBaseInstance\t\tgl3wDrawElementsInstancedBaseInstance\n#define glDrawElementsInstancedBaseVertexBaseInstance\t\tgl3wDrawElementsInstancedBaseVertexBaseInstance\n#define glDrawTransformFeedbackInstanced\t\tgl3wDrawTransformFeedbackInstanced\n#define glDrawTransformFeedbackStreamInstanced\t\tgl3wDrawTransformFeedbackStreamInstanced\n#define glGetInternalformativ\t\tgl3wGetInternalformativ\n#define glGetActiveAtomicCounterBufferiv\t\tgl3wGetActiveAtomicCounterBufferiv\n#define glBindImageTexture\t\tgl3wBindImageTexture\n#define glMemoryBarrier\t\tgl3wMemoryBarrier\n#define glTexStorage1D\t\tgl3wTexStorage1D\n#define glTexStorage2D\t\tgl3wTexStorage2D\n#define glTexStorage3D\t\tgl3wTexStorage3D\n#define glTextureStorage1DEXT\t\tgl3wTextureStorage1DEXT\n#define glTextureStorage2DEXT\t\tgl3wTextureStorage2DEXT\n#define glTextureStorage3DEXT\t\tgl3wTextureStorage3DEXT\n#define glDebugMessageControl\t\tgl3wDebugMessageControl\n#define glDebugMessageInsert\t\tgl3wDebugMessageInsert\n#define glDebugMessageCallback\t\tgl3wDebugMessageCallback\n#define glGetDebugMessageLog\t\tgl3wGetDebugMessageLog\n#define glPushDebugGroup\t\tgl3wPushDebugGroup\n#define glPopDebugGroup\t\tgl3wPopDebugGroup\n#define glObjectLabel\t\tgl3wObjectLabel\n#define glGetObjectLabel\t\tgl3wGetObjectLabel\n#define glObjectPtrLabel\t\tgl3wObjectPtrLabel\n#define glGetObjectPtrLabel\t\tgl3wGetObjectPtrLabel\n#define glClearBufferData\t\tgl3wClearBufferData\n#define glClearBufferSubData\t\tgl3wClearBufferSubData\n#define glClearNamedBufferDataEXT\t\tgl3wClearNamedBufferDataEXT\n#define glClearNamedBufferSubDataEXT\t\tgl3wClearNamedBufferSubDataEXT\n#define glDispatchCompute\t\tgl3wDispatchCompute\n#define glDispatchComputeIndirect\t\tgl3wDispatchComputeIndirect\n#define glCopyImageSubData\t\tgl3wCopyImageSubData\n#define glTextureView\t\tgl3wTextureView\n#define glBindVertexBuffer\t\tgl3wBindVertexBuffer\n#define glVertexAttribFormat\t\tgl3wVertexAttribFormat\n#define glVertexAttribIFormat\t\tgl3wVertexAttribIFormat\n#define glVertexAttribLFormat\t\tgl3wVertexAttribLFormat\n#define glVertexAttribBinding\t\tgl3wVertexAttribBinding\n#define glVertexBindingDivisor\t\tgl3wVertexBindingDivisor\n#define glVertexArrayBindVertexBufferEXT\t\tgl3wVertexArrayBindVertexBufferEXT\n#define glVertexArrayVertexAttribFormatEXT\t\tgl3wVertexArrayVertexAttribFormatEXT\n#define glVertexArrayVertexAttribIFormatEXT\t\tgl3wVertexArrayVertexAttribIFormatEXT\n#define glVertexArrayVertexAttribLFormatEXT\t\tgl3wVertexArrayVertexAttribLFormatEXT\n#define glVertexArrayVertexAttribBindingEXT\t\tgl3wVertexArrayVertexAttribBindingEXT\n#define glVertexArrayVertexBindingDivisorEXT\t\tgl3wVertexArrayVertexBindingDivisorEXT\n#define glFramebufferParameteri\t\tgl3wFramebufferParameteri\n#define glGetFramebufferParameteriv\t\tgl3wGetFramebufferParameteriv\n#define glNamedFramebufferParameteriEXT\t\tgl3wNamedFramebufferParameteriEXT\n#define glGetNamedFramebufferParameterivEXT\t\tgl3wGetNamedFramebufferParameterivEXT\n#define glGetInternalformati64v\t\tgl3wGetInternalformati64v\n#define glInvalidateTexSubImage\t\tgl3wInvalidateTexSubImage\n#define glInvalidateTexImage\t\tgl3wInvalidateTexImage\n#define glInvalidateBufferSubData\t\tgl3wInvalidateBufferSubData\n#define glInvalidateBufferData\t\tgl3wInvalidateBufferData\n#define glInvalidateFramebuffer\t\tgl3wInvalidateFramebuffer\n#define glInvalidateSubFramebuffer\t\tgl3wInvalidateSubFramebuffer\n#define glMultiDrawArraysIndirect\t\tgl3wMultiDrawArraysIndirect\n#define glMultiDrawElementsIndirect\t\tgl3wMultiDrawElementsIndirect\n#define glGetProgramInterfaceiv\t\tgl3wGetProgramInterfaceiv\n#define glGetProgramResourceIndex\t\tgl3wGetProgramResourceIndex\n#define glGetProgramResourceName\t\tgl3wGetProgramResourceName\n#define glGetProgramResourceiv\t\tgl3wGetProgramResourceiv\n#define glGetProgramResourceLocation\t\tgl3wGetProgramResourceLocation\n#define glGetProgramResourceLocationIndex\t\tgl3wGetProgramResourceLocationIndex\n#define glShaderStorageBlockBinding\t\tgl3wShaderStorageBlockBinding\n#define glTexBufferRange\t\tgl3wTexBufferRange\n#define glTextureBufferRangeEXT\t\tgl3wTextureBufferRangeEXT\n#define glTexStorage2DMultisample\t\tgl3wTexStorage2DMultisample\n#define glTexStorage3DMultisample\t\tgl3wTexStorage3DMultisample\n#define glTextureStorage2DMultisampleEXT\t\tgl3wTextureStorage2DMultisampleEXT\n#define glTextureStorage3DMultisampleEXT\t\tgl3wTextureStorage3DMultisampleEXT\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "external/imgui/examples/libs/gl3w/GL/glcorearb.h",
    "content": "#ifndef __glcorearb_h_\n#define __glcorearb_h_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n** Copyright (c) 2007-2012 The Khronos Group Inc.\n** \n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n** \n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n** \n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n/* glcorearb.h replaces gl3.h. It is for use with OpenGL core\n * profile implementations.\n *\n * glcorearb.h last updated on $Date: 2012-09-19 19:02:24 -0700 (Wed, 19 Sep 2012) $\n *\n * RELEASE NOTES - 2012/09/19\n *\n * glcorearb.h should be placed in the same directory as gl.h and\n * included as\n * '<GL/glcorearb.h>'.\n *\n * glcorearb.h includes only APIs in the latest OpenGL core profile\n * implementation together with APIs in newer ARB extensions which can be\n * can be supported by the core profile. It does not, and never will\n * include functionality removed from the core profile, such as\n * fixed-function vertex and fragment processing.\n *\n * It is not possible to #include both <GL/glcorearb.h> and either of\n * <GL/gl.h> or <GL/glext.h> in the same source file.\n *\n * Feedback can be given by registering for the Khronos Bugzilla\n * (www.khronos.org/bugzilla) and filing issues there under product\n * \"OpenGL\", category \"Registry\".\n */\n\n/* Function declaration macros - to move into glplatform.h */\n\n#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)\n#define WIN32_LEAN_AND_MEAN 1\n#include <windows.h>\n#endif\n\n#ifndef APIENTRY\n#define APIENTRY\n#endif\n#ifndef APIENTRYP\n#define APIENTRYP APIENTRY *\n#endif\n#ifndef GLAPI\n#define GLAPI extern\n#endif\n\n/* Base GL types */\n\ntypedef unsigned int GLenum;\ntypedef unsigned char GLboolean;\ntypedef unsigned int GLbitfield;\ntypedef signed char GLbyte;\ntypedef short GLshort;\ntypedef int GLint;\ntypedef int GLsizei;\ntypedef unsigned char GLubyte;\ntypedef unsigned short GLushort;\ntypedef unsigned int GLuint;\ntypedef unsigned short GLhalf;\ntypedef float GLfloat;\ntypedef float GLclampf;\ntypedef double GLdouble;\ntypedef double GLclampd;\ntypedef void GLvoid;\n\n/*************************************************************/\n\n#ifndef GL_VERSION_1_1\n/* AttribMask */\n#define GL_DEPTH_BUFFER_BIT               0x00000100\n#define GL_STENCIL_BUFFER_BIT             0x00000400\n#define GL_COLOR_BUFFER_BIT               0x00004000\n/* Boolean */\n#define GL_FALSE                          0\n#define GL_TRUE                           1\n/* BeginMode */\n#define GL_POINTS                         0x0000\n#define GL_LINES                          0x0001\n#define GL_LINE_LOOP                      0x0002\n#define GL_LINE_STRIP                     0x0003\n#define GL_TRIANGLES                      0x0004\n#define GL_TRIANGLE_STRIP                 0x0005\n#define GL_TRIANGLE_FAN                   0x0006\n#define GL_QUADS                          0x0007\n/* AlphaFunction */\n#define GL_NEVER                          0x0200\n#define GL_LESS                           0x0201\n#define GL_EQUAL                          0x0202\n#define GL_LEQUAL                         0x0203\n#define GL_GREATER                        0x0204\n#define GL_NOTEQUAL                       0x0205\n#define GL_GEQUAL                         0x0206\n#define GL_ALWAYS                         0x0207\n/* BlendingFactorDest */\n#define GL_ZERO                           0\n#define GL_ONE                            1\n#define GL_SRC_COLOR                      0x0300\n#define GL_ONE_MINUS_SRC_COLOR            0x0301\n#define GL_SRC_ALPHA                      0x0302\n#define GL_ONE_MINUS_SRC_ALPHA            0x0303\n#define GL_DST_ALPHA                      0x0304\n#define GL_ONE_MINUS_DST_ALPHA            0x0305\n/* BlendingFactorSrc */\n#define GL_DST_COLOR                      0x0306\n#define GL_ONE_MINUS_DST_COLOR            0x0307\n#define GL_SRC_ALPHA_SATURATE             0x0308\n/* DrawBufferMode */\n#define GL_NONE                           0\n#define GL_FRONT_LEFT                     0x0400\n#define GL_FRONT_RIGHT                    0x0401\n#define GL_BACK_LEFT                      0x0402\n#define GL_BACK_RIGHT                     0x0403\n#define GL_FRONT                          0x0404\n#define GL_BACK                           0x0405\n#define GL_LEFT                           0x0406\n#define GL_RIGHT                          0x0407\n#define GL_FRONT_AND_BACK                 0x0408\n/* ErrorCode */\n#define GL_NO_ERROR                       0\n#define GL_INVALID_ENUM                   0x0500\n#define GL_INVALID_VALUE                  0x0501\n#define GL_INVALID_OPERATION              0x0502\n#define GL_OUT_OF_MEMORY                  0x0505\n/* FrontFaceDirection */\n#define GL_CW                             0x0900\n#define GL_CCW                            0x0901\n/* GetPName */\n#define GL_POINT_SIZE                     0x0B11\n#define GL_POINT_SIZE_RANGE               0x0B12\n#define GL_POINT_SIZE_GRANULARITY         0x0B13\n#define GL_LINE_SMOOTH                    0x0B20\n#define GL_LINE_WIDTH                     0x0B21\n#define GL_LINE_WIDTH_RANGE               0x0B22\n#define GL_LINE_WIDTH_GRANULARITY         0x0B23\n#define GL_POLYGON_MODE                   0x0B40\n#define GL_POLYGON_SMOOTH                 0x0B41\n#define GL_CULL_FACE                      0x0B44\n#define GL_CULL_FACE_MODE                 0x0B45\n#define GL_FRONT_FACE                     0x0B46\n#define GL_DEPTH_RANGE                    0x0B70\n#define GL_DEPTH_TEST                     0x0B71\n#define GL_DEPTH_WRITEMASK                0x0B72\n#define GL_DEPTH_CLEAR_VALUE              0x0B73\n#define GL_DEPTH_FUNC                     0x0B74\n#define GL_STENCIL_TEST                   0x0B90\n#define GL_STENCIL_CLEAR_VALUE            0x0B91\n#define GL_STENCIL_FUNC                   0x0B92\n#define GL_STENCIL_VALUE_MASK             0x0B93\n#define GL_STENCIL_FAIL                   0x0B94\n#define GL_STENCIL_PASS_DEPTH_FAIL        0x0B95\n#define GL_STENCIL_PASS_DEPTH_PASS        0x0B96\n#define GL_STENCIL_REF                    0x0B97\n#define GL_STENCIL_WRITEMASK              0x0B98\n#define GL_VIEWPORT                       0x0BA2\n#define GL_DITHER                         0x0BD0\n#define GL_BLEND_DST                      0x0BE0\n#define GL_BLEND_SRC                      0x0BE1\n#define GL_BLEND                          0x0BE2\n#define GL_LOGIC_OP_MODE                  0x0BF0\n#define GL_COLOR_LOGIC_OP                 0x0BF2\n#define GL_DRAW_BUFFER                    0x0C01\n#define GL_READ_BUFFER                    0x0C02\n#define GL_SCISSOR_BOX                    0x0C10\n#define GL_SCISSOR_TEST                   0x0C11\n#define GL_COLOR_CLEAR_VALUE              0x0C22\n#define GL_COLOR_WRITEMASK                0x0C23\n#define GL_DOUBLEBUFFER                   0x0C32\n#define GL_STEREO                         0x0C33\n#define GL_LINE_SMOOTH_HINT               0x0C52\n#define GL_POLYGON_SMOOTH_HINT            0x0C53\n#define GL_UNPACK_SWAP_BYTES              0x0CF0\n#define GL_UNPACK_LSB_FIRST               0x0CF1\n#define GL_UNPACK_ROW_LENGTH              0x0CF2\n#define GL_UNPACK_SKIP_ROWS               0x0CF3\n#define GL_UNPACK_SKIP_PIXELS             0x0CF4\n#define GL_UNPACK_ALIGNMENT               0x0CF5\n#define GL_PACK_SWAP_BYTES                0x0D00\n#define GL_PACK_LSB_FIRST                 0x0D01\n#define GL_PACK_ROW_LENGTH                0x0D02\n#define GL_PACK_SKIP_ROWS                 0x0D03\n#define GL_PACK_SKIP_PIXELS               0x0D04\n#define GL_PACK_ALIGNMENT                 0x0D05\n#define GL_MAX_TEXTURE_SIZE               0x0D33\n#define GL_MAX_VIEWPORT_DIMS              0x0D3A\n#define GL_SUBPIXEL_BITS                  0x0D50\n#define GL_TEXTURE_1D                     0x0DE0\n#define GL_TEXTURE_2D                     0x0DE1\n#define GL_POLYGON_OFFSET_UNITS           0x2A00\n#define GL_POLYGON_OFFSET_POINT           0x2A01\n#define GL_POLYGON_OFFSET_LINE            0x2A02\n#define GL_POLYGON_OFFSET_FILL            0x8037\n#define GL_POLYGON_OFFSET_FACTOR          0x8038\n#define GL_TEXTURE_BINDING_1D             0x8068\n#define GL_TEXTURE_BINDING_2D             0x8069\n/* GetTextureParameter */\n#define GL_TEXTURE_WIDTH                  0x1000\n#define GL_TEXTURE_HEIGHT                 0x1001\n#define GL_TEXTURE_INTERNAL_FORMAT        0x1003\n#define GL_TEXTURE_BORDER_COLOR           0x1004\n#define GL_TEXTURE_RED_SIZE               0x805C\n#define GL_TEXTURE_GREEN_SIZE             0x805D\n#define GL_TEXTURE_BLUE_SIZE              0x805E\n#define GL_TEXTURE_ALPHA_SIZE             0x805F\n/* HintMode */\n#define GL_DONT_CARE                      0x1100\n#define GL_FASTEST                        0x1101\n#define GL_NICEST                         0x1102\n/* DataType */\n#define GL_BYTE                           0x1400\n#define GL_UNSIGNED_BYTE                  0x1401\n#define GL_SHORT                          0x1402\n#define GL_UNSIGNED_SHORT                 0x1403\n#define GL_INT                            0x1404\n#define GL_UNSIGNED_INT                   0x1405\n#define GL_FLOAT                          0x1406\n#define GL_DOUBLE                         0x140A\n/* ErrorCode */\n#define GL_STACK_OVERFLOW                 0x0503\n#define GL_STACK_UNDERFLOW                0x0504\n/* LogicOp */\n#define GL_CLEAR                          0x1500\n#define GL_AND                            0x1501\n#define GL_AND_REVERSE                    0x1502\n#define GL_COPY                           0x1503\n#define GL_AND_INVERTED                   0x1504\n#define GL_NOOP                           0x1505\n#define GL_XOR                            0x1506\n#define GL_OR                             0x1507\n#define GL_NOR                            0x1508\n#define GL_EQUIV                          0x1509\n#define GL_INVERT                         0x150A\n#define GL_OR_REVERSE                     0x150B\n#define GL_COPY_INVERTED                  0x150C\n#define GL_OR_INVERTED                    0x150D\n#define GL_NAND                           0x150E\n#define GL_SET                            0x150F\n/* MatrixMode (for gl3.h, FBO attachment type) */\n#define GL_TEXTURE                        0x1702\n/* PixelCopyType */\n#define GL_COLOR                          0x1800\n#define GL_DEPTH                          0x1801\n#define GL_STENCIL                        0x1802\n/* PixelFormat */\n#define GL_STENCIL_INDEX                  0x1901\n#define GL_DEPTH_COMPONENT                0x1902\n#define GL_RED                            0x1903\n#define GL_GREEN                          0x1904\n#define GL_BLUE                           0x1905\n#define GL_ALPHA                          0x1906\n#define GL_RGB                            0x1907\n#define GL_RGBA                           0x1908\n/* PolygonMode */\n#define GL_POINT                          0x1B00\n#define GL_LINE                           0x1B01\n#define GL_FILL                           0x1B02\n/* StencilOp */\n#define GL_KEEP                           0x1E00\n#define GL_REPLACE                        0x1E01\n#define GL_INCR                           0x1E02\n#define GL_DECR                           0x1E03\n/* StringName */\n#define GL_VENDOR                         0x1F00\n#define GL_RENDERER                       0x1F01\n#define GL_VERSION                        0x1F02\n#define GL_EXTENSIONS                     0x1F03\n/* TextureMagFilter */\n#define GL_NEAREST                        0x2600\n#define GL_LINEAR                         0x2601\n/* TextureMinFilter */\n#define GL_NEAREST_MIPMAP_NEAREST         0x2700\n#define GL_LINEAR_MIPMAP_NEAREST          0x2701\n#define GL_NEAREST_MIPMAP_LINEAR          0x2702\n#define GL_LINEAR_MIPMAP_LINEAR           0x2703\n/* TextureParameterName */\n#define GL_TEXTURE_MAG_FILTER             0x2800\n#define GL_TEXTURE_MIN_FILTER             0x2801\n#define GL_TEXTURE_WRAP_S                 0x2802\n#define GL_TEXTURE_WRAP_T                 0x2803\n/* TextureTarget */\n#define GL_PROXY_TEXTURE_1D               0x8063\n#define GL_PROXY_TEXTURE_2D               0x8064\n/* TextureWrapMode */\n#define GL_REPEAT                         0x2901\n/* PixelInternalFormat */\n#define GL_R3_G3_B2                       0x2A10\n#define GL_RGB4                           0x804F\n#define GL_RGB5                           0x8050\n#define GL_RGB8                           0x8051\n#define GL_RGB10                          0x8052\n#define GL_RGB12                          0x8053\n#define GL_RGB16                          0x8054\n#define GL_RGBA2                          0x8055\n#define GL_RGBA4                          0x8056\n#define GL_RGB5_A1                        0x8057\n#define GL_RGBA8                          0x8058\n#define GL_RGB10_A2                       0x8059\n#define GL_RGBA12                         0x805A\n#define GL_RGBA16                         0x805B\n#endif\n\n#ifndef GL_VERSION_1_2\n#define GL_UNSIGNED_BYTE_3_3_2            0x8032\n#define GL_UNSIGNED_SHORT_4_4_4_4         0x8033\n#define GL_UNSIGNED_SHORT_5_5_5_1         0x8034\n#define GL_UNSIGNED_INT_8_8_8_8           0x8035\n#define GL_UNSIGNED_INT_10_10_10_2        0x8036\n#define GL_TEXTURE_BINDING_3D             0x806A\n#define GL_PACK_SKIP_IMAGES               0x806B\n#define GL_PACK_IMAGE_HEIGHT              0x806C\n#define GL_UNPACK_SKIP_IMAGES             0x806D\n#define GL_UNPACK_IMAGE_HEIGHT            0x806E\n#define GL_TEXTURE_3D                     0x806F\n#define GL_PROXY_TEXTURE_3D               0x8070\n#define GL_TEXTURE_DEPTH                  0x8071\n#define GL_TEXTURE_WRAP_R                 0x8072\n#define GL_MAX_3D_TEXTURE_SIZE            0x8073\n#define GL_UNSIGNED_BYTE_2_3_3_REV        0x8362\n#define GL_UNSIGNED_SHORT_5_6_5           0x8363\n#define GL_UNSIGNED_SHORT_5_6_5_REV       0x8364\n#define GL_UNSIGNED_SHORT_4_4_4_4_REV     0x8365\n#define GL_UNSIGNED_SHORT_1_5_5_5_REV     0x8366\n#define GL_UNSIGNED_INT_8_8_8_8_REV       0x8367\n#define GL_UNSIGNED_INT_2_10_10_10_REV    0x8368\n#define GL_BGR                            0x80E0\n#define GL_BGRA                           0x80E1\n#define GL_MAX_ELEMENTS_VERTICES          0x80E8\n#define GL_MAX_ELEMENTS_INDICES           0x80E9\n#define GL_CLAMP_TO_EDGE                  0x812F\n#define GL_TEXTURE_MIN_LOD                0x813A\n#define GL_TEXTURE_MAX_LOD                0x813B\n#define GL_TEXTURE_BASE_LEVEL             0x813C\n#define GL_TEXTURE_MAX_LEVEL              0x813D\n#define GL_SMOOTH_POINT_SIZE_RANGE        0x0B12\n#define GL_SMOOTH_POINT_SIZE_GRANULARITY  0x0B13\n#define GL_SMOOTH_LINE_WIDTH_RANGE        0x0B22\n#define GL_SMOOTH_LINE_WIDTH_GRANULARITY  0x0B23\n#define GL_ALIASED_LINE_WIDTH_RANGE       0x846E\n#endif\n\n#ifndef GL_ARB_imaging\n#define GL_CONSTANT_COLOR                 0x8001\n#define GL_ONE_MINUS_CONSTANT_COLOR       0x8002\n#define GL_CONSTANT_ALPHA                 0x8003\n#define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004\n#define GL_BLEND_COLOR                    0x8005\n#define GL_FUNC_ADD                       0x8006\n#define GL_MIN                            0x8007\n#define GL_MAX                            0x8008\n#define GL_BLEND_EQUATION                 0x8009\n#define GL_FUNC_SUBTRACT                  0x800A\n#define GL_FUNC_REVERSE_SUBTRACT          0x800B\n#endif\n\n#ifndef GL_VERSION_1_3\n#define GL_TEXTURE0                       0x84C0\n#define GL_TEXTURE1                       0x84C1\n#define GL_TEXTURE2                       0x84C2\n#define GL_TEXTURE3                       0x84C3\n#define GL_TEXTURE4                       0x84C4\n#define GL_TEXTURE5                       0x84C5\n#define GL_TEXTURE6                       0x84C6\n#define GL_TEXTURE7                       0x84C7\n#define GL_TEXTURE8                       0x84C8\n#define GL_TEXTURE9                       0x84C9\n#define GL_TEXTURE10                      0x84CA\n#define GL_TEXTURE11                      0x84CB\n#define GL_TEXTURE12                      0x84CC\n#define GL_TEXTURE13                      0x84CD\n#define GL_TEXTURE14                      0x84CE\n#define GL_TEXTURE15                      0x84CF\n#define GL_TEXTURE16                      0x84D0\n#define GL_TEXTURE17                      0x84D1\n#define GL_TEXTURE18                      0x84D2\n#define GL_TEXTURE19                      0x84D3\n#define GL_TEXTURE20                      0x84D4\n#define GL_TEXTURE21                      0x84D5\n#define GL_TEXTURE22                      0x84D6\n#define GL_TEXTURE23                      0x84D7\n#define GL_TEXTURE24                      0x84D8\n#define GL_TEXTURE25                      0x84D9\n#define GL_TEXTURE26                      0x84DA\n#define GL_TEXTURE27                      0x84DB\n#define GL_TEXTURE28                      0x84DC\n#define GL_TEXTURE29                      0x84DD\n#define GL_TEXTURE30                      0x84DE\n#define GL_TEXTURE31                      0x84DF\n#define GL_ACTIVE_TEXTURE                 0x84E0\n#define GL_MULTISAMPLE                    0x809D\n#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E\n#define GL_SAMPLE_ALPHA_TO_ONE            0x809F\n#define GL_SAMPLE_COVERAGE                0x80A0\n#define GL_SAMPLE_BUFFERS                 0x80A8\n#define GL_SAMPLES                        0x80A9\n#define GL_SAMPLE_COVERAGE_VALUE          0x80AA\n#define GL_SAMPLE_COVERAGE_INVERT         0x80AB\n#define GL_TEXTURE_CUBE_MAP               0x8513\n#define GL_TEXTURE_BINDING_CUBE_MAP       0x8514\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_X    0x8515\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X    0x8516\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y    0x8517\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y    0x8518\n#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z    0x8519\n#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z    0x851A\n#define GL_PROXY_TEXTURE_CUBE_MAP         0x851B\n#define GL_MAX_CUBE_MAP_TEXTURE_SIZE      0x851C\n#define GL_COMPRESSED_RGB                 0x84ED\n#define GL_COMPRESSED_RGBA                0x84EE\n#define GL_TEXTURE_COMPRESSION_HINT       0x84EF\n#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE  0x86A0\n#define GL_TEXTURE_COMPRESSED             0x86A1\n#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\n#define GL_COMPRESSED_TEXTURE_FORMATS     0x86A3\n#define GL_CLAMP_TO_BORDER                0x812D\n#endif\n\n#ifndef GL_VERSION_1_4\n#define GL_BLEND_DST_RGB                  0x80C8\n#define GL_BLEND_SRC_RGB                  0x80C9\n#define GL_BLEND_DST_ALPHA                0x80CA\n#define GL_BLEND_SRC_ALPHA                0x80CB\n#define GL_POINT_FADE_THRESHOLD_SIZE      0x8128\n#define GL_DEPTH_COMPONENT16              0x81A5\n#define GL_DEPTH_COMPONENT24              0x81A6\n#define GL_DEPTH_COMPONENT32              0x81A7\n#define GL_MIRRORED_REPEAT                0x8370\n#define GL_MAX_TEXTURE_LOD_BIAS           0x84FD\n#define GL_TEXTURE_LOD_BIAS               0x8501\n#define GL_INCR_WRAP                      0x8507\n#define GL_DECR_WRAP                      0x8508\n#define GL_TEXTURE_DEPTH_SIZE             0x884A\n#define GL_TEXTURE_COMPARE_MODE           0x884C\n#define GL_TEXTURE_COMPARE_FUNC           0x884D\n#endif\n\n#ifndef GL_VERSION_1_5\n#define GL_BUFFER_SIZE                    0x8764\n#define GL_BUFFER_USAGE                   0x8765\n#define GL_QUERY_COUNTER_BITS             0x8864\n#define GL_CURRENT_QUERY                  0x8865\n#define GL_QUERY_RESULT                   0x8866\n#define GL_QUERY_RESULT_AVAILABLE         0x8867\n#define GL_ARRAY_BUFFER                   0x8892\n#define GL_ELEMENT_ARRAY_BUFFER           0x8893\n#define GL_ARRAY_BUFFER_BINDING           0x8894\n#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895\n#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\n#define GL_READ_ONLY                      0x88B8\n#define GL_WRITE_ONLY                     0x88B9\n#define GL_READ_WRITE                     0x88BA\n#define GL_BUFFER_ACCESS                  0x88BB\n#define GL_BUFFER_MAPPED                  0x88BC\n#define GL_BUFFER_MAP_POINTER             0x88BD\n#define GL_STREAM_DRAW                    0x88E0\n#define GL_STREAM_READ                    0x88E1\n#define GL_STREAM_COPY                    0x88E2\n#define GL_STATIC_DRAW                    0x88E4\n#define GL_STATIC_READ                    0x88E5\n#define GL_STATIC_COPY                    0x88E6\n#define GL_DYNAMIC_DRAW                   0x88E8\n#define GL_DYNAMIC_READ                   0x88E9\n#define GL_DYNAMIC_COPY                   0x88EA\n#define GL_SAMPLES_PASSED                 0x8914\n#define GL_SRC1_ALPHA                     0x8589\n#endif\n\n#ifndef GL_VERSION_2_0\n#define GL_BLEND_EQUATION_RGB             0x8009\n#define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622\n#define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623\n#define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624\n#define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625\n#define GL_CURRENT_VERTEX_ATTRIB          0x8626\n#define GL_VERTEX_PROGRAM_POINT_SIZE      0x8642\n#define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645\n#define GL_STENCIL_BACK_FUNC              0x8800\n#define GL_STENCIL_BACK_FAIL              0x8801\n#define GL_STENCIL_BACK_PASS_DEPTH_FAIL   0x8802\n#define GL_STENCIL_BACK_PASS_DEPTH_PASS   0x8803\n#define GL_MAX_DRAW_BUFFERS               0x8824\n#define GL_DRAW_BUFFER0                   0x8825\n#define GL_DRAW_BUFFER1                   0x8826\n#define GL_DRAW_BUFFER2                   0x8827\n#define GL_DRAW_BUFFER3                   0x8828\n#define GL_DRAW_BUFFER4                   0x8829\n#define GL_DRAW_BUFFER5                   0x882A\n#define GL_DRAW_BUFFER6                   0x882B\n#define GL_DRAW_BUFFER7                   0x882C\n#define GL_DRAW_BUFFER8                   0x882D\n#define GL_DRAW_BUFFER9                   0x882E\n#define GL_DRAW_BUFFER10                  0x882F\n#define GL_DRAW_BUFFER11                  0x8830\n#define GL_DRAW_BUFFER12                  0x8831\n#define GL_DRAW_BUFFER13                  0x8832\n#define GL_DRAW_BUFFER14                  0x8833\n#define GL_DRAW_BUFFER15                  0x8834\n#define GL_BLEND_EQUATION_ALPHA           0x883D\n#define GL_MAX_VERTEX_ATTRIBS             0x8869\n#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A\n#define GL_MAX_TEXTURE_IMAGE_UNITS        0x8872\n#define GL_FRAGMENT_SHADER                0x8B30\n#define GL_VERTEX_SHADER                  0x8B31\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS  0x8B4A\n#define GL_MAX_VARYING_FLOATS             0x8B4B\n#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C\n#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\n#define GL_SHADER_TYPE                    0x8B4F\n#define GL_FLOAT_VEC2                     0x8B50\n#define GL_FLOAT_VEC3                     0x8B51\n#define GL_FLOAT_VEC4                     0x8B52\n#define GL_INT_VEC2                       0x8B53\n#define GL_INT_VEC3                       0x8B54\n#define GL_INT_VEC4                       0x8B55\n#define GL_BOOL                           0x8B56\n#define GL_BOOL_VEC2                      0x8B57\n#define GL_BOOL_VEC3                      0x8B58\n#define GL_BOOL_VEC4                      0x8B59\n#define GL_FLOAT_MAT2                     0x8B5A\n#define GL_FLOAT_MAT3                     0x8B5B\n#define GL_FLOAT_MAT4                     0x8B5C\n#define GL_SAMPLER_1D                     0x8B5D\n#define GL_SAMPLER_2D                     0x8B5E\n#define GL_SAMPLER_3D                     0x8B5F\n#define GL_SAMPLER_CUBE                   0x8B60\n#define GL_SAMPLER_1D_SHADOW              0x8B61\n#define GL_SAMPLER_2D_SHADOW              0x8B62\n#define GL_DELETE_STATUS                  0x8B80\n#define GL_COMPILE_STATUS                 0x8B81\n#define GL_LINK_STATUS                    0x8B82\n#define GL_VALIDATE_STATUS                0x8B83\n#define GL_INFO_LOG_LENGTH                0x8B84\n#define GL_ATTACHED_SHADERS               0x8B85\n#define GL_ACTIVE_UNIFORMS                0x8B86\n#define GL_ACTIVE_UNIFORM_MAX_LENGTH      0x8B87\n#define GL_SHADER_SOURCE_LENGTH           0x8B88\n#define GL_ACTIVE_ATTRIBUTES              0x8B89\n#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH    0x8B8A\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\n#define GL_SHADING_LANGUAGE_VERSION       0x8B8C\n#define GL_CURRENT_PROGRAM                0x8B8D\n#define GL_POINT_SPRITE_COORD_ORIGIN      0x8CA0\n#define GL_LOWER_LEFT                     0x8CA1\n#define GL_UPPER_LEFT                     0x8CA2\n#define GL_STENCIL_BACK_REF               0x8CA3\n#define GL_STENCIL_BACK_VALUE_MASK        0x8CA4\n#define GL_STENCIL_BACK_WRITEMASK         0x8CA5\n#endif\n\n#ifndef GL_VERSION_2_1\n#define GL_PIXEL_PACK_BUFFER              0x88EB\n#define GL_PIXEL_UNPACK_BUFFER            0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING      0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING    0x88EF\n#define GL_FLOAT_MAT2x3                   0x8B65\n#define GL_FLOAT_MAT2x4                   0x8B66\n#define GL_FLOAT_MAT3x2                   0x8B67\n#define GL_FLOAT_MAT3x4                   0x8B68\n#define GL_FLOAT_MAT4x2                   0x8B69\n#define GL_FLOAT_MAT4x3                   0x8B6A\n#define GL_SRGB                           0x8C40\n#define GL_SRGB8                          0x8C41\n#define GL_SRGB_ALPHA                     0x8C42\n#define GL_SRGB8_ALPHA8                   0x8C43\n#define GL_COMPRESSED_SRGB                0x8C48\n#define GL_COMPRESSED_SRGB_ALPHA          0x8C49\n#endif\n\n#ifndef GL_VERSION_3_0\n#define GL_COMPARE_REF_TO_TEXTURE         0x884E\n#define GL_CLIP_DISTANCE0                 0x3000\n#define GL_CLIP_DISTANCE1                 0x3001\n#define GL_CLIP_DISTANCE2                 0x3002\n#define GL_CLIP_DISTANCE3                 0x3003\n#define GL_CLIP_DISTANCE4                 0x3004\n#define GL_CLIP_DISTANCE5                 0x3005\n#define GL_CLIP_DISTANCE6                 0x3006\n#define GL_CLIP_DISTANCE7                 0x3007\n#define GL_MAX_CLIP_DISTANCES             0x0D32\n#define GL_MAJOR_VERSION                  0x821B\n#define GL_MINOR_VERSION                  0x821C\n#define GL_NUM_EXTENSIONS                 0x821D\n#define GL_CONTEXT_FLAGS                  0x821E\n#define GL_COMPRESSED_RED                 0x8225\n#define GL_COMPRESSED_RG                  0x8226\n#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001\n#define GL_RGBA32F                        0x8814\n#define GL_RGB32F                         0x8815\n#define GL_RGBA16F                        0x881A\n#define GL_RGB16F                         0x881B\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER    0x88FD\n#define GL_MAX_ARRAY_TEXTURE_LAYERS       0x88FF\n#define GL_MIN_PROGRAM_TEXEL_OFFSET       0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET       0x8905\n#define GL_CLAMP_READ_COLOR               0x891C\n#define GL_FIXED_ONLY                     0x891D\n#define GL_MAX_VARYING_COMPONENTS         0x8B4B\n#define GL_TEXTURE_1D_ARRAY               0x8C18\n#define GL_PROXY_TEXTURE_1D_ARRAY         0x8C19\n#define GL_TEXTURE_2D_ARRAY               0x8C1A\n#define GL_PROXY_TEXTURE_2D_ARRAY         0x8C1B\n#define GL_TEXTURE_BINDING_1D_ARRAY       0x8C1C\n#define GL_TEXTURE_BINDING_2D_ARRAY       0x8C1D\n#define GL_R11F_G11F_B10F                 0x8C3A\n#define GL_UNSIGNED_INT_10F_11F_11F_REV   0x8C3B\n#define GL_RGB9_E5                        0x8C3D\n#define GL_UNSIGNED_INT_5_9_9_9_REV       0x8C3E\n#define GL_TEXTURE_SHARED_SIZE            0x8C3F\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\n#define GL_TRANSFORM_FEEDBACK_VARYINGS    0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\n#define GL_PRIMITIVES_GENERATED           0x8C87\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\n#define GL_RASTERIZER_DISCARD             0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\n#define GL_INTERLEAVED_ATTRIBS            0x8C8C\n#define GL_SEPARATE_ATTRIBS               0x8C8D\n#define GL_TRANSFORM_FEEDBACK_BUFFER      0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\n#define GL_RGBA32UI                       0x8D70\n#define GL_RGB32UI                        0x8D71\n#define GL_RGBA16UI                       0x8D76\n#define GL_RGB16UI                        0x8D77\n#define GL_RGBA8UI                        0x8D7C\n#define GL_RGB8UI                         0x8D7D\n#define GL_RGBA32I                        0x8D82\n#define GL_RGB32I                         0x8D83\n#define GL_RGBA16I                        0x8D88\n#define GL_RGB16I                         0x8D89\n#define GL_RGBA8I                         0x8D8E\n#define GL_RGB8I                          0x8D8F\n#define GL_RED_INTEGER                    0x8D94\n#define GL_GREEN_INTEGER                  0x8D95\n#define GL_BLUE_INTEGER                   0x8D96\n#define GL_RGB_INTEGER                    0x8D98\n#define GL_RGBA_INTEGER                   0x8D99\n#define GL_BGR_INTEGER                    0x8D9A\n#define GL_BGRA_INTEGER                   0x8D9B\n#define GL_SAMPLER_1D_ARRAY               0x8DC0\n#define GL_SAMPLER_2D_ARRAY               0x8DC1\n#define GL_SAMPLER_1D_ARRAY_SHADOW        0x8DC3\n#define GL_SAMPLER_2D_ARRAY_SHADOW        0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW            0x8DC5\n#define GL_UNSIGNED_INT_VEC2              0x8DC6\n#define GL_UNSIGNED_INT_VEC3              0x8DC7\n#define GL_UNSIGNED_INT_VEC4              0x8DC8\n#define GL_INT_SAMPLER_1D                 0x8DC9\n#define GL_INT_SAMPLER_2D                 0x8DCA\n#define GL_INT_SAMPLER_3D                 0x8DCB\n#define GL_INT_SAMPLER_CUBE               0x8DCC\n#define GL_INT_SAMPLER_1D_ARRAY           0x8DCE\n#define GL_INT_SAMPLER_2D_ARRAY           0x8DCF\n#define GL_UNSIGNED_INT_SAMPLER_1D        0x8DD1\n#define GL_UNSIGNED_INT_SAMPLER_2D        0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D        0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE      0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY  0x8DD6\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY  0x8DD7\n#define GL_QUERY_WAIT                     0x8E13\n#define GL_QUERY_NO_WAIT                  0x8E14\n#define GL_QUERY_BY_REGION_WAIT           0x8E15\n#define GL_QUERY_BY_REGION_NO_WAIT        0x8E16\n#define GL_BUFFER_ACCESS_FLAGS            0x911F\n#define GL_BUFFER_MAP_LENGTH              0x9120\n#define GL_BUFFER_MAP_OFFSET              0x9121\n/* Reuse tokens from ARB_depth_buffer_float */\n/* reuse GL_DEPTH_COMPONENT32F */\n/* reuse GL_DEPTH32F_STENCIL8 */\n/* reuse GL_FLOAT_32_UNSIGNED_INT_24_8_REV */\n/* Reuse tokens from ARB_framebuffer_object */\n/* reuse GL_INVALID_FRAMEBUFFER_OPERATION */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */\n/* reuse GL_FRAMEBUFFER_DEFAULT */\n/* reuse GL_FRAMEBUFFER_UNDEFINED */\n/* reuse GL_DEPTH_STENCIL_ATTACHMENT */\n/* reuse GL_INDEX */\n/* reuse GL_MAX_RENDERBUFFER_SIZE */\n/* reuse GL_DEPTH_STENCIL */\n/* reuse GL_UNSIGNED_INT_24_8 */\n/* reuse GL_DEPTH24_STENCIL8 */\n/* reuse GL_TEXTURE_STENCIL_SIZE */\n/* reuse GL_TEXTURE_RED_TYPE */\n/* reuse GL_TEXTURE_GREEN_TYPE */\n/* reuse GL_TEXTURE_BLUE_TYPE */\n/* reuse GL_TEXTURE_ALPHA_TYPE */\n/* reuse GL_TEXTURE_DEPTH_TYPE */\n/* reuse GL_UNSIGNED_NORMALIZED */\n/* reuse GL_FRAMEBUFFER_BINDING */\n/* reuse GL_DRAW_FRAMEBUFFER_BINDING */\n/* reuse GL_RENDERBUFFER_BINDING */\n/* reuse GL_READ_FRAMEBUFFER */\n/* reuse GL_DRAW_FRAMEBUFFER */\n/* reuse GL_READ_FRAMEBUFFER_BINDING */\n/* reuse GL_RENDERBUFFER_SAMPLES */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */\n/* reuse GL_FRAMEBUFFER_COMPLETE */\n/* reuse GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */\n/* reuse GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */\n/* reuse GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */\n/* reuse GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */\n/* reuse GL_FRAMEBUFFER_UNSUPPORTED */\n/* reuse GL_MAX_COLOR_ATTACHMENTS */\n/* reuse GL_COLOR_ATTACHMENT0 */\n/* reuse GL_COLOR_ATTACHMENT1 */\n/* reuse GL_COLOR_ATTACHMENT2 */\n/* reuse GL_COLOR_ATTACHMENT3 */\n/* reuse GL_COLOR_ATTACHMENT4 */\n/* reuse GL_COLOR_ATTACHMENT5 */\n/* reuse GL_COLOR_ATTACHMENT6 */\n/* reuse GL_COLOR_ATTACHMENT7 */\n/* reuse GL_COLOR_ATTACHMENT8 */\n/* reuse GL_COLOR_ATTACHMENT9 */\n/* reuse GL_COLOR_ATTACHMENT10 */\n/* reuse GL_COLOR_ATTACHMENT11 */\n/* reuse GL_COLOR_ATTACHMENT12 */\n/* reuse GL_COLOR_ATTACHMENT13 */\n/* reuse GL_COLOR_ATTACHMENT14 */\n/* reuse GL_COLOR_ATTACHMENT15 */\n/* reuse GL_DEPTH_ATTACHMENT */\n/* reuse GL_STENCIL_ATTACHMENT */\n/* reuse GL_FRAMEBUFFER */\n/* reuse GL_RENDERBUFFER */\n/* reuse GL_RENDERBUFFER_WIDTH */\n/* reuse GL_RENDERBUFFER_HEIGHT */\n/* reuse GL_RENDERBUFFER_INTERNAL_FORMAT */\n/* reuse GL_STENCIL_INDEX1 */\n/* reuse GL_STENCIL_INDEX4 */\n/* reuse GL_STENCIL_INDEX8 */\n/* reuse GL_STENCIL_INDEX16 */\n/* reuse GL_RENDERBUFFER_RED_SIZE */\n/* reuse GL_RENDERBUFFER_GREEN_SIZE */\n/* reuse GL_RENDERBUFFER_BLUE_SIZE */\n/* reuse GL_RENDERBUFFER_ALPHA_SIZE */\n/* reuse GL_RENDERBUFFER_DEPTH_SIZE */\n/* reuse GL_RENDERBUFFER_STENCIL_SIZE */\n/* reuse GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */\n/* reuse GL_MAX_SAMPLES */\n/* Reuse tokens from ARB_framebuffer_sRGB */\n/* reuse GL_FRAMEBUFFER_SRGB */\n/* Reuse tokens from ARB_half_float_vertex */\n/* reuse GL_HALF_FLOAT */\n/* Reuse tokens from ARB_map_buffer_range */\n/* reuse GL_MAP_READ_BIT */\n/* reuse GL_MAP_WRITE_BIT */\n/* reuse GL_MAP_INVALIDATE_RANGE_BIT */\n/* reuse GL_MAP_INVALIDATE_BUFFER_BIT */\n/* reuse GL_MAP_FLUSH_EXPLICIT_BIT */\n/* reuse GL_MAP_UNSYNCHRONIZED_BIT */\n/* Reuse tokens from ARB_texture_compression_rgtc */\n/* reuse GL_COMPRESSED_RED_RGTC1 */\n/* reuse GL_COMPRESSED_SIGNED_RED_RGTC1 */\n/* reuse GL_COMPRESSED_RG_RGTC2 */\n/* reuse GL_COMPRESSED_SIGNED_RG_RGTC2 */\n/* Reuse tokens from ARB_texture_rg */\n/* reuse GL_RG */\n/* reuse GL_RG_INTEGER */\n/* reuse GL_R8 */\n/* reuse GL_R16 */\n/* reuse GL_RG8 */\n/* reuse GL_RG16 */\n/* reuse GL_R16F */\n/* reuse GL_R32F */\n/* reuse GL_RG16F */\n/* reuse GL_RG32F */\n/* reuse GL_R8I */\n/* reuse GL_R8UI */\n/* reuse GL_R16I */\n/* reuse GL_R16UI */\n/* reuse GL_R32I */\n/* reuse GL_R32UI */\n/* reuse GL_RG8I */\n/* reuse GL_RG8UI */\n/* reuse GL_RG16I */\n/* reuse GL_RG16UI */\n/* reuse GL_RG32I */\n/* reuse GL_RG32UI */\n/* Reuse tokens from ARB_vertex_array_object */\n/* reuse GL_VERTEX_ARRAY_BINDING */\n#endif\n\n#ifndef GL_VERSION_3_1\n#define GL_SAMPLER_2D_RECT                0x8B63\n#define GL_SAMPLER_2D_RECT_SHADOW         0x8B64\n#define GL_SAMPLER_BUFFER                 0x8DC2\n#define GL_INT_SAMPLER_2D_RECT            0x8DCD\n#define GL_INT_SAMPLER_BUFFER             0x8DD0\n#define GL_UNSIGNED_INT_SAMPLER_2D_RECT   0x8DD5\n#define GL_UNSIGNED_INT_SAMPLER_BUFFER    0x8DD8\n#define GL_TEXTURE_BUFFER                 0x8C2A\n#define GL_MAX_TEXTURE_BUFFER_SIZE        0x8C2B\n#define GL_TEXTURE_BINDING_BUFFER         0x8C2C\n#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D\n#define GL_TEXTURE_RECTANGLE              0x84F5\n#define GL_TEXTURE_BINDING_RECTANGLE      0x84F6\n#define GL_PROXY_TEXTURE_RECTANGLE        0x84F7\n#define GL_MAX_RECTANGLE_TEXTURE_SIZE     0x84F8\n#define GL_RED_SNORM                      0x8F90\n#define GL_RG_SNORM                       0x8F91\n#define GL_RGB_SNORM                      0x8F92\n#define GL_RGBA_SNORM                     0x8F93\n#define GL_R8_SNORM                       0x8F94\n#define GL_RG8_SNORM                      0x8F95\n#define GL_RGB8_SNORM                     0x8F96\n#define GL_RGBA8_SNORM                    0x8F97\n#define GL_R16_SNORM                      0x8F98\n#define GL_RG16_SNORM                     0x8F99\n#define GL_RGB16_SNORM                    0x8F9A\n#define GL_RGBA16_SNORM                   0x8F9B\n#define GL_SIGNED_NORMALIZED              0x8F9C\n#define GL_PRIMITIVE_RESTART              0x8F9D\n#define GL_PRIMITIVE_RESTART_INDEX        0x8F9E\n/* Reuse tokens from ARB_copy_buffer */\n/* reuse GL_COPY_READ_BUFFER */\n/* reuse GL_COPY_WRITE_BUFFER */\n/* Reuse tokens from ARB_draw_instanced (none) */\n/* Reuse tokens from ARB_uniform_buffer_object */\n/* reuse GL_UNIFORM_BUFFER */\n/* reuse GL_UNIFORM_BUFFER_BINDING */\n/* reuse GL_UNIFORM_BUFFER_START */\n/* reuse GL_UNIFORM_BUFFER_SIZE */\n/* reuse GL_MAX_VERTEX_UNIFORM_BLOCKS */\n/* reuse GL_MAX_FRAGMENT_UNIFORM_BLOCKS */\n/* reuse GL_MAX_COMBINED_UNIFORM_BLOCKS */\n/* reuse GL_MAX_UNIFORM_BUFFER_BINDINGS */\n/* reuse GL_MAX_UNIFORM_BLOCK_SIZE */\n/* reuse GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS */\n/* reuse GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS */\n/* reuse GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT */\n/* reuse GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */\n/* reuse GL_ACTIVE_UNIFORM_BLOCKS */\n/* reuse GL_UNIFORM_TYPE */\n/* reuse GL_UNIFORM_SIZE */\n/* reuse GL_UNIFORM_NAME_LENGTH */\n/* reuse GL_UNIFORM_BLOCK_INDEX */\n/* reuse GL_UNIFORM_OFFSET */\n/* reuse GL_UNIFORM_ARRAY_STRIDE */\n/* reuse GL_UNIFORM_MATRIX_STRIDE */\n/* reuse GL_UNIFORM_IS_ROW_MAJOR */\n/* reuse GL_UNIFORM_BLOCK_BINDING */\n/* reuse GL_UNIFORM_BLOCK_DATA_SIZE */\n/* reuse GL_UNIFORM_BLOCK_NAME_LENGTH */\n/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS */\n/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES */\n/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER */\n/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER */\n/* reuse GL_INVALID_INDEX */\n#endif\n\n#ifndef GL_VERSION_3_2\n#define GL_CONTEXT_CORE_PROFILE_BIT       0x00000001\n#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\n#define GL_LINES_ADJACENCY                0x000A\n#define GL_LINE_STRIP_ADJACENCY           0x000B\n#define GL_TRIANGLES_ADJACENCY            0x000C\n#define GL_TRIANGLE_STRIP_ADJACENCY       0x000D\n#define GL_PROGRAM_POINT_SIZE             0x8642\n#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29\n#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7\n#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8\n#define GL_GEOMETRY_SHADER                0x8DD9\n#define GL_GEOMETRY_VERTICES_OUT          0x8916\n#define GL_GEOMETRY_INPUT_TYPE            0x8917\n#define GL_GEOMETRY_OUTPUT_TYPE           0x8918\n#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF\n#define GL_MAX_GEOMETRY_OUTPUT_VERTICES   0x8DE0\n#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1\n#define GL_MAX_VERTEX_OUTPUT_COMPONENTS   0x9122\n#define GL_MAX_GEOMETRY_INPUT_COMPONENTS  0x9123\n#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124\n#define GL_MAX_FRAGMENT_INPUT_COMPONENTS  0x9125\n#define GL_CONTEXT_PROFILE_MASK           0x9126\n/* reuse GL_MAX_VARYING_COMPONENTS */\n/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */\n/* Reuse tokens from ARB_depth_clamp */\n/* reuse GL_DEPTH_CLAMP */\n/* Reuse tokens from ARB_draw_elements_base_vertex (none) */\n/* Reuse tokens from ARB_fragment_coord_conventions (none) */\n/* Reuse tokens from ARB_provoking_vertex */\n/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */\n/* reuse GL_FIRST_VERTEX_CONVENTION */\n/* reuse GL_LAST_VERTEX_CONVENTION */\n/* reuse GL_PROVOKING_VERTEX */\n/* Reuse tokens from ARB_seamless_cube_map */\n/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */\n/* Reuse tokens from ARB_sync */\n/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */\n/* reuse GL_OBJECT_TYPE */\n/* reuse GL_SYNC_CONDITION */\n/* reuse GL_SYNC_STATUS */\n/* reuse GL_SYNC_FLAGS */\n/* reuse GL_SYNC_FENCE */\n/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */\n/* reuse GL_UNSIGNALED */\n/* reuse GL_SIGNALED */\n/* reuse GL_ALREADY_SIGNALED */\n/* reuse GL_TIMEOUT_EXPIRED */\n/* reuse GL_CONDITION_SATISFIED */\n/* reuse GL_WAIT_FAILED */\n/* reuse GL_TIMEOUT_IGNORED */\n/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */\n/* reuse GL_TIMEOUT_IGNORED */\n/* Reuse tokens from ARB_texture_multisample */\n/* reuse GL_SAMPLE_POSITION */\n/* reuse GL_SAMPLE_MASK */\n/* reuse GL_SAMPLE_MASK_VALUE */\n/* reuse GL_MAX_SAMPLE_MASK_WORDS */\n/* reuse GL_TEXTURE_2D_MULTISAMPLE */\n/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */\n/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */\n/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_TEXTURE_SAMPLES */\n/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */\n/* reuse GL_SAMPLER_2D_MULTISAMPLE */\n/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */\n/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */\n/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */\n/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */\n/* reuse GL_MAX_INTEGER_SAMPLES */\n/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */\n#endif\n\n#ifndef GL_VERSION_3_3\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR    0x88FE\n/* Reuse tokens from ARB_blend_func_extended */\n/* reuse GL_SRC1_COLOR */\n/* reuse GL_ONE_MINUS_SRC1_COLOR */\n/* reuse GL_ONE_MINUS_SRC1_ALPHA */\n/* reuse GL_MAX_DUAL_SOURCE_DRAW_BUFFERS */\n/* Reuse tokens from ARB_explicit_attrib_location (none) */\n/* Reuse tokens from ARB_occlusion_query2 */\n/* reuse GL_ANY_SAMPLES_PASSED */\n/* Reuse tokens from ARB_sampler_objects */\n/* reuse GL_SAMPLER_BINDING */\n/* Reuse tokens from ARB_shader_bit_encoding (none) */\n/* Reuse tokens from ARB_texture_rgb10_a2ui */\n/* reuse GL_RGB10_A2UI */\n/* Reuse tokens from ARB_texture_swizzle */\n/* reuse GL_TEXTURE_SWIZZLE_R */\n/* reuse GL_TEXTURE_SWIZZLE_G */\n/* reuse GL_TEXTURE_SWIZZLE_B */\n/* reuse GL_TEXTURE_SWIZZLE_A */\n/* reuse GL_TEXTURE_SWIZZLE_RGBA */\n/* Reuse tokens from ARB_timer_query */\n/* reuse GL_TIME_ELAPSED */\n/* reuse GL_TIMESTAMP */\n/* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */\n/* reuse GL_INT_2_10_10_10_REV */\n#endif\n\n#ifndef GL_VERSION_4_0\n#define GL_SAMPLE_SHADING                 0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE       0x8C37\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F\n#define GL_TEXTURE_CUBE_MAP_ARRAY         0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY   0x900B\n#define GL_SAMPLER_CUBE_MAP_ARRAY         0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW  0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY     0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F\n/* Reuse tokens from ARB_texture_query_lod (none) */\n/* Reuse tokens from ARB_draw_buffers_blend (none) */\n/* Reuse tokens from ARB_draw_indirect */\n/* reuse GL_DRAW_INDIRECT_BUFFER */\n/* reuse GL_DRAW_INDIRECT_BUFFER_BINDING */\n/* Reuse tokens from ARB_gpu_shader5 */\n/* reuse GL_GEOMETRY_SHADER_INVOCATIONS */\n/* reuse GL_MAX_GEOMETRY_SHADER_INVOCATIONS */\n/* reuse GL_MIN_FRAGMENT_INTERPOLATION_OFFSET */\n/* reuse GL_MAX_FRAGMENT_INTERPOLATION_OFFSET */\n/* reuse GL_FRAGMENT_INTERPOLATION_OFFSET_BITS */\n/* reuse GL_MAX_VERTEX_STREAMS */\n/* Reuse tokens from ARB_gpu_shader_fp64 */\n/* reuse GL_DOUBLE_VEC2 */\n/* reuse GL_DOUBLE_VEC3 */\n/* reuse GL_DOUBLE_VEC4 */\n/* reuse GL_DOUBLE_MAT2 */\n/* reuse GL_DOUBLE_MAT3 */\n/* reuse GL_DOUBLE_MAT4 */\n/* reuse GL_DOUBLE_MAT2x3 */\n/* reuse GL_DOUBLE_MAT2x4 */\n/* reuse GL_DOUBLE_MAT3x2 */\n/* reuse GL_DOUBLE_MAT3x4 */\n/* reuse GL_DOUBLE_MAT4x2 */\n/* reuse GL_DOUBLE_MAT4x3 */\n/* Reuse tokens from ARB_shader_subroutine */\n/* reuse GL_ACTIVE_SUBROUTINES */\n/* reuse GL_ACTIVE_SUBROUTINE_UNIFORMS */\n/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS */\n/* reuse GL_ACTIVE_SUBROUTINE_MAX_LENGTH */\n/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH */\n/* reuse GL_MAX_SUBROUTINES */\n/* reuse GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS */\n/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */\n/* reuse GL_COMPATIBLE_SUBROUTINES */\n/* Reuse tokens from ARB_tessellation_shader */\n/* reuse GL_PATCHES */\n/* reuse GL_PATCH_VERTICES */\n/* reuse GL_PATCH_DEFAULT_INNER_LEVEL */\n/* reuse GL_PATCH_DEFAULT_OUTER_LEVEL */\n/* reuse GL_TESS_CONTROL_OUTPUT_VERTICES */\n/* reuse GL_TESS_GEN_MODE */\n/* reuse GL_TESS_GEN_SPACING */\n/* reuse GL_TESS_GEN_VERTEX_ORDER */\n/* reuse GL_TESS_GEN_POINT_MODE */\n/* reuse GL_ISOLINES */\n/* reuse GL_FRACTIONAL_ODD */\n/* reuse GL_FRACTIONAL_EVEN */\n/* reuse GL_MAX_PATCH_VERTICES */\n/* reuse GL_MAX_TESS_GEN_LEVEL */\n/* reuse GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS */\n/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS */\n/* reuse GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS */\n/* reuse GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS */\n/* reuse GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS */\n/* reuse GL_MAX_TESS_PATCH_COMPONENTS */\n/* reuse GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS */\n/* reuse GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS */\n/* reuse GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS */\n/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS */\n/* reuse GL_MAX_TESS_CONTROL_INPUT_COMPONENTS */\n/* reuse GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS */\n/* reuse GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS */\n/* reuse GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS */\n/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER */\n/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER */\n/* reuse GL_TESS_EVALUATION_SHADER */\n/* reuse GL_TESS_CONTROL_SHADER */\n/* Reuse tokens from ARB_texture_buffer_object_rgb32 (none) */\n/* Reuse tokens from ARB_transform_feedback2 */\n/* reuse GL_TRANSFORM_FEEDBACK */\n/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */\n/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */\n/* reuse GL_TRANSFORM_FEEDBACK_BINDING */\n/* Reuse tokens from ARB_transform_feedback3 */\n/* reuse GL_MAX_TRANSFORM_FEEDBACK_BUFFERS */\n/* reuse GL_MAX_VERTEX_STREAMS */\n#endif\n\n#ifndef GL_VERSION_4_1\n/* Reuse tokens from ARB_ES2_compatibility */\n/* reuse GL_FIXED */\n/* reuse GL_IMPLEMENTATION_COLOR_READ_TYPE */\n/* reuse GL_IMPLEMENTATION_COLOR_READ_FORMAT */\n/* reuse GL_LOW_FLOAT */\n/* reuse GL_MEDIUM_FLOAT */\n/* reuse GL_HIGH_FLOAT */\n/* reuse GL_LOW_INT */\n/* reuse GL_MEDIUM_INT */\n/* reuse GL_HIGH_INT */\n/* reuse GL_SHADER_COMPILER */\n/* reuse GL_SHADER_BINARY_FORMATS */\n/* reuse GL_NUM_SHADER_BINARY_FORMATS */\n/* reuse GL_MAX_VERTEX_UNIFORM_VECTORS */\n/* reuse GL_MAX_VARYING_VECTORS */\n/* reuse GL_MAX_FRAGMENT_UNIFORM_VECTORS */\n/* reuse GL_RGB565 */\n/* Reuse tokens from ARB_get_program_binary */\n/* reuse GL_PROGRAM_BINARY_RETRIEVABLE_HINT */\n/* reuse GL_PROGRAM_BINARY_LENGTH */\n/* reuse GL_NUM_PROGRAM_BINARY_FORMATS */\n/* reuse GL_PROGRAM_BINARY_FORMATS */\n/* Reuse tokens from ARB_separate_shader_objects */\n/* reuse GL_VERTEX_SHADER_BIT */\n/* reuse GL_FRAGMENT_SHADER_BIT */\n/* reuse GL_GEOMETRY_SHADER_BIT */\n/* reuse GL_TESS_CONTROL_SHADER_BIT */\n/* reuse GL_TESS_EVALUATION_SHADER_BIT */\n/* reuse GL_ALL_SHADER_BITS */\n/* reuse GL_PROGRAM_SEPARABLE */\n/* reuse GL_ACTIVE_PROGRAM */\n/* reuse GL_PROGRAM_PIPELINE_BINDING */\n/* Reuse tokens from ARB_shader_precision (none) */\n/* Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already */\n/* Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already */\n/* reuse GL_MAX_VIEWPORTS */\n/* reuse GL_VIEWPORT_SUBPIXEL_BITS */\n/* reuse GL_VIEWPORT_BOUNDS_RANGE */\n/* reuse GL_LAYER_PROVOKING_VERTEX */\n/* reuse GL_VIEWPORT_INDEX_PROVOKING_VERTEX */\n/* reuse GL_UNDEFINED_VERTEX */\n#endif\n\n#ifndef GL_VERSION_4_2\n/* Reuse tokens from ARB_base_instance (none) */\n/* Reuse tokens from ARB_shading_language_420pack (none) */\n/* Reuse tokens from ARB_transform_feedback_instanced (none) */\n/* Reuse tokens from ARB_compressed_texture_pixel_storage */\n/* reuse GL_UNPACK_COMPRESSED_BLOCK_WIDTH */\n/* reuse GL_UNPACK_COMPRESSED_BLOCK_HEIGHT */\n/* reuse GL_UNPACK_COMPRESSED_BLOCK_DEPTH */\n/* reuse GL_UNPACK_COMPRESSED_BLOCK_SIZE */\n/* reuse GL_PACK_COMPRESSED_BLOCK_WIDTH */\n/* reuse GL_PACK_COMPRESSED_BLOCK_HEIGHT */\n/* reuse GL_PACK_COMPRESSED_BLOCK_DEPTH */\n/* reuse GL_PACK_COMPRESSED_BLOCK_SIZE */\n/* Reuse tokens from ARB_conservative_depth (none) */\n/* Reuse tokens from ARB_internalformat_query */\n/* reuse GL_NUM_SAMPLE_COUNTS */\n/* Reuse tokens from ARB_map_buffer_alignment */\n/* reuse GL_MIN_MAP_BUFFER_ALIGNMENT */\n/* Reuse tokens from ARB_shader_atomic_counters */\n/* reuse GL_ATOMIC_COUNTER_BUFFER */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_BINDING */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_START */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_SIZE */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER */\n/* reuse GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS */\n/* reuse GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS */\n/* reuse GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS */\n/* reuse GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS */\n/* reuse GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS */\n/* reuse GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS */\n/* reuse GL_MAX_VERTEX_ATOMIC_COUNTERS */\n/* reuse GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS */\n/* reuse GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS */\n/* reuse GL_MAX_GEOMETRY_ATOMIC_COUNTERS */\n/* reuse GL_MAX_FRAGMENT_ATOMIC_COUNTERS */\n/* reuse GL_MAX_COMBINED_ATOMIC_COUNTERS */\n/* reuse GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE */\n/* reuse GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS */\n/* reuse GL_ACTIVE_ATOMIC_COUNTER_BUFFERS */\n/* reuse GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX */\n/* reuse GL_UNSIGNED_INT_ATOMIC_COUNTER */\n/* Reuse tokens from ARB_shader_image_load_store */\n/* reuse GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT */\n/* reuse GL_ELEMENT_ARRAY_BARRIER_BIT */\n/* reuse GL_UNIFORM_BARRIER_BIT */\n/* reuse GL_TEXTURE_FETCH_BARRIER_BIT */\n/* reuse GL_SHADER_IMAGE_ACCESS_BARRIER_BIT */\n/* reuse GL_COMMAND_BARRIER_BIT */\n/* reuse GL_PIXEL_BUFFER_BARRIER_BIT */\n/* reuse GL_TEXTURE_UPDATE_BARRIER_BIT */\n/* reuse GL_BUFFER_UPDATE_BARRIER_BIT */\n/* reuse GL_FRAMEBUFFER_BARRIER_BIT */\n/* reuse GL_TRANSFORM_FEEDBACK_BARRIER_BIT */\n/* reuse GL_ATOMIC_COUNTER_BARRIER_BIT */\n/* reuse GL_ALL_BARRIER_BITS */\n/* reuse GL_MAX_IMAGE_UNITS */\n/* reuse GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS */\n/* reuse GL_IMAGE_BINDING_NAME */\n/* reuse GL_IMAGE_BINDING_LEVEL */\n/* reuse GL_IMAGE_BINDING_LAYERED */\n/* reuse GL_IMAGE_BINDING_LAYER */\n/* reuse GL_IMAGE_BINDING_ACCESS */\n/* reuse GL_IMAGE_1D */\n/* reuse GL_IMAGE_2D */\n/* reuse GL_IMAGE_3D */\n/* reuse GL_IMAGE_2D_RECT */\n/* reuse GL_IMAGE_CUBE */\n/* reuse GL_IMAGE_BUFFER */\n/* reuse GL_IMAGE_1D_ARRAY */\n/* reuse GL_IMAGE_2D_ARRAY */\n/* reuse GL_IMAGE_CUBE_MAP_ARRAY */\n/* reuse GL_IMAGE_2D_MULTISAMPLE */\n/* reuse GL_IMAGE_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_INT_IMAGE_1D */\n/* reuse GL_INT_IMAGE_2D */\n/* reuse GL_INT_IMAGE_3D */\n/* reuse GL_INT_IMAGE_2D_RECT */\n/* reuse GL_INT_IMAGE_CUBE */\n/* reuse GL_INT_IMAGE_BUFFER */\n/* reuse GL_INT_IMAGE_1D_ARRAY */\n/* reuse GL_INT_IMAGE_2D_ARRAY */\n/* reuse GL_INT_IMAGE_CUBE_MAP_ARRAY */\n/* reuse GL_INT_IMAGE_2D_MULTISAMPLE */\n/* reuse GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_UNSIGNED_INT_IMAGE_1D */\n/* reuse GL_UNSIGNED_INT_IMAGE_2D */\n/* reuse GL_UNSIGNED_INT_IMAGE_3D */\n/* reuse GL_UNSIGNED_INT_IMAGE_2D_RECT */\n/* reuse GL_UNSIGNED_INT_IMAGE_CUBE */\n/* reuse GL_UNSIGNED_INT_IMAGE_BUFFER */\n/* reuse GL_UNSIGNED_INT_IMAGE_1D_ARRAY */\n/* reuse GL_UNSIGNED_INT_IMAGE_2D_ARRAY */\n/* reuse GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY */\n/* reuse GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE */\n/* reuse GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_MAX_IMAGE_SAMPLES */\n/* reuse GL_IMAGE_BINDING_FORMAT */\n/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_TYPE */\n/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE */\n/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS */\n/* reuse GL_MAX_VERTEX_IMAGE_UNIFORMS */\n/* reuse GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS */\n/* reuse GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS */\n/* reuse GL_MAX_GEOMETRY_IMAGE_UNIFORMS */\n/* reuse GL_MAX_FRAGMENT_IMAGE_UNIFORMS */\n/* reuse GL_MAX_COMBINED_IMAGE_UNIFORMS */\n/* Reuse tokens from ARB_shading_language_packing (none) */\n/* Reuse tokens from ARB_texture_storage */\n/* reuse GL_TEXTURE_IMMUTABLE_FORMAT */\n#endif\n\n#ifndef GL_VERSION_4_3\n#define GL_NUM_SHADING_LANGUAGE_VERSIONS  0x82E9\n#define GL_VERTEX_ATTRIB_ARRAY_LONG       0x874E\n/* Reuse tokens from ARB_arrays_of_arrays (none, GLSL only) */\n/* Reuse tokens from ARB_fragment_layer_viewport (none, GLSL only) */\n/* Reuse tokens from ARB_shader_image_size (none, GLSL only) */\n/* Reuse tokens from ARB_ES3_compatibility */\n/* reuse GL_COMPRESSED_RGB8_ETC2 */\n/* reuse GL_COMPRESSED_SRGB8_ETC2 */\n/* reuse GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 */\n/* reuse GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 */\n/* reuse GL_COMPRESSED_RGBA8_ETC2_EAC */\n/* reuse GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC */\n/* reuse GL_COMPRESSED_R11_EAC */\n/* reuse GL_COMPRESSED_SIGNED_R11_EAC */\n/* reuse GL_COMPRESSED_RG11_EAC */\n/* reuse GL_COMPRESSED_SIGNED_RG11_EAC */\n/* reuse GL_PRIMITIVE_RESTART_FIXED_INDEX */\n/* reuse GL_ANY_SAMPLES_PASSED_CONSERVATIVE */\n/* reuse GL_MAX_ELEMENT_INDEX */\n/* Reuse tokens from ARB_clear_buffer_object (none) */\n/* Reuse tokens from ARB_compute_shader */\n/* reuse GL_COMPUTE_SHADER */\n/* reuse GL_MAX_COMPUTE_UNIFORM_BLOCKS */\n/* reuse GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS */\n/* reuse GL_MAX_COMPUTE_IMAGE_UNIFORMS */\n/* reuse GL_MAX_COMPUTE_SHARED_MEMORY_SIZE */\n/* reuse GL_MAX_COMPUTE_UNIFORM_COMPONENTS */\n/* reuse GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS */\n/* reuse GL_MAX_COMPUTE_ATOMIC_COUNTERS */\n/* reuse GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS */\n/* reuse GL_MAX_COMPUTE_LOCAL_INVOCATIONS */\n/* reuse GL_MAX_COMPUTE_WORK_GROUP_COUNT */\n/* reuse GL_MAX_COMPUTE_WORK_GROUP_SIZE */\n/* reuse GL_COMPUTE_LOCAL_WORK_SIZE */\n/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER */\n/* reuse GL_DISPATCH_INDIRECT_BUFFER */\n/* reuse GL_DISPATCH_INDIRECT_BUFFER_BINDING */\n/* Reuse tokens from ARB_copy_image (none) */\n/* Reuse tokens from KHR_debug */\n/* reuse GL_DEBUG_OUTPUT_SYNCHRONOUS */\n/* reuse GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH */\n/* reuse GL_DEBUG_CALLBACK_FUNCTION */\n/* reuse GL_DEBUG_CALLBACK_USER_PARAM */\n/* reuse GL_DEBUG_SOURCE_API */\n/* reuse GL_DEBUG_SOURCE_WINDOW_SYSTEM */\n/* reuse GL_DEBUG_SOURCE_SHADER_COMPILER */\n/* reuse GL_DEBUG_SOURCE_THIRD_PARTY */\n/* reuse GL_DEBUG_SOURCE_APPLICATION */\n/* reuse GL_DEBUG_SOURCE_OTHER */\n/* reuse GL_DEBUG_TYPE_ERROR */\n/* reuse GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR */\n/* reuse GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR */\n/* reuse GL_DEBUG_TYPE_PORTABILITY */\n/* reuse GL_DEBUG_TYPE_PERFORMANCE */\n/* reuse GL_DEBUG_TYPE_OTHER */\n/* reuse GL_MAX_DEBUG_MESSAGE_LENGTH */\n/* reuse GL_MAX_DEBUG_LOGGED_MESSAGES */\n/* reuse GL_DEBUG_LOGGED_MESSAGES */\n/* reuse GL_DEBUG_SEVERITY_HIGH */\n/* reuse GL_DEBUG_SEVERITY_MEDIUM */\n/* reuse GL_DEBUG_SEVERITY_LOW */\n/* reuse GL_DEBUG_TYPE_MARKER */\n/* reuse GL_DEBUG_TYPE_PUSH_GROUP */\n/* reuse GL_DEBUG_TYPE_POP_GROUP */\n/* reuse GL_DEBUG_SEVERITY_NOTIFICATION */\n/* reuse GL_MAX_DEBUG_GROUP_STACK_DEPTH */\n/* reuse GL_DEBUG_GROUP_STACK_DEPTH */\n/* reuse GL_BUFFER */\n/* reuse GL_SHADER */\n/* reuse GL_PROGRAM */\n/* reuse GL_QUERY */\n/* reuse GL_PROGRAM_PIPELINE */\n/* reuse GL_SAMPLER */\n/* reuse GL_DISPLAY_LIST */\n/* reuse GL_MAX_LABEL_LENGTH */\n/* reuse GL_DEBUG_OUTPUT */\n/* reuse GL_CONTEXT_FLAG_DEBUG_BIT */\n/* reuse GL_STACK_UNDERFLOW */\n/* reuse GL_STACK_OVERFLOW */\n/* Reuse tokens from ARB_explicit_uniform_location */\n/* reuse GL_MAX_UNIFORM_LOCATIONS */\n/* Reuse tokens from ARB_framebuffer_no_attachments */\n/* reuse GL_FRAMEBUFFER_DEFAULT_WIDTH */\n/* reuse GL_FRAMEBUFFER_DEFAULT_HEIGHT */\n/* reuse GL_FRAMEBUFFER_DEFAULT_LAYERS */\n/* reuse GL_FRAMEBUFFER_DEFAULT_SAMPLES */\n/* reuse GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS */\n/* reuse GL_MAX_FRAMEBUFFER_WIDTH */\n/* reuse GL_MAX_FRAMEBUFFER_HEIGHT */\n/* reuse GL_MAX_FRAMEBUFFER_LAYERS */\n/* reuse GL_MAX_FRAMEBUFFER_SAMPLES */\n/* Reuse tokens from ARB_internalformat_query2 */\n/* reuse GL_INTERNALFORMAT_SUPPORTED */\n/* reuse GL_INTERNALFORMAT_PREFERRED */\n/* reuse GL_INTERNALFORMAT_RED_SIZE */\n/* reuse GL_INTERNALFORMAT_GREEN_SIZE */\n/* reuse GL_INTERNALFORMAT_BLUE_SIZE */\n/* reuse GL_INTERNALFORMAT_ALPHA_SIZE */\n/* reuse GL_INTERNALFORMAT_DEPTH_SIZE */\n/* reuse GL_INTERNALFORMAT_STENCIL_SIZE */\n/* reuse GL_INTERNALFORMAT_SHARED_SIZE */\n/* reuse GL_INTERNALFORMAT_RED_TYPE */\n/* reuse GL_INTERNALFORMAT_GREEN_TYPE */\n/* reuse GL_INTERNALFORMAT_BLUE_TYPE */\n/* reuse GL_INTERNALFORMAT_ALPHA_TYPE */\n/* reuse GL_INTERNALFORMAT_DEPTH_TYPE */\n/* reuse GL_INTERNALFORMAT_STENCIL_TYPE */\n/* reuse GL_MAX_WIDTH */\n/* reuse GL_MAX_HEIGHT */\n/* reuse GL_MAX_DEPTH */\n/* reuse GL_MAX_LAYERS */\n/* reuse GL_MAX_COMBINED_DIMENSIONS */\n/* reuse GL_COLOR_COMPONENTS */\n/* reuse GL_DEPTH_COMPONENTS */\n/* reuse GL_STENCIL_COMPONENTS */\n/* reuse GL_COLOR_RENDERABLE */\n/* reuse GL_DEPTH_RENDERABLE */\n/* reuse GL_STENCIL_RENDERABLE */\n/* reuse GL_FRAMEBUFFER_RENDERABLE */\n/* reuse GL_FRAMEBUFFER_RENDERABLE_LAYERED */\n/* reuse GL_FRAMEBUFFER_BLEND */\n/* reuse GL_READ_PIXELS */\n/* reuse GL_READ_PIXELS_FORMAT */\n/* reuse GL_READ_PIXELS_TYPE */\n/* reuse GL_TEXTURE_IMAGE_FORMAT */\n/* reuse GL_TEXTURE_IMAGE_TYPE */\n/* reuse GL_GET_TEXTURE_IMAGE_FORMAT */\n/* reuse GL_GET_TEXTURE_IMAGE_TYPE */\n/* reuse GL_MIPMAP */\n/* reuse GL_MANUAL_GENERATE_MIPMAP */\n/* reuse GL_AUTO_GENERATE_MIPMAP */\n/* reuse GL_COLOR_ENCODING */\n/* reuse GL_SRGB_READ */\n/* reuse GL_SRGB_WRITE */\n/* reuse GL_FILTER */\n/* reuse GL_VERTEX_TEXTURE */\n/* reuse GL_TESS_CONTROL_TEXTURE */\n/* reuse GL_TESS_EVALUATION_TEXTURE */\n/* reuse GL_GEOMETRY_TEXTURE */\n/* reuse GL_FRAGMENT_TEXTURE */\n/* reuse GL_COMPUTE_TEXTURE */\n/* reuse GL_TEXTURE_SHADOW */\n/* reuse GL_TEXTURE_GATHER */\n/* reuse GL_TEXTURE_GATHER_SHADOW */\n/* reuse GL_SHADER_IMAGE_LOAD */\n/* reuse GL_SHADER_IMAGE_STORE */\n/* reuse GL_SHADER_IMAGE_ATOMIC */\n/* reuse GL_IMAGE_TEXEL_SIZE */\n/* reuse GL_IMAGE_COMPATIBILITY_CLASS */\n/* reuse GL_IMAGE_PIXEL_FORMAT */\n/* reuse GL_IMAGE_PIXEL_TYPE */\n/* reuse GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST */\n/* reuse GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST */\n/* reuse GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE */\n/* reuse GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE */\n/* reuse GL_TEXTURE_COMPRESSED_BLOCK_WIDTH */\n/* reuse GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT */\n/* reuse GL_TEXTURE_COMPRESSED_BLOCK_SIZE */\n/* reuse GL_CLEAR_BUFFER */\n/* reuse GL_TEXTURE_VIEW */\n/* reuse GL_VIEW_COMPATIBILITY_CLASS */\n/* reuse GL_FULL_SUPPORT */\n/* reuse GL_CAVEAT_SUPPORT */\n/* reuse GL_IMAGE_CLASS_4_X_32 */\n/* reuse GL_IMAGE_CLASS_2_X_32 */\n/* reuse GL_IMAGE_CLASS_1_X_32 */\n/* reuse GL_IMAGE_CLASS_4_X_16 */\n/* reuse GL_IMAGE_CLASS_2_X_16 */\n/* reuse GL_IMAGE_CLASS_1_X_16 */\n/* reuse GL_IMAGE_CLASS_4_X_8 */\n/* reuse GL_IMAGE_CLASS_2_X_8 */\n/* reuse GL_IMAGE_CLASS_1_X_8 */\n/* reuse GL_IMAGE_CLASS_11_11_10 */\n/* reuse GL_IMAGE_CLASS_10_10_10_2 */\n/* reuse GL_VIEW_CLASS_128_BITS */\n/* reuse GL_VIEW_CLASS_96_BITS */\n/* reuse GL_VIEW_CLASS_64_BITS */\n/* reuse GL_VIEW_CLASS_48_BITS */\n/* reuse GL_VIEW_CLASS_32_BITS */\n/* reuse GL_VIEW_CLASS_24_BITS */\n/* reuse GL_VIEW_CLASS_16_BITS */\n/* reuse GL_VIEW_CLASS_8_BITS */\n/* reuse GL_VIEW_CLASS_S3TC_DXT1_RGB */\n/* reuse GL_VIEW_CLASS_S3TC_DXT1_RGBA */\n/* reuse GL_VIEW_CLASS_S3TC_DXT3_RGBA */\n/* reuse GL_VIEW_CLASS_S3TC_DXT5_RGBA */\n/* reuse GL_VIEW_CLASS_RGTC1_RED */\n/* reuse GL_VIEW_CLASS_RGTC2_RG */\n/* reuse GL_VIEW_CLASS_BPTC_UNORM */\n/* reuse GL_VIEW_CLASS_BPTC_FLOAT */\n/* Reuse tokens from ARB_invalidate_subdata (none) */\n/* Reuse tokens from ARB_multi_draw_indirect (none) */\n/* Reuse tokens from ARB_program_interface_query */\n/* reuse GL_UNIFORM */\n/* reuse GL_UNIFORM_BLOCK */\n/* reuse GL_PROGRAM_INPUT */\n/* reuse GL_PROGRAM_OUTPUT */\n/* reuse GL_BUFFER_VARIABLE */\n/* reuse GL_SHADER_STORAGE_BLOCK */\n/* reuse GL_VERTEX_SUBROUTINE */\n/* reuse GL_TESS_CONTROL_SUBROUTINE */\n/* reuse GL_TESS_EVALUATION_SUBROUTINE */\n/* reuse GL_GEOMETRY_SUBROUTINE */\n/* reuse GL_FRAGMENT_SUBROUTINE */\n/* reuse GL_COMPUTE_SUBROUTINE */\n/* reuse GL_VERTEX_SUBROUTINE_UNIFORM */\n/* reuse GL_TESS_CONTROL_SUBROUTINE_UNIFORM */\n/* reuse GL_TESS_EVALUATION_SUBROUTINE_UNIFORM */\n/* reuse GL_GEOMETRY_SUBROUTINE_UNIFORM */\n/* reuse GL_FRAGMENT_SUBROUTINE_UNIFORM */\n/* reuse GL_COMPUTE_SUBROUTINE_UNIFORM */\n/* reuse GL_TRANSFORM_FEEDBACK_VARYING */\n/* reuse GL_ACTIVE_RESOURCES */\n/* reuse GL_MAX_NAME_LENGTH */\n/* reuse GL_MAX_NUM_ACTIVE_VARIABLES */\n/* reuse GL_MAX_NUM_COMPATIBLE_SUBROUTINES */\n/* reuse GL_NAME_LENGTH */\n/* reuse GL_TYPE */\n/* reuse GL_ARRAY_SIZE */\n/* reuse GL_OFFSET */\n/* reuse GL_BLOCK_INDEX */\n/* reuse GL_ARRAY_STRIDE */\n/* reuse GL_MATRIX_STRIDE */\n/* reuse GL_IS_ROW_MAJOR */\n/* reuse GL_ATOMIC_COUNTER_BUFFER_INDEX */\n/* reuse GL_BUFFER_BINDING */\n/* reuse GL_BUFFER_DATA_SIZE */\n/* reuse GL_NUM_ACTIVE_VARIABLES */\n/* reuse GL_ACTIVE_VARIABLES */\n/* reuse GL_REFERENCED_BY_VERTEX_SHADER */\n/* reuse GL_REFERENCED_BY_TESS_CONTROL_SHADER */\n/* reuse GL_REFERENCED_BY_TESS_EVALUATION_SHADER */\n/* reuse GL_REFERENCED_BY_GEOMETRY_SHADER */\n/* reuse GL_REFERENCED_BY_FRAGMENT_SHADER */\n/* reuse GL_REFERENCED_BY_COMPUTE_SHADER */\n/* reuse GL_TOP_LEVEL_ARRAY_SIZE */\n/* reuse GL_TOP_LEVEL_ARRAY_STRIDE */\n/* reuse GL_LOCATION */\n/* reuse GL_LOCATION_INDEX */\n/* reuse GL_IS_PER_PATCH */\n/* Reuse tokens from ARB_robust_buffer_access_behavior (none) */\n/* Reuse tokens from ARB_shader_storage_buffer_object */\n/* reuse GL_SHADER_STORAGE_BUFFER */\n/* reuse GL_SHADER_STORAGE_BUFFER_BINDING */\n/* reuse GL_SHADER_STORAGE_BUFFER_START */\n/* reuse GL_SHADER_STORAGE_BUFFER_SIZE */\n/* reuse GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS */\n/* reuse GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS */\n/* reuse GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS */\n/* reuse GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS */\n/* reuse GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS */\n/* reuse GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS */\n/* reuse GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS */\n/* reuse GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS */\n/* reuse GL_MAX_SHADER_STORAGE_BLOCK_SIZE */\n/* reuse GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT */\n/* reuse GL_SHADER_STORAGE_BARRIER_BIT */\n/* reuse GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES */\n/* Reuse tokens from ARB_stencil_texturing */\n/* reuse GL_DEPTH_STENCIL_TEXTURE_MODE */\n/* Reuse tokens from ARB_texture_buffer_range */\n/* reuse GL_TEXTURE_BUFFER_OFFSET */\n/* reuse GL_TEXTURE_BUFFER_SIZE */\n/* reuse GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT */\n/* Reuse tokens from ARB_texture_query_levels (none) */\n/* Reuse tokens from ARB_texture_storage_multisample (none) */\n/* Reuse tokens from ARB_texture_view */\n/* reuse GL_TEXTURE_VIEW_MIN_LEVEL */\n/* reuse GL_TEXTURE_VIEW_NUM_LEVELS */\n/* reuse GL_TEXTURE_VIEW_MIN_LAYER */\n/* reuse GL_TEXTURE_VIEW_NUM_LAYERS */\n/* reuse GL_TEXTURE_IMMUTABLE_LEVELS */\n/* Reuse tokens from ARB_vertex_attrib_binding */\n/* reuse GL_VERTEX_ATTRIB_BINDING */\n/* reuse GL_VERTEX_ATTRIB_RELATIVE_OFFSET */\n/* reuse GL_VERTEX_BINDING_DIVISOR */\n/* reuse GL_VERTEX_BINDING_OFFSET */\n/* reuse GL_VERTEX_BINDING_STRIDE */\n/* reuse GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET */\n/* reuse GL_MAX_VERTEX_ATTRIB_BINDINGS */\n#endif\n\n#ifndef GL_ARB_depth_buffer_float\n#define GL_DEPTH_COMPONENT32F             0x8CAC\n#define GL_DEPTH32F_STENCIL8              0x8CAD\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\n#endif\n\n#ifndef GL_ARB_framebuffer_object\n#define GL_INVALID_FRAMEBUFFER_OPERATION  0x0506\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\n#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\n#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\n#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\n#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\n#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\n#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\n#define GL_FRAMEBUFFER_DEFAULT            0x8218\n#define GL_FRAMEBUFFER_UNDEFINED          0x8219\n#define GL_DEPTH_STENCIL_ATTACHMENT       0x821A\n#define GL_MAX_RENDERBUFFER_SIZE          0x84E8\n#define GL_DEPTH_STENCIL                  0x84F9\n#define GL_UNSIGNED_INT_24_8              0x84FA\n#define GL_DEPTH24_STENCIL8               0x88F0\n#define GL_TEXTURE_STENCIL_SIZE           0x88F1\n#define GL_TEXTURE_RED_TYPE               0x8C10\n#define GL_TEXTURE_GREEN_TYPE             0x8C11\n#define GL_TEXTURE_BLUE_TYPE              0x8C12\n#define GL_TEXTURE_ALPHA_TYPE             0x8C13\n#define GL_TEXTURE_DEPTH_TYPE             0x8C16\n#define GL_UNSIGNED_NORMALIZED            0x8C17\n#define GL_FRAMEBUFFER_BINDING            0x8CA6\n#define GL_DRAW_FRAMEBUFFER_BINDING       GL_FRAMEBUFFER_BINDING\n#define GL_RENDERBUFFER_BINDING           0x8CA7\n#define GL_READ_FRAMEBUFFER               0x8CA8\n#define GL_DRAW_FRAMEBUFFER               0x8CA9\n#define GL_READ_FRAMEBUFFER_BINDING       0x8CAA\n#define GL_RENDERBUFFER_SAMPLES           0x8CAB\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0\n#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\n#define GL_FRAMEBUFFER_COMPLETE           0x8CD5\n#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6\n#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\n#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB\n#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC\n#define GL_FRAMEBUFFER_UNSUPPORTED        0x8CDD\n#define GL_MAX_COLOR_ATTACHMENTS          0x8CDF\n#define GL_COLOR_ATTACHMENT0              0x8CE0\n#define GL_COLOR_ATTACHMENT1              0x8CE1\n#define GL_COLOR_ATTACHMENT2              0x8CE2\n#define GL_COLOR_ATTACHMENT3              0x8CE3\n#define GL_COLOR_ATTACHMENT4              0x8CE4\n#define GL_COLOR_ATTACHMENT5              0x8CE5\n#define GL_COLOR_ATTACHMENT6              0x8CE6\n#define GL_COLOR_ATTACHMENT7              0x8CE7\n#define GL_COLOR_ATTACHMENT8              0x8CE8\n#define GL_COLOR_ATTACHMENT9              0x8CE9\n#define GL_COLOR_ATTACHMENT10             0x8CEA\n#define GL_COLOR_ATTACHMENT11             0x8CEB\n#define GL_COLOR_ATTACHMENT12             0x8CEC\n#define GL_COLOR_ATTACHMENT13             0x8CED\n#define GL_COLOR_ATTACHMENT14             0x8CEE\n#define GL_COLOR_ATTACHMENT15             0x8CEF\n#define GL_DEPTH_ATTACHMENT               0x8D00\n#define GL_STENCIL_ATTACHMENT             0x8D20\n#define GL_FRAMEBUFFER                    0x8D40\n#define GL_RENDERBUFFER                   0x8D41\n#define GL_RENDERBUFFER_WIDTH             0x8D42\n#define GL_RENDERBUFFER_HEIGHT            0x8D43\n#define GL_RENDERBUFFER_INTERNAL_FORMAT   0x8D44\n#define GL_STENCIL_INDEX1                 0x8D46\n#define GL_STENCIL_INDEX4                 0x8D47\n#define GL_STENCIL_INDEX8                 0x8D48\n#define GL_STENCIL_INDEX16                0x8D49\n#define GL_RENDERBUFFER_RED_SIZE          0x8D50\n#define GL_RENDERBUFFER_GREEN_SIZE        0x8D51\n#define GL_RENDERBUFFER_BLUE_SIZE         0x8D52\n#define GL_RENDERBUFFER_ALPHA_SIZE        0x8D53\n#define GL_RENDERBUFFER_DEPTH_SIZE        0x8D54\n#define GL_RENDERBUFFER_STENCIL_SIZE      0x8D55\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\n#define GL_MAX_SAMPLES                    0x8D57\n#endif\n\n#ifndef GL_ARB_framebuffer_sRGB\n#define GL_FRAMEBUFFER_SRGB               0x8DB9\n#endif\n\n#ifndef GL_ARB_half_float_vertex\n#define GL_HALF_FLOAT                     0x140B\n#endif\n\n#ifndef GL_ARB_map_buffer_range\n#define GL_MAP_READ_BIT                   0x0001\n#define GL_MAP_WRITE_BIT                  0x0002\n#define GL_MAP_INVALIDATE_RANGE_BIT       0x0004\n#define GL_MAP_INVALIDATE_BUFFER_BIT      0x0008\n#define GL_MAP_FLUSH_EXPLICIT_BIT         0x0010\n#define GL_MAP_UNSYNCHRONIZED_BIT         0x0020\n#endif\n\n#ifndef GL_ARB_texture_compression_rgtc\n#define GL_COMPRESSED_RED_RGTC1           0x8DBB\n#define GL_COMPRESSED_SIGNED_RED_RGTC1    0x8DBC\n#define GL_COMPRESSED_RG_RGTC2            0x8DBD\n#define GL_COMPRESSED_SIGNED_RG_RGTC2     0x8DBE\n#endif\n\n#ifndef GL_ARB_texture_rg\n#define GL_RG                             0x8227\n#define GL_RG_INTEGER                     0x8228\n#define GL_R8                             0x8229\n#define GL_R16                            0x822A\n#define GL_RG8                            0x822B\n#define GL_RG16                           0x822C\n#define GL_R16F                           0x822D\n#define GL_R32F                           0x822E\n#define GL_RG16F                          0x822F\n#define GL_RG32F                          0x8230\n#define GL_R8I                            0x8231\n#define GL_R8UI                           0x8232\n#define GL_R16I                           0x8233\n#define GL_R16UI                          0x8234\n#define GL_R32I                           0x8235\n#define GL_R32UI                          0x8236\n#define GL_RG8I                           0x8237\n#define GL_RG8UI                          0x8238\n#define GL_RG16I                          0x8239\n#define GL_RG16UI                         0x823A\n#define GL_RG32I                          0x823B\n#define GL_RG32UI                         0x823C\n#endif\n\n#ifndef GL_ARB_vertex_array_object\n#define GL_VERTEX_ARRAY_BINDING           0x85B5\n#endif\n\n#ifndef GL_ARB_uniform_buffer_object\n#define GL_UNIFORM_BUFFER                 0x8A11\n#define GL_UNIFORM_BUFFER_BINDING         0x8A28\n#define GL_UNIFORM_BUFFER_START           0x8A29\n#define GL_UNIFORM_BUFFER_SIZE            0x8A2A\n#define GL_MAX_VERTEX_UNIFORM_BLOCKS      0x8A2B\n#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS    0x8A2C\n#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS    0x8A2D\n#define GL_MAX_COMBINED_UNIFORM_BLOCKS    0x8A2E\n#define GL_MAX_UNIFORM_BUFFER_BINDINGS    0x8A2F\n#define GL_MAX_UNIFORM_BLOCK_SIZE         0x8A30\n#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31\n#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32\n#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33\n#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34\n#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35\n#define GL_ACTIVE_UNIFORM_BLOCKS          0x8A36\n#define GL_UNIFORM_TYPE                   0x8A37\n#define GL_UNIFORM_SIZE                   0x8A38\n#define GL_UNIFORM_NAME_LENGTH            0x8A39\n#define GL_UNIFORM_BLOCK_INDEX            0x8A3A\n#define GL_UNIFORM_OFFSET                 0x8A3B\n#define GL_UNIFORM_ARRAY_STRIDE           0x8A3C\n#define GL_UNIFORM_MATRIX_STRIDE          0x8A3D\n#define GL_UNIFORM_IS_ROW_MAJOR           0x8A3E\n#define GL_UNIFORM_BLOCK_BINDING          0x8A3F\n#define GL_UNIFORM_BLOCK_DATA_SIZE        0x8A40\n#define GL_UNIFORM_BLOCK_NAME_LENGTH      0x8A41\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS  0x8A42\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46\n#define GL_INVALID_INDEX                  0xFFFFFFFFu\n#endif\n\n#ifndef GL_ARB_copy_buffer\n#define GL_COPY_READ_BUFFER_BINDING       0x8F36\n#define GL_COPY_READ_BUFFER               GL_COPY_READ_BUFFER_BINDING\n#define GL_COPY_WRITE_BUFFER_BINDING      0x8F37\n#define GL_COPY_WRITE_BUFFER              GL_COPY_WRITE_BUFFER_BINDING\n#endif\n\n#ifndef GL_ARB_depth_clamp\n#define GL_DEPTH_CLAMP                    0x864F\n#endif\n\n#ifndef GL_ARB_draw_elements_base_vertex\n#endif\n\n#ifndef GL_ARB_fragment_coord_conventions\n#endif\n\n#ifndef GL_ARB_provoking_vertex\n#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C\n#define GL_FIRST_VERTEX_CONVENTION        0x8E4D\n#define GL_LAST_VERTEX_CONVENTION         0x8E4E\n#define GL_PROVOKING_VERTEX               0x8E4F\n#endif\n\n#ifndef GL_ARB_seamless_cube_map\n#define GL_TEXTURE_CUBE_MAP_SEAMLESS      0x884F\n#endif\n\n#ifndef GL_ARB_sync\n#define GL_MAX_SERVER_WAIT_TIMEOUT        0x9111\n#define GL_OBJECT_TYPE                    0x9112\n#define GL_SYNC_CONDITION                 0x9113\n#define GL_SYNC_STATUS                    0x9114\n#define GL_SYNC_FLAGS                     0x9115\n#define GL_SYNC_FENCE                     0x9116\n#define GL_SYNC_GPU_COMMANDS_COMPLETE     0x9117\n#define GL_UNSIGNALED                     0x9118\n#define GL_SIGNALED                       0x9119\n#define GL_ALREADY_SIGNALED               0x911A\n#define GL_TIMEOUT_EXPIRED                0x911B\n#define GL_CONDITION_SATISFIED            0x911C\n#define GL_WAIT_FAILED                    0x911D\n#define GL_SYNC_FLUSH_COMMANDS_BIT        0x00000001\n#define GL_TIMEOUT_IGNORED                0xFFFFFFFFFFFFFFFFull\n#endif\n\n#ifndef GL_ARB_texture_multisample\n#define GL_SAMPLE_POSITION                0x8E50\n#define GL_SAMPLE_MASK                    0x8E51\n#define GL_SAMPLE_MASK_VALUE              0x8E52\n#define GL_MAX_SAMPLE_MASK_WORDS          0x8E59\n#define GL_TEXTURE_2D_MULTISAMPLE         0x9100\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE   0x9101\n#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY   0x9102\n#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104\n#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105\n#define GL_TEXTURE_SAMPLES                0x9106\n#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107\n#define GL_SAMPLER_2D_MULTISAMPLE         0x9108\n#define GL_INT_SAMPLER_2D_MULTISAMPLE     0x9109\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\n#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY   0x910B\n#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\n#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\n#define GL_MAX_COLOR_TEXTURE_SAMPLES      0x910E\n#define GL_MAX_DEPTH_TEXTURE_SAMPLES      0x910F\n#define GL_MAX_INTEGER_SAMPLES            0x9110\n#endif\n\n#ifndef GL_ARB_vertex_array_bgra\n/* reuse GL_BGRA */\n#endif\n\n#ifndef GL_ARB_draw_buffers_blend\n#endif\n\n#ifndef GL_ARB_sample_shading\n#define GL_SAMPLE_SHADING_ARB             0x8C36\n#define GL_MIN_SAMPLE_SHADING_VALUE_ARB   0x8C37\n#endif\n\n#ifndef GL_ARB_texture_cube_map_array\n#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB     0x9009\n#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A\n#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B\n#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB     0x900C\n#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D\n#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E\n#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F\n#endif\n\n#ifndef GL_ARB_texture_gather\n#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F\n#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F\n#endif\n\n#ifndef GL_ARB_texture_query_lod\n#endif\n\n#ifndef GL_ARB_shading_language_include\n#define GL_SHADER_INCLUDE_ARB             0x8DAE\n#define GL_NAMED_STRING_LENGTH_ARB        0x8DE9\n#define GL_NAMED_STRING_TYPE_ARB          0x8DEA\n#endif\n\n#ifndef GL_ARB_texture_compression_bptc\n#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C\n#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D\n#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E\n#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F\n#endif\n\n#ifndef GL_ARB_blend_func_extended\n#define GL_SRC1_COLOR                     0x88F9\n/* reuse GL_SRC1_ALPHA */\n#define GL_ONE_MINUS_SRC1_COLOR           0x88FA\n#define GL_ONE_MINUS_SRC1_ALPHA           0x88FB\n#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS   0x88FC\n#endif\n\n#ifndef GL_ARB_explicit_attrib_location\n#endif\n\n#ifndef GL_ARB_occlusion_query2\n#define GL_ANY_SAMPLES_PASSED             0x8C2F\n#endif\n\n#ifndef GL_ARB_sampler_objects\n#define GL_SAMPLER_BINDING                0x8919\n#endif\n\n#ifndef GL_ARB_shader_bit_encoding\n#endif\n\n#ifndef GL_ARB_texture_rgb10_a2ui\n#define GL_RGB10_A2UI                     0x906F\n#endif\n\n#ifndef GL_ARB_texture_swizzle\n#define GL_TEXTURE_SWIZZLE_R              0x8E42\n#define GL_TEXTURE_SWIZZLE_G              0x8E43\n#define GL_TEXTURE_SWIZZLE_B              0x8E44\n#define GL_TEXTURE_SWIZZLE_A              0x8E45\n#define GL_TEXTURE_SWIZZLE_RGBA           0x8E46\n#endif\n\n#ifndef GL_ARB_timer_query\n#define GL_TIME_ELAPSED                   0x88BF\n#define GL_TIMESTAMP                      0x8E28\n#endif\n\n#ifndef GL_ARB_vertex_type_2_10_10_10_rev\n/* reuse GL_UNSIGNED_INT_2_10_10_10_REV */\n#define GL_INT_2_10_10_10_REV             0x8D9F\n#endif\n\n#ifndef GL_ARB_draw_indirect\n#define GL_DRAW_INDIRECT_BUFFER           0x8F3F\n#define GL_DRAW_INDIRECT_BUFFER_BINDING   0x8F43\n#endif\n\n#ifndef GL_ARB_gpu_shader5\n#define GL_GEOMETRY_SHADER_INVOCATIONS    0x887F\n#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A\n#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B\n#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C\n#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D\n/* reuse GL_MAX_VERTEX_STREAMS */\n#endif\n\n#ifndef GL_ARB_gpu_shader_fp64\n/* reuse GL_DOUBLE */\n#define GL_DOUBLE_VEC2                    0x8FFC\n#define GL_DOUBLE_VEC3                    0x8FFD\n#define GL_DOUBLE_VEC4                    0x8FFE\n#define GL_DOUBLE_MAT2                    0x8F46\n#define GL_DOUBLE_MAT3                    0x8F47\n#define GL_DOUBLE_MAT4                    0x8F48\n#define GL_DOUBLE_MAT2x3                  0x8F49\n#define GL_DOUBLE_MAT2x4                  0x8F4A\n#define GL_DOUBLE_MAT3x2                  0x8F4B\n#define GL_DOUBLE_MAT3x4                  0x8F4C\n#define GL_DOUBLE_MAT4x2                  0x8F4D\n#define GL_DOUBLE_MAT4x3                  0x8F4E\n#endif\n\n#ifndef GL_ARB_shader_subroutine\n#define GL_ACTIVE_SUBROUTINES             0x8DE5\n#define GL_ACTIVE_SUBROUTINE_UNIFORMS     0x8DE6\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47\n#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH   0x8E48\n#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49\n#define GL_MAX_SUBROUTINES                0x8DE7\n#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8\n#define GL_NUM_COMPATIBLE_SUBROUTINES     0x8E4A\n#define GL_COMPATIBLE_SUBROUTINES         0x8E4B\n/* reuse GL_UNIFORM_SIZE */\n/* reuse GL_UNIFORM_NAME_LENGTH */\n#endif\n\n#ifndef GL_ARB_tessellation_shader\n#define GL_PATCHES                        0x000E\n#define GL_PATCH_VERTICES                 0x8E72\n#define GL_PATCH_DEFAULT_INNER_LEVEL      0x8E73\n#define GL_PATCH_DEFAULT_OUTER_LEVEL      0x8E74\n#define GL_TESS_CONTROL_OUTPUT_VERTICES   0x8E75\n#define GL_TESS_GEN_MODE                  0x8E76\n#define GL_TESS_GEN_SPACING               0x8E77\n#define GL_TESS_GEN_VERTEX_ORDER          0x8E78\n#define GL_TESS_GEN_POINT_MODE            0x8E79\n/* reuse GL_TRIANGLES */\n/* reuse GL_QUADS */\n#define GL_ISOLINES                       0x8E7A\n/* reuse GL_EQUAL */\n#define GL_FRACTIONAL_ODD                 0x8E7B\n#define GL_FRACTIONAL_EVEN                0x8E7C\n/* reuse GL_CCW */\n/* reuse GL_CW */\n#define GL_MAX_PATCH_VERTICES             0x8E7D\n#define GL_MAX_TESS_GEN_LEVEL             0x8E7E\n#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F\n#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80\n#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81\n#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82\n#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83\n#define GL_MAX_TESS_PATCH_COMPONENTS      0x8E84\n#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85\n#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86\n#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89\n#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A\n#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C\n#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D\n#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E\n#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1\n#define GL_TESS_EVALUATION_SHADER         0x8E87\n#define GL_TESS_CONTROL_SHADER            0x8E88\n#endif\n\n#ifndef GL_ARB_texture_buffer_object_rgb32\n/* reuse GL_RGB32F */\n/* reuse GL_RGB32UI */\n/* reuse GL_RGB32I */\n#endif\n\n#ifndef GL_ARB_transform_feedback2\n#define GL_TRANSFORM_FEEDBACK             0x8E22\n#define GL_TRANSFORM_FEEDBACK_PAUSED      0x8E23\n#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED GL_TRANSFORM_FEEDBACK_PAUSED\n#define GL_TRANSFORM_FEEDBACK_ACTIVE      0x8E24\n#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE GL_TRANSFORM_FEEDBACK_ACTIVE\n#define GL_TRANSFORM_FEEDBACK_BINDING     0x8E25\n#endif\n\n#ifndef GL_ARB_transform_feedback3\n#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70\n#define GL_MAX_VERTEX_STREAMS             0x8E71\n#endif\n\n#ifndef GL_ARB_ES2_compatibility\n#define GL_FIXED                          0x140C\n#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A\n#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B\n#define GL_LOW_FLOAT                      0x8DF0\n#define GL_MEDIUM_FLOAT                   0x8DF1\n#define GL_HIGH_FLOAT                     0x8DF2\n#define GL_LOW_INT                        0x8DF3\n#define GL_MEDIUM_INT                     0x8DF4\n#define GL_HIGH_INT                       0x8DF5\n#define GL_SHADER_COMPILER                0x8DFA\n#define GL_SHADER_BINARY_FORMATS          0x8DF8\n#define GL_NUM_SHADER_BINARY_FORMATS      0x8DF9\n#define GL_MAX_VERTEX_UNIFORM_VECTORS     0x8DFB\n#define GL_MAX_VARYING_VECTORS            0x8DFC\n#define GL_MAX_FRAGMENT_UNIFORM_VECTORS   0x8DFD\n#define GL_RGB565                         0x8D62\n#endif\n\n#ifndef GL_ARB_get_program_binary\n#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257\n#define GL_PROGRAM_BINARY_LENGTH          0x8741\n#define GL_NUM_PROGRAM_BINARY_FORMATS     0x87FE\n#define GL_PROGRAM_BINARY_FORMATS         0x87FF\n#endif\n\n#ifndef GL_ARB_separate_shader_objects\n#define GL_VERTEX_SHADER_BIT              0x00000001\n#define GL_FRAGMENT_SHADER_BIT            0x00000002\n#define GL_GEOMETRY_SHADER_BIT            0x00000004\n#define GL_TESS_CONTROL_SHADER_BIT        0x00000008\n#define GL_TESS_EVALUATION_SHADER_BIT     0x00000010\n#define GL_ALL_SHADER_BITS                0xFFFFFFFF\n#define GL_PROGRAM_SEPARABLE              0x8258\n#define GL_ACTIVE_PROGRAM                 0x8259\n#define GL_PROGRAM_PIPELINE_BINDING       0x825A\n#endif\n\n#ifndef GL_ARB_shader_precision\n#endif\n\n#ifndef GL_ARB_vertex_attrib_64bit\n/* reuse GL_RGB32I */\n/* reuse GL_DOUBLE_VEC2 */\n/* reuse GL_DOUBLE_VEC3 */\n/* reuse GL_DOUBLE_VEC4 */\n/* reuse GL_DOUBLE_MAT2 */\n/* reuse GL_DOUBLE_MAT3 */\n/* reuse GL_DOUBLE_MAT4 */\n/* reuse GL_DOUBLE_MAT2x3 */\n/* reuse GL_DOUBLE_MAT2x4 */\n/* reuse GL_DOUBLE_MAT3x2 */\n/* reuse GL_DOUBLE_MAT3x4 */\n/* reuse GL_DOUBLE_MAT4x2 */\n/* reuse GL_DOUBLE_MAT4x3 */\n#endif\n\n#ifndef GL_ARB_viewport_array\n/* reuse GL_SCISSOR_BOX */\n/* reuse GL_VIEWPORT */\n/* reuse GL_DEPTH_RANGE */\n/* reuse GL_SCISSOR_TEST */\n#define GL_MAX_VIEWPORTS                  0x825B\n#define GL_VIEWPORT_SUBPIXEL_BITS         0x825C\n#define GL_VIEWPORT_BOUNDS_RANGE          0x825D\n#define GL_LAYER_PROVOKING_VERTEX         0x825E\n#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F\n#define GL_UNDEFINED_VERTEX               0x8260\n/* reuse GL_FIRST_VERTEX_CONVENTION */\n/* reuse GL_LAST_VERTEX_CONVENTION */\n/* reuse GL_PROVOKING_VERTEX */\n#endif\n\n#ifndef GL_ARB_cl_event\n#define GL_SYNC_CL_EVENT_ARB              0x8240\n#define GL_SYNC_CL_EVENT_COMPLETE_ARB     0x8241\n#endif\n\n#ifndef GL_ARB_debug_output\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB   0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION_ARB    0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM_ARB  0x8245\n#define GL_DEBUG_SOURCE_API_ARB           0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB   0x8249\n#define GL_DEBUG_SOURCE_APPLICATION_ARB   0x824A\n#define GL_DEBUG_SOURCE_OTHER_ARB         0x824B\n#define GL_DEBUG_TYPE_ERROR_ARB           0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E\n#define GL_DEBUG_TYPE_PORTABILITY_ARB     0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE_ARB     0x8250\n#define GL_DEBUG_TYPE_OTHER_ARB           0x8251\n#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB   0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB  0x9144\n#define GL_DEBUG_LOGGED_MESSAGES_ARB      0x9145\n#define GL_DEBUG_SEVERITY_HIGH_ARB        0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM_ARB      0x9147\n#define GL_DEBUG_SEVERITY_LOW_ARB         0x9148\n#endif\n\n#ifndef GL_ARB_robustness\n/* reuse GL_NO_ERROR */\n#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004\n#define GL_LOSE_CONTEXT_ON_RESET_ARB      0x8252\n#define GL_GUILTY_CONTEXT_RESET_ARB       0x8253\n#define GL_INNOCENT_CONTEXT_RESET_ARB     0x8254\n#define GL_UNKNOWN_CONTEXT_RESET_ARB      0x8255\n#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n#define GL_NO_RESET_NOTIFICATION_ARB      0x8261\n#endif\n\n#ifndef GL_ARB_shader_stencil_export\n#endif\n\n#ifndef GL_ARB_base_instance\n#endif\n\n#ifndef GL_ARB_shading_language_420pack\n#endif\n\n#ifndef GL_ARB_transform_feedback_instanced\n#endif\n\n#ifndef GL_ARB_compressed_texture_pixel_storage\n#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH  0x9127\n#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128\n#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH  0x9129\n#define GL_UNPACK_COMPRESSED_BLOCK_SIZE   0x912A\n#define GL_PACK_COMPRESSED_BLOCK_WIDTH    0x912B\n#define GL_PACK_COMPRESSED_BLOCK_HEIGHT   0x912C\n#define GL_PACK_COMPRESSED_BLOCK_DEPTH    0x912D\n#define GL_PACK_COMPRESSED_BLOCK_SIZE     0x912E\n#endif\n\n#ifndef GL_ARB_conservative_depth\n#endif\n\n#ifndef GL_ARB_internalformat_query\n#define GL_NUM_SAMPLE_COUNTS              0x9380\n#endif\n\n#ifndef GL_ARB_map_buffer_alignment\n#define GL_MIN_MAP_BUFFER_ALIGNMENT       0x90BC\n#endif\n\n#ifndef GL_ARB_shader_atomic_counters\n#define GL_ATOMIC_COUNTER_BUFFER          0x92C0\n#define GL_ATOMIC_COUNTER_BUFFER_BINDING  0x92C1\n#define GL_ATOMIC_COUNTER_BUFFER_START    0x92C2\n#define GL_ATOMIC_COUNTER_BUFFER_SIZE     0x92C3\n#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5\n#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB\n#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0\n#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1\n#define GL_MAX_VERTEX_ATOMIC_COUNTERS     0x92D2\n#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3\n#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4\n#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS   0x92D5\n#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS   0x92D6\n#define GL_MAX_COMBINED_ATOMIC_COUNTERS   0x92D7\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8\n#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC\n#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS  0x92D9\n#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA\n#define GL_UNSIGNED_INT_ATOMIC_COUNTER    0x92DB\n#endif\n\n#ifndef GL_ARB_shader_image_load_store\n#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001\n#define GL_ELEMENT_ARRAY_BARRIER_BIT      0x00000002\n#define GL_UNIFORM_BARRIER_BIT            0x00000004\n#define GL_TEXTURE_FETCH_BARRIER_BIT      0x00000008\n#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020\n#define GL_COMMAND_BARRIER_BIT            0x00000040\n#define GL_PIXEL_BUFFER_BARRIER_BIT       0x00000080\n#define GL_TEXTURE_UPDATE_BARRIER_BIT     0x00000100\n#define GL_BUFFER_UPDATE_BARRIER_BIT      0x00000200\n#define GL_FRAMEBUFFER_BARRIER_BIT        0x00000400\n#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800\n#define GL_ATOMIC_COUNTER_BARRIER_BIT     0x00001000\n#define GL_ALL_BARRIER_BITS               0xFFFFFFFF\n#define GL_MAX_IMAGE_UNITS                0x8F38\n#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39\n#define GL_IMAGE_BINDING_NAME             0x8F3A\n#define GL_IMAGE_BINDING_LEVEL            0x8F3B\n#define GL_IMAGE_BINDING_LAYERED          0x8F3C\n#define GL_IMAGE_BINDING_LAYER            0x8F3D\n#define GL_IMAGE_BINDING_ACCESS           0x8F3E\n#define GL_IMAGE_1D                       0x904C\n#define GL_IMAGE_2D                       0x904D\n#define GL_IMAGE_3D                       0x904E\n#define GL_IMAGE_2D_RECT                  0x904F\n#define GL_IMAGE_CUBE                     0x9050\n#define GL_IMAGE_BUFFER                   0x9051\n#define GL_IMAGE_1D_ARRAY                 0x9052\n#define GL_IMAGE_2D_ARRAY                 0x9053\n#define GL_IMAGE_CUBE_MAP_ARRAY           0x9054\n#define GL_IMAGE_2D_MULTISAMPLE           0x9055\n#define GL_IMAGE_2D_MULTISAMPLE_ARRAY     0x9056\n#define GL_INT_IMAGE_1D                   0x9057\n#define GL_INT_IMAGE_2D                   0x9058\n#define GL_INT_IMAGE_3D                   0x9059\n#define GL_INT_IMAGE_2D_RECT              0x905A\n#define GL_INT_IMAGE_CUBE                 0x905B\n#define GL_INT_IMAGE_BUFFER               0x905C\n#define GL_INT_IMAGE_1D_ARRAY             0x905D\n#define GL_INT_IMAGE_2D_ARRAY             0x905E\n#define GL_INT_IMAGE_CUBE_MAP_ARRAY       0x905F\n#define GL_INT_IMAGE_2D_MULTISAMPLE       0x9060\n#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061\n#define GL_UNSIGNED_INT_IMAGE_1D          0x9062\n#define GL_UNSIGNED_INT_IMAGE_2D          0x9063\n#define GL_UNSIGNED_INT_IMAGE_3D          0x9064\n#define GL_UNSIGNED_INT_IMAGE_2D_RECT     0x9065\n#define GL_UNSIGNED_INT_IMAGE_CUBE        0x9066\n#define GL_UNSIGNED_INT_IMAGE_BUFFER      0x9067\n#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY    0x9068\n#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY    0x9069\n#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B\n#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C\n#define GL_MAX_IMAGE_SAMPLES              0x906D\n#define GL_IMAGE_BINDING_FORMAT           0x906E\n#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8\n#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9\n#define GL_MAX_VERTEX_IMAGE_UNIFORMS      0x90CA\n#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB\n#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC\n#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS    0x90CD\n#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS    0x90CE\n#define GL_MAX_COMBINED_IMAGE_UNIFORMS    0x90CF\n#endif\n\n#ifndef GL_ARB_shading_language_packing\n#endif\n\n#ifndef GL_ARB_texture_storage\n#define GL_TEXTURE_IMMUTABLE_FORMAT       0x912F\n#endif\n\n#ifndef GL_KHR_texture_compression_astc_ldr\n#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR   0x93B0\n#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR   0x93B1\n#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR   0x93B2\n#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR   0x93B3\n#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR   0x93B4\n#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR   0x93B5\n#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR   0x93B6\n#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR   0x93B7\n#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR  0x93B8\n#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR  0x93B9\n#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR  0x93BA\n#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB\n#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC\n#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC\n#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD\n#endif\n\n#ifndef GL_KHR_debug\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS       0x8242\n#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243\n#define GL_DEBUG_CALLBACK_FUNCTION        0x8244\n#define GL_DEBUG_CALLBACK_USER_PARAM      0x8245\n#define GL_DEBUG_SOURCE_API               0x8246\n#define GL_DEBUG_SOURCE_WINDOW_SYSTEM     0x8247\n#define GL_DEBUG_SOURCE_SHADER_COMPILER   0x8248\n#define GL_DEBUG_SOURCE_THIRD_PARTY       0x8249\n#define GL_DEBUG_SOURCE_APPLICATION       0x824A\n#define GL_DEBUG_SOURCE_OTHER             0x824B\n#define GL_DEBUG_TYPE_ERROR               0x824C\n#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D\n#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR  0x824E\n#define GL_DEBUG_TYPE_PORTABILITY         0x824F\n#define GL_DEBUG_TYPE_PERFORMANCE         0x8250\n#define GL_DEBUG_TYPE_OTHER               0x8251\n#define GL_DEBUG_TYPE_MARKER              0x8268\n#define GL_DEBUG_TYPE_PUSH_GROUP          0x8269\n#define GL_DEBUG_TYPE_POP_GROUP           0x826A\n#define GL_DEBUG_SEVERITY_NOTIFICATION    0x826B\n#define GL_MAX_DEBUG_GROUP_STACK_DEPTH    0x826C\n#define GL_DEBUG_GROUP_STACK_DEPTH        0x826D\n#define GL_BUFFER                         0x82E0\n#define GL_SHADER                         0x82E1\n#define GL_PROGRAM                        0x82E2\n#define GL_QUERY                          0x82E3\n#define GL_PROGRAM_PIPELINE               0x82E4\n#define GL_SAMPLER                        0x82E6\n#define GL_DISPLAY_LIST                   0x82E7\n/* DISPLAY_LIST used in compatibility profile only */\n#define GL_MAX_LABEL_LENGTH               0x82E8\n#define GL_MAX_DEBUG_MESSAGE_LENGTH       0x9143\n#define GL_MAX_DEBUG_LOGGED_MESSAGES      0x9144\n#define GL_DEBUG_LOGGED_MESSAGES          0x9145\n#define GL_DEBUG_SEVERITY_HIGH            0x9146\n#define GL_DEBUG_SEVERITY_MEDIUM          0x9147\n#define GL_DEBUG_SEVERITY_LOW             0x9148\n#define GL_DEBUG_OUTPUT                   0x92E0\n#define GL_CONTEXT_FLAG_DEBUG_BIT         0x00000002\n/* reuse GL_STACK_UNDERFLOW */\n/* reuse GL_STACK_OVERFLOW */\n#endif\n\n#ifndef GL_ARB_arrays_of_arrays\n#endif\n\n#ifndef GL_ARB_clear_buffer_object\n#endif\n\n#ifndef GL_ARB_compute_shader\n#define GL_COMPUTE_SHADER                 0x91B9\n#define GL_MAX_COMPUTE_UNIFORM_BLOCKS     0x91BB\n#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC\n#define GL_MAX_COMPUTE_IMAGE_UNIFORMS     0x91BD\n#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262\n#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263\n#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264\n#define GL_MAX_COMPUTE_ATOMIC_COUNTERS    0x8265\n#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266\n#define GL_MAX_COMPUTE_LOCAL_INVOCATIONS  0x90EB\n#define GL_MAX_COMPUTE_WORK_GROUP_COUNT   0x91BE\n#define GL_MAX_COMPUTE_WORK_GROUP_SIZE    0x91BF\n#define GL_COMPUTE_LOCAL_WORK_SIZE        0x8267\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC\n#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED\n#define GL_DISPATCH_INDIRECT_BUFFER       0x90EE\n#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF\n#define GL_COMPUTE_SHADER_BIT             0x00000020\n#endif\n\n#ifndef GL_ARB_copy_image\n#endif\n\n#ifndef GL_ARB_texture_view\n#define GL_TEXTURE_VIEW_MIN_LEVEL         0x82DB\n#define GL_TEXTURE_VIEW_NUM_LEVELS        0x82DC\n#define GL_TEXTURE_VIEW_MIN_LAYER         0x82DD\n#define GL_TEXTURE_VIEW_NUM_LAYERS        0x82DE\n#define GL_TEXTURE_IMMUTABLE_LEVELS       0x82DF\n#endif\n\n#ifndef GL_ARB_vertex_attrib_binding\n#define GL_VERTEX_ATTRIB_BINDING          0x82D4\n#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET  0x82D5\n#define GL_VERTEX_BINDING_DIVISOR         0x82D6\n#define GL_VERTEX_BINDING_OFFSET          0x82D7\n#define GL_VERTEX_BINDING_STRIDE          0x82D8\n#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9\n#define GL_MAX_VERTEX_ATTRIB_BINDINGS     0x82DA\n#endif\n\n#ifndef GL_ARB_robustness_isolation\n#endif\n\n#ifndef GL_ARB_ES3_compatibility\n#define GL_COMPRESSED_RGB8_ETC2           0x9274\n#define GL_COMPRESSED_SRGB8_ETC2          0x9275\n#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276\n#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277\n#define GL_COMPRESSED_RGBA8_ETC2_EAC      0x9278\n#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279\n#define GL_COMPRESSED_R11_EAC             0x9270\n#define GL_COMPRESSED_SIGNED_R11_EAC      0x9271\n#define GL_COMPRESSED_RG11_EAC            0x9272\n#define GL_COMPRESSED_SIGNED_RG11_EAC     0x9273\n#define GL_PRIMITIVE_RESTART_FIXED_INDEX  0x8D69\n#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A\n#define GL_MAX_ELEMENT_INDEX              0x8D6B\n#endif\n\n#ifndef GL_ARB_explicit_uniform_location\n#define GL_MAX_UNIFORM_LOCATIONS          0x826E\n#endif\n\n#ifndef GL_ARB_fragment_layer_viewport\n#endif\n\n#ifndef GL_ARB_framebuffer_no_attachments\n#define GL_FRAMEBUFFER_DEFAULT_WIDTH      0x9310\n#define GL_FRAMEBUFFER_DEFAULT_HEIGHT     0x9311\n#define GL_FRAMEBUFFER_DEFAULT_LAYERS     0x9312\n#define GL_FRAMEBUFFER_DEFAULT_SAMPLES    0x9313\n#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314\n#define GL_MAX_FRAMEBUFFER_WIDTH          0x9315\n#define GL_MAX_FRAMEBUFFER_HEIGHT         0x9316\n#define GL_MAX_FRAMEBUFFER_LAYERS         0x9317\n#define GL_MAX_FRAMEBUFFER_SAMPLES        0x9318\n#endif\n\n#ifndef GL_ARB_internalformat_query2\n/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_TYPE */\n/* reuse GL_NUM_SAMPLE_COUNTS */\n/* reuse GL_RENDERBUFFER */\n/* reuse GL_SAMPLES */\n/* reuse GL_TEXTURE_1D */\n/* reuse GL_TEXTURE_1D_ARRAY */\n/* reuse GL_TEXTURE_2D */\n/* reuse GL_TEXTURE_2D_ARRAY */\n/* reuse GL_TEXTURE_3D */\n/* reuse GL_TEXTURE_CUBE_MAP */\n/* reuse GL_TEXTURE_CUBE_MAP_ARRAY */\n/* reuse GL_TEXTURE_RECTANGLE */\n/* reuse GL_TEXTURE_BUFFER */\n/* reuse GL_TEXTURE_2D_MULTISAMPLE */\n/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */\n/* reuse GL_TEXTURE_COMPRESSED */\n#define GL_INTERNALFORMAT_SUPPORTED       0x826F\n#define GL_INTERNALFORMAT_PREFERRED       0x8270\n#define GL_INTERNALFORMAT_RED_SIZE        0x8271\n#define GL_INTERNALFORMAT_GREEN_SIZE      0x8272\n#define GL_INTERNALFORMAT_BLUE_SIZE       0x8273\n#define GL_INTERNALFORMAT_ALPHA_SIZE      0x8274\n#define GL_INTERNALFORMAT_DEPTH_SIZE      0x8275\n#define GL_INTERNALFORMAT_STENCIL_SIZE    0x8276\n#define GL_INTERNALFORMAT_SHARED_SIZE     0x8277\n#define GL_INTERNALFORMAT_RED_TYPE        0x8278\n#define GL_INTERNALFORMAT_GREEN_TYPE      0x8279\n#define GL_INTERNALFORMAT_BLUE_TYPE       0x827A\n#define GL_INTERNALFORMAT_ALPHA_TYPE      0x827B\n#define GL_INTERNALFORMAT_DEPTH_TYPE      0x827C\n#define GL_INTERNALFORMAT_STENCIL_TYPE    0x827D\n#define GL_MAX_WIDTH                      0x827E\n#define GL_MAX_HEIGHT                     0x827F\n#define GL_MAX_DEPTH                      0x8280\n#define GL_MAX_LAYERS                     0x8281\n#define GL_MAX_COMBINED_DIMENSIONS        0x8282\n#define GL_COLOR_COMPONENTS               0x8283\n#define GL_DEPTH_COMPONENTS               0x8284\n#define GL_STENCIL_COMPONENTS             0x8285\n#define GL_COLOR_RENDERABLE               0x8286\n#define GL_DEPTH_RENDERABLE               0x8287\n#define GL_STENCIL_RENDERABLE             0x8288\n#define GL_FRAMEBUFFER_RENDERABLE         0x8289\n#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A\n#define GL_FRAMEBUFFER_BLEND              0x828B\n#define GL_READ_PIXELS                    0x828C\n#define GL_READ_PIXELS_FORMAT             0x828D\n#define GL_READ_PIXELS_TYPE               0x828E\n#define GL_TEXTURE_IMAGE_FORMAT           0x828F\n#define GL_TEXTURE_IMAGE_TYPE             0x8290\n#define GL_GET_TEXTURE_IMAGE_FORMAT       0x8291\n#define GL_GET_TEXTURE_IMAGE_TYPE         0x8292\n#define GL_MIPMAP                         0x8293\n#define GL_MANUAL_GENERATE_MIPMAP         0x8294\n#define GL_AUTO_GENERATE_MIPMAP           0x8295\n#define GL_COLOR_ENCODING                 0x8296\n#define GL_SRGB_READ                      0x8297\n#define GL_SRGB_WRITE                     0x8298\n#define GL_SRGB_DECODE_ARB                0x8299\n#define GL_FILTER                         0x829A\n#define GL_VERTEX_TEXTURE                 0x829B\n#define GL_TESS_CONTROL_TEXTURE           0x829C\n#define GL_TESS_EVALUATION_TEXTURE        0x829D\n#define GL_GEOMETRY_TEXTURE               0x829E\n#define GL_FRAGMENT_TEXTURE               0x829F\n#define GL_COMPUTE_TEXTURE                0x82A0\n#define GL_TEXTURE_SHADOW                 0x82A1\n#define GL_TEXTURE_GATHER                 0x82A2\n#define GL_TEXTURE_GATHER_SHADOW          0x82A3\n#define GL_SHADER_IMAGE_LOAD              0x82A4\n#define GL_SHADER_IMAGE_STORE             0x82A5\n#define GL_SHADER_IMAGE_ATOMIC            0x82A6\n#define GL_IMAGE_TEXEL_SIZE               0x82A7\n#define GL_IMAGE_COMPATIBILITY_CLASS      0x82A8\n#define GL_IMAGE_PIXEL_FORMAT             0x82A9\n#define GL_IMAGE_PIXEL_TYPE               0x82AA\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD\n#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE\n#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF\n#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1\n#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2\n#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE  0x82B3\n#define GL_CLEAR_BUFFER                   0x82B4\n#define GL_TEXTURE_VIEW                   0x82B5\n#define GL_VIEW_COMPATIBILITY_CLASS       0x82B6\n#define GL_FULL_SUPPORT                   0x82B7\n#define GL_CAVEAT_SUPPORT                 0x82B8\n#define GL_IMAGE_CLASS_4_X_32             0x82B9\n#define GL_IMAGE_CLASS_2_X_32             0x82BA\n#define GL_IMAGE_CLASS_1_X_32             0x82BB\n#define GL_IMAGE_CLASS_4_X_16             0x82BC\n#define GL_IMAGE_CLASS_2_X_16             0x82BD\n#define GL_IMAGE_CLASS_1_X_16             0x82BE\n#define GL_IMAGE_CLASS_4_X_8              0x82BF\n#define GL_IMAGE_CLASS_2_X_8              0x82C0\n#define GL_IMAGE_CLASS_1_X_8              0x82C1\n#define GL_IMAGE_CLASS_11_11_10           0x82C2\n#define GL_IMAGE_CLASS_10_10_10_2         0x82C3\n#define GL_VIEW_CLASS_128_BITS            0x82C4\n#define GL_VIEW_CLASS_96_BITS             0x82C5\n#define GL_VIEW_CLASS_64_BITS             0x82C6\n#define GL_VIEW_CLASS_48_BITS             0x82C7\n#define GL_VIEW_CLASS_32_BITS             0x82C8\n#define GL_VIEW_CLASS_24_BITS             0x82C9\n#define GL_VIEW_CLASS_16_BITS             0x82CA\n#define GL_VIEW_CLASS_8_BITS              0x82CB\n#define GL_VIEW_CLASS_S3TC_DXT1_RGB       0x82CC\n#define GL_VIEW_CLASS_S3TC_DXT1_RGBA      0x82CD\n#define GL_VIEW_CLASS_S3TC_DXT3_RGBA      0x82CE\n#define GL_VIEW_CLASS_S3TC_DXT5_RGBA      0x82CF\n#define GL_VIEW_CLASS_RGTC1_RED           0x82D0\n#define GL_VIEW_CLASS_RGTC2_RG            0x82D1\n#define GL_VIEW_CLASS_BPTC_UNORM          0x82D2\n#define GL_VIEW_CLASS_BPTC_FLOAT          0x82D3\n#endif\n\n#ifndef GL_ARB_invalidate_subdata\n#endif\n\n#ifndef GL_ARB_multi_draw_indirect\n#endif\n\n#ifndef GL_ARB_program_interface_query\n#define GL_UNIFORM                        0x92E1\n#define GL_UNIFORM_BLOCK                  0x92E2\n#define GL_PROGRAM_INPUT                  0x92E3\n#define GL_PROGRAM_OUTPUT                 0x92E4\n#define GL_BUFFER_VARIABLE                0x92E5\n#define GL_SHADER_STORAGE_BLOCK           0x92E6\n/* reuse GL_ATOMIC_COUNTER_BUFFER */\n#define GL_VERTEX_SUBROUTINE              0x92E8\n#define GL_TESS_CONTROL_SUBROUTINE        0x92E9\n#define GL_TESS_EVALUATION_SUBROUTINE     0x92EA\n#define GL_GEOMETRY_SUBROUTINE            0x92EB\n#define GL_FRAGMENT_SUBROUTINE            0x92EC\n#define GL_COMPUTE_SUBROUTINE             0x92ED\n#define GL_VERTEX_SUBROUTINE_UNIFORM      0x92EE\n#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF\n#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0\n#define GL_GEOMETRY_SUBROUTINE_UNIFORM    0x92F1\n#define GL_FRAGMENT_SUBROUTINE_UNIFORM    0x92F2\n#define GL_COMPUTE_SUBROUTINE_UNIFORM     0x92F3\n#define GL_TRANSFORM_FEEDBACK_VARYING     0x92F4\n#define GL_ACTIVE_RESOURCES               0x92F5\n#define GL_MAX_NAME_LENGTH                0x92F6\n#define GL_MAX_NUM_ACTIVE_VARIABLES       0x92F7\n#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8\n#define GL_NAME_LENGTH                    0x92F9\n#define GL_TYPE                           0x92FA\n#define GL_ARRAY_SIZE                     0x92FB\n#define GL_OFFSET                         0x92FC\n#define GL_BLOCK_INDEX                    0x92FD\n#define GL_ARRAY_STRIDE                   0x92FE\n#define GL_MATRIX_STRIDE                  0x92FF\n#define GL_IS_ROW_MAJOR                   0x9300\n#define GL_ATOMIC_COUNTER_BUFFER_INDEX    0x9301\n#define GL_BUFFER_BINDING                 0x9302\n#define GL_BUFFER_DATA_SIZE               0x9303\n#define GL_NUM_ACTIVE_VARIABLES           0x9304\n#define GL_ACTIVE_VARIABLES               0x9305\n#define GL_REFERENCED_BY_VERTEX_SHADER    0x9306\n#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307\n#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308\n#define GL_REFERENCED_BY_GEOMETRY_SHADER  0x9309\n#define GL_REFERENCED_BY_FRAGMENT_SHADER  0x930A\n#define GL_REFERENCED_BY_COMPUTE_SHADER   0x930B\n#define GL_TOP_LEVEL_ARRAY_SIZE           0x930C\n#define GL_TOP_LEVEL_ARRAY_STRIDE         0x930D\n#define GL_LOCATION                       0x930E\n#define GL_LOCATION_INDEX                 0x930F\n#define GL_IS_PER_PATCH                   0x92E7\n/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */\n/* reuse GL_COMPATIBLE_SUBROUTINES */\n#endif\n\n#ifndef GL_ARB_robust_buffer_access_behavior\n#endif\n\n#ifndef GL_ARB_shader_image_size\n#endif\n\n#ifndef GL_ARB_shader_storage_buffer_object\n#define GL_SHADER_STORAGE_BUFFER          0x90D2\n#define GL_SHADER_STORAGE_BUFFER_BINDING  0x90D3\n#define GL_SHADER_STORAGE_BUFFER_START    0x90D4\n#define GL_SHADER_STORAGE_BUFFER_SIZE     0x90D5\n#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6\n#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7\n#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8\n#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9\n#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA\n#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB\n#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC\n#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD\n#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE  0x90DE\n#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF\n#define GL_SHADER_STORAGE_BARRIER_BIT     0x2000\n#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS\n/* reuse GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS */\n#endif\n\n#ifndef GL_ARB_stencil_texturing\n#define GL_DEPTH_STENCIL_TEXTURE_MODE     0x90EA\n#endif\n\n#ifndef GL_ARB_texture_buffer_range\n#define GL_TEXTURE_BUFFER_OFFSET          0x919D\n#define GL_TEXTURE_BUFFER_SIZE            0x919E\n#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F\n#endif\n\n#ifndef GL_ARB_texture_query_levels\n#endif\n\n#ifndef GL_ARB_texture_storage_multisample\n#endif\n\n\n/*************************************************************/\n\n#include <stddef.h>\n#ifndef GL_VERSION_2_0\n/* GL type for program/shader text */\ntypedef char GLchar;\n#endif\n\n#ifndef GL_VERSION_1_5\n/* GL types for handling large vertex buffer objects */\ntypedef ptrdiff_t GLintptr;\ntypedef ptrdiff_t GLsizeiptr;\n#endif\n\n#ifndef GL_ARB_vertex_buffer_object\n/* GL types for handling large vertex buffer objects */\ntypedef ptrdiff_t GLintptrARB;\ntypedef ptrdiff_t GLsizeiptrARB;\n#endif\n\n#ifndef GL_ARB_shader_objects\n/* GL types for program/shader text and shader object handles */\ntypedef char GLcharARB;\ntypedef unsigned int GLhandleARB;\n#endif\n\n/* GL type for \"half\" precision (s10e5) float data in host memory */\n#ifndef GL_ARB_half_float_pixel\ntypedef unsigned short GLhalfARB;\n#endif\n\n#ifndef GL_NV_half_float\ntypedef unsigned short GLhalfNV;\n#endif\n\n#ifndef GLEXT_64_TYPES_DEFINED\n/* This code block is duplicated in glxext.h, so must be protected */\n#define GLEXT_64_TYPES_DEFINED\n/* Define int32_t, int64_t, and uint64_t types for UST/MSC */\n/* (as used in the GL_EXT_timer_query extension). */\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n#include <inttypes.h>\n#elif defined(__sun__) || defined(__digital__)\n#include <inttypes.h>\n#if defined(__STDC__)\n#if defined(__arch64__) || defined(_LP64)\ntypedef long int int64_t;\ntypedef unsigned long int uint64_t;\n#else\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#endif /* __arch64__ */\n#endif /* __STDC__ */\n#elif defined( __VMS ) || defined(__sgi)\n#include <inttypes.h>\n#elif defined(__SCO__) || defined(__USLC__)\n#include <stdint.h>\n#elif defined(__UNIXOS2__) || defined(__SOL64__)\ntypedef long int int32_t;\ntypedef long long int int64_t;\ntypedef unsigned long long int uint64_t;\n#elif defined(_WIN32) && defined(__GNUC__)\n#include <stdint.h>\n#elif defined(_WIN32)\ntypedef __int32 int32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n#else\n/* Fallback if nothing above works */\n#include <inttypes.h>\n#endif\n#endif\n\n#ifndef GL_EXT_timer_query\ntypedef int64_t GLint64EXT;\ntypedef uint64_t GLuint64EXT;\n#endif\n\n#ifndef GL_ARB_sync\ntypedef int64_t GLint64;\ntypedef uint64_t GLuint64;\ntypedef struct __GLsync *GLsync;\n#endif\n\n#ifndef GL_ARB_cl_event\n/* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */\nstruct _cl_context;\nstruct _cl_event;\n#endif\n\n#ifndef GL_ARB_debug_output\ntypedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);\n#endif\n\n#ifndef GL_AMD_debug_output\ntypedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);\n#endif\n\n#ifndef GL_KHR_debug\ntypedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);\n#endif\n\n#ifndef GL_NV_vdpau_interop\ntypedef GLintptr GLvdpauSurfaceNV;\n#endif\n\n#ifndef GL_VERSION_1_0\n#define GL_VERSION_1_0 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glCullFace (GLenum mode);\nGLAPI void APIENTRY glFrontFace (GLenum mode);\nGLAPI void APIENTRY glHint (GLenum target, GLenum mode);\nGLAPI void APIENTRY glLineWidth (GLfloat width);\nGLAPI void APIENTRY glPointSize (GLfloat size);\nGLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode);\nGLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\nGLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\nGLAPI void APIENTRY glDrawBuffer (GLenum mode);\nGLAPI void APIENTRY glClear (GLbitfield mask);\nGLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI void APIENTRY glClearStencil (GLint s);\nGLAPI void APIENTRY glClearDepth (GLdouble depth);\nGLAPI void APIENTRY glStencilMask (GLuint mask);\nGLAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\nGLAPI void APIENTRY glDepthMask (GLboolean flag);\nGLAPI void APIENTRY glDisable (GLenum cap);\nGLAPI void APIENTRY glEnable (GLenum cap);\nGLAPI void APIENTRY glFinish (void);\nGLAPI void APIENTRY glFlush (void);\nGLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);\nGLAPI void APIENTRY glLogicOp (GLenum opcode);\nGLAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);\nGLAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);\nGLAPI void APIENTRY glDepthFunc (GLenum func);\nGLAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param);\nGLAPI void APIENTRY glReadBuffer (GLenum mode);\nGLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);\nGLAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *params);\nGLAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *params);\nGLAPI GLenum APIENTRY glGetError (void);\nGLAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params);\nGLAPI const GLubyte * APIENTRY glGetString (GLenum name);\nGLAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);\nGLAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);\nGLAPI GLboolean APIENTRY glIsEnabled (GLenum cap);\nGLAPI void APIENTRY glDepthRange (GLdouble near, GLdouble far);\nGLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);\ntypedef void (APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);\ntypedef void (APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size);\ntypedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode);\ntypedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLDRAWBUFFERPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);\ntypedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\ntypedef void (APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);\ntypedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth);\ntypedef void (APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);\ntypedef void (APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\ntypedef void (APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);\ntypedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);\ntypedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap);\ntypedef void (APIENTRYP PFNGLFINISHPROC) (void);\ntypedef void (APIENTRYP PFNGLFLUSHPROC) (void);\ntypedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);\ntypedef void (APIENTRYP PFNGLLOGICOPPROC) (GLenum opcode);\ntypedef void (APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);\ntypedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);\ntypedef void (APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);\ntypedef void (APIENTRYP PFNGLPIXELSTOREFPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLREADBUFFERPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *params);\ntypedef void (APIENTRYP PFNGLGETDOUBLEVPROC) (GLenum pname, GLdouble *params);\ntypedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void);\ntypedef void (APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params);\ntypedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);\ntypedef void (APIENTRYP PFNGLGETTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params);\ntypedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEPROC) (GLdouble near, GLdouble far);\ntypedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);\n#endif\n\n#ifndef GL_VERSION_1_1\n#define GL_VERSION_1_1 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);\nGLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);\nGLAPI void APIENTRY glGetPointerv (GLenum pname, GLvoid* *params);\nGLAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);\nGLAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\nGLAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\nGLAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\nGLAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);\nGLAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);\nGLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);\nGLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);\nGLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);\nGLAPI GLboolean APIENTRY glIsTexture (GLuint texture);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);\ntypedef void (APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, GLvoid* *params);\ntypedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);\ntypedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\ntypedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);\ntypedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);\ntypedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);\ntypedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);\n#endif\n\n#ifndef GL_VERSION_1_2\n#define GL_VERSION_1_2 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\nGLAPI void APIENTRY glBlendEquation (GLenum mode);\nGLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);\nGLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\nGLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);\nGLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);\ntypedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n#endif\n\n#ifndef GL_VERSION_1_3\n#define GL_VERSION_1_3 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glActiveTexture (GLenum texture);\nGLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);\nGLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);\nGLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);\nGLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);\nGLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);\nGLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);\nGLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);\nGLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);\ntypedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img);\n#endif\n\n#ifndef GL_VERSION_1_4\n#define GL_VERSION_1_4 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\nGLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);\nGLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);\nGLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param);\nGLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params);\nGLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param);\nGLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);\n#endif\n\n#ifndef GL_VERSION_1_5\n#define GL_VERSION_1_5 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids);\nGLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);\nGLAPI GLboolean APIENTRY glIsQuery (GLuint id);\nGLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id);\nGLAPI void APIENTRY glEndQuery (GLenum target);\nGLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer);\nGLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);\nGLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);\nGLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer);\nGLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);\nGLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);\nGLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);\nGLAPI GLvoid* APIENTRY glMapBuffer (GLenum target, GLenum access);\nGLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target);\nGLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);\ntypedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);\ntypedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);\ntypedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);\ntypedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);\ntypedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);\ntypedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);\ntypedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);\ntypedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);\ntypedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);\ntypedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params);\n#endif\n\n#ifndef GL_VERSION_2_0\n#define GL_VERSION_2_0 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);\nGLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\nGLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);\nGLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);\nGLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader);\nGLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);\nGLAPI void APIENTRY glCompileShader (GLuint shader);\nGLAPI GLuint APIENTRY glCreateProgram (void);\nGLAPI GLuint APIENTRY glCreateShader (GLenum type);\nGLAPI void APIENTRY glDeleteProgram (GLuint program);\nGLAPI void APIENTRY glDeleteShader (GLuint shader);\nGLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader);\nGLAPI void APIENTRY glDisableVertexAttribArray (GLuint index);\nGLAPI void APIENTRY glEnableVertexAttribArray (GLuint index);\nGLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\nGLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\nGLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);\nGLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\nGLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\nGLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);\nGLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);\nGLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params);\nGLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer);\nGLAPI GLboolean APIENTRY glIsProgram (GLuint program);\nGLAPI GLboolean APIENTRY glIsShader (GLuint shader);\nGLAPI void APIENTRY glLinkProgram (GLuint program);\nGLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);\nGLAPI void APIENTRY glUseProgram (GLuint program);\nGLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0);\nGLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glUniform1i (GLint location, GLint v0);\nGLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glValidateProgram (GLuint program);\nGLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);\nGLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x);\nGLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);\nGLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y);\nGLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);\nGLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z);\nGLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\nGLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\nGLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\nGLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);\ntypedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);\ntypedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\ntypedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);\ntypedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);\ntypedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);\ntypedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);\ntypedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);\ntypedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void);\ntypedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);\ntypedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);\ntypedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);\ntypedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);\ntypedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);\ntypedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);\ntypedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);\ntypedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\ntypedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\ntypedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);\ntypedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer);\ntypedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);\ntypedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader);\ntypedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);\ntypedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);\ntypedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);\ntypedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);\n#endif\n\n#ifndef GL_VERSION_2_1\n#define GL_VERSION_2_1 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n#endif\n\n#ifndef GL_VERSION_3_0\n#define GL_VERSION_3_0 1\n/* OpenGL 3.0 also reuses entry points from these extensions: */\n/* ARB_framebuffer_object */\n/* ARB_map_buffer_range */\n/* ARB_vertex_array_object */\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\nGLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);\nGLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);\nGLAPI void APIENTRY glEnablei (GLenum target, GLuint index);\nGLAPI void APIENTRY glDisablei (GLenum target, GLuint index);\nGLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index);\nGLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode);\nGLAPI void APIENTRY glEndTransformFeedback (void);\nGLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);\nGLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);\nGLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\nGLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp);\nGLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode);\nGLAPI void APIENTRY glEndConditionalRender (void);\nGLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\nGLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x);\nGLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y);\nGLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z);\nGLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);\nGLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x);\nGLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y);\nGLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z);\nGLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\nGLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);\nGLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v);\nGLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v);\nGLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v);\nGLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v);\nGLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);\nGLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name);\nGLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);\nGLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0);\nGLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params);\nGLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params);\nGLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params);\nGLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);\nGLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);\nGLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);\nGLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\nGLAPI const GLubyte * APIENTRY glGetStringi (GLenum name, GLuint index);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\ntypedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);\ntypedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);\ntypedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index);\ntypedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index);\ntypedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index);\ntypedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);\ntypedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);\ntypedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);\ntypedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);\ntypedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\ntypedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp);\ntypedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode);\ntypedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v);\ntypedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);\ntypedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name);\ntypedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);\ntypedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);\ntypedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);\ntypedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params);\ntypedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\ntypedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);\n#endif\n\n#ifndef GL_VERSION_3_1\n#define GL_VERSION_3_1 1\n/* OpenGL 3.1 also reuses entry points from these extensions: */\n/* ARB_copy_buffer */\n/* ARB_uniform_buffer_object */\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);\nGLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);\nGLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer);\nGLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);\ntypedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer);\ntypedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index);\n#endif\n\n#ifndef GL_VERSION_3_2\n#define GL_VERSION_3_2 1\n/* OpenGL 3.2 also reuses entry points from these extensions: */\n/* ARB_draw_elements_base_vertex */\n/* ARB_provoking_vertex */\n/* ARB_sync */\n/* ARB_texture_multisample */\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);\nGLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);\nGLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);\ntypedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\n#endif\n\n#ifndef GL_VERSION_3_3\n#define GL_VERSION_3_3 1\n/* OpenGL 3.3 also reuses entry points from these extensions: */\n/* ARB_blend_func_extended */\n/* ARB_sampler_objects */\n/* ARB_explicit_attrib_location, but it has none */\n/* ARB_occlusion_query2 (no entry points) */\n/* ARB_shader_bit_encoding (no entry points) */\n/* ARB_texture_rgb10_a2ui (no entry points) */\n/* ARB_texture_swizzle (no entry points) */\n/* ARB_timer_query */\n/* ARB_vertex_type_2_10_10_10_rev */\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);\n#endif\n\n#ifndef GL_VERSION_4_0\n#define GL_VERSION_4_0 1\n/* OpenGL 4.0 also reuses entry points from these extensions: */\n/* ARB_texture_query_lod (no entry points) */\n/* ARB_draw_indirect */\n/* ARB_gpu_shader5 (no entry points) */\n/* ARB_gpu_shader_fp64 */\n/* ARB_shader_subroutine */\n/* ARB_tessellation_shader */\n/* ARB_texture_buffer_object_rgb32 (no entry points) */\n/* ARB_texture_cube_map_array (no entry points) */\n/* ARB_texture_gather (no entry points) */\n/* ARB_transform_feedback2 */\n/* ARB_transform_feedback3 */\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glMinSampleShading (GLfloat value);\nGLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode);\nGLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst);\nGLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\ntypedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n#endif\n\n#ifndef GL_VERSION_4_1\n#define GL_VERSION_4_1 1\n/* OpenGL 4.1 reuses entry points from these extensions: */\n/* ARB_ES2_compatibility */\n/* ARB_get_program_binary */\n/* ARB_separate_shader_objects */\n/* ARB_shader_precision (no entry points) */\n/* ARB_vertex_attrib_64bit */\n/* ARB_viewport_array */\n#endif\n\n#ifndef GL_VERSION_4_2\n#define GL_VERSION_4_2 1\n/* OpenGL 4.2 reuses entry points from these extensions: */\n/* ARB_base_instance */\n/* ARB_shading_language_420pack (no entry points) */\n/* ARB_transform_feedback_instanced */\n/* ARB_compressed_texture_pixel_storage (no entry points) */\n/* ARB_conservative_depth (no entry points) */\n/* ARB_internalformat_query */\n/* ARB_map_buffer_alignment (no entry points) */\n/* ARB_shader_atomic_counters */\n/* ARB_shader_image_load_store */\n/* ARB_shading_language_packing (no entry points) */\n/* ARB_texture_storage */\n#endif\n\n#ifndef GL_VERSION_4_3\n#define GL_VERSION_4_3 1\n/* OpenGL 4.3 reuses entry points from these extensions: */\n/* ARB_arrays_of_arrays (no entry points, GLSL only) */\n/* ARB_fragment_layer_viewport (no entry points, GLSL only) */\n/* ARB_shader_image_size (no entry points, GLSL only) */\n/* ARB_ES3_compatibility (no entry points) */\n/* ARB_clear_buffer_object */\n/* ARB_compute_shader */\n/* ARB_copy_image */\n/* KHR_debug (includes ARB_debug_output commands promoted to KHR without suffixes) */\n/* ARB_explicit_uniform_location (no entry points) */\n/* ARB_framebuffer_no_attachments */\n/* ARB_internalformat_query2 */\n/* ARB_invalidate_subdata */\n/* ARB_multi_draw_indirect */\n/* ARB_program_interface_query */\n/* ARB_robust_buffer_access_behavior (no entry points) */\n/* ARB_shader_storage_buffer_object */\n/* ARB_stencil_texturing (no entry points) */\n/* ARB_texture_buffer_range */\n/* ARB_texture_query_levels (no entry points) */\n/* ARB_texture_storage_multisample */\n/* ARB_texture_view */\n/* ARB_vertex_attrib_binding */\n#endif\n\n#ifndef GL_ARB_depth_buffer_float\n#define GL_ARB_depth_buffer_float 1\n#endif\n\n#ifndef GL_ARB_framebuffer_object\n#define GL_ARB_framebuffer_object 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer);\nGLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);\nGLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);\nGLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);\nGLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer);\nGLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);\nGLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);\nGLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);\nGLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target);\nGLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\nGLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\nGLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\nGLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGenerateMipmap (GLenum target);\nGLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\nGLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);\ntypedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);\ntypedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);\ntypedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);\ntypedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);\ntypedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\ntypedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);\ntypedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\ntypedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\n#endif\n\n#ifndef GL_ARB_framebuffer_sRGB\n#define GL_ARB_framebuffer_sRGB 1\n#endif\n\n#ifndef GL_ARB_half_float_vertex\n#define GL_ARB_half_float_vertex 1\n#endif\n\n#ifndef GL_ARB_map_buffer_range\n#define GL_ARB_map_buffer_range 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI GLvoid* APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\nGLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef GLvoid* (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\ntypedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);\n#endif\n\n#ifndef GL_ARB_texture_compression_rgtc\n#define GL_ARB_texture_compression_rgtc 1\n#endif\n\n#ifndef GL_ARB_texture_rg\n#define GL_ARB_texture_rg 1\n#endif\n\n#ifndef GL_ARB_vertex_array_object\n#define GL_ARB_vertex_array_object 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBindVertexArray (GLuint array);\nGLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);\nGLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);\nGLAPI GLboolean APIENTRY glIsVertexArray (GLuint array);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);\ntypedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);\ntypedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);\ntypedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);\n#endif\n\n#ifndef GL_ARB_uniform_buffer_object\n#define GL_ARB_uniform_buffer_object 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);\nGLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);\nGLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);\nGLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);\nGLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);\ntypedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);\ntypedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\n#endif\n\n#ifndef GL_ARB_copy_buffer\n#define GL_ARB_copy_buffer 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\n#endif\n\n#ifndef GL_ARB_depth_clamp\n#define GL_ARB_depth_clamp 1\n#endif\n\n#ifndef GL_ARB_draw_elements_base_vertex\n#define GL_ARB_draw_elements_base_vertex 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);\nGLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);\nGLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);\nGLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);\ntypedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);\n#endif\n\n#ifndef GL_ARB_fragment_coord_conventions\n#define GL_ARB_fragment_coord_conventions 1\n#endif\n\n#ifndef GL_ARB_provoking_vertex\n#define GL_ARB_provoking_vertex 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glProvokingVertex (GLenum mode);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode);\n#endif\n\n#ifndef GL_ARB_seamless_cube_map\n#define GL_ARB_seamless_cube_map 1\n#endif\n\n#ifndef GL_ARB_sync\n#define GL_ARB_sync 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags);\nGLAPI GLboolean APIENTRY glIsSync (GLsync sync);\nGLAPI void APIENTRY glDeleteSync (GLsync sync);\nGLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);\nGLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);\nGLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *params);\nGLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);\ntypedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync);\ntypedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);\ntypedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);\ntypedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);\ntypedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params);\ntypedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);\n#endif\n\n#ifndef GL_ARB_texture_multisample\n#define GL_ARB_texture_multisample 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);\nGLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);\ntypedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask);\n#endif\n\n#ifndef GL_ARB_vertex_array_bgra\n#define GL_ARB_vertex_array_bgra 1\n#endif\n\n#ifndef GL_ARB_draw_buffers_blend\n#define GL_ARB_draw_buffers_blend 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode);\nGLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\nGLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst);\nGLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode);\ntypedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\ntypedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst);\ntypedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n#endif\n\n#ifndef GL_ARB_sample_shading\n#define GL_ARB_sample_shading 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glMinSampleShadingARB (GLfloat value);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value);\n#endif\n\n#ifndef GL_ARB_texture_cube_map_array\n#define GL_ARB_texture_cube_map_array 1\n#endif\n\n#ifndef GL_ARB_texture_gather\n#define GL_ARB_texture_gather 1\n#endif\n\n#ifndef GL_ARB_texture_query_lod\n#define GL_ARB_texture_query_lod 1\n#endif\n\n#ifndef GL_ARB_shading_language_include\n#define GL_ARB_shading_language_include 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string);\nGLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name);\nGLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length);\nGLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name);\nGLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string);\nGLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string);\ntypedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name);\ntypedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length);\ntypedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string);\ntypedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params);\n#endif\n\n#ifndef GL_ARB_texture_compression_bptc\n#define GL_ARB_texture_compression_bptc 1\n#endif\n\n#ifndef GL_ARB_blend_func_extended\n#define GL_ARB_blend_func_extended 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);\nGLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);\ntypedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name);\n#endif\n\n#ifndef GL_ARB_explicit_attrib_location\n#define GL_ARB_explicit_attrib_location 1\n#endif\n\n#ifndef GL_ARB_occlusion_query2\n#define GL_ARB_occlusion_query2 1\n#endif\n\n#ifndef GL_ARB_sampler_objects\n#define GL_ARB_sampler_objects 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);\nGLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);\nGLAPI GLboolean APIENTRY glIsSampler (GLuint sampler);\nGLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler);\nGLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);\nGLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);\nGLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);\nGLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);\nGLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param);\nGLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param);\nGLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params);\nGLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);\nGLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);\ntypedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);\ntypedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);\ntypedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param);\ntypedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param);\ntypedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params);\n#endif\n\n#ifndef GL_ARB_shader_bit_encoding\n#define GL_ARB_shader_bit_encoding 1\n#endif\n\n#ifndef GL_ARB_texture_rgb10_a2ui\n#define GL_ARB_texture_rgb10_a2ui 1\n#endif\n\n#ifndef GL_ARB_texture_swizzle\n#define GL_ARB_texture_swizzle 1\n#endif\n\n#ifndef GL_ARB_timer_query\n#define GL_ARB_timer_query 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target);\nGLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params);\nGLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params);\ntypedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params);\n#endif\n\n#ifndef GL_ARB_vertex_type_2_10_10_10_rev\n#define GL_ARB_vertex_type_2_10_10_10_rev 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value);\nGLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value);\nGLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value);\nGLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value);\nGLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value);\nGLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value);\nGLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords);\nGLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords);\nGLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords);\nGLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords);\nGLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords);\nGLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords);\nGLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color);\nGLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color);\nGLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color);\nGLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color);\nGLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color);\nGLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color);\nGLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\nGLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\nGLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\nGLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);\nGLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value);\ntypedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords);\ntypedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords);\ntypedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color);\ntypedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color);\ntypedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color);\ntypedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color);\ntypedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);\n#endif\n\n#ifndef GL_ARB_draw_indirect\n#define GL_ARB_draw_indirect 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const GLvoid *indirect);\nGLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect);\n#endif\n\n#ifndef GL_ARB_gpu_shader5\n#define GL_ARB_gpu_shader5 1\n#endif\n\n#ifndef GL_ARB_gpu_shader_fp64\n#define GL_ARB_gpu_shader_fp64 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glUniform1d (GLint location, GLdouble x);\nGLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x);\ntypedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params);\n#endif\n\n#ifndef GL_ARB_shader_subroutine\n#define GL_ARB_shader_subroutine 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name);\nGLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name);\nGLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);\nGLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);\nGLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);\nGLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices);\nGLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params);\nGLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name);\ntypedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);\ntypedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);\ntypedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices);\ntypedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params);\ntypedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values);\n#endif\n\n#ifndef GL_ARB_tessellation_shader\n#define GL_ARB_tessellation_shader 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value);\nGLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);\ntypedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values);\n#endif\n\n#ifndef GL_ARB_texture_buffer_object_rgb32\n#define GL_ARB_texture_buffer_object_rgb32 1\n#endif\n\n#ifndef GL_ARB_transform_feedback2\n#define GL_ARB_transform_feedback2 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id);\nGLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);\nGLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);\nGLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id);\nGLAPI void APIENTRY glPauseTransformFeedback (void);\nGLAPI void APIENTRY glResumeTransformFeedback (void);\nGLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);\ntypedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);\ntypedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);\ntypedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);\ntypedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);\ntypedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id);\n#endif\n\n#ifndef GL_ARB_transform_feedback3\n#define GL_ARB_transform_feedback3 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream);\nGLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id);\nGLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index);\nGLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream);\ntypedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id);\ntypedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index);\ntypedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params);\n#endif\n\n#ifndef GL_ARB_ES2_compatibility\n#define GL_ARB_ES2_compatibility 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glReleaseShaderCompiler (void);\nGLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);\nGLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);\nGLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f);\nGLAPI void APIENTRY glClearDepthf (GLfloat d);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);\ntypedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);\ntypedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);\ntypedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);\n#endif\n\n#ifndef GL_ARB_get_program_binary\n#define GL_ARB_get_program_binary 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);\nGLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);\nGLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);\ntypedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);\ntypedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);\n#endif\n\n#ifndef GL_ARB_separate_shader_objects\n#define GL_ARB_separate_shader_objects 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);\nGLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);\nGLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar* const *strings);\nGLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline);\nGLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);\nGLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);\nGLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline);\nGLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);\nGLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);\nGLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);\nGLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0);\nGLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);\nGLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);\nGLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);\nGLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1);\nGLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);\nGLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\nGLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\nGLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);\nGLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\nGLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\nGLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);\nGLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\nGLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);\nGLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\nGLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);\nGLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\nGLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline);\nGLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);\ntypedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);\ntypedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar* const *strings);\ntypedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);\ntypedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines);\ntypedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);\ntypedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);\ntypedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);\ntypedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);\ntypedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\n#endif\n\n#ifndef GL_ARB_vertex_attrib_64bit\n#define GL_ARB_vertex_attrib_64bit 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x);\nGLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y);\nGLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z);\nGLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\nGLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v);\nGLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\nGLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\ntypedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params);\n#endif\n\n#ifndef GL_ARB_viewport_array\n#define GL_ARB_viewport_array 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v);\nGLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);\nGLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v);\nGLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v);\nGLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v);\nGLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v);\nGLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f);\nGLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data);\nGLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);\ntypedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v);\ntypedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v);\ntypedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v);\ntypedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f);\ntypedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data);\ntypedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data);\n#endif\n\n#ifndef GL_ARB_cl_event\n#define GL_ARB_cl_event 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context * context, struct _cl_event * event, GLbitfield flags);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context * context, struct _cl_event * event, GLbitfield flags);\n#endif\n\n#ifndef GL_ARB_debug_output\n#define GL_ARB_debug_output 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\nGLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\nGLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const GLvoid *userParam);\nGLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam);\ntypedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\n#endif\n\n#ifndef GL_ARB_robustness\n#define GL_ARB_robustness 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void);\nGLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img);\nGLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);\nGLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img);\nGLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);\nGLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params);\nGLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params);\nGLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void);\ntypedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img);\ntypedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);\ntypedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img);\ntypedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);\ntypedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);\ntypedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);\ntypedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);\n#endif\n\n#ifndef GL_ARB_shader_stencil_export\n#define GL_ARB_shader_stencil_export 1\n#endif\n\n#ifndef GL_ARB_base_instance\n#define GL_ARB_base_instance 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);\nGLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);\nGLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);\ntypedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);\n#endif\n\n#ifndef GL_ARB_shading_language_420pack\n#define GL_ARB_shading_language_420pack 1\n#endif\n\n#ifndef GL_ARB_transform_feedback_instanced\n#define GL_ARB_transform_feedback_instanced 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount);\nGLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount);\ntypedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);\n#endif\n\n#ifndef GL_ARB_compressed_texture_pixel_storage\n#define GL_ARB_compressed_texture_pixel_storage 1\n#endif\n\n#ifndef GL_ARB_conservative_depth\n#define GL_ARB_conservative_depth 1\n#endif\n\n#ifndef GL_ARB_internalformat_query\n#define GL_ARB_internalformat_query 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);\n#endif\n\n#ifndef GL_ARB_map_buffer_alignment\n#define GL_ARB_map_buffer_alignment 1\n#endif\n\n#ifndef GL_ARB_shader_atomic_counters\n#define GL_ARB_shader_atomic_counters 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);\n#endif\n\n#ifndef GL_ARB_shader_image_load_store\n#define GL_ARB_shader_image_load_store 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);\nGLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);\ntypedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);\n#endif\n\n#ifndef GL_ARB_shading_language_packing\n#define GL_ARB_shading_language_packing 1\n#endif\n\n#ifndef GL_ARB_texture_storage\n#define GL_ARB_texture_storage 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nGLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nGLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\nGLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\n#endif\n\n#ifndef GL_KHR_texture_compression_astc_ldr\n#define GL_KHR_texture_compression_astc_ldr 1\n#endif\n\n#ifndef GL_KHR_debug\n#define GL_KHR_debug 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\nGLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\nGLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam);\nGLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\nGLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message);\nGLAPI void APIENTRY glPopDebugGroup (void);\nGLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);\nGLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);\nGLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label);\nGLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\ntypedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);\ntypedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\ntypedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);\ntypedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void);\ntypedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);\ntypedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);\ntypedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label);\ntypedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);\n#endif\n\n#ifndef GL_ARB_arrays_of_arrays\n#define GL_ARB_arrays_of_arrays 1\n#endif\n\n#ifndef GL_ARB_clear_buffer_object\n#define GL_ARB_clear_buffer_object 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);\nGLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void *data);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);\ntypedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void *data);\n#endif\n\n#ifndef GL_ARB_compute_shader\n#define GL_ARB_compute_shader 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);\nGLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);\ntypedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);\n#endif\n\n#ifndef GL_ARB_copy_image\n#define GL_ARB_copy_image 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);\n#endif\n\n#ifndef GL_ARB_texture_view\n#define GL_ARB_texture_view 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);\n#endif\n\n#ifndef GL_ARB_vertex_attrib_binding\n#define GL_ARB_vertex_attrib_binding 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\nGLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);\nGLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);\nGLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\nGLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\nGLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex);\nGLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);\ntypedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);\ntypedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor);\n#endif\n\n#ifndef GL_ARB_robustness_isolation\n#define GL_ARB_robustness_isolation 1\n#endif\n\n#ifndef GL_ARB_ES3_compatibility\n#define GL_ARB_ES3_compatibility 1\n#endif\n\n#ifndef GL_ARB_explicit_uniform_location\n#define GL_ARB_explicit_uniform_location 1\n#endif\n\n#ifndef GL_ARB_fragment_layer_viewport\n#define GL_ARB_fragment_layer_viewport 1\n#endif\n\n#ifndef GL_ARB_framebuffer_no_attachments\n#define GL_ARB_framebuffer_no_attachments 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);\nGLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);\nGLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param);\nGLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\ntypedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param);\ntypedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params);\n#endif\n\n#ifndef GL_ARB_internalformat_query2\n#define GL_ARB_internalformat_query2 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);\n#endif\n\n#ifndef GL_ARB_invalidate_subdata\n#define GL_ARB_invalidate_subdata 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);\nGLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level);\nGLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length);\nGLAPI void APIENTRY glInvalidateBufferData (GLuint buffer);\nGLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);\nGLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);\ntypedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level);\ntypedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);\ntypedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer);\ntypedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);\ntypedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);\n#endif\n\n#ifndef GL_ARB_multi_draw_indirect\n#define GL_ARB_multi_draw_indirect 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);\nGLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);\ntypedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);\n#endif\n\n#ifndef GL_ARB_program_interface_query\n#define GL_ARB_program_interface_query 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);\nGLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);\nGLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);\nGLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);\nGLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);\nGLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params);\ntypedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);\ntypedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);\ntypedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);\ntypedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name);\ntypedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);\n#endif\n\n#ifndef GL_ARB_robust_buffer_access_behavior\n#define GL_ARB_robust_buffer_access_behavior 1\n#endif\n\n#ifndef GL_ARB_shader_image_size\n#define GL_ARB_shader_image_size 1\n#endif\n\n#ifndef GL_ARB_shader_storage_buffer_object\n#define GL_ARB_shader_storage_buffer_object 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);\n#endif\n\n#ifndef GL_ARB_stencil_texturing\n#define GL_ARB_stencil_texturing 1\n#endif\n\n#ifndef GL_ARB_texture_buffer_range\n#define GL_ARB_texture_buffer_range 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\nGLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\ntypedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\n#endif\n\n#ifndef GL_ARB_texture_query_levels\n#define GL_ARB_texture_query_levels 1\n#endif\n\n#ifndef GL_ARB_texture_storage_multisample\n#define GL_ARB_texture_storage_multisample 1\n#ifdef GLCOREARB_PROTOTYPES\nGLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\nGLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\n#endif /* GLCOREARB_PROTOTYPES */\ntypedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\ntypedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\n#endif\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "external/imgui/examples/libs/glfw/COPYING.txt",
    "content": "Copyright (c) 2002-2006 Marcus Geelnard\nCopyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would\n   be appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not\n   be misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source\n   distribution.\n\n"
  },
  {
    "path": "external/imgui/examples/libs/glfw/include/GLFW/glfw3.h",
    "content": "/*************************************************************************\n * GLFW 3.2 - www.glfw.org\n * A library for OpenGL, window and input\n *------------------------------------------------------------------------\n * Copyright (c) 2002-2006 Marcus Geelnard\n * Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would\n *    be appreciated but is not required.\n *\n * 2. Altered source versions must be plainly marked as such, and must not\n *    be misrepresented as being the original software.\n *\n * 3. This notice may not be removed or altered from any source\n *    distribution.\n *\n *************************************************************************/\n\n#ifndef _glfw3_h_\n#define _glfw3_h_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/*************************************************************************\n * Doxygen documentation\n *************************************************************************/\n\n/*! @file glfw3.h\n *  @brief The header of the GLFW 3 API.\n *\n *  This is the header file of the GLFW 3 API.  It defines all its types and\n *  declares all its functions.\n *\n *  For more information about how to use this file, see @ref build_include.\n */\n/*! @defgroup context Context reference\n *\n *  This is the reference documentation for OpenGL and OpenGL ES context related\n *  functions.  For more task-oriented information, see the @ref context_guide.\n */\n/*! @defgroup vulkan Vulkan reference\n *\n *  This is the reference documentation for Vulkan related functions and types.\n *  For more task-oriented information, see the @ref vulkan_guide.\n */\n/*! @defgroup init Initialization, version and error reference\n *\n *  This is the reference documentation for initialization and termination of\n *  the library, version management and error handling.  For more task-oriented\n *  information, see the @ref intro_guide.\n */\n/*! @defgroup input Input reference\n *\n *  This is the reference documentation for input related functions and types.\n *  For more task-oriented information, see the @ref input_guide.\n */\n/*! @defgroup monitor Monitor reference\n *\n *  This is the reference documentation for monitor related functions and types.\n *  For more task-oriented information, see the @ref monitor_guide.\n */\n/*! @defgroup window Window reference\n *\n *  This is the reference documentation for window related functions and types,\n *  including creation, deletion and event polling.  For more task-oriented\n *  information, see the @ref window_guide.\n */\n\n\n/*************************************************************************\n * Compiler- and platform-specific preprocessor work\n *************************************************************************/\n\n/* If we are we on Windows, we want a single define for it.\n */\n#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__))\n #define _WIN32\n#endif /* _WIN32 */\n\n/* It is customary to use APIENTRY for OpenGL function pointer declarations on\n * all platforms.  Additionally, the Windows OpenGL header needs APIENTRY.\n */\n#ifndef APIENTRY\n #ifdef _WIN32\n  #define APIENTRY __stdcall\n #else\n  #define APIENTRY\n #endif\n#endif /* APIENTRY */\n\n/* Some Windows OpenGL headers need this.\n */\n#if !defined(WINGDIAPI) && defined(_WIN32)\n #define WINGDIAPI __declspec(dllimport)\n #define GLFW_WINGDIAPI_DEFINED\n#endif /* WINGDIAPI */\n\n/* Some Windows GLU headers need this.\n */\n#if !defined(CALLBACK) && defined(_WIN32)\n #define CALLBACK __stdcall\n #define GLFW_CALLBACK_DEFINED\n#endif /* CALLBACK */\n\n/* Most Windows GLU headers need wchar_t.\n * The OS X OpenGL header blocks the definition of ptrdiff_t by glext.h.\n * Include it unconditionally to avoid surprising side-effects.\n */\n#include <stddef.h>\n#include <stdint.h>\n\n/* Include the chosen client API headers.\n */\n#if defined(__APPLE__)\n #if defined(GLFW_INCLUDE_GLCOREARB)\n  #include <OpenGL/gl3.h>\n  #if defined(GLFW_INCLUDE_GLEXT)\n   #include <OpenGL/gl3ext.h>\n  #endif\n #elif !defined(GLFW_INCLUDE_NONE)\n  #if !defined(GLFW_INCLUDE_GLEXT)\n   #define GL_GLEXT_LEGACY\n  #endif\n  #include <OpenGL/gl.h>\n #endif\n #if defined(GLFW_INCLUDE_GLU)\n  #include <OpenGL/glu.h>\n #endif\n#else\n #if defined(GLFW_INCLUDE_GLCOREARB)\n  #include <GL/glcorearb.h>\n #elif defined(GLFW_INCLUDE_ES1)\n  #include <GLES/gl.h>\n  #if defined(GLFW_INCLUDE_GLEXT)\n   #include <GLES/glext.h>\n  #endif\n #elif defined(GLFW_INCLUDE_ES2)\n  #include <GLES2/gl2.h>\n  #if defined(GLFW_INCLUDE_GLEXT)\n   #include <GLES2/gl2ext.h>\n  #endif\n #elif defined(GLFW_INCLUDE_ES3)\n  #include <GLES3/gl3.h>\n  #if defined(GLFW_INCLUDE_GLEXT)\n   #include <GLES2/gl2ext.h>\n  #endif\n #elif defined(GLFW_INCLUDE_ES31)\n  #include <GLES3/gl31.h>\n  #if defined(GLFW_INCLUDE_GLEXT)\n   #include <GLES2/gl2ext.h>\n  #endif\n #elif defined(GLFW_INCLUDE_VULKAN)\n  #include <vulkan/vulkan.h>\n #elif !defined(GLFW_INCLUDE_NONE)\n  #include <GL/gl.h>\n  #if defined(GLFW_INCLUDE_GLEXT)\n   #include <GL/glext.h>\n  #endif\n #endif\n #if defined(GLFW_INCLUDE_GLU)\n  #include <GL/glu.h>\n #endif\n#endif\n\n#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL)\n /* GLFW_DLL must be defined by applications that are linking against the DLL\n  * version of the GLFW library.  _GLFW_BUILD_DLL is defined by the GLFW\n  * configuration header when compiling the DLL version of the library.\n  */\n #error \"You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined\"\n#endif\n\n/* GLFWAPI is used to declare public API functions for export\n * from the DLL / shared library / dynamic library.\n */\n#if defined(_WIN32) && defined(_GLFW_BUILD_DLL)\n /* We are building GLFW as a Win32 DLL */\n #define GLFWAPI __declspec(dllexport)\n#elif defined(_WIN32) && defined(GLFW_DLL)\n /* We are calling GLFW as a Win32 DLL */\n #define GLFWAPI __declspec(dllimport)\n#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL)\n /* We are building GLFW as a shared / dynamic library */\n #define GLFWAPI __attribute__((visibility(\"default\")))\n#else\n /* We are building or calling GLFW as a static library */\n #define GLFWAPI\n#endif\n\n\n/*************************************************************************\n * GLFW API tokens\n *************************************************************************/\n\n/*! @name GLFW version macros\n *  @{ */\n/*! @brief The major version number of the GLFW library.\n *\n *  This is incremented when the API is changed in non-compatible ways.\n *  @ingroup init\n */\n#define GLFW_VERSION_MAJOR          3\n/*! @brief The minor version number of the GLFW library.\n *\n *  This is incremented when features are added to the API but it remains\n *  backward-compatible.\n *  @ingroup init\n */\n#define GLFW_VERSION_MINOR          2\n/*! @brief The revision number of the GLFW library.\n *\n *  This is incremented when a bug fix release is made that does not contain any\n *  API changes.\n *  @ingroup init\n */\n#define GLFW_VERSION_REVISION       0\n/*! @} */\n\n/*! @name Boolean values\n *  @{ */\n/*! @brief One.\n *\n *  One.  Seriously.  You don't _need_ to use this symbol in your code.  It's\n *  just semantic sugar for the number 1.  You can use `1` or `true` or `_True`\n *  or `GL_TRUE` or whatever you want.\n */\n#define GLFW_TRUE                   1\n/*! @brief Zero.\n *\n *  Zero.  Seriously.  You don't _need_ to use this symbol in your code.  It's\n *  just just semantic sugar for the number 0.  You can use `0` or `false` or\n *  `_False` or `GL_FALSE` or whatever you want.\n */\n#define GLFW_FALSE                  0\n/*! @} */\n\n/*! @name Key and button actions\n *  @{ */\n/*! @brief The key or mouse button was released.\n *\n *  The key or mouse button was released.\n *\n *  @ingroup input\n */\n#define GLFW_RELEASE                0\n/*! @brief The key or mouse button was pressed.\n *\n *  The key or mouse button was pressed.\n *\n *  @ingroup input\n */\n#define GLFW_PRESS                  1\n/*! @brief The key was held down until it repeated.\n *\n *  The key was held down until it repeated.\n *\n *  @ingroup input\n */\n#define GLFW_REPEAT                 2\n/*! @} */\n\n/*! @defgroup keys Keyboard keys\n *\n *  See [key input](@ref input_key) for how these are used.\n *\n *  These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60),\n *  but re-arranged to map to 7-bit ASCII for printable keys (function keys are\n *  put in the 256+ range).\n *\n *  The naming of the key codes follow these rules:\n *   - The US keyboard layout is used\n *   - Names of printable alpha-numeric characters are used (e.g. \"A\", \"R\",\n *     \"3\", etc.)\n *   - For non-alphanumeric characters, Unicode:ish names are used (e.g.\n *     \"COMMA\", \"LEFT_SQUARE_BRACKET\", etc.). Note that some names do not\n *     correspond to the Unicode standard (usually for brevity)\n *   - Keys that lack a clear US mapping are named \"WORLD_x\"\n *   - For non-printable keys, custom names are used (e.g. \"F4\",\n *     \"BACKSPACE\", etc.)\n *\n *  @ingroup input\n *  @{\n */\n\n/* The unknown key */\n#define GLFW_KEY_UNKNOWN            -1\n\n/* Printable keys */\n#define GLFW_KEY_SPACE              32\n#define GLFW_KEY_APOSTROPHE         39  /* ' */\n#define GLFW_KEY_COMMA              44  /* , */\n#define GLFW_KEY_MINUS              45  /* - */\n#define GLFW_KEY_PERIOD             46  /* . */\n#define GLFW_KEY_SLASH              47  /* / */\n#define GLFW_KEY_0                  48\n#define GLFW_KEY_1                  49\n#define GLFW_KEY_2                  50\n#define GLFW_KEY_3                  51\n#define GLFW_KEY_4                  52\n#define GLFW_KEY_5                  53\n#define GLFW_KEY_6                  54\n#define GLFW_KEY_7                  55\n#define GLFW_KEY_8                  56\n#define GLFW_KEY_9                  57\n#define GLFW_KEY_SEMICOLON          59  /* ; */\n#define GLFW_KEY_EQUAL              61  /* = */\n#define GLFW_KEY_A                  65\n#define GLFW_KEY_B                  66\n#define GLFW_KEY_C                  67\n#define GLFW_KEY_D                  68\n#define GLFW_KEY_E                  69\n#define GLFW_KEY_F                  70\n#define GLFW_KEY_G                  71\n#define GLFW_KEY_H                  72\n#define GLFW_KEY_I                  73\n#define GLFW_KEY_J                  74\n#define GLFW_KEY_K                  75\n#define GLFW_KEY_L                  76\n#define GLFW_KEY_M                  77\n#define GLFW_KEY_N                  78\n#define GLFW_KEY_O                  79\n#define GLFW_KEY_P                  80\n#define GLFW_KEY_Q                  81\n#define GLFW_KEY_R                  82\n#define GLFW_KEY_S                  83\n#define GLFW_KEY_T                  84\n#define GLFW_KEY_U                  85\n#define GLFW_KEY_V                  86\n#define GLFW_KEY_W                  87\n#define GLFW_KEY_X                  88\n#define GLFW_KEY_Y                  89\n#define GLFW_KEY_Z                  90\n#define GLFW_KEY_LEFT_BRACKET       91  /* [ */\n#define GLFW_KEY_BACKSLASH          92  /* \\ */\n#define GLFW_KEY_RIGHT_BRACKET      93  /* ] */\n#define GLFW_KEY_GRAVE_ACCENT       96  /* ` */\n#define GLFW_KEY_WORLD_1            161 /* non-US #1 */\n#define GLFW_KEY_WORLD_2            162 /* non-US #2 */\n\n/* Function keys */\n#define GLFW_KEY_ESCAPE             256\n#define GLFW_KEY_ENTER              257\n#define GLFW_KEY_TAB                258\n#define GLFW_KEY_BACKSPACE          259\n#define GLFW_KEY_INSERT             260\n#define GLFW_KEY_DELETE             261\n#define GLFW_KEY_RIGHT              262\n#define GLFW_KEY_LEFT               263\n#define GLFW_KEY_DOWN               264\n#define GLFW_KEY_UP                 265\n#define GLFW_KEY_PAGE_UP            266\n#define GLFW_KEY_PAGE_DOWN          267\n#define GLFW_KEY_HOME               268\n#define GLFW_KEY_END                269\n#define GLFW_KEY_CAPS_LOCK          280\n#define GLFW_KEY_SCROLL_LOCK        281\n#define GLFW_KEY_NUM_LOCK           282\n#define GLFW_KEY_PRINT_SCREEN       283\n#define GLFW_KEY_PAUSE              284\n#define GLFW_KEY_F1                 290\n#define GLFW_KEY_F2                 291\n#define GLFW_KEY_F3                 292\n#define GLFW_KEY_F4                 293\n#define GLFW_KEY_F5                 294\n#define GLFW_KEY_F6                 295\n#define GLFW_KEY_F7                 296\n#define GLFW_KEY_F8                 297\n#define GLFW_KEY_F9                 298\n#define GLFW_KEY_F10                299\n#define GLFW_KEY_F11                300\n#define GLFW_KEY_F12                301\n#define GLFW_KEY_F13                302\n#define GLFW_KEY_F14                303\n#define GLFW_KEY_F15                304\n#define GLFW_KEY_F16                305\n#define GLFW_KEY_F17                306\n#define GLFW_KEY_F18                307\n#define GLFW_KEY_F19                308\n#define GLFW_KEY_F20                309\n#define GLFW_KEY_F21                310\n#define GLFW_KEY_F22                311\n#define GLFW_KEY_F23                312\n#define GLFW_KEY_F24                313\n#define GLFW_KEY_F25                314\n#define GLFW_KEY_KP_0               320\n#define GLFW_KEY_KP_1               321\n#define GLFW_KEY_KP_2               322\n#define GLFW_KEY_KP_3               323\n#define GLFW_KEY_KP_4               324\n#define GLFW_KEY_KP_5               325\n#define GLFW_KEY_KP_6               326\n#define GLFW_KEY_KP_7               327\n#define GLFW_KEY_KP_8               328\n#define GLFW_KEY_KP_9               329\n#define GLFW_KEY_KP_DECIMAL         330\n#define GLFW_KEY_KP_DIVIDE          331\n#define GLFW_KEY_KP_MULTIPLY        332\n#define GLFW_KEY_KP_SUBTRACT        333\n#define GLFW_KEY_KP_ADD             334\n#define GLFW_KEY_KP_ENTER           335\n#define GLFW_KEY_KP_EQUAL           336\n#define GLFW_KEY_LEFT_SHIFT         340\n#define GLFW_KEY_LEFT_CONTROL       341\n#define GLFW_KEY_LEFT_ALT           342\n#define GLFW_KEY_LEFT_SUPER         343\n#define GLFW_KEY_RIGHT_SHIFT        344\n#define GLFW_KEY_RIGHT_CONTROL      345\n#define GLFW_KEY_RIGHT_ALT          346\n#define GLFW_KEY_RIGHT_SUPER        347\n#define GLFW_KEY_MENU               348\n\n#define GLFW_KEY_LAST               GLFW_KEY_MENU\n\n/*! @} */\n\n/*! @defgroup mods Modifier key flags\n *\n *  See [key input](@ref input_key) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n\n/*! @brief If this bit is set one or more Shift keys were held down.\n */\n#define GLFW_MOD_SHIFT           0x0001\n/*! @brief If this bit is set one or more Control keys were held down.\n */\n#define GLFW_MOD_CONTROL         0x0002\n/*! @brief If this bit is set one or more Alt keys were held down.\n */\n#define GLFW_MOD_ALT             0x0004\n/*! @brief If this bit is set one or more Super keys were held down.\n */\n#define GLFW_MOD_SUPER           0x0008\n\n/*! @} */\n\n/*! @defgroup buttons Mouse buttons\n *\n *  See [mouse button input](@ref input_mouse_button) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n#define GLFW_MOUSE_BUTTON_1         0\n#define GLFW_MOUSE_BUTTON_2         1\n#define GLFW_MOUSE_BUTTON_3         2\n#define GLFW_MOUSE_BUTTON_4         3\n#define GLFW_MOUSE_BUTTON_5         4\n#define GLFW_MOUSE_BUTTON_6         5\n#define GLFW_MOUSE_BUTTON_7         6\n#define GLFW_MOUSE_BUTTON_8         7\n#define GLFW_MOUSE_BUTTON_LAST      GLFW_MOUSE_BUTTON_8\n#define GLFW_MOUSE_BUTTON_LEFT      GLFW_MOUSE_BUTTON_1\n#define GLFW_MOUSE_BUTTON_RIGHT     GLFW_MOUSE_BUTTON_2\n#define GLFW_MOUSE_BUTTON_MIDDLE    GLFW_MOUSE_BUTTON_3\n/*! @} */\n\n/*! @defgroup joysticks Joysticks\n *\n *  See [joystick input](@ref joystick) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n#define GLFW_JOYSTICK_1             0\n#define GLFW_JOYSTICK_2             1\n#define GLFW_JOYSTICK_3             2\n#define GLFW_JOYSTICK_4             3\n#define GLFW_JOYSTICK_5             4\n#define GLFW_JOYSTICK_6             5\n#define GLFW_JOYSTICK_7             6\n#define GLFW_JOYSTICK_8             7\n#define GLFW_JOYSTICK_9             8\n#define GLFW_JOYSTICK_10            9\n#define GLFW_JOYSTICK_11            10\n#define GLFW_JOYSTICK_12            11\n#define GLFW_JOYSTICK_13            12\n#define GLFW_JOYSTICK_14            13\n#define GLFW_JOYSTICK_15            14\n#define GLFW_JOYSTICK_16            15\n#define GLFW_JOYSTICK_LAST          GLFW_JOYSTICK_16\n/*! @} */\n\n/*! @defgroup errors Error codes\n *\n *  See [error handling](@ref error_handling) for how these are used.\n *\n *  @ingroup init\n *  @{ */\n/*! @brief GLFW has not been initialized.\n *\n *  This occurs if a GLFW function was called that must not be called unless the\n *  library is [initialized](@ref intro_init).\n *\n *  @analysis Application programmer error.  Initialize GLFW before calling any\n *  function that requires initialization.\n */\n#define GLFW_NOT_INITIALIZED        0x00010001\n/*! @brief No context is current for this thread.\n *\n *  This occurs if a GLFW function was called that needs and operates on the\n *  current OpenGL or OpenGL ES context but no context is current on the calling\n *  thread.  One such function is @ref glfwSwapInterval.\n *\n *  @analysis Application programmer error.  Ensure a context is current before\n *  calling functions that require a current context.\n */\n#define GLFW_NO_CURRENT_CONTEXT     0x00010002\n/*! @brief One of the arguments to the function was an invalid enum value.\n *\n *  One of the arguments to the function was an invalid enum value, for example\n *  requesting [GLFW_RED_BITS](@ref window_hints_fb) with @ref\n *  glfwGetWindowAttrib.\n *\n *  @analysis Application programmer error.  Fix the offending call.\n */\n#define GLFW_INVALID_ENUM           0x00010003\n/*! @brief One of the arguments to the function was an invalid value.\n *\n *  One of the arguments to the function was an invalid value, for example\n *  requesting a non-existent OpenGL or OpenGL ES version like 2.7.\n *\n *  Requesting a valid but unavailable OpenGL or OpenGL ES version will instead\n *  result in a @ref GLFW_VERSION_UNAVAILABLE error.\n *\n *  @analysis Application programmer error.  Fix the offending call.\n */\n#define GLFW_INVALID_VALUE          0x00010004\n/*! @brief A memory allocation failed.\n *\n *  A memory allocation failed.\n *\n *  @analysis A bug in GLFW or the underlying operating system.  Report the bug\n *  to our [issue tracker](https://github.com/glfw/glfw/issues).\n */\n#define GLFW_OUT_OF_MEMORY          0x00010005\n/*! @brief GLFW could not find support for the requested API on the system.\n *\n *  GLFW could not find support for the requested API on the system.\n *\n *  @analysis The installed graphics driver does not support the requested\n *  API, or does not support it via the chosen context creation backend.\n *  Below are a few examples.\n *\n *  @par\n *  Some pre-installed Windows graphics drivers do not support OpenGL.  AMD only\n *  supports OpenGL ES via EGL, while Nvidia and Intel only support it via\n *  a WGL or GLX extension.  OS X does not provide OpenGL ES at all.  The Mesa\n *  EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary\n *  driver.  Older graphics drivers do not support Vulkan.\n */\n#define GLFW_API_UNAVAILABLE        0x00010006\n/*! @brief The requested OpenGL or OpenGL ES version is not available.\n *\n *  The requested OpenGL or OpenGL ES version (including any requested context\n *  or framebuffer hints) is not available on this machine.\n *\n *  @analysis The machine does not support your requirements.  If your\n *  application is sufficiently flexible, downgrade your requirements and try\n *  again.  Otherwise, inform the user that their machine does not match your\n *  requirements.\n *\n *  @par\n *  Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0\n *  comes out before the 4.x series gets that far, also fail with this error and\n *  not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions\n *  will exist.\n */\n#define GLFW_VERSION_UNAVAILABLE    0x00010007\n/*! @brief A platform-specific error occurred that does not match any of the\n *  more specific categories.\n *\n *  A platform-specific error occurred that does not match any of the more\n *  specific categories.\n *\n *  @analysis A bug or configuration error in GLFW, the underlying operating\n *  system or its drivers, or a lack of required resources.  Report the issue to\n *  our [issue tracker](https://github.com/glfw/glfw/issues).\n */\n#define GLFW_PLATFORM_ERROR         0x00010008\n/*! @brief The requested format is not supported or available.\n *\n *  If emitted during window creation, the requested pixel format is not\n *  supported.\n *\n *  If emitted when querying the clipboard, the contents of the clipboard could\n *  not be converted to the requested format.\n *\n *  @analysis If emitted during window creation, one or more\n *  [hard constraints](@ref window_hints_hard) did not match any of the\n *  available pixel formats.  If your application is sufficiently flexible,\n *  downgrade your requirements and try again.  Otherwise, inform the user that\n *  their machine does not match your requirements.\n *\n *  @par\n *  If emitted when querying the clipboard, ignore the error or report it to\n *  the user, as appropriate.\n */\n#define GLFW_FORMAT_UNAVAILABLE     0x00010009\n/*! @brief The specified window does not have an OpenGL or OpenGL ES context.\n *\n *  A window that does not have an OpenGL or OpenGL ES context was passed to\n *  a function that requires it to have one.\n *\n *  @analysis Application programmer error.  Fix the offending call.\n */\n#define GLFW_NO_WINDOW_CONTEXT      0x0001000A\n/*! @} */\n\n#define GLFW_FOCUSED                0x00020001\n#define GLFW_ICONIFIED              0x00020002\n#define GLFW_RESIZABLE              0x00020003\n#define GLFW_VISIBLE                0x00020004\n#define GLFW_DECORATED              0x00020005\n#define GLFW_AUTO_ICONIFY           0x00020006\n#define GLFW_FLOATING               0x00020007\n#define GLFW_MAXIMIZED              0x00020008\n\n#define GLFW_RED_BITS               0x00021001\n#define GLFW_GREEN_BITS             0x00021002\n#define GLFW_BLUE_BITS              0x00021003\n#define GLFW_ALPHA_BITS             0x00021004\n#define GLFW_DEPTH_BITS             0x00021005\n#define GLFW_STENCIL_BITS           0x00021006\n#define GLFW_ACCUM_RED_BITS         0x00021007\n#define GLFW_ACCUM_GREEN_BITS       0x00021008\n#define GLFW_ACCUM_BLUE_BITS        0x00021009\n#define GLFW_ACCUM_ALPHA_BITS       0x0002100A\n#define GLFW_AUX_BUFFERS            0x0002100B\n#define GLFW_STEREO                 0x0002100C\n#define GLFW_SAMPLES                0x0002100D\n#define GLFW_SRGB_CAPABLE           0x0002100E\n#define GLFW_REFRESH_RATE           0x0002100F\n#define GLFW_DOUBLEBUFFER           0x00021010\n\n#define GLFW_CLIENT_API             0x00022001\n#define GLFW_CONTEXT_VERSION_MAJOR  0x00022002\n#define GLFW_CONTEXT_VERSION_MINOR  0x00022003\n#define GLFW_CONTEXT_REVISION       0x00022004\n#define GLFW_CONTEXT_ROBUSTNESS     0x00022005\n#define GLFW_OPENGL_FORWARD_COMPAT  0x00022006\n#define GLFW_OPENGL_DEBUG_CONTEXT   0x00022007\n#define GLFW_OPENGL_PROFILE         0x00022008\n#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009\n#define GLFW_CONTEXT_NO_ERROR       0x0002200A\n\n#define GLFW_NO_API                          0\n#define GLFW_OPENGL_API             0x00030001\n#define GLFW_OPENGL_ES_API          0x00030002\n\n#define GLFW_NO_ROBUSTNESS                   0\n#define GLFW_NO_RESET_NOTIFICATION  0x00031001\n#define GLFW_LOSE_CONTEXT_ON_RESET  0x00031002\n\n#define GLFW_OPENGL_ANY_PROFILE              0\n#define GLFW_OPENGL_CORE_PROFILE    0x00032001\n#define GLFW_OPENGL_COMPAT_PROFILE  0x00032002\n\n#define GLFW_CURSOR                 0x00033001\n#define GLFW_STICKY_KEYS            0x00033002\n#define GLFW_STICKY_MOUSE_BUTTONS   0x00033003\n\n#define GLFW_CURSOR_NORMAL          0x00034001\n#define GLFW_CURSOR_HIDDEN          0x00034002\n#define GLFW_CURSOR_DISABLED        0x00034003\n\n#define GLFW_ANY_RELEASE_BEHAVIOR            0\n#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001\n#define GLFW_RELEASE_BEHAVIOR_NONE  0x00035002\n\n/*! @defgroup shapes Standard cursor shapes\n *\n *  See [standard cursor creation](@ref cursor_standard) for how these are used.\n *\n *  @ingroup input\n *  @{ */\n\n/*! @brief The regular arrow cursor shape.\n *\n *  The regular arrow cursor.\n */\n#define GLFW_ARROW_CURSOR           0x00036001\n/*! @brief The text input I-beam cursor shape.\n *\n *  The text input I-beam cursor shape.\n */\n#define GLFW_IBEAM_CURSOR           0x00036002\n/*! @brief The crosshair shape.\n *\n *  The crosshair shape.\n */\n#define GLFW_CROSSHAIR_CURSOR       0x00036003\n/*! @brief The hand shape.\n *\n *  The hand shape.\n */\n#define GLFW_HAND_CURSOR            0x00036004\n/*! @brief The horizontal resize arrow shape.\n *\n *  The horizontal resize arrow shape.\n */\n#define GLFW_HRESIZE_CURSOR         0x00036005\n/*! @brief The vertical resize arrow shape.\n *\n *  The vertical resize arrow shape.\n */\n#define GLFW_VRESIZE_CURSOR         0x00036006\n/*! @} */\n\n#define GLFW_CONNECTED              0x00040001\n#define GLFW_DISCONNECTED           0x00040002\n\n#define GLFW_DONT_CARE              -1\n\n\n/*************************************************************************\n * GLFW API types\n *************************************************************************/\n\n/*! @brief Client API function pointer type.\n *\n *  Generic function pointer used for returning client API function pointers\n *  without forcing a cast from a regular pointer.\n *\n *  @sa @ref context_glext\n *  @sa glfwGetProcAddress\n *\n *  @since Added in version 3.0.\n \n *  @ingroup context\n */\ntypedef void (*GLFWglproc)(void);\n\n/*! @brief Vulkan API function pointer type.\n *\n *  Generic function pointer used for returning Vulkan API function pointers\n *  without forcing a cast from a regular pointer.\n *\n *  @sa @ref vulkan_proc\n *  @sa glfwGetInstanceProcAddress\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\ntypedef void (*GLFWvkproc)(void);\n\n/*! @brief Opaque monitor object.\n *\n *  Opaque monitor object.\n *\n *  @see @ref monitor_object\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\ntypedef struct GLFWmonitor GLFWmonitor;\n\n/*! @brief Opaque window object.\n *\n *  Opaque window object.\n *\n *  @see @ref window_object\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef struct GLFWwindow GLFWwindow;\n\n/*! @brief Opaque cursor object.\n *\n *  Opaque cursor object.\n *\n *  @see @ref cursor_object\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup cursor\n */\ntypedef struct GLFWcursor GLFWcursor;\n\n/*! @brief The function signature for error callbacks.\n *\n *  This is the function signature for error callback functions.\n *\n *  @param[in] error An [error code](@ref errors).\n *  @param[in] description A UTF-8 encoded string describing the error.\n *\n *  @sa @ref error_handling\n *  @sa glfwSetErrorCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup init\n */\ntypedef void (* GLFWerrorfun)(int,const char*);\n\n/*! @brief The function signature for window position callbacks.\n *\n *  This is the function signature for window position callback functions.\n *\n *  @param[in] window The window that was moved.\n *  @param[in] xpos The new x-coordinate, in screen coordinates, of the\n *  upper-left corner of the client area of the window.\n *  @param[in] ypos The new y-coordinate, in screen coordinates, of the\n *  upper-left corner of the client area of the window.\n *\n *  @sa @ref window_pos\n *  @sa glfwSetWindowPosCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowposfun)(GLFWwindow*,int,int);\n\n/*! @brief The function signature for window resize callbacks.\n *\n *  This is the function signature for window size callback functions.\n *\n *  @param[in] window The window that was resized.\n *  @param[in] width The new width, in screen coordinates, of the window.\n *  @param[in] height The new height, in screen coordinates, of the window.\n *\n *  @sa @ref window_size\n *  @sa glfwSetWindowSizeCallback\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int);\n\n/*! @brief The function signature for window close callbacks.\n *\n *  This is the function signature for window close callback functions.\n *\n *  @param[in] window The window that the user attempted to close.\n *\n *  @sa @ref window_close\n *  @sa glfwSetWindowCloseCallback\n *\n *  @since Added in version 2.5.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowclosefun)(GLFWwindow*);\n\n/*! @brief The function signature for window content refresh callbacks.\n *\n *  This is the function signature for window refresh callback functions.\n *\n *  @param[in] window The window whose content needs to be refreshed.\n *\n *  @sa @ref window_refresh\n *  @sa glfwSetWindowRefreshCallback\n *\n *  @since Added in version 2.5.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowrefreshfun)(GLFWwindow*);\n\n/*! @brief The function signature for window focus/defocus callbacks.\n *\n *  This is the function signature for window focus callback functions.\n *\n *  @param[in] window The window that gained or lost input focus.\n *  @param[in] focused `GLFW_TRUE` if the window was given input focus, or\n *  `GLFW_FALSE` if it lost it.\n *\n *  @sa @ref window_focus\n *  @sa glfwSetWindowFocusCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);\n\n/*! @brief The function signature for window iconify/restore callbacks.\n *\n *  This is the function signature for window iconify/restore callback\n *  functions.\n *\n *  @param[in] window The window that was iconified or restored.\n *  @param[in] iconified `GLFW_TRUE` if the window was iconified, or\n *  `GLFW_FALSE` if it was restored.\n *\n *  @sa @ref window_iconify\n *  @sa glfwSetWindowIconifyCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int);\n\n/*! @brief The function signature for framebuffer resize callbacks.\n *\n *  This is the function signature for framebuffer resize callback\n *  functions.\n *\n *  @param[in] window The window whose framebuffer was resized.\n *  @param[in] width The new width, in pixels, of the framebuffer.\n *  @param[in] height The new height, in pixels, of the framebuffer.\n *\n *  @sa @ref window_fbsize\n *  @sa glfwSetFramebufferSizeCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\ntypedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int);\n\n/*! @brief The function signature for mouse button callbacks.\n *\n *  This is the function signature for mouse button callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] button The [mouse button](@ref buttons) that was pressed or\n *  released.\n *  @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`.\n *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were\n *  held down.\n *\n *  @sa @ref input_mouse_button\n *  @sa glfwSetMouseButtonCallback\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle and modifier mask parameters.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);\n\n/*! @brief The function signature for cursor position callbacks.\n *\n *  This is the function signature for cursor position callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] xpos The new cursor x-coordinate, relative to the left edge of\n *  the client area.\n *  @param[in] ypos The new cursor y-coordinate, relative to the top edge of the\n *  client area.\n *\n *  @sa @ref cursor_pos\n *  @sa glfwSetCursorPosCallback\n *\n *  @since Added in version 3.0.  Replaces `GLFWmouseposfun`.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWcursorposfun)(GLFWwindow*,double,double);\n\n/*! @brief The function signature for cursor enter/leave callbacks.\n *\n *  This is the function signature for cursor enter/leave callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] entered `GLFW_TRUE` if the cursor entered the window's client\n *  area, or `GLFW_FALSE` if it left it.\n *\n *  @sa @ref cursor_enter\n *  @sa glfwSetCursorEnterCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWcursorenterfun)(GLFWwindow*,int);\n\n/*! @brief The function signature for scroll callbacks.\n *\n *  This is the function signature for scroll callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] xoffset The scroll offset along the x-axis.\n *  @param[in] yoffset The scroll offset along the y-axis.\n *\n *  @sa @ref scrolling\n *  @sa glfwSetScrollCallback\n *\n *  @since Added in version 3.0.  Replaces `GLFWmousewheelfun`.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWscrollfun)(GLFWwindow*,double,double);\n\n/*! @brief The function signature for keyboard key callbacks.\n *\n *  This is the function signature for keyboard key callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] key The [keyboard key](@ref keys) that was pressed or released.\n *  @param[in] scancode The system-specific scancode of the key.\n *  @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`.\n *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were\n *  held down.\n *\n *  @sa @ref input_key\n *  @sa glfwSetKeyCallback\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle, scancode and modifier mask parameters.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);\n\n/*! @brief The function signature for Unicode character callbacks.\n *\n *  This is the function signature for Unicode character callback functions.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] codepoint The Unicode code point of the character.\n *\n *  @sa @ref input_char\n *  @sa glfwSetCharCallback\n *\n *  @since Added in version 2.4.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);\n\n/*! @brief The function signature for Unicode character with modifiers\n *  callbacks.\n *\n *  This is the function signature for Unicode character with modifiers callback\n *  functions.  It is called for each input character, regardless of what\n *  modifier keys are held down.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] codepoint The Unicode code point of the character.\n *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were\n *  held down.\n *\n *  @sa @ref input_char\n *  @sa glfwSetCharModsCallback\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);\n\n/*! @brief The function signature for file drop callbacks.\n *\n *  This is the function signature for file drop callbacks.\n *\n *  @param[in] window The window that received the event.\n *  @param[in] count The number of dropped files.\n *  @param[in] paths The UTF-8 encoded file and/or directory path names.\n *\n *  @sa @ref path_drop\n *  @sa glfwSetDropCallback\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWdropfun)(GLFWwindow*,int,const char**);\n\n/*! @brief The function signature for monitor configuration callbacks.\n *\n *  This is the function signature for monitor configuration callback functions.\n *\n *  @param[in] monitor The monitor that was connected or disconnected.\n *  @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.\n *\n *  @sa @ref monitor_event\n *  @sa glfwSetMonitorCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\ntypedef void (* GLFWmonitorfun)(GLFWmonitor*,int);\n\n/*! @brief The function signature for joystick configuration callbacks.\n *\n *  This is the function signature for joystick configuration callback\n *  functions.\n *\n *  @param[in] joy The joystick that was connected or disconnected.\n *  @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.\n *\n *  @sa @ref joystick_event\n *  @sa glfwSetJoystickCallback\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\ntypedef void (* GLFWjoystickfun)(int,int);\n\n/*! @brief Video mode type.\n *\n *  This describes a single video mode.\n *\n *  @sa @ref monitor_modes\n *  @sa glfwGetVideoMode glfwGetVideoModes\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added refresh rate member.\n *\n *  @ingroup monitor\n */\ntypedef struct GLFWvidmode\n{\n    /*! The width, in screen coordinates, of the video mode.\n     */\n    int width;\n    /*! The height, in screen coordinates, of the video mode.\n     */\n    int height;\n    /*! The bit depth of the red channel of the video mode.\n     */\n    int redBits;\n    /*! The bit depth of the green channel of the video mode.\n     */\n    int greenBits;\n    /*! The bit depth of the blue channel of the video mode.\n     */\n    int blueBits;\n    /*! The refresh rate, in Hz, of the video mode.\n     */\n    int refreshRate;\n} GLFWvidmode;\n\n/*! @brief Gamma ramp.\n *\n *  This describes the gamma ramp for a monitor.\n *\n *  @sa @ref monitor_gamma\n *  @sa glfwGetGammaRamp glfwSetGammaRamp\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\ntypedef struct GLFWgammaramp\n{\n    /*! An array of value describing the response of the red channel.\n     */\n    unsigned short* red;\n    /*! An array of value describing the response of the green channel.\n     */\n    unsigned short* green;\n    /*! An array of value describing the response of the blue channel.\n     */\n    unsigned short* blue;\n    /*! The number of elements in each array.\n     */\n    unsigned int size;\n} GLFWgammaramp;\n\n/*! @brief Image data.\n *\n *  @sa @ref cursor_custom\n *\n *  @since Added in version 2.1.\n *  @glfw3 Removed format and bytes-per-pixel members.\n */\ntypedef struct GLFWimage\n{\n    /*! The width, in pixels, of this image.\n     */\n    int width;\n    /*! The height, in pixels, of this image.\n     */\n    int height;\n    /*! The pixel data of this image, arranged left-to-right, top-to-bottom.\n     */\n    unsigned char* pixels;\n} GLFWimage;\n\n\n/*************************************************************************\n * GLFW API functions\n *************************************************************************/\n\n/*! @brief Initializes the GLFW library.\n *\n *  This function initializes the GLFW library.  Before most GLFW functions can\n *  be used, GLFW must be initialized, and before an application terminates GLFW\n *  should be terminated in order to free any resources allocated during or\n *  after initialization.\n *\n *  If this function fails, it calls @ref glfwTerminate before returning.  If it\n *  succeeds, you should call @ref glfwTerminate before the application exits.\n *\n *  Additional calls to this function after successful initialization but before\n *  termination will return `GLFW_TRUE` immediately.\n *\n *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark @osx This function will change the current directory of the\n *  application to the `Contents/Resources` subdirectory of the application's\n *  bundle, if present.  This can be disabled with a\n *  [compile-time option](@ref compile_options_osx).\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref intro_init\n *  @sa glfwTerminate\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup init\n */\nGLFWAPI int glfwInit(void);\n\n/*! @brief Terminates the GLFW library.\n *\n *  This function destroys all remaining windows and cursors, restores any\n *  modified gamma ramps and frees any other allocated resources.  Once this\n *  function is called, you must again call @ref glfwInit successfully before\n *  you will be able to use most GLFW functions.\n *\n *  If GLFW has been successfully initialized, this function should be called\n *  before the application exits.  If initialization fails, there is no need to\n *  call this function, as it is called by @ref glfwInit before it returns\n *  failure.\n *\n *  @errors Possible errors include @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @warning The contexts of any remaining windows must not be current on any\n *  other thread when this function is called.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref intro_init\n *  @sa glfwInit\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup init\n */\nGLFWAPI void glfwTerminate(void);\n\n/*! @brief Retrieves the version of the GLFW library.\n *\n *  This function retrieves the major, minor and revision numbers of the GLFW\n *  library.  It is intended for when you are using GLFW as a shared library and\n *  want to ensure that you are using the minimum required version.\n *\n *  Any or all of the version arguments may be `NULL`.\n *\n *  @param[out] major Where to store the major version number, or `NULL`.\n *  @param[out] minor Where to store the minor version number, or `NULL`.\n *  @param[out] rev Where to store the revision number, or `NULL`.\n *\n *  @errors None.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref intro_version\n *  @sa glfwGetVersionString\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup init\n */\nGLFWAPI void glfwGetVersion(int* major, int* minor, int* rev);\n\n/*! @brief Returns a string describing the compile-time configuration.\n *\n *  This function returns the compile-time generated\n *  [version string](@ref intro_version_string) of the GLFW library binary.  It\n *  describes the version, platform, compiler and any platform-specific\n *  compile-time options.  It should not be confused with the OpenGL or OpenGL\n *  ES version string, queried with `glGetString`.\n *\n *  __Do not use the version string__ to parse the GLFW library version.  The\n *  @ref glfwGetVersion function provides the version of the running library\n *  binary in numerical format.\n *\n *  @return The ASCII encoded GLFW version string.\n *\n *  @errors None.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @pointer_lifetime The returned string is static and compile-time generated.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref intro_version\n *  @sa glfwGetVersion\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup init\n */\nGLFWAPI const char* glfwGetVersionString(void);\n\n/*! @brief Sets the error callback.\n *\n *  This function sets the error callback, which is called with an error code\n *  and a human-readable description each time a GLFW error occurs.\n *\n *  The error callback is called on the thread where the error occurred.  If you\n *  are using GLFW from multiple threads, your error callback needs to be\n *  written accordingly.\n *\n *  Because the description string may have been generated specifically for that\n *  error, it is not guaranteed to be valid after the callback has returned.  If\n *  you wish to use it after the callback returns, you need to make a copy.\n *\n *  Once set, the error callback remains set even after the library has been\n *  terminated.\n *\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set.\n *\n *  @errors None.\n *\n *  @remark This function may be called before @ref glfwInit.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref error_handling\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup init\n */\nGLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun);\n\n/*! @brief Returns the currently connected monitors.\n *\n *  This function returns an array of handles for all currently connected\n *  monitors.  The primary monitor is always first in the returned array.  If no\n *  monitors were found, this function returns `NULL`.\n *\n *  @param[out] count Where to store the number of monitors in the returned\n *  array.  This is set to zero if an error occurred.\n *  @return An array of monitor handles, or `NULL` if no monitors were found or\n *  if an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is guaranteed to be valid only until the\n *  monitor configuration changes or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_monitors\n *  @sa @ref monitor_event\n *  @sa glfwGetPrimaryMonitor\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI GLFWmonitor** glfwGetMonitors(int* count);\n\n/*! @brief Returns the primary monitor.\n *\n *  This function returns the primary monitor.  This is usually the monitor\n *  where elements like the task bar or global menu bar are located.\n *\n *  @return The primary monitor, or `NULL` if no monitors were found or if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @remark The primary monitor is always first in the array returned by @ref\n *  glfwGetMonitors.\n *\n *  @sa @ref monitor_monitors\n *  @sa glfwGetMonitors\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void);\n\n/*! @brief Returns the position of the monitor's viewport on the virtual screen.\n *\n *  This function returns the position, in screen coordinates, of the upper-left\n *  corner of the specified monitor.\n *\n *  Any or all of the position arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` position arguments will be set to zero.\n *\n *  @param[in] monitor The monitor to query.\n *  @param[out] xpos Where to store the monitor x-coordinate, or `NULL`.\n *  @param[out] ypos Where to store the monitor y-coordinate, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_properties\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos);\n\n/*! @brief Returns the physical size of the monitor.\n *\n *  This function returns the size, in millimetres, of the display area of the\n *  specified monitor.\n *\n *  Some systems do not provide accurate monitor size information, either\n *  because the monitor\n *  [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data)\n *  data is incorrect or because the driver does not report it accurately.\n *\n *  Any or all of the size arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` size arguments will be set to zero.\n *\n *  @param[in] monitor The monitor to query.\n *  @param[out] widthMM Where to store the width, in millimetres, of the\n *  monitor's display area, or `NULL`.\n *  @param[out] heightMM Where to store the height, in millimetres, of the\n *  monitor's display area, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @remark @win32 calculates the returned physical size from the\n *  current resolution and system DPI instead of querying the monitor EDID data.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_properties\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM);\n\n/*! @brief Returns the name of the specified monitor.\n *\n *  This function returns a human-readable name, encoded as UTF-8, of the\n *  specified monitor.  The name typically reflects the make and model of the\n *  monitor and is not guaranteed to be unique among the connected monitors.\n *\n *  @param[in] monitor The monitor to query.\n *  @return The UTF-8 encoded name of the monitor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified monitor is\n *  disconnected or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_properties\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor);\n\n/*! @brief Sets the monitor configuration callback.\n *\n *  This function sets the monitor configuration callback, or removes the\n *  currently set callback.  This is called when a monitor is connected to or\n *  disconnected from the system.\n *\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_event\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun);\n\n/*! @brief Returns the available video modes for the specified monitor.\n *\n *  This function returns an array of all video modes supported by the specified\n *  monitor.  The returned array is sorted in ascending order, first by color\n *  bit depth (the sum of all channel depths) and then by resolution area (the\n *  product of width and height).\n *\n *  @param[in] monitor The monitor to query.\n *  @param[out] count Where to store the number of video modes in the returned\n *  array.  This is set to zero if an error occurred.\n *  @return An array of video modes, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified monitor is\n *  disconnected, this function is called again for that monitor or the library\n *  is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_modes\n *  @sa glfwGetVideoMode\n *\n *  @since Added in version 1.0.\n *  @glfw3 Changed to return an array of modes for a specific monitor.\n *\n *  @ingroup monitor\n */\nGLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count);\n\n/*! @brief Returns the current mode of the specified monitor.\n *\n *  This function returns the current video mode of the specified monitor.  If\n *  you have created a full screen window for that monitor, the return value\n *  will depend on whether that window is iconified.\n *\n *  @param[in] monitor The monitor to query.\n *  @return The current mode of the monitor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified monitor is\n *  disconnected or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_modes\n *  @sa glfwGetVideoModes\n *\n *  @since Added in version 3.0.  Replaces `glfwGetDesktopMode`.\n *\n *  @ingroup monitor\n */\nGLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor);\n\n/*! @brief Generates a gamma ramp and sets it for the specified monitor.\n *\n *  This function generates a 256-element gamma ramp from the specified exponent\n *  and then calls @ref glfwSetGammaRamp with it.  The value must be a finite\n *  number greater than zero.\n *\n *  @param[in] monitor The monitor whose gamma ramp to set.\n *  @param[in] gamma The desired exponent.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_gamma\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma);\n\n/*! @brief Returns the current gamma ramp for the specified monitor.\n *\n *  This function returns the current gamma ramp of the specified monitor.\n *\n *  @param[in] monitor The monitor to query.\n *  @return The current gamma ramp, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned structure and its arrays are allocated and\n *  freed by GLFW.  You should not free them yourself.  They are valid until the\n *  specified monitor is disconnected, this function is called again for that\n *  monitor or the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_gamma\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor);\n\n/*! @brief Sets the current gamma ramp for the specified monitor.\n *\n *  This function sets the current gamma ramp for the specified monitor.  The\n *  original gamma ramp for that monitor is saved by GLFW the first time this\n *  function is called and is restored by @ref glfwTerminate.\n *\n *  @param[in] monitor The monitor whose gamma ramp to set.\n *  @param[in] ramp The gamma ramp to use.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark Gamma ramp sizes other than 256 are not supported by all platforms\n *  or graphics hardware.\n *\n *  @remark @win32 The gamma ramp size must be 256.\n *\n *  @pointer_lifetime The specified gamma ramp is copied before this function\n *  returns.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref monitor_gamma\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup monitor\n */\nGLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp);\n\n/*! @brief Resets all window hints to their default values.\n *\n *  This function resets all window hints to their\n *  [default values](@ref window_hints_values).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_hints\n *  @sa glfwWindowHint\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwDefaultWindowHints(void);\n\n/*! @brief Sets the specified window hint to the desired value.\n *\n *  This function sets hints for the next call to @ref glfwCreateWindow.  The\n *  hints, once set, retain their values until changed by a call to @ref\n *  glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is\n *  terminated.\n *\n *  This function does not check whether the specified hint values are valid.\n *  If you set hints to invalid values this will instead be reported by the next\n *  call to @ref glfwCreateWindow.\n *\n *  @param[in] hint The [window hint](@ref window_hints) to set.\n *  @param[in] value The new value of the window hint.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_hints\n *  @sa glfwDefaultWindowHints\n *\n *  @since Added in version 3.0.  Replaces `glfwOpenWindowHint`.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwWindowHint(int hint, int value);\n\n/*! @brief Creates a window and its associated context.\n *\n *  This function creates a window and its associated OpenGL or OpenGL ES\n *  context.  Most of the options controlling how the window and its context\n *  should be created are specified with [window hints](@ref window_hints).\n *\n *  Successful creation does not change which context is current.  Before you\n *  can use the newly created context, you need to\n *  [make it current](@ref context_current).  For information about the `share`\n *  parameter, see @ref context_sharing.\n *\n *  The created window, framebuffer and context may differ from what you\n *  requested, as not all parameters and hints are\n *  [hard constraints](@ref window_hints_hard).  This includes the size of the\n *  window, especially for full screen windows.  To query the actual attributes\n *  of the created window, framebuffer and context, see @ref\n *  glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize.\n *\n *  To create a full screen window, you need to specify the monitor the window\n *  will cover.  If no monitor is specified, the window will be windowed mode.\n *  Unless you have a way for the user to choose a specific monitor, it is\n *  recommended that you pick the primary monitor.  For more information on how\n *  to query connected monitors, see @ref monitor_monitors.\n *\n *  For full screen windows, the specified size becomes the resolution of the\n *  window's _desired video mode_.  As long as a full screen window is not\n *  iconified, the supported video mode most closely matching the desired video\n *  mode is set for the specified monitor.  For more information about full\n *  screen windows, including the creation of so called _windowed full screen_\n *  or _borderless full screen_ windows, see @ref window_windowed_full_screen.\n *\n *  By default, newly created windows use the placement recommended by the\n *  window system.  To create the window at a specific position, make it\n *  initially invisible using the [GLFW_VISIBLE](@ref window_hints_wnd) window\n *  hint, set its [position](@ref window_pos) and then [show](@ref window_hide)\n *  it.\n *\n *  As long as at least one full screen window is not iconified, the screensaver\n *  is prohibited from starting.\n *\n *  Window systems put limits on window sizes.  Very large or very small window\n *  dimensions may be overridden by the window system on creation.  Check the\n *  actual [size](@ref window_size) after creation.\n *\n *  The [swap interval](@ref buffer_swap) is not set during window creation and\n *  the initial value may vary depending on driver settings and defaults.\n *\n *  @param[in] width The desired width, in screen coordinates, of the window.\n *  This must be greater than zero.\n *  @param[in] height The desired height, in screen coordinates, of the window.\n *  This must be greater than zero.\n *  @param[in] title The initial, UTF-8 encoded window title.\n *  @param[in] monitor The monitor to use for full screen mode, or `NULL` for\n *  windowed mode.\n *  @param[in] share The window whose context to share resources with, or `NULL`\n *  to not share resources.\n *  @return The handle of the created window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref\n *  GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @win32 Window creation will fail if the Microsoft GDI software\n *  OpenGL implementation is the only one available.\n *\n *  @remark @win32 If the executable has an icon resource named `GLFW_ICON,`\n *  it will be set as the icon for the window.  If no such icon is present, the\n *  `IDI_WINLOGO` icon will be used instead.\n *\n *  @remark @win32 The context to share resources with must not be current on\n *  any other thread.\n *\n *  @remark @osx The GLFW window has no icon, as it is not a document\n *  window, but the dock icon will be the same as the application bundle's icon.\n *  For more information on bundles, see the\n *  [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)\n *  in the Mac Developer Library.\n *\n *  @remark @osx The first time a window is created the menu bar is populated\n *  with common commands like Hide, Quit and About.  The About entry opens\n *  a minimal about dialog with information from the application's bundle.  The\n *  menu bar can be disabled with a\n *  [compile-time option](@ref compile_options_osx).\n *\n *  @remark @osx On OS X 10.10 and later the window frame will not be rendered\n *  at full resolution on Retina displays unless the `NSHighResolutionCapable`\n *  key is enabled in the application bundle's `Info.plist`.  For more\n *  information, see\n *  [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html)\n *  in the Mac Developer Library.  The GLFW test and example programs use\n *  a custom `Info.plist` template for this, which can be found as\n *  `CMake/MacOSXBundleInfo.plist.in` in the source tree.\n *\n *  @remark @x11 There is no mechanism for setting the window icon yet.\n *\n *  @remark @x11 Some window managers will not respect the placement of\n *  initially hidden windows.\n *\n *  @remark @x11 Due to the asynchronous nature of X11, it may take a moment for\n *  a window to reach its requested state.  This means you may not be able to\n *  query the final size, position or other attributes directly after window\n *  creation.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_creation\n *  @sa glfwDestroyWindow\n *\n *  @since Added in version 3.0.  Replaces `glfwOpenWindow`.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);\n\n/*! @brief Destroys the specified window and its context.\n *\n *  This function destroys the specified window and its context.  On calling\n *  this function, no further callbacks will be called for that window.\n *\n *  If the context of the specified window is current on the main thread, it is\n *  detached before being destroyed.\n *\n *  @param[in] window The window to destroy.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @note The context of the specified window must not be current on any other\n *  thread when this function is called.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_creation\n *  @sa glfwCreateWindow\n *\n *  @since Added in version 3.0.  Replaces `glfwCloseWindow`.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwDestroyWindow(GLFWwindow* window);\n\n/*! @brief Checks the close flag of the specified window.\n *\n *  This function returns the value of the close flag of the specified window.\n *\n *  @param[in] window The window to query.\n *  @return The value of the close flag.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @sa @ref window_close\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI int glfwWindowShouldClose(GLFWwindow* window);\n\n/*! @brief Sets the close flag of the specified window.\n *\n *  This function sets the value of the close flag of the specified window.\n *  This can be used to override the user's attempt to close the window, or\n *  to signal that it should be closed.\n *\n *  @param[in] window The window whose flag to change.\n *  @param[in] value The new value.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @sa @ref window_close\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value);\n\n/*! @brief Sets the title of the specified window.\n *\n *  This function sets the window title, encoded as UTF-8, of the specified\n *  window.\n *\n *  @param[in] window The window whose title to change.\n *  @param[in] title The UTF-8 encoded window title.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @osx The window title will not be updated until the next time you\n *  process events.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_title\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title);\n\n/*! @brief Sets the icon for the specified window.\n *\n *  This function sets the icon of the specified window.  If passed an array of\n *  candidate images, those of or closest to the sizes desired by the system are\n *  selected.  If no images are specified, the window reverts to its default\n *  icon.\n *\n *  The desired image sizes varies depending on platform and system settings.\n *  The selected images will be rescaled as needed.  Good sizes include 16x16,\n *  32x32 and 48x48.\n *\n *  @param[in] window The window whose icon to set.\n *  @param[in] count The number of images in the specified array, or zero to\n *  revert to the default window icon.\n *  @param[in] images The images to create the icon from.  This is ignored if\n *  count is zero.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The specified image data is copied before this function\n *  returns.\n *\n *  @remark @osx The GLFW window has no icon, as it is not a document\n *  window, but the dock icon will be the same as the application bundle's icon.\n *  For more information on bundles, see the\n *  [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/)\n *  in the Mac Developer Library.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_icon\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images);\n\n/*! @brief Retrieves the position of the client area of the specified window.\n *\n *  This function retrieves the position, in screen coordinates, of the\n *  upper-left corner of the client area of the specified window.\n *\n *  Any or all of the position arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` position arguments will be set to zero.\n *\n *  @param[in] window The window to query.\n *  @param[out] xpos Where to store the x-coordinate of the upper-left corner of\n *  the client area, or `NULL`.\n *  @param[out] ypos Where to store the y-coordinate of the upper-left corner of\n *  the client area, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_pos\n *  @sa glfwSetWindowPos\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);\n\n/*! @brief Sets the position of the client area of the specified window.\n *\n *  This function sets the position, in screen coordinates, of the upper-left\n *  corner of the client area of the specified windowed mode window.  If the\n *  window is a full screen window, this function does nothing.\n *\n *  __Do not use this function__ to move an already visible window unless you\n *  have very good reasons for doing so, as it will confuse and annoy the user.\n *\n *  The window manager may put limits on what positions are allowed.  GLFW\n *  cannot and should not override these limits.\n *\n *  @param[in] window The window to query.\n *  @param[in] xpos The x-coordinate of the upper-left corner of the client area.\n *  @param[in] ypos The y-coordinate of the upper-left corner of the client area.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_pos\n *  @sa glfwGetWindowPos\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);\n\n/*! @brief Retrieves the size of the client area of the specified window.\n *\n *  This function retrieves the size, in screen coordinates, of the client area\n *  of the specified window.  If you wish to retrieve the size of the\n *  framebuffer of the window in pixels, see @ref glfwGetFramebufferSize.\n *\n *  Any or all of the size arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` size arguments will be set to zero.\n *\n *  @param[in] window The window whose size to retrieve.\n *  @param[out] width Where to store the width, in screen coordinates, of the\n *  client area, or `NULL`.\n *  @param[out] height Where to store the height, in screen coordinates, of the\n *  client area, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_size\n *  @sa glfwSetWindowSize\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);\n\n/*! @brief Sets the size limits of the specified window.\n *\n *  This function sets the size limits of the client area of the specified\n *  window.  If the window is full screen, the size limits only take effect if\n *  once it is made windowed.  If the window is not resizable, this function\n *  does nothing.\n *\n *  The size limits are applied immediately to a windowed mode window and may\n *  cause it to be resized.\n *\n *  @param[in] window The window to set limits for.\n *  @param[in] minwidth The minimum width, in screen coordinates, of the client\n *  area, or `GLFW_DONT_CARE`.\n *  @param[in] minheight The minimum height, in screen coordinates, of the\n *  client area, or `GLFW_DONT_CARE`.\n *  @param[in] maxwidth The maximum width, in screen coordinates, of the client\n *  area, or `GLFW_DONT_CARE`.\n *  @param[in] maxheight The maximum height, in screen coordinates, of the\n *  client area, or `GLFW_DONT_CARE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark If you set size limits and an aspect ratio that conflict, the\n *  results are undefined.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_sizelimits\n *  @sa glfwSetWindowAspectRatio\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);\n\n/*! @brief Sets the aspect ratio of the specified window.\n *\n *  This function sets the required aspect ratio of the client area of the\n *  specified window.  If the window is full screen, the aspect ratio only takes\n *  effect once it is made windowed.  If the window is not resizable, this\n *  function does nothing.\n *\n *  The aspect ratio is specified as a numerator and a denominator and both\n *  values must be greater than zero.  For example, the common 16:9 aspect ratio\n *  is specified as 16 and 9, respectively.\n *\n *  If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect\n *  ratio limit is disabled.\n *\n *  The aspect ratio is applied immediately to a windowed mode window and may\n *  cause it to be resized.\n *\n *  @param[in] window The window to set limits for.\n *  @param[in] numer The numerator of the desired aspect ratio, or\n *  `GLFW_DONT_CARE`.\n *  @param[in] denom The denominator of the desired aspect ratio, or\n *  `GLFW_DONT_CARE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark If you set size limits and an aspect ratio that conflict, the\n *  results are undefined.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_sizelimits\n *  @sa glfwSetWindowSizeLimits\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);\n\n/*! @brief Sets the size of the client area of the specified window.\n *\n *  This function sets the size, in screen coordinates, of the client area of\n *  the specified window.\n *\n *  For full screen windows, this function updates the resolution of its desired\n *  video mode and switches to the video mode closest to it, without affecting\n *  the window's context.  As the context is unaffected, the bit depths of the\n *  framebuffer remain unchanged.\n *\n *  If you wish to update the refresh rate of the desired video mode in addition\n *  to its resolution, see @ref glfwSetWindowMonitor.\n *\n *  The window manager may put limits on what sizes are allowed.  GLFW cannot\n *  and should not override these limits.\n *\n *  @param[in] window The window to resize.\n *  @param[in] width The desired width, in screen coordinates, of the window\n *  client area.\n *  @param[in] height The desired height, in screen coordinates, of the window\n *  client area.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_size\n *  @sa glfwGetWindowSize\n *  @sa glfwSetWindowMonitor\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height);\n\n/*! @brief Retrieves the size of the framebuffer of the specified window.\n *\n *  This function retrieves the size, in pixels, of the framebuffer of the\n *  specified window.  If you wish to retrieve the size of the window in screen\n *  coordinates, see @ref glfwGetWindowSize.\n *\n *  Any or all of the size arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` size arguments will be set to zero.\n *\n *  @param[in] window The window whose framebuffer to query.\n *  @param[out] width Where to store the width, in pixels, of the framebuffer,\n *  or `NULL`.\n *  @param[out] height Where to store the height, in pixels, of the framebuffer,\n *  or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_fbsize\n *  @sa glfwSetFramebufferSizeCallback\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height);\n\n/*! @brief Retrieves the size of the frame of the window.\n *\n *  This function retrieves the size, in screen coordinates, of each edge of the\n *  frame of the specified window.  This size includes the title bar, if the\n *  window has one.  The size of the frame may vary depending on the\n *  [window-related hints](@ref window_hints_wnd) used to create it.\n *\n *  Because this function retrieves the size of each window frame edge and not\n *  the offset along a particular coordinate axis, the retrieved values will\n *  always be zero or positive.\n *\n *  Any or all of the size arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` size arguments will be set to zero.\n *\n *  @param[in] window The window whose frame size to query.\n *  @param[out] left Where to store the size, in screen coordinates, of the left\n *  edge of the window frame, or `NULL`.\n *  @param[out] top Where to store the size, in screen coordinates, of the top\n *  edge of the window frame, or `NULL`.\n *  @param[out] right Where to store the size, in screen coordinates, of the\n *  right edge of the window frame, or `NULL`.\n *  @param[out] bottom Where to store the size, in screen coordinates, of the\n *  bottom edge of the window frame, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_size\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom);\n\n/*! @brief Iconifies the specified window.\n *\n *  This function iconifies (minimizes) the specified window if it was\n *  previously restored.  If the window is already iconified, this function does\n *  nothing.\n *\n *  If the specified window is a full screen window, the original monitor\n *  resolution is restored until the window is restored.\n *\n *  @param[in] window The window to iconify.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_iconify\n *  @sa glfwRestoreWindow\n *  @sa glfwMaximizeWindow\n *\n *  @since Added in version 2.1.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwIconifyWindow(GLFWwindow* window);\n\n/*! @brief Restores the specified window.\n *\n *  This function restores the specified window if it was previously iconified\n *  (minimized) or maximized.  If the window is already restored, this function\n *  does nothing.\n *\n *  If the specified window is a full screen window, the resolution chosen for\n *  the window is restored on the selected monitor.\n *\n *  @param[in] window The window to restore.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_iconify\n *  @sa glfwIconifyWindow\n *  @sa glfwMaximizeWindow\n *\n *  @since Added in version 2.1.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwRestoreWindow(GLFWwindow* window);\n\n/*! @brief Maximizes the specified window.\n *\n *  This function maximizes the specified window if it was previously not\n *  maximized.  If the window is already maximized, this function does nothing.\n *\n *  If the specified window is a full screen window, this function does nothing.\n *\n *  @param[in] window The window to maximize.\n *\n *  @par Thread Safety\n *  This function may only be called from the main thread.\n *\n *  @sa @ref window_iconify\n *  @sa glfwIconifyWindow\n *  @sa glfwRestoreWindow\n *\n *  @since Added in GLFW 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwMaximizeWindow(GLFWwindow* window);\n\n/*! @brief Makes the specified window visible.\n *\n *  This function makes the specified window visible if it was previously\n *  hidden.  If the window is already visible or is in full screen mode, this\n *  function does nothing.\n *\n *  @param[in] window The window to make visible.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_hide\n *  @sa glfwHideWindow\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwShowWindow(GLFWwindow* window);\n\n/*! @brief Hides the specified window.\n *\n *  This function hides the specified window if it was previously visible.  If\n *  the window is already hidden or is in full screen mode, this function does\n *  nothing.\n *\n *  @param[in] window The window to hide.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_hide\n *  @sa glfwShowWindow\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwHideWindow(GLFWwindow* window);\n\n/*! @brief Brings the specified window to front and sets input focus.\n *\n *  This function brings the specified window to front and sets input focus.\n *  The window should already be visible and not iconified.\n *\n *  By default, both windowed and full screen mode windows are focused when\n *  initially created.  Set the [GLFW_FOCUSED](@ref window_hints_wnd) to disable\n *  this behavior.\n *\n *  __Do not use this function__ to steal focus from other applications unless\n *  you are certain that is what the user wants.  Focus stealing can be\n *  extremely disruptive.\n *\n *  @param[in] window The window to give input focus.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_focus\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwFocusWindow(GLFWwindow* window);\n\n/*! @brief Returns the monitor that the window uses for full screen mode.\n *\n *  This function returns the handle of the monitor that the specified window is\n *  in full screen on.\n *\n *  @param[in] window The window to query.\n *  @return The monitor, or `NULL` if the window is in windowed mode or an error\n *  occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_monitor\n *  @sa glfwSetWindowMonitor\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window);\n\n/*! @brief Sets the mode, monitor, video mode and placement of a window.\n *\n *  This function sets the monitor that the window uses for full screen mode or,\n *  if the monitor is `NULL`, makes it windowed mode.\n *\n *  When setting a monitor, this function updates the width, height and refresh\n *  rate of the desired video mode and switches to the video mode closest to it.\n *  The window position is ignored when setting a monitor.\n *\n *  When the monitor is `NULL`, the position, width and height are used to\n *  place the window client area.  The refresh rate is ignored when no monitor\n *  is specified.\n *\n *  If you only wish to update the resolution of a full screen window or the\n *  size of a windowed mode window, see @ref glfwSetWindowSize.\n *\n *  When a window transitions from full screen to windowed mode, this function\n *  restores any previous window settings such as whether it is decorated,\n *  floating, resizable, has size or aspect ratio limits, etc..\n *\n *  @param[in] window The window whose monitor, size or video mode to set.\n *  @param[in] monitor The desired monitor, or `NULL` to set windowed mode.\n *  @param[in] xpos The desired x-coordinate of the upper-left corner of the\n *  client area.\n *  @param[in] ypos The desired y-coordinate of the upper-left corner of the\n *  client area.\n *  @param[in] width The desired with, in screen coordinates, of the client area\n *  or video mode.\n *  @param[in] height The desired height, in screen coordinates, of the client\n *  area or video mode.\n *  @param[in] refreshRate The desired refresh rate, in Hz, of the video mode.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_monitor\n *  @sa @ref window_full_screen\n *  @sa glfwGetWindowMonitor\n *  @sa glfwSetWindowSize\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);\n\n/*! @brief Returns an attribute of the specified window.\n *\n *  This function returns the value of an attribute of the specified window or\n *  its OpenGL or OpenGL ES context.\n *\n *  @param[in] window The window to query.\n *  @param[in] attrib The [window attribute](@ref window_attribs) whose value to\n *  return.\n *  @return The value of the attribute, or zero if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark Framebuffer related hints are not window attributes.  See @ref\n *  window_attribs_fb for more information.\n *\n *  @remark Zero is a valid value for many window and context related\n *  attributes so you cannot use a return value of zero as an indication of\n *  errors.  However, this function should not fail as long as it is passed\n *  valid arguments and the library has been [initialized](@ref intro_init).\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_attribs\n *\n *  @since Added in version 3.0.  Replaces `glfwGetWindowParam` and\n *  `glfwGetGLVersion`.\n *\n *  @ingroup window\n */\nGLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib);\n\n/*! @brief Sets the user pointer of the specified window.\n *\n *  This function sets the user-defined pointer of the specified window.  The\n *  current value is retained until the window is destroyed.  The initial value\n *  is `NULL`.\n *\n *  @param[in] window The window whose pointer to set.\n *  @param[in] pointer The new value.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @sa @ref window_userptr\n *  @sa glfwGetWindowUserPointer\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer);\n\n/*! @brief Returns the user pointer of the specified window.\n *\n *  This function returns the current value of the user-defined pointer of the\n *  specified window.  The initial value is `NULL`.\n *\n *  @param[in] window The window whose pointer to return.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @sa @ref window_userptr\n *  @sa glfwSetWindowUserPointer\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window);\n\n/*! @brief Sets the position callback for the specified window.\n *\n *  This function sets the position callback of the specified window, which is\n *  called when the window is moved.  The callback is provided with the screen\n *  position of the upper-left corner of the client area of the window.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_pos\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun);\n\n/*! @brief Sets the size callback for the specified window.\n *\n *  This function sets the size callback of the specified window, which is\n *  called when the window is resized.  The callback is provided with the size,\n *  in screen coordinates, of the client area of the window.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_size\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun);\n\n/*! @brief Sets the close callback for the specified window.\n *\n *  This function sets the close callback of the specified window, which is\n *  called when the user attempts to close the window, for example by clicking\n *  the close widget in the title bar.\n *\n *  The close flag is set before this callback is called, but you can modify it\n *  at any time with @ref glfwSetWindowShouldClose.\n *\n *  The close callback is not triggered by @ref glfwDestroyWindow.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @remark @osx Selecting Quit from the application menu will trigger the close\n *  callback for all windows.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_close\n *\n *  @since Added in version 2.5.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun);\n\n/*! @brief Sets the refresh callback for the specified window.\n *\n *  This function sets the refresh callback of the specified window, which is\n *  called when the client area of the window needs to be redrawn, for example\n *  if the window has been exposed after having been covered by another window.\n *\n *  On compositing window systems such as Aero, Compiz or Aqua, where the window\n *  contents are saved off-screen, this callback may be called only very\n *  infrequently or never at all.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_refresh\n *\n *  @since Added in version 2.5.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun);\n\n/*! @brief Sets the focus callback for the specified window.\n *\n *  This function sets the focus callback of the specified window, which is\n *  called when the window gains or loses input focus.\n *\n *  After the focus callback is called for a window that lost input focus,\n *  synthetic key and mouse button release events will be generated for all such\n *  that had been pressed.  For more information, see @ref glfwSetKeyCallback\n *  and @ref glfwSetMouseButtonCallback.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_focus\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun);\n\n/*! @brief Sets the iconify callback for the specified window.\n *\n *  This function sets the iconification callback of the specified window, which\n *  is called when the window is iconified or restored.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_iconify\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun);\n\n/*! @brief Sets the framebuffer resize callback for the specified window.\n *\n *  This function sets the framebuffer resize callback of the specified window,\n *  which is called when the framebuffer of the specified window is resized.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref window_fbsize\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup window\n */\nGLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun);\n\n/*! @brief Processes all pending events.\n *\n *  This function processes only those events that are already in the event\n *  queue and then returns immediately.  Processing events will cause the window\n *  and input callbacks associated with those events to be called.\n *\n *  On some platforms, a window move, resize or menu operation will cause event\n *  processing to block.  This is due to how event processing is designed on\n *  those platforms.  You can use the\n *  [window refresh callback](@ref window_refresh) to redraw the contents of\n *  your window when necessary during such operations.\n *\n *  On some platforms, certain events are sent directly to the application\n *  without going through the event queue, causing callbacks to be called\n *  outside of a call to one of the event processing functions.\n *\n *  Event processing is not required for joystick input to work.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref events\n *  @sa glfwWaitEvents\n *  @sa glfwWaitEventsTimeout\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwPollEvents(void);\n\n/*! @brief Waits until events are queued and processes them.\n *\n *  This function puts the calling thread to sleep until at least one event is\n *  available in the event queue.  Once one or more events are available,\n *  it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue\n *  are processed and the function then returns immediately.  Processing events\n *  will cause the window and input callbacks associated with those events to be\n *  called.\n *\n *  Since not all events are associated with callbacks, this function may return\n *  without a callback having been called even if you are monitoring all\n *  callbacks.\n *\n *  On some platforms, a window move, resize or menu operation will cause event\n *  processing to block.  This is due to how event processing is designed on\n *  those platforms.  You can use the\n *  [window refresh callback](@ref window_refresh) to redraw the contents of\n *  your window when necessary during such operations.\n *\n *  On some platforms, certain callbacks may be called outside of a call to one\n *  of the event processing functions.\n *\n *  If no windows exist, this function returns immediately.  For synchronization\n *  of threads in applications that do not create windows, use your threading\n *  library of choice.\n *\n *  Event processing is not required for joystick input to work.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref events\n *  @sa glfwPollEvents\n *  @sa glfwWaitEventsTimeout\n *\n *  @since Added in version 2.5.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwWaitEvents(void);\n\n/*! @brief Waits with timeout until events are queued and processes them.\n *\n *  This function puts the calling thread to sleep until at least one event is\n *  available in the event queue, or until the specified timeout is reached.  If\n *  one or more events are available, it behaves exactly like @ref\n *  glfwPollEvents, i.e. the events in the queue are processed and the function\n *  then returns immediately.  Processing events will cause the window and input\n *  callbacks associated with those events to be called.\n *\n *  The timeout value must be a positive finite number.\n *\n *  Since not all events are associated with callbacks, this function may return\n *  without a callback having been called even if you are monitoring all\n *  callbacks.\n *\n *  On some platforms, a window move, resize or menu operation will cause event\n *  processing to block.  This is due to how event processing is designed on\n *  those platforms.  You can use the\n *  [window refresh callback](@ref window_refresh) to redraw the contents of\n *  your window when necessary during such operations.\n *\n *  On some platforms, certain callbacks may be called outside of a call to one\n *  of the event processing functions.\n *\n *  If no windows exist, this function returns immediately.  For synchronization\n *  of threads in applications that do not create windows, use your threading\n *  library of choice.\n *\n *  Event processing is not required for joystick input to work.\n *\n *  @param[in] timeout The maximum amount of time, in seconds, to wait.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref events\n *  @sa glfwPollEvents\n *  @sa glfwWaitEvents\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwWaitEventsTimeout(double timeout);\n\n/*! @brief Posts an empty event to the event queue.\n *\n *  This function posts an empty event from the current thread to the event\n *  queue, causing @ref glfwWaitEvents to return.\n *\n *  If no windows exist, this function returns immediately.  For synchronization\n *  of threads in applications that do not create windows, use your threading\n *  library of choice.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref events\n *  @sa glfwWaitEvents\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwPostEmptyEvent(void);\n\n/*! @brief Returns the value of an input option for the specified window.\n *\n *  This function returns the value of an input option for the specified window.\n *  The mode must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or\n *  `GLFW_STICKY_MOUSE_BUTTONS`.\n *\n *  @param[in] window The window to query.\n *  @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or\n *  `GLFW_STICKY_MOUSE_BUTTONS`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa glfwSetInputMode\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);\n\n/*! @brief Sets an input option for the specified window.\n *\n *  This function sets an input mode option for the specified window.  The mode\n *  must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or\n *  `GLFW_STICKY_MOUSE_BUTTONS`.\n *\n *  If the mode is `GLFW_CURSOR`, the value must be one of the following cursor\n *  modes:\n *  - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally.\n *  - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client\n *    area of the window but does not restrict the cursor from leaving.\n *  - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual\n *    and unlimited cursor movement.  This is useful for implementing for\n *    example 3D camera controls.\n *\n *  If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to\n *  enable sticky keys, or `GLFW_FALSE` to disable it.  If sticky keys are\n *  enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS`\n *  the next time it is called even if the key had been released before the\n *  call.  This is useful when you are only interested in whether keys have been\n *  pressed but not when or in which order.\n *\n *  If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either\n *  `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it.\n *  If sticky mouse buttons are enabled, a mouse button press will ensure that\n *  @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even\n *  if the mouse button had been released before the call.  This is useful when\n *  you are only interested in whether mouse buttons have been pressed but not\n *  when or in which order.\n *\n *  @param[in] window The window whose input mode to set.\n *  @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or\n *  `GLFW_STICKY_MOUSE_BUTTONS`.\n *  @param[in] value The new value of the specified input mode.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa glfwGetInputMode\n *\n *  @since Added in version 3.0.  Replaces `glfwEnable` and `glfwDisable`.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value);\n\n/*! @brief Returns the localized name of the specified printable key.\n *\n *  This function returns the localized name of the specified printable key.\n *  This is intended for displaying key bindings to the user.\n *\n *  If the key is `GLFW_KEY_UNKNOWN`, the scancode is used instead, otherwise\n *  the scancode is ignored.  If a non-printable key or (if the key is\n *  `GLFW_KEY_UNKNOWN`) a scancode that maps to a non-printable key is\n *  specified, this function returns `NULL`.          \n *\n *  This behavior allows you to pass in the arguments passed to the\n *  [key callback](@ref input_key) without modification.\n *\n *  The printable keys are:\n *  - `GLFW_KEY_APOSTROPHE`\n *  - `GLFW_KEY_COMMA`\n *  - `GLFW_KEY_MINUS`\n *  - `GLFW_KEY_PERIOD`\n *  - `GLFW_KEY_SLASH`\n *  - `GLFW_KEY_SEMICOLON`\n *  - `GLFW_KEY_EQUAL`\n *  - `GLFW_KEY_LEFT_BRACKET`\n *  - `GLFW_KEY_RIGHT_BRACKET`\n *  - `GLFW_KEY_BACKSLASH`\n *  - `GLFW_KEY_WORLD_1`\n *  - `GLFW_KEY_WORLD_2`\n *  - `GLFW_KEY_0` to `GLFW_KEY_9`\n *  - `GLFW_KEY_A` to `GLFW_KEY_Z`\n *  - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9`\n *  - `GLFW_KEY_KP_DECIMAL`\n *  - `GLFW_KEY_KP_DIVIDE`\n *  - `GLFW_KEY_KP_MULTIPLY`\n *  - `GLFW_KEY_KP_SUBTRACT`\n *  - `GLFW_KEY_KP_ADD`\n *  - `GLFW_KEY_KP_EQUAL`\n *\n *  @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`.\n *  @param[in] scancode The scancode of the key to query.\n *  @return The localized name of the key, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the next call to @ref\n *  glfwGetKeyName, or until the library is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_key_name\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\nGLFWAPI const char* glfwGetKeyName(int key, int scancode);\n\n/*! @brief Returns the last reported state of a keyboard key for the specified\n *  window.\n *\n *  This function returns the last state reported for the specified key to the\n *  specified window.  The returned state is one of `GLFW_PRESS` or\n *  `GLFW_RELEASE`.  The higher-level action `GLFW_REPEAT` is only reported to\n *  the key callback.\n *\n *  If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns\n *  `GLFW_PRESS` the first time you call it for a key that was pressed, even if\n *  that key has already been released.\n *\n *  The key functions deal with physical keys, with [key tokens](@ref keys)\n *  named after their use on the standard US keyboard layout.  If you want to\n *  input text, use the Unicode character callback instead.\n *\n *  The [modifier key bit masks](@ref mods) are not key tokens and cannot be\n *  used with this function.\n *\n *  __Do not use this function__ to implement [text input](@ref input_char).\n *\n *  @param[in] window The desired window.\n *  @param[in] key The desired [keyboard key](@ref keys).  `GLFW_KEY_UNKNOWN` is\n *  not a valid key for this function.\n *  @return One of `GLFW_PRESS` or `GLFW_RELEASE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_key\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwGetKey(GLFWwindow* window, int key);\n\n/*! @brief Returns the last reported state of a mouse button for the specified\n *  window.\n *\n *  This function returns the last state reported for the specified mouse button\n *  to the specified window.  The returned state is one of `GLFW_PRESS` or\n *  `GLFW_RELEASE`.\n *\n *  If the `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function\n *  `GLFW_PRESS` the first time you call it for a mouse button that was pressed,\n *  even if that mouse button has already been released.\n *\n *  @param[in] window The desired window.\n *  @param[in] button The desired [mouse button](@ref buttons).\n *  @return One of `GLFW_PRESS` or `GLFW_RELEASE`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_ENUM.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_mouse_button\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button);\n\n/*! @brief Retrieves the position of the cursor relative to the client area of\n *  the window.\n *\n *  This function returns the position of the cursor, in screen coordinates,\n *  relative to the upper-left corner of the client area of the specified\n *  window.\n *\n *  If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor\n *  position is unbounded and limited only by the minimum and maximum values of\n *  a `double`.\n *\n *  The coordinate can be converted to their integer equivalents with the\n *  `floor` function.  Casting directly to an integer type works for positive\n *  coordinates, but fails for negative ones.\n *\n *  Any or all of the position arguments may be `NULL`.  If an error occurs, all\n *  non-`NULL` position arguments will be set to zero.\n *\n *  @param[in] window The desired window.\n *  @param[out] xpos Where to store the cursor x-coordinate, relative to the\n *  left edge of the client area, or `NULL`.\n *  @param[out] ypos Where to store the cursor y-coordinate, relative to the to\n *  top edge of the client area, or `NULL`.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_pos\n *  @sa glfwSetCursorPos\n *\n *  @since Added in version 3.0.  Replaces `glfwGetMousePos`.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);\n\n/*! @brief Sets the position of the cursor, relative to the client area of the\n *  window.\n *\n *  This function sets the position, in screen coordinates, of the cursor\n *  relative to the upper-left corner of the client area of the specified\n *  window.  The window must have input focus.  If the window does not have\n *  input focus when this function is called, it fails silently.\n *\n *  __Do not use this function__ to implement things like camera controls.  GLFW\n *  already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the\n *  cursor, transparently re-centers it and provides unconstrained cursor\n *  motion.  See @ref glfwSetInputMode for more information.\n *\n *  If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is\n *  unconstrained and limited only by the minimum and maximum values of\n *  a `double`.\n *\n *  @param[in] window The desired window.\n *  @param[in] xpos The desired x-coordinate, relative to the left edge of the\n *  client area.\n *  @param[in] ypos The desired y-coordinate, relative to the top edge of the\n *  client area.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @remark @x11 Due to the asynchronous nature of X11, it may take a moment for\n *  the window focus event to arrive.  This means you may not be able to set the\n *  cursor position directly after window creation.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_pos\n *  @sa glfwGetCursorPos\n *\n *  @since Added in version 3.0.  Replaces `glfwSetMousePos`.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos);\n\n/*! @brief Creates a custom cursor.\n *\n *  Creates a new custom cursor image that can be set for a window with @ref\n *  glfwSetCursor.  The cursor can be destroyed with @ref glfwDestroyCursor.\n *  Any remaining cursors are destroyed by @ref glfwTerminate.\n *\n *  The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight\n *  bits per channel.  They are arranged canonically as packed sequential rows,\n *  starting from the top-left corner.\n *\n *  The cursor hotspot is specified in pixels, relative to the upper-left corner\n *  of the cursor image.  Like all other coordinate systems in GLFW, the X-axis\n *  points to the right and the Y-axis points down.\n *\n *  @param[in] image The desired cursor image.\n *  @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot.\n *  @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot.\n *  @return The handle of the created cursor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The specified image data is copied before this function\n *  returns.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_object\n *  @sa glfwDestroyCursor\n *  @sa glfwCreateStandardCursor\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot);\n\n/*! @brief Creates a cursor with a standard shape.\n *\n *  Returns a cursor with a [standard shape](@ref shapes), that can be set for\n *  a window with @ref glfwSetCursor.\n *\n *  @param[in] shape One of the [standard shapes](@ref shapes).\n *  @return A new cursor ready to use or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_object\n *  @sa glfwCreateCursor\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape);\n\n/*! @brief Destroys a cursor.\n *\n *  This function destroys a cursor previously created with @ref\n *  glfwCreateCursor.  Any remaining cursors will be destroyed by @ref\n *  glfwTerminate.\n *\n *  @param[in] cursor The cursor object to destroy.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @reentrancy This function must not be called from a callback.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_object\n *  @sa glfwCreateCursor\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwDestroyCursor(GLFWcursor* cursor);\n\n/*! @brief Sets the cursor for the window.\n *\n *  This function sets the cursor image to be used when the cursor is over the\n *  client area of the specified window.  The set cursor will only be visible\n *  when the [cursor mode](@ref cursor_mode) of the window is\n *  `GLFW_CURSOR_NORMAL`.\n *\n *  On some platforms, the set cursor may not be visible unless the window also\n *  has input focus.\n *\n *  @param[in] window The window to set the cursor for.\n *  @param[in] cursor The cursor to set, or `NULL` to switch back to the default\n *  arrow cursor.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_object\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor);\n\n/*! @brief Sets the key callback.\n *\n *  This function sets the key callback of the specified window, which is called\n *  when a key is pressed, repeated or released.\n *\n *  The key functions deal with physical keys, with layout independent\n *  [key tokens](@ref keys) named after their values in the standard US keyboard\n *  layout.  If you want to input text, use the\n *  [character callback](@ref glfwSetCharCallback) instead.\n *\n *  When a window loses input focus, it will generate synthetic key release\n *  events for all pressed keys.  You can tell these events from user-generated\n *  events by the fact that the synthetic ones are generated after the focus\n *  loss event has been processed, i.e. after the\n *  [window focus callback](@ref glfwSetWindowFocusCallback) has been called.\n *\n *  The scancode of a key is specific to that platform or sometimes even to that\n *  machine.  Scancodes are intended to allow users to bind keys that don't have\n *  a GLFW key token.  Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their\n *  state is not saved and so it cannot be queried with @ref glfwGetKey.\n *\n *  Sometimes GLFW needs to generate synthetic key events, in which case the\n *  scancode may be zero.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new key callback, or `NULL` to remove the currently\n *  set callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_key\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);\n\n/*! @brief Sets the Unicode character callback.\n *\n *  This function sets the character callback of the specified window, which is\n *  called when a Unicode character is input.\n *\n *  The character callback is intended for Unicode text input.  As it deals with\n *  characters, it is keyboard layout dependent, whereas the\n *  [key callback](@ref glfwSetKeyCallback) is not.  Characters do not map 1:1\n *  to physical keys, as a key may produce zero, one or more characters.  If you\n *  want to know whether a specific physical key was pressed or released, see\n *  the key callback instead.\n *\n *  The character callback behaves as system text input normally does and will\n *  not be called if modifier keys are held down that would prevent normal text\n *  input on that platform, for example a Super (Command) key on OS X or Alt key\n *  on Windows.  There is a\n *  [character with modifiers callback](@ref glfwSetCharModsCallback) that\n *  receives these events.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_char\n *\n *  @since Added in version 2.4.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun);\n\n/*! @brief Sets the Unicode character with modifiers callback.\n *\n *  This function sets the character with modifiers callback of the specified\n *  window, which is called when a Unicode character is input regardless of what\n *  modifier keys are used.\n *\n *  The character with modifiers callback is intended for implementing custom\n *  Unicode character input.  For regular Unicode text input, see the\n *  [character callback](@ref glfwSetCharCallback).  Like the character\n *  callback, the character with modifiers callback deals with characters and is\n *  keyboard layout dependent.  Characters do not map 1:1 to physical keys, as\n *  a key may produce zero, one or more characters.  If you want to know whether\n *  a specific physical key was pressed or released, see the\n *  [key callback](@ref glfwSetKeyCallback) instead.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or an\n *  error occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_char\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun);\n\n/*! @brief Sets the mouse button callback.\n *\n *  This function sets the mouse button callback of the specified window, which\n *  is called when a mouse button is pressed or released.\n *\n *  When a window loses input focus, it will generate synthetic mouse button\n *  release events for all pressed mouse buttons.  You can tell these events\n *  from user-generated events by the fact that the synthetic ones are generated\n *  after the focus loss event has been processed, i.e. after the\n *  [window focus callback](@ref glfwSetWindowFocusCallback) has been called.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref input_mouse_button\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter and return value.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun);\n\n/*! @brief Sets the cursor position callback.\n *\n *  This function sets the cursor position callback of the specified window,\n *  which is called when the cursor is moved.  The callback is provided with the\n *  position, in screen coordinates, relative to the upper-left corner of the\n *  client area of the window.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_pos\n *\n *  @since Added in version 3.0.  Replaces `glfwSetMousePosCallback`.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun);\n\n/*! @brief Sets the cursor enter/exit callback.\n *\n *  This function sets the cursor boundary crossing callback of the specified\n *  window, which is called when the cursor enters or leaves the client area of\n *  the window.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref cursor_enter\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun);\n\n/*! @brief Sets the scroll callback.\n *\n *  This function sets the scroll callback of the specified window, which is\n *  called when a scrolling device is used, such as a mouse wheel or scrolling\n *  area of a touchpad.\n *\n *  The scroll callback receives all scrolling input, like that from a mouse\n *  wheel or a touchpad scrolling area.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new scroll callback, or `NULL` to remove the currently\n *  set callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref scrolling\n *\n *  @since Added in version 3.0.  Replaces `glfwSetMouseWheelCallback`.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun);\n\n/*! @brief Sets the file drop callback.\n *\n *  This function sets the file drop callback of the specified window, which is\n *  called when one or more dragged files are dropped on the window.\n *\n *  Because the path array and its strings may have been generated specifically\n *  for that event, they are not guaranteed to be valid after the callback has\n *  returned.  If you wish to use them after the callback returns, you need to\n *  make a deep copy.\n *\n *  @param[in] window The window whose callback to set.\n *  @param[in] cbfun The new file drop callback, or `NULL` to remove the\n *  currently set callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref path_drop\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun);\n\n/*! @brief Returns whether the specified joystick is present.\n *\n *  This function returns whether the specified joystick is present.\n *\n *  @param[in] joy The [joystick](@ref joysticks) to query.\n *  @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick\n *\n *  @since Added in version 3.0.  Replaces `glfwGetJoystickParam`.\n *\n *  @ingroup input\n */\nGLFWAPI int glfwJoystickPresent(int joy);\n\n/*! @brief Returns the values of all axes of the specified joystick.\n *\n *  This function returns the values of all axes of the specified joystick.\n *  Each element in the array is a value between -1.0 and 1.0.\n *\n *  Querying a joystick slot with no device present is not an error, but will\n *  cause this function to return `NULL`.  Call @ref glfwJoystickPresent to\n *  check device presence.\n *\n *  @param[in] joy The [joystick](@ref joysticks) to query.\n *  @param[out] count Where to store the number of axis values in the returned\n *  array.  This is set to zero if an error occurred.\n *  @return An array of axis values, or `NULL` if the joystick is not present.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected, this function is called again for that joystick or the library\n *  is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_axis\n *\n *  @since Added in version 3.0.  Replaces `glfwGetJoystickPos`.\n *\n *  @ingroup input\n */\nGLFWAPI const float* glfwGetJoystickAxes(int joy, int* count);\n\n/*! @brief Returns the state of all buttons of the specified joystick.\n *\n *  This function returns the state of all buttons of the specified joystick.\n *  Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`.\n *\n *  Querying a joystick slot with no device present is not an error, but will\n *  cause this function to return `NULL`.  Call @ref glfwJoystickPresent to\n *  check device presence.\n *\n *  @param[in] joy The [joystick](@ref joysticks) to query.\n *  @param[out] count Where to store the number of button states in the returned\n *  array.  This is set to zero if an error occurred.\n *  @return An array of button states, or `NULL` if the joystick is not present.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected, this function is called again for that joystick or the library\n *  is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_button\n *\n *  @since Added in version 2.2.\n *  @glfw3 Changed to return a dynamic array.\n *\n *  @ingroup input\n */\nGLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count);\n\n/*! @brief Returns the name of the specified joystick.\n *\n *  This function returns the name, encoded as UTF-8, of the specified joystick.\n *  The returned string is allocated and freed by GLFW.  You should not free it\n *  yourself.\n *\n *  Querying a joystick slot with no device present is not an error, but will\n *  cause this function to return `NULL`.  Call @ref glfwJoystickPresent to\n *  check device presence.\n *\n *  @param[in] joy The [joystick](@ref joysticks) to query.\n *  @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick\n *  is not present.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the specified joystick is\n *  disconnected, this function is called again for that joystick or the library\n *  is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_name\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI const char* glfwGetJoystickName(int joy);\n\n/*! @brief Sets the joystick configuration callback.\n *\n *  This function sets the joystick configuration callback, or removes the\n *  currently set callback.  This is called when a joystick is connected to or\n *  disconnected from the system.\n *\n *  @param[in] cbfun The new callback, or `NULL` to remove the currently set\n *  callback.\n *  @return The previously set callback, or `NULL` if no callback was set or the\n *  library had not been [initialized](@ref intro_init).\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref joystick_event\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\nGLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun);\n\n/*! @brief Sets the clipboard to the specified string.\n *\n *  This function sets the system clipboard to the specified, UTF-8 encoded\n *  string.\n *\n *  @param[in] window The window that will own the clipboard contents.\n *  @param[in] string A UTF-8 encoded string.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The specified string is copied before this function\n *  returns.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref clipboard\n *  @sa glfwGetClipboardString\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string);\n\n/*! @brief Returns the contents of the clipboard as a string.\n *\n *  This function returns the contents of the system clipboard, if it contains\n *  or is convertible to a UTF-8 encoded string.  If the clipboard is empty or\n *  if its contents cannot be converted, `NULL` is returned and a @ref\n *  GLFW_FORMAT_UNAVAILABLE error is generated.\n *\n *  @param[in] window The window that will request the clipboard contents.\n *  @return The contents of the clipboard as a UTF-8 encoded string, or `NULL`\n *  if an [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is valid until the next call to @ref\n *  glfwGetClipboardString or @ref glfwSetClipboardString, or until the library\n *  is terminated.\n *\n *  @thread_safety This function must only be called from the main thread.\n *\n *  @sa @ref clipboard\n *  @sa glfwSetClipboardString\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup input\n */\nGLFWAPI const char* glfwGetClipboardString(GLFWwindow* window);\n\n/*! @brief Returns the value of the GLFW timer.\n *\n *  This function returns the value of the GLFW timer.  Unless the timer has\n *  been set using @ref glfwSetTime, the timer measures time elapsed since GLFW\n *  was initialized.\n *\n *  The resolution of the timer is system dependent, but is usually on the order\n *  of a few micro- or nanoseconds.  It uses the highest-resolution monotonic\n *  time source on each supported platform.\n *\n *  @return The current value, in seconds, or zero if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.  Reading of the\n *  internal timer offset is not atomic.\n *\n *  @sa @ref time\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup input\n */\nGLFWAPI double glfwGetTime(void);\n\n/*! @brief Sets the GLFW timer.\n *\n *  This function sets the value of the GLFW timer.  It then continues to count\n *  up from that value.  The value must be a positive finite number less than\n *  or equal to 18446744073.0, which is approximately 584.5 years.\n *\n *  @param[in] time The new value, in seconds.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_INVALID_VALUE.\n *\n *  @remark The upper limit of the timer is calculated as\n *  floor((2<sup>64</sup> - 1) / 10<sup>9</sup>) and is due to implementations\n *  storing nanoseconds in 64 bits.  The limit may be increased in the future.\n *\n *  @thread_safety This function may be called from any thread.  Writing of the\n *  internal timer offset is not atomic.\n *\n *  @sa @ref time\n *\n *  @since Added in version 2.2.\n *\n *  @ingroup input\n */\nGLFWAPI void glfwSetTime(double time);\n\n/*! @brief Returns the current value of the raw timer.\n *\n *  This function returns the current value of the raw timer, measured in\n *  1&nbsp;/&nbsp;frequency seconds.  To get the frequency, call @ref\n *  glfwGetTimerFrequency.\n *\n *  @return The value of the timer, or zero if an \n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref time\n *  @sa glfwGetTimerFrequency\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\nGLFWAPI uint64_t glfwGetTimerValue(void);\n\n/*! @brief Returns the frequency, in Hz, of the raw timer.\n *\n *  This function returns the frequency, in Hz, of the raw timer.\n *\n *  @return The frequency of the timer, in Hz, or zero if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref time\n *  @sa glfwGetTimerValue\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup input\n */\nGLFWAPI uint64_t glfwGetTimerFrequency(void);\n\n/*! @brief Makes the context of the specified window current for the calling\n *  thread.\n *\n *  This function makes the OpenGL or OpenGL ES context of the specified window\n *  current on the calling thread.  A context can only be made current on\n *  a single thread at a time and each thread can have only a single current\n *  context at a time.\n *\n *  By default, making a context non-current implicitly forces a pipeline flush.\n *  On machines that support `GL_KHR_context_flush_control`, you can control\n *  whether a context performs this flush by setting the\n *  [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint.\n *\n *  The specified window must have an OpenGL or OpenGL ES context.  Specifying\n *  a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT\n *  error.\n *\n *  @param[in] window The window whose context to make current, or `NULL` to\n *  detach the current context.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref context_current\n *  @sa glfwGetCurrentContext\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup context\n */\nGLFWAPI void glfwMakeContextCurrent(GLFWwindow* window);\n\n/*! @brief Returns the window whose context is current on the calling thread.\n *\n *  This function returns the window whose OpenGL or OpenGL ES context is\n *  current on the calling thread.\n *\n *  @return The window whose context is current, or `NULL` if no window's\n *  context is current.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref context_current\n *  @sa glfwMakeContextCurrent\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup context\n */\nGLFWAPI GLFWwindow* glfwGetCurrentContext(void);\n\n/*! @brief Swaps the front and back buffers of the specified window.\n *\n *  This function swaps the front and back buffers of the specified window when\n *  rendering with OpenGL or OpenGL ES.  If the swap interval is greater than\n *  zero, the GPU driver waits the specified number of screen updates before\n *  swapping the buffers.\n *\n *  The specified window must have an OpenGL or OpenGL ES context.  Specifying\n *  a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT\n *  error.\n *\n *  This function does not apply to Vulkan.  If you are rendering with Vulkan,\n *  see `vkQueuePresentKHR` instead.\n *\n *  @param[in] window The window whose buffers to swap.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark __EGL:__ The context of the specified window must be current on the\n *  calling thread.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref buffer_swap\n *  @sa glfwSwapInterval\n *\n *  @since Added in version 1.0.\n *  @glfw3 Added window handle parameter.\n *\n *  @ingroup window\n */\nGLFWAPI void glfwSwapBuffers(GLFWwindow* window);\n\n/*! @brief Sets the swap interval for the current context.\n *\n *  This function sets the swap interval for the current OpenGL or OpenGL ES\n *  context, i.e. the number of screen updates to wait from the time @ref\n *  glfwSwapBuffers was called before swapping the buffers and returning.  This\n *  is sometimes called _vertical synchronization_, _vertical retrace\n *  synchronization_ or just _vsync_.\n *\n *  Contexts that support either of the `WGL_EXT_swap_control_tear` and\n *  `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals,\n *  which allow the driver to swap even if a frame arrives a little bit late.\n *  You can check for the presence of these extensions using @ref\n *  glfwExtensionSupported.  For more information about swap tearing, see the\n *  extension specifications.\n *\n *  A context must be current on the calling thread.  Calling this function\n *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error.\n *\n *  This function does not apply to Vulkan.  If you are rendering with Vulkan,\n *  see the present mode of your swapchain instead.\n *\n *  @param[in] interval The minimum number of screen updates to wait for\n *  until the buffers are swapped by @ref glfwSwapBuffers.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark This function is not called during context creation, leaving the\n *  swap interval set to whatever is the default on that platform.  This is done\n *  because some swap interval extensions used by GLFW do not allow the swap\n *  interval to be reset to zero once it has been set to a non-zero value.\n *\n *  @remark Some GPU drivers do not honor the requested swap interval, either\n *  because of a user setting that overrides the application's request or due to\n *  bugs in the driver.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref buffer_swap\n *  @sa glfwSwapBuffers\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup context\n */\nGLFWAPI void glfwSwapInterval(int interval);\n\n/*! @brief Returns whether the specified extension is available.\n *\n *  This function returns whether the specified\n *  [API extension](@ref context_glext) is supported by the current OpenGL or\n *  OpenGL ES context.  It searches both for client API extension and context\n *  creation API extensions.\n *\n *  A context must be current on the calling thread.  Calling this function\n *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error.\n *\n *  As this functions retrieves and searches one or more extension strings each\n *  call, it is recommended that you cache its results if it is going to be used\n *  frequently.  The extension strings will not change during the lifetime of\n *  a context, so there is no danger in doing this.\n *\n *  This function does not apply to Vulkan.  If you are using Vulkan, see @ref\n *  glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties`\n *  and `vkEnumerateDeviceExtensionProperties` instead.\n *\n *  @param[in] extension The ASCII encoded name of the extension.\n *  @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE`\n *  otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref\n *  GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref context_glext\n *  @sa glfwGetProcAddress\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup context\n */\nGLFWAPI int glfwExtensionSupported(const char* extension);\n\n/*! @brief Returns the address of the specified function for the current\n *  context.\n *\n *  This function returns the address of the specified OpenGL or OpenGL ES\n *  [core or extension function](@ref context_glext), if it is supported\n *  by the current context.\n *\n *  A context must be current on the calling thread.  Calling this function\n *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error.\n *\n *  This function does not apply to Vulkan.  If you are rendering with Vulkan,\n *  see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and\n *  `vkGetDeviceProcAddr` instead.\n *\n *  @param[in] procname The ASCII encoded name of the function.\n *  @return The address of the function, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remark The address of a given function is not guaranteed to be the same\n *  between contexts.\n *\n *  @remark This function may return a non-`NULL` address despite the\n *  associated version or extension not being available.  Always check the\n *  context version or extension string first.\n *\n *  @pointer_lifetime The returned function pointer is valid until the context\n *  is destroyed or the library is terminated.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref context_glext\n *  @sa glfwExtensionSupported\n *\n *  @since Added in version 1.0.\n *\n *  @ingroup context\n */\nGLFWAPI GLFWglproc glfwGetProcAddress(const char* procname);\n\n/*! @brief Returns whether the Vulkan loader has been found.\n *\n *  This function returns whether the Vulkan loader has been found.  This check\n *  is performed by @ref glfwInit.\n *\n *  The availability of a Vulkan loader does not by itself guarantee that window\n *  surface creation or even device creation is possible.  Call @ref\n *  glfwGetRequiredInstanceExtensions to check whether the extensions necessary\n *  for Vulkan surface creation are available and @ref\n *  glfwGetPhysicalDevicePresentationSupport to check whether a queue family of\n *  a physical device supports image presentation.\n *\n *  @return `GLFW_TRUE` if Vulkan is available, or `GLFW_FALSE` otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref vulkan_support\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI int glfwVulkanSupported(void);\n\n/*! @brief Returns the Vulkan instance extensions required by GLFW.\n *\n *  This function returns an array of names of Vulkan instance extensions required\n *  by GLFW for creating Vulkan surfaces for GLFW windows.  If successful, the\n *  list will always contains `VK_KHR_surface`, so if you don't require any\n *  additional extensions you can pass this list directly to the\n *  `VkInstanceCreateInfo` struct.\n *\n *  If Vulkan is not available on the machine, this function returns `NULL` and\n *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported\n *  to check whether Vulkan is available.\n *\n *  If Vulkan is available but no set of extensions allowing window surface\n *  creation was found, this function returns `NULL`.  You may still use Vulkan\n *  for off-screen rendering and compute work.\n *\n *  @param[out] count Where to store the number of extensions in the returned\n *  array.  This is set to zero if an error occurred.\n *  @return An array of ASCII encoded extension names, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_API_UNAVAILABLE.\n *\n *  @remarks Additional extensions may be required by future versions of GLFW.\n *  You should check if any extensions you wish to enable are already in the\n *  returned array, as it is an error to specify an extension more than once in\n *  the `VkInstanceCreateInfo` struct.\n *\n *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You\n *  should not free it yourself.  It is guaranteed to be valid only until the\n *  library is terminated.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref vulkan_ext\n *  @sa glfwCreateWindowSurface\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count);\n\n#if defined(VK_VERSION_1_0)\n\n/*! @brief Returns the address of the specified Vulkan instance function.\n *\n *  This function returns the address of the specified Vulkan core or extension\n *  function for the specified instance.  If instance is set to `NULL` it can\n *  return any function exported from the Vulkan loader, including at least the\n *  following functions:\n *\n *  - `vkEnumerateInstanceExtensionProperties`\n *  - `vkEnumerateInstanceLayerProperties`\n *  - `vkCreateInstance`\n *  - `vkGetInstanceProcAddr`\n *\n *  If Vulkan is not available on the machine, this function returns `NULL` and\n *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported\n *  to check whether Vulkan is available.\n *\n *  This function is equivalent to calling `vkGetInstanceProcAddr` with\n *  a platform-specific query of the Vulkan loader as a fallback.\n *\n *  @param[in] instance The Vulkan instance to query, or `NULL` to retrieve\n *  functions related to instance creation.\n *  @param[in] procname The ASCII encoded name of the function.\n *  @return The address of the function, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref\n *  GLFW_API_UNAVAILABLE.\n *\n *  @pointer_lifetime The returned function pointer is valid until the library\n *  is terminated.\n *\n *  @thread_safety This function may be called from any thread.\n *\n *  @sa @ref vulkan_proc\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname);\n\n/*! @brief Returns whether the specified queue family can present images.\n *\n *  This function returns whether the specified queue family of the specified\n *  physical device supports presentation to the platform GLFW was built for.\n *\n *  If Vulkan or the required window surface creation instance extensions are\n *  not available on the machine, or if the specified instance was not created\n *  with the required extensions, this function returns `GLFW_FALSE` and\n *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported\n *  to check whether Vulkan is available and @ref\n *  glfwGetRequiredInstanceExtensions to check what instance extensions are\n *  required.\n *\n *  @param[in] instance The instance that the physical device belongs to.\n *  @param[in] device The physical device that the queue family belongs to.\n *  @param[in] queuefamily The index of the queue family to query.\n *  @return `GLFW_TRUE` if the queue family supports presentation, or\n *  `GLFW_FALSE` otherwise.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @thread_safety This function may be called from any thread.  For\n *  synchronization details of Vulkan objects, see the Vulkan specification.\n *\n *  @sa @ref vulkan_present\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);\n\n/*! @brief Creates a Vulkan surface for the specified window.\n *\n *  This function creates a Vulkan surface for the specified window.\n *\n *  If the Vulkan loader was not found at initialization, this function returns\n *  `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref GLFW_API_UNAVAILABLE\n *  error.  Call @ref glfwVulkanSupported to check whether the Vulkan loader was\n *  found.\n *\n *  If the required window surface creation instance extensions are not\n *  available or if the specified instance was not created with these extensions\n *  enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and\n *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref\n *  glfwGetRequiredInstanceExtensions to check what instance extensions are\n *  required.\n *\n *  The window surface must be destroyed before the specified Vulkan instance.\n *  It is the responsibility of the caller to destroy the window surface.  GLFW\n *  does not destroy it for you.  Call `vkDestroySurfaceKHR` to destroy the\n *  surface.\n *\n *  @param[in] instance The Vulkan instance to create the surface in.\n *  @param[in] window The window to create the surface for.\n *  @param[in] allocator The allocator to use, or `NULL` to use the default\n *  allocator.\n *  @param[out] surface Where to store the handle of the surface.  This is set\n *  to `VK_NULL_HANDLE` if an error occurred.\n *  @return `VK_SUCCESS` if successful, or a Vulkan error code if an\n *  [error](@ref error_handling) occurred.\n *\n *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref\n *  GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.\n *\n *  @remarks If an error occurs before the creation call is made, GLFW returns\n *  the Vulkan error code most appropriate for the error.  Appropriate use of\n *  @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should\n *  eliminate almost all occurrences of these errors.\n *\n *  @thread_safety This function may be called from any thread.  For\n *  synchronization details of Vulkan objects, see the Vulkan specification.\n *\n *  @sa @ref vulkan_surface\n *  @sa glfwGetRequiredInstanceExtensions\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup vulkan\n */\nGLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);\n\n#endif /*VK_VERSION_1_0*/\n\n\n/*************************************************************************\n * Global definition cleanup\n *************************************************************************/\n\n/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */\n\n#ifdef GLFW_WINGDIAPI_DEFINED\n #undef WINGDIAPI\n #undef GLFW_WINGDIAPI_DEFINED\n#endif\n\n#ifdef GLFW_CALLBACK_DEFINED\n #undef CALLBACK\n #undef GLFW_CALLBACK_DEFINED\n#endif\n\n/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _glfw3_h_ */\n\n"
  },
  {
    "path": "external/imgui/examples/libs/glfw/include/GLFW/glfw3native.h",
    "content": "/*************************************************************************\n * GLFW 3.2 - www.glfw.org\n * A library for OpenGL, window and input\n *------------------------------------------------------------------------\n * Copyright (c) 2002-2006 Marcus Geelnard\n * Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n *    claim that you wrote the original software. If you use this software\n *    in a product, an acknowledgment in the product documentation would\n *    be appreciated but is not required.\n *\n * 2. Altered source versions must be plainly marked as such, and must not\n *    be misrepresented as being the original software.\n *\n * 3. This notice may not be removed or altered from any source\n *    distribution.\n *\n *************************************************************************/\n\n#ifndef _glfw3_native_h_\n#define _glfw3_native_h_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/*************************************************************************\n * Doxygen documentation\n *************************************************************************/\n\n/*! @file glfw3native.h\n *  @brief The header of the native access functions.\n *\n *  This is the header file of the native access functions.  See @ref native for\n *  more information.\n */\n/*! @defgroup native Native access\n *\n *  **By using the native access functions you assert that you know what you're\n *  doing and how to fix problems caused by using them.  If you don't, you\n *  shouldn't be using them.**\n *\n *  Before the inclusion of @ref glfw3native.h, you may define exactly one\n *  window system API macro and zero or more context creation API macros.\n *\n *  The chosen backends must match those the library was compiled for.  Failure\n *  to do this will cause a link-time error.\n *\n *  The available window API macros are:\n *  * `GLFW_EXPOSE_NATIVE_WIN32`\n *  * `GLFW_EXPOSE_NATIVE_COCOA`\n *  * `GLFW_EXPOSE_NATIVE_X11`\n *  * `GLFW_EXPOSE_NATIVE_WAYLAND`\n *  * `GLFW_EXPOSE_NATIVE_MIR`\n *\n *  The available context API macros are:\n *  * `GLFW_EXPOSE_NATIVE_WGL`\n *  * `GLFW_EXPOSE_NATIVE_NSGL`\n *  * `GLFW_EXPOSE_NATIVE_GLX`\n *  * `GLFW_EXPOSE_NATIVE_EGL`\n *\n *  These macros select which of the native access functions that are declared\n *  and which platform-specific headers to include.  It is then up your (by\n *  definition platform-specific) code to handle which of these should be\n *  defined.\n */\n\n\n/*************************************************************************\n * System headers and types\n *************************************************************************/\n\n#if defined(GLFW_EXPOSE_NATIVE_WIN32)\n // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for\n // example to allow applications to correctly declare a GL_ARB_debug_output\n // callback) but windows.h assumes no one will define APIENTRY before it does\n #undef APIENTRY\n #include <windows.h>\n#elif defined(GLFW_EXPOSE_NATIVE_COCOA)\n #include <ApplicationServices/ApplicationServices.h>\n #if defined(__OBJC__)\n  #import <Cocoa/Cocoa.h>\n #else\n  typedef void* id;\n #endif\n#elif defined(GLFW_EXPOSE_NATIVE_X11)\n #include <X11/Xlib.h>\n #include <X11/extensions/Xrandr.h>\n#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)\n #include <wayland-client.h>\n#elif defined(GLFW_EXPOSE_NATIVE_MIR)\n #include <mir_toolkit/mir_client_library.h>\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_WGL)\n /* WGL is declared by windows.h */\n#endif\n#if defined(GLFW_EXPOSE_NATIVE_NSGL)\n /* NSGL is declared by Cocoa.h */\n#endif\n#if defined(GLFW_EXPOSE_NATIVE_GLX)\n #include <GL/glx.h>\n#endif\n#if defined(GLFW_EXPOSE_NATIVE_EGL)\n #include <EGL/egl.h>\n#endif\n\n\n/*************************************************************************\n * Functions\n *************************************************************************/\n\n#if defined(GLFW_EXPOSE_NATIVE_WIN32)\n/*! @brief Returns the adapter device name of the specified monitor.\n *\n *  @return The UTF-8 encoded adapter device name (for example `\\\\.\\DISPLAY1`)\n *  of the specified monitor, or `NULL` if an [error](@ref error_handling)\n *  occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);\n\n/*! @brief Returns the display device name of the specified monitor.\n *\n *  @return The UTF-8 encoded display device name (for example\n *  `\\\\.\\DISPLAY1\\Monitor0`) of the specified monitor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the `HWND` of the specified window.\n *\n *  @return The `HWND` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_WGL)\n/*! @brief Returns the `HGLRC` of the specified window.\n *\n *  @return The `HGLRC` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_COCOA)\n/*! @brief Returns the `CGDirectDisplayID` of the specified monitor.\n *\n *  @return The `CGDirectDisplayID` of the specified monitor, or\n *  `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the `NSWindow` of the specified window.\n *\n *  @return The `NSWindow` of the specified window, or `nil` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_NSGL)\n/*! @brief Returns the `NSOpenGLContext` of the specified window.\n *\n *  @return The `NSOpenGLContext` of the specified window, or `nil` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI id glfwGetNSGLContext(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_X11)\n/*! @brief Returns the `Display` used by GLFW.\n *\n *  @return The `Display` used by GLFW, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI Display* glfwGetX11Display(void);\n\n/*! @brief Returns the `RRCrtc` of the specified monitor.\n *\n *  @return The `RRCrtc` of the specified monitor, or `None` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);\n\n/*! @brief Returns the `RROutput` of the specified monitor.\n *\n *  @return The `RROutput` of the specified monitor, or `None` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.1.\n *\n *  @ingroup native\n */\nGLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the `Window` of the specified window.\n *\n *  @return The `Window` of the specified window, or `None` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI Window glfwGetX11Window(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_GLX)\n/*! @brief Returns the `GLXContext` of the specified window.\n *\n *  @return The `GLXContext` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);\n\n/*! @brief Returns the `GLXWindow` of the specified window.\n *\n *  @return The `GLXWindow` of the specified window, or `None` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)\n/*! @brief Returns the `struct wl_display*` used by GLFW.\n *\n *  @return The `struct wl_display*` used by GLFW, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI struct wl_display* glfwGetWaylandDisplay(void);\n\n/*! @brief Returns the `struct wl_output*` of the specified monitor.\n *\n *  @return The `struct wl_output*` of the specified monitor, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the main `struct wl_surface*` of the specified window.\n *\n *  @return The main `struct wl_surface*` of the specified window, or `NULL` if\n *  an [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_MIR)\n/*! @brief Returns the `MirConnection*` used by GLFW.\n *\n *  @return The `MirConnection*` used by GLFW, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI MirConnection* glfwGetMirDisplay(void);\n\n/*! @brief Returns the Mir output ID of the specified monitor.\n *\n *  @return The Mir output ID of the specified monitor, or zero if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor);\n\n/*! @brief Returns the `MirSurface*` of the specified window.\n *\n *  @return The `MirSurface*` of the specified window, or `NULL` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.2.\n *\n *  @ingroup native\n */\nGLFWAPI MirSurface* glfwGetMirWindow(GLFWwindow* window);\n#endif\n\n#if defined(GLFW_EXPOSE_NATIVE_EGL)\n/*! @brief Returns the `EGLDisplay` used by GLFW.\n *\n *  @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI EGLDisplay glfwGetEGLDisplay(void);\n\n/*! @brief Returns the `EGLContext` of the specified window.\n *\n *  @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);\n\n/*! @brief Returns the `EGLSurface` of the specified window.\n *\n *  @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an\n *  [error](@ref error_handling) occurred.\n *\n *  @thread_safety This function may be called from any thread.  Access is not\n *  synchronized.\n *\n *  @since Added in version 3.0.\n *\n *  @ingroup native\n */\nGLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _glfw3_native_h_ */\n\n"
  },
  {
    "path": "external/imgui/examples/libs/usynergy/uSynergy.c",
    "content": "/*\nuSynergy client -- Implementation for the embedded Synergy client library\n  version 1.0.0, July 7th, 2012\n\nCopyright (c) 2012 Alex Evans\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n   1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n   2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n   3. This notice may not be removed or altered from any source\n   distribution.\n*/\n#include \"uSynergy.h\"\n#include <stdio.h>\n#include <string.h>\n\n\n\n//---------------------------------------------------------------------------------------------------------------------\n//\tInternal helpers\n//---------------------------------------------------------------------------------------------------------------------\n\n\n\n/**\n@brief Read 16 bit integer in network byte order and convert to native byte order\n**/\nstatic int16_t sNetToNative16(const unsigned char *value)\n{\n#ifdef USYNERGY_LITTLE_ENDIAN\n\treturn value[1] | (value[0] << 8);\n#else\n\treturn value[0] | (value[1] << 8);\n#endif\n}\n\n\n\n/**\n@brief Read 32 bit integer in network byte order and convert to native byte order\n**/\nstatic int32_t sNetToNative32(const unsigned char *value)\n{\n#ifdef USYNERGY_LITTLE_ENDIAN\n\treturn value[3] | (value[2] << 8) | (value[1] << 16) | (value[0] << 24);\n#else\n\treturn value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24);\n#endif\n}\n\n\n\n/**\n@brief Trace text to client\n**/\nstatic void sTrace(uSynergyContext *context, const char* text)\n{\n\t// Don't trace if we don't have a trace function\n\tif (context->m_traceFunc != 0L)\n\t\tcontext->m_traceFunc(context->m_cookie, text);\n}\n\n\n\n/**\n@brief Add string to reply packet\n**/\nstatic void sAddString(uSynergyContext *context, const char *string)\n{\n\tsize_t len = strlen(string);\n\tmemcpy(context->m_replyCur, string, len);\n\tcontext->m_replyCur += len;\n}\n\n\n\n/**\n@brief Add uint8 to reply packet\n**/\nstatic void sAddUInt8(uSynergyContext *context, uint8_t value)\n{\n\t*context->m_replyCur++ = value;\n}\n\n\n\n/**\n@brief Add uint16 to reply packet\n**/\nstatic void sAddUInt16(uSynergyContext *context, uint16_t value)\n{\n\tuint8_t *reply = context->m_replyCur;\n\t*reply++ = (uint8_t)(value >> 8);\n\t*reply++ = (uint8_t)value;\n\tcontext->m_replyCur = reply;\n}\n\n\n\n/**\n@brief Add uint32 to reply packet\n**/\nstatic void sAddUInt32(uSynergyContext *context, uint32_t value)\n{\n\tuint8_t *reply = context->m_replyCur;\n\t*reply++ = (uint8_t)(value >> 24);\n\t*reply++ = (uint8_t)(value >> 16);\n\t*reply++ = (uint8_t)(value >> 8);\n\t*reply++ = (uint8_t)value;\n\tcontext->m_replyCur = reply;\n}\n\n\n\n/**\n@brief Send reply packet\n**/\nstatic uSynergyBool sSendReply(uSynergyContext *context)\n{\n\t// Set header size\n\tuint8_t\t\t*reply_buf\t= context->m_replyBuffer;\n\tuint32_t\treply_len\t= (uint32_t)(context->m_replyCur - reply_buf);\t\t\t\t/* Total size of reply */\n\tuint32_t\tbody_len\t= reply_len - 4;\t\t\t\t\t\t\t\t\t\t\t/* Size of body */\n\tuSynergyBool ret;\n\treply_buf[0] = (uint8_t)(body_len >> 24);\n\treply_buf[1] = (uint8_t)(body_len >> 16);\n\treply_buf[2] = (uint8_t)(body_len >> 8);\n\treply_buf[3] = (uint8_t)body_len;\n\n\t// Send reply\n\tret = context->m_sendFunc(context->m_cookie, context->m_replyBuffer, reply_len);\n\n\t// Reset reply buffer write pointer\n\tcontext->m_replyCur = context->m_replyBuffer+4;\n\treturn ret;\n}\n\n\n\n/**\n@brief Call mouse callback after a mouse event\n**/\nstatic void sSendMouseCallback(uSynergyContext *context)\n{\n\t// Skip if no callback is installed\n\tif (context->m_mouseCallback == 0L)\n\t\treturn;\n\n\t// Send callback\n\tcontext->m_mouseCallback(context->m_cookie, context->m_mouseX, context->m_mouseY, context->m_mouseWheelX,\n\t\tcontext->m_mouseWheelY, context->m_mouseButtonLeft, context->m_mouseButtonRight, context->m_mouseButtonMiddle);\n}\n\n\n\n/**\n@brief Send keyboard callback when a key has been pressed or released\n**/\nstatic void sSendKeyboardCallback(uSynergyContext *context, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat)\n{\n\t// Skip if no callback is installed\n\tif (context->m_keyboardCallback == 0L)\n\t\treturn;\n\n\t// Send callback\n\tcontext->m_keyboardCallback(context->m_cookie, key, modifiers, down, repeat);\n}\n\n\n\n/**\n@brief Send joystick callback\n**/\nstatic void sSendJoystickCallback(uSynergyContext *context, uint8_t joyNum)\n{\n\tint8_t *sticks;\n\n\t// Skip if no callback is installed\n\tif (context->m_joystickCallback == 0L)\n\t\treturn;\n\n\t// Send callback\n\tsticks = context->m_joystickSticks[joyNum];\n\tcontext->m_joystickCallback(context->m_cookie, joyNum, context->m_joystickButtons[joyNum], sticks[0], sticks[1], sticks[2], sticks[3]);\n}\n\n\n\n/**\n@brief Parse a single client message, update state, send callbacks and send replies\n**/\n#define USYNERGY_IS_PACKET(pkt_id)\tmemcmp(message+4, pkt_id, 4)==0\nstatic void sProcessMessage(uSynergyContext *context, const uint8_t *message)\n{\n\t// We have a packet!\n\tif (memcmp(message+4, \"Synergy\", 7)==0)\n\t{\n\t\t// Welcome message\n\t\t//\t\tkMsgHello\t\t\t= \"Synergy%2i%2i\"\n\t\t//\t\tkMsgHelloBack\t\t= \"Synergy%2i%2i%s\"\n\t\tsAddString(context, \"Synergy\");\n\t\tsAddUInt16(context, USYNERGY_PROTOCOL_MAJOR);\n\t\tsAddUInt16(context, USYNERGY_PROTOCOL_MINOR);\n\t\tsAddUInt32(context, (uint32_t)strlen(context->m_clientName));\n\t\tsAddString(context, context->m_clientName);\n\t\tif (!sSendReply(context))\n\t\t{\n\t\t\t// Send reply failed, let's try to reconnect\n\t\t\tsTrace(context, \"SendReply failed, trying to reconnect in a second\");\n\t\t\tcontext->m_connected = USYNERGY_FALSE;\n\t\t\tcontext->m_sleepFunc(context->m_cookie, 1000);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Let's assume we're connected\n\t\t\tchar buffer[256+1];\n\t\t\tsprintf(buffer, \"Connected as client \\\"%s\\\"\", context->m_clientName);\n\t\t\tsTrace(context, buffer);\n\t\t\tcontext->m_hasReceivedHello = USYNERGY_TRUE;\n\t\t}\n\t\treturn;\n\t}\n\telse if (USYNERGY_IS_PACKET(\"QINF\"))\n\t{\n\t\t// Screen info. Reply with DINF\n\t\t//\t\tkMsgQInfo\t\t\t= \"QINF\"\n\t\t//\t\tkMsgDInfo\t\t\t= \"DINF%2i%2i%2i%2i%2i%2i%2i\"\n\t\tuint16_t x = 0, y = 0, warp = 0;\n\t\tsAddString(context, \"DINF\");\n\t\tsAddUInt16(context, x);\n\t\tsAddUInt16(context, y);\n\t\tsAddUInt16(context, context->m_clientWidth);\n\t\tsAddUInt16(context, context->m_clientHeight);\n\t\tsAddUInt16(context, warp);\n\t\tsAddUInt16(context, 0);\t\t// mx?\n\t\tsAddUInt16(context, 0);\t\t// my?\n\t\tsSendReply(context);\n\t\treturn;\n\t}\n\telse if (USYNERGY_IS_PACKET(\"CIAK\"))\n\t{\n\t\t// Do nothing?\n\t\t//\t\tkMsgCInfoAck\t\t= \"CIAK\"\n\t\treturn;\n\t}\n\telse if (USYNERGY_IS_PACKET(\"CROP\"))\n\t{\n\t\t// Do nothing?\n\t\t//\t\tkMsgCResetOptions\t= \"CROP\"\n\t\treturn;\n\t}\n\telse if (USYNERGY_IS_PACKET(\"CINN\"))\n\t{\n\t\t// Screen enter. Reply with CNOP\n\t\t//\t\tkMsgCEnter \t\t\t= \"CINN%2i%2i%4i%2i\"\n\n\t\t// Obtain the Synergy sequence number\n\t\tcontext->m_sequenceNumber = sNetToNative32(message + 12);\n\t\tcontext->m_isCaptured = USYNERGY_TRUE;\n\n\t\t// Call callback\n\t\tif (context->m_screenActiveCallback != 0L)\n\t\t\tcontext->m_screenActiveCallback(context->m_cookie, USYNERGY_TRUE);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"COUT\"))\n\t{\n\t\t// Screen leave\n\t\t//\t\tkMsgCLeave \t\t\t= \"COUT\"\n\t\tcontext->m_isCaptured = USYNERGY_FALSE;\n\n\t\t// Call callback\n\t\tif (context->m_screenActiveCallback != 0L)\n\t\t\tcontext->m_screenActiveCallback(context->m_cookie, USYNERGY_FALSE);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DMDN\"))\n\t{\n\t\t// Mouse down\n\t\t//\t\tkMsgDMouseDown\t\t= \"DMDN%1i\"\n\t\tchar btn = message[8]-1;\n\t\tif (btn==2)\n\t\t\tcontext->m_mouseButtonRight\t\t= USYNERGY_TRUE;\n\t\telse if (btn==1)\n\t\t\tcontext->m_mouseButtonMiddle\t= USYNERGY_TRUE;\n\t\telse\n\t\t\tcontext->m_mouseButtonLeft\t\t= USYNERGY_TRUE;\n\t\tsSendMouseCallback(context);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DMUP\"))\n\t{\n\t\t// Mouse up\n\t\t//\t\tkMsgDMouseUp\t\t= \"DMUP%1i\"\n\t\tchar btn = message[8]-1;\n\t\tif (btn==2)\n\t\t\tcontext->m_mouseButtonRight\t\t= USYNERGY_FALSE;\n\t\telse if (btn==1)\n\t\t\tcontext->m_mouseButtonMiddle\t= USYNERGY_FALSE;\n\t\telse\n\t\t\tcontext->m_mouseButtonLeft\t\t= USYNERGY_FALSE;\n\t\tsSendMouseCallback(context);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DMMV\"))\n\t{\n\t\t// Mouse move. Reply with CNOP\n\t\t//\t\tkMsgDMouseMove\t\t= \"DMMV%2i%2i\"\n\t\tcontext->m_mouseX = sNetToNative16(message+8);\n\t\tcontext->m_mouseY = sNetToNative16(message+10);\n\t\tsSendMouseCallback(context);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DMWM\"))\n\t{\n\t\t// Mouse wheel\n\t\t//\t\tkMsgDMouseWheel\t\t= \"DMWM%2i%2i\"\n\t\t//\t\tkMsgDMouseWheel1_0\t= \"DMWM%2i\"\n\t\tcontext->m_mouseWheelX += sNetToNative16(message+8);\n\t\tcontext->m_mouseWheelY += sNetToNative16(message+10);\n\t\tsSendMouseCallback(context);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DKDN\"))\n\t{\n\t\t// Key down\n\t\t//\t\tkMsgDKeyDown\t\t= \"DKDN%2i%2i%2i\"\n\t\t//\t\tkMsgDKeyDown1_0\t\t= \"DKDN%2i%2i\"\n\t\t//uint16_t id = sNetToNative16(message+8);\n\t\tuint16_t mod = sNetToNative16(message+10);\n\t\tuint16_t key = sNetToNative16(message+12);\n\t\tsSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_FALSE);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DKRP\"))\n\t{\n\t\t// Key repeat\n\t\t//\t\tkMsgDKeyRepeat\t\t= \"DKRP%2i%2i%2i%2i\"\n\t\t//\t\tkMsgDKeyRepeat1_0\t= \"DKRP%2i%2i%2i\"\n\t\tuint16_t mod = sNetToNative16(message+10);\n//\t\tuint16_t count = sNetToNative16(message+12);\n\t\tuint16_t key = sNetToNative16(message+14);\n\t\tsSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_TRUE);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DKUP\"))\n\t{\n\t\t// Key up\n\t\t//\t\tkMsgDKeyUp\t\t\t= \"DKUP%2i%2i%2i\"\n\t\t//\t\tkMsgDKeyUp1_0\t\t= \"DKUP%2i%2i\"\n\t\t//uint16 id=Endian::sNetToNative(sbuf[4]);\n\t\tuint16_t mod = sNetToNative16(message+10);\n\t\tuint16_t key = sNetToNative16(message+12);\n\t\tsSendKeyboardCallback(context, key, mod, USYNERGY_FALSE, USYNERGY_FALSE);\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DGBT\"))\n\t{\n\t\t// Joystick buttons\n\t\t//\t\tkMsgDGameButtons\t= \"DGBT%1i%2i\";\n\t\tuint8_t\tjoy_num = message[8];\n\t\tif (joy_num<USYNERGY_NUM_JOYSTICKS)\n\t\t{\n\t\t\t// Copy button state, then send callback\n\t\t\tcontext->m_joystickButtons[joy_num] = (message[9] << 8) | message[10];\n\t\t\tsSendJoystickCallback(context, joy_num);\n\t\t}\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DGST\"))\n\t{\n\t\t// Joystick sticks\n\t\t//\t\tkMsgDGameSticks\t\t= \"DGST%1i%1i%1i%1i%1i\";\n\t\tuint8_t\tjoy_num = message[8];\n\t\tif (joy_num<USYNERGY_NUM_JOYSTICKS)\n\t\t{\n\t\t\t// Copy stick state, then send callback\n\t\t\tmemcpy(context->m_joystickSticks[joy_num], message+9, 4);\n\t\t\tsSendJoystickCallback(context, joy_num);\n\t\t}\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DSOP\"))\n\t{\n\t\t// Set options\n\t\t//\t\tkMsgDSetOptions\t\t= \"DSOP%4I\"\n\t}\n\telse if (USYNERGY_IS_PACKET(\"CALV\"))\n\t{\n\t\t// Keepalive, reply with CALV and then CNOP\n\t\t//\t\tkMsgCKeepAlive\t\t= \"CALV\"\n\t\tsAddString(context, \"CALV\");\n\t\tsSendReply(context);\n\t\t// now reply with CNOP\n\t}\n\telse if (USYNERGY_IS_PACKET(\"DCLP\"))\n\t{\n\t\t// Clipboard message\n\t\t//\t\tkMsgDClipboard\t\t= \"DCLP%1i%4i%s\"\n\t\t//\n\t\t// The clipboard message contains:\n\t\t//\t\t1 uint32:\tThe size of the message\n\t\t//\t\t4 chars: \tThe identifier (\"DCLP\")\n\t\t//\t\t1 uint8: \tThe clipboard index\n\t\t//\t\t1 uint32:\tThe sequence number. It's zero, because this message is always coming from the server?\n\t\t//\t\t1 uint32:\tThe total size of the remaining 'string' (as per the Synergy %s string format (which is 1 uint32 for size followed by a char buffer (not necessarily null terminated)).\n\t\t//\t\t1 uint32:\tThe number of formats present in the message\n\t\t// And then 'number of formats' times the following:\n\t\t//\t\t1 uint32:\tThe format of the clipboard data\n\t\t//\t\t1 uint32:\tThe size n of the clipboard data\n\t\t//\t\tn uint8:\tThe clipboard data\n\t\tconst uint8_t *\tparse_msg\t= message+17;\n\t\tuint32_t\t\tnum_formats = sNetToNative32(parse_msg);\n\t\tparse_msg += 4;\n\t\tfor (; num_formats; num_formats--)\n\t\t{\n\t\t\t// Parse clipboard format header\n\t\t\tuint32_t format\t= sNetToNative32(parse_msg);\n\t\t\tuint32_t size\t= sNetToNative32(parse_msg+4);\n\t\t\tparse_msg += 8;\n\t\t\t\n\t\t\t// Call callback\n\t\t\tif (context->m_clipboardCallback)\n\t\t\t\tcontext->m_clipboardCallback(context->m_cookie, format, parse_msg, size);\n\n\t\t\tparse_msg += size;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Unknown packet, could be any of these\n\t\t//\t\tkMsgCNoop \t\t\t= \"CNOP\"\n\t\t//\t\tkMsgCClose \t\t\t= \"CBYE\"\n\t\t//\t\tkMsgCClipboard \t\t= \"CCLP%1i%4i\"\n\t\t//\t\tkMsgCScreenSaver \t= \"CSEC%1i\"\n\t\t//\t\tkMsgDKeyRepeat\t\t= \"DKRP%2i%2i%2i%2i\"\n\t\t//\t\tkMsgDKeyRepeat1_0\t= \"DKRP%2i%2i%2i\"\n\t\t//\t\tkMsgDMouseRelMove\t= \"DMRM%2i%2i\"\n\t\t//\t\tkMsgEIncompatible\t= \"EICV%2i%2i\"\n\t\t//\t\tkMsgEBusy \t\t\t= \"EBSY\"\n\t\t//\t\tkMsgEUnknown\t\t= \"EUNK\"\n\t\t//\t\tkMsgEBad\t\t\t= \"EBAD\"\n\t\tchar buffer[64];\n\t\tsprintf(buffer, \"Unknown packet '%c%c%c%c'\", message[4], message[5], message[6], message[7]);\n\t\tsTrace(context, buffer);\n\t\treturn;\n\t}\n\n\t// Reply with CNOP maybe?\n\tsAddString(context, \"CNOP\");\n\tsSendReply(context);\n}\n#undef USYNERGY_IS_PACKET\n\n\n\n/**\n@brief Mark context as being disconnected\n**/\nstatic void sSetDisconnected(uSynergyContext *context)\n{\n\tcontext->m_connected\t\t= USYNERGY_FALSE;\n\tcontext->m_hasReceivedHello = USYNERGY_FALSE;\n\tcontext->m_isCaptured\t\t= USYNERGY_FALSE;\n\tcontext->m_replyCur\t\t\t= context->m_replyBuffer + 4;\n\tcontext->m_sequenceNumber\t= 0;\n}\n\n\n\n/**\n@brief Update a connected context\n**/\nstatic void sUpdateContext(uSynergyContext *context)\n{\n\t/* Receive data (blocking) */\n\tint receive_size = USYNERGY_RECEIVE_BUFFER_SIZE - context->m_receiveOfs;\n\tint num_received = 0;\n\tint packlen = 0;\n\tif (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer + context->m_receiveOfs, receive_size, &num_received) == USYNERGY_FALSE)\n\t{\n\t\t/* Receive failed, let's try to reconnect */\n\t\tchar buffer[128];\n\t\tsprintf(buffer, \"Receive failed (%d bytes asked, %d bytes received), trying to reconnect in a second\", receive_size, num_received);\n\t\tsTrace(context, buffer);\n\t\tsSetDisconnected(context);\n\t\tcontext->m_sleepFunc(context->m_cookie, 1000);\n\t\treturn;\n\t}\n\tcontext->m_receiveOfs += num_received;\n\n\t/*\tIf we didn't receive any data then we're probably still polling to get connected and\n\t\ttherefore not getting any data back. To avoid overloading the system with a Synergy\n\t\tthread that would hammer on polling, we let it rest for a bit if there's no data. */\n\tif (num_received == 0)\n\t\tcontext->m_sleepFunc(context->m_cookie, 500);\n\n\t/* Check for timeouts */\n\tif (context->m_hasReceivedHello)\n\t{\n\t\tuint32_t cur_time = context->m_getTimeFunc();\n\t\tif (num_received == 0)\n\t\t{\n\t\t\t/* Timeout after 2 secs of inactivity (we received no CALV) */\n\t\t\tif ((cur_time - context->m_lastMessageTime) > USYNERGY_IDLE_TIMEOUT)\n\t\t\t\tsSetDisconnected(context);\n\t\t}\n\t\telse\n\t\t\tcontext->m_lastMessageTime = cur_time;\n\t}\n\n\t/* Eat packets */\n\tfor (;;)\n\t{\n\t\t/* Grab packet length and bail out if the packet goes beyond the end of the buffer */\n\t\tpacklen = sNetToNative32(context->m_receiveBuffer);\n\t\tif (packlen+4 > context->m_receiveOfs)\n\t\t\tbreak;\n\n\t\t/* Process message */\n\t\tsProcessMessage(context, context->m_receiveBuffer);\n\n\t\t/* Move packet to front of buffer */\n\t\tmemmove(context->m_receiveBuffer, context->m_receiveBuffer+packlen+4, context->m_receiveOfs-packlen-4);\n\t\tcontext->m_receiveOfs -= packlen+4;\n\t}\n\n\t/* Throw away over-sized packets */\n\tif (packlen > USYNERGY_RECEIVE_BUFFER_SIZE)\n\t{\n\t\t/* Oversized packet, ditch tail end */\n\t\tchar buffer[128];\n\t\tsprintf(buffer, \"Oversized packet: '%c%c%c%c' (length %d)\", context->m_receiveBuffer[4], context->m_receiveBuffer[5], context->m_receiveBuffer[6], context->m_receiveBuffer[7], packlen);\n\t\tsTrace(context, buffer);\n\t\tnum_received = context->m_receiveOfs-4; // 4 bytes for the size field\n\t\twhile (num_received != packlen)\n\t\t{\n\t\t\tint buffer_left = packlen - num_received;\n\t\t\tint to_receive = buffer_left < USYNERGY_RECEIVE_BUFFER_SIZE ? buffer_left : USYNERGY_RECEIVE_BUFFER_SIZE;\n\t\t\tint ditch_received = 0;\n\t\t\tif (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer, to_receive, &ditch_received) == USYNERGY_FALSE)\n\t\t\t{\n\t\t\t\t/* Receive failed, let's try to reconnect */\n\t\t\t\tsTrace(context, \"Receive failed, trying to reconnect in a second\");\n\t\t\t\tsSetDisconnected(context);\n\t\t\t\tcontext->m_sleepFunc(context->m_cookie, 1000);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnum_received += ditch_received;\n\t\t\t}\n\t\t}\n\t\tcontext->m_receiveOfs = 0;\n\t}\n}\n\n\n//---------------------------------------------------------------------------------------------------------------------\n//\tPublic interface\n//---------------------------------------------------------------------------------------------------------------------\n\n\n\n/**\n@brief Initialize uSynergy context\n**/\nvoid uSynergyInit(uSynergyContext *context)\n{\n\t/* Zero memory */\n\tmemset(context, 0, sizeof(uSynergyContext));\n\n\t/* Initialize to default state */\n\tsSetDisconnected(context);\n}\n\n\n/**\n@brief Update uSynergy\n**/\nvoid uSynergyUpdate(uSynergyContext *context)\n{\n\tif (context->m_connected)\n\t{\n\t\t/* Update context, receive data, call callbacks */\n\t\tsUpdateContext(context);\n\t}\n\telse\n\t{\n\t\t/* Try to connect */\n\t\tif (context->m_connectFunc(context->m_cookie))\n\t\t\tcontext->m_connected = USYNERGY_TRUE;\n\t}\n}\n\n\n\n/**\n@brief Send clipboard data\n**/\nvoid uSynergySendClipboard(uSynergyContext *context, const char *text)\n{\n\t// Calculate maximum size that will fit in a reply packet\n\tuint32_t overhead_size =\t4 +\t\t\t\t\t/* Message size */\n\t\t\t\t\t\t\t\t4 +\t\t\t\t\t/* Message ID */\n\t\t\t\t\t\t\t\t1 +\t\t\t\t\t/* Clipboard index */\n\t\t\t\t\t\t\t\t4 +\t\t\t\t\t/* Sequence number */\n\t\t\t\t\t\t\t\t4 +\t\t\t\t\t/* Rest of message size (because it's a Synergy string from here on) */\n\t\t\t\t\t\t\t\t4 +\t\t\t\t\t/* Number of clipboard formats */\n\t\t\t\t\t\t\t\t4 +\t\t\t\t\t/* Clipboard format */\n\t\t\t\t\t\t\t\t4;\t\t\t\t\t/* Clipboard data length */\n\tuint32_t max_length = USYNERGY_REPLY_BUFFER_SIZE - overhead_size;\n\t\n\t// Clip text to max length\n\tuint32_t text_length = (uint32_t)strlen(text);\n\tif (text_length > max_length)\n\t{\n\t\tchar buffer[128];\n\t\tsprintf(buffer, \"Clipboard buffer too small, clipboard truncated at %d characters\", max_length);\n\t\tsTrace(context, buffer);\n\t\ttext_length = max_length;\n\t}\n\n\t// Assemble packet\n\tsAddString(context, \"DCLP\");\n\tsAddUInt8(context, 0);\t\t\t\t\t\t\t/* Clipboard index */\n\tsAddUInt32(context, context->m_sequenceNumber);\n\tsAddUInt32(context, 4+4+4+text_length);\t\t\t/* Rest of message size: numFormats, format, length, data */\n\tsAddUInt32(context, 1);\t\t\t\t\t\t\t/* Number of formats (only text for now) */\n\tsAddUInt32(context, USYNERGY_CLIPBOARD_FORMAT_TEXT);\n\tsAddUInt32(context, text_length);\n\tsAddString(context, text);\n\tsSendReply(context);\n}\n"
  },
  {
    "path": "external/imgui/examples/libs/usynergy/uSynergy.h",
    "content": "/*\nuSynergy client -- Interface for the embedded Synergy client library\n  version 1.0.0, July 7th, 2012\n\nCopyright (C) 2012 Synergy Si Ltd.\nCopyright (c) 2012 Alex Evans\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n   1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n   2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n   3. This notice may not be removed or altered from any source\n   distribution.\n*/\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n//---------------------------------------------------------------------------------------------------------------------\n//\tConfiguration\n//---------------------------------------------------------------------------------------------------------------------\n\n\n\n/**\n@brief Determine endianness\n**/\n#if defined(USYNERGY_LITTLE_ENDIAN) && defined(USYNERGY_BIG_ENDIAN)\n\t/* Ambiguous: both endians specified */\n\t#error \"Can't define both USYNERGY_LITTLE_ENDIAN and USYNERGY_BIG_ENDIAN\"\n#elif !defined(USYNERGY_LITTLE_ENDIAN) && !defined(USYNERGY_BIG_ENDIAN)\n\t/* Attempt to auto detect */\n\t#if defined(__LITTLE_ENDIAN__) || defined(LITTLE_ENDIAN) || (_BYTE_ORDER == _LITTLE_ENDIAN)\n\t\t#define USYNERGY_LITTLE_ENDIAN\n\t#elif defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN) || (_BYTE_ORDER == _BIG_ENDIAN)\n\t\t#define USYNERGY_BIG_ENDIAN\n\t#else\n\t\t#error \"Can't detect endian-nes, please defined either USYNERGY_LITTLE_ENDIAN or USYNERGY_BIG_ENDIAN\";\n\t#endif\n#else\n\t/* User-specified endian-nes, nothing to do for us */\n#endif\n\n\n\n//---------------------------------------------------------------------------------------------------------------------\n//\tTypes and Constants\n//---------------------------------------------------------------------------------------------------------------------\n\n\n\n/**\n@brief Boolean type\n**/\ntypedef int\t\t\tuSynergyBool;\n#define\t\t\t\tUSYNERGY_FALSE\t\t\t\t\t0\t\t\t\t/* False value */\n#define\t\t\t\tUSYNERGY_TRUE\t\t\t\t\t1\t\t\t\t/* True value */\n\n\n/**\n@brief User context type\n\nThe uSynergyCookie type is an opaque type that is used by uSynergy to communicate to the client. It is passed along to\ncallback functions as context.\n**/\ntypedef struct { int ignored; } *\t\t\t\t\tuSynergyCookie;\n\n\n\n/**\n@brief Clipboard types\n**/\nenum uSynergyClipboardFormat\n{\n\tUSYNERGY_CLIPBOARD_FORMAT_TEXT\t\t\t\t\t= 0,\t\t\t/* Text format, UTF-8, newline is LF */\n\tUSYNERGY_CLIPBOARD_FORMAT_BITMAP\t\t\t\t= 1,\t\t\t/* Bitmap format, BMP 24/32bpp, BI_RGB */\n\tUSYNERGY_CLIPBOARD_FORMAT_HTML\t\t\t\t\t= 2,\t\t\t/* HTML format, HTML fragment, UTF-8, newline is LF */\n};\n\n\n\n/**\n@brief Constants and limits\n**/\n#define\t\t\t\tUSYNERGY_NUM_JOYSTICKS\t\t\t4\t\t\t\t/* Maximum number of supported joysticks */\n\n#define\t\t\t\tUSYNERGY_PROTOCOL_MAJOR\t\t\t1\t\t\t\t/* Major protocol version */\n#define\t\t\t\tUSYNERGY_PROTOCOL_MINOR\t\t\t4\t\t\t\t/* Minor protocol version */\n\n#define\t\t\t\tUSYNERGY_IDLE_TIMEOUT\t\t\t2000\t\t\t/* Timeout in milliseconds before reconnecting */\n\n#define\t\t\t\tUSYNERGY_TRACE_BUFFER_SIZE\t\t1024\t\t\t/* Maximum length of traced message */\n#define\t\t\t\tUSYNERGY_REPLY_BUFFER_SIZE\t\t1024\t\t\t/* Maximum size of a reply packet */\n#define\t\t\t\tUSYNERGY_RECEIVE_BUFFER_SIZE\t4096\t\t\t/* Maximum size of an incoming packet */\n\n\n\n/**\n@brief Keyboard constants\n**/\n#define\t\t\t\tUSYNERGY_MODIFIER_SHIFT\t\t\t0x0001\t\t\t/* Shift key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_CTRL\t\t\t0x0002\t\t\t/* Ctrl key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_ALT\t\t\t0x0004\t\t\t/* Alt key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_META\t\t\t0x0008\t\t\t/* Meta key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_WIN\t\t\t0x0010\t\t\t/* Windows key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_ALT_GR\t\t0x0020\t\t\t/* AltGr key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_LEVEL5LOCK\t0x0040\t\t\t/* Level5Lock key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_CAPSLOCK\t\t0x1000\t\t\t/* CapsLock key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_NUMLOCK\t\t0x2000\t\t\t/* NumLock key modifier */\n#define\t\t\t\tUSYNERGY_MODIFIER_SCROLLOCK\t\t0x4000\t\t\t/* ScrollLock key modifier */\n\n\n\n\n//---------------------------------------------------------------------------------------------------------------------\n//\tFunctions and Callbacks\n//---------------------------------------------------------------------------------------------------------------------\n\n\n\n/**\n@brief Connect function\n\nThis function is called when uSynergy needs to connect to the host. It doesn't imply a network implementation or\ndestination address, that must all be handled on the user side. The function should return USYNERGY_TRUE if a\nconnection was established or USYNERGY_FALSE if it could not connect.\n\nWhen network errors occur (e.g. uSynergySend or uSynergyReceive fail) then the connect call will be called again\nso the implementation of the function must close any old connections and clean up resources before retrying.\n\n@param cookie\t\tCookie supplied in the Synergy context\n**/\ntypedef uSynergyBool (*uSynergyConnectFunc)(uSynergyCookie cookie);\n\n\n\n/**\n@brief Send function\n\nThis function is called when uSynergy needs to send something over the default connection. It should return\nUSYNERGY_TRUE if sending succeeded and USYNERGY_FALSE otherwise. This function should block until the send\noperation is completed.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param buffer\t\tAddress of buffer to send\n@param length\t\tLength of buffer to send\n**/\ntypedef uSynergyBool (*uSynergySendFunc)(uSynergyCookie cookie, const uint8_t *buffer, int length);\n\n\n\n/**\n@brief Receive function\n\nThis function is called when uSynergy needs to receive data from the default connection. It should return\nUSYNERGY_TRUE if receiving data succeeded and USYNERGY_FALSE otherwise. This function should block until data\nhas been received and wait for data to become available. If @a outLength is set to 0 upon completion it is\nassumed that the connection is alive, but still in a connecting state and needs time to settle.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param buffer\t\tAddress of buffer to receive data into\n@param maxLength\tMaximum amount of bytes to write into the receive buffer\n@param outLength\tAddress of integer that receives the actual amount of bytes written into @a buffer\n**/\ntypedef uSynergyBool (*uSynergyReceiveFunc)(uSynergyCookie cookie, uint8_t *buffer, int maxLength, int* outLength);\n\n\n\n/**\n@brief Thread sleep function\n\nThis function is called when uSynergy wants to suspend operation for a while before retrying an operation. It\nis mostly used when a socket times out or disconnect occurs to prevent uSynergy from continuously hammering a\nnetwork connection in case the network is down.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param timeMs\t\tTime to sleep the current thread (in milliseconds)\n**/\ntypedef void\t\t(*uSynergySleepFunc)(uSynergyCookie cookie, int timeMs);\n\n\n\n/**\n@brief Get time function\n\nThis function is called when uSynergy needs to know the current time. This is used to determine when timeouts\nhave occured. The time base should be a cyclic millisecond time value.\n\n@returns\t\t\tTime value in milliseconds\n**/\ntypedef uint32_t\t(*uSynergyGetTimeFunc)();\n\n\n\n/**\n@brief Trace function\n\nThis function is called when uSynergy wants to trace something. It is optional to show these messages, but they\nare often useful when debugging. uSynergy only traces major events like connecting and disconnecting. Usually\nonly a single trace is shown when the connection is established and no more trace are called.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param text\t\t\tText to be traced\n**/\ntypedef void\t\t(*uSynergyTraceFunc)(uSynergyCookie cookie, const char *text);\n\n\n\n/**\n@brief Screen active callback\n\nThis callback is called when Synergy makes the screen active or inactive. This\ncallback is usually sent when the mouse enters or leaves the screen.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param active\t\tActivation flag, 1 if the screen has become active, 0 if the screen has become inactive\n**/\ntypedef void\t\t(*uSynergyScreenActiveCallback)(uSynergyCookie cookie, uSynergyBool active);\n\n\n\n/**\n@brief Mouse callback\n\nThis callback is called when a mouse events happens. The mouse X and Y position,\nwheel and button state is communicated in the message. It's up to the user to\ninterpret if this is a mouse up, down, double-click or other message.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param x\t\t\tMouse X position\n@param y\t\t\tMouse Y position\n@param wheelX\t\tMouse wheel X position\n@param wheelY\t\tMouse wheel Y position\n@param buttonLeft\tLeft button pressed status, 0 for released, 1 for pressed\n@param buttonMiddle\tMiddle button pressed status, 0 for released, 1 for pressed\n@param buttonRight\tRight button pressed status, 0 for released, 1 for pressed\n**/\ntypedef void\t\t(*uSynergyMouseCallback)(uSynergyCookie cookie, uint16_t x, uint16_t y, int16_t wheelX, int16_t wheelY, uSynergyBool buttonLeft, uSynergyBool buttonRight, uSynergyBool buttonMiddle);\n\n\n\n/**\n@brief Key event callback\n\nThis callback is called when a key is pressed or released.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param key\t\t\tKey code of key that was pressed or released\n@param modifiers\tStatus of modifier keys (alt, shift, etc.)\n@param down\t\t\tDown or up status, 1 is key is pressed down, 0 if key is released (up)\n@param repeat\t\tRepeat flag, 1 if the key is down because the key is repeating, 0 if the key is initially pressed by the user\n**/\ntypedef void\t\t(*uSynergyKeyboardCallback)(uSynergyCookie cookie, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat);\n\n\n\n/**\n@brief Joystick event callback\n\nThis callback is called when a joystick stick or button changes. It is possible that multiple callbacks are\nfired when different sticks or buttons change as these are individual messages in the packet stream. Each\ncallback will contain all the valid state for the different axes and buttons. The last callback received will\nrepresent the most current joystick state.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param joyNum\t\tJoystick number, always in the range [0 ... USYNERGY_NUM_JOYSTICKS>\n@param buttons\t\tButton pressed mask\n@param leftStickX\tLeft stick X position, in range [-127 ... 127]\n@param leftStickY\tLeft stick Y position, in range [-127 ... 127]\n@param rightStickX\tRight stick X position, in range [-127 ... 127]\n@param rightStickY\tRight stick Y position, in range [-127 ... 127]\n**/\ntypedef void\t\t(*uSynergyJoystickCallback)(uSynergyCookie cookie, uint8_t joyNum, uint16_t buttons, int8_t leftStickX, int8_t leftStickY, int8_t rightStickX, int8_t rightStickY);\n\n\n\n/**\n@brief Clipboard event callback\n\nThis callback is called when something is placed on the clipboard. Multiple callbacks may be fired for\nmultiple clipboard formats if they are supported. The data provided is read-only and may not be modified\nby the application.\n\n@param cookie\t\tCookie supplied in the Synergy context\n@param format\t\tClipboard format\n@param data\t\t\tMemory area containing the clipboard raw data\n@param size\t\t\tSize of clipboard data\n**/\ntypedef void\t\t(*uSynergyClipboardCallback)(uSynergyCookie cookie, enum uSynergyClipboardFormat format, const uint8_t *data, uint32_t size);\n\n\n\n//---------------------------------------------------------------------------------------------------------------------\n//\tContext\n//---------------------------------------------------------------------------------------------------------------------\n\n\n\n/**\n@brief uSynergy context\n**/\ntypedef struct\n{\n\t/* Mandatory configuration data, filled in by client */\n\tuSynergyConnectFunc\t\t\t\tm_connectFunc;\t\t\t\t\t\t\t\t\t/* Connect function */\n\tuSynergySendFunc\t\t\t\tm_sendFunc;\t\t\t\t\t\t\t\t\t\t/* Send data function */\n\tuSynergyReceiveFunc\t\t\t\tm_receiveFunc;\t\t\t\t\t\t\t\t\t/* Receive data function */\n\tuSynergySleepFunc\t\t\t\tm_sleepFunc;\t\t\t\t\t\t\t\t\t/* Thread sleep function */\n\tuSynergyGetTimeFunc\t\t\t\tm_getTimeFunc;\t\t\t\t\t\t\t\t\t/* Get current time function */\n\tconst char*\t\t\t\t\t\tm_clientName;\t\t\t\t\t\t\t\t\t/* Name of Synergy Screen / Client */\n\tuint16_t\t\t\t\t\t\tm_clientWidth;\t\t\t\t\t\t\t\t\t/* Width of screen */\n\tuint16_t\t\t\t\t\t\tm_clientHeight;\t\t\t\t\t\t\t\t\t/* Height of screen */\n\n\t/* Optional configuration data, filled in by client */\n\tuSynergyCookie\t\t\t\t\tm_cookie;\t\t\t\t\t\t\t\t\t\t/* Cookie pointer passed to callback functions (can be NULL) */\n\tuSynergyTraceFunc\t\t\t\tm_traceFunc;\t\t\t\t\t\t\t\t\t/* Function for tracing status (can be NULL) */\n\tuSynergyScreenActiveCallback\tm_screenActiveCallback;\t\t\t\t\t\t\t/* Callback for entering and leaving screen */\n\tuSynergyMouseCallback\t\t\tm_mouseCallback;\t\t\t\t\t\t\t\t/* Callback for mouse events */\n\tuSynergyKeyboardCallback\t\tm_keyboardCallback;\t\t\t\t\t\t\t\t/* Callback for keyboard events */\n\tuSynergyJoystickCallback\t\tm_joystickCallback;\t\t\t\t\t\t\t\t/* Callback for joystick events */\n\tuSynergyClipboardCallback\t\tm_clipboardCallback;\t\t\t\t\t\t\t/* Callback for clipboard events */\n\n\t/* State data, used internall by client, initialized by uSynergyInit() */\n\tuSynergyBool\t\t\t\t\tm_connected;\t\t\t\t\t\t\t\t\t/* Is our socket connected? */\n\tuSynergyBool\t\t\t\t\tm_hasReceivedHello;\t\t\t\t\t\t\t\t/* Have we received a 'Hello' from the server? */\n\tuSynergyBool\t\t\t\t\tm_isCaptured;\t\t\t\t\t\t\t\t\t/* Is Synergy active (i.e. this client is receiving input messages?) */\n\tuint32_t\t\t\t\t\t\tm_lastMessageTime;\t\t\t\t\t\t\t\t/* Time at which last message was received */\n\tuint32_t\t\t\t\t\t\tm_sequenceNumber;\t\t\t\t\t\t\t\t/* Packet sequence number */\n\tuint8_t\t\t\t\t\t\t\tm_receiveBuffer[USYNERGY_RECEIVE_BUFFER_SIZE];\t/* Receive buffer */\n\tint\t\t\t\t\t\t\t\tm_receiveOfs;\t\t\t\t\t\t\t\t\t/* Receive buffer offset */\n\tuint8_t\t\t\t\t\t\t\tm_replyBuffer[USYNERGY_REPLY_BUFFER_SIZE];\t\t/* Reply buffer */\n\tuint8_t*\t\t\t\t\t\tm_replyCur;\t\t\t\t\t\t\t\t\t\t/* Write offset into reply buffer */\n\tuint16_t\t\t\t\t\t\tm_mouseX;\t\t\t\t\t\t\t\t\t\t/* Mouse X position */\n\tuint16_t\t\t\t\t\t\tm_mouseY;\t\t\t\t\t\t\t\t\t\t/* Mouse Y position */\n\tint16_t\t\t\t\t\t\t\tm_mouseWheelX;\t\t\t\t\t\t\t\t\t/* Mouse wheel X position */\n\tint16_t\t\t\t\t\t\t\tm_mouseWheelY;\t\t\t\t\t\t\t\t\t/* Mouse wheel Y position */\n\tuSynergyBool\t\t\t\t\tm_mouseButtonLeft;\t\t\t\t\t\t\t\t/* Mouse left button */\n\tuSynergyBool\t\t\t\t\tm_mouseButtonRight;\t\t\t\t\t\t\t\t/* Mouse right button */\n\tuSynergyBool\t\t\t\t\tm_mouseButtonMiddle;\t\t\t\t\t\t\t/* Mouse middle button */\n\tint8_t\t\t\t\t\t\t\tm_joystickSticks[USYNERGY_NUM_JOYSTICKS][4];\t/* Joystick stick position in 2 axes for 2 sticks */\n\tuint16_t\t\t\t\t\t\tm_joystickButtons[USYNERGY_NUM_JOYSTICKS];\t\t/* Joystick button state */\n} uSynergyContext;\n\n\n\n//---------------------------------------------------------------------------------------------------------------------\n//\tInterface\n//---------------------------------------------------------------------------------------------------------------------\n\n\n\n/**\n@brief Initialize uSynergy context\n\nThis function initializes @a context for use. Call this function directly after\ncreating the context, before filling in any configuration data in it. Not calling\nthis function will cause undefined behavior.\n\n@param context\tContext to be initialized\n**/\nextern void\t\tuSynergyInit(uSynergyContext *context);\n\n\n\n/**\n@brief Update uSynergy\n\nThis function updates uSynergy and does the bulk of the work. It does connection management,\nreceiving data, reconnecting after errors or timeouts and so on. It assumes that networking\noperations are blocking and it can suspend the current thread if it needs to wait. It is\nbest practice to call uSynergyUpdate from a background thread so it is responsive.\n\nBecause uSynergy relies mostly on blocking calls it will mostly stay in thread sleep state\nwaiting for system mutexes and won't eat much memory.\n\nuSynergyUpdate doesn't do any memory allocations or have any side effects beyond those of\nthe callbacks it calls.\n\n@param context\tContext to be updated\n**/\nextern void\t\tuSynergyUpdate(uSynergyContext *context);\n\n\n\n/**\n@brief Send clipboard data\n\nThis function sets new clipboard data and sends it to the server. Use this function if\nyour client cuts or copies data onto the clipboard that it needs to share with the\nserver.\n\nCurrently there is only support for plaintext, but HTML and image data could be\nsupported with some effort.\n\n@param context\tContext to send clipboard data to\n@param text\t\tText to set to the clipboard\n**/\nextern void\t\tuSynergySendClipboard(uSynergyContext *context, const char *text);\n\n\n\n#ifdef __cplusplus\n};\n#endif\n"
  },
  {
    "path": "external/imgui/examples/marmalade_example/data/app.icf",
    "content": "# This file is for configuration settings for your\n# application.\n#\n# The syntax is similar to windows .ini files ie\n#\n# [GroupName]\n# Setting = Value\n#\n# Which can be read by your application using\n#  e.g s3eConfigGetString(\"GroupName\", \"Setting\", string)\n#\n# All settings must be documented in .config.txt files.\n# New settings specific to this application should be\n# documented in app.config.txt\n#\n# Some conditional operations are also permitted, see the\n# S3E documentation for details.\n\n[S3E]\nMemSize=6000000\nMemSizeDebug=6000000\nDispFixRot=FixedLandscape\n\n# emulate iphone 5 resolution, change these settings to emulate other display resolution\nWinWidth=1136\nWinHeight=640\n\n[GX]\nDataCacheSize=131070\n\n[Util] \n#MemoryBreakpoint=1282\n"
  },
  {
    "path": "external/imgui/examples/marmalade_example/imgui_impl_marmalade.cpp",
    "content": "// ImGui Marmalade binding with IwGx\n// In this binding, ImTextureID is used to store a 'CIwTexture*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n// Copyright (C) 2015 by Giovanni Zito\n// This file is part of ImGui\n\n#include <imgui.h>\n#include \"imgui_impl_marmalade.h\"\n\n#include <s3eClipboard.h>\n#include <s3ePointer.h>\n#include <s3eKeyboard.h>\n#include <IwTexture.h>\n#include <IwGx.h>\n\n// Data\nstatic double       g_Time = 0.0f;\nstatic bool         g_MousePressed[3] = { false, false, false };\nstatic float        g_MouseWheel = 0.0f;\nstatic CIwTexture*  g_FontTexture = NULL;\nstatic char*        g_ClipboardText = NULL;\nstatic bool         g_osdKeyboardEnabled = false;\n\n// use this setting to scale the interface - e.g. on device you could use 2 or 3 scale factor\nstatic ImVec2       g_RenderScale = ImVec2(1.0f,1.0f);\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\nvoid ImGui_Marmalade_RenderDrawLists(ImDrawData* draw_data)\n{\n    // Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays)\n    ImGuiIO& io = ImGui::GetIO();\n    draw_data->ScaleClipRects(io.DisplayFramebufferScale);\n\n    // Render command lists\n    for(int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data;\n        const int nVert = cmd_list->VtxBuffer.Size;\n        CIwFVec2* pVertStream = IW_GX_ALLOC(CIwFVec2, nVert);\n        CIwFVec2* pUVStream = IW_GX_ALLOC(CIwFVec2, nVert);\n        CIwColour* pColStream = IW_GX_ALLOC(CIwColour, nVert);\n\n        for( int i=0; i < nVert; i++ )\n        {\n            // TODO: optimize multiplication on gpu using vertex shader/projection matrix.\n            pVertStream[i].x = cmd_list->VtxBuffer[i].pos.x * g_RenderScale.x;\n            pVertStream[i].y = cmd_list->VtxBuffer[i].pos.y * g_RenderScale.y;\n            pUVStream[i].x = cmd_list->VtxBuffer[i].uv.x;\n            pUVStream[i].y = cmd_list->VtxBuffer[i].uv.y;\n            pColStream[i] = cmd_list->VtxBuffer[i].col;\n        }\n\n        IwGxSetVertStreamScreenSpace(pVertStream, nVert);\n        IwGxSetUVStream(pUVStream);\n        IwGxSetColStream(pColStream, nVert);\n        IwGxSetNormStream(0);\n\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                CIwMaterial* pCurrentMaterial = IW_GX_ALLOC_MATERIAL();\n                pCurrentMaterial->SetShadeMode(CIwMaterial::SHADE_FLAT);\n                pCurrentMaterial->SetCullMode(CIwMaterial::CULL_NONE);\n                pCurrentMaterial->SetFiltering(false);\n                pCurrentMaterial->SetAlphaMode(CIwMaterial::ALPHA_BLEND);\n                pCurrentMaterial->SetDepthWriteMode(CIwMaterial::DEPTH_WRITE_NORMAL);\n                pCurrentMaterial->SetAlphaTestMode(CIwMaterial::ALPHATEST_DISABLED);\n                pCurrentMaterial->SetTexture((CIwTexture*)pcmd->TextureId);\n                IwGxSetMaterial(pCurrentMaterial);\n                IwGxDrawPrims(IW_GX_TRI_LIST, (uint16*)idx_buffer, pcmd->ElemCount);\n            }\n            idx_buffer += pcmd->ElemCount;\n        }\n        IwGxFlush();\n    }\n\n    // TODO: restore modified state (i.e. mvp matrix)\n}\n\nstatic const char* ImGui_Marmalade_GetClipboardText(void* /*user_data*/)\n{\n    if (!s3eClipboardAvailable())\n        return NULL;\n\n    if (int size = s3eClipboardGetText(NULL, 0))\n    {\n        if (g_ClipboardText)\n            delete[] g_ClipboardText;\n        g_ClipboardText = new char[size];\n        g_ClipboardText[0] = '\\0';\n        s3eClipboardGetText(g_ClipboardText, size);\n    }\n\n    return g_ClipboardText;\n}\n\nstatic void ImGui_Marmalade_SetClipboardText(void* /*user_data*/, const char* text)\n{\n    if (s3eClipboardAvailable())\n        s3eClipboardSetText(text);\n}\n\nint32 ImGui_Marmalade_PointerButtonEventCallback(void* SystemData, void* pUserData)\n{\n    // pEvent->m_Button is of type s3ePointerButton and indicates which mouse\n    // button was pressed.  For touchscreen this should always have the value\n    // S3E_POINTER_BUTTON_SELECT\n    s3ePointerEvent* pEvent = (s3ePointerEvent*)SystemData;\n\n    if (pEvent->m_Pressed == 1)\n    {\n        if (pEvent->m_Button == S3E_POINTER_BUTTON_LEFTMOUSE)\n            g_MousePressed[0] = true;\n        if (pEvent->m_Button == S3E_POINTER_BUTTON_RIGHTMOUSE)\n            g_MousePressed[1] = true;\n        if (pEvent->m_Button == S3E_POINTER_BUTTON_MIDDLEMOUSE)\n            g_MousePressed[2] = true;\n        if (pEvent->m_Button == S3E_POINTER_BUTTON_MOUSEWHEELUP)\n            g_MouseWheel += pEvent->m_y;\n        if (pEvent->m_Button == S3E_POINTER_BUTTON_MOUSEWHEELDOWN)\n            g_MouseWheel += pEvent->m_y;\n    }\n\n    return 0;\n}\n\nint32 ImGui_Marmalade_KeyCallback(void* SystemData, void* userData)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    s3eKeyboardEvent* e = (s3eKeyboardEvent*)SystemData;\n    if (e->m_Pressed == 1)\n        io.KeysDown[e->m_Key] = true;\n    if (e->m_Pressed == 0)\n        io.KeysDown[e->m_Key] = false;\n\n    io.KeyCtrl = s3eKeyboardGetState(s3eKeyLeftControl) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightControl) == S3E_KEY_STATE_DOWN;\n    io.KeyShift = s3eKeyboardGetState(s3eKeyLeftShift) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightShift) == S3E_KEY_STATE_DOWN;\n    io.KeyAlt = s3eKeyboardGetState(s3eKeyLeftAlt) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightAlt) == S3E_KEY_STATE_DOWN;\n    io.KeySuper = s3eKeyboardGetState(s3eKeyLeftWindows) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightWindows) == S3E_KEY_STATE_DOWN;\n\n    return 0;\n}\n\nint32 ImGui_Marmalade_CharCallback(void* SystemData, void* userData)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    s3eKeyboardCharEvent* e = (s3eKeyboardCharEvent*)SystemData;\n    if ((e->m_Char > 0 && e->m_Char < 0x10000))\n        io.AddInputCharacter((unsigned short)e->m_Char);\n\n    return 0;\n}\n\nbool ImGui_Marmalade_CreateDeviceObjects()\n{\n    // Build texture atlas\n    ImGuiIO& io = ImGui::GetIO();\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);\n\n    // Upload texture to graphics system\n    g_FontTexture = new CIwTexture();\n    g_FontTexture->SetModifiable(true);\n    CIwImage& image = g_FontTexture->GetImage();\n    image.SetFormat(CIwImage::ARGB_8888);\n    image.SetWidth(width);\n    image.SetHeight(height);\n    image.SetBuffers();                                    // allocates and own buffers\n    image.ReadTexels(pixels);\n    g_FontTexture->SetMipMapping(false);\n    g_FontTexture->SetFiltering(false);\n    g_FontTexture->Upload();\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)g_FontTexture;\n\n    return true;\n}\n\nvoid    ImGui_Marmalade_InvalidateDeviceObjects()\n{\n    if (g_ClipboardText)\n    {\n        delete[] g_ClipboardText;\n        g_ClipboardText = NULL;\n    }\n\n    if (g_FontTexture)\n    {\n        delete g_FontTexture;\n        ImGui::GetIO().Fonts->TexID = 0;\n        g_FontTexture = NULL;\n    }\n}\n\nbool    ImGui_Marmalade_Init(bool install_callbacks)\n{\n    IwGxInit();\n\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = s3eKeyTab;                     // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.\n    io.KeyMap[ImGuiKey_LeftArrow] = s3eKeyLeft;\n    io.KeyMap[ImGuiKey_RightArrow] = s3eKeyRight;\n    io.KeyMap[ImGuiKey_UpArrow] = s3eKeyUp;\n    io.KeyMap[ImGuiKey_DownArrow] = s3eKeyDown;\n    io.KeyMap[ImGuiKey_PageUp] = s3eKeyPageUp;\n    io.KeyMap[ImGuiKey_PageDown] = s3eKeyPageDown;\n    io.KeyMap[ImGuiKey_Home] = s3eKeyHome;\n    io.KeyMap[ImGuiKey_End] = s3eKeyEnd;\n    io.KeyMap[ImGuiKey_Delete] = s3eKeyDelete;\n    io.KeyMap[ImGuiKey_Backspace] = s3eKeyBackspace;\n    io.KeyMap[ImGuiKey_Enter] = s3eKeyEnter;\n    io.KeyMap[ImGuiKey_Escape] = s3eKeyEsc;\n    io.KeyMap[ImGuiKey_A] = s3eKeyA;\n    io.KeyMap[ImGuiKey_C] = s3eKeyC;\n    io.KeyMap[ImGuiKey_V] = s3eKeyV;\n    io.KeyMap[ImGuiKey_X] = s3eKeyX;\n    io.KeyMap[ImGuiKey_Y] = s3eKeyY;\n    io.KeyMap[ImGuiKey_Z] = s3eKeyZ;\n\n    io.RenderDrawListsFn = ImGui_Marmalade_RenderDrawLists;      // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.SetClipboardTextFn = ImGui_Marmalade_SetClipboardText;\n    io.GetClipboardTextFn = ImGui_Marmalade_GetClipboardText;\n\n    if (install_callbacks)\n    {\n        s3ePointerRegister(S3E_POINTER_BUTTON_EVENT, ImGui_Marmalade_PointerButtonEventCallback, 0);\n        s3eKeyboardRegister(S3E_KEYBOARD_KEY_EVENT, ImGui_Marmalade_KeyCallback, 0);\n        s3eKeyboardRegister(S3E_KEYBOARD_CHAR_EVENT, ImGui_Marmalade_CharCallback, 0);\n    }\n\n    return true;\n}\n\nvoid ImGui_Marmalade_Shutdown()\n{\n    ImGui_Marmalade_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n    IwGxTerminate();\n}\n\nvoid ImGui_Marmalade_NewFrame()\n{\n    if (!g_FontTexture)\n        ImGui_Marmalade_CreateDeviceObjects();\n\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    int w = IwGxGetScreenWidth(), h = IwGxGetScreenHeight();\n    io.DisplaySize = ImVec2((float)w, (float)h);\n     // For retina display or other situations where window coordinates are different from framebuffer coordinates. User storage only, presently not used by ImGui.\n    io.DisplayFramebufferScale = g_scale;\n\n    // Setup time step\n    double current_time = s3eTimerGetUST() / 1000.0f;\n    io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);\n    g_Time = current_time;\n\n    double mouse_x, mouse_y;\n    mouse_x = s3ePointerGetX();\n    mouse_y = s3ePointerGetY();\n    io.MousePos = ImVec2((float)mouse_x/g_scale.x, (float)mouse_y/g_scale.y);   // Mouse position in screen coordinates (set to -1,-1 if no mouse / on another screen, etc.)\n\n    for (int i = 0; i < 3; i++)\n    {\n        io.MouseDown[i] = g_MousePressed[i] || s3ePointerGetState((s3ePointerButton)i) != S3E_POINTER_STATE_UP;    // If a mouse press event came, always pass it as \"mouse held this frame\", so we don't miss click-release events that are shorter than 1 frame.\n        g_MousePressed[i] = false;\n    }\n\n    io.MouseWheel = g_MouseWheel;\n    g_MouseWheel = 0.0f;\n\n    // TODO: Hide OS mouse cursor if ImGui is drawing it\n    // s3ePointerSetInt(S3E_POINTER_HIDE_CURSOR,(io.MouseDrawCursor ? 0 : 1));\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n\n     // Show/hide OSD keyboard\n    if (io.WantTextInput)\n    {\n        // Some text input widget is active?\n        if (!g_osdKeyboardEnabled)\n        {\n            g_osdKeyboardEnabled = true;\n            s3eKeyboardSetInt(S3E_KEYBOARD_GET_CHAR, 1);    // show OSD keyboard\n        }\n    }\n    else\n    {\n        // No text input widget is active\n        if (g_osdKeyboardEnabled)\n        {\n            g_osdKeyboardEnabled = false;\n            s3eKeyboardSetInt(S3E_KEYBOARD_GET_CHAR, 0);    // hide OSD keyboard\n        }\n    }\n}\n"
  },
  {
    "path": "external/imgui/examples/marmalade_example/imgui_impl_marmalade.h",
    "content": "// ImGui Marmalade binding with IwGx\n// In this binding, ImTextureID is used to store a 'CIwTexture*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n// Copyright (C) 2015 by Giovanni Zito\n// This file is part of ImGui\n\nIMGUI_API bool        ImGui_Marmalade_Init(bool install_callbacks);\nIMGUI_API void        ImGui_Marmalade_Shutdown();\nIMGUI_API void        ImGui_Marmalade_NewFrame();\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_Marmalade_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_Marmalade_CreateDeviceObjects();\n\n// callbacks (installed by default if you enable 'install_callbacks' during initialization)\n// You can also handle inputs yourself and use those as a reference.\nIMGUI_API int32       ImGui_Marmalade_PointerButtonEventCallback(void* SystemData, void* pUserData);\nIMGUI_API int32       ImGui_Marmalade_KeyCallback(void* SystemData, void* userData);\nIMGUI_API int32       ImGui_Marmalade_CharCallback(void* SystemData, void* userData);\n"
  },
  {
    "path": "external/imgui/examples/marmalade_example/main.cpp",
    "content": "// ImGui - standalone example application for Marmalade\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n\n// Copyright (C) 2015 by Giovanni Zito\n// This file is part of ImGui\n\n#include <imgui.h>\n#include \"imgui_impl_marmalade.h\"\n#include <stdio.h>\n\n#include <s3eKeyboard.h>\n#include <s3ePointer.h>\n#include <IwGx.h>\n\nint main(int, char**)\n{\n    // Setup ImGui binding\n    ImGui_Marmalade_Init(true);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    while (true)\n    {\n         if (s3eDeviceCheckQuitRequest())\n             break;\n\n         // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n         // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n         // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n         // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n         s3eKeyboardUpdate();\n         s3ePointerUpdate();\n         ImGui_Marmalade_NewFrame();\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        IwGxSetColClear(clear_color.x*255,clear_color.y*255,clear_color.z*255,clear_color.w*255) ;\n        IwGxClear();\n        ImGui::Render();\n        IwGxSwapBuffers();\n\n        s3eDeviceYield(0);\n    }\n\n    // Cleanup\n    ImGui_Marmalade_Shutdown();\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/marmalade_example/marmalade_example.mkb",
    "content": "#!/usr/bin/env mkb\n\n# ImGui - standalone example application for Marmalade\n# Copyright (C) 2015 by Giovanni Zito\n# This file is part of ImGui\n# https://github.com/ocornut/imgui\n\ndefine IMGUI_DISABLE_INCLUDE_IMCONFIG_H\ndefine IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS\ndefine IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS\ndefine _snprintf=snprintf\n\noptions\n{\n    optimise-speed=1\n}\n\nincludepaths\n{\n    ../..\n}\n\nsubprojects\n{\n    iwgx\n}\n\nfiles\n{\n    (.)\n    [\"imgui\"]\n    ../../imgui.cpp\n    ../../imgui_demo.cpp\n    ../../imgui_draw.cpp\n    ../../imconfig.h\n    ../../imgui.h\n   ../../imgui_internal.h\n\n    [\"imgui\",\"Marmalade binding\"]\n    imgui_impl_marmalade.h\n    imgui_impl_marmalade.cpp\n    main.cpp\n\n}\n"
  },
  {
    "path": "external/imgui/examples/opengl2_example/Makefile",
    "content": "#\n# Cross Platform Makefile\n# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X\n#\n#\n# if you using Mac OS X:\n# You'll need glfw\n#    http://www.glfw.org\n#\n\n#CXX = g++\n\nEXE = opengl2_example\nOBJS = main.o imgui_impl_glfw.o\nOBJS += ../../imgui.o ../../imgui_demo.o ../../imgui_draw.o\n\nUNAME_S := $(shell uname -s)\n\n\nifeq ($(UNAME_S), Linux) #LINUX\n\tECHO_MESSAGE = \"Linux\"\n\tLIBS = -lGL `pkg-config --static --libs glfw3`\n\n\tCXXFLAGS = -I../../ `pkg-config --cflags glfw3`\n\tCXXFLAGS += -Wall -Wformat\n\tCFLAGS = $(CXXFLAGS)\nendif\n\nifeq ($(UNAME_S), Darwin) #APPLE\n\tECHO_MESSAGE = \"Mac OS X\"\n\tLIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo\n\t#LIBS += -L/usr/local/lib -lglfw3\n\tLIBS += -L/usr/local/lib -lglfw\n\n\tCXXFLAGS = -I../../ -I/usr/local/include\n\tCXXFLAGS += -Wall -Wformat\n\tCFLAGS = $(CXXFLAGS)\nendif\n\nifeq ($(findstring MINGW,$(UNAME_S)),MINGW)\n   ECHO_MESSAGE = \"Windows\"\n   LIBS = -lglfw3 -lgdi32 -lopengl32 -limm32\n\n   CXXFLAGS = -I../../ -I../libs/gl3w `pkg-config --cflags glfw3`\n   CXXFLAGS += -Wall -Wformat\n   CFLAGS = $(CXXFLAGS)\nendif\n\n.cpp.o:\n\t$(CXX) $(CXXFLAGS) -c -o $@ $<\n\nall: $(EXE)\n\t@echo Build complete for $(ECHO_MESSAGE)\n\n$(EXE): $(OBJS)\n\t$(CXX) -o $(EXE) $(OBJS) $(CXXFLAGS) $(LIBS)\n\nclean:\n\trm $(EXE) $(OBJS)\n\n"
  },
  {
    "path": "external/imgui/examples/opengl2_example/build_win32.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I ..\\libs\\glfw\\include *.cpp ..\\..\\*.cpp /FeDebug/opengl2_example.exe /FoDebug/ /link /LIBPATH:..\\libs\\glfw\\lib-vc2010-32 glfw3.lib opengl32.lib gdi32.lib shell32.lib\n"
  },
  {
    "path": "external/imgui/examples/opengl2_example/imgui_impl_glfw.cpp",
    "content": "// ImGui GLFW binding with OpenGL (legacy, fixed pipeline)\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n\n// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**\n// **Prefer using the code in the opengl3_example/ folder**\n// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.\n// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more\n// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might\n// confuse your GPU driver. \n// The GL2 code is unable to reset attributes or even call e.g. \"glUseProgram(0)\" because they don't exist in that API.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n#include <imgui.h>\n#include \"imgui_impl_glfw.h\"\n\n// GLFW\n#include <GLFW/glfw3.h>\n#ifdef _WIN32\n#undef APIENTRY\n#define GLFW_EXPOSE_NATIVE_WIN32\n#define GLFW_EXPOSE_NATIVE_WGL\n#include <GLFW/glfw3native.h>\n#endif\n\n// Data\nstatic GLFWwindow*  g_Window = NULL;\nstatic double       g_Time = 0.0f;\nstatic bool         g_MouseJustPressed[3] = { false, false, false };\nstatic float        g_MouseWheel = 0.0f;\nstatic GLuint       g_FontTexture = 0;\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\nvoid ImGui_ImplGlfwGL2_RenderDrawLists(ImDrawData* draw_data)\n// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly, in order to be able to run within any OpenGL engine that doesn't do so. \n// If text or lines are blurry when integrating ImGui in your engine: in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)\n{\n    // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)\n    ImGuiIO& io = ImGui::GetIO();\n    int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);\n    int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);\n    if (fb_width == 0 || fb_height == 0)\n        return;\n    draw_data->ScaleClipRects(io.DisplayFramebufferScale);\n\n    // We are using the OpenGL fixed pipeline to make the example code simpler to read!\n    // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill.\n    GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);\n    GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);\n    GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); \n    glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n    glDisable(GL_CULL_FACE);\n    glDisable(GL_DEPTH_TEST);\n    glEnable(GL_SCISSOR_TEST);\n    glEnableClientState(GL_VERTEX_ARRAY);\n    glEnableClientState(GL_TEXTURE_COORD_ARRAY);\n    glEnableClientState(GL_COLOR_ARRAY);\n    glEnable(GL_TEXTURE_2D);\n    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n    //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound\n\n    // Setup viewport, orthographic projection matrix\n    glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);\n    glMatrixMode(GL_PROJECTION);\n    glPushMatrix();\n    glLoadIdentity();\n    glOrtho(0.0f, io.DisplaySize.x, io.DisplaySize.y, 0.0f, -1.0f, +1.0f);\n    glMatrixMode(GL_MODELVIEW);\n    glPushMatrix();\n    glLoadIdentity();\n\n    // Render command lists\n    #define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data;\n        const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data;\n        glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + OFFSETOF(ImDrawVert, pos)));\n        glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + OFFSETOF(ImDrawVert, uv)));\n        glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + OFFSETOF(ImDrawVert, col)));\n\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);\n                glScissor((int)pcmd->ClipRect.x, (int)(fb_height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y));\n                glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer);\n            }\n            idx_buffer += pcmd->ElemCount;\n        }\n    }\n    #undef OFFSETOF\n\n    // Restore modified state\n    glDisableClientState(GL_COLOR_ARRAY);\n    glDisableClientState(GL_TEXTURE_COORD_ARRAY);\n    glDisableClientState(GL_VERTEX_ARRAY);\n    glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture);\n    glMatrixMode(GL_MODELVIEW);\n    glPopMatrix();\n    glMatrixMode(GL_PROJECTION);\n    glPopMatrix();\n    glPopAttrib();\n    glPolygonMode(GL_FRONT, last_polygon_mode[0]); glPolygonMode(GL_BACK, last_polygon_mode[1]);\n    glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);\n    glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);\n}\n\nstatic const char* ImGui_ImplGlfwGL2_GetClipboardText(void* user_data)\n{\n    return glfwGetClipboardString((GLFWwindow*)user_data);\n}\n\nstatic void ImGui_ImplGlfwGL2_SetClipboardText(void* user_data, const char* text)\n{\n    glfwSetClipboardString((GLFWwindow*)user_data, text);\n}\n\nvoid ImGui_ImplGlfwGL2_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)\n{\n    if (action == GLFW_PRESS && button >= 0 && button < 3)\n        g_MouseJustPressed[button] = true;\n}\n\nvoid ImGui_ImplGlfwGL2_ScrollCallback(GLFWwindow*, double /*xoffset*/, double yoffset)\n{\n    g_MouseWheel += (float)yoffset; // Use fractional mouse wheel.\n}\n\nvoid ImGui_ImplGlfwGL2_KeyCallback(GLFWwindow*, int key, int, int action, int mods)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    if (action == GLFW_PRESS)\n        io.KeysDown[key] = true;\n    if (action == GLFW_RELEASE)\n        io.KeysDown[key] = false;\n\n    (void)mods; // Modifiers are not reliable across systems\n    io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL];\n    io.KeyShift = io.KeysDown[GLFW_KEY_LEFT_SHIFT] || io.KeysDown[GLFW_KEY_RIGHT_SHIFT];\n    io.KeyAlt = io.KeysDown[GLFW_KEY_LEFT_ALT] || io.KeysDown[GLFW_KEY_RIGHT_ALT];\n    io.KeySuper = io.KeysDown[GLFW_KEY_LEFT_SUPER] || io.KeysDown[GLFW_KEY_RIGHT_SUPER];\n}\n\nvoid ImGui_ImplGlfwGL2_CharCallback(GLFWwindow*, unsigned int c)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    if (c > 0 && c < 0x10000)\n        io.AddInputCharacter((unsigned short)c);\n}\n\nbool ImGui_ImplGlfwGL2_CreateDeviceObjects()\n{\n    // Build texture atlas\n    ImGuiIO& io = ImGui::GetIO();\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);   // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.\n\n    // Upload texture to graphics system\n    GLint last_texture;\n    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    glGenTextures(1, &g_FontTexture);\n    glBindTexture(GL_TEXTURE_2D, g_FontTexture);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;\n\n    // Restore state\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n\n    return true;\n}\n\nvoid    ImGui_ImplGlfwGL2_InvalidateDeviceObjects()\n{\n    if (g_FontTexture)\n    {\n        glDeleteTextures(1, &g_FontTexture);\n        ImGui::GetIO().Fonts->TexID = 0;\n        g_FontTexture = 0;\n    }\n}\n\nbool    ImGui_ImplGlfwGL2_Init(GLFWwindow* window, bool install_callbacks)\n{\n    g_Window = window;\n\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB;                     // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.\n    io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = GLFW_KEY_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = GLFW_KEY_PAGE_UP;\n    io.KeyMap[ImGuiKey_PageDown] = GLFW_KEY_PAGE_DOWN;\n    io.KeyMap[ImGuiKey_Home] = GLFW_KEY_HOME;\n    io.KeyMap[ImGuiKey_End] = GLFW_KEY_END;\n    io.KeyMap[ImGuiKey_Delete] = GLFW_KEY_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = GLFW_KEY_BACKSPACE;\n    io.KeyMap[ImGuiKey_Enter] = GLFW_KEY_ENTER;\n    io.KeyMap[ImGuiKey_Escape] = GLFW_KEY_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = GLFW_KEY_A;\n    io.KeyMap[ImGuiKey_C] = GLFW_KEY_C;\n    io.KeyMap[ImGuiKey_V] = GLFW_KEY_V;\n    io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;\n    io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;\n    io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;\n\n    io.RenderDrawListsFn = ImGui_ImplGlfwGL2_RenderDrawLists;      // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.SetClipboardTextFn = ImGui_ImplGlfwGL2_SetClipboardText;\n    io.GetClipboardTextFn = ImGui_ImplGlfwGL2_GetClipboardText;\n    io.ClipboardUserData = g_Window;\n#ifdef _WIN32\n    io.ImeWindowHandle = glfwGetWin32Window(g_Window);\n#endif\n\n    if (install_callbacks)\n    {\n        glfwSetMouseButtonCallback(window, ImGui_ImplGlfwGL2_MouseButtonCallback);\n        glfwSetScrollCallback(window, ImGui_ImplGlfwGL2_ScrollCallback);\n        glfwSetKeyCallback(window, ImGui_ImplGlfwGL2_KeyCallback);\n        glfwSetCharCallback(window, ImGui_ImplGlfwGL2_CharCallback);\n    }\n\n    return true;\n}\n\nvoid ImGui_ImplGlfwGL2_Shutdown()\n{\n    ImGui_ImplGlfwGL2_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n}\n\nvoid ImGui_ImplGlfwGL2_NewFrame()\n{\n    if (!g_FontTexture)\n        ImGui_ImplGlfwGL2_CreateDeviceObjects();\n\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    int w, h;\n    int display_w, display_h;\n    glfwGetWindowSize(g_Window, &w, &h);\n    glfwGetFramebufferSize(g_Window, &display_w, &display_h);\n    io.DisplaySize = ImVec2((float)w, (float)h);\n    io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);\n\n    // Setup time step\n    double current_time =  glfwGetTime();\n    io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);\n    g_Time = current_time;\n\n    // Setup inputs\n    // (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())\n    if (glfwGetWindowAttrib(g_Window, GLFW_FOCUSED))\n    {\n        if (io.WantMoveMouse)\n        {\n            glfwSetCursorPos(g_Window, (double)io.MousePos.x, (double)io.MousePos.y);   // Set mouse position if requested by io.WantMoveMouse flag (used when io.NavMovesTrue is enabled by user and using directional navigation)\n        }\n        else\n        {\n            double mouse_x, mouse_y;\n            glfwGetCursorPos(g_Window, &mouse_x, &mouse_y);\n            io.MousePos = ImVec2((float)mouse_x, (float)mouse_y);   // Get mouse position in screen coordinates (set to -1,-1 if no mouse / on another screen, etc.)\n        }\n    }\n    else\n    {\n        io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX);\n    }\n\n    for (int i = 0; i < 3; i++)\n    {\n        // If a mouse press event came, always pass it as \"mouse held this frame\", so we don't miss click-release events that are shorter than 1 frame.\n        io.MouseDown[i] = g_MouseJustPressed[i] || glfwGetMouseButton(g_Window, i) != 0;\n        g_MouseJustPressed[i] = false;\n    }\n\n    io.MouseWheel = g_MouseWheel;\n    g_MouseWheel = 0.0f;\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL);\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n"
  },
  {
    "path": "external/imgui/examples/opengl2_example/imgui_impl_glfw.h",
    "content": "// ImGui GLFW binding with OpenGL (legacy, fixed pipeline)\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n\n// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**\n// **Prefer using the code in the opengl3_example/ folder**\n// See imgui_impl_glfw.cpp for details.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\nstruct GLFWwindow;\n\nIMGUI_API bool        ImGui_ImplGlfwGL2_Init(GLFWwindow* window, bool install_callbacks);\nIMGUI_API void        ImGui_ImplGlfwGL2_Shutdown();\nIMGUI_API void        ImGui_ImplGlfwGL2_NewFrame();\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_ImplGlfwGL2_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_ImplGlfwGL2_CreateDeviceObjects();\n\n// GLFW callbacks (registered by default to GLFW if you enable 'install_callbacks' during initialization)\n// Provided here if you want to chain callbacks yourself. You may also handle inputs yourself and use those as a reference.\nIMGUI_API void        ImGui_ImplGlfwGL2_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);\nIMGUI_API void        ImGui_ImplGlfwGL2_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);\nIMGUI_API void        ImGui_ImplGlfwGL2_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);\nIMGUI_API void        ImGui_ImplGlfwGL2_CharCallback(GLFWwindow* window, unsigned int c);\n"
  },
  {
    "path": "external/imgui/examples/opengl2_example/main.cpp",
    "content": "// ImGui - standalone example application for GLFW + OpenGL2, using legacy fixed pipeline\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n\n// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**\n// **Prefer using the code in the opengl3_example/ folder**\n// See imgui_impl_glfw.cpp for details.\n\n#include <imgui.h>\n#include \"imgui_impl_glfw.h\"\n#include <stdio.h>\n#include <GLFW/glfw3.h>\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error %d: %s\\n\", error, description);\n}\n\nint main(int, char**)\n{\n    // Setup window\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit())\n        return 1;\n    GLFWwindow* window = glfwCreateWindow(1280, 720, \"ImGui OpenGL2 example\", NULL, NULL);\n    glfwMakeContextCurrent(window);\n    glfwSwapInterval(1); // Enable vsync\n\n    // Setup ImGui binding\n    ImGui_ImplGlfwGL2_Init(window, true);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    while (!glfwWindowShouldClose(window))\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        glfwPollEvents();\n        ImGui_ImplGlfwGL2_NewFrame();\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        int display_w, display_h;\n        glfwGetFramebufferSize(window, &display_w, &display_h);\n        glViewport(0, 0, display_w, display_h);\n        glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);\n        glClear(GL_COLOR_BUFFER_BIT);\n        //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound, but prefer using the GL3+ code.\n        ImGui::Render();\n        glfwSwapBuffers(window);\n    }\n\n    // Cleanup\n    ImGui_ImplGlfwGL2_Shutdown();\n    glfwTerminate();\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/opengl2_example/opengl2_example.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{9CDA7840-B7A5-496D-A527-E95571496D18}</ProjectGuid>\n    <RootNamespace>opengl2_example</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n    <IncludePath>$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n    <IncludePath>$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n    <IncludePath>$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n    <IncludePath>$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\libs\\glfw\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>$(SolutionDir)\\libs\\glfw\\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\libs\\glfw\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>$(SolutionDir)\\libs\\glfw\\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\libs\\glfw\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>$(SolutionDir)\\libs\\glfw\\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <IgnoreSpecificDefaultLibraries>\n      </IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\libs\\glfw\\include;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>$(SolutionDir)\\libs\\glfw\\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <IgnoreSpecificDefaultLibraries>\n      </IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\imgui.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\" />\n    <ClCompile Include=\"imgui_impl_glfw.cpp\" />\n    <ClCompile Include=\"main.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\" />\n    <ClInclude Include=\"..\\..\\imgui.h\" />\n    <ClInclude Include=\"..\\..\\imgui_internal.h\" />\n    <ClInclude Include=\"imgui_impl_glfw.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/opengl2_example/opengl2_example.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"imgui\">\n      <UniqueIdentifier>{c336cfe3-f0c4-464c-9ef0-a9e17a7ff222}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"sources\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"main.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"imgui_impl_glfw.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"imgui_impl_glfw.h\">\n      <Filter>sources</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui_internal.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/opengl3_example/Makefile",
    "content": "#\n# Cross Platform Makefile\n# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X\n#\n#\n# You will need GLFW (http://www.glfw.org)\n#\n#   apt-get install libglfw-dev  # Linux\n#   brew install glfw            # Mac OS X\n#   pacman -S --noconfirm --needed mingw-w64-x86_64-toolchain mingw-w64-x86_64-glfw # MSYS2\n#\n\n#CXX = g++\n\nEXE = opengl3_example\nOBJS = main.o imgui_impl_glfw_gl3.o\nOBJS += ../../imgui.o ../../imgui_demo.o ../../imgui_draw.o\nOBJS += ../libs/gl3w/GL/gl3w.o\n\nUNAME_S := $(shell uname -s)\n\n\nifeq ($(UNAME_S), Linux) #LINUX\n\tECHO_MESSAGE = \"Linux\"\n\tLIBS = -lGL `pkg-config --static --libs glfw3`\n\n\tCXXFLAGS = -I../../ -I../libs/gl3w `pkg-config --cflags glfw3`\n\tCXXFLAGS += -Wall -Wformat\n\tCFLAGS = $(CXXFLAGS)\nendif\n\nifeq ($(UNAME_S), Darwin) #APPLE\n\tECHO_MESSAGE = \"Mac OS X\"\n\tLIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo\n\t#LIBS += -L/usr/local/lib -lglfw3\n\tLIBS += -L/usr/local/lib -lglfw\n\n\tCXXFLAGS = -I../../ -I../libs/gl3w -I/usr/local/include\n\tCXXFLAGS += -Wall -Wformat\n\tCFLAGS = $(CXXFLAGS)\nendif\n\nifeq ($(findstring MINGW,$(UNAME_S)),MINGW)\n   ECHO_MESSAGE = \"Windows\"\n   LIBS = -lglfw3 -lgdi32 -lopengl32 -limm32\n\n   CXXFLAGS = -I../../ -I../libs/gl3w `pkg-config --cflags glfw3`\n   CXXFLAGS += -Wall -Wformat\n   CFLAGS = $(CXXFLAGS)\nendif\n\n\n.cpp.o:\n\t$(CXX) $(CXXFLAGS) -c -o $@ $<\n\nall: $(EXE)\n\t@echo Build complete for $(ECHO_MESSAGE)\n\n$(EXE): $(OBJS)\n\t$(CXX) -o $(EXE) $(OBJS) $(CXXFLAGS) $(LIBS)\n\nclean:\n\trm $(EXE) $(OBJS)\n"
  },
  {
    "path": "external/imgui/examples/opengl3_example/build_win32.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I ..\\libs\\glfw\\include /I ..\\libs\\gl3w *.cpp ..\\..\\imgui*.cpp ..\\libs\\gl3w\\GL\\gl3w.c /FeDebug/opengl_example3.exe /FoDebug/ /link /LIBPATH:..\\libs\\glfw\\lib-vc2010-32 glfw3.lib opengl32.lib gdi32.lib shell32.lib\n"
  },
  {
    "path": "external/imgui/examples/opengl3_example/imgui_impl_glfw_gl3.cpp",
    "content": "// ImGui GLFW binding with OpenGL3 + shaders\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n// (GL3W is a helper library to access OpenGL functions since there is no standard header to access modern OpenGL functions easily. Alternatives are GLEW, Glad, etc.)\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n#include <imgui.h>\n#include \"imgui_impl_glfw_gl3.h\"\n\n// GL3W/GLFW\n#include <GL/gl3w.h>    // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you.\n#include <GLFW/glfw3.h>\n#ifdef _WIN32\n#undef APIENTRY\n#define GLFW_EXPOSE_NATIVE_WIN32\n#define GLFW_EXPOSE_NATIVE_WGL\n#include <GLFW/glfw3native.h>\n#endif\n\n// Data\nstatic GLFWwindow*  g_Window = NULL;\nstatic double       g_Time = 0.0f;\nstatic bool         g_MouseJustPressed[3] = { false, false, false };\nstatic float        g_MouseWheel = 0.0f;\nstatic GLuint       g_FontTexture = 0;\nstatic int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0;\nstatic int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;\nstatic int          g_AttribLocationPosition = 0, g_AttribLocationUV = 0, g_AttribLocationColor = 0;\nstatic unsigned int g_VboHandle = 0, g_VaoHandle = 0, g_ElementsHandle = 0;\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\n// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly, in order to be able to run within any OpenGL engine that doesn't do so. \n// If text or lines are blurry when integrating ImGui in your engine: in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)\nvoid ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data)\n{\n    // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)\n    ImGuiIO& io = ImGui::GetIO();\n    int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);\n    int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);\n    if (fb_width == 0 || fb_height == 0)\n        return;\n    draw_data->ScaleClipRects(io.DisplayFramebufferScale);\n\n    // Backup GL state\n    GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture);\n    glActiveTexture(GL_TEXTURE0);\n    GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);\n    GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    GLint last_sampler; glGetIntegerv(GL_SAMPLER_BINDING, &last_sampler);\n    GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);\n    GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);\n    GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);\n    GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);\n    GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);\n    GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);\n    GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);\n    GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb);\n    GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha);\n    GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha);\n    GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb);\n    GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha);\n    GLboolean last_enable_blend = glIsEnabled(GL_BLEND);\n    GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);\n    GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);\n    GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);\n\n    // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill\n    glEnable(GL_BLEND);\n    glBlendEquation(GL_FUNC_ADD);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n    glDisable(GL_CULL_FACE);\n    glDisable(GL_DEPTH_TEST);\n    glEnable(GL_SCISSOR_TEST);\n    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\n    // Setup viewport, orthographic projection matrix\n    glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);\n    const float ortho_projection[4][4] =\n    {\n        { 2.0f/io.DisplaySize.x, 0.0f,                   0.0f, 0.0f },\n        { 0.0f,                  2.0f/-io.DisplaySize.y, 0.0f, 0.0f },\n        { 0.0f,                  0.0f,                  -1.0f, 0.0f },\n        {-1.0f,                  1.0f,                   0.0f, 1.0f },\n    };\n    glUseProgram(g_ShaderHandle);\n    glUniform1i(g_AttribLocationTex, 0);\n    glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);\n    glBindVertexArray(g_VaoHandle);\n    glBindSampler(0, 0); // Rely on combined texture/sampler state.\n\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        const ImDrawIdx* idx_buffer_offset = 0;\n\n        glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);\n        glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert), (const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW);\n\n        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle);\n        glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx), (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW);\n\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);\n                glScissor((int)pcmd->ClipRect.x, (int)(fb_height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y));\n                glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);\n            }\n            idx_buffer_offset += pcmd->ElemCount;\n        }\n    }\n\n    // Restore modified GL state\n    glUseProgram(last_program);\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n    glBindSampler(0, last_sampler);\n    glActiveTexture(last_active_texture);\n    glBindVertexArray(last_vertex_array);\n    glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);\n    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);\n    glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);\n    glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);\n    if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);\n    if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);\n    if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);\n    if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);\n    glPolygonMode(GL_FRONT_AND_BACK, last_polygon_mode[0]);\n    glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);\n    glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);\n}\n\nstatic const char* ImGui_ImplGlfwGL3_GetClipboardText(void* user_data)\n{\n    return glfwGetClipboardString((GLFWwindow*)user_data);\n}\n\nstatic void ImGui_ImplGlfwGL3_SetClipboardText(void* user_data, const char* text)\n{\n    glfwSetClipboardString((GLFWwindow*)user_data, text);\n}\n\nvoid ImGui_ImplGlfwGL3_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)\n{\n    if (action == GLFW_PRESS && button >= 0 && button < 3)\n        g_MouseJustPressed[button] = true;\n}\n\nvoid ImGui_ImplGlfwGL3_ScrollCallback(GLFWwindow*, double /*xoffset*/, double yoffset)\n{\n    g_MouseWheel += (float)yoffset; // Use fractional mouse wheel.\n}\n\nvoid ImGui_ImplGlfwGL3_KeyCallback(GLFWwindow*, int key, int, int action, int mods)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    if (action == GLFW_PRESS)\n        io.KeysDown[key] = true;\n    if (action == GLFW_RELEASE)\n        io.KeysDown[key] = false;\n\n    (void)mods; // Modifiers are not reliable across systems\n    io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL];\n    io.KeyShift = io.KeysDown[GLFW_KEY_LEFT_SHIFT] || io.KeysDown[GLFW_KEY_RIGHT_SHIFT];\n    io.KeyAlt = io.KeysDown[GLFW_KEY_LEFT_ALT] || io.KeysDown[GLFW_KEY_RIGHT_ALT];\n    io.KeySuper = io.KeysDown[GLFW_KEY_LEFT_SUPER] || io.KeysDown[GLFW_KEY_RIGHT_SUPER];\n}\n\nvoid ImGui_ImplGlfwGL3_CharCallback(GLFWwindow*, unsigned int c)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    if (c > 0 && c < 0x10000)\n        io.AddInputCharacter((unsigned short)c);\n}\n\nbool ImGui_ImplGlfwGL3_CreateFontsTexture()\n{\n    // Build texture atlas\n    ImGuiIO& io = ImGui::GetIO();\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);   // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.\n\n    // Upload texture to graphics system\n    GLint last_texture;\n    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    glGenTextures(1, &g_FontTexture);\n    glBindTexture(GL_TEXTURE_2D, g_FontTexture);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;\n\n    // Restore state\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n\n    return true;\n}\n\nbool ImGui_ImplGlfwGL3_CreateDeviceObjects()\n{\n    // Backup GL state\n    GLint last_texture, last_array_buffer, last_vertex_array;\n    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);\n    glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);\n\n    const GLchar *vertex_shader =\n        \"#version 330\\n\"\n        \"uniform mat4 ProjMtx;\\n\"\n        \"in vec2 Position;\\n\"\n        \"in vec2 UV;\\n\"\n        \"in vec4 Color;\\n\"\n        \"out vec2 Frag_UV;\\n\"\n        \"out vec4 Frag_Color;\\n\"\n        \"void main()\\n\"\n        \"{\\n\"\n        \"\tFrag_UV = UV;\\n\"\n        \"\tFrag_Color = Color;\\n\"\n        \"\tgl_Position = ProjMtx * vec4(Position.xy,0,1);\\n\"\n        \"}\\n\";\n\n    const GLchar* fragment_shader =\n        \"#version 330\\n\"\n        \"uniform sampler2D Texture;\\n\"\n        \"in vec2 Frag_UV;\\n\"\n        \"in vec4 Frag_Color;\\n\"\n        \"out vec4 Out_Color;\\n\"\n        \"void main()\\n\"\n        \"{\\n\"\n        \"\tOut_Color = Frag_Color * texture( Texture, Frag_UV.st);\\n\"\n        \"}\\n\";\n\n    g_ShaderHandle = glCreateProgram();\n    g_VertHandle = glCreateShader(GL_VERTEX_SHADER);\n    g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(g_VertHandle, 1, &vertex_shader, 0);\n    glShaderSource(g_FragHandle, 1, &fragment_shader, 0);\n    glCompileShader(g_VertHandle);\n    glCompileShader(g_FragHandle);\n    glAttachShader(g_ShaderHandle, g_VertHandle);\n    glAttachShader(g_ShaderHandle, g_FragHandle);\n    glLinkProgram(g_ShaderHandle);\n\n    g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, \"Texture\");\n    g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, \"ProjMtx\");\n    g_AttribLocationPosition = glGetAttribLocation(g_ShaderHandle, \"Position\");\n    g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, \"UV\");\n    g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, \"Color\");\n\n    glGenBuffers(1, &g_VboHandle);\n    glGenBuffers(1, &g_ElementsHandle);\n\n    glGenVertexArrays(1, &g_VaoHandle);\n    glBindVertexArray(g_VaoHandle);\n    glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);\n    glEnableVertexAttribArray(g_AttribLocationPosition);\n    glEnableVertexAttribArray(g_AttribLocationUV);\n    glEnableVertexAttribArray(g_AttribLocationColor);\n\n#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))\n    glVertexAttribPointer(g_AttribLocationPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, pos));\n    glVertexAttribPointer(g_AttribLocationUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, uv));\n    glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, col));\n#undef OFFSETOF\n\n    ImGui_ImplGlfwGL3_CreateFontsTexture();\n\n    // Restore modified GL state\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n    glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);\n    glBindVertexArray(last_vertex_array);\n\n    return true;\n}\n\nvoid    ImGui_ImplGlfwGL3_InvalidateDeviceObjects()\n{\n    if (g_VaoHandle) glDeleteVertexArrays(1, &g_VaoHandle);\n    if (g_VboHandle) glDeleteBuffers(1, &g_VboHandle);\n    if (g_ElementsHandle) glDeleteBuffers(1, &g_ElementsHandle);\n    g_VaoHandle = g_VboHandle = g_ElementsHandle = 0;\n\n    if (g_ShaderHandle && g_VertHandle) glDetachShader(g_ShaderHandle, g_VertHandle);\n    if (g_VertHandle) glDeleteShader(g_VertHandle);\n    g_VertHandle = 0;\n\n    if (g_ShaderHandle && g_FragHandle) glDetachShader(g_ShaderHandle, g_FragHandle);\n    if (g_FragHandle) glDeleteShader(g_FragHandle);\n    g_FragHandle = 0;\n\n    if (g_ShaderHandle) glDeleteProgram(g_ShaderHandle);\n    g_ShaderHandle = 0;\n\n    if (g_FontTexture)\n    {\n        glDeleteTextures(1, &g_FontTexture);\n        ImGui::GetIO().Fonts->TexID = 0;\n        g_FontTexture = 0;\n    }\n}\n\nbool    ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks)\n{\n    g_Window = window;\n\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB;                         // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.\n    io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = GLFW_KEY_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = GLFW_KEY_PAGE_UP;\n    io.KeyMap[ImGuiKey_PageDown] = GLFW_KEY_PAGE_DOWN;\n    io.KeyMap[ImGuiKey_Home] = GLFW_KEY_HOME;\n    io.KeyMap[ImGuiKey_End] = GLFW_KEY_END;\n    io.KeyMap[ImGuiKey_Delete] = GLFW_KEY_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = GLFW_KEY_BACKSPACE;\n    io.KeyMap[ImGuiKey_Enter] = GLFW_KEY_ENTER;\n    io.KeyMap[ImGuiKey_Escape] = GLFW_KEY_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = GLFW_KEY_A;\n    io.KeyMap[ImGuiKey_C] = GLFW_KEY_C;\n    io.KeyMap[ImGuiKey_V] = GLFW_KEY_V;\n    io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;\n    io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;\n    io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;\n\n    io.RenderDrawListsFn = ImGui_ImplGlfwGL3_RenderDrawLists;       // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.SetClipboardTextFn = ImGui_ImplGlfwGL3_SetClipboardText;\n    io.GetClipboardTextFn = ImGui_ImplGlfwGL3_GetClipboardText;\n    io.ClipboardUserData = g_Window;\n#ifdef _WIN32\n    io.ImeWindowHandle = glfwGetWin32Window(g_Window);\n#endif\n\n    if (install_callbacks)\n    {\n        glfwSetMouseButtonCallback(window, ImGui_ImplGlfwGL3_MouseButtonCallback);\n        glfwSetScrollCallback(window, ImGui_ImplGlfwGL3_ScrollCallback);\n        glfwSetKeyCallback(window, ImGui_ImplGlfwGL3_KeyCallback);\n        glfwSetCharCallback(window, ImGui_ImplGlfwGL3_CharCallback);\n    }\n\n    return true;\n}\n\nvoid ImGui_ImplGlfwGL3_Shutdown()\n{\n    ImGui_ImplGlfwGL3_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n}\n\nvoid ImGui_ImplGlfwGL3_NewFrame()\n{\n    if (!g_FontTexture)\n        ImGui_ImplGlfwGL3_CreateDeviceObjects();\n\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    int w, h;\n    int display_w, display_h;\n    glfwGetWindowSize(g_Window, &w, &h);\n    glfwGetFramebufferSize(g_Window, &display_w, &display_h);\n    io.DisplaySize = ImVec2((float)w, (float)h);\n    io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);\n\n    // Setup time step\n    double current_time =  glfwGetTime();\n    io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);\n    g_Time = current_time;\n\n    // Setup inputs\n    // (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())\n    if (glfwGetWindowAttrib(g_Window, GLFW_FOCUSED))\n    {\n        if (io.WantMoveMouse)\n        {\n            glfwSetCursorPos(g_Window, (double)io.MousePos.x, (double)io.MousePos.y);   // Set mouse position if requested by io.WantMoveMouse flag (used when io.NavMovesTrue is enabled by user and using directional navigation)\n        }\n        else\n        {\n            double mouse_x, mouse_y;\n            glfwGetCursorPos(g_Window, &mouse_x, &mouse_y);\n            io.MousePos = ImVec2((float)mouse_x, (float)mouse_y);   // Get mouse position in screen coordinates (set to -1,-1 if no mouse / on another screen, etc.)\n        }\n    }\n    else\n    {\n        io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX);\n    }\n\n    for (int i = 0; i < 3; i++)\n    {\n        // If a mouse press event came, always pass it as \"mouse held this frame\", so we don't miss click-release events that are shorter than 1 frame.\n        io.MouseDown[i] = g_MouseJustPressed[i] || glfwGetMouseButton(g_Window, i) != 0;\n        g_MouseJustPressed[i] = false;\n    }\n\n    io.MouseWheel = g_MouseWheel;\n    g_MouseWheel = 0.0f;\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL);\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n"
  },
  {
    "path": "external/imgui/examples/opengl3_example/imgui_impl_glfw_gl3.h",
    "content": "// ImGui GLFW binding with OpenGL3 + shaders\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n// (GL3W is a helper library to access OpenGL functions since there is no standard header to access modern OpenGL functions easily. Alternatives are GLEW, Glad, etc.)\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\nstruct GLFWwindow;\n\nIMGUI_API bool        ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks);\nIMGUI_API void        ImGui_ImplGlfwGL3_Shutdown();\nIMGUI_API void        ImGui_ImplGlfwGL3_NewFrame();\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_ImplGlfwGL3_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_ImplGlfwGL3_CreateDeviceObjects();\n\n// GLFW callbacks (installed by default if you enable 'install_callbacks' during initialization)\n// Provided here if you want to chain callbacks.\n// You can also handle inputs yourself and use those as a reference.\nIMGUI_API void        ImGui_ImplGlfwGL3_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);\nIMGUI_API void        ImGui_ImplGlfwGL3_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);\nIMGUI_API void        ImGui_ImplGlfwGL3_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);\nIMGUI_API void        ImGui_ImplGlfwGL3_CharCallback(GLFWwindow* window, unsigned int c);\n"
  },
  {
    "path": "external/imgui/examples/opengl3_example/main.cpp",
    "content": "// ImGui - standalone example application for GLFW + OpenGL 3, using programmable pipeline\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n// (GL3W is a helper library to access OpenGL functions since there is no standard header to access modern OpenGL functions easily. Alternatives are GLEW, Glad, etc.)\n\n#include <imgui.h>\n#include \"imgui_impl_glfw_gl3.h\"\n#include <stdio.h>\n#include <GL/gl3w.h>    // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you.\n#include <GLFW/glfw3.h>\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error %d: %s\\n\", error, description);\n}\n\nint main(int, char**)\n{\n    // Setup window\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit())\n        return 1;\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);\n    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n#if __APPLE__\n    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);\n#endif\n    GLFWwindow* window = glfwCreateWindow(1280, 720, \"ImGui OpenGL3 example\", NULL, NULL);\n    glfwMakeContextCurrent(window);\n    glfwSwapInterval(1); // Enable vsync\n    gl3wInit();\n\n    // Setup ImGui binding\n    ImGui_ImplGlfwGL3_Init(window, true);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    while (!glfwWindowShouldClose(window))\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        glfwPollEvents();\n        ImGui_ImplGlfwGL3_NewFrame();\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        int display_w, display_h;\n        glfwGetFramebufferSize(window, &display_w, &display_h);\n        glViewport(0, 0, display_w, display_h);\n        glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);\n        glClear(GL_COLOR_BUFFER_BIT);\n        ImGui::Render();\n        glfwSwapBuffers(window);\n    }\n\n    // Cleanup\n    ImGui_ImplGlfwGL3_Shutdown();\n    glfwTerminate();\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/opengl3_example/opengl3_example.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{4a1fb5ea-22f5-42a8-ab92-1d2df5d47fb9}</ProjectGuid>\n    <RootNamespace>opengl3_example</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n    <IncludePath>$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n    <IncludePath>$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n    <IncludePath>$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <OutDir>$(ProjectDir)$(Configuration)\\</OutDir>\n    <IntDir>$(ProjectDir)$(Configuration)\\</IntDir>\n    <IncludePath>$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\libs\\glfw\\include;$(SolutionDir)\\libs\\gl3w;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>$(SolutionDir)\\libs\\glfw\\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\libs\\glfw\\include;$(SolutionDir)\\libs\\gl3w;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>$(SolutionDir)\\libs\\glfw\\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\libs\\glfw\\include;$(SolutionDir)\\libs\\gl3w;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>$(SolutionDir)\\libs\\glfw\\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <IgnoreSpecificDefaultLibraries>\n      </IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\libs\\glfw\\include;$(SolutionDir)\\libs\\gl3w;..\\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>$(SolutionDir)\\libs\\glfw\\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Console</SubSystem>\n      <IgnoreSpecificDefaultLibraries>\n      </IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\imgui.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\" />\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\" />\n    <ClCompile Include=\"..\\libs\\gl3w\\GL\\gl3w.c\" />\n    <ClCompile Include=\"imgui_impl_glfw_gl3.cpp\" />\n    <ClCompile Include=\"main.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\" />\n    <ClInclude Include=\"..\\..\\imgui.h\" />\n    <ClInclude Include=\"..\\..\\imgui_internal.h\" />\n    <ClInclude Include=\"..\\libs\\gl3w\\GL\\gl3w.h\" />\n    <ClInclude Include=\"..\\libs\\gl3w\\GL\\glcorearb.h\" />\n    <ClInclude Include=\"imgui_impl_glfw_gl3.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/opengl3_example/opengl3_example.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"imgui\">\n      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"sources\">\n      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"gl3w\">\n      <UniqueIdentifier>{42f99867-3108-43b8-99d0-fabefaf1f2e3}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"main.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"imgui_impl_glfw_gl3.cpp\">\n      <Filter>sources</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\libs\\gl3w\\GL\\gl3w.c\">\n      <Filter>gl3w</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_demo.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\imgui_draw.cpp\">\n      <Filter>imgui</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\imconfig.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n    <ClInclude Include=\"imgui_impl_glfw_gl3.h\">\n      <Filter>sources</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\libs\\gl3w\\GL\\gl3w.h\">\n      <Filter>gl3w</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\libs\\gl3w\\GL\\glcorearb.h\">\n      <Filter>gl3w</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\imgui_internal.h\">\n      <Filter>imgui</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\README.txt\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "external/imgui/examples/sdl_opengl2_example/README.md",
    "content": "\n# How to Build\n\n- On Windows with Visual Studio's CLI\n\n```\nset SDL2DIR=path_to_your_sdl2_folder\ncl /Zi /MD /I %SDL2DIR%\\include /I ..\\.. main.cpp imgui_impl_sdl.cpp ..\\..\\imgui*.cpp /link /LIBPATH:%SDL2DIR%\\lib SDL2.lib SDL2main.lib opengl32.lib /subsystem:console\n```\n\n- On Linux and similar Unixes\n\n```\nc++ `sdl2-config --cflags` -I ../.. main.cpp imgui_impl_sdl.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL -o sdl2example\n```\n\n- On Mac OS X\n\n```\nbrew install sdl2\nc++ `sdl2-config --cflags` -I ../.. main.cpp imgui_impl_sdl.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl -o sdl2example\n```\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl2_example/build_win32.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I ..\\libs\\gl3w /I %SDL_DIR%\\include main.cpp imgui_impl_sdl.cpp ..\\..\\imgui*.cpp ..\\libs\\gl3w\\GL\\gl3w.c /FeDebug/sdl_opengl2_example.exe /FoDebug/ /link /libpath:%SDL_DIR%\\lib\\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl2_example/imgui_impl_sdl.cpp",
    "content": "// ImGui SDL2 binding with OpenGL (legacy, fixed pipeline)\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n\n// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**\n// **Prefer using the code in the sdl_opengl3_example/ folder**\n// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.\n// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more\n// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might\n// confuse your GPU driver. \n// The GL2 code is unable to reset attributes or even call e.g. \"glUseProgram(0)\" because they don't exist in that API.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n#include <SDL.h>\n#include <SDL_syswm.h>\n#include <SDL_opengl.h>\n#include <imgui.h>\n#include \"imgui_impl_sdl.h\"\n\n// Data\nstatic double       g_Time = 0.0f;\nstatic bool         g_MousePressed[3] = { false, false, false };\nstatic float        g_MouseWheel = 0.0f;\nstatic GLuint       g_FontTexture = 0;\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\n// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly, in order to be able to run within any OpenGL engine that doesn't do so. \n// If text or lines are blurry when integrating ImGui in your engine: in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)\nvoid ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data)\n{\n    // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)\n    ImGuiIO& io = ImGui::GetIO();\n    int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);\n    int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);\n    if (fb_width == 0 || fb_height == 0)\n        return;\n    draw_data->ScaleClipRects(io.DisplayFramebufferScale);\n\n    // We are using the OpenGL fixed pipeline to make the example code simpler to read!\n    // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill.\n    GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);\n    GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);\n    GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); \n    glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n    glDisable(GL_CULL_FACE);\n    glDisable(GL_DEPTH_TEST);\n    glEnable(GL_SCISSOR_TEST);\n    glEnableClientState(GL_VERTEX_ARRAY);\n    glEnableClientState(GL_TEXTURE_COORD_ARRAY);\n    glEnableClientState(GL_COLOR_ARRAY);\n    glEnable(GL_TEXTURE_2D);\n    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n    //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound\n\n    // Setup viewport, orthographic projection matrix\n    glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);\n    glMatrixMode(GL_PROJECTION);\n    glPushMatrix();\n    glLoadIdentity();\n    glOrtho(0.0f, io.DisplaySize.x, io.DisplaySize.y, 0.0f, -1.0f, +1.0f);\n    glMatrixMode(GL_MODELVIEW);\n    glPushMatrix();\n    glLoadIdentity();\n\n    // Render command lists\n    #define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data;\n        const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data;\n        glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + OFFSETOF(ImDrawVert, pos)));\n        glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + OFFSETOF(ImDrawVert, uv)));\n        glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + OFFSETOF(ImDrawVert, col)));\n\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);\n                glScissor((int)pcmd->ClipRect.x, (int)(fb_height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y));\n                glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer);\n            }\n            idx_buffer += pcmd->ElemCount;\n        }\n    }\n    #undef OFFSETOF\n\n    // Restore modified state\n    glDisableClientState(GL_COLOR_ARRAY);\n    glDisableClientState(GL_TEXTURE_COORD_ARRAY);\n    glDisableClientState(GL_VERTEX_ARRAY);\n    glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture);\n    glMatrixMode(GL_MODELVIEW);\n    glPopMatrix();\n    glMatrixMode(GL_PROJECTION);\n    glPopMatrix();\n    glPopAttrib();\n    glPolygonMode(GL_FRONT, last_polygon_mode[0]); glPolygonMode(GL_BACK, last_polygon_mode[1]);\n    glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);\n    glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);\n}\n\nstatic const char* ImGui_ImplSdl_GetClipboardText(void*)\n{\n    return SDL_GetClipboardText();\n}\n\nstatic void ImGui_ImplSdl_SetClipboardText(void*, const char* text)\n{\n    SDL_SetClipboardText(text);\n}\n\n// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\nbool ImGui_ImplSdlGL2_ProcessEvent(SDL_Event* event)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    switch (event->type)\n    {\n    case SDL_MOUSEWHEEL:\n        {\n            if (event->wheel.y > 0)\n                g_MouseWheel = 1;\n            if (event->wheel.y < 0)\n                g_MouseWheel = -1;\n            return true;\n        }\n    case SDL_MOUSEBUTTONDOWN:\n        {\n            if (event->button.button == SDL_BUTTON_LEFT) g_MousePressed[0] = true;\n            if (event->button.button == SDL_BUTTON_RIGHT) g_MousePressed[1] = true;\n            if (event->button.button == SDL_BUTTON_MIDDLE) g_MousePressed[2] = true;\n            return true;\n        }\n    case SDL_TEXTINPUT:\n        {\n            io.AddInputCharactersUTF8(event->text.text);\n            return true;\n        }\n    case SDL_KEYDOWN:\n    case SDL_KEYUP:\n        {\n            int key = event->key.keysym.sym & ~SDLK_SCANCODE_MASK;\n            io.KeysDown[key] = (event->type == SDL_KEYDOWN);\n            io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);\n            io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);\n            io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);\n            io.KeySuper = ((SDL_GetModState() & KMOD_GUI) != 0);\n            return true;\n        }\n    }\n    return false;\n}\n\nbool ImGui_ImplSdlGL2_CreateDeviceObjects()\n{\n    // Build texture atlas\n    ImGuiIO& io = ImGui::GetIO();\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height);\n\n    // Upload texture to graphics system\n    GLint last_texture;\n    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    glGenTextures(1, &g_FontTexture);\n    glBindTexture(GL_TEXTURE_2D, g_FontTexture);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels);\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;\n\n    // Restore state\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n\n    return true;\n}\n\nvoid    ImGui_ImplSdlGL2_InvalidateDeviceObjects()\n{\n    if (g_FontTexture)\n    {\n        glDeleteTextures(1, &g_FontTexture);\n        ImGui::GetIO().Fonts->TexID = 0;\n        g_FontTexture = 0;\n    }\n}\n\nbool    ImGui_ImplSdlGL2_Init(SDL_Window* window)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = SDLK_TAB;                     // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.\n    io.KeyMap[ImGuiKey_LeftArrow] = SDL_SCANCODE_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = SDL_SCANCODE_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = SDL_SCANCODE_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = SDL_SCANCODE_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = SDL_SCANCODE_PAGEUP;\n    io.KeyMap[ImGuiKey_PageDown] = SDL_SCANCODE_PAGEDOWN;\n    io.KeyMap[ImGuiKey_Home] = SDL_SCANCODE_HOME;\n    io.KeyMap[ImGuiKey_End] = SDL_SCANCODE_END;\n    io.KeyMap[ImGuiKey_Delete] = SDLK_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = SDLK_BACKSPACE;\n    io.KeyMap[ImGuiKey_Enter] = SDLK_RETURN;\n    io.KeyMap[ImGuiKey_Escape] = SDLK_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = SDLK_a;\n    io.KeyMap[ImGuiKey_C] = SDLK_c;\n    io.KeyMap[ImGuiKey_V] = SDLK_v;\n    io.KeyMap[ImGuiKey_X] = SDLK_x;\n    io.KeyMap[ImGuiKey_Y] = SDLK_y;\n    io.KeyMap[ImGuiKey_Z] = SDLK_z;\n\n    io.RenderDrawListsFn = ImGui_ImplSdl_RenderDrawLists;   // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.SetClipboardTextFn = ImGui_ImplSdl_SetClipboardText;\n    io.GetClipboardTextFn = ImGui_ImplSdl_GetClipboardText;\n    io.ClipboardUserData = NULL;\n\n#ifdef _WIN32\n    SDL_SysWMinfo wmInfo;\n    SDL_VERSION(&wmInfo.version);\n    SDL_GetWindowWMInfo(window, &wmInfo);\n    io.ImeWindowHandle = wmInfo.info.win.window;\n#else\n    (void)window;\n#endif\n\n    return true;\n}\n\nvoid ImGui_ImplSdlGL2_Shutdown()\n{\n    ImGui_ImplSdlGL2_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n}\n\nvoid ImGui_ImplSdlGL2_NewFrame(SDL_Window *window)\n{\n    if (!g_FontTexture)\n        ImGui_ImplSdlGL2_CreateDeviceObjects();\n\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    int w, h;\n    int display_w, display_h;\n    SDL_GetWindowSize(window, &w, &h);\n    SDL_GL_GetDrawableSize(window, &display_w, &display_h);\n    io.DisplaySize = ImVec2((float)w, (float)h);\n    io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);\n\n    // Setup time step\n    Uint32\ttime = SDL_GetTicks();\n    double current_time = time / 1000.0;\n    io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);\n    g_Time = current_time;\n\n    // Setup inputs\n    // (we already got mouse wheel, keyboard keys & characters from SDL_PollEvent())\n    int mx, my;\n    Uint32 mouseMask = SDL_GetMouseState(&mx, &my);\n    if (SDL_GetWindowFlags(window) & SDL_WINDOW_MOUSE_FOCUS)\n        io.MousePos = ImVec2((float)mx, (float)my);   // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)\n    else\n        io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX);\n\n    io.MouseDown[0] = g_MousePressed[0] || (mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;\t\t// If a mouse press event came, always pass it as \"mouse held this frame\", so we don't miss click-release events that are shorter than 1 frame.\n    io.MouseDown[1] = g_MousePressed[1] || (mouseMask & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0;\n    io.MouseDown[2] = g_MousePressed[2] || (mouseMask & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0;\n    g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false;\n\n    io.MouseWheel = g_MouseWheel;\n    g_MouseWheel = 0.0f;\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    SDL_ShowCursor(io.MouseDrawCursor ? 0 : 1);\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl2_example/imgui_impl_sdl.h",
    "content": "// ImGui SDL2 binding with OpenGL (legacy, fixed pipeline)\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n\n// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**\n// **Prefer using the code in the sdl_opengl3_example/ folder**\n// See imgui_impl_sdl.cpp for details.\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\nstruct SDL_Window;\ntypedef union SDL_Event SDL_Event;\n\nIMGUI_API bool        ImGui_ImplSdlGL2_Init(SDL_Window* window);\nIMGUI_API void        ImGui_ImplSdlGL2_Shutdown();\nIMGUI_API void        ImGui_ImplSdlGL2_NewFrame(SDL_Window* window);\nIMGUI_API bool        ImGui_ImplSdlGL2_ProcessEvent(SDL_Event* event);\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_ImplSdlGL2_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_ImplSdlGL2_CreateDeviceObjects();\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl2_example/main.cpp",
    "content": "// ImGui - standalone example application for SDL2 + OpenGL\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n\n// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**\n// **Prefer using the code in the sdl_opengl3_example/ folder**\n// See imgui_impl_sdl.cpp for details.\n\n#include <imgui.h>\n#include \"imgui_impl_sdl.h\"\n#include <stdio.h>\n#include <SDL.h>\n#include <SDL_opengl.h>\n\nint main(int, char**)\n{\n    // Setup SDL\n    if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)\n    {\n        printf(\"Error: %s\\n\", SDL_GetError());\n        return -1;\n    }\n\n    // Setup window\n    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);\n    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);\n    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);\n    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);\n    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);\n    SDL_DisplayMode current;\n    SDL_GetCurrentDisplayMode(0, &current);\n    SDL_Window *window = SDL_CreateWindow(\"ImGui SDL2+OpenGL example\", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);\n    SDL_GLContext glcontext = SDL_GL_CreateContext(window);\n\n    // Setup ImGui binding\n    ImGui_ImplSdlGL2_Init(window);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    bool done = false;\n    while (!done)\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        SDL_Event event;\n        while (SDL_PollEvent(&event))\n        {\n            ImGui_ImplSdlGL2_ProcessEvent(&event);\n            if (event.type == SDL_QUIT)\n                done = true;\n        }\n        ImGui_ImplSdlGL2_NewFrame(window);\n\n        // 1. Show a simple window\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        glViewport(0, 0, (int)ImGui::GetIO().DisplaySize.x, (int)ImGui::GetIO().DisplaySize.y);\n        glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);\n        glClear(GL_COLOR_BUFFER_BIT);\n        //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound\n        ImGui::Render();\n        SDL_GL_SwapWindow(window);\n    }\n\n    // Cleanup\n    ImGui_ImplSdlGL2_Shutdown();\n    SDL_GL_DeleteContext(glcontext);\n    SDL_DestroyWindow(window);\n    SDL_Quit();\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl3_example/Makefile",
    "content": "#\n# Cross Platform Makefile\n# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X\n#\n#\n# You will need SDL2 (http://www.libsdl.org)\n#\n#   apt-get install libsdl2-dev  # Linux\n#   brew install sdl2            # Mac OS X\n#   pacman -S mingw-w64-i686-SDL # MSYS2\n#\n\n#CXX = g++\n\nEXE = sdl_opengl3_example\nOBJS = main.o imgui_impl_sdl_gl3.o\nOBJS += ../../imgui.o ../../imgui_demo.o ../../imgui_draw.o\nOBJS += ../libs/gl3w/GL/gl3w.o\n\nUNAME_S := $(shell uname -s)\n\n\nifeq ($(UNAME_S), Linux) #LINUX\n\tECHO_MESSAGE = \"Linux\"\n\tLIBS = -lGL -ldl `sdl2-config --libs`\n\n\tCXXFLAGS = -I../../ -I../libs/gl3w `sdl2-config --cflags`\n\tCXXFLAGS += -Wall -Wformat\n\tCFLAGS = $(CXXFLAGS)\nendif\n\nifeq ($(UNAME_S), Darwin) #APPLE\n\tECHO_MESSAGE = \"Mac OS X\"\n\tLIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs`\n\n\tCXXFLAGS = -I../../ -I../libs/gl3w -I/usr/local/include `sdl2-config --cflags`\n\tCXXFLAGS += -Wall -Wformat\n\tCFLAGS = $(CXXFLAGS)\nendif\n\nifeq ($(findstring MINGW,$(UNAME_S)),MINGW)\n   ECHO_MESSAGE = \"Windows\"\n   LIBS = -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2`\n\n   CXXFLAGS = -I../../ -I../libs/gl3w `pkg-config --cflags sdl2`\n   CXXFLAGS += -Wall -Wformat\n   CFLAGS = $(CXXFLAGS)\nendif\n\n\n.cpp.o:\n\t$(CXX) $(CXXFLAGS) -c -o $@ $<\n\nall: $(EXE)\n\t@echo Build complete for $(ECHO_MESSAGE)\n\n$(EXE): $(OBJS)\n\t$(CXX) -o $(EXE) $(OBJS) $(CXXFLAGS) $(LIBS)\n\nclean:\n\trm $(EXE) $(OBJS)\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl3_example/README.md",
    "content": "\n# How to Build\n\n- On Windows with Visual Studio's CLI\n\n```\nset SDL2DIR=path_to_your_sdl2_folder\ncl /Zi /MD /I ..\\.. /I ..\\libs\\gl3w /I %SDL2DIR%\\include main.cpp imgui_impl_sdl_gl3.cpp ..\\..\\imgui*.cpp ..\\libs\\gl3w\\GL\\gl3w.c /link /libpath:%SDL2DIR%\\lib\\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console\n```\n\n- On Linux and similar Unixes\n\n```\nc++ `sdl2-config --cflags` -I ../.. -I ../libs/gl3w main.cpp imgui_impl_sdl_gl3.cpp ../../imgui*.cpp ../libs/gl3w/GL/gl3w.c `sdl2-config --libs` -lGL -ldl -o sdl2example\n```\n\n- On Mac OS X\n\n```\nbrew install sdl2\nc++ `sdl2-config --cflags` -I ../.. -I ../libs/gl3w main.cpp imgui_impl_sdl_gl3.cpp ../../imgui*.cpp ../libs/gl3w/GL/gl3w.c `sdl2-config --libs` -framework OpenGl -framework CoreFoundation -o sdl2example\n```\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl3_example/build_win32.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I ..\\libs\\gl3w /I %SDL_DIR%\\include main.cpp imgui_impl_sdl_gl3.cpp ..\\..\\imgui*.cpp ..\\libs\\gl3w\\GL\\gl3w.c /FeDebug/sdl_opengl3_example.exe /FoDebug/ /link /libpath:%SDL_DIR%\\lib\\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl3_example/imgui_impl_sdl_gl3.cpp",
    "content": "// ImGui SDL2 binding with OpenGL3\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n// (GL3W is a helper library to access OpenGL functions since there is no standard header to access modern OpenGL functions easily. Alternatives are GLEW, Glad, etc.)\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n#include \"imgui.h\"\n#include \"imgui_impl_sdl_gl3.h\"\n\n// SDL,GL3W\n#include <SDL.h>\n#include <SDL_syswm.h>\n#include <GL/gl3w.h>    // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you.\n\n// Data\nstatic double       g_Time = 0.0f;\nstatic bool         g_MousePressed[3] = { false, false, false };\nstatic float        g_MouseWheel = 0.0f;\nstatic GLuint       g_FontTexture = 0;\nstatic int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0;\nstatic int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;\nstatic int          g_AttribLocationPosition = 0, g_AttribLocationUV = 0, g_AttribLocationColor = 0;\nstatic unsigned int g_VboHandle = 0, g_VaoHandle = 0, g_ElementsHandle = 0;\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\n// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly, in order to be able to run within any OpenGL engine that doesn't do so. \n// If text or lines are blurry when integrating ImGui in your engine: in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)\nvoid ImGui_ImplSdlGL3_RenderDrawLists(ImDrawData* draw_data)\n{\n    // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)\n    ImGuiIO& io = ImGui::GetIO();\n    int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);\n    int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);\n    if (fb_width == 0 || fb_height == 0)\n        return;\n    draw_data->ScaleClipRects(io.DisplayFramebufferScale);\n\n    // Backup GL state\n    GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture);\n    glActiveTexture(GL_TEXTURE0);\n    GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);\n    GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    GLint last_sampler; glGetIntegerv(GL_SAMPLER_BINDING, &last_sampler);\n    GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);\n    GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);\n    GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);\n    GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);\n    GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);\n    GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);\n    GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);\n    GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb);\n    GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha);\n    GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha);\n    GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb);\n    GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha);\n    GLboolean last_enable_blend = glIsEnabled(GL_BLEND);\n    GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);\n    GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);\n    GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);\n\n    // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill\n    glEnable(GL_BLEND);\n    glBlendEquation(GL_FUNC_ADD);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n    glDisable(GL_CULL_FACE);\n    glDisable(GL_DEPTH_TEST);\n    glEnable(GL_SCISSOR_TEST);\n    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n\n    // Setup viewport, orthographic projection matrix\n    glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);\n    const float ortho_projection[4][4] =\n    {\n        { 2.0f/io.DisplaySize.x, 0.0f,                   0.0f, 0.0f },\n        { 0.0f,                  2.0f/-io.DisplaySize.y, 0.0f, 0.0f },\n        { 0.0f,                  0.0f,                  -1.0f, 0.0f },\n        {-1.0f,                  1.0f,                   0.0f, 1.0f },\n    };\n    glUseProgram(g_ShaderHandle);\n    glUniform1i(g_AttribLocationTex, 0);\n    glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);\n    glBindVertexArray(g_VaoHandle);\n    glBindSampler(0, 0); // Rely on combined texture/sampler state.\n\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        const ImDrawIdx* idx_buffer_offset = 0;\n\n        glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);\n        glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert), (const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW);\n\n        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle);\n        glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx), (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW);\n\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);\n                glScissor((int)pcmd->ClipRect.x, (int)(fb_height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y));\n                glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);\n            }\n            idx_buffer_offset += pcmd->ElemCount;\n        }\n    }\n\n    // Restore modified GL state\n    glUseProgram(last_program);\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n    glBindSampler(0, last_sampler);\n    glActiveTexture(last_active_texture);\n    glBindVertexArray(last_vertex_array);\n    glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);\n    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);\n    glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);\n    glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);\n    if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);\n    if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);\n    if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);\n    if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);\n    glPolygonMode(GL_FRONT_AND_BACK, last_polygon_mode[0]);\n    glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);\n    glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);\n}\n\nstatic const char* ImGui_ImplSdlGL3_GetClipboardText(void*)\n{\n    return SDL_GetClipboardText();\n}\n\nstatic void ImGui_ImplSdlGL3_SetClipboardText(void*, const char* text)\n{\n    SDL_SetClipboardText(text);\n}\n\n// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\nbool ImGui_ImplSdlGL3_ProcessEvent(SDL_Event* event)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    switch (event->type)\n    {\n    case SDL_MOUSEWHEEL:\n        {\n            if (event->wheel.y > 0)\n                g_MouseWheel = 1;\n            if (event->wheel.y < 0)\n                g_MouseWheel = -1;\n            return true;\n        }\n    case SDL_MOUSEBUTTONDOWN:\n        {\n            if (event->button.button == SDL_BUTTON_LEFT) g_MousePressed[0] = true;\n            if (event->button.button == SDL_BUTTON_RIGHT) g_MousePressed[1] = true;\n            if (event->button.button == SDL_BUTTON_MIDDLE) g_MousePressed[2] = true;\n            return true;\n        }\n    case SDL_TEXTINPUT:\n        {\n            io.AddInputCharactersUTF8(event->text.text);\n            return true;\n        }\n    case SDL_KEYDOWN:\n    case SDL_KEYUP:\n        {\n            int key = event->key.keysym.sym & ~SDLK_SCANCODE_MASK;\n            io.KeysDown[key] = (event->type == SDL_KEYDOWN);\n            io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);\n            io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);\n            io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);\n            io.KeySuper = ((SDL_GetModState() & KMOD_GUI) != 0);\n            return true;\n        }\n    }\n    return false;\n}\n\nvoid ImGui_ImplSdlGL3_CreateFontsTexture()\n{\n    // Build texture atlas\n    ImGuiIO& io = ImGui::GetIO();\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);   // Load as RGBA 32-bits for OpenGL3 demo because it is more likely to be compatible with user's existing shader.\n\n    // Upload texture to graphics system\n    GLint last_texture;\n    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    glGenTextures(1, &g_FontTexture);\n    glBindTexture(GL_TEXTURE_2D, g_FontTexture);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;\n\n    // Restore state\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n}\n\nbool ImGui_ImplSdlGL3_CreateDeviceObjects()\n{\n    // Backup GL state\n    GLint last_texture, last_array_buffer, last_vertex_array;\n    glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);\n    glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);\n    glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);\n\n    const GLchar *vertex_shader =\n        \"#version 330\\n\"\n        \"uniform mat4 ProjMtx;\\n\"\n        \"in vec2 Position;\\n\"\n        \"in vec2 UV;\\n\"\n        \"in vec4 Color;\\n\"\n        \"out vec2 Frag_UV;\\n\"\n        \"out vec4 Frag_Color;\\n\"\n        \"void main()\\n\"\n        \"{\\n\"\n        \"\tFrag_UV = UV;\\n\"\n        \"\tFrag_Color = Color;\\n\"\n        \"\tgl_Position = ProjMtx * vec4(Position.xy,0,1);\\n\"\n        \"}\\n\";\n\n    const GLchar* fragment_shader =\n        \"#version 330\\n\"\n        \"uniform sampler2D Texture;\\n\"\n        \"in vec2 Frag_UV;\\n\"\n        \"in vec4 Frag_Color;\\n\"\n        \"out vec4 Out_Color;\\n\"\n        \"void main()\\n\"\n        \"{\\n\"\n        \"\tOut_Color = Frag_Color * texture( Texture, Frag_UV.st);\\n\"\n        \"}\\n\";\n\n    g_ShaderHandle = glCreateProgram();\n    g_VertHandle = glCreateShader(GL_VERTEX_SHADER);\n    g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(g_VertHandle, 1, &vertex_shader, 0);\n    glShaderSource(g_FragHandle, 1, &fragment_shader, 0);\n    glCompileShader(g_VertHandle);\n    glCompileShader(g_FragHandle);\n    glAttachShader(g_ShaderHandle, g_VertHandle);\n    glAttachShader(g_ShaderHandle, g_FragHandle);\n    glLinkProgram(g_ShaderHandle);\n\n    g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, \"Texture\");\n    g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, \"ProjMtx\");\n    g_AttribLocationPosition = glGetAttribLocation(g_ShaderHandle, \"Position\");\n    g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, \"UV\");\n    g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, \"Color\");\n\n    glGenBuffers(1, &g_VboHandle);\n    glGenBuffers(1, &g_ElementsHandle);\n\n    glGenVertexArrays(1, &g_VaoHandle);\n    glBindVertexArray(g_VaoHandle);\n    glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);\n    glEnableVertexAttribArray(g_AttribLocationPosition);\n    glEnableVertexAttribArray(g_AttribLocationUV);\n    glEnableVertexAttribArray(g_AttribLocationColor);\n\n#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))\n    glVertexAttribPointer(g_AttribLocationPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, pos));\n    glVertexAttribPointer(g_AttribLocationUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, uv));\n    glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, col));\n#undef OFFSETOF\n\n    ImGui_ImplSdlGL3_CreateFontsTexture();\n\n    // Restore modified GL state\n    glBindTexture(GL_TEXTURE_2D, last_texture);\n    glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);\n    glBindVertexArray(last_vertex_array);\n\n    return true;\n}\n\nvoid    ImGui_ImplSdlGL3_InvalidateDeviceObjects()\n{\n    if (g_VaoHandle) glDeleteVertexArrays(1, &g_VaoHandle);\n    if (g_VboHandle) glDeleteBuffers(1, &g_VboHandle);\n    if (g_ElementsHandle) glDeleteBuffers(1, &g_ElementsHandle);\n    g_VaoHandle = g_VboHandle = g_ElementsHandle = 0;\n\n    if (g_ShaderHandle && g_VertHandle) glDetachShader(g_ShaderHandle, g_VertHandle);\n    if (g_VertHandle) glDeleteShader(g_VertHandle);\n    g_VertHandle = 0;\n\n    if (g_ShaderHandle && g_FragHandle) glDetachShader(g_ShaderHandle, g_FragHandle);\n    if (g_FragHandle) glDeleteShader(g_FragHandle);\n    g_FragHandle = 0;\n\n    if (g_ShaderHandle) glDeleteProgram(g_ShaderHandle);\n    g_ShaderHandle = 0;\n\n    if (g_FontTexture)\n    {\n        glDeleteTextures(1, &g_FontTexture);\n        ImGui::GetIO().Fonts->TexID = 0;\n        g_FontTexture = 0;\n    }\n}\n\nbool    ImGui_ImplSdlGL3_Init(SDL_Window* window)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = SDLK_TAB;                     // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.\n    io.KeyMap[ImGuiKey_LeftArrow] = SDL_SCANCODE_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = SDL_SCANCODE_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = SDL_SCANCODE_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = SDL_SCANCODE_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = SDL_SCANCODE_PAGEUP;\n    io.KeyMap[ImGuiKey_PageDown] = SDL_SCANCODE_PAGEDOWN;\n    io.KeyMap[ImGuiKey_Home] = SDL_SCANCODE_HOME;\n    io.KeyMap[ImGuiKey_End] = SDL_SCANCODE_END;\n    io.KeyMap[ImGuiKey_Delete] = SDLK_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = SDLK_BACKSPACE;\n    io.KeyMap[ImGuiKey_Enter] = SDLK_RETURN;\n    io.KeyMap[ImGuiKey_Escape] = SDLK_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = SDLK_a;\n    io.KeyMap[ImGuiKey_C] = SDLK_c;\n    io.KeyMap[ImGuiKey_V] = SDLK_v;\n    io.KeyMap[ImGuiKey_X] = SDLK_x;\n    io.KeyMap[ImGuiKey_Y] = SDLK_y;\n    io.KeyMap[ImGuiKey_Z] = SDLK_z;\n\n    io.RenderDrawListsFn = ImGui_ImplSdlGL3_RenderDrawLists;   // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.SetClipboardTextFn = ImGui_ImplSdlGL3_SetClipboardText;\n    io.GetClipboardTextFn = ImGui_ImplSdlGL3_GetClipboardText;\n    io.ClipboardUserData = NULL;\n\n#ifdef _WIN32\n    SDL_SysWMinfo wmInfo;\n    SDL_VERSION(&wmInfo.version);\n    SDL_GetWindowWMInfo(window, &wmInfo);\n    io.ImeWindowHandle = wmInfo.info.win.window;\n#else\n    (void)window;\n#endif\n\n    return true;\n}\n\nvoid ImGui_ImplSdlGL3_Shutdown()\n{\n    ImGui_ImplSdlGL3_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n}\n\nvoid ImGui_ImplSdlGL3_NewFrame(SDL_Window* window)\n{\n    if (!g_FontTexture)\n        ImGui_ImplSdlGL3_CreateDeviceObjects();\n\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    int w, h;\n    int display_w, display_h;\n    SDL_GetWindowSize(window, &w, &h);\n    SDL_GL_GetDrawableSize(window, &display_w, &display_h);\n    io.DisplaySize = ImVec2((float)w, (float)h);\n    io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);\n\n    // Setup time step\n    Uint32\ttime = SDL_GetTicks();\n    double current_time = time / 1000.0;\n    io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f / 60.0f);\n    g_Time = current_time;\n\n    // Setup inputs\n    // (we already got mouse wheel, keyboard keys & characters from SDL_PollEvent())\n    int mx, my;\n    Uint32 mouseMask = SDL_GetMouseState(&mx, &my);\n    if (SDL_GetWindowFlags(window) & SDL_WINDOW_MOUSE_FOCUS)\n        io.MousePos = ImVec2((float)mx, (float)my);   // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)\n    else\n        io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);\n\n    io.MouseDown[0] = g_MousePressed[0] || (mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;\t\t// If a mouse press event came, always pass it as \"mouse held this frame\", so we don't miss click-release events that are shorter than 1 frame.\n    io.MouseDown[1] = g_MousePressed[1] || (mouseMask & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0;\n    io.MouseDown[2] = g_MousePressed[2] || (mouseMask & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0;\n    g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false;\n\n    io.MouseWheel = g_MouseWheel;\n    g_MouseWheel = 0.0f;\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    SDL_ShowCursor(io.MouseDrawCursor ? 0 : 1);\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl3_example/imgui_impl_sdl_gl3.h",
    "content": "// ImGui SDL2 binding with OpenGL3\n// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.\n// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n// (GL3W is a helper library to access OpenGL functions since there is no standard header to access modern OpenGL functions easily. Alternatives are GLEW, Glad, etc.)\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\nstruct SDL_Window;\ntypedef union SDL_Event SDL_Event;\n\nIMGUI_API bool        ImGui_ImplSdlGL3_Init(SDL_Window* window);\nIMGUI_API void        ImGui_ImplSdlGL3_Shutdown();\nIMGUI_API void        ImGui_ImplSdlGL3_NewFrame(SDL_Window* window);\nIMGUI_API bool        ImGui_ImplSdlGL3_ProcessEvent(SDL_Event* event);\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_ImplSdlGL3_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_ImplSdlGL3_CreateDeviceObjects();\n"
  },
  {
    "path": "external/imgui/examples/sdl_opengl3_example/main.cpp",
    "content": "// ImGui - standalone example application for SDL2 + OpenGL\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)\n// (GL3W is a helper library to access OpenGL functions since there is no standard header to access modern OpenGL functions easily. Alternatives are GLEW, Glad, etc.)\n\n#include <imgui.h>\n#include \"imgui_impl_sdl_gl3.h\"\n#include <stdio.h>\n#include <GL/gl3w.h>    // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you.\n#include <SDL.h>\n\nint main(int, char**)\n{\n    // Setup SDL\n    if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0)\n    {\n        printf(\"Error: %s\\n\", SDL_GetError());\n        return -1;\n    }\n\n    // Setup window\n    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);\n    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);\n    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);\n    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);\n    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);\n    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);\n    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);\n    SDL_DisplayMode current;\n    SDL_GetCurrentDisplayMode(0, &current);\n    SDL_Window *window = SDL_CreateWindow(\"ImGui SDL2+OpenGL3 example\", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);\n    SDL_GLContext glcontext = SDL_GL_CreateContext(window);\n    gl3wInit();\n\n    // Setup ImGui binding\n    ImGui_ImplSdlGL3_Init(window);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // Main loop\n    bool done = false;\n    while (!done)\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        SDL_Event event;\n        while (SDL_PollEvent(&event))\n        {\n            ImGui_ImplSdlGL3_ProcessEvent(&event);\n            if (event.type == SDL_QUIT)\n                done = true;\n        }\n        ImGui_ImplSdlGL3_NewFrame(window);\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        // Rendering\n        glViewport(0, 0, (int)ImGui::GetIO().DisplaySize.x, (int)ImGui::GetIO().DisplaySize.y);\n        glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);\n        glClear(GL_COLOR_BUFFER_BIT);\n        ImGui::Render();\n        SDL_GL_SwapWindow(window);\n    }\n\n    // Cleanup\n    ImGui_ImplSdlGL3_Shutdown();\n    SDL_GL_DeleteContext(glcontext);\n    SDL_DestroyWindow(window);\n    SDL_Quit();\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8)\nproject(ImGuiGLFWVulkanExample C CXX)\n\nif(NOT CMAKE_BUILD_TYPE)\n  set(CMAKE_BUILD_TYPE Debug CACHE STRING \"\" FORCE)\nendif()\n\nset (CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -DVK_PROTOTYPES\")\nset (CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -DVK_PROTOTYPES\")\n\n# GLFW\nset(GLFW_DIR ../../../glfw) # Set this to point to an up-to-date GLFW repo\noption(GLFW_BUILD_EXAMPLES \"Build the GLFW example programs\" OFF)\noption(GLFW_BUILD_TESTS \"Build the GLFW test programs\" OFF)\noption(GLFW_BUILD_DOCS \"Build the GLFW documentation\" OFF)\noption(GLFW_INSTALL \"Generate installation target\" OFF)\noption(GLFW_DOCUMENT_INTERNALS \"Include internals in documentation\" OFF)\nadd_subdirectory(${GLFW_DIR} binary_dir EXCLUDE_FROM_ALL)\ninclude_directories(${GLFW_DIR}/include)\n\n# ImGui\nset(IMGUI_DIR ../../)\ninclude_directories(${IMGUI_DIR})\n\n# Libraries\nfind_library(VULKAN_LIBRARY\n  NAMES vulkan vulkan-1)\nset(LIBRARIES \"glfw;${VULKAN_LIBRARY}\")\n\n# Use vulkan headers from glfw:\ninclude_directories(${GLFW_DIR}/deps)\n\nfile(GLOB sources *.cpp)\n\nadd_executable(vulkan_example ${sources} ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_demo.cpp)\ntarget_link_libraries(vulkan_example ${LIBRARIES})\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/build_win32.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.\n\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I ..\\libs\\glfw\\include /I %VULKAN_SDK%\\include *.cpp ..\\..\\*.cpp /FeDebug/vulkan_example.exe /FoDebug/ /link /LIBPATH:..\\libs\\glfw\\lib-vc2010-32 /libpath:%VULKAN_SDK%\\lib32 glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib\n\nmkdir Release\ncl /nologo /Zi /MD /Ox /Oi /I ..\\.. /I ..\\libs\\glfw\\include /I %VULKAN_SDK%\\include *.cpp ..\\..\\*.cpp /FeRelease/vulkan_example.exe /FoRelease/ /link /LIBPATH:..\\libs\\glfw\\lib-vc2010-32 /libpath:%VULKAN_SDK%\\lib32 glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/build_win64.bat",
    "content": "@REM Build for Visual Studio compiler. Run your copy of amd64/vcvars32.bat to setup 64-bit command-line compiler.\n\nmkdir Debug\ncl /nologo /Zi /MD /I ..\\.. /I ..\\libs\\glfw\\include /I %VULKAN_SDK%\\include *.cpp ..\\..\\*.cpp /FeDebug/vulkan_example.exe /FoDebug/ /link /LIBPATH:..\\libs\\glfw\\lib-vc2010-64 /libpath:%VULKAN_SDK%\\lib glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib\n\nmkdir Release\ncl /nologo /Zi /MD /Ox /Oi /I ..\\.. /I ..\\libs\\glfw\\include /I %VULKAN_SDK%\\include *.cpp ..\\..\\*.cpp /FeRelease/vulkan_example.exe /FoRelease/ /link /LIBPATH:..\\libs\\glfw\\lib-vc2010-64 /libpath:%VULKAN_SDK%\\lib glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/gen_spv.sh",
    "content": "#!/bin/bash\nglslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag\nglslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/glsl_shader.frag",
    "content": "#version 450 core\nlayout(location = 0) out vec4 fColor;\n\nlayout(set=0, binding=0) uniform sampler2D sTexture;\n\nlayout(location = 0) in struct{\n    vec4 Color;\n    vec2 UV;\n} In;\n\nvoid main()\n{\n    fColor = In.Color * texture(sTexture, In.UV.st);\n}\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/glsl_shader.frag.u32",
    "content": "\t// Overload400-PrecQual.2000 12-Apr-2017\n\t0x07230203,0x00010000,0x00080001,0x0000001e,0x00000000,0x00020011,0x00000001,0x0006000b,\n\t0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,\n\t0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000d,0x00030010,\n\t0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,\n\t0x00000000,0x00040005,0x00000009,0x6c6f4366,0x0000726f,0x00030005,0x0000000b,0x00000000,\n\t0x00050006,0x0000000b,0x00000000,0x6f6c6f43,0x00000072,0x00040006,0x0000000b,0x00000001,\n\t0x00005655,0x00030005,0x0000000d,0x00006e49,0x00050005,0x00000016,0x78655473,0x65727574,\n\t0x00000000,0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047,0x0000000d,0x0000001e,\n\t0x00000000,0x00040047,0x00000016,0x00000022,0x00000000,0x00040047,0x00000016,0x00000021,\n\t0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,\n\t0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,\n\t0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040017,0x0000000a,0x00000006,\n\t0x00000002,0x0004001e,0x0000000b,0x00000007,0x0000000a,0x00040020,0x0000000c,0x00000001,\n\t0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040015,0x0000000e,0x00000020,\n\t0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x00040020,0x00000010,0x00000001,\n\t0x00000007,0x00090019,0x00000013,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000,\n\t0x00000001,0x00000000,0x0003001b,0x00000014,0x00000013,0x00040020,0x00000015,0x00000000,\n\t0x00000014,0x0004003b,0x00000015,0x00000016,0x00000000,0x0004002b,0x0000000e,0x00000018,\n\t0x00000001,0x00040020,0x00000019,0x00000001,0x0000000a,0x00050036,0x00000002,0x00000004,\n\t0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x00000010,0x00000011,0x0000000d,\n\t0x0000000f,0x0004003d,0x00000007,0x00000012,0x00000011,0x0004003d,0x00000014,0x00000017,\n\t0x00000016,0x00050041,0x00000019,0x0000001a,0x0000000d,0x00000018,0x0004003d,0x0000000a,\n\t0x0000001b,0x0000001a,0x00050057,0x00000007,0x0000001c,0x00000017,0x0000001b,0x00050085,\n\t0x00000007,0x0000001d,0x00000012,0x0000001c,0x0003003e,0x00000009,0x0000001d,0x000100fd,\n\t0x00010038\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/glsl_shader.vert",
    "content": "#version 450 core\nlayout(location = 0) in vec2 aPos;\nlayout(location = 1) in vec2 aUV;\nlayout(location = 2) in vec4 aColor;\n\nlayout(push_constant) uniform uPushConstant{\n    vec2 uScale;\n    vec2 uTranslate;\n} pc;\n\nout gl_PerVertex{\n    vec4 gl_Position;\n};\n\nlayout(location = 0) out struct{\n    vec4 Color;\n    vec2 UV;\n} Out;\n\nvoid main()\n{\n    Out.Color = aColor;\n    Out.UV = aUV;\n    gl_Position = vec4(aPos*pc.uScale+pc.uTranslate, 0, 1);\n}\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/glsl_shader.vert.u32",
    "content": "\t// Overload400-PrecQual.2000 12-Apr-2017\n\t0x07230203,0x00010000,0x00080001,0x0000002e,0x00000000,0x00020011,0x00000001,0x0006000b,\n\t0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,\n\t0x000a000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x00000015,\n\t0x0000001b,0x0000001c,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,\n\t0x00000000,0x00030005,0x00000009,0x00000000,0x00050006,0x00000009,0x00000000,0x6f6c6f43,\n\t0x00000072,0x00040006,0x00000009,0x00000001,0x00005655,0x00030005,0x0000000b,0x0074754f,\n\t0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00060005,\n\t0x00000019,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x00000019,0x00000000,\n\t0x505f6c67,0x7469736f,0x006e6f69,0x00030005,0x0000001b,0x00000000,0x00040005,0x0000001c,\n\t0x736f5061,0x00000000,0x00060005,0x0000001e,0x73755075,0x6e6f4368,0x6e617473,0x00000074,\n\t0x00050006,0x0000001e,0x00000000,0x61635375,0x0000656c,0x00060006,0x0000001e,0x00000001,\n\t0x61725475,0x616c736e,0x00006574,0x00030005,0x00000020,0x00006370,0x00040047,0x0000000b,\n\t0x0000001e,0x00000000,0x00040047,0x0000000f,0x0000001e,0x00000002,0x00040047,0x00000015,\n\t0x0000001e,0x00000001,0x00050048,0x00000019,0x00000000,0x0000000b,0x00000000,0x00030047,\n\t0x00000019,0x00000002,0x00040047,0x0000001c,0x0000001e,0x00000000,0x00050048,0x0000001e,\n\t0x00000000,0x00000023,0x00000000,0x00050048,0x0000001e,0x00000001,0x00000023,0x00000008,\n\t0x00030047,0x0000001e,0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,\n\t0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040017,\n\t0x00000008,0x00000006,0x00000002,0x0004001e,0x00000009,0x00000007,0x00000008,0x00040020,\n\t0x0000000a,0x00000003,0x00000009,0x0004003b,0x0000000a,0x0000000b,0x00000003,0x00040015,\n\t0x0000000c,0x00000020,0x00000001,0x0004002b,0x0000000c,0x0000000d,0x00000000,0x00040020,\n\t0x0000000e,0x00000001,0x00000007,0x0004003b,0x0000000e,0x0000000f,0x00000001,0x00040020,\n\t0x00000011,0x00000003,0x00000007,0x0004002b,0x0000000c,0x00000013,0x00000001,0x00040020,\n\t0x00000014,0x00000001,0x00000008,0x0004003b,0x00000014,0x00000015,0x00000001,0x00040020,\n\t0x00000017,0x00000003,0x00000008,0x0003001e,0x00000019,0x00000007,0x00040020,0x0000001a,\n\t0x00000003,0x00000019,0x0004003b,0x0000001a,0x0000001b,0x00000003,0x0004003b,0x00000014,\n\t0x0000001c,0x00000001,0x0004001e,0x0000001e,0x00000008,0x00000008,0x00040020,0x0000001f,\n\t0x00000009,0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000009,0x00040020,0x00000021,\n\t0x00000009,0x00000008,0x0004002b,0x00000006,0x00000028,0x00000000,0x0004002b,0x00000006,\n\t0x00000029,0x3f800000,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,\n\t0x00000005,0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011,0x00000012,\n\t0x0000000b,0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008,0x00000016,\n\t0x00000015,0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e,0x00000018,\n\t0x00000016,0x0004003d,0x00000008,0x0000001d,0x0000001c,0x00050041,0x00000021,0x00000022,\n\t0x00000020,0x0000000d,0x0004003d,0x00000008,0x00000023,0x00000022,0x00050085,0x00000008,\n\t0x00000024,0x0000001d,0x00000023,0x00050041,0x00000021,0x00000025,0x00000020,0x00000013,\n\t0x0004003d,0x00000008,0x00000026,0x00000025,0x00050081,0x00000008,0x00000027,0x00000024,\n\t0x00000026,0x00050051,0x00000006,0x0000002a,0x00000027,0x00000000,0x00050051,0x00000006,\n\t0x0000002b,0x00000027,0x00000001,0x00070050,0x00000007,0x0000002c,0x0000002a,0x0000002b,\n\t0x00000028,0x00000029,0x00050041,0x00000011,0x0000002d,0x0000001b,0x0000000d,0x0003003e,\n\t0x0000002d,0x0000002c,0x000100fd,0x00010038\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/imgui_impl_glfw_vulkan.cpp",
    "content": "// ImGui GLFW binding with Vulkan + shaders\n// FIXME: Changes of ImTextureID aren't supported by this binding! Please, someone add it!\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 5 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXX_CreateFontsTexture(), ImGui_ImplXXXX_NewFrame(), ImGui_ImplXXXX_Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\n#include <imgui.h>\n\n// GLFW\n#define GLFW_INCLUDE_NONE\n#define GLFW_INCLUDE_VULKAN\n#include <GLFW/glfw3.h>\n#ifdef _WIN32\n#undef APIENTRY\n#define GLFW_EXPOSE_NATIVE_WIN32\n#define GLFW_EXPOSE_NATIVE_WGL\n#include <GLFW/glfw3native.h>\n#endif\n\n#include \"imgui_impl_glfw_vulkan.h\"\n\n// GLFW Data\nstatic GLFWwindow*  g_Window = NULL;\nstatic double       g_Time = 0.0f;\nstatic bool         g_MousePressed[3] = { false, false, false };\nstatic float        g_MouseWheel = 0.0f;\n\n// Vulkan Data\nstatic VkAllocationCallbacks* g_Allocator = NULL;\nstatic VkPhysicalDevice       g_Gpu = VK_NULL_HANDLE;\nstatic VkDevice               g_Device = VK_NULL_HANDLE;\nstatic VkRenderPass           g_RenderPass = VK_NULL_HANDLE;\nstatic VkPipelineCache        g_PipelineCache = VK_NULL_HANDLE;\nstatic VkDescriptorPool       g_DescriptorPool = VK_NULL_HANDLE;\nstatic void (*g_CheckVkResult)(VkResult err) = NULL;\n\nstatic VkCommandBuffer        g_CommandBuffer = VK_NULL_HANDLE;\nstatic size_t                 g_BufferMemoryAlignment = 256;\nstatic VkPipelineCreateFlags  g_PipelineCreateFlags = 0;\nstatic int                    g_FrameIndex = 0;\n\nstatic VkDescriptorSetLayout  g_DescriptorSetLayout = VK_NULL_HANDLE;\nstatic VkPipelineLayout       g_PipelineLayout = VK_NULL_HANDLE;\nstatic VkDescriptorSet        g_DescriptorSet = VK_NULL_HANDLE;\nstatic VkPipeline             g_Pipeline = VK_NULL_HANDLE;\n\nstatic VkSampler              g_FontSampler = VK_NULL_HANDLE;\nstatic VkDeviceMemory         g_FontMemory = VK_NULL_HANDLE;\nstatic VkImage                g_FontImage = VK_NULL_HANDLE;\nstatic VkImageView            g_FontView = VK_NULL_HANDLE;\n\nstatic VkDeviceMemory         g_VertexBufferMemory[IMGUI_VK_QUEUED_FRAMES] = {};\nstatic VkDeviceMemory         g_IndexBufferMemory[IMGUI_VK_QUEUED_FRAMES] = {};\nstatic size_t                 g_VertexBufferSize[IMGUI_VK_QUEUED_FRAMES] = {};\nstatic size_t                 g_IndexBufferSize[IMGUI_VK_QUEUED_FRAMES] = {};\nstatic VkBuffer               g_VertexBuffer[IMGUI_VK_QUEUED_FRAMES] = {};\nstatic VkBuffer               g_IndexBuffer[IMGUI_VK_QUEUED_FRAMES] = {};\n\nstatic VkDeviceMemory         g_UploadBufferMemory = VK_NULL_HANDLE;\nstatic VkBuffer               g_UploadBuffer = VK_NULL_HANDLE;\n\nstatic uint32_t __glsl_shader_vert_spv[] =\n{\n    0x07230203,0x00010000,0x00080001,0x0000002e,0x00000000,0x00020011,0x00000001,0x0006000b,\n    0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,\n    0x000a000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x00000015,\n    0x0000001b,0x0000001c,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,\n    0x00000000,0x00030005,0x00000009,0x00000000,0x00050006,0x00000009,0x00000000,0x6f6c6f43,\n    0x00000072,0x00040006,0x00000009,0x00000001,0x00005655,0x00030005,0x0000000b,0x0074754f,\n    0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00060005,\n    0x00000019,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x00000019,0x00000000,\n    0x505f6c67,0x7469736f,0x006e6f69,0x00030005,0x0000001b,0x00000000,0x00040005,0x0000001c,\n    0x736f5061,0x00000000,0x00060005,0x0000001e,0x73755075,0x6e6f4368,0x6e617473,0x00000074,\n    0x00050006,0x0000001e,0x00000000,0x61635375,0x0000656c,0x00060006,0x0000001e,0x00000001,\n    0x61725475,0x616c736e,0x00006574,0x00030005,0x00000020,0x00006370,0x00040047,0x0000000b,\n    0x0000001e,0x00000000,0x00040047,0x0000000f,0x0000001e,0x00000002,0x00040047,0x00000015,\n    0x0000001e,0x00000001,0x00050048,0x00000019,0x00000000,0x0000000b,0x00000000,0x00030047,\n    0x00000019,0x00000002,0x00040047,0x0000001c,0x0000001e,0x00000000,0x00050048,0x0000001e,\n    0x00000000,0x00000023,0x00000000,0x00050048,0x0000001e,0x00000001,0x00000023,0x00000008,\n    0x00030047,0x0000001e,0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,\n    0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040017,\n    0x00000008,0x00000006,0x00000002,0x0004001e,0x00000009,0x00000007,0x00000008,0x00040020,\n    0x0000000a,0x00000003,0x00000009,0x0004003b,0x0000000a,0x0000000b,0x00000003,0x00040015,\n    0x0000000c,0x00000020,0x00000001,0x0004002b,0x0000000c,0x0000000d,0x00000000,0x00040020,\n    0x0000000e,0x00000001,0x00000007,0x0004003b,0x0000000e,0x0000000f,0x00000001,0x00040020,\n    0x00000011,0x00000003,0x00000007,0x0004002b,0x0000000c,0x00000013,0x00000001,0x00040020,\n    0x00000014,0x00000001,0x00000008,0x0004003b,0x00000014,0x00000015,0x00000001,0x00040020,\n    0x00000017,0x00000003,0x00000008,0x0003001e,0x00000019,0x00000007,0x00040020,0x0000001a,\n    0x00000003,0x00000019,0x0004003b,0x0000001a,0x0000001b,0x00000003,0x0004003b,0x00000014,\n    0x0000001c,0x00000001,0x0004001e,0x0000001e,0x00000008,0x00000008,0x00040020,0x0000001f,\n    0x00000009,0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000009,0x00040020,0x00000021,\n    0x00000009,0x00000008,0x0004002b,0x00000006,0x00000028,0x00000000,0x0004002b,0x00000006,\n    0x00000029,0x3f800000,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,\n    0x00000005,0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011,0x00000012,\n    0x0000000b,0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008,0x00000016,\n    0x00000015,0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e,0x00000018,\n    0x00000016,0x0004003d,0x00000008,0x0000001d,0x0000001c,0x00050041,0x00000021,0x00000022,\n    0x00000020,0x0000000d,0x0004003d,0x00000008,0x00000023,0x00000022,0x00050085,0x00000008,\n    0x00000024,0x0000001d,0x00000023,0x00050041,0x00000021,0x00000025,0x00000020,0x00000013,\n    0x0004003d,0x00000008,0x00000026,0x00000025,0x00050081,0x00000008,0x00000027,0x00000024,\n    0x00000026,0x00050051,0x00000006,0x0000002a,0x00000027,0x00000000,0x00050051,0x00000006,\n    0x0000002b,0x00000027,0x00000001,0x00070050,0x00000007,0x0000002c,0x0000002a,0x0000002b,\n    0x00000028,0x00000029,0x00050041,0x00000011,0x0000002d,0x0000001b,0x0000000d,0x0003003e,\n    0x0000002d,0x0000002c,0x000100fd,0x00010038\n};\n\nstatic uint32_t __glsl_shader_frag_spv[] =\n{\n    0x07230203,0x00010000,0x00080001,0x0000001e,0x00000000,0x00020011,0x00000001,0x0006000b,\n    0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,\n    0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000d,0x00030010,\n    0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,\n    0x00000000,0x00040005,0x00000009,0x6c6f4366,0x0000726f,0x00030005,0x0000000b,0x00000000,\n    0x00050006,0x0000000b,0x00000000,0x6f6c6f43,0x00000072,0x00040006,0x0000000b,0x00000001,\n    0x00005655,0x00030005,0x0000000d,0x00006e49,0x00050005,0x00000016,0x78655473,0x65727574,\n    0x00000000,0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047,0x0000000d,0x0000001e,\n    0x00000000,0x00040047,0x00000016,0x00000022,0x00000000,0x00040047,0x00000016,0x00000021,\n    0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,\n    0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,\n    0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040017,0x0000000a,0x00000006,\n    0x00000002,0x0004001e,0x0000000b,0x00000007,0x0000000a,0x00040020,0x0000000c,0x00000001,\n    0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040015,0x0000000e,0x00000020,\n    0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x00040020,0x00000010,0x00000001,\n    0x00000007,0x00090019,0x00000013,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000,\n    0x00000001,0x00000000,0x0003001b,0x00000014,0x00000013,0x00040020,0x00000015,0x00000000,\n    0x00000014,0x0004003b,0x00000015,0x00000016,0x00000000,0x0004002b,0x0000000e,0x00000018,\n    0x00000001,0x00040020,0x00000019,0x00000001,0x0000000a,0x00050036,0x00000002,0x00000004,\n    0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x00000010,0x00000011,0x0000000d,\n    0x0000000f,0x0004003d,0x00000007,0x00000012,0x00000011,0x0004003d,0x00000014,0x00000017,\n    0x00000016,0x00050041,0x00000019,0x0000001a,0x0000000d,0x00000018,0x0004003d,0x0000000a,\n    0x0000001b,0x0000001a,0x00050057,0x00000007,0x0000001c,0x00000017,0x0000001b,0x00050085,\n    0x00000007,0x0000001d,0x00000012,0x0000001c,0x0003003e,0x00000009,0x0000001d,0x000100fd,\n    0x00010038\n};\n\nstatic uint32_t ImGui_ImplGlfwVulkan_MemoryType(VkMemoryPropertyFlags properties, uint32_t type_bits)\n{\n    VkPhysicalDeviceMemoryProperties prop;\n    vkGetPhysicalDeviceMemoryProperties(g_Gpu, &prop);\n    for (uint32_t i = 0; i < prop.memoryTypeCount; i++)\n        if ((prop.memoryTypes[i].propertyFlags & properties) == properties && type_bits & (1<<i))\n            return i;\n    return 0xffffffff; // Unable to find memoryType\n}\n\nstatic void ImGui_ImplGlfwVulkan_VkResult(VkResult err)\n{\n    if (g_CheckVkResult)\n        g_CheckVkResult(err);\n}\n\n// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)\nvoid ImGui_ImplGlfwVulkan_RenderDrawLists(ImDrawData* draw_data)\n{\n    VkResult err;\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Create the Vertex Buffer:\n    size_t vertex_size = draw_data->TotalVtxCount * sizeof(ImDrawVert);\n    if (!g_VertexBuffer[g_FrameIndex] || g_VertexBufferSize[g_FrameIndex] < vertex_size)\n    {\n        if (g_VertexBuffer[g_FrameIndex])\n            vkDestroyBuffer(g_Device, g_VertexBuffer[g_FrameIndex], g_Allocator);\n        if (g_VertexBufferMemory[g_FrameIndex])\n            vkFreeMemory(g_Device, g_VertexBufferMemory[g_FrameIndex], g_Allocator);\n        size_t vertex_buffer_size = ((vertex_size-1) / g_BufferMemoryAlignment+1) * g_BufferMemoryAlignment;\n        VkBufferCreateInfo buffer_info = {};\n        buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n        buffer_info.size = vertex_buffer_size;\n        buffer_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;\n        buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n        err = vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &g_VertexBuffer[g_FrameIndex]);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        VkMemoryRequirements req;\n        vkGetBufferMemoryRequirements(g_Device, g_VertexBuffer[g_FrameIndex], &req);\n        g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment;\n        VkMemoryAllocateInfo alloc_info = {};\n        alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n        alloc_info.allocationSize = req.size;\n        alloc_info.memoryTypeIndex = ImGui_ImplGlfwVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);\n        err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_VertexBufferMemory[g_FrameIndex]);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        err = vkBindBufferMemory(g_Device, g_VertexBuffer[g_FrameIndex], g_VertexBufferMemory[g_FrameIndex], 0);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        g_VertexBufferSize[g_FrameIndex] = vertex_buffer_size;\n    }\n\n    // Create the Index Buffer:\n    size_t index_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx);\n    if (!g_IndexBuffer[g_FrameIndex] || g_IndexBufferSize[g_FrameIndex] < index_size)\n    {\n        if (g_IndexBuffer[g_FrameIndex])\n            vkDestroyBuffer(g_Device, g_IndexBuffer[g_FrameIndex], g_Allocator);\n        if (g_IndexBufferMemory[g_FrameIndex])\n            vkFreeMemory(g_Device, g_IndexBufferMemory[g_FrameIndex], g_Allocator);\n        size_t index_buffer_size = ((index_size-1) / g_BufferMemoryAlignment+1) * g_BufferMemoryAlignment;\n        VkBufferCreateInfo buffer_info = {};\n        buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n        buffer_info.size = index_buffer_size;\n        buffer_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;\n        buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n        err = vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &g_IndexBuffer[g_FrameIndex]);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        VkMemoryRequirements req;\n        vkGetBufferMemoryRequirements(g_Device, g_IndexBuffer[g_FrameIndex], &req);\n        g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment;\n        VkMemoryAllocateInfo alloc_info = {};\n        alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n        alloc_info.allocationSize = req.size;\n        alloc_info.memoryTypeIndex = ImGui_ImplGlfwVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);\n        err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_IndexBufferMemory[g_FrameIndex]);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        err = vkBindBufferMemory(g_Device, g_IndexBuffer[g_FrameIndex], g_IndexBufferMemory[g_FrameIndex], 0);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        g_IndexBufferSize[g_FrameIndex] = index_buffer_size;\n    }\n\n    // Upload Vertex and index Data:\n    {\n        ImDrawVert* vtx_dst;\n        ImDrawIdx* idx_dst;\n        err = vkMapMemory(g_Device, g_VertexBufferMemory[g_FrameIndex], 0, vertex_size, 0, (void**)(&vtx_dst));\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        err = vkMapMemory(g_Device, g_IndexBufferMemory[g_FrameIndex], 0, index_size, 0, (void**)(&idx_dst));\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        for (int n = 0; n < draw_data->CmdListsCount; n++)\n        {\n            const ImDrawList* cmd_list = draw_data->CmdLists[n];\n            memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));\n            memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));\n            vtx_dst += cmd_list->VtxBuffer.Size;\n            idx_dst += cmd_list->IdxBuffer.Size;\n        }\n        VkMappedMemoryRange range[2] = {};\n        range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;\n        range[0].memory = g_VertexBufferMemory[g_FrameIndex];\n        range[0].size = VK_WHOLE_SIZE;\n        range[1].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;\n        range[1].memory = g_IndexBufferMemory[g_FrameIndex];\n        range[1].size = VK_WHOLE_SIZE;\n        err = vkFlushMappedMemoryRanges(g_Device, 2, range);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        vkUnmapMemory(g_Device, g_VertexBufferMemory[g_FrameIndex]);\n        vkUnmapMemory(g_Device, g_IndexBufferMemory[g_FrameIndex]);\n    }\n\n    // Bind pipeline and descriptor sets:\n    {\n        vkCmdBindPipeline(g_CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_Pipeline);\n        VkDescriptorSet desc_set[1] = {g_DescriptorSet};\n        vkCmdBindDescriptorSets(g_CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_PipelineLayout, 0, 1, desc_set, 0, NULL);\n    }\n\n    // Bind Vertex And Index Buffer:\n    {\n        VkBuffer vertex_buffers[1] = {g_VertexBuffer[g_FrameIndex]};\n        VkDeviceSize vertex_offset[1] = {0};\n        vkCmdBindVertexBuffers(g_CommandBuffer, 0, 1, vertex_buffers, vertex_offset);\n        vkCmdBindIndexBuffer(g_CommandBuffer, g_IndexBuffer[g_FrameIndex], 0, VK_INDEX_TYPE_UINT16);\n    }\n\n    // Setup viewport:\n    {\n        VkViewport viewport;\n        viewport.x = 0;\n        viewport.y = 0;\n        viewport.width = ImGui::GetIO().DisplaySize.x;\n        viewport.height = ImGui::GetIO().DisplaySize.y;\n        viewport.minDepth = 0.0f;\n        viewport.maxDepth = 1.0f;\n        vkCmdSetViewport(g_CommandBuffer, 0, 1, &viewport);\n    }\n\n    // Setup scale and translation:\n    {\n        float scale[2];\n        scale[0] = 2.0f/io.DisplaySize.x;\n        scale[1] = 2.0f/io.DisplaySize.y;\n        float translate[2];\n        translate[0] = -1.0f;\n        translate[1] = -1.0f;\n        vkCmdPushConstants(g_CommandBuffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale);\n        vkCmdPushConstants(g_CommandBuffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate);\n    }\n\n    // Render the command lists:\n    int vtx_offset = 0;\n    int idx_offset = 0;\n    for (int n = 0; n < draw_data->CmdListsCount; n++)\n    {\n        const ImDrawList* cmd_list = draw_data->CmdLists[n];\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n            if (pcmd->UserCallback)\n            {\n                pcmd->UserCallback(cmd_list, pcmd);\n            }\n            else\n            {\n                VkRect2D scissor;\n                scissor.offset.x = (int32_t)(pcmd->ClipRect.x) > 0 ? (int32_t)(pcmd->ClipRect.x) : 0;\n                scissor.offset.y = (int32_t)(pcmd->ClipRect.y) > 0 ? (int32_t)(pcmd->ClipRect.y) : 0;\n                scissor.extent.width = (uint32_t)(pcmd->ClipRect.z - pcmd->ClipRect.x);\n                scissor.extent.height = (uint32_t)(pcmd->ClipRect.w - pcmd->ClipRect.y + 1); // FIXME: Why +1 here?\n                vkCmdSetScissor(g_CommandBuffer, 0, 1, &scissor);\n                vkCmdDrawIndexed(g_CommandBuffer, pcmd->ElemCount, 1, idx_offset, vtx_offset, 0);\n            }\n            idx_offset += pcmd->ElemCount;\n        }\n        vtx_offset += cmd_list->VtxBuffer.Size;\n    }\n}\n\nstatic const char* ImGui_ImplGlfwVulkan_GetClipboardText(void* user_data)\n{\n    return glfwGetClipboardString((GLFWwindow*)user_data);\n}\n\nstatic void ImGui_ImplGlfwVulkan_SetClipboardText(void* user_data, const char* text)\n{\n    glfwSetClipboardString((GLFWwindow*)user_data, text);\n}\n\nvoid ImGui_ImplGlfwVulkan_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)\n{\n    if (action == GLFW_PRESS && button >= 0 && button < 3)\n        g_MousePressed[button] = true;\n}\n\nvoid ImGui_ImplGlfwVulkan_ScrollCallback(GLFWwindow*, double /*xoffset*/, double yoffset)\n{\n    g_MouseWheel += (float)yoffset; // Use fractional mouse wheel.\n}\n\nvoid ImGui_ImplGlfwVulkan_KeyCallback(GLFWwindow*, int key, int, int action, int mods)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    if (action == GLFW_PRESS)\n        io.KeysDown[key] = true;\n    if (action == GLFW_RELEASE)\n        io.KeysDown[key] = false;\n\n    (void)mods; // Modifiers are not reliable across systems\n    io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL];\n    io.KeyShift = io.KeysDown[GLFW_KEY_LEFT_SHIFT] || io.KeysDown[GLFW_KEY_RIGHT_SHIFT];\n    io.KeyAlt = io.KeysDown[GLFW_KEY_LEFT_ALT] || io.KeysDown[GLFW_KEY_RIGHT_ALT];\n    io.KeySuper = io.KeysDown[GLFW_KEY_LEFT_SUPER] || io.KeysDown[GLFW_KEY_RIGHT_SUPER];\n}\n\nvoid ImGui_ImplGlfwVulkan_CharCallback(GLFWwindow*, unsigned int c)\n{\n    ImGuiIO& io = ImGui::GetIO();\n    if (c > 0 && c < 0x10000)\n        io.AddInputCharacter((unsigned short)c);\n}\n\nbool ImGui_ImplGlfwVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)\n{\n    ImGuiIO& io = ImGui::GetIO();\n\n    unsigned char* pixels;\n    int width, height;\n    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);\n    size_t upload_size = width*height*4*sizeof(char);\n\n    VkResult err;\n\n    // Create the Image:\n    {\n        VkImageCreateInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n        info.imageType = VK_IMAGE_TYPE_2D;\n        info.format = VK_FORMAT_R8G8B8A8_UNORM;\n        info.extent.width = width;\n        info.extent.height = height;\n        info.extent.depth = 1;\n        info.mipLevels = 1;\n        info.arrayLayers = 1;\n        info.samples = VK_SAMPLE_COUNT_1_BIT;\n        info.tiling = VK_IMAGE_TILING_OPTIMAL;\n        info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;\n        info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n        info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n        err = vkCreateImage(g_Device, &info, g_Allocator, &g_FontImage);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        VkMemoryRequirements req;\n        vkGetImageMemoryRequirements(g_Device, g_FontImage, &req);\n        VkMemoryAllocateInfo alloc_info = {};\n        alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n        alloc_info.allocationSize = req.size;\n        alloc_info.memoryTypeIndex = ImGui_ImplGlfwVulkan_MemoryType(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, req.memoryTypeBits);\n        err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_FontMemory);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        err = vkBindImageMemory(g_Device, g_FontImage, g_FontMemory, 0);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n    }\n\n    // Create the Image View:\n    {\n        VkImageViewCreateInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n        info.image = g_FontImage;\n        info.viewType = VK_IMAGE_VIEW_TYPE_2D;\n        info.format = VK_FORMAT_R8G8B8A8_UNORM;\n        info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n        info.subresourceRange.levelCount = 1;\n        info.subresourceRange.layerCount = 1;\n        err = vkCreateImageView(g_Device, &info, g_Allocator, &g_FontView);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n    }\n\n    // Update the Descriptor Set:\n    {\n        VkDescriptorImageInfo desc_image[1] = {};\n        desc_image[0].sampler = g_FontSampler;\n        desc_image[0].imageView = g_FontView;\n        desc_image[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n        VkWriteDescriptorSet write_desc[1] = {};\n        write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n        write_desc[0].dstSet = g_DescriptorSet;\n        write_desc[0].descriptorCount = 1;\n        write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n        write_desc[0].pImageInfo = desc_image;\n        vkUpdateDescriptorSets(g_Device, 1, write_desc, 0, NULL);\n    }\n\n    // Create the Upload Buffer:\n    {\n        VkBufferCreateInfo buffer_info = {};\n        buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n        buffer_info.size = upload_size;\n        buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n        buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n        err = vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &g_UploadBuffer);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        VkMemoryRequirements req;\n        vkGetBufferMemoryRequirements(g_Device, g_UploadBuffer, &req);\n        g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment;\n        VkMemoryAllocateInfo alloc_info = {};\n        alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n        alloc_info.allocationSize = req.size;\n        alloc_info.memoryTypeIndex = ImGui_ImplGlfwVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);\n        err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_UploadBufferMemory);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        err = vkBindBufferMemory(g_Device, g_UploadBuffer, g_UploadBufferMemory, 0);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n    }\n\n    // Upload to Buffer:\n    {\n        char* map = NULL;\n        err = vkMapMemory(g_Device, g_UploadBufferMemory, 0, upload_size, 0, (void**)(&map));\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        memcpy(map, pixels, upload_size);\n        VkMappedMemoryRange range[1] = {};\n        range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;\n        range[0].memory = g_UploadBufferMemory;\n        range[0].size = upload_size;\n        err = vkFlushMappedMemoryRanges(g_Device, 1, range);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        vkUnmapMemory(g_Device, g_UploadBufferMemory);\n    }\n    // Copy to Image:\n    {\n        VkImageMemoryBarrier copy_barrier[1] = {};\n        copy_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n        copy_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n        copy_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n        copy_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n        copy_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n        copy_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n        copy_barrier[0].image = g_FontImage;\n        copy_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n        copy_barrier[0].subresourceRange.levelCount = 1;\n        copy_barrier[0].subresourceRange.layerCount = 1;\n        vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 0, NULL, 1, copy_barrier);\n\n        VkBufferImageCopy region = {};\n        region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n        region.imageSubresource.layerCount = 1;\n        region.imageExtent.width = width;\n        region.imageExtent.height = height;\n        region.imageExtent.depth = 1;\n        vkCmdCopyBufferToImage(command_buffer, g_UploadBuffer, g_FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);\n\n        VkImageMemoryBarrier use_barrier[1] = {};\n        use_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n        use_barrier[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n        use_barrier[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;\n        use_barrier[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n        use_barrier[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n        use_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n        use_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n        use_barrier[0].image = g_FontImage;\n        use_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n        use_barrier[0].subresourceRange.levelCount = 1;\n        use_barrier[0].subresourceRange.layerCount = 1;\n        vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, NULL, 0, NULL, 1, use_barrier);\n    }\n\n    // Store our identifier\n    io.Fonts->TexID = (void *)(intptr_t)g_FontImage;\n\n    return true;\n}\n\nbool ImGui_ImplGlfwVulkan_CreateDeviceObjects()\n{\n    VkResult err;\n    VkShaderModule vert_module;\n    VkShaderModule frag_module;\n\n    // Create The Shader Modules:\n    {\n        VkShaderModuleCreateInfo vert_info = {};\n        vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n        vert_info.codeSize = sizeof(__glsl_shader_vert_spv);\n        vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv;\n        err = vkCreateShaderModule(g_Device, &vert_info, g_Allocator, &vert_module);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n        VkShaderModuleCreateInfo frag_info = {};\n        frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n        frag_info.codeSize = sizeof(__glsl_shader_frag_spv);\n        frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv;\n        err = vkCreateShaderModule(g_Device, &frag_info, g_Allocator, &frag_module);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n    }\n\n    if (!g_FontSampler)\n    {\n        VkSamplerCreateInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;\n        info.magFilter = VK_FILTER_LINEAR;\n        info.minFilter = VK_FILTER_LINEAR;\n        info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;\n        info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;\n        info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;\n        info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;\n        info.minLod = -1000;\n        info.maxLod = 1000;\n        info.maxAnisotropy = 1.0f;\n        err = vkCreateSampler(g_Device, &info, g_Allocator, &g_FontSampler);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n    }\n\n    if (!g_DescriptorSetLayout)\n    {\n        VkSampler sampler[1] = {g_FontSampler};\n        VkDescriptorSetLayoutBinding binding[1] = {};\n        binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n        binding[0].descriptorCount = 1;\n        binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;\n        binding[0].pImmutableSamplers = sampler;\n        VkDescriptorSetLayoutCreateInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n        info.bindingCount = 1;\n        info.pBindings = binding;\n        err = vkCreateDescriptorSetLayout(g_Device, &info, g_Allocator, &g_DescriptorSetLayout);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n    }\n\n    // Create Descriptor Set:\n    {\n        VkDescriptorSetAllocateInfo alloc_info = {};\n        alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n        alloc_info.descriptorPool = g_DescriptorPool;\n        alloc_info.descriptorSetCount = 1;\n        alloc_info.pSetLayouts = &g_DescriptorSetLayout;\n        err = vkAllocateDescriptorSets(g_Device, &alloc_info, &g_DescriptorSet);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n    }\n\n    if (!g_PipelineLayout)\n    {\n        VkPushConstantRange push_constants[1] = {};\n        push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;\n        push_constants[0].offset = sizeof(float) * 0;\n        push_constants[0].size = sizeof(float) * 4;\n        VkDescriptorSetLayout set_layout[1] = {g_DescriptorSetLayout};\n        VkPipelineLayoutCreateInfo layout_info = {};\n        layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n        layout_info.setLayoutCount = 1;\n        layout_info.pSetLayouts = set_layout;\n        layout_info.pushConstantRangeCount = 1;\n        layout_info.pPushConstantRanges = push_constants;\n        err = vkCreatePipelineLayout(g_Device, &layout_info, g_Allocator, &g_PipelineLayout);\n        ImGui_ImplGlfwVulkan_VkResult(err);\n    }\n\n    VkPipelineShaderStageCreateInfo stage[2] = {};\n    stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n    stage[0].stage = VK_SHADER_STAGE_VERTEX_BIT;\n    stage[0].module = vert_module;\n    stage[0].pName = \"main\";\n    stage[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n    stage[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;\n    stage[1].module = frag_module;\n    stage[1].pName = \"main\";\n\n    VkVertexInputBindingDescription binding_desc[1] = {};\n    binding_desc[0].stride = sizeof(ImDrawVert);\n    binding_desc[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;\n\n    VkVertexInputAttributeDescription attribute_desc[3] = {};\n    attribute_desc[0].location = 0;\n    attribute_desc[0].binding = binding_desc[0].binding;\n    attribute_desc[0].format = VK_FORMAT_R32G32_SFLOAT;\n    attribute_desc[0].offset = (size_t)(&((ImDrawVert*)0)->pos);\n    attribute_desc[1].location = 1;\n    attribute_desc[1].binding = binding_desc[0].binding;\n    attribute_desc[1].format = VK_FORMAT_R32G32_SFLOAT;\n    attribute_desc[1].offset = (size_t)(&((ImDrawVert*)0)->uv);\n    attribute_desc[2].location = 2;\n    attribute_desc[2].binding = binding_desc[0].binding;\n    attribute_desc[2].format = VK_FORMAT_R8G8B8A8_UNORM;\n    attribute_desc[2].offset = (size_t)(&((ImDrawVert*)0)->col);\n\n    VkPipelineVertexInputStateCreateInfo vertex_info = {};\n    vertex_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n    vertex_info.vertexBindingDescriptionCount = 1;\n    vertex_info.pVertexBindingDescriptions = binding_desc;\n    vertex_info.vertexAttributeDescriptionCount = 3;\n    vertex_info.pVertexAttributeDescriptions = attribute_desc;\n\n    VkPipelineInputAssemblyStateCreateInfo ia_info = {};\n    ia_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n    ia_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;\n\n    VkPipelineViewportStateCreateInfo viewport_info = {};\n    viewport_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n    viewport_info.viewportCount = 1;\n    viewport_info.scissorCount = 1;\n\n    VkPipelineRasterizationStateCreateInfo raster_info = {};\n    raster_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n    raster_info.polygonMode = VK_POLYGON_MODE_FILL;\n    raster_info.cullMode = VK_CULL_MODE_NONE;\n    raster_info.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;\n    raster_info.lineWidth = 1.0f;\n\n    VkPipelineMultisampleStateCreateInfo ms_info = {};\n    ms_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n    ms_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;\n\n    VkPipelineColorBlendAttachmentState color_attachment[1] = {};\n    color_attachment[0].blendEnable = VK_TRUE;\n    color_attachment[0].srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;\n    color_attachment[0].dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;\n    color_attachment[0].colorBlendOp = VK_BLEND_OP_ADD;\n    color_attachment[0].srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;\n    color_attachment[0].dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;\n    color_attachment[0].alphaBlendOp = VK_BLEND_OP_ADD;\n    color_attachment[0].colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;\n\n    VkPipelineDepthStencilStateCreateInfo depth_info = {};\n    depth_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;\n\n    VkPipelineColorBlendStateCreateInfo blend_info = {};\n    blend_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n    blend_info.attachmentCount = 1;\n    blend_info.pAttachments = color_attachment;\n\n    VkDynamicState dynamic_states[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };\n    VkPipelineDynamicStateCreateInfo dynamic_state = {};\n    dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n    dynamic_state.dynamicStateCount = 2;\n    dynamic_state.pDynamicStates = dynamic_states;\n\n    VkGraphicsPipelineCreateInfo info = {};\n    info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n    info.flags = g_PipelineCreateFlags;\n    info.stageCount = 2;\n    info.pStages = stage;\n    info.pVertexInputState = &vertex_info;\n    info.pInputAssemblyState = &ia_info;\n    info.pViewportState = &viewport_info;\n    info.pRasterizationState = &raster_info;\n    info.pMultisampleState = &ms_info;\n    info.pDepthStencilState = &depth_info;\n    info.pColorBlendState = &blend_info;\n    info.pDynamicState = &dynamic_state;\n    info.layout = g_PipelineLayout;\n    info.renderPass = g_RenderPass;\n    err = vkCreateGraphicsPipelines(g_Device, g_PipelineCache, 1, &info, g_Allocator, &g_Pipeline);\n    ImGui_ImplGlfwVulkan_VkResult(err);\n\n    vkDestroyShaderModule(g_Device, vert_module, g_Allocator);\n    vkDestroyShaderModule(g_Device, frag_module, g_Allocator);\n\n    return true;\n}\n\nvoid    ImGui_ImplGlfwVulkan_InvalidateFontUploadObjects()\n{\n    if (g_UploadBuffer)\n    {\n        vkDestroyBuffer(g_Device, g_UploadBuffer, g_Allocator);\n        g_UploadBuffer = VK_NULL_HANDLE;\n    }\n    if (g_UploadBufferMemory)\n    {\n        vkFreeMemory(g_Device, g_UploadBufferMemory, g_Allocator);\n        g_UploadBufferMemory = VK_NULL_HANDLE;\n    }\n}\n\nvoid    ImGui_ImplGlfwVulkan_InvalidateDeviceObjects()\n{\n    ImGui_ImplGlfwVulkan_InvalidateFontUploadObjects();\n\n    for (int i = 0; i < IMGUI_VK_QUEUED_FRAMES; i++)\n    {\n        if (g_VertexBuffer[i])          { vkDestroyBuffer(g_Device, g_VertexBuffer[i], g_Allocator); g_VertexBuffer[i] = VK_NULL_HANDLE; }\n        if (g_VertexBufferMemory[i])    { vkFreeMemory(g_Device, g_VertexBufferMemory[i], g_Allocator); g_VertexBufferMemory[i] = VK_NULL_HANDLE; }\n        if (g_IndexBuffer[i])           { vkDestroyBuffer(g_Device, g_IndexBuffer[i], g_Allocator); g_IndexBuffer[i] = VK_NULL_HANDLE; }\n        if (g_IndexBufferMemory[i])     { vkFreeMemory(g_Device, g_IndexBufferMemory[i], g_Allocator); g_IndexBufferMemory[i] = VK_NULL_HANDLE; }\n    }\n\n    if (g_FontView)             { vkDestroyImageView(g_Device, g_FontView, g_Allocator); g_FontView = VK_NULL_HANDLE; }\n    if (g_FontImage)            { vkDestroyImage(g_Device, g_FontImage, g_Allocator); g_FontImage = VK_NULL_HANDLE; }\n    if (g_FontMemory)           { vkFreeMemory(g_Device, g_FontMemory, g_Allocator); g_FontMemory = VK_NULL_HANDLE; }\n    if (g_FontSampler)          { vkDestroySampler(g_Device, g_FontSampler, g_Allocator); g_FontSampler = VK_NULL_HANDLE; }\n    if (g_DescriptorSetLayout)  { vkDestroyDescriptorSetLayout(g_Device, g_DescriptorSetLayout, g_Allocator); g_DescriptorSetLayout = VK_NULL_HANDLE; }\n    if (g_PipelineLayout)       { vkDestroyPipelineLayout(g_Device, g_PipelineLayout, g_Allocator); g_PipelineLayout = VK_NULL_HANDLE; }\n    if (g_Pipeline)             { vkDestroyPipeline(g_Device, g_Pipeline, g_Allocator); g_Pipeline = VK_NULL_HANDLE; }\n}\n\nbool    ImGui_ImplGlfwVulkan_Init(GLFWwindow* window, bool install_callbacks, ImGui_ImplGlfwVulkan_Init_Data *init_data)\n{\n    g_Allocator = init_data->allocator;\n    g_Gpu = init_data->gpu;\n    g_Device = init_data->device;\n    g_RenderPass = init_data->render_pass;\n    g_PipelineCache = init_data->pipeline_cache;\n    g_DescriptorPool = init_data->descriptor_pool;\n    g_CheckVkResult = init_data->check_vk_result;\n\n    g_Window = window;\n\n    ImGuiIO& io = ImGui::GetIO();\n    io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB;                         // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.\n    io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;\n    io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;\n    io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;\n    io.KeyMap[ImGuiKey_DownArrow] = GLFW_KEY_DOWN;\n    io.KeyMap[ImGuiKey_PageUp] = GLFW_KEY_PAGE_UP;\n    io.KeyMap[ImGuiKey_PageDown] = GLFW_KEY_PAGE_DOWN;\n    io.KeyMap[ImGuiKey_Home] = GLFW_KEY_HOME;\n    io.KeyMap[ImGuiKey_End] = GLFW_KEY_END;\n    io.KeyMap[ImGuiKey_Delete] = GLFW_KEY_DELETE;\n    io.KeyMap[ImGuiKey_Backspace] = GLFW_KEY_BACKSPACE;\n    io.KeyMap[ImGuiKey_Enter] = GLFW_KEY_ENTER;\n    io.KeyMap[ImGuiKey_Escape] = GLFW_KEY_ESCAPE;\n    io.KeyMap[ImGuiKey_A] = GLFW_KEY_A;\n    io.KeyMap[ImGuiKey_C] = GLFW_KEY_C;\n    io.KeyMap[ImGuiKey_V] = GLFW_KEY_V;\n    io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;\n    io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;\n    io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;\n\n    io.RenderDrawListsFn = ImGui_ImplGlfwVulkan_RenderDrawLists;       // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.\n    io.SetClipboardTextFn = ImGui_ImplGlfwVulkan_SetClipboardText;\n    io.GetClipboardTextFn = ImGui_ImplGlfwVulkan_GetClipboardText;\n    io.ClipboardUserData = g_Window;\n#ifdef _WIN32\n    io.ImeWindowHandle = glfwGetWin32Window(g_Window);\n#endif\n\n    if (install_callbacks)\n    {\n        glfwSetMouseButtonCallback(window, ImGui_ImplGlfwVulkan_MouseButtonCallback);\n        glfwSetScrollCallback(window, ImGui_ImplGlfwVulkan_ScrollCallback);\n        glfwSetKeyCallback(window, ImGui_ImplGlfwVulkan_KeyCallback);\n        glfwSetCharCallback(window, ImGui_ImplGlfwVulkan_CharCallback);\n    }\n\n    ImGui_ImplGlfwVulkan_CreateDeviceObjects();\n\n    return true;\n}\n\nvoid ImGui_ImplGlfwVulkan_Shutdown()\n{\n    ImGui_ImplGlfwVulkan_InvalidateDeviceObjects();\n    ImGui::Shutdown();\n}\n\nvoid ImGui_ImplGlfwVulkan_NewFrame()\n{\n    ImGuiIO& io = ImGui::GetIO();\n\n    // Setup display size (every frame to accommodate for window resizing)\n    int w, h;\n    int display_w, display_h;\n    glfwGetWindowSize(g_Window, &w, &h);\n    glfwGetFramebufferSize(g_Window, &display_w, &display_h);\n    io.DisplaySize = ImVec2((float)w, (float)h);\n    io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);\n\n    // Setup time step\n    double current_time =  glfwGetTime();\n    io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);\n    g_Time = current_time;\n\n    // Setup inputs\n    // (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())\n    if (glfwGetWindowAttrib(g_Window, GLFW_FOCUSED))\n    {\n        double mouse_x, mouse_y;\n        glfwGetCursorPos(g_Window, &mouse_x, &mouse_y);\n        io.MousePos = ImVec2((float)mouse_x, (float)mouse_y);   // Mouse position in screen coordinates (set to -1,-1 if no mouse / on another screen, etc.)\n    }\n    else\n    {\n        io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX);\n    }\n\n    for (int i = 0; i < 3; i++)\n    {\n        io.MouseDown[i] = g_MousePressed[i] || glfwGetMouseButton(g_Window, i) != 0;    // If a mouse press event came, always pass it as \"mouse held this frame\", so we don't miss click-release events that are shorter than 1 frame.\n        g_MousePressed[i] = false;\n    }\n\n    io.MouseWheel = g_MouseWheel;\n    g_MouseWheel = 0.0f;\n\n    // Hide OS mouse cursor if ImGui is drawing it\n    glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL);\n\n    // Start the frame. This call will update the io.WantCaptureMouse, io.WantCaptureKeyboard flag that you can use to dispatch inputs (or not) to your application.\n    ImGui::NewFrame();\n}\n\nvoid ImGui_ImplGlfwVulkan_Render(VkCommandBuffer command_buffer)\n{\n    g_CommandBuffer = command_buffer;\n    ImGui::Render();\n    g_CommandBuffer = VK_NULL_HANDLE;\n    g_FrameIndex = (g_FrameIndex + 1) % IMGUI_VK_QUEUED_FRAMES;\n}\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/imgui_impl_glfw_vulkan.h",
    "content": "// ImGui GLFW binding with Vulkan + shaders\n// FIXME: Changes of ImTextureID aren't supported by this binding! Please, someone add it!\n\n// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.\n// If you use this binding you'll need to call 5 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXX_CreateFontsTexture(), ImGui_ImplXXXX_NewFrame(), ImGui_ImplXXXX_Render() and ImGui_ImplXXXX_Shutdown().\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n// https://github.com/ocornut/imgui\n\nstruct GLFWwindow;\n\n#define IMGUI_VK_QUEUED_FRAMES 2\n\nstruct ImGui_ImplGlfwVulkan_Init_Data\n{\n    VkAllocationCallbacks* allocator;\n    VkPhysicalDevice       gpu;\n    VkDevice               device;\n    VkRenderPass           render_pass;\n    VkPipelineCache        pipeline_cache;\n    VkDescriptorPool       descriptor_pool;\n    void (*check_vk_result)(VkResult err);\n};\n\nIMGUI_API bool        ImGui_ImplGlfwVulkan_Init(GLFWwindow* window, bool install_callbacks, ImGui_ImplGlfwVulkan_Init_Data *init_data);\nIMGUI_API void        ImGui_ImplGlfwVulkan_Shutdown();\nIMGUI_API void        ImGui_ImplGlfwVulkan_NewFrame();\nIMGUI_API void        ImGui_ImplGlfwVulkan_Render(VkCommandBuffer command_buffer);\n\n// Use if you want to reset your rendering device without losing ImGui state.\nIMGUI_API void        ImGui_ImplGlfwVulkan_InvalidateFontUploadObjects();\nIMGUI_API void        ImGui_ImplGlfwVulkan_InvalidateDeviceObjects();\nIMGUI_API bool        ImGui_ImplGlfwVulkan_CreateFontsTexture(VkCommandBuffer command_buffer);\nIMGUI_API bool        ImGui_ImplGlfwVulkan_CreateDeviceObjects();\n\n// GLFW callbacks (installed by default if you enable 'install_callbacks' during initialization)\n// Provided here if you want to chain callbacks.\n// You can also handle inputs yourself and use those as a reference.\nIMGUI_API void        ImGui_ImplGlfwVulkan_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);\nIMGUI_API void        ImGui_ImplGlfwVulkan_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);\nIMGUI_API void        ImGui_ImplGlfwVulkan_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);\nIMGUI_API void        ImGui_ImplGlfwVulkan_CharCallback(GLFWwindow* window, unsigned int c);\n\n"
  },
  {
    "path": "external/imgui/examples/vulkan_example/main.cpp",
    "content": "// ImGui - standalone example application for Glfw + Vulkan, using programmable pipeline\n// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.\n\n#include <imgui.h>\n\n#include <stdio.h>          // printf, fprintf\n#include <stdlib.h>         // abort\n#define GLFW_INCLUDE_NONE\n#define GLFW_INCLUDE_VULKAN\n#include <GLFW/glfw3.h>\n\n#include \"imgui_impl_glfw_vulkan.h\"\n\n#define IMGUI_MAX_POSSIBLE_BACK_BUFFERS 16\n#define IMGUI_UNLIMITED_FRAME_RATE\n//#ifdef _DEBUG\n//#define IMGUI_VULKAN_DEBUG_REPORT\n//#endif\n\nstatic VkAllocationCallbacks*   g_Allocator = NULL;\nstatic VkInstance               g_Instance = VK_NULL_HANDLE;\nstatic VkSurfaceKHR             g_Surface = VK_NULL_HANDLE;\nstatic VkPhysicalDevice         g_Gpu = VK_NULL_HANDLE;\nstatic VkDevice                 g_Device = VK_NULL_HANDLE;\nstatic VkSwapchainKHR           g_Swapchain = VK_NULL_HANDLE;\nstatic VkRenderPass             g_RenderPass = VK_NULL_HANDLE;\nstatic uint32_t                 g_QueueFamily = 0;\nstatic VkQueue                  g_Queue = VK_NULL_HANDLE;\nstatic VkDebugReportCallbackEXT g_Debug_Report = VK_NULL_HANDLE;\n\nstatic VkSurfaceFormatKHR       g_SurfaceFormat;\nstatic VkImageSubresourceRange  g_ImageRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};\nstatic VkPresentModeKHR         g_PresentMode;\n\nstatic VkPipelineCache          g_PipelineCache = VK_NULL_HANDLE;\nstatic VkDescriptorPool         g_DescriptorPool = VK_NULL_HANDLE;\n\nstatic int                      fb_width, fb_height;\nstatic uint32_t                 g_BackbufferIndices[IMGUI_VK_QUEUED_FRAMES];    // keep track of recently rendered swapchain frame indices\nstatic uint32_t                 g_BackBufferCount = 0;\nstatic VkImage                  g_BackBuffer[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {};\nstatic VkImageView              g_BackBufferView[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {};\nstatic VkFramebuffer            g_Framebuffer[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {};\n\nstatic uint32_t                 g_FrameIndex = 0;\nstatic VkCommandPool            g_CommandPool[IMGUI_VK_QUEUED_FRAMES];\nstatic VkCommandBuffer          g_CommandBuffer[IMGUI_VK_QUEUED_FRAMES];\nstatic VkFence                  g_Fence[IMGUI_VK_QUEUED_FRAMES];\nstatic VkSemaphore              g_PresentCompleteSemaphore[IMGUI_VK_QUEUED_FRAMES];\nstatic VkSemaphore              g_RenderCompleteSemaphore[IMGUI_VK_QUEUED_FRAMES];\n\nstatic VkClearValue             g_ClearValue = {};\n\nstatic void check_vk_result(VkResult err)\n{\n    if (err == 0) return;\n    printf(\"VkResult %d\\n\", err);\n    if (err < 0)\n        abort();\n}\n\nstatic void resize_vulkan(GLFWwindow* /*window*/, int w, int h)\n{\n    VkResult err;\n    VkSwapchainKHR old_swapchain = g_Swapchain;\n    err = vkDeviceWaitIdle(g_Device);\n    check_vk_result(err);\n\n    // Destroy old Framebuffer:\n    for (uint32_t i = 0; i < g_BackBufferCount; i++)\n        if (g_BackBufferView[i])\n            vkDestroyImageView(g_Device, g_BackBufferView[i], g_Allocator);\n    for (uint32_t i = 0; i < g_BackBufferCount; i++)\n        if (g_Framebuffer[i])\n            vkDestroyFramebuffer(g_Device, g_Framebuffer[i], g_Allocator);\n    if (g_RenderPass)\n        vkDestroyRenderPass(g_Device, g_RenderPass, g_Allocator);\n\n    // Create Swapchain:\n    {\n        VkSwapchainCreateInfoKHR info = {};\n        info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;\n        info.surface = g_Surface;\n        info.imageFormat = g_SurfaceFormat.format;\n        info.imageColorSpace = g_SurfaceFormat.colorSpace;\n        info.imageArrayLayers = 1;\n        info.imageUsage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n        info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;\n        info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;\n        info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;\n        info.presentMode = g_PresentMode;\n        info.clipped = VK_TRUE;\n        info.oldSwapchain = old_swapchain;\n        VkSurfaceCapabilitiesKHR cap;\n        err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(g_Gpu, g_Surface, &cap);\n        check_vk_result(err);\n        if (cap.maxImageCount > 0)\n            info.minImageCount = (cap.minImageCount + 2 < cap.maxImageCount) ? (cap.minImageCount + 2) : cap.maxImageCount;\n        else\n            info.minImageCount = cap.minImageCount + 2;\n\n        if (cap.currentExtent.width == 0xffffffff)\n        {\n            fb_width = w;\n            fb_height = h;\n            info.imageExtent.width = fb_width;\n            info.imageExtent.height = fb_height;\n        }\n        else\n        {\n            fb_width = cap.currentExtent.width;\n            fb_height = cap.currentExtent.height;\n            info.imageExtent.width = fb_width;\n            info.imageExtent.height = fb_height;\n        }\n        err = vkCreateSwapchainKHR(g_Device, &info, g_Allocator, &g_Swapchain);\n        check_vk_result(err);\n        err = vkGetSwapchainImagesKHR(g_Device, g_Swapchain, &g_BackBufferCount, NULL);\n        check_vk_result(err);\n        err = vkGetSwapchainImagesKHR(g_Device, g_Swapchain, &g_BackBufferCount, g_BackBuffer);\n        check_vk_result(err);\n    }\n    if (old_swapchain)\n        vkDestroySwapchainKHR(g_Device, old_swapchain, g_Allocator);\n\n    // Create the Render Pass:\n    {\n        VkAttachmentDescription attachment = {};\n        attachment.format = g_SurfaceFormat.format;\n        attachment.samples = VK_SAMPLE_COUNT_1_BIT;\n        attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n        attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n        attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n        attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;\n        attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n        attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;\n        VkAttachmentReference color_attachment = {};\n        color_attachment.attachment = 0;\n        color_attachment.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n        VkSubpassDescription subpass = {};\n        subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;\n        subpass.colorAttachmentCount = 1;\n        subpass.pColorAttachments = &color_attachment;\n        VkRenderPassCreateInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n        info.attachmentCount = 1;\n        info.pAttachments = &attachment;\n        info.subpassCount = 1;\n        info.pSubpasses = &subpass;\n        err = vkCreateRenderPass(g_Device, &info, g_Allocator, &g_RenderPass);\n        check_vk_result(err);\n    }\n\n    // Create The Image Views\n    {\n        VkImageViewCreateInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n        info.viewType = VK_IMAGE_VIEW_TYPE_2D;\n        info.format = g_SurfaceFormat.format;\n        info.components.r = VK_COMPONENT_SWIZZLE_R;\n        info.components.g = VK_COMPONENT_SWIZZLE_G;\n        info.components.b = VK_COMPONENT_SWIZZLE_B;\n        info.components.a = VK_COMPONENT_SWIZZLE_A;\n        info.subresourceRange = g_ImageRange;\n        for (uint32_t i = 0; i < g_BackBufferCount; i++)\n        {\n            info.image = g_BackBuffer[i];\n            err = vkCreateImageView(g_Device, &info, g_Allocator, &g_BackBufferView[i]);\n            check_vk_result(err);\n        }\n    }\n\n    // Create Framebuffer:\n    {\n        VkImageView attachment[1];\n        VkFramebufferCreateInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n        info.renderPass = g_RenderPass;\n        info.attachmentCount = 1;\n        info.pAttachments = attachment;\n        info.width = fb_width;\n        info.height = fb_height;\n        info.layers = 1;\n        for (uint32_t i = 0; i < g_BackBufferCount; i++)\n        {\n            attachment[0] = g_BackBufferView[i];\n            err = vkCreateFramebuffer(g_Device, &info, g_Allocator, &g_Framebuffer[i]);\n            check_vk_result(err);\n        }\n    }\n}\n\n#ifdef IMGUI_VULKAN_DEBUG_REPORT\nstatic VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(\n    VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData)\n{\n    printf(\"[vulkan] ObjectType: %i\\nMessage: %s\\n\\n\", objectType, pMessage );\n    return VK_FALSE;\n}\n#endif // IMGUI_VULKAN_DEBUG_REPORT\n\nstatic void setup_vulkan(GLFWwindow* window)\n{\n    VkResult err;\n\n    // Create Vulkan Instance\n    {\n        uint32_t extensions_count;\n        const char** glfw_extensions = glfwGetRequiredInstanceExtensions(&extensions_count);\n\n        VkInstanceCreateInfo create_info = {};\n        create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;\n        create_info.enabledExtensionCount = extensions_count;\n        create_info.ppEnabledExtensionNames = glfw_extensions;\n\n#ifdef IMGUI_VULKAN_DEBUG_REPORT\n        // enabling multiple validation layers grouped as lunarg standard validation\n        const char* layers[] = {\"VK_LAYER_LUNARG_standard_validation\"};\n        create_info.enabledLayerCount = 1;\n        create_info.ppEnabledLayerNames = layers;\n\n        // need additional storage for char pointer to debug report extension\n        const char** extensions = (const char**)malloc(sizeof(const char*) * (extensions_count + 1));\n        for (size_t i = 0; i < extensions_count; i++)\n            extensions[i] = glfw_extensions[i];\n        extensions[ extensions_count ] = \"VK_EXT_debug_report\";\n        create_info.enabledExtensionCount = extensions_count+1;\n        create_info.ppEnabledExtensionNames = extensions;\n#endif // IMGUI_VULKAN_DEBUG_REPORT\n\n        err = vkCreateInstance(&create_info, g_Allocator, &g_Instance);\n        check_vk_result(err);\n\n#ifdef IMGUI_VULKAN_DEBUG_REPORT\n        free(extensions);\n\n        // create the debug report callback\n        VkDebugReportCallbackCreateInfoEXT debug_report_ci ={};\n        debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;\n        debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;\n        debug_report_ci.pfnCallback = debug_report;\n        debug_report_ci.pUserData = NULL;\n        \n        // get the proc address of the function pointer, required for used extensions\n        PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT = \n            (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, \"vkCreateDebugReportCallbackEXT\");\n\n        err = vkCreateDebugReportCallbackEXT( g_Instance, &debug_report_ci, g_Allocator, &g_Debug_Report );\n        check_vk_result(err);\n#endif // IMGUI_VULKAN_DEBUG_REPORT\n    }\n\n    // Create Window Surface\n    {\n        err = glfwCreateWindowSurface(g_Instance, window, g_Allocator, &g_Surface);\n        check_vk_result(err);\n    }\n\n    // Get GPU\n    {\n        uint32_t gpu_count;\n        err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, NULL);\n        check_vk_result(err);\n\n        VkPhysicalDevice* gpus = (VkPhysicalDevice*)malloc(sizeof(VkPhysicalDevice) * gpu_count);\n        err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus);\n        check_vk_result(err);\n\n        // If a number >1 of GPUs got reported, you should find the best fit GPU for your purpose\n        // e.g. VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU if available, or with the greatest memory available, etc.\n        // for sake of simplicity we'll just take the first one, assuming it has a graphics queue family.\n        g_Gpu = gpus[0];\n        free(gpus);\n    }\n\n    // Get queue\n    {\n        uint32_t count;\n        vkGetPhysicalDeviceQueueFamilyProperties(g_Gpu, &count, NULL);\n        VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count);\n        vkGetPhysicalDeviceQueueFamilyProperties(g_Gpu, &count, queues);\n        for (uint32_t i = 0; i < count; i++)\n        {\n            if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)\n            {\n                g_QueueFamily = i;\n                break;\n            }\n        }\n        free(queues);\n    }\n\n    // Check for WSI support\n    {\n        VkBool32 res;\n        vkGetPhysicalDeviceSurfaceSupportKHR(g_Gpu, g_QueueFamily, g_Surface, &res);\n        if (res != VK_TRUE)\n        {\n            fprintf(stderr, \"Error no WSI support on physical device 0\\n\");\n            exit(-1);\n        }\n    }\n\n    // Get Surface Format\n    {\n        // Per Spec Format and View Format are expected to be the same unless VK_IMAGE_CREATE_MUTABLE_BIT was set at image creation\n        // Assuming that the default behavior is without setting this bit, there is no need for separate Spawchain image and image view format\n        // additionally several new color spaces were introduced with Vulkan Spec v1.0.40\n        // hence we must make sure that a format with the mostly available color space, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, is found and used\n        uint32_t count;\n        vkGetPhysicalDeviceSurfaceFormatsKHR(g_Gpu, g_Surface, &count, NULL);\n        VkSurfaceFormatKHR *formats = (VkSurfaceFormatKHR*)malloc(sizeof(VkSurfaceFormatKHR) * count);\n        vkGetPhysicalDeviceSurfaceFormatsKHR(g_Gpu, g_Surface, &count, formats);\n\n        // first check if only one format, VK_FORMAT_UNDEFINED, is available, which would imply that any format is available\n        if (count == 1)\n        {\n            if( formats[0].format == VK_FORMAT_UNDEFINED )\n            {\n                g_SurfaceFormat.format = VK_FORMAT_B8G8R8A8_UNORM;\n                g_SurfaceFormat.colorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;\n            }\n            else\n            {   // no point in searching another format\n                g_SurfaceFormat = formats[0];\n            }\n        }\n        else\n        {\n            // request several formats, the first found will be used \n            VkFormat requestSurfaceImageFormat[] = {VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_R8G8B8_UNORM};\n            VkColorSpaceKHR requestSurfaceColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;\n            bool requestedFound = false;\n            for (size_t i = 0; i < sizeof(requestSurfaceImageFormat) / sizeof(requestSurfaceImageFormat[0]); i++)\n            {\n                if( requestedFound ) {\n                    break;\n                }\n                for (uint32_t j = 0; j < count; j++)\n                {\n                    if (formats[j].format == requestSurfaceImageFormat[i] && formats[j].colorSpace == requestSurfaceColorSpace)\n                    {\n                        g_SurfaceFormat = formats[j];\n                        requestedFound = true;\n                    }\n                }\n            }\n\n            // if none of the requested image formats could be found, use the first available\n            if (!requestedFound)\n                g_SurfaceFormat = formats[0];\n        }\n        free(formats);\n    }\n\n\n    // Get Present Mode\n    {\n        // Requst a certain mode and confirm that it is available. If not use VK_PRESENT_MODE_FIFO_KHR which is mandatory\n#ifdef IMGUI_UNLIMITED_FRAME_RATE\n        g_PresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR;\n#else\n        g_PresentMode = VK_PRESENT_MODE_FIFO_KHR;\n#endif\n        uint32_t count = 0;\n        vkGetPhysicalDeviceSurfacePresentModesKHR(g_Gpu, g_Surface, &count, nullptr);\n        VkPresentModeKHR* presentModes = (VkPresentModeKHR*)malloc(sizeof(VkQueueFamilyProperties) * count);\n        vkGetPhysicalDeviceSurfacePresentModesKHR(g_Gpu, g_Surface, &count, presentModes);\n        bool presentModeAvailable = false;\n        for (size_t i = 0; i < count; i++) \n        {\n            if (presentModes[i] == g_PresentMode)\n            {\n                presentModeAvailable = true;\n                break;\n            }\n        }\n        if( !presentModeAvailable )\n            g_PresentMode = VK_PRESENT_MODE_FIFO_KHR;   // always available\n    }\n\n\n    // Create Logical Device\n    {\n        int device_extension_count = 1;\n        const char* device_extensions[] = {\"VK_KHR_swapchain\"};\n        const uint32_t queue_index = 0;\n        const uint32_t queue_count = 1;\n        const float queue_priority[] = {1.0f};\n        VkDeviceQueueCreateInfo queue_info[1] = {};\n        queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;\n        queue_info[0].queueFamilyIndex = g_QueueFamily;\n        queue_info[0].queueCount = queue_count;\n        queue_info[0].pQueuePriorities = queue_priority;\n        VkDeviceCreateInfo create_info = {};\n        create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;\n        create_info.queueCreateInfoCount = sizeof(queue_info)/sizeof(queue_info[0]);\n        create_info.pQueueCreateInfos = queue_info;\n        create_info.enabledExtensionCount = device_extension_count;\n        create_info.ppEnabledExtensionNames = device_extensions;\n        err = vkCreateDevice(g_Gpu, &create_info, g_Allocator, &g_Device);\n        check_vk_result(err);\n        vkGetDeviceQueue(g_Device, g_QueueFamily, queue_index, &g_Queue);\n    }\n\n    // Create Framebuffers\n    {\n        int w, h;\n        glfwGetFramebufferSize(window, &w, &h);\n        resize_vulkan(window, w, h);\n        glfwSetFramebufferSizeCallback(window, resize_vulkan);\n    }\n\n    // Create Command Buffers\n    for (int i = 0; i < IMGUI_VK_QUEUED_FRAMES; i++)\n    {\n        {\n            VkCommandPoolCreateInfo info = {};\n            info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n            info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;\n            info.queueFamilyIndex = g_QueueFamily;\n            err = vkCreateCommandPool(g_Device, &info, g_Allocator, &g_CommandPool[i]);\n            check_vk_result(err);\n        }\n        {\n            VkCommandBufferAllocateInfo info = {};\n            info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n            info.commandPool = g_CommandPool[i];\n            info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n            info.commandBufferCount = 1;\n            err = vkAllocateCommandBuffers(g_Device, &info, &g_CommandBuffer[i]);\n            check_vk_result(err);\n        }\n        {\n            VkFenceCreateInfo info = {};\n            info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;\n            info.flags = VK_FENCE_CREATE_SIGNALED_BIT;\n            err = vkCreateFence(g_Device, &info, g_Allocator, &g_Fence[i]);\n            check_vk_result(err);\n        }\n        {\n            VkSemaphoreCreateInfo info = {};\n            info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;\n            err = vkCreateSemaphore(g_Device, &info, g_Allocator, &g_PresentCompleteSemaphore[i]);\n            check_vk_result(err);\n            err = vkCreateSemaphore(g_Device, &info, g_Allocator, &g_RenderCompleteSemaphore[i]);\n            check_vk_result(err);\n        }\n    }\n\n    // Create Descriptor Pool\n    {\n        VkDescriptorPoolSize pool_size[11] =\n        {\n            { VK_DESCRIPTOR_TYPE_SAMPLER, 1000 },\n            { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 },\n            { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 },\n            { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 },\n            { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 },\n            { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 },\n            { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 },\n            { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 },\n            { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 },\n            { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 },\n            { VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 }\n        };\n        VkDescriptorPoolCreateInfo pool_info = {};\n        pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n        pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;\n        pool_info.maxSets = 1000 * 11;\n        pool_info.poolSizeCount = 11;\n        pool_info.pPoolSizes = pool_size;\n        err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool);\n        check_vk_result(err);\n    }\n}\n\nstatic void cleanup_vulkan()\n{\n    vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator);\n    for (int i = 0; i < IMGUI_VK_QUEUED_FRAMES; i++)\n    {\n        vkDestroyFence(g_Device, g_Fence[i], g_Allocator);\n        vkFreeCommandBuffers(g_Device, g_CommandPool[i], 1, &g_CommandBuffer[i]);\n        vkDestroyCommandPool(g_Device, g_CommandPool[i], g_Allocator);\n        vkDestroySemaphore(g_Device, g_PresentCompleteSemaphore[i], g_Allocator);\n        vkDestroySemaphore(g_Device, g_RenderCompleteSemaphore[i], g_Allocator);\n    }\n    for (uint32_t i = 0; i < g_BackBufferCount; i++)\n    {\n        vkDestroyImageView(g_Device, g_BackBufferView[i], g_Allocator);\n        vkDestroyFramebuffer(g_Device, g_Framebuffer[i], g_Allocator);\n    }\n    vkDestroyRenderPass(g_Device, g_RenderPass, g_Allocator);\n    vkDestroySwapchainKHR(g_Device, g_Swapchain, g_Allocator);\n    vkDestroySurfaceKHR(g_Instance, g_Surface, g_Allocator);\n\n#ifdef IMGUI_VULKAN_DEBUG_REPORT\n    // get the proc address of the function pointer, required for used extensions\n    auto vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, \"vkDestroyDebugReportCallbackEXT\");\n    vkDestroyDebugReportCallbackEXT(g_Instance, g_Debug_Report, g_Allocator);\n#endif // IMGUI_VULKAN_DEBUG_REPORT\n\n    vkDestroyDevice(g_Device, g_Allocator);\n    vkDestroyInstance(g_Instance, g_Allocator);\n}\n\nstatic void frame_begin()\n{\n    VkResult err;\n    while (true)\n    {\n        err = vkWaitForFences(g_Device, 1, &g_Fence[g_FrameIndex], VK_TRUE, 100);\n        if (err == VK_SUCCESS) break;\n        if (err == VK_TIMEOUT) continue;\n        check_vk_result(err);\n    }\n    {\n        err = vkAcquireNextImageKHR(g_Device, g_Swapchain, UINT64_MAX, g_PresentCompleteSemaphore[g_FrameIndex], VK_NULL_HANDLE, &g_BackbufferIndices[g_FrameIndex]);\n        check_vk_result(err);\n    }\n    {\n        err = vkResetCommandPool(g_Device, g_CommandPool[g_FrameIndex], 0);\n        check_vk_result(err);\n        VkCommandBufferBeginInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n        info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n        err = vkBeginCommandBuffer(g_CommandBuffer[g_FrameIndex], &info);\n        check_vk_result(err);\n    }\n    {\n        VkRenderPassBeginInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n        info.renderPass = g_RenderPass;\n        info.framebuffer = g_Framebuffer[g_BackbufferIndices[g_FrameIndex]];\n        info.renderArea.extent.width = fb_width;\n        info.renderArea.extent.height = fb_height;\n        info.clearValueCount = 1;\n        info.pClearValues = &g_ClearValue;\n        vkCmdBeginRenderPass(g_CommandBuffer[g_FrameIndex], &info, VK_SUBPASS_CONTENTS_INLINE);\n    }\n}\n\nstatic void frame_end()\n{\n    VkResult err;\n    vkCmdEndRenderPass(g_CommandBuffer[g_FrameIndex]);\n    {\n        VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n        VkSubmitInfo info = {};\n        info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n        info.waitSemaphoreCount = 1;\n        info.pWaitSemaphores = &g_PresentCompleteSemaphore[g_FrameIndex];\n        info.pWaitDstStageMask = &wait_stage;\n        info.commandBufferCount = 1;\n        info.pCommandBuffers = &g_CommandBuffer[g_FrameIndex];\n        info.signalSemaphoreCount = 1;\n        info.pSignalSemaphores = &g_RenderCompleteSemaphore[g_FrameIndex];\n\n        err = vkEndCommandBuffer(g_CommandBuffer[g_FrameIndex]);\n        check_vk_result(err);\n        err = vkResetFences(g_Device, 1, &g_Fence[g_FrameIndex]);\n        check_vk_result(err);\n        err = vkQueueSubmit(g_Queue, 1, &info, g_Fence[g_FrameIndex]);\n        check_vk_result(err);\n    }\n}\n\nstatic void frame_present()\n{\n    VkResult err;\n    // If IMGUI_UNLIMITED_FRAME_RATE is defined we present the latest but one frame. Otherwise we present the latest rendered frame\n#ifdef IMGUI_UNLIMITED_FRAME_RATE\n    uint32_t PresentIndex = (g_FrameIndex + IMGUI_VK_QUEUED_FRAMES - 1) % IMGUI_VK_QUEUED_FRAMES;\n#else\n    uint32_t PresentIndex = g_FrameIndex;\n#endif // IMGUI_UNLIMITED_FRAME_RATE\n\n    VkSwapchainKHR swapchains[1] = {g_Swapchain};\n    uint32_t indices[1] = {g_BackbufferIndices[PresentIndex]};\n    VkPresentInfoKHR info = {};\n    info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;\n    info.waitSemaphoreCount = 1;\n    info.pWaitSemaphores = &g_RenderCompleteSemaphore[PresentIndex];\n    info.swapchainCount = 1;\n    info.pSwapchains = swapchains;\n    info.pImageIndices = indices;\n    err = vkQueuePresentKHR(g_Queue, &info);\n    check_vk_result(err);\n\n    g_FrameIndex = (g_FrameIndex + 1) % IMGUI_VK_QUEUED_FRAMES;\n}\n\nstatic void error_callback(int error, const char* description)\n{\n    fprintf(stderr, \"Error %d: %s\\n\", error, description);\n}\n\nint main(int, char**)\n{\n    // Setup window\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit())\n        return 1;\n\n    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);\n    GLFWwindow* window = glfwCreateWindow(1280, 720, \"ImGui Vulkan example\", NULL, NULL);\n\n    // Setup Vulkan\n    if (!glfwVulkanSupported())\n    {\n        printf(\"GLFW: Vulkan Not Supported\\n\");\n        return 1;\n    }\n    setup_vulkan(window);\n\n    // Setup ImGui binding\n    ImGui_ImplGlfwVulkan_Init_Data init_data = {};\n    init_data.allocator = g_Allocator;\n    init_data.gpu = g_Gpu;\n    init_data.device = g_Device;\n    init_data.render_pass = g_RenderPass;\n    init_data.pipeline_cache = g_PipelineCache;\n    init_data.descriptor_pool = g_DescriptorPool;\n    init_data.check_vk_result = check_vk_result;\n    ImGui_ImplGlfwVulkan_Init(window, true, &init_data);\n\n    // Load Fonts\n    // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. \n    // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. \n    // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).\n    // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.\n    // - Read 'extra_fonts/README.txt' for more instructions and details.\n    // - Remember that in C/C++ if you want to include a backslash \\ in a string literal you need to write a double backslash \\\\ !\n    //ImGuiIO& io = ImGui::GetIO();\n    //io.Fonts->AddFontDefault();\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Roboto-Medium.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/Cousine-Regular.ttf\", 15.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/DroidSans.ttf\", 16.0f);\n    //io.Fonts->AddFontFromFileTTF(\"../../extra_fonts/ProggyTiny.ttf\", 10.0f);\n    //ImFont* font = io.Fonts->AddFontFromFileTTF(\"c:\\\\Windows\\\\Fonts\\\\ArialUni.ttf\", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());\n    //IM_ASSERT(font != NULL);\n\n    // Upload Fonts\n    {\n        VkResult err;\n        err = vkResetCommandPool(g_Device, g_CommandPool[g_FrameIndex], 0);\n        check_vk_result(err);\n        VkCommandBufferBeginInfo begin_info = {};\n        begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n        begin_info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n        err = vkBeginCommandBuffer(g_CommandBuffer[g_FrameIndex], &begin_info);\n        check_vk_result(err);\n\n        ImGui_ImplGlfwVulkan_CreateFontsTexture(g_CommandBuffer[g_FrameIndex]);\n\n        VkSubmitInfo end_info = {};\n        end_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n        end_info.commandBufferCount = 1;\n        end_info.pCommandBuffers = &g_CommandBuffer[g_FrameIndex];\n        err = vkEndCommandBuffer(g_CommandBuffer[g_FrameIndex]);\n        check_vk_result(err);\n        err = vkQueueSubmit(g_Queue, 1, &end_info, VK_NULL_HANDLE);\n        check_vk_result(err);\n\n        err = vkDeviceWaitIdle(g_Device);\n        check_vk_result(err);\n        ImGui_ImplGlfwVulkan_InvalidateFontUploadObjects();\n    }\n\n    bool show_test_window = true;\n    bool show_another_window = false;\n    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);\n\n    // When IMGUI_UNLIMITED_FRAME_RATE is defined we render into latest image acquired from the swapchain but we display the image which was rendered before.\n    // Hence we must render once and increase the g_FrameIndex without presenting, which we do before entering the render loop.\n    // This is also the reason why frame_end() is split into frame_end() and frame_present(), the later one not being called here.\n#ifdef IMGUI_UNLIMITED_FRAME_RATE\n    ImGui_ImplGlfwVulkan_NewFrame();\n    frame_begin();\n    ImGui_ImplGlfwVulkan_Render(g_CommandBuffer[g_FrameIndex]);\n    frame_end();\n    g_FrameIndex = (g_FrameIndex + 1) % IMGUI_VK_QUEUED_FRAMES;\n#endif // IMGUI_UNLIMITED_FRAME_RATE\n\n    // Main loop\n    while (!glfwWindowShouldClose(window))\n    {\n        // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.\n        // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.\n        // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.\n        // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.\n        glfwPollEvents();\n        ImGui_ImplGlfwVulkan_NewFrame();\n\n        // 1. Show a simple window.\n        // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called \"Debug\".\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"Hello, world!\");\n            ImGui::SliderFloat(\"float\", &f, 0.0f, 1.0f);\n            ImGui::ColorEdit3(\"clear color\", (float*)&clear_color);\n            if (ImGui::Button(\"Test Window\")) show_test_window ^= 1;\n            if (ImGui::Button(\"Another Window\")) show_another_window ^= 1;\n            ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        }\n\n        // 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.\n        if (show_another_window)\n        {\n            ImGui::Begin(\"Another Window\", &show_another_window);\n            ImGui::Text(\"Hello from another window!\");\n            ImGui::End();\n        }\n\n        // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow().\n        if (show_test_window)\n        {\n            ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);\n            ImGui::ShowTestWindow(&show_test_window);\n        }\n\n        g_ClearValue.color.float32[0] = clear_color.x;\n        g_ClearValue.color.float32[1] = clear_color.y;\n        g_ClearValue.color.float32[2] = clear_color.z;\n        g_ClearValue.color.float32[3] = clear_color.w;\n\n        frame_begin();\n        ImGui_ImplGlfwVulkan_Render(g_CommandBuffer[g_FrameIndex]);\n        frame_end();\n        frame_present();\n    }\n\n    // Cleanup\n    VkResult err = vkDeviceWaitIdle(g_Device);\n    check_vk_result(err);\n    ImGui_ImplGlfwVulkan_Shutdown();\n    cleanup_vulkan();\n    glfwTerminate();\n\n    return 0;\n}\n"
  },
  {
    "path": "external/imgui/extra_fonts/README.txt",
    "content": "\n The code in imgui.cpp embeds a copy of 'ProggyClean.ttf' (by Tristan Grimmer) that is used by default.\n We embed the font in source code so you can use Dear ImGui without any file system access.\n You may also load external .TTF/.OTF files. \n The files in this folder are suggested fonts, provided as a convenience.\n (Note: .OTF support in stb_truetype.h currently doesn't appear to load every font)\n\n Fonts are rasterized in a single texture at the time of calling either of io.Fonts.GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build().\n\n---------------------------------\n USING ICONS\n---------------------------------\n\n Using an icon font (such as FontAwesome: http://fontawesome.io) is an easy and practical way to use icons in your ImGui application.\n A common pattern is to merge the icon font within your main font, so you can refer to the icons directly from your strings without having to change fonts back and forth.\n To refer to the icon from your C++ code, you can use headers files created by Juliette Foucaut, at https://github.com/juliettef/IconFontCppHeaders\n See Links below for other icons fonts and related tools.\n\n    // Merge icons into default tool font\n   #include \"IconsFontAwesome.h\"\n   ImGuiIO& io = ImGui::GetIO();\n   io.Fonts->AddFontDefault();\n   ImFontConfig config;\n   config.MergeMode = true;\n   static const ImWchar icon_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };\n   io.Fonts->AddFontFromFileTTF(\"fonts/fontawesome-webfont.ttf\", 13.0f, &config, icon_ranges);\n\n   // Usage, e.g.\n   ImGui::Text(\"%s Search\", ICON_FA_SEARCH);\n\n\n---------------------------------\n FONTS LOADING INSTRUCTIONS\n---------------------------------\n\n Load default font with:\n\n   ImGuiIO& io = ImGui::GetIO();\n   io.Fonts->AddFontDefault();\n\n Load .TTF/.OTF file with:\n\n   ImGuiIO& io = ImGui::GetIO();\n   io.Fonts->AddFontFromFileTTF(\"font.ttf\", size_pixels);\n  \n Advanced options:\n\n   ImFontConfig config;\n   config.OversampleH = 3;\n   config.OversampleV = 1;\n   config.GlyphExtraSpacing.x = 1.0f;\n   io.Fonts->AddFontFromFileTTF(\"font.ttf\", size_pixels, &config);\n\n If you have very large number of glyphs or multiple fonts:\n\n  - Mind the fact that some graphics drivers have texture size limitation.\n  - Set io.Fonts.TexDesiredWidth to specify a texture width to minimize texture height (see comment in ImFontAtlas::Build function).\n  - You may reduce oversampling, e.g. config.OversampleH = 2 or 1.\n  - Reduce glyphs ranges, consider calculating them based on your source data if this is possible.\n\n Combine two fonts into one:\n\n   // Load a first font\n   io.Fonts->AddFontDefault();\n\n   // Add character ranges and merge into the previous font\n   // The ranges array is not copied by the AddFont* functions and is used lazily\n   // so ensure it is available for duration of font usage\n   static const ImWchar icons_ranges[] = { 0xf000, 0xf3ff, 0 }; // will not be copied by AddFont* so keep in scope.\n   ImFontConfig config;\n   config.MergeMode = true;\n   io.Fonts->AddFontFromFileTTF(\"DroidSans.ttf\", 18.0f, &config, io.Fonts->GetGlyphRangesJapanese());\n   io.Fonts->AddFontFromFileTTF(\"fontawesome-webfont.ttf\", 18.0f, &config, icons_ranges);\n\n Add a fourth parameter to bake specific font ranges only:\n\n   // Basic Latin, Extended Latin\n   io.Fonts->AddFontFromFileTTF(\"font.ttf\", size_pixels, NULL, io.Fonts->GetGlyphRangesDefault());\n   \n   // Include full set of about 21000 CJK Unified Ideographs\n   io.Fonts->AddFontFromFileTTF(\"font.ttf\", size_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());\n   \n   // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs\n   io.Fonts->AddFontFromFileTTF(\"font.ttf\", size_pixels, NULL, io.Fonts->GetGlyphRangesChinese());\n\n Offset font vertically by altering the io.Font->DisplayOffset value:\n\n   ImFont* font = io.Fonts->AddFontFromFileTTF(\"font.ttf\", size_pixels);\n   font->DisplayOffset.y += 1;   // Render 1 pixel down\n\n\n---------------------------------\n BUILDING CUSTOM GLYPH RANGES\n---------------------------------\n\n You can use the ImFontAtlas::GlyphRangesBuilder helper to create glyph ranges based on text input.\n For exemple: for a game where your script is known, if you can feed your entire script to it and only build the characters the game needs. \n\n   ImVector<ImWchar> ranges;\n   ImFontAtlas::GlyphRangesBuilder builder;\n   builder.AddText(\"Hello world\");                        // Add a string (here \"Hello world\" contains 7 unique characters)\n   builder.AddChar(0x7262);                               // Add a specific character\n   builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges\n   builder.BuildRanges(&ranges);                          // Build the final result (ordered ranges with all the unique characters submitted)\n   io.Fonts->AddFontFromFileTTF(\"myfontfile.ttf\", size_in_pixels, NULL, ranges.Data);\n\n\n---------------------------------\n REMAPPING CODEPOINTS\n---------------------------------\n\n All your strings needs to use UTF-8 encoding. Specifying literal in your source code using a local code page (such as CP-923 for Japanese, or CP-1251 for Cyrillic) will NOT work!\n In C++11 you can encode a string literal in UTF-8 by using the u8\"hello\" syntax. Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.\n e.g.\n      u8\"hello\"\n      u8\"こんにちは\"\n You may also try to remap your local codepage characters to their Unicode codepoint using font->AddRemapChar(), but international users may have problems reading/editing your source code.\n\n\n---------------------------------\n EMBEDDING FONT IN SOURCE CODE\n---------------------------------\n\n Compile and use 'binary_to_compressed_c.cpp' to create a compressed C style array that you can embed in source code.\n See the documentation in binary_to_compressed_c.cpp for instruction on how to use the tool.\n You may find a precompiled version binary_to_compressed_c.exe for Windows instead of demo binaries package (see README).\n The tool optionally used Base85 encoding to reduce the size of _source code_ but the read-only arrays will be about 20% bigger. \n\n Then load the font with:\n \n   ImFont* font = io.Fonts->AddFontFromMemoryCompressedTTF(compressed_data, compressed_data_size, size_pixels, ...);\n   \n Or \n \n   ImFont* font = io.Fonts->AddFontFromMemoryCompressedBase85TTF(compressed_data_base85, size_pixels, ...);\n\n\n---------------------------------\n FONT FILES INCLUDED IN THIS FOLDER\n---------------------------------\n\n Roboto-Medium.ttf\n   Apache License 2.0\n   by Christian Robertson\n   https://fonts.google.com/specimen/Roboto\n\n Cousine-Regular.ttf\n   by Steve Matteson\n   Digitized data copyright (c) 2010 Google Corporation.\n   Licensed under the SIL Open Font License, Version 1.1\n   https://fonts.google.com/specimen/Cousine \n\n DroidSans.ttf\n   Copyright (c) Steve Matteson\n   Apache License, version 2.0\n   https://www.fontsquirrel.com/fonts/droid-sans\n\n ProggyClean.ttf\n   Copyright (c) 2004, 2005 Tristan Grimmer\n   MIT License\n   recommended loading setting in ImGui: Size = 13.0, DisplayOffset.Y = +1\n   http://www.proggyfonts.net/\n\n ProggyTiny.ttf\n   Copyright (c) 2004, 2005 Tristan Grimmer\n   MIT License\n   recommended loading setting in ImGui: Size = 10.0, DisplayOffset.Y = +1\n   http://www.proggyfonts.net/\n\n Karla-Regular.ttf\n   Copyright (c) 2012, Jonathan Pinhorn\n   SIL OPEN FONT LICENSE Version 1.1\n\n\n---------------------------------\n LINKS & OTHER FONTS\n---------------------------------\n\n (Icons) Icon fonts\n   https://fortawesome.github.io/Font-Awesome/\n   https://github.com/SamBrishes/kenney-icon-font\n   https://design.google.com/icons/\n   You can use https://github.com/juliettef/IconFontCppHeaders for C/C++ header files with name #define to access icon codepoint in source code.\n\n (Icons) IcoMoon - Custom Icon font builder\n   https://icomoon.io/app\n\n (Regular) Open Sans Fonts\n   https://fonts.google.com/specimen/Open+Sans\n\n (Regular) Google Noto Fonts (worldwide languages)\n   https://www.google.com/get/noto/\n \n (Monospace) Typefaces for source code beautification\n   https://github.com/chrissimpkins/codeface\n\n (Monospace) Programmation fonts\n   http://s9w.github.io/font_compare/\n\n (Monospace) Proggy Programming Fonts\n   http://upperbounds.net\n   \n (Monospace) Inconsolata\n   http://www.levien.com/type/myfonts/inconsolata.html\n\n (Monospace) Adobe Source Code Pro: Monospaced font family for user interface and coding environments\n   https://github.com/adobe-fonts/source-code-pro\n\n (Monospace) Monospace/Fixed Width Programmer's Fonts\n   http://www.lowing.org/fonts/\n\n (Japanese) M+ fonts by Coji Morishita are free and include most useful Kanjis you would need.\n   http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html\n\n Or use Arial Unicode or other Unicode fonts provided with Windows for full characters coverage (not sure of their licensing).\n"
  },
  {
    "path": "external/imgui/extra_fonts/binary_to_compressed_c.cpp",
    "content": "// ImGui - binary_to_compressed_c.cpp\n// Helper tool to turn a file into a C array, if you want to embed font data in your source code.\n\n// The data is first compressed with stb_compress() to reduce source code size,\n// then encoded in Base85 to fit in a string so we can fit roughly 4 bytes of compressed data into 5 bytes of source code (suggested by @mmalex)\n// (If we used 32-bits constants it would require take 11 bytes of source code to encode 4 bytes, and be endianness dependent)\n// Note that even with compression, the output array is likely to be bigger than the binary file..\n// Load compressed TTF fonts with ImGui::GetIO().Fonts->AddFontFromMemoryCompressedTTF()\n\n// Build with, e.g:\n//   # cl.exe binary_to_compressed_c.cpp\n//   # gcc binary_to_compressed_c.cpp\n// You can also find a precompiled Windows binary in the binary/demo package available from https://github.com/ocornut/imgui\n\n// Usage:\n//   binary_to_compressed_c.exe [-base85] [-nocompress] <inputfile> <symbolname>\n// Usage example:\n//   # binary_to_compressed_c.exe myfont.ttf MyFont > myfont.cpp\n//   # binary_to_compressed_c.exe -base85 myfont.ttf MyFont > myfont.cpp\n\n#define _CRT_SECURE_NO_WARNINGS\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n\n// stb_compress* from stb.h - declaration\ntypedef unsigned int stb_uint;\ntypedef unsigned char stb_uchar;\nstb_uint stb_compress(stb_uchar *out,stb_uchar *in,stb_uint len);\n\nstatic bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_base85_encoding, bool use_compression);\n\nint main(int argc, char** argv)\n{\n    if (argc < 3)\n    {\n        printf(\"Syntax: %s [-base85] [-nocompress] <inputfile> <symbolname>\\n\", argv[0]);\n        return 0;\n    }\n\n    int argn = 1;\n    bool use_base85_encoding = false;\n    bool use_compression = true;\n    if (argv[argn][0] == '-')\n    {\n        if (strcmp(argv[argn], \"-base85\") == 0) { use_base85_encoding = true; argn++; }\n        else if (strcmp(argv[argn], \"-nocompress\") == 0) { use_compression = false; argn++; }\n        else\n        {\n            printf(\"Unknown argument: '%s'\\n\", argv[argn]);\n            return 1;\n        }\n    }\n\n    return binary_to_compressed_c(argv[argn], argv[argn+1], use_base85_encoding, use_compression) ? 0 : 1;\n}\n\nchar Encode85Byte(unsigned int x) \n{\n    x = (x % 85) + 35;\n    return (x>='\\\\') ? x+1 : x;\n}\n\nbool binary_to_compressed_c(const char* filename, const char* symbol, bool use_base85_encoding, bool use_compression)\n{\n    // Read file\n    FILE* f = fopen(filename, \"rb\");\n    if (!f) return false;\n    int data_sz;\n    if (fseek(f, 0, SEEK_END) || (data_sz = (int)ftell(f)) == -1 || fseek(f, 0, SEEK_SET)) { fclose(f); return false; }\n    char* data = new char[data_sz+4];\n    if (fread(data, 1, data_sz, f) != (size_t)data_sz) { fclose(f); delete[] data; return false; }\n    memset((void *)(((char*)data) + data_sz), 0, 4);\n    fclose(f);\n\n    // Compress\n    int maxlen = data_sz + 512 + (data_sz >> 2) + sizeof(int); // total guess\n    char* compressed = use_compression ? new char[maxlen] : data;\n    int compressed_sz = use_compression ? stb_compress((stb_uchar*)compressed, (stb_uchar*)data, data_sz) : data_sz;\n    if (use_compression)\n\t\tmemset(compressed + compressed_sz, 0, maxlen - compressed_sz);\n\n    // Output as Base85 encoded\n    FILE* out = stdout;\n    fprintf(out, \"// File: '%s' (%d bytes)\\n\", filename, (int)data_sz);\n    fprintf(out, \"// Exported using binary_to_compressed_c.cpp\\n\");\n\tconst char* compressed_str = use_compression ? \"compressed_\" : \"\";\n    if (use_base85_encoding)\n    {\n        fprintf(out, \"static const char %s_%sdata_base85[%d+1] =\\n    \\\"\", symbol, compressed_str, (int)((compressed_sz+3)/4)*5);\n        char prev_c = 0;\n        for (int src_i = 0; src_i < compressed_sz; src_i += 4)\n        {\n            // This is made a little more complicated by the fact that ??X sequences are interpreted as trigraphs by old C/C++ compilers. So we need to escape pairs of ??.\n            unsigned int d = *(unsigned int*)(compressed + src_i);\n            for (unsigned int n5 = 0; n5 < 5; n5++, d /= 85)\n            {\n                char c = Encode85Byte(d);\n                fprintf(out, (c == '?' && prev_c == '?') ? \"\\\\%c\" : \"%c\", c);\n                prev_c = c;\n            }\n            if ((src_i % 112) == 112-4)\n                fprintf(out, \"\\\"\\n    \\\"\");\n        }\n        fprintf(out, \"\\\";\\n\\n\");\n    }\n    else\n    {\n        fprintf(out, \"static const unsigned int %s_%ssize = %d;\\n\", symbol, compressed_str, (int)compressed_sz);\n        fprintf(out, \"static const unsigned int %s_%sdata[%d/4] =\\n{\", symbol, compressed_str, (int)((compressed_sz+3)/4)*4);\n        int column = 0;\n        for (int i = 0; i < compressed_sz; i += 4)\n        {\n            unsigned int d = *(unsigned int*)(compressed + i);\n            if ((column++ % 12) == 0)\n                fprintf(out, \"\\n    0x%08x, \", d);\n            else\n                fprintf(out, \"0x%08x, \", d);\n        }\n        fprintf(out, \"\\n};\\n\\n\");\n    }\n\n    // Cleanup\n    delete[] data;\n    if (use_compression)\n\t    delete[] compressed;\n    return true;\n}\n\n// stb_compress* from stb.h - definition\n\n////////////////////           compressor         ///////////////////////\n\nstatic stb_uint stb_adler32(stb_uint adler32, stb_uchar *buffer, stb_uint buflen)\n{\n    const unsigned long ADLER_MOD = 65521;\n    unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16;\n    unsigned long blocklen, i;\n\n    blocklen = buflen % 5552;\n    while (buflen) {\n        for (i=0; i + 7 < blocklen; i += 8) {\n            s1 += buffer[0], s2 += s1;\n            s1 += buffer[1], s2 += s1;\n            s1 += buffer[2], s2 += s1;\n            s1 += buffer[3], s2 += s1;\n            s1 += buffer[4], s2 += s1;\n            s1 += buffer[5], s2 += s1;\n            s1 += buffer[6], s2 += s1;\n            s1 += buffer[7], s2 += s1;\n\n            buffer += 8;\n        }\n\n        for (; i < blocklen; ++i)\n            s1 += *buffer++, s2 += s1;\n\n        s1 %= ADLER_MOD, s2 %= ADLER_MOD;\n        buflen -= blocklen;\n        blocklen = 5552;\n    }\n    return (s2 << 16) + s1;\n}\n\nstatic unsigned int stb_matchlen(stb_uchar *m1, stb_uchar *m2, stb_uint maxlen)\n{\n    stb_uint i;\n    for (i=0; i < maxlen; ++i)\n        if (m1[i] != m2[i]) return i;\n    return i;\n}\n\n// simple implementation that just takes the source data in a big block\n\nstatic stb_uchar *stb__out;\nstatic FILE      *stb__outfile;\nstatic stb_uint   stb__outbytes;\n\nstatic void stb__write(unsigned char v)\n{\n    fputc(v, stb__outfile);\n    ++stb__outbytes;\n}\n\n//#define stb_out(v)    (stb__out ? *stb__out++ = (stb_uchar) (v) : stb__write((stb_uchar) (v)))\n#define stb_out(v)    do { if (stb__out) *stb__out++ = (stb_uchar) (v); else stb__write((stb_uchar) (v)); } while (0)\n\nstatic void stb_out2(stb_uint v) { stb_out(v >> 8); stb_out(v); }\nstatic void stb_out3(stb_uint v) { stb_out(v >> 16); stb_out(v >> 8); stb_out(v); }\nstatic void stb_out4(stb_uint v) { stb_out(v >> 24); stb_out(v >> 16); stb_out(v >> 8 ); stb_out(v); }\n\nstatic void outliterals(stb_uchar *in, int numlit)\n{\n    while (numlit > 65536) {\n        outliterals(in,65536);\n        in     += 65536;\n        numlit -= 65536;\n    }\n\n    if      (numlit ==     0)    ;\n    else if (numlit <=    32)    stb_out (0x000020 + numlit-1);\n    else if (numlit <=  2048)    stb_out2(0x000800 + numlit-1);\n    else /*  numlit <= 65536) */ stb_out3(0x070000 + numlit-1);\n\n    if (stb__out) {\n        memcpy(stb__out,in,numlit);\n        stb__out += numlit;\n    } else\n        fwrite(in, 1, numlit, stb__outfile);\n}\n\nstatic int stb__window = 0x40000; // 256K\n\nstatic int stb_not_crap(int best, int dist)\n{\n    return   ((best > 2  &&  dist <= 0x00100)     \n        || (best > 5  &&  dist <= 0x04000)\n        || (best > 7  &&  dist <= 0x80000));\n}\n\nstatic  stb_uint stb__hashsize = 32768;\n\n// note that you can play with the hashing functions all you\n// want without needing to change the decompressor\n#define stb__hc(q,h,c)      (((h) << 7) + ((h) >> 25) + q[c])\n#define stb__hc2(q,h,c,d)   (((h) << 14) + ((h) >> 18) + (q[c] << 7) + q[d])\n#define stb__hc3(q,c,d,e)   ((q[c] << 14) + (q[d] << 7) + q[e])\n\nstatic unsigned int stb__running_adler;\n\nstatic int stb_compress_chunk(stb_uchar *history,\n    stb_uchar *start,\n    stb_uchar *end,\n    int length,\n    int *pending_literals,\n    stb_uchar **chash,\n    stb_uint mask)\n{\n    (void)history;\n    int window = stb__window;\n    stb_uint match_max;\n    stb_uchar *lit_start = start - *pending_literals;\n    stb_uchar *q = start;\n\n#define STB__SCRAMBLE(h)   (((h) + ((h) >> 16)) & mask)\n\n    // stop short of the end so we don't scan off the end doing\n    // the hashing; this means we won't compress the last few bytes\n    // unless they were part of something longer\n    while (q < start+length && q+12 < end) {\n        int m;\n        stb_uint h1,h2,h3,h4, h;\n        stb_uchar *t;\n        int best = 2, dist=0;\n\n        if (q+65536 > end)\n            match_max = end-q;\n        else\n            match_max = 65536;\n\n#define stb__nc(b,d)  ((d) <= window && ((b) > 9 || stb_not_crap(b,d)))\n\n#define STB__TRY(t,p)  /* avoid retrying a match we already tried */ \\\n    if (p ? dist != q-t : 1)                             \\\n    if ((m = stb_matchlen(t, q, match_max)) > best)     \\\n    if (stb__nc(m,q-(t)))                                \\\n    best = m, dist = q - (t)\n\n        // rather than search for all matches, only try 4 candidate locations,\n        // chosen based on 4 different hash functions of different lengths.\n        // this strategy is inspired by LZO; hashing is unrolled here using the\n        // 'hc' macro\n        h = stb__hc3(q,0, 1, 2); h1 = STB__SCRAMBLE(h);\n        t = chash[h1]; if (t) STB__TRY(t,0);\n        h = stb__hc2(q,h, 3, 4); h2 = STB__SCRAMBLE(h);\n        h = stb__hc2(q,h, 5, 6);        t = chash[h2]; if (t) STB__TRY(t,1);\n        h = stb__hc2(q,h, 7, 8); h3 = STB__SCRAMBLE(h);\n        h = stb__hc2(q,h, 9,10);        t = chash[h3]; if (t) STB__TRY(t,1);\n        h = stb__hc2(q,h,11,12); h4 = STB__SCRAMBLE(h);\n        t = chash[h4]; if (t) STB__TRY(t,1);\n\n        // because we use a shared hash table, can only update it\n        // _after_ we've probed all of them\n        chash[h1] = chash[h2] = chash[h3] = chash[h4] = q;\n\n        if (best > 2)\n            assert(dist > 0);\n\n        // see if our best match qualifies\n        if (best < 3) { // fast path literals\n            ++q;\n        } else if (best > 2  &&  best <= 0x80    &&  dist <= 0x100) {\n            outliterals(lit_start, q-lit_start); lit_start = (q += best);\n            stb_out(0x80 + best-1);\n            stb_out(dist-1);\n        } else if (best > 5  &&  best <= 0x100   &&  dist <= 0x4000) {\n            outliterals(lit_start, q-lit_start); lit_start = (q += best);\n            stb_out2(0x4000 + dist-1);       \n            stb_out(best-1);\n        } else if (best > 7  &&  best <= 0x100   &&  dist <= 0x80000) {\n            outliterals(lit_start, q-lit_start); lit_start = (q += best);\n            stb_out3(0x180000 + dist-1);     \n            stb_out(best-1);\n        } else if (best > 8  &&  best <= 0x10000 &&  dist <= 0x80000) {\n            outliterals(lit_start, q-lit_start); lit_start = (q += best);\n            stb_out3(0x100000 + dist-1);     \n            stb_out2(best-1);\n        } else if (best > 9                      &&  dist <= 0x1000000) {\n            if (best > 65536) best = 65536;\n            outliterals(lit_start, q-lit_start); lit_start = (q += best);\n            if (best <= 0x100) {\n                stb_out(0x06);\n                stb_out3(dist-1);\n                stb_out(best-1);\n            } else {\n                stb_out(0x04);\n                stb_out3(dist-1);\n                stb_out2(best-1);\n            }\n        } else {  // fallback literals if no match was a balanced tradeoff\n            ++q;\n        }\n    }\n\n    // if we didn't get all the way, add the rest to literals\n    if (q-start < length)\n        q = start+length;\n\n    // the literals are everything from lit_start to q\n    *pending_literals = (q - lit_start);\n\n    stb__running_adler = stb_adler32(stb__running_adler, start, q - start);\n    return q - start;\n}\n\nstatic int stb_compress_inner(stb_uchar *input, stb_uint length)\n{\n    int literals = 0;\n    stb_uint len,i;\n\n    stb_uchar **chash;\n    chash = (stb_uchar**) malloc(stb__hashsize * sizeof(stb_uchar*));\n    if (chash == NULL) return 0; // failure\n    for (i=0; i < stb__hashsize; ++i)\n        chash[i] = NULL;\n\n    // stream signature\n    stb_out(0x57); stb_out(0xbc);\n    stb_out2(0);\n\n    stb_out4(0);       // 64-bit length requires 32-bit leading 0\n    stb_out4(length);\n    stb_out4(stb__window);\n\n    stb__running_adler = 1;\n\n    len = stb_compress_chunk(input, input, input+length, length, &literals, chash, stb__hashsize-1);\n    assert(len == length);\n\n    outliterals(input+length - literals, literals);\n\n    free(chash);\n\n    stb_out2(0x05fa); // end opcode\n\n    stb_out4(stb__running_adler);\n\n    return 1; // success\n}\n\nstb_uint stb_compress(stb_uchar *out, stb_uchar *input, stb_uint length)\n{\n    stb__out = out;\n    stb__outfile = NULL;\n\n    stb_compress_inner(input, length);\n\n    return stb__out - out;\n}\n"
  },
  {
    "path": "external/imgui/imconfig.h",
    "content": "//-----------------------------------------------------------------------------\n// USER IMPLEMENTATION\n// This file contains compile-time options for ImGui.\n// Other options (memory allocation overrides, callbacks, etc.) can be set at runtime via the ImGuiIO structure - ImGui::GetIO().\n//-----------------------------------------------------------------------------\n\n#pragma once\n\n//---- Define assertion handler. Defaults to calling assert().\n//#define IM_ASSERT(_EXPR)  MyAssert(_EXPR)\n\n//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows.\n//#define IMGUI_API __declspec( dllexport )\n//#define IMGUI_API __declspec( dllimport )\n\n//---- Don't define obsolete functions names. Consider enabling from time to time or when updating to reduce like hood of using already obsolete function/names\n//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS\n\n//---- Include imgui_user.h at the end of imgui.h\n//#define IMGUI_INCLUDE_IMGUI_USER_H\n\n//---- Don't implement default handlers for Windows (so as not to link with OpenClipboard() and others Win32 functions)\n//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS\n//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS\n\n//---- Don't implement test window functionality (ShowTestWindow()/ShowStyleEditor()/ShowUserGuide() methods will be empty)\n//---- It is very strongly recommended to NOT disable the test windows. Please read the comment at the top of imgui_demo.cpp to learn why.\n//#define IMGUI_DISABLE_TEST_WINDOWS\n\n//---- Don't implement ImFormatString(), ImFormatStringV() so you can reimplement them yourself.\n//#define IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS\n\n//---- Pack colors to BGRA instead of RGBA (remove need to post process vertex buffer in back ends)\n//#define IMGUI_USE_BGRA_PACKED_COLOR\n\n//---- Implement STB libraries in a namespace to avoid linkage conflicts\n//#define IMGUI_STB_NAMESPACE     ImGuiStb\n\n//---- Define constructor and implicit cast operators to convert back<>forth from your math types and ImVec2/ImVec4.\n/*\n#define IM_VEC2_CLASS_EXTRA                                                 \\\n        ImVec2(const MyVec2& f) { x = f.x; y = f.y; }                       \\\n        operator MyVec2() const { return MyVec2(x,y); }\n\n#define IM_VEC4_CLASS_EXTRA                                                 \\\n        ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; }     \\\n        operator MyVec4() const { return MyVec4(x,y,z,w); }\n*/\n\n//---- Use 32-bit vertex indices (instead of default: 16-bit) to allow meshes with more than 64K vertices\n//#define ImDrawIdx unsigned int\n\n//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files.\n//---- e.g. create variants of the ImGui::Value() helper for your low-level math types, or your own widgets/helpers.\n/*\nnamespace ImGui\n{\n    void    Value(const char* prefix, const MyMatrix44& v, const char* float_format = NULL);\n}\n*/\n\n"
  },
  {
    "path": "external/imgui/imgui.cpp",
    "content": "// dear imgui, v1.53 WIP\n// (main code and documentation)\n\n// See ImGui::ShowTestWindow() in imgui_demo.cpp for demo code.\n// Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase.\n// Get latest version at https://github.com/ocornut/imgui\n// Releases change-log at https://github.com/ocornut/imgui/releases\n// Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/1269\n// Developed by Omar Cornut and every direct or indirect contributors to the GitHub.\n// This library is free but I need your support to sustain development and maintenance.\n// If you work for a company, please consider financial support, e.g: https://www.patreon.com/imgui\n\n/*\n\n Index\n - MISSION STATEMENT\n - END-USER GUIDE\n - PROGRAMMER GUIDE (read me!)\n   - Read first\n   - How to update to a newer version of Dear ImGui\n   - Getting started with integrating Dear ImGui in your code/engine\n - API BREAKING CHANGES (read me when you update!)\n - ISSUES & TODO LIST\n - FREQUENTLY ASKED QUESTIONS (FAQ), TIPS\n   - How can I help?\n   - What is ImTextureID and how do I display an image?\n   - I integrated Dear ImGui in my engine and the text or lines are blurry..\n   - I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around..\n   - How can I have multiple widgets with the same label? Can I have widget without a label? (Yes). A primer on labels/IDs.\n   - How can I tell when Dear ImGui wants my mouse/keyboard inputs VS when I can pass them to my application?\n   - How can I load a different font than the default?\n   - How can I easily use icons in my application?\n   - How can I load multiple fonts?\n   - How can I display and input non-latin characters such as Chinese, Japanese, Korean, Cyrillic?\n   - How can I preserve my Dear ImGui context across reloading a DLL? (loss of the global/static variables)\n   - How can I use the drawing facilities without an ImGui window? (using ImDrawList API)\n - ISSUES & TODO-LIST\n - CODE\n\n\n MISSION STATEMENT\n =================\n\n - Easy to use to create code-driven and data-driven tools\n - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools\n - Easy to hack and improve\n - Minimize screen real-estate usage\n - Minimize setup and maintenance\n - Minimize state storage on user side\n - Portable, minimize dependencies, run on target (consoles, phones, etc.)\n - Efficient runtime and memory consumption (NB- we do allocate when \"growing\" content e.g. creating a window, opening a tree node \n   for the first time, etc. but a typical frame won't allocate anything)\n\n Designed for developers and content-creators, not the typical end-user! Some of the weaknesses includes:\n - Doesn't look fancy, doesn't animate\n - Limited layout features, intricate layouts are typically crafted in code\n\n\n END-USER GUIDE\n ==============\n\n - Double-click on title bar to collapse window.\n - Click upper right corner to close a window, available when 'bool* p_open' is passed to ImGui::Begin().\n - Click and drag on lower right corner to resize window (double-click to auto fit window to its contents).\n - Click and drag on any empty space to move window.\n - TAB/SHIFT+TAB to cycle through keyboard editable fields.\n - CTRL+Click on a slider or drag box to input value as text.\n - Use mouse wheel to scroll.\n - Text editor:\n   - Hold SHIFT or use mouse to select text.\n   - CTRL+Left/Right to word jump.\n   - CTRL+Shift+Left/Right to select words.\n   - CTRL+A our Double-Click to select all.\n   - CTRL+X,CTRL+C,CTRL+V to use OS clipboard/\n   - CTRL+Z,CTRL+Y to undo/redo.\n   - ESCAPE to revert text to its original value.\n   - You can apply arithmetic operators +,*,/ on numerical values. Use +- to subtract (because - would set a negative value!)\n   - Controls are automatically adjusted for OSX to match standard OSX text editing operations.\n\n\n PROGRAMMER GUIDE\n ================\n\n READ FIRST\n\n - Read the FAQ below this section!\n - Your code creates the UI, if your code doesn't run the UI is gone! == very dynamic UI, no construction/destructions steps, less data retention\n   on your side, no state duplication, less sync, less bugs.\n - Call and read ImGui::ShowTestWindow() for demo code demonstrating most features.\n - You can learn about immediate-mode gui principles at http://www.johno.se/book/imgui.html or watch http://mollyrocket.com/861\n\n HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI\n\n - Overwrite all the sources files except for imconfig.h (if you have made modification to your copy of imconfig.h)\n - Read the \"API BREAKING CHANGES\" section (below). This is where we list occasional API breaking changes. \n   If a function/type has been renamed / or marked obsolete, try to fix the name in your code before it is permanently removed from the public API.\n   If you have a problem with a missing function/symbols, search for its name in the code, there will likely be a comment about it. \n   Please report any issue to the GitHub page!\n - Try to keep your copy of dear imgui reasonably up to date.\n\n GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE\n\n - Add the Dear ImGui source files to your projects, using your preferred build system. \n   It is recommended you build the .cpp files as part of your project and not as a library.\n - You can later customize the imconfig.h file to tweak some compilation time behavior, such as integrating imgui types with your own maths types.\n - See examples/ folder for standalone sample applications.\n - You may be able to grab and copy a ready made imgui_impl_*** file from the examples/.\n - When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them.\n\n - Init: retrieve the ImGuiIO structure with ImGui::GetIO() and fill the fields marked 'Settings': at minimum you need to set io.DisplaySize\n   (application resolution). Later on you will fill your keyboard mapping, clipboard handlers, and other advanced features but for a basic \n   integration you don't need to worry about it all.\n - Init: call io.Fonts->GetTexDataAsRGBA32(...), it will build the font atlas texture, then load the texture pixels into graphics memory.\n - Every frame:\n    - In your main loop as early a possible, fill the IO fields marked 'Input' (e.g. mouse position, buttons, keyboard info, etc.)\n    - Call ImGui::NewFrame() to begin the frame\n    - You can use any ImGui function you want between NewFrame() and Render()\n    - Call ImGui::Render() as late as you can to end the frame and finalize render data. it will call your io.RenderDrawListFn handler.\n       (Even if you don't render, call Render() and ignore the callback, or call EndFrame() instead. Otherwhise some features will break)\n - All rendering information are stored into command-lists until ImGui::Render() is called.\n - Dear ImGui never touches or knows about your GPU state. the only function that knows about GPU is the RenderDrawListFn handler that you provide.\n - Effectively it means you can create widgets at any time in your code, regardless of considerations of being in \"update\" vs \"render\" phases \n   of your own application.\n - Refer to the examples applications in the examples/ folder for instruction on how to setup your code.\n - A minimal application skeleton may be:\n\n     // Application init\n     ImGuiIO& io = ImGui::GetIO();\n     io.DisplaySize.x = 1920.0f;\n     io.DisplaySize.y = 1280.0f;\n     io.RenderDrawListsFn = MyRenderFunction;  // Setup a render function, or set to NULL and call GetDrawData() after Render() to access render data.\n     // TODO: Fill others settings of the io structure later.\n\n     // Load texture atlas (there is a default font so you don't need to care about choosing a font yet)\n     unsigned char* pixels;\n     int width, height;\n     io.Fonts->GetTexDataAsRGBA32(pixels, &width, &height);\n     // TODO: At this points you've got the texture data and you need to upload that your your graphic system:\n     MyTexture* texture = MyEngine::CreateTextureFromMemoryPixels(pixels, width, height, TEXTURE_TYPE_RGBA)\n     // TODO: Store your texture pointer/identifier (whatever your engine uses) in 'io.Fonts->TexID'. This will be passed back to your via the renderer.\n     io.Fonts->TexID = (void*)texture;\n\n     // Application main loop\n     while (true)\n     {\n        // Setup low-level inputs (e.g. on Win32, GetKeyboardState(), or write to those fields from your Windows message loop handlers, etc.)\n        ImGuiIO& io = ImGui::GetIO();\n        io.DeltaTime = 1.0f/60.0f;\n        io.MousePos = mouse_pos;\n        io.MouseDown[0] = mouse_button_0;\n        io.MouseDown[1] = mouse_button_1;\n\n        // Call NewFrame(), after this point you can use ImGui::* functions anytime\n        ImGui::NewFrame();\n\n        // Most of your application code here\n        MyGameUpdate(); // may use any ImGui functions, e.g. ImGui::Begin(\"My window\"); ImGui::Text(\"Hello, world!\"); ImGui::End();\n        MyGameRender(); // may use any ImGui functions as well!\n     \n        // Render & swap video buffers\n        ImGui::Render();\n        SwapBuffers();\n     }\n\n - A minimal render function skeleton may be:\n\n    void void MyRenderFunction(ImDrawData* draw_data)(ImDrawData* draw_data)\n    {\n       // TODO: Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled\n       // TODO: Setup viewport, orthographic projection matrix\n       // TODO: Setup shader: vertex { float2 pos, float2 uv, u32 color }, fragment shader sample color from 1 texture, multiply by vertex color.\n       for (int n = 0; n < draw_data->CmdListsCount; n++)\n       {\n          const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data;  // vertex buffer generated by ImGui\n          const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data;   // index buffer generated by ImGui\n          for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n          {\n             const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];\n             if (pcmd->UserCallback)\n             {\n                 pcmd->UserCallback(cmd_list, pcmd);\n             }\n             else\n             {\n                 // The texture for the draw call is specified by pcmd->TextureId. \n                 // The vast majority of draw calls with use the imgui texture atlas, which value you have set yourself during initialization. \n                 MyEngineBindTexture(pcmd->TextureId);\n\n                 // We are using scissoring to clip some objects. All low-level graphics API supports it.\n                 // If your engine doesn't support scissoring yet, you will get some small glitches (some elements outside their bounds) which you can fix later.\n                 MyEngineScissor((int)pcmd->ClipRect.x, (int)pcmd->ClipRect.y, (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y));\n\n                 // Render 'pcmd->ElemCount/3' indexed triangles.\n                 // By default the indices ImDrawIdx are 16-bits, you can change them to 32-bits if your engine doesn't support 16-bits indices.\n                 MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer, vtx_buffer);\n             }\n             idx_buffer += pcmd->ElemCount;\n          }\n       }\n    }\n\n - The examples/ folders contains many functional implementation of the pseudo-code above.\n - When calling NewFrame(), the 'io.WantCaptureMouse'/'io.WantCaptureKeyboard'/'io.WantTextInput' flags are updated. \n   They tell you if ImGui intends to use your inputs. So for example, if 'io.WantCaptureMouse' is set you would typically want to hide \n   mouse inputs from the rest of your application. Read the FAQ below for more information about those flags.\n\n\n\n API BREAKING CHANGES\n ====================\n\n Occasionally introducing changes that are breaking the API. The breakage are generally minor and easy to fix.\n Here is a change-log of API breaking changes, if you are using one of the functions listed, expect to have to fix some code.\n Also read releases logs https://github.com/ocornut/imgui/releases for more details.\n\n - 2017/11/18 (1.53) - Style, Begin: removed ImGuiWindowFlags_ShowBorders window flag. Borders are now fully set up in the ImGuiStyle structure (see e.g. style.FrameBorderSize, style.WindowBorderSize). Use ImGui::ShowStyleEditor() to look them up.\n                       Please note that the style system will keep evolving (hopefully stabilizing in Q1 2018), and so custom styles will probably subtly break over time. It is recommended you use the StyleColorsClassic(), StyleColorsDark(), StyleColorsLight() functions.\n - 2017/11/18 (1.53) - Style: removed ImGuiCol_ComboBg in favor of combo boxes using ImGuiCol_PopupBg for consistency.\n - 2017/11/18 (1.53) - Style: renamed ImGuiCol_ChildWindowBg to ImGuiCol_ChildBg.\n - 2017/11/18 (1.53) - Style: renamed style.ChildWindowRounding to style.ChildRounding, ImGuiStyleVar_ChildWindowRounding to ImGuiStyleVar_ChildRounding.\n - 2017/11/02 (1.53) - marked IsRootWindowOrAnyChildHovered() as obsolete is favor of using IsWindowHovered(ImGuiHoveredFlags_FlattenChilds);\n - 2017/10/24 (1.52) - renamed IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS to IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS for consistency.\n - 2017/10/20 (1.52) - changed IsWindowHovered() default parameters behavior to return false if an item is active in another window (e.g. click-dragging item from another window to this window). You can use the newly introduced IsWindowHovered() flags to requests this specific behavior if you need it.\n - 2017/10/20 (1.52) - marked IsItemHoveredRect()/IsMouseHoveringWindow() as obsolete, in favor of using the newly introduced flags for IsItemHovered() and IsWindowHovered(). See https://github.com/ocornut/imgui/issues/1382 for details.\n                       removed the IsItemRectHovered()/IsWindowRectHovered() names introduced in 1.51 since they were merely more consistent names for the two functions we are now obsoleting.\n - 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead!\n - 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete).\n - 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete). \n - 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your binding if you need to support unavailable mouse, make sure to replace \"io.MousePos = ImVec2(-1,-1)\" with \"io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)\".\n - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)! \n                     - renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete).\n                     - renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete).\n - 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency.\n - 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an \"ambiguous call\" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix.\n - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame.\n - 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely.\n - 2017/08/13 (1.51) - renamed ImGuiCol_Columns*** to ImGuiCol_Separator***. Kept redirection enums (will obsolete).\n - 2017/08/11 (1.51) - renamed ImGuiSetCond_*** types and flags to ImGuiCond_***. Kept redirection enums (will obsolete).\n - 2017/08/09 (1.51) - removed ValueColor() helpers, they are equivalent to calling Text(label) + SameLine() + ColorButton().\n - 2017/08/08 (1.51) - removed ColorEditMode() and ImGuiColorEditMode in favor of ImGuiColorEditFlags and parameters to the various Color*() functions. The SetColorEditOptions() allows to initialize default but the user can still change them with right-click context menu.\n                     - changed prototype of 'ColorEdit4(const char* label, float col[4], bool show_alpha = true)' to 'ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0)', where passing flags = 0x01 is a safe no-op (hello dodgy backward compatibility!). - check and run the demo window, under \"Color/Picker Widgets\", to understand the various new options.\n                     - changed prototype of rarely used 'ColorButton(ImVec4 col, bool small_height = false, bool outline_border = true)' to 'ColorButton(const char* desc_id, ImVec4 col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0,0))'\n - 2017/07/20 (1.51) - removed IsPosHoveringAnyWindow(ImVec2), which was partly broken and misleading. ASSERT + redirect user to io.WantCaptureMouse\n - 2017/05/26 (1.50) - removed ImFontConfig::MergeGlyphCenterV in favor of a more multipurpose ImFontConfig::GlyphOffset.\n - 2017/05/01 (1.50) - renamed ImDrawList::PathFill() (rarely used directly) to ImDrawList::PathFillConvex() for clarity.\n - 2016/11/06 (1.50) - BeginChild(const char*) now applies the stack id to the provided label, consistently with other functions as it should always have been. It shouldn't affect you unless (extremely unlikely) you were appending multiple times to a same child from different locations of the stack id. If that's the case, generate an id with GetId() and use it instead of passing string to BeginChild().\n - 2016/10/15 (1.50) - avoid 'void* user_data' parameter to io.SetClipboardTextFn/io.GetClipboardTextFn pointers. We pass io.ClipboardUserData to it.\n - 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc.\n - 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully breakage should be minimal.\n - 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore. \n                       If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you. \n                       However if your TitleBg/TitleBgActive alpha was <1.0f you need to tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar.\n                       This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color.\n                           ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col)\n                           {\n                               float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a;\n                               return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a);\n                           }\n                       If this is confusing, pick the RGB value from title bar from an old screenshot and apply this as TitleBg/TitleBgActive. Or you may just create TitleBgActive from a tweaked TitleBg color.\n - 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext().\n - 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection.\n - 2016/05/01 (1.49) - obsoleted old signature of CollapsingHeader(const char* label, const char* str_id = NULL, bool display_frame = true, bool default_open = false) as extra parameters were badly designed and rarely used. You can replace the \"default_open = true\" flag in new API with CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen).\n - 2016/04/26 (1.49) - changed ImDrawList::PushClipRect(ImVec4 rect) to ImDraw::PushClipRect(Imvec2 min,ImVec2 max,bool intersect_with_current_clip_rect=false). Note that higher-level ImGui::PushClipRect() is preferable because it will clip at logic/widget level, whereas ImDrawList::PushClipRect() only affect your renderer.\n - 2016/04/03 (1.48) - removed style.WindowFillAlphaDefault setting which was redundant. Bake default BG alpha inside style.Colors[ImGuiCol_WindowBg] and all other Bg color values. (ref github issue #337).\n - 2016/04/03 (1.48) - renamed ImGuiCol_TooltipBg to ImGuiCol_PopupBg, used by popups/menus and tooltips. popups/menus were previously using ImGuiCol_WindowBg. (ref github issue #337)\n - 2016/03/21 (1.48) - renamed GetWindowFont() to GetFont(), GetWindowFontSize() to GetFontSize(). Kept inline redirection function (will obsolete).\n - 2016/03/02 (1.48) - InputText() completion/history/always callbacks: if you modify the text buffer manually (without using DeleteChars()/InsertChars() helper) you need to maintain the BufTextLen field. added an assert.\n - 2016/01/23 (1.48) - fixed not honoring exact width passed to PushItemWidth(), previously it would add extra FramePadding.x*2 over that width. if you had manual pixel-perfect alignment in place it might affect you.\n - 2015/12/27 (1.48) - fixed ImDrawList::AddRect() which used to render a rectangle 1 px too large on each axis.\n - 2015/12/04 (1.47) - renamed Color() helpers to ValueColor() - dangerously named, rarely used and probably to be made obsolete.\n - 2015/08/29 (1.45) - with the addition of horizontal scrollbar we made various fixes to inconsistencies with dealing with cursor position.\n                       GetCursorPos()/SetCursorPos() functions now include the scrolled amount. It shouldn't affect the majority of users, but take note that SetCursorPosX(100.0f) puts you at +100 from the starting x position which may include scrolling, not at +100 from the window left side.\n                       GetContentRegionMax()/GetWindowContentRegionMin()/GetWindowContentRegionMax() functions allow include the scrolled amount. Typically those were used in cases where no scrolling would happen so it may not be a problem, but watch out!\n - 2015/08/29 (1.45) - renamed style.ScrollbarWidth to style.ScrollbarSize\n - 2015/08/05 (1.44) - split imgui.cpp into extra files: imgui_demo.cpp imgui_draw.cpp imgui_internal.h that you need to add to your project.\n - 2015/07/18 (1.44) - fixed angles in ImDrawList::PathArcTo(), PathArcToFast() (introduced in 1.43) being off by an extra PI for no justifiable reason\n - 2015/07/14 (1.43) - add new ImFontAtlas::AddFont() API. For the old AddFont***, moved the 'font_no' parameter of ImFontAtlas::AddFont** functions to the ImFontConfig structure.\n                       you need to render your textured triangles with bilinear filtering to benefit from sub-pixel positioning of text.\n - 2015/07/08 (1.43) - switched rendering data to use indexed rendering. this is saving a fair amount of CPU/GPU and enables us to get anti-aliasing for a marginal cost.\n                       this necessary change will break your rendering function! the fix should be very easy. sorry for that :(\n                     - if you are using a vanilla copy of one of the imgui_impl_XXXX.cpp provided in the example, you just need to update your copy and you can ignore the rest.\n                     - the signature of the io.RenderDrawListsFn handler has changed!\n                            ImGui_XXXX_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)\n                       became:\n                            ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data).\n                              argument   'cmd_lists'        -> 'draw_data->CmdLists'\n                              argument   'cmd_lists_count'  -> 'draw_data->CmdListsCount'\n                              ImDrawList 'commands'         -> 'CmdBuffer'\n                              ImDrawList 'vtx_buffer'       -> 'VtxBuffer'\n                              ImDrawList  n/a               -> 'IdxBuffer' (new)\n                              ImDrawCmd  'vtx_count'        -> 'ElemCount'\n                              ImDrawCmd  'clip_rect'        -> 'ClipRect'\n                              ImDrawCmd  'user_callback'    -> 'UserCallback'\n                              ImDrawCmd  'texture_id'       -> 'TextureId'\n                     - each ImDrawList now contains both a vertex buffer and an index buffer. For each command, render ElemCount/3 triangles using indices from the index buffer.\n                     - if you REALLY cannot render indexed primitives, you can call the draw_data->DeIndexAllBuffers() method to de-index the buffers. This is slow and a waste of CPU/GPU. Prefer using indexed rendering!\n                     - refer to code in the examples/ folder or ask on the GitHub if you are unsure of how to upgrade. please upgrade!\n - 2015/07/10 (1.43) - changed SameLine() parameters from int to float.\n - 2015/07/02 (1.42) - renamed SetScrollPosHere() to SetScrollFromCursorPos(). Kept inline redirection function (will obsolete).\n - 2015/07/02 (1.42) - renamed GetScrollPosY() to GetScrollY(). Necessary to reduce confusion along with other scrolling functions, because positions (e.g. cursor position) are not equivalent to scrolling amount.\n - 2015/06/14 (1.41) - changed ImageButton() default bg_col parameter from (0,0,0,1) (black) to (0,0,0,0) (transparent) - makes a difference when texture have transparence\n - 2015/06/14 (1.41) - changed Selectable() API from (label, selected, size) to (label, selected, flags, size). Size override should have been rarely be used. Sorry!\n - 2015/05/31 (1.40) - renamed GetWindowCollapsed() to IsWindowCollapsed() for consistency. Kept inline redirection function (will obsolete).\n - 2015/05/31 (1.40) - renamed IsRectClipped() to IsRectVisible() for consistency. Note that return value is opposite! Kept inline redirection function (will obsolete).\n - 2015/05/27 (1.40) - removed the third 'repeat_if_held' parameter from Button() - sorry! it was rarely used and inconsistent. Use PushButtonRepeat(true) / PopButtonRepeat() to enable repeat on desired buttons.\n - 2015/05/11 (1.40) - changed BeginPopup() API, takes a string identifier instead of a bool. ImGui needs to manage the open/closed state of popups. Call OpenPopup() to actually set the \"open\" state of a popup. BeginPopup() returns true if the popup is opened.\n - 2015/05/03 (1.40) - removed style.AutoFitPadding, using style.WindowPadding makes more sense (the default values were already the same).\n - 2015/04/13 (1.38) - renamed IsClipped() to IsRectClipped(). Kept inline redirection function until 1.50.\n - 2015/04/09 (1.38) - renamed ImDrawList::AddArc() to ImDrawList::AddArcFast() for compatibility with future API\n - 2015/04/03 (1.38) - removed ImGuiCol_CheckHovered, ImGuiCol_CheckActive, replaced with the more general ImGuiCol_FrameBgHovered, ImGuiCol_FrameBgActive.\n - 2014/04/03 (1.38) - removed support for passing -FLT_MAX..+FLT_MAX as the range for a SliderFloat(). Use DragFloat() or Inputfloat() instead.\n - 2015/03/17 (1.36) - renamed GetItemBoxMin()/GetItemBoxMax()/IsMouseHoveringBox() to GetItemRectMin()/GetItemRectMax()/IsMouseHoveringRect(). Kept inline redirection function until 1.50.\n - 2015/03/15 (1.36) - renamed style.TreeNodeSpacing to style.IndentSpacing, ImGuiStyleVar_TreeNodeSpacing to ImGuiStyleVar_IndentSpacing\n - 2015/03/13 (1.36) - renamed GetWindowIsFocused() to IsWindowFocused(). Kept inline redirection function until 1.50.\n - 2015/03/08 (1.35) - renamed style.ScrollBarWidth to style.ScrollbarWidth (casing)\n - 2015/02/27 (1.34) - renamed OpenNextNode(bool) to SetNextTreeNodeOpened(bool, ImGuiSetCond). Kept inline redirection function until 1.50.\n - 2015/02/27 (1.34) - renamed ImGuiSetCondition_*** to ImGuiSetCond_***, and _FirstUseThisSession becomes _Once.\n - 2015/02/11 (1.32) - changed text input callback ImGuiTextEditCallback return type from void-->int. reserved for future use, return 0 for now.\n - 2015/02/10 (1.32) - renamed GetItemWidth() to CalcItemWidth() to clarify its evolving behavior\n - 2015/02/08 (1.31) - renamed GetTextLineSpacing() to GetTextLineHeightWithSpacing()\n - 2015/02/01 (1.31) - removed IO.MemReallocFn (unused)\n - 2015/01/19 (1.30) - renamed ImGuiStorage::GetIntPtr()/GetFloatPtr() to GetIntRef()/GetIntRef() because Ptr was conflicting with actual pointer storage functions.\n - 2015/01/11 (1.30) - big font/image API change! now loads TTF file. allow for multiple fonts. no need for a PNG loader.\n              (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels.\n                       this sequence:\n                           const void* png_data;\n                           unsigned int png_size;\n                           ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size);\n                           // <Copy to GPU>\n                       became:\n                           unsigned char* pixels;\n                           int width, height;\n                           io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);\n                           // <Copy to GPU>\n                           io.Fonts->TexID = (your_texture_identifier);\n                       you now have much more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs.\n                       it is now recommended that you sample the font texture with bilinear interpolation.\n              (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to set io.Fonts->TexID.\n              (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix)\n              (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets\n - 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver)\n - 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph)\n - 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility\n - 2014/11/07 (1.15) - renamed IsHovered() to IsItemHovered()\n - 2014/10/02 (1.14) - renamed IMGUI_INCLUDE_IMGUI_USER_CPP to IMGUI_INCLUDE_IMGUI_USER_INL and imgui_user.cpp to imgui_user.inl (more IDE friendly)\n - 2014/09/25 (1.13) - removed 'text_end' parameter from IO.SetClipboardTextFn (the string is now always zero-terminated for simplicity)\n - 2014/09/24 (1.12) - renamed SetFontScale() to SetWindowFontScale()\n - 2014/09/24 (1.12) - moved IM_MALLOC/IM_REALLOC/IM_FREE preprocessor defines to IO.MemAllocFn/IO.MemReallocFn/IO.MemFreeFn\n - 2014/08/30 (1.09) - removed IO.FontHeight (now computed automatically)\n - 2014/08/30 (1.09) - moved IMGUI_FONT_TEX_UV_FOR_WHITE preprocessor define to IO.FontTexUvForWhite\n - 2014/08/28 (1.09) - changed the behavior of IO.PixelCenterOffset following various rendering fixes\n\n\n ISSUES & TODO-LIST\n ==================\n See TODO.txt\n\n\n FREQUENTLY ASKED QUESTIONS (FAQ), TIPS\n ======================================\n\n Q: How can I help?\n A: - If you are experienced enough with Dear ImGui and with C/C++, look at the todo list and see how you want/can help!\n    - Become a Patron/donate! Convince your company to become a Patron or provide serious funding for development time! See http://www.patreon.com/imgui\n\n Q: What is ImTextureID and how do I display an image?\n A: ImTextureID is a void* used to pass renderer-agnostic texture references around until it hits your render function.\n    Dear ImGui knows nothing about what those bits represent, it just passes them around. It is up to you to decide what you want the void* to carry!\n    It could be an identifier to your OpenGL texture (cast GLuint to void*), a pointer to your custom engine material (cast MyMaterial* to void*), etc.\n    At the end of the chain, your renderer takes this void* to cast it back into whatever it needs to select a current texture to render.\n    Refer to examples applications, where each renderer (in a imgui_impl_xxxx.cpp file) is treating ImTextureID as a different thing.\n    (c++ tip: OpenGL uses integers to identify textures. You can safely store an integer into a void*, just cast it to void*, don't take it's address!)\n    To display a custom image/texture within an ImGui window, you may use ImGui::Image(), ImGui::ImageButton(), ImDrawList::AddImage() functions.\n    Dear ImGui will generate the geometry and draw calls using the ImTextureID that you passed and which your renderer can use.\n    It is your responsibility to get textures uploaded to your GPU.\n\n Q: I integrated Dear ImGui in my engine and the text or lines are blurry..\n A: In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f).\n    Also make sure your orthographic projection matrix and io.DisplaySize matches your actual framebuffer dimension.\n\n Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around..\n A: You are probably mishandling the clipping rectangles in your render function. \n    Rectangles provided by ImGui are defined as (x1=left,y1=top,x2=right,y2=bottom) and NOT as (x1,y1,width,height).\n\n Q: Can I have multiple widgets with the same label? Can I have widget without a label?\n A: Yes. A primer on the use of labels/IDs in Dear ImGui..\n\n   - Elements that are not clickable, such as Text() items don't need an ID.\n\n   - Interactive widgets require state to be carried over multiple frames (most typically Dear ImGui often needs to remember what is \n     the \"active\" widget). to do so they need a unique ID. unique ID are typically derived from a string label, an integer index or a pointer.\n\n       Button(\"OK\");        // Label = \"OK\",     ID = hash of \"OK\"\n       Button(\"Cancel\");    // Label = \"Cancel\", ID = hash of \"Cancel\"\n\n   - ID are uniquely scoped within windows, tree nodes, etc. so no conflict can happen if you have two buttons called \"OK\"\n     in two different windows or in two different locations of a tree.\n\n   - If you have a same ID twice in the same location, you'll have a conflict:\n\n       Button(\"OK\");\n       Button(\"OK\");           // ID collision! Both buttons will be treated as the same.\n\n     Fear not! this is easy to solve and there are many ways to solve it!\n\n   - When passing a label you can optionally specify extra unique ID information within string itself. \n     This helps solving the simpler collision cases. Use \"##\" to pass a complement to the ID that won't be visible to the end-user:\n\n       Button(\"Play\");         // Label = \"Play\",   ID = hash of \"Play\"\n       Button(\"Play##foo1\");   // Label = \"Play\",   ID = hash of \"Play##foo1\" (different from above)\n       Button(\"Play##foo2\");   // Label = \"Play\",   ID = hash of \"Play##foo2\" (different from above)\n\n   - If you want to completely hide the label, but still need an ID:\n\n       Checkbox(\"##On\", &b);   // Label = \"\",       ID = hash of \"##On\" (no label!)\n\n   - Occasionally/rarely you might want change a label while preserving a constant ID. This allows you to animate labels.\n     For example you may want to include varying information in a window title bar (and windows are uniquely identified by their ID.. obviously)\n     Use \"###\" to pass a label that isn't part of ID:\n\n       Button(\"Hello###ID\";   // Label = \"Hello\",  ID = hash of \"ID\"\n       Button(\"World###ID\";   // Label = \"World\",  ID = hash of \"ID\" (same as above)\n\n       sprintf(buf, \"My game (%f FPS)###MyGame\");\n       Begin(buf);            // Variable label,   ID = hash of \"MyGame\"\n\n   - Use PushID() / PopID() to create scopes and avoid ID conflicts within the same Window.\n     This is the most convenient way of distinguishing ID if you are iterating and creating many UI elements.\n     You can push a pointer, a string or an integer value. Remember that ID are formed from the concatenation of everything in the ID stack!\n\n       for (int i = 0; i < 100; i++)\n       {\n         PushID(i);\n         Button(\"Click\");   // Label = \"Click\",  ID = hash of integer + \"label\" (unique)\n         PopID();\n       }\n\n       for (int i = 0; i < 100; i++)\n       {\n         MyObject* obj = Objects[i];\n         PushID(obj);\n         Button(\"Click\");   // Label = \"Click\",  ID = hash of pointer + \"label\" (unique)\n         PopID();\n       }\n\n       for (int i = 0; i < 100; i++)\n       {\n         MyObject* obj = Objects[i];\n         PushID(obj->Name);\n         Button(\"Click\");   // Label = \"Click\",  ID = hash of string + \"label\" (unique)\n         PopID();\n       }\n\n   - More example showing that you can stack multiple prefixes into the ID stack:\n\n       Button(\"Click\");     // Label = \"Click\",  ID = hash of \"Click\"\n       PushID(\"node\");\n       Button(\"Click\");     // Label = \"Click\",  ID = hash of \"node\" + \"Click\"\n         PushID(my_ptr);\n           Button(\"Click\"); // Label = \"Click\",  ID = hash of \"node\" + ptr + \"Click\"\n         PopID();\n       PopID();\n\n   - Tree nodes implicitly creates a scope for you by calling PushID().\n\n       Button(\"Click\");     // Label = \"Click\",  ID = hash of \"Click\"\n       if (TreeNode(\"node\"))\n       {\n         Button(\"Click\");   // Label = \"Click\",  ID = hash of \"node\" + \"Click\"\n         TreePop();\n       }\n\n   - When working with trees, ID are used to preserve the open/close state of each tree node.\n     Depending on your use cases you may want to use strings, indices or pointers as ID.\n      e.g. when displaying a single object that may change over time (dynamic 1-1 relationship), using a static string as ID will preserve your\n       node open/closed state when the targeted object change.\n      e.g. when displaying a list of objects, using indices or pointers as ID will preserve the node open/closed state differently. \n       experiment and see what makes more sense!\n\n Q: How can I tell when Dear ImGui wants my mouse/keyboard inputs VS when I can pass them to my application?\n A: You can read the 'io.WantCaptureMouse'/'io.WantCaptureKeyboard'/'ioWantTextInput' flags from the ImGuiIO structure. \n    - When 'io.WantCaptureMouse' or 'io.WantCaptureKeyboard' flags are set you may want to discard/hide the inputs from the rest of your application.\n    - When 'io.WantTextInput' is set to may want to notify your OS to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS).\n    Preferably read the flags after calling ImGui::NewFrame() to avoid them lagging by one frame. But reading those flags before calling NewFrame() is\n    also generally ok, as the bool toggles fairly rarely and you don't generally expect to interact with either Dear ImGui or your application during\n    the same frame when that transition occurs. Dear ImGui is tracking dragging and widget activity that may occur outside the boundary of a window, \n    so 'io.WantCaptureMouse' is more accurate and correct than checking if a window is hovered. \n    (Advanced note: text input releases focus on Return 'KeyDown', so the following Return 'KeyUp' event that your application receive will typically \n     have 'io.WantCaptureKeyboard=false'. Depending on your application logic it may or not be inconvenient. You might want to track which key-downs\n     were for Dear ImGui, e.g. with an array of bool, and filter out the corresponding key-ups.)\n\n Q: How can I load a different font than the default? (default is an embedded version of ProggyClean.ttf, rendered at size 13)\n A: Use the font atlas to load the TTF/OTF file you want:\n\n      ImGuiIO& io = ImGui::GetIO();\n      io.Fonts->AddFontFromFileTTF(\"myfontfile.ttf\", size_in_pixels);\n      io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()\n\n Q: How can I easily use icons in my application?\n A: The most convenient and practical way is to merge an icon font such as FontAwesome inside you main font. Then you can refer to icons within your \n    strings. Read 'How can I load multiple fonts?' and the file 'extra_fonts/README.txt' for instructions and useful header files.\n\n Q: How can I load multiple fonts?\n A: Use the font atlas to pack them into a single texture:\n    (Read extra_fonts/README.txt and the code in ImFontAtlas for more details.)\n\n      ImGuiIO& io = ImGui::GetIO();\n      ImFont* font0 = io.Fonts->AddFontDefault();\n      ImFont* font1 = io.Fonts->AddFontFromFileTTF(\"myfontfile.ttf\", size_in_pixels);\n      ImFont* font2 = io.Fonts->AddFontFromFileTTF(\"myfontfile2.ttf\", size_in_pixels);\n      io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()\n      // the first loaded font gets used by default\n      // use ImGui::PushFont()/ImGui::PopFont() to change the font at runtime\n\n      // Options\n      ImFontConfig config;\n      config.OversampleH = 3;\n      config.OversampleV = 1;\n      config.GlyphOffset.y -= 2.0f;      // Move everything by 2 pixels up\n      config.GlyphExtraSpacing.x = 1.0f; // Increase spacing between characters\n      io.Fonts->LoadFromFileTTF(\"myfontfile.ttf\", size_pixels, &config);\n\n      // Combine multiple fonts into one (e.g. for icon fonts)\n      ImWchar ranges[] = { 0xf000, 0xf3ff, 0 };\n      ImFontConfig config;\n      config.MergeMode = true;\n      io.Fonts->AddFontDefault();\n      io.Fonts->LoadFromFileTTF(\"fontawesome-webfont.ttf\", 16.0f, &config, ranges); // Merge icon font\n      io.Fonts->LoadFromFileTTF(\"myfontfile.ttf\", size_pixels, NULL, &config, io.Fonts->GetGlyphRangesJapanese()); // Merge japanese glyphs\n\n Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?\n A: When loading a font, pass custom Unicode ranges to specify the glyphs to load. \n\n      // Add default Japanese ranges\n      io.Fonts->AddFontFromFileTTF(\"myfontfile.ttf\", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());\n   \n      // Or create your own custom ranges (e.g. for a game you can feed your entire game script and only build the characters the game need)\n      ImVector<ImWchar> ranges;\n      ImFontAtlas::GlyphRangesBuilder builder;\n      builder.AddText(\"Hello world\");                        // Add a string (here \"Hello world\" contains 7 unique characters)\n      builder.AddChar(0x7262);                               // Add a specific character\n      builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges\n      builder.BuildRanges(&ranges);                          // Build the final result (ordered ranges with all the unique characters submitted)\n      io.Fonts->AddFontFromFileTTF(\"myfontfile.ttf\", size_in_pixels, NULL, ranges.Data);\n\n    All your strings needs to use UTF-8 encoding. In C++11 you can encode a string literal in UTF-8 by using the u8\"hello\" syntax. \n    Specifying literal in your source code using a local code page (such as CP-923 for Japanese or CP-1251 for Cyrillic) will NOT work!\n    Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.\n\n    Text input: it is up to your application to pass the right character code to io.AddInputCharacter(). The applications in examples/ are doing that.\n    For languages using IME, on Windows you can copy the Hwnd of your application to io.ImeWindowHandle.\n    The default implementation of io.ImeSetInputScreenPosFn() on Windows will set your IME position correctly.\n\n Q: How can I preserve my Dear ImGui context across reloading a DLL? (loss of the global/static variables)\n A: Create your own context 'ctx = CreateContext()' + 'SetCurrentContext(ctx)' and your own font atlas 'ctx->GetIO().Fonts = new ImFontAtlas()' \n    so you don't rely on the default globals.\n\n Q: How can I use the drawing facilities without an ImGui window? (using ImDrawList API)\n A: The easiest way is to create a dummy window. Call Begin() with NoTitleBar|NoResize|NoMove|NoScrollbar|NoSavedSettings|NoInputs flag, \n    zero background alpha, then retrieve the ImDrawList* via GetWindowDrawList() and draw to it in any way you like.\n    You can also perfectly create a standalone ImDrawList instance _but_ you need ImGui to be initialized because ImDrawList pulls from ImGui \n    data to retrieve the coordinates of the white pixel.\n\n - tip: you can call Begin() multiple times with the same name during the same frame, it will keep appending to the same window. \n   this is also useful to set yourself in the context of another window (to get/set other settings)\n - tip: you can create widgets without a Begin()/End() block, they will go in an implicit window called \"Debug\".\n - tip: the ImGuiOnceUponAFrame helper will allow run the block of code only once a frame. You can use it to quickly add custom UI in the middle\n   of a deep nested inner loop in your code.\n - tip: you can call Render() multiple times (e.g for VR renders).\n - tip: call and read the ShowTestWindow() code in imgui_demo.cpp for more example of how to use ImGui!\n\n*/\n\n#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include \"imgui.h\"\n#define IMGUI_DEFINE_MATH_OPERATORS\n#define IMGUI_DEFINE_PLACEMENT_NEW\n#include \"imgui_internal.h\"\n\n#include <ctype.h>      // toupper, isprint\n#include <stdlib.h>     // NULL, malloc, free, qsort, atoi\n#include <stdio.h>      // vsnprintf, sscanf, printf\n#include <limits.h>     // INT_MIN, INT_MAX\n#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier\n#include <stddef.h>     // intptr_t\n#else\n#include <stdint.h>     // intptr_t\n#endif\n\n#ifdef _MSC_VER\n#pragma warning (disable: 4127) // condition expression is constant\n#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff)\n#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen\n#endif\n\n// Clang warnings with -Weverything\n#ifdef __clang__\n#pragma clang diagnostic ignored \"-Wunknown-pragmas\"        // warning : unknown warning group '-Wformat-pedantic *'        // not all warnings are known by all clang versions.. so ignoring warnings triggers new warnings on some configuration. great!\n#pragma clang diagnostic ignored \"-Wold-style-cast\"         // warning : use of old-style cast                              // yes, they are more terse.\n#pragma clang diagnostic ignored \"-Wfloat-equal\"            // warning : comparing floating point with == or != is unsafe   // storing and comparing against same constants (typically 0.0f) is ok.\n#pragma clang diagnostic ignored \"-Wformat-nonliteral\"      // warning : format string is not a string literal              // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code.\n#pragma clang diagnostic ignored \"-Wexit-time-destructors\"  // warning : declaration requires an exit-time destructor       // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals.\n#pragma clang diagnostic ignored \"-Wglobal-constructors\"    // warning : declaration requires a global destructor           // similar to above, not sure what the exact difference it.\n#pragma clang diagnostic ignored \"-Wsign-conversion\"        // warning : implicit conversion changes signedness             //\n#pragma clang diagnostic ignored \"-Wformat-pedantic\"        // warning : format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic. \n#pragma clang diagnostic ignored \"-Wint-to-void-pointer-cast\" // warning : cast to 'void *' from smaller integer type 'int' //\n#elif defined(__GNUC__)\n#pragma GCC diagnostic ignored \"-Wunused-function\"          // warning: 'xxxx' defined but not used\n#pragma GCC diagnostic ignored \"-Wint-to-pointer-cast\"      // warning: cast to pointer from integer of different size\n#pragma GCC diagnostic ignored \"-Wformat\"                   // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*'\n#pragma GCC diagnostic ignored \"-Wdouble-promotion\"         // warning: implicit conversion from 'float' to 'double' when passing argument to function\n#pragma GCC diagnostic ignored \"-Wconversion\"               // warning: conversion to 'xxxx' from 'xxxx' may alter its value\n#pragma GCC diagnostic ignored \"-Wcast-qual\"                // warning: cast from type 'xxxx' to type 'xxxx' casts away qualifiers\n#pragma GCC diagnostic ignored \"-Wformat-nonliteral\"        // warning: format not a string literal, format string not checked\n#endif\n\n//-------------------------------------------------------------------------\n// Forward Declarations\n//-------------------------------------------------------------------------\n\nstatic float            GetDraggedColumnOffset(int column_index);\n\nstatic bool             IsKeyPressedMap(ImGuiKey key, bool repeat = true);\n\nstatic ImFont*          GetDefaultFont();\nstatic void             SetCurrentFont(ImFont* font);\nstatic void             SetCurrentWindow(ImGuiWindow* window);\nstatic void             SetWindowScrollY(ImGuiWindow* window, float new_scroll_y);\nstatic void             SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond);\nstatic void             SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond);\nstatic void             SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond);\nstatic ImGuiWindow*     FindHoveredWindow(ImVec2 pos);\nstatic ImGuiWindow*     CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags);\nstatic void             ClearSetNextWindowData();\nstatic void             CheckStacksSize(ImGuiWindow* window, bool write);\nstatic ImVec2           CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window);\n\nstatic void             AddDrawListToRenderList(ImVector<ImDrawList*>& out_render_list, ImDrawList* draw_list);\nstatic void             AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiWindow* window);\nstatic void             AddWindowToSortedBuffer(ImVector<ImGuiWindow*>& out_sorted_windows, ImGuiWindow* window);\n\nstatic ImGuiIniData*    FindWindowSettings(const char* name);\nstatic ImGuiIniData*    AddWindowSettings(const char* name);\nstatic void             LoadIniSettingsFromDisk(const char* ini_filename);\nstatic void             SaveIniSettingsToDisk(const char* ini_filename);\nstatic void             MarkIniSettingsDirty(ImGuiWindow* window);\n\nstatic ImRect           GetVisibleRect();\n\nstatic void             CloseInactivePopups(ImGuiWindow* ref_window);\nstatic void             ClosePopupToLevel(int remaining);\nstatic ImGuiWindow*     GetFrontMostModalRootWindow();\nstatic ImVec2           FindBestPopupWindowPos(const ImVec2& base_pos, const ImVec2& size, int* last_dir, const ImRect& rect_to_avoid);\n\nstatic bool             InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data);\nstatic int              InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);\nstatic ImVec2           InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);\n\nstatic inline void      DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, const char* display_format, char* buf, int buf_size);\nstatic inline void      DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, int decimal_precision, char* buf, int buf_size);\nstatic void             DataTypeApplyOp(ImGuiDataType data_type, int op, void* value1, const void* value2);\nstatic bool             DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* scalar_format);\n\nnamespace ImGui\n{\nstatic void             FocusPreviousWindow();\n}\n\n//-----------------------------------------------------------------------------\n// Platform dependent default implementations\n//-----------------------------------------------------------------------------\n\nstatic const char*      GetClipboardTextFn_DefaultImpl(void* user_data);\nstatic void             SetClipboardTextFn_DefaultImpl(void* user_data, const char* text);\nstatic void             ImeSetInputScreenPosFn_DefaultImpl(int x, int y);\n\n//-----------------------------------------------------------------------------\n// Context\n//-----------------------------------------------------------------------------\n\n// Default font atlas storage.\n// New contexts always point by default to this font atlas. It can be changed by reassigning the GetIO().Fonts variable.\nstatic ImFontAtlas      GImDefaultFontAtlas;\n\n// Default context storage + current context pointer.\n// Implicitely used by all ImGui functions. Always assumed to be != NULL. Change to a different context by calling ImGui::SetCurrentContext()\n// If you are hot-reloading this code in a DLL you will lose the static/global variables. Create your own context+font atlas instead of relying on those default (see FAQ entry \"How can I preserve my ImGui context across reloading a DLL?\").\n// ImGui is currently not thread-safe because of this variable. If you want thread-safety to allow N threads to access N different contexts, you might work around it by:\n// - Having multiple instances of the ImGui code compiled inside different namespace (easiest/safest, if you have a finite number of contexts)\n// - or: Changing this variable to be TLS. You may #define GImGui in imconfig.h for further custom hackery. Future development aim to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586\n#ifndef GImGui\nstatic ImGuiContext     GImDefaultContext;\nImGuiContext*           GImGui = &GImDefaultContext;\n#endif\n\n//-----------------------------------------------------------------------------\n// User facing structures\n//-----------------------------------------------------------------------------\n\nImGuiStyle::ImGuiStyle()\n{\n    Alpha                   = 1.0f;             // Global alpha applies to everything in ImGui\n    WindowPadding           = ImVec2(8,8);      // Padding within a window\n    WindowRounding          = 9.0f;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows\n    WindowBorderSize        = 0.0f;             // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested.\n    WindowMinSize           = ImVec2(32,32);    // Minimum window size\n    WindowTitleAlign        = ImVec2(0.0f,0.5f);// Alignment for title bar text\n    ChildRounding           = 0.0f;             // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows\n    ChildBorderSize         = 1.0f;             // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested.\n    PopupRounding           = 0.0f;             // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows\n    PopupBorderSize         = 1.0f;             // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested.\n    FramePadding            = ImVec2(4,3);      // Padding within a framed rectangle (used by most widgets)\n    FrameRounding           = 0.0f;             // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets).\n    FrameBorderSize         = 0.0f;             // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested.\n    ItemSpacing             = ImVec2(8,4);      // Horizontal and vertical spacing between widgets/lines\n    ItemInnerSpacing        = ImVec2(4,4);      // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)\n    TouchExtraPadding       = ImVec2(0,0);      // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!\n    IndentSpacing           = 21.0f;            // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).\n    ColumnsMinSpacing       = 6.0f;             // Minimum horizontal spacing between two columns\n    ScrollbarSize           = 16.0f;            // Width of the vertical scrollbar, Height of the horizontal scrollbar\n    ScrollbarRounding       = 9.0f;             // Radius of grab corners rounding for scrollbar\n    GrabMinSize             = 10.0f;            // Minimum width/height of a grab box for slider/scrollbar\n    GrabRounding            = 0.0f;             // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.\n    ButtonTextAlign         = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text.\n    DisplayWindowPadding    = ImVec2(22,22);    // Window positions are clamped to be visible within the display area by at least this amount. Only covers regular windows.\n    DisplaySafeAreaPadding  = ImVec2(4,4);      // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows.\n    AntiAliasedLines        = true;             // Enable anti-aliasing on lines/borders. Disable if you are really short on CPU/GPU.\n    AntiAliasedShapes       = true;             // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.)\n    CurveTessellationTol    = 1.25f;            // Tessellation tolerance. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.\n\n    ImGui::StyleColorsClassic(this);\n}\n\n// To scale your entire UI (e.g. if you want your app to use High DPI or generally be DPI aware) you may use this helper function. Scaling the fonts is done separately and is up to you.\n// Important: This operation is lossy because we round all sizes to integer. If you need to change your scale multiples, call this over a freshly initialized ImGuiStyle structure rather than scaling multiple times.\nvoid ImGuiStyle::ScaleAllSizes(float scale_factor)\n{\n    WindowPadding = ImFloor(WindowPadding * scale_factor);\n    WindowRounding = ImFloor(WindowRounding * scale_factor);\n    WindowMinSize = ImFloor(WindowMinSize * scale_factor);\n    ChildRounding = ImFloor(ChildRounding * scale_factor);\n    PopupRounding = ImFloor(PopupRounding * scale_factor);\n    FramePadding = ImFloor(FramePadding * scale_factor);\n    FrameRounding = ImFloor(FrameRounding * scale_factor);\n    ItemSpacing = ImFloor(ItemSpacing * scale_factor);\n    ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor);\n    TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor);\n    IndentSpacing = ImFloor(IndentSpacing * scale_factor);\n    ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor);\n    ScrollbarSize = ImFloor(ScrollbarSize * scale_factor);\n    ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor);\n    GrabMinSize = ImFloor(GrabMinSize * scale_factor);\n    GrabRounding = ImFloor(GrabRounding * scale_factor);\n    DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor);\n    DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor);\n}\n\nImGuiIO::ImGuiIO()\n{\n    // Most fields are initialized with zero\n    memset(this, 0, sizeof(*this));\n\n    // Settings\n    DisplaySize = ImVec2(-1.0f, -1.0f);\n    DeltaTime = 1.0f/60.0f;\n    IniSavingRate = 5.0f;\n    IniFilename = \"imgui.ini\";\n    LogFilename = \"imgui_log.txt\";\n    MouseDoubleClickTime = 0.30f;\n    MouseDoubleClickMaxDist = 6.0f;\n    for (int i = 0; i < ImGuiKey_COUNT; i++)\n        KeyMap[i] = -1;\n    KeyRepeatDelay = 0.250f;\n    KeyRepeatRate = 0.050f;\n    UserData = NULL;\n\n    Fonts = &GImDefaultFontAtlas;\n    FontGlobalScale = 1.0f;\n    FontDefault = NULL;\n    FontAllowUserScaling = false;\n    DisplayFramebufferScale = ImVec2(1.0f, 1.0f);\n    DisplayVisibleMin = DisplayVisibleMax = ImVec2(0.0f, 0.0f);\n\n    // Advanced/subtle behaviors\n#ifdef __APPLE__\n    OptMacOSXBehaviors = true;  // Set Mac OS X style defaults based on __APPLE__ compile time flag\n#else\n    OptMacOSXBehaviors = false;\n#endif\n    OptCursorBlink = true;\n                                \n    // Settings (User Functions)\n    RenderDrawListsFn = NULL;\n    MemAllocFn = malloc;\n    MemFreeFn = free;\n    GetClipboardTextFn = GetClipboardTextFn_DefaultImpl;   // Platform dependent default implementations\n    SetClipboardTextFn = SetClipboardTextFn_DefaultImpl;\n    ClipboardUserData = NULL;\n    ImeSetInputScreenPosFn = ImeSetInputScreenPosFn_DefaultImpl;\n    ImeWindowHandle = NULL;\n\n    // Input (NB: we already have memset zero the entire structure)\n    MousePos = ImVec2(-FLT_MAX, -FLT_MAX);\n    MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX);\n    MouseDragThreshold = 6.0f;\n    for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f;\n    for (int i = 0; i < IM_ARRAYSIZE(KeysDownDuration); i++) KeysDownDuration[i] = KeysDownDurationPrev[i] = -1.0f;\n}\n\n// Pass in translated ASCII characters for text input.\n// - with glfw you can get those from the callback set in glfwSetCharCallback()\n// - on Windows you can get those using ToAscii+keyboard state, or via the WM_CHAR message\nvoid ImGuiIO::AddInputCharacter(ImWchar c)\n{\n    const int n = ImStrlenW(InputCharacters);\n    if (n + 1 < IM_ARRAYSIZE(InputCharacters))\n    {\n        InputCharacters[n] = c;\n        InputCharacters[n+1] = '\\0';\n    }\n}\n\nvoid ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars)\n{\n    // We can't pass more wchars than ImGuiIO::InputCharacters[] can hold so don't convert more\n    const int wchars_buf_len = sizeof(ImGuiIO::InputCharacters) / sizeof(ImWchar);\n    ImWchar wchars[wchars_buf_len];\n    ImTextStrFromUtf8(wchars, wchars_buf_len, utf8_chars, NULL);\n    for (int i = 0; i < wchars_buf_len && wchars[i] != 0; i++)\n        AddInputCharacter(wchars[i]);\n}\n\n//-----------------------------------------------------------------------------\n// HELPERS\n//-----------------------------------------------------------------------------\n\n#define IM_F32_TO_INT8_UNBOUND(_VAL)    ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f)))   // Unsaturated, for display purpose \n#define IM_F32_TO_INT8_SAT(_VAL)        ((int)(ImSaturate(_VAL) * 255.0f + 0.5f))               // Saturated, always output 0..255\n\n// Play it nice with Windows users. Notepad in 2015 still doesn't display text data with Unix-style \\n.\n#ifdef _WIN32\n#define IM_NEWLINE \"\\r\\n\"\n#else\n#define IM_NEWLINE \"\\n\"\n#endif\n\nImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p)\n{\n    ImVec2 ap = p - a;\n    ImVec2 ab_dir = b - a;\n    float ab_len = sqrtf(ab_dir.x * ab_dir.x + ab_dir.y * ab_dir.y);\n    ab_dir *= 1.0f / ab_len;\n    float dot = ap.x * ab_dir.x + ap.y * ab_dir.y;\n    if (dot < 0.0f)\n        return a;\n    if (dot > ab_len)\n        return b;\n    return a + ab_dir * dot;\n}\n\nbool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p)\n{\n    bool b1 = ((p.x - b.x) * (a.y - b.y) - (p.y - b.y) * (a.x - b.x)) < 0.0f;\n    bool b2 = ((p.x - c.x) * (b.y - c.y) - (p.y - c.y) * (b.x - c.x)) < 0.0f;\n    bool b3 = ((p.x - a.x) * (c.y - a.y) - (p.y - a.y) * (c.x - a.x)) < 0.0f;\n    return ((b1 == b2) && (b2 == b3));\n}\n\nvoid ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w)\n{\n    ImVec2 v0 = b - a;\n    ImVec2 v1 = c - a;\n    ImVec2 v2 = p - a;\n    const float denom = v0.x * v1.y - v1.x * v0.y;\n    out_v = (v2.x * v1.y - v1.x * v2.y) / denom;\n    out_w = (v0.x * v2.y - v2.x * v0.y) / denom;\n    out_u = 1.0f - out_v - out_w;\n}\n\nImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p)\n{\n    ImVec2 proj_ab = ImLineClosestPoint(a, b, p);\n    ImVec2 proj_bc = ImLineClosestPoint(b, c, p);\n    ImVec2 proj_ca = ImLineClosestPoint(c, a, p);\n    float dist2_ab = ImLengthSqr(p - proj_ab);\n    float dist2_bc = ImLengthSqr(p - proj_bc);\n    float dist2_ca = ImLengthSqr(p - proj_ca);\n    float m = ImMin(dist2_ab, ImMin(dist2_bc, dist2_ca));\n    if (m == dist2_ab)\n        return proj_ab;\n    if (m == dist2_bc)\n        return proj_bc;\n    return proj_ca;\n}\n\nint ImStricmp(const char* str1, const char* str2)\n{\n    int d;\n    while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; }\n    return d;\n}\n\nint ImStrnicmp(const char* str1, const char* str2, int count)\n{\n    int d = 0;\n    while (count > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; count--; }\n    return d;\n}\n\nvoid ImStrncpy(char* dst, const char* src, int count)\n{\n    if (count < 1) return;\n    strncpy(dst, src, (size_t)count);\n    dst[count-1] = 0;\n}\n\nchar* ImStrdup(const char *str)\n{\n    size_t len = strlen(str) + 1;\n    void* buff = ImGui::MemAlloc(len);\n    return (char*)memcpy(buff, (const void*)str, len);\n}\n\nint ImStrlenW(const ImWchar* str)\n{\n    int n = 0;\n    while (*str++) n++;\n    return n;\n}\n\nconst ImWchar* ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin) // find beginning-of-line\n{\n    while (buf_mid_line > buf_begin && buf_mid_line[-1] != '\\n')\n        buf_mid_line--;\n    return buf_mid_line;\n}\n\nconst char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end)\n{\n    if (!needle_end)\n        needle_end = needle + strlen(needle);\n\n    const char un0 = (char)toupper(*needle);\n    while ((!haystack_end && *haystack) || (haystack_end && haystack < haystack_end))\n    {\n        if (toupper(*haystack) == un0)\n        {\n            const char* b = needle + 1;\n            for (const char* a = haystack + 1; b < needle_end; a++, b++)\n                if (toupper(*a) != toupper(*b))\n                    break;\n            if (b == needle_end)\n                return haystack;\n        }\n        haystack++;\n    }\n    return NULL;\n}\n\nstatic const char* ImAtoi(const char* src, int* output)\n{\n    int negative = 0;\n    if (*src == '-') { negative = 1; src++; }\n    if (*src == '+') { src++; }\n    int v = 0;\n    while (*src >= '0' && *src <= '9')\n        v = (v * 10) + (*src++ - '0');\n    *output = negative ? -v : v;\n    return src;\n}\n\n// A) MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size). \n// Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm.\n// B) When buf==NULL vsnprintf() will return the output size.\n#ifndef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS\nint ImFormatString(char* buf, int buf_size, const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    int w = vsnprintf(buf, buf_size, fmt, args);\n    va_end(args);\n    if (buf == NULL)\n        return w;\n    if (w == -1 || w >= buf_size)\n        w = buf_size - 1;\n    buf[w] = 0;\n    return w;\n}\n\nint ImFormatStringV(char* buf, int buf_size, const char* fmt, va_list args)\n{\n    int w = vsnprintf(buf, buf_size, fmt, args);\n    if (buf == NULL)\n        return w;\n    if (w == -1 || w >= buf_size)\n        w = buf_size - 1;\n    buf[w] = 0;\n    return w;\n}\n#endif // #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS\n\n// Pass data_size==0 for zero-terminated strings\n// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.\nImU32 ImHash(const void* data, int data_size, ImU32 seed)\n{\n    static ImU32 crc32_lut[256] = { 0 };\n    if (!crc32_lut[1])\n    {\n        const ImU32 polynomial = 0xEDB88320;\n        for (ImU32 i = 0; i < 256; i++)\n        {\n            ImU32 crc = i;\n            for (ImU32 j = 0; j < 8; j++)\n                crc = (crc >> 1) ^ (ImU32(-int(crc & 1)) & polynomial);\n            crc32_lut[i] = crc;\n        }\n    }\n\n    seed = ~seed;\n    ImU32 crc = seed;\n    const unsigned char* current = (const unsigned char*)data;\n\n    if (data_size > 0)\n    {\n        // Known size\n        while (data_size--)\n            crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *current++];\n    }\n    else\n    {\n        // Zero-terminated string\n        while (unsigned char c = *current++)\n        {\n            // We support a syntax of \"label###id\" where only \"###id\" is included in the hash, and only \"label\" gets displayed.\n            // Because this syntax is rarely used we are optimizing for the common case.\n            // - If we reach ### in the string we discard the hash so far and reset to the seed.\n            // - We don't do 'current += 2; continue;' after handling ### to keep the code smaller.\n            if (c == '#' && current[0] == '#' && current[1] == '#')\n                crc = seed;\n            crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c];\n        }\n    }\n    return ~crc;\n}\n\n//-----------------------------------------------------------------------------\n// ImText* helpers\n//-----------------------------------------------------------------------------\n\n// Convert UTF-8 to 32-bits character, process single character input.\n// Based on stb_from_utf8() from github.com/nothings/stb/\n// We handle UTF-8 decoding error by skipping forward.\nint ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end)\n{\n    unsigned int c = (unsigned int)-1;\n    const unsigned char* str = (const unsigned char*)in_text;\n    if (!(*str & 0x80))\n    {\n        c = (unsigned int)(*str++);\n        *out_char = c;\n        return 1;\n    }\n    if ((*str & 0xe0) == 0xc0)\n    {\n        *out_char = 0xFFFD; // will be invalid but not end of string\n        if (in_text_end && in_text_end - (const char*)str < 2) return 1;\n        if (*str < 0xc2) return 2;\n        c = (unsigned int)((*str++ & 0x1f) << 6);\n        if ((*str & 0xc0) != 0x80) return 2;\n        c += (*str++ & 0x3f);\n        *out_char = c;\n        return 2;\n    }\n    if ((*str & 0xf0) == 0xe0)\n    {\n        *out_char = 0xFFFD; // will be invalid but not end of string\n        if (in_text_end && in_text_end - (const char*)str < 3) return 1;\n        if (*str == 0xe0 && (str[1] < 0xa0 || str[1] > 0xbf)) return 3;\n        if (*str == 0xed && str[1] > 0x9f) return 3; // str[1] < 0x80 is checked below\n        c = (unsigned int)((*str++ & 0x0f) << 12);\n        if ((*str & 0xc0) != 0x80) return 3;\n        c += (unsigned int)((*str++ & 0x3f) << 6);\n        if ((*str & 0xc0) != 0x80) return 3;\n        c += (*str++ & 0x3f);\n        *out_char = c;\n        return 3;\n    }\n    if ((*str & 0xf8) == 0xf0)\n    {\n        *out_char = 0xFFFD; // will be invalid but not end of string\n        if (in_text_end && in_text_end - (const char*)str < 4) return 1;\n        if (*str > 0xf4) return 4;\n        if (*str == 0xf0 && (str[1] < 0x90 || str[1] > 0xbf)) return 4;\n        if (*str == 0xf4 && str[1] > 0x8f) return 4; // str[1] < 0x80 is checked below\n        c = (unsigned int)((*str++ & 0x07) << 18);\n        if ((*str & 0xc0) != 0x80) return 4;\n        c += (unsigned int)((*str++ & 0x3f) << 12);\n        if ((*str & 0xc0) != 0x80) return 4;\n        c += (unsigned int)((*str++ & 0x3f) << 6);\n        if ((*str & 0xc0) != 0x80) return 4;\n        c += (*str++ & 0x3f);\n        // utf-8 encodings of values used in surrogate pairs are invalid\n        if ((c & 0xFFFFF800) == 0xD800) return 4;\n        *out_char = c;\n        return 4;\n    }\n    *out_char = 0;\n    return 0;\n}\n\nint ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_text_remaining)\n{\n    ImWchar* buf_out = buf;\n    ImWchar* buf_end = buf + buf_size;\n    while (buf_out < buf_end-1 && (!in_text_end || in_text < in_text_end) && *in_text)\n    {\n        unsigned int c;\n        in_text += ImTextCharFromUtf8(&c, in_text, in_text_end);\n        if (c == 0)\n            break;\n        if (c < 0x10000)    // FIXME: Losing characters that don't fit in 2 bytes\n            *buf_out++ = (ImWchar)c;\n    }\n    *buf_out = 0;\n    if (in_text_remaining)\n        *in_text_remaining = in_text;\n    return (int)(buf_out - buf);\n}\n\nint ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end)\n{\n    int char_count = 0;\n    while ((!in_text_end || in_text < in_text_end) && *in_text)\n    {\n        unsigned int c;\n        in_text += ImTextCharFromUtf8(&c, in_text, in_text_end);\n        if (c == 0)\n            break;\n        if (c < 0x10000)\n            char_count++;\n    }\n    return char_count;\n}\n\n// Based on stb_to_utf8() from github.com/nothings/stb/\nstatic inline int ImTextCharToUtf8(char* buf, int buf_size, unsigned int c)\n{\n    if (c < 0x80)\n    {\n        buf[0] = (char)c;\n        return 1;\n    }\n    if (c < 0x800)\n    {\n        if (buf_size < 2) return 0;\n        buf[0] = (char)(0xc0 + (c >> 6));\n        buf[1] = (char)(0x80 + (c & 0x3f));\n        return 2;\n    }\n    if (c >= 0xdc00 && c < 0xe000)\n    {\n        return 0;\n    }\n    if (c >= 0xd800 && c < 0xdc00)\n    {\n        if (buf_size < 4) return 0;\n        buf[0] = (char)(0xf0 + (c >> 18));\n        buf[1] = (char)(0x80 + ((c >> 12) & 0x3f));\n        buf[2] = (char)(0x80 + ((c >> 6) & 0x3f));\n        buf[3] = (char)(0x80 + ((c ) & 0x3f));\n        return 4;\n    }\n    //else if (c < 0x10000)\n    {\n        if (buf_size < 3) return 0;\n        buf[0] = (char)(0xe0 + (c >> 12));\n        buf[1] = (char)(0x80 + ((c>> 6) & 0x3f));\n        buf[2] = (char)(0x80 + ((c ) & 0x3f));\n        return 3;\n    }\n}\n\nstatic inline int ImTextCountUtf8BytesFromChar(unsigned int c)\n{\n    if (c < 0x80) return 1;\n    if (c < 0x800) return 2;\n    if (c >= 0xdc00 && c < 0xe000) return 0;\n    if (c >= 0xd800 && c < 0xdc00) return 4;\n    return 3;\n}\n\nint ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end)\n{\n    char* buf_out = buf;\n    const char* buf_end = buf + buf_size;\n    while (buf_out < buf_end-1 && (!in_text_end || in_text < in_text_end) && *in_text)\n    {\n        unsigned int c = (unsigned int)(*in_text++);\n        if (c < 0x80)\n            *buf_out++ = (char)c;\n        else\n            buf_out += ImTextCharToUtf8(buf_out, (int)(buf_end-buf_out-1), c);\n    }\n    *buf_out = 0;\n    return (int)(buf_out - buf);\n}\n\nint ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end)\n{\n    int bytes_count = 0;\n    while ((!in_text_end || in_text < in_text_end) && *in_text)\n    {\n        unsigned int c = (unsigned int)(*in_text++);\n        if (c < 0x80)\n            bytes_count++;\n        else\n            bytes_count += ImTextCountUtf8BytesFromChar(c);\n    }\n    return bytes_count;\n}\n\nImVec4 ImGui::ColorConvertU32ToFloat4(ImU32 in)\n{\n    float s = 1.0f/255.0f;\n    return ImVec4(\n        ((in >> IM_COL32_R_SHIFT) & 0xFF) * s,\n        ((in >> IM_COL32_G_SHIFT) & 0xFF) * s,\n        ((in >> IM_COL32_B_SHIFT) & 0xFF) * s,\n        ((in >> IM_COL32_A_SHIFT) & 0xFF) * s);\n}\n\nImU32 ImGui::ColorConvertFloat4ToU32(const ImVec4& in)\n{\n    ImU32 out;\n    out  = ((ImU32)IM_F32_TO_INT8_SAT(in.x)) << IM_COL32_R_SHIFT;\n    out |= ((ImU32)IM_F32_TO_INT8_SAT(in.y)) << IM_COL32_G_SHIFT;\n    out |= ((ImU32)IM_F32_TO_INT8_SAT(in.z)) << IM_COL32_B_SHIFT;\n    out |= ((ImU32)IM_F32_TO_INT8_SAT(in.w)) << IM_COL32_A_SHIFT;\n    return out;\n}\n\nImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul)  \n{ \n    ImGuiStyle& style = GImGui->Style;\n    ImVec4 c = style.Colors[idx]; \n    c.w *= style.Alpha * alpha_mul; \n    return ColorConvertFloat4ToU32(c); \n}\n\nImU32 ImGui::GetColorU32(const ImVec4& col)\n{ \n    ImGuiStyle& style = GImGui->Style;\n    ImVec4 c = col; \n    c.w *= style.Alpha; \n    return ColorConvertFloat4ToU32(c); \n}\n\nconst ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx)\n{ \n    ImGuiStyle& style = GImGui->Style;\n    return style.Colors[idx];\n}\n\nImU32 ImGui::GetColorU32(ImU32 col)\n{ \n    float style_alpha = GImGui->Style.Alpha;\n    if (style_alpha >= 1.0f)\n        return col;\n    int a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT;\n    a = (int)(a * style_alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range.\n    return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT);\n}\n\n// Convert rgb floats ([0-1],[0-1],[0-1]) to hsv floats ([0-1],[0-1],[0-1]), from Foley & van Dam p592\n// Optimized http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv\nvoid ImGui::ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v)\n{\n    float K = 0.f;\n    if (g < b)\n    {\n        ImSwap(g, b);\n        K = -1.f;\n    }\n    if (r < g)\n    {\n        ImSwap(r, g);\n        K = -2.f / 6.f - K;\n    }\n\n    const float chroma = r - (g < b ? g : b);\n    out_h = fabsf(K + (g - b) / (6.f * chroma + 1e-20f));\n    out_s = chroma / (r + 1e-20f);\n    out_v = r;\n}\n\n// Convert hsv floats ([0-1],[0-1],[0-1]) to rgb floats ([0-1],[0-1],[0-1]), from Foley & van Dam p593\n// also http://en.wikipedia.org/wiki/HSL_and_HSV\nvoid ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b)\n{\n    if (s == 0.0f)\n    {\n        // gray\n        out_r = out_g = out_b = v;\n        return;\n    }\n\n    h = fmodf(h, 1.0f) / (60.0f/360.0f);\n    int   i = (int)h;\n    float f = h - (float)i;\n    float p = v * (1.0f - s);\n    float q = v * (1.0f - s * f);\n    float t = v * (1.0f - s * (1.0f - f));\n\n    switch (i)\n    {\n    case 0: out_r = v; out_g = t; out_b = p; break;\n    case 1: out_r = q; out_g = v; out_b = p; break;\n    case 2: out_r = p; out_g = v; out_b = t; break;\n    case 3: out_r = p; out_g = q; out_b = v; break;\n    case 4: out_r = t; out_g = p; out_b = v; break;\n    case 5: default: out_r = v; out_g = p; out_b = q; break;\n    }\n}\n\nFILE* ImFileOpen(const char* filename, const char* mode)\n{\n#if defined(_WIN32) && !defined(__CYGWIN__)\n    // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. Converting both strings from UTF-8 to wchar format (using a single allocation, because we can)\n    const int filename_wsize = ImTextCountCharsFromUtf8(filename, NULL) + 1;\n    const int mode_wsize = ImTextCountCharsFromUtf8(mode, NULL) + 1;\n    ImVector<ImWchar> buf;\n    buf.resize(filename_wsize + mode_wsize);\n    ImTextStrFromUtf8(&buf[0], filename_wsize, filename, NULL);\n    ImTextStrFromUtf8(&buf[filename_wsize], mode_wsize, mode, NULL);\n    return _wfopen((wchar_t*)&buf[0], (wchar_t*)&buf[filename_wsize]);\n#else\n    return fopen(filename, mode);\n#endif\n}\n\n// Load file content into memory\n// Memory allocated with ImGui::MemAlloc(), must be freed by user using ImGui::MemFree()\nvoid* ImFileLoadToMemory(const char* filename, const char* file_open_mode, int* out_file_size, int padding_bytes)\n{\n    IM_ASSERT(filename && file_open_mode);\n    if (out_file_size)\n        *out_file_size = 0;\n\n    FILE* f;\n    if ((f = ImFileOpen(filename, file_open_mode)) == NULL)\n        return NULL;\n\n    long file_size_signed;\n    if (fseek(f, 0, SEEK_END) || (file_size_signed = ftell(f)) == -1 || fseek(f, 0, SEEK_SET))\n    {\n        fclose(f);\n        return NULL;\n    }\n\n    int file_size = (int)file_size_signed;\n    void* file_data = ImGui::MemAlloc(file_size + padding_bytes);\n    if (file_data == NULL)\n    {\n        fclose(f);\n        return NULL;\n    }\n    if (fread(file_data, 1, (size_t)file_size, f) != (size_t)file_size)\n    {\n        fclose(f);\n        ImGui::MemFree(file_data);\n        return NULL;\n    }\n    if (padding_bytes > 0)\n        memset((void *)(((char*)file_data) + file_size), 0, padding_bytes);\n\n    fclose(f);\n    if (out_file_size)\n        *out_file_size = file_size;\n\n    return file_data;\n}\n\n//-----------------------------------------------------------------------------\n// ImGuiStorage\n// Helper: Key->value storage\n//-----------------------------------------------------------------------------\n\n// std::lower_bound but without the bullshit\nstatic ImVector<ImGuiStorage::Pair>::iterator LowerBound(ImVector<ImGuiStorage::Pair>& data, ImGuiID key)\n{\n    ImVector<ImGuiStorage::Pair>::iterator first = data.begin();\n    ImVector<ImGuiStorage::Pair>::iterator last = data.end();\n    size_t count = (size_t)(last - first);\n    while (count > 0)\n    {\n        size_t count2 = count >> 1;\n        ImVector<ImGuiStorage::Pair>::iterator mid = first + count2;\n        if (mid->key < key)\n        {\n            first = ++mid;\n            count -= count2 + 1;\n        }\n        else\n        {\n            count = count2;\n        }\n    }\n    return first;\n}\n\n// For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.\nvoid ImGuiStorage::BuildSortByKey()\n{\n    struct StaticFunc \n    { \n        static int PairCompareByID(const void* lhs, const void* rhs) \n        {\n            // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that.\n            if (((const Pair*)lhs)->key > ((const Pair*)rhs)->key) return +1;\n            if (((const Pair*)lhs)->key < ((const Pair*)rhs)->key) return -1;\n            return 0;\n        }\n    };\n    if (Data.Size > 1)\n        qsort(Data.Data, (size_t)Data.Size, sizeof(Pair), StaticFunc::PairCompareByID);\n}\n\nint ImGuiStorage::GetInt(ImGuiID key, int default_val) const\n{\n    ImVector<Pair>::iterator it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key);\n    if (it == Data.end() || it->key != key)\n        return default_val;\n    return it->val_i;\n}\n\nbool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const\n{\n    return GetInt(key, default_val ? 1 : 0) != 0;\n}\n\nfloat ImGuiStorage::GetFloat(ImGuiID key, float default_val) const\n{\n    ImVector<Pair>::iterator it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key);\n    if (it == Data.end() || it->key != key)\n        return default_val;\n    return it->val_f;\n}\n\nvoid* ImGuiStorage::GetVoidPtr(ImGuiID key) const\n{\n    ImVector<Pair>::iterator it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key);\n    if (it == Data.end() || it->key != key)\n        return NULL;\n    return it->val_p;\n}\n\n// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.\nint* ImGuiStorage::GetIntRef(ImGuiID key, int default_val)\n{\n    ImVector<Pair>::iterator it = LowerBound(Data, key);\n    if (it == Data.end() || it->key != key)\n        it = Data.insert(it, Pair(key, default_val));\n    return &it->val_i;\n}\n\nbool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val)\n{\n    return (bool*)GetIntRef(key, default_val ? 1 : 0);\n}\n\nfloat* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val)\n{\n    ImVector<Pair>::iterator it = LowerBound(Data, key);\n    if (it == Data.end() || it->key != key)\n        it = Data.insert(it, Pair(key, default_val));\n    return &it->val_f;\n}\n\nvoid** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val)\n{\n    ImVector<Pair>::iterator it = LowerBound(Data, key);\n    if (it == Data.end() || it->key != key)\n        it = Data.insert(it, Pair(key, default_val));\n    return &it->val_p;\n}\n\n// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame)\nvoid ImGuiStorage::SetInt(ImGuiID key, int val)\n{\n    ImVector<Pair>::iterator it = LowerBound(Data, key);\n    if (it == Data.end() || it->key != key)\n    {\n        Data.insert(it, Pair(key, val));\n        return;\n    }\n    it->val_i = val;\n}\n\nvoid ImGuiStorage::SetBool(ImGuiID key, bool val)\n{\n    SetInt(key, val ? 1 : 0);\n}\n\nvoid ImGuiStorage::SetFloat(ImGuiID key, float val)\n{\n    ImVector<Pair>::iterator it = LowerBound(Data, key);\n    if (it == Data.end() || it->key != key)\n    {\n        Data.insert(it, Pair(key, val));\n        return;\n    }\n    it->val_f = val;\n}\n\nvoid ImGuiStorage::SetVoidPtr(ImGuiID key, void* val)\n{\n    ImVector<Pair>::iterator it = LowerBound(Data, key);\n    if (it == Data.end() || it->key != key)\n    {\n        Data.insert(it, Pair(key, val));\n        return;\n    }\n    it->val_p = val;\n}\n\nvoid ImGuiStorage::SetAllInt(int v)\n{\n    for (int i = 0; i < Data.Size; i++)\n        Data[i].val_i = v;\n}\n\n//-----------------------------------------------------------------------------\n// ImGuiTextFilter\n//-----------------------------------------------------------------------------\n\n// Helper: Parse and apply text filters. In format \"aaaaa[,bbbb][,ccccc]\"\nImGuiTextFilter::ImGuiTextFilter(const char* default_filter)\n{\n    if (default_filter)\n    {\n        ImStrncpy(InputBuf, default_filter, IM_ARRAYSIZE(InputBuf));\n        Build();\n    }\n    else\n    {\n        InputBuf[0] = 0;\n        CountGrep = 0;\n    }\n}\n\nbool ImGuiTextFilter::Draw(const char* label, float width)\n{\n    if (width != 0.0f)\n        ImGui::PushItemWidth(width);\n    bool value_changed = ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf));\n    if (width != 0.0f)\n        ImGui::PopItemWidth();\n    if (value_changed)\n        Build();\n    return value_changed;\n}\n\nvoid ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>& out)\n{\n    out.resize(0);\n    const char* wb = b;\n    const char* we = wb;\n    while (we < e)\n    {\n        if (*we == separator)\n        {\n            out.push_back(TextRange(wb, we));\n            wb = we + 1;\n        }\n        we++;\n    }\n    if (wb != we)\n        out.push_back(TextRange(wb, we));\n}\n\nvoid ImGuiTextFilter::Build()\n{\n    Filters.resize(0);\n    TextRange input_range(InputBuf, InputBuf+strlen(InputBuf));\n    input_range.split(',', Filters);\n\n    CountGrep = 0;\n    for (int i = 0; i != Filters.Size; i++)\n    {\n        Filters[i].trim_blanks();\n        if (Filters[i].empty())\n            continue;\n        if (Filters[i].front() != '-')\n            CountGrep += 1;\n    }\n}\n\nbool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const\n{\n    if (Filters.empty())\n        return true;\n\n    if (text == NULL)\n        text = \"\";\n\n    for (int i = 0; i != Filters.Size; i++)\n    {\n        const TextRange& f = Filters[i];\n        if (f.empty())\n            continue;\n        if (f.front() == '-')\n        {\n            // Subtract\n            if (ImStristr(text, text_end, f.begin()+1, f.end()) != NULL)\n                return false;\n        }\n        else\n        {\n            // Grep\n            if (ImStristr(text, text_end, f.begin(), f.end()) != NULL)\n                return true;\n        }\n    }\n\n    // Implicit * grep\n    if (CountGrep == 0)\n        return true;\n\n    return false;\n}\n\n//-----------------------------------------------------------------------------\n// ImGuiTextBuffer\n//-----------------------------------------------------------------------------\n\n// On some platform vsnprintf() takes va_list by reference and modifies it.\n// va_copy is the 'correct' way to copy a va_list but Visual Studio prior to 2013 doesn't have it.\n#ifndef va_copy\n#define va_copy(dest, src) (dest = src)\n#endif\n\n// Helper: Text buffer for logging/accumulating text\nvoid ImGuiTextBuffer::appendv(const char* fmt, va_list args)\n{\n    va_list args_copy;\n    va_copy(args_copy, args);\n\n    int len = ImFormatStringV(NULL, 0, fmt, args);         // FIXME-OPT: could do a first pass write attempt, likely successful on first pass.\n    if (len <= 0)\n        return;\n\n    const int write_off = Buf.Size;\n    const int needed_sz = write_off + len;\n    if (write_off + len >= Buf.Capacity)\n    {\n        int double_capacity = Buf.Capacity * 2;\n        Buf.reserve(needed_sz > double_capacity ? needed_sz : double_capacity);\n    }\n\n    Buf.resize(needed_sz);\n    ImFormatStringV(&Buf[write_off - 1], len + 1, fmt, args_copy);\n}\n\nvoid ImGuiTextBuffer::append(const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    appendv(fmt, args);\n    va_end(args);\n}\n\n//-----------------------------------------------------------------------------\n// ImGuiSimpleColumns (internal use only)\n//-----------------------------------------------------------------------------\n\nImGuiSimpleColumns::ImGuiSimpleColumns()\n{\n    Count = 0;\n    Spacing = Width = NextWidth = 0.0f;\n    memset(Pos, 0, sizeof(Pos));\n    memset(NextWidths, 0, sizeof(NextWidths));\n}\n\nvoid ImGuiSimpleColumns::Update(int count, float spacing, bool clear)\n{\n    IM_ASSERT(Count <= IM_ARRAYSIZE(Pos));\n    Count = count;\n    Width = NextWidth = 0.0f;\n    Spacing = spacing;\n    if (clear) memset(NextWidths, 0, sizeof(NextWidths));\n    for (int i = 0; i < Count; i++)\n    {\n        if (i > 0 && NextWidths[i] > 0.0f)\n            Width += Spacing;\n        Pos[i] = (float)(int)Width;\n        Width += NextWidths[i];\n        NextWidths[i] = 0.0f;\n    }\n}\n\nfloat ImGuiSimpleColumns::DeclColumns(float w0, float w1, float w2) // not using va_arg because they promote float to double\n{\n    NextWidth = 0.0f;\n    NextWidths[0] = ImMax(NextWidths[0], w0);\n    NextWidths[1] = ImMax(NextWidths[1], w1);\n    NextWidths[2] = ImMax(NextWidths[2], w2);\n    for (int i = 0; i < 3; i++)\n        NextWidth += NextWidths[i] + ((i > 0 && NextWidths[i] > 0.0f) ? Spacing : 0.0f);\n    return ImMax(Width, NextWidth);\n}\n\nfloat ImGuiSimpleColumns::CalcExtraSpace(float avail_w)\n{\n    return ImMax(0.0f, avail_w - Width);\n}\n\n//-----------------------------------------------------------------------------\n// ImGuiListClipper\n//-----------------------------------------------------------------------------\n\nstatic void SetCursorPosYAndSetupDummyPrevLine(float pos_y, float line_height)\n{\n    // Set cursor position and a few other things so that SetScrollHere() and Columns() can work when seeking cursor. \n    // FIXME: It is problematic that we have to do that here, because custom/equivalent end-user code would stumble on the same issue. Consider moving within SetCursorXXX functions?\n    ImGui::SetCursorPosY(pos_y);\n    ImGuiWindow* window = ImGui::GetCurrentWindow();\n    window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height;      // Setting those fields so that SetScrollHere() can properly function after the end of our clipper usage.\n    window->DC.PrevLineHeight = (line_height - GImGui->Style.ItemSpacing.y);    // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list.\n    if (window->DC.ColumnsCount > 1)\n        window->DC.ColumnsCellMinY = window->DC.CursorPos.y;                    // Setting this so that cell Y position are set properly\n}\n\n// Use case A: Begin() called from constructor with items_height<0, then called again from Sync() in StepNo 1\n// Use case B: Begin() called from constructor with items_height>0\n// FIXME-LEGACY: Ideally we should remove the Begin/End functions but they are part of the legacy API we still support. This is why some of the code in Step() calling Begin() and reassign some fields, spaghetti style.\nvoid ImGuiListClipper::Begin(int count, float items_height)\n{\n    StartPosY = ImGui::GetCursorPosY();\n    ItemsHeight = items_height;\n    ItemsCount = count;\n    StepNo = 0;\n    DisplayEnd = DisplayStart = -1;\n    if (ItemsHeight > 0.0f)\n    {\n        ImGui::CalcListClipping(ItemsCount, ItemsHeight, &DisplayStart, &DisplayEnd); // calculate how many to clip/display\n        if (DisplayStart > 0)\n            SetCursorPosYAndSetupDummyPrevLine(StartPosY + DisplayStart * ItemsHeight, ItemsHeight); // advance cursor\n        StepNo = 2;\n    }\n}\n\nvoid ImGuiListClipper::End()\n{\n    if (ItemsCount < 0)\n        return;\n    // In theory here we should assert that ImGui::GetCursorPosY() == StartPosY + DisplayEnd * ItemsHeight, but it feels saner to just seek at the end and not assert/crash the user.\n    if (ItemsCount < INT_MAX)\n        SetCursorPosYAndSetupDummyPrevLine(StartPosY + ItemsCount * ItemsHeight, ItemsHeight); // advance cursor\n    ItemsCount = -1;\n    StepNo = 3;\n}\n\nbool ImGuiListClipper::Step()\n{\n    if (ItemsCount == 0 || ImGui::GetCurrentWindowRead()->SkipItems)\n    {\n        ItemsCount = -1; \n        return false; \n    }\n    if (StepNo == 0) // Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height.\n    {\n        DisplayStart = 0;\n        DisplayEnd = 1;\n        StartPosY = ImGui::GetCursorPosY();\n        StepNo = 1;\n        return true;\n    }\n    if (StepNo == 1) // Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element.\n    {\n        if (ItemsCount == 1) { ItemsCount = -1; return false; }\n        float items_height = ImGui::GetCursorPosY() - StartPosY;\n        IM_ASSERT(items_height > 0.0f);   // If this triggers, it means Item 0 hasn't moved the cursor vertically\n        Begin(ItemsCount-1, items_height);\n        DisplayStart++;\n        DisplayEnd++;\n        StepNo = 3;\n        return true;\n    }\n    if (StepNo == 2) // Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user still call Step(). Does nothing and switch to Step 3.\n    {\n        IM_ASSERT(DisplayStart >= 0 && DisplayEnd >= 0);\n        StepNo = 3;\n        return true;\n    }\n    if (StepNo == 3) // Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop.\n        End();\n    return false;\n}\n\n//-----------------------------------------------------------------------------\n// ImGuiWindow\n//-----------------------------------------------------------------------------\n\nImGuiWindow::ImGuiWindow(const char* name)\n{\n    Name = ImStrdup(name);\n    ID = ImHash(name, 0);\n    IDStack.push_back(ID);\n    Flags = 0;\n    OrderWithinParent = 0;\n    PosFloat = Pos = ImVec2(0.0f, 0.0f);\n    Size = SizeFull = ImVec2(0.0f, 0.0f);\n    SizeContents = SizeContentsExplicit = ImVec2(0.0f, 0.0f);\n    WindowPadding = ImVec2(0.0f, 0.0f);\n    WindowRounding = 0.0f;\n    WindowBorderSize = 0.0f;\n    MoveId = GetID(\"#MOVE\");\n    Scroll = ImVec2(0.0f, 0.0f);\n    ScrollTarget = ImVec2(FLT_MAX, FLT_MAX);\n    ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f);\n    ScrollbarX = ScrollbarY = false;\n    ScrollbarSizes = ImVec2(0.0f, 0.0f);\n    Active = WasActive = false;\n    WriteAccessed = false;\n    Collapsed = false;\n    SkipItems = false;\n    Appearing = false;\n    CloseButton = false;\n    BeginCount = 0;\n    PopupId = 0;\n    AutoFitFramesX = AutoFitFramesY = -1;\n    AutoFitOnlyGrows = false;\n    AutoFitChildAxises = 0x00;\n    AutoPosLastDirection = -1;\n    HiddenFrames = 0;\n    SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing;\n    SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX);\n\n    LastFrameActive = -1;\n    ItemWidthDefault = 0.0f;\n    FontWindowScale = 1.0f;\n\n    DrawList = (ImDrawList*)ImGui::MemAlloc(sizeof(ImDrawList));\n    IM_PLACEMENT_NEW(DrawList) ImDrawList();\n    DrawList->_OwnerName = Name;\n    ParentWindow = NULL;\n    RootWindow = NULL;\n    RootNonPopupWindow = NULL;\n\n    FocusIdxAllCounter = FocusIdxTabCounter = -1;\n    FocusIdxAllRequestCurrent = FocusIdxTabRequestCurrent = INT_MAX;\n    FocusIdxAllRequestNext = FocusIdxTabRequestNext = INT_MAX;\n}\n\nImGuiWindow::~ImGuiWindow()\n{\n    DrawList->~ImDrawList();\n    ImGui::MemFree(DrawList);\n    DrawList = NULL;\n    ImGui::MemFree(Name);\n    Name = NULL;\n}\n\nImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)\n{\n    ImGuiID seed = IDStack.back();\n    ImGuiID id = ImHash(str, str_end ? (int)(str_end - str) : 0, seed);\n    ImGui::KeepAliveID(id);\n    return id;\n}\n\nImGuiID ImGuiWindow::GetID(const void* ptr)\n{\n    ImGuiID seed = IDStack.back();\n    ImGuiID id = ImHash(&ptr, sizeof(void*), seed);\n    ImGui::KeepAliveID(id);\n    return id;\n}\n\nImGuiID ImGuiWindow::GetIDNoKeepAlive(const char* str, const char* str_end)\n{\n    ImGuiID seed = IDStack.back();\n    return ImHash(str, str_end ? (int)(str_end - str) : 0, seed);\n}\n\n//-----------------------------------------------------------------------------\n// Internal API exposed in imgui_internal.h\n//-----------------------------------------------------------------------------\n\nstatic void SetCurrentWindow(ImGuiWindow* window)\n{\n    ImGuiContext& g = *GImGui;\n    g.CurrentWindow = window;\n    if (window)\n        g.FontSize = window->CalcFontSize();\n}\n\nImGuiWindow* ImGui::GetParentWindow()\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(g.CurrentWindowStack.Size >= 2);\n    return g.CurrentWindowStack[(unsigned int)g.CurrentWindowStack.Size - 2];\n}\n\nvoid ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)\n{\n    ImGuiContext& g = *GImGui;\n    g.ActiveIdIsJustActivated = (g.ActiveId != id);\n    if (g.ActiveIdIsJustActivated)\n        g.ActiveIdTimer = 0.0f;\n    g.ActiveId = id;\n    g.ActiveIdAllowOverlap = false;\n    g.ActiveIdIsAlive |= (id != 0);\n    g.ActiveIdWindow = window;\n}\n\nvoid ImGui::ClearActiveID()\n{\n    SetActiveID(0, NULL);\n}\n\nvoid ImGui::SetHoveredID(ImGuiID id)\n{\n    ImGuiContext& g = *GImGui;\n    g.HoveredId = id;\n    g.HoveredIdAllowOverlap = false;\n    g.HoveredIdTimer = (id != 0 && g.HoveredIdPreviousFrame == id) ? (g.HoveredIdTimer + g.IO.DeltaTime) : 0.0f;\n}\n\nvoid ImGui::KeepAliveID(ImGuiID id)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.ActiveId == id)\n        g.ActiveIdIsAlive = true;\n}\n\nstatic inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags)\n{\n    // An active popup disable hovering on other windows (apart from its own children)\n    // FIXME-OPT: This could be cached/stored within the window.\n    ImGuiContext& g = *GImGui;\n    if (g.NavWindow)\n        if (ImGuiWindow* focused_root_window = g.NavWindow->RootWindow)\n            if (focused_root_window->WasActive && focused_root_window != window->RootWindow)\n            {\n                // For the purpose of those flags we differentiate \"standard popup\" from \"modal popup\"\n                // NB: The order of those two tests is important because Modal windows are also Popups.\n                if (focused_root_window->Flags & ImGuiWindowFlags_Modal)\n                    return false;\n                if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiHoveredFlags_AllowWhenBlockedByPopup))\n                    return false;\n            }\n\n    return true;\n}\n\n// Advance cursor given item size for layout.\nvoid ImGui::ItemSize(const ImVec2& size, float text_offset_y)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    if (window->SkipItems)\n        return;\n\n    // Always align ourselves on pixel boundaries\n    const float line_height = ImMax(window->DC.CurrentLineHeight, size.y);\n    const float text_base_offset = ImMax(window->DC.CurrentLineTextBaseOffset, text_offset_y);\n    //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG]\n    window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y);\n    window->DC.CursorPos = ImVec2((float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX), (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y));\n    window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);\n    window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y);\n    //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]\n\n    window->DC.PrevLineHeight = line_height;\n    window->DC.PrevLineTextBaseOffset = text_base_offset;\n    window->DC.CurrentLineHeight = window->DC.CurrentLineTextBaseOffset = 0.0f;\n\n    // Horizontal layout mode\n    if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)\n        SameLine();\n}\n\nvoid ImGui::ItemSize(const ImRect& bb, float text_offset_y)\n{\n    ItemSize(bb.GetSize(), text_offset_y);\n}\n\n// Declare item bounding box for clipping and interaction.\n// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface\n// declares their minimum size requirement to ItemSize() and then use a larger region for drawing/interaction, which is passed to ItemAdd().\nbool ImGui::ItemAdd(const ImRect& bb, ImGuiID id)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    const bool is_clipped = IsClippedEx(bb, id, false);\n    window->DC.LastItemId = id;\n    window->DC.LastItemRect = bb;\n    window->DC.LastItemRectHoveredRect = false;\n    if (is_clipped)\n        return false;\n    //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG]\n\n    // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them)\n    window->DC.LastItemRectHoveredRect = IsMouseHoveringRect(bb.Min, bb.Max);\n    return true;\n}\n\n// This is roughly matching the behavior of internal-facing ItemHoverable()\n// - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered()\n// - this should work even for non-interactive items that have no ID, so we cannot use LastItemId\nbool ImGui::IsItemHovered(ImGuiHoveredFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n\n    ImGuiWindow* window = g.CurrentWindow;\n    if (!window->DC.LastItemRectHoveredRect)\n        return false;\n    IM_ASSERT((flags & ImGuiHoveredFlags_FlattenChilds) == 0);   // Flags not supported by this function\n\n    // [2017/10/16] Reverted commit 344d48be3 and testing RootWindow instead. I believe it is correct to NOT test for RootWindow but this leaves us unable to use IsItemHovered() after EndChild() itself.\n    // Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was the test that has been running for a long while.\n    //if (g.HoveredWindow != window)\n    //    return false;\n    if (g.HoveredRootWindow != window->RootWindow && !(flags & ImGuiHoveredFlags_AllowWhenOverlapped))\n        return false;\n    if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))\n        if (g.ActiveId != 0 && g.ActiveId != window->DC.LastItemId && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId)\n            return false;\n    if (!IsWindowContentHoverable(window, flags))\n        return false;\n    if (window->DC.ItemFlags & ImGuiItemFlags_Disabled)\n        return false;\n    // Special handling for the 1st item after Begin() which represent the title bar. When the window is collapsed (SkipItems==true) that last item will never be overwritten.\n    if (window->DC.LastItemId == window->MoveId && window->WriteAccessed)\n        return false;\n    return true;\n}\n\n// Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered().\nbool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap)\n        return false;\n\n    ImGuiWindow* window = g.CurrentWindow;\n    if (g.HoveredWindow != window)\n        return false;\n    if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap)\n        return false;\n    if (!IsMouseHoveringRect(bb.Min, bb.Max))\n        return false;\n    if (!IsWindowContentHoverable(window, ImGuiHoveredFlags_Default))\n        return false;\n    if (window->DC.ItemFlags & ImGuiItemFlags_Disabled)\n        return false;\n\n    SetHoveredID(id);\n    return true;\n}\n\nbool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    if (!bb.Overlaps(window->ClipRect))\n        if (id == 0 || id != g.ActiveId)\n            if (clip_even_when_logged || !g.LogEnabled)\n                return true;\n    return false;\n}\n\nbool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop)\n{\n    ImGuiContext& g = *GImGui;\n\n    const bool allow_keyboard_focus = (window->DC.ItemFlags & (ImGuiItemFlags_AllowKeyboardFocus | ImGuiItemFlags_Disabled)) == ImGuiItemFlags_AllowKeyboardFocus;\n    window->FocusIdxAllCounter++;\n    if (allow_keyboard_focus)\n        window->FocusIdxTabCounter++;\n\n    // Process keyboard input at this point: TAB/Shift-TAB to tab out of the currently focused item.\n    // Note that we can always TAB out of a widget that doesn't allow tabbing in.\n    if (tab_stop && (g.ActiveId == id) && window->FocusIdxAllRequestNext == INT_MAX && window->FocusIdxTabRequestNext == INT_MAX && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab))\n        window->FocusIdxTabRequestNext = window->FocusIdxTabCounter + (g.IO.KeyShift ? (allow_keyboard_focus ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items.\n\n    if (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent)\n        return true;\n\n    if (allow_keyboard_focus)\n        if (window->FocusIdxTabCounter == window->FocusIdxTabRequestCurrent)\n            return true;\n\n    return false;\n}\n\nvoid ImGui::FocusableItemUnregister(ImGuiWindow* window)\n{\n    window->FocusIdxAllCounter--;\n    window->FocusIdxTabCounter--;\n}\n\nImVec2 ImGui::CalcItemSize(ImVec2 size, float default_x, float default_y)\n{\n    ImGuiContext& g = *GImGui;\n    ImVec2 content_max;\n    if (size.x < 0.0f || size.y < 0.0f)\n        content_max = g.CurrentWindow->Pos + GetContentRegionMax();\n    if (size.x <= 0.0f)\n        size.x = (size.x == 0.0f) ? default_x : ImMax(content_max.x - g.CurrentWindow->DC.CursorPos.x, 4.0f) + size.x;\n    if (size.y <= 0.0f)\n        size.y = (size.y == 0.0f) ? default_y : ImMax(content_max.y - g.CurrentWindow->DC.CursorPos.y, 4.0f) + size.y;\n    return size;\n}\n\nfloat ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)\n{\n    if (wrap_pos_x < 0.0f)\n        return 0.0f;\n\n    ImGuiWindow* window = GetCurrentWindowRead();\n    if (wrap_pos_x == 0.0f)\n        wrap_pos_x = GetContentRegionMax().x + window->Pos.x;\n    else if (wrap_pos_x > 0.0f)\n        wrap_pos_x += window->Pos.x - window->Scroll.x; // wrap_pos_x is provided is window local space\n\n    return ImMax(wrap_pos_x - pos.x, 1.0f);\n}\n\n//-----------------------------------------------------------------------------\n\nvoid* ImGui::MemAlloc(size_t sz)\n{\n    GImGui->IO.MetricsAllocs++;\n    return GImGui->IO.MemAllocFn(sz);\n}\n\nvoid ImGui::MemFree(void* ptr)\n{\n    if (ptr) GImGui->IO.MetricsAllocs--;\n    return GImGui->IO.MemFreeFn(ptr);\n}\n\nconst char* ImGui::GetClipboardText()\n{\n    return GImGui->IO.GetClipboardTextFn ? GImGui->IO.GetClipboardTextFn(GImGui->IO.ClipboardUserData) : \"\";\n}\n\nvoid ImGui::SetClipboardText(const char* text)\n{\n    if (GImGui->IO.SetClipboardTextFn)\n        GImGui->IO.SetClipboardTextFn(GImGui->IO.ClipboardUserData, text);\n}\n\nconst char* ImGui::GetVersion()\n{\n    return IMGUI_VERSION;\n}\n\n// Internal state access - if you want to share ImGui state between modules (e.g. DLL) or allocate it yourself\n// Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module\nImGuiContext* ImGui::GetCurrentContext()\n{\n    return GImGui;\n}\n\nvoid ImGui::SetCurrentContext(ImGuiContext* ctx)\n{\n#ifdef IMGUI_SET_CURRENT_CONTEXT_FUNC\n    IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx); // For custom thread-based hackery you may want to have control over this.\n#else\n    GImGui = ctx;\n#endif\n}\n\nImGuiContext* ImGui::CreateContext(void* (*malloc_fn)(size_t), void (*free_fn)(void*))\n{\n    if (!malloc_fn) malloc_fn = malloc;\n    ImGuiContext* ctx = (ImGuiContext*)malloc_fn(sizeof(ImGuiContext));\n    IM_PLACEMENT_NEW(ctx) ImGuiContext();\n    ctx->IO.MemAllocFn = malloc_fn;\n    ctx->IO.MemFreeFn = free_fn ? free_fn : free;\n    return ctx;\n}\n\nvoid ImGui::DestroyContext(ImGuiContext* ctx)\n{\n    void (*free_fn)(void*) = ctx->IO.MemFreeFn;\n    ctx->~ImGuiContext();\n    free_fn(ctx);\n    if (GImGui == ctx)\n        SetCurrentContext(NULL);\n}\n\nImGuiIO& ImGui::GetIO()\n{\n    return GImGui->IO;\n}\n\nImGuiStyle& ImGui::GetStyle()\n{\n    return GImGui->Style;\n}\n\n// Same value as passed to your RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame()\nImDrawData* ImGui::GetDrawData()\n{\n    return GImGui->RenderDrawData.Valid ? &GImGui->RenderDrawData : NULL;\n}\n\nfloat ImGui::GetTime()\n{\n    return GImGui->Time;\n}\n\nint ImGui::GetFrameCount()\n{\n    return GImGui->FrameCount;\n}\n\nvoid ImGui::NewFrame()\n{\n    ImGuiContext& g = *GImGui;\n\n    // Check user data\n    // (We pass an error message in the assert expression as a trick to get it visible to programmers who are not using a debugger, as most assert handlers display their argument)\n    IM_ASSERT(g.IO.DeltaTime >= 0.0f                                    && \"Need a positive DeltaTime (zero is tolerated but will cause some timing issues)\");\n    IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f  && \"Invalid DisplaySize value\");\n    IM_ASSERT(g.IO.Fonts->Fonts.Size > 0                                && \"Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?\");\n    IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded()                          && \"Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?\");\n    IM_ASSERT(g.Style.CurveTessellationTol > 0.0f                       && \"Invalid style setting\");\n    IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f            && \"Invalid style setting. Alpha cannot be negative (allows us to avoid a few clamps in color computations)\");\n    IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount)  && \"Forgot to call Render() or EndFrame() at the end of the previous frame?\");\n\n    // Initialize on first frame\n    if (!g.Initialized)\n        ImGui::Initialize();\n\n    SetCurrentFont(GetDefaultFont());\n    IM_ASSERT(g.Font->IsLoaded());\n\n    g.Time += g.IO.DeltaTime;\n    g.FrameCount += 1;\n    g.TooltipOverrideCount = 0;\n    g.OverlayDrawList.Clear();\n    g.OverlayDrawList.PushTextureID(g.IO.Fonts->TexID);\n    g.OverlayDrawList.PushClipRectFullScreen();\n\n    // Mark rendering data as invalid to prevent user who may have a handle on it to use it\n    g.RenderDrawData.Valid = false;\n    g.RenderDrawData.CmdLists = NULL;\n    g.RenderDrawData.CmdListsCount = g.RenderDrawData.TotalVtxCount = g.RenderDrawData.TotalIdxCount = 0;\n\n    // Clear reference to active widget if the widget isn't alive anymore\n    if (!g.HoveredIdPreviousFrame)\n        g.HoveredIdTimer = 0.0f;\n    g.HoveredIdPreviousFrame = g.HoveredId;\n    g.HoveredId = 0;\n    g.HoveredIdAllowOverlap = false;\n    if (!g.ActiveIdIsAlive && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0)\n        ClearActiveID();\n    if (g.ActiveId)\n        g.ActiveIdTimer += g.IO.DeltaTime;\n    g.ActiveIdPreviousFrame = g.ActiveId;\n    g.ActiveIdIsAlive = false;\n    g.ActiveIdIsJustActivated = false;\n    if (g.ScalarAsInputTextId && g.ActiveId != g.ScalarAsInputTextId)\n        g.ScalarAsInputTextId = 0;\n\n    // Update keyboard input state\n    memcpy(g.IO.KeysDownDurationPrev, g.IO.KeysDownDuration, sizeof(g.IO.KeysDownDuration));\n    for (int i = 0; i < IM_ARRAYSIZE(g.IO.KeysDown); i++)\n        g.IO.KeysDownDuration[i] = g.IO.KeysDown[i] ? (g.IO.KeysDownDuration[i] < 0.0f ? 0.0f : g.IO.KeysDownDuration[i] + g.IO.DeltaTime) : -1.0f;\n\n    // Update mouse input state\n    // If mouse just appeared or disappeared (usually denoted by -FLT_MAX component, but in reality we test for -256000.0f) we cancel out movement in MouseDelta\n    if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MousePosPrev))\n        g.IO.MouseDelta = g.IO.MousePos - g.IO.MousePosPrev;\n    else\n        g.IO.MouseDelta = ImVec2(0.0f, 0.0f);\n    g.IO.MousePosPrev = g.IO.MousePos;\n    for (int i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++)\n    {\n        g.IO.MouseClicked[i] = g.IO.MouseDown[i] && g.IO.MouseDownDuration[i] < 0.0f;\n        g.IO.MouseReleased[i] = !g.IO.MouseDown[i] && g.IO.MouseDownDuration[i] >= 0.0f;\n        g.IO.MouseDownDurationPrev[i] = g.IO.MouseDownDuration[i];\n        g.IO.MouseDownDuration[i] = g.IO.MouseDown[i] ? (g.IO.MouseDownDuration[i] < 0.0f ? 0.0f : g.IO.MouseDownDuration[i] + g.IO.DeltaTime) : -1.0f;\n        g.IO.MouseDoubleClicked[i] = false;\n        if (g.IO.MouseClicked[i])\n        {\n            if (g.Time - g.IO.MouseClickedTime[i] < g.IO.MouseDoubleClickTime)\n            {\n                if (ImLengthSqr(g.IO.MousePos - g.IO.MouseClickedPos[i]) < g.IO.MouseDoubleClickMaxDist * g.IO.MouseDoubleClickMaxDist)\n                    g.IO.MouseDoubleClicked[i] = true;\n                g.IO.MouseClickedTime[i] = -FLT_MAX;    // so the third click isn't turned into a double-click\n            }\n            else\n            {\n                g.IO.MouseClickedTime[i] = g.Time;\n            }\n            g.IO.MouseClickedPos[i] = g.IO.MousePos;\n            g.IO.MouseDragMaxDistanceAbs[i] = ImVec2(0.0f, 0.0f);\n            g.IO.MouseDragMaxDistanceSqr[i] = 0.0f;\n        }\n        else if (g.IO.MouseDown[i])\n        {\n            ImVec2 mouse_delta = g.IO.MousePos - g.IO.MouseClickedPos[i];\n            g.IO.MouseDragMaxDistanceAbs[i].x = ImMax(g.IO.MouseDragMaxDistanceAbs[i].x, mouse_delta.x < 0.0f ? -mouse_delta.x : mouse_delta.x);\n            g.IO.MouseDragMaxDistanceAbs[i].y = ImMax(g.IO.MouseDragMaxDistanceAbs[i].y, mouse_delta.y < 0.0f ? -mouse_delta.y : mouse_delta.y);\n            g.IO.MouseDragMaxDistanceSqr[i] = ImMax(g.IO.MouseDragMaxDistanceSqr[i], ImLengthSqr(mouse_delta));\n        }\n    }\n\n    // Calculate frame-rate for the user, as a purely luxurious feature\n    g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx];\n    g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime;\n    g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame);\n    g.IO.Framerate = 1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame));\n\n    // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering). Only valid for root windows.\n    if (g.MovingWindowMoveId && g.MovingWindowMoveId == g.ActiveId)\n    {\n        KeepAliveID(g.MovingWindowMoveId);\n        IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindow);\n        IM_ASSERT(g.MovingWindow->MoveId == g.MovingWindowMoveId);\n        if (g.IO.MouseDown[0])\n        {\n            g.MovingWindow->RootWindow->PosFloat += g.IO.MouseDelta;\n            if (g.IO.MouseDelta.x != 0.0f || g.IO.MouseDelta.y != 0.0f)\n                MarkIniSettingsDirty(g.MovingWindow->RootWindow);\n            FocusWindow(g.MovingWindow);\n        }\n        else\n        {\n            ClearActiveID();\n            g.MovingWindow = NULL;\n            g.MovingWindowMoveId = 0;\n        }\n    }\n    else\n    {\n        g.MovingWindow = NULL;\n        g.MovingWindowMoveId = 0;\n    }\n\n    // Delay saving settings so we don't spam disk too much\n    if (g.SettingsDirtyTimer > 0.0f)\n    {\n        g.SettingsDirtyTimer -= g.IO.DeltaTime;\n        if (g.SettingsDirtyTimer <= 0.0f)\n            SaveIniSettingsToDisk(g.IO.IniFilename);\n    }\n\n    // Find the window we are hovering\n    // - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow.\n    // - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point.\n    // - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms.\n    g.HoveredWindow = (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoInputs)) ? g.MovingWindow : FindHoveredWindow(g.IO.MousePos);\n    g.HoveredRootWindow = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL;\n\n    if (ImGuiWindow* modal_window = GetFrontMostModalRootWindow())\n    {\n        g.ModalWindowDarkeningRatio = ImMin(g.ModalWindowDarkeningRatio + g.IO.DeltaTime * 6.0f, 1.0f);\n        ImGuiWindow* window = g.HoveredRootWindow;\n        while (window && window != modal_window)\n            window = window->ParentWindow;\n        if (!window)\n            g.HoveredRootWindow = g.HoveredWindow = NULL;\n    }\n    else\n    {\n        g.ModalWindowDarkeningRatio = 0.0f;\n    }\n\n    // Update the WantCaptureMouse/WantCAptureKeyboard flags, so user can capture/discard the inputs away from the rest of their application.\n    // When clicking outside of a window we assume the click is owned by the application and won't request capture. We need to track click ownership.\n    int mouse_earliest_button_down = -1;\n    bool mouse_any_down = false;\n    for (int i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++)\n    {\n        if (g.IO.MouseClicked[i])\n            g.IO.MouseDownOwned[i] = (g.HoveredWindow != NULL) || (!g.OpenPopupStack.empty());\n        mouse_any_down |= g.IO.MouseDown[i];\n        if (g.IO.MouseDown[i])\n            if (mouse_earliest_button_down == -1 || g.IO.MouseClickedTime[i] < g.IO.MouseClickedTime[mouse_earliest_button_down])\n                mouse_earliest_button_down = i;\n    }\n    bool mouse_avail_to_imgui = (mouse_earliest_button_down == -1) || g.IO.MouseDownOwned[mouse_earliest_button_down];\n    if (g.WantCaptureMouseNextFrame != -1)\n        g.IO.WantCaptureMouse = (g.WantCaptureMouseNextFrame != 0);\n    else\n        g.IO.WantCaptureMouse = (mouse_avail_to_imgui && (g.HoveredWindow != NULL || mouse_any_down)) || (!g.OpenPopupStack.empty());\n    g.IO.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != -1) ? (g.WantCaptureKeyboardNextFrame != 0) : (g.ActiveId != 0);\n    g.IO.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : 0;\n    g.MouseCursor = ImGuiMouseCursor_Arrow;\n    g.WantCaptureMouseNextFrame = g.WantCaptureKeyboardNextFrame = g.WantTextInputNextFrame = -1;\n    g.OsImePosRequest = ImVec2(1.0f, 1.0f); // OS Input Method Editor showing on top-left of our window by default\n\n    // If mouse was first clicked outside of ImGui bounds we also cancel out hovering.\n    // FIXME: For patterns of drag and drop between \"application\" and \"imgui\" we may need to rework/remove this test (first committed 311c0ca9 on 2015/02)\n    if (!mouse_avail_to_imgui)\n        g.HoveredWindow = g.HoveredRootWindow = NULL;\n\n    // Scale & Scrolling\n    if (g.HoveredWindow && g.IO.MouseWheel != 0.0f && !g.HoveredWindow->Collapsed)\n    {\n        ImGuiWindow* window = g.HoveredWindow;\n        if (g.IO.KeyCtrl && g.IO.FontAllowUserScaling)\n        {\n            // Zoom / Scale window\n            const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);\n            const float scale = new_font_scale / window->FontWindowScale;\n            window->FontWindowScale = new_font_scale;\n\n            const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size;\n            window->Pos += offset;\n            window->PosFloat += offset;\n            window->Size *= scale;\n            window->SizeFull *= scale;\n        }\n        else if (!g.IO.KeyCtrl && !(window->Flags & ImGuiWindowFlags_NoScrollWithMouse))\n        {\n            // Scroll\n            const int scroll_lines = (window->Flags & ImGuiWindowFlags_ComboBox) ? 3 : 5;\n            SetWindowScrollY(window, window->Scroll.y - g.IO.MouseWheel * window->CalcFontSize() * scroll_lines);\n        }\n    }\n\n    // Pressing TAB activate widget focus\n    if (g.ActiveId == 0 && g.NavWindow != NULL && g.NavWindow->Active && IsKeyPressedMap(ImGuiKey_Tab, false))\n        g.NavWindow->FocusIdxTabRequestNext = 0;\n\n    // Mark all windows as not visible\n    for (int i = 0; i != g.Windows.Size; i++)\n    {\n        ImGuiWindow* window = g.Windows[i];\n        window->WasActive = window->Active;\n        window->Active = false;\n        window->WriteAccessed = false;\n    }\n\n    // Closing the focused window restore focus to the first active root window in descending z-order\n    if (g.NavWindow && !g.NavWindow->WasActive)\n        FocusPreviousWindow();\n\n    // No window should be open at the beginning of the frame.\n    // But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear.\n    g.CurrentWindowStack.resize(0);\n    g.CurrentPopupStack.resize(0);\n    CloseInactivePopups(g.NavWindow);\n\n    // Create implicit window - we will only render it if the user has added something to it.\n    // We don't use \"Debug\" to avoid colliding with user trying to create a \"Debug\" window with custom flags.\n    ImGui::SetNextWindowSize(ImVec2(400,400), ImGuiCond_FirstUseEver);\n    ImGui::Begin(\"Debug##Default\");\n}\n\nvoid ImGui::Initialize()\n{\n    ImGuiContext& g = *GImGui;\n    g.LogClipboard = (ImGuiTextBuffer*)ImGui::MemAlloc(sizeof(ImGuiTextBuffer));\n    IM_PLACEMENT_NEW(g.LogClipboard) ImGuiTextBuffer();\n\n    IM_ASSERT(g.Settings.empty());\n    LoadIniSettingsFromDisk(g.IO.IniFilename);\n    g.Initialized = true;\n}\n\n// This function is merely here to free heap allocations.\nvoid ImGui::Shutdown()\n{\n    ImGuiContext& g = *GImGui;\n\n    // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame)\n    if (g.IO.Fonts) // Testing for NULL to allow user to NULLify in case of running Shutdown() on multiple contexts. Bit hacky.\n        g.IO.Fonts->Clear();\n\n    // Cleanup of other data are conditional on actually having initialize ImGui.\n    if (!g.Initialized)\n        return;\n\n    SaveIniSettingsToDisk(g.IO.IniFilename);\n\n    for (int i = 0; i < g.Windows.Size; i++)\n    {\n        g.Windows[i]->~ImGuiWindow();\n        ImGui::MemFree(g.Windows[i]);\n    }\n    g.Windows.clear();\n    g.WindowsSortBuffer.clear();\n    g.CurrentWindow = NULL;\n    g.CurrentWindowStack.clear();\n    g.WindowsById.Clear();\n    g.NavWindow = NULL;\n    g.HoveredWindow = NULL;\n    g.HoveredRootWindow = NULL;\n    g.ActiveIdWindow = NULL;\n    g.MovingWindow = NULL;\n    for (int i = 0; i < g.Settings.Size; i++)\n        ImGui::MemFree(g.Settings[i].Name);\n    g.Settings.clear();\n    g.ColorModifiers.clear();\n    g.StyleModifiers.clear();\n    g.FontStack.clear();\n    g.OpenPopupStack.clear();\n    g.CurrentPopupStack.clear();\n    g.SetNextWindowSizeConstraintCallback = NULL;\n    g.SetNextWindowSizeConstraintCallbackUserData = NULL;\n    for (int i = 0; i < IM_ARRAYSIZE(g.RenderDrawLists); i++)\n        g.RenderDrawLists[i].clear();\n    g.OverlayDrawList.ClearFreeMemory();\n    g.PrivateClipboard.clear();\n    g.InputTextState.Text.clear();\n    g.InputTextState.InitialText.clear();\n    g.InputTextState.TempTextBuffer.clear();\n\n    if (g.LogFile && g.LogFile != stdout)\n    {\n        fclose(g.LogFile);\n        g.LogFile = NULL;\n    }\n    if (g.LogClipboard)\n    {\n        g.LogClipboard->~ImGuiTextBuffer();\n        ImGui::MemFree(g.LogClipboard);\n    }\n\n    g.Initialized = false;\n}\n\nstatic ImGuiIniData* FindWindowSettings(const char* name)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiID id = ImHash(name, 0);\n    for (int i = 0; i != g.Settings.Size; i++)\n    {\n        ImGuiIniData* ini = &g.Settings[i];\n        if (ini->Id == id)\n            return ini;\n    }\n    return NULL;\n}\n\nstatic ImGuiIniData* AddWindowSettings(const char* name)\n{\n    GImGui->Settings.resize(GImGui->Settings.Size + 1);\n    ImGuiIniData* ini = &GImGui->Settings.back();\n    ini->Name = ImStrdup(name);\n    ini->Id = ImHash(name, 0);\n    ini->Collapsed = false;\n    ini->Pos = ImVec2(FLT_MAX,FLT_MAX);\n    ini->Size = ImVec2(0,0);\n    return ini;\n}\n\n// Zero-tolerance, poor-man .ini parsing\n// FIXME: Write something less rubbish\nstatic void LoadIniSettingsFromDisk(const char* ini_filename)\n{\n    ImGuiContext& g = *GImGui;\n    if (!ini_filename)\n        return;\n\n    int file_size;\n    char* file_data = (char*)ImFileLoadToMemory(ini_filename, \"rb\", &file_size, 1);\n    if (!file_data)\n        return;\n\n    ImGuiIniData* settings = NULL;\n    const char* buf_end = file_data + file_size;\n    for (const char* line_start = file_data; line_start < buf_end; )\n    {\n        const char* line_end = line_start;\n        while (line_end < buf_end && *line_end != '\\n' && *line_end != '\\r')\n            line_end++;\n\n        if (line_start[0] == '[' && line_end > line_start && line_end[-1] == ']')\n        {\n            char name[64];\n            ImFormatString(name, IM_ARRAYSIZE(name), \"%.*s\", (int)(line_end-line_start-2), line_start+1);\n            settings = FindWindowSettings(name);\n            if (!settings)\n                settings = AddWindowSettings(name);\n        }\n        else if (settings)\n        {\n            float x, y;\n            int i;\n            if (sscanf(line_start, \"Pos=%f,%f\", &x, &y) == 2)\n                settings->Pos = ImVec2(x, y);\n            else if (sscanf(line_start, \"Size=%f,%f\", &x, &y) == 2)\n                settings->Size = ImMax(ImVec2(x, y), g.Style.WindowMinSize);\n            else if (sscanf(line_start, \"Collapsed=%d\", &i) == 1)\n                settings->Collapsed = (i != 0);\n        }\n\n        line_start = line_end+1;\n    }\n\n    ImGui::MemFree(file_data);\n}\n\nstatic void SaveIniSettingsToDisk(const char* ini_filename)\n{\n    ImGuiContext& g = *GImGui;\n    g.SettingsDirtyTimer = 0.0f;\n    if (!ini_filename)\n        return;\n\n    // Gather data from windows that were active during this session\n    for (int i = 0; i != g.Windows.Size; i++)\n    {\n        ImGuiWindow* window = g.Windows[i];\n        if (window->Flags & ImGuiWindowFlags_NoSavedSettings)\n            continue;\n        ImGuiIniData* settings = FindWindowSettings(window->Name);\n        if (!settings)  // This will only return NULL in the rare instance where the window was first created with ImGuiWindowFlags_NoSavedSettings then had the flag disabled later on. We don't bind settings in this case (bug #1000).\n            continue;\n        settings->Pos = window->Pos;\n        settings->Size = window->SizeFull;\n        settings->Collapsed = window->Collapsed;\n    }\n\n    // Write .ini file\n    // If a window wasn't opened in this session we preserve its settings\n    FILE* f = ImFileOpen(ini_filename, \"wt\");\n    if (!f)\n        return;\n    for (int i = 0; i != g.Settings.Size; i++)\n    {\n        const ImGuiIniData* settings = &g.Settings[i];\n        if (settings->Pos.x == FLT_MAX)\n            continue;\n        const char* name = settings->Name;\n        if (const char* p = strstr(name, \"###\"))  // Skip to the \"###\" marker if any. We don't skip past to match the behavior of GetID()\n            name = p;\n        fprintf(f, \"[%s]\\n\", name);\n        fprintf(f, \"Pos=%d,%d\\n\", (int)settings->Pos.x, (int)settings->Pos.y);\n        fprintf(f, \"Size=%d,%d\\n\", (int)settings->Size.x, (int)settings->Size.y);\n        fprintf(f, \"Collapsed=%d\\n\", settings->Collapsed);\n        fprintf(f, \"\\n\");\n    }\n\n    fclose(f);\n}\n\nstatic void MarkIniSettingsDirty(ImGuiWindow* window)\n{\n    ImGuiContext& g = *GImGui;\n    if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings))\n        if (g.SettingsDirtyTimer <= 0.0f)\n            g.SettingsDirtyTimer = g.IO.IniSavingRate;\n}\n\n// FIXME: Add a more explicit sort order in the window structure.\nstatic int ChildWindowComparer(const void* lhs, const void* rhs)\n{\n    const ImGuiWindow* a = *(const ImGuiWindow**)lhs;\n    const ImGuiWindow* b = *(const ImGuiWindow**)rhs;\n    if (int d = (a->Flags & ImGuiWindowFlags_Popup) - (b->Flags & ImGuiWindowFlags_Popup))\n        return d;\n    if (int d = (a->Flags & ImGuiWindowFlags_Tooltip) - (b->Flags & ImGuiWindowFlags_Tooltip))\n        return d;\n    if (int d = (a->Flags & ImGuiWindowFlags_ComboBox) - (b->Flags & ImGuiWindowFlags_ComboBox))\n        return d;\n    return (a->OrderWithinParent - b->OrderWithinParent);\n}\n\nstatic void AddWindowToSortedBuffer(ImVector<ImGuiWindow*>& out_sorted_windows, ImGuiWindow* window)\n{\n    out_sorted_windows.push_back(window);\n    if (window->Active)\n    {\n        int count = window->DC.ChildWindows.Size;\n        if (count > 1)\n            qsort(window->DC.ChildWindows.begin(), (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer);\n        for (int i = 0; i < count; i++)\n        {\n            ImGuiWindow* child = window->DC.ChildWindows[i];\n            if (child->Active)\n                AddWindowToSortedBuffer(out_sorted_windows, child);\n        }\n    }\n}\n\nstatic void AddDrawListToRenderList(ImVector<ImDrawList*>& out_render_list, ImDrawList* draw_list)\n{\n    if (draw_list->CmdBuffer.empty())\n        return;\n\n    // Remove trailing command if unused\n    ImDrawCmd& last_cmd = draw_list->CmdBuffer.back();\n    if (last_cmd.ElemCount == 0 && last_cmd.UserCallback == NULL)\n    {\n        draw_list->CmdBuffer.pop_back();\n        if (draw_list->CmdBuffer.empty())\n            return;\n    }\n\n    // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. May trigger for you if you are using PrimXXX functions incorrectly.\n    IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size);\n    IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size);\n    IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size);\n\n    // Check that draw_list doesn't use more vertices than indexable in a single draw call (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per window)\n    // If this assert triggers because you are drawing lots of stuff manually, you can:\n    // A) Add '#define ImDrawIdx unsigned int' in imconfig.h to set the index size to 4 bytes. You'll need to handle the 4-bytes indices to your renderer.\n    //    For example, the OpenGL example code detect index size at compile-time by doing:\n    //    'glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);'\n    //    Your own engine or render API may use different parameters or function calls to specify index sizes. 2 and 4 bytes indices are generally supported by most API.\n    // B) If for some reason you cannot use 4 bytes indices or don't want to, a workaround is to call BeginChild()/EndChild() before reaching the 64K limit to split your draw commands in multiple draw lists.\n    IM_ASSERT(((ImU64)draw_list->_VtxCurrentIdx >> (sizeof(ImDrawIdx)*8)) == 0);  // Too many vertices in same ImDrawList. See comment above.\n    \n    out_render_list.push_back(draw_list);\n    GImGui->IO.MetricsRenderVertices += draw_list->VtxBuffer.Size;\n    GImGui->IO.MetricsRenderIndices += draw_list->IdxBuffer.Size;\n}\n\nstatic void AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiWindow* window)\n{\n    AddDrawListToRenderList(out_render_list, window->DrawList);\n    for (int i = 0; i < window->DC.ChildWindows.Size; i++)\n    {\n        ImGuiWindow* child = window->DC.ChildWindows[i];\n        if (!child->Active) // clipped children may have been marked not active\n            continue;\n        if ((child->Flags & ImGuiWindowFlags_Popup) && child->HiddenFrames > 0)\n            continue;\n        AddWindowToRenderList(out_render_list, child);\n    }\n}\n\nstatic void AddWindowToRenderListSelectLayer(ImGuiWindow* window)\n{\n    // FIXME: Generalize this with a proper layering system so e.g. user can draw in specific layers, below text, ..\n    ImGuiContext& g = *GImGui;\n    g.IO.MetricsActiveWindows++;\n    if (window->Flags & ImGuiWindowFlags_Popup)\n        AddWindowToRenderList(g.RenderDrawLists[1], window);\n    else if (window->Flags & ImGuiWindowFlags_Tooltip)\n        AddWindowToRenderList(g.RenderDrawLists[2], window);\n    else\n        AddWindowToRenderList(g.RenderDrawLists[0], window);\n}\n\n// When using this function it is sane to ensure that float are perfectly rounded to integer values, to that e.g. (int)(max.x-min.x) in user's render produce correct result.\nvoid ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DrawList->PushClipRect(clip_rect_min, clip_rect_max, intersect_with_current_clip_rect);\n    window->ClipRect = window->DrawList->_ClipRectStack.back();\n}\n\nvoid ImGui::PopClipRect()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DrawList->PopClipRect();\n    window->ClipRect = window->DrawList->_ClipRectStack.back();\n}\n\n// This is normally called by Render(). You may want to call it directly if you want to avoid calling Render() but the gain will be very minimal.\nvoid ImGui::EndFrame()\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(g.Initialized);                       // Forgot to call ImGui::NewFrame()\n    if (g.FrameCountEnded == g.FrameCount)          // Don't process EndFrame() multiple times.\n        return;\n\n    // Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)\n    if (g.IO.ImeSetInputScreenPosFn && ImLengthSqr(g.OsImePosRequest - g.OsImePosSet) > 0.0001f)\n    {\n        g.IO.ImeSetInputScreenPosFn((int)g.OsImePosRequest.x, (int)g.OsImePosRequest.y);\n        g.OsImePosSet = g.OsImePosRequest;\n    }\n\n    // Hide implicit \"Debug\" window if it hasn't been used\n    IM_ASSERT(g.CurrentWindowStack.Size == 1);    // Mismatched Begin()/End() calls\n    if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed)\n        g.CurrentWindow->Active = false;\n    ImGui::End();\n\n    if (g.ActiveId == 0 && g.HoveredId == 0)\n    {\n        if (!g.NavWindow || !g.NavWindow->Appearing) // Unless we just made a window/popup appear\n        {\n            // Click to focus window and start moving (after we're done with all our widgets)\n            if (g.IO.MouseClicked[0])\n            {\n                if (g.HoveredRootWindow != NULL)\n                {\n                    FocusWindow(g.HoveredWindow);\n                    if (!(g.HoveredWindow->Flags & ImGuiWindowFlags_NoMove) && !(g.HoveredRootWindow->Flags & ImGuiWindowFlags_NoMove))\n                    {\n                        g.MovingWindow = g.HoveredWindow;\n                        g.MovingWindowMoveId = g.MovingWindow->MoveId;\n                        SetActiveID(g.MovingWindowMoveId, g.HoveredRootWindow);\n                    }\n                }\n                else if (g.NavWindow != NULL && GetFrontMostModalRootWindow() == NULL)\n                {\n                    // Clicking on void disable focus\n                    FocusWindow(NULL);\n                }\n            }\n\n            // With right mouse button we close popups without changing focus\n            // (The left mouse button path calls FocusWindow which will lead NewFrame->CloseInactivePopups to trigger)\n            if (g.IO.MouseClicked[1])\n            {\n                // Find the top-most window between HoveredWindow and the front most Modal Window.\n                // This is where we can trim the popup stack.\n                ImGuiWindow* modal = GetFrontMostModalRootWindow();\n                bool hovered_window_above_modal = false;\n                if (modal == NULL)\n                    hovered_window_above_modal = true;\n                for (int i = g.Windows.Size - 1; i >= 0 && hovered_window_above_modal == false; i--)\n                {\n                    ImGuiWindow* window = g.Windows[i];\n                    if (window == modal)\n                        break;\n                    if (window == g.HoveredWindow)\n                        hovered_window_above_modal = true;\n                }\n                CloseInactivePopups(hovered_window_above_modal ? g.HoveredWindow : modal);\n            }\n        }\n    }\n\n    // Sort the window list so that all child windows are after their parent\n    // We cannot do that on FocusWindow() because childs may not exist yet\n    g.WindowsSortBuffer.resize(0);\n    g.WindowsSortBuffer.reserve(g.Windows.Size);\n    for (int i = 0; i != g.Windows.Size; i++)\n    {\n        ImGuiWindow* window = g.Windows[i];\n        if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow))       // if a child is active its parent will add it\n            continue;\n        AddWindowToSortedBuffer(g.WindowsSortBuffer, window);\n    }\n\n    IM_ASSERT(g.Windows.Size == g.WindowsSortBuffer.Size);  // we done something wrong\n    g.Windows.swap(g.WindowsSortBuffer);\n\n    // Clear Input data for next frame\n    g.IO.MouseWheel = 0.0f;\n    memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters));\n\n    g.FrameCountEnded = g.FrameCount;\n}\n\nvoid ImGui::Render()\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(g.Initialized);   // Forgot to call ImGui::NewFrame()\n\n    if (g.FrameCountEnded != g.FrameCount)\n        ImGui::EndFrame();\n    g.FrameCountRendered = g.FrameCount;\n\n    // Skip render altogether if alpha is 0.0\n    // Note that vertex buffers have been created and are wasted, so it is best practice that you don't create windows in the first place, or consistently respond to Begin() returning false.\n    if (g.Style.Alpha > 0.0f)\n    {\n        // Gather windows to render\n        g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = g.IO.MetricsActiveWindows = 0;\n        for (int i = 0; i < IM_ARRAYSIZE(g.RenderDrawLists); i++)\n            g.RenderDrawLists[i].resize(0);\n        for (int i = 0; i != g.Windows.Size; i++)\n        {\n            ImGuiWindow* window = g.Windows[i];\n            if (window->Active && window->HiddenFrames <= 0 && (window->Flags & (ImGuiWindowFlags_ChildWindow)) == 0)\n                AddWindowToRenderListSelectLayer(window);\n        }\n\n        // Flatten layers\n        int n = g.RenderDrawLists[0].Size;\n        int flattened_size = n;\n        for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++)\n            flattened_size += g.RenderDrawLists[i].Size;\n        g.RenderDrawLists[0].resize(flattened_size);\n        for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++)\n        {\n            ImVector<ImDrawList*>& layer = g.RenderDrawLists[i];\n            if (layer.empty())\n                continue;\n            memcpy(&g.RenderDrawLists[0][n], &layer[0], layer.Size * sizeof(ImDrawList*));\n            n += layer.Size;\n        }\n\n        // Draw software mouse cursor if requested\n        if (g.IO.MouseDrawCursor)\n        {\n            const ImGuiMouseCursorData& cursor_data = g.MouseCursorData[g.MouseCursor];\n            const ImVec2 pos = g.IO.MousePos - cursor_data.HotOffset;\n            const ImVec2 size = cursor_data.Size;\n            const ImTextureID tex_id = g.IO.Fonts->TexID;\n            g.OverlayDrawList.PushTextureID(tex_id);\n            g.OverlayDrawList.AddImage(tex_id, pos+ImVec2(1,0), pos+ImVec2(1,0) + size, cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,48));        // Shadow\n            g.OverlayDrawList.AddImage(tex_id, pos+ImVec2(2,0), pos+ImVec2(2,0) + size, cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,48));        // Shadow\n            g.OverlayDrawList.AddImage(tex_id, pos,             pos + size,             cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,255));       // Black border\n            g.OverlayDrawList.AddImage(tex_id, pos,             pos + size,             cursor_data.TexUvMin[0], cursor_data.TexUvMax[0], IM_COL32(255,255,255,255)); // White fill\n            g.OverlayDrawList.PopTextureID();\n        }\n        if (!g.OverlayDrawList.VtxBuffer.empty())\n            AddDrawListToRenderList(g.RenderDrawLists[0], &g.OverlayDrawList);\n\n        // Setup draw data\n        g.RenderDrawData.Valid = true;\n        g.RenderDrawData.CmdLists = (g.RenderDrawLists[0].Size > 0) ? &g.RenderDrawLists[0][0] : NULL;\n        g.RenderDrawData.CmdListsCount = g.RenderDrawLists[0].Size;\n        g.RenderDrawData.TotalVtxCount = g.IO.MetricsRenderVertices;\n        g.RenderDrawData.TotalIdxCount = g.IO.MetricsRenderIndices;\n\n        // Render. If user hasn't set a callback then they may retrieve the draw data via GetDrawData()\n        if (g.RenderDrawData.CmdListsCount > 0 && g.IO.RenderDrawListsFn != NULL)\n            g.IO.RenderDrawListsFn(&g.RenderDrawData);\n    }\n}\n\nconst char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end)\n{\n    const char* text_display_end = text;\n    if (!text_end)\n        text_end = (const char*)-1;\n\n    while (text_display_end < text_end && *text_display_end != '\\0' && (text_display_end[0] != '#' || text_display_end[1] != '#'))\n        text_display_end++;\n    return text_display_end;\n}\n\n// Pass text data straight to log (without being displayed)\nvoid ImGui::LogText(const char* fmt, ...)\n{\n    ImGuiContext& g = *GImGui;\n    if (!g.LogEnabled)\n        return;\n\n    va_list args;\n    va_start(args, fmt);\n    if (g.LogFile)\n    {\n        vfprintf(g.LogFile, fmt, args);\n    }\n    else\n    {\n        g.LogClipboard->appendv(fmt, args);\n    }\n    va_end(args);\n}\n\n// Internal version that takes a position to decide on newline placement and pad items according to their depth.\n// We split text into individual lines to add current tree level padding\nstatic void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    if (!text_end)\n        text_end = ImGui::FindRenderedTextEnd(text, text_end);\n\n    const bool log_new_line = ref_pos && (ref_pos->y > window->DC.LogLinePosY + 1);\n    if (ref_pos)\n        window->DC.LogLinePosY = ref_pos->y;\n\n    const char* text_remaining = text;\n    if (g.LogStartDepth > window->DC.TreeDepth)  // Re-adjust padding if we have popped out of our starting depth\n        g.LogStartDepth = window->DC.TreeDepth;\n    const int tree_depth = (window->DC.TreeDepth - g.LogStartDepth);\n    for (;;)\n    {\n        // Split the string. Each new line (after a '\\n') is followed by spacing corresponding to the current depth of our log entry.\n        const char* line_end = text_remaining;\n        while (line_end < text_end)\n            if (*line_end == '\\n')\n                break;\n            else\n                line_end++;\n        if (line_end >= text_end)\n            line_end = NULL;\n\n        const bool is_first_line = (text == text_remaining);\n        bool is_last_line = false;\n        if (line_end == NULL)\n        {\n            is_last_line = true;\n            line_end = text_end;\n        }\n        if (line_end != NULL && !(is_last_line && (line_end - text_remaining)==0))\n        {\n            const int char_count = (int)(line_end - text_remaining);\n            if (log_new_line || !is_first_line)\n                ImGui::LogText(IM_NEWLINE \"%*s%.*s\", tree_depth*4, \"\", char_count, text_remaining);\n            else\n                ImGui::LogText(\" %.*s\", char_count, text_remaining);\n        }\n\n        if (is_last_line)\n            break;\n        text_remaining = line_end + 1;\n    }\n}\n\n// Internal ImGui functions to render text\n// RenderText***() functions calls ImDrawList::AddText() calls ImBitmapFont::RenderText()\nvoid ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    // Hide anything after a '##' string\n    const char* text_display_end;\n    if (hide_text_after_hash)\n    {\n        text_display_end = FindRenderedTextEnd(text, text_end);\n    }\n    else\n    {\n        if (!text_end)\n            text_end = text + strlen(text); // FIXME-OPT\n        text_display_end = text_end;\n    }\n\n    const int text_len = (int)(text_display_end - text);\n    if (text_len > 0)\n    {\n        window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end);\n        if (g.LogEnabled)\n            LogRenderedText(&pos, text, text_display_end);\n    }\n}\n\nvoid ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    if (!text_end)\n        text_end = text + strlen(text); // FIXME-OPT\n\n    const int text_len = (int)(text_end - text);\n    if (text_len > 0)\n    {\n        window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_end, wrap_width);\n        if (g.LogEnabled)\n            LogRenderedText(&pos, text, text_end);\n    }\n}\n\n// Default clip_rect uses (pos_min,pos_max)\n// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)\nvoid ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect)\n{\n    // Hide anything after a '##' string\n    const char* text_display_end = FindRenderedTextEnd(text, text_end);\n    const int text_len = (int)(text_display_end - text);\n    if (text_len == 0)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    // Perform CPU side clipping for single clipped element to avoid using scissor state\n    ImVec2 pos = pos_min;\n    const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_display_end, false, 0.0f);\n\n    const ImVec2* clip_min = clip_rect ? &clip_rect->Min : &pos_min;\n    const ImVec2* clip_max = clip_rect ? &clip_rect->Max : &pos_max;\n    bool need_clipping = (pos.x + text_size.x >= clip_max->x) || (pos.y + text_size.y >= clip_max->y);\n    if (clip_rect) // If we had no explicit clipping rectangle then pos==clip_min\n        need_clipping |= (pos.x < clip_min->x) || (pos.y < clip_min->y);\n\n    // Align whole block. We should defer that to the better rendering function when we'll have support for individual line alignment.\n    if (align.x > 0.0f) pos.x = ImMax(pos.x, pos.x + (pos_max.x - pos.x - text_size.x) * align.x);\n    if (align.y > 0.0f) pos.y = ImMax(pos.y, pos.y + (pos_max.y - pos.y - text_size.y) * align.y);\n\n    // Render\n    if (need_clipping)\n    {\n        ImVec4 fine_clip_rect(clip_min->x, clip_min->y, clip_max->x, clip_max->y);\n        window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect);\n    }\n    else\n    {\n        window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL);\n    }\n    if (g.LogEnabled)\n        LogRenderedText(&pos, text, text_display_end);\n}\n\n// Render a rectangle shaped with optional rounding and borders\nvoid ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, float rounding)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    window->DrawList->AddRectFilled(p_min, p_max, fill_col, rounding);\n    const float border_size = g.Style.FrameBorderSize;\n    if (border && border_size > 0.0f)\n    {\n        window->DrawList->AddRect(p_min+ImVec2(1,1), p_max+ImVec2(1,1), GetColorU32(ImGuiCol_BorderShadow), rounding, ImDrawCornerFlags_All, border_size);\n        window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, ImDrawCornerFlags_All, border_size);\n    }\n}\n\nvoid ImGui::RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    const float border_size = g.Style.FrameBorderSize;\n    if (border_size > 0.0f)\n    {\n        window->DrawList->AddRect(p_min+ImVec2(1,1), p_max+ImVec2(1,1), GetColorU32(ImGuiCol_BorderShadow), rounding, ImDrawCornerFlags_All, border_size);\n        window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, ImDrawCornerFlags_All, border_size);\n    }\n}\n\n// Render a triangle to denote expanded/collapsed state\nvoid ImGui::RenderTriangle(ImVec2 p_min, ImGuiDir dir, float scale)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    const float h = g.FontSize * 1.00f;\n    float r = h * 0.40f * scale;\n    ImVec2 center = p_min + ImVec2(h * 0.50f, h * 0.50f * scale);\n\n    ImVec2 a, b, c;\n    switch (dir)\n    {\n    case ImGuiDir_Up:\n        r = -r; // ...fall through, no break!\n    case ImGuiDir_Down:\n        center.y -= r * 0.25f;\n        a = ImVec2(0,1) * r;\n        b = ImVec2(-0.866f,-0.5f) * r;\n        c = ImVec2(+0.866f,-0.5f) * r;\n        break;\n    case ImGuiDir_Left:\n        r = -r; // ...fall through, no break!\n    case ImGuiDir_Right:\n        center.x -= r * 0.25f;\n        a = ImVec2(1,0) * r;\n        b = ImVec2(-0.500f,+0.866f) * r;\n        c = ImVec2(-0.500f,-0.866f) * r;\n        break;\n    default:\n        IM_ASSERT(0);\n        break;\n    }\n\n    window->DrawList->AddTriangleFilled(center + a, center + b, center + c, GetColorU32(ImGuiCol_Text));\n}\n\nvoid ImGui::RenderBullet(ImVec2 pos)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    window->DrawList->AddCircleFilled(pos, GImGui->FontSize*0.20f, GetColorU32(ImGuiCol_Text), 8);\n}\n\nvoid ImGui::RenderCheckMark(ImVec2 pos, ImU32 col, float sz)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    float thickness = ImMax(sz / 5.0f, 1.0f);\n    sz -= thickness*0.5f;\n    pos += ImVec2(thickness*0.25f, thickness*0.25f);\n\n    float third = sz / 3.0f;\n    float bx = pos.x + third;\n    float by = pos.y + sz - third*0.5f;\n    window->DrawList->PathLineTo(ImVec2(bx - third, by - third));\n    window->DrawList->PathLineTo(ImVec2(bx, by));\n    window->DrawList->PathLineTo(ImVec2(bx + third*2, by - third*2));\n    window->DrawList->PathStroke(col, false, thickness);\n}\n\n// Calculate text size. Text can be multi-line. Optionally ignore text after a ## marker.\n// CalcTextSize(\"\") should return ImVec2(0.0f, GImGui->FontSize)\nImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width)\n{\n    ImGuiContext& g = *GImGui;\n\n    const char* text_display_end;\n    if (hide_text_after_double_hash)\n        text_display_end = FindRenderedTextEnd(text, text_end);      // Hide anything after a '##' string\n    else\n        text_display_end = text_end;\n\n    ImFont* font = g.Font;\n    const float font_size = g.FontSize;\n    if (text == text_display_end)\n        return ImVec2(0.0f, font_size);\n    ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL);\n\n    // Cancel out character spacing for the last character of a line (it is baked into glyph->AdvanceX field)\n    const float font_scale = font_size / font->FontSize;\n    const float character_spacing_x = 1.0f * font_scale;\n    if (text_size.x > 0.0f)\n        text_size.x -= character_spacing_x;\n    text_size.x = (float)(int)(text_size.x + 0.95f);\n\n    return text_size;\n}\n\n// Helper to calculate coarse clipping of large list of evenly sized items.\n// NB: Prefer using the ImGuiListClipper higher-level helper if you can! Read comments and instructions there on how those use this sort of pattern.\n// NB: 'items_count' is only used to clamp the result, if you don't know your count you can use INT_MAX\nvoid ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    if (g.LogEnabled)\n    {\n        // If logging is active, do not perform any clipping\n        *out_items_display_start = 0;\n        *out_items_display_end = items_count;\n        return;\n    }\n    if (window->SkipItems)\n    {\n        *out_items_display_start = *out_items_display_end = 0;\n        return;\n    }\n\n    const ImVec2 pos = window->DC.CursorPos;\n    int start = (int)((window->ClipRect.Min.y - pos.y) / items_height);\n    int end = (int)((window->ClipRect.Max.y - pos.y) / items_height);\n    start = ImClamp(start, 0, items_count);\n    end = ImClamp(end + 1, start, items_count);\n    *out_items_display_start = start;\n    *out_items_display_end = end;\n}\n\n// Find window given position, search front-to-back\n// FIXME: Note that we have a lag here because WindowRectClipped is updated in Begin() so windows moved by user via SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is called, aka before the next Begin(). Moving window thankfully isn't affected.\nstatic ImGuiWindow* FindHoveredWindow(ImVec2 pos)\n{\n    ImGuiContext& g = *GImGui;\n    for (int i = g.Windows.Size-1; i >= 0; i--)\n    {\n        ImGuiWindow* window = g.Windows[i];\n        if (!window->Active)\n            continue;\n        if (window->Flags & ImGuiWindowFlags_NoInputs)\n            continue;\n\n        // Using the clipped AABB, a child window will typically be clipped by its parent (not always)\n        ImRect bb(window->WindowRectClipped.Min - g.Style.TouchExtraPadding, window->WindowRectClipped.Max + g.Style.TouchExtraPadding);\n        if (bb.Contains(pos))\n            return window;\n    }\n    return NULL;\n}\n\n// Test if mouse cursor is hovering given rectangle\n// NB- Rectangle is clipped by our current clip setting\n// NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding)\nbool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    // Clip\n    ImRect rect_clipped(r_min, r_max);\n    if (clip)\n        rect_clipped.ClipWith(window->ClipRect);\n\n    // Expand for touch input\n    const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding);\n    return rect_for_touch.Contains(g.IO.MousePos);\n}\n\nbool ImGui::IsAnyWindowHovered()\n{\n    ImGuiContext& g = *GImGui;\n    return g.HoveredWindow != NULL;\n}\n\nstatic bool IsKeyPressedMap(ImGuiKey key, bool repeat)\n{\n    const int key_index = GImGui->IO.KeyMap[key];\n    return (key_index >= 0) ? ImGui::IsKeyPressed(key_index, repeat) : false;\n}\n\nint ImGui::GetKeyIndex(ImGuiKey imgui_key)\n{\n    IM_ASSERT(imgui_key >= 0 && imgui_key < ImGuiKey_COUNT);\n    return GImGui->IO.KeyMap[imgui_key];\n}\n\n// Note that imgui doesn't know the semantic of each entry of io.KeyDown[]. Use your own indices/enums according to how your backend/engine stored them into KeyDown[]!\nbool ImGui::IsKeyDown(int user_key_index)\n{\n    if (user_key_index < 0) return false;\n    IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(GImGui->IO.KeysDown));\n    return GImGui->IO.KeysDown[user_key_index];\n}\n\nint ImGui::CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate)\n{\n    if (t == 0.0f)\n        return 1;\n    if (t <= repeat_delay || repeat_rate <= 0.0f)\n        return 0;\n    const int count = (int)((t - repeat_delay) / repeat_rate) - (int)((t_prev - repeat_delay) / repeat_rate);\n    return (count > 0) ? count : 0;\n}\n\nint ImGui::GetKeyPressedAmount(int key_index, float repeat_delay, float repeat_rate)\n{\n    ImGuiContext& g = *GImGui;\n    if (key_index < 0) return false;\n    IM_ASSERT(key_index >= 0 && key_index < IM_ARRAYSIZE(g.IO.KeysDown));\n    const float t = g.IO.KeysDownDuration[key_index];\n    return CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, repeat_delay, repeat_rate);\n}\n\nbool ImGui::IsKeyPressed(int user_key_index, bool repeat)\n{\n    ImGuiContext& g = *GImGui;\n    if (user_key_index < 0) return false;\n    IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown));\n    const float t = g.IO.KeysDownDuration[user_key_index];\n    if (t == 0.0f)\n        return true;\n    if (repeat && t > g.IO.KeyRepeatDelay)\n        return GetKeyPressedAmount(user_key_index, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0;\n    return false;\n}\n\nbool ImGui::IsKeyReleased(int user_key_index)\n{\n    ImGuiContext& g = *GImGui;\n    if (user_key_index < 0) return false;\n    IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown));\n    if (g.IO.KeysDownDurationPrev[user_key_index] >= 0.0f && !g.IO.KeysDown[user_key_index])\n        return true;\n    return false;\n}\n\nbool ImGui::IsMouseDown(int button)\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));\n    return g.IO.MouseDown[button];\n}\n\nbool ImGui::IsMouseClicked(int button, bool repeat)\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));\n    const float t = g.IO.MouseDownDuration[button];\n    if (t == 0.0f)\n        return true;\n\n    if (repeat && t > g.IO.KeyRepeatDelay)\n    {\n        float delay = g.IO.KeyRepeatDelay, rate = g.IO.KeyRepeatRate;\n        if ((fmodf(t - delay, rate) > rate*0.5f) != (fmodf(t - delay - g.IO.DeltaTime, rate) > rate*0.5f))\n            return true;\n    }\n\n    return false;\n}\n\nbool ImGui::IsMouseReleased(int button)\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));\n    return g.IO.MouseReleased[button];\n}\n\nbool ImGui::IsMouseDoubleClicked(int button)\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));\n    return g.IO.MouseDoubleClicked[button];\n}\n\nbool ImGui::IsMouseDragging(int button, float lock_threshold)\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));\n    if (!g.IO.MouseDown[button])\n        return false;\n    if (lock_threshold < 0.0f)\n        lock_threshold = g.IO.MouseDragThreshold;\n    return g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold;\n}\n\nImVec2 ImGui::GetMousePos()\n{\n    return GImGui->IO.MousePos;\n}\n\n// NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed!\nImVec2 ImGui::GetMousePosOnOpeningCurrentPopup()\n{\n    ImGuiContext& g = *GImGui;\n    if (g.CurrentPopupStack.Size > 0)\n        return g.OpenPopupStack[g.CurrentPopupStack.Size-1].MousePosOnOpen;\n    return g.IO.MousePos;\n}\n\n// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position\nbool ImGui::IsMousePosValid(const ImVec2* mouse_pos)\n{\n    if (mouse_pos == NULL)\n        mouse_pos = &GImGui->IO.MousePos;\n    const float MOUSE_INVALID = -256000.0f;\n    return mouse_pos->x >= MOUSE_INVALID && mouse_pos->y >= MOUSE_INVALID;\n}\n\nImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold)\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));\n    if (lock_threshold < 0.0f)\n        lock_threshold = g.IO.MouseDragThreshold;\n    if (g.IO.MouseDown[button])\n        if (g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold)\n            return g.IO.MousePos - g.IO.MouseClickedPos[button];     // Assume we can only get active with left-mouse button (at the moment).\n    return ImVec2(0.0f, 0.0f);\n}\n\nvoid ImGui::ResetMouseDragDelta(int button)\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));\n    // NB: We don't need to reset g.IO.MouseDragMaxDistanceSqr\n    g.IO.MouseClickedPos[button] = g.IO.MousePos;\n}\n\nImGuiMouseCursor ImGui::GetMouseCursor()\n{\n    return GImGui->MouseCursor;\n}\n\nvoid ImGui::SetMouseCursor(ImGuiMouseCursor cursor_type)\n{\n    GImGui->MouseCursor = cursor_type;\n}\n\nvoid ImGui::CaptureKeyboardFromApp(bool capture)\n{\n    GImGui->WantCaptureKeyboardNextFrame = capture ? 1 : 0;\n}\n\nvoid ImGui::CaptureMouseFromApp(bool capture)\n{\n    GImGui->WantCaptureMouseNextFrame = capture ? 1 : 0;\n}\n\nbool ImGui::IsItemActive()\n{\n    ImGuiContext& g = *GImGui;\n    if (g.ActiveId)\n    {\n        ImGuiWindow* window = g.CurrentWindow;\n        return g.ActiveId == window->DC.LastItemId;\n    }\n    return false;\n}\n\nbool ImGui::IsItemClicked(int mouse_button)\n{\n    return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_Default);\n}\n\nbool ImGui::IsAnyItemHovered()\n{\n    return GImGui->HoveredId != 0 || GImGui->HoveredIdPreviousFrame != 0;\n}\n\nbool ImGui::IsAnyItemActive()\n{\n    return GImGui->ActiveId != 0;\n}\n\nbool ImGui::IsItemVisible()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->ClipRect.Overlaps(window->DC.LastItemRect);\n}\n\n// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority.\nvoid ImGui::SetItemAllowOverlap()\n{\n    ImGuiContext& g = *GImGui;\n    if (g.HoveredId == g.CurrentWindow->DC.LastItemId)\n        g.HoveredIdAllowOverlap = true;\n    if (g.ActiveId == g.CurrentWindow->DC.LastItemId)\n        g.ActiveIdAllowOverlap = true;\n}\n\nImVec2 ImGui::GetItemRectMin()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.LastItemRect.Min;\n}\n\nImVec2 ImGui::GetItemRectMax()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.LastItemRect.Max;\n}\n\nImVec2 ImGui::GetItemRectSize()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.LastItemRect.GetSize();\n}\n\nImVec2 ImGui::CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge, float outward)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    ImRect rect = window->DC.LastItemRect;\n    rect.Expand(outward);\n    return rect.GetClosestPoint(pos, on_edge);\n}\n\nstatic ImRect GetVisibleRect()\n{\n    ImGuiContext& g = *GImGui;\n    if (g.IO.DisplayVisibleMin.x != g.IO.DisplayVisibleMax.x && g.IO.DisplayVisibleMin.y != g.IO.DisplayVisibleMax.y)\n        return ImRect(g.IO.DisplayVisibleMin, g.IO.DisplayVisibleMax);\n    return ImRect(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y);\n}\n\n// Not exposed publicly as BeginTooltip() because bool parameters are evil. Let's see if other needs arise first.\nvoid ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip)\n{\n    ImGuiContext& g = *GImGui;\n    char window_name[16];\n    ImFormatString(window_name, IM_ARRAYSIZE(window_name), \"##Tooltip%02d\", g.TooltipOverrideCount);\n    if (override_previous_tooltip)\n        if (ImGuiWindow* window = ImGui::FindWindowByName(window_name))\n            if (window->Active)\n            {\n                // Hide previous tooltips. We can't easily \"reset\" the content of a window so we create a new one.\n                window->HiddenFrames = 1;\n                ImFormatString(window_name, IM_ARRAYSIZE(window_name), \"##Tooltip%02d\", ++g.TooltipOverrideCount);\n            }\n    ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_AlwaysAutoResize;\n    ImGui::Begin(window_name, NULL, flags | extra_flags);\n}\n\nvoid ImGui::SetTooltipV(const char* fmt, va_list args)\n{\n    BeginTooltipEx(0, true);\n    TextV(fmt, args);\n    EndTooltip();\n}\n\nvoid ImGui::SetTooltip(const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    SetTooltipV(fmt, args);\n    va_end(args);\n}\n\nvoid ImGui::BeginTooltip()\n{\n    BeginTooltipEx(0, false);\n}\n\nvoid ImGui::EndTooltip()\n{\n    IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip);   // Mismatched BeginTooltip()/EndTooltip() calls\n    ImGui::End();\n}\n\n// Mark popup as open (toggle toward open state).\n// Popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block.\n// Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).\n// One open popup per level of the popup hierarchy (NB: when assigning we reset the Window member of ImGuiPopupRef to NULL)\nvoid ImGui::OpenPopupEx(ImGuiID id, bool reopen_existing)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    int current_stack_size = g.CurrentPopupStack.Size;\n    ImGuiPopupRef popup_ref = ImGuiPopupRef(id, window, window->GetID(\"##menus\"), g.IO.MousePos); // Tagged as new ref because constructor sets Window to NULL (we are passing the ParentWindow info here)\n    if (g.OpenPopupStack.Size < current_stack_size + 1)\n        g.OpenPopupStack.push_back(popup_ref);\n    else if (reopen_existing || g.OpenPopupStack[current_stack_size].PopupId != id)\n    {\n        g.OpenPopupStack.resize(current_stack_size+1);\n        g.OpenPopupStack[current_stack_size] = popup_ref;\n\n        // When reopening a popup we first refocus its parent, otherwise if its parent is itself a popup it would get closed by CloseInactivePopups().\n        // This is equivalent to what ClosePopupToLevel() does.\n        if (g.OpenPopupStack[current_stack_size].PopupId == id)\n            FocusWindow(window);\n    }\n}\n\nvoid ImGui::OpenPopup(const char* str_id)\n{\n    ImGuiContext& g = *GImGui;\n    OpenPopupEx(g.CurrentWindow->GetID(str_id), false);\n}\n\nstatic void CloseInactivePopups(ImGuiWindow* ref_window)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.OpenPopupStack.empty())\n        return;\n\n    // When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it.\n    // Don't close our own child popup windows.\n    int n = 0;\n    if (ref_window)\n    {\n        for (n = 0; n < g.OpenPopupStack.Size; n++)\n        {\n            ImGuiPopupRef& popup = g.OpenPopupStack[n];\n            if (!popup.Window)\n                continue;\n            IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0);\n            if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow)\n                continue;\n\n            // Trim the stack if popups are not direct descendant of the reference window (which is often the NavWindow)\n            bool has_focus = false;\n            for (int m = n; m < g.OpenPopupStack.Size && !has_focus; m++)\n                has_focus = (g.OpenPopupStack[m].Window && g.OpenPopupStack[m].Window->RootWindow == ref_window->RootWindow);\n            if (!has_focus)\n                break;\n        }\n    }\n    if (n < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the block below\n        ClosePopupToLevel(n);\n}\n\nstatic ImGuiWindow* GetFrontMostModalRootWindow()\n{\n    ImGuiContext& g = *GImGui;\n    for (int n = g.OpenPopupStack.Size-1; n >= 0; n--)\n        if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window)\n            if (popup->Flags & ImGuiWindowFlags_Modal)\n                return popup;\n    return NULL;\n}\n\nstatic void ClosePopupToLevel(int remaining)\n{\n    ImGuiContext& g = *GImGui;\n    if (remaining > 0)\n        ImGui::FocusWindow(g.OpenPopupStack[remaining-1].Window);\n    else\n        ImGui::FocusWindow(g.OpenPopupStack[0].ParentWindow);\n    g.OpenPopupStack.resize(remaining);\n}\n\nvoid ImGui::ClosePopup(ImGuiID id)\n{\n    if (!IsPopupOpen(id))\n        return;\n    ImGuiContext& g = *GImGui;\n    ClosePopupToLevel(g.OpenPopupStack.Size - 1);\n}\n\n// Close the popup we have begin-ed into.\nvoid ImGui::CloseCurrentPopup()\n{\n    ImGuiContext& g = *GImGui;\n    int popup_idx = g.CurrentPopupStack.Size - 1;\n    if (popup_idx < 0 || popup_idx >= g.OpenPopupStack.Size || g.CurrentPopupStack[popup_idx].PopupId != g.OpenPopupStack[popup_idx].PopupId)\n        return;\n    while (popup_idx > 0 && g.OpenPopupStack[popup_idx].Window && (g.OpenPopupStack[popup_idx].Window->Flags & ImGuiWindowFlags_ChildMenu))\n        popup_idx--;\n    ClosePopupToLevel(popup_idx);\n}\n\nstatic inline void ClearSetNextWindowData()\n{\n    // FIXME-OPT\n    ImGuiContext& g = *GImGui;\n    g.SetNextWindowPosCond = g.SetNextWindowSizeCond = g.SetNextWindowContentSizeCond = g.SetNextWindowCollapsedCond = 0;\n    g.SetNextWindowSizeConstraint = g.SetNextWindowFocus = false;\n}\n\nbool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags)\n{\n    ImGuiContext& g = *GImGui;\n    if (!IsPopupOpen(id))\n    {\n        ClearSetNextWindowData(); // We behave like Begin() and need to consume those values\n        return false;\n    }\n\n    ImGuiWindowFlags flags = extra_flags|ImGuiWindowFlags_Popup|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings;\n\n    char name[20];\n    if (flags & ImGuiWindowFlags_ChildMenu)\n        ImFormatString(name, IM_ARRAYSIZE(name), \"##menu_%d\", g.CurrentPopupStack.Size);    // Recycle windows based on depth\n    else\n        ImFormatString(name, IM_ARRAYSIZE(name), \"##popup_%08x\", id); // Not recycling, so we can close/open during the same frame\n\n    bool is_open = Begin(name, NULL, flags);\n    if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display)\n        EndPopup();\n\n    return is_open;\n}\n\nbool ImGui::BeginPopup(const char* str_id)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.OpenPopupStack.Size <= g.CurrentPopupStack.Size) // Early out for performance\n    {\n        ClearSetNextWindowData(); // We behave like Begin() and need to consume those values\n        return false;\n    }\n    return BeginPopupEx(g.CurrentWindow->GetID(str_id), ImGuiWindowFlags_AlwaysAutoResize);\n}\n\nbool ImGui::IsPopupOpen(ImGuiID id)\n{\n    ImGuiContext& g = *GImGui;\n    return g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].PopupId == id;\n}\n\nbool ImGui::IsPopupOpen(const char* str_id)\n{\n    ImGuiContext& g = *GImGui;\n    return g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].PopupId == g.CurrentWindow->GetID(str_id);\n}\n\nbool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags extra_flags)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    const ImGuiID id = window->GetID(name);\n    if (!IsPopupOpen(id))\n    {\n        ClearSetNextWindowData(); // We behave like Begin() and need to consume those values\n        return false;\n    }\n\n    // Center modal windows by default\n    if ((window->SetWindowPosAllowFlags & g.SetNextWindowPosCond) == 0)\n        SetNextWindowPos(g.IO.DisplaySize * 0.5f, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));\n\n    ImGuiWindowFlags flags = extra_flags|ImGuiWindowFlags_Popup|ImGuiWindowFlags_Modal|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoSavedSettings;\n    bool is_open = Begin(name, p_open, flags);\n    if (!is_open || (p_open && !*p_open)) // NB: is_open can be 'false' when the popup is completely clipped (e.g. zero size display)\n    {\n        EndPopup();\n        if (is_open)\n            ClosePopup(id);\n        return false;\n    }\n\n    return is_open;\n}\n\nvoid ImGui::EndPopup()\n{\n    ImGuiContext& g = *GImGui; (void)g;\n    IM_ASSERT(g.CurrentWindow->Flags & ImGuiWindowFlags_Popup);  // Mismatched BeginPopup()/EndPopup() calls\n    IM_ASSERT(g.CurrentPopupStack.Size > 0);\n    End();\n}\n\nbool ImGui::OpenPopupOnItemClick(const char* str_id, int mouse_button)\n{\n    ImGuiWindow* window = GImGui->CurrentWindow;\n    if (IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup))\n    {\n        ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict!\n        IM_ASSERT(id != 0);                                                  // However, you cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item)\n        OpenPopupEx(id, true);\n        return true;\n    }\n    return false;\n}\n\n// This is a helper to handle the simplest case of associating one named popup to one given widget.\n// You may want to handle this on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters).\n// You can pass a NULL str_id to use the identifier of the last item.\nbool ImGui::BeginPopupContextItem(const char* str_id, int mouse_button)\n{\n    ImGuiWindow* window = GImGui->CurrentWindow;\n    ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict!\n    IM_ASSERT(id != 0);                                                  // However, you cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item)\n    if (IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup))\n        OpenPopupEx(id, true);\n    return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize);\n}\n\nbool ImGui::BeginPopupContextWindow(const char* str_id, int mouse_button, bool also_over_items)\n{\n    if (!str_id)\n        str_id = \"window_context\";\n    ImGuiID id = GImGui->CurrentWindow->GetID(str_id);\n    if (IsMouseClicked(mouse_button))\n        if (IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup))\n            if (also_over_items || !IsAnyItemHovered())\n                OpenPopupEx(id, true);\n    return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize);\n}\n\nbool ImGui::BeginPopupContextVoid(const char* str_id, int mouse_button)\n{\n    if (!str_id) \n        str_id = \"void_context\";\n    ImGuiID id = GImGui->CurrentWindow->GetID(str_id);\n    if (!IsAnyWindowHovered() && IsMouseClicked(mouse_button))\n        OpenPopupEx(id, true);\n    return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize);\n}\n\nstatic bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* parent_window = ImGui::GetCurrentWindow();\n    ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_ChildWindow;\n    flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove);  // Inherit the NoMove flag\n\n    const ImVec2 content_avail = ImGui::GetContentRegionAvail();\n    ImVec2 size = ImFloor(size_arg);\n    const int auto_fit_axises = ((size.x == 0.0f) ? 0x01 : 0x00) | ((size.y == 0.0f) ? 0x02 : 0x00);\n    if (size.x <= 0.0f)\n        size.x = ImMax(content_avail.x, 4.0f) - fabsf(size.x); // Arbitrary minimum zero-ish child size of 4.0f (0.0f causing too much issues)\n    if (size.y <= 0.0f)\n        size.y = ImMax(content_avail.y, 4.0f) - fabsf(size.y);\n\n    const float backup_border_size = g.Style.ChildBorderSize;\n    if (!border)\n        g.Style.ChildBorderSize = 0.0f;\n    flags |= extra_flags;\n\n    char title[256];\n    if (name)\n        ImFormatString(title, IM_ARRAYSIZE(title), \"%s/%s_%08X\", parent_window->Name, name, id);\n    else\n        ImFormatString(title, IM_ARRAYSIZE(title), \"%s/%08X\", parent_window->Name, id);\n\n    ImGui::SetNextWindowSize(size);\n    bool ret = ImGui::Begin(title, NULL, flags);\n    ImGuiWindow* child_window = ImGui::GetCurrentWindow();\n    child_window->AutoFitChildAxises = auto_fit_axises;\n    g.Style.ChildBorderSize = backup_border_size;\n\n    return ret;\n}\n\nbool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    return BeginChildEx(str_id, window->GetID(str_id), size_arg, border, extra_flags);\n}\n\nbool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags)\n{\n    return BeginChildEx(NULL, id, size_arg, border, extra_flags);\n}\n\nvoid ImGui::EndChild()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n\n    IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow);   // Mismatched BeginChild()/EndChild() callss\n    if ((window->Flags & ImGuiWindowFlags_ComboBox) || window->BeginCount > 1)\n    {\n        ImGui::End();\n    }\n    else\n    {\n        // When using auto-filling child window, we don't provide full width/height to ItemSize so that it doesn't feed back into automatic size-fitting.\n        ImVec2 sz = GetWindowSize();\n        if (window->AutoFitChildAxises & 0x01) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f\n            sz.x = ImMax(4.0f, sz.x);\n        if (window->AutoFitChildAxises & 0x02)\n            sz.y = ImMax(4.0f, sz.y);\n        ImGui::End();\n\n        ImGuiWindow* parent_window = GetCurrentWindow();\n        ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + sz);\n        ItemSize(sz);\n        ItemAdd(bb, 0);\n    }\n}\n\n// Helper to create a child window / scrolling region that looks like a normal widget frame.\nbool ImGui::BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags)\n{\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]);\n    PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding);\n    PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize);\n    PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding);\n    return BeginChild(id, size, true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding | extra_flags);\n}\n\nvoid ImGui::EndChildFrame()\n{\n    EndChild();\n    PopStyleVar(3);\n    PopStyleColor();\n}\n\n// Save and compare stack sizes on Begin()/End() to detect usage errors\nstatic void CheckStacksSize(ImGuiWindow* window, bool write)\n{\n    // NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin)\n    ImGuiContext& g = *GImGui;\n    int* p_backup = &window->DC.StackSizesBackup[0];\n    { int current = window->IDStack.Size;       if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && \"PushID/PopID or TreeNode/TreePop Mismatch!\");   p_backup++; }    // Too few or too many PopID()/TreePop()\n    { int current = window->DC.GroupStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && \"BeginGroup/EndGroup Mismatch!\");                p_backup++; }    // Too few or too many EndGroup()\n    { int current = g.CurrentPopupStack.Size;   if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && \"BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch\"); p_backup++;}// Too few or too many EndMenu()/EndPopup()\n    { int current = g.ColorModifiers.Size;      if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && \"PushStyleColor/PopStyleColor Mismatch!\");       p_backup++; }    // Too few or too many PopStyleColor()\n    { int current = g.StyleModifiers.Size;      if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && \"PushStyleVar/PopStyleVar Mismatch!\");           p_backup++; }    // Too few or too many PopStyleVar()\n    { int current = g.FontStack.Size;           if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && \"PushFont/PopFont Mismatch!\");                   p_backup++; }    // Too few or too many PopFont()\n    IM_ASSERT(p_backup == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup));\n}\n\nstatic ImVec2 FindBestPopupWindowPos(const ImVec2& base_pos, const ImVec2& size, int* last_dir, const ImRect& r_inner)\n{\n    const ImGuiStyle& style = GImGui->Style;\n\n    // Clamp into visible area while not overlapping the cursor. Safety padding is optional if our popup size won't fit without it.\n    ImVec2 safe_padding = style.DisplaySafeAreaPadding;\n    ImRect r_outer(GetVisibleRect());\n    r_outer.Expand(ImVec2((size.x - r_outer.GetWidth() > safe_padding.x*2) ? -safe_padding.x : 0.0f, (size.y - r_outer.GetHeight() > safe_padding.y*2) ? -safe_padding.y : 0.0f));\n    ImVec2 base_pos_clamped = ImClamp(base_pos, r_outer.Min, r_outer.Max - size);\n\n    for (int n = (*last_dir != -1) ? -1 : 0; n < 4; n++)   // Last, Right, down, up, left. (Favor last used direction).\n    {\n        const int dir = (n == -1) ? *last_dir : n;\n        ImRect rect(dir == 0 ? r_inner.Max.x : r_outer.Min.x, dir == 1 ? r_inner.Max.y : r_outer.Min.y, dir == 3 ? r_inner.Min.x : r_outer.Max.x, dir == 2 ? r_inner.Min.y : r_outer.Max.y);\n        if (rect.GetWidth() < size.x || rect.GetHeight() < size.y)\n            continue;\n        *last_dir = dir;\n        return ImVec2(dir == 0 ? r_inner.Max.x : dir == 3 ? r_inner.Min.x - size.x : base_pos_clamped.x, dir == 1 ? r_inner.Max.y : dir == 2 ? r_inner.Min.y - size.y : base_pos_clamped.y);\n    }\n\n    // Fallback, try to keep within display\n    *last_dir = -1;\n    ImVec2 pos = base_pos;\n    pos.x = ImMax(ImMin(pos.x + size.x, r_outer.Max.x) - size.x, r_outer.Min.x);\n    pos.y = ImMax(ImMin(pos.y + size.y, r_outer.Max.y) - size.y, r_outer.Min.y);\n    return pos;\n}\n\nstatic void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled)\n{\n    window->SetWindowPosAllowFlags       = enabled ? (window->SetWindowPosAllowFlags       | flags) : (window->SetWindowPosAllowFlags       & ~flags);\n    window->SetWindowSizeAllowFlags      = enabled ? (window->SetWindowSizeAllowFlags      | flags) : (window->SetWindowSizeAllowFlags      & ~flags);\n    window->SetWindowCollapsedAllowFlags = enabled ? (window->SetWindowCollapsedAllowFlags | flags) : (window->SetWindowCollapsedAllowFlags & ~flags);\n}\n\nImGuiWindow* ImGui::FindWindowByName(const char* name)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiID id = ImHash(name, 0);\n    return (ImGuiWindow*)g.WindowsById.GetVoidPtr(id);\n}\n\nstatic ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n\n    // Create window the first time\n    ImGuiWindow* window = (ImGuiWindow*)ImGui::MemAlloc(sizeof(ImGuiWindow));\n    IM_PLACEMENT_NEW(window) ImGuiWindow(name);\n    window->Flags = flags;\n    g.WindowsById.SetVoidPtr(window->ID, window);\n\n    if (flags & ImGuiWindowFlags_NoSavedSettings)\n    {\n        // User can disable loading and saving of settings. Tooltip and child windows also don't store settings.\n        window->Size = window->SizeFull = size;\n    }\n    else\n    {\n        // Retrieve settings from .ini file\n        // Use SetWindowPos() or SetNextWindowPos() with the appropriate condition flag to change the initial position of a window.\n        window->PosFloat = ImVec2(60, 60);\n        window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);\n\n        ImGuiIniData* settings = FindWindowSettings(name);\n        if (!settings)\n            settings = AddWindowSettings(name);\n        else\n            SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);\n\n        if (settings->Pos.x != FLT_MAX)\n        {\n            window->PosFloat = settings->Pos;\n            window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);\n            window->Collapsed = settings->Collapsed;\n        }\n\n        if (ImLengthSqr(settings->Size) > 0.00001f)\n            size = settings->Size;\n        window->Size = window->SizeFull = size;\n    }\n\n    if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)\n    {\n        window->AutoFitFramesX = window->AutoFitFramesY = 2;\n        window->AutoFitOnlyGrows = false;\n    }\n    else\n    {\n        if (window->Size.x <= 0.0f)\n            window->AutoFitFramesX = 2;\n        if (window->Size.y <= 0.0f)\n            window->AutoFitFramesY = 2;\n        window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0);\n    }\n\n    if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus)\n        g.Windows.insert(g.Windows.begin(), window); // Quite slow but rare and only once\n    else\n        g.Windows.push_back(window);\n    return window;\n}\n\nstatic ImVec2 CalcSizeFullWithConstraint(ImGuiWindow* window, ImVec2 new_size)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.SetNextWindowSizeConstraint)\n    {\n        // Using -1,-1 on either X/Y axis to preserve the current size.\n        ImRect cr = g.SetNextWindowSizeConstraintRect;\n        new_size.x = (cr.Min.x >= 0 && cr.Max.x >= 0) ? ImClamp(new_size.x, cr.Min.x, cr.Max.x) : window->SizeFull.x;\n        new_size.y = (cr.Min.y >= 0 && cr.Max.y >= 0) ? ImClamp(new_size.y, cr.Min.y, cr.Max.y) : window->SizeFull.y;\n        if (g.SetNextWindowSizeConstraintCallback)\n        {\n            ImGuiSizeConstraintCallbackData data;\n            data.UserData = g.SetNextWindowSizeConstraintCallbackUserData;\n            data.Pos = window->Pos;\n            data.CurrentSize = window->SizeFull;\n            data.DesiredSize = new_size;\n            g.SetNextWindowSizeConstraintCallback(&data);\n            new_size = data.DesiredSize;\n        }\n    }\n    if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize)))\n    {\n        new_size = ImMax(new_size, g.Style.WindowMinSize);\n        new_size.y = ImMax(new_size.y, window->TitleBarHeight() + window->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows\n    }\n    return new_size;\n}\n\nstatic ImVec2 CalcSizeAutoFit(ImGuiWindow* window)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiStyle& style = g.Style;\n    ImGuiWindowFlags flags = window->Flags;\n    ImVec2 size_auto_fit;\n    if ((flags & ImGuiWindowFlags_Tooltip) != 0)\n    {\n        // Tooltip always resize. We keep the spacing symmetric on both axises for aesthetic purpose.\n        size_auto_fit = window->SizeContents + window->WindowPadding - ImVec2(0.0f, style.ItemSpacing.y);\n    }\n    else\n    {\n        // Handling case of auto fit window not fitting on the screen (on either axis): we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than DisplaySize-WindowPadding.\n        size_auto_fit = ImClamp(window->SizeContents + window->WindowPadding, style.WindowMinSize, ImMax(style.WindowMinSize, g.IO.DisplaySize - g.Style.DisplaySafeAreaPadding));\n        ImVec2 size_auto_fit_after_constraint = CalcSizeFullWithConstraint(window, size_auto_fit);\n        if (size_auto_fit_after_constraint.x < window->SizeContents.x && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar))\n            size_auto_fit.y += style.ScrollbarSize;\n        if (size_auto_fit_after_constraint.y < window->SizeContents.y && !(flags & ImGuiWindowFlags_NoScrollbar))\n            size_auto_fit.x += style.ScrollbarSize;\n        size_auto_fit.y = ImMax(size_auto_fit.y - style.ItemSpacing.y, 0.0f);\n    }\n    return size_auto_fit;\n}\n\nstatic ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)\n{\n    ImVec2 scroll = window->Scroll;\n    float cr_x = window->ScrollTargetCenterRatio.x;\n    float cr_y = window->ScrollTargetCenterRatio.y;\n    if (window->ScrollTarget.x < FLT_MAX)\n        scroll.x = window->ScrollTarget.x - cr_x * (window->SizeFull.x - window->ScrollbarSizes.x);\n    if (window->ScrollTarget.y < FLT_MAX)\n        scroll.y = window->ScrollTarget.y - (1.0f - cr_y) * (window->TitleBarHeight() + window->MenuBarHeight()) - cr_y * (window->SizeFull.y - window->ScrollbarSizes.y);\n    scroll = ImMax(scroll, ImVec2(0.0f, 0.0f));\n    if (!window->Collapsed && !window->SkipItems)\n    {\n        scroll.x = ImMin(scroll.x, ImMax(0.0f, window->SizeContents.x - (window->SizeFull.x - window->ScrollbarSizes.x))); // == GetScrollMaxX for that window\n        scroll.y = ImMin(scroll.y, ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y))); // == GetScrollMaxY for that window\n    }\n    return scroll;\n}\n\nstatic ImGuiCol GetWindowBgColorIdxFromFlags(ImGuiWindowFlags flags)\n{\n    if (flags & (ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup))\n        return ImGuiCol_PopupBg;\n    if (flags & ImGuiWindowFlags_ChildWindow)\n        return ImGuiCol_ChildBg;\n    return ImGuiCol_WindowBg;\n}\n\n// Push a new ImGui window to add widgets to.\n// - A default window called \"Debug\" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair.\n// - Begin/End can be called multiple times during the frame with the same window name to append content.\n// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file).\n//   You can use the \"##\" or \"###\" markers to use the same label with different id, or same id with different label. See documentation at the top of this file.\n// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned.\n// - Passing 'bool* p_open' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed.\nbool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    IM_ASSERT(name != NULL);                        // Window name required\n    IM_ASSERT(g.Initialized);                       // Forgot to call ImGui::NewFrame()\n    IM_ASSERT(g.FrameCountEnded != g.FrameCount);   // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet\n\n    if (flags & ImGuiWindowFlags_NoInputs)\n        flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;\n\n    // Find or create\n    bool window_is_new = false;\n    ImGuiWindow* window = FindWindowByName(name);\n    if (!window)\n    {\n        ImVec2 size_on_first_use = (g.SetNextWindowSizeCond != 0) ? g.SetNextWindowSizeVal : ImVec2(0.0f, 0.0f); // Any condition flag will do since we are creating a new window here.\n        window = CreateNewWindow(name, size_on_first_use, flags);\n        window_is_new = true;\n    }\n\n    const int current_frame = g.FrameCount;\n    const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame);\n    if (first_begin_of_the_frame)\n        window->Flags = (ImGuiWindowFlags)flags;\n    else\n        flags = window->Flags;\n\n    // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack\n    ImGuiWindow* parent_window = first_begin_of_the_frame ? (!g.CurrentWindowStack.empty() ? g.CurrentWindowStack.back() : NULL) : window->ParentWindow;\n    IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow));\n\n    // Add to stack\n    g.CurrentWindowStack.push_back(window);\n    SetCurrentWindow(window);\n    CheckStacksSize(window, true);\n\n    bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1);   // Not using !WasActive because the implicit \"Debug\" window would always toggle off->on\n    if (flags & ImGuiWindowFlags_Popup)\n    {\n        ImGuiPopupRef& popup_ref = g.OpenPopupStack[g.CurrentPopupStack.Size];\n        window_just_activated_by_user |= (window->PopupId != popup_ref.PopupId); // We recycle popups so treat window as activated if popup id changed\n        window_just_activated_by_user |= (window != popup_ref.Window);\n        popup_ref.Window = window;\n        g.CurrentPopupStack.push_back(popup_ref);\n        window->PopupId = popup_ref.PopupId;\n    }\n\n    const bool window_just_appearing_after_hidden_for_resize = (window->HiddenFrames == 1);\n    window->Appearing = (window_just_activated_by_user || window_just_appearing_after_hidden_for_resize);\n    window->CloseButton = (p_open != NULL);\n\n    // Process SetNextWindow***() calls\n    if (window->Appearing)\n        SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, true);\n    bool window_pos_set_by_api = false, window_size_set_by_api = false;\n    if (g.SetNextWindowPosCond)\n    {\n        window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.SetNextWindowPosCond) != 0;\n        if (window_pos_set_by_api && ImLengthSqr(g.SetNextWindowPosPivot) > 0.00001f)\n        {\n            // May be processed on the next frame if this is our first frame and we are measuring size\n            // FIXME: Look into removing the branch so everything can go through this same code path for consistency.\n            window->SetWindowPosVal = g.SetNextWindowPosVal;\n            window->SetWindowPosPivot = g.SetNextWindowPosPivot;\n            window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing);\n        }\n        else\n        {\n            SetWindowPos(window, g.SetNextWindowPosVal, g.SetNextWindowPosCond);\n        }\n        g.SetNextWindowPosCond = 0;\n    }\n    if (g.SetNextWindowSizeCond)\n    {\n        window_size_set_by_api = (window->SetWindowSizeAllowFlags & g.SetNextWindowSizeCond) != 0;\n        SetWindowSize(window, g.SetNextWindowSizeVal, g.SetNextWindowSizeCond);\n        g.SetNextWindowSizeCond = 0;\n    }\n    if (g.SetNextWindowContentSizeCond)\n    {\n        window->SizeContentsExplicit = g.SetNextWindowContentSizeVal;\n        g.SetNextWindowContentSizeCond = 0;\n    }\n    else if (first_begin_of_the_frame)\n    {\n        window->SizeContentsExplicit = ImVec2(0.0f, 0.0f);\n    }\n    if (g.SetNextWindowCollapsedCond)\n    {\n        SetWindowCollapsed(window, g.SetNextWindowCollapsedVal, g.SetNextWindowCollapsedCond);\n        g.SetNextWindowCollapsedCond = 0;\n    }\n    if (g.SetNextWindowFocus)\n    {\n        SetWindowFocus();\n        g.SetNextWindowFocus = false;\n    }\n    if (window->Appearing)\n        SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false);\n\n    // When reusing window again multiple times a frame, just append content (don't need to setup again)\n    if (first_begin_of_the_frame)\n    {\n        // Initialize\n        window->ParentWindow = parent_window;\n        window->RootWindow = !(flags & ImGuiWindowFlags_ChildWindow) ? window : parent_window->RootWindow;\n        window->RootNonPopupWindow = !(flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) || (flags & ImGuiWindowFlags_Modal) ? window : parent_window->RootNonPopupWindow; // Used to display TitleBgActive color and for selecting which window to use for NavWindowing\n        //window->RootNavWindow = window;\n        //while (window->RootNavWindow->Flags & ImGuiWindowFlags_NavFlattened)\n        //    window->RootNavWindow = window->RootNavWindow->ParentWindow;\n\n        window->Active = true;\n        window->OrderWithinParent = 0;\n        window->BeginCount = 0;\n        window->ClipRect = ImVec4(-FLT_MAX,-FLT_MAX,+FLT_MAX,+FLT_MAX);\n        window->LastFrameActive = current_frame;\n        window->IDStack.resize(1);\n\n        // Clear draw list, setup texture, outer clipping rectangle\n        window->DrawList->Clear();\n        window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID);\n        ImRect fullscreen_rect(GetVisibleRect());\n        if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_ComboBox|ImGuiWindowFlags_Popup)))\n            PushClipRect(parent_window->ClipRect.Min, parent_window->ClipRect.Max, true);\n        else\n            PushClipRect(fullscreen_rect.Min, fullscreen_rect.Max, true);\n\n        if (window_just_activated_by_user)\n        {\n            // Popup first latch mouse position, will position itself when it appears next frame\n            window->AutoPosLastDirection = -1;\n            if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api)\n                window->PosFloat = g.IO.MousePos;\n        }\n\n        // Collapse window by double-clicking on title bar\n        // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing\n        if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse))\n        {\n            ImRect title_bar_rect = window->TitleBarRect();\n            if (g.HoveredWindow == window && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseDoubleClicked[0])\n            {\n                window->Collapsed = !window->Collapsed;\n                MarkIniSettingsDirty(window);\n                FocusWindow(window);\n            }\n        }\n        else\n        {\n            window->Collapsed = false;\n        }\n\n        // SIZE\n\n        // Update contents size from last frame for auto-fitting (unless explicitly specified)\n        window->SizeContents.x = (float)(int)((window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.x - window->Pos.x) + window->Scroll.x));\n        window->SizeContents.y = (float)(int)((window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.y - window->Pos.y) + window->Scroll.y));\n\n        // Hide popup/tooltip window when first appearing while we measure size (because we recycle them)\n        if (window->HiddenFrames > 0)\n            window->HiddenFrames--;\n        if ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) != 0 && window_just_activated_by_user)\n        {\n            window->HiddenFrames = 1;\n            if (flags & ImGuiWindowFlags_AlwaysAutoResize)\n            {\n                if (!window_size_set_by_api)\n                    window->Size = window->SizeFull = ImVec2(0.f, 0.f);\n                window->SizeContents = ImVec2(0.f, 0.f);\n            }\n        }\n\n        // Lock window rounding, border size and rounding so that altering the border sizes for children doesn't have side-effects.\n        window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding;\n        window->WindowBorderSize = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildBorderSize : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize;\n        window->WindowPadding = style.WindowPadding;\n        if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_ComboBox | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f)\n            window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f);\n        const float window_rounding = window->WindowRounding;\n        const float window_border_size = window->WindowBorderSize;\n\n        // Calculate auto-fit size, handle automatic resize\n        const ImVec2 size_auto_fit = CalcSizeAutoFit(window);\n        if (window->Collapsed)\n        {\n            // We still process initial auto-fit on collapsed windows to get a window width,\n            // But otherwise we don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed.\n            if (window->AutoFitFramesX > 0)\n                window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x;\n            if (window->AutoFitFramesY > 0)\n                window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y;\n        }\n        else if (!window_size_set_by_api)\n        {\n            if (flags & ImGuiWindowFlags_AlwaysAutoResize)\n            {\n                window->SizeFull = size_auto_fit;\n            }\n            else if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0)\n            {\n                // Auto-fit only grows during the first few frames\n                if (window->AutoFitFramesX > 0)\n                    window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x;\n                if (window->AutoFitFramesY > 0)\n                    window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y;\n                MarkIniSettingsDirty(window);\n            }\n        }\n\n        // Apply minimum/maximum window size constraints and final size\n        window->SizeFull = CalcSizeFullWithConstraint(window, window->SizeFull);\n        window->Size = window->Collapsed ? window->TitleBarRect().GetSize() : window->SizeFull;\n        if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup))\n        {\n            IM_ASSERT(window_size_set_by_api); // Submitted by BeginChild()\n            window->Size = window->SizeFull;\n        }\n\n        // SCROLLBAR STATUS\n\n        // Update scrollbar status (based on the Size that was effective during last frame or the auto-resized Size). We need to do this before manual resize (below) is effective.\n        if (!window->Collapsed)\n        {\n            window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((window->SizeContents.y > window->SizeFull.y + style.ItemSpacing.y) && !(flags & ImGuiWindowFlags_NoScrollbar));\n            window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((window->SizeContents.x > window->SizeFull.x - (window->ScrollbarY ? style.ScrollbarSize : 0.0f) - window->WindowPadding.x) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar));\n            if (window->ScrollbarX && !window->ScrollbarY)\n                window->ScrollbarY = (window->SizeContents.y > window->SizeFull.y + style.ItemSpacing.y - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar);\n            window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f);\n        }\n\n        // POSITION\n\n        // Position child window\n        if (flags & ImGuiWindowFlags_ChildWindow)\n        {\n            window->OrderWithinParent = parent_window->DC.ChildWindows.Size;\n            parent_window->DC.ChildWindows.push_back(window);\n        }\n        if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api)\n            window->Pos = window->PosFloat = parent_window->DC.CursorPos;\n\n        const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFrames == 0);\n        if (window_pos_with_pivot)\n        {\n            // Position given a pivot (e.g. for centering)\n            SetWindowPos(window, ImMax(style.DisplaySafeAreaPadding, window->SetWindowPosVal - window->SizeFull * window->SetWindowPosPivot), 0);\n        }\n        else if (flags & ImGuiWindowFlags_ChildMenu)\n        {\n            // Child menus typically request _any_ position within the parent menu item, and then our FindBestPopupWindowPos() function will move the new menu outside the parent bounds.\n            // This is how we end up with child menus appearing (most-commonly) on the right of the parent menu.\n            IM_ASSERT(window_pos_set_by_api);\n            float horizontal_overlap = style.ItemSpacing.x; // We want some overlap to convey the relative depth of each popup (currently the amount of overlap it is hard-coded to style.ItemSpacing.x, may need to introduce another style value).\n            ImRect rect_to_avoid;\n            if (parent_window->DC.MenuBarAppending)\n                rect_to_avoid = ImRect(-FLT_MAX, parent_window->Pos.y + parent_window->TitleBarHeight(), FLT_MAX, parent_window->Pos.y + parent_window->TitleBarHeight() + parent_window->MenuBarHeight());\n            else\n                rect_to_avoid = ImRect(parent_window->Pos.x + horizontal_overlap, -FLT_MAX, parent_window->Pos.x + parent_window->Size.x - horizontal_overlap - parent_window->ScrollbarSizes.x, FLT_MAX);\n            window->PosFloat = FindBestPopupWindowPos(window->PosFloat, window->Size, &window->AutoPosLastDirection, rect_to_avoid);\n        }\n        else if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api && window_just_appearing_after_hidden_for_resize)\n        {\n            ImRect rect_to_avoid(window->PosFloat.x - 1, window->PosFloat.y - 1, window->PosFloat.x + 1, window->PosFloat.y + 1);\n            window->PosFloat = FindBestPopupWindowPos(window->PosFloat, window->Size, &window->AutoPosLastDirection, rect_to_avoid);\n        }\n\n        // Position tooltip (always follows mouse)\n        if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api)\n        {\n            ImVec2 ref_pos = g.IO.MousePos;\n            ImRect rect_to_avoid(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24, ref_pos.y + 24); // FIXME: Completely hard-coded. Perhaps center on cursor hit-point instead?\n            window->PosFloat = FindBestPopupWindowPos(ref_pos, window->Size, &window->AutoPosLastDirection, rect_to_avoid);\n            if (window->AutoPosLastDirection == -1)\n                window->PosFloat = ref_pos + ImVec2(2,2); // If there's not enough room, for tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible.\n        }\n\n        // Clamp position so it stays visible\n        if (!(flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Tooltip))\n        {\n            if (!window_pos_set_by_api && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && g.IO.DisplaySize.x > 0.0f && g.IO.DisplaySize.y > 0.0f) // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing.\n            {\n                ImVec2 padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding);\n                window->PosFloat = ImMax(window->PosFloat + window->Size, padding) - window->Size;\n                window->PosFloat = ImMin(window->PosFloat, g.IO.DisplaySize - padding);\n            }\n        }\n        window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);\n\n        // Default item width. Make it proportional to window size if window manually resizes\n        if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize))\n            window->ItemWidthDefault = (float)(int)(window->Size.x * 0.65f);\n        else\n            window->ItemWidthDefault = (float)(int)(g.FontSize * 16.0f);\n\n        // Prepare for focus requests\n        window->FocusIdxAllRequestCurrent = (window->FocusIdxAllRequestNext == INT_MAX || window->FocusIdxAllCounter == -1) ? INT_MAX : (window->FocusIdxAllRequestNext + (window->FocusIdxAllCounter+1)) % (window->FocusIdxAllCounter+1);\n        window->FocusIdxTabRequestCurrent = (window->FocusIdxTabRequestNext == INT_MAX || window->FocusIdxTabCounter == -1) ? INT_MAX : (window->FocusIdxTabRequestNext + (window->FocusIdxTabCounter+1)) % (window->FocusIdxTabCounter+1);\n        window->FocusIdxAllCounter = window->FocusIdxTabCounter = -1;\n        window->FocusIdxAllRequestNext = window->FocusIdxTabRequestNext = INT_MAX;\n\n        // Apply scrolling\n        window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window);\n        window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX);\n\n        // Modal window darkens what is behind them\n        if ((flags & ImGuiWindowFlags_Modal) != 0 && window == GetFrontMostModalRootWindow())\n            window->DrawList->AddRectFilled(fullscreen_rect.Min, fullscreen_rect.Max, GetColorU32(ImGuiCol_ModalWindowDarkening, g.ModalWindowDarkeningRatio));\n\n        // Draw window + handle manual resize\n        ImRect title_bar_rect = window->TitleBarRect();\n        if (window->Collapsed)\n        {\n            // Title bar only\n            float backup_border_size = style.FrameBorderSize;\n            g.Style.FrameBorderSize = window->WindowBorderSize;\n            RenderFrame(title_bar_rect.Min, title_bar_rect.Max, GetColorU32(ImGuiCol_TitleBgCollapsed), true, window_rounding);\n            g.Style.FrameBorderSize = backup_border_size;\n        }\n        else\n        {\n            ImU32 resize_col = 0;\n            const float resize_corner_size = ImMax(g.FontSize * 1.35f, window_rounding + 1.0f + g.FontSize * 0.2f);\n            if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && !(flags & ImGuiWindowFlags_NoResize))\n            {\n                // Manual resize\n                // Using the FlattenChilds button flag, we make the resize button accessible even if we are hovering over a child window\n                const ImVec2 br = window->Rect().GetBR();\n                const ImRect resize_rect(br - ImFloor(ImVec2(resize_corner_size * 0.75f, resize_corner_size * 0.75f)), br);\n                const ImGuiID resize_id = window->GetID(\"#RESIZE\");\n                bool hovered, held;\n                ButtonBehavior(resize_rect, resize_id, &hovered, &held, ImGuiButtonFlags_FlattenChilds);\n                resize_col = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);\n                if (hovered || held)\n                    g.MouseCursor = ImGuiMouseCursor_ResizeNWSE;\n\n                ImVec2 size_target(FLT_MAX,FLT_MAX);\n                if (g.HoveredWindow == window && held && g.IO.MouseDoubleClicked[0])\n                {\n                    // Manual auto-fit when double-clicking\n                    size_target = size_auto_fit;\n                    ClearActiveID();\n                }\n                else if (held)\n                {\n                    // We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position\n                    size_target = (g.IO.MousePos - g.ActiveIdClickOffset - window->Pos) + resize_rect.GetSize();\n                }\n\n                if (size_target.x != FLT_MAX && size_target.y != FLT_MAX)\n                {\n                    window->SizeFull = CalcSizeFullWithConstraint(window, size_target);\n                    MarkIniSettingsDirty(window);\n                }\n                window->Size = window->SizeFull;\n                title_bar_rect = window->TitleBarRect();\n            }\n\n            // Window background, Default Alpha\n            ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags));\n            window->DrawList->AddRectFilled(window->Pos+ImVec2(0,window->TitleBarHeight()), window->Pos+window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot);\n\n            // Title bar\n            const bool window_is_focused = g.NavWindow && window->RootNonPopupWindow == g.NavWindow->RootNonPopupWindow;\n            if (!(flags & ImGuiWindowFlags_NoTitleBar))\n                window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, GetColorU32(window_is_focused ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg), window_rounding, ImDrawCornerFlags_Top);\n\n            // Menu bar\n            if (flags & ImGuiWindowFlags_MenuBar)\n            {\n                ImRect menu_bar_rect = window->MenuBarRect();\n                menu_bar_rect.ClipWith(window->Rect());  // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them.\n                window->DrawList->AddRectFilled(menu_bar_rect.Min, menu_bar_rect.Max, GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawCornerFlags_Top);\n                if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y)\n                    window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);\n            }\n\n            // Scrollbars\n            if (window->ScrollbarX)\n                Scrollbar(ImGuiLayoutType_Horizontal);\n            if (window->ScrollbarY)\n                Scrollbar(ImGuiLayoutType_Vertical);\n\n            // Render resize grip\n            // (after the input handling so we don't have a frame of latency)\n            if (!(flags & ImGuiWindowFlags_NoResize))\n            {\n                const ImVec2 br = window->Rect().GetBR();\n                window->DrawList->PathLineTo(br + ImVec2(-resize_corner_size, -window_border_size));\n                window->DrawList->PathLineTo(br + ImVec2(-window_border_size, -resize_corner_size));\n                window->DrawList->PathArcToFast(ImVec2(br.x - window_rounding - window_border_size, br.y - window_rounding - window_border_size), window_rounding, 0, 3);\n                window->DrawList->PathFillConvex(resize_col);\n            }\n\n            // Borders\n            if (window_border_size > 0.0f)\n                window->DrawList->AddRect(window->Pos, window->Pos+window->Size, GetColorU32(ImGuiCol_Border), window_rounding, ImDrawCornerFlags_All, window_border_size);\n            if (style.FrameBorderSize > 0 && !(flags & ImGuiWindowFlags_NoTitleBar))\n                window->DrawList->AddLine(title_bar_rect.GetBL()+ImVec2(1,-1), title_bar_rect.GetBR()+ImVec2(-1,-1), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);\n        }\n\n        // Update ContentsRegionMax. All the variable it depends on are set above in this function.\n        window->ContentsRegionRect.Min.x = -window->Scroll.x + window->WindowPadding.x;\n        window->ContentsRegionRect.Min.y = -window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight();\n        window->ContentsRegionRect.Max.x = -window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x)); \n        window->ContentsRegionRect.Max.y = -window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y)); \n\n        // Setup drawing context\n        // (NB: That term \"drawing context / DC\" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.)\n        window->DC.IndentX = 0.0f + window->WindowPadding.x - window->Scroll.x;\n        window->DC.GroupOffsetX = 0.0f;\n        window->DC.ColumnsOffsetX = 0.0f;\n        window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.IndentX + window->DC.ColumnsOffsetX, window->TitleBarHeight() + window->MenuBarHeight() + window->WindowPadding.y - window->Scroll.y);\n        window->DC.CursorPos = window->DC.CursorStartPos;\n        window->DC.CursorPosPrevLine = window->DC.CursorPos;\n        window->DC.CursorMaxPos = window->DC.CursorStartPos;\n        window->DC.CurrentLineHeight = window->DC.PrevLineHeight = 0.0f;\n        window->DC.CurrentLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f;\n        window->DC.MenuBarAppending = false;\n        window->DC.MenuBarOffsetX = ImMax(window->WindowPadding.x, style.ItemSpacing.x);\n        window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f;\n        window->DC.ChildWindows.resize(0);\n        window->DC.LayoutType = ImGuiLayoutType_Vertical;\n        window->DC.ItemFlags = ImGuiItemFlags_Default_;\n        window->DC.ItemWidth = window->ItemWidthDefault;\n        window->DC.TextWrapPos = -1.0f; // disabled\n        window->DC.ItemFlagsStack.resize(0);\n        window->DC.ItemWidthStack.resize(0);\n        window->DC.TextWrapPosStack.resize(0);\n        window->DC.ColumnsCurrent = 0;\n        window->DC.ColumnsCount = 1;\n        window->DC.ColumnsStartPosY = window->DC.CursorPos.y;\n        window->DC.ColumnsStartMaxPosX = window->DC.CursorMaxPos.x;\n        window->DC.ColumnsCellMinY = window->DC.ColumnsCellMaxY = window->DC.ColumnsStartPosY;\n        window->DC.TreeDepth = 0;\n        window->DC.StateStorage = &window->StateStorage;\n        window->DC.GroupStack.resize(0);\n        window->MenuColumns.Update(3, style.ItemSpacing.x, window_just_activated_by_user);\n\n        if ((flags & ImGuiWindowFlags_ChildWindow) && (window->DC.ItemFlags != parent_window->DC.ItemFlags))\n        {\n            window->DC.ItemFlags = parent_window->DC.ItemFlags;\n            window->DC.ItemFlagsStack.push_back(window->DC.ItemFlags);\n        }\n\n        if (window->AutoFitFramesX > 0)\n            window->AutoFitFramesX--;\n        if (window->AutoFitFramesY > 0)\n            window->AutoFitFramesY--;\n\n        // New windows appears in front (we need to do that AFTER setting DC.CursorStartPos so our initial navigation reference rectangle can start around there)\n        if (window_just_activated_by_user && !(flags & ImGuiWindowFlags_NoFocusOnAppearing))\n            if (!(flags & (ImGuiWindowFlags_ChildWindow|ImGuiWindowFlags_Tooltip)) || (flags & ImGuiWindowFlags_Popup))\n                FocusWindow(window);\n\n        // Title bar\n        if (!(flags & ImGuiWindowFlags_NoTitleBar))\n        {\n            // Collapse button\n            if (!(flags & ImGuiWindowFlags_NoCollapse))\n            {\n                RenderTriangle(window->Pos + style.FramePadding, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f);\n            }\n\n            // Close button\n            if (p_open != NULL)\n            {\n                const float PAD = 2.0f;\n                const float rad = (window->TitleBarHeight() - PAD*2.0f) * 0.5f;\n                if (CloseButton(window->GetID(\"#CLOSE\"), window->Rect().GetTR() + ImVec2(-PAD - rad, PAD + rad), rad))\n                    *p_open = false;\n            }\n\n            // Title text (FIXME: refactor text alignment facilities along with RenderText helpers)\n            const ImVec2 text_size = CalcTextSize(name, NULL, true);\n            ImVec2 text_min = window->Pos;\n            ImVec2 text_max = window->Pos + ImVec2(window->Size.x, style.FramePadding.y*2 + text_size.y);\n            ImRect clip_rect;\n            clip_rect.Max = ImVec2(window->Pos.x + window->Size.x - (p_open ? title_bar_rect.GetHeight() - 3 : style.FramePadding.x), text_max.y); // Match the size of CloseWindowButton()\n            float pad_left = (flags & ImGuiWindowFlags_NoCollapse) == 0 ? (style.FramePadding.x + g.FontSize + style.ItemInnerSpacing.x) : style.FramePadding.x;\n            float pad_right = (p_open != NULL) ? (style.FramePadding.x + g.FontSize + style.ItemInnerSpacing.x) : style.FramePadding.x;\n            if (style.WindowTitleAlign.x > 0.0f) pad_right = ImLerp(pad_right, pad_left, style.WindowTitleAlign.x);\n            text_min.x += pad_left;\n            text_max.x -= pad_right;\n            clip_rect.Min = ImVec2(text_min.x, window->Pos.y);\n            RenderTextClipped(text_min, text_max, name, NULL, &text_size, style.WindowTitleAlign, &clip_rect);\n        }\n\n        // Save clipped aabb so we can access it in constant-time in FindHoveredWindow()\n        window->WindowRectClipped = window->Rect();\n        window->WindowRectClipped.ClipWith(window->ClipRect);\n\n        // Pressing CTRL+C while holding on a window copy its content to the clipboard\n        // This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope.\n        // Maybe we can support CTRL+C on every element?\n        /*\n        if (g.ActiveId == move_id)\n            if (g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_C))\n                ImGui::LogToClipboard();\n        */\n\n        // Inner rectangle\n        // We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame\n        // Note that if our window is collapsed we will end up with a null clipping rectangle which is the correct behavior.\n        window->InnerRect.Min.x = title_bar_rect.Min.x;\n        window->InnerRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight();\n        window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x;\n        window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y;\n        //window->DrawList->AddRect(window->InnerRect.Min, window->InnerRect.Max, IM_COL32_WHITE);\n\n        // After Begin() we fill the last item / hovered data using the title bar data. Make that a standard behavior (to allow usage of context menus on title bar only, etc.).\n        window->DC.LastItemId = window->MoveId;\n        window->DC.LastItemRect = title_bar_rect;\n        window->DC.LastItemRectHoveredRect = IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false);\n    }\n\n    // Inner clipping rectangle\n    // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result.\n    const float border_size = window->WindowBorderSize;\n    ImRect clip_rect;\n    clip_rect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(border_size, ImFloor(window->WindowPadding.x*0.5f)));\n    clip_rect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + border_size);\n    clip_rect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(border_size, ImFloor(window->WindowPadding.x*0.5f)));\n    clip_rect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - border_size);\n    PushClipRect(clip_rect.Min, clip_rect.Max, true);\n\n    // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default \"Debug\" window is unused)\n    if (first_begin_of_the_frame)\n        window->WriteAccessed = false;\n\n    window->BeginCount++;\n    g.SetNextWindowSizeConstraint = false;\n\n    // Child window can be out of sight and have \"negative\" clip windows.\n    // Mark them as collapsed so commands are skipped earlier (we can't manually collapse because they have no title bar).\n    if (flags & ImGuiWindowFlags_ChildWindow)\n    {\n        IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0);\n        window->Collapsed = parent_window && parent_window->Collapsed;\n\n        if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0)\n            window->Collapsed |= (window->WindowRectClipped.Min.x >= window->WindowRectClipped.Max.x || window->WindowRectClipped.Min.y >= window->WindowRectClipped.Max.y);\n\n        // We also hide the window from rendering because we've already added its border to the command list.\n        // (we could perform the check earlier in the function but it is simpler at this point)\n        if (window->Collapsed)\n            window->Active = false;\n    }\n    if (style.Alpha <= 0.0f)\n        window->Active = false;\n\n    // Return false if we don't intend to display anything to allow user to perform an early out optimization\n    window->SkipItems = (window->Collapsed || !window->Active) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0;\n    return !window->SkipItems;\n}\n\n// Old Begin() API with 5 parameters, avoid calling this version directly! Use SetNextWindowSize()+Begin() instead.\n#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS\nbool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_use, float bg_alpha_override, ImGuiWindowFlags flags)\n{\n    // Old API feature: we could pass the initial window size as a parameter, however this was very misleading because in most cases it would only affect the window when it didn't have storage in the .ini file.\n    if (size_on_first_use.x != 0.0f || size_on_first_use.y != 0.0f)\n        SetNextWindowSize(size_on_first_use, ImGuiCond_FirstUseEver);\n\n    // Old API feature: we could override the window background alpha with a parameter. This is actually tricky to reproduce manually because: \n    // (1) there are multiple variants of WindowBg (popup, tooltip, etc.) and (2) you can't call PushStyleColor before Begin and PopStyleColor just after Begin() because of how CheckStackSizes() behave.\n    // The user-side solution is to do backup = GetStyleColorVec4(ImGuiCol_xxxBG), PushStyleColor(ImGuiCol_xxxBg), Begin, PushStyleColor(ImGuiCol_xxxBg, backup), [...], PopStyleColor(), End(); PopStyleColor() - which is super awkward.\n    // The alpha override was rarely used but for now we'll leave the Begin() variant around for a bit. We may either lift the constraint on CheckStackSizes() either add a SetNextWindowBgAlpha() helper that does it magically.\n    ImGuiContext& g = *GImGui;\n    const ImGuiCol bg_color_idx = GetWindowBgColorIdxFromFlags(flags);\n    const ImVec4 bg_color_backup = g.Style.Colors[bg_color_idx];\n    if (bg_alpha_override >= 0.0f)\n        g.Style.Colors[bg_color_idx].w = bg_alpha_override;\n\n    bool ret = Begin(name, p_open, flags);\n\n    if (bg_alpha_override >= 0.0f)\n        g.Style.Colors[bg_color_idx] = bg_color_backup;\n    return ret;\n}\n#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS\n\nvoid ImGui::End()\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    if (window->DC.ColumnsCount != 1) // close columns set if any is open\n        EndColumns();\n    PopClipRect();   // inner window clip rectangle\n\n    // Stop logging\n    if (!(window->Flags & ImGuiWindowFlags_ChildWindow))    // FIXME: add more options for scope of logging\n        LogFinish();\n\n    // Pop\n    // NB: we don't clear 'window->RootWindow'. The pointer is allowed to live until the next call to Begin().\n    g.CurrentWindowStack.pop_back();\n    if (window->Flags & ImGuiWindowFlags_Popup)\n        g.CurrentPopupStack.pop_back();\n    CheckStacksSize(window, false);\n    SetCurrentWindow(g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back());\n}\n\n// Vertical scrollbar\n// The entire piece of code below is rather confusing because:\n// - We handle absolute seeking (when first clicking outside the grab) and relative manipulation (afterward or when clicking inside the grab)\n// - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar\n// - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal.\nvoid ImGui::Scrollbar(ImGuiLayoutType direction)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    const bool horizontal = (direction == ImGuiLayoutType_Horizontal);\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(horizontal ? \"#SCROLLX\" : \"#SCROLLY\");\n\n    // Render background\n    bool other_scrollbar = (horizontal ? window->ScrollbarY : window->ScrollbarX);\n    float other_scrollbar_size_w = other_scrollbar ? style.ScrollbarSize : 0.0f;\n    const ImRect window_rect = window->Rect();\n    const float border_size = window->WindowBorderSize;\n    ImRect bb = horizontal\n        ? ImRect(window->Pos.x + border_size, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w - border_size, window_rect.Max.y - border_size)\n        : ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_size, window_rect.Max.x - border_size, window_rect.Max.y - other_scrollbar_size_w - border_size);\n    if (!horizontal)\n        bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() : 0.0f);\n    if (bb.GetWidth() <= 0.0f || bb.GetHeight() <= 0.0f)\n        return;\n\n    int window_rounding_corners;\n    if (horizontal)\n        window_rounding_corners = ImDrawCornerFlags_BotLeft | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight);\n    else\n        window_rounding_corners = (((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) ? ImDrawCornerFlags_TopRight : 0) | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight);\n    window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_ScrollbarBg), window->WindowRounding, window_rounding_corners);\n    bb.Expand(ImVec2(-ImClamp((float)(int)((bb.Max.x - bb.Min.x - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp((float)(int)((bb.Max.y - bb.Min.y - 2.0f) * 0.5f), 0.0f, 3.0f)));\n\n    // V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar)\n    float scrollbar_size_v = horizontal ? bb.GetWidth() : bb.GetHeight();\n    float scroll_v = horizontal ? window->Scroll.x : window->Scroll.y;\n    float win_size_avail_v = (horizontal ? window->SizeFull.x : window->SizeFull.y) - other_scrollbar_size_w;\n    float win_size_contents_v = horizontal ? window->SizeContents.x : window->SizeContents.y;\n\n    // Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount)\n    // But we maintain a minimum size in pixel to allow for the user to still aim inside.\n    IM_ASSERT(ImMax(win_size_contents_v, win_size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers.\n    const float win_size_v = ImMax(ImMax(win_size_contents_v, win_size_avail_v), 1.0f);\n    const float grab_h_pixels = ImClamp(scrollbar_size_v * (win_size_avail_v / win_size_v), style.GrabMinSize, scrollbar_size_v);\n    const float grab_h_norm = grab_h_pixels / scrollbar_size_v;\n\n    // Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar().\n    bool held = false;\n    bool hovered = false;\n    const bool previously_held = (g.ActiveId == id);\n    ButtonBehavior(bb, id, &hovered, &held);\n\n    float scroll_max = ImMax(1.0f, win_size_contents_v - win_size_avail_v);\n    float scroll_ratio = ImSaturate(scroll_v / scroll_max);\n    float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v;\n    if (held && grab_h_norm < 1.0f)\n    {\n        float scrollbar_pos_v = horizontal ? bb.Min.x : bb.Min.y;\n        float mouse_pos_v = horizontal ? g.IO.MousePos.x : g.IO.MousePos.y;\n        float* click_delta_to_grab_center_v = horizontal ? &g.ScrollbarClickDeltaToGrabCenter.x : &g.ScrollbarClickDeltaToGrabCenter.y;\n\n        // Click position in scrollbar normalized space (0.0f->1.0f)\n        const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v);\n        SetHoveredID(id);\n\n        bool seek_absolute = false;\n        if (!previously_held)\n        {\n            // On initial click calculate the distance between mouse and the center of the grab\n            if (clicked_v_norm >= grab_v_norm && clicked_v_norm <= grab_v_norm + grab_h_norm)\n            {\n                *click_delta_to_grab_center_v = clicked_v_norm - grab_v_norm - grab_h_norm*0.5f;\n            }\n            else\n            {\n                seek_absolute = true;\n                *click_delta_to_grab_center_v = 0.0f;\n            }\n        }\n\n        // Apply scroll\n        // It is ok to modify Scroll here because we are being called in Begin() after the calculation of SizeContents and before setting up our starting position\n        const float scroll_v_norm = ImSaturate((clicked_v_norm - *click_delta_to_grab_center_v - grab_h_norm*0.5f) / (1.0f - grab_h_norm));\n        scroll_v = (float)(int)(0.5f + scroll_v_norm * scroll_max);//(win_size_contents_v - win_size_v));\n        if (horizontal)\n            window->Scroll.x = scroll_v;\n        else\n            window->Scroll.y = scroll_v;\n\n        // Update values for rendering\n        scroll_ratio = ImSaturate(scroll_v / scroll_max);\n        grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v;\n\n        // Update distance to grab now that we have seeked and saturated\n        if (seek_absolute)\n            *click_delta_to_grab_center_v = clicked_v_norm - grab_v_norm - grab_h_norm*0.5f;\n    }\n\n    // Render\n    const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab);\n    ImRect grab_rect;\n    if (horizontal)\n        grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImMin(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, window_rect.Max.x), bb.Max.y);\n    else\n        grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImMin(ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels, window_rect.Max.y));\n    window->DrawList->AddRectFilled(grab_rect.Min, grab_rect.Max, grab_col, style.ScrollbarRounding);\n}\n\nvoid ImGui::BringWindowToFront(ImGuiWindow* window)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.Windows.back() == window)\n        return;\n    for (int i = 0; i < g.Windows.Size; i++)\n        if (g.Windows[i] == window)\n        {\n            g.Windows.erase(g.Windows.begin() + i);\n            g.Windows.push_back(window);\n            break;\n        }\n}\n\nvoid ImGui::BringWindowToBack(ImGuiWindow* window)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.Windows[0] == window)\n        return;\n    for (int i = 0; i < g.Windows.Size; i++)\n        if (g.Windows[i] == window)\n        {\n            memmove(&g.Windows[1], &g.Windows[0], (size_t)i * sizeof(ImGuiWindow*));\n            g.Windows[0] = window;\n            break;\n        }\n}\n\n// Moving window to front of display and set focus (which happens to be back of our sorted list)\nvoid ImGui::FocusWindow(ImGuiWindow* window)\n{\n    ImGuiContext& g = *GImGui;\n\n    // Always mark the window we passed as focused. This is used for keyboard interactions such as tabbing.\n    g.NavWindow = window;\n\n    // Passing NULL allow to disable keyboard focus\n    if (!window)\n        return;\n\n    // Move the root window to the top of the pile\n    if (window->RootWindow)\n        window = window->RootWindow;\n\n    // Steal focus on active widgets\n    if (window->Flags & ImGuiWindowFlags_Popup) // FIXME: This statement should be unnecessary. Need further testing before removing it..\n        if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != window)\n            ClearActiveID();\n\n    // Bring to front\n    if (!(window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus))\n        BringWindowToFront(window);\n}\n\nvoid ImGui::FocusPreviousWindow()\n{\n    ImGuiContext& g = *GImGui;\n    for (int i = g.Windows.Size - 1; i >= 0; i--)\n        if (g.Windows[i]->WasActive && !(g.Windows[i]->Flags & ImGuiWindowFlags_ChildWindow))\n        {\n            FocusWindow(g.Windows[i]);\n            return;\n        }\n}\n\nvoid ImGui::PushItemWidth(float item_width)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width);\n    window->DC.ItemWidthStack.push_back(window->DC.ItemWidth);\n}\n\nvoid ImGui::PushMultiItemsWidths(int components, float w_full)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    const ImGuiStyle& style = GImGui->Style;\n    if (w_full <= 0.0f)\n        w_full = CalcItemWidth();\n    const float w_item_one  = ImMax(1.0f, (float)(int)((w_full - (style.ItemInnerSpacing.x) * (components-1)) / (float)components));\n    const float w_item_last = ImMax(1.0f, (float)(int)(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components-1)));\n    window->DC.ItemWidthStack.push_back(w_item_last);\n    for (int i = 0; i < components-1; i++)\n        window->DC.ItemWidthStack.push_back(w_item_one);\n    window->DC.ItemWidth = window->DC.ItemWidthStack.back();\n}\n\nvoid ImGui::PopItemWidth()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.ItemWidthStack.pop_back();\n    window->DC.ItemWidth = window->DC.ItemWidthStack.empty() ? window->ItemWidthDefault : window->DC.ItemWidthStack.back();\n}\n\nfloat ImGui::CalcItemWidth()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    float w = window->DC.ItemWidth;\n    if (w < 0.0f)\n    {\n        // Align to a right-side limit. We include 1 frame padding in the calculation because this is how the width is always used (we add 2 frame padding to it), but we could move that responsibility to the widget as well.\n        float width_to_right_edge = GetContentRegionAvail().x;\n        w = ImMax(1.0f, width_to_right_edge + w);\n    }\n    w = (float)(int)w;\n    return w;\n}\n\nstatic ImFont* GetDefaultFont()\n{\n    ImGuiContext& g = *GImGui;\n    return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0];\n}\n\nstatic void SetCurrentFont(ImFont* font)\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(font && font->IsLoaded());    // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?\n    IM_ASSERT(font->Scale > 0.0f);\n    g.Font = font;\n    g.FontBaseSize = g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale;\n    g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;\n    g.FontTexUvWhitePixel = g.Font->ContainerAtlas->TexUvWhitePixel;\n}\n\nvoid ImGui::PushFont(ImFont* font)\n{\n    ImGuiContext& g = *GImGui;\n    if (!font)\n        font = GetDefaultFont();\n    SetCurrentFont(font);\n    g.FontStack.push_back(font);\n    g.CurrentWindow->DrawList->PushTextureID(font->ContainerAtlas->TexID);\n}\n\nvoid  ImGui::PopFont()\n{\n    ImGuiContext& g = *GImGui;\n    g.CurrentWindow->DrawList->PopTextureID();\n    g.FontStack.pop_back();\n    SetCurrentFont(g.FontStack.empty() ? GetDefaultFont() : g.FontStack.back());\n}\n\nvoid ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (enabled)\n        window->DC.ItemFlags |= option;\n    else\n        window->DC.ItemFlags &= ~option;\n    window->DC.ItemFlagsStack.push_back(window->DC.ItemFlags);\n}\n\nvoid ImGui::PopItemFlag()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.ItemFlagsStack.pop_back();\n    window->DC.ItemFlags = window->DC.ItemFlagsStack.empty() ? ImGuiItemFlags_Default_ : window->DC.ItemFlagsStack.back();\n}\n\nvoid ImGui::PushAllowKeyboardFocus(bool allow_keyboard_focus)\n{\n    PushItemFlag(ImGuiItemFlags_AllowKeyboardFocus, allow_keyboard_focus);\n}\n\nvoid ImGui::PopAllowKeyboardFocus()\n{\n    PopItemFlag();\n}\n\nvoid ImGui::PushButtonRepeat(bool repeat)\n{\n    PushItemFlag(ImGuiItemFlags_ButtonRepeat, repeat);\n}\n\nvoid ImGui::PopButtonRepeat()\n{\n    PopItemFlag();\n}\n\nvoid ImGui::PushTextWrapPos(float wrap_pos_x)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.TextWrapPos = wrap_pos_x;\n    window->DC.TextWrapPosStack.push_back(wrap_pos_x);\n}\n\nvoid ImGui::PopTextWrapPos()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.TextWrapPosStack.pop_back();\n    window->DC.TextWrapPos = window->DC.TextWrapPosStack.empty() ? -1.0f : window->DC.TextWrapPosStack.back();\n}\n\n// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32\nvoid ImGui::PushStyleColor(ImGuiCol idx, ImU32 col)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiColMod backup;\n    backup.Col = idx;\n    backup.BackupValue = g.Style.Colors[idx];\n    g.ColorModifiers.push_back(backup);\n    g.Style.Colors[idx] = ColorConvertU32ToFloat4(col);\n}\n\nvoid ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiColMod backup;\n    backup.Col = idx;\n    backup.BackupValue = g.Style.Colors[idx];\n    g.ColorModifiers.push_back(backup);\n    g.Style.Colors[idx] = col;\n}\n\nvoid ImGui::PopStyleColor(int count)\n{\n    ImGuiContext& g = *GImGui;\n    while (count > 0)\n    {\n        ImGuiColMod& backup = g.ColorModifiers.back();\n        g.Style.Colors[backup.Col] = backup.BackupValue;\n        g.ColorModifiers.pop_back();\n        count--;\n    }\n}\n\nstruct ImGuiStyleVarInfo\n{\n    ImGuiDataType   Type;\n    ImU32           Offset;\n    void*           GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); }\n};\n\nstatic const ImGuiStyleVarInfo GStyleVarInfo[ImGuiStyleVar_Count_] =\n{\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) },                // ImGuiStyleVar_Alpha\n    { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) },        // ImGuiStyleVar_WindowPadding\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) },       // ImGuiStyleVar_WindowRounding\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) },     // ImGuiStyleVar_WindowBorderSize\n    { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) },        // ImGuiStyleVar_WindowMinSize\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) },        // ImGuiStyleVar_ChildRounding\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) },      // ImGuiStyleVar_ChildBorderSize\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) },        // ImGuiStyleVar_PopupRounding\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) },      // ImGuiStyleVar_PopupBorderSize\n    { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) },         // ImGuiStyleVar_FramePadding\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) },        // ImGuiStyleVar_FrameRounding\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) },      // ImGuiStyleVar_FrameBorderSize\n    { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) },          // ImGuiStyleVar_ItemSpacing\n    { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) },     // ImGuiStyleVar_ItemInnerSpacing\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) },        // ImGuiStyleVar_IndentSpacing\n    { ImGuiDataType_Float,  (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) },          // ImGuiStyleVar_GrabMinSize\n    { ImGuiDataType_Float2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) },      // ImGuiStyleVar_ButtonTextAlign\n};\n\nstatic const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx)\n{\n    IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_Count_);\n    return &GStyleVarInfo[idx];\n}\n\nvoid ImGui::PushStyleVar(ImGuiStyleVar idx, float val)\n{\n    const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);\n    if (var_info->Type == ImGuiDataType_Float)\n    {\n        ImGuiContext& g = *GImGui;\n        float* pvar = (float*)var_info->GetVarPtr(&g.Style);\n        g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar));\n        *pvar = val;\n        return;\n    }\n    IM_ASSERT(0); // Called function with wrong-type? Variable is not a float.\n}\n\nvoid ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val)\n{\n    const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx);\n    if (var_info->Type == ImGuiDataType_Float2)\n    {\n        ImGuiContext& g = *GImGui;\n        ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style);\n        g.StyleModifiers.push_back(ImGuiStyleMod(idx, *pvar));\n        *pvar = val;\n        return;\n    }\n    IM_ASSERT(0); // Called function with wrong-type? Variable is not a ImVec2.\n}\n\nvoid ImGui::PopStyleVar(int count)\n{\n    ImGuiContext& g = *GImGui;\n    while (count > 0)\n    {\n        ImGuiStyleMod& backup = g.StyleModifiers.back();\n        const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx);\n        if (info->Type == ImGuiDataType_Float)          (*(float*)info->GetVarPtr(&g.Style)) = backup.BackupFloat[0];\n        else if (info->Type == ImGuiDataType_Float2)    (*(ImVec2*)info->GetVarPtr(&g.Style)) = ImVec2(backup.BackupFloat[0], backup.BackupFloat[1]);\n        else if (info->Type == ImGuiDataType_Int)       (*(int*)info->GetVarPtr(&g.Style)) = backup.BackupInt[0];\n        g.StyleModifiers.pop_back();\n        count--;\n    }\n}\n\nconst char* ImGui::GetStyleColorName(ImGuiCol idx)\n{\n    // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\\1: return \"\\1\";\n    switch (idx)\n    {\n    case ImGuiCol_Text: return \"Text\";\n    case ImGuiCol_TextDisabled: return \"TextDisabled\";\n    case ImGuiCol_WindowBg: return \"WindowBg\";\n    case ImGuiCol_ChildBg: return \"ChildBg\";\n    case ImGuiCol_PopupBg: return \"PopupBg\";\n    case ImGuiCol_Border: return \"Border\";\n    case ImGuiCol_BorderShadow: return \"BorderShadow\";\n    case ImGuiCol_FrameBg: return \"FrameBg\";\n    case ImGuiCol_FrameBgHovered: return \"FrameBgHovered\";\n    case ImGuiCol_FrameBgActive: return \"FrameBgActive\";\n    case ImGuiCol_TitleBg: return \"TitleBg\";\n    case ImGuiCol_TitleBgActive: return \"TitleBgActive\";\n    case ImGuiCol_TitleBgCollapsed: return \"TitleBgCollapsed\";\n    case ImGuiCol_MenuBarBg: return \"MenuBarBg\";\n    case ImGuiCol_ScrollbarBg: return \"ScrollbarBg\";\n    case ImGuiCol_ScrollbarGrab: return \"ScrollbarGrab\";\n    case ImGuiCol_ScrollbarGrabHovered: return \"ScrollbarGrabHovered\";\n    case ImGuiCol_ScrollbarGrabActive: return \"ScrollbarGrabActive\";\n    case ImGuiCol_CheckMark: return \"CheckMark\";\n    case ImGuiCol_SliderGrab: return \"SliderGrab\";\n    case ImGuiCol_SliderGrabActive: return \"SliderGrabActive\";\n    case ImGuiCol_Button: return \"Button\";\n    case ImGuiCol_ButtonHovered: return \"ButtonHovered\";\n    case ImGuiCol_ButtonActive: return \"ButtonActive\";\n    case ImGuiCol_Header: return \"Header\";\n    case ImGuiCol_HeaderHovered: return \"HeaderHovered\";\n    case ImGuiCol_HeaderActive: return \"HeaderActive\";\n    case ImGuiCol_Separator: return \"Separator\";\n    case ImGuiCol_SeparatorHovered: return \"SeparatorHovered\";\n    case ImGuiCol_SeparatorActive: return \"SeparatorActive\";\n    case ImGuiCol_ResizeGrip: return \"ResizeGrip\";\n    case ImGuiCol_ResizeGripHovered: return \"ResizeGripHovered\";\n    case ImGuiCol_ResizeGripActive: return \"ResizeGripActive\";\n    case ImGuiCol_CloseButton: return \"CloseButton\";\n    case ImGuiCol_CloseButtonHovered: return \"CloseButtonHovered\";\n    case ImGuiCol_CloseButtonActive: return \"CloseButtonActive\";\n    case ImGuiCol_PlotLines: return \"PlotLines\";\n    case ImGuiCol_PlotLinesHovered: return \"PlotLinesHovered\";\n    case ImGuiCol_PlotHistogram: return \"PlotHistogram\";\n    case ImGuiCol_PlotHistogramHovered: return \"PlotHistogramHovered\";\n    case ImGuiCol_TextSelectedBg: return \"TextSelectedBg\";\n    case ImGuiCol_ModalWindowDarkening: return \"ModalWindowDarkening\";\n    }\n    IM_ASSERT(0);\n    return \"Unknown\";\n}\n\nbool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)\n{\n    IM_ASSERT((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0);   // Flags not supported by this function\n    ImGuiContext& g = *GImGui;\n    if (flags & ImGuiHoveredFlags_FlattenChilds)\n    {\n        if (g.HoveredRootWindow != g.CurrentWindow->RootWindow)\n            return false;\n    }\n    else\n    {\n        if (g.HoveredWindow != g.CurrentWindow)\n            return false;\n    }\n    if (!IsWindowContentHoverable(g.HoveredRootWindow, flags))\n        return false;\n    if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))\n        if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != g.HoveredWindow->MoveId)\n            return false;\n    return true;\n}\n\nbool ImGui::IsWindowFocused()\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(g.CurrentWindow);     // Not inside a Begin()/End()\n    return g.NavWindow == g.CurrentWindow;\n}\n\nbool ImGui::IsRootWindowFocused()\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(g.CurrentWindow);     // Not inside a Begin()/End()\n    return g.NavWindow == g.CurrentWindow->RootWindow;\n}\n\nbool ImGui::IsRootWindowOrAnyChildFocused()\n{\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(g.CurrentWindow);     // Not inside a Begin()/End()\n    return g.NavWindow && g.NavWindow->RootWindow == g.CurrentWindow->RootWindow;\n}\n\nfloat ImGui::GetWindowWidth()\n{\n    ImGuiWindow* window = GImGui->CurrentWindow;\n    return window->Size.x;\n}\n\nfloat ImGui::GetWindowHeight()\n{\n    ImGuiWindow* window = GImGui->CurrentWindow;\n    return window->Size.y;\n}\n\nImVec2 ImGui::GetWindowPos()\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    return window->Pos;\n}\n\nstatic void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y)\n{\n    window->DC.CursorMaxPos.y += window->Scroll.y; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it.\n    window->Scroll.y = new_scroll_y;\n    window->DC.CursorMaxPos.y -= window->Scroll.y;\n}\n\nstatic void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond)\n{\n    // Test condition (NB: bit 0 is always true) and clear flags for next time\n    if (cond && (window->SetWindowPosAllowFlags & cond) == 0)\n        return;\n    window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing);\n    window->SetWindowPosVal = ImVec2(FLT_MAX, FLT_MAX);\n\n    // Set\n    const ImVec2 old_pos = window->Pos;\n    window->PosFloat = pos;\n    window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);\n    window->DC.CursorPos += (window->Pos - old_pos);    // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor\n    window->DC.CursorMaxPos += (window->Pos - old_pos); // And more importantly we need to adjust this so size calculation doesn't get affected.\n}\n\nvoid ImGui::SetWindowPos(const ImVec2& pos, ImGuiCond cond)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    SetWindowPos(window, pos, cond);\n}\n\nvoid ImGui::SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond)\n{\n    if (ImGuiWindow* window = FindWindowByName(name))\n        SetWindowPos(window, pos, cond);\n}\n\nImVec2 ImGui::GetWindowSize()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->Size;\n}\n\nstatic void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond)\n{\n    // Test condition (NB: bit 0 is always true) and clear flags for next time\n    if (cond && (window->SetWindowSizeAllowFlags & cond) == 0)\n        return;\n    window->SetWindowSizeAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing);\n\n    // Set\n    if (size.x > 0.0f)\n    {\n        window->AutoFitFramesX = 0;\n        window->SizeFull.x = size.x;\n    }\n    else\n    {\n        window->AutoFitFramesX = 2;\n        window->AutoFitOnlyGrows = false;\n    }\n    if (size.y > 0.0f)\n    {\n        window->AutoFitFramesY = 0;\n        window->SizeFull.y = size.y;\n    }\n    else\n    {\n        window->AutoFitFramesY = 2;\n        window->AutoFitOnlyGrows = false;\n    }\n}\n\nvoid ImGui::SetWindowSize(const ImVec2& size, ImGuiCond cond)\n{\n    SetWindowSize(GImGui->CurrentWindow, size, cond);\n}\n\nvoid ImGui::SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond)\n{\n    if (ImGuiWindow* window = FindWindowByName(name))\n        SetWindowSize(window, size, cond);\n}\n\nstatic void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond)\n{\n    // Test condition (NB: bit 0 is always true) and clear flags for next time\n    if (cond && (window->SetWindowCollapsedAllowFlags & cond) == 0)\n        return;\n    window->SetWindowCollapsedAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing);\n\n    // Set\n    window->Collapsed = collapsed;\n}\n\nvoid ImGui::SetWindowCollapsed(bool collapsed, ImGuiCond cond)\n{\n    SetWindowCollapsed(GImGui->CurrentWindow, collapsed, cond);\n}\n\nbool ImGui::IsWindowCollapsed()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->Collapsed;\n}\n\nbool ImGui::IsWindowAppearing()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->Appearing;\n}\n\nvoid ImGui::SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond)\n{\n    if (ImGuiWindow* window = FindWindowByName(name))\n        SetWindowCollapsed(window, collapsed, cond);\n}\n\nvoid ImGui::SetWindowFocus()\n{\n    FocusWindow(GImGui->CurrentWindow);\n}\n\nvoid ImGui::SetWindowFocus(const char* name)\n{\n    if (name)\n    {\n        if (ImGuiWindow* window = FindWindowByName(name))\n            FocusWindow(window);\n    }\n    else\n    {\n        FocusWindow(NULL);\n    }\n}\n\nvoid ImGui::SetNextWindowPos(const ImVec2& pos, ImGuiCond cond, const ImVec2& pivot)\n{\n    ImGuiContext& g = *GImGui;\n    g.SetNextWindowPosVal = pos;\n    g.SetNextWindowPosPivot = pivot;\n    g.SetNextWindowPosCond = cond ? cond : ImGuiCond_Always;\n}\n\nvoid ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond)\n{\n    ImGuiContext& g = *GImGui;\n    g.SetNextWindowSizeVal = size;\n    g.SetNextWindowSizeCond = cond ? cond : ImGuiCond_Always;\n}\n\nvoid ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeConstraintCallback custom_callback, void* custom_callback_user_data)\n{\n    ImGuiContext& g = *GImGui;\n    g.SetNextWindowSizeConstraint = true;\n    g.SetNextWindowSizeConstraintRect = ImRect(size_min, size_max);\n    g.SetNextWindowSizeConstraintCallback = custom_callback;\n    g.SetNextWindowSizeConstraintCallbackUserData = custom_callback_user_data;\n}\n\nvoid ImGui::SetNextWindowContentSize(const ImVec2& size)\n{\n    ImGuiContext& g = *GImGui;\n    g.SetNextWindowContentSizeVal = size;\n    g.SetNextWindowContentSizeCond = ImGuiCond_Always;\n}\n\nvoid ImGui::SetNextWindowContentWidth(float width)\n{\n    ImGuiContext& g = *GImGui;\n    g.SetNextWindowContentSizeVal = ImVec2(width, g.SetNextWindowContentSizeCond ? g.SetNextWindowContentSizeVal.y : 0.0f);\n    g.SetNextWindowContentSizeCond = ImGuiCond_Always;\n}\n\nvoid ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond)\n{\n    ImGuiContext& g = *GImGui;\n    g.SetNextWindowCollapsedVal = collapsed;\n    g.SetNextWindowCollapsedCond = cond ? cond : ImGuiCond_Always;\n}\n\nvoid ImGui::SetNextWindowFocus()\n{\n    ImGuiContext& g = *GImGui;\n    g.SetNextWindowFocus = true;\n}\n\n// In window space (not screen space!)\nImVec2 ImGui::GetContentRegionMax()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    ImVec2 mx = window->ContentsRegionRect.Max;\n    if (window->DC.ColumnsCount != 1)\n        mx.x = GetColumnOffset(window->DC.ColumnsCurrent + 1) - window->WindowPadding.x;\n    return mx;\n}\n\nImVec2 ImGui::GetContentRegionAvail()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return GetContentRegionMax() - (window->DC.CursorPos - window->Pos);\n}\n\nfloat ImGui::GetContentRegionAvailWidth()\n{\n    return GetContentRegionAvail().x;\n}\n\n// In window space (not screen space!)\nImVec2 ImGui::GetWindowContentRegionMin()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->ContentsRegionRect.Min;\n}\n\nImVec2 ImGui::GetWindowContentRegionMax()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->ContentsRegionRect.Max;\n}\n\nfloat ImGui::GetWindowContentRegionWidth()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->ContentsRegionRect.Max.x - window->ContentsRegionRect.Min.x;\n}\n\nfloat ImGui::GetTextLineHeight()\n{\n    ImGuiContext& g = *GImGui;\n    return g.FontSize;\n}\n\nfloat ImGui::GetTextLineHeightWithSpacing()\n{\n    ImGuiContext& g = *GImGui;\n    return g.FontSize + g.Style.ItemSpacing.y;\n}\n\nfloat ImGui::GetItemsLineHeightWithSpacing()\n{\n    ImGuiContext& g = *GImGui;\n    return g.FontSize + g.Style.FramePadding.y * 2.0f + g.Style.ItemSpacing.y;\n}\n\nImDrawList* ImGui::GetWindowDrawList()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    return window->DrawList;\n}\n\nImFont* ImGui::GetFont()\n{\n    return GImGui->Font;\n}\n\nfloat ImGui::GetFontSize()\n{\n    return GImGui->FontSize;\n}\n\nImVec2 ImGui::GetFontTexUvWhitePixel()\n{\n    return GImGui->FontTexUvWhitePixel;\n}\n\nvoid ImGui::SetWindowFontScale(float scale)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n    window->FontWindowScale = scale;\n    g.FontSize = window->CalcFontSize();\n}\n\n// User generally sees positions in window coordinates. Internally we store CursorPos in absolute screen coordinates because it is more convenient.\n// Conversion happens as we pass the value to user, but it makes our naming convention confusing because GetCursorPos() == (DC.CursorPos - window.Pos). May want to rename 'DC.CursorPos'.\nImVec2 ImGui::GetCursorPos()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.CursorPos - window->Pos + window->Scroll;\n}\n\nfloat ImGui::GetCursorPosX()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.CursorPos.x - window->Pos.x + window->Scroll.x;\n}\n\nfloat ImGui::GetCursorPosY()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.CursorPos.y - window->Pos.y + window->Scroll.y;\n}\n\nvoid ImGui::SetCursorPos(const ImVec2& local_pos)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.CursorPos = window->Pos - window->Scroll + local_pos;\n    window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos);\n}\n\nvoid ImGui::SetCursorPosX(float x)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + x;\n    window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPos.x);\n}\n\nvoid ImGui::SetCursorPosY(float y)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.CursorPos.y = window->Pos.y - window->Scroll.y + y;\n    window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y);\n}\n\nImVec2 ImGui::GetCursorStartPos()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.CursorStartPos - window->Pos;\n}\n\nImVec2 ImGui::GetCursorScreenPos()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.CursorPos;\n}\n\nvoid ImGui::SetCursorScreenPos(const ImVec2& screen_pos)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.CursorPos = screen_pos;\n    window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos);\n}\n\nfloat ImGui::GetScrollX()\n{\n    return GImGui->CurrentWindow->Scroll.x;\n}\n\nfloat ImGui::GetScrollY()\n{\n    return GImGui->CurrentWindow->Scroll.y;\n}\n\nfloat ImGui::GetScrollMaxX()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return ImMax(0.0f, window->SizeContents.x - (window->SizeFull.x - window->ScrollbarSizes.x));\n}\n\nfloat ImGui::GetScrollMaxY()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y));\n}\n\nvoid ImGui::SetScrollX(float scroll_x)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->ScrollTarget.x = scroll_x;\n    window->ScrollTargetCenterRatio.x = 0.0f;\n}\n\nvoid ImGui::SetScrollY(float scroll_y)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->ScrollTarget.y = scroll_y + window->TitleBarHeight() + window->MenuBarHeight(); // title bar height canceled out when using ScrollTargetRelY\n    window->ScrollTargetCenterRatio.y = 0.0f;\n}\n\nvoid ImGui::SetScrollFromPosY(float pos_y, float center_y_ratio)\n{\n    // We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size\n    ImGuiWindow* window = GetCurrentWindow();\n    IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);\n    window->ScrollTarget.y = (float)(int)(pos_y + window->Scroll.y);\n    if (center_y_ratio <= 0.0f && window->ScrollTarget.y <= window->WindowPadding.y)    // Minor hack to make \"scroll to top\" take account of WindowPadding, else it would scroll to (WindowPadding.y - ItemSpacing.y)\n        window->ScrollTarget.y = 0.0f;\n    window->ScrollTargetCenterRatio.y = center_y_ratio;\n}\n\n// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item.\nvoid ImGui::SetScrollHere(float center_y_ratio)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    float target_y = window->DC.CursorPosPrevLine.y - window->Pos.y; // Top of last item, in window space\n    target_y += (window->DC.PrevLineHeight * center_y_ratio) + (GImGui->Style.ItemSpacing.y * (center_y_ratio - 0.5f) * 2.0f); // Precisely aim above, in the middle or below the last line.\n    SetScrollFromPosY(target_y, center_y_ratio);\n}\n\nvoid ImGui::SetKeyboardFocusHere(int offset)\n{\n    IM_ASSERT(offset >= -1);    // -1 is allowed but not below\n    ImGuiWindow* window = GetCurrentWindow();\n    window->FocusIdxAllRequestNext = window->FocusIdxAllCounter + 1 + offset;\n    window->FocusIdxTabRequestNext = INT_MAX;\n}\n\nvoid ImGui::SetStateStorage(ImGuiStorage* tree)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.StateStorage = tree ? tree : &window->StateStorage;\n}\n\nImGuiStorage* ImGui::GetStateStorage()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.StateStorage;\n}\n\nvoid ImGui::TextV(const char* fmt, va_list args)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    const char* text_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args);\n    TextUnformatted(g.TempBuffer, text_end);\n}\n\nvoid ImGui::Text(const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    TextV(fmt, args);\n    va_end(args);\n}\n\nvoid ImGui::TextColoredV(const ImVec4& col, const char* fmt, va_list args)\n{\n    PushStyleColor(ImGuiCol_Text, col);\n    TextV(fmt, args);\n    PopStyleColor();\n}\n\nvoid ImGui::TextColored(const ImVec4& col, const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    TextColoredV(col, fmt, args);\n    va_end(args);\n}\n\nvoid ImGui::TextDisabledV(const char* fmt, va_list args)\n{\n    PushStyleColor(ImGuiCol_Text, GImGui->Style.Colors[ImGuiCol_TextDisabled]);\n    TextV(fmt, args);\n    PopStyleColor();\n}\n\nvoid ImGui::TextDisabled(const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    TextDisabledV(fmt, args);\n    va_end(args);\n}\n\nvoid ImGui::TextWrappedV(const char* fmt, va_list args)\n{\n    bool need_wrap = (GImGui->CurrentWindow->DC.TextWrapPos < 0.0f);    // Keep existing wrap position is one ia already set\n    if (need_wrap) PushTextWrapPos(0.0f);\n    TextV(fmt, args);\n    if (need_wrap) PopTextWrapPos();\n}\n\nvoid ImGui::TextWrapped(const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    TextWrappedV(fmt, args);\n    va_end(args);\n}\n\nvoid ImGui::TextUnformatted(const char* text, const char* text_end)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    IM_ASSERT(text != NULL);\n    const char* text_begin = text;\n    if (text_end == NULL)\n        text_end = text + strlen(text); // FIXME-OPT\n\n    const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrentLineTextBaseOffset);\n    const float wrap_pos_x = window->DC.TextWrapPos;\n    const bool wrap_enabled = wrap_pos_x >= 0.0f;\n    if (text_end - text > 2000 && !wrap_enabled)\n    {\n        // Long text!\n        // Perform manual coarse clipping to optimize for long multi-line text\n        // From this point we will only compute the width of lines that are visible. Optimization only available when word-wrapping is disabled.\n        // We also don't vertically center the text within the line full height, which is unlikely to matter because we are likely the biggest and only item on the line.\n        const char* line = text;\n        const float line_height = GetTextLineHeight();\n        const ImRect clip_rect = window->ClipRect;\n        ImVec2 text_size(0,0);\n\n        if (text_pos.y <= clip_rect.Max.y)\n        {\n            ImVec2 pos = text_pos;\n\n            // Lines to skip (can't skip when logging text)\n            if (!g.LogEnabled)\n            {\n                int lines_skippable = (int)((clip_rect.Min.y - text_pos.y) / line_height);\n                if (lines_skippable > 0)\n                {\n                    int lines_skipped = 0;\n                    while (line < text_end && lines_skipped < lines_skippable)\n                    {\n                        const char* line_end = strchr(line, '\\n');\n                        if (!line_end)\n                            line_end = text_end;\n                        line = line_end + 1;\n                        lines_skipped++;\n                    }\n                    pos.y += lines_skipped * line_height;\n                }\n            }\n\n            // Lines to render\n            if (line < text_end)\n            {\n                ImRect line_rect(pos, pos + ImVec2(FLT_MAX, line_height));\n                while (line < text_end)\n                {\n                    const char* line_end = strchr(line, '\\n');\n                    if (IsClippedEx(line_rect, 0, false))\n                        break;\n\n                    const ImVec2 line_size = CalcTextSize(line, line_end, false);\n                    text_size.x = ImMax(text_size.x, line_size.x);\n                    RenderText(pos, line, line_end, false);\n                    if (!line_end)\n                        line_end = text_end;\n                    line = line_end + 1;\n                    line_rect.Min.y += line_height;\n                    line_rect.Max.y += line_height;\n                    pos.y += line_height;\n                }\n\n                // Count remaining lines\n                int lines_skipped = 0;\n                while (line < text_end)\n                {\n                    const char* line_end = strchr(line, '\\n');\n                    if (!line_end)\n                        line_end = text_end;\n                    line = line_end + 1;\n                    lines_skipped++;\n                }\n                pos.y += lines_skipped * line_height;\n            }\n\n            text_size.y += (pos - text_pos).y;\n        }\n\n        ImRect bb(text_pos, text_pos + text_size);\n        ItemSize(bb);\n        ItemAdd(bb, 0);\n    }\n    else\n    {\n        const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f;\n        const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width);\n\n        // Account of baseline offset\n        ImRect bb(text_pos, text_pos + text_size);\n        ItemSize(text_size);\n        if (!ItemAdd(bb, 0))\n            return;\n\n        // Render (we don't hide text after ## in this end-user function)\n        RenderTextWrapped(bb.Min, text_begin, text_end, wrap_width);\n    }\n}\n\nvoid ImGui::AlignTextToFramePadding()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    window->DC.CurrentLineHeight = ImMax(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y * 2);\n    window->DC.CurrentLineTextBaseOffset = ImMax(window->DC.CurrentLineTextBaseOffset, g.Style.FramePadding.y);\n}\n\n// Add a label+text combo aligned to other label+value widgets\nvoid ImGui::LabelTextV(const char* label, const char* fmt, va_list args)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const float w = CalcItemWidth();\n\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n    const ImRect value_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2));\n    const ImRect total_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + (label_size.x > 0.0f ? style.ItemInnerSpacing.x : 0.0f), style.FramePadding.y*2) + label_size);\n    ItemSize(total_bb, style.FramePadding.y);\n    if (!ItemAdd(total_bb, 0))\n        return;\n\n    // Render\n    const char* value_text_begin = &g.TempBuffer[0];\n    const char* value_text_end = value_text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args);\n    RenderTextClipped(value_bb.Min, value_bb.Max, value_text_begin, value_text_end, NULL, ImVec2(0.0f,0.5f));\n    if (label_size.x > 0.0f)\n        RenderText(ImVec2(value_bb.Max.x + style.ItemInnerSpacing.x, value_bb.Min.y + style.FramePadding.y), label);\n}\n\nvoid ImGui::LabelText(const char* label, const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    LabelTextV(label, fmt, args);\n    va_end(args);\n}\n\nbool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n\n    if (flags & ImGuiButtonFlags_Disabled)\n    {\n        if (out_hovered) *out_hovered = false;\n        if (out_held) *out_held = false;\n        if (g.ActiveId == id) ClearActiveID();\n        return false;\n    }\n\n    // Default behavior requires click+release on same spot\n    if ((flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick)) == 0)\n        flags |= ImGuiButtonFlags_PressedOnClickRelease;\n\n    ImGuiWindow* backup_hovered_window = g.HoveredWindow;\n    if ((flags & ImGuiButtonFlags_FlattenChilds) && g.HoveredRootWindow == window)\n        g.HoveredWindow = window;\n\n    bool pressed = false;\n    bool hovered = ItemHoverable(bb, id);\n\n    if ((flags & ImGuiButtonFlags_FlattenChilds) && g.HoveredRootWindow == window)\n        g.HoveredWindow = backup_hovered_window;\n\n    // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one.\n    if (hovered && (flags & ImGuiButtonFlags_AllowOverlapMode) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0))\n        hovered = false;\n\n    if (hovered)\n    {\n        if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt))\n        {\n            //                        | CLICKING        | HOLDING with ImGuiButtonFlags_Repeat\n            // PressedOnClickRelease  |  <on release>*  |  <on repeat> <on repeat> .. (NOT on release)  <-- MOST COMMON! (*) only if both click/release were over bounds\n            // PressedOnClick         |  <on click>     |  <on click> <on repeat> <on repeat> ..\n            // PressedOnRelease       |  <on release>   |  <on repeat> <on repeat> .. (NOT on release)\n            // PressedOnDoubleClick   |  <on dclick>    |  <on dclick> <on repeat> <on repeat> ..\n            if ((flags & ImGuiButtonFlags_PressedOnClickRelease) && g.IO.MouseClicked[0])\n            {\n                SetActiveID(id, window); // Hold on ID\n                FocusWindow(window);\n                g.ActiveIdClickOffset = g.IO.MousePos - bb.Min;\n            }\n            if (((flags & ImGuiButtonFlags_PressedOnClick) && g.IO.MouseClicked[0]) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[0]))\n            {\n                pressed = true;\n                if (flags & ImGuiButtonFlags_NoHoldingActiveID)\n                {\n                    ClearActiveID();\n                }\n                else\n                {\n                    SetActiveID(id, window); // Hold on ID\n                    g.ActiveIdClickOffset = g.IO.MousePos - bb.Min;\n                }\n                FocusWindow(window);\n            }\n            if ((flags & ImGuiButtonFlags_PressedOnRelease) && g.IO.MouseReleased[0])\n            {\n                if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay))  // Repeat mode trumps <on release>\n                    pressed = true;\n                ClearActiveID();\n            }\n\n            // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). \n            // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings.\n            if ((flags & ImGuiButtonFlags_Repeat) && g.ActiveId == id && g.IO.MouseDownDuration[0] > 0.0f && IsMouseClicked(0, true))\n                pressed = true;\n        }\n    }\n\n    bool held = false;\n    if (g.ActiveId == id)\n    {\n        if (g.IO.MouseDown[0])\n        {\n            held = true;\n        }\n        else\n        {\n            if (hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease))\n                if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay))  // Repeat mode trumps <on release>\n                    pressed = true;\n            ClearActiveID();\n        }\n    }\n\n    if (out_hovered) *out_hovered = hovered;\n    if (out_held) *out_held = held;\n\n    return pressed;\n}\n\nbool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(label);\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n\n    ImVec2 pos = window->DC.CursorPos;\n    if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrentLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag)\n        pos.y += window->DC.CurrentLineTextBaseOffset - style.FramePadding.y;\n    ImVec2 size = CalcItemSize(size_arg, label_size.x + style.FramePadding.x * 2.0f, label_size.y + style.FramePadding.y * 2.0f);\n\n    const ImRect bb(pos, pos + size);\n    ItemSize(bb, style.FramePadding.y);\n    if (!ItemAdd(bb, id))\n        return false;\n\n    if (window->DC.ItemFlags & ImGuiItemFlags_ButtonRepeat) flags |= ImGuiButtonFlags_Repeat;\n    bool hovered, held;\n    bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);\n\n    // Render\n    const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);\n    RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding);\n    RenderTextClipped(bb.Min + style.FramePadding, bb.Max - style.FramePadding, label, NULL, &label_size, style.ButtonTextAlign, &bb);\n\n    // Automatically close popups\n    //if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup))\n    //    CloseCurrentPopup();\n\n    return pressed;\n}\n\nbool ImGui::Button(const char* label, const ImVec2& size_arg)\n{\n    return ButtonEx(label, size_arg, 0);\n}\n\n// Small buttons fits within text without additional vertical spacing.\nbool ImGui::SmallButton(const char* label)\n{\n    ImGuiContext& g = *GImGui;\n    float backup_padding_y = g.Style.FramePadding.y;\n    g.Style.FramePadding.y = 0.0f;\n    bool pressed = ButtonEx(label, ImVec2(0,0), ImGuiButtonFlags_AlignTextBaseLine);\n    g.Style.FramePadding.y = backup_padding_y;\n    return pressed;\n}\n\n// Tip: use ImGui::PushID()/PopID() to push indices or pointers in the ID stack.\n// Then you can keep 'str_id' empty or the same for all your buttons (instead of creating a string based on a non-string id)\nbool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    const ImGuiID id = window->GetID(str_id);\n    ImVec2 size = CalcItemSize(size_arg, 0.0f, 0.0f);\n    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);\n    ItemSize(bb);\n    if (!ItemAdd(bb, id))\n        return false;\n\n    bool hovered, held;\n    bool pressed = ButtonBehavior(bb, id, &hovered, &held);\n\n    return pressed;\n}\n\n// Upper-right button to close a window.\nbool ImGui::CloseButton(ImGuiID id, const ImVec2& pos, float radius)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n\n    const ImRect bb(pos - ImVec2(radius,radius), pos + ImVec2(radius,radius));\n\n    bool hovered, held;\n    bool pressed = ButtonBehavior(bb, id, &hovered, &held);\n\n    // Render\n    const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_CloseButtonActive : hovered ? ImGuiCol_CloseButtonHovered : ImGuiCol_CloseButton);\n    const ImVec2 center = bb.GetCenter();\n    window->DrawList->AddCircleFilled(center, ImMax(2.0f, radius), col, 12);\n\n    const float cross_extent = (radius * 0.7071f) - 1.0f;\n    if (hovered)\n    {\n        window->DrawList->AddLine(center + ImVec2(+cross_extent,+cross_extent), center + ImVec2(-cross_extent,-cross_extent), GetColorU32(ImGuiCol_Text));\n        window->DrawList->AddLine(center + ImVec2(+cross_extent,-cross_extent), center + ImVec2(-cross_extent,+cross_extent), GetColorU32(ImGuiCol_Text));\n    }\n\n    return pressed;\n}\n\n// [Internal]\nbool ImGui::ArrowButton(ImGuiID id, ImGuiDir dir, ImVec2 padding, ImGuiButtonFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    if (window->SkipItems)\n        return false;\n\n    const ImGuiStyle& style = g.Style;\n\n    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + padding.x * 2.0f, g.FontSize + padding.y * 2.0f));\n    ItemSize(bb, style.FramePadding.y);\n    if (!ItemAdd(bb, id))\n        return false;\n\n    bool hovered, held;\n    bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);\n\n    const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);\n#ifdef IMGUI_HAS_NAV\n    RenderNavHighlight(bb, id);\n#endif\n    RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding);\n    RenderTriangle(bb.Min + padding, dir, 1.0f);\n\n    return pressed;\n}\n\nvoid ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);\n    if (border_col.w > 0.0f)\n        bb.Max += ImVec2(2,2);\n    ItemSize(bb);\n    if (!ItemAdd(bb, 0))\n        return;\n\n    if (border_col.w > 0.0f)\n    {\n        window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f);\n        window->DrawList->AddImage(user_texture_id, bb.Min+ImVec2(1,1), bb.Max-ImVec2(1,1), uv0, uv1, GetColorU32(tint_col));\n    }\n    else\n    {\n        window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col));\n    }\n}\n\n// frame_padding < 0: uses FramePadding from style (default)\n// frame_padding = 0: no framing\n// frame_padding > 0: set framing size\n// The color used are the button colors.\nbool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n\n    // Default to using texture ID as ID. User can still push string/integer prefixes.\n    // We could hash the size/uv to create a unique ID but that would prevent the user from animating UV.\n    PushID((void *)user_texture_id);\n    const ImGuiID id = window->GetID(\"#image\");\n    PopID();\n\n    const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : style.FramePadding;\n    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding*2);\n    const ImRect image_bb(window->DC.CursorPos + padding, window->DC.CursorPos + padding + size);\n    ItemSize(bb);\n    if (!ItemAdd(bb, id))\n        return false;\n\n    bool hovered, held;\n    bool pressed = ButtonBehavior(bb, id, &hovered, &held);\n\n    // Render\n    const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);\n    RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, style.FrameRounding));\n    if (bg_col.w > 0.0f)\n        window->DrawList->AddRectFilled(image_bb.Min, image_bb.Max, GetColorU32(bg_col));\n    window->DrawList->AddImage(user_texture_id, image_bb.Min, image_bb.Max, uv0, uv1, GetColorU32(tint_col));\n\n    return pressed;\n}\n\n// Start logging ImGui output to TTY\nvoid ImGui::LogToTTY(int max_depth)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.LogEnabled)\n        return;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    g.LogEnabled = true;\n    g.LogFile = stdout;\n    g.LogStartDepth = window->DC.TreeDepth;\n    if (max_depth >= 0)\n        g.LogAutoExpandMaxDepth = max_depth;\n}\n\n// Start logging ImGui output to given file\nvoid ImGui::LogToFile(int max_depth, const char* filename)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.LogEnabled)\n        return;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    if (!filename)\n    {\n        filename = g.IO.LogFilename;\n        if (!filename)\n            return;\n    }\n\n    g.LogFile = ImFileOpen(filename, \"ab\");\n    if (!g.LogFile)\n    {\n        IM_ASSERT(g.LogFile != NULL); // Consider this an error\n        return;\n    }\n    g.LogEnabled = true;\n    g.LogStartDepth = window->DC.TreeDepth;\n    if (max_depth >= 0)\n        g.LogAutoExpandMaxDepth = max_depth;\n}\n\n// Start logging ImGui output to clipboard\nvoid ImGui::LogToClipboard(int max_depth)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.LogEnabled)\n        return;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    g.LogEnabled = true;\n    g.LogFile = NULL;\n    g.LogStartDepth = window->DC.TreeDepth;\n    if (max_depth >= 0)\n        g.LogAutoExpandMaxDepth = max_depth;\n}\n\nvoid ImGui::LogFinish()\n{\n    ImGuiContext& g = *GImGui;\n    if (!g.LogEnabled)\n        return;\n\n    LogText(IM_NEWLINE);\n    g.LogEnabled = false;\n    if (g.LogFile != NULL)\n    {\n        if (g.LogFile == stdout)\n            fflush(g.LogFile);\n        else\n            fclose(g.LogFile);\n        g.LogFile = NULL;\n    }\n    if (g.LogClipboard->size() > 1)\n    {\n        SetClipboardText(g.LogClipboard->begin());\n        g.LogClipboard->clear();\n    }\n}\n\n// Helper to display logging buttons\nvoid ImGui::LogButtons()\n{\n    ImGuiContext& g = *GImGui;\n\n    PushID(\"LogButtons\");\n    const bool log_to_tty = Button(\"Log To TTY\"); SameLine();\n    const bool log_to_file = Button(\"Log To File\"); SameLine();\n    const bool log_to_clipboard = Button(\"Log To Clipboard\"); SameLine();\n    PushItemWidth(80.0f);\n    PushAllowKeyboardFocus(false);\n    SliderInt(\"Depth\", &g.LogAutoExpandMaxDepth, 0, 9, NULL);\n    PopAllowKeyboardFocus();\n    PopItemWidth();\n    PopID();\n\n    // Start logging at the end of the function so that the buttons don't appear in the log\n    if (log_to_tty)\n        LogToTTY(g.LogAutoExpandMaxDepth);\n    if (log_to_file)\n        LogToFile(g.LogAutoExpandMaxDepth, g.IO.LogFilename);\n    if (log_to_clipboard)\n        LogToClipboard(g.LogAutoExpandMaxDepth);\n}\n\nbool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)\n{\n    if (flags & ImGuiTreeNodeFlags_Leaf)\n        return true;\n\n    // We only write to the tree storage if the user clicks (or explicitely use SetNextTreeNode*** functions)\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    ImGuiStorage* storage = window->DC.StateStorage;\n\n    bool is_open;\n    if (g.SetNextTreeNodeOpenCond != 0)\n    {\n        if (g.SetNextTreeNodeOpenCond & ImGuiCond_Always)\n        {\n            is_open = g.SetNextTreeNodeOpenVal;\n            storage->SetInt(id, is_open);\n        }\n        else\n        {\n            // We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently.\n            const int stored_value = storage->GetInt(id, -1);\n            if (stored_value == -1)\n            {\n                is_open = g.SetNextTreeNodeOpenVal;\n                storage->SetInt(id, is_open);\n            }\n            else\n            {\n                is_open = stored_value != 0;\n            }\n        }\n        g.SetNextTreeNodeOpenCond = 0;\n    }\n    else\n    {\n        is_open = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0;\n    }\n\n    // When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior).\n    // NB- If we are above max depth we still allow manually opened nodes to be logged.\n    if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && window->DC.TreeDepth < g.LogAutoExpandMaxDepth)\n        is_open = true;\n\n    return is_open;\n}\n\nbool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const bool display_frame = (flags & ImGuiTreeNodeFlags_Framed) != 0;\n    const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, 0.0f);\n\n    if (!label_end)\n        label_end = FindRenderedTextEnd(label);\n    const ImVec2 label_size = CalcTextSize(label, label_end, false);\n\n    // We vertically grow up to current line height up the typical widget height.\n    const float text_base_offset_y = ImMax(padding.y, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it\n    const float frame_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + style.FramePadding.y*2), label_size.y + padding.y*2);\n    ImRect bb = ImRect(window->DC.CursorPos, ImVec2(window->Pos.x + GetContentRegionMax().x, window->DC.CursorPos.y + frame_height));\n    if (display_frame)\n    {\n        // Framed header expand a little outside the default padding\n        bb.Min.x -= (float)(int)(window->WindowPadding.x*0.5f) - 1;\n        bb.Max.x += (float)(int)(window->WindowPadding.x*0.5f) - 1;\n    }\n\n    const float text_offset_x = (g.FontSize + (display_frame ? padding.x*3 : padding.x*2));   // Collapser arrow width + Spacing\n    const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x*2 : 0.0f);   // Include collapser\n    ItemSize(ImVec2(text_width, frame_height), text_base_offset_y);\n\n    // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing\n    // (Ideally we'd want to add a flag for the user to specify if we want the hit test to be done up to the right side of the content or not)\n    const ImRect interact_bb = display_frame ? bb : ImRect(bb.Min.x, bb.Min.y, bb.Min.x + text_width + style.ItemSpacing.x*2, bb.Max.y);\n    bool is_open = TreeNodeBehaviorIsOpen(id, flags);\n    if (!ItemAdd(interact_bb, id))\n    {\n        if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))\n            TreePushRawID(id);\n        return is_open;\n    }\n\n    // Flags that affects opening behavior:\n    // - 0(default) ..................... single-click anywhere to open\n    // - OpenOnDoubleClick .............. double-click anywhere to open\n    // - OpenOnArrow .................... single-click on arrow to open\n    // - OpenOnDoubleClick|OpenOnArrow .. single-click on arrow or double-click anywhere to open\n    ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers | ((flags & ImGuiTreeNodeFlags_AllowOverlapMode) ? ImGuiButtonFlags_AllowOverlapMode : 0);\n    if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick)\n        button_flags |= ImGuiButtonFlags_PressedOnDoubleClick | ((flags & ImGuiTreeNodeFlags_OpenOnArrow) ? ImGuiButtonFlags_PressedOnClickRelease : 0);\n    bool hovered, held, pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags);\n    if (pressed && !(flags & ImGuiTreeNodeFlags_Leaf))\n    {\n        bool toggled = !(flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick));\n        if (flags & ImGuiTreeNodeFlags_OpenOnArrow)\n            toggled |= IsMouseHoveringRect(interact_bb.Min, ImVec2(interact_bb.Min.x + text_offset_x, interact_bb.Max.y));\n        if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick)\n            toggled |= g.IO.MouseDoubleClicked[0];\n        if (toggled)\n        {\n            is_open = !is_open;\n            window->DC.StateStorage->SetInt(id, is_open);\n        }\n    }\n    if (flags & ImGuiTreeNodeFlags_AllowOverlapMode)\n        SetItemAllowOverlap();\n\n    // Render\n    const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);\n    const ImVec2 text_pos = bb.Min + ImVec2(text_offset_x, text_base_offset_y);\n    if (display_frame)\n    {\n        // Framed type\n        RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding);\n        RenderTriangle(bb.Min + ImVec2(padding.x, text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f);\n        if (g.LogEnabled)\n        {\n            // NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here.\n            const char log_prefix[] = \"\\n##\";\n            const char log_suffix[] = \"##\";\n            LogRenderedText(&text_pos, log_prefix, log_prefix+3);\n            RenderTextClipped(text_pos, bb.Max, label, label_end, &label_size);\n            LogRenderedText(&text_pos, log_suffix+1, log_suffix+3);\n        }\n        else\n        {\n            RenderTextClipped(text_pos, bb.Max, label, label_end, &label_size);\n        }\n    }\n    else\n    {\n        // Unframed typed for tree nodes\n        if (hovered || (flags & ImGuiTreeNodeFlags_Selected))\n            RenderFrame(bb.Min, bb.Max, col, false);\n\n        if (flags & ImGuiTreeNodeFlags_Bullet)\n            RenderBullet(bb.Min + ImVec2(text_offset_x * 0.5f, g.FontSize*0.50f + text_base_offset_y));\n        else if (!(flags & ImGuiTreeNodeFlags_Leaf))\n            RenderTriangle(bb.Min + ImVec2(padding.x, g.FontSize*0.15f + text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f);\n        if (g.LogEnabled)\n            LogRenderedText(&text_pos, \">\");\n        RenderText(text_pos, label, label_end, false);\n    }\n\n    if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))\n        TreePushRawID(id);\n    return is_open;\n}\n\n// CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag).\n// This is basically the same as calling TreeNodeEx(label, ImGuiTreeNodeFlags_CollapsingHeader | ImGuiTreeNodeFlags_NoTreePushOnOpen). You can remove the _NoTreePushOnOpen flag if you want behavior closer to normal TreeNode().\nbool ImGui::CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    return TreeNodeBehavior(window->GetID(label), flags | ImGuiTreeNodeFlags_CollapsingHeader | ImGuiTreeNodeFlags_NoTreePushOnOpen, label);\n}\n\nbool ImGui::CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    if (p_open && !*p_open)\n        return false;\n\n    ImGuiID id = window->GetID(label);\n    bool is_open = TreeNodeBehavior(id, flags | ImGuiTreeNodeFlags_CollapsingHeader | ImGuiTreeNodeFlags_NoTreePushOnOpen | (p_open ? ImGuiTreeNodeFlags_AllowOverlapMode : 0), label);\n    if (p_open)\n    {\n        // Create a small overlapping close button // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc.\n        ImGuiContext& g = *GImGui;\n        float button_sz = g.FontSize * 0.5f;\n        ImGuiItemHoveredDataBackup last_item_backup;\n        last_item_backup.Backup();\n        if (CloseButton(window->GetID((void*)(intptr_t)(id+1)), ImVec2(ImMin(window->DC.LastItemRect.Max.x, window->ClipRect.Max.x) - g.Style.FramePadding.x - button_sz, window->DC.LastItemRect.Min.y + g.Style.FramePadding.y + button_sz), button_sz))\n            *p_open = false;\n        last_item_backup.Restore();\n    }\n\n    return is_open;\n}\n\nbool ImGui::TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    return TreeNodeBehavior(window->GetID(label), flags, label, NULL);\n}\n\nbool ImGui::TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const char* label_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args);\n    return TreeNodeBehavior(window->GetID(str_id), flags, g.TempBuffer, label_end);\n}\n\nbool ImGui::TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const char* label_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args);\n    return TreeNodeBehavior(window->GetID(ptr_id), flags, g.TempBuffer, label_end);\n}\n\nbool ImGui::TreeNodeV(const char* str_id, const char* fmt, va_list args)\n{\n    return TreeNodeExV(str_id, 0, fmt, args);\n}\n\nbool ImGui::TreeNodeV(const void* ptr_id, const char* fmt, va_list args)\n{\n    return TreeNodeExV(ptr_id, 0, fmt, args);\n}\n\nbool ImGui::TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    bool is_open = TreeNodeExV(str_id, flags, fmt, args);\n    va_end(args);\n    return is_open;\n}\n\nbool ImGui::TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    bool is_open = TreeNodeExV(ptr_id, flags, fmt, args);\n    va_end(args);\n    return is_open;\n}\n\nbool ImGui::TreeNode(const char* str_id, const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    bool is_open = TreeNodeExV(str_id, 0, fmt, args);\n    va_end(args);\n    return is_open;\n}\n\nbool ImGui::TreeNode(const void* ptr_id, const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    bool is_open = TreeNodeExV(ptr_id, 0, fmt, args);\n    va_end(args);\n    return is_open;\n}\n\nbool ImGui::TreeNode(const char* label)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n    return TreeNodeBehavior(window->GetID(label), 0, label, NULL);\n}\n\nvoid ImGui::TreeAdvanceToLabelPos()\n{\n    ImGuiContext& g = *GImGui;\n    g.CurrentWindow->DC.CursorPos.x += GetTreeNodeToLabelSpacing();\n}\n\n// Horizontal distance preceding label when using TreeNode() or Bullet()\nfloat ImGui::GetTreeNodeToLabelSpacing()\n{\n    ImGuiContext& g = *GImGui;\n    return g.FontSize + (g.Style.FramePadding.x * 2.0f);\n}\n\nvoid ImGui::SetNextTreeNodeOpen(bool is_open, ImGuiCond cond)\n{\n    ImGuiContext& g = *GImGui;\n    if (g.CurrentWindow->SkipItems)\n        return;\n    g.SetNextTreeNodeOpenVal = is_open;\n    g.SetNextTreeNodeOpenCond = cond ? cond : ImGuiCond_Always;\n}\n\nvoid ImGui::PushID(const char* str_id)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    window->IDStack.push_back(window->GetID(str_id));\n}\n\nvoid ImGui::PushID(const char* str_id_begin, const char* str_id_end)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    window->IDStack.push_back(window->GetID(str_id_begin, str_id_end));\n}\n\nvoid ImGui::PushID(const void* ptr_id)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    window->IDStack.push_back(window->GetID(ptr_id));\n}\n\nvoid ImGui::PushID(int int_id)\n{\n    const void* ptr_id = (void*)(intptr_t)int_id;\n    ImGuiWindow* window = GetCurrentWindowRead();\n    window->IDStack.push_back(window->GetID(ptr_id));\n}\n\nvoid ImGui::PopID()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    window->IDStack.pop_back();\n}\n\nImGuiID ImGui::GetID(const char* str_id)\n{\n    return GImGui->CurrentWindow->GetID(str_id);\n}\n\nImGuiID ImGui::GetID(const char* str_id_begin, const char* str_id_end)\n{\n    return GImGui->CurrentWindow->GetID(str_id_begin, str_id_end);\n}\n\nImGuiID ImGui::GetID(const void* ptr_id)\n{\n    return GImGui->CurrentWindow->GetID(ptr_id);\n}\n\nvoid ImGui::Bullet()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize);\n    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height));\n    ItemSize(bb);\n    if (!ItemAdd(bb, 0))\n    {\n        SameLine(0, style.FramePadding.x*2);\n        return;\n    }\n\n    // Render and stay on same line\n    RenderBullet(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f));\n    SameLine(0, style.FramePadding.x*2);\n}\n\n// Text with a little bullet aligned to the typical tree node.\nvoid ImGui::BulletTextV(const char* fmt, va_list args)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n\n    const char* text_begin = g.TempBuffer;\n    const char* text_end = text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args);\n    const ImVec2 label_size = CalcTextSize(text_begin, text_end, false);\n    const float text_base_offset_y = ImMax(0.0f, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it\n    const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize);\n    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x*2) : 0.0f), ImMax(line_height, label_size.y)));  // Empty text doesn't add padding\n    ItemSize(bb);\n    if (!ItemAdd(bb, 0))\n        return;\n\n    // Render\n    RenderBullet(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f));\n    RenderText(bb.Min+ImVec2(g.FontSize + style.FramePadding.x*2, text_base_offset_y), text_begin, text_end, false);\n}\n\nvoid ImGui::BulletText(const char* fmt, ...)\n{\n    va_list args;\n    va_start(args, fmt);\n    BulletTextV(fmt, args);\n    va_end(args);\n}\n\nstatic inline void DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, const char* display_format, char* buf, int buf_size)\n{\n    if (data_type == ImGuiDataType_Int)\n        ImFormatString(buf, buf_size, display_format, *(int*)data_ptr);\n    else if (data_type == ImGuiDataType_Float)\n        ImFormatString(buf, buf_size, display_format, *(float*)data_ptr);\n}\n\nstatic inline void DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, int decimal_precision, char* buf, int buf_size)\n{\n    if (data_type == ImGuiDataType_Int)\n    {\n        if (decimal_precision < 0)\n            ImFormatString(buf, buf_size, \"%d\", *(int*)data_ptr);\n        else\n            ImFormatString(buf, buf_size, \"%.*d\", decimal_precision, *(int*)data_ptr);\n    }\n    else if (data_type == ImGuiDataType_Float)\n    {\n        if (decimal_precision < 0)\n            ImFormatString(buf, buf_size, \"%f\", *(float*)data_ptr);     // Ideally we'd have a minimum decimal precision of 1 to visually denote that it is a float, while hiding non-significant digits?\n        else\n            ImFormatString(buf, buf_size, \"%.*f\", decimal_precision, *(float*)data_ptr);\n    }\n}\n\nstatic void DataTypeApplyOp(ImGuiDataType data_type, int op, void* value1, const void* value2)// Store into value1\n{\n    if (data_type == ImGuiDataType_Int)\n    {\n        if (op == '+')\n            *(int*)value1 = *(int*)value1 + *(const int*)value2;\n        else if (op == '-')\n            *(int*)value1 = *(int*)value1 - *(const int*)value2;\n    }\n    else if (data_type == ImGuiDataType_Float)\n    {\n        if (op == '+')\n            *(float*)value1 = *(float*)value1 + *(const float*)value2;\n        else if (op == '-')\n            *(float*)value1 = *(float*)value1 - *(const float*)value2;\n    }\n}\n\n// User can input math operators (e.g. +100) to edit a numerical values.\nstatic bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* scalar_format)\n{\n    while (ImCharIsSpace(*buf))\n        buf++;\n\n    // We don't support '-' op because it would conflict with inputing negative value.\n    // Instead you can use +-100 to subtract from an existing value\n    char op = buf[0];\n    if (op == '+' || op == '*' || op == '/')\n    {\n        buf++;\n        while (ImCharIsSpace(*buf))\n            buf++;\n    }\n    else\n    {\n        op = 0;\n    }\n    if (!buf[0])\n        return false;\n\n    if (data_type == ImGuiDataType_Int)\n    {\n        if (!scalar_format)\n            scalar_format = \"%d\";\n        int* v = (int*)data_ptr;\n        const int old_v = *v;\n        int arg0i = *v;\n        if (op && sscanf(initial_value_buf, scalar_format, &arg0i) < 1)\n            return false;\n\n        // Store operand in a float so we can use fractional value for multipliers (*1.1), but constant always parsed as integer so we can fit big integers (e.g. 2000000003) past float precision\n        float arg1f = 0.0f;\n        if (op == '+')      { if (sscanf(buf, \"%f\", &arg1f) == 1) *v = (int)(arg0i + arg1f); }                 // Add (use \"+-\" to subtract)\n        else if (op == '*') { if (sscanf(buf, \"%f\", &arg1f) == 1) *v = (int)(arg0i * arg1f); }                 // Multiply\n        else if (op == '/') { if (sscanf(buf, \"%f\", &arg1f) == 1 && arg1f != 0.0f) *v = (int)(arg0i / arg1f); }// Divide\n        else                { if (sscanf(buf, scalar_format, &arg0i) == 1) *v = arg0i; }                       // Assign constant (read as integer so big values are not lossy)\n        return (old_v != *v);\n    }\n    else if (data_type == ImGuiDataType_Float)\n    {\n        // For floats we have to ignore format with precision (e.g. \"%.2f\") because sscanf doesn't take them in\n        scalar_format = \"%f\";\n        float* v = (float*)data_ptr;\n        const float old_v = *v;\n        float arg0f = *v;\n        if (op && sscanf(initial_value_buf, scalar_format, &arg0f) < 1)\n            return false;\n\n        float arg1f = 0.0f;\n        if (sscanf(buf, scalar_format, &arg1f) < 1)\n            return false;\n        if (op == '+')      { *v = arg0f + arg1f; }                    // Add (use \"+-\" to subtract)\n        else if (op == '*') { *v = arg0f * arg1f; }                    // Multiply\n        else if (op == '/') { if (arg1f != 0.0f) *v = arg0f / arg1f; } // Divide\n        else                { *v = arg1f; }                            // Assign constant\n        return (old_v != *v);\n    }\n\n    return false;\n}\n\n// Create text input in place of a slider (when CTRL+Clicking on slider)\n// FIXME: Logic is messy and confusing.\nbool ImGui::InputScalarAsWidgetReplacement(const ImRect& aabb, const char* label, ImGuiDataType data_type, void* data_ptr, ImGuiID id, int decimal_precision)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n\n    // Our replacement widget will override the focus ID (registered previously to allow for a TAB focus to happen)\n    // On the first frame, g.ScalarAsInputTextId == 0, then on subsequent frames it becomes == id\n    SetActiveID(g.ScalarAsInputTextId, window);\n    SetHoveredID(0);\n    FocusableItemUnregister(window);\n\n    char buf[32];\n    DataTypeFormatString(data_type, data_ptr, decimal_precision, buf, IM_ARRAYSIZE(buf));\n    bool text_value_changed = InputTextEx(label, buf, IM_ARRAYSIZE(buf), aabb.GetSize(), ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_AutoSelectAll);\n    if (g.ScalarAsInputTextId == 0)     // First frame we started displaying the InputText widget\n    {\n        IM_ASSERT(g.ActiveId == id);    // InputText ID expected to match the Slider ID (else we'd need to store them both, which is also possible)\n        g.ScalarAsInputTextId = g.ActiveId;\n        SetHoveredID(id);\n    }\n    if (text_value_changed)\n        return DataTypeApplyOpFromText(buf, GImGui->InputTextState.InitialText.begin(), data_type, data_ptr, NULL);\n    return false;\n}\n\n// Parse display precision back from the display format string\nint ImGui::ParseFormatPrecision(const char* fmt, int default_precision)\n{\n    int precision = default_precision;\n    while ((fmt = strchr(fmt, '%')) != NULL)\n    {\n        fmt++;\n        if (fmt[0] == '%') { fmt++; continue; } // Ignore \"%%\"\n        while (*fmt >= '0' && *fmt <= '9')\n            fmt++;\n        if (*fmt == '.')\n        {\n            fmt = ImAtoi(fmt + 1, &precision);\n            if (precision < 0 || precision > 10)\n                precision = default_precision;\n        }\n        if (*fmt == 'e' || *fmt == 'E') // Maximum precision with scientific notation\n            precision = -1;\n        break;\n    }\n    return precision;\n}\n\nstatic float GetMinimumStepAtDecimalPrecision(int decimal_precision)\n{\n    static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f };\n    return (decimal_precision >= 0 && decimal_precision < 10) ? min_steps[decimal_precision] : powf(10.0f, (float)-decimal_precision);\n}\n\nfloat ImGui::RoundScalar(float value, int decimal_precision)\n{\n    // Round past decimal precision\n    // So when our value is 1.99999 with a precision of 0.001 we'll end up rounding to 2.0\n    // FIXME: Investigate better rounding methods\n    if (decimal_precision < 0)\n        return value;\n    const float min_step = GetMinimumStepAtDecimalPrecision(decimal_precision);\n    bool negative = value < 0.0f;\n    value = fabsf(value);\n    float remainder = fmodf(value, min_step);\n    if (remainder <= min_step*0.5f)\n        value -= remainder;\n    else\n        value += (min_step - remainder);\n    return negative ? -value : value;\n}\n\nstatic inline float SliderBehaviorCalcRatioFromValue(float v, float v_min, float v_max, float power, float linear_zero_pos)\n{\n    if (v_min == v_max)\n        return 0.0f;\n\n    const bool is_non_linear = (power < 1.0f-0.00001f) || (power > 1.0f+0.00001f);\n    const float v_clamped = (v_min < v_max) ? ImClamp(v, v_min, v_max) : ImClamp(v, v_max, v_min);\n    if (is_non_linear)\n    {\n        if (v_clamped < 0.0f)\n        {\n            const float f = 1.0f - (v_clamped - v_min) / (ImMin(0.0f,v_max) - v_min);\n            return (1.0f - powf(f, 1.0f/power)) * linear_zero_pos;\n        }\n        else\n        {\n            const float f = (v_clamped - ImMax(0.0f,v_min)) / (v_max - ImMax(0.0f,v_min));\n            return linear_zero_pos + powf(f, 1.0f/power) * (1.0f - linear_zero_pos);\n        }\n    }\n\n    // Linear slider\n    return (v_clamped - v_min) / (v_max - v_min);\n}\n\nbool ImGui::SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_min, float v_max, float power, int decimal_precision, ImGuiSliderFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n    const ImGuiStyle& style = g.Style;\n\n    // Draw frame\n    RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);\n\n    const bool is_non_linear = (power < 1.0f-0.00001f) || (power > 1.0f+0.00001f);\n    const bool is_horizontal = (flags & ImGuiSliderFlags_Vertical) == 0;\n\n    const float grab_padding = 2.0f;\n    const float slider_sz = is_horizontal ? (frame_bb.GetWidth() - grab_padding * 2.0f) : (frame_bb.GetHeight() - grab_padding * 2.0f);\n    float grab_sz;\n    if (decimal_precision != 0)\n        grab_sz = ImMin(style.GrabMinSize, slider_sz);\n    else\n        grab_sz = ImMin(ImMax(1.0f * (slider_sz / ((v_min < v_max ? v_max - v_min : v_min - v_max) + 1.0f)), style.GrabMinSize), slider_sz);  // Integer sliders, if possible have the grab size represent 1 unit\n    const float slider_usable_sz = slider_sz - grab_sz;\n    const float slider_usable_pos_min = (is_horizontal ? frame_bb.Min.x : frame_bb.Min.y) + grab_padding + grab_sz*0.5f;\n    const float slider_usable_pos_max = (is_horizontal ? frame_bb.Max.x : frame_bb.Max.y) - grab_padding - grab_sz*0.5f;\n\n    // For logarithmic sliders that cross over sign boundary we want the exponential increase to be symmetric around 0.0f\n    float linear_zero_pos = 0.0f;   // 0.0->1.0f\n    if (v_min * v_max < 0.0f)\n    {\n        // Different sign\n        const float linear_dist_min_to_0 = powf(fabsf(0.0f - v_min), 1.0f/power);\n        const float linear_dist_max_to_0 = powf(fabsf(v_max - 0.0f), 1.0f/power);\n        linear_zero_pos = linear_dist_min_to_0 / (linear_dist_min_to_0+linear_dist_max_to_0);\n    }\n    else\n    {\n        // Same sign\n        linear_zero_pos = v_min < 0.0f ? 1.0f : 0.0f;\n    }\n\n    // Process clicking on the slider\n    bool value_changed = false;\n    if (g.ActiveId == id)\n    {\n        bool set_new_value = false;\n        float clicked_t = 0.0f;\n        if (g.IO.MouseDown[0])\n        {\n            const float mouse_abs_pos = is_horizontal ? g.IO.MousePos.x : g.IO.MousePos.y;\n            clicked_t = (slider_usable_sz > 0.0f) ? ImClamp((mouse_abs_pos - slider_usable_pos_min) / slider_usable_sz, 0.0f, 1.0f) : 0.0f;\n            if (!is_horizontal)\n                clicked_t = 1.0f - clicked_t;\n            set_new_value = true;\n        }\n        else\n        {\n            ClearActiveID();\n        }\n\n        if (set_new_value)\n        {\n            float new_value;\n            if (is_non_linear)\n            {\n                // Account for logarithmic scale on both sides of the zero\n                if (clicked_t < linear_zero_pos)\n                {\n                    // Negative: rescale to the negative range before powering\n                    float a = 1.0f - (clicked_t / linear_zero_pos);\n                    a = powf(a, power);\n                    new_value = ImLerp(ImMin(v_max,0.0f), v_min, a);\n                }\n                else\n                {\n                    // Positive: rescale to the positive range before powering\n                    float a;\n                    if (fabsf(linear_zero_pos - 1.0f) > 1.e-6f)\n                        a = (clicked_t - linear_zero_pos) / (1.0f - linear_zero_pos);\n                    else\n                        a = clicked_t;\n                    a = powf(a, power);\n                    new_value = ImLerp(ImMax(v_min,0.0f), v_max, a);\n                }\n            }\n            else\n            {\n                // Linear slider\n                new_value = ImLerp(v_min, v_max, clicked_t);\n            }\n\n            // Round past decimal precision\n            new_value = RoundScalar(new_value, decimal_precision);\n            if (*v != new_value)\n            {\n                *v = new_value;\n                value_changed = true;\n            }\n        }\n    }\n\n    // Draw\n    float grab_t = SliderBehaviorCalcRatioFromValue(*v, v_min, v_max, power, linear_zero_pos);\n    if (!is_horizontal)\n        grab_t = 1.0f - grab_t;\n    const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t);\n    ImRect grab_bb;\n    if (is_horizontal)\n        grab_bb = ImRect(ImVec2(grab_pos - grab_sz*0.5f, frame_bb.Min.y + grab_padding), ImVec2(grab_pos + grab_sz*0.5f, frame_bb.Max.y - grab_padding));\n    else\n        grab_bb = ImRect(ImVec2(frame_bb.Min.x + grab_padding, grab_pos - grab_sz*0.5f), ImVec2(frame_bb.Max.x - grab_padding, grab_pos + grab_sz*0.5f));\n    window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);\n\n    return value_changed;\n}\n\n// Use power!=1.0 for logarithmic sliders.\n// Adjust display_format to decorate the value with a prefix or a suffix.\n//   \"%.3f\"         1.234\n//   \"%5.2f secs\"   01.23 secs\n//   \"Gold: %.0f\"   Gold: 1\nbool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format, float power)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(label);\n    const float w = CalcItemWidth();\n\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n    const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));\n    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));\n\n    // NB- we don't call ItemSize() yet because we may turn into a text edit box below\n    if (!ItemAdd(total_bb, id))\n    {\n        ItemSize(total_bb, style.FramePadding.y);\n        return false;\n    }\n    const bool hovered = ItemHoverable(frame_bb, id);\n\n    if (!display_format)\n        display_format = \"%.3f\";\n    int decimal_precision = ParseFormatPrecision(display_format, 3);\n\n    // Tabbing or CTRL-clicking on Slider turns it into an input box\n    bool start_text_input = false;\n    const bool tab_focus_requested = FocusableItemRegister(window, id);\n    if (tab_focus_requested || (hovered && g.IO.MouseClicked[0]))\n    {\n        SetActiveID(id, window);\n        FocusWindow(window);\n        if (tab_focus_requested || g.IO.KeyCtrl)\n        {\n            start_text_input = true;\n            g.ScalarAsInputTextId = 0;\n        }\n    }\n    if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))\n        return InputScalarAsWidgetReplacement(frame_bb, label, ImGuiDataType_Float, v, id, decimal_precision);\n\n    // Actual slider behavior + render grab\n    ItemSize(total_bb, style.FramePadding.y);\n    const bool value_changed = SliderBehavior(frame_bb, id, v, v_min, v_max, power, decimal_precision);\n\n    // Display value using user-provided display format so user can add prefix/suffix/decorations to the value.\n    char value_buf[64];\n    const char* value_buf_end = value_buf + ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v);\n    RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.5f));\n\n    if (label_size.x > 0.0f)\n        RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);\n\n    return value_changed;\n}\n\nbool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* display_format, float power)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(label);\n\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n    const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size);\n    const ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));\n\n    ItemSize(bb, style.FramePadding.y);\n    if (!ItemAdd(frame_bb, id))\n        return false;\n    const bool hovered = ItemHoverable(frame_bb, id);\n\n    if (!display_format)\n        display_format = \"%.3f\";\n    int decimal_precision = ParseFormatPrecision(display_format, 3);\n\n    if (hovered && g.IO.MouseClicked[0])\n    {\n        SetActiveID(id, window);\n        FocusWindow(window);\n    }\n\n    // Actual slider behavior + render grab\n    bool value_changed = SliderBehavior(frame_bb, id, v, v_min, v_max, power, decimal_precision, ImGuiSliderFlags_Vertical);\n\n    // Display value using user-provided display format so user can add prefix/suffix/decorations to the value.\n    // For the vertical slider we allow centered text to overlap the frame padding\n    char value_buf[64];\n    char* value_buf_end = value_buf + ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v);\n    RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.0f));\n    if (label_size.x > 0.0f)\n        RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);\n\n    return value_changed;\n}\n\nbool ImGui::SliderAngle(const char* label, float* v_rad, float v_degrees_min, float v_degrees_max)\n{\n    float v_deg = (*v_rad) * 360.0f / (2*IM_PI);\n    bool value_changed = SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, \"%.0f deg\", 1.0f);\n    *v_rad = v_deg * (2*IM_PI) / 360.0f;\n    return value_changed;\n}\n\nbool ImGui::SliderInt(const char* label, int* v, int v_min, int v_max, const char* display_format)\n{\n    if (!display_format)\n        display_format = \"%.0f\";\n    float v_f = (float)*v;\n    bool value_changed = SliderFloat(label, &v_f, (float)v_min, (float)v_max, display_format, 1.0f);\n    *v = (int)v_f;\n    return value_changed;\n}\n\nbool ImGui::VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* display_format)\n{\n    if (!display_format)\n        display_format = \"%.0f\";\n    float v_f = (float)*v;\n    bool value_changed = VSliderFloat(label, size, &v_f, (float)v_min, (float)v_max, display_format, 1.0f);\n    *v = (int)v_f;\n    return value_changed;\n}\n\n// Add multiple sliders on 1 line for compact edition of multiple components\nbool ImGui::SliderFloatN(const char* label, float* v, int components, float v_min, float v_max, const char* display_format, float power)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    bool value_changed = false;\n    BeginGroup();\n    PushID(label);\n    PushMultiItemsWidths(components);\n    for (int i = 0; i < components; i++)\n    {\n        PushID(i);\n        value_changed |= SliderFloat(\"##v\", &v[i], v_min, v_max, display_format, power);\n        SameLine(0, g.Style.ItemInnerSpacing.x);\n        PopID();\n        PopItemWidth();\n    }\n    PopID();\n\n    TextUnformatted(label, FindRenderedTextEnd(label));\n    EndGroup();\n\n    return value_changed;\n}\n\nbool ImGui::SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format, float power)\n{\n    return SliderFloatN(label, v, 2, v_min, v_max, display_format, power);\n}\n\nbool ImGui::SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format, float power)\n{\n    return SliderFloatN(label, v, 3, v_min, v_max, display_format, power);\n}\n\nbool ImGui::SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* display_format, float power)\n{\n    return SliderFloatN(label, v, 4, v_min, v_max, display_format, power);\n}\n\nbool ImGui::SliderIntN(const char* label, int* v, int components, int v_min, int v_max, const char* display_format)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    bool value_changed = false;\n    BeginGroup();\n    PushID(label);\n    PushMultiItemsWidths(components);\n    for (int i = 0; i < components; i++)\n    {\n        PushID(i);\n        value_changed |= SliderInt(\"##v\", &v[i], v_min, v_max, display_format);\n        SameLine(0, g.Style.ItemInnerSpacing.x);\n        PopID();\n        PopItemWidth();\n    }\n    PopID();\n\n    TextUnformatted(label, FindRenderedTextEnd(label));\n    EndGroup();\n\n    return value_changed;\n}\n\nbool ImGui::SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* display_format)\n{\n    return SliderIntN(label, v, 2, v_min, v_max, display_format);\n}\n\nbool ImGui::SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* display_format)\n{\n    return SliderIntN(label, v, 3, v_min, v_max, display_format);\n}\n\nbool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* display_format)\n{\n    return SliderIntN(label, v, 4, v_min, v_max, display_format);\n}\n\nbool ImGui::DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_speed, float v_min, float v_max, int decimal_precision, float power)\n{\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n\n    // Draw frame\n    const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);\n    RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding);\n\n    bool value_changed = false;\n\n    // Process clicking on the drag\n    if (g.ActiveId == id)\n    {\n        if (g.IO.MouseDown[0])\n        {\n            if (g.ActiveIdIsJustActivated)\n            {\n                // Lock current value on click\n                g.DragCurrentValue = *v;\n                g.DragLastMouseDelta = ImVec2(0.f, 0.f);\n            }\n\n            if (v_speed == 0.0f && (v_max - v_min) != 0.0f && (v_max - v_min) < FLT_MAX)\n                v_speed = (v_max - v_min) * g.DragSpeedDefaultRatio;\n\n            float v_cur = g.DragCurrentValue;\n            const ImVec2 mouse_drag_delta = GetMouseDragDelta(0, 1.0f);\n            float adjust_delta = 0.0f;\n            //if (g.ActiveIdSource == ImGuiInputSource_Mouse)\n            {\n                adjust_delta = mouse_drag_delta.x - g.DragLastMouseDelta.x;\n                if (g.IO.KeyShift && g.DragSpeedScaleFast >= 0.0f)\n                    adjust_delta *= g.DragSpeedScaleFast;\n                if (g.IO.KeyAlt && g.DragSpeedScaleSlow >= 0.0f)\n                    adjust_delta *= g.DragSpeedScaleSlow;\n            }\n            adjust_delta *= v_speed;\n            g.DragLastMouseDelta.x = mouse_drag_delta.x;\n\n            if (fabsf(adjust_delta) > 0.0f)\n            {\n                if (fabsf(power - 1.0f) > 0.001f)\n                {\n                    // Logarithmic curve on both side of 0.0\n                    float v0_abs = v_cur >= 0.0f ? v_cur : -v_cur;\n                    float v0_sign = v_cur >= 0.0f ? 1.0f : -1.0f;\n                    float v1 = powf(v0_abs, 1.0f / power) + (adjust_delta * v0_sign);\n                    float v1_abs = v1 >= 0.0f ? v1 : -v1;\n                    float v1_sign = v1 >= 0.0f ? 1.0f : -1.0f;          // Crossed sign line\n                    v_cur = powf(v1_abs, power) * v0_sign * v1_sign;    // Reapply sign\n                }\n                else\n                {\n                    v_cur += adjust_delta;\n                }\n\n                // Clamp\n                if (v_min < v_max)\n                    v_cur = ImClamp(v_cur, v_min, v_max);\n                g.DragCurrentValue = v_cur;\n            }\n\n            // Round to user desired precision, then apply\n            v_cur = RoundScalar(v_cur, decimal_precision);\n            if (*v != v_cur)\n            {\n                *v = v_cur;\n                value_changed = true;\n            }\n        }\n        else\n        {\n            ClearActiveID();\n        }\n    }\n\n    return value_changed;\n}\n\nbool ImGui::DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* display_format, float power)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(label);\n    const float w = CalcItemWidth();\n\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n    const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));\n    const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding);\n    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));\n\n    // NB- we don't call ItemSize() yet because we may turn into a text edit box below\n    if (!ItemAdd(total_bb, id))\n    {\n        ItemSize(total_bb, style.FramePadding.y);\n        return false;\n    }\n    const bool hovered = ItemHoverable(frame_bb, id);\n\n    if (!display_format)\n        display_format = \"%.3f\";\n    int decimal_precision = ParseFormatPrecision(display_format, 3);\n\n    // Tabbing or CTRL-clicking on Drag turns it into an input box\n    bool start_text_input = false;\n    const bool tab_focus_requested = FocusableItemRegister(window, id);\n    if (tab_focus_requested || (hovered && (g.IO.MouseClicked[0] || g.IO.MouseDoubleClicked[0])))\n    {\n        SetActiveID(id, window);\n        FocusWindow(window);\n        if (tab_focus_requested || g.IO.KeyCtrl || g.IO.MouseDoubleClicked[0])\n        {\n            start_text_input = true;\n            g.ScalarAsInputTextId = 0;\n        }\n    }\n    if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))\n        return InputScalarAsWidgetReplacement(frame_bb, label, ImGuiDataType_Float, v, id, decimal_precision);\n\n    // Actual drag behavior\n    ItemSize(total_bb, style.FramePadding.y);\n    const bool value_changed = DragBehavior(frame_bb, id, v, v_speed, v_min, v_max, decimal_precision, power);\n\n    // Display value using user-provided display format so user can add prefix/suffix/decorations to the value.\n    char value_buf[64];\n    const char* value_buf_end = value_buf + ImFormatString(value_buf, IM_ARRAYSIZE(value_buf), display_format, *v);\n    RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.5f));\n\n    if (label_size.x > 0.0f)\n        RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label);\n\n    return value_changed;\n}\n\nbool ImGui::DragFloatN(const char* label, float* v, int components, float v_speed, float v_min, float v_max, const char* display_format, float power)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    bool value_changed = false;\n    BeginGroup();\n    PushID(label);\n    PushMultiItemsWidths(components);\n    for (int i = 0; i < components; i++)\n    {\n        PushID(i);\n        value_changed |= DragFloat(\"##v\", &v[i], v_speed, v_min, v_max, display_format, power);\n        SameLine(0, g.Style.ItemInnerSpacing.x);\n        PopID();\n        PopItemWidth();\n    }\n    PopID();\n\n    TextUnformatted(label, FindRenderedTextEnd(label));\n    EndGroup();\n\n    return value_changed;\n}\n\nbool ImGui::DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* display_format, float power)\n{\n    return DragFloatN(label, v, 2, v_speed, v_min, v_max, display_format, power);\n}\n\nbool ImGui::DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* display_format, float power)\n{\n    return DragFloatN(label, v, 3, v_speed, v_min, v_max, display_format, power);\n}\n\nbool ImGui::DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* display_format, float power)\n{\n    return DragFloatN(label, v, 4, v_speed, v_min, v_max, display_format, power);\n}\n\nbool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed, float v_min, float v_max, const char* display_format, const char* display_format_max, float power)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    PushID(label);\n    BeginGroup();\n    PushMultiItemsWidths(2);\n\n    bool value_changed = DragFloat(\"##min\", v_current_min, v_speed, (v_min >= v_max) ? -FLT_MAX : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), display_format, power);\n    PopItemWidth();\n    SameLine(0, g.Style.ItemInnerSpacing.x);\n    value_changed |= DragFloat(\"##max\", v_current_max, v_speed, (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min), (v_min >= v_max) ? FLT_MAX : v_max, display_format_max ? display_format_max : display_format, power);\n    PopItemWidth();\n    SameLine(0, g.Style.ItemInnerSpacing.x);\n\n    TextUnformatted(label, FindRenderedTextEnd(label));\n    EndGroup();\n    PopID();\n\n    return value_changed;\n}\n\n// NB: v_speed is float to allow adjusting the drag speed with more precision\nbool ImGui::DragInt(const char* label, int* v, float v_speed, int v_min, int v_max, const char* display_format)\n{\n    if (!display_format)\n        display_format = \"%.0f\";\n    float v_f = (float)*v;\n    bool value_changed = DragFloat(label, &v_f, v_speed, (float)v_min, (float)v_max, display_format);\n    *v = (int)v_f;\n    return value_changed;\n}\n\nbool ImGui::DragIntN(const char* label, int* v, int components, float v_speed, int v_min, int v_max, const char* display_format)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    bool value_changed = false;\n    BeginGroup();\n    PushID(label);\n    PushMultiItemsWidths(components);\n    for (int i = 0; i < components; i++)\n    {\n        PushID(i);\n        value_changed |= DragInt(\"##v\", &v[i], v_speed, v_min, v_max, display_format);\n        SameLine(0, g.Style.ItemInnerSpacing.x);\n        PopID();\n        PopItemWidth();\n    }\n    PopID();\n\n    TextUnformatted(label, FindRenderedTextEnd(label));\n    EndGroup();\n\n    return value_changed;\n}\n\nbool ImGui::DragInt2(const char* label, int v[2], float v_speed, int v_min, int v_max, const char* display_format)\n{\n    return DragIntN(label, v, 2, v_speed, v_min, v_max, display_format);\n}\n\nbool ImGui::DragInt3(const char* label, int v[3], float v_speed, int v_min, int v_max, const char* display_format)\n{\n    return DragIntN(label, v, 3, v_speed, v_min, v_max, display_format);\n}\n\nbool ImGui::DragInt4(const char* label, int v[4], float v_speed, int v_min, int v_max, const char* display_format)\n{\n    return DragIntN(label, v, 4, v_speed, v_min, v_max, display_format);\n}\n\nbool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed, int v_min, int v_max, const char* display_format, const char* display_format_max)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    PushID(label);\n    BeginGroup();\n    PushMultiItemsWidths(2);\n\n    bool value_changed = DragInt(\"##min\", v_current_min, v_speed, (v_min >= v_max) ? INT_MIN : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), display_format);\n    PopItemWidth();\n    SameLine(0, g.Style.ItemInnerSpacing.x);\n    value_changed |= DragInt(\"##max\", v_current_max, v_speed, (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min), (v_min >= v_max) ? INT_MAX : v_max, display_format_max ? display_format_max : display_format);\n    PopItemWidth();\n    SameLine(0, g.Style.ItemInnerSpacing.x);\n\n    TextUnformatted(label, FindRenderedTextEnd(label));\n    EndGroup();\n    PopID();\n\n    return value_changed;\n}\n\nvoid ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n    if (graph_size.x == 0.0f)\n        graph_size.x = CalcItemWidth();\n    if (graph_size.y == 0.0f)\n        graph_size.y = label_size.y + (style.FramePadding.y * 2);\n\n    const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(graph_size.x, graph_size.y));\n    const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding);\n    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0));\n    ItemSize(total_bb, style.FramePadding.y);\n    if (!ItemAdd(total_bb, 0))\n        return;\n    const bool hovered = ItemHoverable(inner_bb, 0);\n\n    // Determine scale from values if not specified\n    if (scale_min == FLT_MAX || scale_max == FLT_MAX)\n    {\n        float v_min = FLT_MAX;\n        float v_max = -FLT_MAX;\n        for (int i = 0; i < values_count; i++)\n        {\n            const float v = values_getter(data, i);\n            v_min = ImMin(v_min, v);\n            v_max = ImMax(v_max, v);\n        }\n        if (scale_min == FLT_MAX)\n            scale_min = v_min;\n        if (scale_max == FLT_MAX)\n            scale_max = v_max;\n    }\n\n    RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);\n\n    if (values_count > 0)\n    {\n        int res_w = ImMin((int)graph_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0);\n        int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0);\n\n        // Tooltip on hover\n        int v_hovered = -1;\n        if (hovered)\n        {\n            const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f);\n            const int v_idx = (int)(t * item_count);\n            IM_ASSERT(v_idx >= 0 && v_idx < values_count);\n\n            const float v0 = values_getter(data, (v_idx + values_offset) % values_count);\n            const float v1 = values_getter(data, (v_idx + 1 + values_offset) % values_count);\n            if (plot_type == ImGuiPlotType_Lines)\n                SetTooltip(\"%d: %8.4g\\n%d: %8.4g\", v_idx, v0, v_idx+1, v1);\n            else if (plot_type == ImGuiPlotType_Histogram)\n                SetTooltip(\"%d: %8.4g\", v_idx, v0);\n            v_hovered = v_idx;\n        }\n\n        const float t_step = 1.0f / (float)res_w;\n\n        float v0 = values_getter(data, (0 + values_offset) % values_count);\n        float t0 = 0.0f;\n        ImVec2 tp0 = ImVec2( t0, 1.0f - ImSaturate((v0 - scale_min) / (scale_max - scale_min)) );                       // Point in the normalized space of our target rectangle\n        float histogram_zero_line_t = (scale_min * scale_max < 0.0f) ? (-scale_min / (scale_max - scale_min)) : (scale_min < 0.0f ? 0.0f : 1.0f);   // Where does the zero line stands\n\n        const ImU32 col_base = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram);\n        const ImU32 col_hovered = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered);\n\n        for (int n = 0; n < res_w; n++)\n        {\n            const float t1 = t0 + t_step;\n            const int v1_idx = (int)(t0 * item_count + 0.5f);\n            IM_ASSERT(v1_idx >= 0 && v1_idx < values_count);\n            const float v1 = values_getter(data, (v1_idx + values_offset + 1) % values_count);\n            const ImVec2 tp1 = ImVec2( t1, 1.0f - ImSaturate((v1 - scale_min) / (scale_max - scale_min)) );\n\n            // NB: Draw calls are merged together by the DrawList system. Still, we should render our batch are lower level to save a bit of CPU.\n            ImVec2 pos0 = ImLerp(inner_bb.Min, inner_bb.Max, tp0);\n            ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t));\n            if (plot_type == ImGuiPlotType_Lines)\n            {\n                window->DrawList->AddLine(pos0, pos1, v_hovered == v1_idx ? col_hovered : col_base);\n            }\n            else if (plot_type == ImGuiPlotType_Histogram)\n            {\n                if (pos1.x >= pos0.x + 2.0f)\n                    pos1.x -= 1.0f;\n                window->DrawList->AddRectFilled(pos0, pos1, v_hovered == v1_idx ? col_hovered : col_base);\n            }\n\n            t0 = t1;\n            tp0 = tp1;\n        }\n    }\n\n    // Text overlay\n    if (overlay_text)\n        RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, overlay_text, NULL, NULL, ImVec2(0.5f,0.0f));\n\n    if (label_size.x > 0.0f)\n        RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label);\n}\n\nstruct ImGuiPlotArrayGetterData\n{\n    const float* Values;\n    int Stride;\n\n    ImGuiPlotArrayGetterData(const float* values, int stride) { Values = values; Stride = stride; }\n};\n\nstatic float Plot_ArrayGetter(void* data, int idx)\n{\n    ImGuiPlotArrayGetterData* plot_data = (ImGuiPlotArrayGetterData*)data;\n    const float v = *(float*)(void*)((unsigned char*)plot_data->Values + (size_t)idx * plot_data->Stride);\n    return v;\n}\n\nvoid ImGui::PlotLines(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride)\n{\n    ImGuiPlotArrayGetterData data(values, stride);\n    PlotEx(ImGuiPlotType_Lines, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size);\n}\n\nvoid ImGui::PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size)\n{\n    PlotEx(ImGuiPlotType_Lines, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size);\n}\n\nvoid ImGui::PlotHistogram(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride)\n{\n    ImGuiPlotArrayGetterData data(values, stride);\n    PlotEx(ImGuiPlotType_Histogram, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size);\n}\n\nvoid ImGui::PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size)\n{\n    PlotEx(ImGuiPlotType_Histogram, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size);\n}\n\n// size_arg (for each axis) < 0.0f: align to end, 0.0f: auto, > 0.0f: specified size\nvoid ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* overlay)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n\n    ImVec2 pos = window->DC.CursorPos;\n    ImRect bb(pos, pos + CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y*2.0f));\n    ItemSize(bb, style.FramePadding.y);\n    if (!ItemAdd(bb, 0))\n        return;\n\n    // Render\n    fraction = ImSaturate(fraction);\n    RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);\n    bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize));\n    const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y);\n    RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding);\n\n    // Default displaying the fraction as percentage string, but user can override it\n    char overlay_buf[32];\n    if (!overlay)\n    {\n        ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), \"%.0f%%\", fraction*100+0.01f);\n        overlay = overlay_buf;\n    }\n\n    ImVec2 overlay_size = CalcTextSize(overlay, NULL);\n    if (overlay_size.x > 0.0f)\n        RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f,0.5f), &bb);\n}\n\nbool ImGui::Checkbox(const char* label, bool* v)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(label);\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n\n    const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.y*2, label_size.y + style.FramePadding.y*2)); // We want a square shape to we use Y twice\n    ItemSize(check_bb, style.FramePadding.y);\n\n    ImRect total_bb = check_bb;\n    if (label_size.x > 0)\n        SameLine(0, style.ItemInnerSpacing.x);\n    const ImRect text_bb(window->DC.CursorPos + ImVec2(0,style.FramePadding.y), window->DC.CursorPos + ImVec2(0,style.FramePadding.y) + label_size);\n    if (label_size.x > 0)\n    {\n        ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y);\n        total_bb = ImRect(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max));\n    }\n\n    if (!ItemAdd(total_bb, id))\n        return false;\n\n    bool hovered, held;\n    bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);\n    if (pressed)\n        *v = !(*v);\n\n    RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);\n    if (*v)\n    {\n        const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());\n        const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));\n        RenderCheckMark(check_bb.Min + ImVec2(pad,pad), GetColorU32(ImGuiCol_CheckMark), check_bb.GetWidth() - pad*2.0f);\n    }\n\n    if (g.LogEnabled)\n        LogRenderedText(&text_bb.Min, *v ? \"[x]\" : \"[ ]\");\n    if (label_size.x > 0.0f)\n        RenderText(text_bb.Min, label);\n\n    return pressed;\n}\n\nbool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value)\n{\n    bool v = ((*flags & flags_value) == flags_value);\n    bool pressed = Checkbox(label, &v);\n    if (pressed)\n    {\n        if (v)\n            *flags |= flags_value;\n        else\n            *flags &= ~flags_value;\n    }\n\n    return pressed;\n}\n\nbool ImGui::RadioButton(const char* label, bool active)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(label);\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n\n    const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.y*2-1, label_size.y + style.FramePadding.y*2-1));\n    ItemSize(check_bb, style.FramePadding.y);\n\n    ImRect total_bb = check_bb;\n    if (label_size.x > 0)\n        SameLine(0, style.ItemInnerSpacing.x);\n    const ImRect text_bb(window->DC.CursorPos + ImVec2(0, style.FramePadding.y), window->DC.CursorPos + ImVec2(0, style.FramePadding.y) + label_size);\n    if (label_size.x > 0)\n    {\n        ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y);\n        total_bb.Add(text_bb);\n    }\n\n    if (!ItemAdd(total_bb, id))\n        return false;\n\n    ImVec2 center = check_bb.GetCenter();\n    center.x = (float)(int)center.x + 0.5f;\n    center.y = (float)(int)center.y + 0.5f;\n    const float radius = check_bb.GetHeight() * 0.5f;\n\n    bool hovered, held;\n    bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);\n\n    window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16);\n    if (active)\n    {\n        const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());\n        const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));\n        window->DrawList->AddCircleFilled(center, radius-pad, GetColorU32(ImGuiCol_CheckMark), 16);\n    }\n\n    if (style.FrameBorderSize > 0.0f)\n    {\n        window->DrawList->AddCircle(center+ImVec2(1,1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize);\n        window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize);\n    }\n\n    if (g.LogEnabled)\n        LogRenderedText(&text_bb.Min, active ? \"(x)\" : \"( )\");\n    if (label_size.x > 0.0f)\n        RenderText(text_bb.Min, label);\n\n    return pressed;\n}\n\nbool ImGui::RadioButton(const char* label, int* v, int v_button)\n{\n    const bool pressed = RadioButton(label, *v == v_button);\n    if (pressed)\n    {\n        *v = v_button;\n    }\n    return pressed;\n}\n\nstatic int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end)\n{\n    int line_count = 0;\n    const char* s = text_begin;\n    while (char c = *s++) // We are only matching for \\n so we can ignore UTF-8 decoding\n        if (c == '\\n')\n            line_count++;\n    s--;\n    if (s[0] != '\\n' && s[0] != '\\r')\n        line_count++;\n    *out_text_end = s;\n    return line_count;\n}\n\nstatic ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset, bool stop_on_new_line)\n{\n    ImFont* font = GImGui->Font;\n    const float line_height = GImGui->FontSize;\n    const float scale = line_height / font->FontSize;\n\n    ImVec2 text_size = ImVec2(0,0);\n    float line_width = 0.0f;\n\n    const ImWchar* s = text_begin;\n    while (s < text_end)\n    {\n        unsigned int c = (unsigned int)(*s++);\n        if (c == '\\n')\n        {\n            text_size.x = ImMax(text_size.x, line_width);\n            text_size.y += line_height;\n            line_width = 0.0f;\n            if (stop_on_new_line)\n                break;\n            continue;\n        }\n        if (c == '\\r')\n            continue;\n\n        const float char_width = font->GetCharAdvance((unsigned short)c) * scale;\n        line_width += char_width;\n    }\n\n    if (text_size.x < line_width)\n        text_size.x = line_width;\n\n    if (out_offset)\n        *out_offset = ImVec2(line_width, text_size.y + line_height);  // offset allow for the possibility of sitting after a trailing \\n\n\n    if (line_width > 0 || text_size.y == 0.0f)                        // whereas size.y will ignore the trailing \\n\n        text_size.y += line_height;\n\n    if (remaining)\n        *remaining = s;\n\n    return text_size;\n}\n\n// Wrapper for stb_textedit.h to edit text (our wrapper is for: statically sized buffer, single-line, wchar characters. InputText converts between UTF-8 and wchar)\nnamespace ImGuiStb\n{\n\nstatic int     STB_TEXTEDIT_STRINGLEN(const STB_TEXTEDIT_STRING* obj)                             { return obj->CurLenW; }\nstatic ImWchar STB_TEXTEDIT_GETCHAR(const STB_TEXTEDIT_STRING* obj, int idx)                      { return obj->Text[idx]; }\nstatic float   STB_TEXTEDIT_GETWIDTH(STB_TEXTEDIT_STRING* obj, int line_start_idx, int char_idx)  { ImWchar c = obj->Text[line_start_idx+char_idx]; if (c == '\\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; return GImGui->Font->GetCharAdvance(c) * (GImGui->FontSize / GImGui->Font->FontSize); }\nstatic int     STB_TEXTEDIT_KEYTOTEXT(int key)                                                    { return key >= 0x10000 ? 0 : key; }\nstatic ImWchar STB_TEXTEDIT_NEWLINE = '\\n';\nstatic void    STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* obj, int line_start_idx)\n{\n    const ImWchar* text = obj->Text.Data;\n    const ImWchar* text_remaining = NULL;\n    const ImVec2 size = InputTextCalcTextSizeW(text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true);\n    r->x0 = 0.0f;\n    r->x1 = size.x;\n    r->baseline_y_delta = size.y;\n    r->ymin = 0.0f;\n    r->ymax = size.y;\n    r->num_chars = (int)(text_remaining - (text + line_start_idx));\n}\n\nstatic bool is_separator(unsigned int c)                                        { return ImCharIsSpace(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|'; }\nstatic int  is_word_boundary_from_right(STB_TEXTEDIT_STRING* obj, int idx)      { return idx > 0 ? (is_separator( obj->Text[idx-1] ) && !is_separator( obj->Text[idx] ) ) : 1; }\nstatic int  STB_TEXTEDIT_MOVEWORDLEFT_IMPL(STB_TEXTEDIT_STRING* obj, int idx)   { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; }\n#ifdef __APPLE__    // FIXME: Move setting to IO structure\nstatic int  is_word_boundary_from_left(STB_TEXTEDIT_STRING* obj, int idx)       { return idx > 0 ? (!is_separator( obj->Text[idx-1] ) && is_separator( obj->Text[idx] ) ) : 1; }\nstatic int  STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(STB_TEXTEDIT_STRING* obj, int idx)  { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; }\n#else\nstatic int  STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(STB_TEXTEDIT_STRING* obj, int idx)  { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; }\n#endif\n#define STB_TEXTEDIT_MOVEWORDLEFT   STB_TEXTEDIT_MOVEWORDLEFT_IMPL    // They need to be #define for stb_textedit.h\n#define STB_TEXTEDIT_MOVEWORDRIGHT  STB_TEXTEDIT_MOVEWORDRIGHT_IMPL\n\nstatic void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int pos, int n)\n{\n    ImWchar* dst = obj->Text.Data + pos;\n\n    // We maintain our buffer length in both UTF-8 and wchar formats\n    obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n);\n    obj->CurLenW -= n;\n\n    // Offset remaining text\n    const ImWchar* src = obj->Text.Data + pos + n;\n    while (ImWchar c = *src++)\n        *dst++ = c;\n    *dst = '\\0';\n}\n\nstatic bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const ImWchar* new_text, int new_text_len)\n{\n    const int text_len = obj->CurLenW;\n    IM_ASSERT(pos <= text_len);\n    if (new_text_len + text_len + 1 > obj->Text.Size)\n        return false;\n\n    const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len);\n    if (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufSizeA)\n        return false;\n\n    ImWchar* text = obj->Text.Data;\n    if (pos != text_len)\n        memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar));\n    memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar));\n\n    obj->CurLenW += new_text_len;\n    obj->CurLenA += new_text_len_utf8;\n    obj->Text[obj->CurLenW] = '\\0';\n\n    return true;\n}\n\n// We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols)\n#define STB_TEXTEDIT_K_LEFT         0x10000 // keyboard input to move cursor left\n#define STB_TEXTEDIT_K_RIGHT        0x10001 // keyboard input to move cursor right\n#define STB_TEXTEDIT_K_UP           0x10002 // keyboard input to move cursor up\n#define STB_TEXTEDIT_K_DOWN         0x10003 // keyboard input to move cursor down\n#define STB_TEXTEDIT_K_LINESTART    0x10004 // keyboard input to move cursor to start of line\n#define STB_TEXTEDIT_K_LINEEND      0x10005 // keyboard input to move cursor to end of line\n#define STB_TEXTEDIT_K_TEXTSTART    0x10006 // keyboard input to move cursor to start of text\n#define STB_TEXTEDIT_K_TEXTEND      0x10007 // keyboard input to move cursor to end of text\n#define STB_TEXTEDIT_K_DELETE       0x10008 // keyboard input to delete selection or character under cursor\n#define STB_TEXTEDIT_K_BACKSPACE    0x10009 // keyboard input to delete selection or character left of cursor\n#define STB_TEXTEDIT_K_UNDO         0x1000A // keyboard input to perform undo\n#define STB_TEXTEDIT_K_REDO         0x1000B // keyboard input to perform redo\n#define STB_TEXTEDIT_K_WORDLEFT     0x1000C // keyboard input to move cursor left one word\n#define STB_TEXTEDIT_K_WORDRIGHT    0x1000D // keyboard input to move cursor right one word\n#define STB_TEXTEDIT_K_SHIFT        0x20000\n\n#define STB_TEXTEDIT_IMPLEMENTATION\n#include \"stb_textedit.h\"\n\n}\n\nvoid ImGuiTextEditState::OnKeyPressed(int key)\n{\n    stb_textedit_key(this, &StbState, key);\n    CursorFollow = true;\n    CursorAnimReset();\n}\n\n// Public API to manipulate UTF-8 text\n// We expose UTF-8 to the user (unlike the STB_TEXTEDIT_* functions which are manipulating wchar)\n// FIXME: The existence of this rarely exercised code path is a bit of a nuisance.\nvoid ImGuiTextEditCallbackData::DeleteChars(int pos, int bytes_count)\n{\n    IM_ASSERT(pos + bytes_count <= BufTextLen);\n    char* dst = Buf + pos;\n    const char* src = Buf + pos + bytes_count;\n    while (char c = *src++)\n        *dst++ = c;\n    *dst = '\\0';\n\n    if (CursorPos + bytes_count >= pos)\n        CursorPos -= bytes_count;\n    else if (CursorPos >= pos)\n        CursorPos = pos;\n    SelectionStart = SelectionEnd = CursorPos;\n    BufDirty = true;\n    BufTextLen -= bytes_count;\n}\n\nvoid ImGuiTextEditCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end)\n{\n    const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)strlen(new_text);\n    if (new_text_len + BufTextLen + 1 >= BufSize)\n        return;\n\n    if (BufTextLen != pos)\n        memmove(Buf + pos + new_text_len, Buf + pos, (size_t)(BufTextLen - pos));\n    memcpy(Buf + pos, new_text, (size_t)new_text_len * sizeof(char));\n    Buf[BufTextLen + new_text_len] = '\\0';\n\n    if (CursorPos >= pos)\n        CursorPos += new_text_len;\n    SelectionStart = SelectionEnd = CursorPos;\n    BufDirty = true;\n    BufTextLen += new_text_len;\n}\n\n// Return false to discard a character.\nstatic bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data)\n{\n    unsigned int c = *p_char;\n\n    if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF)))\n    {\n        bool pass = false;\n        pass |= (c == '\\n' && (flags & ImGuiInputTextFlags_Multiline));\n        pass |= (c == '\\t' && (flags & ImGuiInputTextFlags_AllowTabInput));\n        if (!pass)\n            return false;\n    }\n\n    if (c >= 0xE000 && c <= 0xF8FF) // Filter private Unicode range. I don't imagine anybody would want to input them. GLFW on OSX seems to send private characters for special keys like arrow keys.\n        return false;\n\n    if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank))\n    {\n        if (flags & ImGuiInputTextFlags_CharsDecimal)\n            if (!(c >= '0' && c <= '9') && (c != '.') && (c != '-') && (c != '+') && (c != '*') && (c != '/'))\n                return false;\n\n        if (flags & ImGuiInputTextFlags_CharsHexadecimal)\n            if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F'))\n                return false;\n\n        if (flags & ImGuiInputTextFlags_CharsUppercase)\n            if (c >= 'a' && c <= 'z')\n                *p_char = (c += (unsigned int)('A'-'a'));\n\n        if (flags & ImGuiInputTextFlags_CharsNoBlank)\n            if (ImCharIsSpace(c))\n                return false;\n    }\n\n    if (flags & ImGuiInputTextFlags_CallbackCharFilter)\n    {\n        ImGuiTextEditCallbackData callback_data;\n        memset(&callback_data, 0, sizeof(ImGuiTextEditCallbackData));\n        callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter;\n        callback_data.EventChar = (ImWchar)c;\n        callback_data.Flags = flags;\n        callback_data.UserData = user_data;\n        if (callback(&callback_data) != 0)\n            return false;\n        *p_char = callback_data.EventChar;\n        if (!callback_data.EventChar)\n            return false;\n    }\n\n    return true;\n}\n\n// Edit a string of text\n// NB: when active, hold on a privately held copy of the text (and apply back to 'buf'). So changing 'buf' while active has no effect.\n// FIXME: Rather messy function partly because we are doing UTF8 > u16 > UTF8 conversions on the go to more easily handle stb_textedit calls. Ideally we should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188\nbool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackHistory) && (flags & ImGuiInputTextFlags_Multiline))); // Can't use both together (they both use up/down keys)\n    IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackCompletion) && (flags & ImGuiInputTextFlags_AllowTabInput))); // Can't use both together (they both use tab key)\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiIO& io = g.IO;\n    const ImGuiStyle& style = g.Style;\n\n    const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0;\n    const bool is_editable = (flags & ImGuiInputTextFlags_ReadOnly) == 0;\n    const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0;\n\n    if (is_multiline) // Open group before calling GetID() because groups tracks id created during their spawn\n        BeginGroup();\n    const ImGuiID id = window->GetID(label);\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n    ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? GetTextLineHeight() * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line\n    const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size);\n    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? (style.ItemInnerSpacing.x + label_size.x) : 0.0f, 0.0f));\n\n    ImGuiWindow* draw_window = window;\n    if (is_multiline)\n    {\n        if (!BeginChildFrame(id, frame_bb.GetSize()))\n        {\n            EndChildFrame();\n            EndGroup();\n            return false;\n        }\n        draw_window = GetCurrentWindow();\n        size.x -= draw_window->ScrollbarSizes.x;\n    }\n    else\n    {\n        ItemSize(total_bb, style.FramePadding.y);\n        if (!ItemAdd(total_bb, id))\n            return false;\n    }\n    const bool hovered = ItemHoverable(frame_bb, id);\n    if (hovered)\n        g.MouseCursor = ImGuiMouseCursor_TextInput;\n\n    // Password pushes a temporary font with only a fallback glyph\n    if (is_password)\n    {\n        const ImFontGlyph* glyph = g.Font->FindGlyph('*');\n        ImFont* password_font = &g.InputTextPasswordFont;\n        password_font->FontSize = g.Font->FontSize;\n        password_font->Scale = g.Font->Scale;\n        password_font->DisplayOffset = g.Font->DisplayOffset;\n        password_font->Ascent = g.Font->Ascent;\n        password_font->Descent = g.Font->Descent;\n        password_font->ContainerAtlas = g.Font->ContainerAtlas;\n        password_font->FallbackGlyph = glyph;\n        password_font->FallbackAdvanceX = glyph->AdvanceX;\n        IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexAdvanceX.empty() && password_font->IndexLookup.empty());\n        PushFont(password_font);\n    }\n\n    // NB: we are only allowed to access 'edit_state' if we are the active widget.\n    ImGuiTextEditState& edit_state = g.InputTextState;\n\n    const bool focus_requested = FocusableItemRegister(window, id, (flags & (ImGuiInputTextFlags_CallbackCompletion|ImGuiInputTextFlags_AllowTabInput)) == 0);    // Using completion callback disable keyboard tabbing\n    const bool focus_requested_by_code = focus_requested && (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent);\n    const bool focus_requested_by_tab = focus_requested && !focus_requested_by_code;\n\n    const bool user_clicked = hovered && io.MouseClicked[0];\n    const bool user_scrolled = is_multiline && g.ActiveId == 0 && edit_state.Id == id && g.ActiveIdPreviousFrame == draw_window->GetIDNoKeepAlive(\"#SCROLLY\");\n\n    bool clear_active_id = false;\n\n    bool select_all = (g.ActiveId != id) && (flags & ImGuiInputTextFlags_AutoSelectAll) != 0;\n    if (focus_requested || user_clicked || user_scrolled)\n    {\n        if (g.ActiveId != id)\n        {\n            // Start edition\n            // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar)\n            // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode)\n            const int prev_len_w = edit_state.CurLenW;\n            edit_state.Text.resize(buf_size+1);        // wchar count <= UTF-8 count. we use +1 to make sure that .Data isn't NULL so it doesn't crash.\n            edit_state.InitialText.resize(buf_size+1); // UTF-8. we use +1 to make sure that .Data isn't NULL so it doesn't crash.\n            ImStrncpy(edit_state.InitialText.Data, buf, edit_state.InitialText.Size);\n            const char* buf_end = NULL;\n            edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, buf, NULL, &buf_end);\n            edit_state.CurLenA = (int)(buf_end - buf); // We can't get the result from ImFormatString() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8.\n            edit_state.CursorAnimReset();\n\n            // Preserve cursor position and undo/redo stack if we come back to same widget\n            // FIXME: We should probably compare the whole buffer to be on the safety side. Comparing buf (utf8) and edit_state.Text (wchar).\n            const bool recycle_state = (edit_state.Id == id) && (prev_len_w == edit_state.CurLenW);\n            if (recycle_state)\n            {\n                // Recycle existing cursor/selection/undo stack but clamp position\n                // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler.\n                edit_state.CursorClamp();\n            }\n            else\n            {\n                edit_state.Id = id;\n                edit_state.ScrollX = 0.0f;\n                stb_textedit_initialize_state(&edit_state.StbState, !is_multiline);\n                if (!is_multiline && focus_requested_by_code)\n                    select_all = true;\n            }\n            if (flags & ImGuiInputTextFlags_AlwaysInsertMode)\n                edit_state.StbState.insert_mode = true;\n            if (!is_multiline && (focus_requested_by_tab || (user_clicked && io.KeyCtrl)))\n                select_all = true;\n        }\n        SetActiveID(id, window);\n        FocusWindow(window);\n    }\n    else if (io.MouseClicked[0])\n    {\n        // Release focus when we click outside\n        clear_active_id = true;\n    }\n\n    bool value_changed = false;\n    bool enter_pressed = false;\n\n    if (g.ActiveId == id)\n    {\n        if (!is_editable && !g.ActiveIdIsJustActivated)\n        {\n            // When read-only we always use the live data passed to the function\n            edit_state.Text.resize(buf_size+1);\n            const char* buf_end = NULL;\n            edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, buf, NULL, &buf_end);\n            edit_state.CurLenA = (int)(buf_end - buf);\n            edit_state.CursorClamp();\n        }\n\n        edit_state.BufSizeA = buf_size;\n\n        // Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget.\n        // Down the line we should have a cleaner library-wide concept of Selected vs Active.\n        g.ActiveIdAllowOverlap = !io.MouseDown[0];\n        g.WantTextInputNextFrame = 1;\n\n        // Edit in progress\n        const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + edit_state.ScrollX;\n        const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y - style.FramePadding.y) : (g.FontSize*0.5f));\n\n        const bool osx_double_click_selects_words = io.OptMacOSXBehaviors;      // OS X style: Double click selects by word instead of selecting whole text\n        if (select_all || (hovered && !osx_double_click_selects_words && io.MouseDoubleClicked[0]))\n        {\n            edit_state.SelectAll();\n            edit_state.SelectedAllMouseLock = true;\n        }\n        else if (hovered && osx_double_click_selects_words && io.MouseDoubleClicked[0])\n        {\n            // Select a word only, OS X style (by simulating keystrokes)\n            edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT);\n            edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT);\n        }\n        else if (io.MouseClicked[0] && !edit_state.SelectedAllMouseLock)\n        {\n            stb_textedit_click(&edit_state, &edit_state.StbState, mouse_x, mouse_y);\n            edit_state.CursorAnimReset();\n        }\n        else if (io.MouseDown[0] && !edit_state.SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f))\n        {\n            stb_textedit_drag(&edit_state, &edit_state.StbState, mouse_x, mouse_y);\n            edit_state.CursorAnimReset();\n            edit_state.CursorFollow = true;\n        }\n        if (edit_state.SelectedAllMouseLock && !io.MouseDown[0])\n            edit_state.SelectedAllMouseLock = false;\n\n        if (io.InputCharacters[0])\n        {\n            // Process text input (before we check for Return because using some IME will effectively send a Return?)\n            // We ignore CTRL inputs, but need to allow CTRL+ALT as some keyboards (e.g. German) use AltGR - which is Alt+Ctrl - to input certain characters.\n            if (!(io.KeyCtrl && !io.KeyAlt) && is_editable)\n            {\n                for (int n = 0; n < IM_ARRAYSIZE(io.InputCharacters) && io.InputCharacters[n]; n++)\n                    if (unsigned int c = (unsigned int)io.InputCharacters[n])\n                    {\n                        // Insert character if they pass filtering\n                        if (!InputTextFilterCharacter(&c, flags, callback, user_data))\n                            continue;\n                        edit_state.OnKeyPressed((int)c);\n                    }\n            }\n\n            // Consume characters\n            memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters));\n        }\n    }\n\n    bool cancel_edit = false;\n    if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id)\n    {\n        // Handle key-presses\n        const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0);\n        const bool is_shortcut_key_only = (io.OptMacOSXBehaviors ? (io.KeySuper && !io.KeyCtrl) : (io.KeyCtrl && !io.KeySuper)) && !io.KeyAlt && !io.KeyShift; // OS X style: Shortcuts using Cmd/Super instead of Ctrl\n        const bool is_wordmove_key_down = io.OptMacOSXBehaviors ? io.KeyAlt : io.KeyCtrl;                     // OS X style: Text editing cursor movement using Alt instead of Ctrl\n        const bool is_startend_key_down = io.OptMacOSXBehaviors && io.KeySuper && !io.KeyCtrl && !io.KeyAlt;  // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End\n\n        if (IsKeyPressedMap(ImGuiKey_LeftArrow))                        { edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); }\n        else if (IsKeyPressedMap(ImGuiKey_RightArrow))                  { edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); }\n        else if (IsKeyPressedMap(ImGuiKey_UpArrow) && is_multiline)     { if (io.KeyCtrl) SetWindowScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); }\n        else if (IsKeyPressedMap(ImGuiKey_DownArrow) && is_multiline)   { if (io.KeyCtrl) SetWindowScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); }\n        else if (IsKeyPressedMap(ImGuiKey_Home))                        { edit_state.OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); }\n        else if (IsKeyPressedMap(ImGuiKey_End))                         { edit_state.OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); }\n        else if (IsKeyPressedMap(ImGuiKey_Delete) && is_editable)       { edit_state.OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); }\n        else if (IsKeyPressedMap(ImGuiKey_Backspace) && is_editable)\n        {\n            if (!edit_state.HasSelection())\n            {\n                if (is_wordmove_key_down) edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT|STB_TEXTEDIT_K_SHIFT);\n                else if (io.OptMacOSXBehaviors && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) edit_state.OnKeyPressed(STB_TEXTEDIT_K_LINESTART|STB_TEXTEDIT_K_SHIFT);\n            }\n            edit_state.OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask);\n        }\n        else if (IsKeyPressedMap(ImGuiKey_Enter))\n        {\n            bool ctrl_enter_for_new_line = (flags & ImGuiInputTextFlags_CtrlEnterForNewLine) != 0;\n            if (!is_multiline || (ctrl_enter_for_new_line && !io.KeyCtrl) || (!ctrl_enter_for_new_line && io.KeyCtrl))\n            {\n                enter_pressed = clear_active_id = true;\n            }\n            else if (is_editable)\n            {\n                unsigned int c = '\\n'; // Insert new line\n                if (InputTextFilterCharacter(&c, flags, callback, user_data))\n                    edit_state.OnKeyPressed((int)c);\n            }\n        }\n        else if ((flags & ImGuiInputTextFlags_AllowTabInput) && IsKeyPressedMap(ImGuiKey_Tab) && !io.KeyCtrl && !io.KeyShift && !io.KeyAlt && is_editable)\n        {\n            unsigned int c = '\\t'; // Insert TAB\n            if (InputTextFilterCharacter(&c, flags, callback, user_data))\n                edit_state.OnKeyPressed((int)c);\n        }\n        else if (IsKeyPressedMap(ImGuiKey_Escape))                                      { clear_active_id = cancel_edit = true; }\n        else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_Z) && is_editable)    { edit_state.OnKeyPressed(STB_TEXTEDIT_K_UNDO); edit_state.ClearSelection(); }\n        else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_Y) && is_editable)    { edit_state.OnKeyPressed(STB_TEXTEDIT_K_REDO); edit_state.ClearSelection(); }\n        else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_A))                   { edit_state.SelectAll(); edit_state.CursorFollow = true; }\n        else if (is_shortcut_key_only && !is_password && ((IsKeyPressedMap(ImGuiKey_X) && is_editable) || IsKeyPressedMap(ImGuiKey_C)) && (!is_multiline || edit_state.HasSelection()))\n        {\n            // Cut, Copy\n            const bool cut = IsKeyPressedMap(ImGuiKey_X);\n            if (cut && !edit_state.HasSelection())\n                edit_state.SelectAll();\n\n            if (io.SetClipboardTextFn)\n            {\n                const int ib = edit_state.HasSelection() ? ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end) : 0;\n                const int ie = edit_state.HasSelection() ? ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end) : edit_state.CurLenW;\n                edit_state.TempTextBuffer.resize((ie-ib) * 4 + 1);\n                ImTextStrToUtf8(edit_state.TempTextBuffer.Data, edit_state.TempTextBuffer.Size, edit_state.Text.Data+ib, edit_state.Text.Data+ie);\n                SetClipboardText(edit_state.TempTextBuffer.Data);\n            }\n\n            if (cut)\n            {\n                edit_state.CursorFollow = true;\n                stb_textedit_cut(&edit_state, &edit_state.StbState);\n            }\n        }\n        else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_V) && is_editable)\n        {\n            // Paste\n            if (const char* clipboard = GetClipboardText())\n            {\n                // Filter pasted buffer\n                const int clipboard_len = (int)strlen(clipboard);\n                ImWchar* clipboard_filtered = (ImWchar*)ImGui::MemAlloc((clipboard_len+1) * sizeof(ImWchar));\n                int clipboard_filtered_len = 0;\n                for (const char* s = clipboard; *s; )\n                {\n                    unsigned int c;\n                    s += ImTextCharFromUtf8(&c, s, NULL);\n                    if (c == 0)\n                        break;\n                    if (c >= 0x10000 || !InputTextFilterCharacter(&c, flags, callback, user_data))\n                        continue;\n                    clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c;\n                }\n                clipboard_filtered[clipboard_filtered_len] = 0;\n                if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation\n                {\n                    stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len);\n                    edit_state.CursorFollow = true;\n                }\n                ImGui::MemFree(clipboard_filtered);\n            }\n        }\n    }\n\n    if (g.ActiveId == id)\n    {\n        if (cancel_edit)\n        {\n            // Restore initial value\n            if (is_editable)\n            {\n                ImStrncpy(buf, edit_state.InitialText.Data, buf_size);\n                value_changed = true;\n            }\n        }\n\n        // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame.\n        // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. Also this allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage.\n        bool apply_edit_back_to_user_buffer = !cancel_edit || (enter_pressed && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0);\n        if (apply_edit_back_to_user_buffer)\n        {\n            // Apply new value immediately - copy modified buffer back\n            // Note that as soon as the input box is active, the in-widget value gets priority over any underlying modification of the input buffer\n            // FIXME: We actually always render 'buf' when calling DrawList->AddText, making the comment above incorrect.\n            // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks.\n            if (is_editable)\n            {\n                edit_state.TempTextBuffer.resize(edit_state.Text.Size * 4);\n                ImTextStrToUtf8(edit_state.TempTextBuffer.Data, edit_state.TempTextBuffer.Size, edit_state.Text.Data, NULL);\n            }\n\n            // User callback\n            if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackAlways)) != 0)\n            {\n                IM_ASSERT(callback != NULL);\n\n                // The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment.\n                ImGuiInputTextFlags event_flag = 0;\n                ImGuiKey event_key = ImGuiKey_COUNT;\n                if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && IsKeyPressedMap(ImGuiKey_Tab))\n                {\n                    event_flag = ImGuiInputTextFlags_CallbackCompletion;\n                    event_key = ImGuiKey_Tab;\n                }\n                else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressedMap(ImGuiKey_UpArrow))\n                {\n                    event_flag = ImGuiInputTextFlags_CallbackHistory;\n                    event_key = ImGuiKey_UpArrow;\n                }\n                else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressedMap(ImGuiKey_DownArrow))\n                {\n                    event_flag = ImGuiInputTextFlags_CallbackHistory;\n                    event_key = ImGuiKey_DownArrow;\n                }\n                else if (flags & ImGuiInputTextFlags_CallbackAlways)\n                    event_flag = ImGuiInputTextFlags_CallbackAlways;\n\n                if (event_flag)\n                {\n                    ImGuiTextEditCallbackData callback_data;\n                    memset(&callback_data, 0, sizeof(ImGuiTextEditCallbackData));\n                    callback_data.EventFlag = event_flag;\n                    callback_data.Flags = flags;\n                    callback_data.UserData = user_data;\n                    callback_data.ReadOnly = !is_editable;\n\n                    callback_data.EventKey = event_key;\n                    callback_data.Buf = edit_state.TempTextBuffer.Data;\n                    callback_data.BufTextLen = edit_state.CurLenA;\n                    callback_data.BufSize = edit_state.BufSizeA;\n                    callback_data.BufDirty = false;\n\n                    // We have to convert from wchar-positions to UTF-8-positions, which can be pretty slow (an incentive to ditch the ImWchar buffer, see https://github.com/nothings/stb/issues/188)\n                    ImWchar* text = edit_state.Text.Data;\n                    const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.cursor);\n                    const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_start);\n                    const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_end);\n\n                    // Call user code\n                    callback(&callback_data);\n\n                    // Read back what user may have modified\n                    IM_ASSERT(callback_data.Buf == edit_state.TempTextBuffer.Data);  // Invalid to modify those fields\n                    IM_ASSERT(callback_data.BufSize == edit_state.BufSizeA);\n                    IM_ASSERT(callback_data.Flags == flags);\n                    if (callback_data.CursorPos != utf8_cursor_pos)            edit_state.StbState.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos);\n                    if (callback_data.SelectionStart != utf8_selection_start)  edit_state.StbState.select_start = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart);\n                    if (callback_data.SelectionEnd != utf8_selection_end)      edit_state.StbState.select_end = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd);\n                    if (callback_data.BufDirty)\n                    {\n                        IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text!\n                        edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, callback_data.Buf, NULL);\n                        edit_state.CurLenA = callback_data.BufTextLen;  // Assume correct length and valid UTF-8 from user, saves us an extra strlen()\n                        edit_state.CursorAnimReset();\n                    }\n                }\n            }\n\n            // Copy back to user buffer\n            if (is_editable && strcmp(edit_state.TempTextBuffer.Data, buf) != 0)\n            {\n                ImStrncpy(buf, edit_state.TempTextBuffer.Data, buf_size);\n                value_changed = true;\n            }\n        }\n    }\n\n    // Release active ID at the end of the function (so e.g. pressing Return still does a final application of the value)\n    if (clear_active_id && g.ActiveId == id)\n        ClearActiveID();\n\n    // Render\n    // Select which buffer we are going to display. When ImGuiInputTextFlags_NoLiveEdit is set 'buf' might still be the old value. We set buf to NULL to prevent accidental usage from now on.\n    const char* buf_display = (g.ActiveId == id && is_editable) ? edit_state.TempTextBuffer.Data : buf; buf = NULL; \n\n    if (!is_multiline)\n        RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);\n\n    const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + size.x, frame_bb.Min.y + size.y); // Not using frame_bb.Max because we have adjusted size\n    ImVec2 render_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding;\n    ImVec2 text_size(0.f, 0.f);\n    const bool is_currently_scrolling = (edit_state.Id == id && is_multiline && g.ActiveId == draw_window->GetIDNoKeepAlive(\"#SCROLLY\"));\n    if (g.ActiveId == id || is_currently_scrolling)\n    {\n        edit_state.CursorAnim += io.DeltaTime;\n\n        // This is going to be messy. We need to:\n        // - Display the text (this alone can be more easily clipped)\n        // - Handle scrolling, highlight selection, display cursor (those all requires some form of 1d->2d cursor position calculation)\n        // - Measure text height (for scrollbar)\n        // We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort)\n        // FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8.\n        const ImWchar* text_begin = edit_state.Text.Data;\n        ImVec2 cursor_offset, select_start_offset;\n\n        {\n            // Count lines + find lines numbers straddling 'cursor' and 'select_start' position.\n            const ImWchar* searches_input_ptr[2];\n            searches_input_ptr[0] = text_begin + edit_state.StbState.cursor;\n            searches_input_ptr[1] = NULL;\n            int searches_remaining = 1;\n            int searches_result_line_number[2] = { -1, -999 };\n            if (edit_state.StbState.select_start != edit_state.StbState.select_end)\n            {\n                searches_input_ptr[1] = text_begin + ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end);\n                searches_result_line_number[1] = -1;\n                searches_remaining++;\n            }\n\n            // Iterate all lines to find our line numbers\n            // In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter.\n            searches_remaining += is_multiline ? 1 : 0;\n            int line_count = 0;\n            for (const ImWchar* s = text_begin; *s != 0; s++)\n                if (*s == '\\n')\n                {\n                    line_count++;\n                    if (searches_result_line_number[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_number[0] = line_count; if (--searches_remaining <= 0) break; }\n                    if (searches_result_line_number[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_number[1] = line_count; if (--searches_remaining <= 0) break; }\n                }\n            line_count++;\n            if (searches_result_line_number[0] == -1) searches_result_line_number[0] = line_count;\n            if (searches_result_line_number[1] == -1) searches_result_line_number[1] = line_count;\n\n            // Calculate 2d position by finding the beginning of the line and measuring distance\n            cursor_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[0], text_begin), searches_input_ptr[0]).x;\n            cursor_offset.y = searches_result_line_number[0] * g.FontSize;\n            if (searches_result_line_number[1] >= 0)\n            {\n                select_start_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[1], text_begin), searches_input_ptr[1]).x;\n                select_start_offset.y = searches_result_line_number[1] * g.FontSize;\n            }\n\n            // Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224)\n            if (is_multiline)\n                text_size = ImVec2(size.x, line_count * g.FontSize);\n        }\n\n        // Scroll\n        if (edit_state.CursorFollow)\n        {\n            // Horizontal scroll in chunks of quarter width\n            if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll))\n            {\n                const float scroll_increment_x = size.x * 0.25f;\n                if (cursor_offset.x < edit_state.ScrollX)\n                    edit_state.ScrollX = (float)(int)ImMax(0.0f, cursor_offset.x - scroll_increment_x);\n                else if (cursor_offset.x - size.x >= edit_state.ScrollX)\n                    edit_state.ScrollX = (float)(int)(cursor_offset.x - size.x + scroll_increment_x);\n            }\n            else\n            {\n                edit_state.ScrollX = 0.0f;\n            }\n\n            // Vertical scroll\n            if (is_multiline)\n            {\n                float scroll_y = draw_window->Scroll.y;\n                if (cursor_offset.y - g.FontSize < scroll_y)\n                    scroll_y = ImMax(0.0f, cursor_offset.y - g.FontSize);\n                else if (cursor_offset.y - size.y >= scroll_y)\n                    scroll_y = cursor_offset.y - size.y;\n                draw_window->DC.CursorPos.y += (draw_window->Scroll.y - scroll_y);   // To avoid a frame of lag\n                draw_window->Scroll.y = scroll_y;\n                render_pos.y = draw_window->DC.CursorPos.y;\n            }\n        }\n        edit_state.CursorFollow = false;\n        const ImVec2 render_scroll = ImVec2(edit_state.ScrollX, 0.0f);\n\n        // Draw selection\n        if (edit_state.StbState.select_start != edit_state.StbState.select_end)\n        {\n            const ImWchar* text_selected_begin = text_begin + ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end);\n            const ImWchar* text_selected_end = text_begin + ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end);\n\n            float bg_offy_up = is_multiline ? 0.0f : -1.0f;    // FIXME: those offsets should be part of the style? they don't play so well with multi-line selection.\n            float bg_offy_dn = is_multiline ? 0.0f : 2.0f;\n            ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg);\n            ImVec2 rect_pos = render_pos + select_start_offset - render_scroll;\n            for (const ImWchar* p = text_selected_begin; p < text_selected_end; )\n            {\n                if (rect_pos.y > clip_rect.w + g.FontSize)\n                    break;\n                if (rect_pos.y < clip_rect.y)\n                {\n                    while (p < text_selected_end)\n                        if (*p++ == '\\n')\n                            break;\n                }\n                else\n                {\n                    ImVec2 rect_size = InputTextCalcTextSizeW(p, text_selected_end, &p, NULL, true);\n                    if (rect_size.x <= 0.0f) rect_size.x = (float)(int)(g.Font->GetCharAdvance((unsigned short)' ') * 0.50f); // So we can see selected empty lines\n                    ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos +ImVec2(rect_size.x, bg_offy_dn));\n                    rect.ClipWith(clip_rect);\n                    if (rect.Overlaps(clip_rect))\n                        draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color);\n                }\n                rect_pos.x = render_pos.x - render_scroll.x;\n                rect_pos.y += g.FontSize;\n            }\n        }\n\n        draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos - render_scroll, GetColorU32(ImGuiCol_Text), buf_display, buf_display + edit_state.CurLenA, 0.0f, is_multiline ? NULL : &clip_rect);\n\n        // Draw blinking cursor\n        bool cursor_is_visible = (!g.IO.OptCursorBlink) || (g.InputTextState.CursorAnim <= 0.0f) || fmodf(g.InputTextState.CursorAnim, 1.20f) <= 0.80f;\n        ImVec2 cursor_screen_pos = render_pos + cursor_offset - render_scroll;\n        ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y-g.FontSize+0.5f, cursor_screen_pos.x+1.0f, cursor_screen_pos.y-1.5f);\n        if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect))\n            draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text));\n\n        // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)\n        if (is_editable)\n            g.OsImePosRequest = ImVec2(cursor_screen_pos.x - 1, cursor_screen_pos.y - g.FontSize);\n    }\n    else\n    {\n        // Render text only\n        const char* buf_end = NULL;\n        if (is_multiline)\n            text_size = ImVec2(size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_end) * g.FontSize); // We don't need width\n        draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos, GetColorU32(ImGuiCol_Text), buf_display, buf_end, 0.0f, is_multiline ? NULL : &clip_rect);\n    }\n\n    if (is_multiline)\n    {\n        Dummy(text_size + ImVec2(0.0f, g.FontSize)); // Always add room to scroll an extra line\n        EndChildFrame();\n        EndGroup();\n    }\n\n    if (is_password)\n        PopFont();\n\n    // Log as text\n    if (g.LogEnabled && !is_password)\n        LogRenderedText(&render_pos, buf_display, NULL);\n\n    if (label_size.x > 0)\n        RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);\n\n    if ((flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0)\n        return enter_pressed;\n    else\n        return value_changed;\n}\n\nbool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data)\n{\n    IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline()\n    return InputTextEx(label, buf, (int)buf_size, ImVec2(0,0), flags, callback, user_data);\n}\n\nbool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback, void* user_data)\n{\n    return InputTextEx(label, buf, (int)buf_size, size, flags | ImGuiInputTextFlags_Multiline, callback, user_data);\n}\n\nstatic inline float SmallSquareSize()\n{\n    ImGuiContext& g = *GImGui;\n    return g.FontSize + g.Style.FramePadding.y * 2.0f;\n}\n\n// NB: scalar_format here must be a simple \"%xx\" format string with no prefix/suffix (unlike the Drag/Slider functions \"display_format\" argument)\nbool ImGui::InputScalarEx(const char* label, ImGuiDataType data_type, void* data_ptr, void* step_ptr, void* step_fast_ptr, const char* scalar_format, ImGuiInputTextFlags extra_flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n\n    BeginGroup();\n    PushID(label);\n    const ImVec2 button_sz = ImVec2(SmallSquareSize(), SmallSquareSize());\n    if (step_ptr)\n        PushItemWidth(ImMax(1.0f, CalcItemWidth() - (button_sz.x + style.ItemInnerSpacing.x)*2));\n\n    char buf[64];\n    DataTypeFormatString(data_type, data_ptr, scalar_format, buf, IM_ARRAYSIZE(buf));\n\n    bool value_changed = false;\n    if (!(extra_flags & ImGuiInputTextFlags_CharsHexadecimal))\n        extra_flags |= ImGuiInputTextFlags_CharsDecimal;\n    extra_flags |= ImGuiInputTextFlags_AutoSelectAll;\n    if (InputText(\"\", buf, IM_ARRAYSIZE(buf), extra_flags)) // PushId(label) + \"\" gives us the expected ID from outside point of view\n        value_changed = DataTypeApplyOpFromText(buf, GImGui->InputTextState.InitialText.begin(), data_type, data_ptr, scalar_format);\n\n    // Step buttons\n    if (step_ptr)\n    {\n        PopItemWidth();\n        SameLine(0, style.ItemInnerSpacing.x);\n        if (ButtonEx(\"-\", button_sz, ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))\n        {\n            DataTypeApplyOp(data_type, '-', data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr);\n            value_changed = true;\n        }\n        SameLine(0, style.ItemInnerSpacing.x);\n        if (ButtonEx(\"+\", button_sz, ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))\n        {\n            DataTypeApplyOp(data_type, '+', data_ptr, g.IO.KeyCtrl && step_fast_ptr ? step_fast_ptr : step_ptr);\n            value_changed = true;\n        }\n    }\n    PopID();\n\n    if (label_size.x > 0)\n    {\n        SameLine(0, style.ItemInnerSpacing.x);\n        RenderText(ImVec2(window->DC.CursorPos.x, window->DC.CursorPos.y + style.FramePadding.y), label);\n        ItemSize(label_size, style.FramePadding.y);\n    }\n    EndGroup();\n\n    return value_changed;\n}\n\nbool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags extra_flags)\n{\n    char display_format[16];\n    if (decimal_precision < 0)\n        strcpy(display_format, \"%f\");      // Ideally we'd have a minimum decimal precision of 1 to visually denote that this is a float, while hiding non-significant digits? %f doesn't have a minimum of 1\n    else\n        ImFormatString(display_format, IM_ARRAYSIZE(display_format), \"%%.%df\", decimal_precision);\n    return InputScalarEx(label, ImGuiDataType_Float, (void*)v, (void*)(step>0.0f ? &step : NULL), (void*)(step_fast>0.0f ? &step_fast : NULL), display_format, extra_flags);\n}\n\nbool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiInputTextFlags extra_flags)\n{\n    // Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes.\n    const char* scalar_format = (extra_flags & ImGuiInputTextFlags_CharsHexadecimal) ? \"%08X\" : \"%d\";\n    return InputScalarEx(label, ImGuiDataType_Int, (void*)v, (void*)(step>0.0f ? &step : NULL), (void*)(step_fast>0.0f ? &step_fast : NULL), scalar_format, extra_flags);\n}\n\nbool ImGui::InputFloatN(const char* label, float* v, int components, int decimal_precision, ImGuiInputTextFlags extra_flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    bool value_changed = false;\n    BeginGroup();\n    PushID(label);\n    PushMultiItemsWidths(components);\n    for (int i = 0; i < components; i++)\n    {\n        PushID(i);\n        value_changed |= InputFloat(\"##v\", &v[i], 0, 0, decimal_precision, extra_flags);\n        SameLine(0, g.Style.ItemInnerSpacing.x);\n        PopID();\n        PopItemWidth();\n    }\n    PopID();\n\n    TextUnformatted(label, FindRenderedTextEnd(label));\n    EndGroup();\n\n    return value_changed;\n}\n\nbool ImGui::InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags extra_flags)\n{\n    return InputFloatN(label, v, 2, decimal_precision, extra_flags);\n}\n\nbool ImGui::InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags extra_flags)\n{\n    return InputFloatN(label, v, 3, decimal_precision, extra_flags);\n}\n\nbool ImGui::InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags extra_flags)\n{\n    return InputFloatN(label, v, 4, decimal_precision, extra_flags);\n}\n\nbool ImGui::InputIntN(const char* label, int* v, int components, ImGuiInputTextFlags extra_flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    bool value_changed = false;\n    BeginGroup();\n    PushID(label);\n    PushMultiItemsWidths(components);\n    for (int i = 0; i < components; i++)\n    {\n        PushID(i);\n        value_changed |= InputInt(\"##v\", &v[i], 0, 0, extra_flags);\n        SameLine(0, g.Style.ItemInnerSpacing.x);\n        PopID();\n        PopItemWidth();\n    }\n    PopID();\n\n    TextUnformatted(label, FindRenderedTextEnd(label));\n    EndGroup();\n\n    return value_changed;\n}\n\nbool ImGui::InputInt2(const char* label, int v[2], ImGuiInputTextFlags extra_flags)\n{\n    return InputIntN(label, v, 2, extra_flags);\n}\n\nbool ImGui::InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags)\n{\n    return InputIntN(label, v, 3, extra_flags);\n}\n\nbool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags)\n{\n    return InputIntN(label, v, 4, extra_flags);\n}\n\nstatic bool Items_ArrayGetter(void* data, int idx, const char** out_text)\n{\n    const char* const* items = (const char* const*)data;\n    if (out_text)\n        *out_text = items[idx];\n    return true;\n}\n\nstatic bool Items_SingleStringGetter(void* data, int idx, const char** out_text)\n{\n    // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited.\n    const char* items_separated_by_zeros = (const char*)data;\n    int items_count = 0;\n    const char* p = items_separated_by_zeros;\n    while (*p)\n    {\n        if (idx == items_count)\n            break;\n        p += strlen(p) + 1;\n        items_count++;\n    }\n    if (!*p)\n        return false;\n    if (out_text)\n        *out_text = p;\n    return true;\n}\n\n// Combo box helper allowing to pass an array of strings.\nbool ImGui::Combo(const char* label, int* current_item, const char* const* items, int items_count, int height_in_items)\n{\n    const bool value_changed = Combo(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_in_items);\n    return value_changed;\n}\n\n// Combo box helper allowing to pass all items in a single string.\nbool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items)\n{\n    int items_count = 0;\n    const char* p = items_separated_by_zeros;       // FIXME-OPT: Avoid computing this, or at least only when combo is open\n    while (*p)\n    {\n        p += strlen(p) + 1;\n        items_count++;\n    }\n    bool value_changed = Combo(label, current_item, Items_SingleStringGetter, (void*)items_separated_by_zeros, items_count, height_in_items);\n    return value_changed;\n}\n\nbool ImGui::BeginCombo(const char* label, const char* preview_value, ImVec2 popup_size)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(label);\n    const float w = CalcItemWidth();\n\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n    const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));\n    const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));\n    ItemSize(total_bb, style.FramePadding.y);\n    if (!ItemAdd(total_bb, id))\n        return false;\n\n    const float arrow_size = SmallSquareSize();\n\n    bool hovered, held;\n    bool pressed = ButtonBehavior(frame_bb, id, &hovered, &held);\n\n    bool popup_open = IsPopupOpen(id);\n\n    const ImRect value_bb(frame_bb.Min, frame_bb.Max - ImVec2(arrow_size, 0.0f));\n    RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);\n    RenderFrame(ImVec2(frame_bb.Max.x-arrow_size, frame_bb.Min.y), frame_bb.Max, GetColorU32(popup_open || hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button), true, style.FrameRounding); // FIXME-ROUNDING\n    RenderTriangle(ImVec2(frame_bb.Max.x - arrow_size + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), ImGuiDir_Down);\n\n    if (preview_value != NULL)\n        RenderTextClipped(frame_bb.Min + style.FramePadding, value_bb.Max, preview_value, NULL, NULL, ImVec2(0.0f,0.0f));\n\n    if (label_size.x > 0)\n        RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);\n\n    if (pressed && !popup_open)\n    {\n        OpenPopupEx(id, false);\n        popup_open = true;\n    }\n\n    if (!popup_open)\n        return false;\n\n    if (popup_size.x == 0.0f)\n        popup_size.x = w;\n\n    float popup_y1 = frame_bb.Max.y;\n    float popup_y2 = ImClamp(popup_y1 + popup_size.y, popup_y1, g.IO.DisplaySize.y - style.DisplaySafeAreaPadding.y);\n    if ((popup_y2 - popup_y1) < ImMin(popup_size.y, frame_bb.Min.y - style.DisplaySafeAreaPadding.y))\n    {\n        // Position our combo ABOVE because there's more space to fit! (FIXME: Handle in Begin() or use a shared helper. We have similar code in Begin() for popup placement)\n        popup_y1 = ImClamp(frame_bb.Min.y - popup_size.y, style.DisplaySafeAreaPadding.y, frame_bb.Min.y);\n        popup_y2 = frame_bb.Min.y;\n        SetNextWindowPos(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FrameBorderSize), ImGuiCond_Always, ImVec2(0.0f, 1.0f));\n    }\n    else\n    {\n        // Position our combo below\n        SetNextWindowPos(ImVec2(frame_bb.Min.x, frame_bb.Max.y - style.FrameBorderSize), ImGuiCond_Always, ImVec2(0.0f, 0.0f));\n    }\n    SetNextWindowSize(ImVec2(popup_size.x, popup_y2 - popup_y1), ImGuiCond_Appearing);\n    PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding);\n\n    if (!BeginPopupEx(id, ImGuiWindowFlags_ComboBox))\n    {\n        IM_ASSERT(0);   // This should never happen as we tested for IsPopupOpen() above\n        return false;\n    }\n    Spacing();\n\n    return true;\n}\n\nvoid ImGui::EndCombo()\n{\n    EndPopup();\n    PopStyleVar();\n}\n\n// Combo box function.\nbool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items)\n{\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n\n    const char* preview_text = NULL;\n    if (*current_item >= 0 && *current_item < items_count)\n        items_getter(data, *current_item, &preview_text);\n\n    // Size default to hold ~7 items\n    if (height_in_items < 0)\n        height_in_items = 7;\n    float popup_height = (g.FontSize + style.ItemSpacing.y) * ImMin(items_count, height_in_items) + (style.FramePadding.y * 3);\n\n    if (!BeginCombo(label, preview_text, ImVec2(0.0f, popup_height)))\n        return false;\n\n    // Display items\n    // FIXME-OPT: Use clipper\n    bool value_changed = false;\n    for (int i = 0; i < items_count; i++)\n    {\n        PushID((void*)(intptr_t)i);\n        const bool item_selected = (i == *current_item);\n        const char* item_text;\n        if (!items_getter(data, i, &item_text))\n            item_text = \"*Unknown item*\";\n        if (Selectable(item_text, item_selected))\n        {\n            value_changed = true;\n            *current_item = i;\n        }\n        if (item_selected && IsWindowAppearing())\n            SetScrollHere();\n        PopID();\n    }\n\n    EndCombo();\n    return value_changed;\n}\n\n// Tip: pass an empty label (e.g. \"##dummy\") then you can use the space to draw other text or image.\n// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID.\nbool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n\n    if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsCount > 1) // FIXME-OPT: Avoid if vertically clipped.\n        PopClipRect();\n\n    ImGuiID id = window->GetID(label);\n    ImVec2 label_size = CalcTextSize(label, NULL, true);\n    ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y);\n    ImVec2 pos = window->DC.CursorPos;\n    pos.y += window->DC.CurrentLineTextBaseOffset;\n    ImRect bb(pos, pos + size);\n    ItemSize(bb);\n\n    // Fill horizontal space.\n    ImVec2 window_padding = window->WindowPadding;\n    float max_x = (flags & ImGuiSelectableFlags_SpanAllColumns) ? GetWindowContentRegionMax().x : GetContentRegionMax().x;\n    float w_draw = ImMax(label_size.x, window->Pos.x + max_x - window_padding.x - window->DC.CursorPos.x);\n    ImVec2 size_draw((size_arg.x != 0 && !(flags & ImGuiSelectableFlags_DrawFillAvailWidth)) ? size_arg.x : w_draw, size_arg.y != 0.0f ? size_arg.y : size.y);\n    ImRect bb_with_spacing(pos, pos + size_draw);\n    if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_DrawFillAvailWidth))\n        bb_with_spacing.Max.x += window_padding.x;\n\n    // Selectables are tightly packed together, we extend the box to cover spacing between selectable.\n    float spacing_L = (float)(int)(style.ItemSpacing.x * 0.5f);\n    float spacing_U = (float)(int)(style.ItemSpacing.y * 0.5f);\n    float spacing_R = style.ItemSpacing.x - spacing_L;\n    float spacing_D = style.ItemSpacing.y - spacing_U;\n    bb_with_spacing.Min.x -= spacing_L;\n    bb_with_spacing.Min.y -= spacing_U;\n    bb_with_spacing.Max.x += spacing_R;\n    bb_with_spacing.Max.y += spacing_D;\n    if (!ItemAdd(bb_with_spacing, id))\n    {\n        if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsCount > 1)\n            PushColumnClipRect();\n        return false;\n    }\n\n    ImGuiButtonFlags button_flags = 0;\n    if (flags & ImGuiSelectableFlags_Menu) button_flags |= ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_NoHoldingActiveID;\n    if (flags & ImGuiSelectableFlags_MenuItem) button_flags |= ImGuiButtonFlags_PressedOnRelease;\n    if (flags & ImGuiSelectableFlags_Disabled) button_flags |= ImGuiButtonFlags_Disabled;\n    if (flags & ImGuiSelectableFlags_AllowDoubleClick) button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick;\n    bool hovered, held;\n    bool pressed = ButtonBehavior(bb_with_spacing, id, &hovered, &held, button_flags);\n    if (flags & ImGuiSelectableFlags_Disabled)\n        selected = false;\n\n    // Render\n    if (hovered || selected)\n    {\n        const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);\n        RenderFrame(bb_with_spacing.Min, bb_with_spacing.Max, col, false, 0.0f);\n    }\n\n    if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsCount > 1)\n    {\n        PushColumnClipRect();\n        bb_with_spacing.Max.x -= (GetContentRegionMax().x - max_x);\n    }\n\n    if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);\n    RenderTextClipped(bb.Min, bb_with_spacing.Max, label, NULL, &label_size, ImVec2(0.0f,0.0f));\n    if (flags & ImGuiSelectableFlags_Disabled) PopStyleColor();\n\n    // Automatically close popups\n    if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(window->DC.ItemFlags & ImGuiItemFlags_SelectableDontClosePopup))\n        CloseCurrentPopup();\n    return pressed;\n}\n\nbool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)\n{\n    if (Selectable(label, *p_selected, flags, size_arg))\n    {\n        *p_selected = !*p_selected;\n        return true;\n    }\n    return false;\n}\n\n// Helper to calculate the size of a listbox and display a label on the right.\n// Tip: To have a list filling the entire window width, PushItemWidth(-1) and pass an empty label \"##empty\"\nbool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    const ImGuiStyle& style = GetStyle();\n    const ImGuiID id = GetID(label);\n    const ImVec2 label_size = CalcTextSize(label, NULL, true);\n\n    // Size default to hold ~7 items. Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar.\n    ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.4f + style.ItemSpacing.y);\n    ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y));\n    ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);\n    ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));\n    window->DC.LastItemRect = bb;\n\n    BeginGroup();\n    if (label_size.x > 0)\n        RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);\n\n    BeginChildFrame(id, frame_bb.GetSize());\n    return true;\n}\n\nbool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_items)\n{\n    // Size default to hold ~7 items. Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar.\n    // However we don't add +0.40f if items_count <= height_in_items. It is slightly dodgy, because it means a dynamic list of items will make the widget resize occasionally when it crosses that size.\n    // I am expecting that someone will come and complain about this behavior in a remote future, then we can advise on a better solution.\n    if (height_in_items < 0)\n        height_in_items = ImMin(items_count, 7);\n    float height_in_items_f = height_in_items < items_count ? (height_in_items + 0.40f) : (height_in_items + 0.00f);\n\n    // We include ItemSpacing.y so that a list sized for the exact number of items doesn't make a scrollbar appears. We could also enforce that by passing a flag to BeginChild().\n    ImVec2 size;\n    size.x = 0.0f;\n    size.y = GetTextLineHeightWithSpacing() * height_in_items_f + GetStyle().ItemSpacing.y;\n    return ListBoxHeader(label, size);\n}\n\nvoid ImGui::ListBoxFooter()\n{\n    ImGuiWindow* parent_window = GetParentWindow();\n    const ImRect bb = parent_window->DC.LastItemRect;\n    const ImGuiStyle& style = GetStyle();\n\n    EndChildFrame();\n\n    // Redeclare item size so that it includes the label (we have stored the full size in LastItemRect)\n    // We call SameLine() to restore DC.CurrentLine* data\n    SameLine();\n    parent_window->DC.CursorPos = bb.Min;\n    ItemSize(bb, style.FramePadding.y);\n    EndGroup();\n}\n\nbool ImGui::ListBox(const char* label, int* current_item, const char* const* items, int items_count, int height_items)\n{\n    const bool value_changed = ListBox(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_items);\n    return value_changed;\n}\n\nbool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items)\n{\n    if (!ListBoxHeader(label, items_count, height_in_items))\n        return false;\n\n    // Assume all items have even height (= 1 line of text). If you need items of different or variable sizes you can create a custom version of ListBox() in your code without using the clipper.\n    bool value_changed = false;\n    ImGuiListClipper clipper(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to.\n    while (clipper.Step())\n        for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)\n        {\n            const bool item_selected = (i == *current_item);\n            const char* item_text;\n            if (!items_getter(data, i, &item_text))\n                item_text = \"*Unknown item*\";\n\n            PushID(i);\n            if (Selectable(item_text, item_selected))\n            {\n                *current_item = i;\n                value_changed = true;\n            }\n            PopID();\n        }\n    ListBoxFooter();\n    return value_changed;\n}\n\nbool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, bool enabled)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    ImGuiStyle& style = g.Style;\n    ImVec2 pos = window->DC.CursorPos;\n    ImVec2 label_size = CalcTextSize(label, NULL, true);\n\n    ImGuiSelectableFlags flags = ImGuiSelectableFlags_MenuItem | (enabled ? 0 : ImGuiSelectableFlags_Disabled);\n    bool pressed;\n    if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)\n    {\n        // Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful\n        // Note that in this situation we render neither the shortcut neither the selected tick mark\n        float w = label_size.x;\n        window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f);\n        PushStyleVar(ImGuiStyleVar_ItemSpacing, style.ItemSpacing * 2.0f);\n        pressed = Selectable(label, false, flags, ImVec2(w, 0.0f));\n        PopStyleVar();\n        window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().\n    }\n    else\n    {\n        ImVec2 shortcut_size = shortcut ? CalcTextSize(shortcut, NULL) : ImVec2(0.0f, 0.0f);\n        float w = window->MenuColumns.DeclColumns(label_size.x, shortcut_size.x, (float)(int)(g.FontSize * 1.20f)); // Feedback for next frame\n        float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w);\n        pressed = Selectable(label, false, flags | ImGuiSelectableFlags_DrawFillAvailWidth, ImVec2(w, 0.0f));\n        if (shortcut_size.x > 0.0f)\n        {\n            PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);\n            RenderText(pos + ImVec2(window->MenuColumns.Pos[1] + extra_w, 0.0f), shortcut, NULL, false);\n            PopStyleColor();\n        }\n        if (selected)\n            RenderCheckMark(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled), g.FontSize  * 0.866f);\n    }\n    return pressed;\n}\n\nbool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled)\n{\n    if (MenuItem(label, shortcut, p_selected ? *p_selected : false, enabled))\n    {\n        if (p_selected)\n            *p_selected = !*p_selected;\n        return true;\n    }\n    return false;\n}\n\nbool ImGui::BeginMainMenuBar()\n{\n    ImGuiContext& g = *GImGui;\n    SetNextWindowPos(ImVec2(0.0f, 0.0f));\n    SetNextWindowSize(ImVec2(g.IO.DisplaySize.x, g.FontBaseSize + g.Style.FramePadding.y * 2.0f));\n    PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);\n    PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0,0));\n    if (!Begin(\"##MainMenuBar\", NULL, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_MenuBar)\n        || !BeginMenuBar())\n    {\n        End();\n        PopStyleVar(2);\n        return false;\n    }\n    g.CurrentWindow->DC.MenuBarOffsetX += g.Style.DisplaySafeAreaPadding.x;\n    return true;\n}\n\nvoid ImGui::EndMainMenuBar()\n{\n    EndMenuBar();\n    End();\n    PopStyleVar(2);\n}\n\nbool ImGui::BeginMenuBar()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n    if (!(window->Flags & ImGuiWindowFlags_MenuBar))\n        return false;\n\n    IM_ASSERT(!window->DC.MenuBarAppending);\n    BeginGroup(); // Save position\n    PushID(\"##menubar\");\n    \n    // We don't clip with regular window clipping rectangle as it is already set to the area below. However we clip with window full rect.\n    // We remove 1 worth of rounding to Max.x to that text in long menus don't tend to display over the lower-right rounded area, which looks particularly glitchy.\n    ImRect bar_rect = window->MenuBarRect();\n    ImRect clip_rect(ImFloor(bar_rect.Min.x + 0.5f), ImFloor(bar_rect.Min.y + window->WindowBorderSize + 0.5f), ImFloor(ImMax(bar_rect.Min.x, bar_rect.Max.x - window->WindowRounding) + 0.5f), ImFloor(bar_rect.Max.y + 0.5f));\n    clip_rect.ClipWith(window->Rect());\n    PushClipRect(clip_rect.Min, clip_rect.Max, false);\n\n    window->DC.CursorPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffsetX, bar_rect.Min.y);// + g.Style.FramePadding.y);\n    window->DC.LayoutType = ImGuiLayoutType_Horizontal;\n    window->DC.MenuBarAppending = true;\n    AlignTextToFramePadding();\n    return true;\n}\n\nvoid ImGui::EndMenuBar()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar);\n    IM_ASSERT(window->DC.MenuBarAppending);\n    PopClipRect();\n    PopID();\n    window->DC.MenuBarOffsetX = window->DC.CursorPos.x - window->MenuBarRect().Min.x;\n    window->DC.GroupStack.back().AdvanceCursor = false;\n    EndGroup();\n    window->DC.LayoutType = ImGuiLayoutType_Vertical;\n    window->DC.MenuBarAppending = false;\n}\n\nbool ImGui::BeginMenu(const char* label, bool enabled)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const ImGuiID id = window->GetID(label);\n\n    ImVec2 label_size = CalcTextSize(label, NULL, true);\n\n    bool pressed;\n    bool menu_is_open = IsPopupOpen(id);\n    bool menuset_is_open = !(window->Flags & ImGuiWindowFlags_Popup) && (g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].ParentMenuSet == window->GetID(\"##menus\"));\n    ImGuiWindow* backed_nav_window = g.NavWindow;\n    if (menuset_is_open)\n        g.NavWindow = window;  // Odd hack to allow hovering across menus of a same menu-set (otherwise we wouldn't be able to hover parent)\n\n    // The reference position stored in popup_pos will be used by Begin() to find a suitable position for the child menu (using FindBestPopupWindowPos).\n    ImVec2 popup_pos, pos = window->DC.CursorPos;\n    if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)\n    {\n        // Menu inside an horizontal menu bar\n        // Selectable extend their highlight by half ItemSpacing in each direction.\n        // For ChildMenu, the popup position will be overwritten by the call to FindBestPopupWindowPos() in Begin()\n        popup_pos = ImVec2(pos.x - window->WindowPadding.x, pos.y - style.FramePadding.y + window->MenuBarHeight());\n        window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f);\n        PushStyleVar(ImGuiStyleVar_ItemSpacing, style.ItemSpacing * 2.0f);\n        float w = label_size.x;\n        pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_Menu | ImGuiSelectableFlags_DontClosePopups | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f));\n        PopStyleVar();\n        window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().\n    }\n    else\n    {\n        // Menu inside a menu\n        popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y);\n        float w = window->MenuColumns.DeclColumns(label_size.x, 0.0f, (float)(int)(g.FontSize * 1.20f)); // Feedback to next frame\n        float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w);\n        pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_Menu | ImGuiSelectableFlags_DontClosePopups | ImGuiSelectableFlags_DrawFillAvailWidth | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f));\n        if (!enabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);\n        RenderTriangle(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), ImGuiDir_Right);\n        if (!enabled) PopStyleColor();\n    }\n\n    const bool hovered = enabled && ItemHoverable(window->DC.LastItemRect, id);\n    if (menuset_is_open)\n        g.NavWindow = backed_nav_window;\n\n    bool want_open = false, want_close = false;\n    if (window->DC.LayoutType != ImGuiLayoutType_Horizontal) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu))\n    {\n        // Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive.\n        bool moving_within_opened_triangle = false;\n        if (g.HoveredWindow == window && g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].ParentWindow == window)\n        {\n            if (ImGuiWindow* next_window = g.OpenPopupStack[g.CurrentPopupStack.Size].Window)\n            {\n                ImRect next_window_rect = next_window->Rect();\n                ImVec2 ta = g.IO.MousePos - g.IO.MouseDelta;\n                ImVec2 tb = (window->Pos.x < next_window->Pos.x) ? next_window_rect.GetTL() : next_window_rect.GetTR();\n                ImVec2 tc = (window->Pos.x < next_window->Pos.x) ? next_window_rect.GetBL() : next_window_rect.GetBR();\n                float extra = ImClamp(fabsf(ta.x - tb.x) * 0.30f, 5.0f, 30.0f); // add a bit of extra slack.\n                ta.x += (window->Pos.x < next_window->Pos.x) ? -0.5f : +0.5f;   // to avoid numerical issues\n                tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -100.0f);            // triangle is maximum 200 high to limit the slope and the bias toward large sub-menus // FIXME: Multiply by fb_scale?\n                tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +100.0f);\n                moving_within_opened_triangle = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos);\n                //window->DrawList->PushClipRectFullScreen(); window->DrawList->AddTriangleFilled(ta, tb, tc, moving_within_opened_triangle ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); window->DrawList->PopClipRect(); // Debug\n            }\n        }\n\n        want_close = (menu_is_open && !hovered && g.HoveredWindow == window && g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrame != id && !moving_within_opened_triangle);\n        want_open = (!menu_is_open && hovered && !moving_within_opened_triangle) || (!menu_is_open && hovered && pressed);\n    }\n    else\n    {\n        // Menu bar\n        if (menu_is_open && pressed && menuset_is_open) // Click an open menu again to close it\n        {\n            want_close = true;\n            want_open = menu_is_open = false;\n        }\n        else if (pressed || (hovered && menuset_is_open && !menu_is_open)) // First click to open, then hover to open others\n        {\n            want_open = true;\n        }\n    }\n\n    if (!enabled) // explicitly close if an open menu becomes disabled, facilitate users code a lot in pattern such as 'if (BeginMenu(\"options\", has_object)) { ..use object.. }'\n        want_close = true;\n    if (want_close && IsPopupOpen(id))\n        ClosePopupToLevel(GImGui->CurrentPopupStack.Size);\n\n    if (!menu_is_open && want_open && g.OpenPopupStack.Size > g.CurrentPopupStack.Size)\n    {\n        // Don't recycle same menu level in the same frame, first close the other menu and yield for a frame.\n        OpenPopup(label);\n        return false;\n    }\n\n    menu_is_open |= want_open;\n    if (want_open)\n        OpenPopup(label);\n\n    if (menu_is_open)\n    {\n        SetNextWindowPos(popup_pos, ImGuiCond_Always);\n        ImGuiWindowFlags flags = ImGuiWindowFlags_AlwaysAutoResize | ((window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) ? ImGuiWindowFlags_ChildMenu|ImGuiWindowFlags_ChildWindow : ImGuiWindowFlags_ChildMenu);\n        menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display)\n    }\n\n    return menu_is_open;\n}\n\nvoid ImGui::EndMenu()\n{\n    EndPopup();\n}\n\n// Note: only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set.\nvoid ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n\n    int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]);\n    BeginTooltipEx(0, true);\n    \n    const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text;\n    if (text_end > text)\n    {\n        TextUnformatted(text, text_end);\n        Separator();\n    }\n\n    ImVec2 sz(g.FontSize * 3 + g.Style.FramePadding.y * 2, g.FontSize * 3 + g.Style.FramePadding.y * 2);\n    ColorButton(\"##preview\", ImVec4(col[0], col[1], col[2], col[3]), (flags & (ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz);\n    SameLine();\n    if (flags & ImGuiColorEditFlags_NoAlpha)\n        Text(\"#%02X%02X%02X\\nR: %d, G: %d, B: %d\\n(%.3f, %.3f, %.3f)\", cr, cg, cb, cr, cg, cb, col[0], col[1], col[2]);\n    else\n        Text(\"#%02X%02X%02X%02X\\nR:%d, G:%d, B:%d, A:%d\\n(%.3f, %.3f, %.3f, %.3f)\", cr, cg, cb, ca, cr, cg, cb, ca, col[0], col[1], col[2], col[3]);\n    EndTooltip();\n}\n\nstatic inline ImU32 ImAlphaBlendColor(ImU32 col_a, ImU32 col_b)\n{\n    float t = ((col_b >> IM_COL32_A_SHIFT) & 0xFF) / 255.f;\n    int r = ImLerp((int)(col_a >> IM_COL32_R_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_R_SHIFT) & 0xFF, t);\n    int g = ImLerp((int)(col_a >> IM_COL32_G_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_G_SHIFT) & 0xFF, t);\n    int b = ImLerp((int)(col_a >> IM_COL32_B_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_B_SHIFT) & 0xFF, t);\n    return IM_COL32(r, g, b, 0xFF);\n}\n\n// NB: This is rather brittle and will show artifact when rounding this enabled if rounded corners overlap multiple cells. Caller currently responsible for avoiding that.\n// I spent a non reasonable amount of time trying to getting this right for ColorButton with rounding+anti-aliasing+ImGuiColorEditFlags_HalfAlphaPreview flag + various grid sizes and offsets, and eventually gave up... probably more reasonable to disable rounding alltogether.\nvoid ImGui::RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 col, float grid_step, ImVec2 grid_off, float rounding, int rounding_corners_flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (((col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT) < 0xFF)\n    {\n        ImU32 col_bg1 = GetColorU32(ImAlphaBlendColor(IM_COL32(204,204,204,255), col));\n        ImU32 col_bg2 = GetColorU32(ImAlphaBlendColor(IM_COL32(128,128,128,255), col));\n        window->DrawList->AddRectFilled(p_min, p_max, col_bg1, rounding, rounding_corners_flags);\n\n        int yi = 0;\n        for (float y = p_min.y + grid_off.y; y < p_max.y; y += grid_step, yi++)\n        {\n            float y1 = ImClamp(y, p_min.y, p_max.y), y2 = ImMin(y + grid_step, p_max.y);\n            if (y2 <= y1)\n                continue;\n            for (float x = p_min.x + grid_off.x + (yi & 1) * grid_step; x < p_max.x; x += grid_step * 2.0f)\n            {\n                float x1 = ImClamp(x, p_min.x, p_max.x), x2 = ImMin(x + grid_step, p_max.x);\n                if (x2 <= x1)\n                    continue;\n                int rounding_corners_flags_cell = 0;\n                if (y1 <= p_min.y) { if (x1 <= p_min.x) rounding_corners_flags_cell |= ImDrawCornerFlags_TopLeft; if (x2 >= p_max.x) rounding_corners_flags_cell |= ImDrawCornerFlags_TopRight; }\n                if (y2 >= p_max.y) { if (x1 <= p_min.x) rounding_corners_flags_cell |= ImDrawCornerFlags_BotLeft; if (x2 >= p_max.x) rounding_corners_flags_cell |= ImDrawCornerFlags_BotRight; }\n                rounding_corners_flags_cell &= rounding_corners_flags;\n                window->DrawList->AddRectFilled(ImVec2(x1,y1), ImVec2(x2,y2), col_bg2, rounding_corners_flags_cell ? rounding : 0.0f, rounding_corners_flags_cell);\n            }\n        }\n    }\n    else\n    {\n        window->DrawList->AddRectFilled(p_min, p_max, col, rounding, rounding_corners_flags);\n    }\n}\n\nvoid ImGui::SetColorEditOptions(ImGuiColorEditFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n    if ((flags & ImGuiColorEditFlags__InputsMask) == 0)\n        flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__InputsMask;\n    if ((flags & ImGuiColorEditFlags__DataTypeMask) == 0)\n        flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__DataTypeMask;\n    if ((flags & ImGuiColorEditFlags__PickerMask) == 0)\n        flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__PickerMask;\n    IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__InputsMask)));   // Check only 1 option is selected\n    IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__DataTypeMask))); // Check only 1 option is selected\n    IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__PickerMask)));   // Check only 1 option is selected\n    g.ColorEditOptions = flags;\n}\n\n// A little colored square. Return true when clicked.\n// FIXME: May want to display/ignore the alpha component in the color display? Yet show it in the tooltip.\n// 'desc_id' is not called 'label' because we don't display it next to the button, but only in the tooltip.\nbool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags, ImVec2 size)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiID id = window->GetID(desc_id);\n    float default_size = SmallSquareSize();\n    if (size.x == 0.0f)\n        size.x = default_size;\n    if (size.y == 0.0f)\n        size.y = default_size;\n    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);\n    ItemSize(bb, (size.y >= default_size) ? g.Style.FramePadding.y : 0.0f);\n    if (!ItemAdd(bb, id))\n        return false;\n\n    bool hovered, held;\n    bool pressed = ButtonBehavior(bb, id, &hovered, &held);\n\n    if (flags & ImGuiColorEditFlags_NoAlpha)\n        flags &= ~(ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf);\n    \n    ImVec4 col_without_alpha(col.x, col.y, col.z, 1.0f);\n    float grid_step = ImMin(size.x, size.y) / 2.99f;\n    float rounding = ImMin(g.Style.FrameRounding, grid_step * 0.5f);\n    ImRect bb_inner = bb;\n    float off = -0.75f; // The border (using Col_FrameBg) tends to look off when color is near-opaque and rounding is enabled. This offset seemed like a good middle ground to reduce those artifacts.\n    bb_inner.Expand(off);\n    if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col.w < 1.0f)\n    {\n        float mid_x = (float)(int)((bb_inner.Min.x + bb_inner.Max.x) * 0.5f + 0.5f);\n        RenderColorRectWithAlphaCheckerboard(ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawCornerFlags_TopRight| ImDrawCornerFlags_BotRight);\n        window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_without_alpha), rounding, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotLeft);\n    }\n    else\n    {\n        // Because GetColorU32() multiplies by the global style Alpha and we don't want to display a checkerboard if the source code had no alpha\n        ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col : col_without_alpha;\n        if (col_source.w < 1.0f)\n            RenderColorRectWithAlphaCheckerboard(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding);\n        else\n            window->DrawList->AddRectFilled(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), rounding, ImDrawCornerFlags_All);\n    }\n    if (g.Style.FrameBorderSize > 0.0f)\n        RenderFrameBorder(bb.Min, bb.Max, rounding);\n    else\n        window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border\n\n    if (hovered && !(flags & ImGuiColorEditFlags_NoTooltip))\n        ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf));\n\n    return pressed;\n}\n\nbool ImGui::ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags)\n{\n    return ColorEdit4(label, col, flags | ImGuiColorEditFlags_NoAlpha);\n}\n\nvoid ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags)\n{\n    bool allow_opt_inputs = !(flags & ImGuiColorEditFlags__InputsMask);\n    bool allow_opt_datatype = !(flags & ImGuiColorEditFlags__DataTypeMask);\n    if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup(\"context\"))\n        return;\n    ImGuiContext& g = *GImGui;\n    ImGuiColorEditFlags opts = g.ColorEditOptions;\n    if (allow_opt_inputs)\n    {\n        if (RadioButton(\"RGB\", (opts & ImGuiColorEditFlags_RGB) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_RGB;\n        if (RadioButton(\"HSV\", (opts & ImGuiColorEditFlags_HSV) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_HSV;\n        if (RadioButton(\"HEX\", (opts & ImGuiColorEditFlags_HEX) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_HEX;\n    }\n    if (allow_opt_datatype)\n    {\n        if (allow_opt_inputs) Separator();\n        if (RadioButton(\"0..255\",     (opts & ImGuiColorEditFlags_Uint8) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__DataTypeMask) | ImGuiColorEditFlags_Uint8;\n        if (RadioButton(\"0.00..1.00\", (opts & ImGuiColorEditFlags_Float) ? 1 : 0)) opts = (opts & ~ImGuiColorEditFlags__DataTypeMask) | ImGuiColorEditFlags_Float;\n    }\n\n    if (allow_opt_inputs || allow_opt_datatype)\n        Separator();\n    if (Button(\"Copy as..\", ImVec2(-1,0)))\n        OpenPopup(\"Copy\");\n    if (BeginPopup(\"Copy\"))\n    {\n        int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]);\n        char buf[64];\n        ImFormatString(buf, IM_ARRAYSIZE(buf), \"(%.3ff, %.3ff, %.3ff, %.3ff)\", col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]);\n        if (Selectable(buf))\n            SetClipboardText(buf);\n        ImFormatString(buf, IM_ARRAYSIZE(buf), \"(%d,%d,%d,%d)\", cr, cg, cb, ca);\n        if (Selectable(buf))\n            SetClipboardText(buf);\n        if (flags & ImGuiColorEditFlags_NoAlpha)\n            ImFormatString(buf, IM_ARRAYSIZE(buf), \"0x%02X%02X%02X\", cr, cg, cb);\n        else\n            ImFormatString(buf, IM_ARRAYSIZE(buf), \"0x%02X%02X%02X%02X\", cr, cg, cb, ca);\n        if (Selectable(buf))\n            SetClipboardText(buf);\n        EndPopup();\n    }\n\n    g.ColorEditOptions = opts;\n    EndPopup();\n}\n\nstatic void ColorPickerOptionsPopup(ImGuiColorEditFlags flags, float* ref_col)\n{\n    bool allow_opt_picker = !(flags & ImGuiColorEditFlags__PickerMask);\n    bool allow_opt_alpha_bar = !(flags & ImGuiColorEditFlags_NoAlpha) && !(flags & ImGuiColorEditFlags_AlphaBar);\n    if ((!allow_opt_picker && !allow_opt_alpha_bar) || !ImGui::BeginPopup(\"context\"))\n        return;\n    ImGuiContext& g = *GImGui;\n    if (allow_opt_picker)\n    {\n        ImVec2 picker_size(g.FontSize * 8, ImMax(g.FontSize * 8 - (SmallSquareSize() + g.Style.ItemInnerSpacing.x), 1.0f)); // FIXME: Picker size copied from main picker function\n        ImGui::PushItemWidth(picker_size.x);\n        for (int picker_type = 0; picker_type < 2; picker_type++)\n        {\n            // Draw small/thumbnail version of each picker type (over an invisible button for selection)\n            if (picker_type > 0) ImGui::Separator();\n            ImGui::PushID(picker_type);\n            ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoInputs|ImGuiColorEditFlags_NoOptions|ImGuiColorEditFlags_NoLabel|ImGuiColorEditFlags_NoSidePreview|(flags & ImGuiColorEditFlags_NoAlpha);\n            if (picker_type == 0) picker_flags |= ImGuiColorEditFlags_PickerHueBar;\n            if (picker_type == 1) picker_flags |= ImGuiColorEditFlags_PickerHueWheel;\n            ImVec2 backup_pos = ImGui::GetCursorScreenPos();\n            if (ImGui::Selectable(\"##selectable\", false, 0, picker_size)) // By default, Selectable() is closing popup\n                g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags__PickerMask) | (picker_flags & ImGuiColorEditFlags__PickerMask);\n            ImGui::SetCursorScreenPos(backup_pos);\n            ImVec4 dummy_ref_col;\n            memcpy(&dummy_ref_col.x, ref_col, sizeof(float) * (picker_flags & ImGuiColorEditFlags_NoAlpha ? 3 : 4));\n            ImGui::ColorPicker4(\"##dummypicker\", &dummy_ref_col.x, picker_flags);\n            ImGui::PopID();\n        }\n        ImGui::PopItemWidth();\n    }\n    if (allow_opt_alpha_bar)\n    {\n        if (allow_opt_picker) ImGui::Separator();\n        ImGui::CheckboxFlags(\"Alpha Bar\", (unsigned int*)&g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar);\n    }\n    ImGui::EndPopup();\n}\n\n// Edit colors components (each component in 0.0f..1.0f range). \n// See enum ImGuiColorEditFlags_ for available options. e.g. Only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set.\n// With typical options: Left-click on colored square to open color picker. Right-click to open option menu. CTRL-Click over input fields to edit them and TAB to go to next item.\nbool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return false;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiStyle& style = g.Style;\n    const float square_sz = SmallSquareSize();\n    const float w_extra = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x);\n    const float w_items_all = CalcItemWidth() - w_extra;\n    const char* label_display_end = FindRenderedTextEnd(label);\n\n    const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0;\n    const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0;\n    const int components = alpha ? 4 : 3;\n    const ImGuiColorEditFlags flags_untouched = flags;\n\n    BeginGroup();\n    PushID(label);\n\n    // If we're not showing any slider there's no point in doing any HSV conversions\n    if (flags & ImGuiColorEditFlags_NoInputs)\n        flags = (flags & (~ImGuiColorEditFlags__InputsMask)) | ImGuiColorEditFlags_RGB | ImGuiColorEditFlags_NoOptions;\n\n    // Context menu: display and modify options (before defaults are applied)\n    if (!(flags & ImGuiColorEditFlags_NoOptions))\n        ColorEditOptionsPopup(col, flags);\n \n    // Read stored options\n    if (!(flags & ImGuiColorEditFlags__InputsMask))\n        flags |= (g.ColorEditOptions & ImGuiColorEditFlags__InputsMask);\n    if (!(flags & ImGuiColorEditFlags__DataTypeMask))\n        flags |= (g.ColorEditOptions & ImGuiColorEditFlags__DataTypeMask);\n    if (!(flags & ImGuiColorEditFlags__PickerMask))\n        flags |= (g.ColorEditOptions & ImGuiColorEditFlags__PickerMask);\n    flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags__InputsMask | ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask));\n\n    // Convert to the formats we need\n    float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f };\n    if (flags & ImGuiColorEditFlags_HSV)\n        ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]);\n    int i[4] = { IM_F32_TO_INT8_UNBOUND(f[0]), IM_F32_TO_INT8_UNBOUND(f[1]), IM_F32_TO_INT8_UNBOUND(f[2]), IM_F32_TO_INT8_UNBOUND(f[3]) };\n\n    bool value_changed = false;\n    bool value_changed_as_float = false;\n\n    if ((flags & (ImGuiColorEditFlags_RGB | ImGuiColorEditFlags_HSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0)\n    {\n        // RGB/HSV 0..255 Sliders\n        const float w_item_one  = ImMax(1.0f, (float)(int)((w_items_all - (style.ItemInnerSpacing.x) * (components-1)) / (float)components));\n        const float w_item_last = ImMax(1.0f, (float)(int)(w_items_all - (w_item_one + style.ItemInnerSpacing.x) * (components-1)));\n\n        const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? \"M:0.000\" : \"M:000\").x);\n        const char* ids[4] = { \"##X\", \"##Y\", \"##Z\", \"##W\" };\n        const char* fmt_table_int[3][4] =\n        {\n            {   \"%3.0f\",   \"%3.0f\",   \"%3.0f\",   \"%3.0f\" }, // Short display\n            { \"R:%3.0f\", \"G:%3.0f\", \"B:%3.0f\", \"A:%3.0f\" }, // Long display for RGBA\n            { \"H:%3.0f\", \"S:%3.0f\", \"V:%3.0f\", \"A:%3.0f\" }  // Long display for HSVA\n        };\n        const char* fmt_table_float[3][4] =\n        {\n            {   \"%0.3f\",   \"%0.3f\",   \"%0.3f\",   \"%0.3f\" }, // Short display\n            { \"R:%0.3f\", \"G:%0.3f\", \"B:%0.3f\", \"A:%0.3f\" }, // Long display for RGBA\n            { \"H:%0.3f\", \"S:%0.3f\", \"V:%0.3f\", \"A:%0.3f\" }  // Long display for HSVA\n        };\n        const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_HSV) ? 2 : 1;\n\n        PushItemWidth(w_item_one);\n        for (int n = 0; n < components; n++)\n        {\n            if (n > 0)\n                SameLine(0, style.ItemInnerSpacing.x);\n            if (n + 1 == components)\n                PushItemWidth(w_item_last);\n            if (flags & ImGuiColorEditFlags_Float)\n                value_changed = value_changed_as_float = value_changed | DragFloat(ids[n], &f[n], 1.0f/255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]);\n            else\n                value_changed |= DragInt(ids[n], &i[n], 1.0f, 0, hdr ? 0 : 255, fmt_table_int[fmt_idx][n]);\n            if (!(flags & ImGuiColorEditFlags_NoOptions))\n                OpenPopupOnItemClick(\"context\");\n        }\n        PopItemWidth();\n        PopItemWidth();\n    }\n    else if ((flags & ImGuiColorEditFlags_HEX) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0)\n    {\n        // RGB Hexadecimal Input\n        char buf[64];\n        if (alpha)\n            ImFormatString(buf, IM_ARRAYSIZE(buf), \"#%02X%02X%02X%02X\", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255), ImClamp(i[3],0,255));\n        else\n            ImFormatString(buf, IM_ARRAYSIZE(buf), \"#%02X%02X%02X\", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255));\n        PushItemWidth(w_items_all);\n        if (InputText(\"##Text\", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase))\n        {\n            value_changed = true;\n            char* p = buf;\n            while (*p == '#' || ImCharIsSpace(*p))\n                p++;\n            i[0] = i[1] = i[2] = i[3] = 0;\n            if (alpha)\n                sscanf(p, \"%02X%02X%02X%02X\", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2], (unsigned int*)&i[3]); // Treat at unsigned (%X is unsigned)\n            else\n                sscanf(p, \"%02X%02X%02X\", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2]);\n        }\n        if (!(flags & ImGuiColorEditFlags_NoOptions))\n            OpenPopupOnItemClick(\"context\");\n        PopItemWidth();\n    }\n\n    bool picker_active = false;\n    if (!(flags & ImGuiColorEditFlags_NoSmallPreview))\n    {\n        if (!(flags & ImGuiColorEditFlags_NoInputs))\n            SameLine(0, style.ItemInnerSpacing.x);\n\n        const ImVec4 col_v4(col[0], col[1], col[2], alpha ? col[3] : 1.0f);\n        if (ColorButton(\"##ColorButton\", col_v4, flags))\n        {\n            if (!(flags & ImGuiColorEditFlags_NoPicker))\n            {\n                // Store current color and open a picker\n                g.ColorPickerRef = col_v4;\n                OpenPopup(\"picker\");\n                SetNextWindowPos(window->DC.LastItemRect.GetBL() + ImVec2(-1,style.ItemSpacing.y));\n            }\n        }\n        if (!(flags & ImGuiColorEditFlags_NoOptions))\n            OpenPopupOnItemClick(\"context\");\n        \n        if (BeginPopup(\"picker\"))\n        {\n            picker_active = true;\n            if (label != label_display_end)\n            {\n                TextUnformatted(label, label_display_end);\n                Separator();\n            }\n            ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar;\n            ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags__InputsMask | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf;\n            PushItemWidth(square_sz * 12.0f); // Use 256 + bar sizes?\n            value_changed |= ColorPicker4(\"##picker\", col, picker_flags, &g.ColorPickerRef.x);\n            PopItemWidth();\n            EndPopup();\n        }\n    }\n\n    if (label != label_display_end && !(flags & ImGuiColorEditFlags_NoLabel))\n    {\n        SameLine(0, style.ItemInnerSpacing.x);\n        TextUnformatted(label, label_display_end);\n    }\n\n    // Convert back\n    if (!picker_active)\n    {\n        if (!value_changed_as_float) \n            for (int n = 0; n < 4; n++)\n                f[n] = i[n] / 255.0f;\n        if (flags & ImGuiColorEditFlags_HSV)\n            ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]);\n        if (value_changed)\n        {\n            col[0] = f[0];\n            col[1] = f[1];\n            col[2] = f[2];\n            if (alpha)\n                col[3] = f[3];\n        }\n    }\n\n    PopID();\n    EndGroup();\n\n    return value_changed;\n}\n\nbool ImGui::ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags)\n{\n    float col4[4] = { col[0], col[1], col[2], 1.0f };\n    if (!ColorPicker4(label, col4, flags | ImGuiColorEditFlags_NoAlpha))\n        return false;\n    col[0] = col4[0]; col[1] = col4[1]; col[2] = col4[2];\n    return true;\n}\n\n// 'pos' is position of the arrow tip. half_sz.x is length from base to tip. half_sz.y is length on each side.\nstatic void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col)\n{\n    switch (direction)\n    {\n    case ImGuiDir_Left:  draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), pos, col); return;\n    case ImGuiDir_Right: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), pos, col); return;\n    case ImGuiDir_Up:    draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), pos, col); return;\n    case ImGuiDir_Down:  draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), pos, col); return;\n    default: return; // Fix warning for ImGuiDir_None\n    }\n}\n\nstatic void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w)\n{\n    RenderArrow(draw_list, ImVec2(pos.x + half_sz.x + 1,         pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32_BLACK);\n    RenderArrow(draw_list, ImVec2(pos.x + half_sz.x,             pos.y), half_sz,                              ImGuiDir_Right, IM_COL32_WHITE);\n    RenderArrow(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left,  IM_COL32_BLACK);\n    RenderArrow(draw_list, ImVec2(pos.x + bar_w - half_sz.x,     pos.y), half_sz,                              ImGuiDir_Left,  IM_COL32_WHITE);\n}\n\n// ColorPicker\n// Note: only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set.\n// FIXME: we adjust the big color square height based on item width, which may cause a flickering feedback loop (if automatic height makes a vertical scrollbar appears, affecting automatic width..) \nbool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags, const float* ref_col)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n    ImDrawList* draw_list = window->DrawList;\n\n    ImGuiStyle& style = g.Style;\n    ImGuiIO& io = g.IO;\n\n    PushID(label);\n    BeginGroup();\n\n    if (!(flags & ImGuiColorEditFlags_NoSidePreview))\n        flags |= ImGuiColorEditFlags_NoSmallPreview;\n\n    // Context menu: display and store options.\n    if (!(flags & ImGuiColorEditFlags_NoOptions))\n        ColorPickerOptionsPopup(flags, col);\n\n    // Read stored options\n    if (!(flags & ImGuiColorEditFlags__PickerMask))\n        flags |= ((g.ColorEditOptions & ImGuiColorEditFlags__PickerMask) ? g.ColorEditOptions : ImGuiColorEditFlags__OptionsDefault) & ImGuiColorEditFlags__PickerMask; \n    IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__PickerMask))); // Check that only 1 is selected\n    if (!(flags & ImGuiColorEditFlags_NoOptions))\n        flags |= (g.ColorEditOptions & ImGuiColorEditFlags_AlphaBar);\n\n    // Setup\n    bool alpha_bar = (flags & ImGuiColorEditFlags_AlphaBar) && !(flags & ImGuiColorEditFlags_NoAlpha);\n    ImVec2 picker_pos = window->DC.CursorPos;\n    float square_sz = SmallSquareSize();\n    float bars_width = square_sz; // Arbitrary smallish width of Hue/Alpha picking bars\n    float sv_picker_size = ImMax(bars_width * 1, CalcItemWidth() - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box\n    float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x;\n    float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x;\n    float bars_triangles_half_sz = (float)(int)(bars_width * 0.20f);\n\n    float wheel_thickness = sv_picker_size * 0.08f;\n    float wheel_r_outer = sv_picker_size * 0.50f;\n    float wheel_r_inner = wheel_r_outer - wheel_thickness;\n    ImVec2 wheel_center(picker_pos.x + (sv_picker_size + bars_width)*0.5f, picker_pos.y + sv_picker_size*0.5f);\n    \n    // Note: the triangle is displayed rotated with triangle_pa pointing to Hue, but most coordinates stays unrotated for logic.\n    float triangle_r = wheel_r_inner - (int)(sv_picker_size * 0.027f);\n    ImVec2 triangle_pa = ImVec2(triangle_r, 0.0f); // Hue point.\n    ImVec2 triangle_pb = ImVec2(triangle_r * -0.5f, triangle_r * -0.866025f); // Black point.\n    ImVec2 triangle_pc = ImVec2(triangle_r * -0.5f, triangle_r * +0.866025f); // White point.\n\n    float H,S,V;\n    ColorConvertRGBtoHSV(col[0], col[1], col[2], H, S, V);\n\n    bool value_changed = false, value_changed_h = false, value_changed_sv = false;\n\n    if (flags & ImGuiColorEditFlags_PickerHueWheel)\n    {\n        // Hue wheel + SV triangle logic\n        InvisibleButton(\"hsv\", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size));\n        if (IsItemActive())\n        {\n            ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center;\n            ImVec2 current_off = g.IO.MousePos - wheel_center;\n            float initial_dist2 = ImLengthSqr(initial_off);\n            if (initial_dist2 >= (wheel_r_inner-1)*(wheel_r_inner-1) && initial_dist2 <= (wheel_r_outer+1)*(wheel_r_outer+1))\n            {\n                // Interactive with Hue wheel\n                H = atan2f(current_off.y, current_off.x) / IM_PI*0.5f;\n                if (H < 0.0f)\n                    H += 1.0f;\n                value_changed = value_changed_h = true;\n            }\n            float cos_hue_angle = cosf(-H * 2.0f * IM_PI);\n            float sin_hue_angle = sinf(-H * 2.0f * IM_PI);\n            if (ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, ImRotate(initial_off, cos_hue_angle, sin_hue_angle)))\n            {\n                // Interacting with SV triangle\n                ImVec2 current_off_unrotated = ImRotate(current_off, cos_hue_angle, sin_hue_angle);\n                if (!ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated))\n                    current_off_unrotated = ImTriangleClosestPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated);\n                float uu, vv, ww;\n                ImTriangleBarycentricCoords(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated, uu, vv, ww);\n                V = ImClamp(1.0f - vv, 0.0001f, 1.0f);\n                S = ImClamp(uu / V, 0.0001f, 1.0f);\n                value_changed = value_changed_sv = true;\n            }\n        }\n        if (!(flags & ImGuiColorEditFlags_NoOptions))\n            OpenPopupOnItemClick(\"context\");\n    }\n    else if (flags & ImGuiColorEditFlags_PickerHueBar)\n    {\n        // SV rectangle logic\n        InvisibleButton(\"sv\", ImVec2(sv_picker_size, sv_picker_size));\n        if (IsItemActive())\n        {\n            S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size-1));\n            V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1));\n            value_changed = value_changed_sv = true;\n        }\n        if (!(flags & ImGuiColorEditFlags_NoOptions))\n            OpenPopupOnItemClick(\"context\");\n\n        // Hue bar logic\n        SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y));\n        InvisibleButton(\"hue\", ImVec2(bars_width, sv_picker_size));\n        if (IsItemActive())\n        {\n            H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1));\n            value_changed = value_changed_h = true;\n        }\n    }\n\n    // Alpha bar logic\n    if (alpha_bar)\n    {\n        SetCursorScreenPos(ImVec2(bar1_pos_x, picker_pos.y));\n        InvisibleButton(\"alpha\", ImVec2(bars_width, sv_picker_size));\n        if (IsItemActive())\n        {\n            col[3] = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1));\n            value_changed = true;\n        }\n    }\n\n    if (!(flags & ImGuiColorEditFlags_NoSidePreview))\n    {\n        SameLine(0, style.ItemInnerSpacing.x);\n        BeginGroup();\n    }\n\n    if (!(flags & ImGuiColorEditFlags_NoLabel))\n    {\n        const char* label_display_end = FindRenderedTextEnd(label);\n        if (label != label_display_end)\n        {\n            if ((flags & ImGuiColorEditFlags_NoSidePreview))\n                SameLine(0, style.ItemInnerSpacing.x);\n            TextUnformatted(label, label_display_end);\n        }\n    }\n\n    if (!(flags & ImGuiColorEditFlags_NoSidePreview))\n    {\n        ImVec4 col_v4(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]);\n        if ((flags & ImGuiColorEditFlags_NoLabel))\n            Text(\"Current\");\n        ColorButton(\"##current\", col_v4, (flags & (ImGuiColorEditFlags_HDR|ImGuiColorEditFlags_AlphaPreview|ImGuiColorEditFlags_AlphaPreviewHalf|ImGuiColorEditFlags_NoTooltip)), ImVec2(square_sz * 3, square_sz * 2));\n        if (ref_col != NULL)\n        {\n            Text(\"Original\");\n            ImVec4 ref_col_v4(ref_col[0], ref_col[1], ref_col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : ref_col[3]);\n            if (ColorButton(\"##original\", ref_col_v4, (flags & (ImGuiColorEditFlags_HDR|ImGuiColorEditFlags_AlphaPreview|ImGuiColorEditFlags_AlphaPreviewHalf|ImGuiColorEditFlags_NoTooltip)), ImVec2(square_sz * 3, square_sz * 2)))\n            {\n                memcpy(col, ref_col, ((flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4) * sizeof(float));\n                value_changed = true;\n            }\n        }\n        EndGroup();\n    }\n\n    // Convert back color to RGB\n    if (value_changed_h || value_changed_sv)\n        ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10*1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]);\n\n    // R,G,B and H,S,V slider color editor\n    if ((flags & ImGuiColorEditFlags_NoInputs) == 0)\n    {\n        PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x);\n        ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf;\n        ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker;\n        if (flags & ImGuiColorEditFlags_RGB || (flags & ImGuiColorEditFlags__InputsMask) == 0)\n            value_changed |= ColorEdit4(\"##rgb\", col, sub_flags | ImGuiColorEditFlags_RGB);\n        if (flags & ImGuiColorEditFlags_HSV || (flags & ImGuiColorEditFlags__InputsMask) == 0)\n            value_changed |= ColorEdit4(\"##hsv\", col, sub_flags | ImGuiColorEditFlags_HSV);\n        if (flags & ImGuiColorEditFlags_HEX || (flags & ImGuiColorEditFlags__InputsMask) == 0)\n            value_changed |= ColorEdit4(\"##hex\", col, sub_flags | ImGuiColorEditFlags_HEX);\n        PopItemWidth();\n    }\n\n    // Try to cancel hue wrap (after ColorEdit), if any\n    if (value_changed)\n    {\n        float new_H, new_S, new_V;\n        ColorConvertRGBtoHSV(col[0], col[1], col[2], new_H, new_S, new_V);\n        if (new_H <= 0 && H > 0) \n        {\n            if (new_V <= 0 && V != new_V)\n                ColorConvertHSVtoRGB(H, S, new_V <= 0 ? V * 0.5f : new_V, col[0], col[1], col[2]);\n            else if (new_S <= 0)\n                ColorConvertHSVtoRGB(H, new_S <= 0 ? S * 0.5f : new_S, new_V, col[0], col[1], col[2]);\n        }\n    }\n\n    ImVec4 hue_color_f(1, 1, 1, 1); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z);\n    ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f);\n    ImU32 col32_no_alpha = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 1.0f));\n\n    const ImU32 hue_colors[6+1] = { IM_COL32(255,0,0,255), IM_COL32(255,255,0,255), IM_COL32(0,255,0,255), IM_COL32(0,255,255,255), IM_COL32(0,0,255,255), IM_COL32(255,0,255,255), IM_COL32(255,0,0,255) };\n    ImVec2 sv_cursor_pos;\n    \n    if (flags & ImGuiColorEditFlags_PickerHueWheel)\n    {\n        // Render Hue Wheel\n        const float aeps = 1.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out).\n        const int segment_per_arc = ImMax(4, (int)wheel_r_outer / 12);\n        for (int n = 0; n < 6; n++)\n        {\n            const float a0 = (n)     /6.0f * 2.0f * IM_PI - aeps;\n            const float a1 = (n+1.0f)/6.0f * 2.0f * IM_PI + aeps;\n            const int vert_start_idx = draw_list->VtxBuffer.Size;\n            draw_list->PathArcTo(wheel_center, (wheel_r_inner + wheel_r_outer)*0.5f, a0, a1, segment_per_arc);\n            draw_list->PathStroke(IM_COL32_WHITE, false, wheel_thickness);\n            const int vert_end_idx = draw_list->VtxBuffer.Size;\n\n            // Paint colors over existing vertices\n            ImVec2 gradient_p0(wheel_center.x + cosf(a0) * wheel_r_inner, wheel_center.y + sinf(a0) * wheel_r_inner);\n            ImVec2 gradient_p1(wheel_center.x + cosf(a1) * wheel_r_inner, wheel_center.y + sinf(a1) * wheel_r_inner);\n            ShadeVertsLinearColorGradientKeepAlpha(draw_list->VtxBuffer.Data + vert_start_idx, draw_list->VtxBuffer.Data + vert_end_idx, gradient_p0, gradient_p1, hue_colors[n], hue_colors[n+1]);\n        }\n\n        // Render Cursor + preview on Hue Wheel\n        float cos_hue_angle = cosf(H * 2.0f * IM_PI);\n        float sin_hue_angle = sinf(H * 2.0f * IM_PI);\n        ImVec2 hue_cursor_pos(wheel_center.x + cos_hue_angle * (wheel_r_inner+wheel_r_outer)*0.5f, wheel_center.y + sin_hue_angle * (wheel_r_inner+wheel_r_outer)*0.5f);\n        float hue_cursor_rad = value_changed_h ? wheel_thickness * 0.65f : wheel_thickness * 0.55f;\n        int hue_cursor_segments = ImClamp((int)(hue_cursor_rad / 1.4f), 9, 32);\n        draw_list->AddCircleFilled(hue_cursor_pos, hue_cursor_rad, hue_color32, hue_cursor_segments);\n        draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad+1, IM_COL32(128,128,128,255), hue_cursor_segments);\n        draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, IM_COL32_WHITE, hue_cursor_segments);\n\n        // Render SV triangle (rotated according to hue)\n        ImVec2 tra = wheel_center + ImRotate(triangle_pa, cos_hue_angle, sin_hue_angle);\n        ImVec2 trb = wheel_center + ImRotate(triangle_pb, cos_hue_angle, sin_hue_angle);\n        ImVec2 trc = wheel_center + ImRotate(triangle_pc, cos_hue_angle, sin_hue_angle);\n        ImVec2 uv_white = g.FontTexUvWhitePixel;\n        draw_list->PrimReserve(6, 6);\n        draw_list->PrimVtx(tra, uv_white, hue_color32);\n        draw_list->PrimVtx(trb, uv_white, hue_color32);\n        draw_list->PrimVtx(trc, uv_white, IM_COL32_WHITE);\n        draw_list->PrimVtx(tra, uv_white, IM_COL32_BLACK_TRANS);\n        draw_list->PrimVtx(trb, uv_white, IM_COL32_BLACK);\n        draw_list->PrimVtx(trc, uv_white, IM_COL32_BLACK_TRANS);\n        draw_list->AddTriangle(tra, trb, trc, IM_COL32(128,128,128,255), 1.5f);\n        sv_cursor_pos = ImLerp(ImLerp(trc, tra, ImSaturate(S)), trb, ImSaturate(1 - V));\n    }\n    else if (flags & ImGuiColorEditFlags_PickerHueBar)\n    {\n        // Render SV Square\n        draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_WHITE, hue_color32, hue_color32, IM_COL32_WHITE);\n        draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_BLACK_TRANS, IM_COL32_BLACK_TRANS, IM_COL32_BLACK, IM_COL32_BLACK);\n        RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), 0.0f);\n        sv_cursor_pos.x = ImClamp((float)(int)(picker_pos.x + ImSaturate(S)     * sv_picker_size + 0.5f), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much\n        sv_cursor_pos.y = ImClamp((float)(int)(picker_pos.y + ImSaturate(1 - V) * sv_picker_size + 0.5f), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2);\n\n        // Render Hue Bar\n        for (int i = 0; i < 6; ++i)\n            draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), hue_colors[i], hue_colors[i], hue_colors[i + 1], hue_colors[i + 1]);\n        float bar0_line_y = (float)(int)(picker_pos.y + H * sv_picker_size + 0.5f);\n        RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f);\n        RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f);\n    }\n\n    // Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range)\n    float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f;\n    draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, col32_no_alpha, 12);\n    draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad+1, IM_COL32(128,128,128,255), 12);\n    draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, IM_COL32_WHITE, 12);\n\n    // Render alpha bar\n    if (alpha_bar)\n    {\n        float alpha = ImSaturate(col[3]);\n        ImRect bar1_bb(bar1_pos_x, picker_pos.y, bar1_pos_x + bars_width, picker_pos.y + sv_picker_size);\n        RenderColorRectWithAlphaCheckerboard(bar1_bb.Min, bar1_bb.Max, IM_COL32(0,0,0,0), bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f));\n        draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, col32_no_alpha, col32_no_alpha, col32_no_alpha & ~IM_COL32_A_MASK, col32_no_alpha & ~IM_COL32_A_MASK);\n        float bar1_line_y = (float)(int)(picker_pos.y + (1.0f - alpha) * sv_picker_size + 0.5f);\n        RenderFrameBorder(bar1_bb.Min, bar1_bb.Max, 0.0f);\n        RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f);\n    }\n\n    EndGroup();\n    PopID();\n\n    return value_changed;\n}\n\n// Horizontal separating line.\nvoid ImGui::Separator()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n    ImGuiContext& g = *GImGui;\n\n    ImGuiWindowFlags flags = 0;\n    if ((flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical)) == 0)\n        flags |= (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal;\n    IM_ASSERT(ImIsPowerOfTwo((int)(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical))));   // Check that only 1 option is selected\n    if (flags & ImGuiSeparatorFlags_Vertical)\n    {\n        VerticalSeparator();\n        return;\n    }\n\n    // Horizontal Separator\n    if (window->DC.ColumnsCount > 1)\n        PopClipRect();\n\n    float x1 = window->Pos.x;\n    float x2 = window->Pos.x + window->Size.x;\n    if (!window->DC.GroupStack.empty())\n        x1 += window->DC.IndentX;\n\n    const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y+1.0f));\n    ItemSize(ImVec2(0.0f, 0.0f)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit, we don't provide height to not alter layout.\n    if (!ItemAdd(bb, 0))\n    {\n        if (window->DC.ColumnsCount > 1)\n            PushColumnClipRect();\n        return;\n    }\n\n    window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x,bb.Min.y), GetColorU32(ImGuiCol_Separator));\n\n    if (g.LogEnabled)\n            LogRenderedText(NULL, IM_NEWLINE \"--------------------------------\");\n\n    if (window->DC.ColumnsCount > 1)\n    {\n        PushColumnClipRect();\n        window->DC.ColumnsCellMinY = window->DC.CursorPos.y;\n    }\n}\n\nvoid ImGui::VerticalSeparator()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n    ImGuiContext& g = *GImGui;\n\n    float y1 = window->DC.CursorPos.y;\n    float y2 = window->DC.CursorPos.y + window->DC.CurrentLineHeight; \n    const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + 1.0f, y2));\n    ItemSize(ImVec2(bb.GetWidth(), 0.0f));\n    if (!ItemAdd(bb, 0))\n        return;\n\n    window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator));\n    if (g.LogEnabled)\n        LogText(\" |\");\n}\n\nbool ImGui::SplitterBehavior(ImGuiID id, const ImRect& bb, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n\n    const ImGuiItemFlags item_flags_backup = window->DC.ItemFlags;\n#ifdef IMGUI_HAS_NAV\n    window->DC.ItemFlags |= ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus;\n#endif\n    bool add = ItemAdd(bb, id);\n    window->DC.ItemFlags = item_flags_backup;\n    if (!add)\n        return false;\n\n    bool hovered, held;\n    ImRect bb_interact = bb;\n    bb_interact.Expand(axis == ImGuiAxis_Y ? ImVec2(0.0f, hover_extend) : ImVec2(hover_extend, 0.0f));\n    ButtonBehavior(bb_interact, id, &hovered, &held, ImGuiButtonFlags_FlattenChilds | ImGuiButtonFlags_AllowOverlapMode);\n    if (g.ActiveId != id)\n        SetItemAllowOverlap();\n\n    if (held || (g.HoveredId == id && g.HoveredIdPreviousFrame == id))\n        SetMouseCursor(axis == ImGuiAxis_Y ? ImGuiMouseCursor_ResizeNS : ImGuiMouseCursor_ResizeEW);\n\n    ImRect bb_render = bb;\n    if (held)\n    {\n        ImVec2 mouse_delta_2d = g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min;\n        float mouse_delta = (axis == ImGuiAxis_Y) ? mouse_delta_2d.y : mouse_delta_2d.x;\n\n        // Minimum pane size\n        if (mouse_delta < min_size1 - *size1)\n            mouse_delta = min_size1 - *size1;\n        if (mouse_delta > *size2 - min_size2)\n            mouse_delta = *size2 - min_size2;\n\n        // Apply resize\n        *size1 += mouse_delta;\n        *size2 -= mouse_delta;\n        bb_render.Translate((axis == ImGuiAxis_X) ? ImVec2(mouse_delta, 0.0f) : ImVec2(0.0f, mouse_delta));\n    }\n\n    // Render\n    const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);\n    RenderFrame(bb_render.Min, bb_render.Max, col, true, g.Style.FrameRounding);\n\n    return held;\n}\n\nvoid ImGui::Spacing()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n    ItemSize(ImVec2(0,0));\n}\n\nvoid ImGui::Dummy(const ImVec2& size)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);\n    ItemSize(bb);\n    ItemAdd(bb, 0);\n}\n\nbool ImGui::IsRectVisible(const ImVec2& size)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size));\n}\n\nbool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->ClipRect.Overlaps(ImRect(rect_min, rect_max));\n}\n\n// Lock horizontal starting position + capture group bounding box into one \"item\" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)\nvoid ImGui::BeginGroup()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n\n    window->DC.GroupStack.resize(window->DC.GroupStack.Size + 1);\n    ImGuiGroupData& group_data = window->DC.GroupStack.back();\n    group_data.BackupCursorPos = window->DC.CursorPos;\n    group_data.BackupCursorMaxPos = window->DC.CursorMaxPos;\n    group_data.BackupIndentX = window->DC.IndentX;\n    group_data.BackupGroupOffsetX = window->DC.GroupOffsetX;\n    group_data.BackupCurrentLineHeight = window->DC.CurrentLineHeight;\n    group_data.BackupCurrentLineTextBaseOffset = window->DC.CurrentLineTextBaseOffset;\n    group_data.BackupLogLinePosY = window->DC.LogLinePosY;\n    group_data.BackupActiveIdIsAlive = GImGui->ActiveIdIsAlive;\n    group_data.AdvanceCursor = true;\n\n    window->DC.GroupOffsetX = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffsetX;\n    window->DC.IndentX = window->DC.GroupOffsetX;\n    window->DC.CursorMaxPos = window->DC.CursorPos;\n    window->DC.CurrentLineHeight = 0.0f;\n    window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f;\n}\n\nvoid ImGui::EndGroup()\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n\n    IM_ASSERT(!window->DC.GroupStack.empty());    // Mismatched BeginGroup()/EndGroup() calls\n\n    ImGuiGroupData& group_data = window->DC.GroupStack.back();\n\n    ImRect group_bb(group_data.BackupCursorPos, window->DC.CursorMaxPos);\n    group_bb.Max.y -= g.Style.ItemSpacing.y;      // Cancel out last vertical spacing because we are adding one ourselves.\n    group_bb.Max = ImMax(group_bb.Min, group_bb.Max);\n\n    window->DC.CursorPos = group_data.BackupCursorPos;\n    window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos);\n    window->DC.CurrentLineHeight = group_data.BackupCurrentLineHeight;\n    window->DC.CurrentLineTextBaseOffset = group_data.BackupCurrentLineTextBaseOffset;\n    window->DC.IndentX = group_data.BackupIndentX;\n    window->DC.GroupOffsetX = group_data.BackupGroupOffsetX;\n    window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f;\n\n    if (group_data.AdvanceCursor)\n    {\n        window->DC.CurrentLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrentLineTextBaseOffset);      // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now.\n        ItemSize(group_bb.GetSize(), group_data.BackupCurrentLineTextBaseOffset);\n        ItemAdd(group_bb, 0);\n    }\n\n    // If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive() will be functional on the entire group.\n    // It would be be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but if you search for LastItemId you'll notice it is only used in that context.\n    const bool active_id_within_group = (!group_data.BackupActiveIdIsAlive && g.ActiveIdIsAlive && g.ActiveId && g.ActiveIdWindow->RootWindow == window->RootWindow);\n    if (active_id_within_group)\n        window->DC.LastItemId = g.ActiveId;\n    window->DC.LastItemRect = group_bb;\n\n    window->DC.GroupStack.pop_back();\n\n    //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255));   // [Debug]\n}\n\n// Gets back to previous line and continue with horizontal layout\n//      pos_x == 0      : follow right after previous item\n//      pos_x != 0      : align to specified x position (relative to window/group left)\n//      spacing_w < 0   : use default spacing if pos_x == 0, no spacing if pos_x != 0\n//      spacing_w >= 0  : enforce spacing amount\nvoid ImGui::SameLine(float pos_x, float spacing_w)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    if (pos_x != 0.0f)\n    {\n        if (spacing_w < 0.0f) spacing_w = 0.0f;\n        window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + pos_x + spacing_w + window->DC.GroupOffsetX + window->DC.ColumnsOffsetX;\n        window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y;\n    }\n    else\n    {\n        if (spacing_w < 0.0f) spacing_w = g.Style.ItemSpacing.x;\n        window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w;\n        window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y;\n    }\n    window->DC.CurrentLineHeight = window->DC.PrevLineHeight;\n    window->DC.CurrentLineTextBaseOffset = window->DC.PrevLineTextBaseOffset;\n}\n\nvoid ImGui::NewLine()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    const ImGuiLayoutType backup_layout_type = window->DC.LayoutType;\n    window->DC.LayoutType = ImGuiLayoutType_Vertical;\n    if (window->DC.CurrentLineHeight > 0.0f)     // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height.\n        ItemSize(ImVec2(0,0));\n    else\n        ItemSize(ImVec2(0.0f, g.FontSize));\n    window->DC.LayoutType = backup_layout_type;\n}\n\nvoid ImGui::NextColumn()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    if (window->SkipItems || window->DC.ColumnsCount <= 1)\n        return;\n\n    ImGuiContext& g = *GImGui;\n    PopItemWidth();\n    PopClipRect();\n\n    window->DC.ColumnsCellMaxY = ImMax(window->DC.ColumnsCellMaxY, window->DC.CursorPos.y);\n    if (++window->DC.ColumnsCurrent < window->DC.ColumnsCount)\n    {\n        // Columns 1+ cancel out IndentX\n        window->DC.ColumnsOffsetX = GetColumnOffset(window->DC.ColumnsCurrent) - window->DC.IndentX + g.Style.ItemSpacing.x;\n        window->DrawList->ChannelsSetCurrent(window->DC.ColumnsCurrent);\n    }\n    else\n    {\n        window->DC.ColumnsCurrent = 0;\n        window->DC.ColumnsOffsetX = 0.0f;\n        window->DC.ColumnsCellMinY = window->DC.ColumnsCellMaxY;\n        window->DrawList->ChannelsSetCurrent(0);\n    }\n    window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX);\n    window->DC.CursorPos.y = window->DC.ColumnsCellMinY;\n    window->DC.CurrentLineHeight = 0.0f;\n    window->DC.CurrentLineTextBaseOffset = 0.0f;\n\n    PushColumnClipRect();\n    PushItemWidth(GetColumnWidth() * 0.65f);  // FIXME: Move on columns setup\n}\n\nint ImGui::GetColumnIndex()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.ColumnsCurrent;\n}\n\nint ImGui::GetColumnsCount()\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    return window->DC.ColumnsCount;\n}\n\nstatic float OffsetNormToPixels(ImGuiWindow* window, float offset_norm)\n{\n    return offset_norm * (window->DC.ColumnsMaxX - window->DC.ColumnsMinX);\n}\n\nstatic float PixelsToOffsetNorm(ImGuiWindow* window, float offset)\n{\n    return (offset - window->DC.ColumnsMinX) / (window->DC.ColumnsMaxX - window->DC.ColumnsMinX);\n}\n\nstatic float GetDraggedColumnOffset(int column_index)\n{\n    // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing\n    // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning.\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = g.CurrentWindow;\n    IM_ASSERT(column_index > 0); // We cannot drag column 0. If you get this assert you may have a conflict between the ID of your columns and another widgets.\n    IM_ASSERT(g.ActiveId == window->DC.ColumnsSetId + ImGuiID(column_index));\n\n    float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x - window->Pos.x;\n    x = ImMax(x, ImGui::GetColumnOffset(column_index-1) + g.Style.ColumnsMinSpacing);\n    if ((window->DC.ColumnsFlags & ImGuiColumnsFlags_NoPreserveWidths))\n        x = ImMin(x, ImGui::GetColumnOffset(column_index+1) - g.Style.ColumnsMinSpacing);\n\n    return x;\n}\n\nfloat ImGui::GetColumnOffset(int column_index)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    if (column_index < 0)\n        column_index = window->DC.ColumnsCurrent;\n\n    /*\n    if (g.ActiveId)\n    {\n        ImGuiContext& g = *GImGui;\n        const ImGuiID column_id = window->DC.ColumnsSetId + ImGuiID(column_index);\n        if (g.ActiveId == column_id)\n            return GetDraggedColumnOffset(column_index);\n    }\n    */\n\n    IM_ASSERT(column_index < window->DC.ColumnsData.Size);\n    const float t = window->DC.ColumnsData[column_index].OffsetNorm;\n    const float x_offset = ImLerp(window->DC.ColumnsMinX, window->DC.ColumnsMaxX, t);\n    return x_offset;\n}\n\nvoid ImGui::SetColumnOffset(int column_index, float offset)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n    if (column_index < 0)\n        column_index = window->DC.ColumnsCurrent;\n\n    IM_ASSERT(column_index < window->DC.ColumnsData.Size);\n\n    const bool preserve_width = !(window->DC.ColumnsFlags & ImGuiColumnsFlags_NoPreserveWidths) && (column_index < window->DC.ColumnsCount-1);\n    const float width = preserve_width ? GetColumnWidth(column_index) : 0.0f;\n\n    if (!(window->DC.ColumnsFlags & ImGuiColumnsFlags_NoForceWithinWindow))\n        offset = ImMin(offset, window->DC.ColumnsMaxX - g.Style.ColumnsMinSpacing * (window->DC.ColumnsCount - column_index));\n    const float offset_norm = PixelsToOffsetNorm(window, offset);\n\n    const ImGuiID column_id = window->DC.ColumnsSetId + ImGuiID(column_index);\n    window->DC.StateStorage->SetFloat(column_id, offset_norm);\n    window->DC.ColumnsData[column_index].OffsetNorm = offset_norm;\n\n    if (preserve_width)\n        SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width));\n}\n\nfloat ImGui::GetColumnWidth(int column_index)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    if (column_index < 0)\n        column_index = window->DC.ColumnsCurrent;\n\n    return OffsetNormToPixels(window, window->DC.ColumnsData[column_index+1].OffsetNorm - window->DC.ColumnsData[column_index].OffsetNorm);\n}\n\nvoid ImGui::SetColumnWidth(int column_index, float width)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    if (column_index < 0)\n        column_index = window->DC.ColumnsCurrent;\n\n    SetColumnOffset(column_index+1, GetColumnOffset(column_index) + width);\n}\n\nvoid ImGui::PushColumnClipRect(int column_index)\n{\n    ImGuiWindow* window = GetCurrentWindowRead();\n    if (column_index < 0)\n        column_index = window->DC.ColumnsCurrent;\n\n    PushClipRect(window->DC.ColumnsData[column_index].ClipRect.Min, window->DC.ColumnsData[column_index].ClipRect.Max, false);\n}\n\nvoid ImGui::BeginColumns(const char* id, int columns_count, ImGuiColumnsFlags flags)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n\n    IM_ASSERT(columns_count > 1);\n    IM_ASSERT(window->DC.ColumnsCount == 1); // Nested columns are currently not supported\n\n    // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget.\n    // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer.\n    PushID(0x11223347 + (id ? 0 : columns_count));\n    window->DC.ColumnsSetId = window->GetID(id ? id : \"columns\");\n    PopID();\n\n    // Set state for first column\n    window->DC.ColumnsCurrent = 0;\n    window->DC.ColumnsCount = columns_count;\n    window->DC.ColumnsFlags = flags;\n\n    const float content_region_width = (window->SizeContentsExplicit.x != 0.0f) ? (window->SizeContentsExplicit.x) : (window->Size.x -window->ScrollbarSizes.x);\n    window->DC.ColumnsMinX = window->DC.IndentX - g.Style.ItemSpacing.x; // Lock our horizontal range\n    //window->DC.ColumnsMaxX = content_region_width - window->Scroll.x -((window->Flags & ImGuiWindowFlags_NoScrollbar) ? 0 : g.Style.ScrollbarSize);// - window->WindowPadding().x;\n    window->DC.ColumnsMaxX = content_region_width - window->Scroll.x;\n    window->DC.ColumnsStartPosY = window->DC.CursorPos.y;\n    window->DC.ColumnsStartMaxPosX = window->DC.CursorMaxPos.x;\n    window->DC.ColumnsCellMinY = window->DC.ColumnsCellMaxY = window->DC.CursorPos.y;\n    window->DC.ColumnsOffsetX = 0.0f;\n    window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX);\n\n    // Cache column offsets\n    window->DC.ColumnsData.resize(columns_count + 1);\n    for (int column_index = 0; column_index < columns_count + 1; column_index++)\n    {\n        const ImGuiID column_id = window->DC.ColumnsSetId + ImGuiID(column_index);\n        KeepAliveID(column_id);\n        const float default_t = column_index / (float)window->DC.ColumnsCount;\n        float t = window->DC.StateStorage->GetFloat(column_id, default_t);\n        if (!(window->DC.ColumnsFlags & ImGuiColumnsFlags_NoForceWithinWindow))\n            t = ImMin(t, PixelsToOffsetNorm(window, window->DC.ColumnsMaxX - g.Style.ColumnsMinSpacing * (window->DC.ColumnsCount - column_index)));\n        window->DC.ColumnsData[column_index].OffsetNorm = t;\n    }\n\n    // Cache clipping rectangles\n    for (int column_index = 0; column_index < columns_count; column_index++)\n    {\n        float clip_x1 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(column_index) - 1.0f);\n        float clip_x2 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(column_index + 1) - 1.0f);\n        window->DC.ColumnsData[column_index].ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX);\n        window->DC.ColumnsData[column_index].ClipRect.ClipWith(window->ClipRect);\n    }\n\n    window->DrawList->ChannelsSplit(window->DC.ColumnsCount);\n    PushColumnClipRect();\n    PushItemWidth(GetColumnWidth() * 0.65f);\n}\n\nvoid ImGui::EndColumns()\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n    IM_ASSERT(window->DC.ColumnsCount > 1);\n\n    PopItemWidth();\n    PopClipRect();\n    window->DrawList->ChannelsMerge();\n\n    window->DC.ColumnsCellMaxY = ImMax(window->DC.ColumnsCellMaxY, window->DC.CursorPos.y);\n    window->DC.CursorPos.y = window->DC.ColumnsCellMaxY;\n    if (!(window->DC.ColumnsFlags & ImGuiColumnsFlags_GrowParentContentsSize))\n        window->DC.CursorMaxPos.x = ImMax(window->DC.ColumnsStartMaxPosX, window->DC.ColumnsMaxX);  // Restore cursor max pos, as columns don't grow parent\n\n    // Draw columns borders and handle resize\n    if (!(window->DC.ColumnsFlags & ImGuiColumnsFlags_NoBorder) && !window->SkipItems)\n    {\n        const float y1 = window->DC.ColumnsStartPosY;\n        const float y2 = window->DC.CursorPos.y;\n        int dragging_column = -1;\n        for (int i = 1; i < window->DC.ColumnsCount; i++)\n        {\n            float x = window->Pos.x + GetColumnOffset(i);\n            const ImGuiID column_id = window->DC.ColumnsSetId + ImGuiID(i);\n            const float column_hw = 4.0f; // Half-width for interaction\n            const ImRect column_rect(ImVec2(x - column_hw, y1), ImVec2(x + column_hw, y2));\n            if (IsClippedEx(column_rect, column_id, false))\n                continue;\n            \n            bool hovered = false, held = false;\n            if (!(window->DC.ColumnsFlags & ImGuiColumnsFlags_NoResize))\n            {\n                ButtonBehavior(column_rect, column_id, &hovered, &held);\n                if (hovered || held)\n                    g.MouseCursor = ImGuiMouseCursor_ResizeEW;\n                if (held && g.ActiveIdIsJustActivated)\n                    g.ActiveIdClickOffset.x -= column_hw; // Store from center of column line (we used a 8 wide rect for columns clicking). This is used by GetDraggedColumnOffset().\n                if (held)\n                    dragging_column = i;\n            }\n\n            // Draw column\n            // We clip the Y boundaries CPU side because very long triangles are mishandled by some GPU drivers.\n            const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);\n            const float xi = (float)(int)x;\n            window->DrawList->AddLine(ImVec2(xi, ImMax(y1 + 1.0f, window->ClipRect.Min.y)), ImVec2(xi, ImMin(y2, window->ClipRect.Max.y)), col);\n        }\n\n        // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame.\n        if (dragging_column != -1)\n        {\n            float x = GetDraggedColumnOffset(dragging_column);\n            SetColumnOffset(dragging_column, x);\n        }\n    }\n\n    window->DC.ColumnsSetId = 0;\n    window->DC.ColumnsCurrent = 0;\n    window->DC.ColumnsCount = 1;\n    window->DC.ColumnsFlags = 0;\n    window->DC.ColumnsData.resize(0);\n    window->DC.ColumnsOffsetX = 0.0f;\n    window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX);\n}\n\n// [2017/08: This is currently the only public API, while we are working on making BeginColumns/EndColumns user-facing]\nvoid ImGui::Columns(int columns_count, const char* id, bool border)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    IM_ASSERT(columns_count >= 1);\n\n    if (window->DC.ColumnsCount != columns_count && window->DC.ColumnsCount != 1)\n        EndColumns();\n    \n    ImGuiColumnsFlags flags = (border ? 0 : ImGuiColumnsFlags_NoBorder);\n    //flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior\n    if (columns_count != 1)\n        BeginColumns(id, columns_count, flags);\n}\n\nvoid ImGui::Indent(float indent_w)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.IndentX += (indent_w > 0.0f) ? indent_w : g.Style.IndentSpacing;\n    window->DC.CursorPos.x = window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX;\n}\n\nvoid ImGui::Unindent(float indent_w)\n{\n    ImGuiContext& g = *GImGui;\n    ImGuiWindow* window = GetCurrentWindow();\n    window->DC.IndentX -= (indent_w > 0.0f) ? indent_w : g.Style.IndentSpacing;\n    window->DC.CursorPos.x = window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX;\n}\n\nvoid ImGui::TreePush(const char* str_id)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    Indent();\n    window->DC.TreeDepth++;\n    PushID(str_id ? str_id : \"#TreePush\");\n}\n\nvoid ImGui::TreePush(const void* ptr_id)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    Indent();\n    window->DC.TreeDepth++;\n    PushID(ptr_id ? ptr_id : (const void*)\"#TreePush\");\n}\n\nvoid ImGui::TreePushRawID(ImGuiID id)\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    Indent();\n    window->DC.TreeDepth++;\n    window->IDStack.push_back(id);\n}\n\nvoid ImGui::TreePop()\n{\n    ImGuiWindow* window = GetCurrentWindow();\n    Unindent();\n    window->DC.TreeDepth--;\n    PopID();\n}\n\nvoid ImGui::Value(const char* prefix, bool b)\n{\n    Text(\"%s: %s\", prefix, (b ? \"true\" : \"false\"));\n}\n\nvoid ImGui::Value(const char* prefix, int v)\n{\n    Text(\"%s: %d\", prefix, v);\n}\n\nvoid ImGui::Value(const char* prefix, unsigned int v)\n{\n    Text(\"%s: %d\", prefix, v);\n}\n\nvoid ImGui::Value(const char* prefix, float v, const char* float_format)\n{\n    if (float_format)\n    {\n        char fmt[64];\n        ImFormatString(fmt, IM_ARRAYSIZE(fmt), \"%%s: %s\", float_format);\n        Text(fmt, prefix, v);\n    }\n    else\n    {\n        Text(\"%s: %.3f\", prefix, v);\n    }\n}\n\n//-----------------------------------------------------------------------------\n// PLATFORM DEPENDENT HELPERS\n//-----------------------------------------------------------------------------\n\n#if defined(_WIN32) && !defined(_WINDOWS_) && (!defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) || !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS))\n#undef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#endif\n\n// Win32 API clipboard implementation\n#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS)\n\n#ifdef _MSC_VER\n#pragma comment(lib, \"user32\")\n#endif\n\nstatic const char* GetClipboardTextFn_DefaultImpl(void*)\n{\n    static ImVector<char> buf_local;\n    buf_local.clear();\n    if (!OpenClipboard(NULL))\n        return NULL;\n    HANDLE wbuf_handle = GetClipboardData(CF_UNICODETEXT);\n    if (wbuf_handle == NULL)\n    {\n        CloseClipboard();\n        return NULL;\n    }\n    if (ImWchar* wbuf_global = (ImWchar*)GlobalLock(wbuf_handle))\n    {\n        int buf_len = ImTextCountUtf8BytesFromStr(wbuf_global, NULL) + 1;\n        buf_local.resize(buf_len);\n        ImTextStrToUtf8(buf_local.Data, buf_len, wbuf_global, NULL);\n    }\n    GlobalUnlock(wbuf_handle);\n    CloseClipboard();\n    return buf_local.Data;\n}\n\nstatic void SetClipboardTextFn_DefaultImpl(void*, const char* text)\n{\n    if (!OpenClipboard(NULL))\n        return;\n    const int wbuf_length = ImTextCountCharsFromUtf8(text, NULL) + 1;\n    HGLOBAL wbuf_handle = GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(ImWchar));\n    if (wbuf_handle == NULL)\n    {\n        CloseClipboard();\n        return;\n    }\n    ImWchar* wbuf_global = (ImWchar*)GlobalLock(wbuf_handle);\n    ImTextStrFromUtf8(wbuf_global, wbuf_length, text, NULL);\n    GlobalUnlock(wbuf_handle);\n    EmptyClipboard();\n    SetClipboardData(CF_UNICODETEXT, wbuf_handle);\n    CloseClipboard();\n}\n\n#else\n\n// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers\nstatic const char* GetClipboardTextFn_DefaultImpl(void*)\n{\n    ImGuiContext& g = *GImGui;\n    return g.PrivateClipboard.empty() ? NULL : g.PrivateClipboard.begin();\n}\n\n// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers\nstatic void SetClipboardTextFn_DefaultImpl(void*, const char* text)\n{\n    ImGuiContext& g = *GImGui;\n    g.PrivateClipboard.clear();\n    const char* text_end = text + strlen(text);\n    g.PrivateClipboard.resize((int)(text_end - text) + 1);\n    memcpy(&g.PrivateClipboard[0], text, (size_t)(text_end - text));\n    g.PrivateClipboard[(int)(text_end - text)] = 0;\n}\n\n#endif\n\n// Win32 API IME support (for Asian languages, etc.)\n#if defined(_WIN32) && !defined(__GNUC__) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS)\n\n#include <imm.h>\n#ifdef _MSC_VER\n#pragma comment(lib, \"imm32\")\n#endif\n\nstatic void ImeSetInputScreenPosFn_DefaultImpl(int x, int y)\n{\n    // Notify OS Input Method Editor of text input position\n    if (HWND hwnd = (HWND)GImGui->IO.ImeWindowHandle)\n        if (HIMC himc = ImmGetContext(hwnd))\n        {\n            COMPOSITIONFORM cf;\n            cf.ptCurrentPos.x = x;\n            cf.ptCurrentPos.y = y;\n            cf.dwStyle = CFS_FORCE_POSITION;\n            ImmSetCompositionWindow(himc, &cf);\n        }\n}\n\n#else\n\nstatic void ImeSetInputScreenPosFn_DefaultImpl(int, int) {}\n\n#endif\n\n//-----------------------------------------------------------------------------\n// HELP\n//-----------------------------------------------------------------------------\n\nvoid ImGui::ShowMetricsWindow(bool* p_open)\n{\n    if (ImGui::Begin(\"ImGui Metrics\", p_open))\n    {\n        ImGui::Text(\"ImGui %s\", ImGui::GetVersion());\n        ImGui::Text(\"Application average %.3f ms/frame (%.1f FPS)\", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);\n        ImGui::Text(\"%d vertices, %d indices (%d triangles)\", ImGui::GetIO().MetricsRenderVertices, ImGui::GetIO().MetricsRenderIndices, ImGui::GetIO().MetricsRenderIndices / 3);\n        ImGui::Text(\"%d allocations\", ImGui::GetIO().MetricsAllocs);\n        static bool show_clip_rects = true;\n        ImGui::Checkbox(\"Show clipping rectangles when hovering an ImDrawCmd\", &show_clip_rects);\n        ImGui::Separator();\n\n        struct Funcs\n        {\n            static void NodeDrawList(ImDrawList* draw_list, const char* label)\n            {\n                bool node_open = ImGui::TreeNode(draw_list, \"%s: '%s' %d vtx, %d indices, %d cmds\", label, draw_list->_OwnerName ? draw_list->_OwnerName : \"\", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, draw_list->CmdBuffer.Size);\n                if (draw_list == ImGui::GetWindowDrawList())\n                {\n                    ImGui::SameLine();\n                    ImGui::TextColored(ImColor(255,100,100), \"CURRENTLY APPENDING\"); // Can't display stats for active draw list! (we don't have the data double-buffered)\n                    if (node_open) ImGui::TreePop();\n                    return;\n                }\n                if (!node_open)\n                    return;\n\n                ImDrawList* overlay_draw_list = &GImGui->OverlayDrawList;   // Render additional visuals into the top-most draw list\n                overlay_draw_list->PushClipRectFullScreen();\n                int elem_offset = 0;\n                for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++)\n                {\n                    if (pcmd->UserCallback == NULL && pcmd->ElemCount == 0)\n                        continue;\n                    if (pcmd->UserCallback)\n                    {\n                        ImGui::BulletText(\"Callback %p, user_data %p\", pcmd->UserCallback, pcmd->UserCallbackData);\n                        continue;\n                    }\n                    ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL;\n                    bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), \"Draw %-4d %s vtx, tex = %p, clip_rect = (%.0f,%.0f)..(%.0f,%.0f)\", pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? \"indexed\" : \"non-indexed\", pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);\n                    if (show_clip_rects && ImGui::IsItemHovered())\n                    {\n                        ImRect clip_rect = pcmd->ClipRect;\n                        ImRect vtxs_rect;\n                        for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)\n                            vtxs_rect.Add(draw_list->VtxBuffer[idx_buffer ? idx_buffer[i] : i].pos);\n                        clip_rect.Floor(); overlay_draw_list->AddRect(clip_rect.Min, clip_rect.Max, IM_COL32(255,255,0,255));\n                        vtxs_rect.Floor(); overlay_draw_list->AddRect(vtxs_rect.Min, vtxs_rect.Max, IM_COL32(255,0,255,255));\n                    }\n                    if (!pcmd_node_open)\n                        continue;\n                    ImGuiListClipper clipper(pcmd->ElemCount/3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible.\n                    while (clipper.Step())\n                        for (int prim = clipper.DisplayStart, vtx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++)\n                        {\n                            char buf[300];\n                            char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf);\n                            ImVec2 triangles_pos[3];\n                            for (int n = 0; n < 3; n++, vtx_i++)\n                            {\n                                ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[vtx_i] : vtx_i];\n                                triangles_pos[n] = v.pos;\n                                buf_p += ImFormatString(buf_p, (int)(buf_end - buf_p), \"%s %04d { pos = (%8.2f,%8.2f), uv = (%.6f,%.6f), col = %08X }\\n\", (n == 0) ? \"vtx\" : \"   \", vtx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col);\n                            }\n                            ImGui::Selectable(buf, false);\n                            if (ImGui::IsItemHovered())\n                                overlay_draw_list->AddPolyline(triangles_pos, 3, IM_COL32(255,255,0,255), true, 1.0f, false);  // Add triangle without AA, more readable for large-thin triangle\n                        }\n                    ImGui::TreePop();\n                }\n                overlay_draw_list->PopClipRect();\n                ImGui::TreePop();\n            }\n\n            static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label)\n            {\n                if (!ImGui::TreeNode(label, \"%s (%d)\", label, windows.Size))\n                    return;\n                for (int i = 0; i < windows.Size; i++)\n                    Funcs::NodeWindow(windows[i], \"Window\");\n                ImGui::TreePop();\n            }\n\n            static void NodeWindow(ImGuiWindow* window, const char* label)\n            {\n                if (!ImGui::TreeNode(window, \"%s '%s', %d @ 0x%p\", label, window->Name, window->Active || window->WasActive, window))\n                    return;\n                NodeDrawList(window->DrawList, \"DrawList\");\n                ImGui::BulletText(\"Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)\", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y);\n                if (ImGui::IsItemHovered())\n                    GImGui->OverlayDrawList.AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255,255,0,255));\n                ImGui::BulletText(\"Scroll: (%.2f,%.2f)\", window->Scroll.x, window->Scroll.y);\n                ImGui::BulletText(\"Active: %d, WriteAccessed: %d\", window->Active, window->WriteAccessed);\n                if (window->RootWindow != window) NodeWindow(window->RootWindow, \"RootWindow\");\n                if (window->DC.ChildWindows.Size > 0) NodeWindows(window->DC.ChildWindows, \"ChildWindows\");\n                ImGui::BulletText(\"Storage: %d bytes\", window->StateStorage.Data.Size * (int)sizeof(ImGuiStorage::Pair));\n                ImGui::TreePop();\n            }\n        };\n\n        ImGuiContext& g = *GImGui;                // Access private state\n        Funcs::NodeWindows(g.Windows, \"Windows\");\n        if (ImGui::TreeNode(\"DrawList\", \"Active DrawLists (%d)\", g.RenderDrawLists[0].Size))\n        {\n            for (int layer = 0; layer < IM_ARRAYSIZE(g.RenderDrawLists); layer++)\n                for (int i = 0; i < g.RenderDrawLists[layer].Size; i++)\n                    Funcs::NodeDrawList(g.RenderDrawLists[0][i], \"DrawList\");\n            ImGui::TreePop();\n        }\n        if (ImGui::TreeNode(\"Popups\", \"Open Popups Stack (%d)\", g.OpenPopupStack.Size))\n        {\n            for (int i = 0; i < g.OpenPopupStack.Size; i++)\n            {\n                ImGuiWindow* window = g.OpenPopupStack[i].Window;\n                ImGui::BulletText(\"PopupID: %08x, Window: '%s'%s%s\", g.OpenPopupStack[i].PopupId, window ? window->Name : \"NULL\", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? \" ChildWindow\" : \"\", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? \" ChildMenu\" : \"\");\n            }\n            ImGui::TreePop();\n        }\n        if (ImGui::TreeNode(\"Basic state\"))\n        {\n            ImGui::Text(\"HoveredWindow: '%s'\", g.HoveredWindow ? g.HoveredWindow->Name : \"NULL\");\n            ImGui::Text(\"HoveredRootWindow: '%s'\", g.HoveredRootWindow ? g.HoveredRootWindow->Name : \"NULL\");\n            ImGui::Text(\"HoveredId: 0x%08X/0x%08X (%.2f sec)\", g.HoveredId, g.HoveredIdPreviousFrame, g.HoveredIdTimer); // Data is \"in-flight\" so depending on when the Metrics window is called we may see current frame information or not\n            ImGui::Text(\"ActiveId: 0x%08X/0x%08X (%.2f sec)\", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer);\n            ImGui::Text(\"ActiveIdWindow: '%s'\", g.ActiveIdWindow ? g.ActiveIdWindow->Name : \"NULL\");\n            ImGui::Text(\"NavWindow: '%s'\", g.NavWindow ? g.NavWindow->Name : \"NULL\");\n            ImGui::TreePop();\n        }\n    }\n    ImGui::End();\n}\n\n//-----------------------------------------------------------------------------\n\n// Include imgui_user.inl at the end of imgui.cpp to access private data/functions that aren't exposed.\n// Prefer just including imgui_internal.h from your code rather than using this define. If a declaration is missing from imgui_internal.h add it or request it on the github.\n#ifdef IMGUI_INCLUDE_IMGUI_USER_INL\n#include \"imgui_user.inl\"\n#endif\n\n//-----------------------------------------------------------------------------\n"
  },
  {
    "path": "external/imgui/imgui.h",
    "content": "// dear imgui, v1.53 WIP\n// (headers)\n\n// See imgui.cpp file for documentation.\n// See ImGui::ShowTestWindow() in imgui_demo.cpp for demo code.\n// Read 'Programmer guide' in imgui.cpp for notes on how to setup ImGui in your codebase.\n// Get latest version at https://github.com/ocornut/imgui\n\n#pragma once\n\n#if !defined(IMGUI_DISABLE_INCLUDE_IMCONFIG_H) || defined(IMGUI_INCLUDE_IMCONFIG_H)\n#include \"imconfig.h\"       // User-editable configuration file\n#endif\n#include <float.h>          // FLT_MAX\n#include <stdarg.h>         // va_list\n#include <stddef.h>         // ptrdiff_t, NULL\n#include <string.h>         // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp\n\n#define IMGUI_VERSION       \"1.53 WIP\"\n\n// Define attributes of all API symbols declarations, e.g. for DLL under Windows.\n#ifndef IMGUI_API\n#define IMGUI_API\n#endif\n\n// Define assertion handler.\n#ifndef IM_ASSERT\n#include <assert.h>\n#define IM_ASSERT(_EXPR)    assert(_EXPR)\n#endif\n\n// Helpers\n// Some compilers support applying printf-style warnings to user functions.\n#if defined(__clang__) || defined(__GNUC__)\n#define IM_FMTARGS(FMT)             __attribute__((format(printf, FMT, FMT+1)))\n#define IM_FMTLIST(FMT)             __attribute__((format(printf, FMT, 0)))\n#else\n#define IM_FMTARGS(FMT)\n#define IM_FMTLIST(FMT)\n#endif\n#define IM_ARRAYSIZE(_ARR)          ((int)(sizeof(_ARR)/sizeof(*_ARR)))\n\n#if defined(__clang__)\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wold-style-cast\"\n#endif\n\n// Forward declarations\nstruct ImDrawChannel;               // Temporary storage for outputting drawing commands out of order, used by ImDrawList::ChannelsSplit()\nstruct ImDrawCmd;                   // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call)\nstruct ImDrawData;                  // All draw command lists required to render the frame\nstruct ImDrawList;                  // A single draw command list (generally one per window)\nstruct ImDrawVert;                  // A single vertex (20 bytes by default, override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)\nstruct ImFont;                      // Runtime data for a single font within a parent ImFontAtlas\nstruct ImFontAtlas;                 // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader\nstruct ImFontConfig;                // Configuration data when adding a font or merging fonts\nstruct ImColor;                     // Helper functions to create a color that can be converted to either u32 or float4\nstruct ImGuiIO;                     // Main configuration and I/O between your application and ImGui\nstruct ImGuiOnceUponAFrame;         // Simple helper for running a block of code not more than once a frame, used by IMGUI_ONCE_UPON_A_FRAME macro\nstruct ImGuiStorage;                // Simple custom key value storage\nstruct ImGuiStyle;                  // Runtime data for styling/colors\nstruct ImGuiTextFilter;             // Parse and apply text filters. In format \"aaaaa[,bbbb][,ccccc]\"\nstruct ImGuiTextBuffer;             // Text buffer for logging/accumulating text\nstruct ImGuiTextEditCallbackData;   // Shared state of ImGui::InputText() when using custom ImGuiTextEditCallback (rare/advanced use)\nstruct ImGuiSizeConstraintCallbackData;// Structure used to constraint window size in custom ways when using custom ImGuiSizeConstraintCallback (rare/advanced use)\nstruct ImGuiListClipper;            // Helper to manually clip large list of items\nstruct ImGuiContext;                // ImGui context (opaque)\n\n// Typedefs and Enumerations (declared as int for compatibility and to not pollute the top of this file)\ntypedef unsigned int ImU32;         // 32-bit unsigned integer (typically used to store packed colors)\ntypedef unsigned int ImGuiID;       // unique ID used by widgets (typically hashed from a stack of string)\ntypedef unsigned short ImWchar;     // character for keyboard input/display\ntypedef void* ImTextureID;          // user data to identify a texture (this is whatever to you want it to be! read the FAQ about ImTextureID in imgui.cpp)\ntypedef int ImGuiCol;               // enum: a color identifier for styling     // enum ImGuiCol_\ntypedef int ImGuiStyleVar;          // enum: a variable identifier for styling  // enum ImGuiStyleVar_\ntypedef int ImGuiKey;               // enum: a key identifier (ImGui-side enum) // enum ImGuiKey_\ntypedef int ImGuiMouseCursor;       // enum: a mouse cursor identifier          // enum ImGuiMouseCursor_\ntypedef int ImGuiCond;              // enum: a condition for Set*()             // enum ImGuiCond_\ntypedef int ImDrawCornerFlags;      // flags: corner flags for AddRect*() etc.  // enum ImDrawCornerFlags_\ntypedef int ImGuiColorEditFlags;    // flags: color edit flags for Color*()     // enum ImGuiColorEditFlags_\ntypedef int ImGuiWindowFlags;       // flags: window flags for Begin*()         // enum ImGuiWindowFlags_\ntypedef int ImGuiColumnsFlags;      // flags: for *Columns*()                   // enum ImGuiColumnsFlags_\ntypedef int ImGuiInputTextFlags;    // flags: for InputText*()                  // enum ImGuiInputTextFlags_\ntypedef int ImGuiSelectableFlags;   // flags: for Selectable()                  // enum ImGuiSelectableFlags_\ntypedef int ImGuiTreeNodeFlags;     // flags: for TreeNode*(), Collapsing*()    // enum ImGuiTreeNodeFlags_\ntypedef int ImGuiHoveredFlags;      // flags: for IsItemHovered()               // enum ImGuiHoveredFlags_\ntypedef int (*ImGuiTextEditCallback)(ImGuiTextEditCallbackData *data);\ntypedef void (*ImGuiSizeConstraintCallback)(ImGuiSizeConstraintCallbackData* data);\n#ifdef _MSC_VER\ntypedef unsigned __int64 ImU64;     // 64-bit unsigned integer\n#else\ntypedef unsigned long long ImU64;   // 64-bit unsigned integer\n#endif \n\n// Others helpers at bottom of the file:\n// class ImVector<>                 // Lightweight std::vector like class.\n// IMGUI_ONCE_UPON_A_FRAME          // Execute a block of code once per frame only (convenient for creating UI within deep-nested code that runs multiple times)\n\nstruct ImVec2\n{\n    float x, y;\n    ImVec2() { x = y = 0.0f; }\n    ImVec2(float _x, float _y) { x = _x; y = _y; }\n#ifdef IM_VEC2_CLASS_EXTRA          // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec2.\n    IM_VEC2_CLASS_EXTRA\n#endif\n};\n\nstruct ImVec4\n{\n    float x, y, z, w;\n    ImVec4() { x = y = z = w = 0.0f; }\n    ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }\n#ifdef IM_VEC4_CLASS_EXTRA          // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec4.\n    IM_VEC4_CLASS_EXTRA\n#endif\n};\n\n// ImGui end-user API\n// In a namespace so that user can add extra functions in a separate file (e.g. Value() helpers for your vector or common types)\nnamespace ImGui\n{\n    // Main\n    IMGUI_API ImGuiIO&      GetIO();\n    IMGUI_API ImGuiStyle&   GetStyle();\n    IMGUI_API ImDrawData*   GetDrawData();                              // same value as passed to your io.RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame()\n    IMGUI_API void          NewFrame();                                 // start a new ImGui frame, you can submit any command from this point until Render()/EndFrame().\n    IMGUI_API void          Render();                                   // ends the ImGui frame, finalize the draw data, then call your io.RenderDrawListsFn() function if set.\n    IMGUI_API void          EndFrame();                                 // ends the ImGui frame. automatically called by Render(), so most likely don't need to ever call that yourself directly. If you don't need to render you may call EndFrame() but you'll have wasted CPU already. If you don't need to render, better to not create any imgui windows instead!\n    IMGUI_API void          Shutdown();\n\n    // Demo/Debug/Info\n    IMGUI_API void          ShowTestWindow(bool* p_open = NULL);        // create demo/test window. demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application!\n    IMGUI_API void          ShowMetricsWindow(bool* p_open = NULL);     // create metrics window. display ImGui internals: draw commands (with individual draw calls and vertices), window list, basic internal state, etc.\n    IMGUI_API void          ShowStyleEditor(ImGuiStyle* ref = NULL);    // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style)\n    IMGUI_API void          ShowUserGuide();                            // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls).\n\n    // Window\n    IMGUI_API bool          Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);                                                   // push window to the stack and start appending to it. see .cpp for details. return false when window is collapsed, so you can early out in your code. 'bool* p_open' creates a widget on the upper-right to close the window (which sets your bool to false).\n    IMGUI_API void          End();                                                                                                                      // finish appending to current window, pop it off the window stack.\n    IMGUI_API bool          BeginChild(const char* str_id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0);    // begin a scrolling region. size==0.0f: use remaining window size, size<0.0f: use remaining window size minus abs(size). size>0.0f: fixed size. each axis can use a different mode, e.g. ImVec2(0,400).\n    IMGUI_API bool          BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0);            // \"\n    IMGUI_API void          EndChild();\n    IMGUI_API ImVec2        GetContentRegionMax();                                              // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates\n    IMGUI_API ImVec2        GetContentRegionAvail();                                            // == GetContentRegionMax() - GetCursorPos()\n    IMGUI_API float         GetContentRegionAvailWidth();                                       //\n    IMGUI_API ImVec2        GetWindowContentRegionMin();                                        // content boundaries min (roughly (0,0)-Scroll), in window coordinates\n    IMGUI_API ImVec2        GetWindowContentRegionMax();                                        // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates\n    IMGUI_API float         GetWindowContentRegionWidth();                                      //\n    IMGUI_API ImDrawList*   GetWindowDrawList();                                                // get rendering command-list if you want to append your own draw primitives\n    IMGUI_API ImVec2        GetWindowPos();                                                     // get current window position in screen space (useful if you want to do your own drawing via the DrawList api)\n    IMGUI_API ImVec2        GetWindowSize();                                                    // get current window size\n    IMGUI_API float         GetWindowWidth();\n    IMGUI_API float         GetWindowHeight();\n    IMGUI_API bool          IsWindowCollapsed();\n    IMGUI_API bool          IsWindowAppearing();\n    IMGUI_API void          SetWindowFontScale(float scale);                                    // per-window font scale. Adjust IO.FontGlobalScale if you want to scale all windows\n\n    IMGUI_API void          SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0,0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc.\n    IMGUI_API void          SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0);          // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin()\n    IMGUI_API void          SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeConstraintCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Use callback to apply non-trivial programmatic constraints.\n    IMGUI_API void          SetNextWindowContentSize(const ImVec2& size);                       // set next window content size (enforce the range of scrollbars). set axis to 0.0f to leave it automatic. call before Begin()\n    IMGUI_API void          SetNextWindowContentWidth(float width);                             // set next window content width (enforce the range of horizontal scrollbar). call before Begin()\n    IMGUI_API void          SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0);         // set next window collapsed state. call before Begin()\n    IMGUI_API void          SetNextWindowFocus();                                               // set next window to be focused / front-most. call before Begin()\n    IMGUI_API void          SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0);                // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects.\n    IMGUI_API void          SetWindowSize(const ImVec2& size, ImGuiCond cond = 0);              // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0,0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects.    \n    IMGUI_API void          SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0);             // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed().\n    IMGUI_API void          SetWindowFocus();                                                   // (not recommended) set current window to be focused / front-most. prefer using SetNextWindowFocus().\n    IMGUI_API void          SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0);      // set named window position.\n    IMGUI_API void          SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0);    // set named window size. set axis to 0.0f to force an auto-fit on this axis.\n    IMGUI_API void          SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0);   // set named window collapsed state\n    IMGUI_API void          SetWindowFocus(const char* name);                                           // set named window to be focused / front-most. use NULL to remove focus.\n\n    IMGUI_API float         GetScrollX();                                                       // get scrolling amount [0..GetScrollMaxX()]\n    IMGUI_API float         GetScrollY();                                                       // get scrolling amount [0..GetScrollMaxY()]\n    IMGUI_API float         GetScrollMaxX();                                                    // get maximum scrolling amount ~~ ContentSize.X - WindowSize.X\n    IMGUI_API float         GetScrollMaxY();                                                    // get maximum scrolling amount ~~ ContentSize.Y - WindowSize.Y\n    IMGUI_API void          SetScrollX(float scroll_x);                                         // set scrolling amount [0..GetScrollMaxX()]\n    IMGUI_API void          SetScrollY(float scroll_y);                                         // set scrolling amount [0..GetScrollMaxY()]\n    IMGUI_API void          SetScrollHere(float center_y_ratio = 0.5f);                         // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom.\n    IMGUI_API void          SetScrollFromPosY(float pos_y, float center_y_ratio = 0.5f);        // adjust scrolling amount to make given position valid. use GetCursorPos() or GetCursorStartPos()+offset to get valid positions.\n    IMGUI_API void          SetKeyboardFocusHere(int offset = 0);                               // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget.\n    IMGUI_API void          SetStateStorage(ImGuiStorage* tree);                                // replace tree state storage with our own (if you want to manipulate it yourself, typically clear subsection of it)\n    IMGUI_API ImGuiStorage* GetStateStorage();\n\n    // Parameters stacks (shared)\n    IMGUI_API void          PushFont(ImFont* font);                                             // use NULL as a shortcut to push default font\n    IMGUI_API void          PopFont();\n    IMGUI_API void          PushStyleColor(ImGuiCol idx, ImU32 col);\n    IMGUI_API void          PushStyleColor(ImGuiCol idx, const ImVec4& col);\n    IMGUI_API void          PopStyleColor(int count = 1);\n    IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, float val);\n    IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, const ImVec2& val);\n    IMGUI_API void          PopStyleVar(int count = 1);\n    IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx);                                    // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwhise use GetColorU32() to get style color + style alpha.\n    IMGUI_API ImFont*       GetFont();                                                          // get current font\n    IMGUI_API float         GetFontSize();                                                      // get current font size (= height in pixels) of current font with current scale applied\n    IMGUI_API ImVec2        GetFontTexUvWhitePixel();                                           // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API\n    IMGUI_API ImU32         GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f);                  // retrieve given style color with style alpha applied and optional extra alpha multiplier\n    IMGUI_API ImU32         GetColorU32(const ImVec4& col);                                     // retrieve given color with style alpha applied\n    IMGUI_API ImU32         GetColorU32(ImU32 col);                                             // retrieve given color with style alpha applied\n\n    // Parameters stacks (current window)\n    IMGUI_API void          PushItemWidth(float item_width);                                    // width of items for the common item+label case, pixels. 0.0f = default to ~2/3 of windows width, >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)\n    IMGUI_API void          PopItemWidth();\n    IMGUI_API float         CalcItemWidth();                                                    // width of item given pushed settings and current cursor position\n    IMGUI_API void          PushTextWrapPos(float wrap_pos_x = 0.0f);                           // word-wrapping for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space\n    IMGUI_API void          PopTextWrapPos();\n    IMGUI_API void          PushAllowKeyboardFocus(bool allow_keyboard_focus);                  // allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets\n    IMGUI_API void          PopAllowKeyboardFocus();\n    IMGUI_API void          PushButtonRepeat(bool repeat);                                      // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame.\n    IMGUI_API void          PopButtonRepeat();\n\n    // Cursor / Layout\n    IMGUI_API void          Separator();                                                        // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator.\n    IMGUI_API void          SameLine(float pos_x = 0.0f, float spacing_w = -1.0f);              // call between widgets or groups to layout them horizontally\n    IMGUI_API void          NewLine();                                                          // undo a SameLine()\n    IMGUI_API void          Spacing();                                                          // add vertical spacing\n    IMGUI_API void          Dummy(const ImVec2& size);                                          // add a dummy item of given size\n    IMGUI_API void          Indent(float indent_w = 0.0f);                                      // move content position toward the right, by style.IndentSpacing or indent_w if >0\n    IMGUI_API void          Unindent(float indent_w = 0.0f);                                    // move content position back to the left, by style.IndentSpacing or indent_w if >0\n    IMGUI_API void          BeginGroup();                                                       // lock horizontal starting position + capture group bounding box into one \"item\" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)\n    IMGUI_API void          EndGroup();\n    IMGUI_API ImVec2        GetCursorPos();                                                     // cursor position is relative to window position\n    IMGUI_API float         GetCursorPosX();                                                    // \"\n    IMGUI_API float         GetCursorPosY();                                                    // \"\n    IMGUI_API void          SetCursorPos(const ImVec2& local_pos);                              // \"\n    IMGUI_API void          SetCursorPosX(float x);                                             // \"\n    IMGUI_API void          SetCursorPosY(float y);                                             // \"\n    IMGUI_API ImVec2        GetCursorStartPos();                                                // initial cursor position\n    IMGUI_API ImVec2        GetCursorScreenPos();                                               // cursor position in absolute screen coordinates [0..io.DisplaySize] (useful to work with ImDrawList API)\n    IMGUI_API void          SetCursorScreenPos(const ImVec2& pos);                              // cursor position in absolute screen coordinates [0..io.DisplaySize]\n    IMGUI_API void          AlignTextToFramePadding();                                          // vertically align/lower upcoming text to FramePadding.y so that it will aligns to upcoming widgets (call if you have text on a line before regular widgets)\n    IMGUI_API float         GetTextLineHeight();                                                // height of font == GetWindowFontSize()\n    IMGUI_API float         GetTextLineHeightWithSpacing();                                     // distance (in pixels) between 2 consecutive lines of text == GetWindowFontSize() + GetStyle().ItemSpacing.y\n    IMGUI_API float         GetItemsLineHeightWithSpacing();                                    // distance (in pixels) between 2 consecutive lines of standard height widgets == GetWindowFontSize() + GetStyle().FramePadding.y*2 + GetStyle().ItemSpacing.y\n\n    // Columns\n    // You can also use SameLine(pos_x) for simplified columns. The columns API is still work-in-progress and rather lacking.\n    IMGUI_API void          Columns(int count = 1, const char* id = NULL, bool border = true);\n    IMGUI_API void          NextColumn();                                                       // next column, defaults to current row or next row if the current row is finished\n    IMGUI_API int           GetColumnIndex();                                                   // get current column index\n    IMGUI_API float         GetColumnWidth(int column_index = -1);                              // get column width (in pixels). pass -1 to use current column\n    IMGUI_API void          SetColumnWidth(int column_index, float width);                      // set column width (in pixels). pass -1 to use current column\n    IMGUI_API float         GetColumnOffset(int column_index = -1);                             // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetColumnsCount() inclusive. column 0 is typically 0.0f\n    IMGUI_API void          SetColumnOffset(int column_index, float offset_x);                  // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column\n    IMGUI_API int           GetColumnsCount();\n\n    // ID scopes\n    // If you are creating widgets in a loop you most likely want to push a unique identifier (e.g. object pointer, loop index) so ImGui can differentiate them.\n    // You can also use the \"##foobar\" syntax within widget label to distinguish them from each others. Read \"A primer on the use of labels/IDs\" in the FAQ for more details.\n    IMGUI_API void          PushID(const char* str_id);                                         // push identifier into the ID stack. IDs are hash of the entire stack!\n    IMGUI_API void          PushID(const char* str_id_begin, const char* str_id_end);\n    IMGUI_API void          PushID(const void* ptr_id);\n    IMGUI_API void          PushID(int int_id);\n    IMGUI_API void          PopID();\n    IMGUI_API ImGuiID       GetID(const char* str_id);                                          // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself\n    IMGUI_API ImGuiID       GetID(const char* str_id_begin, const char* str_id_end);\n    IMGUI_API ImGuiID       GetID(const void* ptr_id);\n\n    // Widgets: Text\n    IMGUI_API void          TextUnformatted(const char* text, const char* text_end = NULL);               // raw text without formatting. Roughly equivalent to Text(\"%s\", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text.\n    IMGUI_API void          Text(const char* fmt, ...)                                     IM_FMTARGS(1); // simple formatted text\n    IMGUI_API void          TextV(const char* fmt, va_list args)                           IM_FMTLIST(1);\n    IMGUI_API void          TextColored(const ImVec4& col, const char* fmt, ...)           IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor();\n    IMGUI_API void          TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2);\n    IMGUI_API void          TextDisabled(const char* fmt, ...)                             IM_FMTARGS(1); // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor();\n    IMGUI_API void          TextDisabledV(const char* fmt, va_list args)                   IM_FMTLIST(1);\n    IMGUI_API void          TextWrapped(const char* fmt, ...)                              IM_FMTARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize().\n    IMGUI_API void          TextWrappedV(const char* fmt, va_list args)                    IM_FMTLIST(1);\n    IMGUI_API void          LabelText(const char* label, const char* fmt, ...)             IM_FMTARGS(2); // display text+label aligned the same way as value+label widgets\n    IMGUI_API void          LabelTextV(const char* label, const char* fmt, va_list args)   IM_FMTLIST(2);\n    IMGUI_API void          BulletText(const char* fmt, ...)                               IM_FMTARGS(1); // shortcut for Bullet()+Text()\n    IMGUI_API void          BulletTextV(const char* fmt, va_list args)                     IM_FMTLIST(1);\n    IMGUI_API void          Bullet();                                                                     // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses\n\n    // Widgets: Main\n    IMGUI_API bool          Button(const char* label, const ImVec2& size = ImVec2(0,0));            // button\n    IMGUI_API bool          SmallButton(const char* label);                                         // button with FramePadding=(0,0) to easily embed within text\n    IMGUI_API bool          InvisibleButton(const char* str_id, const ImVec2& size);\n    IMGUI_API void          Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0));\n    IMGUI_API bool          ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0),  const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1));    // <0 frame_padding uses default frame padding settings. 0 for no padding\n    IMGUI_API bool          Checkbox(const char* label, bool* v);\n    IMGUI_API bool          CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value);\n    IMGUI_API bool          RadioButton(const char* label, bool active);\n    IMGUI_API bool          RadioButton(const char* label, int* v, int v_button);\n    IMGUI_API bool          Combo(const char* label, int* current_item, const char* const* items, int items_count, int height_in_items = -1);\n    IMGUI_API bool          Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items = -1);    // separate items with \\0, end item-list with \\0\\0\n    IMGUI_API bool          Combo(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);\n    IMGUI_API void          PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float));\n    IMGUI_API void          PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));\n    IMGUI_API void          PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float));\n    IMGUI_API void          PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));\n    IMGUI_API void          ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1,0), const char* overlay = NULL);\n\n    // Widgets: Drags (tip: ctrl+click on a drag box to input with keyboard. manually input values aren't clamped, can go off-bounds)\n    // For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x\n    IMGUI_API bool          DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = \"%.3f\", float power = 1.0f);     // If v_min >= v_max we have no bound\n    IMGUI_API bool          DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = \"%.3f\", float power = 1.0f);\n    IMGUI_API bool          DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = \"%.3f\", float power = 1.0f);\n    IMGUI_API bool          DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = \"%.3f\", float power = 1.0f);\n    IMGUI_API bool          DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = \"%.3f\", const char* display_format_max = NULL, float power = 1.0f);\n    IMGUI_API bool          DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = \"%.0f\");                                       // If v_min >= v_max we have no bound\n    IMGUI_API bool          DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = \"%.0f\");\n    IMGUI_API bool          DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = \"%.0f\");\n    IMGUI_API bool          DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = \"%.0f\");\n    IMGUI_API bool          DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = \"%.0f\", const char* display_format_max = NULL);\n\n    // Widgets: Input with Keyboard\n    IMGUI_API bool          InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);\n    IMGUI_API bool          InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);\n    IMGUI_API bool          InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);\n    IMGUI_API bool          InputFloat2(const char* label, float v[2], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);\n    IMGUI_API bool          InputFloat3(const char* label, float v[3], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);\n    IMGUI_API bool          InputFloat4(const char* label, float v[4], int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);\n    IMGUI_API bool          InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags extra_flags = 0);\n    IMGUI_API bool          InputInt2(const char* label, int v[2], ImGuiInputTextFlags extra_flags = 0);\n    IMGUI_API bool          InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags = 0);\n    IMGUI_API bool          InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags = 0);\n\n    // Widgets: Sliders (tip: ctrl+click on a slider to input with keyboard. manually input values aren't clamped, can go off-bounds)\n    IMGUI_API bool          SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format = \"%.3f\", float power = 1.0f);     // adjust display_format to decorate the value with a prefix or a suffix for in-slider labels or unit display. Use power!=1.0 for logarithmic sliders\n    IMGUI_API bool          SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format = \"%.3f\", float power = 1.0f);\n    IMGUI_API bool          SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format = \"%.3f\", float power = 1.0f);\n    IMGUI_API bool          SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* display_format = \"%.3f\", float power = 1.0f);\n    IMGUI_API bool          SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f);\n    IMGUI_API bool          SliderInt(const char* label, int* v, int v_min, int v_max, const char* display_format = \"%.0f\");\n    IMGUI_API bool          SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* display_format = \"%.0f\");\n    IMGUI_API bool          SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* display_format = \"%.0f\");\n    IMGUI_API bool          SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* display_format = \"%.0f\");\n    IMGUI_API bool          VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* display_format = \"%.3f\", float power = 1.0f);\n    IMGUI_API bool          VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* display_format = \"%.0f\");\n\n    // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little colored preview square that can be left-clicked to open a picker, and right-clicked to open an option menu.)\n    // Note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can the pass the address of a first float element out of a contiguous structure, e.g. &myvector.x\n    IMGUI_API bool          ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0);\n    IMGUI_API bool          ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0);\n    IMGUI_API bool          ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0);\n    IMGUI_API bool          ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags = 0, const float* ref_col = NULL);\n    IMGUI_API bool          ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0,0));  // display a colored square/button, hover for details, return true when pressed.\n    IMGUI_API void          SetColorEditOptions(ImGuiColorEditFlags flags);                         // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls.\n\n    // Widgets: Trees\n    IMGUI_API bool          TreeNode(const char* label);                                            // if returning 'true' the node is open and the tree id is pushed into the id stack. user is responsible for calling TreePop().\n    IMGUI_API bool          TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2);       // read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet().\n    IMGUI_API bool          TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2);       // \"\n    IMGUI_API bool          TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2);\n    IMGUI_API bool          TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2);\n    IMGUI_API bool          TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0);\n    IMGUI_API bool          TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3);\n    IMGUI_API bool          TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3);\n    IMGUI_API bool          TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3);\n    IMGUI_API bool          TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3);\n    IMGUI_API void          TreePush(const char* str_id);                                           // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call Push/Pop yourself for layout purpose\n    IMGUI_API void          TreePush(const void* ptr_id = NULL);                                    // \"\n    IMGUI_API void          TreePop();                                                              // ~ Unindent()+PopId()\n    IMGUI_API void          TreeAdvanceToLabelPos();                                                // advance cursor x position by GetTreeNodeToLabelSpacing()\n    IMGUI_API float         GetTreeNodeToLabelSpacing();                                            // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode\n    IMGUI_API void          SetNextTreeNodeOpen(bool is_open, ImGuiCond cond = 0);               // set next TreeNode/CollapsingHeader open state.\n    IMGUI_API bool          CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0);      // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop().\n    IMGUI_API bool          CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags = 0); // when 'p_open' isn't NULL, display an additional small close button on upper right of the header\n\n    // Widgets: Selectable / Lists\n    IMGUI_API bool          Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0));  // size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height\n    IMGUI_API bool          Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0));\n    IMGUI_API bool          ListBox(const char* label, int* current_item, const char* const* items, int items_count, int height_in_items = -1);\n    IMGUI_API bool          ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);\n    IMGUI_API bool          ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0,0)); // use if you want to reimplement ListBox() will custom data or interactions. make sure to call ListBoxFooter() afterwards.\n    IMGUI_API bool          ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // \"\n    IMGUI_API void          ListBoxFooter();                                                    // terminate the scrolling region\n\n    // Widgets: Value() Helpers. Output single value in \"name: value\" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace)\n    IMGUI_API void          Value(const char* prefix, bool b);\n    IMGUI_API void          Value(const char* prefix, int v);\n    IMGUI_API void          Value(const char* prefix, unsigned int v);\n    IMGUI_API void          Value(const char* prefix, float v, const char* float_format = NULL);\n\n    // Tooltips\n    IMGUI_API void          SetTooltip(const char* fmt, ...) IM_FMTARGS(1);                     // set text tooltip under mouse-cursor, typically use with ImGui::IsItemHovered(). overidde any previous call to SetTooltip().\n    IMGUI_API void          SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1);\n    IMGUI_API void          BeginTooltip();                                                     // begin/append a tooltip window. to create full-featured tooltip (with any kind of contents).\n    IMGUI_API void          EndTooltip();\n\n    // Menus\n    IMGUI_API bool          BeginMainMenuBar();                                                 // create and append to a full screen menu-bar. only call EndMainMenuBar() if this returns true!\n    IMGUI_API void          EndMainMenuBar();\n    IMGUI_API bool          BeginMenuBar();                                                     // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window). only call EndMenuBar() if this returns true!\n    IMGUI_API void          EndMenuBar();\n    IMGUI_API bool          BeginMenu(const char* label, bool enabled = true);                  // create a sub-menu entry. only call EndMenu() if this returns true!\n    IMGUI_API void          EndMenu();\n    IMGUI_API bool          MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true);  // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment\n    IMGUI_API bool          MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true);              // return true when activated + toggle (*p_selected) if p_selected != NULL\n\n    // Popups\n    IMGUI_API void          OpenPopup(const char* str_id);                                      // call to mark popup as open (don't call every frame!). popups are closed when user click outside, or if CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. By default, Selectable()/MenuItem() are calling CloseCurrentPopup(). Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).\n    IMGUI_API bool          OpenPopupOnItemClick(const char* str_id = NULL, int mouse_button = 1);                                  // helper to open popup when clicked on last item. return true when just opened.\n    IMGUI_API bool          BeginPopup(const char* str_id);                                     // return true if the popup is open, and you can start outputting to it. only call EndPopup() if BeginPopup() returned true!\n    IMGUI_API bool          BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags extra_flags = 0);               // modal dialog (block interactions behind the modal window, can't close the modal window by clicking outside)\n    IMGUI_API bool          BeginPopupContextItem(const char* str_id = NULL, int mouse_button = 1);                                 // helper to open and begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp!\n    IMGUI_API bool          BeginPopupContextWindow(const char* str_id = NULL, int mouse_button = 1, bool also_over_items = true);  // helper to open and begin popup when clicked on current window.\n    IMGUI_API bool          BeginPopupContextVoid(const char* str_id = NULL, int mouse_button = 1);                                 // helper to open and begin popup when clicked in void (where there are no imgui windows).\n    IMGUI_API void          EndPopup();\n    IMGUI_API bool          IsPopupOpen(const char* str_id);                                    // return true if the popup is open\n    IMGUI_API void          CloseCurrentPopup();                                                // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup.\n\n    // Logging: all text output from interface is redirected to tty/file/clipboard. By default, tree nodes are automatically opened during logging.\n    IMGUI_API void          LogToTTY(int max_depth = -1);                                       // start logging to tty\n    IMGUI_API void          LogToFile(int max_depth = -1, const char* filename = NULL);         // start logging to file\n    IMGUI_API void          LogToClipboard(int max_depth = -1);                                 // start logging to OS clipboard\n    IMGUI_API void          LogFinish();                                                        // stop logging (close file, etc.)\n    IMGUI_API void          LogButtons();                                                       // helper to display buttons for logging to tty/file/clipboard\n    IMGUI_API void          LogText(const char* fmt, ...) IM_FMTARGS(1);                        // pass text data straight to log (without being displayed)\n\n    // Clipping\n    IMGUI_API void          PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect);\n    IMGUI_API void          PopClipRect();\n\n    // Styles\n    IMGUI_API void          StyleColorsClassic(ImGuiStyle* dst = NULL);\n    IMGUI_API void          StyleColorsDark(ImGuiStyle* dst = NULL);\n    IMGUI_API void          StyleColorsLight(ImGuiStyle* dst = NULL);\n\n    // Utilities\n    IMGUI_API bool          IsItemHovered(ImGuiHoveredFlags flags = 0);                         // is the last item hovered by mouse (and usable)?\n    IMGUI_API bool          IsItemActive();                                                     // is the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false)\n    IMGUI_API bool          IsItemClicked(int mouse_button = 0);                                // is the last item clicked? (e.g. button/node just clicked on)\n    IMGUI_API bool          IsItemVisible();                                                    // is the last item visible? (aka not out of sight due to clipping/scrolling.)\n    IMGUI_API bool          IsAnyItemHovered();\n    IMGUI_API bool          IsAnyItemActive();\n    IMGUI_API ImVec2        GetItemRectMin();                                                   // get bounding rect of last item in screen space\n    IMGUI_API ImVec2        GetItemRectMax();                                                   // \"\n    IMGUI_API ImVec2        GetItemRectSize();                                                  // \"\n    IMGUI_API void          SetItemAllowOverlap();                                              // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area.\n    IMGUI_API bool          IsWindowFocused();                                                  // is current Begin()-ed window focused?\n    IMGUI_API bool          IsWindowHovered(ImGuiHoveredFlags flags = 0);                       // is current Begin()-ed window hovered (and typically: not blocked by a popup/modal)?\n    IMGUI_API bool          IsRootWindowFocused();                                              // is current Begin()-ed root window focused (root = top-most parent of a child, otherwise self)?\n    IMGUI_API bool          IsRootWindowOrAnyChildFocused();                                    // is current Begin()-ed root window or any of its child (including current window) focused?\n    IMGUI_API bool          IsAnyWindowHovered();                                               // is mouse hovering any visible window\n    IMGUI_API bool          IsRectVisible(const ImVec2& size);                                  // test if rectangle (of given size, starting from cursor position) is visible / not clipped.\n    IMGUI_API bool          IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max);      // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side.\n    IMGUI_API float         GetTime();\n    IMGUI_API int           GetFrameCount();\n    IMGUI_API const char*   GetStyleColorName(ImGuiCol idx);\n    IMGUI_API ImVec2        CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge = false, float outward = +0.0f);   // utility to find the closest point the last item bounding rectangle edge. useful to visually link items\n    IMGUI_API ImVec2        CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f);\n    IMGUI_API void          CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end);    // calculate coarse clipping for large list of evenly sized items. Prefer using the ImGuiListClipper higher-level helper if you can.\n\n    IMGUI_API bool          BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags = 0);    // helper to create a child window / scrolling region that looks like a normal widget frame\n    IMGUI_API void          EndChildFrame();\n\n    IMGUI_API ImVec4        ColorConvertU32ToFloat4(ImU32 in);\n    IMGUI_API ImU32         ColorConvertFloat4ToU32(const ImVec4& in);\n    IMGUI_API void          ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v);\n    IMGUI_API void          ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b);\n\n    // Inputs\n    IMGUI_API int           GetKeyIndex(ImGuiKey imgui_key);                                    // map ImGuiKey_* values into user's key index. == io.KeyMap[key]\n    IMGUI_API bool          IsKeyDown(int user_key_index);                                      // is key being held. == io.KeysDown[user_key_index]. note that imgui doesn't know the semantic of each entry of io.KeyDown[]. Use your own indices/enums according to how your backend/engine stored them into KeyDown[]!\n    IMGUI_API bool          IsKeyPressed(int user_key_index, bool repeat = true);               // was key pressed (went from !Down to Down). if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate\n    IMGUI_API bool          IsKeyReleased(int user_key_index);                                  // was key released (went from Down to !Down)..\n    IMGUI_API int           GetKeyPressedAmount(int key_index, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate\n    IMGUI_API bool          IsMouseDown(int button);                                            // is mouse button held\n    IMGUI_API bool          IsMouseClicked(int button, bool repeat = false);                    // did mouse button clicked (went from !Down to Down)\n    IMGUI_API bool          IsMouseDoubleClicked(int button);                                   // did mouse button double-clicked. a double-click returns false in IsMouseClicked(). uses io.MouseDoubleClickTime.\n    IMGUI_API bool          IsMouseReleased(int button);                                        // did mouse button released (went from Down to !Down)\n    IMGUI_API bool          IsMouseDragging(int button = 0, float lock_threshold = -1.0f);      // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold\n    IMGUI_API bool          IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);  // is mouse hovering given bounding rect (in screen space). clipped by current clipping settings. disregarding of consideration of focus/window ordering/blocked by a popup.\n    IMGUI_API bool          IsMousePosValid(const ImVec2* mouse_pos = NULL);                    //\n    IMGUI_API ImVec2        GetMousePos();                                                      // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls\n    IMGUI_API ImVec2        GetMousePosOnOpeningCurrentPopup();                                 // retrieve backup of mouse positioning at the time of opening popup we have BeginPopup() into\n    IMGUI_API ImVec2        GetMouseDragDelta(int button = 0, float lock_threshold = -1.0f);    // dragging amount since clicking. if lock_threshold < -1.0f uses io.MouseDraggingThreshold\n    IMGUI_API void          ResetMouseDragDelta(int button = 0);                                //\n    IMGUI_API ImGuiMouseCursor GetMouseCursor();                                                // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you\n    IMGUI_API void          SetMouseCursor(ImGuiMouseCursor type);                              // set desired cursor type\n    IMGUI_API void          CaptureKeyboardFromApp(bool capture = true);                        // manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application handle). e.g. force capture keyboard when your widget is being hovered.\n    IMGUI_API void          CaptureMouseFromApp(bool capture = true);                           // manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application handle).\n\n    // Helpers functions to access functions pointers in ImGui::GetIO()\n    IMGUI_API void*         MemAlloc(size_t sz);\n    IMGUI_API void          MemFree(void* ptr);\n    IMGUI_API const char*   GetClipboardText();\n    IMGUI_API void          SetClipboardText(const char* text);\n\n    // Internal context access - if you want to use multiple context, share context between modules (e.g. DLL). There is a default context created and active by default.\n    // All contexts share a same ImFontAtlas by default. If you want different font atlas, you can new() them and overwrite the GetIO().Fonts variable of an ImGui context.\n    IMGUI_API const char*   GetVersion();\n    IMGUI_API ImGuiContext* CreateContext(void* (*malloc_fn)(size_t) = NULL, void (*free_fn)(void*) = NULL);\n    IMGUI_API void          DestroyContext(ImGuiContext* ctx);\n    IMGUI_API ImGuiContext* GetCurrentContext();\n    IMGUI_API void          SetCurrentContext(ImGuiContext* ctx);\n\n} // namespace ImGui\n\n// Flags for ImGui::Begin()\nenum ImGuiWindowFlags_\n{\n    // Default: 0\n    ImGuiWindowFlags_NoTitleBar             = 1 << 0,   // Disable title-bar\n    ImGuiWindowFlags_NoResize               = 1 << 1,   // Disable user resizing with the lower-right grip\n    ImGuiWindowFlags_NoMove                 = 1 << 2,   // Disable user moving the window\n    ImGuiWindowFlags_NoScrollbar            = 1 << 3,   // Disable scrollbars (window can still scroll with mouse or programatically)\n    ImGuiWindowFlags_NoScrollWithMouse      = 1 << 4,   // Disable user vertically scrolling with mouse wheel\n    ImGuiWindowFlags_NoCollapse             = 1 << 5,   // Disable user collapsing window by double-clicking on it\n    ImGuiWindowFlags_AlwaysAutoResize       = 1 << 6,   // Resize every window to its content every frame\n    //ImGuiWindowFlags_ShowBorders          = 1 << 7,   // Show borders around windows and items (OBSOLETE! Use e.g. style.FrameBorderSize=1.0f to enable borders).\n    ImGuiWindowFlags_NoSavedSettings        = 1 << 8,   // Never load/save settings in .ini file\n    ImGuiWindowFlags_NoInputs               = 1 << 9,   // Disable catching mouse or keyboard inputs, hovering test with pass through.\n    ImGuiWindowFlags_MenuBar                = 1 << 10,  // Has a menu-bar\n    ImGuiWindowFlags_HorizontalScrollbar    = 1 << 11,  // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the \"Horizontal Scrolling\" section.\n    ImGuiWindowFlags_NoFocusOnAppearing     = 1 << 12,  // Disable taking focus when transitioning from hidden to visible state\n    ImGuiWindowFlags_NoBringToFrontOnFocus  = 1 << 13,  // Disable bringing window to front when taking focus (e.g. clicking on it or programatically giving it focus)\n    ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14,  // Always show vertical scrollbar (even if ContentSize.y < Size.y)\n    ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15,  // Always show horizontal scrollbar (even if ContentSize.x < Size.x)\n    ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16,  // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient)\n    // [Internal]\n    ImGuiWindowFlags_ChildWindow            = 1 << 22,  // Don't use! For internal use by BeginChild()\n    ImGuiWindowFlags_ComboBox               = 1 << 23,  // Don't use! For internal use by ComboBox()\n    ImGuiWindowFlags_Tooltip                = 1 << 24,  // Don't use! For internal use by BeginTooltip()\n    ImGuiWindowFlags_Popup                  = 1 << 25,  // Don't use! For internal use by BeginPopup()\n    ImGuiWindowFlags_Modal                  = 1 << 26,  // Don't use! For internal use by BeginPopupModal()\n    ImGuiWindowFlags_ChildMenu              = 1 << 27   // Don't use! For internal use by BeginMenu()\n};\n\n// Flags for ImGui::InputText()\nenum ImGuiInputTextFlags_\n{\n    // Default: 0\n    ImGuiInputTextFlags_CharsDecimal        = 1 << 0,   // Allow 0123456789.+-*/\n    ImGuiInputTextFlags_CharsHexadecimal    = 1 << 1,   // Allow 0123456789ABCDEFabcdef\n    ImGuiInputTextFlags_CharsUppercase      = 1 << 2,   // Turn a..z into A..Z\n    ImGuiInputTextFlags_CharsNoBlank        = 1 << 3,   // Filter out spaces, tabs\n    ImGuiInputTextFlags_AutoSelectAll       = 1 << 4,   // Select entire text when first taking mouse focus\n    ImGuiInputTextFlags_EnterReturnsTrue    = 1 << 5,   // Return 'true' when Enter is pressed (as opposed to when the value was modified)\n    ImGuiInputTextFlags_CallbackCompletion  = 1 << 6,   // Call user function on pressing TAB (for completion handling)\n    ImGuiInputTextFlags_CallbackHistory     = 1 << 7,   // Call user function on pressing Up/Down arrows (for history handling)\n    ImGuiInputTextFlags_CallbackAlways      = 1 << 8,   // Call user function every time. User code may query cursor position, modify text buffer.\n    ImGuiInputTextFlags_CallbackCharFilter  = 1 << 9,   // Call user function to filter character. Modify data->EventChar to replace/filter input, or return 1 to discard character.\n    ImGuiInputTextFlags_AllowTabInput       = 1 << 10,  // Pressing TAB input a '\\t' character into the text field\n    ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11,  // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter).\n    ImGuiInputTextFlags_NoHorizontalScroll  = 1 << 12,  // Disable following the cursor horizontally\n    ImGuiInputTextFlags_AlwaysInsertMode    = 1 << 13,  // Insert mode\n    ImGuiInputTextFlags_ReadOnly            = 1 << 14,  // Read-only mode\n    ImGuiInputTextFlags_Password            = 1 << 15,  // Password mode, display all characters as '*'\n    // [Internal]\n    ImGuiInputTextFlags_Multiline           = 1 << 20   // For internal use by InputTextMultiline()\n};\n\n// Flags for ImGui::TreeNodeEx(), ImGui::CollapsingHeader*()\nenum ImGuiTreeNodeFlags_\n{\n    ImGuiTreeNodeFlags_Selected             = 1 << 0,   // Draw as selected\n    ImGuiTreeNodeFlags_Framed               = 1 << 1,   // Full colored frame (e.g. for CollapsingHeader)\n    ImGuiTreeNodeFlags_AllowOverlapMode     = 1 << 2,   // Hit testing to allow subsequent widgets to overlap this one\n    ImGuiTreeNodeFlags_NoTreePushOnOpen     = 1 << 3,   // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack\n    ImGuiTreeNodeFlags_NoAutoOpenOnLog      = 1 << 4,   // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes)\n    ImGuiTreeNodeFlags_DefaultOpen          = 1 << 5,   // Default node to be open\n    ImGuiTreeNodeFlags_OpenOnDoubleClick    = 1 << 6,   // Need double-click to open node\n    ImGuiTreeNodeFlags_OpenOnArrow          = 1 << 7,   // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open.\n    ImGuiTreeNodeFlags_Leaf                 = 1 << 8,   // No collapsing, no arrow (use as a convenience for leaf nodes). \n    ImGuiTreeNodeFlags_Bullet               = 1 << 9,   // Display a bullet instead of arrow\n    ImGuiTreeNodeFlags_FramePadding         = 1 << 10,  // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding().\n    //ImGuITreeNodeFlags_SpanAllAvailWidth  = 1 << 11,  // FIXME: TODO: Extend hit box horizontally even if not framed\n    //ImGuiTreeNodeFlags_NoScrollOnOpen     = 1 << 12,  // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible\n    ImGuiTreeNodeFlags_CollapsingHeader     = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoAutoOpenOnLog\n};\n\n// Flags for ImGui::Selectable()\nenum ImGuiSelectableFlags_\n{\n    // Default: 0\n    ImGuiSelectableFlags_DontClosePopups    = 1 << 0,   // Clicking this don't close parent popup window\n    ImGuiSelectableFlags_SpanAllColumns     = 1 << 1,   // Selectable frame can span all columns (text will still fit in current column)\n    ImGuiSelectableFlags_AllowDoubleClick   = 1 << 2    // Generate press events on double clicks too\n};\n\n// Flags for ImGui::IsItemHovered(), ImGui::IsWindowHovered()\nenum ImGuiHoveredFlags_\n{\n    ImGuiHoveredFlags_Default                       = 0,        // Return true if directly over the item/window, not obstructed by another window, not obstructed by an active popup or modal blocking inputs under them.\n    ImGuiHoveredFlags_AllowWhenBlockedByPopup       = 1 << 0,   // Return true even if a popup window is normally blocking access to this item/window\n    //ImGuiHoveredFlags_AllowWhenBlockedByModal     = 1 << 1,   // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet.\n    ImGuiHoveredFlags_AllowWhenBlockedByActiveItem  = 1 << 2,   // Return true even if an active item is blocking access to this item/window\n    ImGuiHoveredFlags_AllowWhenOverlapped           = 1 << 3,   // Return true even if the position is overlapped by another window\n    ImGuiHoveredFlags_FlattenChilds                 = 1 << 4,   // Treat all child windows as the same window (for IsWindowHovered())\n    ImGuiHoveredFlags_RectOnly                      = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped\n};\n\n// User fill ImGuiIO.KeyMap[] array with indices into the ImGuiIO.KeysDown[512] array\nenum ImGuiKey_\n{\n    ImGuiKey_Tab,       // for tabbing through fields\n    ImGuiKey_LeftArrow, // for text edit\n    ImGuiKey_RightArrow,// for text edit\n    ImGuiKey_UpArrow,   // for text edit\n    ImGuiKey_DownArrow, // for text edit\n    ImGuiKey_PageUp,\n    ImGuiKey_PageDown,\n    ImGuiKey_Home,      // for text edit\n    ImGuiKey_End,       // for text edit\n    ImGuiKey_Delete,    // for text edit\n    ImGuiKey_Backspace, // for text edit\n    ImGuiKey_Enter,     // for text edit\n    ImGuiKey_Escape,    // for text edit\n    ImGuiKey_A,         // for text edit CTRL+A: select all\n    ImGuiKey_C,         // for text edit CTRL+C: copy\n    ImGuiKey_V,         // for text edit CTRL+V: paste\n    ImGuiKey_X,         // for text edit CTRL+X: cut\n    ImGuiKey_Y,         // for text edit CTRL+Y: redo\n    ImGuiKey_Z,         // for text edit CTRL+Z: undo\n    ImGuiKey_COUNT\n};\n\n// Enumeration for PushStyleColor() / PopStyleColor()\nenum ImGuiCol_\n{\n    ImGuiCol_Text,\n    ImGuiCol_TextDisabled,\n    ImGuiCol_WindowBg,              // Background of normal windows\n    ImGuiCol_ChildBg,               // Background of child windows\n    ImGuiCol_PopupBg,               // Background of popups, menus, tooltips windows\n    ImGuiCol_Border,\n    ImGuiCol_BorderShadow,\n    ImGuiCol_FrameBg,               // Background of checkbox, radio button, plot, slider, text input\n    ImGuiCol_FrameBgHovered,\n    ImGuiCol_FrameBgActive,\n    ImGuiCol_TitleBg,\n    ImGuiCol_TitleBgActive,\n    ImGuiCol_TitleBgCollapsed,\n    ImGuiCol_MenuBarBg,\n    ImGuiCol_ScrollbarBg,\n    ImGuiCol_ScrollbarGrab,\n    ImGuiCol_ScrollbarGrabHovered,\n    ImGuiCol_ScrollbarGrabActive,\n    ImGuiCol_CheckMark,\n    ImGuiCol_SliderGrab,\n    ImGuiCol_SliderGrabActive,\n    ImGuiCol_Button,\n    ImGuiCol_ButtonHovered,\n    ImGuiCol_ButtonActive,\n    ImGuiCol_Header,\n    ImGuiCol_HeaderHovered,\n    ImGuiCol_HeaderActive,\n    ImGuiCol_Separator,\n    ImGuiCol_SeparatorHovered,\n    ImGuiCol_SeparatorActive,\n    ImGuiCol_ResizeGrip,\n    ImGuiCol_ResizeGripHovered,\n    ImGuiCol_ResizeGripActive,\n    ImGuiCol_CloseButton,\n    ImGuiCol_CloseButtonHovered,\n    ImGuiCol_CloseButtonActive,\n    ImGuiCol_PlotLines,\n    ImGuiCol_PlotLinesHovered,\n    ImGuiCol_PlotHistogram,\n    ImGuiCol_PlotHistogramHovered,\n    ImGuiCol_TextSelectedBg,\n    ImGuiCol_ModalWindowDarkening,  // darken entire screen when a modal window is active\n    ImGuiCol_COUNT\n\n    // Obsolete names (will be removed)\n#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS\n    //, ImGuiCol_ComboBg = ImGuiCol_PopupBg     // ComboBg has been merged with PopupBg, so a redirect isn't accurate.\n    , ImGuiCol_ChildWindowBg = ImGuiCol_ChildBg, ImGuiCol_Column = ImGuiCol_Separator, ImGuiCol_ColumnHovered = ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive = ImGuiCol_SeparatorActive\n#endif\n};\n\n// Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure.\n// NB: the enum only refers to fields of ImGuiStyle which makes sense to be pushed/poped inside UI code. During initialization, feel free to just poke into ImGuiStyle directly.\n// NB: if changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type.\nenum ImGuiStyleVar_\n{\n    // Enum name ......................// Member in ImGuiStyle structure (see ImGuiStyle for descriptions)\n    ImGuiStyleVar_Alpha,               // float     Alpha\n    ImGuiStyleVar_WindowPadding,       // ImVec2    WindowPadding\n    ImGuiStyleVar_WindowRounding,      // float     WindowRounding\n    ImGuiStyleVar_WindowBorderSize,    // float     WindowBorderSize\n    ImGuiStyleVar_WindowMinSize,       // ImVec2    WindowMinSize\n    ImGuiStyleVar_ChildRounding,       // float     ChildRounding\n    ImGuiStyleVar_ChildBorderSize,     // float     ChildBorderSize\n    ImGuiStyleVar_PopupRounding,       // float     PopupRounding\n    ImGuiStyleVar_PopupBorderSize,     // float     PopupBorderSize\n    ImGuiStyleVar_FramePadding,        // ImVec2    FramePadding\n    ImGuiStyleVar_FrameRounding,       // float     FrameRounding\n    ImGuiStyleVar_FrameBorderSize,     // float     FrameBorderSize\n    ImGuiStyleVar_ItemSpacing,         // ImVec2    ItemSpacing\n    ImGuiStyleVar_ItemInnerSpacing,    // ImVec2    ItemInnerSpacing\n    ImGuiStyleVar_IndentSpacing,       // float     IndentSpacing\n    ImGuiStyleVar_GrabMinSize,         // float     GrabMinSize\n    ImGuiStyleVar_ButtonTextAlign,     // ImVec2    ButtonTextAlign\n    ImGuiStyleVar_Count_\n\n    // Obsolete names (will be removed)\n#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS\n    , ImGuiStyleVar_ChildWindowRounding = ImGuiStyleVar_ChildRounding\n#endif\n};\n\n// Enumeration for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton()\nenum ImGuiColorEditFlags_\n{\n    ImGuiColorEditFlags_NoAlpha         = 1 << 1,   //              // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (read 3 components from the input pointer).\n    ImGuiColorEditFlags_NoPicker        = 1 << 2,   //              // ColorEdit: disable picker when clicking on colored square.\n    ImGuiColorEditFlags_NoOptions       = 1 << 3,   //              // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview.\n    ImGuiColorEditFlags_NoSmallPreview  = 1 << 4,   //              // ColorEdit, ColorPicker: disable colored square preview next to the inputs. (e.g. to show only the inputs)\n    ImGuiColorEditFlags_NoInputs        = 1 << 5,   //              // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview colored square).\n    ImGuiColorEditFlags_NoTooltip       = 1 << 6,   //              // ColorEdit, ColorPicker, ColorButton: disable tooltip when hovering the preview.\n    ImGuiColorEditFlags_NoLabel         = 1 << 7,   //              // ColorEdit, ColorPicker: disable display of inline text label (the label is still forwarded to the tooltip and picker).\n    ImGuiColorEditFlags_NoSidePreview   = 1 << 8,   //              // ColorPicker: disable bigger color preview on right side of the picker, use small colored square preview instead.\n    // User Options (right-click on widget to change some of them). You can set application defaults using SetColorEditOptions(). The idea is that you probably don't want to override them in most of your calls, let the user choose and/or call SetColorEditOptions() during startup.\n    ImGuiColorEditFlags_AlphaBar        = 1 << 9,   //              // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker.\n    ImGuiColorEditFlags_AlphaPreview    = 1 << 10,  //              // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque.\n    ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 11,  //              // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque.\n    ImGuiColorEditFlags_HDR             = 1 << 12,  //              // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well).\n    ImGuiColorEditFlags_RGB             = 1 << 13,  // [Inputs]     // ColorEdit: choose one among RGB/HSV/HEX. ColorPicker: choose any combination using RGB/HSV/HEX.\n    ImGuiColorEditFlags_HSV             = 1 << 14,  // [Inputs]     // \"\n    ImGuiColorEditFlags_HEX             = 1 << 15,  // [Inputs]     // \"\n    ImGuiColorEditFlags_Uint8           = 1 << 16,  // [DataType]   // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0..255. \n    ImGuiColorEditFlags_Float           = 1 << 17,  // [DataType]   // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0.0f..1.0f floats instead of 0..255 integers. No round-trip of value via integers.\n    ImGuiColorEditFlags_PickerHueBar    = 1 << 18,  // [PickerMode] // ColorPicker: bar for Hue, rectangle for Sat/Value.\n    ImGuiColorEditFlags_PickerHueWheel  = 1 << 19,  // [PickerMode] // ColorPicker: wheel for Hue, triangle for Sat/Value.\n    // Internals/Masks\n    ImGuiColorEditFlags__InputsMask     = ImGuiColorEditFlags_RGB|ImGuiColorEditFlags_HSV|ImGuiColorEditFlags_HEX,\n    ImGuiColorEditFlags__DataTypeMask   = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_Float,\n    ImGuiColorEditFlags__PickerMask     = ImGuiColorEditFlags_PickerHueWheel|ImGuiColorEditFlags_PickerHueBar,\n    ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_RGB|ImGuiColorEditFlags_PickerHueBar    // Change application default using SetColorEditOptions()\n};\n\n// Enumeration for GetMouseCursor()\nenum ImGuiMouseCursor_\n{\n    ImGuiMouseCursor_None = -1,\n    ImGuiMouseCursor_Arrow = 0,\n    ImGuiMouseCursor_TextInput,         // When hovering over InputText, etc.\n    ImGuiMouseCursor_Move,              // Unused\n    ImGuiMouseCursor_ResizeNS,          // Unused\n    ImGuiMouseCursor_ResizeEW,          // When hovering over a column\n    ImGuiMouseCursor_ResizeNESW,        // Unused\n    ImGuiMouseCursor_ResizeNWSE,        // When hovering over the bottom-right corner of a window\n    ImGuiMouseCursor_Count_\n};\n\n// Condition for ImGui::SetWindow***(), SetNextWindow***(), SetNextTreeNode***() functions\n// All those functions treat 0 as a shortcut to ImGuiCond_Always. From the point of view of the user use this as an enum (don't combine multiple values into flags).\nenum ImGuiCond_\n{\n    ImGuiCond_Always        = 1 << 0,   // Set the variable\n    ImGuiCond_Once          = 1 << 1,   // Set the variable once per runtime session (only the first call with succeed)\n    ImGuiCond_FirstUseEver  = 1 << 2,   // Set the variable if the window has no saved data (if doesn't exist in the .ini file)\n    ImGuiCond_Appearing     = 1 << 3    // Set the variable if the window is appearing after being hidden/inactive (or the first time)\n\n    // Obsolete names (will be removed)\n#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS\n    , ImGuiSetCond_Always = ImGuiCond_Always, ImGuiSetCond_Once = ImGuiCond_Once, ImGuiSetCond_FirstUseEver = ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing = ImGuiCond_Appearing\n#endif\n};\n\nstruct ImGuiStyle\n{\n    float       Alpha;                      // Global alpha applies to everything in ImGui\n    ImVec2      WindowPadding;              // Padding within a window\n    float       WindowRounding;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows\n    float       WindowBorderSize;           // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly)\n    ImVec2      WindowMinSize;              // Minimum window size\n    ImVec2      WindowTitleAlign;           // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered.\n    float       ChildRounding;              // Radius of child window corners rounding. Set to 0.0f to have rectangular windows.\n    float       ChildBorderSize;            // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly)\n    float       PopupRounding;              // Radius of popup window corners rounding.\n    float       PopupBorderSize;            // Thickness of border around popup windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly)\n    ImVec2      FramePadding;               // Padding within a framed rectangle (used by most widgets)\n    float       FrameRounding;              // Radius of frame corners rounding. Set to 0.0f to have rectangular frame (used by most widgets).\n    float       FrameBorderSize;            // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly)\n    ImVec2      ItemSpacing;                // Horizontal and vertical spacing between widgets/lines\n    ImVec2      ItemInnerSpacing;           // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)\n    ImVec2      TouchExtraPadding;          // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!\n    float       IndentSpacing;              // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).\n    float       ColumnsMinSpacing;          // Minimum horizontal spacing between two columns\n    float       ScrollbarSize;              // Width of the vertical scrollbar, Height of the horizontal scrollbar\n    float       ScrollbarRounding;          // Radius of grab corners for scrollbar\n    float       GrabMinSize;                // Minimum width/height of a grab box for slider/scrollbar.\n    float       GrabRounding;               // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.\n    ImVec2      ButtonTextAlign;            // Alignment of button text when button is larger than text. Defaults to (0.5f,0.5f) for horizontally+vertically centered.\n    ImVec2      DisplayWindowPadding;       // Window positions are clamped to be visible within the display area by at least this amount. Only covers regular windows.\n    ImVec2      DisplaySafeAreaPadding;     // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows.\n    bool        AntiAliasedLines;           // Enable anti-aliasing on lines/borders. Disable if you are really tight on CPU/GPU.\n    bool        AntiAliasedShapes;          // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.)\n    float       CurveTessellationTol;       // Tessellation tolerance. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.\n    ImVec4      Colors[ImGuiCol_COUNT];\n\n    IMGUI_API ImGuiStyle();\n    IMGUI_API void ScaleAllSizes(float scale_factor);\n};\n\n// This is where your app communicate with ImGui. Access via ImGui::GetIO().\n// Read 'Programmer guide' section in .cpp file for general usage.\nstruct ImGuiIO\n{\n    //------------------------------------------------------------------\n    // Settings (fill once)                 // Default value:\n    //------------------------------------------------------------------\n\n    ImVec2        DisplaySize;              // <unset>              // Display size, in pixels. For clamping windows positions.\n    float         DeltaTime;                // = 1.0f/60.0f         // Time elapsed since last frame, in seconds.\n    float         IniSavingRate;            // = 5.0f               // Maximum time between saving positions/sizes to .ini file, in seconds.\n    const char*   IniFilename;              // = \"imgui.ini\"        // Path to .ini file. NULL to disable .ini saving.\n    const char*   LogFilename;              // = \"imgui_log.txt\"    // Path to .log file (default parameter to ImGui::LogToFile when no file is specified).\n    float         MouseDoubleClickTime;     // = 0.30f              // Time for a double-click, in seconds.\n    float         MouseDoubleClickMaxDist;  // = 6.0f               // Distance threshold to stay in to validate a double-click, in pixels.\n    float         MouseDragThreshold;       // = 6.0f               // Distance threshold before considering we are dragging\n    int           KeyMap[ImGuiKey_COUNT];   // <unset>              // Map of indices into the KeysDown[512] entries array\n    float         KeyRepeatDelay;           // = 0.250f             // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.).\n    float         KeyRepeatRate;            // = 0.050f             // When holding a key/button, rate at which it repeats, in seconds.\n    void*         UserData;                 // = NULL               // Store your own data for retrieval by callbacks.\n\n    ImFontAtlas*  Fonts;                    // <auto>               // Load and assemble one or more fonts into a single tightly packed texture. Output to Fonts array.\n    float         FontGlobalScale;          // = 1.0f               // Global scale all fonts\n    bool          FontAllowUserScaling;     // = false              // Allow user scaling text of individual window with CTRL+Wheel.\n    ImFont*       FontDefault;              // = NULL               // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0].\n    ImVec2        DisplayFramebufferScale;  // = (1.0f,1.0f)        // For retina display or other situations where window coordinates are different from framebuffer coordinates. User storage only, presently not used by ImGui.\n    ImVec2        DisplayVisibleMin;        // <unset> (0.0f,0.0f)  // If you use DisplaySize as a virtual space larger than your screen, set DisplayVisibleMin/Max to the visible area.\n    ImVec2        DisplayVisibleMax;        // <unset> (0.0f,0.0f)  // If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize\n\n    // Advanced/subtle behaviors\n    bool          OptMacOSXBehaviors;       // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl\n    bool          OptCursorBlink;           // = true               // Enable blinking cursor, for users who consider it annoying.\n\n    //------------------------------------------------------------------\n    // Settings (User Functions)\n    //------------------------------------------------------------------\n\n    // Rendering function, will be called in Render().\n    // Alternatively you can keep this to NULL and call GetDrawData() after Render() to get the same pointer.\n    // See example applications if you are unsure of how to implement this.\n    void        (*RenderDrawListsFn)(ImDrawData* data);\n\n    // Optional: access OS clipboard\n    // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)\n    const char* (*GetClipboardTextFn)(void* user_data);\n    void        (*SetClipboardTextFn)(void* user_data, const char* text);\n    void*       ClipboardUserData;\n\n    // Optional: override memory allocations. MemFreeFn() may be called with a NULL pointer.\n    // (default to posix malloc/free)\n    void*       (*MemAllocFn)(size_t sz);\n    void        (*MemFreeFn)(void* ptr);\n\n    // Optional: notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME in Windows)\n    // (default to use native imm32 api on Windows)\n    void        (*ImeSetInputScreenPosFn)(int x, int y);\n    void*       ImeWindowHandle;            // (Windows) Set this to your HWND to get automatic IME cursor positioning.\n\n    //------------------------------------------------------------------\n    // Input - Fill before calling NewFrame()\n    //------------------------------------------------------------------\n\n    ImVec2      MousePos;                   // Mouse position, in pixels. Set to ImVec2(-FLT_MAX,-FLT_MAX) if mouse is unavailable (on another screen, etc.)\n    bool        MouseDown[5];               // Mouse buttons: left, right, middle + extras. ImGui itself mostly only uses left button (BeginPopupContext** are using right button). Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API.\n    float       MouseWheel;                 // Mouse wheel: 1 unit scrolls about 5 lines text.\n    bool        MouseDrawCursor;            // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor).\n    bool        KeyCtrl;                    // Keyboard modifier pressed: Control\n    bool        KeyShift;                   // Keyboard modifier pressed: Shift\n    bool        KeyAlt;                     // Keyboard modifier pressed: Alt\n    bool        KeySuper;                   // Keyboard modifier pressed: Cmd/Super/Windows\n    bool        KeysDown[512];              // Keyboard keys that are pressed (in whatever storage order you naturally have access to keyboard data)\n    ImWchar     InputCharacters[16+1];      // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper.\n\n    // Functions\n    IMGUI_API void AddInputCharacter(ImWchar c);                        // Add new character into InputCharacters[]\n    IMGUI_API void AddInputCharactersUTF8(const char* utf8_chars);      // Add new characters into InputCharacters[] from an UTF-8 string\n    inline void    ClearInputCharacters() { InputCharacters[0] = 0; }   // Clear the text input buffer manually\n\n    //------------------------------------------------------------------\n    // Output - Retrieve after calling NewFrame()\n    //------------------------------------------------------------------\n\n    bool        WantCaptureMouse;           // When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. This is set by ImGui when it wants to use your mouse (e.g. unclicked mouse is hovering a window, or a widget is active). \n    bool        WantCaptureKeyboard;        // When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. This is set by ImGui when it wants to use your keyboard inputs.\n    bool        WantTextInput;              // Mobile/console: when io.WantTextInput is true, you may display an on-screen keyboard. This is set by ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active).\n    bool        WantMoveMouse;              // [BETA-NAV] MousePos has been altered, back-end should reposition mouse on next frame. Set only when 'NavMovesMouse=true'.\n    float       Framerate;                  // Application framerate estimation, in frame per second. Solely for convenience. Rolling average estimation based on IO.DeltaTime over 120 frames\n    int         MetricsAllocs;              // Number of active memory allocations\n    int         MetricsRenderVertices;      // Vertices output during last call to Render()\n    int         MetricsRenderIndices;       // Indices output during last call to Render() = number of triangles * 3\n    int         MetricsActiveWindows;       // Number of visible root windows (exclude child windows)\n    ImVec2      MouseDelta;                 // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta.\n\n    //------------------------------------------------------------------\n    // [Internal] ImGui will maintain those fields. Forward compatibility not guaranteed!\n    //------------------------------------------------------------------\n\n    ImVec2      MousePosPrev;               // Previous mouse position temporary storage (nb: not for public use, set to MousePos in NewFrame())\n    ImVec2      MouseClickedPos[5];         // Position at time of clicking\n    float       MouseClickedTime[5];        // Time of last click (used to figure out double-click)\n    bool        MouseClicked[5];            // Mouse button went from !Down to Down\n    bool        MouseDoubleClicked[5];      // Has mouse button been double-clicked?\n    bool        MouseReleased[5];           // Mouse button went from Down to !Down\n    bool        MouseDownOwned[5];          // Track if button was clicked inside a window. We don't request mouse capture from the application if click started outside ImGui bounds.\n    float       MouseDownDuration[5];       // Duration the mouse button has been down (0.0f == just clicked)\n    float       MouseDownDurationPrev[5];   // Previous time the mouse button has been down\n    ImVec2      MouseDragMaxDistanceAbs[5]; // Maximum distance, absolute, on each axis, of how much mouse has traveled from the clicking point\n    float       MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point\n    float       KeysDownDuration[512];      // Duration the keyboard key has been down (0.0f == just pressed)\n    float       KeysDownDurationPrev[512];  // Previous duration the key has been down\n\n    IMGUI_API   ImGuiIO();\n};\n\n//-----------------------------------------------------------------------------\n// Obsolete functions (Will be removed! Also see 'API BREAKING CHANGES' section in imgui.cpp)\n//-----------------------------------------------------------------------------\n\n#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS\nnamespace ImGui\n{\n    static inline bool      IsRootWindowOrAnyChildHovered(ImGuiHoveredFlags flags = 0) { return IsItemHovered(flags | ImGuiHoveredFlags_FlattenChilds); } // OBSOLETE 1.53+ use flags directly\n    bool                    Begin(const char* name, bool* p_open, const ImVec2& size_on_first_use, float bg_alpha_override = -1.0f, ImGuiWindowFlags flags = 0); // OBSOLETE 1.52+. use SetNextWindowSize() instead if you want to set a window size.\n    static inline void      AlignFirstTextHeightToWidgets() { AlignTextToFramePadding(); }     // OBSOLETE 1.52+\n    static inline void      SetNextWindowPosCenter(ImGuiCond cond = 0) { SetNextWindowPos(ImVec2(GetIO().DisplaySize.x * 0.5f, GetIO().DisplaySize.y * 0.5f), cond, ImVec2(0.5f, 0.5f)); } // OBSOLETE 1.52+\n    static inline bool      IsItemHoveredRect() { return IsItemHovered(ImGuiHoveredFlags_RectOnly); } // OBSOLETE 1.51+\n    static inline bool      IsPosHoveringAnyWindow(const ImVec2&) { IM_ASSERT(0); return false; } // OBSOLETE 1.51+. This was partly broken. You probably wanted to use ImGui::GetIO().WantCaptureMouse instead.\n    static inline bool      IsMouseHoveringAnyWindow() { return IsAnyWindowHovered(); }        // OBSOLETE 1.51+\n    static inline bool      IsMouseHoveringWindow() { return IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem); } // OBSOLETE 1.51+\n    static inline bool      CollapsingHeader(const char* label, const char* str_id, bool framed = true, bool default_open = false) { (void)str_id; (void)framed; ImGuiTreeNodeFlags default_open_flags = 1 << 5; return CollapsingHeader(label, (default_open ? default_open_flags : 0)); } // OBSOLETE 1.49+\n    static inline ImFont*   GetWindowFont() { return GetFont(); }                              // OBSOLETE 1.48+\n    static inline float     GetWindowFontSize() { return GetFontSize(); }                      // OBSOLETE 1.48+\n    static inline void      SetScrollPosHere() { SetScrollHere(); }                            // OBSOLETE 1.42+\n}\n#endif\n\n//-----------------------------------------------------------------------------\n// Helpers\n//-----------------------------------------------------------------------------\n\n// Lightweight std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).\n// Our implementation does NOT call c++ constructors because we don't use them in ImGui. Don't use this class as a straight std::vector replacement in your code!\ntemplate<typename T>\nclass ImVector\n{\npublic:\n    int                         Size;\n    int                         Capacity;\n    T*                          Data;\n\n    typedef T                   value_type;\n    typedef value_type*         iterator;\n    typedef const value_type*   const_iterator;\n\n    ImVector()                  { Size = Capacity = 0; Data = NULL; }\n    ~ImVector()                 { if (Data) ImGui::MemFree(Data); }\n\n    inline bool                 empty() const                   { return Size == 0; }\n    inline int                  size() const                    { return Size; }\n    inline int                  capacity() const                { return Capacity; }\n\n    inline value_type&          operator[](int i)               { IM_ASSERT(i < Size); return Data[i]; }\n    inline const value_type&    operator[](int i) const         { IM_ASSERT(i < Size); return Data[i]; }\n\n    inline void                 clear()                         { if (Data) { Size = Capacity = 0; ImGui::MemFree(Data); Data = NULL; } }\n    inline iterator             begin()                         { return Data; }\n    inline const_iterator       begin() const                   { return Data; }\n    inline iterator             end()                           { return Data + Size; }\n    inline const_iterator       end() const                     { return Data + Size; }\n    inline value_type&          front()                         { IM_ASSERT(Size > 0); return Data[0]; }\n    inline const value_type&    front() const                   { IM_ASSERT(Size > 0); return Data[0]; }\n    inline value_type&          back()                          { IM_ASSERT(Size > 0); return Data[Size-1]; }\n    inline const value_type&    back() const                    { IM_ASSERT(Size > 0); return Data[Size-1]; }\n    inline void                 swap(ImVector<T>& rhs)          { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; value_type* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; }\n\n    inline int                  _grow_capacity(int size) const  { int new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > size ? new_capacity : size; }\n\n    inline void                 resize(int new_size)            { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; }\n    inline void                 resize(int new_size, const T& v){ if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) Data[n] = v; Size = new_size; }\n    inline void                 reserve(int new_capacity)\n    {\n        if (new_capacity <= Capacity) return;\n        T* new_data = (value_type*)ImGui::MemAlloc((size_t)new_capacity * sizeof(T));\n        if (Data)\n            memcpy(new_data, Data, (size_t)Size * sizeof(T));\n        ImGui::MemFree(Data);\n        Data = new_data;\n        Capacity = new_capacity;\n    }\n\n    inline void                 push_back(const value_type& v)  { if (Size == Capacity) reserve(_grow_capacity(Size+1)); Data[Size++] = v; }\n    inline void                 pop_back()                      { IM_ASSERT(Size > 0); Size--; }\n\n    inline iterator             erase(const_iterator it)        { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; }\n    inline iterator             insert(const_iterator it, const value_type& v)  { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; }\n};\n\n// Helper: execute a block of code at maximum once a frame. Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame.\n// Usage:\n//   static ImGuiOnceUponAFrame oaf;\n//   if (oaf)\n//       ImGui::Text(\"This will be called only once per frame\");\nstruct ImGuiOnceUponAFrame\n{\n    ImGuiOnceUponAFrame() { RefFrame = -1; }\n    mutable int RefFrame;\n    operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; }\n};\n\n// Helper macro for ImGuiOnceUponAFrame. Attention: The macro expands into 2 statement so make sure you don't use it within e.g. an if() statement without curly braces.\n#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS    // Will obsolete\n#define IMGUI_ONCE_UPON_A_FRAME     static ImGuiOnceUponAFrame imgui_oaf; if (imgui_oaf)\n#endif\n\n// Helper: Parse and apply text filters. In format \"aaaaa[,bbbb][,ccccc]\"\nstruct ImGuiTextFilter\n{\n    struct TextRange\n    {\n        const char* b;\n        const char* e;\n\n        TextRange() { b = e = NULL; }\n        TextRange(const char* _b, const char* _e) { b = _b; e = _e; }\n        const char* begin() const { return b; }\n        const char* end() const { return e; }\n        bool empty() const { return b == e; }\n        char front() const { return *b; }\n        static bool is_blank(char c) { return c == ' ' || c == '\\t'; }\n        void trim_blanks() { while (b < e && is_blank(*b)) b++; while (e > b && is_blank(*(e-1))) e--; }\n        IMGUI_API void split(char separator, ImVector<TextRange>& out);\n    };\n\n    char                InputBuf[256];\n    ImVector<TextRange> Filters;\n    int                 CountGrep;\n\n    IMGUI_API           ImGuiTextFilter(const char* default_filter = \"\");\n    IMGUI_API bool      Draw(const char* label = \"Filter (inc,-exc)\", float width = 0.0f);    // Helper calling InputText+Build\n    IMGUI_API bool      PassFilter(const char* text, const char* text_end = NULL) const;\n    IMGUI_API void      Build();\n    void                Clear() { InputBuf[0] = 0; Build(); }\n    bool                IsActive() const { return !Filters.empty(); }\n};\n\n// Helper: Text buffer for logging/accumulating text\nstruct ImGuiTextBuffer\n{\n    ImVector<char>      Buf;\n\n    ImGuiTextBuffer()   { Buf.push_back(0); }\n    inline char         operator[](int i) { return Buf.Data[i]; }\n    const char*         begin() const { return &Buf.front(); }\n    const char*         end() const { return &Buf.back(); }      // Buf is zero-terminated, so end() will point on the zero-terminator\n    int                 size() const { return Buf.Size - 1; }\n    bool                empty() { return Buf.Size <= 1; }\n    void                clear() { Buf.clear(); Buf.push_back(0); }\n    const char*         c_str() const { return Buf.Data; }\n    IMGUI_API void      append(const char* fmt, ...) IM_FMTARGS(2);\n    IMGUI_API void      appendv(const char* fmt, va_list args) IM_FMTLIST(2);\n};\n\n// Helper: Simple Key->value storage\n// Typically you don't have to worry about this since a storage is held within each Window.\n// We use it to e.g. store collapse state for a tree (Int 0/1), store color edit options. \n// This is optimized for efficient reading (dichotomy into a contiguous buffer), rare writing (typically tied to user interactions)\n// You can use it as custom user storage for temporary values. Declare your own storage if, for example:\n// - You want to manipulate the open/close state of a particular sub-tree in your interface (tree node uses Int 0/1 to store their state).\n// - You want to store custom debug data easily without adding or editing structures in your code (probably not efficient, but convenient)\n// Types are NOT stored, so it is up to you to make sure your Key don't collide with different types.\nstruct ImGuiStorage\n{\n    struct Pair\n    {\n        ImGuiID key;\n        union { int val_i; float val_f; void* val_p; };\n        Pair(ImGuiID _key, int _val_i)   { key = _key; val_i = _val_i; }\n        Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; }\n        Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; }\n    };\n    ImVector<Pair>      Data;\n\n    // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N)\n    // - Set***() functions find pair, insertion on demand if missing.\n    // - Sorted insertion is costly, paid once. A typical frame shouldn't need to insert any new pair.\n    void                Clear() { Data.clear(); }\n    IMGUI_API int       GetInt(ImGuiID key, int default_val = 0) const;\n    IMGUI_API void      SetInt(ImGuiID key, int val);\n    IMGUI_API bool      GetBool(ImGuiID key, bool default_val = false) const;\n    IMGUI_API void      SetBool(ImGuiID key, bool val);\n    IMGUI_API float     GetFloat(ImGuiID key, float default_val = 0.0f) const;\n    IMGUI_API void      SetFloat(ImGuiID key, float val);\n    IMGUI_API void*     GetVoidPtr(ImGuiID key) const; // default_val is NULL\n    IMGUI_API void      SetVoidPtr(ImGuiID key, void* val);\n\n    // - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set.\n    // - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.\n    // - A typical use case where this is convenient for quick hacking (e.g. add storage during a live Edit&Continue session if you can't modify existing struct)\n    //      float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat(\"var\", pvar, 0, 100.0f); some_var += *pvar;\n    IMGUI_API int*      GetIntRef(ImGuiID key, int default_val = 0);\n    IMGUI_API bool*     GetBoolRef(ImGuiID key, bool default_val = false);\n    IMGUI_API float*    GetFloatRef(ImGuiID key, float default_val = 0.0f);\n    IMGUI_API void**    GetVoidPtrRef(ImGuiID key, void* default_val = NULL);\n\n    // Use on your own storage if you know only integer are being stored (open/close all tree nodes)\n    IMGUI_API void      SetAllInt(int val);\n\n    // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once.\n    IMGUI_API void      BuildSortByKey();\n};\n\n// Shared state of InputText(), passed to callback when a ImGuiInputTextFlags_Callback* flag is used and the corresponding callback is triggered.\nstruct ImGuiTextEditCallbackData\n{\n    ImGuiInputTextFlags EventFlag;      // One of ImGuiInputTextFlags_Callback* // Read-only\n    ImGuiInputTextFlags Flags;          // What user passed to InputText()      // Read-only\n    void*               UserData;       // What user passed to InputText()      // Read-only\n    bool                ReadOnly;       // Read-only mode                       // Read-only\n\n    // CharFilter event:\n    ImWchar             EventChar;      // Character input                      // Read-write (replace character or set to zero)\n\n    // Completion,History,Always events:\n    // If you modify the buffer contents make sure you update 'BufTextLen' and set 'BufDirty' to true.\n    ImGuiKey            EventKey;       // Key pressed (Up/Down/TAB)            // Read-only\n    char*               Buf;            // Current text buffer                  // Read-write (pointed data only, can't replace the actual pointer)\n    int                 BufTextLen;     // Current text length in bytes         // Read-write\n    int                 BufSize;        // Maximum text length in bytes         // Read-only\n    bool                BufDirty;       // Set if you modify Buf/BufTextLen!!   // Write\n    int                 CursorPos;      //                                      // Read-write\n    int                 SelectionStart; //                                      // Read-write (== to SelectionEnd when no selection)\n    int                 SelectionEnd;   //                                      // Read-write\n\n    // NB: Helper functions for text manipulation. Calling those function loses selection.\n    IMGUI_API void    DeleteChars(int pos, int bytes_count);\n    IMGUI_API void    InsertChars(int pos, const char* text, const char* text_end = NULL);\n    bool              HasSelection() const { return SelectionStart != SelectionEnd; }\n};\n\n// Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin().\n// NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough.\nstruct ImGuiSizeConstraintCallbackData\n{\n    void*   UserData;       // Read-only.   What user passed to SetNextWindowSizeConstraints()\n    ImVec2  Pos;            // Read-only.    Window position, for reference.\n    ImVec2  CurrentSize;    // Read-only.    Current window size.\n    ImVec2  DesiredSize;    // Read-write.  Desired size, based on user's mouse position. Write to this field to restrain resizing.\n};\n\n// Helpers macros to generate 32-bits encoded colors\n#ifdef IMGUI_USE_BGRA_PACKED_COLOR\n#define IM_COL32_R_SHIFT    16\n#define IM_COL32_G_SHIFT    8\n#define IM_COL32_B_SHIFT    0\n#define IM_COL32_A_SHIFT    24\n#define IM_COL32_A_MASK     0xFF000000\n#else\n#define IM_COL32_R_SHIFT    0\n#define IM_COL32_G_SHIFT    8\n#define IM_COL32_B_SHIFT    16\n#define IM_COL32_A_SHIFT    24\n#define IM_COL32_A_MASK     0xFF000000\n#endif\n#define IM_COL32(R,G,B,A)    (((ImU32)(A)<<IM_COL32_A_SHIFT) | ((ImU32)(B)<<IM_COL32_B_SHIFT) | ((ImU32)(G)<<IM_COL32_G_SHIFT) | ((ImU32)(R)<<IM_COL32_R_SHIFT))\n#define IM_COL32_WHITE       IM_COL32(255,255,255,255)  // Opaque white = 0xFFFFFFFF\n#define IM_COL32_BLACK       IM_COL32(0,0,0,255)        // Opaque black\n#define IM_COL32_BLACK_TRANS IM_COL32(0,0,0,0)          // Transparent black = 0x00000000\n\n// ImColor() helper to implicity converts colors to either ImU32 (packed 4x1 byte) or ImVec4 (4x1 float)\n// Prefer using IM_COL32() macros if you want a guaranteed compile-time ImU32 for usage with ImDrawList API.\n// **Avoid storing ImColor! Store either u32 of ImVec4. This is not a full-featured color class. MAY OBSOLETE.\n// **None of the ImGui API are using ImColor directly but you can use it as a convenience to pass colors in either ImU32 or ImVec4 formats. Explicitly cast to ImU32 or ImVec4 if needed.\nstruct ImColor\n{\n    ImVec4              Value;\n\n    ImColor()                                                       { Value.x = Value.y = Value.z = Value.w = 0.0f; }\n    ImColor(int r, int g, int b, int a = 255)                       { float sc = 1.0f/255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; }\n    ImColor(ImU32 rgba)                                             { float sc = 1.0f/255.0f; Value.x = (float)((rgba>>IM_COL32_R_SHIFT)&0xFF) * sc; Value.y = (float)((rgba>>IM_COL32_G_SHIFT)&0xFF) * sc; Value.z = (float)((rgba>>IM_COL32_B_SHIFT)&0xFF) * sc; Value.w = (float)((rgba>>IM_COL32_A_SHIFT)&0xFF) * sc; }\n    ImColor(float r, float g, float b, float a = 1.0f)              { Value.x = r; Value.y = g; Value.z = b; Value.w = a; }\n    ImColor(const ImVec4& col)                                      { Value = col; }\n    inline operator ImU32() const                                   { return ImGui::ColorConvertFloat4ToU32(Value); }\n    inline operator ImVec4() const                                  { return Value; }\n\n    // FIXME-OBSOLETE: May need to obsolete/cleanup those helpers.\n    inline void    SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; }\n    static ImColor HSV(float h, float s, float v, float a = 1.0f)   { float r,g,b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r,g,b,a); }\n};\n\n// Helper: Manually clip large list of items.\n// If you are submitting lots of evenly spaced items and you have a random access to the list, you can perform coarse clipping based on visibility to save yourself from processing those items at all.\n// The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped. \n// ImGui already clip items based on their bounds but it needs to measure text size to do so. Coarse clipping before submission makes this cost and your own data fetching/submission cost null.\n// Usage:\n//     ImGuiListClipper clipper(1000);  // we have 1000 elements, evenly spaced.\n//     while (clipper.Step())\n//         for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)\n//             ImGui::Text(\"line number %d\", i);\n// - Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height (step skipped if we passed a known height as second arg to constructor).\n// - Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element.\n// - (Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user call Step(). Does nothing and switch to Step 3.)\n// - Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop.\nstruct ImGuiListClipper\n{\n    float   StartPosY;\n    float   ItemsHeight;\n    int     ItemsCount, StepNo, DisplayStart, DisplayEnd;\n\n    // items_count:  Use -1 to ignore (you can call Begin later). Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step).\n    // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetItemsLineHeightWithSpacing().\n    // If you don't specify an items_height, you NEED to call Step(). If you specify items_height you may call the old Begin()/End() api directly, but prefer calling Step().\n    ImGuiListClipper(int items_count = -1, float items_height = -1.0f)  { Begin(items_count, items_height); } // NB: Begin() initialize every fields (as we allow user to call Begin/End multiple times on a same instance if they want).\n    ~ImGuiListClipper()                                                 { IM_ASSERT(ItemsCount == -1); }      // Assert if user forgot to call End() or Step() until false.\n\n    IMGUI_API bool Step();                                              // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items.\n    IMGUI_API void Begin(int items_count, float items_height = -1.0f);  // Automatically called by constructor if you passed 'items_count' or by Step() in Step 1.\n    IMGUI_API void End();                                               // Automatically called on the last call of Step() that returns false.\n};\n\n//-----------------------------------------------------------------------------\n// Draw List\n// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList.\n//-----------------------------------------------------------------------------\n\n// Draw callbacks for advanced uses.\n// NB- You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering (you can poke into the draw list for that)\n// Draw callback may be useful for example, A) Change your GPU render state, B) render a complex 3D scene inside a UI element (without an intermediate texture/render target), etc.\n// The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) cmd.UserCallback(parent_list, cmd); else RenderTriangles()'\ntypedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd);\n\n// Typically, 1 command = 1 gpu draw call (unless command is a callback)\nstruct ImDrawCmd\n{\n    unsigned int    ElemCount;              // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[].\n    ImVec4          ClipRect;               // Clipping rectangle (x1, y1, x2, y2)\n    ImTextureID     TextureId;              // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas.\n    ImDrawCallback  UserCallback;           // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally.\n    void*           UserCallbackData;       // The draw callback code can access this.\n\n    ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = -8192.0f; ClipRect.z = ClipRect.w = +8192.0f; TextureId = NULL; UserCallback = NULL; UserCallbackData = NULL; }\n};\n\n// Vertex index (override with '#define ImDrawIdx unsigned int' inside in imconfig.h)\n#ifndef ImDrawIdx\ntypedef unsigned short ImDrawIdx;\n#endif\n\n// Vertex layout\n#ifndef IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT\nstruct ImDrawVert\n{\n    ImVec2  pos;\n    ImVec2  uv;\n    ImU32   col;\n};\n#else\n// You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h\n// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine.\n// The type has to be described within the macro (you can either declare the struct or use a typedef)\n// NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM. \nIMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT;\n#endif\n\n// Draw channels are used by the Columns API to \"split\" the render list into different channels while building, so items of each column can be batched together.\n// You can also use them to simulate drawing layers and submit primitives in a different order than how they will be rendered.\nstruct ImDrawChannel\n{\n    ImVector<ImDrawCmd>     CmdBuffer;\n    ImVector<ImDrawIdx>     IdxBuffer;\n};\n\nenum ImDrawCornerFlags_\n{\n    ImDrawCornerFlags_TopLeft   = 1 << 0, // 0x1\n    ImDrawCornerFlags_TopRight  = 1 << 1, // 0x2\n    ImDrawCornerFlags_BotLeft   = 1 << 2, // 0x4\n    ImDrawCornerFlags_BotRight  = 1 << 3, // 0x8\n    ImDrawCornerFlags_Top       = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight,   // 0x3\n    ImDrawCornerFlags_Bot       = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight,   // 0xC\n    ImDrawCornerFlags_Left      = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft,    // 0x5\n    ImDrawCornerFlags_Right     = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight,  // 0xA\n    ImDrawCornerFlags_All       = 0xF     // In your function calls you may use ~0 (= all bits sets) instead of ImDrawCornerFlags_All, as a convenience\n};\n\n// Draw command list\n// This is the low-level list of polygons that ImGui functions are filling. At the end of the frame, all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering.\n// At the moment, each ImGui window contains its own ImDrawList but they could potentially be merged in the future.\n// If you want to add custom rendering within a window, you can use ImGui::GetWindowDrawList() to access the current draw list and add your own primitives.\n// You can interleave normal ImGui:: calls and adding primitives to the current draw list.\n// All positions are generally in pixel coordinates (top-left at (0,0), bottom-right at io.DisplaySize), however you are totally free to apply whatever transformation matrix to want to the data (if you apply such transformation you'll want to apply it to ClipRect as well)\n// Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions).\nstruct ImDrawList\n{\n    // This is what you have to render\n    ImVector<ImDrawCmd>     CmdBuffer;          // Commands. Typically 1 command = 1 GPU draw call.\n    ImVector<ImDrawIdx>     IdxBuffer;          // Index buffer. Each command consume ImDrawCmd::ElemCount of those\n    ImVector<ImDrawVert>    VtxBuffer;          // Vertex buffer.\n\n    // [Internal, used while building lists]\n    const char*             _OwnerName;         // Pointer to owner window's name for debugging\n    unsigned int            _VtxCurrentIdx;     // [Internal] == VtxBuffer.Size\n    ImDrawVert*             _VtxWritePtr;       // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)\n    ImDrawIdx*              _IdxWritePtr;       // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)\n    ImVector<ImVec4>        _ClipRectStack;     // [Internal]\n    ImVector<ImTextureID>   _TextureIdStack;    // [Internal]\n    ImVector<ImVec2>        _Path;              // [Internal] current path building\n    int                     _ChannelsCurrent;   // [Internal] current channel number (0)\n    int                     _ChannelsCount;     // [Internal] number of active channels (1+)\n    ImVector<ImDrawChannel> _Channels;          // [Internal] draw channels for columns API (not resized down so _ChannelsCount may be smaller than _Channels.Size)\n\n    ImDrawList()  { _OwnerName = NULL; Clear(); }\n    ~ImDrawList() { ClearFreeMemory(); }\n    IMGUI_API void  PushClipRect(ImVec2 clip_rect_min, ImVec2 clip_rect_max, bool intersect_with_current_clip_rect = false);  // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)\n    IMGUI_API void  PushClipRectFullScreen();\n    IMGUI_API void  PopClipRect();\n    IMGUI_API void  PushTextureID(const ImTextureID& texture_id);\n    IMGUI_API void  PopTextureID();\n    inline ImVec2   GetClipRectMin() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.x, cr.y); }\n    inline ImVec2   GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); }\n\n    // Primitives\n    IMGUI_API void  AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);\n    IMGUI_API void  AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All, float thickness = 1.0f);   // a: upper-left, b: lower-right, rounding_corners_flags: 4-bits corresponding to which corner to round\n    IMGUI_API void  AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All);                     // a: upper-left, b: lower-right\n    IMGUI_API void  AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);\n    IMGUI_API void  AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness = 1.0f);\n    IMGUI_API void  AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col);\n    IMGUI_API void  AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness = 1.0f);\n    IMGUI_API void  AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col);\n    IMGUI_API void  AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f);\n    IMGUI_API void  AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12);\n    IMGUI_API void  AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);\n    IMGUI_API void  AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);\n    IMGUI_API void  AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,1), ImU32 col = 0xFFFFFFFF);\n    IMGUI_API void  AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,0), const ImVec2& uv_c = ImVec2(1,1), const ImVec2& uv_d = ImVec2(0,1), ImU32 col = 0xFFFFFFFF);\n    IMGUI_API void  AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners = ImDrawCornerFlags_All);\n    IMGUI_API void  AddPolyline(const ImVec2* points, const int num_points, ImU32 col, bool closed, float thickness, bool anti_aliased);\n    IMGUI_API void  AddConvexPolyFilled(const ImVec2* points, const int num_points, ImU32 col, bool anti_aliased);\n    IMGUI_API void  AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments = 0);\n\n    // Stateful path API, add points then finish with PathFill() or PathStroke()\n    inline    void  PathClear()                                                 { _Path.resize(0); }\n    inline    void  PathLineTo(const ImVec2& pos)                               { _Path.push_back(pos); }\n    inline    void  PathLineToMergeDuplicate(const ImVec2& pos)                 { if (_Path.Size == 0 || memcmp(&_Path[_Path.Size-1], &pos, 8) != 0) _Path.push_back(pos); }\n    inline    void  PathFillConvex(ImU32 col)                                   { AddConvexPolyFilled(_Path.Data, _Path.Size, col, true); PathClear(); }\n    inline    void  PathStroke(ImU32 col, bool closed, float thickness = 1.0f)  { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness, true); PathClear(); }\n    IMGUI_API void  PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments = 10);\n    IMGUI_API void  PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12);                                // Use precomputed angles for a 12 steps circle\n    IMGUI_API void  PathBezierCurveTo(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, int num_segments = 0);\n    IMGUI_API void  PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All);\n\n    // Channels\n    // - Use to simulate layers. By switching channels to can render out-of-order (e.g. submit foreground primitives before background primitives)\n    // - Use to minimize draw calls (e.g. if going back-and-forth between multiple non-overlapping clipping rectangles, prefer to append into separate channels then merge at the end)\n    IMGUI_API void  ChannelsSplit(int channels_count);\n    IMGUI_API void  ChannelsMerge();\n    IMGUI_API void  ChannelsSetCurrent(int channel_index);\n\n    // Advanced\n    IMGUI_API void  AddCallback(ImDrawCallback callback, void* callback_data);  // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles.\n    IMGUI_API void  AddDrawCmd();                                               // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible\n\n    // Internal helpers\n    // NB: all primitives needs to be reserved via PrimReserve() beforehand!\n    IMGUI_API void  Clear();\n    IMGUI_API void  ClearFreeMemory();\n    IMGUI_API void  PrimReserve(int idx_count, int vtx_count);\n    IMGUI_API void  PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col);      // Axis aligned rectangle (composed of two triangles)\n    IMGUI_API void  PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col);\n    IMGUI_API void  PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col);\n    inline    void  PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col){ _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; }\n    inline    void  PrimWriteIdx(ImDrawIdx idx)                                 { *_IdxWritePtr = idx; _IdxWritePtr++; }\n    inline    void  PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col)     { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); }\n    IMGUI_API void  UpdateClipRect();\n    IMGUI_API void  UpdateTextureID();\n};\n\n// All draw data to render an ImGui frame\nstruct ImDrawData\n{\n    bool            Valid;                  // Only valid after Render() is called and before the next NewFrame() is called.\n    ImDrawList**    CmdLists;\n    int             CmdListsCount;\n    int             TotalVtxCount;          // For convenience, sum of all cmd_lists vtx_buffer.Size\n    int             TotalIdxCount;          // For convenience, sum of all cmd_lists idx_buffer.Size\n\n    // Functions\n    ImDrawData() { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; }\n    IMGUI_API void DeIndexAllBuffers();               // For backward compatibility or convenience: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!\n    IMGUI_API void ScaleClipRects(const ImVec2& sc);  // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.\n};\n\nstruct ImFontConfig\n{\n    void*           FontData;                   //          // TTF/OTF data\n    int             FontDataSize;               //          // TTF/OTF data size\n    bool            FontDataOwnedByAtlas;       // true     // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself).\n    int             FontNo;                     // 0        // Index of font within TTF/OTF file\n    float           SizePixels;                 //          // Size in pixels for rasterizer.\n    int             OversampleH, OversampleV;   // 3, 1     // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis.\n    bool            PixelSnapH;                 // false    // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.\n    ImVec2          GlyphExtraSpacing;          // 0, 0     // Extra spacing (in pixels) between glyphs. Only X axis is supported for now.\n    ImVec2          GlyphOffset;                // 0, 0     // Offset all glyphs from this font input.\n    const ImWchar*  GlyphRanges;                // NULL     // Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE.\n    bool            MergeMode;                  // false    // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.\n    unsigned int    RasterizerFlags;            // 0x00     // Settings for custom font rasterizer (e.g. ImGuiFreeType). Leave as zero if you aren't using one.\n    float           RasterizerMultiply;         // 1.0f     // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable.\n\n    // [Internal]\n    char            Name[32];                               // Name (strictly to ease debugging)\n    ImFont*         DstFont;\n\n    IMGUI_API ImFontConfig();\n};\n\nstruct ImFontGlyph\n{\n    ImWchar         Codepoint;          // 0x0000..0xFFFF\n    float           AdvanceX;           // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in)\n    float           X0, Y0, X1, Y1;     // Glyph corners\n    float           U0, V0, U1, V1;     // Texture coordinates\n};\n\n// Load and rasterize multiple TTF/OTF fonts into a same texture.\n// Sharing a texture for multiple fonts allows us to reduce the number of draw calls during rendering.\n// We also add custom graphic data into the texture that serves for ImGui.\n//  1. (Optional) Call AddFont*** functions. If you don't call any, the default font will be loaded for you.\n//  2. Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data.\n//  3. Upload the pixels data into a texture within your graphics system.\n//  4. Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture. This value will be passed back to you during rendering to identify the texture.\n// IMPORTANT: If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the ImFont is build (when calling GetTextData*** or Build()). We only copy the pointer, not the data.\nstruct ImFontAtlas\n{\n    IMGUI_API ImFontAtlas();\n    IMGUI_API ~ImFontAtlas();\n    IMGUI_API ImFont*           AddFont(const ImFontConfig* font_cfg);\n    IMGUI_API ImFont*           AddFontDefault(const ImFontConfig* font_cfg = NULL);\n    IMGUI_API ImFont*           AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);\n    IMGUI_API ImFont*           AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after Build(). Set font_cfg->FontDataOwnedByAtlas to false to keep ownership.\n    IMGUI_API ImFont*           AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.\n    IMGUI_API ImFont*           AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL);              // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.\n    IMGUI_API void              ClearTexData();             // Clear the CPU-side texture data. Saves RAM once the texture has been copied to graphics memory.\n    IMGUI_API void              ClearInputData();           // Clear the input TTF data (inc sizes, glyph ranges)\n    IMGUI_API void              ClearFonts();               // Clear the ImGui-side font data (glyphs storage, UV coordinates)\n    IMGUI_API void              Clear();                    // Clear all\n\n    // Build atlas, retrieve pixel data.\n    // User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID().\n    // RGBA32 format is provided for convenience and compatibility, but note that unless you use CustomRect to draw color data, the RGB pixels emitted from Fonts will all be white (~75% of waste). \n    // Pitch = Width * BytesPerPixels\n    IMGUI_API bool              Build();                    // Build pixels data. This is called automatically for you by the GetTexData*** functions.\n    IMGUI_API void              GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 1 byte per-pixel\n    IMGUI_API void              GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 4 bytes-per-pixel\n    void                        SetTexID(ImTextureID id)    { TexID = id; }\n\n    //-------------------------------------------\n    // Glyph Ranges\n    //-------------------------------------------\n\n    // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)\n    // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8\"Hello world\" syntax. See FAQ for details.\n    IMGUI_API const ImWchar*    GetGlyphRangesDefault();    // Basic Latin, Extended Latin\n    IMGUI_API const ImWchar*    GetGlyphRangesKorean();     // Default + Korean characters\n    IMGUI_API const ImWchar*    GetGlyphRangesJapanese();   // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs\n    IMGUI_API const ImWchar*    GetGlyphRangesChinese();    // Default + Japanese + full set of about 21000 CJK Unified Ideographs\n    IMGUI_API const ImWchar*    GetGlyphRangesCyrillic();   // Default + about 400 Cyrillic characters\n    IMGUI_API const ImWchar*    GetGlyphRangesThai();       // Default + Thai characters\n\n    // Helpers to build glyph ranges from text data. Feed your application strings/characters to it then call BuildRanges().\n    struct GlyphRangesBuilder\n    {\n        ImVector<unsigned char> UsedChars;  // Store 1-bit per Unicode code point (0=unused, 1=used)\n        GlyphRangesBuilder()                { UsedChars.resize(0x10000 / 8); memset(UsedChars.Data, 0, 0x10000 / 8); }\n        bool           GetBit(int n)        { return (UsedChars[n >> 3] & (1 << (n & 7))) != 0; }\n        void           SetBit(int n)        { UsedChars[n >> 3] |= 1 << (n & 7); }  // Set bit 'c' in the array\n        void           AddChar(ImWchar c)   { SetBit(c); }                          // Add character\n        IMGUI_API void AddText(const char* text, const char* text_end = NULL);      // Add string (each character of the UTF-8 string are added)\n        IMGUI_API void AddRanges(const ImWchar* ranges);                            // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault) to force add all of ASCII/Latin+Ext\n        IMGUI_API void BuildRanges(ImVector<ImWchar>* out_ranges);                  // Output new ranges\n    };\n\n    //-------------------------------------------\n    // Custom Rectangles/Glyphs API\n    //-------------------------------------------\n\n    // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. After calling Build(), you can query the rectangle position and render your pixels.\n    // You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), so you can render e.g. custom colorful icons and use them as regular glyphs.\n    struct CustomRect\n    {\n        unsigned int    ID;             // Input    // User ID. Use <0x10000 to map into a font glyph, >=0x10000 for other/internal/custom texture data.\n        unsigned short  Width, Height;  // Input    // Desired rectangle dimension\n        unsigned short  X, Y;           // Output   // Packed position in Atlas\n        float           GlyphAdvanceX;  // Input    // For custom font glyphs only (ID<0x10000): glyph xadvance\n        ImVec2          GlyphOffset;    // Input    // For custom font glyphs only (ID<0x10000): glyph display offset\n        ImFont*         Font;           // Input    // For custom font glyphs only (ID<0x10000): target font\n        CustomRect()            { ID = 0xFFFFFFFF; Width = Height = 0; X = Y = 0xFFFF; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0,0); Font = NULL; }\n        bool IsPacked() const   { return X != 0xFFFF; }\n    };\n\n    IMGUI_API int       AddCustomRectRegular(unsigned int id, int width, int height);                                                                   // Id needs to be >= 0x10000. Id >= 0x80000000 are reserved for ImGui and ImDrawList\n    IMGUI_API int       AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0,0));   // Id needs to be < 0x10000 to register a rectangle to map into a specific font.\n    IMGUI_API void      CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max);\n    const CustomRect*   GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; }\n\n    //-------------------------------------------\n    // Members\n    //-------------------------------------------\n\n    ImTextureID                 TexID;              // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.\n    int                         TexDesiredWidth;    // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.\n    int                         TexGlyphPadding;    // Padding between glyphs within texture in pixels. Defaults to 1.\n\n    // [Internal]\n    // NB: Access texture data via GetTexData*() calls! Which will setup a default font for you.\n    unsigned char*              TexPixelsAlpha8;    // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight\n    unsigned int*               TexPixelsRGBA32;    // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4\n    int                         TexWidth;           // Texture width calculated during Build().\n    int                         TexHeight;          // Texture height calculated during Build().\n    ImVec2                      TexUvWhitePixel;    // Texture coordinates to a white pixel\n    ImVector<ImFont*>           Fonts;              // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.\n    ImVector<CustomRect>        CustomRects;        // Rectangles for packing custom texture data into the atlas.\n    ImVector<ImFontConfig>      ConfigData;         // Internal data\n    int                         CustomRectIds[1];   // Identifiers of custom texture rectangle used by ImFontAtlas/ImDrawList\n};\n\n// Font runtime data and rendering\n// ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32().\nstruct ImFont\n{\n    // Members: Hot ~62/78 bytes\n    float                       FontSize;           // <user set>   // Height of characters, set during loading (don't change after loading)\n    float                       Scale;              // = 1.f        // Base font scale, multiplied by the per-window font scale which you can adjust with SetFontScale()\n    ImVec2                      DisplayOffset;      // = (0.f,1.f)  // Offset font rendering by xx pixels\n    ImVector<ImFontGlyph>       Glyphs;             //              // All glyphs.\n    ImVector<float>             IndexAdvanceX;      //              // Sparse. Glyphs->AdvanceX in a directly indexable way (more cache-friendly, for CalcTextSize functions which are often bottleneck in large UI).\n    ImVector<unsigned short>    IndexLookup;        //              // Sparse. Index glyphs by Unicode code-point.\n    const ImFontGlyph*          FallbackGlyph;      // == FindGlyph(FontFallbackChar)\n    float                       FallbackAdvanceX;   // == FallbackGlyph->AdvanceX\n    ImWchar                     FallbackChar;       // = '?'        // Replacement glyph if one isn't found. Only set via SetFallbackChar()\n\n    // Members: Cold ~18/26 bytes\n    short                       ConfigDataCount;    // ~ 1          // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.\n    ImFontConfig*               ConfigData;         //              // Pointer within ContainerAtlas->ConfigData\n    ImFontAtlas*                ContainerAtlas;     //              // What we has been loaded into\n    float                       Ascent, Descent;    //              // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]\n    int                         MetricsTotalSurface;//              // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)\n\n    // Methods\n    IMGUI_API ImFont();\n    IMGUI_API ~ImFont();\n    IMGUI_API void              ClearOutputData();\n    IMGUI_API void              BuildLookupTable();\n    IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const;\n    IMGUI_API void              SetFallbackChar(ImWchar c);\n    float                       GetCharAdvance(ImWchar c) const     { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; }\n    bool                        IsLoaded() const                    { return ContainerAtlas != NULL; }\n\n    // 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable.\n    // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable.\n    IMGUI_API ImVec2            CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8\n    IMGUI_API const char*       CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const;\n    IMGUI_API void              RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const;\n    IMGUI_API void              RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const;\n\n    // [Internal]\n    IMGUI_API void              GrowIndex(int new_size);\n    IMGUI_API void              AddGlyph(ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x);\n    IMGUI_API void              AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.\n\n#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS\n    typedef ImFontGlyph Glyph; // OBSOLETE 1.52+\n#endif\n};\n\n#if defined(__clang__)\n#pragma clang diagnostic pop\n#endif\n\n// Include imgui_user.h at the end of imgui.h (convenient for user to only explicitly include vanilla imgui.h)\n#ifdef IMGUI_INCLUDE_IMGUI_USER_H\n#include \"imgui_user.h\"\n#endif\n"
  },
  {
    "path": "external/imgui/imgui_demo.cpp",
    "content": "// dear imgui, v1.53 WIP\n// (demo code)\n\n// Message to the person tempted to delete this file when integrating ImGui into their code base:\n// Don't do it! Do NOT remove this file from your project! It is useful reference code that you and other users will want to refer to.\n// Everything in this file will be stripped out by the linker if you don't call ImGui::ShowTestWindow().\n// During development, you can call ImGui::ShowTestWindow() in your code to learn about various features of ImGui. Have it wired in a debug menu!\n// Removing this file from your project is hindering access to documentation for everyone in your team, likely leading you to poorer usage of the library.\n// Note that you can #define IMGUI_DISABLE_TEST_WINDOWS in imconfig.h for the same effect.\n// If you want to link core ImGui in your public builds but not those test windows, #define IMGUI_DISABLE_TEST_WINDOWS in imconfig.h and those functions will be empty.\n// For any other case, if you have ImGui available you probably want this to be available for reference and execution.\n// Thank you,\n// -Your beloved friend, imgui_demo.cpp (that you won't delete)\n\n// Message to beginner C/C++ programmer about the meaning of 'static': in this demo code, we frequently we use 'static' variables inside functions. \n// We do this as a way to gather code and data in the same place, make the demo code faster to read, faster to write, and smaller. A static variable persist across calls, \n// so it is essentially like a global variable but declared inside the scope of the function.\n// It also happens to be a convenient way of storing simple UI related information as long as your function doesn't need to be reentrant or used in threads.\n// This may be a pattern you want to use in your code (simple is beautiful!), but most of the real data you would be editing is likely to be stored outside your function.\n\n#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include \"imgui.h\"\n#include <ctype.h>          // toupper, isprint\n#include <math.h>           // sqrtf, powf, cosf, sinf, floorf, ceilf\n#include <stdio.h>          // vsnprintf, sscanf, printf\n#include <stdlib.h>         // NULL, malloc, free, atoi\n#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier\n#include <stddef.h>         // intptr_t\n#else\n#include <stdint.h>         // intptr_t\n#endif\n\n#ifdef _MSC_VER\n#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen\n#define snprintf _snprintf\n#endif\n#ifdef __clang__\n#pragma clang diagnostic ignored \"-Wold-style-cast\"             // warning : use of old-style cast                              // yes, they are more terse.\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"    // warning : 'xx' is deprecated: The POSIX name for this item.. // for strdup used in demo code (so user can copy & paste the code)\n#pragma clang diagnostic ignored \"-Wint-to-void-pointer-cast\"   // warning : cast to 'void *' from smaller integer type 'int'\n#pragma clang diagnostic ignored \"-Wformat-security\"            // warning : warning: format string is not a string literal\n#pragma clang diagnostic ignored \"-Wexit-time-destructors\"      // warning : declaration requires an exit-time destructor       // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals.\n#if __has_warning(\"-Wreserved-id-macro\")\n#pragma clang diagnostic ignored \"-Wreserved-id-macro\"          // warning : macro name is a reserved identifier                //\n#endif\n#elif defined(__GNUC__)\n#pragma GCC diagnostic ignored \"-Wint-to-pointer-cast\"          // warning: cast to pointer from integer of different size\n#pragma GCC diagnostic ignored \"-Wformat-security\"              // warning : format string is not a string literal (potentially insecure)\n#pragma GCC diagnostic ignored \"-Wdouble-promotion\"             // warning: implicit conversion from 'float' to 'double' when passing argument to function\n#pragma GCC diagnostic ignored \"-Wconversion\"                   // warning: conversion to 'xxxx' from 'xxxx' may alter its value\n#if (__GNUC__ >= 6)\n#pragma GCC diagnostic ignored \"-Wmisleading-indentation\"       // warning: this 'if' clause does not guard this statement      // GCC 6.0+ only. See #883 on github.\n#endif\n#endif\n\n// Play it nice with Windows users. Notepad in 2015 still doesn't display text data with Unix-style \\n.\n#ifdef _WIN32\n#define IM_NEWLINE \"\\r\\n\"\n#else\n#define IM_NEWLINE \"\\n\"\n#endif\n\n#define IM_ARRAYSIZE(_ARR)  ((int)(sizeof(_ARR)/sizeof(*_ARR)))\n#define IM_MAX(_A,_B)       (((_A) >= (_B)) ? (_A) : (_B))\n\n//-----------------------------------------------------------------------------\n// DEMO CODE\n//-----------------------------------------------------------------------------\n\n#ifndef IMGUI_DISABLE_TEST_WINDOWS\n\nstatic void ShowExampleAppConsole(bool* p_open);\nstatic void ShowExampleAppLog(bool* p_open);\nstatic void ShowExampleAppLayout(bool* p_open);\nstatic void ShowExampleAppPropertyEditor(bool* p_open);\nstatic void ShowExampleAppLongText(bool* p_open);\nstatic void ShowExampleAppAutoResize(bool* p_open);\nstatic void ShowExampleAppConstrainedResize(bool* p_open);\nstatic void ShowExampleAppFixedOverlay(bool* p_open);\nstatic void ShowExampleAppManipulatingWindowTitle(bool* p_open);\nstatic void ShowExampleAppCustomRendering(bool* p_open);\nstatic void ShowExampleAppMainMenuBar();\nstatic void ShowExampleMenuFile();\n\nstatic void ShowHelpMarker(const char* desc)\n{\n    ImGui::TextDisabled(\"(?)\");\n    if (ImGui::IsItemHovered())\n    {\n        ImGui::BeginTooltip();\n        ImGui::PushTextWrapPos(450.0f);\n        ImGui::TextUnformatted(desc);\n        ImGui::PopTextWrapPos();\n        ImGui::EndTooltip();\n    }\n}\n\nvoid ImGui::ShowUserGuide()\n{\n    ImGui::BulletText(\"Double-click on title bar to collapse window.\");\n    ImGui::BulletText(\"Click and drag on lower right corner to resize window\\n(double-click to auto fit window to its contents).\");\n    ImGui::BulletText(\"Click and drag on any empty space to move window.\");\n    ImGui::BulletText(\"TAB/SHIFT+TAB to cycle through keyboard editable fields.\");\n    ImGui::BulletText(\"CTRL+Click on a slider or drag box to input value as text.\");\n    if (ImGui::GetIO().FontAllowUserScaling)\n        ImGui::BulletText(\"CTRL+Mouse Wheel to zoom window contents.\");\n    ImGui::BulletText(\"Mouse Wheel to scroll.\");\n    ImGui::BulletText(\"While editing text:\\n\");\n    ImGui::Indent();\n    ImGui::BulletText(\"Hold SHIFT or use mouse to select text.\");\n    ImGui::BulletText(\"CTRL+Left/Right to word jump.\");\n    ImGui::BulletText(\"CTRL+A or double-click to select all.\");\n    ImGui::BulletText(\"CTRL+X,CTRL+C,CTRL+V to use clipboard.\");\n    ImGui::BulletText(\"CTRL+Z,CTRL+Y to undo/redo.\");\n    ImGui::BulletText(\"ESCAPE to revert.\");\n    ImGui::BulletText(\"You can apply arithmetic operators +,*,/ on numerical values.\\nUse +- to subtract.\");\n    ImGui::Unindent();\n}\n\n// Demonstrate most ImGui features (big function!)\nvoid ImGui::ShowTestWindow(bool* p_open)\n{\n    // Examples apps\n    static bool show_app_main_menu_bar = false;\n    static bool show_app_console = false;\n    static bool show_app_log = false;\n    static bool show_app_layout = false;\n    static bool show_app_property_editor = false;\n    static bool show_app_long_text = false;\n    static bool show_app_auto_resize = false;\n    static bool show_app_constrained_resize = false;\n    static bool show_app_fixed_overlay = false;\n    static bool show_app_manipulating_window_title = false;\n    static bool show_app_custom_rendering = false;\n    static bool show_app_style_editor = false;\n\n    static bool show_app_metrics = false;\n    static bool show_app_about = false;\n\n    if (show_app_main_menu_bar) ShowExampleAppMainMenuBar();\n    if (show_app_console) ShowExampleAppConsole(&show_app_console);\n    if (show_app_log) ShowExampleAppLog(&show_app_log);\n    if (show_app_layout) ShowExampleAppLayout(&show_app_layout);\n    if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor);\n    if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text);\n    if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize);\n    if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize);\n    if (show_app_fixed_overlay) ShowExampleAppFixedOverlay(&show_app_fixed_overlay);\n    if (show_app_manipulating_window_title) ShowExampleAppManipulatingWindowTitle(&show_app_manipulating_window_title);\n    if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering);\n\n    if (show_app_metrics) ImGui::ShowMetricsWindow(&show_app_metrics);\n    if (show_app_style_editor) { ImGui::Begin(\"Style Editor\", &show_app_style_editor); ImGui::ShowStyleEditor(); ImGui::End(); }\n    if (show_app_about)\n    {\n        ImGui::Begin(\"About ImGui\", &show_app_about, ImGuiWindowFlags_AlwaysAutoResize);\n        ImGui::Text(\"dear imgui, %s\", ImGui::GetVersion());\n        ImGui::Separator();\n        ImGui::Text(\"By Omar Cornut and all github contributors.\");\n        ImGui::Text(\"ImGui is licensed under the MIT License, see LICENSE for more information.\");\n        ImGui::End();\n    }\n\n    static bool no_titlebar = false;\n    static bool no_scrollbar = false;\n    static bool no_menu = false;\n    static bool no_move = false;\n    static bool no_resize = false;\n    static bool no_collapse = false;\n\n    // Demonstrate the various window flags. Typically you would just use the default.\n    ImGuiWindowFlags window_flags = 0;\n    if (no_titlebar)  window_flags |= ImGuiWindowFlags_NoTitleBar;\n    if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar;\n    if (!no_menu)     window_flags |= ImGuiWindowFlags_MenuBar;\n    if (no_move)      window_flags |= ImGuiWindowFlags_NoMove;\n    if (no_resize)    window_flags |= ImGuiWindowFlags_NoResize;\n    if (no_collapse)  window_flags |= ImGuiWindowFlags_NoCollapse;\n    ImGui::SetNextWindowSize(ImVec2(550,680), ImGuiCond_FirstUseEver);\n    if (!ImGui::Begin(\"ImGui Demo\", p_open, window_flags))\n    {\n        // Early out if the window is collapsed, as an optimization.\n        ImGui::End();\n        return;\n    }\n\n    //ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.65f);    // 2/3 of the space for widget and 1/3 for labels\n    ImGui::PushItemWidth(-140);                                 // Right align, keep 140 pixels for labels\n\n    ImGui::Text(\"dear imgui says hello. (%s)\", IMGUI_VERSION);\n\n    // Menu\n    if (ImGui::BeginMenuBar())\n    {\n        if (ImGui::BeginMenu(\"Menu\"))\n        {\n            ShowExampleMenuFile();\n            ImGui::EndMenu();\n        }\n        if (ImGui::BeginMenu(\"Examples\"))\n        {\n            ImGui::MenuItem(\"Main menu bar\", NULL, &show_app_main_menu_bar);\n            ImGui::MenuItem(\"Console\", NULL, &show_app_console);\n            ImGui::MenuItem(\"Log\", NULL, &show_app_log);\n            ImGui::MenuItem(\"Simple layout\", NULL, &show_app_layout);\n            ImGui::MenuItem(\"Property editor\", NULL, &show_app_property_editor);\n            ImGui::MenuItem(\"Long text display\", NULL, &show_app_long_text);\n            ImGui::MenuItem(\"Auto-resizing window\", NULL, &show_app_auto_resize);\n            ImGui::MenuItem(\"Constrained-resizing window\", NULL, &show_app_constrained_resize);\n            ImGui::MenuItem(\"Simple overlay\", NULL, &show_app_fixed_overlay);\n            ImGui::MenuItem(\"Manipulating window title\", NULL, &show_app_manipulating_window_title);\n            ImGui::MenuItem(\"Custom rendering\", NULL, &show_app_custom_rendering);\n            ImGui::EndMenu();\n        }\n        if (ImGui::BeginMenu(\"Help\"))\n        {\n            ImGui::MenuItem(\"Metrics\", NULL, &show_app_metrics);\n            ImGui::MenuItem(\"Style Editor\", NULL, &show_app_style_editor);\n            ImGui::MenuItem(\"About ImGui\", NULL, &show_app_about);\n            ImGui::EndMenu();\n        }\n        ImGui::EndMenuBar();\n    }\n\n    ImGui::Spacing();\n    if (ImGui::CollapsingHeader(\"Help\"))\n    {\n        ImGui::TextWrapped(\"This window is being created by the ShowTestWindow() function. Please refer to the code in imgui_demo.cpp for reference.\\n\\n\");\n        ImGui::Text(\"USER GUIDE:\");\n        ImGui::ShowUserGuide();\n    }\n\n    if (ImGui::CollapsingHeader(\"Window options\"))\n    {\n        ImGui::Checkbox(\"No titlebar\", &no_titlebar); ImGui::SameLine(150);\n        ImGui::Checkbox(\"No scrollbar\", &no_scrollbar); ImGui::SameLine(300);\n        ImGui::Checkbox(\"No menu\", &no_menu);\n        ImGui::Checkbox(\"No move\", &no_move); ImGui::SameLine(150);\n        ImGui::Checkbox(\"No resize\", &no_resize); ImGui::SameLine(300);\n        ImGui::Checkbox(\"No collapse\", &no_collapse);\n\n        if (ImGui::TreeNode(\"Style\"))\n        {\n            ImGui::ShowStyleEditor();\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Logging\"))\n        {\n            ImGui::TextWrapped(\"The logging API redirects all text output so you can easily capture the content of a window or a block. Tree nodes can be automatically expanded. You can also call ImGui::LogText() to output directly to the log without a visual output.\");\n            ImGui::LogButtons();\n            ImGui::TreePop();\n        }\n    }\n\n    if (ImGui::CollapsingHeader(\"Widgets\"))\n    {\n        if (ImGui::TreeNode(\"Basic\"))\n        {\n            static int clicked = 0;\n            if (ImGui::Button(\"Button\")) \n                clicked++;\n            if (clicked & 1)\n            {\n                ImGui::SameLine();\n                ImGui::Text(\"Thanks for clicking me!\");\n            }\n\n            static bool check = true;\n            ImGui::Checkbox(\"checkbox\", &check);\n\n            static int e = 0;\n            ImGui::RadioButton(\"radio a\", &e, 0); ImGui::SameLine();\n            ImGui::RadioButton(\"radio b\", &e, 1); ImGui::SameLine();\n            ImGui::RadioButton(\"radio c\", &e, 2);\n\n            // Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style.\n            for (int i = 0; i < 7; i++)\n            {\n                if (i > 0) ImGui::SameLine();\n                ImGui::PushID(i);\n                ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i/7.0f, 0.6f, 0.6f));\n                ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i/7.0f, 0.7f, 0.7f));\n                ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i/7.0f, 0.8f, 0.8f));\n                ImGui::Button(\"Click\");\n                ImGui::PopStyleColor(3);\n                ImGui::PopID();\n            }\n\n            ImGui::Text(\"Hover over me\");\n            if (ImGui::IsItemHovered())\n                ImGui::SetTooltip(\"I am a tooltip\");\n\n            ImGui::SameLine();\n            ImGui::Text(\"- or me\");\n            if (ImGui::IsItemHovered())\n            {\n                ImGui::BeginTooltip();\n                ImGui::Text(\"I am a fancy tooltip\");\n                static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };\n                ImGui::PlotLines(\"Curve\", arr, IM_ARRAYSIZE(arr));\n                ImGui::EndTooltip();\n            }\n\n            // Testing ImGuiOnceUponAFrame helper.\n            //static ImGuiOnceUponAFrame once;\n            //for (int i = 0; i < 5; i++)\n            //    if (once)\n            //        ImGui::Text(\"This will be displayed only once.\");\n\n            ImGui::Separator();\n\n            ImGui::LabelText(\"label\", \"Value\");\n\n            static int item = 1;\n            ImGui::Combo(\"combo\", &item, \"aaaa\\0bbbb\\0cccc\\0dddd\\0eeee\\0\\0\");   // Combo using values packed in a single constant string (for really quick combo)\n\n            const char* items[] = { \"AAAA\", \"BBBB\", \"CCCC\", \"DDDD\", \"EEEE\", \"FFFF\", \"GGGG\", \"HHHH\", \"IIII\", \"JJJJ\", \"KKKK\" };\n            static int item2 = -1;\n            ImGui::Combo(\"combo scroll\", &item2, items, IM_ARRAYSIZE(items));   // Combo using proper array. You can also pass a callback to retrieve array value, no need to create/copy an array just for that.\n\n            {\n                static char str0[128] = \"Hello, world!\";\n                static int i0=123;\n                static float f0=0.001f;\n                ImGui::InputText(\"input text\", str0, IM_ARRAYSIZE(str0));\n                ImGui::SameLine(); ShowHelpMarker(\"Hold SHIFT or use mouse to select text.\\n\" \"CTRL+Left/Right to word jump.\\n\" \"CTRL+A or double-click to select all.\\n\" \"CTRL+X,CTRL+C,CTRL+V clipboard.\\n\" \"CTRL+Z,CTRL+Y undo/redo.\\n\" \"ESCAPE to revert.\\n\");\n\n                ImGui::InputInt(\"input int\", &i0);\n                ImGui::SameLine(); ShowHelpMarker(\"You can apply arithmetic operators +,*,/ on numerical values.\\n  e.g. [ 100 ], input \\'*2\\', result becomes [ 200 ]\\nUse +- to subtract.\\n\");\n\n                ImGui::InputFloat(\"input float\", &f0, 0.01f, 1.0f);\n\n                static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f };\n                ImGui::InputFloat3(\"input float3\", vec4a);\n            }\n\n            {\n                static int i1=50, i2=42;\n                ImGui::DragInt(\"drag int\", &i1, 1);\n                ImGui::SameLine(); ShowHelpMarker(\"Click and drag to edit value.\\nHold SHIFT/ALT for faster/slower edit.\\nDouble-click or CTRL+click to input value.\");\n\n                ImGui::DragInt(\"drag int 0..100\", &i2, 1, 0, 100, \"%.0f%%\");\n\n                static float f1=1.00f, f2=0.0067f;\n                ImGui::DragFloat(\"drag float\", &f1, 0.005f);\n                ImGui::DragFloat(\"drag small float\", &f2, 0.0001f, 0.0f, 0.0f, \"%.06f ns\");\n            }\n\n            {\n                static int i1=0;\n                ImGui::SliderInt(\"slider int\", &i1, -1, 3);\n                ImGui::SameLine(); ShowHelpMarker(\"CTRL+click to input value.\");\n\n                static float f1=0.123f, f2=0.0f;\n                ImGui::SliderFloat(\"slider float\", &f1, 0.0f, 1.0f, \"ratio = %.3f\");\n                ImGui::SliderFloat(\"slider log float\", &f2, -10.0f, 10.0f, \"%.4f\", 3.0f);\n                static float angle = 0.0f;\n                ImGui::SliderAngle(\"slider angle\", &angle);\n            }\n\n            static float col1[3] = { 1.0f,0.0f,0.2f };\n            static float col2[4] = { 0.4f,0.7f,0.0f,0.5f };\n            ImGui::ColorEdit3(\"color 1\", col1);\n            ImGui::SameLine(); ShowHelpMarker(\"Click on the colored square to open a color picker.\\nRight-click on the colored square to show options.\\nCTRL+click on individual component to input value.\\n\");\n\n            ImGui::ColorEdit4(\"color 2\", col2);\n\n            const char* listbox_items[] = { \"Apple\", \"Banana\", \"Cherry\", \"Kiwi\", \"Mango\", \"Orange\", \"Pineapple\", \"Strawberry\", \"Watermelon\" };\n            static int listbox_item_current = 1;\n            ImGui::ListBox(\"listbox\\n(single select)\", &listbox_item_current, listbox_items, IM_ARRAYSIZE(listbox_items), 4);\n\n            //static int listbox_item_current2 = 2;\n            //ImGui::PushItemWidth(-1);\n            //ImGui::ListBox(\"##listbox2\", &listbox_item_current2, listbox_items, IM_ARRAYSIZE(listbox_items), 4);\n            //ImGui::PopItemWidth();\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Trees\"))\n        {\n            if (ImGui::TreeNode(\"Basic trees\"))\n            {\n                for (int i = 0; i < 5; i++)\n                    if (ImGui::TreeNode((void*)(intptr_t)i, \"Child %d\", i))\n                    {\n                        ImGui::Text(\"blah blah\");\n                        ImGui::SameLine(); \n                        if (ImGui::SmallButton(\"print\")) printf(\"Child %d pressed\", i);\n                        ImGui::TreePop();\n                    }\n                ImGui::TreePop();\n            }\n\n            if (ImGui::TreeNode(\"Advanced, with Selectable nodes\"))\n            {\n                ShowHelpMarker(\"This is a more standard looking tree with selectable nodes.\\nClick to select, CTRL+Click to toggle, click on arrows or double-click to open.\");\n                static bool align_label_with_current_x_position = false;\n                ImGui::Checkbox(\"Align label with current X position)\", &align_label_with_current_x_position);\n                ImGui::Text(\"Hello!\");\n                if (align_label_with_current_x_position)\n                    ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing());\n\n                static int selection_mask = (1 << 2); // Dumb representation of what may be user-side selection state. You may carry selection state inside or outside your objects in whatever format you see fit.\n                int node_clicked = -1;                // Temporary storage of what node we have clicked to process selection at the end of the loop. May be a pointer to your own node type, etc.\n                ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, ImGui::GetFontSize()*3); // Increase spacing to differentiate leaves from expanded contents.\n                for (int i = 0; i < 6; i++)\n                {\n                    // Disable the default open on single-click behavior and pass in Selected flag according to our selection state.\n                    ImGuiTreeNodeFlags node_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ((selection_mask & (1 << i)) ? ImGuiTreeNodeFlags_Selected : 0);\n                    if (i < 3)\n                    {\n                        // Node\n                        bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, \"Selectable Node %d\", i);\n                        if (ImGui::IsItemClicked()) \n                            node_clicked = i;\n                        if (node_open)\n                        {\n                            ImGui::Text(\"Blah blah\\nBlah Blah\");\n                            ImGui::TreePop();\n                        }\n                    }\n                    else\n                    {\n                        // Leaf: The only reason we have a TreeNode at all is to allow selection of the leaf. Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text().\n                        node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet\n                        ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, \"Selectable Leaf %d\", i);\n                        if (ImGui::IsItemClicked()) \n                            node_clicked = i;\n                    }\n                }\n                if (node_clicked != -1)\n                {\n                    // Update selection state. Process outside of tree loop to avoid visual inconsistencies during the clicking-frame.\n                    if (ImGui::GetIO().KeyCtrl)\n                        selection_mask ^= (1 << node_clicked);          // CTRL+click to toggle\n                    else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, this commented bit preserve selection when clicking on item that is part of the selection\n                        selection_mask = (1 << node_clicked);           // Click to single-select\n                }\n                ImGui::PopStyleVar();\n                if (align_label_with_current_x_position)\n                    ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing());\n                ImGui::TreePop();\n            }\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Collapsing Headers\"))\n        {\n            static bool closable_group = true;\n            ImGui::Checkbox(\"Enable extra group\", &closable_group);\n            if (ImGui::CollapsingHeader(\"Header\"))\n            {\n                ImGui::Text(\"IsItemHovered: %d\", IsItemHovered());\n                for (int i = 0; i < 5; i++)\n                    ImGui::Text(\"Some content %d\", i);\n            }\n            if (ImGui::CollapsingHeader(\"Header with a close button\", &closable_group))\n            {\n                ImGui::Text(\"IsItemHovered: %d\", IsItemHovered());\n                for (int i = 0; i < 5; i++)\n                    ImGui::Text(\"More content %d\", i);\n            }\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Bullets\"))\n        {\n            ImGui::BulletText(\"Bullet point 1\");\n            ImGui::BulletText(\"Bullet point 2\\nOn multiple lines\");\n            ImGui::Bullet(); ImGui::Text(\"Bullet point 3 (two calls)\");\n            ImGui::Bullet(); ImGui::SmallButton(\"Button\");\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Text\"))\n        {\n            if (ImGui::TreeNode(\"Colored Text\"))\n            {\n                // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility.\n                ImGui::TextColored(ImVec4(1.0f,0.0f,1.0f,1.0f), \"Pink\");\n                ImGui::TextColored(ImVec4(1.0f,1.0f,0.0f,1.0f), \"Yellow\");\n                ImGui::TextDisabled(\"Disabled\");\n                ImGui::SameLine(); ShowHelpMarker(\"The TextDisabled color is stored in ImGuiStyle.\");\n                ImGui::TreePop();\n            }\n\n            if (ImGui::TreeNode(\"Word Wrapping\"))\n            {\n                // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility.\n                ImGui::TextWrapped(\"This text should automatically wrap on the edge of the window. The current implementation for text wrapping follows simple rules suitable for English and possibly other languages.\");\n                ImGui::Spacing();\n\n                static float wrap_width = 200.0f;\n                ImGui::SliderFloat(\"Wrap width\", &wrap_width, -20, 600, \"%.0f\");\n\n                ImGui::Text(\"Test paragraph 1:\");\n                ImVec2 pos = ImGui::GetCursorScreenPos();\n                ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + wrap_width, pos.y), ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()), IM_COL32(255,0,255,255));\n                ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width);\n                ImGui::Text(\"The lazy dog is a good dog. This paragraph is made to fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.\", wrap_width);\n                ImGui::GetWindowDrawList()->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255,255,0,255));\n                ImGui::PopTextWrapPos();\n\n                ImGui::Text(\"Test paragraph 2:\");\n                pos = ImGui::GetCursorScreenPos();\n                ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(pos.x + wrap_width, pos.y), ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()), IM_COL32(255,0,255,255));\n                ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width);\n                ImGui::Text(\"aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee   ffffffff. gggggggg!hhhhhhhh\");\n                ImGui::GetWindowDrawList()->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255,255,0,255));\n                ImGui::PopTextWrapPos();\n\n                ImGui::TreePop();\n            }\n\n            if (ImGui::TreeNode(\"UTF-8 Text\"))\n            {\n                // UTF-8 test with Japanese characters\n                // (needs a suitable font, try Arial Unicode or M+ fonts http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html)\n                // - From C++11 you can use the u8\"my text\" syntax to encode literal strings as UTF-8\n                // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. Visual Studio save your file as 'UTF-8 without signature')\n                // - HOWEVER, FOR THIS DEMO FILE, BECAUSE WE WANT TO SUPPORT COMPILER, WE ARE *NOT* INCLUDING RAW UTF-8 CHARACTERS IN THIS SOURCE FILE.\n                //   Instead we are encoding a few string with hexadecimal constants. Don't do this in your application!\n                // Note that characters values are preserved even by InputText() if the font cannot be displayed, so you can safely copy & paste garbled characters into another application.\n                ImGui::TextWrapped(\"CJK text will only appears if the font was loaded with the appropriate CJK character ranges. Call io.Font->LoadFromFileTTF() manually to load extra character ranges.\");\n                ImGui::Text(\"Hiragana: \\xe3\\x81\\x8b\\xe3\\x81\\x8d\\xe3\\x81\\x8f\\xe3\\x81\\x91\\xe3\\x81\\x93 (kakikukeko)\");\n                ImGui::Text(\"Kanjis: \\xe6\\x97\\xa5\\xe6\\x9c\\xac\\xe8\\xaa\\x9e (nihongo)\");\n                static char buf[32] = \"\\xe6\\x97\\xa5\\xe6\\x9c\\xac\\xe8\\xaa\\x9e\"; // \"nihongo\"\n                ImGui::InputText(\"UTF-8 input\", buf, IM_ARRAYSIZE(buf));\n                ImGui::TreePop();\n            }\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Images\"))\n        {\n            ImGui::TextWrapped(\"Below we are displaying the font texture (which is the only texture we have access to in this demo). Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. Hover the texture for a zoomed view!\");\n            ImGuiIO& io = ImGui::GetIO();\n\n            // Here we are grabbing the font texture because that's the only one we have access to inside the demo code.\n            // Remember that ImTextureID is just storage for whatever you want it to be, it is essentially a value that will be passed to the render function inside the ImDrawCmd structure.\n            // If you use one of the default imgui_impl_XXXX.cpp renderer, they all have comments at the top of their file to specify what they expect to be stored in ImTextureID.\n            // (for example, the imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer. The imgui_impl_glfw_gl3.cpp renderer expect a GLuint OpenGL texture identifier etc.)\n            // If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers to ImGui::Image(), and gather width/height through your own functions, etc.\n            // Using ShowMetricsWindow() as a \"debugger\" to inspect the draw data that are being passed to your render will help you debug issues if you are confused about this.\n            // Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage().\n            ImTextureID my_tex_id = io.Fonts->TexID; \n            float my_tex_w = (float)io.Fonts->TexWidth;\n            float my_tex_h = (float)io.Fonts->TexHeight;\n\n            ImGui::Text(\"%.0fx%.0f\", my_tex_w, my_tex_h);\n            ImVec2 pos = ImGui::GetCursorScreenPos();\n            ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), ImVec2(0,0), ImVec2(1,1), ImColor(255,255,255,255), ImColor(255,255,255,128));\n            if (ImGui::IsItemHovered())\n            {\n                ImGui::BeginTooltip();\n                float focus_sz = 32.0f;\n                float focus_x = io.MousePos.x - pos.x - focus_sz * 0.5f; if (focus_x < 0.0f) focus_x = 0.0f; else if (focus_x > my_tex_w - focus_sz) focus_x = my_tex_w - focus_sz;\n                float focus_y = io.MousePos.y - pos.y - focus_sz * 0.5f; if (focus_y < 0.0f) focus_y = 0.0f; else if (focus_y > my_tex_h - focus_sz) focus_y = my_tex_h - focus_sz;\n                ImGui::Text(\"Min: (%.2f, %.2f)\", focus_x, focus_y);\n                ImGui::Text(\"Max: (%.2f, %.2f)\", focus_x + focus_sz, focus_y + focus_sz);\n                ImVec2 uv0 = ImVec2((focus_x) / my_tex_w, (focus_y) / my_tex_h);\n                ImVec2 uv1 = ImVec2((focus_x + focus_sz) / my_tex_w, (focus_y + focus_sz) / my_tex_h);\n                ImGui::Image(my_tex_id, ImVec2(128,128), uv0, uv1, ImColor(255,255,255,255), ImColor(255,255,255,128));\n                ImGui::EndTooltip();\n            }\n            ImGui::TextWrapped(\"And now some textured buttons..\");\n            static int pressed_count = 0;\n            for (int i = 0; i < 8; i++)\n            {\n                ImGui::PushID(i);\n                int frame_padding = -1 + i;     // -1 = uses default padding\n                if (ImGui::ImageButton(my_tex_id, ImVec2(32,32), ImVec2(0,0), ImVec2(32.0f/my_tex_w,32/my_tex_h), frame_padding, ImColor(0,0,0,255)))\n                    pressed_count += 1;\n                ImGui::PopID();\n                ImGui::SameLine();\n            }\n            ImGui::NewLine();\n            ImGui::Text(\"Pressed %d times.\", pressed_count);\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Selectables\"))\n        {\n            if (ImGui::TreeNode(\"Basic\"))\n            {\n                static bool selected[4] = { false, true, false, false };\n                ImGui::Selectable(\"1. I am selectable\", &selected[0]);\n                ImGui::Selectable(\"2. I am selectable\", &selected[1]);\n                ImGui::Text(\"3. I am not selectable\");\n                ImGui::Selectable(\"4. I am selectable\", &selected[2]);\n                if (ImGui::Selectable(\"5. I am double clickable\", selected[3], ImGuiSelectableFlags_AllowDoubleClick))\n                    if (ImGui::IsMouseDoubleClicked(0))\n                        selected[3] = !selected[3];\n                ImGui::TreePop();\n            }\n            if (ImGui::TreeNode(\"Rendering more text into the same block\"))\n            {\n                static bool selected[3] = { false, false, false };\n                ImGui::Selectable(\"main.c\", &selected[0]);    ImGui::SameLine(300); ImGui::Text(\" 2,345 bytes\");\n                ImGui::Selectable(\"Hello.cpp\", &selected[1]); ImGui::SameLine(300); ImGui::Text(\"12,345 bytes\");\n                ImGui::Selectable(\"Hello.h\", &selected[2]);   ImGui::SameLine(300); ImGui::Text(\" 2,345 bytes\");\n                ImGui::TreePop();\n            }\n            if (ImGui::TreeNode(\"In columns\"))\n            {\n                ImGui::Columns(3, NULL, false);\n                static bool selected[16] = { 0 };\n                for (int i = 0; i < 16; i++)\n                {\n                    char label[32]; sprintf(label, \"Item %d\", i);\n                    if (ImGui::Selectable(label, &selected[i])) {}\n                    ImGui::NextColumn();\n                }\n                ImGui::Columns(1);\n                ImGui::TreePop();\n            }\n            if (ImGui::TreeNode(\"Grid\"))\n            {\n                static bool selected[16] = { true, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true };\n                for (int i = 0; i < 16; i++)\n                {\n                    ImGui::PushID(i);\n                    if (ImGui::Selectable(\"Sailor\", &selected[i], 0, ImVec2(50,50)))\n                    {\n                        int x = i % 4, y = i / 4;\n                        if (x > 0) selected[i - 1] ^= 1;\n                        if (x < 3) selected[i + 1] ^= 1;\n                        if (y > 0) selected[i - 4] ^= 1;\n                        if (y < 3) selected[i + 4] ^= 1;\n                    }\n                    if ((i % 4) < 3) ImGui::SameLine();\n                    ImGui::PopID();\n                }\n                ImGui::TreePop();\n            }\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Filtered Text Input\"))\n        {\n            static char buf1[64] = \"\"; ImGui::InputText(\"default\", buf1, 64);\n            static char buf2[64] = \"\"; ImGui::InputText(\"decimal\", buf2, 64, ImGuiInputTextFlags_CharsDecimal);\n            static char buf3[64] = \"\"; ImGui::InputText(\"hexadecimal\", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase);\n            static char buf4[64] = \"\"; ImGui::InputText(\"uppercase\", buf4, 64, ImGuiInputTextFlags_CharsUppercase);\n            static char buf5[64] = \"\"; ImGui::InputText(\"no blank\", buf5, 64, ImGuiInputTextFlags_CharsNoBlank);\n            struct TextFilters { static int FilterImGuiLetters(ImGuiTextEditCallbackData* data) { if (data->EventChar < 256 && strchr(\"imgui\", (char)data->EventChar)) return 0; return 1; } };\n            static char buf6[64] = \"\"; ImGui::InputText(\"\\\"imgui\\\" letters\", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters);\n\n            ImGui::Text(\"Password input\");\n            static char bufpass[64] = \"password123\";\n            ImGui::InputText(\"password\", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank);\n            ImGui::SameLine(); ShowHelpMarker(\"Display all characters as '*'.\\nDisable clipboard cut and copy.\\nDisable logging.\\n\");\n            ImGui::InputText(\"password (clear)\", bufpass, 64, ImGuiInputTextFlags_CharsNoBlank);\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Multi-line Text Input\"))\n        {\n            static bool read_only = false;\n            static char text[1024*16] =\n                \"/*\\n\"\n                \" The Pentium F00F bug, shorthand for F0 0F C7 C8,\\n\"\n                \" the hexadecimal encoding of one offending instruction,\\n\"\n                \" more formally, the invalid operand with locked CMPXCHG8B\\n\"\n                \" instruction bug, is a design flaw in the majority of\\n\"\n                \" Intel Pentium, Pentium MMX, and Pentium OverDrive\\n\"\n                \" processors (all in the P5 microarchitecture).\\n\"\n                \"*/\\n\\n\"\n                \"label:\\n\"\n                \"\\tlock cmpxchg8b eax\\n\";\n\n            ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0));\n            ImGui::Checkbox(\"Read-only\", &read_only);\n            ImGui::PopStyleVar();\n            ImGui::InputTextMultiline(\"##source\", text, IM_ARRAYSIZE(text), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0));\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Plots widgets\"))\n        {\n            static bool animate = true;\n            ImGui::Checkbox(\"Animate\", &animate);\n\n            static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };\n            ImGui::PlotLines(\"Frame Times\", arr, IM_ARRAYSIZE(arr));\n\n            // Create a dummy array of contiguous float values to plot\n            // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float and the sizeof() of your structure in the Stride parameter.\n            static float values[90] = { 0 };\n            static int values_offset = 0;\n            static float refresh_time = 0.0f;\n            if (!animate || refresh_time == 0.0f)\n                refresh_time = ImGui::GetTime();\n            while (refresh_time < ImGui::GetTime()) // Create dummy data at fixed 60 hz rate for the demo\n            {\n                static float phase = 0.0f;\n                values[values_offset] = cosf(phase);\n                values_offset = (values_offset+1) % IM_ARRAYSIZE(values);\n                phase += 0.10f*values_offset;\n                refresh_time += 1.0f/60.0f;\n            }\n            ImGui::PlotLines(\"Lines\", values, IM_ARRAYSIZE(values), values_offset, \"avg 0.0\", -1.0f, 1.0f, ImVec2(0,80));\n            ImGui::PlotHistogram(\"Histogram\", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80));\n\n            // Use functions to generate output\n            // FIXME: This is rather awkward because current plot API only pass in indices. We probably want an API passing floats and user provide sample rate/count.\n            struct Funcs\n            {\n                static float Sin(void*, int i) { return sinf(i * 0.1f); }\n                static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; }\n            };\n            static int func_type = 0, display_count = 70;\n            ImGui::Separator();\n            ImGui::PushItemWidth(100); ImGui::Combo(\"func\", &func_type, \"Sin\\0Saw\\0\"); ImGui::PopItemWidth();\n            ImGui::SameLine();\n            ImGui::SliderInt(\"Sample count\", &display_count, 1, 400);\n            float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw;\n            ImGui::PlotLines(\"Lines\", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80));\n            ImGui::PlotHistogram(\"Histogram\", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80));\n            ImGui::Separator();\n\n            // Animate a simple progress bar\n            static float progress = 0.0f, progress_dir = 1.0f;\n            if (animate)\n            {\n                progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime;\n                if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; }\n                if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }\n            }\n\n            // Typically we would use ImVec2(-1.0f,0.0f) to use all available width, or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.\n            ImGui::ProgressBar(progress, ImVec2(0.0f,0.0f));\n            ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);\n            ImGui::Text(\"Progress Bar\");\n\n            float progress_saturated = (progress < 0.0f) ? 0.0f : (progress > 1.0f) ? 1.0f : progress;\n            char buf[32];\n            sprintf(buf, \"%d/%d\", (int)(progress_saturated*1753), 1753);\n            ImGui::ProgressBar(progress, ImVec2(0.f,0.f), buf);\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Color/Picker Widgets\"))\n        {\n            static ImVec4 color = ImColor(114, 144, 154, 200);\n\n            static bool hdr = false;\n            static bool alpha_preview = true;\n            static bool alpha_half_preview = false;\n            static bool options_menu = true;\n            ImGui::Checkbox(\"With HDR\", &hdr); ImGui::SameLine(); ShowHelpMarker(\"Currently all this does is to lift the 0..1 limits on dragging widgets.\");\n            ImGui::Checkbox(\"With Alpha Preview\", &alpha_preview);\n            ImGui::Checkbox(\"With Half Alpha Preview\", &alpha_half_preview);\n            ImGui::Checkbox(\"With Options Menu\", &options_menu); ImGui::SameLine(); ShowHelpMarker(\"Right-click on the individual color widget to show options.\");\n            int misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions);\n\n            ImGui::Text(\"Color widget:\");\n            ImGui::SameLine(); ShowHelpMarker(\"Click on the colored square to open a color picker.\\nCTRL+click on individual component to input value.\\n\");\n            ImGui::ColorEdit3(\"MyColor##1\", (float*)&color, misc_flags);\n\n            ImGui::Text(\"Color widget HSV with Alpha:\");\n            ImGui::ColorEdit4(\"MyColor##2\", (float*)&color, ImGuiColorEditFlags_HSV | misc_flags);\n\n            ImGui::Text(\"Color widget with Float Display:\");\n            ImGui::ColorEdit4(\"MyColor##2f\", (float*)&color, ImGuiColorEditFlags_Float | misc_flags);\n\n            ImGui::Text(\"Color button with Picker:\");\n            ImGui::SameLine(); ShowHelpMarker(\"With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\\nWith the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only be used for the tooltip and picker popup.\");\n            ImGui::ColorEdit4(\"MyColor##3\", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags);\n\n            ImGui::Text(\"Color button with Custom Picker Popup:\");\n            static bool saved_palette_inited = false;\n            static ImVec4 saved_palette[32];\n            static ImVec4 backup_color;\n            if (!saved_palette_inited)\n                for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)\n                    ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f, saved_palette[n].x, saved_palette[n].y, saved_palette[n].z);\n            bool open_popup = ImGui::ColorButton(\"MyColor##3b\", color, misc_flags);\n            ImGui::SameLine();\n            open_popup |= ImGui::Button(\"Palette\");\n            if (open_popup)\n            {\n                ImGui::OpenPopup(\"mypicker\");\n                backup_color = color;\n            }\n            if (ImGui::BeginPopup(\"mypicker\"))\n            {\n                // FIXME: Adding a drag and drop example here would be perfect!\n                ImGui::Text(\"MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!\");\n                ImGui::Separator();\n                ImGui::ColorPicker4(\"##picker\", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview);\n                ImGui::SameLine();\n                ImGui::BeginGroup();\n                ImGui::Text(\"Current\");\n                ImGui::ColorButton(\"##current\", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60,40));\n                ImGui::Text(\"Previous\");\n                if (ImGui::ColorButton(\"##previous\", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60,40)))\n                    color = backup_color;\n                ImGui::Separator();\n                ImGui::Text(\"Palette\");\n                for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)\n                {\n                    ImGui::PushID(n);\n                    if ((n % 8) != 0)\n                        ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);\n                    if (ImGui::ColorButton(\"##palette\", saved_palette[n], ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip, ImVec2(20,20)))\n                        color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha!\n                    ImGui::PopID();\n                }\n                ImGui::EndGroup();\n                ImGui::EndPopup();\n            }\n\n            ImGui::Text(\"Color button only:\");\n            ImGui::ColorButton(\"MyColor##3c\", *(ImVec4*)&color, misc_flags, ImVec2(80,80));\n\n            ImGui::Text(\"Color picker:\");\n            static bool alpha = true;\n            static bool alpha_bar = true;\n            static bool side_preview = true;\n            static bool ref_color = false;\n            static ImVec4 ref_color_v(1.0f,0.0f,1.0f,0.5f);\n            static int inputs_mode = 2;\n            static int picker_mode = 0;\n            ImGui::Checkbox(\"With Alpha\", &alpha);\n            ImGui::Checkbox(\"With Alpha Bar\", &alpha_bar);\n            ImGui::Checkbox(\"With Side Preview\", &side_preview);\n            if (side_preview)\n            {\n                ImGui::SameLine();\n                ImGui::Checkbox(\"With Ref Color\", &ref_color);\n                if (ref_color)\n                {\n                    ImGui::SameLine();\n                    ImGui::ColorEdit4(\"##RefColor\", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags);\n                }\n            }\n            ImGui::Combo(\"Inputs Mode\", &inputs_mode, \"All Inputs\\0No Inputs\\0RGB Input\\0HSV Input\\0HEX Input\\0\");\n            ImGui::Combo(\"Picker Mode\", &picker_mode, \"Auto/Current\\0Hue bar + SV rect\\0Hue wheel + SV triangle\\0\");\n            ImGui::SameLine(); ShowHelpMarker(\"User can right-click the picker to change mode.\");\n            ImGuiColorEditFlags flags = misc_flags;\n            if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4()\n            if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar;\n            if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview;\n            if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar;\n            if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel;\n            if (inputs_mode == 1) flags |= ImGuiColorEditFlags_NoInputs;\n            if (inputs_mode == 2) flags |= ImGuiColorEditFlags_RGB;\n            if (inputs_mode == 3) flags |= ImGuiColorEditFlags_HSV;\n            if (inputs_mode == 4) flags |= ImGuiColorEditFlags_HEX;\n            ImGui::ColorPicker4(\"MyColor##4\", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL);\n\n            ImGui::Text(\"Programmatically set defaults/options:\");\n            ImGui::SameLine(); ShowHelpMarker(\"SetColorEditOptions() is designed to allow you to set boot-time default.\\nWe don't have Push/Pop functions because you can force options on a per-widget basis if needed, and the user can change non-forced ones with the options menu.\\nWe don't have a getter to avoid encouraging you to persistently save values that aren't forward-compatible.\");\n            if (ImGui::Button(\"Uint8 + HSV\"))\n                ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_HSV);\n            ImGui::SameLine();\n            if (ImGui::Button(\"Float + HDR\"))\n                ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_RGB);\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Range Widgets\"))\n        {\n            static float begin = 10, end = 90;\n            static int begin_i = 100, end_i = 1000;\n            ImGui::DragFloatRange2(\"range\", &begin, &end, 0.25f, 0.0f, 100.0f, \"Min: %.1f %%\", \"Max: %.1f %%\");\n            ImGui::DragIntRange2(\"range int (no bounds)\", &begin_i, &end_i, 5, 0, 0, \"Min: %.0f units\", \"Max: %.0f units\");\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Multi-component Widgets\"))\n        {\n            static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f };\n            static int vec4i[4] = { 1, 5, 100, 255 };\n\n            ImGui::InputFloat2(\"input float2\", vec4f);\n            ImGui::DragFloat2(\"drag float2\", vec4f, 0.01f, 0.0f, 1.0f);\n            ImGui::SliderFloat2(\"slider float2\", vec4f, 0.0f, 1.0f);\n            ImGui::DragInt2(\"drag int2\", vec4i, 1, 0, 255);\n            ImGui::InputInt2(\"input int2\", vec4i);\n            ImGui::SliderInt2(\"slider int2\", vec4i, 0, 255);\n            ImGui::Spacing();\n\n            ImGui::InputFloat3(\"input float3\", vec4f);\n            ImGui::DragFloat3(\"drag float3\", vec4f, 0.01f, 0.0f, 1.0f);\n            ImGui::SliderFloat3(\"slider float3\", vec4f, 0.0f, 1.0f);\n            ImGui::DragInt3(\"drag int3\", vec4i, 1, 0, 255);\n            ImGui::InputInt3(\"input int3\", vec4i);\n            ImGui::SliderInt3(\"slider int3\", vec4i, 0, 255);\n            ImGui::Spacing();\n\n            ImGui::InputFloat4(\"input float4\", vec4f);\n            ImGui::DragFloat4(\"drag float4\", vec4f, 0.01f, 0.0f, 1.0f);\n            ImGui::SliderFloat4(\"slider float4\", vec4f, 0.0f, 1.0f);\n            ImGui::InputInt4(\"input int4\", vec4i);\n            ImGui::DragInt4(\"drag int4\", vec4i, 1, 0, 255);\n            ImGui::SliderInt4(\"slider int4\", vec4i, 0, 255);\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Vertical Sliders\"))\n        {\n            const float spacing = 4;\n            ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, spacing));\n\n            static int int_value = 0;\n            ImGui::VSliderInt(\"##int\", ImVec2(18,160), &int_value, 0, 5);\n            ImGui::SameLine();\n\n            static float values[7] = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f };\n            ImGui::PushID(\"set1\");\n            for (int i = 0; i < 7; i++)\n            {\n                if (i > 0) ImGui::SameLine();\n                ImGui::PushID(i);\n                ImGui::PushStyleColor(ImGuiCol_FrameBg, (ImVec4)ImColor::HSV(i/7.0f, 0.5f, 0.5f));\n                ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, (ImVec4)ImColor::HSV(i/7.0f, 0.6f, 0.5f));\n                ImGui::PushStyleColor(ImGuiCol_FrameBgActive, (ImVec4)ImColor::HSV(i/7.0f, 0.7f, 0.5f));\n                ImGui::PushStyleColor(ImGuiCol_SliderGrab, (ImVec4)ImColor::HSV(i/7.0f, 0.9f, 0.9f));\n                ImGui::VSliderFloat(\"##v\", ImVec2(18,160), &values[i], 0.0f, 1.0f, \"\");\n                if (ImGui::IsItemActive() || ImGui::IsItemHovered())\n                    ImGui::SetTooltip(\"%.3f\", values[i]);\n                ImGui::PopStyleColor(4);\n                ImGui::PopID();\n            }\n            ImGui::PopID();\n\n            ImGui::SameLine();\n            ImGui::PushID(\"set2\");\n            static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f };\n            const int rows = 3;\n            const ImVec2 small_slider_size(18, (160.0f-(rows-1)*spacing)/rows);\n            for (int nx = 0; nx < 4; nx++)\n            {\n                if (nx > 0) ImGui::SameLine();\n                ImGui::BeginGroup();\n                for (int ny = 0; ny < rows; ny++)\n                {\n                    ImGui::PushID(nx*rows+ny);\n                    ImGui::VSliderFloat(\"##v\", small_slider_size, &values2[nx], 0.0f, 1.0f, \"\");\n                    if (ImGui::IsItemActive() || ImGui::IsItemHovered())\n                        ImGui::SetTooltip(\"%.3f\", values2[nx]);\n                    ImGui::PopID();\n                }\n                ImGui::EndGroup();\n            }\n            ImGui::PopID();\n\n            ImGui::SameLine();\n            ImGui::PushID(\"set3\");\n            for (int i = 0; i < 4; i++)\n            {\n                if (i > 0) ImGui::SameLine();\n                ImGui::PushID(i);\n                ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, 40);\n                ImGui::VSliderFloat(\"##v\", ImVec2(40,160), &values[i], 0.0f, 1.0f, \"%.2f\\nsec\");\n                ImGui::PopStyleVar();\n                ImGui::PopID();\n            }\n            ImGui::PopID();\n            ImGui::PopStyleVar();\n            ImGui::TreePop();\n        }\n    }\n\n    if (ImGui::CollapsingHeader(\"Layout\"))\n    {\n        if (ImGui::TreeNode(\"Child regions\"))\n        {\n            ImGui::Text(\"Without border\");\n            static int line = 50;\n            bool goto_line = ImGui::Button(\"Goto\");\n            ImGui::SameLine();\n            ImGui::PushItemWidth(100);\n            goto_line |= ImGui::InputInt(\"##Line\", &line, 0, 0, ImGuiInputTextFlags_EnterReturnsTrue);\n            ImGui::PopItemWidth();\n            ImGui::BeginChild(\"Sub1\", ImVec2(ImGui::GetWindowContentRegionWidth() * 0.5f,300), false, ImGuiWindowFlags_HorizontalScrollbar);\n            for (int i = 0; i < 100; i++)\n            {\n                ImGui::Text(\"%04d: scrollable region\", i);\n                if (goto_line && line == i)\n                    ImGui::SetScrollHere();\n            }\n            if (goto_line && line >= 100)\n                ImGui::SetScrollHere();\n            ImGui::EndChild();\n\n            ImGui::SameLine();\n\n            ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f);\n            ImGui::BeginChild(\"Sub2\", ImVec2(0,300), true);\n            ImGui::Text(\"With border\");\n            ImGui::Columns(2);\n            for (int i = 0; i < 100; i++)\n            {\n                if (i == 50)\n                    ImGui::NextColumn();\n                char buf[32];\n                sprintf(buf, \"%08x\", i*5731);\n                ImGui::Button(buf, ImVec2(-1.0f, 0.0f));\n            }\n            ImGui::EndChild();\n            ImGui::PopStyleVar();\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Widgets Width\"))\n        {\n            static float f = 0.0f;\n            ImGui::Text(\"PushItemWidth(100)\");\n            ImGui::SameLine(); ShowHelpMarker(\"Fixed width.\");\n            ImGui::PushItemWidth(100);\n            ImGui::DragFloat(\"float##1\", &f);\n            ImGui::PopItemWidth();\n\n            ImGui::Text(\"PushItemWidth(GetWindowWidth() * 0.5f)\");\n            ImGui::SameLine(); ShowHelpMarker(\"Half of window width.\");\n            ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.5f);\n            ImGui::DragFloat(\"float##2\", &f);\n            ImGui::PopItemWidth();\n\n            ImGui::Text(\"PushItemWidth(GetContentRegionAvailWidth() * 0.5f)\");\n            ImGui::SameLine(); ShowHelpMarker(\"Half of available width.\\n(~ right-cursor_pos)\\n(works within a column set)\");\n            ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() * 0.5f);\n            ImGui::DragFloat(\"float##3\", &f);\n            ImGui::PopItemWidth();\n\n            ImGui::Text(\"PushItemWidth(-100)\");\n            ImGui::SameLine(); ShowHelpMarker(\"Align to right edge minus 100\");\n            ImGui::PushItemWidth(-100);\n            ImGui::DragFloat(\"float##4\", &f);\n            ImGui::PopItemWidth();\n\n            ImGui::Text(\"PushItemWidth(-1)\");\n            ImGui::SameLine(); ShowHelpMarker(\"Align to right edge\");\n            ImGui::PushItemWidth(-1);\n            ImGui::DragFloat(\"float##5\", &f);\n            ImGui::PopItemWidth();\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Basic Horizontal Layout\"))\n        {\n            ImGui::TextWrapped(\"(Use ImGui::SameLine() to keep adding items to the right of the preceding item)\");\n\n            // Text\n            ImGui::Text(\"Two items: Hello\"); ImGui::SameLine();\n            ImGui::TextColored(ImVec4(1,1,0,1), \"Sailor\");\n\n            // Adjust spacing\n            ImGui::Text(\"More spacing: Hello\"); ImGui::SameLine(0, 20);\n            ImGui::TextColored(ImVec4(1,1,0,1), \"Sailor\");\n\n            // Button\n            ImGui::AlignTextToFramePadding();\n            ImGui::Text(\"Normal buttons\"); ImGui::SameLine();\n            ImGui::Button(\"Banana\"); ImGui::SameLine();\n            ImGui::Button(\"Apple\"); ImGui::SameLine();\n            ImGui::Button(\"Corniflower\");\n\n            // Button\n            ImGui::Text(\"Small buttons\"); ImGui::SameLine();\n            ImGui::SmallButton(\"Like this one\"); ImGui::SameLine();\n            ImGui::Text(\"can fit within a text block.\");\n\n            // Aligned to arbitrary position. Easy/cheap column.\n            ImGui::Text(\"Aligned\");\n            ImGui::SameLine(150); ImGui::Text(\"x=150\");\n            ImGui::SameLine(300); ImGui::Text(\"x=300\");\n            ImGui::Text(\"Aligned\");\n            ImGui::SameLine(150); ImGui::SmallButton(\"x=150\");\n            ImGui::SameLine(300); ImGui::SmallButton(\"x=300\");\n\n            // Checkbox\n            static bool c1=false,c2=false,c3=false,c4=false;\n            ImGui::Checkbox(\"My\", &c1); ImGui::SameLine();\n            ImGui::Checkbox(\"Tailor\", &c2); ImGui::SameLine();\n            ImGui::Checkbox(\"Is\", &c3); ImGui::SameLine();\n            ImGui::Checkbox(\"Rich\", &c4);\n\n            // Various\n            static float f0=1.0f, f1=2.0f, f2=3.0f;\n            ImGui::PushItemWidth(80);\n            const char* items[] = { \"AAAA\", \"BBBB\", \"CCCC\", \"DDDD\" };\n            static int item = -1;\n            ImGui::Combo(\"Combo\", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine();\n            ImGui::SliderFloat(\"X\", &f0, 0.0f,5.0f); ImGui::SameLine();\n            ImGui::SliderFloat(\"Y\", &f1, 0.0f,5.0f); ImGui::SameLine();\n            ImGui::SliderFloat(\"Z\", &f2, 0.0f,5.0f);\n            ImGui::PopItemWidth();\n\n            ImGui::PushItemWidth(80);\n            ImGui::Text(\"Lists:\");\n            static int selection[4] = { 0, 1, 2, 3 };\n            for (int i = 0; i < 4; i++)\n            {\n                if (i > 0) ImGui::SameLine();\n                ImGui::PushID(i);\n                ImGui::ListBox(\"\", &selection[i], items, IM_ARRAYSIZE(items));\n                ImGui::PopID();\n                //if (ImGui::IsItemHovered()) ImGui::SetTooltip(\"ListBox %d hovered\", i);\n            }\n            ImGui::PopItemWidth();\n\n            // Dummy\n            ImVec2 sz(30,30);\n            ImGui::Button(\"A\", sz); ImGui::SameLine();\n            ImGui::Dummy(sz); ImGui::SameLine();\n            ImGui::Button(\"B\", sz);\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Groups\"))\n        {\n            ImGui::TextWrapped(\"(Using ImGui::BeginGroup()/EndGroup() to layout items. BeginGroup() basically locks the horizontal position. EndGroup() bundles the whole group so that you can use functions such as IsItemHovered() on it.)\");\n            ImGui::BeginGroup();\n            {\n                ImGui::BeginGroup();\n                ImGui::Button(\"AAA\");\n                ImGui::SameLine();\n                ImGui::Button(\"BBB\");\n                ImGui::SameLine();\n                ImGui::BeginGroup();\n                ImGui::Button(\"CCC\");\n                ImGui::Button(\"DDD\");\n                ImGui::EndGroup();\n                ImGui::SameLine();\n                ImGui::Button(\"EEE\");\n                ImGui::EndGroup();\n                if (ImGui::IsItemHovered())\n                    ImGui::SetTooltip(\"First group hovered\");\n            }\n            // Capture the group size and create widgets using the same size\n            ImVec2 size = ImGui::GetItemRectSize();\n            const float values[5] = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f };\n            ImGui::PlotHistogram(\"##values\", values, IM_ARRAYSIZE(values), 0, NULL, 0.0f, 1.0f, size);\n\n            ImGui::Button(\"ACTION\", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x)*0.5f,size.y));\n            ImGui::SameLine();\n            ImGui::Button(\"REACTION\", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x)*0.5f,size.y));\n            ImGui::EndGroup();\n            ImGui::SameLine();\n\n            ImGui::Button(\"LEVERAGE\\nBUZZWORD\", size);\n            ImGui::SameLine();\n\n            ImGui::ListBoxHeader(\"List\", size);\n            ImGui::Selectable(\"Selected\", true);\n            ImGui::Selectable(\"Not Selected\", false);\n            ImGui::ListBoxFooter();\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Text Baseline Alignment\"))\n        {\n            ImGui::TextWrapped(\"(This is testing the vertical alignment that occurs on text to keep it at the same baseline as widgets. Lines only composed of text or \\\"small\\\" widgets fit in less vertical spaces than lines with normal widgets)\");\n\n            ImGui::Text(\"One\\nTwo\\nThree\"); ImGui::SameLine();\n            ImGui::Text(\"Hello\\nWorld\"); ImGui::SameLine();\n            ImGui::Text(\"Banana\");\n\n            ImGui::Text(\"Banana\"); ImGui::SameLine();\n            ImGui::Text(\"Hello\\nWorld\"); ImGui::SameLine();\n            ImGui::Text(\"One\\nTwo\\nThree\");\n\n            ImGui::Button(\"HOP##1\"); ImGui::SameLine();\n            ImGui::Text(\"Banana\"); ImGui::SameLine();\n            ImGui::Text(\"Hello\\nWorld\"); ImGui::SameLine();\n            ImGui::Text(\"Banana\");\n\n            ImGui::Button(\"HOP##2\"); ImGui::SameLine();\n            ImGui::Text(\"Hello\\nWorld\"); ImGui::SameLine();\n            ImGui::Text(\"Banana\");\n\n            ImGui::Button(\"TEST##1\"); ImGui::SameLine();\n            ImGui::Text(\"TEST\"); ImGui::SameLine();\n            ImGui::SmallButton(\"TEST##2\");\n\n            ImGui::AlignTextToFramePadding(); // If your line starts with text, call this to align it to upcoming widgets.\n            ImGui::Text(\"Text aligned to Widget\"); ImGui::SameLine();\n            ImGui::Button(\"Widget##1\"); ImGui::SameLine();\n            ImGui::Text(\"Widget\"); ImGui::SameLine();\n            ImGui::SmallButton(\"Widget##2\"); ImGui::SameLine();\n            ImGui::Button(\"Widget##3\");\n\n            // Tree\n            const float spacing = ImGui::GetStyle().ItemInnerSpacing.x;\n            ImGui::Button(\"Button##1\");\n            ImGui::SameLine(0.0f, spacing);\n            if (ImGui::TreeNode(\"Node##1\")) { for (int i = 0; i < 6; i++) ImGui::BulletText(\"Item %d..\", i); ImGui::TreePop(); }    // Dummy tree data\n\n            ImGui::AlignTextToFramePadding();         // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. Otherwise you can use SmallButton (smaller fit).\n            bool node_open = ImGui::TreeNode(\"Node##2\");  // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add child content.\n            ImGui::SameLine(0.0f, spacing); ImGui::Button(\"Button##2\");\n            if (node_open) { for (int i = 0; i < 6; i++) ImGui::BulletText(\"Item %d..\", i); ImGui::TreePop(); }   // Dummy tree data\n\n            // Bullet\n            ImGui::Button(\"Button##3\");\n            ImGui::SameLine(0.0f, spacing);\n            ImGui::BulletText(\"Bullet text\");\n\n            ImGui::AlignTextToFramePadding();\n            ImGui::BulletText(\"Node\");\n            ImGui::SameLine(0.0f, spacing); ImGui::Button(\"Button##4\");\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Scrolling\"))\n        {\n            ImGui::TextWrapped(\"(Use SetScrollHere() or SetScrollFromPosY() to scroll to a given position.)\");\n            static bool track = true;\n            static int track_line = 50, scroll_to_px = 200;\n            ImGui::Checkbox(\"Track\", &track);\n            ImGui::PushItemWidth(100);\n            ImGui::SameLine(130); track |= ImGui::DragInt(\"##line\", &track_line, 0.25f, 0, 99, \"Line = %.0f\");\n            bool scroll_to = ImGui::Button(\"Scroll To Pos\");\n            ImGui::SameLine(130); scroll_to |= ImGui::DragInt(\"##pos_y\", &scroll_to_px, 1.00f, 0, 9999, \"Y = %.0f px\");\n            ImGui::PopItemWidth();\n            if (scroll_to) track = false;\n\n            for (int i = 0; i < 5; i++)\n            {\n                if (i > 0) ImGui::SameLine();\n                ImGui::BeginGroup();\n                ImGui::Text(\"%s\", i == 0 ? \"Top\" : i == 1 ? \"25%\" : i == 2 ? \"Center\" : i == 3 ? \"75%\" : \"Bottom\");\n                ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(ImGui::GetWindowWidth() * 0.17f, 200.0f), true);\n                if (scroll_to)\n                    ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_px, i * 0.25f);\n                for (int line = 0; line < 100; line++)\n                {\n                    if (track && line == track_line)\n                    {\n                        ImGui::TextColored(ImColor(255,255,0), \"Line %d\", line);\n                        ImGui::SetScrollHere(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom\n                    }\n                    else\n                    {\n                        ImGui::Text(\"Line %d\", line);\n                    }\n                }\n                float scroll_y = ImGui::GetScrollY(), scroll_max_y = ImGui::GetScrollMaxY();\n                ImGui::EndChild();\n                ImGui::Text(\"%.0f/%0.f\", scroll_y, scroll_max_y);\n                ImGui::EndGroup();\n            }\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Horizontal Scrolling\"))\n        {\n            ImGui::Bullet(); ImGui::TextWrapped(\"Horizontal scrolling for a window has to be enabled explicitly via the ImGuiWindowFlags_HorizontalScrollbar flag.\");\n            ImGui::Bullet(); ImGui::TextWrapped(\"You may want to explicitly specify content width by calling SetNextWindowContentWidth() before Begin().\");\n            static int lines = 7;\n            ImGui::SliderInt(\"Lines\", &lines, 1, 15);\n            ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);\n            ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f));\n            ImGui::BeginChild(\"scrolling\", ImVec2(0, ImGui::GetItemsLineHeightWithSpacing()*7 + 30), true, ImGuiWindowFlags_HorizontalScrollbar);\n            for (int line = 0; line < lines; line++)\n            {\n                // Display random stuff (for the sake of this trivial demo we are using basic Button+SameLine. If you want to create your own time line for a real application you may be better off \n                // manipulating the cursor position yourself, aka using SetCursorPos/SetCursorScreenPos to position the widgets yourself. You may also want to use the lower-level ImDrawList API)\n                int num_buttons = 10 + ((line & 1) ? line * 9 : line * 3);\n                for (int n = 0; n < num_buttons; n++)\n                {\n                    if (n > 0) ImGui::SameLine();\n                    ImGui::PushID(n + line * 1000);\n                    char num_buf[16];\n                    const char* label = (!(n%15)) ? \"FizzBuzz\" : (!(n%3)) ? \"Fizz\" : (!(n%5)) ? \"Buzz\" : (sprintf(num_buf, \"%d\", n), num_buf);\n                    float hue = n*0.05f;\n                    ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue, 0.6f, 0.6f));\n                    ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue, 0.7f, 0.7f));\n                    ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue, 0.8f, 0.8f));\n                    ImGui::Button(label, ImVec2(40.0f + sinf((float)(line + n)) * 20.0f, 0.0f));\n                    ImGui::PopStyleColor(3);\n                    ImGui::PopID();\n                }\n            }\n            float scroll_x = ImGui::GetScrollX(), scroll_max_x = ImGui::GetScrollMaxX();\n            ImGui::EndChild();\n            ImGui::PopStyleVar(2);\n            float scroll_x_delta = 0.0f;\n            ImGui::SmallButton(\"<<\"); if (ImGui::IsItemActive()) scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; ImGui::SameLine(); \n            ImGui::Text(\"Scroll from code\"); ImGui::SameLine();\n            ImGui::SmallButton(\">>\"); if (ImGui::IsItemActive()) scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; ImGui::SameLine(); \n            ImGui::Text(\"%.0f/%.0f\", scroll_x, scroll_max_x);\n            if (scroll_x_delta != 0.0f)\n            {\n                ImGui::BeginChild(\"scrolling\"); // Demonstrate a trick: you can use Begin to set yourself in the context of another window (here we are already out of your child window)\n                ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta);\n                ImGui::End();\n            }\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Clipping\"))\n        {\n            static ImVec2 size(100, 100), offset(50, 20);\n            ImGui::TextWrapped(\"On a per-widget basis we are occasionally clipping text CPU-side if it won't fit in its frame. Otherwise we are doing coarser clipping + passing a scissor rectangle to the renderer. The system is designed to try minimizing both execution and CPU/GPU rendering cost.\");\n            ImGui::DragFloat2(\"size\", (float*)&size, 0.5f, 0.0f, 200.0f, \"%.0f\");\n            ImGui::TextWrapped(\"(Click and drag)\");\n            ImVec2 pos = ImGui::GetCursorScreenPos();\n            ImVec4 clip_rect(pos.x, pos.y, pos.x+size.x, pos.y+size.y);\n            ImGui::InvisibleButton(\"##dummy\", size);\n            if (ImGui::IsItemActive() && ImGui::IsMouseDragging()) { offset.x += ImGui::GetIO().MouseDelta.x; offset.y += ImGui::GetIO().MouseDelta.y; }\n            ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x+size.x,pos.y+size.y), ImColor(90,90,120,255));\n            ImGui::GetWindowDrawList()->AddText(ImGui::GetFont(), ImGui::GetFontSize()*2.0f, ImVec2(pos.x+offset.x,pos.y+offset.y), ImColor(255,255,255,255), \"Line 1 hello\\nLine 2 clip me!\", NULL, 0.0f, &clip_rect);\n            ImGui::TreePop();\n        }\n    }\n\n    if (ImGui::CollapsingHeader(\"Popups & Modal windows\"))\n    {\n        if (ImGui::TreeNode(\"Popups\"))\n        {\n            ImGui::TextWrapped(\"When a popup is active, it inhibits interacting with windows that are behind the popup. Clicking outside the popup closes it.\");\n\n            static int selected_fish = -1;\n            const char* names[] = { \"Bream\", \"Haddock\", \"Mackerel\", \"Pollock\", \"Tilefish\" };\n            static bool toggles[] = { true, false, false, false, false };\n\n            // Simple selection popup\n            // (If you want to show the current selection inside the Button itself, you may want to build a string using the \"###\" operator to preserve a constant ID with a variable label)\n            if (ImGui::Button(\"Select..\"))\n                ImGui::OpenPopup(\"select\");\n            ImGui::SameLine();\n            ImGui::TextUnformatted(selected_fish == -1 ? \"<None>\" : names[selected_fish]);\n            if (ImGui::BeginPopup(\"select\"))\n            {\n                ImGui::Text(\"Aquarium\");\n                ImGui::Separator();\n                for (int i = 0; i < IM_ARRAYSIZE(names); i++)\n                    if (ImGui::Selectable(names[i]))\n                        selected_fish = i;\n                ImGui::EndPopup();\n            }\n\n            // Showing a menu with toggles\n            if (ImGui::Button(\"Toggle..\"))\n                ImGui::OpenPopup(\"toggle\");\n            if (ImGui::BeginPopup(\"toggle\"))\n            {\n                for (int i = 0; i < IM_ARRAYSIZE(names); i++)\n                    ImGui::MenuItem(names[i], \"\", &toggles[i]);\n                if (ImGui::BeginMenu(\"Sub-menu\"))\n                {\n                    ImGui::MenuItem(\"Click me\");\n                    ImGui::EndMenu();\n                }\n\n                ImGui::Separator();\n                ImGui::Text(\"Tooltip here\");\n                if (ImGui::IsItemHovered())\n                    ImGui::SetTooltip(\"I am a tooltip over a popup\");\n\n                if (ImGui::Button(\"Stacked Popup\"))\n                    ImGui::OpenPopup(\"another popup\");\n                if (ImGui::BeginPopup(\"another popup\"))\n                {\n                    for (int i = 0; i < IM_ARRAYSIZE(names); i++)\n                        ImGui::MenuItem(names[i], \"\", &toggles[i]);\n                    if (ImGui::BeginMenu(\"Sub-menu\"))\n                    {\n                        ImGui::MenuItem(\"Click me\");\n                        ImGui::EndMenu();\n                    }\n                    ImGui::EndPopup();\n                }\n                ImGui::EndPopup();\n            }\n\n            if (ImGui::Button(\"Popup Menu..\"))\n                ImGui::OpenPopup(\"FilePopup\");\n            if (ImGui::BeginPopup(\"FilePopup\"))\n            {\n                ShowExampleMenuFile();\n                ImGui::EndPopup();\n            }\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Context menus\"))\n        {\n            // BeginPopupContextItem() is a helper to provide common/simple popup behavior of essentially doing:\n            //    if (IsItemHovered() && IsMouseClicked(0))\n            //       OpenPopup(id);\n            //    return BeginPopup(id);\n            // For more advanced uses you may want to replicate and cuztomize this code. This the comments inside BeginPopupContextItem() implementation.\n            static float value = 0.5f;\n            ImGui::Text(\"Value = %.3f (<-- right-click here)\", value);\n            if (ImGui::BeginPopupContextItem(\"item context menu\"))\n            {\n                if (ImGui::Selectable(\"Set to zero\")) value = 0.0f;\n                if (ImGui::Selectable(\"Set to PI\")) value = 3.1415f;\n                ImGui::PushItemWidth(-1);\n                ImGui::DragFloat(\"##Value\", &value, 0.1f, 0.0f, 0.0f);\n                ImGui::PopItemWidth();\n                ImGui::EndPopup();\n            }\n\n            static char name[32] = \"Label1\";\n            char buf[64]; sprintf(buf, \"Button: %s###Button\", name); // ### operator override ID ignoring the preceding label\n            ImGui::Button(buf);\n            if (ImGui::BeginPopupContextItem()) // When used after an item that has an ID (here the Button), we can skip providing an ID to BeginPopupContextItem().\n            {\n                ImGui::Text(\"Edit name:\");\n                ImGui::InputText(\"##edit\", name, IM_ARRAYSIZE(name));\n                if (ImGui::Button(\"Close\"))\n                    ImGui::CloseCurrentPopup();\n                ImGui::EndPopup();\n            }\n            ImGui::SameLine(); ImGui::Text(\"(<-- right-click here)\");\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Modals\"))\n        {\n            ImGui::TextWrapped(\"Modal windows are like popups but the user cannot close them by clicking outside the window.\");\n\n            if (ImGui::Button(\"Delete..\"))\n                ImGui::OpenPopup(\"Delete?\");\n            if (ImGui::BeginPopupModal(\"Delete?\", NULL, ImGuiWindowFlags_AlwaysAutoResize))\n            {\n                    ImGui::Text(\"All those beautiful files will be deleted.\\nThis operation cannot be undone!\\n\\n\");\n                ImGui::Separator();\n\n                //static int dummy_i = 0;\n                //ImGui::Combo(\"Combo\", &dummy_i, \"Delete\\0Delete harder\\0\");\n\n                static bool dont_ask_me_next_time = false;\n                ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0));\n                ImGui::Checkbox(\"Don't ask me next time\", &dont_ask_me_next_time);\n                ImGui::PopStyleVar();\n\n                if (ImGui::Button(\"OK\", ImVec2(120,0))) { ImGui::CloseCurrentPopup(); }\n                ImGui::SameLine();\n                if (ImGui::Button(\"Cancel\", ImVec2(120,0))) { ImGui::CloseCurrentPopup(); }\n                ImGui::EndPopup();\n            }\n\n            if (ImGui::Button(\"Stacked modals..\"))\n                ImGui::OpenPopup(\"Stacked 1\");\n            if (ImGui::BeginPopupModal(\"Stacked 1\"))\n            {\n                ImGui::Text(\"Hello from Stacked The First\\nUsing style.Colors[ImGuiCol_ModalWindowDarkening] for darkening.\");\n                static int item = 1;\n                ImGui::Combo(\"Combo\", &item, \"aaaa\\0bbbb\\0cccc\\0dddd\\0eeee\\0\\0\");\n                static float color[4] = { 0.4f,0.7f,0.0f,0.5f };\n                ImGui::ColorEdit4(\"color\", color);  // This is to test behavior of stacked regular popups over a modal\n\n                if (ImGui::Button(\"Add another modal..\"))\n                    ImGui::OpenPopup(\"Stacked 2\");\n                if (ImGui::BeginPopupModal(\"Stacked 2\"))\n                {\n                    ImGui::Text(\"Hello from Stacked The Second\");\n                    if (ImGui::Button(\"Close\"))\n                        ImGui::CloseCurrentPopup();\n                    ImGui::EndPopup();\n                }\n\n                if (ImGui::Button(\"Close\"))\n                    ImGui::CloseCurrentPopup();\n                ImGui::EndPopup();\n            }\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Menus inside a regular window\"))\n        {\n            ImGui::TextWrapped(\"Below we are testing adding menu items to a regular window. It's rather unusual but should work!\");\n            ImGui::Separator();\n            // NB: As a quirk in this very specific example, we want to differentiate the parent of this menu from the parent of the various popup menus above.\n            // To do so we are encloding the items in a PushID()/PopID() block to make them two different menusets. If we don't, opening any popup above and hovering our menu here\n            // would open it. This is because once a menu is active, we allow to switch to a sibling menu by just hovering on it, which is the desired behavior for regular menus.\n            ImGui::PushID(\"foo\");\n            ImGui::MenuItem(\"Menu item\", \"CTRL+M\");\n            if (ImGui::BeginMenu(\"Menu inside a regular window\"))\n            {\n                ShowExampleMenuFile();\n                ImGui::EndMenu();\n            }\n            ImGui::PopID();\n            ImGui::Separator();\n            ImGui::TreePop();\n        }\n    }\n\n    if (ImGui::CollapsingHeader(\"Columns\"))\n    {\n        ImGui::PushID(\"Columns\");\n\n        // Basic columns\n        if (ImGui::TreeNode(\"Basic\"))\n        {\n            ImGui::Text(\"Without border:\");\n            ImGui::Columns(3, \"mycolumns3\", false);  // 3-ways, no border\n            ImGui::Separator();\n            for (int n = 0; n < 14; n++)\n            {\n                char label[32];\n                sprintf(label, \"Item %d\", n);\n                if (ImGui::Selectable(label)) {}\n                //if (ImGui::Button(label, ImVec2(-1,0))) {}\n                ImGui::NextColumn();\n            }\n            ImGui::Columns(1);\n            ImGui::Separator();\n\n            ImGui::Text(\"With border:\");\n            ImGui::Columns(4, \"mycolumns\"); // 4-ways, with border\n            ImGui::Separator();\n            ImGui::Text(\"ID\"); ImGui::NextColumn();\n            ImGui::Text(\"Name\"); ImGui::NextColumn();\n            ImGui::Text(\"Path\"); ImGui::NextColumn();\n            ImGui::Text(\"Hovered\"); ImGui::NextColumn();\n            ImGui::Separator();\n            const char* names[3] = { \"One\", \"Two\", \"Three\" };\n            const char* paths[3] = { \"/path/one\", \"/path/two\", \"/path/three\" };\n            static int selected = -1;\n            for (int i = 0; i < 3; i++)\n            {\n                char label[32];\n                sprintf(label, \"%04d\", i);\n                if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns))\n                    selected = i;\n                bool hovered = ImGui::IsItemHovered();\n                ImGui::NextColumn();\n                ImGui::Text(names[i]); ImGui::NextColumn();\n                ImGui::Text(paths[i]); ImGui::NextColumn();\n                ImGui::Text(\"%d\", hovered); ImGui::NextColumn();\n            }\n            ImGui::Columns(1);\n            ImGui::Separator();\n            ImGui::TreePop();\n        }\n\n        // Create multiple items in a same cell before switching to next column\n        if (ImGui::TreeNode(\"Mixed items\"))\n        {\n            ImGui::Columns(3, \"mixed\");\n            ImGui::Separator();\n\n            ImGui::Text(\"Hello\");\n            ImGui::Button(\"Banana\");\n            ImGui::NextColumn();\n\n            ImGui::Text(\"ImGui\");\n            ImGui::Button(\"Apple\");\n            static float foo = 1.0f;\n            ImGui::InputFloat(\"red\", &foo, 0.05f, 0, 3);\n            ImGui::Text(\"An extra line here.\");\n            ImGui::NextColumn();\n\n                ImGui::Text(\"Sailor\");\n            ImGui::Button(\"Corniflower\");\n            static float bar = 1.0f;\n            ImGui::InputFloat(\"blue\", &bar, 0.05f, 0, 3);\n            ImGui::NextColumn();\n\n            if (ImGui::CollapsingHeader(\"Category A\")) { ImGui::Text(\"Blah blah blah\"); } ImGui::NextColumn();\n            if (ImGui::CollapsingHeader(\"Category B\")) { ImGui::Text(\"Blah blah blah\"); } ImGui::NextColumn();\n            if (ImGui::CollapsingHeader(\"Category C\")) { ImGui::Text(\"Blah blah blah\"); } ImGui::NextColumn();\n            ImGui::Columns(1);\n            ImGui::Separator();\n            ImGui::TreePop();\n        }\n\n        // Word wrapping\n        if (ImGui::TreeNode(\"Word-wrapping\"))\n        {\n            ImGui::Columns(2, \"word-wrapping\");\n            ImGui::Separator();\n            ImGui::TextWrapped(\"The quick brown fox jumps over the lazy dog.\");\n            ImGui::TextWrapped(\"Hello Left\");\n            ImGui::NextColumn();\n            ImGui::TextWrapped(\"The quick brown fox jumps over the lazy dog.\");\n            ImGui::TextWrapped(\"Hello Right\");\n            ImGui::Columns(1);\n            ImGui::Separator();\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Borders\"))\n        {\n            // NB: Future columns API should allow automatic horizontal borders.\n            static bool h_borders = true;\n            static bool v_borders = true;\n            ImGui::Checkbox(\"horizontal\", &h_borders);\n            ImGui::SameLine();\n            ImGui::Checkbox(\"vertical\", &v_borders);\n            ImGui::Columns(4, NULL, v_borders);\n            for (int i = 0; i < 4*3; i++)\n            {\n                if (h_borders && ImGui::GetColumnIndex() == 0)\n                    ImGui::Separator();\n                ImGui::Text(\"%c%c%c\", 'a'+i, 'a'+i, 'a'+i);\n                ImGui::Text(\"Width %.2f\\nOffset %.2f\", ImGui::GetColumnWidth(), ImGui::GetColumnOffset());\n                ImGui::NextColumn();\n            }\n            ImGui::Columns(1);\n            if (h_borders)\n                ImGui::Separator();\n            ImGui::TreePop();\n        }\n\n        // Scrolling columns\n        /*\n        if (ImGui::TreeNode(\"Vertical Scrolling\"))\n        {\n            ImGui::BeginChild(\"##header\", ImVec2(0, ImGui::GetTextLineHeightWithSpacing()+ImGui::GetStyle().ItemSpacing.y));\n            ImGui::Columns(3);\n            ImGui::Text(\"ID\"); ImGui::NextColumn();\n            ImGui::Text(\"Name\"); ImGui::NextColumn();\n            ImGui::Text(\"Path\"); ImGui::NextColumn();\n            ImGui::Columns(1);\n            ImGui::Separator();\n            ImGui::EndChild();\n            ImGui::BeginChild(\"##scrollingregion\", ImVec2(0, 60));\n            ImGui::Columns(3);\n            for (int i = 0; i < 10; i++)\n            {\n                ImGui::Text(\"%04d\", i); ImGui::NextColumn();\n                ImGui::Text(\"Foobar\"); ImGui::NextColumn();\n                ImGui::Text(\"/path/foobar/%04d/\", i); ImGui::NextColumn();\n            }\n            ImGui::Columns(1);\n            ImGui::EndChild();\n            ImGui::TreePop();\n        }\n        */\n\n        if (ImGui::TreeNode(\"Horizontal Scrolling\"))\n        {\n            ImGui::SetNextWindowContentWidth(1500);\n            ImGui::BeginChild(\"##ScrollingRegion\", ImVec2(0, ImGui::GetFontSize() * 20), false, ImGuiWindowFlags_HorizontalScrollbar);\n            ImGui::Columns(10);\n            int ITEMS_COUNT = 2000;\n            ImGuiListClipper clipper(ITEMS_COUNT);  // Also demonstrate using the clipper for large list\n            while (clipper.Step())\n            {\n                for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)\n                    for (int j = 0; j < 10; j++)\n                    {\n                        ImGui::Text(\"Line %d Column %d...\", i, j);\n                        ImGui::NextColumn();\n                    }\n            }\n            ImGui::Columns(1);\n            ImGui::EndChild();\n            ImGui::TreePop();\n        }\n\n        bool node_open = ImGui::TreeNode(\"Tree within single cell\");\n        ImGui::SameLine(); ShowHelpMarker(\"NB: Tree node must be poped before ending the cell. There's no storage of state per-cell.\");\n        if (node_open)\n        {\n            ImGui::Columns(2, \"tree items\");\n            ImGui::Separator();\n            if (ImGui::TreeNode(\"Hello\")) { ImGui::BulletText(\"Sailor\"); ImGui::TreePop(); } ImGui::NextColumn();\n            if (ImGui::TreeNode(\"Bonjour\")) { ImGui::BulletText(\"Marin\"); ImGui::TreePop(); } ImGui::NextColumn();\n            ImGui::Columns(1);\n            ImGui::Separator();\n            ImGui::TreePop();\n        }\n        ImGui::PopID();\n    }\n\n    if (ImGui::CollapsingHeader(\"Filtering\"))\n    {\n        static ImGuiTextFilter filter;\n        ImGui::Text(\"Filter usage:\\n\"\n                    \"  \\\"\\\"         display all lines\\n\"\n                    \"  \\\"xxx\\\"      display lines containing \\\"xxx\\\"\\n\"\n                    \"  \\\"xxx,yyy\\\"  display lines containing \\\"xxx\\\" or \\\"yyy\\\"\\n\"\n                    \"  \\\"-xxx\\\"     hide lines containing \\\"xxx\\\"\");\n        filter.Draw();\n        const char* lines[] = { \"aaa1.c\", \"bbb1.c\", \"ccc1.c\", \"aaa2.cpp\", \"bbb2.cpp\", \"ccc2.cpp\", \"abc.h\", \"hello, world\" };\n        for (int i = 0; i < IM_ARRAYSIZE(lines); i++)\n            if (filter.PassFilter(lines[i]))\n                ImGui::BulletText(\"%s\", lines[i]);\n    }\n\n    if (ImGui::CollapsingHeader(\"Inputs & Focus\"))\n    {\n        ImGuiIO& io = ImGui::GetIO();\n        ImGui::Checkbox(\"io.MouseDrawCursor\", &io.MouseDrawCursor);\n        ImGui::SameLine(); ShowHelpMarker(\"Request ImGui to render a mouse cursor for you in software. Note that a mouse cursor rendered via regular GPU rendering will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\");\n\n        ImGui::Text(\"WantCaptureMouse: %d\", io.WantCaptureMouse);\n        ImGui::Text(\"WantCaptureKeyboard: %d\", io.WantCaptureKeyboard);\n        ImGui::Text(\"WantTextInput: %d\", io.WantTextInput);\n        ImGui::Text(\"WantMoveMouse: %d\", io.WantMoveMouse);\n\n        if (ImGui::TreeNode(\"Keyboard & Mouse State\"))\n        {\n            ImGui::Text(\"Mouse pos: (%g, %g)\", io.MousePos.x, io.MousePos.y);\n            ImGui::Text(\"Mouse down:\");     for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (io.MouseDownDuration[i] >= 0.0f)   { ImGui::SameLine(); ImGui::Text(\"b%d (%.02f secs)\", i, io.MouseDownDuration[i]); }\n            ImGui::Text(\"Mouse clicked:\");  for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseClicked(i))          { ImGui::SameLine(); ImGui::Text(\"b%d\", i); }\n            ImGui::Text(\"Mouse dbl-clicked:\"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseDoubleClicked(i)) { ImGui::SameLine(); ImGui::Text(\"b%d\", i); }\n            ImGui::Text(\"Mouse released:\"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseReleased(i))         { ImGui::SameLine(); ImGui::Text(\"b%d\", i); }\n            ImGui::Text(\"Mouse wheel: %.1f\", io.MouseWheel);\n\n            ImGui::Text(\"Keys down:\");      for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (io.KeysDownDuration[i] >= 0.0f)     { ImGui::SameLine(); ImGui::Text(\"%d (%.02f secs)\", i, io.KeysDownDuration[i]); }\n            ImGui::Text(\"Keys pressed:\");   for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyPressed(i))             { ImGui::SameLine(); ImGui::Text(\"%d\", i); }\n            ImGui::Text(\"Keys release:\");   for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyReleased(i))            { ImGui::SameLine(); ImGui::Text(\"%d\", i); }\n            ImGui::Text(\"Keys mods: %s%s%s%s\", io.KeyCtrl ? \"CTRL \" : \"\", io.KeyShift ? \"SHIFT \" : \"\", io.KeyAlt ? \"ALT \" : \"\", io.KeySuper ? \"SUPER \" : \"\");\n\n\n            ImGui::Button(\"Hovering me sets the\\nkeyboard capture flag\");\n            if (ImGui::IsItemHovered())\n                ImGui::CaptureKeyboardFromApp(true);\n            ImGui::SameLine();\n            ImGui::Button(\"Holding me clears the\\nthe keyboard capture flag\");\n            if (ImGui::IsItemActive())\n                ImGui::CaptureKeyboardFromApp(false);\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Tabbing\"))\n        {\n            ImGui::Text(\"Use TAB/SHIFT+TAB to cycle through keyboard editable fields.\");\n            static char buf[32] = \"dummy\";\n            ImGui::InputText(\"1\", buf, IM_ARRAYSIZE(buf));\n            ImGui::InputText(\"2\", buf, IM_ARRAYSIZE(buf));\n            ImGui::InputText(\"3\", buf, IM_ARRAYSIZE(buf));\n            ImGui::PushAllowKeyboardFocus(false);\n            ImGui::InputText(\"4 (tab skip)\", buf, IM_ARRAYSIZE(buf));\n            //ImGui::SameLine(); ShowHelperMarker(\"Use ImGui::PushAllowKeyboardFocus(bool)\\nto disable tabbing through certain widgets.\");\n            ImGui::PopAllowKeyboardFocus();\n            ImGui::InputText(\"5\", buf, IM_ARRAYSIZE(buf));\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Focus from code\"))\n        {\n            bool focus_1 = ImGui::Button(\"Focus on 1\"); ImGui::SameLine();\n            bool focus_2 = ImGui::Button(\"Focus on 2\"); ImGui::SameLine();\n            bool focus_3 = ImGui::Button(\"Focus on 3\");\n            int has_focus = 0;\n            static char buf[128] = \"click on a button to set focus\";\n\n            if (focus_1) ImGui::SetKeyboardFocusHere();\n            ImGui::InputText(\"1\", buf, IM_ARRAYSIZE(buf));\n            if (ImGui::IsItemActive()) has_focus = 1;\n\n            if (focus_2) ImGui::SetKeyboardFocusHere();\n            ImGui::InputText(\"2\", buf, IM_ARRAYSIZE(buf));\n            if (ImGui::IsItemActive()) has_focus = 2;\n\n            ImGui::PushAllowKeyboardFocus(false);\n            if (focus_3) ImGui::SetKeyboardFocusHere();\n            ImGui::InputText(\"3 (tab skip)\", buf, IM_ARRAYSIZE(buf));\n            if (ImGui::IsItemActive()) has_focus = 3;\n            ImGui::PopAllowKeyboardFocus();\n            if (has_focus)\n                ImGui::Text(\"Item with focus: %d\", has_focus);\n            else\n                ImGui::Text(\"Item with focus: <none>\");\n            ImGui::TextWrapped(\"Cursor & selection are preserved when refocusing last used item in code.\");\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Hovering\"))\n        {\n            // Testing IsWindowHovered() function with its various flags (note that the flags can be combined)\n            ImGui::BulletText(\n                \"IsWindowHovered() = %d\\n\"\n                \"IsWindowHovered(_AllowWhenBlockedByPopup) = %d\\n\"\n                \"IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\\n\"\n                \"IsWindowHovered(_FlattenChilds) = %d\\n\",\n                ImGui::IsWindowHovered(),\n                ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup),\n                ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),\n                ImGui::IsWindowHovered(ImGuiHoveredFlags_FlattenChilds));\n\n            // Testing IsItemHovered() function (because BulletText is an item itself and that would affect the output of IsItemHovered, we pass all lines in a single items to shorten the code)\n            ImGui::Button(\"ITEM\");\n            ImGui::BulletText(\n                \"IsItemHovered() = %d\\n\"\n                \"IsItemHovered(_AllowWhenBlockedByPopup) = %d\\n\"\n                \"IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\\n\"\n                \"IsItemHovered(_AllowWhenOverlapped) = %d\\n\"\n                \"IsItemhovered(_RectOnly) = %d\\n\",\n                ImGui::IsItemHovered(),\n                ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup),\n                ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),\n                ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped),\n                ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly));\n\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Dragging\"))\n        {\n            ImGui::TextWrapped(\"You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget.\");\n            ImGui::Button(\"Drag Me\");\n            if (ImGui::IsItemActive())\n            {\n                // Draw a line between the button and the mouse cursor\n                ImDrawList* draw_list = ImGui::GetWindowDrawList();\n                draw_list->PushClipRectFullScreen();\n                draw_list->AddLine(ImGui::CalcItemRectClosestPoint(io.MousePos, true, -2.0f), io.MousePos, ImColor(ImGui::GetStyle().Colors[ImGuiCol_Button]), 4.0f);\n                draw_list->PopClipRect();\n                ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f);\n                ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0);\n                ImVec2 mouse_delta = io.MouseDelta;\n                ImGui::SameLine(); ImGui::Text(\"Raw (%.1f, %.1f), WithLockThresold (%.1f, %.1f), MouseDelta (%.1f, %.1f)\", value_raw.x, value_raw.y, value_with_lock_threshold.x, value_with_lock_threshold.y, mouse_delta.x, mouse_delta.y);\n            }\n            ImGui::TreePop();\n        }\n\n        if (ImGui::TreeNode(\"Mouse cursors\"))\n        {\n            ImGui::Text(\"Hover to see mouse cursors:\");\n            ImGui::SameLine(); ShowHelpMarker(\"Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, otherwise your backend needs to handle it.\");\n            for (int i = 0; i < ImGuiMouseCursor_Count_; i++)\n            {\n                char label[32];\n                sprintf(label, \"Mouse cursor %d\", i);\n                ImGui::Bullet(); ImGui::Selectable(label, false);\n                if (ImGui::IsItemHovered())\n                    ImGui::SetMouseCursor(i);\n            }\n            ImGui::TreePop();\n        }\n    }\n\n    ImGui::End();\n}\n\nvoid ImGui::ShowStyleEditor(ImGuiStyle* ref)\n{\n    // You can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it compares to an internally stored reference)\n    ImGuiStyle& style = ImGui::GetStyle();\n    static ImGuiStyle ref_saved_style;\n\n    // Default to using internal storage as reference\n    static bool init = true;\n    if (init && ref == NULL)\n        ref_saved_style = style;\n    init = false;\n    if (ref == NULL)\n        ref = &ref_saved_style;\n\n    ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.50f);\n\n    // Default Styles Selector\n    static int style_idx = 0;\n    if (ImGui::Combo(\"Colors##Selector\", &style_idx, \"Classic\\0Dark\\0Light\\0\"))\n    {\n        switch (style_idx)\n        {\n        case 0: ImGui::StyleColorsClassic(); break;\n        case 1: ImGui::StyleColorsDark(); break;\n        case 2: ImGui::StyleColorsLight(); break;\n        }\n        ref_saved_style = style;\n    }\n\n    // Simplified Settings\n    if (ImGui::SliderFloat(\"FrameRounding\", &style.FrameRounding, 0.0f, 12.0f, \"%.0f\")) \n        style.GrabRounding = style.FrameRounding; // Make GrabRounding always the same value as FrameRounding\n    { bool window_border = (style.WindowBorderSize > 0.0f); if (ImGui::Checkbox(\"WindowBorder\", &window_border)) style.WindowBorderSize = window_border ? 1.0f : 0.0f; }\n    ImGui::SameLine();\n    { bool frame_border = (style.FrameBorderSize > 0.0f); if (ImGui::Checkbox(\"FrameBorder\", &frame_border)) style.FrameBorderSize = frame_border ? 1.0f : 0.0f; }\n    ImGui::SameLine();\n    { bool popup_border = (style.PopupBorderSize > 0.0f); if (ImGui::Checkbox(\"PopupBorder\", &popup_border)) style.PopupBorderSize = popup_border ? 1.0f : 0.0f; }\n\n    // Save/Revert button\n    if (ImGui::Button(\"Save Ref\"))\n        *ref = ref_saved_style = style;\n    ImGui::SameLine();\n    if (ImGui::Button(\"Revert Ref\"))\n        style = *ref;\n    ImGui::SameLine();\n    ShowHelpMarker(\"Save/Revert in local non-persistent storage. Default Colors definition are not affected. Use \\\"Export Colors\\\" below to save them somewhere.\");\n\n    if (ImGui::TreeNode(\"Rendering\"))\n    {\n        ImGui::Checkbox(\"Anti-aliased lines\", &style.AntiAliasedLines); ImGui::SameLine(); ShowHelpMarker(\"When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well.\");\n        ImGui::Checkbox(\"Anti-aliased shapes\", &style.AntiAliasedShapes);\n        ImGui::PushItemWidth(100);\n        ImGui::DragFloat(\"Curve Tessellation Tolerance\", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, NULL, 2.0f);\n        if (style.CurveTessellationTol < 0.0f) style.CurveTessellationTol = 0.10f;\n        ImGui::DragFloat(\"Global Alpha\", &style.Alpha, 0.005f, 0.20f, 1.0f, \"%.2f\"); // Not exposing zero here so user doesn't \"lose\" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.\n        ImGui::PopItemWidth();\n        ImGui::TreePop();\n    }\n\n    if (ImGui::TreeNode(\"Settings\"))\n    {\n        ImGui::SliderFloat2(\"WindowPadding\", (float*)&style.WindowPadding, 0.0f, 20.0f, \"%.0f\");\n        ImGui::SliderFloat(\"PopupRounding\", &style.PopupRounding, 0.0f, 16.0f, \"%.0f\");\n        ImGui::SliderFloat2(\"FramePadding\", (float*)&style.FramePadding, 0.0f, 20.0f, \"%.0f\");\n        ImGui::SliderFloat2(\"ItemSpacing\", (float*)&style.ItemSpacing, 0.0f, 20.0f, \"%.0f\");\n        ImGui::SliderFloat2(\"ItemInnerSpacing\", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, \"%.0f\");\n        ImGui::SliderFloat2(\"TouchExtraPadding\", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, \"%.0f\");\n        ImGui::SliderFloat(\"IndentSpacing\", &style.IndentSpacing, 0.0f, 30.0f, \"%.0f\");\n        ImGui::SliderFloat(\"ScrollbarSize\", &style.ScrollbarSize, 1.0f, 20.0f, \"%.0f\");\n        ImGui::SliderFloat(\"GrabMinSize\", &style.GrabMinSize, 1.0f, 20.0f, \"%.0f\");\n        ImGui::Text(\"BorderSize\");\n        ImGui::SliderFloat(\"WindowBorderSize\", &style.WindowBorderSize, 0.0f, 1.0f, \"%.0f\");\n        ImGui::SliderFloat(\"ChildBorderSize\", &style.ChildBorderSize, 0.0f, 1.0f, \"%.0f\");\n        ImGui::SliderFloat(\"PopupBorderSize\", &style.PopupBorderSize, 0.0f, 1.0f, \"%.0f\");\n        ImGui::SliderFloat(\"FrameBorderSize\", &style.FrameBorderSize, 0.0f, 1.0f, \"%.0f\");\n        ImGui::Text(\"Rounding\");\n        ImGui::SliderFloat(\"WindowRounding\", &style.WindowRounding, 0.0f, 14.0f, \"%.0f\");\n        ImGui::SliderFloat(\"ChildRounding\", &style.ChildRounding, 0.0f, 16.0f, \"%.0f\");\n        ImGui::SliderFloat(\"FrameRounding\", &style.FrameRounding, 0.0f, 12.0f, \"%.0f\");\n        ImGui::SliderFloat(\"ScrollbarRounding\", &style.ScrollbarRounding, 0.0f, 12.0f, \"%.0f\");\n        ImGui::SliderFloat(\"GrabRounding\", &style.GrabRounding, 0.0f, 12.0f, \"%.0f\");\n        ImGui::Text(\"Alignment\");\n        ImGui::SliderFloat2(\"WindowTitleAlign\", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, \"%.2f\");\n        ImGui::SliderFloat2(\"ButtonTextAlign\", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, \"%.2f\"); ImGui::SameLine(); ShowHelpMarker(\"Alignment applies when a button is larger than its text content.\");\n        ImGui::TreePop();\n    }\n\n    if (ImGui::TreeNode(\"Colors\"))\n    {\n        static int output_dest = 0;\n        static bool output_only_modified = true;\n        if (ImGui::Button(\"Export Unsaved\"))\n        {\n            if (output_dest == 0)\n                ImGui::LogToClipboard();\n            else\n                ImGui::LogToTTY();\n            ImGui::LogText(\"ImVec4* colors = ImGui::GetStyle().Colors;\" IM_NEWLINE);\n            for (int i = 0; i < ImGuiCol_COUNT; i++)\n            {\n                const ImVec4& col = style.Colors[i];\n                const char* name = ImGui::GetStyleColorName(i);\n                if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0)\n                    ImGui::LogText(\"colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);\" IM_NEWLINE, name, 23-(int)strlen(name), \"\", col.x, col.y, col.z, col.w);\n            }\n            ImGui::LogFinish();\n        }\n        ImGui::SameLine(); ImGui::PushItemWidth(120); ImGui::Combo(\"##output_type\", &output_dest, \"To Clipboard\\0To TTY\\0\"); ImGui::PopItemWidth();\n        ImGui::SameLine(); ImGui::Checkbox(\"Only Modified Colors\", &output_only_modified);\n\n        ImGui::Text(\"Tip: Left-click on colored square to open color picker,\\nRight-click to open edit options menu.\");\n\n        static ImGuiTextFilter filter;\n        filter.Draw(\"Filter colors\", 200);\n\n        static ImGuiColorEditFlags alpha_flags = 0;\n        ImGui::RadioButton(\"Opaque\", &alpha_flags, 0); ImGui::SameLine(); \n        ImGui::RadioButton(\"Alpha\", &alpha_flags, ImGuiColorEditFlags_AlphaPreview); ImGui::SameLine(); \n        ImGui::RadioButton(\"Both\", &alpha_flags, ImGuiColorEditFlags_AlphaPreviewHalf);\n\n        ImGui::BeginChild(\"#colors\", ImVec2(0, 300), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar);\n        ImGui::PushItemWidth(-160);\n        for (int i = 0; i < ImGuiCol_COUNT; i++)\n        {\n            const char* name = ImGui::GetStyleColorName(i);\n            if (!filter.PassFilter(name))\n                continue;\n            ImGui::PushID(i);\n            ImGui::ColorEdit4(\"##color\", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags);\n            if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0)\n            {\n                // Tips: in a real user application, you may want to merge and use an icon font into the main font, so instead of \"Save\"/\"Revert\" you'd use icons.\n                // Read the FAQ and extra_fonts/README.txt about using icon fonts. It's really easy and super convenient!\n                ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button(\"Save\")) ref->Colors[i] = style.Colors[i];\n                ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button(\"Revert\")) style.Colors[i] = ref->Colors[i];\n            }\n            ImGui::SameLine(0.0f, style.ItemInnerSpacing.x);\n            ImGui::TextUnformatted(name);\n            ImGui::PopID();\n        }\n        ImGui::PopItemWidth();\n        ImGui::EndChild();\n\n        ImGui::TreePop();\n    }\n\n    bool fonts_opened = ImGui::TreeNode(\"Fonts\", \"Fonts (%d)\", ImGui::GetIO().Fonts->Fonts.Size);\n    ImGui::SameLine(); ShowHelpMarker(\"Tip: Load fonts with io.Fonts->AddFontFromFileTTF()\\nbefore calling io.Fonts->GetTex* functions.\");\n    if (fonts_opened)\n    {\n        ImFontAtlas* atlas = ImGui::GetIO().Fonts;\n        if (ImGui::TreeNode(\"Atlas texture\", \"Atlas texture (%dx%d pixels)\", atlas->TexWidth, atlas->TexHeight))\n        {\n            ImGui::Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0,0), ImVec2(1,1), ImColor(255,255,255,255), ImColor(255,255,255,128));\n            ImGui::TreePop();\n        }\n        ImGui::PushItemWidth(100);\n        for (int i = 0; i < atlas->Fonts.Size; i++)\n        {\n            ImFont* font = atlas->Fonts[i];\n            ImGui::PushID(font);\n            bool font_details_opened = ImGui::TreeNode(font, \"Font %d: \\'%s\\', %.2f px, %d glyphs\", i, font->ConfigData ? font->ConfigData[0].Name : \"\", font->FontSize, font->Glyphs.Size);\n            ImGui::SameLine(); if (ImGui::SmallButton(\"Set as default\")) ImGui::GetIO().FontDefault = font;\n            if (font_details_opened)\n            {\n                ImGui::PushFont(font);\n                ImGui::Text(\"The quick brown fox jumps over the lazy dog\");\n                ImGui::PopFont();\n                ImGui::DragFloat(\"Font scale\", &font->Scale, 0.005f, 0.3f, 2.0f, \"%.1f\");   // Scale only this font\n                ImGui::SameLine(); ShowHelpMarker(\"Note than the default embedded font is NOT meant to be scaled.\\n\\nFont are currently rendered into bitmaps at a given size at the time of building the atlas. You may oversample them to get some flexibility with scaling. You can also render at multiple sizes and select which one to use at runtime.\\n\\n(Glimmer of hope: the atlas system should hopefully be rewritten in the future to make scaling more natural and automatic.)\");\n                ImGui::Text(\"Ascent: %f, Descent: %f, Height: %f\", font->Ascent, font->Descent, font->Ascent - font->Descent);\n                ImGui::Text(\"Fallback character: '%c' (%d)\", font->FallbackChar, font->FallbackChar);\n                ImGui::Text(\"Texture surface: %d pixels (approx) ~ %dx%d\", font->MetricsTotalSurface, (int)sqrtf((float)font->MetricsTotalSurface), (int)sqrtf((float)font->MetricsTotalSurface));\n                for (int config_i = 0; config_i < font->ConfigDataCount; config_i++)\n                {\n                    ImFontConfig* cfg = &font->ConfigData[config_i];\n                    ImGui::BulletText(\"Input %d: \\'%s\\', Oversample: (%d,%d), PixelSnapH: %d\", config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH);\n                }\n                if (ImGui::TreeNode(\"Glyphs\", \"Glyphs (%d)\", font->Glyphs.Size))\n                {\n                    // Display all glyphs of the fonts in separate pages of 256 characters\n                    const ImFontGlyph* glyph_fallback = font->FallbackGlyph; // Forcefully/dodgily make FindGlyph() return NULL on fallback, which isn't the default behavior.\n                    font->FallbackGlyph = NULL;\n                    for (int base = 0; base < 0x10000; base += 256)\n                    {\n                        int count = 0;\n                        for (int n = 0; n < 256; n++)\n                            count += font->FindGlyph((ImWchar)(base + n)) ? 1 : 0;\n                        if (count > 0 && ImGui::TreeNode((void*)(intptr_t)base, \"U+%04X..U+%04X (%d %s)\", base, base+255, count, count > 1 ? \"glyphs\" : \"glyph\"))\n                        {\n                            float cell_spacing = style.ItemSpacing.y;\n                            ImVec2 cell_size(font->FontSize * 1, font->FontSize * 1);\n                            ImVec2 base_pos = ImGui::GetCursorScreenPos();\n                            ImDrawList* draw_list = ImGui::GetWindowDrawList();\n                            for (int n = 0; n < 256; n++)\n                            {\n                                ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size.x + cell_spacing), base_pos.y + (n / 16) * (cell_size.y + cell_spacing));\n                                ImVec2 cell_p2(cell_p1.x + cell_size.x, cell_p1.y + cell_size.y);\n                                const ImFontGlyph* glyph = font->FindGlyph((ImWchar)(base+n));;\n                                draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255,255,255,100) : IM_COL32(255,255,255,50));\n                                font->RenderChar(draw_list, cell_size.x, cell_p1, ImGui::GetColorU32(ImGuiCol_Text), (ImWchar)(base+n)); // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions available to generate a string.\n                                if (glyph && ImGui::IsMouseHoveringRect(cell_p1, cell_p2))\n                                {\n                                    ImGui::BeginTooltip();\n                                    ImGui::Text(\"Codepoint: U+%04X\", base+n);\n                                    ImGui::Separator();\n                                    ImGui::Text(\"AdvanceX: %.1f\", glyph->AdvanceX);\n                                    ImGui::Text(\"Pos: (%.2f,%.2f)->(%.2f,%.2f)\", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1);\n                                    ImGui::Text(\"UV: (%.3f,%.3f)->(%.3f,%.3f)\", glyph->U0, glyph->V0, glyph->U1, glyph->V1);\n                                    ImGui::EndTooltip();\n                                }\n                            }\n                            ImGui::Dummy(ImVec2((cell_size.x + cell_spacing) * 16, (cell_size.y + cell_spacing) * 16));\n                            ImGui::TreePop();\n                        }\n                    }\n                    font->FallbackGlyph = glyph_fallback;\n                    ImGui::TreePop();\n                }\n                ImGui::TreePop();\n            }\n            ImGui::PopID();\n        }\n        static float window_scale = 1.0f;\n        ImGui::DragFloat(\"this window scale\", &window_scale, 0.005f, 0.3f, 2.0f, \"%.1f\");              // scale only this window\n        ImGui::DragFloat(\"global scale\", &ImGui::GetIO().FontGlobalScale, 0.005f, 0.3f, 2.0f, \"%.1f\"); // scale everything\n        ImGui::PopItemWidth();\n        ImGui::SetWindowFontScale(window_scale);\n        ImGui::TreePop();\n    }\n\n    ImGui::PopItemWidth();\n}\n\n// Demonstrate creating a fullscreen menu bar and populating it.\nstatic void ShowExampleAppMainMenuBar()\n{\n    if (ImGui::BeginMainMenuBar())\n    {\n        if (ImGui::BeginMenu(\"File\"))\n        {\n            ShowExampleMenuFile();\n            ImGui::EndMenu();\n        }\n        if (ImGui::BeginMenu(\"Edit\"))\n        {\n            if (ImGui::MenuItem(\"Undo\", \"CTRL+Z\")) {}\n            if (ImGui::MenuItem(\"Redo\", \"CTRL+Y\", false, false)) {}  // Disabled item\n            ImGui::Separator();\n            if (ImGui::MenuItem(\"Cut\", \"CTRL+X\")) {}\n            if (ImGui::MenuItem(\"Copy\", \"CTRL+C\")) {}\n            if (ImGui::MenuItem(\"Paste\", \"CTRL+V\")) {}\n            ImGui::EndMenu();\n        }\n        ImGui::EndMainMenuBar();\n    }\n}\n\nstatic void ShowExampleMenuFile()\n{\n    ImGui::MenuItem(\"(dummy menu)\", NULL, false, false);\n    if (ImGui::MenuItem(\"New\")) {}\n    if (ImGui::MenuItem(\"Open\", \"Ctrl+O\")) {}\n    if (ImGui::BeginMenu(\"Open Recent\"))\n    {\n        ImGui::MenuItem(\"fish_hat.c\");\n        ImGui::MenuItem(\"fish_hat.inl\");\n        ImGui::MenuItem(\"fish_hat.h\");\n        if (ImGui::BeginMenu(\"More..\"))\n        {\n            ImGui::MenuItem(\"Hello\");\n            ImGui::MenuItem(\"Sailor\");\n            if (ImGui::BeginMenu(\"Recurse..\"))\n            {\n                ShowExampleMenuFile();\n                ImGui::EndMenu();\n            }\n            ImGui::EndMenu();\n        }\n        ImGui::EndMenu();\n    }\n    if (ImGui::MenuItem(\"Save\", \"Ctrl+S\")) {}\n    if (ImGui::MenuItem(\"Save As..\")) {}\n    ImGui::Separator();\n    if (ImGui::BeginMenu(\"Options\"))\n    {\n        static bool enabled = true;\n        ImGui::MenuItem(\"Enabled\", \"\", &enabled);\n        ImGui::BeginChild(\"child\", ImVec2(0, 60), true);\n        for (int i = 0; i < 10; i++)\n            ImGui::Text(\"Scrolling Text %d\", i);\n        ImGui::EndChild();\n        static float f = 0.5f;\n        static int n = 0;\n        static bool b = true;\n        ImGui::SliderFloat(\"Value\", &f, 0.0f, 1.0f);\n        ImGui::InputFloat(\"Input\", &f, 0.1f);\n        ImGui::Combo(\"Combo\", &n, \"Yes\\0No\\0Maybe\\0\\0\");\n        ImGui::Checkbox(\"Check\", &b);\n        ImGui::EndMenu();\n    }\n    if (ImGui::BeginMenu(\"Colors\"))\n    {\n        ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0));\n        for (int i = 0; i < ImGuiCol_COUNT; i++)\n        {\n            const char* name = ImGui::GetStyleColorName((ImGuiCol)i);\n            ImGui::ColorButton(name, ImGui::GetStyleColorVec4((ImGuiCol)i));\n            ImGui::SameLine();\n            ImGui::MenuItem(name);\n        }\n        ImGui::PopStyleVar();\n        ImGui::EndMenu();\n    }\n    if (ImGui::BeginMenu(\"Disabled\", false)) // Disabled\n    {\n        IM_ASSERT(0);\n    }\n    if (ImGui::MenuItem(\"Checked\", NULL, true)) {}\n    if (ImGui::MenuItem(\"Quit\", \"Alt+F4\")) {}\n}\n\n// Demonstrate creating a window which gets auto-resized according to its content.\nstatic void ShowExampleAppAutoResize(bool* p_open)\n{\n    if (!ImGui::Begin(\"Example: Auto-resizing window\", p_open, ImGuiWindowFlags_AlwaysAutoResize))\n    {\n        ImGui::End();\n        return;\n    }\n\n    static int lines = 10;\n    ImGui::Text(\"Window will resize every-frame to the size of its content.\\nNote that you probably don't want to query the window size to\\noutput your content because that would create a feedback loop.\");\n    ImGui::SliderInt(\"Number of lines\", &lines, 1, 20);\n    for (int i = 0; i < lines; i++)\n        ImGui::Text(\"%*sThis is line %d\", i*4, \"\", i); // Pad with space to extend size horizontally\n    ImGui::End();\n}\n\n// Demonstrate creating a window with custom resize constraints.\nstatic void ShowExampleAppConstrainedResize(bool* p_open)\n{\n    struct CustomConstraints // Helper functions to demonstrate programmatic constraints\n    {\n        static void Square(ImGuiSizeConstraintCallbackData* data) { data->DesiredSize = ImVec2(IM_MAX(data->DesiredSize.x, data->DesiredSize.y), IM_MAX(data->DesiredSize.x, data->DesiredSize.y)); }\n        static void Step(ImGuiSizeConstraintCallbackData* data)   { float step = (float)(int)(intptr_t)data->UserData; data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); }\n    };\n\n    static bool auto_resize = false;\n    static int type = 0;\n    static int display_lines = 10;\n    if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0),    ImVec2(-1, FLT_MAX));      // Vertical only\n    if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1),    ImVec2(FLT_MAX, -1));      // Horizontal only\n    if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100\n    if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1),  ImVec2(500, -1));          // Width 400-500\n    if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400),  ImVec2(-1, 500));          // Height 400-500\n    if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0),     ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square);          // Always Square\n    if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0),     ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)100);// Fixed Step\n\n    ImGuiWindowFlags flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0;\n    if (ImGui::Begin(\"Example: Constrained Resize\", p_open, flags))\n    {\n        const char* desc[] = \n        {\n            \"Resize vertical only\",\n            \"Resize horizontal only\",\n            \"Width > 100, Height > 100\",\n            \"Width 400-500\",\n            \"Height 400-500\",\n            \"Custom: Always Square\",\n            \"Custom: Fixed Steps (100)\",\n        };\n        if (ImGui::Button(\"200x200\")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine();\n        if (ImGui::Button(\"500x500\")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine();\n        if (ImGui::Button(\"800x200\")) { ImGui::SetWindowSize(ImVec2(800, 200)); }\n        ImGui::PushItemWidth(200);\n        ImGui::Combo(\"Constraint\", &type, desc, IM_ARRAYSIZE(desc));\n        ImGui::DragInt(\"Lines\", &display_lines, 0.2f, 1, 100);\n        ImGui::PopItemWidth();\n        ImGui::Checkbox(\"Auto-resize\", &auto_resize);\n        for (int i = 0; i < display_lines; i++)\n            ImGui::Text(\"%*sHello, sailor! Making this line long enough for the example.\", i * 4, \"\");\n    }\n    ImGui::End();\n}\n\n// Demonstrate creating a simple static window with no decoration + a context-menu to choose which corner of the screen to use.\nstatic void ShowExampleAppFixedOverlay(bool* p_open)\n{\n    const float DISTANCE = 10.0f;\n    static int corner = 0;\n    ImVec2 window_pos = ImVec2((corner & 1) ? ImGui::GetIO().DisplaySize.x - DISTANCE : DISTANCE, (corner & 2) ? ImGui::GetIO().DisplaySize.y - DISTANCE : DISTANCE);\n    ImVec2 window_pos_pivot = ImVec2((corner & 1) ? 1.0f : 0.0f, (corner & 2) ? 1.0f : 0.0f);\n    ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot);\n    ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); // Transparent background\n    if (ImGui::Begin(\"Example: Fixed Overlay\", p_open, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoSavedSettings))\n    {\n        ImGui::Text(\"Simple overlay\\nin the corner of the screen.\\n(right-click to change position)\");\n        ImGui::Separator();\n        ImGui::Text(\"Mouse Position: (%.1f,%.1f)\", ImGui::GetIO().MousePos.x, ImGui::GetIO().MousePos.y);\n        if (ImGui::BeginPopupContextWindow())\n        {\n            if (ImGui::MenuItem(\"Top-left\", NULL, corner == 0)) corner = 0;\n            if (ImGui::MenuItem(\"Top-right\", NULL, corner == 1)) corner = 1;\n            if (ImGui::MenuItem(\"Bottom-left\", NULL, corner == 2)) corner = 2;\n            if (ImGui::MenuItem(\"Bottom-right\", NULL, corner == 3)) corner = 3;\n            ImGui::EndPopup();\n        }\n        ImGui::End();\n    }\n    ImGui::PopStyleColor();\n}\n\n// Demonstrate using \"##\" and \"###\" in identifiers to manipulate ID generation.\n// Read section \"How can I have multiple widgets with the same label? Can I have widget without a label? (Yes). A primer on the purpose of labels/IDs.\" about ID.\nstatic void ShowExampleAppManipulatingWindowTitle(bool*)\n{\n    // By default, Windows are uniquely identified by their title.\n    // You can use the \"##\" and \"###\" markers to manipulate the display/ID.\n\n    // Using \"##\" to display same title but have unique identifier.\n    ImGui::SetNextWindowPos(ImVec2(100,100), ImGuiCond_FirstUseEver);\n    ImGui::Begin(\"Same title as another window##1\");\n    ImGui::Text(\"This is window 1.\\nMy title is the same as window 2, but my identifier is unique.\");\n    ImGui::End();\n\n    ImGui::SetNextWindowPos(ImVec2(100,200), ImGuiCond_FirstUseEver);\n    ImGui::Begin(\"Same title as another window##2\");\n    ImGui::Text(\"This is window 2.\\nMy title is the same as window 1, but my identifier is unique.\");\n    ImGui::End();\n\n    // Using \"###\" to display a changing title but keep a static identifier \"AnimatedTitle\"\n    char buf[128];\n    sprintf(buf, \"Animated title %c %d###AnimatedTitle\", \"|/-\\\\\"[(int)(ImGui::GetTime()/0.25f)&3], rand());\n    ImGui::SetNextWindowPos(ImVec2(100,300), ImGuiCond_FirstUseEver);\n    ImGui::Begin(buf);\n    ImGui::Text(\"This window has a changing title.\");\n    ImGui::End();\n}\n\n// Demonstrate using the low-level ImDrawList to draw custom shapes. \nstatic void ShowExampleAppCustomRendering(bool* p_open)\n{\n    ImGui::SetNextWindowSize(ImVec2(350,560), ImGuiCond_FirstUseEver);\n    if (!ImGui::Begin(\"Example: Custom rendering\", p_open))\n    {\n        ImGui::End();\n        return;\n    }\n\n    // Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of overloaded operators, etc.\n    // Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your types and ImVec2/ImVec4.\n    // ImGui defines overloaded operators but they are internal to imgui.cpp and not exposed outside (to avoid messing with your types)\n    // In this example we are not using the maths operators!\n    ImDrawList* draw_list = ImGui::GetWindowDrawList();\n\n    // Primitives\n    ImGui::Text(\"Primitives\");\n    static float sz = 36.0f;\n    static ImVec4 col = ImVec4(1.0f,1.0f,0.4f,1.0f);\n    ImGui::DragFloat(\"Size\", &sz, 0.2f, 2.0f, 72.0f, \"%.0f\");\n    ImGui::ColorEdit3(\"Color\", &col.x);\n    {\n        const ImVec2 p = ImGui::GetCursorScreenPos();\n        const ImU32 col32 = ImColor(col);\n        float x = p.x + 4.0f, y = p.y + 4.0f, spacing = 8.0f;\n        for (int n = 0; n < 2; n++)\n        {\n            float thickness = (n == 0) ? 1.0f : 4.0f;\n            draw_list->AddCircle(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 20, thickness); x += sz+spacing;\n            draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 0.0f, ImDrawCornerFlags_All, thickness); x += sz+spacing;\n            draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_All, thickness); x += sz+spacing;\n            draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotRight, thickness); x += sz+spacing;\n            draw_list->AddTriangle(ImVec2(x+sz*0.5f, y), ImVec2(x+sz,y+sz-0.5f), ImVec2(x,y+sz-0.5f), col32, thickness); x += sz+spacing;\n            draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y   ), col32, thickness); x += sz+spacing;\n            draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, thickness); x += sz+spacing;\n            draw_list->AddLine(ImVec2(x, y), ImVec2(x,    y+sz), col32, thickness); x += spacing;\n            draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x+sz*1.3f,y+sz*0.3f), ImVec2(x+sz-sz*1.3f,y+sz-sz*0.3f), ImVec2(x+sz, y+sz), col32, thickness);\n            x = p.x + 4;\n            y += sz+spacing;\n        }\n        draw_list->AddCircleFilled(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 32); x += sz+spacing;\n        draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;\n        draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f); x += sz+spacing;\n        draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotRight); x += sz+spacing;\n        draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f, y), ImVec2(x+sz,y+sz-0.5f), ImVec2(x,y+sz-0.5f), col32); x += sz+spacing;\n        draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x+sz, y+sz), ImColor(0,0,0), ImColor(255,0,0), ImColor(255,255,0), ImColor(0,255,0));\n        ImGui::Dummy(ImVec2((sz+spacing)*8, (sz+spacing)*3));\n    }\n    ImGui::Separator();\n    {\n        static ImVector<ImVec2> points;\n        static bool adding_line = false;\n        ImGui::Text(\"Canvas example\");\n        if (ImGui::Button(\"Clear\")) points.clear();\n        if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button(\"Undo\")) { points.pop_back(); points.pop_back(); } }\n        ImGui::Text(\"Left-click and drag to add lines,\\nRight-click to undo\");\n\n        // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()\n        // However you can draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().\n        // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).\n        ImVec2 canvas_pos = ImGui::GetCursorScreenPos();            // ImDrawList API uses screen coordinates!\n        ImVec2 canvas_size = ImGui::GetContentRegionAvail();        // Resize canvas to what's available\n        if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;\n        if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;\n        draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(50,50,50), ImColor(50,50,60), ImColor(60,60,70), ImColor(50,50,60));\n        draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(255,255,255));\n\n        bool adding_preview = false;\n        ImGui::InvisibleButton(\"canvas\", canvas_size);\n        ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);\n        if (adding_line)\n        {\n            adding_preview = true;\n            points.push_back(mouse_pos_in_canvas);\n            if (!ImGui::GetIO().MouseDown[0])\n                adding_line = adding_preview = false;\n        }\n        if (ImGui::IsItemHovered())\n        {\n            if (!adding_line && ImGui::IsMouseClicked(0))\n            {\n                points.push_back(mouse_pos_in_canvas);\n                adding_line = true;\n            }\n            if (ImGui::IsMouseClicked(1) && !points.empty())\n            {\n                adding_line = adding_preview = false;\n                points.pop_back();\n                points.pop_back();\n            }\n        }\n        draw_list->PushClipRect(canvas_pos, ImVec2(canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y), true);      // clip lines within the canvas (if we resize it, etc.)\n        for (int i = 0; i < points.Size - 1; i += 2)\n            draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), IM_COL32(255,255,0,255), 2.0f);\n        draw_list->PopClipRect();\n        if (adding_preview)\n            points.pop_back();\n    }\n    ImGui::End();\n}\n\n// Demonstrating creating a simple console window, with scrolling, filtering, completion and history.\n// For the console example, here we are using a more C++ like approach of declaring a class to hold the data and the functions.\nstruct ExampleAppConsole\n{\n    char                  InputBuf[256];\n    ImVector<char*>       Items;\n    bool                  ScrollToBottom;\n    ImVector<char*>       History;\n    int                   HistoryPos;    // -1: new line, 0..History.Size-1 browsing history.\n    ImVector<const char*> Commands;\n\n    ExampleAppConsole()\n    {\n        ClearLog();\n        memset(InputBuf, 0, sizeof(InputBuf));\n        HistoryPos = -1;\n        Commands.push_back(\"HELP\");\n        Commands.push_back(\"HISTORY\");\n        Commands.push_back(\"CLEAR\");\n        Commands.push_back(\"CLASSIFY\");  // \"classify\" is here to provide an example of \"C\"+[tab] completing to \"CL\" and displaying matches.\n        AddLog(\"Welcome to ImGui!\");\n    }\n    ~ExampleAppConsole()\n    {\n        ClearLog();\n        for (int i = 0; i < History.Size; i++)\n            free(History[i]);\n    }\n\n    // Portable helpers\n    static int   Stricmp(const char* str1, const char* str2)         { int d; while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } return d; }\n    static int   Strnicmp(const char* str1, const char* str2, int n) { int d = 0; while (n > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; n--; } return d; }\n    static char* Strdup(const char *str)                             { size_t len = strlen(str) + 1; void* buff = malloc(len); return (char*)memcpy(buff, (const void*)str, len); }\n\n    void    ClearLog()\n    {\n        for (int i = 0; i < Items.Size; i++)\n            free(Items[i]);\n        Items.clear();\n        ScrollToBottom = true;\n    }\n\n    void    AddLog(const char* fmt, ...) IM_FMTARGS(2)\n    {\n        // FIXME-OPT\n        char buf[1024];\n        va_list args;\n        va_start(args, fmt);\n        vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args);\n        buf[IM_ARRAYSIZE(buf)-1] = 0;\n        va_end(args);\n        Items.push_back(Strdup(buf));\n        ScrollToBottom = true;\n    }\n\n    void    Draw(const char* title, bool* p_open)\n    {\n        ImGui::SetNextWindowSize(ImVec2(520,600), ImGuiCond_FirstUseEver);\n        if (!ImGui::Begin(title, p_open))\n        {\n            ImGui::End();\n            return;\n        }\n\n        // As a specific feature guaranteed by the library, after calling Begin() the last Item represent the title bar. So e.g. IsItemHovered() will return true when hovering the title bar.\n        // Here we create a context menu only available from the title bar.\n        if (ImGui::BeginPopupContextItem())\n        {\n            if (ImGui::MenuItem(\"Close\"))\n                *p_open = false;\n            ImGui::EndPopup();\n        }\n\n        ImGui::TextWrapped(\"This example implements a console with basic coloring, completion and history. A more elaborate implementation may want to store entries along with extra data such as timestamp, emitter, etc.\");\n        ImGui::TextWrapped(\"Enter 'HELP' for help, press TAB to use text completion.\");\n\n        // TODO: display items starting from the bottom\n\n        if (ImGui::SmallButton(\"Add Dummy Text\")) { AddLog(\"%d some text\", Items.Size); AddLog(\"some more text\"); AddLog(\"display very important message here!\"); } ImGui::SameLine();\n        if (ImGui::SmallButton(\"Add Dummy Error\")) { AddLog(\"[error] something went wrong\"); } ImGui::SameLine();\n        if (ImGui::SmallButton(\"Clear\")) { ClearLog(); } ImGui::SameLine();\n        bool copy_to_clipboard = ImGui::SmallButton(\"Copy\"); ImGui::SameLine();\n        if (ImGui::SmallButton(\"Scroll to bottom\")) ScrollToBottom = true;\n        //static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog(\"Spam %f\", t); }\n\n        ImGui::Separator();\n\n        ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0));\n        static ImGuiTextFilter filter;\n        filter.Draw(\"Filter (\\\"incl,-excl\\\") (\\\"error\\\")\", 180);\n        ImGui::PopStyleVar();\n        ImGui::Separator();\n\n        ImGui::BeginChild(\"ScrollingRegion\", ImVec2(0,-ImGui::GetItemsLineHeightWithSpacing()), false, ImGuiWindowFlags_HorizontalScrollbar);\n        if (ImGui::BeginPopupContextWindow())\n        {\n            if (ImGui::Selectable(\"Clear\")) ClearLog();\n            ImGui::EndPopup();\n        }\n\n        // Display every line as a separate entry so we can change their color or add custom widgets. If you only want raw text you can use ImGui::TextUnformatted(log.begin(), log.end());\n        // NB- if you have thousands of entries this approach may be too inefficient and may require user-side clipping to only process visible items.\n        // You can seek and display only the lines that are visible using the ImGuiListClipper helper, if your elements are evenly spaced and you have cheap random access to the elements.\n        // To use the clipper we could replace the 'for (int i = 0; i < Items.Size; i++)' loop with:\n        //     ImGuiListClipper clipper(Items.Size);\n        //     while (clipper.Step())\n        //         for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)\n        // However take note that you can not use this code as is if a filter is active because it breaks the 'cheap random-access' property. We would need random-access on the post-filtered list.\n        // A typical application wanting coarse clipping and filtering may want to pre-compute an array of indices that passed the filtering test, recomputing this array when user changes the filter,\n        // and appending newly elements as they are inserted. This is left as a task to the user until we can manage to improve this example code!\n        // If your items are of variable size you may want to implement code similar to what ImGuiListClipper does. Or split your data into fixed height items to allow random-seeking into your list.\n        ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,1)); // Tighten spacing\n        if (copy_to_clipboard)\n            ImGui::LogToClipboard();\n        for (int i = 0; i < Items.Size; i++)\n        {\n            const char* item = Items[i];\n            if (!filter.PassFilter(item))\n                continue;\n            ImVec4 col = ImVec4(1.0f,1.0f,1.0f,1.0f); // A better implementation may store a type per-item. For the sample let's just parse the text.\n            if (strstr(item, \"[error]\")) col = ImColor(1.0f,0.4f,0.4f,1.0f);\n            else if (strncmp(item, \"# \", 2) == 0) col = ImColor(1.0f,0.78f,0.58f,1.0f);\n            ImGui::PushStyleColor(ImGuiCol_Text, col);\n            ImGui::TextUnformatted(item);\n            ImGui::PopStyleColor();\n        }\n        if (copy_to_clipboard)\n            ImGui::LogFinish();\n        if (ScrollToBottom)\n            ImGui::SetScrollHere();\n        ScrollToBottom = false;\n        ImGui::PopStyleVar();\n        ImGui::EndChild();\n        ImGui::Separator();\n\n        // Command-line\n        if (ImGui::InputText(\"Input\", InputBuf, IM_ARRAYSIZE(InputBuf), ImGuiInputTextFlags_EnterReturnsTrue|ImGuiInputTextFlags_CallbackCompletion|ImGuiInputTextFlags_CallbackHistory, &TextEditCallbackStub, (void*)this))\n        {\n            char* input_end = InputBuf+strlen(InputBuf);\n            while (input_end > InputBuf && input_end[-1] == ' ') { input_end--; } *input_end = 0;\n            if (InputBuf[0])\n                ExecCommand(InputBuf);\n            strcpy(InputBuf, \"\");\n        }\n\n        // Demonstrate keeping auto focus on the input box\n        if (ImGui::IsItemHovered() || (ImGui::IsRootWindowOrAnyChildFocused() && !ImGui::IsAnyItemActive() && !ImGui::IsMouseClicked(0)))\n            ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget\n\n        ImGui::End();\n    }\n\n    void    ExecCommand(const char* command_line)\n    {\n        AddLog(\"# %s\\n\", command_line);\n\n        // Insert into history. First find match and delete it so it can be pushed to the back. This isn't trying to be smart or optimal.\n        HistoryPos = -1;\n        for (int i = History.Size-1; i >= 0; i--)\n            if (Stricmp(History[i], command_line) == 0)\n            {\n                free(History[i]);\n                History.erase(History.begin() + i);\n                break;\n            }\n        History.push_back(Strdup(command_line));\n\n        // Process command\n        if (Stricmp(command_line, \"CLEAR\") == 0)\n        {\n            ClearLog();\n        }\n        else if (Stricmp(command_line, \"HELP\") == 0)\n        {\n            AddLog(\"Commands:\");\n            for (int i = 0; i < Commands.Size; i++)\n                AddLog(\"- %s\", Commands[i]);\n        }\n        else if (Stricmp(command_line, \"HISTORY\") == 0)\n        {\n            int first = History.Size - 10;\n            for (int i = first > 0 ? first : 0; i < History.Size; i++)\n                AddLog(\"%3d: %s\\n\", i, History[i]);\n        }\n        else\n        {\n            AddLog(\"Unknown command: '%s'\\n\", command_line);\n        }\n    }\n\n    static int TextEditCallbackStub(ImGuiTextEditCallbackData* data) // In C++11 you are better off using lambdas for this sort of forwarding callbacks\n    {\n        ExampleAppConsole* console = (ExampleAppConsole*)data->UserData;\n        return console->TextEditCallback(data);\n    }\n\n    int     TextEditCallback(ImGuiTextEditCallbackData* data)\n    {\n        //AddLog(\"cursor: %d, selection: %d-%d\", data->CursorPos, data->SelectionStart, data->SelectionEnd);\n        switch (data->EventFlag)\n        {\n        case ImGuiInputTextFlags_CallbackCompletion:\n            {\n                // Example of TEXT COMPLETION\n\n                // Locate beginning of current word\n                const char* word_end = data->Buf + data->CursorPos;\n                const char* word_start = word_end;\n                while (word_start > data->Buf)\n                {\n                    const char c = word_start[-1];\n                    if (c == ' ' || c == '\\t' || c == ',' || c == ';')\n                        break;\n                    word_start--;\n                }\n\n                // Build a list of candidates\n                ImVector<const char*> candidates;\n                for (int i = 0; i < Commands.Size; i++)\n                    if (Strnicmp(Commands[i], word_start, (int)(word_end-word_start)) == 0)\n                        candidates.push_back(Commands[i]);\n\n                if (candidates.Size == 0)\n                {\n                    // No match\n                    AddLog(\"No match for \\\"%.*s\\\"!\\n\", (int)(word_end-word_start), word_start);\n                }\n                else if (candidates.Size == 1)\n                {\n                    // Single match. Delete the beginning of the word and replace it entirely so we've got nice casing\n                    data->DeleteChars((int)(word_start-data->Buf), (int)(word_end-word_start));\n                    data->InsertChars(data->CursorPos, candidates[0]);\n                    data->InsertChars(data->CursorPos, \" \");\n                }\n                else\n                {\n                    // Multiple matches. Complete as much as we can, so inputing \"C\" will complete to \"CL\" and display \"CLEAR\" and \"CLASSIFY\"\n                    int match_len = (int)(word_end - word_start);\n                    for (;;)\n                    {\n                        int c = 0;\n                        bool all_candidates_matches = true;\n                        for (int i = 0; i < candidates.Size && all_candidates_matches; i++)\n                            if (i == 0)\n                                c = toupper(candidates[i][match_len]);\n                            else if (c == 0 || c != toupper(candidates[i][match_len]))\n                                all_candidates_matches = false;\n                        if (!all_candidates_matches)\n                            break;\n                        match_len++;\n                    }\n\n                    if (match_len > 0)\n                    {\n                        data->DeleteChars((int)(word_start - data->Buf), (int)(word_end-word_start));\n                        data->InsertChars(data->CursorPos, candidates[0], candidates[0] + match_len);\n                    }\n\n                    // List matches\n                    AddLog(\"Possible matches:\\n\");\n                    for (int i = 0; i < candidates.Size; i++)\n                        AddLog(\"- %s\\n\", candidates[i]);\n                }\n\n                break;\n            }\n        case ImGuiInputTextFlags_CallbackHistory:\n            {\n                // Example of HISTORY\n                const int prev_history_pos = HistoryPos;\n                if (data->EventKey == ImGuiKey_UpArrow)\n                {\n                    if (HistoryPos == -1)\n                        HistoryPos = History.Size - 1;\n                    else if (HistoryPos > 0)\n                        HistoryPos--;\n                }\n                else if (data->EventKey == ImGuiKey_DownArrow)\n                {\n                    if (HistoryPos != -1)\n                        if (++HistoryPos >= History.Size)\n                            HistoryPos = -1;\n                }\n\n                // A better implementation would preserve the data on the current input line along with cursor position.\n                if (prev_history_pos != HistoryPos)\n                {\n                    data->CursorPos = data->SelectionStart = data->SelectionEnd = data->BufTextLen = (int)snprintf(data->Buf, (size_t)data->BufSize, \"%s\", (HistoryPos >= 0) ? History[HistoryPos] : \"\");\n                    data->BufDirty = true;\n                }\n            }\n        }\n        return 0;\n    }\n};\n\nstatic void ShowExampleAppConsole(bool* p_open)\n{\n    static ExampleAppConsole console;\n    console.Draw(\"Example: Console\", p_open);\n}\n\n// Usage:\n//  static ExampleAppLog my_log;\n//  my_log.AddLog(\"Hello %d world\\n\", 123);\n//  my_log.Draw(\"title\");\nstruct ExampleAppLog\n{\n    ImGuiTextBuffer     Buf;\n    ImGuiTextFilter     Filter;\n    ImVector<int>       LineOffsets;        // Index to lines offset\n    bool                ScrollToBottom;\n\n    void    Clear()     { Buf.clear(); LineOffsets.clear(); }\n\n    void    AddLog(const char* fmt, ...) IM_FMTARGS(2)\n    {\n        int old_size = Buf.size();\n        va_list args;\n        va_start(args, fmt);\n        Buf.appendv(fmt, args);\n        va_end(args);\n        for (int new_size = Buf.size(); old_size < new_size; old_size++)\n            if (Buf[old_size] == '\\n')\n                LineOffsets.push_back(old_size);\n        ScrollToBottom = true;\n    }\n\n    void    Draw(const char* title, bool* p_open = NULL)\n    {\n        ImGui::SetNextWindowSize(ImVec2(500,400), ImGuiCond_FirstUseEver);\n        ImGui::Begin(title, p_open);\n        if (ImGui::Button(\"Clear\")) Clear();\n        ImGui::SameLine();\n        bool copy = ImGui::Button(\"Copy\");\n        ImGui::SameLine();\n        Filter.Draw(\"Filter\", -100.0f);\n        ImGui::Separator();\n        ImGui::BeginChild(\"scrolling\", ImVec2(0,0), false, ImGuiWindowFlags_HorizontalScrollbar);\n        if (copy) ImGui::LogToClipboard();\n\n        if (Filter.IsActive())\n        {\n            const char* buf_begin = Buf.begin();\n            const char* line = buf_begin;\n            for (int line_no = 0; line != NULL; line_no++)\n            {\n                const char* line_end = (line_no < LineOffsets.Size) ? buf_begin + LineOffsets[line_no] : NULL;\n                if (Filter.PassFilter(line, line_end))\n                    ImGui::TextUnformatted(line, line_end);\n                line = line_end && line_end[1] ? line_end + 1 : NULL;\n            }\n        }\n        else\n        {\n            ImGui::TextUnformatted(Buf.begin());\n        }\n\n        if (ScrollToBottom)\n            ImGui::SetScrollHere(1.0f);\n        ScrollToBottom = false;\n        ImGui::EndChild();\n        ImGui::End();\n    }\n};\n\n// Demonstrate creating a simple log window with basic filtering.\nstatic void ShowExampleAppLog(bool* p_open)\n{\n    static ExampleAppLog log;\n\n    // Demo: add random items (unless Ctrl is held)\n    static float last_time = -1.0f;\n    float time = ImGui::GetTime();\n    if (time - last_time >= 0.20f && !ImGui::GetIO().KeyCtrl)\n    {\n        const char* random_words[] = { \"system\", \"info\", \"warning\", \"error\", \"fatal\", \"notice\", \"log\" };\n        log.AddLog(\"[%s] Hello, time is %.1f, rand() %d\\n\", random_words[rand() % IM_ARRAYSIZE(random_words)], time, (int)rand());\n        last_time = time;\n    }\n\n    log.Draw(\"Example: Log\", p_open);\n}\n\n// Demonstrate create a window with multiple child windows.\nstatic void ShowExampleAppLayout(bool* p_open)\n{\n    ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver);\n    if (ImGui::Begin(\"Example: Layout\", p_open, ImGuiWindowFlags_MenuBar))\n    {\n        if (ImGui::BeginMenuBar())\n        {\n            if (ImGui::BeginMenu(\"File\"))\n            {\n                if (ImGui::MenuItem(\"Close\")) *p_open = false;\n                ImGui::EndMenu();\n            }\n            ImGui::EndMenuBar();\n        }\n\n        // left\n        static int selected = 0;\n        ImGui::BeginChild(\"left pane\", ImVec2(150, 0), true);\n        for (int i = 0; i < 100; i++)\n        {\n            char label[128];\n            sprintf(label, \"MyObject %d\", i);\n            if (ImGui::Selectable(label, selected == i))\n                selected = i;\n        }\n        ImGui::EndChild();\n        ImGui::SameLine();\n\n        // right\n        ImGui::BeginGroup();\n            ImGui::BeginChild(\"item view\", ImVec2(0, -ImGui::GetItemsLineHeightWithSpacing())); // Leave room for 1 line below us\n                ImGui::Text(\"MyObject: %d\", selected);\n                ImGui::Separator();\n                ImGui::TextWrapped(\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \");\n            ImGui::EndChild();\n            ImGui::BeginChild(\"buttons\");\n                if (ImGui::Button(\"Revert\")) {}\n                ImGui::SameLine();\n                if (ImGui::Button(\"Save\")) {}\n            ImGui::EndChild();\n        ImGui::EndGroup();\n    }\n    ImGui::End();\n}\n\n// Demonstrate create a simple property editor.\nstatic void ShowExampleAppPropertyEditor(bool* p_open)\n{\n    ImGui::SetNextWindowSize(ImVec2(430,450), ImGuiCond_FirstUseEver);\n    if (!ImGui::Begin(\"Example: Property editor\", p_open))\n    {\n        ImGui::End();\n        return;\n    }\n\n    ShowHelpMarker(\"This example shows how you may implement a property editor using two columns.\\nAll objects/fields data are dummies here.\\nRemember that in many simple cases, you can use ImGui::SameLine(xxx) to position\\nyour cursor horizontally instead of using the Columns() API.\");\n\n    ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2,2));\n    ImGui::Columns(2);\n    ImGui::Separator();\n\n    struct funcs\n    {\n        static void ShowDummyObject(const char* prefix, int uid)\n        {\n            ImGui::PushID(uid);                      // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID.\n            ImGui::AlignTextToFramePadding();  // Text and Tree nodes are less high than regular widgets, here we add vertical spacing to make the tree lines equal high.\n            bool node_open = ImGui::TreeNode(\"Object\", \"%s_%u\", prefix, uid);\n            ImGui::NextColumn();\n            ImGui::AlignTextToFramePadding();\n            ImGui::Text(\"my sailor is rich\");\n            ImGui::NextColumn();\n            if (node_open)\n            {\n                static float dummy_members[8] = { 0.0f,0.0f,1.0f,3.1416f,100.0f,999.0f };\n                for (int i = 0; i < 8; i++)\n                {\n                    ImGui::PushID(i); // Use field index as identifier.\n                    if (i < 2)\n                    {\n                        ShowDummyObject(\"Child\", 424242);\n                    }\n                    else\n                    {\n                        ImGui::AlignTextToFramePadding();\n                        // Here we use a Selectable (instead of Text) to highlight on hover\n                        //ImGui::Text(\"Field_%d\", i);\n                        char label[32];\n                        sprintf(label, \"Field_%d\", i);\n                        ImGui::Bullet();\n                        ImGui::Selectable(label);\n                        ImGui::NextColumn();\n                        ImGui::PushItemWidth(-1);\n                        if (i >= 5)\n                            ImGui::InputFloat(\"##value\", &dummy_members[i], 1.0f);\n                        else\n                            ImGui::DragFloat(\"##value\", &dummy_members[i], 0.01f);\n                        ImGui::PopItemWidth();\n                        ImGui::NextColumn();\n                    }\n                    ImGui::PopID();\n                }\n                ImGui::TreePop();\n            }\n            ImGui::PopID();\n        }\n    };\n\n    // Iterate dummy objects with dummy members (all the same data)\n    for (int obj_i = 0; obj_i < 3; obj_i++)\n        funcs::ShowDummyObject(\"Object\", obj_i);\n\n    ImGui::Columns(1);\n    ImGui::Separator();\n    ImGui::PopStyleVar();\n    ImGui::End();\n}\n\n// Demonstrate/test rendering huge amount of text, and the incidence of clipping.\nstatic void ShowExampleAppLongText(bool* p_open)\n{\n    ImGui::SetNextWindowSize(ImVec2(520,600), ImGuiCond_FirstUseEver);\n    if (!ImGui::Begin(\"Example: Long text display\", p_open))\n    {\n        ImGui::End();\n        return;\n    }\n\n    static int test_type = 0;\n    static ImGuiTextBuffer log;\n    static int lines = 0;\n    ImGui::Text(\"Printing unusually long amount of text.\");\n    ImGui::Combo(\"Test type\", &test_type, \"Single call to TextUnformatted()\\0Multiple calls to Text(), clipped manually\\0Multiple calls to Text(), not clipped (slow)\\0\");\n    ImGui::Text(\"Buffer contents: %d lines, %d bytes\", lines, log.size());\n    if (ImGui::Button(\"Clear\")) { log.clear(); lines = 0; }\n    ImGui::SameLine();\n    if (ImGui::Button(\"Add 1000 lines\"))\n    {\n        for (int i = 0; i < 1000; i++)\n            log.append(\"%i The quick brown fox jumps over the lazy dog\\n\", lines+i);\n        lines += 1000;\n    }\n    ImGui::BeginChild(\"Log\");\n    switch (test_type)\n    {\n    case 0:\n        // Single call to TextUnformatted() with a big buffer\n        ImGui::TextUnformatted(log.begin(), log.end());\n        break;\n    case 1:\n        {\n            // Multiple calls to Text(), manually coarsely clipped - demonstrate how to use the ImGuiListClipper helper.\n            ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0));\n            ImGuiListClipper clipper(lines);\n            while (clipper.Step())\n                for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)\n                    ImGui::Text(\"%i The quick brown fox jumps over the lazy dog\", i);\n            ImGui::PopStyleVar();\n            break;\n        }\n    case 2:\n        // Multiple calls to Text(), not clipped (slow)\n        ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0,0));\n        for (int i = 0; i < lines; i++)\n            ImGui::Text(\"%i The quick brown fox jumps over the lazy dog\", i);\n        ImGui::PopStyleVar();\n        break;\n    }\n    ImGui::EndChild();\n    ImGui::End();\n}\n\n// End of Demo code\n#else\n\nvoid ImGui::ShowTestWindow(bool*) {}\nvoid ImGui::ShowUserGuide() {}\nvoid ImGui::ShowStyleEditor(ImGuiStyle*) {}\n\n#endif\n"
  },
  {
    "path": "external/imgui/imgui_draw.cpp",
    "content": "// dear imgui, v1.53 WIP\n// (drawing and font code)\n\n// Contains implementation for\n// - Default styles\n// - ImDrawList\n// - ImDrawData\n// - ImFontAtlas\n// - ImFont\n// - Default font data\n\n#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#include \"imgui.h\"\n#define IMGUI_DEFINE_MATH_OPERATORS\n#define IMGUI_DEFINE_PLACEMENT_NEW\n#include \"imgui_internal.h\"\n\n#include <stdio.h>      // vsnprintf, sscanf, printf\n#if !defined(alloca)\n#ifdef _WIN32\n#include <malloc.h>     // alloca\n#elif defined(__GLIBC__) || defined(__sun)\n#include <alloca.h>     // alloca\n#else\n#include <stdlib.h>     // alloca\n#endif\n#endif\n\n#ifdef _MSC_VER\n#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff)\n#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen\n#define snprintf _snprintf\n#endif\n\n#ifdef __clang__\n#pragma clang diagnostic ignored \"-Wold-style-cast\"         // warning : use of old-style cast                              // yes, they are more terse.\n#pragma clang diagnostic ignored \"-Wfloat-equal\"            // warning : comparing floating point with == or != is unsafe   // storing and comparing against same constants ok.\n#pragma clang diagnostic ignored \"-Wglobal-constructors\"    // warning : declaration requires a global destructor           // similar to above, not sure what the exact difference it.\n#pragma clang diagnostic ignored \"-Wsign-conversion\"        // warning : implicit conversion changes signedness             //\n#if __has_warning(\"-Wreserved-id-macro\")\n#pragma clang diagnostic ignored \"-Wreserved-id-macro\"      // warning : macro name is a reserved identifier                //\n#endif\n#if __has_warning(\"-Wdouble-promotion\")\n#pragma clang diagnostic ignored \"-Wdouble-promotion\"       // warning: implicit conversion from 'float' to 'double' when passing argument to function\n#endif\n#elif defined(__GNUC__)\n#pragma GCC diagnostic ignored \"-Wunused-function\"          // warning: 'xxxx' defined but not used\n#pragma GCC diagnostic ignored \"-Wdouble-promotion\"         // warning: implicit conversion from 'float' to 'double' when passing argument to function\n#pragma GCC diagnostic ignored \"-Wconversion\"               // warning: conversion to 'xxxx' from 'xxxx' may alter its value\n#pragma GCC diagnostic ignored \"-Wcast-qual\"                // warning: cast from type 'xxxx' to type 'xxxx' casts away qualifiers\n#endif\n\n//-------------------------------------------------------------------------\n// STB libraries implementation\n//-------------------------------------------------------------------------\n\n//#define IMGUI_STB_NAMESPACE     ImGuiStb\n//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION\n//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION\n\n#ifdef IMGUI_STB_NAMESPACE\nnamespace IMGUI_STB_NAMESPACE\n{\n#endif\n\n#ifdef _MSC_VER\n#pragma warning (push)\n#pragma warning (disable: 4456)                             // declaration of 'xx' hides previous local declaration\n#endif\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wunused-function\"\n#pragma clang diagnostic ignored \"-Wmissing-prototypes\"\n#endif\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wtype-limits\"              // warning: comparison is always true due to limited range of data type [-Wtype-limits]\n#endif\n\n#define STBRP_ASSERT(x)    IM_ASSERT(x)\n#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION\n#define STBRP_STATIC\n#define STB_RECT_PACK_IMPLEMENTATION\n#endif\n#include \"stb_rect_pack.h\"\n\n#define STBTT_malloc(x,u)  ((void)(u), ImGui::MemAlloc(x))\n#define STBTT_free(x,u)    ((void)(u), ImGui::MemFree(x))\n#define STBTT_assert(x)    IM_ASSERT(x)\n#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION\n#define STBTT_STATIC\n#define STB_TRUETYPE_IMPLEMENTATION\n#else\n#define STBTT_DEF extern\n#endif\n#include \"stb_truetype.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n#ifdef _MSC_VER\n#pragma warning (pop)\n#endif\n\n#ifdef IMGUI_STB_NAMESPACE\n} // namespace ImGuiStb\nusing namespace IMGUI_STB_NAMESPACE;\n#endif\n\n//-----------------------------------------------------------------------------\n// Style functions\n//-----------------------------------------------------------------------------\n\nvoid ImGui::StyleColorsClassic(ImGuiStyle* dst)\n{\n    ImGuiStyle* style = dst ? dst : &ImGui::GetStyle();\n    ImVec4* colors = style->Colors;\n\n    colors[ImGuiCol_Text]                   = ImVec4(0.90f, 0.90f, 0.90f, 1.00f);\n    colors[ImGuiCol_TextDisabled]           = ImVec4(0.60f, 0.60f, 0.60f, 1.00f);\n    colors[ImGuiCol_WindowBg]               = ImVec4(0.00f, 0.00f, 0.00f, 0.70f);\n    colors[ImGuiCol_ChildBg]                = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);\n    colors[ImGuiCol_PopupBg]                = ImVec4(0.11f, 0.11f, 0.14f, 0.92f);\n    colors[ImGuiCol_Border]                 = ImVec4(0.50f, 0.50f, 0.50f, 0.50f);\n    colors[ImGuiCol_BorderShadow]           = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);\n    colors[ImGuiCol_FrameBg]                = ImVec4(0.43f, 0.43f, 0.43f, 0.39f);\n    colors[ImGuiCol_FrameBgHovered]         = ImVec4(0.47f, 0.47f, 0.69f, 0.40f);\n    colors[ImGuiCol_FrameBgActive]          = ImVec4(0.42f, 0.41f, 0.64f, 0.69f);\n    colors[ImGuiCol_TitleBg]                = ImVec4(0.27f, 0.27f, 0.54f, 0.83f);\n    colors[ImGuiCol_TitleBgActive]          = ImVec4(0.32f, 0.32f, 0.63f, 0.87f);\n    colors[ImGuiCol_TitleBgCollapsed]       = ImVec4(0.40f, 0.40f, 0.80f, 0.20f);\n    colors[ImGuiCol_MenuBarBg]              = ImVec4(0.40f, 0.40f, 0.55f, 0.80f);\n    colors[ImGuiCol_ScrollbarBg]            = ImVec4(0.20f, 0.25f, 0.30f, 0.60f);\n    colors[ImGuiCol_ScrollbarGrab]          = ImVec4(0.40f, 0.40f, 0.80f, 0.30f);\n    colors[ImGuiCol_ScrollbarGrabHovered]   = ImVec4(0.40f, 0.40f, 0.80f, 0.40f);\n    colors[ImGuiCol_ScrollbarGrabActive]    = ImVec4(0.41f, 0.39f, 0.80f, 0.60f);\n    colors[ImGuiCol_CheckMark]              = ImVec4(0.90f, 0.90f, 0.90f, 0.50f);\n    colors[ImGuiCol_SliderGrab]             = ImVec4(1.00f, 1.00f, 1.00f, 0.30f);\n    colors[ImGuiCol_SliderGrabActive]       = ImVec4(0.41f, 0.39f, 0.80f, 0.60f);\n    colors[ImGuiCol_Button]                 = ImVec4(0.35f, 0.40f, 0.61f, 0.62f);\n    colors[ImGuiCol_ButtonHovered]          = ImVec4(0.40f, 0.48f, 0.71f, 0.79f);\n    colors[ImGuiCol_ButtonActive]           = ImVec4(0.46f, 0.54f, 0.80f, 1.00f);\n    colors[ImGuiCol_Header]                 = ImVec4(0.40f, 0.40f, 0.90f, 0.45f);\n    colors[ImGuiCol_HeaderHovered]          = ImVec4(0.45f, 0.45f, 0.90f, 0.80f);\n    colors[ImGuiCol_HeaderActive]           = ImVec4(0.53f, 0.53f, 0.87f, 0.80f);\n    colors[ImGuiCol_Separator]              = ImVec4(0.50f, 0.50f, 0.50f, 1.00f);\n    colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.60f, 0.60f, 0.70f, 1.00f);\n    colors[ImGuiCol_SeparatorActive]        = ImVec4(0.70f, 0.70f, 0.90f, 1.00f);\n    colors[ImGuiCol_ResizeGrip]             = ImVec4(1.00f, 1.00f, 1.00f, 0.16f);\n    colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.78f, 0.82f, 1.00f, 0.60f);\n    colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.78f, 0.82f, 1.00f, 0.90f);\n    colors[ImGuiCol_CloseButton]            = ImVec4(0.50f, 0.50f, 0.90f, 0.50f);\n    colors[ImGuiCol_CloseButtonHovered]     = ImVec4(0.70f, 0.70f, 0.90f, 0.60f);\n    colors[ImGuiCol_CloseButtonActive]      = ImVec4(0.70f, 0.70f, 0.70f, 1.00f);\n    colors[ImGuiCol_PlotLines]              = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);\n    colors[ImGuiCol_PlotLinesHovered]       = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);\n    colors[ImGuiCol_PlotHistogram]          = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);\n    colors[ImGuiCol_PlotHistogramHovered]   = ImVec4(1.00f, 0.60f, 0.00f, 1.00f);\n    colors[ImGuiCol_TextSelectedBg]         = ImVec4(0.00f, 0.00f, 1.00f, 0.35f);\n    colors[ImGuiCol_ModalWindowDarkening]   = ImVec4(0.20f, 0.20f, 0.20f, 0.35f);\n}\n\nvoid ImGui::StyleColorsDark(ImGuiStyle* dst)\n{\n    ImGuiStyle* style = dst ? dst : &ImGui::GetStyle();\n    ImVec4* colors = style->Colors;\n\n    colors[ImGuiCol_Text]                   = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);\n    colors[ImGuiCol_TextDisabled]           = ImVec4(0.50f, 0.50f, 0.50f, 1.00f);\n    colors[ImGuiCol_WindowBg]               = ImVec4(0.06f, 0.06f, 0.06f, 0.94f);\n    colors[ImGuiCol_ChildBg]                = ImVec4(1.00f, 1.00f, 1.00f, 0.00f);\n    colors[ImGuiCol_PopupBg]                = ImVec4(0.08f, 0.08f, 0.08f, 0.94f);\n    colors[ImGuiCol_Border]                 = ImVec4(0.43f, 0.43f, 0.50f, 0.50f);\n    colors[ImGuiCol_BorderShadow]           = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);\n    colors[ImGuiCol_FrameBg]                = ImVec4(0.16f, 0.29f, 0.48f, 0.54f);\n    colors[ImGuiCol_FrameBgHovered]         = ImVec4(0.26f, 0.59f, 0.98f, 0.40f);\n    colors[ImGuiCol_FrameBgActive]          = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);\n    colors[ImGuiCol_TitleBg]                = ImVec4(0.04f, 0.04f, 0.04f, 1.00f);\n    colors[ImGuiCol_TitleBgActive]          = ImVec4(0.16f, 0.29f, 0.48f, 1.00f);\n    colors[ImGuiCol_TitleBgCollapsed]       = ImVec4(0.00f, 0.00f, 0.00f, 0.51f);\n    colors[ImGuiCol_MenuBarBg]              = ImVec4(0.14f, 0.14f, 0.14f, 1.00f);\n    colors[ImGuiCol_ScrollbarBg]            = ImVec4(0.02f, 0.02f, 0.02f, 0.53f);\n    colors[ImGuiCol_ScrollbarGrab]          = ImVec4(0.31f, 0.31f, 0.31f, 1.00f);\n    colors[ImGuiCol_ScrollbarGrabHovered]   = ImVec4(0.41f, 0.41f, 0.41f, 1.00f);\n    colors[ImGuiCol_ScrollbarGrabActive]    = ImVec4(0.51f, 0.51f, 0.51f, 1.00f);\n    colors[ImGuiCol_CheckMark]              = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_SliderGrab]             = ImVec4(0.24f, 0.52f, 0.88f, 1.00f);\n    colors[ImGuiCol_SliderGrabActive]       = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_Button]                 = ImVec4(0.26f, 0.59f, 0.98f, 0.40f);\n    colors[ImGuiCol_ButtonHovered]          = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_ButtonActive]           = ImVec4(0.06f, 0.53f, 0.98f, 1.00f);\n    colors[ImGuiCol_Header]                 = ImVec4(0.26f, 0.59f, 0.98f, 0.31f);\n    colors[ImGuiCol_HeaderHovered]          = ImVec4(0.26f, 0.59f, 0.98f, 0.80f);\n    colors[ImGuiCol_HeaderActive]           = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_Separator]              = colors[ImGuiCol_Border];//ImVec4(0.61f, 0.61f, 0.61f, 1.00f);\n    colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.26f, 0.59f, 0.98f, 0.78f);\n    colors[ImGuiCol_SeparatorActive]        = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_ResizeGrip]             = ImVec4(0.26f, 0.59f, 0.98f, 0.25f);\n    colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);\n    colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);\n    colors[ImGuiCol_CloseButton]            = ImVec4(0.41f, 0.41f, 0.41f, 0.50f);\n    colors[ImGuiCol_CloseButtonHovered]     = ImVec4(0.98f, 0.39f, 0.36f, 1.00f);\n    colors[ImGuiCol_CloseButtonActive]      = ImVec4(0.98f, 0.39f, 0.36f, 1.00f);\n    colors[ImGuiCol_PlotLines]              = ImVec4(0.61f, 0.61f, 0.61f, 1.00f);\n    colors[ImGuiCol_PlotLinesHovered]       = ImVec4(1.00f, 0.43f, 0.35f, 1.00f);\n    colors[ImGuiCol_PlotHistogram]          = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);\n    colors[ImGuiCol_PlotHistogramHovered]   = ImVec4(1.00f, 0.60f, 0.00f, 1.00f);\n    colors[ImGuiCol_TextSelectedBg]         = ImVec4(0.26f, 0.59f, 0.98f, 0.35f);\n    colors[ImGuiCol_ModalWindowDarkening]   = ImVec4(0.80f, 0.80f, 0.80f, 0.35f);\n}\n\nvoid ImGui::StyleColorsLight(ImGuiStyle* dst)\n{\n    ImGuiStyle* style = dst ? dst : &ImGui::GetStyle();\n    ImVec4* colors = style->Colors;\n\n    colors[ImGuiCol_Text]                   = ImVec4(0.00f, 0.00f, 0.00f, 1.00f);\n    colors[ImGuiCol_TextDisabled]           = ImVec4(0.60f, 0.60f, 0.60f, 1.00f);\n    //colors[ImGuiCol_TextHovered]          = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);\n    //colors[ImGuiCol_TextActive]           = ImVec4(1.00f, 1.00f, 0.00f, 1.00f);\n    colors[ImGuiCol_WindowBg]               = ImVec4(0.94f, 0.94f, 0.94f, 1.00f);\n    colors[ImGuiCol_ChildBg]                = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);\n    colors[ImGuiCol_PopupBg]                = ImVec4(1.00f, 1.00f, 1.00f, 0.94f);\n    colors[ImGuiCol_Border]                 = ImVec4(0.00f, 0.00f, 0.00f, 0.30f);\n    colors[ImGuiCol_BorderShadow]           = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);\n    colors[ImGuiCol_FrameBg]                = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);\n    colors[ImGuiCol_FrameBgHovered]         = ImVec4(0.26f, 0.59f, 0.98f, 0.40f);\n    colors[ImGuiCol_FrameBgActive]          = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);\n    colors[ImGuiCol_TitleBg]                = ImVec4(0.96f, 0.96f, 0.96f, 1.00f);\n    colors[ImGuiCol_TitleBgActive]          = ImVec4(0.82f, 0.82f, 0.82f, 1.00f);\n    colors[ImGuiCol_TitleBgCollapsed]       = ImVec4(1.00f, 1.00f, 1.00f, 0.51f);\n    colors[ImGuiCol_MenuBarBg]              = ImVec4(0.86f, 0.86f, 0.86f, 1.00f);\n    colors[ImGuiCol_ScrollbarBg]            = ImVec4(0.98f, 0.98f, 0.98f, 0.53f);\n    colors[ImGuiCol_ScrollbarGrab]          = ImVec4(0.69f, 0.69f, 0.69f, 0.80f);\n    colors[ImGuiCol_ScrollbarGrabHovered]   = ImVec4(0.49f, 0.49f, 0.49f, 0.80f);\n    colors[ImGuiCol_ScrollbarGrabActive]    = ImVec4(0.49f, 0.49f, 0.49f, 1.00f);\n    colors[ImGuiCol_CheckMark]              = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_SliderGrab]             = ImVec4(0.26f, 0.59f, 0.98f, 0.78f);\n    colors[ImGuiCol_SliderGrabActive]       = ImVec4(0.46f, 0.54f, 0.80f, 0.60f);\n    colors[ImGuiCol_Button]                 = ImVec4(0.26f, 0.59f, 0.98f, 0.40f);\n    colors[ImGuiCol_ButtonHovered]          = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_ButtonActive]           = ImVec4(0.06f, 0.53f, 0.98f, 1.00f);\n    colors[ImGuiCol_Header]                 = ImVec4(0.26f, 0.59f, 0.98f, 0.31f);\n    colors[ImGuiCol_HeaderHovered]          = ImVec4(0.26f, 0.59f, 0.98f, 0.80f);\n    colors[ImGuiCol_HeaderActive]           = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_Separator]              = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);\n    colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.26f, 0.59f, 0.98f, 0.78f);\n    colors[ImGuiCol_SeparatorActive]        = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);\n    colors[ImGuiCol_ResizeGrip]             = ImVec4(0.80f, 0.80f, 0.80f, 0.56f);\n    colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);\n    colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);\n    colors[ImGuiCol_CloseButton]            = ImVec4(0.59f, 0.59f, 0.59f, 0.50f);\n    colors[ImGuiCol_CloseButtonHovered]     = ImVec4(0.98f, 0.39f, 0.36f, 1.00f);\n    colors[ImGuiCol_CloseButtonActive]      = ImVec4(0.98f, 0.39f, 0.36f, 1.00f);\n    colors[ImGuiCol_PlotLines]              = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);\n    colors[ImGuiCol_PlotLinesHovered]       = ImVec4(1.00f, 0.43f, 0.35f, 1.00f);\n    colors[ImGuiCol_PlotHistogram]          = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);\n    colors[ImGuiCol_PlotHistogramHovered]   = ImVec4(1.00f, 0.45f, 0.00f, 1.00f);\n    colors[ImGuiCol_TextSelectedBg]         = ImVec4(0.26f, 0.59f, 0.98f, 0.35f);\n    colors[ImGuiCol_ModalWindowDarkening]   = ImVec4(0.20f, 0.20f, 0.20f, 0.35f);\n}\n\n\n//-----------------------------------------------------------------------------\n// ImDrawList\n//-----------------------------------------------------------------------------\n\nstatic const ImVec4 GNullClipRect(-8192.0f, -8192.0f, +8192.0f, +8192.0f); // Large values that are easy to encode in a few bits+shift\n\nvoid ImDrawList::Clear()\n{\n    CmdBuffer.resize(0);\n    IdxBuffer.resize(0);\n    VtxBuffer.resize(0);\n    _VtxCurrentIdx = 0;\n    _VtxWritePtr = NULL;\n    _IdxWritePtr = NULL;\n    _ClipRectStack.resize(0);\n    _TextureIdStack.resize(0);\n    _Path.resize(0);\n    _ChannelsCurrent = 0;\n    _ChannelsCount = 1;\n    // NB: Do not clear channels so our allocations are re-used after the first frame.\n}\n\nvoid ImDrawList::ClearFreeMemory()\n{\n    CmdBuffer.clear();\n    IdxBuffer.clear();\n    VtxBuffer.clear();\n    _VtxCurrentIdx = 0;\n    _VtxWritePtr = NULL;\n    _IdxWritePtr = NULL;\n    _ClipRectStack.clear();\n    _TextureIdStack.clear();\n    _Path.clear();\n    _ChannelsCurrent = 0;\n    _ChannelsCount = 1;\n    for (int i = 0; i < _Channels.Size; i++)\n    {\n        if (i == 0) memset(&_Channels[0], 0, sizeof(_Channels[0]));  // channel 0 is a copy of CmdBuffer/IdxBuffer, don't destruct again\n        _Channels[i].CmdBuffer.clear();\n        _Channels[i].IdxBuffer.clear();\n    }\n    _Channels.clear();\n}\n\n// Using macros because C++ is a terrible language, we want guaranteed inline, no code in header, and no overhead in Debug builds\n#define GetCurrentClipRect()    (_ClipRectStack.Size ? _ClipRectStack.Data[_ClipRectStack.Size-1]  : GNullClipRect)\n#define GetCurrentTextureId()   (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : NULL)\n\nvoid ImDrawList::AddDrawCmd()\n{\n    ImDrawCmd draw_cmd;\n    draw_cmd.ClipRect = GetCurrentClipRect();\n    draw_cmd.TextureId = GetCurrentTextureId();\n\n    IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w);\n    CmdBuffer.push_back(draw_cmd);\n}\n\nvoid ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data)\n{\n    ImDrawCmd* current_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL;\n    if (!current_cmd || current_cmd->ElemCount != 0 || current_cmd->UserCallback != NULL)\n    {\n        AddDrawCmd();\n        current_cmd = &CmdBuffer.back();\n    }\n    current_cmd->UserCallback = callback;\n    current_cmd->UserCallbackData = callback_data;\n\n    AddDrawCmd(); // Force a new command after us (see comment below)\n}\n\n// Our scheme may appears a bit unusual, basically we want the most-common calls AddLine AddRect etc. to not have to perform any check so we always have a command ready in the stack.\n// The cost of figuring out if a new command has to be added or if we can merge is paid in those Update** functions only.\nvoid ImDrawList::UpdateClipRect()\n{\n    // If current command is used with different settings we need to add a new command\n    const ImVec4 curr_clip_rect = GetCurrentClipRect();\n    ImDrawCmd* curr_cmd = CmdBuffer.Size > 0 ? &CmdBuffer.Data[CmdBuffer.Size-1] : NULL;\n    if (!curr_cmd || (curr_cmd->ElemCount != 0 && memcmp(&curr_cmd->ClipRect, &curr_clip_rect, sizeof(ImVec4)) != 0) || curr_cmd->UserCallback != NULL)\n    {\n        AddDrawCmd();\n        return;\n    }\n\n    // Try to merge with previous command if it matches, else use current command\n    ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 : NULL;\n    if (curr_cmd->ElemCount == 0 && prev_cmd && memcmp(&prev_cmd->ClipRect, &curr_clip_rect, sizeof(ImVec4)) == 0 && prev_cmd->TextureId == GetCurrentTextureId() && prev_cmd->UserCallback == NULL)\n        CmdBuffer.pop_back();\n    else\n        curr_cmd->ClipRect = curr_clip_rect;\n}\n\nvoid ImDrawList::UpdateTextureID()\n{\n    // If current command is used with different settings we need to add a new command\n    const ImTextureID curr_texture_id = GetCurrentTextureId();\n    ImDrawCmd* curr_cmd = CmdBuffer.Size ? &CmdBuffer.back() : NULL;\n    if (!curr_cmd || (curr_cmd->ElemCount != 0 && curr_cmd->TextureId != curr_texture_id) || curr_cmd->UserCallback != NULL)\n    {\n        AddDrawCmd();\n        return;\n    }\n\n    // Try to merge with previous command if it matches, else use current command\n    ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 : NULL;\n    if (curr_cmd->ElemCount == 0 && prev_cmd && prev_cmd->TextureId == curr_texture_id && memcmp(&prev_cmd->ClipRect, &GetCurrentClipRect(), sizeof(ImVec4)) == 0 && prev_cmd->UserCallback == NULL)\n        CmdBuffer.pop_back();\n    else\n        curr_cmd->TextureId = curr_texture_id;\n}\n\n#undef GetCurrentClipRect\n#undef GetCurrentTextureId\n\n// Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)\nvoid ImDrawList::PushClipRect(ImVec2 cr_min, ImVec2 cr_max, bool intersect_with_current_clip_rect)\n{\n    ImVec4 cr(cr_min.x, cr_min.y, cr_max.x, cr_max.y);\n    if (intersect_with_current_clip_rect && _ClipRectStack.Size)\n    {\n        ImVec4 current = _ClipRectStack.Data[_ClipRectStack.Size-1];\n        if (cr.x < current.x) cr.x = current.x;\n        if (cr.y < current.y) cr.y = current.y;\n        if (cr.z > current.z) cr.z = current.z;\n        if (cr.w > current.w) cr.w = current.w;\n    }\n    cr.z = ImMax(cr.x, cr.z);\n    cr.w = ImMax(cr.y, cr.w);\n\n    _ClipRectStack.push_back(cr);\n    UpdateClipRect();\n}\n\nvoid ImDrawList::PushClipRectFullScreen()\n{\n    PushClipRect(ImVec2(GNullClipRect.x, GNullClipRect.y), ImVec2(GNullClipRect.z, GNullClipRect.w));\n    //PushClipRect(GetVisibleRect());   // FIXME-OPT: This would be more correct but we're not supposed to access ImGuiContext from here?\n}\n\nvoid ImDrawList::PopClipRect()\n{\n    IM_ASSERT(_ClipRectStack.Size > 0);\n    _ClipRectStack.pop_back();\n    UpdateClipRect();\n}\n\nvoid ImDrawList::PushTextureID(const ImTextureID& texture_id)\n{\n    _TextureIdStack.push_back(texture_id);\n    UpdateTextureID();\n}\n\nvoid ImDrawList::PopTextureID()\n{\n    IM_ASSERT(_TextureIdStack.Size > 0);\n    _TextureIdStack.pop_back();\n    UpdateTextureID();\n}\n\nvoid ImDrawList::ChannelsSplit(int channels_count)\n{\n    IM_ASSERT(_ChannelsCurrent == 0 && _ChannelsCount == 1);\n    int old_channels_count = _Channels.Size;\n    if (old_channels_count < channels_count)\n        _Channels.resize(channels_count);\n    _ChannelsCount = channels_count;\n\n    // _Channels[] (24/32 bytes each) hold storage that we'll swap with this->_CmdBuffer/_IdxBuffer\n    // The content of _Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to.\n    // When we switch to the next channel, we'll copy _CmdBuffer/_IdxBuffer into _Channels[0] and then _Channels[1] into _CmdBuffer/_IdxBuffer\n    memset(&_Channels[0], 0, sizeof(ImDrawChannel));\n    for (int i = 1; i < channels_count; i++)\n    {\n        if (i >= old_channels_count)\n        {\n            IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel();\n        }\n        else\n        {\n            _Channels[i].CmdBuffer.resize(0);\n            _Channels[i].IdxBuffer.resize(0);\n        }\n        if (_Channels[i].CmdBuffer.Size == 0)\n        {\n            ImDrawCmd draw_cmd;\n            draw_cmd.ClipRect = _ClipRectStack.back();\n            draw_cmd.TextureId = _TextureIdStack.back();\n            _Channels[i].CmdBuffer.push_back(draw_cmd);\n        }\n    }\n}\n\nvoid ImDrawList::ChannelsMerge()\n{\n    // Note that we never use or rely on channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use.\n    if (_ChannelsCount <= 1)\n        return;\n\n    ChannelsSetCurrent(0);\n    if (CmdBuffer.Size && CmdBuffer.back().ElemCount == 0)\n        CmdBuffer.pop_back();\n\n    int new_cmd_buffer_count = 0, new_idx_buffer_count = 0;\n    for (int i = 1; i < _ChannelsCount; i++)\n    {\n        ImDrawChannel& ch = _Channels[i];\n        if (ch.CmdBuffer.Size && ch.CmdBuffer.back().ElemCount == 0)\n            ch.CmdBuffer.pop_back();\n        new_cmd_buffer_count += ch.CmdBuffer.Size;\n        new_idx_buffer_count += ch.IdxBuffer.Size;\n    }\n    CmdBuffer.resize(CmdBuffer.Size + new_cmd_buffer_count);\n    IdxBuffer.resize(IdxBuffer.Size + new_idx_buffer_count);\n\n    ImDrawCmd* cmd_write = CmdBuffer.Data + CmdBuffer.Size - new_cmd_buffer_count;\n    _IdxWritePtr = IdxBuffer.Data + IdxBuffer.Size - new_idx_buffer_count;\n    for (int i = 1; i < _ChannelsCount; i++)\n    {\n        ImDrawChannel& ch = _Channels[i];\n        if (int sz = ch.CmdBuffer.Size) { memcpy(cmd_write, ch.CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; }\n        if (int sz = ch.IdxBuffer.Size) { memcpy(_IdxWritePtr, ch.IdxBuffer.Data, sz * sizeof(ImDrawIdx)); _IdxWritePtr += sz; }\n    }\n    UpdateClipRect(); // We call this instead of AddDrawCmd(), so that empty channels won't produce an extra draw call.\n    _ChannelsCount = 1;\n}\n\nvoid ImDrawList::ChannelsSetCurrent(int idx)\n{\n    IM_ASSERT(idx < _ChannelsCount);\n    if (_ChannelsCurrent == idx) return;\n    memcpy(&_Channels.Data[_ChannelsCurrent].CmdBuffer, &CmdBuffer, sizeof(CmdBuffer)); // copy 12 bytes, four times\n    memcpy(&_Channels.Data[_ChannelsCurrent].IdxBuffer, &IdxBuffer, sizeof(IdxBuffer));\n    _ChannelsCurrent = idx;\n    memcpy(&CmdBuffer, &_Channels.Data[_ChannelsCurrent].CmdBuffer, sizeof(CmdBuffer));\n    memcpy(&IdxBuffer, &_Channels.Data[_ChannelsCurrent].IdxBuffer, sizeof(IdxBuffer));\n    _IdxWritePtr = IdxBuffer.Data + IdxBuffer.Size;\n}\n\n// NB: this can be called with negative count for removing primitives (as long as the result does not underflow)\nvoid ImDrawList::PrimReserve(int idx_count, int vtx_count)\n{\n    ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size-1];\n    draw_cmd.ElemCount += idx_count;\n\n    int vtx_buffer_old_size = VtxBuffer.Size;\n    VtxBuffer.resize(vtx_buffer_old_size + vtx_count);\n    _VtxWritePtr = VtxBuffer.Data + vtx_buffer_old_size;\n\n    int idx_buffer_old_size = IdxBuffer.Size;\n    IdxBuffer.resize(idx_buffer_old_size + idx_count);\n    _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size;\n}\n\n// Fully unrolled with inline call to keep our debug builds decently fast.\nvoid ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col)\n{\n    ImVec2 b(c.x, a.y), d(a.x, c.y), uv(GImGui->FontTexUvWhitePixel);\n    ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx;\n    _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2);\n    _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3);\n    _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;\n    _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;\n    _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;\n    _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col;\n    _VtxWritePtr += 4;\n    _VtxCurrentIdx += 4;\n    _IdxWritePtr += 6;\n}\n\nvoid ImDrawList::PrimRectUV(const ImVec2& a, const ImVec2& c, const ImVec2& uv_a, const ImVec2& uv_c, ImU32 col)\n{\n    ImVec2 b(c.x, a.y), d(a.x, c.y), uv_b(uv_c.x, uv_a.y), uv_d(uv_a.x, uv_c.y);\n    ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx;\n    _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2);\n    _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3);\n    _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;\n    _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;\n    _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;\n    _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col;\n    _VtxWritePtr += 4;\n    _VtxCurrentIdx += 4;\n    _IdxWritePtr += 6;\n}\n\nvoid ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col)\n{\n    ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx;\n    _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2);\n    _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3);\n    _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;\n    _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;\n    _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;\n    _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col;\n    _VtxWritePtr += 4;\n    _VtxCurrentIdx += 4;\n    _IdxWritePtr += 6;\n}\n\n// TODO: Thickness anti-aliased lines cap are missing their AA fringe.\nvoid ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, bool closed, float thickness, bool anti_aliased)\n{\n    if (points_count < 2)\n        return;\n\n    const ImVec2 uv = GImGui->FontTexUvWhitePixel;\n    anti_aliased &= GImGui->Style.AntiAliasedLines;\n    //if (ImGui::GetIO().KeyCtrl) anti_aliased = false; // Debug\n\n    int count = points_count;\n    if (!closed)\n        count = points_count-1;\n\n    const bool thick_line = thickness > 1.0f;\n    if (anti_aliased)\n    {\n        // Anti-aliased stroke\n        const float AA_SIZE = 1.0f;\n        const ImU32 col_trans = col & ~IM_COL32_A_MASK;\n\n        const int idx_count = thick_line ? count*18 : count*12;\n        const int vtx_count = thick_line ? points_count*4 : points_count*3;\n        PrimReserve(idx_count, vtx_count);\n\n        // Temporary buffer\n        ImVec2* temp_normals = (ImVec2*)alloca(points_count * (thick_line ? 5 : 3) * sizeof(ImVec2));\n        ImVec2* temp_points = temp_normals + points_count;\n\n        for (int i1 = 0; i1 < count; i1++)\n        {\n            const int i2 = (i1+1) == points_count ? 0 : i1+1;\n            ImVec2 diff = points[i2] - points[i1];\n            diff *= ImInvLength(diff, 1.0f);\n            temp_normals[i1].x = diff.y;\n            temp_normals[i1].y = -diff.x;\n        }\n        if (!closed)\n            temp_normals[points_count-1] = temp_normals[points_count-2];\n\n        if (!thick_line)\n        {\n            if (!closed)\n            {\n                temp_points[0] = points[0] + temp_normals[0] * AA_SIZE;\n                temp_points[1] = points[0] - temp_normals[0] * AA_SIZE;\n                temp_points[(points_count-1)*2+0] = points[points_count-1] + temp_normals[points_count-1] * AA_SIZE;\n                temp_points[(points_count-1)*2+1] = points[points_count-1] - temp_normals[points_count-1] * AA_SIZE;\n            }\n\n            // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer.\n            unsigned int idx1 = _VtxCurrentIdx;\n            for (int i1 = 0; i1 < count; i1++)\n            {\n                const int i2 = (i1+1) == points_count ? 0 : i1+1;\n                unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+3;\n\n                // Average normals\n                ImVec2 dm = (temp_normals[i1] + temp_normals[i2]) * 0.5f;\n                float dmr2 = dm.x*dm.x + dm.y*dm.y;\n                if (dmr2 > 0.000001f)\n                {\n                    float scale = 1.0f / dmr2;\n                    if (scale > 100.0f) scale = 100.0f;\n                    dm *= scale;\n                }\n                dm *= AA_SIZE;\n                temp_points[i2*2+0] = points[i2] + dm;\n                temp_points[i2*2+1] = points[i2] - dm;\n\n                // Add indexes\n                _IdxWritePtr[0] = (ImDrawIdx)(idx2+0); _IdxWritePtr[1] = (ImDrawIdx)(idx1+0); _IdxWritePtr[2] = (ImDrawIdx)(idx1+2);\n                _IdxWritePtr[3] = (ImDrawIdx)(idx1+2); _IdxWritePtr[4] = (ImDrawIdx)(idx2+2); _IdxWritePtr[5] = (ImDrawIdx)(idx2+0);\n                _IdxWritePtr[6] = (ImDrawIdx)(idx2+1); _IdxWritePtr[7] = (ImDrawIdx)(idx1+1); _IdxWritePtr[8] = (ImDrawIdx)(idx1+0);\n                _IdxWritePtr[9] = (ImDrawIdx)(idx1+0); _IdxWritePtr[10]= (ImDrawIdx)(idx2+0); _IdxWritePtr[11]= (ImDrawIdx)(idx2+1);\n                _IdxWritePtr += 12;\n\n                idx1 = idx2;\n            }\n\n            // Add vertexes\n            for (int i = 0; i < points_count; i++)\n            {\n                _VtxWritePtr[0].pos = points[i];          _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;\n                _VtxWritePtr[1].pos = temp_points[i*2+0]; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans;\n                _VtxWritePtr[2].pos = temp_points[i*2+1]; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col_trans;\n                _VtxWritePtr += 3;\n            }\n        }\n        else\n        {\n            const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f;\n            if (!closed)\n            {\n                temp_points[0] = points[0] + temp_normals[0] * (half_inner_thickness + AA_SIZE);\n                temp_points[1] = points[0] + temp_normals[0] * (half_inner_thickness);\n                temp_points[2] = points[0] - temp_normals[0] * (half_inner_thickness);\n                temp_points[3] = points[0] - temp_normals[0] * (half_inner_thickness + AA_SIZE);\n                temp_points[(points_count-1)*4+0] = points[points_count-1] + temp_normals[points_count-1] * (half_inner_thickness + AA_SIZE);\n                temp_points[(points_count-1)*4+1] = points[points_count-1] + temp_normals[points_count-1] * (half_inner_thickness);\n                temp_points[(points_count-1)*4+2] = points[points_count-1] - temp_normals[points_count-1] * (half_inner_thickness);\n                temp_points[(points_count-1)*4+3] = points[points_count-1] - temp_normals[points_count-1] * (half_inner_thickness + AA_SIZE);\n            }\n\n            // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer.\n            unsigned int idx1 = _VtxCurrentIdx;\n            for (int i1 = 0; i1 < count; i1++)\n            {\n                const int i2 = (i1+1) == points_count ? 0 : i1+1;\n                unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+4;\n\n                // Average normals\n                ImVec2 dm = (temp_normals[i1] + temp_normals[i2]) * 0.5f;\n                float dmr2 = dm.x*dm.x + dm.y*dm.y;\n                if (dmr2 > 0.000001f)\n                {\n                    float scale = 1.0f / dmr2;\n                    if (scale > 100.0f) scale = 100.0f;\n                    dm *= scale;\n                }\n                ImVec2 dm_out = dm * (half_inner_thickness + AA_SIZE);\n                ImVec2 dm_in = dm * half_inner_thickness;\n                temp_points[i2*4+0] = points[i2] + dm_out;\n                temp_points[i2*4+1] = points[i2] + dm_in;\n                temp_points[i2*4+2] = points[i2] - dm_in;\n                temp_points[i2*4+3] = points[i2] - dm_out;\n\n                // Add indexes\n                _IdxWritePtr[0]  = (ImDrawIdx)(idx2+1); _IdxWritePtr[1]  = (ImDrawIdx)(idx1+1); _IdxWritePtr[2]  = (ImDrawIdx)(idx1+2);\n                _IdxWritePtr[3]  = (ImDrawIdx)(idx1+2); _IdxWritePtr[4]  = (ImDrawIdx)(idx2+2); _IdxWritePtr[5]  = (ImDrawIdx)(idx2+1);\n                _IdxWritePtr[6]  = (ImDrawIdx)(idx2+1); _IdxWritePtr[7]  = (ImDrawIdx)(idx1+1); _IdxWritePtr[8]  = (ImDrawIdx)(idx1+0);\n                _IdxWritePtr[9]  = (ImDrawIdx)(idx1+0); _IdxWritePtr[10] = (ImDrawIdx)(idx2+0); _IdxWritePtr[11] = (ImDrawIdx)(idx2+1);\n                _IdxWritePtr[12] = (ImDrawIdx)(idx2+2); _IdxWritePtr[13] = (ImDrawIdx)(idx1+2); _IdxWritePtr[14] = (ImDrawIdx)(idx1+3);\n                _IdxWritePtr[15] = (ImDrawIdx)(idx1+3); _IdxWritePtr[16] = (ImDrawIdx)(idx2+3); _IdxWritePtr[17] = (ImDrawIdx)(idx2+2);\n                _IdxWritePtr += 18;\n\n                idx1 = idx2;\n            }\n\n            // Add vertexes\n            for (int i = 0; i < points_count; i++)\n            {\n                _VtxWritePtr[0].pos = temp_points[i*4+0]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col_trans;\n                _VtxWritePtr[1].pos = temp_points[i*4+1]; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;\n                _VtxWritePtr[2].pos = temp_points[i*4+2]; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;\n                _VtxWritePtr[3].pos = temp_points[i*4+3]; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col_trans;\n                _VtxWritePtr += 4;\n            }\n        }\n        _VtxCurrentIdx += (ImDrawIdx)vtx_count;\n    }\n    else\n    {\n        // Non Anti-aliased Stroke\n        const int idx_count = count*6;\n        const int vtx_count = count*4;      // FIXME-OPT: Not sharing edges\n        PrimReserve(idx_count, vtx_count);\n\n        for (int i1 = 0; i1 < count; i1++)\n        {\n            const int i2 = (i1+1) == points_count ? 0 : i1+1;\n            const ImVec2& p1 = points[i1];\n            const ImVec2& p2 = points[i2];\n            ImVec2 diff = p2 - p1;\n            diff *= ImInvLength(diff, 1.0f);\n\n            const float dx = diff.x * (thickness * 0.5f);\n            const float dy = diff.y * (thickness * 0.5f);\n            _VtxWritePtr[0].pos.x = p1.x + dy; _VtxWritePtr[0].pos.y = p1.y - dx; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;\n            _VtxWritePtr[1].pos.x = p2.x + dy; _VtxWritePtr[1].pos.y = p2.y - dx; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;\n            _VtxWritePtr[2].pos.x = p2.x - dy; _VtxWritePtr[2].pos.y = p2.y + dx; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;\n            _VtxWritePtr[3].pos.x = p1.x - dy; _VtxWritePtr[3].pos.y = p1.y + dx; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col;\n            _VtxWritePtr += 4;\n\n            _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);\n            _IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);\n            _IdxWritePtr += 6;\n            _VtxCurrentIdx += 4;\n        }\n    }\n}\n\nvoid ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_count, ImU32 col, bool anti_aliased)\n{\n    const ImVec2 uv = GImGui->FontTexUvWhitePixel;\n    anti_aliased &= GImGui->Style.AntiAliasedShapes;\n    //if (ImGui::GetIO().KeyCtrl) anti_aliased = false; // Debug\n\n    if (anti_aliased)\n    {\n        // Anti-aliased Fill\n        const float AA_SIZE = 1.0f;\n        const ImU32 col_trans = col & ~IM_COL32_A_MASK;\n        const int idx_count = (points_count-2)*3 + points_count*6;\n        const int vtx_count = (points_count*2);\n        PrimReserve(idx_count, vtx_count);\n\n        // Add indexes for fill\n        unsigned int vtx_inner_idx = _VtxCurrentIdx;\n        unsigned int vtx_outer_idx = _VtxCurrentIdx+1;\n        for (int i = 2; i < points_count; i++)\n        {\n            _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx+((i-1)<<1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx+(i<<1));\n            _IdxWritePtr += 3;\n        }\n\n        // Compute normals\n        ImVec2* temp_normals = (ImVec2*)alloca(points_count * sizeof(ImVec2));\n        for (int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++)\n        {\n            const ImVec2& p0 = points[i0];\n            const ImVec2& p1 = points[i1];\n            ImVec2 diff = p1 - p0;\n            diff *= ImInvLength(diff, 1.0f);\n            temp_normals[i0].x = diff.y;\n            temp_normals[i0].y = -diff.x;\n        }\n\n        for (int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++)\n        {\n            // Average normals\n            const ImVec2& n0 = temp_normals[i0];\n            const ImVec2& n1 = temp_normals[i1];\n            ImVec2 dm = (n0 + n1) * 0.5f;\n            float dmr2 = dm.x*dm.x + dm.y*dm.y;\n            if (dmr2 > 0.000001f)\n            {\n                float scale = 1.0f / dmr2;\n                if (scale > 100.0f) scale = 100.0f;\n                dm *= scale;\n            }\n            dm *= AA_SIZE * 0.5f;\n\n            // Add vertices\n            _VtxWritePtr[0].pos = (points[i1] - dm); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;        // Inner\n            _VtxWritePtr[1].pos = (points[i1] + dm); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans;  // Outer\n            _VtxWritePtr += 2;\n\n            // Add indexes for fringes\n            _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx+(i1<<1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx+(i0<<1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx+(i0<<1));\n            _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx+(i0<<1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx+(i1<<1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx+(i1<<1));\n            _IdxWritePtr += 6;\n        }\n        _VtxCurrentIdx += (ImDrawIdx)vtx_count;\n    }\n    else\n    {\n        // Non Anti-aliased Fill\n        const int idx_count = (points_count-2)*3;\n        const int vtx_count = points_count;\n        PrimReserve(idx_count, vtx_count);\n        for (int i = 0; i < vtx_count; i++)\n        {\n            _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;\n            _VtxWritePtr++;\n        }\n        for (int i = 2; i < points_count; i++)\n        {\n            _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+i-1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+i);\n            _IdxWritePtr += 3;\n        }\n        _VtxCurrentIdx += (ImDrawIdx)vtx_count;\n    }\n}\n\nvoid ImDrawList::PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12)\n{\n    static ImVec2 circle_vtx[12];\n    static bool circle_vtx_builds = false;\n    const int circle_vtx_count = IM_ARRAYSIZE(circle_vtx);\n    if (!circle_vtx_builds)\n    {\n        for (int i = 0; i < circle_vtx_count; i++)\n        {\n            const float a = ((float)i / (float)circle_vtx_count) * 2*IM_PI;\n            circle_vtx[i].x = cosf(a);\n            circle_vtx[i].y = sinf(a);\n        }\n        circle_vtx_builds = true;\n    }\n\n    if (radius == 0.0f || a_min_of_12 > a_max_of_12)\n    {\n        _Path.push_back(centre);\n        return;\n    }\n    _Path.reserve(_Path.Size + (a_max_of_12 - a_min_of_12 + 1));\n    for (int a = a_min_of_12; a <= a_max_of_12; a++)\n    {\n        const ImVec2& c = circle_vtx[a % circle_vtx_count];\n        _Path.push_back(ImVec2(centre.x + c.x * radius, centre.y + c.y * radius));\n    }\n}\n\nvoid ImDrawList::PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments)\n{\n    if (radius == 0.0f)\n    {\n        _Path.push_back(centre);\n        return;\n    }\n    _Path.reserve(_Path.Size + (num_segments + 1));\n    for (int i = 0; i <= num_segments; i++)\n    {\n        const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min);\n        _Path.push_back(ImVec2(centre.x + cosf(a) * radius, centre.y + sinf(a) * radius));\n    }\n}\n\nstatic void PathBezierToCasteljau(ImVector<ImVec2>* path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level)\n{\n    float dx = x4 - x1;\n    float dy = y4 - y1;\n    float d2 = ((x2 - x4) * dy - (y2 - y4) * dx);\n    float d3 = ((x3 - x4) * dy - (y3 - y4) * dx);\n    d2 = (d2 >= 0) ? d2 : -d2;\n    d3 = (d3 >= 0) ? d3 : -d3;\n    if ((d2+d3) * (d2+d3) < tess_tol * (dx*dx + dy*dy))\n    {\n        path->push_back(ImVec2(x4, y4));\n    }\n    else if (level < 10)\n    {\n        float x12 = (x1+x2)*0.5f,       y12 = (y1+y2)*0.5f;\n        float x23 = (x2+x3)*0.5f,       y23 = (y2+y3)*0.5f;\n        float x34 = (x3+x4)*0.5f,       y34 = (y3+y4)*0.5f;\n        float x123 = (x12+x23)*0.5f,    y123 = (y12+y23)*0.5f;\n        float x234 = (x23+x34)*0.5f,    y234 = (y23+y34)*0.5f;\n        float x1234 = (x123+x234)*0.5f, y1234 = (y123+y234)*0.5f;\n\n        PathBezierToCasteljau(path, x1,y1,        x12,y12,    x123,y123,  x1234,y1234, tess_tol, level+1);\n        PathBezierToCasteljau(path, x1234,y1234,  x234,y234,  x34,y34,    x4,y4,       tess_tol, level+1);\n    }\n}\n\nvoid ImDrawList::PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments)\n{\n    ImVec2 p1 = _Path.back();\n    if (num_segments == 0)\n    {\n        // Auto-tessellated\n        PathBezierToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, GImGui->Style.CurveTessellationTol, 0);\n    }\n    else\n    {\n        float t_step = 1.0f / (float)num_segments;\n        for (int i_step = 1; i_step <= num_segments; i_step++)\n        {\n            float t = t_step * i_step;\n            float u = 1.0f - t;\n            float w1 = u*u*u;\n            float w2 = 3*u*u*t;\n            float w3 = 3*u*t*t;\n            float w4 = t*t*t;\n            _Path.push_back(ImVec2(w1*p1.x + w2*p2.x + w3*p3.x + w4*p4.x, w1*p1.y + w2*p2.y + w3*p3.y + w4*p4.y));\n        }\n    }\n}\n\nvoid ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int rounding_corners)\n{\n    rounding = ImMin(rounding, fabsf(b.x - a.x) * ( ((rounding_corners & ImDrawCornerFlags_Top)  == ImDrawCornerFlags_Top)  || ((rounding_corners & ImDrawCornerFlags_Bot)   == ImDrawCornerFlags_Bot)   ? 0.5f : 1.0f ) - 1.0f);\n    rounding = ImMin(rounding, fabsf(b.y - a.y) * ( ((rounding_corners & ImDrawCornerFlags_Left) == ImDrawCornerFlags_Left) || ((rounding_corners & ImDrawCornerFlags_Right) == ImDrawCornerFlags_Right) ? 0.5f : 1.0f ) - 1.0f);\n\n    if (rounding <= 0.0f || rounding_corners == 0)\n    {\n        PathLineTo(a);\n        PathLineTo(ImVec2(b.x, a.y));\n        PathLineTo(b);\n        PathLineTo(ImVec2(a.x, b.y));\n    }\n    else\n    {\n        const float rounding_tl = (rounding_corners & ImDrawCornerFlags_TopLeft) ? rounding : 0.0f;\n        const float rounding_tr = (rounding_corners & ImDrawCornerFlags_TopRight) ? rounding : 0.0f;\n        const float rounding_br = (rounding_corners & ImDrawCornerFlags_BotRight) ? rounding : 0.0f;\n        const float rounding_bl = (rounding_corners & ImDrawCornerFlags_BotLeft) ? rounding : 0.0f;\n        PathArcToFast(ImVec2(a.x + rounding_tl, a.y + rounding_tl), rounding_tl, 6, 9);\n        PathArcToFast(ImVec2(b.x - rounding_tr, a.y + rounding_tr), rounding_tr, 9, 12);\n        PathArcToFast(ImVec2(b.x - rounding_br, b.y - rounding_br), rounding_br, 0, 3);\n        PathArcToFast(ImVec2(a.x + rounding_bl, b.y - rounding_bl), rounding_bl, 3, 6);\n    }\n}\n\nvoid ImDrawList::AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n    PathLineTo(a + ImVec2(0.5f,0.5f));\n    PathLineTo(b + ImVec2(0.5f,0.5f));\n    PathStroke(col, false, thickness);\n}\n\n// a: upper-left, b: lower-right. we don't render 1 px sized rectangles properly.\nvoid ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags, float thickness)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n    PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.5f,0.5f), rounding, rounding_corners_flags);\n    PathStroke(col, true, thickness);\n}\n\nvoid ImDrawList::AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n    if (rounding > 0.0f)\n    {\n        PathRect(a, b, rounding, rounding_corners_flags);\n        PathFillConvex(col);\n    }\n    else\n    {\n        PrimReserve(6, 4);\n        PrimRect(a, b, col);\n    }\n}\n\nvoid ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left)\n{\n    if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0)\n        return;\n\n    const ImVec2 uv = GImGui->FontTexUvWhitePixel;\n    PrimReserve(6, 4);\n    PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2));\n    PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+3));\n    PrimWriteVtx(a, uv, col_upr_left);\n    PrimWriteVtx(ImVec2(c.x, a.y), uv, col_upr_right);\n    PrimWriteVtx(c, uv, col_bot_right);\n    PrimWriteVtx(ImVec2(a.x, c.y), uv, col_bot_left);\n}\n\nvoid ImDrawList::AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    PathLineTo(a);\n    PathLineTo(b);\n    PathLineTo(c);\n    PathLineTo(d);\n    PathStroke(col, true, thickness);\n}\n\nvoid ImDrawList::AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    PathLineTo(a);\n    PathLineTo(b);\n    PathLineTo(c);\n    PathLineTo(d);\n    PathFillConvex(col);\n}\n\nvoid ImDrawList::AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    PathLineTo(a);\n    PathLineTo(b);\n    PathLineTo(c);\n    PathStroke(col, true, thickness);\n}\n\nvoid ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    PathLineTo(a);\n    PathLineTo(b);\n    PathLineTo(c);\n    PathFillConvex(col);\n}\n\nvoid ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments, float thickness)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;\n    PathArcTo(centre, radius-0.5f, 0.0f, a_max, num_segments);\n    PathStroke(col, true, thickness);\n}\n\nvoid ImDrawList::AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;\n    PathArcTo(centre, radius, 0.0f, a_max, num_segments);\n    PathFillConvex(col);\n}\n\nvoid ImDrawList::AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    PathLineTo(pos0);\n    PathBezierCurveTo(cp0, cp1, pos1, num_segments);\n    PathStroke(col, false, thickness);\n}\n\nvoid ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    if (text_end == NULL)\n        text_end = text_begin + strlen(text_begin);\n    if (text_begin == text_end)\n        return;\n\n    // IMPORTANT: This is one of the few instance of breaking the encapsulation of ImDrawList, as we pull this from ImGui state, but it is just SO useful.\n    // Might just move Font/FontSize to ImDrawList?\n    if (font == NULL)\n        font = GImGui->Font;\n    if (font_size == 0.0f)\n        font_size = GImGui->FontSize;\n\n    IM_ASSERT(font->ContainerAtlas->TexID == _TextureIdStack.back());  // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font.\n\n    ImVec4 clip_rect = _ClipRectStack.back();\n    if (cpu_fine_clip_rect)\n    {\n        clip_rect.x = ImMax(clip_rect.x, cpu_fine_clip_rect->x);\n        clip_rect.y = ImMax(clip_rect.y, cpu_fine_clip_rect->y);\n        clip_rect.z = ImMin(clip_rect.z, cpu_fine_clip_rect->z);\n        clip_rect.w = ImMin(clip_rect.w, cpu_fine_clip_rect->w);\n    }\n    font->RenderText(this, font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect != NULL);\n}\n\nvoid ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end)\n{\n    AddText(NULL, 0.0f, pos, col, text_begin, text_end);\n}\n\nvoid ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back();\n    if (push_texture_id)\n        PushTextureID(user_texture_id);\n\n    PrimReserve(6, 4);\n    PrimRectUV(a, b, uv_a, uv_b, col);\n\n    if (push_texture_id)\n        PopTextureID();\n}\n\nvoid ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back();\n    if (push_texture_id)\n        PushTextureID(user_texture_id);\n\n    PrimReserve(6, 4);\n    PrimQuadUV(a, b, c, d, uv_a, uv_b, uv_c, uv_d, col);\n\n    if (push_texture_id)\n        PopTextureID();\n}\n\nvoid ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners)\n{\n    if ((col & IM_COL32_A_MASK) == 0)\n        return;\n\n    if (rounding <= 0.0f || (rounding_corners & ImDrawCornerFlags_All) == 0)\n    {\n        AddImage(user_texture_id, a, b, uv_a, uv_b, col);\n        return;\n    }\n\n    const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back();\n    if (push_texture_id)\n        PushTextureID(user_texture_id);\n\n    int vert_start_idx = VtxBuffer.Size;\n    PathRect(a, b, rounding, rounding_corners);\n    PathFillConvex(col);\n    int vert_end_idx = VtxBuffer.Size;\n    ImGui::ShadeVertsLinearUV(VtxBuffer.Data + vert_start_idx, VtxBuffer.Data + vert_end_idx, a, b, uv_a, uv_b, true);\n\n    if (push_texture_id)\n        PopTextureID();\n}\n\n//-----------------------------------------------------------------------------\n// ImDrawData\n//-----------------------------------------------------------------------------\n\n// For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!\nvoid ImDrawData::DeIndexAllBuffers()\n{\n    ImVector<ImDrawVert> new_vtx_buffer;\n    TotalVtxCount = TotalIdxCount = 0;\n    for (int i = 0; i < CmdListsCount; i++)\n    {\n        ImDrawList* cmd_list = CmdLists[i];\n        if (cmd_list->IdxBuffer.empty())\n            continue;\n        new_vtx_buffer.resize(cmd_list->IdxBuffer.Size);\n        for (int j = 0; j < cmd_list->IdxBuffer.Size; j++)\n            new_vtx_buffer[j] = cmd_list->VtxBuffer[cmd_list->IdxBuffer[j]];\n        cmd_list->VtxBuffer.swap(new_vtx_buffer);\n        cmd_list->IdxBuffer.resize(0);\n        TotalVtxCount += cmd_list->VtxBuffer.Size;\n    }\n}\n\n// Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.\nvoid ImDrawData::ScaleClipRects(const ImVec2& scale)\n{\n    for (int i = 0; i < CmdListsCount; i++)\n    {\n        ImDrawList* cmd_list = CmdLists[i];\n        for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)\n        {\n            ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i];\n            cmd->ClipRect = ImVec4(cmd->ClipRect.x * scale.x, cmd->ClipRect.y * scale.y, cmd->ClipRect.z * scale.x, cmd->ClipRect.w * scale.y);\n        }\n    }\n}\n\n//-----------------------------------------------------------------------------\n// Shade functions\n//-----------------------------------------------------------------------------\n\n// Generic linear color gradient, write to RGB fields, leave A untouched.\nvoid ImGui::ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1)\n{\n    ImVec2 gradient_extent = gradient_p1 - gradient_p0;\n    float gradient_inv_length2 = 1.0f / ImLengthSqr(gradient_extent);\n    for (ImDrawVert* vert = vert_start; vert < vert_end; vert++)\n    {\n        float d = ImDot(vert->pos - gradient_p0, gradient_extent);\n        float t = ImClamp(d * gradient_inv_length2, 0.0f, 1.0f);\n        int r = ImLerp((int)(col0 >> IM_COL32_R_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_R_SHIFT) & 0xFF, t);\n        int g = ImLerp((int)(col0 >> IM_COL32_G_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_G_SHIFT) & 0xFF, t);\n        int b = ImLerp((int)(col0 >> IM_COL32_B_SHIFT) & 0xFF, (int)(col1 >> IM_COL32_B_SHIFT) & 0xFF, t);\n        vert->col = (r << IM_COL32_R_SHIFT) | (g << IM_COL32_G_SHIFT) | (b << IM_COL32_B_SHIFT) | (vert->col & IM_COL32_A_MASK);\n    }\n}\n\n// Scan and shade backward from the end of given vertices. Assume vertices are text only (= vert_start..vert_end going left to right) so we can break as soon as we are out the gradient bounds.\nvoid ImGui::ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x)\n{\n    float gradient_extent_x = gradient_p1_x - gradient_p0_x;\n    float gradient_inv_length2 = 1.0f / (gradient_extent_x * gradient_extent_x);\n    int full_alpha_count = 0;\n    for (ImDrawVert* vert = vert_end - 1; vert >= vert_start; vert--)\n    {\n        float d = (vert->pos.x - gradient_p0_x) * (gradient_extent_x);\n        float alpha_mul = 1.0f - ImClamp(d * gradient_inv_length2, 0.0f, 1.0f);\n        if (alpha_mul >= 1.0f && ++full_alpha_count > 2)\n            return; // Early out\n        int a = (int)(((vert->col >> IM_COL32_A_SHIFT) & 0xFF) * alpha_mul);\n        vert->col = (vert->col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT);\n    }\n}\n\n// Distribute UV over (a, b) rectangle\nvoid ImGui::ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp)\n{\n    const ImVec2 size = b - a;\n    const ImVec2 uv_size = uv_b - uv_a;\n    const ImVec2 scale = ImVec2(\n        size.x ? (uv_size.x / size.x) : 0.0f,\n        size.y ? (uv_size.y / size.y) : 0.0f);\n\n    if (clamp)\n    {\n        const ImVec2 min = ImMin(uv_a, uv_b);\n        const ImVec2 max = ImMax(uv_a, uv_b);\n\n        for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex)\n            vertex->uv = ImClamp(uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale), min, max);\n    }\n    else\n    {\n        for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex)\n            vertex->uv = uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale);\n    }\n}\n\n//-----------------------------------------------------------------------------\n// ImFontConfig\n//-----------------------------------------------------------------------------\n\nImFontConfig::ImFontConfig()\n{\n    FontData = NULL;\n    FontDataSize = 0;\n    FontDataOwnedByAtlas = true;\n    FontNo = 0;\n    SizePixels = 0.0f;\n    OversampleH = 3;\n    OversampleV = 1;\n    PixelSnapH = false;\n    GlyphExtraSpacing = ImVec2(0.0f, 0.0f);\n    GlyphOffset = ImVec2(0.0f, 0.0f);\n    GlyphRanges = NULL;\n    MergeMode = false;\n    RasterizerFlags = 0x00;\n    RasterizerMultiply = 1.0f;\n    memset(Name, 0, sizeof(Name));\n    DstFont = NULL;\n}\n\n//-----------------------------------------------------------------------------\n// ImFontAtlas\n//-----------------------------------------------------------------------------\n\n// A work of art lies ahead! (. = white layer, X = black layer, others are blank)\n// The white texels on the top left are the ones we'll use everywhere in ImGui to render filled shapes.\nconst int FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF = 90;\nconst int FONT_ATLAS_DEFAULT_TEX_DATA_H      = 27;\nconst unsigned int FONT_ATLAS_DEFAULT_TEX_DATA_ID = 0x80000000;\nstatic const char FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF * FONT_ATLAS_DEFAULT_TEX_DATA_H + 1] =\n{\n    \"..-         -XXXXXXX-    X    -           X           -XXXXXXX          -          XXXXXXX\"\n    \"..-         -X.....X-   X.X   -          X.X          -X.....X          -          X.....X\"\n    \"---         -XXX.XXX-  X...X  -         X...X         -X....X           -           X....X\"\n    \"X           -  X.X  - X.....X -        X.....X        -X...X            -            X...X\"\n    \"XX          -  X.X  -X.......X-       X.......X       -X..X.X           -           X.X..X\"\n    \"X.X         -  X.X  -XXXX.XXXX-       XXXX.XXXX       -X.X X.X          -          X.X X.X\"\n    \"X..X        -  X.X  -   X.X   -          X.X          -XX   X.X         -         X.X   XX\"\n    \"X...X       -  X.X  -   X.X   -    XX    X.X    XX    -      X.X        -        X.X      \"\n    \"X....X      -  X.X  -   X.X   -   X.X    X.X    X.X   -       X.X       -       X.X       \"\n    \"X.....X     -  X.X  -   X.X   -  X..X    X.X    X..X  -        X.X      -      X.X        \"\n    \"X......X    -  X.X  -   X.X   - X...XXXXXX.XXXXXX...X -         X.X   XX-XX   X.X         \"\n    \"X.......X   -  X.X  -   X.X   -X.....................X-          X.X X.X-X.X X.X          \"\n    \"X........X  -  X.X  -   X.X   - X...XXXXXX.XXXXXX...X -           X.X..X-X..X.X           \"\n    \"X.........X -XXX.XXX-   X.X   -  X..X    X.X    X..X  -            X...X-X...X            \"\n    \"X..........X-X.....X-   X.X   -   X.X    X.X    X.X   -           X....X-X....X           \"\n    \"X......XXXXX-XXXXXXX-   X.X   -    XX    X.X    XX    -          X.....X-X.....X          \"\n    \"X...X..X    ---------   X.X   -          X.X          -          XXXXXXX-XXXXXXX          \"\n    \"X..X X..X   -       -XXXX.XXXX-       XXXX.XXXX       ------------------------------------\"\n    \"X.X  X..X   -       -X.......X-       X.......X       -    XX           XX    -           \"\n    \"XX    X..X  -       - X.....X -        X.....X        -   X.X           X.X   -           \"\n    \"      X..X          -  X...X  -         X...X         -  X..X           X..X  -           \"\n    \"       XX           -   X.X   -          X.X          - X...XXXXXXXXXXXXX...X -           \"\n    \"------------        -    X    -           X           -X.....................X-           \"\n    \"                    ----------------------------------- X...XXXXXXXXXXXXX...X -           \"\n    \"                                                      -  X..X           X..X  -           \"\n    \"                                                      -   X.X           X.X   -           \"\n    \"                                                      -    XX           XX    -           \"\n};\n\nstatic const ImVec2 FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ImGuiMouseCursor_Count_][3] =\n{\n    // Pos ........ Size ......... Offset ......\n    { ImVec2(0,3),  ImVec2(12,19), ImVec2( 0, 0) }, // ImGuiMouseCursor_Arrow\n    { ImVec2(13,0), ImVec2(7,16),  ImVec2( 4, 8) }, // ImGuiMouseCursor_TextInput\n    { ImVec2(31,0), ImVec2(23,23), ImVec2(11,11) }, // ImGuiMouseCursor_Move\n    { ImVec2(21,0), ImVec2( 9,23), ImVec2( 5,11) }, // ImGuiMouseCursor_ResizeNS\n    { ImVec2(55,18),ImVec2(23, 9), ImVec2(11, 5) }, // ImGuiMouseCursor_ResizeEW\n    { ImVec2(73,0), ImVec2(17,17), ImVec2( 9, 9) }, // ImGuiMouseCursor_ResizeNESW\n    { ImVec2(55,0), ImVec2(17,17), ImVec2( 9, 9) }, // ImGuiMouseCursor_ResizeNWSE\n};\n\n\nImFontAtlas::ImFontAtlas()\n{\n    TexID = NULL;\n    TexDesiredWidth = 0;\n    TexGlyphPadding = 1;\n    TexPixelsAlpha8 = NULL;\n    TexPixelsRGBA32 = NULL;\n    TexWidth = TexHeight = 0;\n    TexUvWhitePixel = ImVec2(0, 0);\n    for (int n = 0; n < IM_ARRAYSIZE(CustomRectIds); n++)\n        CustomRectIds[n] = -1;\n}\n\nImFontAtlas::~ImFontAtlas()\n{\n    Clear();\n}\n\nvoid    ImFontAtlas::ClearInputData()\n{\n    for (int i = 0; i < ConfigData.Size; i++)\n        if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas)\n        {\n            ImGui::MemFree(ConfigData[i].FontData);\n            ConfigData[i].FontData = NULL;\n        }\n\n    // When clearing this we lose access to  the font name and other information used to build the font.\n    for (int i = 0; i < Fonts.Size; i++)\n        if (Fonts[i]->ConfigData >= ConfigData.Data && Fonts[i]->ConfigData < ConfigData.Data + ConfigData.Size)\n        {\n            Fonts[i]->ConfigData = NULL;\n            Fonts[i]->ConfigDataCount = 0;\n        }\n    ConfigData.clear();\n    CustomRects.clear();\n    for (int n = 0; n < IM_ARRAYSIZE(CustomRectIds); n++)\n        CustomRectIds[n] = -1;\n}\n\nvoid    ImFontAtlas::ClearTexData()\n{\n    if (TexPixelsAlpha8)\n        ImGui::MemFree(TexPixelsAlpha8);\n    if (TexPixelsRGBA32)\n        ImGui::MemFree(TexPixelsRGBA32);\n    TexPixelsAlpha8 = NULL;\n    TexPixelsRGBA32 = NULL;\n}\n\nvoid    ImFontAtlas::ClearFonts()\n{\n    for (int i = 0; i < Fonts.Size; i++)\n    {\n        Fonts[i]->~ImFont();\n        ImGui::MemFree(Fonts[i]);\n    }\n    Fonts.clear();\n}\n\nvoid    ImFontAtlas::Clear()\n{\n    ClearInputData();\n    ClearTexData();\n    ClearFonts();\n}\n\nvoid    ImFontAtlas::GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel)\n{\n    // Build atlas on demand\n    if (TexPixelsAlpha8 == NULL)\n    {\n        if (ConfigData.empty())\n            AddFontDefault();\n        Build();\n    }\n\n    *out_pixels = TexPixelsAlpha8;\n    if (out_width) *out_width = TexWidth;\n    if (out_height) *out_height = TexHeight;\n    if (out_bytes_per_pixel) *out_bytes_per_pixel = 1;\n}\n\nvoid    ImFontAtlas::GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel)\n{\n    // Convert to RGBA32 format on demand\n    // Although it is likely to be the most commonly used format, our font rendering is 1 channel / 8 bpp\n    if (!TexPixelsRGBA32)\n    {\n        unsigned char* pixels;\n        GetTexDataAsAlpha8(&pixels, NULL, NULL);\n        TexPixelsRGBA32 = (unsigned int*)ImGui::MemAlloc((size_t)(TexWidth * TexHeight * 4));\n        const unsigned char* src = pixels;\n        unsigned int* dst = TexPixelsRGBA32;\n        for (int n = TexWidth * TexHeight; n > 0; n--)\n            *dst++ = IM_COL32(255, 255, 255, (unsigned int)(*src++));\n    }\n\n    *out_pixels = (unsigned char*)TexPixelsRGBA32;\n    if (out_width) *out_width = TexWidth;\n    if (out_height) *out_height = TexHeight;\n    if (out_bytes_per_pixel) *out_bytes_per_pixel = 4;\n}\n\nImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)\n{\n    IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0);\n    IM_ASSERT(font_cfg->SizePixels > 0.0f);\n\n    // Create new font\n    if (!font_cfg->MergeMode)\n    {\n        ImFont* font = (ImFont*)ImGui::MemAlloc(sizeof(ImFont));\n        IM_PLACEMENT_NEW(font) ImFont();\n        Fonts.push_back(font);\n    }\n    else\n    {\n        IM_ASSERT(!Fonts.empty()); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font.\n    }\n\n    ConfigData.push_back(*font_cfg);\n    ImFontConfig& new_font_cfg = ConfigData.back();\n    if (!new_font_cfg.DstFont)\n        new_font_cfg.DstFont = Fonts.back();\n    if (!new_font_cfg.FontDataOwnedByAtlas)\n    {\n        new_font_cfg.FontData = ImGui::MemAlloc(new_font_cfg.FontDataSize);\n        new_font_cfg.FontDataOwnedByAtlas = true;\n        memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize);\n    }\n\n    // Invalidate texture\n    ClearTexData();\n    return new_font_cfg.DstFont;\n}\n\n// Default font TTF is compressed with stb_compress then base85 encoded (see extra_fonts/binary_to_compressed_c.cpp for encoder)\nstatic unsigned int stb_decompress_length(unsigned char *input);\nstatic unsigned int stb_decompress(unsigned char *output, unsigned char *i, unsigned int length);\nstatic const char*  GetDefaultCompressedFontDataTTFBase85();\nstatic unsigned int Decode85Byte(char c)                                    { return c >= '\\\\' ? c-36 : c-35; }\nstatic void         Decode85(const unsigned char* src, unsigned char* dst)\n{\n    while (*src)\n    {\n        unsigned int tmp = Decode85Byte(src[0]) + 85*(Decode85Byte(src[1]) + 85*(Decode85Byte(src[2]) + 85*(Decode85Byte(src[3]) + 85*Decode85Byte(src[4]))));\n        dst[0] = ((tmp >> 0) & 0xFF); dst[1] = ((tmp >> 8) & 0xFF); dst[2] = ((tmp >> 16) & 0xFF); dst[3] = ((tmp >> 24) & 0xFF);   // We can't assume little-endianness.\n        src += 5;\n        dst += 4;\n    }\n}\n\n// Load embedded ProggyClean.ttf at size 13, disable oversampling\nImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template)\n{\n    ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();\n    if (!font_cfg_template)\n    {\n        font_cfg.OversampleH = font_cfg.OversampleV = 1;\n        font_cfg.PixelSnapH = true;\n    }\n    if (font_cfg.Name[0] == '\\0') strcpy(font_cfg.Name, \"ProggyClean.ttf, 13px\");\n    if (font_cfg.SizePixels <= 0.0f) font_cfg.SizePixels = 13.0f;\n\n    const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85();\n    ImFont* font = AddFontFromMemoryCompressedBase85TTF(ttf_compressed_base85, font_cfg.SizePixels, &font_cfg, GetGlyphRangesDefault());\n    return font;\n}\n\nImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)\n{\n    int data_size = 0;\n    void* data = ImFileLoadToMemory(filename, \"rb\", &data_size, 0);\n    if (!data)\n    {\n        IM_ASSERT(0); // Could not load file.\n        return NULL;\n    }\n    ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();\n    if (font_cfg.Name[0] == '\\0')\n    {\n        // Store a short copy of filename into into the font name for convenience\n        const char* p;\n        for (p = filename + strlen(filename); p > filename && p[-1] != '/' && p[-1] != '\\\\'; p--) {}\n        snprintf(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), \"%s, %.0fpx\", p, size_pixels);\n    }\n    return AddFontFromMemoryTTF(data, data_size, size_pixels, &font_cfg, glyph_ranges);\n}\n\n// NB: Transfer ownership of 'ttf_data' to ImFontAtlas, unless font_cfg_template->FontDataOwnedByAtlas == false. Owned TTF buffer will be deleted after Build().\nImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)\n{\n    ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();\n    IM_ASSERT(font_cfg.FontData == NULL);\n    font_cfg.FontData = ttf_data;\n    font_cfg.FontDataSize = ttf_size;\n    font_cfg.SizePixels = size_pixels;\n    if (glyph_ranges)\n        font_cfg.GlyphRanges = glyph_ranges;\n    return AddFont(&font_cfg);\n}\n\nImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_data, int compressed_ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)\n{\n    const unsigned int buf_decompressed_size = stb_decompress_length((unsigned char*)compressed_ttf_data);\n    unsigned char* buf_decompressed_data = (unsigned char *)ImGui::MemAlloc(buf_decompressed_size);\n    stb_decompress(buf_decompressed_data, (unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size);\n\n    ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();\n    IM_ASSERT(font_cfg.FontData == NULL);\n    font_cfg.FontDataOwnedByAtlas = true;\n    return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, &font_cfg, glyph_ranges);\n}\n\nImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges)\n{\n    int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4;\n    void* compressed_ttf = ImGui::MemAlloc((size_t)compressed_ttf_size);\n    Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf);\n    ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges);\n    ImGui::MemFree(compressed_ttf);\n    return font;\n}\n\nint ImFontAtlas::AddCustomRectRegular(unsigned int id, int width, int height)\n{\n    IM_ASSERT(id >= 0x10000);\n    IM_ASSERT(width > 0 && width <= 0xFFFF);\n    IM_ASSERT(height > 0 && height <= 0xFFFF);\n    CustomRect r;\n    r.ID = id;\n    r.Width = (unsigned short)width;\n    r.Height = (unsigned short)height;\n    CustomRects.push_back(r);\n    return CustomRects.Size - 1; // Return index\n}\n\nint ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset)\n{\n    IM_ASSERT(font != NULL);\n    IM_ASSERT(width > 0 && width <= 0xFFFF);\n    IM_ASSERT(height > 0 && height <= 0xFFFF);\n    CustomRect r;\n    r.ID = id;\n    r.Width = (unsigned short)width;\n    r.Height = (unsigned short)height;\n    r.GlyphAdvanceX = advance_x;\n    r.GlyphOffset = offset;\n    r.Font = font;\n    CustomRects.push_back(r);\n    return CustomRects.Size - 1; // Return index\n}\n\nvoid ImFontAtlas::CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max)\n{\n    IM_ASSERT(TexWidth > 0 && TexHeight > 0);   // Font atlas needs to be built before we can calculate UV coordinates\n    IM_ASSERT(rect->IsPacked());                // Make sure the rectangle has been packed\n    *out_uv_min = ImVec2((float)rect->X / TexWidth, (float)rect->Y / TexHeight);\n    *out_uv_max = ImVec2((float)(rect->X + rect->Width) / TexWidth, (float)(rect->Y + rect->Height) / TexHeight);\n}\n\nbool    ImFontAtlas::Build()\n{\n    return ImFontAtlasBuildWithStbTruetype(this);\n}\n\nvoid    ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_brighten_factor)\n{\n    for (unsigned int i = 0; i < 256; i++)\n    {\n        unsigned int value = (unsigned int)(i * in_brighten_factor);\n        out_table[i] = value > 255 ? 255 : (value & 0xFF);\n    }\n}\n\nvoid    ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride)\n{\n    unsigned char* data = pixels + x + y * stride;\n    for (int j = h; j > 0; j--, data += stride)\n        for (int i = 0; i < w; i++)\n            data[i] = table[data[i]];\n}\n\nbool    ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)\n{\n    IM_ASSERT(atlas->ConfigData.Size > 0);\n\n    ImFontAtlasBuildRegisterDefaultCustomRects(atlas);\n\n    atlas->TexID = NULL;\n    atlas->TexWidth = atlas->TexHeight = 0;\n    atlas->TexUvWhitePixel = ImVec2(0, 0);\n    atlas->ClearTexData();\n\n    // Count glyphs/ranges\n    int total_glyphs_count = 0;\n    int total_ranges_count = 0;\n    for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)\n    {\n        ImFontConfig& cfg = atlas->ConfigData[input_i];\n        if (!cfg.GlyphRanges)\n            cfg.GlyphRanges = atlas->GetGlyphRangesDefault();\n        for (const ImWchar* in_range = cfg.GlyphRanges; in_range[0] && in_range[1]; in_range += 2, total_ranges_count++)\n            total_glyphs_count += (in_range[1] - in_range[0]) + 1;\n    }\n\n    // We need a width for the skyline algorithm. Using a dumb heuristic here to decide of width. User can override TexDesiredWidth and TexGlyphPadding if they wish.\n    // Width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height.\n    atlas->TexWidth = (atlas->TexDesiredWidth > 0) ? atlas->TexDesiredWidth : (total_glyphs_count > 4000) ? 4096 : (total_glyphs_count > 2000) ? 2048 : (total_glyphs_count > 1000) ? 1024 : 512;\n    atlas->TexHeight = 0;\n\n    // Start packing\n    const int max_tex_height = 1024*32;\n    stbtt_pack_context spc = {};\n    stbtt_PackBegin(&spc, NULL, atlas->TexWidth, max_tex_height, 0, atlas->TexGlyphPadding, NULL);\n    stbtt_PackSetOversampling(&spc, 1, 1);\n\n    // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values).\n    ImFontAtlasBuildPackCustomRects(atlas, spc.pack_info);\n\n    // Initialize font information (so we can error without any cleanup)\n    struct ImFontTempBuildData\n    {\n        stbtt_fontinfo      FontInfo;\n        stbrp_rect*         Rects;\n        int                 RectsCount;\n        stbtt_pack_range*   Ranges;\n        int                 RangesCount;\n    };\n    ImFontTempBuildData* tmp_array = (ImFontTempBuildData*)ImGui::MemAlloc((size_t)atlas->ConfigData.Size * sizeof(ImFontTempBuildData));\n    for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)\n    {\n        ImFontConfig& cfg = atlas->ConfigData[input_i];\n        ImFontTempBuildData& tmp = tmp_array[input_i];\n        IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas));\n\n        const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo);\n        IM_ASSERT(font_offset >= 0);\n        if (!stbtt_InitFont(&tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset))\n        {\n            ImGui::MemFree(tmp_array);\n            return false;\n        }\n    }\n\n    // Allocate packing character data and flag packed characters buffer as non-packed (x0=y0=x1=y1=0)\n    int buf_packedchars_n = 0, buf_rects_n = 0, buf_ranges_n = 0;\n    stbtt_packedchar* buf_packedchars = (stbtt_packedchar*)ImGui::MemAlloc(total_glyphs_count * sizeof(stbtt_packedchar));\n    stbrp_rect* buf_rects = (stbrp_rect*)ImGui::MemAlloc(total_glyphs_count * sizeof(stbrp_rect));\n    stbtt_pack_range* buf_ranges = (stbtt_pack_range*)ImGui::MemAlloc(total_ranges_count * sizeof(stbtt_pack_range));\n    memset(buf_packedchars, 0, total_glyphs_count * sizeof(stbtt_packedchar));\n    memset(buf_rects, 0, total_glyphs_count * sizeof(stbrp_rect));              // Unnecessary but let's clear this for the sake of sanity.\n    memset(buf_ranges, 0, total_ranges_count * sizeof(stbtt_pack_range));\n\n    // First font pass: pack all glyphs (no rendering at this point, we are working with rectangles in an infinitely tall texture at this point)\n    for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)\n    {\n        ImFontConfig& cfg = atlas->ConfigData[input_i];\n        ImFontTempBuildData& tmp = tmp_array[input_i];\n\n        // Setup ranges\n        int font_glyphs_count = 0;\n        int font_ranges_count = 0;\n        for (const ImWchar* in_range = cfg.GlyphRanges; in_range[0] && in_range[1]; in_range += 2, font_ranges_count++)\n            font_glyphs_count += (in_range[1] - in_range[0]) + 1;\n        tmp.Ranges = buf_ranges + buf_ranges_n;\n        tmp.RangesCount = font_ranges_count;\n        buf_ranges_n += font_ranges_count;\n        for (int i = 0; i < font_ranges_count; i++)\n        {\n            const ImWchar* in_range = &cfg.GlyphRanges[i * 2];\n            stbtt_pack_range& range = tmp.Ranges[i];\n            range.font_size = cfg.SizePixels;\n            range.first_unicode_codepoint_in_range = in_range[0];\n            range.num_chars = (in_range[1] - in_range[0]) + 1;\n            range.chardata_for_range = buf_packedchars + buf_packedchars_n;\n            buf_packedchars_n += range.num_chars;\n        }\n\n        // Pack\n        tmp.Rects = buf_rects + buf_rects_n;\n        tmp.RectsCount = font_glyphs_count;\n        buf_rects_n += font_glyphs_count;\n        stbtt_PackSetOversampling(&spc, cfg.OversampleH, cfg.OversampleV);\n        int n = stbtt_PackFontRangesGatherRects(&spc, &tmp.FontInfo, tmp.Ranges, tmp.RangesCount, tmp.Rects);\n        IM_ASSERT(n == font_glyphs_count);\n        stbrp_pack_rects((stbrp_context*)spc.pack_info, tmp.Rects, n);\n\n        // Extend texture height\n        for (int i = 0; i < n; i++)\n            if (tmp.Rects[i].was_packed)\n                atlas->TexHeight = ImMax(atlas->TexHeight, tmp.Rects[i].y + tmp.Rects[i].h);\n    }\n    IM_ASSERT(buf_rects_n == total_glyphs_count);\n    IM_ASSERT(buf_packedchars_n == total_glyphs_count);\n    IM_ASSERT(buf_ranges_n == total_ranges_count);\n\n    // Create texture\n    atlas->TexHeight = ImUpperPowerOfTwo(atlas->TexHeight);\n    atlas->TexPixelsAlpha8 = (unsigned char*)ImGui::MemAlloc(atlas->TexWidth * atlas->TexHeight);\n    memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight);\n    spc.pixels = atlas->TexPixelsAlpha8;\n    spc.height = atlas->TexHeight;\n\n    // Second pass: render font characters\n    for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)\n    {\n        ImFontConfig& cfg = atlas->ConfigData[input_i];\n        ImFontTempBuildData& tmp = tmp_array[input_i];\n        stbtt_PackSetOversampling(&spc, cfg.OversampleH, cfg.OversampleV);\n        stbtt_PackFontRangesRenderIntoRects(&spc, &tmp.FontInfo, tmp.Ranges, tmp.RangesCount, tmp.Rects);\n        if (cfg.RasterizerMultiply != 1.0f)\n        {\n            unsigned char multiply_table[256];\n            ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply);\n            for (const stbrp_rect* r = tmp.Rects; r != tmp.Rects + tmp.RectsCount; r++)\n                if (r->was_packed)\n                    ImFontAtlasBuildMultiplyRectAlpha8(multiply_table, spc.pixels, r->x, r->y, r->w, r->h, spc.stride_in_bytes);\n        }\n        tmp.Rects = NULL;\n    }\n\n    // End packing\n    stbtt_PackEnd(&spc);\n    ImGui::MemFree(buf_rects);\n    buf_rects = NULL;\n\n    // Third pass: setup ImFont and glyphs for runtime\n    for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)\n    {\n        ImFontConfig& cfg = atlas->ConfigData[input_i];\n        ImFontTempBuildData& tmp = tmp_array[input_i];\n        ImFont* dst_font = cfg.DstFont; // We can have multiple input fonts writing into a same destination font (when using MergeMode=true)\n\n        const float font_scale = stbtt_ScaleForPixelHeight(&tmp.FontInfo, cfg.SizePixels);\n        int unscaled_ascent, unscaled_descent, unscaled_line_gap;\n        stbtt_GetFontVMetrics(&tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap);\n\n        const float ascent = unscaled_ascent * font_scale;\n        const float descent = unscaled_descent * font_scale;\n        ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent);\n        const float off_x = cfg.GlyphOffset.x;\n        const float off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f);\n\n        for (int i = 0; i < tmp.RangesCount; i++)\n        {\n            stbtt_pack_range& range = tmp.Ranges[i];\n            for (int char_idx = 0; char_idx < range.num_chars; char_idx += 1)\n            {\n                const stbtt_packedchar& pc = range.chardata_for_range[char_idx];\n                if (!pc.x0 && !pc.x1 && !pc.y0 && !pc.y1)\n                    continue;\n\n                const int codepoint = range.first_unicode_codepoint_in_range + char_idx;\n                if (cfg.MergeMode && dst_font->FindGlyph((unsigned short)codepoint))\n                    continue;\n\n                stbtt_aligned_quad q;\n                float dummy_x = 0.0f, dummy_y = 0.0f;\n                stbtt_GetPackedQuad(range.chardata_for_range, atlas->TexWidth, atlas->TexHeight, char_idx, &dummy_x, &dummy_y, &q, 0);\n                dst_font->AddGlyph((ImWchar)codepoint, q.x0 + off_x, q.y0 + off_y, q.x1 + off_x, q.y1 + off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance);\n            }\n        }\n    }\n\n    // Cleanup temporaries\n    ImGui::MemFree(buf_packedchars);\n    ImGui::MemFree(buf_ranges);\n    ImGui::MemFree(tmp_array);\n\n    ImFontAtlasBuildFinish(atlas);\n\n    return true;\n}\n\nvoid ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas)\n{\n    if (atlas->CustomRectIds[0] < 0)\n        atlas->CustomRectIds[0] = atlas->AddCustomRectRegular(FONT_ATLAS_DEFAULT_TEX_DATA_ID, FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF*2+1, FONT_ATLAS_DEFAULT_TEX_DATA_H);\n}\n\nvoid ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent)\n{\n    if (!font_config->MergeMode)\n    {\n        font->ClearOutputData();\n        font->FontSize = font_config->SizePixels;\n        font->ConfigData = font_config;\n        font->ContainerAtlas = atlas;\n        font->Ascent = ascent;\n        font->Descent = descent;\n    }\n    font->ConfigDataCount++;\n}\n\nvoid ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* pack_context_opaque)\n{\n    stbrp_context* pack_context = (stbrp_context*)pack_context_opaque;\n\n    ImVector<ImFontAtlas::CustomRect>& user_rects = atlas->CustomRects;\n    IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong.\n\n    ImVector<stbrp_rect> pack_rects;\n    pack_rects.resize(user_rects.Size);\n    memset(pack_rects.Data, 0, sizeof(stbrp_rect) * user_rects.Size);\n    for (int i = 0; i < user_rects.Size; i++)\n    {\n        pack_rects[i].w = user_rects[i].Width;\n        pack_rects[i].h = user_rects[i].Height;\n    }\n    stbrp_pack_rects(pack_context, &pack_rects[0], pack_rects.Size);\n    for (int i = 0; i < pack_rects.Size; i++)\n        if (pack_rects[i].was_packed)\n        {\n            user_rects[i].X = pack_rects[i].x;\n            user_rects[i].Y = pack_rects[i].y;\n            IM_ASSERT(pack_rects[i].w == user_rects[i].Width && pack_rects[i].h == user_rects[i].Height);\n            atlas->TexHeight = ImMax(atlas->TexHeight, pack_rects[i].y + pack_rects[i].h);\n        }\n}\n\nstatic void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas)\n{\n    IM_ASSERT(atlas->CustomRectIds[0] >= 0);\n    ImFontAtlas::CustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]];\n    IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID);\n    IM_ASSERT(r.Width == FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF*2+1);\n    IM_ASSERT(r.Height == FONT_ATLAS_DEFAULT_TEX_DATA_H);\n    IM_ASSERT(r.IsPacked());\n    IM_ASSERT(atlas->TexPixelsAlpha8 != NULL);\n\n    // Render/copy pixels\n    for (int y = 0, n = 0; y < FONT_ATLAS_DEFAULT_TEX_DATA_H; y++)\n        for (int x = 0; x < FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF; x++, n++)\n        {\n            const int offset0 = (int)(r.X + x) + (int)(r.Y + y) * atlas->TexWidth;\n            const int offset1 = offset0 + FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF + 1;\n            atlas->TexPixelsAlpha8[offset0] = FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[n] == '.' ? 0xFF : 0x00;\n            atlas->TexPixelsAlpha8[offset1] = FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[n] == 'X' ? 0xFF : 0x00;\n        }\n    const ImVec2 tex_uv_scale(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight);\n    atlas->TexUvWhitePixel = ImVec2((r.X + 0.5f) * tex_uv_scale.x, (r.Y + 0.5f) * tex_uv_scale.y);\n\n    // Setup mouse cursors\n    for (int type = 0; type < ImGuiMouseCursor_Count_; type++)\n    {\n        ImGuiMouseCursorData& cursor_data = GImGui->MouseCursorData[type];\n        ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[type][0] + ImVec2((float)r.X, (float)r.Y);\n        const ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[type][1];\n        cursor_data.Type = type;\n        cursor_data.Size = size;\n        cursor_data.HotOffset = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[type][2];\n        cursor_data.TexUvMin[0] = (pos) * tex_uv_scale;\n        cursor_data.TexUvMax[0] = (pos + size) * tex_uv_scale;\n        pos.x += FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF + 1;\n        cursor_data.TexUvMin[1] = (pos) * tex_uv_scale;\n        cursor_data.TexUvMax[1] = (pos + size) * tex_uv_scale;\n    }\n}\n\nvoid ImFontAtlasBuildFinish(ImFontAtlas* atlas)\n{\n    // Render into our custom data block\n    ImFontAtlasBuildRenderDefaultTexData(atlas);\n\n    // Register custom rectangle glyphs\n    for (int i = 0; i < atlas->CustomRects.Size; i++)\n    {\n        const ImFontAtlas::CustomRect& r = atlas->CustomRects[i];\n        if (r.Font == NULL || r.ID > 0x10000)\n            continue;\n\n        IM_ASSERT(r.Font->ContainerAtlas == atlas);\n        ImVec2 uv0, uv1;\n        atlas->CalcCustomRectUV(&r, &uv0, &uv1);\n        r.Font->AddGlyph((ImWchar)r.ID, r.GlyphOffset.x, r.GlyphOffset.y, r.GlyphOffset.x + r.Width, r.GlyphOffset.y + r.Height, uv0.x, uv0.y, uv1.x, uv1.y, r.GlyphAdvanceX);\n    }\n\n    // Build all fonts lookup tables\n    for (int i = 0; i < atlas->Fonts.Size; i++)\n        atlas->Fonts[i]->BuildLookupTable();\n}\n\n// Retrieve list of range (2 int per range, values are inclusive)\nconst ImWchar*   ImFontAtlas::GetGlyphRangesDefault()\n{\n    static const ImWchar ranges[] =\n    {\n        0x0020, 0x00FF, // Basic Latin + Latin Supplement\n        0,\n    };\n    return &ranges[0];\n}\n\nconst ImWchar*  ImFontAtlas::GetGlyphRangesKorean()\n{\n    static const ImWchar ranges[] =\n    {\n        0x0020, 0x00FF, // Basic Latin + Latin Supplement\n        0x3131, 0x3163, // Korean alphabets\n        0xAC00, 0xD79D, // Korean characters\n        0,\n    };\n    return &ranges[0];\n}\n\nconst ImWchar*  ImFontAtlas::GetGlyphRangesChinese()\n{\n    static const ImWchar ranges[] =\n    {\n        0x0020, 0x00FF, // Basic Latin + Latin Supplement\n        0x3000, 0x30FF, // Punctuations, Hiragana, Katakana\n        0x31F0, 0x31FF, // Katakana Phonetic Extensions\n        0xFF00, 0xFFEF, // Half-width characters\n        0x4e00, 0x9FAF, // CJK Ideograms\n        0,\n    };\n    return &ranges[0];\n}\n\nconst ImWchar*  ImFontAtlas::GetGlyphRangesJapanese()\n{\n    // Store the 1946 ideograms code points as successive offsets from the initial unicode codepoint 0x4E00. Each offset has an implicit +1.\n    // This encoding is designed to helps us reduce the source code size.\n    // FIXME: Source a list of the revised 2136 joyo kanji list from 2010 and rebuild this.\n    // The current list was sourced from http://theinstructionlimit.com/author/renaudbedardrenaudbedard/page/3\n    // Note that you may use ImFontAtlas::GlyphRangesBuilder to create your own ranges, by merging existing ranges or adding new characters.\n    static const short offsets_from_0x4E00[] =\n    {\n        -1,0,1,3,0,0,0,0,1,0,5,1,1,0,7,4,6,10,0,1,9,9,7,1,3,19,1,10,7,1,0,1,0,5,1,0,6,4,2,6,0,0,12,6,8,0,3,5,0,1,0,9,0,0,8,1,1,3,4,5,13,0,0,8,2,17,\n        4,3,1,1,9,6,0,0,0,2,1,3,2,22,1,9,11,1,13,1,3,12,0,5,9,2,0,6,12,5,3,12,4,1,2,16,1,1,4,6,5,3,0,6,13,15,5,12,8,14,0,0,6,15,3,6,0,18,8,1,6,14,1,\n        5,4,12,24,3,13,12,10,24,0,0,0,1,0,1,1,2,9,10,2,2,0,0,3,3,1,0,3,8,0,3,2,4,4,1,6,11,10,14,6,15,3,4,15,1,0,0,5,2,2,0,0,1,6,5,5,6,0,3,6,5,0,0,1,0,\n        11,2,2,8,4,7,0,10,0,1,2,17,19,3,0,2,5,0,6,2,4,4,6,1,1,11,2,0,3,1,2,1,2,10,7,6,3,16,0,8,24,0,0,3,1,1,3,0,1,6,0,0,0,2,0,1,5,15,0,1,0,0,2,11,19,\n        1,4,19,7,6,5,1,0,0,0,0,5,1,0,1,9,0,0,5,0,2,0,1,0,3,0,11,3,0,2,0,0,0,0,0,9,3,6,4,12,0,14,0,0,29,10,8,0,14,37,13,0,31,16,19,0,8,30,1,20,8,3,48,\n        21,1,0,12,0,10,44,34,42,54,11,18,82,0,2,1,2,12,1,0,6,2,17,2,12,7,0,7,17,4,2,6,24,23,8,23,39,2,16,23,1,0,5,1,2,15,14,5,6,2,11,0,8,6,2,2,2,14,\n        20,4,15,3,4,11,10,10,2,5,2,1,30,2,1,0,0,22,5,5,0,3,1,5,4,1,0,0,2,2,21,1,5,1,2,16,2,1,3,4,0,8,4,0,0,5,14,11,2,16,1,13,1,7,0,22,15,3,1,22,7,14,\n        22,19,11,24,18,46,10,20,64,45,3,2,0,4,5,0,1,4,25,1,0,0,2,10,0,0,0,1,0,1,2,0,0,9,1,2,0,0,0,2,5,2,1,1,5,5,8,1,1,1,5,1,4,9,1,3,0,1,0,1,1,2,0,0,\n        2,0,1,8,22,8,1,0,0,0,0,4,2,1,0,9,8,5,0,9,1,30,24,2,6,4,39,0,14,5,16,6,26,179,0,2,1,1,0,0,0,5,2,9,6,0,2,5,16,7,5,1,1,0,2,4,4,7,15,13,14,0,0,\n        3,0,1,0,0,0,2,1,6,4,5,1,4,9,0,3,1,8,0,0,10,5,0,43,0,2,6,8,4,0,2,0,0,9,6,0,9,3,1,6,20,14,6,1,4,0,7,2,3,0,2,0,5,0,3,1,0,3,9,7,0,3,4,0,4,9,1,6,0,\n        9,0,0,2,3,10,9,28,3,6,2,4,1,2,32,4,1,18,2,0,3,1,5,30,10,0,2,2,2,0,7,9,8,11,10,11,7,2,13,7,5,10,0,3,40,2,0,1,6,12,0,4,5,1,5,11,11,21,4,8,3,7,\n        8,8,33,5,23,0,0,19,8,8,2,3,0,6,1,1,1,5,1,27,4,2,5,0,3,5,6,3,1,0,3,1,12,5,3,3,2,0,7,7,2,1,0,4,0,1,1,2,0,10,10,6,2,5,9,7,5,15,15,21,6,11,5,20,\n        4,3,5,5,2,5,0,2,1,0,1,7,28,0,9,0,5,12,5,5,18,30,0,12,3,3,21,16,25,32,9,3,14,11,24,5,66,9,1,2,0,5,9,1,5,1,8,0,8,3,3,0,1,15,1,4,8,1,2,7,0,7,2,\n        8,3,7,5,3,7,10,2,1,0,0,2,25,0,6,4,0,10,0,4,2,4,1,12,5,38,4,0,4,1,10,5,9,4,0,14,4,2,5,18,20,21,1,3,0,5,0,7,0,3,7,1,3,1,1,8,1,0,0,0,3,2,5,2,11,\n        6,0,13,1,3,9,1,12,0,16,6,2,1,0,2,1,12,6,13,11,2,0,28,1,7,8,14,13,8,13,0,2,0,5,4,8,10,2,37,42,19,6,6,7,4,14,11,18,14,80,7,6,0,4,72,12,36,27,\n        7,7,0,14,17,19,164,27,0,5,10,7,3,13,6,14,0,2,2,5,3,0,6,13,0,0,10,29,0,4,0,3,13,0,3,1,6,51,1,5,28,2,0,8,0,20,2,4,0,25,2,10,13,10,0,16,4,0,1,0,\n        2,1,7,0,1,8,11,0,0,1,2,7,2,23,11,6,6,4,16,2,2,2,0,22,9,3,3,5,2,0,15,16,21,2,9,20,15,15,5,3,9,1,0,0,1,7,7,5,4,2,2,2,38,24,14,0,0,15,5,6,24,14,\n        5,5,11,0,21,12,0,3,8,4,11,1,8,0,11,27,7,2,4,9,21,59,0,1,39,3,60,62,3,0,12,11,0,3,30,11,0,13,88,4,15,5,28,13,1,4,48,17,17,4,28,32,46,0,16,0,\n        18,11,1,8,6,38,11,2,6,11,38,2,0,45,3,11,2,7,8,4,30,14,17,2,1,1,65,18,12,16,4,2,45,123,12,56,33,1,4,3,4,7,0,0,0,3,2,0,16,4,2,4,2,0,7,4,5,2,26,\n        2,25,6,11,6,1,16,2,6,17,77,15,3,35,0,1,0,5,1,0,38,16,6,3,12,3,3,3,0,9,3,1,3,5,2,9,0,18,0,25,1,3,32,1,72,46,6,2,7,1,3,14,17,0,28,1,40,13,0,20,\n        15,40,6,38,24,12,43,1,1,9,0,12,6,0,6,2,4,19,3,7,1,48,0,9,5,0,5,6,9,6,10,15,2,11,19,3,9,2,0,1,10,1,27,8,1,3,6,1,14,0,26,0,27,16,3,4,9,6,2,23,\n        9,10,5,25,2,1,6,1,1,48,15,9,15,14,3,4,26,60,29,13,37,21,1,6,4,0,2,11,22,23,16,16,2,2,1,3,0,5,1,6,4,0,0,4,0,0,8,3,0,2,5,0,7,1,7,3,13,2,4,10,\n        3,0,2,31,0,18,3,0,12,10,4,1,0,7,5,7,0,5,4,12,2,22,10,4,2,15,2,8,9,0,23,2,197,51,3,1,1,4,13,4,3,21,4,19,3,10,5,40,0,4,1,1,10,4,1,27,34,7,21,\n        2,17,2,9,6,4,2,3,0,4,2,7,8,2,5,1,15,21,3,4,4,2,2,17,22,1,5,22,4,26,7,0,32,1,11,42,15,4,1,2,5,0,19,3,1,8,6,0,10,1,9,2,13,30,8,2,24,17,19,1,4,\n        4,25,13,0,10,16,11,39,18,8,5,30,82,1,6,8,18,77,11,13,20,75,11,112,78,33,3,0,0,60,17,84,9,1,1,12,30,10,49,5,32,158,178,5,5,6,3,3,1,3,1,4,7,6,\n        19,31,21,0,2,9,5,6,27,4,9,8,1,76,18,12,1,4,0,3,3,6,3,12,2,8,30,16,2,25,1,5,5,4,3,0,6,10,2,3,1,0,5,1,19,3,0,8,1,5,2,6,0,0,0,19,1,2,0,5,1,2,5,\n        1,3,7,0,4,12,7,3,10,22,0,9,5,1,0,2,20,1,1,3,23,30,3,9,9,1,4,191,14,3,15,6,8,50,0,1,0,0,4,0,0,1,0,2,4,2,0,2,3,0,2,0,2,2,8,7,0,1,1,1,3,3,17,11,\n        91,1,9,3,2,13,4,24,15,41,3,13,3,1,20,4,125,29,30,1,0,4,12,2,21,4,5,5,19,11,0,13,11,86,2,18,0,7,1,8,8,2,2,22,1,2,6,5,2,0,1,2,8,0,2,0,5,2,1,0,\n        2,10,2,0,5,9,2,1,2,0,1,0,4,0,0,10,2,5,3,0,6,1,0,1,4,4,33,3,13,17,3,18,6,4,7,1,5,78,0,4,1,13,7,1,8,1,0,35,27,15,3,0,0,0,1,11,5,41,38,15,22,6,\n        14,14,2,1,11,6,20,63,5,8,27,7,11,2,2,40,58,23,50,54,56,293,8,8,1,5,1,14,0,1,12,37,89,8,8,8,2,10,6,0,0,0,4,5,2,1,0,1,1,2,7,0,3,3,0,4,6,0,3,2,\n        19,3,8,0,0,0,4,4,16,0,4,1,5,1,3,0,3,4,6,2,17,10,10,31,6,4,3,6,10,126,7,3,2,2,0,9,0,0,5,20,13,0,15,0,6,0,2,5,8,64,50,3,2,12,2,9,0,0,11,8,20,\n        109,2,18,23,0,0,9,61,3,0,28,41,77,27,19,17,81,5,2,14,5,83,57,252,14,154,263,14,20,8,13,6,57,39,38,\n    };\n    static ImWchar base_ranges[] =\n    {\n        0x0020, 0x00FF, // Basic Latin + Latin Supplement\n        0x3000, 0x30FF, // Punctuations, Hiragana, Katakana\n        0x31F0, 0x31FF, // Katakana Phonetic Extensions\n        0xFF00, 0xFFEF, // Half-width characters\n    };\n    static bool full_ranges_unpacked = false;\n    static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(offsets_from_0x4E00)*2 + 1];\n    if (!full_ranges_unpacked)\n    {\n        // Unpack\n        int codepoint = 0x4e00;\n        memcpy(full_ranges, base_ranges, sizeof(base_ranges));\n        ImWchar* dst = full_ranges + IM_ARRAYSIZE(base_ranges);;\n        for (int n = 0; n < IM_ARRAYSIZE(offsets_from_0x4E00); n++, dst += 2)\n            dst[0] = dst[1] = (ImWchar)(codepoint += (offsets_from_0x4E00[n] + 1));\n        dst[0] = 0;\n        full_ranges_unpacked = true;\n    }\n    return &full_ranges[0];\n}\n\nconst ImWchar*  ImFontAtlas::GetGlyphRangesCyrillic()\n{\n    static const ImWchar ranges[] =\n    {\n        0x0020, 0x00FF, // Basic Latin + Latin Supplement\n        0x0400, 0x052F, // Cyrillic + Cyrillic Supplement\n        0x2DE0, 0x2DFF, // Cyrillic Extended-A\n        0xA640, 0xA69F, // Cyrillic Extended-B\n        0,\n    };\n    return &ranges[0];\n}\n\nconst ImWchar*  ImFontAtlas::GetGlyphRangesThai()\n{\n    static const ImWchar ranges[] =\n    {\n        0x0020, 0x00FF, // Basic Latin\n        0x2010, 0x205E, // Punctuations\n        0x0E00, 0x0E7F, // Thai\n        0,\n    };\n    return &ranges[0];\n}\n\n//-----------------------------------------------------------------------------\n// ImFontAtlas::GlyphRangesBuilder\n//-----------------------------------------------------------------------------\n\nvoid ImFontAtlas::GlyphRangesBuilder::AddText(const char* text, const char* text_end)\n{\n    while (text_end ? (text < text_end) : *text)\n    {\n        unsigned int c = 0;\n        int c_len = ImTextCharFromUtf8(&c, text, text_end);\n        text += c_len;\n        if (c_len == 0)\n            break;\n        if (c < 0x10000)\n            AddChar((ImWchar)c);\n    }\n}\n\nvoid ImFontAtlas::GlyphRangesBuilder::AddRanges(const ImWchar* ranges)\n{\n    for (; ranges[0]; ranges += 2)\n        for (ImWchar c = ranges[0]; c <= ranges[1]; c++)\n            AddChar(c);\n}\n\nvoid ImFontAtlas::GlyphRangesBuilder::BuildRanges(ImVector<ImWchar>* out_ranges)\n{\n    for (int n = 0; n < 0x10000; n++)\n        if (GetBit(n))\n        {\n            out_ranges->push_back((ImWchar)n);\n            while (n < 0x10000 && GetBit(n + 1))\n                n++;\n            out_ranges->push_back((ImWchar)n);\n        }\n    out_ranges->push_back(0);\n}\n\n//-----------------------------------------------------------------------------\n// ImFont\n//-----------------------------------------------------------------------------\n\nImFont::ImFont()\n{\n    Scale = 1.0f;\n    FallbackChar = (ImWchar)'?';\n    DisplayOffset = ImVec2(0.0f, 1.0f);\n    ClearOutputData();\n}\n\nImFont::~ImFont()\n{\n    // Invalidate active font so that the user gets a clear crash instead of a dangling pointer.\n    // If you want to delete fonts you need to do it between Render() and NewFrame().\n    // FIXME-CLEANUP\n    /*\n    ImGuiContext& g = *GImGui;\n    if (g.Font == this)\n        g.Font = NULL;\n    */\n    ClearOutputData();\n}\n\nvoid    ImFont::ClearOutputData()\n{\n    FontSize = 0.0f;\n    Glyphs.clear();\n    IndexAdvanceX.clear();\n    IndexLookup.clear();\n    FallbackGlyph = NULL;\n    FallbackAdvanceX = 0.0f;\n    ConfigDataCount = 0;\n    ConfigData = NULL;\n    ContainerAtlas = NULL;\n    Ascent = Descent = 0.0f;\n    MetricsTotalSurface = 0;\n}\n\nvoid ImFont::BuildLookupTable()\n{\n    int max_codepoint = 0;\n    for (int i = 0; i != Glyphs.Size; i++)\n        max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint);\n\n    IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved\n    IndexAdvanceX.clear();\n    IndexLookup.clear();\n    GrowIndex(max_codepoint + 1);\n    for (int i = 0; i < Glyphs.Size; i++)\n    {\n        int codepoint = (int)Glyphs[i].Codepoint;\n        IndexAdvanceX[codepoint] = Glyphs[i].AdvanceX;\n        IndexLookup[codepoint] = (unsigned short)i;\n    }\n\n    // Create a glyph to handle TAB\n    // FIXME: Needs proper TAB handling but it needs to be contextualized (or we could arbitrary say that each string starts at \"column 0\" ?)\n    if (FindGlyph((unsigned short)' '))\n    {\n        if (Glyphs.back().Codepoint != '\\t')   // So we can call this function multiple times\n            Glyphs.resize(Glyphs.Size + 1);\n        ImFontGlyph& tab_glyph = Glyphs.back();\n        tab_glyph = *FindGlyph((unsigned short)' ');\n        tab_glyph.Codepoint = '\\t';\n        tab_glyph.AdvanceX *= 4;\n        IndexAdvanceX[(int)tab_glyph.Codepoint] = (float)tab_glyph.AdvanceX;\n        IndexLookup[(int)tab_glyph.Codepoint] = (unsigned short)(Glyphs.Size-1);\n    }\n\n    FallbackGlyph = NULL;\n    FallbackGlyph = FindGlyph(FallbackChar);\n    FallbackAdvanceX = FallbackGlyph ? FallbackGlyph->AdvanceX : 0.0f;\n    for (int i = 0; i < max_codepoint + 1; i++)\n        if (IndexAdvanceX[i] < 0.0f)\n            IndexAdvanceX[i] = FallbackAdvanceX;\n}\n\nvoid ImFont::SetFallbackChar(ImWchar c)\n{\n    FallbackChar = c;\n    BuildLookupTable();\n}\n\nvoid ImFont::GrowIndex(int new_size)\n{\n    IM_ASSERT(IndexAdvanceX.Size == IndexLookup.Size);\n    if (new_size <= IndexLookup.Size)\n        return;\n    IndexAdvanceX.resize(new_size, -1.0f);\n    IndexLookup.resize(new_size, (unsigned short)-1);\n}\n\nvoid ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x)\n{\n    Glyphs.resize(Glyphs.Size + 1);\n    ImFontGlyph& glyph = Glyphs.back();\n    glyph.Codepoint = (ImWchar)codepoint;\n    glyph.X0 = x0; \n    glyph.Y0 = y0; \n    glyph.X1 = x1; \n    glyph.Y1 = y1;\n    glyph.U0 = u0; \n    glyph.V0 = v0; \n    glyph.U1 = u1; \n    glyph.V1 = v1;\n    glyph.AdvanceX = advance_x + ConfigData->GlyphExtraSpacing.x;  // Bake spacing into AdvanceX\n\n    if (ConfigData->PixelSnapH)\n        glyph.AdvanceX = (float)(int)(glyph.AdvanceX + 0.5f);\n    \n    // Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round)\n    MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + 1.99f) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + 1.99f);\n}\n\nvoid ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst)\n{\n    IM_ASSERT(IndexLookup.Size > 0);    // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function.\n    int index_size = IndexLookup.Size;\n\n    if (dst < index_size && IndexLookup.Data[dst] == (unsigned short)-1 && !overwrite_dst) // 'dst' already exists\n        return;\n    if (src >= index_size && dst >= index_size) // both 'dst' and 'src' don't exist -> no-op\n        return;\n\n    GrowIndex(dst + 1);\n    IndexLookup[dst] = (src < index_size) ? IndexLookup.Data[src] : (unsigned short)-1;\n    IndexAdvanceX[dst] = (src < index_size) ? IndexAdvanceX.Data[src] : 1.0f;\n}\n\nconst ImFontGlyph* ImFont::FindGlyph(ImWchar c) const\n{\n    if (c < IndexLookup.Size)\n    {\n        const unsigned short i = IndexLookup[c];\n        if (i != (unsigned short)-1)\n            return &Glyphs.Data[i];\n    }\n    return FallbackGlyph;\n}\n\nconst char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const\n{\n    // Simple word-wrapping for English, not full-featured. Please submit failing cases!\n    // FIXME: Much possible improvements (don't cut things like \"word !\", \"word!!!\" but cut within \"word,,,,\", more sensible support for punctuations, support for Unicode punctuations, etc.)\n\n    // For references, possible wrap point marked with ^\n    //  \"aaa bbb, ccc,ddd. eee   fff. ggg!\"\n    //      ^    ^    ^   ^   ^__    ^    ^\n\n    // List of hardcoded separators: .,;!?'\"\n\n    // Skip extra blanks after a line returns (that includes not counting them in width computation)\n    // e.g. \"Hello    world\" --> \"Hello\" \"World\"\n\n    // Cut words that cannot possibly fit within one line.\n    // e.g.: \"The tropical fish\" with ~5 characters worth of width --> \"The tr\" \"opical\" \"fish\"\n\n    float line_width = 0.0f;\n    float word_width = 0.0f;\n    float blank_width = 0.0f;\n    wrap_width /= scale; // We work with unscaled widths to avoid scaling every characters\n\n    const char* word_end = text;\n    const char* prev_word_end = NULL;\n    bool inside_word = true;\n\n    const char* s = text;\n    while (s < text_end)\n    {\n        unsigned int c = (unsigned int)*s;\n        const char* next_s;\n        if (c < 0x80)\n            next_s = s + 1;\n        else\n            next_s = s + ImTextCharFromUtf8(&c, s, text_end);\n        if (c == 0)\n            break;\n\n        if (c < 32)\n        {\n            if (c == '\\n')\n            {\n                line_width = word_width = blank_width = 0.0f;\n                inside_word = true;\n                s = next_s;\n                continue;\n            }\n            if (c == '\\r')\n            {\n                s = next_s;\n                continue;\n            }\n        }\n\n        const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX[(int)c] : FallbackAdvanceX);\n        if (ImCharIsSpace(c))\n        {\n            if (inside_word)\n            {\n                line_width += blank_width;\n                blank_width = 0.0f;\n                word_end = s;\n            }\n            blank_width += char_width;\n            inside_word = false;\n        }\n        else\n        {\n            word_width += char_width;\n            if (inside_word)\n            {\n                word_end = next_s;\n            }\n            else\n            {\n                prev_word_end = word_end;\n                line_width += word_width + blank_width;\n                word_width = blank_width = 0.0f;\n            }\n\n            // Allow wrapping after punctuation.\n            inside_word = !(c == '.' || c == ',' || c == ';' || c == '!' || c == '?' || c == '\\\"');\n        }\n\n        // We ignore blank width at the end of the line (they can be skipped)\n        if (line_width + word_width >= wrap_width)\n        {\n            // Words that cannot possibly fit within an entire line will be cut anywhere.\n            if (word_width < wrap_width)\n                s = prev_word_end ? prev_word_end : word_end;\n            break;\n        }\n\n        s = next_s;\n    }\n\n    return s;\n}\n\nImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** remaining) const\n{\n    if (!text_end)\n        text_end = text_begin + strlen(text_begin); // FIXME-OPT: Need to avoid this.\n\n    const float line_height = size;\n    const float scale = size / FontSize;\n\n    ImVec2 text_size = ImVec2(0,0);\n    float line_width = 0.0f;\n\n    const bool word_wrap_enabled = (wrap_width > 0.0f);\n    const char* word_wrap_eol = NULL;\n\n    const char* s = text_begin;\n    while (s < text_end)\n    {\n        if (word_wrap_enabled)\n        {\n            // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature.\n            if (!word_wrap_eol)\n            {\n                word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - line_width);\n                if (word_wrap_eol == s) // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity.\n                    word_wrap_eol++;    // +1 may not be a character start point in UTF-8 but it's ok because we use s >= word_wrap_eol below\n            }\n\n            if (s >= word_wrap_eol)\n            {\n                if (text_size.x < line_width)\n                    text_size.x = line_width;\n                text_size.y += line_height;\n                line_width = 0.0f;\n                word_wrap_eol = NULL;\n\n                // Wrapping skips upcoming blanks\n                while (s < text_end)\n                {\n                    const char c = *s;\n                    if (ImCharIsSpace(c)) { s++; } else if (c == '\\n') { s++; break; } else { break; }\n                }\n                continue;\n            }\n        }\n\n        // Decode and advance source\n        const char* prev_s = s;\n        unsigned int c = (unsigned int)*s;\n        if (c < 0x80)\n        {\n            s += 1;\n        }\n        else\n        {\n            s += ImTextCharFromUtf8(&c, s, text_end);\n            if (c == 0) // Malformed UTF-8?\n                break;\n        }\n\n        if (c < 32)\n        {\n            if (c == '\\n')\n            {\n                text_size.x = ImMax(text_size.x, line_width);\n                text_size.y += line_height;\n                line_width = 0.0f;\n                continue;\n            }\n            if (c == '\\r')\n                continue;\n        }\n\n        const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX[(int)c] : FallbackAdvanceX) * scale;\n        if (line_width + char_width >= max_width)\n        {\n            s = prev_s;\n            break;\n        }\n\n        line_width += char_width;\n    }\n\n    if (text_size.x < line_width)\n        text_size.x = line_width;\n\n    if (line_width > 0 || text_size.y == 0.0f)\n        text_size.y += line_height;\n\n    if (remaining)\n        *remaining = s;\n\n    return text_size;\n}\n\nvoid ImFont::RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const\n{\n    if (c == ' ' || c == '\\t' || c == '\\n' || c == '\\r') // Match behavior of RenderText(), those 4 codepoints are hard-coded.\n        return;\n    if (const ImFontGlyph* glyph = FindGlyph(c))\n    {\n        float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f;\n        pos.x = (float)(int)pos.x + DisplayOffset.x;\n        pos.y = (float)(int)pos.y + DisplayOffset.y;\n        draw_list->PrimReserve(6, 4);\n        draw_list->PrimRectUV(ImVec2(pos.x + glyph->X0 * scale, pos.y + glyph->Y0 * scale), ImVec2(pos.x + glyph->X1 * scale, pos.y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col);\n    }\n}\n\nvoid ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const\n{\n    if (!text_end)\n        text_end = text_begin + strlen(text_begin); // ImGui functions generally already provides a valid text_end, so this is merely to handle direct calls.\n\n    // Align to be pixel perfect\n    pos.x = (float)(int)pos.x + DisplayOffset.x;\n    pos.y = (float)(int)pos.y + DisplayOffset.y;\n    float x = pos.x;\n    float y = pos.y;\n    if (y > clip_rect.w)\n        return;\n\n    const float scale = size / FontSize;\n    const float line_height = FontSize * scale;\n    const bool word_wrap_enabled = (wrap_width > 0.0f);\n    const char* word_wrap_eol = NULL;\n\n    // Skip non-visible lines\n    const char* s = text_begin;\n    if (!word_wrap_enabled && y + line_height < clip_rect.y)\n        while (s < text_end && *s != '\\n')  // Fast-forward to next line\n            s++;\n\n    // Reserve vertices for remaining worse case (over-reserving is useful and easily amortized)\n    const int vtx_count_max = (int)(text_end - s) * 4;\n    const int idx_count_max = (int)(text_end - s) * 6;\n    const int idx_expected_size = draw_list->IdxBuffer.Size + idx_count_max;\n    draw_list->PrimReserve(idx_count_max, vtx_count_max);\n\n    ImDrawVert* vtx_write = draw_list->_VtxWritePtr;\n    ImDrawIdx* idx_write = draw_list->_IdxWritePtr;\n    unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx;\n\n    while (s < text_end)\n    {\n        if (word_wrap_enabled)\n        {\n            // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature.\n            if (!word_wrap_eol)\n            {\n                word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - (x - pos.x));\n                if (word_wrap_eol == s) // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity.\n                    word_wrap_eol++;    // +1 may not be a character start point in UTF-8 but it's ok because we use s >= word_wrap_eol below\n            }\n\n            if (s >= word_wrap_eol)\n            {\n                x = pos.x;\n                y += line_height;\n                word_wrap_eol = NULL;\n\n                // Wrapping skips upcoming blanks\n                while (s < text_end)\n                {\n                    const char c = *s;\n                    if (ImCharIsSpace(c)) { s++; } else if (c == '\\n') { s++; break; } else { break; }\n                }\n                continue;\n            }\n        }\n\n        // Decode and advance source\n        unsigned int c = (unsigned int)*s;\n        if (c < 0x80)\n        {\n            s += 1;\n        }\n        else\n        {\n            s += ImTextCharFromUtf8(&c, s, text_end);\n            if (c == 0) // Malformed UTF-8?\n                break;\n        }\n\n        if (c < 32)\n        {\n            if (c == '\\n')\n            {\n                x = pos.x;\n                y += line_height;\n\n                if (y > clip_rect.w)\n                    break;\n                if (!word_wrap_enabled && y + line_height < clip_rect.y)\n                    while (s < text_end && *s != '\\n')  // Fast-forward to next line\n                        s++;\n                continue;\n            }\n            if (c == '\\r')\n                continue;\n        }\n\n        float char_width = 0.0f;\n        if (const ImFontGlyph* glyph = FindGlyph((unsigned short)c))\n        {\n            char_width = glyph->AdvanceX * scale;\n\n            // Arbitrarily assume that both space and tabs are empty glyphs as an optimization\n            if (c != ' ' && c != '\\t')\n            {\n                // We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w\n                float x1 = x + glyph->X0 * scale;\n                float x2 = x + glyph->X1 * scale;\n                float y1 = y + glyph->Y0 * scale;\n                float y2 = y + glyph->Y1 * scale;\n                if (x1 <= clip_rect.z && x2 >= clip_rect.x)\n                {\n                    // Render a character\n                    float u1 = glyph->U0;\n                    float v1 = glyph->V0;\n                    float u2 = glyph->U1;\n                    float v2 = glyph->V1;\n\n                    // CPU side clipping used to fit text in their frame when the frame is too small. Only does clipping for axis aligned quads.\n                    if (cpu_fine_clip)\n                    {\n                        if (x1 < clip_rect.x)\n                        {\n                            u1 = u1 + (1.0f - (x2 - clip_rect.x) / (x2 - x1)) * (u2 - u1);\n                            x1 = clip_rect.x;\n                        }\n                        if (y1 < clip_rect.y)\n                        {\n                            v1 = v1 + (1.0f - (y2 - clip_rect.y) / (y2 - y1)) * (v2 - v1);\n                            y1 = clip_rect.y;\n                        }\n                        if (x2 > clip_rect.z)\n                        {\n                            u2 = u1 + ((clip_rect.z - x1) / (x2 - x1)) * (u2 - u1);\n                            x2 = clip_rect.z;\n                        }\n                        if (y2 > clip_rect.w)\n                        {\n                            v2 = v1 + ((clip_rect.w - y1) / (y2 - y1)) * (v2 - v1);\n                            y2 = clip_rect.w;\n                        }\n                        if (y1 >= y2)\n                        {\n                            x += char_width;\n                            continue;\n                        }\n                    }\n\n                    // We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug builds. Inlined here:\n                    {\n                        idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2);\n                        idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3);\n                        vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1;\n                        vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1;\n                        vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2;\n                        vtx_write[3].pos.x = x1; vtx_write[3].pos.y = y2; vtx_write[3].col = col; vtx_write[3].uv.x = u1; vtx_write[3].uv.y = v2;\n                        vtx_write += 4;\n                        vtx_current_idx += 4;\n                        idx_write += 6;\n                    }\n                }\n            }\n        }\n\n        x += char_width;\n    }\n\n    // Give back unused vertices\n    draw_list->VtxBuffer.resize((int)(vtx_write - draw_list->VtxBuffer.Data));\n    draw_list->IdxBuffer.resize((int)(idx_write - draw_list->IdxBuffer.Data));\n    draw_list->CmdBuffer[draw_list->CmdBuffer.Size-1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size);\n    draw_list->_VtxWritePtr = vtx_write;\n    draw_list->_IdxWritePtr = idx_write;\n    draw_list->_VtxCurrentIdx = (unsigned int)draw_list->VtxBuffer.Size;\n}\n\n//-----------------------------------------------------------------------------\n// Internals Drawing Helpers\n//-----------------------------------------------------------------------------\n\nstatic inline float ImAcos01(float x)\n{\n    if (x <= 0.0f) return IM_PI * 0.5f;\n    if (x >= 1.0f) return 0.0f;\n    return acosf(x);\n    //return (-0.69813170079773212f * x * x - 0.87266462599716477f) * x + 1.5707963267948966f; // Cheap approximation, may be enough for what we do.\n}\n\n// FIXME: Cleanup and move code to ImDrawList.\nvoid ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding)\n{\n    if (x_end_norm == x_start_norm)\n        return;\n    if (x_start_norm > x_end_norm)\n        ImSwap(x_start_norm, x_end_norm);\n\n    ImVec2 p0 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_start_norm), rect.Min.y);\n    ImVec2 p1 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_end_norm), rect.Max.y);\n    if (rounding == 0.0f)\n    {\n        draw_list->AddRectFilled(p0, p1, col, 0.0f);\n        return;\n    }\n\n    rounding = ImClamp(ImMin((rect.Max.x - rect.Min.x) * 0.5f, (rect.Max.y - rect.Min.y) * 0.5f) - 1.0f, 0.0f, rounding);\n    const float inv_rounding = 1.0f / rounding;\n    const float arc0_b = ImAcos01(1.0f - (p0.x - rect.Min.x) * inv_rounding);\n    const float arc0_e = ImAcos01(1.0f - (p1.x - rect.Min.x) * inv_rounding);\n    const float x0 = ImMax(p0.x, rect.Min.x + rounding);\n    if (arc0_b == arc0_e)\n    {\n        draw_list->PathLineTo(ImVec2(x0, p1.y));\n        draw_list->PathLineTo(ImVec2(x0, p0.y));\n    }\n    else if (arc0_b == 0.0f && arc0_e == IM_PI*0.5f)\n    {\n        draw_list->PathArcToFast(ImVec2(x0, p1.y - rounding), rounding, 3, 6); // BL\n        draw_list->PathArcToFast(ImVec2(x0, p0.y + rounding), rounding, 6, 9); // TR\n    }\n    else\n    {\n        draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL\n        draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR\n    }\n    if (p1.x > rect.Min.x + rounding)\n    {\n        const float arc1_b = ImAcos01(1.0f - (rect.Max.x - p1.x) * inv_rounding);\n        const float arc1_e = ImAcos01(1.0f - (rect.Max.x - p0.x) * inv_rounding);\n        const float x1 = ImMin(p1.x, rect.Max.x - rounding);\n        if (arc1_b == arc1_e)\n        {\n            draw_list->PathLineTo(ImVec2(x1, p0.y));\n            draw_list->PathLineTo(ImVec2(x1, p1.y));\n        }\n        else if (arc1_b == 0.0f && arc1_e == IM_PI*0.5f)\n        {\n            draw_list->PathArcToFast(ImVec2(x1, p0.y + rounding), rounding, 9, 12); // TR\n            draw_list->PathArcToFast(ImVec2(x1, p1.y - rounding), rounding, 0, 3);  // BR\n        }\n        else\n        {\n            draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR\n            draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR\n        }\n    }\n    draw_list->PathFillConvex(col);\n}\n\n//-----------------------------------------------------------------------------\n// DEFAULT FONT DATA\n//-----------------------------------------------------------------------------\n// Compressed with stb_compress() then converted to a C array.\n// Use the program in extra_fonts/binary_to_compressed_c.cpp to create the array from a TTF file.\n// Decompression from stb.h (public domain) by Sean Barrett https://github.com/nothings/stb/blob/master/stb.h\n//-----------------------------------------------------------------------------\n\nstatic unsigned int stb_decompress_length(unsigned char *input)\n{\n    return (input[8] << 24) + (input[9] << 16) + (input[10] << 8) + input[11];\n}\n\nstatic unsigned char *stb__barrier, *stb__barrier2, *stb__barrier3, *stb__barrier4;\nstatic unsigned char *stb__dout;\nstatic void stb__match(unsigned char *data, unsigned int length)\n{\n    // INVERSE of memmove... write each byte before copying the next...\n    IM_ASSERT (stb__dout + length <= stb__barrier);\n    if (stb__dout + length > stb__barrier) { stb__dout += length; return; }\n    if (data < stb__barrier4) { stb__dout = stb__barrier+1; return; }\n    while (length--) *stb__dout++ = *data++;\n}\n\nstatic void stb__lit(unsigned char *data, unsigned int length)\n{\n    IM_ASSERT (stb__dout + length <= stb__barrier);\n    if (stb__dout + length > stb__barrier) { stb__dout += length; return; }\n    if (data < stb__barrier2) { stb__dout = stb__barrier+1; return; }\n    memcpy(stb__dout, data, length);\n    stb__dout += length;\n}\n\n#define stb__in2(x)   ((i[x] << 8) + i[(x)+1])\n#define stb__in3(x)   ((i[x] << 16) + stb__in2((x)+1))\n#define stb__in4(x)   ((i[x] << 24) + stb__in3((x)+1))\n\nstatic unsigned char *stb_decompress_token(unsigned char *i)\n{\n    if (*i >= 0x20) { // use fewer if's for cases that expand small\n        if (*i >= 0x80)       stb__match(stb__dout-i[1]-1, i[0] - 0x80 + 1), i += 2;\n        else if (*i >= 0x40)  stb__match(stb__dout-(stb__in2(0) - 0x4000 + 1), i[2]+1), i += 3;\n        else /* *i >= 0x20 */ stb__lit(i+1, i[0] - 0x20 + 1), i += 1 + (i[0] - 0x20 + 1);\n    } else { // more ifs for cases that expand large, since overhead is amortized\n        if (*i >= 0x18)       stb__match(stb__dout-(stb__in3(0) - 0x180000 + 1), i[3]+1), i += 4;\n        else if (*i >= 0x10)  stb__match(stb__dout-(stb__in3(0) - 0x100000 + 1), stb__in2(3)+1), i += 5;\n        else if (*i >= 0x08)  stb__lit(i+2, stb__in2(0) - 0x0800 + 1), i += 2 + (stb__in2(0) - 0x0800 + 1);\n        else if (*i == 0x07)  stb__lit(i+3, stb__in2(1) + 1), i += 3 + (stb__in2(1) + 1);\n        else if (*i == 0x06)  stb__match(stb__dout-(stb__in3(1)+1), i[4]+1), i += 5;\n        else if (*i == 0x04)  stb__match(stb__dout-(stb__in3(1)+1), stb__in2(4)+1), i += 6;\n    }\n    return i;\n}\n\nstatic unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen)\n{\n    const unsigned long ADLER_MOD = 65521;\n    unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16;\n    unsigned long blocklen, i;\n\n    blocklen = buflen % 5552;\n    while (buflen) {\n        for (i=0; i + 7 < blocklen; i += 8) {\n            s1 += buffer[0], s2 += s1;\n            s1 += buffer[1], s2 += s1;\n            s1 += buffer[2], s2 += s1;\n            s1 += buffer[3], s2 += s1;\n            s1 += buffer[4], s2 += s1;\n            s1 += buffer[5], s2 += s1;\n            s1 += buffer[6], s2 += s1;\n            s1 += buffer[7], s2 += s1;\n\n            buffer += 8;\n        }\n\n        for (; i < blocklen; ++i)\n            s1 += *buffer++, s2 += s1;\n\n        s1 %= ADLER_MOD, s2 %= ADLER_MOD;\n        buflen -= blocklen;\n        blocklen = 5552;\n    }\n    return (unsigned int)(s2 << 16) + (unsigned int)s1;\n}\n\nstatic unsigned int stb_decompress(unsigned char *output, unsigned char *i, unsigned int length)\n{\n    unsigned int olen;\n    if (stb__in4(0) != 0x57bC0000) return 0;\n    if (stb__in4(4) != 0)          return 0; // error! stream is > 4GB\n    olen = stb_decompress_length(i);\n    stb__barrier2 = i;\n    stb__barrier3 = i+length;\n    stb__barrier = output + olen;\n    stb__barrier4 = output;\n    i += 16;\n\n    stb__dout = output;\n    for (;;) {\n        unsigned char *old_i = i;\n        i = stb_decompress_token(i);\n        if (i == old_i) {\n            if (*i == 0x05 && i[1] == 0xfa) {\n                IM_ASSERT(stb__dout == output + olen);\n                if (stb__dout != output + olen) return 0;\n                if (stb_adler32(1, output, olen) != (unsigned int) stb__in4(2))\n                    return 0;\n                return olen;\n            } else {\n                IM_ASSERT(0); /* NOTREACHED */\n                return 0;\n            }\n        }\n        IM_ASSERT(stb__dout <= output + olen);\n        if (stb__dout > output + olen)\n            return 0;\n    }\n}\n\n//-----------------------------------------------------------------------------\n// ProggyClean.ttf\n// Copyright (c) 2004, 2005 Tristan Grimmer\n// MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip)\n// Download and more information at http://upperbounds.net\n//-----------------------------------------------------------------------------\n// File: 'ProggyClean.ttf' (41208 bytes)\n// Exported using binary_to_compressed_c.cpp\n//-----------------------------------------------------------------------------\nstatic const char proggy_clean_ttf_compressed_data_base85[11980+1] =\n    \"7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/\"\n    \"2*>]b(MC;$jPfY.;h^`IWM9<Lh2TlS+f-s$o6Q<BWH`YiU.xfLq$N;$0iR/GX:U(jcW2p/W*q?-qmnUCI;jHSAiFWM.R*kU@C=GH?a9wp8f$e.-4^Qg1)Q-GL(lf(r/7GrRgwV%MS=C#\"\n    \"`8ND>Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1<q-UE31#^-V'8IRUo7Qf./L>=Ke$$'5F%)]0^#0X@U.a<r:QLtFsLcL6##lOj)#.Y5<-R&KgLwqJfLgN&;Q?gI^#DY2uL\"\n    \"i@^rMl9t=cWq6##weg>$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;-<nLENhvx>-VsM.M0rJfLH2eTM`*oJMHRC`N\"\n    \"kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`&#0j@'DbG&#^$PG.Ll+DNa<XCMKEV*N)LN/N\"\n    \"*b=%Q6pia-Xg8I$<MR&,VdJe$<(7G;Ckl'&hF;;$<_=X(b.RS%%)###MPBuuE1V:v&cX&#2m#(&cV]`k9OhLMbn%s$G2,B$BfD3X*sp5#l,$R#]x_X1xKX%b5U*[r5iMfUo9U`N99hG)\"\n    \"tm+/Us9pG)XPu`<0s-)WTt(gCRxIg(%6sfh=ktMKn3j)<6<b5Sk_/0(^]AaN#(p/L>&VZ>1i%h1S9u5o@YaaW$e+b<TWFn/Z:Oh(Cx2$lNEoN^e)#CFY@@I;BOQ*sRwZtZxRcU7uW6CX\"\n    \"ow0i(?$Q[cjOd[P4d)]>ROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc.\"\n    \"x]Ip.PH^'/aqUO/$1WxLoW0[iLA<QT;5HKD+@qQ'NQ(3_PLhE48R.qAPSwQ0/WK?Z,[x?-J;jQTWA0X@KJ(_Y8N-:/M74:/-ZpKrUss?d#dZq]DAbkU*JqkL+nwX@@47`5>w=4h(9.`G\"\n    \"CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?G<Nald$qs]@]L<J7bR*>gv:[7MI2k).'2($5FNP&EQ(,)\"\n    \"U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#\"\n    \"'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM\"\n    \"_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0<q-]L_?^)1vw'.,MRsqVr.L;aN&#/EgJ)PBc[-f>+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu\"\n    \"Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/\"\n    \"/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[K<L\"\n    \"%a2E-grWVM3@2=-k22tL]4$##6We'8UJCKE[d_=%wI;'6X-GsLX4j^SgJ$##R*w,vP3wK#iiW&#*h^D&R?jp7+/u&#(AP##XU8c$fSYW-J95_-Dp[g9wcO&#M-h1OcJlc-*vpw0xUX&#\"\n    \"OQFKNX@QI'IoPp7nb,QU//MQ&ZDkKP)X<WSVL(68uVl&#c'[0#(s1X&xm$Y%B7*K:eDA323j998GXbA#pwMs-jgD$9QISB-A_(aN4xoFM^@C58D0+Q+q3n0#3U1InDjF682-SjMXJK)(\"\n    \"h$hxua_K]ul92%'BOU&#BRRh-slg8KDlr:%L71Ka:.A;%YULjDPmL<LYs8i#XwJOYaKPKc1h:'9Ke,g)b),78=I39B;xiY$bgGw-&.Zi9InXDuYa%G*f2Bq7mn9^#p1vv%#(Wi-;/Z5h\"\n    \"o;#2:;%d&#x9v68C5g?ntX0X)pT`;%pB3q7mgGN)3%(P8nTd5L7GeA-GL@+%J3u2:(Yf>et`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO\"\n    \"j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J<j$UpK<Q4a1]MupW^-\"\n    \"sj_$%[HK%'F####QRZJ::Y3EGl4'@%FkiAOg#p[##O`gukTfBHagL<LHw%q&OV0##F=6/:chIm0@eCP8X]:kFI%hl8hgO@RcBhS-@Qb$%+m=hPDLg*%K8ln(wcf3/'DW-$.lR?n[nCH-\"\n    \"eXOONTJlh:.RYF%3'p6sq:UIMA945&^HFS87@$EP2iG<-lCO$%c`uKGD3rC$x0BL8aFn--`ke%#HMP'vh1/R&O_J9'um,.<tx[@%wsJk&bUT2`0uMv7gg#qp/ij.L56'hl;.s5CUrxjO\"\n    \"M7-##.l+Au'A&O:-T72L]P`&=;ctp'XScX*rU.>-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%\"\n    \"LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$M<Jnq79VsJW/mWS*PUiq76;]/NM_>hLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]\"\n    \"%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et\"\n    \"Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$<M-SGZ':+Q_k+uvOSLiEo(<aD/K<CCc`'Lx>'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:\"\n    \"a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VB<HFF*qL(\"\n    \"$/V,;(kXZejWO`<[5?\\?ewY(*9=%wDc;,u<'9t3W-(H1th3+G]ucQ]kLs7df($/*JL]@*t7Bu_G3_7mp7<iaQjO@.kLg;x3B0lqp7Hf,^Ze7-##@/c58Mo(3;knp0%)A7?-W+eI'o8)b<\"\n    \"nKnw'Ho8C=Y>pqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<<aG/1N$#FX$0V5Y6x'aErI3I$7x%E`v<-BY,)%-?Psf*l?%C3.mM(=/M0:JxG'?\"\n    \"7WhH%o'a<-80g0NBxoO(GH<dM]n.+%q@jH?f.UsJ2Ggs&4<-e47&Kl+f//9@`b+?.TeN_&B8Ss?v;^Trk;f#YvJkl&w$]>-+k?'(<S:68tq*WoDfZu';mM?8X[ma8W%*`-=;D.(nc7/;\"\n    \")g:T1=^J$&BRV(-lTmNB6xqB[@0*o.erM*<SWF]u2=st-*(6v>^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M\"\n    \"D?@f&1'BW-)Ju<L25gl8uhVm1hL$##*8###'A3/LkKW+(^rWX?5W_8g)a(m&K8P>#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX(\"\n    \"P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs\"\n    \"bIu)'Z,*[>br5fX^:FPAWr-m2KgL<LUN098kTF&#lvo58=/vjDo;.;)Ka*hLR#/k=rKbxuV`>Q_nN6'8uTG&#1T5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q\"\n    \"h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aeg<Z'<$#4H)6,>e0jT6'N#(q%.O=?2S]u*(m<-\"\n    \"V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i\"\n    \"sZ88+dKQ)W6>J%CL<KE>`.d*(B`-n8D9oK<Up]c$X$(,)M8Zt7/[rdkqTgl-0cuGMv'?>-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P&#9r+$%CE=68>K8r0=dSC%%(@p7\"\n    \".m7jilQ02'0-VWAg<a/''3u.=4L$Y)6k/K:_[3=&jvL<L0C/2'v:^;-DIBW,B4E68:kZ;%?8(Q8BH=kO65BW?xSG&#@uU,DS*,?.+(o(#1vCS8#CHF>TlGW'b)Tq7VT9q^*^$$.:&N@@\"\n    \"$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*\"\n    \"hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u\"\n    \"@-W$U%VEQ/,,>>#)D<h#`)h0:<Q6909ua+&VU%n2:cG3FJ-%@Bj-DgLr`Hw&HAKjKjseK</xKT*)B,N9X3]krc12t'pgTV(Lv-tL[xg_%=M_q7a^x?7Ubd>#%8cY#YZ?=,`Wdxu/ae&#\"\n    \"w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$s<Eh#c&)q.MXI%#v9ROa5FZO%sF7q7Nwb&#ptUJ:aqJe$Sl68%.D###EC><?-aF&#RNQv>o8lKN%5/$(vdfq7+ebA#\"\n    \"u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(<c`Q8N)jEIF*+?P2a8g%)$q]o2aH8C&<SibC/q,(e:v;-b#6[$NtDZ84Je2KNvB#$P5?tQ3nt(0\"\n    \"d=j.LQf./Ll33+(;q3L-w=8dX$#WF&uIJ@-bfI>%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoF&#4DoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8\"\n    \"6e%B/:=>)N4xeW.*wft-;$'58-ESqr<b?UI(_%@[P46>#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#\"\n    \"b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjL<Lni;''X.`$#8+1GD\"\n    \":k$YUWsbn8ogh6rxZ2Z9]%nd+>V#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#<NEdtg(n'=S1A(Q1/I&4([%dM`,Iu'1:_hL>SfD07&6D<fp8dHM7/g+\"\n    \"tlPN9J*rKaPct&?'uBCem^jn%9_K)<,C5K3s=5g&GmJb*[SYq7K;TRLGCsM-$$;S%:Y@r7AK0pprpL<Lrh,q7e/%KWK:50I^+m'vi`3?%Zp+<-d+$L-Sv:@.o19n$s0&39;kn;S%BSq*\"\n    \"$3WoJSCLweV[aZ'MQIjO<7;X-X;&+dMLvu#^UsGEC9WEc[X(wI7#2.(F0jV*eZf<-Qv3J-c+J5AlrB#$p(H68LvEA'q3n0#m,[`*8Ft)FcYgEud]CWfm68,(aLA$@EFTgLXoBq/UPlp7\"\n    \":d[/;r_ix=:TF`S5H-b<LI&HY(K=h#)]Lk$K14lVfm:x$H<3^Ql<M`$OhapBnkup'D#L$Pb_`N*g]2e;X/Dtg,bsj&K#2[-:iYr'_wgH)NUIR8a1n#S?Yej'h8^58UbZd+^FKD*T@;6A\"\n    \"7aQC[K8d-(v6GI$x:T<&'Gp5Uf>@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-<aN((^7('#Z0wK#5GX@7\"\n    \"u][`*S^43933A4rl][`*O4CgLEl]v$1Q3AeF37dbXk,.)vj#x'd`;qgbQR%FW,2(?LO=s%Sc68%NP'##Aotl8x=BE#j1UD([3$M(]UI2LX3RpKN@;/#f'f/&_mt&F)XdF<9t4)Qa.*kT\"\n    \"LwQ'(TTB9.xH'>#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5<N?)NBS)QN*_I,?&)2'IM%L3I)X((e/dl2&8'<M\"\n    \":^#M*Q+[T.Xri.LYS3v%fF`68h;b-X[/En'CR.q7E)p'/kle2HM,u;^%OKC-N+Ll%F9CF<Nf'^#t2L,;27W:0O@6##U6W7:$rJfLWHj$#)woqBefIZ.PK<b*t7ed;p*_m;4ExK#h@&]>\"\n    \"_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%\"\n    \"hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;\"\n    \"^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmL<LD)F^%[tC'8;+9E#C$g%#5Y>q9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:\"\n    \"+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3<n-&%H%b<FDj2M<hH=&Eh<2Len$b*aTX=-8QxN)k11IM1c^j%\"\n    \"9s<L<NFSo)B?+<-(GxsF,^-Eh@$4dXhN$+#rxK8'je'D7k`e;)2pYwPA'_p9&@^18ml1^[@g4t*[JOa*[=Qp7(qJ_oOL^('7fB&Hq-:sf,sNj8xq^>$U4O]GKx'm9)b@p7YsvK3w^YR-\"\n    \"CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*\"\n    \"hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdF<TddF<9Ah-6&9tWoDlh]&1SpGMq>Ti1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IX<N+T+0MlMBPQ*Vj>SsD<U4JHY\"\n    \"8kD2)2fU/M#$e.)T4,_=8hLim[&);?UkK'-x?'(:siIfL<$pFM`i<?%W(mGDHM%>iWP,##P`%/L<eXi:@Z9C.7o=@(pXdAO/NLQ8lPl+HPOQa8wD8=^GlPa8TKI1CjhsCTSLJM'/Wl>-\"\n    \"S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n<bhPmUkMw>%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL<LoNs'6,'85`\"\n    \"0?t/'_U59@]ddF<#LdF<eWdF<OuN/45rY<-L@&#+fm>69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdF<gR@2L=FNU-<b[(9c/ML3m;Z[$oF3g)GAWqpARc=<ROu7cL5l;-[A]%/\"\n    \"+fsd;l#SafT/f*W]0=O'$(Tb<[)*@e775R-:Yob%g*>l*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj\"\n    \"M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#<IGe;__.thjZl<%w(Wk2xmp4Q@I#I9,DF]u7-P=.-_:YJ]aS@V\"\n    \"?6*C()dOp7:WL,b&3Rg/.cmM9&r^>$(>.Z-I&J(Q0Hd5Q%7Co-b`-c<N(6r@ip+AurK<m86QIth*#v;-OBqi+L7wDE-Ir8K['m+DDSLwK&/.?-V%U_%3:qKNu$_b*B-kp7NaD'QdWQPK\"\n    \"Yq[@>P)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8<FfNkgg^oIbah*#8/Qt$F&:K*-(N/'+1vMB,u()-a.VUU*#[e%gAAO(S>WlA2);Sa\"\n    \">gXm8YB`1d@K#n]76-a$U,mF<fX]idqd)<3,]J7JmW4`6]uks=4-72L(jEk+:bJ0M^q-8Dm_Z?0olP1C9Sa&H[d&c$ooQUj]Exd*3ZM@-WGW2%s',B-_M%>%Ul:#/'xoFM9QX-$.QN'>\"\n    \"[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B</R90;eZ]%Ncq;-Tl]#F>2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I\"\n    \"wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1<Vc52=u`3^o-n1'g4v58Hj&6_t7$##?M)c<$bgQ_'SY((-xkA#\"\n    \"Y(,p'H9rIVY-b,'%bCPF7.J<Up^,(dU1VY*5#WkTU>h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-u<Hp,3@e^9UB1J+ak9-TN/mhKPg+AJYd$\"\n    \"MlvAF_jCK*.O-^(63adMT->W%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)\"\n    \"i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo\"\n    \"1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P\"\n    \"iDDG)g,r%+?,$@?uou5tSe2aN_AQU*<h`e-GI7)?OK2A.d7_c)?wQ5AS@DL3r#7fSkgl6-++D:'A,uq7SvlB$pcpH'q3n0#_%dY#xCpr-l<F0NR@-##FEV6NTF6##$l84N1w?AO>'IAO\"\n    \"URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#\"\n    \";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T<XoIB&hx=T1PcDaB&;HH+-AFr?(m9HZV)FKS8JCw;SD=6[^/DZUL`EUDf]GGlG&>\"\n    \"w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#<xU?#@.i?#D:%@#HF7@#LRI@#P_[@#Tkn@#Xw*A#]-=A#a9OA#\"\n    \"d<F&#*;G##.GY##2Sl##6`($#:l:$#>xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4&#3^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4\"\n    \"A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#\"\n    \"/QHC#3^ZC#7jmC#;v)D#?,<D#C8ND#GDaD#KPsD#O]/E#g1A5#KA*1#gC17#MGd;#8(02#L-d3#rWM4#Hga1#,<w0#T.j<#O#'2#CYN1#qa^:#_4m3#o@/=#eG8=#t8J5#`+78#4uI-#\"\n    \"m3B2#SB[8#Q0@8#i[*9#iOn8#1Nm;#^sN9#qh<9#:=x-#P;K2#$%X9#bC+.#Rg;<#mN=.#MTF.#RZO.#2?)4#Y#(/#[)1/#b;L/#dAU/#0Sv;#lY$0#n`-0#sf60#(F24#wrH0#%/e0#\"\n    \"TmD<#%JSMFove:CTBEXI:<eh2g)B,3h2^G3i;#d3jD>)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP\"\n    \"GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp\"\n    \"O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#\";\n\nstatic const char* GetDefaultCompressedFontDataTTFBase85()\n{\n    return proggy_clean_ttf_compressed_data_base85;\n}\n"
  },
  {
    "path": "external/imgui/imgui_internal.h",
    "content": "// dear imgui, v1.53 WIP\n// (internals)\n\n// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!\n// Set:\n//   #define IMGUI_DEFINE_MATH_OPERATORS\n// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)\n\n#pragma once\n\n#ifndef IMGUI_VERSION\n#error Must include imgui.h before imgui_internal.h\n#endif\n\n#include <stdio.h>      // FILE*\n#include <math.h>       // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf\n\n#ifdef _MSC_VER\n#pragma warning (push)\n#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport)\n#endif\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wunused-function\"        // for stb_textedit.h\n#pragma clang diagnostic ignored \"-Wmissing-prototypes\"     // for stb_textedit.h\n#pragma clang diagnostic ignored \"-Wold-style-cast\"\n#endif\n\n//-----------------------------------------------------------------------------\n// Forward Declarations\n//-----------------------------------------------------------------------------\n\nstruct ImRect;\nstruct ImGuiColMod;\nstruct ImGuiStyleMod;\nstruct ImGuiGroupData;\nstruct ImGuiSimpleColumns;\nstruct ImGuiDrawContext;\nstruct ImGuiTextEditState;\nstruct ImGuiIniData;\nstruct ImGuiMouseCursorData;\nstruct ImGuiPopupRef;\nstruct ImGuiWindow;\n\ntypedef int ImGuiLayoutType;        // enum: horizontal or vertical             // enum ImGuiLayoutType_\ntypedef int ImGuiButtonFlags;       // flags: for ButtonEx(), ButtonBehavior()  // enum ImGuiButtonFlags_\ntypedef int ImGuiItemFlags;         // flags: for PushItemFlag()                // enum ImGuiItemFlags_\ntypedef int ImGuiSeparatorFlags;    // flags: for Separator() - internal        // enum ImGuiSeparatorFlags_\ntypedef int ImGuiSliderFlags;       // flags: for SliderBehavior()              // enum ImGuiSliderFlags_\n\n//-------------------------------------------------------------------------\n// STB libraries\n//-------------------------------------------------------------------------\n\nnamespace ImGuiStb\n{\n\n#undef STB_TEXTEDIT_STRING\n#undef STB_TEXTEDIT_CHARTYPE\n#define STB_TEXTEDIT_STRING             ImGuiTextEditState\n#define STB_TEXTEDIT_CHARTYPE           ImWchar\n#define STB_TEXTEDIT_GETWIDTH_NEWLINE   -1.0f\n#include \"stb_textedit.h\"\n\n} // namespace ImGuiStb\n\n//-----------------------------------------------------------------------------\n// Context\n//-----------------------------------------------------------------------------\n\n#ifndef GImGui\nextern IMGUI_API ImGuiContext* GImGui;  // Current implicit ImGui context pointer\n#endif\n\n//-----------------------------------------------------------------------------\n// Helpers\n//-----------------------------------------------------------------------------\n\n#define IM_PI                       3.14159265358979323846f\n#define IM_OFFSETOF(_TYPE,_ELM)     ((size_t)&(((_TYPE*)0)->_ELM))\n\n// Helpers: UTF-8 <> wchar\nIMGUI_API int           ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end);      // return output UTF-8 bytes count\nIMGUI_API int           ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end);          // return input UTF-8 bytes count\nIMGUI_API int           ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL);   // return input UTF-8 bytes count\nIMGUI_API int           ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end);                            // return number of UTF-8 code-points (NOT bytes count)\nIMGUI_API int           ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end);                   // return number of bytes to express string as UTF-8 code-points\n\n// Helpers: Misc\nIMGUI_API ImU32         ImHash(const void* data, int data_size, ImU32 seed = 0);    // Pass data_size==0 for zero-terminated strings\nIMGUI_API void*         ImFileLoadToMemory(const char* filename, const char* file_open_mode, int* out_file_size = NULL, int padding_bytes = 0);\nIMGUI_API FILE*         ImFileOpen(const char* filename, const char* file_open_mode);\nstatic inline bool      ImCharIsSpace(int c)            { return c == ' ' || c == '\\t' || c == 0x3000; }\nstatic inline bool      ImIsPowerOfTwo(int v)           { return v != 0 && (v & (v - 1)) == 0; }\nstatic inline int       ImUpperPowerOfTwo(int v)        { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }\n\n// Helpers: Geometry\nIMGUI_API ImVec2        ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);\nIMGUI_API bool          ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);\nIMGUI_API ImVec2        ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);\nIMGUI_API void          ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);\n\n// Helpers: String\nIMGUI_API int           ImStricmp(const char* str1, const char* str2);\nIMGUI_API int           ImStrnicmp(const char* str1, const char* str2, int count);\nIMGUI_API void          ImStrncpy(char* dst, const char* src, int count);\nIMGUI_API char*         ImStrdup(const char* str);\nIMGUI_API int           ImStrlenW(const ImWchar* str);\nIMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line\nIMGUI_API const char*   ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);\nIMGUI_API int           ImFormatString(char* buf, int buf_size, const char* fmt, ...) IM_FMTARGS(3);\nIMGUI_API int           ImFormatStringV(char* buf, int buf_size, const char* fmt, va_list args) IM_FMTLIST(3);\n\n// Helpers: Math\n// We are keeping those not leaking to the user by default, in the case the user has implicit cast operators between ImVec2 and its own types (when IM_VEC2_CLASS_EXTRA is defined)\n#ifdef IMGUI_DEFINE_MATH_OPERATORS\nstatic inline ImVec2 operator*(const ImVec2& lhs, const float rhs)              { return ImVec2(lhs.x*rhs, lhs.y*rhs); }\nstatic inline ImVec2 operator/(const ImVec2& lhs, const float rhs)              { return ImVec2(lhs.x/rhs, lhs.y/rhs); }\nstatic inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs)            { return ImVec2(lhs.x+rhs.x, lhs.y+rhs.y); }\nstatic inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs)            { return ImVec2(lhs.x-rhs.x, lhs.y-rhs.y); }\nstatic inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs)            { return ImVec2(lhs.x*rhs.x, lhs.y*rhs.y); }\nstatic inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs)            { return ImVec2(lhs.x/rhs.x, lhs.y/rhs.y); }\nstatic inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs)                { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }\nstatic inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs)                { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }\nstatic inline ImVec2& operator*=(ImVec2& lhs, const float rhs)                  { lhs.x *= rhs; lhs.y *= rhs; return lhs; }\nstatic inline ImVec2& operator/=(ImVec2& lhs, const float rhs)                  { lhs.x /= rhs; lhs.y /= rhs; return lhs; }\nstatic inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs)            { return ImVec4(lhs.x+rhs.x, lhs.y+rhs.y, lhs.z+rhs.z, lhs.w+rhs.w); }\nstatic inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs)            { return ImVec4(lhs.x-rhs.x, lhs.y-rhs.y, lhs.z-rhs.z, lhs.w-rhs.w); }\nstatic inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs)            { return ImVec4(lhs.x*rhs.x, lhs.y*rhs.y, lhs.z*rhs.z, lhs.w*rhs.w); }\n#endif\n\nstatic inline int    ImMin(int lhs, int rhs)                                    { return lhs < rhs ? lhs : rhs; }\nstatic inline int    ImMax(int lhs, int rhs)                                    { return lhs >= rhs ? lhs : rhs; }\nstatic inline float  ImMin(float lhs, float rhs)                                { return lhs < rhs ? lhs : rhs; }\nstatic inline float  ImMax(float lhs, float rhs)                                { return lhs >= rhs ? lhs : rhs; }\nstatic inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs)                { return ImVec2(ImMin(lhs.x,rhs.x), ImMin(lhs.y,rhs.y)); }\nstatic inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs)                { return ImVec2(ImMax(lhs.x,rhs.x), ImMax(lhs.y,rhs.y)); }\nstatic inline int    ImClamp(int v, int mn, int mx)                             { return (v < mn) ? mn : (v > mx) ? mx : v; }\nstatic inline float  ImClamp(float v, float mn, float mx)                       { return (v < mn) ? mn : (v > mx) ? mx : v; }\nstatic inline ImVec2 ImClamp(const ImVec2& f, const ImVec2& mn, ImVec2 mx)      { return ImVec2(ImClamp(f.x,mn.x,mx.x), ImClamp(f.y,mn.y,mx.y)); }\nstatic inline float  ImSaturate(float f)                                        { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }\nstatic inline void   ImSwap(int& a, int& b)                                     { int tmp = a; a = b; b = tmp; }\nstatic inline void   ImSwap(float& a, float& b)                                 { float tmp = a; a = b; b = tmp; }\nstatic inline int    ImLerp(int a, int b, float t)                              { return (int)(a + (b - a) * t); }\nstatic inline float  ImLerp(float a, float b, float t)                          { return a + (b - a) * t; }\nstatic inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t)          { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); }\nstatic inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t)  { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); }\nstatic inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t)          { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); }\nstatic inline float  ImLengthSqr(const ImVec2& lhs)                             { return lhs.x*lhs.x + lhs.y*lhs.y; }\nstatic inline float  ImLengthSqr(const ImVec4& lhs)                             { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; }\nstatic inline float  ImInvLength(const ImVec2& lhs, float fail_value)           { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / sqrtf(d); return fail_value; }\nstatic inline float  ImFloor(float f)                                           { return (float)(int)f; }\nstatic inline ImVec2 ImFloor(const ImVec2& v)                                   { return ImVec2((float)(int)v.x, (float)(int)v.y); }\nstatic inline float  ImDot(const ImVec2& a, const ImVec2& b)                    { return a.x * b.x + a.y * b.y; }\nstatic inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a)        { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); }\nstatic inline float  ImLinearSweep(float current, float target, float speed)    { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; }\nstatic inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs)                { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }\n\n// We call C++ constructor on own allocated memory via the placement \"new(ptr) Type()\" syntax.\n// Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.\nstruct ImPlacementNewDummy {};\ninline void* operator new(size_t, ImPlacementNewDummy, void* ptr) { return ptr; }\ninline void operator delete(void*, ImPlacementNewDummy, void*) {}\n#define IM_PLACEMENT_NEW(_PTR)  new(ImPlacementNewDummy(), _PTR)\n\n//-----------------------------------------------------------------------------\n// Types\n//-----------------------------------------------------------------------------\n\nenum ImGuiButtonFlags_\n{\n    ImGuiButtonFlags_Repeat                 = 1 << 0,   // hold to repeat\n    ImGuiButtonFlags_PressedOnClickRelease  = 1 << 1,   // return true on click + release on same item [DEFAULT if no PressedOn* flag is set]\n    ImGuiButtonFlags_PressedOnClick         = 1 << 2,   // return true on click (default requires click+release)\n    ImGuiButtonFlags_PressedOnRelease       = 1 << 3,   // return true on release (default requires click+release)\n    ImGuiButtonFlags_PressedOnDoubleClick   = 1 << 4,   // return true on double-click (default requires click+release)\n    ImGuiButtonFlags_FlattenChilds          = 1 << 5,   // allow interactions even if a child window is overlapping\n    ImGuiButtonFlags_DontClosePopups        = 1 << 6,   // disable automatically closing parent popup on press // [UNUSED]\n    ImGuiButtonFlags_Disabled               = 1 << 7,   // disable interactions\n    ImGuiButtonFlags_AlignTextBaseLine      = 1 << 8,   // vertically align button to match text baseline (ButtonEx() only)\n    ImGuiButtonFlags_NoKeyModifiers         = 1 << 9,   // disable interaction if a key modifier is held\n    ImGuiButtonFlags_AllowOverlapMode       = 1 << 10,  // require previous frame HoveredId to either match id or be null before being usable\n    ImGuiButtonFlags_NoHoldingActiveID      = 1 << 11   // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)\n};\n\nenum ImGuiSliderFlags_\n{\n    ImGuiSliderFlags_Vertical               = 1 << 0\n};\n\nenum ImGuiColumnsFlags_\n{\n    // Default: 0\n    ImGuiColumnsFlags_NoBorder              = 1 << 0,   // Disable column dividers\n    ImGuiColumnsFlags_NoResize              = 1 << 1,   // Disable resizing columns when clicking on the dividers\n    ImGuiColumnsFlags_NoPreserveWidths      = 1 << 2,   // Disable column width preservation when adjusting columns\n    ImGuiColumnsFlags_NoForceWithinWindow   = 1 << 3,   // Disable forcing columns to fit within window\n    ImGuiColumnsFlags_GrowParentContentsSize= 1 << 4,   // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.\n};\n\nenum ImGuiSelectableFlagsPrivate_\n{\n    // NB: need to be in sync with last value of ImGuiSelectableFlags_\n    ImGuiSelectableFlags_Menu               = 1 << 3,\n    ImGuiSelectableFlags_MenuItem           = 1 << 4,\n    ImGuiSelectableFlags_Disabled           = 1 << 5,\n    ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 6\n};\n\nenum ImGuiSeparatorFlags_\n{\n    ImGuiSeparatorFlags_Horizontal          = 1 << 0,   // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar\n    ImGuiSeparatorFlags_Vertical            = 1 << 1\n};\n\n// FIXME: this is in development, not exposed/functional as a generic feature yet.\nenum ImGuiLayoutType_\n{\n    ImGuiLayoutType_Vertical,\n    ImGuiLayoutType_Horizontal\n};\n\nenum ImGuiAxis\n{\n    ImGuiAxis_None = -1,\n    ImGuiAxis_X = 0,\n    ImGuiAxis_Y = 1,\n};\n\nenum ImGuiPlotType\n{\n    ImGuiPlotType_Lines,\n    ImGuiPlotType_Histogram\n};\n\nenum ImGuiDataType\n{\n    ImGuiDataType_Int,\n    ImGuiDataType_Float,\n    ImGuiDataType_Float2\n};\n\nenum ImGuiDir\n{\n    ImGuiDir_None    = -1,\n    ImGuiDir_Left    = 0,\n    ImGuiDir_Right   = 1,\n    ImGuiDir_Up      = 2,\n    ImGuiDir_Down    = 3\n};\n\n// 2D axis aligned bounding-box\n// NB: we can't rely on ImVec2 math operators being available here\nstruct IMGUI_API ImRect\n{\n    ImVec2      Min;    // Upper-left\n    ImVec2      Max;    // Lower-right\n\n    ImRect()                                        : Min(FLT_MAX,FLT_MAX), Max(-FLT_MAX,-FLT_MAX)  {}\n    ImRect(const ImVec2& min, const ImVec2& max)    : Min(min), Max(max)                            {}\n    ImRect(const ImVec4& v)                         : Min(v.x, v.y), Max(v.z, v.w)                  {}\n    ImRect(float x1, float y1, float x2, float y2)  : Min(x1, y1), Max(x2, y2)                      {}\n\n    ImVec2      GetCenter() const               { return ImVec2((Min.x+Max.x)*0.5f, (Min.y+Max.y)*0.5f); }\n    ImVec2      GetSize() const                 { return ImVec2(Max.x-Min.x, Max.y-Min.y); }\n    float       GetWidth() const                { return Max.x-Min.x; }\n    float       GetHeight() const               { return Max.y-Min.y; }\n    ImVec2      GetTL() const                   { return Min; }                   // Top-left\n    ImVec2      GetTR() const                   { return ImVec2(Max.x, Min.y); }  // Top-right\n    ImVec2      GetBL() const                   { return ImVec2(Min.x, Max.y); }  // Bottom-left\n    ImVec2      GetBR() const                   { return Max; }                   // Bottom-right\n    bool        Contains(const ImVec2& p) const { return p.x >= Min.x     && p.y >= Min.y     && p.x < Max.x     && p.y < Max.y; }\n    bool        Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x < Max.x && r.Max.y < Max.y; }\n    bool        Overlaps(const ImRect& r) const { return r.Min.y < Max.y  && r.Max.y > Min.y  && r.Min.x < Max.x && r.Max.x > Min.x; }\n    void        Add(const ImVec2& rhs)          { if (Min.x > rhs.x)     Min.x = rhs.x;     if (Min.y > rhs.y) Min.y = rhs.y;         if (Max.x < rhs.x) Max.x = rhs.x;         if (Max.y < rhs.y) Max.y = rhs.y; }\n    void        Add(const ImRect& rhs)          { if (Min.x > rhs.Min.x) Min.x = rhs.Min.x; if (Min.y > rhs.Min.y) Min.y = rhs.Min.y; if (Max.x < rhs.Max.x) Max.x = rhs.Max.x; if (Max.y < rhs.Max.y) Max.y = rhs.Max.y; }\n    void        Expand(const float amount)      { Min.x -= amount;   Min.y -= amount;   Max.x += amount;   Max.y += amount; }\n    void        Expand(const ImVec2& amount)    { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }\n    void        Translate(const ImVec2& v)      { Min.x += v.x; Min.y += v.y; Max.x += v.x; Max.y += v.y; }\n    void        ClipWith(const ImRect& clip)    { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; }\n    void        Floor()                         { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }\n    ImVec2      GetClosestPoint(ImVec2 p, bool on_edge) const\n    {\n        if (!on_edge && Contains(p))\n            return p;\n        if (p.x > Max.x) p.x = Max.x;\n        else if (p.x < Min.x) p.x = Min.x;\n        if (p.y > Max.y) p.y = Max.y;\n        else if (p.y < Min.y) p.y = Min.y;\n        return p;\n    }\n};\n\n// Stacked color modifier, backup of modified data so we can restore it\nstruct ImGuiColMod\n{\n    ImGuiCol    Col;\n    ImVec4      BackupValue;\n};\n\n// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.\nstruct ImGuiStyleMod\n{\n    ImGuiStyleVar   VarIdx;\n    union           { int BackupInt[2]; float BackupFloat[2]; };\n    ImGuiStyleMod(ImGuiStyleVar idx, int v)     { VarIdx = idx; BackupInt[0] = v; }\n    ImGuiStyleMod(ImGuiStyleVar idx, float v)   { VarIdx = idx; BackupFloat[0] = v; }\n    ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v)  { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }\n};\n\n// Stacked data for BeginGroup()/EndGroup()\nstruct ImGuiGroupData\n{\n    ImVec2      BackupCursorPos;\n    ImVec2      BackupCursorMaxPos;\n    float       BackupIndentX;\n    float       BackupGroupOffsetX;\n    float       BackupCurrentLineHeight;\n    float       BackupCurrentLineTextBaseOffset;\n    float       BackupLogLinePosY;\n    bool        BackupActiveIdIsAlive;\n    bool        AdvanceCursor;\n};\n\n// Per column data for Columns()\nstruct ImGuiColumnData\n{\n    float       OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)\n    ImRect      ClipRect;\n    //float     IndentX;\n};\n\n// Simple column measurement currently used for MenuItem() only. This is very short-sighted/throw-away code and NOT a generic helper.\nstruct IMGUI_API ImGuiSimpleColumns\n{\n    int         Count;\n    float       Spacing;\n    float       Width, NextWidth;\n    float       Pos[8], NextWidths[8];\n\n    ImGuiSimpleColumns();\n    void        Update(int count, float spacing, bool clear);\n    float       DeclColumns(float w0, float w1, float w2);\n    float       CalcExtraSpace(float avail_w);\n};\n\n// Internal state of the currently focused/edited text input box\nstruct IMGUI_API ImGuiTextEditState\n{\n    ImGuiID             Id;                         // widget id owning the text state\n    ImVector<ImWchar>   Text;                       // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.\n    ImVector<char>      InitialText;                // backup of end-user buffer at the time of focus (in UTF-8, unaltered)\n    ImVector<char>      TempTextBuffer;\n    int                 CurLenA, CurLenW;           // we need to maintain our buffer length in both UTF-8 and wchar format.\n    int                 BufSizeA;                   // end-user buffer size\n    float               ScrollX;\n    ImGuiStb::STB_TexteditState   StbState;\n    float               CursorAnim;\n    bool                CursorFollow;\n    bool                SelectedAllMouseLock;\n\n    ImGuiTextEditState()                            { memset(this, 0, sizeof(*this)); }\n    void                CursorAnimReset()           { CursorAnim = -0.30f; }                                   // After a user-input the cursor stays on for a while without blinking\n    void                CursorClamp()               { StbState.cursor = ImMin(StbState.cursor, CurLenW); StbState.select_start = ImMin(StbState.select_start, CurLenW); StbState.select_end = ImMin(StbState.select_end, CurLenW); }\n    bool                HasSelection() const        { return StbState.select_start != StbState.select_end; }\n    void                ClearSelection()            { StbState.select_start = StbState.select_end = StbState.cursor; }\n    void                SelectAll()                 { StbState.select_start = 0; StbState.select_end = CurLenW; StbState.cursor = StbState.select_end; StbState.has_preferred_x = false; }\n    void                OnKeyPressed(int key);\n};\n\n// Data saved in imgui.ini file\nstruct ImGuiIniData\n{\n    char*       Name;\n    ImGuiID     Id;\n    ImVec2      Pos;\n    ImVec2      Size;\n    bool        Collapsed;\n};\n\n// Mouse cursor data (used when io.MouseDrawCursor is set)\nstruct ImGuiMouseCursorData\n{\n    ImGuiMouseCursor    Type;\n    ImVec2              HotOffset;\n    ImVec2              Size;\n    ImVec2              TexUvMin[2];\n    ImVec2              TexUvMax[2];\n};\n\n// Storage for current popup stack\nstruct ImGuiPopupRef\n{\n    ImGuiID         PopupId;        // Set on OpenPopup()\n    ImGuiWindow*    Window;         // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()\n    ImGuiWindow*    ParentWindow;   // Set on OpenPopup()\n    ImGuiID         ParentMenuSet;  // Set on OpenPopup()\n    ImVec2          MousePosOnOpen; // Copy of mouse position at the time of opening popup\n\n    ImGuiPopupRef(ImGuiID id, ImGuiWindow* parent_window, ImGuiID parent_menu_set, const ImVec2& mouse_pos) { PopupId = id; Window = NULL; ParentWindow = parent_window; ParentMenuSet = parent_menu_set; MousePosOnOpen = mouse_pos; }\n};\n\n// Main state for ImGui\nstruct ImGuiContext\n{\n    bool                    Initialized;\n    ImGuiIO                 IO;\n    ImGuiStyle              Style;\n    ImFont*                 Font;                               // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()\n    float                   FontSize;                           // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.\n    float                   FontBaseSize;                       // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.\n    ImVec2                  FontTexUvWhitePixel;                // (Shortcut) == Font->TexUvWhitePixel\n\n    float                   Time;\n    int                     FrameCount;\n    int                     FrameCountEnded;\n    int                     FrameCountRendered;\n    ImVector<ImGuiWindow*>  Windows;\n    ImVector<ImGuiWindow*>  WindowsSortBuffer;\n    ImVector<ImGuiWindow*>  CurrentWindowStack;\n    ImGuiStorage            WindowsById;\n    ImGuiWindow*            CurrentWindow;                      // Being drawn into\n    ImGuiWindow*            NavWindow;                          // Nav/focused window for navigation\n    ImGuiWindow*            HoveredWindow;                      // Will catch mouse inputs\n    ImGuiWindow*            HoveredRootWindow;                  // Will catch mouse inputs (for focus/move only)\n    ImGuiID                 HoveredId;                          // Hovered widget\n    bool                    HoveredIdAllowOverlap;\n    ImGuiID                 HoveredIdPreviousFrame;\n    float                   HoveredIdTimer;\n    ImGuiID                 ActiveId;                           // Active widget\n    ImGuiID                 ActiveIdPreviousFrame;\n    float                   ActiveIdTimer;\n    bool                    ActiveIdIsAlive;                    // Active widget has been seen this frame\n    bool                    ActiveIdIsJustActivated;            // Set at the time of activation for one frame\n    bool                    ActiveIdAllowOverlap;               // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)\n    ImVec2                  ActiveIdClickOffset;                // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)\n    ImGuiWindow*            ActiveIdWindow;\n    ImGuiWindow*            MovingWindow;                       // Track the child window we clicked on to move a window.\n    ImGuiID                 MovingWindowMoveId;                 // == MovingWindow->MoveId\n    ImVector<ImGuiIniData>  Settings;                           // .ini Settings\n    float                   SettingsDirtyTimer;                 // Save .ini Settings on disk when time reaches zero\n    ImVector<ImGuiColMod>   ColorModifiers;                     // Stack for PushStyleColor()/PopStyleColor()\n    ImVector<ImGuiStyleMod> StyleModifiers;                     // Stack for PushStyleVar()/PopStyleVar()\n    ImVector<ImFont*>       FontStack;                          // Stack for PushFont()/PopFont()\n    ImVector<ImGuiPopupRef> OpenPopupStack;                     // Which popups are open (persistent)\n    ImVector<ImGuiPopupRef> CurrentPopupStack;                  // Which level of BeginPopup() we are in (reset every frame)\n\n    // Storage for SetNexWindow** and SetNextTreeNode*** functions\n    ImVec2                  SetNextWindowPosVal;\n    ImVec2                  SetNextWindowPosPivot;\n    ImVec2                  SetNextWindowSizeVal;\n    ImVec2                  SetNextWindowContentSizeVal;\n    bool                    SetNextWindowCollapsedVal;\n    ImGuiCond               SetNextWindowPosCond;\n    ImGuiCond               SetNextWindowSizeCond;\n    ImGuiCond               SetNextWindowContentSizeCond;\n    ImGuiCond               SetNextWindowCollapsedCond;\n    ImRect                  SetNextWindowSizeConstraintRect;           // Valid if 'SetNextWindowSizeConstraint' is true\n    ImGuiSizeConstraintCallback SetNextWindowSizeConstraintCallback;\n    void*                   SetNextWindowSizeConstraintCallbackUserData;\n    bool                    SetNextWindowSizeConstraint;\n    bool                    SetNextWindowFocus;\n    bool                    SetNextTreeNodeOpenVal;\n    ImGuiCond               SetNextTreeNodeOpenCond;\n\n    // Render\n    ImDrawData              RenderDrawData;                     // Main ImDrawData instance to pass render information to the user\n    ImVector<ImDrawList*>   RenderDrawLists[3];\n    float                   ModalWindowDarkeningRatio;\n    ImDrawList              OverlayDrawList;                    // Optional software render of mouse cursors, if io.MouseDrawCursor is set + a few debug overlays\n    ImGuiMouseCursor        MouseCursor;\n    ImGuiMouseCursorData    MouseCursorData[ImGuiMouseCursor_Count_];\n\n    // Widget state\n    ImGuiTextEditState      InputTextState;\n    ImFont                  InputTextPasswordFont;\n    ImGuiID                 ScalarAsInputTextId;                // Temporary text input when CTRL+clicking on a slider, etc.\n    ImGuiColorEditFlags     ColorEditOptions;                   // Store user options for color edit widgets\n    ImVec4                  ColorPickerRef;\n    float                   DragCurrentValue;                   // Currently dragged value, always float, not rounded by end-user precision settings\n    ImVec2                  DragLastMouseDelta;\n    float                   DragSpeedDefaultRatio;              // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio\n    float                   DragSpeedScaleSlow;\n    float                   DragSpeedScaleFast;\n    ImVec2                  ScrollbarClickDeltaToGrabCenter;    // Distance between mouse and center of grab box, normalized in parent space. Use storage?\n    int                     TooltipOverrideCount;\n    ImVector<char>          PrivateClipboard;                   // If no custom clipboard handler is defined\n    ImVec2                  OsImePosRequest, OsImePosSet;       // Cursor position request & last passed to the OS Input Method Editor\n\n    // Logging\n    bool                    LogEnabled;\n    FILE*                   LogFile;                            // If != NULL log to stdout/ file\n    ImGuiTextBuffer*        LogClipboard;                       // Else log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.\n    int                     LogStartDepth;\n    int                     LogAutoExpandMaxDepth;\n\n    // Misc\n    float                   FramerateSecPerFrame[120];          // calculate estimate of framerate for user\n    int                     FramerateSecPerFrameIdx;\n    float                   FramerateSecPerFrameAccum;\n    int                     WantCaptureMouseNextFrame;          // explicit capture via CaptureInputs() sets those flags\n    int                     WantCaptureKeyboardNextFrame;\n    int                     WantTextInputNextFrame;\n    char                    TempBuffer[1024*3+1];               // temporary text buffer\n\n    ImGuiContext()\n    {\n        Initialized = false;\n        Font = NULL;\n        FontSize = FontBaseSize = 0.0f;\n        FontTexUvWhitePixel = ImVec2(0.0f, 0.0f);\n\n        Time = 0.0f;\n        FrameCount = 0;\n        FrameCountEnded = FrameCountRendered = -1;\n        CurrentWindow = NULL;\n        NavWindow = NULL;\n        HoveredWindow = NULL;\n        HoveredRootWindow = NULL;\n        HoveredId = 0;\n        HoveredIdAllowOverlap = false;\n        HoveredIdPreviousFrame = 0;\n        HoveredIdTimer = 0.0f;\n        ActiveId = 0;\n        ActiveIdPreviousFrame = 0;\n        ActiveIdTimer = 0.0f;\n        ActiveIdIsAlive = false;\n        ActiveIdIsJustActivated = false;\n        ActiveIdAllowOverlap = false;\n        ActiveIdClickOffset = ImVec2(-1,-1);\n        ActiveIdWindow = NULL;\n        MovingWindow = NULL;\n        MovingWindowMoveId = 0;\n        SettingsDirtyTimer = 0.0f;\n\n        SetNextWindowPosVal = ImVec2(0.0f, 0.0f);\n        SetNextWindowSizeVal = ImVec2(0.0f, 0.0f);\n        SetNextWindowCollapsedVal = false;\n        SetNextWindowPosCond = 0;\n        SetNextWindowSizeCond = 0;\n        SetNextWindowContentSizeCond = 0;\n        SetNextWindowCollapsedCond = 0;\n        SetNextWindowSizeConstraintRect = ImRect();\n        SetNextWindowSizeConstraintCallback = NULL;\n        SetNextWindowSizeConstraintCallbackUserData = NULL;\n        SetNextWindowSizeConstraint = false;\n        SetNextWindowFocus = false;\n        SetNextTreeNodeOpenVal = false;\n        SetNextTreeNodeOpenCond = 0;\n\n        ScalarAsInputTextId = 0;\n        ColorEditOptions = ImGuiColorEditFlags__OptionsDefault;\n        DragCurrentValue = 0.0f;\n        DragLastMouseDelta = ImVec2(0.0f, 0.0f);\n        DragSpeedDefaultRatio = 1.0f / 100.0f;\n        DragSpeedScaleSlow = 1.0f / 100.0f;\n        DragSpeedScaleFast = 10.0f;\n        ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f);\n        TooltipOverrideCount = 0;\n        OsImePosRequest = OsImePosSet = ImVec2(-1.0f, -1.0f);\n\n        ModalWindowDarkeningRatio = 0.0f;\n        OverlayDrawList._OwnerName = \"##Overlay\"; // Give it a name for debugging\n        MouseCursor = ImGuiMouseCursor_Arrow;\n        memset(MouseCursorData, 0, sizeof(MouseCursorData));\n\n        LogEnabled = false;\n        LogFile = NULL;\n        LogClipboard = NULL;\n        LogStartDepth = 0;\n        LogAutoExpandMaxDepth = 2;\n\n        memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));\n        FramerateSecPerFrameIdx = 0;\n        FramerateSecPerFrameAccum = 0.0f;\n        WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;\n        memset(TempBuffer, 0, sizeof(TempBuffer));\n    }\n};\n\n// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().\nenum ImGuiItemFlags_\n{\n    ImGuiItemFlags_AllowKeyboardFocus           = 1 << 0,  // true\n    ImGuiItemFlags_ButtonRepeat                 = 1 << 1,  // false    // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.\n    ImGuiItemFlags_Disabled                     = 1 << 2,  // false    // FIXME-WIP: Disable interactions but doesn't affect visuals. Should be: grey out and disable interactions with widgets that affect data + view widgets (WIP) \n    //ImGuiItemFlags_NoNav                      = 1 << 3,  // false\n    //ImGuiItemFlags_NoNavDefaultFocus          = 1 << 4,  // false\n    ImGuiItemFlags_SelectableDontClosePopup     = 1 << 5,  // false    // MenuItem/Selectable() automatically closes current Popup window\n    ImGuiItemFlags_Default_                     = ImGuiItemFlags_AllowKeyboardFocus\n};\n\n// Transient per-window data, reset at the beginning of the frame\n// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiDrawContext is quite tenuous and could be reconsidered.\nstruct IMGUI_API ImGuiDrawContext\n{\n    ImVec2                  CursorPos;\n    ImVec2                  CursorPosPrevLine;\n    ImVec2                  CursorStartPos;\n    ImVec2                  CursorMaxPos;           // Implicitly calculate the size of our contents, always extending. Saved into window->SizeContents at the end of the frame\n    float                   CurrentLineHeight;\n    float                   CurrentLineTextBaseOffset;\n    float                   PrevLineHeight;\n    float                   PrevLineTextBaseOffset;\n    float                   LogLinePosY;\n    int                     TreeDepth;\n    ImGuiID                 LastItemId;\n    ImRect                  LastItemRect;\n    bool                    LastItemRectHoveredRect;\n    bool                    MenuBarAppending;\n    float                   MenuBarOffsetX;\n    ImVector<ImGuiWindow*>  ChildWindows;\n    ImGuiStorage*           StateStorage;\n    ImGuiLayoutType         LayoutType;\n\n    // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings.\n    ImGuiItemFlags          ItemFlags;              // == ItemFlagsStack.back() [empty == ImGuiItemFlags_Default]\n    float                   ItemWidth;              // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window\n    float                   TextWrapPos;            // == TextWrapPosStack.back() [empty == -1.0f]\n    ImVector<ImGuiItemFlags>ItemFlagsStack;\n    ImVector<float>         ItemWidthStack;\n    ImVector<float>         TextWrapPosStack;\n    ImVector<ImGuiGroupData>GroupStack;\n    int                     StackSizesBackup[6];    // Store size of various stacks for asserting\n\n    float                   IndentX;                // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)\n    float                   GroupOffsetX;\n    float                   ColumnsOffsetX;         // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.\n    int                     ColumnsCurrent;\n    int                     ColumnsCount;\n    float                   ColumnsMinX;\n    float                   ColumnsMaxX;\n    float                   ColumnsStartPosY;\n    float                   ColumnsStartMaxPosX;   // Backup of CursorMaxPos\n    float                   ColumnsCellMinY;\n    float                   ColumnsCellMaxY;\n    ImGuiColumnsFlags       ColumnsFlags;\n    ImGuiID                 ColumnsSetId;\n    ImVector<ImGuiColumnData> ColumnsData;\n\n    ImGuiDrawContext()\n    {\n        CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f);\n        CurrentLineHeight = PrevLineHeight = 0.0f;\n        CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f;\n        LogLinePosY = -1.0f;\n        TreeDepth = 0;\n        LastItemId = 0;\n        LastItemRect = ImRect();\n        LastItemRectHoveredRect = false;\n        MenuBarAppending = false;\n        MenuBarOffsetX = 0.0f;\n        StateStorage = NULL;\n        LayoutType = ImGuiLayoutType_Vertical;\n        ItemWidth = 0.0f;\n        ItemFlags = ImGuiItemFlags_Default_;\n        TextWrapPos = -1.0f;\n        memset(StackSizesBackup, 0, sizeof(StackSizesBackup));\n\n        IndentX = 0.0f;\n        GroupOffsetX = 0.0f;\n        ColumnsOffsetX = 0.0f;\n        ColumnsCurrent = 0;\n        ColumnsCount = 1;\n        ColumnsMinX = ColumnsMaxX = 0.0f;\n        ColumnsStartPosY = 0.0f;\n        ColumnsStartMaxPosX = 0.0f;\n        ColumnsCellMinY = ColumnsCellMaxY = 0.0f;\n        ColumnsFlags = 0;\n        ColumnsSetId = 0;\n    }\n};\n\n// Windows data\nstruct IMGUI_API ImGuiWindow\n{\n    char*                   Name;\n    ImGuiID                 ID;                                 // == ImHash(Name)\n    ImGuiWindowFlags        Flags;                              // See enum ImGuiWindowFlags_\n    int                     OrderWithinParent;                  // Order within immediate parent window, if we are a child window. Otherwise 0.\n    ImVec2                  PosFloat;\n    ImVec2                  Pos;                                // Position rounded-up to nearest pixel\n    ImVec2                  Size;                               // Current size (==SizeFull or collapsed title bar size)\n    ImVec2                  SizeFull;                           // Size when non collapsed\n    ImVec2                  SizeContents;                       // Size of contents (== extents reach of the drawing cursor) from previous frame\n    ImVec2                  SizeContentsExplicit;               // Size of contents explicitly set by the user via SetNextWindowContentSize()\n    ImRect                  ContentsRegionRect;                 // Maximum visible content position in window coordinates. ~~ (SizeContentsExplicit ? SizeContentsExplicit : Size - ScrollbarSizes) - CursorStartPos, per axis\n    ImVec2                  WindowPadding;                      // Window padding at the time of begin.\n    float                   WindowRounding;                     // Window rounding at the time of begin.\n    float                   WindowBorderSize;                   // Window border size at the time of begin.\n    ImGuiID                 MoveId;                             // == window->GetID(\"#MOVE\")\n    ImVec2                  Scroll;\n    ImVec2                  ScrollTarget;                       // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)\n    ImVec2                  ScrollTargetCenterRatio;            // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered\n    bool                    ScrollbarX, ScrollbarY;\n    ImVec2                  ScrollbarSizes;\n    bool                    Active;                             // Set to true on Begin()\n    bool                    WasActive;\n    bool                    WriteAccessed;                      // Set to true when any widget access the current window\n    bool                    Collapsed;                          // Set when collapsing window to become only title-bar\n    bool                    SkipItems;                          // Set when items can safely be all clipped (e.g. window not visible or collapsed)\n    bool                    Appearing;                          // Set during the frame where the window is appearing (or re-appearing)\n    bool                    CloseButton;                        // Set when the window has a close button (p_open != NULL)\n    int                     BeginCount;                         // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)\n    ImGuiID                 PopupId;                            // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)\n    int                     AutoFitFramesX, AutoFitFramesY;\n    bool                    AutoFitOnlyGrows;\n    int                     AutoFitChildAxises;\n    int                     AutoPosLastDirection;\n    int                     HiddenFrames;\n    ImGuiCond               SetWindowPosAllowFlags;             // store condition flags for next SetWindowPos() call.\n    ImGuiCond               SetWindowSizeAllowFlags;            // store condition flags for next SetWindowSize() call.\n    ImGuiCond               SetWindowCollapsedAllowFlags;       // store condition flags for next SetWindowCollapsed() call.\n    ImVec2                  SetWindowPosVal;                    // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)\n    ImVec2                  SetWindowPosPivot;                  // store window pivot for positioning. ImVec2(0,0) when positioning from top-left corner; ImVec2(0.5f,0.5f) for centering; ImVec2(1,1) for bottom right.\n\n    ImGuiDrawContext        DC;                                 // Temporary per-window data, reset at the beginning of the frame\n    ImVector<ImGuiID>       IDStack;                            // ID stack. ID are hashes seeded with the value at the top of the stack\n    ImRect                  ClipRect;                           // = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2.\n    ImRect                  WindowRectClipped;                  // = WindowRect just after setup in Begin(). == window->Rect() for root window.\n    ImRect                  InnerRect;\n    int                     LastFrameActive;\n    float                   ItemWidthDefault;\n    ImGuiSimpleColumns      MenuColumns;                        // Simplified columns storage for menu items\n    ImGuiStorage            StateStorage;\n    float                   FontWindowScale;                    // Scale multiplier per-window\n    ImDrawList*             DrawList;\n    ImGuiWindow*            ParentWindow;                       // Immediate parent in the window stack *regardless* of whether this window is a child window or not)\n    ImGuiWindow*            RootWindow;                         // Generally point to ourself. If we are a child window, this is pointing to the first non-child parent window.\n    ImGuiWindow*            RootNonPopupWindow;                 // Generally point to ourself. Used to display TitleBgActive color and for selecting which window to use for NavWindowing\n\n    // Navigation / Focus\n    int                     FocusIdxAllCounter;                 // Start at -1 and increase as assigned via FocusItemRegister()\n    int                     FocusIdxTabCounter;                 // (same, but only count widgets which you can Tab through)\n    int                     FocusIdxAllRequestCurrent;          // Item being requested for focus\n    int                     FocusIdxTabRequestCurrent;          // Tab-able item being requested for focus\n    int                     FocusIdxAllRequestNext;             // Item being requested for focus, for next update (relies on layout to be stable between the frame pressing TAB and the next frame)\n    int                     FocusIdxTabRequestNext;             // \"\n\npublic:\n    ImGuiWindow(const char* name);\n    ~ImGuiWindow();\n\n    ImGuiID     GetID(const char* str, const char* str_end = NULL);\n    ImGuiID     GetID(const void* ptr);\n    ImGuiID     GetIDNoKeepAlive(const char* str, const char* str_end = NULL);\n\n    // We don't use g.FontSize because the window may be != g.CurrentWidow.\n    ImRect      Rect() const                            { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); }\n    float       CalcFontSize() const                    { return GImGui->FontBaseSize * FontWindowScale; }\n    float       TitleBarHeight() const                  { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f; }\n    ImRect      TitleBarRect() const                    { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }\n    float       MenuBarHeight() const                   { return (Flags & ImGuiWindowFlags_MenuBar) ? CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; }\n    ImRect      MenuBarRect() const                     { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }\n};\n\n// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data.  \nstruct ImGuiItemHoveredDataBackup\n{\n    ImGuiID     LastItemId;\n    ImRect      LastItemRect;\n    bool        LastItemRectHoveredRect;\n\n    void Backup()  { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemRect = window->DC.LastItemRect; LastItemRectHoveredRect = window->DC.LastItemRectHoveredRect; }\n    void Restore() { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemRect = LastItemRect; window->DC.LastItemRectHoveredRect = LastItemRectHoveredRect; }\n};\n\n//-----------------------------------------------------------------------------\n// Internal API\n// No guarantee of forward compatibility here.\n//-----------------------------------------------------------------------------\n\nnamespace ImGui\n{\n    // We should always have a CurrentWindow in the stack (there is an implicit \"Debug\" window)\n    // If this ever crash because g.CurrentWindow is NULL it means that either\n    // - ImGui::NewFrame() has never been called, which is illegal.\n    // - You are calling ImGui functions after ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.\n    inline    ImGuiWindow*  GetCurrentWindowRead()      { ImGuiContext& g = *GImGui; return g.CurrentWindow; }\n    inline    ImGuiWindow*  GetCurrentWindow()          { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }\n    IMGUI_API ImGuiWindow*  GetParentWindow();\n    IMGUI_API ImGuiWindow*  FindWindowByName(const char* name);\n    IMGUI_API void          FocusWindow(ImGuiWindow* window);\n    IMGUI_API void          BringWindowToFront(ImGuiWindow* window);\n    IMGUI_API void          BringWindowToBack(ImGuiWindow* window);\n\n    IMGUI_API void          Initialize();\n\n    IMGUI_API void          SetActiveID(ImGuiID id, ImGuiWindow* window);\n    IMGUI_API void          ClearActiveID();\n    IMGUI_API void          SetHoveredID(ImGuiID id);\n    IMGUI_API void          KeepAliveID(ImGuiID id);\n\n    IMGUI_API void          ItemSize(const ImVec2& size, float text_offset_y = 0.0f);\n    IMGUI_API void          ItemSize(const ImRect& bb, float text_offset_y = 0.0f);\n    IMGUI_API bool          ItemAdd(const ImRect& bb, ImGuiID id);\n    IMGUI_API bool          ItemHoverable(const ImRect& bb, ImGuiID id);\n    IMGUI_API bool          IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged);\n    IMGUI_API bool          FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop = true);      // Return true if focus is requested\n    IMGUI_API void          FocusableItemUnregister(ImGuiWindow* window);\n    IMGUI_API ImVec2        CalcItemSize(ImVec2 size, float default_x, float default_y);\n    IMGUI_API float         CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);\n    IMGUI_API void          PushMultiItemsWidths(int components, float width_full = 0.0f);\n    IMGUI_API void          PushItemFlag(ImGuiItemFlags option, bool enabled);\n    IMGUI_API void          PopItemFlag();\n\n    IMGUI_API void          OpenPopupEx(ImGuiID id, bool reopen_existing);\n    IMGUI_API void          ClosePopup(ImGuiID id);\n    IMGUI_API bool          IsPopupOpen(ImGuiID id);\n    IMGUI_API bool          BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);\n    IMGUI_API void          BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true);\n\n    IMGUI_API int           CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate);\n\n    IMGUI_API void          Scrollbar(ImGuiLayoutType direction);\n    IMGUI_API void          VerticalSeparator();        // Vertical separator, for menu bars (use current line height). not exposed because it is misleading what it doesn't have an effect on regular layout.\n    IMGUI_API bool          SplitterBehavior(ImGuiID id, const ImRect& bb, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f);\n\n    // FIXME-WIP: New Columns API\n    IMGUI_API void          BeginColumns(const char* id, int count, ImGuiColumnsFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().\n    IMGUI_API void          EndColumns();                                                         // close columns\n    IMGUI_API void          PushColumnClipRect(int column_index = -1);\n\n    // FIXME-WIP: New Combo API\n    IMGUI_API bool          BeginCombo(const char* label, const char* preview_value, ImVec2 popup_size = ImVec2(0.0f,0.0f));\n    IMGUI_API void          EndCombo();\n\n    // NB: All position are in absolute pixels coordinates (never using window coordinates internally)\n    // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT.\n    IMGUI_API void          RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);\n    IMGUI_API void          RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);\n    IMGUI_API void          RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0,0), const ImRect* clip_rect = NULL);\n    IMGUI_API void          RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);\n    IMGUI_API void          RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);\n    IMGUI_API void          RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, int rounding_corners_flags = ~0);\n    IMGUI_API void          RenderTriangle(ImVec2 pos, ImGuiDir dir, float scale = 1.0f);\n    IMGUI_API void          RenderBullet(ImVec2 pos);\n    IMGUI_API void          RenderCheckMark(ImVec2 pos, ImU32 col, float sz);\n    IMGUI_API void          RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);\n    IMGUI_API const char*   FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.\n\n    IMGUI_API bool          ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);\n    IMGUI_API bool          ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0,0), ImGuiButtonFlags flags = 0);\n    IMGUI_API bool          CloseButton(ImGuiID id, const ImVec2& pos, float radius);\n    IMGUI_API bool          ArrowButton(ImGuiID id, ImGuiDir dir, ImVec2 padding, ImGuiButtonFlags flags = 0);\n\n    IMGUI_API bool          SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_min, float v_max, float power, int decimal_precision, ImGuiSliderFlags flags = 0);\n    IMGUI_API bool          SliderFloatN(const char* label, float* v, int components, float v_min, float v_max, const char* display_format, float power);\n    IMGUI_API bool          SliderIntN(const char* label, int* v, int components, int v_min, int v_max, const char* display_format);\n\n    IMGUI_API bool          DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_speed, float v_min, float v_max, int decimal_precision, float power);\n    IMGUI_API bool          DragFloatN(const char* label, float* v, int components, float v_speed, float v_min, float v_max, const char* display_format, float power);\n    IMGUI_API bool          DragIntN(const char* label, int* v, int components, float v_speed, int v_min, int v_max, const char* display_format);\n\n    IMGUI_API bool          InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);\n    IMGUI_API bool          InputFloatN(const char* label, float* v, int components, int decimal_precision, ImGuiInputTextFlags extra_flags);\n    IMGUI_API bool          InputIntN(const char* label, int* v, int components, ImGuiInputTextFlags extra_flags);\n    IMGUI_API bool          InputScalarEx(const char* label, ImGuiDataType data_type, void* data_ptr, void* step_ptr, void* step_fast_ptr, const char* scalar_format, ImGuiInputTextFlags extra_flags);\n    IMGUI_API bool          InputScalarAsWidgetReplacement(const ImRect& aabb, const char* label, ImGuiDataType data_type, void* data_ptr, ImGuiID id, int decimal_precision);\n\n    IMGUI_API void          ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);\n    IMGUI_API void          ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);\n\n    IMGUI_API bool          TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);\n    IMGUI_API bool          TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0);                     // Consume previous SetNextTreeNodeOpened() data, if any. May return true when logging\n    IMGUI_API void          TreePushRawID(ImGuiID id);\n\n    IMGUI_API void          PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size);\n\n    IMGUI_API int           ParseFormatPrecision(const char* fmt, int default_value);\n    IMGUI_API float         RoundScalar(float value, int decimal_precision);\n\n    // Shade functions\n    IMGUI_API void          ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);\n    IMGUI_API void          ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x);\n    IMGUI_API void          ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);\n\n} // namespace ImGui\n\n// ImFontAtlas internals\nIMGUI_API bool              ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas);\nIMGUI_API void              ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas);\nIMGUI_API void              ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); \nIMGUI_API void              ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* spc);\nIMGUI_API void              ImFontAtlasBuildFinish(ImFontAtlas* atlas);\nIMGUI_API void              ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);\nIMGUI_API void              ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n#ifdef _MSC_VER\n#pragma warning (pop)\n#endif\n"
  },
  {
    "path": "external/imgui/stb_rect_pack.h",
    "content": "// stb_rect_pack.h - v0.10 - public domain - rectangle packing\n// Sean Barrett 2014\n//\n// Useful for e.g. packing rectangular textures into an atlas.\n// Does not do rotation.\n//\n// Not necessarily the awesomest packing method, but better than\n// the totally naive one in stb_truetype (which is primarily what\n// this is meant to replace).\n//\n// Has only had a few tests run, may have issues.\n//\n// More docs to come.\n//\n// No memory allocations; uses qsort() and assert() from stdlib.\n// Can override those by defining STBRP_SORT and STBRP_ASSERT.\n//\n// This library currently uses the Skyline Bottom-Left algorithm.\n//\n// Please note: better rectangle packers are welcome! Please\n// implement them to the same API, but with a different init\n// function.\n//\n// Credits\n//\n//  Library\n//    Sean Barrett\n//  Minor features\n//    Martins Mozeiko\n//  Bugfixes / warning fixes\n//    Jeremy Jaussaud\n//\n// Version history:\n//\n//     0.10  (2016-10-25)  remove cast-away-const to avoid warnings\n//     0.09  (2016-08-27)  fix compiler warnings\n//     0.08  (2015-09-13)  really fix bug with empty rects (w=0 or h=0)\n//     0.07  (2015-09-13)  fix bug with empty rects (w=0 or h=0)\n//     0.06  (2015-04-15)  added STBRP_SORT to allow replacing qsort\n//     0.05:  added STBRP_ASSERT to allow replacing assert\n//     0.04:  fixed minor bug in STBRP_LARGE_RECTS support\n//     0.01:  initial release\n//\n// LICENSE\n//\n//   This software is dual-licensed to the public domain and under the following\n//   license: you are granted a perpetual, irrevocable license to copy, modify,\n//   publish, and distribute this file as you see fit.\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//       INCLUDE SECTION\n//\n\n#ifndef STB_INCLUDE_STB_RECT_PACK_H\n#define STB_INCLUDE_STB_RECT_PACK_H\n\n#define STB_RECT_PACK_VERSION  1\n\n#ifdef STBRP_STATIC\n#define STBRP_DEF static\n#else\n#define STBRP_DEF extern\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct stbrp_context stbrp_context;\ntypedef struct stbrp_node    stbrp_node;\ntypedef struct stbrp_rect    stbrp_rect;\n\n#ifdef STBRP_LARGE_RECTS\ntypedef int            stbrp_coord;\n#else\ntypedef unsigned short stbrp_coord;\n#endif\n\nSTBRP_DEF void stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects);\n// Assign packed locations to rectangles. The rectangles are of type\n// 'stbrp_rect' defined below, stored in the array 'rects', and there\n// are 'num_rects' many of them.\n//\n// Rectangles which are successfully packed have the 'was_packed' flag\n// set to a non-zero value and 'x' and 'y' store the minimum location\n// on each axis (i.e. bottom-left in cartesian coordinates, top-left\n// if you imagine y increasing downwards). Rectangles which do not fit\n// have the 'was_packed' flag set to 0.\n//\n// You should not try to access the 'rects' array from another thread\n// while this function is running, as the function temporarily reorders\n// the array while it executes.\n//\n// To pack into another rectangle, you need to call stbrp_init_target\n// again. To continue packing into the same rectangle, you can call\n// this function again. Calling this multiple times with multiple rect\n// arrays will probably produce worse packing results than calling it\n// a single time with the full rectangle array, but the option is\n// available.\n\nstruct stbrp_rect\n{\n   // reserved for your use:\n   int            id;\n\n   // input:\n   stbrp_coord    w, h;\n\n   // output:\n   stbrp_coord    x, y;\n   int            was_packed;  // non-zero if valid packing\n\n}; // 16 bytes, nominally\n\n\nSTBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes);\n// Initialize a rectangle packer to:\n//    pack a rectangle that is 'width' by 'height' in dimensions\n//    using temporary storage provided by the array 'nodes', which is 'num_nodes' long\n//\n// You must call this function every time you start packing into a new target.\n//\n// There is no \"shutdown\" function. The 'nodes' memory must stay valid for\n// the following stbrp_pack_rects() call (or calls), but can be freed after\n// the call (or calls) finish.\n//\n// Note: to guarantee best results, either:\n//       1. make sure 'num_nodes' >= 'width'\n//   or  2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1'\n//\n// If you don't do either of the above things, widths will be quantized to multiples\n// of small integers to guarantee the algorithm doesn't run out of temporary storage.\n//\n// If you do #2, then the non-quantized algorithm will be used, but the algorithm\n// may run out of temporary storage and be unable to pack some rectangles.\n\nSTBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem);\n// Optionally call this function after init but before doing any packing to\n// change the handling of the out-of-temp-memory scenario, described above.\n// If you call init again, this will be reset to the default (false).\n\n\nSTBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic);\n// Optionally select which packing heuristic the library should use. Different\n// heuristics will produce better/worse results for different data sets.\n// If you call init again, this will be reset to the default.\n\nenum\n{\n   STBRP_HEURISTIC_Skyline_default=0,\n   STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default,\n   STBRP_HEURISTIC_Skyline_BF_sortHeight\n};\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// the details of the following structures don't matter to you, but they must\n// be visible so you can handle the memory allocations for them\n\nstruct stbrp_node\n{\n   stbrp_coord  x,y;\n   stbrp_node  *next;\n};\n\nstruct stbrp_context\n{\n   int width;\n   int height;\n   int align;\n   int init_mode;\n   int heuristic;\n   int num_nodes;\n   stbrp_node *active_head;\n   stbrp_node *free_head;\n   stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2'\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//     IMPLEMENTATION SECTION\n//\n\n#ifdef STB_RECT_PACK_IMPLEMENTATION\n#ifndef STBRP_SORT\n#include <stdlib.h>\n#define STBRP_SORT qsort\n#endif\n\n#ifndef STBRP_ASSERT\n#include <assert.h>\n#define STBRP_ASSERT assert\n#endif\n\n#ifdef _MSC_VER\n#define STBRP__NOTUSED(v)  (void)(v)\n#else\n#define STBRP__NOTUSED(v)  (void)sizeof(v)\n#endif\n\nenum\n{\n   STBRP__INIT_skyline = 1\n};\n\nSTBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)\n{\n   switch (context->init_mode) {\n      case STBRP__INIT_skyline:\n         STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);\n         context->heuristic = heuristic;\n         break;\n      default:\n         STBRP_ASSERT(0);\n   }\n}\n\nSTBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem)\n{\n   if (allow_out_of_mem)\n      // if it's ok to run out of memory, then don't bother aligning them;\n      // this gives better packing, but may fail due to OOM (even though\n      // the rectangles easily fit). @TODO a smarter approach would be to only\n      // quantize once we've hit OOM, then we could get rid of this parameter.\n      context->align = 1;\n   else {\n      // if it's not ok to run out of memory, then quantize the widths\n      // so that num_nodes is always enough nodes.\n      //\n      // I.e. num_nodes * align >= width\n      //                  align >= width / num_nodes\n      //                  align = ceil(width/num_nodes)\n\n      context->align = (context->width + context->num_nodes-1) / context->num_nodes;\n   }\n}\n\nSTBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)\n{\n   int i;\n#ifndef STBRP_LARGE_RECTS\n   STBRP_ASSERT(width <= 0xffff && height <= 0xffff);\n#endif\n\n   for (i=0; i < num_nodes-1; ++i)\n      nodes[i].next = &nodes[i+1];\n   nodes[i].next = NULL;\n   context->init_mode = STBRP__INIT_skyline;\n   context->heuristic = STBRP_HEURISTIC_Skyline_default;\n   context->free_head = &nodes[0];\n   context->active_head = &context->extra[0];\n   context->width = width;\n   context->height = height;\n   context->num_nodes = num_nodes;\n   stbrp_setup_allow_out_of_mem(context, 0);\n\n   // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly)\n   context->extra[0].x = 0;\n   context->extra[0].y = 0;\n   context->extra[0].next = &context->extra[1];\n   context->extra[1].x = (stbrp_coord) width;\n#ifdef STBRP_LARGE_RECTS\n   context->extra[1].y = (1<<30);\n#else\n   context->extra[1].y = 65535;\n#endif\n   context->extra[1].next = NULL;\n}\n\n// find minimum y position if it starts at x1\nstatic int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste)\n{\n   stbrp_node *node = first;\n   int x1 = x0 + width;\n   int min_y, visited_width, waste_area;\n\n   STBRP__NOTUSED(c);\n\n   STBRP_ASSERT(first->x <= x0);\n\n   #if 0\n   // skip in case we're past the node\n   while (node->next->x <= x0)\n      ++node;\n   #else\n   STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency\n   #endif\n\n   STBRP_ASSERT(node->x <= x0);\n\n   min_y = 0;\n   waste_area = 0;\n   visited_width = 0;\n   while (node->x < x1) {\n      if (node->y > min_y) {\n         // raise min_y higher.\n         // we've accounted for all waste up to min_y,\n         // but we'll now add more waste for everything we've visted\n         waste_area += visited_width * (node->y - min_y);\n         min_y = node->y;\n         // the first time through, visited_width might be reduced\n         if (node->x < x0)\n            visited_width += node->next->x - x0;\n         else\n            visited_width += node->next->x - node->x;\n      } else {\n         // add waste area\n         int under_width = node->next->x - node->x;\n         if (under_width + visited_width > width)\n            under_width = width - visited_width;\n         waste_area += under_width * (min_y - node->y);\n         visited_width += under_width;\n      }\n      node = node->next;\n   }\n\n   *pwaste = waste_area;\n   return min_y;\n}\n\ntypedef struct\n{\n   int x,y;\n   stbrp_node **prev_link;\n} stbrp__findresult;\n\nstatic stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height)\n{\n   int best_waste = (1<<30), best_x, best_y = (1 << 30);\n   stbrp__findresult fr;\n   stbrp_node **prev, *node, *tail, **best = NULL;\n\n   // align to multiple of c->align\n   width = (width + c->align - 1);\n   width -= width % c->align;\n   STBRP_ASSERT(width % c->align == 0);\n\n   node = c->active_head;\n   prev = &c->active_head;\n   while (node->x + width <= c->width) {\n      int y,waste;\n      y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste);\n      if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL\n         // bottom left\n         if (y < best_y) {\n            best_y = y;\n            best = prev;\n         }\n      } else {\n         // best-fit\n         if (y + height <= c->height) {\n            // can only use it if it first vertically\n            if (y < best_y || (y == best_y && waste < best_waste)) {\n               best_y = y;\n               best_waste = waste;\n               best = prev;\n            }\n         }\n      }\n      prev = &node->next;\n      node = node->next;\n   }\n\n   best_x = (best == NULL) ? 0 : (*best)->x;\n\n   // if doing best-fit (BF), we also have to try aligning right edge to each node position\n   //\n   // e.g, if fitting\n   //\n   //     ____________________\n   //    |____________________|\n   //\n   //            into\n   //\n   //   |                         |\n   //   |             ____________|\n   //   |____________|\n   //\n   // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned\n   //\n   // This makes BF take about 2x the time\n\n   if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) {\n      tail = c->active_head;\n      node = c->active_head;\n      prev = &c->active_head;\n      // find first node that's admissible\n      while (tail->x < width)\n         tail = tail->next;\n      while (tail) {\n         int xpos = tail->x - width;\n         int y,waste;\n         STBRP_ASSERT(xpos >= 0);\n         // find the left position that matches this\n         while (node->next->x <= xpos) {\n            prev = &node->next;\n            node = node->next;\n         }\n         STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);\n         y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);\n         if (y + height < c->height) {\n            if (y <= best_y) {\n               if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {\n                  best_x = xpos;\n                  STBRP_ASSERT(y <= best_y);\n                  best_y = y;\n                  best_waste = waste;\n                  best = prev;\n               }\n            }\n         }\n         tail = tail->next;\n      }         \n   }\n\n   fr.prev_link = best;\n   fr.x = best_x;\n   fr.y = best_y;\n   return fr;\n}\n\nstatic stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height)\n{\n   // find best position according to heuristic\n   stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height);\n   stbrp_node *node, *cur;\n\n   // bail if:\n   //    1. it failed\n   //    2. the best node doesn't fit (we don't always check this)\n   //    3. we're out of memory\n   if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) {\n      res.prev_link = NULL;\n      return res;\n   }\n\n   // on success, create new node\n   node = context->free_head;\n   node->x = (stbrp_coord) res.x;\n   node->y = (stbrp_coord) (res.y + height);\n\n   context->free_head = node->next;\n\n   // insert the new node into the right starting point, and\n   // let 'cur' point to the remaining nodes needing to be\n   // stiched back in\n\n   cur = *res.prev_link;\n   if (cur->x < res.x) {\n      // preserve the existing one, so start testing with the next one\n      stbrp_node *next = cur->next;\n      cur->next = node;\n      cur = next;\n   } else {\n      *res.prev_link = node;\n   }\n\n   // from here, traverse cur and free the nodes, until we get to one\n   // that shouldn't be freed\n   while (cur->next && cur->next->x <= res.x + width) {\n      stbrp_node *next = cur->next;\n      // move the current node to the free list\n      cur->next = context->free_head;\n      context->free_head = cur;\n      cur = next;\n   }\n\n   // stitch the list back in\n   node->next = cur;\n\n   if (cur->x < res.x + width)\n      cur->x = (stbrp_coord) (res.x + width);\n\n#ifdef _DEBUG\n   cur = context->active_head;\n   while (cur->x < context->width) {\n      STBRP_ASSERT(cur->x < cur->next->x);\n      cur = cur->next;\n   }\n   STBRP_ASSERT(cur->next == NULL);\n\n   {\n      stbrp_node *L1 = NULL, *L2 = NULL;\n      int count=0;\n      cur = context->active_head;\n      while (cur) {\n         L1 = cur;\n         cur = cur->next;\n         ++count;\n      }\n      cur = context->free_head;\n      while (cur) {\n         L2 = cur;\n         cur = cur->next;\n         ++count;\n      }\n      STBRP_ASSERT(count == context->num_nodes+2);\n   }\n#endif\n\n   return res;\n}\n\nstatic int rect_height_compare(const void *a, const void *b)\n{\n   const stbrp_rect *p = (const stbrp_rect *) a;\n   const stbrp_rect *q = (const stbrp_rect *) b;\n   if (p->h > q->h)\n      return -1;\n   if (p->h < q->h)\n      return  1;\n   return (p->w > q->w) ? -1 : (p->w < q->w);\n}\n\nstatic int rect_width_compare(const void *a, const void *b)\n{\n   const stbrp_rect *p = (const stbrp_rect *) a;\n   const stbrp_rect *q = (const stbrp_rect *) b;\n   if (p->w > q->w)\n      return -1;\n   if (p->w < q->w)\n      return  1;\n   return (p->h > q->h) ? -1 : (p->h < q->h);\n}\n\nstatic int rect_original_order(const void *a, const void *b)\n{\n   const stbrp_rect *p = (const stbrp_rect *) a;\n   const stbrp_rect *q = (const stbrp_rect *) b;\n   return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);\n}\n\n#ifdef STBRP_LARGE_RECTS\n#define STBRP__MAXVAL  0xffffffff\n#else\n#define STBRP__MAXVAL  0xffff\n#endif\n\nSTBRP_DEF void stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)\n{\n   int i;\n\n   // we use the 'was_packed' field internally to allow sorting/unsorting\n   for (i=0; i < num_rects; ++i) {\n      rects[i].was_packed = i;\n      #ifndef STBRP_LARGE_RECTS\n      STBRP_ASSERT(rects[i].w <= 0xffff && rects[i].h <= 0xffff);\n      #endif\n   }\n\n   // sort according to heuristic\n   STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare);\n\n   for (i=0; i < num_rects; ++i) {\n      if (rects[i].w == 0 || rects[i].h == 0) {\n         rects[i].x = rects[i].y = 0;  // empty rect needs no space\n      } else {\n         stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);\n         if (fr.prev_link) {\n            rects[i].x = (stbrp_coord) fr.x;\n            rects[i].y = (stbrp_coord) fr.y;\n         } else {\n            rects[i].x = rects[i].y = STBRP__MAXVAL;\n         }\n      }\n   }\n\n   // unsort\n   STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order);\n\n   // set was_packed flags\n   for (i=0; i < num_rects; ++i)\n      rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL);\n}\n#endif\n"
  },
  {
    "path": "external/imgui/stb_textedit.h",
    "content": "// [ImGui] this is a slightly modified version of stb_truetype.h 1.9. Those changes would need to be pushed into nothings/sb\n// [ImGui] - fixed linestart handler when over last character of multi-line buffer + simplified existing code (#588, #815)\n// [ImGui] - fixed a state corruption/crash bug in stb_text_redo and stb_textedit_discard_redo (#715)\n// [ImGui] - fixed a crash bug in stb_textedit_discard_redo (#681)\n// [ImGui] - fixed some minor warnings\n\n// stb_textedit.h - v1.9  - public domain - Sean Barrett\n// Development of this library was sponsored by RAD Game Tools\n//\n// This C header file implements the guts of a multi-line text-editing\n// widget; you implement display, word-wrapping, and low-level string\n// insertion/deletion, and stb_textedit will map user inputs into\n// insertions & deletions, plus updates to the cursor position,\n// selection state, and undo state.\n//\n// It is intended for use in games and other systems that need to build\n// their own custom widgets and which do not have heavy text-editing\n// requirements (this library is not recommended for use for editing large\n// texts, as its performance does not scale and it has limited undo).\n//\n// Non-trivial behaviors are modelled after Windows text controls.\n// \n//\n// LICENSE\n//\n//   This software is dual-licensed to the public domain and under the following\n//   license: you are granted a perpetual, irrevocable license to copy, modify,\n//   publish, and distribute this file as you see fit.\n//\n//\n// DEPENDENCIES\n//\n// Uses the C runtime function 'memmove', which you can override\n// by defining STB_TEXTEDIT_memmove before the implementation.\n// Uses no other functions. Performs no runtime allocations.\n//\n//\n// VERSION HISTORY\n//\n//   1.9  (2016-08-27) customizable move-by-word\n//   1.8  (2016-04-02) better keyboard handling when mouse button is down\n//   1.7  (2015-09-13) change y range handling in case baseline is non-0\n//   1.6  (2015-04-15) allow STB_TEXTEDIT_memmove\n//   1.5  (2014-09-10) add support for secondary keys for OS X\n//   1.4  (2014-08-17) fix signed/unsigned warnings\n//   1.3  (2014-06-19) fix mouse clicking to round to nearest char boundary\n//   1.2  (2014-05-27) fix some RAD types that had crept into the new code\n//   1.1  (2013-12-15) move-by-word (requires STB_TEXTEDIT_IS_SPACE )\n//   1.0  (2012-07-26) improve documentation, initial public release\n//   0.3  (2012-02-24) bugfixes, single-line mode; insert mode\n//   0.2  (2011-11-28) fixes to undo/redo\n//   0.1  (2010-07-08) initial version\n//\n// ADDITIONAL CONTRIBUTORS\n//\n//   Ulf Winklemann: move-by-word in 1.1\n//   Fabian Giesen: secondary key inputs in 1.5\n//   Martins Mozeiko: STB_TEXTEDIT_memmove\n//\n//   Bugfixes:\n//      Scott Graham\n//      Daniel Keller\n//      Omar Cornut\n//\n// USAGE\n//\n// This file behaves differently depending on what symbols you define\n// before including it.\n//\n//\n// Header-file mode:\n//\n//   If you do not define STB_TEXTEDIT_IMPLEMENTATION before including this,\n//   it will operate in \"header file\" mode. In this mode, it declares a\n//   single public symbol, STB_TexteditState, which encapsulates the current\n//   state of a text widget (except for the string, which you will store\n//   separately).\n//\n//   To compile in this mode, you must define STB_TEXTEDIT_CHARTYPE to a\n//   primitive type that defines a single character (e.g. char, wchar_t, etc).\n//\n//   To save space or increase undo-ability, you can optionally define the\n//   following things that are used by the undo system:\n//\n//      STB_TEXTEDIT_POSITIONTYPE         small int type encoding a valid cursor position\n//      STB_TEXTEDIT_UNDOSTATECOUNT       the number of undo states to allow\n//      STB_TEXTEDIT_UNDOCHARCOUNT        the number of characters to store in the undo buffer\n//\n//   If you don't define these, they are set to permissive types and\n//   moderate sizes. The undo system does no memory allocations, so\n//   it grows STB_TexteditState by the worst-case storage which is (in bytes):\n//\n//        [4 + sizeof(STB_TEXTEDIT_POSITIONTYPE)] * STB_TEXTEDIT_UNDOSTATE_COUNT\n//      +      sizeof(STB_TEXTEDIT_CHARTYPE)      * STB_TEXTEDIT_UNDOCHAR_COUNT\n//\n//\n// Implementation mode:\n//\n//   If you define STB_TEXTEDIT_IMPLEMENTATION before including this, it\n//   will compile the implementation of the text edit widget, depending\n//   on a large number of symbols which must be defined before the include.\n//\n//   The implementation is defined only as static functions. You will then\n//   need to provide your own APIs in the same file which will access the\n//   static functions.\n//\n//   The basic concept is that you provide a \"string\" object which\n//   behaves like an array of characters. stb_textedit uses indices to\n//   refer to positions in the string, implicitly representing positions\n//   in the displayed textedit. This is true for both plain text and\n//   rich text; even with rich text stb_truetype interacts with your\n//   code as if there was an array of all the displayed characters.\n//\n// Symbols that must be the same in header-file and implementation mode:\n//\n//     STB_TEXTEDIT_CHARTYPE             the character type\n//     STB_TEXTEDIT_POSITIONTYPE         small type that a valid cursor position\n//     STB_TEXTEDIT_UNDOSTATECOUNT       the number of undo states to allow\n//     STB_TEXTEDIT_UNDOCHARCOUNT        the number of characters to store in the undo buffer\n//\n// Symbols you must define for implementation mode:\n//\n//    STB_TEXTEDIT_STRING               the type of object representing a string being edited,\n//                                      typically this is a wrapper object with other data you need\n//\n//    STB_TEXTEDIT_STRINGLEN(obj)       the length of the string (ideally O(1))\n//    STB_TEXTEDIT_LAYOUTROW(&r,obj,n)  returns the results of laying out a line of characters\n//                                        starting from character #n (see discussion below)\n//    STB_TEXTEDIT_GETWIDTH(obj,n,i)    returns the pixel delta from the xpos of the i'th character\n//                                        to the xpos of the i+1'th char for a line of characters\n//                                        starting at character #n (i.e. accounts for kerning\n//                                        with previous char)\n//    STB_TEXTEDIT_KEYTOTEXT(k)         maps a keyboard input to an insertable character\n//                                        (return type is int, -1 means not valid to insert)\n//    STB_TEXTEDIT_GETCHAR(obj,i)       returns the i'th character of obj, 0-based\n//    STB_TEXTEDIT_NEWLINE              the character returned by _GETCHAR() we recognize\n//                                        as manually wordwrapping for end-of-line positioning\n//\n//    STB_TEXTEDIT_DELETECHARS(obj,i,n)      delete n characters starting at i\n//    STB_TEXTEDIT_INSERTCHARS(obj,i,c*,n)   insert n characters at i (pointed to by STB_TEXTEDIT_CHARTYPE*)\n//\n//    STB_TEXTEDIT_K_SHIFT       a power of two that is or'd in to a keyboard input to represent the shift key\n//\n//    STB_TEXTEDIT_K_LEFT        keyboard input to move cursor left\n//    STB_TEXTEDIT_K_RIGHT       keyboard input to move cursor right\n//    STB_TEXTEDIT_K_UP          keyboard input to move cursor up\n//    STB_TEXTEDIT_K_DOWN        keyboard input to move cursor down\n//    STB_TEXTEDIT_K_LINESTART   keyboard input to move cursor to start of line  // e.g. HOME\n//    STB_TEXTEDIT_K_LINEEND     keyboard input to move cursor to end of line    // e.g. END\n//    STB_TEXTEDIT_K_TEXTSTART   keyboard input to move cursor to start of text  // e.g. ctrl-HOME\n//    STB_TEXTEDIT_K_TEXTEND     keyboard input to move cursor to end of text    // e.g. ctrl-END\n//    STB_TEXTEDIT_K_DELETE      keyboard input to delete selection or character under cursor\n//    STB_TEXTEDIT_K_BACKSPACE   keyboard input to delete selection or character left of cursor\n//    STB_TEXTEDIT_K_UNDO        keyboard input to perform undo\n//    STB_TEXTEDIT_K_REDO        keyboard input to perform redo\n//\n// Optional:\n//    STB_TEXTEDIT_K_INSERT              keyboard input to toggle insert mode\n//    STB_TEXTEDIT_IS_SPACE(ch)          true if character is whitespace (e.g. 'isspace'),\n//                                          required for default WORDLEFT/WORDRIGHT handlers\n//    STB_TEXTEDIT_MOVEWORDLEFT(obj,i)   custom handler for WORDLEFT, returns index to move cursor to\n//    STB_TEXTEDIT_MOVEWORDRIGHT(obj,i)  custom handler for WORDRIGHT, returns index to move cursor to\n//    STB_TEXTEDIT_K_WORDLEFT            keyboard input to move cursor left one word // e.g. ctrl-LEFT\n//    STB_TEXTEDIT_K_WORDRIGHT           keyboard input to move cursor right one word // e.g. ctrl-RIGHT\n//    STB_TEXTEDIT_K_LINESTART2          secondary keyboard input to move cursor to start of line\n//    STB_TEXTEDIT_K_LINEEND2            secondary keyboard input to move cursor to end of line\n//    STB_TEXTEDIT_K_TEXTSTART2          secondary keyboard input to move cursor to start of text\n//    STB_TEXTEDIT_K_TEXTEND2            secondary keyboard input to move cursor to end of text\n//\n// Todo:\n//    STB_TEXTEDIT_K_PGUP        keyboard input to move cursor up a page\n//    STB_TEXTEDIT_K_PGDOWN      keyboard input to move cursor down a page\n//\n// Keyboard input must be encoded as a single integer value; e.g. a character code\n// and some bitflags that represent shift states. to simplify the interface, SHIFT must\n// be a bitflag, so we can test the shifted state of cursor movements to allow selection,\n// i.e. (STB_TEXTED_K_RIGHT|STB_TEXTEDIT_K_SHIFT) should be shifted right-arrow.\n//\n// You can encode other things, such as CONTROL or ALT, in additional bits, and\n// then test for their presence in e.g. STB_TEXTEDIT_K_WORDLEFT. For example,\n// my Windows implementations add an additional CONTROL bit, and an additional KEYDOWN\n// bit. Then all of the STB_TEXTEDIT_K_ values bitwise-or in the KEYDOWN bit,\n// and I pass both WM_KEYDOWN and WM_CHAR events to the \"key\" function in the\n// API below. The control keys will only match WM_KEYDOWN events because of the\n// keydown bit I add, and STB_TEXTEDIT_KEYTOTEXT only tests for the KEYDOWN\n// bit so it only decodes WM_CHAR events.\n//\n// STB_TEXTEDIT_LAYOUTROW returns information about the shape of one displayed\n// row of characters assuming they start on the i'th character--the width and\n// the height and the number of characters consumed. This allows this library\n// to traverse the entire layout incrementally. You need to compute word-wrapping\n// here.\n//\n// Each textfield keeps its own insert mode state, which is not how normal\n// applications work. To keep an app-wide insert mode, update/copy the\n// \"insert_mode\" field of STB_TexteditState before/after calling API functions.\n//\n// API\n//\n//    void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line)\n//\n//    void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)\n//    void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)\n//    int  stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)\n//    int  stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len)\n//    void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int key)\n//\n//    Each of these functions potentially updates the string and updates the\n//    state.\n//\n//      initialize_state:\n//          set the textedit state to a known good default state when initially\n//          constructing the textedit.\n//\n//      click:\n//          call this with the mouse x,y on a mouse down; it will update the cursor\n//          and reset the selection start/end to the cursor point. the x,y must\n//          be relative to the text widget, with (0,0) being the top left.\n//     \n//      drag:\n//          call this with the mouse x,y on a mouse drag/up; it will update the\n//          cursor and the selection end point\n//     \n//      cut:\n//          call this to delete the current selection; returns true if there was\n//          one. you should FIRST copy the current selection to the system paste buffer.\n//          (To copy, just copy the current selection out of the string yourself.)\n//     \n//      paste:\n//          call this to paste text at the current cursor point or over the current\n//          selection if there is one.\n//     \n//      key:\n//          call this for keyboard inputs sent to the textfield. you can use it\n//          for \"key down\" events or for \"translated\" key events. if you need to\n//          do both (as in Win32), or distinguish Unicode characters from control\n//          inputs, set a high bit to distinguish the two; then you can define the\n//          various definitions like STB_TEXTEDIT_K_LEFT have the is-key-event bit\n//          set, and make STB_TEXTEDIT_KEYTOCHAR check that the is-key-event bit is\n//          clear.\n//     \n//   When rendering, you can read the cursor position and selection state from\n//   the STB_TexteditState.\n//\n//\n// Notes:\n//\n// This is designed to be usable in IMGUI, so it allows for the possibility of\n// running in an IMGUI that has NOT cached the multi-line layout. For this\n// reason, it provides an interface that is compatible with computing the\n// layout incrementally--we try to make sure we make as few passes through\n// as possible. (For example, to locate the mouse pointer in the text, we\n// could define functions that return the X and Y positions of characters\n// and binary search Y and then X, but if we're doing dynamic layout this\n// will run the layout algorithm many times, so instead we manually search\n// forward in one pass. Similar logic applies to e.g. up-arrow and\n// down-arrow movement.)\n//\n// If it's run in a widget that *has* cached the layout, then this is less\n// efficient, but it's not horrible on modern computers. But you wouldn't\n// want to edit million-line files with it.\n\n\n////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////\n////\n////   Header-file mode\n////\n////\n\n#ifndef INCLUDE_STB_TEXTEDIT_H\n#define INCLUDE_STB_TEXTEDIT_H\n\n////////////////////////////////////////////////////////////////////////\n//\n//     STB_TexteditState\n//\n// Definition of STB_TexteditState which you should store\n// per-textfield; it includes cursor position, selection state,\n// and undo state.\n//\n\n#ifndef STB_TEXTEDIT_UNDOSTATECOUNT\n#define STB_TEXTEDIT_UNDOSTATECOUNT   99\n#endif\n#ifndef STB_TEXTEDIT_UNDOCHARCOUNT\n#define STB_TEXTEDIT_UNDOCHARCOUNT   999\n#endif\n#ifndef STB_TEXTEDIT_CHARTYPE\n#define STB_TEXTEDIT_CHARTYPE        int\n#endif\n#ifndef STB_TEXTEDIT_POSITIONTYPE\n#define STB_TEXTEDIT_POSITIONTYPE    int\n#endif\n\ntypedef struct\n{\n   // private data\n   STB_TEXTEDIT_POSITIONTYPE  where;\n   short           insert_length;\n   short           delete_length;\n   short           char_storage;\n} StbUndoRecord;\n\ntypedef struct\n{\n   // private data\n   StbUndoRecord          undo_rec [STB_TEXTEDIT_UNDOSTATECOUNT];\n   STB_TEXTEDIT_CHARTYPE  undo_char[STB_TEXTEDIT_UNDOCHARCOUNT];\n   short undo_point, redo_point;\n   short undo_char_point, redo_char_point;\n} StbUndoState;\n\ntypedef struct\n{\n   /////////////////////\n   //\n   // public data\n   //\n\n   int cursor;\n   // position of the text cursor within the string\n\n   int select_start;          // selection start point\n   int select_end;\n   // selection start and end point in characters; if equal, no selection.\n   // note that start may be less than or greater than end (e.g. when\n   // dragging the mouse, start is where the initial click was, and you\n   // can drag in either direction)\n\n   unsigned char insert_mode;\n   // each textfield keeps its own insert mode state. to keep an app-wide\n   // insert mode, copy this value in/out of the app state\n\n   /////////////////////\n   //\n   // private data\n   //\n   unsigned char cursor_at_end_of_line; // not implemented yet\n   unsigned char initialized;\n   unsigned char has_preferred_x;\n   unsigned char single_line;\n   unsigned char padding1, padding2, padding3;\n   float preferred_x; // this determines where the cursor up/down tries to seek to along x\n   StbUndoState undostate;\n} STB_TexteditState;\n\n\n////////////////////////////////////////////////////////////////////////\n//\n//     StbTexteditRow\n//\n// Result of layout query, used by stb_textedit to determine where\n// the text in each row is.\n\n// result of layout query\ntypedef struct\n{\n   float x0,x1;             // starting x location, end x location (allows for align=right, etc)\n   float baseline_y_delta;  // position of baseline relative to previous row's baseline\n   float ymin,ymax;         // height of row above and below baseline\n   int num_chars;\n} StbTexteditRow;\n#endif //INCLUDE_STB_TEXTEDIT_H\n\n\n////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////\n////\n////   Implementation mode\n////\n////\n\n\n// implementation isn't include-guarded, since it might have indirectly\n// included just the \"header\" portion\n#ifdef STB_TEXTEDIT_IMPLEMENTATION\n\n#ifndef STB_TEXTEDIT_memmove\n#include <string.h>\n#define STB_TEXTEDIT_memmove memmove\n#endif\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n//      Mouse input handling\n//\n\n// traverse the layout to locate the nearest character to a display position\nstatic int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y)\n{\n   StbTexteditRow r;\n   int n = STB_TEXTEDIT_STRINGLEN(str);\n   float base_y = 0, prev_x;\n   int i=0, k;\n\n   r.x0 = r.x1 = 0;\n   r.ymin = r.ymax = 0;\n   r.num_chars = 0;\n\n   // search rows to find one that straddles 'y'\n   while (i < n) {\n      STB_TEXTEDIT_LAYOUTROW(&r, str, i);\n      if (r.num_chars <= 0)\n         return n;\n\n      if (i==0 && y < base_y + r.ymin)\n         return 0;\n\n      if (y < base_y + r.ymax)\n         break;\n\n      i += r.num_chars;\n      base_y += r.baseline_y_delta;\n   }\n\n   // below all text, return 'after' last character\n   if (i >= n)\n      return n;\n\n   // check if it's before the beginning of the line\n   if (x < r.x0)\n      return i;\n\n   // check if it's before the end of the line\n   if (x < r.x1) {\n      // search characters in row for one that straddles 'x'\n      prev_x = r.x0;\n      for (k=0; k < r.num_chars; ++k) {\n         float w = STB_TEXTEDIT_GETWIDTH(str, i, k);\n         if (x < prev_x+w) {\n            if (x < prev_x+w/2)\n               return k+i;\n            else\n               return k+i+1;\n         }\n         prev_x += w;\n      }\n      // shouldn't happen, but if it does, fall through to end-of-line case\n   }\n\n   // if the last character is a newline, return that. otherwise return 'after' the last character\n   if (STB_TEXTEDIT_GETCHAR(str, i+r.num_chars-1) == STB_TEXTEDIT_NEWLINE)\n      return i+r.num_chars-1;\n   else\n      return i+r.num_chars;\n}\n\n// API click: on mouse down, move the cursor to the clicked location, and reset the selection\nstatic void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)\n{\n   state->cursor = stb_text_locate_coord(str, x, y);\n   state->select_start = state->cursor;\n   state->select_end = state->cursor;\n   state->has_preferred_x = 0;\n}\n\n// API drag: on mouse drag, move the cursor and selection endpoint to the clicked location\nstatic void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)\n{\n   int p = stb_text_locate_coord(str, x, y);\n   if (state->select_start == state->select_end)\n      state->select_start = state->cursor;\n   state->cursor = state->select_end = p;\n}\n\n/////////////////////////////////////////////////////////////////////////////\n//\n//      Keyboard input handling\n//\n\n// forward declarations\nstatic void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state);\nstatic void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state);\nstatic void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length);\nstatic void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length);\nstatic void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length);\n\ntypedef struct\n{\n   float x,y;    // position of n'th character\n   float height; // height of line\n   int first_char, length; // first char of row, and length\n   int prev_first;  // first char of previous row\n} StbFindState;\n\n// find the x/y location of a character, and remember info about the previous row in\n// case we get a move-up event (for page up, we'll have to rescan)\nstatic void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *str, int n, int single_line)\n{\n   StbTexteditRow r;\n   int prev_start = 0;\n   int z = STB_TEXTEDIT_STRINGLEN(str);\n   int i=0, first;\n\n   if (n == z) {\n      // if it's at the end, then find the last line -- simpler than trying to\n      // explicitly handle this case in the regular code\n      if (single_line) {\n         STB_TEXTEDIT_LAYOUTROW(&r, str, 0);\n         find->y = 0;\n         find->first_char = 0;\n         find->length = z;\n         find->height = r.ymax - r.ymin;\n         find->x = r.x1;\n      } else {\n         find->y = 0;\n         find->x = 0;\n         find->height = 1;\n         while (i < z) {\n            STB_TEXTEDIT_LAYOUTROW(&r, str, i);\n            prev_start = i;\n            i += r.num_chars;\n         }\n         find->first_char = i;\n         find->length = 0;\n         find->prev_first = prev_start;\n      }\n      return;\n   }\n\n   // search rows to find the one that straddles character n\n   find->y = 0;\n\n   for(;;) {\n      STB_TEXTEDIT_LAYOUTROW(&r, str, i);\n      if (n < i + r.num_chars)\n         break;\n      prev_start = i;\n      i += r.num_chars;\n      find->y += r.baseline_y_delta;\n   }\n\n   find->first_char = first = i;\n   find->length = r.num_chars;\n   find->height = r.ymax - r.ymin;\n   find->prev_first = prev_start;\n\n   // now scan to find xpos\n   find->x = r.x0;\n   i = 0;\n   for (i=0; first+i < n; ++i)\n      find->x += STB_TEXTEDIT_GETWIDTH(str, first, i);\n}\n\n#define STB_TEXT_HAS_SELECTION(s)   ((s)->select_start != (s)->select_end)\n\n// make the selection/cursor state valid if client altered the string\nstatic void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)\n{\n   int n = STB_TEXTEDIT_STRINGLEN(str);\n   if (STB_TEXT_HAS_SELECTION(state)) {\n      if (state->select_start > n) state->select_start = n;\n      if (state->select_end   > n) state->select_end = n;\n      // if clamping forced them to be equal, move the cursor to match\n      if (state->select_start == state->select_end)\n         state->cursor = state->select_start;\n   }\n   if (state->cursor > n) state->cursor = n;\n}\n\n// delete characters while updating undo\nstatic void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len)\n{\n   stb_text_makeundo_delete(str, state, where, len);\n   STB_TEXTEDIT_DELETECHARS(str, where, len);\n   state->has_preferred_x = 0;\n}\n\n// delete the section\nstatic void stb_textedit_delete_selection(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)\n{\n   stb_textedit_clamp(str, state);\n   if (STB_TEXT_HAS_SELECTION(state)) {\n      if (state->select_start < state->select_end) {\n         stb_textedit_delete(str, state, state->select_start, state->select_end - state->select_start);\n         state->select_end = state->cursor = state->select_start;\n      } else {\n         stb_textedit_delete(str, state, state->select_end, state->select_start - state->select_end);\n         state->select_start = state->cursor = state->select_end;\n      }\n      state->has_preferred_x = 0;\n   }\n}\n\n// canoncialize the selection so start <= end\nstatic void stb_textedit_sortselection(STB_TexteditState *state)\n{\n   if (state->select_end < state->select_start) {\n      int temp = state->select_end;\n      state->select_end = state->select_start;\n      state->select_start = temp;\n   }\n}\n\n// move cursor to first character of selection\nstatic void stb_textedit_move_to_first(STB_TexteditState *state)\n{\n   if (STB_TEXT_HAS_SELECTION(state)) {\n      stb_textedit_sortselection(state);\n      state->cursor = state->select_start;\n      state->select_end = state->select_start;\n      state->has_preferred_x = 0;\n   }\n}\n\n// move cursor to last character of selection\nstatic void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)\n{\n   if (STB_TEXT_HAS_SELECTION(state)) {\n      stb_textedit_sortselection(state);\n      stb_textedit_clamp(str, state);\n      state->cursor = state->select_end;\n      state->select_start = state->select_end;\n      state->has_preferred_x = 0;\n   }\n}\n\n#ifdef STB_TEXTEDIT_IS_SPACE\nstatic int is_word_boundary( STB_TEXTEDIT_STRING *str, int idx )\n{\n   return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1;\n}\n\n#ifndef STB_TEXTEDIT_MOVEWORDLEFT\nstatic int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c )\n{\n   --c; // always move at least one character\n   while( c >= 0 && !is_word_boundary( str, c ) )\n      --c;\n\n   if( c < 0 )\n      c = 0;\n\n   return c;\n}\n#define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous\n#endif\n\n#ifndef STB_TEXTEDIT_MOVEWORDRIGHT\nstatic int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c )\n{\n   const int len = STB_TEXTEDIT_STRINGLEN(str);\n   ++c; // always move at least one character\n   while( c < len && !is_word_boundary( str, c ) )\n      ++c;\n\n   if( c > len )\n      c = len;\n\n   return c;\n}\n#define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next\n#endif\n\n#endif\n\n// update selection and cursor to match each other\nstatic void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state)\n{\n   if (!STB_TEXT_HAS_SELECTION(state))\n      state->select_start = state->select_end = state->cursor;\n   else\n      state->cursor = state->select_end;\n}\n\n// API cut: delete selection\nstatic int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)\n{\n   if (STB_TEXT_HAS_SELECTION(state)) {\n      stb_textedit_delete_selection(str,state); // implicity clamps\n      state->has_preferred_x = 0;\n      return 1;\n   }\n   return 0;\n}\n\n// API paste: replace existing selection with passed-in text\nstatic int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE const *ctext, int len)\n{\n   STB_TEXTEDIT_CHARTYPE *text = (STB_TEXTEDIT_CHARTYPE *) ctext;\n   // if there's a selection, the paste should delete it\n   stb_textedit_clamp(str, state);\n   stb_textedit_delete_selection(str,state);\n   // try to insert the characters\n   if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, text, len)) {\n      stb_text_makeundo_insert(state, state->cursor, len);\n      state->cursor += len;\n      state->has_preferred_x = 0;\n      return 1;\n   }\n   // remove the undo since we didn't actually insert the characters\n   if (state->undostate.undo_point)\n      --state->undostate.undo_point;\n   return 0;\n}\n\n// API key: process a keyboard input\nstatic void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int key)\n{\nretry:\n   switch (key) {\n      default: {\n         int c = STB_TEXTEDIT_KEYTOTEXT(key);\n         if (c > 0) {\n            STB_TEXTEDIT_CHARTYPE ch = (STB_TEXTEDIT_CHARTYPE) c;\n\n            // can't add newline in single-line mode\n            if (c == '\\n' && state->single_line)\n               break;\n\n            if (state->insert_mode && !STB_TEXT_HAS_SELECTION(state) && state->cursor < STB_TEXTEDIT_STRINGLEN(str)) {\n               stb_text_makeundo_replace(str, state, state->cursor, 1, 1);\n               STB_TEXTEDIT_DELETECHARS(str, state->cursor, 1);\n               if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) {\n                  ++state->cursor;\n                  state->has_preferred_x = 0;\n               }\n            } else {\n               stb_textedit_delete_selection(str,state); // implicity clamps\n               if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) {\n                  stb_text_makeundo_insert(state, state->cursor, 1);\n                  ++state->cursor;\n                  state->has_preferred_x = 0;\n               }\n            }\n         }\n         break;\n      }\n\n#ifdef STB_TEXTEDIT_K_INSERT\n      case STB_TEXTEDIT_K_INSERT:\n         state->insert_mode = !state->insert_mode;\n         break;\n#endif\n         \n      case STB_TEXTEDIT_K_UNDO:\n         stb_text_undo(str, state);\n         state->has_preferred_x = 0;\n         break;\n\n      case STB_TEXTEDIT_K_REDO:\n         stb_text_redo(str, state);\n         state->has_preferred_x = 0;\n         break;\n\n      case STB_TEXTEDIT_K_LEFT:\n         // if currently there's a selection, move cursor to start of selection\n         if (STB_TEXT_HAS_SELECTION(state))\n            stb_textedit_move_to_first(state);\n         else \n            if (state->cursor > 0)\n               --state->cursor;\n         state->has_preferred_x = 0;\n         break;\n\n      case STB_TEXTEDIT_K_RIGHT:\n         // if currently there's a selection, move cursor to end of selection\n         if (STB_TEXT_HAS_SELECTION(state))\n            stb_textedit_move_to_last(str, state);\n         else\n            ++state->cursor;\n         stb_textedit_clamp(str, state);\n         state->has_preferred_x = 0;\n         break;\n\n      case STB_TEXTEDIT_K_LEFT | STB_TEXTEDIT_K_SHIFT:\n         stb_textedit_clamp(str, state);\n         stb_textedit_prep_selection_at_cursor(state);\n         // move selection left\n         if (state->select_end > 0)\n            --state->select_end;\n         state->cursor = state->select_end;\n         state->has_preferred_x = 0;\n         break;\n\n#ifdef STB_TEXTEDIT_MOVEWORDLEFT\n      case STB_TEXTEDIT_K_WORDLEFT:\n         if (STB_TEXT_HAS_SELECTION(state))\n            stb_textedit_move_to_first(state);\n         else {\n            state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor);\n            stb_textedit_clamp( str, state );\n         }\n         break;\n\n      case STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT:\n         if( !STB_TEXT_HAS_SELECTION( state ) )\n            stb_textedit_prep_selection_at_cursor(state);\n\n         state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor);\n         state->select_end = state->cursor;\n\n         stb_textedit_clamp( str, state );\n         break;\n#endif\n\n#ifdef STB_TEXTEDIT_MOVEWORDRIGHT\n      case STB_TEXTEDIT_K_WORDRIGHT:\n         if (STB_TEXT_HAS_SELECTION(state)) \n            stb_textedit_move_to_last(str, state);\n         else {\n            state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor);\n            stb_textedit_clamp( str, state );\n         }\n         break;\n\n      case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT:\n         if( !STB_TEXT_HAS_SELECTION( state ) )\n            stb_textedit_prep_selection_at_cursor(state);\n\n         state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor);\n         state->select_end = state->cursor;\n\n         stb_textedit_clamp( str, state );\n         break;\n#endif\n\n      case STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT:\n         stb_textedit_prep_selection_at_cursor(state);\n         // move selection right\n         ++state->select_end;\n         stb_textedit_clamp(str, state);\n         state->cursor = state->select_end;\n         state->has_preferred_x = 0;\n         break;\n\n      case STB_TEXTEDIT_K_DOWN:\n      case STB_TEXTEDIT_K_DOWN | STB_TEXTEDIT_K_SHIFT: {\n         StbFindState find;\n         StbTexteditRow row;\n         int i, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0;\n\n         if (state->single_line) {\n            // on windows, up&down in single-line behave like left&right\n            key = STB_TEXTEDIT_K_RIGHT | (key & STB_TEXTEDIT_K_SHIFT);\n            goto retry;\n         }\n\n         if (sel)\n            stb_textedit_prep_selection_at_cursor(state);\n         else if (STB_TEXT_HAS_SELECTION(state))\n            stb_textedit_move_to_last(str,state);\n\n         // compute current position of cursor point\n         stb_textedit_clamp(str, state);\n         stb_textedit_find_charpos(&find, str, state->cursor, state->single_line);\n\n         // now find character position down a row\n         if (find.length) {\n            float goal_x = state->has_preferred_x ? state->preferred_x : find.x;\n            float x;\n            int start = find.first_char + find.length;\n            state->cursor = start;\n            STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor);\n            x = row.x0;\n            for (i=0; i < row.num_chars; ++i) {\n               float dx = STB_TEXTEDIT_GETWIDTH(str, start, i);\n               #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE\n               if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE)\n                  break;\n               #endif\n               x += dx;\n               if (x > goal_x)\n                  break;\n               ++state->cursor;\n            }\n            stb_textedit_clamp(str, state);\n\n            state->has_preferred_x = 1;\n            state->preferred_x = goal_x;\n\n            if (sel)\n               state->select_end = state->cursor;\n         }\n         break;\n      }\n         \n      case STB_TEXTEDIT_K_UP:\n      case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: {\n         StbFindState find;\n         StbTexteditRow row;\n         int i, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0;\n\n         if (state->single_line) {\n            // on windows, up&down become left&right\n            key = STB_TEXTEDIT_K_LEFT | (key & STB_TEXTEDIT_K_SHIFT);\n            goto retry;\n         }\n\n         if (sel)\n            stb_textedit_prep_selection_at_cursor(state);\n         else if (STB_TEXT_HAS_SELECTION(state))\n            stb_textedit_move_to_first(state);\n\n         // compute current position of cursor point\n         stb_textedit_clamp(str, state);\n         stb_textedit_find_charpos(&find, str, state->cursor, state->single_line);\n\n         // can only go up if there's a previous row\n         if (find.prev_first != find.first_char) {\n            // now find character position up a row\n            float goal_x = state->has_preferred_x ? state->preferred_x : find.x;\n            float x;\n            state->cursor = find.prev_first;\n            STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor);\n            x = row.x0;\n            for (i=0; i < row.num_chars; ++i) {\n               float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i);\n               #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE\n               if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE)\n                  break;\n               #endif\n               x += dx;\n               if (x > goal_x)\n                  break;\n               ++state->cursor;\n            }\n            stb_textedit_clamp(str, state);\n\n            state->has_preferred_x = 1;\n            state->preferred_x = goal_x;\n\n            if (sel)\n               state->select_end = state->cursor;\n         }\n         break;\n      }\n\n      case STB_TEXTEDIT_K_DELETE:\n      case STB_TEXTEDIT_K_DELETE | STB_TEXTEDIT_K_SHIFT:\n         if (STB_TEXT_HAS_SELECTION(state))\n            stb_textedit_delete_selection(str, state);\n         else {\n            int n = STB_TEXTEDIT_STRINGLEN(str);\n            if (state->cursor < n)\n               stb_textedit_delete(str, state, state->cursor, 1);\n         }\n         state->has_preferred_x = 0;\n         break;\n\n      case STB_TEXTEDIT_K_BACKSPACE:\n      case STB_TEXTEDIT_K_BACKSPACE | STB_TEXTEDIT_K_SHIFT:\n         if (STB_TEXT_HAS_SELECTION(state))\n            stb_textedit_delete_selection(str, state);\n         else {\n            stb_textedit_clamp(str, state);\n            if (state->cursor > 0) {\n               stb_textedit_delete(str, state, state->cursor-1, 1);\n               --state->cursor;\n            }\n         }\n         state->has_preferred_x = 0;\n         break;\n         \n#ifdef STB_TEXTEDIT_K_TEXTSTART2\n      case STB_TEXTEDIT_K_TEXTSTART2:\n#endif\n      case STB_TEXTEDIT_K_TEXTSTART:\n         state->cursor = state->select_start = state->select_end = 0;\n         state->has_preferred_x = 0;\n         break;\n\n#ifdef STB_TEXTEDIT_K_TEXTEND2\n      case STB_TEXTEDIT_K_TEXTEND2:\n#endif\n      case STB_TEXTEDIT_K_TEXTEND:\n         state->cursor = STB_TEXTEDIT_STRINGLEN(str);\n         state->select_start = state->select_end = 0;\n         state->has_preferred_x = 0;\n         break;\n        \n#ifdef STB_TEXTEDIT_K_TEXTSTART2\n      case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT:\n#endif\n      case STB_TEXTEDIT_K_TEXTSTART | STB_TEXTEDIT_K_SHIFT:\n         stb_textedit_prep_selection_at_cursor(state);\n         state->cursor = state->select_end = 0;\n         state->has_preferred_x = 0;\n         break;\n\n#ifdef STB_TEXTEDIT_K_TEXTEND2\n      case STB_TEXTEDIT_K_TEXTEND2 | STB_TEXTEDIT_K_SHIFT:\n#endif\n      case STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT:\n         stb_textedit_prep_selection_at_cursor(state);\n         state->cursor = state->select_end = STB_TEXTEDIT_STRINGLEN(str);\n         state->has_preferred_x = 0;\n         break;\n\n\n#ifdef STB_TEXTEDIT_K_LINESTART2\n      case STB_TEXTEDIT_K_LINESTART2:\n#endif\n      case STB_TEXTEDIT_K_LINESTART:\n         stb_textedit_clamp(str, state);\n         stb_textedit_move_to_first(state);\n         if (state->single_line)\n            state->cursor = 0;\n         else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE)\n            --state->cursor;\n         state->has_preferred_x = 0;\n         break;\n\n#ifdef STB_TEXTEDIT_K_LINEEND2\n      case STB_TEXTEDIT_K_LINEEND2:\n#endif\n      case STB_TEXTEDIT_K_LINEEND: {\n         int n = STB_TEXTEDIT_STRINGLEN(str);\n         stb_textedit_clamp(str, state);\n         stb_textedit_move_to_first(state);\n         if (state->single_line)\n             state->cursor = n;\n         else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE)\n             ++state->cursor;\n         state->has_preferred_x = 0;\n         break;\n      }\n\n#ifdef STB_TEXTEDIT_K_LINESTART2\n      case STB_TEXTEDIT_K_LINESTART2 | STB_TEXTEDIT_K_SHIFT:\n#endif\n      case STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT:\n         stb_textedit_clamp(str, state);\n         stb_textedit_prep_selection_at_cursor(state);\n         if (state->single_line)\n            state->cursor = 0;\n         else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE)\n            --state->cursor;\n         state->select_end = state->cursor;\n         state->has_preferred_x = 0;\n         break;\n\n#ifdef STB_TEXTEDIT_K_LINEEND2\n      case STB_TEXTEDIT_K_LINEEND2 | STB_TEXTEDIT_K_SHIFT:\n#endif\n      case STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT: {\n         int n = STB_TEXTEDIT_STRINGLEN(str);\n         stb_textedit_clamp(str, state);\n         stb_textedit_prep_selection_at_cursor(state);\n         if (state->single_line)\n             state->cursor = n;\n         else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE)\n            ++state->cursor;\n         state->select_end = state->cursor;\n         state->has_preferred_x = 0;\n         break;\n      }\n\n// @TODO:\n//    STB_TEXTEDIT_K_PGUP      - move cursor up a page\n//    STB_TEXTEDIT_K_PGDOWN    - move cursor down a page\n   }\n}\n\n/////////////////////////////////////////////////////////////////////////////\n//\n//      Undo processing\n//\n// @OPTIMIZE: the undo/redo buffer should be circular\n\nstatic void stb_textedit_flush_redo(StbUndoState *state)\n{\n   state->redo_point = STB_TEXTEDIT_UNDOSTATECOUNT;\n   state->redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT;\n}\n\n// discard the oldest entry in the undo list\nstatic void stb_textedit_discard_undo(StbUndoState *state)\n{\n   if (state->undo_point > 0) {\n      // if the 0th undo state has characters, clean those up\n      if (state->undo_rec[0].char_storage >= 0) {\n         int n = state->undo_rec[0].insert_length, i;\n         // delete n characters from all other records\n         state->undo_char_point = state->undo_char_point - (short) n;  // vsnet05\n         STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) ((size_t)state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE)));\n         for (i=0; i < state->undo_point; ++i)\n            if (state->undo_rec[i].char_storage >= 0)\n               state->undo_rec[i].char_storage = state->undo_rec[i].char_storage - (short) n; // vsnet05 // @OPTIMIZE: get rid of char_storage and infer it\n      }\n      --state->undo_point;\n      STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) ((size_t)state->undo_point*sizeof(state->undo_rec[0])));\n   }\n}\n\n// discard the oldest entry in the redo list--it's bad if this\n// ever happens, but because undo & redo have to store the actual\n// characters in different cases, the redo character buffer can\n// fill up even though the undo buffer didn't\nstatic void stb_textedit_discard_redo(StbUndoState *state)\n{\n   int k = STB_TEXTEDIT_UNDOSTATECOUNT-1;\n\n   if (state->redo_point <= k) {\n      // if the k'th undo state has characters, clean those up\n      if (state->undo_rec[k].char_storage >= 0) {\n         int n = state->undo_rec[k].insert_length, i;\n         // delete n characters from all other records\n         state->redo_char_point = state->redo_char_point + (short) n; // vsnet05\n         STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((size_t)(STB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE)));\n         for (i=state->redo_point; i < k; ++i)\n            if (state->undo_rec[i].char_storage >= 0)\n               state->undo_rec[i].char_storage = state->undo_rec[i].char_storage + (short) n; // vsnet05\n      }\n      STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point, state->undo_rec + state->redo_point-1, (size_t) ((size_t)(STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point)*sizeof(state->undo_rec[0])));\n      ++state->redo_point;\n   }\n}\n\nstatic StbUndoRecord *stb_text_create_undo_record(StbUndoState *state, int numchars)\n{\n   // any time we create a new undo record, we discard redo\n   stb_textedit_flush_redo(state);\n\n   // if we have no free records, we have to make room, by sliding the\n   // existing records down\n   if (state->undo_point == STB_TEXTEDIT_UNDOSTATECOUNT)\n      stb_textedit_discard_undo(state);\n\n   // if the characters to store won't possibly fit in the buffer, we can't undo\n   if (numchars > STB_TEXTEDIT_UNDOCHARCOUNT) {\n      state->undo_point = 0;\n      state->undo_char_point = 0;\n      return NULL;\n   }\n\n   // if we don't have enough free characters in the buffer, we have to make room\n   while (state->undo_char_point + numchars > STB_TEXTEDIT_UNDOCHARCOUNT)\n      stb_textedit_discard_undo(state);\n\n   return &state->undo_rec[state->undo_point++];\n}\n\nstatic STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len)\n{\n   StbUndoRecord *r = stb_text_create_undo_record(state, insert_len);\n   if (r == NULL)\n      return NULL;\n\n   r->where = pos;\n   r->insert_length = (short) insert_len;\n   r->delete_length = (short) delete_len;\n\n   if (insert_len == 0) {\n      r->char_storage = -1;\n      return NULL;\n   } else {\n      r->char_storage = state->undo_char_point;\n      state->undo_char_point = state->undo_char_point + (short) insert_len;\n      return &state->undo_char[r->char_storage];\n   }\n}\n\nstatic void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)\n{\n   StbUndoState *s = &state->undostate;\n   StbUndoRecord u, *r;\n   if (s->undo_point == 0)\n      return;\n\n   // we need to do two things: apply the undo record, and create a redo record\n   u = s->undo_rec[s->undo_point-1];\n   r = &s->undo_rec[s->redo_point-1];\n   r->char_storage = -1;\n\n   r->insert_length = u.delete_length;\n   r->delete_length = u.insert_length;\n   r->where = u.where;\n\n   if (u.delete_length) {\n      // if the undo record says to delete characters, then the redo record will\n      // need to re-insert the characters that get deleted, so we need to store\n      // them.\n\n      // there are three cases:\n      //    there's enough room to store the characters\n      //    characters stored for *redoing* don't leave room for redo\n      //    characters stored for *undoing* don't leave room for redo\n      // if the last is true, we have to bail\n\n      if (s->undo_char_point + u.delete_length >= STB_TEXTEDIT_UNDOCHARCOUNT) {\n         // the undo records take up too much character space; there's no space to store the redo characters\n         r->insert_length = 0;\n      } else {\n         int i;\n\n         // there's definitely room to store the characters eventually\n         while (s->undo_char_point + u.delete_length > s->redo_char_point) {\n            // there's currently not enough room, so discard a redo record\n            stb_textedit_discard_redo(s);\n            // should never happen:\n            if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT)\n               return;\n         }\n         r = &s->undo_rec[s->redo_point-1];\n\n         r->char_storage = s->redo_char_point - u.delete_length;\n         s->redo_char_point = s->redo_char_point - (short) u.delete_length;\n\n         // now save the characters\n         for (i=0; i < u.delete_length; ++i)\n            s->undo_char[r->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u.where + i);\n      }\n\n      // now we can carry out the deletion\n      STB_TEXTEDIT_DELETECHARS(str, u.where, u.delete_length);\n   }\n\n   // check type of recorded action:\n   if (u.insert_length) {\n      // easy case: was a deletion, so we need to insert n characters\n      STB_TEXTEDIT_INSERTCHARS(str, u.where, &s->undo_char[u.char_storage], u.insert_length);\n      s->undo_char_point -= u.insert_length;\n   }\n\n   state->cursor = u.where + u.insert_length;\n\n   s->undo_point--;\n   s->redo_point--;\n}\n\nstatic void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)\n{\n   StbUndoState *s = &state->undostate;\n   StbUndoRecord *u, r;\n   if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT)\n      return;\n\n   // we need to do two things: apply the redo record, and create an undo record\n   u = &s->undo_rec[s->undo_point];\n   r = s->undo_rec[s->redo_point];\n\n   // we KNOW there must be room for the undo record, because the redo record\n   // was derived from an undo record\n\n   u->delete_length = r.insert_length;\n   u->insert_length = r.delete_length;\n   u->where = r.where;\n   u->char_storage = -1;\n\n   if (r.delete_length) {\n      // the redo record requires us to delete characters, so the undo record\n      // needs to store the characters\n\n      if (s->undo_char_point + u->insert_length > s->redo_char_point) {\n         u->insert_length = 0;\n         u->delete_length = 0;\n      } else {\n         int i;\n         u->char_storage = s->undo_char_point;\n         s->undo_char_point = s->undo_char_point + u->insert_length;\n\n         // now save the characters\n         for (i=0; i < u->insert_length; ++i)\n            s->undo_char[u->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u->where + i);\n      }\n\n      STB_TEXTEDIT_DELETECHARS(str, r.where, r.delete_length);\n   }\n\n   if (r.insert_length) {\n      // easy case: need to insert n characters\n      STB_TEXTEDIT_INSERTCHARS(str, r.where, &s->undo_char[r.char_storage], r.insert_length);\n      s->redo_char_point += r.insert_length;\n   }\n\n   state->cursor = r.where + r.insert_length;\n\n   s->undo_point++;\n   s->redo_point++;\n}\n\nstatic void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length)\n{\n   stb_text_createundo(&state->undostate, where, 0, length);\n}\n\nstatic void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length)\n{\n   int i;\n   STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0);\n   if (p) {\n      for (i=0; i < length; ++i)\n         p[i] = STB_TEXTEDIT_GETCHAR(str, where+i);\n   }\n}\n\nstatic void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length)\n{\n   int i;\n   STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length);\n   if (p) {\n      for (i=0; i < old_length; ++i)\n         p[i] = STB_TEXTEDIT_GETCHAR(str, where+i);\n   }\n}\n\n// reset the state to default\nstatic void stb_textedit_clear_state(STB_TexteditState *state, int is_single_line)\n{\n   state->undostate.undo_point = 0;\n   state->undostate.undo_char_point = 0;\n   state->undostate.redo_point = STB_TEXTEDIT_UNDOSTATECOUNT;\n   state->undostate.redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT;\n   state->select_end = state->select_start = 0;\n   state->cursor = 0;\n   state->has_preferred_x = 0;\n   state->preferred_x = 0;\n   state->cursor_at_end_of_line = 0;\n   state->initialized = 1;\n   state->single_line = (unsigned char) is_single_line;\n   state->insert_mode = 0;\n}\n\n// API initialize\nstatic void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line)\n{\n   stb_textedit_clear_state(state, is_single_line);\n}\n#endif//STB_TEXTEDIT_IMPLEMENTATION\n"
  },
  {
    "path": "external/imgui/stb_truetype.h",
    "content": "// stb_truetype.h - v1.14 - public domain\n// authored from 2009-2016 by Sean Barrett / RAD Game Tools\n//\n//   This library processes TrueType files:\n//        parse files\n//        extract glyph metrics\n//        extract glyph shapes\n//        render glyphs to one-channel bitmaps with antialiasing (box filter)\n//\n//   Todo:\n//        non-MS cmaps\n//        crashproof on bad data\n//        hinting? (no longer patented)\n//        cleartype-style AA?\n//        optimize: use simple memory allocator for intermediates\n//        optimize: build edge-list directly from curves\n//        optimize: rasterize directly from curves?\n//\n// ADDITIONAL CONTRIBUTORS\n//\n//   Mikko Mononen: compound shape support, more cmap formats\n//   Tor Andersson: kerning, subpixel rendering\n//   Dougall Johnson: OpenType / Type 2 font handling\n//\n//   Misc other:\n//       Ryan Gordon\n//       Simon Glass\n//       github:IntellectualKitty\n//\n//   Bug/warning reports/fixes:\n//       \"Zer\" on mollyrocket (with fix)\n//       Cass Everitt\n//       stoiko (Haemimont Games)\n//       Brian Hook \n//       Walter van Niftrik\n//       David Gow\n//       David Given\n//       Ivan-Assen Ivanov\n//       Anthony Pesch\n//       Johan Duparc\n//       Hou Qiming\n//       Fabian \"ryg\" Giesen\n//       Martins Mozeiko\n//       Cap Petschulat\n//       Omar Cornut\n//       github:aloucks\n//       Peter LaValle\n//       Sergey Popov\n//       Giumo X. Clanjor\n//       Higor Euripedes\n//       Thomas Fields\n//       Derek Vinyard\n//\n// VERSION HISTORY\n//\n//   1.13 (2017-01-02) support OpenType fonts, certain Apple fonts, num-fonts-in-TTC function\n//   1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual\n//   1.11 (2016-04-02) fix unused-variable warning\n//   1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef\n//   1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly\n//   1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges\n//   1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints;\n//                     variant PackFontRanges to pack and render in separate phases;\n//                     fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?);\n//                     fixed an assert() bug in the new rasterizer\n//                     replace assert() with STBTT_assert() in new rasterizer\n//\n//   Full history can be found at the end of this file.\n//\n// LICENSE\n//\n//   This software is dual-licensed to the public domain and under the following\n//   license: you are granted a perpetual, irrevocable license to copy, modify,\n//   publish, and distribute this file as you see fit.\n//\n// USAGE\n//\n//   Include this file in whatever places neeed to refer to it. In ONE C/C++\n//   file, write:\n//      #define STB_TRUETYPE_IMPLEMENTATION\n//   before the #include of this file. This expands out the actual\n//   implementation into that C/C++ file.\n//\n//   To make the implementation private to the file that generates the implementation,\n//      #define STBTT_STATIC\n//\n//   Simple 3D API (don't ship this, but it's fine for tools and quick start)\n//           stbtt_BakeFontBitmap()               -- bake a font to a bitmap for use as texture\n//           stbtt_GetBakedQuad()                 -- compute quad to draw for a given char\n//\n//   Improved 3D API (more shippable):\n//           #include \"stb_rect_pack.h\"           -- optional, but you really want it\n//           stbtt_PackBegin()\n//           stbtt_PackSetOversample()            -- for improved quality on small fonts\n//           stbtt_PackFontRanges()               -- pack and renders\n//           stbtt_PackEnd()\n//           stbtt_GetPackedQuad()\n//\n//   \"Load\" a font file from a memory buffer (you have to keep the buffer loaded)\n//           stbtt_InitFont()\n//           stbtt_GetFontOffsetForIndex()        -- indexing for TTC font collections\n//           stbtt_GetNumberOfFonts()             -- number of fonts for TTC font collections\n//\n//   Render a unicode codepoint to a bitmap\n//           stbtt_GetCodepointBitmap()           -- allocates and returns a bitmap\n//           stbtt_MakeCodepointBitmap()          -- renders into bitmap you provide\n//           stbtt_GetCodepointBitmapBox()        -- how big the bitmap must be\n//\n//   Character advance/positioning\n//           stbtt_GetCodepointHMetrics()\n//           stbtt_GetFontVMetrics()\n//           stbtt_GetCodepointKernAdvance()\n//\n//   Starting with version 1.06, the rasterizer was replaced with a new,\n//   faster and generally-more-precise rasterizer. The new rasterizer more\n//   accurately measures pixel coverage for anti-aliasing, except in the case\n//   where multiple shapes overlap, in which case it overestimates the AA pixel\n//   coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If\n//   this turns out to be a problem, you can re-enable the old rasterizer with\n//        #define STBTT_RASTERIZER_VERSION 1\n//   which will incur about a 15% speed hit.\n//\n// ADDITIONAL DOCUMENTATION\n//\n//   Immediately after this block comment are a series of sample programs.\n//\n//   After the sample programs is the \"header file\" section. This section\n//   includes documentation for each API function.\n//\n//   Some important concepts to understand to use this library:\n//\n//      Codepoint\n//         Characters are defined by unicode codepoints, e.g. 65 is\n//         uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is\n//         the hiragana for \"ma\".\n//\n//      Glyph\n//         A visual character shape (every codepoint is rendered as\n//         some glyph)\n//\n//      Glyph index\n//         A font-specific integer ID representing a glyph\n//\n//      Baseline\n//         Glyph shapes are defined relative to a baseline, which is the\n//         bottom of uppercase characters. Characters extend both above\n//         and below the baseline.\n//\n//      Current Point\n//         As you draw text to the screen, you keep track of a \"current point\"\n//         which is the origin of each character. The current point's vertical\n//         position is the baseline. Even \"baked fonts\" use this model.\n//\n//      Vertical Font Metrics\n//         The vertical qualities of the font, used to vertically position\n//         and space the characters. See docs for stbtt_GetFontVMetrics.\n//\n//      Font Size in Pixels or Points\n//         The preferred interface for specifying font sizes in stb_truetype\n//         is to specify how tall the font's vertical extent should be in pixels.\n//         If that sounds good enough, skip the next paragraph.\n//\n//         Most font APIs instead use \"points\", which are a common typographic\n//         measurement for describing font size, defined as 72 points per inch.\n//         stb_truetype provides a point API for compatibility. However, true\n//         \"per inch\" conventions don't make much sense on computer displays\n//         since they different monitors have different number of pixels per\n//         inch. For example, Windows traditionally uses a convention that\n//         there are 96 pixels per inch, thus making 'inch' measurements have\n//         nothing to do with inches, and thus effectively defining a point to\n//         be 1.333 pixels. Additionally, the TrueType font data provides\n//         an explicit scale factor to scale a given font's glyphs to points,\n//         but the author has observed that this scale factor is often wrong\n//         for non-commercial fonts, thus making fonts scaled in points\n//         according to the TrueType spec incoherently sized in practice.\n//\n// ADVANCED USAGE\n//\n//   Quality:\n//\n//    - Use the functions with Subpixel at the end to allow your characters\n//      to have subpixel positioning. Since the font is anti-aliased, not\n//      hinted, this is very import for quality. (This is not possible with\n//      baked fonts.)\n//\n//    - Kerning is now supported, and if you're supporting subpixel rendering\n//      then kerning is worth using to give your text a polished look.\n//\n//   Performance:\n//\n//    - Convert Unicode codepoints to glyph indexes and operate on the glyphs;\n//      if you don't do this, stb_truetype is forced to do the conversion on\n//      every call.\n//\n//    - There are a lot of memory allocations. We should modify it to take\n//      a temp buffer and allocate from the temp buffer (without freeing),\n//      should help performance a lot.\n//\n// NOTES\n//\n//   The system uses the raw data found in the .ttf file without changing it\n//   and without building auxiliary data structures. This is a bit inefficient\n//   on little-endian systems (the data is big-endian), but assuming you're\n//   caching the bitmaps or glyph shapes this shouldn't be a big deal.\n//\n//   It appears to be very hard to programmatically determine what font a\n//   given file is in a general way. I provide an API for this, but I don't\n//   recommend it.\n//\n//\n// SOURCE STATISTICS (based on v0.6c, 2050 LOC)\n//\n//   Documentation & header file        520 LOC  \\___ 660 LOC documentation\n//   Sample code                        140 LOC  /\n//   Truetype parsing                   620 LOC  ---- 620 LOC TrueType\n//   Software rasterization             240 LOC  \\                           .\n//   Curve tesselation                  120 LOC   \\__ 550 LOC Bitmap creation\n//   Bitmap management                  100 LOC   /\n//   Baked bitmap interface              70 LOC  /\n//   Font name matching & access        150 LOC  ---- 150 \n//   C runtime library abstraction       60 LOC  ----  60\n//\n//\n// PERFORMANCE MEASUREMENTS FOR 1.06:\n//\n//                      32-bit     64-bit\n//   Previous release:  8.83 s     7.68 s\n//   Pool allocations:  7.72 s     6.34 s\n//   Inline sort     :  6.54 s     5.65 s\n//   New rasterizer  :  5.63 s     5.00 s\n\n//////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////\n////\n////  SAMPLE PROGRAMS\n////\n//\n//  Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless\n//\n#if 0\n#define STB_TRUETYPE_IMPLEMENTATION  // force following include to generate implementation\n#include \"stb_truetype.h\"\n\nunsigned char ttf_buffer[1<<20];\nunsigned char temp_bitmap[512*512];\n\nstbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs\nGLuint ftex;\n\nvoid my_stbtt_initfont(void)\n{\n   fread(ttf_buffer, 1, 1<<20, fopen(\"c:/windows/fonts/times.ttf\", \"rb\"));\n   stbtt_BakeFontBitmap(ttf_buffer,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits!\n   // can free ttf_buffer at this point\n   glGenTextures(1, &ftex);\n   glBindTexture(GL_TEXTURE_2D, ftex);\n   glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap);\n   // can free temp_bitmap at this point\n   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n}\n\nvoid my_stbtt_print(float x, float y, char *text)\n{\n   // assume orthographic projection with units = screen pixels, origin at top left\n   glEnable(GL_TEXTURE_2D);\n   glBindTexture(GL_TEXTURE_2D, ftex);\n   glBegin(GL_QUADS);\n   while (*text) {\n      if (*text >= 32 && *text < 128) {\n         stbtt_aligned_quad q;\n         stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9\n         glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0);\n         glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0);\n         glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1);\n         glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1);\n      }\n      ++text;\n   }\n   glEnd();\n}\n#endif\n//\n//\n//////////////////////////////////////////////////////////////////////////////\n//\n// Complete program (this compiles): get a single bitmap, print as ASCII art\n//\n#if 0\n#include <stdio.h>\n#define STB_TRUETYPE_IMPLEMENTATION  // force following include to generate implementation\n#include \"stb_truetype.h\"\n\nchar ttf_buffer[1<<25];\n\nint main(int argc, char **argv)\n{\n   stbtt_fontinfo font;\n   unsigned char *bitmap;\n   int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20);\n\n   fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : \"c:/windows/fonts/arialbd.ttf\", \"rb\"));\n\n   stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0));\n   bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0);\n\n   for (j=0; j < h; ++j) {\n      for (i=0; i < w; ++i)\n         putchar(\" .:ioVM@\"[bitmap[j*w+i]>>5]);\n      putchar('\\n');\n   }\n   return 0;\n}\n#endif \n//\n// Output:\n//\n//     .ii.\n//    @@@@@@.\n//   V@Mio@@o\n//   :i.  V@V\n//     :oM@@M\n//   :@@@MM@M\n//   @@o  o@M\n//  :@@.  M@M\n//   @@@o@@@@\n//   :M@@V:@@.\n//  \n//////////////////////////////////////////////////////////////////////////////\n// \n// Complete program: print \"Hello World!\" banner, with bugs\n//\n#if 0\nchar buffer[24<<20];\nunsigned char screen[20][79];\n\nint main(int arg, char **argv)\n{\n   stbtt_fontinfo font;\n   int i,j,ascent,baseline,ch=0;\n   float scale, xpos=2; // leave a little padding in case the character extends left\n   char *text = \"Heljo World!\"; // intentionally misspelled to show 'lj' brokenness\n\n   fread(buffer, 1, 1000000, fopen(\"c:/windows/fonts/arialbd.ttf\", \"rb\"));\n   stbtt_InitFont(&font, buffer, 0);\n\n   scale = stbtt_ScaleForPixelHeight(&font, 15);\n   stbtt_GetFontVMetrics(&font, &ascent,0,0);\n   baseline = (int) (ascent*scale);\n\n   while (text[ch]) {\n      int advance,lsb,x0,y0,x1,y1;\n      float x_shift = xpos - (float) floor(xpos);\n      stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb);\n      stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1);\n      stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]);\n      // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong\n      // because this API is really for baking character bitmaps into textures. if you want to render\n      // a sequence of characters, you really need to render each bitmap to a temp buffer, then\n      // \"alpha blend\" that into the working buffer\n      xpos += (advance * scale);\n      if (text[ch+1])\n         xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]);\n      ++ch;\n   }\n\n   for (j=0; j < 20; ++j) {\n      for (i=0; i < 78; ++i)\n         putchar(\" .:ioVM@\"[screen[j][i]>>5]);\n      putchar('\\n');\n   }\n\n   return 0;\n}\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////\n////\n////   INTEGRATION WITH YOUR CODEBASE\n////\n////   The following sections allow you to supply alternate definitions\n////   of C library functions used by stb_truetype.\n\n#ifdef STB_TRUETYPE_IMPLEMENTATION\n   // #define your own (u)stbtt_int8/16/32 before including to override this\n   #ifndef stbtt_uint8\n   typedef unsigned char   stbtt_uint8;\n   typedef signed   char   stbtt_int8;\n   typedef unsigned short  stbtt_uint16;\n   typedef signed   short  stbtt_int16;\n   typedef unsigned int    stbtt_uint32;\n   typedef signed   int    stbtt_int32;\n   #endif\n\n   typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1];\n   typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1];\n\n   // #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h\n   #ifndef STBTT_ifloor\n   #include <math.h>\n   #define STBTT_ifloor(x)   ((int) floor(x))\n   #define STBTT_iceil(x)    ((int) ceil(x))\n   #endif\n\n   #ifndef STBTT_sqrt\n   #include <math.h>\n   #define STBTT_sqrt(x)      sqrt(x)\n   #endif\n\n   #ifndef STBTT_fabs\n   #include <math.h>\n   #define STBTT_fabs(x)      fabs(x)\n   #endif\n\n   // #define your own functions \"STBTT_malloc\" / \"STBTT_free\" to avoid malloc.h\n   #ifndef STBTT_malloc\n   #include <stdlib.h>\n   #define STBTT_malloc(x,u)  ((void)(u),malloc(x))\n   #define STBTT_free(x,u)    ((void)(u),free(x))\n   #endif\n\n   #ifndef STBTT_assert\n   #include <assert.h>\n   #define STBTT_assert(x)    assert(x)\n   #endif\n\n   #ifndef STBTT_strlen\n   #include <string.h>\n   #define STBTT_strlen(x)    strlen(x)\n   #endif\n\n   #ifndef STBTT_memcpy\n   #include <memory.h>\n   #define STBTT_memcpy       memcpy\n   #define STBTT_memset       memset\n   #endif\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n////\n////   INTERFACE\n////\n////\n\n#ifndef __STB_INCLUDE_STB_TRUETYPE_H__\n#define __STB_INCLUDE_STB_TRUETYPE_H__\n\n#ifdef STBTT_STATIC\n#define STBTT_DEF static\n#else\n#define STBTT_DEF extern\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// private structure\ntypedef struct\n{\n   unsigned char *data;\n   int cursor;\n   int size;\n} stbtt__buf;\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// TEXTURE BAKING API\n//\n// If you use this API, you only have to call two functions ever.\n//\n\ntypedef struct\n{\n   unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap\n   float xoff,yoff,xadvance;\n} stbtt_bakedchar;\n\nSTBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,  // font location (use offset=0 for plain .ttf)\n                                float pixel_height,                     // height of font in pixels\n                                unsigned char *pixels, int pw, int ph,  // bitmap to be filled in\n                                int first_char, int num_chars,          // characters to bake\n                                stbtt_bakedchar *chardata);             // you allocate this, it's num_chars long\n// if return is positive, the first unused row of the bitmap\n// if return is negative, returns the negative of the number of characters that fit\n// if return is 0, no characters fit and no rows were used\n// This uses a very crappy packing.\n\ntypedef struct\n{\n   float x0,y0,s0,t0; // top-left\n   float x1,y1,s1,t1; // bottom-right\n} stbtt_aligned_quad;\n\nSTBTT_DEF void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph,  // same data as above\n                               int char_index,             // character to display\n                               float *xpos, float *ypos,   // pointers to current position in screen pixel space\n                               stbtt_aligned_quad *q,      // output: quad to draw\n                               int opengl_fillrule);       // true if opengl fill rule; false if DX9 or earlier\n// Call GetBakedQuad with char_index = 'character - first_char', and it\n// creates the quad you need to draw and advances the current position.\n//\n// The coordinate system used assumes y increases downwards.\n//\n// Characters will extend both above and below the current position;\n// see discussion of \"BASELINE\" above.\n//\n// It's inefficient; you might want to c&p it and optimize it.\n\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// NEW TEXTURE BAKING API\n//\n// This provides options for packing multiple fonts into one atlas, not\n// perfectly but better than nothing.\n\ntypedef struct\n{\n   unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap\n   float xoff,yoff,xadvance;\n   float xoff2,yoff2;\n} stbtt_packedchar;\n\ntypedef struct stbtt_pack_context stbtt_pack_context;\ntypedef struct stbtt_fontinfo stbtt_fontinfo;\n#ifndef STB_RECT_PACK_VERSION\ntypedef struct stbrp_rect stbrp_rect;\n#endif\n\nSTBTT_DEF int  stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context);\n// Initializes a packing context stored in the passed-in stbtt_pack_context.\n// Future calls using this context will pack characters into the bitmap passed\n// in here: a 1-channel bitmap that is width * height. stride_in_bytes is\n// the distance from one row to the next (or 0 to mean they are packed tightly\n// together). \"padding\" is the amount of padding to leave between each\n// character (normally you want '1' for bitmaps you'll use as textures with\n// bilinear filtering).\n//\n// Returns 0 on failure, 1 on success.\n\nSTBTT_DEF void stbtt_PackEnd  (stbtt_pack_context *spc);\n// Cleans up the packing context and frees all memory.\n\n#define STBTT_POINT_SIZE(x)   (-(x))\n\nSTBTT_DEF int  stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size,\n                                int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range);\n// Creates character bitmaps from the font_index'th font found in fontdata (use\n// font_index=0 if you don't know what that is). It creates num_chars_in_range\n// bitmaps for characters with unicode values starting at first_unicode_char_in_range\n// and increasing. Data for how to render them is stored in chardata_for_range;\n// pass these to stbtt_GetPackedQuad to get back renderable quads.\n//\n// font_size is the full height of the character from ascender to descender,\n// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed\n// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE()\n// and pass that result as 'font_size':\n//       ...,                  20 , ... // font max minus min y is 20 pixels tall\n//       ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall\n\ntypedef struct\n{\n   float font_size;\n   int first_unicode_codepoint_in_range;  // if non-zero, then the chars are continuous, and this is the first codepoint\n   int *array_of_unicode_codepoints;       // if non-zero, then this is an array of unicode codepoints\n   int num_chars;\n   stbtt_packedchar *chardata_for_range; // output\n   unsigned char h_oversample, v_oversample; // don't set these, they're used internally\n} stbtt_pack_range;\n\nSTBTT_DEF int  stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges);\n// Creates character bitmaps from multiple ranges of characters stored in\n// ranges. This will usually create a better-packed bitmap than multiple\n// calls to stbtt_PackFontRange. Note that you can call this multiple\n// times within a single PackBegin/PackEnd.\n\nSTBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample);\n// Oversampling a font increases the quality by allowing higher-quality subpixel\n// positioning, and is especially valuable at smaller text sizes.\n//\n// This function sets the amount of oversampling for all following calls to\n// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given\n// pack context. The default (no oversampling) is achieved by h_oversample=1\n// and v_oversample=1. The total number of pixels required is\n// h_oversample*v_oversample larger than the default; for example, 2x2\n// oversampling requires 4x the storage of 1x1. For best results, render\n// oversampled textures with bilinear filtering. Look at the readme in\n// stb/tests/oversample for information about oversampled fonts\n//\n// To use with PackFontRangesGather etc., you must set it before calls\n// call to PackFontRangesGatherRects.\n\nSTBTT_DEF void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph,  // same data as above\n                               int char_index,             // character to display\n                               float *xpos, float *ypos,   // pointers to current position in screen pixel space\n                               stbtt_aligned_quad *q,      // output: quad to draw\n                               int align_to_integer);\n\nSTBTT_DEF int  stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects);\nSTBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects);\nSTBTT_DEF int  stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects);\n// Calling these functions in sequence is roughly equivalent to calling\n// stbtt_PackFontRanges(). If you more control over the packing of multiple\n// fonts, or if you want to pack custom data into a font texture, take a look\n// at the source to of stbtt_PackFontRanges() and create a custom version \n// using these functions, e.g. call GatherRects multiple times,\n// building up a single array of rects, then call PackRects once,\n// then call RenderIntoRects repeatedly. This may result in a\n// better packing than calling PackFontRanges multiple times\n// (or it may not).\n\n// this is an opaque structure that you shouldn't mess with which holds\n// all the context needed from PackBegin to PackEnd.\nstruct stbtt_pack_context {\n   void *user_allocator_context;\n   void *pack_info;\n   int   width;\n   int   height;\n   int   stride_in_bytes;\n   int   padding;\n   unsigned int   h_oversample, v_oversample;\n   unsigned char *pixels;\n   void  *nodes;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// FONT LOADING\n//\n//\n\nSTBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data);\n// This function will determine the number of fonts in a font file.  TrueType\n// collection (.ttc) files may contain multiple fonts, while TrueType font\n// (.ttf) files only contain one font. The number of fonts can be used for\n// indexing with the previous function where the index is between zero and one\n// less than the total fonts. If an error occurs, -1 is returned.\n\nSTBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index);\n// Each .ttf/.ttc file may have more than one font. Each font has a sequential\n// index number starting from 0. Call this function to get the font offset for\n// a given index; it returns -1 if the index is out of range. A regular .ttf\n// file will only define one font and it always be at offset 0, so it will\n// return '0' for index 0, and -1 for all other indices.\n\n// The following structure is defined publically so you can declare one on\n// the stack or as a global or etc, but you should treat it as opaque.\nstruct stbtt_fontinfo\n{\n   void           * userdata;\n   unsigned char  * data;              // pointer to .ttf file\n   int              fontstart;         // offset of start of font\n\n   int numGlyphs;                     // number of glyphs, needed for range checking\n\n   int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf\n   int index_map;                     // a cmap mapping for our chosen character encoding\n   int indexToLocFormat;              // format needed to map from glyph index to glyph\n\n   stbtt__buf cff;                    // cff font data\n   stbtt__buf charstrings;            // the charstring index\n   stbtt__buf gsubrs;                 // global charstring subroutines index\n   stbtt__buf subrs;                  // private charstring subroutines index\n   stbtt__buf fontdicts;              // array of font dicts\n   stbtt__buf fdselect;               // map from glyph to fontdict\n};\n\nSTBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset);\n// Given an offset into the file that defines a font, this function builds\n// the necessary cached info for the rest of the system. You must allocate\n// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't\n// need to do anything special to free it, because the contents are pure\n// value data with no additional data structures. Returns 0 on failure.\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// CHARACTER TO GLYPH-INDEX CONVERSIOn\n\nSTBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint);\n// If you're going to perform multiple operations on the same character\n// and you want a speed-up, call this function with the character you're\n// going to process, then use glyph-based functions instead of the\n// codepoint-based functions.\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// CHARACTER PROPERTIES\n//\n\nSTBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels);\n// computes a scale factor to produce a font whose \"height\" is 'pixels' tall.\n// Height is measured as the distance from the highest ascender to the lowest\n// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics\n// and computing:\n//       scale = pixels / (ascent - descent)\n// so if you prefer to measure height by the ascent only, use a similar calculation.\n\nSTBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels);\n// computes a scale factor to produce a font whose EM size is mapped to\n// 'pixels' tall. This is probably what traditional APIs compute, but\n// I'm not positive.\n\nSTBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap);\n// ascent is the coordinate above the baseline the font extends; descent\n// is the coordinate below the baseline the font extends (i.e. it is typically negative)\n// lineGap is the spacing between one row's descent and the next row's ascent...\n// so you should advance the vertical position by \"*ascent - *descent + *lineGap\"\n//   these are expressed in unscaled coordinates, so you must multiply by\n//   the scale factor for a given size\n\nSTBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1);\n// the bounding box around all possible characters\n\nSTBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing);\n// leftSideBearing is the offset from the current horizontal position to the left edge of the character\n// advanceWidth is the offset from the current horizontal position to the next horizontal position\n//   these are expressed in unscaled coordinates\n\nSTBTT_DEF int  stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2);\n// an additional amount to add to the 'advance' value between ch1 and ch2\n\nSTBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1);\n// Gets the bounding box of the visible part of the glyph, in unscaled coordinates\n\nSTBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing);\nSTBTT_DEF int  stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2);\nSTBTT_DEF int  stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1);\n// as above, but takes one or more glyph indices for greater efficiency\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// GLYPH SHAPES (you probably don't need these, but they have to go before\n// the bitmaps for C declaration-order reasons)\n//\n\n#ifndef STBTT_vmove // you can predefine these to use different values (but why?)\n   enum {\n      STBTT_vmove=1,\n      STBTT_vline,\n      STBTT_vcurve,\n      STBTT_vcubic\n   };\n#endif\n\n#ifndef stbtt_vertex // you can predefine this to use different values\n                   // (we share this with other code at RAD)\n   #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file\n   typedef struct\n   {\n      stbtt_vertex_type x,y,cx,cy,cx1,cy1;\n      unsigned char type,padding;\n   } stbtt_vertex;\n#endif\n\nSTBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index);\n// returns non-zero if nothing is drawn for this glyph\n\nSTBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices);\nSTBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices);\n// returns # of vertices and fills *vertices with the pointer to them\n//   these are expressed in \"unscaled\" coordinates\n//\n// The shape is a series of countours. Each one starts with\n// a STBTT_moveto, then consists of a series of mixed\n// STBTT_lineto and STBTT_curveto segments. A lineto\n// draws a line from previous endpoint to its x,y; a curveto\n// draws a quadratic bezier from previous endpoint to\n// its x,y, using cx,cy as the bezier control point.\n\nSTBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices);\n// frees the data allocated above\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// BITMAP RENDERING\n//\n\nSTBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata);\n// frees the bitmap allocated below\n\nSTBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff);\n// allocates a large-enough single-channel 8bpp bitmap and renders the\n// specified character/glyph at the specified scale into it, with\n// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque).\n// *width & *height are filled out with the width & height of the bitmap,\n// which is stored left-to-right, top-to-bottom.\n//\n// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap\n\nSTBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff);\n// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel\n// shift for the character\n\nSTBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint);\n// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap\n// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap\n// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the\n// width and height and positioning info for it first.\n\nSTBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint);\n// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel\n// shift for the character\n\nSTBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1);\n// get the bbox of the bitmap centered around the glyph origin; so the\n// bitmap width is ix1-ix0, height is iy1-iy0, and location to place\n// the bitmap top left is (leftSideBearing*scale,iy0).\n// (Note that the bitmap uses y-increases-down, but the shape uses\n// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.)\n\nSTBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1);\n// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel\n// shift for the character\n\n// the following functions are equivalent to the above functions, but operate\n// on glyph indices instead of Unicode codepoints (for efficiency)\nSTBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff);\nSTBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff);\nSTBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph);\nSTBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph);\nSTBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1);\nSTBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1);\n\n\n// @TODO: don't expose this structure\ntypedef struct\n{\n   int w,h,stride;\n   unsigned char *pixels;\n} stbtt__bitmap;\n\n// rasterize a shape with quadratic beziers into a bitmap\nSTBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result,        // 1-channel bitmap to draw into\n                               float flatness_in_pixels,     // allowable error of curve in pixels\n                               stbtt_vertex *vertices,       // array of vertices defining shape\n                               int num_verts,                // number of vertices in above array\n                               float scale_x, float scale_y, // scale applied to input vertices\n                               float shift_x, float shift_y, // translation applied to input vertices\n                               int x_off, int y_off,         // another translation applied to input\n                               int invert,                   // if non-zero, vertically flip shape\n                               void *userdata);              // context for to STBTT_MALLOC\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Finding the right font...\n//\n// You should really just solve this offline, keep your own tables\n// of what font is what, and don't try to get it out of the .ttf file.\n// That's because getting it out of the .ttf file is really hard, because\n// the names in the file can appear in many possible encodings, in many\n// possible languages, and e.g. if you need a case-insensitive comparison,\n// the details of that depend on the encoding & language in a complex way\n// (actually underspecified in truetype, but also gigantic).\n//\n// But you can use the provided functions in two possible ways:\n//     stbtt_FindMatchingFont() will use *case-sensitive* comparisons on\n//             unicode-encoded names to try to find the font you want;\n//             you can run this before calling stbtt_InitFont()\n//\n//     stbtt_GetFontNameString() lets you get any of the various strings\n//             from the file yourself and do your own comparisons on them.\n//             You have to have called stbtt_InitFont() first.\n\n\nSTBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags);\n// returns the offset (not index) of the font that matches, or -1 if none\n//   if you use STBTT_MACSTYLE_DONTCARE, use a font name like \"Arial Bold\".\n//   if you use any other flag, use a font name like \"Arial\"; this checks\n//     the 'macStyle' header field; i don't know if fonts set this consistently\n#define STBTT_MACSTYLE_DONTCARE     0\n#define STBTT_MACSTYLE_BOLD         1\n#define STBTT_MACSTYLE_ITALIC       2\n#define STBTT_MACSTYLE_UNDERSCORE   4\n#define STBTT_MACSTYLE_NONE         8   // <= not same as 0, this makes us check the bitfield is 0\n\nSTBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2);\n// returns 1/0 whether the first string interpreted as utf8 is identical to\n// the second string interpreted as big-endian utf16... useful for strings from next func\n\nSTBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID);\n// returns the string (which may be big-endian double byte, e.g. for unicode)\n// and puts the length in bytes in *length.\n//\n// some of the values for the IDs are below; for more see the truetype spec:\n//     http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html\n//     http://www.microsoft.com/typography/otspec/name.htm\n\nenum { // platformID\n   STBTT_PLATFORM_ID_UNICODE   =0,\n   STBTT_PLATFORM_ID_MAC       =1,\n   STBTT_PLATFORM_ID_ISO       =2,\n   STBTT_PLATFORM_ID_MICROSOFT =3\n};\n\nenum { // encodingID for STBTT_PLATFORM_ID_UNICODE\n   STBTT_UNICODE_EID_UNICODE_1_0    =0,\n   STBTT_UNICODE_EID_UNICODE_1_1    =1,\n   STBTT_UNICODE_EID_ISO_10646      =2,\n   STBTT_UNICODE_EID_UNICODE_2_0_BMP=3,\n   STBTT_UNICODE_EID_UNICODE_2_0_FULL=4\n};\n\nenum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT\n   STBTT_MS_EID_SYMBOL        =0,\n   STBTT_MS_EID_UNICODE_BMP   =1,\n   STBTT_MS_EID_SHIFTJIS      =2,\n   STBTT_MS_EID_UNICODE_FULL  =10\n};\n\nenum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes\n   STBTT_MAC_EID_ROMAN        =0,   STBTT_MAC_EID_ARABIC       =4,\n   STBTT_MAC_EID_JAPANESE     =1,   STBTT_MAC_EID_HEBREW       =5,\n   STBTT_MAC_EID_CHINESE_TRAD =2,   STBTT_MAC_EID_GREEK        =6,\n   STBTT_MAC_EID_KOREAN       =3,   STBTT_MAC_EID_RUSSIAN      =7\n};\n\nenum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID...\n       // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs\n   STBTT_MS_LANG_ENGLISH     =0x0409,   STBTT_MS_LANG_ITALIAN     =0x0410,\n   STBTT_MS_LANG_CHINESE     =0x0804,   STBTT_MS_LANG_JAPANESE    =0x0411,\n   STBTT_MS_LANG_DUTCH       =0x0413,   STBTT_MS_LANG_KOREAN      =0x0412,\n   STBTT_MS_LANG_FRENCH      =0x040c,   STBTT_MS_LANG_RUSSIAN     =0x0419,\n   STBTT_MS_LANG_GERMAN      =0x0407,   STBTT_MS_LANG_SPANISH     =0x0409,\n   STBTT_MS_LANG_HEBREW      =0x040d,   STBTT_MS_LANG_SWEDISH     =0x041D\n};\n\nenum { // languageID for STBTT_PLATFORM_ID_MAC\n   STBTT_MAC_LANG_ENGLISH      =0 ,   STBTT_MAC_LANG_JAPANESE     =11,\n   STBTT_MAC_LANG_ARABIC       =12,   STBTT_MAC_LANG_KOREAN       =23,\n   STBTT_MAC_LANG_DUTCH        =4 ,   STBTT_MAC_LANG_RUSSIAN      =32,\n   STBTT_MAC_LANG_FRENCH       =1 ,   STBTT_MAC_LANG_SPANISH      =6 ,\n   STBTT_MAC_LANG_GERMAN       =2 ,   STBTT_MAC_LANG_SWEDISH      =5 ,\n   STBTT_MAC_LANG_HEBREW       =10,   STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33,\n   STBTT_MAC_LANG_ITALIAN      =3 ,   STBTT_MAC_LANG_CHINESE_TRAD =19\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // __STB_INCLUDE_STB_TRUETYPE_H__\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n////\n////   IMPLEMENTATION\n////\n////\n\n#ifdef STB_TRUETYPE_IMPLEMENTATION\n\n#ifndef STBTT_MAX_OVERSAMPLE\n#define STBTT_MAX_OVERSAMPLE   8\n#endif\n\n#if STBTT_MAX_OVERSAMPLE > 255\n#error \"STBTT_MAX_OVERSAMPLE cannot be > 255\"\n#endif\n\ntypedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1];\n\n#ifndef STBTT_RASTERIZER_VERSION\n#define STBTT_RASTERIZER_VERSION 2\n#endif\n\n#ifdef _MSC_VER\n#define STBTT__NOTUSED(v)  (void)(v)\n#else\n#define STBTT__NOTUSED(v)  (void)sizeof(v)\n#endif\n\n//////////////////////////////////////////////////////////////////////////\n//\n// stbtt__buf helpers to parse data from file\n//\n\nstatic stbtt_uint8 stbtt__buf_get8(stbtt__buf *b)\n{\n   if (b->cursor >= b->size)\n      return 0;\n   return b->data[b->cursor++];\n}\n\nstatic stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b)\n{\n   if (b->cursor >= b->size)\n      return 0;\n   return b->data[b->cursor];\n}\n\nstatic void stbtt__buf_seek(stbtt__buf *b, int o)\n{\n   STBTT_assert(!(o > b->size || o < 0));\n   b->cursor = (o > b->size || o < 0) ? b->size : o;\n}\n\nstatic void stbtt__buf_skip(stbtt__buf *b, int o)\n{\n   stbtt__buf_seek(b, b->cursor + o);\n}\n\nstatic stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n)\n{\n   stbtt_uint32 v = 0;\n   int i;\n   STBTT_assert(n >= 1 && n <= 4);\n   for (i = 0; i < n; i++)\n      v = (v << 8) | stbtt__buf_get8(b);\n   return v;\n}\n\nstatic stbtt__buf stbtt__new_buf(const void *p, size_t size)\n{\n   stbtt__buf r;\n   STBTT_assert(size < 0x40000000);\n   r.data = (stbtt_uint8*) p;\n   r.size = (int) size;\n   r.cursor = 0;\n   return r;\n}\n\n#define stbtt__buf_get16(b)  stbtt__buf_get((b), 2)\n#define stbtt__buf_get32(b)  stbtt__buf_get((b), 4)\n\nstatic stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s)\n{\n   stbtt__buf r = stbtt__new_buf(NULL, 0);\n   if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r;\n   r.data = b->data + o;\n   r.size = s;\n   return r;\n}\n\nstatic stbtt__buf stbtt__cff_get_index(stbtt__buf *b)\n{\n   int count, start, offsize;\n   start = b->cursor;\n   count = stbtt__buf_get16(b);\n   if (count) {\n      offsize = stbtt__buf_get8(b);\n      STBTT_assert(offsize >= 1 && offsize <= 4);\n      stbtt__buf_skip(b, offsize * count);\n      stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1);\n   }\n   return stbtt__buf_range(b, start, b->cursor - start);\n}\n\nstatic stbtt_uint32 stbtt__cff_int(stbtt__buf *b)\n{\n   int b0 = stbtt__buf_get8(b);\n   if (b0 >= 32 && b0 <= 246)       return b0 - 139;\n   else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108;\n   else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108;\n   else if (b0 == 28)               return stbtt__buf_get16(b);\n   else if (b0 == 29)               return stbtt__buf_get32(b);\n   STBTT_assert(0);\n   return 0;\n}\n\nstatic void stbtt__cff_skip_operand(stbtt__buf *b) {\n   int v, b0 = stbtt__buf_peek8(b);\n   STBTT_assert(b0 >= 28);\n   if (b0 == 30) {\n      stbtt__buf_skip(b, 1);\n      while (b->cursor < b->size) {\n         v = stbtt__buf_get8(b);\n         if ((v & 0xF) == 0xF || (v >> 4) == 0xF)\n            break;\n      }\n   } else {\n      stbtt__cff_int(b);\n   }\n}\n\nstatic stbtt__buf stbtt__dict_get(stbtt__buf *b, int key)\n{\n   stbtt__buf_seek(b, 0);\n   while (b->cursor < b->size) {\n      int start = b->cursor, end, op;\n      while (stbtt__buf_peek8(b) >= 28)\n         stbtt__cff_skip_operand(b);\n      end = b->cursor;\n      op = stbtt__buf_get8(b);\n      if (op == 12)  op = stbtt__buf_get8(b) | 0x100;\n      if (op == key) return stbtt__buf_range(b, start, end-start);\n   }\n   return stbtt__buf_range(b, 0, 0);\n}\n\nstatic void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out)\n{\n   int i;\n   stbtt__buf operands = stbtt__dict_get(b, key);\n   for (i = 0; i < outcount && operands.cursor < operands.size; i++)\n      out[i] = stbtt__cff_int(&operands);\n}\n\nstatic int stbtt__cff_index_count(stbtt__buf *b)\n{\n   stbtt__buf_seek(b, 0);\n   return stbtt__buf_get16(b);\n}\n\nstatic stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i)\n{\n   int count, offsize, start, end;\n   stbtt__buf_seek(&b, 0);\n   count = stbtt__buf_get16(&b);\n   offsize = stbtt__buf_get8(&b);\n   STBTT_assert(i >= 0 && i < count);\n   STBTT_assert(offsize >= 1 && offsize <= 4);\n   stbtt__buf_skip(&b, i*offsize);\n   start = stbtt__buf_get(&b, offsize);\n   end = stbtt__buf_get(&b, offsize);\n   return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start);\n}\n\n//////////////////////////////////////////////////////////////////////////\n//\n// accessors to parse data from file\n//\n\n// on platforms that don't allow misaligned reads, if we want to allow\n// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE\n\n#define ttBYTE(p)     (* (stbtt_uint8 *) (p))\n#define ttCHAR(p)     (* (stbtt_int8 *) (p))\n#define ttFixed(p)    ttLONG(p)\n\nstatic stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; }\nstatic stbtt_int16 ttSHORT(stbtt_uint8 *p)   { return p[0]*256 + p[1]; }\nstatic stbtt_uint32 ttULONG(stbtt_uint8 *p)  { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }\nstatic stbtt_int32 ttLONG(stbtt_uint8 *p)    { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }\n\n#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3))\n#define stbtt_tag(p,str)           stbtt_tag4(p,str[0],str[1],str[2],str[3])\n\nstatic int stbtt__isfont(stbtt_uint8 *font)\n{\n   // check the version number\n   if (stbtt_tag4(font, '1',0,0,0))  return 1; // TrueType 1\n   if (stbtt_tag(font, \"typ1\"))   return 1; // TrueType with type 1 font -- we don't support this!\n   if (stbtt_tag(font, \"OTTO\"))   return 1; // OpenType with CFF\n   if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0\n   if (stbtt_tag(font, \"true\"))   return 1; // Apple specification for TrueType fonts\n   return 0;\n}\n\n// @OPTIMIZE: binary search\nstatic stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag)\n{\n   stbtt_int32 num_tables = ttUSHORT(data+fontstart+4);\n   stbtt_uint32 tabledir = fontstart + 12;\n   stbtt_int32 i;\n   for (i=0; i < num_tables; ++i) {\n      stbtt_uint32 loc = tabledir + 16*i;\n      if (stbtt_tag(data+loc+0, tag))\n         return ttULONG(data+loc+8);\n   }\n   return 0;\n}\n\nstatic int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index)\n{\n   // if it's just a font, there's only one valid index\n   if (stbtt__isfont(font_collection))\n      return index == 0 ? 0 : -1;\n\n   // check if it's a TTC\n   if (stbtt_tag(font_collection, \"ttcf\")) {\n      // version 1?\n      if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) {\n         stbtt_int32 n = ttLONG(font_collection+8);\n         if (index >= n)\n            return -1;\n         return ttULONG(font_collection+12+index*4);\n      }\n   }\n   return -1;\n}\n\nstatic int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection)\n{\n   // if it's just a font, there's only one valid font\n   if (stbtt__isfont(font_collection))\n      return 1;\n\n   // check if it's a TTC\n   if (stbtt_tag(font_collection, \"ttcf\")) {\n      // version 1?\n      if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) {\n         return ttLONG(font_collection+8);\n      }\n   }\n   return 0;\n}\n\nstatic stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict)\n{\n   stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 };\n   stbtt__buf pdict;\n   stbtt__dict_get_ints(&fontdict, 18, 2, private_loc);\n   if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0);\n   pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]);\n   stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff);\n   if (!subrsoff) return stbtt__new_buf(NULL, 0);\n   stbtt__buf_seek(&cff, private_loc[1]+subrsoff);\n   return stbtt__cff_get_index(&cff);\n}\n\nstatic int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart)\n{\n   stbtt_uint32 cmap, t;\n   stbtt_int32 i,numTables;\n\n   info->data = data;\n   info->fontstart = fontstart;\n   info->cff = stbtt__new_buf(NULL, 0);\n\n   cmap = stbtt__find_table(data, fontstart, \"cmap\");       // required\n   info->loca = stbtt__find_table(data, fontstart, \"loca\"); // required\n   info->head = stbtt__find_table(data, fontstart, \"head\"); // required\n   info->glyf = stbtt__find_table(data, fontstart, \"glyf\"); // required\n   info->hhea = stbtt__find_table(data, fontstart, \"hhea\"); // required\n   info->hmtx = stbtt__find_table(data, fontstart, \"hmtx\"); // required\n   info->kern = stbtt__find_table(data, fontstart, \"kern\"); // not required\n\n   if (!cmap || !info->head || !info->hhea || !info->hmtx)\n      return 0;\n   if (info->glyf) {\n      // required for truetype\n      if (!info->loca) return 0;\n   } else {\n      // initialization for CFF / Type2 fonts (OTF)\n      stbtt__buf b, topdict, topdictidx;\n      stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0;\n      stbtt_uint32 cff;\n\n      cff = stbtt__find_table(data, fontstart, \"CFF \");\n      if (!cff) return 0;\n\n      info->fontdicts = stbtt__new_buf(NULL, 0);\n      info->fdselect = stbtt__new_buf(NULL, 0);\n\n      // @TODO this should use size from table (not 512MB)\n      info->cff = stbtt__new_buf(data+cff, 512*1024*1024);\n      b = info->cff;\n\n      // read the header\n      stbtt__buf_skip(&b, 2);\n      stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize\n\n      // @TODO the name INDEX could list multiple fonts,\n      // but we just use the first one.\n      stbtt__cff_get_index(&b);  // name INDEX\n      topdictidx = stbtt__cff_get_index(&b);\n      topdict = stbtt__cff_index_get(topdictidx, 0);\n      stbtt__cff_get_index(&b);  // string INDEX\n      info->gsubrs = stbtt__cff_get_index(&b);\n\n      stbtt__dict_get_ints(&topdict, 17, 1, &charstrings);\n      stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype);\n      stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff);\n      stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff);\n      info->subrs = stbtt__get_subrs(b, topdict);\n\n      // we only support Type 2 charstrings\n      if (cstype != 2) return 0;\n      if (charstrings == 0) return 0;\n\n      if (fdarrayoff) {\n         // looks like a CID font\n         if (!fdselectoff) return 0;\n         stbtt__buf_seek(&b, fdarrayoff);\n         info->fontdicts = stbtt__cff_get_index(&b);\n         info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff);\n      }\n\n      stbtt__buf_seek(&b, charstrings);\n      info->charstrings = stbtt__cff_get_index(&b);\n   }\n\n   t = stbtt__find_table(data, fontstart, \"maxp\");\n   if (t)\n      info->numGlyphs = ttUSHORT(data+t+4);\n   else\n      info->numGlyphs = 0xffff;\n\n   // find a cmap encoding table we understand *now* to avoid searching\n   // later. (todo: could make this installable)\n   // the same regardless of glyph.\n   numTables = ttUSHORT(data + cmap + 2);\n   info->index_map = 0;\n   for (i=0; i < numTables; ++i) {\n      stbtt_uint32 encoding_record = cmap + 4 + 8 * i;\n      // find an encoding we understand:\n      switch(ttUSHORT(data+encoding_record)) {\n         case STBTT_PLATFORM_ID_MICROSOFT:\n            switch (ttUSHORT(data+encoding_record+2)) {\n               case STBTT_MS_EID_UNICODE_BMP:\n               case STBTT_MS_EID_UNICODE_FULL:\n                  // MS/Unicode\n                  info->index_map = cmap + ttULONG(data+encoding_record+4);\n                  break;\n            }\n            break;\n        case STBTT_PLATFORM_ID_UNICODE:\n            // Mac/iOS has these\n            // all the encodingIDs are unicode, so we don't bother to check it\n            info->index_map = cmap + ttULONG(data+encoding_record+4);\n            break;\n      }\n   }\n   if (info->index_map == 0)\n      return 0;\n\n   info->indexToLocFormat = ttUSHORT(data+info->head + 50);\n   return 1;\n}\n\nSTBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint)\n{\n   stbtt_uint8 *data = info->data;\n   stbtt_uint32 index_map = info->index_map;\n\n   stbtt_uint16 format = ttUSHORT(data + index_map + 0);\n   if (format == 0) { // apple byte encoding\n      stbtt_int32 bytes = ttUSHORT(data + index_map + 2);\n      if (unicode_codepoint < bytes-6)\n         return ttBYTE(data + index_map + 6 + unicode_codepoint);\n      return 0;\n   } else if (format == 6) {\n      stbtt_uint32 first = ttUSHORT(data + index_map + 6);\n      stbtt_uint32 count = ttUSHORT(data + index_map + 8);\n      if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count)\n         return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2);\n      return 0;\n   } else if (format == 2) {\n      STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean\n      return 0;\n   } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges\n      stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1;\n      stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1;\n      stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10);\n      stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1;\n\n      // do a binary search of the segments\n      stbtt_uint32 endCount = index_map + 14;\n      stbtt_uint32 search = endCount;\n\n      if (unicode_codepoint > 0xffff)\n         return 0;\n\n      // they lie from endCount .. endCount + segCount\n      // but searchRange is the nearest power of two, so...\n      if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2))\n         search += rangeShift*2;\n\n      // now decrement to bias correctly to find smallest\n      search -= 2;\n      while (entrySelector) {\n         stbtt_uint16 end;\n         searchRange >>= 1;\n         end = ttUSHORT(data + search + searchRange*2);\n         if (unicode_codepoint > end)\n            search += searchRange*2;\n         --entrySelector;\n      }\n      search += 2;\n\n      {\n         stbtt_uint16 offset, start;\n         stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1);\n\n         STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item));\n         start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item);\n         if (unicode_codepoint < start)\n            return 0;\n\n         offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item);\n         if (offset == 0)\n            return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item));\n\n         return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item);\n      }\n   } else if (format == 12 || format == 13) {\n      stbtt_uint32 ngroups = ttULONG(data+index_map+12);\n      stbtt_int32 low,high;\n      low = 0; high = (stbtt_int32)ngroups;\n      // Binary search the right group.\n      while (low < high) {\n         stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high\n         stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12);\n         stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4);\n         if ((stbtt_uint32) unicode_codepoint < start_char)\n            high = mid;\n         else if ((stbtt_uint32) unicode_codepoint > end_char)\n            low = mid+1;\n         else {\n            stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8);\n            if (format == 12)\n               return start_glyph + unicode_codepoint-start_char;\n            else // format == 13\n               return start_glyph;\n         }\n      }\n      return 0; // not found\n   }\n   // @TODO\n   STBTT_assert(0);\n   return 0;\n}\n\nSTBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices)\n{\n   return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices);\n}\n\nstatic void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy)\n{\n   v->type = type;\n   v->x = (stbtt_int16) x;\n   v->y = (stbtt_int16) y;\n   v->cx = (stbtt_int16) cx;\n   v->cy = (stbtt_int16) cy;\n}\n\nstatic int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index)\n{\n   int g1,g2;\n\n   STBTT_assert(!info->cff.size);\n\n   if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range\n   if (info->indexToLocFormat >= 2)    return -1; // unknown index->glyph map format\n\n   if (info->indexToLocFormat == 0) {\n      g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2;\n      g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2;\n   } else {\n      g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4);\n      g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4);\n   }\n\n   return g1==g2 ? -1 : g1; // if length is 0, return -1\n}\n\nstatic int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1);\n\nSTBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1)\n{\n   if (info->cff.size) {\n      stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1);\n   } else {\n      int g = stbtt__GetGlyfOffset(info, glyph_index);\n      if (g < 0) return 0;\n\n      if (x0) *x0 = ttSHORT(info->data + g + 2);\n      if (y0) *y0 = ttSHORT(info->data + g + 4);\n      if (x1) *x1 = ttSHORT(info->data + g + 6);\n      if (y1) *y1 = ttSHORT(info->data + g + 8);\n   }\n   return 1;\n}\n\nSTBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1)\n{\n   return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1);\n}\n\nSTBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index)\n{\n   stbtt_int16 numberOfContours;\n   int g;\n   if (info->cff.size)\n      return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0;\n   g = stbtt__GetGlyfOffset(info, glyph_index);\n   if (g < 0) return 1;\n   numberOfContours = ttSHORT(info->data + g);\n   return numberOfContours == 0;\n}\n\nstatic int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off,\n    stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy)\n{\n   if (start_off) {\n      if (was_off)\n         stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy);\n      stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy);\n   } else {\n      if (was_off)\n         stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy);\n      else\n         stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0);\n   }\n   return num_vertices;\n}\n\nstatic int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices)\n{\n   stbtt_int16 numberOfContours;\n   stbtt_uint8 *endPtsOfContours;\n   stbtt_uint8 *data = info->data;\n   stbtt_vertex *vertices=0;\n   int num_vertices=0;\n   int g = stbtt__GetGlyfOffset(info, glyph_index);\n\n   *pvertices = NULL;\n\n   if (g < 0) return 0;\n\n   numberOfContours = ttSHORT(data + g);\n\n   if (numberOfContours > 0) {\n      stbtt_uint8 flags=0,flagcount;\n      stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0;\n      stbtt_int32 x,y,cx,cy,sx,sy, scx,scy;\n      stbtt_uint8 *points;\n      endPtsOfContours = (data + g + 10);\n      ins = ttUSHORT(data + g + 10 + numberOfContours * 2);\n      points = data + g + 10 + numberOfContours * 2 + 2 + ins;\n\n      n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2);\n\n      m = n + 2*numberOfContours;  // a loose bound on how many vertices we might need\n      vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata);\n      if (vertices == 0)\n         return 0;\n\n      next_move = 0;\n      flagcount=0;\n\n      // in first pass, we load uninterpreted data into the allocated array\n      // above, shifted to the end of the array so we won't overwrite it when\n      // we create our final data starting from the front\n\n      off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated\n\n      // first load flags\n\n      for (i=0; i < n; ++i) {\n         if (flagcount == 0) {\n            flags = *points++;\n            if (flags & 8)\n               flagcount = *points++;\n         } else\n            --flagcount;\n         vertices[off+i].type = flags;\n      }\n\n      // now load x coordinates\n      x=0;\n      for (i=0; i < n; ++i) {\n         flags = vertices[off+i].type;\n         if (flags & 2) {\n            stbtt_int16 dx = *points++;\n            x += (flags & 16) ? dx : -dx; // ???\n         } else {\n            if (!(flags & 16)) {\n               x = x + (stbtt_int16) (points[0]*256 + points[1]);\n               points += 2;\n            }\n         }\n         vertices[off+i].x = (stbtt_int16) x;\n      }\n\n      // now load y coordinates\n      y=0;\n      for (i=0; i < n; ++i) {\n         flags = vertices[off+i].type;\n         if (flags & 4) {\n            stbtt_int16 dy = *points++;\n            y += (flags & 32) ? dy : -dy; // ???\n         } else {\n            if (!(flags & 32)) {\n               y = y + (stbtt_int16) (points[0]*256 + points[1]);\n               points += 2;\n            }\n         }\n         vertices[off+i].y = (stbtt_int16) y;\n      }\n\n      // now convert them to our format\n      num_vertices=0;\n      sx = sy = cx = cy = scx = scy = 0;\n      for (i=0; i < n; ++i) {\n         flags = vertices[off+i].type;\n         x     = (stbtt_int16) vertices[off+i].x;\n         y     = (stbtt_int16) vertices[off+i].y;\n\n         if (next_move == i) {\n            if (i != 0)\n               num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);\n\n            // now start the new one               \n            start_off = !(flags & 1);\n            if (start_off) {\n               // if we start off with an off-curve point, then when we need to find a point on the curve\n               // where we can start, and we need to save some state for when we wraparound.\n               scx = x;\n               scy = y;\n               if (!(vertices[off+i+1].type & 1)) {\n                  // next point is also a curve point, so interpolate an on-point curve\n                  sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1;\n                  sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1;\n               } else {\n                  // otherwise just use the next point as our start point\n                  sx = (stbtt_int32) vertices[off+i+1].x;\n                  sy = (stbtt_int32) vertices[off+i+1].y;\n                  ++i; // we're using point i+1 as the starting point, so skip it\n               }\n            } else {\n               sx = x;\n               sy = y;\n            }\n            stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0);\n            was_off = 0;\n            next_move = 1 + ttUSHORT(endPtsOfContours+j*2);\n            ++j;\n         } else {\n            if (!(flags & 1)) { // if it's a curve\n               if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint\n                  stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy);\n               cx = x;\n               cy = y;\n               was_off = 1;\n            } else {\n               if (was_off)\n                  stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy);\n               else\n                  stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0);\n               was_off = 0;\n            }\n         }\n      }\n      num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);\n   } else if (numberOfContours == -1) {\n      // Compound shapes.\n      int more = 1;\n      stbtt_uint8 *comp = data + g + 10;\n      num_vertices = 0;\n      vertices = 0;\n      while (more) {\n         stbtt_uint16 flags, gidx;\n         int comp_num_verts = 0, i;\n         stbtt_vertex *comp_verts = 0, *tmp = 0;\n         float mtx[6] = {1,0,0,1,0,0}, m, n;\n         \n         flags = ttSHORT(comp); comp+=2;\n         gidx = ttSHORT(comp); comp+=2;\n\n         if (flags & 2) { // XY values\n            if (flags & 1) { // shorts\n               mtx[4] = ttSHORT(comp); comp+=2;\n               mtx[5] = ttSHORT(comp); comp+=2;\n            } else {\n               mtx[4] = ttCHAR(comp); comp+=1;\n               mtx[5] = ttCHAR(comp); comp+=1;\n            }\n         }\n         else {\n            // @TODO handle matching point\n            STBTT_assert(0);\n         }\n         if (flags & (1<<3)) { // WE_HAVE_A_SCALE\n            mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[1] = mtx[2] = 0;\n         } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE\n            mtx[0] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[1] = mtx[2] = 0;\n            mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;\n         } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO\n            mtx[0] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[1] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[2] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;\n         }\n         \n         // Find transformation scales.\n         m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]);\n         n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]);\n\n         // Get indexed glyph.\n         comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts);\n         if (comp_num_verts > 0) {\n            // Transform vertices.\n            for (i = 0; i < comp_num_verts; ++i) {\n               stbtt_vertex* v = &comp_verts[i];\n               stbtt_vertex_type x,y;\n               x=v->x; y=v->y;\n               v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4]));\n               v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5]));\n               x=v->cx; y=v->cy;\n               v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4]));\n               v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5]));\n            }\n            // Append vertices.\n            tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata);\n            if (!tmp) {\n               if (vertices) STBTT_free(vertices, info->userdata);\n               if (comp_verts) STBTT_free(comp_verts, info->userdata);\n               return 0;\n            }\n            if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex));\n            STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex));\n            if (vertices) STBTT_free(vertices, info->userdata);\n            vertices = tmp;\n            STBTT_free(comp_verts, info->userdata);\n            num_vertices += comp_num_verts;\n         }\n         // More components ?\n         more = flags & (1<<5);\n      }\n   } else if (numberOfContours < 0) {\n      // @TODO other compound variations?\n      STBTT_assert(0);\n   } else {\n      // numberOfCounters == 0, do nothing\n   }\n\n   *pvertices = vertices;\n   return num_vertices;\n}\n\ntypedef struct\n{\n   int bounds;\n   int started;\n   float first_x, first_y;\n   float x, y;\n   stbtt_int32 min_x, max_x, min_y, max_y;\n\n   stbtt_vertex *pvertices;\n   int num_vertices;\n} stbtt__csctx;\n\n#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0}\n\nstatic void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y)\n{\n   if (x > c->max_x || !c->started) c->max_x = x;\n   if (y > c->max_y || !c->started) c->max_y = y;\n   if (x < c->min_x || !c->started) c->min_x = x;\n   if (y < c->min_y || !c->started) c->min_y = y;\n   c->started = 1;\n}\n\nstatic void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1)\n{\n   if (c->bounds) {\n      stbtt__track_vertex(c, x, y);\n      if (type == STBTT_vcubic) {\n         stbtt__track_vertex(c, cx, cy);\n         stbtt__track_vertex(c, cx1, cy1);\n      }\n   } else {\n      stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy);\n      c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1;\n      c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1;\n   }\n   c->num_vertices++;\n}\n\nstatic void stbtt__csctx_close_shape(stbtt__csctx *ctx)\n{\n   if (ctx->first_x != ctx->x || ctx->first_y != ctx->y)\n      stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0);\n}\n\nstatic void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy)\n{\n   stbtt__csctx_close_shape(ctx);\n   ctx->first_x = ctx->x = ctx->x + dx;\n   ctx->first_y = ctx->y = ctx->y + dy;\n   stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0);\n}\n\nstatic void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy)\n{\n   ctx->x += dx;\n   ctx->y += dy;\n   stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0);\n}\n\nstatic void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3)\n{\n   float cx1 = ctx->x + dx1;\n   float cy1 = ctx->y + dy1;\n   float cx2 = cx1 + dx2;\n   float cy2 = cy1 + dy2;\n   ctx->x = cx2 + dx3;\n   ctx->y = cy2 + dy3;\n   stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2);\n}\n\nstatic stbtt__buf stbtt__get_subr(stbtt__buf idx, int n)\n{\n   int count = stbtt__cff_index_count(&idx);\n   int bias = 107;\n   if (count >= 33900)\n      bias = 32768;\n   else if (count >= 1240)\n      bias = 1131;\n   n += bias;\n   if (n < 0 || n >= count)\n      return stbtt__new_buf(NULL, 0);\n   return stbtt__cff_index_get(idx, n);\n}\n\nstatic stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index)\n{\n   stbtt__buf fdselect = info->fdselect;\n   int nranges, start, end, v, fmt, fdselector = -1, i;\n\n   stbtt__buf_seek(&fdselect, 0);\n   fmt = stbtt__buf_get8(&fdselect);\n   if (fmt == 0) {\n      // untested\n      stbtt__buf_skip(&fdselect, glyph_index);\n      fdselector = stbtt__buf_get8(&fdselect);\n   } else if (fmt == 3) {\n      nranges = stbtt__buf_get16(&fdselect);\n      start = stbtt__buf_get16(&fdselect);\n      for (i = 0; i < nranges; i++) {\n         v = stbtt__buf_get8(&fdselect);\n         end = stbtt__buf_get16(&fdselect);\n         if (glyph_index >= start && glyph_index < end) {\n            fdselector = v;\n            break;\n         }\n         start = end;\n      }\n   }\n   if (fdselector == -1) stbtt__new_buf(NULL, 0);\n   return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector));\n}\n\nstatic int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c)\n{\n   int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0;\n   int has_subrs = 0, clear_stack;\n   float s[48];\n   stbtt__buf subr_stack[10], subrs = info->subrs, b;\n   float f;\n\n#define STBTT__CSERR(s) (0)\n\n   // this currently ignores the initial width value, which isn't needed if we have hmtx\n   b = stbtt__cff_index_get(info->charstrings, glyph_index);\n   while (b.cursor < b.size) {\n      i = 0;\n      clear_stack = 1;\n      b0 = stbtt__buf_get8(&b);\n      switch (b0) {\n      // @TODO implement hinting\n      case 0x13: // hintmask\n      case 0x14: // cntrmask\n         if (in_header)\n            maskbits += (sp / 2); // implicit \"vstem\"\n         in_header = 0;\n         stbtt__buf_skip(&b, (maskbits + 7) / 8);\n         break;\n\n      case 0x01: // hstem\n      case 0x03: // vstem\n      case 0x12: // hstemhm\n      case 0x17: // vstemhm\n         maskbits += (sp / 2);\n         break;\n\n      case 0x15: // rmoveto\n         in_header = 0;\n         if (sp < 2) return STBTT__CSERR(\"rmoveto stack\");\n         stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]);\n         break;\n      case 0x04: // vmoveto\n         in_header = 0;\n         if (sp < 1) return STBTT__CSERR(\"vmoveto stack\");\n         stbtt__csctx_rmove_to(c, 0, s[sp-1]);\n         break;\n      case 0x16: // hmoveto\n         in_header = 0;\n         if (sp < 1) return STBTT__CSERR(\"hmoveto stack\");\n         stbtt__csctx_rmove_to(c, s[sp-1], 0);\n         break;\n\n      case 0x05: // rlineto\n         if (sp < 2) return STBTT__CSERR(\"rlineto stack\");\n         for (; i + 1 < sp; i += 2)\n            stbtt__csctx_rline_to(c, s[i], s[i+1]);\n         break;\n\n      // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical\n      // starting from a different place.\n\n      case 0x07: // vlineto\n         if (sp < 1) return STBTT__CSERR(\"vlineto stack\");\n         goto vlineto;\n      case 0x06: // hlineto\n         if (sp < 1) return STBTT__CSERR(\"hlineto stack\");\n         for (;;) {\n            if (i >= sp) break;\n            stbtt__csctx_rline_to(c, s[i], 0);\n            i++;\n      vlineto:\n            if (i >= sp) break;\n            stbtt__csctx_rline_to(c, 0, s[i]);\n            i++;\n         }\n         break;\n\n      case 0x1F: // hvcurveto\n         if (sp < 4) return STBTT__CSERR(\"hvcurveto stack\");\n         goto hvcurveto;\n      case 0x1E: // vhcurveto\n         if (sp < 4) return STBTT__CSERR(\"vhcurveto stack\");\n         for (;;) {\n            if (i + 3 >= sp) break;\n            stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f);\n            i += 4;\n      hvcurveto:\n            if (i + 3 >= sp) break;\n            stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]);\n            i += 4;\n         }\n         break;\n\n      case 0x08: // rrcurveto\n         if (sp < 6) return STBTT__CSERR(\"rcurveline stack\");\n         for (; i + 5 < sp; i += 6)\n            stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]);\n         break;\n\n      case 0x18: // rcurveline\n         if (sp < 8) return STBTT__CSERR(\"rcurveline stack\");\n         for (; i + 5 < sp - 2; i += 6)\n            stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]);\n         if (i + 1 >= sp) return STBTT__CSERR(\"rcurveline stack\");\n         stbtt__csctx_rline_to(c, s[i], s[i+1]);\n         break;\n\n      case 0x19: // rlinecurve\n         if (sp < 8) return STBTT__CSERR(\"rlinecurve stack\");\n         for (; i + 1 < sp - 6; i += 2)\n            stbtt__csctx_rline_to(c, s[i], s[i+1]);\n         if (i + 5 >= sp) return STBTT__CSERR(\"rlinecurve stack\");\n         stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]);\n         break;\n\n      case 0x1A: // vvcurveto\n      case 0x1B: // hhcurveto\n         if (sp < 4) return STBTT__CSERR(\"(vv|hh)curveto stack\");\n         f = 0.0;\n         if (sp & 1) { f = s[i]; i++; }\n         for (; i + 3 < sp; i += 4) {\n            if (b0 == 0x1B)\n               stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0);\n            else\n               stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]);\n            f = 0.0;\n         }\n         break;\n\n      case 0x0A: // callsubr\n         if (!has_subrs) {\n            if (info->fdselect.size)\n               subrs = stbtt__cid_get_glyph_subrs(info, glyph_index);\n            has_subrs = 1;\n         }\n         // fallthrough\n      case 0x1D: // callgsubr\n         if (sp < 1) return STBTT__CSERR(\"call(g|)subr stack\");\n         v = (int) s[--sp];\n         if (subr_stack_height >= 10) return STBTT__CSERR(\"recursion limit\");\n         subr_stack[subr_stack_height++] = b;\n         b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v);\n         if (b.size == 0) return STBTT__CSERR(\"subr not found\");\n         b.cursor = 0;\n         clear_stack = 0;\n         break;\n\n      case 0x0B: // return\n         if (subr_stack_height <= 0) return STBTT__CSERR(\"return outside subr\");\n         b = subr_stack[--subr_stack_height];\n         clear_stack = 0;\n         break;\n\n      case 0x0E: // endchar\n         stbtt__csctx_close_shape(c);\n         return 1;\n\n      case 0x0C: { // two-byte escape\n         float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6;\n         float dx, dy;\n         int b1 = stbtt__buf_get8(&b);\n         switch (b1) {\n         // @TODO These \"flex\" implementations ignore the flex-depth and resolution,\n         // and always draw beziers.\n         case 0x22: // hflex\n            if (sp < 7) return STBTT__CSERR(\"hflex stack\");\n            dx1 = s[0];\n            dx2 = s[1];\n            dy2 = s[2];\n            dx3 = s[3];\n            dx4 = s[4];\n            dx5 = s[5];\n            dx6 = s[6];\n            stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0);\n            stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0);\n            break;\n\n         case 0x23: // flex\n            if (sp < 13) return STBTT__CSERR(\"flex stack\");\n            dx1 = s[0];\n            dy1 = s[1];\n            dx2 = s[2];\n            dy2 = s[3];\n            dx3 = s[4];\n            dy3 = s[5];\n            dx4 = s[6];\n            dy4 = s[7];\n            dx5 = s[8];\n            dy5 = s[9];\n            dx6 = s[10];\n            dy6 = s[11];\n            //fd is s[12]\n            stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3);\n            stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6);\n            break;\n\n         case 0x24: // hflex1\n            if (sp < 9) return STBTT__CSERR(\"hflex1 stack\");\n            dx1 = s[0];\n            dy1 = s[1];\n            dx2 = s[2];\n            dy2 = s[3];\n            dx3 = s[4];\n            dx4 = s[5];\n            dx5 = s[6];\n            dy5 = s[7];\n            dx6 = s[8];\n            stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0);\n            stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5));\n            break;\n\n         case 0x25: // flex1\n            if (sp < 11) return STBTT__CSERR(\"flex1 stack\");\n            dx1 = s[0];\n            dy1 = s[1];\n            dx2 = s[2];\n            dy2 = s[3];\n            dx3 = s[4];\n            dy3 = s[5];\n            dx4 = s[6];\n            dy4 = s[7];\n            dx5 = s[8];\n            dy5 = s[9];\n            dx6 = dy6 = s[10];\n            dx = dx1+dx2+dx3+dx4+dx5;\n            dy = dy1+dy2+dy3+dy4+dy5;\n            if (STBTT_fabs(dx) > STBTT_fabs(dy))\n               dy6 = -dy;\n            else\n               dx6 = -dx;\n            stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3);\n            stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6);\n            break;\n\n         default:\n            return STBTT__CSERR(\"unimplemented\");\n         }\n      } break;\n\n      default:\n         if (b0 != 255 && b0 != 28 && (b0 < 32 || b0 > 254))\n            return STBTT__CSERR(\"reserved operator\");\n\n         // push immediate\n         if (b0 == 255) {\n            f = (float)stbtt__buf_get32(&b) / 0x10000;\n         } else {\n            stbtt__buf_skip(&b, -1);\n            f = (float)(stbtt_int16)stbtt__cff_int(&b);\n         }\n         if (sp >= 48) return STBTT__CSERR(\"push stack overflow\");\n         s[sp++] = f;\n         clear_stack = 0;\n         break;\n      }\n      if (clear_stack) sp = 0;\n   }\n   return STBTT__CSERR(\"no endchar\");\n\n#undef STBTT__CSERR\n}\n\nstatic int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices)\n{\n   // runs the charstring twice, once to count and once to output (to avoid realloc)\n   stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1);\n   stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0);\n   if (stbtt__run_charstring(info, glyph_index, &count_ctx)) {\n      *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata);\n      output_ctx.pvertices = *pvertices;\n      if (stbtt__run_charstring(info, glyph_index, &output_ctx)) {\n         STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices);\n         return output_ctx.num_vertices;\n      }\n   }\n   *pvertices = NULL;\n   return 0;\n}\n\nstatic int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1)\n{\n   stbtt__csctx c = STBTT__CSCTX_INIT(1);\n   int r = stbtt__run_charstring(info, glyph_index, &c);\n   if (x0) {\n      *x0 = r ? c.min_x : 0;\n      *y0 = r ? c.min_y : 0;\n      *x1 = r ? c.max_x : 0;\n      *y1 = r ? c.max_y : 0;\n   }\n   return r ? c.num_vertices : 0;\n}\n\nSTBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices)\n{\n   if (!info->cff.size)\n      return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices);\n   else\n      return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices);\n}\n\nSTBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing)\n{\n   stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34);\n   if (glyph_index < numOfLongHorMetrics) {\n      if (advanceWidth)     *advanceWidth    = ttSHORT(info->data + info->hmtx + 4*glyph_index);\n      if (leftSideBearing)  *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2);\n   } else {\n      if (advanceWidth)     *advanceWidth    = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1));\n      if (leftSideBearing)  *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics));\n   }\n}\n\nSTBTT_DEF int  stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)\n{\n   stbtt_uint8 *data = info->data + info->kern;\n   stbtt_uint32 needle, straw;\n   int l, r, m;\n\n   // we only look at the first table. it must be 'horizontal' and format 0.\n   if (!info->kern)\n      return 0;\n   if (ttUSHORT(data+2) < 1) // number of tables, need at least 1\n      return 0;\n   if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format\n      return 0;\n\n   l = 0;\n   r = ttUSHORT(data+10) - 1;\n   needle = glyph1 << 16 | glyph2;\n   while (l <= r) {\n      m = (l + r) >> 1;\n      straw = ttULONG(data+18+(m*6)); // note: unaligned read\n      if (needle < straw)\n         r = m - 1;\n      else if (needle > straw)\n         l = m + 1;\n      else\n         return ttSHORT(data+22+(m*6));\n   }\n   return 0;\n}\n\nSTBTT_DEF int  stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2)\n{\n   if (!info->kern) // if no kerning table, don't waste time looking up both codepoint->glyphs\n      return 0;\n   return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2));\n}\n\nSTBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing)\n{\n   stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing);\n}\n\nSTBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap)\n{\n   if (ascent ) *ascent  = ttSHORT(info->data+info->hhea + 4);\n   if (descent) *descent = ttSHORT(info->data+info->hhea + 6);\n   if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8);\n}\n\nSTBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1)\n{\n   *x0 = ttSHORT(info->data + info->head + 36);\n   *y0 = ttSHORT(info->data + info->head + 38);\n   *x1 = ttSHORT(info->data + info->head + 40);\n   *y1 = ttSHORT(info->data + info->head + 42);\n}\n\nSTBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height)\n{\n   int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6);\n   return (float) height / fheight;\n}\n\nSTBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels)\n{\n   int unitsPerEm = ttUSHORT(info->data + info->head + 18);\n   return pixels / unitsPerEm;\n}\n\nSTBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v)\n{\n   STBTT_free(v, info->userdata);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// antialiasing software rasterizer\n//\n\nSTBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning\n   if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) {\n      // e.g. space character\n      if (ix0) *ix0 = 0;\n      if (iy0) *iy0 = 0;\n      if (ix1) *ix1 = 0;\n      if (iy1) *iy1 = 0;\n   } else {\n      // move to integral bboxes (treating pixels as little squares, what pixels get touched)?\n      if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x);\n      if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y);\n      if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x);\n      if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y);\n   }\n}\n\nSTBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1);\n}\n\nSTBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1);\n}\n\nSTBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  Rasterizer\n\ntypedef struct stbtt__hheap_chunk\n{\n   struct stbtt__hheap_chunk *next;\n} stbtt__hheap_chunk;\n\ntypedef struct stbtt__hheap\n{\n   struct stbtt__hheap_chunk *head;\n   void   *first_free;\n   int    num_remaining_in_head_chunk;\n} stbtt__hheap;\n\nstatic void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata)\n{\n   if (hh->first_free) {\n      void *p = hh->first_free;\n      hh->first_free = * (void **) p;\n      return p;\n   } else {\n      if (hh->num_remaining_in_head_chunk == 0) {\n         int count = (size < 32 ? 2000 : size < 128 ? 800 : 100);\n         stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata);\n         if (c == NULL)\n            return NULL;\n         c->next = hh->head;\n         hh->head = c;\n         hh->num_remaining_in_head_chunk = count;\n      }\n      --hh->num_remaining_in_head_chunk;\n      return (char *) (hh->head) + size * hh->num_remaining_in_head_chunk;\n   }\n}\n\nstatic void stbtt__hheap_free(stbtt__hheap *hh, void *p)\n{\n   *(void **) p = hh->first_free;\n   hh->first_free = p;\n}\n\nstatic void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata)\n{\n   stbtt__hheap_chunk *c = hh->head;\n   while (c) {\n      stbtt__hheap_chunk *n = c->next;\n      STBTT_free(c, userdata);\n      c = n;\n   }\n}\n\ntypedef struct stbtt__edge {\n   float x0,y0, x1,y1;\n   int invert;\n} stbtt__edge;\n\n\ntypedef struct stbtt__active_edge\n{\n   struct stbtt__active_edge *next;\n   #if STBTT_RASTERIZER_VERSION==1\n   int x,dx;\n   float ey;\n   int direction;\n   #elif STBTT_RASTERIZER_VERSION==2\n   float fx,fdx,fdy;\n   float direction;\n   float sy;\n   float ey;\n   #else\n   #error \"Unrecognized value of STBTT_RASTERIZER_VERSION\"\n   #endif\n} stbtt__active_edge;\n\n#if STBTT_RASTERIZER_VERSION == 1\n#define STBTT_FIXSHIFT   10\n#define STBTT_FIX        (1 << STBTT_FIXSHIFT)\n#define STBTT_FIXMASK    (STBTT_FIX-1)\n\nstatic stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata)\n{\n   stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata);\n   float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);\n   STBTT_assert(z != NULL);\n   if (!z) return z;\n   \n   // round dx down to avoid overshooting\n   if (dxdy < 0)\n      z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy);\n   else\n      z->dx = STBTT_ifloor(STBTT_FIX * dxdy);\n\n   z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount\n   z->x -= off_x * STBTT_FIX;\n\n   z->ey = e->y1;\n   z->next = 0;\n   z->direction = e->invert ? 1 : -1;\n   return z;\n}\n#elif STBTT_RASTERIZER_VERSION == 2\nstatic stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata)\n{\n   stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata);\n   float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);\n   STBTT_assert(z != NULL);\n   //STBTT_assert(e->y0 <= start_point);\n   if (!z) return z;\n   z->fdx = dxdy;\n   z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f;\n   z->fx = e->x0 + dxdy * (start_point - e->y0);\n   z->fx -= off_x;\n   z->direction = e->invert ? 1.0f : -1.0f;\n   z->sy = e->y0;\n   z->ey = e->y1;\n   z->next = 0;\n   return z;\n}\n#else\n#error \"Unrecognized value of STBTT_RASTERIZER_VERSION\"\n#endif\n\n#if STBTT_RASTERIZER_VERSION == 1\n// note: this routine clips fills that extend off the edges... ideally this\n// wouldn't happen, but it could happen if the truetype glyph bounding boxes\n// are wrong, or if the user supplies a too-small bitmap\nstatic void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight)\n{\n   // non-zero winding fill\n   int x0=0, w=0;\n\n   while (e) {\n      if (w == 0) {\n         // if we're currently at zero, we need to record the edge start point\n         x0 = e->x; w += e->direction;\n      } else {\n         int x1 = e->x; w += e->direction;\n         // if we went to zero, we need to draw\n         if (w == 0) {\n            int i = x0 >> STBTT_FIXSHIFT;\n            int j = x1 >> STBTT_FIXSHIFT;\n\n            if (i < len && j >= 0) {\n               if (i == j) {\n                  // x0,x1 are the same pixel, so compute combined coverage\n                  scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT);\n               } else {\n                  if (i >= 0) // add antialiasing for x0\n                     scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT);\n                  else\n                     i = -1; // clip\n\n                  if (j < len) // add antialiasing for x1\n                     scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT);\n                  else\n                     j = len; // clip\n\n                  for (++i; i < j; ++i) // fill pixels between x0 and x1\n                     scanline[i] = scanline[i] + (stbtt_uint8) max_weight;\n               }\n            }\n         }\n      }\n      \n      e = e->next;\n   }\n}\n\nstatic void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata)\n{\n   stbtt__hheap hh = { 0, 0, 0 };\n   stbtt__active_edge *active = NULL;\n   int y,j=0;\n   int max_weight = (255 / vsubsample);  // weight per vertical scanline\n   int s; // vertical subsample index\n   unsigned char scanline_data[512], *scanline;\n\n   if (result->w > 512)\n      scanline = (unsigned char *) STBTT_malloc(result->w, userdata);\n   else\n      scanline = scanline_data;\n\n   y = off_y * vsubsample;\n   e[n].y0 = (off_y + result->h) * (float) vsubsample + 1;\n\n   while (j < result->h) {\n      STBTT_memset(scanline, 0, result->w);\n      for (s=0; s < vsubsample; ++s) {\n         // find center of pixel for this scanline\n         float scan_y = y + 0.5f;\n         stbtt__active_edge **step = &active;\n\n         // update all active edges;\n         // remove all active edges that terminate before the center of this scanline\n         while (*step) {\n            stbtt__active_edge * z = *step;\n            if (z->ey <= scan_y) {\n               *step = z->next; // delete from list\n               STBTT_assert(z->direction);\n               z->direction = 0;\n               stbtt__hheap_free(&hh, z);\n            } else {\n               z->x += z->dx; // advance to position for current scanline\n               step = &((*step)->next); // advance through list\n            }\n         }\n\n         // resort the list if needed\n         for(;;) {\n            int changed=0;\n            step = &active;\n            while (*step && (*step)->next) {\n               if ((*step)->x > (*step)->next->x) {\n                  stbtt__active_edge *t = *step;\n                  stbtt__active_edge *q = t->next;\n\n                  t->next = q->next;\n                  q->next = t;\n                  *step = q;\n                  changed = 1;\n               }\n               step = &(*step)->next;\n            }\n            if (!changed) break;\n         }\n\n         // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline\n         while (e->y0 <= scan_y) {\n            if (e->y1 > scan_y) {\n               stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata);\n               if (z != NULL) {\n                  // find insertion point\n                  if (active == NULL)\n                     active = z;\n                  else if (z->x < active->x) {\n                     // insert at front\n                     z->next = active;\n                     active = z;\n                  } else {\n                     // find thing to insert AFTER\n                     stbtt__active_edge *p = active;\n                     while (p->next && p->next->x < z->x)\n                        p = p->next;\n                     // at this point, p->next->x is NOT < z->x\n                     z->next = p->next;\n                     p->next = z;\n                  }\n               }\n            }\n            ++e;\n         }\n\n         // now process all active edges in XOR fashion\n         if (active)\n            stbtt__fill_active_edges(scanline, result->w, active, max_weight);\n\n         ++y;\n      }\n      STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w);\n      ++j;\n   }\n\n   stbtt__hheap_cleanup(&hh, userdata);\n\n   if (scanline != scanline_data)\n      STBTT_free(scanline, userdata);\n}\n\n#elif STBTT_RASTERIZER_VERSION == 2\n\n// the edge passed in here does not cross the vertical line at x or the vertical line at x+1\n// (i.e. it has already been clipped to those)\nstatic void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1)\n{\n   if (y0 == y1) return;\n   STBTT_assert(y0 < y1);\n   STBTT_assert(e->sy <= e->ey);\n   if (y0 > e->ey) return;\n   if (y1 < e->sy) return;\n   if (y0 < e->sy) {\n      x0 += (x1-x0) * (e->sy - y0) / (y1-y0);\n      y0 = e->sy;\n   }\n   if (y1 > e->ey) {\n      x1 += (x1-x0) * (e->ey - y1) / (y1-y0);\n      y1 = e->ey;\n   }\n\n   if (x0 == x)\n      STBTT_assert(x1 <= x+1);\n   else if (x0 == x+1)\n      STBTT_assert(x1 >= x);\n   else if (x0 <= x)\n      STBTT_assert(x1 <= x);\n   else if (x0 >= x+1)\n      STBTT_assert(x1 >= x+1);\n   else\n      STBTT_assert(x1 >= x && x1 <= x+1);\n\n   if (x0 <= x && x1 <= x)\n      scanline[x] += e->direction * (y1-y0);\n   else if (x0 >= x+1 && x1 >= x+1)\n      ;\n   else {\n      STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1);\n      scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position\n   }\n}\n\nstatic void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top)\n{\n   float y_bottom = y_top+1;\n\n   while (e) {\n      // brute force every pixel\n\n      // compute intersection points with top & bottom\n      STBTT_assert(e->ey >= y_top);\n\n      if (e->fdx == 0) {\n         float x0 = e->fx;\n         if (x0 < len) {\n            if (x0 >= 0) {\n               stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom);\n               stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom);\n            } else {\n               stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom);\n            }\n         }\n      } else {\n         float x0 = e->fx;\n         float dx = e->fdx;\n         float xb = x0 + dx;\n         float x_top, x_bottom;\n         float sy0,sy1;\n         float dy = e->fdy;\n         STBTT_assert(e->sy <= y_bottom && e->ey >= y_top);\n\n         // compute endpoints of line segment clipped to this scanline (if the\n         // line segment starts on this scanline. x0 is the intersection of the\n         // line with y_top, but that may be off the line segment.\n         if (e->sy > y_top) {\n            x_top = x0 + dx * (e->sy - y_top);\n            sy0 = e->sy;\n         } else {\n            x_top = x0;\n            sy0 = y_top;\n         }\n         if (e->ey < y_bottom) {\n            x_bottom = x0 + dx * (e->ey - y_top);\n            sy1 = e->ey;\n         } else {\n            x_bottom = xb;\n            sy1 = y_bottom;\n         }\n\n         if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) {\n            // from here on, we don't have to range check x values\n\n            if ((int) x_top == (int) x_bottom) {\n               float height;\n               // simple case, only spans one pixel\n               int x = (int) x_top;\n               height = sy1 - sy0;\n               STBTT_assert(x >= 0 && x < len);\n               scanline[x] += e->direction * (1-((x_top - x) + (x_bottom-x))/2)  * height;\n               scanline_fill[x] += e->direction * height; // everything right of this pixel is filled\n            } else {\n               int x,x1,x2;\n               float y_crossing, step, sign, area;\n               // covers 2+ pixels\n               if (x_top > x_bottom) {\n                  // flip scanline vertically; signed area is the same\n                  float t;\n                  sy0 = y_bottom - (sy0 - y_top);\n                  sy1 = y_bottom - (sy1 - y_top);\n                  t = sy0, sy0 = sy1, sy1 = t;\n                  t = x_bottom, x_bottom = x_top, x_top = t;\n                  dx = -dx;\n                  dy = -dy;\n                  t = x0, x0 = xb, xb = t;\n               }\n\n               x1 = (int) x_top;\n               x2 = (int) x_bottom;\n               // compute intersection with y axis at x1+1\n               y_crossing = (x1+1 - x0) * dy + y_top;\n\n               sign = e->direction;\n               // area of the rectangle covered from y0..y_crossing\n               area = sign * (y_crossing-sy0);\n               // area of the triangle (x_top,y0), (x+1,y0), (x+1,y_crossing)\n               scanline[x1] += area * (1-((x_top - x1)+(x1+1-x1))/2);\n\n               step = sign * dy;\n               for (x = x1+1; x < x2; ++x) {\n                  scanline[x] += area + step/2;\n                  area += step;\n               }\n               y_crossing += dy * (x2 - (x1+1));\n\n               STBTT_assert(STBTT_fabs(area) <= 1.01f);\n\n               scanline[x2] += area + sign * (1-((x2-x2)+(x_bottom-x2))/2) * (sy1-y_crossing);\n\n               scanline_fill[x2] += sign * (sy1-sy0);\n            }\n         } else {\n            // if edge goes outside of box we're drawing, we require\n            // clipping logic. since this does not match the intended use\n            // of this library, we use a different, very slow brute\n            // force implementation\n            int x;\n            for (x=0; x < len; ++x) {\n               // cases:\n               //\n               // there can be up to two intersections with the pixel. any intersection\n               // with left or right edges can be handled by splitting into two (or three)\n               // regions. intersections with top & bottom do not necessitate case-wise logic.\n               //\n               // the old way of doing this found the intersections with the left & right edges,\n               // then used some simple logic to produce up to three segments in sorted order\n               // from top-to-bottom. however, this had a problem: if an x edge was epsilon\n               // across the x border, then the corresponding y position might not be distinct\n               // from the other y segment, and it might ignored as an empty segment. to avoid\n               // that, we need to explicitly produce segments based on x positions.\n\n               // rename variables to clear pairs\n               float y0 = y_top;\n               float x1 = (float) (x);\n               float x2 = (float) (x+1);\n               float x3 = xb;\n               float y3 = y_bottom;\n               float y1,y2;\n\n               // x = e->x + e->dx * (y-y_top)\n               // (y-y_top) = (x - e->x) / e->dx\n               // y = (x - e->x) / e->dx + y_top\n               y1 = (x - x0) / dx + y_top;\n               y2 = (x+1 - x0) / dx + y_top;\n\n               if (x0 < x1 && x3 > x2) {         // three segments descending down-right\n                  stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1);\n                  stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2);\n                  stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);\n               } else if (x3 < x1 && x0 > x2) {  // three segments descending down-left\n                  stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2);\n                  stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1);\n                  stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3);\n               } else if (x0 < x1 && x3 > x1) {  // two segments across x, down-right\n                  stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1);\n                  stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3);\n               } else if (x3 < x1 && x0 > x1) {  // two segments across x, down-left\n                  stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1);\n                  stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3);\n               } else if (x0 < x2 && x3 > x2) {  // two segments across x+1, down-right\n                  stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2);\n                  stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);\n               } else if (x3 < x2 && x0 > x2) {  // two segments across x+1, down-left\n                  stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2);\n                  stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3);\n               } else {  // one segment\n                  stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3);\n               }\n            }\n         }\n      }\n      e = e->next;\n   }\n}\n\n// directly AA rasterize edges w/o supersampling\nstatic void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata)\n{\n   stbtt__hheap hh = { 0, 0, 0 };\n   stbtt__active_edge *active = NULL;\n   int y,j=0, i;\n   float scanline_data[129], *scanline, *scanline2;\n\n   STBTT__NOTUSED(vsubsample);\n\n   if (result->w > 64)\n      scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata);\n   else\n      scanline = scanline_data;\n\n   scanline2 = scanline + result->w;\n\n   y = off_y;\n   e[n].y0 = (float) (off_y + result->h) + 1;\n\n   while (j < result->h) {\n      // find center of pixel for this scanline\n      float scan_y_top    = y + 0.0f;\n      float scan_y_bottom = y + 1.0f;\n      stbtt__active_edge **step = &active;\n\n      STBTT_memset(scanline , 0, result->w*sizeof(scanline[0]));\n      STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0]));\n\n      // update all active edges;\n      // remove all active edges that terminate before the top of this scanline\n      while (*step) {\n         stbtt__active_edge * z = *step;\n         if (z->ey <= scan_y_top) {\n            *step = z->next; // delete from list\n            STBTT_assert(z->direction);\n            z->direction = 0;\n            stbtt__hheap_free(&hh, z);\n         } else {\n            step = &((*step)->next); // advance through list\n         }\n      }\n\n      // insert all edges that start before the bottom of this scanline\n      while (e->y0 <= scan_y_bottom) {\n         if (e->y0 != e->y1) {\n            stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata);\n            if (z != NULL) {\n               STBTT_assert(z->ey >= scan_y_top);\n               // insert at front\n               z->next = active;\n               active = z;\n            }\n         }\n         ++e;\n      }\n\n      // now process all active edges\n      if (active)\n         stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top);\n\n      {\n         float sum = 0;\n         for (i=0; i < result->w; ++i) {\n            float k;\n            int m;\n            sum += scanline2[i];\n            k = scanline[i] + sum;\n            k = (float) STBTT_fabs(k)*255 + 0.5f;\n            m = (int) k;\n            if (m > 255) m = 255;\n            result->pixels[j*result->stride + i] = (unsigned char) m;\n         }\n      }\n      // advance all the edges\n      step = &active;\n      while (*step) {\n         stbtt__active_edge *z = *step;\n         z->fx += z->fdx; // advance to position for current scanline\n         step = &((*step)->next); // advance through list\n      }\n\n      ++y;\n      ++j;\n   }\n\n   stbtt__hheap_cleanup(&hh, userdata);\n\n   if (scanline != scanline_data)\n      STBTT_free(scanline, userdata);\n}\n#else\n#error \"Unrecognized value of STBTT_RASTERIZER_VERSION\"\n#endif\n\n#define STBTT__COMPARE(a,b)  ((a)->y0 < (b)->y0)\n\nstatic void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n)\n{\n   int i,j;\n   for (i=1; i < n; ++i) {\n      stbtt__edge t = p[i], *a = &t;\n      j = i;\n      while (j > 0) {\n         stbtt__edge *b = &p[j-1];\n         int c = STBTT__COMPARE(a,b);\n         if (!c) break;\n         p[j] = p[j-1];\n         --j;\n      }\n      if (i != j)\n         p[j] = t;\n   }\n}\n\nstatic void stbtt__sort_edges_quicksort(stbtt__edge *p, int n)\n{\n   /* threshhold for transitioning to insertion sort */\n   while (n > 12) {\n      stbtt__edge t;\n      int c01,c12,c,m,i,j;\n\n      /* compute median of three */\n      m = n >> 1;\n      c01 = STBTT__COMPARE(&p[0],&p[m]);\n      c12 = STBTT__COMPARE(&p[m],&p[n-1]);\n      /* if 0 >= mid >= end, or 0 < mid < end, then use mid */\n      if (c01 != c12) {\n         /* otherwise, we'll need to swap something else to middle */\n         int z;\n         c = STBTT__COMPARE(&p[0],&p[n-1]);\n         /* 0>mid && mid<n:  0>n => n; 0<n => 0 */\n         /* 0<mid && mid>n:  0>n => 0; 0<n => n */\n         z = (c == c12) ? 0 : n-1;\n         t = p[z];\n         p[z] = p[m];\n         p[m] = t;\n      }\n      /* now p[m] is the median-of-three */\n      /* swap it to the beginning so it won't move around */\n      t = p[0];\n      p[0] = p[m];\n      p[m] = t;\n\n      /* partition loop */\n      i=1;\n      j=n-1;\n      for(;;) {\n         /* handling of equality is crucial here */\n         /* for sentinels & efficiency with duplicates */\n         for (;;++i) {\n            if (!STBTT__COMPARE(&p[i], &p[0])) break;\n         }\n         for (;;--j) {\n            if (!STBTT__COMPARE(&p[0], &p[j])) break;\n         }\n         /* make sure we haven't crossed */\n         if (i >= j) break;\n         t = p[i];\n         p[i] = p[j];\n         p[j] = t;\n\n         ++i;\n         --j;\n      }\n      /* recurse on smaller side, iterate on larger */\n      if (j < (n-i)) {\n         stbtt__sort_edges_quicksort(p,j);\n         p = p+i;\n         n = n-i;\n      } else {\n         stbtt__sort_edges_quicksort(p+i, n-i);\n         n = j;\n      }\n   }\n}\n\nstatic void stbtt__sort_edges(stbtt__edge *p, int n)\n{\n   stbtt__sort_edges_quicksort(p, n);\n   stbtt__sort_edges_ins_sort(p, n);\n}\n\ntypedef struct\n{\n   float x,y;\n} stbtt__point;\n\nstatic void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata)\n{\n   float y_scale_inv = invert ? -scale_y : scale_y;\n   stbtt__edge *e;\n   int n,i,j,k,m;\n#if STBTT_RASTERIZER_VERSION == 1\n   int vsubsample = result->h < 8 ? 15 : 5;\n#elif STBTT_RASTERIZER_VERSION == 2\n   int vsubsample = 1;\n#else\n   #error \"Unrecognized value of STBTT_RASTERIZER_VERSION\"\n#endif\n   // vsubsample should divide 255 evenly; otherwise we won't reach full opacity\n\n   // now we have to blow out the windings into explicit edge lists\n   n = 0;\n   for (i=0; i < windings; ++i)\n      n += wcount[i];\n\n   e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel\n   if (e == 0) return;\n   n = 0;\n\n   m=0;\n   for (i=0; i < windings; ++i) {\n      stbtt__point *p = pts + m;\n      m += wcount[i];\n      j = wcount[i]-1;\n      for (k=0; k < wcount[i]; j=k++) {\n         int a=k,b=j;\n         // skip the edge if horizontal\n         if (p[j].y == p[k].y)\n            continue;\n         // add edge from j to k to the list\n         e[n].invert = 0;\n         if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) {\n            e[n].invert = 1;\n            a=j,b=k;\n         }\n         e[n].x0 = p[a].x * scale_x + shift_x;\n         e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample;\n         e[n].x1 = p[b].x * scale_x + shift_x;\n         e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample;\n         ++n;\n      }\n   }\n\n   // now sort the edges by their highest point (should snap to integer, and then by x)\n   //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare);\n   stbtt__sort_edges(e, n);\n\n   // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule\n   stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata);\n\n   STBTT_free(e, userdata);\n}\n\nstatic void stbtt__add_point(stbtt__point *points, int n, float x, float y)\n{\n   if (!points) return; // during first pass, it's unallocated\n   points[n].x = x;\n   points[n].y = y;\n}\n\n// tesselate until threshhold p is happy... @TODO warped to compensate for non-linear stretching\nstatic int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n)\n{\n   // midpoint\n   float mx = (x0 + 2*x1 + x2)/4;\n   float my = (y0 + 2*y1 + y2)/4;\n   // versus directly drawn line\n   float dx = (x0+x2)/2 - mx;\n   float dy = (y0+y2)/2 - my;\n   if (n > 16) // 65536 segments on one curve better be enough!\n      return 1;\n   if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA\n      stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1);\n      stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1);\n   } else {\n      stbtt__add_point(points, *num_points,x2,y2);\n      *num_points = *num_points+1;\n   }\n   return 1;\n}\n\nstatic void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n)\n{\n   // @TODO this \"flatness\" calculation is just made-up nonsense that seems to work well enough\n   float dx0 = x1-x0;\n   float dy0 = y1-y0;\n   float dx1 = x2-x1;\n   float dy1 = y2-y1;\n   float dx2 = x3-x2;\n   float dy2 = y3-y2;\n   float dx = x3-x0;\n   float dy = y3-y0;\n   float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2));\n   float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy);\n   float flatness_squared = longlen*longlen-shortlen*shortlen;\n\n   if (n > 16) // 65536 segments on one curve better be enough!\n      return;\n\n   if (flatness_squared > objspace_flatness_squared) {\n      float x01 = (x0+x1)/2;\n      float y01 = (y0+y1)/2;\n      float x12 = (x1+x2)/2;\n      float y12 = (y1+y2)/2;\n      float x23 = (x2+x3)/2;\n      float y23 = (y2+y3)/2;\n\n      float xa = (x01+x12)/2;\n      float ya = (y01+y12)/2;\n      float xb = (x12+x23)/2;\n      float yb = (y12+y23)/2;\n\n      float mx = (xa+xb)/2;\n      float my = (ya+yb)/2;\n\n      stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1);\n      stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1);\n   } else {\n      stbtt__add_point(points, *num_points,x3,y3);\n      *num_points = *num_points+1;\n   }\n}\n\n// returns number of contours\nstatic stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata)\n{\n   stbtt__point *points=0;\n   int num_points=0;\n\n   float objspace_flatness_squared = objspace_flatness * objspace_flatness;\n   int i,n=0,start=0, pass;\n\n   // count how many \"moves\" there are to get the contour count\n   for (i=0; i < num_verts; ++i)\n      if (vertices[i].type == STBTT_vmove)\n         ++n;\n\n   *num_contours = n;\n   if (n == 0) return 0;\n\n   *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata);\n\n   if (*contour_lengths == 0) {\n      *num_contours = 0;\n      return 0;\n   }\n\n   // make two passes through the points so we don't need to realloc\n   for (pass=0; pass < 2; ++pass) {\n      float x=0,y=0;\n      if (pass == 1) {\n         points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata);\n         if (points == NULL) goto error;\n      }\n      num_points = 0;\n      n= -1;\n      for (i=0; i < num_verts; ++i) {\n         switch (vertices[i].type) {\n            case STBTT_vmove:\n               // start the next contour\n               if (n >= 0)\n                  (*contour_lengths)[n] = num_points - start;\n               ++n;\n               start = num_points;\n\n               x = vertices[i].x, y = vertices[i].y;\n               stbtt__add_point(points, num_points++, x,y);\n               break;\n            case STBTT_vline:\n               x = vertices[i].x, y = vertices[i].y;\n               stbtt__add_point(points, num_points++, x, y);\n               break;\n            case STBTT_vcurve:\n               stbtt__tesselate_curve(points, &num_points, x,y,\n                                        vertices[i].cx, vertices[i].cy,\n                                        vertices[i].x,  vertices[i].y,\n                                        objspace_flatness_squared, 0);\n               x = vertices[i].x, y = vertices[i].y;\n               break;\n            case STBTT_vcubic:\n               stbtt__tesselate_cubic(points, &num_points, x,y,\n                                        vertices[i].cx, vertices[i].cy,\n                                        vertices[i].cx1, vertices[i].cy1,\n                                        vertices[i].x,  vertices[i].y,\n                                        objspace_flatness_squared, 0);\n               x = vertices[i].x, y = vertices[i].y;\n               break;\n         }\n      }\n      (*contour_lengths)[n] = num_points - start;\n   }\n\n   return points;\nerror:\n   STBTT_free(points, userdata);\n   STBTT_free(*contour_lengths, userdata);\n   *contour_lengths = 0;\n   *num_contours = 0;\n   return NULL;\n}\n\nSTBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata)\n{\n   float scale = scale_x > scale_y ? scale_y : scale_x;\n   int winding_count, *winding_lengths;\n   stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata);\n   if (windings) {\n      stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata);\n      STBTT_free(winding_lengths, userdata);\n      STBTT_free(windings, userdata);\n   }\n}\n\nSTBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata)\n{\n   STBTT_free(bitmap, userdata);\n}\n\nSTBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff)\n{\n   int ix0,iy0,ix1,iy1;\n   stbtt__bitmap gbm;\n   stbtt_vertex *vertices;   \n   int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);\n\n   if (scale_x == 0) scale_x = scale_y;\n   if (scale_y == 0) {\n      if (scale_x == 0) {\n         STBTT_free(vertices, info->userdata);\n         return NULL;\n      }\n      scale_y = scale_x;\n   }\n\n   stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1);\n\n   // now we get the size\n   gbm.w = (ix1 - ix0);\n   gbm.h = (iy1 - iy0);\n   gbm.pixels = NULL; // in case we error\n\n   if (width ) *width  = gbm.w;\n   if (height) *height = gbm.h;\n   if (xoff  ) *xoff   = ix0;\n   if (yoff  ) *yoff   = iy0;\n   \n   if (gbm.w && gbm.h) {\n      gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata);\n      if (gbm.pixels) {\n         gbm.stride = gbm.w;\n\n         stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata);\n      }\n   }\n   STBTT_free(vertices, info->userdata);\n   return gbm.pixels;\n}   \n\nSTBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff)\n{\n   return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff);\n}\n\nSTBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph)\n{\n   int ix0,iy0;\n   stbtt_vertex *vertices;\n   int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);\n   stbtt__bitmap gbm;   \n\n   stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0);\n   gbm.pixels = output;\n   gbm.w = out_w;\n   gbm.h = out_h;\n   gbm.stride = out_stride;\n\n   if (gbm.w && gbm.h)\n      stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata);\n\n   STBTT_free(vertices, info->userdata);\n}\n\nSTBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph)\n{\n   stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph);\n}\n\nSTBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff)\n{\n   return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff);\n}   \n\nSTBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint)\n{\n   stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint));\n}\n\nSTBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff)\n{\n   return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff);\n}   \n\nSTBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint)\n{\n   stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// bitmap baking\n//\n// This is SUPER-CRAPPY packing to keep source code small\n\nstatic int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset,  // font location (use offset=0 for plain .ttf)\n                                float pixel_height,                     // height of font in pixels\n                                unsigned char *pixels, int pw, int ph,  // bitmap to be filled in\n                                int first_char, int num_chars,          // characters to bake\n                                stbtt_bakedchar *chardata)\n{\n   float scale;\n   int x,y,bottom_y, i;\n   stbtt_fontinfo f;\n   f.userdata = NULL;\n   if (!stbtt_InitFont(&f, data, offset))\n      return -1;\n   STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels\n   x=y=1;\n   bottom_y = 1;\n\n   scale = stbtt_ScaleForPixelHeight(&f, pixel_height);\n\n   for (i=0; i < num_chars; ++i) {\n      int advance, lsb, x0,y0,x1,y1,gw,gh;\n      int g = stbtt_FindGlyphIndex(&f, first_char + i);\n      stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb);\n      stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1);\n      gw = x1-x0;\n      gh = y1-y0;\n      if (x + gw + 1 >= pw)\n         y = bottom_y, x = 1; // advance to next row\n      if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row\n         return -i;\n      STBTT_assert(x+gw < pw);\n      STBTT_assert(y+gh < ph);\n      stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g);\n      chardata[i].x0 = (stbtt_int16) x;\n      chardata[i].y0 = (stbtt_int16) y;\n      chardata[i].x1 = (stbtt_int16) (x + gw);\n      chardata[i].y1 = (stbtt_int16) (y + gh);\n      chardata[i].xadvance = scale * advance;\n      chardata[i].xoff     = (float) x0;\n      chardata[i].yoff     = (float) y0;\n      x = x + gw + 1;\n      if (y+gh+1 > bottom_y)\n         bottom_y = y+gh+1;\n   }\n   return bottom_y;\n}\n\nSTBTT_DEF void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule)\n{\n   float d3d_bias = opengl_fillrule ? 0 : -0.5f;\n   float ipw = 1.0f / pw, iph = 1.0f / ph;\n   stbtt_bakedchar *b = chardata + char_index;\n   int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f);\n   int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f);\n\n   q->x0 = round_x + d3d_bias;\n   q->y0 = round_y + d3d_bias;\n   q->x1 = round_x + b->x1 - b->x0 + d3d_bias;\n   q->y1 = round_y + b->y1 - b->y0 + d3d_bias;\n\n   q->s0 = b->x0 * ipw;\n   q->t0 = b->y0 * iph;\n   q->s1 = b->x1 * ipw;\n   q->t1 = b->y1 * iph;\n\n   *xpos += b->xadvance;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// rectangle packing replacement routines if you don't have stb_rect_pack.h\n//\n\n#ifndef STB_RECT_PACK_VERSION\n\ntypedef int stbrp_coord;\n\n////////////////////////////////////////////////////////////////////////////////////\n//                                                                                //\n//                                                                                //\n// COMPILER WARNING ?!?!?                                                         //\n//                                                                                //\n//                                                                                //\n// if you get a compile warning due to these symbols being defined more than      //\n// once, move #include \"stb_rect_pack.h\" before #include \"stb_truetype.h\"         //\n//                                                                                //\n////////////////////////////////////////////////////////////////////////////////////\n\ntypedef struct\n{\n   int width,height;\n   int x,y,bottom_y;\n} stbrp_context;\n\ntypedef struct\n{\n   unsigned char x;\n} stbrp_node;\n\nstruct stbrp_rect\n{\n   stbrp_coord x,y;\n   int id,w,h,was_packed;\n};\n\nstatic void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes)\n{\n   con->width  = pw;\n   con->height = ph;\n   con->x = 0;\n   con->y = 0;\n   con->bottom_y = 0;\n   STBTT__NOTUSED(nodes);\n   STBTT__NOTUSED(num_nodes);   \n}\n\nstatic void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects)\n{\n   int i;\n   for (i=0; i < num_rects; ++i) {\n      if (con->x + rects[i].w > con->width) {\n         con->x = 0;\n         con->y = con->bottom_y;\n      }\n      if (con->y + rects[i].h > con->height)\n         break;\n      rects[i].x = con->x;\n      rects[i].y = con->y;\n      rects[i].was_packed = 1;\n      con->x += rects[i].w;\n      if (con->y + rects[i].h > con->bottom_y)\n         con->bottom_y = con->y + rects[i].h;\n   }\n   for (   ; i < num_rects; ++i)\n      rects[i].was_packed = 0;\n}\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// bitmap baking\n//\n// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If\n// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy.\n\nSTBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context)\n{\n   stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context)            ,alloc_context);\n   int            num_nodes = pw - padding;\n   stbrp_node    *nodes   = (stbrp_node    *) STBTT_malloc(sizeof(*nodes  ) * num_nodes,alloc_context);\n\n   if (context == NULL || nodes == NULL) {\n      if (context != NULL) STBTT_free(context, alloc_context);\n      if (nodes   != NULL) STBTT_free(nodes  , alloc_context);\n      return 0;\n   }\n\n   spc->user_allocator_context = alloc_context;\n   spc->width = pw;\n   spc->height = ph;\n   spc->pixels = pixels;\n   spc->pack_info = context;\n   spc->nodes = nodes;\n   spc->padding = padding;\n   spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw;\n   spc->h_oversample = 1;\n   spc->v_oversample = 1;\n\n   stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes);\n\n   if (pixels)\n      STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels\n\n   return 1;\n}\n\nSTBTT_DEF void stbtt_PackEnd  (stbtt_pack_context *spc)\n{\n   STBTT_free(spc->nodes    , spc->user_allocator_context);\n   STBTT_free(spc->pack_info, spc->user_allocator_context);\n}\n\nSTBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample)\n{\n   STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE);\n   STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE);\n   if (h_oversample <= STBTT_MAX_OVERSAMPLE)\n      spc->h_oversample = h_oversample;\n   if (v_oversample <= STBTT_MAX_OVERSAMPLE)\n      spc->v_oversample = v_oversample;\n}\n\n#define STBTT__OVER_MASK  (STBTT_MAX_OVERSAMPLE-1)\n\nstatic void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width)\n{\n   unsigned char buffer[STBTT_MAX_OVERSAMPLE];\n   int safe_w = w - kernel_width;\n   int j;\n   STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze\n   for (j=0; j < h; ++j) {\n      int i;\n      unsigned int total;\n      STBTT_memset(buffer, 0, kernel_width);\n\n      total = 0;\n\n      // make kernel_width a constant in common cases so compiler can optimize out the divide\n      switch (kernel_width) {\n         case 2:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / 2);\n            }\n            break;\n         case 3:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / 3);\n            }\n            break;\n         case 4:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / 4);\n            }\n            break;\n         case 5:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / 5);\n            }\n            break;\n         default:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / kernel_width);\n            }\n            break;\n      }\n\n      for (; i < w; ++i) {\n         STBTT_assert(pixels[i] == 0);\n         total -= buffer[i & STBTT__OVER_MASK];\n         pixels[i] = (unsigned char) (total / kernel_width);\n      }\n\n      pixels += stride_in_bytes;\n   }\n}\n\nstatic void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width)\n{\n   unsigned char buffer[STBTT_MAX_OVERSAMPLE];\n   int safe_h = h - kernel_width;\n   int j;\n   STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze\n   for (j=0; j < w; ++j) {\n      int i;\n      unsigned int total;\n      STBTT_memset(buffer, 0, kernel_width);\n\n      total = 0;\n\n      // make kernel_width a constant in common cases so compiler can optimize out the divide\n      switch (kernel_width) {\n         case 2:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / 2);\n            }\n            break;\n         case 3:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / 3);\n            }\n            break;\n         case 4:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / 4);\n            }\n            break;\n         case 5:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / 5);\n            }\n            break;\n         default:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width);\n            }\n            break;\n      }\n\n      for (; i < h; ++i) {\n         STBTT_assert(pixels[i*stride_in_bytes] == 0);\n         total -= buffer[i & STBTT__OVER_MASK];\n         pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width);\n      }\n\n      pixels += 1;\n   }\n}\n\nstatic float stbtt__oversample_shift(int oversample)\n{\n   if (!oversample)\n      return 0.0f;\n\n   // The prefilter is a box filter of width \"oversample\",\n   // which shifts phase by (oversample - 1)/2 pixels in\n   // oversampled space. We want to shift in the opposite\n   // direction to counter this.\n   return (float)-(oversample - 1) / (2.0f * (float)oversample);\n}\n\n// rects array must be big enough to accommodate all characters in the given ranges\nSTBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)\n{\n   int i,j,k;\n\n   k=0;\n   for (i=0; i < num_ranges; ++i) {\n      float fh = ranges[i].font_size;\n      float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh);\n      ranges[i].h_oversample = (unsigned char) spc->h_oversample;\n      ranges[i].v_oversample = (unsigned char) spc->v_oversample;\n      for (j=0; j < ranges[i].num_chars; ++j) {\n         int x0,y0,x1,y1;\n         int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j];\n         int glyph = stbtt_FindGlyphIndex(info, codepoint);\n         stbtt_GetGlyphBitmapBoxSubpixel(info,glyph,\n                                         scale * spc->h_oversample,\n                                         scale * spc->v_oversample,\n                                         0,0,\n                                         &x0,&y0,&x1,&y1);\n         rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1);\n         rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1);\n         ++k;\n      }\n   }\n\n   return k;\n}\n\n// rects array must be big enough to accommodate all characters in the given ranges\nSTBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)\n{\n   int i,j,k, return_value = 1;\n\n   // save current values\n   int old_h_over = spc->h_oversample;\n   int old_v_over = spc->v_oversample;\n\n   k = 0;\n   for (i=0; i < num_ranges; ++i) {\n      float fh = ranges[i].font_size;\n      float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh);\n      float recip_h,recip_v,sub_x,sub_y;\n      spc->h_oversample = ranges[i].h_oversample;\n      spc->v_oversample = ranges[i].v_oversample;\n      recip_h = 1.0f / spc->h_oversample;\n      recip_v = 1.0f / spc->v_oversample;\n      sub_x = stbtt__oversample_shift(spc->h_oversample);\n      sub_y = stbtt__oversample_shift(spc->v_oversample);\n      for (j=0; j < ranges[i].num_chars; ++j) {\n         stbrp_rect *r = &rects[k];\n         if (r->was_packed) {\n            stbtt_packedchar *bc = &ranges[i].chardata_for_range[j];\n            int advance, lsb, x0,y0,x1,y1;\n            int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j];\n            int glyph = stbtt_FindGlyphIndex(info, codepoint);\n            stbrp_coord pad = (stbrp_coord) spc->padding;\n\n            // pad on left and top\n            r->x += pad;\n            r->y += pad;\n            r->w -= pad;\n            r->h -= pad;\n            stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb);\n            stbtt_GetGlyphBitmapBox(info, glyph,\n                                    scale * spc->h_oversample,\n                                    scale * spc->v_oversample,\n                                    &x0,&y0,&x1,&y1);\n            stbtt_MakeGlyphBitmapSubpixel(info,\n                                          spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                                          r->w - spc->h_oversample+1,\n                                          r->h - spc->v_oversample+1,\n                                          spc->stride_in_bytes,\n                                          scale * spc->h_oversample,\n                                          scale * spc->v_oversample,\n                                          0,0,\n                                          glyph);\n\n            if (spc->h_oversample > 1)\n               stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                                  r->w, r->h, spc->stride_in_bytes,\n                                  spc->h_oversample);\n\n            if (spc->v_oversample > 1)\n               stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                                  r->w, r->h, spc->stride_in_bytes,\n                                  spc->v_oversample);\n\n            bc->x0       = (stbtt_int16)  r->x;\n            bc->y0       = (stbtt_int16)  r->y;\n            bc->x1       = (stbtt_int16) (r->x + r->w);\n            bc->y1       = (stbtt_int16) (r->y + r->h);\n            bc->xadvance =                scale * advance;\n            bc->xoff     =       (float)  x0 * recip_h + sub_x;\n            bc->yoff     =       (float)  y0 * recip_v + sub_y;\n            bc->xoff2    =                (x0 + r->w) * recip_h + sub_x;\n            bc->yoff2    =                (y0 + r->h) * recip_v + sub_y;\n         } else {\n            return_value = 0; // if any fail, report failure\n         }\n\n         ++k;\n      }\n   }\n\n   // restore original values\n   spc->h_oversample = old_h_over;\n   spc->v_oversample = old_v_over;\n\n   return return_value;\n}\n\nSTBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects)\n{\n   stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects);\n}\n\nSTBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges)\n{\n   stbtt_fontinfo info;\n   int i,j,n, return_value = 1;\n   //stbrp_context *context = (stbrp_context *) spc->pack_info;\n   stbrp_rect    *rects;\n\n   // flag all characters as NOT packed\n   for (i=0; i < num_ranges; ++i)\n      for (j=0; j < ranges[i].num_chars; ++j)\n         ranges[i].chardata_for_range[j].x0 =\n         ranges[i].chardata_for_range[j].y0 =\n         ranges[i].chardata_for_range[j].x1 =\n         ranges[i].chardata_for_range[j].y1 = 0;\n\n   n = 0;\n   for (i=0; i < num_ranges; ++i)\n      n += ranges[i].num_chars;\n         \n   rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context);\n   if (rects == NULL)\n      return 0;\n\n   info.userdata = spc->user_allocator_context;\n   stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index));\n\n   n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects);\n\n   stbtt_PackFontRangesPackRects(spc, rects, n);\n  \n   return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects);\n\n   STBTT_free(rects, spc->user_allocator_context);\n   return return_value;\n}\n\nSTBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size,\n            int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range)\n{\n   stbtt_pack_range range;\n   range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range;\n   range.array_of_unicode_codepoints = NULL;\n   range.num_chars                   = num_chars_in_range;\n   range.chardata_for_range          = chardata_for_range;\n   range.font_size                   = font_size;\n   return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1);\n}\n\nSTBTT_DEF void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer)\n{\n   float ipw = 1.0f / pw, iph = 1.0f / ph;\n   stbtt_packedchar *b = chardata + char_index;\n\n   if (align_to_integer) {\n      float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f);\n      float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f);\n      q->x0 = x;\n      q->y0 = y;\n      q->x1 = x + b->xoff2 - b->xoff;\n      q->y1 = y + b->yoff2 - b->yoff;\n   } else {\n      q->x0 = *xpos + b->xoff;\n      q->y0 = *ypos + b->yoff;\n      q->x1 = *xpos + b->xoff2;\n      q->y1 = *ypos + b->yoff2;\n   }\n\n   q->s0 = b->x0 * ipw;\n   q->t0 = b->y0 * iph;\n   q->s1 = b->x1 * ipw;\n   q->t1 = b->y1 * iph;\n\n   *xpos += b->xadvance;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// font name matching -- recommended not to use this\n//\n\n// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string\nstatic stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) \n{\n   stbtt_int32 i=0;\n\n   // convert utf16 to utf8 and compare the results while converting\n   while (len2) {\n      stbtt_uint16 ch = s2[0]*256 + s2[1];\n      if (ch < 0x80) {\n         if (i >= len1) return -1;\n         if (s1[i++] != ch) return -1;\n      } else if (ch < 0x800) {\n         if (i+1 >= len1) return -1;\n         if (s1[i++] != 0xc0 + (ch >> 6)) return -1;\n         if (s1[i++] != 0x80 + (ch & 0x3f)) return -1;\n      } else if (ch >= 0xd800 && ch < 0xdc00) {\n         stbtt_uint32 c;\n         stbtt_uint16 ch2 = s2[2]*256 + s2[3];\n         if (i+3 >= len1) return -1;\n         c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000;\n         if (s1[i++] != 0xf0 + (c >> 18)) return -1;\n         if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1;\n         if (s1[i++] != 0x80 + ((c >>  6) & 0x3f)) return -1;\n         if (s1[i++] != 0x80 + ((c      ) & 0x3f)) return -1;\n         s2 += 2; // plus another 2 below\n         len2 -= 2;\n      } else if (ch >= 0xdc00 && ch < 0xe000) {\n         return -1;\n      } else {\n         if (i+2 >= len1) return -1;\n         if (s1[i++] != 0xe0 + (ch >> 12)) return -1;\n         if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1;\n         if (s1[i++] != 0x80 + ((ch     ) & 0x3f)) return -1;\n      }\n      s2 += 2;\n      len2 -= 2;\n   }\n   return i;\n}\n\nstatic int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) \n{\n   return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2);\n}\n\n// returns results in whatever encoding you request... but note that 2-byte encodings\n// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare\nSTBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID)\n{\n   stbtt_int32 i,count,stringOffset;\n   stbtt_uint8 *fc = font->data;\n   stbtt_uint32 offset = font->fontstart;\n   stbtt_uint32 nm = stbtt__find_table(fc, offset, \"name\");\n   if (!nm) return NULL;\n\n   count = ttUSHORT(fc+nm+2);\n   stringOffset = nm + ttUSHORT(fc+nm+4);\n   for (i=0; i < count; ++i) {\n      stbtt_uint32 loc = nm + 6 + 12 * i;\n      if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2)\n          && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) {\n         *length = ttUSHORT(fc+loc+8);\n         return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10));\n      }\n   }\n   return NULL;\n}\n\nstatic int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id)\n{\n   stbtt_int32 i;\n   stbtt_int32 count = ttUSHORT(fc+nm+2);\n   stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4);\n\n   for (i=0; i < count; ++i) {\n      stbtt_uint32 loc = nm + 6 + 12 * i;\n      stbtt_int32 id = ttUSHORT(fc+loc+6);\n      if (id == target_id) {\n         // find the encoding\n         stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4);\n\n         // is this a Unicode encoding?\n         if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) {\n            stbtt_int32 slen = ttUSHORT(fc+loc+8);\n            stbtt_int32 off = ttUSHORT(fc+loc+10);\n\n            // check if there's a prefix match\n            stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen);\n            if (matchlen >= 0) {\n               // check for target_id+1 immediately following, with same encoding & language\n               if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) {\n                  slen = ttUSHORT(fc+loc+12+8);\n                  off = ttUSHORT(fc+loc+12+10);\n                  if (slen == 0) {\n                     if (matchlen == nlen)\n                        return 1;\n                  } else if (matchlen < nlen && name[matchlen] == ' ') {\n                     ++matchlen;\n                     if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen))\n                        return 1;\n                  }\n               } else {\n                  // if nothing immediately following\n                  if (matchlen == nlen)\n                     return 1;\n               }\n            }\n         }\n\n         // @TODO handle other encodings\n      }\n   }\n   return 0;\n}\n\nstatic int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags)\n{\n   stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name);\n   stbtt_uint32 nm,hd;\n   if (!stbtt__isfont(fc+offset)) return 0;\n\n   // check italics/bold/underline flags in macStyle...\n   if (flags) {\n      hd = stbtt__find_table(fc, offset, \"head\");\n      if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0;\n   }\n\n   nm = stbtt__find_table(fc, offset, \"name\");\n   if (!nm) return 0;\n\n   if (flags) {\n      // if we checked the macStyle flags, then just check the family and ignore the subfamily\n      if (stbtt__matchpair(fc, nm, name, nlen, 16, -1))  return 1;\n      if (stbtt__matchpair(fc, nm, name, nlen,  1, -1))  return 1;\n      if (stbtt__matchpair(fc, nm, name, nlen,  3, -1))  return 1;\n   } else {\n      if (stbtt__matchpair(fc, nm, name, nlen, 16, 17))  return 1;\n      if (stbtt__matchpair(fc, nm, name, nlen,  1,  2))  return 1;\n      if (stbtt__matchpair(fc, nm, name, nlen,  3, -1))  return 1;\n   }\n\n   return 0;\n}\n\nstatic int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags)\n{\n   stbtt_int32 i;\n   for (i=0;;++i) {\n      stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i);\n      if (off < 0) return off;\n      if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags))\n         return off;\n   }\n}\n\n#if defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#endif\n\nSTBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,\n                                float pixel_height, unsigned char *pixels, int pw, int ph,\n                                int first_char, int num_chars, stbtt_bakedchar *chardata)\n{\n   return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata);\n}\n\nSTBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index)\n{\n   return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index);   \n}\n\nSTBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data)\n{\n   return stbtt_GetNumberOfFonts_internal((unsigned char *) data);\n}\n\nSTBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset)\n{\n   return stbtt_InitFont_internal(info, (unsigned char *) data, offset);\n}\n\nSTBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags)\n{\n   return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags);\n}\n\nSTBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2)\n{\n   return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2);\n}\n\n#if defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic pop\n#endif\n\n#endif // STB_TRUETYPE_IMPLEMENTATION\n\n\n// FULL VERSION HISTORY\n//\n//   1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual\n//   1.11 (2016-04-02) fix unused-variable warning\n//   1.10 (2016-04-02) allow user-defined fabs() replacement\n//                     fix memory leak if fontsize=0.0\n//                     fix warning from duplicate typedef\n//   1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges\n//   1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges\n//   1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints;\n//                     allow PackFontRanges to pack and render in separate phases;\n//                     fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?);\n//                     fixed an assert() bug in the new rasterizer\n//                     replace assert() with STBTT_assert() in new rasterizer\n//   1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine)\n//                     also more precise AA rasterizer, except if shapes overlap\n//                     remove need for STBTT_sort\n//   1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC\n//   1.04 (2015-04-15) typo in example\n//   1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes\n//   1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++\n//   1.01 (2014-12-08) fix subpixel position when oversampling to exactly match\n//                        non-oversampled; STBTT_POINT_SIZE for packed case only\n//   1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling\n//   0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg)\n//   0.9  (2014-08-07) support certain mac/iOS fonts without an MS platformID\n//   0.8b (2014-07-07) fix a warning\n//   0.8  (2014-05-25) fix a few more warnings\n//   0.7  (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back\n//   0.6c (2012-07-24) improve documentation\n//   0.6b (2012-07-20) fix a few more warnings\n//   0.6  (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels,\n//                        stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty\n//   0.5  (2011-12-09) bugfixes:\n//                        subpixel glyph renderer computed wrong bounding box\n//                        first vertex of shape can be off-curve (FreeSans)\n//   0.4b (2011-12-03) fixed an error in the font baking example\n//   0.4  (2011-12-01) kerning, subpixel rendering (tor)\n//                    bugfixes for:\n//                        codepoint-to-glyph conversion using table fmt=12\n//                        codepoint-to-glyph conversion using table fmt=4\n//                        stbtt_GetBakedQuad with non-square texture (Zer)\n//                    updated Hello World! sample to use kerning and subpixel\n//                    fixed some warnings\n//   0.3  (2009-06-24) cmap fmt=12, compound shapes (MM)\n//                    userdata, malloc-from-userdata, non-zero fill (stb)\n//   0.2  (2009-03-11) Fix unsigned/signed char warnings\n//   0.1  (2009-03-09) First public release\n//\n"
  },
  {
    "path": "external/stb_image.h",
    "content": "/* stb_image - v2.16 - public domain image loader - http://nothings.org/stb_image.h\nno warranty implied; use at your own risk\nDo this:\n#define STB_IMAGE_IMPLEMENTATION\nbefore you include this file in *one* C or C++ file to create the implementation.\n// i.e. it should look like this:\n#include ...\n#include ...\n#include ...\n#define STB_IMAGE_IMPLEMENTATION\n#include \"stb_image.h\"\nYou can #define STBI_ASSERT(x) before the #include to avoid using assert.h.\nAnd #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free\nQUICK NOTES:\nPrimarily of interest to game developers and other people who can\navoid problematic images and only need the trivial interface\nJPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)\nPNG 1/2/4/8/16-bit-per-channel\nTGA (not sure what subset, if a subset)\nBMP non-1bpp, non-RLE\nPSD (composited view only, no extra channels, 8/16 bit-per-channel)\nGIF (*comp always reports as 4-channel)\nHDR (radiance rgbE format)\nPIC (Softimage PIC)\nPNM (PPM and PGM binary only)\nAnimated GIF still needs a proper API, but here's one way to do it:\nhttp://gist.github.com/urraka/685d9a6340b26b830d49\n- decode from memory or through FILE (define STBI_NO_STDIO to remove code)\n- decode from arbitrary I/O callbacks\n- SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)\nFull documentation under \"DOCUMENTATION\" below.\nLICENSE\nSee end of file for license information.\nRECENT REVISION HISTORY:\n2.16  (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes\n2.15  (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC\n2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs\n2.13  (2016-12-04) experimental 16-bit API, only for PNG so far; fixes\n2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes\n2.11  (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64\nRGB-format JPEG; remove white matting in PSD;\nallocate large structures on the stack;\ncorrect channel count for PNG & BMP\n2.10  (2016-01-22) avoid warning introduced in 2.09\n2.09  (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED\nSee end of file for full revision history.\n============================    Contributors    =========================\nImage formats                          Extensions, features\nSean Barrett (jpeg, png, bmp)          Jetro Lauha (stbi_info)\nNicolas Schulz (hdr, psd)              Martin \"SpartanJ\" Golini (stbi_info)\nJonathan Dummer (tga)                  James \"moose2000\" Brown (iPhone PNG)\nJean-Marc Lienher (gif)                Ben \"Disch\" Wenger (io callbacks)\nTom Seddon (pic)                       Omar Cornut (1/2/4-bit PNG)\nThatcher Ulrich (psd)                  Nicolas Guillemot (vertical flip)\nKen Miller (pgm, ppm)                  Richard Mitton (16-bit PSD)\ngithub:urraka (animated gif)           Junggon Kim (PNM comments)\nDaniel Gibson (16-bit TGA)\nsocks-the-fox (16-bit PNG)\nJeremy Sawicki (handle all ImageNet JPGs)\nOptimizations & bugfixes\nFabian \"ryg\" Giesen\nArseny Kapoulkine\nJohn-Mark Allen\nBug & warning fixes\nMarc LeBlanc            David Woo          Guillaume George   Martins Mozeiko\nChristpher Lloyd        Jerry Jansson      Joseph Thomson     Phil Jordan\nDave Moore              Roy Eltham         Hayaki Saito       Nathan Reed\nWon Chun                Luke Graham        Johan Duparc       Nick Verigakis\nthe Horde3D community   Thomas Ruf         Ronny Chevalier    Baldur Karlsson\nJanez Zemva             John Bartholomew   Michal Cichon      github:rlyeh\nJonathan Blow           Ken Hamada         Tero Hanninen      github:romigrou\nLaurent Gomila          Cort Stratton      Sergio Gonzalez    github:svdijk\nAruelien Pocheville     Thibault Reuille   Cass Everitt       github:snagar\nRyamond Barbiero        Paul Du Bois       Engin Manap        github:Zelex\nMichaelangel007@github  Philipp Wiesemann  Dale Weiler        github:grim210\nOriol Ferrer Mesia      Josh Tobin         Matthew Gregan     github:sammyhw\nBlazej Dariusz Roszkowski                  Gregory Mullen     github:phprus\nChristian Floisand      Kevin Schmidt                         github:poppolopoppo\n*/\n\n#ifndef STBI_INCLUDE_STB_IMAGE_H\n#define STBI_INCLUDE_STB_IMAGE_H\n\n// DOCUMENTATION\n//\n// Limitations:\n//    - no 16-bit-per-channel PNG\n//    - no 12-bit-per-channel JPEG\n//    - no JPEGs with arithmetic coding\n//    - no 1-bit BMP\n//    - GIF always returns *comp=4\n//\n// Basic usage (see HDR discussion below for HDR usage):\n//    int x,y,n;\n//    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);\n//    // ... process data if not NULL ...\n//    // ... x = width, y = height, n = # 8-bit components per pixel ...\n//    // ... replace '0' with '1'..'4' to force that many components per pixel\n//    // ... but 'n' will always be the number that it would have been if you said 0\n//    stbi_image_free(data)\n//\n// Standard parameters:\n//    int *x                 -- outputs image width in pixels\n//    int *y                 -- outputs image height in pixels\n//    int *channels_in_file  -- outputs # of image components in image file\n//    int desired_channels   -- if non-zero, # of image components requested in result\n//\n// The return value from an image loader is an 'unsigned char *' which points\n// to the pixel data, or NULL on an allocation failure or if the image is\n// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,\n// with each pixel consisting of N interleaved 8-bit components; the first\n// pixel pointed to is top-left-most in the image. There is no padding between\n// image scanlines or between pixels, regardless of format. The number of\n// components N is 'desired_channels' if desired_channels is non-zero, or\n// *channels_in_file otherwise. If desired_channels is non-zero,\n// *channels_in_file has the number of components that _would_ have been\n// output otherwise. E.g. if you set desired_channels to 4, you will always\n// get RGBA output, but you can check *channels_in_file to see if it's trivially\n// opaque because e.g. there were only 3 channels in the source image.\n//\n// An output image with N components has the following components interleaved\n// in this order in each pixel:\n//\n//     N=#comp     components\n//       1           grey\n//       2           grey, alpha\n//       3           red, green, blue\n//       4           red, green, blue, alpha\n//\n// If image loading fails for any reason, the return value will be NULL,\n// and *x, *y, *channels_in_file will be unchanged. The function\n// stbi_failure_reason() can be queried for an extremely brief, end-user\n// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS\n// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly\n// more user-friendly ones.\n//\n// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.\n//\n// ===========================================================================\n//\n// Philosophy\n//\n// stb libraries are designed with the following priorities:\n//\n//    1. easy to use\n//    2. easy to maintain\n//    3. good performance\n//\n// Sometimes I let \"good performance\" creep up in priority over \"easy to maintain\",\n// and for best performance I may provide less-easy-to-use APIs that give higher\n// performance, in addition to the easy to use ones. Nevertheless, it's important\n// to keep in mind that from the standpoint of you, a client of this library,\n// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.\n//\n// Some secondary priorities arise directly from the first two, some of which\n// make more explicit reasons why performance can't be emphasized.\n//\n//    - Portable (\"ease of use\")\n//    - Small source code footprint (\"easy to maintain\")\n//    - No dependencies (\"ease of use\")\n//\n// ===========================================================================\n//\n// I/O callbacks\n//\n// I/O callbacks allow you to read from arbitrary sources, like packaged\n// files or some other source. Data read from callbacks are processed\n// through a small internal buffer (currently 128 bytes) to try to reduce\n// overhead.\n//\n// The three functions you must define are \"read\" (reads some bytes of data),\n// \"skip\" (skips some bytes of data), \"eof\" (reports if the stream is at the end).\n//\n// ===========================================================================\n//\n// SIMD support\n//\n// The JPEG decoder will try to automatically use SIMD kernels on x86 when\n// supported by the compiler. For ARM Neon support, you must explicitly\n// request it.\n//\n// (The old do-it-yourself SIMD API is no longer supported in the current\n// code.)\n//\n// On x86, SSE2 will automatically be used when available based on a run-time\n// test; if not, the generic C versions are used as a fall-back. On ARM targets,\n// the typical path is to have separate builds for NEON and non-NEON devices\n// (at least this is true for iOS and Android). Therefore, the NEON support is\n// toggled by a build flag: define STBI_NEON to get NEON loops.\n//\n// If for some reason you do not want to use any of SIMD code, or if\n// you have issues compiling it, you can disable it entirely by\n// defining STBI_NO_SIMD.\n//\n// ===========================================================================\n//\n// HDR image support   (disable by defining STBI_NO_HDR)\n//\n// stb_image now supports loading HDR images in general, and currently\n// the Radiance .HDR file format, although the support is provided\n// generically. You can still load any file through the existing interface;\n// if you attempt to load an HDR file, it will be automatically remapped to\n// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;\n// both of these constants can be reconfigured through this interface:\n//\n//     stbi_hdr_to_ldr_gamma(2.2f);\n//     stbi_hdr_to_ldr_scale(1.0f);\n//\n// (note, do not use _inverse_ constants; stbi_image will invert them\n// appropriately).\n//\n// Additionally, there is a new, parallel interface for loading files as\n// (linear) floats to preserve the full dynamic range:\n//\n//    float *data = stbi_loadf(filename, &x, &y, &n, 0);\n//\n// If you load LDR images through this interface, those images will\n// be promoted to floating point values, run through the inverse of\n// constants corresponding to the above:\n//\n//     stbi_ldr_to_hdr_scale(1.0f);\n//     stbi_ldr_to_hdr_gamma(2.2f);\n//\n// Finally, given a filename (or an open file or memory block--see header\n// file for details) containing image data, you can query for the \"most\n// appropriate\" interface to use (that is, whether the image is HDR or\n// not), using:\n//\n//     stbi_is_hdr(char *filename);\n//\n// ===========================================================================\n//\n// iPhone PNG support:\n//\n// By default we convert iphone-formatted PNGs back to RGB, even though\n// they are internally encoded differently. You can disable this conversion\n// by by calling stbi_convert_iphone_png_to_rgb(0), in which case\n// you will always just get the native iphone \"format\" through (which\n// is BGR stored in RGB).\n//\n// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per\n// pixel to remove any premultiplied alpha *only* if the image file explicitly\n// says there's premultiplied data (currently only happens in iPhone images,\n// and only if iPhone convert-to-rgb processing is on).\n//\n// ===========================================================================\n//\n// ADDITIONAL CONFIGURATION\n//\n//  - You can suppress implementation of any of the decoders to reduce\n//    your code footprint by #defining one or more of the following\n//    symbols before creating the implementation.\n//\n//        STBI_NO_JPEG\n//        STBI_NO_PNG\n//        STBI_NO_BMP\n//        STBI_NO_PSD\n//        STBI_NO_TGA\n//        STBI_NO_GIF\n//        STBI_NO_HDR\n//        STBI_NO_PIC\n//        STBI_NO_PNM   (.ppm and .pgm)\n//\n//  - You can request *only* certain decoders and suppress all other ones\n//    (this will be more forward-compatible, as addition of new decoders\n//    doesn't require you to disable them explicitly):\n//\n//        STBI_ONLY_JPEG\n//        STBI_ONLY_PNG\n//        STBI_ONLY_BMP\n//        STBI_ONLY_PSD\n//        STBI_ONLY_TGA\n//        STBI_ONLY_GIF\n//        STBI_ONLY_HDR\n//        STBI_ONLY_PIC\n//        STBI_ONLY_PNM   (.ppm and .pgm)\n//\n//   - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still\n//     want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB\n//\n\n\n#ifndef STBI_NO_STDIO\n#include <stdio.h>\n#endif // STBI_NO_STDIO\n\n#define STBI_VERSION 1\n\nenum\n{\n\tSTBI_default = 0, // only used for desired_channels\n\n\tSTBI_grey = 1,\n\tSTBI_grey_alpha = 2,\n\tSTBI_rgb = 3,\n\tSTBI_rgb_alpha = 4\n};\n\ntypedef unsigned char stbi_uc;\ntypedef unsigned short stbi_us;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef STB_IMAGE_STATIC\n#define STBIDEF static\n#else\n#define STBIDEF extern\n#endif\n\n\t//////////////////////////////////////////////////////////////////////////////\n\t//\n\t// PRIMARY API - works on images of any type\n\t//\n\n\t//\n\t// load image by filename, open file, or memory buffer\n\t//\n\n\ttypedef struct\n\t{\n\t\tint(*read)  (void *user, char *data, int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read\n\t\tvoid(*skip)  (void *user, int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative\n\t\tint(*eof)   (void *user);                       // returns nonzero if we are at end of file/data\n\t} stbi_io_callbacks;\n\n\t////////////////////////////////////\n\t//\n\t// 8-bits-per-channel interface\n\t//\n\n\tSTBIDEF stbi_uc *stbi_load_from_memory(stbi_uc           const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);\n\tSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);\n\n#ifndef STBI_NO_STDIO\n\tSTBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\n\tSTBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\n\t// for stbi_load_from_file, file pointer is left pointing immediately after image\n#endif\n\n\t////////////////////////////////////\n\t//\n\t// 16-bits-per-channel interface\n\t//\n\n\tSTBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);\n\tSTBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);\n\n#ifndef STBI_NO_STDIO\n\tSTBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\n\tSTBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\n#endif\n\n\t////////////////////////////////////\n\t//\n\t// float-per-channel interface\n\t//\n#ifndef STBI_NO_LINEAR\n\tSTBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);\n\tSTBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);\n\n#ifndef STBI_NO_STDIO\n\tSTBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\n\tSTBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\n#endif\n#endif\n\n#ifndef STBI_NO_HDR\n\tSTBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);\n\tSTBIDEF void   stbi_hdr_to_ldr_scale(float scale);\n#endif // STBI_NO_HDR\n\n#ifndef STBI_NO_LINEAR\n\tSTBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);\n\tSTBIDEF void   stbi_ldr_to_hdr_scale(float scale);\n#endif // STBI_NO_LINEAR\n\n\t// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR\n\tSTBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);\n\tSTBIDEF int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);\n#ifndef STBI_NO_STDIO\n\tSTBIDEF int      stbi_is_hdr(char const *filename);\n\tSTBIDEF int      stbi_is_hdr_from_file(FILE *f);\n#endif // STBI_NO_STDIO\n\n\n\t// get a VERY brief reason for failure\n\t// NOT THREADSAFE\n\tSTBIDEF const char *stbi_failure_reason(void);\n\n\t// free the loaded image -- this is just free()\n\tSTBIDEF void     stbi_image_free(void *retval_from_stbi_load);\n\n\t// get image dimensions & components without fully decoding\n\tSTBIDEF int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);\n\tSTBIDEF int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);\n\n#ifndef STBI_NO_STDIO\n\tSTBIDEF int      stbi_info(char const *filename, int *x, int *y, int *comp);\n\tSTBIDEF int      stbi_info_from_file(FILE *f, int *x, int *y, int *comp);\n\n#endif\n\n\n\n\t// for image formats that explicitly notate that they have premultiplied alpha,\n\t// we just return the colors as stored in the file. set this flag to force\n\t// unpremultiplication. results are undefined if the unpremultiply overflow.\n\tSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);\n\n\t// indicate whether we should process iphone images back to canonical format,\n\t// or just pass them through \"as-is\"\n\tSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);\n\n\t// flip the image vertically, so the first pixel in the output array is the bottom left\n\tSTBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);\n\n\t// ZLIB client - used by PNG, available for other purposes\n\n\tSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);\n\tSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);\n\tSTBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);\n\tSTBIDEF int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\n\n\tSTBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);\n\tSTBIDEF int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n//\n//\n////   end header file   /////////////////////////////////////////////////////\n#endif // STBI_INCLUDE_STB_IMAGE_H\n\n#ifdef STB_IMAGE_IMPLEMENTATION\n\n#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \\\n  || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \\\n  || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \\\n  || defined(STBI_ONLY_ZLIB)\n#ifndef STBI_ONLY_JPEG\n#define STBI_NO_JPEG\n#endif\n#ifndef STBI_ONLY_PNG\n#define STBI_NO_PNG\n#endif\n#ifndef STBI_ONLY_BMP\n#define STBI_NO_BMP\n#endif\n#ifndef STBI_ONLY_PSD\n#define STBI_NO_PSD\n#endif\n#ifndef STBI_ONLY_TGA\n#define STBI_NO_TGA\n#endif\n#ifndef STBI_ONLY_GIF\n#define STBI_NO_GIF\n#endif\n#ifndef STBI_ONLY_HDR\n#define STBI_NO_HDR\n#endif\n#ifndef STBI_ONLY_PIC\n#define STBI_NO_PIC\n#endif\n#ifndef STBI_ONLY_PNM\n#define STBI_NO_PNM\n#endif\n#endif\n\n#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)\n#define STBI_NO_ZLIB\n#endif\n\n\n#include <stdarg.h>\n#include <stddef.h> // ptrdiff_t on osx\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)\n#include <math.h>  // ldexp\n#endif\n\n#ifndef STBI_NO_STDIO\n#include <stdio.h>\n#endif\n\n#ifndef STBI_ASSERT\n#include <assert.h>\n#define STBI_ASSERT(x) assert(x)\n#endif\n\n\n#ifndef _MSC_VER\n#ifdef __cplusplus\n#define stbi_inline inline\n#else\n#define stbi_inline\n#endif\n#else\n#define stbi_inline __forceinline\n#endif\n\n\n#ifdef _MSC_VER\ntypedef unsigned short stbi__uint16;\ntypedef   signed short stbi__int16;\ntypedef unsigned int   stbi__uint32;\ntypedef   signed int   stbi__int32;\n#else\n#include <stdint.h>\ntypedef uint16_t stbi__uint16;\ntypedef int16_t  stbi__int16;\ntypedef uint32_t stbi__uint32;\ntypedef int32_t  stbi__int32;\n#endif\n\n// should produce compiler error if size is wrong\ntypedef unsigned char validate_uint32[sizeof(stbi__uint32) == 4 ? 1 : -1];\n\n#ifdef _MSC_VER\n#define STBI_NOTUSED(v)  (void)(v)\n#else\n#define STBI_NOTUSED(v)  (void)sizeof(v)\n#endif\n\n#ifdef _MSC_VER\n#define STBI_HAS_LROTL\n#endif\n\n#ifdef STBI_HAS_LROTL\n#define stbi_lrot(x,y)  _lrotl(x,y)\n#else\n#define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (32 - (y))))\n#endif\n\n#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))\n// ok\n#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)\n// ok\n#else\n#error \"Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED).\"\n#endif\n\n#ifndef STBI_MALLOC\n#define STBI_MALLOC(sz)           malloc(sz)\n#define STBI_REALLOC(p,newsz)     realloc(p,newsz)\n#define STBI_FREE(p)              free(p)\n#endif\n\n#ifndef STBI_REALLOC_SIZED\n#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)\n#endif\n\n// x86/x64 detection\n#if defined(__x86_64__) || defined(_M_X64)\n#define STBI__X64_TARGET\n#elif defined(__i386) || defined(_M_IX86)\n#define STBI__X86_TARGET\n#endif\n\n#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)\n// gcc doesn't support sse2 intrinsics unless you compile with -msse2,\n// which in turn means it gets to use SSE2 everywhere. This is unfortunate,\n// but previous attempts to provide the SSE2 functions with runtime\n// detection caused numerous issues. The way architecture extensions are\n// exposed in GCC/Clang is, sadly, not really suited for one-file libs.\n// New behavior: if compiled with -msse2, we use SSE2 without any\n// detection; if not, we don't use it at all.\n#define STBI_NO_SIMD\n#endif\n\n#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)\n// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET\n//\n// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the\n// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.\n// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not\n// simultaneously enabling \"-mstackrealign\".\n//\n// See https://github.com/nothings/stb/issues/81 for more information.\n//\n// So default to no SSE2 on 32-bit MinGW. If you've read this far and added\n// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.\n#define STBI_NO_SIMD\n#endif\n\n#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))\n#define STBI_SSE2\n#include <emmintrin.h>\n\n#ifdef _MSC_VER\n\n#if _MSC_VER >= 1400  // not VC6\n#include <intrin.h> // __cpuid\nstatic int stbi__cpuid3(void)\n{\n\tint info[4];\n\t__cpuid(info, 1);\n\treturn info[3];\n}\n#else\nstatic int stbi__cpuid3(void)\n{\n\tint res;\n\t__asm {\n\t\tmov  eax, 1\n\t\tcpuid\n\t\tmov  res, edx\n\t}\n\treturn res;\n}\n#endif\n\n#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name\n\nstatic int stbi__sse2_available(void)\n{\n\tint info3 = stbi__cpuid3();\n\treturn ((info3 >> 26) & 1) != 0;\n}\n#else // assume GCC-style if not VC++\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\n\nstatic int stbi__sse2_available(void)\n{\n\t// If we're even attempting to compile this on GCC/Clang, that means\n\t// -msse2 is on, which means the compiler is allowed to use SSE2\n\t// instructions at will, and so are we.\n\treturn 1;\n}\n#endif\n#endif\n\n// ARM NEON\n#if defined(STBI_NO_SIMD) && defined(STBI_NEON)\n#undef STBI_NEON\n#endif\n\n#ifdef STBI_NEON\n#include <arm_neon.h>\n// assume GCC or Clang on ARM targets\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\n#endif\n\n#ifndef STBI_SIMD_ALIGN\n#define STBI_SIMD_ALIGN(type, name) type name\n#endif\n\n///////////////////////////////////////////////\n//\n//  stbi__context struct and start_xxx functions\n\n// stbi__context structure is our basic context used by all images, so it\n// contains all the IO context, plus some basic image information\ntypedef struct\n{\n\tstbi__uint32 img_x, img_y;\n\tint img_n, img_out_n;\n\n\tstbi_io_callbacks io;\n\tvoid *io_user_data;\n\n\tint read_from_callbacks;\n\tint buflen;\n\tstbi_uc buffer_start[128];\n\n\tstbi_uc *img_buffer, *img_buffer_end;\n\tstbi_uc *img_buffer_original, *img_buffer_original_end;\n} stbi__context;\n\n\nstatic void stbi__refill_buffer(stbi__context *s);\n\n// initialize a memory-decode context\nstatic void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)\n{\n\ts->io.read = NULL;\n\ts->read_from_callbacks = 0;\n\ts->img_buffer = s->img_buffer_original = (stbi_uc *)buffer;\n\ts->img_buffer_end = s->img_buffer_original_end = (stbi_uc *)buffer + len;\n}\n\n// initialize a callback-based context\nstatic void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)\n{\n\ts->io = *c;\n\ts->io_user_data = user;\n\ts->buflen = sizeof(s->buffer_start);\n\ts->read_from_callbacks = 1;\n\ts->img_buffer_original = s->buffer_start;\n\tstbi__refill_buffer(s);\n\ts->img_buffer_original_end = s->img_buffer_end;\n}\n\n#ifndef STBI_NO_STDIO\n\nstatic int stbi__stdio_read(void *user, char *data, int size)\n{\n\treturn (int)fread(data, 1, size, (FILE*)user);\n}\n\nstatic void stbi__stdio_skip(void *user, int n)\n{\n\tfseek((FILE*)user, n, SEEK_CUR);\n}\n\nstatic int stbi__stdio_eof(void *user)\n{\n\treturn feof((FILE*)user);\n}\n\nstatic stbi_io_callbacks stbi__stdio_callbacks =\n{\n\tstbi__stdio_read,\n\tstbi__stdio_skip,\n\tstbi__stdio_eof,\n};\n\nstatic void stbi__start_file(stbi__context *s, FILE *f)\n{\n\tstbi__start_callbacks(s, &stbi__stdio_callbacks, (void *)f);\n}\n\n//static void stop_file(stbi__context *s) { }\n\n#endif // !STBI_NO_STDIO\n\nstatic void stbi__rewind(stbi__context *s)\n{\n\t// conceptually rewind SHOULD rewind to the beginning of the stream,\n\t// but we just rewind to the beginning of the initial buffer, because\n\t// we only use it after doing 'test', which only ever looks at at most 92 bytes\n\ts->img_buffer = s->img_buffer_original;\n\ts->img_buffer_end = s->img_buffer_original_end;\n}\n\nenum\n{\n\tSTBI_ORDER_RGB,\n\tSTBI_ORDER_BGR\n};\n\ntypedef struct\n{\n\tint bits_per_channel;\n\tint num_channels;\n\tint channel_order;\n} stbi__result_info;\n\n#ifndef STBI_NO_JPEG\nstatic int      stbi__jpeg_test(stbi__context *s);\nstatic void    *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PNG\nstatic int      stbi__png_test(stbi__context *s);\nstatic void    *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__png_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_BMP\nstatic int      stbi__bmp_test(stbi__context *s);\nstatic void    *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_TGA\nstatic int      stbi__tga_test(stbi__context *s);\nstatic void    *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PSD\nstatic int      stbi__psd_test(stbi__context *s);\nstatic void    *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);\nstatic int      stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_HDR\nstatic int      stbi__hdr_test(stbi__context *s);\nstatic float   *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PIC\nstatic int      stbi__pic_test(stbi__context *s);\nstatic void    *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_GIF\nstatic int      stbi__gif_test(stbi__context *s);\nstatic void    *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PNM\nstatic int      stbi__pnm_test(stbi__context *s);\nstatic void    *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n// this is not threadsafe\nstatic const char *stbi__g_failure_reason;\n\nSTBIDEF const char *stbi_failure_reason(void)\n{\n\treturn stbi__g_failure_reason;\n}\n\nstatic int stbi__err(const char *str)\n{\n\tstbi__g_failure_reason = str;\n\treturn 0;\n}\n\nstatic void *stbi__malloc(size_t size)\n{\n\treturn STBI_MALLOC(size);\n}\n\n// stb_image uses ints pervasively, including for offset calculations.\n// therefore the largest decoded image size we can support with the\n// current code, even on 64-bit targets, is INT_MAX. this is not a\n// significant limitation for the intended use case.\n//\n// we do, however, need to make sure our size calculations don't\n// overflow. hence a few helper functions for size calculations that\n// multiply integers together, making sure that they're non-negative\n// and no overflow occurs.\n\n// return 1 if the sum is valid, 0 on overflow.\n// negative terms are considered invalid.\nstatic int stbi__addsizes_valid(int a, int b)\n{\n\tif (b < 0) return 0;\n\t// now 0 <= b <= INT_MAX, hence also\n\t// 0 <= INT_MAX - b <= INTMAX.\n\t// And \"a + b <= INT_MAX\" (which might overflow) is the\n\t// same as a <= INT_MAX - b (no overflow)\n\treturn a <= INT_MAX - b;\n}\n\n// returns 1 if the product is valid, 0 on overflow.\n// negative factors are considered invalid.\nstatic int stbi__mul2sizes_valid(int a, int b)\n{\n\tif (a < 0 || b < 0) return 0;\n\tif (b == 0) return 1; // mul-by-0 is always safe\n\t\t\t\t\t\t  // portable way to check for no overflows in a*b\n\treturn a <= INT_MAX / b;\n}\n\n// returns 1 if \"a*b + add\" has no negative terms/factors and doesn't overflow\nstatic int stbi__mad2sizes_valid(int a, int b, int add)\n{\n\treturn stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);\n}\n\n// returns 1 if \"a*b*c + add\" has no negative terms/factors and doesn't overflow\nstatic int stbi__mad3sizes_valid(int a, int b, int c, int add)\n{\n\treturn stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&\n\t\tstbi__addsizes_valid(a*b*c, add);\n}\n\n// returns 1 if \"a*b*c*d + add\" has no negative terms/factors and doesn't overflow\nstatic int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)\n{\n\treturn stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&\n\t\tstbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);\n}\n\n// mallocs with size overflow checking\nstatic void *stbi__malloc_mad2(int a, int b, int add)\n{\n\tif (!stbi__mad2sizes_valid(a, b, add)) return NULL;\n\treturn stbi__malloc(a*b + add);\n}\n\nstatic void *stbi__malloc_mad3(int a, int b, int c, int add)\n{\n\tif (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;\n\treturn stbi__malloc(a*b*c + add);\n}\n\nstatic void *stbi__malloc_mad4(int a, int b, int c, int d, int add)\n{\n\tif (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;\n\treturn stbi__malloc(a*b*c*d + add);\n}\n\n// stbi__err - error\n// stbi__errpf - error returning pointer to float\n// stbi__errpuc - error returning pointer to unsigned char\n\n#ifdef STBI_NO_FAILURE_STRINGS\n#define stbi__err(x,y)  0\n#elif defined(STBI_FAILURE_USERMSG)\n#define stbi__err(x,y)  stbi__err(y)\n#else\n#define stbi__err(x,y)  stbi__err(x)\n#endif\n\n#define stbi__errpf(x,y)   ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))\n#define stbi__errpuc(x,y)  ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))\n\nSTBIDEF void stbi_image_free(void *retval_from_stbi_load)\n{\n\tSTBI_FREE(retval_from_stbi_load);\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);\n#endif\n\n#ifndef STBI_NO_HDR\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp);\n#endif\n\nstatic int stbi__vertically_flip_on_load = 0;\n\nSTBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)\n{\n\tstbi__vertically_flip_on_load = flag_true_if_should_flip;\n}\n\nstatic void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)\n{\n\tmemset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields\n\tri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed\n\tri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order\n\tri->num_channels = 0;\n\n#ifndef STBI_NO_JPEG\n\tif (stbi__jpeg_test(s)) return stbi__jpeg_load(s, x, y, comp, req_comp, ri);\n#endif\n#ifndef STBI_NO_PNG\n\tif (stbi__png_test(s))  return stbi__png_load(s, x, y, comp, req_comp, ri);\n#endif\n#ifndef STBI_NO_BMP\n\tif (stbi__bmp_test(s))  return stbi__bmp_load(s, x, y, comp, req_comp, ri);\n#endif\n#ifndef STBI_NO_GIF\n\tif (stbi__gif_test(s))  return stbi__gif_load(s, x, y, comp, req_comp, ri);\n#endif\n#ifndef STBI_NO_PSD\n\tif (stbi__psd_test(s))  return stbi__psd_load(s, x, y, comp, req_comp, ri, bpc);\n#endif\n#ifndef STBI_NO_PIC\n\tif (stbi__pic_test(s))  return stbi__pic_load(s, x, y, comp, req_comp, ri);\n#endif\n#ifndef STBI_NO_PNM\n\tif (stbi__pnm_test(s))  return stbi__pnm_load(s, x, y, comp, req_comp, ri);\n#endif\n\n#ifndef STBI_NO_HDR\n\tif (stbi__hdr_test(s)) {\n\t\tfloat *hdr = stbi__hdr_load(s, x, y, comp, req_comp, ri);\n\t\treturn stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);\n\t}\n#endif\n\n#ifndef STBI_NO_TGA\n\t// test tga last because it's a crappy test!\n\tif (stbi__tga_test(s))\n\t\treturn stbi__tga_load(s, x, y, comp, req_comp, ri);\n#endif\n\n\treturn stbi__errpuc(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\nstatic stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)\n{\n\tint i;\n\tint img_len = w * h * channels;\n\tstbi_uc *reduced;\n\n\treduced = (stbi_uc *)stbi__malloc(img_len);\n\tif (reduced == NULL) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n\tfor (i = 0; i < img_len; ++i)\n\t\treduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling\n\n\tSTBI_FREE(orig);\n\treturn reduced;\n}\n\nstatic stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)\n{\n\tint i;\n\tint img_len = w * h * channels;\n\tstbi__uint16 *enlarged;\n\n\tenlarged = (stbi__uint16 *)stbi__malloc(img_len * 2);\n\tif (enlarged == NULL) return (stbi__uint16 *)stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n\tfor (i = 0; i < img_len; ++i)\n\t\tenlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff\n\n\tSTBI_FREE(orig);\n\treturn enlarged;\n}\n\nstatic void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)\n{\n\tint row;\n\tsize_t bytes_per_row = (size_t)w * bytes_per_pixel;\n\tstbi_uc temp[2048];\n\tstbi_uc *bytes = (stbi_uc *)image;\n\n\tfor (row = 0; row < (h >> 1); row++) {\n\t\tstbi_uc *row0 = bytes + row*bytes_per_row;\n\t\tstbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;\n\t\t// swap row0 with row1\n\t\tsize_t bytes_left = bytes_per_row;\n\t\twhile (bytes_left) {\n\t\t\tsize_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);\n\t\t\tmemcpy(temp, row0, bytes_copy);\n\t\t\tmemcpy(row0, row1, bytes_copy);\n\t\t\tmemcpy(row1, temp, bytes_copy);\n\t\t\trow0 += bytes_copy;\n\t\t\trow1 += bytes_copy;\n\t\t\tbytes_left -= bytes_copy;\n\t\t}\n\t}\n}\n\nstatic unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n\tstbi__result_info ri;\n\tvoid *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);\n\n\tif (result == NULL)\n\t\treturn NULL;\n\n\tif (ri.bits_per_channel != 8) {\n\t\tSTBI_ASSERT(ri.bits_per_channel == 16);\n\t\tresult = stbi__convert_16_to_8((stbi__uint16 *)result, *x, *y, req_comp == 0 ? *comp : req_comp);\n\t\tri.bits_per_channel = 8;\n\t}\n\n\t// @TODO: move stbi__convert_format to here\n\n\tif (stbi__vertically_flip_on_load) {\n\t\tint channels = req_comp ? req_comp : *comp;\n\t\tstbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));\n\t}\n\n\treturn (unsigned char *)result;\n}\n\nstatic stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n\tstbi__result_info ri;\n\tvoid *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);\n\n\tif (result == NULL)\n\t\treturn NULL;\n\n\tif (ri.bits_per_channel != 16) {\n\t\tSTBI_ASSERT(ri.bits_per_channel == 8);\n\t\tresult = stbi__convert_8_to_16((stbi_uc *)result, *x, *y, req_comp == 0 ? *comp : req_comp);\n\t\tri.bits_per_channel = 16;\n\t}\n\n\t// @TODO: move stbi__convert_format16 to here\n\t// @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision\n\n\tif (stbi__vertically_flip_on_load) {\n\t\tint channels = req_comp ? req_comp : *comp;\n\t\tstbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));\n\t}\n\n\treturn (stbi__uint16 *)result;\n}\n\n#ifndef STBI_NO_HDR\nstatic void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)\n{\n\tif (stbi__vertically_flip_on_load && result != NULL) {\n\t\tint channels = req_comp ? req_comp : *comp;\n\t\tstbi__vertical_flip(result, *x, *y, channels * sizeof(float));\n\t}\n}\n#endif\n\n#ifndef STBI_NO_STDIO\n\nstatic FILE *stbi__fopen(char const *filename, char const *mode)\n{\n\tFILE *f;\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n\tif (0 != fopen_s(&f, filename, mode))\n\t\tf = 0;\n#else\n\tf = fopen(filename, mode);\n#endif\n\treturn f;\n}\n\n\nSTBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n\tFILE *f = stbi__fopen(filename, \"rb\");\n\tunsigned char *result;\n\tif (!f) return stbi__errpuc(\"can't fopen\", \"Unable to open file\");\n\tresult = stbi_load_from_file(f, x, y, comp, req_comp);\n\tfclose(f);\n\treturn result;\n}\n\nSTBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n\tunsigned char *result;\n\tstbi__context s;\n\tstbi__start_file(&s, f);\n\tresult = stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);\n\tif (result) {\n\t\t// need to 'unget' all the characters in the IO buffer\n\t\tfseek(f, -(int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);\n\t}\n\treturn result;\n}\n\nSTBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n\tstbi__uint16 *result;\n\tstbi__context s;\n\tstbi__start_file(&s, f);\n\tresult = stbi__load_and_postprocess_16bit(&s, x, y, comp, req_comp);\n\tif (result) {\n\t\t// need to 'unget' all the characters in the IO buffer\n\t\tfseek(f, -(int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);\n\t}\n\treturn result;\n}\n\nSTBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n\tFILE *f = stbi__fopen(filename, \"rb\");\n\tstbi__uint16 *result;\n\tif (!f) return (stbi_us *)stbi__errpuc(\"can't fopen\", \"Unable to open file\");\n\tresult = stbi_load_from_file_16(f, x, y, comp, req_comp);\n\tfclose(f);\n\treturn result;\n}\n\n\n#endif //!STBI_NO_STDIO\n\nSTBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)\n{\n\tstbi__context s;\n\tstbi__start_mem(&s, buffer, len);\n\treturn stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels);\n}\n\nSTBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)\n{\n\tstbi__context s;\n\tstbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);\n\treturn stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels);\n}\n\nSTBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\n{\n\tstbi__context s;\n\tstbi__start_mem(&s, buffer, len);\n\treturn stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);\n}\n\nSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\n{\n\tstbi__context s;\n\tstbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);\n\treturn stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n\tunsigned char *data;\n#ifndef STBI_NO_HDR\n\tif (stbi__hdr_test(s)) {\n\t\tstbi__result_info ri;\n\t\tfloat *hdr_data = stbi__hdr_load(s, x, y, comp, req_comp, &ri);\n\t\tif (hdr_data)\n\t\t\tstbi__float_postprocess(hdr_data, x, y, comp, req_comp);\n\t\treturn hdr_data;\n\t}\n#endif\n\tdata = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);\n\tif (data)\n\t\treturn stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);\n\treturn stbi__errpf(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\nSTBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\n{\n\tstbi__context s;\n\tstbi__start_mem(&s, buffer, len);\n\treturn stbi__loadf_main(&s, x, y, comp, req_comp);\n}\n\nSTBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\n{\n\tstbi__context s;\n\tstbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);\n\treturn stbi__loadf_main(&s, x, y, comp, req_comp);\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n\tfloat *result;\n\tFILE *f = stbi__fopen(filename, \"rb\");\n\tif (!f) return stbi__errpf(\"can't fopen\", \"Unable to open file\");\n\tresult = stbi_loadf_from_file(f, x, y, comp, req_comp);\n\tfclose(f);\n\treturn result;\n}\n\nSTBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n\tstbi__context s;\n\tstbi__start_file(&s, f);\n\treturn stbi__loadf_main(&s, x, y, comp, req_comp);\n}\n#endif // !STBI_NO_STDIO\n\n#endif // !STBI_NO_LINEAR\n\n// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is\n// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always\n// reports false!\n\nSTBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)\n{\n#ifndef STBI_NO_HDR\n\tstbi__context s;\n\tstbi__start_mem(&s, buffer, len);\n\treturn stbi__hdr_test(&s);\n#else\n\tSTBI_NOTUSED(buffer);\n\tSTBI_NOTUSED(len);\n\treturn 0;\n#endif\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_is_hdr(char const *filename)\n{\n\tFILE *f = stbi__fopen(filename, \"rb\");\n\tint result = 0;\n\tif (f) {\n\t\tresult = stbi_is_hdr_from_file(f);\n\t\tfclose(f);\n\t}\n\treturn result;\n}\n\nSTBIDEF int      stbi_is_hdr_from_file(FILE *f)\n{\n#ifndef STBI_NO_HDR\n\tstbi__context s;\n\tstbi__start_file(&s, f);\n\treturn stbi__hdr_test(&s);\n#else\n\tSTBI_NOTUSED(f);\n\treturn 0;\n#endif\n}\n#endif // !STBI_NO_STDIO\n\nSTBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)\n{\n#ifndef STBI_NO_HDR\n\tstbi__context s;\n\tstbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);\n\treturn stbi__hdr_test(&s);\n#else\n\tSTBI_NOTUSED(clbk);\n\tSTBI_NOTUSED(user);\n\treturn 0;\n#endif\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f;\n\nSTBIDEF void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }\nSTBIDEF void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }\n#endif\n\nstatic float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f;\n\nSTBIDEF void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1 / gamma; }\nSTBIDEF void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1 / scale; }\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Common code used by all image loaders\n//\n\nenum\n{\n\tSTBI__SCAN_load = 0,\n\tSTBI__SCAN_type,\n\tSTBI__SCAN_header\n};\n\nstatic void stbi__refill_buffer(stbi__context *s)\n{\n\tint n = (s->io.read)(s->io_user_data, (char*)s->buffer_start, s->buflen);\n\tif (n == 0) {\n\t\t// at end of file, treat same as if from memory, but need to handle case\n\t\t// where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file\n\t\ts->read_from_callbacks = 0;\n\t\ts->img_buffer = s->buffer_start;\n\t\ts->img_buffer_end = s->buffer_start + 1;\n\t\t*s->img_buffer = 0;\n\t}\n\telse {\n\t\ts->img_buffer = s->buffer_start;\n\t\ts->img_buffer_end = s->buffer_start + n;\n\t}\n}\n\nstbi_inline static stbi_uc stbi__get8(stbi__context *s)\n{\n\tif (s->img_buffer < s->img_buffer_end)\n\t\treturn *s->img_buffer++;\n\tif (s->read_from_callbacks) {\n\t\tstbi__refill_buffer(s);\n\t\treturn *s->img_buffer++;\n\t}\n\treturn 0;\n}\n\nstbi_inline static int stbi__at_eof(stbi__context *s)\n{\n\tif (s->io.read) {\n\t\tif (!(s->io.eof)(s->io_user_data)) return 0;\n\t\t// if feof() is true, check if buffer = end\n\t\t// special case: we've only got the special 0 character at the end\n\t\tif (s->read_from_callbacks == 0) return 1;\n\t}\n\n\treturn s->img_buffer >= s->img_buffer_end;\n}\n\nstatic void stbi__skip(stbi__context *s, int n)\n{\n\tif (n < 0) {\n\t\ts->img_buffer = s->img_buffer_end;\n\t\treturn;\n\t}\n\tif (s->io.read) {\n\t\tint blen = (int)(s->img_buffer_end - s->img_buffer);\n\t\tif (blen < n) {\n\t\t\ts->img_buffer = s->img_buffer_end;\n\t\t\t(s->io.skip)(s->io_user_data, n - blen);\n\t\t\treturn;\n\t\t}\n\t}\n\ts->img_buffer += n;\n}\n\nstatic int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)\n{\n\tif (s->io.read) {\n\t\tint blen = (int)(s->img_buffer_end - s->img_buffer);\n\t\tif (blen < n) {\n\t\t\tint res, count;\n\n\t\t\tmemcpy(buffer, s->img_buffer, blen);\n\n\t\t\tcount = (s->io.read)(s->io_user_data, (char*)buffer + blen, n - blen);\n\t\t\tres = (count == (n - blen));\n\t\t\ts->img_buffer = s->img_buffer_end;\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tif (s->img_buffer + n <= s->img_buffer_end) {\n\t\tmemcpy(buffer, s->img_buffer, n);\n\t\ts->img_buffer += n;\n\t\treturn 1;\n\t}\n\telse\n\t\treturn 0;\n}\n\nstatic int stbi__get16be(stbi__context *s)\n{\n\tint z = stbi__get8(s);\n\treturn (z << 8) + stbi__get8(s);\n}\n\nstatic stbi__uint32 stbi__get32be(stbi__context *s)\n{\n\tstbi__uint32 z = stbi__get16be(s);\n\treturn (z << 16) + stbi__get16be(s);\n}\n\n#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)\n// nothing\n#else\nstatic int stbi__get16le(stbi__context *s)\n{\n\tint z = stbi__get8(s);\n\treturn z + (stbi__get8(s) << 8);\n}\n#endif\n\n#ifndef STBI_NO_BMP\nstatic stbi__uint32 stbi__get32le(stbi__context *s)\n{\n\tstbi__uint32 z = stbi__get16le(s);\n\treturn z + (stbi__get16le(s) << 16);\n}\n#endif\n\n#define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  generic converter from built-in img_n to req_comp\n//    individual types do this automatically as much as possible (e.g. jpeg\n//    does all cases internally since it needs to colorspace convert anyway,\n//    and it never has alpha, so very few cases ). png can automatically\n//    interleave an alpha=255 channel, but falls back to this for other cases\n//\n//  assume data buffer is malloced, so malloc a new one and free that one\n//  only failure mode is malloc failing\n\nstatic stbi_uc stbi__compute_y(int r, int g, int b)\n{\n\treturn (stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8);\n}\n\nstatic unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)\n{\n\tint i, j;\n\tunsigned char *good;\n\n\tif (req_comp == img_n) return data;\n\tSTBI_ASSERT(req_comp >= 1 && req_comp <= 4);\n\n\tgood = (unsigned char *)stbi__malloc_mad3(req_comp, x, y, 0);\n\tif (good == NULL) {\n\t\tSTBI_FREE(data);\n\t\treturn stbi__errpuc(\"outofmem\", \"Out of memory\");\n\t}\n\n\tfor (j = 0; j < (int)y; ++j) {\n\t\tunsigned char *src = data + j * x * img_n;\n\t\tunsigned char *dest = good + j * x * req_comp;\n\n#define STBI__COMBO(a,b)  ((a)*8+(b))\n#define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)\n\t\t// convert source image with img_n components to one with req_comp components;\n\t\t// avoid switch per pixel, so use switch per scanline and massive macros\n\t\tswitch (STBI__COMBO(img_n, req_comp)) {\n\t\t\tSTBI__CASE(1, 2) { dest[0] = src[0], dest[1] = 255; } break;\n\t\t\tSTBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; } break;\n\t\t\tSTBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = 255; } break;\n\t\t\tSTBI__CASE(2, 1) { dest[0] = src[0]; } break;\n\t\t\tSTBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; } break;\n\t\t\tSTBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = src[1]; } break;\n\t\t\tSTBI__CASE(3, 4) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2], dest[3] = 255; } break;\n\t\t\tSTBI__CASE(3, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); } break;\n\t\t\tSTBI__CASE(3, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = 255; } break;\n\t\t\tSTBI__CASE(4, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); } break;\n\t\t\tSTBI__CASE(4, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = src[3]; } break;\n\t\t\tSTBI__CASE(4, 3) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; } break;\n\t\tdefault: STBI_ASSERT(0);\n\t\t}\n#undef STBI__CASE\n\t}\n\n\tSTBI_FREE(data);\n\treturn good;\n}\n\nstatic stbi__uint16 stbi__compute_y_16(int r, int g, int b)\n{\n\treturn (stbi__uint16)(((r * 77) + (g * 150) + (29 * b)) >> 8);\n}\n\nstatic stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)\n{\n\tint i, j;\n\tstbi__uint16 *good;\n\n\tif (req_comp == img_n) return data;\n\tSTBI_ASSERT(req_comp >= 1 && req_comp <= 4);\n\n\tgood = (stbi__uint16 *)stbi__malloc(req_comp * x * y * 2);\n\tif (good == NULL) {\n\t\tSTBI_FREE(data);\n\t\treturn (stbi__uint16 *)stbi__errpuc(\"outofmem\", \"Out of memory\");\n\t}\n\n\tfor (j = 0; j < (int)y; ++j) {\n\t\tstbi__uint16 *src = data + j * x * img_n;\n\t\tstbi__uint16 *dest = good + j * x * req_comp;\n\n#define STBI__COMBO(a,b)  ((a)*8+(b))\n#define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)\n\t\t// convert source image with img_n components to one with req_comp components;\n\t\t// avoid switch per pixel, so use switch per scanline and massive macros\n\t\tswitch (STBI__COMBO(img_n, req_comp)) {\n\t\t\tSTBI__CASE(1, 2) { dest[0] = src[0], dest[1] = 0xffff; } break;\n\t\t\tSTBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; } break;\n\t\t\tSTBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = 0xffff; } break;\n\t\t\tSTBI__CASE(2, 1) { dest[0] = src[0]; } break;\n\t\t\tSTBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; } break;\n\t\t\tSTBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = src[1]; } break;\n\t\t\tSTBI__CASE(3, 4) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2], dest[3] = 0xffff; } break;\n\t\t\tSTBI__CASE(3, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); } break;\n\t\t\tSTBI__CASE(3, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]), dest[1] = 0xffff; } break;\n\t\t\tSTBI__CASE(4, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); } break;\n\t\t\tSTBI__CASE(4, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]), dest[1] = src[3]; } break;\n\t\t\tSTBI__CASE(4, 3) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; } break;\n\t\tdefault: STBI_ASSERT(0);\n\t\t}\n#undef STBI__CASE\n\t}\n\n\tSTBI_FREE(data);\n\treturn good;\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)\n{\n\tint i, k, n;\n\tfloat *output;\n\tif (!data) return NULL;\n\toutput = (float *)stbi__malloc_mad4(x, y, comp, sizeof(float), 0);\n\tif (output == NULL) { STBI_FREE(data); return stbi__errpf(\"outofmem\", \"Out of memory\"); }\n\t// compute number of non-alpha components\n\tif (comp & 1) n = comp; else n = comp - 1;\n\tfor (i = 0; i < x*y; ++i) {\n\t\tfor (k = 0; k < n; ++k) {\n\t\t\toutput[i*comp + k] = (float)(pow(data[i*comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale);\n\t\t}\n\t\tif (k < comp) output[i*comp + k] = data[i*comp + k] / 255.0f;\n\t}\n\tSTBI_FREE(data);\n\treturn output;\n}\n#endif\n\n#ifndef STBI_NO_HDR\n#define stbi__float2int(x)   ((int) (x))\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp)\n{\n\tint i, k, n;\n\tstbi_uc *output;\n\tif (!data) return NULL;\n\toutput = (stbi_uc *)stbi__malloc_mad3(x, y, comp, 0);\n\tif (output == NULL) { STBI_FREE(data); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\t// compute number of non-alpha components\n\tif (comp & 1) n = comp; else n = comp - 1;\n\tfor (i = 0; i < x*y; ++i) {\n\t\tfor (k = 0; k < n; ++k) {\n\t\t\tfloat z = (float)pow(data[i*comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;\n\t\t\tif (z < 0) z = 0;\n\t\t\tif (z > 255) z = 255;\n\t\t\toutput[i*comp + k] = (stbi_uc)stbi__float2int(z);\n\t\t}\n\t\tif (k < comp) {\n\t\t\tfloat z = data[i*comp + k] * 255 + 0.5f;\n\t\t\tif (z < 0) z = 0;\n\t\t\tif (z > 255) z = 255;\n\t\t\toutput[i*comp + k] = (stbi_uc)stbi__float2int(z);\n\t\t}\n\t}\n\tSTBI_FREE(data);\n\treturn output;\n}\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  \"baseline\" JPEG/JFIF decoder\n//\n//    simple implementation\n//      - doesn't support delayed output of y-dimension\n//      - simple interface (only one output format: 8-bit interleaved RGB)\n//      - doesn't try to recover corrupt jpegs\n//      - doesn't allow partial loading, loading multiple at once\n//      - still fast on x86 (copying globals into locals doesn't help x86)\n//      - allocates lots of intermediate memory (full size of all components)\n//        - non-interleaved case requires this anyway\n//        - allows good upsampling (see next)\n//    high-quality\n//      - upsampled channels are bilinearly interpolated, even across blocks\n//      - quality integer IDCT derived from IJG's 'slow'\n//    performance\n//      - fast huffman; reasonable integer IDCT\n//      - some SIMD kernels for common paths on targets with SSE2/NEON\n//      - uses a lot of intermediate memory, could cache poorly\n\n#ifndef STBI_NO_JPEG\n\n// huffman decoding acceleration\n#define FAST_BITS   9  // larger handles more cases; smaller stomps less cache\n\ntypedef struct\n{\n\tstbi_uc  fast[1 << FAST_BITS];\n\t// weirdly, repacking this into AoS is a 10% speed loss, instead of a win\n\tstbi__uint16 code[256];\n\tstbi_uc  values[256];\n\tstbi_uc  size[257];\n\tunsigned int maxcode[18];\n\tint    delta[17];   // old 'firstsymbol' - old 'firstcode'\n} stbi__huffman;\n\ntypedef struct\n{\n\tstbi__context *s;\n\tstbi__huffman huff_dc[4];\n\tstbi__huffman huff_ac[4];\n\tstbi__uint16 dequant[4][64];\n\tstbi__int16 fast_ac[4][1 << FAST_BITS];\n\n\t// sizes for components, interleaved MCUs\n\tint img_h_max, img_v_max;\n\tint img_mcu_x, img_mcu_y;\n\tint img_mcu_w, img_mcu_h;\n\n\t// definition of jpeg image component\n\tstruct\n\t{\n\t\tint id;\n\t\tint h, v;\n\t\tint tq;\n\t\tint hd, ha;\n\t\tint dc_pred;\n\n\t\tint x, y, w2, h2;\n\t\tstbi_uc *data;\n\t\tvoid *raw_data, *raw_coeff;\n\t\tstbi_uc *linebuf;\n\t\tshort   *coeff;   // progressive only\n\t\tint      coeff_w, coeff_h; // number of 8x8 coefficient blocks\n\t} img_comp[4];\n\n\tstbi__uint32   code_buffer; // jpeg entropy-coded buffer\n\tint            code_bits;   // number of valid bits\n\tunsigned char  marker;      // marker seen while filling entropy buffer\n\tint            nomore;      // flag if we saw a marker so must stop\n\n\tint            progressive;\n\tint            spec_start;\n\tint            spec_end;\n\tint            succ_high;\n\tint            succ_low;\n\tint            eob_run;\n\tint            jfif;\n\tint            app14_color_transform; // Adobe APP14 tag\n\tint            rgb;\n\n\tint scan_n, order[4];\n\tint restart_interval, todo;\n\n\t// kernels\n\tvoid(*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);\n\tvoid(*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);\n\tstbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);\n} stbi__jpeg;\n\nstatic int stbi__build_huffman(stbi__huffman *h, int *count)\n{\n\tint i, j, k = 0, code;\n\t// build size list for each symbol (from JPEG spec)\n\tfor (i = 0; i < 16; ++i)\n\t\tfor (j = 0; j < count[i]; ++j)\n\t\t\th->size[k++] = (stbi_uc)(i + 1);\n\th->size[k] = 0;\n\n\t// compute actual symbols (from jpeg spec)\n\tcode = 0;\n\tk = 0;\n\tfor (j = 1; j <= 16; ++j) {\n\t\t// compute delta to add to code to compute symbol id\n\t\th->delta[j] = k - code;\n\t\tif (h->size[k] == j) {\n\t\t\twhile (h->size[k] == j)\n\t\t\t\th->code[k++] = (stbi__uint16)(code++);\n\t\t\tif (code - 1 >= (1 << j)) return stbi__err(\"bad code lengths\", \"Corrupt JPEG\");\n\t\t}\n\t\t// compute largest code + 1 for this size, preshifted as needed later\n\t\th->maxcode[j] = code << (16 - j);\n\t\tcode <<= 1;\n\t}\n\th->maxcode[j] = 0xffffffff;\n\n\t// build non-spec acceleration table; 255 is flag for not-accelerated\n\tmemset(h->fast, 255, 1 << FAST_BITS);\n\tfor (i = 0; i < k; ++i) {\n\t\tint s = h->size[i];\n\t\tif (s <= FAST_BITS) {\n\t\t\tint c = h->code[i] << (FAST_BITS - s);\n\t\t\tint m = 1 << (FAST_BITS - s);\n\t\t\tfor (j = 0; j < m; ++j) {\n\t\t\t\th->fast[c + j] = (stbi_uc)i;\n\t\t\t}\n\t\t}\n\t}\n\treturn 1;\n}\n\n// build a table that decodes both magnitude and value of small ACs in\n// one go.\nstatic void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)\n{\n\tint i;\n\tfor (i = 0; i < (1 << FAST_BITS); ++i) {\n\t\tstbi_uc fast = h->fast[i];\n\t\tfast_ac[i] = 0;\n\t\tif (fast < 255) {\n\t\t\tint rs = h->values[fast];\n\t\t\tint run = (rs >> 4) & 15;\n\t\t\tint magbits = rs & 15;\n\t\t\tint len = h->size[fast];\n\n\t\t\tif (magbits && len + magbits <= FAST_BITS) {\n\t\t\t\t// magnitude code followed by receive_extend code\n\t\t\t\tint k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);\n\t\t\t\tint m = 1 << (magbits - 1);\n\t\t\t\tif (k < m) k += (~0U << magbits) + 1;\n\t\t\t\t// if the result is small enough, we can fit it in fast_ac table\n\t\t\t\tif (k >= -128 && k <= 127)\n\t\t\t\t\tfast_ac[i] = (stbi__int16)((k << 8) + (run << 4) + (len + magbits));\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic void stbi__grow_buffer_unsafe(stbi__jpeg *j)\n{\n\tdo {\n\t\tint b = j->nomore ? 0 : stbi__get8(j->s);\n\t\tif (b == 0xff) {\n\t\t\tint c = stbi__get8(j->s);\n\t\t\twhile (c == 0xff) c = stbi__get8(j->s); // consume fill bytes\n\t\t\tif (c != 0) {\n\t\t\t\tj->marker = (unsigned char)c;\n\t\t\t\tj->nomore = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tj->code_buffer |= b << (24 - j->code_bits);\n\t\tj->code_bits += 8;\n\t} while (j->code_bits <= 24);\n}\n\n// (1 << n) - 1\nstatic stbi__uint32 stbi__bmask[17] = { 0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535 };\n\n// decode a jpeg huffman value from the bitstream\nstbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)\n{\n\tunsigned int temp;\n\tint c, k;\n\n\tif (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\n\t// look at the top FAST_BITS and determine what symbol ID it is,\n\t// if the code is <= FAST_BITS\n\tc = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);\n\tk = h->fast[c];\n\tif (k < 255) {\n\t\tint s = h->size[k];\n\t\tif (s > j->code_bits)\n\t\t\treturn -1;\n\t\tj->code_buffer <<= s;\n\t\tj->code_bits -= s;\n\t\treturn h->values[k];\n\t}\n\n\t// naive test is to shift the code_buffer down so k bits are\n\t// valid, then test against maxcode. To speed this up, we've\n\t// preshifted maxcode left so that it has (16-k) 0s at the\n\t// end; in other words, regardless of the number of bits, it\n\t// wants to be compared against something shifted to have 16;\n\t// that way we don't need to shift inside the loop.\n\ttemp = j->code_buffer >> 16;\n\tfor (k = FAST_BITS + 1; ; ++k)\n\t\tif (temp < h->maxcode[k])\n\t\t\tbreak;\n\tif (k == 17) {\n\t\t// error! code not found\n\t\tj->code_bits -= 16;\n\t\treturn -1;\n\t}\n\n\tif (k > j->code_bits)\n\t\treturn -1;\n\n\t// convert the huffman code to the symbol id\n\tc = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];\n\tSTBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);\n\n\t// convert the id to a symbol\n\tj->code_bits -= k;\n\tj->code_buffer <<= k;\n\treturn h->values[c];\n}\n\n// bias[n] = (-1<<n) + 1\nstatic int const stbi__jbias[16] = { 0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767 };\n\n// combined JPEG 'receive' and JPEG 'extend', since baseline\n// always extends everything it receives.\nstbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)\n{\n\tunsigned int k;\n\tint sgn;\n\tif (j->code_bits < n) stbi__grow_buffer_unsafe(j);\n\n\tsgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB\n\tk = stbi_lrot(j->code_buffer, n);\n\tSTBI_ASSERT(n >= 0 && n < (int)(sizeof(stbi__bmask) / sizeof(*stbi__bmask)));\n\tj->code_buffer = k & ~stbi__bmask[n];\n\tk &= stbi__bmask[n];\n\tj->code_bits -= n;\n\treturn k + (stbi__jbias[n] & ~sgn);\n}\n\n// get some unsigned bits\nstbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)\n{\n\tunsigned int k;\n\tif (j->code_bits < n) stbi__grow_buffer_unsafe(j);\n\tk = stbi_lrot(j->code_buffer, n);\n\tj->code_buffer = k & ~stbi__bmask[n];\n\tk &= stbi__bmask[n];\n\tj->code_bits -= n;\n\treturn k;\n}\n\nstbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)\n{\n\tunsigned int k;\n\tif (j->code_bits < 1) stbi__grow_buffer_unsafe(j);\n\tk = j->code_buffer;\n\tj->code_buffer <<= 1;\n\t--j->code_bits;\n\treturn k & 0x80000000;\n}\n\n// given a value that's at position X in the zigzag stream,\n// where does it appear in the 8x8 matrix coded as row-major?\nstatic stbi_uc stbi__jpeg_dezigzag[64 + 15] =\n{\n\t0,  1,  8, 16,  9,  2,  3, 10,\n\t17, 24, 32, 25, 18, 11,  4,  5,\n\t12, 19, 26, 33, 40, 48, 41, 34,\n\t27, 20, 13,  6,  7, 14, 21, 28,\n\t35, 42, 49, 56, 57, 50, 43, 36,\n\t29, 22, 15, 23, 30, 37, 44, 51,\n\t58, 59, 52, 45, 38, 31, 39, 46,\n\t53, 60, 61, 54, 47, 55, 62, 63,\n\t// let corrupt input sample past end\n\t63, 63, 63, 63, 63, 63, 63, 63,\n\t63, 63, 63, 63, 63, 63, 63\n};\n\n// decode one 64-entry block--\nstatic int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant)\n{\n\tint diff, dc, k;\n\tint t;\n\n\tif (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\tt = stbi__jpeg_huff_decode(j, hdc);\n\tif (t < 0) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\n\n\t// 0 all the ac values now so we can do it 32-bits at a time\n\tmemset(data, 0, 64 * sizeof(data[0]));\n\n\tdiff = t ? stbi__extend_receive(j, t) : 0;\n\tdc = j->img_comp[b].dc_pred + diff;\n\tj->img_comp[b].dc_pred = dc;\n\tdata[0] = (short)(dc * dequant[0]);\n\n\t// decode AC components, see JPEG spec\n\tk = 1;\n\tdo {\n\t\tunsigned int zig;\n\t\tint c, r, s;\n\t\tif (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\t\tc = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);\n\t\tr = fac[c];\n\t\tif (r) { // fast-AC path\n\t\t\tk += (r >> 4) & 15; // run\n\t\t\ts = r & 15; // combined length\n\t\t\tj->code_buffer <<= s;\n\t\t\tj->code_bits -= s;\n\t\t\t// decode into unzigzag'd location\n\t\t\tzig = stbi__jpeg_dezigzag[k++];\n\t\t\tdata[zig] = (short)((r >> 8) * dequant[zig]);\n\t\t}\n\t\telse {\n\t\t\tint rs = stbi__jpeg_huff_decode(j, hac);\n\t\t\tif (rs < 0) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\n\t\t\ts = rs & 15;\n\t\t\tr = rs >> 4;\n\t\t\tif (s == 0) {\n\t\t\t\tif (rs != 0xf0) break; // end block\n\t\t\t\tk += 16;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tk += r;\n\t\t\t\t// decode into unzigzag'd location\n\t\t\t\tzig = stbi__jpeg_dezigzag[k++];\n\t\t\t\tdata[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]);\n\t\t\t}\n\t\t}\n\t} while (k < 64);\n\treturn 1;\n}\n\nstatic int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)\n{\n\tint diff, dc;\n\tint t;\n\tif (j->spec_end != 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n\n\tif (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\n\tif (j->succ_high == 0) {\n\t\t// first scan for DC coefficient, must be first\n\t\tmemset(data, 0, 64 * sizeof(data[0])); // 0 all the ac values now\n\t\tt = stbi__jpeg_huff_decode(j, hdc);\n\t\tdiff = t ? stbi__extend_receive(j, t) : 0;\n\n\t\tdc = j->img_comp[b].dc_pred + diff;\n\t\tj->img_comp[b].dc_pred = dc;\n\t\tdata[0] = (short)(dc << j->succ_low);\n\t}\n\telse {\n\t\t// refinement scan for DC coefficient\n\t\tif (stbi__jpeg_get_bit(j))\n\t\t\tdata[0] += (short)(1 << j->succ_low);\n\t}\n\treturn 1;\n}\n\n// @OPTIMIZE: store non-zigzagged during the decode passes,\n// and only de-zigzag when dequantizing\nstatic int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)\n{\n\tint k;\n\tif (j->spec_start == 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n\n\tif (j->succ_high == 0) {\n\t\tint shift = j->succ_low;\n\n\t\tif (j->eob_run) {\n\t\t\t--j->eob_run;\n\t\t\treturn 1;\n\t\t}\n\n\t\tk = j->spec_start;\n\t\tdo {\n\t\t\tunsigned int zig;\n\t\t\tint c, r, s;\n\t\t\tif (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\t\t\tc = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);\n\t\t\tr = fac[c];\n\t\t\tif (r) { // fast-AC path\n\t\t\t\tk += (r >> 4) & 15; // run\n\t\t\t\ts = r & 15; // combined length\n\t\t\t\tj->code_buffer <<= s;\n\t\t\t\tj->code_bits -= s;\n\t\t\t\tzig = stbi__jpeg_dezigzag[k++];\n\t\t\t\tdata[zig] = (short)((r >> 8) << shift);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tint rs = stbi__jpeg_huff_decode(j, hac);\n\t\t\t\tif (rs < 0) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\n\t\t\t\ts = rs & 15;\n\t\t\t\tr = rs >> 4;\n\t\t\t\tif (s == 0) {\n\t\t\t\t\tif (r < 15) {\n\t\t\t\t\t\tj->eob_run = (1 << r);\n\t\t\t\t\t\tif (r)\n\t\t\t\t\t\t\tj->eob_run += stbi__jpeg_get_bits(j, r);\n\t\t\t\t\t\t--j->eob_run;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tk += 16;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tk += r;\n\t\t\t\t\tzig = stbi__jpeg_dezigzag[k++];\n\t\t\t\t\tdata[zig] = (short)(stbi__extend_receive(j, s) << shift);\n\t\t\t\t}\n\t\t\t}\n\t\t} while (k <= j->spec_end);\n\t}\n\telse {\n\t\t// refinement scan for these AC coefficients\n\n\t\tshort bit = (short)(1 << j->succ_low);\n\n\t\tif (j->eob_run) {\n\t\t\t--j->eob_run;\n\t\t\tfor (k = j->spec_start; k <= j->spec_end; ++k) {\n\t\t\t\tshort *p = &data[stbi__jpeg_dezigzag[k]];\n\t\t\t\tif (*p != 0)\n\t\t\t\t\tif (stbi__jpeg_get_bit(j))\n\t\t\t\t\t\tif ((*p & bit) == 0) {\n\t\t\t\t\t\t\tif (*p > 0)\n\t\t\t\t\t\t\t\t*p += bit;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t*p -= bit;\n\t\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tk = j->spec_start;\n\t\t\tdo {\n\t\t\t\tint r, s;\n\t\t\t\tint rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh\n\t\t\t\tif (rs < 0) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\n\t\t\t\ts = rs & 15;\n\t\t\t\tr = rs >> 4;\n\t\t\t\tif (s == 0) {\n\t\t\t\t\tif (r < 15) {\n\t\t\t\t\t\tj->eob_run = (1 << r) - 1;\n\t\t\t\t\t\tif (r)\n\t\t\t\t\t\t\tj->eob_run += stbi__jpeg_get_bits(j, r);\n\t\t\t\t\t\tr = 64; // force end of block\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// r=15 s=0 should write 16 0s, so we just do\n\t\t\t\t\t\t// a run of 15 0s and then write s (which is 0),\n\t\t\t\t\t\t// so we don't have to do anything special here\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (s != 1) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\n\t\t\t\t\t// sign bit\n\t\t\t\t\tif (stbi__jpeg_get_bit(j))\n\t\t\t\t\t\ts = bit;\n\t\t\t\t\telse\n\t\t\t\t\t\ts = -bit;\n\t\t\t\t}\n\n\t\t\t\t// advance by r\n\t\t\t\twhile (k <= j->spec_end) {\n\t\t\t\t\tshort *p = &data[stbi__jpeg_dezigzag[k++]];\n\t\t\t\t\tif (*p != 0) {\n\t\t\t\t\t\tif (stbi__jpeg_get_bit(j))\n\t\t\t\t\t\t\tif ((*p & bit) == 0) {\n\t\t\t\t\t\t\t\tif (*p > 0)\n\t\t\t\t\t\t\t\t\t*p += bit;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t*p -= bit;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (r == 0) {\n\t\t\t\t\t\t\t*p = (short)s;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t--r;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (k <= j->spec_end);\n\t\t}\n\t}\n\treturn 1;\n}\n\n// take a -128..127 value and stbi__clamp it and convert to 0..255\nstbi_inline static stbi_uc stbi__clamp(int x)\n{\n\t// trick to use a single test to catch both cases\n\tif ((unsigned int)x > 255) {\n\t\tif (x < 0) return 0;\n\t\tif (x > 255) return 255;\n\t}\n\treturn (stbi_uc)x;\n}\n\n#define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5)))\n#define stbi__fsh(x)  ((x) << 12)\n\n// derived from jidctint -- DCT_ISLOW\n#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \\\n   int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \\\n   p2 = s2;                                    \\\n   p3 = s6;                                    \\\n   p1 = (p2+p3) * stbi__f2f(0.5411961f);       \\\n   t2 = p1 + p3*stbi__f2f(-1.847759065f);      \\\n   t3 = p1 + p2*stbi__f2f( 0.765366865f);      \\\n   p2 = s0;                                    \\\n   p3 = s4;                                    \\\n   t0 = stbi__fsh(p2+p3);                      \\\n   t1 = stbi__fsh(p2-p3);                      \\\n   x0 = t0+t3;                                 \\\n   x3 = t0-t3;                                 \\\n   x1 = t1+t2;                                 \\\n   x2 = t1-t2;                                 \\\n   t0 = s7;                                    \\\n   t1 = s5;                                    \\\n   t2 = s3;                                    \\\n   t3 = s1;                                    \\\n   p3 = t0+t2;                                 \\\n   p4 = t1+t3;                                 \\\n   p1 = t0+t3;                                 \\\n   p2 = t1+t2;                                 \\\n   p5 = (p3+p4)*stbi__f2f( 1.175875602f);      \\\n   t0 = t0*stbi__f2f( 0.298631336f);           \\\n   t1 = t1*stbi__f2f( 2.053119869f);           \\\n   t2 = t2*stbi__f2f( 3.072711026f);           \\\n   t3 = t3*stbi__f2f( 1.501321110f);           \\\n   p1 = p5 + p1*stbi__f2f(-0.899976223f);      \\\n   p2 = p5 + p2*stbi__f2f(-2.562915447f);      \\\n   p3 = p3*stbi__f2f(-1.961570560f);           \\\n   p4 = p4*stbi__f2f(-0.390180644f);           \\\n   t3 += p1+p4;                                \\\n   t2 += p2+p3;                                \\\n   t1 += p2+p4;                                \\\n   t0 += p1+p3;\n\nstatic void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])\n{\n\tint i, val[64], *v = val;\n\tstbi_uc *o;\n\tshort *d = data;\n\n\t// columns\n\tfor (i = 0; i < 8; ++i, ++d, ++v) {\n\t\t// if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing\n\t\tif (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0\n\t\t\t&& d[40] == 0 && d[48] == 0 && d[56] == 0) {\n\t\t\t//    no shortcut                 0     seconds\n\t\t\t//    (1|2|3|4|5|6|7)==0          0     seconds\n\t\t\t//    all separate               -0.047 seconds\n\t\t\t//    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds\n\t\t\tint dcterm = d[0] << 2;\n\t\t\tv[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;\n\t\t}\n\t\telse {\n\t\t\tSTBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56])\n\t\t\t\t// constants scaled things up by 1<<12; let's bring them back\n\t\t\t\t// down, but keep 2 extra bits of precision\n\t\t\t\tx0 += 512; x1 += 512; x2 += 512; x3 += 512;\n\t\t\tv[0] = (x0 + t3) >> 10;\n\t\t\tv[56] = (x0 - t3) >> 10;\n\t\t\tv[8] = (x1 + t2) >> 10;\n\t\t\tv[48] = (x1 - t2) >> 10;\n\t\t\tv[16] = (x2 + t1) >> 10;\n\t\t\tv[40] = (x2 - t1) >> 10;\n\t\t\tv[24] = (x3 + t0) >> 10;\n\t\t\tv[32] = (x3 - t0) >> 10;\n\t\t}\n\t}\n\n\tfor (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) {\n\t\t// no fast case since the first 1D IDCT spread components out\n\t\tSTBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])\n\t\t\t// constants scaled things up by 1<<12, plus we had 1<<2 from first\n\t\t\t// loop, plus horizontal and vertical each scale by sqrt(8) so together\n\t\t\t// we've got an extra 1<<3, so 1<<17 total we need to remove.\n\t\t\t// so we want to round that, which means adding 0.5 * 1<<17,\n\t\t\t// aka 65536. Also, we'll end up with -128 to 127 that we want\n\t\t\t// to encode as 0..255 by adding 128, so we'll add that before the shift\n\t\t\tx0 += 65536 + (128 << 17);\n\t\tx1 += 65536 + (128 << 17);\n\t\tx2 += 65536 + (128 << 17);\n\t\tx3 += 65536 + (128 << 17);\n\t\t// tried computing the shifts into temps, or'ing the temps to see\n\t\t// if any were out of range, but that was slower\n\t\to[0] = stbi__clamp((x0 + t3) >> 17);\n\t\to[7] = stbi__clamp((x0 - t3) >> 17);\n\t\to[1] = stbi__clamp((x1 + t2) >> 17);\n\t\to[6] = stbi__clamp((x1 - t2) >> 17);\n\t\to[2] = stbi__clamp((x2 + t1) >> 17);\n\t\to[5] = stbi__clamp((x2 - t1) >> 17);\n\t\to[3] = stbi__clamp((x3 + t0) >> 17);\n\t\to[4] = stbi__clamp((x3 - t0) >> 17);\n\t}\n}\n\n#ifdef STBI_SSE2\n// sse2 integer IDCT. not the fastest possible implementation but it\n// produces bit-identical results to the generic C version so it's\n// fully \"transparent\".\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\n{\n\t// This is constructed to match our regular (generic) integer IDCT exactly.\n\t__m128i row0, row1, row2, row3, row4, row5, row6, row7;\n\t__m128i tmp;\n\n\t// dot product constant: even elems=x, odd elems=y\n#define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))\n\n\t// out(0) = c0[even]*x + c0[odd]*y   (c0, x, y 16-bit, out 32-bit)\n\t// out(1) = c1[even]*x + c1[odd]*y\n#define dct_rot(out0,out1, x,y,c0,c1) \\\n      __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \\\n      __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \\\n      __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \\\n      __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \\\n      __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \\\n      __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)\n\n\t// out = in << 12  (in 16-bit, out 32-bit)\n#define dct_widen(out, in) \\\n      __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \\\n      __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)\n\n\t// wide add\n#define dct_wadd(out, a, b) \\\n      __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \\\n      __m128i out##_h = _mm_add_epi32(a##_h, b##_h)\n\n\t// wide sub\n#define dct_wsub(out, a, b) \\\n      __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \\\n      __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)\n\n\t// butterfly a/b, add bias, then shift by \"s\" and pack\n#define dct_bfly32o(out0, out1, a,b,bias,s) \\\n      { \\\n         __m128i abiased_l = _mm_add_epi32(a##_l, bias); \\\n         __m128i abiased_h = _mm_add_epi32(a##_h, bias); \\\n         dct_wadd(sum, abiased, b); \\\n         dct_wsub(dif, abiased, b); \\\n         out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \\\n         out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \\\n      }\n\n\t// 8-bit interleave step (for transposes)\n#define dct_interleave8(a, b) \\\n      tmp = a; \\\n      a = _mm_unpacklo_epi8(a, b); \\\n      b = _mm_unpackhi_epi8(tmp, b)\n\n\t// 16-bit interleave step (for transposes)\n#define dct_interleave16(a, b) \\\n      tmp = a; \\\n      a = _mm_unpacklo_epi16(a, b); \\\n      b = _mm_unpackhi_epi16(tmp, b)\n\n#define dct_pass(bias,shift) \\\n      { \\\n         /* even part */ \\\n         dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \\\n         __m128i sum04 = _mm_add_epi16(row0, row4); \\\n         __m128i dif04 = _mm_sub_epi16(row0, row4); \\\n         dct_widen(t0e, sum04); \\\n         dct_widen(t1e, dif04); \\\n         dct_wadd(x0, t0e, t3e); \\\n         dct_wsub(x3, t0e, t3e); \\\n         dct_wadd(x1, t1e, t2e); \\\n         dct_wsub(x2, t1e, t2e); \\\n         /* odd part */ \\\n         dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \\\n         dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \\\n         __m128i sum17 = _mm_add_epi16(row1, row7); \\\n         __m128i sum35 = _mm_add_epi16(row3, row5); \\\n         dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \\\n         dct_wadd(x4, y0o, y4o); \\\n         dct_wadd(x5, y1o, y5o); \\\n         dct_wadd(x6, y2o, y5o); \\\n         dct_wadd(x7, y3o, y4o); \\\n         dct_bfly32o(row0,row7, x0,x7,bias,shift); \\\n         dct_bfly32o(row1,row6, x1,x6,bias,shift); \\\n         dct_bfly32o(row2,row5, x2,x5,bias,shift); \\\n         dct_bfly32o(row3,row4, x3,x4,bias,shift); \\\n      }\n\n\t__m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));\n\t__m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f));\n\t__m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));\n\t__m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));\n\t__m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f));\n\t__m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f));\n\t__m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f));\n\t__m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f));\n\n\t// rounding biases in column/row passes, see stbi__idct_block for explanation.\n\t__m128i bias_0 = _mm_set1_epi32(512);\n\t__m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17));\n\n\t// load\n\trow0 = _mm_load_si128((const __m128i *) (data + 0 * 8));\n\trow1 = _mm_load_si128((const __m128i *) (data + 1 * 8));\n\trow2 = _mm_load_si128((const __m128i *) (data + 2 * 8));\n\trow3 = _mm_load_si128((const __m128i *) (data + 3 * 8));\n\trow4 = _mm_load_si128((const __m128i *) (data + 4 * 8));\n\trow5 = _mm_load_si128((const __m128i *) (data + 5 * 8));\n\trow6 = _mm_load_si128((const __m128i *) (data + 6 * 8));\n\trow7 = _mm_load_si128((const __m128i *) (data + 7 * 8));\n\n\t// column pass\n\tdct_pass(bias_0, 10);\n\n\t{\n\t\t// 16bit 8x8 transpose pass 1\n\t\tdct_interleave16(row0, row4);\n\t\tdct_interleave16(row1, row5);\n\t\tdct_interleave16(row2, row6);\n\t\tdct_interleave16(row3, row7);\n\n\t\t// transpose pass 2\n\t\tdct_interleave16(row0, row2);\n\t\tdct_interleave16(row1, row3);\n\t\tdct_interleave16(row4, row6);\n\t\tdct_interleave16(row5, row7);\n\n\t\t// transpose pass 3\n\t\tdct_interleave16(row0, row1);\n\t\tdct_interleave16(row2, row3);\n\t\tdct_interleave16(row4, row5);\n\t\tdct_interleave16(row6, row7);\n\t}\n\n\t// row pass\n\tdct_pass(bias_1, 17);\n\n\t{\n\t\t// pack\n\t\t__m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7\n\t\t__m128i p1 = _mm_packus_epi16(row2, row3);\n\t\t__m128i p2 = _mm_packus_epi16(row4, row5);\n\t\t__m128i p3 = _mm_packus_epi16(row6, row7);\n\n\t\t// 8bit 8x8 transpose pass 1\n\t\tdct_interleave8(p0, p2); // a0e0a1e1...\n\t\tdct_interleave8(p1, p3); // c0g0c1g1...\n\n\t\t\t\t\t\t\t\t // transpose pass 2\n\t\tdct_interleave8(p0, p1); // a0c0e0g0...\n\t\tdct_interleave8(p2, p3); // b0d0f0h0...\n\n\t\t\t\t\t\t\t\t // transpose pass 3\n\t\tdct_interleave8(p0, p2); // a0b0c0d0...\n\t\tdct_interleave8(p1, p3); // a4b4c4d4...\n\n\t\t\t\t\t\t\t\t // store\n\t\t_mm_storel_epi64((__m128i *) out, p0); out += out_stride;\n\t\t_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;\n\t\t_mm_storel_epi64((__m128i *) out, p2); out += out_stride;\n\t\t_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;\n\t\t_mm_storel_epi64((__m128i *) out, p1); out += out_stride;\n\t\t_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;\n\t\t_mm_storel_epi64((__m128i *) out, p3); out += out_stride;\n\t\t_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));\n\t}\n\n#undef dct_const\n#undef dct_rot\n#undef dct_widen\n#undef dct_wadd\n#undef dct_wsub\n#undef dct_bfly32o\n#undef dct_interleave8\n#undef dct_interleave16\n#undef dct_pass\n}\n\n#endif // STBI_SSE2\n\n#ifdef STBI_NEON\n\n// NEON integer IDCT. should produce bit-identical\n// results to the generic C version.\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\n{\n\tint16x8_t row0, row1, row2, row3, row4, row5, row6, row7;\n\n\tint16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));\n\tint16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));\n\tint16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f));\n\tint16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f));\n\tint16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));\n\tint16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));\n\tint16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));\n\tint16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));\n\tint16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f));\n\tint16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f));\n\tint16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f));\n\tint16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f));\n\n#define dct_long_mul(out, inq, coeff) \\\n   int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \\\n   int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)\n\n#define dct_long_mac(out, acc, inq, coeff) \\\n   int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \\\n   int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)\n\n#define dct_widen(out, inq) \\\n   int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \\\n   int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)\n\n\t// wide add\n#define dct_wadd(out, a, b) \\\n   int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \\\n   int32x4_t out##_h = vaddq_s32(a##_h, b##_h)\n\n\t// wide sub\n#define dct_wsub(out, a, b) \\\n   int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \\\n   int32x4_t out##_h = vsubq_s32(a##_h, b##_h)\n\n\t// butterfly a/b, then shift using \"shiftop\" by \"s\" and pack\n#define dct_bfly32o(out0,out1, a,b,shiftop,s) \\\n   { \\\n      dct_wadd(sum, a, b); \\\n      dct_wsub(dif, a, b); \\\n      out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \\\n      out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \\\n   }\n\n#define dct_pass(shiftop, shift) \\\n   { \\\n      /* even part */ \\\n      int16x8_t sum26 = vaddq_s16(row2, row6); \\\n      dct_long_mul(p1e, sum26, rot0_0); \\\n      dct_long_mac(t2e, p1e, row6, rot0_1); \\\n      dct_long_mac(t3e, p1e, row2, rot0_2); \\\n      int16x8_t sum04 = vaddq_s16(row0, row4); \\\n      int16x8_t dif04 = vsubq_s16(row0, row4); \\\n      dct_widen(t0e, sum04); \\\n      dct_widen(t1e, dif04); \\\n      dct_wadd(x0, t0e, t3e); \\\n      dct_wsub(x3, t0e, t3e); \\\n      dct_wadd(x1, t1e, t2e); \\\n      dct_wsub(x2, t1e, t2e); \\\n      /* odd part */ \\\n      int16x8_t sum15 = vaddq_s16(row1, row5); \\\n      int16x8_t sum17 = vaddq_s16(row1, row7); \\\n      int16x8_t sum35 = vaddq_s16(row3, row5); \\\n      int16x8_t sum37 = vaddq_s16(row3, row7); \\\n      int16x8_t sumodd = vaddq_s16(sum17, sum35); \\\n      dct_long_mul(p5o, sumodd, rot1_0); \\\n      dct_long_mac(p1o, p5o, sum17, rot1_1); \\\n      dct_long_mac(p2o, p5o, sum35, rot1_2); \\\n      dct_long_mul(p3o, sum37, rot2_0); \\\n      dct_long_mul(p4o, sum15, rot2_1); \\\n      dct_wadd(sump13o, p1o, p3o); \\\n      dct_wadd(sump24o, p2o, p4o); \\\n      dct_wadd(sump23o, p2o, p3o); \\\n      dct_wadd(sump14o, p1o, p4o); \\\n      dct_long_mac(x4, sump13o, row7, rot3_0); \\\n      dct_long_mac(x5, sump24o, row5, rot3_1); \\\n      dct_long_mac(x6, sump23o, row3, rot3_2); \\\n      dct_long_mac(x7, sump14o, row1, rot3_3); \\\n      dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \\\n      dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \\\n      dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \\\n      dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \\\n   }\n\n\t// load\n\trow0 = vld1q_s16(data + 0 * 8);\n\trow1 = vld1q_s16(data + 1 * 8);\n\trow2 = vld1q_s16(data + 2 * 8);\n\trow3 = vld1q_s16(data + 3 * 8);\n\trow4 = vld1q_s16(data + 4 * 8);\n\trow5 = vld1q_s16(data + 5 * 8);\n\trow6 = vld1q_s16(data + 6 * 8);\n\trow7 = vld1q_s16(data + 7 * 8);\n\n\t// add DC bias\n\trow0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));\n\n\t// column pass\n\tdct_pass(vrshrn_n_s32, 10);\n\n\t// 16bit 8x8 transpose\n\t{\n\t\t// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.\n\t\t// whether compilers actually get this is another story, sadly.\n#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }\n#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }\n#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }\n\n\t\t// pass 1\n\t\tdct_trn16(row0, row1); // a0b0a2b2a4b4a6b6\n\t\tdct_trn16(row2, row3);\n\t\tdct_trn16(row4, row5);\n\t\tdct_trn16(row6, row7);\n\n\t\t// pass 2\n\t\tdct_trn32(row0, row2); // a0b0c0d0a4b4c4d4\n\t\tdct_trn32(row1, row3);\n\t\tdct_trn32(row4, row6);\n\t\tdct_trn32(row5, row7);\n\n\t\t// pass 3\n\t\tdct_trn64(row0, row4); // a0b0c0d0e0f0g0h0\n\t\tdct_trn64(row1, row5);\n\t\tdct_trn64(row2, row6);\n\t\tdct_trn64(row3, row7);\n\n#undef dct_trn16\n#undef dct_trn32\n#undef dct_trn64\n\t}\n\n\t// row pass\n\t// vrshrn_n_s32 only supports shifts up to 16, we need\n\t// 17. so do a non-rounding shift of 16 first then follow\n\t// up with a rounding shift by 1.\n\tdct_pass(vshrn_n_s32, 16);\n\n\t{\n\t\t// pack and round\n\t\tuint8x8_t p0 = vqrshrun_n_s16(row0, 1);\n\t\tuint8x8_t p1 = vqrshrun_n_s16(row1, 1);\n\t\tuint8x8_t p2 = vqrshrun_n_s16(row2, 1);\n\t\tuint8x8_t p3 = vqrshrun_n_s16(row3, 1);\n\t\tuint8x8_t p4 = vqrshrun_n_s16(row4, 1);\n\t\tuint8x8_t p5 = vqrshrun_n_s16(row5, 1);\n\t\tuint8x8_t p6 = vqrshrun_n_s16(row6, 1);\n\t\tuint8x8_t p7 = vqrshrun_n_s16(row7, 1);\n\n\t\t// again, these can translate into one instruction, but often don't.\n#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }\n#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }\n#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }\n\n\t\t// sadly can't use interleaved stores here since we only write\n\t\t// 8 bytes to each scan line!\n\n\t\t// 8x8 8-bit transpose pass 1\n\t\tdct_trn8_8(p0, p1);\n\t\tdct_trn8_8(p2, p3);\n\t\tdct_trn8_8(p4, p5);\n\t\tdct_trn8_8(p6, p7);\n\n\t\t// pass 2\n\t\tdct_trn8_16(p0, p2);\n\t\tdct_trn8_16(p1, p3);\n\t\tdct_trn8_16(p4, p6);\n\t\tdct_trn8_16(p5, p7);\n\n\t\t// pass 3\n\t\tdct_trn8_32(p0, p4);\n\t\tdct_trn8_32(p1, p5);\n\t\tdct_trn8_32(p2, p6);\n\t\tdct_trn8_32(p3, p7);\n\n\t\t// store\n\t\tvst1_u8(out, p0); out += out_stride;\n\t\tvst1_u8(out, p1); out += out_stride;\n\t\tvst1_u8(out, p2); out += out_stride;\n\t\tvst1_u8(out, p3); out += out_stride;\n\t\tvst1_u8(out, p4); out += out_stride;\n\t\tvst1_u8(out, p5); out += out_stride;\n\t\tvst1_u8(out, p6); out += out_stride;\n\t\tvst1_u8(out, p7);\n\n#undef dct_trn8_8\n#undef dct_trn8_16\n#undef dct_trn8_32\n\t}\n\n#undef dct_long_mul\n#undef dct_long_mac\n#undef dct_widen\n#undef dct_wadd\n#undef dct_wsub\n#undef dct_bfly32o\n#undef dct_pass\n}\n\n#endif // STBI_NEON\n\n#define STBI__MARKER_none  0xff\n// if there's a pending marker from the entropy stream, return that\n// otherwise, fetch from the stream and get a marker. if there's no\n// marker, return 0xff, which is never a valid marker value\nstatic stbi_uc stbi__get_marker(stbi__jpeg *j)\n{\n\tstbi_uc x;\n\tif (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }\n\tx = stbi__get8(j->s);\n\tif (x != 0xff) return STBI__MARKER_none;\n\twhile (x == 0xff)\n\t\tx = stbi__get8(j->s); // consume repeated 0xff fill bytes\n\treturn x;\n}\n\n// in each scan, we'll have scan_n components, and the order\n// of the components is specified by order[]\n#define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)\n\n// after a restart interval, stbi__jpeg_reset the entropy decoder and\n// the dc prediction\nstatic void stbi__jpeg_reset(stbi__jpeg *j)\n{\n\tj->code_bits = 0;\n\tj->code_buffer = 0;\n\tj->nomore = 0;\n\tj->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;\n\tj->marker = STBI__MARKER_none;\n\tj->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;\n\tj->eob_run = 0;\n\t// no more than 1<<31 MCUs if no restart_interal? that's plenty safe,\n\t// since we don't even allow 1<<30 pixels\n}\n\nstatic int stbi__parse_entropy_coded_data(stbi__jpeg *z)\n{\n\tstbi__jpeg_reset(z);\n\tif (!z->progressive) {\n\t\tif (z->scan_n == 1) {\n\t\t\tint i, j;\n\t\t\tSTBI_SIMD_ALIGN(short, data[64]);\n\t\t\tint n = z->order[0];\n\t\t\t// non-interleaved data, we just need to process one block at a time,\n\t\t\t// in trivial scanline order\n\t\t\t// number of blocks to do just depends on how many actual \"pixels\" this\n\t\t\t// component has, independent of interleaved MCU blocking and such\n\t\t\tint w = (z->img_comp[n].x + 7) >> 3;\n\t\t\tint h = (z->img_comp[n].y + 7) >> 3;\n\t\t\tfor (j = 0; j < h; ++j) {\n\t\t\t\tfor (i = 0; i < w; ++i) {\n\t\t\t\t\tint ha = z->img_comp[n].ha;\n\t\t\t\t\tif (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\n\t\t\t\t\tz->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*j * 8 + i * 8, z->img_comp[n].w2, data);\n\t\t\t\t\t// every data block is an MCU, so countdown the restart interval\n\t\t\t\t\tif (--z->todo <= 0) {\n\t\t\t\t\t\tif (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n\t\t\t\t\t\t// if it's NOT a restart, then just bail, so we get corrupt data\n\t\t\t\t\t\t// rather than no data\n\t\t\t\t\t\tif (!STBI__RESTART(z->marker)) return 1;\n\t\t\t\t\t\tstbi__jpeg_reset(z);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 1;\n\t\t}\n\t\telse { // interleaved\n\t\t\tint i, j, k, x, y;\n\t\t\tSTBI_SIMD_ALIGN(short, data[64]);\n\t\t\tfor (j = 0; j < z->img_mcu_y; ++j) {\n\t\t\t\tfor (i = 0; i < z->img_mcu_x; ++i) {\n\t\t\t\t\t// scan an interleaved mcu... process scan_n components in order\n\t\t\t\t\tfor (k = 0; k < z->scan_n; ++k) {\n\t\t\t\t\t\tint n = z->order[k];\n\t\t\t\t\t\t// scan out an mcu's worth of this component; that's just determined\n\t\t\t\t\t\t// by the basic H and V specified for the component\n\t\t\t\t\t\tfor (y = 0; y < z->img_comp[n].v; ++y) {\n\t\t\t\t\t\t\tfor (x = 0; x < z->img_comp[n].h; ++x) {\n\t\t\t\t\t\t\t\tint x2 = (i*z->img_comp[n].h + x) * 8;\n\t\t\t\t\t\t\t\tint y2 = (j*z->img_comp[n].v + y) * 8;\n\t\t\t\t\t\t\t\tint ha = z->img_comp[n].ha;\n\t\t\t\t\t\t\t\tif (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\n\t\t\t\t\t\t\t\tz->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*y2 + x2, z->img_comp[n].w2, data);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// after all interleaved components, that's an interleaved MCU,\n\t\t\t\t\t// so now count down the restart interval\n\t\t\t\t\tif (--z->todo <= 0) {\n\t\t\t\t\t\tif (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n\t\t\t\t\t\tif (!STBI__RESTART(z->marker)) return 1;\n\t\t\t\t\t\tstbi__jpeg_reset(z);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse {\n\t\tif (z->scan_n == 1) {\n\t\t\tint i, j;\n\t\t\tint n = z->order[0];\n\t\t\t// non-interleaved data, we just need to process one block at a time,\n\t\t\t// in trivial scanline order\n\t\t\t// number of blocks to do just depends on how many actual \"pixels\" this\n\t\t\t// component has, independent of interleaved MCU blocking and such\n\t\t\tint w = (z->img_comp[n].x + 7) >> 3;\n\t\t\tint h = (z->img_comp[n].y + 7) >> 3;\n\t\t\tfor (j = 0; j < h; ++j) {\n\t\t\t\tfor (i = 0; i < w; ++i) {\n\t\t\t\t\tshort *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\n\t\t\t\t\tif (z->spec_start == 0) {\n\t\t\t\t\t\tif (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tint ha = z->img_comp[n].ha;\n\t\t\t\t\t\tif (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\t// every data block is an MCU, so countdown the restart interval\n\t\t\t\t\tif (--z->todo <= 0) {\n\t\t\t\t\t\tif (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n\t\t\t\t\t\tif (!STBI__RESTART(z->marker)) return 1;\n\t\t\t\t\t\tstbi__jpeg_reset(z);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 1;\n\t\t}\n\t\telse { // interleaved\n\t\t\tint i, j, k, x, y;\n\t\t\tfor (j = 0; j < z->img_mcu_y; ++j) {\n\t\t\t\tfor (i = 0; i < z->img_mcu_x; ++i) {\n\t\t\t\t\t// scan an interleaved mcu... process scan_n components in order\n\t\t\t\t\tfor (k = 0; k < z->scan_n; ++k) {\n\t\t\t\t\t\tint n = z->order[k];\n\t\t\t\t\t\t// scan out an mcu's worth of this component; that's just determined\n\t\t\t\t\t\t// by the basic H and V specified for the component\n\t\t\t\t\t\tfor (y = 0; y < z->img_comp[n].v; ++y) {\n\t\t\t\t\t\t\tfor (x = 0; x < z->img_comp[n].h; ++x) {\n\t\t\t\t\t\t\t\tint x2 = (i*z->img_comp[n].h + x);\n\t\t\t\t\t\t\t\tint y2 = (j*z->img_comp[n].v + y);\n\t\t\t\t\t\t\t\tshort *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);\n\t\t\t\t\t\t\t\tif (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\n\t\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// after all interleaved components, that's an interleaved MCU,\n\t\t\t\t\t// so now count down the restart interval\n\t\t\t\t\tif (--z->todo <= 0) {\n\t\t\t\t\t\tif (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n\t\t\t\t\t\tif (!STBI__RESTART(z->marker)) return 1;\n\t\t\t\t\t\tstbi__jpeg_reset(z);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 1;\n\t\t}\n\t}\n}\n\nstatic void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)\n{\n\tint i;\n\tfor (i = 0; i < 64; ++i)\n\t\tdata[i] *= dequant[i];\n}\n\nstatic void stbi__jpeg_finish(stbi__jpeg *z)\n{\n\tif (z->progressive) {\n\t\t// dequantize and idct the data\n\t\tint i, j, n;\n\t\tfor (n = 0; n < z->s->img_n; ++n) {\n\t\t\tint w = (z->img_comp[n].x + 7) >> 3;\n\t\t\tint h = (z->img_comp[n].y + 7) >> 3;\n\t\t\tfor (j = 0; j < h; ++j) {\n\t\t\t\tfor (i = 0; i < w; ++i) {\n\t\t\t\t\tshort *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\n\t\t\t\t\tstbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);\n\t\t\t\t\tz->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*j * 8 + i * 8, z->img_comp[n].w2, data);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic int stbi__process_marker(stbi__jpeg *z, int m)\n{\n\tint L;\n\tswitch (m) {\n\tcase STBI__MARKER_none: // no marker found\n\t\treturn stbi__err(\"expected marker\", \"Corrupt JPEG\");\n\n\tcase 0xDD: // DRI - specify restart interval\n\t\tif (stbi__get16be(z->s) != 4) return stbi__err(\"bad DRI len\", \"Corrupt JPEG\");\n\t\tz->restart_interval = stbi__get16be(z->s);\n\t\treturn 1;\n\n\tcase 0xDB: // DQT - define quantization table\n\t\tL = stbi__get16be(z->s) - 2;\n\t\twhile (L > 0) {\n\t\t\tint q = stbi__get8(z->s);\n\t\t\tint p = q >> 4, sixteen = (p != 0);\n\t\t\tint t = q & 15, i;\n\t\t\tif (p != 0 && p != 1) return stbi__err(\"bad DQT type\", \"Corrupt JPEG\");\n\t\t\tif (t > 3) return stbi__err(\"bad DQT table\", \"Corrupt JPEG\");\n\n\t\t\tfor (i = 0; i < 64; ++i)\n\t\t\t\tz->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));\n\t\t\tL -= (sixteen ? 129 : 65);\n\t\t}\n\t\treturn L == 0;\n\n\tcase 0xC4: // DHT - define huffman table\n\t\tL = stbi__get16be(z->s) - 2;\n\t\twhile (L > 0) {\n\t\t\tstbi_uc *v;\n\t\t\tint sizes[16], i, n = 0;\n\t\t\tint q = stbi__get8(z->s);\n\t\t\tint tc = q >> 4;\n\t\t\tint th = q & 15;\n\t\t\tif (tc > 1 || th > 3) return stbi__err(\"bad DHT header\", \"Corrupt JPEG\");\n\t\t\tfor (i = 0; i < 16; ++i) {\n\t\t\t\tsizes[i] = stbi__get8(z->s);\n\t\t\t\tn += sizes[i];\n\t\t\t}\n\t\t\tL -= 17;\n\t\t\tif (tc == 0) {\n\t\t\t\tif (!stbi__build_huffman(z->huff_dc + th, sizes)) return 0;\n\t\t\t\tv = z->huff_dc[th].values;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!stbi__build_huffman(z->huff_ac + th, sizes)) return 0;\n\t\t\t\tv = z->huff_ac[th].values;\n\t\t\t}\n\t\t\tfor (i = 0; i < n; ++i)\n\t\t\t\tv[i] = stbi__get8(z->s);\n\t\t\tif (tc != 0)\n\t\t\t\tstbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);\n\t\t\tL -= n;\n\t\t}\n\t\treturn L == 0;\n\t}\n\n\t// check for comment block or APP blocks\n\tif ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {\n\t\tL = stbi__get16be(z->s);\n\t\tif (L < 2) {\n\t\t\tif (m == 0xFE)\n\t\t\t\treturn stbi__err(\"bad COM len\", \"Corrupt JPEG\");\n\t\t\telse\n\t\t\t\treturn stbi__err(\"bad APP len\", \"Corrupt JPEG\");\n\t\t}\n\t\tL -= 2;\n\n\t\tif (m == 0xE0 && L >= 5) { // JFIF APP0 segment\n\t\t\tstatic const unsigned char tag[5] = { 'J','F','I','F','\\0' };\n\t\t\tint ok = 1;\n\t\t\tint i;\n\t\t\tfor (i = 0; i < 5; ++i)\n\t\t\t\tif (stbi__get8(z->s) != tag[i])\n\t\t\t\t\tok = 0;\n\t\t\tL -= 5;\n\t\t\tif (ok)\n\t\t\t\tz->jfif = 1;\n\t\t}\n\t\telse if (m == 0xEE && L >= 12) { // Adobe APP14 segment\n\t\t\tstatic const unsigned char tag[6] = { 'A','d','o','b','e','\\0' };\n\t\t\tint ok = 1;\n\t\t\tint i;\n\t\t\tfor (i = 0; i < 6; ++i)\n\t\t\t\tif (stbi__get8(z->s) != tag[i])\n\t\t\t\t\tok = 0;\n\t\t\tL -= 6;\n\t\t\tif (ok) {\n\t\t\t\tstbi__get8(z->s); // version\n\t\t\t\tstbi__get16be(z->s); // flags0\n\t\t\t\tstbi__get16be(z->s); // flags1\n\t\t\t\tz->app14_color_transform = stbi__get8(z->s); // color transform\n\t\t\t\tL -= 6;\n\t\t\t}\n\t\t}\n\n\t\tstbi__skip(z->s, L);\n\t\treturn 1;\n\t}\n\n\treturn stbi__err(\"unknown marker\", \"Corrupt JPEG\");\n}\n\n// after we see SOS\nstatic int stbi__process_scan_header(stbi__jpeg *z)\n{\n\tint i;\n\tint Ls = stbi__get16be(z->s);\n\tz->scan_n = stbi__get8(z->s);\n\tif (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int)z->s->img_n) return stbi__err(\"bad SOS component count\", \"Corrupt JPEG\");\n\tif (Ls != 6 + 2 * z->scan_n) return stbi__err(\"bad SOS len\", \"Corrupt JPEG\");\n\tfor (i = 0; i < z->scan_n; ++i) {\n\t\tint id = stbi__get8(z->s), which;\n\t\tint q = stbi__get8(z->s);\n\t\tfor (which = 0; which < z->s->img_n; ++which)\n\t\t\tif (z->img_comp[which].id == id)\n\t\t\t\tbreak;\n\t\tif (which == z->s->img_n) return 0; // no match\n\t\tz->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return stbi__err(\"bad DC huff\", \"Corrupt JPEG\");\n\t\tz->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return stbi__err(\"bad AC huff\", \"Corrupt JPEG\");\n\t\tz->order[i] = which;\n\t}\n\n\t{\n\t\tint aa;\n\t\tz->spec_start = stbi__get8(z->s);\n\t\tz->spec_end = stbi__get8(z->s); // should be 63, but might be 0\n\t\taa = stbi__get8(z->s);\n\t\tz->succ_high = (aa >> 4);\n\t\tz->succ_low = (aa & 15);\n\t\tif (z->progressive) {\n\t\t\tif (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)\n\t\t\t\treturn stbi__err(\"bad SOS\", \"Corrupt JPEG\");\n\t\t}\n\t\telse {\n\t\t\tif (z->spec_start != 0) return stbi__err(\"bad SOS\", \"Corrupt JPEG\");\n\t\t\tif (z->succ_high != 0 || z->succ_low != 0) return stbi__err(\"bad SOS\", \"Corrupt JPEG\");\n\t\t\tz->spec_end = 63;\n\t\t}\n\t}\n\n\treturn 1;\n}\n\nstatic int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)\n{\n\tint i;\n\tfor (i = 0; i < ncomp; ++i) {\n\t\tif (z->img_comp[i].raw_data) {\n\t\t\tSTBI_FREE(z->img_comp[i].raw_data);\n\t\t\tz->img_comp[i].raw_data = NULL;\n\t\t\tz->img_comp[i].data = NULL;\n\t\t}\n\t\tif (z->img_comp[i].raw_coeff) {\n\t\t\tSTBI_FREE(z->img_comp[i].raw_coeff);\n\t\t\tz->img_comp[i].raw_coeff = 0;\n\t\t\tz->img_comp[i].coeff = 0;\n\t\t}\n\t\tif (z->img_comp[i].linebuf) {\n\t\t\tSTBI_FREE(z->img_comp[i].linebuf);\n\t\t\tz->img_comp[i].linebuf = NULL;\n\t\t}\n\t}\n\treturn why;\n}\n\nstatic int stbi__process_frame_header(stbi__jpeg *z, int scan)\n{\n\tstbi__context *s = z->s;\n\tint Lf, p, i, q, h_max = 1, v_max = 1, c;\n\tLf = stbi__get16be(s);         if (Lf < 11) return stbi__err(\"bad SOF len\", \"Corrupt JPEG\"); // JPEG\n\tp = stbi__get8(s);            if (p != 8) return stbi__err(\"only 8-bit\", \"JPEG format not supported: 8-bit only\"); // JPEG baseline\n\ts->img_y = stbi__get16be(s);   if (s->img_y == 0) return stbi__err(\"no header height\", \"JPEG format not supported: delayed height\"); // Legal, but we don't handle it--but neither does IJG\n\ts->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err(\"0 width\", \"Corrupt JPEG\"); // JPEG requires\n\tc = stbi__get8(s);\n\tif (c != 3 && c != 1 && c != 4) return stbi__err(\"bad component count\", \"Corrupt JPEG\");\n\ts->img_n = c;\n\tfor (i = 0; i < c; ++i) {\n\t\tz->img_comp[i].data = NULL;\n\t\tz->img_comp[i].linebuf = NULL;\n\t}\n\n\tif (Lf != 8 + 3 * s->img_n) return stbi__err(\"bad SOF len\", \"Corrupt JPEG\");\n\n\tz->rgb = 0;\n\tfor (i = 0; i < s->img_n; ++i) {\n\t\tstatic unsigned char rgb[3] = { 'R', 'G', 'B' };\n\t\tz->img_comp[i].id = stbi__get8(s);\n\t\tif (s->img_n == 3 && z->img_comp[i].id == rgb[i])\n\t\t\t++z->rgb;\n\t\tq = stbi__get8(s);\n\t\tz->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err(\"bad H\", \"Corrupt JPEG\");\n\t\tz->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err(\"bad V\", \"Corrupt JPEG\");\n\t\tz->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err(\"bad TQ\", \"Corrupt JPEG\");\n\t}\n\n\tif (scan != STBI__SCAN_load) return 1;\n\n\tif (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err(\"too large\", \"Image too large to decode\");\n\n\tfor (i = 0; i < s->img_n; ++i) {\n\t\tif (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;\n\t\tif (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;\n\t}\n\n\t// compute interleaved mcu info\n\tz->img_h_max = h_max;\n\tz->img_v_max = v_max;\n\tz->img_mcu_w = h_max * 8;\n\tz->img_mcu_h = v_max * 8;\n\t// these sizes can't be more than 17 bits\n\tz->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w;\n\tz->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h;\n\n\tfor (i = 0; i < s->img_n; ++i) {\n\t\t// number of effective pixels (e.g. for non-interleaved MCU)\n\t\tz->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max;\n\t\tz->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max;\n\t\t// to simplify generation, we'll allocate enough memory to decode\n\t\t// the bogus oversized data from using interleaved MCUs and their\n\t\t// big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't\n\t\t// discard the extra data until colorspace conversion\n\t\t//\n\t\t// img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)\n\t\t// so these muls can't overflow with 32-bit ints (which we require)\n\t\tz->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;\n\t\tz->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;\n\t\tz->img_comp[i].coeff = 0;\n\t\tz->img_comp[i].raw_coeff = 0;\n\t\tz->img_comp[i].linebuf = NULL;\n\t\tz->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);\n\t\tif (z->img_comp[i].raw_data == NULL)\n\t\t\treturn stbi__free_jpeg_components(z, i + 1, stbi__err(\"outofmem\", \"Out of memory\"));\n\t\t// align blocks for idct using mmx/sse\n\t\tz->img_comp[i].data = (stbi_uc*)(((size_t)z->img_comp[i].raw_data + 15) & ~15);\n\t\tif (z->progressive) {\n\t\t\t// w2, h2 are multiples of 8 (see above)\n\t\t\tz->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;\n\t\t\tz->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;\n\t\t\tz->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);\n\t\t\tif (z->img_comp[i].raw_coeff == NULL)\n\t\t\t\treturn stbi__free_jpeg_components(z, i + 1, stbi__err(\"outofmem\", \"Out of memory\"));\n\t\t\tz->img_comp[i].coeff = (short*)(((size_t)z->img_comp[i].raw_coeff + 15) & ~15);\n\t\t}\n\t}\n\n\treturn 1;\n}\n\n// use comparisons since in some cases we handle more than one case (e.g. SOF)\n#define stbi__DNL(x)         ((x) == 0xdc)\n#define stbi__SOI(x)         ((x) == 0xd8)\n#define stbi__EOI(x)         ((x) == 0xd9)\n#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)\n#define stbi__SOS(x)         ((x) == 0xda)\n\n#define stbi__SOF_progressive(x)   ((x) == 0xc2)\n\nstatic int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)\n{\n\tint m;\n\tz->jfif = 0;\n\tz->app14_color_transform = -1; // valid values are 0,1,2\n\tz->marker = STBI__MARKER_none; // initialize cached marker to empty\n\tm = stbi__get_marker(z);\n\tif (!stbi__SOI(m)) return stbi__err(\"no SOI\", \"Corrupt JPEG\");\n\tif (scan == STBI__SCAN_type) return 1;\n\tm = stbi__get_marker(z);\n\twhile (!stbi__SOF(m)) {\n\t\tif (!stbi__process_marker(z, m)) return 0;\n\t\tm = stbi__get_marker(z);\n\t\twhile (m == STBI__MARKER_none) {\n\t\t\t// some files have extra padding after their blocks, so ok, we'll scan\n\t\t\tif (stbi__at_eof(z->s)) return stbi__err(\"no SOF\", \"Corrupt JPEG\");\n\t\t\tm = stbi__get_marker(z);\n\t\t}\n\t}\n\tz->progressive = stbi__SOF_progressive(m);\n\tif (!stbi__process_frame_header(z, scan)) return 0;\n\treturn 1;\n}\n\n// decode image to YCbCr format\nstatic int stbi__decode_jpeg_image(stbi__jpeg *j)\n{\n\tint m;\n\tfor (m = 0; m < 4; m++) {\n\t\tj->img_comp[m].raw_data = NULL;\n\t\tj->img_comp[m].raw_coeff = NULL;\n\t}\n\tj->restart_interval = 0;\n\tif (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;\n\tm = stbi__get_marker(j);\n\twhile (!stbi__EOI(m)) {\n\t\tif (stbi__SOS(m)) {\n\t\t\tif (!stbi__process_scan_header(j)) return 0;\n\t\t\tif (!stbi__parse_entropy_coded_data(j)) return 0;\n\t\t\tif (j->marker == STBI__MARKER_none) {\n\t\t\t\t// handle 0s at the end of image data from IP Kamera 9060\n\t\t\t\twhile (!stbi__at_eof(j->s)) {\n\t\t\t\t\tint x = stbi__get8(j->s);\n\t\t\t\t\tif (x == 255) {\n\t\t\t\t\t\tj->marker = stbi__get8(j->s);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0\n\t\t\t}\n\t\t}\n\t\telse if (stbi__DNL(m)) {\n\t\t\tint Ld = stbi__get16be(j->s);\n\t\t\tstbi__uint32 NL = stbi__get16be(j->s);\n\t\t\tif (Ld != 4) stbi__err(\"bad DNL len\", \"Corrupt JPEG\");\n\t\t\tif (NL != j->s->img_y) stbi__err(\"bad DNL height\", \"Corrupt JPEG\");\n\t\t}\n\t\telse {\n\t\t\tif (!stbi__process_marker(j, m)) return 0;\n\t\t}\n\t\tm = stbi__get_marker(j);\n\t}\n\tif (j->progressive)\n\t\tstbi__jpeg_finish(j);\n\treturn 1;\n}\n\n// static jfif-centered resampling (across block boundaries)\n\ntypedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,\n\tint w, int hs);\n\n#define stbi__div4(x) ((stbi_uc) ((x) >> 2))\n\nstatic stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n\tSTBI_NOTUSED(out);\n\tSTBI_NOTUSED(in_far);\n\tSTBI_NOTUSED(w);\n\tSTBI_NOTUSED(hs);\n\treturn in_near;\n}\n\nstatic stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n\t// need to generate two samples vertically for every one in input\n\tint i;\n\tSTBI_NOTUSED(hs);\n\tfor (i = 0; i < w; ++i)\n\t\tout[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2);\n\treturn out;\n}\n\nstatic stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n\t// need to generate two samples horizontally for every one in input\n\tint i;\n\tstbi_uc *input = in_near;\n\n\tif (w == 1) {\n\t\t// if only one sample, can't do any interpolation\n\t\tout[0] = out[1] = input[0];\n\t\treturn out;\n\t}\n\n\tout[0] = input[0];\n\tout[1] = stbi__div4(input[0] * 3 + input[1] + 2);\n\tfor (i = 1; i < w - 1; ++i) {\n\t\tint n = 3 * input[i] + 2;\n\t\tout[i * 2 + 0] = stbi__div4(n + input[i - 1]);\n\t\tout[i * 2 + 1] = stbi__div4(n + input[i + 1]);\n\t}\n\tout[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2);\n\tout[i * 2 + 1] = input[w - 1];\n\n\tSTBI_NOTUSED(in_far);\n\tSTBI_NOTUSED(hs);\n\n\treturn out;\n}\n\n#define stbi__div16(x) ((stbi_uc) ((x) >> 4))\n\nstatic stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n\t// need to generate 2x2 samples for every one in input\n\tint i, t0, t1;\n\tif (w == 1) {\n\t\tout[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);\n\t\treturn out;\n\t}\n\n\tt1 = 3 * in_near[0] + in_far[0];\n\tout[0] = stbi__div4(t1 + 2);\n\tfor (i = 1; i < w; ++i) {\n\t\tt0 = t1;\n\t\tt1 = 3 * in_near[i] + in_far[i];\n\t\tout[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);\n\t\tout[i * 2] = stbi__div16(3 * t1 + t0 + 8);\n\t}\n\tout[w * 2 - 1] = stbi__div4(t1 + 2);\n\n\tSTBI_NOTUSED(hs);\n\n\treturn out;\n}\n\n#if defined(STBI_SSE2) || defined(STBI_NEON)\nstatic stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n\t// need to generate 2x2 samples for every one in input\n\tint i = 0, t0, t1;\n\n\tif (w == 1) {\n\t\tout[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);\n\t\treturn out;\n\t}\n\n\tt1 = 3 * in_near[0] + in_far[0];\n\t// process groups of 8 pixels for as long as we can.\n\t// note we can't handle the last pixel in a row in this loop\n\t// because we need to handle the filter boundary conditions.\n\tfor (; i < ((w - 1) & ~7); i += 8) {\n#if defined(STBI_SSE2)\n\t\t// load and perform the vertical filtering pass\n\t\t// this uses 3*x + y = 4*x + (y - x)\n\t\t__m128i zero = _mm_setzero_si128();\n\t\t__m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));\n\t\t__m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));\n\t\t__m128i farw = _mm_unpacklo_epi8(farb, zero);\n\t\t__m128i nearw = _mm_unpacklo_epi8(nearb, zero);\n\t\t__m128i diff = _mm_sub_epi16(farw, nearw);\n\t\t__m128i nears = _mm_slli_epi16(nearw, 2);\n\t\t__m128i curr = _mm_add_epi16(nears, diff); // current row\n\n\t\t\t\t\t\t\t\t\t\t\t\t   // horizontal filter works the same based on shifted vers of current\n\t\t\t\t\t\t\t\t\t\t\t\t   // row. \"prev\" is current row shifted right by 1 pixel; we need to\n\t\t\t\t\t\t\t\t\t\t\t\t   // insert the previous pixel value (from t1).\n\t\t\t\t\t\t\t\t\t\t\t\t   // \"next\" is current row shifted left by 1 pixel, with first pixel\n\t\t\t\t\t\t\t\t\t\t\t\t   // of next block of 8 pixels added in.\n\t\t__m128i prv0 = _mm_slli_si128(curr, 2);\n\t\t__m128i nxt0 = _mm_srli_si128(curr, 2);\n\t\t__m128i prev = _mm_insert_epi16(prv0, t1, 0);\n\t\t__m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7);\n\n\t\t// horizontal filter, polyphase implementation since it's convenient:\n\t\t// even pixels = 3*cur + prev = cur*4 + (prev - cur)\n\t\t// odd  pixels = 3*cur + next = cur*4 + (next - cur)\n\t\t// note the shared term.\n\t\t__m128i bias = _mm_set1_epi16(8);\n\t\t__m128i curs = _mm_slli_epi16(curr, 2);\n\t\t__m128i prvd = _mm_sub_epi16(prev, curr);\n\t\t__m128i nxtd = _mm_sub_epi16(next, curr);\n\t\t__m128i curb = _mm_add_epi16(curs, bias);\n\t\t__m128i even = _mm_add_epi16(prvd, curb);\n\t\t__m128i odd = _mm_add_epi16(nxtd, curb);\n\n\t\t// interleave even and odd pixels, then undo scaling.\n\t\t__m128i int0 = _mm_unpacklo_epi16(even, odd);\n\t\t__m128i int1 = _mm_unpackhi_epi16(even, odd);\n\t\t__m128i de0 = _mm_srli_epi16(int0, 4);\n\t\t__m128i de1 = _mm_srli_epi16(int1, 4);\n\n\t\t// pack and write output\n\t\t__m128i outv = _mm_packus_epi16(de0, de1);\n\t\t_mm_storeu_si128((__m128i *) (out + i * 2), outv);\n#elif defined(STBI_NEON)\n\t\t// load and perform the vertical filtering pass\n\t\t// this uses 3*x + y = 4*x + (y - x)\n\t\tuint8x8_t farb = vld1_u8(in_far + i);\n\t\tuint8x8_t nearb = vld1_u8(in_near + i);\n\t\tint16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));\n\t\tint16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));\n\t\tint16x8_t curr = vaddq_s16(nears, diff); // current row\n\n\t\t\t\t\t\t\t\t\t\t\t\t // horizontal filter works the same based on shifted vers of current\n\t\t\t\t\t\t\t\t\t\t\t\t // row. \"prev\" is current row shifted right by 1 pixel; we need to\n\t\t\t\t\t\t\t\t\t\t\t\t // insert the previous pixel value (from t1).\n\t\t\t\t\t\t\t\t\t\t\t\t // \"next\" is current row shifted left by 1 pixel, with first pixel\n\t\t\t\t\t\t\t\t\t\t\t\t // of next block of 8 pixels added in.\n\t\tint16x8_t prv0 = vextq_s16(curr, curr, 7);\n\t\tint16x8_t nxt0 = vextq_s16(curr, curr, 1);\n\t\tint16x8_t prev = vsetq_lane_s16(t1, prv0, 0);\n\t\tint16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7);\n\n\t\t// horizontal filter, polyphase implementation since it's convenient:\n\t\t// even pixels = 3*cur + prev = cur*4 + (prev - cur)\n\t\t// odd  pixels = 3*cur + next = cur*4 + (next - cur)\n\t\t// note the shared term.\n\t\tint16x8_t curs = vshlq_n_s16(curr, 2);\n\t\tint16x8_t prvd = vsubq_s16(prev, curr);\n\t\tint16x8_t nxtd = vsubq_s16(next, curr);\n\t\tint16x8_t even = vaddq_s16(curs, prvd);\n\t\tint16x8_t odd = vaddq_s16(curs, nxtd);\n\n\t\t// undo scaling and round, then store with even/odd phases interleaved\n\t\tuint8x8x2_t o;\n\t\to.val[0] = vqrshrun_n_s16(even, 4);\n\t\to.val[1] = vqrshrun_n_s16(odd, 4);\n\t\tvst2_u8(out + i * 2, o);\n#endif\n\n\t\t// \"previous\" value for next iter\n\t\tt1 = 3 * in_near[i + 7] + in_far[i + 7];\n\t}\n\n\tt0 = t1;\n\tt1 = 3 * in_near[i] + in_far[i];\n\tout[i * 2] = stbi__div16(3 * t1 + t0 + 8);\n\n\tfor (++i; i < w; ++i) {\n\t\tt0 = t1;\n\t\tt1 = 3 * in_near[i] + in_far[i];\n\t\tout[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);\n\t\tout[i * 2] = stbi__div16(3 * t1 + t0 + 8);\n\t}\n\tout[w * 2 - 1] = stbi__div4(t1 + 2);\n\n\tSTBI_NOTUSED(hs);\n\n\treturn out;\n}\n#endif\n\nstatic stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n\t// resample with nearest-neighbor\n\tint i, j;\n\tSTBI_NOTUSED(in_far);\n\tfor (i = 0; i < w; ++i)\n\t\tfor (j = 0; j < hs; ++j)\n\t\t\tout[i*hs + j] = in_near[i];\n\treturn out;\n}\n\n// this is a reduced-precision calculation of YCbCr-to-RGB introduced\n// to make sure the code produces the same results in both SIMD and scalar\n#define stbi__float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8)\nstatic void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)\n{\n\tint i;\n\tfor (i = 0; i < count; ++i) {\n\t\tint y_fixed = (y[i] << 20) + (1 << 19); // rounding\n\t\tint r, g, b;\n\t\tint cr = pcr[i] - 128;\n\t\tint cb = pcb[i] - 128;\n\t\tr = y_fixed + cr* stbi__float2fixed(1.40200f);\n\t\tg = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);\n\t\tb = y_fixed + cb* stbi__float2fixed(1.77200f);\n\t\tr >>= 20;\n\t\tg >>= 20;\n\t\tb >>= 20;\n\t\tif ((unsigned)r > 255) { if (r < 0) r = 0; else r = 255; }\n\t\tif ((unsigned)g > 255) { if (g < 0) g = 0; else g = 255; }\n\t\tif ((unsigned)b > 255) { if (b < 0) b = 0; else b = 255; }\n\t\tout[0] = (stbi_uc)r;\n\t\tout[1] = (stbi_uc)g;\n\t\tout[2] = (stbi_uc)b;\n\t\tout[3] = 255;\n\t\tout += step;\n\t}\n}\n\n#if defined(STBI_SSE2) || defined(STBI_NEON)\nstatic void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)\n{\n\tint i = 0;\n\n#ifdef STBI_SSE2\n\t// step == 3 is pretty ugly on the final interleave, and i'm not convinced\n\t// it's useful in practice (you wouldn't use it for textures, for example).\n\t// so just accelerate step == 4 case.\n\tif (step == 4) {\n\t\t// this is a fairly straightforward implementation and not super-optimized.\n\t\t__m128i signflip = _mm_set1_epi8(-0x80);\n\t\t__m128i cr_const0 = _mm_set1_epi16((short)(1.40200f*4096.0f + 0.5f));\n\t\t__m128i cr_const1 = _mm_set1_epi16(-(short)(0.71414f*4096.0f + 0.5f));\n\t\t__m128i cb_const0 = _mm_set1_epi16(-(short)(0.34414f*4096.0f + 0.5f));\n\t\t__m128i cb_const1 = _mm_set1_epi16((short)(1.77200f*4096.0f + 0.5f));\n\t\t__m128i y_bias = _mm_set1_epi8((char)(unsigned char)128);\n\t\t__m128i xw = _mm_set1_epi16(255); // alpha channel\n\n\t\tfor (; i + 7 < count; i += 8) {\n\t\t\t// load\n\t\t\t__m128i y_bytes = _mm_loadl_epi64((__m128i *) (y + i));\n\t\t\t__m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr + i));\n\t\t\t__m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb + i));\n\t\t\t__m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128\n\t\t\t__m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // unpack to short (and left-shift cr, cb by 8)\n\t\t\t__m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);\n\t\t\t__m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);\n\t\t\t__m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);\n\n\t\t\t// color transform\n\t\t\t__m128i yws = _mm_srli_epi16(yw, 4);\n\t\t\t__m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);\n\t\t\t__m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);\n\t\t\t__m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);\n\t\t\t__m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);\n\t\t\t__m128i rws = _mm_add_epi16(cr0, yws);\n\t\t\t__m128i gwt = _mm_add_epi16(cb0, yws);\n\t\t\t__m128i bws = _mm_add_epi16(yws, cb1);\n\t\t\t__m128i gws = _mm_add_epi16(gwt, cr1);\n\n\t\t\t// descale\n\t\t\t__m128i rw = _mm_srai_epi16(rws, 4);\n\t\t\t__m128i bw = _mm_srai_epi16(bws, 4);\n\t\t\t__m128i gw = _mm_srai_epi16(gws, 4);\n\n\t\t\t// back to byte, set up for transpose\n\t\t\t__m128i brb = _mm_packus_epi16(rw, bw);\n\t\t\t__m128i gxb = _mm_packus_epi16(gw, xw);\n\n\t\t\t// transpose to interleave channels\n\t\t\t__m128i t0 = _mm_unpacklo_epi8(brb, gxb);\n\t\t\t__m128i t1 = _mm_unpackhi_epi8(brb, gxb);\n\t\t\t__m128i o0 = _mm_unpacklo_epi16(t0, t1);\n\t\t\t__m128i o1 = _mm_unpackhi_epi16(t0, t1);\n\n\t\t\t// store\n\t\t\t_mm_storeu_si128((__m128i *) (out + 0), o0);\n\t\t\t_mm_storeu_si128((__m128i *) (out + 16), o1);\n\t\t\tout += 32;\n\t\t}\n\t}\n#endif\n\n#ifdef STBI_NEON\n\t// in this version, step=3 support would be easy to add. but is there demand?\n\tif (step == 4) {\n\t\t// this is a fairly straightforward implementation and not super-optimized.\n\t\tuint8x8_t signflip = vdup_n_u8(0x80);\n\t\tint16x8_t cr_const0 = vdupq_n_s16((short)(1.40200f*4096.0f + 0.5f));\n\t\tint16x8_t cr_const1 = vdupq_n_s16(-(short)(0.71414f*4096.0f + 0.5f));\n\t\tint16x8_t cb_const0 = vdupq_n_s16(-(short)(0.34414f*4096.0f + 0.5f));\n\t\tint16x8_t cb_const1 = vdupq_n_s16((short)(1.77200f*4096.0f + 0.5f));\n\n\t\tfor (; i + 7 < count; i += 8) {\n\t\t\t// load\n\t\t\tuint8x8_t y_bytes = vld1_u8(y + i);\n\t\t\tuint8x8_t cr_bytes = vld1_u8(pcr + i);\n\t\t\tuint8x8_t cb_bytes = vld1_u8(pcb + i);\n\t\t\tint8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));\n\t\t\tint8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));\n\n\t\t\t// expand to s16\n\t\t\tint16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));\n\t\t\tint16x8_t crw = vshll_n_s8(cr_biased, 7);\n\t\t\tint16x8_t cbw = vshll_n_s8(cb_biased, 7);\n\n\t\t\t// color transform\n\t\t\tint16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);\n\t\t\tint16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);\n\t\t\tint16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);\n\t\t\tint16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);\n\t\t\tint16x8_t rws = vaddq_s16(yws, cr0);\n\t\t\tint16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);\n\t\t\tint16x8_t bws = vaddq_s16(yws, cb1);\n\n\t\t\t// undo scaling, round, convert to byte\n\t\t\tuint8x8x4_t o;\n\t\t\to.val[0] = vqrshrun_n_s16(rws, 4);\n\t\t\to.val[1] = vqrshrun_n_s16(gws, 4);\n\t\t\to.val[2] = vqrshrun_n_s16(bws, 4);\n\t\t\to.val[3] = vdup_n_u8(255);\n\n\t\t\t// store, interleaving r/g/b/a\n\t\t\tvst4_u8(out, o);\n\t\t\tout += 8 * 4;\n\t\t}\n\t}\n#endif\n\n\tfor (; i < count; ++i) {\n\t\tint y_fixed = (y[i] << 20) + (1 << 19); // rounding\n\t\tint r, g, b;\n\t\tint cr = pcr[i] - 128;\n\t\tint cb = pcb[i] - 128;\n\t\tr = y_fixed + cr* stbi__float2fixed(1.40200f);\n\t\tg = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);\n\t\tb = y_fixed + cb* stbi__float2fixed(1.77200f);\n\t\tr >>= 20;\n\t\tg >>= 20;\n\t\tb >>= 20;\n\t\tif ((unsigned)r > 255) { if (r < 0) r = 0; else r = 255; }\n\t\tif ((unsigned)g > 255) { if (g < 0) g = 0; else g = 255; }\n\t\tif ((unsigned)b > 255) { if (b < 0) b = 0; else b = 255; }\n\t\tout[0] = (stbi_uc)r;\n\t\tout[1] = (stbi_uc)g;\n\t\tout[2] = (stbi_uc)b;\n\t\tout[3] = 255;\n\t\tout += step;\n\t}\n}\n#endif\n\n// set up the kernels\nstatic void stbi__setup_jpeg(stbi__jpeg *j)\n{\n\tj->idct_block_kernel = stbi__idct_block;\n\tj->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;\n\tj->resample_row_hv_2_kernel = stbi__resample_row_hv_2;\n\n#ifdef STBI_SSE2\n\tif (stbi__sse2_available()) {\n\t\tj->idct_block_kernel = stbi__idct_simd;\n\t\tj->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\n\t\tj->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\n\t}\n#endif\n\n#ifdef STBI_NEON\n\tj->idct_block_kernel = stbi__idct_simd;\n\tj->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\n\tj->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\n#endif\n}\n\n// clean up the temporary component buffers\nstatic void stbi__cleanup_jpeg(stbi__jpeg *j)\n{\n\tstbi__free_jpeg_components(j, j->s->img_n, 0);\n}\n\ntypedef struct\n{\n\tresample_row_func resample;\n\tstbi_uc *line0, *line1;\n\tint hs, vs;   // expansion factor in each axis\n\tint w_lores; // horizontal pixels pre-expansion\n\tint ystep;   // how far through vertical expansion we are\n\tint ypos;    // which pre-expansion row we're on\n} stbi__resample;\n\n// fast 0..255 * 0..255 => 0..255 rounded multiplication\nstatic stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)\n{\n\tunsigned int t = x*y + 128;\n\treturn (stbi_uc)((t + (t >> 8)) >> 8);\n}\n\nstatic stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)\n{\n\tint n, decode_n, is_rgb;\n\tz->s->img_n = 0; // make stbi__cleanup_jpeg safe\n\n\t\t\t\t\t // validate req_comp\n\tif (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\n\n\t// load a jpeg image from whichever source, but leave in YCbCr format\n\tif (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }\n\n\t// determine actual number of components to generate\n\tn = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;\n\n\tis_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));\n\n\tif (z->s->img_n == 3 && n < 3 && !is_rgb)\n\t\tdecode_n = 1;\n\telse\n\t\tdecode_n = z->s->img_n;\n\n\t// resample and color-convert\n\t{\n\t\tint k;\n\t\tunsigned int i, j;\n\t\tstbi_uc *output;\n\t\tstbi_uc *coutput[4];\n\n\t\tstbi__resample res_comp[4];\n\n\t\tfor (k = 0; k < decode_n; ++k) {\n\t\t\tstbi__resample *r = &res_comp[k];\n\n\t\t\t// allocate line buffer big enough for upsampling off the edges\n\t\t\t// with upsample factor of 4\n\t\t\tz->img_comp[k].linebuf = (stbi_uc *)stbi__malloc(z->s->img_x + 3);\n\t\t\tif (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\n\t\t\tr->hs = z->img_h_max / z->img_comp[k].h;\n\t\t\tr->vs = z->img_v_max / z->img_comp[k].v;\n\t\t\tr->ystep = r->vs >> 1;\n\t\t\tr->w_lores = (z->s->img_x + r->hs - 1) / r->hs;\n\t\t\tr->ypos = 0;\n\t\t\tr->line0 = r->line1 = z->img_comp[k].data;\n\n\t\t\tif (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;\n\t\t\telse if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;\n\t\t\telse if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;\n\t\t\telse if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;\n\t\t\telse                               r->resample = stbi__resample_row_generic;\n\t\t}\n\n\t\t// can't error after this so, this is safe\n\t\toutput = (stbi_uc *)stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);\n\t\tif (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\n\t\t// now go ahead and resample\n\t\tfor (j = 0; j < z->s->img_y; ++j) {\n\t\t\tstbi_uc *out = output + n * z->s->img_x * j;\n\t\t\tfor (k = 0; k < decode_n; ++k) {\n\t\t\t\tstbi__resample *r = &res_comp[k];\n\t\t\t\tint y_bot = r->ystep >= (r->vs >> 1);\n\t\t\t\tcoutput[k] = r->resample(z->img_comp[k].linebuf,\n\t\t\t\t\ty_bot ? r->line1 : r->line0,\n\t\t\t\t\ty_bot ? r->line0 : r->line1,\n\t\t\t\t\tr->w_lores, r->hs);\n\t\t\t\tif (++r->ystep >= r->vs) {\n\t\t\t\t\tr->ystep = 0;\n\t\t\t\t\tr->line0 = r->line1;\n\t\t\t\t\tif (++r->ypos < z->img_comp[k].y)\n\t\t\t\t\t\tr->line1 += z->img_comp[k].w2;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (n >= 3) {\n\t\t\t\tstbi_uc *y = coutput[0];\n\t\t\t\tif (z->s->img_n == 3) {\n\t\t\t\t\tif (is_rgb) {\n\t\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i) {\n\t\t\t\t\t\t\tout[0] = y[i];\n\t\t\t\t\t\t\tout[1] = coutput[1][i];\n\t\t\t\t\t\t\tout[2] = coutput[2][i];\n\t\t\t\t\t\t\tout[3] = 255;\n\t\t\t\t\t\t\tout += n;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tz->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (z->s->img_n == 4) {\n\t\t\t\t\tif (z->app14_color_transform == 0) { // CMYK\n\t\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i) {\n\t\t\t\t\t\t\tstbi_uc m = coutput[3][i];\n\t\t\t\t\t\t\tout[0] = stbi__blinn_8x8(coutput[0][i], m);\n\t\t\t\t\t\t\tout[1] = stbi__blinn_8x8(coutput[1][i], m);\n\t\t\t\t\t\t\tout[2] = stbi__blinn_8x8(coutput[2][i], m);\n\t\t\t\t\t\t\tout[3] = 255;\n\t\t\t\t\t\t\tout += n;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (z->app14_color_transform == 2) { // YCCK\n\t\t\t\t\t\tz->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\n\t\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i) {\n\t\t\t\t\t\t\tstbi_uc m = coutput[3][i];\n\t\t\t\t\t\t\tout[0] = stbi__blinn_8x8(255 - out[0], m);\n\t\t\t\t\t\t\tout[1] = stbi__blinn_8x8(255 - out[1], m);\n\t\t\t\t\t\t\tout[2] = stbi__blinn_8x8(255 - out[2], m);\n\t\t\t\t\t\t\tout += n;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse { // YCbCr + alpha?  Ignore the fourth channel for now\n\t\t\t\t\t\tz->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i) {\n\t\t\t\t\t\tout[0] = out[1] = out[2] = y[i];\n\t\t\t\t\t\tout[3] = 255; // not used if n==3\n\t\t\t\t\t\tout += n;\n\t\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (is_rgb) {\n\t\t\t\t\tif (n == 1)\n\t\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i)\n\t\t\t\t\t\t\t*out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i, out += 2) {\n\t\t\t\t\t\t\tout[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);\n\t\t\t\t\t\t\tout[1] = 255;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (z->s->img_n == 4 && z->app14_color_transform == 0) {\n\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i) {\n\t\t\t\t\t\tstbi_uc m = coutput[3][i];\n\t\t\t\t\t\tstbi_uc r = stbi__blinn_8x8(coutput[0][i], m);\n\t\t\t\t\t\tstbi_uc g = stbi__blinn_8x8(coutput[1][i], m);\n\t\t\t\t\t\tstbi_uc b = stbi__blinn_8x8(coutput[2][i], m);\n\t\t\t\t\t\tout[0] = stbi__compute_y(r, g, b);\n\t\t\t\t\t\tout[1] = 255;\n\t\t\t\t\t\tout += n;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (z->s->img_n == 4 && z->app14_color_transform == 2) {\n\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i) {\n\t\t\t\t\t\tout[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);\n\t\t\t\t\t\tout[1] = 255;\n\t\t\t\t\t\tout += n;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstbi_uc *y = coutput[0];\n\t\t\t\t\tif (n == 1)\n\t\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i) out[i] = y[i];\n\t\t\t\t\telse\n\t\t\t\t\t\tfor (i = 0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tstbi__cleanup_jpeg(z);\n\t\t*out_x = z->s->img_x;\n\t\t*out_y = z->s->img_y;\n\t\tif (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output\n\t\treturn output;\n\t}\n}\n\nstatic void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n\tunsigned char* result;\n\tstbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));\n\tSTBI_NOTUSED(ri);\n\tj->s = s;\n\tstbi__setup_jpeg(j);\n\tresult = load_jpeg_image(j, x, y, comp, req_comp);\n\tSTBI_FREE(j);\n\treturn result;\n}\n\nstatic int stbi__jpeg_test(stbi__context *s)\n{\n\tint r;\n\tstbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));\n\tj->s = s;\n\tstbi__setup_jpeg(j);\n\tr = stbi__decode_jpeg_header(j, STBI__SCAN_type);\n\tstbi__rewind(s);\n\tSTBI_FREE(j);\n\treturn r;\n}\n\nstatic int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)\n{\n\tif (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {\n\t\tstbi__rewind(j->s);\n\t\treturn 0;\n\t}\n\tif (x) *x = j->s->img_x;\n\tif (y) *y = j->s->img_y;\n\tif (comp) *comp = j->s->img_n >= 3 ? 3 : 1;\n\treturn 1;\n}\n\nstatic int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\tint result;\n\tstbi__jpeg* j = (stbi__jpeg*)(stbi__malloc(sizeof(stbi__jpeg)));\n\tj->s = s;\n\tresult = stbi__jpeg_info_raw(j, x, y, comp);\n\tSTBI_FREE(j);\n\treturn result;\n}\n#endif\n\n// public domain zlib decode    v0.2  Sean Barrett 2006-11-18\n//    simple implementation\n//      - all input must be provided in an upfront buffer\n//      - all output is written to a single output buffer (can malloc/realloc)\n//    performance\n//      - fast huffman\n\n#ifndef STBI_NO_ZLIB\n\n// fast-way is faster to check than jpeg huffman, but slow way is slower\n#define STBI__ZFAST_BITS  9 // accelerate all cases in default tables\n#define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)\n\n// zlib-style huffman encoding\n// (jpegs packs from left, zlib from right, so can't share code)\ntypedef struct\n{\n\tstbi__uint16 fast[1 << STBI__ZFAST_BITS];\n\tstbi__uint16 firstcode[16];\n\tint maxcode[17];\n\tstbi__uint16 firstsymbol[16];\n\tstbi_uc  size[288];\n\tstbi__uint16 value[288];\n} stbi__zhuffman;\n\nstbi_inline static int stbi__bitreverse16(int n)\n{\n\tn = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);\n\tn = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);\n\tn = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);\n\tn = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);\n\treturn n;\n}\n\nstbi_inline static int stbi__bit_reverse(int v, int bits)\n{\n\tSTBI_ASSERT(bits <= 16);\n\t// to bit reverse n bits, reverse 16 and shift\n\t// e.g. 11 bits, bit reverse and shift away 5\n\treturn stbi__bitreverse16(v) >> (16 - bits);\n}\n\nstatic int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)\n{\n\tint i, k = 0;\n\tint code, next_code[16], sizes[17];\n\n\t// DEFLATE spec for generating codes\n\tmemset(sizes, 0, sizeof(sizes));\n\tmemset(z->fast, 0, sizeof(z->fast));\n\tfor (i = 0; i < num; ++i)\n\t\t++sizes[sizelist[i]];\n\tsizes[0] = 0;\n\tfor (i = 1; i < 16; ++i)\n\t\tif (sizes[i] >(1 << i))\n\t\t\treturn stbi__err(\"bad sizes\", \"Corrupt PNG\");\n\tcode = 0;\n\tfor (i = 1; i < 16; ++i) {\n\t\tnext_code[i] = code;\n\t\tz->firstcode[i] = (stbi__uint16)code;\n\t\tz->firstsymbol[i] = (stbi__uint16)k;\n\t\tcode = (code + sizes[i]);\n\t\tif (sizes[i])\n\t\t\tif (code - 1 >= (1 << i)) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n\t\tz->maxcode[i] = code << (16 - i); // preshift for inner loop\n\t\tcode <<= 1;\n\t\tk += sizes[i];\n\t}\n\tz->maxcode[16] = 0x10000; // sentinel\n\tfor (i = 0; i < num; ++i) {\n\t\tint s = sizelist[i];\n\t\tif (s) {\n\t\t\tint c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];\n\t\t\tstbi__uint16 fastv = (stbi__uint16)((s << 9) | i);\n\t\t\tz->size[c] = (stbi_uc)s;\n\t\t\tz->value[c] = (stbi__uint16)i;\n\t\t\tif (s <= STBI__ZFAST_BITS) {\n\t\t\t\tint j = stbi__bit_reverse(next_code[s], s);\n\t\t\t\twhile (j < (1 << STBI__ZFAST_BITS)) {\n\t\t\t\t\tz->fast[j] = fastv;\n\t\t\t\t\tj += (1 << s);\n\t\t\t\t}\n\t\t\t}\n\t\t\t++next_code[s];\n\t\t}\n\t}\n\treturn 1;\n}\n\n// zlib-from-memory implementation for PNG reading\n//    because PNG allows splitting the zlib stream arbitrarily,\n//    and it's annoying structurally to have PNG call ZLIB call PNG,\n//    we require PNG read all the IDATs and combine them into a single\n//    memory buffer\n\ntypedef struct\n{\n\tstbi_uc *zbuffer, *zbuffer_end;\n\tint num_bits;\n\tstbi__uint32 code_buffer;\n\n\tchar *zout;\n\tchar *zout_start;\n\tchar *zout_end;\n\tint   z_expandable;\n\n\tstbi__zhuffman z_length, z_distance;\n} stbi__zbuf;\n\nstbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)\n{\n\tif (z->zbuffer >= z->zbuffer_end) return 0;\n\treturn *z->zbuffer++;\n}\n\nstatic void stbi__fill_bits(stbi__zbuf *z)\n{\n\tdo {\n\t\tSTBI_ASSERT(z->code_buffer < (1U << z->num_bits));\n\t\tz->code_buffer |= (unsigned int)stbi__zget8(z) << z->num_bits;\n\t\tz->num_bits += 8;\n\t} while (z->num_bits <= 24);\n}\n\nstbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)\n{\n\tunsigned int k;\n\tif (z->num_bits < n) stbi__fill_bits(z);\n\tk = z->code_buffer & ((1 << n) - 1);\n\tz->code_buffer >>= n;\n\tz->num_bits -= n;\n\treturn k;\n}\n\nstatic int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)\n{\n\tint b, s, k;\n\t// not resolved by fast table, so compute it the slow way\n\t// use jpeg approach, which requires MSbits at top\n\tk = stbi__bit_reverse(a->code_buffer, 16);\n\tfor (s = STBI__ZFAST_BITS + 1; ; ++s)\n\t\tif (k < z->maxcode[s])\n\t\t\tbreak;\n\tif (s == 16) return -1; // invalid code!\n\t\t\t\t\t\t\t// code size is s, so:\n\tb = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s];\n\tSTBI_ASSERT(z->size[b] == s);\n\ta->code_buffer >>= s;\n\ta->num_bits -= s;\n\treturn z->value[b];\n}\n\nstbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)\n{\n\tint b, s;\n\tif (a->num_bits < 16) stbi__fill_bits(a);\n\tb = z->fast[a->code_buffer & STBI__ZFAST_MASK];\n\tif (b) {\n\t\ts = b >> 9;\n\t\ta->code_buffer >>= s;\n\t\ta->num_bits -= s;\n\t\treturn b & 511;\n\t}\n\treturn stbi__zhuffman_decode_slowpath(a, z);\n}\n\nstatic int stbi__zexpand(stbi__zbuf *z, char *zout, int n)  // need to make room for n bytes\n{\n\tchar *q;\n\tint cur, limit, old_limit;\n\tz->zout = zout;\n\tif (!z->z_expandable) return stbi__err(\"output buffer limit\", \"Corrupt PNG\");\n\tcur = (int)(z->zout - z->zout_start);\n\tlimit = old_limit = (int)(z->zout_end - z->zout_start);\n\twhile (cur + n > limit)\n\t\tlimit *= 2;\n\tq = (char *)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);\n\tSTBI_NOTUSED(old_limit);\n\tif (q == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n\tz->zout_start = q;\n\tz->zout = q + cur;\n\tz->zout_end = q + limit;\n\treturn 1;\n}\n\nstatic int stbi__zlength_base[31] = {\n\t3,4,5,6,7,8,9,10,11,13,\n\t15,17,19,23,27,31,35,43,51,59,\n\t67,83,99,115,131,163,195,227,258,0,0 };\n\nstatic int stbi__zlength_extra[31] =\n{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };\n\nstatic int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,\n257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0 };\n\nstatic int stbi__zdist_extra[32] =\n{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };\n\nstatic int stbi__parse_huffman_block(stbi__zbuf *a)\n{\n\tchar *zout = a->zout;\n\tfor (;;) {\n\t\tint z = stbi__zhuffman_decode(a, &a->z_length);\n\t\tif (z < 256) {\n\t\t\tif (z < 0) return stbi__err(\"bad huffman code\", \"Corrupt PNG\"); // error in huffman codes\n\t\t\tif (zout >= a->zout_end) {\n\t\t\t\tif (!stbi__zexpand(a, zout, 1)) return 0;\n\t\t\t\tzout = a->zout;\n\t\t\t}\n\t\t\t*zout++ = (char)z;\n\t\t}\n\t\telse {\n\t\t\tstbi_uc *p;\n\t\t\tint len, dist;\n\t\t\tif (z == 256) {\n\t\t\t\ta->zout = zout;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tz -= 257;\n\t\t\tlen = stbi__zlength_base[z];\n\t\t\tif (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);\n\t\t\tz = stbi__zhuffman_decode(a, &a->z_distance);\n\t\t\tif (z < 0) return stbi__err(\"bad huffman code\", \"Corrupt PNG\");\n\t\t\tdist = stbi__zdist_base[z];\n\t\t\tif (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);\n\t\t\tif (zout - a->zout_start < dist) return stbi__err(\"bad dist\", \"Corrupt PNG\");\n\t\t\tif (zout + len > a->zout_end) {\n\t\t\t\tif (!stbi__zexpand(a, zout, len)) return 0;\n\t\t\t\tzout = a->zout;\n\t\t\t}\n\t\t\tp = (stbi_uc *)(zout - dist);\n\t\t\tif (dist == 1) { // run of one byte; common in images.\n\t\t\t\tstbi_uc v = *p;\n\t\t\t\tif (len) { do *zout++ = v; while (--len); }\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (len) { do *zout++ = *p++; while (--len); }\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic int stbi__compute_huffman_codes(stbi__zbuf *a)\n{\n\tstatic stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };\n\tstbi__zhuffman z_codelength;\n\tstbi_uc lencodes[286 + 32 + 137];//padding for maximum single op\n\tstbi_uc codelength_sizes[19];\n\tint i, n;\n\n\tint hlit = stbi__zreceive(a, 5) + 257;\n\tint hdist = stbi__zreceive(a, 5) + 1;\n\tint hclen = stbi__zreceive(a, 4) + 4;\n\tint ntot = hlit + hdist;\n\n\tmemset(codelength_sizes, 0, sizeof(codelength_sizes));\n\tfor (i = 0; i < hclen; ++i) {\n\t\tint s = stbi__zreceive(a, 3);\n\t\tcodelength_sizes[length_dezigzag[i]] = (stbi_uc)s;\n\t}\n\tif (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;\n\n\tn = 0;\n\twhile (n < ntot) {\n\t\tint c = stbi__zhuffman_decode(a, &z_codelength);\n\t\tif (c < 0 || c >= 19) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n\t\tif (c < 16)\n\t\t\tlencodes[n++] = (stbi_uc)c;\n\t\telse {\n\t\t\tstbi_uc fill = 0;\n\t\t\tif (c == 16) {\n\t\t\t\tc = stbi__zreceive(a, 2) + 3;\n\t\t\t\tif (n == 0) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n\t\t\t\tfill = lencodes[n - 1];\n\t\t\t}\n\t\t\telse if (c == 17)\n\t\t\t\tc = stbi__zreceive(a, 3) + 3;\n\t\t\telse {\n\t\t\t\tSTBI_ASSERT(c == 18);\n\t\t\t\tc = stbi__zreceive(a, 7) + 11;\n\t\t\t}\n\t\t\tif (ntot - n < c) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n\t\t\tmemset(lencodes + n, fill, c);\n\t\t\tn += c;\n\t\t}\n\t}\n\tif (n != ntot) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n\tif (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;\n\tif (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist)) return 0;\n\treturn 1;\n}\n\nstatic int stbi__parse_uncompressed_block(stbi__zbuf *a)\n{\n\tstbi_uc header[4];\n\tint len, nlen, k;\n\tif (a->num_bits & 7)\n\t\tstbi__zreceive(a, a->num_bits & 7); // discard\n\t\t\t\t\t\t\t\t\t\t\t// drain the bit-packed data into header\n\tk = 0;\n\twhile (a->num_bits > 0) {\n\t\theader[k++] = (stbi_uc)(a->code_buffer & 255); // suppress MSVC run-time check\n\t\ta->code_buffer >>= 8;\n\t\ta->num_bits -= 8;\n\t}\n\tSTBI_ASSERT(a->num_bits == 0);\n\t// now fill header the normal way\n\twhile (k < 4)\n\t\theader[k++] = stbi__zget8(a);\n\tlen = header[1] * 256 + header[0];\n\tnlen = header[3] * 256 + header[2];\n\tif (nlen != (len ^ 0xffff)) return stbi__err(\"zlib corrupt\", \"Corrupt PNG\");\n\tif (a->zbuffer + len > a->zbuffer_end) return stbi__err(\"read past buffer\", \"Corrupt PNG\");\n\tif (a->zout + len > a->zout_end)\n\t\tif (!stbi__zexpand(a, a->zout, len)) return 0;\n\tmemcpy(a->zout, a->zbuffer, len);\n\ta->zbuffer += len;\n\ta->zout += len;\n\treturn 1;\n}\n\nstatic int stbi__parse_zlib_header(stbi__zbuf *a)\n{\n\tint cmf = stbi__zget8(a);\n\tint cm = cmf & 15;\n\t/* int cinfo = cmf >> 4; */\n\tint flg = stbi__zget8(a);\n\tif ((cmf * 256 + flg) % 31 != 0) return stbi__err(\"bad zlib header\", \"Corrupt PNG\"); // zlib spec\n\tif (flg & 32) return stbi__err(\"no preset dict\", \"Corrupt PNG\"); // preset dictionary not allowed in png\n\tif (cm != 8) return stbi__err(\"bad compression\", \"Corrupt PNG\"); // DEFLATE required for png\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t // window = 1 << (8 + cinfo)... but who cares, we fully buffer output\n\treturn 1;\n}\n\nstatic const stbi_uc stbi__zdefault_length[288] =\n{\n\t8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n\t8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n\t8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n\t8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n\t8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n\t9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n\t9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n\t9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\n\t7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8\n};\nstatic const stbi_uc stbi__zdefault_distance[32] =\n{\n\t5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5\n};\n/*\nInit algorithm:\n{\nint i;   // use <= to match clearly with spec\nfor (i=0; i <= 143; ++i)     stbi__zdefault_length[i]   = 8;\nfor (   ; i <= 255; ++i)     stbi__zdefault_length[i]   = 9;\nfor (   ; i <= 279; ++i)     stbi__zdefault_length[i]   = 7;\nfor (   ; i <= 287; ++i)     stbi__zdefault_length[i]   = 8;\nfor (i=0; i <=  31; ++i)     stbi__zdefault_distance[i] = 5;\n}\n*/\n\nstatic int stbi__parse_zlib(stbi__zbuf *a, int parse_header)\n{\n\tint final, type;\n\tif (parse_header)\n\t\tif (!stbi__parse_zlib_header(a)) return 0;\n\ta->num_bits = 0;\n\ta->code_buffer = 0;\n\tdo {\n\t\tfinal = stbi__zreceive(a, 1);\n\t\ttype = stbi__zreceive(a, 2);\n\t\tif (type == 0) {\n\t\t\tif (!stbi__parse_uncompressed_block(a)) return 0;\n\t\t}\n\t\telse if (type == 3) {\n\t\t\treturn 0;\n\t\t}\n\t\telse {\n\t\t\tif (type == 1) {\n\t\t\t\t// use fixed code lengths\n\t\t\t\tif (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, 288)) return 0;\n\t\t\t\tif (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!stbi__compute_huffman_codes(a)) return 0;\n\t\t\t}\n\t\t\tif (!stbi__parse_huffman_block(a)) return 0;\n\t\t}\n\t} while (!final);\n\treturn 1;\n}\n\nstatic int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)\n{\n\ta->zout_start = obuf;\n\ta->zout = obuf;\n\ta->zout_end = obuf + olen;\n\ta->z_expandable = exp;\n\n\treturn stbi__parse_zlib(a, parse_header);\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)\n{\n\tstbi__zbuf a;\n\tchar *p = (char *)stbi__malloc(initial_size);\n\tif (p == NULL) return NULL;\n\ta.zbuffer = (stbi_uc *)buffer;\n\ta.zbuffer_end = (stbi_uc *)buffer + len;\n\tif (stbi__do_zlib(&a, p, initial_size, 1, 1)) {\n\t\tif (outlen) *outlen = (int)(a.zout - a.zout_start);\n\t\treturn a.zout_start;\n\t}\n\telse {\n\t\tSTBI_FREE(a.zout_start);\n\t\treturn NULL;\n\t}\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)\n{\n\treturn stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)\n{\n\tstbi__zbuf a;\n\tchar *p = (char *)stbi__malloc(initial_size);\n\tif (p == NULL) return NULL;\n\ta.zbuffer = (stbi_uc *)buffer;\n\ta.zbuffer_end = (stbi_uc *)buffer + len;\n\tif (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {\n\t\tif (outlen) *outlen = (int)(a.zout - a.zout_start);\n\t\treturn a.zout_start;\n\t}\n\telse {\n\t\tSTBI_FREE(a.zout_start);\n\t\treturn NULL;\n\t}\n}\n\nSTBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)\n{\n\tstbi__zbuf a;\n\ta.zbuffer = (stbi_uc *)ibuffer;\n\ta.zbuffer_end = (stbi_uc *)ibuffer + ilen;\n\tif (stbi__do_zlib(&a, obuffer, olen, 0, 1))\n\t\treturn (int)(a.zout - a.zout_start);\n\telse\n\t\treturn -1;\n}\n\nSTBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)\n{\n\tstbi__zbuf a;\n\tchar *p = (char *)stbi__malloc(16384);\n\tif (p == NULL) return NULL;\n\ta.zbuffer = (stbi_uc *)buffer;\n\ta.zbuffer_end = (stbi_uc *)buffer + len;\n\tif (stbi__do_zlib(&a, p, 16384, 1, 0)) {\n\t\tif (outlen) *outlen = (int)(a.zout - a.zout_start);\n\t\treturn a.zout_start;\n\t}\n\telse {\n\t\tSTBI_FREE(a.zout_start);\n\t\treturn NULL;\n\t}\n}\n\nSTBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)\n{\n\tstbi__zbuf a;\n\ta.zbuffer = (stbi_uc *)ibuffer;\n\ta.zbuffer_end = (stbi_uc *)ibuffer + ilen;\n\tif (stbi__do_zlib(&a, obuffer, olen, 0, 0))\n\t\treturn (int)(a.zout - a.zout_start);\n\telse\n\t\treturn -1;\n}\n#endif\n\n// public domain \"baseline\" PNG decoder   v0.10  Sean Barrett 2006-11-18\n//    simple implementation\n//      - only 8-bit samples\n//      - no CRC checking\n//      - allocates lots of intermediate memory\n//        - avoids problem of streaming data between subsystems\n//        - avoids explicit window management\n//    performance\n//      - uses stb_zlib, a PD zlib implementation with fast huffman decoding\n\n#ifndef STBI_NO_PNG\ntypedef struct\n{\n\tstbi__uint32 length;\n\tstbi__uint32 type;\n} stbi__pngchunk;\n\nstatic stbi__pngchunk stbi__get_chunk_header(stbi__context *s)\n{\n\tstbi__pngchunk c;\n\tc.length = stbi__get32be(s);\n\tc.type = stbi__get32be(s);\n\treturn c;\n}\n\nstatic int stbi__check_png_header(stbi__context *s)\n{\n\tstatic stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };\n\tint i;\n\tfor (i = 0; i < 8; ++i)\n\t\tif (stbi__get8(s) != png_sig[i]) return stbi__err(\"bad png sig\", \"Not a PNG\");\n\treturn 1;\n}\n\ntypedef struct\n{\n\tstbi__context *s;\n\tstbi_uc *idata, *expanded, *out;\n\tint depth;\n} stbi__png;\n\n\nenum {\n\tSTBI__F_none = 0,\n\tSTBI__F_sub = 1,\n\tSTBI__F_up = 2,\n\tSTBI__F_avg = 3,\n\tSTBI__F_paeth = 4,\n\t// synthetic filters used for first scanline to avoid needing a dummy row of 0s\n\tSTBI__F_avg_first,\n\tSTBI__F_paeth_first\n};\n\nstatic stbi_uc first_row_filter[5] =\n{\n\tSTBI__F_none,\n\tSTBI__F_sub,\n\tSTBI__F_none,\n\tSTBI__F_avg_first,\n\tSTBI__F_paeth_first\n};\n\nstatic int stbi__paeth(int a, int b, int c)\n{\n\tint p = a + b - c;\n\tint pa = abs(p - a);\n\tint pb = abs(p - b);\n\tint pc = abs(p - c);\n\tif (pa <= pb && pa <= pc) return a;\n\tif (pb <= pc) return b;\n\treturn c;\n}\n\nstatic stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };\n\n// create the png data from post-deflated data\nstatic int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)\n{\n\tint bytes = (depth == 16 ? 2 : 1);\n\tstbi__context *s = a->s;\n\tstbi__uint32 i, j, stride = x*out_n*bytes;\n\tstbi__uint32 img_len, img_width_bytes;\n\tint k;\n\tint img_n = s->img_n; // copy it into a local for later\n\n\tint output_bytes = out_n*bytes;\n\tint filter_bytes = img_n*bytes;\n\tint width = x;\n\n\tSTBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1);\n\ta->out = (stbi_uc *)stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into\n\tif (!a->out) return stbi__err(\"outofmem\", \"Out of memory\");\n\n\timg_width_bytes = (((img_n * x * depth) + 7) >> 3);\n\timg_len = (img_width_bytes + 1) * y;\n\t// we used to check for exact match between raw_len and img_len on non-interlaced PNGs,\n\t// but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),\n\t// so just check for raw_len < img_len always.\n\tif (raw_len < img_len) return stbi__err(\"not enough pixels\", \"Corrupt PNG\");\n\n\tfor (j = 0; j < y; ++j) {\n\t\tstbi_uc *cur = a->out + stride*j;\n\t\tstbi_uc *prior;\n\t\tint filter = *raw++;\n\n\t\tif (filter > 4)\n\t\t\treturn stbi__err(\"invalid filter\", \"Corrupt PNG\");\n\n\t\tif (depth < 8) {\n\t\t\tSTBI_ASSERT(img_width_bytes <= x);\n\t\t\tcur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place\n\t\t\tfilter_bytes = 1;\n\t\t\twidth = img_width_bytes;\n\t\t}\n\t\tprior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above\n\n\t\t\t\t\t\t\t  // if first row, use special filter that doesn't sample previous row\n\t\tif (j == 0) filter = first_row_filter[filter];\n\n\t\t// handle first byte explicitly\n\t\tfor (k = 0; k < filter_bytes; ++k) {\n\t\t\tswitch (filter) {\n\t\t\tcase STBI__F_none: cur[k] = raw[k]; break;\n\t\t\tcase STBI__F_sub: cur[k] = raw[k]; break;\n\t\t\tcase STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;\n\t\t\tcase STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1)); break;\n\t\t\tcase STBI__F_paeth: cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0)); break;\n\t\t\tcase STBI__F_avg_first: cur[k] = raw[k]; break;\n\t\t\tcase STBI__F_paeth_first: cur[k] = raw[k]; break;\n\t\t\t}\n\t\t}\n\n\t\tif (depth == 8) {\n\t\t\tif (img_n != out_n)\n\t\t\t\tcur[img_n] = 255; // first pixel\n\t\t\traw += img_n;\n\t\t\tcur += out_n;\n\t\t\tprior += out_n;\n\t\t}\n\t\telse if (depth == 16) {\n\t\t\tif (img_n != out_n) {\n\t\t\t\tcur[filter_bytes] = 255; // first pixel top byte\n\t\t\t\tcur[filter_bytes + 1] = 255; // first pixel bottom byte\n\t\t\t}\n\t\t\traw += filter_bytes;\n\t\t\tcur += output_bytes;\n\t\t\tprior += output_bytes;\n\t\t}\n\t\telse {\n\t\t\traw += 1;\n\t\t\tcur += 1;\n\t\t\tprior += 1;\n\t\t}\n\n\t\t// this is a little gross, so that we don't switch per-pixel or per-component\n\t\tif (depth < 8 || img_n == out_n) {\n\t\t\tint nk = (width - 1)*filter_bytes;\n#define STBI__CASE(f) \\\n             case f:     \\\n                for (k=0; k < nk; ++k)\n\t\t\tswitch (filter) {\n\t\t\t\t// \"none\" filter turns into a memcpy here; make that explicit.\n\t\t\tcase STBI__F_none:         memcpy(cur, raw, nk); break;\n\t\t\t\tSTBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); } break;\n\t\t\t\tSTBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;\n\t\t\t\tSTBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); } break;\n\t\t\t\tSTBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); } break;\n\t\t\t\tSTBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); } break;\n\t\t\t\tSTBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0)); } break;\n\t\t\t}\n#undef STBI__CASE\n\t\t\traw += nk;\n\t\t}\n\t\telse {\n\t\t\tSTBI_ASSERT(img_n + 1 == out_n);\n#define STBI__CASE(f) \\\n             case f:     \\\n                for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \\\n                   for (k=0; k < filter_bytes; ++k)\n\t\t\tswitch (filter) {\n\t\t\t\tSTBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break;\n\t\t\t\tSTBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - output_bytes]); } break;\n\t\t\t\tSTBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;\n\t\t\t\tSTBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - output_bytes]) >> 1)); } break;\n\t\t\t\tSTBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], prior[k], prior[k - output_bytes])); } break;\n\t\t\t\tSTBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - output_bytes] >> 1)); } break;\n\t\t\t\tSTBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], 0, 0)); } break;\n\t\t\t}\n#undef STBI__CASE\n\n\t\t\t// the loop above sets the high byte of the pixels' alpha, but for\n\t\t\t// 16 bit png files we also need the low byte set. we'll do that here.\n\t\t\tif (depth == 16) {\n\t\t\t\tcur = a->out + stride*j; // start at the beginning of the row again\n\t\t\t\tfor (i = 0; i < x; ++i, cur += output_bytes) {\n\t\t\t\t\tcur[filter_bytes + 1] = 255;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// we make a separate pass to expand bits to pixels; for performance,\n\t// this could run two scanlines behind the above code, so it won't\n\t// intefere with filtering but will still be in the cache.\n\tif (depth < 8) {\n\t\tfor (j = 0; j < y; ++j) {\n\t\t\tstbi_uc *cur = a->out + stride*j;\n\t\t\tstbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;\n\t\t\t// unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit\n\t\t\t// png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop\n\t\t\tstbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // note that the final byte might overshoot and write more data than desired.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // we can allocate enough data that this never writes out of memory, but it\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // could also overwrite the next scanline. can it overwrite non-empty data\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // so we need to explicitly clamp the final ones\n\n\t\t\tif (depth == 4) {\n\t\t\t\tfor (k = x*img_n; k >= 2; k -= 2, ++in) {\n\t\t\t\t\t*cur++ = scale * ((*in >> 4));\n\t\t\t\t\t*cur++ = scale * ((*in) & 0x0f);\n\t\t\t\t}\n\t\t\t\tif (k > 0) *cur++ = scale * ((*in >> 4));\n\t\t\t}\n\t\t\telse if (depth == 2) {\n\t\t\t\tfor (k = x*img_n; k >= 4; k -= 4, ++in) {\n\t\t\t\t\t*cur++ = scale * ((*in >> 6));\n\t\t\t\t\t*cur++ = scale * ((*in >> 4) & 0x03);\n\t\t\t\t\t*cur++ = scale * ((*in >> 2) & 0x03);\n\t\t\t\t\t*cur++ = scale * ((*in) & 0x03);\n\t\t\t\t}\n\t\t\t\tif (k > 0) *cur++ = scale * ((*in >> 6));\n\t\t\t\tif (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);\n\t\t\t\tif (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);\n\t\t\t}\n\t\t\telse if (depth == 1) {\n\t\t\t\tfor (k = x*img_n; k >= 8; k -= 8, ++in) {\n\t\t\t\t\t*cur++ = scale * ((*in >> 7));\n\t\t\t\t\t*cur++ = scale * ((*in >> 6) & 0x01);\n\t\t\t\t\t*cur++ = scale * ((*in >> 5) & 0x01);\n\t\t\t\t\t*cur++ = scale * ((*in >> 4) & 0x01);\n\t\t\t\t\t*cur++ = scale * ((*in >> 3) & 0x01);\n\t\t\t\t\t*cur++ = scale * ((*in >> 2) & 0x01);\n\t\t\t\t\t*cur++ = scale * ((*in >> 1) & 0x01);\n\t\t\t\t\t*cur++ = scale * ((*in) & 0x01);\n\t\t\t\t}\n\t\t\t\tif (k > 0) *cur++ = scale * ((*in >> 7));\n\t\t\t\tif (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);\n\t\t\t\tif (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);\n\t\t\t\tif (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);\n\t\t\t\tif (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);\n\t\t\t\tif (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);\n\t\t\t\tif (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);\n\t\t\t}\n\t\t\tif (img_n != out_n) {\n\t\t\t\tint q;\n\t\t\t\t// insert alpha = 255\n\t\t\t\tcur = a->out + stride*j;\n\t\t\t\tif (img_n == 1) {\n\t\t\t\t\tfor (q = x - 1; q >= 0; --q) {\n\t\t\t\t\t\tcur[q * 2 + 1] = 255;\n\t\t\t\t\t\tcur[q * 2 + 0] = cur[q];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tSTBI_ASSERT(img_n == 3);\n\t\t\t\t\tfor (q = x - 1; q >= 0; --q) {\n\t\t\t\t\t\tcur[q * 4 + 3] = 255;\n\t\t\t\t\t\tcur[q * 4 + 2] = cur[q * 3 + 2];\n\t\t\t\t\t\tcur[q * 4 + 1] = cur[q * 3 + 1];\n\t\t\t\t\t\tcur[q * 4 + 0] = cur[q * 3 + 0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (depth == 16) {\n\t\t// force the image data from big-endian to platform-native.\n\t\t// this is done in a separate pass due to the decoding relying\n\t\t// on the data being untouched, but could probably be done\n\t\t// per-line during decode if care is taken.\n\t\tstbi_uc *cur = a->out;\n\t\tstbi__uint16 *cur16 = (stbi__uint16*)cur;\n\n\t\tfor (i = 0; i < x*y*out_n; ++i, cur16++, cur += 2) {\n\t\t\t*cur16 = (cur[0] << 8) | cur[1];\n\t\t}\n\t}\n\n\treturn 1;\n}\n\nstatic int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)\n{\n\tint bytes = (depth == 16 ? 2 : 1);\n\tint out_bytes = out_n * bytes;\n\tstbi_uc *final;\n\tint p;\n\tif (!interlaced)\n\t\treturn stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);\n\n\t// de-interlacing\n\tfinal = (stbi_uc *)stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);\n\tfor (p = 0; p < 7; ++p) {\n\t\tint xorig[] = { 0,4,0,2,0,1,0 };\n\t\tint yorig[] = { 0,0,4,0,2,0,1 };\n\t\tint xspc[] = { 8,8,4,4,2,2,1 };\n\t\tint yspc[] = { 8,8,8,4,4,2,2 };\n\t\tint i, j, x, y;\n\t\t// pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1\n\t\tx = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p];\n\t\ty = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p];\n\t\tif (x && y) {\n\t\t\tstbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;\n\t\t\tif (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {\n\t\t\t\tSTBI_FREE(final);\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tfor (j = 0; j < y; ++j) {\n\t\t\t\tfor (i = 0; i < x; ++i) {\n\t\t\t\t\tint out_y = j*yspc[p] + yorig[p];\n\t\t\t\t\tint out_x = i*xspc[p] + xorig[p];\n\t\t\t\t\tmemcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,\n\t\t\t\t\t\ta->out + (j*x + i)*out_bytes, out_bytes);\n\t\t\t\t}\n\t\t\t}\n\t\t\tSTBI_FREE(a->out);\n\t\t\timage_data += img_len;\n\t\t\timage_data_len -= img_len;\n\t\t}\n\t}\n\ta->out = final;\n\n\treturn 1;\n}\n\nstatic int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)\n{\n\tstbi__context *s = z->s;\n\tstbi__uint32 i, pixel_count = s->img_x * s->img_y;\n\tstbi_uc *p = z->out;\n\n\t// compute color-based transparency, assuming we've\n\t// already got 255 as the alpha value in the output\n\tSTBI_ASSERT(out_n == 2 || out_n == 4);\n\n\tif (out_n == 2) {\n\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\tp[1] = (p[0] == tc[0] ? 0 : 255);\n\t\t\tp += 2;\n\t\t}\n\t}\n\telse {\n\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\tif (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])\n\t\t\t\tp[3] = 0;\n\t\t\tp += 4;\n\t\t}\n\t}\n\treturn 1;\n}\n\nstatic int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)\n{\n\tstbi__context *s = z->s;\n\tstbi__uint32 i, pixel_count = s->img_x * s->img_y;\n\tstbi__uint16 *p = (stbi__uint16*)z->out;\n\n\t// compute color-based transparency, assuming we've\n\t// already got 65535 as the alpha value in the output\n\tSTBI_ASSERT(out_n == 2 || out_n == 4);\n\n\tif (out_n == 2) {\n\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\tp[1] = (p[0] == tc[0] ? 0 : 65535);\n\t\t\tp += 2;\n\t\t}\n\t}\n\telse {\n\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\tif (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])\n\t\t\t\tp[3] = 0;\n\t\t\tp += 4;\n\t\t}\n\t}\n\treturn 1;\n}\n\nstatic int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)\n{\n\tstbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;\n\tstbi_uc *p, *temp_out, *orig = a->out;\n\n\tp = (stbi_uc *)stbi__malloc_mad2(pixel_count, pal_img_n, 0);\n\tif (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n\n\t// between here and free(out) below, exitting would leak\n\ttemp_out = p;\n\n\tif (pal_img_n == 3) {\n\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\tint n = orig[i] * 4;\n\t\t\tp[0] = palette[n];\n\t\t\tp[1] = palette[n + 1];\n\t\t\tp[2] = palette[n + 2];\n\t\t\tp += 3;\n\t\t}\n\t}\n\telse {\n\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\tint n = orig[i] * 4;\n\t\t\tp[0] = palette[n];\n\t\t\tp[1] = palette[n + 1];\n\t\t\tp[2] = palette[n + 2];\n\t\t\tp[3] = palette[n + 3];\n\t\t\tp += 4;\n\t\t}\n\t}\n\tSTBI_FREE(a->out);\n\ta->out = temp_out;\n\n\tSTBI_NOTUSED(len);\n\n\treturn 1;\n}\n\nstatic int stbi__unpremultiply_on_load = 0;\nstatic int stbi__de_iphone_flag = 0;\n\nSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)\n{\n\tstbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;\n}\n\nSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)\n{\n\tstbi__de_iphone_flag = flag_true_if_should_convert;\n}\n\nstatic void stbi__de_iphone(stbi__png *z)\n{\n\tstbi__context *s = z->s;\n\tstbi__uint32 i, pixel_count = s->img_x * s->img_y;\n\tstbi_uc *p = z->out;\n\n\tif (s->img_out_n == 3) {  // convert bgr to rgb\n\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\tstbi_uc t = p[0];\n\t\t\tp[0] = p[2];\n\t\t\tp[2] = t;\n\t\t\tp += 3;\n\t\t}\n\t}\n\telse {\n\t\tSTBI_ASSERT(s->img_out_n == 4);\n\t\tif (stbi__unpremultiply_on_load) {\n\t\t\t// convert bgr to rgb and unpremultiply\n\t\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\t\tstbi_uc a = p[3];\n\t\t\t\tstbi_uc t = p[0];\n\t\t\t\tif (a) {\n\t\t\t\t\tstbi_uc half = a / 2;\n\t\t\t\t\tp[0] = (p[2] * 255 + half) / a;\n\t\t\t\t\tp[1] = (p[1] * 255 + half) / a;\n\t\t\t\t\tp[2] = (t * 255 + half) / a;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tp[0] = p[2];\n\t\t\t\t\tp[2] = t;\n\t\t\t\t}\n\t\t\t\tp += 4;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// convert bgr to rgb\n\t\t\tfor (i = 0; i < pixel_count; ++i) {\n\t\t\t\tstbi_uc t = p[0];\n\t\t\t\tp[0] = p[2];\n\t\t\t\tp[2] = t;\n\t\t\t\tp += 4;\n\t\t\t}\n\t\t}\n\t}\n}\n\n#define STBI__PNG_TYPE(a,b,c,d)  (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))\n\nstatic int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)\n{\n\tstbi_uc palette[1024], pal_img_n = 0;\n\tstbi_uc has_trans = 0, tc[3];\n\tstbi__uint16 tc16[3];\n\tstbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0;\n\tint first = 1, k, interlace = 0, color = 0, is_iphone = 0;\n\tstbi__context *s = z->s;\n\n\tz->expanded = NULL;\n\tz->idata = NULL;\n\tz->out = NULL;\n\n\tif (!stbi__check_png_header(s)) return 0;\n\n\tif (scan == STBI__SCAN_type) return 1;\n\n\tfor (;;) {\n\t\tstbi__pngchunk c = stbi__get_chunk_header(s);\n\t\tswitch (c.type) {\n\t\tcase STBI__PNG_TYPE('C', 'g', 'B', 'I'):\n\t\t\tis_iphone = 1;\n\t\t\tstbi__skip(s, c.length);\n\t\t\tbreak;\n\t\tcase STBI__PNG_TYPE('I', 'H', 'D', 'R'): {\n\t\t\tint comp, filter;\n\t\t\tif (!first) return stbi__err(\"multiple IHDR\", \"Corrupt PNG\");\n\t\t\tfirst = 0;\n\t\t\tif (c.length != 13) return stbi__err(\"bad IHDR len\", \"Corrupt PNG\");\n\t\t\ts->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err(\"too large\", \"Very large image (corrupt?)\");\n\t\t\ts->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err(\"too large\", \"Very large image (corrupt?)\");\n\t\t\tz->depth = stbi__get8(s);  if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)  return stbi__err(\"1/2/4/8/16-bit only\", \"PNG not supported: 1/2/4/8/16-bit only\");\n\t\t\tcolor = stbi__get8(s);  if (color > 6)         return stbi__err(\"bad ctype\", \"Corrupt PNG\");\n\t\t\tif (color == 3 && z->depth == 16)                  return stbi__err(\"bad ctype\", \"Corrupt PNG\");\n\t\t\tif (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err(\"bad ctype\", \"Corrupt PNG\");\n\t\t\tcomp = stbi__get8(s);  if (comp) return stbi__err(\"bad comp method\", \"Corrupt PNG\");\n\t\t\tfilter = stbi__get8(s);  if (filter) return stbi__err(\"bad filter method\", \"Corrupt PNG\");\n\t\t\tinterlace = stbi__get8(s); if (interlace>1) return stbi__err(\"bad interlace method\", \"Corrupt PNG\");\n\t\t\tif (!s->img_x || !s->img_y) return stbi__err(\"0-pixel image\", \"Corrupt PNG\");\n\t\t\tif (!pal_img_n) {\n\t\t\t\ts->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);\n\t\t\t\tif ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err(\"too large\", \"Image too large to decode\");\n\t\t\t\tif (scan == STBI__SCAN_header) return 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// if paletted, then pal_n is our final components, and\n\t\t\t\t// img_n is # components to decompress/filter.\n\t\t\t\ts->img_n = 1;\n\t\t\t\tif ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err(\"too large\", \"Corrupt PNG\");\n\t\t\t\t// if SCAN_header, have to scan to see if we have a tRNS\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase STBI__PNG_TYPE('P', 'L', 'T', 'E'): {\n\t\t\tif (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n\t\t\tif (c.length > 256 * 3) return stbi__err(\"invalid PLTE\", \"Corrupt PNG\");\n\t\t\tpal_len = c.length / 3;\n\t\t\tif (pal_len * 3 != c.length) return stbi__err(\"invalid PLTE\", \"Corrupt PNG\");\n\t\t\tfor (i = 0; i < pal_len; ++i) {\n\t\t\t\tpalette[i * 4 + 0] = stbi__get8(s);\n\t\t\t\tpalette[i * 4 + 1] = stbi__get8(s);\n\t\t\t\tpalette[i * 4 + 2] = stbi__get8(s);\n\t\t\t\tpalette[i * 4 + 3] = 255;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase STBI__PNG_TYPE('t', 'R', 'N', 'S'): {\n\t\t\tif (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n\t\t\tif (z->idata) return stbi__err(\"tRNS after IDAT\", \"Corrupt PNG\");\n\t\t\tif (pal_img_n) {\n\t\t\t\tif (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }\n\t\t\t\tif (pal_len == 0) return stbi__err(\"tRNS before PLTE\", \"Corrupt PNG\");\n\t\t\t\tif (c.length > pal_len) return stbi__err(\"bad tRNS len\", \"Corrupt PNG\");\n\t\t\t\tpal_img_n = 4;\n\t\t\t\tfor (i = 0; i < c.length; ++i)\n\t\t\t\t\tpalette[i * 4 + 3] = stbi__get8(s);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!(s->img_n & 1)) return stbi__err(\"tRNS with alpha\", \"Corrupt PNG\");\n\t\t\t\tif (c.length != (stbi__uint32)s->img_n * 2) return stbi__err(\"bad tRNS len\", \"Corrupt PNG\");\n\t\t\t\thas_trans = 1;\n\t\t\t\tif (z->depth == 16) {\n\t\t\t\t\tfor (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase STBI__PNG_TYPE('I', 'D', 'A', 'T'): {\n\t\t\tif (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n\t\t\tif (pal_img_n && !pal_len) return stbi__err(\"no PLTE\", \"Corrupt PNG\");\n\t\t\tif (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; }\n\t\t\tif ((int)(ioff + c.length) < (int)ioff) return 0;\n\t\t\tif (ioff + c.length > idata_limit) {\n\t\t\t\tstbi__uint32 idata_limit_old = idata_limit;\n\t\t\t\tstbi_uc *p;\n\t\t\t\tif (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;\n\t\t\t\twhile (ioff + c.length > idata_limit)\n\t\t\t\t\tidata_limit *= 2;\n\t\t\t\tSTBI_NOTUSED(idata_limit_old);\n\t\t\t\tp = (stbi_uc *)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n\t\t\t\tz->idata = p;\n\t\t\t}\n\t\t\tif (!stbi__getn(s, z->idata + ioff, c.length)) return stbi__err(\"outofdata\", \"Corrupt PNG\");\n\t\t\tioff += c.length;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase STBI__PNG_TYPE('I', 'E', 'N', 'D'): {\n\t\t\tstbi__uint32 raw_len, bpl;\n\t\t\tif (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n\t\t\tif (scan != STBI__SCAN_load) return 1;\n\t\t\tif (z->idata == NULL) return stbi__err(\"no IDAT\", \"Corrupt PNG\");\n\t\t\t// initial guess for decoded data size to avoid unnecessary reallocs\n\t\t\tbpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component\n\t\t\traw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;\n\t\t\tz->expanded = (stbi_uc *)stbi_zlib_decode_malloc_guesssize_headerflag((char *)z->idata, ioff, raw_len, (int *)&raw_len, !is_iphone);\n\t\t\tif (z->expanded == NULL) return 0; // zlib should set error\n\t\t\tSTBI_FREE(z->idata); z->idata = NULL;\n\t\t\tif ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans)\n\t\t\t\ts->img_out_n = s->img_n + 1;\n\t\t\telse\n\t\t\t\ts->img_out_n = s->img_n;\n\t\t\tif (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;\n\t\t\tif (has_trans) {\n\t\t\t\tif (z->depth == 16) {\n\t\t\t\t\tif (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)\n\t\t\t\tstbi__de_iphone(z);\n\t\t\tif (pal_img_n) {\n\t\t\t\t// pal_img_n == 3 or 4\n\t\t\t\ts->img_n = pal_img_n; // record the actual colors we had\n\t\t\t\ts->img_out_n = pal_img_n;\n\t\t\t\tif (req_comp >= 3) s->img_out_n = req_comp;\n\t\t\t\tif (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (has_trans) {\n\t\t\t\t// non-paletted image with tRNS -> source image has (constant) alpha\n\t\t\t\t++s->img_n;\n\t\t\t}\n\t\t\tSTBI_FREE(z->expanded); z->expanded = NULL;\n\t\t\treturn 1;\n\t\t}\n\n\t\tdefault:\n\t\t\t// if critical, fail\n\t\t\tif (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n\t\t\tif ((c.type & (1 << 29)) == 0) {\n#ifndef STBI_NO_FAILURE_STRINGS\n\t\t\t\t// not threadsafe\n\t\t\t\tstatic char invalid_chunk[] = \"XXXX PNG chunk not known\";\n\t\t\t\tinvalid_chunk[0] = STBI__BYTECAST(c.type >> 24);\n\t\t\t\tinvalid_chunk[1] = STBI__BYTECAST(c.type >> 16);\n\t\t\t\tinvalid_chunk[2] = STBI__BYTECAST(c.type >> 8);\n\t\t\t\tinvalid_chunk[3] = STBI__BYTECAST(c.type >> 0);\n#endif\n\t\t\t\treturn stbi__err(invalid_chunk, \"PNG not supported: unknown PNG chunk type\");\n\t\t\t}\n\t\t\tstbi__skip(s, c.length);\n\t\t\tbreak;\n\t\t}\n\t\t// end of PNG chunk, read and skip CRC\n\t\tstbi__get32be(s);\n\t}\n}\n\nstatic void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)\n{\n\tvoid *result = NULL;\n\tif (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\n\tif (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {\n\t\tif (p->depth < 8)\n\t\t\tri->bits_per_channel = 8;\n\t\telse\n\t\t\tri->bits_per_channel = p->depth;\n\t\tresult = p->out;\n\t\tp->out = NULL;\n\t\tif (req_comp && req_comp != p->s->img_out_n) {\n\t\t\tif (ri->bits_per_channel == 8)\n\t\t\t\tresult = stbi__convert_format((unsigned char *)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);\n\t\t\telse\n\t\t\t\tresult = stbi__convert_format16((stbi__uint16 *)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);\n\t\t\tp->s->img_out_n = req_comp;\n\t\t\tif (result == NULL) return result;\n\t\t}\n\t\t*x = p->s->img_x;\n\t\t*y = p->s->img_y;\n\t\tif (n) *n = p->s->img_n;\n\t}\n\tSTBI_FREE(p->out);      p->out = NULL;\n\tSTBI_FREE(p->expanded); p->expanded = NULL;\n\tSTBI_FREE(p->idata);    p->idata = NULL;\n\n\treturn result;\n}\n\nstatic void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n\tstbi__png p;\n\tp.s = s;\n\treturn stbi__do_png(&p, x, y, comp, req_comp, ri);\n}\n\nstatic int stbi__png_test(stbi__context *s)\n{\n\tint r;\n\tr = stbi__check_png_header(s);\n\tstbi__rewind(s);\n\treturn r;\n}\n\nstatic int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)\n{\n\tif (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {\n\t\tstbi__rewind(p->s);\n\t\treturn 0;\n\t}\n\tif (x) *x = p->s->img_x;\n\tif (y) *y = p->s->img_y;\n\tif (comp) *comp = p->s->img_n;\n\treturn 1;\n}\n\nstatic int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\tstbi__png p;\n\tp.s = s;\n\treturn stbi__png_info_raw(&p, x, y, comp);\n}\n#endif\n\n// Microsoft/Windows BMP image\n\n#ifndef STBI_NO_BMP\nstatic int stbi__bmp_test_raw(stbi__context *s)\n{\n\tint r;\n\tint sz;\n\tif (stbi__get8(s) != 'B') return 0;\n\tif (stbi__get8(s) != 'M') return 0;\n\tstbi__get32le(s); // discard filesize\n\tstbi__get16le(s); // discard reserved\n\tstbi__get16le(s); // discard reserved\n\tstbi__get32le(s); // discard data offset\n\tsz = stbi__get32le(s);\n\tr = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);\n\treturn r;\n}\n\nstatic int stbi__bmp_test(stbi__context *s)\n{\n\tint r = stbi__bmp_test_raw(s);\n\tstbi__rewind(s);\n\treturn r;\n}\n\n\n// returns 0..31 for the highest set bit\nstatic int stbi__high_bit(unsigned int z)\n{\n\tint n = 0;\n\tif (z == 0) return -1;\n\tif (z >= 0x10000) n += 16, z >>= 16;\n\tif (z >= 0x00100) n += 8, z >>= 8;\n\tif (z >= 0x00010) n += 4, z >>= 4;\n\tif (z >= 0x00004) n += 2, z >>= 2;\n\tif (z >= 0x00002) n += 1, z >>= 1;\n\treturn n;\n}\n\nstatic int stbi__bitcount(unsigned int a)\n{\n\ta = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2\n\ta = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4\n\ta = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits\n\ta = (a + (a >> 8)); // max 16 per 8 bits\n\ta = (a + (a >> 16)); // max 32 per 8 bits\n\treturn a & 0xff;\n}\n\nstatic int stbi__shiftsigned(int v, int shift, int bits)\n{\n\tint result;\n\tint z = 0;\n\n\tif (shift < 0) v <<= -shift;\n\telse v >>= shift;\n\tresult = v;\n\n\tz = bits;\n\twhile (z < 8) {\n\t\tresult += v >> z;\n\t\tz += bits;\n\t}\n\treturn result;\n}\n\ntypedef struct\n{\n\tint bpp, offset, hsz;\n\tunsigned int mr, mg, mb, ma, all_a;\n} stbi__bmp_data;\n\nstatic void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)\n{\n\tint hsz;\n\tif (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc(\"not BMP\", \"Corrupt BMP\");\n\tstbi__get32le(s); // discard filesize\n\tstbi__get16le(s); // discard reserved\n\tstbi__get16le(s); // discard reserved\n\tinfo->offset = stbi__get32le(s);\n\tinfo->hsz = hsz = stbi__get32le(s);\n\tinfo->mr = info->mg = info->mb = info->ma = 0;\n\n\tif (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc(\"unknown BMP\", \"BMP type not supported: unknown\");\n\tif (hsz == 12) {\n\t\ts->img_x = stbi__get16le(s);\n\t\ts->img_y = stbi__get16le(s);\n\t}\n\telse {\n\t\ts->img_x = stbi__get32le(s);\n\t\ts->img_y = stbi__get32le(s);\n\t}\n\tif (stbi__get16le(s) != 1) return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n\tinfo->bpp = stbi__get16le(s);\n\tif (info->bpp == 1) return stbi__errpuc(\"monochrome\", \"BMP type not supported: 1-bit\");\n\tif (hsz != 12) {\n\t\tint compress = stbi__get32le(s);\n\t\tif (compress == 1 || compress == 2) return stbi__errpuc(\"BMP RLE\", \"BMP type not supported: RLE\");\n\t\tstbi__get32le(s); // discard sizeof\n\t\tstbi__get32le(s); // discard hres\n\t\tstbi__get32le(s); // discard vres\n\t\tstbi__get32le(s); // discard colorsused\n\t\tstbi__get32le(s); // discard max important\n\t\tif (hsz == 40 || hsz == 56) {\n\t\t\tif (hsz == 56) {\n\t\t\t\tstbi__get32le(s);\n\t\t\t\tstbi__get32le(s);\n\t\t\t\tstbi__get32le(s);\n\t\t\t\tstbi__get32le(s);\n\t\t\t}\n\t\t\tif (info->bpp == 16 || info->bpp == 32) {\n\t\t\t\tif (compress == 0) {\n\t\t\t\t\tif (info->bpp == 32) {\n\t\t\t\t\t\tinfo->mr = 0xffu << 16;\n\t\t\t\t\t\tinfo->mg = 0xffu << 8;\n\t\t\t\t\t\tinfo->mb = 0xffu << 0;\n\t\t\t\t\t\tinfo->ma = 0xffu << 24;\n\t\t\t\t\t\tinfo->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tinfo->mr = 31u << 10;\n\t\t\t\t\t\tinfo->mg = 31u << 5;\n\t\t\t\t\t\tinfo->mb = 31u << 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (compress == 3) {\n\t\t\t\t\tinfo->mr = stbi__get32le(s);\n\t\t\t\t\tinfo->mg = stbi__get32le(s);\n\t\t\t\t\tinfo->mb = stbi__get32le(s);\n\t\t\t\t\t// not documented, but generated by photoshop and handled by mspaint\n\t\t\t\t\tif (info->mr == info->mg && info->mg == info->mb) {\n\t\t\t\t\t\t// ?!?!?\n\t\t\t\t\t\treturn stbi__errpuc(\"bad BMP\", \"bad BMP\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn stbi__errpuc(\"bad BMP\", \"bad BMP\");\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tint i;\n\t\t\tif (hsz != 108 && hsz != 124)\n\t\t\t\treturn stbi__errpuc(\"bad BMP\", \"bad BMP\");\n\t\t\tinfo->mr = stbi__get32le(s);\n\t\t\tinfo->mg = stbi__get32le(s);\n\t\t\tinfo->mb = stbi__get32le(s);\n\t\t\tinfo->ma = stbi__get32le(s);\n\t\t\tstbi__get32le(s); // discard color space\n\t\t\tfor (i = 0; i < 12; ++i)\n\t\t\t\tstbi__get32le(s); // discard color space parameters\n\t\t\tif (hsz == 124) {\n\t\t\t\tstbi__get32le(s); // discard rendering intent\n\t\t\t\tstbi__get32le(s); // discard offset of profile data\n\t\t\t\tstbi__get32le(s); // discard size of profile data\n\t\t\t\tstbi__get32le(s); // discard reserved\n\t\t\t}\n\t\t}\n\t}\n\treturn (void *)1;\n}\n\n\nstatic void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n\tstbi_uc *out;\n\tunsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a;\n\tstbi_uc pal[256][4];\n\tint psize = 0, i, j, width;\n\tint flip_vertically, pad, target;\n\tstbi__bmp_data info;\n\tSTBI_NOTUSED(ri);\n\n\tinfo.all_a = 255;\n\tif (stbi__bmp_parse_header(s, &info) == NULL)\n\t\treturn NULL; // error code already set\n\n\tflip_vertically = ((int)s->img_y) > 0;\n\ts->img_y = abs((int)s->img_y);\n\n\tmr = info.mr;\n\tmg = info.mg;\n\tmb = info.mb;\n\tma = info.ma;\n\tall_a = info.all_a;\n\n\tif (info.hsz == 12) {\n\t\tif (info.bpp < 24)\n\t\t\tpsize = (info.offset - 14 - 24) / 3;\n\t}\n\telse {\n\t\tif (info.bpp < 16)\n\t\t\tpsize = (info.offset - 14 - info.hsz) >> 2;\n\t}\n\n\ts->img_n = ma ? 4 : 3;\n\tif (req_comp && req_comp >= 3) // we can directly decode 3 or 4\n\t\ttarget = req_comp;\n\telse\n\t\ttarget = s->img_n; // if they want monochrome, we'll post-convert\n\n\t\t\t\t\t\t   // sanity-check size\n\tif (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))\n\t\treturn stbi__errpuc(\"too large\", \"Corrupt BMP\");\n\n\tout = (stbi_uc *)stbi__malloc_mad3(target, s->img_x, s->img_y, 0);\n\tif (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\tif (info.bpp < 16) {\n\t\tint z = 0;\n\t\tif (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc(\"invalid\", \"Corrupt BMP\"); }\n\t\tfor (i = 0; i < psize; ++i) {\n\t\t\tpal[i][2] = stbi__get8(s);\n\t\t\tpal[i][1] = stbi__get8(s);\n\t\t\tpal[i][0] = stbi__get8(s);\n\t\t\tif (info.hsz != 12) stbi__get8(s);\n\t\t\tpal[i][3] = 255;\n\t\t}\n\t\tstbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));\n\t\tif (info.bpp == 4) width = (s->img_x + 1) >> 1;\n\t\telse if (info.bpp == 8) width = s->img_x;\n\t\telse { STBI_FREE(out); return stbi__errpuc(\"bad bpp\", \"Corrupt BMP\"); }\n\t\tpad = (-width) & 3;\n\t\tfor (j = 0; j < (int)s->img_y; ++j) {\n\t\t\tfor (i = 0; i < (int)s->img_x; i += 2) {\n\t\t\t\tint v = stbi__get8(s), v2 = 0;\n\t\t\t\tif (info.bpp == 4) {\n\t\t\t\t\tv2 = v & 15;\n\t\t\t\t\tv >>= 4;\n\t\t\t\t}\n\t\t\t\tout[z++] = pal[v][0];\n\t\t\t\tout[z++] = pal[v][1];\n\t\t\t\tout[z++] = pal[v][2];\n\t\t\t\tif (target == 4) out[z++] = 255;\n\t\t\t\tif (i + 1 == (int)s->img_x) break;\n\t\t\t\tv = (info.bpp == 8) ? stbi__get8(s) : v2;\n\t\t\t\tout[z++] = pal[v][0];\n\t\t\t\tout[z++] = pal[v][1];\n\t\t\t\tout[z++] = pal[v][2];\n\t\t\t\tif (target == 4) out[z++] = 255;\n\t\t\t}\n\t\t\tstbi__skip(s, pad);\n\t\t}\n\t}\n\telse {\n\t\tint rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0;\n\t\tint z = 0;\n\t\tint easy = 0;\n\t\tstbi__skip(s, info.offset - 14 - info.hsz);\n\t\tif (info.bpp == 24) width = 3 * s->img_x;\n\t\telse if (info.bpp == 16) width = 2 * s->img_x;\n\t\telse /* bpp = 32 and pad = 0 */ width = 0;\n\t\tpad = (-width) & 3;\n\t\tif (info.bpp == 24) {\n\t\t\teasy = 1;\n\t\t}\n\t\telse if (info.bpp == 32) {\n\t\t\tif (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)\n\t\t\t\teasy = 2;\n\t\t}\n\t\tif (!easy) {\n\t\t\tif (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc(\"bad masks\", \"Corrupt BMP\"); }\n\t\t\t// right shift amt to put high bit in position #7\n\t\t\trshift = stbi__high_bit(mr) - 7; rcount = stbi__bitcount(mr);\n\t\t\tgshift = stbi__high_bit(mg) - 7; gcount = stbi__bitcount(mg);\n\t\t\tbshift = stbi__high_bit(mb) - 7; bcount = stbi__bitcount(mb);\n\t\t\tashift = stbi__high_bit(ma) - 7; acount = stbi__bitcount(ma);\n\t\t}\n\t\tfor (j = 0; j < (int)s->img_y; ++j) {\n\t\t\tif (easy) {\n\t\t\t\tfor (i = 0; i < (int)s->img_x; ++i) {\n\t\t\t\t\tunsigned char a;\n\t\t\t\t\tout[z + 2] = stbi__get8(s);\n\t\t\t\t\tout[z + 1] = stbi__get8(s);\n\t\t\t\t\tout[z + 0] = stbi__get8(s);\n\t\t\t\t\tz += 3;\n\t\t\t\t\ta = (easy == 2 ? stbi__get8(s) : 255);\n\t\t\t\t\tall_a |= a;\n\t\t\t\t\tif (target == 4) out[z++] = a;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tint bpp = info.bpp;\n\t\t\t\tfor (i = 0; i < (int)s->img_x; ++i) {\n\t\t\t\t\tstbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(s) : stbi__get32le(s));\n\t\t\t\t\tint a;\n\t\t\t\t\tout[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));\n\t\t\t\t\tout[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));\n\t\t\t\t\tout[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));\n\t\t\t\t\ta = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);\n\t\t\t\t\tall_a |= a;\n\t\t\t\t\tif (target == 4) out[z++] = STBI__BYTECAST(a);\n\t\t\t\t}\n\t\t\t}\n\t\t\tstbi__skip(s, pad);\n\t\t}\n\t}\n\n\t// if alpha channel is all 0s, replace with all 255s\n\tif (target == 4 && all_a == 0)\n\t\tfor (i = 4 * s->img_x*s->img_y - 1; i >= 0; i -= 4)\n\t\t\tout[i] = 255;\n\n\tif (flip_vertically) {\n\t\tstbi_uc t;\n\t\tfor (j = 0; j < (int)s->img_y >> 1; ++j) {\n\t\t\tstbi_uc *p1 = out + j     *s->img_x*target;\n\t\t\tstbi_uc *p2 = out + (s->img_y - 1 - j)*s->img_x*target;\n\t\t\tfor (i = 0; i < (int)s->img_x*target; ++i) {\n\t\t\t\tt = p1[i], p1[i] = p2[i], p2[i] = t;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (req_comp && req_comp != target) {\n\t\tout = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);\n\t\tif (out == NULL) return out; // stbi__convert_format frees input on failure\n\t}\n\n\t*x = s->img_x;\n\t*y = s->img_y;\n\tif (comp) *comp = s->img_n;\n\treturn out;\n}\n#endif\n\n// Targa Truevision - TGA\n// by Jonathan Dummer\n#ifndef STBI_NO_TGA\n// returns STBI_rgb or whatever, 0 on error\nstatic int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)\n{\n\t// only RGB or RGBA (incl. 16bit) or grey allowed\n\tif (is_rgb16) *is_rgb16 = 0;\n\tswitch (bits_per_pixel) {\n\tcase 8:  return STBI_grey;\n\tcase 16: if (is_grey) return STBI_grey_alpha;\n\t\t// else: fall-through\n\tcase 15: if (is_rgb16) *is_rgb16 = 1;\n\t\treturn STBI_rgb;\n\tcase 24: // fall-through\n\tcase 32: return bits_per_pixel / 8;\n\tdefault: return 0;\n\t}\n}\n\nstatic int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\tint tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;\n\tint sz, tga_colormap_type;\n\tstbi__get8(s);                   // discard Offset\n\ttga_colormap_type = stbi__get8(s); // colormap type\n\tif (tga_colormap_type > 1) {\n\t\tstbi__rewind(s);\n\t\treturn 0;      // only RGB or indexed allowed\n\t}\n\ttga_image_type = stbi__get8(s); // image type\n\tif (tga_colormap_type == 1) { // colormapped (paletted) image\n\t\tif (tga_image_type != 1 && tga_image_type != 9) {\n\t\t\tstbi__rewind(s);\n\t\t\treturn 0;\n\t\t}\n\t\tstbi__skip(s, 4);       // skip index of first colormap entry and number of entries\n\t\tsz = stbi__get8(s);    //   check bits per palette color entry\n\t\tif ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) {\n\t\t\tstbi__rewind(s);\n\t\t\treturn 0;\n\t\t}\n\t\tstbi__skip(s, 4);       // skip image x and y origin\n\t\ttga_colormap_bpp = sz;\n\t}\n\telse { // \"normal\" image w/o colormap - only RGB or grey allowed, +/- RLE\n\t\tif ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11)) {\n\t\t\tstbi__rewind(s);\n\t\t\treturn 0; // only RGB or grey allowed, +/- RLE\n\t\t}\n\t\tstbi__skip(s, 9); // skip colormap specification and image x/y origin\n\t\ttga_colormap_bpp = 0;\n\t}\n\ttga_w = stbi__get16le(s);\n\tif (tga_w < 1) {\n\t\tstbi__rewind(s);\n\t\treturn 0;   // test width\n\t}\n\ttga_h = stbi__get16le(s);\n\tif (tga_h < 1) {\n\t\tstbi__rewind(s);\n\t\treturn 0;   // test height\n\t}\n\ttga_bits_per_pixel = stbi__get8(s); // bits per pixel\n\tstbi__get8(s); // ignore alpha bits\n\tif (tga_colormap_bpp != 0) {\n\t\tif ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {\n\t\t\t// when using a colormap, tga_bits_per_pixel is the size of the indexes\n\t\t\t// I don't think anything but 8 or 16bit indexes makes sense\n\t\t\tstbi__rewind(s);\n\t\t\treturn 0;\n\t\t}\n\t\ttga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);\n\t}\n\telse {\n\t\ttga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);\n\t}\n\tif (!tga_comp) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\tif (x) *x = tga_w;\n\tif (y) *y = tga_h;\n\tif (comp) *comp = tga_comp;\n\treturn 1;                   // seems to have passed everything\n}\n\nstatic int stbi__tga_test(stbi__context *s)\n{\n\tint res = 0;\n\tint sz, tga_color_type;\n\tstbi__get8(s);      //   discard Offset\n\ttga_color_type = stbi__get8(s);   //   color type\n\tif (tga_color_type > 1) goto errorEnd;   //   only RGB or indexed allowed\n\tsz = stbi__get8(s);   //   image type\n\tif (tga_color_type == 1) { // colormapped (paletted) image\n\t\tif (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9\n\t\tstbi__skip(s, 4);       // skip index of first colormap entry and number of entries\n\t\tsz = stbi__get8(s);    //   check bits per palette color entry\n\t\tif ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) goto errorEnd;\n\t\tstbi__skip(s, 4);       // skip image x and y origin\n\t}\n\telse { // \"normal\" image w/o colormap\n\t\tif ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11)) goto errorEnd; // only RGB or grey allowed, +/- RLE\n\t\tstbi__skip(s, 9); // skip colormap specification and image x/y origin\n\t}\n\tif (stbi__get16le(s) < 1) goto errorEnd;      //   test width\n\tif (stbi__get16le(s) < 1) goto errorEnd;      //   test height\n\tsz = stbi__get8(s);   //   bits per pixel\n\tif ((tga_color_type == 1) && (sz != 8) && (sz != 16)) goto errorEnd; // for colormapped images, bpp is size of an index\n\tif ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) goto errorEnd;\n\n\tres = 1; // if we got this far, everything's good and we can return 1 instead of 0\n\nerrorEnd:\n\tstbi__rewind(s);\n\treturn res;\n}\n\n// read 16bit value and convert to 24bit RGB\nstatic void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)\n{\n\tstbi__uint16 px = (stbi__uint16)stbi__get16le(s);\n\tstbi__uint16 fiveBitMask = 31;\n\t// we have 3 channels with 5bits each\n\tint r = (px >> 10) & fiveBitMask;\n\tint g = (px >> 5) & fiveBitMask;\n\tint b = px & fiveBitMask;\n\t// Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later\n\tout[0] = (stbi_uc)((r * 255) / 31);\n\tout[1] = (stbi_uc)((g * 255) / 31);\n\tout[2] = (stbi_uc)((b * 255) / 31);\n\n\t// some people claim that the most significant bit might be used for alpha\n\t// (possibly if an alpha-bit is set in the \"image descriptor byte\")\n\t// but that only made 16bit test images completely translucent..\n\t// so let's treat all 15 and 16bit TGAs as RGB with no alpha.\n}\n\nstatic void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n\t//   read in the TGA header stuff\n\tint tga_offset = stbi__get8(s);\n\tint tga_indexed = stbi__get8(s);\n\tint tga_image_type = stbi__get8(s);\n\tint tga_is_RLE = 0;\n\tint tga_palette_start = stbi__get16le(s);\n\tint tga_palette_len = stbi__get16le(s);\n\tint tga_palette_bits = stbi__get8(s);\n\tint tga_x_origin = stbi__get16le(s);\n\tint tga_y_origin = stbi__get16le(s);\n\tint tga_width = stbi__get16le(s);\n\tint tga_height = stbi__get16le(s);\n\tint tga_bits_per_pixel = stbi__get8(s);\n\tint tga_comp, tga_rgb16 = 0;\n\tint tga_inverted = stbi__get8(s);\n\t// int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)\n\t//   image data\n\tunsigned char *tga_data;\n\tunsigned char *tga_palette = NULL;\n\tint i, j;\n\tunsigned char raw_data[4] = { 0 };\n\tint RLE_count = 0;\n\tint RLE_repeating = 0;\n\tint read_next_pixel = 1;\n\tSTBI_NOTUSED(ri);\n\n\t//   do a tiny bit of precessing\n\tif (tga_image_type >= 8)\n\t{\n\t\ttga_image_type -= 8;\n\t\ttga_is_RLE = 1;\n\t}\n\ttga_inverted = 1 - ((tga_inverted >> 5) & 1);\n\n\t//   If I'm paletted, then I'll use the number of bits from the palette\n\tif (tga_indexed) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);\n\telse tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);\n\n\tif (!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency\n\t\treturn stbi__errpuc(\"bad format\", \"Can't find out TGA pixelformat\");\n\n\t//   tga info\n\t*x = tga_width;\n\t*y = tga_height;\n\tif (comp) *comp = tga_comp;\n\n\tif (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))\n\t\treturn stbi__errpuc(\"too large\", \"Corrupt TGA\");\n\n\ttga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);\n\tif (!tga_data) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n\t// skip to the data's starting position (offset usually = 0)\n\tstbi__skip(s, tga_offset);\n\n\tif (!tga_indexed && !tga_is_RLE && !tga_rgb16) {\n\t\tfor (i = 0; i < tga_height; ++i) {\n\t\t\tint row = tga_inverted ? tga_height - i - 1 : i;\n\t\t\tstbi_uc *tga_row = tga_data + row*tga_width*tga_comp;\n\t\t\tstbi__getn(s, tga_row, tga_width * tga_comp);\n\t\t}\n\t}\n\telse {\n\t\t//   do I need to load a palette?\n\t\tif (tga_indexed)\n\t\t{\n\t\t\t//   any data to skip? (offset usually = 0)\n\t\t\tstbi__skip(s, tga_palette_start);\n\t\t\t//   load the palette\n\t\t\ttga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);\n\t\t\tif (!tga_palette) {\n\t\t\t\tSTBI_FREE(tga_data);\n\t\t\t\treturn stbi__errpuc(\"outofmem\", \"Out of memory\");\n\t\t\t}\n\t\t\tif (tga_rgb16) {\n\t\t\t\tstbi_uc *pal_entry = tga_palette;\n\t\t\t\tSTBI_ASSERT(tga_comp == STBI_rgb);\n\t\t\t\tfor (i = 0; i < tga_palette_len; ++i) {\n\t\t\t\t\tstbi__tga_read_rgb16(s, pal_entry);\n\t\t\t\t\tpal_entry += tga_comp;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {\n\t\t\t\tSTBI_FREE(tga_data);\n\t\t\t\tSTBI_FREE(tga_palette);\n\t\t\t\treturn stbi__errpuc(\"bad palette\", \"Corrupt TGA\");\n\t\t\t}\n\t\t}\n\t\t//   load the data\n\t\tfor (i = 0; i < tga_width * tga_height; ++i)\n\t\t{\n\t\t\t//   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?\n\t\t\tif (tga_is_RLE)\n\t\t\t{\n\t\t\t\tif (RLE_count == 0)\n\t\t\t\t{\n\t\t\t\t\t//   yep, get the next byte as a RLE command\n\t\t\t\t\tint RLE_cmd = stbi__get8(s);\n\t\t\t\t\tRLE_count = 1 + (RLE_cmd & 127);\n\t\t\t\t\tRLE_repeating = RLE_cmd >> 7;\n\t\t\t\t\tread_next_pixel = 1;\n\t\t\t\t}\n\t\t\t\telse if (!RLE_repeating)\n\t\t\t\t{\n\t\t\t\t\tread_next_pixel = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tread_next_pixel = 1;\n\t\t\t}\n\t\t\t//   OK, if I need to read a pixel, do it now\n\t\t\tif (read_next_pixel)\n\t\t\t{\n\t\t\t\t//   load however much data we did have\n\t\t\t\tif (tga_indexed)\n\t\t\t\t{\n\t\t\t\t\t// read in index, then perform the lookup\n\t\t\t\t\tint pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);\n\t\t\t\t\tif (pal_idx >= tga_palette_len) {\n\t\t\t\t\t\t// invalid index\n\t\t\t\t\t\tpal_idx = 0;\n\t\t\t\t\t}\n\t\t\t\t\tpal_idx *= tga_comp;\n\t\t\t\t\tfor (j = 0; j < tga_comp; ++j) {\n\t\t\t\t\t\traw_data[j] = tga_palette[pal_idx + j];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (tga_rgb16) {\n\t\t\t\t\tSTBI_ASSERT(tga_comp == STBI_rgb);\n\t\t\t\t\tstbi__tga_read_rgb16(s, raw_data);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t//   read in the data raw\n\t\t\t\t\tfor (j = 0; j < tga_comp; ++j) {\n\t\t\t\t\t\traw_data[j] = stbi__get8(s);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//   clear the reading flag for the next pixel\n\t\t\t\tread_next_pixel = 0;\n\t\t\t} // end of reading a pixel\n\n\t\t\t  // copy data\n\t\t\tfor (j = 0; j < tga_comp; ++j)\n\t\t\t\ttga_data[i*tga_comp + j] = raw_data[j];\n\n\t\t\t//   in case we're in RLE mode, keep counting down\n\t\t\t--RLE_count;\n\t\t}\n\t\t//   do I need to invert the image?\n\t\tif (tga_inverted)\n\t\t{\n\t\t\tfor (j = 0; j * 2 < tga_height; ++j)\n\t\t\t{\n\t\t\t\tint index1 = j * tga_width * tga_comp;\n\t\t\t\tint index2 = (tga_height - 1 - j) * tga_width * tga_comp;\n\t\t\t\tfor (i = tga_width * tga_comp; i > 0; --i)\n\t\t\t\t{\n\t\t\t\t\tunsigned char temp = tga_data[index1];\n\t\t\t\t\ttga_data[index1] = tga_data[index2];\n\t\t\t\t\ttga_data[index2] = temp;\n\t\t\t\t\t++index1;\n\t\t\t\t\t++index2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//   clear my palette, if I had one\n\t\tif (tga_palette != NULL)\n\t\t{\n\t\t\tSTBI_FREE(tga_palette);\n\t\t}\n\t}\n\n\t// swap RGB - if the source data was RGB16, it already is in the right order\n\tif (tga_comp >= 3 && !tga_rgb16)\n\t{\n\t\tunsigned char* tga_pixel = tga_data;\n\t\tfor (i = 0; i < tga_width * tga_height; ++i)\n\t\t{\n\t\t\tunsigned char temp = tga_pixel[0];\n\t\t\ttga_pixel[0] = tga_pixel[2];\n\t\t\ttga_pixel[2] = temp;\n\t\t\ttga_pixel += tga_comp;\n\t\t}\n\t}\n\n\t// convert to target component count\n\tif (req_comp && req_comp != tga_comp)\n\t\ttga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);\n\n\t//   the things I do to get rid of an error message, and yet keep\n\t//   Microsoft's C compilers happy... [8^(\n\ttga_palette_start = tga_palette_len = tga_palette_bits =\n\t\ttga_x_origin = tga_y_origin = 0;\n\t//   OK, done\n\treturn tga_data;\n}\n#endif\n\n// *************************************************************************************************\n// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB\n\n#ifndef STBI_NO_PSD\nstatic int stbi__psd_test(stbi__context *s)\n{\n\tint r = (stbi__get32be(s) == 0x38425053);\n\tstbi__rewind(s);\n\treturn r;\n}\n\nstatic int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)\n{\n\tint count, nleft, len;\n\n\tcount = 0;\n\twhile ((nleft = pixelCount - count) > 0) {\n\t\tlen = stbi__get8(s);\n\t\tif (len == 128) {\n\t\t\t// No-op.\n\t\t}\n\t\telse if (len < 128) {\n\t\t\t// Copy next len+1 bytes literally.\n\t\t\tlen++;\n\t\t\tif (len > nleft) return 0; // corrupt data\n\t\t\tcount += len;\n\t\t\twhile (len) {\n\t\t\t\t*p = stbi__get8(s);\n\t\t\t\tp += 4;\n\t\t\t\tlen--;\n\t\t\t}\n\t\t}\n\t\telse if (len > 128) {\n\t\t\tstbi_uc   val;\n\t\t\t// Next -len+1 bytes in the dest are replicated from next source byte.\n\t\t\t// (Interpret len as a negative 8-bit int.)\n\t\t\tlen = 257 - len;\n\t\t\tif (len > nleft) return 0; // corrupt data\n\t\t\tval = stbi__get8(s);\n\t\t\tcount += len;\n\t\t\twhile (len) {\n\t\t\t\t*p = val;\n\t\t\t\tp += 4;\n\t\t\t\tlen--;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn 1;\n}\n\nstatic void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)\n{\n\tint pixelCount;\n\tint channelCount, compression;\n\tint channel, i;\n\tint bitdepth;\n\tint w, h;\n\tstbi_uc *out;\n\tSTBI_NOTUSED(ri);\n\n\t// Check identifier\n\tif (stbi__get32be(s) != 0x38425053)   // \"8BPS\"\n\t\treturn stbi__errpuc(\"not PSD\", \"Corrupt PSD image\");\n\n\t// Check file type version.\n\tif (stbi__get16be(s) != 1)\n\t\treturn stbi__errpuc(\"wrong version\", \"Unsupported version of PSD image\");\n\n\t// Skip 6 reserved bytes.\n\tstbi__skip(s, 6);\n\n\t// Read the number of channels (R, G, B, A, etc).\n\tchannelCount = stbi__get16be(s);\n\tif (channelCount < 0 || channelCount > 16)\n\t\treturn stbi__errpuc(\"wrong channel count\", \"Unsupported number of channels in PSD image\");\n\n\t// Read the rows and columns of the image.\n\th = stbi__get32be(s);\n\tw = stbi__get32be(s);\n\n\t// Make sure the depth is 8 bits.\n\tbitdepth = stbi__get16be(s);\n\tif (bitdepth != 8 && bitdepth != 16)\n\t\treturn stbi__errpuc(\"unsupported bit depth\", \"PSD bit depth is not 8 or 16 bit\");\n\n\t// Make sure the color mode is RGB.\n\t// Valid options are:\n\t//   0: Bitmap\n\t//   1: Grayscale\n\t//   2: Indexed color\n\t//   3: RGB color\n\t//   4: CMYK color\n\t//   7: Multichannel\n\t//   8: Duotone\n\t//   9: Lab color\n\tif (stbi__get16be(s) != 3)\n\t\treturn stbi__errpuc(\"wrong color format\", \"PSD is not in RGB color format\");\n\n\t// Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)\n\tstbi__skip(s, stbi__get32be(s));\n\n\t// Skip the image resources.  (resolution, pen tool paths, etc)\n\tstbi__skip(s, stbi__get32be(s));\n\n\t// Skip the reserved data.\n\tstbi__skip(s, stbi__get32be(s));\n\n\t// Find out if the data is compressed.\n\t// Known values:\n\t//   0: no compression\n\t//   1: RLE compressed\n\tcompression = stbi__get16be(s);\n\tif (compression > 1)\n\t\treturn stbi__errpuc(\"bad compression\", \"PSD has an unknown compression format\");\n\n\t// Check size\n\tif (!stbi__mad3sizes_valid(4, w, h, 0))\n\t\treturn stbi__errpuc(\"too large\", \"Corrupt PSD\");\n\n\t// Create the destination image.\n\n\tif (!compression && bitdepth == 16 && bpc == 16) {\n\t\tout = (stbi_uc *)stbi__malloc_mad3(8, w, h, 0);\n\t\tri->bits_per_channel = 16;\n\t}\n\telse\n\t\tout = (stbi_uc *)stbi__malloc(4 * w*h);\n\n\tif (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\tpixelCount = w*h;\n\n\t// Initialize the data to zero.\n\t//memset( out, 0, pixelCount * 4 );\n\n\t// Finally, the image data.\n\tif (compression) {\n\t\t// RLE as used by .PSD and .TIFF\n\t\t// Loop until you get the number of unpacked bytes you are expecting:\n\t\t//     Read the next source byte into n.\n\t\t//     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.\n\t\t//     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.\n\t\t//     Else if n is 128, noop.\n\t\t// Endloop\n\n\t\t// The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,\n\t\t// which we're going to just skip.\n\t\tstbi__skip(s, h * channelCount * 2);\n\n\t\t// Read the RLE data by channel.\n\t\tfor (channel = 0; channel < 4; channel++) {\n\t\t\tstbi_uc *p;\n\n\t\t\tp = out + channel;\n\t\t\tif (channel >= channelCount) {\n\t\t\t\t// Fill this channel with default data.\n\t\t\t\tfor (i = 0; i < pixelCount; i++, p += 4)\n\t\t\t\t\t*p = (channel == 3 ? 255 : 0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Read the RLE data.\n\t\t\t\tif (!stbi__psd_decode_rle(s, p, pixelCount)) {\n\t\t\t\t\tSTBI_FREE(out);\n\t\t\t\t\treturn stbi__errpuc(\"corrupt\", \"bad RLE data\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\telse {\n\t\t// We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)\n\t\t// where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.\n\n\t\t// Read the data by channel.\n\t\tfor (channel = 0; channel < 4; channel++) {\n\t\t\tif (channel >= channelCount) {\n\t\t\t\t// Fill this channel with default data.\n\t\t\t\tif (bitdepth == 16 && bpc == 16) {\n\t\t\t\t\tstbi__uint16 *q = ((stbi__uint16 *)out) + channel;\n\t\t\t\t\tstbi__uint16 val = channel == 3 ? 65535 : 0;\n\t\t\t\t\tfor (i = 0; i < pixelCount; i++, q += 4)\n\t\t\t\t\t\t*q = val;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstbi_uc *p = out + channel;\n\t\t\t\t\tstbi_uc val = channel == 3 ? 255 : 0;\n\t\t\t\t\tfor (i = 0; i < pixelCount; i++, p += 4)\n\t\t\t\t\t\t*p = val;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (ri->bits_per_channel == 16) {    // output bpc\n\t\t\t\t\tstbi__uint16 *q = ((stbi__uint16 *)out) + channel;\n\t\t\t\t\tfor (i = 0; i < pixelCount; i++, q += 4)\n\t\t\t\t\t\t*q = (stbi__uint16)stbi__get16be(s);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstbi_uc *p = out + channel;\n\t\t\t\t\tif (bitdepth == 16) {  // input bpc\n\t\t\t\t\t\tfor (i = 0; i < pixelCount; i++, p += 4)\n\t\t\t\t\t\t\t*p = (stbi_uc)(stbi__get16be(s) >> 8);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (i = 0; i < pixelCount; i++, p += 4)\n\t\t\t\t\t\t\t*p = stbi__get8(s);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// remove weird white matte from PSD\n\tif (channelCount >= 4) {\n\t\tif (ri->bits_per_channel == 16) {\n\t\t\tfor (i = 0; i < w*h; ++i) {\n\t\t\t\tstbi__uint16 *pixel = (stbi__uint16 *)out + 4 * i;\n\t\t\t\tif (pixel[3] != 0 && pixel[3] != 65535) {\n\t\t\t\t\tfloat a = pixel[3] / 65535.0f;\n\t\t\t\t\tfloat ra = 1.0f / a;\n\t\t\t\t\tfloat inv_a = 65535.0f * (1 - ra);\n\t\t\t\t\tpixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a);\n\t\t\t\t\tpixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a);\n\t\t\t\t\tpixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor (i = 0; i < w*h; ++i) {\n\t\t\t\tunsigned char *pixel = out + 4 * i;\n\t\t\t\tif (pixel[3] != 0 && pixel[3] != 255) {\n\t\t\t\t\tfloat a = pixel[3] / 255.0f;\n\t\t\t\t\tfloat ra = 1.0f / a;\n\t\t\t\t\tfloat inv_a = 255.0f * (1 - ra);\n\t\t\t\t\tpixel[0] = (unsigned char)(pixel[0] * ra + inv_a);\n\t\t\t\t\tpixel[1] = (unsigned char)(pixel[1] * ra + inv_a);\n\t\t\t\t\tpixel[2] = (unsigned char)(pixel[2] * ra + inv_a);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// convert to desired output format\n\tif (req_comp && req_comp != 4) {\n\t\tif (ri->bits_per_channel == 16)\n\t\t\tout = (stbi_uc *)stbi__convert_format16((stbi__uint16 *)out, 4, req_comp, w, h);\n\t\telse\n\t\t\tout = stbi__convert_format(out, 4, req_comp, w, h);\n\t\tif (out == NULL) return out; // stbi__convert_format frees input on failure\n\t}\n\n\tif (comp) *comp = 4;\n\t*y = h;\n\t*x = w;\n\n\treturn out;\n}\n#endif\n\n// *************************************************************************************************\n// Softimage PIC loader\n// by Tom Seddon\n//\n// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format\n// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/\n\n#ifndef STBI_NO_PIC\nstatic int stbi__pic_is4(stbi__context *s, const char *str)\n{\n\tint i;\n\tfor (i = 0; i<4; ++i)\n\t\tif (stbi__get8(s) != (stbi_uc)str[i])\n\t\t\treturn 0;\n\n\treturn 1;\n}\n\nstatic int stbi__pic_test_core(stbi__context *s)\n{\n\tint i;\n\n\tif (!stbi__pic_is4(s, \"\\x53\\x80\\xF6\\x34\"))\n\t\treturn 0;\n\n\tfor (i = 0; i<84; ++i)\n\t\tstbi__get8(s);\n\n\tif (!stbi__pic_is4(s, \"PICT\"))\n\t\treturn 0;\n\n\treturn 1;\n}\n\ntypedef struct\n{\n\tstbi_uc size, type, channel;\n} stbi__pic_packet;\n\nstatic stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)\n{\n\tint mask = 0x80, i;\n\n\tfor (i = 0; i<4; ++i, mask >>= 1) {\n\t\tif (channel & mask) {\n\t\t\tif (stbi__at_eof(s)) return stbi__errpuc(\"bad file\", \"PIC file too short\");\n\t\t\tdest[i] = stbi__get8(s);\n\t\t}\n\t}\n\n\treturn dest;\n}\n\nstatic void stbi__copyval(int channel, stbi_uc *dest, const stbi_uc *src)\n{\n\tint mask = 0x80, i;\n\n\tfor (i = 0; i<4; ++i, mask >>= 1)\n\t\tif (channel&mask)\n\t\t\tdest[i] = src[i];\n}\n\nstatic stbi_uc *stbi__pic_load_core(stbi__context *s, int width, int height, int *comp, stbi_uc *result)\n{\n\tint act_comp = 0, num_packets = 0, y, chained;\n\tstbi__pic_packet packets[10];\n\n\t// this will (should...) cater for even some bizarre stuff like having data\n\t// for the same channel in multiple packets.\n\tdo {\n\t\tstbi__pic_packet *packet;\n\n\t\tif (num_packets == sizeof(packets) / sizeof(packets[0]))\n\t\t\treturn stbi__errpuc(\"bad format\", \"too many packets\");\n\n\t\tpacket = &packets[num_packets++];\n\n\t\tchained = stbi__get8(s);\n\t\tpacket->size = stbi__get8(s);\n\t\tpacket->type = stbi__get8(s);\n\t\tpacket->channel = stbi__get8(s);\n\n\t\tact_comp |= packet->channel;\n\n\t\tif (stbi__at_eof(s))          return stbi__errpuc(\"bad file\", \"file too short (reading packets)\");\n\t\tif (packet->size != 8)  return stbi__errpuc(\"bad format\", \"packet isn't 8bpp\");\n\t} while (chained);\n\n\t*comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?\n\n\tfor (y = 0; y<height; ++y) {\n\t\tint packet_idx;\n\n\t\tfor (packet_idx = 0; packet_idx < num_packets; ++packet_idx) {\n\t\t\tstbi__pic_packet *packet = &packets[packet_idx];\n\t\t\tstbi_uc *dest = result + y*width * 4;\n\n\t\t\tswitch (packet->type) {\n\t\t\tdefault:\n\t\t\t\treturn stbi__errpuc(\"bad format\", \"packet has bad compression type\");\n\n\t\t\tcase 0: {//uncompressed\n\t\t\t\tint x;\n\n\t\t\t\tfor (x = 0; x<width; ++x, dest += 4)\n\t\t\t\t\tif (!stbi__readval(s, packet->channel, dest))\n\t\t\t\t\t\treturn 0;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 1://Pure RLE\n\t\t\t{\n\t\t\t\tint left = width, i;\n\n\t\t\t\twhile (left>0) {\n\t\t\t\t\tstbi_uc count, value[4];\n\n\t\t\t\t\tcount = stbi__get8(s);\n\t\t\t\t\tif (stbi__at_eof(s))   return stbi__errpuc(\"bad file\", \"file too short (pure read count)\");\n\n\t\t\t\t\tif (count > left)\n\t\t\t\t\t\tcount = (stbi_uc)left;\n\n\t\t\t\t\tif (!stbi__readval(s, packet->channel, value))  return 0;\n\n\t\t\t\t\tfor (i = 0; i<count; ++i, dest += 4)\n\t\t\t\t\t\tstbi__copyval(packet->channel, dest, value);\n\t\t\t\t\tleft -= count;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\t\tcase 2: {//Mixed RLE\n\t\t\t\tint left = width;\n\t\t\t\twhile (left>0) {\n\t\t\t\t\tint count = stbi__get8(s), i;\n\t\t\t\t\tif (stbi__at_eof(s))  return stbi__errpuc(\"bad file\", \"file too short (mixed read count)\");\n\n\t\t\t\t\tif (count >= 128) { // Repeated\n\t\t\t\t\t\tstbi_uc value[4];\n\n\t\t\t\t\t\tif (count == 128)\n\t\t\t\t\t\t\tcount = stbi__get16be(s);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcount -= 127;\n\t\t\t\t\t\tif (count > left)\n\t\t\t\t\t\t\treturn stbi__errpuc(\"bad file\", \"scanline overrun\");\n\n\t\t\t\t\t\tif (!stbi__readval(s, packet->channel, value))\n\t\t\t\t\t\t\treturn 0;\n\n\t\t\t\t\t\tfor (i = 0; i<count; ++i, dest += 4)\n\t\t\t\t\t\t\tstbi__copyval(packet->channel, dest, value);\n\t\t\t\t\t}\n\t\t\t\t\telse { // Raw\n\t\t\t\t\t\t++count;\n\t\t\t\t\t\tif (count>left) return stbi__errpuc(\"bad file\", \"scanline overrun\");\n\n\t\t\t\t\t\tfor (i = 0; i<count; ++i, dest += 4)\n\t\t\t\t\t\t\tif (!stbi__readval(s, packet->channel, dest))\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tleft -= count;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nstatic void *stbi__pic_load(stbi__context *s, int *px, int *py, int *comp, int req_comp, stbi__result_info *ri)\n{\n\tstbi_uc *result;\n\tint i, x, y, internal_comp;\n\tSTBI_NOTUSED(ri);\n\n\tif (!comp) comp = &internal_comp;\n\n\tfor (i = 0; i<92; ++i)\n\t\tstbi__get8(s);\n\n\tx = stbi__get16be(s);\n\ty = stbi__get16be(s);\n\tif (stbi__at_eof(s))  return stbi__errpuc(\"bad file\", \"file too short (pic header)\");\n\tif (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc(\"too large\", \"PIC image too large to decode\");\n\n\tstbi__get32be(s); //skip `ratio'\n\tstbi__get16be(s); //skip `fields'\n\tstbi__get16be(s); //skip `pad'\n\n\t\t\t\t\t  // intermediate buffer is RGBA\n\tresult = (stbi_uc *)stbi__malloc_mad3(x, y, 4, 0);\n\tmemset(result, 0xff, x*y * 4);\n\n\tif (!stbi__pic_load_core(s, x, y, comp, result)) {\n\t\tSTBI_FREE(result);\n\t\tresult = 0;\n\t}\n\t*px = x;\n\t*py = y;\n\tif (req_comp == 0) req_comp = *comp;\n\tresult = stbi__convert_format(result, 4, req_comp, x, y);\n\n\treturn result;\n}\n\nstatic int stbi__pic_test(stbi__context *s)\n{\n\tint r = stbi__pic_test_core(s);\n\tstbi__rewind(s);\n\treturn r;\n}\n#endif\n\n// *************************************************************************************************\n// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb\n\n#ifndef STBI_NO_GIF\ntypedef struct\n{\n\tstbi__int16 prefix;\n\tstbi_uc first;\n\tstbi_uc suffix;\n} stbi__gif_lzw;\n\ntypedef struct\n{\n\tint w, h;\n\tstbi_uc *out, *old_out;             // output buffer (always 4 components)\n\tint flags, bgindex, ratio, transparent, eflags, delay;\n\tstbi_uc  pal[256][4];\n\tstbi_uc lpal[256][4];\n\tstbi__gif_lzw codes[4096];\n\tstbi_uc *color_table;\n\tint parse, step;\n\tint lflags;\n\tint start_x, start_y;\n\tint max_x, max_y;\n\tint cur_x, cur_y;\n\tint line_size;\n} stbi__gif;\n\nstatic int stbi__gif_test_raw(stbi__context *s)\n{\n\tint sz;\n\tif (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;\n\tsz = stbi__get8(s);\n\tif (sz != '9' && sz != '7') return 0;\n\tif (stbi__get8(s) != 'a') return 0;\n\treturn 1;\n}\n\nstatic int stbi__gif_test(stbi__context *s)\n{\n\tint r = stbi__gif_test_raw(s);\n\tstbi__rewind(s);\n\treturn r;\n}\n\nstatic void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)\n{\n\tint i;\n\tfor (i = 0; i < num_entries; ++i) {\n\t\tpal[i][2] = stbi__get8(s);\n\t\tpal[i][1] = stbi__get8(s);\n\t\tpal[i][0] = stbi__get8(s);\n\t\tpal[i][3] = transp == i ? 0 : 255;\n\t}\n}\n\nstatic int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)\n{\n\tstbi_uc version;\n\tif (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')\n\t\treturn stbi__err(\"not GIF\", \"Corrupt GIF\");\n\n\tversion = stbi__get8(s);\n\tif (version != '7' && version != '9')    return stbi__err(\"not GIF\", \"Corrupt GIF\");\n\tif (stbi__get8(s) != 'a')                return stbi__err(\"not GIF\", \"Corrupt GIF\");\n\n\tstbi__g_failure_reason = \"\";\n\tg->w = stbi__get16le(s);\n\tg->h = stbi__get16le(s);\n\tg->flags = stbi__get8(s);\n\tg->bgindex = stbi__get8(s);\n\tg->ratio = stbi__get8(s);\n\tg->transparent = -1;\n\n\tif (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments\n\n\tif (is_info) return 1;\n\n\tif (g->flags & 0x80)\n\t\tstbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1);\n\n\treturn 1;\n}\n\nstatic int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)\n{\n\tstbi__gif* g = (stbi__gif*)stbi__malloc(sizeof(stbi__gif));\n\tif (!stbi__gif_header(s, g, comp, 1)) {\n\t\tSTBI_FREE(g);\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\tif (x) *x = g->w;\n\tif (y) *y = g->h;\n\tSTBI_FREE(g);\n\treturn 1;\n}\n\nstatic void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)\n{\n\tstbi_uc *p, *c;\n\n\t// recurse to decode the prefixes, since the linked-list is backwards,\n\t// and working backwards through an interleaved image would be nasty\n\tif (g->codes[code].prefix >= 0)\n\t\tstbi__out_gif_code(g, g->codes[code].prefix);\n\n\tif (g->cur_y >= g->max_y) return;\n\n\tp = &g->out[g->cur_x + g->cur_y];\n\tc = &g->color_table[g->codes[code].suffix * 4];\n\n\tif (c[3] >= 128) {\n\t\tp[0] = c[2];\n\t\tp[1] = c[1];\n\t\tp[2] = c[0];\n\t\tp[3] = c[3];\n\t}\n\tg->cur_x += 4;\n\n\tif (g->cur_x >= g->max_x) {\n\t\tg->cur_x = g->start_x;\n\t\tg->cur_y += g->step;\n\n\t\twhile (g->cur_y >= g->max_y && g->parse > 0) {\n\t\t\tg->step = (1 << g->parse) * g->line_size;\n\t\t\tg->cur_y = g->start_y + (g->step >> 1);\n\t\t\t--g->parse;\n\t\t}\n\t}\n}\n\nstatic stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)\n{\n\tstbi_uc lzw_cs;\n\tstbi__int32 len, init_code;\n\tstbi__uint32 first;\n\tstbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;\n\tstbi__gif_lzw *p;\n\n\tlzw_cs = stbi__get8(s);\n\tif (lzw_cs > 12) return NULL;\n\tclear = 1 << lzw_cs;\n\tfirst = 1;\n\tcodesize = lzw_cs + 1;\n\tcodemask = (1 << codesize) - 1;\n\tbits = 0;\n\tvalid_bits = 0;\n\tfor (init_code = 0; init_code < clear; init_code++) {\n\t\tg->codes[init_code].prefix = -1;\n\t\tg->codes[init_code].first = (stbi_uc)init_code;\n\t\tg->codes[init_code].suffix = (stbi_uc)init_code;\n\t}\n\n\t// support no starting clear code\n\tavail = clear + 2;\n\toldcode = -1;\n\n\tlen = 0;\n\tfor (;;) {\n\t\tif (valid_bits < codesize) {\n\t\t\tif (len == 0) {\n\t\t\t\tlen = stbi__get8(s); // start new block\n\t\t\t\tif (len == 0)\n\t\t\t\t\treturn g->out;\n\t\t\t}\n\t\t\t--len;\n\t\t\tbits |= (stbi__int32)stbi__get8(s) << valid_bits;\n\t\t\tvalid_bits += 8;\n\t\t}\n\t\telse {\n\t\t\tstbi__int32 code = bits & codemask;\n\t\t\tbits >>= codesize;\n\t\t\tvalid_bits -= codesize;\n\t\t\t// @OPTIMIZE: is there some way we can accelerate the non-clear path?\n\t\t\tif (code == clear) {  // clear code\n\t\t\t\tcodesize = lzw_cs + 1;\n\t\t\t\tcodemask = (1 << codesize) - 1;\n\t\t\t\tavail = clear + 2;\n\t\t\t\toldcode = -1;\n\t\t\t\tfirst = 0;\n\t\t\t}\n\t\t\telse if (code == clear + 1) { // end of stream code\n\t\t\t\tstbi__skip(s, len);\n\t\t\t\twhile ((len = stbi__get8(s)) > 0)\n\t\t\t\t\tstbi__skip(s, len);\n\t\t\t\treturn g->out;\n\t\t\t}\n\t\t\telse if (code <= avail) {\n\t\t\t\tif (first) return stbi__errpuc(\"no clear code\", \"Corrupt GIF\");\n\n\t\t\t\tif (oldcode >= 0) {\n\t\t\t\t\tp = &g->codes[avail++];\n\t\t\t\t\tif (avail > 4096)        return stbi__errpuc(\"too many codes\", \"Corrupt GIF\");\n\t\t\t\t\tp->prefix = (stbi__int16)oldcode;\n\t\t\t\t\tp->first = g->codes[oldcode].first;\n\t\t\t\t\tp->suffix = (code == avail) ? p->first : g->codes[code].first;\n\t\t\t\t}\n\t\t\t\telse if (code == avail)\n\t\t\t\t\treturn stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\n\n\t\t\t\tstbi__out_gif_code(g, (stbi__uint16)code);\n\n\t\t\t\tif ((avail & codemask) == 0 && avail <= 0x0FFF) {\n\t\t\t\t\tcodesize++;\n\t\t\t\t\tcodemask = (1 << codesize) - 1;\n\t\t\t\t}\n\n\t\t\t\toldcode = code;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1)\n{\n\tint x, y;\n\tstbi_uc *c = g->pal[g->bgindex];\n\tfor (y = y0; y < y1; y += 4 * g->w) {\n\t\tfor (x = x0; x < x1; x += 4) {\n\t\t\tstbi_uc *p = &g->out[y + x];\n\t\t\tp[0] = c[2];\n\t\t\tp[1] = c[1];\n\t\t\tp[2] = c[0];\n\t\t\tp[3] = 0;\n\t\t}\n\t}\n}\n\n// this function is designed to support animated gifs, although stb_image doesn't support it\nstatic stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)\n{\n\tint i;\n\tstbi_uc *prev_out = 0;\n\n\tif (g->out == 0 && !stbi__gif_header(s, g, comp, 0))\n\t\treturn 0; // stbi__g_failure_reason set by stbi__gif_header\n\n\tif (!stbi__mad3sizes_valid(g->w, g->h, 4, 0))\n\t\treturn stbi__errpuc(\"too large\", \"GIF too large\");\n\n\tprev_out = g->out;\n\tg->out = (stbi_uc *)stbi__malloc_mad3(4, g->w, g->h, 0);\n\tif (g->out == 0) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n\tswitch ((g->eflags & 0x1C) >> 2) {\n\tcase 0: // unspecified (also always used on 1st frame)\n\t\tstbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);\n\t\tbreak;\n\tcase 1: // do not dispose\n\t\tif (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);\n\t\tg->old_out = prev_out;\n\t\tbreak;\n\tcase 2: // dispose to background\n\t\tif (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);\n\t\tstbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);\n\t\tbreak;\n\tcase 3: // dispose to previous\n\t\tif (g->old_out) {\n\t\t\tfor (i = g->start_y; i < g->max_y; i += 4 * g->w)\n\t\t\t\tmemcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);\n\t\t}\n\t\tbreak;\n\t}\n\n\tfor (;;) {\n\t\tswitch (stbi__get8(s)) {\n\t\tcase 0x2C: /* Image Descriptor */\n\t\t{\n\t\t\tint prev_trans = -1;\n\t\t\tstbi__int32 x, y, w, h;\n\t\t\tstbi_uc *o;\n\n\t\t\tx = stbi__get16le(s);\n\t\t\ty = stbi__get16le(s);\n\t\t\tw = stbi__get16le(s);\n\t\t\th = stbi__get16le(s);\n\t\t\tif (((x + w) > (g->w)) || ((y + h) > (g->h)))\n\t\t\t\treturn stbi__errpuc(\"bad Image Descriptor\", \"Corrupt GIF\");\n\n\t\t\tg->line_size = g->w * 4;\n\t\t\tg->start_x = x * 4;\n\t\t\tg->start_y = y * g->line_size;\n\t\t\tg->max_x = g->start_x + w * 4;\n\t\t\tg->max_y = g->start_y + h * g->line_size;\n\t\t\tg->cur_x = g->start_x;\n\t\t\tg->cur_y = g->start_y;\n\n\t\t\tg->lflags = stbi__get8(s);\n\n\t\t\tif (g->lflags & 0x40) {\n\t\t\t\tg->step = 8 * g->line_size; // first interlaced spacing\n\t\t\t\tg->parse = 3;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tg->step = g->line_size;\n\t\t\t\tg->parse = 0;\n\t\t\t}\n\n\t\t\tif (g->lflags & 0x80) {\n\t\t\t\tstbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);\n\t\t\t\tg->color_table = (stbi_uc *)g->lpal;\n\t\t\t}\n\t\t\telse if (g->flags & 0x80) {\n\t\t\t\tif (g->transparent >= 0 && (g->eflags & 0x01)) {\n\t\t\t\t\tprev_trans = g->pal[g->transparent][3];\n\t\t\t\t\tg->pal[g->transparent][3] = 0;\n\t\t\t\t}\n\t\t\t\tg->color_table = (stbi_uc *)g->pal;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn stbi__errpuc(\"missing color table\", \"Corrupt GIF\");\n\n\t\t\to = stbi__process_gif_raster(s, g);\n\t\t\tif (o == NULL) return NULL;\n\n\t\t\tif (prev_trans != -1)\n\t\t\t\tg->pal[g->transparent][3] = (stbi_uc)prev_trans;\n\n\t\t\treturn o;\n\t\t}\n\n\t\tcase 0x21: // Comment Extension.\n\t\t{\n\t\t\tint len;\n\t\t\tif (stbi__get8(s) == 0xF9) { // Graphic Control Extension.\n\t\t\t\tlen = stbi__get8(s);\n\t\t\t\tif (len == 4) {\n\t\t\t\t\tg->eflags = stbi__get8(s);\n\t\t\t\t\tg->delay = stbi__get16le(s);\n\t\t\t\t\tg->transparent = stbi__get8(s);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstbi__skip(s, len);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile ((len = stbi__get8(s)) != 0)\n\t\t\t\tstbi__skip(s, len);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 0x3B: // gif stream termination code\n\t\t\treturn (stbi_uc *)s; // using '1' causes warning on some compilers\n\n\t\tdefault:\n\t\t\treturn stbi__errpuc(\"unknown code\", \"Corrupt GIF\");\n\t\t}\n\t}\n\n\tSTBI_NOTUSED(req_comp);\n}\n\nstatic void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n\tstbi_uc *u = 0;\n\tstbi__gif* g = (stbi__gif*)stbi__malloc(sizeof(stbi__gif));\n\tmemset(g, 0, sizeof(*g));\n\tSTBI_NOTUSED(ri);\n\n\tu = stbi__gif_load_next(s, g, comp, req_comp);\n\tif (u == (stbi_uc *)s) u = 0;  // end of animated gif marker\n\tif (u) {\n\t\t*x = g->w;\n\t\t*y = g->h;\n\t\tif (req_comp && req_comp != 4)\n\t\t\tu = stbi__convert_format(u, 4, req_comp, g->w, g->h);\n\t}\n\telse if (g->out)\n\t\tSTBI_FREE(g->out);\n\tSTBI_FREE(g);\n\treturn u;\n}\n\nstatic int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\treturn stbi__gif_info_raw(s, x, y, comp);\n}\n#endif\n\n// *************************************************************************************************\n// Radiance RGBE HDR loader\n// originally by Nicolas Schulz\n#ifndef STBI_NO_HDR\nstatic int stbi__hdr_test_core(stbi__context *s, const char *signature)\n{\n\tint i;\n\tfor (i = 0; signature[i]; ++i)\n\t\tif (stbi__get8(s) != signature[i])\n\t\t\treturn 0;\n\tstbi__rewind(s);\n\treturn 1;\n}\n\nstatic int stbi__hdr_test(stbi__context* s)\n{\n\tint r = stbi__hdr_test_core(s, \"#?RADIANCE\\n\");\n\tstbi__rewind(s);\n\tif (!r) {\n\t\tr = stbi__hdr_test_core(s, \"#?RGBE\\n\");\n\t\tstbi__rewind(s);\n\t}\n\treturn r;\n}\n\n#define STBI__HDR_BUFLEN  1024\nstatic char *stbi__hdr_gettoken(stbi__context *z, char *buffer)\n{\n\tint len = 0;\n\tchar c = '\\0';\n\n\tc = (char)stbi__get8(z);\n\n\twhile (!stbi__at_eof(z) && c != '\\n') {\n\t\tbuffer[len++] = c;\n\t\tif (len == STBI__HDR_BUFLEN - 1) {\n\t\t\t// flush to end of line\n\t\t\twhile (!stbi__at_eof(z) && stbi__get8(z) != '\\n')\n\t\t\t\t;\n\t\t\tbreak;\n\t\t}\n\t\tc = (char)stbi__get8(z);\n\t}\n\n\tbuffer[len] = 0;\n\treturn buffer;\n}\n\nstatic void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)\n{\n\tif (input[3] != 0) {\n\t\tfloat f1;\n\t\t// Exponent\n\t\tf1 = (float)ldexp(1.0f, input[3] - (int)(128 + 8));\n\t\tif (req_comp <= 2)\n\t\t\toutput[0] = (input[0] + input[1] + input[2]) * f1 / 3;\n\t\telse {\n\t\t\toutput[0] = input[0] * f1;\n\t\t\toutput[1] = input[1] * f1;\n\t\t\toutput[2] = input[2] * f1;\n\t\t}\n\t\tif (req_comp == 2) output[1] = 1;\n\t\tif (req_comp == 4) output[3] = 1;\n\t}\n\telse {\n\t\tswitch (req_comp) {\n\t\tcase 4: output[3] = 1; /* fallthrough */\n\t\tcase 3: output[0] = output[1] = output[2] = 0;\n\t\t\tbreak;\n\t\tcase 2: output[1] = 1; /* fallthrough */\n\t\tcase 1: output[0] = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nstatic float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n\tchar buffer[STBI__HDR_BUFLEN];\n\tchar *token;\n\tint valid = 0;\n\tint width, height;\n\tstbi_uc *scanline;\n\tfloat *hdr_data;\n\tint len;\n\tunsigned char count, value;\n\tint i, j, k, c1, c2, z;\n\tconst char *headerToken;\n\tSTBI_NOTUSED(ri);\n\n\t// Check identifier\n\theaderToken = stbi__hdr_gettoken(s, buffer);\n\tif (strcmp(headerToken, \"#?RADIANCE\") != 0 && strcmp(headerToken, \"#?RGBE\") != 0)\n\t\treturn stbi__errpf(\"not HDR\", \"Corrupt HDR image\");\n\n\t// Parse header\n\tfor (;;) {\n\t\ttoken = stbi__hdr_gettoken(s, buffer);\n\t\tif (token[0] == 0) break;\n\t\tif (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\n\t}\n\n\tif (!valid)    return stbi__errpf(\"unsupported format\", \"Unsupported HDR format\");\n\n\t// Parse width and height\n\t// can't use sscanf() if we're not using stdio!\n\ttoken = stbi__hdr_gettoken(s, buffer);\n\tif (strncmp(token, \"-Y \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\n\ttoken += 3;\n\theight = (int)strtol(token, &token, 10);\n\twhile (*token == ' ') ++token;\n\tif (strncmp(token, \"+X \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\n\ttoken += 3;\n\twidth = (int)strtol(token, NULL, 10);\n\n\t*x = width;\n\t*y = height;\n\n\tif (comp) *comp = 3;\n\tif (req_comp == 0) req_comp = 3;\n\n\tif (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))\n\t\treturn stbi__errpf(\"too large\", \"HDR image is too large\");\n\n\t// Read data\n\thdr_data = (float *)stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);\n\tif (!hdr_data)\n\t\treturn stbi__errpf(\"outofmem\", \"Out of memory\");\n\n\t// Load image data\n\t// image data is stored as some number of sca\n\tif (width < 8 || width >= 32768) {\n\t\t// Read flat data\n\t\tfor (j = 0; j < height; ++j) {\n\t\t\tfor (i = 0; i < width; ++i) {\n\t\t\t\tstbi_uc rgbe[4];\n\t\t\tmain_decode_loop:\n\t\t\t\tstbi__getn(s, rgbe, 4);\n\t\t\t\tstbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\t// Read RLE-encoded data\n\t\tscanline = NULL;\n\n\t\tfor (j = 0; j < height; ++j) {\n\t\t\tc1 = stbi__get8(s);\n\t\t\tc2 = stbi__get8(s);\n\t\t\tlen = stbi__get8(s);\n\t\t\tif (c1 != 2 || c2 != 2 || (len & 0x80)) {\n\t\t\t\t// not run-length encoded, so we have to actually use THIS data as a decoded\n\t\t\t\t// pixel (note this can't be a valid pixel--one of RGB must be >= 128)\n\t\t\t\tstbi_uc rgbe[4];\n\t\t\t\trgbe[0] = (stbi_uc)c1;\n\t\t\t\trgbe[1] = (stbi_uc)c2;\n\t\t\t\trgbe[2] = (stbi_uc)len;\n\t\t\t\trgbe[3] = (stbi_uc)stbi__get8(s);\n\t\t\t\tstbi__hdr_convert(hdr_data, rgbe, req_comp);\n\t\t\t\ti = 1;\n\t\t\t\tj = 0;\n\t\t\t\tSTBI_FREE(scanline);\n\t\t\t\tgoto main_decode_loop; // yes, this makes no sense\n\t\t\t}\n\t\t\tlen <<= 8;\n\t\t\tlen |= stbi__get8(s);\n\t\t\tif (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"invalid decoded scanline length\", \"corrupt HDR\"); }\n\t\t\tif (scanline == NULL) {\n\t\t\t\tscanline = (stbi_uc *)stbi__malloc_mad2(width, 4, 0);\n\t\t\t\tif (!scanline) {\n\t\t\t\t\tSTBI_FREE(hdr_data);\n\t\t\t\t\treturn stbi__errpf(\"outofmem\", \"Out of memory\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (k = 0; k < 4; ++k) {\n\t\t\t\tint nleft;\n\t\t\t\ti = 0;\n\t\t\t\twhile ((nleft = width - i) > 0) {\n\t\t\t\t\tcount = stbi__get8(s);\n\t\t\t\t\tif (count > 128) {\n\t\t\t\t\t\t// Run\n\t\t\t\t\t\tvalue = stbi__get8(s);\n\t\t\t\t\t\tcount -= 128;\n\t\t\t\t\t\tif (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"corrupt\", \"bad RLE data in HDR\"); }\n\t\t\t\t\t\tfor (z = 0; z < count; ++z)\n\t\t\t\t\t\t\tscanline[i++ * 4 + k] = value;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Dump\n\t\t\t\t\t\tif (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"corrupt\", \"bad RLE data in HDR\"); }\n\t\t\t\t\t\tfor (z = 0; z < count; ++z)\n\t\t\t\t\t\t\tscanline[i++ * 4 + k] = stbi__get8(s);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (i = 0; i < width; ++i)\n\t\t\t\tstbi__hdr_convert(hdr_data + (j*width + i)*req_comp, scanline + i * 4, req_comp);\n\t\t}\n\t\tif (scanline)\n\t\t\tSTBI_FREE(scanline);\n\t}\n\n\treturn hdr_data;\n}\n\nstatic int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\tchar buffer[STBI__HDR_BUFLEN];\n\tchar *token;\n\tint valid = 0;\n\tint dummy;\n\n\tif (!x) x = &dummy;\n\tif (!y) y = &dummy;\n\tif (!comp) comp = &dummy;\n\n\tif (stbi__hdr_test(s) == 0) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\n\tfor (;;) {\n\t\ttoken = stbi__hdr_gettoken(s, buffer);\n\t\tif (token[0] == 0) break;\n\t\tif (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\n\t}\n\n\tif (!valid) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\ttoken = stbi__hdr_gettoken(s, buffer);\n\tif (strncmp(token, \"-Y \", 3)) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\ttoken += 3;\n\t*y = (int)strtol(token, &token, 10);\n\twhile (*token == ' ') ++token;\n\tif (strncmp(token, \"+X \", 3)) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\ttoken += 3;\n\t*x = (int)strtol(token, NULL, 10);\n\t*comp = 3;\n\treturn 1;\n}\n#endif // STBI_NO_HDR\n\n#ifndef STBI_NO_BMP\nstatic int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\tvoid *p;\n\tstbi__bmp_data info;\n\n\tinfo.all_a = 255;\n\tp = stbi__bmp_parse_header(s, &info);\n\tstbi__rewind(s);\n\tif (p == NULL)\n\t\treturn 0;\n\tif (x) *x = s->img_x;\n\tif (y) *y = s->img_y;\n\tif (comp) *comp = info.ma ? 4 : 3;\n\treturn 1;\n}\n#endif\n\n#ifndef STBI_NO_PSD\nstatic int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\tint channelCount, dummy;\n\tif (!x) x = &dummy;\n\tif (!y) y = &dummy;\n\tif (!comp) comp = &dummy;\n\tif (stbi__get32be(s) != 0x38425053) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\tif (stbi__get16be(s) != 1) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\tstbi__skip(s, 6);\n\tchannelCount = stbi__get16be(s);\n\tif (channelCount < 0 || channelCount > 16) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\t*y = stbi__get32be(s);\n\t*x = stbi__get32be(s);\n\tif (stbi__get16be(s) != 8) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\tif (stbi__get16be(s) != 3) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\t*comp = 4;\n\treturn 1;\n}\n#endif\n\n#ifndef STBI_NO_PIC\nstatic int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\tint act_comp = 0, num_packets = 0, chained, dummy;\n\tstbi__pic_packet packets[10];\n\n\tif (!x) x = &dummy;\n\tif (!y) y = &dummy;\n\tif (!comp) comp = &dummy;\n\n\tif (!stbi__pic_is4(s, \"\\x53\\x80\\xF6\\x34\")) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\n\tstbi__skip(s, 88);\n\n\t*x = stbi__get16be(s);\n\t*y = stbi__get16be(s);\n\tif (stbi__at_eof(s)) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\tif ((*x) != 0 && (1 << 28) / (*x) < (*y)) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\n\tstbi__skip(s, 8);\n\n\tdo {\n\t\tstbi__pic_packet *packet;\n\n\t\tif (num_packets == sizeof(packets) / sizeof(packets[0]))\n\t\t\treturn 0;\n\n\t\tpacket = &packets[num_packets++];\n\t\tchained = stbi__get8(s);\n\t\tpacket->size = stbi__get8(s);\n\t\tpacket->type = stbi__get8(s);\n\t\tpacket->channel = stbi__get8(s);\n\t\tact_comp |= packet->channel;\n\n\t\tif (stbi__at_eof(s)) {\n\t\t\tstbi__rewind(s);\n\t\t\treturn 0;\n\t\t}\n\t\tif (packet->size != 8) {\n\t\t\tstbi__rewind(s);\n\t\t\treturn 0;\n\t\t}\n\t} while (chained);\n\n\t*comp = (act_comp & 0x10 ? 4 : 3);\n\n\treturn 1;\n}\n#endif\n\n// *************************************************************************************************\n// Portable Gray Map and Portable Pixel Map loader\n// by Ken Miller\n//\n// PGM: http://netpbm.sourceforge.net/doc/pgm.html\n// PPM: http://netpbm.sourceforge.net/doc/ppm.html\n//\n// Known limitations:\n//    Does not support comments in the header section\n//    Does not support ASCII image data (formats P2 and P3)\n//    Does not support 16-bit-per-channel\n\n#ifndef STBI_NO_PNM\n\nstatic int      stbi__pnm_test(stbi__context *s)\n{\n\tchar p, t;\n\tp = (char)stbi__get8(s);\n\tt = (char)stbi__get8(s);\n\tif (p != 'P' || (t != '5' && t != '6')) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\nstatic void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\n{\n\tstbi_uc *out;\n\tSTBI_NOTUSED(ri);\n\n\tif (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))\n\t\treturn 0;\n\n\t*x = s->img_x;\n\t*y = s->img_y;\n\tif (comp) *comp = s->img_n;\n\n\tif (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))\n\t\treturn stbi__errpuc(\"too large\", \"PNM too large\");\n\n\tout = (stbi_uc *)stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);\n\tif (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\tstbi__getn(s, out, s->img_n * s->img_x * s->img_y);\n\n\tif (req_comp && req_comp != s->img_n) {\n\t\tout = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);\n\t\tif (out == NULL) return out; // stbi__convert_format frees input on failure\n\t}\n\treturn out;\n}\n\nstatic int      stbi__pnm_isspace(char c)\n{\n\treturn c == ' ' || c == '\\t' || c == '\\n' || c == '\\v' || c == '\\f' || c == '\\r';\n}\n\nstatic void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)\n{\n\tfor (;;) {\n\t\twhile (!stbi__at_eof(s) && stbi__pnm_isspace(*c))\n\t\t\t*c = (char)stbi__get8(s);\n\n\t\tif (stbi__at_eof(s) || *c != '#')\n\t\t\tbreak;\n\n\t\twhile (!stbi__at_eof(s) && *c != '\\n' && *c != '\\r')\n\t\t\t*c = (char)stbi__get8(s);\n\t}\n}\n\nstatic int      stbi__pnm_isdigit(char c)\n{\n\treturn c >= '0' && c <= '9';\n}\n\nstatic int      stbi__pnm_getinteger(stbi__context *s, char *c)\n{\n\tint value = 0;\n\n\twhile (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {\n\t\tvalue = value * 10 + (*c - '0');\n\t\t*c = (char)stbi__get8(s);\n\t}\n\n\treturn value;\n}\n\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)\n{\n\tint maxv, dummy;\n\tchar c, p, t;\n\n\tif (!x) x = &dummy;\n\tif (!y) y = &dummy;\n\tif (!comp) comp = &dummy;\n\n\tstbi__rewind(s);\n\n\t// Get identifier\n\tp = (char)stbi__get8(s);\n\tt = (char)stbi__get8(s);\n\tif (p != 'P' || (t != '5' && t != '6')) {\n\t\tstbi__rewind(s);\n\t\treturn 0;\n\t}\n\n\t*comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm\n\n\tc = (char)stbi__get8(s);\n\tstbi__pnm_skip_whitespace(s, &c);\n\n\t*x = stbi__pnm_getinteger(s, &c); // read width\n\tstbi__pnm_skip_whitespace(s, &c);\n\n\t*y = stbi__pnm_getinteger(s, &c); // read height\n\tstbi__pnm_skip_whitespace(s, &c);\n\n\tmaxv = stbi__pnm_getinteger(s, &c);  // read max value\n\n\tif (maxv > 255)\n\t\treturn stbi__err(\"max value > 255\", \"PPM image not 8-bit\");\n\telse\n\t\treturn 1;\n}\n#endif\n\nstatic int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)\n{\n#ifndef STBI_NO_JPEG\n\tif (stbi__jpeg_info(s, x, y, comp)) return 1;\n#endif\n\n#ifndef STBI_NO_PNG\n\tif (stbi__png_info(s, x, y, comp))  return 1;\n#endif\n\n#ifndef STBI_NO_GIF\n\tif (stbi__gif_info(s, x, y, comp))  return 1;\n#endif\n\n#ifndef STBI_NO_BMP\n\tif (stbi__bmp_info(s, x, y, comp))  return 1;\n#endif\n\n#ifndef STBI_NO_PSD\n\tif (stbi__psd_info(s, x, y, comp))  return 1;\n#endif\n\n#ifndef STBI_NO_PIC\n\tif (stbi__pic_info(s, x, y, comp))  return 1;\n#endif\n\n#ifndef STBI_NO_PNM\n\tif (stbi__pnm_info(s, x, y, comp))  return 1;\n#endif\n\n#ifndef STBI_NO_HDR\n\tif (stbi__hdr_info(s, x, y, comp))  return 1;\n#endif\n\n\t// test tga last because it's a crappy test!\n#ifndef STBI_NO_TGA\n\tif (stbi__tga_info(s, x, y, comp))\n\t\treturn 1;\n#endif\n\treturn stbi__err(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)\n{\n\tFILE *f = stbi__fopen(filename, \"rb\");\n\tint result;\n\tif (!f) return stbi__err(\"can't fopen\", \"Unable to open file\");\n\tresult = stbi_info_from_file(f, x, y, comp);\n\tfclose(f);\n\treturn result;\n}\n\nSTBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)\n{\n\tint r;\n\tstbi__context s;\n\tlong pos = ftell(f);\n\tstbi__start_file(&s, f);\n\tr = stbi__info_main(&s, x, y, comp);\n\tfseek(f, pos, SEEK_SET);\n\treturn r;\n}\n#endif // !STBI_NO_STDIO\n\nSTBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)\n{\n\tstbi__context s;\n\tstbi__start_mem(&s, buffer, len);\n\treturn stbi__info_main(&s, x, y, comp);\n}\n\nSTBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)\n{\n\tstbi__context s;\n\tstbi__start_callbacks(&s, (stbi_io_callbacks *)c, user);\n\treturn stbi__info_main(&s, x, y, comp);\n}\n\n#endif // STB_IMAGE_IMPLEMENTATION\n\n/*\nrevision history:\n2.16  (2017-07-23) all functions have 16-bit variants;\nSTBI_NO_STDIO works again;\ncompilation fixes;\nfix rounding in unpremultiply;\noptimize vertical flip;\ndisable raw_len validation;\ndocumentation fixes\n2.15  (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;\nwarning fixes; disable run-time SSE detection on gcc;\nuniform handling of optional \"return\" values;\nthread-safe initialization of zlib tables\n2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs\n2.13  (2016-11-29) add 16-bit API, only supported for PNG right now\n2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes\n2.11  (2016-04-02) allocate large structures on the stack\nremove white matting for transparent PSD\nfix reported channel count for PNG & BMP\nre-enable SSE2 in non-gcc 64-bit\nsupport RGB-formatted JPEG\nread 16-bit PNGs (only as 8-bit)\n2.10  (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED\n2.09  (2016-01-16) allow comments in PNM files\n16-bit-per-pixel TGA (not bit-per-component)\ninfo() for TGA could break due to .hdr handling\ninfo() for BMP to shares code instead of sloppy parse\ncan use STBI_REALLOC_SIZED if allocator doesn't support realloc\ncode cleanup\n2.08  (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA\n2.07  (2015-09-13) fix compiler warnings\npartial animated GIF support\nlimited 16-bpc PSD support\n#ifdef unused functions\nbug with < 92 byte PIC,PNM,HDR,TGA\n2.06  (2015-04-19) fix bug where PSD returns wrong '*comp' value\n2.05  (2015-04-19) fix bug in progressive JPEG handling, fix warning\n2.04  (2015-04-15) try to re-enable SIMD on MinGW 64-bit\n2.03  (2015-04-12) extra corruption checking (mmozeiko)\nstbi_set_flip_vertically_on_load (nguillemot)\nfix NEON support; fix mingw support\n2.02  (2015-01-19) fix incorrect assert, fix warning\n2.01  (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2\n2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG\n2.00  (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)\nprogressive JPEG (stb)\nPGM/PPM support (Ken Miller)\nSTBI_MALLOC,STBI_REALLOC,STBI_FREE\nGIF bugfix -- seemingly never worked\nSTBI_NO_*, STBI_ONLY_*\n1.48  (2014-12-14) fix incorrectly-named assert()\n1.47  (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)\noptimize PNG (ryg)\nfix bug in interlaced PNG with user-specified channel count (stb)\n1.46  (2014-08-26)\nfix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG\n1.45  (2014-08-16)\nfix MSVC-ARM internal compiler error by wrapping malloc\n1.44  (2014-08-07)\nvarious warning fixes from Ronny Chevalier\n1.43  (2014-07-15)\nfix MSVC-only compiler problem in code changed in 1.42\n1.42  (2014-07-09)\ndon't define _CRT_SECURE_NO_WARNINGS (affects user code)\nfixes to stbi__cleanup_jpeg path\nadded STBI_ASSERT to avoid requiring assert.h\n1.41  (2014-06-25)\nfix search&replace from 1.36 that messed up comments/error messages\n1.40  (2014-06-22)\nfix gcc struct-initialization warning\n1.39  (2014-06-15)\nfix to TGA optimization when req_comp != number of components in TGA;\nfix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)\nadd support for BMP version 5 (more ignored fields)\n1.38  (2014-06-06)\nsuppress MSVC warnings on integer casts truncating values\nfix accidental rename of 'skip' field of I/O\n1.37  (2014-06-04)\nremove duplicate typedef\n1.36  (2014-06-03)\nconvert to header file single-file library\nif de-iphone isn't set, load iphone images color-swapped instead of returning NULL\n1.35  (2014-05-27)\nvarious warnings\nfix broken STBI_SIMD path\nfix bug where stbi_load_from_file no longer left file pointer in correct place\nfix broken non-easy path for 32-bit BMP (possibly never used)\nTGA optimization by Arseny Kapoulkine\n1.34  (unknown)\nuse STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case\n1.33  (2011-07-14)\nmake stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements\n1.32  (2011-07-13)\nsupport for \"info\" function for all supported filetypes (SpartanJ)\n1.31  (2011-06-20)\na few more leak fixes, bug in PNG handling (SpartanJ)\n1.30  (2011-06-11)\nadded ability to load files via callbacks to accomidate custom input streams (Ben Wenger)\nremoved deprecated format-specific test/load functions\nremoved support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway\nerror cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)\nfix inefficiency in decoding 32-bit BMP (David Woo)\n1.29  (2010-08-16)\nvarious warning fixes from Aurelien Pocheville\n1.28  (2010-08-01)\nfix bug in GIF palette transparency (SpartanJ)\n1.27  (2010-08-01)\ncast-to-stbi_uc to fix warnings\n1.26  (2010-07-24)\nfix bug in file buffering for PNG reported by SpartanJ\n1.25  (2010-07-17)\nrefix trans_data warning (Won Chun)\n1.24  (2010-07-12)\nperf improvements reading from files on platforms with lock-heavy fgetc()\nminor perf improvements for jpeg\ndeprecated type-specific functions so we'll get feedback if they're needed\nattempt to fix trans_data warning (Won Chun)\n1.23    fixed bug in iPhone support\n1.22  (2010-07-10)\nremoved image *writing* support\nstbi_info support from Jetro Lauha\nGIF support from Jean-Marc Lienher\niPhone PNG-extensions from James Brown\nwarning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)\n1.21    fix use of 'stbi_uc' in header (reported by jon blow)\n1.20    added support for Softimage PIC, by Tom Seddon\n1.19    bug in interlaced PNG corruption check (found by ryg)\n1.18  (2008-08-02)\nfix a threading bug (local mutable static)\n1.17    support interlaced PNG\n1.16    major bugfix - stbi__convert_format converted one too many pixels\n1.15    initialize some fields for thread safety\n1.14    fix threadsafe conversion bug\nheader-file-only version (#define STBI_HEADER_FILE_ONLY before including)\n1.13    threadsafe\n1.12    const qualifiers in the API\n1.11    Support installable IDCT, colorspace conversion routines\n1.10    Fixes for 64-bit (don't use \"unsigned long\")\noptimized upsampling by Fabian \"ryg\" Giesen\n1.09    Fix format-conversion for PSD code (bad global variables!)\n1.08    Thatcher Ulrich's PSD code integrated by Nicolas Schulz\n1.07    attempt to fix C++ warning/errors again\n1.06    attempt to fix C++ warning/errors again\n1.05    fix TGA loading to return correct *comp and use good luminance calc\n1.04    default float alpha is 1, not 255; use 'void *' for stbi_image_free\n1.03    bugfixes to STBI_NO_STDIO, STBI_NO_HDR\n1.02    support for (subset of) HDR files, float interface for preferred access to them\n1.01    fix bug: possible bug in handling right-side up bmps... not sure\nfix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all\n1.00    interface to zlib that skips zlib header\n0.99    correct handling of alpha in palette\n0.98    TGA loader by lonesock; dynamically add loaders (untested)\n0.97    jpeg errors on too large a file; also catch another malloc failure\n0.96    fix detection of invalid v value - particleman@mollyrocket forum\n0.95    during header scan, seek to markers in case of padding\n0.94    STBI_NO_STDIO to disable stdio usage; rename all #defines the same\n0.93    handle jpegtran output; verbose errors\n0.92    read 4,8,16,24,32-bit BMP files of several formats\n0.91    output 24-bit Windows 3.0 BMP files\n0.90    fix a few more warnings; bump version number to approach 1.0\n0.61    bugfixes due to Marc LeBlanc, Christopher Lloyd\n0.60    fix compiling as c++\n0.59    fix warnings: merge Dave Moore's -Wall fixes\n0.58    fix bug: zlib uncompressed mode len/nlen was wrong endian\n0.57    fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available\n0.56    fix bug: zlib uncompressed mode len vs. nlen\n0.55    fix bug: restart_interval not initialized to 0\n0.54    allow NULL for 'int *comp'\n0.53    fix bug in png 3->4; speedup png decoding\n0.52    png handles req_comp=3,4 directly; minor cleanup; jpeg comments\n0.51    obey req_comp requests, 1-component jpegs return as 1-component,\non 'test' only check type, not whether we support this variant\n0.50  (2006-11-19)\nfirst released version\n*/\n\n\n/*\n------------------------------------------------------------------------------\nThis software is available under 2 licenses -- choose whichever you prefer.\n------------------------------------------------------------------------------\nALTERNATIVE A - MIT License\nCopyright (c) 2017 Sean Barrett\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n------------------------------------------------------------------------------\nALTERNATIVE B - Public Domain (www.unlicense.org)\nThis is free and unencumbered software released into the public domain.\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\nsoftware, either in source code form or as a compiled binary, for any purpose,\ncommercial or non-commercial, and by any means.\nIn jurisdictions that recognize copyright laws, the author or authors of this\nsoftware dedicate any and all copyright interest in the software to the public\ndomain. We make this dedication for the benefit of the public at large and to\nthe detriment of our heirs and successors. We intend this dedication to be an\novert act of relinquishment in perpetuity of all present and future rights to\nthis software under copyright law.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n------------------------------------------------------------------------------\n*/"
  },
  {
    "path": "external/stb_image_write.h",
    "content": "/* stb_image_write - v1.07 - public domain - http://nothings.org/stb/stb_image_write.h\n   writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015\n                                     no warranty implied; use at your own risk\n\n   Before #including,\n\n       #define STB_IMAGE_WRITE_IMPLEMENTATION\n\n   in the file that you want to have the implementation.\n\n   Will probably not work correctly with strict-aliasing optimizations.\n\nABOUT:\n\n   This header file is a library for writing images to C stdio. It could be\n   adapted to write to memory or a general streaming interface; let me know.\n\n   The PNG output is not optimal; it is 20-50% larger than the file\n   written by a decent optimizing implementation. This library is designed\n   for source code compactness and simplicity, not optimal image file size\n   or run-time performance.\n\nBUILDING:\n\n   You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h.\n   You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace\n   malloc,realloc,free.\n   You can define STBIW_MEMMOVE() to replace memmove()\n\nUSAGE:\n\n   There are four functions, one for each image file format:\n\n     int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);\n     int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);\n     int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);\n     int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);\n     int stbi_write_jpg(char const *filename, int w, int h, int comp, const float *data);\n\n   There are also four equivalent functions that use an arbitrary write function. You are\n   expected to open/close your file-equivalent before and after calling these:\n\n     int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);\n     int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\n     int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\n     int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);\n     int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality);\n\n   where the callback is:\n      void stbi_write_func(void *context, void *data, int size);\n\n   You can define STBI_WRITE_NO_STDIO to disable the file variant of these\n   functions, so the library will not use stdio.h at all. However, this will\n   also disable HDR writing, because it requires stdio for formatted output.\n\n   Each function returns 0 on failure and non-0 on success.\n\n   The functions create an image file defined by the parameters. The image\n   is a rectangle of pixels stored from left-to-right, top-to-bottom.\n   Each pixel contains 'comp' channels of data stored interleaved with 8-bits\n   per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is\n   monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall.\n   The *data pointer points to the first byte of the top-left-most pixel.\n   For PNG, \"stride_in_bytes\" is the distance in bytes from the first byte of\n   a row of pixels to the first byte of the next row of pixels.\n\n   PNG creates output files with the same number of components as the input.\n   The BMP format expands Y to RGB in the file format and does not\n   output alpha.\n\n   PNG supports writing rectangles of data even when the bytes storing rows of\n   data are not consecutive in memory (e.g. sub-rectangles of a larger image),\n   by supplying the stride between the beginning of adjacent rows. The other\n   formats do not. (Thus you cannot write a native-format BMP through the BMP\n   writer, both because it is in BGR order and because it may have padding\n   at the end of the line.)\n\n   HDR expects linear float data. Since the format is always 32-bit rgb(e)\n   data, alpha (if provided) is discarded, and for monochrome data it is\n   replicated across all three channels.\n\n   TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed\n   data, set the global variable 'stbi_write_tga_with_rle' to 0.\n   \n   JPEG does ignore alpha channels in input data; quality is between 1 and 100.\n   Higher quality looks better but results in a bigger image.\n   JPEG baseline (no JPEG progressive).\n\nCREDITS:\n\n   PNG/BMP/TGA\n      Sean Barrett\n   HDR\n      Baldur Karlsson\n   TGA monochrome:\n      Jean-Sebastien Guay\n   misc enhancements:\n      Tim Kelsey\n   TGA RLE\n      Alan Hickman\n   initial file IO callback implementation\n      Emmanuel Julien\n   JPEG\n      Jon Olick (original jo_jpeg.cpp code)\n      Daniel Gibson\n   bugfixes:\n      github:Chribba\n      Guillaume Chereau\n      github:jry2\n      github:romigrou\n      Sergio Gonzalez\n      Jonas Karlsson\n      Filip Wasil\n      Thatcher Ulrich\n      github:poppolopoppo\n      Patrick Boettcher\n      \nLICENSE\n\n  See end of file for license information.\n\n*/\n\n#ifndef INCLUDE_STB_IMAGE_WRITE_H\n#define INCLUDE_STB_IMAGE_WRITE_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef STB_IMAGE_WRITE_STATIC\n#define STBIWDEF static\n#else\n#define STBIWDEF extern\nextern int stbi_write_tga_with_rle;\n#endif\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void  *data, int stride_in_bytes);\nSTBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);\nSTBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void  *data, int quality);\n#endif\n\ntypedef void stbi_write_func(void *context, void *data, int size);\n\nSTBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);\nSTBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);\nSTBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void  *data, int quality);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif//INCLUDE_STB_IMAGE_WRITE_H\n\n#ifdef STB_IMAGE_WRITE_IMPLEMENTATION\n\n#ifdef _WIN32\n   #ifndef _CRT_SECURE_NO_WARNINGS\n   #define _CRT_SECURE_NO_WARNINGS\n   #endif\n   #ifndef _CRT_NONSTDC_NO_DEPRECATE\n   #define _CRT_NONSTDC_NO_DEPRECATE\n   #endif\n#endif\n\n#ifndef STBI_WRITE_NO_STDIO\n#include <stdio.h>\n#endif // STBI_WRITE_NO_STDIO\n\n#include <stdarg.h>\n#include <stdlib.h>\n#include <string.h>\n#include <math.h>\n\n#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED))\n// ok\n#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED)\n// ok\n#else\n#error \"Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED).\"\n#endif\n\n#ifndef STBIW_MALLOC\n#define STBIW_MALLOC(sz)        malloc(sz)\n#define STBIW_REALLOC(p,newsz)  realloc(p,newsz)\n#define STBIW_FREE(p)           free(p)\n#endif\n\n#ifndef STBIW_REALLOC_SIZED\n#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz)\n#endif\n\n\n#ifndef STBIW_MEMMOVE\n#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz)\n#endif\n\n\n#ifndef STBIW_ASSERT\n#include <assert.h>\n#define STBIW_ASSERT(x) assert(x)\n#endif\n\n#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff)\n\ntypedef struct\n{\n   stbi_write_func *func;\n   void *context;\n} stbi__write_context;\n\n// initialize a callback-based context\nstatic void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context)\n{\n   s->func    = c;\n   s->context = context;\n}\n\n#ifndef STBI_WRITE_NO_STDIO\n\nstatic void stbi__stdio_write(void *context, void *data, int size)\n{\n   fwrite(data,1,size,(FILE*) context);\n}\n\nstatic int stbi__start_write_file(stbi__write_context *s, const char *filename)\n{\n   FILE *f = fopen(filename, \"wb\");\n   stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f);\n   return f != NULL;\n}\n\nstatic void stbi__end_write_file(stbi__write_context *s)\n{\n   fclose((FILE *)s->context);\n}\n\n#endif // !STBI_WRITE_NO_STDIO\n\ntypedef unsigned int stbiw_uint32;\ntypedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1];\n\n#ifdef STB_IMAGE_WRITE_STATIC\nstatic int stbi_write_tga_with_rle = 1;\n#else\nint stbi_write_tga_with_rle = 1;\n#endif\n\nstatic void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v)\n{\n   while (*fmt) {\n      switch (*fmt++) {\n         case ' ': break;\n         case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int));\n                     s->func(s->context,&x,1);\n                     break; }\n         case '2': { int x = va_arg(v,int);\n                     unsigned char b[2];\n                     b[0] = STBIW_UCHAR(x);\n                     b[1] = STBIW_UCHAR(x>>8);\n                     s->func(s->context,b,2);\n                     break; }\n         case '4': { stbiw_uint32 x = va_arg(v,int);\n                     unsigned char b[4];\n                     b[0]=STBIW_UCHAR(x);\n                     b[1]=STBIW_UCHAR(x>>8);\n                     b[2]=STBIW_UCHAR(x>>16);\n                     b[3]=STBIW_UCHAR(x>>24);\n                     s->func(s->context,b,4);\n                     break; }\n         default:\n            STBIW_ASSERT(0);\n            return;\n      }\n   }\n}\n\nstatic void stbiw__writef(stbi__write_context *s, const char *fmt, ...)\n{\n   va_list v;\n   va_start(v, fmt);\n   stbiw__writefv(s, fmt, v);\n   va_end(v);\n}\n\nstatic void stbiw__putc(stbi__write_context *s, unsigned char c)\n{\n   s->func(s->context, &c, 1);\n}\n\nstatic void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c)\n{\n   unsigned char arr[3];\n   arr[0] = a, arr[1] = b, arr[2] = c;\n   s->func(s->context, arr, 3);\n}\n\nstatic void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d)\n{\n   unsigned char bg[3] = { 255, 0, 255}, px[3];\n   int k;\n\n   if (write_alpha < 0)\n      s->func(s->context, &d[comp - 1], 1);\n\n   switch (comp) {\n      case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case\n      case 1:\n         if (expand_mono)\n            stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp\n         else\n            s->func(s->context, d, 1);  // monochrome TGA\n         break;\n      case 4:\n         if (!write_alpha) {\n            // composite against pink background\n            for (k = 0; k < 3; ++k)\n               px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255;\n            stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]);\n            break;\n         }\n         /* FALLTHROUGH */\n      case 3:\n         stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]);\n         break;\n   }\n   if (write_alpha > 0)\n      s->func(s->context, &d[comp - 1], 1);\n}\n\nstatic void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono)\n{\n   stbiw_uint32 zero = 0;\n   int i,j, j_end;\n\n   if (y <= 0)\n      return;\n\n   if (vdir < 0)\n      j_end = -1, j = y-1;\n   else\n      j_end =  y, j = 0;\n\n   for (; j != j_end; j += vdir) {\n      for (i=0; i < x; ++i) {\n         unsigned char *d = (unsigned char *) data + (j*x+i)*comp;\n         stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d);\n      }\n      s->func(s->context, &zero, scanline_pad);\n   }\n}\n\nstatic int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...)\n{\n   if (y < 0 || x < 0) {\n      return 0;\n   } else {\n      va_list v;\n      va_start(v, fmt);\n      stbiw__writefv(s, fmt, v);\n      va_end(v);\n      stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono);\n      return 1;\n   }\n}\n\nstatic int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data)\n{\n   int pad = (-x*3) & 3;\n   return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad,\n           \"11 4 22 4\" \"4 44 22 444444\",\n           'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40,  // file header\n            40, x,y, 1,24, 0,0,0,0,0,0);             // bitmap header\n}\n\nSTBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_bmp_core(&s, x, y, comp, data);\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_bmp_core(&s, x, y, comp, data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif //!STBI_WRITE_NO_STDIO\n\nstatic int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data)\n{\n   int has_alpha = (comp == 2 || comp == 4);\n   int colorbytes = has_alpha ? comp-1 : comp;\n   int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3\n\n   if (y < 0 || x < 0)\n      return 0;\n\n   if (!stbi_write_tga_with_rle) {\n      return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0,\n         \"111 221 2222 11\", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8);\n   } else {\n      int i,j,k;\n\n      stbiw__writef(s, \"111 221 2222 11\", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8);\n\n      for (j = y - 1; j >= 0; --j) {\n          unsigned char *row = (unsigned char *) data + j * x * comp;\n         int len;\n\n         for (i = 0; i < x; i += len) {\n            unsigned char *begin = row + i * comp;\n            int diff = 1;\n            len = 1;\n\n            if (i < x - 1) {\n               ++len;\n               diff = memcmp(begin, row + (i + 1) * comp, comp);\n               if (diff) {\n                  const unsigned char *prev = begin;\n                  for (k = i + 2; k < x && len < 128; ++k) {\n                     if (memcmp(prev, row + k * comp, comp)) {\n                        prev += comp;\n                        ++len;\n                     } else {\n                        --len;\n                        break;\n                     }\n                  }\n               } else {\n                  for (k = i + 2; k < x && len < 128; ++k) {\n                     if (!memcmp(begin, row + k * comp, comp)) {\n                        ++len;\n                     } else {\n                        break;\n                     }\n                  }\n               }\n            }\n\n            if (diff) {\n               unsigned char header = STBIW_UCHAR(len - 1);\n               s->func(s->context, &header, 1);\n               for (k = 0; k < len; ++k) {\n                  stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp);\n               }\n            } else {\n               unsigned char header = STBIW_UCHAR(len - 129);\n               s->func(s->context, &header, 1);\n               stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin);\n            }\n         }\n      }\n   }\n   return 1;\n}\n\nSTBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_tga_core(&s, x, y, comp, (void *) data);\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_tga_core(&s, x, y, comp, (void *) data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif\n\n// *************************************************************************************************\n// Radiance RGBE HDR writer\n// by Baldur Karlsson\n\n#define stbiw__max(a, b)  ((a) > (b) ? (a) : (b))\n\nvoid stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)\n{\n   int exponent;\n   float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2]));\n\n   if (maxcomp < 1e-32f) {\n      rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;\n   } else {\n      float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp;\n\n      rgbe[0] = (unsigned char)(linear[0] * normalize);\n      rgbe[1] = (unsigned char)(linear[1] * normalize);\n      rgbe[2] = (unsigned char)(linear[2] * normalize);\n      rgbe[3] = (unsigned char)(exponent + 128);\n   }\n}\n\nvoid stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte)\n{\n   unsigned char lengthbyte = STBIW_UCHAR(length+128);\n   STBIW_ASSERT(length+128 <= 255);\n   s->func(s->context, &lengthbyte, 1);\n   s->func(s->context, &databyte, 1);\n}\n\nvoid stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data)\n{\n   unsigned char lengthbyte = STBIW_UCHAR(length);\n   STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code\n   s->func(s->context, &lengthbyte, 1);\n   s->func(s->context, data, length);\n}\n\nvoid stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline)\n{\n   unsigned char scanlineheader[4] = { 2, 2, 0, 0 };\n   unsigned char rgbe[4];\n   float linear[3];\n   int x;\n\n   scanlineheader[2] = (width&0xff00)>>8;\n   scanlineheader[3] = (width&0x00ff);\n\n   /* skip RLE for images too small or large */\n   if (width < 8 || width >= 32768) {\n      for (x=0; x < width; x++) {\n         switch (ncomp) {\n            case 4: /* fallthrough */\n            case 3: linear[2] = scanline[x*ncomp + 2];\n                    linear[1] = scanline[x*ncomp + 1];\n                    linear[0] = scanline[x*ncomp + 0];\n                    break;\n            default:\n                    linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];\n                    break;\n         }\n         stbiw__linear_to_rgbe(rgbe, linear);\n         s->func(s->context, rgbe, 4);\n      }\n   } else {\n      int c,r;\n      /* encode into scratch buffer */\n      for (x=0; x < width; x++) {\n         switch(ncomp) {\n            case 4: /* fallthrough */\n            case 3: linear[2] = scanline[x*ncomp + 2];\n                    linear[1] = scanline[x*ncomp + 1];\n                    linear[0] = scanline[x*ncomp + 0];\n                    break;\n            default:\n                    linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];\n                    break;\n         }\n         stbiw__linear_to_rgbe(rgbe, linear);\n         scratch[x + width*0] = rgbe[0];\n         scratch[x + width*1] = rgbe[1];\n         scratch[x + width*2] = rgbe[2];\n         scratch[x + width*3] = rgbe[3];\n      }\n\n      s->func(s->context, scanlineheader, 4);\n\n      /* RLE each component separately */\n      for (c=0; c < 4; c++) {\n         unsigned char *comp = &scratch[width*c];\n\n         x = 0;\n         while (x < width) {\n            // find first run\n            r = x;\n            while (r+2 < width) {\n               if (comp[r] == comp[r+1] && comp[r] == comp[r+2])\n                  break;\n               ++r;\n            }\n            if (r+2 >= width)\n               r = width;\n            // dump up to first run\n            while (x < r) {\n               int len = r-x;\n               if (len > 128) len = 128;\n               stbiw__write_dump_data(s, len, &comp[x]);\n               x += len;\n            }\n            // if there's a run, output it\n            if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd\n               // find next byte after run\n               while (r < width && comp[r] == comp[x])\n                  ++r;\n               // output run up to r\n               while (x < r) {\n                  int len = r-x;\n                  if (len > 127) len = 127;\n                  stbiw__write_run_data(s, len, comp[x]);\n                  x += len;\n               }\n            }\n         }\n      }\n   }\n}\n\nstatic int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data)\n{\n   if (y <= 0 || x <= 0 || data == NULL)\n      return 0;\n   else {\n      // Each component is stored separately. Allocate scratch space for full output scanline.\n      unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4);\n      int i, len;\n      char buffer[128];\n      char header[] = \"#?RADIANCE\\n# Written by stb_image_write.h\\nFORMAT=32-bit_rle_rgbe\\n\";\n      s->func(s->context, header, sizeof(header)-1);\n\n      len = sprintf(buffer, \"EXPOSURE=          1.0000000000000\\n\\n-Y %d +X %d\\n\", y, x);\n      s->func(s->context, buffer, len);\n\n      for(i=0; i < y; i++)\n         stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*i*x);\n      STBIW_FREE(scratch);\n      return 1;\n   }\n}\n\nSTBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_hdr_core(&s, x, y, comp, (float *) data);\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif // STBI_WRITE_NO_STDIO\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// PNG writer\n//\n\n// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()\n#define stbiw__sbraw(a) ((int *) (a) - 2)\n#define stbiw__sbm(a)   stbiw__sbraw(a)[0]\n#define stbiw__sbn(a)   stbiw__sbraw(a)[1]\n\n#define stbiw__sbneedgrow(a,n)  ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a))\n#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0)\n#define stbiw__sbgrow(a,n)  stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a)))\n\n#define stbiw__sbpush(a, v)      (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v))\n#define stbiw__sbcount(a)        ((a) ? stbiw__sbn(a) : 0)\n#define stbiw__sbfree(a)         ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0)\n\nstatic void *stbiw__sbgrowf(void **arr, int increment, int itemsize)\n{\n   int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1;\n   void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2);\n   STBIW_ASSERT(p);\n   if (p) {\n      if (!*arr) ((int *) p)[1] = 0;\n      *arr = (void *) ((int *) p + 2);\n      stbiw__sbm(*arr) = m;\n   }\n   return *arr;\n}\n\nstatic unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount)\n{\n   while (*bitcount >= 8) {\n      stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer));\n      *bitbuffer >>= 8;\n      *bitcount -= 8;\n   }\n   return data;\n}\n\nstatic int stbiw__zlib_bitrev(int code, int codebits)\n{\n   int res=0;\n   while (codebits--) {\n      res = (res << 1) | (code & 1);\n      code >>= 1;\n   }\n   return res;\n}\n\nstatic unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit)\n{\n   int i;\n   for (i=0; i < limit && i < 258; ++i)\n      if (a[i] != b[i]) break;\n   return i;\n}\n\nstatic unsigned int stbiw__zhash(unsigned char *data)\n{\n   stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16);\n   hash ^= hash << 3;\n   hash += hash >> 5;\n   hash ^= hash << 4;\n   hash += hash >> 17;\n   hash ^= hash << 25;\n   hash += hash >> 6;\n   return hash;\n}\n\n#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount))\n#define stbiw__zlib_add(code,codebits) \\\n      (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush())\n#define stbiw__zlib_huffa(b,c)  stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c)\n// default huffman tables\n#define stbiw__zlib_huff1(n)  stbiw__zlib_huffa(0x30 + (n), 8)\n#define stbiw__zlib_huff2(n)  stbiw__zlib_huffa(0x190 + (n)-144, 9)\n#define stbiw__zlib_huff3(n)  stbiw__zlib_huffa(0 + (n)-256,7)\n#define stbiw__zlib_huff4(n)  stbiw__zlib_huffa(0xc0 + (n)-280,8)\n#define stbiw__zlib_huff(n)  ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n))\n#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n))\n\n#define stbiw__ZHASH   16384\n\nunsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality)\n{\n   static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 };\n   static unsigned char  lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5,  0 };\n   static unsigned short distc[]   = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 };\n   static unsigned char  disteb[]  = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };\n   unsigned int bitbuf=0;\n   int i,j, bitcount=0;\n   unsigned char *out = NULL;\n   unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(char**));\n   if (quality < 5) quality = 5;\n\n   stbiw__sbpush(out, 0x78);   // DEFLATE 32K window\n   stbiw__sbpush(out, 0x5e);   // FLEVEL = 1\n   stbiw__zlib_add(1,1);  // BFINAL = 1\n   stbiw__zlib_add(1,2);  // BTYPE = 1 -- fixed huffman\n\n   for (i=0; i < stbiw__ZHASH; ++i)\n      hash_table[i] = NULL;\n\n   i=0;\n   while (i < data_len-3) {\n      // hash next 3 bytes of data to be compressed\n      int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3;\n      unsigned char *bestloc = 0;\n      unsigned char **hlist = hash_table[h];\n      int n = stbiw__sbcount(hlist);\n      for (j=0; j < n; ++j) {\n         if (hlist[j]-data > i-32768) { // if entry lies within window\n            int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i);\n            if (d >= best) best=d,bestloc=hlist[j];\n         }\n      }\n      // when hash table entry is too long, delete half the entries\n      if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) {\n         STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality);\n         stbiw__sbn(hash_table[h]) = quality;\n      }\n      stbiw__sbpush(hash_table[h],data+i);\n\n      if (bestloc) {\n         // \"lazy matching\" - check match at *next* byte, and if it's better, do cur byte as literal\n         h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1);\n         hlist = hash_table[h];\n         n = stbiw__sbcount(hlist);\n         for (j=0; j < n; ++j) {\n            if (hlist[j]-data > i-32767) {\n               int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1);\n               if (e > best) { // if next match is better, bail on current match\n                  bestloc = NULL;\n                  break;\n               }\n            }\n         }\n      }\n\n      if (bestloc) {\n         int d = (int) (data+i - bestloc); // distance back\n         STBIW_ASSERT(d <= 32767 && best <= 258);\n         for (j=0; best > lengthc[j+1]-1; ++j);\n         stbiw__zlib_huff(j+257);\n         if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]);\n         for (j=0; d > distc[j+1]-1; ++j);\n         stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5);\n         if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]);\n         i += best;\n      } else {\n         stbiw__zlib_huffb(data[i]);\n         ++i;\n      }\n   }\n   // write out final bytes\n   for (;i < data_len; ++i)\n      stbiw__zlib_huffb(data[i]);\n   stbiw__zlib_huff(256); // end of block\n   // pad with 0 bits to byte boundary\n   while (bitcount)\n      stbiw__zlib_add(0,1);\n\n   for (i=0; i < stbiw__ZHASH; ++i)\n      (void) stbiw__sbfree(hash_table[i]);\n   STBIW_FREE(hash_table);\n\n   {\n      // compute adler32 on input\n      unsigned int s1=1, s2=0;\n      int blocklen = (int) (data_len % 5552);\n      j=0;\n      while (j < data_len) {\n         for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1;\n         s1 %= 65521, s2 %= 65521;\n         j += blocklen;\n         blocklen = 5552;\n      }\n      stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8));\n      stbiw__sbpush(out, STBIW_UCHAR(s2));\n      stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8));\n      stbiw__sbpush(out, STBIW_UCHAR(s1));\n   }\n   *out_len = stbiw__sbn(out);\n   // make returned pointer freeable\n   STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len);\n   return (unsigned char *) stbiw__sbraw(out);\n}\n\nstatic unsigned int stbiw__crc32(unsigned char *buffer, int len)\n{\n   static unsigned int crc_table[256] =\n   {\n      0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n      0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n      0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n      0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n      0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n      0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n      0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n      0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n      0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n      0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n      0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n      0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n      0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n      0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n      0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n      0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n      0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n      0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n      0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n      0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n      0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n      0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n      0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n      0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n      0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n      0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n      0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n      0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n      0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n      0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n      0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n      0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\n   };\n\n   unsigned int crc = ~0u;\n   int i;\n   for (i=0; i < len; ++i)\n      crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)];\n   return ~crc;\n}\n\n#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4)\n#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v));\n#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3])\n\nstatic void stbiw__wpcrc(unsigned char **data, int len)\n{\n   unsigned int crc = stbiw__crc32(*data - len - 4, len+4);\n   stbiw__wp32(*data, crc);\n}\n\nstatic unsigned char stbiw__paeth(int a, int b, int c)\n{\n   int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c);\n   if (pa <= pb && pa <= pc) return STBIW_UCHAR(a);\n   if (pb <= pc) return STBIW_UCHAR(b);\n   return STBIW_UCHAR(c);\n}\n\n// @OPTIMIZE: provide an option that always forces left-predict or paeth predict\nunsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len)\n{\n   int ctype[5] = { -1, 0, 4, 2, 6 };\n   unsigned char sig[8] = { 137,80,78,71,13,10,26,10 };\n   unsigned char *out,*o, *filt, *zlib;\n   signed char *line_buffer;\n   int i,j,k,p,zlen;\n\n   if (stride_bytes == 0)\n      stride_bytes = x * n;\n\n   filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0;\n   line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; }\n   for (j=0; j < y; ++j) {\n      static int mapping[] = { 0,1,2,3,4 };\n      static int firstmap[] = { 0,1,0,5,6 };\n      int *mymap = (j != 0) ? mapping : firstmap;\n      int best = 0, bestval = 0x7fffffff;\n      for (p=0; p < 2; ++p) {\n         for (k= p?best:0; k < 5; ++k) { // @TODO: clarity: rewrite this to go 0..5, and 'continue' the unwanted ones during 2nd pass\n            int type = mymap[k],est=0;\n            unsigned char *z = pixels + stride_bytes*j;\n            for (i=0; i < n; ++i)\n               switch (type) {\n                  case 0: line_buffer[i] = z[i]; break;\n                  case 1: line_buffer[i] = z[i]; break;\n                  case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;\n                  case 3: line_buffer[i] = z[i] - (z[i-stride_bytes]>>1); break;\n                  case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-stride_bytes],0)); break;\n                  case 5: line_buffer[i] = z[i]; break;\n                  case 6: line_buffer[i] = z[i]; break;\n               }\n            for (i=n; i < x*n; ++i) {\n               switch (type) {\n                  case 0: line_buffer[i] = z[i]; break;\n                  case 1: line_buffer[i] = z[i] - z[i-n]; break;\n                  case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;\n                  case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-stride_bytes])>>1); break;\n                  case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-stride_bytes], z[i-stride_bytes-n]); break;\n                  case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break;\n                  case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break;\n               }\n            }\n            if (p) break;\n            for (i=0; i < x*n; ++i)\n               est += abs((signed char) line_buffer[i]);\n            if (est < bestval) { bestval = est; best = k; }\n         }\n      }\n      // when we get here, best contains the filter type, and line_buffer contains the data\n      filt[j*(x*n+1)] = (unsigned char) best;\n      STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n);\n   }\n   STBIW_FREE(line_buffer);\n   zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); // increase 8 to get smaller but use more memory\n   STBIW_FREE(filt);\n   if (!zlib) return 0;\n\n   // each tag requires 12 bytes of overhead\n   out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12);\n   if (!out) return 0;\n   *out_len = 8 + 12+13 + 12+zlen + 12;\n\n   o=out;\n   STBIW_MEMMOVE(o,sig,8); o+= 8;\n   stbiw__wp32(o, 13); // header length\n   stbiw__wptag(o, \"IHDR\");\n   stbiw__wp32(o, x);\n   stbiw__wp32(o, y);\n   *o++ = 8;\n   *o++ = STBIW_UCHAR(ctype[n]);\n   *o++ = 0;\n   *o++ = 0;\n   *o++ = 0;\n   stbiw__wpcrc(&o,13);\n\n   stbiw__wp32(o, zlen);\n   stbiw__wptag(o, \"IDAT\");\n   STBIW_MEMMOVE(o, zlib, zlen);\n   o += zlen;\n   STBIW_FREE(zlib);\n   stbiw__wpcrc(&o, zlen);\n\n   stbiw__wp32(o,0);\n   stbiw__wptag(o, \"IEND\");\n   stbiw__wpcrc(&o,0);\n\n   STBIW_ASSERT(o == out + *out_len);\n\n   return out;\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes)\n{\n   FILE *f;\n   int len;\n   unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);\n   if (png == NULL) return 0;\n   f = fopen(filename, \"wb\");\n   if (!f) { STBIW_FREE(png); return 0; }\n   fwrite(png, 1, len, f);\n   fclose(f);\n   STBIW_FREE(png);\n   return 1;\n}\n#endif\n\nSTBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes)\n{\n   int len;\n   unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);\n   if (png == NULL) return 0;\n   func(context, png, len);\n   STBIW_FREE(png);\n   return 1;\n}\n\n\n/* ***************************************************************************\n *\n * JPEG writer\n *\n * This is based on Jon Olick's jo_jpeg.cpp:\n * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html\n */\n\nstatic const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,\n      24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 };\n\nstatic void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) {\n   int bitBuf = *bitBufP, bitCnt = *bitCntP;\n   bitCnt += bs[1];\n   bitBuf |= bs[0] << (24 - bitCnt);\n   while(bitCnt >= 8) {\n      unsigned char c = (bitBuf >> 16) & 255;\n      stbiw__putc(s, c);\n      if(c == 255) {\n         stbiw__putc(s, 0);\n      }\n      bitBuf <<= 8;\n      bitCnt -= 8;\n   }\n   *bitBufP = bitBuf;\n   *bitCntP = bitCnt;\n}\n\nstatic void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) {\n   float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p;\n   float z1, z2, z3, z4, z5, z11, z13;\n\n   float tmp0 = d0 + d7;\n   float tmp7 = d0 - d7;\n   float tmp1 = d1 + d6;\n   float tmp6 = d1 - d6;\n   float tmp2 = d2 + d5;\n   float tmp5 = d2 - d5;\n   float tmp3 = d3 + d4;\n   float tmp4 = d3 - d4;\n\n   // Even part\n   float tmp10 = tmp0 + tmp3;   // phase 2\n   float tmp13 = tmp0 - tmp3;\n   float tmp11 = tmp1 + tmp2;\n   float tmp12 = tmp1 - tmp2;\n\n   d0 = tmp10 + tmp11;       // phase 3\n   d4 = tmp10 - tmp11;\n\n   z1 = (tmp12 + tmp13) * 0.707106781f; // c4\n   d2 = tmp13 + z1;       // phase 5\n   d6 = tmp13 - z1;\n\n   // Odd part\n   tmp10 = tmp4 + tmp5;       // phase 2\n   tmp11 = tmp5 + tmp6;\n   tmp12 = tmp6 + tmp7;\n\n   // The rotator is modified from fig 4-8 to avoid extra negations.\n   z5 = (tmp10 - tmp12) * 0.382683433f; // c6\n   z2 = tmp10 * 0.541196100f + z5; // c2-c6\n   z4 = tmp12 * 1.306562965f + z5; // c2+c6\n   z3 = tmp11 * 0.707106781f; // c4\n\n   z11 = tmp7 + z3;      // phase 5\n   z13 = tmp7 - z3;\n\n   *d5p = z13 + z2;         // phase 6\n   *d3p = z13 - z2;\n   *d1p = z11 + z4;\n   *d7p = z11 - z4;\n\n   *d0p = d0;  *d2p = d2;  *d4p = d4;  *d6p = d6;\n}\n\nstatic void stbiw__jpg_calcBits(int val, unsigned short bits[2]) {\n   int tmp1 = val < 0 ? -val : val;\n   val = val < 0 ? val-1 : val;\n   bits[1] = 1;\n   while(tmp1 >>= 1) {\n      ++bits[1];\n   }\n   bits[0] = val & ((1<<bits[1])-1);\n}\n\nstatic int stbiw__jpg_processDU(stbi__write_context *s, int *bitBuf, int *bitCnt, float *CDU, float *fdtbl, int DC, const unsigned short HTDC[256][2], const unsigned short HTAC[256][2]) {\n   const unsigned short EOB[2] = { HTAC[0x00][0], HTAC[0x00][1] };\n   const unsigned short M16zeroes[2] = { HTAC[0xF0][0], HTAC[0xF0][1] };\n   int dataOff, i, diff, end0pos;\n   int DU[64];\n\n   // DCT rows\n   for(dataOff=0; dataOff<64; dataOff+=8) {\n      stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+1], &CDU[dataOff+2], &CDU[dataOff+3], &CDU[dataOff+4], &CDU[dataOff+5], &CDU[dataOff+6], &CDU[dataOff+7]);\n   }\n   // DCT columns\n   for(dataOff=0; dataOff<8; ++dataOff) {\n      stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+8], &CDU[dataOff+16], &CDU[dataOff+24], &CDU[dataOff+32], &CDU[dataOff+40], &CDU[dataOff+48], &CDU[dataOff+56]);\n   }\n   // Quantize/descale/zigzag the coefficients\n   for(i=0; i<64; ++i) {\n      float v = CDU[i]*fdtbl[i];\n      // DU[stbiw__jpg_ZigZag[i]] = (int)(v < 0 ? ceilf(v - 0.5f) : floorf(v + 0.5f));\n      // ceilf() and floorf() are C99, not C89, but I /think/ they're not needed here anyway?\n      DU[stbiw__jpg_ZigZag[i]] = (int)(v < 0 ? v - 0.5f : v + 0.5f);\n   }\n\n   // Encode DC\n   diff = DU[0] - DC;\n   if (diff == 0) {\n      stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[0]);\n   } else {\n      unsigned short bits[2];\n      stbiw__jpg_calcBits(diff, bits);\n      stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTDC[bits[1]]);\n      stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits);\n   }\n   // Encode ACs\n   end0pos = 63;\n   for(; (end0pos>0)&&(DU[end0pos]==0); --end0pos) {\n   }\n   // end0pos = first element in reverse order !=0\n   if(end0pos == 0) {\n      stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB);\n      return DU[0];\n   }\n   for(i = 1; i <= end0pos; ++i) {\n      int startpos = i;\n      int nrzeroes;\n      unsigned short bits[2];\n      for (; DU[i]==0 && i<=end0pos; ++i) {\n      }\n      nrzeroes = i-startpos;\n      if ( nrzeroes >= 16 ) {\n         int lng = nrzeroes>>4;\n         int nrmarker;\n         for (nrmarker=1; nrmarker <= lng; ++nrmarker)\n            stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes);\n         nrzeroes &= 15;\n      }\n      stbiw__jpg_calcBits(DU[i], bits);\n      stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]);\n      stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits);\n   }\n   if(end0pos != 63) {\n      stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB);\n   }\n   return DU[0];\n}\n\nstatic int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) {\n   // Constants that don't pollute global namespace\n   static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0};\n   static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11};\n   static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d};\n   static const unsigned char std_ac_luminance_values[] = {\n      0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,\n      0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,\n      0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,\n      0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,\n      0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,\n      0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,\n      0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa\n   };\n   static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0};\n   static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11};\n   static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77};\n   static const unsigned char std_ac_chrominance_values[] = {\n      0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,\n      0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,\n      0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,\n      0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,\n      0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,\n      0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,\n      0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa\n   };\n   // Huffman tables\n   static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}};\n   static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}};\n   static const unsigned short YAC_HT[256][2] = {\n      {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0}\n   };\n   static const unsigned short UVAC_HT[256][2] = {\n      {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0},\n      {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0}\n   };\n   static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,\n                             37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99};\n   static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,\n                              99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99};\n   static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, \n                                 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f };\n\n   int row, col, i, k;\n   float fdtbl_Y[64], fdtbl_UV[64];\n   unsigned char YTable[64], UVTable[64];\n\n   if(!data || !width || !height || comp > 4 || comp < 1) {\n      return 0;\n   }\n\n   quality = quality ? quality : 90;\n   quality = quality < 1 ? 1 : quality > 100 ? 100 : quality;\n   quality = quality < 50 ? 5000 / quality : 200 - quality * 2;\n\n   for(i = 0; i < 64; ++i) {\n      int uvti, yti = (YQT[i]*quality+50)/100;\n      YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti);\n      uvti = (UVQT[i]*quality+50)/100;\n      UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti);\n   }\n\n   for(row = 0, k = 0; row < 8; ++row) {\n      for(col = 0; col < 8; ++col, ++k) {\n         fdtbl_Y[k]  = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]);\n         fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]);\n      }\n   }\n\n   // Write Headers\n   {\n      static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 };\n      static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 };\n      const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width),\n                                      3,1,0x11,0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 };\n      s->func(s->context, (void*)head0, sizeof(head0));\n      s->func(s->context, (void*)YTable, sizeof(YTable));\n      stbiw__putc(s, 1);\n      s->func(s->context, UVTable, sizeof(UVTable));\n      s->func(s->context, (void*)head1, sizeof(head1));\n      s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1);\n      s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values));\n      stbiw__putc(s, 0x10); // HTYACinfo\n      s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1);\n      s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values));\n      stbiw__putc(s, 1); // HTUDCinfo\n      s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1);\n      s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values));\n      stbiw__putc(s, 0x11); // HTUACinfo\n      s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1);\n      s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values));\n      s->func(s->context, (void*)head2, sizeof(head2));\n   }\n\n   // Encode 8x8 macroblocks\n   {\n      static const unsigned short fillBits[] = {0x7F, 7};\n      const unsigned char *imageData = (const unsigned char *)data;\n      int DCY=0, DCU=0, DCV=0;\n      int bitBuf=0, bitCnt=0;\n      // comp == 2 is grey+alpha (alpha is ignored)\n      int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0;\n      int x, y, pos;\n      for(y = 0; y < height; y += 8) {\n         for(x = 0; x < width; x += 8) {\n            float YDU[64], UDU[64], VDU[64];\n            for(row = y, pos = 0; row < y+8; ++row) {\n               for(col = x; col < x+8; ++col, ++pos) {\n                  int p = row*width*comp + col*comp;\n                  float r, g, b;\n                  if(row >= height) {\n                     p -= width*comp*(row+1 - height);\n                  }\n                  if(col >= width) {\n                     p -= comp*(col+1 - width);\n                  }\n\n                  r = imageData[p+0];\n                  g = imageData[p+ofsG];\n                  b = imageData[p+ofsB];\n                  YDU[pos]=+0.29900f*r+0.58700f*g+0.11400f*b-128;\n                  UDU[pos]=-0.16874f*r-0.33126f*g+0.50000f*b;\n                  VDU[pos]=+0.50000f*r-0.41869f*g-0.08131f*b;\n               }\n            }\n\n            DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);\n            DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);\n            DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);\n         }\n      }\n\n      // Do the bit alignment of the EOI marker\n      stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits);\n   }\n\n   // EOI\n   stbiw__putc(s, 0xFF);\n   stbiw__putc(s, 0xD9);\n\n   return 1;\n}\n\nSTBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality);\n}\n\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_jpg_core(&s, x, y, comp, data, quality);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif\n\n#endif // STB_IMAGE_WRITE_IMPLEMENTATION\n\n/* Revision history\n      1.07  (2017-07-24)\n             doc fix\n      1.06 (2017-07-23)\n             writing JPEG (using Jon Olick's code)\n      1.05   ???\n      1.04 (2017-03-03)\n             monochrome BMP expansion\n      1.03   ???\n      1.02 (2016-04-02)\n             avoid allocating large structures on the stack\n      1.01 (2016-01-16)\n             STBIW_REALLOC_SIZED: support allocators with no realloc support\n             avoid race-condition in crc initialization\n             minor compile issues\n      1.00 (2015-09-14)\n             installable file IO function\n      0.99 (2015-09-13)\n             warning fixes; TGA rle support\n      0.98 (2015-04-08)\n             added STBIW_MALLOC, STBIW_ASSERT etc\n      0.97 (2015-01-18)\n             fixed HDR asserts, rewrote HDR rle logic\n      0.96 (2015-01-17)\n             add HDR output\n             fix monochrome BMP\n      0.95 (2014-08-17)\n\t\t       add monochrome TGA output\n      0.94 (2014-05-31)\n             rename private functions to avoid conflicts with stb_image.h\n      0.93 (2014-05-27)\n             warning fixes\n      0.92 (2010-08-01)\n             casts to unsigned char to fix warnings\n      0.91 (2010-07-17)\n             first public release\n      0.90   first internal release\n*/\n\n/*\n------------------------------------------------------------------------------\nThis software is available under 2 licenses -- choose whichever you prefer.\n------------------------------------------------------------------------------\nALTERNATIVE A - MIT License\nCopyright (c) 2017 Sean Barrett\nPermission is hereby granted, free of charge, to any person obtaining a copy of \nthis software and associated documentation files (the \"Software\"), to deal in \nthe Software without restriction, including without limitation the rights to \nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies \nof the Software, and to permit persons to whom the Software is furnished to do \nso, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all \ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE \nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE \nSOFTWARE.\n------------------------------------------------------------------------------\nALTERNATIVE B - Public Domain (www.unlicense.org)\nThis is free and unencumbered software released into the public domain.\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this \nsoftware, either in source code form or as a compiled binary, for any purpose, \ncommercial or non-commercial, and by any means.\nIn jurisdictions that recognize copyright laws, the author or authors of this \nsoftware dedicate any and all copyright interest in the software to the public \ndomain. We make this dedication for the benefit of the public at large and to \nthe detriment of our heirs and successors. We intend this dedication to be an \novert act of relinquishment in perpetuity of all present and future rights to \nthis software under copyright law.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE \nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN \nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION \nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n------------------------------------------------------------------------------\n*/\n"
  },
  {
    "path": "external/tiny_obj_loader.h",
    "content": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2012-2017 Syoyo Fujita and many contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n//\n// version 1.1.0 : Support parsing vertex color(#144)\n// version 1.0.8 : Fix parsing `g` tag just after `usemtl`(#138)\n// version 1.0.7 : Support multiple tex options(#126)\n// version 1.0.6 : Add TINYOBJLOADER_USE_DOUBLE option(#124)\n// version 1.0.5 : Ignore `Tr` when `d` exists in MTL(#43)\n// version 1.0.4 : Support multiple filenames for 'mtllib'(#112)\n// version 1.0.3 : Support parsing texture options(#85)\n// version 1.0.2 : Improve parsing speed by about a factor of 2 for large\n// files(#105)\n// version 1.0.1 : Fixes a shape is lost if obj ends with a 'usemtl'(#104)\n// version 1.0.0 : Change data structure. Change license from BSD to MIT.\n//\n\n//\n// Use this in *one* .cc\n//   #define TINYOBJLOADER_IMPLEMENTATION\n//   #include \"tiny_obj_loader.h\"\n//\n\n#ifndef TINY_OBJ_LOADER_H_\n#define TINY_OBJ_LOADER_H_\n\n#include <map>\n#include <string>\n#include <vector>\n\nnamespace tinyobj {\n\n// https://en.wikipedia.org/wiki/Wavefront_.obj_file says ...\n//\n//  -blendu on | off                       # set horizontal texture blending\n//  (default on)\n//  -blendv on | off                       # set vertical texture blending\n//  (default on)\n//  -boost real_value                      # boost mip-map sharpness\n//  -mm base_value gain_value              # modify texture map values (default\n//  0 1)\n//                                         #     base_value = brightness,\n//                                         gain_value = contrast\n//  -o u [v [w]]                           # Origin offset             (default\n//  0 0 0)\n//  -s u [v [w]]                           # Scale                     (default\n//  1 1 1)\n//  -t u [v [w]]                           # Turbulence                (default\n//  0 0 0)\n//  -texres resolution                     # texture resolution to create\n//  -clamp on | off                        # only render texels in the clamped\n//  0-1 range (default off)\n//                                         #   When unclamped, textures are\n//                                         repeated across a surface,\n//                                         #   when clamped, only texels which\n//                                         fall within the 0-1\n//                                         #   range are rendered.\n//  -bm mult_value                         # bump multiplier (for bump maps\n//  only)\n//\n//  -imfchan r | g | b | m | l | z         # specifies which channel of the file\n//  is used to\n//                                         # create a scalar or bump texture.\n//                                         r:red, g:green,\n//                                         # b:blue, m:matte, l:luminance,\n//                                         z:z-depth..\n//                                         # (the default for bump is 'l' and\n//                                         for decal is 'm')\n//  bump -imfchan r bumpmap.tga            # says to use the red channel of\n//  bumpmap.tga as the bumpmap\n//\n// For reflection maps...\n//\n//   -type sphere                           # specifies a sphere for a \"refl\"\n//   reflection map\n//   -type cube_top    | cube_bottom |      # when using a cube map, the texture\n//   file for each\n//         cube_front  | cube_back   |      # side of the cube is specified\n//         separately\n//         cube_left   | cube_right\n\n#ifdef TINYOBJLOADER_USE_DOUBLE\n//#pragma message \"using double\"\ntypedef double real_t;\n#else\n//#pragma message \"using float\"\ntypedef float real_t;\n#endif\n\ntypedef enum {\n  TEXTURE_TYPE_NONE,  // default\n  TEXTURE_TYPE_SPHERE,\n  TEXTURE_TYPE_CUBE_TOP,\n  TEXTURE_TYPE_CUBE_BOTTOM,\n  TEXTURE_TYPE_CUBE_FRONT,\n  TEXTURE_TYPE_CUBE_BACK,\n  TEXTURE_TYPE_CUBE_LEFT,\n  TEXTURE_TYPE_CUBE_RIGHT\n} texture_type_t;\n\ntypedef struct {\n  texture_type_t type;      // -type (default TEXTURE_TYPE_NONE)\n  real_t sharpness;         // -boost (default 1.0?)\n  real_t brightness;        // base_value in -mm option (default 0)\n  real_t contrast;          // gain_value in -mm option (default 1)\n  real_t origin_offset[3];  // -o u [v [w]] (default 0 0 0)\n  real_t scale[3];          // -s u [v [w]] (default 1 1 1)\n  real_t turbulence[3];     // -t u [v [w]] (default 0 0 0)\n  // int   texture_resolution; // -texres resolution (default = ?) TODO\n  bool clamp;    // -clamp (default false)\n  char imfchan;  // -imfchan (the default for bump is 'l' and for decal is 'm')\n  bool blendu;   // -blendu (default on)\n  bool blendv;   // -blendv (default on)\n  real_t bump_multiplier;  // -bm (for bump maps only, default 1.0)\n} texture_option_t;\n\ntypedef struct {\n  std::string name;\n\n  real_t ambient[3];\n  real_t diffuse[3];\n  real_t specular[3];\n  real_t transmittance[3];\n  real_t emission[3];\n  real_t shininess;\n  real_t ior;       // index of refraction\n  real_t dissolve;  // 1 == opaque; 0 == fully transparent\n  // illumination model (see http://www.fileformat.info/format/material/)\n  int illum;\n\n  int dummy;  // Suppress padding warning.\n\n  std::string ambient_texname;             // map_Ka\n  std::string diffuse_texname;             // map_Kd\n  std::string specular_texname;            // map_Ks\n  std::string specular_highlight_texname;  // map_Ns\n  std::string bump_texname;                // map_bump, map_Bump, bump\n  std::string displacement_texname;        // disp\n  std::string alpha_texname;               // map_d\n  std::string reflection_texname;          // refl\n\n  texture_option_t ambient_texopt;\n  texture_option_t diffuse_texopt;\n  texture_option_t specular_texopt;\n  texture_option_t specular_highlight_texopt;\n  texture_option_t bump_texopt;\n  texture_option_t displacement_texopt;\n  texture_option_t alpha_texopt;\n  texture_option_t reflection_texopt;\n\n  // PBR extension\n  // http://exocortex.com/blog/extending_wavefront_mtl_to_support_pbr\n  real_t roughness;            // [0, 1] default 0\n  real_t metallic;             // [0, 1] default 0\n  real_t sheen;                // [0, 1] default 0\n  real_t clearcoat_thickness;  // [0, 1] default 0\n  real_t clearcoat_roughness;  // [0, 1] default 0\n  real_t anisotropy;           // aniso. [0, 1] default 0\n  real_t anisotropy_rotation;  // anisor. [0, 1] default 0\n  real_t pad0;\n  std::string roughness_texname;  // map_Pr\n  std::string metallic_texname;   // map_Pm\n  std::string sheen_texname;      // map_Ps\n  std::string emissive_texname;   // map_Ke\n  std::string normal_texname;     // norm. For normal mapping.\n\n  texture_option_t roughness_texopt;\n  texture_option_t metallic_texopt;\n  texture_option_t sheen_texopt;\n  texture_option_t emissive_texopt;\n  texture_option_t normal_texopt;\n\n  int pad2;\n\n  std::map<std::string, std::string> unknown_parameter;\n} material_t;\n\ntypedef struct {\n  std::string name;\n\n  std::vector<int> intValues;\n  std::vector<real_t> floatValues;\n  std::vector<std::string> stringValues;\n} tag_t;\n\n// Index struct to support different indices for vtx/normal/texcoord.\n// -1 means not used.\ntypedef struct {\n  int vertex_index;\n  int normal_index;\n  int texcoord_index;\n} index_t;\n\ntypedef struct {\n  std::vector<index_t> indices;\n  std::vector<unsigned char> num_face_vertices;  // The number of vertices per\n                                                 // face. 3 = polygon, 4 = quad,\n                                                 // ... Up to 255.\n  std::vector<int> material_ids;                 // per-face material ID\n  std::vector<tag_t> tags;                       // SubD tag\n} mesh_t;\n\ntypedef struct {\n  std::string name;\n  mesh_t mesh;\n} shape_t;\n\n// Vertex attributes\ntypedef struct {\n  std::vector<real_t> vertices;   // 'v'\n  std::vector<real_t> normals;    // 'vn'\n  std::vector<real_t> texcoords;  // 'vt'\n  std::vector<real_t> colors;     // extension: vertex colors\n} attrib_t;\n\ntypedef struct callback_t_ {\n  // W is optional and set to 1 if there is no `w` item in `v` line\n  void (*vertex_cb)(void *user_data, real_t x, real_t y, real_t z, real_t w);\n  void (*normal_cb)(void *user_data, real_t x, real_t y, real_t z);\n\n  // y and z are optional and set to 0 if there is no `y` and/or `z` item(s) in\n  // `vt` line.\n  void (*texcoord_cb)(void *user_data, real_t x, real_t y, real_t z);\n\n  // called per 'f' line. num_indices is the number of face indices(e.g. 3 for\n  // triangle, 4 for quad)\n  // 0 will be passed for undefined index in index_t members.\n  void (*index_cb)(void *user_data, index_t *indices, int num_indices);\n  // `name` material name, `material_id` = the array index of material_t[]. -1\n  // if\n  // a material not found in .mtl\n  void (*usemtl_cb)(void *user_data, const char *name, int material_id);\n  // `materials` = parsed material data.\n  void (*mtllib_cb)(void *user_data, const material_t *materials,\n                    int num_materials);\n  // There may be multiple group names\n  void (*group_cb)(void *user_data, const char **names, int num_names);\n  void (*object_cb)(void *user_data, const char *name);\n\n  callback_t_()\n      : vertex_cb(NULL),\n        normal_cb(NULL),\n        texcoord_cb(NULL),\n        index_cb(NULL),\n        usemtl_cb(NULL),\n        mtllib_cb(NULL),\n        group_cb(NULL),\n        object_cb(NULL) {}\n} callback_t;\n\nclass MaterialReader {\n public:\n  MaterialReader() {}\n  virtual ~MaterialReader();\n\n  virtual bool operator()(const std::string &matId,\n                          std::vector<material_t> *materials,\n                          std::map<std::string, int> *matMap,\n                          std::string *err) = 0;\n};\n\nclass MaterialFileReader : public MaterialReader {\n public:\n  explicit MaterialFileReader(const std::string &mtl_basedir)\n      : m_mtlBaseDir(mtl_basedir) {}\n  virtual ~MaterialFileReader() {}\n  virtual bool operator()(const std::string &matId,\n                          std::vector<material_t> *materials,\n                          std::map<std::string, int> *matMap, std::string *err);\n\n private:\n  std::string m_mtlBaseDir;\n};\n\nclass MaterialStreamReader : public MaterialReader {\n public:\n  explicit MaterialStreamReader(std::istream &inStream)\n      : m_inStream(inStream) {}\n  virtual ~MaterialStreamReader() {}\n  virtual bool operator()(const std::string &matId,\n                          std::vector<material_t> *materials,\n                          std::map<std::string, int> *matMap, std::string *err);\n\n private:\n  std::istream &m_inStream;\n};\n\n/// Loads .obj from a file.\n/// 'attrib', 'shapes' and 'materials' will be filled with parsed shape data\n/// 'shapes' will be filled with parsed shape data\n/// Returns true when loading .obj become success.\n/// Returns warning and error message into `err`\n/// 'mtl_basedir' is optional, and used for base directory for .mtl file.\n/// In default(`NULL'), .mtl file is searched from an application's working\n/// directory.\n/// 'triangulate' is optional, and used whether triangulate polygon face in .obj\n/// or not.\nbool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,\n             std::vector<material_t> *materials, std::string *err,\n             const char *filename, const char *mtl_basedir = NULL,\n             bool triangulate = true);\n\n/// Loads .obj from a file with custom user callback.\n/// .mtl is loaded as usual and parsed material_t data will be passed to\n/// `callback.mtllib_cb`.\n/// Returns true when loading .obj/.mtl become success.\n/// Returns warning and error message into `err`\n/// See `examples/callback_api/` for how to use this function.\nbool LoadObjWithCallback(std::istream &inStream, const callback_t &callback,\n                         void *user_data = NULL,\n                         MaterialReader *readMatFn = NULL,\n                         std::string *err = NULL);\n\n/// Loads object from a std::istream, uses GetMtlIStreamFn to retrieve\n/// std::istream for materials.\n/// Returns true when loading .obj become success.\n/// Returns warning and error message into `err`\nbool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,\n             std::vector<material_t> *materials, std::string *err,\n             std::istream *inStream, MaterialReader *readMatFn = NULL,\n             bool triangulate = true);\n\n/// Loads materials into std::map\nvoid LoadMtl(std::map<std::string, int> *material_map,\n             std::vector<material_t> *materials, std::istream *inStream,\n             std::string *warning);\n\n}  // namespace tinyobj\n\n#endif  // TINY_OBJ_LOADER_H_\n\n#ifdef TINYOBJLOADER_IMPLEMENTATION\n#include <cassert>\n#include <cctype>\n#include <cmath>\n#include <cstddef>\n#include <cstdlib>\n#include <cstring>\n#include <utility>\n\n#include <fstream>\n#include <sstream>\n\nnamespace tinyobj {\n\nMaterialReader::~MaterialReader() {}\n\nstruct vertex_index {\n  int v_idx, vt_idx, vn_idx;\n  vertex_index() : v_idx(-1), vt_idx(-1), vn_idx(-1) {}\n  explicit vertex_index(int idx) : v_idx(idx), vt_idx(idx), vn_idx(idx) {}\n  vertex_index(int vidx, int vtidx, int vnidx)\n      : v_idx(vidx), vt_idx(vtidx), vn_idx(vnidx) {}\n};\n\nstruct tag_sizes {\n  tag_sizes() : num_ints(0), num_reals(0), num_strings(0) {}\n  int num_ints;\n  int num_reals;\n  int num_strings;\n};\n\nstruct obj_shape {\n  std::vector<real_t> v;\n  std::vector<real_t> vn;\n  std::vector<real_t> vt;\n};\n\n// See\n// http://stackoverflow.com/questions/6089231/getting-std-ifstream-to-handle-lf-cr-and-crlf\nstatic std::istream &safeGetline(std::istream &is, std::string &t) {\n  t.clear();\n\n  // The characters in the stream are read one-by-one using a std::streambuf.\n  // That is faster than reading them one-by-one using the std::istream.\n  // Code that uses streambuf this way must be guarded by a sentry object.\n  // The sentry object performs various tasks,\n  // such as thread synchronization and updating the stream state.\n\n  std::istream::sentry se(is, true);\n  std::streambuf *sb = is.rdbuf();\n\n  if (se) {\n    for (;;) {\n      int c = sb->sbumpc();\n      switch (c) {\n        case '\\n':\n          return is;\n        case '\\r':\n          if (sb->sgetc() == '\\n') sb->sbumpc();\n          return is;\n        case EOF:\n          // Also handle the case when the last line has no line ending\n          if (t.empty()) is.setstate(std::ios::eofbit);\n          return is;\n        default:\n          t += static_cast<char>(c);\n      }\n    }\n  }\n\n  return is;\n}\n\n#define IS_SPACE(x) (((x) == ' ') || ((x) == '\\t'))\n#define IS_DIGIT(x) \\\n  (static_cast<unsigned int>((x) - '0') < static_cast<unsigned int>(10))\n#define IS_NEW_LINE(x) (((x) == '\\r') || ((x) == '\\n') || ((x) == '\\0'))\n\n// Make index zero-base, and also support relative index.\nstatic inline bool fixIndex(int idx, int n, int *ret) {\n  if (!ret) {\n    return false;\n  }\n\n  if (idx > 0) {\n    (*ret) = idx - 1;\n    return true;\n  }\n\n  if (idx == 0) {\n    // zero is not allowed according to the spec.\n    return false;\n  }\n\n  if (idx < 0) {\n    (*ret) = n + idx;  // negative value = relative\n    return true;\n  }\n\n  return false;  // never reach here.\n}\n\nstatic inline std::string parseString(const char **token) {\n  std::string s;\n  (*token) += strspn((*token), \" \\t\");\n  size_t e = strcspn((*token), \" \\t\\r\");\n  s = std::string((*token), &(*token)[e]);\n  (*token) += e;\n  return s;\n}\n\nstatic inline int parseInt(const char **token) {\n  (*token) += strspn((*token), \" \\t\");\n  int i = atoi((*token));\n  (*token) += strcspn((*token), \" \\t\\r\");\n  return i;\n}\n\n// Tries to parse a floating point number located at s.\n//\n// s_end should be a location in the string where reading should absolutely\n// stop. For example at the end of the string, to prevent buffer overflows.\n//\n// Parses the following EBNF grammar:\n//   sign    = \"+\" | \"-\" ;\n//   END     = ? anything not in digit ?\n//   digit   = \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\" ;\n//   integer = [sign] , digit , {digit} ;\n//   decimal = integer , [\".\" , integer] ;\n//   float   = ( decimal , END ) | ( decimal , (\"E\" | \"e\") , integer , END ) ;\n//\n//  Valid strings are for example:\n//   -0  +3.1417e+2  -0.0E-3  1.0324  -1.41   11e2\n//\n// If the parsing is a success, result is set to the parsed value and true\n// is returned.\n//\n// The function is greedy and will parse until any of the following happens:\n//  - a non-conforming character is encountered.\n//  - s_end is reached.\n//\n// The following situations triggers a failure:\n//  - s >= s_end.\n//  - parse failure.\n//\nstatic bool tryParseDouble(const char *s, const char *s_end, double *result) {\n  if (s >= s_end) {\n    return false;\n  }\n\n  double mantissa = 0.0;\n  // This exponent is base 2 rather than 10.\n  // However the exponent we parse is supposed to be one of ten,\n  // thus we must take care to convert the exponent/and or the\n  // mantissa to a * 2^E, where a is the mantissa and E is the\n  // exponent.\n  // To get the final double we will use ldexp, it requires the\n  // exponent to be in base 2.\n  int exponent = 0;\n\n  // NOTE: THESE MUST BE DECLARED HERE SINCE WE ARE NOT ALLOWED\n  // TO JUMP OVER DEFINITIONS.\n  char sign = '+';\n  char exp_sign = '+';\n  char const *curr = s;\n\n  // How many characters were read in a loop.\n  int read = 0;\n  // Tells whether a loop terminated due to reaching s_end.\n  bool end_not_reached = false;\n\n  /*\n          BEGIN PARSING.\n  */\n\n  // Find out what sign we've got.\n  if (*curr == '+' || *curr == '-') {\n    sign = *curr;\n    curr++;\n  } else if (IS_DIGIT(*curr)) { /* Pass through. */\n  } else {\n    goto fail;\n  }\n\n  // Read the integer part.\n  end_not_reached = (curr != s_end);\n  while (end_not_reached && IS_DIGIT(*curr)) {\n    mantissa *= 10;\n    mantissa += static_cast<int>(*curr - 0x30);\n    curr++;\n    read++;\n    end_not_reached = (curr != s_end);\n  }\n\n  // We must make sure we actually got something.\n  if (read == 0) goto fail;\n  // We allow numbers of form \"#\", \"###\" etc.\n  if (!end_not_reached) goto assemble;\n\n  // Read the decimal part.\n  if (*curr == '.') {\n    curr++;\n    read = 1;\n    end_not_reached = (curr != s_end);\n    while (end_not_reached && IS_DIGIT(*curr)) {\n      static const double pow_lut[] = {\n          1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001,\n      };\n      const int lut_entries = sizeof pow_lut / sizeof pow_lut[0];\n\n      // NOTE: Don't use powf here, it will absolutely murder precision.\n      mantissa += static_cast<int>(*curr - 0x30) *\n                  (read < lut_entries ? pow_lut[read] : std::pow(10.0, -read));\n      read++;\n      curr++;\n      end_not_reached = (curr != s_end);\n    }\n  } else if (*curr == 'e' || *curr == 'E') {\n  } else {\n    goto assemble;\n  }\n\n  if (!end_not_reached) goto assemble;\n\n  // Read the exponent part.\n  if (*curr == 'e' || *curr == 'E') {\n    curr++;\n    // Figure out if a sign is present and if it is.\n    end_not_reached = (curr != s_end);\n    if (end_not_reached && (*curr == '+' || *curr == '-')) {\n      exp_sign = *curr;\n      curr++;\n    } else if (IS_DIGIT(*curr)) { /* Pass through. */\n    } else {\n      // Empty E is not allowed.\n      goto fail;\n    }\n\n    read = 0;\n    end_not_reached = (curr != s_end);\n    while (end_not_reached && IS_DIGIT(*curr)) {\n      exponent *= 10;\n      exponent += static_cast<int>(*curr - 0x30);\n      curr++;\n      read++;\n      end_not_reached = (curr != s_end);\n    }\n    exponent *= (exp_sign == '+' ? 1 : -1);\n    if (read == 0) goto fail;\n  }\n\nassemble:\n  *result = (sign == '+' ? 1 : -1) *\n            (exponent ? std::ldexp(mantissa * std::pow(5.0, exponent), exponent)\n                      : mantissa);\n  return true;\nfail:\n  return false;\n}\n\nstatic inline real_t parseReal(const char **token, double default_value = 0.0) {\n  (*token) += strspn((*token), \" \\t\");\n  const char *end = (*token) + strcspn((*token), \" \\t\\r\");\n  double val = default_value;\n  tryParseDouble((*token), end, &val);\n  real_t f = static_cast<real_t>(val);\n  (*token) = end;\n  return f;\n}\n\nstatic inline bool parseReal(const char **token, real_t *out) {\n  (*token) += strspn((*token), \" \\t\");\n  const char *end = (*token) + strcspn((*token), \" \\t\\r\");\n  double val;\n  bool ret = tryParseDouble((*token), end, &val);\n  if (ret) {\n    real_t f = static_cast<real_t>(val);\n    (*out) = f;\n  }\n  (*token) = end;\n  return ret;\n}\n\nstatic inline void parseReal2(real_t *x, real_t *y, const char **token,\n                              const double default_x = 0.0,\n                              const double default_y = 0.0) {\n  (*x) = parseReal(token, default_x);\n  (*y) = parseReal(token, default_y);\n}\n\nstatic inline void parseReal3(real_t *x, real_t *y, real_t *z,\n                              const char **token, const double default_x = 0.0,\n                              const double default_y = 0.0,\n                              const double default_z = 0.0) {\n  (*x) = parseReal(token, default_x);\n  (*y) = parseReal(token, default_y);\n  (*z) = parseReal(token, default_z);\n}\n\nstatic inline void parseV(real_t *x, real_t *y, real_t *z, real_t *w,\n                          const char **token, const double default_x = 0.0,\n                          const double default_y = 0.0,\n                          const double default_z = 0.0,\n                          const double default_w = 1.0) {\n  (*x) = parseReal(token, default_x);\n  (*y) = parseReal(token, default_y);\n  (*z) = parseReal(token, default_z);\n  (*w) = parseReal(token, default_w);\n}\n\n// Extension: parse vertex with colors(6 items)\nstatic inline bool parseVertexWithColor(real_t *x, real_t *y, real_t *z, real_t *r,\n                          real_t *g, real_t *b,\n                          const char **token, const double default_x = 0.0,\n                          const double default_y = 0.0,\n                          const double default_z = 0.0) {\n  (*x) = parseReal(token, default_x);\n  (*y) = parseReal(token, default_y);\n  (*z) = parseReal(token, default_z);\n\n  (*r) = parseReal(token, 1.0);\n  (*g) = parseReal(token, 1.0);\n  (*b) = parseReal(token, 1.0);\n\n  return true;\n}\n\nstatic inline bool parseOnOff(const char **token, bool default_value = true) {\n  (*token) += strspn((*token), \" \\t\");\n  const char *end = (*token) + strcspn((*token), \" \\t\\r\");\n\n  bool ret = default_value;\n  if ((0 == strncmp((*token), \"on\", 2))) {\n    ret = true;\n  } else if ((0 == strncmp((*token), \"off\", 3))) {\n    ret = false;\n  }\n\n  (*token) = end;\n  return ret;\n}\n\nstatic inline texture_type_t parseTextureType(\n    const char **token, texture_type_t default_value = TEXTURE_TYPE_NONE) {\n  (*token) += strspn((*token), \" \\t\");\n  const char *end = (*token) + strcspn((*token), \" \\t\\r\");\n  texture_type_t ty = default_value;\n\n  if ((0 == strncmp((*token), \"cube_top\", strlen(\"cube_top\")))) {\n    ty = TEXTURE_TYPE_CUBE_TOP;\n  } else if ((0 == strncmp((*token), \"cube_bottom\", strlen(\"cube_bottom\")))) {\n    ty = TEXTURE_TYPE_CUBE_BOTTOM;\n  } else if ((0 == strncmp((*token), \"cube_left\", strlen(\"cube_left\")))) {\n    ty = TEXTURE_TYPE_CUBE_LEFT;\n  } else if ((0 == strncmp((*token), \"cube_right\", strlen(\"cube_right\")))) {\n    ty = TEXTURE_TYPE_CUBE_RIGHT;\n  } else if ((0 == strncmp((*token), \"cube_front\", strlen(\"cube_front\")))) {\n    ty = TEXTURE_TYPE_CUBE_FRONT;\n  } else if ((0 == strncmp((*token), \"cube_back\", strlen(\"cube_back\")))) {\n    ty = TEXTURE_TYPE_CUBE_BACK;\n  } else if ((0 == strncmp((*token), \"sphere\", strlen(\"sphere\")))) {\n    ty = TEXTURE_TYPE_SPHERE;\n  }\n\n  (*token) = end;\n  return ty;\n}\n\nstatic tag_sizes parseTagTriple(const char **token) {\n  tag_sizes ts;\n\n  (*token) += strspn((*token), \" \\t\");\n  ts.num_ints = atoi((*token));\n  (*token) += strcspn((*token), \"/ \\t\\r\");\n  if ((*token)[0] != '/') {\n    return ts;\n  }\n\n  (*token)++; // Skip '/'\n\n  (*token) += strspn((*token), \" \\t\");\n  ts.num_reals = atoi((*token));\n  (*token) += strcspn((*token), \"/ \\t\\r\");\n  if ((*token)[0] != '/') {\n    return ts;\n  }\n  (*token)++; // Skip '/'\n\n  ts.num_strings = parseInt(token);\n\n  return ts;\n}\n\n// Parse triples with index offsets: i, i/j/k, i//k, i/j\nstatic bool parseTriple(const char **token, int vsize, int vnsize, int vtsize,\n                        vertex_index *ret) {\n  if (!ret) {\n    return false;\n  }\n\n  vertex_index vi(-1);\n\n  if (!fixIndex(atoi((*token)), vsize, &(vi.v_idx))) {\n    return false;\n  }\n\n  (*token) += strcspn((*token), \"/ \\t\\r\");\n  if ((*token)[0] != '/') {\n    (*ret) = vi;\n    return true;\n  }\n  (*token)++;\n\n  // i//k\n  if ((*token)[0] == '/') {\n    (*token)++;\n    if (!fixIndex(atoi((*token)), vnsize, &(vi.vn_idx))) {\n      return false;\n    }\n    (*token) += strcspn((*token), \"/ \\t\\r\");\n    (*ret) = vi;\n    return true;\n  }\n\n  // i/j/k or i/j\n  if (!fixIndex(atoi((*token)), vtsize, &(vi.vt_idx))) {\n    return false;\n  }\n\n  (*token) += strcspn((*token), \"/ \\t\\r\");\n  if ((*token)[0] != '/') {\n    (*ret) = vi;\n    return true;\n  }\n\n  // i/j/k\n  (*token)++;  // skip '/'\n  if (!fixIndex(atoi((*token)), vnsize, &(vi.vn_idx))) {\n    return false;\n  }\n  (*token) += strcspn((*token), \"/ \\t\\r\");\n\n  (*ret) = vi;\n\n  return true;\n}\n\n// Parse raw triples: i, i/j/k, i//k, i/j\nstatic vertex_index parseRawTriple(const char **token) {\n  vertex_index vi(static_cast<int>(0));  // 0 is an invalid index in OBJ\n\n  vi.v_idx = atoi((*token));\n  (*token) += strcspn((*token), \"/ \\t\\r\");\n  if ((*token)[0] != '/') {\n    return vi;\n  }\n  (*token)++;\n\n  // i//k\n  if ((*token)[0] == '/') {\n    (*token)++;\n    vi.vn_idx = atoi((*token));\n    (*token) += strcspn((*token), \"/ \\t\\r\");\n    return vi;\n  }\n\n  // i/j/k or i/j\n  vi.vt_idx = atoi((*token));\n  (*token) += strcspn((*token), \"/ \\t\\r\");\n  if ((*token)[0] != '/') {\n    return vi;\n  }\n\n  // i/j/k\n  (*token)++;  // skip '/'\n  vi.vn_idx = atoi((*token));\n  (*token) += strcspn((*token), \"/ \\t\\r\");\n  return vi;\n}\n\nstatic bool ParseTextureNameAndOption(std::string *texname,\n                                      texture_option_t *texopt,\n                                      const char *linebuf, const bool is_bump) {\n  // @todo { write more robust lexer and parser. }\n  bool found_texname = false;\n  std::string texture_name;\n\n  // Fill with default value for texopt.\n  if (is_bump) {\n    texopt->imfchan = 'l';\n  } else {\n    texopt->imfchan = 'm';\n  }\n  texopt->bump_multiplier = 1.0f;\n  texopt->clamp = false;\n  texopt->blendu = true;\n  texopt->blendv = true;\n  texopt->sharpness = 1.0f;\n  texopt->brightness = 0.0f;\n  texopt->contrast = 1.0f;\n  texopt->origin_offset[0] = 0.0f;\n  texopt->origin_offset[1] = 0.0f;\n  texopt->origin_offset[2] = 0.0f;\n  texopt->scale[0] = 1.0f;\n  texopt->scale[1] = 1.0f;\n  texopt->scale[2] = 1.0f;\n  texopt->turbulence[0] = 0.0f;\n  texopt->turbulence[1] = 0.0f;\n  texopt->turbulence[2] = 0.0f;\n  texopt->type = TEXTURE_TYPE_NONE;\n\n  const char *token = linebuf;  // Assume line ends with NULL\n\n  while (!IS_NEW_LINE((*token))) {\n    token += strspn(token, \" \\t\");  // skip space\n    if ((0 == strncmp(token, \"-blendu\", 7)) && IS_SPACE((token[7]))) {\n      token += 8;\n      texopt->blendu = parseOnOff(&token, /* default */ true);\n    } else if ((0 == strncmp(token, \"-blendv\", 7)) && IS_SPACE((token[7]))) {\n      token += 8;\n      texopt->blendv = parseOnOff(&token, /* default */ true);\n    } else if ((0 == strncmp(token, \"-clamp\", 6)) && IS_SPACE((token[6]))) {\n      token += 7;\n      texopt->clamp = parseOnOff(&token, /* default */ true);\n    } else if ((0 == strncmp(token, \"-boost\", 6)) && IS_SPACE((token[6]))) {\n      token += 7;\n      texopt->sharpness = parseReal(&token, 1.0);\n    } else if ((0 == strncmp(token, \"-bm\", 3)) && IS_SPACE((token[3]))) {\n      token += 4;\n      texopt->bump_multiplier = parseReal(&token, 1.0);\n    } else if ((0 == strncmp(token, \"-o\", 2)) && IS_SPACE((token[2]))) {\n      token += 3;\n      parseReal3(&(texopt->origin_offset[0]), &(texopt->origin_offset[1]),\n                 &(texopt->origin_offset[2]), &token);\n    } else if ((0 == strncmp(token, \"-s\", 2)) && IS_SPACE((token[2]))) {\n      token += 3;\n      parseReal3(&(texopt->scale[0]), &(texopt->scale[1]), &(texopt->scale[2]),\n                 &token, 1.0, 1.0, 1.0);\n    } else if ((0 == strncmp(token, \"-t\", 2)) && IS_SPACE((token[2]))) {\n      token += 3;\n      parseReal3(&(texopt->turbulence[0]), &(texopt->turbulence[1]),\n                 &(texopt->turbulence[2]), &token);\n    } else if ((0 == strncmp(token, \"-type\", 5)) && IS_SPACE((token[5]))) {\n      token += 5;\n      texopt->type = parseTextureType((&token), TEXTURE_TYPE_NONE);\n    } else if ((0 == strncmp(token, \"-imfchan\", 8)) && IS_SPACE((token[8]))) {\n      token += 9;\n      token += strspn(token, \" \\t\");\n      const char *end = token + strcspn(token, \" \\t\\r\");\n      if ((end - token) == 1) {  // Assume one char for -imfchan\n        texopt->imfchan = (*token);\n      }\n      token = end;\n    } else if ((0 == strncmp(token, \"-mm\", 3)) && IS_SPACE((token[3]))) {\n      token += 4;\n      parseReal2(&(texopt->brightness), &(texopt->contrast), &token, 0.0, 1.0);\n    } else {\n      // Assume texture filename\n#if 0\n      size_t len = strcspn(token, \" \\t\\r\");  // untile next space\n      texture_name = std::string(token, token + len);\n      token += len;\n\n      token += strspn(token, \" \\t\");  // skip space\n#else\n      // Read filename until line end to parse filename containing whitespace\n      // TODO(syoyo): Support parsing texture option flag after the filename.\n      texture_name = std::string(token);\n      token += texture_name.length();\n#endif\n\n      found_texname = true;\n    }\n  }\n\n  if (found_texname) {\n    (*texname) = texture_name;\n    return true;\n  } else {\n    return false;\n  }\n}\n\nstatic void InitMaterial(material_t *material) {\n  material->name = \"\";\n  material->ambient_texname = \"\";\n  material->diffuse_texname = \"\";\n  material->specular_texname = \"\";\n  material->specular_highlight_texname = \"\";\n  material->bump_texname = \"\";\n  material->displacement_texname = \"\";\n  material->reflection_texname = \"\";\n  material->alpha_texname = \"\";\n  for (int i = 0; i < 3; i++) {\n    material->ambient[i] = 0.f;\n    material->diffuse[i] = 0.f;\n    material->specular[i] = 0.f;\n    material->transmittance[i] = 0.f;\n    material->emission[i] = 0.f;\n  }\n  material->illum = 0;\n  material->dissolve = 1.f;\n  material->shininess = 1.f;\n  material->ior = 1.f;\n\n  material->roughness = 0.f;\n  material->metallic = 0.f;\n  material->sheen = 0.f;\n  material->clearcoat_thickness = 0.f;\n  material->clearcoat_roughness = 0.f;\n  material->anisotropy_rotation = 0.f;\n  material->anisotropy = 0.f;\n  material->roughness_texname = \"\";\n  material->metallic_texname = \"\";\n  material->sheen_texname = \"\";\n  material->emissive_texname = \"\";\n  material->normal_texname = \"\";\n\n  material->unknown_parameter.clear();\n}\n\nstatic bool exportFaceGroupToShape(\n    shape_t *shape, const std::vector<std::vector<vertex_index> > &faceGroup,\n    const std::vector<tag_t> &tags, const int material_id,\n    const std::string &name, bool triangulate) {\n  if (faceGroup.empty()) {\n    return false;\n  }\n\n  // Flatten vertices and indices\n  for (size_t i = 0; i < faceGroup.size(); i++) {\n    const std::vector<vertex_index> &face = faceGroup[i];\n\n    vertex_index i0 = face[0];\n    vertex_index i1(-1);\n    vertex_index i2 = face[1];\n\n    size_t npolys = face.size();\n\n    if (triangulate) {\n      // Polygon -> triangle fan conversion\n      for (size_t k = 2; k < npolys; k++) {\n        i1 = i2;\n        i2 = face[k];\n\n        index_t idx0, idx1, idx2;\n        idx0.vertex_index = i0.v_idx;\n        idx0.normal_index = i0.vn_idx;\n        idx0.texcoord_index = i0.vt_idx;\n        idx1.vertex_index = i1.v_idx;\n        idx1.normal_index = i1.vn_idx;\n        idx1.texcoord_index = i1.vt_idx;\n        idx2.vertex_index = i2.v_idx;\n        idx2.normal_index = i2.vn_idx;\n        idx2.texcoord_index = i2.vt_idx;\n\n        shape->mesh.indices.push_back(idx0);\n        shape->mesh.indices.push_back(idx1);\n        shape->mesh.indices.push_back(idx2);\n\n        shape->mesh.num_face_vertices.push_back(3);\n        shape->mesh.material_ids.push_back(material_id);\n      }\n    } else {\n      for (size_t k = 0; k < npolys; k++) {\n        index_t idx;\n        idx.vertex_index = face[k].v_idx;\n        idx.normal_index = face[k].vn_idx;\n        idx.texcoord_index = face[k].vt_idx;\n        shape->mesh.indices.push_back(idx);\n      }\n\n      shape->mesh.num_face_vertices.push_back(\n          static_cast<unsigned char>(npolys));\n      shape->mesh.material_ids.push_back(material_id);  // per face\n    }\n  }\n\n  shape->name = name;\n  shape->mesh.tags = tags;\n\n  return true;\n}\n\n// Split a string with specified delimiter character.\n// http://stackoverflow.com/questions/236129/split-a-string-in-c\nstatic void SplitString(const std::string &s, char delim,\n                        std::vector<std::string> &elems) {\n  std::stringstream ss;\n  ss.str(s);\n  std::string item;\n  while (std::getline(ss, item, delim)) {\n    elems.push_back(item);\n  }\n}\n\nvoid LoadMtl(std::map<std::string, int> *material_map,\n             std::vector<material_t> *materials, std::istream *inStream,\n             std::string *warning) {\n  // Create a default material anyway.\n  material_t material;\n  InitMaterial(&material);\n\n  // Issue 43. `d` wins against `Tr` since `Tr` is not in the MTL specification.\n  bool has_d = false;\n  bool has_tr = false;\n\n  std::stringstream ss;\n\n  std::string linebuf;\n  while (inStream->peek() != -1) {\n    safeGetline(*inStream, linebuf);\n\n    // Trim trailing whitespace.\n    if (linebuf.size() > 0) {\n      linebuf = linebuf.substr(0, linebuf.find_last_not_of(\" \\t\") + 1);\n    }\n\n    // Trim newline '\\r\\n' or '\\n'\n    if (linebuf.size() > 0) {\n      if (linebuf[linebuf.size() - 1] == '\\n')\n        linebuf.erase(linebuf.size() - 1);\n    }\n    if (linebuf.size() > 0) {\n      if (linebuf[linebuf.size() - 1] == '\\r')\n        linebuf.erase(linebuf.size() - 1);\n    }\n\n    // Skip if empty line.\n    if (linebuf.empty()) {\n      continue;\n    }\n\n    // Skip leading space.\n    const char *token = linebuf.c_str();\n    token += strspn(token, \" \\t\");\n\n    assert(token);\n    if (token[0] == '\\0') continue;  // empty line\n\n    if (token[0] == '#') continue;  // comment line\n\n    // new mtl\n    if ((0 == strncmp(token, \"newmtl\", 6)) && IS_SPACE((token[6]))) {\n      // flush previous material.\n      if (!material.name.empty()) {\n        material_map->insert(std::pair<std::string, int>(\n            material.name, static_cast<int>(materials->size())));\n        materials->push_back(material);\n      }\n\n      // initial temporary material\n      InitMaterial(&material);\n\n      has_d = false;\n      has_tr = false;\n\n      // set new mtl name\n      token += 7;\n      {\n        std::stringstream sstr;\n        sstr << token;\n        material.name = sstr.str();\n      }\n      continue;\n    }\n\n    // ambient\n    if (token[0] == 'K' && token[1] == 'a' && IS_SPACE((token[2]))) {\n      token += 2;\n      real_t r, g, b;\n      parseReal3(&r, &g, &b, &token);\n      material.ambient[0] = r;\n      material.ambient[1] = g;\n      material.ambient[2] = b;\n      continue;\n    }\n\n    // diffuse\n    if (token[0] == 'K' && token[1] == 'd' && IS_SPACE((token[2]))) {\n      token += 2;\n      real_t r, g, b;\n      parseReal3(&r, &g, &b, &token);\n      material.diffuse[0] = r;\n      material.diffuse[1] = g;\n      material.diffuse[2] = b;\n      continue;\n    }\n\n    // specular\n    if (token[0] == 'K' && token[1] == 's' && IS_SPACE((token[2]))) {\n      token += 2;\n      real_t r, g, b;\n      parseReal3(&r, &g, &b, &token);\n      material.specular[0] = r;\n      material.specular[1] = g;\n      material.specular[2] = b;\n      continue;\n    }\n\n    // transmittance\n    if ((token[0] == 'K' && token[1] == 't' && IS_SPACE((token[2]))) ||\n        (token[0] == 'T' && token[1] == 'f' && IS_SPACE((token[2])))) {\n      token += 2;\n      real_t r, g, b;\n      parseReal3(&r, &g, &b, &token);\n      material.transmittance[0] = r;\n      material.transmittance[1] = g;\n      material.transmittance[2] = b;\n      continue;\n    }\n\n    // ior(index of refraction)\n    if (token[0] == 'N' && token[1] == 'i' && IS_SPACE((token[2]))) {\n      token += 2;\n      material.ior = parseReal(&token);\n      continue;\n    }\n\n    // emission\n    if (token[0] == 'K' && token[1] == 'e' && IS_SPACE(token[2])) {\n      token += 2;\n      real_t r, g, b;\n      parseReal3(&r, &g, &b, &token);\n      material.emission[0] = r;\n      material.emission[1] = g;\n      material.emission[2] = b;\n      continue;\n    }\n\n    // shininess\n    if (token[0] == 'N' && token[1] == 's' && IS_SPACE(token[2])) {\n      token += 2;\n      material.shininess = parseReal(&token);\n      continue;\n    }\n\n    // illum model\n    if (0 == strncmp(token, \"illum\", 5) && IS_SPACE(token[5])) {\n      token += 6;\n      material.illum = parseInt(&token);\n      continue;\n    }\n\n    // dissolve\n    if ((token[0] == 'd' && IS_SPACE(token[1]))) {\n      token += 1;\n      material.dissolve = parseReal(&token);\n\n      if (has_tr) {\n        ss << \"WARN: Both `d` and `Tr` parameters defined for \\\"\"\n           << material.name << \"\\\". Use the value of `d` for dissolve.\"\n           << std::endl;\n      }\n      has_d = true;\n      continue;\n    }\n    if (token[0] == 'T' && token[1] == 'r' && IS_SPACE(token[2])) {\n      token += 2;\n      if (has_d) {\n        // `d` wins. Ignore `Tr` value.\n        ss << \"WARN: Both `d` and `Tr` parameters defined for \\\"\"\n           << material.name << \"\\\". Use the value of `d` for dissolve.\"\n           << std::endl;\n      } else {\n        // We invert value of Tr(assume Tr is in range [0, 1])\n        // NOTE: Interpretation of Tr is application(exporter) dependent. For\n        // some application(e.g. 3ds max obj exporter), Tr = d(Issue 43)\n        material.dissolve = 1.0f - parseReal(&token);\n      }\n      has_tr = true;\n      continue;\n    }\n\n    // PBR: roughness\n    if (token[0] == 'P' && token[1] == 'r' && IS_SPACE(token[2])) {\n      token += 2;\n      material.roughness = parseReal(&token);\n      continue;\n    }\n\n    // PBR: metallic\n    if (token[0] == 'P' && token[1] == 'm' && IS_SPACE(token[2])) {\n      token += 2;\n      material.metallic = parseReal(&token);\n      continue;\n    }\n\n    // PBR: sheen\n    if (token[0] == 'P' && token[1] == 's' && IS_SPACE(token[2])) {\n      token += 2;\n      material.sheen = parseReal(&token);\n      continue;\n    }\n\n    // PBR: clearcoat thickness\n    if (token[0] == 'P' && token[1] == 'c' && IS_SPACE(token[2])) {\n      token += 2;\n      material.clearcoat_thickness = parseReal(&token);\n      continue;\n    }\n\n    // PBR: clearcoat roughness\n    if ((0 == strncmp(token, \"Pcr\", 3)) && IS_SPACE(token[3])) {\n      token += 4;\n      material.clearcoat_roughness = parseReal(&token);\n      continue;\n    }\n\n    // PBR: anisotropy\n    if ((0 == strncmp(token, \"aniso\", 5)) && IS_SPACE(token[5])) {\n      token += 6;\n      material.anisotropy = parseReal(&token);\n      continue;\n    }\n\n    // PBR: anisotropy rotation\n    if ((0 == strncmp(token, \"anisor\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      material.anisotropy_rotation = parseReal(&token);\n      continue;\n    }\n\n    // ambient texture\n    if ((0 == strncmp(token, \"map_Ka\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      ParseTextureNameAndOption(&(material.ambient_texname),\n                                &(material.ambient_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // diffuse texture\n    if ((0 == strncmp(token, \"map_Kd\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      ParseTextureNameAndOption(&(material.diffuse_texname),\n                                &(material.diffuse_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // specular texture\n    if ((0 == strncmp(token, \"map_Ks\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      ParseTextureNameAndOption(&(material.specular_texname),\n                                &(material.specular_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // specular highlight texture\n    if ((0 == strncmp(token, \"map_Ns\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      ParseTextureNameAndOption(&(material.specular_highlight_texname),\n                                &(material.specular_highlight_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // bump texture\n    if ((0 == strncmp(token, \"map_bump\", 8)) && IS_SPACE(token[8])) {\n      token += 9;\n      ParseTextureNameAndOption(&(material.bump_texname),\n                                &(material.bump_texopt), token,\n                                /* is_bump */ true);\n      continue;\n    }\n\n    // bump texture\n    if ((0 == strncmp(token, \"map_Bump\", 8)) && IS_SPACE(token[8])) {\n      token += 9;\n      ParseTextureNameAndOption(&(material.bump_texname),\n                                &(material.bump_texopt), token,\n                                /* is_bump */ true);\n      continue;\n    }\n\n    // bump texture\n    if ((0 == strncmp(token, \"bump\", 4)) && IS_SPACE(token[4])) {\n      token += 5;\n      ParseTextureNameAndOption(&(material.bump_texname),\n                                &(material.bump_texopt), token,\n                                /* is_bump */ true);\n      continue;\n    }\n\n    // alpha texture\n    if ((0 == strncmp(token, \"map_d\", 5)) && IS_SPACE(token[5])) {\n      token += 6;\n      material.alpha_texname = token;\n      ParseTextureNameAndOption(&(material.alpha_texname),\n                                &(material.alpha_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // displacement texture\n    if ((0 == strncmp(token, \"disp\", 4)) && IS_SPACE(token[4])) {\n      token += 5;\n      ParseTextureNameAndOption(&(material.displacement_texname),\n                                &(material.displacement_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // reflection map\n    if ((0 == strncmp(token, \"refl\", 4)) && IS_SPACE(token[4])) {\n      token += 5;\n      ParseTextureNameAndOption(&(material.reflection_texname),\n                                &(material.reflection_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // PBR: roughness texture\n    if ((0 == strncmp(token, \"map_Pr\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      ParseTextureNameAndOption(&(material.roughness_texname),\n                                &(material.roughness_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // PBR: metallic texture\n    if ((0 == strncmp(token, \"map_Pm\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      ParseTextureNameAndOption(&(material.metallic_texname),\n                                &(material.metallic_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // PBR: sheen texture\n    if ((0 == strncmp(token, \"map_Ps\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      ParseTextureNameAndOption(&(material.sheen_texname),\n                                &(material.sheen_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // PBR: emissive texture\n    if ((0 == strncmp(token, \"map_Ke\", 6)) && IS_SPACE(token[6])) {\n      token += 7;\n      ParseTextureNameAndOption(&(material.emissive_texname),\n                                &(material.emissive_texopt), token,\n                                /* is_bump */ false);\n      continue;\n    }\n\n    // PBR: normal map texture\n    if ((0 == strncmp(token, \"norm\", 4)) && IS_SPACE(token[4])) {\n      token += 5;\n      ParseTextureNameAndOption(\n          &(material.normal_texname), &(material.normal_texopt), token,\n          /* is_bump */ false);  // @fixme { is_bump will be true? }\n      continue;\n    }\n\n    // unknown parameter\n    const char *_space = strchr(token, ' ');\n    if (!_space) {\n      _space = strchr(token, '\\t');\n    }\n    if (_space) {\n      std::ptrdiff_t len = _space - token;\n      std::string key(token, static_cast<size_t>(len));\n      std::string value = _space + 1;\n      material.unknown_parameter.insert(\n          std::pair<std::string, std::string>(key, value));\n    }\n  }\n  // flush last material.\n  material_map->insert(std::pair<std::string, int>(\n      material.name, static_cast<int>(materials->size())));\n  materials->push_back(material);\n\n  if (warning) {\n    (*warning) = ss.str();\n  }\n}\n\nbool MaterialFileReader::operator()(const std::string &matId,\n                                    std::vector<material_t> *materials,\n                                    std::map<std::string, int> *matMap,\n                                    std::string *err) {\n  std::string filepath;\n\n  if (!m_mtlBaseDir.empty()) {\n    filepath = std::string(m_mtlBaseDir) + matId;\n  } else {\n    filepath = matId;\n  }\n\n  std::ifstream matIStream(filepath.c_str());\n  if (!matIStream) {\n    std::stringstream ss;\n    ss << \"WARN: Material file [ \" << filepath << \" ] not found.\" << std::endl;\n    if (err) {\n      (*err) += ss.str();\n    }\n    return false;\n  }\n\n  std::string warning;\n  LoadMtl(matMap, materials, &matIStream, &warning);\n\n  if (!warning.empty()) {\n    if (err) {\n      (*err) += warning;\n    }\n  }\n\n  return true;\n}\n\nbool MaterialStreamReader::operator()(const std::string &matId,\n                                      std::vector<material_t> *materials,\n                                      std::map<std::string, int> *matMap,\n                                      std::string *err) {\n  (void)matId;\n  if (!m_inStream) {\n    std::stringstream ss;\n    ss << \"WARN: Material stream in error state. \" << std::endl;\n    if (err) {\n      (*err) += ss.str();\n    }\n    return false;\n  }\n\n  std::string warning;\n  LoadMtl(matMap, materials, &m_inStream, &warning);\n\n  if (!warning.empty()) {\n    if (err) {\n      (*err) += warning;\n    }\n  }\n\n  return true;\n}\n\nbool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,\n             std::vector<material_t> *materials, std::string *err,\n             const char *filename, const char *mtl_basedir, bool trianglulate) {\n  attrib->vertices.clear();\n  attrib->normals.clear();\n  attrib->texcoords.clear();\n  attrib->colors.clear();\n  shapes->clear();\n\n  std::stringstream errss;\n\n  std::ifstream ifs(filename);\n  if (!ifs) {\n    errss << \"Cannot open file [\" << filename << \"]\" << std::endl;\n    if (err) {\n      (*err) = errss.str();\n    }\n    return false;\n  }\n\n  std::string baseDir;\n  if (mtl_basedir) {\n    baseDir = mtl_basedir;\n  }\n  MaterialFileReader matFileReader(baseDir);\n\n  return LoadObj(attrib, shapes, materials, err, &ifs, &matFileReader,\n                 trianglulate);\n}\n\nbool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,\n             std::vector<material_t> *materials, std::string *err,\n             std::istream *inStream, MaterialReader *readMatFn /*= NULL*/,\n             bool triangulate) {\n  std::stringstream errss;\n\n  std::vector<real_t> v;\n  std::vector<real_t> vn;\n  std::vector<real_t> vt;\n  std::vector<real_t> vc;\n  std::vector<tag_t> tags;\n  std::vector<std::vector<vertex_index> > faceGroup;\n  std::string name;\n\n  // material\n  std::map<std::string, int> material_map;\n  int material = -1;\n\n  shape_t shape;\n\n  std::string linebuf;\n  while (inStream->peek() != -1) {\n    safeGetline(*inStream, linebuf);\n\n    // Trim newline '\\r\\n' or '\\n'\n    if (linebuf.size() > 0) {\n      if (linebuf[linebuf.size() - 1] == '\\n')\n        linebuf.erase(linebuf.size() - 1);\n    }\n    if (linebuf.size() > 0) {\n      if (linebuf[linebuf.size() - 1] == '\\r')\n        linebuf.erase(linebuf.size() - 1);\n    }\n\n    // Skip if empty line.\n    if (linebuf.empty()) {\n      continue;\n    }\n\n    // Skip leading space.\n    const char *token = linebuf.c_str();\n    token += strspn(token, \" \\t\");\n\n    assert(token);\n    if (token[0] == '\\0') continue;  // empty line\n\n    if (token[0] == '#') continue;  // comment line\n\n    // vertex\n    if (token[0] == 'v' && IS_SPACE((token[1]))) {\n      token += 2;\n      real_t x, y, z;\n      real_t r, g, b;\n      parseVertexWithColor(&x, &y, &z, &r, &g, &b, &token);\n      v.push_back(x);\n      v.push_back(y);\n      v.push_back(z);\n\n      vc.push_back(r);\n      vc.push_back(g);\n      vc.push_back(b);\n      continue;\n    }\n\n    // normal\n    if (token[0] == 'v' && token[1] == 'n' && IS_SPACE((token[2]))) {\n      token += 3;\n      real_t x, y, z;\n      parseReal3(&x, &y, &z, &token);\n      vn.push_back(x);\n      vn.push_back(y);\n      vn.push_back(z);\n      continue;\n    }\n\n    // texcoord\n    if (token[0] == 'v' && token[1] == 't' && IS_SPACE((token[2]))) {\n      token += 3;\n      real_t x, y;\n      parseReal2(&x, &y, &token);\n      vt.push_back(x);\n      vt.push_back(y);\n      continue;\n    }\n\n    // face\n    if (token[0] == 'f' && IS_SPACE((token[1]))) {\n      token += 2;\n      token += strspn(token, \" \\t\");\n\n      std::vector<vertex_index> face;\n      face.reserve(3);\n\n      while (!IS_NEW_LINE(token[0])) {\n        vertex_index vi;\n        if (!parseTriple(&token, static_cast<int>(v.size() / 3),\n                         static_cast<int>(vn.size() / 3),\n                         static_cast<int>(vt.size() / 2), &vi)) {\n          if (err) {\n            (*err) = \"Failed parse `f' line(e.g. zero value for face index).\\n\";\n          }\n          return false;\n        }\n\n        face.push_back(vi);\n        size_t n = strspn(token, \" \\t\\r\");\n        token += n;\n      }\n\n      // replace with emplace_back + std::move on C++11\n      faceGroup.push_back(std::vector<vertex_index>());\n      faceGroup[faceGroup.size() - 1].swap(face);\n\n      continue;\n    }\n\n    // use mtl\n    if ((0 == strncmp(token, \"usemtl\", 6)) && IS_SPACE((token[6]))) {\n      token += 7;\n      std::stringstream ss;\n      ss << token;\n      std::string namebuf = ss.str();\n\n      int newMaterialId = -1;\n      if (material_map.find(namebuf) != material_map.end()) {\n        newMaterialId = material_map[namebuf];\n      } else {\n        // { error!! material not found }\n      }\n\n      if (newMaterialId != material) {\n        // Create per-face material. Thus we don't add `shape` to `shapes` at\n        // this time.\n        // just clear `faceGroup` after `exportFaceGroupToShape()` call.\n        exportFaceGroupToShape(&shape, faceGroup, tags, material, name,\n                               triangulate);\n        faceGroup.clear();\n        material = newMaterialId;\n      }\n\n      continue;\n    }\n\n    // load mtl\n    if ((0 == strncmp(token, \"mtllib\", 6)) && IS_SPACE((token[6]))) {\n      if (readMatFn) {\n        token += 7;\n\n        std::vector<std::string> filenames;\n        SplitString(std::string(token), ' ', filenames);\n\n        if (filenames.empty()) {\n          if (err) {\n            (*err) +=\n                \"WARN: Looks like empty filename for mtllib. Use default \"\n                \"material. \\n\";\n          }\n        } else {\n          bool found = false;\n          for (size_t s = 0; s < filenames.size(); s++) {\n            std::string err_mtl;\n            bool ok = (*readMatFn)(filenames[s].c_str(), materials,\n                                   &material_map, &err_mtl);\n            if (err && (!err_mtl.empty())) {\n              (*err) += err_mtl;  // This should be warn message.\n            }\n\n            if (ok) {\n              found = true;\n              break;\n            }\n          }\n\n          if (!found) {\n            if (err) {\n              (*err) +=\n                  \"WARN: Failed to load material file(s). Use default \"\n                  \"material.\\n\";\n            }\n          }\n        }\n      }\n\n      continue;\n    }\n\n    // group name\n    if (token[0] == 'g' && IS_SPACE((token[1]))) {\n      // flush previous face group.\n      bool ret = exportFaceGroupToShape(&shape, faceGroup, tags, material, name,\n                                        triangulate);\n      (void)ret;  // return value not used.\n\n      if (shape.mesh.indices.size() > 0) {\n        shapes->push_back(shape);\n      }\n\n      shape = shape_t();\n\n      // material = -1;\n      faceGroup.clear();\n\n      std::vector<std::string> names;\n      names.reserve(2);\n\n      while (!IS_NEW_LINE(token[0])) {\n        std::string str = parseString(&token);\n        names.push_back(str);\n        token += strspn(token, \" \\t\\r\");  // skip tag\n      }\n\n      assert(names.size() > 0);\n\n      // names[0] must be 'g', so skip the 0th element.\n      if (names.size() > 1) {\n        name = names[1];\n      } else {\n        name = \"\";\n      }\n\n      continue;\n    }\n\n    // object name\n    if (token[0] == 'o' && IS_SPACE((token[1]))) {\n      // flush previous face group.\n      bool ret = exportFaceGroupToShape(&shape, faceGroup, tags, material, name,\n                                        triangulate);\n      if (ret) {\n        shapes->push_back(shape);\n      }\n\n      // material = -1;\n      faceGroup.clear();\n      shape = shape_t();\n\n      // @todo { multiple object name? }\n      token += 2;\n      std::stringstream ss;\n      ss << token;\n      name = ss.str();\n\n      continue;\n    }\n\n    if (token[0] == 't' && IS_SPACE(token[1])) {\n      tag_t tag;\n\n      token += 2;\n\n      tag.name = parseString(&token);\n\n      tag_sizes ts = parseTagTriple(&token);\n\n      tag.intValues.resize(static_cast<size_t>(ts.num_ints));\n\n      for (size_t i = 0; i < static_cast<size_t>(ts.num_ints); ++i) {\n        tag.intValues[i] = parseInt(&token);\n      }\n\n      tag.floatValues.resize(static_cast<size_t>(ts.num_reals));\n      for (size_t i = 0; i < static_cast<size_t>(ts.num_reals); ++i) {\n        tag.floatValues[i] = parseReal(&token);\n      }\n\n      tag.stringValues.resize(static_cast<size_t>(ts.num_strings));\n      for (size_t i = 0; i < static_cast<size_t>(ts.num_strings); ++i) {\n        tag.stringValues[i] = parseString(&token);\n      }\n\n      tags.push_back(tag);\n    }\n\n    // Ignore unknown command.\n  }\n\n  bool ret = exportFaceGroupToShape(&shape, faceGroup, tags, material, name,\n                                    triangulate);\n  // exportFaceGroupToShape return false when `usemtl` is called in the last\n  // line.\n  // we also add `shape` to `shapes` when `shape.mesh` has already some\n  // faces(indices)\n  if (ret || shape.mesh.indices.size()) {\n    shapes->push_back(shape);\n  }\n  faceGroup.clear();  // for safety\n\n  if (err) {\n    (*err) += errss.str();\n  }\n\n  attrib->vertices.swap(v);\n  attrib->normals.swap(vn);\n  attrib->texcoords.swap(vt);\n  attrib->colors.swap(vc);\n\n  return true;\n}\n\nbool LoadObjWithCallback(std::istream &inStream, const callback_t &callback,\n                         void *user_data /*= NULL*/,\n                         MaterialReader *readMatFn /*= NULL*/,\n                         std::string *err /*= NULL*/) {\n  std::stringstream errss;\n\n  // material\n  std::map<std::string, int> material_map;\n  int material_id = -1;  // -1 = invalid\n\n  std::vector<index_t> indices;\n  std::vector<material_t> materials;\n  std::vector<std::string> names;\n  names.reserve(2);\n  std::string name;\n  std::vector<const char *> names_out;\n\n  std::string linebuf;\n  while (inStream.peek() != -1) {\n    safeGetline(inStream, linebuf);\n\n    // Trim newline '\\r\\n' or '\\n'\n    if (linebuf.size() > 0) {\n      if (linebuf[linebuf.size() - 1] == '\\n')\n        linebuf.erase(linebuf.size() - 1);\n    }\n    if (linebuf.size() > 0) {\n      if (linebuf[linebuf.size() - 1] == '\\r')\n        linebuf.erase(linebuf.size() - 1);\n    }\n\n    // Skip if empty line.\n    if (linebuf.empty()) {\n      continue;\n    }\n\n    // Skip leading space.\n    const char *token = linebuf.c_str();\n    token += strspn(token, \" \\t\");\n\n    assert(token);\n    if (token[0] == '\\0') continue;  // empty line\n\n    if (token[0] == '#') continue;  // comment line\n\n    // vertex\n    if (token[0] == 'v' && IS_SPACE((token[1]))) {\n      token += 2;\n      // TODO(syoyo): Support parsing vertex color extension.\n      real_t x, y, z, w;  // w is optional. default = 1.0\n      parseV(&x, &y, &z, &w, &token);\n      if (callback.vertex_cb) {\n        callback.vertex_cb(user_data, x, y, z, w);\n      }\n      continue;\n    }\n\n    // normal\n    if (token[0] == 'v' && token[1] == 'n' && IS_SPACE((token[2]))) {\n      token += 3;\n      real_t x, y, z;\n      parseReal3(&x, &y, &z, &token);\n      if (callback.normal_cb) {\n        callback.normal_cb(user_data, x, y, z);\n      }\n      continue;\n    }\n\n    // texcoord\n    if (token[0] == 'v' && token[1] == 't' && IS_SPACE((token[2]))) {\n      token += 3;\n      real_t x, y, z;  // y and z are optional. default = 0.0\n      parseReal3(&x, &y, &z, &token);\n      if (callback.texcoord_cb) {\n        callback.texcoord_cb(user_data, x, y, z);\n      }\n      continue;\n    }\n\n    // face\n    if (token[0] == 'f' && IS_SPACE((token[1]))) {\n      token += 2;\n      token += strspn(token, \" \\t\");\n\n      indices.clear();\n      while (!IS_NEW_LINE(token[0])) {\n        vertex_index vi = parseRawTriple(&token);\n\n        index_t idx;\n        idx.vertex_index = vi.v_idx;\n        idx.normal_index = vi.vn_idx;\n        idx.texcoord_index = vi.vt_idx;\n\n        indices.push_back(idx);\n        size_t n = strspn(token, \" \\t\\r\");\n        token += n;\n      }\n\n      if (callback.index_cb && indices.size() > 0) {\n        callback.index_cb(user_data, &indices.at(0),\n                          static_cast<int>(indices.size()));\n      }\n\n      continue;\n    }\n\n    // use mtl\n    if ((0 == strncmp(token, \"usemtl\", 6)) && IS_SPACE((token[6]))) {\n      token += 7;\n      std::stringstream ss;\n      ss << token;\n      std::string namebuf = ss.str();\n\n      int newMaterialId = -1;\n      if (material_map.find(namebuf) != material_map.end()) {\n        newMaterialId = material_map[namebuf];\n      } else {\n        // { error!! material not found }\n      }\n\n      if (newMaterialId != material_id) {\n        material_id = newMaterialId;\n      }\n\n      if (callback.usemtl_cb) {\n        callback.usemtl_cb(user_data, namebuf.c_str(), material_id);\n      }\n\n      continue;\n    }\n\n    // load mtl\n    if ((0 == strncmp(token, \"mtllib\", 6)) && IS_SPACE((token[6]))) {\n      if (readMatFn) {\n        token += 7;\n\n        std::vector<std::string> filenames;\n        SplitString(std::string(token), ' ', filenames);\n\n        if (filenames.empty()) {\n          if (err) {\n            (*err) +=\n                \"WARN: Looks like empty filename for mtllib. Use default \"\n                \"material. \\n\";\n          }\n        } else {\n          bool found = false;\n          for (size_t s = 0; s < filenames.size(); s++) {\n            std::string err_mtl;\n            bool ok = (*readMatFn)(filenames[s].c_str(), &materials,\n                                   &material_map, &err_mtl);\n            if (err && (!err_mtl.empty())) {\n              (*err) += err_mtl;  // This should be warn message.\n            }\n\n            if (ok) {\n              found = true;\n              break;\n            }\n          }\n\n          if (!found) {\n            if (err) {\n              (*err) +=\n                  \"WARN: Failed to load material file(s). Use default \"\n                  \"material.\\n\";\n            }\n          } else {\n            if (callback.mtllib_cb) {\n              callback.mtllib_cb(user_data, &materials.at(0),\n                                 static_cast<int>(materials.size()));\n            }\n          }\n        }\n      }\n\n      continue;\n    }\n\n    // group name\n    if (token[0] == 'g' && IS_SPACE((token[1]))) {\n      names.clear();\n\n      while (!IS_NEW_LINE(token[0])) {\n        std::string str = parseString(&token);\n        names.push_back(str);\n        token += strspn(token, \" \\t\\r\");  // skip tag\n      }\n\n      assert(names.size() > 0);\n\n      // names[0] must be 'g', so skip the 0th element.\n      if (names.size() > 1) {\n        name = names[1];\n      } else {\n        name.clear();\n      }\n\n      if (callback.group_cb) {\n        if (names.size() > 1) {\n          // create const char* array.\n          names_out.resize(names.size() - 1);\n          for (size_t j = 0; j < names_out.size(); j++) {\n            names_out[j] = names[j + 1].c_str();\n          }\n          callback.group_cb(user_data, &names_out.at(0),\n                            static_cast<int>(names_out.size()));\n\n        } else {\n          callback.group_cb(user_data, NULL, 0);\n        }\n      }\n\n      continue;\n    }\n\n    // object name\n    if (token[0] == 'o' && IS_SPACE((token[1]))) {\n      // @todo { multiple object name? }\n      token += 2;\n\n      std::stringstream ss;\n      ss << token;\n      std::string object_name = ss.str();\n\n      if (callback.object_cb) {\n        callback.object_cb(user_data, object_name.c_str());\n      }\n\n      continue;\n    }\n\n#if 0  // @todo\n    if (token[0] == 't' && IS_SPACE(token[1])) {\n      tag_t tag;\n\n      token += 2;\n      std::stringstream ss;\n      ss << token;\n      tag.name = ss.str();\n\n      token += tag.name.size() + 1;\n\n      tag_sizes ts = parseTagTriple(&token);\n\n      tag.intValues.resize(static_cast<size_t>(ts.num_ints));\n\n      for (size_t i = 0; i < static_cast<size_t>(ts.num_ints); ++i) {\n        tag.intValues[i] = atoi(token);\n        token += strcspn(token, \"/ \\t\\r\") + 1;\n      }\n\n      tag.floatValues.resize(static_cast<size_t>(ts.num_reals));\n      for (size_t i = 0; i < static_cast<size_t>(ts.num_reals); ++i) {\n        tag.floatValues[i] = parseReal(&token);\n        token += strcspn(token, \"/ \\t\\r\") + 1;\n      }\n\n      tag.stringValues.resize(static_cast<size_t>(ts.num_strings));\n      for (size_t i = 0; i < static_cast<size_t>(ts.num_strings); ++i) {\n        std::stringstream ss;\n        ss << token;\n        tag.stringValues[i] = ss.str();\n        token += tag.stringValues[i].size() + 1;\n      }\n\n      tags.push_back(tag);\n    }\n#endif\n\n    // Ignore unknown command.\n  }\n\n  if (err) {\n    (*err) += errss.str();\n  }\n\n  return true;\n}\n}  // namespace tinyobj\n\n#endif\n"
  },
  {
    "path": "src/CMakeLists.txt",
    "content": "function(buildSource SAMPLE_NAME)\n  file(GLOB SAMPLE_SOURCES ${SAMPLE_NAME}/*.cpp ${SAMPLE_NAME}/*.h)\n  file(GLOB_RECURSE SHADER_SOURCES\n    ${SAMPLE_NAME}/*.vert\n    ${SAMPLE_NAME}/*.frag\n    ${SAMPLE_NAME}/*.geom\n    ${SAMPLE_NAME}/*.comp\n    ${SAMPLE_NAME}/*.tese\n    ${SAMPLE_NAME}/*.tesc\n  )\n  \n  source_group(\"Shaders\" FILES ${SHADER_SOURCES})\n\n  if(WIN32)\n    add_executable(${SAMPLE_NAME} WIN32 ${SAMPLE_SOURCES} ${SHADER_SOURCES})\n    target_link_libraries(${SAMPLE_NAME} ${WINLIBS})\n  else(WIN32)\n    add_executable(${SAMPLE_NAME} ${SAMPLE_SOURCES})\n    target_link_libraries(${SAMPLE_NAME} ${CMAKE_THREAD_LIBS_INIT})\n  endif(WIN32)\n\n  foreach(SHADER_SOURCE ${SHADER_SOURCES})\n  set(SHADER_DIR ${CMAKE_CURRENT_BINARY_DIR}/${SAMPLE_NAME}/shaders)\n    if(WIN32)\n      get_filename_component(fname ${SHADER_SOURCE} NAME)\n\t  add_custom_target(${SAMPLE_NAME}_${fname}.spv\n\t    COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADER_DIR} && \n\t    $ENV{VK_SDK_PATH}/Bin/glslangValidator.exe -V ${SHADER_SOURCE} -o ${SHADER_DIR}/${fname}.spv\n\t\tSOURCES ${SHADER_SOURCE}\n\t  )\n\t  ExternalTarget(\"Shaders\" ${SAMPLE_NAME}_${fname}.spv)\n\t  add_dependencies(${SAMPLE_NAME} ${SAMPLE_NAME}_${fname}.spv)\n    endif(WIN32)\n  endforeach()\n\n  target_link_libraries(${SAMPLE_NAME} ${ASSIMP_LIBRARIES} Vulkan::Vulkan glfw)\n  target_include_directories(${SAMPLE_NAME} PRIVATE\n    ${CMAKE_CURRENT_SOURCE_DIR} \n    ${CMAKE_CURRENT_SOURCE_DIR}/${SAMPLE_NAME}\n    ${GLM_INCLUDE_DIR}\n  )\n  \n  ExternalTarget(\"src\" ${SAMPLE_NAME})\nendfunction(buildSource)\n\nbuildSource(CloudScapes)"
  },
  {
    "path": "src/CloudScapes/BufferUtils.cpp",
    "content": "#pragma once\n\n#include \"BufferUtils.h\"\n\nvoid BufferUtils::CreateBuffer(VulkanDevice* device, VkBufferUsageFlags allowedUsage, VkDeviceSize size,\n\t\t\t\t\t\t\t\tVkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory)\n{\n\t// Create buffer\n\tVkBufferCreateInfo bufferCreateInfo = {};\n\tbufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n\tbufferCreateInfo.size = size;\t// Size in bytes\n\tbufferCreateInfo.usage = allowedUsage;\t// Which purpose the data in the buffer will be used \n\tbufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; //VK_SHARING_MODE_EXCLUSIVE specifies that access to any range or \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  //image subresource of the object will be exclusive to a single queue family at a time.\n\n\tif (vkCreateBuffer(device->GetVkDevice(), &bufferCreateInfo, nullptr, &buffer) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to create buffer\");\n\t}\n\n\t// Query buffer's memory requirements\n\tVkMemoryRequirements memRequirements;\n\tvkGetBufferMemoryRequirements(device->GetVkDevice(), buffer, &memRequirements);\n\n\t// Allocate memory for the buffer in the device\n\tVkMemoryAllocateInfo allocInfo = {};\n\tallocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n\tallocInfo.allocationSize = memRequirements.size;\n\tallocInfo.memoryTypeIndex = device->GetInstance()->GetMemoryTypeIndex(memRequirements.memoryTypeBits, properties);\n\n\tif (vkAllocateMemory(device->GetVkDevice(), &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to allocate device memory for the buffer\");\n\t}\n\n\t// Associate allocated memory with vertex buffer\n\tvkBindBufferMemory(device->GetVkDevice(), buffer, bufferMemory, 0);\n}\n\nvoid BufferUtils::CreateBufferFromData(VulkanDevice* device, VkCommandPool commandPool, void* bufferData, VkDeviceSize bufferSize,\n\t\t\t\t\t\t\t\t\tVkBufferUsageFlags bufferUsage, VkBuffer& buffer, VkDeviceMemory& bufferMemory)\n{\n\t// Create the staging buffer\n\tVkBuffer stagingBuffer;\n\tVkDeviceMemory stagingBufferMemory;\n\n\tVkBufferUsageFlags stagingUsage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\tVkMemoryPropertyFlags stagingProperties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;\n\tBufferUtils::CreateBuffer(device, stagingUsage, bufferSize, stagingProperties, stagingBuffer, stagingBufferMemory);\n\n\t// Fill the staging buffer\n\tvoid *data;\n\tvkMapMemory(device->GetVkDevice(), stagingBufferMemory, 0, bufferSize, 0, &data);\n\tmemcpy(data, bufferData, static_cast<size_t>(bufferSize));\n\tvkUnmapMemory(device->GetVkDevice(), stagingBufferMemory);\n\n\t// Create the buffer\n\tVkBufferUsageFlags usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | bufferUsage;\n\tVkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;\n\tBufferUtils::CreateBuffer(device, usage, bufferSize, flags, buffer, bufferMemory);\n\n\t// Copy data from staging buffer to the actual buffer\n\tBufferUtils::CopyBuffer(device, commandPool, stagingBuffer, buffer, bufferSize);\n\n\t// Destroy the staging buffer and free its memory\n\tvkDestroyBuffer(device->GetVkDevice(), stagingBuffer, nullptr);\n\tvkFreeMemory(device->GetVkDevice(), stagingBufferMemory, nullptr);\n}\n\n//Copy data from Source Buffer to Destination Buffer\nvoid BufferUtils::CopyBuffer(VulkanDevice* device, VkCommandPool commandPool, VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size)\n{\n\tVkCommandBuffer commandBuffer = beginSingleTimeCommands(device, commandPool);\n\n\tVkBufferCopy copyRegion = {};\n\tcopyRegion.srcOffset = 0;\n\tcopyRegion.dstOffset = 0;\n\tcopyRegion.size = size;\n\tvkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, 1, &copyRegion);\n\n\tendSingleTimeCommands(device, commandPool, commandBuffer);\n}\n\n// Allocates device memory of a certain size\nVkDeviceMemory BufferUtils::CreateDeviceMemory(VulkanDevice* device, VkDeviceSize size, uint32_t types, VkMemoryPropertyFlags propertyFlags)\n{\n\tVkMemoryAllocateInfo memoryAllocateInfo = {};\n\tmemoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n\tmemoryAllocateInfo.allocationSize = size;\n\tmemoryAllocateInfo.memoryTypeIndex = device->GetInstance()->GetMemoryTypeIndex(types, propertyFlags);\n\n\tVkDeviceMemory deviceMemory;\n\tif (vkAllocateMemory(device->GetVkDevice(), &memoryAllocateInfo, nullptr, &deviceMemory) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"failed to allocate device memory!\");\n\t}\n\n\treturn deviceMemory;\n}"
  },
  {
    "path": "src/CloudScapes/BufferUtils.h",
    "content": "#pragma once\n\n#include <vulkan/vulkan.h>\n#include <vector>\n#include \"VulkanDevice.h\"\n#include \"Commands.h\"\n#include \"Vertex.h\"\n\n#define ERR_GUARD_VULKAN(Expr) do { VkResult res__ = (Expr); if (res__ < 0) assert(0); } while(0)\n\nnamespace BufferUtils \n{\n\tvoid CreateBuffer(VulkanDevice* device, VkBufferUsageFlags allowedUsage, VkDeviceSize size,\n\t\t\t\t\tVkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory);\n\n\tvoid CreateBufferFromData(VulkanDevice* device, VkCommandPool commandPool, void* bufferData, VkDeviceSize bufferSize, \n\t\t\t\t\t\t\t  VkBufferUsageFlags bufferUsage, VkBuffer& buffer, VkDeviceMemory& bufferMemory);\n\n\tvoid CopyBuffer(VulkanDevice* device, VkCommandPool commandPool, VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);\n\n\tVkDeviceMemory CreateDeviceMemory(VulkanDevice* device, VkDeviceSize size, uint32_t types, VkMemoryPropertyFlags propertyFlags);\n}"
  },
  {
    "path": "src/CloudScapes/Commands.cpp",
    "content": "#include \"Commands.h\"\n\n//Reference: https://vulkan-tutorial.com/Texture_mapping/Images\nVkCommandBuffer beginSingleTimeCommands(VulkanDevice* device, VkCommandPool commandPool)\n{\n\tVkCommandBufferAllocateInfo allocInfo = {};\n\tallocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n\tallocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n\tallocInfo.commandPool = commandPool;\n\tallocInfo.commandBufferCount = 1;\n\n\tVkCommandBuffer commandBuffer;\n\tvkAllocateCommandBuffers(device->GetVkDevice(), &allocInfo, &commandBuffer);\n\n\tVkCommandBufferBeginInfo beginInfo = {};\n\tbeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n\tbeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n\n\tvkBeginCommandBuffer(commandBuffer, &beginInfo);\n\n\treturn commandBuffer;\n}\n\n// This function flushes the command buffer; that is it submits the command to the queue and then \n// free's memory associated with the command buffer(thereby flushing it)\nvoid endSingleTimeCommands(VulkanDevice* device, VkCommandPool commandPool, VkCommandBuffer commandBuffer)\n{\n\tvkEndCommandBuffer(commandBuffer);\n\n\tVkSubmitInfo submitInfo = {};\n\tsubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n\tsubmitInfo.commandBufferCount = 1;\n\tsubmitInfo.pCommandBuffers = &commandBuffer;\n\n\tvkQueueSubmit(device->GetQueue(QueueFlags::Graphics), 1, &submitInfo, VK_NULL_HANDLE);\n\tvkQueueWaitIdle(device->GetQueue(QueueFlags::Graphics));\n\n\tvkFreeCommandBuffers(device->GetVkDevice(), commandPool, 1, &commandBuffer);\n}\n\nvoid endSingleTimeCommands(VulkanDevice* device, VkCommandPool commandPool, VkQueue queue, VkCommandBuffer commandBuffer)\n{\n\tvkEndCommandBuffer(commandBuffer);\n\n\tVkSubmitInfo submitInfo = {};\n\tsubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n\tsubmitInfo.commandBufferCount = 1;\n\tsubmitInfo.pCommandBuffers = &commandBuffer;\n\n\tvkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);\n\tvkQueueWaitIdle(queue);\n\n\tvkFreeCommandBuffers(device->GetVkDevice(), commandPool, 1, &commandBuffer);\n}"
  },
  {
    "path": "src/CloudScapes/Commands.h",
    "content": "#pragma once\n\n#include <vulkan/vulkan.h>\n#include <vector>\n#include \"VulkanDevice.h\"\n\nVkCommandBuffer beginSingleTimeCommands(VulkanDevice* device, VkCommandPool commandPool);\nvoid endSingleTimeCommands(VulkanDevice* device, VkCommandPool commandPool, VkCommandBuffer commandBuffer);\nvoid endSingleTimeCommands(VulkanDevice* device, VkCommandPool commandPool, VkQueue queue, VkCommandBuffer commandBuffer);"
  },
  {
    "path": "src/CloudScapes/FormatUtils.h",
    "content": "#pragma once\n\n#include <vulkan/vulkan.h>\n\nnamespace FormatUtils\n{\n\t// Format Helper Functions\n\tinline VkFormat FindSupportedFormat(VkPhysicalDevice physicalDevice, const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features)\n\t{\n\t\tfor (VkFormat format : candidates)\n\t\t{\n\t\t\tVkFormatProperties props;\n\t\t\tvkGetPhysicalDeviceFormatProperties(physicalDevice, format, &props);\n\n\t\t\tif (tiling == VK_IMAGE_TILING_LINEAR && (props.linearTilingFeatures & features) == features) {\n\t\t\t\treturn format;\n\t\t\t}\n\t\t\telse if (tiling == VK_IMAGE_TILING_OPTIMAL && (props.optimalTilingFeatures & features) == features) {\n\t\t\t\treturn format;\n\t\t\t}\n\t\t}\n\n\t\tthrow std::runtime_error(\"failed to find supported format!\");\n\t}\n\n\tinline VkFormat FindDepthFormat(VkPhysicalDevice physicalDevice)\n\t{\n\t\treturn FindSupportedFormat( physicalDevice, \n\t\t\t\t\t\t\t\t\t{ VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D32_SFLOAT }, \n\t\t\t\t\t\t\t\t\tVK_IMAGE_TILING_OPTIMAL, \n\t\t\t\t\t\t\t\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT );\n\t}\n}"
  },
  {
    "path": "src/CloudScapes/Image.cpp",
    "content": "﻿#pragma once\n\n#include \"Image.h\"\n\n//Reference: https://vulkan-tutorial.com/Texture_mapping/Images\nbool Image::hasStencilComponent(VkFormat format)\n{\n\treturn format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;\n}\n\nvoid Image::transitionImageLayout(VulkanDevice* device, VkCommandPool commandPool, VkImage& image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout)\n{\n\t/*\n\tTODO for Performance: All of the helper functions that submit commands so far have been set up to execute synchronously by waiting \n\t\t\tfor the queue to become idle. For practical applications it is recommended to combine these operations in a single command buffer \n\t\t\tand execute them asynchronously for higher throughput, especially the transitions and copy in the createImage function. Try \n\t\t\tto experiment with this by creating a setupCommandBuffer that the helper functions record commands into, and add a flushSetupCommands \n\t\t\tto execute the commands that have been recorded so far. It's best to do this after the texture mapping works to check if the texture \n\t\t\tresources are still set up correctly.\n\t*/\n\n\t//command buffer submission results in implicit VK_ACCESS_HOST_WRITE_BIT synchronization at the beginning.\n\tVkCommandBuffer commandBuffer = beginSingleTimeCommands(device, commandPool);\n\n\t/*\n\tImages can have different layouts that affect how the pixels are organized in memory. Due to the way graphics hardware works,\n\tsimply storing the pixels row by row may not lead to the best performance, for example. When performing any operation on images,\n\tyou must make sure that they have the layout that is optimal for use in that operation. We've actually already seen some of these\n\tlayouts when we specified the render pass:\n\n\tVK_IMAGE_LAYOUT_PRESENT_SRC_KHR: Optimal for presentation\n\tVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: Optimal as attachment for writing colors from the fragment shader\n\tVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: Optimal as source in a transfer operation, like vkCmdCopyImageToBuffer\n\tVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: Optimal as destination in a transfer operation, like vkCmdCopyBufferToImage\n\tVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: Optimal for sampling from a shader\n\n\tOne of the most common ways to transition the layout of an image is a pipeline barrier\n\t*/\n\n\t//Pipeline barriers are primarily used for synchronizing access to resources, like making sure that an image was\n\t//written to before it is read, but they can also be used to transition layouts.\n\n\t/*\n\tOne of the most common ways to perform layout transitions is using an image memory barrier.\n\tA pipeline barrier like that is generally used to synchronize access to resources, like ensuring that a write\n\tto a buffer completes before reading from it, but it can also be used to transition image layouts and transfer\n\tqueue family ownership when VK_SHARING_MODE_EXCLUSIVE is used.\n\t*/\n\tVkImageMemoryBarrier barrier = {};\n\tbarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n\t//specify layout transition\n\tbarrier.oldLayout = oldLayout;\n\tbarrier.newLayout = newLayout;\n\t//If you are using the barrier to transfer queue family ownership, then these two fields should be the indices\n\t//of the queue families. They must be set to VK_QUEUE_FAMILY_IGNORED if you don't want to do this (not the default value!).\n\tbarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n\tbarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n\n\t// The image and subresourceRange specify the image that is affected and the specific part of the image.\n\t// Our image is not an array and does not use mipmapping levels, so only one level and layer are specified.\n\tbarrier.image = image;\n\tbarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\tbarrier.subresourceRange.baseMipLevel = 0;\n\tbarrier.subresourceRange.levelCount = 1;\n\tbarrier.subresourceRange.baseArrayLayer = 0;\n\tbarrier.subresourceRange.layerCount = 1;\n\n\t//Barriers are primarily used for synchronization purposes, so you must specify which types of operations \n\t//that involve the resource must happen before the barrier, and which operations that involve the resource\n\t//must wait on the barrier. We need to do that despite already using vkQueueWaitIdle to manually synchronize.\n\tVkPipelineStageFlags sourceStage;\n\tVkPipelineStageFlags destinationStage;\n\n\t// TODO: If adding more transitions add the specific cases to the if else ladder\n\tif (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && \n\t\tnewLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)\n\t{\n\t\t//Since the writes don't have to wait on anything, you may specify an empty access mask and the\n\t\t//earliest possible pipeline stage VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT for the pre-barrier operations.\n\t\tbarrier.srcAccessMask = 0;\n\t\tbarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n\n\t\tsourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;\n\t\tdestinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT;\n\t}\n\telse if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && \n\t\t\t newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)\n\t{\n\t\tbarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n\t\tbarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;\n\n\t\tsourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT;\n\t\tdestinationStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n\t}\n\telse if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && \n\t\t\t newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) \n\t{\n\t\tbarrier.srcAccessMask = 0;\n\t\tbarrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | \n\t\t\t\t\t\t\t\tVK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;\n\n\t\t/*\n\t\tThe depth buffer will be read from to perform depth tests to see if a fragment is visible, \n\t\tand will be written to when a new fragment is drawn. The reading happens in the \n\t\tVK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT stage and the writing in the \n\t\tVK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT. You should pick the earliest pipeline stage that \n\t\tmatches the specified operations, so that it is ready for usage as depth attachment when it needs to be.\n\t\t*/\n\n\t\tsourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;\n\t\tdestinationStage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;\n\t}\n\telse\n\t{\n\t\tthrow std::invalid_argument(\"unsupported layout transition!\");\n\t}\n\n\tif (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) \n\t{\n\t\tbarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;\n\n\t\tif (hasStencilComponent(format)) \n\t\t{\n\t\t\tbarrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;\n\t\t}\n\t}\n\telse \n\t{\n\t\tbarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\t}\n\n\t//Resource https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#synchronization-access-types-supported\n\t// All types of pipeline barriers are submitted using the same function.\n\tvkCmdPipelineBarrier(commandBuffer,\n\t\t\t\t\t\tsourceStage, //operationsbefore the barrier occur in which pipeline stage\n\t\t\t\t\t\tdestinationStage, //which pipeline stage waits for the barrier\n\t\t\t\t\t\t0, //The third parameter is either 0 or VK_DEPENDENCY_BY_REGION_BIT. The latter turns the barrier into a per-region condition.\n\t\t\t\t\t\t\t//That means that the implementation is allowed to already begin reading from the parts of a resource that were written so far, for example.\n\t\t\t\t\t\t\t//The last three pairs of parameters reference arrays of pipeline barriers of the three available types : memory barriers, \n\t\t\t\t\t\t\t//buffer memory barriers, and image memory barriers like the one we're using here.\n\t\t\t\t\t\t0, nullptr,\n\t\t\t\t\t\t0, nullptr,\n\t\t\t\t\t\t1, &barrier);\n\n\tendSingleTimeCommands(device, commandPool, commandBuffer);\n}\n\nvoid Image::copyBufferToImage(VulkanDevice* device, VkCommandPool commandPool, VkBuffer buffer, VkImage& image, uint32_t width, uint32_t height )\n{\n\tVkCommandBuffer commandBuffer = beginSingleTimeCommands(device, commandPool);\n\n\t//VkBufferImageCopy struct specifies which part of the buffer is going to be copied to which part of the image\n\tVkBufferImageCopy region = {};\n\tregion.bufferOffset = 0; //byte offset in the buffer at which the pixel values start\n\t\t\t\t\t\t\t //The bufferRowLength and bufferImageHeight fields specify how the pixels are laid out in memory. \n\t\t\t\t\t\t\t //For example, you could have some padding bytes between rows of the image. Specifying 0 for both indicates \n\t\t\t\t\t\t\t //that the pixels are simply tightly packed like they are in our case.\n\tregion.bufferRowLength = 0;\n\tregion.bufferImageHeight = 0;\n\n\t//imageSubresource is a VkImageSubresourceLayers used to specify the specific image subresources of the image used\n\t//for the source or destination image data.\n\t//Subresource --> sub-section of the image that is used \n\tregion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\tregion.imageSubresource.mipLevel = 0;\n\tregion.imageSubresource.baseArrayLayer = 0;\n\tregion.imageSubresource.layerCount = 1;\n\n\t//The imageSubresource, imageOffset and imageExtent fields indicate to which part of the image we want to copy the pixels\n\tregion.imageOffset = { 0,0,0 };\n\tregion.imageExtent = { width, height, 1 };\n\n\t//layout: assuming that the image has already been transitioned to the layout that is optimal for copying pixels to\n\t//RegionCount: Right now we're only copying one chunk of pixels to the whole image, but it's possible to specify an \n\t//\t\t\t   array of VkBufferImageCopy to perform many different copies from this buffer to the image in one operation.\n\tvkCmdCopyBufferToImage(commandBuffer, buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);\n\n\tendSingleTimeCommands(device, commandPool, commandBuffer);\n}\n\nvoid Image::copyBufferToImage3D(VulkanDevice* device, VkCommandPool commandPool, VkBuffer buffer, VkImage& image, uint32_t width, uint32_t height, uint32_t depth)\n{\n\tVkCommandBuffer commandBuffer = beginSingleTimeCommands(device, commandPool);\n\n\t//VkBufferImageCopy struct specifies which part of the buffer is going to be copied to which part of the image\n\tVkBufferImageCopy region = {};\n\tregion.bufferOffset = 0; //byte offset in the buffer at which the pixel values start\n\t\t\t\t\t\t\t //The bufferRowLength and bufferImageHeight fields specify how the pixels are laid out in memory. \n\t\t\t\t\t\t\t //For example, you could have some padding bytes between rows of the image. Specifying 0 for both indicates \n\t\t\t\t\t\t\t //that the pixels are simply tightly packed like they are in our case.\n\tregion.bufferRowLength = 0;\n\tregion.bufferImageHeight = 0;\n\n\t//imageSubresource is a VkImageSubresourceLayers used to specify the specific image subresources of the image used\n\t//for the source or destination image data.\n\t//Subresource --> sub-section of the image that is used \n\tregion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\tregion.imageSubresource.mipLevel = 0;\n\tregion.imageSubresource.baseArrayLayer = 0;\n\tregion.imageSubresource.layerCount = 1;\n\n\t//The imageSubresource, imageOffset and imageExtent fields indicate to which part of the image we want to copy the pixels\n\tregion.imageOffset = { 0, 0, 0 };\n\tregion.imageExtent = { width, height, depth };\n\n\t//layout: assuming that the image has already been transitioned to the layout that is optimal for copying pixels to\n\t//RegionCount: Right now we're only copying one chunk of pixels to the whole image, but it's possible to specify an \n\t//\t\t\t   array of VkBufferImageCopy to perform many different copies from this buffer to the image in one operation.\n\tvkCmdCopyBufferToImage(commandBuffer, buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);\n\n\tendSingleTimeCommands(device, commandPool, commandBuffer);\n}\n\nvoid Image::createImage(VulkanDevice* device, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage,\n\t\t\t\t\t\tVkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory)\n{\n\t//-------------\n\t//--- Image ---\n\t//-------------\n\n\tVkImageCreateInfo imageInfo = {};\n\timageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n\timageInfo.imageType = VK_IMAGE_TYPE_2D; //tells Vulkan with what kind of coordinate system the texels in the image are going to be addressed.\n\t\t\t\t\t\t\t\t\t\t\t//It is possible to create 1D, 2D and 3D images\n\t\t\t\t\t\t\t\t\t\t\t// extent defines image dimensions\n\timageInfo.extent.width = width;\n\timageInfo.extent.height = height;\n\timageInfo.extent.depth = 1;\n\t//Our texture will not be an array and we won't be using mipmapping for now.\n\timageInfo.mipLevels = 1;\n\timageInfo.arrayLayers = 1;\n\n\t//use the same format for the texels as the pixels in the buffer, otherwise the copy operation will fail.\n\timageInfo.format = format; //It is possible that the VK_FORMAT_R8G8B8A8_UNORM format is not supported by the graphics hardware.\n\n\t//2 types of memory arrangemnets for tiling: linear (row-major) and optimal (implementation defined order for optimal access)\n\t//the tiling mode cannot be changed at a later time\n\t//If you want to be able to directly access texels in the memory of the image, then you must use VK_IMAGE_TILING_LINEAR.\n\t//We will be using a staging buffer instead of a staging image, so this won't be necessary. \n\t//We will be using VK_IMAGE_TILING_OPTIMAL for efficient access from the shader.\n\timageInfo.tiling = tiling;\n\n\timageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; // Not usable by the GPU and the very first transition will discard the texels.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // very few situations where it is necessary for the texels to be preserved \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // during the first transition\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t //The image is going to be used as destination for the buffer copy, so it should be set up as a transfer destination. \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // We also want to be able to access the image from the shader to color our mesh, so the usage should include VK_IMAGE_USAGE_SAMPLED_BIT\n\timageInfo.usage = usage;\n\n\t//The image will only be used by one queue family: the one that supports graphics (and therefore also) transfer operations.\n\timageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\n\t//The samples flag is related to multisampling. This is only relevant for images that will be used as attachments, so stick to one sample\n\timageInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\timageInfo.flags = 0; // There are some optional flags for images that are related to sparse images.\n\n\tif (vkCreateImage(device->GetVkDevice(), &imageInfo, nullptr, &image) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"failed to create image!\");\n\t}\n\n\t//-----------------------------------\n\t//--- Allocating Memory for image ---\n\t//-----------------------------------\n\tVkMemoryRequirements memRequirements;\n\tvkGetImageMemoryRequirements(device->GetVkDevice(), image, &memRequirements);\n\n\timageMemory = BufferUtils::CreateDeviceMemory(device, memRequirements.size,\n\t\t\t\t\t\t\t\t\t\t\t\tmemRequirements.memoryTypeBits,\n\t\t\t\t\t\t\t\t\t\t\t\tproperties);\n\n\tvkBindImageMemory(device->GetVkDevice(), image, imageMemory, 0);\n}\n\n/*\n\tResource: https://vulkan-tutorial.com/Texture_mapping/Image_view_and_sampler\n*/\nvoid Image::createImageView(VulkanDevice* device, VkImageView& imageView, VkImage& textureImage,\n\t\t\t\t\t\t\tVkFormat format, VkImageAspectFlags aspectFlags)\n{\n\t// Create the image view \n\tVkImageViewCreateInfo viewInfo = {};\n\tviewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n\tviewInfo.image = textureImage;\n\tviewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;\n\tviewInfo.format = format;\n\n\t// Describe the image's purpose and which part of the image should be accessed\n\tviewInfo.subresourceRange.aspectMask = aspectFlags;\n\tviewInfo.subresourceRange.baseMipLevel = 0;\n\tviewInfo.subresourceRange.levelCount = 1;\n\tviewInfo.subresourceRange.baseArrayLayer = 0;\n\tviewInfo.subresourceRange.layerCount = 1;\n\n\tif (vkCreateImageView(device->GetVkDevice(), &viewInfo, nullptr, &imageView) != VK_SUCCESS) \n\t{\n\t\tthrow std::runtime_error(\"failed to create texture image view!\");\n\t}\n}\n\n/*\n\tResource: https://vulkan-tutorial.com/Texture_mapping/Image_view_and_sampler\n*/\nvoid Image::createSampler(VulkanDevice* device, VkSampler& sampler, VkSamplerAddressMode addressMode, float maxAnisotropy)\n{\n\t// Create Texture Sampler \n\tVkSamplerCreateInfo samplerInfo = {};\n\tsamplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;\n\n\tsamplerInfo.magFilter = VK_FILTER_LINEAR;    // Specify how to interpolate texels that are magnified (concerns oversampling problem, aka more fragments than texels)\n\tsamplerInfo.minFilter = VK_FILTER_LINEAR;    // Specify how to interpolate texels that are minified (concerns undersampling problem, aka more texels than fragments)\n\n\t// Repeat the texture when going beyond the image dimensions\n\tsamplerInfo.addressModeU = addressMode;// VK_SAMPLER_ADDRESS_MODE_REPEAT;\n\tsamplerInfo.addressModeV = addressMode;// VK_SAMPLER_ADDRESS_MODE_REPEAT;\n\tsamplerInfo.addressModeW = addressMode;// VK_SAMPLER_ADDRESS_MODE_REPEAT;\n\n\t// Specifies to use anisotropic filtering\n\t// Limits amount of texel samples that can be used to calculate final color (lower value, better performance, but lower quality)\n\t// No graphics hardware that will use more than 16 samples\n\tsamplerInfo.anisotropyEnable = VK_TRUE;\n\tsamplerInfo.maxAnisotropy = maxAnisotropy;\n\n\t// Specifies which color is returned when sampling beyond the image with clamp to border addressing mode\n\t// Only black, white, or transparent available\n\tsamplerInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;\n\n\t// Specifies which coordinate system to use to address texels in image\n\t// True --> use coords within [0, texWidth) and [0, texHeight)\n\t// False --> [0, 1) on all axes\n\tsamplerInfo.unnormalizedCoordinates = VK_FALSE;\n\n\t// If true, texels will be first compared to a value, and result of comparison is used in filtering operations (mainly for percentage-closer filtering on shadow maps)\n\tsamplerInfo.compareEnable = VK_FALSE;    \n\tsamplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;\n\n\t// Mipmapping \n\tsamplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;\n\tsamplerInfo.mipLodBias = 0.0f;\n\tsamplerInfo.minLod = 0.0f;\n\tsamplerInfo.maxLod = 0.0f;\n\n\tif (vkCreateSampler(device->GetVkDevice(), &samplerInfo, nullptr, &sampler) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"failed to create texture sampler!\");\n\t}\n}\n\nvoid Image::setImageLayout( VkCommandBuffer cmdbuffer,\n\t\t\t\t\t\t\tVkImage image,\n\t\t\t\t\t\t\tVkImageAspectFlags aspectMask,\n\t\t\t\t\t\t\tVkImageLayout oldImageLayout,\n\t\t\t\t\t\t\tVkImageLayout newImageLayout)\n{\n\tVkImageSubresourceRange subresourceRange = {};\n\tsubresourceRange.aspectMask = aspectMask;\n\tsubresourceRange.baseMipLevel = 0;\n\tsubresourceRange.levelCount = 1;\n\tsubresourceRange.layerCount = 1;\n\n\t// Create an image barrier object\n\tVkImageMemoryBarrier imageMemoryBarrier = {};\n\timageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n\timageMemoryBarrier.pNext = NULL;\n\timageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n\timageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n\timageMemoryBarrier.oldLayout = oldImageLayout;\n\timageMemoryBarrier.newLayout = newImageLayout;\n\timageMemoryBarrier.image = image;\n\timageMemoryBarrier.subresourceRange = subresourceRange;\n\n\t// Source layouts (old)\n\t// Source access mask controls actions that have to be finished on the old layout\n\t// before it will be transitioned to the new layout\n\tswitch (oldImageLayout)\n\t{\n\tcase VK_IMAGE_LAYOUT_UNDEFINED:\n\t\t// Image layout is undefined (or does not matter)\n\t\t// Only valid as initial layout\n\t\t// No flags required, listed only for completeness\n\t\timageMemoryBarrier.srcAccessMask = 0;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_PREINITIALIZED:\n\t\t// Image is preinitialized\n\t\t// Only valid as initial layout for linear images, preserves memory contents\n\t\t// Make sure host writes have been finished\n\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:\n\t\t// Image is a color attachment\n\t\t// Make sure any writes to the color buffer have been finished\n\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:\n\t\t// Image is a depth/stencil attachment\n\t\t// Make sure any writes to the depth/stencil buffer have been finished\n\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:\n\t\t// Image is a transfer source \n\t\t// Make sure any reads from the image have been finished\n\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:\n\t\t// Image is a transfer destination\n\t\t// Make sure any writes to the image have been finished\n\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:\n\t\t// Image is read by a shader\n\t\t// Make sure any shader reads from the image have been finished\n\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT;\n\t\tbreak;\n\t}\n\n\t// Target layouts (new)\n\t// Destination access mask controls the dependency for the new image layout\n\tswitch (newImageLayout)\n\t{\n\tcase VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:\n\t\t// Image will be used as a transfer destination\n\t\t// Make sure any writes to the image have been finished\n\t\timageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:\n\t\t// Image will be used as a transfer source\n\t\t// Make sure any reads from and writes to the image have been finished\n\t\timageMemoryBarrier.srcAccessMask = imageMemoryBarrier.srcAccessMask | VK_ACCESS_TRANSFER_READ_BIT;\n\t\timageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:\n\t\t// Image will be used as a color attachment\n\t\t// Make sure any writes to the color buffer have been finished\n\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n\t\timageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:\n\t\t// Image layout will be used as a depth/stencil attachment\n\t\t// Make sure any writes to depth/stencil buffer have been finished\n\t\timageMemoryBarrier.dstAccessMask = imageMemoryBarrier.dstAccessMask | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;\n\t\tbreak;\n\n\tcase VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:\n\t\t// Image will be read in a shader (sampler, input attachment)\n\t\t// Make sure any writes to the image have been finished\n\t\tif (imageMemoryBarrier.srcAccessMask == 0)\n\t\t{\n\t\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;\n\t\t}\n\t\timageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;\n\t\tbreak;\n\t}\n\n\t// Put barrier on top\n\tVkPipelineStageFlags srcStageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;\n\tVkPipelineStageFlags destStageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;\n\n\t// Put barrier inside setup command buffer\n\tvkCmdPipelineBarrier(\n\t\tcmdbuffer,\n\t\tsrcStageFlags,\n\t\tdestStageFlags,\n\t\t0,\n\t\t0, nullptr,\n\t\t0, nullptr,\n\t\t1, &imageMemoryBarrier);\n}"
  },
  {
    "path": "src/CloudScapes/Image.h",
    "content": "#pragma once\n\n#include <vulkan/vulkan.h>\n#include <vector>\n#include \"VulkanDevice.h\"\n#include \"BufferUtils.h\"\n#include \"Commands.h\"\n#include \"Forward.h\"\n\nnamespace Image\n{\n\tvoid copyBufferToImage(VulkanDevice* device, VkCommandPool commandPool, VkBuffer buffer, VkImage& image, uint32_t width, uint32_t height);\n\n\tvoid copyBufferToImage3D(VulkanDevice* device, VkCommandPool commandPool, VkBuffer buffer, VkImage& image, uint32_t width, uint32_t height, uint32_t depth);\n\n\tvoid transitionImageLayout(VulkanDevice* device, VkCommandPool commandPool, VkImage& image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout);\n\n\tvoid createImage(VulkanDevice* device, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage,\n\t\tVkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory);\n\n\tvoid createImageView(VulkanDevice* device, VkImageView& imageView, VkImage& textureImage,\n\t\tVkFormat format, VkImageAspectFlags aspectFlags);\n\n\tbool hasStencilComponent(VkFormat format);\n\n\tvoid createSampler(VulkanDevice* device, VkSampler& sampler, VkSamplerAddressMode addressMode, float maxAnisotropy);\n\n\tvoid setImageLayout(VkCommandBuffer cmdbuffer, VkImage image, VkImageAspectFlags aspectMask,\n\t\t\t\t\t\tVkImageLayout oldImageLayout, VkImageLayout newImageLayout);\n}"
  },
  {
    "path": "src/CloudScapes/ImageLoadingUtility.cpp",
    "content": "﻿#pragma once\n#include \"imageLoadingUtility.h\"\n\n#define STB_IMAGE_IMPLEMENTATION\n#include \"../../external/stb_image.h\"\n#define STB_IMAGE_WRITE_IMPLEMENTATION\n#include \"../../external/stb_image_write.h\"\n\nvoid ImageLoadingUtility::loadImageFromFile(VulkanDevice* device, VkCommandPool& commandPool, const char* imagePath,\n\t\t\t\t\t\t\t\t\t\t\tVkImage& textureImage, VkDeviceMemory& textureImageMemory, VkFormat format,\n\t\t\t\t\t\t\t\t\t\t\tVkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties)\n{\n\t//---------------------\n\t//--- Load an Image ---\n\t//---------------------\n\tint texWidth, texHeight, texChannels;\n\t// The STBI_rgb_alpha value forces the image to be loaded with an alpha channel, even if it doesn't have one, which \n\t// is nice for consistency with other textures in the future.\n\t// The pointer that is returned is the first element in an array of pixel values.\n\tstbi_uc* pixels = stbi_load(imagePath, &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);\n\tVkDeviceSize imageSize = texWidth * texHeight * 4; // 4 channel image\n\n\tif (!pixels)\n\t{\n\t\tthrow std::runtime_error(\"failed to load texture image!\");\n\t}\n\n\t//----------------------\n\t//--- Staging Buffer ---\n\t//----------------------\t\t\n\tVkBuffer stagingBuffer;\n\tVkDeviceMemory stagingBufferMemory;\n\tBufferUtils::CreateBuffer(device, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, imageSize,\n\t\tVK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,\n\t\tstagingBuffer, stagingBufferMemory);\n\n\t//copy the pixel values that we got from the image loading library to the buffer\n\t{\n\t\tvoid* data;\n\t\tvkMapMemory(device->GetVkDevice(), stagingBufferMemory, 0, imageSize, 0, &data);\n\t\tmemcpy(data, pixels, static_cast<size_t>(imageSize));\n\t\tvkUnmapMemory(device->GetVkDevice(), stagingBufferMemory);\n\t}\n\n\tstbi_image_free(pixels);\n\n\tImage::createImage(device, texWidth, texHeight, format, tiling, usage, properties, textureImage, textureImageMemory);\n\n\t//----------------------------------------------------\n\t//--- Copy the Staging Buffer to the Texture Image ---\n\t//----------------------------------------------------\n\t//The image was created with the VK_IMAGE_LAYOUT_UNDEFINED layout, so that one should be specified as old layout when transitioning textureImage. \n\t//Remember that we can do this because we don't care about its contents before performing the copy operation.\n\n\t//Transition: Undefined → transfer destination: transfer writes that don't need to wait on anything\n\t//This transition is to make image optimal as a destination\n\tImage::transitionImageLayout(device, commandPool, textureImage, format,\n\t\t\t\t\t\t\t\tVK_IMAGE_LAYOUT_UNDEFINED,\n\t\t\t\t\t\t\t\tVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);\n\n\tImage::copyBufferToImage(device, commandPool, stagingBuffer, textureImage, static_cast<uint32_t>(texWidth), static_cast<uint32_t>(texHeight));\n\n\t//Transfer destination → shader reading: shader reads should wait on transfer writes, \n\t//specifically the shader reads in the fragment shader, because that's where we're going to use the texture\n\t//This transition is to make the image an optimal source for the sampler in a shader\n\tImage::transitionImageLayout(device, commandPool, textureImage, format,\n\t\t\t\t\t\t\t\tVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n\t\t\t\t\t\t\t\tVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);\n\n\tvkDestroyBuffer(device->GetVkDevice(), stagingBuffer, nullptr);\n\tvkFreeMemory(device->GetVkDevice(), stagingBufferMemory, nullptr);\n}\n\n// load multiple 2D Textures From a folder and create a 3D image from them\nvoid ImageLoadingUtility::create3DTextureFromMany2DTextures(VulkanDevice* device,VkDevice logicalDevice, VkCommandPool commandPool,\n\t\t\t\t\t\t\t\tconst std::string folder_path, const std::string textureBaseName, const std::string fileExtension,\n\t\t\t\t\t\t\t\tVkImage& texture3DImage, VkDeviceMemory& texture3DMemory, VkFormat textureFormat,\n\t\t\t\t\t\t\t\tint width, int height, int depth, int num2DImages, int numChannels)\n{\n\tint texWidth, texHeight, texChannels;\n\tVkDeviceSize Image3DSize = width * height * depth * numChannels;\n\n\tuint8_t* texture3DPixels = new uint8_t[Image3DSize];\n\tmemset(texture3DPixels, 0, Image3DSize);\n\n#pragma omp parallel for\n\tfor (int z = 0; z<num2DImages; z++)\n\t{\n\t\tstd::string imageIdentifier = folder_path + textureBaseName + \"(\" + std::to_string(z + 1) + \")\" + fileExtension;\n\t\tconst char* imagePath = imageIdentifier.c_str();\n\t\tstbi_uc* pixels = stbi_load(imagePath, &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);\n\t\tif (!pixels) {\n\t\t\tthrow std::runtime_error(\"failed to load texture image!\");\n\t\t}\n\n\t\tmemcpy(&texture3DPixels[z * texWidth * texHeight * 4], pixels, static_cast<size_t>(texWidth * texHeight * 4));\n\t\tstbi_image_free(pixels);\n\t}\n\n\t//IMPORTANT: Did not free memory stored in the vector because if we want to modify the individual textures we should just change that one texture\t\n\t// Create the staging buffer\n\tVkBuffer stagingBuffer;\n\tVkDeviceMemory stagingBufferMemory;\n\n\tVkBufferUsageFlags stagingUsage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;\n\tVkMemoryPropertyFlags stagingProperties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;\n\tBufferUtils::CreateBuffer(device, stagingUsage, Image3DSize, stagingProperties, stagingBuffer, stagingBufferMemory);\n\t\n\t// Copy data over to the staging buffer\n\tvoid *data;\n\tvkMapMemory(device->GetVkDevice(), stagingBufferMemory, 0, Image3DSize, 0, &data);\n\tmemcpy(data, texture3DPixels, static_cast<size_t>(Image3DSize));\n\tvkUnmapMemory(device->GetVkDevice(), stagingBufferMemory);\n\t\n\tdelete texture3DPixels;\n\n\tcreate3DTextureImage(device, logicalDevice, texture3DImage, texture3DMemory, VK_IMAGE_TILING_OPTIMAL, \n\t\tVK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,\n\t\twidth, height, depth, textureFormat);\n\n\t//----------------------------------------------------\n\t//--- Copy the Staging Buffer to the Texture Image ---\n\t//----------------------------------------------------\n\t//The image was created with the VK_IMAGE_LAYOUT_UNDEFINED layout, so that one should be specified as old layout when transitioning textureImage. \n\t//Remember that we can do this because we don't care about its contents before performing the copy operation.\n\n\t//Transition: Undefined → transfer destination: transfer writes that don't need to wait on anything\n\t//This transition is to make image optimal as a destination\n\tImage::transitionImageLayout(device, commandPool, texture3DImage, textureFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);\n\tImage::copyBufferToImage3D(device, commandPool, stagingBuffer, texture3DImage,\n\t\tstatic_cast<uint32_t>(width), static_cast<uint32_t>(height), static_cast<uint32_t>(depth));\n\n\t//Transfer destination → shader reading\n\tImage::transitionImageLayout(device, commandPool, texture3DImage, textureFormat,\n\t\tVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);\n\n\tvkDestroyBuffer(device->GetVkDevice(), stagingBuffer, nullptr);\n\tvkFreeMemory(device->GetVkDevice(), stagingBufferMemory, nullptr);\n}\n\nvoid ImageLoadingUtility::create3DTextureImage(VulkanDevice* device, VkDevice logicalDevice, VkImage& image, VkDeviceMemory& imageMemory,\n\t\t\t\t\t\t\t\t\t\t\t\tVkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,\n\t\t\t\t\t\t\t\t\t\t\t\tint width, int height, int depth, VkFormat format)\n{\n\t//-------------\n\t//--- Image ---\n\t//-------------\n\n\tVkImageCreateInfo imageInfo = {};\n\timageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n\timageInfo.imageType = VK_IMAGE_TYPE_3D; //tells Vulkan with what kind of coordinate system the texels in the image are going to be addressed.\n\t\t\t\t\t\t\t\t\t\t\t// extent defines image dimensions\n\timageInfo.extent.width = width;\n\timageInfo.extent.height = height;\n\timageInfo.extent.depth = depth;\n\t//Our texture will not be an array and we won't be using mipmapping for now.\n\timageInfo.mipLevels = 1;\n\timageInfo.arrayLayers = 1;\n\n\t//use the same format for the texels as the pixels in the buffer, otherwise the copy operation will fail.\n\timageInfo.format = format; //It is possible that the VK_FORMAT_R8G8B8A8_UNORM format is not supported by the graphics hardware.\n\n\t\t\t\t\t\t\t\t\t  //2 types of memory arrangemnets for tiling: linear (row-major) and optimal (implementation defined order for optimal access)\n\t\t\t\t\t\t\t\t\t  //the tiling mode cannot be changed at a later time\n\t\t\t\t\t\t\t\t\t  //If you want to be able to directly access texels in the memory of the image, then you must use VK_IMAGE_TILING_LINEAR.\n\t\t\t\t\t\t\t\t\t  //We will be using a staging buffer instead of a staging image, so this won't be necessary. \n\t\t\t\t\t\t\t\t\t  //We will be using VK_IMAGE_TILING_OPTIMAL for efficient access from the shader.\n\timageInfo.tiling = tiling;\n\n\timageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; // Not usable by the GPU and the very first transition will discard the texels.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // very few situations where it is necessary for the texels to be preserved \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // during the first transition\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t //The image is going to be used as destination for the buffer copy, so it should be set up as a transfer destination. \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // We also want to be able to access the image from the shader to color our mesh, so the usage should include VK_IMAGE_USAGE_SAMPLED_BIT\n\timageInfo.usage = usage;\n\n\t//The image will only be used by one queue family: the one that supports graphics (and therefore also) transfer operations.\n\timageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\n\t//The samples flag is related to multisampling. This is only relevant for images that will be used as attachments, so stick to one sample\n\timageInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\timageInfo.flags = 0; // There are some optional flags for images that are related to sparse images.\n\n\tif (vkCreateImage(logicalDevice, &imageInfo, nullptr, &image) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"failed to create 3D texture!\");\n\t}\n\n\tVkMemoryRequirements memReqs = {};\n\tvkGetImageMemoryRequirements(logicalDevice, image, &memReqs);\n\n\t// Device local memory to back up image\n\tVkMemoryAllocateInfo memAllocInfo{};\n\tmemAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n\tmemAllocInfo.allocationSize = memReqs.size;\n\tmemAllocInfo.memoryTypeIndex = device->GetInstance()->GetMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);\n\n\tif (vkAllocateMemory(device->GetVkDevice(), &memAllocInfo, nullptr, &imageMemory) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to allocate device memory for the buffer\");\n\t}\n\tvkBindImageMemory(device->GetVkDevice(), image, imageMemory, 0);\n}\n\n\n//----------------------------------------------------------------------------------------------------------------------------------------\n//Use this to save raw data out as a ppm file which is a very simple file format and there a re plenty of converters online that can convert ppm to other\n//file formats\n//Reference: https://stackoverflow.com/questions/13745093/a-portable-function-to-create-a-bmp-file-from-raw-bytes\n//http://www.cplusplus.com/reference/cstdio/FILE/\n\nvoid ImageLoadingUtility::save3DTextureAsImage( const char* output_file_path,\n\t\t\t\t\t\t\t\t\t\t\t\tconst std::string input_folder_path, const std::string input_textureBaseName, const std::string input_fileExtension,\n\t\t\t\t\t\t\t\t\t\t\t\tint w, int h, int num2DImages, int numChannels )\n{\n\tint texWidth, texHeight, texChannels;\n\tsize_t Image3DSize = w * h * num2DImages * numChannels;\n\tuint8_t* texture3DPixels = new uint8_t[Image3DSize];\n\tmemset(texture3DPixels, 0, Image3DSize);\n\t\n#pragma omp parallel for\n\tfor (int z = 0; z<num2DImages; z++)\n\t{\n\t\tstd::string imageIdentifier = input_folder_path + input_textureBaseName + \"(\" + std::to_string(z + 1) + \")\" + input_fileExtension;\n\t\tconst char* imagePath = imageIdentifier.c_str();\n\t\tstbi_uc* pixels = stbi_load(imagePath, &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);\n\t\tif (!pixels) {\n\t\t\tthrow std::runtime_error(\"failed to load texture image!\");\n\t\t}\n\n\t\tmemcpy(&texture3DPixels[z * texWidth * texHeight * 4], pixels, static_cast<size_t>(texWidth * texHeight * 4));\n\t\tstbi_image_free(pixels);\n\t}\n\t\n\tFILE* outfile;\n\toutfile = fopen(output_file_path, \"w\");\n\t\n\t//use stbi image library to write images\n\tstbi_write_tga(output_file_path, w, h*num2DImages, 4, texture3DPixels);\n\n\tfclose(outfile);\n}"
  },
  {
    "path": "src/CloudScapes/ImageLoadingUtility.h",
    "content": "#pragma once\n\n#include <vulkan/vulkan.h>\n#include <vector>\n#include \"VulkanDevice.h\"\n#include \"Image.h\"\n#include \"Texture3D.h\"\n#include <cstring>\n\ntypedef struct {\n\tint width;\n\tint height;\n\tuint8_t *data;\n\tsize_t size;\n} ppm_image;\n\nnamespace ImageLoadingUtility\n{\n\t//load an image and upload it into a Vulkan image object\n\tvoid loadImageFromFile(VulkanDevice* device, VkCommandPool& commandPool, const char* imagePath,\n\t\t\t\t\t\tVkImage& textureImage, VkDeviceMemory& textureImageMemory, VkFormat format,\n\t\t\t\t\t\tVkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties);\n\t\n\t// load multiple 2D Textures From a folder and create a 3D image from them\n\tvoid create3DTextureFromMany2DTextures(VulkanDevice* device, VkDevice logicalDevice, VkCommandPool commandPool,\n\t\tconst std::string folder_path, const std::string textureBaseName, const std::string fileExtension,\n\t\tVkImage& texture3DImage, VkDeviceMemory& texture3DMemory, VkFormat textureFormat,\n\t\tint width, int height, int depth, int num2DImages, int numChannels);\n\n\tvoid create3DTextureImage(VulkanDevice* device, VkDevice logicalDevice, VkImage& image, VkDeviceMemory& imageMemory,\n\t\t\t\t\t\t\tVkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,\n\t\t\t\t\t\t\tint width, int height, int depth, VkFormat format);\n\n\tsize_t ppm_save(ppm_image *img, FILE *outfile, int depth, int numChannels);\n\tvoid save3DTextureAsImage( const char* output_file_path,\n\t\t\t\t\t\t\tconst std::string input_folder_path, const std::string input_textureBaseName, const std::string input_fileExtension,\n\t\t\t\t\t\t\tint w, int h, int num2DImages, int numChannels );\n}"
  },
  {
    "path": "src/CloudScapes/Model.cpp",
    "content": "#include \"model.h\"\n\n#define TINYOBJLOADER_IMPLEMENTATION\n#include \"../../external/tiny_obj_loader.h\"\n\nModel::Model(VulkanDevice* device, VkCommandPool commandPool, const std::vector<Vertex> &vertices, const std::vector<uint32_t> &indices)\n\t: device(device), vertices(vertices), indices(indices)\n{\n\tif (this->vertices.size() > 0)\n\t{\n\t\t// Create Vertex Buffer \n\t\tVkDeviceSize vertexBufferSize = sizeof(Vertex) * vertices.size();\n\t\tBufferUtils::CreateBufferFromData(device, commandPool, this->vertices.data(), vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, vertexBuffer, vertexBufferMemory);\n\t}\n\n\tif (this->indices.size() > 0)\n\t{\n\t\t// Create Index Buffer\n\t\tVkDeviceSize indexBufferSize = sizeof(uint32_t) * indices.size();\n\t\tBufferUtils::CreateBufferFromData(device, commandPool, this->indices.data(), indexBufferSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, indexBuffer, indexBufferMemory);\n\t}\n\n\tmodelBufferObject.modelMatrix = glm::mat4(1.0f);\n\tBufferUtils::CreateBuffer(device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(ModelBufferObject),\n\t\tVK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,\n\t\tmodelBuffer, modelBufferMemory);\n\n\tvkMapMemory(device->GetVkDevice(), modelBufferMemory, 0, sizeof(ModelBufferObject), 0, &mappedData);\n\tmemcpy(mappedData, &modelBufferObject, sizeof(ModelBufferObject));\n}\n\nModel::Model(VulkanDevice* device, VkCommandPool commandPool, const std::string model_path, const std::string texture_path)\n\t: device(device)\n{\n\tLoadModel(model_path);\n\n\tif (vertices.size() > 0)\n\t{\n\t\t// Create Vertex Buffer \n\t\tVkDeviceSize vertexBufferSize = sizeof(Vertex) * vertices.size();\n\t\tBufferUtils::CreateBufferFromData(device, commandPool, this->vertices.data(), vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, vertexBuffer, vertexBufferMemory);\n\t}\n\n\tif (indices.size() > 0)\n\t{\n\t\t// Create Index Buffer\n\t\tVkDeviceSize indexBufferSize = sizeof(uint32_t) * indices.size();\n\t\tBufferUtils::CreateBufferFromData(device, commandPool, this->indices.data(), indexBufferSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, indexBuffer, indexBufferMemory);\n\t}\n\n\t// Create Model Buffer\n\tmodelBufferObject.modelMatrix = glm::mat4(1.0f);\n\tBufferUtils::CreateBuffer(device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(ModelBufferObject),\n\t\t\t\t\t\t\tVK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,\n\t\t\t\t\t\t\tmodelBuffer, modelBufferMemory);\n\n\tvkMapMemory(device->GetVkDevice(), modelBufferMemory, 0, sizeof(ModelBufferObject), 0, &mappedData);\n\tmemcpy(mappedData, &modelBufferObject, sizeof(ModelBufferObject));\n\n\tSetTexture(device, commandPool, texture_path);\n}\n\nModel::~Model()\n{\n\tif (indices.size() > 0) \n\t{\n\t\tvkDestroyBuffer(device->GetVkDevice(), indexBuffer, nullptr);\n\t\tvkFreeMemory(device->GetVkDevice(), indexBufferMemory, nullptr);\n\t}\n\n\tif (vertices.size() > 0) \n\t{\n\t\tvkDestroyBuffer(device->GetVkDevice(), vertexBuffer, nullptr);\n\t\tvkFreeMemory(device->GetVkDevice(), vertexBufferMemory, nullptr);\n\t}\n\n\tvkUnmapMemory(device->GetVkDevice(), modelBufferMemory);\n\tvkDestroyBuffer(device->GetVkDevice(), modelBuffer, nullptr);\n\tvkFreeMemory(device->GetVkDevice(), modelBufferMemory, nullptr);\n\n\tif (texture != VK_NULL_HANDLE) {\n\t\tvkDestroyImage(device->GetVkDevice(), texture, nullptr);\n\t}\n\n\tif (textureMemory != VK_NULL_HANDLE) {\n\t\tvkFreeMemory(device->GetVkDevice(), textureMemory, nullptr);\n\t}\n\n\tif (textureView != VK_NULL_HANDLE) {\n\t\tvkDestroyImageView(device->GetVkDevice(), textureView, nullptr);\n\t}\n\n\tif (textureSampler != VK_NULL_HANDLE) {\n\t\tvkDestroySampler(device->GetVkDevice(), textureSampler, nullptr);\n\t}\n}\n\nvoid Model::SetTexture(VulkanDevice* device, VkCommandPool commandPool, const std::string texture_path)\n{\n\tImageLoadingUtility::loadImageFromFile(device, commandPool, texture_path.c_str(), texture, textureMemory,\n\t\t\t\t\t\t\t\t\t\t\tVK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL,\n\t\t\t\t\t\t\t\t\t\t\tVK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,\n\t\t\t\t\t\t\t\t\t\t\tVK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);\n\n\tImage::createImageView(device, textureView, texture, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT);\n\n\tImage::createSampler(device, textureSampler, VK_SAMPLER_ADDRESS_MODE_REPEAT, 16.0f);\n}\n\nvoid Model::LoadModel(const std::string model_path)\n{\n\t// The attrib container holds all of the positions, normals and texture coordinates \n\t// in its attrib.vertices, attrib.normals and attrib.texcoords vectors.\n\ttinyobj::attrib_t attrib;\n\t\n\t// The shapes container contains all of the separate objects and their faces.\n\tstd::vector<tinyobj::shape_t> shapes;\n\t\n\t// OBJ models can define a material and texture per face --> ignored for now\n\tstd::vector<tinyobj::material_t> materials;\n\t\n\tstd::string err;\n\n\t//Faces in OBJ files can actually contain an arbitrary number of vertices, whereas our application can only render triangles. \n\t//Luckily the LoadObj has an optional parameter to automatically triangulate such faces, which is enabled by default.\n\tif (!tinyobj::LoadObj(&attrib, &shapes, &materials, &err, model_path.c_str())) {\n\t\tthrow std::runtime_error(err);\n\t}\n\n\tstd::unordered_map<Vertex, uint32_t> uniqueVertices = {};\n\tfor (const auto& shape : shapes) \n\t{\n\t\tfor (const auto& index : shape.mesh.indices)\n\t\t{\n\t\t\tVertex vertex = {};\n\n\t\t\tvertex.position = glm::vec4(attrib.vertices[3 * index.vertex_index + 0],\n\t\t\t\t\t\t\t\t\t\tattrib.vertices[3 * index.vertex_index + 1],\n\t\t\t\t\t\t\t\t\t\tattrib.vertices[3 * index.vertex_index + 2], \n\t\t\t\t\t\t\t\t\t\t1.0f);\n\t\t\t\n\t\t\tvertex.color = glm::vec4(1.0f, 1.0f, 1.0f, 1.0f);\n\n\t\t\t//The origin of texture coordinates in Vulkan is the top-left corner, whereas \n\t\t\t//the OBJ format assumes the bottom-left corner. \n\t\t\t//Solve this by flipping the vertical component of the texture coordinates\n\t\t\tvertex.texCoord = glm::vec2(attrib.texcoords[2 * index.texcoord_index + 0],\n\t\t\t\t\t\t\t\t\t\t1.0f - attrib.texcoords[2 * index.texcoord_index + 1]);\n\n\t\t\t//prevents vertex duplication\n\t\t\tif (uniqueVertices.count(vertex) == 0) \n\t\t\t{\n\t\t\t\tuniqueVertices[vertex] = static_cast<uint32_t>(vertices.size());\n\t\t\t\tvertices.push_back(vertex);\n\t\t\t}\n\n\t\t\tindices.push_back(uniqueVertices[vertex]);\n\t\t}\n\t}\n}\n\nconst std::vector<Vertex>& Model::getVertices() const\n{\n\treturn vertices;\n}\nconst std::vector<uint32_t>& Model::getIndices() const\n{\n\treturn indices;\n}\n\nVkBuffer Model::getVertexBuffer() const\n{\n\treturn vertexBuffer;\n}\nVkBuffer Model::getIndexBuffer() const\n{\n\treturn indexBuffer;\n}\n\nuint32_t Model::getVertexBufferSize() const\n{\n\treturn static_cast<uint32_t>(vertices.size() * sizeof(Vertex));\n}\nuint32_t Model::getIndexBufferSize() const\n{\n\treturn static_cast<uint32_t>(indices.size() * sizeof(uint32_t));\n}\n\nconst ModelBufferObject& Model::getModelBufferObject() const\n{\n\treturn modelBufferObject;\n}\n\nglm::mat4 Model::GetModelMatrix() const\n{\n\treturn modelBufferObject.modelMatrix;\n}\nVkBuffer Model::GetModelBuffer() const\n{\n\treturn modelBuffer;\n}\nvoid Model::SetModelBuffer(glm::mat4 &model)\n{\n\tmodelBufferObject.modelMatrix = model;\n\tmemcpy(mappedData, &modelBufferObject, sizeof(ModelBufferObject));\n}\n\nVkImage Model::GetTexture() const\n{\n\treturn texture;\n}\nVkDeviceMemory Model::GetTextureMemory() const\n{\n\treturn textureMemory;\n}\nVkImageView Model::GetTextureView() const\n{\n\treturn textureView;\n}\nVkSampler Model::GetTextureSampler() const\n{\n\treturn textureSampler;\n}"
  },
  {
    "path": "src/CloudScapes/Model.h",
    "content": "#pragma once\n\n#define GLM_FORCE_RADIANS\n#define GLM_FORCE_DEPTH_ZERO_TO_ONE\n#include <glm/gtc/matrix_transform.hpp>\n#include <glm/glm.hpp>\n#include \"VulkanDevice.h\"\n#include \"Vertex.h\"\n#include \"BufferUtils.h\"\n#include \"Image.h\"\n#include \"ImageLoadingUtility.h\"\n#include <unordered_map>\n\nstruct ModelBufferObject {\n\tglm::mat4 modelMatrix;\n};\n\nclass Model\n{\npublic:\n\tModel() = delete;\t// https://stackoverflow.com/questions/5513881/meaning-of-delete-after-function-declaration\n\tModel(VulkanDevice* device, VkCommandPool commandPool,\n\t\tconst std::vector<Vertex> &vertices, const std::vector<uint32_t> &indices);\n\tModel(VulkanDevice* device, VkCommandPool commandPool,\n\t\tconst std::string model_path, const std::string texture_path);\n\t~Model();\n\n\tvoid SetTexture(VulkanDevice* device, VkCommandPool commandPool, const std::string texture_path);\n\tvoid LoadModel(const std::string model_path);\n\n\tconst std::vector<Vertex>& getVertices() const;\n\tconst std::vector<uint32_t>& getIndices() const;\n\n\tuint32_t getVertexBufferSize() const;\n\tuint32_t getIndexBufferSize() const;\n\n\tVkBuffer getVertexBuffer() const;\n\tVkBuffer getIndexBuffer() const;\n\n\tconst ModelBufferObject& getModelBufferObject() const;\n\n\tglm::mat4 Model::GetModelMatrix() const;\n\tVkBuffer GetModelBuffer() const;\n\tvoid SetModelBuffer(glm::mat4 &model);\n\n\tVkImage GetTexture() const;\n\tVkDeviceMemory GetTextureMemory() const;\n\tVkImageView GetTextureView() const;\n\tVkSampler GetTextureSampler() const;\n\nprivate:\n\tVulkanDevice* device; //member variable because it is needed for the destructor\n\n\tstd::vector<Vertex> vertices;\n\tVkBuffer vertexBuffer;\n\tVkDeviceMemory vertexBufferMemory;\n\n\tstd::vector<uint32_t> indices;\n\tVkBuffer indexBuffer;\n\tVkDeviceMemory indexBufferMemory;\n\n\tVkBuffer modelBuffer;\n\tVkDeviceMemory modelBufferMemory;\n\tModelBufferObject modelBufferObject;\n\n\tVkImage texture = VK_NULL_HANDLE;\n\tVkDeviceMemory textureMemory = VK_NULL_HANDLE;\n\tVkImageView textureView = VK_NULL_HANDLE;\n\tVkSampler textureSampler = VK_NULL_HANDLE;\n\n\tvoid* mappedData;\n};"
  },
  {
    "path": "src/CloudScapes/Renderer.cpp",
    "content": "#include \"Renderer.h\"\n\nRenderer::Renderer(VulkanDevice* device, VkPhysicalDevice physicalDevice, VulkanSwapChain* swapChain, \n\tScene* scene, Sky* sky, Camera* camera, Camera* cameraOld, uint32_t width, uint32_t height)\n\t: device(device),\n\tlogicalDevice(device->GetVkDevice()),\n\tphysicalDevice(physicalDevice),\n\tswapChain(swapChain),\n\tscene(scene),\n\tsky(sky),\n\tcamera(camera),\n\tcameraOld(cameraOld),\n\twindow_width(width),\n\twindow_height(height)\n{\n\tInitializeRenderer();\n}\n\nRenderer::~Renderer()\n{\n\tDestroyOnWindowResize(); //Destroys a lot of things already --> so why write it again\n\n\t//Command Pools\n\tvkDestroyCommandPool(logicalDevice, graphicsCommandPool, nullptr);\n\tvkDestroyCommandPool(logicalDevice, computeCommandPool, nullptr);\n\t\n\t//Descriptor Set Layouts\n\tvkDestroyDescriptorSetLayout(logicalDevice, cloudComputeSetLayout, nullptr);\n\tvkDestroyDescriptorSetLayout(logicalDevice, graphicsSetLayout, nullptr);\n\tvkDestroyDescriptorSetLayout(logicalDevice, pingPongCloudResultSetLayout, nullptr);\n\n\tvkDestroyDescriptorSetLayout(logicalDevice, cameraSetLayout, nullptr);\n\tvkDestroyDescriptorSetLayout(logicalDevice, timeSetLayout, nullptr);\n\tvkDestroyDescriptorSetLayout(logicalDevice, sunAndSkySetLayout, nullptr);\n\tvkDestroyDescriptorSetLayout(logicalDevice, keyPressQuerySetLayout, nullptr);\n\n\tvkDestroyDescriptorSetLayout(logicalDevice, godRaysSetLayout, nullptr);\n\tvkDestroyDescriptorSetLayout(logicalDevice, toneMapSetLayout, nullptr);\n\tvkDestroyDescriptorSetLayout(logicalDevice, TXAASetLayout, nullptr);\n\n\t//Descriptor Set\n\tvkDestroyDescriptorPool(logicalDevice, descriptorPool, nullptr);\n\n\t//Cloud and sky resources that are independent of size\n\tdelete sky;\n}\n\nvoid Renderer::DestroyOnWindowResize()\n{\n\tvkDeviceWaitIdle(logicalDevice);\n\n\tvkFreeCommandBuffers(logicalDevice, graphicsCommandPool, static_cast<uint32_t>(graphicsCommandBuffer1.size()), graphicsCommandBuffer1.data());\n\tvkFreeCommandBuffers(logicalDevice, graphicsCommandPool, static_cast<uint32_t>(graphicsCommandBuffer2.size()), graphicsCommandBuffer2.data());\n\tvkFreeCommandBuffers(logicalDevice, computeCommandPool, 1, &computeCommandBuffer1);\n\tvkFreeCommandBuffers(logicalDevice, computeCommandPool, 1, &computeCommandBuffer2);\n\n\tDestroyFrameResources();\n\n\t//Regular Pipelines\n\t// All 3 pipelines have things that depend on the window width and height and so we need to recreate all of those resources when resizing\n\t//This Function recreates the frame resources which in turn means we need to recreate the graphics pipeline and rerecord the graphics command buffers\n\tvkDestroyPipelineLayout(logicalDevice, graphicsPipelineLayout, nullptr);\n\tvkDestroyPipelineLayout(logicalDevice, cloudComputePipelineLayout, nullptr);\n\tvkDestroyPipelineLayout(logicalDevice, reprojectionPipelineLayout, nullptr);\n\tvkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr);\n\tvkDestroyPipeline(logicalDevice, cloudComputePipeline, nullptr);\n\tvkDestroyPipeline(logicalDevice, reprojectionPipeline, nullptr);\n\n\t//Post Process Pipelines\n\tvkDestroyPipelineCache(logicalDevice, postProcessPipeLineCache, nullptr);\n\tvkDestroyPipelineLayout(logicalDevice, postProcess_GodRays_PipelineLayout, nullptr);\n\tvkDestroyPipelineLayout(logicalDevice, postProcess_ToneMap_PipelineLayout, nullptr);\n\tvkDestroyPipelineLayout(logicalDevice, postProcess_TXAA_PipelineLayout, nullptr);\n\tvkDestroyPipeline(logicalDevice, postProcess_GodRays_PipeLine, nullptr);\n\tvkDestroyPipeline(logicalDevice, postProcess_ToneMap_PipeLine, nullptr);\n\tvkDestroyPipeline(logicalDevice, postProcess_TXAA_PipeLine, nullptr);\n\n\t//Render Pass\n\tvkDestroyRenderPass(logicalDevice, renderPass, nullptr);\n\n\t//Textures\n\tdelete currentFrameTexture;\n\tdelete previousFrameTexture;\n\tdelete currentCloudsResultTexture;\n\tdelete previousCloudsResultTexture;\n\tdelete godRaysCreationDataTexture;\n}\n\nvoid Renderer::InitializeRenderer()\n{\n\tVulkanInitializers::CreateCommandPool(logicalDevice, graphicsCommandPool, device->GetInstance()->GetQueueFamilyIndices()[QueueFlags::Graphics] );\n\tVulkanInitializers::CreateCommandPool(logicalDevice, computeCommandPool, device->GetInstance()->GetQueueFamilyIndices()[QueueFlags::Compute] );\n\n\tCreateRenderPass();\n\n\tCreateResources();\n\tsky->CreateCloudResources(computeCommandPool);\n\n\tCreateDescriptorPool();\n\tCreateAllDescriptorSetLayouts();\n\tCreateAllDescriptorSets();\n\n\tCreateFrameResources();\n\n\tCreateAllPipeLines(renderPass, 0);\n\tRecordAllCommandBuffers();\n\n\t//Save 3D texture out to ppm image\n\tSave3DTextureAsImage();\n}\n\nvoid Renderer::RecreateOnResize(uint32_t width, uint32_t height)\n{\n\twindow_width = width;\n\twindow_height = height;\n\n\tRecreateFrameResources();\n}\n\n//This Function submits command buffers for execution --> so that the application can \n//actually present one image after another and not just stop after the first image\nvoid Renderer::Frame()\n{\n\t//-------------------------------------------\n\t//--------- Submit Compute Queue ------------\n\t//-------------------------------------------\n\n\tVkSubmitInfo computeSubmitInfo = {};\n\tcomputeSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n\tcomputeSubmitInfo.commandBufferCount = 1;\n\tif (swapPingPongBuffers) {\n\t\tcomputeSubmitInfo.pCommandBuffers = &computeCommandBuffer1;\n\t}\n\telse {\n\t\tcomputeSubmitInfo.pCommandBuffers = &computeCommandBuffer2;\n\t}\n\n\t// submit the command buffer to the compute queue\n\tif (vkQueueSubmit(device->GetQueue(QueueFlags::Compute), 1, &computeSubmitInfo, VK_NULL_HANDLE) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to submit compute command buffer\");\n\t}\n\n\t//-------------------------------------------\n\t//--------- Submit Graphics Queue -----------\n\t//-------------------------------------------\n\tswapChain->Acquire();\n\n\t// Submit the command buffer\n\tVkSubmitInfo graphicsSubmitInfo = {};\n\tgraphicsSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n\n\t/*\n\tCan synchronize between queues by using certain supported features\n\tVkEvent: Versatile waiting, but limited to a single queue\n\tVkSemaphore: GPU to GPU synchronization\n\tvkFence: GPU to CPU synchronization\n\t*/\n\n\tVkSemaphore waitSemaphores[] = { swapChain->GetImageAvailableVkSemaphore() };\n\tVkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };\n\t// These parameters specify which semaphores to wait on before execution begins and in which stage(s) of the pipeline to wait\n\tgraphicsSubmitInfo.waitSemaphoreCount = 1;\n\tgraphicsSubmitInfo.pWaitSemaphores = waitSemaphores;\n\tgraphicsSubmitInfo.pWaitDstStageMask = waitStages;\n\t// We want to wait with writing colors to the image until it's available, so we're specifying the stage of the graphics pipeline \n\t// that writes to the color attachment. That means that theoretically the implementation can already start executing our vertex \n\t// shader and such while the image is not available yet.\n\n\t// specify which command buffers to actually submit for execution\n\tgraphicsSubmitInfo.commandBufferCount = 1;\n\tif (swapPingPongBuffers) {\n\t\tgraphicsSubmitInfo.pCommandBuffers = &graphicsCommandBuffer1[swapChain->GetIndex()];\n\t}\n\telse {\n\t\tgraphicsSubmitInfo.pCommandBuffers = &graphicsCommandBuffer2[swapChain->GetIndex()];\n\t}\t\n\n\t// The signalSemaphoreCount and pSignalSemaphores parameters specify which semaphores to signal once the command buffer(s) have finished execution.\n\tVkSemaphore signalSemaphores[] = { swapChain->GetRenderFinishedVkSemaphore() };\n\tgraphicsSubmitInfo.signalSemaphoreCount = 1;\n\tgraphicsSubmitInfo.pSignalSemaphores = signalSemaphores;\n\n\t// submit the command buffer to the graphics queue\n\tif (vkQueueSubmit(device->GetQueue(QueueFlags::Graphics), 1, &graphicsSubmitInfo, VK_NULL_HANDLE) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to submit draw command buffer\");\n\t}\n\n\t// Display a frame\n\tswapChain->Present();\n\n\tswapPingPongBuffers = !swapPingPongBuffers;\n}\n\n//----------------------------------------------\n//-------------- Render Pass--------------------\n//----------------------------------------------\n// Reference: https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Render_passes\nvoid Renderer::CreateRenderPass()\n{\n\t// Color buffer attachment represented by one of the images from the swap chain\n\tVkAttachmentDescription colorAttachment = {};\n\tcolorAttachment.format = swapChain->GetVkImageFormat();\n\tcolorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;\n\tcolorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n\tcolorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n\tcolorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n\tcolorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;\n\tcolorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n\tcolorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;\n\n\t// Create a reference for the color attachment to be used with subpass\n\tVkAttachmentReference colorAttachmentRef = {};\n\tcolorAttachmentRef.attachment = 0;\n\tcolorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n\n\t// Depth buffer attachment represented by one of the images from the swap chain\n\tVkAttachmentDescription depthAttachment = {};\n\tdepthAttachment.format = FormatUtils::FindDepthFormat(physicalDevice); //The format should be the same as the depth image itself.\n\tdepthAttachment.samples = VK_SAMPLE_COUNT_1_BIT;\n\tdepthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n\tdepthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; //This time we don't care about storing the depth data, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//because it will not be used after drawing has finished.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//This may allow the hardware to perform additional optimizations.\n\tdepthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n\tdepthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;\n\tdepthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //we don't care about the previous depth contents, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   //so we can use VK_IMAGE_LAYOUT_UNDEFINED as initialLayout\n\tdepthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;\n\n\t// Create a reference for the depth attachment to be used with subpass\n\tVkAttachmentReference depthAttachmentRef = {};\n\tdepthAttachmentRef.attachment = 1;\n\tdepthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;\n\n\t// Create subpass description\n\t// a subpass can only use a single depth (+stencil) attachment. \n\tVkSubpassDescription subpass = {};\n\tsubpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;\n\tsubpass.colorAttachmentCount = 1;\n\tsubpass.pColorAttachments = &colorAttachmentRef;\n\tsubpass.pDepthStencilAttachment = &depthAttachmentRef;\n\n\t// Specify subpass dependency\n\tVkSubpassDependency dependency = {};\n\tdependency.srcSubpass = VK_SUBPASS_EXTERNAL;\n\tdependency.dstSubpass = 0;\n\tdependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n\tdependency.srcAccessMask = 0;\n\tdependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n\tdependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n\n\t// Create render pass\n\tstd::array<VkAttachmentDescription, 2> attachments = { colorAttachment, depthAttachment }; //Add more attachments here\n\tVkRenderPassCreateInfo renderPassInfo = {};\n\trenderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n\trenderPassInfo.attachmentCount = static_cast<uint32_t>(attachments.size());;\n\trenderPassInfo.pAttachments = attachments.data();\n\trenderPassInfo.subpassCount = 1;\n\trenderPassInfo.pSubpasses = &subpass;\n\trenderPassInfo.dependencyCount = 1;\n\trenderPassInfo.pDependencies = &dependency;\n\n\tif (vkCreateRenderPass(device->GetVkDevice(), &renderPassInfo, nullptr, &renderPass) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"Failed to create render pass\");\n\t}\n}\n\n//----------------------------------------------\n//-------------- Pipelines ---------------------\n//----------------------------------------------\nvoid Renderer::CreateAllPipeLines(VkRenderPass renderPass, unsigned int subpass)\n{\n\tcloudComputePipelineLayout = VulkanInitializers::CreatePipelineLayout( logicalDevice, { pingPongCloudResultSetLayout, cloudComputeSetLayout, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcameraSetLayout, timeSetLayout, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsunAndSkySetLayout, keyPressQuerySetLayout });\n\treprojectionPipelineLayout = VulkanInitializers::CreatePipelineLayout( logicalDevice, { pingPongCloudResultSetLayout, cameraSetLayout, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcameraSetLayout, timeSetLayout });\n\tgraphicsPipelineLayout = VulkanInitializers::CreatePipelineLayout( logicalDevice, { graphicsSetLayout, cameraSetLayout });\t\n\tpostProcess_GodRays_PipelineLayout = VulkanInitializers::CreatePipelineLayout( logicalDevice, { pingPongCloudResultSetLayout, godRaysSetLayout, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcameraSetLayout, sunAndSkySetLayout });\n\tpostProcess_ToneMap_PipelineLayout = VulkanInitializers::CreatePipelineLayout( logicalDevice, { toneMapSetLayout, timeSetLayout });\n\tpostProcess_TXAA_PipelineLayout = VulkanInitializers::CreatePipelineLayout(logicalDevice, { TXAASetLayout, cameraSetLayout, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcameraSetLayout, timeSetLayout});\n\t\n\tCreateComputePipeline(cloudComputePipelineLayout, cloudComputePipeline, \"CloudScapes/shaders/cloudRayMarch.comp.spv\");\n\tCreateComputePipeline(reprojectionPipelineLayout, reprojectionPipeline, \"CloudScapes/shaders/reprojection.comp.spv\");\n\tCreateGraphicsPipeline(renderPass, 0);\n\tCreatePostProcessPipeLines(renderPass);\n}\n\n// Reference: https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Conclusion\n// Reference: https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Fixed_functions\n// function argument 'subpass': index of the sub pass where this graphics pipeline will be used.\nvoid Renderer::CreateGraphicsPipeline(VkRenderPass renderPass, unsigned int subpass)\n{\n\t//--------------------------------------------------------\n\t//---------------- Set up shader stages ------------------\n\t//--------------------------------------------------------\n\t// Can add more shader modules to the list of shader stages that are part of the overall graphics pipeline\n\t// Reference: https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Shader_modules\n\t// Create vert and frag shader modules\n\tVkShaderModule vertShaderModule = ShaderModule::createShaderModule(\"CloudScapes/shaders/geometryPlain.vert.spv\", device->GetVkDevice());\n\tVkShaderModule fragShaderModule = ShaderModule::createShaderModule(\"CloudScapes/shaders/geometryPlain.frag.spv\", device->GetVkDevice());\n\n\t// Assign each shader module to the appropriate stage in the pipeline\n\tVkPipelineShaderStageCreateInfo vertShaderStageInfo = {};\n\tvertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n\tvertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;\n\tvertShaderStageInfo.module = vertShaderModule;\n\tvertShaderStageInfo.pName = \"main\";\n\n\tVkPipelineShaderStageCreateInfo fragShaderStageInfo = {};\n\tfragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n\tfragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT;\n\tfragShaderStageInfo.module = fragShaderModule;\n\tfragShaderStageInfo.pName = \"main\";\n\n\t//Add Shadermodules to the list of shader stages\n\tVkPipelineShaderStageCreateInfo shaderStages[] = { vertShaderStageInfo, fragShaderStageInfo };\n\n\t//--------------------------------------------------------\n\t//------------- Set up fixed-function stages -------------\n\t//--------------------------------------------------------\n\n\t// -------- Vertex input binding --------\n\t// Tell Vulkan how to pass this data format to the vertex shader once it's been uploaded to GPU memory \n\t// Vertex binding describes at which rate to load data from memory throughout the vertices\n\tVkVertexInputBindingDescription vertexInputBinding = Vertex::getBindingDescription();\n\t// Inpute attribute bindings describe shader attribute locations and memory layouts\n\tstd::array<VkVertexInputAttributeDescription, 3> vertexInputAttributes = Vertex::getAttributeDescriptions();\n\n\t// -------- Vertex input --------\n\tVkPipelineVertexInputStateCreateInfo vertexInputState = \n\t\tVulkanInitializers::pipelineVertexInputStateCreateInfo();\n\tvertexInputState.vertexBindingDescriptionCount = 1;\n\tvertexInputState.pVertexBindingDescriptions = &vertexInputBinding;\n\tvertexInputState.vertexAttributeDescriptionCount = static_cast<uint32_t>(vertexInputAttributes.size());\n\tvertexInputState.pVertexAttributeDescriptions = vertexInputAttributes.data();\n\n\t// -------- Input assembly --------\n\tVkPipelineInputAssemblyStateCreateInfo inputAssemblyState =\n\t\tVulkanInitializers::pipelineInputAssemblyStateCreateInfo(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE);\n\n\t// Viewports and Scissors (rectangles that define in which regions pixels are stored)\n\tVkViewport viewport = {};\n\tviewport.x = 0.0f;\n\tviewport.y = 0.0f;\n\tviewport.width = static_cast<float>(swapChain->GetVkExtent().width);\n\tviewport.height = static_cast<float>(swapChain->GetVkExtent().height);\n\tviewport.minDepth = 0.0f;\n\tviewport.maxDepth = 1.0f;\n\n\t// While viewports define the transformation from the image to the framebuffer, \n\t// scissor rectangles define in which regions pixels will actually be stored.\n\t// we simply want to draw to the entire framebuffer, so we'll specify a scissor rectangle that covers the framebuffer entirely\n\tVkRect2D scissor = {};\n\tscissor.offset = { 0, 0 };\n\tscissor.extent = swapChain->GetVkExtent();\n\n\t// Now this viewport and scissor rectangle need to be combined into a viewport state using the \n\t// VkPipelineViewportStateCreateInfo struct. It is possible to use multiple viewports and scissor\n\t// rectangles on some graphics cards, so its members reference an array of them. Using multiple requires \n\t// enabling a GPU feature (see logical device creation).\n\n\tVkPipelineViewportStateCreateInfo viewportState =\n\t\tVulkanInitializers::pipelineViewportStateCreateInfo(1, 1, 0);\n\n\tviewportState.pViewports = &viewport;\n\tviewportState.pScissors = &scissor;\n\n\tVkPipelineRasterizationStateCreateInfo rasterizationState =\n\t\tVulkanInitializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_CLOCKWISE, 0);\n\n\tVkPipelineMultisampleStateCreateInfo multisamplingState =\n\t\tVulkanInitializers::pipelineMultisampleStateCreateInfo(VK_SAMPLE_COUNT_1_BIT, 0);\n\n\tVkPipelineDepthStencilStateCreateInfo depthStencilState =\n\t\tVulkanInitializers::pipelineDepthStencilStateCreateInfo(VK_TRUE, VK_TRUE, VK_COMPARE_OP_LESS);\n\n\tVkColorComponentFlags colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;\n\tVkPipelineColorBlendAttachmentState blendAttachmentState =\n\t\tVulkanInitializers::pipelineColorBlendAttachmentState(colorWriteMask, VK_FALSE);\n\n\tVkPipelineColorBlendStateCreateInfo colorBlendingState =\n\t\tVulkanInitializers::pipelineColorBlendStateCreateInfo(1, &blendAttachmentState);\n\n\t// -------- Create graphics pipeline ---------\n\tVkGraphicsPipelineCreateInfo pipelineInfo = {};\n\tpipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n\tpipelineInfo.stageCount = 2; //vert and frag --> change if you add more\n\tpipelineInfo.pStages = shaderStages; //defined above\n\tpipelineInfo.pVertexInputState = &vertexInputState; //defined above\n\tpipelineInfo.pInputAssemblyState = &inputAssemblyState; //defined above\n\tpipelineInfo.pViewportState = &viewportState; //defined above\n\tpipelineInfo.pRasterizationState = &rasterizationState; //defined above\n\tpipelineInfo.pMultisampleState = &multisamplingState; //defined above\n\tpipelineInfo.pDepthStencilState = &depthStencilState; //defined above\n\tpipelineInfo.pColorBlendState = &colorBlendingState; //defined above\n\tpipelineInfo.pDynamicState = nullptr; //defined above\n\tpipelineInfo.layout = graphicsPipelineLayout; // passed in\n\tpipelineInfo.renderPass = renderPass; // passed in\n\tpipelineInfo.subpass = subpass; // passed in\n\tpipelineInfo.basePipelineHandle = VK_NULL_HANDLE; // Vulkan allows you to create a new graphics pipeline by deriving from an existing pipeline. We aren't doing this.\n\tpipelineInfo.basePipelineIndex = -1;\n\n\tif (vkCreateGraphicsPipelines(device->GetVkDevice(), VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to create pipeline\");\n\t}\n\n\t// No need for the shader modules anymore, so we destory them!\n\tvkDestroyShaderModule(device->GetVkDevice(), vertShaderModule, nullptr);\n\tvkDestroyShaderModule(device->GetVkDevice(), fragShaderModule, nullptr);\n}\nvoid Renderer::CreateComputePipeline(VkPipelineLayout& _computePipelineLayout, VkPipeline& _computePipeline, const std::string &filename)\n{\n\tVkShaderModule compShaderModule = ShaderModule::createShaderModule(filename, device->GetVkDevice());\n\n\tVkPipelineShaderStageCreateInfo compShaderStageInfo = {};\n\tcompShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n\tcompShaderStageInfo.stage = VK_SHADER_STAGE_COMPUTE_BIT;\n\tcompShaderStageInfo.module = compShaderModule;\n\tcompShaderStageInfo.pName = \"main\";\n\n\tVkComputePipelineCreateInfo pipelineInfo = {};\n\tpipelineInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;\n\tpipelineInfo.stage = compShaderStageInfo;\n\tpipelineInfo.layout = _computePipelineLayout;\n\n\tif (vkCreateComputePipelines(device->GetVkDevice(), VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &_computePipeline) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to create pipeline\");\n\t}\n\n\tvkDestroyShaderModule(device->GetVkDevice(), compShaderModule, nullptr);\n}\nvoid Renderer::CreatePostProcessPipeLines(VkRenderPass renderPass)\n{\n\t// -------- Vertex input binding --------\n\tVkPipelineVertexInputStateCreateInfo emptyVertexInputState = VulkanInitializers::pipelineVertexInputStateCreateInfo();\n\n\tVkPipelineInputAssemblyStateCreateInfo inputAssemblyState =\n\t\tVulkanInitializers::pipelineInputAssemblyStateCreateInfo(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE);\n\n\tVkPipelineRasterizationStateCreateInfo rasterizationState =\n\t\tVulkanInitializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_COUNTER_CLOCKWISE, 0);\n\n\tVkPipelineColorBlendAttachmentState blendAttachmentState =\n\t\tVulkanInitializers::pipelineColorBlendAttachmentState(0x0, VK_FALSE);\n\n\tVkPipelineColorBlendStateCreateInfo colorBlendState =\n\t\tVulkanInitializers::pipelineColorBlendStateCreateInfo(1, &blendAttachmentState);\n\n\tVkPipelineDepthStencilStateCreateInfo depthStencilState =\n\t\tVulkanInitializers::pipelineDepthStencilStateCreateInfo(VK_TRUE, VK_TRUE, VK_COMPARE_OP_LESS_OR_EQUAL);\n\n\t// Viewports and Scissors (rectangles that define in which regions pixels are stored)\n\tVkViewport viewport = {};\n\tviewport.x = 0.0f;\n\tviewport.y = 0.0f;\n\tviewport.width = static_cast<float>(swapChain->GetVkExtent().width);\n\tviewport.height = static_cast<float>(swapChain->GetVkExtent().height);\n\tviewport.minDepth = 0.0f;\n\tviewport.maxDepth = 1.0f;\n\n\t// While viewports define the transformation from the image to the framebuffer, \n\t// scissor rectangles define in which regions pixels will actually be stored.\n\t// we simply want to draw to the entire framebuffer, so we'll specify a scissor rectangle that covers the framebuffer entirely\n\tVkRect2D scissor = {};\n\tscissor.offset = { 0, 0 };\n\tscissor.extent = swapChain->GetVkExtent();\n\n\tVkPipelineViewportStateCreateInfo viewportState =\n\t\tVulkanInitializers::pipelineViewportStateCreateInfo(1, 1, 0);\n\n\tviewportState.pViewports = &viewport;\n\tviewportState.pScissors = &scissor;\n\n\tVkPipelineMultisampleStateCreateInfo multiSampleState =\n\t\tVulkanInitializers::pipelineMultisampleStateCreateInfo(VK_SAMPLE_COUNT_1_BIT, 0);\n\n\t// No Dynamic states\n\t//std::vector<VkDynamicState> dynamicStateEnables = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };\n\t//VkPipelineDynamicStateCreateInfo dynamicState =\n\t//\tVulkanInitializers::pipelineDynamicStateCreateInfo( dynamicStateEnables, 0 );\n\n\tstd::array<VkPipelineShaderStageCreateInfo, 2> shaderStages; //Defined later on and changes per pipeline binding since we are creating many pipelines here\n\n\t// -------- Create Base PostProcess pipeline Info ---------\n\tVkGraphicsPipelineCreateInfo postProcessPipelineCreateInfo =\n\t\tVulkanInitializers::graphicsPipelineCreateInfo(postProcess_GodRays_PipelineLayout, renderPass, 0);\n\n\tpostProcessPipelineCreateInfo.pVertexInputState = &emptyVertexInputState;; //defined above\n\tpostProcessPipelineCreateInfo.pInputAssemblyState = &inputAssemblyState; //defined above\n\tpostProcessPipelineCreateInfo.pRasterizationState = &rasterizationState; //defined above\n\tpostProcessPipelineCreateInfo.pColorBlendState = &colorBlendState; //defined above\n\tpostProcessPipelineCreateInfo.pMultisampleState = &multiSampleState; //defined above\n\tpostProcessPipelineCreateInfo.pViewportState = &viewportState; //defined above\n\tpostProcessPipelineCreateInfo.pDepthStencilState = &depthStencilState; //defined above\n\tpostProcessPipelineCreateInfo.pDynamicState = nullptr; //defined above\n\tpostProcessPipelineCreateInfo.subpass = 0; // no subpasses\n\tpostProcessPipelineCreateInfo.stageCount = shaderStages.size(); //reserving memory for the shader stages that will soon be defined\n\tpostProcessPipelineCreateInfo.pStages = shaderStages.data();\n\n\t// -------- Create Multiple Pipelines based on the above base ---------\n\t//Create a pipeline cache so multiple pieplines cane be created from the same pipeline creation Info\n\tVulkanInitializers::createPipelineCache(logicalDevice, postProcessPipeLineCache);\n\n\tVkShaderModule generic_vertShaderModule =\n\t\tShaderModule::createShaderModule(\"CloudScapes/shaders/postProcess_GenericVertShader.vert.spv\", logicalDevice);\n\tshaderStages[0] = VulkanInitializers::loadShader(VK_SHADER_STAGE_VERTEX_BIT, generic_vertShaderModule);\n\n\t// -------- God Rays pipeline -----------------------------------------\n\tVkShaderModule godRays_fragShaderModule =\n\t\tShaderModule::createShaderModule(\"CloudScapes/shaders/postProcess_GodRays.frag.spv\", logicalDevice);\n\n\t// Assign each shader module to the appropriate stage in the pipeline\n\tshaderStages[1] = VulkanInitializers::loadShader(VK_SHADER_STAGE_FRAGMENT_BIT, godRays_fragShaderModule);\n\n\tpostProcessPipelineCreateInfo.layout = postProcess_GodRays_PipelineLayout;\n\n\tif (vkCreateGraphicsPipelines(logicalDevice, postProcessPipeLineCache, 1, &postProcessPipelineCreateInfo, nullptr, &postProcess_GodRays_PipeLine) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to create post process pipeline\");\n\t}\n\n\tvkDestroyShaderModule(device->GetVkDevice(), godRays_fragShaderModule, nullptr);\n\n\t// -------- Tone Map Post -----------------------------------------\n\tVkShaderModule toneMap_fragShaderModule =\n\t\tShaderModule::createShaderModule(\"CloudScapes/shaders/postProcess_ToneMap.frag.spv\", logicalDevice);\n\n\t// Assign each shader module to the appropriate stage in the pipeline\n\tshaderStages[1] = VulkanInitializers::loadShader(VK_SHADER_STAGE_FRAGMENT_BIT, toneMap_fragShaderModule);\n\n\tpostProcessPipelineCreateInfo.layout = postProcess_ToneMap_PipelineLayout;\n\n\tif (vkCreateGraphicsPipelines(logicalDevice, postProcessPipeLineCache, 1, &postProcessPipelineCreateInfo, nullptr, &postProcess_ToneMap_PipeLine) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to create post process pipeline\");\n\t}\n\n\tvkDestroyShaderModule(device->GetVkDevice(), toneMap_fragShaderModule, nullptr);\n\n\t// -------- Enable Writing to Frame Buffer Again ------------------\n\t// BlendAttachmentState in addition to defining the blend state also defines if the shaders can write to the framebuffer with the color write mask\n\t// Color Write Mask Reference: https://www.khronos.org/registry/vulkan/specs/1.0/man/html/VkColorComponentFlagBits.html\n\tblendAttachmentState = VulkanInitializers::pipelineColorBlendAttachmentState(0xf, VK_FALSE);\n\n\t// -------- Anti Aliasing  pipeline -----------------------------------------\n\tVkShaderModule TXAA_fragShaderModule =\n\t\tShaderModule::createShaderModule(\"CloudScapes/shaders/postProcess_TXAA.frag.spv\", logicalDevice);\n\n\t// Assign each shader module to the appropriate stage in the pipeline\n\tshaderStages[1] = VulkanInitializers::loadShader(VK_SHADER_STAGE_FRAGMENT_BIT, TXAA_fragShaderModule);\n\n\tpostProcessPipelineCreateInfo.layout = postProcess_TXAA_PipelineLayout;\n\n\tif (vkCreateGraphicsPipelines(logicalDevice, postProcessPipeLineCache, 1, &postProcessPipelineCreateInfo, nullptr, &postProcess_TXAA_PipeLine) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to create post process pipeline\");\n\t}\n\n\tvkDestroyShaderModule(device->GetVkDevice(), TXAA_fragShaderModule, nullptr);\n\tvkDestroyShaderModule(device->GetVkDevice(), generic_vertShaderModule, nullptr);\n}\n\n//----------------------------------------------\n//-------------- Frame Resources ---------------\n//----------------------------------------------\nvoid Renderer::CreateFrameResources()\n{\n\t// Create the depth image and imageView that needs to be attached to the frame buffer\n\tVkFormat depthFormat = FormatUtils::FindDepthFormat(physicalDevice);\n\t// Create Depth Image and ImageViews\n\tImage::createImage(device, swapChain->GetVkExtent().width, swapChain->GetVkExtent().height, depthFormat,\n\t\tVK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,\n\t\tVK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, depthImage, depthImageMemory);\n\t// Create Depth ImageView\n\tImage::createImageView(device, depthImageView, depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT);\n\n\t// Transition the image for use as depth-stencil\n\tImage::transitionImageLayout(device, graphicsCommandPool, depthImage, depthFormat,\n\t\tVK_IMAGE_LAYOUT_UNDEFINED,\n\t\tVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);\n\n\tCreateFrameBuffers(renderPass);\n}\nvoid Renderer::DestroyFrameResources()\n{\n\t// Destroy Depth Image and ImageView\n\tvkDestroyImageView(logicalDevice, depthImageView, nullptr);\n\tvkFreeMemory(logicalDevice, depthImageMemory, nullptr);\n\tvkDestroyImage(logicalDevice, depthImage, nullptr);\n\n\t// Destroy FrameBuffers\n\tfor (size_t i = 0; i < frameBuffers.size(); i++)\n\t{\n\t\tvkDestroyFramebuffer(logicalDevice, frameBuffers[i], nullptr);\n\t}\n}\nvoid Renderer::RecreateFrameResources()\n{\n\tDestroyOnWindowResize();\n\n\tCreateResources();\n\tCreateRenderPass();\n\n\tWriteToAndUpdateAllDescriptorSets();\n\n\tCreateFrameResources();\n\tCreateAllPipeLines(renderPass, 0);\n\n\tRecordAllCommandBuffers();\n}\n\nvoid Renderer::CreateFrameBuffers(VkRenderPass renderPass)\n{\n\tframeBuffers.resize(swapChain->GetCount());\n\tfor (uint32_t i = 0; i < swapChain->GetCount(); i++)\n\t{\n\t\tstd::array<VkImageView, 2> attachments = { swapChain->GetVkImageView(i), depthImageView };\n\n\t\t// The color attachment differs for every swap chain image, but the same depth image can \n\t\t// be used by all of them because only a single subpass is running at the same time due to our semaphores.\n\n\t\tVkFramebufferCreateInfo framebufferInfo = {};\n\t\tframebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n\t\tframebufferInfo.renderPass = renderPass;\n\t\tframebufferInfo.attachmentCount = static_cast<uint32_t>(attachments.size());\n\t\tframebufferInfo.pAttachments = attachments.data();\n\t\tframebufferInfo.width = swapChain->GetVkExtent().width;\n\t\tframebufferInfo.height = swapChain->GetVkExtent().height;\n\t\tframebufferInfo.layers = 1;\n\n\t\tif (vkCreateFramebuffer(logicalDevice, &framebufferInfo, nullptr, &frameBuffers[i]) != VK_SUCCESS)\n\t\t{\n\t\t\tthrow std::runtime_error(\"Failed to create framebuffer\");\n\t\t}\n\t}\n}\n\n//----------------------------------------------\n//-------------- Command Buffers ---------------\n//----------------------------------------------\nvoid Renderer::RecordAllCommandBuffers()\n{\n\tVkImage currFrameImage = currentCloudsResultTexture->GetTextureImage();\n\tVkImage prevFrameImage = previousCloudsResultTexture->GetTextureImage();\n\n\tRecordComputeCommandBuffer(computeCommandBuffer1, pingPongCloudResultSet1);\n\tRecordGraphicsCommandBuffer(graphicsCommandBuffer1, currFrameImage, pingPongCloudResultSet1, toneMapSet1, TXAASet1);\n\n\tRecordComputeCommandBuffer(computeCommandBuffer2, pingPongCloudResultSet2);\n\tRecordGraphicsCommandBuffer(graphicsCommandBuffer2, prevFrameImage, pingPongCloudResultSet2, toneMapSet2, TXAASet2);\n}\nvoid Renderer::RecordComputeCommandBuffer(VkCommandBuffer &computeCmdBuffer, VkDescriptorSet& pingPongFrameSet)\n{\n\tVkCommandBufferAllocateInfo commandBufferAllocateInfo = {};\n\tcommandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n\tcommandBufferAllocateInfo.commandPool = computeCommandPool;\n\tcommandBufferAllocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n\tcommandBufferAllocateInfo.commandBufferCount = 1;\n\n\tif (vkAllocateCommandBuffers(logicalDevice, &commandBufferAllocateInfo, &computeCmdBuffer) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"Failed to allocate compute command buffers\");\n\t}\n\n\t// Record command buffer-> should not nead one for every frame of the swapchain\n\tVkCommandBufferBeginInfo beginInfo = {};\n\tbeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n\tbeginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; // How we are using the command buffer\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The command buffer can be resubmitted while it is also already pending execution.\n\tbeginInfo.pInheritanceInfo = nullptr; //only useful for secondary command buffers\n\n\t\t\t\t\t\t\t\t\t\t  //---------- Begin recording ----------\n\t\t\t\t\t\t\t\t\t\t  //If the command buffer was already recorded once, then a call to vkBeginCommandBuffer will implicitly reset it. \n\t\t\t\t\t\t\t\t\t\t  // It's not possible to append commands to a buffer at a later time.\n\tif (vkBeginCommandBuffer(computeCmdBuffer, &beginInfo) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to begin recording compute command buffer\");\n\t}\n\n\t//-----------------------------------------------------\n\t//--- Compute Pipeline Binding, Dispatch & Barriers ---\n\t//-----------------------------------------------------\n\tuint32_t numBlocksX = (window_width + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE;\n\tuint32_t numBlocksY = (window_height + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE;\n\tuint32_t numBlocksZ = 1;\n\n\t//Bind the compute piepline\n\tvkCmdBindPipeline(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, reprojectionPipeline);\n\n\t//Bind Descriptor Sets for compute\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, reprojectionPipelineLayout, 0, 1, &pingPongFrameSet, 0, nullptr);\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, reprojectionPipelineLayout, 1, 1, &cameraSet, 0, nullptr);\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, reprojectionPipelineLayout, 2, 1, &cameraOldSet, 0, nullptr);\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, reprojectionPipelineLayout, 3, 1, &timeSet, 0, nullptr);\n\n\t// Dispatch the compute kernel\n\t// similar to a kernel call --> void vkCmdDispatch(commandBuffer, groupCountX, groupCountY, groupCountZ);\t\n\tvkCmdDispatch(computeCmdBuffer, numBlocksX, numBlocksY, numBlocksZ);\n\n\t//Bind Descriptor Sets for compute\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, cloudComputePipelineLayout, 0, 1, &pingPongFrameSet, 0, nullptr);\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, cloudComputePipelineLayout, 1, 1, &cloudComputeSet, 0, nullptr);\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, cloudComputePipelineLayout, 2, 1, &cameraSet, 0, nullptr);\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, cloudComputePipelineLayout, 3, 1, &timeSet, 0, nullptr);\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, cloudComputePipelineLayout, 4, 1, &sunAndSkySet, 0, nullptr);\n\tvkCmdBindDescriptorSets(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, cloudComputePipelineLayout, 5, 1, &keyPressQuerySet, 0, nullptr);\n\n\t//Bind the compute piepline\n\tvkCmdBindPipeline(computeCmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, cloudComputePipeline);\n\n\t// Dispatch the compute kernel\n\t// similar to a kernel call --> void vkCmdDispatch(commandBuffer, groupCountX, groupCountY, groupCountZ);\t\n\tnumBlocksX = (std::ceil(window_width / 4) + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE;\n\tnumBlocksY = (std::ceil(window_height / 4) + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE;\n\n\tvkCmdDispatch(computeCmdBuffer, numBlocksX, numBlocksY, numBlocksZ);\n\n\t//---------- End Recording ----------\n\tif (vkEndCommandBuffer(computeCmdBuffer) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to record the compute command buffer\");\n\t}\n}\nvoid Renderer::RecordGraphicsCommandBuffer(std::vector<VkCommandBuffer> &graphicsCmdBuffer, VkImage &Image_for_barrier, \n\t\t\t\t\t\t\t\t\t\t\tVkDescriptorSet& pingPongCloudResultSet, VkDescriptorSet& toneMapSet, VkDescriptorSet& TXAASet)\n{\n\tgraphicsCmdBuffer.resize(swapChain->GetCount());\n\n\t// Specify the command pool and number of buffers to allocate\n\t/*\n\tThe level parameter specifies if the allocated command buffers are primary or secondary command buffers.\n\tVK_COMMAND_BUFFER_LEVEL_PRIMARY: Can be submitted to a queue for execution, but cannot be called from other command buffers.\n\tVK_COMMAND_BUFFER_LEVEL_SECONDARY : Cannot be submitted directly, but can be called from primary command buffers.\n\t*/\n\tVkCommandBufferAllocateInfo commandBufferAllocateInfo = {};\n\tcommandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n\tcommandBufferAllocateInfo.commandPool = graphicsCommandPool;\n\tcommandBufferAllocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n\tcommandBufferAllocateInfo.commandBufferCount = (uint32_t)(graphicsCmdBuffer.size());\n\n\tif (vkAllocateCommandBuffers(logicalDevice, &commandBufferAllocateInfo, graphicsCmdBuffer.data()) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to allocate graphics command buffers\");\n\t}\n\n\t// Record graphics command buffers, one for each frame of the swapchain\n\tfor (unsigned int i = 0; i < graphicsCmdBuffer.size(); ++i)\n\t{\n\t\tVkCommandBufferBeginInfo beginInfo = {};\n\t\tbeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n\t\tbeginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; // How we are using the command buffer\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The command buffer can be resubmitted while it is also already pending execution.\n\t\tbeginInfo.pInheritanceInfo = nullptr; //only useful for secondary command buffers\n\n\t\t//---------- Begin recording ----------\n\t\t//If the command buffer was already recorded once, then a call to vkBeginCommandBuffer will implicitly reset it. \n\t\t// It's not possible to append commands to a buffer at a later time.\n\t\tif (vkBeginCommandBuffer(graphicsCmdBuffer[i], &beginInfo) != VK_SUCCESS) {\n\t\t\tthrow std::runtime_error(\"Failed to begin recording graphics command buffer\");\n\t\t}\n\n\t\t// Begin the render pass\n\t\tVkRenderPassBeginInfo renderPassInfo = {};\n\t\trenderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n\t\trenderPassInfo.renderPass = renderPass;\n\t\trenderPassInfo.framebuffer = frameBuffers[i]; //attachments we bind to the renderpass\n\t\trenderPassInfo.renderArea.offset = { 0, 0 };\n\t\trenderPassInfo.renderArea.extent = swapChain->GetVkExtent();\n\n\t\t// Clear values used while clearing the attachments before usage or after usage\n\t\tstd::array<VkClearValue, 2> clearValues = {};\n\t\tclearValues[0].color = { 0.0f, 0.0f, 0.0f, 1.0f }; //black\n\t\tclearValues[1].depthStencil = { 1.0f, 0 }; //far plane\n\n\t\trenderPassInfo.clearValueCount = static_cast<uint32_t>(clearValues.size());\n\t\trenderPassInfo.pClearValues = clearValues.data();\n\n\t\t//---------------------------------------------------------\n\t\t//--- Graphics and Clouds Pipeline Binding and Dispatch ---\n\t\t//---------------------------------------------------------\n\t\t// Define a memory barrier to transition the vertex buffer from a compute storage object to a vertex input\n\t\t// Each element of the pMemoryBarriers, pBufferMemoryBarriers and pImageMemoryBarriers arrays specifies two halves of a memory dependency, as defined above.\n\t\t// Reference: https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch06s05.html#synchronization-memory-barriers\n\t\tVkImageMemoryBarrier imageMemoryBarrier = {};\n\t\timageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n\t\timageMemoryBarrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;\n\t\timageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;\n\t\timageMemoryBarrier.image = Image_for_barrier;\n\t\timageMemoryBarrier.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };\n\t\timageMemoryBarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;\n\t\timageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;\n\n\t\t// A pipeline barrier inserts an execution dependency and a set of memory dependencies between a set of commands earlier in the command buffer and a set of commands later in the command buffer.\n\t\t// Reference: https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch06s05.html\n\t\tvkCmdPipelineBarrier(graphicsCmdBuffer[i], VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,\n\t\t\t0, 0, nullptr, 0, nullptr, 1, &imageMemoryBarrier);\n\n\t\tvkCmdBeginRenderPass(graphicsCmdBuffer[i], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);\n\t\t// VK_SUBPASS_CONTENTS_INLINE: The render pass commands will be embedded in the primary command\n\t\t// buffer itself and no secondary command buffers will be executed.\n\n\t\t//------------------------\n\t\t//--- Graphics Pipeline---\n\t\t//------------------------\n\t\t/*\n\t\t// Uncomment for models :D --> except we can only load small obj's at the moment\n\t\t\n\t\t// Bind the graphics pipeline\n\t\tvkCmdBindPipeline(graphicsCommandBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);\n\n\t\t// Bind graphics descriptor set\n\t\tvkCmdBindDescriptorSets(graphicsCommandBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipelineLayout, 0, 1, &graphicsSet, 0, nullptr);\n\t\tvkCmdBindDescriptorSets(graphicsCommandBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipelineLayout, 1, 1, &cameraSet, 0, nullptr);\n\n\t\t// Bind the vertex and index buffers\n\t\tVkDeviceSize geomOffsets[] = { 0 };\n\t\tconst VkBuffer geomVertices = scene->GetModels()[0]->getVertexBuffer();\n\t\tvkCmdBindVertexBuffers(graphicsCommandBuffer[i], 0, 1, &geomVertices, geomOffsets);\n\t\tvkCmdBindIndexBuffer(graphicsCommandBuffer[i], scene->GetModels()[0]->getIndexBuffer(), 0, VK_INDEX_TYPE_UINT32);\n\n\t\t// Draw indexed triangle\n\t\tvkCmdDrawIndexed(graphicsCommandBuffer[i], scene->GetModels()[0]->getIndexBufferSize(), 1, 0, 0, 1);\n\t\t*/\n\t\t\n\t\t//-----------------------------\n\t\t//--- PostProcess Pipelines ---\n\t\t//-----------------------------\n\t\t//// God Rays Pipeline\n\t\t//vkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_GodRays_PipelineLayout, 0, 1, &pingPongCloudResultSet, 0, NULL);\n\t\t//vkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_GodRays_PipelineLayout, 1, 1, &godRaysSet, 0, NULL);\n\t\t//vkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_GodRays_PipelineLayout, 2, 1, &cameraSet, 0, NULL);\n\t\t//vkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_GodRays_PipelineLayout, 3, 1, &sunAndSkySet, 0, NULL);\n\t\t//vkCmdBindPipeline(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_GodRays_PipeLine);\n\t\t//vkCmdDraw(graphicsCmdBuffer[i], 3, 1, 0, 0);\n\n\t\t// Tone Map Pass Pipeline\n\t\tvkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_ToneMap_PipelineLayout, 0, 1, &toneMapSet, 0, NULL);\n\t\tvkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_ToneMap_PipelineLayout, 1, 1, &timeSet, 0, NULL);\n\t\tvkCmdBindPipeline(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_ToneMap_PipeLine);\n\t\tvkCmdDraw(graphicsCmdBuffer[i], 3, 1, 0, 0);\n\n\t\t// Temporal Anti-Aliasing Pass Pipeline\n\t\tvkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_TXAA_PipelineLayout, 0, 1, &TXAASet, 0, NULL);\n\t\tvkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_TXAA_PipelineLayout, 1, 1, &cameraSet, 0, NULL);\n\t\tvkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_TXAA_PipelineLayout, 2, 1, &cameraOldSet, 0, NULL);\n\t\tvkCmdBindDescriptorSets(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_TXAA_PipelineLayout, 3, 1, &timeSet, 0, NULL);\n\t\tvkCmdBindPipeline(graphicsCmdBuffer[i], VK_PIPELINE_BIND_POINT_GRAPHICS, postProcess_TXAA_PipeLine);\n\t\tvkCmdDraw(graphicsCmdBuffer[i], 3, 1, 0, 0);\n\n\t\t//---------- End RenderPass ---------\n\t\tvkCmdEndRenderPass(graphicsCmdBuffer[i]);\n\n\t\t//---------- End Recording ----------\n\t\tif (vkEndCommandBuffer(graphicsCmdBuffer[i]) != VK_SUCCESS) {\n\t\t\tthrow std::runtime_error(\"Failed to record the graphics command buffer\");\n\t\t}\n\t}// end for loop\n}\n\n//----------------------------------------------\n//-------------- Descriptors -------------------\n//----------------------------------------------\n// Reference: https://vulkan-tutorial.com/Uniform_buffers/Descriptor_pool_and_sets\nvoid Renderer::CreateDescriptorPool()\n{\n\t// Info for the types of descriptors that can be allocated from this pool\n\n\t// compute and graphics descriptor sets are allocated from the same pool\n\tstd::vector<VkDescriptorPoolSize> poolSizes = {\n\t\t// Format for elements: { type, descriptorCount }\n\t\t// ------------ Curr and Prev Cloud Results -----------------\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 }, // Current Cloud Result\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 }, // Previous Cloud Result\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 }, // Current Cloud Result\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 }, // Previous Cloud Result\n\t\t// ------------ Compute ------------------------------\n\t\t// Samplers for all the cloud Textures\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, // low frequency texture\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, // high frequency texture\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, // curl noise texture\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, // Weather Map\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 }, //God Rays Mask\n\n\t\t// ------------ Graphics -----------------------------\n\t\t{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 }, //model matrix\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, //texture sampler for model\n\n\t\t// -------- Can be attached to multiple pipelines ------\n\t\t{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 }, // Camera\n\t\t{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 }, // previous Frame Camera\n\t\t{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 }, // Time\n\t\t{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 }, // SunAndSky\n\t\t{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 }, // KeyPress\n\n\t\t// ------------ PostProcess pipelines -----------------\n\t\t// GodRays -- GreyScale Image of where light is in the sky\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 },\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 },\n\t\t\n\t\t// Tone Map Pass (2 sets --> curr and prev pingponged cloud results)\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 },\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 },\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 },\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 },\n\n\t\t// Anti Aliasing  (2 sets --> curr and prev pingponged frames)\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 },\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 },\n\t\t{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 },\n\t\t{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 },\n\t};\n\t\n\tVulkanInitializers::CreateDescriptorPool(logicalDevice, static_cast<uint32_t>(poolSizes.size()), poolSizes.data(), descriptorPool);\n}\n\nvoid Renderer::CreateAllDescriptorSetLayouts()\n{\n\t// Create the array of VkDescriptorSetLayoutBinding's \n\t// Binding --> used in shader\n\t// Descriptor Type --> type of descriptor\n\t// Descriptor Count --> Shader variable can represent an array of UBO's, descriptorCount specifies number of values in the array\n\t// Stage Flags --> which shader you're referencing this descriptor from \n\t// pImmutableSamplers --> for image sampling related descriptors\n\t\n\t// Ping Pong Set 1\n\tVkDescriptorSetLayoutBinding currentCloudResultLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_ALL, nullptr };\n\tVkDescriptorSetLayoutBinding previousCloudResultLayoutBinding = { 1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_ALL, nullptr };\n\tstd::array<VkDescriptorSetLayoutBinding, 2> pingPongFrameBindings = { currentCloudResultLayoutBinding, previousCloudResultLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(pingPongFrameBindings.size()), pingPongFrameBindings.data(), pingPongCloudResultSetLayout);\n\t\n\t//-------------------- Computes Pipeline --------------------\n\tVkDescriptorSetLayoutBinding cloudLowFrequencyNoiseSetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr };\n\tVkDescriptorSetLayoutBinding cloudHighFrequencyNoiseSetLayoutBinding = { 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr };\n\tVkDescriptorSetLayoutBinding cloudCurlNoiseSetLayoutBinding = { 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr };\n\tVkDescriptorSetLayoutBinding weatherMapSetLayoutBinding = { 3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr };\n\tVkDescriptorSetLayoutBinding godRaysCreationDataSetLayoutBinding = { 4, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 5> cloudRayMarchBindings = { cloudLowFrequencyNoiseSetLayoutBinding, cloudHighFrequencyNoiseSetLayoutBinding,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcloudCurlNoiseSetLayoutBinding, weatherMapSetLayoutBinding, godRaysCreationDataSetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(cloudRayMarchBindings.size()), cloudRayMarchBindings.data(), cloudComputeSetLayout);\n\n\t//-------------------- Graphics Pipeline --------------------\n\tVkDescriptorSetLayoutBinding modelSetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT, nullptr };\n\tVkDescriptorSetLayoutBinding samplerSetLayoutBinding = { 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 2> graphicsBindings = { modelSetLayoutBinding, samplerSetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(graphicsBindings.size()), graphicsBindings.data(), graphicsSetLayout);\n\n\t//-------------------- Descriptors that are discrete and mey be attached to multiple pieplines --------------------\n\t//Camera\n\tVkDescriptorSetLayoutBinding cameraSetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 1> cameraBindings = { cameraSetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(cameraBindings.size()), cameraBindings.data(), cameraSetLayout);\n\n\t//Time --> Would be better to use pushConstants --> TODO at somepoint\n\tVkDescriptorSetLayoutBinding timeSetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 1> timeBindings = { timeSetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(timeBindings.size()), timeBindings.data(), timeSetLayout);\n\n\t//SunAndSky\n\tVkDescriptorSetLayoutBinding sunAndSkySetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 1> sunAndSkyBindings = { sunAndSkySetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(sunAndSkyBindings.size()), sunAndSkyBindings.data(), sunAndSkySetLayout);\n\n\t//KeyPressQuery\n\tVkDescriptorSetLayoutBinding keyPressQuerySetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 1> keyPressQueryBindings = { keyPressQuerySetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(keyPressQueryBindings.size()), keyPressQueryBindings.data(), keyPressQuerySetLayout);\n\n\t//-------------------- Post Process --------------------\n\t//God Rays\n\tVkDescriptorSetLayoutBinding godRaysSetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 1> godRaysBindings = { godRaysSetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(godRaysBindings.size()), godRaysBindings.data(), godRaysSetLayout);\n\n\t//Tone Map Pass\n\tVkDescriptorSetLayoutBinding toneMapInputImageSetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };\n\tVkDescriptorSetLayoutBinding toneMapWriteImageSetLayoutBinding = { 1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 2> toneMapBindings = { toneMapInputImageSetLayoutBinding, toneMapWriteImageSetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(toneMapBindings.size()), toneMapBindings.data(), toneMapSetLayout);\n\n\t//TXAA Pass\n\tVkDescriptorSetLayoutBinding TXAAPrevFrameSetLayoutBinding = { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };\n\tVkDescriptorSetLayoutBinding TXAACurrentFrameSetLayoutBinding = { 1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };\n\n\tstd::array<VkDescriptorSetLayoutBinding, 2> TXAABindings = { TXAAPrevFrameSetLayoutBinding, TXAACurrentFrameSetLayoutBinding };\n\tVulkanInitializers::CreateDescriptorSetLayout(logicalDevice, static_cast<uint32_t>(TXAABindings.size()), TXAABindings.data(), TXAASetLayout);\n}\nvoid Renderer::CreateAllDescriptorSets()\n{\n\t// Initialize descriptor sets\n\tcloudComputeSet = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, cloudComputeSetLayout);\n\tgraphicsSet = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, graphicsSetLayout);\n\n\tpingPongCloudResultSet1 = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, pingPongCloudResultSetLayout);\n\tpingPongCloudResultSet2 = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, pingPongCloudResultSetLayout);\n\n\tcameraSet = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, cameraSetLayout);\n\tcameraOldSet = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, cameraSetLayout);\n\ttimeSet = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, timeSetLayout);\n\tsunAndSkySet = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, sunAndSkySetLayout);\n\tkeyPressQuerySet = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, keyPressQuerySetLayout);\n\n\tgodRaysSet = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, godRaysSetLayout);\n\ttoneMapSet1 = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, toneMapSetLayout);\n\ttoneMapSet2 = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, toneMapSetLayout);\n\n\tTXAASet1 = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, TXAASetLayout);\n\tTXAASet2 = VulkanInitializers::CreateDescriptorSet(logicalDevice, descriptorPool, TXAASetLayout);\n\n\t//Create other things in the Scene like terrain models\n\tscene->CreateModelsInScene(graphicsCommandPool);\n\n\t//Write to and Update DescriptorSets\n\tWriteToAndUpdateAllDescriptorSets();\n}\n\nvoid Renderer::WriteToAndUpdateAllDescriptorSets()\n{\n\tWriteToAndUpdatePingPongDescriptorSets();\n\tWriteToAndUpdateComputeDescriptorSets();\n\tWriteToAndUpdateGraphicsDescriptorSets();\n\tWriteToAndUpdateRemainingDescriptorSets();\n\t\n\t//Post Process Sets\n\tWriteToAndUpdateGodRaysSet();\n\tWriteToAndUpdateToneMapSet();\n\tWriteToAndUpdateTXAASet();\n}\nvoid Renderer::WriteToAndUpdatePingPongDescriptorSets()\n{\n\t// Texture Compute Shader Writes To\n\tVkDescriptorImageInfo currentFrameTextureInfo = {};\n\tcurrentFrameTextureInfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL;\n\tcurrentFrameTextureInfo.imageView = currentCloudsResultTexture->GetTextureImageView();\n\tcurrentFrameTextureInfo.sampler = currentCloudsResultTexture->GetTextureSampler();\n\n\t// previous Frame Data for Reprojection\n\tVkDescriptorImageInfo previousFrameTextureInfo = {};\n\tpreviousFrameTextureInfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL;\n\tpreviousFrameTextureInfo.imageView = previousCloudsResultTexture->GetTextureImageView();\n\tpreviousFrameTextureInfo.sampler = previousCloudsResultTexture->GetTextureSampler();\n\n\tstd::array<VkWriteDescriptorSet, 2> writePingPongSet1Info = {};\n\t\n\twritePingPongSet1Info[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twritePingPongSet1Info[0].pNext = NULL;\n\twritePingPongSet1Info[0].dstSet = pingPongCloudResultSet1;\n\twritePingPongSet1Info[0].dstBinding = 0;\n\twritePingPongSet1Info[0].descriptorCount = 1;\n\twritePingPongSet1Info[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twritePingPongSet1Info[0].pImageInfo = &currentFrameTextureInfo;\n\n\twritePingPongSet1Info[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twritePingPongSet1Info[1].pNext = NULL;\n\twritePingPongSet1Info[1].dstSet = pingPongCloudResultSet1;\n\twritePingPongSet1Info[1].dstBinding = 1;\n\twritePingPongSet1Info[1].descriptorCount = 1;\n\twritePingPongSet1Info[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twritePingPongSet1Info[1].pImageInfo = &previousFrameTextureInfo;\n\n\tstd::array<VkWriteDescriptorSet, 2> writePingPongSet2Info = {};\n\n\twritePingPongSet2Info[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twritePingPongSet2Info[0].pNext = NULL;\n\twritePingPongSet2Info[0].dstSet = pingPongCloudResultSet2;\n\twritePingPongSet2Info[0].dstBinding = 0;\n\twritePingPongSet2Info[0].descriptorCount = 1;\n\twritePingPongSet2Info[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twritePingPongSet2Info[0].pImageInfo = &previousFrameTextureInfo;\n\t\n\twritePingPongSet2Info[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twritePingPongSet2Info[1].pNext = NULL;\n\twritePingPongSet2Info[1].dstSet = pingPongCloudResultSet2;\n\twritePingPongSet2Info[1].dstBinding = 1;\n\twritePingPongSet2Info[1].descriptorCount = 1;\n\twritePingPongSet2Info[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twritePingPongSet2Info[1].pImageInfo = &currentFrameTextureInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writePingPongSet1Info.size()), writePingPongSet1Info.data(), 0, nullptr);\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writePingPongSet2Info.size()), writePingPongSet2Info.data(), 0, nullptr);\n}\nvoid Renderer::WriteToAndUpdateComputeDescriptorSets()\n{\n\t//------------------------------------------\n\t//-------Compute Pipeline DescriptorSets----\n\t//------------------------------------------\n\t// Cloud Low Frequency Noise\n\tVkDescriptorImageInfo cloudLowFrequencyNoiseImageInfo = {};\n\tcloudLowFrequencyNoiseImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\tcloudLowFrequencyNoiseImageInfo.imageView = sky->cloudBaseShapeTexture->GetTextureImageView();\n\tcloudLowFrequencyNoiseImageInfo.sampler = sky->cloudBaseShapeTexture->GetTextureSampler();\n\n\t// Cloud High Frequency Noise\n\tVkDescriptorImageInfo cloudHighFrequencyNoiseImageInfo = {};\n\tcloudHighFrequencyNoiseImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\tcloudHighFrequencyNoiseImageInfo.imageView = sky->cloudDetailsTexture->GetTextureImageView();\n\tcloudHighFrequencyNoiseImageInfo.sampler = sky->cloudDetailsTexture->GetTextureSampler();\n\n\t// Cloud Curl Noise\n\tVkDescriptorImageInfo cloudCurlNoiseImageInfo = {};\n\tcloudCurlNoiseImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\tcloudCurlNoiseImageInfo.imageView = sky->cloudMotionTexture->GetTextureImageView();\n\tcloudCurlNoiseImageInfo.sampler = sky->cloudMotionTexture->GetTextureSampler();\n\n\t// Weather Map\n\tVkDescriptorImageInfo weatherMapInfo = {};\n\tweatherMapInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\tweatherMapInfo.imageView = sky->weatherMapTexture->GetTextureImageView();\n\tweatherMapInfo.sampler = sky->weatherMapTexture->GetTextureSampler();\n\n\t// God Rays Creation Data Texture\n\tVkDescriptorImageInfo godRaysCreationDataTextureInfo = {};\n\tgodRaysCreationDataTextureInfo.imageLayout = godRaysCreationDataTexture->GetTextureLayout();\n\tgodRaysCreationDataTextureInfo.imageView = godRaysCreationDataTexture->GetTextureImageView();\n\tgodRaysCreationDataTextureInfo.sampler = godRaysCreationDataTexture->GetTextureSampler();\n\n\tstd::array<VkWriteDescriptorSet, 5> writeComputeTextureInfo = {};\n\t\n\twriteComputeTextureInfo[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteComputeTextureInfo[0].pNext = NULL;\n\twriteComputeTextureInfo[0].dstSet = cloudComputeSet;\n\twriteComputeTextureInfo[0].dstBinding = 0;\n\twriteComputeTextureInfo[0].descriptorCount = 1;\n\twriteComputeTextureInfo[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteComputeTextureInfo[0].pImageInfo = &cloudLowFrequencyNoiseImageInfo;\n\n\twriteComputeTextureInfo[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteComputeTextureInfo[1].pNext = NULL;\n\twriteComputeTextureInfo[1].dstSet = cloudComputeSet;\n\twriteComputeTextureInfo[1].dstBinding = 1;\n\twriteComputeTextureInfo[1].descriptorCount = 1;\n\twriteComputeTextureInfo[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteComputeTextureInfo[1].pImageInfo = &cloudHighFrequencyNoiseImageInfo;\n\n\twriteComputeTextureInfo[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteComputeTextureInfo[2].pNext = NULL;\n\twriteComputeTextureInfo[2].dstSet = cloudComputeSet;\n\twriteComputeTextureInfo[2].dstBinding = 2;\n\twriteComputeTextureInfo[2].descriptorCount = 1;\n\twriteComputeTextureInfo[2].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteComputeTextureInfo[2].pImageInfo = &cloudCurlNoiseImageInfo;\n\n\twriteComputeTextureInfo[3].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteComputeTextureInfo[3].pNext = NULL;\n\twriteComputeTextureInfo[3].dstSet = cloudComputeSet;\n\twriteComputeTextureInfo[3].dstBinding = 3;\n\twriteComputeTextureInfo[3].descriptorCount = 1;\n\twriteComputeTextureInfo[3].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteComputeTextureInfo[3].pImageInfo = &weatherMapInfo;\n\n\twriteComputeTextureInfo[4].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteComputeTextureInfo[4].pNext = NULL;\n\twriteComputeTextureInfo[4].dstSet = cloudComputeSet;\n\twriteComputeTextureInfo[4].dstBinding = 4;\n\twriteComputeTextureInfo[4].descriptorCount = 1;\n\twriteComputeTextureInfo[4].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twriteComputeTextureInfo[4].pImageInfo = &godRaysCreationDataTextureInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeComputeTextureInfo.size()), writeComputeTextureInfo.data(), 0, nullptr);\n}\nvoid Renderer::WriteToAndUpdateGraphicsDescriptorSets()\n{\n\t//---------------------------------\n\t//---- Graphics DescriptorSets ----\n\t//---------------------------------\n\t// We know we are only drawing one model but change this if creating multiple models\n\tstd::vector<Model*> models = scene->GetModels();\n\n\t// Model\n\tVkDescriptorBufferInfo modelBufferInfo = {};\n\tmodelBufferInfo.buffer = models[0]->GetModelBuffer();\n\tmodelBufferInfo.offset = 0;\n\tmodelBufferInfo.range = sizeof(ModelBufferObject);\n\n\t// Texture\n\tVkDescriptorImageInfo imageInfo = {};\n\timageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\timageInfo.imageView = models[0]->GetTextureView();\n\timageInfo.sampler = models[0]->GetTextureSampler();\n\n\tstd::array<VkWriteDescriptorSet, 2> writeGraphicsSetInfo = {};\n\n\twriteGraphicsSetInfo[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteGraphicsSetInfo[0].dstSet = graphicsSet;\n\twriteGraphicsSetInfo[0].dstBinding = 0;\n\twriteGraphicsSetInfo[0].descriptorCount = 1;\n\twriteGraphicsSetInfo[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n\twriteGraphicsSetInfo[0].pBufferInfo = &modelBufferInfo;\n\n\twriteGraphicsSetInfo[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteGraphicsSetInfo[1].pNext = NULL;\n\twriteGraphicsSetInfo[1].dstSet = graphicsSet;\n\twriteGraphicsSetInfo[1].dstBinding = 1;\n\twriteGraphicsSetInfo[1].descriptorCount = 1;\n\twriteGraphicsSetInfo[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteGraphicsSetInfo[1].pImageInfo = &imageInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeGraphicsSetInfo.size()), writeGraphicsSetInfo.data(), 0, nullptr);\n}\nvoid Renderer::WriteToAndUpdateRemainingDescriptorSets()\n{\n\t//--------------------------------------------------------------------\n\t//---- Descriptor Sets that can be attached to multiple pipelines ----\n\t//--------------------------------------------------------------------\n\n\t// Camera Descriptor\n\tVkDescriptorBufferInfo cameraBufferInfo = {};\n\tcameraBufferInfo.buffer = camera->GetBuffer();\n\tcameraBufferInfo.offset = 0;\n\tcameraBufferInfo.range = sizeof(CameraUBO);\n\n\tstd::array<VkWriteDescriptorSet, 1> writeCameraSetInfo = {};\n\twriteCameraSetInfo[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteCameraSetInfo[0].dstSet = cameraSet;\n\twriteCameraSetInfo[0].dstBinding = 0;\n\twriteCameraSetInfo[0].descriptorCount = 1;\t\t\t\t\t\t\t\t\t// How many \n\twriteCameraSetInfo[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n\twriteCameraSetInfo[0].pBufferInfo = &cameraBufferInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeCameraSetInfo.size()), writeCameraSetInfo.data(), 0, nullptr);\n\n\tVkDescriptorBufferInfo cameraOldBufferInfo = {};\n\tcameraOldBufferInfo.buffer = cameraOld->GetBuffer();\n\tcameraOldBufferInfo.offset = 0;\n\tcameraOldBufferInfo.range = sizeof(CameraUBO);\n\n\tstd::array<VkWriteDescriptorSet, 1> writeCameraOldSetInfo = {};\n\twriteCameraOldSetInfo[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteCameraOldSetInfo[0].dstSet = cameraOldSet;\n\twriteCameraOldSetInfo[0].dstBinding = 0;\n\twriteCameraOldSetInfo[0].descriptorCount = 1;\t\t\t\t\t\t\t\t\t// How many \n\twriteCameraOldSetInfo[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n\twriteCameraOldSetInfo[0].pBufferInfo = &cameraOldBufferInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeCameraOldSetInfo.size()), writeCameraOldSetInfo.data(), 0, nullptr);\n\n\t// Time Descriptor\n\tVkDescriptorBufferInfo timeBufferInfo = {};\n\ttimeBufferInfo.buffer = scene->GetTimeBuffer();\n\ttimeBufferInfo.offset = 0;\n\ttimeBufferInfo.range = sizeof(Time);\n\n\tstd::array<VkWriteDescriptorSet, 1> writeTimeSetInfo = {};\n\twriteTimeSetInfo[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteTimeSetInfo[0].pNext = NULL;\n\twriteTimeSetInfo[0].dstSet = timeSet;\n\twriteTimeSetInfo[0].dstBinding = 0;\n\twriteTimeSetInfo[0].descriptorCount = 1;\n\twriteTimeSetInfo[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n\twriteTimeSetInfo[0].pBufferInfo = &timeBufferInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeTimeSetInfo.size()), writeTimeSetInfo.data(), 0, nullptr);\n\n\t// SunAndSky Descriptor\n\tVkDescriptorBufferInfo sunAndSkyBufferInfo = {};\n\tsunAndSkyBufferInfo.buffer = sky->GetSunAndSkyBuffer();\n\tsunAndSkyBufferInfo.offset = 0;\n\tsunAndSkyBufferInfo.range = sizeof(SunAndSky);\n\n\tstd::array<VkWriteDescriptorSet, 1> writeSunAndSkySetInfo = {};\n\twriteSunAndSkySetInfo[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteSunAndSkySetInfo[0].pNext = NULL;\n\twriteSunAndSkySetInfo[0].dstSet = sunAndSkySet;\n\twriteSunAndSkySetInfo[0].dstBinding = 0;\n\twriteSunAndSkySetInfo[0].descriptorCount = 1;\n\twriteSunAndSkySetInfo[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n\twriteSunAndSkySetInfo[0].pBufferInfo = &sunAndSkyBufferInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeSunAndSkySetInfo.size()), writeSunAndSkySetInfo.data(), 0, nullptr);\n\n\t// KeyPressQuery Descriptor\n\tVkDescriptorBufferInfo keyPressQueryBufferInfo = {};\n\tkeyPressQueryBufferInfo.buffer = scene->GetKeyPressQueryBuffer();\n\tkeyPressQueryBufferInfo.offset = 0;\n\tkeyPressQueryBufferInfo.range = sizeof(KeyPressQuery);\n\n\tstd::array<VkWriteDescriptorSet, 1> writeKeyPressQuerySetInfo = {};\n\twriteKeyPressQuerySetInfo[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteKeyPressQuerySetInfo[0].pNext = NULL;\n\twriteKeyPressQuerySetInfo[0].dstSet = keyPressQuerySet;\n\twriteKeyPressQuerySetInfo[0].dstBinding = 0;\n\twriteKeyPressQuerySetInfo[0].descriptorCount = 1;\n\twriteKeyPressQuerySetInfo[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n\twriteKeyPressQuerySetInfo[0].pBufferInfo = &keyPressQueryBufferInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeKeyPressQuerySetInfo.size()), writeKeyPressQuerySetInfo.data(), 0, nullptr);\n}\n\nvoid Renderer::WriteToAndUpdateGodRaysSet()\n{\n\tVkDescriptorImageInfo godRaysDataTextureInfo = {};\n\tgodRaysDataTextureInfo.imageLayout = godRaysCreationDataTexture->GetTextureLayout();\n\tgodRaysDataTextureInfo.imageView = godRaysCreationDataTexture->GetTextureImageView();\n\tgodRaysDataTextureInfo.sampler = godRaysCreationDataTexture->GetTextureSampler();\n\n\tstd::array<VkWriteDescriptorSet, 1> writeGodRaysPassInfo = {};\n\twriteGodRaysPassInfo[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteGodRaysPassInfo[0].pNext = NULL;\n\twriteGodRaysPassInfo[0].dstSet = godRaysSet;\n\twriteGodRaysPassInfo[0].dstBinding = 0;\n\twriteGodRaysPassInfo[0].descriptorCount = 1;\n\twriteGodRaysPassInfo[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteGodRaysPassInfo[0].pImageInfo = &godRaysDataTextureInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeGodRaysPassInfo.size()), writeGodRaysPassInfo.data(), 0, nullptr);\n}\nvoid Renderer::WriteToAndUpdateToneMapSet()\n{\n\tVkDescriptorImageInfo toneMapPassImage1Info = {};\n\ttoneMapPassImage1Info.imageLayout = currentCloudsResultTexture->GetTextureLayout();\n\ttoneMapPassImage1Info.imageView = currentCloudsResultTexture->GetTextureImageView();\n\ttoneMapPassImage1Info.sampler = currentCloudsResultTexture->GetTextureSampler();\n\n\tVkDescriptorImageInfo currentFrameImageInfo = {};\n\tcurrentFrameImageInfo.imageLayout = currentFrameTexture->GetTextureLayout();\n\tcurrentFrameImageInfo.imageView = currentFrameTexture->GetTextureImageView();\n\tcurrentFrameImageInfo.sampler = currentFrameTexture->GetTextureSampler();\n\n\tVkDescriptorImageInfo toneMapPassImage2Info = {};\n\ttoneMapPassImage2Info.imageLayout = previousCloudsResultTexture->GetTextureLayout(); \n\ttoneMapPassImage2Info.imageView = previousCloudsResultTexture->GetTextureImageView();\n\ttoneMapPassImage2Info.sampler = previousCloudsResultTexture->GetTextureSampler();\n\n\tVkDescriptorImageInfo previousFrameImageInfo = {};\n\tpreviousFrameImageInfo.imageLayout = previousFrameTexture->GetTextureLayout();\n\tpreviousFrameImageInfo.imageView = previousFrameTexture->GetTextureImageView();\n\tpreviousFrameImageInfo.sampler = previousFrameTexture->GetTextureSampler();\n\n\tstd::array<VkWriteDescriptorSet, 2> writeToneMapPass1Info = {};\n\n\twriteToneMapPass1Info[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteToneMapPass1Info[0].pNext = NULL;\n\twriteToneMapPass1Info[0].dstSet = toneMapSet1;\n\twriteToneMapPass1Info[0].dstBinding = 0;\n\twriteToneMapPass1Info[0].descriptorCount = 1;\n\twriteToneMapPass1Info[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteToneMapPass1Info[0].pImageInfo = &toneMapPassImage1Info;\n\n\twriteToneMapPass1Info[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteToneMapPass1Info[1].pNext = NULL;\n\twriteToneMapPass1Info[1].dstSet = toneMapSet1;\n\twriteToneMapPass1Info[1].dstBinding = 1;\n\twriteToneMapPass1Info[1].descriptorCount = 1;\n\twriteToneMapPass1Info[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twriteToneMapPass1Info[1].pImageInfo = &currentFrameImageInfo;\n\n\tstd::array<VkWriteDescriptorSet, 2> writeToneMapPass2Info = {};\n\n\twriteToneMapPass2Info[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteToneMapPass2Info[0].pNext = NULL;\n\twriteToneMapPass2Info[0].dstSet = toneMapSet2;\n\twriteToneMapPass2Info[0].dstBinding = 0;\n\twriteToneMapPass2Info[0].descriptorCount = 1;\n\twriteToneMapPass2Info[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteToneMapPass2Info[0].pImageInfo = &toneMapPassImage2Info;\n\n\twriteToneMapPass2Info[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteToneMapPass2Info[1].pNext = NULL;\n\twriteToneMapPass2Info[1].dstSet = toneMapSet2;\n\twriteToneMapPass2Info[1].dstBinding = 1;\n\twriteToneMapPass2Info[1].descriptorCount = 1;\n\twriteToneMapPass2Info[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twriteToneMapPass2Info[1].pImageInfo = &previousFrameImageInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeToneMapPass1Info.size()), writeToneMapPass1Info.data(), 0, nullptr);\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeToneMapPass2Info.size()), writeToneMapPass2Info.data(), 0, nullptr);\n}\nvoid Renderer::WriteToAndUpdateTXAASet()\n{\n\tVkDescriptorImageInfo currentFrameImageInfo = {};\n\tcurrentFrameImageInfo.imageLayout = currentFrameTexture->GetTextureLayout();\n\tcurrentFrameImageInfo.imageView = currentFrameTexture->GetTextureImageView();\n\tcurrentFrameImageInfo.sampler = currentFrameTexture->GetTextureSampler();\n\n\tVkDescriptorImageInfo previousFrameImageInfo = {};\n\tpreviousFrameImageInfo.imageLayout = previousFrameTexture->GetTextureLayout();\n\tpreviousFrameImageInfo.imageView = previousFrameTexture->GetTextureImageView();\n\tpreviousFrameImageInfo.sampler = previousFrameTexture->GetTextureSampler();\n\n\tstd::array<VkWriteDescriptorSet, 2> writeTXAAPass1Info = {};\n\n\twriteTXAAPass1Info[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteTXAAPass1Info[0].pNext = NULL;\n\twriteTXAAPass1Info[0].dstSet = TXAASet1;\n\twriteTXAAPass1Info[0].dstBinding = 0;\n\twriteTXAAPass1Info[0].descriptorCount = 1;\n\twriteTXAAPass1Info[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteTXAAPass1Info[0].pImageInfo = &previousFrameImageInfo;\n\n\twriteTXAAPass1Info[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteTXAAPass1Info[1].pNext = NULL;\n\twriteTXAAPass1Info[1].dstSet = TXAASet1;\n\twriteTXAAPass1Info[1].dstBinding = 1;\n\twriteTXAAPass1Info[1].descriptorCount = 1;\n\twriteTXAAPass1Info[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twriteTXAAPass1Info[1].pImageInfo = &currentFrameImageInfo;\n\n\tstd::array<VkWriteDescriptorSet, 2> writeTXAAPass2Info = {};\n\n\twriteTXAAPass2Info[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteTXAAPass2Info[0].pNext = NULL;\n\twriteTXAAPass2Info[0].dstSet = TXAASet2;\n\twriteTXAAPass2Info[0].dstBinding = 0;\n\twriteTXAAPass2Info[0].descriptorCount = 1;\n\twriteTXAAPass2Info[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n\twriteTXAAPass2Info[0].pImageInfo = &currentFrameImageInfo;\n\n\twriteTXAAPass2Info[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n\twriteTXAAPass2Info[1].pNext = NULL;\n\twriteTXAAPass2Info[1].dstSet = TXAASet2;\n\twriteTXAAPass2Info[1].dstBinding = 1;\n\twriteTXAAPass2Info[1].descriptorCount = 1;\n\twriteTXAAPass2Info[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;\n\twriteTXAAPass2Info[1].pImageInfo = &previousFrameImageInfo;\n\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeTXAAPass1Info.size()), writeTXAAPass1Info.data(), 0, nullptr);\n\tvkUpdateDescriptorSets(logicalDevice, static_cast<uint32_t>(writeTXAAPass2Info.size()), writeTXAAPass2Info.data(), 0, nullptr);\n}\n\n//--------------------------------------------------------\n//------------- Resources Creations and Recreation -------\n//--------------------------------------------------------\nvoid Renderer::CreateResources()\n{\n\t//To store the results of the compute shader that will be passed on to the frag shader\n\tcurrentCloudsResultTexture = new Texture2D(device, window_width, window_height, VK_FORMAT_R16G16B16A16_SFLOAT);\n\tcurrentCloudsResultTexture->createEmptyTexture(logicalDevice, physicalDevice, computeCommandPool);\n\n\t//Stores the results of the previous Frame\n\tpreviousCloudsResultTexture = new Texture2D(device, window_width, window_height, VK_FORMAT_R16G16B16A16_SFLOAT);\n\tpreviousCloudsResultTexture->createEmptyTexture(logicalDevice, physicalDevice, computeCommandPool);\n\n\t//To store the results of the compute shader that will be passed on to the frag shader\n\tgodRaysCreationDataTexture = new Texture2D(device, window_width, window_height, VK_FORMAT_R16G16B16A16_SFLOAT);\n\tgodRaysCreationDataTexture->createEmptyTexture(logicalDevice, physicalDevice, computeCommandPool);\n\n\tcurrentFrameTexture = new Texture2D(device, window_width, window_height, VK_FORMAT_R8G8B8A8_SNORM);\n\tcurrentFrameTexture->createEmptyTexture(logicalDevice, physicalDevice, computeCommandPool);\n\n\tpreviousFrameTexture = new Texture2D(device, window_width, window_height, VK_FORMAT_R8G8B8A8_SNORM);\n\tpreviousFrameTexture->createEmptyTexture(logicalDevice, physicalDevice, computeCommandPool);\n}\n\n//--------------------------------------------------------\n//------ Create And Save 3D Textures as ppm Images -------\n//--------------------------------------------------------\nvoid  Renderer::Save3DTextureAsImage() \n{\n\tconst char* output_file_path = \"../../src/CloudScapes/textures/Saved3DTexture.tga\";\n\tconst std::string input_folder_path = \"../../src/CloudScapes/textures/CloudTextures/LowFrequency/\";\n\tconst std::string input_textureBaseName = \"LowFrequency\";\n\tconst std::string input_fileExtension = \".tga\";\n\tImageLoadingUtility::save3DTextureAsImage(output_file_path, input_folder_path, input_textureBaseName, input_fileExtension, 128, 128, 128, 4);\n}"
  },
  {
    "path": "src/CloudScapes/Renderer.h",
    "content": "#pragma once\n\n#define GLM_FORCE_RADIANS\n#define GLM_FORCE_DEPTH_ZERO_TO_ONE\n\n#include <glm/glm.hpp>\n#include <glm/gtc/matrix_transform.hpp>\n#include <stdexcept>\n#include <iostream>\n\n#include \"VulkanDevice.h\"\n#include \"VulkanInitializers.h\"\n#include \"SwapChain.h\"\n#include \"ShaderModule.h\"\n#include \"BufferUtils.h\"\n#include \"Vertex.h\"\n#include \"Image.h\"\n#include \"Camera.h\"\n#include \"Scene.h\"\n#include \"Model.h\"\n#include \"Texture2D.h\"\n#include \"Texture3D.h\"\n#include \"Sky.h\"\n#include \"FormatUtils.h\"\n\nstatic constexpr unsigned int WORKGROUP_SIZE = 32;\n\nclass Renderer \n{\npublic:\n\tRenderer() = delete; // To enforce the creation of a the type of renderer we want without leaving the vulkan device, vulkan swapchain, etc as assumptions or nullptrs\n\tRenderer(VulkanDevice* device, VkPhysicalDevice physicalDevice, VulkanSwapChain* swapChain, Scene* scene, Sky* sky, Camera* camera, Camera* cameraOld, uint32_t width, uint32_t height);\n\t~Renderer();\n\n\tvoid DestroyOnWindowResize();\n\n\tvoid InitializeRenderer();\n\tvoid RecreateOnResize(uint32_t width, uint32_t height);\n\n\tvoid Frame();\n\n\tvoid CreateRenderPass();\n\n\t// Descriptors\n\tvoid CreateDescriptorPool();\n\tvoid CreateAllDescriptorSetLayouts();\n\tvoid CreateAllDescriptorSets();\n\t\n\tvoid WriteToAndUpdateAllDescriptorSets();\n\tvoid WriteToAndUpdateComputeDescriptorSets();\n\tvoid WriteToAndUpdateGraphicsDescriptorSets();\n\tvoid WriteToAndUpdatePingPongDescriptorSets();\n\tvoid WriteToAndUpdateRemainingDescriptorSets();\n\tvoid WriteToAndUpdateGodRaysSet();\n\tvoid WriteToAndUpdateToneMapSet();\n\tvoid WriteToAndUpdateTXAASet();\n\n\t// Pipelines\n\tvoid CreateAllPipeLines(VkRenderPass renderPass, unsigned int subpass);\n\tvoid CreateGraphicsPipeline(VkRenderPass renderPass, unsigned int subpass);\n\tvoid CreateComputePipeline(VkPipelineLayout& _computePipelineLayout, VkPipeline& _computePipeline, const std::string &filename);\n\tvoid CreatePostProcessPipeLines(VkRenderPass renderPass);\n\n\t// Frame Resources\n\tvoid CreateFrameResources();\n\tvoid DestroyFrameResources();\n\tvoid RecreateFrameResources();\n\tvoid CreateFrameBuffers(VkRenderPass renderPass);\n\n\t// Command Buffers\n\tvoid RecordAllCommandBuffers();\n\tvoid RecordComputeCommandBuffer(VkCommandBuffer &computeCmdBuffer, VkDescriptorSet& pingPongFrameSet);\n\tvoid RecordGraphicsCommandBuffer(std::vector<VkCommandBuffer> &graphicsCmdBuffer, VkImage &Image_for_barrier, \n\t\t\t\t\t\t\t\t\tVkDescriptorSet& pingPongFrameSet, VkDescriptorSet& toneMapSet, VkDescriptorSet& TXAASet);\n\n\t// Resource Creation and Recreation\n\tvoid CreateResources();\n\n\t//Create and save 3D textures\n\tvoid Save3DTextureAsImage();\n\nprivate:\n\tVulkanDevice* device; // manages both the logical device (VkDevice) and the physical Device (VkPhysicalDevice)\n\n\tVkDevice logicalDevice;\n\tVkPhysicalDevice physicalDevice;\n\tVulkanSwapChain* swapChain;\n\tbool swapPingPongBuffers = false;\n\n\tCamera* camera;\n\tCamera* cameraOld;\n\tScene* scene;\n\tSky* sky;\n\n\tuint32_t window_width;\n\tuint32_t window_height;\n\n\t// We create a vector of command buffers because we want a command buffer for each frame of the swap chain\n\tstd::vector<VkCommandBuffer> graphicsCommandBuffer1;\n\tVkCommandBuffer computeCommandBuffer1;\n\tstd::vector<VkCommandBuffer> graphicsCommandBuffer2;\n\tVkCommandBuffer computeCommandBuffer2;\n\tVkCommandPool graphicsCommandPool;\n\tVkCommandPool computeCommandPool;\n\n\tVkPipelineLayout graphicsPipelineLayout;\n\tVkPipelineLayout cloudComputePipelineLayout;\n\tVkPipelineLayout reprojectionPipelineLayout;\n\tVkPipeline graphicsPipeline;\n\tVkPipeline cloudComputePipeline;\n\tVkPipeline reprojectionPipeline;\n\n\tVkPipelineCache postProcessPipeLineCache;\n\tVkPipelineLayout postProcess_GodRays_PipelineLayout;\n\tVkPipelineLayout postProcess_ToneMap_PipelineLayout;\n\tVkPipelineLayout postProcess_TXAA_PipelineLayout;\n\tVkPipeline postProcess_GodRays_PipeLine;\n\tVkPipeline postProcess_ToneMap_PipeLine;\n\tVkPipeline postProcess_TXAA_PipeLine;\n\n\tVkRenderPass renderPass;\n\n\tstd::vector<VkFramebuffer> frameBuffers;\n\t\n\tVkImage depthImage;\n\tVkDeviceMemory depthImageMemory;\n\tVkImageView depthImageView;\n\n\tTexture2D* currentFrameTexture;\n\tTexture2D* previousFrameTexture;\n\n\tTexture2D* currentCloudsResultTexture;\n\tTexture2D* previousCloudsResultTexture;\n\tTexture2D* godRaysCreationDataTexture;\n\t\n\tVkDescriptorPool descriptorPool;\n\n\t//Descriptors used in multiple Pipelines\n\tVkDescriptorSetLayout cameraSetLayout;\n\tVkDescriptorSet cameraSet;\n\tVkDescriptorSet cameraOldSet;\n\tVkDescriptorSetLayout timeSetLayout;\n\tVkDescriptorSet timeSet;\n\tVkDescriptorSetLayout sunAndSkySetLayout;\n\tVkDescriptorSet sunAndSkySet;\n\tVkDescriptorSetLayout keyPressQuerySetLayout;\n\tVkDescriptorSet keyPressQuerySet;\n\n\t//Descriptor Set Layouts for each pipeline\n\tVkDescriptorSetLayout cloudComputeSetLayout;\t// Compute shader binding layout\n\tVkDescriptorSetLayout graphicsSetLayout;\n\n\t// Descriptor Sets for each pipeline\n\tVkDescriptorSet cloudComputeSet;\t// Compute shader descriptor Set\n\tVkDescriptorSet graphicsSet; // Graphics ( Regular Geometric Meshes ) specific descriptor sets\n\n\t// Descriptor Sets for pingPonged Cloud Results\n\tVkDescriptorSetLayout pingPongCloudResultSetLayout;\n\tVkDescriptorSet pingPongCloudResultSet1;\n\tVkDescriptorSet pingPongCloudResultSet2;\n\n\t//Descriptors used in Post Process pipelines\n\t//God Rays\n\tVkDescriptorSetLayout godRaysSetLayout;\n\tVkDescriptorSet godRaysSet;\n\n\t//Tone Map\n\tVkDescriptorSetLayout toneMapSetLayout;\n\tVkDescriptorSet toneMapSet1;\n\tVkDescriptorSet toneMapSet2;\n\n\t// Descriptor Sets for pingPonged TXAA\n\tVkDescriptorSetLayout TXAASetLayout;\n\tVkDescriptorSet TXAASet1;\n\tVkDescriptorSet TXAASet2;\n};"
  },
  {
    "path": "src/CloudScapes/Scene.cpp",
    "content": "#include \"Scene.h\"\n\n#define PI_BY_2 1.57f\n\nScene::Scene(VulkanDevice* device) : device(device) \n{\n\tBufferUtils::CreateBuffer(device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(Time), VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, timeBuffer, timeBufferMemory);\n\tvkMapMemory(device->GetVkDevice(), timeBufferMemory, 0, sizeof(Time), 0, &time_mappedData);\n\tmemcpy(time_mappedData, &time, sizeof(Time));\n\n\tInitializeTime();\n\n\tBufferUtils::CreateBuffer(device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(KeyPressQuery), VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, keyPressQueryBuffer, keyPressQueryBufferMemory);\n\tvkMapMemory(device->GetVkDevice(), keyPressQueryBufferMemory, 0, sizeof(KeyPressQuery), 0, &keyPressQuery_mappedData);\n\tmemcpy(keyPressQuery_mappedData, &keyPressQuery, sizeof(KeyPressQuery));\n}\n\nScene::~Scene()\n{\n\tvkUnmapMemory(device->GetVkDevice(), timeBufferMemory);\n\tvkDestroyBuffer(device->GetVkDevice(), timeBuffer, nullptr);\n\tvkFreeMemory(device->GetVkDevice(), timeBufferMemory, nullptr);\n\n\tvkUnmapMemory(device->GetVkDevice(), keyPressQueryBufferMemory);\n\tvkDestroyBuffer(device->GetVkDevice(), keyPressQueryBuffer, nullptr);\n\tvkFreeMemory(device->GetVkDevice(), keyPressQueryBufferMemory, nullptr);\n\n\tfor (int i = 0; i < models.size(); i++)\n\t{\n\t\tdelete models[i];\n\t}\n\n\tmodels.erase(models.begin(), models.end());\n}\n\nvoid Scene::CreateModelsInScene(VkCommandPool commandPool)\n{\n\t// TODO: Large Models cause a crash; Not entirely sure why.\n\t// Model and texture file paths\n\tconst std::string model_path = \"../../src/CloudScapes/models/thinCube.obj\";\n\tconst std::string texture_path = \"../../src/CloudScapes/textures/DarkPavement.png\";\n\n\t// Using .obj-based Model constructor ----------------------------------------------------\n\tModel* groundPlane = new Model(device, commandPool, model_path, texture_path);\n\t\n\tglm::mat4 modelMat = groundPlane->GetModelMatrix();\n\tmodelMat = glm::translate(modelMat, glm::vec3(0.0f, -0.5f, 0.0f)) * glm::scale(modelMat, glm::vec3(10.0f, 1.0f, 10.0f)) * modelMat;\n\tgroundPlane->SetModelBuffer(modelMat);\n\n\tAddModel(groundPlane);\n}\nconst std::vector<Model*>& Scene::GetModels() const\n{\n\treturn models;\n}\nvoid Scene::AddModel(Model* model)\n{\n\tmodels.push_back(model);\n}\n\nVkBuffer Scene::GetTimeBuffer() const\n{\n\treturn timeBuffer;\n}\nvoid Scene::UpdateTime()\n{\n\thigh_resolution_clock::time_point currentTime = high_resolution_clock::now();\n\tduration<float> nextDeltaTime = duration_cast<duration<float>>(currentTime - startTime);\n\tstartTime = currentTime;\n\n\ttime._time.x = nextDeltaTime.count();\n\ttime._time.y += time._time.x;\n\n\ttime.frameCount += 1;\n\ttime.frameCount = time.frameCount % 16;\n\n\t//count++;\n\t//if (count % 300 == 0)\n\t//{\n\t\t//time.frameCount += 1;\n\t\t//time.frameCount = time.frameCount % 16;\n\t//}\n\n\tmemcpy(time_mappedData, &time, sizeof(Time));\n}\nvoid Scene::InitializeTime()\n{\n\thigh_resolution_clock::time_point currentTime = high_resolution_clock::now();\n\tduration<float> nextDeltaTime = duration_cast<duration<float>>(currentTime - startTime);\n\tstartTime = currentTime;\n\n\ttime._time.x = nextDeltaTime.count();\n\ttime._time.y += time._time.x;\n\n\t//generate 8 numbers from the halton sequence for TXAA\n\ttime.haltonSeq1.x = HaltonSequenceAt(1, 3);\n\ttime.haltonSeq1.y = HaltonSequenceAt(2, 3);\n\ttime.haltonSeq1.z = HaltonSequenceAt(3, 3);\n\ttime.haltonSeq1.w = HaltonSequenceAt(4, 3);\n\n\ttime.haltonSeq2.x = HaltonSequenceAt(5, 3);\n\ttime.haltonSeq2.y = HaltonSequenceAt(6, 3);\n\ttime.haltonSeq2.z = HaltonSequenceAt(7, 3);\n\ttime.haltonSeq2.w = HaltonSequenceAt(8, 3);\n\n\ttime.haltonSeq3.x = HaltonSequenceAt(9, 3);\n\ttime.haltonSeq3.y = HaltonSequenceAt(10, 3);\n\ttime.haltonSeq3.z = HaltonSequenceAt(11, 3);\n\ttime.haltonSeq3.w = HaltonSequenceAt(12, 3);\n\n\ttime.haltonSeq4.x = HaltonSequenceAt(13, 3);\n\ttime.haltonSeq4.y = HaltonSequenceAt(14, 3);\n\ttime.haltonSeq4.z = HaltonSequenceAt(15, 3);\n\ttime.haltonSeq4.w = HaltonSequenceAt(16, 3);\n\n\ttime.frameCount = 0;\n\n\tmemcpy(time_mappedData, &time, sizeof(Time));\n}\nglm::vec2 Scene::GetTime() const\n{\n\treturn time._time;\n}\n//Reference: https://en.wikipedia.org/wiki/Halton_sequence\nfloat Scene::HaltonSequenceAt(int index, int base)\n{\n\tfloat f = 1.0f;\n\tfloat r = 0.0f;\n\n\twhile (index > 0)\n\t{\n\t\tf = f / float(base);\n\t\tr += f*(index%base);\n\t\tindex = int(std::floor(index / base));\n\t}\n\n\treturn r;\n}\n\nVkBuffer Scene::GetKeyPressQueryBuffer() const\n{\n\treturn keyPressQueryBuffer;\n}\nvoid Scene::UpdateKeyPressQuery()\n{\n\tmemcpy(keyPressQuery_mappedData, &keyPressQuery, sizeof(KeyPressQuery));\n}"
  },
  {
    "path": "src/CloudScapes/Scene.h",
    "content": "#pragma once\n\n#include <glm/glm.hpp>\n#include <chrono>\n\n#include \"VulkanDevice.h\"\n#include \"BufferUtils.h\"\n#include \"Model.h\"\n\nusing namespace std::chrono;\n\nstruct Time \n{\n\t//16 values stored in halton seq because 2D case\n\tglm::vec4 haltonSeq1;\n\tglm::vec4 haltonSeq2;\n\tglm::vec4 haltonSeq3;\n\tglm::vec4 haltonSeq4;\n\tglm::vec2 _time = glm::vec2(0.0f, 0.0f); //stores delta time and total time packed as a vec2 so vulkan offsetting doesnt become an issue later\n\tint frameCount = 1;\n};\n\nstruct KeyPressQuery\n{\n\tint key_debug = 0;\n};\n\nclass Scene \n{\nprivate:\n\tVulkanDevice* device;\n\n\tTime time;\n\tVkBuffer timeBuffer;\n\tVkDeviceMemory timeBufferMemory;\n\tvoid* time_mappedData;\n\n\tKeyPressQuery keyPressQuery;\n\tVkBuffer keyPressQueryBuffer;\n\tVkDeviceMemory keyPressQueryBufferMemory;\n\tvoid* keyPressQuery_mappedData;\n\n\tstd::vector<Model*> models;\n\n\thigh_resolution_clock::time_point startTime = high_resolution_clock::now();\n\npublic:\n\tScene() = delete;\n\tScene(VulkanDevice* device);\n\t~Scene();\n\n\tvoid CreateModelsInScene(VkCommandPool commandPool);\n\tconst std::vector<Model*>& GetModels() const;\n\tvoid AddModel(Model* model);\n\n\tVkBuffer GetTimeBuffer() const;\n\tvoid UpdateTime();\n\tvoid InitializeTime();\n\tglm::vec2 GetTime() const;\n\tfloat HaltonSequenceAt(int index, int base);\n\n\tint count = 0;\n\n\tVkBuffer GetKeyPressQueryBuffer() const;\n\tvoid UpdateKeyPressQuery();\n\t//KeyPressQuery GetKeyPressQuery() const;\n};"
  },
  {
    "path": "src/CloudScapes/ShaderModule.cpp",
    "content": "#include \"ShaderModule.h\"\n\nnamespace \n{\n\tstd::vector<char> readFile(const std::string& filename) \n\t{\n\t\tstd::ifstream file(filename, std::ios::ate | std::ios::binary);\n\n\t\tif (!file.is_open()) \n\t\t{\n\t\t\tthrow std::runtime_error(\"Failed to open file\");\n\t\t}\n\n\t\tsize_t fileSize = (size_t)file.tellg();\n\t\tstd::vector<char> buffer(fileSize);\n\n\t\tfile.seekg(0);\n\t\tfile.read(buffer.data(), fileSize);\n\n\t\tfile.close();\n\t\treturn buffer;\n\t}\n}\n\n// Wrap the shaders in shader modules\nVkShaderModule ShaderModule::createShaderModule(const std::vector<char>& code, VkDevice logicalDevice)\n{\n\tVkShaderModuleCreateInfo createInfo = {};\n\tcreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n\tcreateInfo.codeSize = code.size();\n\tcreateInfo.pCode = reinterpret_cast<const uint32_t*>(code.data());\n\n\tVkShaderModule shaderModule;\n\tif (vkCreateShaderModule(logicalDevice, &createInfo, nullptr, &shaderModule) != VK_SUCCESS) \n\t{\n\t\tthrow std::runtime_error(\"Failed to create shader module\");\n\t}\n\n\treturn shaderModule;\n}\n\nVkShaderModule ShaderModule::createShaderModule(const std::string& filename, VkDevice logicalDevice)\n{\n\treturn createShaderModule(readFile(filename), logicalDevice);\n}"
  },
  {
    "path": "src/CloudScapes/ShaderModule.h",
    "content": "#pragma once\n\n#include <vulkan/vulkan.h>\n#include <fstream>\n#include <string>\n#include <vector>\n\nnamespace ShaderModule {\n\tVkShaderModule createShaderModule(const std::vector<char>& code, VkDevice logicalDevice);\n\tVkShaderModule createShaderModule(const std::string& filename, VkDevice logicalDevice);\n}"
  },
  {
    "path": "src/CloudScapes/Sky.cpp",
    "content": "#include \"Sky.h\"\n\n#define PI_BY_2 1.57f\n\nSky::Sky(VulkanDevice* device, VkDevice logicalDevice) : device(device), logicalDevice(logicalDevice)\n{\n\tBufferUtils::CreateBuffer(device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(SunAndSky), VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sunAndSkyBuffer, sunAndSkyBufferMemory);\n\tvkMapMemory(device->GetVkDevice(), sunAndSkyBufferMemory, 0, sizeof(SunAndSky), 0, &sunAndSky_mappedData);\n\tmemcpy(sunAndSky_mappedData, &sunAndSky, sizeof(SunAndSky));\n}\n\nSky::~Sky()\n{\n\tdelete cloudBaseShapeTexture;\n\tdelete cloudDetailsTexture;\n\tdelete cloudMotionTexture;\n\tdelete weatherMapTexture;\n\n\tvkUnmapMemory(device->GetVkDevice(), sunAndSkyBufferMemory);\n\tvkDestroyBuffer(device->GetVkDevice(), sunAndSkyBuffer, nullptr);\n\tvkFreeMemory(device->GetVkDevice(), sunAndSkyBufferMemory, nullptr);\n}\n\n//Create the textures that will be passed to the compute shader to create clouds\nvoid Sky::CreateCloudResources(VkCommandPool computeCommandPool)\n{\n\t// Low Frequency Cloud 3D Texture\n\tconst std::string LowFreq_folder_path = \"../../src/CloudScapes/textures/CloudTextures/LowFrequency/\";\n\tconst std::string LowFreq_textureBaseName = \"LowFrequency\";\n\tconst std::string LowFreq_fileExtension = \".tga\";\n\tcloudBaseShapeTexture = new Texture3D(device, 128, 128, 128, VK_FORMAT_R8G8B8A8_UNORM);\n\tcloudBaseShapeTexture->create3DTextureFromMany2DTextures(logicalDevice, computeCommandPool,\n\t\tLowFreq_folder_path, LowFreq_textureBaseName, LowFreq_fileExtension,\n\t\t128, 4);\n\n\t// High Frequency Cloud 3D Texture //TODO Get actual High Frequncy Textures\n\tconst std::string HighFreq_folder_path = \"../../src/CloudScapes/textures/CloudTextures/HighFrequency/\";\n\tconst std::string HighFreq_textureBaseName = \"HighFrequency\";\n\tconst std::string HighFreq_fileExtension = \".tga\";\n\tcloudDetailsTexture = new Texture3D(device, 32, 32, 32, VK_FORMAT_R8G8B8A8_UNORM);\n\tcloudDetailsTexture->create3DTextureFromMany2DTextures(logicalDevice, computeCommandPool,\n\t\tHighFreq_folder_path, HighFreq_textureBaseName, HighFreq_fileExtension,\n\t\t32, 4);\n\n\t// Curl Noise 2D Texture\n\tconst std::string curlNoiseTexture_path = \"../../src/CloudScapes/textures/CloudTextures/curlNoise.png\";\n\tcloudMotionTexture = new Texture2D(device, 128, 128, VK_FORMAT_R8G8B8A8_UNORM); //Need to pad an extra channel because R8G8B8 is not supported\n\tcloudMotionTexture->createTextureFromFile(logicalDevice, computeCommandPool, curlNoiseTexture_path, 4,\n\t\tVK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,\n\t\tVK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_SAMPLER_ADDRESS_MODE_REPEAT, 16.0f);\n\n\t// Weather Map 2D Texture\n\tconst std::string weatherMapTexture_path = \"../../src/CloudScapes/textures/CloudTextures/weatherMap.png\";\n\tweatherMapTexture = new Texture2D(device, 512, 512, VK_FORMAT_R8G8B8A8_UNORM); //Need to pad an extra channel because R8G8B8 is not supported\n\tweatherMapTexture->createTextureFromFile(logicalDevice, computeCommandPool, weatherMapTexture_path, 4,\n\t\tVK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,\n\t\tVK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_SAMPLER_ADDRESS_MODE_REPEAT, 16.0f);\n}\n\nVkBuffer Sky::GetSunAndSkyBuffer() const\n{\n\treturn sunAndSkyBuffer;\n}\nvoid Sky::UpdateSunAndSky()\n{\n\t//float angle = time.frameCount*0.000001f;\n\t//rotMat = glm::rotate(rotMat, angle, rotationAxis);\n\n\tsunAndSky.sunLocation = rotMat * glm::vec4(0.0f, 1.0f, 0.0f, 0.0f);\n\tsunAndSky.sunDirection = glm::vec4(1.0f, 1.0f, 1.0f, 0.0f);\n\tsunAndSky.lightColor = glm::vec4(1.0f, 1.0f, 0.57f, 1.0f);\n\tsunAndSky.sunIntensity = 5.0;\n\tmemcpy(sunAndSky_mappedData, &sunAndSky, sizeof(SunAndSky));\n}"
  },
  {
    "path": "src/CloudScapes/Sky.h",
    "content": "#pragma once\n\n#include <glm/glm.hpp>\n#include \"VulkanDevice.h\"\n#include \"BufferUtils.h\"\n#include \"Texture2D.h\"\n#include \"Texture3D.h\"\n\nstruct SunAndSky\n{\n\tglm::vec4 sunLocation = glm::vec4(0.0, 1.0, -10.0, 0.0f);\n\tglm::vec4 sunDirection = glm::vec4(1.0f, 1.0f, 1.0f, 0.0f);\n\tglm::vec4 lightColor = glm::vec4(1.0f, 1.0f, 1.0f, 1.0f);\n\tfloat sunIntensity = 1.0;\n};\n\nclass Sky\n{\nprivate:\n\tVulkanDevice* device;\n\tVkDevice logicalDevice;\n\n\tSunAndSky sunAndSky;\n\tVkBuffer sunAndSkyBuffer;\n\tVkDeviceMemory sunAndSkyBufferMemory;\n\tvoid* sunAndSky_mappedData;\n\n\tglm::vec3 rotationAxis = glm::vec3(1, 0, 0);\n\tglm::mat4 rotMat = glm::mat4(1.0f);\n\npublic:\n\tSky() = delete;\n\tSky(VulkanDevice* device, VkDevice logicalDevice);\n\t~Sky();\n\n\tTexture2D* weatherMapTexture;\n\tTexture3D* cloudBaseShapeTexture;\n\tTexture3D* cloudDetailsTexture;\n\tTexture2D* cloudMotionTexture;\n\t/*\n\t3D cloudBaseShapeTexture\n\t4 channels\n\t128^3 resolution\n\tThe first channel is the Perlin-Worley noise.\n\tThe other 3 channels are Worley noise at increasing frequencies.\n\tThis 3d texture is used to define the base shape for our clouds.\n\n\t3D cloudDetailsTexture\n\t3 channels\n\t32^3 resolution\n\tUses Worley noise at increasing frequencies.\n\tThis texture is used to add detail to the base cloud shape defined by the first 3d noise.\n\n\t2D cloudMotionTexture\n\t3 channels\n\t128^2 resolution\n\tUses curl noise. Which is non divergent and is used to fake fluid motion.\n\tWe use this noise to distort our cloud shapes and add a sense of turbulence.\n\t*/\n\t\n\tvoid CreateCloudResources(VkCommandPool computeCommandPool);\n\n\tVkBuffer GetSunAndSkyBuffer() const;\n\tvoid UpdateSunAndSky();\n};"
  },
  {
    "path": "src/CloudScapes/SwapChain.cpp",
    "content": "#include \"Swapchain.h\"\n\nnamespace\n{\n\t// Specify the color channel format and color space type\n\tVkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats) \n\t{\n\t\t// VK_FORMAT_UNDEFINED indicates that the surface has no preferred format, so we can choose any\n\t\tif (availableFormats.size() == 1 && availableFormats[0].format == VK_FORMAT_UNDEFINED) \n\t\t{\n\t\t\treturn{ VK_FORMAT_B8G8R8A8_UNORM, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR };\n\t\t}\n\n\t\t// Otherwise, choose a preferred combination\n\t\tfor (const auto& availableFormat : availableFormats) \n\t\t{\n\t\t\t// Ideal format and color space\n\t\t\tif (availableFormat.format == VK_FORMAT_B8G8R8A8_UNORM && \n\t\t\t\tavailableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) \n\t\t\t{\n\t\t\t\treturn availableFormat;\n\t\t\t}\n\t\t}\n\n\t\t// Otherwise, return any format\n\t\treturn availableFormats[0];\n\t}\n\n\t// Specify the presentation mode of the swap chain\n\tVkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR> availablePresentModes) \n\t{\n\t\t// Second choice\n\t\tVkPresentModeKHR bestMode = VK_PRESENT_MODE_FIFO_KHR;\n      \n\t\tfor (const auto& availablePresentMode : availablePresentModes) \n\t\t{\n\t\t\tif (availablePresentMode == VK_PRESENT_MODE_MAILBOX_KHR) \n\t\t\t{\n\t\t\t\t// First choice\n\t\t\t\treturn availablePresentMode;\n\t\t\t}\n\t\t\telse if (availablePresentMode == VK_PRESENT_MODE_IMMEDIATE_KHR) \n\t\t\t{\n\t\t\t\t// Third choice\n\t\t\t\tbestMode = availablePresentMode;\n\t\t\t}\n\t\t}\n\n\t\treturn bestMode;\n\t}\n\n\t// Specify the swap extent (resolution) of the swap chain\n\tVkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, GLFWwindow* window) \n\t{\n\t\tif (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) \n\t\t{\n\t\t\treturn capabilities.currentExtent;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tint width, height;\n\t\t\tglfwGetWindowSize(window, &width, &height);\n\t\t\tVkExtent2D actualExtent = { static_cast<uint32_t>(width), static_cast<uint32_t>(height) };\n\n\t\t\tactualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));\n\t\t\tactualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));\n\n\t\t\treturn actualExtent;\n\t\t}\n\t}\n}\n\nVulkanSwapChain::VulkanSwapChain(VulkanDevice* device, VkSurfaceKHR vkSurface, uint32_t  width, uint32_t height)\n  : device(device), vkSurface(vkSurface) \n{\n\tCreate(width, height);\n\n    VkSemaphoreCreateInfo semaphoreInfo = {};\n    semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;\n\n    if (vkCreateSemaphore(device->GetVkDevice(), &semaphoreInfo, nullptr, &imageAvailableSemaphore) != VK_SUCCESS ||\n        vkCreateSemaphore(device->GetVkDevice(), &semaphoreInfo, nullptr, &renderFinishedSemaphore) != VK_SUCCESS) \n\t{\n        throw std::runtime_error(\"Failed to create semaphores\");\n    }\n}\n\nVulkanSwapChain::~VulkanSwapChain()\n{\n\tvkDestroySemaphore(device->GetVkDevice(), imageAvailableSemaphore, nullptr);\n\tvkDestroySemaphore(device->GetVkDevice(), renderFinishedSemaphore, nullptr);\n\n\tfor (size_t i = 0; i < vkSwapChainImageViews.size(); i++) {\n\t\tvkDestroyImageView(device->GetVkDevice(), vkSwapChainImageViews[i], nullptr);\n\t}\n\n\tvkDestroySwapchainKHR(device->GetVkDevice(), vkSwapChain, nullptr);\n}\n\nvoid VulkanSwapChain::Create(uint32_t  width, uint32_t height)\n{\n\tauto* instance = device->GetInstance();\n\n\tconst auto& surfaceCapabilities = instance->GetSurfaceCapabilities();\n\n\tVkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(instance->GetSurfaceFormats());\n\tVkPresentModeKHR presentMode = chooseSwapPresentMode(instance->GetPresentModes());\n\tVkExtent2D extent = { static_cast<uint32_t>(width), static_cast<uint32_t>(height) };//chooseSwapExtent(surfaceCapabilities, GetGLFWWindow());\n\n\t// Can do multiple buffering here!\n\t// Triple Bufferring --> Displaying, Ready to be displayed next, Being worked on\n\tuint32_t imageCount = surfaceCapabilities.minImageCount; //2 = only double buffering right now // 2 + 1 = triple buffering\n\tif (surfaceCapabilities.maxImageCount > 0 && imageCount > surfaceCapabilities.maxImageCount)\n\t{\n\t\timageCount = surfaceCapabilities.maxImageCount;\n\t}\n\n\t// --- Create swap chain ---\n\tVkSwapchainCreateInfoKHR createInfo = {};\n\tcreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;\n\n\t// Specify surface to be tied to\n\tcreateInfo.surface = vkSurface;\n\n\t// Add details of the swap chain\n\tcreateInfo.minImageCount = imageCount;\n\tcreateInfo.imageFormat = surfaceFormat.format;\n\tcreateInfo.imageColorSpace = surfaceFormat.colorSpace;\n\tcreateInfo.imageExtent = extent;\n\tcreateInfo.imageArrayLayers = 1;\n\tcreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n\n\tconst auto& queueFamilyIndices = instance->GetQueueFamilyIndices();\n\tif (queueFamilyIndices[QueueFlags::Graphics] != queueFamilyIndices[QueueFlags::Present])\n\t{\n\t\t// Images can be used across multiple queue families without explicit ownership transfers\n\t\tcreateInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT;\n\t\tcreateInfo.queueFamilyIndexCount = 2;\n\t\tunsigned int indices[] = { queueFamilyIndices[QueueFlags::Graphics], queueFamilyIndices[QueueFlags::Present] };\n\t\tcreateInfo.pQueueFamilyIndices = indices;\n\t}\n\telse\n\t{\n\t\t// An image is owned by one queue family at a time and ownership must be explicitly transfered between uses\n\t\tcreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\t\tcreateInfo.queueFamilyIndexCount = 0;\n\t\tcreateInfo.pQueueFamilyIndices = nullptr;\n\t}\n\n\t// Specify transform on images in the swap chain (no transformation done here)\n\tcreateInfo.preTransform = surfaceCapabilities.currentTransform;\n\n\t// Specify alpha channel usage (set to be ignored here)\n\tcreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;\n\n\t// Specify presentation mode\n\tcreateInfo.presentMode = presentMode;\n\n\t// Specify whether we can clip pixels that are obscured by other windows\n\tcreateInfo.clipped = VK_TRUE;\n\n\t// Reference to old swap chain in case current one becomes invalid\n\tcreateInfo.oldSwapchain = VK_NULL_HANDLE;\n\n\t// Create swap chain\n\tif (vkCreateSwapchainKHR(device->GetVkDevice(), &createInfo, nullptr, &vkSwapChain) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"Failed to create swap chain\");\n\t}\n\n\t// --- Retrieve swap chain images ---\n\tvkGetSwapchainImagesKHR(device->GetVkDevice(), vkSwapChain, &imageCount, nullptr);\n\tvkSwapChainImages.resize(imageCount);\n\tvkGetSwapchainImagesKHR(device->GetVkDevice(), vkSwapChain, &imageCount, vkSwapChainImages.data());\n\n\tvkSwapChainImageFormat = surfaceFormat.format;\n\tvkSwapChainExtent = extent;\n\n\tvkSwapChainImageViews.resize(vkSwapChainImages.size());\n\n\tfor (size_t i = 0; i < vkSwapChainImages.size(); i++)\n\t{\n\t\t// --- Create an image view for each swap chain image ---\n\t\tVkImageViewCreateInfo createInfo = {};\n\t\tcreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n\t\tcreateInfo.image = vkSwapChainImages[i];\n\n\t\t// Specify how the image data should be interpreted\n\t\tcreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;\n\t\tcreateInfo.format = vkSwapChainImageFormat;\n\n\t\t// Specify color channel mappings (can be used for swizzling)\n\t\tcreateInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\tcreateInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\tcreateInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;\n\t\tcreateInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;\n\n\t\t// Describe the image's purpose and which part of the image should be accessed\n\t\tcreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\t\tcreateInfo.subresourceRange.baseMipLevel = 0;\n\t\tcreateInfo.subresourceRange.levelCount = 1;\n\t\tcreateInfo.subresourceRange.baseArrayLayer = 0;\n\t\tcreateInfo.subresourceRange.layerCount = 1;\n\n\t\t// Create the image view\n\t\tif (vkCreateImageView(device->GetVkDevice(), &createInfo, nullptr, &vkSwapChainImageViews[i]) != VK_SUCCESS)\n\t\t{\n\t\t\tthrow std::runtime_error(\"Failed to create image views\");\n\t\t}\n\t}\n}\n\nvoid VulkanSwapChain::Recreate(uint32_t  width, uint32_t height)\n{\n\tvkDestroySwapchainKHR(device->GetVkDevice(), vkSwapChain, nullptr);\n\tCreate(width, height);\n}\n\nvoid VulkanSwapChain::Acquire() \n{\n    if (ENABLE_VALIDATION) \n\t{\n        // the validation layer implementation expects the application to explicitly synchronize with the GPU\n        vkQueueWaitIdle(device->GetQueue(QueueFlags::Present));\n    }\n    VkResult result = vkAcquireNextImageKHR(device->GetVkDevice(), vkSwapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphore, VK_NULL_HANDLE, &imageIndex);   \n    \n\t// must recreate swapchain -or- swap chain isn't working //CHECK IF BUGS\n\tif (result == VK_ERROR_OUT_OF_DATE_KHR) {\n\t\tRecreate(vkSwapChainExtent.width, vkSwapChainExtent.height);\n\t\treturn;\n\t}\n\telse if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR) \n\t{\n        throw std::runtime_error(\"Failed to acquire swap chain image\");\n    }\n}\n\nvoid VulkanSwapChain::Present() \n{\n    VkSemaphore signalSemaphores[] = { renderFinishedSemaphore };\n\n    // Submit result back to swap chain for presentation\n    VkPresentInfoKHR presentInfo = {};\n    presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;\n    presentInfo.waitSemaphoreCount = 1;\n    presentInfo.pWaitSemaphores = signalSemaphores;\n\n    VkSwapchainKHR swapChains[] = { vkSwapChain };\n    presentInfo.swapchainCount = 1;\n    presentInfo.pSwapchains = swapChains;\n    presentInfo.pImageIndices = &imageIndex;\n    presentInfo.pResults = nullptr;\n\n    VkResult result = vkQueuePresentKHR(device->GetQueue(QueueFlags::Present), &presentInfo);\n\n\tif (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR) {\n\t\tRecreate(vkSwapChainExtent.width, vkSwapChainExtent.height);\n\t}\n\telse if (result != VK_SUCCESS) {\n        throw std::runtime_error(\"Failed to present swap chain image\");\n    }\n}\n\nVkSwapchainKHR VulkanSwapChain::GetVulkanSwapChain() const\n{\n\treturn vkSwapChain;\n}\n\nVkFormat VulkanSwapChain::GetVkImageFormat() const\n{\n\treturn vkSwapChainImageFormat;\n}\n\nVkImage VulkanSwapChain::GetVkImage(uint32_t index) const \n{\n\treturn vkSwapChainImages[index];\n}\n\nVkExtent2D VulkanSwapChain::GetVkExtent() const\n{\n\treturn vkSwapChainExtent;\n}\n\nuint32_t VulkanSwapChain::GetIndex() const\n{\n\treturn imageIndex;\n}\n\nuint32_t VulkanSwapChain::GetCount() const\n{\n\treturn static_cast<uint32_t>(vkSwapChainImages.size());\n}\n\nVkImageView VulkanSwapChain::GetVkImageView(uint32_t index) const\n{\n\treturn vkSwapChainImageViews[index];\n}\n\nVkSemaphore VulkanSwapChain::GetImageAvailableVkSemaphore() const\n{\n\treturn imageAvailableSemaphore;\n\n}\n\nVkSemaphore VulkanSwapChain::GetRenderFinishedVkSemaphore() const\n{\n\treturn renderFinishedSemaphore;\n}"
  },
  {
    "path": "src/CloudScapes/SwapChain.h",
    "content": "#pragma once\n\n#include \"VulkanInstance.h\"\n#include \"VulkanDevice.h\"\n#include <vector>\n#include \"Forward.h\"\n#include \"Window.h\"\n\nclass VulkanSwapChain \n{\n    friend class VulkanDevice;\n\npublic:\n    VkSwapchainKHR GetVulkanSwapChain() const;\n    VkFormat GetVkImageFormat() const;\n    VkExtent2D GetVkExtent() const;\n    uint32_t GetIndex() const;\n    uint32_t GetCount() const;\n    VkImageView GetVkImageView(uint32_t index) const;\n\tVkImage GetVkImage(uint32_t index) const;\n    VkSemaphore GetImageAvailableVkSemaphore() const;\n    VkSemaphore GetRenderFinishedVkSemaphore() const;\n\n\tvoid Create(uint32_t  width, uint32_t height);\n\tvoid Recreate(uint32_t  width, uint32_t height);\n\n\t//void resizeImagesInSwapChain();\n\n    void Acquire();\n    void Present();\n    ~VulkanSwapChain();\n\nprivate:\n    VulkanSwapChain(VulkanDevice* device, VkSurfaceKHR vkSurface, uint32_t  width, uint32_t height);\n\n    VulkanDevice* device;\n    VkSurfaceKHR vkSurface;\n    VkSwapchainKHR vkSwapChain;\n    std::vector<VkImage> vkSwapChainImages;\n    std::vector<VkImageView> vkSwapChainImageViews;\n    VkFormat vkSwapChainImageFormat;\n    VkExtent2D vkSwapChainExtent;\n    uint32_t imageIndex = 0;\n\n    VkSemaphore imageAvailableSemaphore;\n    VkSemaphore renderFinishedSemaphore;\n};"
  },
  {
    "path": "src/CloudScapes/Texture2D.cpp",
    "content": "#include \"Texture2D.h\"\n\nTexture2D::Texture2D(VulkanDevice* device, uint32_t width, uint32_t height, VkFormat format)\n\t: device(device), width(width), height(height), textureFormat(format)\n{}\n\nTexture2D::~Texture2D()\n{\n\tif (textureSampler != VK_NULL_HANDLE) {\n\t\tvkDestroySampler(device->GetVkDevice(), textureSampler, nullptr);\n\t}\n\tif (textureImageView != VK_NULL_HANDLE) {\n\t\tvkDestroyImageView(device->GetVkDevice(), textureImageView, nullptr);\n\t}\n\tif (textureImage != VK_NULL_HANDLE) {\n\t\tvkDestroyImage(device->GetVkDevice(), textureImage, nullptr);\n\t}\n\tif (textureImageMemory != VK_NULL_HANDLE) {\n\t\tvkFreeMemory(device->GetVkDevice(), textureImageMemory, nullptr);\n\t}\n}\n\n//This function creates a texture that can be written to\n//And thus can be used to prepare a texture target that is used to store compute shader calculations\nvoid Texture2D::createEmptyTexture(VkDevice logicalDevice, VkPhysicalDevice physicalDevice, VkCommandPool commandPool)\n{\n\t// Get device properties for the requested texture format\n\tVkFormatProperties formatProperties;\n\n\tvkGetPhysicalDeviceFormatProperties(physicalDevice, textureFormat, &formatProperties);\n\t// Check if requested image format supports image storage operations\n\tassert(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT);\n\n\tVkImageCreateInfo imageInfo = {};\n\timageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n\timageInfo.pNext = NULL;\n\timageInfo.imageType = VK_IMAGE_TYPE_2D;\n\timageInfo.extent.width = width;\n\timageInfo.extent.height = height;\n\timageInfo.extent.depth = 1;\n\timageInfo.mipLevels = 1;\n\timageInfo.arrayLayers = 1;\n\timageInfo.format = textureFormat;\n\timageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;\n\timageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n\t// Image will be sampled in the fragment shader and used as storage target in the compute shader\n\timageInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;\n\n\t//The samples flag is related to multisampling. This is only relevant for images that will be used as attachments, so stick to one sample\n\timageInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\timageInfo.flags = 0; // There are some optional flags for images that are related to sparse images.\n\n\tif (vkCreateImage(logicalDevice, &imageInfo, nullptr, &textureImage) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"failed to create image!\");\n\t}\n\n\tVkMemoryRequirements memReqs;\n\tvkGetImageMemoryRequirements(logicalDevice, textureImage, &memReqs);\n\n\tVkMemoryAllocateInfo memAllocInfo = {};\n\tmemAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n\tmemAllocInfo.pNext = NULL;\n\tmemAllocInfo.allocationSize = memReqs.size;\n\tmemAllocInfo.memoryTypeIndex = device->GetInstance()->GetMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);\n\n\tvkAllocateMemory(logicalDevice, &memAllocInfo, nullptr, &textureImageMemory);\n\tvkBindImageMemory(logicalDevice, textureImage, textureImageMemory, 0);\n\n\tVkCommandBuffer layoutCmd = beginSingleTimeCommands(device, commandPool);\n\ttextureLayout = VK_IMAGE_LAYOUT_GENERAL;\n\tImage::setImageLayout(layoutCmd, textureImage, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, textureLayout);\n\tendSingleTimeCommands(device, commandPool, device->GetQueue(QueueFlags::Compute), layoutCmd);\n\n\tImage::createSampler(device, textureSampler, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, 1.0f);\n\tImage::createImageView(device, textureImageView, textureImage, textureFormat, VK_IMAGE_ASPECT_COLOR_BIT);\n}\n\nvoid Texture2D::createTextureFromFile(VkDevice logicalDevice, VkCommandPool commandPool, const std::string texture_path, int numChannels, \n\t\t\t\t\t\t\t\t\tVkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,\n\t\t\t\t\t\t\t\t\tVkSamplerAddressMode addressMode, float maxAnisotropy)\n{\n\tImageLoadingUtility::loadImageFromFile(device, commandPool, texture_path.c_str(), textureImage, textureImageMemory, textureFormat, tiling, usage, properties);\n\n\tImage::createImageView(device, textureImageView, textureImage, textureFormat, VK_IMAGE_ASPECT_COLOR_BIT);\n\n\tImage::createSampler(device, textureSampler, addressMode, maxAnisotropy);\n}\n\nvoid Texture2D::create2DTexture(VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,\n\tVkSamplerAddressMode addressMode, float maxAnisotropy)\n{\n\tcreateTextureImage(tiling, usage, properties);\n\tcreateTextureImageView();\n\tcreateTextureSampler(addressMode, maxAnisotropy);\n}\nvoid Texture2D::createTextureImage(VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties)\n{\n\tImage::createImage(device, width, height, textureFormat, tiling, usage, properties, textureImage, textureImageMemory);\n}\nvoid Texture2D::createTextureImageView()\n{\n\tImage::createImageView(device, textureImageView, textureImage, textureFormat, VK_IMAGE_ASPECT_COLOR_BIT);\n}\nvoid Texture2D::createTextureSampler(VkSamplerAddressMode addressMode, float maxAnisotropy)\n{\n\tImage::createSampler(device, textureSampler, addressMode, maxAnisotropy);\n}\n\nuint32_t Texture2D::GetWidth() const\n{\n\treturn width;\n}\nuint32_t Texture2D::GetHeight() const\n{\n\treturn height;\n}\nVkFormat Texture2D::GetTextureFormat() const\n{\n\treturn textureFormat;\n}\nVkImageLayout Texture2D::GetTextureLayout() const\n{\n\treturn textureLayout;\n}\nVkImage Texture2D::GetTextureImage() const\n{\n\treturn textureImage;\n}\nVkDeviceMemory Texture2D::GetTextureImageMemory() const\n{\n\treturn textureImageMemory;\n}\nVkImageView Texture2D::GetTextureImageView() const\n{\n\treturn textureImageView;\n}\nVkSampler Texture2D::GetTextureSampler() const\n{\n\treturn textureSampler;\n}"
  },
  {
    "path": "src/CloudScapes/Texture2D.h",
    "content": "#pragma once\n\n#include \"VulkanDevice.h\"\n#include \"BufferUtils.h\"\n#include \"imageLoadingUtility.h\"\n#include \"Image.h\"\n\nclass Texture2D\n{\npublic:\n\tTexture2D() = delete;\t// https://stackoverflow.com/questions/5513881/meaning-of-delete-after-function-declaration\n\tTexture2D(VulkanDevice* device, uint32_t width, uint32_t height, VkFormat format);\n\t~Texture2D();\n\n\tvoid create2DTexture(VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,\n\t\t\t\t\t\t VkSamplerAddressMode addressMode, float maxAnisotropy);\n\tvoid createTextureImage(VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties);\n\tvoid createTextureSampler(VkSamplerAddressMode addressMode, float maxAnisotropy);\n\tvoid createTextureImageView();\n\n\tvoid createEmptyTexture(VkDevice logicalDevice, VkPhysicalDevice physicalDevice, VkCommandPool commandPool);\n\tvoid createTextureFromFile(VkDevice logicalDevice, VkCommandPool commandPool, const std::string texture_path, int numChannels,\n\t\t\t\t\t\t\t\tVkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, \n\t\t\t\t\t\t\t\tVkSamplerAddressMode addressMode, float maxAnisotropy);\n\n\tuint32_t GetWidth() const;\n\tuint32_t GetHeight() const;\n\tVkFormat GetTextureFormat() const;\n\tVkImageLayout GetTextureLayout() const;\n\tVkImage GetTextureImage() const;\n\tVkDeviceMemory GetTextureImageMemory() const;\n\tVkImageView GetTextureImageView() const;\n\tVkSampler GetTextureSampler() const;\nprivate:\n\tVulkanDevice* device; //member variable because it is needed for the destructor\n\n\tuint32_t width, height;\n\tVkFormat textureFormat;\n\tVkImageLayout textureLayout;\n\n\tVkImage textureImage = VK_NULL_HANDLE;\n\tVkDeviceMemory textureImageMemory = VK_NULL_HANDLE;\t\n\tVkImageView textureImageView = VK_NULL_HANDLE;\n\tVkSampler textureSampler = VK_NULL_HANDLE;\n};"
  },
  {
    "path": "src/CloudScapes/Texture3D.cpp",
    "content": "﻿#include \"Texture3D.h\"\n\nTexture3D::Texture3D(VulkanDevice* device, uint32_t width, uint32_t height, uint32_t depth, VkFormat format)\n\t: device(device), width(width), height(height), depth(depth), textureFormat(format)\n{}\n\nTexture3D::~Texture3D()\n{\n\tif (textureSampler3D != VK_NULL_HANDLE) {\n\t\tvkDestroySampler(device->GetVkDevice(), textureSampler3D, nullptr);\n\t}\n\tif (textureImageView3D != VK_NULL_HANDLE) {\n\t\tvkDestroyImageView(device->GetVkDevice(), textureImageView3D, nullptr);\n\t}\n\tif (textureImage3D != VK_NULL_HANDLE) {\n\t\tvkDestroyImage(device->GetVkDevice(), textureImage3D, nullptr);\n\t}\n\tif (textureImageMemory3D != VK_NULL_HANDLE) {\n\t\tvkFreeMemory(device->GetVkDevice(), textureImageMemory3D, nullptr);\n\t}\n}\n\nvoid Texture3D::create3DTexture(VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,\n\tVkSamplerAddressMode addressMode, float maxAnisotropy)\n{\n\tcreate3DTextureImage(tiling, usage, properties);\n\tcreate3DTextureImageView();\n\tcreate3DTextureSampler(addressMode, maxAnisotropy);\n}\n\nvoid Texture3D::create3DTextureImage(VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties)\n{\n\t//-------------\n\t//--- Image ---\n\t//-------------\n\n\tVkImageCreateInfo imageInfo = {};\n\timageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n\timageInfo.imageType = VK_IMAGE_TYPE_3D; //tells Vulkan with what kind of coordinate system the texels in the image are going to be addressed.\n\t\t\t\t\t\t\t\t\t\t\t// extent defines image dimensions\n\timageInfo.extent.width = width;\n\timageInfo.extent.height = height;\n\timageInfo.extent.depth = depth;\n\t//Our texture will not be an array and we won't be using mipmapping for now.\n\timageInfo.mipLevels = 1;\n\timageInfo.arrayLayers = 1;\n\n\t//use the same format for the texels as the pixels in the buffer, otherwise the copy operation will fail.\n\timageInfo.format = textureFormat; //It is possible that the VK_FORMAT_R8G8B8A8_UNORM format is not supported by the graphics hardware.\n\n\t\t\t\t\t\t\t\t\t  //2 types of memory arrangemnets for tiling: linear (row-major) and optimal (implementation defined order for optimal access)\n\t\t\t\t\t\t\t\t\t  //the tiling mode cannot be changed at a later time\n\t\t\t\t\t\t\t\t\t  //If you want to be able to directly access texels in the memory of the image, then you must use VK_IMAGE_TILING_LINEAR.\n\t\t\t\t\t\t\t\t\t  //We will be using a staging buffer instead of a staging image, so this won't be necessary. \n\t\t\t\t\t\t\t\t\t  //We will be using VK_IMAGE_TILING_OPTIMAL for efficient access from the shader.\n\timageInfo.tiling = tiling;\n\n\timageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; // Not usable by the GPU and the very first transition will discard the texels.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // very few situations where it is necessary for the texels to be preserved \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // during the first transition\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t //The image is going to be used as destination for the buffer copy, so it should be set up as a transfer destination. \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t // We also want to be able to access the image from the shader to color our mesh, so the usage should include VK_IMAGE_USAGE_SAMPLED_BIT\n\timageInfo.usage = usage;\n\n\t//The image will only be used by one queue family: the one that supports graphics (and therefore also) transfer operations.\n\timageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\n\t//The samples flag is related to multisampling. This is only relevant for images that will be used as attachments, so stick to one sample\n\timageInfo.samples = VK_SAMPLE_COUNT_1_BIT;\n\timageInfo.flags = 0; // There are some optional flags for images that are related to sparse images.\n\n\tif (vkCreateImage(device->GetVkDevice(), &imageInfo, nullptr, &textureImage3D) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"failed to create 3D texture!\");\n\t}\n\n\tVkMemoryRequirements memReqs = {};\n\tvkGetImageMemoryRequirements(device->GetVkDevice(), textureImage3D, &memReqs);\n\n\t// Device local memory to back up image\n\tVkMemoryAllocateInfo memAllocInfo{};\n\tmemAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n\tmemAllocInfo.allocationSize = memReqs.size;\n\tmemAllocInfo.memoryTypeIndex = device->GetInstance()->GetMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);\n\t\n\tif (vkAllocateMemory(device->GetVkDevice(), &memAllocInfo, nullptr, &textureImageMemory3D) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"Failed to allocate device memory for the buffer\");\n\t}\n\tvkBindImageMemory(device->GetVkDevice(), textureImage3D, textureImageMemory3D, 0);\n}\nvoid Texture3D::create3DTextureSampler(VkSamplerAddressMode addressMode, float maxAnisotropy)\n{\n\t// Create Texture Sampler \n\tVkSamplerCreateInfo samplerInfo = {};\n\tsamplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;\n\n\tsamplerInfo.magFilter = VK_FILTER_LINEAR;    // Specify how to interpolate texels that are magnified (concerns oversampling problem, aka more fragments than texels)\n\tsamplerInfo.minFilter = VK_FILTER_LINEAR;    // Specify how to interpolate texels that are minified (concerns undersampling problem, aka more texels than fragments)\n\n\t\t\t\t\t\t\t\t\t\t\t\t // Repeat the texture when going beyond the image dimensions\n\tsamplerInfo.addressModeU = addressMode;// VK_SAMPLER_ADDRESS_MODE_REPEAT;\n\tsamplerInfo.addressModeV = addressMode;// VK_SAMPLER_ADDRESS_MODE_REPEAT;\n\tsamplerInfo.addressModeW = addressMode;// VK_SAMPLER_ADDRESS_MODE_REPEAT;\n\n\t\t\t\t\t\t\t\t\t\t   // Specifies to use anisotropic filtering\n\t\t\t\t\t\t\t\t\t\t   // Limits amount of texel samples that can be used to calculate final color (lower value, better performance, but lower quality)\n\t\t\t\t\t\t\t\t\t\t   // No graphics hardware that will use more than 16 samples\n\tsamplerInfo.anisotropyEnable = VK_TRUE;\n\tsamplerInfo.maxAnisotropy = maxAnisotropy;\n\n\t// Specifies which color is returned when sampling beyond the image with clamp to border addressing mode\n\t// Only black, white, or transparent available\n\tsamplerInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;\n\n\t// Specifies which coordinate system to use to address texels in image\n\t// True --> use coords within [0, texWidth) and [0, texHeight)\n\t// False --> [0, 1) on all axes\n\tsamplerInfo.unnormalizedCoordinates = VK_FALSE;\n\n\t// If true, texels will be first compared to a value, and result of comparison is used in filtering operations (mainly for percentage-closer filtering on shadow maps)\n\tsamplerInfo.compareEnable = VK_FALSE;\n\tsamplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;\n\n\t// Mipmapping \n\tsamplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;\n\tsamplerInfo.mipLodBias = 0.0f;\n\tsamplerInfo.minLod = 0.0f;\n\tsamplerInfo.maxLod = 0.0f;\n\n\tif (vkCreateSampler(device->GetVkDevice(), &samplerInfo, nullptr, &textureSampler3D) != VK_SUCCESS) {\n\t\tthrow std::runtime_error(\"failed to create texture sampler!\");\n\t}\n}\nvoid Texture3D::create3DTextureImageView()\n{\n\t// Create the image view \n\tVkImageViewCreateInfo viewInfo = {};\n\tviewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n\tviewInfo.image = textureImage3D;\n\tviewInfo.viewType = VK_IMAGE_VIEW_TYPE_3D;\n\tviewInfo.format = textureFormat;\n\n\t// Describe the image's purpose and which part of the image should be accessed\n\tviewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n\tviewInfo.subresourceRange.baseMipLevel = 0;\n\tviewInfo.subresourceRange.levelCount = 1;\n\tviewInfo.subresourceRange.baseArrayLayer = 0;\n\tviewInfo.subresourceRange.layerCount = 1;\n\n\tif (vkCreateImageView(device->GetVkDevice(), &viewInfo, nullptr, &textureImageView3D) != VK_SUCCESS)\n\t{\n\t\tthrow std::runtime_error(\"failed to create 3D texture image view!\");\n\t}\n}\n\nvoid Texture3D::create3DTextureFromMany2DTextures(VkDevice logicalDevice, VkCommandPool commandPool,\n\tconst std::string folder_path, const std::string textureBaseName, const std::string fileExtension,\n\tint num2DImages, int numChannels)\n{\n\tImageLoadingUtility::create3DTextureFromMany2DTextures(device, logicalDevice, commandPool, folder_path, textureBaseName, fileExtension,\n\t\ttextureImage3D, textureImageMemory3D, textureFormat, width, height, depth, num2DImages, numChannels);\n\n\tcreate3DTextureSampler(VK_SAMPLER_ADDRESS_MODE_REPEAT, 16.0f);\n\tcreate3DTextureImageView();\n}\n\nuint32_t Texture3D::GetWidth() const\n{\n\treturn width;\n}\nuint32_t Texture3D::GetHeight() const\n{\n\treturn height;\n}\nuint32_t Texture3D::GetDepth() const\n{\n\treturn depth;\n}\nVkFormat Texture3D::GetTextureFormat() const\n{\n\treturn textureFormat;\n}\nVkImageLayout Texture3D::GetTextureLayout() const\n{\n\treturn textureLayout;\n}\nVkImage Texture3D::GetTextureImage()\n{\n\treturn textureImage3D;\n}\nVkDeviceMemory Texture3D::GetTextureImageMemory()\n{\n\treturn textureImageMemory3D;\n}\nVkImageView Texture3D::GetTextureImageView()\n{\n\treturn textureImageView3D;\n}\nVkSampler Texture3D::GetTextureSampler()\n{\n\treturn textureSampler3D;\n}"
  },
  {
    "path": "src/CloudScapes/Texture3D.h",
    "content": "#pragma once\n\n#include \"VulkanDevice.h\"\n#include \"BufferUtils.h\"\n#include \"imageLoadingUtility.h\"\n#include \"Image.h\"\n\nclass Texture3D\n{\npublic:\n\tTexture3D() = delete;\t// https://stackoverflow.com/questions/5513881/meaning-of-delete-after-function-declaration\n\tTexture3D(VulkanDevice* device, uint32_t width, uint32_t height, uint32_t depth, VkFormat format);\n\t~Texture3D();\n\n\tvoid create3DTexture(VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,\n\t\t\t\t\t\t VkSamplerAddressMode addressMode, float maxAnisotropy);\n\tvoid create3DTextureImage(VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties);\n\tvoid create3DTextureSampler(VkSamplerAddressMode addressMode, float maxAnisotropy);\n\tvoid create3DTextureImageView();\n\tvoid create3DTextureFromMany2DTextures(VkDevice logicalDevice, VkCommandPool commandPool,\n\t\tconst std::string folder_path, const std::string textureBaseName, const std::string fileExtension,\n\t\tint num2DImages, int numChannels);\n\n\tuint32_t GetWidth() const;\n\tuint32_t GetHeight() const;\n\tuint32_t GetDepth() const;\n\tVkFormat GetTextureFormat() const;\n\tVkImageLayout GetTextureLayout() const;\n\tVkImage GetTextureImage();\n\tVkDeviceMemory GetTextureImageMemory();\n\tVkImageView GetTextureImageView();\n\tVkSampler GetTextureSampler();\nprivate:\n\tVulkanDevice* device; //member variable because it is needed for the destructor\n\n\tuint32_t width, height, depth;\n\tVkFormat textureFormat;\n\tVkImageLayout textureLayout;\n\n\tVkImage textureImage3D = VK_NULL_HANDLE;\n\tVkDeviceMemory textureImageMemory3D = VK_NULL_HANDLE;\n\tVkImageView textureImageView3D = VK_NULL_HANDLE;\n\tVkSampler textureSampler3D = VK_NULL_HANDLE;\n};"
  },
  {
    "path": "src/CloudScapes/Vertex.h",
    "content": "#pragma once\n\n#include <vulkan/vulkan.h>\n#include <glm/glm.hpp>\n\n#define GLM_ENABLE_EXPERIMENTAL\n#include <glm/gtx/hash.hpp>\n#include <array>\n\nstruct Vertex\n{\n\tglm::vec4 position; //Keep buffers that are passed to shaders as vec2's or vec4's as vulkan needs powers of 2 to do offsetting correctly\n\tglm::vec4 color;\n\tglm::vec2 texCoord;\n\n\t/*\n\tThe functions below allow us to access texture coordinates as input in the vertex shader.\n\tThat is necessary to be able to pass them to the fragment shader\n\tfor interpolation across the surface of the square\n\t*/\n\n\tbool operator==(const Vertex& other) const {\n\t\treturn position == other.position && color == other.color && texCoord == other.texCoord;\n\t}\n\n\tstatic VkVertexInputBindingDescription getBindingDescription()\n\t{\n\t\tVkVertexInputBindingDescription bindingDescription = {};\n\t\tbindingDescription.binding = 0;\n\t\tbindingDescription.stride = sizeof(Vertex);\n\t\tbindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;\n\n\t\treturn bindingDescription;\n\t}\n\n\tstatic std::array<VkVertexInputAttributeDescription, 3> getAttributeDescriptions()\n\t{\n\t\tstd::array<VkVertexInputAttributeDescription, 3> attributeDescriptions = {};\n\n\t\tattributeDescriptions[0].binding = 0;\n\t\tattributeDescriptions[0].location = 0;\n\t\tattributeDescriptions[0].format = VK_FORMAT_R32G32B32A32_SFLOAT;\n\t\tattributeDescriptions[0].offset = offsetof(Vertex, position);\n\n\t\tattributeDescriptions[1].binding = 0;\n\t\tattributeDescriptions[1].location = 1;\n\t\tattributeDescriptions[1].format = VK_FORMAT_R32G32B32A32_SFLOAT;\n\t\tattributeDescriptions[1].offset = offsetof(Vertex, color);\n\n\t\tattributeDescriptions[2].binding = 0;\n\t\tattributeDescriptions[2].location = 2;\n\t\tattributeDescriptions[2].format = VK_FORMAT_R32G32_SFLOAT;\n\t\tattributeDescriptions[2].offset = offsetof(Vertex, texCoord);\n\n\t\treturn attributeDescriptions;\n\t}\n};\n\nnamespace std {\n\ttemplate<> struct hash<Vertex> {\n\t\tsize_t operator()(Vertex const& vertex) const {\n\t\t\treturn ((hash<glm::vec3>()(vertex.position) ^\n\t\t\t\t(hash<glm::vec3>()(vertex.color) << 1)) >> 1) ^\n\t\t\t\t(hash<glm::vec2>()(vertex.texCoord) << 1);\n\t\t}\n\t};\n}"
  },
  {
    "path": "src/CloudScapes/VulkanDevice.cpp",
    "content": "#include \"VulkanDevice.h\"\n\nVulkanDevice::VulkanDevice(VulkanInstance* instance, VkDevice vkDevice, Queues queues)\n  : instance(instance), vkDevice(vkDevice), queues(queues) \n{}\n\nVulkanDevice::~VulkanDevice()\n{\n\tvkDestroyDevice(vkDevice, nullptr);\n}\n\nVulkanInstance* VulkanDevice::GetInstance() \n{\n    return instance;\n}\n\nVkDevice VulkanDevice::GetVkDevice() \n{\n    return vkDevice;\n}\n\nVkQueue VulkanDevice::GetQueue(QueueFlags flag) \n{\n    return queues[flag];\n}\n\nunsigned int VulkanDevice::GetQueueIndex(QueueFlags flag) \n{\n\treturn GetInstance()->GetQueueFamilyIndices()[flag];\n}\n\nVulkanSwapChain* VulkanDevice::CreateSwapChain(VkSurfaceKHR surface, uint32_t  width, uint32_t height)\n{\n    return new VulkanSwapChain(this, surface, width, height);\n}"
  },
  {
    "path": "src/CloudScapes/VulkanDevice.h",
    "content": "#pragma once\n\n#include <array>\n#include <vulkan/vulkan.h>\n#include \"Forward.h\"\n#include \"VulkanInstance.h\"\n#include \"SwapChain.h\"\n\nclass VulkanDevice \n{\n\t/*\n\t\tIn principle, private and protected members of a class cannot be accessed\n\t\tfrom outside the same class in which they are declared. \n\t\tHowever, this rule does not apply to \"friends\".\n\n\t\tFriends are functions or classes declared with the friend keyword.\n\t\tA non-member function can access the private and protected members of a \n\t\tclass if it is declared a friend of that class.\n\t*/\n    friend class VulkanInstance;\n\npublic:\n    VulkanSwapChain* CreateSwapChain(VkSurfaceKHR surface, uint32_t  width, uint32_t height);\n    VulkanInstance* GetInstance();\n    VkDevice GetVkDevice();\n    VkQueue GetQueue(QueueFlags flag);\n\tunsigned int GetQueueIndex(QueueFlags flag);\n    ~VulkanDevice();\n\nprivate:\n    using Queues = std::array<VkQueue, sizeof(QueueFlags)>;\n    \n    VulkanDevice() = delete;\n    VulkanDevice(VulkanInstance* instance, VkDevice vkDevice, Queues queues);\n\n    VulkanInstance* instance;\n    VkDevice vkDevice;\n    Queues queues;\n};"
  },
  {
    "path": "src/CloudScapes/VulkanInitializers.h",
    "content": "#pragma once\n\n#include <vector>\n#include <vulkan/vulkan.h>\n\n// Reference: https://github.com/SaschaWillems/Vulkan/blob/master/base/VulkanInitializers.hpp\nnamespace VulkanInitializers\n{\n\t//--------------------------------------------------------\n\t//\t\t\t\tShader Program Loading\n\t//--------------------------------------------------------\n\n\tinline VkPipelineShaderStageCreateInfo loadShader(VkShaderStageFlagBits shaderStageBits ,VkShaderModule shadermodule)\n\t{\n\t\tVkPipelineShaderStageCreateInfo shaderStageCreateInfo = {};\n\t\tshaderStageCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n\t\tshaderStageCreateInfo.stage = shaderStageBits;\n\t\tshaderStageCreateInfo.module = shadermodule;\n\t\tshaderStageCreateInfo.pName = \"main\";\n\n\t\treturn shaderStageCreateInfo;\n\t}\n\n\t//--------------------------------------------------------\n\t//\t\t\tPipeLine Layouts and Pipeline Cache\n\t// Reference: https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Fixed_functions\n\t//--------------------------------------------------------\n\n\tinline VkPipelineLayout CreatePipelineLayout(VkDevice& logicalDevice, std::vector<VkDescriptorSetLayout> descriptorSetLayouts)\n\t{\n\t\tVkPipelineLayoutCreateInfo pipelineLayoutInfo = {};\n\t\tpipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n\t\tpipelineLayoutInfo.setLayoutCount = static_cast<uint32_t>(descriptorSetLayouts.size());\n\t\tpipelineLayoutInfo.pSetLayouts = descriptorSetLayouts.data();\n\t\tpipelineLayoutInfo.pushConstantRangeCount = 0;\n\t\tpipelineLayoutInfo.pPushConstantRanges = 0;\n\n\t\tVkPipelineLayout pipelineLayout;\n\t\tif (vkCreatePipelineLayout(logicalDevice, &pipelineLayoutInfo, nullptr, &pipelineLayout) != VK_SUCCESS)\n\t\t{\n\t\t\tthrow std::runtime_error(\"Failed to create pipeline layout\");\n\t\t}\n\n\t\treturn pipelineLayout;\n\t}\n\n\tinline void createPipelineCache(VkDevice& logicalDevice, VkPipelineCache &pipelineCache)\n\t{\n\t\tVkPipelineCacheCreateInfo pipelineCacheCreateInfo = {};\n\t\tpipelineCacheCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;\n\t\tif (vkCreatePipelineCache(logicalDevice, &pipelineCacheCreateInfo, nullptr, &pipelineCache) != VK_SUCCESS) {\n\t\t\tthrow std::runtime_error(\"Failed to create pipeline cache\");\n\t\t}\n\t}\n\n\t//--------------------------------------------------------\n\t//\t\t\t\tPipeLine State Info Creation\n\t//--------------------------------------------------------\n\n\tinline VkPipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo()\n\t{\n\t\t// -------- Vertex input --------\n\t\t// Because we're hard coding the vertex data directly in the vertex shader, we'll fill in this structure to specify \n\t\t// that there is no vertex data to load for now. We'll write the vertex buffers later.\n\t\tVkPipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo{};\n\t\tpipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n\t\treturn pipelineVertexInputStateCreateInfo;\n\t}\n\n\tinline VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo( VkPrimitiveTopology topology,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVkPipelineInputAssemblyStateCreateFlags flags,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVkBool32 primitiveRestartEnable)\n\t{\n\t\t// -------- Input assembly --------\n\t\t// The VkPipelineInputAssemblyStateCreateInfo struct describes two things: what kind of geometry will be drawn \n\t\t// from the vertices and if primitive restart should be enabled.\n\t\tVkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo{};\n\t\tpipelineInputAssemblyStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n\t\tpipelineInputAssemblyStateCreateInfo.topology = topology;\n\t\tpipelineInputAssemblyStateCreateInfo.flags = flags;\n\t\tpipelineInputAssemblyStateCreateInfo.primitiveRestartEnable = primitiveRestartEnable;\n\t\treturn pipelineInputAssemblyStateCreateInfo;\n\t}\n\n\tinline VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo( VkPolygonMode polygonMode,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVkCullModeFlags cullMode, VkFrontFace frontFace,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVkPipelineRasterizationStateCreateFlags flags = 0)\n\t{\n\t\t// -------- Rasterization State --------\n\t\t// The rasterizer takes the geometry that is shaped by the vertices from the vertex shader and turns\n\t\t// it into fragments to be colored by the fragment shader.\n\t\t// It also performs depth testing, face culling and the scissor test, and it can be configured to output \n\t\t// fragments that fill entire polygons or just the edges (wireframe rendering). All this is configured \n\t\t// using the VkPipelineRasterizationStateCreateInfo structure.\n\t\tVkPipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo{};\n\t\tpipelineRasterizationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n\t\tpipelineRasterizationStateCreateInfo.depthClampEnable = VK_FALSE;\n\t\tpipelineRasterizationStateCreateInfo.rasterizerDiscardEnable = VK_FALSE; // If rasterizerDiscardEnable is set to VK_TRUE, then geometry never \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// passes through the rasterizer stage. This basically disables any output to the framebuffer.\n\t\tpipelineRasterizationStateCreateInfo.depthBiasEnable = VK_FALSE;  // The rasterizer can alter the depth values by adding a constant value or biasing \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// them based on a fragment's slope. This is sometimes used for shadow mapping, but we won't \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// be using it.Just set depthBiasEnable to VK_FALSE.\n\t\tpipelineRasterizationStateCreateInfo.polygonMode = polygonMode;\n\t\tpipelineRasterizationStateCreateInfo.cullMode = cullMode;\n\t\tpipelineRasterizationStateCreateInfo.frontFace = frontFace;\n\t\tpipelineRasterizationStateCreateInfo.flags = flags;\n\t\tpipelineRasterizationStateCreateInfo.lineWidth = 1.0f;\n\t\treturn pipelineRasterizationStateCreateInfo;\n\t}\n\n\tinline VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState( VkColorComponentFlags colorWriteMask,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  VkBool32 blendEnable)\n\t{\n\t\t// -------- Color Blending ---------\n\t\t// --> Color Blending is usually for transparency\n\t\t// --> Configuration per attached framebuffer\n\t\tVkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState{};\n\t\tpipelineColorBlendAttachmentState.colorWriteMask = colorWriteMask;\n\t\tpipelineColorBlendAttachmentState.blendEnable = blendEnable;\n\t\treturn pipelineColorBlendAttachmentState;\n\t}\n\n\tinline VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo( uint32_t attachmentCount,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  const VkPipelineColorBlendAttachmentState * pAttachments)\n\t{\n\t\t// --> Global color blending settings\n\t\tVkPipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo{};\n\t\tpipelineColorBlendStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n\t\tpipelineColorBlendStateCreateInfo.attachmentCount = attachmentCount;\n\t\tpipelineColorBlendStateCreateInfo.pAttachments = pAttachments;\n\t\treturn pipelineColorBlendStateCreateInfo;\n\t}\n\n\tinline VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateCreateInfo( VkBool32 depthTestEnable, VkBool32 depthWriteEnable,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  VkCompareOp depthCompareOp)\n\t{\n\t\t//The depthTestEnable field specifies if the depth of new fragments should be compared to the \n\t\t//depth buffer to see if they should be discarded. The depthWriteEnable field specifies if the \n\t\t//new depth of fragments that pass the depth test should actually be written to the depth buffer. \n\t\t//This is useful for drawing transparent objects. They should be compared to the previously rendered \n\t\t//opaque objects, but not cause further away transparent objects to not be drawn.\n\t\tVkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateCreateInfo{};\n\t\tpipelineDepthStencilStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;\n\t\tpipelineDepthStencilStateCreateInfo.depthTestEnable = depthTestEnable;\n\t\tpipelineDepthStencilStateCreateInfo.depthWriteEnable = depthWriteEnable;\n\t\tpipelineDepthStencilStateCreateInfo.depthCompareOp = depthCompareOp; // specifies the comparison that is performed to keep or discard fragments.\n\t\tpipelineDepthStencilStateCreateInfo.depthBoundsTestEnable = VK_FALSE;\n\t\tpipelineDepthStencilStateCreateInfo.minDepthBounds = 0.0f;\n\t\tpipelineDepthStencilStateCreateInfo.maxDepthBounds = 1.0f;\n\t\tpipelineDepthStencilStateCreateInfo.stencilTestEnable = VK_FALSE;\n\t\tpipelineDepthStencilStateCreateInfo.front = pipelineDepthStencilStateCreateInfo.back;\n\t\tpipelineDepthStencilStateCreateInfo.back.compareOp = VK_COMPARE_OP_ALWAYS;\n\t\treturn pipelineDepthStencilStateCreateInfo;\n\t}\n\n\tinline VkPipelineViewportStateCreateInfo pipelineViewportStateCreateInfo( uint32_t viewportCount, uint32_t scissorCount, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  VkPipelineViewportStateCreateFlags flags = 0)\n\t{\n\t\t// Now this viewport and scissor rectangle need to be combined into a viewport state using the \n\t\t// VkPipelineViewportStateCreateInfo struct. It is possible to use multiple viewports and scissor\n\t\t// rectangles on some graphics cards, so its members reference an array of them. Using multiple requires \n\t\t// enabling a GPU feature (see logical device creation).\n\t\tVkPipelineViewportStateCreateInfo pipelineViewportStateCreateInfo{};\n\t\tpipelineViewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n\t\tpipelineViewportStateCreateInfo.viewportCount = viewportCount;\n\t\tpipelineViewportStateCreateInfo.scissorCount = scissorCount;\n\t\tpipelineViewportStateCreateInfo.flags = flags;\n\t\treturn pipelineViewportStateCreateInfo;\n\t}\n\n\tinline VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo( VkSampleCountFlagBits rasterizationSamples,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVkPipelineMultisampleStateCreateFlags flags = 0)\n\t{\n\t\t// -------- Multisampling --------\n\t\t// The VkPipelineMultisampleStateCreateInfo struct configures multisampling, which is one of the ways to perform anti-aliasing. \n\t\t// It works by combining the fragment shader results of multiple polygons that rasterize to the same pixel. This mainly occurs \n\t\t// along edges, which is also where the most noticeable aliasing artifacts occur. Because it doesn't need to run the fragment \n\t\t// shader multiple times if only one polygon maps to a pixel, it is significantly less expensive than simply rendering to a \n\t\t// higher resolution and then downscaling. Enabling it requires enabling a GPU feature.\n\t\tVkPipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo{};\n\t\tpipelineMultisampleStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n\t\tpipelineMultisampleStateCreateInfo.rasterizationSamples = rasterizationSamples;\n\t\tpipelineMultisampleStateCreateInfo.flags = flags;\n\t\treturn pipelineMultisampleStateCreateInfo;\n\t}\n\n\tinline VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo( const std::vector<VkDynamicState>& pDynamicStates,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVkPipelineDynamicStateCreateFlags flags = 0)\n\t{\n\t\tVkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo{};\n\t\tpipelineDynamicStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n\t\tpipelineDynamicStateCreateInfo.pDynamicStates = pDynamicStates.data();\n\t\tpipelineDynamicStateCreateInfo.dynamicStateCount = static_cast<uint32_t>(pDynamicStates.size());\n\t\tpipelineDynamicStateCreateInfo.flags = flags;\n\t\treturn pipelineDynamicStateCreateInfo;\n\t}\n\n\tinline VkGraphicsPipelineCreateInfo graphicsPipelineCreateInfo( VkPipelineLayout layout, VkRenderPass renderPass,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tVkPipelineCreateFlags flags = 0)\n\t{\n\t\tVkGraphicsPipelineCreateInfo pipelineCreateInfo{};\n\t\tpipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n\t\tpipelineCreateInfo.layout = layout;\n\t\tpipelineCreateInfo.renderPass = renderPass;\n\t\tpipelineCreateInfo.flags = flags;\n\t\tpipelineCreateInfo.basePipelineIndex = VK_NULL_HANDLE; // Vulkan allows you to create a new graphics pipeline by deriving from an existing pipeline. \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // We aren't doing this.\n\t\tpipelineCreateInfo.basePipelineIndex = -1;\n\t\treturn pipelineCreateInfo;\n\t}\n\n\t//--------------------------------------------------------\n\t//\t\t\tDescriptor Sets and Descriptor Layouts\n\t// Reference: https://vulkan-tutorial.com/Uniform_buffers\n\t//--------------------------------------------------------\n\t\n\tinline void CreateDescriptorPool(VkDevice& logicalDevice, uint32_t poolSizeCount, VkDescriptorPoolSize* data, VkDescriptorPool& descriptorPool)\n\t{\n\t\tVkDescriptorPoolCreateInfo descriptorPoolInfo = {};\n\t\tdescriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n\t\tdescriptorPoolInfo.pNext = nullptr;\n\t\tdescriptorPoolInfo.poolSizeCount = poolSizeCount;\n\t\tdescriptorPoolInfo.pPoolSizes = data;\n\t\tdescriptorPoolInfo.maxSets = poolSizeCount;\n\n\t\tif (vkCreateDescriptorPool(logicalDevice, &descriptorPoolInfo, nullptr, &descriptorPool) != VK_SUCCESS) {\n\t\t\tthrow std::runtime_error(\"Failed to create descriptor pool\");\n\t\t}\n\t}\n\n\tinline void CreateDescriptorSetLayout(VkDevice& logicalDevice, uint32_t bindingCount, VkDescriptorSetLayoutBinding* data, VkDescriptorSetLayout& descriptorSetLayout)\n\t{\n\t\tVkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo = {};\n\t\tdescriptorSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n\t\tdescriptorSetLayoutCreateInfo.pNext = nullptr;\n\t\tdescriptorSetLayoutCreateInfo.bindingCount = bindingCount;\n\t\tdescriptorSetLayoutCreateInfo.pBindings = data;\n\n\t\tif (vkCreateDescriptorSetLayout(logicalDevice, &descriptorSetLayoutCreateInfo, nullptr, &descriptorSetLayout) != VK_SUCCESS) {\n\t\t\tthrow std::runtime_error(\"failed to create descriptor set layout!\");\n\t\t}\n\t}\n\n\tinline VkDescriptorSet CreateDescriptorSet(VkDevice& logicalDevice, VkDescriptorPool descriptorPool, VkDescriptorSetLayout descriptorSetLayout)\n\t{\n\t\tVkDescriptorSetAllocateInfo allocInfo = {};\n\t\tallocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n\t\tallocInfo.descriptorPool = descriptorPool;\n\t\tallocInfo.descriptorSetCount = 1;\n\t\tallocInfo.pSetLayouts = &descriptorSetLayout;\n\n\t\tVkDescriptorSet descriptorSet;\n\t\tvkAllocateDescriptorSets(logicalDevice, &allocInfo, &descriptorSet);\n\t\treturn descriptorSet;\n\t}\n\n\t//--------------------------------------------------------\n\t//\t\t\t\t\tCommandPools\n\t//--------------------------------------------------------\n\tinline void CreateCommandPool(VkDevice& logicalDevice, VkCommandPool& cmdPool, uint32_t queueFamilyIndex)\n\t{\n\t\tVkCommandPoolCreateInfo cmdPoolInfo = {};\n\t\tcmdPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n\t\tcmdPoolInfo.queueFamilyIndex = queueFamilyIndex;\n\t\tcmdPoolInfo.flags = 0;\n\n\t\tif (vkCreateCommandPool(logicalDevice, &cmdPoolInfo, nullptr, &cmdPool) != VK_SUCCESS) {\n\t\t\tthrow std::runtime_error(\"Failed to create command pool\");\n\t\t}\n\t}\n};"
  },
  {
    "path": "src/CloudScapes/VulkanInstance.cpp",
    "content": "#include \"VulkanInstance.h\"\n\n#ifdef NDEBUG\nconst bool ENABLE_VALIDATION = false;\n#else\nconst bool ENABLE_VALIDATION = true;\n#endif\n\nnamespace {\n    const std::vector<const char*> validationLayers = {\n        \"VK_LAYER_LUNARG_standard_validation\"\n    };\n\n    // Get the required list of extensions based on whether validation layers are enabled\n    std::vector<const char*> getRequiredExtensions() \n\t{\n        std::vector<const char*> extensions;\n\n        if (ENABLE_VALIDATION) \n\t\t{\n            extensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);\n        }\n\n        return extensions;\n    }\n\n    // Callback function to allow messages from validation layers to be received\n    VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugReportFlagsEXT flags,\n\t\t\t\t\t\t\t\t\t\t\t\tVkDebugReportObjectTypeEXT objType,\n\t\t\t\t\t\t\t\t\t\t\t\tuint64_t obj,\n\t\t\t\t\t\t\t\t\t\t\t\tsize_t location,\n\t\t\t\t\t\t\t\t\t\t\t\tint32_t code,\n\t\t\t\t\t\t\t\t\t\t\t\tconst char* layerPrefix,\n\t\t\t\t\t\t\t\t\t\t\t\tconst char* msg,\n\t\t\t\t\t\t\t\t\t\t\t\tvoid *userData) \n\t{\n        fprintf(stderr, \"Validation layer: %s\\n\", msg);\n        return VK_FALSE;\n    }\n}\n\nVulkanInstance::VulkanInstance(const char* applicationName, unsigned int additionalExtensionCount, const char** additionalExtensions) \n{\n    // --- Specify details about our application ---\n    VkApplicationInfo appInfo = {};\n    appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;\n    appInfo.pApplicationName = applicationName;\n    appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);\n    appInfo.pEngineName = \"No Engine\";\n    appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);\n    appInfo.apiVersion = VK_API_VERSION_1_0;\n    \n    // --- Create Vulkan instance ---\n    VkInstanceCreateInfo createInfo = {};\n    createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;\n    createInfo.pApplicationInfo = &appInfo;\n\n    // Get extensions necessary for Vulkan to interface with GLFW\n    auto extensions = getRequiredExtensions();\n    for (unsigned int i = 0; i < additionalExtensionCount; ++i) \n\t{\n        extensions.push_back(additionalExtensions[i]);\n    }\n    createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());\n    createInfo.ppEnabledExtensionNames = extensions.data();\n\n    // Specify global validation layers\n    if (ENABLE_VALIDATION) \n\t{\n        createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());\n        createInfo.ppEnabledLayerNames = validationLayers.data();\n    } \n\telse \n\t{\n        createInfo.enabledLayerCount = 0;\n    }\n\n    // Create instance\n    if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) \n\t{\n        throw std::runtime_error(\"Failed to create instance\");\n    }\n\n    initDebugReport();\n}\n\nVkInstance VulkanInstance::GetVkInstance() \n{\n    return instance;\n}\n\nVkPhysicalDevice VulkanInstance::GetPhysicalDevice() \n{\n    return physicalDevice;\n}\n\nconst VkSurfaceCapabilitiesKHR& VulkanInstance::GetSurfaceCapabilities() const \n{\n    return surfaceCapabilities;\n}\n\nconst QueueFamilyIndices& VulkanInstance::GetQueueFamilyIndices() const \n{\n    return queueFamilyIndices;\n}\n\nconst std::vector<VkSurfaceFormatKHR>& VulkanInstance::GetSurfaceFormats() const \n{\n    return surfaceFormats;\n}\n\nconst std::vector<VkPresentModeKHR>& VulkanInstance::GetPresentModes() const \n{\n    return presentModes;\n}\n\nuint32_t VulkanInstance::GetMemoryTypeIndex(uint32_t typeBits, VkMemoryPropertyFlags properties) const \n{\n    // Iterate over all memory types available for the device used in this example\n    for (uint32_t i = 0; i < deviceMemoryProperties.memoryTypeCount; i++) \n\t{\n        if ((typeBits & 1) == 1) {\n            if ((deviceMemoryProperties.memoryTypes[i].propertyFlags & properties) == properties) \n\t\t\t{\n                return i;\n            }\n        }\n        typeBits >>= 1;\n    }\n    throw std::runtime_error(\"Could not find a suitable memory type!\");\n}\n\nvoid VulkanInstance::initDebugReport() \n{\n    if (ENABLE_VALIDATION) \n\t{\n        // Specify details for callback\n        VkDebugReportCallbackCreateInfoEXT createInfo = {};\n        createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;\n        createInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;\n        createInfo.pfnCallback = debugCallback;\n\n        if ([&]() {\n            auto func = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(instance, \"vkCreateDebugReportCallbackEXT\");\n            if (func != nullptr) {\n                return func(instance, &createInfo, nullptr, &debugReportCallback);\n            }\n            else {\n                return VK_ERROR_EXTENSION_NOT_PRESENT;\n            }\n        }() != VK_SUCCESS) {\n            throw std::runtime_error(\"Failed to set up debug callback\");\n        }\n    }\n}\n\nnamespace \n{\n    QueueFamilyIndices checkDeviceQueueSupport(VkPhysicalDevice device, QueueFlagBits requiredQueues, VkSurfaceKHR surface = VK_NULL_HANDLE) \n\t{\n        uint32_t queueFamilyCount = 0;\n        vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);\n\n        std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);\n        vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());\n\n        VkQueueFlags requiredVulkanQueues = 0;\n        if (requiredQueues[QueueFlags::Graphics]) \n\t\t{\n            requiredVulkanQueues |= VK_QUEUE_GRAPHICS_BIT;\n        }\n        if (requiredQueues[QueueFlags::Compute]) \n\t\t{\n            requiredVulkanQueues |= VK_QUEUE_COMPUTE_BIT;\n        }\n        if (requiredQueues[QueueFlags::Transfer]) \n\t\t{\n            requiredVulkanQueues |= VK_QUEUE_TRANSFER_BIT;\n        }\n\n        QueueFamilyIndices indices = {};\n        indices.fill(-1);\n        VkQueueFlags supportedQueues = 0;\n        bool needsPresent = requiredQueues[QueueFlags::Present];\n        bool presentSupported = false;\n\n        int i = 0;\n        for (const auto& queueFamily : queueFamilies) \n\t\t{\n            if (queueFamily.queueCount > 0) \n\t\t\t{\n                supportedQueues |= queueFamily.queueFlags;\n            }\n\n            if (queueFamily.queueCount > 0 && queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) \n\t\t\t{\n                indices[QueueFlags::Graphics] = i;\n            }\n\n            if (queueFamily.queueCount > 0 && queueFamily.queueFlags & VK_QUEUE_COMPUTE_BIT) \n\t\t\t{\n                indices[QueueFlags::Compute] = i;\n            }\n\n            if (queueFamily.queueCount > 0 && queueFamily.queueFlags & VK_QUEUE_TRANSFER_BIT) \n\t\t\t{\n                indices[QueueFlags::Transfer] = i;\n            }\n\n            if (needsPresent) \n\t\t\t{\n                VkBool32 presentSupport = false;\n                vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);\n                if (queueFamily.queueCount > 0 && presentSupport) \n\t\t\t\t{\n                    presentSupported = true;\n                    indices[QueueFlags::Present] = i;\n                }\n            }\n\n            if ((requiredVulkanQueues & supportedQueues) == requiredVulkanQueues && (!needsPresent || presentSupported)) \n\t\t\t{\n                break;\n            }\n\n            i++;\n        }\n\n        return indices;\n    }\n\n    // Check the physical device for specified extension support\n    bool checkDeviceExtensionSupport(VkPhysicalDevice device, std::vector<const char*> requiredExtensions) \n\t{\n        uint32_t extensionCount;\n        vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr);\n\n        std::vector<VkExtensionProperties> availableExtensions(extensionCount);\n        vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data());\n\n        std::set<std::string> requiredExtensionSet(requiredExtensions.begin(), requiredExtensions.end());\n\n        for (const auto& extension : availableExtensions)\n\t\t{\n            requiredExtensionSet.erase(extension.extensionName);\n        }\n\n        return requiredExtensionSet.empty();\n    }\n}\n\nvoid VulkanInstance::PickPhysicalDevice(std::vector<const char*> deviceExtensions, QueueFlagBits requiredQueues, VkSurfaceKHR surface) \n{\n    // List the graphics cards on the machine\n    uint32_t deviceCount = 0;\n    vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);\n\n    if (deviceCount == 0) \n\t{\n        throw std::runtime_error(\"Failed to find GPUs with Vulkan support\");\n    }\n\n    std::vector<VkPhysicalDevice> devices(deviceCount);\n    vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());\n\n    // Evaluate each GPU and check if it is suitable\n    for (const auto& device : devices) \n\t{\n        bool queueSupport = true;\n        queueFamilyIndices = checkDeviceQueueSupport(device, requiredQueues, surface);\n        for (unsigned int i = 0; i < requiredQueues.size(); ++i) \n\t\t{\n            if (requiredQueues[i]) \n\t\t\t{\n                queueSupport &= (queueFamilyIndices[i] >= 0);\n            }\n        }\n\n        if (requiredQueues[QueueFlags::Present]) \n\t\t{\n            // Get basic surface capabilities\n            vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &surfaceCapabilities);\n\n            // Query supported surface formats\n            uint32_t formatCount;\n            vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr);\n\n            if (formatCount != 0) \n\t\t\t{\n                surfaceFormats.resize(formatCount);\n                vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, surfaceFormats.data());\n            }\n\n            // Query supported presentation modes\n            uint32_t presentModeCount;\n            vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, nullptr);\n\n            if (presentModeCount != 0) \n\t\t\t{\n                presentModes.resize(presentModeCount);\n                vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, presentModes.data());\n            }\n        }\n\n        if (queueSupport &&\n            checkDeviceExtensionSupport(device, deviceExtensions) &&\n            (!requiredQueues[QueueFlags::Present] || (!surfaceFormats.empty() && ! presentModes.empty()))\n\t\t   ) \n\t\t{\n            physicalDevice = device;\n            break;\n        }\n    }\n\n    this->deviceExtensions = deviceExtensions;\n    \n    if (physicalDevice == VK_NULL_HANDLE) \n\t{\n        throw std::runtime_error(\"Failed to find a suitable GPU\");\n    }\n\n    vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties);\n}\n\nVulkanDevice* VulkanInstance::CreateDevice(QueueFlagBits requiredQueues) \n{\n    std::set<int> uniqueQueueFamilies;\n    bool queueSupport = true;\n    for (unsigned int i = 0; i < requiredQueues.size(); ++i) \n\t{\n        if (requiredQueues[i]) \n\t\t{\n            queueSupport &= (queueFamilyIndices[i] >= 0);\n            uniqueQueueFamilies.insert(queueFamilyIndices[i]);\n        }\n    }\n\n    if (!queueSupport) \n\t{\n        throw std::runtime_error(\"Device does not support requested queues\");\n    }\n\n    std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;\n    float queuePriority = 1.0f;\n    for (int queueFamily : uniqueQueueFamilies) \n\t{\n        VkDeviceQueueCreateInfo queueCreateInfo = {};\n        queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;\n        queueCreateInfo.queueFamilyIndex = queueFamily;\n        queueCreateInfo.queueCount = 1;\n        queueCreateInfo.pQueuePriorities = &queuePriority;\n        queueCreateInfos.push_back(queueCreateInfo);\n    }\n\n    // --- Specify the set of device features used ---\n    VkPhysicalDeviceFeatures deviceFeatures = {};\n\tdeviceFeatures.samplerAnisotropy = VK_TRUE;\n\n    // --- Create logical device ---\n    VkDeviceCreateInfo createInfo = {};\n    createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;\n\n    createInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());\n    createInfo.pQueueCreateInfos = queueCreateInfos.data();\n\n    createInfo.pEnabledFeatures = &deviceFeatures;\n\n    // Enable device-specific extensions and validation layers\n    createInfo.enabledExtensionCount = static_cast<uint32_t>(deviceExtensions.size());\n    createInfo.ppEnabledExtensionNames = deviceExtensions.data();\n\n    if (ENABLE_VALIDATION) \n\t{\n        createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());\n        createInfo.ppEnabledLayerNames = validationLayers.data();\n    } \n\telse \n\t{\n        createInfo.enabledLayerCount = 0;\n    }\n\n    VkDevice vkDevice;\n    // Create logical device\n    if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &vkDevice) != VK_SUCCESS) \n\t{\n        throw std::runtime_error(\"Failed to create logical device\");\n    }\n\n    VulkanDevice::Queues queues;\n    for (unsigned int i = 0; i < requiredQueues.size(); ++i) \n\t{\n        if (requiredQueues[i]) \n\t\t{\n            vkGetDeviceQueue(vkDevice, queueFamilyIndices[i], 0, &queues[i]);\n        }\n    }\n\n    return new VulkanDevice(this, vkDevice, queues);\n}\n\nVulkanInstance::~VulkanInstance() \n{\n    if (ENABLE_VALIDATION) \n\t{\n        auto func = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(instance, \"vkDestroyDebugReportCallbackEXT\");\n        if (func != nullptr) \n\t\t{\n            func(instance, debugReportCallback, nullptr);\n        }\n    }\n\n    vkDestroyInstance(instance, nullptr);\n}"
  },
  {
    "path": "src/CloudScapes/VulkanInstance.h",
    "content": "#pragma once\n\n#include <vulkan/vulkan.h>\n#include <bitset>\n#include <vector>\n#include <stdexcept>\n#include <set>\n\n#include \"Forward.h\"\n#include \"VulkanDevice.h\"\n\nextern const bool ENABLE_VALIDATION;\n\nclass VulkanInstance \n{\npublic:\n    VulkanInstance() = delete;\n    VulkanInstance(const char* applicationName, unsigned int additionalExtensionCount = 0, const char** additionalExtensions = nullptr);\n\n    VkInstance GetVkInstance();\n    VkPhysicalDevice GetPhysicalDevice();\n    const QueueFamilyIndices& GetQueueFamilyIndices() const;\n    const VkSurfaceCapabilitiesKHR& GetSurfaceCapabilities() const;\n    const std::vector<VkSurfaceFormatKHR>& GetSurfaceFormats() const;\n    const std::vector<VkPresentModeKHR>& GetPresentModes() const;\n    \n    uint32_t GetMemoryTypeIndex(uint32_t types, VkMemoryPropertyFlags properties) const;\n\n    void PickPhysicalDevice(std::vector<const char*> deviceExtensions, QueueFlagBits requiredQueues, VkSurfaceKHR surface = VK_NULL_HANDLE);\n\n    VulkanDevice* CreateDevice(QueueFlagBits requiredQueues);\n\n    ~VulkanInstance();\n\nprivate:\n    void initDebugReport();\n\n    VkInstance instance;\n    VkDebugReportCallbackEXT debugReportCallback;\n    std::vector<const char*> deviceExtensions;\n    VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;\n    QueueFamilyIndices queueFamilyIndices;\n    VkSurfaceCapabilitiesKHR surfaceCapabilities;\n    std::vector<VkSurfaceFormatKHR> surfaceFormats;\n    std::vector<VkPresentModeKHR> presentModes;\n    VkPhysicalDeviceMemoryProperties deviceMemoryProperties;\n};"
  },
  {
    "path": "src/CloudScapes/camera.cpp",
    "content": "#include \"camera.h\"\n\nCamera::Camera(VulkanDevice* device, glm::vec3 eyePos, glm::vec3 lookAtPoint, int width, int height,\n\t\t\t   float foV_vertical, float aspectRatio, float nearClip, float farClip)\n\t: device(device), eyePos(eyePos), ref(lookAtPoint), width(width), height(height), \n\tfovy(foV_vertical), aspect(aspectRatio), near_clip(nearClip), far_clip(farClip)\n{\n\tworldUp = glm::vec3(0,1,0);\n\tRecomputeAttributes();\n\tUpdateBuffer();\n\tBufferUtils::CreateBuffer(device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(CameraUBO), \n\t\t\t\t\t\t\tVK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, \n\t\t\t\t\t\t\tbuffer, bufferMemory);\n\n\tvkMapMemory(device->GetVkDevice(), bufferMemory, 0, sizeof(CameraUBO), 0, &mappedData);\n\tmemcpy(mappedData, &cameraUBO, sizeof(CameraUBO));\n}\n\nCamera::~Camera() \n{\n\tvkUnmapMemory(device->GetVkDevice(), bufferMemory);\n\tvkDestroyBuffer(device->GetVkDevice(), buffer, nullptr);\n\tvkFreeMemory(device->GetVkDevice(), bufferMemory, nullptr);\n}\n\nVkBuffer Camera::GetBuffer() const \n{\n\treturn buffer;\n}\n\nvoid Camera::UpdateBuffer()\n{\n\tcameraUBO.view = GetView();\n\tcameraUBO.proj = GetProj();\n\t//Reason for flipping the y axis: https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/\n\tcameraUBO.proj[1][1] *= -1; // y-coordinate is flipped\n\n\tcameraUBO.eyePos = glm::vec4(eyePos, 1.0);\n\n\tcameraUBO.tanFovBy2.y = std::abs(std::tan(fovy*0.5 * (PI / 180.0)));\n\tcameraUBO.tanFovBy2.x = aspect * cameraUBO.tanFovBy2.y;\n}\nvoid Camera::UpdateBuffer(Camera* cam)\n{\n\tcameraUBO.view = cam->cameraUBO.view;\n\tcameraUBO.proj = cam->cameraUBO.proj;\n\tcameraUBO.eyePos = cam->cameraUBO.eyePos;\n\tcameraUBO.tanFovBy2 = cam->cameraUBO.tanFovBy2;\n}\nvoid Camera::CopyToGPUMemory()\n{\n\tmemcpy(mappedData, &cameraUBO, sizeof(CameraUBO));\n}\n\nglm::mat4 Camera::GetViewProj() const\n{\n\t//static casts\n\treturn glm::perspective(glm::radians(fovy), width / (float)height, near_clip, far_clip) * glm::lookAt(eyePos, ref, up);\n}\nglm::mat4 Camera::GetView() const\n{\n\treturn glm::lookAt(eyePos, ref, up);\n}\nglm::mat4 Camera::GetProj() const\n{\n\treturn glm::perspective(glm::radians(fovy), width / (float)height, near_clip, far_clip);\n}\nvoid Camera::RecomputeAttributes()\n{\n\tforward = glm::normalize(ref - eyePos);\n\tright = glm::normalize(glm::cross(forward, worldUp));\n\tup = glm::cross(right, forward);\n\n\tfloat tan_fovy = tan(glm::radians(fovy / 2));\n\tfloat len = glm::length(ref - eyePos);\n\taspect = width / (float)height;\n}\n\nvoid Camera::RotateAboutUp(float deg)\n{\n\tdeg = glm::radians(deg);\n\tglm::mat4 rotation = glm::rotate(glm::mat4(1.0f), deg, up);\n\tref = ref - eyePos;\n\tref = glm::vec3(rotation * glm::vec4(ref, 1));\n\tref = ref + eyePos;\n\tRecomputeAttributes();\n}\nvoid Camera::RotateAboutRight(float deg)\n{\n\tdeg = glm::radians(deg);\n\tglm::mat4 rotation = glm::rotate(glm::mat4(1.0f), deg, right);\n\tref = ref - eyePos;\n\tref = glm::vec3(rotation * glm::vec4(ref, 1));\n\tref = ref + eyePos;\n\tRecomputeAttributes();\n}\n\nvoid Camera::TranslateAlongLook(float amt)\n{\n\tglm::vec3 translation = forward * amt;\n\teyePos += translation;\n\tref += translation;\n\tRecomputeAttributes();\n}\nvoid Camera::TranslateAlongRight(float amt)\n{\n\tglm::vec3 translation = right * amt;\n\teyePos += translation;\n\tref += translation;\n\tRecomputeAttributes();\n}\nvoid Camera::TranslateAlongUp(float amt)\n{\n\tglm::vec3 translation = up * amt;\n\teyePos += translation;\n\tref += translation;\n\tRecomputeAttributes();\n}"
  },
  {
    "path": "src/CloudScapes/camera.h",
    "content": "#pragma once\n\n#define GLM_FORCE_RADIANS\n#define GLM_FORCE_DEPTH_ZERO_TO_ONE\n#include <glm/gtc/matrix_transform.hpp>\n#include <glm/glm.hpp>\n#include \"VulkanDevice.h\"\n#include \"BufferUtils.h\"\n\n#define PI 3.14159\n\nstruct CameraUBO {\n\tglm::mat4 view;\n\tglm::mat4 proj;\n\tglm::vec4 eyePos; //pad vec3s with extra float to make them vec4s so vulkan can do offsets correctly\n\tglm::vec2 tanFovBy2; //vec2 and vec4 are acceptable for offseting; \n\t//stored as .x = horizontalFovBy2 and .y = verticalFovBy2\n};\n\nclass Camera \n{\npublic:\n\tCamera() = delete;\t// https://stackoverflow.com/questions/5513881/meaning-of-delete-after-function-declaration\n\tCamera(VulkanDevice* device, glm::vec3 eyePos, glm::vec3 ref, int width, int height,\n\t\t   float foV_vertical, float aspectRatio, float nearClip, float farClip);\n\t~Camera();\n\n\tVkBuffer GetBuffer() const;\n\tvoid UpdateBuffer();\n\tvoid UpdateBuffer(Camera* cam);\n\tvoid CopyToGPUMemory();\n\n\tglm::mat4 GetView() const;\n\tglm::mat4 GetProj() const;\n\tglm::mat4 GetViewProj() const;\n\tvoid RecomputeAttributes();\n\n\tvoid RotateAboutUp(float deg);\n\tvoid RotateAboutRight(float deg);\n\n\tvoid TranslateAlongLook(float amt);\n\tvoid TranslateAlongRight(float amt);\n\tvoid TranslateAlongUp(float amt);\n\nprivate:\n\tVulkanDevice* device; //member variable because it is needed for the destructor\n\n\tCameraUBO cameraUBO;\n\tVkBuffer buffer;\n\tVkDeviceMemory bufferMemory;\n\n\tvoid* mappedData;\n\n\tglm::vec3 eyePos;\n\tglm::vec3 ref;      //The point in world space towards which the camera is pointing\n\n\tglm::vec3 forward;\n\tglm::vec3 right;\n\tglm::vec3 up;\n\tglm::vec3 worldUp;\n\n\tint width, height;\n\n\tfloat fovy;\n\tfloat aspect;\n\tfloat near_clip;  // Near clip plane distance\n\tfloat far_clip;  // Far clip plane distance\n};"
  },
  {
    "path": "src/CloudScapes/forward.h",
    "content": "#pragma once\n\n#include <bitset>\n#include <array>\n\nenum QueueFlags {\n  Graphics,\n  Compute,\n  Transfer,\n  Present,\n};\n\nenum QueueFlagBit {\n    GraphicsBit = 1 << 0,\n    ComputeBit =  1 << 1,\n    TransferBit = 1 << 2,\n    PresentBit =  1 << 3,\n};\n\nusing QueueFlagBits = std::bitset<sizeof(QueueFlags)>;\nusing QueueFamilyIndices = std::array<int, sizeof(QueueFlags)>;\n\nclass VulkanInstance;\nclass VulkanDevice;\nclass VulkanSwapChain;"
  },
  {
    "path": "src/CloudScapes/main.cpp",
    "content": "#pragma once\n\n#define GLM_FORCE_RADIANS\n#define GLM_FORCE_DEPTH_ZERO_TO_ONE\n\n#include <vulkan/vulkan.h>\n#include \"VulkanInstance.h\"\n#include \"Window.h\"\n#include \"Renderer.h\"\n\n#include \"Scene.h\"\n#include \"Camera.h\"\n#include \"Image.h\"\n\nVulkanDevice* device; // manages both the logical device (VkDevice) and the physical Device (VkPhysicalDevice)\nVulkanSwapChain* swapChain;\nRenderer* renderer;\n\nCamera* camera;\nCamera* cameraOld;\n\nint window_height = 720; //1080;//\nint window_width = 1284; // 1280; //1920;//\n\nnamespace \n{\n\tvoid resizeCallback(GLFWwindow* window, int width, int height) \n\t{\n\t\tif (width == 0 || height == 0) return;\n\n\t\tvkDeviceWaitIdle(device->GetVkDevice());\n\t\tswapChain->Recreate(width, height);\n\t\trenderer->RecreateOnResize(width, height);\n\t}\n\n\tbool leftMouseDown = false;\n\tdouble previousX = 0.0f;\n\tdouble previousY = 0.0f;\n\tfloat deltaForRotation = 0.25f;\n\tfloat deltaForMovement = 10.0f;\n\n\tvoid keyboardInputs(GLFWwindow* window)\n\t{\n\t\tif (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {\n\t\t\tglfwSetWindowShouldClose(window, true);\n\t\t}\n\n\t\t//Commented out for now --> maybe for ever--> not useful in demo --> can cause really whack behaviour if movement delta is high --> if putting back in reduce deltaMovement\n\t\t//if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {\n\t\t//\tcamera->TranslateAlongLook(deltaForMovement);\n\t\t//}\t\t\t\n\t\t//if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {\n\t\t//\tcamera->TranslateAlongLook(-deltaForMovement);\n\t\t//}\n\n\t\t//if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {\n\t\t//\tcamera->TranslateAlongRight(-deltaForMovement);\n\t\t//}\n\t\t//if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {\n\t\t//\tcamera->TranslateAlongRight(deltaForMovement);\n\t\t//}\t\t\t\n\n\t\t//if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) {\n\t\t//\tcamera->TranslateAlongUp(deltaForMovement);\n\t\t//}\t\t\n\t\t//if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) {\n\t\t//\tcamera->TranslateAlongUp(-deltaForMovement);\n\t\t//}\n\n\t\tif (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) {\n\t\t\tcamera->RotateAboutRight(deltaForRotation);\n\t\t}\n\t\tif (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) {\n\t\t\tcamera->RotateAboutRight(-deltaForRotation);\n\t\t}\n\t\tif (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) {\n\t\t\tcamera->RotateAboutUp(deltaForRotation);\n\t\t}\n\t\tif (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS) {\n\t\t\tcamera->RotateAboutUp(-deltaForRotation);\n\t\t}\n\n\t\tcamera->UpdateBuffer();\n\t\tcamera->CopyToGPUMemory();\n\t}\n\t\n\tvoid mouseDownCallback(GLFWwindow* window, int button, int action, int mods) \n\t{\n\t\tif (button == GLFW_MOUSE_BUTTON_LEFT) {\n\t\t\tif (action == GLFW_PRESS) {\n\t\t\t\tleftMouseDown = true;\n\t\t\t\tglfwGetCursorPos(window, &previousX, &previousY);\n\t\t\t}\n\t\t\telse if (action == GLFW_RELEASE) {\n\t\t\t\tleftMouseDown = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid mouseMoveCallback(GLFWwindow* window, double xPosition, double yPosition) \n\t{\n\t\tif (leftMouseDown) \n\t\t{\n\t\t\tdouble sensitivity = 0.1;\n\t\t\tfloat deltaX = static_cast<float>((previousX - xPosition) * sensitivity);\n\t\t\tfloat deltaY = static_cast<float>((previousY - yPosition) * sensitivity);\n\t\t\tpreviousX = xPosition;\n\t\t\tpreviousY = yPosition;\n\n\t\t\tcamera->RotateAboutUp(deltaX);\n\t\t\tcamera->RotateAboutRight(deltaY);\n\n\t\t\tcamera->UpdateBuffer();\n\t\t\tcamera->CopyToGPUMemory();\n\t\t}\n\t}\n\n\tvoid scrollCallback(GLFWwindow*, double, double yoffset)\n\t{\n\t\tcamera->TranslateAlongLook(static_cast<float>(yoffset) * 0.05f);\n\t\tcamera->UpdateBuffer();\n\t\tcamera->CopyToGPUMemory();\n\t}\n}\n\nint main(int argc, char** argv) \n{\n    static constexpr char* applicationName = \"Meteoros\";\n    InitializeWindow(window_width, window_height, applicationName);\n\n    unsigned int glfwExtensionCount = 0;\n    const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);\n\n\t// Vulkan Instance\n\tVulkanInstance* instance = new VulkanInstance(applicationName, glfwExtensionCount, glfwExtensions);\n\n\t// Drawing Surface, i.e. window where things are rendered to\n    VkSurfaceKHR surface;\n    if (glfwCreateWindowSurface(instance->GetVkInstance(), GetGLFWWindow(), nullptr, &surface) != VK_SUCCESS) {\n        throw std::runtime_error(\"Failed to create window surface\");\n    }\n\n\t// physical Device --> GPU\n\t// TransferBit tells Vulkan that we can transfer data between CPU and GPU\n    instance->PickPhysicalDevice({ VK_KHR_SWAPCHAIN_EXTENSION_NAME }, \n\t\t\t\t\t\t\t\t QueueFlagBit::GraphicsBit | QueueFlagBit::TransferBit | QueueFlagBit::ComputeBit | QueueFlagBit::PresentBit, \n\t\t\t\t\t\t\t\t surface);\n\n\t// Device --> Logical Device: Communicates with the Physical Device and generally acts as an interface to the Physical device\n\t// Reference: https://vulkan-tutorial.com/Drawing_a_triangle/Presentation\n\t// QueueFlagBit::PresentBit --> Vulkan is trying to determine if the Queue we  will setup to send commands through can \n\t// actually 'present' images, i.e display them\n\t// QueueFlagBit::PresentBit --> Vulkan is trying to determine if we can make use of the window surface we just created, i.e. draw on the window\n    device = instance->CreateDevice(QueueFlagBit::GraphicsBit | QueueFlagBit::TransferBit | QueueFlagBit::ComputeBit | QueueFlagBit::PresentBit);\n    \n\tswapChain = device->CreateSwapChain(surface, window_width, window_height);\n\tcamera = new Camera(device, glm::vec3(0.0f, 0.0f, 2.0f), glm::vec3(0.0f, 0.0f, 1.0f), \n\t\t\t\t\t\twindow_width, window_height, 45.0f, window_width / window_height, 0.1f, 1000.0f);\n\tcameraOld = new Camera(device, glm::vec3(0.0f, 0.0f, 2.0f), glm::vec3(0.0f, 0.0f, 1.0f),\n\t\t\t\t\t\twindow_width, window_height, 45.0f, window_width / window_height, 0.1f, 1000.0f);\n\tScene* scene = new Scene(device);\n\tSky* sky = new Sky(device, device->GetVkDevice());\n\trenderer = new Renderer(device, instance->GetPhysicalDevice(), swapChain, scene, sky, camera, cameraOld, static_cast<uint32_t>(window_width), static_cast<uint32_t>(window_height));\n\n\tglfwSetWindowSizeCallback(GetGLFWWindow(), resizeCallback);\n\tglfwSetMouseButtonCallback(GetGLFWWindow(), mouseDownCallback);\n\tglfwSetScrollCallback(GetGLFWWindow(), scrollCallback);\n\tglfwSetCursorPosCallback(GetGLFWWindow(), mouseMoveCallback);\n\t\n\tint x = 0;\n\t// Reference: https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation\n    while (!ShouldQuit()) \n\t{\n\t\t//Mouse inputs and window resize callbacks\n\t\tglfwPollEvents();\n\t\tkeyboardInputs(GetGLFWWindow());\n\t\t// Update Uniforms\n\t\tscene->UpdateTime();\n\t\tsky->UpdateSunAndSky();\n\t\tscene->UpdateKeyPressQuery();\n\n\t\trenderer->Frame();\n\n\t\t//Copy current camera data into cameraOld\n\t\tcameraOld->UpdateBuffer(camera);\n\t\tcameraOld->CopyToGPUMemory();\n\n\t\t// For slow motion stuff uncomment\n\t\t//for (int i = 0; i < 100000000; i++)\n\t\t//{\n\t\t//\tx += 1;\n\t\t//}\n\n    }// end while loop\n\n\t//---------------------\n\t//------ CleanUp ------\n\t//---------------------\n\t// Wait for the device to finish executing before cleanup\n\tvkDeviceWaitIdle(device->GetVkDevice());\n\n\tdelete renderer; \n\tdelete scene;\n\tdelete camera;\n\tdelete cameraOld;\n\n    delete swapChain;\n    vkDestroySurfaceKHR(instance->GetVkInstance(), surface, nullptr);\n    delete device;\n    delete instance;\n    DestroyWindow();\n}"
  },
  {
    "path": "src/CloudScapes/models/teapot.obj",
    "content": "v -3.000000 1.800000 0.000000\nv -2.991600 1.800000 -0.081000\nv -2.991600 1.800000 0.081000\nv -2.989450 1.666162 0.000000\nv -2.985000 1.921950 0.000000\nv -2.985000 1.921950 0.000000\nv -2.981175 1.667844 -0.081000\nv -2.981175 1.667844 0.081000\nv -2.976687 1.920243 -0.081000\nv -2.976687 1.920243 0.081000\nv -2.968800 1.800000 -0.144000\nv -2.968800 1.800000 0.144000\nv -2.958713 1.672406 -0.144000\nv -2.958713 1.672406 0.144000\nv -2.957600 1.534800 0.000000\nv -2.957600 1.534800 0.000000\nv -2.954122 1.915609 -0.144000\nv -2.954122 1.915609 0.144000\nv -2.949693 1.537790 -0.081000\nv -2.949693 1.537790 0.081000\nv -2.940000 2.019600 0.000000\nv -2.935200 1.800000 -0.189000\nv -2.935200 1.800000 0.189000\nv -2.931958 2.016526 0.081000\nv -2.931958 2.016526 -0.081000\nv -2.928230 1.545907 -0.144000\nv -2.928230 1.545907 0.144000\nv -2.925611 1.679131 -0.189000\nv -2.925611 1.679131 0.189000\nv -2.920870 1.908779 -0.189000\nv -2.920870 1.908779 0.189000\nv -2.910131 2.008181 -0.144000\nv -2.910131 2.008181 0.144000\nv -2.904150 1.406137 0.000000\nv -2.904150 1.406137 0.000000\nv -2.896846 1.410135 0.081000\nv -2.896846 1.410135 -0.081000\nv -2.896602 1.557869 -0.189000\nv -2.896602 1.557869 0.189000\nv -2.894400 1.800000 -0.216000\nv -2.894400 1.800000 0.216000\nv -2.885416 1.687296 -0.216000\nv -2.885416 1.687296 0.216000\nv -2.880491 1.900487 -0.216000\nv -2.880491 1.900487 0.216000\nv -2.877965 1.995883 -0.189000\nv -2.877965 1.995883 0.189000\nv -2.877022 1.420985 -0.144000\nv -2.877022 1.420985 0.144000\nv -2.865000 2.095650 0.000000\nv -2.858195 1.572394 0.216000\nv -2.858195 1.572394 -0.216000\nv -2.857432 2.091511 -0.081000\nv -2.857432 2.091511 0.081000\nv -2.850000 1.800000 -0.225000\nv -2.850000 1.800000 0.225000\nv -2.847806 1.436974 0.189000\nv -2.847806 1.436974 -0.189000\nv -2.841675 1.696181 0.225000\nv -2.841675 1.696181 -0.225000\nv -2.838906 1.980950 -0.216000\nv -2.838906 1.980950 0.216000\nv -2.836889 2.080276 -0.144000\nv -2.836889 2.080276 0.144000\nv -2.836550 1.891463 -0.225000\nv -2.836550 1.891463 0.225000\nv -2.828800 1.280400 0.000000\nv -2.822326 1.285171 -0.081000\nv -2.822326 1.285171 0.081000\nv -2.816400 1.588200 -0.225000\nv -2.816400 1.588200 0.225000\nv -2.812331 1.456390 0.216000\nv -2.812331 1.456390 -0.216000\nv -2.806615 2.063720 -0.189000\nv -2.806615 2.063720 0.189000\nv -2.805600 1.800000 -0.216000\nv -2.805600 1.800000 0.216000\nv -2.804755 1.298122 -0.144000\nv -2.804755 1.298122 0.144000\nv -2.797934 1.705067 -0.216000\nv -2.797934 1.705067 0.216000\nv -2.796400 1.964700 0.225000\nv -2.796400 1.964700 -0.225000\nv -2.792609 1.882438 -0.216000\nv -2.792609 1.882438 0.216000\nv -2.778861 1.317206 -0.189000\nv -2.778861 1.317206 0.189000\nv -2.774605 1.604006 0.216000\nv -2.774605 1.604006 -0.216000\nv -2.773725 1.477519 0.225000\nv -2.773725 1.477519 -0.225000\nv -2.769854 2.043616 -0.216000\nv -2.769854 2.043616 0.216000\nv -2.764800 1.800000 -0.189000\nv -2.764800 1.800000 0.189000\nv -2.760000 2.152800 0.000000\nv -2.760000 2.152800 0.000000\nv -2.757739 1.713232 -0.189000\nv -2.757739 1.713232 0.189000\nv -2.753894 1.948450 -0.216000\nv -2.753894 1.948450 0.216000\nv -2.753123 2.147861 -0.081000\nv -2.753123 2.147861 0.081000\nv -2.752230 1.874146 -0.189000\nv -2.752230 1.874146 0.189000\nv -2.747418 1.340381 -0.216000\nv -2.747418 1.340381 0.216000\nv -2.736198 1.618531 -0.189000\nv -2.736198 1.618531 0.189000\nv -2.735119 1.498648 0.216000\nv -2.735119 1.498648 -0.216000\nv -2.734458 2.134454 -0.144000\nv -2.734458 2.134454 0.144000\nv -2.731250 1.157813 0.000000\nv -2.731250 1.157813 0.000000\nv -2.731200 1.800000 -0.144000\nv -2.731200 1.800000 0.144000\nv -2.729850 2.021737 -0.225000\nv -2.729850 2.021737 0.225000\nv -2.725825 1.163194 0.081000\nv -2.725825 1.163194 -0.081000\nv -2.724637 1.719956 -0.144000\nv -2.724637 1.719956 0.144000\nv -2.718978 1.867316 -0.144000\nv -2.718978 1.867316 0.144000\nv -2.714835 1.933517 -0.189000\nv -2.714835 1.933517 0.189000\nv -2.713200 1.365600 -0.225000\nv -2.713200 1.365600 0.225000\nv -2.711100 1.177800 -0.144000\nv -2.711100 1.177800 0.144000\nv -2.708400 1.800000 -0.081000\nv -2.708400 1.800000 0.081000\nv -2.706950 2.114698 -0.189000\nv -2.706950 2.114698 0.189000\nv -2.704570 1.630493 -0.144000\nv -2.704570 1.630493 0.144000\nv -2.702175 1.724519 -0.081000\nv -2.702175 1.724519 0.081000\nv -2.700000 1.800000 0.000000\nv -2.699644 1.518063 0.189000\nv -2.699644 1.518063 -0.189000\nv -2.696413 1.862682 -0.081000\nv -2.696413 1.862682 0.081000\nv -2.693900 1.726200 0.000000\nv -2.689846 1.999859 -0.216000\nv -2.689846 1.999859 0.216000\nv -2.689400 1.199325 -0.189000\nv -2.689400 1.199325 0.189000\nv -2.688100 1.860975 0.000000\nv -2.688100 1.860975 0.000000\nv -2.683107 1.638610 -0.081000\nv -2.683107 1.638610 0.081000\nv -2.682669 1.921219 -0.144000\nv -2.682669 1.921219 0.144000\nv -2.678982 1.390819 -0.216000\nv -2.678982 1.390819 0.216000\nv -2.675200 1.641600 0.000000\nv -2.675200 1.641600 0.000000\nv -2.673549 2.090707 -0.216000\nv -2.673549 2.090707 0.216000\nv -2.670428 1.534053 -0.144000\nv -2.670428 1.534053 0.144000\nv -2.663050 1.225463 -0.216000\nv -2.663050 1.225463 0.216000\nv -2.660842 1.912874 0.081000\nv -2.660842 1.912874 -0.081000\nv -2.653085 1.979755 -0.189000\nv -2.653085 1.979755 0.189000\nv -2.652800 1.909800 0.000000\nv -2.652800 1.909800 0.000000\nv -2.650604 1.544903 0.081000\nv -2.650604 1.544903 -0.081000\nv -2.647539 1.413994 -0.189000\nv -2.647539 1.413994 0.189000\nv -2.643300 1.548900 0.000000\nv -2.637200 2.064600 -0.225000\nv -2.637200 2.064600 0.225000\nv -2.634375 1.253906 0.225000\nv -2.634375 1.253906 -0.225000\nv -2.625000 2.193750 0.000000\nv -2.622811 1.963199 -0.144000\nv -2.622811 1.963199 0.144000\nv -2.621645 1.433078 -0.144000\nv -2.621645 1.433078 0.144000\nv -2.619050 2.188238 -0.081000\nv -2.619050 2.188238 0.081000\nv -2.611200 1.038600 0.000000\nv -2.611200 1.038600 0.000000\nv -2.607034 1.044497 0.081000\nv -2.607034 1.044497 -0.081000\nv -2.605700 1.282350 -0.216000\nv -2.605700 1.282350 0.216000\nv -2.604074 1.446029 -0.081000\nv -2.604074 1.446029 0.081000\nv -2.602900 2.173275 -0.144000\nv -2.602900 2.173275 0.144000\nv -2.602268 1.951964 -0.081000\nv -2.602268 1.951964 0.081000\nv -2.600851 2.038493 -0.216000\nv -2.600851 2.038493 0.216000\nv -2.597600 1.450800 0.000000\nv -2.595725 1.060502 -0.144000\nv -2.595725 1.060502 0.144000\nv -2.594700 1.947825 0.000000\nv -2.579350 1.308488 -0.189000\nv -2.579350 1.308488 0.189000\nv -2.579100 2.151225 -0.189000\nv -2.579100 2.151225 0.189000\nv -2.579059 1.084090 -0.189000\nv -2.579059 1.084090 0.189000\nv -2.567450 2.014502 -0.189000\nv -2.567450 2.014502 0.189000\nv -2.558822 1.112731 0.216000\nv -2.558822 1.112731 -0.216000\nv -2.557650 1.330013 -0.144000\nv -2.557650 1.330013 0.144000\nv -2.550200 2.124450 -0.216000\nv -2.550200 2.124450 0.216000\nv -2.542925 1.344619 0.081000\nv -2.542925 1.344619 -0.081000\nv -2.539942 1.994746 -0.144000\nv -2.539942 1.994746 0.144000\nv -2.537500 1.350000 0.000000\nv -2.537500 1.350000 0.000000\nv -2.536800 1.143900 0.225000\nv -2.536800 1.143900 -0.225000\nv -2.521277 1.981339 -0.081000\nv -2.521277 1.981339 0.081000\nv -2.518750 2.095312 -0.225000\nv -2.518750 2.095312 0.225000\nv -2.514778 1.175069 0.216000\nv -2.514778 1.175069 -0.216000\nv -2.514400 1.976400 0.000000\nv -2.514400 1.976400 0.000000\nv -2.494541 1.203710 -0.189000\nv -2.494541 1.203710 0.189000\nv -2.487300 2.066175 -0.216000\nv -2.487300 2.066175 0.216000\nv -2.477875 1.227298 -0.144000\nv -2.477875 1.227298 0.144000\nv -2.468350 0.922987 0.000000\nv -2.466566 1.243303 0.081000\nv -2.466566 1.243303 -0.081000\nv -2.465644 0.929375 -0.081000\nv -2.465644 0.929375 0.081000\nv -2.462400 1.249200 0.000000\nv -2.462400 1.249200 0.000000\nv -2.460000 2.221200 0.000000\nv -2.460000 2.221200 0.000000\nv -2.458400 2.039400 -0.189000\nv -2.458400 2.039400 0.189000\nv -2.458298 0.946711 -0.144000\nv -2.458298 0.946711 0.144000\nv -2.455229 2.215303 -0.081000\nv -2.455229 2.215303 0.081000\nv -2.447474 0.972260 0.189000\nv -2.447474 0.972260 -0.189000\nv -2.442278 2.199298 -0.144000\nv -2.442278 2.199298 0.144000\nv -2.434600 2.017350 -0.144000\nv -2.434600 2.017350 0.144000\nv -2.434329 1.003283 -0.216000\nv -2.434329 1.003283 0.216000\nv -2.423194 2.175710 -0.189000\nv -2.423194 2.175710 0.189000\nv -2.420025 1.037044 -0.225000\nv -2.420025 1.037044 0.225000\nv -2.418450 2.002387 -0.081000\nv -2.418450 2.002388 0.081000\nv -2.412500 1.996875 0.000000\nv -2.412500 1.996875 0.000000\nv -2.405721 1.070804 -0.216000\nv -2.405721 1.070804 0.216000\nv -2.400019 2.147069 -0.216000\nv -2.400019 2.147069 0.216000\nv -2.392576 1.101828 -0.189000\nv -2.392576 1.101828 0.189000\nv -2.381752 1.127376 -0.144000\nv -2.381752 1.127376 0.144000\nv -2.374800 2.115900 -0.225000\nv -2.374800 2.115900 0.225000\nv -2.374406 1.144713 0.081000\nv -2.374406 1.144713 -0.081000\nv -2.371700 1.151100 0.000000\nv -2.349581 2.084731 -0.216000\nv -2.349581 2.084731 0.216000\nv -2.326406 2.056090 -0.189000\nv -2.326406 2.056090 0.189000\nv -2.307322 2.032502 -0.144000\nv -2.307322 2.032502 0.144000\nv -2.302400 0.811200 0.000000\nv -2.302400 0.811200 0.000000\nv -2.301347 0.818122 0.081000\nv -2.301347 0.818122 -0.081000\nv -2.298490 0.836909 0.144000\nv -2.298490 0.836909 -0.144000\nv -2.294371 2.016497 -0.081000\nv -2.294371 2.016497 0.081000\nv -2.294278 0.864595 0.189000\nv -2.294278 0.864595 -0.189000\nv -2.289600 2.010600 0.000000\nv -2.289600 2.010600 0.000000\nv -2.289165 0.898214 0.216000\nv -2.289165 0.898214 -0.216000\nv -2.283600 0.934800 0.225000\nv -2.283600 0.934800 -0.225000\nv -2.278035 0.971386 0.216000\nv -2.278035 0.971386 -0.216000\nv -2.272922 1.005005 0.189000\nv -2.272922 1.005005 -0.189000\nv -2.268710 1.032691 -0.144000\nv -2.268710 1.032691 0.144000\nv -2.265853 1.051478 0.081000\nv -2.265853 1.051478 -0.081000\nv -2.265000 2.237850 0.000000\nv -2.264800 1.058400 0.000000\nv -2.264800 1.058400 0.000000\nv -2.261676 2.231720 -0.081000\nv -2.261676 2.231720 0.081000\nv -2.252655 2.215082 -0.144000\nv -2.252655 2.215082 0.144000\nv -2.239361 2.190562 -0.189000\nv -2.239361 2.190562 0.189000\nv -2.223218 2.160788 -0.216000\nv -2.223218 2.160788 0.216000\nv -2.205650 2.128387 0.225000\nv -2.205650 2.128388 -0.225000\nv -2.188082 2.095987 -0.216000\nv -2.188082 2.095987 0.216000\nv -2.171939 2.066213 -0.189000\nv -2.171939 2.066213 0.189000\nv -2.158645 2.041693 -0.144000\nv -2.158645 2.041693 0.144000\nv -2.149624 2.025055 -0.081000\nv -2.149624 2.025055 0.081000\nv -2.146300 2.018925 0.000000\nv -2.141100 0.973800 0.000000\nv -2.141100 0.973800 0.000000\nv -2.140315 0.966231 0.081000\nv -2.140315 0.966231 -0.081000\nv -2.138183 0.945685 0.144000\nv -2.138183 0.945685 -0.144000\nv -2.135041 0.915407 0.189000\nv -2.135041 0.915407 -0.189000\nv -2.131226 0.878641 0.216000\nv -2.131226 0.878641 -0.216000\nv -2.127075 0.838631 0.225000\nv -2.127075 0.838631 -0.225000\nv -2.122924 0.798621 0.216000\nv -2.122924 0.798621 -0.216000\nv -2.119109 0.761855 0.189000\nv -2.119109 0.761855 -0.189000\nv -2.115967 0.731578 0.144000\nv -2.115967 0.731578 -0.144000\nv -2.113835 0.711032 0.081000\nv -2.113835 0.711032 -0.081000\nv -2.113050 0.703463 0.000000\nv -2.113050 0.703463 0.000000\nv -2.040000 2.246400 0.000000\nv -2.040000 2.246400 0.000000\nv -2.038410 2.240150 -0.081000\nv -2.038410 2.240150 0.081000\nv -2.034093 2.223187 -0.144000\nv -2.034093 2.223187 0.144000\nv -2.027731 2.198189 -0.189000\nv -2.027731 2.198189 0.189000\nv -2.020006 2.167834 0.216000\nv -2.020006 2.167834 -0.216000\nv -2.011600 2.134800 0.225000\nv -2.011600 2.134800 -0.225000\nv -2.003194 2.101766 0.216000\nv -2.003194 2.101766 -0.216000\nv -2.000000 0.900000 0.000000\nv -2.000000 0.900000 0.000000\nv -2.000000 0.900000 0.000000\nv -1.997200 0.891600 0.081000\nv -1.997200 0.891600 -0.081000\nv -1.995469 2.071411 -0.189000\nv -1.995469 2.071411 0.189000\nv -1.992750 1.037175 -0.000000\nv -1.992750 1.037175 0.000000\nv -1.989600 0.868800 0.144000\nv -1.989600 0.868800 -0.144000\nv -1.989107 2.046413 0.144000\nv -1.989107 2.046413 -0.144000\nv -1.986000 0.771675 0.000000\nv -1.986000 0.771675 0.000000\nv -1.984790 2.029450 -0.081000\nv -1.984790 2.029450 0.081000\nv -1.983200 2.023200 0.000000\nv -1.983200 2.023200 0.000000\nv -1.978400 0.835200 0.189000\nv -1.978400 0.835200 -0.189000\nv -1.974240 0.900000 -0.328160\nv -1.974240 0.900000 -0.328160\nv -1.974240 0.900000 0.328160\nv -1.972000 1.178400 -0.000000\nv -1.972000 1.178400 0.000000\nv -1.967083 1.037175 -0.326970\nv -1.967083 1.037175 0.326970\nv -1.964800 0.794400 0.216000\nv -1.964800 0.794400 -0.216000\nv -1.960420 0.771675 -0.325863\nv -1.960420 0.771675 0.325863\nv -1.950000 0.750000 -0.225000\nv -1.950000 0.750000 0.225000\nv -1.948000 0.656400 0.000000\nv -1.948000 0.656400 0.000000\nv -1.946601 1.178400 -0.323566\nv -1.946601 1.178400 0.323566\nv -1.939250 1.323225 0.000000\nv -1.939250 1.323225 0.000000\nv -1.935200 0.705600 0.216000\nv -1.935200 0.705600 -0.216000\nv -1.922910 0.656400 -0.319628\nv -1.922910 0.656400 0.319628\nv -1.921600 0.664800 0.189000\nv -1.921600 0.664800 -0.189000\nv -1.914272 1.323225 -0.318192\nv -1.914272 1.323225 0.318192\nv -1.910400 0.631200 0.144000\nv -1.910400 0.631200 -0.144000\nv -1.902800 0.608400 0.081000\nv -1.902800 0.608400 -0.081000\nv -1.900000 0.600000 0.000000\nv -1.900000 0.600000 0.000000\nv -1.899520 0.900000 -0.638080\nv -1.899520 0.900000 -0.638080\nv -1.899520 0.900000 0.638080\nv -1.899520 0.900000 0.638080\nv -1.896000 1.471200 0.000000\nv -1.896000 1.471200 0.000000\nv -1.892634 1.037175 -0.635767\nv -1.892634 1.037175 0.635767\nv -1.892000 0.553725 0.000000\nv -1.892000 0.553725 0.000000\nv -1.886223 0.771675 -0.633613\nv -1.886223 0.771675 0.633613\nv -1.872927 1.178400 -0.629147\nv -1.872927 1.178400 0.629147\nv -1.871580 1.471200 -0.311096\nv -1.871580 1.471200 0.311096\nv -1.867631 0.553725 -0.310439\nv -1.867631 0.553725 0.310439\nv -1.850132 0.656400 -0.621490\nv -1.850132 0.656400 0.621490\nv -1.843750 1.621875 0.000000\nv -1.843750 1.621875 0.000000\nv -1.841822 1.323225 -0.618698\nv -1.841822 1.323225 0.618698\nv -1.824000 0.463200 -0.000000\nv -1.824000 0.463200 0.000000\nv -1.820003 1.621875 -0.302522\nv -1.820003 1.621875 0.302523\nv -1.800900 2.024775 0.000000\nv -1.800745 1.471200 -0.604900\nv -1.800745 1.471200 0.604900\nv -1.800507 0.463200 -0.299282\nv -1.800507 0.463200 0.299282\nv -1.800455 2.031069 -0.081000\nv -1.800455 2.031069 0.081000\nv -1.799246 2.048152 -0.144000\nv -1.799246 2.048152 0.144000\nv -1.797466 2.073326 -0.189000\nv -1.797466 2.073326 0.189000\nv -1.796946 0.553725 -0.603624\nv -1.796946 0.553725 0.603624\nv -1.795303 2.103896 -0.216000\nv -1.795303 2.103896 0.216000\nv -1.792950 2.137163 -0.225000\nv -1.792950 2.137163 0.225000\nv -1.790597 2.170429 -0.216000\nv -1.790597 2.170429 0.216000\nv -1.788434 2.200999 -0.189000\nv -1.788434 2.200999 0.189000\nv -1.786654 2.226173 -0.144000\nv -1.786654 2.226173 0.144000\nv -1.785445 2.243256 -0.081000\nv -1.785445 2.243256 0.081000\nv -1.785000 2.249550 0.000000\nv -1.784000 1.774800 -0.000000\nv -1.784000 1.774800 0.000000\nv -1.779680 0.900000 -0.925920\nv -1.779680 0.900000 -0.925920\nv -1.779680 0.900000 0.925920\nv -1.779680 0.900000 0.925920\nv -1.773229 1.037175 -0.922564\nv -1.773229 1.037175 0.922564\nv -1.767222 0.771675 -0.919439\nv -1.767222 0.771675 0.919439\nv -1.761022 1.774800 -0.292719\nv -1.761022 1.774800 0.292719\nv -1.754764 1.178400 -0.912957\nv -1.754764 1.178400 0.912957\nv -1.751120 1.621875 -0.588230\nv -1.751120 1.621875 0.588230\nv -1.750000 0.384375 -0.000000\nv -1.750000 0.384375 0.000000\nv -1.733408 0.656400 -0.901846\nv -1.733408 0.656400 0.901846\nv -1.732362 0.463200 -0.581929\nv -1.732362 0.463200 0.581929\nv -1.727460 0.384375 -0.287140\nv -1.727460 0.384375 0.287140\nv -1.725622 1.323225 -0.897795\nv -1.725622 1.323225 0.897795\nv -1.718250 1.929525 -0.000000\nv -1.718250 1.929525 0.000000\nv -1.696119 1.929525 -0.281930\nv -1.696119 1.929525 0.281930\nv -1.694372 1.774800 -0.569167\nv -1.694372 1.774800 0.569167\nv -1.687137 1.471200 -0.877772\nv -1.687137 1.471200 0.877772\nv -1.683577 0.553725 -0.875920\nv -1.683577 0.553725 0.875920\nv -1.676000 0.316800 0.000000\nv -1.676000 0.316800 0.000000\nv -1.662080 0.384375 -0.558320\nv -1.662080 0.384375 0.558320\nv -1.654413 0.316800 -0.274998\nv -1.654413 0.316800 0.274998\nv -1.648000 2.085600 0.000000\nv -1.648000 2.085600 0.000000\nv -1.640643 1.621875 -0.853583\nv -1.640643 1.621875 0.853583\nv -1.631925 1.929525 -0.548190\nv -1.631925 1.929525 0.548190\nv -1.626774 2.085600 -0.270404\nv -1.626774 2.085600 0.270404\nv -1.623068 0.463200 -0.844439\nv -1.623068 0.463200 0.844439\nv -1.618560 0.900000 -1.187840\nv -1.618560 0.900000 -1.187840\nv -1.618560 0.900000 1.187840\nv -1.618560 0.900000 1.187840\nv -1.612693 1.037175 -1.183534\nv -1.612693 1.037175 1.183534\nv -1.608000 0.260025 -0.000000\nv -1.608000 0.260025 0.000000\nv -1.607230 0.771675 -1.179525\nv -1.607230 0.771675 1.179525\nv -1.600000 2.025000 0.000000\nv -1.597200 2.031300 -0.081000\nv -1.597200 2.031300 0.081000\nv -1.595900 1.178400 -1.171210\nv -1.595900 1.178400 1.171210\nv -1.591798 0.316800 -0.534711\nv -1.591798 0.316800 0.534711\nv -1.589600 2.048400 -0.144000\nv -1.589600 2.048400 0.144000\nv -1.587475 1.774800 -0.825921\nv -1.587475 1.774800 0.825921\nv -1.587289 0.260025 0.263841\nv -1.587289 0.260025 -0.263841\nv -1.578400 2.073600 -0.189000\nv -1.578400 2.073600 0.189000\nv -1.576477 0.656400 -1.156956\nv -1.576477 0.656400 1.156956\nv -1.574750 2.242575 0.000000\nv -1.574750 2.242575 0.000000\nv -1.569396 1.323225 -1.151759\nv -1.569396 1.323225 1.151759\nv -1.565204 2.085600 -0.525778\nv -1.565204 2.085600 0.525778\nv -1.564800 2.104200 -0.216000\nv -1.564800 2.104200 0.216000\nv -1.557220 0.384375 -0.810180\nv -1.557220 0.384375 0.810180\nv -1.554467 2.242575 -0.258385\nv -1.554467 2.242575 0.258385\nv -1.552000 0.213600 0.000000\nv -1.552000 0.213600 0.000000\nv -1.550000 2.137500 -0.225000\nv -1.550000 2.137500 0.225000\nv -1.535200 2.170800 -0.216000\nv -1.535200 2.170800 0.216000\nv -1.534395 1.471200 -1.126072\nv -1.534395 1.471200 1.126072\nv -1.532010 0.213600 0.254652\nv -1.532010 0.213600 -0.254652\nv -1.531158 0.553725 -1.123697\nv -1.531158 0.553725 1.123697\nv -1.528968 1.929525 -0.795481\nv -1.528968 1.929525 0.795481\nv -1.527214 0.260025 -0.513016\nv -1.527214 0.260025 0.513016\nv -1.521600 2.201400 -0.189000\nv -1.521600 2.201400 0.189000\nv -1.514000 0.177075 0.000000\nv -1.514000 0.177075 0.000000\nv -1.510400 2.226600 -0.144000\nv -1.510400 2.226600 0.144000\nv -1.502800 2.243700 -0.081000\nv -1.502800 2.243700 0.081000\nv -1.500000 2.400000 0.000000\nv -1.500000 0.150000 0.000000\nv -1.500000 2.250000 0.000000\nv -1.500000 2.400000 0.000000\nv -1.500000 0.150000 0.000000\nv -1.496475 0.127575 -0.000000\nv -1.496475 0.127575 0.000000\nv -1.495635 2.242575 -0.502408\nv -1.495635 2.242575 0.502408\nv -1.494500 0.177075 0.248417\nv -1.494500 0.177075 -0.248417\nv -1.492110 1.621875 -1.095040\nv -1.492110 1.621875 1.095040\nv -1.491372 0.316800 -0.775921\nv -1.491372 0.316800 0.775921\nv -1.480800 0.105600 0.000000\nv -1.480800 0.105600 -0.000000\nv -1.480680 2.400000 -0.246120\nv -1.480680 0.150000 0.246120\nv -1.480680 2.400000 0.246120\nv -1.480680 0.150000 -0.246120\nv -1.480680 0.150000 -0.246120\nv -1.480680 0.150000 0.246120\nv -1.480325 2.435437 0.000000\nv -1.480325 2.435437 0.000000\nv -1.477200 0.127575 0.245542\nv -1.477200 0.127575 -0.245542\nv -1.476127 0.463200 -1.083310\nv -1.476127 0.463200 1.083310\nv -1.474028 0.213600 0.495150\nv -1.474028 0.213600 -0.495150\nv -1.466456 2.085600 -0.762958\nv -1.466456 2.085600 0.762958\nv -1.461727 0.105600 -0.242970\nv -1.461727 0.105600 0.242970\nv -1.461258 2.435437 -0.242892\nv -1.461258 2.435437 0.242892\nv -1.459600 2.463000 0.000000\nv -1.459600 2.463000 0.000000\nv -1.445325 0.084525 0.000000\nv -1.445325 0.084525 0.000000\nv -1.443756 1.774800 -1.059553\nv -1.443756 1.774800 1.059553\nv -1.440800 2.463000 -0.239491\nv -1.440800 2.463000 0.239491\nv -1.439025 2.482687 0.000000\nv -1.437937 0.177075 0.483027\nv -1.437937 0.177075 -0.483027\nv -1.430863 0.260025 0.744440\nv -1.430863 0.260025 -0.744440\nv -1.426709 0.084525 -0.237149\nv -1.426709 0.084525 0.237149\nv -1.424640 2.400000 -0.478560\nv -1.424640 0.150000 -0.478560\nv -1.424640 0.150000 -0.478560\nv -1.424640 0.150000 0.478560\nv -1.424640 0.150000 0.478560\nv -1.424640 2.400000 0.478560\nv -1.421292 0.127575 0.477435\nv -1.421292 0.127575 -0.477435\nv -1.420490 2.482687 -0.236115\nv -1.420490 2.482687 0.236115\nv -1.420000 0.900000 -1.420000\nv -1.420000 0.900000 -1.420000\nv -1.420000 0.900000 1.420000\nv -1.420000 0.900000 1.420000\nv -1.419800 2.494500 0.000000\nv -1.419800 2.494500 0.000000\nv -1.416240 0.384375 -1.039360\nv -1.416240 0.384375 1.039360\nv -1.414853 1.037175 -1.414853\nv -1.414853 1.037175 1.414853\nv -1.410060 0.771675 -1.410060\nv -1.410060 0.771675 1.410060\nv -1.406405 0.105600 -0.472434\nv -1.406405 0.105600 0.472434\nv -1.405953 2.435437 -0.472283\nv -1.405953 2.435437 0.472283\nv -1.403125 2.498438 0.000000\nv -1.403125 2.498438 0.000000\nv -1.401513 2.494500 -0.232961\nv -1.401513 2.494500 0.232961\nv -1.401276 2.242575 -0.729046\nv -1.401276 2.242575 0.729046\nv -1.400120 1.178400 -1.400120\nv -1.400120 1.178400 1.400120\nv -1.400000 2.400000 0.000000\nv -1.400000 2.400000 0.000000\nv -1.390545 1.929525 -1.020503\nv -1.390545 1.929525 1.020503\nv -1.390200 2.494500 0.000000\nv -1.390200 2.494500 0.000000\nv -1.386270 2.463000 -0.465671\nv -1.386270 2.463000 0.465671\nv -1.385925 2.435437 0.000000\nv -1.385925 2.435437 0.000000\nv -1.385053 2.498438 -0.230225\nv -1.385053 2.498438 0.230225\nv -1.383080 0.656400 -1.383080\nv -1.383080 0.656400 1.383080\nv -1.382400 0.064800 -0.000000\nv -1.382400 0.064800 0.000000\nv -1.382225 2.482687 -0.000000\nv -1.382225 2.482687 0.000000\nv -1.381968 2.400000 -0.229712\nv -1.381968 2.400000 0.229712\nv -1.381032 0.213600 0.718514\nv -1.381032 0.213600 -0.718514\nv -1.380400 2.463000 0.000000\nv -1.380400 2.463000 0.000000\nv -1.376868 1.323225 -1.376867\nv -1.376867 1.323225 1.376868\nv -1.372712 0.084525 -0.461116\nv -1.372712 0.084525 0.461116\nv -1.372294 2.494500 -0.228104\nv -1.372294 2.494500 0.228104\nv -1.368074 2.435437 -0.227403\nv -1.368074 2.435437 0.227403\nv -1.366728 2.482687 -0.459107\nv -1.366728 2.482687 0.459107\nv -1.364595 0.064800 -0.226824\nv -1.364595 0.064800 0.226824\nv -1.364422 2.482687 -0.226795\nv -1.364422 2.482687 0.226795\nv -1.362620 2.463000 -0.226496\nv -1.362620 2.463000 0.226496\nv -1.356353 0.316800 -0.995410\nv -1.356353 0.316800 0.995410\nv -1.348469 2.494500 -0.452973\nv -1.348469 2.494500 0.452973\nv -1.347218 0.177075 0.700921\nv -1.347218 0.177075 -0.700921\nv -1.346160 1.471200 -1.346160\nv -1.346160 1.471200 1.346160\nv -1.343320 0.553725 -1.343320\nv -1.343320 0.553725 1.343320\nv -1.334760 2.400000 -0.694440\nv -1.334760 0.150000 -0.694440\nv -1.334760 0.150000 0.694440\nv -1.334760 0.150000 0.694440\nv -1.334760 2.400000 0.694440\nv -1.334760 0.150000 -0.694440\nv -1.333693 2.085600 -0.978780\nv -1.333693 2.085600 0.978780\nv -1.332632 2.498438 -0.447653\nv -1.332632 2.498438 0.447653\nv -1.331623 0.127575 0.692808\nv -1.331623 0.127575 -0.692808\nv -1.329664 2.400000 -0.446656\nv -1.329664 2.400000 0.446656\nv -1.320356 2.494500 -0.443529\nv -1.320356 2.494500 0.443529\nv -1.317675 0.105600 -0.685551\nv -1.317675 0.105600 0.685551\nv -1.317252 2.435437 -0.685331\nv -1.317252 2.435437 0.685331\nv -1.316296 2.435437 -0.442166\nv -1.316296 2.435437 0.442166\nv -1.312948 0.064800 0.441041\nv -1.312948 0.064800 -0.441041\nv -1.312782 2.482687 -0.440985\nv -1.312782 2.482687 0.440985\nv -1.311049 2.463000 -0.440403\nv -1.311049 2.463000 0.440403\nv -1.309063 1.621875 -1.309063\nv -1.309063 1.621875 1.309063\nv -1.301322 0.260025 0.955023\nv -1.301322 0.260025 -0.955023\nv -1.300000 2.400000 0.000000\nv -1.300000 2.400000 0.000000\nv -1.298810 2.463000 -0.675736\nv -1.298810 2.463000 0.675736\nv -1.295040 0.463200 -1.295040\nv -1.295040 0.463200 1.295040\nv -1.286108 0.084525 -0.669128\nv -1.286108 0.084525 0.669128\nv -1.284375 0.046875 0.000000\nv -1.284375 0.046875 0.000000\nv -1.283256 2.400000 -0.213304\nv -1.283256 2.400000 0.213304\nv -1.280502 2.482687 -0.666211\nv -1.280502 2.482687 0.666211\nv -1.274600 2.440800 0.000000\nv -1.274600 2.440800 0.000000\nv -1.274414 2.242575 -0.935276\nv -1.274414 2.242575 0.935276\nv -1.267832 0.046875 -0.210740\nv -1.267832 0.046875 0.210740\nv -1.266640 1.774800 -1.266640\nv -1.266640 1.774800 1.266640\nv -1.263395 2.494500 -0.657311\nv -1.263395 2.494500 0.657311\nv -1.258183 2.440800 0.209136\nv -1.258183 2.440800 -0.209136\nv -1.256003 0.213600 0.921764\nv -1.256003 0.213600 -0.921764\nv -1.248557 2.498438 -0.649591\nv -1.248557 2.498438 0.649591\nv -1.245776 2.400000 -0.648144\nv -1.245776 2.400000 0.648144\nv -1.242500 0.384375 -1.242500\nv -1.242500 0.384375 1.242500\nv -1.237056 2.494500 -0.643607\nv -1.237056 2.494500 0.643607\nv -1.234688 2.400000 -0.414752\nv -1.234688 2.400000 0.414752\nv -1.233252 2.435437 -0.641628\nv -1.233252 2.435437 0.641628\nv -1.230115 0.064800 -0.639996\nv -1.230115 0.064800 0.639996\nv -1.229959 2.482687 -0.639915\nv -1.229959 2.482687 0.639915\nv -1.228335 2.463000 -0.639070\nv -1.228335 2.463000 0.639070\nv -1.225250 0.177075 0.899195\nv -1.225250 0.177075 -0.899195\nv -1.219958 1.929525 1.219958\nv -1.219958 1.929525 -1.219958\nv -1.219848 0.046875 -0.409767\nv -1.219848 0.046875 0.409767\nv -1.213920 2.400000 -0.890880\nv -1.213920 0.150000 -0.890880\nv -1.213920 0.150000 -0.890880\nv -1.213920 0.150000 0.890880\nv -1.213920 0.150000 0.890880\nv -1.213920 2.400000 0.890880\nv -1.211067 0.127575 0.888786\nv -1.211067 0.127575 -0.888786\nv -1.210564 2.440800 0.406648\nv -1.210564 2.440800 -0.406648\nv -1.204800 2.474400 0.000000\nv -1.204800 2.474400 0.000000\nv -1.198382 0.105600 -0.879477\nv -1.198382 0.105600 0.879477\nv -1.197997 2.435437 -0.879195\nv -1.197997 2.435437 0.879195\nv -1.189960 0.316800 -1.189960\nv -1.189960 0.316800 1.189960\nv -1.189282 2.474400 -0.197684\nv -1.189282 2.474400 0.197684\nv -1.187840 0.900000 -1.618560\nv -1.187840 0.900000 -1.618560\nv -1.187840 0.900000 1.618560\nv -1.187840 0.900000 1.618560\nv -1.183534 1.037175 -1.612693\nv -1.183534 1.037175 1.612693\nv -1.181225 2.463000 -0.866886\nv -1.181225 2.463000 0.866886\nv -1.179525 0.771675 -1.607230\nv -1.179525 0.771675 1.607230\nv -1.171210 1.178400 -1.595900\nv -1.171210 1.178400 1.595900\nv -1.170080 2.085600 -1.170080\nv -1.170080 2.085600 1.170080\nv -1.169673 0.084525 -0.858407\nv -1.169673 0.084525 0.858407\nv -1.164574 2.482687 -0.854666\nv -1.164574 2.482687 0.854666\nv -1.156956 0.656400 -1.576477\nv -1.156956 0.656400 1.576477\nv -1.156792 2.400000 -0.601848\nv -1.156792 2.400000 0.601848\nv -1.151759 1.323225 -1.569396\nv -1.151759 1.323225 1.569396\nv -1.149016 2.494500 -0.843248\nv -1.149016 2.494500 0.843248\nv -1.144271 2.474400 -0.384379\nv -1.144271 2.474400 0.384379\nv -1.143600 0.031200 0.000000\nv -1.143600 0.031200 0.000000\nv -1.142888 0.046875 -0.594614\nv -1.142888 0.046875 0.594614\nv -1.141680 0.260025 1.141680\nv -1.141680 0.260025 -1.141680\nv -1.135521 2.498438 -0.833344\nv -1.135521 2.498438 0.833344\nv -1.134190 2.440800 0.590089\nv -1.134190 2.440800 -0.590089\nv -1.132992 2.400000 -0.831488\nv -1.132992 2.400000 0.831488\nv -1.128870 0.031200 -0.187642\nv -1.128870 0.031200 0.187642\nv -1.126072 1.471200 -1.534395\nv -1.126072 1.471200 1.534395\nv -1.125061 2.494500 -0.825668\nv -1.125061 2.494500 0.825668\nv -1.123697 0.553725 -1.531158\nv -1.123697 0.553725 1.531158\nv -1.121601 2.435437 -0.823129\nv -1.121601 2.435437 0.823129\nv -1.118749 0.064800 -0.821035\nv -1.118749 0.064800 0.821035\nv -1.118607 2.482687 -0.820931\nv -1.118607 2.482687 0.820931\nv -1.118073 2.242575 -1.118073\nv -1.118073 2.242575 1.118073\nv -1.117130 2.463000 -0.819847\nv -1.117130 2.463000 0.819847\nv -1.101920 0.213600 1.101920\nv -1.101920 0.213600 -1.101920\nv -1.100200 2.502600 0.000000\nv -1.100200 2.502600 0.000000\nv -1.095040 1.621875 -1.492110\nv -1.095040 1.621875 1.492110\nv -1.086146 0.031200 0.364854\nv -1.086146 0.031200 -0.364854\nv -1.086029 2.502600 0.180521\nv -1.086029 2.502600 -0.180521\nv -1.083310 0.463200 -1.476127\nv -1.083310 0.463200 1.476127\nv -1.074940 0.177075 -1.074940\nv -1.074940 0.177075 1.074940\nv -1.072079 2.474400 -0.557774\nv -1.072079 2.474400 0.557774\nv -1.065000 2.400000 -1.065000\nv -1.065000 0.150000 -1.065000\nv -1.065000 0.150000 1.065000\nv -1.065000 2.400000 1.065000\nv -1.062497 0.127575 1.062497\nv -1.062497 0.127575 -1.062497\nv -1.059553 1.774800 -1.443756\nv -1.059553 1.774800 1.443756\nv -1.052064 2.400000 -0.772096\nv -1.052064 2.400000 0.772096\nv -1.051368 0.105600 -1.051368\nv -1.051368 0.105600 1.051368\nv -1.051031 2.435437 -1.051031\nv -1.051031 2.435437 1.051031\nv -1.044926 2.502600 -0.351008\nv -1.044926 2.502600 0.351008\nv -1.039419 0.046875 -0.762816\nv -1.039419 0.046875 0.762816\nv -1.039360 0.384375 -1.416240\nv -1.039360 0.384375 1.416240\nv -1.036316 2.463000 -1.036316\nv -1.036316 2.463000 1.036316\nv -1.031508 2.440800 0.757010\nv -1.031508 2.440800 -0.757010\nv -1.026181 0.084525 -1.026181\nv -1.026181 0.084525 1.026181\nv -1.021708 2.482687 -1.021708\nv -1.021708 2.482687 1.021708\nv -1.020503 1.929525 -1.390545\nv -1.020503 1.929525 1.390545\nv -1.017621 0.031200 0.529441\nv -1.017621 0.031200 -0.529441\nv -1.008058 2.494500 -1.008058\nv -1.008058 2.494500 1.008058\nv -0.996219 2.498438 -0.996219\nv -0.996219 2.498438 0.996219\nv -0.995410 0.316800 -1.356353\nv -0.995410 0.316800 1.356353\nv -0.994000 2.400000 -0.994000\nv -0.994000 2.400000 0.994000\nv -0.987042 2.494500 -0.987042\nv -0.987042 2.494500 0.987042\nv -0.984007 2.435437 -0.984007\nv -0.984007 2.435437 0.984007\nv -0.981504 0.064800 0.981504\nv -0.981504 0.064800 -0.981504\nv -0.981380 2.482687 -0.981380\nv -0.981380 2.482687 0.981380\nv -0.980084 2.463000 -0.980084\nv -0.980084 2.463000 0.980084\nv -0.979002 2.502600 0.509349\nv -0.979002 2.502600 -0.509349\nv -0.978780 2.085600 -1.333693\nv -0.978780 2.085600 1.333693\nv -0.975021 2.474400 -0.715555\nv -0.975021 2.474400 0.715555\nv -0.970400 2.527200 0.000000\nv -0.970400 2.527200 0.000000\nv -0.957901 2.527200 -0.159223\nv -0.957901 2.527200 0.159223\nv -0.955023 0.260025 1.301322\nv -0.955023 0.260025 -1.301322\nv -0.952425 0.018225 -0.000000\nv -0.952425 0.018225 0.000000\nv -0.940158 0.018225 0.156274\nv -0.940158 0.018225 -0.156274\nv -0.935276 2.242575 -1.274414\nv -0.935276 2.242575 1.274414\nv -0.925920 0.900000 -1.779680\nv -0.925920 0.900000 1.779680\nv -0.925920 0.900000 1.779680\nv -0.925920 0.900000 -1.779680\nv -0.925493 0.031200 0.679207\nv -0.925493 0.031200 -0.679207\nv -0.923000 2.400000 -0.923000\nv -0.923000 2.400000 0.923000\nv -0.922564 1.037175 1.773229\nv -0.922564 1.037175 -1.773229\nv -0.921764 0.213600 1.256003\nv -0.921764 0.213600 -1.256003\nv -0.921647 2.527200 -0.309596\nv -0.921647 2.527200 0.309596\nv -0.919439 0.771675 -1.767222\nv -0.919439 0.771675 1.767222\nv -0.912957 1.178400 -1.754764\nv -0.912957 1.178400 1.754764\nv -0.911906 0.046875 -0.911906\nv -0.911906 0.046875 0.911906\nv -0.904966 2.440800 0.904966\nv -0.904966 2.440800 -0.904966\nv -0.904575 0.018225 0.303862\nv -0.904575 0.018225 -0.303862\nv -0.901846 0.656400 -1.733408\nv -0.901846 0.656400 1.733408\nv -0.899195 0.177075 1.225250\nv -0.899195 0.177075 -1.225250\nv -0.897795 1.323225 -1.725622\nv -0.897795 1.323225 1.725622\nv -0.890880 0.150000 -1.213920\nv -0.890880 0.150000 1.213920\nv -0.890880 2.400000 -1.213920\nv -0.890880 0.150000 -1.213920\nv -0.890880 0.150000 1.213920\nv -0.890880 2.400000 1.213920\nv -0.890370 2.502600 -0.653431\nv -0.890370 2.502600 0.653431\nv -0.888786 0.127575 1.211067\nv -0.888786 0.127575 -1.211067\nv -0.879477 0.105600 -1.198382\nv -0.879477 0.105600 1.198382\nv -0.879195 2.435437 -1.197997\nv -0.879195 2.435437 1.197997\nv -0.877772 1.471200 -1.687137\nv -0.877772 1.471200 1.687137\nv -0.875920 0.553725 -1.683577\nv -0.875920 0.553725 1.683577\nv -0.866886 2.463000 -1.181225\nv -0.866886 2.463000 1.181225\nv -0.863501 2.527200 -0.449256\nv -0.863501 2.527200 0.449256\nv -0.858407 0.084525 -1.169673\nv -0.858407 0.084525 1.169673\nv -0.855408 2.474400 -0.855408\nv -0.855408 2.474400 0.855408\nv -0.854666 2.482687 -1.164574\nv -0.854666 2.482687 1.164574\nv -0.853583 1.621875 -1.640643\nv -0.853583 1.621875 1.640643\nv -0.847506 0.018225 -0.440935\nv -0.847506 0.018225 0.440935\nv -0.844439 0.463200 1.623068\nv -0.844439 0.463200 -1.623068\nv -0.843248 2.494500 -1.149016\nv -0.843248 2.494500 1.149016\nv -0.833344 2.498438 -1.135521\nv -0.833344 2.498438 1.135521\nv -0.831488 2.400000 -1.132992\nv -0.831488 2.400000 1.132992\nv -0.825921 1.774800 1.587475\nv -0.825921 1.774800 -1.587475\nv -0.825668 2.494500 -1.125061\nv -0.825668 2.494500 1.125061\nv -0.825000 2.550000 0.000000\nv -0.825000 2.550000 0.000000\nv -0.823129 2.435437 -1.121601\nv -0.823129 2.435437 1.121601\nv -0.821035 0.064800 1.118749\nv -0.821035 0.064800 -1.118749\nv -0.820931 2.482687 1.118607\nv -0.820931 2.482687 -1.118607\nv -0.819847 2.463000 -1.117130\nv -0.819847 2.463000 1.117130\nv -0.814374 2.550000 -0.135366\nv -0.814374 2.550000 0.135366\nv -0.811956 0.031200 0.811956\nv -0.811956 0.031200 -0.811956\nv -0.810180 0.384375 1.557220\nv -0.810180 0.384375 -1.557220\nv -0.795481 1.929525 1.528968\nv -0.795481 1.929525 -1.528968\nv -0.785325 2.527200 -0.576340\nv -0.785325 2.527200 0.576340\nv -0.783552 2.550000 -0.263208\nv -0.783552 2.550000 0.263208\nv -0.781142 2.502600 -0.781142\nv -0.781142 2.502600 0.781142\nv -0.775921 0.316800 -1.491372\nv -0.775921 0.316800 1.491372\nv -0.772096 2.400000 -1.052064\nv -0.772096 2.400000 1.052064\nv -0.770779 0.018225 0.565664\nv -0.770779 0.018225 -0.565664\nv -0.762958 2.085600 -1.466456\nv -0.762958 2.085600 1.466456\nv -0.762816 0.046875 -1.039419\nv -0.762816 0.046875 1.039419\nv -0.757010 2.440800 1.031508\nv -0.757010 2.440800 -1.031508\nv -0.744440 0.260025 1.430863\nv -0.744440 0.260025 -1.430863\nv -0.734118 2.550000 -0.381942\nv -0.734118 2.550000 0.381942\nv -0.729046 2.242575 -1.401276\nv -0.729046 2.242575 1.401276\nv -0.718514 0.213600 1.381032\nv -0.718514 0.213600 -1.381032\nv -0.715555 2.474400 -0.975021\nv -0.715555 2.474400 0.975021\nv -0.703200 0.008400 0.000000\nv -0.700921 0.177075 1.347218\nv -0.700921 0.177075 -1.347218\nv -0.694440 0.150000 -1.334760\nv -0.694440 0.150000 1.334760\nv -0.694440 2.400000 1.334760\nv -0.694440 0.150000 1.334760\nv -0.694440 2.400000 -1.334760\nv -0.694440 0.150000 -1.334760\nv -0.694143 0.008400 -0.115381\nv -0.694143 0.008400 0.115381\nv -0.692808 0.127575 1.331623\nv -0.692808 0.127575 -1.331623\nv -0.688984 2.527200 -0.688984\nv -0.688984 2.527200 0.688984\nv -0.685551 0.105600 -1.317675\nv -0.685551 0.105600 1.317675\nv -0.685331 2.435437 -1.317252\nv -0.685331 2.435437 1.317252\nv -0.679207 0.031200 -0.925493\nv -0.679207 0.031200 0.925493\nv -0.676222 0.018225 0.676222\nv -0.676222 0.018225 -0.676222\nv -0.675736 2.463000 -1.298810\nv -0.675736 2.463000 1.298810\nv -0.673600 2.572800 0.000000\nv -0.673600 2.572800 0.000000\nv -0.669128 0.084525 -1.286108\nv -0.669128 0.084525 1.286108\nv -0.667871 0.008400 -0.224349\nv -0.667871 0.008400 0.224349\nv -0.667656 2.550000 -0.489984\nv -0.667656 2.550000 0.489984\nv -0.666211 2.482687 1.280502\nv -0.666211 2.482687 -1.280502\nv -0.664924 2.572800 -0.110524\nv -0.664924 2.572800 0.110524\nv -0.657311 2.494500 -1.263395\nv -0.657311 2.494500 1.263395\nv -0.653431 2.502600 -0.890370\nv -0.653431 2.502600 0.890370\nv -0.649591 2.498438 -1.248557\nv -0.649591 2.498438 1.248557\nv -0.648144 2.400000 -1.245776\nv -0.648144 2.400000 1.245776\nv -0.643607 2.494500 -1.237056\nv -0.643607 2.494500 1.237056\nv -0.641628 2.435437 -1.233252\nv -0.641628 2.435437 1.233252\nv -0.639996 0.064800 -1.230115\nv -0.639996 0.064800 1.230115\nv -0.639915 2.482687 1.229959\nv -0.639915 2.482687 -1.229959\nv -0.639758 2.572800 -0.214905\nv -0.639758 2.572800 0.214905\nv -0.639070 2.463000 -1.228335\nv -0.639070 2.463000 1.228335\nv -0.638080 0.900000 -1.899520\nv -0.638080 0.900000 -1.899520\nv -0.638080 0.900000 1.899520\nv -0.638080 0.900000 1.899520\nv -0.635767 1.037175 -1.892634\nv -0.635767 1.037175 1.892634\nv -0.633613 0.771675 -1.886223\nv -0.633613 0.771675 1.886223\nv -0.629147 1.178400 -1.872927\nv -0.629147 1.178400 1.872927\nv -0.625735 0.008400 0.325553\nv -0.625735 0.008400 -0.325553\nv -0.621490 0.656400 -1.850132\nv -0.621490 0.656400 1.850132\nv -0.618698 1.323225 -1.841822\nv -0.618698 1.323225 1.841822\nv -0.604900 1.471200 -1.800745\nv -0.604900 1.471200 1.800745\nv -0.603624 0.553725 -1.796946\nv -0.603624 0.553725 1.796946\nv -0.601848 2.400000 -1.156792\nv -0.601848 2.400000 1.156792\nv -0.599396 2.572800 -0.311850\nv -0.599396 2.572800 0.311850\nv -0.594614 0.046875 -1.142888\nv -0.594614 0.046875 1.142888\nv -0.590089 2.440800 1.134190\nv -0.590089 2.440800 -1.134190\nv -0.588230 1.621875 -1.751120\nv -0.588230 1.621875 1.751120\nv -0.585750 2.550000 -0.585750\nv -0.585750 2.550000 0.585750\nv -0.581929 0.463200 -1.732362\nv -0.581929 0.463200 1.732362\nv -0.576340 2.527200 -0.785325\nv -0.576340 2.527200 0.785325\nv -0.569167 1.774800 -1.694372\nv -0.569167 1.774800 1.694372\nv -0.569086 0.008400 -0.417645\nv -0.569086 0.008400 0.417645\nv -0.565664 0.018225 0.770779\nv -0.565664 0.018225 -0.770779\nv -0.558320 0.384375 -1.662080\nv -0.558320 0.384375 1.662080\nv -0.557774 2.474400 -1.072079\nv -0.557774 2.474400 1.072079\nv -0.548190 1.929525 -1.631925\nv -0.548190 1.929525 1.631925\nv -0.545131 2.572800 -0.400065\nv -0.545131 2.572800 0.400065\nv -0.534711 0.316800 -1.591798\nv -0.534711 0.316800 1.591798\nv -0.529441 0.031200 -1.017621\nv -0.529441 0.031200 1.017621\nv -0.525800 2.597400 0.000000\nv -0.525800 2.597400 0.000000\nv -0.525778 2.085600 -1.565204\nv -0.525778 2.085600 1.565204\nv -0.519028 2.597400 0.086273\nv -0.519028 2.597400 -0.086273\nv -0.513016 0.260025 -1.527214\nv -0.513016 0.260025 1.527214\nv -0.509349 2.502600 0.979002\nv -0.509349 2.502600 -0.979002\nv -0.502408 2.242575 -1.495635\nv -0.502408 2.242575 1.495635\nv -0.499384 2.597400 -0.167751\nv -0.499384 2.597400 0.167751\nv -0.499272 0.008400 -0.499272\nv -0.499272 0.008400 0.499272\nv -0.495150 0.213600 -1.474028\nv -0.495150 0.213600 1.474028\nv -0.489984 2.550000 -0.667656\nv -0.489984 2.550000 0.667656\nv -0.483027 0.177075 -1.437937\nv -0.483027 0.177075 1.437937\nv -0.478560 0.150000 1.424640\nv -0.478560 2.400000 -1.424640\nv -0.478560 0.150000 -1.424640\nv -0.478560 0.150000 -1.424640\nv -0.478560 0.150000 1.424640\nv -0.478560 2.400000 1.424640\nv -0.478256 2.572800 -0.478256\nv -0.478256 2.572800 0.478256\nv -0.477435 0.127575 1.421292\nv -0.477435 0.127575 -1.421292\nv -0.472434 0.105600 1.406405\nv -0.472434 0.105600 -1.406405\nv -0.472283 2.435437 -1.405953\nv -0.472283 2.435437 1.405953\nv -0.467878 2.597400 -0.243424\nv -0.467878 2.597400 0.243424\nv -0.465671 2.463000 -1.386270\nv -0.465671 2.463000 1.386270\nv -0.461116 0.084525 1.372712\nv -0.461116 0.084525 -1.372712\nv -0.459107 2.482687 -1.366728\nv -0.459107 2.482687 1.366728\nv -0.452973 2.494500 -1.348469\nv -0.452973 2.494500 1.348469\nv -0.449256 2.527200 -0.863501\nv -0.449256 2.527200 0.863501\nv -0.447653 2.498438 -1.332632\nv -0.447653 2.498438 1.332632\nv -0.446656 2.400000 -1.329664\nv -0.446656 2.400000 1.329664\nv -0.443529 2.494500 -1.320356\nv -0.443529 2.494500 1.320356\nv -0.442166 2.435437 -1.316296\nv -0.442166 2.435437 1.316296\nv -0.441041 0.064800 1.312948\nv -0.441041 0.064800 -1.312948\nv -0.440985 2.482687 -1.312782\nv -0.440985 2.482687 1.312782\nv -0.440935 0.018225 0.847506\nv -0.440935 0.018225 -0.847506\nv -0.440403 2.463000 -1.311049\nv -0.440403 2.463000 1.311049\nv -0.425519 2.597400 0.312283\nv -0.425519 2.597400 -0.312283\nv -0.417645 0.008400 -0.569086\nv -0.417645 0.008400 0.569086\nv -0.414752 2.400000 -1.234688\nv -0.414752 2.400000 1.234688\nv -0.409767 0.046875 1.219848\nv -0.409767 0.046875 -1.219848\nv -0.406648 2.440800 -1.210564\nv -0.406648 2.440800 1.210564\nv -0.400065 2.572800 -0.545131\nv -0.400065 2.572800 0.545131\nv -0.391200 2.625600 0.000000\nv -0.391200 2.625600 0.000000\nv -0.388275 0.002175 -0.000000\nv -0.388275 0.002175 0.000000\nv -0.386161 2.625600 -0.064188\nv -0.386161 2.625600 0.064188\nv -0.384379 2.474400 -1.144271\nv -0.384379 2.474400 1.144271\nv -0.383274 0.002175 -0.063708\nv -0.383274 0.002175 0.063708\nv -0.381942 2.550000 -0.734118\nv -0.381942 2.550000 0.734118\nv -0.373318 2.597400 -0.373318\nv -0.373318 2.597400 0.373318\nv -0.371546 2.625600 -0.124808\nv -0.371546 2.625600 0.124808\nv -0.368768 0.002175 -0.123875\nv -0.368768 0.002175 0.123875\nv -0.364854 0.031200 1.086146\nv -0.364854 0.031200 -1.086146\nv -0.358400 3.034800 0.000000\nv -0.358400 3.034800 0.000000\nv -0.358200 3.081150 0.000000\nv -0.358200 3.081150 0.000000\nv -0.353807 3.034800 -0.059016\nv -0.353807 3.034800 0.059016\nv -0.353610 3.081150 -0.058988\nv -0.353610 3.081150 0.058988\nv -0.351008 2.502600 -1.044926\nv -0.351008 2.502600 1.044926\nv -0.348105 2.625600 -0.181110\nv -0.348105 2.625600 0.181110\nv -0.345503 0.002175 -0.179756\nv -0.345503 0.002175 0.179756\nv -0.340477 3.034800 -0.114676\nv -0.340477 3.034800 0.114676\nv -0.340289 3.081150 -0.114619\nv -0.340289 3.081150 0.114619\nv -0.328160 0.900000 -1.974240\nv -0.328160 0.900000 1.974240\nv -0.328160 0.900000 1.974240\nv -0.326970 1.037175 -1.967083\nv -0.326970 1.037175 1.967083\nv -0.325863 0.771675 -1.960420\nv -0.325863 0.771675 1.960420\nv -0.325553 0.008400 -0.625735\nv -0.325553 0.008400 0.625735\nv -0.325000 2.981250 0.000000\nv -0.325000 2.981250 0.000000\nv -0.323566 1.178400 -1.946601\nv -0.323566 1.178400 1.946601\nv -0.320834 2.981250 -0.053508\nv -0.320834 2.981250 0.053508\nv -0.319628 0.656400 -1.922910\nv -0.319628 0.656400 1.922910\nv -0.319082 3.034800 -0.166306\nv -0.319082 3.034800 0.166306\nv -0.318907 3.081150 -0.166221\nv -0.318907 3.081150 0.166221\nv -0.318192 1.323225 -1.914272\nv -0.318192 1.323225 1.914272\nv -0.316590 2.625600 -0.232342\nv -0.316590 2.625600 0.232342\nv -0.314223 0.002175 -0.230604\nv -0.314223 0.002175 0.230604\nv -0.312283 2.597400 -0.425519\nv -0.312283 2.597400 0.425519\nv -0.311850 2.572800 -0.599396\nv -0.311850 2.572800 0.599396\nv -0.311096 1.471200 -1.871580\nv -0.311096 1.471200 1.871580\nv -0.310439 0.553725 -1.867631\nv -0.310439 0.553725 1.867631\nv -0.309596 2.527200 -0.921647\nv -0.309596 2.527200 0.921647\nv -0.308800 3.117600 0.000000\nv -0.308800 3.117600 0.000000\nv -0.308744 2.981250 -0.103976\nv -0.308744 2.981250 0.103976\nv -0.304843 3.117600 -0.050855\nv -0.304843 3.117600 0.050855\nv -0.303862 0.018225 0.904575\nv -0.303862 0.018225 -0.904575\nv -0.302523 1.621875 -1.820003\nv -0.302522 1.621875 1.820003\nv -0.299282 0.463200 -1.800507\nv -0.299282 0.463200 1.800507\nv -0.293360 3.117600 -0.098814\nv -0.293360 3.117600 0.098814\nv -0.292719 1.774800 -1.761022\nv -0.292719 1.774800 1.761022\nv -0.290295 3.034800 -0.213234\nv -0.290295 3.034800 0.213234\nv -0.290138 3.081150 -0.213123\nv -0.290138 3.081150 0.213123\nv -0.289340 2.981250 -0.150793\nv -0.289340 2.981250 0.150793\nv -0.287140 0.384375 -1.727460\nv -0.287140 0.384375 1.727460\nv -0.281930 1.929525 1.696119\nv -0.281930 1.929525 -1.696119\nv -0.279400 2.659200 0.000000\nv -0.277752 2.625600 -0.277752\nv -0.277752 2.625600 0.277752\nv -0.275801 2.659200 -0.045844\nv -0.275801 2.659200 0.045844\nv -0.275675 0.002175 -0.275675\nv -0.275675 0.002175 0.275675\nv -0.274998 0.316800 -1.654413\nv -0.274998 0.316800 1.654413\nv -0.274928 3.117600 -0.143301\nv -0.274928 3.117600 0.143301\nv -0.273600 2.923200 0.000000\nv -0.273600 2.923200 0.000000\nv -0.270404 2.085600 -1.626774\nv -0.270404 2.085600 1.626774\nv -0.270092 2.923200 -0.045032\nv -0.270092 2.923200 0.045032\nv -0.265363 2.659200 -0.089140\nv -0.265363 2.659200 0.089140\nv -0.263841 0.260025 1.587289\nv -0.263841 0.260025 -1.587289\nv -0.263232 2.981250 -0.193348\nv -0.263232 2.981250 0.193348\nv -0.263208 2.550000 -0.783552\nv -0.263208 2.550000 0.783552\nv -0.259910 2.923200 -0.087511\nv -0.259910 2.923200 0.087511\nv -0.258385 2.242575 -1.554467\nv -0.258385 2.242575 1.554467\nv -0.254788 3.034800 -0.254788\nv -0.254788 3.034800 0.254788\nv -0.254653 3.081150 -0.254653\nv -0.254653 3.081150 0.254653\nv -0.254652 0.213600 -1.532010\nv -0.254652 0.213600 1.532010\nv -0.250127 3.117600 -0.183734\nv -0.250127 3.117600 0.183734\nv -0.248621 2.659200 0.129351\nv -0.248621 2.659200 -0.129351\nv -0.248417 0.177075 -1.494500\nv -0.248417 0.177075 1.494500\nv -0.246120 0.150000 1.480680\nv -0.246120 2.400000 -1.480680\nv -0.246120 0.150000 -1.480680\nv -0.246120 0.150000 -1.480680\nv -0.246120 0.150000 1.480680\nv -0.246120 2.400000 1.480680\nv -0.245542 0.127575 1.477200\nv -0.245542 0.127575 -1.477200\nv -0.243569 2.923200 -0.126920\nv -0.243569 2.923200 0.126920\nv -0.243424 2.597400 0.467878\nv -0.243424 2.597400 -0.467878\nv -0.242970 0.105600 1.461727\nv -0.242970 0.105600 -1.461727\nv -0.242892 2.435437 -1.461258\nv -0.242892 2.435437 1.461258\nv -0.239491 2.463000 -1.440800\nv -0.239491 2.463000 1.440800\nv -0.237149 0.084525 1.426709\nv -0.237149 0.084525 -1.426709\nv -0.236115 2.482687 -1.420490\nv -0.236115 2.482687 1.420490\nv -0.232961 2.494500 -1.401513\nv -0.232961 2.494500 1.401513\nv -0.232342 2.625600 -0.316590\nv -0.232342 2.625600 0.316590\nv -0.231031 2.981250 -0.231031\nv -0.231031 2.981250 0.231031\nv -0.230604 0.002175 -0.314223\nv -0.230604 0.002175 0.314223\nv -0.230225 2.498438 -1.385053\nv -0.230225 2.498438 1.385053\nv -0.229712 2.400000 -1.381968\nv -0.229712 2.400000 1.381968\nv -0.228104 2.494500 -1.372294\nv -0.228104 2.494500 1.372294\nv -0.227403 2.435437 -1.368074\nv -0.227403 2.435437 1.368074\nv -0.226824 0.064800 1.364595\nv -0.226824 0.064800 -1.364595\nv -0.226795 2.482687 1.364422\nv -0.226795 2.482687 -1.364422\nv -0.226496 2.463000 -1.362620\nv -0.226496 2.463000 1.362620\nv -0.226113 2.659200 -0.165941\nv -0.226113 2.659200 0.165941\nv -0.224349 0.008400 0.667871\nv -0.224349 0.008400 -0.667871\nv -0.221585 2.923200 -0.162745\nv -0.221585 2.923200 0.162745\nv -0.219800 2.863350 0.000000\nv -0.219800 2.863350 0.000000\nv -0.219536 3.117600 -0.219536\nv -0.219536 3.117600 0.219536\nv -0.216979 2.863350 0.036157\nv -0.216979 2.863350 -0.036157\nv -0.214905 2.572800 -0.639758\nv -0.214905 2.572800 0.639758\nv -0.213304 2.400000 -1.283256\nv -0.213304 2.400000 1.283256\nv -0.213234 3.034800 -0.290295\nv -0.213234 3.034800 0.290295\nv -0.213123 3.081150 -0.290138\nv -0.213123 3.081150 0.290138\nv -0.210740 0.046875 -1.267832\nv -0.210740 0.046875 1.267832\nv -0.209136 2.440800 -1.258183\nv -0.209136 2.440800 1.258183\nv -0.208794 2.863350 0.070270\nv -0.208794 2.863350 -0.070270\nv -0.200000 2.700000 0.000000\nv -0.200000 2.700000 0.000000\nv -0.200000 2.700000 0.000000\nv -0.200000 2.700000 0.000000\nv -0.198374 2.659200 -0.198374\nv -0.198374 2.659200 0.198374\nv -0.197684 2.474400 -1.189282\nv -0.197684 2.474400 1.189282\nv -0.197424 2.700000 -0.032816\nv -0.197424 2.700000 0.032816\nv -0.197424 2.700000 0.032816\nv -0.197424 2.700000 -0.032816\nv -0.195658 2.863350 -0.101925\nv -0.195658 2.863350 0.101925\nv -0.194600 3.141450 0.000000\nv -0.194600 3.141450 0.000000\nv -0.194472 2.923200 -0.194472\nv -0.194472 2.923200 0.194472\nv -0.193348 2.981250 -0.263232\nv -0.193348 2.981250 0.263232\nv -0.192107 3.141450 -0.032048\nv -0.192107 3.141450 0.032048\nv -0.189952 2.700000 -0.063808\nv -0.189952 2.700000 0.063808\nv -0.189952 2.700000 0.063808\nv -0.189952 2.700000 -0.063808\nv -0.187642 0.031200 1.128870\nv -0.187642 0.031200 -1.128870\nv -0.184870 3.141450 -0.062272\nv -0.184870 3.141450 0.062272\nv -0.183734 3.117600 -0.250127\nv -0.183734 3.117600 0.250127\nv -0.181110 2.625600 0.348105\nv -0.181110 2.625600 -0.348105\nv -0.180521 2.502600 -1.086029\nv -0.180521 2.502600 1.086029\nv -0.179756 0.002175 -0.345503\nv -0.179756 0.002175 0.345503\nv -0.179200 2.804400 0.000000\nv -0.179200 2.804400 0.000000\nv -0.177989 2.863350 -0.130707\nv -0.177989 2.863350 0.130707\nv -0.177968 2.700000 -0.092592\nv -0.177968 2.700000 0.092592\nv -0.177968 2.700000 0.092592\nv -0.177968 2.700000 -0.092592\nv -0.176897 2.804400 0.029450\nv -0.176897 2.804400 -0.029450\nv -0.173255 3.141450 -0.090306\nv -0.173255 3.141450 0.090306\nv -0.170215 2.804400 0.057246\nv -0.170215 2.804400 -0.057246\nv -0.167751 2.597400 -0.499384\nv -0.167751 2.597400 0.499384\nv -0.167400 2.749050 0.000000\nv -0.167400 2.749050 0.000000\nv -0.166306 3.034800 -0.319082\nv -0.166306 3.034800 0.319082\nv -0.166221 3.081150 0.318907\nv -0.166221 3.081150 -0.318907\nv -0.165941 2.659200 -0.226113\nv -0.165941 2.659200 0.226113\nv -0.165245 2.749050 0.027480\nv -0.165245 2.749050 -0.027480\nv -0.162745 2.923200 -0.221585\nv -0.162745 2.923200 0.221585\nv -0.161856 2.700000 -0.118784\nv -0.161856 2.700000 0.118784\nv -0.161856 2.700000 0.118784\nv -0.161856 2.700000 -0.118784\nv -0.159496 2.804400 0.083047\nv -0.159496 2.804400 -0.083047\nv -0.159223 2.527200 -0.957901\nv -0.159223 2.527200 0.957901\nv -0.158995 2.749050 0.053428\nv -0.158995 2.749050 -0.053428\nv -0.157626 3.141450 -0.115787\nv -0.157626 3.141450 0.115787\nv -0.156274 0.018225 0.940158\nv -0.156274 0.018225 -0.940158\nv -0.156200 2.863350 -0.156200\nv -0.156200 2.863350 0.156200\nv -0.150793 2.981250 -0.289340\nv -0.150793 2.981250 0.289340\nv -0.148969 2.749050 0.077523\nv -0.148969 2.749050 -0.077523\nv -0.145078 2.804400 0.106513\nv -0.145078 2.804400 -0.106513\nv -0.143301 3.117600 -0.274928\nv -0.143301 3.117600 0.274928\nv -0.142000 2.700000 -0.142000\nv -0.142000 2.700000 0.142000\nv -0.142000 2.700000 0.142000\nv -0.142000 2.700000 -0.142000\nv -0.138348 3.141450 -0.138348\nv -0.138348 3.141450 0.138348\nv -0.135489 2.749050 0.099446\nv -0.135489 2.749050 -0.099446\nv -0.135366 2.550000 -0.814374\nv -0.135366 2.550000 0.814374\nv -0.130707 2.863350 -0.177989\nv -0.130707 2.863350 0.177989\nv -0.129351 2.659200 0.248621\nv -0.129351 2.659200 -0.248621\nv -0.127304 2.804400 0.127304\nv -0.127304 2.804400 -0.127304\nv -0.126920 2.923200 -0.243569\nv -0.126920 2.923200 0.243569\nv -0.124808 2.625600 -0.371546\nv -0.124808 2.625600 0.371546\nv -0.123875 0.002175 0.368768\nv -0.123875 0.002175 -0.368768\nv -0.118874 2.749050 0.118874\nv -0.118874 2.749050 -0.118874\nv -0.118784 2.700000 -0.161856\nv -0.118784 2.700000 0.161856\nv -0.118784 2.700000 0.161856\nv -0.118784 2.700000 -0.161856\nv -0.115787 3.141450 -0.157626\nv -0.115787 3.141450 0.157626\nv -0.115381 0.008400 0.694143\nv -0.115381 0.008400 -0.694143\nv -0.114676 3.034800 -0.340477\nv -0.114676 3.034800 0.340477\nv -0.114619 3.081150 -0.340289\nv -0.114619 3.081150 0.340289\nv -0.110524 2.572800 -0.664924\nv -0.110524 2.572800 0.664924\nv -0.106513 2.804400 -0.145078\nv -0.106513 2.804400 0.145078\nv -0.103976 2.981250 -0.308744\nv -0.103976 2.981250 0.308744\nv -0.101925 2.863350 -0.195658\nv -0.101925 2.863350 0.195658\nv -0.099446 2.749050 0.135489\nv -0.099446 2.749050 -0.135489\nv -0.098814 3.117600 -0.293360\nv -0.098814 3.117600 0.293360\nv -0.092592 2.700000 -0.177968\nv -0.092592 2.700000 0.177968\nv -0.092592 2.700000 -0.177968\nv -0.092592 2.700000 0.177968\nv -0.090306 3.141450 -0.173255\nv -0.090306 3.141450 0.173255\nv -0.089140 2.659200 -0.265363\nv -0.089140 2.659200 0.265363\nv -0.087511 2.923200 -0.259910\nv -0.087511 2.923200 0.259910\nv -0.086273 2.597400 -0.519028\nv -0.086273 2.597400 0.519028\nv -0.083047 2.804400 -0.159496\nv -0.083047 2.804400 0.159496\nv -0.077523 2.749050 -0.148969\nv -0.077523 2.749050 0.148969\nv -0.070270 2.863350 -0.208794\nv -0.070270 2.863350 0.208794\nv -0.064188 2.625600 -0.386161\nv -0.064188 2.625600 0.386161\nv -0.063808 2.700000 -0.189952\nv -0.063808 2.700000 0.189952\nv -0.063808 2.700000 -0.189952\nv -0.063808 2.700000 0.189952\nv -0.063708 0.002175 0.383274\nv -0.063708 0.002175 -0.383274\nv -0.062272 3.141450 -0.184870\nv -0.062272 3.141450 0.184870\nv -0.059016 3.034800 -0.353807\nv -0.059016 3.034800 0.353807\nv -0.058988 3.081150 -0.353610\nv -0.058988 3.081150 0.353610\nv -0.057246 2.804400 -0.170215\nv -0.057246 2.804400 0.170215\nv -0.053508 2.981250 -0.320834\nv -0.053508 2.981250 0.320834\nv -0.053428 2.749050 -0.158995\nv -0.053428 2.749050 0.158995\nv -0.050855 3.117600 -0.304843\nv -0.050855 3.117600 0.304843\nv -0.045844 2.659200 -0.275801\nv -0.045844 2.659200 0.275801\nv -0.045032 2.923200 -0.270092\nv -0.045032 2.923200 0.270092\nv -0.036157 2.863350 -0.216979\nv -0.036157 2.863350 0.216979\nv -0.032816 2.700000 -0.197424\nv -0.032816 2.700000 0.197424\nv -0.032816 2.700000 -0.197424\nv -0.032816 2.700000 0.197424\nv -0.032048 3.141450 -0.192107\nv -0.032048 3.141450 0.192107\nv -0.029450 2.804400 -0.176897\nv -0.029450 2.804400 0.176897\nv -0.027480 2.749050 -0.165245\nv -0.027480 2.749050 0.165245\nv -0.000000 0.260025 1.608000\nv -0.000000 1.929525 1.718250\nv -0.000000 2.085600 -1.648000\nv -0.000000 0.656400 -1.948000\nv -0.000000 0.771675 -1.986000\nv -0.000000 2.482687 1.382225\nv -0.000000 2.700000 -0.200000\nv -0.000000 0.127575 1.496475\nv -0.000000 2.474400 -1.204800\nv -0.000000 2.749050 -0.167400\nv -0.000000 0.018225 0.952425\nv -0.000000 0.046875 -1.284375\nv -0.000000 0.064800 1.382400\nv -0.000000 0.384375 1.750000\nv -0.000000 0.463200 1.824000\nv -0.000000 0.553725 -1.892000\nv -0.000000 1.037175 1.992750\nv -0.000000 1.178400 1.972000\nv -0.000000 1.323225 -1.939250\nv -0.000000 1.621875 -1.843750\nv -0.000000 1.774800 1.784000\nv -0.000000 2.400000 -1.300000\nv -0.000000 2.435437 -1.480325\nv -0.000000 2.435437 -1.385925\nv -0.000000 2.463000 -1.459600\nv -0.000000 2.463000 -1.380400\nv -0.000000 2.494500 -1.390200\nv -0.000000 2.502600 -1.100200\nv -0.000000 2.804400 -0.179200\nv -0.000000 2.863350 -0.219800\nv -0.000000 2.572800 -0.673600\nv -0.000000 0.105600 1.480800\nv -0.000000 0.177075 -1.514000\nv -0.000000 2.494500 -1.419800\nv -0.000000 2.527200 -0.970400\nv -0.000000 2.923200 -0.273600\nv -0.000000 3.117600 -0.308800\nv -0.000000 2.597400 -0.525800\nv -0.000000 2.700000 -0.200000\nv -0.000000 2.981250 -0.325000\nv -0.000000 3.141450 -0.194600\nv -0.000000 0.002175 0.388275\nv -0.000000 3.081150 -0.358200\nv 0.000000 0.000000 0.000000\nv 0.000000 0.002175 -0.388275\nv 0.000000 0.002175 0.388275\nv 0.000000 0.008400 -0.703200\nv 0.000000 0.008400 0.703200\nv 0.000000 0.018225 -0.952425\nv 0.000000 0.018225 0.952425\nv 0.000000 0.031200 -1.143600\nv 0.000000 0.031200 -1.143600\nv 0.000000 0.031200 1.143600\nv 0.000000 0.031200 1.143600\nv 0.000000 0.046875 -1.284375\nv 0.000000 0.046875 1.284375\nv 0.000000 0.064800 -1.382400\nv 0.000000 0.064800 1.382400\nv 0.000000 0.084525 -1.445325\nv 0.000000 0.084525 -1.445325\nv 0.000000 0.084525 1.445325\nv 0.000000 0.084525 1.445325\nv 0.000000 0.105600 -1.480800\nv 0.000000 0.105600 1.480800\nv 0.000000 0.127575 -1.496475\nv 0.000000 0.127575 1.496475\nv 0.000000 0.150000 -1.500000\nv 0.000000 0.150000 -1.500000\nv 0.000000 0.150000 1.500000\nv 0.000000 0.150000 1.500000\nv 0.000000 0.177075 -1.514000\nv 0.000000 0.177075 1.514000\nv 0.000000 0.213600 -1.552000\nv 0.000000 0.213600 -1.552000\nv 0.000000 0.213600 1.552000\nv 0.000000 0.213600 1.552000\nv 0.000000 0.260025 -1.608000\nv 0.000000 0.260025 1.608000\nv 0.000000 0.316800 -1.676000\nv 0.000000 0.316800 -1.676000\nv 0.000000 0.316800 1.676000\nv 0.000000 0.316800 1.676000\nv 0.000000 0.384375 -1.750000\nv 0.000000 0.384375 1.750000\nv 0.000000 0.463200 -1.824000\nv 0.000000 0.463200 1.824000\nv 0.000000 0.553725 -1.892000\nv 0.000000 0.553725 1.892000\nv 0.000000 0.656400 -1.948000\nv 0.000000 0.656400 1.948000\nv 0.000000 0.771675 -1.986000\nv 0.000000 0.771675 1.986000\nv 0.000000 0.900000 -2.000000\nv 0.000000 0.900000 -2.000000\nv 0.000000 0.900000 2.000000\nv 0.000000 0.900000 2.000000\nv 0.000000 1.037175 -1.992750\nv 0.000000 1.037175 1.992750\nv 0.000000 1.178400 -1.972000\nv 0.000000 1.178400 1.972000\nv 0.000000 1.323225 -1.939250\nv 0.000000 1.323225 1.939250\nv 0.000000 1.471200 -1.896000\nv 0.000000 1.471200 -1.896000\nv 0.000000 1.471200 1.896000\nv 0.000000 1.471200 1.896000\nv 0.000000 1.621875 -1.843750\nv 0.000000 1.621875 1.843750\nv 0.000000 1.774800 -1.784000\nv 0.000000 1.774800 1.784000\nv 0.000000 1.929525 -1.718250\nv 0.000000 1.929525 1.718250\nv 0.000000 2.085600 -1.648000\nv 0.000000 2.085600 1.648000\nv 0.000000 2.242575 -1.574750\nv 0.000000 2.242575 -1.574750\nv 0.000000 2.242575 1.574750\nv 0.000000 2.242575 1.574750\nv 0.000000 2.400000 -1.500000\nv 0.000000 2.400000 -1.500000\nv 0.000000 2.400000 -1.400000\nv 0.000000 2.400000 -1.400000\nv 0.000000 2.400000 -1.300000\nv 0.000000 2.400000 1.300000\nv 0.000000 2.400000 1.400000\nv 0.000000 2.400000 1.400000\nv 0.000000 2.400000 1.500000\nv 0.000000 2.400000 1.500000\nv 0.000000 2.435437 -1.480325\nv 0.000000 2.435437 -1.385925\nv 0.000000 2.435437 1.385925\nv 0.000000 2.435437 1.480325\nv 0.000000 2.440800 -1.274600\nv 0.000000 2.440800 -1.274600\nv 0.000000 2.440800 1.274600\nv 0.000000 2.440800 1.274600\nv 0.000000 2.463000 -1.459600\nv 0.000000 2.463000 -1.380400\nv 0.000000 2.463000 1.380400\nv 0.000000 2.463000 1.459600\nv 0.000000 2.474400 -1.204800\nv 0.000000 2.474400 1.204800\nv 0.000000 2.482687 -1.439025\nv 0.000000 2.482687 -1.382225\nv 0.000000 2.482687 1.382225\nv 0.000000 2.482687 1.439025\nv 0.000000 2.494500 -1.419800\nv 0.000000 2.494500 -1.390200\nv 0.000000 2.494500 1.390200\nv 0.000000 2.494500 1.419800\nv 0.000000 2.498438 -1.403125\nv 0.000000 2.498438 -1.403125\nv 0.000000 2.498438 1.403125\nv 0.000000 2.498438 1.403125\nv 0.000000 2.502600 -1.100200\nv 0.000000 2.502600 1.100200\nv 0.000000 2.527200 -0.970400\nv 0.000000 2.527200 0.970400\nv 0.000000 2.550000 -0.825000\nv 0.000000 2.550000 -0.825000\nv 0.000000 2.550000 0.825000\nv 0.000000 2.550000 0.825000\nv 0.000000 2.572800 -0.673600\nv 0.000000 2.572800 0.673600\nv 0.000000 2.597400 -0.525800\nv 0.000000 2.597400 0.525800\nv 0.000000 2.625600 -0.391200\nv 0.000000 2.625600 -0.391200\nv 0.000000 2.625600 0.391200\nv 0.000000 2.625600 0.391200\nv 0.000000 2.659200 -0.279400\nv 0.000000 2.659200 0.279400\nv 0.000000 2.700000 -0.200000\nv 0.000000 2.700000 -0.200000\nv 0.000000 2.700000 0.200000\nv 0.000000 2.700000 0.200000\nv 0.000000 2.749050 -0.167400\nv 0.000000 2.749050 0.167400\nv 0.000000 2.804400 -0.179200\nv 0.000000 2.804400 0.179200\nv 0.000000 2.863350 -0.219800\nv 0.000000 2.863350 0.219800\nv 0.000000 2.923200 -0.273600\nv 0.000000 2.923200 0.273600\nv 0.000000 2.981250 -0.325000\nv 0.000000 2.981250 0.325000\nv 0.000000 3.034800 -0.358400\nv 0.000000 3.034800 -0.358400\nv 0.000000 3.034800 0.358400\nv 0.000000 3.034800 0.358400\nv 0.000000 3.081150 -0.358200\nv 0.000000 3.081150 0.358200\nv 0.000000 3.117600 -0.308800\nv 0.000000 3.117600 0.308800\nv 0.000000 3.141450 -0.194600\nv 0.000000 3.141450 0.194600\nv 0.000000 3.150000 0.000000\nv 0.000000 0.002175 -0.388275\nv 0.000000 3.081150 0.358200\nv 0.000000 2.597400 0.525800\nv 0.000000 2.700000 0.200000\nv 0.000000 2.981250 0.325000\nv 0.000000 3.141450 0.194600\nv 0.000000 3.117600 0.308800\nv 0.000000 0.105600 -1.480800\nv 0.000000 0.177075 1.514000\nv 0.000000 2.494500 1.419800\nv 0.000000 2.527200 0.970400\nv 0.000000 2.923200 0.273600\nv 0.000000 2.572800 0.673600\nv 0.000000 2.863350 0.219800\nv 0.000000 0.018225 -0.952425\nv 0.000000 0.046875 1.284375\nv 0.000000 0.064800 -1.382400\nv 0.000000 0.384375 -1.750000\nv 0.000000 0.463200 -1.824000\nv 0.000000 0.553725 1.892000\nv 0.000000 1.037175 -1.992750\nv 0.000000 1.178400 -1.972000\nv 0.000000 1.323225 1.939250\nv 0.000000 1.621875 1.843750\nv 0.000000 1.774800 -1.784000\nv 0.000000 2.400000 1.300000\nv 0.000000 2.435437 1.385925\nv 0.000000 2.435437 1.480325\nv 0.000000 2.463000 1.380400\nv 0.000000 2.463000 1.459600\nv 0.000000 2.494500 1.390200\nv 0.000000 2.502600 1.100200\nv 0.000000 2.804400 0.179200\nv 0.000000 2.749050 0.167400\nv 0.000000 0.127575 -1.496475\nv 0.000000 2.474400 1.204800\nv 0.000000 0.656400 1.948000\nv 0.000000 0.771675 1.986000\nv 0.000000 2.482687 -1.382225\nv 0.000000 2.700000 0.200000\nv 0.000000 0.260025 -1.608000\nv 0.000000 1.929525 -1.718250\nv 0.000000 2.085600 1.648000\nv 0.027480 2.749050 -0.165245\nv 0.027480 2.749050 0.165245\nv 0.029450 2.804400 -0.176897\nv 0.029450 2.804400 0.176897\nv 0.032048 3.141450 -0.192107\nv 0.032048 3.141450 0.192107\nv 0.032816 2.700000 -0.197424\nv 0.032816 2.700000 0.197424\nv 0.032816 2.700000 -0.197424\nv 0.032816 2.700000 0.197424\nv 0.036157 2.863350 -0.216979\nv 0.036157 2.863350 0.216979\nv 0.045032 2.923200 -0.270092\nv 0.045032 2.923200 0.270092\nv 0.045844 2.659200 -0.275801\nv 0.045844 2.659200 0.275801\nv 0.050855 3.117600 -0.304843\nv 0.050855 3.117600 0.304843\nv 0.053428 2.749050 -0.158995\nv 0.053428 2.749050 0.158995\nv 0.053508 2.981250 -0.320834\nv 0.053508 2.981250 0.320834\nv 0.057246 2.804400 -0.170215\nv 0.057246 2.804400 0.170215\nv 0.058988 3.081150 -0.353610\nv 0.058988 3.081150 0.353610\nv 0.059016 3.034800 -0.353807\nv 0.059016 3.034800 0.353807\nv 0.062272 3.141450 -0.184870\nv 0.062272 3.141450 0.184870\nv 0.063708 0.002175 0.383274\nv 0.063708 0.002175 -0.383274\nv 0.063808 2.700000 -0.189952\nv 0.063808 2.700000 0.189952\nv 0.063808 2.700000 -0.189952\nv 0.063808 2.700000 0.189952\nv 0.064188 2.625600 -0.386161\nv 0.064188 2.625600 0.386161\nv 0.070270 2.863350 -0.208794\nv 0.070270 2.863350 0.208794\nv 0.077523 2.749050 -0.148969\nv 0.077523 2.749050 0.148969\nv 0.083047 2.804400 -0.159496\nv 0.083047 2.804400 0.159496\nv 0.086273 2.597400 -0.519028\nv 0.086273 2.597400 0.519028\nv 0.087511 2.923200 -0.259910\nv 0.087511 2.923200 0.259910\nv 0.089140 2.659200 -0.265363\nv 0.089140 2.659200 0.265363\nv 0.090306 3.141450 -0.173255\nv 0.090306 3.141450 0.173255\nv 0.092592 2.700000 -0.177968\nv 0.092592 2.700000 0.177968\nv 0.092592 2.700000 -0.177968\nv 0.092592 2.700000 0.177968\nv 0.098814 3.117600 -0.293360\nv 0.098814 3.117600 0.293360\nv 0.099446 2.749050 0.135489\nv 0.099446 2.749050 -0.135489\nv 0.101925 2.863350 -0.195658\nv 0.101925 2.863350 0.195658\nv 0.103976 2.981250 -0.308744\nv 0.103976 2.981250 0.308744\nv 0.106513 2.804400 -0.145078\nv 0.106513 2.804400 0.145078\nv 0.110524 2.572800 -0.664924\nv 0.110524 2.572800 0.664924\nv 0.114619 3.081150 -0.340289\nv 0.114619 3.081150 0.340289\nv 0.114676 3.034800 -0.340477\nv 0.114676 3.034800 0.340477\nv 0.115381 0.008400 0.694143\nv 0.115381 0.008400 -0.694143\nv 0.115787 3.141450 -0.157626\nv 0.115787 3.141450 0.157626\nv 0.118784 2.700000 0.161856\nv 0.118784 2.700000 -0.161856\nv 0.118784 2.700000 -0.161856\nv 0.118784 2.700000 0.161856\nv 0.118874 2.749050 0.118874\nv 0.118874 2.749050 -0.118874\nv 0.123875 0.002175 0.368768\nv 0.123875 0.002175 -0.368768\nv 0.124808 2.625600 -0.371546\nv 0.124808 2.625600 0.371546\nv 0.126920 2.923200 -0.243569\nv 0.126920 2.923200 0.243569\nv 0.127304 2.804400 0.127304\nv 0.127304 2.804400 -0.127304\nv 0.129351 2.659200 0.248621\nv 0.129351 2.659200 -0.248621\nv 0.130707 2.863350 -0.177989\nv 0.130707 2.863350 0.177989\nv 0.135366 2.550000 -0.814374\nv 0.135366 2.550000 0.814374\nv 0.135489 2.749050 0.099446\nv 0.135489 2.749050 -0.099446\nv 0.138348 3.141450 -0.138348\nv 0.138348 3.141450 0.138348\nv 0.142000 2.700000 0.142000\nv 0.142000 2.700000 -0.142000\nv 0.142000 2.700000 -0.142000\nv 0.142000 2.700000 0.142000\nv 0.143301 3.117600 -0.274928\nv 0.143301 3.117600 0.274928\nv 0.145078 2.804400 0.106513\nv 0.145078 2.804400 -0.106513\nv 0.148969 2.749050 0.077523\nv 0.148969 2.749050 -0.077523\nv 0.150793 2.981250 -0.289340\nv 0.150793 2.981250 0.289340\nv 0.156200 2.863350 -0.156200\nv 0.156200 2.863350 0.156200\nv 0.156274 0.018225 0.940158\nv 0.156274 0.018225 -0.940158\nv 0.157626 3.141450 -0.115787\nv 0.157626 3.141450 0.115787\nv 0.158995 2.749050 0.053428\nv 0.158995 2.749050 -0.053428\nv 0.159223 2.527200 -0.957901\nv 0.159223 2.527200 0.957901\nv 0.159496 2.804400 0.083047\nv 0.159496 2.804400 -0.083047\nv 0.161856 2.700000 0.118784\nv 0.161856 2.700000 -0.118784\nv 0.161856 2.700000 -0.118784\nv 0.161856 2.700000 0.118784\nv 0.162745 2.923200 -0.221585\nv 0.162745 2.923200 0.221585\nv 0.165245 2.749050 0.027480\nv 0.165245 2.749050 -0.027480\nv 0.165941 2.659200 -0.226113\nv 0.165941 2.659200 0.226113\nv 0.166221 3.081150 0.318907\nv 0.166221 3.081150 -0.318907\nv 0.166306 3.034800 -0.319082\nv 0.166306 3.034800 0.319082\nv 0.167400 2.749050 -0.000000\nv 0.167400 2.749050 0.000000\nv 0.167751 2.597400 -0.499384\nv 0.167751 2.597400 0.499384\nv 0.170215 2.804400 0.057246\nv 0.170215 2.804400 -0.057246\nv 0.173255 3.141450 -0.090306\nv 0.173255 3.141450 0.090306\nv 0.176897 2.804400 0.029450\nv 0.176897 2.804400 -0.029450\nv 0.177968 2.700000 0.092592\nv 0.177968 2.700000 -0.092592\nv 0.177968 2.700000 -0.092592\nv 0.177968 2.700000 0.092592\nv 0.177989 2.863350 -0.130707\nv 0.177989 2.863350 0.130707\nv 0.179200 2.804400 -0.000000\nv 0.179200 2.804400 0.000000\nv 0.179756 0.002175 -0.345503\nv 0.179756 0.002175 0.345503\nv 0.180521 2.502600 -1.086029\nv 0.180521 2.502600 1.086029\nv 0.181110 2.625600 0.348105\nv 0.181110 2.625600 -0.348105\nv 0.183734 3.117600 -0.250127\nv 0.183734 3.117600 0.250127\nv 0.184870 3.141450 -0.062272\nv 0.184870 3.141450 0.062272\nv 0.187642 0.031200 1.128870\nv 0.187642 0.031200 -1.128870\nv 0.189952 2.700000 0.063808\nv 0.189952 2.700000 -0.063808\nv 0.189952 2.700000 -0.063808\nv 0.189952 2.700000 0.063808\nv 0.192107 3.141450 -0.032048\nv 0.192107 3.141450 0.032048\nv 0.193348 2.981250 -0.263232\nv 0.193348 2.981250 0.263232\nv 0.194472 2.923200 -0.194472\nv 0.194472 2.923200 0.194472\nv 0.194600 3.141450 0.000000\nv 0.194600 3.141450 -0.000000\nv 0.195658 2.863350 -0.101925\nv 0.195658 2.863350 0.101925\nv 0.197424 2.700000 0.032816\nv 0.197424 2.700000 -0.032816\nv 0.197424 2.700000 -0.032816\nv 0.197424 2.700000 0.032816\nv 0.197684 2.474400 -1.189282\nv 0.197684 2.474400 1.189282\nv 0.198374 2.659200 -0.198374\nv 0.198374 2.659200 0.198374\nv 0.200000 2.700000 -0.000000\nv 0.200000 2.700000 0.000000\nv 0.200000 2.700000 0.000000\nv 0.200000 2.700000 -0.000000\nv 0.208794 2.863350 0.070270\nv 0.208794 2.863350 -0.070270\nv 0.209136 2.440800 -1.258183\nv 0.209136 2.440800 1.258183\nv 0.210740 0.046875 -1.267832\nv 0.210740 0.046875 1.267832\nv 0.213123 3.081150 -0.290138\nv 0.213123 3.081150 0.290138\nv 0.213234 3.034800 -0.290295\nv 0.213234 3.034800 0.290295\nv 0.213304 2.400000 -1.283256\nv 0.213304 2.400000 1.283256\nv 0.214905 2.572800 -0.639758\nv 0.214905 2.572800 0.639758\nv 0.216979 2.863350 0.036157\nv 0.216979 2.863350 -0.036157\nv 0.219536 3.117600 -0.219536\nv 0.219536 3.117600 0.219536\nv 0.219800 2.863350 -0.000000\nv 0.219800 2.863350 0.000000\nv 0.221585 2.923200 -0.162745\nv 0.221585 2.923200 0.162745\nv 0.224349 0.008400 0.667871\nv 0.224349 0.008400 -0.667871\nv 0.226113 2.659200 -0.165941\nv 0.226113 2.659200 0.165941\nv 0.226496 2.463000 -1.362620\nv 0.226496 2.463000 1.362620\nv 0.226795 2.482687 1.364422\nv 0.226795 2.482687 -1.364422\nv 0.226824 0.064800 1.364595\nv 0.226824 0.064800 -1.364595\nv 0.227403 2.435437 -1.368074\nv 0.227403 2.435437 1.368074\nv 0.228104 2.494500 -1.372294\nv 0.228104 2.494500 1.372294\nv 0.229712 2.400000 -1.381968\nv 0.229712 2.400000 1.381968\nv 0.230225 2.498438 -1.385053\nv 0.230225 2.498438 1.385053\nv 0.230604 0.002175 -0.314223\nv 0.230604 0.002175 0.314223\nv 0.231031 2.981250 -0.231031\nv 0.231031 2.981250 0.231031\nv 0.232342 2.625600 -0.316590\nv 0.232342 2.625600 0.316590\nv 0.232961 2.494500 -1.401513\nv 0.232961 2.494500 1.401513\nv 0.236115 2.482687 -1.420490\nv 0.236115 2.482687 1.420490\nv 0.237149 0.084525 1.426709\nv 0.237149 0.084525 -1.426709\nv 0.239491 2.463000 -1.440800\nv 0.239491 2.463000 1.440800\nv 0.242892 2.435437 -1.461258\nv 0.242892 2.435437 1.461258\nv 0.242970 0.105600 1.461727\nv 0.242970 0.105600 -1.461727\nv 0.243424 2.597400 0.467878\nv 0.243424 2.597400 -0.467878\nv 0.243569 2.923200 -0.126920\nv 0.243569 2.923200 0.126920\nv 0.245542 0.127575 1.477200\nv 0.245542 0.127575 -1.477200\nv 0.246120 0.150000 -1.480680\nv 0.246120 2.400000 -1.480680\nv 0.246120 0.150000 1.480680\nv 0.246120 0.150000 1.480680\nv 0.246120 2.400000 1.480680\nv 0.246120 0.150000 -1.480680\nv 0.248417 0.177075 -1.494500\nv 0.248417 0.177075 1.494500\nv 0.248621 2.659200 0.129351\nv 0.248621 2.659200 -0.129351\nv 0.250127 3.117600 -0.183734\nv 0.250127 3.117600 0.183734\nv 0.254652 0.213600 -1.532010\nv 0.254652 0.213600 1.532010\nv 0.254653 3.081150 -0.254653\nv 0.254653 3.081150 0.254653\nv 0.254788 3.034800 -0.254788\nv 0.254788 3.034800 0.254788\nv 0.258385 2.242575 -1.554467\nv 0.258385 2.242575 1.554467\nv 0.259910 2.923200 -0.087511\nv 0.259910 2.923200 0.087511\nv 0.263208 2.550000 -0.783552\nv 0.263208 2.550000 0.783552\nv 0.263232 2.981250 -0.193348\nv 0.263232 2.981250 0.193348\nv 0.263841 0.260025 1.587289\nv 0.263841 0.260025 -1.587289\nv 0.265363 2.659200 -0.089140\nv 0.265363 2.659200 0.089140\nv 0.270092 2.923200 -0.045032\nv 0.270092 2.923200 0.045032\nv 0.270404 2.085600 -1.626774\nv 0.270404 2.085600 1.626774\nv 0.273600 2.923200 -0.000000\nv 0.273600 2.923200 0.000000\nv 0.274928 3.117600 -0.143301\nv 0.274928 3.117600 0.143301\nv 0.274998 0.316800 -1.654413\nv 0.274998 0.316800 1.654413\nv 0.275675 0.002175 -0.275675\nv 0.275675 0.002175 0.275675\nv 0.275801 2.659200 -0.045844\nv 0.275801 2.659200 0.045844\nv 0.277752 2.625600 -0.277752\nv 0.277752 2.625600 0.277752\nv 0.279400 2.659200 0.000000\nv 0.281930 1.929525 1.696119\nv 0.281930 1.929525 -1.696119\nv 0.287140 0.384375 -1.727460\nv 0.287140 0.384375 1.727460\nv 0.289340 2.981250 -0.150793\nv 0.289340 2.981250 0.150793\nv 0.290138 3.081150 -0.213123\nv 0.290138 3.081150 0.213123\nv 0.290295 3.034800 -0.213234\nv 0.290295 3.034800 0.213234\nv 0.292719 1.774800 -1.761022\nv 0.292719 1.774800 1.761022\nv 0.293360 3.117600 -0.098814\nv 0.293360 3.117600 0.098814\nv 0.299282 0.463200 -1.800507\nv 0.299282 0.463200 1.800507\nv 0.302522 1.621875 -1.820003\nv 0.302523 1.621875 1.820003\nv 0.303862 0.018225 0.904575\nv 0.303862 0.018225 -0.904575\nv 0.304843 3.117600 -0.050855\nv 0.304843 3.117600 0.050855\nv 0.308744 2.981250 -0.103976\nv 0.308744 2.981250 0.103976\nv 0.308800 3.117600 0.000000\nv 0.308800 3.117600 -0.000000\nv 0.309596 2.527200 -0.921647\nv 0.309596 2.527200 0.921647\nv 0.310439 0.553725 -1.867631\nv 0.310439 0.553725 1.867631\nv 0.311096 1.471200 -1.871580\nv 0.311096 1.471200 1.871580\nv 0.311850 2.572800 -0.599396\nv 0.311850 2.572800 0.599396\nv 0.312283 2.597400 -0.425519\nv 0.312283 2.597400 0.425519\nv 0.314223 0.002175 -0.230604\nv 0.314223 0.002175 0.230604\nv 0.316590 2.625600 -0.232342\nv 0.316590 2.625600 0.232342\nv 0.318192 1.323225 -1.914272\nv 0.318192 1.323225 1.914272\nv 0.318907 3.081150 -0.166221\nv 0.318907 3.081150 0.166221\nv 0.319082 3.034800 -0.166306\nv 0.319082 3.034800 0.166306\nv 0.319628 0.656400 -1.922910\nv 0.319628 0.656400 1.922910\nv 0.320834 2.981250 -0.053508\nv 0.320834 2.981250 0.053508\nv 0.323566 1.178400 -1.946601\nv 0.323566 1.178400 1.946601\nv 0.325000 2.981250 0.000000\nv 0.325000 2.981250 -0.000000\nv 0.325553 0.008400 -0.625735\nv 0.325553 0.008400 0.625735\nv 0.325863 0.771675 -1.960420\nv 0.325863 0.771675 1.960420\nv 0.326970 1.037175 -1.967083\nv 0.326970 1.037175 1.967083\nv 0.328160 0.900000 -1.974240\nv 0.328160 0.900000 -1.974240\nv 0.328160 0.900000 1.974240\nv 0.340289 3.081150 -0.114619\nv 0.340289 3.081150 0.114619\nv 0.340477 3.034800 -0.114676\nv 0.340477 3.034800 0.114676\nv 0.345503 0.002175 -0.179756\nv 0.345503 0.002175 0.179756\nv 0.348105 2.625600 -0.181110\nv 0.348105 2.625600 0.181110\nv 0.351008 2.502600 -1.044926\nv 0.351008 2.502600 1.044926\nv 0.353610 3.081150 -0.058988\nv 0.353610 3.081150 0.058988\nv 0.353807 3.034800 -0.059016\nv 0.353807 3.034800 0.059016\nv 0.358200 3.081150 -0.000000\nv 0.358200 3.081150 0.000000\nv 0.358400 3.034800 0.000000\nv 0.358400 3.034800 0.000000\nv 0.364854 0.031200 1.086146\nv 0.364854 0.031200 -1.086146\nv 0.368768 0.002175 -0.123875\nv 0.368768 0.002175 0.123875\nv 0.371546 2.625600 -0.124808\nv 0.371546 2.625600 0.124808\nv 0.373318 2.597400 -0.373318\nv 0.373318 2.597400 0.373318\nv 0.381942 2.550000 -0.734118\nv 0.381942 2.550000 0.734118\nv 0.383274 0.002175 -0.063708\nv 0.383274 0.002175 0.063708\nv 0.384379 2.474400 -1.144271\nv 0.384379 2.474400 1.144271\nv 0.386161 2.625600 -0.064188\nv 0.386161 2.625600 0.064188\nv 0.388275 0.002175 0.000000\nv 0.388275 0.002175 0.000000\nv 0.391200 2.625600 0.000000\nv 0.391200 2.625600 0.000000\nv 0.400065 2.572800 -0.545131\nv 0.400065 2.572800 0.545131\nv 0.406648 2.440800 -1.210564\nv 0.406648 2.440800 1.210564\nv 0.409767 0.046875 1.219848\nv 0.409767 0.046875 -1.219848\nv 0.414752 2.400000 -1.234688\nv 0.414752 2.400000 1.234688\nv 0.417645 0.008400 -0.569086\nv 0.417645 0.008400 0.569086\nv 0.425519 2.597400 0.312283\nv 0.425519 2.597400 -0.312283\nv 0.440403 2.463000 -1.311049\nv 0.440403 2.463000 1.311049\nv 0.440935 0.018225 0.847506\nv 0.440935 0.018225 -0.847506\nv 0.440985 2.482687 -1.312782\nv 0.440985 2.482687 1.312782\nv 0.441041 0.064800 1.312948\nv 0.441041 0.064800 -1.312948\nv 0.442166 2.435437 -1.316296\nv 0.442166 2.435437 1.316296\nv 0.443529 2.494500 -1.320356\nv 0.443529 2.494500 1.320356\nv 0.446656 2.400000 -1.329664\nv 0.446656 2.400000 1.329664\nv 0.447653 2.498438 -1.332632\nv 0.447653 2.498438 1.332632\nv 0.449256 2.527200 -0.863501\nv 0.449256 2.527200 0.863501\nv 0.452973 2.494500 -1.348469\nv 0.452973 2.494500 1.348469\nv 0.459107 2.482687 -1.366728\nv 0.459107 2.482687 1.366728\nv 0.461116 0.084525 1.372712\nv 0.461116 0.084525 -1.372712\nv 0.465671 2.463000 -1.386270\nv 0.465671 2.463000 1.386270\nv 0.467878 2.597400 -0.243424\nv 0.467878 2.597400 0.243424\nv 0.472283 2.435437 -1.405953\nv 0.472283 2.435437 1.405953\nv 0.472434 0.105600 1.406405\nv 0.472434 0.105600 -1.406405\nv 0.477435 0.127575 1.421292\nv 0.477435 0.127575 -1.421292\nv 0.478256 2.572800 -0.478256\nv 0.478256 2.572800 0.478256\nv 0.478560 0.150000 -1.424640\nv 0.478560 2.400000 -1.424640\nv 0.478560 0.150000 1.424640\nv 0.478560 0.150000 1.424640\nv 0.478560 0.150000 -1.424640\nv 0.478560 2.400000 1.424640\nv 0.483027 0.177075 -1.437937\nv 0.483027 0.177075 1.437937\nv 0.489984 2.550000 -0.667656\nv 0.489984 2.550000 0.667656\nv 0.495150 0.213600 -1.474028\nv 0.495150 0.213600 1.474028\nv 0.499272 0.008400 -0.499272\nv 0.499272 0.008400 0.499272\nv 0.499384 2.597400 -0.167751\nv 0.499384 2.597400 0.167751\nv 0.502408 2.242575 -1.495635\nv 0.502408 2.242575 1.495635\nv 0.509349 2.502600 0.979002\nv 0.509349 2.502600 -0.979002\nv 0.513016 0.260025 -1.527214\nv 0.513016 0.260025 1.527214\nv 0.519028 2.597400 0.086273\nv 0.519028 2.597400 -0.086273\nv 0.525778 2.085600 -1.565204\nv 0.525778 2.085600 1.565204\nv 0.525800 2.597400 -0.000000\nv 0.525800 2.597400 0.000000\nv 0.529441 0.031200 -1.017621\nv 0.529441 0.031200 1.017621\nv 0.534711 0.316800 -1.591798\nv 0.534711 0.316800 1.591798\nv 0.545131 2.572800 -0.400065\nv 0.545131 2.572800 0.400065\nv 0.548190 1.929525 -1.631925\nv 0.548190 1.929525 1.631925\nv 0.557774 2.474400 -1.072079\nv 0.557774 2.474400 1.072079\nv 0.558320 0.384375 -1.662080\nv 0.558320 0.384375 1.662080\nv 0.565664 0.018225 0.770779\nv 0.565664 0.018225 -0.770779\nv 0.569086 0.008400 -0.417645\nv 0.569086 0.008400 0.417645\nv 0.569167 1.774800 -1.694372\nv 0.569167 1.774800 1.694372\nv 0.576340 2.527200 -0.785325\nv 0.576340 2.527200 0.785325\nv 0.581929 0.463200 -1.732362\nv 0.581929 0.463200 1.732362\nv 0.585750 2.550000 -0.585750\nv 0.585750 2.550000 0.585750\nv 0.588230 1.621875 -1.751120\nv 0.588230 1.621875 1.751120\nv 0.590089 2.440800 1.134190\nv 0.590089 2.440800 -1.134190\nv 0.594614 0.046875 -1.142888\nv 0.594614 0.046875 1.142888\nv 0.599396 2.572800 -0.311850\nv 0.599396 2.572800 0.311850\nv 0.601848 2.400000 -1.156792\nv 0.601848 2.400000 1.156792\nv 0.603624 0.553725 -1.796946\nv 0.603624 0.553725 1.796946\nv 0.604900 1.471200 -1.800745\nv 0.604900 1.471200 1.800745\nv 0.618698 1.323225 -1.841822\nv 0.618698 1.323225 1.841822\nv 0.621490 0.656400 -1.850132\nv 0.621490 0.656400 1.850132\nv 0.625735 0.008400 0.325553\nv 0.625735 0.008400 -0.325553\nv 0.629147 1.178400 -1.872927\nv 0.629147 1.178400 1.872927\nv 0.633613 0.771675 -1.886223\nv 0.633613 0.771675 1.886223\nv 0.635767 1.037175 -1.892634\nv 0.635767 1.037175 1.892634\nv 0.638080 0.900000 -1.899520\nv 0.638080 0.900000 -1.899520\nv 0.638080 0.900000 1.899520\nv 0.638080 0.900000 1.899520\nv 0.639070 2.463000 -1.228335\nv 0.639070 2.463000 1.228335\nv 0.639758 2.572800 -0.214905\nv 0.639758 2.572800 0.214905\nv 0.639915 2.482687 1.229959\nv 0.639915 2.482687 -1.229959\nv 0.639996 0.064800 -1.230115\nv 0.639996 0.064800 1.230115\nv 0.641628 2.435437 -1.233252\nv 0.641628 2.435437 1.233252\nv 0.643607 2.494500 -1.237056\nv 0.643607 2.494500 1.237056\nv 0.648144 2.400000 -1.245776\nv 0.648144 2.400000 1.245776\nv 0.649591 2.498438 -1.248557\nv 0.649591 2.498438 1.248557\nv 0.653431 2.502600 -0.890370\nv 0.653431 2.502600 0.890370\nv 0.657311 2.494500 -1.263395\nv 0.657311 2.494500 1.263395\nv 0.664924 2.572800 -0.110524\nv 0.664924 2.572800 0.110524\nv 0.666211 2.482687 1.280502\nv 0.666211 2.482687 -1.280502\nv 0.667656 2.550000 -0.489984\nv 0.667656 2.550000 0.489984\nv 0.667871 0.008400 -0.224349\nv 0.667871 0.008400 0.224349\nv 0.669128 0.084525 -1.286108\nv 0.669128 0.084525 1.286108\nv 0.673600 2.572800 0.000000\nv 0.673600 2.572800 -0.000000\nv 0.675736 2.463000 -1.298810\nv 0.675736 2.463000 1.298810\nv 0.676222 0.018225 0.676222\nv 0.676222 0.018225 -0.676222\nv 0.679207 0.031200 -0.925493\nv 0.679207 0.031200 0.925493\nv 0.685331 2.435437 -1.317252\nv 0.685331 2.435437 1.317252\nv 0.685551 0.105600 -1.317675\nv 0.685551 0.105600 1.317675\nv 0.688984 2.527200 -0.688984\nv 0.688984 2.527200 0.688984\nv 0.692808 0.127575 1.331623\nv 0.692808 0.127575 -1.331623\nv 0.694143 0.008400 -0.115381\nv 0.694143 0.008400 0.115381\nv 0.694440 0.150000 1.334760\nv 0.694440 0.150000 -1.334760\nv 0.694440 2.400000 1.334760\nv 0.694440 0.150000 -1.334760\nv 0.694440 0.150000 1.334760\nv 0.694440 2.400000 -1.334760\nv 0.700921 0.177075 1.347218\nv 0.700921 0.177075 -1.347218\nv 0.703200 0.008400 0.000000\nv 0.715555 2.474400 -0.975021\nv 0.715555 2.474400 0.975021\nv 0.718514 0.213600 1.381032\nv 0.718514 0.213600 -1.381032\nv 0.729046 2.242575 -1.401276\nv 0.729046 2.242575 1.401276\nv 0.734118 2.550000 -0.381942\nv 0.734118 2.550000 0.381942\nv 0.744440 0.260025 1.430863\nv 0.744440 0.260025 -1.430863\nv 0.757010 2.440800 1.031508\nv 0.757010 2.440800 -1.031508\nv 0.762816 0.046875 -1.039419\nv 0.762816 0.046875 1.039419\nv 0.762958 2.085600 -1.466456\nv 0.762958 2.085600 1.466456\nv 0.770779 0.018225 0.565664\nv 0.770779 0.018225 -0.565664\nv 0.772096 2.400000 -1.052064\nv 0.772096 2.400000 1.052064\nv 0.775921 0.316800 -1.491372\nv 0.775921 0.316800 1.491372\nv 0.781142 2.502600 -0.781142\nv 0.781142 2.502600 0.781142\nv 0.783552 2.550000 -0.263208\nv 0.783552 2.550000 0.263208\nv 0.785325 2.527200 -0.576340\nv 0.785325 2.527200 0.576340\nv 0.795481 1.929525 1.528968\nv 0.795481 1.929525 -1.528968\nv 0.810180 0.384375 1.557220\nv 0.810180 0.384375 -1.557220\nv 0.811956 0.031200 0.811956\nv 0.811956 0.031200 -0.811956\nv 0.814374 2.550000 -0.135366\nv 0.814374 2.550000 0.135366\nv 0.819847 2.463000 -1.117130\nv 0.819847 2.463000 1.117130\nv 0.820931 2.482687 1.118607\nv 0.820931 2.482687 -1.118607\nv 0.821035 0.064800 1.118749\nv 0.821035 0.064800 -1.118749\nv 0.823129 2.435437 -1.121601\nv 0.823129 2.435437 1.121601\nv 0.825000 2.550000 0.000000\nv 0.825000 2.550000 0.000000\nv 0.825668 2.494500 -1.125061\nv 0.825668 2.494500 1.125061\nv 0.825921 1.774800 1.587475\nv 0.825921 1.774800 -1.587475\nv 0.831488 2.400000 -1.132992\nv 0.831488 2.400000 1.132992\nv 0.833344 2.498438 -1.135521\nv 0.833344 2.498438 1.135521\nv 0.843248 2.494500 -1.149016\nv 0.843248 2.494500 1.149016\nv 0.844439 0.463200 1.623068\nv 0.844439 0.463200 -1.623068\nv 0.847506 0.018225 -0.440935\nv 0.847506 0.018225 0.440935\nv 0.853583 1.621875 -1.640643\nv 0.853583 1.621875 1.640643\nv 0.854666 2.482687 -1.164574\nv 0.854666 2.482687 1.164574\nv 0.855408 2.474400 -0.855408\nv 0.855408 2.474400 0.855408\nv 0.858407 0.084525 -1.169673\nv 0.858407 0.084525 1.169673\nv 0.863501 2.527200 -0.449256\nv 0.863501 2.527200 0.449256\nv 0.866886 2.463000 -1.181225\nv 0.866886 2.463000 1.181225\nv 0.875920 0.553725 -1.683577\nv 0.875920 0.553725 1.683577\nv 0.877772 1.471200 -1.687137\nv 0.877772 1.471200 1.687137\nv 0.879195 2.435437 -1.197997\nv 0.879195 2.435437 1.197997\nv 0.879477 0.105600 -1.198382\nv 0.879477 0.105600 1.198382\nv 0.888786 0.127575 1.211067\nv 0.888786 0.127575 -1.211067\nv 0.890370 2.502600 -0.653431\nv 0.890370 2.502600 0.653431\nv 0.890880 0.150000 -1.213920\nv 0.890880 0.150000 1.213920\nv 0.890880 2.400000 -1.213920\nv 0.890880 0.150000 -1.213920\nv 0.890880 0.150000 1.213920\nv 0.890880 2.400000 1.213920\nv 0.897795 1.323225 -1.725622\nv 0.897795 1.323225 1.725622\nv 0.899195 0.177075 1.225250\nv 0.899195 0.177075 -1.225250\nv 0.901846 0.656400 -1.733408\nv 0.901846 0.656400 1.733408\nv 0.904575 0.018225 0.303862\nv 0.904575 0.018225 -0.303862\nv 0.904966 2.440800 0.904966\nv 0.904966 2.440800 -0.904966\nv 0.911906 0.046875 -0.911906\nv 0.911906 0.046875 0.911906\nv 0.912957 1.178400 -1.754764\nv 0.912957 1.178400 1.754764\nv 0.919439 0.771675 -1.767222\nv 0.919439 0.771675 1.767222\nv 0.921647 2.527200 -0.309596\nv 0.921647 2.527200 0.309596\nv 0.921764 0.213600 1.256003\nv 0.921764 0.213600 -1.256003\nv 0.922564 1.037175 1.773229\nv 0.922564 1.037175 -1.773229\nv 0.923000 2.400000 -0.923000\nv 0.923000 2.400000 0.923000\nv 0.925493 0.031200 0.679207\nv 0.925493 0.031200 -0.679207\nv 0.925920 0.900000 1.779680\nv 0.925920 0.900000 -1.779680\nv 0.925920 0.900000 -1.779680\nv 0.925920 0.900000 1.779680\nv 0.935276 2.242575 -1.274414\nv 0.935276 2.242575 1.274414\nv 0.940158 0.018225 0.156274\nv 0.940158 0.018225 -0.156274\nv 0.952425 0.018225 0.000000\nv 0.952425 0.018225 0.000000\nv 0.955023 0.260025 1.301322\nv 0.955023 0.260025 -1.301322\nv 0.957901 2.527200 -0.159223\nv 0.957901 2.527200 0.159223\nv 0.970400 2.527200 0.000000\nv 0.970400 2.527200 -0.000000\nv 0.975021 2.474400 -0.715555\nv 0.975021 2.474400 0.715555\nv 0.978780 2.085600 -1.333693\nv 0.978780 2.085600 1.333693\nv 0.979002 2.502600 0.509349\nv 0.979002 2.502600 -0.509349\nv 0.980084 2.463000 -0.980084\nv 0.980084 2.463000 0.980084\nv 0.981380 2.482687 -0.981380\nv 0.981380 2.482687 0.981380\nv 0.981504 0.064800 0.981504\nv 0.981504 0.064800 -0.981504\nv 0.984007 2.435437 -0.984007\nv 0.984007 2.435437 0.984007\nv 0.987042 2.494500 -0.987042\nv 0.987042 2.494500 0.987042\nv 0.994000 2.400000 -0.994000\nv 0.994000 2.400000 0.994000\nv 0.995410 0.316800 -1.356353\nv 0.995410 0.316800 1.356353\nv 0.996219 2.498438 -0.996219\nv 0.996219 2.498438 0.996219\nv 1.008058 2.494500 -1.008058\nv 1.008058 2.494500 1.008058\nv 1.017621 0.031200 0.529441\nv 1.017621 0.031200 -0.529441\nv 1.020503 1.929525 -1.390545\nv 1.020503 1.929525 1.390545\nv 1.021708 2.482687 -1.021708\nv 1.021708 2.482687 1.021708\nv 1.026181 0.084525 -1.026181\nv 1.026181 0.084525 1.026181\nv 1.031508 2.440800 0.757010\nv 1.031508 2.440800 -0.757010\nv 1.036316 2.463000 -1.036316\nv 1.036316 2.463000 1.036316\nv 1.039360 0.384375 -1.416240\nv 1.039360 0.384375 1.416240\nv 1.039419 0.046875 -0.762816\nv 1.039419 0.046875 0.762816\nv 1.044926 2.502600 -0.351008\nv 1.044926 2.502600 0.351008\nv 1.051031 2.435437 -1.051031\nv 1.051031 2.435437 1.051031\nv 1.051368 0.105600 -1.051368\nv 1.051368 0.105600 1.051368\nv 1.052064 2.400000 -0.772096\nv 1.052064 2.400000 0.772096\nv 1.059553 1.774800 -1.443756\nv 1.059553 1.774800 1.443756\nv 1.062497 0.127575 1.062497\nv 1.062497 0.127575 -1.062497\nv 1.065000 0.150000 -1.065000\nv 1.065000 0.150000 1.065000\nv 1.065000 2.400000 -1.065000\nv 1.065000 2.400000 1.065000\nv 1.072079 2.474400 -0.557774\nv 1.072079 2.474400 0.557774\nv 1.074940 0.177075 -1.074940\nv 1.074940 0.177075 1.074940\nv 1.083310 0.463200 -1.476127\nv 1.083310 0.463200 1.476127\nv 1.086029 2.502600 0.180521\nv 1.086029 2.502600 -0.180521\nv 1.086146 0.031200 0.364854\nv 1.086146 0.031200 -0.364854\nv 1.095040 1.621875 -1.492110\nv 1.095040 1.621875 1.492110\nv 1.100200 2.502600 -0.000000\nv 1.100200 2.502600 0.000000\nv 1.101920 0.213600 1.101920\nv 1.101920 0.213600 -1.101920\nv 1.117130 2.463000 -0.819847\nv 1.117130 2.463000 0.819847\nv 1.118073 2.242575 -1.118073\nv 1.118073 2.242575 1.118073\nv 1.118607 2.482687 -0.820931\nv 1.118607 2.482687 0.820931\nv 1.118749 0.064800 -0.821035\nv 1.118749 0.064800 0.821035\nv 1.121601 2.435437 -0.823129\nv 1.121601 2.435437 0.823129\nv 1.123697 0.553725 -1.531158\nv 1.123697 0.553725 1.531158\nv 1.125061 2.494500 -0.825668\nv 1.125061 2.494500 0.825668\nv 1.126072 1.471200 -1.534395\nv 1.126072 1.471200 1.534395\nv 1.128870 0.031200 -0.187642\nv 1.128870 0.031200 0.187642\nv 1.132992 2.400000 -0.831488\nv 1.132992 2.400000 0.831488\nv 1.134190 2.440800 0.590089\nv 1.134190 2.440800 -0.590089\nv 1.135521 2.498438 -0.833344\nv 1.135521 2.498438 0.833344\nv 1.141680 0.260025 1.141680\nv 1.141680 0.260025 -1.141680\nv 1.142888 0.046875 -0.594614\nv 1.142888 0.046875 0.594614\nv 1.143600 0.031200 0.000000\nv 1.143600 0.031200 0.000000\nv 1.144271 2.474400 -0.384379\nv 1.144271 2.474400 0.384379\nv 1.149016 2.494500 -0.843248\nv 1.149016 2.494500 0.843248\nv 1.151759 1.323225 -1.569396\nv 1.151759 1.323225 1.569396\nv 1.156792 2.400000 -0.601848\nv 1.156792 2.400000 0.601848\nv 1.156956 0.656400 -1.576477\nv 1.156956 0.656400 1.576477\nv 1.164574 2.482687 -0.854666\nv 1.164574 2.482687 0.854666\nv 1.169673 0.084525 -0.858407\nv 1.169673 0.084525 0.858407\nv 1.170080 2.085600 -1.170080\nv 1.170080 2.085600 1.170080\nv 1.171210 1.178400 -1.595900\nv 1.171210 1.178400 1.595900\nv 1.179525 0.771675 -1.607230\nv 1.179525 0.771675 1.607230\nv 1.181225 2.463000 -0.866886\nv 1.181225 2.463000 0.866886\nv 1.183534 1.037175 -1.612693\nv 1.183534 1.037175 1.612693\nv 1.187840 0.900000 -1.618560\nv 1.187840 0.900000 -1.618560\nv 1.187840 0.900000 1.618560\nv 1.187840 0.900000 1.618560\nv 1.189282 2.474400 -0.197684\nv 1.189282 2.474400 0.197684\nv 1.189960 0.316800 -1.189960\nv 1.189960 0.316800 1.189960\nv 1.197997 2.435437 -0.879195\nv 1.197997 2.435437 0.879195\nv 1.198382 0.105600 -0.879477\nv 1.198382 0.105600 0.879477\nv 1.204800 2.474400 0.000000\nv 1.204800 2.474400 -0.000000\nv 1.210564 2.440800 0.406648\nv 1.210564 2.440800 -0.406648\nv 1.211067 0.127575 0.888786\nv 1.211067 0.127575 -0.888786\nv 1.213920 0.150000 -0.890880\nv 1.213920 0.150000 -0.890880\nv 1.213920 0.150000 0.890880\nv 1.213920 0.150000 0.890880\nv 1.213920 2.400000 -0.890880\nv 1.213920 2.400000 0.890880\nv 1.219848 0.046875 -0.409767\nv 1.219848 0.046875 0.409767\nv 1.219958 1.929525 1.219958\nv 1.219958 1.929525 -1.219958\nv 1.225250 0.177075 0.899195\nv 1.225250 0.177075 -0.899195\nv 1.228335 2.463000 -0.639070\nv 1.228335 2.463000 0.639070\nv 1.229959 2.482687 -0.639915\nv 1.229959 2.482687 0.639915\nv 1.230115 0.064800 -0.639996\nv 1.230115 0.064800 0.639996\nv 1.233252 2.435437 -0.641628\nv 1.233252 2.435437 0.641628\nv 1.234688 2.400000 -0.414752\nv 1.234688 2.400000 0.414752\nv 1.237056 2.494500 -0.643607\nv 1.237056 2.494500 0.643607\nv 1.242500 0.384375 -1.242500\nv 1.242500 0.384375 1.242500\nv 1.245776 2.400000 -0.648144\nv 1.245776 2.400000 0.648144\nv 1.248557 2.498438 -0.649591\nv 1.248557 2.498438 0.649591\nv 1.256003 0.213600 0.921764\nv 1.256003 0.213600 -0.921764\nv 1.258183 2.440800 0.209136\nv 1.258183 2.440800 -0.209136\nv 1.263395 2.494500 -0.657311\nv 1.263395 2.494500 0.657311\nv 1.266640 1.774800 -1.266640\nv 1.266640 1.774800 1.266640\nv 1.267832 0.046875 -0.210740\nv 1.267832 0.046875 0.210740\nv 1.274414 2.242575 -0.935276\nv 1.274414 2.242575 0.935276\nv 1.274600 2.440800 0.000000\nv 1.274600 2.440800 0.000000\nv 1.280502 2.482687 -0.666211\nv 1.280502 2.482687 0.666211\nv 1.283256 2.400000 -0.213304\nv 1.283256 2.400000 0.213304\nv 1.284375 0.046875 0.000000\nv 1.284375 0.046875 -0.000000\nv 1.286108 0.084525 -0.669128\nv 1.286108 0.084525 0.669128\nv 1.295040 0.463200 -1.295040\nv 1.295040 0.463200 1.295040\nv 1.298810 2.463000 -0.675736\nv 1.298810 2.463000 0.675736\nv 1.300000 2.400000 0.000000\nv 1.300000 2.400000 -0.000000\nv 1.301322 0.260025 0.955023\nv 1.301322 0.260025 -0.955023\nv 1.309063 1.621875 -1.309063\nv 1.309063 1.621875 1.309063\nv 1.311049 2.463000 -0.440403\nv 1.311049 2.463000 0.440403\nv 1.312782 2.482687 -0.440985\nv 1.312782 2.482687 0.440985\nv 1.312948 0.064800 0.441041\nv 1.312948 0.064800 -0.441041\nv 1.316296 2.435437 -0.442166\nv 1.316296 2.435437 0.442166\nv 1.317252 2.435437 -0.685331\nv 1.317252 2.435437 0.685331\nv 1.317675 0.105600 -0.685551\nv 1.317675 0.105600 0.685551\nv 1.320356 2.494500 -0.443529\nv 1.320356 2.494500 0.443529\nv 1.329664 2.400000 -0.446656\nv 1.329664 2.400000 0.446656\nv 1.331623 0.127575 0.692808\nv 1.331623 0.127575 -0.692808\nv 1.332632 2.498438 -0.447653\nv 1.332632 2.498438 0.447653\nv 1.333693 2.085600 -0.978780\nv 1.333693 2.085600 0.978780\nv 1.334760 0.150000 0.694440\nv 1.334760 0.150000 -0.694440\nv 1.334760 0.150000 -0.694440\nv 1.334760 0.150000 0.694440\nv 1.334760 2.400000 -0.694440\nv 1.334760 2.400000 0.694440\nv 1.343320 0.553725 -1.343320\nv 1.343320 0.553725 1.343320\nv 1.346160 1.471200 -1.346160\nv 1.346160 1.471200 1.346160\nv 1.347218 0.177075 0.700921\nv 1.347218 0.177075 -0.700921\nv 1.348469 2.494500 -0.452973\nv 1.348469 2.494500 0.452973\nv 1.356353 0.316800 -0.995410\nv 1.356353 0.316800 0.995410\nv 1.362620 2.463000 -0.226496\nv 1.362620 2.463000 0.226496\nv 1.364422 2.482687 -0.226795\nv 1.364422 2.482687 0.226795\nv 1.364595 0.064800 -0.226824\nv 1.364595 0.064800 0.226824\nv 1.366728 2.482687 -0.459107\nv 1.366728 2.482687 0.459107\nv 1.368074 2.435437 -0.227403\nv 1.368074 2.435437 0.227403\nv 1.372294 2.494500 -0.228104\nv 1.372294 2.494500 0.228104\nv 1.372712 0.084525 -0.461116\nv 1.372712 0.084525 0.461116\nv 1.376867 1.323225 -1.376868\nv 1.376868 1.323225 1.376867\nv 1.380400 2.463000 0.000000\nv 1.380400 2.463000 -0.000000\nv 1.381032 0.213600 0.718514\nv 1.381032 0.213600 -0.718514\nv 1.381968 2.400000 -0.229712\nv 1.381968 2.400000 0.229712\nv 1.382225 2.482687 0.000000\nv 1.382225 2.482687 0.000000\nv 1.382400 0.064800 0.000000\nv 1.382400 0.064800 0.000000\nv 1.383080 0.656400 -1.383080\nv 1.383080 0.656400 1.383080\nv 1.385053 2.498438 -0.230225\nv 1.385053 2.498438 0.230225\nv 1.385925 2.435437 0.000000\nv 1.385925 2.435437 -0.000000\nv 1.386270 2.463000 -0.465671\nv 1.386270 2.463000 0.465671\nv 1.390200 2.494500 0.000000\nv 1.390200 2.494500 -0.000000\nv 1.390545 1.929525 -1.020503\nv 1.390545 1.929525 1.020503\nv 1.400000 2.400000 0.000000\nv 1.400000 2.400000 0.000000\nv 1.400120 1.178400 -1.400120\nv 1.400120 1.178400 1.400120\nv 1.401276 2.242575 -0.729046\nv 1.401276 2.242575 0.729046\nv 1.401513 2.494500 -0.232961\nv 1.401513 2.494500 0.232961\nv 1.403125 2.498438 0.000000\nv 1.403125 2.498438 0.000000\nv 1.405953 2.435437 -0.472283\nv 1.405953 2.435437 0.472283\nv 1.406405 0.105600 -0.472434\nv 1.406405 0.105600 0.472434\nv 1.410060 0.771675 -1.410060\nv 1.410060 0.771675 1.410060\nv 1.414853 1.037175 -1.414853\nv 1.414853 1.037175 1.414853\nv 1.416240 0.384375 -1.039360\nv 1.416240 0.384375 1.039360\nv 1.419800 2.494500 0.000000\nv 1.419800 2.494500 -0.000000\nv 1.420000 0.900000 -1.420000\nv 1.420000 0.900000 -1.420000\nv 1.420000 0.900000 1.420000\nv 1.420000 0.900000 1.420000\nv 1.420490 2.482687 -0.236115\nv 1.420490 2.482687 0.236115\nv 1.421292 0.127575 0.477435\nv 1.421292 0.127575 -0.477435\nv 1.424640 0.150000 -0.478560\nv 1.424640 0.150000 -0.478560\nv 1.424640 0.150000 0.478560\nv 1.424640 0.150000 0.478560\nv 1.424640 2.400000 -0.478560\nv 1.424640 2.400000 0.478560\nv 1.426709 0.084525 -0.237149\nv 1.426709 0.084525 0.237149\nv 1.430863 0.260025 0.744440\nv 1.430863 0.260025 -0.744440\nv 1.437937 0.177075 0.483027\nv 1.437937 0.177075 -0.483027\nv 1.439025 2.482687 0.000000\nv 1.440800 2.463000 -0.239491\nv 1.440800 2.463000 0.239491\nv 1.443756 1.774800 -1.059553\nv 1.443756 1.774800 1.059553\nv 1.445325 0.084525 0.000000\nv 1.445325 0.084525 0.000000\nv 1.459600 2.463000 0.000000\nv 1.459600 2.463000 -0.000000\nv 1.461258 2.435437 -0.242892\nv 1.461258 2.435437 0.242892\nv 1.461727 0.105600 -0.242970\nv 1.461727 0.105600 0.242970\nv 1.466456 2.085600 -0.762958\nv 1.466456 2.085600 0.762958\nv 1.474028 0.213600 0.495150\nv 1.474028 0.213600 -0.495150\nv 1.476127 0.463200 -1.083310\nv 1.476127 0.463200 1.083310\nv 1.477200 0.127575 0.245542\nv 1.477200 0.127575 -0.245542\nv 1.480325 2.435437 0.000000\nv 1.480325 2.435437 -0.000000\nv 1.480680 0.150000 -0.246120\nv 1.480680 0.150000 0.246120\nv 1.480680 0.150000 0.246120\nv 1.480680 0.150000 -0.246120\nv 1.480680 2.400000 -0.246120\nv 1.480680 2.400000 0.246120\nv 1.480800 0.105600 0.000000\nv 1.480800 0.105600 0.000000\nv 1.491372 0.316800 -0.775921\nv 1.491372 0.316800 0.775921\nv 1.492110 1.621875 -1.095040\nv 1.492110 1.621875 1.095040\nv 1.494500 0.177075 0.248417\nv 1.494500 0.177075 -0.248417\nv 1.495635 2.242575 -0.502408\nv 1.495635 2.242575 0.502408\nv 1.496475 0.127575 0.000000\nv 1.496475 0.127575 0.000000\nv 1.500000 0.150000 0.000000\nv 1.500000 0.150000 0.000000\nv 1.500000 2.400000 0.000000\nv 1.500000 2.400000 0.000000\nv 1.514000 0.177075 -0.000000\nv 1.514000 0.177075 0.000000\nv 1.527214 0.260025 -0.513016\nv 1.527214 0.260025 0.513016\nv 1.528968 1.929525 -0.795481\nv 1.528968 1.929525 0.795481\nv 1.531158 0.553725 -1.123697\nv 1.531158 0.553725 1.123697\nv 1.532010 0.213600 0.254652\nv 1.532010 0.213600 -0.254652\nv 1.534395 1.471200 -1.126072\nv 1.534395 1.471200 1.126072\nv 1.552000 0.213600 0.000000\nv 1.552000 0.213600 0.000000\nv 1.554467 2.242575 -0.258385\nv 1.554467 2.242575 0.258385\nv 1.557220 0.384375 -0.810180\nv 1.557220 0.384375 0.810180\nv 1.565204 2.085600 -0.525778\nv 1.565204 2.085600 0.525778\nv 1.569396 1.323225 -1.151759\nv 1.569396 1.323225 1.151759\nv 1.574750 2.242575 0.000000\nv 1.574750 2.242575 0.000000\nv 1.576477 0.656400 -1.156956\nv 1.576477 0.656400 1.156956\nv 1.587289 0.260025 0.263841\nv 1.587289 0.260025 -0.263841\nv 1.587475 1.774800 -0.825921\nv 1.587475 1.774800 0.825921\nv 1.591798 0.316800 -0.534711\nv 1.591798 0.316800 0.534711\nv 1.595900 1.178400 -1.171210\nv 1.595900 1.178400 1.171210\nv 1.607230 0.771675 -1.179525\nv 1.607230 0.771675 1.179525\nv 1.608000 0.260025 0.000000\nv 1.608000 0.260025 0.000000\nv 1.612693 1.037175 -1.183534\nv 1.612693 1.037175 1.183534\nv 1.618560 0.900000 -1.187840\nv 1.618560 0.900000 -1.187840\nv 1.618560 0.900000 1.187840\nv 1.618560 0.900000 1.187840\nv 1.623068 0.463200 -0.844439\nv 1.623068 0.463200 0.844439\nv 1.626774 2.085600 -0.270404\nv 1.626774 2.085600 0.270404\nv 1.631925 1.929525 -0.548190\nv 1.631925 1.929525 0.548190\nv 1.640643 1.621875 -0.853583\nv 1.640643 1.621875 0.853583\nv 1.648000 2.085600 0.000000\nv 1.648000 2.085600 -0.000000\nv 1.654413 0.316800 -0.274998\nv 1.654413 0.316800 0.274998\nv 1.662080 0.384375 -0.558320\nv 1.662080 0.384375 0.558320\nv 1.676000 0.316800 0.000000\nv 1.676000 0.316800 0.000000\nv 1.683577 0.553725 -0.875920\nv 1.683577 0.553725 0.875920\nv 1.687137 1.471200 -0.877772\nv 1.687137 1.471200 0.877772\nv 1.694372 1.774800 -0.569167\nv 1.694372 1.774800 0.569167\nv 1.696119 1.929525 -0.281930\nv 1.696119 1.929525 0.281930\nv 1.700000 0.600000 0.000000\nv 1.700000 0.600000 0.000000\nv 1.700000 0.623100 0.178200\nv 1.700000 0.623100 -0.178200\nv 1.700000 0.685800 -0.316800\nv 1.700000 0.685800 0.316800\nv 1.700000 0.778200 0.415800\nv 1.700000 0.778200 -0.415800\nv 1.700000 0.890400 -0.475200\nv 1.700000 0.890400 0.475200\nv 1.700000 1.012500 -0.495000\nv 1.700000 1.012500 0.495000\nv 1.700000 1.134600 -0.475200\nv 1.700000 1.134600 0.475200\nv 1.700000 1.246800 0.415800\nv 1.700000 1.246800 -0.415800\nv 1.700000 1.339200 -0.316800\nv 1.700000 1.339200 0.316800\nv 1.700000 1.401900 0.178200\nv 1.700000 1.401900 -0.178200\nv 1.700000 1.425000 0.000000\nv 1.700000 1.425000 0.000000\nv 1.718250 1.929525 0.000000\nv 1.718250 1.929525 0.000000\nv 1.725622 1.323225 -0.897795\nv 1.725622 1.323225 0.897795\nv 1.727460 0.384375 -0.287140\nv 1.727460 0.384375 0.287140\nv 1.732362 0.463200 -0.581929\nv 1.732362 0.463200 0.581929\nv 1.733408 0.656400 -0.901846\nv 1.733408 0.656400 0.901846\nv 1.750000 0.384375 0.000000\nv 1.750000 0.384375 0.000000\nv 1.751120 1.621875 -0.588230\nv 1.751120 1.621875 0.588230\nv 1.754764 1.178400 -0.912957\nv 1.754764 1.178400 0.912957\nv 1.761022 1.774800 -0.292719\nv 1.761022 1.774800 0.292719\nv 1.767222 0.771675 -0.919439\nv 1.767222 0.771675 0.919439\nv 1.773229 1.037175 -0.922564\nv 1.773229 1.037175 0.922564\nv 1.779680 0.900000 -0.925920\nv 1.779680 0.900000 -0.925920\nv 1.779680 0.900000 0.925920\nv 1.779680 0.900000 0.925920\nv 1.784000 1.774800 0.000000\nv 1.784000 1.774800 0.000000\nv 1.796946 0.553725 -0.603624\nv 1.796946 0.553725 0.603624\nv 1.800507 0.463200 -0.299282\nv 1.800507 0.463200 0.299282\nv 1.800745 1.471200 -0.604900\nv 1.800745 1.471200 0.604900\nv 1.820003 1.621875 -0.302523\nv 1.820003 1.621875 0.302522\nv 1.824000 0.463200 0.000000\nv 1.824000 0.463200 0.000000\nv 1.841822 1.323225 -0.618698\nv 1.841822 1.323225 0.618698\nv 1.843750 1.621875 0.000000\nv 1.843750 1.621875 -0.000000\nv 1.850132 0.656400 -0.621490\nv 1.850132 0.656400 0.621490\nv 1.867631 0.553725 -0.310439\nv 1.867631 0.553725 0.310439\nv 1.871580 1.471200 -0.311096\nv 1.871580 1.471200 0.311096\nv 1.872927 1.178400 -0.629147\nv 1.872927 1.178400 0.629147\nv 1.886223 0.771675 -0.633613\nv 1.886223 0.771675 0.633613\nv 1.892000 0.553725 0.000000\nv 1.892000 0.553725 -0.000000\nv 1.892634 1.037175 -0.635767\nv 1.892634 1.037175 0.635767\nv 1.896000 1.471200 0.000000\nv 1.896000 1.471200 0.000000\nv 1.899520 0.900000 -0.638080\nv 1.899520 0.900000 -0.638080\nv 1.899520 0.900000 0.638080\nv 1.899520 0.900000 0.638080\nv 1.914272 1.323225 -0.318192\nv 1.914272 1.323225 0.318192\nv 1.922910 0.656400 -0.319628\nv 1.922910 0.656400 0.319628\nv 1.935900 1.444200 0.000000\nv 1.935900 1.444200 0.000000\nv 1.939250 1.323225 0.000000\nv 1.939250 1.323225 -0.000000\nv 1.939394 1.423221 -0.175100\nv 1.939394 1.423221 0.175100\nv 1.946601 1.178400 -0.323566\nv 1.946601 1.178400 0.323566\nv 1.948000 0.656400 0.000000\nv 1.948000 0.656400 -0.000000\nv 1.948879 1.366278 -0.311290\nv 1.948879 1.366278 0.311290\nv 1.960420 0.771675 -0.325863\nv 1.960420 0.771675 0.325863\nv 1.962857 1.282362 -0.408568\nv 1.962857 1.282362 0.408568\nv 1.967083 1.037175 -0.326970\nv 1.967083 1.037175 0.326970\nv 1.972000 1.178400 0.000000\nv 1.972000 1.178400 0.000000\nv 1.974240 0.900000 -0.328160\nv 1.974240 0.900000 0.328160\nv 1.974240 0.900000 0.328160\nv 1.979830 1.180464 -0.466934\nv 1.979830 1.180464 0.466934\nv 1.986000 0.771675 0.000000\nv 1.986000 0.771675 -0.000000\nv 1.992750 1.037175 0.000000\nv 1.992750 1.037175 0.000000\nv 1.998300 1.069575 -0.486390\nv 1.998300 1.069575 0.486390\nv 2.000000 0.900000 0.000000\nv 2.000000 0.900000 0.000000\nv 2.016770 0.958686 -0.466934\nv 2.016770 0.958686 0.466934\nv 2.033743 0.856788 -0.408568\nv 2.033743 0.856788 0.408568\nv 2.047721 0.772872 0.311290\nv 2.047721 0.772872 -0.311290\nv 2.057206 0.715929 0.175100\nv 2.057206 0.715929 -0.175100\nv 2.060700 0.694950 0.000000\nv 2.060700 0.694950 0.000000\nv 2.111200 1.497600 0.000000\nv 2.111200 1.497600 0.000000\nv 2.116979 1.479120 -0.166687\nv 2.116979 1.479120 0.166687\nv 2.132666 1.428960 -0.296333\nv 2.132666 1.428960 0.296333\nv 2.155782 1.355040 -0.388937\nv 2.155782 1.355040 0.388937\nv 2.183853 1.265280 -0.444499\nv 2.183853 1.265280 0.444499\nv 2.214400 1.167600 -0.463020\nv 2.214400 1.167600 0.463020\nv 2.237300 1.578900 0.000000\nv 2.237300 1.578900 0.000000\nv 2.244457 1.563171 -0.154289\nv 2.244457 1.563171 0.154289\nv 2.244947 1.069920 -0.444499\nv 2.244947 1.069920 0.444499\nv 2.263882 1.520478 -0.274291\nv 2.263882 1.520478 0.274291\nv 2.273018 0.980160 -0.388937\nv 2.273018 0.980160 0.388937\nv 2.292510 1.457562 -0.360007\nv 2.292510 1.457562 0.360007\nv 2.296134 0.906240 -0.296333\nv 2.296134 0.906240 0.296333\nv 2.311821 0.856080 -0.166687\nv 2.311821 0.856080 0.166687\nv 2.317600 0.837600 0.000000\nv 2.317600 0.837600 0.000000\nv 2.325600 1.681800 0.000000\nv 2.325600 1.681800 0.000000\nv 2.327271 1.381164 -0.411437\nv 2.327271 1.381164 0.411437\nv 2.333530 1.668948 -0.139234\nv 2.333530 1.668948 0.139234\nv 2.355053 1.634064 -0.247526\nv 2.355053 1.634064 0.247526\nv 2.365100 1.298025 -0.428580\nv 2.365100 1.298025 0.428580\nv 2.386771 1.582656 -0.324878\nv 2.386771 1.582656 0.324878\nv 2.387500 1.800000 0.000000\nv 2.387500 1.800000 0.000000\nv 2.395900 1.790025 0.122850\nv 2.395900 1.790025 -0.122850\nv 2.402929 1.214886 -0.411437\nv 2.402929 1.214886 0.411437\nv 2.418700 1.762950 -0.218400\nv 2.418700 1.762950 0.218400\nv 2.425286 1.520232 -0.371290\nv 2.425286 1.520232 0.371290\nv 2.434400 1.927200 0.000000\nv 2.434400 1.927200 0.000000\nv 2.437690 1.138488 -0.360007\nv 2.437690 1.138488 0.360007\nv 2.443270 1.919976 0.106466\nv 2.443270 1.919976 -0.106466\nv 2.452300 1.723050 -0.286650\nv 2.452300 1.723050 0.286650\nv 2.466318 1.075572 -0.274291\nv 2.466318 1.075572 0.274291\nv 2.467200 1.452300 -0.386760\nv 2.467200 1.452300 0.386760\nv 2.467347 1.900368 0.189274\nv 2.467347 1.900368 -0.189274\nv 2.477700 2.057100 0.000000\nv 2.477700 2.057100 0.000000\nv 2.485743 1.032879 -0.154289\nv 2.485743 1.032879 0.154289\nv 2.487343 2.052375 -0.091411\nv 2.487343 2.052375 0.091411\nv 2.492900 1.017150 0.000000\nv 2.492900 1.017150 0.000000\nv 2.493100 1.674600 -0.327600\nv 2.493100 1.674600 0.327600\nv 2.502829 1.871472 0.248422\nv 2.502829 1.871472 -0.248422\nv 2.509114 1.384368 -0.371290\nv 2.509114 1.384368 0.371290\nv 2.513518 2.039550 0.162509\nv 2.513518 2.039550 -0.162509\nv 2.528800 2.183400 0.000000\nv 2.537500 1.621875 -0.341250\nv 2.537500 1.621875 0.341250\nv 2.539821 2.180796 -0.079013\nv 2.539821 2.180796 0.079013\nv 2.545914 1.836384 -0.283910\nv 2.545914 1.836384 0.283910\nv 2.547629 1.321944 -0.324878\nv 2.547629 1.321944 0.324878\nv 2.552090 2.020650 -0.213293\nv 2.552090 2.020650 0.213293\nv 2.569734 2.173728 -0.140467\nv 2.569734 2.173728 0.140467\nv 2.579347 1.270536 -0.247526\nv 2.579347 1.270536 0.247526\nv 2.581900 1.569150 -0.327600\nv 2.581900 1.569150 0.327600\nv 2.592800 1.798200 -0.295740\nv 2.592800 1.798200 0.295740\nv 2.598929 1.997700 -0.243763\nv 2.598929 1.997700 0.243763\nv 2.599100 2.299800 0.000000\nv 2.599100 2.299800 0.000000\nv 2.600870 1.235652 -0.139234\nv 2.600870 1.235652 0.139234\nv 2.608800 1.222800 0.000000\nv 2.608800 1.222800 0.000000\nv 2.612406 2.298813 0.070600\nv 2.612406 2.298813 -0.070600\nv 2.613818 2.163312 -0.184363\nv 2.613818 2.163312 0.184363\nv 2.622700 1.520700 -0.286650\nv 2.622700 1.520700 0.286650\nv 2.639686 1.760016 -0.283910\nv 2.639686 1.760016 0.283910\nv 2.648521 2.296134 0.125510\nv 2.648521 2.296134 -0.125510\nv 2.649900 1.972725 0.253920\nv 2.649900 1.972725 -0.253920\nv 2.656300 1.480800 -0.218400\nv 2.656300 1.480800 0.218400\nv 2.667347 2.150664 -0.210701\nv 2.667347 2.150664 0.210701\nv 2.679100 1.453725 0.122850\nv 2.679100 1.453725 -0.122850\nv 2.682771 1.724928 0.248422\nv 2.682771 1.724928 -0.248422\nv 2.687500 1.443750 0.000000\nv 2.687500 1.443750 0.000000\nv 2.700000 2.400000 0.000000\nv 2.700000 2.400000 0.000000\nv 2.700000 2.400000 0.000000\nv 2.700871 1.947750 -0.243763\nv 2.700871 1.947750 0.243763\nv 2.701743 2.292186 0.164732\nv 2.701743 2.292186 -0.164732\nv 2.716800 2.400000 0.067500\nv 2.716800 2.400000 -0.067500\nv 2.716800 2.400000 -0.067500\nv 2.716800 2.400000 0.067500\nv 2.718253 1.696032 0.189274\nv 2.718253 1.696032 -0.189274\nv 2.725600 2.136900 -0.219480\nv 2.725600 2.136900 0.219480\nv 2.729800 2.420250 0.000000\nv 2.742330 1.676424 0.106466\nv 2.742330 1.676424 -0.106466\nv 2.747407 2.420406 -0.066744\nv 2.747407 2.420406 0.066744\nv 2.747710 1.924800 -0.213293\nv 2.747710 1.924800 0.213293\nv 2.751200 1.669200 0.000000\nv 2.751200 1.669200 0.000000\nv 2.758400 2.436000 0.000000\nv 2.762400 2.400000 0.120000\nv 2.762400 2.400000 -0.120000\nv 2.762400 2.400000 -0.120000\nv 2.762400 2.400000 0.120000\nv 2.766370 2.287392 0.188266\nv 2.766370 2.287392 -0.188266\nv 2.776365 2.436302 -0.064692\nv 2.776365 2.436302 0.064692\nv 2.783853 2.123136 -0.210701\nv 2.783853 2.123136 0.210701\nv 2.784600 2.447250 0.000000\nv 2.784600 2.447250 0.000000\nv 2.786282 1.905900 0.162509\nv 2.786282 1.905900 -0.162509\nv 2.795198 2.420829 -0.118656\nv 2.795198 2.420829 0.118656\nv 2.800000 2.400000 0.000000\nv 2.802528 2.447680 -0.061668\nv 2.802528 2.447680 0.061668\nv 2.807200 2.454000 0.000000\nv 2.811200 2.400000 -0.040500\nv 2.811200 2.400000 0.040500\nv 2.812457 1.893075 0.091411\nv 2.812457 1.893075 -0.091411\nv 2.822100 1.888350 0.000000\nv 2.822100 1.888350 0.000000\nv 2.824200 2.420250 0.000000\nv 2.824200 2.420250 0.000000\nv 2.824750 2.454529 -0.057996\nv 2.824750 2.454529 0.057996\nv 2.825000 2.456250 0.000000\nv 2.825000 2.456250 0.000000\nv 2.825126 2.437123 -0.115008\nv 2.825126 2.437123 0.115008\nv 2.829600 2.400000 0.157500\nv 2.829600 2.400000 -0.157500\nv 2.829600 2.400000 -0.157500\nv 2.829600 2.400000 0.157500\nv 2.836672 2.420519 -0.041256\nv 2.836672 2.420519 0.041256\nv 2.836700 2.282175 0.196110\nv 2.836700 2.282175 -0.196110\nv 2.836800 2.454000 0.000000\nv 2.836800 2.454000 0.000000\nv 2.837382 2.110488 -0.184363\nv 2.837382 2.110488 0.184363\nv 2.837600 2.436000 0.000000\nv 2.837600 2.436000 0.000000\nv 2.841400 2.447250 0.000000\nv 2.841400 2.447250 0.000000\nv 2.841600 2.400000 -0.072000\nv 2.841600 2.400000 0.072000\nv 2.841887 2.456841 -0.054000\nv 2.841887 2.456841 0.054000\nv 2.851189 2.448847 -0.109632\nv 2.851189 2.448847 0.109632\nv 2.851331 2.436454 -0.043308\nv 2.851331 2.436454 0.043308\nv 2.852794 2.454605 -0.050004\nv 2.852794 2.454605 0.050004\nv 2.856323 2.447812 -0.046332\nv 2.856323 2.447812 0.046332\nv 2.865626 2.421453 -0.155736\nv 2.865626 2.421453 0.155736\nv 2.870524 2.421250 -0.073344\nv 2.870524 2.421250 0.073344\nv 2.872387 2.455966 -0.103104\nv 2.872387 2.455966 0.103104\nv 2.881466 2.100072 -0.140467\nv 2.881466 2.100072 0.140467\nv 2.886400 2.400000 -0.094500\nv 2.886400 2.400000 0.094500\nv 2.887725 2.458444 -0.096000\nv 2.887725 2.458444 0.096000\nv 2.888602 2.437685 -0.076992\nv 2.888602 2.437685 0.076992\nv 2.896205 2.456246 0.088896\nv 2.896205 2.456246 -0.088896\nv 2.896829 2.449338 -0.082368\nv 2.896829 2.449338 0.082368\nv 2.896986 2.438333 -0.150948\nv 2.896986 2.438333 0.150948\nv 2.907030 2.276958 0.188266\nv 2.907030 2.276958 -0.188266\nv 2.911200 2.400000 -0.180000\nv 2.911200 2.400000 -0.180000\nv 2.911200 2.400000 0.180000\nv 2.911379 2.093004 -0.079013\nv 2.911379 2.093004 0.079013\nv 2.920412 2.422328 -0.096264\nv 2.920412 2.422328 0.096264\nv 2.922400 2.090400 0.000000\nv 2.922899 2.450567 -0.143892\nv 2.922899 2.450567 0.143892\nv 2.940800 2.400000 -0.108000\nv 2.940800 2.400000 0.108000\nv 2.942589 2.458082 -0.135324\nv 2.942589 2.458082 0.135324\nv 2.943526 2.439499 -0.101052\nv 2.943526 2.439499 0.101052\nv 2.951146 2.422210 -0.177984\nv 2.951146 2.422210 0.177984\nv 2.955275 2.460806 -0.126000\nv 2.955275 2.460806 0.126000\nv 2.956523 2.451588 -0.108108\nv 2.956523 2.451588 0.108108\nv 2.960179 2.458666 -0.116676\nv 2.960179 2.458666 0.116676\nv 2.971657 2.272164 0.164732\nv 2.971657 2.272164 -0.164732\nv 2.980990 2.423636 0.110016\nv 2.980990 2.423636 -0.110016\nv 2.984243 2.439802 -0.172512\nv 2.984243 2.439802 0.172512\nv 3.000000 2.400000 -0.187500\nv 3.000000 2.400000 -0.187500\nv 3.000000 2.400000 -0.112500\nv 3.000000 2.400000 0.112500\nv 3.000000 2.400000 0.187500\nv 3.009977 2.452655 -0.164448\nv 3.009977 2.452655 0.164448\nv 3.010221 2.441702 -0.115488\nv 3.010221 2.441702 0.115488\nv 3.024879 2.268216 0.125510\nv 3.024879 2.268216 -0.125510\nv 3.027834 2.460653 -0.154656\nv 3.027834 2.460653 0.154656\nv 3.029007 2.454319 -0.123552\nv 3.029007 2.454319 0.123552\nv 3.037300 2.463675 -0.144000\nv 3.037300 2.463675 0.144000\nv 3.037862 2.461603 0.133344\nv 3.037862 2.461603 -0.133344\nv 3.044212 2.423034 -0.185400\nv 3.044212 2.423034 0.185400\nv 3.046912 2.425059 0.114600\nv 3.046912 2.425059 -0.114600\nv 3.059200 2.400000 -0.108000\nv 3.059200 2.400000 0.108000\nv 3.060994 2.265537 0.070600\nv 3.060994 2.265537 -0.070600\nv 3.074300 2.264550 0.000000\nv 3.074300 2.264550 0.000000\nv 3.079200 2.441400 -0.179700\nv 3.079200 2.441400 0.179700\nv 3.082800 2.444100 -0.120300\nv 3.082800 2.444100 0.120300\nv 3.088800 2.400000 -0.180000\nv 3.088800 2.400000 -0.180000\nv 3.088800 2.400000 0.180000\nv 3.104737 2.454928 -0.171300\nv 3.104738 2.454928 0.171300\nv 3.107887 2.457291 -0.128700\nv 3.107887 2.457291 0.128700\nv 3.112835 2.426483 0.110016\nv 3.112835 2.426483 -0.110016\nv 3.113600 2.400000 -0.094500\nv 3.113600 2.400000 0.094500\nv 3.120600 2.463450 0.161100\nv 3.120600 2.463450 -0.161100\nv 3.122400 2.464800 0.138900\nv 3.122400 2.464800 -0.138900\nv 3.126562 2.466797 -0.150000\nv 3.126562 2.466797 0.150000\nv 3.137279 2.423859 -0.177984\nv 3.137279 2.423859 0.177984\nv 3.155379 2.446498 -0.115488\nv 3.155379 2.446498 0.115488\nv 3.158400 2.400000 -0.072000\nv 3.158400 2.400000 0.072000\nv 3.170400 2.400000 -0.157500\nv 3.170400 2.400000 0.157500\nv 3.170400 2.400000 -0.157500\nv 3.173413 2.427791 -0.096264\nv 3.173413 2.427791 0.096264\nv 3.174157 2.442998 -0.172512\nv 3.174157 2.442998 0.172512\nv 3.186768 2.460263 -0.123552\nv 3.186768 2.460263 0.123552\nv 3.188800 2.400000 -0.040500\nv 3.188800 2.400000 0.040500\nv 3.199498 2.457201 -0.164448\nv 3.199498 2.457201 0.164448\nv 3.200000 2.400000 0.000000\nv 3.206938 2.467997 0.133344\nv 3.206938 2.467997 -0.133344\nv 3.213366 2.466247 -0.154656\nv 3.213366 2.466247 0.154656\nv 3.215825 2.469919 -0.144000\nv 3.215825 2.469919 0.144000\nv 3.222074 2.448701 -0.101052\nv 3.222074 2.448701 0.101052\nv 3.222799 2.424616 -0.155736\nv 3.222799 2.424616 0.155736\nv 3.223301 2.428868 -0.073344\nv 3.223301 2.428868 0.073344\nv 3.237600 2.400000 -0.120000\nv 3.237600 2.400000 0.120000\nv 3.237600 2.400000 -0.120000\nv 3.257153 2.429599 -0.041256\nv 3.257153 2.429599 0.041256\nv 3.259252 2.462994 -0.108108\nv 3.259252 2.462994 0.108108\nv 3.261414 2.444467 -0.150948\nv 3.261414 2.444467 0.150948\nv 3.269625 2.429869 0.000000\nv 3.269625 2.429869 0.000000\nv 3.276998 2.450515 -0.076992\nv 3.276998 2.450515 0.076992\nv 3.283200 2.400000 -0.067500\nv 3.283200 2.400000 0.067500\nv 3.283200 2.400000 -0.067500\nv 3.284621 2.470934 -0.116676\nv 3.284621 2.470934 0.116676\nv 3.286576 2.459289 -0.143892\nv 3.286576 2.459289 0.143892\nv 3.293227 2.425240 -0.118656\nv 3.293227 2.425240 0.118656\nv 3.297850 2.472787 -0.126000\nv 3.297850 2.472788 0.126000\nv 3.298611 2.468818 -0.135324\nv 3.298611 2.468818 0.135324\nv 3.300000 2.400000 0.000000\nv 3.300000 2.400000 0.000000\nv 3.314269 2.451746 -0.043308\nv 3.314269 2.451746 0.043308\nv 3.318946 2.465243 -0.082368\nv 3.318946 2.465243 0.082368\nv 3.328000 2.452200 0.000000\nv 3.328000 2.452200 0.000000\nv 3.333274 2.445677 -0.115008\nv 3.333274 2.445677 0.115008\nv 3.341018 2.425663 -0.066744\nv 3.341018 2.425663 0.066744\nv 3.348595 2.473354 0.088896\nv 3.348595 2.473354 -0.088896\nv 3.358286 2.461009 -0.109632\nv 3.358286 2.461009 0.109632\nv 3.358625 2.425819 0.000000\nv 3.359452 2.466769 -0.046332\nv 3.359452 2.466769 0.046332\nv 3.365400 2.475150 -0.096000\nv 3.365400 2.475150 0.096000\nv 3.368813 2.470934 -0.103104\nv 3.368813 2.470934 0.103104\nv 3.374375 2.467331 0.000000\nv 3.374375 2.467331 0.000000\nv 3.382035 2.446498 -0.064692\nv 3.382035 2.446498 0.064692\nv 3.392006 2.474995 -0.050004\nv 3.392006 2.474995 0.050004\nv 3.400000 2.446800 0.000000\nv 3.406947 2.462176 -0.061668\nv 3.406947 2.462176 0.061668\nv 3.408000 2.475600 0.000000\nv 3.408000 2.475600 0.000000\nv 3.411237 2.476753 -0.054000\nv 3.411237 2.476753 0.054000\nv 3.416450 2.472371 -0.057996\nv 3.416450 2.472371 0.057996\nv 3.424875 2.462606 0.000000\nv 3.428125 2.477344 0.000000\nv 3.428125 2.477344 0.000000\nv 3.434000 2.472900 0.000000\n\nf 2909 2921 2939\nf 2939 2931 2909\nf 2869 2877 2921\nf 2921 2909 2869\nf 2819 2827 2877\nf 2877 2869 2819\nf 2737 2747 2827\nf 2827 2819 2737\nf 2669 2673 2747\nf 2747 2737 2669\nf 2567 2575 2673\nf 2673 2669 2567\nf 2476 2480 2575\nf 2575 2567 2476\nf 2358 2362 2480\nf 2480 2476 2358\nf 2158 2162 2362\nf 2362 2358 2158\nf 1715 1812 2162\nf 2162 2158 1715\nf 2901 2909 2931\nf 2931 2917 2901\nf 2863 2869 2909\nf 2909 2901 2863\nf 2813 2819 2869\nf 2869 2863 2813\nf 2729 2737 2819\nf 2819 2813 2729\nf 2663 2669 2737\nf 2737 2729 2663\nf 2561 2567 2669\nf 2669 2663 2561\nf 2468 2476 2567\nf 2567 2561 2468\nf 2350 2358 2476\nf 2476 2468 2350\nf 2152 2158 2358\nf 2358 2350 2152\nf 1717 1715 2158\nf 2158 2152 1717\nf 2903 2901 2917\nf 2917 2923 2903\nf 2865 2863 2901\nf 2901 2903 2865\nf 2815 2813 2863\nf 2863 2865 2815\nf 2733 2729 2813\nf 2813 2815 2733\nf 2665 2663 2729\nf 2729 2733 2665\nf 2564 2561 2663\nf 2663 2665 2564\nf 2473 2468 2561\nf 2561 2564 2473\nf 2354 2350 2468\nf 2468 2473 2354\nf 2155 2152 2350\nf 2350 2354 2155\nf 1927 1717 2152\nf 2152 2155 1927\nf 2911 2903 2923\nf 2923 2935 2911\nf 2875 2865 2903\nf 2903 2911 2875\nf 2823 2815 2865\nf 2865 2875 2823\nf 2741 2733 2815\nf 2815 2823 2741\nf 2671 2665 2733\nf 2733 2741 2671\nf 2571 2564 2665\nf 2665 2671 2571\nf 2478 2473 2564\nf 2564 2571 2478\nf 2360 2354 2473\nf 2473 2478 2360\nf 2160 2155 2354\nf 2354 2360 2160\nf 1718 1927 2155\nf 2155 2160 1718\nf 2929 2911 2935\nf 2935 2947 2929\nf 2881 2875 2911\nf 2911 2929 2881\nf 2829 2823 2875\nf 2875 2881 2829\nf 2751 2741 2823\nf 2823 2829 2751\nf 2677 2671 2741\nf 2741 2751 2677\nf 2577 2571 2671\nf 2671 2677 2577\nf 2482 2478 2571\nf 2571 2577 2482\nf 2364 2360 2478\nf 2478 2482 2364\nf 2164 2160 2360\nf 2360 2364 2164\nf 1842 1718 2160\nf 2160 2164 1842\nf 2945 2929 2947\nf 2947 2959 2945\nf 2897 2881 2929\nf 2929 2945 2897\nf 2835 2829 2881\nf 2881 2897 2835\nf 2761 2751 2829\nf 2829 2835 2761\nf 2679 2677 2751\nf 2751 2761 2679\nf 2579 2577 2677\nf 2677 2679 2579\nf 2486 2482 2577\nf 2577 2579 2486\nf 2368 2364 2482\nf 2482 2486 2368\nf 2172 2164 2364\nf 2364 2368 2172\nf 1725 1842 2164\nf 2164 2172 1725\nf 2965 2945 2959\nf 2959 2981 2965\nf 2907 2897 2945\nf 2945 2965 2907\nf 2845 2835 2897\nf 2897 2907 2845\nf 2769 2761 2835\nf 2835 2845 2769\nf 2685 2679 2761\nf 2761 2769 2685\nf 2587 2579 2679\nf 2679 2685 2587\nf 2491 2486 2579\nf 2579 2587 2491\nf 2370 2368 2486\nf 2486 2491 2370\nf 2174 2172 2368\nf 2368 2370 2174\nf 1834 1725 2172\nf 2172 2174 1834\nf 2982 2965 2981\nf 2981 2988 2982\nf 2933 2907 2965\nf 2965 2982 2933\nf 2855 2845 2907\nf 2907 2933 2855\nf 2779 2769 2845\nf 2845 2855 2779\nf 2691 2685 2769\nf 2769 2779 2691\nf 2595 2587 2685\nf 2685 2691 2595\nf 2500 2491 2587\nf 2587 2595 2500\nf 2374 2370 2491\nf 2491 2500 2374\nf 2178 2174 2370\nf 2370 2374 2178\nf 1716 1834 2174\nf 2174 2178 1716\nf 2990 2982 2988\nf 2988 3002 2990\nf 2949 2933 2982\nf 2982 2990 2949\nf 2871 2855 2933\nf 2933 2949 2871\nf 2791 2779 2855\nf 2855 2871 2791\nf 2699 2691 2779\nf 2779 2791 2699\nf 2601 2595 2691\nf 2691 2699 2601\nf 2506 2500 2595\nf 2595 2601 2506\nf 2378 2374 2500\nf 2500 2506 2378\nf 2180 2178 2374\nf 2374 2378 2180\nf 1714 1716 2178\nf 2178 2180 1714\nf 3008 2990 3002\nf 3002 3024 3008\nf 2973 2949 2990\nf 2990 3008 2973\nf 2889 2871 2949\nf 2949 2973 2889\nf 2805 2791 2871\nf 2871 2889 2805\nf 2711 2699 2791\nf 2791 2805 2711\nf 2611 2601 2699\nf 2699 2711 2611\nf 2521 2506 2601\nf 2601 2611 2521\nf 2387 2378 2506\nf 2506 2521 2387\nf 2191 2180 2378\nf 2378 2387 2191\nf 1810 1714 2180\nf 2180 2191 1810\nf 1464 1460 1813\nf 1813 1821 1464\nf 1264 1260 1460\nf 1460 1464 1264\nf 1146 1142 1260\nf 1260 1264 1146\nf 1055 1047 1142\nf 1142 1146 1055\nf 953 949 1047\nf 1047 1055 953\nf 885 875 949\nf 949 953 885\nf 803 795 875\nf 875 885 803\nf 753 745 795\nf 795 803 753\nf 713 701 745\nf 745 753 713\nf 691 683 701\nf 701 713 691\nf 1470 1464 1821\nf 1821 1829 1470\nf 1272 1264 1464\nf 1464 1470 1272\nf 1154 1146 1264\nf 1264 1272 1154\nf 1061 1055 1146\nf 1146 1154 1061\nf 959 953 1055\nf 1055 1061 959\nf 893 885 953\nf 953 959 893\nf 809 803 885\nf 885 893 809\nf 759 753 803\nf 803 809 759\nf 721 713 753\nf 753 759 721\nf 705 691 713\nf 713 721 705\nf 1469 1470 1829\nf 1829 1835 1469\nf 1268 1272 1470\nf 1470 1469 1268\nf 1151 1154 1272\nf 1272 1268 1151\nf 1060 1061 1154\nf 1154 1151 1060\nf 957 959 1061\nf 1061 1060 957\nf 889 893 959\nf 959 957 889\nf 807 809 893\nf 893 889 807\nf 757 759 809\nf 809 807 757\nf 719 721 759\nf 759 757 719\nf 699 705 721\nf 721 719 699\nf 1462 1469 1835\nf 1835 1839 1462\nf 1262 1268 1469\nf 1469 1462 1262\nf 1144 1151 1268\nf 1268 1262 1144\nf 1051 1060 1151\nf 1151 1144 1051\nf 951 957 1060\nf 1060 1051 951\nf 881 889 957\nf 957 951 881\nf 799 807 889\nf 889 881 799\nf 747 757 807\nf 807 799 747\nf 711 719 757\nf 757 747 711\nf 687 699 719\nf 719 711 687\nf 1458 1462 1839\nf 1839 1843 1458\nf 1258 1262 1462\nf 1462 1458 1258\nf 1140 1144 1262\nf 1262 1258 1140\nf 1045 1051 1144\nf 1144 1140 1045\nf 945 951 1051\nf 1051 1045 945\nf 871 881 951\nf 951 945 871\nf 793 799 881\nf 881 871 793\nf 741 747 799\nf 799 793 741\nf 693 711 747\nf 747 741 693\nf 675 687 711\nf 711 693 675\nf 1450 1458 1843\nf 1843 1838 1450\nf 1254 1258 1458\nf 1458 1450 1254\nf 1136 1140 1258\nf 1258 1254 1136\nf 1043 1045 1140\nf 1140 1136 1043\nf 943 945 1045\nf 1045 1043 943\nf 861 871 945\nf 945 943 861\nf 787 793 871\nf 871 861 787\nf 725 741 793\nf 793 787 725\nf 677 693 741\nf 741 725 677\nf 663 675 693\nf 693 677 663\nf 1448 1450 1838\nf 1838 1834 1448\nf 1252 1254 1450\nf 1450 1448 1252\nf 1133 1136 1254\nf 1254 1252 1133\nf 1035 1043 1136\nf 1136 1133 1035\nf 937 943 1043\nf 1043 1035 937\nf 853 861 943\nf 943 937 853\nf 777 787 861\nf 861 853 777\nf 715 725 787\nf 787 777 715\nf 657 677 725\nf 725 715 657\nf 642 663 677\nf 677 657 642\nf 1444 1448 1834\nf 1834 1828 1444\nf 1248 1252 1448\nf 1448 1444 1248\nf 1122 1133 1252\nf 1252 1248 1122\nf 1027 1035 1133\nf 1133 1122 1027\nf 931 937 1035\nf 1035 1027 931\nf 843 853 937\nf 937 931 843\nf 767 777 853\nf 853 843 767\nf 689 715 777\nf 777 767 689\nf 640 657 715\nf 715 689 640\nf 634 642 657\nf 657 640 634\nf 1442 1444 1828\nf 1828 1820 1442\nf 1244 1248 1444\nf 1444 1442 1244\nf 1116 1122 1248\nf 1248 1244 1116\nf 1021 1027 1122\nf 1122 1116 1021\nf 923 931 1027\nf 1027 1021 923\nf 831 843 931\nf 931 923 831\nf 751 767 843\nf 843 831 751\nf 673 689 767\nf 767 751 673\nf 632 640 689\nf 689 673 632\nf 620 634 640\nf 640 632 620\nf 1429 1442 1820\nf 1820 1811 1429\nf 1233 1244 1442\nf 1442 1429 1233\nf 1106 1116 1244\nf 1244 1233 1106\nf 1011 1021 1116\nf 1116 1106 1011\nf 911 923 1021\nf 1021 1011 911\nf 817 831 923\nf 923 911 817\nf 733 751 831\nf 831 817 733\nf 649 673 751\nf 751 733 649\nf 614 632 673\nf 673 649 614\nf 597 620 632\nf 632 614 597\nf 714 702 684\nf 684 692 714\nf 754 746 702\nf 702 714 754\nf 804 796 746\nf 746 754 804\nf 886 876 796\nf 796 804 886\nf 954 950 876\nf 876 886 954\nf 1056 1048 950\nf 950 954 1056\nf 1147 1143 1048\nf 1048 1056 1147\nf 1265 1261 1143\nf 1143 1147 1265\nf 1465 1461 1261\nf 1261 1265 1465\nf 1915 1817 1461\nf 1461 1465 1915\nf 722 714 692\nf 692 706 722\nf 760 754 714\nf 714 722 760\nf 810 804 754\nf 754 760 810\nf 894 886 804\nf 804 810 894\nf 960 954 886\nf 886 894 960\nf 1062 1056 954\nf 954 960 1062\nf 1155 1147 1056\nf 1056 1062 1155\nf 1273 1265 1147\nf 1147 1155 1273\nf 1471 1465 1265\nf 1265 1273 1471\nf 1917 1915 1465\nf 1465 1471 1917\nf 720 722 706\nf 706 700 720\nf 758 760 722\nf 722 720 758\nf 808 810 760\nf 760 758 808\nf 890 894 810\nf 810 808 890\nf 958 960 894\nf 894 890 958\nf 1059 1062 960\nf 960 958 1059\nf 1150 1155 1062\nf 1062 1059 1150\nf 1269 1273 1155\nf 1155 1150 1269\nf 1468 1471 1273\nf 1273 1269 1468\nf 1697 1917 1471\nf 1471 1468 1697\nf 712 720 700\nf 700 688 712\nf 748 758 720\nf 720 712 748\nf 800 808 758\nf 758 748 800\nf 882 890 808\nf 808 800 882\nf 952 958 890\nf 890 882 952\nf 1052 1059 958\nf 958 952 1052\nf 1145 1150 1059\nf 1059 1052 1145\nf 1263 1269 1150\nf 1150 1145 1263\nf 1463 1468 1269\nf 1269 1263 1463\nf 1919 1697 1468\nf 1468 1463 1919\nf 694 712 688\nf 688 676 694\nf 742 748 712\nf 712 694 742\nf 794 800 748\nf 748 742 794\nf 872 882 800\nf 800 794 872\nf 946 952 882\nf 882 872 946\nf 1046 1052 952\nf 952 946 1046\nf 1141 1145 1052\nf 1052 1046 1141\nf 1259 1263 1145\nf 1145 1141 1259\nf 1459 1463 1263\nf 1263 1259 1459\nf 1845 1919 1463\nf 1463 1459 1845\nf 678 694 676\nf 676 664 678\nf 726 742 694\nf 694 678 726\nf 788 794 742\nf 742 726 788\nf 862 872 794\nf 794 788 862\nf 944 946 872\nf 872 862 944\nf 1044 1046 946\nf 946 944 1044\nf 1137 1141 1046\nf 1046 1044 1137\nf 1255 1259 1141\nf 1141 1137 1255\nf 1451 1459 1259\nf 1259 1255 1451\nf 1898 1845 1459\nf 1459 1451 1898\nf 658 678 664\nf 664 642 658\nf 716 726 678\nf 678 658 716\nf 778 788 726\nf 726 716 778\nf 854 862 788\nf 788 778 854\nf 938 944 862\nf 862 854 938\nf 1036 1044 944\nf 944 938 1036\nf 1132 1137 1044\nf 1044 1036 1132\nf 1253 1255 1137\nf 1137 1132 1253\nf 1449 1451 1255\nf 1255 1253 1449\nf 1837 1898 1451\nf 1451 1449 1837\nf 641 658 642\nf 642 635 641\nf 690 716 658\nf 658 641 690\nf 768 778 716\nf 716 690 768\nf 844 854 778\nf 778 768 844\nf 932 938 854\nf 854 844 932\nf 1028 1036 938\nf 938 932 1028\nf 1123 1132 1036\nf 1036 1028 1123\nf 1249 1253 1132\nf 1132 1123 1249\nf 1445 1449 1253\nf 1253 1249 1445\nf 1918 1837 1449\nf 1449 1445 1918\nf 633 641 635\nf 635 621 633\nf 674 690 641\nf 641 633 674\nf 752 768 690\nf 690 674 752\nf 832 844 768\nf 768 752 832\nf 924 932 844\nf 844 832 924\nf 1022 1028 932\nf 932 924 1022\nf 1117 1123 1028\nf 1028 1022 1117\nf 1245 1249 1123\nf 1123 1117 1245\nf 1443 1445 1249\nf 1249 1245 1443\nf 1916 1918 1445\nf 1445 1443 1916\nf 616 633 621\nf 621 600 616\nf 654 674 633\nf 633 616 654\nf 737 752 674\nf 674 654 737\nf 822 832 752\nf 752 737 822\nf 914 924 832\nf 832 822 914\nf 1014 1022 924\nf 924 914 1014\nf 1104 1117 1022\nf 1022 1014 1104\nf 1237 1245 1117\nf 1117 1104 1237\nf 1433 1443 1245\nf 1245 1237 1433\nf 1819 1916 1443\nf 1443 1433 1819\nf 2159 2163 1816\nf 1816 1822 2159\nf 2359 2363 2163\nf 2163 2159 2359\nf 2477 2481 2363\nf 2363 2359 2477\nf 2568 2576 2481\nf 2481 2477 2568\nf 2670 2674 2576\nf 2576 2568 2670\nf 2738 2748 2674\nf 2674 2670 2738\nf 2820 2828 2748\nf 2748 2738 2820\nf 2870 2878 2828\nf 2828 2820 2870\nf 2910 2922 2878\nf 2878 2870 2910\nf 2932 2940 2922\nf 2922 2910 2932\nf 2153 2159 1822\nf 1822 1830 2153\nf 2351 2359 2159\nf 2159 2153 2351\nf 2469 2477 2359\nf 2359 2351 2469\nf 2562 2568 2477\nf 2477 2469 2562\nf 2664 2670 2568\nf 2568 2562 2664\nf 2730 2738 2670\nf 2670 2664 2730\nf 2814 2820 2738\nf 2738 2730 2814\nf 2864 2870 2820\nf 2820 2814 2864\nf 2902 2910 2870\nf 2870 2864 2902\nf 2918 2932 2910\nf 2910 2902 2918\nf 2154 2153 1830\nf 1830 1836 2154\nf 2355 2351 2153\nf 2153 2154 2355\nf 2472 2469 2351\nf 2351 2355 2472\nf 2563 2562 2469\nf 2469 2472 2563\nf 2666 2664 2562\nf 2562 2563 2666\nf 2734 2730 2664\nf 2664 2666 2734\nf 2816 2814 2730\nf 2730 2734 2816\nf 2866 2864 2814\nf 2814 2816 2866\nf 2904 2902 2864\nf 2864 2866 2904\nf 2924 2918 2902\nf 2902 2904 2924\nf 2161 2154 1836\nf 1836 1840 2161\nf 2361 2355 2154\nf 2154 2161 2361\nf 2479 2472 2355\nf 2355 2361 2479\nf 2572 2563 2472\nf 2472 2479 2572\nf 2672 2666 2563\nf 2563 2572 2672\nf 2742 2734 2666\nf 2666 2672 2742\nf 2824 2816 2734\nf 2734 2742 2824\nf 2876 2866 2816\nf 2816 2824 2876\nf 2912 2904 2866\nf 2866 2876 2912\nf 2936 2924 2904\nf 2904 2912 2936\nf 2165 2161 1840\nf 1840 1844 2165\nf 2365 2361 2161\nf 2161 2165 2365\nf 2483 2479 2361\nf 2361 2365 2483\nf 2578 2572 2479\nf 2479 2483 2578\nf 2678 2672 2572\nf 2572 2578 2678\nf 2752 2742 2672\nf 2672 2678 2752\nf 2830 2824 2742\nf 2742 2752 2830\nf 2882 2876 2824\nf 2824 2830 2882\nf 2930 2912 2876\nf 2876 2882 2930\nf 2948 2936 2912\nf 2912 2930 2948\nf 2173 2165 1844\nf 1844 1841 2173\nf 2369 2365 2165\nf 2165 2173 2369\nf 2487 2483 2365\nf 2365 2369 2487\nf 2580 2578 2483\nf 2483 2487 2580\nf 2680 2678 2578\nf 2578 2580 2680\nf 2762 2752 2678\nf 2678 2680 2762\nf 2836 2830 2752\nf 2752 2762 2836\nf 2898 2882 2830\nf 2830 2836 2898\nf 2946 2930 2882\nf 2882 2898 2946\nf 2960 2948 2930\nf 2930 2946 2960\nf 2175 2173 1841\nf 1841 1837 2175\nf 2371 2369 2173\nf 2173 2175 2371\nf 2490 2487 2369\nf 2369 2371 2490\nf 2588 2580 2487\nf 2487 2490 2588\nf 2686 2680 2580\nf 2580 2588 2686\nf 2770 2762 2680\nf 2680 2686 2770\nf 2846 2836 2762\nf 2762 2770 2846\nf 2908 2898 2836\nf 2836 2846 2908\nf 2966 2946 2898\nf 2898 2908 2966\nf 2981 2960 2946\nf 2946 2966 2981\nf 2179 2175 1837\nf 1837 1831 2179\nf 2375 2371 2175\nf 2175 2179 2375\nf 2501 2490 2371\nf 2371 2375 2501\nf 2596 2588 2490\nf 2490 2501 2596\nf 2692 2686 2588\nf 2588 2596 2692\nf 2780 2770 2686\nf 2686 2692 2780\nf 2856 2846 2770\nf 2770 2780 2856\nf 2934 2908 2846\nf 2846 2856 2934\nf 2983 2966 2908\nf 2908 2934 2983\nf 2989 2981 2966\nf 2966 2983 2989\nf 2181 2179 1831\nf 1831 1823 2181\nf 2379 2375 2179\nf 2179 2181 2379\nf 2507 2501 2375\nf 2375 2379 2507\nf 2602 2596 2501\nf 2501 2507 2602\nf 2700 2692 2596\nf 2596 2602 2700\nf 2792 2780 2692\nf 2692 2700 2792\nf 2872 2856 2780\nf 2780 2792 2872\nf 2950 2934 2856\nf 2856 2872 2950\nf 2991 2983 2934\nf 2934 2950 2991\nf 3003 2989 2983\nf 2983 2991 3003\nf 2194 2181 1823\nf 1823 1818 2194\nf 2391 2379 2181\nf 2181 2194 2391\nf 2518 2507 2379\nf 2379 2391 2518\nf 2614 2602 2507\nf 2507 2518 2614\nf 2712 2700 2602\nf 2602 2614 2712\nf 2806 2792 2700\nf 2700 2712 2806\nf 2890 2872 2792\nf 2792 2806 2890\nf 2974 2950 2872\nf 2872 2890 2974\nf 3009 2991 2950\nf 2950 2974 3009\nf 3025 3003 2991\nf 2991 3009 3025\nf 3040 3008 3024\nf 3024 3048 3040\nf 3018 2973 3008\nf 3008 3040 3018\nf 2943 2889 2973\nf 2973 3018 2943\nf 2841 2805 2889\nf 2889 2943 2841\nf 2731 2711 2805\nf 2805 2841 2731\nf 2645 2611 2711\nf 2711 2731 2645\nf 2529 2521 2611\nf 2611 2645 2529\nf 2402 2387 2521\nf 2521 2529 2402\nf 2208 2191 2387\nf 2387 2402 2208\nf 1806 1810 2191\nf 2191 2208 1806\nf 3072 3040 3048\nf 3048 3078 3072\nf 3044 3018 3040\nf 3040 3072 3044\nf 2994 2943 3018\nf 3018 3044 2994\nf 2883 2841 2943\nf 2943 2994 2883\nf 2773 2731 2841\nf 2841 2883 2773\nf 2659 2645 2731\nf 2731 2773 2659\nf 2539 2529 2645\nf 2645 2659 2539\nf 2410 2402 2529\nf 2529 2539 2410\nf 2222 2208 2402\nf 2402 2410 2222\nf 1694 1806 2208\nf 2208 2222 1694\nf 3092 3072 3078\nf 3078 3116 3092\nf 3074 3044 3072\nf 3072 3092 3074\nf 3030 2994 3044\nf 3044 3074 3030\nf 2937 2883 2994\nf 2994 3030 2937\nf 2810 2773 2883\nf 2883 2937 2810\nf 2683 2659 2773\nf 2773 2810 2683\nf 2554 2539 2659\nf 2659 2683 2554\nf 2420 2410 2539\nf 2539 2554 2420\nf 2238 2222 2410\nf 2410 2420 2238\nf 1930 1694 2222\nf 2222 2238 1930\nf 3132 3092 3116\nf 3116 3142 3132\nf 3090 3074 3092\nf 3092 3132 3090\nf 3054 3030 3074\nf 3074 3090 3054\nf 2984 2937 3030\nf 3030 3054 2984\nf 2837 2810 2937\nf 2937 2984 2837\nf 2705 2683 2810\nf 2810 2837 2705\nf 2574 2554 2683\nf 2683 2705 2574\nf 2430 2420 2554\nf 2554 2574 2430\nf 2247 2238 2420\nf 2420 2430 2247\nf 1913 1930 2238\nf 2238 2247 1913\nf 3150 3132 3142\nf 3142 3156 3150\nf 3128 3090 3132\nf 3132 3150 3128\nf 3076 3054 3090\nf 3090 3128 3076\nf 3014 2984 3054\nf 3054 3076 3014\nf 2861 2837 2984\nf 2984 3014 2861\nf 2723 2705 2837\nf 2837 2861 2723\nf 2585 2574 2705\nf 2705 2723 2585\nf 2438 2430 2574\nf 2574 2585 2438\nf 2253 2247 2430\nf 2430 2438 2253\nf 1711 1913 2247\nf 2247 2253 1711\nf 3162 3150 3156\nf 3156 3172 3162\nf 3148 3128 3150\nf 3150 3162 3148\nf 3088 3076 3128\nf 3128 3148 3088\nf 3036 3014 3076\nf 3076 3088 3036\nf 2893 2861 3014\nf 3014 3036 2893\nf 2743 2723 2861\nf 2861 2893 2743\nf 2599 2585 2723\nf 2723 2743 2599\nf 2450 2438 2585\nf 2585 2599 2450\nf 2267 2253 2438\nf 2438 2450 2267\nf 1794 1711 2253\nf 2253 2267 1794\nf 3178 3162 3172\nf 3172 3184 3178\nf 3154 3148 3162\nf 3162 3178 3154\nf 3118 3088 3148\nf 3148 3154 3118\nf 3046 3036 3088\nf 3088 3118 3046\nf 2915 2893 3036\nf 3036 3046 2915\nf 2763 2743 2893\nf 2893 2915 2763\nf 2615 2599 2743\nf 2743 2763 2615\nf 2452 2450 2599\nf 2599 2615 2452\nf 2277 2267 2450\nf 2450 2452 2277\nf 1710 1794 2267\nf 2267 2277 1710\nf 3188 3178 3184\nf 3184 3200 3188\nf 3164 3154 3178\nf 3178 3188 3164\nf 3130 3118 3154\nf 3154 3164 3130\nf 3058 3046 3118\nf 3118 3130 3058\nf 2941 2915 3046\nf 3046 3058 2941\nf 2775 2763 2915\nf 2915 2941 2775\nf 2627 2615 2763\nf 2763 2775 2627\nf 2458 2452 2615\nf 2615 2627 2458\nf 2287 2277 2452\nf 2452 2458 2287\nf 1910 1710 2277\nf 2277 2287 1910\nf 3198 3188 3200\nf 3200 3209 3198\nf 3170 3164 3188\nf 3188 3198 3170\nf 3136 3130 3164\nf 3164 3170 3136\nf 3064 3058 3130\nf 3130 3136 3064\nf 2955 2941 3058\nf 3058 3064 2955\nf 2781 2775 2941\nf 2941 2955 2781\nf 2636 2627 2775\nf 2775 2781 2636\nf 2462 2458 2627\nf 2627 2636 2462\nf 2295 2287 2458\nf 2458 2462 2295\nf 1909 1910 2287\nf 2287 2295 1909\nf 3202 3198 3209\nf 3209 3213 3202\nf 3174 3170 3198\nf 3198 3202 3174\nf 3138 3136 3170\nf 3170 3174 3138\nf 3066 3064 3136\nf 3136 3138 3066\nf 2961 2955 3064\nf 3064 3066 2961\nf 2783 2781 2955\nf 2955 2961 2783\nf 2642 2636 2781\nf 2781 2783 2642\nf 2464 2462 2636\nf 2636 2642 2464\nf 2297 2295 2462\nf 2462 2464 2297\nf 1784 1909 2295\nf 2295 2297 1784\nf 1414 1429 1811\nf 1811 1807 1414\nf 1220 1233 1429\nf 1429 1414 1220\nf 1093 1106 1233\nf 1233 1220 1093\nf 977 1011 1106\nf 1106 1093 977\nf 891 911 1011\nf 1011 977 891\nf 781 817 911\nf 911 891 781\nf 679 733 817\nf 817 781 679\nf 604 649 733\nf 733 679 604\nf 571 614 649\nf 649 604 571\nf 561 597 614\nf 614 571 561\nf 1400 1414 1807\nf 1807 1804 1400\nf 1212 1220 1414\nf 1414 1400 1212\nf 1083 1093 1220\nf 1220 1212 1083\nf 963 977 1093\nf 1093 1083 963\nf 849 891 977\nf 977 963 849\nf 739 781 891\nf 891 849 739\nf 628 679 781\nf 781 739 628\nf 565 604 679\nf 679 628 565\nf 530 571 604\nf 604 565 530\nf 524 561 571\nf 571 530 524\nf 1386 1400 1804\nf 1804 1802 1386\nf 1202 1212 1400\nf 1400 1386 1202\nf 1070 1083 1212\nf 1212 1202 1070\nf 939 963 1083\nf 1083 1070 939\nf 814 849 963\nf 963 939 814\nf 685 739 849\nf 849 814 685\nf 585 628 739\nf 739 685 585\nf 528 565 628\nf 628 585 528\nf 510 530 565\nf 565 528 510\nf 508 524 530\nf 530 510 508\nf 1375 1386 1802\nf 1802 1800 1375\nf 1192 1202 1386\nf 1386 1375 1192\nf 1050 1070 1202\nf 1202 1192 1050\nf 917 939 1070\nf 1070 1050 917\nf 785 814 939\nf 939 917 785\nf 638 685 814\nf 814 785 638\nf 553 585 685\nf 685 638 553\nf 512 528 585\nf 585 553 512\nf 492 510 528\nf 528 512 492\nf 482 508 510\nf 510 492 482\nf 1369 1375 1800\nf 1800 1798 1369\nf 1184 1192 1375\nf 1375 1369 1184\nf 1037 1050 1192\nf 1192 1184 1037\nf 899 917 1050\nf 1050 1037 899\nf 761 785 917\nf 917 899 761\nf 608 638 785\nf 785 761 608\nf 526 553 638\nf 638 608 526\nf 496 512 553\nf 553 526 496\nf 454 492 512\nf 512 496 454\nf 448 482 492\nf 492 454 448\nf 1355 1369 1798\nf 1798 1795 1355\nf 1172 1184 1369\nf 1369 1355 1172\nf 1023 1037 1184\nf 1184 1172 1023\nf 879 899 1037\nf 1037 1023 879\nf 729 761 899\nf 899 879 729\nf 579 608 761\nf 761 729 579\nf 514 526 608\nf 608 579 514\nf 457 496 526\nf 526 514 457\nf 442 454 496\nf 496 457 442\nf 432 448 454\nf 454 442 432\nf 1345 1355 1795\nf 1795 1792 1345\nf 1170 1172 1355\nf 1355 1345 1170\nf 1007 1023 1172\nf 1172 1170 1007\nf 859 879 1023\nf 1023 1007 859\nf 707 729 879\nf 879 859 707\nf 563 579 729\nf 729 707 563\nf 506 514 579\nf 579 563 506\nf 450 457 514\nf 514 506 450\nf 420 442 457\nf 457 450 420\nf 412 432 442\nf 442 420 412\nf 1335 1345 1792\nf 1792 1790 1335\nf 1164 1170 1345\nf 1345 1335 1164\nf 995 1007 1170\nf 1170 1164 995\nf 847 859 1007\nf 1007 995 847\nf 681 707 859\nf 859 847 681\nf 547 563 707\nf 707 681 547\nf 494 506 563\nf 563 547 494\nf 440 450 506\nf 506 494 440\nf 410 420 450\nf 450 440 410\nf 398 412 420\nf 420 410 398\nf 1327 1335 1790\nf 1790 1788 1327\nf 1160 1164 1335\nf 1335 1327 1160\nf 988 995 1164\nf 1164 1160 988\nf 841 847 995\nf 995 988 841\nf 667 681 847\nf 847 841 667\nf 538 547 681\nf 681 667 538\nf 488 494 547\nf 547 538 488\nf 434 440 494\nf 494 488 434\nf 400 410 440\nf 440 434 400\nf 381 398 410\nf 410 400 381\nf 1324 1327 1788\nf 1788 1785 1324\nf 1156 1160 1327\nf 1327 1324 1156\nf 979 988 1160\nf 1160 1156 979\nf 837 841 988\nf 988 979 837\nf 659 667 841\nf 841 837 659\nf 534 538 667\nf 667 659 534\nf 484 488 538\nf 538 534 484\nf 428 434 488\nf 488 484 428\nf 395 400 434\nf 434 428 395\nf 374 381 400\nf 400 395 374\nf 572 616 600\nf 600 562 572\nf 605 654 616\nf 616 572 605\nf 680 737 654\nf 654 605 680\nf 782 822 737\nf 737 680 782\nf 892 914 822\nf 822 782 892\nf 978 1014 914\nf 914 892 978\nf 1094 1104 1014\nf 1014 978 1094\nf 1221 1237 1104\nf 1104 1094 1221\nf 1415 1433 1237\nf 1237 1221 1415\nf 1809 1819 1433\nf 1433 1415 1809\nf 531 572 562\nf 562 525 531\nf 566 605 572\nf 572 531 566\nf 629 680 605\nf 605 566 629\nf 740 782 680\nf 680 629 740\nf 850 892 782\nf 782 740 850\nf 964 978 892\nf 892 850 964\nf 1084 1094 978\nf 978 964 1084\nf 1213 1221 1094\nf 1094 1084 1213\nf 1401 1415 1221\nf 1221 1213 1401\nf 1931 1809 1415\nf 1415 1401 1931\nf 511 531 525\nf 525 509 511\nf 529 566 531\nf 531 511 529\nf 586 629 566\nf 566 529 586\nf 686 740 629\nf 629 586 686\nf 813 850 740\nf 740 686 813\nf 940 964 850\nf 850 813 940\nf 1069 1084 964\nf 964 940 1069\nf 1203 1213 1084\nf 1084 1069 1203\nf 1385 1401 1213\nf 1213 1203 1385\nf 1693 1931 1401\nf 1401 1385 1693\nf 493 511 509\nf 509 483 493\nf 513 529 511\nf 511 493 513\nf 554 586 529\nf 529 513 554\nf 639 686 586\nf 586 554 639\nf 786 813 686\nf 686 639 786\nf 918 940 813\nf 813 786 918\nf 1049 1069 940\nf 940 918 1049\nf 1193 1203 1069\nf 1069 1049 1193\nf 1376 1385 1203\nf 1203 1193 1376\nf 1712 1693 1385\nf 1385 1376 1712\nf 455 493 483\nf 483 449 455\nf 497 513 493\nf 493 455 497\nf 527 554 513\nf 513 497 527\nf 609 639 554\nf 554 527 609\nf 762 786 639\nf 639 609 762\nf 900 918 786\nf 786 762 900\nf 1038 1049 918\nf 918 900 1038\nf 1185 1193 1049\nf 1049 1038 1185\nf 1370 1376 1193\nf 1193 1185 1370\nf 1912 1712 1376\nf 1376 1370 1912\nf 443 455 449\nf 449 433 443\nf 458 497 455\nf 455 443 458\nf 515 527 497\nf 497 458 515\nf 580 609 527\nf 527 515 580\nf 730 762 609\nf 609 580 730\nf 880 900 762\nf 762 730 880\nf 1024 1038 900\nf 900 880 1024\nf 1173 1185 1038\nf 1038 1024 1173\nf 1356 1370 1185\nf 1185 1173 1356\nf 1797 1912 1370\nf 1370 1356 1797\nf 421 443 433\nf 433 413 421\nf 451 458 443\nf 443 421 451\nf 507 515 458\nf 458 451 507\nf 564 580 515\nf 515 507 564\nf 708 730 580\nf 580 564 708\nf 860 880 730\nf 730 708 860\nf 1008 1024 880\nf 880 860 1008\nf 1171 1173 1024\nf 1024 1008 1171\nf 1346 1356 1173\nf 1173 1171 1346\nf 1911 1797 1356\nf 1356 1346 1911\nf 411 421 413\nf 413 399 411\nf 441 451 421\nf 421 411 441\nf 495 507 451\nf 451 441 495\nf 548 564 507\nf 507 495 548\nf 682 708 564\nf 564 548 682\nf 848 860 708\nf 708 682 848\nf 996 1008 860\nf 860 848 996\nf 1165 1171 1008\nf 1008 996 1165\nf 1336 1346 1171\nf 1171 1165 1336\nf 1709 1911 1346\nf 1346 1336 1709\nf 401 411 399\nf 399 382 401\nf 435 441 411\nf 411 401 435\nf 489 495 441\nf 441 435 489\nf 539 548 495\nf 495 489 539\nf 668 682 548\nf 548 539 668\nf 842 848 682\nf 682 668 842\nf 987 996 848\nf 848 842 987\nf 1161 1165 996\nf 996 987 1161\nf 1328 1336 1165\nf 1165 1161 1328\nf 1708 1709 1336\nf 1336 1328 1708\nf 397 401 382\nf 382 376 397\nf 431 435 401\nf 401 397 431\nf 487 489 435\nf 435 431 487\nf 537 539 489\nf 489 487 537\nf 662 668 539\nf 539 537 662\nf 840 842 668\nf 668 662 840\nf 981 987 842\nf 842 840 981\nf 1159 1161 987\nf 987 981 1159\nf 1326 1328 1161\nf 1161 1159 1326\nf 1787 1708 1328\nf 1328 1326 1787\nf 2209 2194 1818\nf 1818 1808 2209\nf 2403 2391 2194\nf 2194 2209 2403\nf 2530 2518 2391\nf 2391 2403 2530\nf 2646 2614 2518\nf 2518 2530 2646\nf 2732 2712 2614\nf 2614 2646 2732\nf 2842 2806 2712\nf 2712 2732 2842\nf 2944 2890 2806\nf 2806 2842 2944\nf 3019 2974 2890\nf 2890 2944 3019\nf 3041 3009 2974\nf 2974 3019 3041\nf 3049 3025 3009\nf 3009 3041 3049\nf 2223 2209 1808\nf 1808 1805 2223\nf 2411 2403 2209\nf 2209 2223 2411\nf 2540 2530 2403\nf 2403 2411 2540\nf 2660 2646 2530\nf 2530 2540 2660\nf 2774 2732 2646\nf 2646 2660 2774\nf 2884 2842 2732\nf 2732 2774 2884\nf 2995 2944 2842\nf 2842 2884 2995\nf 3045 3019 2944\nf 2944 2995 3045\nf 3073 3041 3019\nf 3019 3045 3073\nf 3079 3049 3041\nf 3041 3073 3079\nf 2237 2223 1805\nf 1805 1803 2237\nf 2421 2411 2223\nf 2223 2237 2421\nf 2553 2540 2411\nf 2411 2421 2553\nf 2684 2660 2540\nf 2540 2553 2684\nf 2809 2774 2660\nf 2660 2684 2809\nf 2938 2884 2774\nf 2774 2809 2938\nf 3031 2995 2884\nf 2884 2938 3031\nf 3075 3045 2995\nf 2995 3031 3075\nf 3093 3073 3045\nf 3045 3075 3093\nf 3117 3079 3073\nf 3073 3093 3117\nf 2248 2237 1803\nf 1803 1801 2248\nf 2431 2421 2237\nf 2237 2248 2431\nf 2573 2553 2421\nf 2421 2431 2573\nf 2706 2684 2553\nf 2553 2573 2706\nf 2838 2809 2684\nf 2684 2706 2838\nf 2985 2938 2809\nf 2809 2838 2985\nf 3055 3031 2938\nf 2938 2985 3055\nf 3091 3075 3031\nf 3031 3055 3091\nf 3133 3093 3075\nf 3075 3091 3133\nf 3143 3117 3093\nf 3093 3133 3143\nf 2254 2248 1801\nf 1801 1799 2254\nf 2439 2431 2248\nf 2248 2254 2439\nf 2586 2573 2431\nf 2431 2439 2586\nf 2724 2706 2573\nf 2573 2586 2724\nf 2862 2838 2706\nf 2706 2724 2862\nf 3015 2985 2838\nf 2838 2862 3015\nf 3077 3055 2985\nf 2985 3015 3077\nf 3129 3091 3055\nf 3055 3077 3129\nf 3151 3133 3091\nf 3091 3129 3151\nf 3157 3143 3133\nf 3133 3151 3157\nf 2268 2254 1799\nf 1799 1796 2268\nf 2451 2439 2254\nf 2254 2268 2451\nf 2600 2586 2439\nf 2439 2451 2600\nf 2744 2724 2586\nf 2586 2600 2744\nf 2894 2862 2724\nf 2724 2744 2894\nf 3037 3015 2862\nf 2862 2894 3037\nf 3089 3077 3015\nf 3015 3037 3089\nf 3149 3129 3077\nf 3077 3089 3149\nf 3163 3151 3129\nf 3129 3149 3163\nf 3173 3157 3151\nf 3151 3163 3173\nf 2278 2268 1796\nf 1796 1793 2278\nf 2453 2451 2268\nf 2268 2278 2453\nf 2616 2600 2451\nf 2451 2453 2616\nf 2764 2744 2600\nf 2600 2616 2764\nf 2916 2894 2744\nf 2744 2764 2916\nf 3047 3037 2894\nf 2894 2916 3047\nf 3119 3089 3037\nf 3037 3047 3119\nf 3155 3149 3089\nf 3089 3119 3155\nf 3179 3163 3149\nf 3149 3155 3179\nf 3185 3173 3163\nf 3163 3179 3185\nf 2288 2278 1793\nf 1793 1791 2288\nf 2459 2453 2278\nf 2278 2288 2459\nf 2628 2616 2453\nf 2453 2459 2628\nf 2776 2764 2616\nf 2616 2628 2776\nf 2942 2916 2764\nf 2764 2776 2942\nf 3059 3047 2916\nf 2916 2942 3059\nf 3131 3119 3047\nf 3047 3059 3131\nf 3165 3155 3119\nf 3119 3131 3165\nf 3189 3179 3155\nf 3155 3165 3189\nf 3201 3185 3179\nf 3179 3189 3201\nf 2296 2288 1791\nf 1791 1789 2296\nf 2463 2459 2288\nf 2288 2296 2463\nf 2635 2628 2459\nf 2459 2463 2635\nf 2782 2776 2628\nf 2628 2635 2782\nf 2956 2942 2776\nf 2776 2782 2956\nf 3065 3059 2942\nf 2942 2956 3065\nf 3137 3131 3059\nf 3059 3065 3137\nf 3171 3165 3131\nf 3131 3137 3171\nf 3199 3189 3165\nf 3165 3171 3199\nf 3210 3201 3189\nf 3189 3199 3210\nf 2299 2296 1789\nf 1789 1786 2299\nf 2467 2463 2296\nf 2296 2299 2467\nf 2644 2635 2463\nf 2463 2467 2644\nf 2786 2782 2635\nf 2635 2644 2786\nf 2964 2956 2782\nf 2782 2786 2964\nf 3069 3065 2956\nf 2956 2964 3069\nf 3141 3137 3065\nf 3065 3069 3141\nf 3177 3171 3137\nf 3137 3141 3177\nf 3204 3199 3171\nf 3171 3177 3204\nf 3214 3210 3199\nf 3199 3204 3214\nf 3194 3202 3213\nf 3213 3207 3194\nf 3166 3175 3202\nf 3202 3194 3166\nf 3134 3139 3175\nf 3175 3166 3134\nf 3060 3067 3139\nf 3139 3134 3060\nf 2953 2962 3067\nf 3067 3060 2953\nf 2777 2784 2962\nf 2962 2953 2777\nf 2629 2643 2784\nf 2784 2777 2629\nf 2460 2465 2643\nf 2643 2629 2460\nf 2293 2298 2465\nf 2465 2460 2293\nf 1696 1785 2298\nf 2298 2293 1696\nf 3180 3194 3207\nf 3207 3190 3180\nf 3158 3166 3194\nf 3194 3180 3158\nf 3124 3134 3166\nf 3166 3158 3124\nf 3050 3060 3134\nf 3134 3124 3050\nf 2927 2953 3060\nf 3060 3050 2927\nf 2767 2777 2953\nf 2953 2927 2767\nf 2619 2629 2777\nf 2777 2767 2619\nf 2454 2460 2629\nf 2629 2619 2454\nf 2283 2293 2460\nf 2460 2454 2283\nf 1695 1696 2293\nf 2293 2283 1695\nf 3160 3180 3190\nf 3190 3168 3160\nf 3144 3158 3180\nf 3180 3160 3144\nf 3086 3124 3158\nf 3158 3144 3086\nf 3032 3050 3124\nf 3124 3086 3032\nf 2891 2927 3050\nf 3050 3032 2891\nf 2739 2767 2927\nf 2927 2891 2739\nf 2597 2619 2767\nf 2767 2739 2597\nf 2448 2454 2619\nf 2619 2597 2448\nf 2265 2283 2454\nf 2454 2448 2265\nf 1707 1695 2283\nf 2283 2265 1707\nf 3146 3160 3168\nf 3168 3152 3146\nf 3122 3144 3160\nf 3160 3146 3122\nf 3070 3086 3144\nf 3144 3122 3070\nf 2998 3032 3086\nf 3086 3070 2998\nf 2853 2891 3032\nf 3032 2998 2853\nf 2717 2739 2891\nf 2891 2853 2717\nf 2582 2597 2739\nf 2739 2717 2582\nf 2434 2448 2597\nf 2597 2582 2434\nf 2251 2265 2448\nf 2448 2434 2251\nf 1907 1707 2265\nf 2265 2251 1907\nf 3120 3146 3152\nf 3152 3126 3120\nf 3082 3122 3146\nf 3146 3120 3082\nf 3042 3070 3122\nf 3122 3082 3042\nf 2957 2998 3070\nf 3070 3042 2957\nf 2825 2853 2998\nf 2998 2957 2825\nf 2693 2717 2853\nf 2853 2825 2693\nf 2556 2582 2717\nf 2717 2693 2556\nf 2424 2434 2582\nf 2582 2556 2424\nf 2239 2251 2434\nf 2434 2424 2239\nf 1906 1907 2251\nf 2251 2239 1906\nf 3080 3120 3126\nf 3126 3084 3080\nf 3056 3082 3120\nf 3120 3080 3056\nf 3012 3042 3082\nf 3082 3056 3012\nf 2899 2957 3042\nf 3042 3012 2899\nf 2789 2825 2957\nf 2957 2899 2789\nf 2675 2693 2825\nf 2825 2789 2675\nf 2545 2556 2693\nf 2693 2675 2545\nf 2416 2424 2556\nf 2556 2545 2416\nf 2228 2239 2424\nf 2424 2416 2228\nf 1770 1906 2239\nf 2239 2228 1770\nf 3053 3080 3084\nf 3084 3062 3053\nf 3028 3056 3080\nf 3080 3053 3028\nf 2978 3012 3056\nf 3056 3028 2978\nf 2860 2899 3012\nf 3012 2978 2860\nf 2754 2789 2899\nf 2899 2860 2754\nf 2652 2675 2789\nf 2789 2754 2652\nf 2534 2545 2675\nf 2675 2652 2534\nf 2406 2416 2545\nf 2545 2534 2406\nf 2217 2228 2416\nf 2416 2406 2217\nf 1929 1770 2228\nf 2228 2217 1929\nf 3035 3053 3062\nf 3062 3039 3035\nf 2997 3028 3053\nf 3053 3035 2997\nf 2920 2978 3028\nf 3028 2997 2920\nf 2832 2860 2978\nf 2978 2920 2832\nf 2728 2754 2860\nf 2860 2832 2728\nf 2634 2652 2754\nf 2754 2728 2634\nf 2528 2534 2652\nf 2652 2634 2528\nf 2396 2406 2534\nf 2534 2528 2396\nf 2202 2217 2406\nf 2406 2396 2202\nf 1765 1929 2217\nf 2217 2202 1765\nf 3017 3035 3039\nf 3039 3027 3017\nf 2980 2997 3035\nf 3035 3017 2980\nf 2896 2920 2997\nf 2997 2980 2896\nf 2812 2832 2920\nf 2920 2896 2812\nf 2715 2728 2832\nf 2832 2812 2715\nf 2618 2634 2728\nf 2728 2715 2618\nf 2523 2528 2634\nf 2634 2618 2523\nf 2392 2396 2528\nf 2528 2523 2392\nf 2196 2202 2396\nf 2396 2392 2196\nf 1724 1765 2202\nf 2202 2196 1724\nf 3007 3017 3027\nf 3027 3023 3007\nf 2969 2980 3017\nf 3017 3007 2969\nf 2887 2896 2980\nf 2980 2969 2887\nf 2802 2812 2896\nf 2896 2887 2802\nf 2709 2715 2812\nf 2812 2802 2709\nf 2609 2618 2715\nf 2715 2709 2609\nf 2519 2523 2618\nf 2618 2609 2519\nf 2386 2392 2523\nf 2523 2519 2386\nf 2190 2196 2392\nf 2392 2386 2190\nf 1759 1724 2196\nf 2196 2190 1759\nf 1329 1324 1785\nf 1785 1782 1329\nf 1162 1157 1324\nf 1324 1329 1162\nf 993 982 1157\nf 1157 1162 993\nf 845 838 982\nf 982 993 845\nf 669 660 838\nf 838 845 669\nf 542 535 660\nf 660 669 542\nf 490 485 535\nf 535 542 490\nf 438 429 485\nf 485 490 438\nf 404 396 429\nf 429 438 404\nf 387 376 396\nf 396 404 387\nf 1339 1329 1782\nf 1782 1780 1339\nf 1168 1162 1329\nf 1329 1339 1168\nf 1003 993 1162\nf 1162 1168 1003\nf 855 845 993\nf 993 1003 855\nf 695 669 845\nf 845 855 695\nf 559 542 669\nf 669 695 559\nf 500 490 542\nf 542 559 500\nf 446 438 490\nf 490 500 446\nf 416 404 438\nf 438 446 416\nf 408 387 404\nf 404 416 408\nf 1357 1339 1780\nf 1780 1778 1357\nf 1174 1168 1339\nf 1339 1357 1174\nf 1025 1003 1168\nf 1168 1174 1025\nf 883 855 1003\nf 1003 1025 883\nf 731 695 855\nf 855 883 731\nf 583 559 695\nf 695 731 583\nf 516 500 559\nf 559 583 516\nf 467 446 500\nf 500 516 467\nf 444 416 446\nf 446 467 444\nf 436 408 416\nf 416 444 436\nf 1371 1357 1778\nf 1778 1776 1371\nf 1188 1174 1357\nf 1357 1371 1188\nf 1042 1025 1174\nf 1174 1188 1042\nf 905 883 1025\nf 1025 1042 905\nf 769 731 883\nf 883 905 769\nf 624 583 731\nf 731 769 624\nf 532 516 583\nf 583 624 532\nf 502 467 516\nf 516 532 502\nf 459 444 467\nf 467 502 459\nf 452 436 444\nf 444 459 452\nf 1383 1371 1776\nf 1776 1774 1383\nf 1198 1188 1371\nf 1371 1383 1198\nf 1068 1042 1188\nf 1188 1198 1068\nf 929 905 1042\nf 1042 1068 929\nf 797 769 905\nf 905 929 797\nf 665 624 769\nf 769 797 665\nf 569 532 624\nf 624 665 569\nf 520 502 532\nf 532 569 520\nf 504 459 502\nf 502 520 504\nf 498 452 459\nf 459 504 498\nf 1394 1383 1774\nf 1774 1771 1394\nf 1206 1198 1383\nf 1383 1394 1206\nf 1077 1068 1198\nf 1198 1206 1077\nf 947 929 1068\nf 1068 1077 947\nf 833 797 929\nf 929 947 833\nf 723 665 797\nf 797 833 723\nf 610 569 665\nf 665 723 610\nf 549 520 569\nf 569 610 549\nf 522 504 520\nf 520 549 522\nf 518 498 504\nf 504 522 518\nf 1407 1394 1771\nf 1771 1768 1407\nf 1216 1206 1394\nf 1394 1407 1216\nf 1090 1077 1206\nf 1206 1216 1090\nf 972 947 1077\nf 1077 1090 972\nf 870 833 947\nf 947 972 870\nf 764 723 833\nf 833 870 764\nf 646 610 723\nf 723 764 646\nf 587 549 610\nf 610 646 587\nf 556 522 549\nf 549 587 556\nf 540 518 522\nf 522 556 540\nf 1420 1407 1768\nf 1768 1764 1420\nf 1226 1216 1407\nf 1407 1420 1226\nf 1096 1090 1216\nf 1216 1226 1096\nf 990 972 1090\nf 1090 1096 990\nf 896 870 972\nf 972 990 896\nf 792 764 870\nf 870 896 792\nf 704 646 764\nf 764 792 704\nf 627 587 646\nf 646 704 627\nf 582 556 587\nf 587 627 582\nf 574 540 556\nf 556 582 574\nf 1426 1420 1764\nf 1764 1762 1426\nf 1230 1226 1420\nf 1420 1426 1230\nf 1101 1096 1226\nf 1226 1230 1101\nf 1006 990 1096\nf 1096 1101 1006\nf 907 896 990\nf 990 1006 907\nf 812 792 896\nf 896 907 812\nf 728 704 792\nf 792 812 728\nf 644 627 704\nf 704 728 644\nf 607 582 627\nf 627 644 607\nf 592 574 582\nf 582 607 592\nf 1430 1426 1762\nf 1762 1758 1430\nf 1234 1230 1426\nf 1426 1430 1234\nf 1107 1101 1230\nf 1230 1234 1107\nf 1012 1006 1101\nf 1101 1107 1012\nf 912 907 1006\nf 1006 1012 912\nf 819 812 907\nf 907 912 819\nf 738 728 812\nf 812 819 738\nf 651 644 728\nf 728 738 651\nf 618 607 644\nf 644 651 618\nf 601 592 607\nf 607 618 601\nf 405 397 376\nf 376 388 405\nf 439 430 397\nf 397 405 439\nf 491 486 430\nf 430 439 491\nf 543 536 486\nf 486 491 543\nf 670 661 536\nf 536 543 670\nf 846 839 661\nf 661 670 846\nf 994 980 839\nf 839 846 994\nf 1163 1158 980\nf 980 994 1163\nf 1330 1325 1158\nf 1158 1163 1330\nf 1926 1786 1325\nf 1325 1330 1926\nf 417 405 388\nf 388 409 417\nf 447 439 405\nf 405 417 447\nf 501 491 439\nf 439 447 501\nf 560 543 491\nf 491 501 560\nf 696 670 543\nf 543 560 696\nf 856 846 670\nf 670 696 856\nf 1004 994 846\nf 846 856 1004\nf 1169 1163 994\nf 994 1004 1169\nf 1340 1330 1163\nf 1163 1169 1340\nf 1925 1926 1330\nf 1330 1340 1925\nf 445 417 409\nf 409 437 445\nf 468 447 417\nf 417 445 468\nf 517 501 447\nf 447 468 517\nf 584 560 501\nf 501 517 584\nf 732 696 560\nf 560 584 732\nf 884 856 696\nf 696 732 884\nf 1026 1004 856\nf 856 884 1026\nf 1175 1169 1004\nf 1004 1026 1175\nf 1358 1340 1169\nf 1169 1175 1358\nf 1908 1925 1340\nf 1340 1358 1908\nf 460 445 437\nf 437 453 460\nf 503 468 445\nf 445 460 503\nf 533 517 468\nf 468 503 533\nf 625 584 517\nf 517 533 625\nf 770 732 584\nf 584 625 770\nf 906 884 732\nf 732 770 906\nf 1041 1026 884\nf 884 906 1041\nf 1189 1175 1026\nf 1026 1041 1189\nf 1372 1358 1175\nf 1175 1189 1372\nf 1706 1908 1358\nf 1358 1372 1706\nf 505 460 453\nf 453 499 505\nf 521 503 460\nf 460 505 521\nf 570 533 503\nf 503 521 570\nf 666 625 533\nf 533 570 666\nf 798 770 625\nf 625 666 798\nf 930 906 770\nf 770 798 930\nf 1067 1041 906\nf 906 930 1067\nf 1199 1189 1041\nf 1041 1067 1199\nf 1384 1372 1189\nf 1189 1199 1384\nf 1705 1706 1372\nf 1372 1384 1705\nf 523 505 499\nf 499 519 523\nf 550 521 505\nf 505 523 550\nf 611 570 521\nf 521 550 611\nf 724 666 570\nf 570 611 724\nf 834 798 666\nf 666 724 834\nf 948 930 798\nf 798 834 948\nf 1078 1067 930\nf 930 948 1078\nf 1207 1199 1067\nf 1067 1078 1207\nf 1395 1384 1199\nf 1199 1207 1395\nf 1773 1705 1384\nf 1384 1395 1773\nf 555 523 519\nf 519 541 555\nf 588 550 523\nf 523 555 588\nf 645 611 550\nf 550 588 645\nf 763 724 611\nf 611 645 763\nf 869 834 724\nf 724 763 869\nf 971 948 834\nf 834 869 971\nf 1089 1078 948\nf 948 971 1089\nf 1217 1207 1078\nf 1078 1089 1217\nf 1406 1395 1207\nf 1207 1217 1406\nf 1692 1773 1395\nf 1395 1406 1692\nf 581 555 541\nf 541 573 581\nf 626 588 555\nf 555 581 626\nf 703 645 588\nf 588 626 703\nf 791 763 645\nf 645 703 791\nf 895 869 763\nf 763 791 895\nf 989 971 869\nf 869 895 989\nf 1095 1089 971\nf 971 989 1095\nf 1227 1217 1089\nf 1089 1095 1227\nf 1421 1406 1217\nf 1217 1227 1421\nf 1766 1692 1406\nf 1406 1421 1766\nf 606 581 573\nf 573 591 606\nf 643 626 581\nf 581 606 643\nf 727 703 626\nf 626 643 727\nf 811 791 703\nf 703 727 811\nf 908 895 791\nf 791 811 908\nf 1005 989 895\nf 895 908 1005\nf 1100 1095 989\nf 989 1005 1100\nf 1231 1227 1095\nf 1095 1100 1231\nf 1427 1421 1227\nf 1227 1231 1427\nf 1897 1766 1421\nf 1421 1427 1897\nf 615 606 591\nf 591 598 615\nf 653 643 606\nf 606 615 653\nf 735 727 643\nf 643 653 735\nf 820 811 727\nf 727 735 820\nf 913 908 811\nf 811 820 913\nf 1013 1005 908\nf 908 913 1013\nf 1103 1100 1005\nf 1005 1013 1103\nf 1236 1231 1100\nf 1100 1103 1236\nf 1432 1427 1231\nf 1231 1236 1432\nf 1760 1897 1427\nf 1427 1432 1760\nf 2294 2299 1786\nf 1786 1783 2294\nf 2461 2466 2299\nf 2299 2294 2461\nf 2630 2641 2466\nf 2466 2461 2630\nf 2778 2785 2641\nf 2641 2630 2778\nf 2954 2963 2785\nf 2785 2778 2954\nf 3061 3068 2963\nf 2963 2954 3061\nf 3135 3140 3068\nf 3068 3061 3135\nf 3167 3176 3140\nf 3140 3135 3167\nf 3195 3203 3176\nf 3176 3167 3195\nf 3208 3213 3203\nf 3203 3195 3208\nf 2284 2294 1783\nf 1783 1781 2284\nf 2455 2461 2294\nf 2294 2284 2455\nf 2620 2630 2461\nf 2461 2455 2620\nf 2768 2778 2630\nf 2630 2620 2768\nf 2928 2954 2778\nf 2778 2768 2928\nf 3051 3061 2954\nf 2954 2928 3051\nf 3125 3135 3061\nf 3061 3051 3125\nf 3159 3167 3135\nf 3135 3125 3159\nf 3181 3195 3167\nf 3167 3159 3181\nf 3191 3208 3195\nf 3195 3181 3191\nf 2266 2284 1781\nf 1781 1779 2266\nf 2449 2455 2284\nf 2284 2266 2449\nf 2598 2620 2455\nf 2455 2449 2598\nf 2740 2768 2620\nf 2620 2598 2740\nf 2892 2928 2768\nf 2768 2740 2892\nf 3033 3051 2928\nf 2928 2892 3033\nf 3087 3125 3051\nf 3051 3033 3087\nf 3145 3159 3125\nf 3125 3087 3145\nf 3161 3181 3159\nf 3159 3145 3161\nf 3169 3191 3181\nf 3181 3161 3169\nf 2252 2266 1779\nf 1779 1777 2252\nf 2435 2449 2266\nf 2266 2252 2435\nf 2581 2598 2449\nf 2449 2435 2581\nf 2718 2740 2598\nf 2598 2581 2718\nf 2854 2892 2740\nf 2740 2718 2854\nf 2999 3033 2892\nf 2892 2854 2999\nf 3071 3087 3033\nf 3033 2999 3071\nf 3123 3145 3087\nf 3087 3071 3123\nf 3147 3161 3145\nf 3145 3123 3147\nf 3153 3169 3161\nf 3161 3147 3153\nf 2240 2252 1777\nf 1777 1775 2240\nf 2425 2435 2252\nf 2252 2240 2425\nf 2555 2581 2435\nf 2435 2425 2555\nf 2694 2718 2581\nf 2581 2555 2694\nf 2826 2854 2718\nf 2718 2694 2826\nf 2958 2999 2854\nf 2854 2826 2958\nf 3043 3071 2999\nf 2999 2958 3043\nf 3083 3123 3071\nf 3071 3043 3083\nf 3121 3147 3123\nf 3123 3083 3121\nf 3127 3153 3147\nf 3147 3121 3127\nf 2229 2240 1775\nf 1775 1772 2229\nf 2417 2425 2240\nf 2240 2229 2417\nf 2546 2555 2425\nf 2425 2417 2546\nf 2676 2694 2555\nf 2555 2546 2676\nf 2790 2826 2694\nf 2694 2676 2790\nf 2900 2958 2826\nf 2826 2790 2900\nf 3013 3043 2958\nf 2958 2900 3013\nf 3057 3083 3043\nf 3043 3013 3057\nf 3081 3121 3083\nf 3083 3057 3081\nf 3085 3127 3121\nf 3121 3081 3085\nf 2216 2229 1772\nf 1772 1769 2216\nf 2407 2417 2229\nf 2229 2216 2407\nf 2533 2546 2417\nf 2417 2407 2533\nf 2651 2676 2546\nf 2546 2533 2651\nf 2753 2790 2676\nf 2676 2651 2753\nf 2859 2900 2790\nf 2790 2753 2859\nf 2977 3013 2900\nf 2900 2859 2977\nf 3029 3057 3013\nf 3013 2977 3029\nf 3052 3081 3057\nf 3057 3029 3052\nf 3063 3085 3081\nf 3081 3052 3063\nf 2203 2216 1769\nf 1769 1767 2203\nf 2397 2407 2216\nf 2216 2203 2397\nf 2527 2533 2407\nf 2407 2397 2527\nf 2633 2651 2533\nf 2533 2527 2633\nf 2727 2753 2651\nf 2651 2633 2727\nf 2831 2859 2753\nf 2753 2727 2831\nf 2919 2977 2859\nf 2859 2831 2919\nf 2996 3029 2977\nf 2977 2919 2996\nf 3034 3052 3029\nf 3029 2996 3034\nf 3038 3063 3052\nf 3052 3034 3038\nf 2197 2203 1767\nf 1767 1763 2197\nf 2393 2397 2203\nf 2203 2197 2393\nf 2522 2527 2397\nf 2397 2393 2522\nf 2617 2633 2527\nf 2527 2522 2617\nf 2716 2727 2633\nf 2633 2617 2716\nf 2811 2831 2727\nf 2727 2716 2811\nf 2895 2919 2831\nf 2831 2811 2895\nf 2979 2996 2919\nf 2919 2895 2979\nf 3016 3034 2996\nf 2996 2979 3016\nf 3026 3038 3034\nf 3034 3016 3026\nf 2193 2197 1763\nf 1763 1761 2193\nf 2389 2393 2197\nf 2197 2193 2389\nf 2516 2522 2393\nf 2393 2389 2516\nf 2610 2617 2522\nf 2522 2516 2610\nf 2710 2716 2617\nf 2617 2610 2710\nf 2803 2811 2716\nf 2716 2710 2803\nf 2885 2895 2811\nf 2811 2803 2885\nf 2971 2979 2895\nf 2895 2885 2971\nf 3005 3016 2979\nf 2979 2971 3005\nf 3022 3026 3016\nf 3016 3005 3022\nf 461 545 544\nf 544 456 461\nf 463 551 545\nf 545 461 463\nf 465 557 551\nf 551 463 465\nf 469 567 557\nf 557 465 469\nf 471 575 567\nf 567 469 471\nf 473 577 575\nf 575 471 473\nf 475 589 577\nf 577 473 475\nf 477 593 589\nf 589 475 477\nf 479 595 593\nf 593 477 479\nf 481 599 595\nf 595 479 481\nf 389 461 456\nf 456 392 389\nf 386 463 461\nf 461 389 386\nf 379 465 463\nf 463 386 379\nf 373 469 465\nf 465 379 373\nf 371 471 469\nf 469 373 371\nf 369 473 471\nf 471 371 369\nf 366 475 473\nf 473 369 366\nf 364 477 475\nf 475 366 364\nf 362 479 477\nf 477 364 362\nf 361 481 479\nf 479 362 361\nf 335 389 392\nf 392 337 335\nf 333 386 389\nf 389 335 333\nf 331 379 386\nf 386 333 331\nf 329 373 379\nf 379 331 329\nf 328 371 373\nf 373 329 328\nf 325 369 371\nf 371 328 325\nf 323 366 369\nf 369 325 323\nf 321 364 366\nf 366 323 321\nf 319 362 364\nf 364 321 319\nf 316 361 362\nf 362 319 316\nf 298 335 337\nf 337 302 298\nf 290 333 335\nf 335 298 290\nf 288 331 333\nf 333 290 288\nf 286 329 331\nf 331 288 286\nf 281 328 329\nf 329 286 281\nf 275 325 328\nf 328 281 275\nf 265 323 325\nf 325 275 265\nf 259 321 323\nf 323 265 259\nf 255 319 321\nf 321 259 255\nf 249 316 319\nf 319 255 249\nf 269 298 302\nf 302 271 269\nf 261 290 298\nf 298 269 261\nf 251 288 290\nf 290 261 251\nf 238 286 288\nf 288 251 238\nf 230 281 286\nf 286 238 230\nf 218 275 281\nf 281 230 218\nf 208 265 275\nf 275 218 208\nf 196 259 265\nf 265 208 196\nf 186 255 259\nf 259 196 186\nf 181 249 255\nf 255 186 181\nf 228 269 271\nf 271 234 228\nf 222 261 269\nf 269 228 222\nf 212 251 261\nf 261 222 212\nf 200 238 251\nf 251 212 200\nf 177 230 238\nf 238 200 177\nf 160 218 230\nf 230 177 160\nf 134 208 218\nf 218 160 134\nf 112 196 208\nf 208 134 112\nf 102 186 196\nf 196 112 102\nf 96 181 186\nf 186 102 96\nf 198 228 234\nf 234 205 198\nf 182 222 228\nf 228 198 182\nf 168 212 222\nf 222 182 168\nf 146 200 212\nf 212 168 146\nf 118 177 200\nf 200 146 118\nf 92 160 177\nf 177 118 92\nf 74 134 160\nf 160 92 74\nf 63 112 134\nf 134 74 63\nf 53 102 112\nf 112 63 53\nf 50 96 102\nf 102 53 50\nf 167 198 205\nf 205 170 167\nf 154 182 198\nf 198 167 154\nf 126 168 182\nf 182 154 126\nf 100 146 168\nf 168 126 100\nf 83 118 146\nf 146 100 83\nf 61 92 118\nf 118 83 61\nf 46 74 92\nf 92 61 46\nf 32 63 74\nf 74 46 32\nf 25 53 63\nf 63 32 25\nf 21 50 53\nf 53 25 21\nf 143 167 170\nf 170 150 143\nf 124 154 167\nf 167 143 124\nf 104 126 154\nf 154 124 104\nf 84 100 126\nf 126 104 84\nf 65 83 100\nf 100 84 65\nf 44 61 83\nf 83 65 44\nf 30 46 61\nf 61 44 30\nf 17 32 46\nf 46 30 17\nf 9 25 32\nf 32 17 9\nf 5 21 25\nf 25 9 5\nf 132 143 150\nf 150 140 132\nf 116 124 143\nf 143 132 116\nf 94 104 124\nf 124 116 94\nf 76 84 104\nf 104 94 76\nf 55 65 84\nf 84 76 55\nf 40 44 65\nf 65 55 40\nf 22 30 44\nf 44 40 22\nf 11 17 30\nf 30 22 11\nf 2 9 17\nf 17 11 2\nf 1 5 9\nf 9 2 1\nf 480 596 599\nf 599 481 480\nf 478 594 596\nf 596 480 478\nf 476 590 594\nf 594 478 476\nf 474 578 590\nf 590 476 474\nf 472 576 578\nf 578 474 472\nf 470 568 576\nf 576 472 470\nf 466 558 568\nf 568 470 466\nf 464 552 558\nf 558 466 464\nf 462 546 552\nf 552 464 462\nf 456 544 546\nf 546 462 456\nf 363 480 481\nf 481 360 363\nf 365 478 480\nf 480 363 365\nf 367 476 478\nf 478 365 367\nf 368 474 476\nf 476 367 368\nf 370 472 474\nf 474 368 370\nf 372 470 472\nf 472 370 372\nf 380 466 470\nf 470 372 380\nf 385 464 466\nf 466 380 385\nf 390 462 464\nf 464 385 390\nf 391 456 462\nf 462 390 391\nf 320 363 360\nf 360 316 320\nf 322 365 363\nf 363 320 322\nf 324 367 365\nf 365 322 324\nf 326 368 367\nf 367 324 326\nf 327 370 368\nf 368 326 327\nf 330 372 370\nf 370 327 330\nf 332 380 372\nf 372 330 332\nf 334 385 380\nf 380 332 334\nf 336 390 385\nf 385 334 336\nf 337 391 390\nf 390 336 337\nf 256 320 316\nf 316 250 256\nf 260 322 320\nf 320 256 260\nf 266 324 322\nf 322 260 266\nf 276 326 324\nf 324 266 276\nf 282 327 326\nf 326 276 282\nf 287 330 327\nf 327 282 287\nf 289 332 330\nf 330 287 289\nf 291 334 332\nf 332 289 291\nf 299 336 334\nf 334 291 299\nf 303 337 336\nf 336 299 303\nf 187 256 250\nf 250 181 187\nf 197 260 256\nf 256 187 197\nf 209 266 260\nf 260 197 209\nf 219 276 266\nf 266 209 219\nf 231 282 276\nf 276 219 231\nf 239 287 282\nf 282 231 239\nf 252 289 287\nf 287 239 252\nf 262 291 289\nf 289 252 262\nf 270 299 291\nf 291 262 270\nf 272 303 299\nf 299 270 272\nf 103 187 181\nf 181 97 103\nf 113 197 187\nf 187 103 113\nf 135 209 197\nf 197 113 135\nf 161 219 209\nf 209 135 161\nf 178 231 219\nf 219 161 178\nf 201 239 231\nf 231 178 201\nf 213 252 239\nf 239 201 213\nf 223 262 252\nf 252 213 223\nf 229 270 262\nf 262 223 229\nf 235 272 270\nf 270 229 235\nf 54 103 97\nf 97 50 54\nf 64 113 103\nf 103 54 64\nf 75 135 113\nf 113 64 75\nf 93 161 135\nf 135 75 93\nf 119 178 161\nf 161 93 119\nf 147 201 178\nf 178 119 147\nf 169 213 201\nf 201 147 169\nf 183 223 213\nf 213 169 183\nf 199 229 223\nf 223 183 199\nf 205 235 229\nf 229 199 205\nf 24 54 50\nf 50 21 24\nf 33 64 54\nf 54 24 33\nf 47 75 64\nf 64 33 47\nf 62 93 75\nf 75 47 62\nf 82 119 93\nf 93 62 82\nf 101 147 119\nf 119 82 101\nf 127 169 147\nf 147 101 127\nf 155 183 169\nf 169 127 155\nf 166 199 183\nf 183 155 166\nf 171 205 199\nf 199 166 171\nf 10 24 21\nf 21 6 10\nf 18 33 24\nf 24 10 18\nf 31 47 33\nf 33 18 31\nf 45 62 47\nf 47 31 45\nf 66 82 62\nf 62 45 66\nf 85 101 82\nf 82 66 85\nf 105 127 101\nf 101 85 105\nf 125 155 127\nf 127 105 125\nf 144 166 155\nf 155 125 144\nf 151 171 166\nf 166 144 151\nf 3 10 6\nf 6 1 3\nf 12 18 10\nf 10 3 12\nf 23 31 18\nf 18 12 23\nf 41 45 31\nf 31 23 41\nf 56 66 45\nf 45 41 56\nf 77 85 66\nf 66 56 77\nf 95 105 85\nf 85 77 95\nf 117 125 105\nf 105 95 117\nf 133 144 125\nf 125 117 133\nf 140 151 144\nf 144 133 140\nf 138 132 140\nf 140 145 138\nf 122 116 132\nf 132 138 122\nf 98 94 116\nf 116 122 98\nf 80 76 94\nf 94 98 80\nf 60 55 76\nf 76 80 60\nf 42 40 55\nf 55 60 42\nf 28 22 40\nf 40 42 28\nf 13 11 22\nf 22 28 13\nf 7 2 11\nf 11 13 7\nf 4 1 2\nf 2 7 4\nf 152 138 145\nf 145 158 152\nf 136 122 138\nf 138 152 136\nf 108 98 122\nf 122 136 108\nf 89 80 98\nf 98 108 89\nf 70 60 80\nf 80 89 70\nf 52 42 60\nf 60 70 52\nf 38 28 42\nf 42 52 38\nf 26 13 28\nf 28 38 26\nf 19 7 13\nf 13 26 19\nf 15 4 7\nf 7 19 15\nf 173 152 158\nf 158 176 173\nf 162 136 152\nf 152 173 162\nf 142 108 136\nf 136 162 142\nf 111 89 108\nf 108 142 111\nf 91 70 89\nf 89 111 91\nf 73 52 70\nf 70 91 73\nf 58 38 52\nf 52 73 58\nf 48 26 38\nf 38 58 48\nf 37 19 26\nf 26 48 37\nf 35 15 19\nf 19 37 35\nf 194 173 176\nf 176 202 194\nf 184 162 173\nf 173 194 184\nf 174 142 162\nf 162 184 174\nf 156 111 142\nf 142 174 156\nf 128 91 111\nf 111 156 128\nf 106 73 91\nf 91 128 106\nf 86 58 73\nf 73 106 86\nf 78 48 58\nf 58 86 78\nf 68 37 48\nf 48 78 68\nf 67 35 37\nf 37 68 67\nf 221 194 202\nf 202 225 221\nf 216 184 194\nf 194 221 216\nf 206 174 184\nf 184 216 206\nf 192 156 174\nf 174 206 192\nf 180 128 156\nf 156 192 180\nf 164 106 128\nf 128 180 164\nf 148 86 106\nf 106 164 148\nf 130 78 86\nf 86 148 130\nf 121 68 78\nf 78 130 121\nf 115 67 68\nf 68 121 115\nf 244 221 225\nf 225 247 244\nf 240 216 221\nf 221 244 240\nf 236 206 216\nf 216 240 236\nf 233 192 206\nf 206 236 233\nf 227 180 192\nf 192 233 227\nf 215 164 180\nf 180 227 215\nf 210 148 164\nf 164 215 210\nf 203 130 148\nf 148 210 203\nf 191 121 130\nf 130 203 191\nf 188 115 121\nf 121 191 188\nf 284 244 247\nf 247 285 284\nf 279 240 244\nf 244 284 279\nf 277 236 240\nf 240 279 277\nf 273 233 236\nf 236 277 273\nf 267 227 233\nf 233 273 267\nf 263 215 227\nf 227 267 263\nf 258 210 215\nf 215 263 258\nf 253 203 210\nf 210 258 253\nf 245 191 203\nf 203 253 245\nf 242 188 191\nf 191 245 242\nf 315 284 285\nf 285 318 315\nf 312 279 284\nf 284 315 312\nf 311 277 279\nf 279 312 311\nf 309 273 277\nf 277 311 309\nf 307 267 273\nf 273 309 307\nf 305 263 267\nf 267 307 305\nf 301 258 263\nf 263 305 301\nf 297 253 258\nf 258 301 297\nf 295 245 253\nf 253 297 295\nf 293 242 245\nf 245 295 293\nf 341 315 318\nf 318 339 341\nf 343 312 315\nf 315 341 343\nf 345 311 312\nf 312 343 345\nf 347 309 311\nf 311 345 347\nf 349 307 309\nf 309 347 349\nf 351 305 307\nf 307 349 351\nf 353 301 305\nf 305 351 353\nf 355 297 301\nf 301 353 355\nf 357 295 297\nf 297 355 357\nf 359 293 295\nf 295 357 359\nf 378 341 339\nf 339 376 378\nf 384 343 341\nf 341 378 384\nf 394 345 343\nf 343 384 394\nf 403 347 345\nf 345 394 403\nf 406 349 347\nf 347 403 406\nf 415 351 349\nf 349 406 415\nf 419 353 351\nf 351 415 419\nf 423 355 353\nf 353 419 423\nf 425 357 355\nf 355 423 425\nf 427 359 357\nf 357 425 427\nf 8 3 1\nf 1 4 8\nf 14 12 3\nf 3 8 14\nf 29 23 12\nf 12 14 29\nf 43 41 23\nf 23 29 43\nf 59 56 41\nf 41 43 59\nf 81 77 56\nf 56 59 81\nf 99 95 77\nf 77 81 99\nf 123 117 95\nf 95 99 123\nf 139 133 117\nf 117 123 139\nf 145 140 133\nf 133 139 145\nf 20 8 4\nf 4 16 20\nf 27 14 8\nf 8 20 27\nf 39 29 14\nf 14 27 39\nf 51 43 29\nf 29 39 51\nf 71 59 43\nf 43 51 71\nf 88 81 59\nf 59 71 88\nf 109 99 81\nf 81 88 109\nf 137 123 99\nf 99 109 137\nf 153 139 123\nf 123 137 153\nf 159 145 139\nf 139 153 159\nf 36 20 16\nf 16 34 36\nf 49 27 20\nf 20 36 49\nf 57 39 27\nf 27 49 57\nf 72 51 39\nf 39 57 72\nf 90 71 51\nf 51 72 90\nf 110 88 71\nf 71 90 110\nf 141 109 88\nf 88 110 141\nf 163 137 109\nf 109 141 163\nf 172 153 137\nf 137 163 172\nf 176 159 153\nf 153 172 176\nf 69 36 34\nf 34 67 69\nf 79 49 36\nf 36 69 79\nf 87 57 49\nf 49 79 87\nf 107 72 57\nf 57 87 107\nf 129 90 72\nf 72 107 129\nf 157 110 90\nf 90 129 157\nf 175 141 110\nf 110 157 175\nf 185 163 141\nf 141 175 185\nf 195 172 163\nf 163 185 195\nf 202 176 172\nf 172 195 202\nf 120 69 67\nf 67 114 120\nf 131 79 69\nf 69 120 131\nf 149 87 79\nf 79 131 149\nf 165 107 87\nf 87 149 165\nf 179 129 107\nf 107 165 179\nf 193 157 129\nf 129 179 193\nf 207 175 157\nf 157 193 207\nf 217 185 175\nf 175 207 217\nf 220 195 185\nf 185 217 220\nf 224 202 195\nf 195 220 224\nf 190 120 114\nf 114 189 190\nf 204 131 120\nf 120 190 204\nf 211 149 131\nf 131 204 211\nf 214 165 149\nf 149 211 214\nf 226 179 165\nf 165 214 226\nf 232 193 179\nf 179 226 232\nf 237 207 193\nf 193 232 237\nf 241 217 207\nf 207 237 241\nf 243 220 217\nf 217 241 243\nf 248 224 220\nf 220 243 248\nf 246 190 189\nf 189 242 246\nf 254 204 190\nf 190 246 254\nf 257 211 204\nf 204 254 257\nf 264 214 211\nf 211 257 264\nf 268 226 214\nf 214 264 268\nf 274 232 226\nf 226 268 274\nf 278 237 232\nf 232 274 278\nf 280 241 237\nf 237 278 280\nf 283 243 241\nf 241 280 283\nf 285 248 243\nf 243 283 285\nf 294 246 242\nf 242 292 294\nf 296 254 246\nf 246 294 296\nf 300 257 254\nf 254 296 300\nf 304 264 257\nf 257 300 304\nf 306 268 264\nf 264 304 306\nf 308 274 268\nf 268 306 308\nf 310 278 274\nf 274 308 310\nf 313 280 278\nf 278 310 313\nf 314 283 280\nf 280 313 314\nf 317 285 283\nf 283 314 317\nf 356 294 292\nf 292 358 356\nf 354 296 294\nf 294 356 354\nf 352 300 296\nf 296 354 352\nf 350 304 300\nf 300 352 350\nf 348 306 304\nf 304 350 348\nf 346 308 306\nf 306 348 346\nf 344 310 308\nf 308 346 344\nf 342 313 310\nf 310 344 342\nf 340 314 313\nf 313 342 340\nf 338 317 314\nf 314 340 338\nf 424 356 358\nf 358 426 424\nf 422 354 356\nf 356 424 422\nf 418 352 354\nf 354 422 418\nf 414 350 352\nf 352 418 414\nf 407 348 350\nf 350 414 407\nf 402 346 348\nf 348 407 402\nf 393 344 346\nf 346 402 393\nf 383 342 344\nf 344 393 383\nf 377 340 342\nf 342 383 377\nf 375 338 340\nf 340 377 375\nf 3186 3113 3115\nf 3115 3182 3186\nf 3192 3110 3113\nf 3113 3186 3192\nf 3196 3109 3110\nf 3110 3192 3196\nf 3205 3106 3109\nf 3109 3196 3205\nf 3211 3104 3106\nf 3106 3205 3211\nf 3215 3102 3104\nf 3104 3211 3215\nf 3217 3101 3102\nf 3102 3215 3217\nf 3220 3098 3101\nf 3101 3217 3220\nf 3222 3097 3098\nf 3098 3220 3222\nf 3223 3095 3097\nf 3097 3222 3223\nf 3227 3186 3182\nf 3182 3225 3227\nf 3229 3192 3186\nf 3186 3227 3229\nf 3231 3196 3192\nf 3192 3229 3231\nf 3233 3205 3196\nf 3196 3231 3233\nf 3235 3211 3205\nf 3205 3233 3235\nf 3241 3215 3211\nf 3211 3235 3241\nf 3245 3217 3215\nf 3215 3241 3245\nf 3249 3220 3217\nf 3217 3245 3249\nf 3251 3222 3220\nf 3220 3249 3251\nf 3253 3223 3222\nf 3222 3251 3253\nf 3239 3227 3225\nf 3225 3237 3239\nf 3243 3229 3227\nf 3227 3239 3243\nf 3247 3231 3229\nf 3229 3243 3247\nf 3257 3233 3231\nf 3231 3247 3257\nf 3263 3235 3233\nf 3233 3257 3263\nf 3271 3241 3235\nf 3235 3263 3271\nf 3279 3245 3241\nf 3241 3271 3279\nf 3285 3249 3245\nf 3245 3279 3285\nf 3293 3251 3249\nf 3249 3285 3293\nf 3297 3253 3251\nf 3251 3293 3297\nf 3259 3239 3237\nf 3237 3255 3259\nf 3261 3243 3239\nf 3239 3259 3261\nf 3265 3247 3243\nf 3243 3261 3265\nf 3275 3257 3247\nf 3247 3265 3275\nf 3287 3263 3257\nf 3257 3275 3287\nf 3303 3271 3263\nf 3263 3287 3303\nf 3314 3279 3271\nf 3271 3303 3314\nf 3320 3285 3279\nf 3279 3314 3320\nf 3330 3293 3285\nf 3285 3320 3330\nf 3332 3297 3293\nf 3293 3330 3332\nf 3270 3259 3255\nf 3255 3268 3270\nf 3273 3261 3259\nf 3259 3270 3273\nf 3283 3265 3261\nf 3261 3273 3283\nf 3299 3275 3265\nf 3265 3283 3299\nf 3308 3287 3275\nf 3275 3299 3308\nf 3322 3303 3287\nf 3287 3308 3322\nf 3338 3314 3303\nf 3303 3322 3338\nf 3346 3320 3314\nf 3314 3338 3346\nf 3351 3330 3320\nf 3320 3346 3351\nf 3355 3332 3330\nf 3330 3351 3355\nf 3282 3270 3268\nf 3268 3278 3282\nf 3290 3273 3270\nf 3270 3282 3290\nf 3302 3283 3273\nf 3273 3290 3302\nf 3312 3299 3283\nf 3283 3302 3312\nf 3324 3308 3299\nf 3299 3312 3324\nf 3340 3322 3308\nf 3308 3324 3340\nf 3353 3338 3322\nf 3322 3340 3353\nf 3368 3346 3338\nf 3338 3353 3368\nf 3373 3351 3346\nf 3346 3368 3373\nf 3379 3355 3351\nf 3351 3373 3379\nf 3295 3282 3278\nf 3278 3292 3295\nf 3306 3290 3282\nf 3282 3295 3306\nf 3316 3302 3290\nf 3290 3306 3316\nf 3326 3312 3302\nf 3302 3316 3326\nf 3345 3324 3312\nf 3312 3326 3345\nf 3359 3340 3324\nf 3324 3345 3359\nf 3376 3353 3340\nf 3340 3359 3376\nf 3394 3368 3353\nf 3353 3376 3394\nf 3404 3373 3368\nf 3368 3394 3404\nf 3406 3379 3373\nf 3373 3404 3406\nf 3310 3295 3292\nf 3292 3307 3310\nf 3318 3306 3295\nf 3295 3310 3318\nf 3336 3316 3306\nf 3306 3318 3336\nf 3348 3326 3316\nf 3316 3336 3348\nf 3369 3345 3326\nf 3326 3348 3369\nf 3389 3359 3345\nf 3345 3369 3389\nf 3425 3376 3359\nf 3359 3389 3425\nf 3449 3394 3376\nf 3376 3425 3449\nf 3468 3404 3394\nf 3394 3449 3468\nf 3472 3406 3404\nf 3404 3468 3472\nf 3335 3310 3307\nf 3307 3329 3335\nf 3343 3318 3310\nf 3310 3335 3343\nf 3362 3336 3318\nf 3318 3343 3362\nf 3386 3348 3336\nf 3336 3362 3386\nf 3422 3369 3348\nf 3348 3386 3422\nf 3464 3389 3369\nf 3369 3422 3464\nf 3490 3425 3389\nf 3389 3464 3490\nf 3505 3449 3425\nf 3425 3490 3505\nf 3521 3468 3449\nf 3449 3505 3521\nf 3523 3472 3468\nf 3468 3521 3523\nf 3364 3335 3329\nf 3329 3357 3364\nf 3382 3343 3335\nf 3335 3364 3382\nf 3416 3362 3343\nf 3343 3382 3416\nf 3465 3386 3362\nf 3362 3416 3465\nf 3495 3422 3386\nf 3386 3465 3495\nf 3528 3464 3422\nf 3422 3495 3528\nf 3553 3490 3464\nf 3464 3528 3553\nf 3579 3505 3490\nf 3490 3553 3579\nf 3592 3521 3505\nf 3505 3579 3592\nf 3604 3523 3521\nf 3521 3592 3604\nf 3221 3096 3094\nf 3094 3224 3221\nf 3219 3099 3096\nf 3096 3221 3219\nf 3218 3100 3099\nf 3099 3219 3218\nf 3216 3103 3100\nf 3100 3218 3216\nf 3212 3105 3103\nf 3103 3216 3212\nf 3206 3107 3105\nf 3105 3212 3206\nf 3197 3108 3107\nf 3107 3206 3197\nf 3193 3111 3108\nf 3108 3197 3193\nf 3187 3112 3111\nf 3111 3193 3187\nf 3183 3114 3112\nf 3112 3187 3183\nf 3252 3221 3224\nf 3224 3254 3252\nf 3250 3219 3221\nf 3221 3252 3250\nf 3246 3218 3219\nf 3219 3250 3246\nf 3242 3216 3218\nf 3218 3246 3242\nf 3236 3212 3216\nf 3216 3242 3236\nf 3234 3206 3212\nf 3212 3236 3234\nf 3232 3197 3206\nf 3206 3234 3232\nf 3230 3193 3197\nf 3197 3232 3230\nf 3228 3187 3193\nf 3193 3230 3228\nf 3226 3183 3187\nf 3187 3228 3226\nf 3294 3252 3254\nf 3254 3298 3294\nf 3286 3250 3252\nf 3252 3294 3286\nf 3280 3246 3250\nf 3250 3286 3280\nf 3272 3242 3246\nf 3246 3280 3272\nf 3264 3236 3242\nf 3242 3272 3264\nf 3258 3234 3236\nf 3236 3264 3258\nf 3248 3232 3234\nf 3234 3258 3248\nf 3244 3230 3232\nf 3232 3248 3244\nf 3240 3228 3230\nf 3230 3244 3240\nf 3238 3226 3228\nf 3228 3240 3238\nf 3331 3294 3298\nf 3298 3333 3331\nf 3321 3286 3294\nf 3294 3331 3321\nf 3315 3280 3286\nf 3286 3321 3315\nf 3304 3272 3280\nf 3280 3315 3304\nf 3288 3264 3272\nf 3272 3304 3288\nf 3276 3258 3264\nf 3264 3288 3276\nf 3266 3248 3258\nf 3258 3276 3266\nf 3262 3244 3248\nf 3248 3266 3262\nf 3260 3240 3244\nf 3244 3262 3260\nf 3256 3238 3240\nf 3240 3260 3256\nf 3350 3331 3333\nf 3333 3354 3350\nf 3347 3321 3331\nf 3331 3350 3347\nf 3339 3315 3321\nf 3321 3347 3339\nf 3323 3304 3315\nf 3315 3339 3323\nf 3309 3288 3304\nf 3304 3323 3309\nf 3300 3276 3288\nf 3288 3309 3300\nf 3284 3266 3276\nf 3276 3300 3284\nf 3274 3262 3266\nf 3266 3284 3274\nf 3269 3260 3262\nf 3262 3274 3269\nf 3267 3256 3260\nf 3260 3269 3267\nf 3372 3350 3354\nf 3354 3378 3372\nf 3367 3347 3350\nf 3350 3372 3367\nf 3352 3339 3347\nf 3347 3367 3352\nf 3341 3323 3339\nf 3339 3352 3341\nf 3325 3309 3323\nf 3323 3341 3325\nf 3313 3300 3309\nf 3309 3325 3313\nf 3301 3284 3300\nf 3300 3313 3301\nf 3289 3274 3284\nf 3284 3301 3289\nf 3281 3269 3274\nf 3274 3289 3281\nf 3277 3267 3269\nf 3269 3281 3277\nf 3403 3372 3378\nf 3378 3405 3403\nf 3393 3367 3372\nf 3372 3403 3393\nf 3377 3352 3367\nf 3367 3393 3377\nf 3360 3341 3352\nf 3352 3377 3360\nf 3344 3325 3341\nf 3341 3360 3344\nf 3327 3313 3325\nf 3325 3344 3327\nf 3317 3301 3313\nf 3313 3327 3317\nf 3305 3289 3301\nf 3301 3317 3305\nf 3296 3281 3289\nf 3289 3305 3296\nf 3291 3277 3281\nf 3281 3296 3291\nf 3469 3403 3405\nf 3405 3472 3469\nf 3450 3393 3403\nf 3403 3469 3450\nf 3426 3377 3393\nf 3393 3450 3426\nf 3390 3360 3377\nf 3377 3426 3390\nf 3370 3344 3360\nf 3360 3390 3370\nf 3349 3327 3344\nf 3344 3370 3349\nf 3337 3317 3327\nf 3327 3349 3337\nf 3319 3305 3317\nf 3317 3337 3319\nf 3311 3296 3305\nf 3305 3319 3311\nf 3307 3291 3296\nf 3296 3311 3307\nf 3520 3469 3472\nf 3472 3522 3520\nf 3504 3450 3469\nf 3469 3520 3504\nf 3489 3426 3450\nf 3450 3504 3489\nf 3463 3390 3426\nf 3426 3489 3463\nf 3421 3370 3390\nf 3390 3463 3421\nf 3385 3349 3370\nf 3370 3421 3385\nf 3361 3337 3349\nf 3349 3385 3361\nf 3342 3319 3337\nf 3337 3361 3342\nf 3334 3311 3319\nf 3319 3342 3334\nf 3328 3307 3311\nf 3311 3334 3328\nf 3591 3520 3522\nf 3522 3603 3591\nf 3578 3504 3520\nf 3520 3591 3578\nf 3552 3489 3504\nf 3504 3578 3552\nf 3530 3463 3489\nf 3489 3552 3530\nf 3499 3421 3463\nf 3463 3530 3499\nf 3467 3385 3421\nf 3421 3499 3467\nf 3415 3361 3385\nf 3385 3467 3415\nf 3381 3342 3361\nf 3361 3415 3381\nf 3363 3334 3342\nf 3342 3381 3363\nf 3356 3328 3334\nf 3334 3363 3356\nf 3374 3365 3358\nf 3358 3371 3374\nf 3395 3383 3365\nf 3365 3374 3395\nf 3443 3417 3383\nf 3383 3395 3443\nf 3481 3466 3417\nf 3417 3443 3481\nf 3514 3496 3466\nf 3466 3481 3514\nf 3545 3529 3496\nf 3496 3514 3545\nf 3573 3551 3529\nf 3529 3545 3573\nf 3597 3577 3551\nf 3551 3573 3597\nf 3613 3590 3577\nf 3577 3597 3613\nf 3619 3603 3590\nf 3590 3613 3619\nf 3387 3374 3371\nf 3371 3380 3387\nf 3413 3395 3374\nf 3374 3387 3413\nf 3461 3443 3395\nf 3395 3413 3461\nf 3493 3481 3443\nf 3443 3461 3493\nf 3524 3514 3481\nf 3481 3493 3524\nf 3556 3545 3514\nf 3514 3524 3556\nf 3584 3573 3545\nf 3545 3556 3584\nf 3611 3597 3573\nf 3573 3584 3611\nf 3628 3613 3597\nf 3597 3611 3628\nf 3632 3619 3613\nf 3613 3628 3632\nf 3398 3387 3380\nf 3380 3391 3398\nf 3435 3413 3387\nf 3387 3398 3435\nf 3473 3461 3413\nf 3413 3435 3473\nf 3500 3493 3461\nf 3461 3473 3500\nf 3531 3524 3493\nf 3493 3500 3531\nf 3562 3556 3524\nf 3524 3531 3562\nf 3595 3584 3556\nf 3556 3562 3595\nf 3617 3611 3584\nf 3584 3595 3617\nf 3633 3628 3611\nf 3611 3617 3633\nf 3641 3632 3628\nf 3628 3633 3641\nf 3409 3398 3391\nf 3391 3400 3409\nf 3447 3435 3398\nf 3398 3409 3447\nf 3477 3473 3435\nf 3435 3447 3477\nf 3506 3500 3473\nf 3473 3477 3506\nf 3540 3531 3500\nf 3500 3506 3540\nf 3567 3562 3531\nf 3531 3540 3567\nf 3601 3595 3562\nf 3562 3567 3601\nf 3624 3617 3595\nf 3595 3601 3624\nf 3639 3633 3617\nf 3617 3624 3639\nf 3644 3641 3633\nf 3633 3639 3644\nf 3433 3409 3400\nf 3400 3411 3433\nf 3453 3447 3409\nf 3409 3433 3453\nf 3483 3477 3447\nf 3447 3453 3483\nf 3510 3506 3477\nf 3477 3483 3510\nf 3543 3540 3506\nf 3506 3510 3543\nf 3569 3567 3540\nf 3540 3543 3569\nf 3599 3601 3567\nf 3567 3569 3599\nf 3622 3624 3601\nf 3601 3599 3622\nf 3637 3639 3624\nf 3624 3622 3637\nf 3642 3644 3639\nf 3639 3637 3642\nf 3439 3433 3411\nf 3411 3424 3439\nf 3458 3453 3433\nf 3433 3439 3458\nf 3487 3483 3453\nf 3453 3458 3487\nf 3513 3510 3483\nf 3483 3487 3513\nf 3542 3543 3510\nf 3510 3513 3542\nf 3566 3569 3543\nf 3543 3542 3566\nf 3593 3599 3569\nf 3569 3566 3593\nf 3616 3622 3599\nf 3599 3593 3616\nf 3630 3637 3622\nf 3622 3616 3630\nf 3636 3642 3637\nf 3637 3630 3636\nf 3441 3439 3424\nf 3424 3429 3441\nf 3459 3458 3439\nf 3439 3441 3459\nf 3485 3487 3458\nf 3458 3459 3485\nf 3508 3513 3487\nf 3487 3485 3508\nf 3533 3542 3513\nf 3513 3508 3533\nf 3558 3566 3542\nf 3542 3533 3558\nf 3582 3593 3566\nf 3566 3558 3582\nf 3607 3616 3593\nf 3593 3582 3607\nf 3620 3630 3616\nf 3616 3607 3620\nf 3626 3636 3630\nf 3630 3620 3626\nf 3437 3441 3429\nf 3429 3427 3437\nf 3455 3459 3441\nf 3441 3437 3455\nf 3479 3485 3459\nf 3459 3455 3479\nf 3502 3508 3485\nf 3485 3479 3502\nf 3526 3533 3508\nf 3508 3502 3526\nf 3547 3558 3533\nf 3533 3526 3547\nf 3571 3582 3558\nf 3558 3547 3571\nf 3588 3607 3582\nf 3582 3571 3588\nf 3605 3620 3607\nf 3607 3588 3605\nf 3609 3626 3620\nf 3620 3605 3609\nf 3419 3437 3427\nf 3427 3408 3419\nf 3445 3455 3437\nf 3437 3419 3445\nf 3470 3479 3455\nf 3455 3445 3470\nf 3492 3502 3479\nf 3479 3470 3492\nf 3517 3526 3502\nf 3502 3492 3517\nf 3536 3547 3526\nf 3526 3517 3536\nf 3554 3571 3547\nf 3547 3536 3554\nf 3575 3588 3571\nf 3571 3554 3575\nf 3580 3605 3588\nf 3588 3575 3580\nf 3587 3609 3605\nf 3605 3580 3587\nf 3401 3419 3408\nf 3408 3397 3401\nf 3431 3445 3419\nf 3419 3401 3431\nf 3451 3470 3445\nf 3445 3431 3451\nf 3475 3492 3470\nf 3470 3451 3475\nf 3497 3517 3492\nf 3492 3475 3497\nf 3518 3536 3517\nf 3517 3497 3518\nf 3537 3554 3536\nf 3536 3518 3537\nf 3549 3575 3554\nf 3554 3537 3549\nf 3560 3580 3575\nf 3575 3549 3560\nf 3564 3587 3580\nf 3580 3560 3564\nf 3614 3591 3603\nf 3603 3619 3614\nf 3598 3578 3591\nf 3591 3614 3598\nf 3574 3552 3578\nf 3578 3598 3574\nf 3546 3530 3552\nf 3552 3574 3546\nf 3515 3499 3530\nf 3530 3546 3515\nf 3482 3467 3499\nf 3499 3515 3482\nf 3444 3418 3467\nf 3467 3482 3444\nf 3396 3384 3418\nf 3418 3444 3396\nf 3375 3366 3384\nf 3384 3396 3375\nf 3371 3358 3366\nf 3366 3375 3371\nf 3629 3614 3619\nf 3619 3632 3629\nf 3612 3598 3614\nf 3614 3629 3612\nf 3585 3574 3598\nf 3598 3612 3585\nf 3557 3546 3574\nf 3574 3585 3557\nf 3525 3515 3546\nf 3546 3557 3525\nf 3494 3482 3515\nf 3515 3525 3494\nf 3462 3444 3482\nf 3482 3494 3462\nf 3414 3396 3444\nf 3444 3462 3414\nf 3388 3375 3396\nf 3396 3414 3388\nf 3380 3371 3375\nf 3375 3388 3380\nf 3634 3629 3632\nf 3632 3641 3634\nf 3618 3612 3629\nf 3629 3634 3618\nf 3596 3585 3612\nf 3612 3618 3596\nf 3563 3557 3585\nf 3585 3596 3563\nf 3532 3525 3557\nf 3557 3563 3532\nf 3501 3494 3525\nf 3525 3532 3501\nf 3474 3462 3494\nf 3494 3501 3474\nf 3436 3414 3462\nf 3462 3474 3436\nf 3399 3388 3414\nf 3414 3436 3399\nf 3392 3380 3388\nf 3388 3399 3392\nf 3640 3634 3641\nf 3641 3644 3640\nf 3625 3618 3634\nf 3634 3640 3625\nf 3602 3596 3618\nf 3618 3625 3602\nf 3568 3563 3596\nf 3596 3602 3568\nf 3539 3532 3563\nf 3563 3568 3539\nf 3507 3501 3532\nf 3532 3539 3507\nf 3478 3474 3501\nf 3501 3507 3478\nf 3448 3436 3474\nf 3474 3478 3448\nf 3410 3399 3436\nf 3436 3448 3410\nf 3400 3392 3399\nf 3399 3410 3400\nf 3638 3640 3644\nf 3644 3643 3638\nf 3623 3625 3640\nf 3640 3638 3623\nf 3600 3602 3625\nf 3625 3623 3600\nf 3570 3568 3602\nf 3602 3600 3570\nf 3544 3539 3568\nf 3568 3570 3544\nf 3511 3507 3539\nf 3539 3544 3511\nf 3484 3478 3507\nf 3507 3511 3484\nf 3454 3448 3478\nf 3478 3484 3454\nf 3434 3410 3448\nf 3448 3454 3434\nf 3412 3400 3410\nf 3410 3434 3412\nf 3631 3638 3643\nf 3643 3635 3631\nf 3615 3623 3638\nf 3638 3631 3615\nf 3594 3600 3623\nf 3623 3615 3594\nf 3565 3570 3600\nf 3600 3594 3565\nf 3541 3544 3570\nf 3570 3565 3541\nf 3512 3511 3544\nf 3544 3541 3512\nf 3488 3484 3511\nf 3511 3512 3488\nf 3457 3454 3484\nf 3484 3488 3457\nf 3440 3434 3454\nf 3454 3457 3440\nf 3423 3412 3434\nf 3434 3440 3423\nf 3621 3631 3635\nf 3635 3627 3621\nf 3608 3615 3631\nf 3631 3621 3608\nf 3583 3594 3615\nf 3615 3608 3583\nf 3559 3565 3594\nf 3594 3583 3559\nf 3534 3541 3565\nf 3565 3559 3534\nf 3509 3512 3541\nf 3541 3534 3509\nf 3486 3488 3512\nf 3512 3509 3486\nf 3460 3457 3488\nf 3488 3486 3460\nf 3442 3440 3457\nf 3457 3460 3442\nf 3430 3423 3440\nf 3440 3442 3430\nf 3606 3621 3627\nf 3627 3610 3606\nf 3589 3608 3621\nf 3621 3606 3589\nf 3572 3583 3608\nf 3608 3589 3572\nf 3548 3559 3583\nf 3583 3572 3548\nf 3527 3534 3559\nf 3559 3548 3527\nf 3503 3509 3534\nf 3534 3527 3503\nf 3480 3486 3509\nf 3509 3503 3480\nf 3456 3460 3486\nf 3486 3480 3456\nf 3438 3442 3460\nf 3460 3456 3438\nf 3428 3430 3442\nf 3442 3438 3428\nf 3581 3606 3610\nf 3610 3586 3581\nf 3576 3589 3606\nf 3606 3581 3576\nf 3555 3572 3589\nf 3589 3576 3555\nf 3535 3548 3572\nf 3572 3555 3535\nf 3516 3527 3548\nf 3548 3535 3516\nf 3491 3503 3527\nf 3527 3516 3491\nf 3471 3480 3503\nf 3503 3491 3471\nf 3446 3456 3480\nf 3480 3471 3446\nf 3420 3438 3456\nf 3456 3446 3420\nf 3407 3428 3438\nf 3438 3420 3407\nf 3561 3581 3586\nf 3586 3564 3561\nf 3550 3576 3581\nf 3581 3561 3550\nf 3538 3555 3576\nf 3576 3550 3538\nf 3519 3535 3555\nf 3555 3538 3519\nf 3498 3516 3535\nf 3535 3519 3498\nf 3476 3491 3516\nf 3516 3498 3476\nf 3452 3471 3491\nf 3491 3476 3452\nf 3432 3446 3471\nf 3471 3452 3432\nf 3402 3420 3446\nf 3446 3432 3402\nf 3397 3407 3420\nf 3420 3402 3397\nf 1888 2110 2104\nf 1888 2104 2096\nf 1888 2096 2076\nf 1888 2076 2048\nf 1888 2048 2030\nf 1888 2030 2006\nf 1888 2006 1982\nf 1888 1982 1960\nf 1888 1960 1936\nf 1888 1936 1732\nf 2257 2104 2110\nf 2110 2261 2257\nf 2249 2096 2104\nf 2104 2257 2249\nf 2226 2076 2096\nf 2096 2249 2226\nf 2200 2048 2076\nf 2076 2226 2200\nf 2142 2030 2048\nf 2048 2200 2142\nf 2094 2006 2030\nf 2030 2142 2094\nf 2036 1982 2006\nf 2006 2094 2036\nf 1988 1960 1982\nf 1982 2036 1988\nf 1948 1936 1960\nf 1960 1988 1948\nf 1728 1732 1936\nf 1936 1948 1728\nf 2310 2257 2261\nf 2261 2315 2310\nf 2300 2249 2257\nf 2257 2310 2300\nf 2279 2226 2249\nf 2249 2300 2279\nf 2243 2200 2226\nf 2226 2279 2243\nf 2204 2142 2200\nf 2200 2243 2204\nf 2132 2094 2142\nf 2142 2204 2132\nf 2067 2036 2094\nf 2094 2132 2067\nf 2000 1988 2036\nf 2036 2067 2000\nf 1956 1948 1988\nf 1988 2000 1956\nf 1734 1728 1948\nf 1948 1956 1734\nf 2312 2310 2315\nf 2315 2316 2312\nf 2302 2300 2310\nf 2310 2312 2302\nf 2281 2279 2300\nf 2300 2302 2281\nf 2245 2243 2279\nf 2279 2281 2245\nf 2206 2204 2243\nf 2243 2245 2206\nf 2134 2132 2204\nf 2204 2206 2134\nf 2068 2067 2132\nf 2132 2134 2068\nf 2002 2000 2067\nf 2067 2068 2002\nf 1958 1956 2000\nf 2000 2002 1958\nf 1878 1734 1956\nf 1956 1958 1878\nf 2285 2312 2316\nf 2316 2289 2285\nf 2259 2302 2312\nf 2312 2285 2259\nf 2241 2281 2302\nf 2302 2259 2241\nf 2214 2245 2281\nf 2281 2241 2214\nf 2168 2206 2245\nf 2245 2214 2168\nf 2106 2134 2206\nf 2206 2168 2106\nf 2042 2068 2134\nf 2134 2106 2042\nf 1994 2002 2068\nf 2068 2042 1994\nf 1952 1958 2002\nf 2002 1994 1952\nf 1731 1878 1958\nf 1958 1952 1731\nf 2220 2285 2289\nf 2289 2225 2220\nf 2210 2259 2285\nf 2285 2220 2210\nf 2186 2241 2259\nf 2259 2210 2186\nf 2146 2214 2241\nf 2241 2186 2146\nf 2108 2168 2214\nf 2214 2146 2108\nf 2060 2106 2168\nf 2168 2108 2060\nf 2018 2042 2106\nf 2106 2060 2018\nf 1978 1994 2042\nf 2042 2018 1978\nf 1944 1952 1994\nf 1994 1978 1944\nf 1727 1731 1952\nf 1952 1944 1727\nf 2141 2220 2225\nf 2225 2145 2141\nf 2127 2210 2220\nf 2220 2141 2127\nf 2112 2186 2210\nf 2210 2127 2112\nf 2084 2146 2186\nf 2186 2112 2084\nf 2044 2108 2146\nf 2146 2084 2044\nf 2024 2060 2108\nf 2108 2044 2024\nf 1992 2018 2060\nf 2060 2024 1992\nf 1970 1978 2018\nf 2018 1992 1970\nf 1942 1944 1978\nf 1978 1970 1942\nf 1721 1727 1944\nf 1944 1942 1721\nf 2079 2141 2145\nf 2145 2087 2079\nf 2075 2127 2141\nf 2141 2079 2075\nf 2055 2112 2127\nf 2127 2075 2055\nf 2039 2084 2112\nf 2112 2055 2039\nf 2021 2044 2084\nf 2084 2039 2021\nf 1996 2024 2044\nf 2044 2021 1996\nf 1974 1992 2024\nf 2024 1996 1974\nf 1954 1970 1992\nf 1992 1974 1954\nf 1934 1942 1970\nf 1970 1954 1934\nf 1720 1721 1942\nf 1942 1934 1720\nf 2063 2079 2087\nf 2087 2071 2063\nf 2051 2075 2079\nf 2079 2063 2051\nf 2041 2055 2075\nf 2075 2051 2041\nf 2029 2039 2055\nf 2055 2041 2029\nf 2013 2021 2039\nf 2039 2029 2013\nf 1991 1996 2021\nf 2021 2013 1991\nf 1972 1974 1996\nf 1996 1991 1972\nf 1950 1954 1974\nf 1974 1972 1950\nf 1932 1934 1954\nf 1954 1950 1932\nf 1701 1720 1934\nf 1934 1932 1701\nf 2115 2063 2071\nf 2071 2123 2115\nf 2101 2051 2063\nf 2063 2115 2101\nf 2081 2041 2051\nf 2051 2101 2081\nf 2057 2029 2041\nf 2041 2081 2057\nf 2033 2013 2029\nf 2029 2057 2033\nf 2009 1991 2013\nf 2013 2033 2009\nf 1984 1972 1991\nf 1991 2009 1984\nf 1964 1950 1972\nf 1972 1984 1964\nf 1938 1932 1950\nf 1950 1964 1938\nf 1698 1701 1932\nf 1932 1938 1698\nf 1888 1886 1686\nf 1888 1686 1662\nf 1888 1662 1640\nf 1888 1640 1616\nf 1888 1616 1592\nf 1888 1592 1574\nf 1888 1574 1546\nf 1888 1546 1526\nf 1888 1526 1518\nf 1888 1518 1512\nf 1674 1686 1886\nf 1886 1884 1674\nf 1634 1662 1686\nf 1686 1674 1634\nf 1586 1640 1662\nf 1662 1634 1586\nf 1528 1616 1640\nf 1640 1586 1528\nf 1480 1592 1616\nf 1616 1528 1480\nf 1422 1574 1592\nf 1592 1480 1422\nf 1396 1546 1574\nf 1574 1422 1396\nf 1373 1526 1546\nf 1546 1396 1373\nf 1365 1518 1526\nf 1526 1373 1365\nf 1361 1512 1518\nf 1518 1365 1361\nf 1666 1674 1884\nf 1884 1882 1666\nf 1622 1634 1674\nf 1674 1666 1622\nf 1557 1586 1634\nf 1634 1622 1557\nf 1490 1528 1586\nf 1586 1557 1490\nf 1418 1480 1528\nf 1528 1490 1418\nf 1379 1422 1480\nf 1480 1418 1379\nf 1343 1396 1422\nf 1422 1379 1343\nf 1322 1373 1396\nf 1396 1343 1322\nf 1312 1365 1373\nf 1373 1322 1312\nf 1309 1361 1365\nf 1365 1312 1309\nf 1664 1666 1882\nf 1882 1879 1664\nf 1620 1622 1666\nf 1666 1664 1620\nf 1554 1557 1622\nf 1622 1620 1554\nf 1488 1490 1557\nf 1557 1554 1488\nf 1416 1418 1490\nf 1490 1488 1416\nf 1377 1379 1418\nf 1418 1416 1377\nf 1341 1343 1379\nf 1379 1377 1341\nf 1320 1322 1343\nf 1343 1341 1320\nf 1310 1312 1322\nf 1322 1320 1310\nf 1306 1309 1312\nf 1312 1310 1306\nf 1670 1664 1879\nf 1879 1876 1670\nf 1628 1620 1664\nf 1664 1670 1628\nf 1580 1554 1620\nf 1620 1628 1580\nf 1516 1488 1554\nf 1554 1580 1516\nf 1454 1416 1488\nf 1488 1516 1454\nf 1408 1377 1416\nf 1416 1454 1408\nf 1381 1341 1377\nf 1377 1408 1381\nf 1363 1320 1341\nf 1341 1381 1363\nf 1337 1310 1320\nf 1320 1363 1337\nf 1333 1306 1310\nf 1310 1337 1333\nf 1678 1670 1876\nf 1876 1874 1678\nf 1644 1628 1670\nf 1670 1678 1644\nf 1604 1580 1628\nf 1628 1644 1604\nf 1562 1516 1580\nf 1580 1604 1562\nf 1514 1454 1516\nf 1516 1562 1514\nf 1476 1408 1454\nf 1454 1514 1476\nf 1436 1381 1408\nf 1408 1476 1436\nf 1412 1363 1381\nf 1381 1436 1412\nf 1402 1337 1363\nf 1363 1412 1402\nf 1399 1333 1337\nf 1337 1402 1399\nf 1680 1678 1874\nf 1874 1872 1680\nf 1652 1644 1678\nf 1678 1680 1652\nf 1630 1604 1644\nf 1644 1652 1630\nf 1598 1562 1604\nf 1604 1630 1598\nf 1578 1514 1562\nf 1562 1598 1578\nf 1538 1476 1514\nf 1514 1578 1538\nf 1510 1436 1476\nf 1476 1538 1510\nf 1497 1412 1436\nf 1436 1510 1497\nf 1483 1402 1412\nf 1412 1497 1483\nf 1479 1399 1402\nf 1402 1483 1479\nf 1688 1680 1872\nf 1872 1870 1688\nf 1668 1652 1680\nf 1680 1688 1668\nf 1648 1630 1652\nf 1652 1668 1648\nf 1626 1598 1630\nf 1630 1648 1626\nf 1603 1578 1598\nf 1598 1626 1603\nf 1585 1538 1578\nf 1578 1603 1585\nf 1569 1510 1538\nf 1538 1585 1569\nf 1549 1497 1510\nf 1510 1569 1549\nf 1545 1483 1497\nf 1497 1549 1545\nf 1537 1479 1483\nf 1483 1545 1537\nf 1690 1688 1870\nf 1870 1868 1690\nf 1672 1668 1688\nf 1688 1690 1672\nf 1650 1648 1668\nf 1668 1672 1650\nf 1633 1626 1648\nf 1648 1650 1633\nf 1611 1603 1626\nf 1626 1633 1611\nf 1595 1585 1603\nf 1603 1611 1595\nf 1583 1569 1585\nf 1585 1595 1583\nf 1573 1549 1569\nf 1569 1583 1573\nf 1561 1545 1549\nf 1549 1573 1561\nf 1553 1537 1545\nf 1545 1561 1553\nf 1684 1690 1868\nf 1868 1865 1684\nf 1658 1672 1690\nf 1690 1684 1658\nf 1638 1650 1672\nf 1672 1658 1638\nf 1615 1633 1650\nf 1650 1638 1615\nf 1591 1611 1633\nf 1633 1615 1591\nf 1567 1595 1611\nf 1611 1591 1567\nf 1543 1583 1595\nf 1595 1567 1543\nf 1523 1573 1583\nf 1583 1543 1523\nf 1509 1561 1573\nf 1573 1523 1509\nf 1501 1553 1561\nf 1561 1509 1501\nf 1888 1513 1519\nf 1888 1519 1527\nf 1888 1527 1547\nf 1888 1547 1575\nf 1888 1575 1593\nf 1888 1593 1617\nf 1888 1617 1641\nf 1888 1641 1663\nf 1888 1663 1687\nf 1888 1687 1894\nf 1366 1519 1513\nf 1513 1362 1366\nf 1374 1527 1519\nf 1519 1366 1374\nf 1397 1547 1527\nf 1527 1374 1397\nf 1423 1575 1547\nf 1547 1397 1423\nf 1481 1593 1575\nf 1575 1423 1481\nf 1529 1617 1593\nf 1593 1481 1529\nf 1587 1641 1617\nf 1617 1529 1587\nf 1635 1663 1641\nf 1641 1587 1635\nf 1675 1687 1663\nf 1663 1635 1675\nf 1895 1894 1687\nf 1687 1675 1895\nf 1313 1366 1362\nf 1362 1308 1313\nf 1323 1374 1366\nf 1366 1313 1323\nf 1344 1397 1374\nf 1374 1323 1344\nf 1380 1423 1397\nf 1397 1344 1380\nf 1419 1481 1423\nf 1423 1380 1419\nf 1491 1529 1481\nf 1481 1419 1491\nf 1556 1587 1529\nf 1529 1491 1556\nf 1623 1635 1587\nf 1587 1556 1623\nf 1667 1675 1635\nf 1635 1623 1667\nf 1890 1895 1675\nf 1675 1667 1890\nf 1311 1313 1308\nf 1308 1307 1311\nf 1321 1323 1313\nf 1313 1311 1321\nf 1342 1344 1323\nf 1323 1321 1342\nf 1378 1380 1344\nf 1344 1342 1378\nf 1417 1419 1380\nf 1380 1378 1417\nf 1489 1491 1419\nf 1419 1417 1489\nf 1555 1556 1491\nf 1491 1489 1555\nf 1621 1623 1556\nf 1556 1555 1621\nf 1665 1667 1623\nf 1623 1621 1665\nf 1881 1890 1667\nf 1667 1665 1881\nf 1338 1311 1307\nf 1307 1334 1338\nf 1364 1321 1311\nf 1311 1338 1364\nf 1382 1342 1321\nf 1321 1364 1382\nf 1409 1378 1342\nf 1342 1382 1409\nf 1455 1417 1378\nf 1378 1409 1455\nf 1517 1489 1417\nf 1417 1455 1517\nf 1581 1555 1489\nf 1489 1517 1581\nf 1629 1621 1555\nf 1555 1581 1629\nf 1671 1665 1621\nf 1621 1629 1671\nf 1893 1881 1665\nf 1665 1671 1893\nf 1403 1338 1334\nf 1334 1398 1403\nf 1413 1364 1338\nf 1338 1403 1413\nf 1437 1382 1364\nf 1364 1413 1437\nf 1477 1409 1382\nf 1382 1437 1477\nf 1515 1455 1409\nf 1409 1477 1515\nf 1563 1517 1455\nf 1455 1515 1563\nf 1605 1581 1517\nf 1517 1563 1605\nf 1645 1629 1581\nf 1581 1605 1645\nf 1679 1671 1629\nf 1629 1645 1679\nf 1900 1893 1671\nf 1671 1679 1900\nf 1482 1403 1398\nf 1398 1478 1482\nf 1496 1413 1403\nf 1403 1482 1496\nf 1511 1437 1413\nf 1413 1496 1511\nf 1539 1477 1437\nf 1437 1511 1539\nf 1579 1515 1477\nf 1477 1539 1579\nf 1599 1563 1515\nf 1515 1579 1599\nf 1631 1605 1563\nf 1563 1599 1631\nf 1653 1645 1605\nf 1605 1631 1653\nf 1681 1679 1645\nf 1645 1653 1681\nf 1902 1900 1679\nf 1679 1681 1902\nf 1544 1482 1478\nf 1478 1536 1544\nf 1548 1496 1482\nf 1482 1544 1548\nf 1568 1511 1496\nf 1496 1548 1568\nf 1584 1539 1511\nf 1511 1568 1584\nf 1602 1579 1539\nf 1539 1584 1602\nf 1627 1599 1579\nf 1579 1602 1627\nf 1649 1631 1599\nf 1599 1627 1649\nf 1669 1653 1631\nf 1631 1649 1669\nf 1689 1681 1653\nf 1653 1669 1689\nf 1921 1902 1681\nf 1681 1689 1921\nf 1560 1544 1536\nf 1536 1552 1560\nf 1572 1548 1544\nf 1544 1560 1572\nf 1582 1568 1548\nf 1548 1572 1582\nf 1594 1584 1568\nf 1568 1582 1594\nf 1610 1602 1584\nf 1584 1594 1610\nf 1632 1627 1602\nf 1602 1610 1632\nf 1651 1649 1627\nf 1627 1632 1651\nf 1673 1669 1649\nf 1649 1651 1673\nf 1691 1689 1669\nf 1669 1673 1691\nf 1922 1921 1689\nf 1689 1691 1922\nf 1508 1560 1552\nf 1552 1500 1508\nf 1522 1572 1560\nf 1560 1508 1522\nf 1542 1582 1572\nf 1572 1522 1542\nf 1566 1594 1582\nf 1582 1542 1566\nf 1590 1610 1594\nf 1594 1566 1590\nf 1614 1632 1610\nf 1610 1590 1614\nf 1639 1651 1632\nf 1632 1614 1639\nf 1659 1673 1651\nf 1651 1639 1659\nf 1685 1691 1673\nf 1673 1659 1685\nf 1928 1922 1691\nf 1691 1685 1928\nf 1888 1887 1937\nf 1888 1937 1961\nf 1888 1961 1983\nf 1888 1983 2007\nf 1888 2007 2031\nf 1888 2031 2049\nf 1888 2049 2077\nf 1888 2077 2097\nf 1888 2097 2105\nf 1888 2105 2111\nf 1949 1937 1887\nf 1887 1885 1949\nf 1989 1961 1937\nf 1937 1949 1989\nf 2037 1983 1961\nf 1961 1989 2037\nf 2095 2007 1983\nf 1983 2037 2095\nf 2143 2031 2007\nf 2007 2095 2143\nf 2201 2049 2031\nf 2031 2143 2201\nf 2227 2077 2049\nf 2049 2201 2227\nf 2250 2097 2077\nf 2077 2227 2250\nf 2258 2105 2097\nf 2097 2250 2258\nf 2262 2111 2105\nf 2105 2258 2262\nf 1957 1949 1885\nf 1885 1883 1957\nf 2001 1989 1949\nf 1949 1957 2001\nf 2066 2037 1989\nf 1989 2001 2066\nf 2133 2095 2037\nf 2037 2066 2133\nf 2205 2143 2095\nf 2095 2133 2205\nf 2244 2201 2143\nf 2143 2205 2244\nf 2280 2227 2201\nf 2201 2244 2280\nf 2301 2250 2227\nf 2227 2280 2301\nf 2311 2258 2250\nf 2250 2301 2311\nf 2314 2262 2258\nf 2258 2311 2314\nf 1959 1957 1883\nf 1883 1880 1959\nf 2003 2001 1957\nf 1957 1959 2003\nf 2069 2066 2001\nf 2001 2003 2069\nf 2135 2133 2066\nf 2066 2069 2135\nf 2207 2205 2133\nf 2133 2135 2207\nf 2246 2244 2205\nf 2205 2207 2246\nf 2282 2280 2244\nf 2244 2246 2282\nf 2303 2301 2280\nf 2280 2282 2303\nf 2313 2311 2301\nf 2301 2303 2313\nf 2317 2314 2311\nf 2311 2313 2317\nf 1953 1959 1880\nf 1880 1877 1953\nf 1995 2003 1959\nf 1959 1953 1995\nf 2043 2069 2003\nf 2003 1995 2043\nf 2107 2135 2069\nf 2069 2043 2107\nf 2169 2207 2135\nf 2135 2107 2169\nf 2215 2246 2207\nf 2207 2169 2215\nf 2242 2282 2246\nf 2246 2215 2242\nf 2260 2303 2282\nf 2282 2242 2260\nf 2286 2313 2303\nf 2303 2260 2286\nf 2290 2317 2313\nf 2313 2286 2290\nf 1945 1953 1877\nf 1877 1875 1945\nf 1979 1995 1953\nf 1953 1945 1979\nf 2019 2043 1995\nf 1995 1979 2019\nf 2061 2107 2043\nf 2043 2019 2061\nf 2109 2169 2107\nf 2107 2061 2109\nf 2147 2215 2169\nf 2169 2109 2147\nf 2187 2242 2215\nf 2215 2147 2187\nf 2211 2260 2242\nf 2242 2187 2211\nf 2221 2286 2260\nf 2260 2211 2221\nf 2224 2290 2286\nf 2286 2221 2224\nf 1943 1945 1875\nf 1875 1873 1943\nf 1971 1979 1945\nf 1945 1943 1971\nf 1993 2019 1979\nf 1979 1971 1993\nf 2025 2061 2019\nf 2019 1993 2025\nf 2045 2109 2061\nf 2061 2025 2045\nf 2085 2147 2109\nf 2109 2045 2085\nf 2113 2187 2147\nf 2147 2085 2113\nf 2126 2211 2187\nf 2187 2113 2126\nf 2140 2221 2211\nf 2211 2126 2140\nf 2144 2224 2221\nf 2221 2140 2144\nf 1935 1943 1873\nf 1873 1871 1935\nf 1955 1971 1943\nf 1943 1935 1955\nf 1975 1993 1971\nf 1971 1955 1975\nf 1997 2025 1993\nf 1993 1975 1997\nf 2020 2045 2025\nf 2025 1997 2020\nf 2038 2085 2045\nf 2045 2020 2038\nf 2054 2113 2085\nf 2085 2038 2054\nf 2074 2126 2113\nf 2113 2054 2074\nf 2078 2140 2126\nf 2126 2074 2078\nf 2086 2144 2140\nf 2140 2078 2086\nf 1933 1935 1871\nf 1871 1869 1933\nf 1951 1955 1935\nf 1935 1933 1951\nf 1973 1975 1955\nf 1955 1951 1973\nf 1990 1997 1975\nf 1975 1973 1990\nf 2012 2020 1997\nf 1997 1990 2012\nf 2028 2038 2020\nf 2020 2012 2028\nf 2040 2054 2038\nf 2038 2028 2040\nf 2050 2074 2054\nf 2054 2040 2050\nf 2062 2078 2074\nf 2074 2050 2062\nf 2070 2086 2078\nf 2078 2062 2070\nf 1939 1933 1869\nf 1869 1866 1939\nf 1965 1951 1933\nf 1933 1939 1965\nf 1985 1973 1951\nf 1951 1965 1985\nf 2008 1990 1973\nf 1973 1985 2008\nf 2032 2012 1990\nf 1990 2008 2032\nf 2056 2028 2012\nf 2012 2032 2056\nf 2080 2040 2028\nf 2028 2056 2080\nf 2100 2050 2040\nf 2040 2080 2100\nf 2114 2062 2050\nf 2050 2100 2114\nf 2122 2070 2062\nf 2062 2114 2122\nf 2232 2116 2124\nf 2124 2236 2232\nf 2218 2102 2116\nf 2116 2232 2218\nf 2199 2082 2102\nf 2102 2218 2199\nf 2150 2058 2082\nf 2082 2199 2150\nf 2120 2034 2058\nf 2058 2150 2120\nf 2064 2010 2034\nf 2034 2120 2064\nf 2023 1986 2010\nf 2010 2064 2023\nf 1980 1966 1986\nf 1986 2023 1980\nf 1946 1940 1966\nf 1966 1980 1946\nf 1862 1730 1940\nf 1940 1946 1862\nf 2332 2232 2236\nf 2236 2336 2332\nf 2322 2218 2232\nf 2232 2332 2322\nf 2306 2199 2218\nf 2218 2322 2306\nf 2275 2150 2199\nf 2199 2306 2275\nf 2234 2120 2150\nf 2150 2275 2234\nf 2170 2064 2120\nf 2120 2234 2170\nf 2093 2023 2064\nf 2064 2170 2093\nf 2016 1980 2023\nf 2023 2093 2016\nf 1968 1946 1980\nf 1980 2016 1968\nf 1858 1862 1946\nf 1946 1968 1858\nf 2409 2332 2336\nf 2336 2413 2409\nf 2400 2322 2332\nf 2332 2409 2400\nf 2376 2306 2322\nf 2322 2400 2376\nf 2349 2275 2306\nf 2306 2376 2349\nf 2324 2234 2275\nf 2275 2349 2324\nf 2271 2170 2234\nf 2234 2324 2271\nf 2185 2093 2170\nf 2170 2271 2185\nf 2072 2016 2093\nf 2093 2185 2072\nf 1976 1968 2016\nf 2016 2072 1976\nf 1729 1858 1968\nf 1968 1976 1729\nf 2488 2409 2413\nf 2413 2498 2488\nf 2470 2400 2409\nf 2409 2488 2470\nf 2444 2376 2400\nf 2400 2470 2444\nf 2418 2349 2376\nf 2376 2444 2418\nf 2384 2324 2349\nf 2349 2418 2384\nf 2338 2271 2324\nf 2324 2384 2338\nf 2269 2185 2271\nf 2271 2338 2269\nf 2138 2072 2185\nf 2185 2269 2138\nf 1998 1976 2072\nf 2072 2138 1998\nf 1722 1729 1976\nf 1976 1998 1722\nf 2559 2488 2498\nf 2498 2569 2559\nf 2549 2470 2488\nf 2488 2559 2549\nf 2531 2444 2470\nf 2470 2549 2531\nf 2492 2418 2444\nf 2444 2531 2492\nf 2436 2384 2418\nf 2418 2492 2436\nf 2394 2338 2384\nf 2384 2436 2394\nf 2326 2269 2338\nf 2338 2394 2326\nf 2212 2138 2269\nf 2269 2326 2212\nf 2026 1998 2138\nf 2138 2212 2026\nf 1850 1722 1998\nf 1998 2026 1850\nf 2653 2559 2569\nf 2569 2655 2653\nf 2631 2549 2559\nf 2559 2653 2631\nf 2593 2531 2549\nf 2549 2631 2593\nf 2551 2492 2531\nf 2531 2593 2551\nf 2510 2436 2492\nf 2492 2551 2510\nf 2432 2394 2436\nf 2436 2510 2432\nf 2366 2326 2394\nf 2394 2432 2366\nf 2263 2212 2326\nf 2326 2366 2263\nf 2052 2026 2212\nf 2212 2263 2052\nf 1726 1850 2026\nf 2026 2052 1726\nf 2720 2653 2655\nf 2655 2726 2720\nf 2697 2631 2653\nf 2653 2720 2697\nf 2662 2593 2631\nf 2631 2697 2662\nf 2607 2551 2593\nf 2593 2662 2607\nf 2547 2510 2551\nf 2551 2607 2547\nf 2484 2432 2510\nf 2510 2547 2484\nf 2405 2366 2432\nf 2432 2484 2405\nf 2308 2263 2366\nf 2366 2405 2308\nf 2090 2052 2263\nf 2263 2308 2090\nf 1719 1726 2052\nf 2052 2090 1719\nf 2787 2720 2726\nf 2726 2795 2787\nf 2759 2697 2720\nf 2720 2787 2759\nf 2713 2662 2697\nf 2697 2759 2713\nf 2657 2607 2662\nf 2662 2713 2657\nf 2589 2547 2607\nf 2607 2657 2589\nf 2525 2484 2547\nf 2547 2589 2525\nf 2422 2405 2484\nf 2484 2525 2422\nf 2330 2308 2405\nf 2405 2422 2330\nf 2118 2090 2308\nf 2308 2330 2118\nf 1700 1719 2090\nf 2090 2118 1700\nf 2834 2787 2795\nf 2795 2844 2834\nf 2798 2759 2787\nf 2787 2834 2798\nf 2750 2713 2759\nf 2759 2798 2750\nf 2690 2657 2713\nf 2713 2750 2690\nf 2624 2589 2657\nf 2657 2690 2624\nf 2536 2525 2589\nf 2589 2624 2536\nf 2441 2422 2525\nf 2525 2536 2441\nf 2340 2330 2422\nf 2422 2441 2340\nf 2128 2118 2330\nf 2330 2340 2128\nf 1825 1700 2118\nf 2118 2128 1825\nf 2847 2834 2844\nf 2844 2857 2847\nf 2821 2798 2834\nf 2834 2847 2821\nf 2765 2750 2798\nf 2798 2821 2765\nf 2703 2690 2750\nf 2750 2765 2703\nf 2637 2624 2690\nf 2690 2703 2637\nf 2543 2536 2624\nf 2624 2637 2543\nf 2446 2441 2536\nf 2536 2543 2446\nf 2344 2340 2441\nf 2441 2446 2344\nf 2136 2128 2340\nf 2340 2344 2136\nf 1713 1825 2128\nf 2128 2136 1713\nf 1676 1682 1864\nf 1864 1862 1676\nf 1642 1656 1682\nf 1682 1676 1642\nf 1601 1636 1656\nf 1656 1642 1601\nf 1558 1612 1636\nf 1636 1601 1558\nf 1502 1588 1612\nf 1612 1558 1502\nf 1472 1564 1588\nf 1588 1502 1472\nf 1425 1540 1564\nf 1564 1472 1425\nf 1404 1520 1540\nf 1540 1425 1404\nf 1390 1506 1520\nf 1520 1404 1390\nf 1387 1498 1506\nf 1506 1390 1387\nf 1654 1676 1862\nf 1862 1859 1654\nf 1606 1642 1676\nf 1676 1654 1606\nf 1531 1601 1642\nf 1642 1606 1531\nf 1452 1558 1601\nf 1601 1531 1452\nf 1388 1502 1558\nf 1558 1452 1388\nf 1347 1472 1502\nf 1502 1388 1347\nf 1316 1425 1472\nf 1472 1347 1316\nf 1300 1404 1425\nf 1425 1316 1300\nf 1290 1390 1404\nf 1404 1300 1290\nf 1286 1387 1390\nf 1390 1290 1286\nf 1646 1654 1859\nf 1859 1856 1646\nf 1550 1606 1654\nf 1654 1646 1550\nf 1439 1531 1606\nf 1606 1550 1439\nf 1351 1452 1531\nf 1531 1439 1351\nf 1298 1388 1452\nf 1452 1351 1298\nf 1275 1347 1388\nf 1388 1298 1275\nf 1246 1316 1347\nf 1347 1275 1246\nf 1222 1300 1316\nf 1316 1246 1222\nf 1215 1290 1300\nf 1300 1222 1215\nf 1211 1286 1290\nf 1290 1215 1211\nf 1624 1646 1856\nf 1856 1854 1624\nf 1484 1550 1646\nf 1646 1624 1484\nf 1353 1439 1550\nf 1550 1484 1353\nf 1284 1351 1439\nf 1439 1353 1284\nf 1238 1298 1351\nf 1351 1284 1238\nf 1204 1275 1298\nf 1298 1238 1204\nf 1178 1246 1275\nf 1275 1204 1178\nf 1152 1222 1246\nf 1246 1178 1152\nf 1134 1215 1222\nf 1222 1152 1134\nf 1124 1211 1215\nf 1215 1134 1124\nf 1596 1624 1854\nf 1854 1851 1596\nf 1410 1484 1624\nf 1624 1596 1410\nf 1296 1353 1484\nf 1484 1410 1296\nf 1228 1284 1353\nf 1353 1296 1228\nf 1186 1238 1284\nf 1284 1228 1186\nf 1130 1204 1238\nf 1238 1186 1130\nf 1091 1178 1204\nf 1204 1130 1091\nf 1073 1152 1178\nf 1178 1091 1073\nf 1063 1134 1152\nf 1152 1073 1063\nf 1053 1124 1134\nf 1134 1063 1053\nf 1570 1596 1851\nf 1851 1848 1570\nf 1359 1410 1596\nf 1596 1570 1359\nf 1256 1296 1410\nf 1410 1359 1256\nf 1190 1228 1296\nf 1296 1256 1190\nf 1112 1186 1228\nf 1228 1190 1112\nf 1071 1130 1186\nf 1186 1112 1071\nf 1029 1091 1130\nf 1130 1071 1029\nf 991 1073 1091\nf 1091 1029 991\nf 969 1063 1073\nf 1073 991 969\nf 967 1053 1063\nf 1063 969 967\nf 1532 1570 1848\nf 1848 1846 1532\nf 1314 1359 1570\nf 1570 1532 1314\nf 1219 1256 1359\nf 1359 1314 1219\nf 1138 1190 1256\nf 1256 1219 1138\nf 1075 1112 1190\nf 1190 1138 1075\nf 1015 1071 1112\nf 1112 1075 1015\nf 962 1029 1071\nf 1071 1015 962\nf 925 991 1029\nf 1029 962 925\nf 904 969 991\nf 991 925 904\nf 898 967 969\nf 969 904 898\nf 1504 1532 1846\nf 1846 1832 1504\nf 1292 1314 1532\nf 1532 1504 1292\nf 1200 1219 1314\nf 1314 1292 1200\nf 1097 1138 1219\nf 1219 1200 1097\nf 1033 1075 1138\nf 1138 1097 1033\nf 965 1015 1075\nf 1075 1033 965\nf 909 962 1015\nf 1015 965 909\nf 863 925 962\nf 962 909 863\nf 835 904 925\nf 925 863 835\nf 827 898 904\nf 904 835 827\nf 1494 1504 1832\nf 1832 1824 1494\nf 1282 1292 1504\nf 1504 1494 1282\nf 1183 1200 1292\nf 1292 1282 1183\nf 1088 1097 1200\nf 1200 1183 1088\nf 1000 1033 1097\nf 1097 1088 1000\nf 934 965 1033\nf 1033 1000 934\nf 874 909 965\nf 965 934 874\nf 826 863 909\nf 909 874 826\nf 790 835 863\nf 863 826 790\nf 780 827 835\nf 835 790 780\nf 1486 1494 1824\nf 1824 1814 1486\nf 1278 1282 1494\nf 1494 1486 1278\nf 1176 1183 1282\nf 1282 1278 1176\nf 1079 1088 1183\nf 1183 1176 1079\nf 985 1000 1088\nf 1088 1079 985\nf 919 934 1000\nf 1000 985 919\nf 857 874 934\nf 934 919 857\nf 801 826 874\nf 874 857 801\nf 775 790 826\nf 826 801 775\nf 765 780 790\nf 790 775 765\nf 1391 1507 1499\nf 1499 1387 1391\nf 1405 1521 1507\nf 1507 1391 1405\nf 1424 1541 1521\nf 1521 1405 1424\nf 1473 1565 1541\nf 1541 1424 1473\nf 1503 1589 1565\nf 1565 1473 1503\nf 1559 1613 1589\nf 1589 1503 1559\nf 1600 1637 1613\nf 1613 1559 1600\nf 1643 1657 1637\nf 1637 1600 1643\nf 1677 1683 1657\nf 1657 1643 1677\nf 1863 1892 1683\nf 1683 1677 1863\nf 1291 1391 1387\nf 1387 1287 1291\nf 1301 1405 1391\nf 1391 1291 1301\nf 1317 1424 1405\nf 1405 1301 1317\nf 1348 1473 1424\nf 1424 1317 1348\nf 1389 1503 1473\nf 1473 1348 1389\nf 1453 1559 1503\nf 1503 1389 1453\nf 1530 1600 1559\nf 1559 1453 1530\nf 1607 1643 1600\nf 1600 1530 1607\nf 1655 1677 1643\nf 1643 1607 1655\nf 1861 1863 1677\nf 1677 1655 1861\nf 1214 1291 1287\nf 1287 1210 1214\nf 1223 1301 1291\nf 1291 1214 1223\nf 1247 1317 1301\nf 1301 1223 1247\nf 1274 1348 1317\nf 1317 1247 1274\nf 1299 1389 1348\nf 1348 1274 1299\nf 1352 1453 1389\nf 1389 1299 1352\nf 1438 1530 1453\nf 1453 1352 1438\nf 1551 1607 1530\nf 1530 1438 1551\nf 1647 1655 1607\nf 1607 1551 1647\nf 1891 1861 1655\nf 1655 1647 1891\nf 1135 1214 1210\nf 1210 1125 1135\nf 1153 1223 1214\nf 1214 1135 1153\nf 1179 1247 1223\nf 1223 1153 1179\nf 1205 1274 1247\nf 1247 1179 1205\nf 1239 1299 1274\nf 1274 1205 1239\nf 1285 1352 1299\nf 1299 1239 1285\nf 1354 1438 1352\nf 1352 1285 1354\nf 1485 1551 1438\nf 1438 1354 1485\nf 1625 1647 1551\nf 1551 1485 1625\nf 1901 1891 1647\nf 1647 1625 1901\nf 1064 1135 1125\nf 1125 1054 1064\nf 1074 1153 1135\nf 1135 1064 1074\nf 1092 1179 1153\nf 1153 1074 1092\nf 1131 1205 1179\nf 1179 1092 1131\nf 1187 1239 1205\nf 1205 1131 1187\nf 1229 1285 1239\nf 1239 1187 1229\nf 1297 1354 1285\nf 1285 1229 1297\nf 1411 1485 1354\nf 1354 1297 1411\nf 1597 1625 1485\nf 1485 1411 1597\nf 1853 1901 1625\nf 1625 1597 1853\nf 970 1064 1054\nf 1054 968 970\nf 992 1074 1064\nf 1064 970 992\nf 1030 1092 1074\nf 1074 992 1030\nf 1072 1131 1092\nf 1092 1030 1072\nf 1113 1187 1131\nf 1131 1072 1113\nf 1191 1229 1187\nf 1187 1113 1191\nf 1257 1297 1229\nf 1229 1191 1257\nf 1360 1411 1297\nf 1297 1257 1360\nf 1571 1597 1411\nf 1411 1360 1571\nf 1899 1853 1597\nf 1597 1571 1899\nf 903 970 968\nf 968 897 903\nf 926 992 970\nf 970 903 926\nf 961 1030 992\nf 992 926 961\nf 1016 1072 1030\nf 1030 961 1016\nf 1076 1113 1072\nf 1072 1016 1076\nf 1139 1191 1113\nf 1113 1076 1139\nf 1218 1257 1191\nf 1191 1139 1218\nf 1315 1360 1257\nf 1257 1218 1315\nf 1533 1571 1360\nf 1360 1315 1533\nf 1920 1899 1571\nf 1571 1533 1920\nf 836 903 897\nf 897 828 836\nf 864 926 903\nf 903 836 864\nf 910 961 926\nf 926 864 910\nf 966 1016 961\nf 961 910 966\nf 1034 1076 1016\nf 1016 966 1034\nf 1098 1139 1076\nf 1076 1034 1098\nf 1201 1218 1139\nf 1139 1098 1201\nf 1293 1315 1218\nf 1218 1201 1293\nf 1505 1533 1315\nf 1315 1293 1505\nf 1924 1920 1533\nf 1533 1505 1924\nf 789 836 828\nf 828 779 789\nf 825 864 836\nf 836 789 825\nf 873 910 864\nf 864 825 873\nf 933 966 910\nf 910 873 933\nf 999 1034 966\nf 966 933 999\nf 1087 1098 1034\nf 1034 999 1087\nf 1182 1201 1098\nf 1098 1087 1182\nf 1283 1293 1201\nf 1201 1182 1283\nf 1495 1505 1293\nf 1293 1283 1495\nf 1826 1924 1505\nf 1505 1495 1826\nf 776 789 779\nf 779 766 776\nf 802 825 789\nf 789 776 802\nf 858 873 825\nf 825 802 858\nf 920 933 873\nf 873 858 920\nf 986 999 933\nf 933 920 986\nf 1080 1087 999\nf 999 986 1080\nf 1177 1182 1087\nf 1087 1080 1177\nf 1279 1283 1182\nf 1182 1177 1279\nf 1487 1495 1283\nf 1283 1279 1487\nf 1914 1826 1495\nf 1495 1487 1914\nf 1947 1941 1867\nf 1867 1863 1947\nf 1981 1967 1941\nf 1941 1947 1981\nf 2022 1987 1967\nf 1967 1981 2022\nf 2065 2011 1987\nf 1987 2022 2065\nf 2121 2035 2011\nf 2011 2065 2121\nf 2151 2059 2035\nf 2035 2121 2151\nf 2198 2083 2059\nf 2059 2151 2198\nf 2219 2103 2083\nf 2083 2198 2219\nf 2233 2117 2103\nf 2103 2219 2233\nf 2236 2125 2117\nf 2117 2233 2236\nf 1969 1947 1863\nf 1863 1860 1969\nf 2017 1981 1947\nf 1947 1969 2017\nf 2092 2022 1981\nf 1981 2017 2092\nf 2171 2065 2022\nf 2022 2092 2171\nf 2235 2121 2065\nf 2065 2171 2235\nf 2276 2151 2121\nf 2121 2235 2276\nf 2307 2198 2151\nf 2151 2276 2307\nf 2323 2219 2198\nf 2198 2307 2323\nf 2333 2233 2219\nf 2219 2323 2333\nf 2337 2236 2233\nf 2233 2333 2337\nf 1977 1969 1860\nf 1860 1857 1977\nf 2073 2017 1969\nf 1969 1977 2073\nf 2184 2092 2017\nf 2017 2073 2184\nf 2272 2171 2092\nf 2092 2184 2272\nf 2325 2235 2171\nf 2171 2272 2325\nf 2348 2276 2235\nf 2235 2325 2348\nf 2377 2307 2276\nf 2276 2348 2377\nf 2401 2323 2307\nf 2307 2377 2401\nf 2408 2333 2323\nf 2323 2401 2408\nf 2412 2337 2333\nf 2333 2408 2412\nf 1999 1977 1857\nf 1857 1855 1999\nf 2139 2073 1977\nf 1977 1999 2139\nf 2270 2184 2073\nf 2073 2139 2270\nf 2339 2272 2184\nf 2184 2270 2339\nf 2385 2325 2272\nf 2272 2339 2385\nf 2419 2348 2325\nf 2325 2385 2419\nf 2445 2377 2348\nf 2348 2419 2445\nf 2471 2401 2377\nf 2377 2445 2471\nf 2489 2408 2401\nf 2401 2471 2489\nf 2499 2412 2408\nf 2408 2489 2499\nf 2027 1999 1855\nf 1855 1852 2027\nf 2213 2139 1999\nf 1999 2027 2213\nf 2327 2270 2139\nf 2139 2213 2327\nf 2395 2339 2270\nf 2270 2327 2395\nf 2437 2385 2339\nf 2339 2395 2437\nf 2493 2419 2385\nf 2385 2437 2493\nf 2532 2445 2419\nf 2419 2493 2532\nf 2550 2471 2445\nf 2445 2532 2550\nf 2560 2489 2471\nf 2471 2550 2560\nf 2570 2499 2489\nf 2489 2560 2570\nf 2053 2027 1852\nf 1852 1849 2053\nf 2264 2213 2027\nf 2027 2053 2264\nf 2367 2327 2213\nf 2213 2264 2367\nf 2433 2395 2327\nf 2327 2367 2433\nf 2511 2437 2395\nf 2395 2433 2511\nf 2552 2493 2437\nf 2437 2511 2552\nf 2594 2532 2493\nf 2493 2552 2594\nf 2632 2550 2532\nf 2532 2594 2632\nf 2654 2560 2550\nf 2550 2632 2654\nf 2656 2570 2560\nf 2560 2654 2656\nf 2091 2053 1849\nf 1849 1847 2091\nf 2309 2264 2053\nf 2053 2091 2309\nf 2404 2367 2264\nf 2264 2309 2404\nf 2485 2433 2367\nf 2367 2404 2485\nf 2548 2511 2433\nf 2433 2485 2548\nf 2608 2552 2511\nf 2511 2548 2608\nf 2661 2594 2552\nf 2552 2608 2661\nf 2698 2632 2594\nf 2594 2661 2698\nf 2719 2654 2632\nf 2632 2698 2719\nf 2725 2656 2654\nf 2654 2719 2725\nf 2119 2091 1847\nf 1847 1833 2119\nf 2331 2309 2091\nf 2091 2119 2331\nf 2423 2404 2309\nf 2309 2331 2423\nf 2526 2485 2404\nf 2404 2423 2526\nf 2590 2548 2485\nf 2485 2526 2590\nf 2658 2608 2548\nf 2548 2590 2658\nf 2714 2661 2608\nf 2608 2658 2714\nf 2760 2698 2661\nf 2661 2714 2760\nf 2788 2719 2698\nf 2698 2760 2788\nf 2796 2725 2719\nf 2719 2788 2796\nf 2129 2119 1833\nf 1833 1827 2129\nf 2341 2331 2119\nf 2119 2129 2341\nf 2440 2423 2331\nf 2331 2341 2440\nf 2535 2526 2423\nf 2423 2440 2535\nf 2623 2590 2526\nf 2526 2535 2623\nf 2689 2658 2590\nf 2590 2623 2689\nf 2749 2714 2658\nf 2658 2689 2749\nf 2797 2760 2714\nf 2714 2749 2797\nf 2833 2788 2760\nf 2760 2797 2833\nf 2843 2796 2788\nf 2788 2833 2843\nf 2137 2129 1827\nf 1827 1815 2137\nf 2345 2341 2129\nf 2129 2137 2345\nf 2447 2440 2341\nf 2341 2345 2447\nf 2544 2535 2440\nf 2440 2447 2544\nf 2638 2623 2535\nf 2535 2544 2638\nf 2704 2689 2623\nf 2623 2638 2704\nf 2766 2749 2689\nf 2689 2704 2766\nf 2822 2797 2749\nf 2749 2766 2822\nf 2848 2833 2797\nf 2797 2822 2848\nf 2858 2843 2833\nf 2833 2848 2858\nf 1735 2334 2329\nf 1735 2329 2321\nf 1735 2321 2305\nf 1735 2305 2274\nf 1735 2274 2231\nf 1735 2231 2167\nf 1735 2167 2089\nf 1735 2089 2014\nf 1735 2014 1962\nf 1735 1962 1733\nf 2515 2329 2334\nf 2334 2524 2515\nf 2495 2321 2329\nf 2329 2515 2495\nf 2456 2305 2321\nf 2321 2495 2456\nf 2429 2274 2305\nf 2305 2456 2429\nf 2399 2231 2274\nf 2274 2429 2399\nf 2347 2167 2231\nf 2231 2399 2347\nf 2292 2089 2167\nf 2167 2347 2292\nf 2148 2014 2089\nf 2089 2292 2148\nf 2004 1962 2014\nf 2014 2148 2004\nf 1739 1733 1962\nf 1962 2004 1739\nf 2647 2515 2524\nf 2524 2649 2647\nf 2621 2495 2515\nf 2515 2647 2621\nf 2584 2456 2495\nf 2495 2621 2584\nf 2541 2429 2456\nf 2456 2584 2541\nf 2502 2399 2429\nf 2429 2541 2502\nf 2426 2347 2399\nf 2399 2502 2426\nf 2352 2292 2347\nf 2347 2426 2352\nf 2255 2148 2292\nf 2292 2352 2255\nf 2046 2004 2148\nf 2148 2255 2046\nf 1702 1739 2004\nf 2004 2046 1702\nf 2746 2647 2649\nf 2649 2757 2746\nf 2721 2621 2647\nf 2647 2746 2721\nf 2681 2584 2621\nf 2621 2721 2681\nf 2639 2541 2584\nf 2584 2681 2639\nf 2557 2502 2541\nf 2541 2639 2557\nf 2505 2426 2502\nf 2502 2557 2505\nf 2415 2352 2426\nf 2426 2505 2415\nf 2318 2255 2352\nf 2352 2415 2318\nf 2098 2046 2255\nf 2255 2318 2098\nf 1745 1702 2046\nf 2046 2098 1745\nf 2840 2746 2757\nf 2757 2849 2840\nf 2808 2721 2746\nf 2746 2840 2808\nf 2756 2681 2721\nf 2721 2808 2756\nf 2696 2639 2681\nf 2681 2756 2696\nf 2626 2557 2639\nf 2639 2696 2626\nf 2538 2505 2557\nf 2557 2626 2538\nf 2443 2415 2505\nf 2505 2538 2443\nf 2342 2318 2415\nf 2415 2443 2342\nf 2131 2098 2318\nf 2318 2342 2131\nf 1904 1745 2098\nf 2098 2131 1904\nf 2906 2840 2849\nf 2849 2925 2906\nf 2867 2808 2840\nf 2840 2906 2867\nf 2818 2756 2808\nf 2808 2867 2818\nf 2736 2696 2756\nf 2756 2818 2736\nf 2667 2626 2696\nf 2696 2736 2667\nf 2565 2538 2626\nf 2626 2667 2565\nf 2475 2443 2538\nf 2538 2565 2475\nf 2356 2342 2443\nf 2443 2475 2356\nf 2156 2131 2342\nf 2342 2356 2156\nf 1704 1904 2131\nf 2131 2156 1704\nf 2976 2906 2925\nf 2925 2987 2976\nf 2914 2867 2906\nf 2906 2976 2914\nf 2852 2818 2867\nf 2867 2914 2852\nf 2772 2736 2818\nf 2818 2852 2772\nf 2688 2667 2736\nf 2736 2772 2688\nf 2592 2565 2667\nf 2667 2688 2592\nf 2497 2475 2565\nf 2565 2592 2497\nf 2372 2356 2475\nf 2475 2497 2372\nf 2176 2156 2356\nf 2356 2372 2176\nf 1752 1704 2156\nf 2156 2176 1752\nf 2993 2976 2987\nf 2987 3011 2993\nf 2952 2914 2976\nf 2976 2993 2952\nf 2874 2852 2914\nf 2914 2952 2874\nf 2794 2772 2852\nf 2852 2874 2794\nf 2702 2688 2772\nf 2772 2794 2702\nf 2604 2592 2688\nf 2688 2702 2604\nf 2509 2497 2592\nf 2592 2604 2509\nf 2380 2372 2497\nf 2497 2509 2380\nf 2182 2176 2372\nf 2372 2380 2182\nf 1723 1752 2176\nf 2176 2182 1723\nf 3000 2993 3011\nf 3011 3020 3000\nf 2967 2952 2993\nf 2993 3000 2967\nf 2879 2874 2952\nf 2952 2967 2879\nf 2799 2794 2874\nf 2874 2879 2799\nf 2707 2702 2794\nf 2794 2799 2707\nf 2605 2604 2702\nf 2702 2707 2605\nf 2512 2509 2604\nf 2604 2605 2512\nf 2382 2380 2509\nf 2509 2512 2382\nf 2188 2182 2380\nf 2380 2382 2188\nf 1699 1723 2182\nf 2182 2188 1699\nf 3006 3000 3020\nf 3020 3022 3006\nf 2972 2967 3000\nf 3000 3006 2972\nf 2888 2879 2967\nf 2967 2972 2888\nf 2804 2799 2879\nf 2879 2888 2804\nf 2710 2707 2799\nf 2799 2804 2710\nf 2613 2605 2707\nf 2707 2710 2613\nf 2520 2512 2605\nf 2605 2613 2520\nf 2388 2382 2512\nf 2512 2520 2388\nf 2192 2188 2382\nf 2382 2388 2192\nf 1760 1699 2188\nf 2188 2192 1760\nf 1735 1737 1660\nf 1735 1660 1608\nf 1735 1608 1535\nf 1735 1535 1457\nf 1735 1457 1393\nf 1735 1393 1350\nf 1735 1350 1319\nf 1735 1319 1303\nf 1735 1303 1295\nf 1735 1295 1288\nf 1618 1660 1737\nf 1737 1739 1618\nf 1474 1608 1660\nf 1660 1618 1474\nf 1332 1535 1608\nf 1608 1474 1332\nf 1277 1457 1535\nf 1535 1332 1277\nf 1225 1393 1457\nf 1457 1277 1225\nf 1195 1350 1393\nf 1393 1225 1195\nf 1166 1319 1350\nf 1350 1195 1166\nf 1129 1303 1319\nf 1319 1166 1129\nf 1109 1295 1303\nf 1303 1129 1109\nf 1099 1288 1295\nf 1295 1109 1099\nf 1576 1618 1739\nf 1739 1741 1576\nf 1367 1474 1618\nf 1618 1576 1367\nf 1270 1332 1474\nf 1474 1367 1270\nf 1196 1277 1332\nf 1332 1270 1196\nf 1120 1225 1277\nf 1277 1196 1120\nf 1081 1195 1225\nf 1225 1120 1081\nf 1040 1166 1195\nf 1195 1081 1040\nf 1001 1129 1166\nf 1166 1040 1001\nf 975 1109 1129\nf 1129 1001 975\nf 973 1099 1109\nf 1109 975 973\nf 1524 1576 1741\nf 1741 1744 1524\nf 1304 1367 1576\nf 1576 1524 1304\nf 1209 1270 1367\nf 1367 1304 1209\nf 1119 1196 1270\nf 1270 1209 1119\nf 1065 1120 1196\nf 1196 1119 1065\nf 983 1081 1120\nf 1120 1065 983\nf 941 1040 1081\nf 1081 983 941\nf 901 1001 1040\nf 1040 941 901\nf 878 975 1001\nf 1001 901 878\nf 865 973 975\nf 975 878 865\nf 1493 1524 1744\nf 1744 1747 1493\nf 1280 1304 1524\nf 1524 1493 1280\nf 1181 1209 1304\nf 1304 1280 1181\nf 1086 1119 1209\nf 1209 1181 1086\nf 998 1065 1119\nf 1119 1086 998\nf 928 983 1065\nf 1065 998 928\nf 868 941 983\nf 983 928 868\nf 816 901 941\nf 941 868 816\nf 784 878 901\nf 901 816 784\nf 773 865 878\nf 878 784 773\nf 1466 1493 1747\nf 1747 1749 1466\nf 1266 1280 1493\nf 1493 1466 1266\nf 1149 1181 1280\nf 1280 1266 1149\nf 1057 1086 1181\nf 1181 1149 1057\nf 955 998 1086\nf 1086 1057 955\nf 888 928 998\nf 998 955 888\nf 806 868 928\nf 928 888 806\nf 755 816 868\nf 868 806 755\nf 718 784 816\nf 816 755 718\nf 697 773 784\nf 784 718 697\nf 1446 1466 1749\nf 1749 1753 1446\nf 1250 1266 1466\nf 1466 1446 1250\nf 1127 1149 1266\nf 1266 1250 1127\nf 1032 1057 1149\nf 1149 1127 1032\nf 936 955 1057\nf 1057 1032 936\nf 852 888 955\nf 955 936 852\nf 772 806 888\nf 888 852 772\nf 710 755 806\nf 806 772 710\nf 648 718 755\nf 755 710 648\nf 637 697 718\nf 718 648 637\nf 1440 1446 1753\nf 1753 1755 1440\nf 1242 1250 1446\nf 1446 1440 1242\nf 1115 1127 1250\nf 1250 1242 1115\nf 1020 1032 1127\nf 1127 1115 1020\nf 922 936 1032\nf 1032 1020 922\nf 830 852 936\nf 936 922 830\nf 750 772 852\nf 852 830 750\nf 672 710 772\nf 772 750 672\nf 631 648 710\nf 710 672 631\nf 613 637 648\nf 648 631 613\nf 1434 1440 1755\nf 1755 1757 1434\nf 1240 1242 1440\nf 1440 1434 1240\nf 1110 1115 1242\nf 1242 1240 1110\nf 1017 1020 1115\nf 1115 1110 1017\nf 915 922 1020\nf 1020 1017 915\nf 823 830 922\nf 922 915 823\nf 743 750 830\nf 830 823 743\nf 655 672 750\nf 750 743 655\nf 622 631 672\nf 672 655 622\nf 602 613 631\nf 631 622 602\nf 1428 1434 1757\nf 1757 1760 1428\nf 1232 1240 1434\nf 1434 1428 1232\nf 1105 1110 1240\nf 1240 1232 1105\nf 1010 1017 1110\nf 1110 1105 1010\nf 913 915 1017\nf 1017 1010 913\nf 821 823 915\nf 915 913 821\nf 736 743 823\nf 823 821 736\nf 652 655 743\nf 743 736 652\nf 619 622 655\nf 655 652 619\nf 601 602 622\nf 622 619 601\nf 1735 1289 1294\nf 1735 1294 1302\nf 1735 1302 1318\nf 1735 1318 1349\nf 1735 1349 1392\nf 1735 1392 1456\nf 1735 1456 1534\nf 1735 1534 1609\nf 1735 1609 1661\nf 1735 1661 1889\nf 1108 1294 1289\nf 1289 1099 1108\nf 1128 1302 1294\nf 1294 1108 1128\nf 1167 1318 1302\nf 1302 1128 1167\nf 1194 1349 1318\nf 1318 1167 1194\nf 1224 1392 1349\nf 1349 1194 1224\nf 1276 1456 1392\nf 1392 1224 1276\nf 1331 1534 1456\nf 1456 1276 1331\nf 1475 1609 1534\nf 1534 1331 1475\nf 1619 1661 1609\nf 1609 1475 1619\nf 1738 1889 1661\nf 1661 1619 1738\nf 976 1108 1099\nf 1099 974 976\nf 1002 1128 1108\nf 1108 976 1002\nf 1039 1167 1128\nf 1128 1002 1039\nf 1082 1194 1167\nf 1167 1039 1082\nf 1121 1224 1194\nf 1194 1082 1121\nf 1197 1276 1224\nf 1224 1121 1197\nf 1271 1331 1276\nf 1276 1197 1271\nf 1368 1475 1331\nf 1331 1271 1368\nf 1577 1619 1475\nf 1475 1368 1577\nf 1903 1738 1619\nf 1619 1577 1903\nf 877 976 974\nf 974 866 877\nf 902 1002 976\nf 976 877 902\nf 942 1039 1002\nf 1002 902 942\nf 984 1082 1039\nf 1039 942 984\nf 1066 1121 1082\nf 1082 984 1066\nf 1118 1197 1121\nf 1121 1066 1118\nf 1208 1271 1197\nf 1197 1118 1208\nf 1305 1368 1271\nf 1271 1208 1305\nf 1525 1577 1368\nf 1368 1305 1525\nf 1742 1903 1577\nf 1577 1525 1742\nf 783 877 866\nf 866 774 783\nf 815 902 877\nf 877 783 815\nf 867 942 902\nf 902 815 867\nf 927 984 942\nf 942 867 927\nf 997 1066 984\nf 984 927 997\nf 1085 1118 1066\nf 1066 997 1085\nf 1180 1208 1118\nf 1118 1085 1180\nf 1281 1305 1208\nf 1208 1180 1281\nf 1492 1525 1305\nf 1305 1281 1492\nf 1703 1742 1525\nf 1525 1492 1703\nf 717 783 774\nf 774 698 717\nf 756 815 783\nf 783 717 756\nf 805 867 815\nf 815 756 805\nf 887 927 867\nf 867 805 887\nf 956 997 927\nf 927 887 956\nf 1058 1085 997\nf 997 956 1058\nf 1148 1180 1085\nf 1085 1058 1148\nf 1267 1281 1180\nf 1180 1148 1267\nf 1467 1492 1281\nf 1281 1267 1467\nf 1905 1703 1492\nf 1492 1467 1905\nf 647 717 698\nf 698 636 647\nf 709 756 717\nf 717 647 709\nf 771 805 756\nf 756 709 771\nf 851 887 805\nf 805 771 851\nf 935 956 887\nf 887 851 935\nf 1031 1058 956\nf 956 935 1031\nf 1126 1148 1058\nf 1058 1031 1126\nf 1251 1267 1148\nf 1148 1126 1251\nf 1447 1467 1267\nf 1267 1251 1447\nf 1751 1905 1467\nf 1467 1447 1751\nf 630 647 636\nf 636 612 630\nf 671 709 647\nf 647 630 671\nf 749 771 709\nf 709 671 749\nf 829 851 771\nf 771 749 829\nf 921 935 851\nf 851 829 921\nf 1019 1031 935\nf 935 921 1019\nf 1114 1126 1031\nf 1031 1019 1114\nf 1243 1251 1126\nf 1126 1114 1243\nf 1441 1447 1251\nf 1251 1243 1441\nf 1896 1751 1447\nf 1447 1441 1896\nf 623 630 612\nf 612 603 623\nf 656 671 630\nf 630 623 656\nf 744 749 671\nf 671 656 744\nf 824 829 749\nf 749 744 824\nf 916 921 829\nf 829 824 916\nf 1018 1019 921\nf 921 916 1018\nf 1111 1114 1019\nf 1019 1018 1111\nf 1241 1243 1114\nf 1114 1111 1241\nf 1435 1441 1243\nf 1243 1241 1435\nf 1923 1896 1441\nf 1441 1435 1923\nf 617 623 603\nf 603 601 617\nf 650 656 623\nf 623 617 650\nf 734 744 656\nf 656 650 734\nf 818 824 744\nf 744 734 818\nf 912 916 824\nf 824 818 912\nf 1009 1018 916\nf 916 912 1009\nf 1102 1111 1018\nf 1018 1009 1102\nf 1235 1241 1111\nf 1111 1102 1235\nf 1431 1435 1241\nf 1241 1235 1431\nf 1759 1923 1435\nf 1435 1431 1759\nf 1735 1736 1963\nf 1735 1963 2015\nf 1735 2015 2088\nf 1735 2088 2166\nf 1735 2166 2230\nf 1735 2230 2273\nf 1735 2273 2304\nf 1735 2304 2320\nf 1735 2320 2328\nf 1735 2328 2335\nf 2005 1963 1736\nf 1736 1738 2005\nf 2149 2015 1963\nf 1963 2005 2149\nf 2291 2088 2015\nf 2015 2149 2291\nf 2346 2166 2088\nf 2088 2291 2346\nf 2398 2230 2166\nf 2166 2346 2398\nf 2428 2273 2230\nf 2230 2398 2428\nf 2457 2304 2273\nf 2273 2428 2457\nf 2494 2320 2304\nf 2304 2457 2494\nf 2514 2328 2320\nf 2320 2494 2514\nf 2524 2335 2328\nf 2328 2514 2524\nf 2047 2005 1738\nf 1738 1740 2047\nf 2256 2149 2005\nf 2005 2047 2256\nf 2353 2291 2149\nf 2149 2256 2353\nf 2427 2346 2291\nf 2291 2353 2427\nf 2503 2398 2346\nf 2346 2427 2503\nf 2542 2428 2398\nf 2398 2503 2542\nf 2583 2457 2428\nf 2428 2542 2583\nf 2622 2494 2457\nf 2457 2583 2622\nf 2648 2514 2494\nf 2494 2622 2648\nf 2650 2524 2514\nf 2514 2648 2650\nf 2099 2047 1740\nf 1740 1743 2099\nf 2319 2256 2047\nf 2047 2099 2319\nf 2414 2353 2256\nf 2256 2319 2414\nf 2504 2427 2353\nf 2353 2414 2504\nf 2558 2503 2427\nf 2427 2504 2558\nf 2640 2542 2503\nf 2503 2558 2640\nf 2682 2583 2542\nf 2542 2640 2682\nf 2722 2622 2583\nf 2583 2682 2722\nf 2745 2648 2622\nf 2622 2722 2745\nf 2758 2650 2648\nf 2648 2745 2758\nf 2130 2099 1743\nf 1743 1746 2130\nf 2343 2319 2099\nf 2099 2130 2343\nf 2442 2414 2319\nf 2319 2343 2442\nf 2537 2504 2414\nf 2414 2442 2537\nf 2625 2558 2504\nf 2504 2537 2625\nf 2695 2640 2558\nf 2558 2625 2695\nf 2755 2682 2640\nf 2640 2695 2755\nf 2807 2722 2682\nf 2682 2755 2807\nf 2839 2745 2722\nf 2722 2807 2839\nf 2850 2758 2745\nf 2745 2839 2850\nf 2157 2130 1746\nf 1746 1748 2157\nf 2357 2343 2130\nf 2130 2157 2357\nf 2474 2442 2343\nf 2343 2357 2474\nf 2566 2537 2442\nf 2442 2474 2566\nf 2668 2625 2537\nf 2537 2566 2668\nf 2735 2695 2625\nf 2625 2668 2735\nf 2817 2755 2695\nf 2695 2735 2817\nf 2868 2807 2755\nf 2755 2817 2868\nf 2905 2839 2807\nf 2807 2868 2905\nf 2926 2850 2839\nf 2839 2905 2926\nf 2177 2157 1748\nf 1748 1750 2177\nf 2373 2357 2157\nf 2157 2177 2373\nf 2496 2474 2357\nf 2357 2373 2496\nf 2591 2566 2474\nf 2474 2496 2591\nf 2687 2668 2566\nf 2566 2591 2687\nf 2771 2735 2668\nf 2668 2687 2771\nf 2851 2817 2735\nf 2735 2771 2851\nf 2913 2868 2817\nf 2817 2851 2913\nf 2975 2905 2868\nf 2868 2913 2975\nf 2986 2926 2905\nf 2905 2975 2986\nf 2183 2177 1750\nf 1750 1754 2183\nf 2381 2373 2177\nf 2177 2183 2381\nf 2508 2496 2373\nf 2373 2381 2508\nf 2603 2591 2496\nf 2496 2508 2603\nf 2701 2687 2591\nf 2591 2603 2701\nf 2793 2771 2687\nf 2687 2701 2793\nf 2873 2851 2771\nf 2771 2793 2873\nf 2951 2913 2851\nf 2851 2873 2951\nf 2992 2975 2913\nf 2913 2951 2992\nf 3010 2986 2975\nf 2975 2992 3010\nf 2189 2183 1754\nf 1754 1756 2189\nf 2383 2381 2183\nf 2183 2189 2383\nf 2513 2508 2381\nf 2381 2383 2513\nf 2606 2603 2508\nf 2508 2513 2606\nf 2708 2701 2603\nf 2603 2606 2708\nf 2800 2793 2701\nf 2701 2708 2800\nf 2880 2873 2793\nf 2793 2800 2880\nf 2968 2951 2873\nf 2873 2880 2968\nf 3001 2992 2951\nf 2951 2968 3001\nf 3021 3010 2992\nf 2992 3001 3021\nf 2195 2189 1756\nf 1756 1759 2195\nf 2390 2383 2189\nf 2189 2195 2390\nf 2517 2513 2383\nf 2383 2390 2517\nf 2612 2606 2513\nf 2513 2517 2612\nf 2709 2708 2606\nf 2606 2612 2709\nf 2801 2800 2708\nf 2708 2709 2801\nf 2886 2880 2800\nf 2800 2801 2886\nf 2970 2968 2880\nf 2880 2886 2970\nf 3004 3001 2968\nf 2968 2970 3004\nf 3022 3021 3001\nf 3001 3004 3022"
  },
  {
    "path": "src/CloudScapes/models/thinCube.obj",
    "content": "# This file uses centimeters as units for non-parametric coordinates.\n\nmtllib thinCube.mtl\ng default\nv -0.500000 -0.021995 0.500000\nv 0.500000 -0.021995 0.500000\nv -0.500000 0.021995 0.500000\nv 0.500000 0.021995 0.500000\nv -0.500000 0.021995 -0.500000\nv 0.500000 0.021995 -0.500000\nv -0.500000 -0.021995 -0.500000\nv 0.500000 -0.021995 -0.500000\nvt 0.375000 0.000000\nvt 0.625000 0.000000\nvt 0.375000 0.250000\nvt 0.625000 0.250000\nvt 0.375000 0.500000\nvt 0.625000 0.500000\nvt 0.375000 0.750000\nvt 0.625000 0.750000\nvt 0.375000 1.000000\nvt 0.625000 1.000000\nvt 0.875000 0.000000\nvt 0.875000 0.250000\nvt 0.125000 0.000000\nvt 0.125000 0.250000\nvn 0.000000 0.000000 1.000000\nvn 0.000000 0.000000 1.000000\nvn 0.000000 0.000000 1.000000\nvn 0.000000 0.000000 1.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn 0.000000 0.000000 -1.000000\nvn 0.000000 0.000000 -1.000000\nvn 0.000000 0.000000 -1.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -1.000000 0.000000 0.000000\nvn -1.000000 0.000000 0.000000\nvn -1.000000 0.000000 0.000000\nvn -1.000000 0.000000 0.000000\ns off\ng pCube1\nusemtl initialShadingGroup\nf 1/1/1 2/2/2 4/4/3 3/3/4\nf 3/3/5 4/4/6 6/6/7 5/5/8\nf 5/5/9 6/6/10 8/8/11 7/7/12\nf 7/7/13 8/8/14 2/10/15 1/9/16\nf 2/2/17 8/11/18 6/12/19 4/4/20\nf 7/13/21 1/1/22 3/3/23 5/14/24\n"
  },
  {
    "path": "src/CloudScapes/shaders/cloudRayMarch.comp",
    "content": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n\n#define WORKGROUP_SIZE 32\nlayout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE) in;\n\nlayout (set = 0, binding = 0, rgba16f) uniform writeonly image2D currentFrameResultImage;\nlayout (set = 0, binding = 1, rgba16f) uniform readonly image2D previousFrameResultImage;\nlayout (set = 1, binding = 0) uniform sampler3D cloudBaseShapeSampler;\nlayout (set = 1, binding = 1) uniform sampler3D cloudDetailsHighFreqSampler; // Dont use alpha channel\nlayout (set = 1, binding = 2) uniform sampler2D curlNoiseSampler; // Don't use alpha channel\nlayout (set = 1, binding = 3) uniform sampler2D weatherMapSampler; // Don't use alpha channel\nlayout (set = 1, binding = 4, rgba16f) uniform writeonly image2D godRaysCreationDataImage;\n\nlayout (set = 2, binding = 0) uniform CameraUBO\n{\n\tmat4 view;\n\tmat4 proj;\n\tvec4 eye;\n\tvec2 tanFovBy2;\n} camera;\n\nlayout (set = 3, binding = 0) uniform TimeUBO\n{\n    vec4 haltonSeq1;\n    vec4 haltonSeq2;\n    vec4 haltonSeq3;\n    vec4 haltonSeq4;\n    vec2 time; //stores delat time and total time\n\tint frameCountMod16;\n};\n\nlayout (set = 4, binding = 0) uniform SunAndSkyUBO\n{\n    vec4 sunLocation;\n\tvec4 sunDirection;\n\tvec4 lightColor;\n\tfloat sunIntensity;\n} sunAndSky;\n\nstruct Ray {\n    vec3 origin;\n    vec3 direction;\n};\n\nstruct Intersection {\n    vec3 normal;\n    vec3 point;\n    bool valid;\n    float t;\n};\n\n//Global Defines for Debug Views\n#define BACKGROUND_SKY 0\n#define CLOUD_DENSITY 0\n#define TEXTURE_CURL_NOISE 0\n#define TEXTURE_HIGH_FREQ 0\n#define TEXTURE_LOW_FREQ 0\n#define HEIGHT_GRADIENT 0\n#define T_TESTS 0\n#define HG_TEST 0\n#define BEERS_TEST 0\n\n//Global Defines for math constants\n#define PI 3.14159265\n#define THREE_OVER_SIXTEEN_PI 0.05968310365946075\n#define ONE_OVER_FOUR_PI 0.07957747154594767\n#define E 2.718281828459\n\n//Global Defines for Colors\n#define BLACK vec3(0,0,0)\n#define WHITE vec3(1,1,1)\n\n//Global Defines for Earth and Cloud Layers \n#define EARTH_RADIUS 6371000.0 // earth's actual radius in km = 6371\n#define ATMOSPHERE_RADIUS_INNER (EARTH_RADIUS + 7500.0) //paper suggests values of 15000-35000m above\n#define ATMOSPHERE_RADIUS_OUTER (EARTH_RADIUS + 20000.0)\n#define ATMOSPHERE_THICKNESS (ATMOSPHERE_RADIUS_OUTER - ATMOSPHERE_RADIUS_INNER)\n\n// Global Defines for Preetham \n#define EE 1000.0\n#define SHADOW_CUTOFF 1.6110731557\n#define SHADOW_STEEPNESS 1.5\n#define SUN_ANGULAR_COS 0.999956676946448443553574619906976478926848692873900859324\n#define MIE_CONST vec3( 1.839991851443397, 2.779802391966052, 4.079047954386109)\n#define RAYLEIGH_TOTAL vec3(5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5)\n\n// Global Wind Defines\n#define WIND_DIRECTION vec3(1.0,0.0,0.0)\n#define CLOUD_SPEED 0.080\n#define CLOUD_TOP_OFFSET 1.0// this offset pushes the tops of the clouds along this wind direction by this many units\n\n// #define SUN_LOCATION vec3(0.0, ATMOSPHERE_RADIUS_OUTER + EARTH_RADIUS / 2.0, -EARTH_RADIUS * 1.5) //TODO:change it through uniform for an animated sky'\n#define SUN_LOCATION vec3(0.0, ATMOSPHERE_RADIUS_OUTER * 0.9, -ATMOSPHERE_RADIUS_OUTER * 0.9)\n#define BACKGROUND_SKY_SUN_LOCATION vec3(0.0, EARTH_RADIUS * 2.0, -EARTH_RADIUS * 10.0)\n// #define BACKGROUND_SKY_SUN_LOCATION vec3(0.0, ATMOSPHERE_RADIUS_OUTER * 0.9, -ATMOSPHERE_RADIUS_OUTER * 0.9)\n\n#define SUN_COLOR vec3(1.0, 1.0, 1.0)\n#define SUN_INTENSITY 0.780\n\n//--------------------------------------------------------\n//\t\t\t\t\tTOOL BOX FUNCTIONS\n//--------------------------------------------------------\n\n//This bit of code is for converting a 32 bit float to store as 4 8 bit floats \nconst vec4 bitEnc = vec4(1.,255.,65025.,16581375.);\nvec4 EncodeFloatRGBA (float v) {\n    vec4 enc = bitEnc * v;\n    enc = fract(enc);\n    enc -= enc.yzww * vec2(1./255., 0.).xxxy;\n    return enc;\n}\n\nvec2 getJitterOffset (in int index, ivec2 dim) \n{\n    //index is a value from 0-15\n    //Use pre generated halton sequence to jitter point --> halton sequence is a low discrepancy sampling pattern\n    vec2 jitter = vec2(0.0);\n    index = index/2;\n    if(index < 4)\n    {\n        jitter.x = haltonSeq1[index];\n        jitter.y = haltonSeq2[index];\n    }\n    else\n    {\n        index -= 4;\n        jitter.x = haltonSeq3[index];\n        jitter.y = haltonSeq4[index];\n    }\n    return jitter/dim;\n}\n\nfloat getJitterOffset (in int index, float maxOffset) \n{\n    //index is a value from 0-15\n    //Use pre generated halton sequence to jitter point --> halton sequence is a low discrepancy sampling pattern\n    float jitter = 0.0;\n    index = index/2;\n    if(index < 4)\n    {\n        jitter = haltonSeq1[index];\n    }\n    else\n    {\n        index -= 4;\n        jitter = haltonSeq2[index];\n    }\n    return jitter*maxOffset;\n}\n\n// Maps values from one range to another\nfloat remap(in float value, in float original_min, in float original_max, in float new_min, in float new_max)\n{\n\treturn new_min + ( ((value - original_min) / (original_max - original_min)) * (new_max - new_min) );\n}\n\nfloat remapClamped(in float value, in float original_min, in float original_max, in float new_min, in float new_max)\n{\n    float t = new_min + ( ((value - original_min) / (original_max - original_min)) * (new_max - new_min) );\n    return clamp(t, new_min, new_max);\n}\n\nfloat remapClampedBeforeAndAfter(in float value, in float original_min, in float original_max, in float new_min, in float new_max)\n{   \n    value = clamp(value, original_min, original_max);\n    float t = new_min + ( ((value - original_min) / (original_max - original_min)) * (new_max - new_min) );\n    return clamp(t, new_min, new_max);\n}\n\nfloat getRelativeHeightInAtmosphere(in vec3 point, in vec3 earthCenter, in vec3 startPosOnInnerShell, in vec3 rayDir, in vec3 eye)\n{\n\tfloat lengthOfRayfromCamera = length(point - eye);\n\tfloat lengthOfRayToInnerShell = length(startPosOnInnerShell - eye);\n\tvec3 pointToEarthDir = normalize(point - earthCenter);\n\t// assuming RayDir is normalised\n\tfloat cosTheta = dot(rayDir, pointToEarthDir);\n\n    // CosTheta is an approximation whose error gets relatively big near the horizon and could lead to problems.\n    // However, the actual calculationis involve a lot of trig and thats expensive;\n    // No longer drawing clouds that close to the horizon and so the cosTheta Approximation is fine\n\n\tfloat numerator = abs(cosTheta * (lengthOfRayfromCamera - lengthOfRayToInnerShell));\n\treturn numerator/ATMOSPHERE_THICKNESS;\n\t// return clamp( length(point.y - projectedPos.y) / ATMOSPHERE_THICKNESS, 0.0, 1.0);\n}\n\nvec3 getRelativePositionInAtmosphere(in vec3 pos, in vec3 earthCenter)\n{\n   \treturn vec3( ( pos - vec3(earthCenter.x, ATMOSPHERE_RADIUS_INNER - EARTH_RADIUS, earthCenter.z) )/ ATMOSPHERE_THICKNESS );\n}\n\n//Compute Ray for ray marching based on NDC point\nRay castRay( vec2 screenPoint, vec3 eye, int pixelID, ivec2 dim )\n{\n\tRay r;\n\n    // Extract camera information from uniform\n\tvec3 camRight = normalize(vec3( camera.view[0][0], \n\t\t\t\t    \t\t\t\tcamera.view[1][0], \n\t\t\t\t    \t\t\t\tcamera.view[2][0] ));\n\tvec3 camUp =    normalize(vec3( camera.view[0][1], \n\t\t\t\t    \t\t\t\tcamera.view[1][1], \n\t\t\t\t    \t\t\t\tcamera.view[2][1] ));\n\tvec3 camLook =  -normalize(vec3(camera.view[0][2], \n\t\t\t\t    \t\t\t\tcamera.view[1][2], \n\t\t\t\t    \t\t\t\tcamera.view[2][2] ));\n\n\t// Compute ndc space point from screenspace point //[-1,1] to [0,1] range\n    vec2 NDC_Space_Point = screenPoint * 2.0 - 1.0; \n\n    //Jitter point with halton sequence\n    NDC_Space_Point += getJitterOffset(pixelID, dim);\n\n    //convert to camera space\n    vec3 cam_x = NDC_Space_Point.x * camera.tanFovBy2.x * camRight;\n    vec3 cam_y = NDC_Space_Point.y * camera.tanFovBy2.y * camUp;\n    //convert to world space\n    vec3 ref = eye+camLook;\n    vec3 p = ref + cam_x + cam_y; //facing the screen\n\n    r.origin = eye;\n    r.direction = normalize(p - eye);\n\n    return r;\n}\n\n//Sphere Intersection Testing\nIntersection raySphereIntersection(in vec3 rO, in vec3 rD, in vec3 sphereCenter, in float sphereRadius)\n{\n    Intersection isect;\n    isect.valid = false;\n    isect.point = vec3(0.0);\n    isect.normal = vec3(0.0, 1.0, 0.0);\n\n    // Transform Ray such that the spheres move down, such that the camera is close to the sky dome\n    // Only change sphere origin because you can't translate a direction\n    rO -= sphereCenter;\n    rO /= sphereRadius;\n\n    float A = dot(rD, rD);\n    float B = 2.0*dot(rD, rO);\n    float C = dot(rO, rO) - 1.0; //uniform sphere\n    float discriminant = B*B - 4.0*A*C;\n\n    //If the discriminant is negative, then there is no real root\n    if(discriminant < 0.0)\n    {\n        return isect;\n    }\n\n    float t = (-B - sqrt(discriminant))/(2.0*A);\n    \n    if(t < 0.0) \n    {\n        t = (-B + sqrt(discriminant))/(2.0*A);\n    }\n\n    if(t >= 0.0)\n    {\n        vec3 p = vec3(rO + t*rD);\n        isect.valid = true;\n        isect.normal = normalize(p);\n\n        p *= sphereRadius;\n        p += sphereCenter;\n\n        isect.point = p;\n        isect.t = length(p-rO);\n    }\n\n    return isect;\n}\n\n//--------------------------------------------------------\n//\t\t\t\t\t\tLIGHTING\n//--------------------------------------------------------\n\n/*\n    Note:\n        - Apply this result whenever you calculate radiance of your sample \n\n    Functionality:\n        - Combine 2 HG functions with max() to retain baseline forward scattering and achieve silver lining highlights\n    \n        eccentricity = 0.6\n    \n        silver_intensity = user controlled param [0, 1]\n                            Controls intensity of the effect of using 2 HG functions and the spread away from the sun\n                            Increase this to add intensity on clouds near the sun \n\n        silver_spread = user contorlled param [0, 1]\n                            Decrease this to increase brightness that's spread throughout clouds away from the sun\n*/\nfloat HenyeyGreenstein(float cos_angle, float eccentricity)\n{\n\tfloat numerator =  1.0 - eccentricity * eccentricity;\n\tfloat denominator = pow((1.0 + eccentricity * eccentricity - 2.0 * eccentricity * cos_angle), 1.5);\n    return (numerator / denominator) * ONE_OVER_FOUR_PI;\n}\n\nfloat HGModified(float cos_angle, float eccentricity, float silver_intensity, float silver_spread)\n{\n    return max( HenyeyGreenstein(cos_angle, eccentricity),  \n                silver_intensity * HenyeyGreenstein(cos_angle, 0.99 - silver_spread) );\n}\n\n/*\n    Note: \n        - Only do this when you look away from sun\n        - Ramp down this affect as angle b/w viewRay and lightRay decrease\n        - attenuation_reduction_factor = 0.25;\n    \t- influence_reduction_factor = 0.7;\n\n    Functionality: \n        - Attenuation value for the second function was reduced to push light further into the cloud\n        - Reduce its influence so to not overpower the result. \n        - density_along_light_ray comes from cone sampling \n*/\nfloat BeerLambertModified(float density_along_light_ray, float attenuation_reduction_factor, float influence_reduction_factor)\n{\n    return max( exp(density_along_light_ray) , \n    \t\t\texp(density_along_light_ray * attenuation_reduction_factor) * influence_reduction_factor );\n}\n\n/*\n\tNotes:\n\t\t- dl is the density sampled along the light ray for the given sample position.\n\t\t- ds_loded is the low lod sample of density at the given sample position.\n*/\nfloat GetLightEnergy(float height_fraction, float dl, float ds_loded, float phase_probability, float cos_angle, float step_size, float brightness)\n{\n    // Attenuation – difference from slides – reduce the secondary component when we look toward the sun.\n    float primary_attenuation = exp(-dl);\n\n\n    // NOTE: in the slides, seconary_attenuation was \"secondary_intensity_curve\", and primary_attenuation was \"primary_intensity_curve\". UNSURE IF SAME\n    // FIRST INSTANCE\n    // float secondary_attenuation = exp(-dl * 0.25) * 0.7;\n    float secondary_attenuation = exp(-dl);\n    float attenuation_probability = max( \n    \t\t\t\t\t\t\t\t\tremap(cos_angle, 0.7, 1.0, secondary_attenuation, secondary_attenuation * 0.25), \n    \t\t\t\t\t\t\t\t\tprimary_attenuation);\n    \n    // --------------------------------------------------------------------------------------------------------------------\n    \n    // // SECOND INSTANCE -------> DARKER THAN THE FIRST INSTANCE\n    // float beerLambertModified = BeerLambertModified(-dl, 0.25, 0.7);\n    // float attenuation_probability = mix(primary_attenuation, beerLambertModified, -cos_angle * 0.5 + 0.5);\n    \n\n    // In-scattering – one difference from presentation slides – we also reduce this effect once light has attenuated to make it directional.\n\n    // // FIRST INSTANCE -----> THIS PRODUCES MORE BANDING EFFECTS\n    // float depth_probability = mix( 0.05 + pow(ds_loded, \n    //                                           remap(height_fraction, 0.3, 0.85, 0.5, 2.0))\n    //                              , 1.0, clamp( dl / step_size, 0.0, 1.0));\n    \n    // --------------------------------------------------------------------------------------------------------------------\n\n    // // SECOND INSTANCE\n    // float depth_probability = mix(0.05 + pow(ds_loded, clamp(\n    // \t\t\t\t\t\t\t\t\t\t\t\t\t\tremap(height_fraction, 0.3, 0.85, 0.5, 2.0), \n    // \t\t\t\t\t\t\t\t\t\t\t\t\t\t0.6, 2.0)), \n    // \t\t\t\t\t\t\t1.0, \n    // \t\t\t\t\t\t\tclamp(dl / step_size, 0.0, 1.0));\n\n\n    // float vertical_probability = pow(clamp(\n    // \t\t\t\t\t\t\t\t\t\tremap(height_fraction, 0.07, 0.14, 0.1, 1.0), \n    // \t\t\t\t\t\t\t\t\t\t0.1, 1.0), \n    // \t\t\t\t\t\t\t\t0.8 );\n\n\n    // THIRD INSTANCE ------> LOOKS ESSENTIALLY SAME AS SECOND INSTANCE\n\n    // MANIPULATE ME \n    float depth_probability = 0.05 + pow(ds_loded, clamp(remap(height_fraction * 0.125, 0.3, 0.85, 0.5, 2.0), 0.5, 2.0));\n    float vertical_probability = pow(clamp(remap(height_fraction * 1.5, 0.07, 0.34, 0.1, 1.0), 0.1, 1.0), 0.8);\n\n    // MANIPULATE ME \n    float in_scatter_probability = depth_probability * vertical_probability;\n\n    // float light_energy = attenuation_probability * in_scatter_probability * phase_probability * brightness;\t\t\t\t\t\t// ORIGINAL (LIGHTEST)\n    float light_energy = attenuation_probability * primary_attenuation * in_scatter_probability * phase_probability * brightness;\t// MEDIUM\n    // float light_energy = primary_attenuation * secondary_attenuation * in_scatter_probability * phase_probability * brightness;\t// DARKEST\n    return light_energy;\n}\n\n//--------------------------------------------------------\n//\t\t\t\t\tPREETHAM SKY MODEL\n//--------------------------------------------------------\n/*\n\tPreetham Sky from: \n\thttps://github.com/markstock/GenUtahSky/blob/master/utah.cal\n\t\n\tOther resources for preetham sky model:\n\tAdapted from open source of zz85 on Github, math from Preetham Model, initially implemented by Simon Wallner and Martin Upitis\n*/\n\nfloat rayleighPhase(float cosTheta) \n{\n    return THREE_OVER_SIXTEEN_PI * (1.0 + cosTheta * cosTheta);\n}\n\nvec3 calcSkyBetaR() \n{\n\tfloat rayleigh = 2.0;\n  \tfloat sunFade = 1.0 - clamp(1.0 - exp(BACKGROUND_SKY_SUN_LOCATION.y / 450000.0), 0.0, 1.0);\n\treturn vec3(RAYLEIGH_TOTAL * (rayleigh - 1.0 + sunFade)); \n}\n\nvec3 calcSkyBetaV() \n{\n\tfloat turbidity = 10.0;\n\tfloat mie = 0.005;\n    float c = (0.2 * turbidity) * 10E-18;\n    return vec3(0.434 * c * MIE_CONST * mie);\n}\n\nfloat calcSunIntensity() \n{\n\tfloat zenithAngleCos = clamp(normalize(BACKGROUND_SKY_SUN_LOCATION).y, -1.0, 1.0);\n\treturn EE * max(0.0, 1.0 - pow(E, -((SHADOW_CUTOFF - acos(zenithAngleCos)) / SHADOW_STEEPNESS)));\n}\n\nvec3 getAtmosphereColorPhysical(vec3 dir, vec3 sunDir, float sunIntensity) \n{\n    vec3 color = vec3(0);\n\n    sunDir = normalize(sunDir); \n    float sunE = sunIntensity * calcSunIntensity(); \n    vec3 BetaR = calcSkyBetaR();   \n    vec3 BetaM = calcSkyBetaV(); \n\n    // optical length\n    float zenith = acos(max(0.0, dir.y)); // acos?\n    float inverse = 1.0 / (cos(zenith) + 0.15 * pow(93.885 - ((zenith * 180.0) / PI), -1.253));\n    float sR = 8.4E3 * inverse;\n    float sM = 1.25E3 * inverse;\n\n    vec3 fex = exp( -BetaR * sR + BetaM * sM);\n\n    float cosTheta = dot(sunDir, dir);\n\n    float rPhase = rayleighPhase(cosTheta * 0.5 + 0.5);\n    vec3 betaRTheta = BetaR * rPhase;\n    float mie_directional = 0.8;\n    float mPhase = HenyeyGreenstein(cosTheta, mie_directional);\n    vec3 betaMTheta = BetaM * mPhase;\n\n    float yDot = 1.0 - sunDir.y;\n    yDot *= yDot * yDot * yDot * yDot;\n    vec3 betas = (betaRTheta + betaMTheta) / (BetaR + BetaM);\n    vec3 Lin = pow(sunE * (betas) * (1.0 - fex), vec3(1.5));\n    Lin *= mix(vec3(1), pow(sunE * (betas) * fex, vec3(0.5)), clamp(yDot, 0.0, 1.0));\n\n    vec3 L0 = 0.1 * fex;\n\n    float sunDisk = smoothstep(SUN_ANGULAR_COS, SUN_ANGULAR_COS + 0.00002, cosTheta);\n    L0 += (sunE * 15000.0 * fex) * sunDisk;\n\n    color = (Lin + L0) * 0.04 + vec3(0.0, 0.0003, 0.00075);\n\n    // return color in HDR space\n    return color;\n}\n\n// End credit to Preetham Sun Sky model\n\n//--------------------------------------------------------\n//\t\t\t\t\tCLOUD SAMPLING\n//--------------------------------------------------------\n\nfloat getDensityHeightGradientForPoint(in float relativeHeight, in float cloudType)\n{\n    relativeHeight = clamp(relativeHeight, 0.0, 1.0);\n\n    float cumulus = max(0.0, remap(relativeHeight, 0.01, 0.3, 0.0, 1.0) * remap(relativeHeight, 0.6, 0.95, 1.0, 0.0));\n    float stratocumulus = max(0.0, remap(relativeHeight, 0.0, 0.25, 0.0, 1.0) * remap(relativeHeight,  0.3, 0.65, 1.0, 0.0)); \n    float stratus = max(0.0, remap(relativeHeight, 0, 0.1, 0.0, 1.0) * remap(relativeHeight, 0.2, 0.3, 1.0, 0.0)); \n\n    float a = mix(stratus, stratocumulus, clamp(cloudType * 2.0, 0.0, 1.0));\n\n    float b = mix(stratocumulus, stratus, clamp((cloudType - 0.5) * 2.0, 0.0, 1.0));\n    return mix(a, b, cloudType);\n}\n\nvec3 skewSamplePointWithWind(in vec3 point, inout float height_fraction)\n{\n    //skew in wind direction\n    point += height_fraction * WIND_DIRECTION * CLOUD_TOP_OFFSET * 0.009;\n    \n    //Animate clouds in wind direction and add a small upward bias to the wind direction\n    point += (WIND_DIRECTION + vec3(0.0, 0.1, 0.0)) * CLOUD_SPEED * time.y;\n    return point;\n}\n\nfloat sampleLowFrequency(vec3 point, in vec3 unskewedSamplePoint, in float relativeHeight, in vec3 earthCenter)\n{\n    //Read in the low-frequency Perlin-Worley noises and Worley noises\n    vec4 lowFrequencyNoises = texture(cloudBaseShapeSampler, point);// * 0.8);\t// MANIPULATE ME \n\n    //Build an FBM out of the low-frequency Worley Noises that are used to add detail to the Low-frequency Perlin Worley noise\n    float lowFrequencyFBM = (lowFrequencyNoises.g * 0.625) + \n                            (lowFrequencyNoises.b * 0.25)  + \n                            (lowFrequencyNoises.a * 0.125);\n    \n    // lowFrequencyFBM = clamp(abs(lowFrequencyFBM), 0.0, 1.0);  \n    lowFrequencyFBM = clamp(lowFrequencyFBM, 0.0, 1.0);                      \n\n    // Define the base cloud shape by dilating it with the low-frequency FBM\n    float baseCloud = remapClamped( lowFrequencyNoises.r, (lowFrequencyFBM - 0.9), 1.0, 0.0, 1.0 );\n    \n    // TODO: Use weater map for cloud types and blend between them and their densities\n    // ------------------ only screws it up; but needed for blending cloud types -----------------------\n    // // Get the density-height gradient\n    // vec2 weatherSamplePoint = unskewedSamplePoint.xz;// / 50.0;// / 50.0;//50000.0f;\n    // vec3 weather_data = texture(weatherMapSampler, weatherSamplePoint).rgb;\n    // float cloudType = weather_data.g;\n    // float densityHeightGradient = getDensityHeightGradientForPoint(relativeHeight, weather_data.g);\n\n    // // Apply Height function to the base cloud shape\n    // baseCloud *= densityHeightGradient * 0.5;// * 0.8;\n    // -------------------------------------------------------------------------------------------------\n\n    // Cloud coverage is stored in weather data’s red channel .\n    //WHAT EVEN???? --> increasing cloud coverage apparently reduces base_cloud_with_coverage\n    float cloud_coverage = 0.6;// weather_data.r;\n\n    // Use remap to apply the cloud coverage attribute.\n    float base_cloud_with_coverage = remapClampedBeforeAndAfter ( baseCloud, cloud_coverage, 1.0, 0.0, 1.0);\n\n    // To ensure that the density increases with coverage in an aesthetically pleasing manner\n    // Multiply the result by the cloud coverage attribute so that smaller clouds are lighter \n    // and more aesthetically pleasing\n    base_cloud_with_coverage *= cloud_coverage;\n\n    return base_cloud_with_coverage;\n}\n\nfloat erodeCloudWithHighFrequency(in float baseCloud, in vec3 rayDir, in vec3 point, in float height_fraction)\n{\n    // Add turbulence to the bottom of the clouds\n    vec4 curlNoise = texture(curlNoiseSampler, point.xy);\n    point.xy += curlNoise.xy * (1.0 - height_fraction) * 0.5;\n\n    // Sample High Frequency Noises\n    vec4 highFrequencyNoise = texture(cloudDetailsHighFreqSampler, point);\t// MANIPULATE ME \n\n    // Build High Frequency FBM\n    float high_freq_FBM = (highFrequencyNoise.r * 0.625) + \n                          (highFrequencyNoise.g * 0.25)  +\n                          (highFrequencyNoise.b * 0.125); \n\n\t//Erode the base shape of the cloud with the distorted high frequency worley noises\n\n\t// MANIPULATE ME \n\tfloat high_freq_modifier = clamp( mix(high_freq_FBM, 1.0 - high_freq_FBM, clamp(height_fraction * 2.0, 0.0, 1.0)), 0.0, 1.0);\n\n    float final_cloud = remap(baseCloud, high_freq_modifier * 0.005, 1.0, 0.0, 1.0);\n\treturn final_cloud;\n}\n\nvec3 rayMarch(Ray ray, vec3 earthCenter, in vec3 startPos, in float start_t, in float end_t, in int pixelID, inout float accumDensity)\n{\n    float _dot = dot(ray.direction, vec3(0.0f, 1.0f, 0.0f));\n    float jitterfactor = 1.180f;//4.0f;\n\n    // MANIPULATE ME \n    const float baseDensityFactor = 0.380f;//0.5f; // increase this to get more dense cloud centers    \n    const float maxSteps = floor(mix(35.0f, 60.0f, 1.0f - _dot));\n\t\n    const float atmosphereThickness = (end_t - start_t);\t\n\tconst float stepSize = (atmosphereThickness / maxSteps);\n    float transmittance = 1.0;\n\n    vec3 pos;\n    vec3 samplePoint;\n    vec3 returnColor = vec3(0.0);\n    float baseDensity;\n\n    // Lighting data -------------------------------------------------------------------\n    // Henyey-Greenstein\n    const vec3 lightDir = normalize(SUN_LOCATION - ray.origin);\n    const float cos_angle = dot(normalize(ray.direction), lightDir);\n    const float eccentricity = 0.6;\n    const float silver_intensity = 0.7;\n    const float silver_spread = 0.1;\n    const float HG_light = HGModified(cos_angle, eccentricity, silver_intensity, silver_spread);\n\n    // Random unit vectors for your cone sample.\n    // These are positioned to be facing the sun \n    // Create random samples within a unit cone facing world up (y direction)\n    // Construct TBN matrix towards light\n    // Then rotate unit cone towards the sun using TBN\n\n    vec3 maxCompUnitVector;\n    if(abs(lightDir[0]) > abs(lightDir[1]) && abs(lightDir[0]) > abs(lightDir[2]))\n    {\n        maxCompUnitVector = vec3(abs(lightDir[0]), 0.0, 0.0);\n    }\n    else if(abs(lightDir[1]) > abs(lightDir[0]) && abs(lightDir[1]) > abs(lightDir[2]))\n    {\n        maxCompUnitVector = vec3(0.0, abs(lightDir[1]), 0.0);\n    }\n    else\n    {\n        maxCompUnitVector = vec3(0.0, 0.0, abs(lightDir[2]));\n    }\n    \n    vec3 zComponent = cross(lightDir, maxCompUnitVector);\n    vec3 xComponent = cross(zComponent, lightDir);\n    mat3 sunRotMatrix = mat3(xComponent, lightDir, zComponent);\n\n    const vec3 noise_kernel[] = \n    {\n        sunRotMatrix * vec3(0.1, 0.25, -0.15),\n        sunRotMatrix * vec3(0.2, 0.5, 0.2),\n        sunRotMatrix * vec3(-0.2, 0.1, -0.1),\n        sunRotMatrix * vec3(-0.05, 0.75, 0.05),\n        sunRotMatrix * vec3(-0.1, 1.0, 0.0),\n        sunRotMatrix * vec3(0.0, 3.0, 0.0),     // One sample should be at distance 3x cone length\n    };\n    // ---------------------------------------------------------------------------------\n\n\tfor (float t = start_t; t < end_t; t += stepSize)\n\t{\n\t\tvec3 colorPerSample = vec3(0.0);\n\n        int _index = int(mod((pixelID+int(t)),16.0f));\n        vec2 jitterLocation = getJitterOffset(_index, ivec2(75.0f));\n\t\tpos = ray.origin + t * (ray.direction + vec3(jitterLocation.x, (jitterLocation.x + jitterLocation.y)*jitterfactor, jitterLocation.y));\n        samplePoint = getRelativePositionInAtmosphere(pos, earthCenter);\n        samplePoint /= 8.0f; //controls the frequency of how we are sampling the noise texture\n\n\t\tfloat relativeHeight = getRelativeHeightInAtmosphere(pos, earthCenter, startPos, ray.direction, ray.origin);\n        vec3 skewedSamplePoint = skewSamplePointWithWind(samplePoint, relativeHeight);\n\n\t\tbaseDensity = sampleLowFrequency(skewedSamplePoint, pos, relativeHeight, earthCenter) * baseDensityFactor; //helps for early termination of rays\n\n\t\tif(baseDensity > 0.0) // Useful to prevent lighting calculations for zero density points\n\t\t{\n            //Erode Base cloud shape with higher frequency noise (more expensive and so done when we know for sure we are inside the cloud)\n            float highFreqDensity = erodeCloudWithHighFrequency(baseDensity*1.4f, ray.direction, skewedSamplePoint, relativeHeight);\n\n            // MANIPULATE ME \n\t\t\taccumDensity += highFreqDensity * 0.5;\n\n\t\t\t// Do Lighting calculations with cone sampling\n\t\t\tfloat densityAlongLight = 0.0;\n\t\t\tint light_samples = 6;\n\n\t\t\tfor(int i = 0; i < light_samples; ++i)\n\t\t\t{\n\t\t\t\t// Add the current step offset to the sample position\n                vec3 lightPos = pos + (stepSize * noise_kernel[i] * float(i));\n               \tvec3 sampleLightPos =  getRelativePositionInAtmosphere(lightPos, earthCenter);\n\n               \t// MANIPULATE ME \n                float currBaseLightDensity = sampleLowFrequency(sampleLightPos, sampleLightPos, relativeHeight, earthCenter);\n\n                if(currBaseLightDensity > 0.0)\n                {\n                \tfloat currLightDensity = erodeCloudWithHighFrequency(1.5 * currBaseLightDensity, ray.direction, skewedSamplePoint, relativeHeight);\n                \tdensityAlongLight += currLightDensity;\n                }\n\t\t\t}\n\n            // ------------------------------------------------------------------------------------------------------------------\n            // MANIPULATE ME \n            float brightness = 5.0;\n            float totalLightEnergy = GetLightEnergy(relativeHeight, densityAlongLight, baseDensity, HG_light, cos_angle, stepSize, brightness);\n            transmittance = mix(transmittance, totalLightEnergy, (1.0 - accumDensity)); \n            colorPerSample = vec3(transmittance);\n            \n            returnColor += colorPerSample;\n\t\t} //end if\n\n\t\tif(accumDensity >= 1.0) \n\t\t{\n            accumDensity = 1.0;\n            break;\n        } //end if\n\n\t} //end raymarcher for loop\n\treturn returnColor;\n}// end raymarch function\n\nvoid main() \n{\n\tivec2 dim = imageSize(currentFrameResultImage);\n\n    //Actually only raymarch for every 16th pixel because reprojection should handle the other pixels\n    int pixelID = frameCountMod16;\n\n    int pX = int(floor(pixelID/4));\n    int pY = int(floor(mod(pixelID,4)));\n\n    uint pixelX = gl_GlobalInvocationID.x * 4 + pX;\n    uint pixelY = gl_GlobalInvocationID.y * 4 + pY;\n\n    vec2 uv = vec2(pixelX, pixelY) / dim;\n    ivec2 chosenPixel = ivec2(pixelX, pixelY);\n\n\tuv.y = 1.0 - uv.y; //cause vulkan inverts y compared to openGL\n\tvec3 eyePos = -camera.eye.xyz;\n\tRay ray = castRay(uv, eyePos, pixelID, dim);\n\n\tfloat sunIntensity = SUN_INTENSITY;\n\tvec3 backgroundCol = BLACK;\n\n\tfloat _dot = dot( vec3(0.0, 1.0, 0.0), ray.direction );\n\tconst float backgroundColorMultiplier = max(0.620, _dot);\n    vec3 transitionGradient = WHITE;\n    const float cloudFadeOutPoint = 0.06f;\n\n\tif ( _dot < 0.0 )\n\t{\n\t\t//kill threads because we shouldnt see clouds below the horizon\n\t\t//magic numbers to make the colors look good after a tone map\n\t\tvec3 colorNearHorizon = vec3(0.0, 0.16, 0.51) * 0.4; //dark ocean blue\n\t\tvec3 color2 = vec3(0.0, 0.73, 0.95) * 0.5; //light ocean blue\n\t\tbackgroundCol = mix(colorNearHorizon, color2, -ray.direction.y * 5.5);\n\n\t\timageStore( godRaysCreationDataImage, chosenPixel, vec4(0.0f) );\n\t\timageStore( currentFrameResultImage, chosenPixel, vec4(backgroundCol, 1.0f) );\n\t\treturn;\n\t}\n    else if (_dot < cloudFadeOutPoint )\n    {\n        // Get sky background color from Preetham Sun/Sky Model\n        // backgroundCol = getAtmosphereColorPhysical(ray.direction, SUN_LOCATION - ray.origin, sunIntensity); //day time\n        backgroundCol = getAtmosphereColorPhysical(ray.direction, BACKGROUND_SKY_SUN_LOCATION - ray.origin, sunIntensity); //sunset\n\t\tbackgroundCol *= backgroundColorMultiplier;\n\n        imageStore( godRaysCreationDataImage, chosenPixel, vec4(0.0f) );\n        imageStore( currentFrameResultImage, chosenPixel, vec4(backgroundCol, 1.0f) );\n        return;\n    }\n\telse\n\t{\n\t\t// Get sky background color from Preetham Sun/Sky Model\n\t\t// backgroundCol = getAtmosphereColorPhysical(ray.direction, SUN_LOCATION - ray.origin, sunIntensity); //day time\n\t\tbackgroundCol = getAtmosphereColorPhysical(ray.direction, BACKGROUND_SKY_SUN_LOCATION - ray.origin, sunIntensity); //sunset\n\t\tbackgroundCol *= backgroundColorMultiplier;\n\t}\t\n\t\t\n\t// Find the start and end points of the ray march\n\tvec3 earthCenter = eyePos;\n\tearthCenter.y = -EARTH_RADIUS; //move earth below camera\n\tIntersection atmosphereInnerIsect = raySphereIntersection(ray.origin, ray.direction, earthCenter, ATMOSPHERE_RADIUS_INNER);\n\tIntersection atmosphereOuterIsect = raySphereIntersection(ray.origin, ray.direction, earthCenter, ATMOSPHERE_RADIUS_OUTER);\n\n\t// Ray March\n\tfloat accumDensity = 0.0;\n\tvec3 rayMarchResult = rayMarch(ray, earthCenter, atmosphereInnerIsect.point, atmosphereInnerIsect.t, atmosphereOuterIsect.t, pixelID, accumDensity);\n\n\tfloat godRaysAccumDensity = accumDensity;\n\n\t// Blend and fade out clouds into the horizon (CHANGE THIRD PARAM IN REMAP)\n    accumDensity *= smoothstep(0.0, 1.0, min(1.0, remap(ray.direction.y, cloudFadeOutPoint, 0.2f, 0.0f, 1.0f)));\n    \n    vec4 finalColor = vec4(mix(backgroundCol, rayMarchResult, accumDensity), 1.0f);\n    \n    // // Godrays\n    // float lightIntensity = length(backgroundCol)/length(WHITE);\n    // vec4 greyScaleColor = vec4(1.0);//lightColor;\n    // // greyScaleColor.a = mix(0.0, lightIntensity, 1.0 - accumDensity);\n    // greyScaleColor.a = mix(0.0, 0.01, 1.0 - accumDensity);\n\n\tfloat greyScaleValue= 25.0 * min(0.05f, 1.0f - godRaysAccumDensity);\n\tvec4 greyScaleColor = EncodeFloatRGBA (greyScaleValue);\n\t// vec4 greyScaleColor = 10.0 * vec4(1.0 - godRaysAccumDensity);\n\tif(ray.direction.y < 0.05)\n\t{\n\t\tgreyScaleColor *= max( 5.0, ray.direction.y);\n\t\t// greyScaleColor *= max(0.05, ray.direction.y);\n\t}\n\n// Begin debug renders\n#if TEXTURE_LOW_FREQ\n\tvec4 lowFrequencyNoises = texture( cloudBaseShapeSampler, vec3(uv, sin(time.y)) );\n\tfinalColor = vec4(lowFrequencyNoises);\n#elif TEXTURE_HIGH_FREQ\n\tvec4 highFrequencyNoises = texture( cloudDetailsHighFreqSampler, vec3(uv, sin(time.y)) );\n\tfinalColor = vec4(highFrequencyNoises);\n#elif TEXTURE_CURL_NOISE\n\tvec4 curlNoise = texture( curlNoiseSampler, uv );\n\tfinalColor = vec4(curlNoise);\n#elif CLOUD_DENSITY\n\tfinalColor = vec4( vec3(accumDensity), 1.0 );\n#elif HG_TEST\n    const vec3 lightDir = normalize(SUN_LOCATION - ray.origin);\n    const float cos_angle = dot(normalize(ray.direction), lightDir);\n    const float eccentricity = 0.6;\n    const float silver_intensity = 0.7;\n    const float silver_spread = 0.1;\n\tfloat HG_light = HGModified(cos_angle, eccentricity, silver_intensity, silver_spread);\n\tfinalColor = vec4(vec3(HG_light), 1.0);\n#elif BACKGROUND_SKY\n\tfinalColor = vec4(backgroundCol, 1.0);\n#elif T_TESTS\n    if(atmosphereInnerIsect.valid == false) \n    {\n        // Renders red if innerIsect not valid\n        finalColor = vec4(1.0, 0.0, 0.0, 1.0);\n    }\n    if(atmosphereOuterIsect.valid == false) \n    {\n        // Renders green if outerIsect not valid\n        finalColor = vec4(0.0, 1.0, 0.0, 1.0);\n    }\n    else                                    \n    {\n        // Renders blue if both isects valid\n        finalColor = vec4(0.0, 0.0, 1.0, 1.0);\n    }\n#elif BEERS_TEST\n    finalColor = vec4(rayMarchResult, 1.0);\n#endif\n\t\n\t//Pass the color off to the cloud pipeline's frag shader\n\timageStore( godRaysCreationDataImage, chosenPixel, greyScaleColor );\n    imageStore( currentFrameResultImage, chosenPixel, finalColor );\n}"
  },
  {
    "path": "src/CloudScapes/shaders/geometryPlain.frag",
    "content": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n\nlayout(set = 0, binding = 1) uniform sampler2D texSampler;\n\nlayout(location = 0) in vec3 fragColor;\nlayout(location = 1) in vec2 fragTexCoord;\n\nlayout(location = 0) out vec4 outColor;\n\nvoid main() \n{\n\toutColor = vec4(texture(texSampler, fragTexCoord).rgb, 1.0);\n}"
  },
  {
    "path": "src/CloudScapes/shaders/geometryPlain.vert",
    "content": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n\n// Binding multiple descriptor sets\n// You need to specify a descriptor layout for each descriptor set when creating the pipeline layout. \n// Shaders can then reference specific descriptor sets like this:\n// layout(set = 0, binding = 0) uniform UniformBufferObject { ... }\n// You can use this feature to put descriptors that vary per-object and descriptors that are shared into separate descriptor sets.\n// In that case you avoid rebinding most of the descriptors across draw calls which is potentially more efficient.\n\nlayout (set = 1, binding = 0) uniform CameraUBO\n{\n\tmat4 view;\n\tmat4 proj;\n\tvec4 eye;\n\tvec2 tanFovBy2;\n};\n\nlayout(set = 0, binding = 0) uniform ModelUBO\n{\n\tmat4 modelMatrix;\n};\n\nlayout (location = 0) in vec4 inPosition;\nlayout (location = 1) in vec4 inColor;\nlayout (location = 2) in vec2 inTexCoord;\n\nout gl_PerVertex \n{\n    vec4 gl_Position;\n};\n\nlayout(location = 0) out vec3 fragColor;\nlayout(location = 1) out vec2 fragTexCoord;\n\nvoid main() \n{\n    gl_Position = proj * view * modelMatrix * inPosition;\n\n\tfragColor = vec3(inColor);\n\tfragTexCoord = inTexCoord;\n}"
  },
  {
    "path": "src/CloudScapes/shaders/postProcess_GenericVertShader.vert",
    "content": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n\n//Reference: https://github.com/SaschaWillems/Vulkan/blob/master/data/shaders/radialblur/radialblur.vert\n\nout gl_PerVertex \n{\n    vec4 gl_Position;\n};\n\nlayout (location = 0) out vec2 outUV;\n\nvoid main() \n{\n\toutUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);\n\tgl_Position = vec4(outUV * 2.0f - 1.0f, 0.99999f, 1.0f);\n}"
  },
  {
    "path": "src/CloudScapes/shaders/postProcess_GodRays.frag",
    "content": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n\nlayout (set = 0, binding = 0, rgba32f) uniform image2D currentFrameResultImage;\nlayout (set = 1, binding = 0) uniform sampler2D godRayCreationDataSampler;\n\nlayout (set = 2, binding = 0) uniform CameraUBO\n{\n\tmat4 view;\n\tmat4 proj;\n\tvec4 eye;\n\tvec2 tanFovBy2;\n} camera;\n\nlayout (set = 3, binding = 0) uniform SunAndSkyUBO\n{\n\tvec4 sunLocation;\n\tvec4 sunDirection;\n\tvec4 lightColor;\n\tfloat sunIntensity;\n} sunAndSky;\n\nlayout(location = 0) in vec2 in_uv;\n\n#define MAX_SAMPLES 100\n#define ATMOSPHERE_DENSITY 1.0f\n#define WEIGHT_FOR_SAMPLE 0.001\n#define DECAY 1.0\n#define EXPOSURE 1.0\n\n#define BLACK vec3(0,0,0)\n#define WHITE vec3(1,1,1)\n\n#define PI 3.14159265\n\nconst vec4 bitEnc = vec4(1.,255.,65025.,16581375.);\nconst vec4 bitDec = 1./bitEnc;\n\nfloat extract32fFromRGBA8f(vec2 uv)\n{\n\tvec4 x = texture(godRayCreationDataSampler, uv);\n\treturn dot(x, bitDec);\n}\n\nbool uv_OutsideCamFrustum(in vec2 test_uv)\n{\n\tif( test_uv.x < 0.0 || test_uv.x > 1.0 ||\n\t\ttest_uv.y < 0.0 || test_uv.y > 1.0 )\n\t{\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nvoid godRayLoop(in vec2 sampleUV, inout vec4 sampleValue, inout float illuminationDecay, inout vec3 accumColor)\n{\t\n\tvec3 sampleColor = sampleValue.rgb * sampleValue.a;\n\tsampleColor *= illuminationDecay * WEIGHT_FOR_SAMPLE; // Apply sample attenuation scale/decay factors.\n\tilluminationDecay *= DECAY; // Update exponential decay factor.\n\taccumColor += sampleColor; //add to accumulated godray color\n}\n\n//References: - https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html\n//\t\t\t  -\thttps://github.com/Erkaman/glsl-godrays\nvoid main()\n{\n\tivec2 dim = imageSize(currentFrameResultImage); //texture(currentFrameResultImage, fragTexCoord).rgb;\n\tivec2 pixelPos = clamp(ivec2(round(float(dim.x) * in_uv.x), round(float(dim.y) * in_uv.y)), ivec2(0.0), ivec2(dim.x - 1, dim.y - 1));\n\tvec2 uv = in_uv;\n\n\tint numSamples = MAX_SAMPLES;\n\t// vec3 sunLocation = vec3(0.0, 1.0, 0.0)*max(0.2, (1.0-sunAndSky.sunLocation.y)); //move with sun location god rays\n\tvec3 sunLocation = vec3(0.0, 1.0, 0.0); //static god rays\n\n\tvec3 cam_to_sun = normalize(sunLocation.xyz - camera.eye.xyz);\n\tvec3 camForward =  -normalize(vec3(camera.view[0][2], camera.view[1][2], camera.view[2][2] ));\n\t//Blend godRay Intensity by blend factor to prevernt hard cut offs when sun goes behind camera\n\tfloat blendFactor = dot(cam_to_sun, camForward);\n\n\tif(blendFactor < 0.0)\n\t{\n\t\t//if dot product is -ve the sun is in the hemisphere behind the camera\n\t\t//sun is behind the camera you cant really do this correctly without actual volumetric calculations or creating a light map (inverse shadow map)\n\t\t//All of that is expensive and so we're not going to bother changing that\n\t\treturn;\n\t}\n\n\t// Sun position in ndc space does not necessarily mean that it is inside the camera frustum;\n\tvec4 sunPos_ndc = camera.proj * camera.view * vec4(sunLocation,1.0); \t// Sun Pos in NDC space\n\tvec2 sunPos_ss = clamp((sunPos_ndc.xy+1.0f)/2.0f, 0.0, 1.0); //Sun Pos in Screen Space\n\n\tbool flag_sunOutsideCamFrustum = uv_OutsideCamFrustum(sunPos_ss);\n\n\tvec3 accumColor = vec3(0.0f, 0.0f, 0.0f);\n\tfloat illuminationDecay = 1.0f;\n\t// Calculate the radial change in uv coords in a direction towards the light source, i.e the sun\n\tvec2 delta_uv = ((uv - sunPos_ss)/float(numSamples)) * ATMOSPHERE_DENSITY;\n\n\t// Take samples along the vector from the pixel to the light source;\n\t//Use these samples to calculate an accumulated color\n\tvec4 sampleValue = sunAndSky.lightColor;\n\tvec2 forwardInScreenSpace = vec2(0.0,1.0);\n\n\tif(flag_sunOutsideCamFrustum)\n\t{\n\t\t//This case causes more divergence so we want to handle it separately from the normal logic\n\t\tfor (int i = 0; i < numSamples; i++)\n\t\t{\n\t\t\tif(uv_OutsideCamFrustum(uv))\n\t\t\t{\n\t\t\t\t//If sun is outside Camera Frustum; create a gradient that will be used as the color of the pixels outside the camera Frustum --> This assumes the \n\t\t\t\t//godRay is completely unoccluded. ---> may want to scale down intensity in this\n\t\t\t\tfloat t = dot( uv-sunPos_ss, forwardInScreenSpace);\n\t\t\t\tvec4 fakePixel = vec4(mix(BLACK, sampleValue.xyz, t), 1.0);\n\t\t\t\tgodRayLoop(uv, fakePixel, illuminationDecay, accumColor);\n\t\t\t\tuv -= delta_uv; // Step sample location along ray.\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsampleValue.a = extract32fFromRGBA8f(uv); // Retrieve sample at new location.\n\t\t\t\tgodRayLoop(uv, sampleValue, illuminationDecay, accumColor);\n\t\t\t\tuv -= delta_uv; // Step sample location along ray.\n\t\t\t}\n\t\t}\n\t\taccumColor = vec3(0.0f, 0.0f, 0.0f);\n\t}\n\telse\n\t{\n\t\t//Do things normally if sun is in cam Frustum\n\t\tfor (int i = 0; i < numSamples; i++)\n\t\t{\n\t\t\tsampleValue.a = extract32fFromRGBA8f(uv); // Retrieve sample at new location.\n\t\t\tgodRayLoop(uv, sampleValue, illuminationDecay, accumColor);\n\t\t\tuv -= delta_uv; // Step sample location along ray.\n\t\t}\n\t}\n\n\tvec4 god_ray_color =  vec4( accumColor * EXPOSURE, 1.0 ) * blendFactor; //texture(godRayCreationDataSampler, uv);//\n\tvec4 originalpixelColor = imageLoad( currentFrameResultImage, pixelPos );\n\n\t// if(length(god_ray_color) < 0.001) {\n\t// \tgod_ray_color = vec4(1, 0, 0, 1);\n\t// }\n\t// vec4 final_color = vec4(originalpixelColor.aaa, 1);///*originalpixelColor + */god_ray_color;\n\n\tvec4 final_color = originalpixelColor + god_ray_color;\n\n\timageStore( currentFrameResultImage, pixelPos, final_color );\n}"
  },
  {
    "path": "src/CloudScapes/shaders/postProcess_TXAA.frag",
    "content": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n\nlayout(set = 0, binding = 0) uniform sampler2D prevFrameImage;\nlayout (set = 0, binding = 1, rgba8) uniform image2D currentFrameResultImage;\n\nlayout(location = 0) in vec2 in_uv;\nlayout(location = 0) out vec4 outColor;\n\nlayout (set = 1, binding = 0) uniform CameraUBO\n{\n    mat4 view;\n    mat4 proj;\n    vec4 eye;\n    vec2 tanFovBy2;\n} camera;\n\nlayout (set = 2, binding = 0) uniform CameraOldUBO\n{\n    mat4 view;\n    mat4 proj;\n    vec4 eye;\n    vec2 tanFovBy2;\n} cameraOld;\n\nlayout (set = 3, binding = 0) uniform TimeUBO\n{\n    vec4 haltonSeq1;\n    vec4 haltonSeq2;\n    vec4 haltonSeq3;\n    vec4 haltonSeq4;\n    vec2 time; //stores delat time and total time\n    int frameCountMod16;\n};\n\nstruct Ray {\n    vec3 origin;\n    vec3 direction;\n};\n\nstruct Intersection {\n    vec3 normal;\n    vec3 point;\n    bool valid;\n    float t;\n};\n\n//Global Defines for math constants\n#define EPSILON 0.0000000001\n\n#define TEXELSIZE vec2(1.0, 1.0)\n#define FEED_BACK_MIN 0.0\n#define FEED_BACK_MAX 0.5\n\n//Global Defines for Earth and Cloud Layers \n#define EARTH_RADIUS 6371000.0 // earth's actual radius in km = 6371\n#define ATMOSPHERE_RADIUS_INNER (EARTH_RADIUS + 7500.0) //paper suggests values of 15000-35000m above\n\n//--------------------------------------------------------\n//\t\t\t\t\tTOOL BOX FUNCTIONS\n//--------------------------------------------------------\n\nvec2 getJitterOffset (in int index, ivec2 dim) \n{\n    //index is a value from 0-15\n    //Use pre generated halton sequence to jitter point --> halton sequence is a low discrepancy sampling pattern\n    vec2 jitter = vec2(0.0);\n    index = index/2;\n    if(index < 4)\n    {\n        jitter.x = haltonSeq1[index];\n        jitter.y = haltonSeq2[index];\n    }\n    else\n    {\n        index -= 4;\n        jitter.x = haltonSeq3[index];\n        jitter.y = haltonSeq4[index];\n    }\n    return jitter/dim;\n}\n\n// //Compute Ray for ray marching based on NDC point\nRay castRay( in vec2 screenPoint, in vec3 eye, in mat4 view, in vec2 tanFovBy2, int pixelID, ivec2 dim )\n{\n\tRay r;\n\n    // Extract camera information from uniform\n\tvec3 camRight = normalize(vec3( view[0][0], \n\t\t\t\t    \t\t\t\tview[1][0], \n\t\t\t\t    \t\t\t\tview[2][0] ));\n\tvec3 camUp =    normalize(vec3( view[0][1], \n\t\t\t\t    \t\t\t\tview[1][1], \n\t\t\t\t    \t\t\t\tview[2][1] ));\n\tvec3 camLook =  -normalize(vec3(view[0][2], \n\t\t\t\t    \t\t\t\tview[1][2], \n\t\t\t\t    \t\t\t\tview[2][2] ));\n\n\t// Compute ndc space point from screenspace point //[-1,1] to [0,1] range\n    vec2 NDC_Space_Point = screenPoint * 2.0 - 1.0; \n\n    //Jitter point with halton sequence\n    NDC_Space_Point += getJitterOffset(pixelID, dim);\n\n    //convert to camera space\n    vec3 cam_x = NDC_Space_Point.x * tanFovBy2.x * camRight;\n    vec3 cam_y = NDC_Space_Point.y * tanFovBy2.y * camUp;\n    //convert to world space\n    vec3 ref = eye + camLook;\n    vec3 p = ref + cam_x + cam_y; //facing the screen\n\n    r.origin = eye;\n    r.direction = normalize(p - eye);\n\n    return r;\n}\n\n//Sphere Intersection Testing\nIntersection raySphereIntersection(in vec3 rO, in vec3 rD, in vec3 sphereCenter, in float sphereRadius)\n{\n    Intersection isect;\n    isect.valid = false;\n    isect.point = vec3(0.0);\n    isect.normal = vec3(0.0, 1.0, 0.0);\n\n    // Transform Ray such that the spheres move down, such that the camera is close to the sky dome\n    // Only change sphere origin because you can't translate a direction\n    rO -= sphereCenter;\n    rO /= sphereRadius;\n\n    float A = dot(rD, rD);\n    float B = 2.0*dot(rD, rO);\n    float C = dot(rO, rO) - 1.0; //uniform sphere\n    float discriminant = B*B - 4.0*A*C;\n\n    //If the discriminant is negative, then there is no real root\n    if(discriminant < 0.0)\n    {\n        return isect;\n    }\n\n    float t = (-B - sqrt(discriminant))/(2.0*A);\n    \n    if(t < 0.0) \n    {\n        t = (-B + sqrt(discriminant))/(2.0*A);\n    }\n\n    if(t >= 0.0)\n    {\n        vec3 p = vec3(rO + t*rD);\n        isect.valid = true;\n        isect.normal = normalize(p);\n\n        p *= sphereRadius;\n        p += sphereCenter;\n\n        isect.point = p;\n        isect.t = length(p-rO);\n    }\n\n    return isect;\n}\n\nfloat Luminance(vec3 color_rgb)\n{\n    const vec3 weight = vec3(0.2125, 0.7154, 0.0721); //Weighting according to human eye perception\n    return dot(color_rgb, weight);\n}\n\nvec4 clip_aabb(vec3 aabb_min, vec3 aabb_max, vec4 p, vec4 q)\n{\n\t// https://www.gdcvault.com/play/1022970/Temporal-Reprojection-Anti-Aliasing-in\n\t// note: only clips towards aabb center (but fast!) --> prper line box clipping is slow\n\tvec3 p_clip = 0.5 * (aabb_max + aabb_min);\n\tvec3 e_clip = 0.5 * (aabb_max - aabb_min) + EPSILON;\n\n\tvec4 v_clip = q - vec4(p_clip, p.w);\n\tvec3 v_unit = v_clip.xyz / e_clip;\n\tvec3 a_unit = abs(v_unit);\n\tfloat ma_unit = max(a_unit.x, max(a_unit.y, a_unit.z));\n\n\tif (ma_unit > 1.0)\n\t{\n\t\treturn vec4(p_clip, p.w) + v_clip / ma_unit;\n\t}\n\telse\n\t{\n\t\treturn q;// point inside aabb\n\t}\n}\n\nvoid neighbourHoodClamping(vec2 pixelPos, out vec4 cmin, out vec4 cmax, out vec4 cavg)\n{\n\t//https://github.com/playdeadgames/temporal/blob/master/Assets/Shaders/TemporalReprojection.shader\n\t//3x3 minmax rounded neighbourhood sampling\n\n\tvec2 du = vec2(TEXELSIZE.x, 0.0);\n\tvec2 dv = vec2(0.0, TEXELSIZE.y);\n\n\tvec4 ctl = imageLoad( currentFrameResultImage, ivec2(pixelPos - dv - du)); //top left\n\tvec4 ctc = imageLoad( currentFrameResultImage, ivec2(pixelPos - dv));\t\t //top center\n\tvec4 ctr = imageLoad( currentFrameResultImage, ivec2(pixelPos - dv + du)); //top right\n\tvec4 cml = imageLoad( currentFrameResultImage, ivec2(pixelPos - du));\t\t //middle left\n\tvec4 cmc = imageLoad( currentFrameResultImage, ivec2(pixelPos));\t\t\t //middle center\n\tvec4 cmr = imageLoad( currentFrameResultImage, ivec2(pixelPos + du));\t\t //middle right\n\tvec4 cbl = imageLoad( currentFrameResultImage, ivec2(pixelPos + dv - du)); //bottom left\n\tvec4 cbc = imageLoad( currentFrameResultImage, ivec2(pixelPos + dv));\t\t //bottom center\n\tvec4 cbr = imageLoad( currentFrameResultImage, ivec2(pixelPos + dv + du)); //bottom right\n\n\tcmin = min(ctl, min(ctc, min(ctr, min(cml, min(cmc, min(cmr, min(cbl, min(cbc, cbr))))))));\n\tcmax = max(ctl, max(ctc, max(ctr, max(cml, max(cmc, max(cmr, max(cbl, max(cbc, cbr))))))));\n\tcavg = (ctl + ctc + ctr + cml + cmc + cmr + cbl + cbc + cbr) / 9.0;\n\n\tvec4 cmin5 = min(ctc, min(cml, min(cmc, min(cmr, cbc))));\n\tvec4 cmax5 = max(ctc, max(cml, max(cmc, max(cmr, cbc))));\n\tvec4 cavg5 = (ctc + cml + cmc + cmr + cbc) / 5.0;\n\tcmin = 0.5 * (cmin + cmin5);\n\tcmax = 0.5 * (cmax + cmax5);\n\tcavg = 0.5 * (cavg + cavg5);\n}\n\nvoid main()\n{\n\t//A lot of this has simply been ported from the reprojection compute shader\n\tivec2 dim = imageSize(currentFrameResultImage);\n\tivec2 pixelPos = clamp(ivec2(round(float(dim.x) * in_uv.x), round(float(dim.y) * in_uv.y)), ivec2(0.0), ivec2(dim.x - 1, dim.y - 1));\n    int pixelID = frameCountMod16;\n\n\tvec3 eyePos = -camera.eye.xyz;\n\tRay ray = castRay(in_uv, eyePos, camera.view, camera.tanFovBy2, pixelID, dim);\n\n\t// Hit the inner sphere with the ray you just found to get some basis world position along your current ray\n\tvec3 earthCenter = eyePos;\n\tearthCenter.y = -EARTH_RADIUS; //move earth below camera\n\tIntersection atmosphereInnerIsect = raySphereIntersection(ray.origin, ray.direction, earthCenter, ATMOSPHERE_RADIUS_INNER);\n\n    vec3 oldCameraRayDir = normalize((cameraOld.view * vec4(atmosphereInnerIsect.point, 1.0f)).xyz);\n\n    // We have a normalized ray that we need to convert into uv space\n    // We can achieve this by multiplying the xy componentes of the ray by the camera's Right and Up basis vectors  and scaling it down to a 0 to 1 range\n    // In other words the ray goes from camera space <x,y,z> to uv space <u,v,1> using the R U F basis that defines the camera\n    oldCameraRayDir /= -oldCameraRayDir.z; //-z because in camera space we look down negative z and so we don't want \n                                           //to divide by a negative number --> that would make our uv's negative\n    float old_u = (oldCameraRayDir.x / (camera.tanFovBy2.x)) * 0.5 + 0.5;\n    float old_v = (oldCameraRayDir.y / (camera.tanFovBy2.y)) * 0.5 + 0.5;\n    vec2 old_uv = vec2(old_u, old_v); //if old_uv is out of range -> the texture sampler simply returns black --> keep in mind when porting\n\n    //Current Pixel Neighborhood color space bounds\n    vec4 cmin, cmax, cavg;\n    neighbourHoodClamping(pixelPos, cmin, cmax, cavg);\n\n    vec4 currColor = imageLoad( currentFrameResultImage, pixelPos );\n\tvec4 prevColor = texture( prevFrameImage, old_uv );\n\t\n\tprevColor = clip_aabb(cmin.xyz, cmax.xyz, clamp(cavg, cmin, cmax), prevColor);\n\n\tfloat lum0 = Luminance(currColor.xyz);\n\tfloat lum1 = Luminance(prevColor.xyz);\n\n\tfloat unbiased_diff = abs(lum0 - lum1) / max(lum0, max(lum1, 0.2));\n\tfloat unbiased_weight = 1.0 - unbiased_diff;\n\tfloat unbiased_weight_sqr = unbiased_weight * unbiased_weight;\n\tfloat k_feedback = mix(FEED_BACK_MIN, FEED_BACK_MAX, unbiased_weight_sqr);\n\n\tvec4 color_TXAA = mix(prevColor, currColor, k_feedback);\n\n\timageStore( currentFrameResultImage, pixelPos, color_TXAA );\n\toutColor = color_TXAA;\n}"
  },
  {
    "path": "src/CloudScapes/shaders/postProcess_ToneMap.frag",
    "content": "#version 450\n#extension GL_ARB_separate_shader_objects : enable\n\nlayout(set = 0, binding = 0) uniform sampler2D inputImageSampler;\nlayout (set = 0, binding = 1, rgba8) uniform writeonly image2D currentFrameResultImage;\n\nlayout (set = 1, binding = 0) uniform TimeUBO\n{\n    vec4 haltonSeq1;\n    vec4 haltonSeq2;\n    vec4 haltonSeq3;\n    vec4 haltonSeq4;\n    vec2 time; //stores delta time and total time\n    int frameCountMod16;\n};\n\nlayout(location = 0) in vec2 in_uv;\nlayout(location = 0) out vec4 outColor;\n\n//Reference: http://filmicworlds.com/blog/filmic-tonemapping-operators/\n//Also https://www.shadertoy.com/view/lslGzl\n//Originally from the game Uncharted 2 by Naughty Dog\n#define A 0.15\n#define B 0.50\n#define C 0.10\n#define D 0.20\n#define E 0.02\n#define F 0.30\n#define INVGAMMA (1.0 / 2.2)\n#define EXPOSURE 2.5\n\nvec3 Uncharted2Tonemap(vec3 x)\n{\n   return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;\n}\n\nvec3 tonemap(vec3 x, float whiteBalance) \n{\n   vec3 color = Uncharted2Tonemap(EXPOSURE * x);\n\n   vec3 white = vec3(whiteBalance);\n   vec3 whitemap = 1.0 / Uncharted2Tonemap(white);\n\n   color *= whitemap;\n   return pow(color, vec3(INVGAMMA));\n}\n\n//Replacement for dithering noise function\n//Reference: https://youtu.be/4D5uX8wL1V8?t=11m22s\n//Super fast because of all the binary operations\n//Quality noise without repeating patterns\nfloat WangHashNoise(uint u, uint v, uint s)\n{\n\t//u after a number ensures it is an unsigned int\n\tuint seed = (u * 1664525u + v) + s;\n\n\tseed = (seed ^ 61u) ^ (seed >> 16u);\n\tseed *= 9u;\n\tseed = seed ^ (seed >> 4u);\n\tseed *= 0x27d4eb2d;\n\tseed = seed ^ (seed >> 15u);\n\n\tfloat value = float(seed);\n\tvalue *= (1.0 / 4294967296.0);\n\treturn value;\n}\n\nvoid main() \n{\n\tivec2 dim = imageSize(currentFrameResultImage);\n\tivec2 pixelPos = clamp(ivec2(round(float(dim.x) * in_uv.x), round(float(dim.y) * in_uv.y)), ivec2(0.0), ivec2(dim.x - 1, dim.y - 1));\n\n\tvec3 in_color = texture(inputImageSampler, in_uv).rgb;\n\n\tfloat whitepoint = 100.0f; //changes the point at which something becomes pure white\n\t//The white point is the value that is mapped to 1.0 in the regular RGB space.\n\tvec3 toneMapped_color = tonemap(in_color, whitepoint);\n\n\t//Dithering to prevent banding\n\tfloat noise = WangHashNoise(pixelPos.x, pixelPos.y, uint(time.y))*0.01;\n\ttoneMapped_color += vec3(noise);\n\n\timageStore( currentFrameResultImage, pixelPos, vec4(toneMapped_color, 1.0) );\n}"
  },
  {
    "path": "src/CloudScapes/shaders/reprojection.comp",
    "content": "// Motion Blur Reference: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch27.html\n\n#version 450\n#extension GL_ARB_separate_shader_objects : enable\n\n#define WORKGROUP_SIZE 32\nlayout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE) in;\n\n// Ping pong storage images\nlayout (set = 0, binding = 0, rgba32f) uniform writeonly image2D currentFrameResultImage;\nlayout (set = 0, binding = 1, rgba32f) uniform readonly image2D previousFrameResultImage;\n\nlayout (set = 1, binding = 0) uniform CameraUBO\n{\n    mat4 view;\n    mat4 proj;\n    vec4 eye;\n    vec2 tanFovBy2;\n} camera;\n\nlayout (set = 2, binding = 0) uniform CameraOldUBO\n{\n    mat4 view;\n    mat4 proj;\n    vec4 eye;\n    vec2 tanFovBy2;\n} cameraOld;\n\nlayout (set = 3, binding = 0) uniform TimeUBO\n{\n    vec4 haltonSeq1;\n    vec4 haltonSeq2;\n    vec4 haltonSeq3;\n    vec4 haltonSeq4;\n    vec2 time; //stores delat time and total time\n    int frameCountMod16;\n};\n\nstruct Ray {\n    vec3 origin;\n    vec3 direction;\n};\n\nstruct Intersection {\n    vec3 normal;\n    vec3 point;\n    bool valid;\n    float t;\n};\n\n//Global Defines for math constants\n#define PI 3.14159265\n#define THREE_OVER_SIXTEEN_PI 0.05968310365946075\n#define ONE_OVER_FOUR_PI 0.07957747154594767\n#define E 2.718281828459\n\n//Global Defines for Colors\n#define BLACK vec3(0,0,0)\n#define WHITE vec3(1,1,1)\n#define RED vec3(1,0,0)\n\n//Global Defines for Earth and Cloud Layers \n#define EARTH_RADIUS 6371000.0 // earth's actual radius in km = 6371\n#define ATMOSPHERE_RADIUS_INNER (EARTH_RADIUS + 7500.0) //paper suggests values of 15000-35000m above\n\n#define NUM_MOTION_BLUR_SAMPLES 10\n\n//--------------------------------------------------------\n//\t\t\t\t\tTOOL BOX FUNCTIONS\n//--------------------------------------------------------\n\nvec2 getJitterOffset (in int index, ivec2 dim) \n{\n    //index is a value from 0-15\n    //Use pre generated halton sequence to jitter point --> halton sequence is a low discrepancy sampling pattern\n    vec2 jitter = vec2(0.0);\n    index = index/2;\n    if(index < 4)\n    {\n        jitter.x = haltonSeq1[index];\n        jitter.y = haltonSeq2[index];\n    }\n    else\n    {\n        index -= 4;\n        jitter.x = haltonSeq1[index];\n        jitter.y = haltonSeq2[index];\n    }\n    return jitter/dim;\n}\n\nfloat getJitterOffset (in int index, float maxOffset) \n{\n    //index is a value from 0-15\n    //Use pre generated halton sequence to jitter point --> halton sequence is a low discrepancy sampling pattern\n    float jitter = 0.0;\n    index = index/2;\n    if(index < 4)\n    {\n        jitter = haltonSeq1[index];\n    }\n    else\n    {\n        index -= 4;\n        jitter = haltonSeq2[index];\n    }\n    return jitter*maxOffset;\n}\n\n// //Compute Ray for ray marching based on NDC point\nRay castRay( in vec2 screenPoint, in vec3 eye, in mat4 view, in vec2 tanFovBy2, int pixelID, ivec2 dim )\n{\n\tRay r;\n\n    // Extract camera information from uniform\n\tvec3 camRight = normalize(vec3( view[0][0], \n\t\t\t\t    \t\t\t\tview[1][0], \n\t\t\t\t    \t\t\t\tview[2][0] ));\n\tvec3 camUp =    normalize(vec3( view[0][1], \n\t\t\t\t    \t\t\t\tview[1][1], \n\t\t\t\t    \t\t\t\tview[2][1] ));\n\tvec3 camLook =  -normalize(vec3(view[0][2], \n\t\t\t\t    \t\t\t\tview[1][2], \n\t\t\t\t    \t\t\t\tview[2][2] ));\n\n\t// Compute ndc space point from screenspace point //[-1,1] to [0,1] range\n    vec2 NDC_Space_Point = screenPoint * 2.0 - 1.0; \n\n    //Jitter point with halton sequence\n\n    NDC_Space_Point += getJitterOffset(pixelID, dim);\n\n    //convert to camera space\n    vec3 cam_x = NDC_Space_Point.x * tanFovBy2.x * camRight;\n    vec3 cam_y = NDC_Space_Point.y * tanFovBy2.y * camUp;\n    //convert to world space\n    vec3 ref = eye + camLook;\n    vec3 p = ref + cam_x + cam_y; //facing the screen\n\n    r.origin = eye;\n    r.direction = normalize(p - eye);\n\n    return r;\n}\n\n//Sphere Intersection Testing\nIntersection raySphereIntersection(in vec3 rO, in vec3 rD, in vec3 sphereCenter, in float sphereRadius)\n{\n    Intersection isect;\n    isect.valid = false;\n    isect.point = vec3(0.0);\n    isect.normal = vec3(0.0, 1.0, 0.0);\n\n    // Transform Ray such that the spheres move down, such that the camera is close to the sky dome\n    // Only change sphere origin because you can't translate a direction\n    rO -= sphereCenter;\n    rO /= sphereRadius;\n\n    float A = dot(rD, rD);\n    float B = 2.0*dot(rD, rO);\n    float C = dot(rO, rO) - 1.0; //uniform sphere\n    float discriminant = B*B - 4.0*A*C;\n\n    //If the discriminant is negative, then there is no real root\n    if(discriminant < 0.0)\n    {\n        return isect;\n    }\n\n    float t = (-B - sqrt(discriminant))/(2.0*A);\n    \n    if(t < 0.0) \n    {\n        t = (-B + sqrt(discriminant))/(2.0*A);\n    }\n\n    if(t >= 0.0)\n    {\n        vec3 p = vec3(rO + t*rD);\n        isect.valid = true;\n        isect.normal = normalize(p);\n\n        p *= sphereRadius;\n        p += sphereCenter;\n\n        isect.point = p;\n        isect.t = length(p-rO);\n    }\n\n    return isect;\n}\n\nvoid main() \n{\n    //3 options: - do a full resolution launch and calculate for every pixel and overwrite the value of one pixel with an actual raymarch\n    //           - do all the work for 15 reprojection pixel fills on one thread\n    //           - do full resolution but only work for 15 pixels and terminate early for the one that will be filled by raymarching\n    //The last one is the best but it is hard to determine which pixel to skip --> equate the pixel selected with the regular invocation ID --> to determine which to skip\n    ivec2 dim = imageSize(currentFrameResultImage);\n    vec2 uv = vec2(gl_GlobalInvocationID.xy) / dim;\n    //Do not invert uv's because we already do this in the cloudCompute shader and so things are stored in accordance to openGL convention of uv's\n\n    int pixelID = frameCountMod16;\n\n\tvec3 eyePos = -camera.eye.xyz;\n\tRay ray = castRay(uv, eyePos, camera.view, camera.tanFovBy2, pixelID, dim);\n\n\t// Hit the inner sphere with the ray you just found to get some basis world position along your current ray\n\tvec3 earthCenter = eyePos;\n\tearthCenter.y = -EARTH_RADIUS; //move earth below camera\n\tIntersection atmosphereInnerIsect = raySphereIntersection(ray.origin, ray.direction, earthCenter, ATMOSPHERE_RADIUS_INNER);\n\n    vec3 oldCameraRayDir = normalize((cameraOld.view * vec4(atmosphereInnerIsect.point, 1.0f)).xyz);\n\n    // We have a normalized ray that we need to convert into uv space\n    // We can achieve this by multiplying the xy componentes of the ray by the camera's Right and Up basis vectors  and scaling it down to a 0 to 1 range\n    // In other words the ray goes from camera space <x,y,z> to uv space <u,v,1> using the R U F basis that defines the camera\n    oldCameraRayDir /= -oldCameraRayDir.z; //-z because in camera space we look down negative z and so we don't want \n                                           //to divide by a negative number --> that would make our uv's negative\n    float old_u = (oldCameraRayDir.x / (camera.tanFovBy2.x)) * 0.5 + 0.5;\n    float old_v = (oldCameraRayDir.y / (camera.tanFovBy2.y)) * 0.5 + 0.5;\n    vec2 old_uv = vec2(old_u, old_v); //if old_uv is out of range -> the texture sampler simply returns black --> keep in mind when porting\n\n    // if(old_u > 1.0f || old_u < 0.0f || old_v > 1.0f || old_v < 0.0f)\n    // {\n    //     imageStore( currentFrameResultImage, ivec2(gl_GlobalInvocationID.xy), vec4(0,0,1,0) );\n    //     return;\n    // }\n\n    vec2 motionVec = old_uv - uv;\n    vec4 blurColor = vec4(0.0);\n    vec2 blurOffset = vec2(0.0);\n    vec2 imageUV = round(old_uv * dim);\n\n    for(int i=0; i<NUM_MOTION_BLUR_SAMPLES; i++)\n    {\n        blurOffset = motionVec * (float(i)/float(NUM_MOTION_BLUR_SAMPLES));\n        imageUV = round( (old_uv - blurOffset) * dim);\n        blurColor += imageLoad(previousFrameResultImage, clamp(ivec2(imageUV), ivec2(0, 0), ivec2(dim.x - 1,  dim.y - 1)));\n    }\n    blurColor /= NUM_MOTION_BLUR_SAMPLES;\n\n    imageStore( currentFrameResultImage, ivec2(gl_GlobalInvocationID.xy), blurColor );\n}"
  },
  {
    "path": "src/CloudScapes/window.cpp",
    "content": "#include \"window.h\"\n\nnamespace \n{\n    GLFWwindow* window = nullptr;\n}\n\nGLFWwindow* GetGLFWWindow() \n{\n    return window;\n}\n\nvoid InitializeWindow(int width, int height, const char* name) \n{\n    if (!glfwInit()) {\n        fprintf(stderr, \"Failed to initialize GLFW\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    if (!glfwVulkanSupported()){\n        fprintf(stderr, \"Vulkan not supported\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);\n    glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);\n\twindow = glfwCreateWindow(width, height, name, nullptr, nullptr);\n    //window = glfwCreateWindow(width, height, name, glfwGetPrimaryMonitor(), nullptr);\n\n    if (!window) {\n        fprintf(stderr, \"Failed to initialize GLFW window\\n\");\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n}\n\nbool ShouldQuit() \n{\n    return glfwWindowShouldClose(window);\n}\n\nvoid DestroyWindow() \n{\n    glfwDestroyWindow(window);\n    glfwTerminate();\n}"
  },
  {
    "path": "src/CloudScapes/window.h",
    "content": "#pragma once\n#include <stdio.h>\n\n#ifdef _WIN32\n#pragma comment(linker, \"/subsystem:console\")\n#include <windows.h>\n#include <fcntl.h>\n#include <io.h>\n#elif defined(__linux__)\n#include <xcb/xcb.h>\n#endif\n\n#define GLFW_INCLUDE_VULKAN\n#include <GLFW/glfw3.h>\n\nstruct GLFWwindow;\nstruct GLFWwindow* GetGLFWWindow();\n\nvoid InitializeWindow(int width, int height, const char* name);\nbool ShouldQuit();\nvoid DestroyWindow();"
  }
]